[
  {
    "path": "CNAME",
    "content": "awesome-harmonyos.com"
  },
  {
    "path": "Huawei_LiteOS/.github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\n\n---\n\n* **Describe the bug**\n*A clear and concise description of what the bug is.*\n\n* **To Reproduce**\n*Steps to reproduce the behavior*:\n  - step 1\n  - step 2\n  - step 3\n  - step 4\n\n* **Expected behavior**\n*A clear and concise description of what you expected to happen.*\n\n* **Current behavior**\n*A clear and concise description of what happens currently.*\n\n* **Please tell us about your environment:**\n  - LiteOS Version: \n  - Chip Architecture:\n  - Board: \n\n* **Other information** (*e.g. detailed explanation, stacktraces, related issues, suggestions how to fix, links for us to have context, eg. stackoverflow, gitter, etc*)\n"
  },
  {
    "path": "Huawei_LiteOS/.github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\n\n---\n\n* **Is your feature request related to a problem? Please describe.**\n*A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]*\n\n* **Describe the solution you'd like**\n*A clear and concise description of what you want to happen.*\n\n* **Describe alternatives you've considered**\n*A clear and concise description of any alternative solutions or features you've considered.*\n\n* **Other information**\n*Add any other context or screenshots about the feature request here.*\n"
  },
  {
    "path": "Huawei_LiteOS/.travis.yml",
    "content": "language: c\n\nos: linux\ndist: trusty\n\n\ncompiler: arm-none-eabi-gcc\n\n\nbefore_install:\n  -  sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa -y\n  -  sudo apt-get update -q\n  -  sudo apt-get install gcc-arm-embedded -y\n\n\nscript:\n  -  cd targets/Cloud_STM32F429IGTx_FIRE/GCC\n  -  make\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/LICENSE",
    "content": " * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "Huawei_LiteOS/README.md",
    "content": "[![Build Status](https://travis-ci.org/LiteOS/LiteOS.svg?branch=develop)](https://travis-ci.org/LiteOS/LiteOS)\n\n## Huawei LiteOS简介\n\nHuawei LiteOS是华为面向物联网领域开发的一个基于实时内核的轻量级操作系统。本项目属于华为物联网操作系统[Huawei LiteOS](http://developer.huawei.com/ict/cn/site-iot/product/liteos)源码，现有基础内核支持任务管理、内存管理、时间管理、通信机制、中断管理、队列管理、事件管理、定时器等操作系统基础组件，更好地支持低功耗场景，支持tickless机制，支持定时器对齐。\n\n同时提供端云协同能力，集成了LwM2M、CoAP、mbedtls、LwIP全套IoT互联协议栈，且在LwM2M的基础上，提供了AgentTiny模块，用户只需关注自身的应用，而不必关注LwM2M实现细节，直接使用AgentTiny封装的接口即可简单快速实现与云平台安全可靠的连接。\n\nHuawei LiteOS自开源社区发布以来，围绕NB-IoT物联网市场从技术、生态、解决方案、商用支持等多维度使能合作伙伴，构建开源的物联网生态,目前已经聚合了30+ MCU和解决方案合作伙伴，共同推出一批开源开发套件和行业解决方案，帮助众多行业客户快速的推出物联网终端和服务，客户涵盖抄表、停车、路灯、环保、共享单车、物流等众多行业，为开发者提供 “一站式” 完整软件平台，有效降低开发门槛、缩短开发周期。\n\n## LiteOS 代码导读\n\n- [LiteOS内核源代码目录说明](./doc/LiteOS_Code_Info.md)\n\n该文档描述的是LiteOS内核源代码的详细信息。通过此文档读者可以了解LiteOS的源代码结构，以及LiteOS的main()函数的功能。\n\n\n## LiteOS 开发指南\n\n[LiteOS开发指南](./doc/Huawei_LiteOS_Developer_Guide_zh.md)  \n\n[LiteOS移植指南](https://liteos.github.io/porting/)  \n\n该文档详细讲解了LiteOS各模块开发及其实现原理。用户可以根据该文档学习各模块的使用。\n\n\n## LiteOS 接入云平台开发指南\n\n* [LiteOS接入华为云平台](https://github.com/SuYai/OceanConnectHelp)\n  * [LiteOS SDK端云互通组件开发指南](./doc/Huawei_LiteOS_SDK_Developer_Guide.md)\n\nLiteOS SDK是Huawei LiteOS软件开发工具包（Software Development Kit），通过LiteOS SDK端云互通组件，简单快速地实现与华为 OceanConnect IoT平台安全可靠连接，可以大大减少开发周期，快速构建IoT产品。\n\nLiteOS SDK是Huawei LiteOS软件开发工具包（Software Development Kit），通过LiteOS SDK端云互通组件，简单快速地实现与华为 OceanConnect IoT平台安全可靠连接，可以大大减少开发周期，快速构建IoT产品。\n* [LiteOS SDK端云互通组件Coap开发指南](./doc/Huawei_LiteOS_SDK_Coap_LwM2M_Developer_Guide_zh.md)\n* [LiteOS SDK端云互通组件MQTT开发指南](./doc/Huawei_LiteOS_SDK_MQTT_Developer_Guide.md)\n  \n\n* [LiteOS接入3rd云平台](https://github.com/LiteOS/LiteOS_Connect_to_3rd_Cloud)\n\n\n## LiteOS 支持的硬件\n\n* LiteOS开源项目目前支持ARM Cortex-M0，Cortex-M3，Cortex-M4，Cortex-M7等芯片架构\n\n* [LiteOS支持的开发板列表](./doc/LiteOS_Supported_board_list.md)\nHuawei LiteOS 联合业界主流MCU厂家，通过开发者活动，目前已经适配了30+ 通用 MCU开发套件，5套NB-IoT集成开发套件\n\n\n## 开源协议\n\n* 遵循BSD-3开源许可协议\n* [Huawei LiteOS 知识产权政策](https://support.huaweicloud.com/productdesc-LiteOS/zh-cn_topic_0145347224.html)\n\n## LiteOS Git入门必读\n\n- [LiteOS Commit Message规则](./doc/LiteOS_Commit_Message.md)\n\n该文档描述如何提交commit到LiteOS仓库，这是LiteOS开发必须遵守的commit规则，否则提交的commit会被驳回。请点链接了解详细信息。\n\n- [Huawei LiteOS代码贡献流程](./doc/LiteOS_Contribute_Guide_GitGUI.md)\n\n该文档描述开发者如何创建自己的仓库，开发然后贡献代码到LiteOS仓库。请点链接了解详细信息。\n\n\n## 加入我们\n* 欢迎提交issue对关心的问题发起讨论，欢迎提交PR参与特性建设\n* 如您有合作意向，希望加入Huawei LiteOS生态合作伙伴，请发邮件至liteos@huawei.com，或访问[LiteOS官网](http://www.huawei.com/liteos)，进一步了解详细信息\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m0/gcc/los_dispatch_gcc.S",
    "content": "/** ----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/** ----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/****************************************************************************************\n*                                  EXPORT FUNCTIONS\n****************************************************************************************/\n\n    .global  LOS_IntLock\n    .global  LOS_IntUnLock\n    .global  LOS_IntRestore\n    .global  LOS_StartToRun\n    .global  osTaskSchedule\n    .global  PendSV_Handler\n\n/****************************************************************************************\n*                                  EXTERN PARAMETERS\n****************************************************************************************/\n\n    .extern  g_stLosTask\n    .extern  g_pfnTskSwitchHook\n    .extern  g_bTaskScheduled\n\n/****************************************************************************************\n*                                  EQU\n****************************************************************************************/\n\n.equ    OS_NVIC_INT_CTRL,              0xE000ED04  /* Interrupt Control and State Register. */\n.equ    OS_NVIC_PENDSVSET,             0x10000000  /* Value to trigger PendSV exception. */\n\n.equ    OS_NVIC_SYSPRI2,               0xE000ED20  /* System Handler Priority Register 2. */\n.equ    OS_NVIC_PENDSV_SYSTICK_PRI,    0xC0C00000  /* SysTick + PendSV priority level (lowest). */\n\n.equ    OS_TASK_STATUS_RUNNING,        0x0010      /* Task Status Flag (RUNNING). */\n\n/****************************************************************************************\n*                                  CODE GENERATION DIRECTIVES\n****************************************************************************************/\n\n    .section .text\n    .thumb\n    .syntax unified\n    .arch armv6-m\n\n/****************************************************************************************\n* Function:\n*        VOID LOS_StartToRun(VOID);\n* Description:\n*        Start the first task, which is the highest priority task in the priority queue.\n*        Other tasks are started by task scheduling.\n****************************************************************************************/\n    .type LOS_StartToRun, %function\nLOS_StartToRun:\n    CPSID   I\n\n    /**\n     * Set PendSV and SysTick prority to the lowest.\n     * read ---> modify ---> write-back.\n     */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORRS    R1, R1, R2\n    STR     R1, [R0]\n\n    /**\n     * Set g_bTaskScheduled = 1.\n     */\n    LDR     R0, =g_bTaskScheduled\n    MOVS    R1, #1\n    STR     R1, [R0]\n\n    /**\n     * Now PSP is an invalid value, R13 uses MSP as the stack pointer.\n     * After setting the control register, R13 will switch to PSP.\n     * To ensure that R13 is valid, set PSP = MSP.\n     */\n    MRS     R0, MSP\n    MSR     PSP, R0\n\n    /**\n     * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n     */\n    MOVS    R0, #2\n    MSR     CONTROL, R0\n\n    /**\n     * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n     */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    /**\n     * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n     */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOVS    R3, #OS_TASK_STATUS_RUNNING\n    ORRS    R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    /**\n     * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n     * Return by setting the CONTROL register.\n     *\n     * The initial stack of the current running task is as follows:\n     *\n     *                 POP: Restore the context of the current running task ===>|\n     *                                                             High addr--->|\n     *                                                   Bottom of the stack--->|\n     * ----------+-----------------------+--------------------------------------+\n     *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n     * ----------+-----------------------+--------------------------------------+\n     *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n     *           |<---      skip     --->|<---        copy to R0-R7         --->|\n     *                                                             R3 to PSP--->|\n     *                                    Stack pointer after LOS_StartToRun--->|\n     */\n    LDR     R3, [R1]\n    ADDS    R3, R3, #36            /* skip R4-R11, PRIMASK. */\n\n    LDMFD   R3!, {R0-R2}           /* restore R0-R2. */\n    ADDS    R3, R3, #4             /* skip R3. */\n    LDMFD   R3!, {R4-R7}           /* restore R12,LR,PC,xPSR. */\n\n    /**\n     * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n     */\n    MSR     PSP, R3\n\n    SUBS    R3, R3, #20\n    LDR     R3, [R3]               /* restore R3. */\n\n    /**\n     * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n     */\n    MOV     LR, R5\n    CPSIE   I\n\n    /**\n     * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n     * of the main function will be destroyed and will never be returned.\n     */\n    BX      R6\n\n/****************************************************************************************\n* Function:\n*        UINTPTR LOS_IntLock(VOID);\n* Description:\n*        Disable all interrupts except Reset,NMI and HardFault.\n*        The value of currnet interruption state will be returned to the caller to save.\n*\n* Function:\n*        VOID LOS_IntRestore(UINTPTR uvIntSave);\n* Description:\n*        Restore the locked interruption of LOS_IntLock.\n*        The caller must pass in the value of interruption state previously saved.\n****************************************************************************************/\n    .type LOS_IntLock, %function\nLOS_IntLock:\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\n    .type LOS_IntUnLock, %function\nLOS_IntUnLock:\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\n    .type LOS_IntRestore, %function\nLOS_IntRestore:\n    MSR     PRIMASK, R0\n    BX      LR\n\n/****************************************************************************************\n* Function:\n*        VOID osTaskSchedule(VOID);\n* Description:\n*        Start the task swtich process by software trigger PendSV interrupt.\n****************************************************************************************/\n    .type osTaskSchedule, %function\nosTaskSchedule:\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n/****************************************************************************************\n* Function:\n*        VOID PendSV_Handler(VOID);\n* Description:\n*        PendSV interrupt handler, switch the context of the task.\n*        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n*               to its own stack.\n*        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n*                from its own stack.\n****************************************************************************************/\n    .type PendSV_Handler, %function\nPendSV_Handler:\n    /**\n     * R12: Save the interruption state of the current running task.\n     * Disable all interrupts except Reset,NMI and HardFault\n     */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    /**\n     * Call task switch hook.\n     */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CMP     R2, #0\n    BEQ     TaskSwitch\n    MOV     R1, LR\n    PUSH    {R0, R1}\n    BLX     R2\n    POP     {R0, R1}\n    MOV     LR, R1\n\nTaskSwitch:\n    /**\n     * R0 = now stack pointer of the current running task.\n     */\n    MRS     R0, PSP\n\n    /**\n     * Save the stack frame(R4-R11) of the current running task.\n     * R12 save the PRIMASK value of the current running task.\n     * NOTE: Before entering the exception handler function, these registers\n     *       (xPSR,PC,LR,R12,R3-R0) have been automatically\n     *       saved by the CPU in the stack of the current running task.\n     *\n     * The stack of the current running task is as follows:\n     *\n     *           |<=== PUSH: Save the context of the current running task\n     *           |                                                      High addr--->|\n     * ----------+-----------------------+--------------------------------------+-----\n     *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n     * ----------+-----------------------+--------------------------------------+-----\n     *                               Stack pointer before entering exception--->|\n     *                                   |<---        cpu auto saved        --->|\n     *                                   |<---PSP to R0\n     *           |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n     */\n    SUBS    R0, #36\n    STMIA   R0!, {R4-R7}           /* save R4-R7. */\n    MOV     R3, R8                 /* copy R8-r12 to R3-r7. */\n    MOV     R4, R9\n    MOV     R5, R10\n    MOV     R6, R11\n    MOV     R7, R12\n    STMIA   R0!, {R3-R7}           /* save R8-R12. */\n    SUBS    R0, #36\n\n    /**\n     * R5,R3.\n     */\n    LDR     R5, =g_stLosTask\n    MOVS    R3, #OS_TASK_STATUS_RUNNING\n\n    /**\n     * Save the stack pointer of the current running task to TCB.\n     * (g_stLosTask.pstRunTask->pStackPointer = R0)\n     */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    /**\n     * Clear the RUNNING state of the current running task.\n     * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n     */\n    LDRH    R7, [R6, #4]\n    BICS    R7, R7, R3\n    STRH    R7, [R6, #4]\n\n    /**\n     * Switch the current running task to the next running task.\n     * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n     */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    /**\n     * Set the RUNNING state of the next running task.\n     * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n     */\n    LDRH    R7, [R0, #4]\n    ORRS    R7, R7, R3\n    STRH    R7, [R0, #4]\n\n    /**\n     * Restore the stack pointer of the next running task from TCB.\n     * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n     */\n    LDR     R1, [R0]\n\n    /**\n     * Restore the stack frame(R4-R11) of the next running task.\n     * R12 restore the PRIMASK value of the next running task.\n     * NOTE: After exiting the exception handler function, these registers\n     *       (xPSR,R0-R3,R12,LR,PC) will be automatically\n     *       restored by the CPU from the stack of the next running task.\n     *\n     * 1. The stack of the next running task is as follows:\n     *\n     *                    POP: Restore the context of the next running task ===>|\n     *                                                                  High addr--->|\n     * ----------+-----------------------+--------------------------------------+-----\n     *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n     * ----------+-----------------------+--------------------------------------+-----\n     *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n     *                      R1 to PSP--->|\n     *                                   |<---      cpu auto restoring      --->|\n     *                                 Stack pointer after exiting exception--->|\n     *\n     * 2. If the next running task is run for the first time, the stack is as follows:\n     *\n     *                    POP: Restore the context of the next running task ===>|\n     *                                                             High addr--->|\n     *                                                   Bottom of the stack--->|\n     * ----------+-----------------------+--------------------------------------+\n     *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n     * ----------+-----------------------+--------------------------------------+\n     *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n     *                      R1 to PSP--->|\n     *                                   |<---      cpu auto restoring      --->|\n     *                                 Stack pointer after exiting exception--->|\n     */\n    ADDS    R1, #16\n    LDMFD   R1!, {R3-R7}           /* restore R8-R12 to R3-R7. */\n    MOV     R8, R3                 /* copy R3-R7 to R8-R12. */\n    MOV     R9, R4\n    MOV     R10, R5\n    MOV     R11, R6\n    MOV     R12, R7\n    /**\n     * Set the stack pointer of the next running task to PSP.\n     */\n    MSR     PSP, R1\n    SUBS    R1, #36\n    LDMFD   R1!, {R4-R7}           /* restore R4-R7. */\n\n    /**\n     * Restore the interruption state of the next running task.\n     */\n    MSR     PRIMASK, R12\n    BX      LR\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m0/gcc/los_hw_exc_gcc.S",
    "content": "/*----------------------------------------------------------------------------\n  Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n  All rights reserved.\n  Redistribution and use in source and binary forms, with or without modification,\n  are permitted provided that the following conditions are met:\n  1. Redistributions of source code must retain the above copyright notice, this list of\n  conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice, this list\n  of conditions and the following disclaimer in the documentation and/or other materials\n  provided with the distribution.\n  3. Neither the name of the copyright holder nor the names of its contributors may be used\n  to endorse or promote products derived from this software without specific prior written\n  permission.\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS\n  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n----------------------------------------------------------------------------\n  Notice of Export Control Law\n  ===============================================\n  Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n  include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n  Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n  applicable export control laws and regulations.\n ---------------------------------------------------------------------------*/\n\n/****************************************************************************************\n                                  CODE GENERATION DIRECTIVES\n****************************************************************************************/\n\n    .section .text\n    .thumb\n    .syntax unified\n    .arch armv6-m\n\n/****************************************************************************************\n                                  EXPORT FUNCTIONS\n****************************************************************************************/\n\n    .global NMI_Handler\n    .global HardFault_Handler\n    .global MemManage_Handler\n    .global BusFault_Handler\n    .global UsageFault_Handler\n\n\n\n/****************************************************************************************\n                                  EXTERN PARAMETERS\n****************************************************************************************/\n\n    .extern osExcHandleEntry\n    .extern g_uwExcTbl\n    .extern g_bTaskScheduled\n    .extern it_is_memManangeFault\n    .extern it_is_busFault\n    .extern it_is_usageFault\n\n/****************************************************************************************\n                                  EQU\n****************************************************************************************/\n\n.equ OS_EXC_CAUSE_NMI,               18\n.equ OS_EXC_CAUSE_HARDFAULT,         19\n.equ OS_EXC_CAUSE_MEMFAULT,          20\n.equ OS_EXC_CAUSE_BUSFAULT,          21\n.equ OS_EXC_CAUSE_USAGEFAULT,        22\n.equ OS_EXC_CAUSE_SVC,               23\n\n.equ HF_DEBUGEVT,                    24\n.equ HF_VECTBL,                      25\n\n.equ FLAG_ADDR_VALID,                0x10000        /*bit 16*/\n.equ FLAG_HWI_ACTIVE,                0x20000        /*bit 17*/\n.equ FLAG_NO_FLOAT,                  0x10000000     /*bit 28*/\n\n.equ OS_NVIC_CFSR,                   0xE000ED28     /*include BusFault/MemFault/UsageFault State Regeister*/\n.equ OS_NVIC_HFSR,                   0xE000ED2C     /*HardFault State Regeister*/\n.equ OS_NVIC_BFAR,                   0xE000ED38\n.equ OS_NVIC_MMFAR,                  0xE000ED34\n.equ OS_NVIC_ACT_BASE,               0xE000E300\n.equ OS_NVIC_SHCSRS,                 0xE000ED24\n.equ OS_NVIC_SHCSR_MASK,             0xC00          /*SYSTICKACT and PENDSVACT*/\n\n.equ ADDR_SETPEND,                    0XE000E200        /*the addr of setpend register*/\n.equ ADDR_CLRPEND,                    0XE000E280        /*the addr of clrpend register*/\n.equ ADDR_SETENA,                   0XE000E100\n.equ EXC_RETURN_NEST,                0XFFFFFFF1      /*return to some irq_handler*/\n/****************************************************************************************\n Function:\n        VOID NMI_Handler(VOID)\n Description:\n        NMI Handler.\n****************************************************************************************/\n    .type NMI_Handler, %function\nNMI_Handler:\n    /**\n     * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +------------------------------------------------------+------------------------+\n     * |                          31-8                        |          7-0           |\n     * +------------------------------------------------------+------------------------+\n     * |                          ---                         |    OS_EXC_CAUSE_NMI    |\n     * +------------------------------------------------------+------------------------+\n     * < R1 >: invalid\n     */\n    MOVS  R0, #OS_EXC_CAUSE_NMI\n    MOVS  R1, #0\n    B  osExcDispatch\n\n/****************************************************************************************\n Function:\n        VOID HardFault_Handler(VOID)\n Description:\n        HardFault Handler.\n****************************************************************************************/\n    .type HardFault_Handler, %function\nHardFault_Handler:\n    /**\n     * save fault type to R0\n     */\n    MOVS  R0, #OS_EXC_CAUSE_HARDFAULT\n    B  osExcDispatch\n\n\n    /**\n     * When executing osExcDispatch,  R2 will be used.\n     */\nosExcDispatch:\n\n    LDR  R2, =ADDR_SETPEND\n    LDR  R2, [R2]\n    LDR  R3,=0X40\n    LSLS R3,R3,#0X18\n    SUBS R3,R3,#1  /*R3 =0011 1111 1111 1111 1111 1111 1111 1111 filter the highest active 2 bits error*/\n    ANDS  R2,R2,R3\n    LDR  R3,=ADDR_SETENA\n    LDR  R3,[R3]\n    ANDS R2,R2,R3  /*if an interrupt is enabled and active ,it is a nomal exception ,otherwise,it should be ignored*/\n\n    MOV  R1,LR\n    LDR  R3, =EXC_RETURN_NEST\n    CMP  R1,R3\n    BEQ  __in_interrupt  /*jump when they are equal,if LR equals it,they are in some interrupt*/\n    B    __second_judge\n__in_interrupt:\n    CMP R2,#0\n    BEQ __set_R2_33\n    B   _NoFloatInMsp\n\n__set_R2_33:\n    MOVS R2,#0x21  /*if in interrupt,but the setpendAddr is 0,sth wrong happened, set id to 33*/\n    B _NoFloatInMsp\n\n__second_judge:\n    CMP R2,#0\n    BEQ _whether_in_initialization                /*jump when no external interrupt occurred*/\n\n    /**\n     * Interrupts and initialization phase always use MSP.\n     */\n_ExcInMSP:\n    /**\n     * Before executing instruction 'B _handleEntry', MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *                                 | R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR |\n     * +--------------------------------------------------------------------------------+---------\n     *                          R13--->|          Initial R13--->|<---      #32     --->|<---SAVED_SP\n     *                                                           |   (CPU auto saved)   |\n     *\n     */\n_NoFloatInMsp:\n    CMP R2,#0        /*check r2 ,find the phase interrupts occurred*/\n    BEQ __11\n    MOVS R1,#0x2f    /*in interrupt phase ,r1=47*/\n    LSLS R0,R0,#8\n    ORRS R0,R0,R1    /*make r1 available*/\n    B __12\n__11:\n    MOVS R1,#0        /*in initialization phase r1=0*/\n    LSLS R0,R0,#8\n    ORRS R0,R0,R1    /* make r1 available */\n__12:\n    ADD   R3, R13, #32                  /*#32: skip [R0-R3,R12,LR,PC,xPSR]*/\n    PUSH  {R3}                          /*push [SAVED_SP]: MSP+32 = Stack pointer in MSP before entering the exception*/\n    MRS   R12, PRIMASK\n    MOV R3,R12\n    PUSH {R3}\n    MOV R3,R11\n    PUSH {R3}\n    MOV R3,R10\n    PUSH {R3}\n    MOV R3,R9\n    PUSH {R3}\n    MOV R3,R8\n    PUSH {R3}\n    PUSH {R7}\n    PUSH {R6}\n    PUSH {R5}\n    PUSH {R4}                      /*push R4-R11,PRIMASK to MSP in certain order*/\n\n    B     _handleEntry\n\n    /**\n     * Check whether during the initialization phase.\n     * If g_bTaskScheduled == 0, it is in the initialization phase.\n     */\n_whether_in_initialization:\n    LDR  R1, =g_bTaskScheduled\n    LDR  R1, [R1]\n    MOVS R3,#1\n    TST  R1,R3\n    BEQ  _ExcInMSP                      /*initialization phase use MSP*/\n\n    /**\n     * Before executing _handleEntry, MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *                                  | R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR |\n     * +--------------------------------------------------------------------------------+---------\n     *                           R13--->|                        |<---      #32     --->|<---Initial R13\n     *                                                           |  (copied from PSP)   |\n     *                                                           |<---R2(no use)\n     *\n     * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR.\n     */\n_NoFloatInPsp:\n    MOVS R1,#1         /*in task ,r1 = 1 */\n    LSLS R0,R0,#8\n    ORRS R0,R0,R1       /*make r1 available*/\n\n    MOV   R1, R13\n    SUB   R13, #32                      /*#32: MSP reserved, used to store stack frame in PSP*/\n\n    MRS   R3, PSP\n\n    ADDS   R3, R3, #32                  /*PSP+32 = Stack pointer of the task before entering the exception*/\n\n    PUSH  {R3}                          /*push task SP to MSP*/\n    MRS R3,PRIMASK\n    PUSH {R3}\n    MOV R3,R11\n    PUSH {R3}\n    MOV R3,R10\n    PUSH {R3}\n    MOV R3,R9\n    PUSH {R3}\n    MOV R3,R8\n    PUSH {R3}\n    PUSH {R7}\n    PUSH {R6}\n    PUSH {R5}\n    PUSH {R4}\n\n    MRS R3,PSP\n    /* Copy stack frame from the stack of the current running task to MSP */\n    LDMIA R3!, {R4-R7}\n    SUBS R1,#0X20\n    STMIA R1!, {R4-R7}\n    LDMIA R3!, {R4-R7}\n    STMIA R1!, {R4-R7}\n\n    /**\n     * _handleEntry: Call osExcHandleEntry\n     * param1: R0 --- type num and phase\n     * param2: R1 --- the sp being used(in Cortex-M0,it is only for debug )\n     * param3: R2 --- external interrupt ID\n     * param4: R3 --- Point to the top of the stack(R4 or S16) that the exception stack frame in MSP.\n     */\n_handleEntry:\n    MOV R3, R13\n    MOV R1,R13\n    CPSID I\n    LDR R4,=osExcHandleEntry\n    MOV PC,R4\n    NOP\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m0/iar/los_dispatch_iar.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  LOS_IntLock\n    EXPORT  LOS_IntUnLock\n    EXPORT  LOS_IntRestore\n    EXPORT  LOS_StartToRun\n    EXPORT  osTaskSchedule\n    EXPORT  PendSV_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT  g_stLosTask\n    IMPORT  g_pfnTskSwitchHook\n    IMPORT  g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_NVIC_INT_CTRL              EQU    0xE000ED04  ; Interrupt Control and State Register.\nOS_NVIC_PENDSVSET             EQU    0x10000000  ; Value to trigger PendSV exception.\n\nOS_NVIC_SYSPRI2               EQU    0xE000ED20  ; System Handler Priority Register 2.\nOS_NVIC_PENDSV_SYSTICK_PRI    EQU    0xC0C00000  ; SysTick + PendSV priority level (lowest).\n\nOS_TASK_STATUS_RUNNING        EQU    0x0010      ; Task Status Flag (RUNNING).\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    SECTION    .text:CODE(2)\n    THUMB\n    REQUIRE8\n    PRESERVE8\n\n;****************************************************************************************\n; Function:\n;        VOID LOS_StartToRun(VOID);\n; Description:\n;        Start the first task, which is the highest priority task in the priority queue.\n;        Other tasks are started by task scheduling.\n;****************************************************************************************\nLOS_StartToRun\n    CPSID   I\n\n    ;/**\n    ; * Set PendSV and SysTick prority to the lowest.\n    ; * read ---> modify ---> write-back.\n    ; */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORRS    R1, R1, R2\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_bTaskScheduled = 1.\n    ; */\n    LDR     R0, =g_bTaskScheduled\n    MOVS    R1, #1\n    STR     R1, [R0]\n\n    ;/**\n    ; * Now PSP is an invalid value, R13 uses MSP as the stack pointer.\n    ; * After setting the control register, R13 will switch to PSP.\n    ; * To ensure that R13 is valid, set PSP = MSP.\n    ; */\n    MRS     R0, MSP\n    MSR     PSP, R0\n\n    ;/**\n    ; * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n    ; */\n    MOVS    R0, #2\n    MSR     CONTROL, R0\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n    ; */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n    ; */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOVS    R3, #OS_TASK_STATUS_RUNNING\n    ORRS    R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    ;/**\n    ; * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n    ; * Return by setting the CONTROL register.\n    ; *\n    ; * The initial stack of the current running task is as follows:\n    ; *\n    ; *                 POP: Restore the context of the current running task ===>|\n    ; *                                                             High addr--->|\n    ; *                                                   Bottom of the stack--->|\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n    ; *           |<---      skip     --->|<---        copy to R0-R7         --->|\n    ; *                                                             R3 to PSP--->|\n    ; *                                    Stack pointer after LOS_StartToRun--->|\n    ; */\n    LDR     R3, [R1]\n    ADDS    R3, R3, #36            ; skip R4-R11, PRIMASK.\n\n    LDMFD   R3!, {R0-R2}           ; restore R0-R2.\n    ADDS    R3, R3, #4             ; skip R3.\n    LDMFD   R3!, {R4-R7}           ; restore R12,LR,PC,xPSR.\n\n    ;/**\n    ; * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n    ; */\n    MSR     PSP, R3\n\n    SUBS    R3, R3, #20\n    LDR     R3, [R3]               ; restore R3.\n\n    ;/**\n    ; * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n    ; */\n    MOV     LR, R5\n    CPSIE   I\n\n    ;/**\n    ; * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n    ; * of the main function will be destroyed and will never be returned.\n    ; */\n    BX      R6\n\n;****************************************************************************************\n; Function:\n;        UINTPTR LOS_IntLock(VOID);\n; Description:\n;        Disable all interrupts except Reset,NMI and HardFault.\n;        The value of currnet interruption state will be returned to the caller to save.\n;\n; Function:\n;        VOID LOS_IntRestore(UINTPTR uvIntSave);\n; Description:\n;        Restore the locked interruption of LOS_IntLock.\n;        The caller must pass in the value of interruption state previously saved.\n;****************************************************************************************\nLOS_IntLock\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\nLOS_IntUnLock\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\nLOS_IntRestore\n    MSR     PRIMASK, R0\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID osTaskSchedule(VOID);\n; Description:\n;        Start the task swtich process by software trigger PendSV interrupt.\n;****************************************************************************************\nosTaskSchedule\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID PendSV_Handler(VOID);\n; Description:\n;        PendSV interrupt handler, switch the context of the task.\n;        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n;               to its own stack.\n;        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n;                from its own stack.\n;****************************************************************************************\nPendSV_Handler\n    ;/**\n    ; * R12: Save the interruption state of the current running task.\n    ; * Disable all interrupts except Reset,NMI and HardFault\n    ; */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    ;/**\n    ; * Call task switch hook.\n    ; */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CMP     R2, #0\n    BEQ     TaskSwitch\n    MOV     R1, LR\n    PUSH    {R0, R1}\n    BLX     R2\n    POP     {R0, R1}\n    MOV     LR, R1\n\nTaskSwitch\n    ;/**\n    ; * R0 = now stack pointer of the current running task.\n    ; */\n    MRS     R0, PSP\n\n    ;/**\n    ; * Save the stack frame(R4-R11) of the current running task.\n    ; * R12 save the PRIMASK value of the current running task.\n    ; * NOTE: Before entering the exception handler function, these registers\n    ; *       (xPSR,PC,LR,R12,R3-R0) have been automatically\n    ; *       saved by the CPU in the stack of the current running task.\n    ; *\n    ; * The stack of the current running task is as follows:\n    ; *\n    ; *           |<=== PUSH: Save the context of the current running task\n    ; *           |                                                      High addr--->|\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *                               Stack pointer before entering exception--->|\n    ; *                                   |<---        cpu auto saved        --->|\n    ; *                                   |<---PSP to R0\n    ; *           |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n    ; */\n    SUBS    R0, #36\n    STMIA   R0!, {R4-R7}           ; save R4-R7.\n    MOV     R3, R8                 ; copy R8-r12 to R3-r7.\n    MOV     R4, R9\n    MOV     R5, R10\n    MOV     R6, R11\n    MOV     R7, R12\n    STMIA   R0!, {R3-R7}           ; save R8-R12.\n    SUBS    R0, #36\n\n    ;/**\n    ; * R5,R3.\n    ; */\n    LDR     R5, =g_stLosTask\n    MOVS    R3, #OS_TASK_STATUS_RUNNING\n\n    ;/**\n    ; * Save the stack pointer of the current running task to TCB.\n    ; * (g_stLosTask.pstRunTask->pStackPointer = R0)\n    ; */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    ;/**\n    ; * Clear the RUNNING state of the current running task.\n    ; * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R6, #4]\n    BICS    R7, R7, R3\n    STRH    R7, [R6, #4]\n\n    ;/**\n    ; * Switch the current running task to the next running task.\n    ; * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n    ; */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    ;/**\n    ; * Set the RUNNING state of the next running task.\n    ; * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R0, #4]\n    ORRS    R7, R7, R3\n    STRH    R7, [R0, #4]\n\n    ;/**\n    ; * Restore the stack pointer of the next running task from TCB.\n    ; * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n    ; */\n    LDR     R1, [R0]\n\n    ;/**\n    ; * Restore the stack frame(R4-R11) of the next running task.\n    ; * R12 restore the PRIMASK value of the next running task.\n    ; * NOTE: After exiting the exception handler function, these registers\n    ; *       (xPSR,R0-R3,R12,LR,PC) will be automatically\n    ; *       restored by the CPU from the stack of the next running task.\n    ; *\n    ; * 1. The stack of the next running task is as follows:\n    ; *\n    ; *                    POP: Restore the context of the next running task ===>|\n    ; *                                                                  High addr--->|\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                      R1 to PSP--->|\n    ; *                                   |<---      cpu auto restoring      --->|\n    ; *                                 Stack pointer after exiting exception--->|\n    ; *\n    ; * 2. If the next running task is run for the first time, the stack is as follows:\n    ; *\n    ; *                    POP: Restore the context of the next running task ===>|\n    ; *                                                             High addr--->|\n    ; *                                                   Bottom of the stack--->|\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                      R1 to PSP--->|\n    ; *                                   |<---      cpu auto restoring      --->|\n    ; *                                 Stack pointer after exiting exception--->|\n    ; */\n    ADDS    R1, #16\n    LDMFD   R1!, {R3-R7}           ; restore R8-R12 to R3-R7.\n    MOV     R8, R3                 ; copy R3-R7 to R8-R12.\n    MOV     R9, R4\n    MOV     R10, R5\n    MOV     R11, R6\n    MOV     R12, R7\n    ;/**\n    ; * Set the stack pointer of the next running task to PSP.\n    ; */\n    MSR     PSP, R1\n    SUBS    R1, #36\n    LDMFD   R1!, {R4-R7}           ; restore R4-R7.\n\n    ;/**\n    ; * Restore the interruption state of the next running task.\n    ; */\n    MSR     PRIMASK, R12\n    BX      LR\n\n    END\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m0/keil/los_dispatch_keil.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  LOS_IntLock\n    EXPORT  LOS_IntUnLock\n    EXPORT  LOS_IntRestore\n    EXPORT  LOS_StartToRun\n    EXPORT  osTaskSchedule\n    EXPORT  PendSV_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT  g_stLosTask\n    IMPORT  g_pfnTskSwitchHook\n    IMPORT  g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_NVIC_INT_CTRL              EQU    0xE000ED04  ; Interrupt Control and State Register.\nOS_NVIC_PENDSVSET             EQU    0x10000000  ; Value to trigger PendSV exception.\n\nOS_NVIC_SYSPRI2               EQU    0xE000ED20  ; System Handler Priority Register 2.\nOS_NVIC_PENDSV_SYSTICK_PRI    EQU    0xC0C00000  ; SysTick + PendSV priority level (lowest).\n\nOS_TASK_STATUS_RUNNING        EQU    0x0010      ; Task Status Flag (RUNNING).\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    AREA    |.text|, CODE, READONLY\n    THUMB\n    REQUIRE8\n    PRESERVE8\n\n;****************************************************************************************\n; Function:\n;        VOID LOS_StartToRun(VOID);\n; Description:\n;        Start the first task, which is the highest priority task in the priority queue.\n;        Other tasks are started by task scheduling.\n;****************************************************************************************\nLOS_StartToRun\n    CPSID   I\n\n    ;/**\n    ; * Set PendSV and SysTick prority to the lowest.\n    ; * read ---> modify ---> write-back.\n    ; */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORRS    R1, R1, R2\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_bTaskScheduled = 1.\n    ; */\n    LDR     R0, =g_bTaskScheduled\n    MOVS    R1, #1\n    STR     R1, [R0]\n\n    ;/**\n    ; * Now PSP is an invalid value, R13 uses MSP as the stack pointer.\n    ; * After setting the control register, R13 will switch to PSP.\n    ; * To ensure that R13 is valid, set PSP = MSP.\n    ; */\n    MRS     R0, MSP\n    MSR     PSP, R0\n\n    ;/**\n    ; * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n    ; */\n    MOVS    R0, #2\n    MSR     CONTROL, R0\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n    ; */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n    ; */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOVS    R3, #OS_TASK_STATUS_RUNNING\n    ORRS    R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    ;/**\n    ; * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n    ; * Return by setting the CONTROL register.\n    ; *\n    ; * The initial stack of the current running task is as follows:\n    ; *\n    ; *                 POP: Restore the context of the current running task ===>|\n    ; *                                                             High addr--->|\n    ; *                                                   Bottom of the stack--->|\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n    ; *           |<---      skip     --->|<---        copy to R0-R7         --->|\n    ; *                                                             R3 to PSP--->|\n    ; *                                    Stack pointer after LOS_StartToRun--->|\n    ; */\n    LDR     R3, [R1]\n    ADDS    R3, R3, #36            ; skip R4-R11, PRIMASK.\n\n    LDMFD   R3!, {R0-R2}           ; restore R0-R2.\n    ADDS    R3, R3, #4             ; skip R3.\n    LDMFD   R3!, {R4-R7}           ; restore R12,LR,PC,xPSR.\n\n    ;/**\n    ; * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n    ; */\n    MSR     PSP, R3\n\n    SUBS    R3, R3, #20\n    LDR     R3, [R3]               ; restore R3.\n\n    ;/**\n    ; * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n    ; */\n    MOV     LR, R5\n    CPSIE   I\n\n    ;/**\n    ; * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n    ; * of the main function will be destroyed and will never be returned.\n    ; */\n    BX      R6\n\n;****************************************************************************************\n; Function:\n;        UINTPTR LOS_IntLock(VOID);\n; Description:\n;        Disable all interrupts except Reset,NMI and HardFault.\n;        The value of currnet interruption state will be returned to the caller to save.\n;\n; Function:\n;        VOID LOS_IntRestore(UINTPTR uvIntSave);\n; Description:\n;        Restore the locked interruption of LOS_IntLock.\n;        The caller must pass in the value of interruption state previously saved.\n;****************************************************************************************\nLOS_IntLock\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\nLOS_IntUnLock\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\nLOS_IntRestore\n    MSR     PRIMASK, R0\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID osTaskSchedule(VOID);\n; Description:\n;        Start the task swtich process by software trigger PendSV interrupt.\n;****************************************************************************************\nosTaskSchedule\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID PendSV_Handler(VOID);\n; Description:\n;        PendSV interrupt handler, switch the context of the task.\n;        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n;               to its own stack.\n;        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n;                from its own stack.\n;****************************************************************************************\nPendSV_Handler\n    ;/**\n    ; * R12: Save the interruption state of the current running task.\n    ; * Disable all interrupts except Reset,NMI and HardFault\n    ; */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    ;/**\n    ; * Call task switch hook.\n    ; */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CMP     R2, #0\n    BEQ     TaskSwitch\n    MOV     R1, LR\n    PUSH    {R0, R1}\n    BLX     R2\n    POP     {R0, R1}\n    MOV     LR, R1\n\nTaskSwitch\n    ;/**\n    ; * R0 = now stack pointer of the current running task.\n    ; */\n    MRS     R0, PSP\n\n    ;/**\n    ; * Save the stack frame(R4-R11) of the current running task.\n    ; * R12 save the PRIMASK value of the current running task.\n    ; * NOTE: Before entering the exception handler function, these registers\n    ; *       (xPSR,PC,LR,R12,R3-R0) have been automatically\n    ; *       saved by the CPU in the stack of the current running task.\n    ; *\n    ; * The stack of the current running task is as follows:\n    ; *\n    ; *           |<=== PUSH: Save the context of the current running task\n    ; *           |                                                      High addr--->|\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *                               Stack pointer before entering exception--->|\n    ; *                                   |<---        cpu auto saved        --->|\n    ; *                                   |<---PSP to R0\n    ; *           |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n    ; */\n    SUBS    R0, #36\n    STMIA   R0!, {R4-R7}           ; save R4-R7.\n    MOV     R3, R8                 ; copy R8-r12 to R3-r7.\n    MOV     R4, R9\n    MOV     R5, R10\n    MOV     R6, R11\n    MOV     R7, R12\n    STMIA   R0!, {R3-R7}           ; save R8-R12.\n    SUBS    R0, #36\n\n    ;/**\n    ; * R5,R3.\n    ; */\n    LDR     R5, =g_stLosTask\n    MOVS    R3, #OS_TASK_STATUS_RUNNING\n\n    ;/**\n    ; * Save the stack pointer of the current running task to TCB.\n    ; * (g_stLosTask.pstRunTask->pStackPointer = R0)\n    ; */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    ;/**\n    ; * Clear the RUNNING state of the current running task.\n    ; * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R6, #4]\n    BICS    R7, R7, R3\n    STRH    R7, [R6, #4]\n\n    ;/**\n    ; * Switch the current running task to the next running task.\n    ; * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n    ; */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    ;/**\n    ; * Set the RUNNING state of the next running task.\n    ; * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R0, #4]\n    ORRS    R7, R7, R3\n    STRH    R7, [R0, #4]\n\n    ;/**\n    ; * Restore the stack pointer of the next running task from TCB.\n    ; * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n    ; */\n    LDR     R1, [R0]\n\n    ;/**\n    ; * Restore the stack frame(R4-R11) of the next running task.\n    ; * R12 restore the PRIMASK value of the next running task.\n    ; * NOTE: After exiting the exception handler function, these registers\n    ; *       (xPSR,R0-R3,R12,LR,PC) will be automatically\n    ; *       restored by the CPU from the stack of the next running task.\n    ; *\n    ; * 1. The stack of the next running task is as follows:\n    ; *\n    ; *                    POP: Restore the context of the next running task ===>|\n    ; *                                                                  High addr--->|\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                      R1 to PSP--->|\n    ; *                                   |<---      cpu auto restoring      --->|\n    ; *                                 Stack pointer after exiting exception--->|\n    ; *\n    ; * 2. If the next running task is run for the first time, the stack is as follows:\n    ; *\n    ; *                    POP: Restore the context of the next running task ===>|\n    ; *                                                             High addr--->|\n    ; *                                                   Bottom of the stack--->|\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                      R1 to PSP--->|\n    ; *                                   |<---      cpu auto restoring      --->|\n    ; *                                 Stack pointer after exiting exception--->|\n    ; */\n    ADDS    R1, #16\n    LDMFD   R1!, {R3-R7}           ; restore R8-R12 to R3-R7.\n    MOV     R8, R3                 ; copy R3-R7 to R8-R12.\n    MOV     R9, R4\n    MOV     R10, R5\n    MOV     R11, R6\n    MOV     R12, R7\n    ;/**\n    ; * Set the stack pointer of the next running task to PSP.\n    ; */\n    MSR     PSP, R1\n    SUBS    R1, #36\n    LDMFD   R1!, {R4-R7}           ; restore R4-R7.\n\n    ;/**\n    ; * Restore the interruption state of the next running task.\n    ; */\n    MSR     PRIMASK, R12\n    BX      LR\n\n    ALIGN\n    END\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m0/keil/los_hw_exc_keil.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    PRESERVE8\n    AREA    |.text|, CODE, READONLY\n    THUMB\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  NMI_Handler\n    EXPORT  HardFault_Handler\n    EXPORT  MemManage_Handler\n    EXPORT  BusFault_Handler\n    EXPORT  UsageFault_Handler\n;    EXPORT  SVC_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT osExcHandleEntry\n    IMPORT g_uwExcTbl\n    IMPORT g_bTaskScheduled\n    IMPORT it_is_memManangeFault\n    IMPORT it_is_busFault\n    IMPORT it_is_usageFault\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_EXC_CAUSE_NMI            EQU   18\nOS_EXC_CAUSE_HARDFAULT      EQU   19\nOS_EXC_CAUSE_MEMFAULT       EQU   20\nOS_EXC_CAUSE_BUSFAULT       EQU   21\nOS_EXC_CAUSE_USAGEFAULT     EQU   22\nOS_EXC_CAUSE_SVC            EQU   23\n\nHF_DEBUGEVT                 EQU   24\nHF_VECTBL                   EQU   25\n\nFLAG_ADDR_VALID             EQU   0x10000       ; bit 16\nFLAG_HWI_ACTIVE             EQU   0x20000       ; bit 17\nFLAG_NO_FLOAT               EQU   0x10000000    ; bit 28\n\nOS_NVIC_CFSR                EQU   0xE000ED28    ; include BusFault/MemFault/UsageFault State Regeister\nOS_NVIC_HFSR                EQU   0xE000ED2C    ; HardFault State Regeister\nOS_NVIC_BFAR                EQU   0xE000ED38\nOS_NVIC_MMFAR               EQU   0xE000ED34\nOS_NVIC_ACT_BASE            EQU   0xE000E300\nOS_NVIC_SHCSRS              EQU   0xE000ED24\nOS_NVIC_SHCSR_MASK          EQU   0xC00         ; SYSTICKACT and PENDSVACT\n\nADDR_SETPEND        EQU        0XE000E200        ;the addr of setpend register\nADDR_CLRPEND        EQU        0XE000E280        ;the addr of clrpend register\n;****************************************************************************************\n; Function:\n;        VOID NMI_Handler(VOID);\n; Description:\n;        NMI Handler.\n;****************************************************************************************\nNMI_Handler\n    ;/**\n    ; * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +------------------------------------------------------+------------------------+\n    ; * |                          31-8                        |          7-0           |\n    ; * +------------------------------------------------------+------------------------+\n    ; * |                          ---                         |    OS_EXC_CAUSE_NMI    |\n    ; * +------------------------------------------------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    MOVS  R0, #OS_EXC_CAUSE_NMI\n    MOVS  R1, #0\n    B  osExcDispatch\n\n;****************************************************************************************\n; Function:\n;        VOID HardFault_Handler(VOID);\n; Description:\n;        HardFault Handler.\n;****************************************************************************************\nHardFault_Handler\n    ;/**\n    ; * save fault type to R0\n    ; */\n    MOVS  R0, #OS_EXC_CAUSE_HARDFAULT    \n    B  osExcDispatch      \n\n;****************************************************************************************\n; Function:\n;        VOID BusFault_Handler(VOID);\n; Description:\n;        BusFault Handler.\n;****************************************************************************************\nBusFault_Handler\n    BL it_is_busFault\n;****************************************************************************************\n; Function:\n;        VOID MemManage_Handler(VOID);\n; Description:\n;        MemManage Handler.\n;****************************************************************************************\nMemManage_Handler\n    BL it_is_memManangeFault\n;****************************************************************************************\n; Function:\n;        VOID UsageFault_Handler(VOID);\n; Description:\n;        UsageFault Handler.\n;****************************************************************************************\nUsageFault_Handler\n    BL it_is_usageFault\n\n    ;/**\n    ; * When executing osExcDispatch,  R2 will be used.\n    ; */\nosExcDispatch\n    LDR   R2, =ADDR_SETPEND\n    LDR   R2, [R2]\n        \n    CMP R2,#0\n    BEQ _whether_in_initialization                ;NO external interrupt occurred\n\n    ;/**\n    ; * Interrupts and initialization phase always use MSP.\n    ; */\n_ExcInMSP\n    ;/**\n    ; * Before executing instruction 'B _handleEntry', MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                                 | R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                          R13--->|          Initial R13--->|<---      #32     --->|<---SAVED_SP\n    ; *                                                           |   (CPU auto saved)   |\n    ; *\n    ; */\n_NoFloatInMsp\n    CMP R2,#0        ;check r2 ,find the phase interrupts occurred\n    BEQ __11\n    MOVS R1,#0x2f    ;in interrupt phase ,r1=47\n    LSLS R0,R0,#8\n    ORRS R0,R0,R1    ;make r1 available\n    B __12\n__11\n    MOVS R1,#0        ;in initialization phase r1=0\n    LSLS R0,R0,#8\n    ORRS R0,R0,R1    ;make r1 available\n__12\n    ADD   R3, R13, #32                 ; #32: skip [R0-R3,R12,LR,PC,xPSR]\n    PUSH  {R3}                         ; push [SAVED_SP]: MSP+32 = Stack pointer in MSP before entering the exception\n    MRS   R12, PRIMASK                   \n    MOV R3,R12\n    PUSH {R3}\n    MOV R3,R11\n    PUSH {R3}\n    MOV R3,R10\n    PUSH {R3}\n    MOV R3,R9\n    PUSH {R3}\n    MOV R3,R8\n    PUSH {R3}\n    PUSH {R7}\n    PUSH {R6}\n    PUSH {R5}\n    PUSH {R4}                     ; push R4-R11,PRIMASK to MSP in certain order\n\n    B     _handleEntry\n\n    ;/**\n    ; * Check whether during the initialization phase.\n    ; * If g_bTaskScheduled == 0, it is in the initialization phase.\n    ; */\n_whether_in_initialization\n    LDR  R1, =g_bTaskScheduled\n    LDR  R1, [R1]\n    MOVS R3,#1\n    TST  R1,R3\n    BEQ  _ExcInMSP                     ; initialization phase use MSP\n\n    ;/**\n    ; * Before executing _handleEntry, MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                                  | R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                           R13--->|                        |<---      #32     --->|<---Initial R13\n    ; *                                                           |  (copied from PSP)   |\n    ; *                                                           |<---R2(no use)\n    ; *\n    ; * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR.\n    ; */\n_NoFloatInPsp\n    MOVS R1,#1 ;in task ,r1 = 1\n    LSLS R0,R0,#8\n    ORRS R0,R0,R1    ;make r1 available\n\n    MOV   R1, R13\n    SUB   R13, #32                     ; #32: MSP reserved, used to store stack frame in PSP\n\n    MRS   R3, PSP\n\n    ADDS   R3, R3, #32                 ; PSP+32 = Stack pointer of the task before entering the exception\n\n    PUSH  {R3}                        ; push task SP to MSP\n    MRS R3,PRIMASK\n    PUSH {R3}\n    MOV R3,R11\n    PUSH {R3}\n    MOV R3,R10\n    PUSH {R3}\n    MOV R3,R9\n    PUSH {R3}\n    MOV R3,R8\n    PUSH {R3}\n    PUSH {R7}\n    PUSH {R6}\n    PUSH {R5}\n    PUSH {R4}\n    \n    MRS R3,PSP\n    ;/* Copy stack frame from the stack of the current running task to MSP */\n    LDMIA R3!, {R4-R7}\n    SUBS R1,#0X20\n    STMIA R1!, {R4-R7}\n    LDMIA R3!, {R4-R7}\n    STMIA R1!, {R4-R7}\n\n    ;/**\n    ; * _handleEntry: Call osExcHandleEntry\n    ; * param1: R0 --- type num and phase\n    ; * param2: R1 --- the sp being used(in Cortex-M0,it is only for debug )\n    ; * param3: R2 --- external interrupt ID\n    ; * param4: R3 --- Point to the top of the stack(R4 or S16) that the exception stack frame in MSP.\n    ; */\n_handleEntry\n    MOV R3, R13\n    MOV R1,R13\n    CPSID I\n    LDR R4,=osExcHandleEntry\n    MOV PC,R4\n    NOP\n    ALIGN\n    END"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m0/los_exc.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n\n#include \"los_exc.inc\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n#if (LOSCFG_PLATFORM_EXC == YES)\n\nUINT32 g_uwCurNestCount = 0;\nEXC_INFO_S m_stExcInfo;\n/*\n * CFSR register, include UFSR,BFSR and MFSR.\n *\n * +----------------------------------------------------------------------------------+\n * |                                      UFSR                                        |\n * |-----------+-----------+-----------+-------+------+-------+----------+------------|\n * |  31 - 26  |     25    |     24    | 23-20 |  19  |   18  |    17    |     16     |\n * |-----------+-----------+-----------+-------+------+-------+----------+------------|\n * |    ---    | DIVBYZERO | UNALIGNED |  ---  | NOCP | INVPC | INVSTATE | UNDEFINSTR |\n * +----------------------------------------------------------------------------------+\n *\n * +----------------------------------------------------------------------------------+\n * |                                     BFSR                                         |\n * |-----------+-----+--------+--------+----------+-------------+-----------+---------|\n * |     15    |  14 |   13   |   12   |    11    |      10     |     9     |    8    |\n * |-----------+-----+--------+--------+----------+-------------+-----------+---------|\n * | BFARVALID | --- | LSPERR | STKERR | UNSTKERR | IMPRECISERR | PRECISERR | IBUSERR |\n * +----------------------------------------------------------------------------------+\n *\n * +----------------------------------------------------------------------------------+\n * |                                     MFSR                                         |\n * |-----------+-------+---------+---------+-----------+-------+----------+-----------|\n * |     7     |   6   |    5    |    4    |     3     |   2   |    1     |     0     |\n * |-----------+-------+---------+---------+-----------+-------+----------+-----------|\n * | MMARVALID |  ---  | MLSPERR | MSTKERR | MUNSTKERR |  ---  | DACCVIOL | ICACCVIOL |\n * +----------------------------------------------------------------------------------+\n */\nUINT8 g_uwExcTbl[32] =\n{\n    0, 0, 0, 0, 0, 0, OS_EXC_UF_DIVBYZERO, OS_EXC_UF_UNALIGNED,\n    0, 0, 0, 0, OS_EXC_UF_NOCP, OS_EXC_UF_INVPC, OS_EXC_UF_INVSTATE, OS_EXC_UF_UNDEFINSTR,\n    0, 0, 0, OS_EXC_BF_STKERR, OS_EXC_BF_UNSTKERR, OS_EXC_BF_IMPRECISERR, OS_EXC_BF_PRECISERR, OS_EXC_BF_IBUSERR,\n    0, 0, 0, OS_EXC_MF_MSTKERR, OS_EXC_MF_MUNSTKERR, 0, OS_EXC_MF_DACCVIOL, OS_EXC_MF_IACCVIOL\n};\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\nVOID *m_puwExcContent;\nUINT32 g_uwArraySize = 0;\nEXC_INFO_ARRAY_S m_stExcArray[OS_EXC_TYPE_MAX - 1];\nstatic VOID osExcSave2DDR(VOID);\n#endif\n\nextern VOID LOS_Reboot(VOID);\n\n/*****************************************************************************\n Function    : osExcInfoDisplay\n Description : EXC info display\n Input       : pstExc --- Pointer to the EXC data\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcInfoDisplay(EXC_INFO_S *pstExc)\n{\n\n    //in gcc env\n    PRINT_ERR(\"Phase      = 0x%8x\\n\", pstExc->usPhase);\n    PRINT_ERR(\"ThrdPid    = 0x%8x\\n\", pstExc->uwThrdPid);\n    PRINT_ERR(\"R0         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR0,pstExc->pstContext->uwR0);\n    PRINT_ERR(\"R1         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR1,pstExc->pstContext->uwR1);\n    PRINT_ERR(\"R2         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR2,pstExc->pstContext->uwR2);\n    PRINT_ERR(\"R3         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR3,pstExc->pstContext->uwR3);\n    PRINT_ERR(\"R4         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR4,pstExc->pstContext->uwR4);\n    PRINT_ERR(\"R5         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR5,pstExc->pstContext->uwR5);\n    PRINT_ERR(\"R6         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR6,pstExc->pstContext->uwR6);\n    PRINT_ERR(\"R7         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR7,pstExc->pstContext->uwR7);\n    PRINT_ERR(\"R8         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR8,pstExc->pstContext->uwR8);\n    PRINT_ERR(\"R9         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR9,pstExc->pstContext->uwR9);\n    PRINT_ERR(\"R10        = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR10,pstExc->pstContext->uwR10);\n    PRINT_ERR(\"R11        = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR11,pstExc->pstContext->uwR11);\n    PRINT_ERR(\"R12        = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwR12,pstExc->pstContext->uwR12);\n    PRINT_ERR(\"PriMask    = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwPriMask,pstExc->pstContext->uwPriMask);\n    PRINT_ERR(\"SP         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwSP,pstExc->pstContext->uwSP);\n    PRINT_ERR(\"LR         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwLR,pstExc->pstContext->uwLR);\n    PRINT_ERR(\"PC         = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwPC,pstExc->pstContext->uwPC);\n    PRINT_ERR(\"xPSR       = 0x%8x\\t%16u\\n\", pstExc->pstContext->uwxPSR,pstExc->pstContext->uwxPSR);\n    PRINT_ERR(\"\\nplease use the addr2line tool to analyze the call stack on PC:\\n\");\n    PRINT_ERR(\"addr2line -e (xxx.axf/xxx.elf/xxx.out) -a -f \");\n\n    for (UINT32 i = 0; i < pstExc->uwCallStackDepth; i++)\n    {\n        printf(\"%8x\", pstExc->uwCallStack[i]);\n    }\n    printf(\"\\n\");\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcCallStackAnalysis\n Description : Call stack analysis\n Input       : pstExc  ---  point to exception info\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcCallStackAnalysis(EXC_INFO_S *pstExc)\n{\n    UINT32 uwSP;\n    UINT32 uwLR;\n    UINT32 uwPC;\n    UINT32 uwStackStartAddr;\n    UINT32 uwStackSize;\n    UINT32 uwDepth = 0;\n    BOOL   bFirstLrValid = FALSE;\n\n    uwSP = pstExc->pstContext->uwSP;  /* sp pointer before entering exception */\n\n    /*\n     * save first and second depth\n     * first: PC before entering exception\n     * second: (LR - 4) before entering exception\n     * NOTE: If an exception occurs in the interrupt, LR may be EXC_RETURN, so we must make sure\n     *       that LR is valid, exclude EXC_RETURN.\n     */\n\n    pstExc->uwCallStack[uwDepth++] = pstExc->pstContext->uwPC;\n\n    if ((pstExc->pstContext->uwLR >= LOSCFG_EXC_CODE_START_ADDR) && \\\n        (pstExc->pstContext->uwLR <= LOSCFG_EXC_CODE_START_ADDR + LOSCFG_EXC_CODE_SIZE))\n    {\n        pstExc->uwCallStack[uwDepth++] = pstExc->pstContext->uwLR - sizeof(VOID *);  /* lr = pc + 4 */\n        bFirstLrValid = TRUE;\n        int tmp = uwDepth - 1;\n    }\n\n\n    /*\n     * get the start address and size of the stack before entering the exception\n     */\n    if (pstExc->usPhase == OS_EXC_IN_TASK)  /* task use PSP */\n    {\n        uwStackStartAddr = g_stLosTask.pstRunTask->uwTopOfStack;\n        uwStackSize = g_stLosTask.pstRunTask->uwStackSize;\n    }\n    else  /* init and interrupt use MSP */\n    {\n        uwStackStartAddr = LOSCFG_EXC_MSP_START_ADDR;\n        uwStackSize = LOSCFG_EXC_MSP_SIZE;\n    }\n\n    /*\n     * check stack overflow, if so, compensate for overflow, readjust stack start address and size.\n     */\n    if (uwSP < uwStackStartAddr)  /* stack top overflow */\n    {\n        if (pstExc->usPhase == OS_EXC_IN_TASK)\n        {\n            PRINT_ERR(\"task %s stack top overflow\\n\", g_stLosTask.pstRunTask->pcTaskName);\n        }\n        else\n        {\n            PRINT_ERR(\"MSP top overflow\\n\");\n        }\n        uwStackSize += (uwStackStartAddr - uwSP);  /* compensate overflow size */\n        uwStackStartAddr = uwSP;  /* readjust stack start address */\n    }\n\n    /*\n     * Traverses the entire stack from the top of the stack to the bottom of the stack,\n     * find all LR.\n     */\n     for (; uwSP < uwStackStartAddr + uwStackSize; uwSP += sizeof(UINT32*))\n    {\n         uwLR = *(UINT32 *)uwSP;\n\n        if (uwLR % 2 == 0)  /* Thumb instruction, LR bit0 == 1 */\n        {\n            continue;\n        }\n\n        /*\n         * It may be LR, which must be further determined based on the start address\n         * and end address of the code segment.\n         */\n        if ((uwLR >= LOSCFG_EXC_CODE_START_ADDR) && (uwLR <= LOSCFG_EXC_CODE_START_ADDR + LOSCFG_EXC_CODE_SIZE) \\\n            && (uwDepth < LOSCFG_EXC_CALL_STACK_ANALYSIS_MAX_DEPTH))\n        {\n            uwPC = uwLR - sizeof(VOID *);  /* lr = pc + 4 */\n            /* the second depth(first LR) has been saved */\n            if ((uwDepth == 2) && (uwPC == pstExc->uwCallStack[1]) && (bFirstLrValid == TRUE))\n            {\n                continue;\n            }\n            pstExc->uwCallStack[uwDepth++] = uwPC;\n        }\n    }\n    pstExc->uwCallStackDepth = uwDepth;  /* save call stack depth */\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcHandleEntry\n Description : EXC handler entry\n Input       : uwExcType     --- EXC type\n             : uwFaultAddr   --- The address of an accurate address access error\n             : uwPid         --- Interrupt number\n             : puwExcBufAddr --- Point to the stack frame without FPU\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcHandleEntry(UINT32 uwExcType, UINT32 uwUsingSp, UINT32 uwID, EXC_CONTEXT_S *pstExcBufAddr)\n{\n    g_uwCurNestCount++;\n#if (LOSCFG_PLATFORM_HWI == YES)\n    extern UINT32 g_vuwIntCount;\n    g_vuwIntCount++;\n#endif\n    int tmp_type = uwExcType & 0x0000ff00;\n    tmp_type = tmp_type >> 8;\n    /* Save interrupt nesting times */\n    m_stExcInfo.usNestCnt = (UINT16)g_uwCurNestCount;\n    /* uwExcType 8-15 bits: exc type */\n    m_stExcInfo.usType = (UINT16)tmp_type;\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    /* Initializing a pointer to save an exception context */\n    m_puwExcContent = (UINT32 *)m_aucTaskArray;\n#endif\n\n    /* Save the fault address when an exception occurs if it is valid */\n    /* Save the phase of the exception */\n    extern BOOL g_bTaskScheduled;\n    int tmp_phase = uwExcType;\n    tmp_phase = uwExcType & 0x000000ff;\n    m_stExcInfo.usPhase = (UINT16)tmp_phase;\n    m_stExcInfo.uwThrdPid = uwID;  /* interrupt number */\n    m_stExcInfo.usFpuContext = 0;\n    m_stExcInfo.pstContext = pstExcBufAddr; /* point to r3 */\n\n    osExcCallStackAnalysis(&m_stExcInfo);\n    osExcInfoDisplay(&m_stExcInfo);\n    LOS_Reboot();\n}\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n/*****************************************************************************\n Function    : osExcSaveIntStatus\n Description : Save NVIC register group\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSaveIntStatus(VOID)\n{\n    /* Save exc type */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_NVIC;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save total size of NVIC */\n    *((UINT32 *)m_puwExcContent) = 0x164; // = OS_NVIC_INT_ENABLE_SIZE + OS_NVIC_INT_PEND_SIZE + OS_NVIC_INT_ACT_SIZE + OS_NVIC_INT_PRI_SIZE + 12 + 4 + 4\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save interrupt enable register group (start addr: 0xE000E100, size: 32bytes, CMSIS-Core: NVIC->ISER[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SETENA_BASE, OS_NVIC_INT_ENABLE_SIZE);\n    m_puwExcContent =(UINT8 *)m_puwExcContent + OS_NVIC_INT_ENABLE_SIZE;\n\n    /* Save interrupt pend register group (start addr: 0xE000E200, size: 32bytes, CMSIS-Core: NVIC->ISPR[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SETPEND_BASE, OS_NVIC_INT_PEND_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_PEND_SIZE;\n\n    /* Save interrupt active status register group (start addr: 0xE000E300, size: 32bytes, CMSIS-Core: NVIC->IABR[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_INT_ACT_BASE, OS_NVIC_INT_ACT_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_ACT_SIZE;\n\n    /* Save interrupt priority register group (start addr: 0xE000E400, size: 240bytes), CMSIS-Core: NVIC->IP[0 - 239] */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_PRI_BASE, OS_NVIC_INT_PRI_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_PRI_SIZE;\n\n    /* Save system exception priority register group (start addr: 0xE000ED18, size: 12bytes, CMSIS-Core: SCB->SHP[0 - 11]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_EXCPRI_BASE, 12);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 12;\n\n    /* Save system processing control and state register group (start addr: 0xE000ED24, size: 4bytes, CMSIS-Core: SCB->SHCSR) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SHCSR, 4);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save interrupt control and status register group (start addr: 0xE000ED04, size: 4bytes, CMSIS-Core: SCB->ICSR) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_INT_CTRL, 4);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcRegister\n Description : Register exception\n Input       : uwType  --- exception type\n             : pFunc   --- exception callback function\n             : pArg    --- exception save info arg, not pFunc\n Output      : None\n Return      : None\n *****************************************************************************/\nVOID osExcRegister(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg)\n{\n    EXC_INFO_ARRAY_S *pstExcInfo;\n\n    if (uwType == 0 || uwType >= OS_EXC_TYPE_MAX || pFunc == NULL)\n    {\n        PRINT_ERR(\"osExcRegister ERROR!\\n\");\n        return;\n    }\n\n    pstExcInfo = &(m_stExcArray[uwType - 1]);\n    pstExcInfo->uwType       = uwType;\n    pstExcInfo->pFnExcInfoCb = pFunc;\n    pstExcInfo->pArg         = pArg;\n    pstExcInfo->uwValid      = TRUE;\n}\n\n/*****************************************************************************\n Function    : osExcSaveSysInfo\n Description : Saving exception information by calling callback function recursively\n Input       : uwType  --- exception type(OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1)\n             : pFunc   --- callback function\n             : uwLoop  --- loop total count\n             : uwLen   --- The size of the data saved each time\n             : uwIdx   --- loop index\n Output      : None\n Return      : None\n *****************************************************************************/\nVOID osExcSaveSysInfo(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, UINT32 uwLoop, UINT32 uwLen, UINT32 uwIdx)\n{\n    UINT32 uwRet;\n    UINT32 uwBuffer[OS_EXC_MAX_BUF_LEN];\n\n    /* Save exception type and size */\n    *((UINT32 *)m_puwExcContent) = uwType;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n    *((UINT32 *)m_puwExcContent)  = uwLen * (uwLoop - uwIdx);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    for (; uwIdx < uwLoop; uwIdx++)\n    {\n        memset((VOID *)uwBuffer, 0, sizeof(UINT32) * OS_EXC_MAX_BUF_LEN);\n        uwRet = pFunc(uwIdx, (VOID *)uwBuffer);\n        if (LOS_OK == uwRet)\n        {\n            memcpy(m_puwExcContent, (VOID *)uwBuffer, uwLen);\n        }\n        m_puwExcContent =(UINT8 *)m_puwExcContent + uwLen;\n    }\n}\n\n/*****************************************************************************\n Function    : osExcSaveInfo\n Description : save exception info\n Input       : uwType  --- exception type(OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1)\n             : pFunc   --- exception callback\n             : pArg    --- register arg, used to generate the arg passed to the callback\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSaveInfo(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg)\n{\n    UINT32 uwLen;\n    UINT32 uwIdx;\n    UINT32 uwLoop;\n    UINT32 uwTaskSwitchCount = 0;\n    OS_TASK_SWITCH_INFO *pstTaskSwitchInfo;\n\n    switch(uwType)\n    {\n        case OS_EXC_TYPE_TSK:  /* save task info */\n            uwLen = sizeof(TSK_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        case OS_EXC_TYPE_QUE:  /* save queue info */\n            uwLen = sizeof(QUEUE_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        case OS_EXC_TYPE_NVIC:  /* save NVIC info */\n            (VOID)pFunc(0, 0);\n            goto END;\n\n        case OS_EXC_TYPE_TSK_SWITCH:  /* save task switch info */\n            pstTaskSwitchInfo = pArg;\n            uwTaskSwitchCount = pstTaskSwitchInfo->ucIsFull & 0x7F;\n            uwLen = sizeof(UINT32) + sizeof(CHAR) * LOS_TASK_NAMELEN; /* auwPID + acName */\n            if (pstTaskSwitchInfo->ucIsFull & 0x80)\n            {\n                uwIdx = pstTaskSwitchInfo->ucIdx;\n                uwLoop = uwIdx + uwTaskSwitchCount;\n            }\n            else\n            {\n                uwIdx = 0;\n                uwLoop = pstTaskSwitchInfo->ucIdx;\n            }\n            break;\n\n        case OS_EXC_TYPE_MEM:  /* save mem info */\n            uwLen = sizeof(MEM_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        default:\n            goto END;\n    }\n    osExcSaveSysInfo(uwType, (EXC_INFO_SAVE_CALLBACK)pFunc, uwLoop, uwLen, uwIdx);\nEND:\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcSave2DDR\n Description : Save exception info to RAM\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSave2DDR(VOID)\n{\n    UINT32 uwIdx = 0;\n    UINT32 uwExcContextSize;\n\n    if (m_stExcInfo.usFpuContext == 1)\n    {\n        uwExcContextSize = sizeof(EXC_CONTEXT_S);\n    }\n    else\n    {\n        uwExcContextSize = sizeof(EXC_CONTEXT_S) - 136; /* except FPU register */\n    }\n\n    memset(m_puwExcContent, 0xff, g_uwArraySize);\n\n    /* Cortex-M type */\n    *((UINT32 *)m_puwExcContent) = 4;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /*\n     * Save exception type: OS_EXC_TYPE_CONTEXT\n     */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_CONTEXT;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* The size of struct EXC_INFO_S(except member EXC_CONTEXT_S*) and exception context size */\n    *((UINT32 *)m_puwExcContent) = sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *) + uwExcContextSize;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save struct m_stExcInfo except m_stExcInfo.pstContext */\n    memcpy((VOID *)m_puwExcContent, (VOID *)&m_stExcInfo, sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *));\n    m_puwExcContent = (UINT8 *)m_puwExcContent + sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *);\n\n    /* Save struct EXC_CONTEXT_S */\n    if (m_stExcInfo.usFpuContext == 0)\n    {\n        #if FPU_EXIST\n        /* m_stExcInfo.pstContext: init --- point to S16, S16->S31 invalid\n         *                         + 64 --- point to uwR4\n         *                         copy uwR4 -> uwxPSR */\n        memcpy((VOID *)m_puwExcContent, (UINT8 *)m_stExcInfo.pstContext + 64, uwExcContextSize);\n        #else\n        memcpy((VOID *)m_puwExcContent, m_stExcInfo.pstContext, uwExcContextSize);\n        #endif\n    }\n    else\n    {\n        memcpy((VOID *)m_puwExcContent, m_stExcInfo.pstContext, uwExcContextSize);\n    }\n    m_puwExcContent = (UINT8 *)m_puwExcContent + uwExcContextSize;\n\n    /*\n     * Save exception type: OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1\n     */\n    for (uwIdx = 0; uwIdx < OS_EXC_TYPE_MAX - 1; uwIdx++)\n    {\n        if (m_stExcArray[uwIdx].uwValid == FALSE)\n        {\n            continue;\n        }\n        osExcSaveInfo(m_stExcArray[uwIdx].uwType, m_stExcArray[uwIdx].pFnExcInfoCb, m_stExcArray[uwIdx].pArg);\n    }\n\n    /*\n     * Save exception type: OS_EXC_TYPE_MAX\n     */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_MAX;\n    m_puwExcContent = (UINT8*)m_puwExcContent + 4;\n\n    return;\n}\n#endif /*(LOSCFG_SAVE_EXC_INFO == YES)*/\n\n/*****************************************************************************\n Function    : osExcInit\n Description : Initializes the EXC\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT_INIT VOID osExcInit(UINT32 uwArraySize)\n{\n#if (LOSCFG_PLATFORM_HWI == YES)\n    /* Register exception handler to interrupt vector table in RAM */\n    m_pstHwiForm[-14 + OS_SYS_VECTOR_CNT] = NMI_Handler;\n    m_pstHwiForm[-13 + OS_SYS_VECTOR_CNT] = HardFault_Handler;\n    m_pstHwiForm[-12 + OS_SYS_VECTOR_CNT] = MemManage_Handler;\n    m_pstHwiForm[-11 + OS_SYS_VECTOR_CNT] = BusFault_Handler;\n    m_pstHwiForm[-10 + OS_SYS_VECTOR_CNT] = UsageFault_Handler;\n    m_pstHwiForm[-5  + OS_SYS_VECTOR_CNT] = SVC_Handler;\n#endif\n\n    /* Enable USGFAULT(BIT_18), BUSFAULT(BIT_17), MEMFAULT(BIT_16) */\n    *(volatile UINT32 *)OS_NVIC_SHCSR |= 0x70000;\n\n    /* Enable DIV 0(BIT_4) exception, unaligned(BIT_3) disable */\n    *(volatile UINT32 *)OS_NVIC_CCR |= 0x10;\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    g_uwArraySize = uwArraySize;\n    osExcRegister((EXC_INFO_TYPE)OS_EXC_TYPE_NVIC, (EXC_INFO_SAVE_CALLBACK)osExcSaveIntStatus, NULL);\n#endif\n}\n\nVOID osBackTrace(VOID)\n{\n    return;\n}\n\n#endif /*(LOSCFG_PLATFORM_EXC == YES)*/\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m0/los_exc.inc",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#ifndef _LOS_EXC_INC\n#define _LOS_EXC_INC\n\n#include \"los_exc.ph\"\n#include \"los_sys.ph\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n#endif /* _LOS_EXC_INC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m0/los_exc.ph",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef _LOS_EXC_PH\n#define _LOS_EXC_PH\n\n#include \"los_exc.h\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n#if (LOSCFG_PLATFORM_EXC == YES)\ntypedef enum\n{\n    OS_EXC_TYPE_CONTEXT     = 0,\n    OS_EXC_TYPE_TSK         = 1,\n    OS_EXC_TYPE_QUE         = 2,\n    OS_EXC_TYPE_NVIC        = 3,\n    OS_EXC_TYPE_TSK_SWITCH  = 4,\n    OS_EXC_TYPE_MEM         = 5,\n    OS_EXC_TYPE_MAX         = 6\n} EXC_INFO_TYPE;\n\ntypedef struct tagExcInfoCallBackArray\n{\n    EXC_INFO_TYPE           uwType;\n    UINT32                  uwValid;\n    EXC_INFO_SAVE_CALLBACK  pFnExcInfoCb;\n    VOID*                   pArg;\n}EXC_INFO_ARRAY_S;\n\n\n#define OS_NVIC_SHCSR                       0xE000ED24\n#define OS_NVIC_CCR                         0xE000ED14\n\n#define OS_NVIC_INT_ENABLE_SIZE             0x20\n#define OS_NVIC_INT_PRI_SIZE                0xF0\n\n#define OS_NVIC_INT_PEND_SIZE               OS_NVIC_INT_ACT_SIZE\n#define OS_NVIC_INT_ACT_SIZE                OS_NVIC_INT_ENABLE_SIZE\n\n\n#define MAX_SCENE_INFO_SIZE     (8 + sizeof(EXC_INFO_S) - 4 + sizeof(EXC_CONTEXT_S))\n#define MAX_TSK_INFO_SIZE       (8 + sizeof(TSK_INFO_S) * (LOSCFG_BASE_CORE_TSK_LIMIT + 1))\n#define MAX_INT_INFO_SIZE       (8 + 0x164)\n\n#if (LOSCFG_BASE_IPC_QUEUE == YES)\n#define MAX_QUEUE_INFO_SIZE     (8 + sizeof(QUEUE_INFO_S) * LOSCFG_BASE_IPC_QUEUE_LIMIT)\n#else\n#define MAX_QUEUE_INFO_SIZE     (0)\n#endif\n\n#if (LOSCFG_BASE_CORE_EXC_TSK_SWITCH == YES)\n#define MAX_SWITCH_INFO_SIZE    (8 + (sizeof(UINT32) + sizeof(CHAR) * LOS_TASK_NAMELEN) * OS_TASK_SWITCH_INFO_COUNT)\n#else\n#define MAX_SWITCH_INFO_SIZE    (0)\n#endif\n\n#if (LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK == YES)\n#define MAX_MEM_INFO_SIZE       (8 + sizeof(MEM_INFO_S) * OS_SYS_MEM_NUM)\n#else\n#define MAX_MEM_INFO_SIZE       (0)\n#endif\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n#define MAX_EXC_MEM_SIZE ( 4 + MAX_SCENE_INFO_SIZE + MAX_TSK_INFO_SIZE + MAX_QUEUE_INFO_SIZE + MAX_INT_INFO_SIZE + MAX_SWITCH_INFO_SIZE + MAX_MEM_INFO_SIZE + 4)\n#else\n#define MAX_EXC_MEM_SIZE ( 0 )\n#endif\n\nextern VOID osExcRegister(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg);\n#endif\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n#endif"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m3/gcc/los_dispatch_gcc.S",
    "content": "/** ----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/** ----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/****************************************************************************************\n*                                  EXPORT FUNCTIONS\n****************************************************************************************/\n\n    .global  LOS_IntLock\n    .global  LOS_IntUnLock\n    .global  LOS_IntRestore\n    .global  LOS_StartToRun\n    .global  osTaskSchedule\n    .global  PendSV_Handler\n\n/****************************************************************************************\n*                                  EXTERN PARAMETERS\n****************************************************************************************/\n\n    .extern  g_stLosTask\n    .extern  g_pfnTskSwitchHook\n    .extern  g_bTaskScheduled\n\n/****************************************************************************************\n*                                  EQU\n****************************************************************************************/\n\n.equ    OS_NVIC_INT_CTRL,              0xE000ED04  /* Interrupt Control and State Register. */\n.equ    OS_NVIC_PENDSVSET,             0x10000000  /* Value to trigger PendSV exception. */\n\n.equ    OS_NVIC_SYSPRI2,               0xE000ED20  /* System Handler Priority Register 2. */\n.equ    OS_NVIC_PENDSV_SYSTICK_PRI,    0xFFFF0000  /* SysTick + PendSV priority level (lowest). */\n\n.equ    OS_TASK_STATUS_RUNNING,        0x0010      /* Task Status Flag (RUNNING). */\n\n/****************************************************************************************\n*                                  CODE GENERATION DIRECTIVES\n****************************************************************************************/\n\n    .section .text\n    .thumb\n    .syntax unified\n    .arch armv7-m\n\n/****************************************************************************************\n* Function:\n*        VOID LOS_StartToRun(VOID);\n* Description:\n*        Start the first task, which is the highest priority task in the priority queue.\n*        Other tasks are started by task scheduling.\n****************************************************************************************/\n    .type LOS_StartToRun, %function\nLOS_StartToRun:\n    CPSID   I\n\n    /**\n     * Set PendSV and SysTick prority to the lowest.\n     * read ---> modify ---> write-back.\n     */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORR     R1, R1, R2\n    STR     R1, [R0]\n\n    /**\n     * Set g_bTaskScheduled = 1.\n     */\n    LDR     R0, =g_bTaskScheduled\n    MOV     R1, #1\n    STR     R1, [R0]\n\n    /**\n     * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n     */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    /**\n     * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n     */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOV     R3, #OS_TASK_STATUS_RUNNING\n    ORR     R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    /**\n     * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n     * Return by setting the CONTROL register.\n     *\n     * The initial stack of the current running task is as follows:\n     *\n     *                 POP: Restore the context of the current running task ===>|\n     *                                                             High addr--->|\n     *                                                   Bottom of the stack--->|\n     * ----------+-----------------------+--------------------------------------+\n     *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n     * ----------+-----------------------+--------------------------------------+\n     *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n     *           |<---      skip     --->|<---        copy to R0-R7         --->|\n     *                                                            R12 to PSP--->|\n     *                                    Stack pointer after LOS_StartToRun--->|\n     */\n    LDR     R12, [R1]\n    ADD     R12, R12, #36          /* skip R4-R11, PRIMASK. */\n    LDMFD   R12!, {R0-R7}\n\n    /**\n     * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n     */\n    MSR     PSP, R12\n\n    /**\n     * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n     */\n    MOV     R12, #2\n    MSR     CONTROL, R12\n\n    /**\n     * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n     */\n    MOV     LR, R5\n    CPSIE   I\n\n    /**\n     * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n     * of the main function will be destroyed and will never be returned.\n     */\n    BX      R6\n\n/****************************************************************************************\n* Function:\n*        UINTPTR LOS_IntLock(VOID);\n* Description:\n*        Disable all interrupts except Reset,NMI and HardFault.\n*        The value of currnet interruption state will be returned to the caller to save.\n*\n* Function:\n*        VOID LOS_IntRestore(UINTPTR uvIntSave);\n* Description:\n*        Restore the locked interruption of LOS_IntLock.\n*        The caller must pass in the value of interruption state previously saved.\n****************************************************************************************/\n    .type LOS_IntLock, %function\nLOS_IntLock:\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\n    .type LOS_IntUnLock, %function\nLOS_IntUnLock:\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\n    .type LOS_IntRestore, %function\nLOS_IntRestore:\n    MSR     PRIMASK, R0\n    BX      LR\n\n/****************************************************************************************\n* Function:\n*        VOID osTaskSchedule(VOID);\n* Description:\n*        Start the task swtich process by software trigger PendSV interrupt.\n****************************************************************************************/\n    .type osTaskSchedule, %function\nosTaskSchedule:\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n/****************************************************************************************\n* Function:\n*        VOID PendSV_Handler(VOID);\n* Description:\n*        PendSV interrupt handler, switch the context of the task.\n*        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n*               to its own stack.\n*        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n*                from its own stack.\n****************************************************************************************/\n    .type PendSV_Handler, %function\nPendSV_Handler:\n    /**\n     * R12: Save the interruption state of the current running task.\n     * Disable all interrupts except Reset,NMI and HardFault\n     */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    /**\n     * Call task switch hook.\n     */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CBZ     R2, TaskSwitch\n    PUSH    {R12, LR}\n    BLX     R2\n    POP     {R12, LR}\n\nTaskSwitch:\n    /**\n     * R0 = now stack pointer of the current running task.\n     */\n    MRS     R0, PSP\n\n    /**\n     * Save the stack frame(R4-R11) of the current running task.\n     * R12 save the PRIMASK value of the current running task.\n     * NOTE: Before entering the exception handler function, these registers\n     *       (xPSR,PC,LR,R12,R3-R0) have been automatically\n     *       saved by the CPU in the stack of the current running task.\n     *\n     * The stack of the current running task is as follows:\n     *\n     *           |<=== PUSH: Save the context of the current running task\n     *           |                                                      High addr--->|\n     * ----------+-----------------------+--------------------------------------+-----\n     *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n     * ----------+-----------------------+--------------------------------------+-----\n     *                               Stack pointer before entering exception--->|\n     *                                   |<---        cpu auto saved        --->|\n     *                                   |<---PSP to R0\n     *           |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n     */\n    STMFD   R0!, {R4-R12}          /* save the core registers and PRIMASK. */\n\n    /**\n     * R5,R8.\n     */\n    LDR     R5, =g_stLosTask\n    MOV     R8, #OS_TASK_STATUS_RUNNING\n\n    /**\n     * Save the stack pointer of the current running task to TCB.\n     * (g_stLosTask.pstRunTask->pStackPointer = R0)\n     */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    /**\n     * Clear the RUNNING state of the current running task.\n     * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n     */\n    LDRH    R7, [R6, #4]\n    BIC     R7, R7, R8\n    STRH    R7, [R6, #4]\n\n    /**\n     * Switch the current running task to the next running task.\n     * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n     */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    /**\n     * Set the RUNNING state of the next running task.\n     * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n     */\n    LDRH    R7, [R0, #4]\n    ORR     R7, R7, R8\n    STRH    R7, [R0, #4]\n\n    /**\n     * Restore the stack pointer of the next running task from TCB.\n     * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n     */\n    LDR     R1, [R0]\n\n    /**\n     * Restore the stack frame(R4-R11) of the next running task.\n     * R12 restore the PRIMASK value of the next running task.\n     * NOTE: After exiting the exception handler function, these registers\n     *       (PC,xPSR,R0-R3,R12,LR) will be automatically\n     *       restored by the CPU from the stack of the next running task.\n     *\n     * 1. The stack of the next running task is as follows:\n     *\n     *                    POP: Restore the context of the next running task ===>|\n     *                                                                  High addr--->|\n     * ----------+-----------------------+--------------------------------------+-----\n     *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n     * ----------+-----------------------+--------------------------------------+-----\n     *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n     *                      R1 to PSP--->|\n     *                                   |<---      cpu auto restoring      --->|\n     *                                 Stack pointer after exiting exception--->|\n     *\n     * 2. If the next running task is run for the first time, the stack is as follows:\n     *\n     *                    POP: Restore the context of the next running task ===>|\n     *                                                             High addr--->|\n     *                                                   Bottom of the stack--->|\n     * ----------+-----------------------+--------------------------------------+\n     *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n     * ----------+-----------------------+--------------------------------------+\n     *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n     *                      R1 to PSP--->|\n     *                                   |<---      cpu auto restoring      --->|\n     *                                 Stack pointer after exiting exception--->|\n     */\n    LDMFD   R1!, {R4-R12}          /* restore the core registers and PRIMASK. */\n\n    /**\n     * Set the stack pointer of the next running task to PSP.\n     */\n    MSR     PSP, R1\n\n    /**\n     * Restore the interruption state of the next running task.\n     */\n    MSR     PRIMASK, R12\n    BX      LR\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m3/gcc/los_hw_exc_gcc.S",
    "content": "/*----------------------------------------------------------------------------\n  Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n  All rights reserved.\n  Redistribution and use in source and binary forms, with or without modification,\n  are permitted provided that the following conditions are met:\n  1. Redistributions of source code must retain the above copyright notice, this list of\n  conditions and the following disclaimer.\n  2. Redistributions in binary form must reproduce the above copyright notice, this list\n  of conditions and the following disclaimer in the documentation and/or other materials\n  provided with the distribution.\n  3. Neither the name of the copyright holder nor the names of its contributors may be used\n  to endorse or promote products derived from this software without specific prior written\n  permission.\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n  EXEMPLARY, OR CONSENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR PROFITS\n  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n----------------------------------------------------------------------------\n  Notice of Export Control Law\n  ===============================================\n  Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n  include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n  Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n  applicable export control laws and regulations.\n ---------------------------------------------------------------------------*/\n/*****************************************************************************************\n                                  CODE GENERATION DIRECTIVES\n*****************************************************************************************/\n\n    .syntax unified\n    .arch armv7e-m\n    .thumb\n    .section .text\n\n/*****************************************************************************************\n                                  EXPORT FUNCTIONS\n*****************************************************************************************/\n\n    .global  NMI_Handler\n    .global  HardFault_Handler\n    .global  MemManage_Handler\n    .global  BusFault_Handler\n    .global  UsageFault_Handler\n    .global  SVC_Handler\n    .global  UART4_IRQHandler\n\n/*****************************************************************************************\n                                  EXTERN PARAMETERS\n*****************************************************************************************/\n\n    .extern osExcHandleEntry\n    .extern g_uwExcTbl\n    .extern g_bTaskScheduled\n\n/****************************************************************************************\n\n*****************************************************************************************/\n\n.equ OS_EXC_CAUSE_NMI,               18\n.equ OS_EXC_CAUSE_HARDFAULT,         19\n.equ OS_EXC_CAUSE_MEMFAULT,          20\n.equ OS_EXC_CAUSE_BUSFAULT,          21\n.equ OS_EXC_CAUSE_USAGEFAULT,        22\n.equ OS_EXC_CAUSE_SVC,               23\n\n.equ HF_DEBUGEVT,                    24\n.equ HF_VECTBL,                      25\n\n.equ FLAG_ADDR_VALID,                0x10000        /* bit 16 */\n.equ FLAG_HWI_ACTIVE,                0x20000        /* bit 17 */\n.equ FLAG_NO_FLOAT,                  0x10000000     /* bit 28 */\n\n.equ OS_NVIC_CFSR,                   0xE000ED28     /* include BusFault/MemFault/UsageFault State Regeister */\n.equ OS_NVIC_HFSR,                   0xE000ED2C     /* HardFault State Regeister */\n.equ OS_NVIC_BFAR,                   0xE000ED38\n.equ OS_NVIC_MMFAR,                  0xE000ED34\n.equ OS_NVIC_ACT_BASE,               0xE000E300\n.equ OS_NVIC_SHCSRS,                 0xE000ED24\n.equ OS_NVIC_SHCSR_MASK,             0xC00          /* SYSTICKACT and PENDSVACT */\n\n\n/****************************************************************************************\n Function:\n        VOID NMI_Handler(VOID)\n Description:\n        NMI Handler.\n*****************************************************************************************/\n\t.type NMI_Handler, %function\nNMI_Handler:\n    /*\n     * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +------------------------------------------------------+------------------------+\n     * |                          31-8                        |          7-0           |\n     * +------------------------------------------------------+------------------------+\n     * |                          ---                         |    OS_EXC_CAUSE_NMI    |\n     * +------------------------------------------------------+------------------------+\n     * < R1 >: invalid\n     */\n    MOV  R0, #OS_EXC_CAUSE_NMI\n    MOV  R1, #0\n    B  osExcDispatch\n\n/****************************************************************************************\n Function:\n        VOID HardFault_Handler(VOID)\n Description:\n        HardFault Handler.\n****************************************************************************************/\n\t.type HardFault_Handler, %function\nHardFault_Handler:\n    /**\n     * Check HardFault state register.\n     *\n     * HFSR:\n     * +----------+--------+--------+--------+-------+\n     * |    31    |   30   | 29 - 2 |    1   |   0   |\n     * +----------+--------+--------+--------+-------+\n     * | DEBUGEVT | FORCED |   --   | VECTBL |   --  |\n     * +----------+--------+--------+--------+-------+\n     */\n    MOV  R0, #OS_EXC_CAUSE_HARDFAULT\n    LDR  R2, =OS_NVIC_HFSR\n    LDR  R2, [R2]\n\n    /**\n     * Check whether HardFault are triggered by debugging events.\n     * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +----------------------------------------+-------------+------------------------+\n     * |                 31-16                  |    15-8     |          7-0           |\n     * +----------------------------------------+-------------+------------------------+\n     * |                  ---                   | HF_DEBUGEVT | OS_EXC_CAUSE_HARDFAULT |\n     * +----------------------------------------+-------------+------------------------+\n     * < R1 >: invalid\n     */\n    MOV  R1, #HF_DEBUGEVT\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x80000000\n    BNE  osExcDispatch\n\n    /**\n     * Check whether HardFault is caused by the failure of the fetch vector.\n     * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +----------------------------------------+-------------+------------------------+\n     * |                 31-16                  |    15-8     |          7-0           |\n     * +----------------------------------------+-------------+------------------------+\n     * |                  ---                   |  HF_VECTBL  | OS_EXC_CAUSE_HARDFAULT |\n     * +----------------------------------------+-------------+------------------------+\n     * < R1 >: invalid\n     */\n    AND  R0, R0, #0x000000FF\n    MOV  R1, #HF_VECTBL\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x00000002\n    BNE  osExcDispatch\n\n    /**\n     * If it`s not DEBUGEVT and VECTBL, that is FORCED, then read the CFSR register to\n     * check BusFault, MemFault and UsageFault.\n     * R0: OS_EXC_CAUSE_HARDFAULT\n     *\n     * CFSR:\n     * +----------------+--------+--------+\n     * |      31-16     |  15-8  |  7-0   |\n     * +----------------+--------+--------+\n     * |      UFSR      |  BFSR  |  MFSR  |\n     * +----------------+--------+--------+\n     */\n    AND  R0, R0, #0x000000FF\n\n    LDR  R2, =OS_NVIC_CFSR\n    LDR  R2, [R2]\n\n    TST  R2, #0x8000                    /* BFSR->BFARVALID */\n    BNE  _HFBusFault                    /* BusFault */\n\n    TST  R2, #0x80                      /* MFSR->MMARVALID */\n    BNE  _HFMemFault                    /* MemFault */\n\n    /**\n     * BFARVALID and MMARVALID flag both invalid.\n     * R12: 0 --- The error address is invalid.\n     */\n    MOV  R12, #0\n    B    osHFExcCommonBMU\n\n    /**\n     * BFARVALID flag valid, read BFAR register.\n     * R1 : BFAR value --- The address value of a bus error.\n     * R12: The error address is valid.\n     */\n_HFBusFault:\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n    B    osHFExcCommonBMU\n\n    /**\n     * MMARVALID flag valid, read MMFAR register.\n     * R1 : MMFAR value --- The address value of memory management error.\n     * R12: The error address is valid.\n     */\n_HFMemFault:\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n\n    /**\n     * osHFExcCommonBMU: --- Get specific error status from table g_uwExcTbl, stored in R0.\n     * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +-------------------+-----------------+------------------+------------------------+\n     * |       31-17       |        16       |        15-8      |          7-0           |\n     * +-------------------+-----------------+------------------+------------------------+\n     * |        ---        | FLAG_ADDR_VALID | Error state code | OS_EXC_CAUSE_HARDFAULT |\n     * |                   |        or       |       in         |                        |\n     * |                   |   0(invalid)    | table g_uwExcTbl |                        |\n     * +-------------------+-----------------+------------------+------------------------+\n     * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n     *         else invalid.\n     */\nosHFExcCommonBMU:\n    CLZ  R2, R2\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R2\n    LDRB R2, [R3]\n    ORR  R0, R0, R2, LSL #0x8\n    ORR  R0, R0, R12\n    B    osExcDispatch\n\n\n\n/****************************************************************************************\n Function:\n        VOID BusFault_Handler(VOID)\n Description:\n        BusFault Handler.\n****************************************************************************************/\n    .type BusFault_Handler, %function\nBusFault_Handler:\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_BUSFAULT\n\n    TST  R0, #0x8000                    /* BFSR->BFARVALID */\n    BEQ  _ExcBusNoADDR\n\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]                       /* R1:  The value of BFAR */\n    MOV  R12, #FLAG_ADDR_VALID          /* R12: BusFault addr valid */\n    AND  R0, R0, #0x3F00                /* R0:  Reserved the b13-b8 of the BFSR */\n    B    osExcCommonBMU\n\n_ExcBusNoADDR:\n    MOV  R12, #0                        /* R12: BusFault addr invalid */\n    AND  R0, R0, #0x3F00                /* R0:  Reserved the b13-b8 of the BFSR */\n    B    osExcCommonBMU\n\n/****************************************************************************************\n Function:\n        VOID MemManage_Handler(VOID)\n Description:\n        MemManage Handler.\n****************************************************************************************/\n\t.type MemManage_Handler, %function\nMemManage_Handler:\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_MEMFAULT\n\n    TST  R0, #0x80                      /* MFSR->MMARVALID\n    BEQ  _ExcMemNoADDR\n\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]                       /* R1:  The value of MMFAR */\n    MOV  R12, #FLAG_ADDR_VALID          /* R12: MemFault addr valid */\n    AND  R0, R0, #0x3B                  /* R0:  Reserved the b5-b0 of the MFSR */\n    B    osExcCommonBMU\n\n_ExcMemNoADDR:\n    MOV  R12, #0                        /* R12: MemFault addr invalid */\n    AND  R0, R0, #0x3B                  /* R0:  Reserved the b5-b0 of the MFSR */\n    B    osExcCommonBMU\n\n/****************************************************************************************\n\n Function:\n        VOID UsageFault_Handler(VOID)\n Description:\n        UsageFault Handler.\n****************************************************************************************/\n    .type UsageFault_Handler, %function\nUsageFault_Handler:\n\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_USAGEFAULT\n\n    LDR  R1, =#0x030F\n    LSL  R1, R1, #16\n    AND  R0, R0, R1                     /* R0:  reserved UFSR */\n    MOV  R12, #0                        /* R12: Fault addr invalid */\n\n\n\n    /**\n     * osExcCommonBMU: BusFault_Handler,MemManage_Handler and UsageFault_Handler share.\n     * Get specific error status from table g_uwExcTbl, stored in R0.\n     * Before executing osExcDispatch, the value of R0 is as follows.\n     * < R0 >:\n     * +-------------------+-----------------+------------------+------------------------+\n     * |       31-17       |        16       |        15-8      |          7-0           |\n     * +-------------------+-----------------+------------------+------------------------+\n     * |        ---        | FLAG_ADDR_VALID | Error state code |OS_EXC_CAUSE_BUSFAULT or|\n     * |                   |        or       |       in         |OS_EXC_CAUSE_MEMFAULT or|\n     * |                   |   0(invalid)    | table g_uwExcTbl |OS_EXC_CAUSE_USAGEFAULT |\n     * +-------------------+-----------------+------------------+------------------------+\n     * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n     *         else invalid.\n     */\nosExcCommonBMU:\n    CLZ  R0, R0\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R0\n    LDRB R0, [R3]\n    LSL  R0, R0, #0x8\n    ORR  R0, R0, R2\n    ORR  R0, R0, R12\n\n\tMRS R2,PSP\t\t/* PSP-->>37D8 */\n\n/*  ****************************************************************************************\n     osExcDispatch: NMI_Handler, HardFault_Handler, SVC_Handler, BusFault_Handler, MemManage_Handler,\n                      UsageFault_Handler sharing.\n    ****************************************************************************************/\n\n    /**\n     * When executing osExcDispatch, R0, R1 will be used.\n     * The possible values of R0 and R1 are as follows.\n     *\n     * < R0 >:\n     * +----------------+-----------------+---------------------+------------------------+\n     * |     31-17      |        16       |         15-8        |          7-0           |\n     * +----------------+-----------------+---------------------+------------------------+\n     * |                | FLAG_ADDR_VALID | Error state code in | OS_EXC_CAUSE_HARDFAULT |\n     * |      ---       |       or        | table g_uwExcTbl    |or OS_EXC_CAUSE_MEMFAULT|\n     * |                |   0(invalid)    | or      HF_DEBUGEVT |or OS_EXC_CAUSE_BUSFAULT|\n     * |                |                 | or      HF_VECTBL   |or OS_EXC_CAUSE_NMI  or |\n     * |                |                 |                     | OS_EXC_CAUSE_USAGEFAULT|\n     * +----------------+-----------------+---------------------+------------------------+\n     * b17: FLAG_HWI_ACTIVE\n     * b28: FLAG_NO_FLOAT\n     * NOTE: b17 and b28 will be set later.\n     *\n     * < R1 >:\n     * If the bit16 of R0 is 1, then R1 is the value of BFAR or MMFAR, otherwise the\n     * value in R1 is invalid.\n     *\n     */\nosExcDispatch:\n    LDR   R2, =OS_NVIC_ACT_BASE\n    MOV   R12, #8                       /* #8: externel interrupt active check loop counter(#0 - #239) */\n\n\n\n_hwiActiveCheck:\n    LDR   R3, [R2]                      /* R3 store the value of externel interrupt active status */\n    CMP   R3, #0\n    BEQ   _hwiActiveCheckNext\n\n    /**\n     * Exception occured in external interrupt.\n     */\n    ORR   R0, R0, #FLAG_HWI_ACTIVE      /* R0[b17] = 1, externel interrupt active valid    &&&&&&&&&& */\n    RBIT  R2, R3                        /* bit reversal */\n    CLZ   R2, R2\n    RSB   R12, R12, #8                  /* R12 = 8 - R12 */\n    ADD   R2, R2, R12, LSL #5           /* R2: external interrupt number as uwPid */\n\n    /**\n     * Interrupts and initialization phase always use MSP.\n     */\n_ExcInMSP:\n    TST   LR, #0x10                     /* EXC_RETURN[b4] --- FPU(0) or without FPU(1) */\n    BNE   _NoFloatInMsp\n\n    /**\n     * Before executing instruction 'B _handleEntry', MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *                                 | R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR |\n     * +--------------------------------------------------------------------------------+---------\n     *                          R13--->|          Initial R13--->|<---      #32     --->|<---SAVED_SP\n     *                                                           |   (CPU auto saved)   |\n     *\n     */\n_NoFloatInMsp:\n    ADD   R3, R13, #32                  /* #32: skip [R0-R3,R12,LR,PC,xPSR] */\n    PUSH  {R3}                          /* push [SAVED_SP]: MSP+32 = Stack pointer in MSP before entering the exception */\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                      /* push R4-R11,PRIMASK to MSP */\n\n\tORR   R0, R0, #FLAG_NO_FLOAT        /* R0[b28] = 1, no FPU    &&&&&&&&&& */\n    B     _handleEntry\n\n_hwiActiveCheckNext:\n    ADD   R2, R2, #4                    /* next NVIC ACT ADDR */\n    SUBS  R12, R12, #1\n    BNE   _hwiActiveCheck\n\n    /**\n     * Not in externel interrupt, check whether it is SysTick or PendSV.\n     */\n\n    LDR   R2, =OS_NVIC_SHCSRS\n    LDRH  R2,[R2]\n    LDR   R3,=OS_NVIC_SHCSR_MASK\n    AND   R2, R2, R3\n    CMP   R2, #0\n    BNE   _ExcInMSP                     /* SysTick or PendSV active */\n\n    /**\n     * Check whether an exception occurs during the initialization phase.\n     * If g_bTaskScheduled == 0, it is in the initialization phase.\n     */\n    LDR  R2, =g_bTaskScheduled\n    LDR  R2, [R2]\n    TST  R2, #1\n    BEQ  _ExcInMSP                      /* initialization phase use MSP */\n    /**\n     * Before executing _handleEntry, MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *                                  | R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR |\n     * +--------------------------------------------------------------------------------+---------\n     *                           R13--->|                        |<---      #32     --->|<---Initial R13\n     *                                                           |  (copied from PSP)   |\n     *                                                           |<---R2(no use)\n     *\n     * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR.\n     */\n_NoFloatInPsp:\n    MOV   R2, R13\n    SUB   R13, #32                      /* #32: MSP reserved, used to store stack frame in PSP */\n\n    MRS   R3, PSP\n    ADD   R12, R3, #32                  /* PSP+32 = Stack pointer of the task before entering the exception */\n\n\tPUSH  {R12}                         /* push task SP to MSP */\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                      /* push R4-R11,PRIMASK of the current running task to MSP */\n\n    /* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3, {R4-R11}                  /* restore stack frame of PSP to R4-R11 */\n    STMFD R2!, {R4-R11}                 /* save stack frame to MSP */\n\n    ORR   R0, R0, #FLAG_NO_FLOAT        /* R0[b28] = 1, no FPU    &&&&&&&&&& */\n\n    /**\n     * _handleEntry: Call osExcHandleEntry\n     * param1: R0 --- b28:    FLAG_NO_FLOAT.\n     *                b17:    FLAG_HWI_ACTIVE.\n     *                b16:    FLAG_ADDR_VALID.\n     *                b15-b8: Error state code in table g_uwExcTbl or HF_DEBUGEVT or HF_VECTBL.\n     *                b7-b0:  OS_EXC_CAUSE_HARDFAULT or OS_EXC_CAUSE_NMI or OS_EXC_CAUSE_MEMFAULT\n     *                        or OS_EXC_CAUSE_BUSFAULT or OS_EXC_CAUSE_USAGEFAULT.\n     * param2: R1 --- The value of BFAR or MMFAR if R0[b16] = 1, otherwise invalid.\n     * param3: R2 --- external interrupt number(0-239) if R0[b17] = 1, otherwise invalid.\n     * param4: R3 --- Point to the top of the stack(R4 or S16) that the exception stack frame in MSP.\n     */\n_handleEntry:\n    MOV R3, R13\n    CPSID I\n    CPSID F\n    B  osExcHandleEntry\n\n    NOP\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m3/iar/los_dispatch_iar.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  LOS_IntLock\n    EXPORT  LOS_IntUnLock\n    EXPORT  LOS_IntRestore\n    EXPORT  LOS_StartToRun\n    EXPORT  osTaskSchedule\n    EXPORT  PendSV_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT  g_stLosTask\n    IMPORT  g_pfnTskSwitchHook\n    IMPORT  g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_NVIC_INT_CTRL              EQU    0xE000ED04  ; Interrupt Control and State Register.\nOS_NVIC_PENDSVSET             EQU    0x10000000  ; Value to trigger PendSV exception.\n\nOS_NVIC_SYSPRI2               EQU    0xE000ED20  ; System Handler Priority Register 2.\nOS_NVIC_PENDSV_SYSTICK_PRI    EQU    0xFFFF0000  ; SysTick + PendSV priority level (lowest).\n\nOS_TASK_STATUS_RUNNING        EQU    0x0010      ; Task Status Flag (RUNNING).\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    SECTION    .text:CODE(2)\n    THUMB\n    REQUIRE8\n    PRESERVE8\n\n;****************************************************************************************\n; Function:\n;        VOID LOS_StartToRun(VOID);\n; Description:\n;        Start the first task, which is the highest priority task in the priority queue.\n;        Other tasks are started by task scheduling.\n;****************************************************************************************\nLOS_StartToRun\n    CPSID   I\n\n    ;/**\n    ; * Set PendSV and SysTick prority to the lowest.\n    ; * read ---> modify ---> write-back.\n    ; */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORR     R1, R1, R2\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_bTaskScheduled = 1.\n    ; */\n    LDR     R0, =g_bTaskScheduled\n    MOV     R1, #1\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n    ; */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n    ; */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOV     R3, #OS_TASK_STATUS_RUNNING\n    ORR     R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    ;/**\n    ; * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n    ; * Return by setting the CONTROL register.\n    ; *\n    ; * The initial stack of the current running task is as follows:\n    ; *\n    ; *                 POP: Restore the context of the current running task ===>|\n    ; *                                                             High addr--->|\n    ; *                                                   Bottom of the stack--->|\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n    ; *           |<---      skip     --->|<---        copy to R0-R7         --->|\n    ; *                                                            R12 to PSP--->|\n    ; *                                    Stack pointer after LOS_StartToRun--->|\n    ; */\n    LDR     R12, [R1]\n    ADD     R12, R12, #36          ; skip R4-R11, PRIMASK.\n    LDMFD   R12!, {R0-R7}\n\n    ;/**\n    ; * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n    ; */\n    MSR     PSP, R12\n\n    ;/**\n    ; * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n    ; */\n    MOV     R12, #2\n    MSR     CONTROL, R12\n\n    ;/**\n    ; * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n    ; */\n    MOV     LR, R5\n    CPSIE   I\n\n    ;/**\n    ; * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n    ; * of the main function will be destroyed and will never be returned.\n    ; */\n    BX      R6\n\n;****************************************************************************************\n; Function:\n;        UINTPTR LOS_IntLock(VOID);\n; Description:\n;        Disable all interrupts except Reset,NMI and HardFault.\n;        The value of currnet interruption state will be returned to the caller to save.\n;\n; Function:\n;        VOID LOS_IntRestore(UINTPTR uvIntSave);\n; Description:\n;        Restore the locked interruption of LOS_IntLock.\n;        The caller must pass in the value of interruption state previously saved.\n;****************************************************************************************\nLOS_IntLock\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\nLOS_IntUnLock\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\nLOS_IntRestore\n    MSR     PRIMASK, R0\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID osTaskSchedule(VOID);\n; Description:\n;        Start the task swtich process by software trigger PendSV interrupt.\n;****************************************************************************************\nosTaskSchedule\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID PendSV_Handler(VOID);\n; Description:\n;        PendSV interrupt handler, switch the context of the task.\n;        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n;               to its own stack.\n;        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n;                from its own stack.\n;****************************************************************************************\nPendSV_Handler\n    ;/**\n    ; * R12: Save the interruption state of the current running task.\n    ; * Disable all interrupts except Reset,NMI and HardFault\n    ; */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    ;/**\n    ; * Call task switch hook.\n    ; */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CBZ     R2, TaskSwitch\n    PUSH    {R12, LR}\n    BLX     R2\n    POP     {R12, LR}\n\nTaskSwitch\n    ;/**\n    ; * R0 = now stack pointer of the current running task.\n    ; */\n    MRS     R0, PSP\n\n    ;/**\n    ; * Save the stack frame(R4-R11) of the current running task.\n    ; * R12 save the PRIMASK value of the current running task.\n    ; * NOTE: Before entering the exception handler function, these registers\n    ; *       (xPSR,PC,LR,R12,R3-R0) have been automatically\n    ; *       saved by the CPU in the stack of the current running task.\n    ; *\n    ; * The stack of the current running task is as follows:\n    ; *\n    ; *           |<=== PUSH: Save the context of the current running task\n    ; *           |                                                      High addr--->|\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *                               Stack pointer before entering exception--->|\n    ; *                                   |<---        cpu auto saved        --->|\n    ; *                                   |<---PSP to R0\n    ; *           |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n    ; */\n    STMFD   R0!, {R4-R12}          ; save the core registers and PRIMASK.\n\n    ;/**\n    ; * R5,R8.\n    ; */\n    LDR     R5, =g_stLosTask\n    MOV     R8, #OS_TASK_STATUS_RUNNING\n\n    ;/**\n    ; * Save the stack pointer of the current running task to TCB.\n    ; * (g_stLosTask.pstRunTask->pStackPointer = R0)\n    ; */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    ;/**\n    ; * Clear the RUNNING state of the current running task.\n    ; * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R6, #4]\n    BIC     R7, R7, R8\n    STRH    R7, [R6, #4]\n\n    ;/**\n    ; * Switch the current running task to the next running task.\n    ; * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n    ; */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    ;/**\n    ; * Set the RUNNING state of the next running task.\n    ; * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R0, #4]\n    ORR     R7, R7, R8\n    STRH    R7, [R0, #4]\n\n    ;/**\n    ; * Restore the stack pointer of the next running task from TCB.\n    ; * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n    ; */\n    LDR     R1, [R0]\n\n    ;/**\n    ; * Restore the stack frame(R4-R11) of the next running task.\n    ; * R12 restore the PRIMASK value of the next running task.\n    ; * NOTE: After exiting the exception handler function, these registers\n    ; *       (PC,xPSR,R0-R3,R12,LR) will be automatically\n    ; *       restored by the CPU from the stack of the next running task.\n    ; *\n    ; * 1. The stack of the next running task is as follows:\n    ; *\n    ; *                    POP: Restore the context of the next running task ===>|\n    ; *                                                                  High addr--->|\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                      R1 to PSP--->|\n    ; *                                   |<---      cpu auto restoring      --->|\n    ; *                                 Stack pointer after exiting exception--->|\n    ; *\n    ; * 2. If the next running task is run for the first time, the stack is as follows:\n    ; *\n    ; *                    POP: Restore the context of the next running task ===>|\n    ; *                                                             High addr--->|\n    ; *                                                   Bottom of the stack--->|\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                      R1 to PSP--->|\n    ; *                                   |<---      cpu auto restoring      --->|\n    ; *                                 Stack pointer after exiting exception--->|\n    ; */\n    LDMFD   R1!, {R4-R12}          ; restore the core registers and PRIMASK.\n\n    ;/**\n    ; * Set the stack pointer of the next running task to PSP.\n    ; */\n    MSR     PSP, R1\n\n    ;/**\n    ; * Restore the interruption state of the next running task.\n    ; */\n    MSR     PRIMASK, R12\n    BX      LR\n\n    END\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m3/keil/los_dispatch_keil.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  LOS_IntLock\n    EXPORT  LOS_IntUnLock\n    EXPORT  LOS_IntRestore\n    EXPORT  LOS_StartToRun\n    EXPORT  osTaskSchedule\n    EXPORT  PendSV_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT  g_stLosTask\n    IMPORT  g_pfnTskSwitchHook\n    IMPORT  g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_NVIC_INT_CTRL              EQU    0xE000ED04  ; Interrupt Control and State Register.\nOS_NVIC_PENDSVSET             EQU    0x10000000  ; Value to trigger PendSV exception.\n\nOS_NVIC_SYSPRI2               EQU    0xE000ED20  ; System Handler Priority Register 2.\nOS_NVIC_PENDSV_SYSTICK_PRI    EQU    0xFFFF0000  ; SysTick + PendSV priority level (lowest).\n\nOS_TASK_STATUS_RUNNING        EQU    0x0010      ; Task Status Flag (RUNNING).\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    AREA    |.text|, CODE, READONLY\n    THUMB\n    REQUIRE8\n    PRESERVE8\n\n;****************************************************************************************\n; Function:\n;        VOID LOS_StartToRun(VOID);\n; Description:\n;        Start the first task, which is the highest priority task in the priority queue.\n;        Other tasks are started by task scheduling.\n;****************************************************************************************\nLOS_StartToRun\n    CPSID   I\n\n    ;/**\n    ; * Set PendSV and SysTick prority to the lowest.\n    ; * read ---> modify ---> write-back.\n    ; */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORR     R1, R1, R2\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_bTaskScheduled = 1.\n    ; */\n    LDR     R0, =g_bTaskScheduled\n    MOV     R1, #1\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n    ; */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n    ; */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOV     R3, #OS_TASK_STATUS_RUNNING\n    ORR     R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    ;/**\n    ; * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n    ; * Return by setting the CONTROL register.\n    ; *\n    ; * The initial stack of the current running task is as follows:\n    ; *\n    ; *                 POP: Restore the context of the current running task ===>|\n    ; *                                                             High addr--->|\n    ; *                                                   Bottom of the stack--->|\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n    ; *           |<---      skip     --->|<---        copy to R0-R7         --->|\n    ; *                                                            R12 to PSP--->|\n    ; *                                    Stack pointer after LOS_StartToRun--->|\n    ; */\n    LDR     R12, [R1]\n    ADD     R12, R12, #36          ; skip R4-R11, PRIMASK.\n    LDMFD   R12!, {R0-R7}\n\n    ;/**\n    ; * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n    ; */\n    MSR     PSP, R12\n\n    ;/**\n    ; * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n    ; */\n    MOV     R12, #2\n    MSR     CONTROL, R12\n\n    ;/**\n    ; * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n    ; */\n    MOV     LR, R5\n    CPSIE   I\n\n    ;/**\n    ; * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n    ; * of the main function will be destroyed and will never be returned.\n    ; */\n    BX      R6\n\n;****************************************************************************************\n; Function:\n;        UINTPTR LOS_IntLock(VOID);\n; Description:\n;        Disable all interrupts except Reset,NMI and HardFault.\n;        The value of currnet interruption state will be returned to the caller to save.\n;\n; Function:\n;        VOID LOS_IntRestore(UINTPTR uvIntSave);\n; Description:\n;        Restore the locked interruption of LOS_IntLock.\n;        The caller must pass in the value of interruption state previously saved.\n;****************************************************************************************\nLOS_IntLock\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\nLOS_IntUnLock\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\nLOS_IntRestore\n    MSR     PRIMASK, R0\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID osTaskSchedule(VOID);\n; Description:\n;        Start the task swtich process by software trigger PendSV interrupt.\n;****************************************************************************************\nosTaskSchedule\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID PendSV_Handler(VOID);\n; Description:\n;        PendSV interrupt handler, switch the context of the task.\n;        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n;               to its own stack.\n;        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n;                from its own stack.\n;****************************************************************************************\nPendSV_Handler\n    ;/**\n    ; * R12: Save the interruption state of the current running task.\n    ; * Disable all interrupts except Reset,NMI and HardFault\n    ; */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    ;/**\n    ; * Call task switch hook.\n    ; */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CBZ     R2, TaskSwitch\n    PUSH    {R12, LR}\n    BLX     R2\n    POP     {R12, LR}\n\nTaskSwitch\n    ;/**\n    ; * R0 = now stack pointer of the current running task.\n    ; */\n    MRS     R0, PSP\n\n    ;/**\n    ; * Save the stack frame(R4-R11) of the current running task.\n    ; * R12 save the PRIMASK value of the current running task.\n    ; * NOTE: Before entering the exception handler function, these registers\n    ; *       (xPSR,PC,LR,R12,R3-R0) have been automatically\n    ; *       saved by the CPU in the stack of the current running task.\n    ; *\n    ; * The stack of the current running task is as follows:\n    ; *\n    ; *           |<=== PUSH: Save the context of the current running task\n    ; *           |                                                      High addr--->|\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *                               Stack pointer before entering exception--->|\n    ; *                                   |<---        cpu auto saved        --->|\n    ; *                                   |<---PSP to R0\n    ; *           |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n    ; */\n    STMFD   R0!, {R4-R12}          ; save the core registers and PRIMASK.\n\n    ;/**\n    ; * R5,R8.\n    ; */\n    LDR     R5, =g_stLosTask\n    MOV     R8, #OS_TASK_STATUS_RUNNING\n\n    ;/**\n    ; * Save the stack pointer of the current running task to TCB.\n    ; * (g_stLosTask.pstRunTask->pStackPointer = R0)\n    ; */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    ;/**\n    ; * Clear the RUNNING state of the current running task.\n    ; * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R6, #4]\n    BIC     R7, R7, R8\n    STRH    R7, [R6, #4]\n\n    ;/**\n    ; * Switch the current running task to the next running task.\n    ; * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n    ; */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    ;/**\n    ; * Set the RUNNING state of the next running task.\n    ; * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R0, #4]\n    ORR     R7, R7, R8\n    STRH    R7, [R0, #4]\n\n    ;/**\n    ; * Restore the stack pointer of the next running task from TCB.\n    ; * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n    ; */\n    LDR     R1, [R0]\n\n    ;/**\n    ; * Restore the stack frame(R4-R11) of the next running task.\n    ; * R12 restore the PRIMASK value of the next running task.\n    ; * NOTE: After exiting the exception handler function, these registers\n    ; *       (PC,xPSR,R0-R3,R12,LR) will be automatically\n    ; *       restored by the CPU from the stack of the next running task.\n    ; *\n    ; * 1. The stack of the next running task is as follows:\n    ; *\n    ; *                    POP: Restore the context of the next running task ===>|\n    ; *                                                                  High addr--->|\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+-----\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                      R1 to PSP--->|\n    ; *                                   |<---      cpu auto restoring      --->|\n    ; *                                 Stack pointer after exiting exception--->|\n    ; *\n    ; * 2. If the next running task is run for the first time, the stack is as follows:\n    ; *\n    ; *                    POP: Restore the context of the next running task ===>|\n    ; *                                                             High addr--->|\n    ; *                                                   Bottom of the stack--->|\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |   R4-R11,   PRIMASK   |   R0-R3,   R12,   LR,   PC,   xPSR   |\n    ; * ----------+-----------------------+--------------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                      R1 to PSP--->|\n    ; *                                   |<---      cpu auto restoring      --->|\n    ; *                                 Stack pointer after exiting exception--->|\n    ; */\n    LDMFD   R1!, {R4-R12}          ; restore the core registers and PRIMASK.\n\n    ;/**\n    ; * Set the stack pointer of the next running task to PSP.\n    ; */\n    MSR     PSP, R1\n\n    ;/**\n    ; * Restore the interruption state of the next running task.\n    ; */\n    MSR     PRIMASK, R12\n    BX      LR\n\n    ALIGN\n    END\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m3/keil/los_hw_exc_keil.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    PRESERVE8\n    AREA    |.text|, CODE, READONLY\n    THUMB\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  NMI_Handler\n    EXPORT  HardFault_Handler\n    EXPORT  MemManage_Handler\n    EXPORT  BusFault_Handler\n    EXPORT  UsageFault_Handler\n    EXPORT  SVC_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT osExcHandleEntry\n    IMPORT g_uwExcTbl\n    IMPORT g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_EXC_CAUSE_NMI            EQU   18\nOS_EXC_CAUSE_HARDFAULT      EQU   19\nOS_EXC_CAUSE_MEMFAULT       EQU   20\nOS_EXC_CAUSE_BUSFAULT       EQU   21\nOS_EXC_CAUSE_USAGEFAULT     EQU   22\nOS_EXC_CAUSE_SVC            EQU   23\n\nHF_DEBUGEVT                 EQU   24\nHF_VECTBL                   EQU   25\n\nFLAG_ADDR_VALID             EQU   0x10000       ; bit 16\nFLAG_HWI_ACTIVE             EQU   0x20000       ; bit 17\nFLAG_NO_FLOAT               EQU   0x10000000    ; bit 28\n\nOS_NVIC_CFSR                EQU   0xE000ED28    ; include BusFault/MemFault/UsageFault State Regeister\nOS_NVIC_HFSR                EQU   0xE000ED2C    ; HardFault State Regeister\nOS_NVIC_BFAR                EQU   0xE000ED38\nOS_NVIC_MMFAR               EQU   0xE000ED34\nOS_NVIC_ACT_BASE            EQU   0xE000E300\nOS_NVIC_SHCSRS              EQU   0xE000ED24\nOS_NVIC_SHCSR_MASK          EQU   0xC00         ; SYSTICKACT and PENDSVACT\n\n;****************************************************************************************\n; Function:\n;        VOID NMI_Handler(VOID);\n; Description:\n;        NMI Handler.\n;****************************************************************************************\nNMI_Handler\n    ;/**\n    ; * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +------------------------------------------------------+------------------------+\n    ; * |                          31-8                        |          7-0           |\n    ; * +------------------------------------------------------+------------------------+\n    ; * |                          ---                         |    OS_EXC_CAUSE_NMI    |\n    ; * +------------------------------------------------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    MOV  R0, #OS_EXC_CAUSE_NMI\n    MOV  R1, #0\n    B  osExcDispatch\n\n;****************************************************************************************\n; Function:\n;        VOID HardFault_Handler(VOID);\n; Description:\n;        HardFault Handler.\n;****************************************************************************************\nHardFault_Handler\n    ;/**\n    ; * Check HardFault state register.\n    ; *\n    ; * HFSR:\n    ; * +----------+--------+--------+--------+-------+\n    ; * |    31    |   30   | 29 - 2 |    1   |   0   |\n    ; * +----------+--------+--------+--------+-------+\n    ; * | DEBUGEVT | FORCED |   --   | VECTBL |   --  |\n    ; * +----------+--------+--------+--------+-------+\n    ; */\n    MOV  R0, #OS_EXC_CAUSE_HARDFAULT\n    LDR  R2, =OS_NVIC_HFSR\n    LDR  R2, [R2]\n\n    ;/**\n    ; * Check whether HardFault are triggered by debugging events.\n    ; * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                 31-16                  |    15-8     |          7-0           |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                  ---                   | HF_DEBUGEVT | OS_EXC_CAUSE_HARDFAULT |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    MOV  R1, #HF_DEBUGEVT\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x80000000\n    BNE  osExcDispatch                 ; DEBUGEVT\n\n    ;/**\n    ; * Check whether HardFault is caused by the failure of the fetch vector.\n    ; * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                 31-16                  |    15-8     |          7-0           |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                  ---                   |  HF_VECTBL  | OS_EXC_CAUSE_HARDFAULT |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    AND  R0, R0, #0x000000FF\n    MOV  R1, #HF_VECTBL\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x00000002\n    BNE  osExcDispatch                  ; VECTBL\n\n    ;/**\n    ; * If it`s not DEBUGEVT and VECTBL, that is FORCED, then read the CFSR register to\n    ; * check BusFault, MemFault and UsageFault.\n    ; * R0: OS_EXC_CAUSE_HARDFAULT\n    ; *\n    ; * CFSR:\n    ; * +----------------+--------+--------+\n    ; * |      31-16     |  15-8  |  7-0   |\n    ; * +----------------+--------+--------+\n    ; * |      UFSR      |  BFSR  |  MFSR  |\n    ; * +----------------+--------+--------+\n    ; */\n    AND  R0, R0, #0x000000FF\n\n    LDR  R2, =OS_NVIC_CFSR\n    LDR  R2, [R2]\n\n    TST  R2, #0x8000                   ; BFSR->BFARVALID\n    BNE  _HFBusFault                   ; BusFault\n\n    TST  R2, #0x80                     ; MFSR->MMARVALID\n    BNE  _HFMemFault                   ; MemFault\n\n    ;/**\n    ; * BFARVALID and MMARVALID flag both invalid.\n    ; * R12: 0 --- The error address is invalid.\n    ; */\n    MOV  R12, #0\n    B    osHFExcCommonBMU\n\n    ;/**\n    ; * BFARVALID flag valid, read BFAR register.\n    ; * R1 : BFAR value --- The address value of a bus error.\n    ; * R12: The error address is valid.\n    ; */\n_HFBusFault\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n    B    osHFExcCommonBMU\n\n    ;/**\n    ; * MMARVALID flag valid, read MMFAR register.\n    ; * R1 : MMFAR value --- The address value of memory management error.\n    ; * R12: The error address is valid.\n    ; */\n_HFMemFault\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n\n    ;/**\n    ; * osHFExcCommonBMU: --- Get specific error status from table g_uwExcTbl, stored in R0.\n    ; * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |       31-17       |        16       |        15-8      |          7-0           |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |        ---        | FLAG_ADDR_VALID | Error state code | OS_EXC_CAUSE_HARDFAULT |\n    ; * |                   |        or       |       in         |                        |\n    ; * |                   |   0(invalid)    | table g_uwExcTbl |                        |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n    ; *         else invalid.\n    ; */\nosHFExcCommonBMU\n    CLZ  R2, R2\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R2\n    LDRB R2, [R3]\n    ORR  R0, R0, R2, LSL #0x8\n    ORR  R0, R0, R12\n    B    osExcDispatch\n\n;****************************************************************************************\n; Function:\n;        VOID SVC_Handler(VOID);\n; Description:\n;        SVC Handler.\n;****************************************************************************************\nSVC_Handler\n    TST   LR, #0x4                     ; EXC_RETURN[b2] --- PSP or MSP\n    ITE   EQ\n    MRSEQ R0, MSP\n    MRSNE R0, PSP\n    LDR   R1, [R0, #24]                ; The PC value in the stack frame\n    LDRB  R0, [R1, #-2]                ; R0: The number of SVC (0 - 255)\n    MOV   R1, #0\n    ;B     osExcDispatch\n_SvcLoop\n    B     _SvcLoop\n\n;****************************************************************************************\n; Function:\n;        VOID BusFault_Handler(VOID);\n; Description:\n;        BusFault Handler.\n;****************************************************************************************\nBusFault_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_BUSFAULT\n\n    TST  R0, #0x8000                   ; BFSR->BFARVALID\n    BEQ  _ExcBusNoADDR\n\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]                      ; R1:  The value of BFAR\n    MOV  R12, #FLAG_ADDR_VALID         ; R12: BusFault addr valid\n    AND  R0, R0, #0x3F00               ; R0:  Reserved the b13-b8 of the BFSR\n    B    osExcCommonBMU\n\n_ExcBusNoADDR\n    MOV  R12, #0                       ; R12: BusFault addr invalid\n    AND  R0, R0, #0x3F00               ; R0:  Reserved the b13-b8 of the BFSR\n    B    osExcCommonBMU\n\n;****************************************************************************************\n; Function:\n;        VOID MemManage_Handler(VOID);\n; Description:\n;        MemManage Handler.\n;****************************************************************************************\nMemManage_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_MEMFAULT\n\n    TST  R0, #0x80                     ; MFSR->MMARVALID\n    BEQ  _ExcMemNoADDR\n\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]                      ; R1:  The value of MMFAR\n    MOV  R12, #FLAG_ADDR_VALID         ; R12: MemFault addr valid\n    AND  R0, R0, #0x3B                 ; R0:  Reserved the b5-b0 of the MFSR\n    B    osExcCommonBMU\n\n_ExcMemNoADDR\n    MOV  R12, #0                       ; R12: MemFault addr invalid\n    AND  R0, R0, #0x3B                 ; R0:  Reserved the b5-b0 of the MFSR\n    B    osExcCommonBMU\n\n;****************************************************************************************\n; Function:\n;        VOID UsageFault_Handler(VOID);\n; Description:\n;        UsageFault Handler.\n;****************************************************************************************\nUsageFault_Handler\n\t\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_USAGEFAULT\n\n    MOV  R1, #0x030F\n    LSL  R1, R1, #16\n    AND  R0, R0, R1                    ; R0:  reserved UFSR\n    MOV  R12, #0                       ; R12: Fault addr invalid\n\t\n\n\n    ;/**\n    ; * osExcCommonBMU: BusFault_Handler,MemManage_Handler and UsageFault_Handler share.\n    ; * Get specific error status from table g_uwExcTbl, stored in R0.\n    ; * Before executing osExcDispatch, the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |       31-17       |        16       |        15-8      |          7-0           |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |        ---        | FLAG_ADDR_VALID | Error state code |OS_EXC_CAUSE_BUSFAULT or|\n    ; * |                   |        or       |       in         |OS_EXC_CAUSE_MEMFAULT or|\n    ; * |                   |   0(invalid)    | table g_uwExcTbl |OS_EXC_CAUSE_USAGEFAULT |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n    ; *         else invalid.\n    ; */\nosExcCommonBMU\n    CLZ  R0, R0\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R0\n    LDRB R0, [R3]\n    LSL  R0, R0, #0x8\n    ORR  R0, R0, R2\n    ORR  R0, R0, R12\n\t\n\t;MRS R2,PSP\t\t;PSP-->>37D8\n\n    ;****************************************************************************************\n    ; osExcDispatch: NMI_Handler, HardFault_Handler, SVC_Handler, BusFault_Handler, MemManage_Handler,\n    ;                  UsageFault_Handler sharing.\n    ;****************************************************************************************\n\n    ;/**\n    ; * When executing osExcDispatch, R0, R1 will be used.\n    ; * The possible values of R0 and R1 are as follows.\n    ; *\n    ; * < R0 >:\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * |     31-17      |        16       |         15-8        |          7-0           |\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * |                | FLAG_ADDR_VALID | Error state code in | OS_EXC_CAUSE_HARDFAULT |\n    ; * |      ---       |       or        | table g_uwExcTbl    |or OS_EXC_CAUSE_MEMFAULT|\n    ; * |                |   0(invalid)    | or      HF_DEBUGEVT |or OS_EXC_CAUSE_BUSFAULT|\n    ; * |                |                 | or      HF_VECTBL   |or OS_EXC_CAUSE_NMI  or |\n    ; * |                |                 |                     | OS_EXC_CAUSE_USAGEFAULT|\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * b17: FLAG_HWI_ACTIVE\n    ; * b28: FLAG_NO_FLOAT\n    ; * NOTE: b17 and b28 will be set later.\n    ; *\n    ; * < R1 >:\n    ; * If the bit16 of R0 is 1, then R1 is the value of BFAR or MMFAR, otherwise the\n    ; * value in R1 is invalid.\n    ; *\n    ; */\nosExcDispatch\n    LDR   R2, =OS_NVIC_ACT_BASE\n    MOV   R12, #8                      ; #8: externel interrupt active check loop counter(#0 - #239)\n\t\n\n\n_hwiActiveCheck\n    LDR   R3, [R2]                     ; R3 store the value of externel interrupt active status\n    CMP   R3, #0\n    BEQ   _hwiActiveCheckNext\n\n    ;/**\n    ; * Exception occured in external interrupt.\n    ; */\n    ORR   R0, R0, #FLAG_HWI_ACTIVE     ; R0[b17] = 1, externel interrupt active valid    &&&&&&&&&&\n    RBIT  R2, R3                       ; bit reversal\n    CLZ   R2, R2\n    RSB   R12, R12, #8                 ; R12 = 8 - R12\n    ADD   R2, R2, R12, LSL #5          ; R2: external interrupt number as uwPid\n\n    ;/**\n    ; * Interrupts and initialization phase always use MSP.\n    ; */\n_ExcInMSP\n    ;TST   LR, #0x10                    ; EXC_RETURN[b4] --- FPU(0) or without FPU(1)\n    ;BNE   _NoFloatInMsp\n\n    ;/**\n    ; * Before executing instruction 'B _handleEntry', MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                                 | R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                          R13--->|          Initial R13--->|<---      #32     --->|<---SAVED_SP\n    ; *                                                           |   (CPU auto saved)   |\n    ; *\n    ; */\n_NoFloatInMsp\n    ADD   R3, R13, #32                 ; #32: skip [R0-R3,R12,LR,PC,xPSR]\n    PUSH  {R3}                         ; push [SAVED_SP]: MSP+32 = Stack pointer in MSP before entering the exception\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK to MSP\n\n\tORR   R0, R0, #FLAG_NO_FLOAT       ; R0[b28] = 1, no FPU    &&&&&&&&&&\n    B     _handleEntry\n\n_hwiActiveCheckNext\n    ADD   R2, R2, #4                   ; next NVIC ACT ADDR\n    SUBS  R12, R12, #1\n    BNE   _hwiActiveCheck\n\n    ;/**\n    ; * Not in externel interrupt, check whether it is SysTick or PendSV.\n    ; */\n\n    LDR   R2, =OS_NVIC_SHCSRS\n    LDRH  R2,[R2]\n    LDR   R3,=OS_NVIC_SHCSR_MASK\n    AND   R2, R2, R3\n    CMP   R2, #0\n    BNE   _ExcInMSP                    ; SysTick or PendSV active\n\n    ;/**\n    ; * Check whether an exception occurs during the initialization phase.\n    ; * If g_bTaskScheduled == 0, it is in the initialization phase.\n    ; */\n    LDR  R2, =g_bTaskScheduled\n    LDR  R2, [R2]\n    TST  R2, #1\n    BEQ  _ExcInMSP                     ; initialization phase use MSP\n    ;/**\n    ; * Before executing _handleEntry, MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                                  | R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                           R13--->|                        |<---      #32     --->|<---Initial R13\n    ; *                                                           |  (copied from PSP)   |\n    ; *                                                           |<---R2(no use)\n    ; *\n    ; * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR.\n    ; */\n_NoFloatInPsp\n    MOV   R2, R13\n    SUB   R13, #32                     ; #32: MSP reserved, used to store stack frame in PSP\n\n    MRS   R3, PSP\n    ADD   R12, R3, #32                 ; PSP+32 = Stack pointer of the task before entering the exception\n\t\n\tPUSH  {R12}                        ; push task SP to MSP\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK of the current running task to MSP\n\n    ;/* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3, {R4-R11}                 ; restore stack frame of PSP to R4-R11\n    STMFD R2!, {R4-R11}                ; save stack frame to MSP\n\n    ORR   R0, R0, #FLAG_NO_FLOAT       ; R0[b28] = 1, no FPU    &&&&&&&&&&\n\n    ;/**\n    ; * _handleEntry: Call osExcHandleEntry\n    ; * param1: R0 --- b28:    FLAG_NO_FLOAT.\n    ; *                b17:    FLAG_HWI_ACTIVE.\n    ; *                b16:    FLAG_ADDR_VALID.\n    ; *                b15-b8: Error state code in table g_uwExcTbl or HF_DEBUGEVT or HF_VECTBL.\n    ; *                b7-b0:  OS_EXC_CAUSE_HARDFAULT or OS_EXC_CAUSE_NMI or OS_EXC_CAUSE_MEMFAULT\n    ; *                        or OS_EXC_CAUSE_BUSFAULT or OS_EXC_CAUSE_USAGEFAULT.\n    ; * param2: R1 --- The value of BFAR or MMFAR if R0[b16] = 1, otherwise invalid.\n    ; * param3: R2 --- external interrupt number(0-239) if R0[b17] = 1, otherwise invalid.\n    ; * param4: R3 --- Point to the top of the stack(R4 or S16) that the exception stack frame in MSP.\n    ; */\n_handleEntry\n    MOV R3, R13\n    CPSID I\n    CPSID F\n    B  osExcHandleEntry\n\n    NOP\n    ALIGN\n    END"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m3/los_exc.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n\n#include \"los_exc.inc\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n#if (LOSCFG_PLATFORM_EXC == YES)\n\nUINT32 g_uwCurNestCount = 0;\nEXC_INFO_S m_stExcInfo;\n/*\n * CFSR register, include UFSR,BFSR and MFSR.\n *\n * +----------------------------------------------------------------------------------+\n * |                                      UFSR                                        |\n * |-----------+-----------+-----------+-------+------+-------+----------+------------|\n * |  31 - 26  |     25    |     24    | 23-20 |  19  |   18  |    17    |     16     |\n * |-----------+-----------+-----------+-------+------+-------+----------+------------|\n * |    ---    | DIVBYZERO | UNALIGNED |  ---  | NOCP | INVPC | INVSTATE | UNDEFINSTR |\n * +----------------------------------------------------------------------------------+\n *\n * +----------------------------------------------------------------------------------+\n * |                                     BFSR                                         |\n * |-----------+-----+--------+--------+----------+-------------+-----------+---------|\n * |     15    |  14 |   13   |   12   |    11    |      10     |     9     |    8    |\n * |-----------+-----+--------+--------+----------+-------------+-----------+---------|\n * | BFARVALID | --- | LSPERR | STKERR | UNSTKERR | IMPRECISERR | PRECISERR | IBUSERR |\n * +----------------------------------------------------------------------------------+\n *\n * +----------------------------------------------------------------------------------+\n * |                                     MFSR                                         |\n * |-----------+-------+---------+---------+-----------+-------+----------+-----------|\n * |     7     |   6   |    5    |    4    |     3     |   2   |    1     |     0     |\n * |-----------+-------+---------+---------+-----------+-------+----------+-----------|\n * | MMARVALID |  ---  | MLSPERR | MSTKERR | MUNSTKERR |  ---  | DACCVIOL | ICACCVIOL |\n * +----------------------------------------------------------------------------------+\n */\nUINT8 g_uwExcTbl[32] =\n{\n    0, 0, 0, 0, 0, 0, OS_EXC_UF_DIVBYZERO, OS_EXC_UF_UNALIGNED,\n    0, 0, 0, 0, OS_EXC_UF_NOCP, OS_EXC_UF_INVPC, OS_EXC_UF_INVSTATE, OS_EXC_UF_UNDEFINSTR,\n    0, 0, 0, OS_EXC_BF_STKERR, OS_EXC_BF_UNSTKERR, OS_EXC_BF_IMPRECISERR, OS_EXC_BF_PRECISERR, OS_EXC_BF_IBUSERR,\n    0, 0, 0, OS_EXC_MF_MSTKERR, OS_EXC_MF_MUNSTKERR, 0, OS_EXC_MF_DACCVIOL, OS_EXC_MF_IACCVIOL\n};\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\nVOID *m_puwExcContent;\nUINT32 g_uwArraySize = 0;\nEXC_INFO_ARRAY_S m_stExcArray[OS_EXC_TYPE_MAX - 1];\nstatic VOID osExcSave2DDR(VOID);\n#endif\n\nextern VOID LOS_Reboot(VOID);\n\n/*****************************************************************************\n Function    : osExcInfoDisplay\n Description : EXC info display\n Input       : pstExc --- Pointer to the EXC data\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcInfoDisplay(EXC_INFO_S *pstExc)\n{\n\t\tprintf(\"\\n\\n\");\n    PRINT_ERR(\"Phase      = 0x%8x\\n\", pstExc->usPhase);\n    PRINT_ERR(\"Type       = 0x%8x\\n\", pstExc->usType);\n    PRINT_ERR(\"FaultAddr  = 0x%8x\\n\", pstExc->uwFaultAddr);\n    PRINT_ERR(\"ThrdPid    = 0x%8x\\n\", pstExc->uwThrdPid);\n    PRINT_ERR(\"R0         = 0x%8x\\n\", pstExc->pstContext->uwR0);\n    PRINT_ERR(\"R1         = 0x%8x\\n\", pstExc->pstContext->uwR1);\n    PRINT_ERR(\"R2         = 0x%8x\\n\", pstExc->pstContext->uwR2);\n    PRINT_ERR(\"R3         = 0x%8x\\n\", pstExc->pstContext->uwR3);\n    PRINT_ERR(\"R4         = 0x%8x\\n\", pstExc->pstContext->uwR4);\n    PRINT_ERR(\"R5         = 0x%8x\\n\", pstExc->pstContext->uwR5);\n    PRINT_ERR(\"R6         = 0x%8x\\n\", pstExc->pstContext->uwR6);\n    PRINT_ERR(\"R7         = 0x%8x\\n\", pstExc->pstContext->uwR7);\n    PRINT_ERR(\"R8         = 0x%8x\\n\", pstExc->pstContext->uwR8);\n    PRINT_ERR(\"R9         = 0x%8x\\n\", pstExc->pstContext->uwR9);\n    PRINT_ERR(\"R10        = 0x%8x\\n\", pstExc->pstContext->uwR10);\n    PRINT_ERR(\"R11        = 0x%8x\\n\", pstExc->pstContext->uwR11);\n    PRINT_ERR(\"R12        = 0x%8x\\n\", pstExc->pstContext->uwR12);\n    PRINT_ERR(\"PriMask    = 0x%8x\\n\", pstExc->pstContext->uwPriMask);\n    PRINT_ERR(\"SP         = 0x%8x\\n\", pstExc->pstContext->uwSP);\n    PRINT_ERR(\"LR         = 0x%8x\\n\", pstExc->pstContext->uwLR);\n    PRINT_ERR(\"PC         = 0x%8x\\n\", pstExc->pstContext->uwPC);\n    PRINT_ERR(\"xPSR       = 0x%8x\\n\", pstExc->pstContext->uwxPSR);\n\n    PRINT_ERR(\"\\nplease use the addr2line tool to analyze the call stack on PC:\\n\");\n    PRINT_ERR(\"addr2line -e (xxx.axf/xxx.elf/xxx.out) -a -f \");\n    for (UINT32 i = 0; i < pstExc->uwCallStackDepth; i++)\n    {\n        PRINT_ERR(\"%#x \", pstExc->uwCallStack[i]);\n    }\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcCallStackAnalysis\n Description : Call stack analysis\n Input       : pstExc  ---  point to exception info\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcCallStackAnalysis(EXC_INFO_S *pstExc)\n{\n    UINT32 uwSP;\n    UINT32 uwLR;\n    UINT32 uwPC;\n    UINT32 uwStackStartAddr;\n    UINT32 uwStackSize;\n    UINT32 uwDepth = 0;\n    BOOL   bFirstLrValid = FALSE;\n\n    uwSP = pstExc->pstContext->uwSP;  /* sp pointer before entering exception */\n\n    /*\n     * save first and second depth\n     * first: PC before entering exception\n     * second: (LR - 4) before entering exception\n     * NOTE: If an exception occurs in the interrupt, LR may be EXC_RETURN, so we must make sure\n     *       that LR is valid, exclude EXC_RETURN.\n     */\n    pstExc->uwCallStack[uwDepth++] = pstExc->pstContext->uwPC;\n    if ((pstExc->pstContext->uwLR >= LOSCFG_EXC_CODE_START_ADDR) && \\\n        (pstExc->pstContext->uwLR <= LOSCFG_EXC_CODE_START_ADDR + LOSCFG_EXC_CODE_SIZE))\n    {\n        pstExc->uwCallStack[uwDepth++] = pstExc->pstContext->uwLR - sizeof(VOID *);  /* lr = pc + 4 */\n        bFirstLrValid = TRUE;\n    }\n\n    /*\n     * get the start address and size of the stack before entering the exception\n     */\n    if (pstExc->usPhase == OS_EXC_IN_TASK)  /* task use PSP */\n    {\n        uwStackStartAddr = g_stLosTask.pstRunTask->uwTopOfStack;\n        uwStackSize = g_stLosTask.pstRunTask->uwStackSize;\n    }\n    else  /* init and interrupt use MSP */\n    {\n        uwStackStartAddr = LOSCFG_EXC_MSP_START_ADDR;\n        uwStackSize = LOSCFG_EXC_MSP_SIZE;\n    }\n\n    /*\n     * check stack overflow, if so, compensate for overflow, readjust stack start address and size.\n     */\n    if (uwSP < uwStackStartAddr)  /* stack top overflow */\n    {\n        if (pstExc->usPhase == OS_EXC_IN_TASK)\n        {\n            PRINT_ERR(\"task %s stack top overflow\\n\", g_stLosTask.pstRunTask->pcTaskName);\n        }\n        else\n        {\n            PRINT_ERR(\"MSP top overflow\\n\");\n        }\n        uwStackSize += (uwStackStartAddr - uwSP);  /* compensate overflow size */\n        uwStackStartAddr = uwSP;  /* readjust stack start address */\n    }\n\n    /*\n     * Traverses the entire stack from the top of the stack to the bottom of the stack,\n     * find all LR.\n     */\n    for (; uwSP < uwStackStartAddr + uwStackSize; uwSP += sizeof(UINT32*))\n    {\n        uwLR = *(UINT32 *)uwSP;\n        if (uwLR % 2 == 0)  /* Thumb instruction, LR bit0 == 1 */\n        {\n            continue;\n        }\n\n        /*\n         * It may be LR, which must be further determined based on the start address\n         * and end address of the code segment.\n         */\n        if ((uwLR >= LOSCFG_EXC_CODE_START_ADDR) && (uwLR <= LOSCFG_EXC_CODE_START_ADDR + LOSCFG_EXC_CODE_SIZE) \\\n            && (uwDepth < LOSCFG_EXC_CALL_STACK_ANALYSIS_MAX_DEPTH))\n        {\n            uwPC = uwLR - sizeof(VOID *);  /* lr = pc + 4 */\n            /* the second depth(first LR) has been saved */\n            if ((uwDepth == 2) && (uwPC == pstExc->uwCallStack[1]) && (bFirstLrValid == TRUE))\n            {\n                continue;\n            }\n            pstExc->uwCallStack[uwDepth++] = uwPC;\n        }\n    }\n    pstExc->uwCallStackDepth = uwDepth;  /* save call stack depth */\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcHandleEntry\n Description : EXC handler entry\n Input       : uwExcType     --- EXC type\n             : uwFaultAddr   --- The address of an accurate address access error\n             : uwPid         --- Interrupt number\n             : puwExcBufAddr --- Point to the stack frame without FPU\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcHandleEntry(UINT32 uwExcType, UINT32 uwFaultAddr, UINT32 uwPid, EXC_CONTEXT_S *pstExcBufAddr)\n{\n    /* uwExcType high 16 bits: 0x01 - uwFaultAddr valid, 0x02 - in hwi */\n    UINT16 usTmpFlag = (uwExcType >> 16) & 0xFFFF;\n\n    g_uwCurNestCount++;\n#if (LOSCFG_PLATFORM_HWI == YES)\n    extern UINT32 g_vuwIntCount;\n    g_vuwIntCount++;\n#endif\n\n    /* Save interrupt nesting times */\n    m_stExcInfo.usNestCnt = (UINT16)g_uwCurNestCount;\n    /* uwExcType low 16 bits: exc type */\n    m_stExcInfo.usType = (UINT16)uwExcType & 0xFFFF;\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    /* Initializing a pointer to save an exception context */\n    m_puwExcContent = (UINT32 *)m_aucTaskArray;\n#endif\n\n    /* Save the fault address when an exception occurs if it is valid */\n    if (usTmpFlag & OS_EXC_FLAG_FAULTADDR_VALID)\n    {\n        m_stExcInfo.uwFaultAddr = uwFaultAddr;\n    }\n    else\n    {\n        m_stExcInfo.uwFaultAddr = OS_EXC_IMPRECISE_ACCESS_ADDR;\n    }\n\n    /* Save the phase of the exception */\n    extern BOOL g_bTaskScheduled;\n    if (g_bTaskScheduled && (NULL !=  g_stLosTask.pstRunTask))\n    {\n        if (usTmpFlag & OS_EXC_FLAG_IN_HWI)\n        {\n            m_stExcInfo.usPhase = OS_EXC_IN_HWI;\n            m_stExcInfo.uwThrdPid = uwPid;  /* interrupt number */\n        }\n        else\n        {\n            m_stExcInfo.usPhase = OS_EXC_IN_TASK;\n            m_stExcInfo.uwThrdPid = g_stLosTask.pstRunTask->uwTaskID;  /* task id */\n        }\n    }\n    else\n    {\n        m_stExcInfo.usPhase = OS_EXC_IN_INIT;\n        m_stExcInfo.uwThrdPid = 0xffffffff;\n    }\n\n    /* uwExcType BIT_28: Wether or not to use FPU */\n    if(uwExcType & OS_EXC_FLAG_NO_FLOAT)\n    {\n        m_stExcInfo.usFpuContext = 0;\n    #if FPU_EXIST\n        /* NOTE: S16-S31, S0-S15,FPSCR,NO_NAME invalid */\n        m_stExcInfo.pstContext = (EXC_CONTEXT_S *)((UINT8 *)pstExcBufAddr - 64); /* point to S16 */\n    #else\n        m_stExcInfo.pstContext = pstExcBufAddr; /* point to uwR4 */\n    #endif\n    }\n    else\n    {\n        m_stExcInfo.usFpuContext = 1;\n        m_stExcInfo.pstContext = pstExcBufAddr;  /* point to S16 */\n    }\n\n    osExcCallStackAnalysis(&m_stExcInfo);\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    osExcSave2DDR();\n#endif\n\n    osExcInfoDisplay(&m_stExcInfo);\n\n    LOS_Reboot();\n}\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n/*****************************************************************************\n Function    : osExcSaveIntStatus\n Description : Save NVIC register group\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSaveIntStatus(VOID)\n{\n    /* Save exc type */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_NVIC;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save total size of NVIC */\n    *((UINT32 *)m_puwExcContent) = 0x164; // = OS_NVIC_INT_ENABLE_SIZE + OS_NVIC_INT_PEND_SIZE + OS_NVIC_INT_ACT_SIZE + OS_NVIC_INT_PRI_SIZE + 12 + 4 + 4\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save interrupt enable register group (start addr: 0xE000E100, size: 32bytes, CMSIS-Core: NVIC->ISER[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SETENA_BASE, OS_NVIC_INT_ENABLE_SIZE);\n    m_puwExcContent =(UINT8 *)m_puwExcContent + OS_NVIC_INT_ENABLE_SIZE;\n\n    /* Save interrupt pend register group (start addr: 0xE000E200, size: 32bytes, CMSIS-Core: NVIC->ISPR[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SETPEND_BASE, OS_NVIC_INT_PEND_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_PEND_SIZE;\n\n    /* Save interrupt active status register group (start addr: 0xE000E300, size: 32bytes, CMSIS-Core: NVIC->IABR[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_INT_ACT_BASE, OS_NVIC_INT_ACT_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_ACT_SIZE;\n\n    /* Save interrupt priority register group (start addr: 0xE000E400, size: 240bytes), CMSIS-Core: NVIC->IP[0 - 239] */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_PRI_BASE, OS_NVIC_INT_PRI_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_PRI_SIZE;\n\n    /* Save system exception priority register group (start addr: 0xE000ED18, size: 12bytes, CMSIS-Core: SCB->SHP[0 - 11]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_EXCPRI_BASE, 12);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 12;\n\n    /* Save system processing control and state register group (start addr: 0xE000ED24, size: 4bytes, CMSIS-Core: SCB->SHCSR) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SHCSR, 4);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save interrupt control and status register group (start addr: 0xE000ED04, size: 4bytes, CMSIS-Core: SCB->ICSR) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_INT_CTRL, 4);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcRegister\n Description : Register exception\n Input       : uwType  --- exception type\n             : pFunc   --- exception callback function\n             : pArg    --- exception save info arg, not pFunc\n Output      : None\n Return      : None\n *****************************************************************************/\nVOID osExcRegister(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg)\n{\n    EXC_INFO_ARRAY_S *pstExcInfo;\n\n    if (uwType == 0 || uwType >= OS_EXC_TYPE_MAX || pFunc == NULL)\n    {\n        PRINT_ERR(\"osExcRegister ERROR!\\n\");\n        return;\n    }\n\n    pstExcInfo = &(m_stExcArray[uwType - 1]);\n    pstExcInfo->uwType       = uwType;\n    pstExcInfo->pFnExcInfoCb = pFunc;\n    pstExcInfo->pArg         = pArg;\n    pstExcInfo->uwValid      = TRUE;\n}\n\n/*****************************************************************************\n Function    : osExcSaveSysInfo\n Description : Saving exception information by calling callback function recursively\n Input       : uwType  --- exception type(OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1)\n             : pFunc   --- callback function\n             : uwLoop  --- loop total count\n             : uwLen   --- The size of the data saved each time\n             : uwIdx   --- loop index\n Output      : None\n Return      : None\n *****************************************************************************/\nVOID osExcSaveSysInfo(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, UINT32 uwLoop, UINT32 uwLen, UINT32 uwIdx)\n{\n    UINT32 uwRet;\n    UINT32 uwBuffer[OS_EXC_MAX_BUF_LEN];\n\n    /* Save exception type and size */\n    *((UINT32 *)m_puwExcContent) = uwType;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n    *((UINT32 *)m_puwExcContent)  = uwLen * (uwLoop - uwIdx);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    for (; uwIdx < uwLoop; uwIdx++)\n    {\n        memset((VOID *)uwBuffer, 0, sizeof(UINT32) * OS_EXC_MAX_BUF_LEN);\n        uwRet = pFunc(uwIdx, (VOID *)uwBuffer);\n        if (LOS_OK == uwRet)\n        {\n            memcpy(m_puwExcContent, (VOID *)uwBuffer, uwLen);\n        }\n        m_puwExcContent =(UINT8 *)m_puwExcContent + uwLen;\n    }\n}\n\n/*****************************************************************************\n Function    : osExcSaveInfo\n Description : save exception info\n Input       : uwType  --- exception type(OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1)\n             : pFunc   --- exception callback\n             : pArg    --- register arg, used to generate the arg passed to the callback\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSaveInfo(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg)\n{\n    UINT32 uwLen;\n    UINT32 uwIdx;\n    UINT32 uwLoop;\n    UINT32 uwTaskSwitchCount = 0;\n    OS_TASK_SWITCH_INFO *pstTaskSwitchInfo;\n\n    switch(uwType)\n    {\n        case OS_EXC_TYPE_TSK:  /* save task info */\n            uwLen = sizeof(TSK_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        case OS_EXC_TYPE_QUE:  /* save queue info */\n            uwLen = sizeof(QUEUE_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        case OS_EXC_TYPE_NVIC:  /* save NVIC info */\n            (VOID)pFunc(0, 0);\n            goto END;\n\n        case OS_EXC_TYPE_TSK_SWITCH:  /* save task switch info */\n            pstTaskSwitchInfo = pArg;\n            uwTaskSwitchCount = pstTaskSwitchInfo->ucIsFull & 0x7F;\n            uwLen = sizeof(UINT32) + sizeof(CHAR) * LOS_TASK_NAMELEN; /* auwPID + acName */\n            if (pstTaskSwitchInfo->ucIsFull & 0x80)\n            {\n                uwIdx = pstTaskSwitchInfo->ucIdx;\n                uwLoop = uwIdx + uwTaskSwitchCount;\n            }\n            else\n            {\n                uwIdx = 0;\n                uwLoop = pstTaskSwitchInfo->ucIdx;\n            }\n            break;\n\n        case OS_EXC_TYPE_MEM:  /* save mem info */\n            uwLen = sizeof(MEM_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        default:\n            goto END;\n    }\n    osExcSaveSysInfo(uwType, (EXC_INFO_SAVE_CALLBACK)pFunc, uwLoop, uwLen, uwIdx);\nEND:\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcSave2DDR\n Description : Save exception info to RAM\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSave2DDR(VOID)\n{\n    UINT32 uwIdx = 0;\n    UINT32 uwExcContextSize;\n\n    if (m_stExcInfo.usFpuContext == 1)\n    {\n        uwExcContextSize = sizeof(EXC_CONTEXT_S);\n    }\n    else\n    {\n        uwExcContextSize = sizeof(EXC_CONTEXT_S) - 136; /* except FPU register */\n    }\n\n    memset(m_puwExcContent, 0xff, g_uwArraySize);\n\n    /* Cortex-M type */\n    *((UINT32 *)m_puwExcContent) = 4;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /*\n     * Save exception type: OS_EXC_TYPE_CONTEXT\n     */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_CONTEXT;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* The size of struct EXC_INFO_S(except member EXC_CONTEXT_S*) and exception context size */\n    *((UINT32 *)m_puwExcContent) = sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *) + uwExcContextSize;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save struct m_stExcInfo except m_stExcInfo.pstContext */\n    memcpy((VOID *)m_puwExcContent, (VOID *)&m_stExcInfo, sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *));\n    m_puwExcContent = (UINT8 *)m_puwExcContent + sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *);\n\n    /* Save struct EXC_CONTEXT_S */\n    if (m_stExcInfo.usFpuContext == 0)\n    {\n        #if FPU_EXIST\n        /* m_stExcInfo.pstContext: init --- point to S16, S16->S31 invalid\n         *                         + 64 --- point to uwR4\n         *                         copy uwR4 -> uwxPSR */\n        memcpy((VOID *)m_puwExcContent, (UINT8 *)m_stExcInfo.pstContext + 64, uwExcContextSize);\n        #else\n        memcpy((VOID *)m_puwExcContent, m_stExcInfo.pstContext, uwExcContextSize);\n        #endif\n    }\n    else\n    {\n        memcpy((VOID *)m_puwExcContent, m_stExcInfo.pstContext, uwExcContextSize);\n    }\n    m_puwExcContent = (UINT8 *)m_puwExcContent + uwExcContextSize;\n\n    /*\n     * Save exception type: OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1\n     */\n    for (uwIdx = 0; uwIdx < OS_EXC_TYPE_MAX - 1; uwIdx++)\n    {\n        if (m_stExcArray[uwIdx].uwValid == FALSE)\n        {\n            continue;\n        }\n        osExcSaveInfo(m_stExcArray[uwIdx].uwType, m_stExcArray[uwIdx].pFnExcInfoCb, m_stExcArray[uwIdx].pArg);\n    }\n\n    /*\n     * Save exception type: OS_EXC_TYPE_MAX\n     */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_MAX;\n    m_puwExcContent = (UINT8*)m_puwExcContent + 4;\n\n    return;\n}\n#endif /*(LOSCFG_SAVE_EXC_INFO == YES)*/\n\n/*****************************************************************************\n Function    : osExcInit\n Description : Initializes the EXC\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT_INIT VOID osExcInit(UINT32 uwArraySize)\n{\n#if (LOSCFG_PLATFORM_HWI == YES)\n    /* Register exception handler to interrupt vector table in RAM */\n    m_pstHwiForm[-14 + OS_SYS_VECTOR_CNT] = NMI_Handler;\n    m_pstHwiForm[-13 + OS_SYS_VECTOR_CNT] = HardFault_Handler;\n    m_pstHwiForm[-12 + OS_SYS_VECTOR_CNT] = MemManage_Handler;\n    m_pstHwiForm[-11 + OS_SYS_VECTOR_CNT] = BusFault_Handler;\n    m_pstHwiForm[-10 + OS_SYS_VECTOR_CNT] = UsageFault_Handler;\n    m_pstHwiForm[-5  + OS_SYS_VECTOR_CNT] = SVC_Handler;\n#endif\n\n    /* Enable USGFAULT(BIT_18), BUSFAULT(BIT_17), MEMFAULT(BIT_16) */\n    *(volatile UINT32 *)OS_NVIC_SHCSR |= 0x70000;\n\n    /* Enable DIV 0(BIT_4) exception, unaligned(BIT_3) disable */\n    *(volatile UINT32 *)OS_NVIC_CCR |= 0x10;\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    g_uwArraySize = uwArraySize;\n    osExcRegister((EXC_INFO_TYPE)OS_EXC_TYPE_NVIC, (EXC_INFO_SAVE_CALLBACK)osExcSaveIntStatus, NULL);\n#endif\n}\n\nVOID osBackTrace(VOID)\n{\n    return;\n}\n\n#endif /*(LOSCFG_PLATFORM_EXC == YES)*/\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m3/los_exc.inc",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#ifndef _LOS_EXC_INC\n#define _LOS_EXC_INC\n\n#include \"los_exc.ph\"\n#include \"los_sys.ph\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n#endif /* _LOS_EXC_INC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m3/los_exc.ph",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef _LOS_EXC_PH\n#define _LOS_EXC_PH\n\n#include \"los_exc.h\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n#if (LOSCFG_PLATFORM_EXC == YES)\ntypedef enum\n{\n    OS_EXC_TYPE_CONTEXT     = 0,\n    OS_EXC_TYPE_TSK         = 1,\n    OS_EXC_TYPE_QUE         = 2,\n    OS_EXC_TYPE_NVIC        = 3,\n    OS_EXC_TYPE_TSK_SWITCH  = 4,\n    OS_EXC_TYPE_MEM         = 5,\n    OS_EXC_TYPE_MAX         = 6\n} EXC_INFO_TYPE;\n\ntypedef struct tagExcInfoCallBackArray\n{\n    EXC_INFO_TYPE           uwType;\n    UINT32                  uwValid;\n    EXC_INFO_SAVE_CALLBACK  pFnExcInfoCb;\n    VOID*                   pArg;\n}EXC_INFO_ARRAY_S;\n\n\n#define OS_NVIC_SHCSR                       0xE000ED24\n#define OS_NVIC_CCR                         0xE000ED14\n\n#define OS_NVIC_INT_ENABLE_SIZE             0x20\n#define OS_NVIC_INT_PRI_SIZE                0xF0\n\n#define OS_NVIC_INT_PEND_SIZE               OS_NVIC_INT_ACT_SIZE\n#define OS_NVIC_INT_ACT_SIZE                OS_NVIC_INT_ENABLE_SIZE\n\n\n#define MAX_SCENE_INFO_SIZE     (8 + sizeof(EXC_INFO_S) - 4 + sizeof(EXC_CONTEXT_S))\n#define MAX_TSK_INFO_SIZE       (8 + sizeof(TSK_INFO_S) * (LOSCFG_BASE_CORE_TSK_LIMIT + 1))\n#define MAX_INT_INFO_SIZE       (8 + 0x164)\n\n#if (LOSCFG_BASE_IPC_QUEUE == YES)\n#define MAX_QUEUE_INFO_SIZE     (8 + sizeof(QUEUE_INFO_S) * LOSCFG_BASE_IPC_QUEUE_LIMIT)\n#else\n#define MAX_QUEUE_INFO_SIZE     (0)\n#endif\n\n#if (LOSCFG_BASE_CORE_EXC_TSK_SWITCH == YES)\n#define MAX_SWITCH_INFO_SIZE    (8 + (sizeof(UINT32) + sizeof(CHAR) * LOS_TASK_NAMELEN) * OS_TASK_SWITCH_INFO_COUNT)\n#else\n#define MAX_SWITCH_INFO_SIZE    (0)\n#endif\n\n#if (LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK == YES)\n#define MAX_MEM_INFO_SIZE       (8 + sizeof(MEM_INFO_S) * OS_SYS_MEM_NUM)\n#else\n#define MAX_MEM_INFO_SIZE       (0)\n#endif\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n#define MAX_EXC_MEM_SIZE ( 4 + MAX_SCENE_INFO_SIZE + MAX_TSK_INFO_SIZE + MAX_QUEUE_INFO_SIZE + MAX_INT_INFO_SIZE + MAX_SWITCH_INFO_SIZE + MAX_MEM_INFO_SIZE + 4)\n#else\n#define MAX_EXC_MEM_SIZE ( 0 )\n#endif\n\nextern VOID osExcRegister(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg);\n#endif\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m3/test_funcs.S",
    "content": " AREA sectionname ,CODE ,READONLY\n EXPORT TEST_NONALIGNED\n EXPORT TEST_PREFETCH\n EXPORT TEST_NOSUPERVISORVISIT\n EXPORT TEST_TOARM\nTEST_NONALIGNED FUNCTION\n\tSUB   R13, #1\n\tMOV R0, #0X13\n\tPUSH {R1}\n\tPOP {R1}\n\tADD R13,#1\n\tBX LR\n\tENDFUNC\nTEST_PREFETCH FUNCTION\n\tMOV R0 , #0X1F000000\n\tORR R0,R0,#0XFF0000\n\tORR R0,R0,#0XC400\n\tMOV PC ,R0;0X1FFFC400 \n\tBX LR\n\tENDFUNC\n\nTEST_NOSUPERVISORVISIT FUNCTION\n\tMOV R0,#0XE0000000\n\tORR R0,R0,#0X2200\n\tMOV PC,R0\n\tBX LR\n\tENDFUNC\nTEST_TOARM FUNCTION\n\tMOV R3,LR\n\tAND R3,0XFFFFFFFE\n\tBX R3\n\tENDFUNC\nEND"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m4/Makefile",
    "content": "objs-y += los_exc.o\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m4/gcc/los_dispatch_gcc.S",
    "content": "/** ----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/** ----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/****************************************************************************************\n*                                  EXPORT FUNCTIONS\n****************************************************************************************/\n\n    .global  LOS_IntLock\n    .global  LOS_IntUnLock\n    .global  LOS_IntRestore\n    .global  LOS_StartToRun\n    .global  osTaskSchedule\n    .global  PendSV_Handler\n\n/****************************************************************************************\n*                                  EXTERN PARAMETERS\n****************************************************************************************/\n\n    .extern  g_stLosTask\n    .extern  g_pfnTskSwitchHook\n    .extern  g_bTaskScheduled\n\n/****************************************************************************************\n*                                  EQU\n****************************************************************************************/\n\n.equ    OS_NVIC_INT_CTRL,              0xE000ED04  /* Interrupt Control and State Register. */\n.equ    OS_NVIC_PENDSVSET,             0x10000000  /* Value to trigger PendSV exception. */\n\n.equ    OS_NVIC_SYSPRI2,               0xE000ED20  /* System Handler Priority Register 2. */\n.equ    OS_NVIC_PENDSV_SYSTICK_PRI,    0xFFFF0000  /* SysTick + PendSV priority level (lowest). */\n\n.equ    OS_TASK_STATUS_RUNNING,        0x0010      /* Task Status Flag (RUNNING). */\n\n/****************************************************************************************\n*                                  CODE GENERATION DIRECTIVES\n****************************************************************************************/\n\n    .section .text\n    .thumb\n    .syntax unified\n    .arch armv7e-m\n\n/****************************************************************************************\n* Function:\n*        VOID LOS_StartToRun(VOID);\n* Description:\n*        Start the first task, which is the highest priority task in the priority queue.\n*        Other tasks are started by task scheduling.\n****************************************************************************************/\n    .type LOS_StartToRun, %function\nLOS_StartToRun:\n    CPSID   I\n\n    /**\n     * Set PendSV and SysTick prority to the lowest.\n     * read ---> modify ---> write-back.\n     */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORR     R1, R1, R2\n    STR     R1, [R0]\n\n    /**\n     * Set g_bTaskScheduled = 1.\n     */\n    LDR     R0, =g_bTaskScheduled\n    MOV     R1, #1\n    STR     R1, [R0]\n\n    /**\n     * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n     */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    /**\n     * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n     */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOV     R3, #OS_TASK_STATUS_RUNNING\n    ORR     R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    /**\n     * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n     * [Initial EXC_RETURN ignore,] return by setting the CONTROL register.\n     *\n     * The initial stack of the current running task is as follows:\n     *\n     *                     POP: Restore the context of the current running task ===>|\n     *                                                                 High addr--->|\n     *                                                       Bottom of the stack--->|\n     * ----------+---------------------------------+--------------------------------+\n     *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n     * ----------+---------------------------------+--------------------------------+\n     *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n     *           |<---           skip          --->|<---     copy to R0-R7      --->|\n     *                                                                R12 to PSP--->|\n     *                                        Stack pointer after LOS_StartToRun--->|\n     */\n    LDR     R12, [R1]\n    ADD     R12, R12, #36          /* skip R4-R11, PRIMASK. */\n#if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    ADD     R12, R12, #4           /* if FPU exist, skip EXC_RETURN. */\n#endif\n    LDMFD   R12!, {R0-R7}\n\n    /**\n     * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n     */\n    MSR     PSP, R12\n\n    /**\n     * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n     */\n    MOV     R12, #2\n    MSR     CONTROL, R12\n\n    /**\n     * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n     */\n    MOV     LR, R5\n    CPSIE   I\n\n    /**\n     * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n     * of the main function will be destroyed and will never be returned.\n     */\n    BX      R6\n\n/****************************************************************************************\n* Function:\n*        UINTPTR LOS_IntLock(VOID);\n* Description:\n*        Disable all interrupts except Reset,NMI and HardFault.\n*        The value of currnet interruption state will be returned to the caller to save.\n*\n* Function:\n*        VOID LOS_IntRestore(UINTPTR uvIntSave);\n* Description:\n*        Restore the locked interruption of LOS_IntLock.\n*        The caller must pass in the value of interruption state previously saved.\n****************************************************************************************/\n    .type LOS_IntLock, %function\nLOS_IntLock:\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\n    .type LOS_IntUnLock, %function\nLOS_IntUnLock:\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\n    .type LOS_IntRestore, %function\nLOS_IntRestore:\n    MSR     PRIMASK, R0\n    BX      LR\n\n/****************************************************************************************\n* Function:\n*        VOID osTaskSchedule(VOID);\n* Description:\n*        Start the task swtich process by software trigger PendSV interrupt.\n****************************************************************************************/\n    .type osTaskSchedule, %function\nosTaskSchedule:\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n/****************************************************************************************\n* Function:\n*        VOID PendSV_Handler(VOID);\n* Description:\n*        PendSV interrupt handler, switch the context of the task.\n*        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n*               to its own stack.\n*        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n*                from its own stack.\n****************************************************************************************/\n    .type PendSV_Handler, %function\nPendSV_Handler:\n    /**\n     * R12: Save the interruption state of the current running task.\n     * Disable all interrupts except Reset,NMI and HardFault\n     */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    /**\n     * Call task switch hook.\n     */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CBZ     R2, TaskSwitch\n    PUSH    {R12, LR}\n    BLX     R2\n    POP     {R12, LR}\n\nTaskSwitch:\n    /**\n     * R0 = now stack pointer of the current running task.\n     */\n    MRS     R0, PSP\n\n    /**\n     * Save the stack frame([S16-S31],R4-R11) of the current running task.\n     * R12 save the PRIMASK value of the current running task.\n     * NOTE: 1. Before entering the exception handler function, these registers\n     *       ([NO_NAME,FPSCR,S15-S0],xPSR,PC,LR,R12,R3-R0) have been automatically\n     *       saved by the CPU in the stack of the current running task.\n     *       2. If lazy stacking is enabled, space is reserved on the stack for\n     *       the floating-point context(FPSCR,S15-S0), but the floating-point state\n     *       is not saved. when the floating-point instruction(VSTMDBEQ  R0!, {D8-D15})\n     *       is executed, the floating-point context(FPSCR,S15-S0) is first saved into\n     *       the space reserved on the stack. In other words, the instruction\n     *       'VSTMDBEQ  R0!, {D8-D15}' will trigger the CPU to save 'FPSCR,S15-S0' first.\n     *\n     * The stack of the current running task is as follows:\n     *\n     *   |<=== PUSH: Save the context of the current running task\n     *   |                                                                     High addr--->|\n     * --+-----------------------------------+-------------------------------------------+---\n     *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n     *   |                                                         [   lazy stacking    ]|\n     * --+-----------------------------------+-------------------------------------------+---\n     *                                        Stack pointer before entering exception--->|\n     *                                       |<---           cpu auto saved          --->|\n     *                                       |<---PSP to R0\n     *   |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n     */\n#if defined (__VFP_FP__) && !defined(__SOFTFP__)       /* if FPU exist. */\n    TST     R14, #0x10             /* if the task using the FPU context, push s16-s31. */\n    IT      EQ\n    VSTMDBEQ  R0!, {D8-D15}\n    STMFD   R0!, {R14}             /* save EXC_RETURN. */\n#endif\n    STMFD   R0!, {R4-R12}          /* save the core registers and PRIMASK. */\n\n    /**\n     * R5,R8.\n     */\n    LDR     R5, =g_stLosTask\n    MOV     R8, #OS_TASK_STATUS_RUNNING\n\n    /**\n     * Save the stack pointer of the current running task to TCB.\n     * (g_stLosTask.pstRunTask->pStackPointer = R0)\n     */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    /**\n     * Clear the RUNNING state of the current running task.\n     * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n     */\n    LDRH    R7, [R6, #4]\n    BIC     R7, R7, R8\n    STRH    R7, [R6, #4]\n\n    /**\n     * Switch the current running task to the next running task.\n     * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n     */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    /**\n     * Set the RUNNING state of the next running task.\n     * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n     */\n    LDRH    R7, [R0, #4]\n    ORR     R7, R7, R8\n    STRH    R7, [R0, #4]\n\n    /**\n     * Restore the stack pointer of the next running task from TCB.\n     * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n     */\n    LDR     R1, [R0]\n\n    /**\n     * Restore the stack frame(R4-R11,[S16-S31]) of the next running task.\n     * R12 restore the PRIMASK value of the next running task.\n     * NOTE: After exiting the exception handler function, these registers\n     *       (PC,xPSR,R0-R3,R12,LR,[S0-S15,FPSCR,NO_NAME]) will be automatically\n     *       restored by the CPU from the stack of the next running task.\n     *\n     * 1. The stack of the next running task is as follows:\n     *\n     *                             POP: Restore the context of the next running task ===>|\n     *                                                                         High addr--->|\n     * --+-----------------------------------+-------------------------------------------+---\n     *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n     * --+-----------------------------------+-------------------------------------------+---\n     *   |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n     *                          R1 to PSP--->|\n     *                                       |<---        cpu auto restoring         --->|\n     *                                          Stack pointer after exiting exception--->|\n     *\n     * 2. If the next running task is run for the first time, the stack is as follows:\n     *\n     *                        POP: Restore the context of the next running task ===>|\n     *                                                                 High addr--->|\n     *                                                       Bottom of the stack--->|\n     * ----------+---------------------------------+--------------------------------+\n     *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n     * ----------+---------------------------------+--------------------------------+\n     *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n     *                                R1 to PSP--->|\n     *                                             |<---   cpu auto restoring   --->|\n     *                                     Stack pointer after exiting exception--->|\n     */\n    LDMFD   R1!, {R4-R12}          /* restore the core registers and PRIMASK. */\n#if defined (__VFP_FP__) && !defined(__SOFTFP__)       /* if FPU exist. */\n    LDMFD   R1!, {R14}             /* restore EXC_RETURN. */\n    TST     R14, #0x10             /* if the task using the FPU context, pop s16-s31. */\n    IT      EQ\n    VLDMIAEQ  R1!, {D8-D15}\n#endif\n\n    /**\n     * Set the stack pointer of the next running task to PSP.\n     */\n    MSR     PSP, R1\n\n    /**\n     * Restore the interruption state of the next running task.\n     */\n    MSR     PRIMASK, R12\n    BX      LR\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m4/gcc/los_hw_exc_gcc.S",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n /*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/****************************************************************************************\n*                                  CODE GENERATION DIRECTIVES\n****************************************************************************************/\n\n    .syntax unified\n    .arch armv7e-m\n    .thumb\n    .section .text\n\n/****************************************************************************************\n*                                  EXPORT FUNCTIONS\n****************************************************************************************/\n\n    .global  NMI_Handler\n    .global  HardFault_Handler\n    .global  MemManage_Handler\n    .global  BusFault_Handler\n    .global  UsageFault_Handler\n    .global  SVC_Handler\n\n/****************************************************************************************\n*                                  EXTERN PARAMETERS\n****************************************************************************************/\n\n    .extern osExcHandleEntry\n    .extern g_uwExcTbl\n    .extern g_bTaskScheduled\n\n/****************************************************************************************\n*                                  EQU\n****************************************************************************************/\n\n.equ    OS_EXC_CAUSE_NMI,            18\n.equ    OS_EXC_CAUSE_HARDFAULT,      19\n.equ    OS_EXC_CAUSE_MEMFAULT,       20\n.equ    OS_EXC_CAUSE_BUSFAULT,       21\n.equ    OS_EXC_CAUSE_USAGEFAULT,     22\n.equ    OS_EXC_CAUSE_SVC,            23\n\n.equ    HF_DEBUGEVT,                 24\n.equ    HF_VECTBL,                   25\n\n.equ    FLAG_ADDR_VALID,             0x10000       /* bit 16 */\n.equ    FLAG_HWI_ACTIVE,             0x20000       /* bit 17 */\n.equ    FLAG_NO_FLOAT,               0x10000000    /* bit 28 */\n\n.equ    OS_NVIC_CFSR,                0xE000ED28    /* include BusFault/MemFault/UsageFault State Regeister */\n.equ    OS_NVIC_HFSR,                0xE000ED2C    /* HardFault State Regeister */\n.equ    OS_NVIC_BFAR,                0xE000ED38\n.equ    OS_NVIC_MMFAR,               0xE000ED34\n.equ    OS_NVIC_ACT_BASE,            0xE000E300\n.equ    OS_NVIC_SHCSRS,              0xE000ED24\n.equ    OS_NVIC_SHCSR_MASK,          0xC00         /* SYSTICKACT and PENDSVACT */\n\n/****************************************************************************************\n* Function:\n*        VOID NMI_Handler(VOID);\n* Description:\n*        NMI Handler.\n****************************************************************************************/\n    .type NMI_Handler, %function\nNMI_Handler:\n    /**\n     * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +------------------------------------------------------+------------------------+\n     * |                          31-8                        |          7-0           |\n     * +------------------------------------------------------+------------------------+\n     * |                          ---                         |    OS_EXC_CAUSE_NMI    |\n     * +------------------------------------------------------+------------------------+\n     * < R1 >: invalid\n     */\n    MOV  R0, #OS_EXC_CAUSE_NMI\n    MOV  R1, #0\n    B  osExcDispatch\n\n/****************************************************************************************\n* Function:\n*        VOID HardFault_Handler(VOID);\n* Description:\n*        HardFault Handler.\n****************************************************************************************/\n    .type HardFault_Handler, %function\nHardFault_Handler:\n    /**\n     * Check HardFault state register.\n     *\n     * HFSR:\n     * +----------+--------+--------+--------+-------+\n     * |    31    |   30   | 29 - 2 |    1   |   0   |\n     * +----------+--------+--------+--------+-------+\n     * | DEBUGEVT | FORCED |   --   | VECTBL |   --  |\n     * +----------+--------+--------+--------+-------+\n     */\n    MOV  R0, #OS_EXC_CAUSE_HARDFAULT\n    LDR  R2, =OS_NVIC_HFSR\n    LDR  R2, [R2]\n\n    /**\n     * Check whether HardFault are triggered by debugging events.\n     * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +----------------------------------------+-------------+------------------------+\n     * |                 31-16                  |    15-8     |          7-0           |\n     * +----------------------------------------+-------------+------------------------+\n     * |                  ---                   | HF_DEBUGEVT | OS_EXC_CAUSE_HARDFAULT |\n     * +----------------------------------------+-------------+------------------------+\n     * < R1 >: invalid\n     */\n    MOV  R1, #HF_DEBUGEVT\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x80000000\n    BNE  osExcDispatch                 /* DEBUGEVT */\n\n    /**\n     * Check whether HardFault is caused by the failure of the fetch vector.\n     * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +----------------------------------------+-------------+------------------------+\n     * |                 31-16                  |    15-8     |          7-0           |\n     * +----------------------------------------+-------------+------------------------+\n     * |                  ---                   |  HF_VECTBL  | OS_EXC_CAUSE_HARDFAULT |\n     * +----------------------------------------+-------------+------------------------+\n     * < R1 >: invalid\n     */\n    AND  R0, R0, #0x000000FF\n    MOV  R1, #HF_VECTBL\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x00000002\n    BNE  osExcDispatch                  /* VECTBL */\n\n    /**\n     * If it`s not DEBUGEVT and VECTBL, that is FORCED, then read the CFSR register to\n     * check BusFault, MemFault and UsageFault.\n     * R0: OS_EXC_CAUSE_HARDFAULT\n     *\n     * CFSR:\n     * +----------------+--------+--------+\n     * |      31-16     |  15-8  |  7-0   |\n     * +----------------+--------+--------+\n     * |      UFSR      |  BFSR  |  MFSR  |\n     * +----------------+--------+--------+\n     */\n    AND  R0, R0, #0x000000FF\n\n    LDR  R2, =OS_NVIC_CFSR\n    LDR  R2, [R2]\n\n    TST  R2, #0x8000                   /* BFSR->BFARVALID */\n    BNE  _HFBusFault                   /* BusFault */\n\n    TST  R2, #0x80                     /* MFSR->MMARVALID */\n    BNE  _HFMemFault                   /* MemFault */\n\n    /**\n     * BFARVALID and MMARVALID flag both invalid.\n     * R12: 0 --- The error address is invalid.\n     */\n    MOV  R12, #0\n    B    osHFExcCommonBMU\n\n    /**\n     * BFARVALID flag valid, read BFAR register.\n     * R1 : BFAR value --- The address value of a bus error.\n     * R12: The error address is valid.\n     */\n_HFBusFault:\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n    B    osHFExcCommonBMU\n\n    /**\n     * MMARVALID flag valid, read MMFAR register.\n     * R1 : MMFAR value --- The address value of memory management error.\n     * R12: The error address is valid.\n     */\n_HFMemFault:\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n\n    /**\n     * osHFExcCommonBMU: --- Get specific error status from table g_uwExcTbl, stored in R0.\n     * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +-------------------+-----------------+------------------+------------------------+\n     * |       31-17       |        16       |        15-8      |          7-0           |\n     * +-------------------+-----------------+------------------+------------------------+\n     * |        ---        | FLAG_ADDR_VALID | Error state code | OS_EXC_CAUSE_HARDFAULT |\n     * |                   |        or       |       in         |                        |\n     * |                   |   0(invalid)    | table g_uwExcTbl |                        |\n     * +-------------------+-----------------+------------------+------------------------+\n     * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n     *         else invalid.\n     */\nosHFExcCommonBMU:\n    CLZ  R2, R2\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R2\n    LDRB R2, [R3]\n    ORR  R0, R0, R2, LSL #0x8\n    ORR  R0, R0, R12\n    B    osExcDispatch\n\n/****************************************************************************************\n* Function:\n*        VOID SVC_Handler(VOID);\n* Description:\n*        SVC Handler.\n****************************************************************************************/\n    .type SVC_Handler, %function\nSVC_Handler:\n    TST   LR, #0x4                     /* EXC_RETURN[b2] --- PSP or MSP */\n    ITE   EQ\n    MRSEQ R0, MSP\n    MRSNE R0, PSP\n    LDR   R1, [R0, #24]                /* The PC value in the stack frame */\n    LDRB  R0, [R1, #-2]                /* R0: The number of SVC (0 - 255) */\n    MOV   R1, #0\n    /* B     osExcDispatch */\n_SvcLoop:\n    B     _SvcLoop\n\n/****************************************************************************************\n* Function:\n*        VOID BusFault_Handler(VOID);\n* Description:\n*        BusFault Handler.\n****************************************************************************************/\n    .type BusFault_Handler, %function\nBusFault_Handler:\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_BUSFAULT\n\n    TST  R0, #0x8000                   /* BFSR->BFARVALID */\n    BEQ  _ExcBusNoADDR\n\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]                      /* R1:  The value of BFAR */\n    MOV  R12, #FLAG_ADDR_VALID         /* R12: BusFault addr valid */\n    AND  R0, R0, #0x3F00               /* R0:  Reserved the b13-b8 of the BFSR */\n    B    osExcCommonBMU\n\n_ExcBusNoADDR:\n    MOV  R12, #0                       /* R12: BusFault addr invalid */\n    AND  R0, R0, #0x3F00               /* R0:  Reserved the b13-b8 of the BFSR */\n    B    osExcCommonBMU\n\n/****************************************************************************************\n* Function:\n*        VOID MemManage_Handler(VOID);\n* Description:\n*        MemManage Handler.\n****************************************************************************************/\n    .type MemManage_Handler, %function\nMemManage_Handler:\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_MEMFAULT\n\n    TST  R0, #0x80                     /* MFSR->MMARVALID */\n    BEQ  _ExcMemNoADDR\n\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]                      /* R1:  The value of MMFAR */\n    MOV  R12, #FLAG_ADDR_VALID         /* R12: MemFault addr valid */\n    AND  R0, R0, #0x3B                 /* R0:  Reserved the b5-b0 of the MFSR */\n    B    osExcCommonBMU\n\n_ExcMemNoADDR:\n    MOV  R12, #0                       /* R12: MemFault addr invalid */\n    AND  R0, R0, #0x3B                 /* R0:  Reserved the b5-b0 of the MFSR */\n    B    osExcCommonBMU\n\n/****************************************************************************************\n* Function:\n*        VOID UsageFault_Handler(VOID);\n* Description:\n*        UsageFault Handler.\n****************************************************************************************/\n    .type UsageFault_Handler, %function\nUsageFault_Handler:\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_USAGEFAULT\n\n    LDR  R1, =#0x030F\n    LSL  R1, R1, #16\n    AND  R0, R0, R1                    /* R0:  reserved UFSR */\n    MOV  R12, #0                       /* R12: Fault addr invalid */\n\n    /**\n     * osExcCommonBMU: BusFault_Handler,MemManage_Handler and UsageFault_Handler share.\n     * Get specific error status from table g_uwExcTbl, stored in R0.\n     * Before executing osExcDispatch, the value of R0 is as follows.\n     * < R0 >:\n     * +-------------------+-----------------+------------------+------------------------+\n     * |       31-17       |        16       |        15-8      |          7-0           |\n     * +-------------------+-----------------+------------------+------------------------+\n     * |        ---        | FLAG_ADDR_VALID | Error state code |OS_EXC_CAUSE_BUSFAULT or|\n     * |                   |        or       |       in         |OS_EXC_CAUSE_MEMFAULT or|\n     * |                   |   0(invalid)    | table g_uwExcTbl |OS_EXC_CAUSE_USAGEFAULT |\n     * +-------------------+-----------------+------------------+------------------------+\n     * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n     *         else invalid.\n     */\nosExcCommonBMU:\n    CLZ  R0, R0\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R0\n    LDRB R0, [R3]\n    LSL  R0, R0, #0x8\n    ORR  R0, R0, R2\n    ORR  R0, R0, R12\n\n    /****************************************************************************************\n    * osExcDispatch: NMI_Handler, HardFault_Handler, SVC_Handler, BusFault_Handler, MemManage_Handler,\n    *                  UsageFault_Handler sharing.\n    ****************************************************************************************/\n\n    /**\n     * When executing osExcDispatch, R0, R1 will be used.\n     * The possible values of R0 and R1 are as follows.\n     *\n     * < R0 >:\n     * +----------------+-----------------+---------------------+------------------------+\n     * |     31-17      |        16       |         15-8        |          7-0           |\n     * +----------------+-----------------+---------------------+------------------------+\n     * |                | FLAG_ADDR_VALID | Error state code in | OS_EXC_CAUSE_HARDFAULT |\n     * |      ---       |       or        | table g_uwExcTbl    |or OS_EXC_CAUSE_MEMFAULT|\n     * |                |   0(invalid)    | or      HF_DEBUGEVT |or OS_EXC_CAUSE_BUSFAULT|\n     * |                |                 | or      HF_VECTBL   |or OS_EXC_CAUSE_NMI  or |\n     * |                |                 |                     | OS_EXC_CAUSE_USAGEFAULT|\n     * +----------------+-----------------+---------------------+------------------------+\n     * b17: FLAG_HWI_ACTIVE\n     * b28: FLAG_NO_FLOAT\n     * NOTE: b17 and b28 will be set later.\n     *\n     * < R1 >:\n     * If the bit16 of R0 is 1, then R1 is the value of BFAR or MMFAR, otherwise the\n     * value in R1 is invalid.\n     *\n     */\nosExcDispatch:\n    LDR   R2, =OS_NVIC_ACT_BASE\n    MOV   R12, #8                      /* #8: externel interrupt active check loop counter(#0 - #239) */\n\n_hwiActiveCheck:\n    LDR   R3, [R2]                     /* R3 store the value of externel interrupt active status */\n    CMP   R3, #0\n    BEQ   _hwiActiveCheckNext\n\n    /**\n     * Exception occured in external interrupt.\n     */\n    ORR   R0, R0, #FLAG_HWI_ACTIVE     /* R0[b17] = 1, externel interrupt active valid    &&&&&&&&&& */\n    RBIT  R2, R3                       /* bit reversal */\n    CLZ   R2, R2\n    RSB   R12, R12, #8                 /* R12 = 8 - R12 */\n    ADD   R2, R2, R12, LSL #5          /* R2: external interrupt number as uwPid */\n\n    /**\n     * Interrupts and initialization phase always use MSP.\n     */\n_ExcInMSP:\n    TST   LR, #0x10                    /* EXC_RETURN[b4] --- FPU(0) or without FPU(1) */\n    BNE   _NoFloatInMsp\n\n    /**\n     * Before executing instruction 'B _handleEntry', MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *    | S16-S31,R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n     * +--------------------------------------------------------------------------------+---------\n     *    |<---R13           Initial R13--->|<---                #104               --->|<---SAVED_SP\n     *                                      |              (CPU auto saved)             |\n     *\n     */\n    ADD   R3, R13, #104                /* #104: skip [R0-xPSR,D0-D7,FPSCR,NO_NAME] */\n    PUSH  {R3}                         /* push [SAVED_SP]: MSP+104 = Stack pointer in MSP before entering the exception */\n    MRS   R12, PRIMASK\n    PUSH {R4-R12}                      /* push R4-R11,PRIMASK to MSP */\n    VPUSH {D8-D15}                     /* push D8-D15 to MSP */\n    B     _handleEntry\n\n    /**\n     * Before executing instruction 'B _handleEntry', MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *                                 | R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR |\n     * +--------------------------------------------------------------------------------+---------\n     *                          R13--->|          Initial R13--->|<---      #32     --->|<---SAVED_SP\n     *                                                           |   (CPU auto saved)   |\n     *\n     */\n_NoFloatInMsp:\n    ADD   R3, R13, #32                 /* #32: skip [R0-R3,R12,LR,PC,xPSR] */\n    PUSH  {R3}                         /* push [SAVED_SP]: MSP+32 = Stack pointer in MSP before entering the exception */\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     /* push R4-R11,PRIMASK to MSP */\n    ORR   R0, R0, #FLAG_NO_FLOAT       /* R0[b28] = 1, no FPU    &&&&&&&&&& */\n    B     _handleEntry\n\n_hwiActiveCheckNext:\n    ADD   R2, R2, #4                   /* next NVIC ACT ADDR */\n    SUBS  R12, R12, #1\n    BNE   _hwiActiveCheck\n\n    /**\n     * Not in externel interrupt, check whether it is SysTick or PendSV.\n     */\n    LDR   R2, =OS_NVIC_SHCSRS\n    LDRH  R2,[R2]\n    LDR   R3,=OS_NVIC_SHCSR_MASK\n    AND   R2, R2, R3\n    CMP   R2, #0\n    BNE   _ExcInMSP                    /* SysTick or PendSV active */\n\n    /**\n     * Check whether an exception occurs during the initialization phase.\n     * If g_bTaskScheduled == 0, it is in the initialization phase.\n     */\n    LDR  R2, =g_bTaskScheduled\n    LDR  R2, [R2]\n    TST  R2, #1\n    BEQ  _ExcInMSP                     /* initialization phase use MSP */\n\n    /**\n     * Exception occured in Task.\n     */\n    TST   LR, #0x10\n    BNE   _NoFloatInPsp\n\n    /**\n     * Before executing _handleEntry, MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *     | S16-S31,R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n     * +--------------------------------------------------------------------------------+---------\n     *     |<---R13                         |<---                #104               --->|<---Initial R13\n     *                                      |              (copied from PSP)            |\n     *                                                                    R2(no use)--->|\n     *\n     * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME.\n     */\n    MOV   R2, R13\n    SUB   R2, R2, #8                   /* #8: reserved for [FPSCR,NO_NAME] */\n    SUB   R13, #104                    /* #104: MSP reserved, used to store stack frame in PSP */\n\n    MRS   R3, PSP\n    ADD   R12, R3, #104                /* PSP+104 = Stack pointer of the task before entering the exception */\n    PUSH  {R12}                        /* push task SP to MSP */\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     /* push R4-R11,PRIMASK of the current running task to MSP */\n    VPUSH {D8-D15}                     /* push D8-D15 of the currnent running task to MSP */\n\n    /* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3!, {R4-R11}                /* restore stack frame[R0-xPSR] of PSP to R4-R11 */\n    VLDMIA  R3!, {D8-D15}              /* restore stack frame[D0-D7] of PSP to D8-D15 */\n    VSTMDB  R2!, {D8-D15}              /* save stack frame[D0-D7] to MSP */\n    STMFD R2!, {R4-R11}                /* save stack frame[R0-xPSR] to MSP */\n    LDMFD R3, {R4-R5}                  /* restore stack frame[FPSCR,NO_NAME] to R4-R5 */\n    ADD   R2, R2, #104                 /* skip stack frame */\n    STMFD R2, {R4-R5}                  /* save stack frame[FPSCR,NO_NAME] to MSP */\n    B     _handleEntry\n\n    /**\n     * Before executing _handleEntry, MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *                                  | R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR |\n     * +--------------------------------------------------------------------------------+---------\n     *                           R13--->|                        |<---      #32     --->|<---Initial R13\n     *                                                           |  (copied from PSP)   |\n     *                                                           |<---R2(no use)\n     *\n     * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR.\n     */\n_NoFloatInPsp:\n    MOV   R2, R13\n    SUB   R13, #32                     /* #32: MSP reserved, used to store stack frame in PSP */\n\n    MRS   R3, PSP\n    ADD   R12, R3, #32                 /* PSP+32 = Stack pointer of the task before entering the exception */\n    PUSH  {R12}                        /* push task SP to MSP */\n\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     /* push R4-R11,PRIMASK of the current running task to MSP */\n\n    /* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3, {R4-R11}                 /* restore stack frame of PSP to R4-R11 */\n    STMFD R2!, {R4-R11}                /* save stack frame to MSP */\n    ORR   R0, R0, #FLAG_NO_FLOAT       /* R0[b28] = 1, no FPU    &&&&&&&&&& */\n\n    /**\n     * _handleEntry: Call osExcHandleEntry\n     * param1: R0 --- b28:    FLAG_NO_FLOAT.\n     *                b17:    FLAG_HWI_ACTIVE.\n     *                b16:    FLAG_ADDR_VALID.\n     *                b15-b8: Error state code in table g_uwExcTbl or HF_DEBUGEVT or HF_VECTBL.\n     *                b7-b0:  OS_EXC_CAUSE_HARDFAULT or OS_EXC_CAUSE_NMI or OS_EXC_CAUSE_MEMFAULT\n     *                        or OS_EXC_CAUSE_BUSFAULT or OS_EXC_CAUSE_USAGEFAULT.\n     * param2: R1 --- The value of BFAR or MMFAR if R0[b16] = 1, otherwise invalid.\n     * param3: R2 --- external interrupt number(0-239) if R0[b17] = 1, otherwise invalid.\n     * param4: R3 --- Point to the top of the stack(R4 or S16) that the exception stack frame in MSP.\n     */\n_handleEntry:\n    MOV R3, R13\n    CPSID I\n    CPSID F\n    B  osExcHandleEntry\n\n    NOP\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m4/iar/los_dispatch_iar.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  LOS_IntLock\n    EXPORT  LOS_IntUnLock\n    EXPORT  LOS_IntRestore\n    EXPORT  LOS_StartToRun\n    EXPORT  osTaskSchedule\n    EXPORT  PendSV_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT  g_stLosTask\n    IMPORT  g_pfnTskSwitchHook\n    IMPORT  g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_NVIC_INT_CTRL              EQU    0xE000ED04  ; Interrupt Control and State Register.\nOS_NVIC_PENDSVSET             EQU    0x10000000  ; Value to trigger PendSV exception.\n\nOS_NVIC_SYSPRI2               EQU    0xE000ED20  ; System Handler Priority Register 2.\nOS_NVIC_PENDSV_SYSTICK_PRI    EQU    0xFFFF0000  ; SysTick + PendSV priority level (lowest).\n\nOS_TASK_STATUS_RUNNING        EQU    0x0010      ; Task Status Flag (RUNNING).\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    SECTION    .text:CODE(2)\n    THUMB\n    REQUIRE8\n    PRESERVE8\n\n;****************************************************************************************\n; Function:\n;        VOID LOS_StartToRun(VOID);\n; Description:\n;        Start the first task, which is the highest priority task in the priority queue.\n;        Other tasks are started by task scheduling.\n;****************************************************************************************\nLOS_StartToRun\n    CPSID   I\n\n    ;/**\n    ; * Set PendSV and SysTick prority to the lowest.\n    ; * read ---> modify ---> write-back.\n    ; */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORR     R1, R1, R2\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_bTaskScheduled = 1.\n    ; */\n    LDR     R0, =g_bTaskScheduled\n    MOV     R1, #1\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n    ; */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n    ; */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOV     R3, #OS_TASK_STATUS_RUNNING\n    ORR     R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    ;/**\n    ; * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n    ; * [Initial EXC_RETURN ignore,] return by setting the CONTROL register.\n    ; *\n    ; * The initial stack of the current running task is as follows:\n    ; *\n    ; *                     POP: Restore the context of the current running task ===>|\n    ; *                                                                 High addr--->|\n    ; *                                                       Bottom of the stack--->|\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n    ; *           |<---           skip          --->|<---     copy to R0-R7      --->|\n    ; *                                                                R12 to PSP--->|\n    ; *                                        Stack pointer after LOS_StartToRun--->|\n    ; */\n    LDR     R12, [R1]\n    ADD     R12, R12, #36          ; skip R4-R11, PRIMASK.\n#if defined (__ARMVFP__)\n    ADD     R12, R12, #4           ; if FPU exist, skip EXC_RETURN.\n#endif\n    LDMFD   R12!, {R0-R7}\n\n    ;/**\n    ; * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n    ; */\n    MSR     PSP, R12\n\n    ;/**\n    ; * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n    ; */\n    MOV     R12, #2\n    MSR     CONTROL, R12\n\n    ;/**\n    ; * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n    ; */\n    MOV     LR, R5\n    CPSIE   I\n\n    ;/**\n    ; * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n    ; * of the main function will be destroyed and will never be returned.\n    ; */\n    BX      R6\n\n;****************************************************************************************\n; Function:\n;        UINTPTR LOS_IntLock(VOID);\n; Description:\n;        Disable all interrupts except Reset,NMI and HardFault.\n;        The value of currnet interruption state will be returned to the caller to save.\n;\n; Function:\n;        VOID LOS_IntRestore(UINTPTR uvIntSave);\n; Description:\n;        Restore the locked interruption of LOS_IntLock.\n;        The caller must pass in the value of interruption state previously saved.\n;****************************************************************************************\nLOS_IntLock\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\nLOS_IntUnLock\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\nLOS_IntRestore\n    MSR     PRIMASK, R0\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID osTaskSchedule(VOID);\n; Description:\n;        Start the task swtich process by software trigger PendSV interrupt.\n;****************************************************************************************\nosTaskSchedule\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID PendSV_Handler(VOID);\n; Description:\n;        PendSV interrupt handler, switch the context of the task.\n;        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n;               to its own stack.\n;        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n;                from its own stack.\n;****************************************************************************************\nPendSV_Handler\n    ;/**\n    ; * R12: Save the interruption state of the current running task.\n    ; * Disable all interrupts except Reset,NMI and HardFault\n    ; */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    ;/**\n    ; * Call task switch hook.\n    ; */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CBZ     R2, TaskSwitch\n    PUSH    {R12, LR}\n    BLX     R2\n    POP     {R12, LR}\n\nTaskSwitch\n    ;/**\n    ; * R0 = now stack pointer of the current running task.\n    ; */\n    MRS     R0, PSP\n\n    ;/**\n    ; * Save the stack frame([S16-S31],R4-R11) of the current running task.\n    ; * R12 save the PRIMASK value of the current running task.\n    ; * NOTE: 1. Before entering the exception handler function, these registers\n    ; *       ([NO_NAME,FPSCR,S15-S0],xPSR,PC,LR,R12,R3-R0) have been automatically\n    ; *       saved by the CPU in the stack of the current running task.\n    ; *       2. If lazy stacking is enabled, space is reserved on the stack for\n    ; *       the floating-point context(FPSCR,S15-S0), but the floating-point state\n    ; *       is not saved. when the floating-point instruction(VSTMDBEQ  R0!, {D8-D15})\n    ; *       is executed, the floating-point context(FPSCR,S15-S0) is first saved into\n    ; *       the space reserved on the stack. In other words, the instruction\n    ; *       'VSTMDBEQ  R0!, {D8-D15}' will trigger the CPU to save 'FPSCR,S15-S0' first.\n    ; *\n    ; * The stack of the current running task is as follows:\n    ; *\n    ; *   |<=== PUSH: Save the context of the current running task\n    ; *   |                                                                     High addr--->|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; *   |                                                         [   lazy stacking    ]|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *                                        Stack pointer before entering exception--->|\n    ; *                                       |<---           cpu auto saved          --->|\n    ; *                                       |<---PSP to R0\n    ; *   |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n    ; */\n#if defined (__ARMVFP__)           ; if FPU exist.\n    TST     R14, #0x10             ; if the task using the FPU context, push s16-s31.\n    IT      EQ\n    VSTMDBEQ  R0!, {D8-D15}\n    STMFD   R0!, {R14}             ; save EXC_RETURN.\n#endif\n    STMFD   R0!, {R4-R12}          ; save the core registers and PRIMASK.\n\n    ;/**\n    ; * R5,R8.\n    ; */\n    LDR     R5, =g_stLosTask\n    MOV     R8, #OS_TASK_STATUS_RUNNING\n\n    ;/**\n    ; * Save the stack pointer of the current running task to TCB.\n    ; * (g_stLosTask.pstRunTask->pStackPointer = R0)\n    ; */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    ;/**\n    ; * Clear the RUNNING state of the current running task.\n    ; * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R6, #4]\n    BIC     R7, R7, R8\n    STRH    R7, [R6, #4]\n\n    ;/**\n    ; * Switch the current running task to the next running task.\n    ; * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n    ; */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    ;/**\n    ; * Set the RUNNING state of the next running task.\n    ; * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R0, #4]\n    ORR     R7, R7, R8\n    STRH    R7, [R0, #4]\n\n    ;/**\n    ; * Restore the stack pointer of the next running task from TCB.\n    ; * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n    ; */\n    LDR     R1, [R0]\n\n    ;/**\n    ; * Restore the stack frame(R4-R11,[S16-S31]) of the next running task.\n    ; * R12 restore the PRIMASK value of the next running task.\n    ; * NOTE: After exiting the exception handler function, these registers\n    ; *       (PC,xPSR,R0-R3,R12,LR,[S0-S15,FPSCR,NO_NAME]) will be automatically\n    ; *       restored by the CPU from the stack of the next running task.\n    ; *\n    ; * 1. The stack of the next running task is as follows:\n    ; *\n    ; *                             POP: Restore the context of the next running task ===>|\n    ; *                                                                         High addr--->|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                          R1 to PSP--->|\n    ; *                                       |<---        cpu auto restoring         --->|\n    ; *                                          Stack pointer after exiting exception--->|\n    ; *\n    ; * 2. If the next running task is run for the first time, the stack is as follows:\n    ; *\n    ; *                        POP: Restore the context of the next running task ===>|\n    ; *                                                                 High addr--->|\n    ; *                                                       Bottom of the stack--->|\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                                R1 to PSP--->|\n    ; *                                             |<---   cpu auto restoring   --->|\n    ; *                                     Stack pointer after exiting exception--->|\n    ; */\n    LDMFD   R1!, {R4-R12}          ; restore the core registers and PRIMASK.\n#if defined (__ARMVFP__)           ; if FPU exist.\n    LDMFD   R1!, {R14}             ; restore EXC_RETURN.\n    TST     R14, #0x10             ; if the task using the FPU context, pop s16-s31.\n    IT      EQ\n    VLDMIAEQ  R1!, {D8-D15}\n#endif\n\n    ;/**\n    ; * Set the stack pointer of the next running task to PSP.\n    ; */\n    MSR     PSP, R1\n\n    ;/**\n    ; * Restore the interruption state of the next running task.\n    ; */\n    MSR     PRIMASK, R12\n    BX      LR\n\n    END\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m4/iar/los_hw_exc_iar.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    PRESERVE8\n    SECTION    .text:CODE(2)\n    THUMB\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  NMI_Handler\n    EXPORT  HardFault_Handler\n    EXPORT  MemManage_Handler\n    EXPORT  BusFault_Handler\n    EXPORT  UsageFault_Handler\n    EXPORT  SVC_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT osExcHandleEntry\n    IMPORT g_uwExcTbl\n    IMPORT g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_EXC_CAUSE_NMI            EQU   18\nOS_EXC_CAUSE_HARDFAULT      EQU   19\nOS_EXC_CAUSE_MEMFAULT       EQU   20\nOS_EXC_CAUSE_BUSFAULT       EQU   21\nOS_EXC_CAUSE_USAGEFAULT     EQU   22\nOS_EXC_CAUSE_SVC            EQU   23\n\nHF_DEBUGEVT                 EQU   24\nHF_VECTBL                   EQU   25\n\nFLAG_ADDR_VALID             EQU   0x10000       ; bit 16\nFLAG_HWI_ACTIVE             EQU   0x20000       ; bit 17\nFLAG_NO_FLOAT               EQU   0x10000000    ; bit 28\n\nOS_NVIC_CFSR                EQU   0xE000ED28    ; include BusFault/MemFault/UsageFault State Regeister\nOS_NVIC_HFSR                EQU   0xE000ED2C    ; HardFault State Regeister\nOS_NVIC_BFAR                EQU   0xE000ED38\nOS_NVIC_MMFAR               EQU   0xE000ED34\nOS_NVIC_ACT_BASE            EQU   0xE000E300\nOS_NVIC_SHCSRS              EQU   0xE000ED24\nOS_NVIC_SHCSR_MASK          EQU   0xC00         ; SYSTICKACT and PENDSVACT\n\n;****************************************************************************************\n; Function:\n;        VOID NMI_Handler(VOID);\n; Description:\n;        NMI Handler.\n;****************************************************************************************\nNMI_Handler\n    ;/**\n    ; * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +------------------------------------------------------+------------------------+\n    ; * |                          31-8                        |          7-0           |\n    ; * +------------------------------------------------------+------------------------+\n    ; * |                          ---                         |    OS_EXC_CAUSE_NMI    |\n    ; * +------------------------------------------------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    MOV  R0, #OS_EXC_CAUSE_NMI\n    MOV  R1, #0\n    B  osExcDispatch\n\n;****************************************************************************************\n; Function:\n;        VOID HardFault_Handler(VOID);\n; Description:\n;        HardFault Handler.\n;****************************************************************************************\nHardFault_Handler\n    ;/**\n    ; * Check HardFault state register.\n    ; *\n    ; * HFSR:\n    ; * +----------+--------+--------+--------+-------+\n    ; * |    31    |   30   | 29 - 2 |    1   |   0   |\n    ; * +----------+--------+--------+--------+-------+\n    ; * | DEBUGEVT | FORCED |   --   | VECTBL |   --  |\n    ; * +----------+--------+--------+--------+-------+\n    ; */\n    MOV  R0, #OS_EXC_CAUSE_HARDFAULT\n    LDR  R2, =OS_NVIC_HFSR\n    LDR  R2, [R2]\n\n    ;/**\n    ; * Check whether HardFault are triggered by debugging events.\n    ; * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                 31-16                  |    15-8     |          7-0           |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                  ---                   | HF_DEBUGEVT | OS_EXC_CAUSE_HARDFAULT |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    MOV  R1, #HF_DEBUGEVT\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x80000000\n    BNE  osExcDispatch                 ; DEBUGEVT\n\n    ;/**\n    ; * Check whether HardFault is caused by the failure of the fetch vector.\n    ; * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                 31-16                  |    15-8     |          7-0           |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                  ---                   |  HF_VECTBL  | OS_EXC_CAUSE_HARDFAULT |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    AND  R0, R0, #0x000000FF\n    MOV  R1, #HF_VECTBL\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x00000002\n    BNE  osExcDispatch                  ; VECTBL\n\n    ;/**\n    ; * If it`s not DEBUGEVT and VECTBL, that is FORCED, then read the CFSR register to\n    ; * check BusFault, MemFault and UsageFault.\n    ; * R0: OS_EXC_CAUSE_HARDFAULT\n    ; *\n    ; * CFSR:\n    ; * +----------------+--------+--------+\n    ; * |      31-16     |  15-8  |  7-0   |\n    ; * +----------------+--------+--------+\n    ; * |      UFSR      |  BFSR  |  MFSR  |\n    ; * +----------------+--------+--------+\n    ; */\n    AND  R0, R0, #0x000000FF\n\n    LDR  R2, =OS_NVIC_CFSR\n    LDR  R2, [R2]\n\n    TST  R2, #0x8000                   ; BFSR->BFARVALID\n    BNE  _HFBusFault                   ; BusFault\n\n    TST  R2, #0x80                     ; MFSR->MMARVALID\n    BNE  _HFMemFault                   ; MemFault\n\n    ;/**\n    ; * BFARVALID and MMARVALID flag both invalid.\n    ; * R12: 0 --- The error address is invalid.\n    ; */\n    MOV  R12, #0\n    B    osHFExcCommonBMU\n\n    ;/**\n    ; * BFARVALID flag valid, read BFAR register.\n    ; * R1 : BFAR value --- The address value of a bus error.\n    ; * R12: The error address is valid.\n    ; */\n_HFBusFault\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n    B    osHFExcCommonBMU\n\n    ;/**\n    ; * MMARVALID flag valid, read MMFAR register.\n    ; * R1 : MMFAR value --- The address value of memory management error.\n    ; * R12: The error address is valid.\n    ; */\n_HFMemFault\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n\n    ;/**\n    ; * osHFExcCommonBMU: --- Get specific error status from table g_uwExcTbl, stored in R0.\n    ; * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |       31-17       |        16       |        15-8      |          7-0           |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |        ---        | FLAG_ADDR_VALID | Error state code | OS_EXC_CAUSE_HARDFAULT |\n    ; * |                   |        or       |       in         |                        |\n    ; * |                   |   0(invalid)    | table g_uwExcTbl |                        |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n    ; *         else invalid.\n    ; */\nosHFExcCommonBMU\n    CLZ  R2, R2\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R2\n    LDRB R2, [R3]\n    ORR  R0, R0, R2, LSL #0x8\n    ORR  R0, R0, R12\n    B    osExcDispatch\n\n;****************************************************************************************\n; Function:\n;        VOID SVC_Handler(VOID);\n; Description:\n;        SVC Handler.\n;****************************************************************************************\nSVC_Handler\n    TST   LR, #0x4                     ; EXC_RETURN[b2] --- PSP or MSP\n    ITE   EQ\n    MRSEQ R0, MSP\n    MRSNE R0, PSP\n    LDR   R1, [R0, #24]                ; The PC value in the stack frame\n    LDRB  R0, [R1, #-2]                ; R0: The number of SVC (0 - 255)\n    MOV   R1, #0\n    ;B     osExcDispatch\n_SvcLoop\n    B     _SvcLoop\n\n;****************************************************************************************\n; Function:\n;        VOID BusFault_Handler(VOID);\n; Description:\n;        BusFault Handler.\n;****************************************************************************************\nBusFault_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_BUSFAULT\n\n    TST  R0, #0x8000                   ; BFSR->BFARVALID\n    BEQ  _ExcBusNoADDR\n\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]                      ; R1:  The value of BFAR\n    MOV  R12, #FLAG_ADDR_VALID         ; R12: BusFault addr valid\n    AND  R0, R0, #0x3F00               ; R0:  Reserved the b13-b8 of the BFSR\n    B    osExcCommonBMU\n\n_ExcBusNoADDR\n    MOV  R12, #0                       ; R12: BusFault addr invalid\n    AND  R0, R0, #0x3F00               ; R0:  Reserved the b13-b8 of the BFSR\n    B    osExcCommonBMU\n\n;****************************************************************************************\n; Function:\n;        VOID MemManage_Handler(VOID);\n; Description:\n;        MemManage Handler.\n;****************************************************************************************\nMemManage_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_MEMFAULT\n\n    TST  R0, #0x80                     ; MFSR->MMARVALID\n    BEQ  _ExcMemNoADDR\n\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]                      ; R1:  The value of MMFAR\n    MOV  R12, #FLAG_ADDR_VALID         ; R12: MemFault addr valid\n    AND  R0, R0, #0x3B                 ; R0:  Reserved the b5-b0 of the MFSR\n    B    osExcCommonBMU\n\n_ExcMemNoADDR\n    MOV  R12, #0                       ; R12: MemFault addr invalid\n    AND  R0, R0, #0x3B                 ; R0:  Reserved the b5-b0 of the MFSR\n    B    osExcCommonBMU\n\n;****************************************************************************************\n; Function:\n;        VOID UsageFault_Handler(VOID);\n; Description:\n;        UsageFault Handler.\n;****************************************************************************************\nUsageFault_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_USAGEFAULT\n\n    MOV  R1, #0x030F\n    LSL  R1, R1, #16\n    AND  R0, R0, R1                    ; R0:  reserved UFSR\n    MOV  R12, #0                       ; R12: Fault addr invalid\n\n    ;/**\n    ; * osExcCommonBMU: BusFault_Handler,MemManage_Handler and UsageFault_Handler share.\n    ; * Get specific error status from table g_uwExcTbl, stored in R0.\n    ; * Before executing osExcDispatch, the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |       31-17       |        16       |        15-8      |          7-0           |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |        ---        | FLAG_ADDR_VALID | Error state code |OS_EXC_CAUSE_BUSFAULT or|\n    ; * |                   |        or       |       in         |OS_EXC_CAUSE_MEMFAULT or|\n    ; * |                   |   0(invalid)    | table g_uwExcTbl |OS_EXC_CAUSE_USAGEFAULT |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n    ; *         else invalid.\n    ; */\nosExcCommonBMU\n    CLZ  R0, R0\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R0\n    LDRB R0, [R3]\n    LSL  R0, R0, #0x8\n    ORR  R0, R0, R2\n    ORR  R0, R0, R12\n\n    ;****************************************************************************************\n    ; osExcDispatch: NMI_Handler, HardFault_Handler, SVC_Handler, BusFault_Handler, MemManage_Handler,\n    ;                  UsageFault_Handler sharing.\n    ;****************************************************************************************\n\n    ;/**\n    ; * When executing osExcDispatch, R0, R1 will be used.\n    ; * The possible values of R0 and R1 are as follows.\n    ; *\n    ; * < R0 >:\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * |     31-17      |        16       |         15-8        |          7-0           |\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * |                | FLAG_ADDR_VALID | Error state code in | OS_EXC_CAUSE_HARDFAULT |\n    ; * |      ---       |       or        | table g_uwExcTbl    |or OS_EXC_CAUSE_MEMFAULT|\n    ; * |                |   0(invalid)    | or      HF_DEBUGEVT |or OS_EXC_CAUSE_BUSFAULT|\n    ; * |                |                 | or      HF_VECTBL   |or OS_EXC_CAUSE_NMI  or |\n    ; * |                |                 |                     | OS_EXC_CAUSE_USAGEFAULT|\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * b17: FLAG_HWI_ACTIVE\n    ; * b28: FLAG_NO_FLOAT\n    ; * NOTE: b17 and b28 will be set later.\n    ; *\n    ; * < R1 >:\n    ; * If the bit16 of R0 is 1, then R1 is the value of BFAR or MMFAR, otherwise the\n    ; * value in R1 is invalid.\n    ; *\n    ; */\nosExcDispatch\n    LDR   R2, =OS_NVIC_ACT_BASE\n    MOV   R12, #8                      ; #8: externel interrupt active check loop counter(#0 - #239)\n\n_hwiActiveCheck\n    LDR   R3, [R2]                     ; R3 store the value of externel interrupt active status\n    CMP   R3, #0\n    BEQ   _hwiActiveCheckNext\n\n    ;/**\n    ; * Exception occured in external interrupt.\n    ; */\n    ORR   R0, R0, #FLAG_HWI_ACTIVE     ; R0[b17] = 1, externel interrupt active valid    &&&&&&&&&&\n    RBIT  R2, R3                       ; bit reversal\n    CLZ   R2, R2\n    RSB   R12, R12, #8                 ; R12 = 8 - R12\n    ADD   R2, R2, R12, LSL #5          ; R2: external interrupt number as uwPid\n\n    ;/**\n    ; * Interrupts and initialization phase always use MSP.\n    ; */\n_ExcInMSP\n    TST   LR, #0x10                    ; EXC_RETURN[b4] --- FPU(0) or without FPU(1)\n    BNE   _NoFloatInMsp\n\n    ;/**\n    ; * Before executing instruction 'B _handleEntry', MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *    | S16-S31,R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *    |<---R13           Initial R13--->|<---                #104               --->|<---SAVED_SP\n    ; *                                      |              (CPU auto saved)             |\n    ; *\n    ; */\n    ADD   R3, R13, #104                ; #104: skip [R0-xPSR,D0-D7,FPSCR,NO_NAME]\n    PUSH  {R3}                         ; push [SAVED_SP]: MSP+104 = Stack pointer in MSP before entering the exception\n    MRS   R12, PRIMASK\n    PUSH {R4-R12}                      ; push R4-R11,PRIMASK to MSP\n    VPUSH {D8-D15}                     ; push D8-D15 to MSP\n    B     _handleEntry\n\n    ;/**\n    ; * Before executing instruction 'B _handleEntry', MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                                 | R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                          R13--->|          Initial R13--->|<---      #32     --->|<---SAVED_SP\n    ; *                                                           |   (CPU auto saved)   |\n    ; *\n    ; */\n_NoFloatInMsp\n    ADD   R3, R13, #32                 ; #32: skip [R0-R3,R12,LR,PC,xPSR]\n    PUSH  {R3}                         ; push [SAVED_SP]: MSP+32 = Stack pointer in MSP before entering the exception\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK to MSP\n    ORR   R0, R0, #FLAG_NO_FLOAT       ; R0[b28] = 1, no FPU    &&&&&&&&&&\n    B     _handleEntry\n\n_hwiActiveCheckNext\n    ADD   R2, R2, #4                   ; next NVIC ACT ADDR\n    SUBS  R12, R12, #1\n    BNE   _hwiActiveCheck\n\n    ;/**\n    ; * Not in externel interrupt, check whether it is SysTick or PendSV.\n    ; */\n    LDR   R2, =OS_NVIC_SHCSRS\n    LDRH  R2,[R2]\n    LDR   R3,=OS_NVIC_SHCSR_MASK\n    AND   R2, R2, R3\n    CMP   R2, #0\n    BNE   _ExcInMSP                    ; SysTick or PendSV active\n\n    ;/**\n    ; * Check whether an exception occurs during the initialization phase.\n    ; * If g_bTaskScheduled == 0, it is in the initialization phase.\n    ; */\n    LDR  R2, =g_bTaskScheduled\n    LDR  R2, [R2]\n    TST  R2, #1\n    BEQ  _ExcInMSP                     ; initialization phase use MSP\n\n    ;/**\n    ; * Exception occured in Task.\n    ; */\n    TST   LR, #0x10\n    BNE   _NoFloatInPsp\n\n    ;/**\n    ; * Before executing _handleEntry, MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *     | S16-S31,R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *     |<---R13                         |<---                #104               --->|<---Initial R13\n    ; *                                      |              (copied from PSP)            |\n    ; *                                                                    R2(no use)--->|\n    ; *\n    ; * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME.\n    ; */\n    MOV   R2, R13\n    SUB   R2, R2, #8                   ; #8: reserved for [FPSCR,NO_NAME]\n    SUB   R13, #104                    ; #104: MSP reserved, used to store stack frame in PSP\n\n    MRS   R3, PSP\n    ADD   R12, R3, #104                ; PSP+104 = Stack pointer of the task before entering the exception\n    PUSH  {R12}                        ; push task SP to MSP\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK of the current running task to MSP\n    VPUSH {D8-D15}                     ; push D8-D15 of the currnent running task to MSP\n\n    ;/* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3!, {R4-R11}                ; restore stack frame[R0-xPSR] of PSP to R4-R11\n    VLDMIA  R3!, {D8-D15}              ; restore stack frame[D0-D7] of PSP to D8-D15\n    VSTMDB  R2!, {D8-D15}              ; save stack frame[D0-D7] to MSP\n    STMFD R2!, {R4-R11}                ; save stack frame[R0-xPSR] to MSP\n    LDMFD R3, {R4-R5}                  ; restore stack frame[FPSCR,NO_NAME] to R4-R5\n    ADD   R2, R2, #104                 ; skip stack frame\n    STMFD R2, {R4-R5}                  ; save stack frame[FPSCR,NO_NAME] to MSP\n    B     _handleEntry\n\n    ;/**\n    ; * Before executing _handleEntry, MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                                  | R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                           R13--->|                        |<---      #32     --->|<---Initial R13\n    ; *                                                           |  (copied from PSP)   |\n    ; *                                                           |<---R2(no use)\n    ; *\n    ; * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR.\n    ; */\n_NoFloatInPsp\n    MOV   R2, R13\n    SUB   R13, #32                     ; #32: MSP reserved, used to store stack frame in PSP\n\n    MRS   R3, PSP\n    ADD   R12, R3, #32                 ; PSP+32 = Stack pointer of the task before entering the exception\n    PUSH  {R12}                        ; push task SP to MSP\n\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK of the current running task to MSP\n\n    ;/* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3, {R4-R11}                 ; restore stack frame of PSP to R4-R11\n    STMFD R2!, {R4-R11}                ; save stack frame to MSP\n    ORR   R0, R0, #FLAG_NO_FLOAT       ; R0[b28] = 1, no FPU    &&&&&&&&&&\n\n    ;/**\n    ; * _handleEntry: Call osExcHandleEntry\n    ; * param1: R0 --- b28:    FLAG_NO_FLOAT.\n    ; *                b17:    FLAG_HWI_ACTIVE.\n    ; *                b16:    FLAG_ADDR_VALID.\n    ; *                b15-b8: Error state code in table g_uwExcTbl or HF_DEBUGEVT or HF_VECTBL.\n    ; *                b7-b0:  OS_EXC_CAUSE_HARDFAULT or OS_EXC_CAUSE_NMI or OS_EXC_CAUSE_MEMFAULT\n    ; *                        or OS_EXC_CAUSE_BUSFAULT or OS_EXC_CAUSE_USAGEFAULT.\n    ; * param2: R1 --- The value of BFAR or MMFAR if R0[b16] = 1, otherwise invalid.\n    ; * param3: R2 --- external interrupt number(0-239) if R0[b17] = 1, otherwise invalid.\n    ; * param4: R3 --- Point to the top of the stack(R4 or S16) that the exception stack frame in MSP.\n    ; */\n_handleEntry\n    MOV R3, R13\n    CPSID I\n    CPSID F\n    B  osExcHandleEntry\n\n    NOP\n    END\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m4/keil/los_dispatch_keil.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  LOS_IntLock\n    EXPORT  LOS_IntUnLock\n    EXPORT  LOS_IntRestore\n    EXPORT  LOS_StartToRun\n    EXPORT  osTaskSchedule\n    EXPORT  PendSV_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT  g_stLosTask\n    IMPORT  g_pfnTskSwitchHook\n    IMPORT  g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_NVIC_INT_CTRL              EQU    0xE000ED04  ; Interrupt Control and State Register.\nOS_NVIC_PENDSVSET             EQU    0x10000000  ; Value to trigger PendSV exception.\n\nOS_NVIC_SYSPRI2               EQU    0xE000ED20  ; System Handler Priority Register 2.\nOS_NVIC_PENDSV_SYSTICK_PRI    EQU    0xFFFF0000  ; SysTick + PendSV priority level (lowest).\n\nOS_TASK_STATUS_RUNNING        EQU    0x0010      ; Task Status Flag (RUNNING).\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    AREA    |.text|, CODE, READONLY\n    THUMB\n    REQUIRE8\n    PRESERVE8\n\n;****************************************************************************************\n; Function:\n;        VOID LOS_StartToRun(VOID);\n; Description:\n;        Start the first task, which is the highest priority task in the priority queue.\n;        Other tasks are started by task scheduling.\n;****************************************************************************************\nLOS_StartToRun\n    CPSID   I\n\n    ;/**\n    ; * Set PendSV and SysTick prority to the lowest.\n    ; * read ---> modify ---> write-back.\n    ; */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORR     R1, R1, R2\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_bTaskScheduled = 1.\n    ; */\n    LDR     R0, =g_bTaskScheduled\n    MOV     R1, #1\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n    ; */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n    ; */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOV     R3, #OS_TASK_STATUS_RUNNING\n    ORR     R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    ;/**\n    ; * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n    ; * [Initial EXC_RETURN ignore,] return by setting the CONTROL register.\n    ; *\n    ; * The initial stack of the current running task is as follows:\n    ; *\n    ; *                     POP: Restore the context of the current running task ===>|\n    ; *                                                                 High addr--->|\n    ; *                                                       Bottom of the stack--->|\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n    ; *           |<---           skip          --->|<---     copy to R0-R7      --->|\n    ; *                                                                R12 to PSP--->|\n    ; *                                        Stack pointer after LOS_StartToRun--->|\n    ; */\n    LDR     R12, [R1]\n    ADD     R12, R12, #36          ; skip R4-R11, PRIMASK.\n    IF      {FPU} != \"SoftVFP\"\n    ADD     R12, R12, #4           ; if FPU exist, skip EXC_RETURN.\n    ENDIF\n    LDMFD   R12!, {R0-R7}\n\n    ;/**\n    ; * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n    ; */\n    MSR     PSP, R12\n\n    ;/**\n    ; * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n    ; */\n    MOV     R12, #2\n    MSR     CONTROL, R12\n\n    ;/**\n    ; * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n    ; */\n    MOV     LR, R5\n    CPSIE   I\n\n    ;/**\n    ; * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n    ; * of the main function will be destroyed and will never be returned.\n    ; */\n    BX      R6\n\n;****************************************************************************************\n; Function:\n;        UINTPTR LOS_IntLock(VOID);\n; Description:\n;        Disable all interrupts except Reset,NMI and HardFault.\n;        The value of currnet interruption state will be returned to the caller to save.\n;\n; Function:\n;        VOID LOS_IntRestore(UINTPTR uvIntSave);\n; Description:\n;        Restore the locked interruption of LOS_IntLock.\n;        The caller must pass in the value of interruption state previously saved.\n;****************************************************************************************\nLOS_IntLock\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\nLOS_IntUnLock\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\nLOS_IntRestore\n    MSR     PRIMASK, R0\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID osTaskSchedule(VOID);\n; Description:\n;        Start the task swtich process by software trigger PendSV interrupt.\n;****************************************************************************************\nosTaskSchedule\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID PendSV_Handler(VOID);\n; Description:\n;        PendSV interrupt handler, switch the context of the task.\n;        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n;               to its own stack.\n;        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n;                from its own stack.\n;****************************************************************************************\nPendSV_Handler\n    ;/**\n    ; * R12: Save the interruption state of the current running task.\n    ; * Disable all interrupts except Reset,NMI and HardFault\n    ; */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    ;/**\n    ; * Call task switch hook.\n    ; */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CBZ     R2, TaskSwitch\n    PUSH    {R12, LR}\n    BLX     R2\n    POP     {R12, LR}\n\nTaskSwitch\n    ;/**\n    ; * R0 = now stack pointer of the current running task.\n    ; */\n    MRS     R0, PSP\n\n    ;/**\n    ; * Save the stack frame([S16-S31],R4-R11) of the current running task.\n    ; * R12 save the PRIMASK value of the current running task.\n    ; * NOTE: 1. Before entering the exception handler function, these registers\n    ; *       ([NO_NAME,FPSCR,S15-S0],xPSR,PC,LR,R12,R3-R0) have been automatically\n    ; *       saved by the CPU in the stack of the current running task.\n    ; *       2. If lazy stacking is enabled, space is reserved on the stack for\n    ; *       the floating-point context(FPSCR,S15-S0), but the floating-point state\n    ; *       is not saved. when the floating-point instruction(VSTMDBEQ  R0!, {D8-D15})\n    ; *       is executed, the floating-point context(FPSCR,S15-S0) is first saved into\n    ; *       the space reserved on the stack. In other words, the instruction\n    ; *       'VSTMDBEQ  R0!, {D8-D15}' will trigger the CPU to save 'FPSCR,S15-S0' first.\n    ; *\n    ; * The stack of the current running task is as follows:\n    ; *\n    ; *   |<=== PUSH: Save the context of the current running task\n    ; *   |                                                                     High addr--->|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; *   |                                                         [   lazy stacking    ]|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *                                        Stack pointer before entering exception--->|\n    ; *                                       |<---           cpu auto saved          --->|\n    ; *                                       |<---PSP to R0\n    ; *   |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n    ; */\n    IF      {FPU} != \"SoftVFP\"     ; if FPU exist.\n    TST     R14, #0x10             ; if the task using the FPU context, push s16-s31.\n    IT      EQ\n    VSTMDBEQ  R0!, {D8-D15}\n    STMFD   R0!, {R14}             ; save EXC_RETURN.\n    ENDIF\n    STMFD   R0!, {R4-R12}          ; save the core registers and PRIMASK.\n\n    ;/**\n    ; * R5,R8.\n    ; */\n    LDR     R5, =g_stLosTask\n    MOV     R8, #OS_TASK_STATUS_RUNNING\n\n    ;/**\n    ; * Save the stack pointer of the current running task to TCB.\n    ; * (g_stLosTask.pstRunTask->pStackPointer = R0)\n    ; */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    ;/**\n    ; * Clear the RUNNING state of the current running task.\n    ; * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R6, #4]\n    BIC     R7, R7, R8\n    STRH    R7, [R6, #4]\n\n    ;/**\n    ; * Switch the current running task to the next running task.\n    ; * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n    ; */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    ;/**\n    ; * Set the RUNNING state of the next running task.\n    ; * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R0, #4]\n    ORR     R7, R7, R8\n    STRH    R7, [R0, #4]\n\n    ;/**\n    ; * Restore the stack pointer of the next running task from TCB.\n    ; * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n    ; */\n    LDR     R1, [R0]\n\n    ;/**\n    ; * Restore the stack frame(R4-R11,[S16-S31]) of the next running task.\n    ; * R12 restore the PRIMASK value of the next running task.\n    ; * NOTE: After exiting the exception handler function, these registers\n    ; *       (PC,xPSR,R0-R3,R12,LR,[S0-S15,FPSCR,NO_NAME]) will be automatically\n    ; *       restored by the CPU from the stack of the next running task.\n    ; *\n    ; * 1. The stack of the next running task is as follows:\n    ; *\n    ; *                             POP: Restore the context of the next running task ===>|\n    ; *                                                                         High addr--->|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                          R1 to PSP--->|\n    ; *                                       |<---        cpu auto restoring         --->|\n    ; *                                          Stack pointer after exiting exception--->|\n    ; *\n    ; * 2. If the next running task is run for the first time, the stack is as follows:\n    ; *\n    ; *                        POP: Restore the context of the next running task ===>|\n    ; *                                                                 High addr--->|\n    ; *                                                       Bottom of the stack--->|\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                                R1 to PSP--->|\n    ; *                                             |<---   cpu auto restoring   --->|\n    ; *                                     Stack pointer after exiting exception--->|\n    ; */\n    LDMFD   R1!, {R4-R12}          ; restore the core registers and PRIMASK.\n    IF      {FPU} != \"SoftVFP\"     ; if FPU exist.\n    LDMFD   R1!, {R14}             ; restore EXC_RETURN.\n    TST     R14, #0x10             ; if the task using the FPU context, pop s16-s31.\n    IT      EQ\n    VLDMIAEQ  R1!, {D8-D15}\n    ENDIF\n\n    ;/**\n    ; * Set the stack pointer of the next running task to PSP.\n    ; */\n    MSR     PSP, R1\n\n    ;/**\n    ; * Restore the interruption state of the next running task.\n    ; */\n    MSR     PRIMASK, R12\n    BX      LR\n\n    ALIGN\n    END\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m4/keil/los_hw_exc_keil.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    PRESERVE8\n    AREA    |.text|, CODE, READONLY\n    THUMB\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  NMI_Handler\n    EXPORT  HardFault_Handler\n    EXPORT  MemManage_Handler\n    EXPORT  BusFault_Handler\n    EXPORT  UsageFault_Handler\n    EXPORT  SVC_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT osExcHandleEntry\n    IMPORT g_uwExcTbl\n    IMPORT g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_EXC_CAUSE_NMI            EQU   18\nOS_EXC_CAUSE_HARDFAULT      EQU   19\nOS_EXC_CAUSE_MEMFAULT       EQU   20\nOS_EXC_CAUSE_BUSFAULT       EQU   21\nOS_EXC_CAUSE_USAGEFAULT     EQU   22\nOS_EXC_CAUSE_SVC            EQU   23\n\nHF_DEBUGEVT                 EQU   24\nHF_VECTBL                   EQU   25\n\nFLAG_ADDR_VALID             EQU   0x10000       ; bit 16\nFLAG_HWI_ACTIVE             EQU   0x20000       ; bit 17\nFLAG_NO_FLOAT               EQU   0x10000000    ; bit 28\n\nOS_NVIC_CFSR                EQU   0xE000ED28    ; include BusFault/MemFault/UsageFault State Regeister\nOS_NVIC_HFSR                EQU   0xE000ED2C    ; HardFault State Regeister\nOS_NVIC_BFAR                EQU   0xE000ED38\nOS_NVIC_MMFAR               EQU   0xE000ED34\nOS_NVIC_ACT_BASE            EQU   0xE000E300\nOS_NVIC_SHCSRS              EQU   0xE000ED24\nOS_NVIC_SHCSR_MASK          EQU   0xC00         ; SYSTICKACT and PENDSVACT\n\n;****************************************************************************************\n; Function:\n;        VOID NMI_Handler(VOID);\n; Description:\n;        NMI Handler.\n;****************************************************************************************\nNMI_Handler\n    ;/**\n    ; * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +------------------------------------------------------+------------------------+\n    ; * |                          31-8                        |          7-0           |\n    ; * +------------------------------------------------------+------------------------+\n    ; * |                          ---                         |    OS_EXC_CAUSE_NMI    |\n    ; * +------------------------------------------------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    MOV  R0, #OS_EXC_CAUSE_NMI\n    MOV  R1, #0\n    B  osExcDispatch\n\n;****************************************************************************************\n; Function:\n;        VOID HardFault_Handler(VOID);\n; Description:\n;        HardFault Handler.\n;****************************************************************************************\nHardFault_Handler\n    ;/**\n    ; * Check HardFault state register.\n    ; *\n    ; * HFSR:\n    ; * +----------+--------+--------+--------+-------+\n    ; * |    31    |   30   | 29 - 2 |    1   |   0   |\n    ; * +----------+--------+--------+--------+-------+\n    ; * | DEBUGEVT | FORCED |   --   | VECTBL |   --  |\n    ; * +----------+--------+--------+--------+-------+\n    ; */\n    MOV  R0, #OS_EXC_CAUSE_HARDFAULT\n    LDR  R2, =OS_NVIC_HFSR\n    LDR  R2, [R2]\n\n    ;/**\n    ; * Check whether HardFault are triggered by debugging events.\n    ; * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                 31-16                  |    15-8     |          7-0           |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                  ---                   | HF_DEBUGEVT | OS_EXC_CAUSE_HARDFAULT |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    MOV  R1, #HF_DEBUGEVT\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x80000000\n    BNE  osExcDispatch                 ; DEBUGEVT\n\n    ;/**\n    ; * Check whether HardFault is caused by the failure of the fetch vector.\n    ; * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                 31-16                  |    15-8     |          7-0           |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                  ---                   |  HF_VECTBL  | OS_EXC_CAUSE_HARDFAULT |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    AND  R0, R0, #0x000000FF\n    MOV  R1, #HF_VECTBL\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x00000002\n    BNE  osExcDispatch                  ; VECTBL\n\n    ;/**\n    ; * If it`s not DEBUGEVT and VECTBL, that is FORCED, then read the CFSR register to\n    ; * check BusFault, MemFault and UsageFault.\n    ; * R0: OS_EXC_CAUSE_HARDFAULT\n    ; *\n    ; * CFSR:\n    ; * +----------------+--------+--------+\n    ; * |      31-16     |  15-8  |  7-0   |\n    ; * +----------------+--------+--------+\n    ; * |      UFSR      |  BFSR  |  MFSR  |\n    ; * +----------------+--------+--------+\n    ; */\n    AND  R0, R0, #0x000000FF\n\n    LDR  R2, =OS_NVIC_CFSR\n    LDR  R2, [R2]\n\n    TST  R2, #0x8000                   ; BFSR->BFARVALID\n    BNE  _HFBusFault                   ; BusFault\n\n    TST  R2, #0x80                     ; MFSR->MMARVALID\n    BNE  _HFMemFault                   ; MemFault\n\n    ;/**\n    ; * BFARVALID and MMARVALID flag both invalid.\n    ; * R12: 0 --- The error address is invalid.\n    ; */\n    MOV  R12, #0\n    B    osHFExcCommonBMU\n\n    ;/**\n    ; * BFARVALID flag valid, read BFAR register.\n    ; * R1 : BFAR value --- The address value of a bus error.\n    ; * R12: The error address is valid.\n    ; */\n_HFBusFault\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n    B    osHFExcCommonBMU\n\n    ;/**\n    ; * MMARVALID flag valid, read MMFAR register.\n    ; * R1 : MMFAR value --- The address value of memory management error.\n    ; * R12: The error address is valid.\n    ; */\n_HFMemFault\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n\n    ;/**\n    ; * osHFExcCommonBMU: --- Get specific error status from table g_uwExcTbl, stored in R0.\n    ; * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |       31-17       |        16       |        15-8      |          7-0           |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |        ---        | FLAG_ADDR_VALID | Error state code | OS_EXC_CAUSE_HARDFAULT |\n    ; * |                   |        or       |       in         |                        |\n    ; * |                   |   0(invalid)    | table g_uwExcTbl |                        |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n    ; *         else invalid.\n    ; */\nosHFExcCommonBMU\n    CLZ  R2, R2\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R2\n    LDRB R2, [R3]\n    ORR  R0, R0, R2, LSL #0x8\n    ORR  R0, R0, R12\n    B    osExcDispatch\n\n;****************************************************************************************\n; Function:\n;        VOID SVC_Handler(VOID);\n; Description:\n;        SVC Handler.\n;****************************************************************************************\nSVC_Handler\n    TST   LR, #0x4                     ; EXC_RETURN[b2] --- PSP or MSP\n    ITE   EQ\n    MRSEQ R0, MSP\n    MRSNE R0, PSP\n    LDR   R1, [R0, #24]                ; The PC value in the stack frame\n    LDRB  R0, [R1, #-2]                ; R0: The number of SVC (0 - 255)\n    MOV   R1, #0\n    ;B     osExcDispatch\n_SvcLoop\n    B     _SvcLoop\n\n;****************************************************************************************\n; Function:\n;        VOID BusFault_Handler(VOID);\n; Description:\n;        BusFault Handler.\n;****************************************************************************************\nBusFault_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_BUSFAULT\n\n    TST  R0, #0x8000                   ; BFSR->BFARVALID\n    BEQ  _ExcBusNoADDR\n\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]                      ; R1:  The value of BFAR\n    MOV  R12, #FLAG_ADDR_VALID         ; R12: BusFault addr valid\n    AND  R0, R0, #0x3F00               ; R0:  Reserved the b13-b8 of the BFSR\n    B    osExcCommonBMU\n\n_ExcBusNoADDR\n    MOV  R12, #0                       ; R12: BusFault addr invalid\n    AND  R0, R0, #0x3F00               ; R0:  Reserved the b13-b8 of the BFSR\n    B    osExcCommonBMU\n\n;****************************************************************************************\n; Function:\n;        VOID MemManage_Handler(VOID);\n; Description:\n;        MemManage Handler.\n;****************************************************************************************\nMemManage_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_MEMFAULT\n\n    TST  R0, #0x80                     ; MFSR->MMARVALID\n    BEQ  _ExcMemNoADDR\n\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]                      ; R1:  The value of MMFAR\n    MOV  R12, #FLAG_ADDR_VALID         ; R12: MemFault addr valid\n    AND  R0, R0, #0x3B                 ; R0:  Reserved the b5-b0 of the MFSR\n    B    osExcCommonBMU\n\n_ExcMemNoADDR\n    MOV  R12, #0                       ; R12: MemFault addr invalid\n    AND  R0, R0, #0x3B                 ; R0:  Reserved the b5-b0 of the MFSR\n    B    osExcCommonBMU\n\n;****************************************************************************************\n; Function:\n;        VOID UsageFault_Handler(VOID);\n; Description:\n;        UsageFault Handler.\n;****************************************************************************************\nUsageFault_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_USAGEFAULT\n\n    MOV  R1, #0x030F\n    LSL  R1, R1, #16\n    AND  R0, R0, R1                    ; R0:  reserved UFSR\n    MOV  R12, #0                       ; R12: Fault addr invalid\n\n    ;/**\n    ; * osExcCommonBMU: BusFault_Handler,MemManage_Handler and UsageFault_Handler share.\n    ; * Get specific error status from table g_uwExcTbl, stored in R0.\n    ; * Before executing osExcDispatch, the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |       31-17       |        16       |        15-8      |          7-0           |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |        ---        | FLAG_ADDR_VALID | Error state code |OS_EXC_CAUSE_BUSFAULT or|\n    ; * |                   |        or       |       in         |OS_EXC_CAUSE_MEMFAULT or|\n    ; * |                   |   0(invalid)    | table g_uwExcTbl |OS_EXC_CAUSE_USAGEFAULT |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n    ; *         else invalid.\n    ; */\nosExcCommonBMU\n    CLZ  R0, R0\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R0\n    LDRB R0, [R3]\n    LSL  R0, R0, #0x8\n    ORR  R0, R0, R2\n    ORR  R0, R0, R12\n\n    ;****************************************************************************************\n    ; osExcDispatch: NMI_Handler, HardFault_Handler, SVC_Handler, BusFault_Handler, MemManage_Handler,\n    ;                  UsageFault_Handler sharing.\n    ;****************************************************************************************\n\n    ;/**\n    ; * When executing osExcDispatch, R0, R1 will be used.\n    ; * The possible values of R0 and R1 are as follows.\n    ; *\n    ; * < R0 >:\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * |     31-17      |        16       |         15-8        |          7-0           |\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * |                | FLAG_ADDR_VALID | Error state code in | OS_EXC_CAUSE_HARDFAULT |\n    ; * |      ---       |       or        | table g_uwExcTbl    |or OS_EXC_CAUSE_MEMFAULT|\n    ; * |                |   0(invalid)    | or      HF_DEBUGEVT |or OS_EXC_CAUSE_BUSFAULT|\n    ; * |                |                 | or      HF_VECTBL   |or OS_EXC_CAUSE_NMI  or |\n    ; * |                |                 |                     | OS_EXC_CAUSE_USAGEFAULT|\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * b17: FLAG_HWI_ACTIVE\n    ; * b28: FLAG_NO_FLOAT\n    ; * NOTE: b17 and b28 will be set later.\n    ; *\n    ; * < R1 >:\n    ; * If the bit16 of R0 is 1, then R1 is the value of BFAR or MMFAR, otherwise the\n    ; * value in R1 is invalid.\n    ; *\n    ; */\nosExcDispatch\n    LDR   R2, =OS_NVIC_ACT_BASE\n    MOV   R12, #8                      ; #8: externel interrupt active check loop counter(#0 - #239)\n\n_hwiActiveCheck\n    LDR   R3, [R2]                     ; R3 store the value of externel interrupt active status\n    CMP   R3, #0\n    BEQ   _hwiActiveCheckNext\n\n    ;/**\n    ; * Exception occured in external interrupt.\n    ; */\n    ORR   R0, R0, #FLAG_HWI_ACTIVE     ; R0[b17] = 1, externel interrupt active valid    &&&&&&&&&&\n    RBIT  R2, R3                       ; bit reversal\n    CLZ   R2, R2\n    RSB   R12, R12, #8                 ; R12 = 8 - R12\n    ADD   R2, R2, R12, LSL #5          ; R2: external interrupt number as uwPid\n\n    ;/**\n    ; * Interrupts and initialization phase always use MSP.\n    ; */\n_ExcInMSP\n    TST   LR, #0x10                    ; EXC_RETURN[b4] --- FPU(0) or without FPU(1)\n    BNE   _NoFloatInMsp\n\n    ;/**\n    ; * Before executing instruction 'B _handleEntry', MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *    | S16-S31,R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *    |<---R13           Initial R13--->|<---                #104               --->|<---SAVED_SP\n    ; *                                      |              (CPU auto saved)             |\n    ; *\n    ; */\n    ADD   R3, R13, #104                ; #104: skip [R0-xPSR,D0-D7,FPSCR,NO_NAME]\n    PUSH  {R3}                         ; push [SAVED_SP]: MSP+104 = Stack pointer in MSP before entering the exception\n    MRS   R12, PRIMASK\n    PUSH {R4-R12}                      ; push R4-R11,PRIMASK to MSP\n    VPUSH {D8-D15}                     ; push D8-D15 to MSP\n    B     _handleEntry\n\n    ;/**\n    ; * Before executing instruction 'B _handleEntry', MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                                 | R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                          R13--->|          Initial R13--->|<---      #32     --->|<---SAVED_SP\n    ; *                                                           |   (CPU auto saved)   |\n    ; *\n    ; */\n_NoFloatInMsp\n    ADD   R3, R13, #32                 ; #32: skip [R0-R3,R12,LR,PC,xPSR]\n    PUSH  {R3}                         ; push [SAVED_SP]: MSP+32 = Stack pointer in MSP before entering the exception\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK to MSP\n    ORR   R0, R0, #FLAG_NO_FLOAT       ; R0[b28] = 1, no FPU    &&&&&&&&&&\n    B     _handleEntry\n\n_hwiActiveCheckNext\n    ADD   R2, R2, #4                   ; next NVIC ACT ADDR\n    SUBS  R12, R12, #1\n    BNE   _hwiActiveCheck\n\n    ;/**\n    ; * Not in externel interrupt, check whether it is SysTick or PendSV.\n    ; */\n    LDR   R2, =OS_NVIC_SHCSRS\n    LDRH  R2,[R2]\n    LDR   R3,=OS_NVIC_SHCSR_MASK\n    AND   R2, R2, R3\n    CMP   R2, #0\n    BNE   _ExcInMSP                    ; SysTick or PendSV active\n\n    ;/**\n    ; * Check whether an exception occurs during the initialization phase.\n    ; * If g_bTaskScheduled == 0, it is in the initialization phase.\n    ; */\n    LDR  R2, =g_bTaskScheduled\n    LDR  R2, [R2]\n    TST  R2, #1\n    BEQ  _ExcInMSP                     ; initialization phase use MSP\n\n    ;/**\n    ; * Exception occured in Task.\n    ; */\n    TST   LR, #0x10\n    BNE   _NoFloatInPsp\n\n    ;/**\n    ; * Before executing _handleEntry, MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *     | S16-S31,R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *     |<---R13                         |<---                #104               --->|<---Initial R13\n    ; *                                      |              (copied from PSP)            |\n    ; *                                                                    R2(no use)--->|\n    ; *\n    ; * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME.\n    ; */\n    MOV   R2, R13\n    SUB   R2, R2, #8                   ; #8: reserved for [FPSCR,NO_NAME]\n    SUB   R13, #104                    ; #104: MSP reserved, used to store stack frame in PSP\n\n    MRS   R3, PSP\n    ADD   R12, R3, #104                ; PSP+104 = Stack pointer of the task before entering the exception\n    PUSH  {R12}                        ; push task SP to MSP\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK of the current running task to MSP\n    VPUSH {D8-D15}                     ; push D8-D15 of the currnent running task to MSP\n\n    ;/* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3!, {R4-R11}                ; restore stack frame[R0-xPSR] of PSP to R4-R11\n    VLDMIA  R3!, {D8-D15}              ; restore stack frame[D0-D7] of PSP to D8-D15\n    VSTMDB  R2!, {D8-D15}              ; save stack frame[D0-D7] to MSP\n    STMFD R2!, {R4-R11}                ; save stack frame[R0-xPSR] to MSP\n    LDMFD R3, {R4-R5}                  ; restore stack frame[FPSCR,NO_NAME] to R4-R5\n    ADD   R2, R2, #104                 ; skip stack frame\n    STMFD R2, {R4-R5}                  ; save stack frame[FPSCR,NO_NAME] to MSP\n    B     _handleEntry\n\n    ;/**\n    ; * Before executing _handleEntry, MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                                  | R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                           R13--->|                        |<---      #32     --->|<---Initial R13\n    ; *                                                           |  (copied from PSP)   |\n    ; *                                                           |<---R2(no use)\n    ; *\n    ; * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR.\n    ; */\n_NoFloatInPsp\n    MOV   R2, R13\n    SUB   R13, #32                     ; #32: MSP reserved, used to store stack frame in PSP\n\n    MRS   R3, PSP\n    ADD   R12, R3, #32                 ; PSP+32 = Stack pointer of the task before entering the exception\n    PUSH  {R12}                        ; push task SP to MSP\n\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK of the current running task to MSP\n\n    ;/* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3, {R4-R11}                 ; restore stack frame of PSP to R4-R11\n    STMFD R2!, {R4-R11}                ; save stack frame to MSP\n    ORR   R0, R0, #FLAG_NO_FLOAT       ; R0[b28] = 1, no FPU    &&&&&&&&&&\n\n    ;/**\n    ; * _handleEntry: Call osExcHandleEntry\n    ; * param1: R0 --- b28:    FLAG_NO_FLOAT.\n    ; *                b17:    FLAG_HWI_ACTIVE.\n    ; *                b16:    FLAG_ADDR_VALID.\n    ; *                b15-b8: Error state code in table g_uwExcTbl or HF_DEBUGEVT or HF_VECTBL.\n    ; *                b7-b0:  OS_EXC_CAUSE_HARDFAULT or OS_EXC_CAUSE_NMI or OS_EXC_CAUSE_MEMFAULT\n    ; *                        or OS_EXC_CAUSE_BUSFAULT or OS_EXC_CAUSE_USAGEFAULT.\n    ; * param2: R1 --- The value of BFAR or MMFAR if R0[b16] = 1, otherwise invalid.\n    ; * param3: R2 --- external interrupt number(0-239) if R0[b17] = 1, otherwise invalid.\n    ; * param4: R3 --- Point to the top of the stack(R4 or S16) that the exception stack frame in MSP.\n    ; */\n_handleEntry\n    MOV R3, R13\n    CPSID I\n    CPSID F\n    B  osExcHandleEntry\n\n    NOP\n    ALIGN\n    END\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m4/los_exc.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n\n#include \"los_exc.inc\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n#if (LOSCFG_PLATFORM_EXC == YES)\n\nUINT32 g_uwCurNestCount = 0;\nEXC_INFO_S m_stExcInfo;\n/*\n * CFSR register, include UFSR,BFSR and MFSR.\n *\n * +----------------------------------------------------------------------------------+\n * |                                      UFSR                                        |\n * |-----------+-----------+-----------+-------+------+-------+----------+------------|\n * |  31 - 26  |     25    |     24    | 23-20 |  19  |   18  |    17    |     16     |\n * |-----------+-----------+-----------+-------+------+-------+----------+------------|\n * |    ---    | DIVBYZERO | UNALIGNED |  ---  | NOCP | INVPC | INVSTATE | UNDEFINSTR |\n * +----------------------------------------------------------------------------------+\n *\n * +----------------------------------------------------------------------------------+\n * |                                     BFSR                                         |\n * |-----------+-----+--------+--------+----------+-------------+-----------+---------|\n * |     15    |  14 |   13   |   12   |    11    |      10     |     9     |    8    |\n * |-----------+-----+--------+--------+----------+-------------+-----------+---------|\n * | BFARVALID | --- | LSPERR | STKERR | UNSTKERR | IMPRECISERR | PRECISERR | IBUSERR |\n * +----------------------------------------------------------------------------------+\n *\n * +----------------------------------------------------------------------------------+\n * |                                     MFSR                                         |\n * |-----------+-------+---------+---------+-----------+-------+----------+-----------|\n * |     7     |   6   |    5    |    4    |     3     |   2   |    1     |     0     |\n * |-----------+-------+---------+---------+-----------+-------+----------+-----------|\n * | MMARVALID |  ---  | MLSPERR | MSTKERR | MUNSTKERR |  ---  | DACCVIOL | ICACCVIOL |\n * +----------------------------------------------------------------------------------+\n */\nUINT8 g_uwExcTbl[32] =\n{\n    0, 0, 0, 0, 0, 0, OS_EXC_UF_DIVBYZERO, OS_EXC_UF_UNALIGNED,\n    0, 0, 0, 0, OS_EXC_UF_NOCP, OS_EXC_UF_INVPC, OS_EXC_UF_INVSTATE, OS_EXC_UF_UNDEFINSTR,\n    0, 0, OS_EXC_BF_LSPERR, OS_EXC_BF_STKERR, OS_EXC_BF_UNSTKERR, OS_EXC_BF_IMPRECISERR, OS_EXC_BF_PRECISERR, OS_EXC_BF_IBUSERR,\n    0, 0, OS_EXC_MF_MLSPERR, OS_EXC_MF_MSTKERR, OS_EXC_MF_MUNSTKERR, 0, OS_EXC_MF_DACCVIOL, OS_EXC_MF_IACCVIOL\n};\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\nVOID *m_puwExcContent;\nUINT32 g_uwArraySize = 0;\nEXC_INFO_ARRAY_S m_stExcArray[OS_EXC_TYPE_MAX - 1];\nstatic VOID osExcSave2DDR(VOID);\n#endif\n\nextern VOID LOS_Reboot(VOID);\n\n/*****************************************************************************\n Function    : osExcInfoDisplay\n Description : EXC info display\n Input       : pstExc --- Pointer to the EXC data\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcInfoDisplay(EXC_INFO_S *pstExc)\n{\n    PRINT_ERR(\"Phase      = 0x%x\\n\", pstExc->usPhase);\n    PRINT_ERR(\"Type       = 0x%x\\n\", pstExc->usType);\n    PRINT_ERR(\"FaultAddr  = 0x%x\\n\", pstExc->uwFaultAddr);\n    PRINT_ERR(\"ThrdPid    = 0x%x\\n\", pstExc->uwThrdPid);\n    PRINT_ERR(\"R0         = 0x%x\\n\", pstExc->pstContext->uwR0);\n    PRINT_ERR(\"R1         = 0x%x\\n\", pstExc->pstContext->uwR1);\n    PRINT_ERR(\"R2         = 0x%x\\n\", pstExc->pstContext->uwR2);\n    PRINT_ERR(\"R3         = 0x%x\\n\", pstExc->pstContext->uwR3);\n    PRINT_ERR(\"R4         = 0x%x\\n\", pstExc->pstContext->uwR4);\n    PRINT_ERR(\"R5         = 0x%x\\n\", pstExc->pstContext->uwR5);\n    PRINT_ERR(\"R6         = 0x%x\\n\", pstExc->pstContext->uwR6);\n    PRINT_ERR(\"R7         = 0x%x\\n\", pstExc->pstContext->uwR7);\n    PRINT_ERR(\"R8         = 0x%x\\n\", pstExc->pstContext->uwR8);\n    PRINT_ERR(\"R9         = 0x%x\\n\", pstExc->pstContext->uwR9);\n    PRINT_ERR(\"R10        = 0x%x\\n\", pstExc->pstContext->uwR10);\n    PRINT_ERR(\"R11        = 0x%x\\n\", pstExc->pstContext->uwR11);\n    PRINT_ERR(\"R12        = 0x%x\\n\", pstExc->pstContext->uwR12);\n    PRINT_ERR(\"PriMask    = 0x%x\\n\", pstExc->pstContext->uwPriMask);\n    PRINT_ERR(\"SP         = 0x%x\\n\", pstExc->pstContext->uwSP);\n    PRINT_ERR(\"LR         = 0x%x\\n\", pstExc->pstContext->uwLR);\n    PRINT_ERR(\"PC         = 0x%x\\n\", pstExc->pstContext->uwPC);\n    PRINT_ERR(\"xPSR       = 0x%x\\n\", pstExc->pstContext->uwxPSR);\n\n    PRINT_ERR(\"\\nplease use the addr2line tool to analyze the call stack on PC:\\n\");\n    PRINT_ERR(\"addr2line -e (xxx.axf/xxx.elf/xxx.out) -a -f \");\n    for (UINT32 i = 0; i < pstExc->uwCallStackDepth; i++)\n    {\n        PRINT_ERR(\"%#x \", pstExc->uwCallStack[i]);\n    }\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcCallStackAnalysis\n Description : Call stack analysis\n Input       : pstExc  ---  point to exception info\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcCallStackAnalysis(EXC_INFO_S *pstExc)\n{\n    UINT32 uwSP;\n    UINT32 uwLR;\n    UINT32 uwPC;\n    UINT32 uwStackStartAddr;\n    UINT32 uwStackSize;\n    UINT32 uwDepth = 0;\n    BOOL   bFirstLrValid = FALSE;\n\n    uwSP = pstExc->pstContext->uwSP;  /* sp pointer before entering exception */\n\n    /*\n     * save first and second depth\n     * first: PC before entering exception\n     * second: (LR - 4) before entering exception\n     * NOTE: If an exception occurs in the interrupt, LR may be EXC_RETURN, so we must make sure\n     *       that LR is valid, exclude EXC_RETURN.\n     */\n    pstExc->uwCallStack[uwDepth++] = pstExc->pstContext->uwPC;\n    if ((pstExc->pstContext->uwLR >= LOSCFG_EXC_CODE_START_ADDR) && \\\n        (pstExc->pstContext->uwLR <= LOSCFG_EXC_CODE_START_ADDR + LOSCFG_EXC_CODE_SIZE))\n    {\n        pstExc->uwCallStack[uwDepth++] = pstExc->pstContext->uwLR - sizeof(VOID *);  /* lr = pc + 4 */\n        bFirstLrValid = TRUE;\n    }\n\n    /*\n     * get the start address and size of the stack before entering the exception\n     */\n    if (pstExc->usPhase == OS_EXC_IN_TASK)  /* task use PSP */\n    {\n        uwStackStartAddr = g_stLosTask.pstRunTask->uwTopOfStack;\n        uwStackSize = g_stLosTask.pstRunTask->uwStackSize;\n    }\n    else  /* init and interrupt use MSP */\n    {\n        uwStackStartAddr = LOSCFG_EXC_MSP_START_ADDR;\n        uwStackSize = LOSCFG_EXC_MSP_SIZE;\n    }\n\n    /*\n     * check stack overflow, if so, compensate for overflow, readjust stack start address and size.\n     */\n    if (uwSP < uwStackStartAddr)  /* stack top overflow */\n    {\n        if (pstExc->usPhase == OS_EXC_IN_TASK)\n        {\n            PRINT_ERR(\"task %s stack top overflow\\n\", g_stLosTask.pstRunTask->pcTaskName);\n        }\n        else\n        {\n            PRINT_ERR(\"MSP top overflow\\n\");\n        }\n        uwStackSize += (uwStackStartAddr - uwSP);  /* compensate overflow size */\n        uwStackStartAddr = uwSP;  /* readjust stack start address */\n    }\n\n    /*\n     * Traverses the entire stack from the top of the stack to the bottom of the stack,\n     * find all LR.\n     */\n    for (; uwSP < uwStackStartAddr + uwStackSize; uwSP += sizeof(UINT32))\n    {\n        uwLR = *(UINT32 *)uwSP;\n        if (uwLR % 2 == 0)  /* Thumb instruction, LR bit0 == 1 */\n        {\n            continue;\n        }\n\n        /*\n         * It may be LR, which must be further determined based on the start address\n         * and end address of the code segment.\n         */\n        if ((uwLR >= LOSCFG_EXC_CODE_START_ADDR) && (uwLR <= LOSCFG_EXC_CODE_START_ADDR + LOSCFG_EXC_CODE_SIZE) \\\n            && (uwDepth < LOSCFG_EXC_CALL_STACK_ANALYSIS_MAX_DEPTH))\n        {\n            uwPC = uwLR - sizeof(VOID *);  /* lr = pc + 4 */\n            /* the second depth(first LR) has been saved */\n            if ((uwDepth == 2) && (uwPC == pstExc->uwCallStack[1]) && (bFirstLrValid == TRUE))\n            {\n                continue;\n            }\n            pstExc->uwCallStack[uwDepth++] = uwPC;\n        }\n    }\n    pstExc->uwCallStackDepth = uwDepth;  /* save call stack depth */\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcHandleEntry\n Description : EXC handler entry\n Input       : uwExcType     --- EXC type\n             : uwFaultAddr   --- The address of an accurate address access error\n             : uwPid         --- Interrupt number\n             : puwExcBufAddr --- Point to the stack frame without FPU\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcHandleEntry(UINT32 uwExcType, UINT32 uwFaultAddr, UINT32 uwPid, EXC_CONTEXT_S *pstExcBufAddr)\n{\n    /* uwExcType high 16 bits: 0x01 - uwFaultAddr valid, 0x02 - in hwi */\n    UINT16 usTmpFlag = (uwExcType >> 16) & 0xFFFF;\n\n    g_uwCurNestCount++;\n#if (LOSCFG_PLATFORM_HWI == YES)\n    extern UINT32 g_vuwIntCount;\n    g_vuwIntCount++;\n#endif\n\n    /* Save interrupt nesting times */\n    m_stExcInfo.usNestCnt = (UINT16)g_uwCurNestCount;\n    /* uwExcType low 16 bits: exc type */\n    m_stExcInfo.usType = (UINT16)uwExcType & 0xFFFF;\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    /* Initializing a pointer to save an exception context */\n    m_puwExcContent = (UINT32 *)m_aucTaskArray;\n#endif\n\n    /* Save the fault address when an exception occurs if it is valid */\n    if (usTmpFlag & OS_EXC_FLAG_FAULTADDR_VALID)\n    {\n        m_stExcInfo.uwFaultAddr = uwFaultAddr;\n    }\n    else\n    {\n        m_stExcInfo.uwFaultAddr = OS_EXC_IMPRECISE_ACCESS_ADDR;\n    }\n\n    /* Save the phase of the exception */\n    extern BOOL g_bTaskScheduled;\n    if (g_bTaskScheduled && (NULL !=  g_stLosTask.pstRunTask))\n    {\n        if (usTmpFlag & OS_EXC_FLAG_IN_HWI)\n        {\n            m_stExcInfo.usPhase = OS_EXC_IN_HWI;\n            m_stExcInfo.uwThrdPid = uwPid;  /* interrupt number */\n        }\n        else\n        {\n            m_stExcInfo.usPhase = OS_EXC_IN_TASK;\n            m_stExcInfo.uwThrdPid = g_stLosTask.pstRunTask->uwTaskID;  /* task id */\n        }\n    }\n    else\n    {\n        m_stExcInfo.usPhase = OS_EXC_IN_INIT;\n        m_stExcInfo.uwThrdPid = 0xffffffff;\n    }\n\n    /* uwExcType BIT_28: Wether or not to use FPU */\n    if(uwExcType & OS_EXC_FLAG_NO_FLOAT)\n    {\n        m_stExcInfo.usFpuContext = 0;\n    #if FPU_EXIST\n        /* NOTE: S16-S31, S0-S15,FPSCR,NO_NAME invalid */\n        m_stExcInfo.pstContext = (EXC_CONTEXT_S *)((UINT8 *)pstExcBufAddr - 64); /* point to S16 */\n    #else\n        m_stExcInfo.pstContext = pstExcBufAddr; /* point to uwR4 */\n    #endif\n    }\n    else\n    {\n        m_stExcInfo.usFpuContext = 1;\n        m_stExcInfo.pstContext = pstExcBufAddr;  /* point to S16 */\n    }\n\n    osExcCallStackAnalysis(&m_stExcInfo);\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    osExcSave2DDR();\n#endif\n\n    osExcInfoDisplay(&m_stExcInfo);\n\n    LOS_Reboot();\n}\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n/*****************************************************************************\n Function    : osExcSaveIntStatus\n Description : Save NVIC register group\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSaveIntStatus(VOID)\n{\n    /* Save exc type */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_NVIC;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save total size of NVIC */\n    *((UINT32 *)m_puwExcContent) = 0x164; // = OS_NVIC_INT_ENABLE_SIZE + OS_NVIC_INT_PEND_SIZE + OS_NVIC_INT_ACT_SIZE + OS_NVIC_INT_PRI_SIZE + 12 + 4 + 4\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save interrupt enable register group (start addr: 0xE000E100, size: 32bytes, CMSIS-Core: NVIC->ISER[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SETENA_BASE, OS_NVIC_INT_ENABLE_SIZE);\n    m_puwExcContent =(UINT8 *)m_puwExcContent + OS_NVIC_INT_ENABLE_SIZE;\n\n    /* Save interrupt pend register group (start addr: 0xE000E200, size: 32bytes, CMSIS-Core: NVIC->ISPR[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SETPEND_BASE, OS_NVIC_INT_PEND_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_PEND_SIZE;\n\n    /* Save interrupt active status register group (start addr: 0xE000E300, size: 32bytes, CMSIS-Core: NVIC->IABR[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_INT_ACT_BASE, OS_NVIC_INT_ACT_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_ACT_SIZE;\n\n    /* Save interrupt priority register group (start addr: 0xE000E400, size: 240bytes), CMSIS-Core: NVIC->IP[0 - 239] */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_PRI_BASE, OS_NVIC_INT_PRI_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_PRI_SIZE;\n\n    /* Save system exception priority register group (start addr: 0xE000ED18, size: 12bytes, CMSIS-Core: SCB->SHP[0 - 11]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_EXCPRI_BASE, 12);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 12;\n\n    /* Save system processing control and state register group (start addr: 0xE000ED24, size: 4bytes, CMSIS-Core: SCB->SHCSR) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SHCSR, 4);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save interrupt control and status register group (start addr: 0xE000ED04, size: 4bytes, CMSIS-Core: SCB->ICSR) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_INT_CTRL, 4);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcRegister\n Description : Register exception\n Input       : uwType  --- exception type\n             : pFunc   --- exception callback function\n             : pArg    --- exception save info arg, not pFunc\n Output      : None\n Return      : None\n *****************************************************************************/\nVOID osExcRegister(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg)\n{\n    EXC_INFO_ARRAY_S *pstExcInfo;\n\n    if (uwType == 0 || uwType >= OS_EXC_TYPE_MAX || pFunc == NULL)\n    {\n        PRINT_ERR(\"osExcRegister ERROR!\\n\");\n        return;\n    }\n\n    pstExcInfo = &(m_stExcArray[uwType - 1]);\n    pstExcInfo->uwType       = uwType;\n    pstExcInfo->pFnExcInfoCb = pFunc;\n    pstExcInfo->pArg         = pArg;\n    pstExcInfo->uwValid      = TRUE;\n}\n\n/*****************************************************************************\n Function    : osExcSaveSysInfo\n Description : Saving exception information by calling callback function recursively\n Input       : uwType  --- exception type(OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1)\n             : pFunc   --- callback function\n             : uwLoop  --- loop total count\n             : uwLen   --- The size of the data saved each time\n             : uwIdx   --- loop index\n Output      : None\n Return      : None\n *****************************************************************************/\nVOID osExcSaveSysInfo(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, UINT32 uwLoop, UINT32 uwLen, UINT32 uwIdx)\n{\n    UINT32 uwRet;\n    UINT32 uwBuffer[OS_EXC_MAX_BUF_LEN];\n\n    /* Save exception type and size */\n    *((UINT32 *)m_puwExcContent) = uwType;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n    *((UINT32 *)m_puwExcContent)  = uwLen * (uwLoop - uwIdx);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    for (; uwIdx < uwLoop; uwIdx++)\n    {\n        memset((VOID *)uwBuffer, 0, sizeof(UINT32) * OS_EXC_MAX_BUF_LEN);\n        uwRet = pFunc(uwIdx, (VOID *)uwBuffer);\n        if (LOS_OK == uwRet)\n        {\n            memcpy(m_puwExcContent, (VOID *)uwBuffer, uwLen);\n        }\n        m_puwExcContent =(UINT8 *)m_puwExcContent + uwLen;\n    }\n}\n\n/*****************************************************************************\n Function    : osExcSaveInfo\n Description : save exception info\n Input       : uwType  --- exception type(OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1)\n             : pFunc   --- exception callback\n             : pArg    --- register arg, used to generate the arg passed to the callback\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSaveInfo(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg)\n{\n    UINT32 uwLen;\n    UINT32 uwIdx;\n    UINT32 uwLoop;\n    UINT32 uwTaskSwitchCount = 0;\n    OS_TASK_SWITCH_INFO *pstTaskSwitchInfo;\n\n    switch(uwType)\n    {\n        case OS_EXC_TYPE_TSK:  /* save task info */\n            uwLen = sizeof(TSK_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        case OS_EXC_TYPE_QUE:  /* save queue info */\n            uwLen = sizeof(QUEUE_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        case OS_EXC_TYPE_NVIC:  /* save NVIC info */\n            (VOID)pFunc(0, 0);\n            goto END;\n\n        case OS_EXC_TYPE_TSK_SWITCH:  /* save task switch info */\n            pstTaskSwitchInfo = pArg;\n            uwTaskSwitchCount = pstTaskSwitchInfo->ucIsFull & 0x7F;\n            uwLen = sizeof(UINT32) + sizeof(CHAR) * LOS_TASK_NAMELEN; /* auwPID + acName */\n            if (pstTaskSwitchInfo->ucIsFull & 0x80)\n            {\n                uwIdx = pstTaskSwitchInfo->ucIdx;\n                uwLoop = uwIdx + uwTaskSwitchCount;\n            }\n            else\n            {\n                uwIdx = 0;\n                uwLoop = pstTaskSwitchInfo->ucIdx;\n            }\n            break;\n\n        case OS_EXC_TYPE_MEM:  /* save mem info */\n            uwLen = sizeof(MEM_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        default:\n            goto END;\n    }\n    osExcSaveSysInfo(uwType, (EXC_INFO_SAVE_CALLBACK)pFunc, uwLoop, uwLen, uwIdx);\nEND:\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcSave2DDR\n Description : Save exception info to RAM\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSave2DDR(VOID)\n{\n    UINT32 uwIdx = 0;\n    UINT32 uwExcContextSize;\n\n    if (m_stExcInfo.usFpuContext == 1)\n    {\n        uwExcContextSize = sizeof(EXC_CONTEXT_S);\n    }\n    else\n    {\n        uwExcContextSize = sizeof(EXC_CONTEXT_S) - 136; /* except FPU register */\n    }\n\n    memset(m_puwExcContent, 0xff, g_uwArraySize);\n\n    /* Cortex-M type */\n    *((UINT32 *)m_puwExcContent) = 4;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /*\n     * Save exception type: OS_EXC_TYPE_CONTEXT\n     */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_CONTEXT;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* The size of struct EXC_INFO_S(except member EXC_CONTEXT_S*) and exception context size */\n    *((UINT32 *)m_puwExcContent) = sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *) + uwExcContextSize;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save struct m_stExcInfo except m_stExcInfo.pstContext */\n    memcpy((VOID *)m_puwExcContent, (VOID *)&m_stExcInfo, sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *));\n    m_puwExcContent = (UINT8 *)m_puwExcContent + sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *);\n\n    /* Save struct EXC_CONTEXT_S */\n    if (m_stExcInfo.usFpuContext == 0)\n    {\n        #if FPU_EXIST\n        /* m_stExcInfo.pstContext: init --- point to S16, S16->S31 invalid\n         *                         + 64 --- point to uwR4\n         *                         copy uwR4 -> uwxPSR */\n        memcpy((VOID *)m_puwExcContent, (UINT8 *)m_stExcInfo.pstContext + 64, uwExcContextSize);\n        #else\n        memcpy((VOID *)m_puwExcContent, m_stExcInfo.pstContext, uwExcContextSize);\n        #endif\n    }\n    else\n    {\n        memcpy((VOID *)m_puwExcContent, m_stExcInfo.pstContext, uwExcContextSize);\n    }\n    m_puwExcContent = (UINT8 *)m_puwExcContent + uwExcContextSize;\n\n    /*\n     * Save exception type: OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1\n     */\n    for (uwIdx = 0; uwIdx < OS_EXC_TYPE_MAX - 1; uwIdx++)\n    {\n        if (m_stExcArray[uwIdx].uwValid == FALSE)\n        {\n            continue;\n        }\n        osExcSaveInfo(m_stExcArray[uwIdx].uwType, m_stExcArray[uwIdx].pFnExcInfoCb, m_stExcArray[uwIdx].pArg);\n    }\n\n    /*\n     * Save exception type: OS_EXC_TYPE_MAX\n     */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_MAX;\n    m_puwExcContent = (UINT8*)m_puwExcContent + 4;\n\n    return;\n}\n#endif /*(LOSCFG_SAVE_EXC_INFO == YES)*/\n\n/*****************************************************************************\n Function    : osExcInit\n Description : Initializes the EXC\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT_INIT VOID osExcInit(UINT32 uwArraySize)\n{\n#if (LOSCFG_PLATFORM_HWI == YES)\n    /* Register exception handler to interrupt vector table in RAM */\n    m_pstHwiForm[-14 + OS_SYS_VECTOR_CNT] = NMI_Handler;\n    m_pstHwiForm[-13 + OS_SYS_VECTOR_CNT] = HardFault_Handler;\n    m_pstHwiForm[-12 + OS_SYS_VECTOR_CNT] = MemManage_Handler;\n    m_pstHwiForm[-11 + OS_SYS_VECTOR_CNT] = BusFault_Handler;\n    m_pstHwiForm[-10 + OS_SYS_VECTOR_CNT] = UsageFault_Handler;\n    m_pstHwiForm[-5  + OS_SYS_VECTOR_CNT] = SVC_Handler;\n#endif\n\n    /* Enable USGFAULT(BIT_18), BUSFAULT(BIT_17), MEMFAULT(BIT_16) */\n    *(volatile UINT32 *)OS_NVIC_SHCSR |= 0x70000;\n\n    /* Enable DIV 0(BIT_4) exception, unaligned(BIT_3) disable */\n    *(volatile UINT32 *)OS_NVIC_CCR |= 0x10;\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    g_uwArraySize = uwArraySize;\n    osExcRegister((EXC_INFO_TYPE)OS_EXC_TYPE_NVIC, (EXC_INFO_SAVE_CALLBACK)osExcSaveIntStatus, NULL);\n#endif\n}\n\nVOID osBackTrace(VOID)\n{\n    return;\n}\n\n#endif /*(LOSCFG_PLATFORM_EXC == YES)*/\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m4/los_exc.inc",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#ifndef _LOS_EXC_INC\n#define _LOS_EXC_INC\n\n#include \"los_exc.ph\"\n#include \"los_sys.ph\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n#endif /* _LOS_EXC_INC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m4/los_exc.ph",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef _LOS_EXC_PH\n#define _LOS_EXC_PH\n\n#include \"los_exc.h\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n#if (LOSCFG_PLATFORM_EXC == YES)\n\ntypedef enum\n{\n    OS_EXC_TYPE_CONTEXT     = 0,\n    OS_EXC_TYPE_TSK         = 1,\n    OS_EXC_TYPE_QUE         = 2,\n    OS_EXC_TYPE_NVIC        = 3,\n    OS_EXC_TYPE_TSK_SWITCH  = 4,\n    OS_EXC_TYPE_MEM         = 5,\n    OS_EXC_TYPE_MAX         = 6\n} EXC_INFO_TYPE;\n\ntypedef struct tagExcInfoCallBackArray\n{\n    EXC_INFO_TYPE           uwType;\n    UINT32                  uwValid;\n    EXC_INFO_SAVE_CALLBACK  pFnExcInfoCb;\n    VOID*                   pArg;\n}EXC_INFO_ARRAY_S;\n\n\n#define OS_NVIC_SHCSR                       0xE000ED24\n#define OS_NVIC_CCR                         0xE000ED14\n\n#define OS_NVIC_INT_ENABLE_SIZE             0x20\n#define OS_NVIC_INT_PRI_SIZE                0xF0\n\n#define OS_NVIC_INT_PEND_SIZE               OS_NVIC_INT_ACT_SIZE\n#define OS_NVIC_INT_ACT_SIZE                OS_NVIC_INT_ENABLE_SIZE\n\n\n#define MAX_SCENE_INFO_SIZE     (8 + sizeof(EXC_INFO_S) - 4 + sizeof(EXC_CONTEXT_S))\n#define MAX_TSK_INFO_SIZE       (8 + sizeof(TSK_INFO_S) * (LOSCFG_BASE_CORE_TSK_LIMIT + 1))\n#define MAX_INT_INFO_SIZE       (8 + 0x164)\n\n#if (LOSCFG_BASE_IPC_QUEUE == YES)\n#define MAX_QUEUE_INFO_SIZE     (8 + sizeof(QUEUE_INFO_S) * LOSCFG_BASE_IPC_QUEUE_LIMIT)\n#else\n#define MAX_QUEUE_INFO_SIZE     (0)\n#endif\n\n#if (LOSCFG_BASE_CORE_EXC_TSK_SWITCH == YES)\n#define MAX_SWITCH_INFO_SIZE    (8 + (sizeof(UINT32) + sizeof(CHAR) * LOS_TASK_NAMELEN) * OS_TASK_SWITCH_INFO_COUNT)\n#else\n#define MAX_SWITCH_INFO_SIZE    (0)\n#endif\n\n#if (LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK == YES)\n#define MAX_MEM_INFO_SIZE       (8 + sizeof(MEM_INFO_S) * OS_SYS_MEM_NUM)\n#else\n#define MAX_MEM_INFO_SIZE       (0)\n#endif\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n#define MAX_EXC_MEM_SIZE ( 4 + MAX_SCENE_INFO_SIZE + MAX_TSK_INFO_SIZE + MAX_QUEUE_INFO_SIZE + MAX_INT_INFO_SIZE + MAX_SWITCH_INFO_SIZE + MAX_MEM_INFO_SIZE + 4)\n#else\n#define MAX_EXC_MEM_SIZE ( 0 )\n#endif\n\nextern VOID osExcRegister(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg);\n\n#endif\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m7/gcc/los_dispatch_gcc.S",
    "content": "/** ----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/** ----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/****************************************************************************************\n*                                  EXPORT FUNCTIONS\n****************************************************************************************/\n\n    .global  LOS_IntLock\n    .global  LOS_IntUnLock\n    .global  LOS_IntRestore\n    .global  LOS_StartToRun\n    .global  osTaskSchedule\n    .global  PendSV_Handler\n\n/****************************************************************************************\n*                                  EXTERN PARAMETERS\n****************************************************************************************/\n\n    .extern  g_stLosTask\n    .extern  g_pfnTskSwitchHook\n    .extern  g_bTaskScheduled\n\n/****************************************************************************************\n*                                  EQU\n****************************************************************************************/\n\n.equ    OS_NVIC_INT_CTRL,              0xE000ED04  /* Interrupt Control and State Register. */\n.equ    OS_NVIC_PENDSVSET,             0x10000000  /* Value to trigger PendSV exception. */\n\n.equ    OS_NVIC_SYSPRI2,               0xE000ED20  /* System Handler Priority Register 2. */\n.equ    OS_NVIC_PENDSV_SYSTICK_PRI,    0xFFFF0000  /* SysTick + PendSV priority level (lowest). */\n\n.equ    OS_TASK_STATUS_RUNNING,        0x0010      /* Task Status Flag (RUNNING). */\n\n/****************************************************************************************\n*                                  CODE GENERATION DIRECTIVES\n****************************************************************************************/\n\n    .section .text\n    .thumb\n    .syntax unified\n    .arch armv7e-m\n\n/****************************************************************************************\n* Function:\n*        VOID LOS_StartToRun(VOID);\n* Description:\n*        Start the first task, which is the highest priority task in the priority queue.\n*        Other tasks are started by task scheduling.\n****************************************************************************************/\n    .type LOS_StartToRun, %function\nLOS_StartToRun:\n    CPSID   I\n\n    /**\n     * Set PendSV and SysTick prority to the lowest.\n     * read ---> modify ---> write-back.\n     */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORR     R1, R1, R2\n    STR     R1, [R0]\n\n    /**\n     * Set g_bTaskScheduled = 1.\n     */\n    LDR     R0, =g_bTaskScheduled\n    MOV     R1, #1\n    STR     R1, [R0]\n\n    /**\n     * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n     */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    /**\n     * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n     */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOV     R3, #OS_TASK_STATUS_RUNNING\n    ORR     R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    /**\n     * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n     * [Initial EXC_RETURN ignore,] return by setting the CONTROL register.\n     *\n     * The initial stack of the current running task is as follows:\n     *\n     *                     POP: Restore the context of the current running task ===>|\n     *                                                                 High addr--->|\n     *                                                       Bottom of the stack--->|\n     * ----------+---------------------------------+--------------------------------+\n     *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n     * ----------+---------------------------------+--------------------------------+\n     *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n     *           |<---           skip          --->|<---     copy to R0-R7      --->|\n     *                                                                R12 to PSP--->|\n     *                                        Stack pointer after LOS_StartToRun--->|\n     */\n    LDR     R12, [R1]\n    ADD     R12, R12, #36          /* skip R4-R11, PRIMASK. */\n#if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    ADD     R12, R12, #4           /* if FPU exist, skip EXC_RETURN. */\n#endif\n    LDMFD   R12!, {R0-R7}\n\n    /**\n     * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n     */\n    MSR     PSP, R12\n\n    /**\n     * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n     */\n    MOV     R12, #2\n    MSR     CONTROL, R12\n\n    /**\n     * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n     */\n    MOV     LR, R5\n    CPSIE   I\n\n    /**\n     * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n     * of the main function will be destroyed and will never be returned.\n     */\n    BX      R6\n\n/****************************************************************************************\n* Function:\n*        UINTPTR LOS_IntLock(VOID);\n* Description:\n*        Disable all interrupts except Reset,NMI and HardFault.\n*        The value of currnet interruption state will be returned to the caller to save.\n*\n* Function:\n*        VOID LOS_IntRestore(UINTPTR uvIntSave);\n* Description:\n*        Restore the locked interruption of LOS_IntLock.\n*        The caller must pass in the value of interruption state previously saved.\n****************************************************************************************/\n    .type LOS_IntLock, %function\nLOS_IntLock:\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\n    .type LOS_IntUnLock, %function\nLOS_IntUnLock:\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\n    .type LOS_IntRestore, %function\nLOS_IntRestore:\n    MSR     PRIMASK, R0\n    BX      LR\n\n/****************************************************************************************\n* Function:\n*        VOID osTaskSchedule(VOID);\n* Description:\n*        Start the task swtich process by software trigger PendSV interrupt.\n****************************************************************************************/\n    .type osTaskSchedule, %function\nosTaskSchedule:\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n/****************************************************************************************\n* Function:\n*        VOID PendSV_Handler(VOID);\n* Description:\n*        PendSV interrupt handler, switch the context of the task.\n*        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n*               to its own stack.\n*        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n*                from its own stack.\n****************************************************************************************/\n    .type PendSV_Handler, %function\nPendSV_Handler:\n    /**\n     * R12: Save the interruption state of the current running task.\n     * Disable all interrupts except Reset,NMI and HardFault\n     */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    /**\n     * Call task switch hook.\n     */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CBZ     R2, TaskSwitch\n    PUSH    {R12, LR}\n    BLX     R2\n    POP     {R12, LR}\n\nTaskSwitch:\n    /**\n     * R0 = now stack pointer of the current running task.\n     */\n    MRS     R0, PSP\n\n    /**\n     * Save the stack frame([S16-S31],R4-R11) of the current running task.\n     * R12 save the PRIMASK value of the current running task.\n     * NOTE: 1. Before entering the exception handler function, these registers\n     *       ([NO_NAME,FPSCR,S15-S0],xPSR,PC,LR,R12,R3-R0) have been automatically\n     *       saved by the CPU in the stack of the current running task.\n     *       2. If lazy stacking is enabled, space is reserved on the stack for\n     *       the floating-point context(FPSCR,S15-S0), but the floating-point state\n     *       is not saved. when the floating-point instruction(VSTMDBEQ  R0!, {D8-D15})\n     *       is executed, the floating-point context(FPSCR,S15-S0) is first saved into\n     *       the space reserved on the stack. In other words, the instruction\n     *       'VSTMDBEQ  R0!, {D8-D15}' will trigger the CPU to save 'FPSCR,S15-S0' first.\n     *\n     * The stack of the current running task is as follows:\n     *\n     *   |<=== PUSH: Save the context of the current running task\n     *   |                                                                     High addr--->|\n     * --+-----------------------------------+-------------------------------------------+---\n     *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n     *   |                                                         [   lazy stacking    ]|\n     * --+-----------------------------------+-------------------------------------------+---\n     *                                        Stack pointer before entering exception--->|\n     *                                       |<---           cpu auto saved          --->|\n     *                                       |<---PSP to R0\n     *   |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n     */\n#if defined (__VFP_FP__) && !defined(__SOFTFP__)       /* if FPU exist. */\n    TST     R14, #0x10             /* if the task using the FPU context, push s16-s31. */\n    IT      EQ\n    VSTMDBEQ  R0!, {D8-D15}\n    STMFD   R0!, {R14}             /* save EXC_RETURN. */\n#endif\n    STMFD   R0!, {R4-R12}          /* save the core registers and PRIMASK. */\n\n    /**\n     * R5,R8.\n     */\n    LDR     R5, =g_stLosTask\n    MOV     R8, #OS_TASK_STATUS_RUNNING\n\n    /**\n     * Save the stack pointer of the current running task to TCB.\n     * (g_stLosTask.pstRunTask->pStackPointer = R0)\n     */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    /**\n     * Clear the RUNNING state of the current running task.\n     * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n     */\n    LDRH    R7, [R6, #4]\n    BIC     R7, R7, R8\n    STRH    R7, [R6, #4]\n\n    /**\n     * Switch the current running task to the next running task.\n     * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n     */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    /**\n     * Set the RUNNING state of the next running task.\n     * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n     */\n    LDRH    R7, [R0, #4]\n    ORR     R7, R7, R8\n    STRH    R7, [R0, #4]\n\n    /**\n     * Restore the stack pointer of the next running task from TCB.\n     * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n     */\n    LDR     R1, [R0]\n\n    /**\n     * Restore the stack frame(R4-R11,[S16-S31]) of the next running task.\n     * R12 restore the PRIMASK value of the next running task.\n     * NOTE: After exiting the exception handler function, these registers\n     *       (PC,xPSR,R0-R3,R12,LR,[S0-S15,FPSCR,NO_NAME]) will be automatically\n     *       restored by the CPU from the stack of the next running task.\n     *\n     * 1. The stack of the next running task is as follows:\n     *\n     *                             POP: Restore the context of the next running task ===>|\n     *                                                                         High addr--->|\n     * --+-----------------------------------+-------------------------------------------+---\n     *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n     * --+-----------------------------------+-------------------------------------------+---\n     *   |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n     *                          R1 to PSP--->|\n     *                                       |<---        cpu auto restoring         --->|\n     *                                          Stack pointer after exiting exception--->|\n     *\n     * 2. If the next running task is run for the first time, the stack is as follows:\n     *\n     *                        POP: Restore the context of the next running task ===>|\n     *                                                                 High addr--->|\n     *                                                       Bottom of the stack--->|\n     * ----------+---------------------------------+--------------------------------+\n     *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n     * ----------+---------------------------------+--------------------------------+\n     *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n     *                                R1 to PSP--->|\n     *                                             |<---   cpu auto restoring   --->|\n     *                                     Stack pointer after exiting exception--->|\n     */\n    LDMFD   R1!, {R4-R12}          /* restore the core registers and PRIMASK. */\n#if defined (__VFP_FP__) && !defined(__SOFTFP__)       /* if FPU exist. */\n    LDMFD   R1!, {R14}             /* restore EXC_RETURN. */\n    TST     R14, #0x10             /* if the task using the FPU context, pop s16-s31. */\n    IT      EQ\n    VLDMIAEQ  R1!, {D8-D15}\n#endif\n\n    /**\n     * Set the stack pointer of the next running task to PSP.\n     */\n    MSR     PSP, R1\n\n    /**\n     * Restore the interruption state of the next running task.\n     */\n    MSR     PRIMASK, R12\n    BX      LR\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m7/gcc/los_hw_exc_gcc.S",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n /*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/****************************************************************************************\n*                                  CODE GENERATION DIRECTIVES\n****************************************************************************************/\n\n    .syntax unified\n    .arch armv7e-m\n    .thumb\n    .section .text\n\n/****************************************************************************************\n*                                  EXPORT FUNCTIONS\n****************************************************************************************/\n\n    .global  NMI_Handler\n    .global  HardFault_Handler\n    .global  MemManage_Handler\n    .global  BusFault_Handler\n    .global  UsageFault_Handler\n    .global  SVC_Handler\n\n/****************************************************************************************\n*                                  EXTERN PARAMETERS\n****************************************************************************************/\n\n    .extern osExcHandleEntry\n    .extern g_uwExcTbl\n    .extern g_bTaskScheduled\n\n/****************************************************************************************\n*                                  EQU\n****************************************************************************************/\n\n.equ    OS_EXC_CAUSE_NMI,            18\n.equ    OS_EXC_CAUSE_HARDFAULT,      19\n.equ    OS_EXC_CAUSE_MEMFAULT,       20\n.equ    OS_EXC_CAUSE_BUSFAULT,       21\n.equ    OS_EXC_CAUSE_USAGEFAULT,     22\n.equ    OS_EXC_CAUSE_SVC,            23\n\n.equ    HF_DEBUGEVT,                 24\n.equ    HF_VECTBL,                   25\n\n.equ    FLAG_ADDR_VALID,             0x10000       /* bit 16 */\n.equ    FLAG_HWI_ACTIVE,             0x20000       /* bit 17 */\n.equ    FLAG_NO_FLOAT,               0x10000000    /* bit 28 */\n\n.equ    OS_NVIC_CFSR,                0xE000ED28    /* include BusFault/MemFault/UsageFault State Regeister */\n.equ    OS_NVIC_HFSR,                0xE000ED2C    /* HardFault State Regeister */\n.equ    OS_NVIC_BFAR,                0xE000ED38\n.equ    OS_NVIC_MMFAR,               0xE000ED34\n.equ    OS_NVIC_ACT_BASE,            0xE000E300\n.equ    OS_NVIC_SHCSRS,              0xE000ED24\n.equ    OS_NVIC_SHCSR_MASK,          0xC00         /* SYSTICKACT and PENDSVACT */\n\n/****************************************************************************************\n* Function:\n*        VOID NMI_Handler(VOID);\n* Description:\n*        NMI Handler.\n****************************************************************************************/\n    .type NMI_Handler, %function\nNMI_Handler:\n    /**\n     * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +------------------------------------------------------+------------------------+\n     * |                          31-8                        |          7-0           |\n     * +------------------------------------------------------+------------------------+\n     * |                          ---                         |    OS_EXC_CAUSE_NMI    |\n     * +------------------------------------------------------+------------------------+\n     * < R1 >: invalid\n     */\n    MOV  R0, #OS_EXC_CAUSE_NMI\n    MOV  R1, #0\n    B  osExcDispatch\n\n/****************************************************************************************\n* Function:\n*        VOID HardFault_Handler(VOID);\n* Description:\n*        HardFault Handler.\n****************************************************************************************/\n    .type HardFault_Handler, %function\nHardFault_Handler:\n    /**\n     * Check HardFault state register.\n     *\n     * HFSR:\n     * +----------+--------+--------+--------+-------+\n     * |    31    |   30   | 29 - 2 |    1   |   0   |\n     * +----------+--------+--------+--------+-------+\n     * | DEBUGEVT | FORCED |   --   | VECTBL |   --  |\n     * +----------+--------+--------+--------+-------+\n     */\n    MOV  R0, #OS_EXC_CAUSE_HARDFAULT\n    LDR  R2, =OS_NVIC_HFSR\n    LDR  R2, [R2]\n\n    /**\n     * Check whether HardFault are triggered by debugging events.\n     * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +----------------------------------------+-------------+------------------------+\n     * |                 31-16                  |    15-8     |          7-0           |\n     * +----------------------------------------+-------------+------------------------+\n     * |                  ---                   | HF_DEBUGEVT | OS_EXC_CAUSE_HARDFAULT |\n     * +----------------------------------------+-------------+------------------------+\n     * < R1 >: invalid\n     */\n    MOV  R1, #HF_DEBUGEVT\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x80000000\n    BNE  osExcDispatch                 /* DEBUGEVT */\n\n    /**\n     * Check whether HardFault is caused by the failure of the fetch vector.\n     * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +----------------------------------------+-------------+------------------------+\n     * |                 31-16                  |    15-8     |          7-0           |\n     * +----------------------------------------+-------------+------------------------+\n     * |                  ---                   |  HF_VECTBL  | OS_EXC_CAUSE_HARDFAULT |\n     * +----------------------------------------+-------------+------------------------+\n     * < R1 >: invalid\n     */\n    AND  R0, R0, #0x000000FF\n    MOV  R1, #HF_VECTBL\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x00000002\n    BNE  osExcDispatch                  /* VECTBL */\n\n    /**\n     * If it`s not DEBUGEVT and VECTBL, that is FORCED, then read the CFSR register to\n     * check BusFault, MemFault and UsageFault.\n     * R0: OS_EXC_CAUSE_HARDFAULT\n     *\n     * CFSR:\n     * +----------------+--------+--------+\n     * |      31-16     |  15-8  |  7-0   |\n     * +----------------+--------+--------+\n     * |      UFSR      |  BFSR  |  MFSR  |\n     * +----------------+--------+--------+\n     */\n    AND  R0, R0, #0x000000FF\n\n    LDR  R2, =OS_NVIC_CFSR\n    LDR  R2, [R2]\n\n    TST  R2, #0x8000                   /* BFSR->BFARVALID */\n    BNE  _HFBusFault                   /* BusFault */\n\n    TST  R2, #0x80                     /* MFSR->MMARVALID */\n    BNE  _HFMemFault                   /* MemFault */\n\n    /**\n     * BFARVALID and MMARVALID flag both invalid.\n     * R12: 0 --- The error address is invalid.\n     */\n    MOV  R12, #0\n    B    osHFExcCommonBMU\n\n    /**\n     * BFARVALID flag valid, read BFAR register.\n     * R1 : BFAR value --- The address value of a bus error.\n     * R12: The error address is valid.\n     */\n_HFBusFault:\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n    B    osHFExcCommonBMU\n\n    /**\n     * MMARVALID flag valid, read MMFAR register.\n     * R1 : MMFAR value --- The address value of memory management error.\n     * R12: The error address is valid.\n     */\n_HFMemFault:\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n\n    /**\n     * osHFExcCommonBMU: --- Get specific error status from table g_uwExcTbl, stored in R0.\n     * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n     * < R0 >:\n     * +-------------------+-----------------+------------------+------------------------+\n     * |       31-17       |        16       |        15-8      |          7-0           |\n     * +-------------------+-----------------+------------------+------------------------+\n     * |        ---        | FLAG_ADDR_VALID | Error state code | OS_EXC_CAUSE_HARDFAULT |\n     * |                   |        or       |       in         |                        |\n     * |                   |   0(invalid)    | table g_uwExcTbl |                        |\n     * +-------------------+-----------------+------------------+------------------------+\n     * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n     *         else invalid.\n     */\nosHFExcCommonBMU:\n    CLZ  R2, R2\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R2\n    LDRB R2, [R3]\n    ORR  R0, R0, R2, LSL #0x8\n    ORR  R0, R0, R12\n    B    osExcDispatch\n\n/****************************************************************************************\n* Function:\n*        VOID SVC_Handler(VOID);\n* Description:\n*        SVC Handler.\n****************************************************************************************/\n    .type SVC_Handler, %function\nSVC_Handler:\n    TST   LR, #0x4                     /* EXC_RETURN[b2] --- PSP or MSP */\n    ITE   EQ\n    MRSEQ R0, MSP\n    MRSNE R0, PSP\n    LDR   R1, [R0, #24]                /* The PC value in the stack frame */\n    LDRB  R0, [R1, #-2]                /* R0: The number of SVC (0 - 255) */\n    MOV   R1, #0\n    /* B     osExcDispatch */\n_SvcLoop:\n    B     _SvcLoop\n\n/****************************************************************************************\n* Function:\n*        VOID BusFault_Handler(VOID);\n* Description:\n*        BusFault Handler.\n****************************************************************************************/\n    .type BusFault_Handler, %function\nBusFault_Handler:\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_BUSFAULT\n\n    TST  R0, #0x8000                   /* BFSR->BFARVALID */\n    BEQ  _ExcBusNoADDR\n\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]                      /* R1:  The value of BFAR */\n    MOV  R12, #FLAG_ADDR_VALID         /* R12: BusFault addr valid */\n    AND  R0, R0, #0x3F00               /* R0:  Reserved the b13-b8 of the BFSR */\n    B    osExcCommonBMU\n\n_ExcBusNoADDR:\n    MOV  R12, #0                       /* R12: BusFault addr invalid */\n    AND  R0, R0, #0x3F00               /* R0:  Reserved the b13-b8 of the BFSR */\n    B    osExcCommonBMU\n\n/****************************************************************************************\n* Function:\n*        VOID MemManage_Handler(VOID);\n* Description:\n*        MemManage Handler.\n****************************************************************************************/\n    .type MemManage_Handler, %function\nMemManage_Handler:\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_MEMFAULT\n\n    TST  R0, #0x80                     /* MFSR->MMARVALID */\n    BEQ  _ExcMemNoADDR\n\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]                      /* R1:  The value of MMFAR */\n    MOV  R12, #FLAG_ADDR_VALID         /* R12: MemFault addr valid */\n    AND  R0, R0, #0x3B                 /* R0:  Reserved the b5-b0 of the MFSR */\n    B    osExcCommonBMU\n\n_ExcMemNoADDR:\n    MOV  R12, #0                       /* R12: MemFault addr invalid */\n    AND  R0, R0, #0x3B                 /* R0:  Reserved the b5-b0 of the MFSR */\n    B    osExcCommonBMU\n\n/****************************************************************************************\n* Function:\n*        VOID UsageFault_Handler(VOID);\n* Description:\n*        UsageFault Handler.\n****************************************************************************************/\n    .type UsageFault_Handler, %function\nUsageFault_Handler:\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_USAGEFAULT\n\n    LDR  R1, =#0x030F\n    LSL  R1, R1, #16\n    AND  R0, R0, R1                    /* R0:  reserved UFSR */\n    MOV  R12, #0                       /* R12: Fault addr invalid */\n\n    /**\n     * osExcCommonBMU: BusFault_Handler,MemManage_Handler and UsageFault_Handler share.\n     * Get specific error status from table g_uwExcTbl, stored in R0.\n     * Before executing osExcDispatch, the value of R0 is as follows.\n     * < R0 >:\n     * +-------------------+-----------------+------------------+------------------------+\n     * |       31-17       |        16       |        15-8      |          7-0           |\n     * +-------------------+-----------------+------------------+------------------------+\n     * |        ---        | FLAG_ADDR_VALID | Error state code |OS_EXC_CAUSE_BUSFAULT or|\n     * |                   |        or       |       in         |OS_EXC_CAUSE_MEMFAULT or|\n     * |                   |   0(invalid)    | table g_uwExcTbl |OS_EXC_CAUSE_USAGEFAULT |\n     * +-------------------+-----------------+------------------+------------------------+\n     * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n     *         else invalid.\n     */\nosExcCommonBMU:\n    CLZ  R0, R0\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R0\n    LDRB R0, [R3]\n    LSL  R0, R0, #0x8\n    ORR  R0, R0, R2\n    ORR  R0, R0, R12\n\n    /****************************************************************************************\n    * osExcDispatch: NMI_Handler, HardFault_Handler, SVC_Handler, BusFault_Handler, MemManage_Handler,\n    *                  UsageFault_Handler sharing.\n    ****************************************************************************************/\n\n    /**\n     * When executing osExcDispatch, R0, R1 will be used.\n     * The possible values of R0 and R1 are as follows.\n     *\n     * < R0 >:\n     * +----------------+-----------------+---------------------+------------------------+\n     * |     31-17      |        16       |         15-8        |          7-0           |\n     * +----------------+-----------------+---------------------+------------------------+\n     * |                | FLAG_ADDR_VALID | Error state code in | OS_EXC_CAUSE_HARDFAULT |\n     * |      ---       |       or        | table g_uwExcTbl    |or OS_EXC_CAUSE_MEMFAULT|\n     * |                |   0(invalid)    | or      HF_DEBUGEVT |or OS_EXC_CAUSE_BUSFAULT|\n     * |                |                 | or      HF_VECTBL   |or OS_EXC_CAUSE_NMI  or |\n     * |                |                 |                     | OS_EXC_CAUSE_USAGEFAULT|\n     * +----------------+-----------------+---------------------+------------------------+\n     * b17: FLAG_HWI_ACTIVE\n     * b28: FLAG_NO_FLOAT\n     * NOTE: b17 and b28 will be set later.\n     *\n     * < R1 >:\n     * If the bit16 of R0 is 1, then R1 is the value of BFAR or MMFAR, otherwise the\n     * value in R1 is invalid.\n     *\n     */\nosExcDispatch:\n    LDR   R2, =OS_NVIC_ACT_BASE\n    MOV   R12, #8                      /* #8: externel interrupt active check loop counter(#0 - #239) */\n\n_hwiActiveCheck:\n    LDR   R3, [R2]                     /* R3 store the value of externel interrupt active status */\n    CMP   R3, #0\n    BEQ   _hwiActiveCheckNext\n\n    /**\n     * Exception occured in external interrupt.\n     */\n    ORR   R0, R0, #FLAG_HWI_ACTIVE     /* R0[b17] = 1, externel interrupt active valid    &&&&&&&&&& */\n    RBIT  R2, R3                       /* bit reversal */\n    CLZ   R2, R2\n    RSB   R12, R12, #8                 /* R12 = 8 - R12 */\n    ADD   R2, R2, R12, LSL #5          /* R2: external interrupt number as uwPid */\n\n    /**\n     * Interrupts and initialization phase always use MSP.\n     */\n_ExcInMSP:\n    TST   LR, #0x10                    /* EXC_RETURN[b4] --- FPU(0) or without FPU(1) */\n    BNE   _NoFloatInMsp\n\n    /**\n     * Before executing instruction 'B _handleEntry', MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *    | S16-S31,R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n     * +--------------------------------------------------------------------------------+---------\n     *    |<---R13           Initial R13--->|<---                #104               --->|<---SAVED_SP\n     *                                      |              (CPU auto saved)             |\n     *\n     */\n    ADD   R3, R13, #104                /* #104: skip [R0-xPSR,D0-D7,FPSCR,NO_NAME] */\n    PUSH  {R3}                         /* push [SAVED_SP]: MSP+104 = Stack pointer in MSP before entering the exception */\n    MRS   R12, PRIMASK\n    PUSH {R4-R12}                      /* push R4-R11,PRIMASK to MSP */\n    VPUSH {D8-D15}                     /* push D8-D15 to MSP */\n    B     _handleEntry\n\n    /**\n     * Before executing instruction 'B _handleEntry', MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *                                 | R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR |\n     * +--------------------------------------------------------------------------------+---------\n     *                          R13--->|          Initial R13--->|<---      #32     --->|<---SAVED_SP\n     *                                                           |   (CPU auto saved)   |\n     *\n     */\n_NoFloatInMsp:\n    ADD   R3, R13, #32                 /* #32: skip [R0-R3,R12,LR,PC,xPSR] */\n    PUSH  {R3}                         /* push [SAVED_SP]: MSP+32 = Stack pointer in MSP before entering the exception */\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     /* push R4-R11,PRIMASK to MSP */\n    ORR   R0, R0, #FLAG_NO_FLOAT       /* R0[b28] = 1, no FPU    &&&&&&&&&& */\n    B     _handleEntry\n\n_hwiActiveCheckNext:\n    ADD   R2, R2, #4                   /* next NVIC ACT ADDR */\n    SUBS  R12, R12, #1\n    BNE   _hwiActiveCheck\n\n    /**\n     * Not in externel interrupt, check whether it is SysTick or PendSV.\n     */\n    LDR   R2, =OS_NVIC_SHCSRS\n    LDRH  R2,[R2]\n    LDR   R3,=OS_NVIC_SHCSR_MASK\n    AND   R2, R2, R3\n    CMP   R2, #0\n    BNE   _ExcInMSP                    /* SysTick or PendSV active */\n\n    /**\n     * Check whether an exception occurs during the initialization phase.\n     * If g_bTaskScheduled == 0, it is in the initialization phase.\n     */\n    LDR  R2, =g_bTaskScheduled\n    LDR  R2, [R2]\n    TST  R2, #1\n    BEQ  _ExcInMSP                     /* initialization phase use MSP */\n\n    /**\n     * Exception occured in Task.\n     */\n    TST   LR, #0x10\n    BNE   _NoFloatInPsp\n\n    /**\n     * Before executing _handleEntry, MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *     | S16-S31,R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n     * +--------------------------------------------------------------------------------+---------\n     *     |<---R13                         |<---                #104               --->|<---Initial R13\n     *                                      |              (copied from PSP)            |\n     *                                                                    R2(no use)--->|\n     *\n     * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME.\n     */\n    MOV   R2, R13\n    SUB   R2, R2, #8                   /* #8: reserved for [FPSCR,NO_NAME] */\n    SUB   R13, #104                    /* #104: MSP reserved, used to store stack frame in PSP */\n\n    MRS   R3, PSP\n    ADD   R12, R3, #104                /* PSP+104 = Stack pointer of the task before entering the exception */\n    PUSH  {R12}                        /* push task SP to MSP */\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     /* push R4-R11,PRIMASK of the current running task to MSP */\n    VPUSH {D8-D15}                     /* push D8-D15 of the currnent running task to MSP */\n\n    /* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3!, {R4-R11}                /* restore stack frame[R0-xPSR] of PSP to R4-R11 */\n    VLDMIA  R3!, {D8-D15}              /* restore stack frame[D0-D7] of PSP to D8-D15 */\n    VSTMDB  R2!, {D8-D15}              /* save stack frame[D0-D7] to MSP */\n    STMFD R2!, {R4-R11}                /* save stack frame[R0-xPSR] to MSP */\n    LDMFD R3, {R4-R5}                  /* restore stack frame[FPSCR,NO_NAME] to R4-R5 */\n    ADD   R2, R2, #104                 /* skip stack frame */\n    STMFD R2, {R4-R5}                  /* save stack frame[FPSCR,NO_NAME] to MSP */\n    B     _handleEntry\n\n    /**\n     * Before executing _handleEntry, MSP is as follows.\n     * MSP:\n     *                                                                              High addr--->|\n     * +--------------------------------------------------------------------------------+---------\n     *                                  | R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR |\n     * +--------------------------------------------------------------------------------+---------\n     *                           R13--->|                        |<---      #32     --->|<---Initial R13\n     *                                                           |  (copied from PSP)   |\n     *                                                           |<---R2(no use)\n     *\n     * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR.\n     */\n_NoFloatInPsp:\n    MOV   R2, R13\n    SUB   R13, #32                     /* #32: MSP reserved, used to store stack frame in PSP */\n\n    MRS   R3, PSP\n    ADD   R12, R3, #32                 /* PSP+32 = Stack pointer of the task before entering the exception */\n    PUSH  {R12}                        /* push task SP to MSP */\n\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     /* push R4-R11,PRIMASK of the current running task to MSP */\n\n    /* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3, {R4-R11}                 /* restore stack frame of PSP to R4-R11 */\n    STMFD R2!, {R4-R11}                /* save stack frame to MSP */\n    ORR   R0, R0, #FLAG_NO_FLOAT       /* R0[b28] = 1, no FPU    &&&&&&&&&& */\n\n    /**\n     * _handleEntry: Call osExcHandleEntry\n     * param1: R0 --- b28:    FLAG_NO_FLOAT.\n     *                b17:    FLAG_HWI_ACTIVE.\n     *                b16:    FLAG_ADDR_VALID.\n     *                b15-b8: Error state code in table g_uwExcTbl or HF_DEBUGEVT or HF_VECTBL.\n     *                b7-b0:  OS_EXC_CAUSE_HARDFAULT or OS_EXC_CAUSE_NMI or OS_EXC_CAUSE_MEMFAULT\n     *                        or OS_EXC_CAUSE_BUSFAULT or OS_EXC_CAUSE_USAGEFAULT.\n     * param2: R1 --- The value of BFAR or MMFAR if R0[b16] = 1, otherwise invalid.\n     * param3: R2 --- external interrupt number(0-239) if R0[b17] = 1, otherwise invalid.\n     * param4: R3 --- Point to the top of the stack(R4 or S16) that the exception stack frame in MSP.\n     */\n_handleEntry:\n    MOV R3, R13\n    CPSID I\n    CPSID F\n    B  osExcHandleEntry\n\n    NOP\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m7/iar/los_dispatch_iar.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  LOS_IntLock\n    EXPORT  LOS_IntUnLock\n    EXPORT  LOS_IntRestore\n    EXPORT  LOS_StartToRun\n    EXPORT  osTaskSchedule\n    EXPORT  PendSV_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT  g_stLosTask\n    IMPORT  g_pfnTskSwitchHook\n    IMPORT  g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_NVIC_INT_CTRL              EQU    0xE000ED04  ; Interrupt Control and State Register.\nOS_NVIC_PENDSVSET             EQU    0x10000000  ; Value to trigger PendSV exception.\n\nOS_NVIC_SYSPRI2               EQU    0xE000ED20  ; System Handler Priority Register 2.\nOS_NVIC_PENDSV_SYSTICK_PRI    EQU    0xFFFF0000  ; SysTick + PendSV priority level (lowest).\n\nOS_TASK_STATUS_RUNNING        EQU    0x0010      ; Task Status Flag (RUNNING).\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    SECTION    .text:CODE(2)\n    THUMB\n    REQUIRE8\n    PRESERVE8\n\n;****************************************************************************************\n; Function:\n;        VOID LOS_StartToRun(VOID);\n; Description:\n;        Start the first task, which is the highest priority task in the priority queue.\n;        Other tasks are started by task scheduling.\n;****************************************************************************************\nLOS_StartToRun\n    CPSID   I\n\n    ;/**\n    ; * Set PendSV and SysTick prority to the lowest.\n    ; * read ---> modify ---> write-back.\n    ; */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORR     R1, R1, R2\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_bTaskScheduled = 1.\n    ; */\n    LDR     R0, =g_bTaskScheduled\n    MOV     R1, #1\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n    ; */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n    ; */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOV     R3, #OS_TASK_STATUS_RUNNING\n    ORR     R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    ;/**\n    ; * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n    ; * [Initial EXC_RETURN ignore,] return by setting the CONTROL register.\n    ; *\n    ; * The initial stack of the current running task is as follows:\n    ; *\n    ; *                     POP: Restore the context of the current running task ===>|\n    ; *                                                                 High addr--->|\n    ; *                                                       Bottom of the stack--->|\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n    ; *           |<---           skip          --->|<---     copy to R0-R7      --->|\n    ; *                                                                R12 to PSP--->|\n    ; *                                        Stack pointer after LOS_StartToRun--->|\n    ; */\n    LDR     R12, [R1]\n    ADD     R12, R12, #36          ; skip R4-R11, PRIMASK.\n#if defined (__ARMVFP__)\n    ADD     R12, R12, #4           ; if FPU exist, skip EXC_RETURN.\n#endif\n    LDMFD   R12!, {R0-R7}\n\n    ;/**\n    ; * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n    ; */\n    MSR     PSP, R12\n\n    ;/**\n    ; * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n    ; */\n    MOV     R12, #2\n    MSR     CONTROL, R12\n\n    ;/**\n    ; * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n    ; */\n    MOV     LR, R5\n    CPSIE   I\n\n    ;/**\n    ; * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n    ; * of the main function will be destroyed and will never be returned.\n    ; */\n    BX      R6\n\n;****************************************************************************************\n; Function:\n;        UINTPTR LOS_IntLock(VOID);\n; Description:\n;        Disable all interrupts except Reset,NMI and HardFault.\n;        The value of currnet interruption state will be returned to the caller to save.\n;\n; Function:\n;        VOID LOS_IntRestore(UINTPTR uvIntSave);\n; Description:\n;        Restore the locked interruption of LOS_IntLock.\n;        The caller must pass in the value of interruption state previously saved.\n;****************************************************************************************\nLOS_IntLock\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\nLOS_IntUnLock\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\nLOS_IntRestore\n    MSR     PRIMASK, R0\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID osTaskSchedule(VOID);\n; Description:\n;        Start the task swtich process by software trigger PendSV interrupt.\n;****************************************************************************************\nosTaskSchedule\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID PendSV_Handler(VOID);\n; Description:\n;        PendSV interrupt handler, switch the context of the task.\n;        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n;               to its own stack.\n;        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n;                from its own stack.\n;****************************************************************************************\nPendSV_Handler\n    ;/**\n    ; * R12: Save the interruption state of the current running task.\n    ; * Disable all interrupts except Reset,NMI and HardFault\n    ; */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    ;/**\n    ; * Call task switch hook.\n    ; */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CBZ     R2, TaskSwitch\n    PUSH    {R12, LR}\n    BLX     R2\n    POP     {R12, LR}\n\nTaskSwitch\n    ;/**\n    ; * R0 = now stack pointer of the current running task.\n    ; */\n    MRS     R0, PSP\n\n    ;/**\n    ; * Save the stack frame([S16-S31],R4-R11) of the current running task.\n    ; * R12 save the PRIMASK value of the current running task.\n    ; * NOTE: 1. Before entering the exception handler function, these registers\n    ; *       ([NO_NAME,FPSCR,S15-S0],xPSR,PC,LR,R12,R3-R0) have been automatically\n    ; *       saved by the CPU in the stack of the current running task.\n    ; *       2. If lazy stacking is enabled, space is reserved on the stack for\n    ; *       the floating-point context(FPSCR,S15-S0), but the floating-point state\n    ; *       is not saved. when the floating-point instruction(VSTMDBEQ  R0!, {D8-D15})\n    ; *       is executed, the floating-point context(FPSCR,S15-S0) is first saved into\n    ; *       the space reserved on the stack. In other words, the instruction\n    ; *       'VSTMDBEQ  R0!, {D8-D15}' will trigger the CPU to save 'FPSCR,S15-S0' first.\n    ; *\n    ; * The stack of the current running task is as follows:\n    ; *\n    ; *   |<=== PUSH: Save the context of the current running task\n    ; *   |                                                                     High addr--->|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; *   |                                                         [   lazy stacking    ]|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *                                        Stack pointer before entering exception--->|\n    ; *                                       |<---           cpu auto saved          --->|\n    ; *                                       |<---PSP to R0\n    ; *   |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n    ; */\n#if defined (__ARMVFP__)           ; if FPU exist.\n    TST     R14, #0x10             ; if the task using the FPU context, push s16-s31.\n    IT      EQ\n    VSTMDBEQ  R0!, {D8-D15}\n    STMFD   R0!, {R14}             ; save EXC_RETURN.\n#endif\n    STMFD   R0!, {R4-R12}          ; save the core registers and PRIMASK.\n\n    ;/**\n    ; * R5,R8.\n    ; */\n    LDR     R5, =g_stLosTask\n    MOV     R8, #OS_TASK_STATUS_RUNNING\n\n    ;/**\n    ; * Save the stack pointer of the current running task to TCB.\n    ; * (g_stLosTask.pstRunTask->pStackPointer = R0)\n    ; */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    ;/**\n    ; * Clear the RUNNING state of the current running task.\n    ; * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R6, #4]\n    BIC     R7, R7, R8\n    STRH    R7, [R6, #4]\n\n    ;/**\n    ; * Switch the current running task to the next running task.\n    ; * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n    ; */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    ;/**\n    ; * Set the RUNNING state of the next running task.\n    ; * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R0, #4]\n    ORR     R7, R7, R8\n    STRH    R7, [R0, #4]\n\n    ;/**\n    ; * Restore the stack pointer of the next running task from TCB.\n    ; * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n    ; */\n    LDR     R1, [R0]\n\n    ;/**\n    ; * Restore the stack frame(R4-R11,[S16-S31]) of the next running task.\n    ; * R12 restore the PRIMASK value of the next running task.\n    ; * NOTE: After exiting the exception handler function, these registers\n    ; *       (PC,xPSR,R0-R3,R12,LR,[S0-S15,FPSCR,NO_NAME]) will be automatically\n    ; *       restored by the CPU from the stack of the next running task.\n    ; *\n    ; * 1. The stack of the next running task is as follows:\n    ; *\n    ; *                             POP: Restore the context of the next running task ===>|\n    ; *                                                                         High addr--->|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                          R1 to PSP--->|\n    ; *                                       |<---        cpu auto restoring         --->|\n    ; *                                          Stack pointer after exiting exception--->|\n    ; *\n    ; * 2. If the next running task is run for the first time, the stack is as follows:\n    ; *\n    ; *                        POP: Restore the context of the next running task ===>|\n    ; *                                                                 High addr--->|\n    ; *                                                       Bottom of the stack--->|\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                                R1 to PSP--->|\n    ; *                                             |<---   cpu auto restoring   --->|\n    ; *                                     Stack pointer after exiting exception--->|\n    ; */\n    LDMFD   R1!, {R4-R12}          ; restore the core registers and PRIMASK.\n#if defined (__ARMVFP__)           ; if FPU exist.\n    LDMFD   R1!, {R14}             ; restore EXC_RETURN.\n    TST     R14, #0x10             ; if the task using the FPU context, pop s16-s31.\n    IT      EQ\n    VLDMIAEQ  R1!, {D8-D15}\n#endif\n\n    ;/**\n    ; * Set the stack pointer of the next running task to PSP.\n    ; */\n    MSR     PSP, R1\n\n    ;/**\n    ; * Restore the interruption state of the next running task.\n    ; */\n    MSR     PRIMASK, R12\n    BX      LR\n\n    END\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m7/keil/los_dispatch_keil.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  LOS_IntLock\n    EXPORT  LOS_IntUnLock\n    EXPORT  LOS_IntRestore\n    EXPORT  LOS_StartToRun\n    EXPORT  osTaskSchedule\n    EXPORT  PendSV_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT  g_stLosTask\n    IMPORT  g_pfnTskSwitchHook\n    IMPORT  g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_NVIC_INT_CTRL              EQU    0xE000ED04  ; Interrupt Control and State Register.\nOS_NVIC_PENDSVSET             EQU    0x10000000  ; Value to trigger PendSV exception.\n\nOS_NVIC_SYSPRI2               EQU    0xE000ED20  ; System Handler Priority Register 2.\nOS_NVIC_PENDSV_SYSTICK_PRI    EQU    0xFFFF0000  ; SysTick + PendSV priority level (lowest).\n\nOS_TASK_STATUS_RUNNING        EQU    0x0010      ; Task Status Flag (RUNNING).\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    AREA    |.text|, CODE, READONLY\n    THUMB\n    REQUIRE8\n    PRESERVE8\n\n;****************************************************************************************\n; Function:\n;        VOID LOS_StartToRun(VOID);\n; Description:\n;        Start the first task, which is the highest priority task in the priority queue.\n;        Other tasks are started by task scheduling.\n;****************************************************************************************\nLOS_StartToRun\n    CPSID   I\n\n    ;/**\n    ; * Set PendSV and SysTick prority to the lowest.\n    ; * read ---> modify ---> write-back.\n    ; */\n    LDR     R0, =OS_NVIC_SYSPRI2\n    LDR     R1, =OS_NVIC_PENDSV_SYSTICK_PRI\n    LDR     R2, [R0]\n    ORR     R1, R1, R2\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_bTaskScheduled = 1.\n    ; */\n    LDR     R0, =g_bTaskScheduled\n    MOV     R1, #1\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask = g_stLosTask.pstNewTask.\n    ; */\n    LDR     R0, =g_stLosTask\n    LDR     R1, [R0, #4]\n    STR     R1, [R0]\n\n    ;/**\n    ; * Set g_stLosTask.pstRunTask->usTaskStatus |= OS_TASK_STATUS_RUNNING.\n    ; */\n    LDR     R1, [R0]\n    LDRH    R2, [R1, #4]\n    MOV     R3, #OS_TASK_STATUS_RUNNING\n    ORR     R2, R2, R3\n    STRH    R2, [R1, #4]\n\n    ;/**\n    ; * Restore the default stack frame(R0-R3,R12,LR,PC,xPSR) of g_stLosTask.pstRunTask to R0-R7.\n    ; * [Initial EXC_RETURN ignore,] return by setting the CONTROL register.\n    ; *\n    ; * The initial stack of the current running task is as follows:\n    ; *\n    ; *                     POP: Restore the context of the current running task ===>|\n    ; *                                                                 High addr--->|\n    ; *                                                       Bottom of the stack--->|\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstRunTask->pStackPointer\n    ; *           |<---           skip          --->|<---     copy to R0-R7      --->|\n    ; *                                                                R12 to PSP--->|\n    ; *                                        Stack pointer after LOS_StartToRun--->|\n    ; */\n    LDR     R12, [R1]\n    ADD     R12, R12, #36          ; skip R4-R11, PRIMASK.\n    IF      {FPU} != \"SoftVFP\"\n    ADD     R12, R12, #4           ; if FPU exist, skip EXC_RETURN.\n    ENDIF\n    LDMFD   R12!, {R0-R7}\n\n    ;/**\n    ; * Set the stack pointer of g_stLosTask.pstRunTask to PSP.\n    ; */\n    MSR     PSP, R12\n\n    ;/**\n    ; * Set the CONTROL register, after schedule start, privilege level and stack = PSP.\n    ; */\n    MOV     R12, #2\n    MSR     CONTROL, R12\n\n    ;/**\n    ; * Enable interrupt. (The default PRIMASK value is 0, so enable directly)\n    ; */\n    MOV     LR, R5\n    CPSIE   I\n\n    ;/**\n    ; * Jump directly to the default PC of g_stLosTask.pstRunTask, the field information\n    ; * of the main function will be destroyed and will never be returned.\n    ; */\n    BX      R6\n\n;****************************************************************************************\n; Function:\n;        UINTPTR LOS_IntLock(VOID);\n; Description:\n;        Disable all interrupts except Reset,NMI and HardFault.\n;        The value of currnet interruption state will be returned to the caller to save.\n;\n; Function:\n;        VOID LOS_IntRestore(UINTPTR uvIntSave);\n; Description:\n;        Restore the locked interruption of LOS_IntLock.\n;        The caller must pass in the value of interruption state previously saved.\n;****************************************************************************************\nLOS_IntLock\n    MRS     R0, PRIMASK\n    CPSID   I\n    BX      LR\n\nLOS_IntUnLock\n    MRS     R0, PRIMASK\n    CPSIE   I\n    BX      LR\n\nLOS_IntRestore\n    MSR     PRIMASK, R0\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID osTaskSchedule(VOID);\n; Description:\n;        Start the task swtich process by software trigger PendSV interrupt.\n;****************************************************************************************\nosTaskSchedule\n    LDR     R0, =OS_NVIC_INT_CTRL\n    LDR     R1, =OS_NVIC_PENDSVSET\n    STR     R1, [R0]\n    BX      LR\n\n;****************************************************************************************\n; Function:\n;        VOID PendSV_Handler(VOID);\n; Description:\n;        PendSV interrupt handler, switch the context of the task.\n;        First: Save the context of the current running task(g_stLosTask.pstRunTask)\n;               to its own stack.\n;        Second: Restore the context of the next running task(g_stLosTask.pstNewTask)\n;                from its own stack.\n;****************************************************************************************\nPendSV_Handler\n    ;/**\n    ; * R12: Save the interruption state of the current running task.\n    ; * Disable all interrupts except Reset,NMI and HardFault\n    ; */\n    MRS     R12, PRIMASK\n    CPSID   I\n\n    ;/**\n    ; * Call task switch hook.\n    ; */\n    LDR     R2, =g_pfnTskSwitchHook\n    LDR     R2, [R2]\n    CBZ     R2, TaskSwitch\n    PUSH    {R12, LR}\n    BLX     R2\n    POP     {R12, LR}\n\nTaskSwitch\n    ;/**\n    ; * R0 = now stack pointer of the current running task.\n    ; */\n    MRS     R0, PSP\n\n    ;/**\n    ; * Save the stack frame([S16-S31],R4-R11) of the current running task.\n    ; * R12 save the PRIMASK value of the current running task.\n    ; * NOTE: 1. Before entering the exception handler function, these registers\n    ; *       ([NO_NAME,FPSCR,S15-S0],xPSR,PC,LR,R12,R3-R0) have been automatically\n    ; *       saved by the CPU in the stack of the current running task.\n    ; *       2. If lazy stacking is enabled, space is reserved on the stack for\n    ; *       the floating-point context(FPSCR,S15-S0), but the floating-point state\n    ; *       is not saved. when the floating-point instruction(VSTMDBEQ  R0!, {D8-D15})\n    ; *       is executed, the floating-point context(FPSCR,S15-S0) is first saved into\n    ; *       the space reserved on the stack. In other words, the instruction\n    ; *       'VSTMDBEQ  R0!, {D8-D15}' will trigger the CPU to save 'FPSCR,S15-S0' first.\n    ; *\n    ; * The stack of the current running task is as follows:\n    ; *\n    ; *   |<=== PUSH: Save the context of the current running task\n    ; *   |                                                                     High addr--->|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; *   |                                                         [   lazy stacking    ]|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *                                        Stack pointer before entering exception--->|\n    ; *                                       |<---           cpu auto saved          --->|\n    ; *                                       |<---PSP to R0\n    ; *   |<---Top of the stack, save to g_stLosTask.pstRunTask->pStackPointer\n    ; */\n    IF      {FPU} != \"SoftVFP\"     ; if FPU exist.\n    TST     R14, #0x10             ; if the task using the FPU context, push s16-s31.\n    IT      EQ\n    VSTMDBEQ  R0!, {D8-D15}\n    STMFD   R0!, {R14}             ; save EXC_RETURN.\n    ENDIF\n    STMFD   R0!, {R4-R12}          ; save the core registers and PRIMASK.\n\n    ;/**\n    ; * R5,R8.\n    ; */\n    LDR     R5, =g_stLosTask\n    MOV     R8, #OS_TASK_STATUS_RUNNING\n\n    ;/**\n    ; * Save the stack pointer of the current running task to TCB.\n    ; * (g_stLosTask.pstRunTask->pStackPointer = R0)\n    ; */\n    LDR     R6, [R5]\n    STR     R0, [R6]\n\n    ;/**\n    ; * Clear the RUNNING state of the current running task.\n    ; * (g_stLosTask.pstRunTask->usTaskStatus &= ~OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R6, #4]\n    BIC     R7, R7, R8\n    STRH    R7, [R6, #4]\n\n    ;/**\n    ; * Switch the current running task to the next running task.\n    ; * (g_stLosTask.pstRunTask = g_stLosTask.pstNewTask)\n    ; */\n    LDR     R0, [R5, #4]\n    STR     R0, [R5]\n\n    ;/**\n    ; * Set the RUNNING state of the next running task.\n    ; * (g_stLosTask.pstNewTask->usTaskStatus |= OS_TASK_STATUS_RUNNING)\n    ; */\n    LDRH    R7, [R0, #4]\n    ORR     R7, R7, R8\n    STRH    R7, [R0, #4]\n\n    ;/**\n    ; * Restore the stack pointer of the next running task from TCB.\n    ; * (R1 = g_stLosTask.pstNewTask->pStackPointer)\n    ; */\n    LDR     R1, [R0]\n\n    ;/**\n    ; * Restore the stack frame(R4-R11,[S16-S31]) of the next running task.\n    ; * R12 restore the PRIMASK value of the next running task.\n    ; * NOTE: After exiting the exception handler function, these registers\n    ; *       (PC,xPSR,R0-R3,R12,LR,[S0-S15,FPSCR,NO_NAME]) will be automatically\n    ; *       restored by the CPU from the stack of the next running task.\n    ; *\n    ; * 1. The stack of the next running task is as follows:\n    ; *\n    ; *                             POP: Restore the context of the next running task ===>|\n    ; *                                                                         High addr--->|\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   | R4-R11,PRIMASK,EXC_RETURN,S16-S31 | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; * --+-----------------------------------+-------------------------------------------+---\n    ; *   |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                          R1 to PSP--->|\n    ; *                                       |<---        cpu auto restoring         --->|\n    ; *                                          Stack pointer after exiting exception--->|\n    ; *\n    ; * 2. If the next running task is run for the first time, the stack is as follows:\n    ; *\n    ; *                        POP: Restore the context of the next running task ===>|\n    ; *                                                                 High addr--->|\n    ; *                                                       Bottom of the stack--->|\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |  R4-R11,  PRIMASK,  EXC_RETURN  |  R0-R3,  R12,  LR,  PC,  xPSR  |\n    ; * ----------+---------------------------------+--------------------------------+\n    ; *           |<---Top of the stack, restored from g_stLosTask.pstNewTask->pStackPointer\n    ; *                                R1 to PSP--->|\n    ; *                                             |<---   cpu auto restoring   --->|\n    ; *                                     Stack pointer after exiting exception--->|\n    ; */\n    LDMFD   R1!, {R4-R12}          ; restore the core registers and PRIMASK.\n    IF      {FPU} != \"SoftVFP\"     ; if FPU exist.\n    LDMFD   R1!, {R14}             ; restore EXC_RETURN.\n    TST     R14, #0x10             ; if the task using the FPU context, pop s16-s31.\n    IT      EQ\n    VLDMIAEQ  R1!, {D8-D15}\n    ENDIF\n\n    ;/**\n    ; * Set the stack pointer of the next running task to PSP.\n    ; */\n    MSR     PSP, R1\n\n    ;/**\n    ; * Restore the interruption state of the next running task.\n    ; */\n    MSR     PRIMASK, R12\n    BX      LR\n\n    ALIGN\n    END\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m7/keil/los_hw_exc_keil.S",
    "content": ";----------------------------------------------------------------------------\n ; Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n ; All rights reserved.\n ; Redistribution and use in source and binary forms, with or without modification,\n ; are permitted provided that the following conditions are met:\n ; 1. Redistributions of source code must retain the above copyright notice, this list of\n ; conditions and the following disclaimer.\n ; 2. Redistributions in binary form must reproduce the above copyright notice, this list\n ; of conditions and the following disclaimer in the documentation and/or other materials\n ; provided with the distribution.\n ; 3. Neither the name of the copyright holder nor the names of its contributors may be used\n ; to endorse or promote products derived from this software without specific prior written\n ; permission.\n ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n ; \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n ; THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n ; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n ; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n ; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n ; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n ; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n ; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n ; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n ; ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n ;---------------------------------------------------------------------------*/\n;----------------------------------------------------------------------------\n ; Notice of Export Control Law\n ; ===============================================\n ; Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n ; include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n ; Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n ; applicable export control laws and regulations.\n ;---------------------------------------------------------------------------*/\n\n;****************************************************************************************\n;                                  CODE GENERATION DIRECTIVES\n;****************************************************************************************\n\n    PRESERVE8\n    AREA    |.text|, CODE, READONLY\n    THUMB\n\n;****************************************************************************************\n;                                  EXPORT FUNCTIONS\n;****************************************************************************************\n\n    EXPORT  NMI_Handler\n    EXPORT  HardFault_Handler\n    EXPORT  MemManage_Handler\n    EXPORT  BusFault_Handler\n    EXPORT  UsageFault_Handler\n    EXPORT  SVC_Handler\n\n;****************************************************************************************\n;                                  EXTERN PARAMETERS\n;****************************************************************************************\n\n    IMPORT osExcHandleEntry\n    IMPORT g_uwExcTbl\n    IMPORT g_bTaskScheduled\n\n;****************************************************************************************\n;                                  EQU\n;****************************************************************************************\n\nOS_EXC_CAUSE_NMI            EQU   18\nOS_EXC_CAUSE_HARDFAULT      EQU   19\nOS_EXC_CAUSE_MEMFAULT       EQU   20\nOS_EXC_CAUSE_BUSFAULT       EQU   21\nOS_EXC_CAUSE_USAGEFAULT     EQU   22\nOS_EXC_CAUSE_SVC            EQU   23\n\nHF_DEBUGEVT                 EQU   24\nHF_VECTBL                   EQU   25\n\nFLAG_ADDR_VALID             EQU   0x10000       ; bit 16\nFLAG_HWI_ACTIVE             EQU   0x20000       ; bit 17\nFLAG_NO_FLOAT               EQU   0x10000000    ; bit 28\n\nOS_NVIC_CFSR                EQU   0xE000ED28    ; include BusFault/MemFault/UsageFault State Regeister\nOS_NVIC_HFSR                EQU   0xE000ED2C    ; HardFault State Regeister\nOS_NVIC_BFAR                EQU   0xE000ED38\nOS_NVIC_MMFAR               EQU   0xE000ED34\nOS_NVIC_ACT_BASE            EQU   0xE000E300\nOS_NVIC_SHCSRS              EQU   0xE000ED24\nOS_NVIC_SHCSR_MASK          EQU   0xC00         ; SYSTICKACT and PENDSVACT\n\n;****************************************************************************************\n; Function:\n;        VOID NMI_Handler(VOID);\n; Description:\n;        NMI Handler.\n;****************************************************************************************\nNMI_Handler\n    ;/**\n    ; * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +------------------------------------------------------+------------------------+\n    ; * |                          31-8                        |          7-0           |\n    ; * +------------------------------------------------------+------------------------+\n    ; * |                          ---                         |    OS_EXC_CAUSE_NMI    |\n    ; * +------------------------------------------------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    MOV  R0, #OS_EXC_CAUSE_NMI\n    MOV  R1, #0\n    B  osExcDispatch\n\n;****************************************************************************************\n; Function:\n;        VOID HardFault_Handler(VOID);\n; Description:\n;        HardFault Handler.\n;****************************************************************************************\nHardFault_Handler\n    ;/**\n    ; * Check HardFault state register.\n    ; *\n    ; * HFSR:\n    ; * +----------+--------+--------+--------+-------+\n    ; * |    31    |   30   | 29 - 2 |    1   |   0   |\n    ; * +----------+--------+--------+--------+-------+\n    ; * | DEBUGEVT | FORCED |   --   | VECTBL |   --  |\n    ; * +----------+--------+--------+--------+-------+\n    ; */\n    MOV  R0, #OS_EXC_CAUSE_HARDFAULT\n    LDR  R2, =OS_NVIC_HFSR\n    LDR  R2, [R2]\n\n    ;/**\n    ; * Check whether HardFault are triggered by debugging events.\n    ; * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                 31-16                  |    15-8     |          7-0           |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                  ---                   | HF_DEBUGEVT | OS_EXC_CAUSE_HARDFAULT |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    MOV  R1, #HF_DEBUGEVT\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x80000000\n    BNE  osExcDispatch                 ; DEBUGEVT\n\n    ;/**\n    ; * Check whether HardFault is caused by the failure of the fetch vector.\n    ; * Before executing instruction 'BNE osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                 31-16                  |    15-8     |          7-0           |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * |                  ---                   |  HF_VECTBL  | OS_EXC_CAUSE_HARDFAULT |\n    ; * +----------------------------------------+-------------+------------------------+\n    ; * < R1 >: invalid\n    ; */\n    AND  R0, R0, #0x000000FF\n    MOV  R1, #HF_VECTBL\n    ORR  R0, R0, R1, LSL #0x8\n    TST  R2, #0x00000002\n    BNE  osExcDispatch                  ; VECTBL\n\n    ;/**\n    ; * If it`s not DEBUGEVT and VECTBL, that is FORCED, then read the CFSR register to\n    ; * check BusFault, MemFault and UsageFault.\n    ; * R0: OS_EXC_CAUSE_HARDFAULT\n    ; *\n    ; * CFSR:\n    ; * +----------------+--------+--------+\n    ; * |      31-16     |  15-8  |  7-0   |\n    ; * +----------------+--------+--------+\n    ; * |      UFSR      |  BFSR  |  MFSR  |\n    ; * +----------------+--------+--------+\n    ; */\n    AND  R0, R0, #0x000000FF\n\n    LDR  R2, =OS_NVIC_CFSR\n    LDR  R2, [R2]\n\n    TST  R2, #0x8000                   ; BFSR->BFARVALID\n    BNE  _HFBusFault                   ; BusFault\n\n    TST  R2, #0x80                     ; MFSR->MMARVALID\n    BNE  _HFMemFault                   ; MemFault\n\n    ;/**\n    ; * BFARVALID and MMARVALID flag both invalid.\n    ; * R12: 0 --- The error address is invalid.\n    ; */\n    MOV  R12, #0\n    B    osHFExcCommonBMU\n\n    ;/**\n    ; * BFARVALID flag valid, read BFAR register.\n    ; * R1 : BFAR value --- The address value of a bus error.\n    ; * R12: The error address is valid.\n    ; */\n_HFBusFault\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n    B    osHFExcCommonBMU\n\n    ;/**\n    ; * MMARVALID flag valid, read MMFAR register.\n    ; * R1 : MMFAR value --- The address value of memory management error.\n    ; * R12: The error address is valid.\n    ; */\n_HFMemFault\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]\n    MOV  R12, #FLAG_ADDR_VALID\n\n    ;/**\n    ; * osHFExcCommonBMU: --- Get specific error status from table g_uwExcTbl, stored in R0.\n    ; * Before executing instruction 'B osExcDispatch', the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |       31-17       |        16       |        15-8      |          7-0           |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |        ---        | FLAG_ADDR_VALID | Error state code | OS_EXC_CAUSE_HARDFAULT |\n    ; * |                   |        or       |       in         |                        |\n    ; * |                   |   0(invalid)    | table g_uwExcTbl |                        |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n    ; *         else invalid.\n    ; */\nosHFExcCommonBMU\n    CLZ  R2, R2\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R2\n    LDRB R2, [R3]\n    ORR  R0, R0, R2, LSL #0x8\n    ORR  R0, R0, R12\n    B    osExcDispatch\n\n;****************************************************************************************\n; Function:\n;        VOID SVC_Handler(VOID);\n; Description:\n;        SVC Handler.\n;****************************************************************************************\nSVC_Handler\n    TST   LR, #0x4                     ; EXC_RETURN[b2] --- PSP or MSP\n    ITE   EQ\n    MRSEQ R0, MSP\n    MRSNE R0, PSP\n    LDR   R1, [R0, #24]                ; The PC value in the stack frame\n    LDRB  R0, [R1, #-2]                ; R0: The number of SVC (0 - 255)\n    MOV   R1, #0\n    ;B     osExcDispatch\n_SvcLoop\n    B     _SvcLoop\n\n;****************************************************************************************\n; Function:\n;        VOID BusFault_Handler(VOID);\n; Description:\n;        BusFault Handler.\n;****************************************************************************************\nBusFault_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_BUSFAULT\n\n    TST  R0, #0x8000                   ; BFSR->BFARVALID\n    BEQ  _ExcBusNoADDR\n\n    LDR  R1, =OS_NVIC_BFAR\n    LDR  R1, [R1]                      ; R1:  The value of BFAR\n    MOV  R12, #FLAG_ADDR_VALID         ; R12: BusFault addr valid\n    AND  R0, R0, #0x3F00               ; R0:  Reserved the b13-b8 of the BFSR\n    B    osExcCommonBMU\n\n_ExcBusNoADDR\n    MOV  R12, #0                       ; R12: BusFault addr invalid\n    AND  R0, R0, #0x3F00               ; R0:  Reserved the b13-b8 of the BFSR\n    B    osExcCommonBMU\n\n;****************************************************************************************\n; Function:\n;        VOID MemManage_Handler(VOID);\n; Description:\n;        MemManage Handler.\n;****************************************************************************************\nMemManage_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_MEMFAULT\n\n    TST  R0, #0x80                     ; MFSR->MMARVALID\n    BEQ  _ExcMemNoADDR\n\n    LDR  R1, =OS_NVIC_MMFAR\n    LDR  R1, [R1]                      ; R1:  The value of MMFAR\n    MOV  R12, #FLAG_ADDR_VALID         ; R12: MemFault addr valid\n    AND  R0, R0, #0x3B                 ; R0:  Reserved the b5-b0 of the MFSR\n    B    osExcCommonBMU\n\n_ExcMemNoADDR\n    MOV  R12, #0                       ; R12: MemFault addr invalid\n    AND  R0, R0, #0x3B                 ; R0:  Reserved the b5-b0 of the MFSR\n    B    osExcCommonBMU\n\n;****************************************************************************************\n; Function:\n;        VOID UsageFault_Handler(VOID);\n; Description:\n;        UsageFault Handler.\n;****************************************************************************************\nUsageFault_Handler\n    LDR  R0, =OS_NVIC_CFSR\n    LDR  R0, [R0]\n    LDR  R2, =OS_EXC_CAUSE_USAGEFAULT\n\n    MOV  R1, #0x030F\n    LSL  R1, R1, #16\n    AND  R0, R0, R1                    ; R0:  reserved UFSR\n    MOV  R12, #0                       ; R12: Fault addr invalid\n\n    ;/**\n    ; * osExcCommonBMU: BusFault_Handler,MemManage_Handler and UsageFault_Handler share.\n    ; * Get specific error status from table g_uwExcTbl, stored in R0.\n    ; * Before executing osExcDispatch, the value of R0 is as follows.\n    ; * < R0 >:\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |       31-17       |        16       |        15-8      |          7-0           |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * |        ---        | FLAG_ADDR_VALID | Error state code |OS_EXC_CAUSE_BUSFAULT or|\n    ; * |                   |        or       |       in         |OS_EXC_CAUSE_MEMFAULT or|\n    ; * |                   |   0(invalid)    | table g_uwExcTbl |OS_EXC_CAUSE_USAGEFAULT |\n    ; * +-------------------+-----------------+------------------+------------------------+\n    ; * < R1 >: The value of BFAR or MMFAR if the bit16(FLAG_ADDR_VALID) of R0 is set to 1,\n    ; *         else invalid.\n    ; */\nosExcCommonBMU\n    CLZ  R0, R0\n    LDR  R3, =g_uwExcTbl\n    ADD  R3, R3, R0\n    LDRB R0, [R3]\n    LSL  R0, R0, #0x8\n    ORR  R0, R0, R2\n    ORR  R0, R0, R12\n\n    ;****************************************************************************************\n    ; osExcDispatch: NMI_Handler, HardFault_Handler, SVC_Handler, BusFault_Handler, MemManage_Handler,\n    ;                  UsageFault_Handler sharing.\n    ;****************************************************************************************\n\n    ;/**\n    ; * When executing osExcDispatch, R0, R1 will be used.\n    ; * The possible values of R0 and R1 are as follows.\n    ; *\n    ; * < R0 >:\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * |     31-17      |        16       |         15-8        |          7-0           |\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * |                | FLAG_ADDR_VALID | Error state code in | OS_EXC_CAUSE_HARDFAULT |\n    ; * |      ---       |       or        | table g_uwExcTbl    |or OS_EXC_CAUSE_MEMFAULT|\n    ; * |                |   0(invalid)    | or      HF_DEBUGEVT |or OS_EXC_CAUSE_BUSFAULT|\n    ; * |                |                 | or      HF_VECTBL   |or OS_EXC_CAUSE_NMI  or |\n    ; * |                |                 |                     | OS_EXC_CAUSE_USAGEFAULT|\n    ; * +----------------+-----------------+---------------------+------------------------+\n    ; * b17: FLAG_HWI_ACTIVE\n    ; * b28: FLAG_NO_FLOAT\n    ; * NOTE: b17 and b28 will be set later.\n    ; *\n    ; * < R1 >:\n    ; * If the bit16 of R0 is 1, then R1 is the value of BFAR or MMFAR, otherwise the\n    ; * value in R1 is invalid.\n    ; *\n    ; */\nosExcDispatch\n    LDR   R2, =OS_NVIC_ACT_BASE\n    MOV   R12, #8                      ; #8: externel interrupt active check loop counter(#0 - #239)\n\n_hwiActiveCheck\n    LDR   R3, [R2]                     ; R3 store the value of externel interrupt active status\n    CMP   R3, #0\n    BEQ   _hwiActiveCheckNext\n\n    ;/**\n    ; * Exception occured in external interrupt.\n    ; */\n    ORR   R0, R0, #FLAG_HWI_ACTIVE     ; R0[b17] = 1, externel interrupt active valid    &&&&&&&&&&\n    RBIT  R2, R3                       ; bit reversal\n    CLZ   R2, R2\n    RSB   R12, R12, #8                 ; R12 = 8 - R12\n    ADD   R2, R2, R12, LSL #5          ; R2: external interrupt number as uwPid\n\n    ;/**\n    ; * Interrupts and initialization phase always use MSP.\n    ; */\n_ExcInMSP\n    TST   LR, #0x10                    ; EXC_RETURN[b4] --- FPU(0) or without FPU(1)\n    BNE   _NoFloatInMsp\n\n    ;/**\n    ; * Before executing instruction 'B _handleEntry', MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *    | S16-S31,R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *    |<---R13           Initial R13--->|<---                #104               --->|<---SAVED_SP\n    ; *                                      |              (CPU auto saved)             |\n    ; *\n    ; */\n    ADD   R3, R13, #104                ; #104: skip [R0-xPSR,D0-D7,FPSCR,NO_NAME]\n    PUSH  {R3}                         ; push [SAVED_SP]: MSP+104 = Stack pointer in MSP before entering the exception\n    MRS   R12, PRIMASK\n    PUSH {R4-R12}                      ; push R4-R11,PRIMASK to MSP\n    VPUSH {D8-D15}                     ; push D8-D15 to MSP\n    B     _handleEntry\n\n    ;/**\n    ; * Before executing instruction 'B _handleEntry', MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                                 | R4-R11,PRIMASK,SAVED_SP | R0-R3,R12,LR,PC,xPSR |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                          R13--->|          Initial R13--->|<---      #32     --->|<---SAVED_SP\n    ; *                                                           |   (CPU auto saved)   |\n    ; *\n    ; */\n_NoFloatInMsp\n    ADD   R3, R13, #32                 ; #32: skip [R0-R3,R12,LR,PC,xPSR]\n    PUSH  {R3}                         ; push [SAVED_SP]: MSP+32 = Stack pointer in MSP before entering the exception\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK to MSP\n    ORR   R0, R0, #FLAG_NO_FLOAT       ; R0[b28] = 1, no FPU    &&&&&&&&&&\n    B     _handleEntry\n\n_hwiActiveCheckNext\n    ADD   R2, R2, #4                   ; next NVIC ACT ADDR\n    SUBS  R12, R12, #1\n    BNE   _hwiActiveCheck\n\n    ;/**\n    ; * Not in externel interrupt, check whether it is SysTick or PendSV.\n    ; */\n    LDR   R2, =OS_NVIC_SHCSRS\n    LDRH  R2,[R2]\n    LDR   R3,=OS_NVIC_SHCSR_MASK\n    AND   R2, R2, R3\n    CMP   R2, #0\n    BNE   _ExcInMSP                    ; SysTick or PendSV active\n\n    ;/**\n    ; * Check whether an exception occurs during the initialization phase.\n    ; * If g_bTaskScheduled == 0, it is in the initialization phase.\n    ; */\n    LDR  R2, =g_bTaskScheduled\n    LDR  R2, [R2]\n    TST  R2, #1\n    BEQ  _ExcInMSP                     ; initialization phase use MSP\n\n    ;/**\n    ; * Exception occured in Task.\n    ; */\n    TST   LR, #0x10\n    BNE   _NoFloatInPsp\n\n    ;/**\n    ; * Before executing _handleEntry, MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *     | S16-S31,R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *     |<---R13                         |<---                #104               --->|<---Initial R13\n    ; *                                      |              (copied from PSP)            |\n    ; *                                                                    R2(no use)--->|\n    ; *\n    ; * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR,NO_NAME.\n    ; */\n    MOV   R2, R13\n    SUB   R2, R2, #8                   ; #8: reserved for [FPSCR,NO_NAME]\n    SUB   R13, #104                    ; #104: MSP reserved, used to store stack frame in PSP\n\n    MRS   R3, PSP\n    ADD   R12, R3, #104                ; PSP+104 = Stack pointer of the task before entering the exception\n    PUSH  {R12}                        ; push task SP to MSP\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK of the current running task to MSP\n    VPUSH {D8-D15}                     ; push D8-D15 of the currnent running task to MSP\n\n    ;/* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3!, {R4-R11}                ; restore stack frame[R0-xPSR] of PSP to R4-R11\n    VLDMIA  R3!, {D8-D15}              ; restore stack frame[D0-D7] of PSP to D8-D15\n    VSTMDB  R2!, {D8-D15}              ; save stack frame[D0-D7] to MSP\n    STMFD R2!, {R4-R11}                ; save stack frame[R0-xPSR] to MSP\n    LDMFD R3, {R4-R5}                  ; restore stack frame[FPSCR,NO_NAME] to R4-R5\n    ADD   R2, R2, #104                 ; skip stack frame\n    STMFD R2, {R4-R5}                  ; save stack frame[FPSCR,NO_NAME] to MSP\n    B     _handleEntry\n\n    ;/**\n    ; * Before executing _handleEntry, MSP is as follows.\n    ; * MSP:\n    ; *                                                                              High addr--->|\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                                  | R4-R11,PRIMASK,TASK_SP | R0-R3,R12,LR,PC,xPSR |\n    ; * +--------------------------------------------------------------------------------+---------\n    ; *                           R13--->|                        |<---      #32     --->|<---Initial R13\n    ; *                                                           |  (copied from PSP)   |\n    ; *                                                           |<---R2(no use)\n    ; *\n    ; * NOTE: stack frame: R0-R3,R12,LR,PC,xPSR.\n    ; */\n_NoFloatInPsp\n    MOV   R2, R13\n    SUB   R13, #32                     ; #32: MSP reserved, used to store stack frame in PSP\n\n    MRS   R3, PSP\n    ADD   R12, R3, #32                 ; PSP+32 = Stack pointer of the task before entering the exception\n    PUSH  {R12}                        ; push task SP to MSP\n\n    MRS   R12, PRIMASK\n    PUSH  {R4-R12}                     ; push R4-R11,PRIMASK of the current running task to MSP\n\n    ;/* Copy stack frame from the stack of the current running task to MSP */\n    LDMFD R3, {R4-R11}                 ; restore stack frame of PSP to R4-R11\n    STMFD R2!, {R4-R11}                ; save stack frame to MSP\n    ORR   R0, R0, #FLAG_NO_FLOAT       ; R0[b28] = 1, no FPU    &&&&&&&&&&\n\n    ;/**\n    ; * _handleEntry: Call osExcHandleEntry\n    ; * param1: R0 --- b28:    FLAG_NO_FLOAT.\n    ; *                b17:    FLAG_HWI_ACTIVE.\n    ; *                b16:    FLAG_ADDR_VALID.\n    ; *                b15-b8: Error state code in table g_uwExcTbl or HF_DEBUGEVT or HF_VECTBL.\n    ; *                b7-b0:  OS_EXC_CAUSE_HARDFAULT or OS_EXC_CAUSE_NMI or OS_EXC_CAUSE_MEMFAULT\n    ; *                        or OS_EXC_CAUSE_BUSFAULT or OS_EXC_CAUSE_USAGEFAULT.\n    ; * param2: R1 --- The value of BFAR or MMFAR if R0[b16] = 1, otherwise invalid.\n    ; * param3: R2 --- external interrupt number(0-239) if R0[b17] = 1, otherwise invalid.\n    ; * param4: R3 --- Point to the top of the stack(R4 or S16) that the exception stack frame in MSP.\n    ; */\n_handleEntry\n    MOV R3, R13\n    CPSID I\n    CPSID F\n    B  osExcHandleEntry\n\n    NOP\n    ALIGN\n    END\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m7/los_exc.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n\n#include \"los_exc.inc\"\n#include \"los_task.ph\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n//extern ST_LOS_TASK g_stLosTask;\n#if (LOSCFG_PLATFORM_EXC == YES)\n\nUINT32 g_uwCurNestCount = 0;\nEXC_INFO_S m_stExcInfo;\n/*\n * CFSR register, include UFSR,BFSR and MFSR.\n *\n * +----------------------------------------------------------------------------------+\n * |                                      UFSR                                        |\n * |-----------+-----------+-----------+-------+------+-------+----------+------------|\n * |  31 - 26  |     25    |     24    | 23-20 |  19  |   18  |    17    |     16     |\n * |-----------+-----------+-----------+-------+------+-------+----------+------------|\n * |    ---    | DIVBYZERO | UNALIGNED |  ---  | NOCP | INVPC | INVSTATE | UNDEFINSTR |\n * +----------------------------------------------------------------------------------+\n *\n * +----------------------------------------------------------------------------------+\n * |                                     BFSR                                         |\n * |-----------+-----+--------+--------+----------+-------------+-----------+---------|\n * |     15    |  14 |   13   |   12   |    11    |      10     |     9     |    8    |\n * |-----------+-----+--------+--------+----------+-------------+-----------+---------|\n * | BFARVALID | --- | LSPERR | STKERR | UNSTKERR | IMPRECISERR | PRECISERR | IBUSERR |\n * +----------------------------------------------------------------------------------+\n *\n * +----------------------------------------------------------------------------------+\n * |                                     MFSR                                         |\n * |-----------+-------+---------+---------+-----------+-------+----------+-----------|\n * |     7     |   6   |    5    |    4    |     3     |   2   |    1     |     0     |\n * |-----------+-------+---------+---------+-----------+-------+----------+-----------|\n * | MMARVALID |  ---  | MLSPERR | MSTKERR | MUNSTKERR |  ---  | DACCVIOL | ICACCVIOL |\n * +----------------------------------------------------------------------------------+\n */\nUINT8 g_uwExcTbl[32] =\n{\n    0, 0, 0, 0, 0, 0, OS_EXC_UF_DIVBYZERO, OS_EXC_UF_UNALIGNED,\n    0, 0, 0, 0, OS_EXC_UF_NOCP, OS_EXC_UF_INVPC, OS_EXC_UF_INVSTATE, OS_EXC_UF_UNDEFINSTR,\n    0, 0, OS_EXC_BF_LSPERR, OS_EXC_BF_STKERR, OS_EXC_BF_UNSTKERR, OS_EXC_BF_IMPRECISERR, OS_EXC_BF_PRECISERR, OS_EXC_BF_IBUSERR,\n    0, 0, OS_EXC_MF_MLSPERR, OS_EXC_MF_MSTKERR, OS_EXC_MF_MUNSTKERR, 0, OS_EXC_MF_DACCVIOL, OS_EXC_MF_IACCVIOL\n};\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\nVOID *m_puwExcContent;\nUINT32 g_uwArraySize = 0;\nEXC_INFO_ARRAY_S m_stExcArray[OS_EXC_TYPE_MAX - 1];\nstatic VOID osExcSave2DDR(VOID);\n#endif\n\nextern VOID LOS_Reboot(VOID);\n\n/*****************************************************************************\n Function    : osExcInfoDisplay\n Description : EXC info display\n Input       : pstExc --- Pointer to the EXC data\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcInfoDisplay(EXC_INFO_S *pstExc)\n{\n    PRINT_ERR(\"Phase      = 0x%x\\n\", pstExc->usPhase);\n    PRINT_ERR(\"Type       = 0x%x\\n\", pstExc->usType);\n    PRINT_ERR(\"FaultAddr  = 0x%x\\n\", pstExc->uwFaultAddr);\n    PRINT_ERR(\"ThrdPid    = 0x%x\\n\", pstExc->uwThrdPid);\n    PRINT_ERR(\"R0         = 0x%x\\n\", pstExc->pstContext->uwR0);\n    PRINT_ERR(\"R1         = 0x%x\\n\", pstExc->pstContext->uwR1);\n    PRINT_ERR(\"R2         = 0x%x\\n\", pstExc->pstContext->uwR2);\n    PRINT_ERR(\"R3         = 0x%x\\n\", pstExc->pstContext->uwR3);\n    PRINT_ERR(\"R4         = 0x%x\\n\", pstExc->pstContext->uwR4);\n    PRINT_ERR(\"R5         = 0x%x\\n\", pstExc->pstContext->uwR5);\n    PRINT_ERR(\"R6         = 0x%x\\n\", pstExc->pstContext->uwR6);\n    PRINT_ERR(\"R7         = 0x%x\\n\", pstExc->pstContext->uwR7);\n    PRINT_ERR(\"R8         = 0x%x\\n\", pstExc->pstContext->uwR8);\n    PRINT_ERR(\"R9         = 0x%x\\n\", pstExc->pstContext->uwR9);\n    PRINT_ERR(\"R10        = 0x%x\\n\", pstExc->pstContext->uwR10);\n    PRINT_ERR(\"R11        = 0x%x\\n\", pstExc->pstContext->uwR11);\n    PRINT_ERR(\"R12        = 0x%x\\n\", pstExc->pstContext->uwR12);\n    PRINT_ERR(\"PriMask    = 0x%x\\n\", pstExc->pstContext->uwPriMask);\n    PRINT_ERR(\"SP         = 0x%x\\n\", pstExc->pstContext->uwSP);\n    PRINT_ERR(\"LR         = 0x%x\\n\", pstExc->pstContext->uwLR);\n    PRINT_ERR(\"PC         = 0x%x\\n\", pstExc->pstContext->uwPC);\n    PRINT_ERR(\"xPSR       = 0x%x\\n\", pstExc->pstContext->uwxPSR);\n\n    PRINT_ERR(\"\\nplease use the addr2line tool to analyze the call stack on PC:\\n\");\n    PRINT_ERR(\"addr2line -e (xxx.axf/xxx.elf/xxx.out) -a -f \");\n    for (UINT32 i = 0; i < pstExc->uwCallStackDepth; i++)\n    {\n        printf(\"%#x \", pstExc->uwCallStack[i]);\n    }\n    printf(\"\\n\");\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcCallStackAnalysis\n Description : Call stack analysis\n Input       : pstExc  ---  point to exception info\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcCallStackAnalysis(EXC_INFO_S *pstExc)\n{\n    UINT32 uwSP;\n    UINT32 uwLR;\n    UINT32 uwPC;\n    UINT32 uwStackStartAddr;\n    UINT32 uwStackSize;\n    UINT32 uwDepth = 0;\n    BOOL   bFirstLrValid = FALSE;\n\n    uwSP = pstExc->pstContext->uwSP;  /* sp pointer before entering exception */\n\n    /*\n     * save first and second depth\n     * first: PC before entering exception\n     * second: (LR - 4) before entering exception\n     * NOTE: If an exception occurs in the interrupt, LR may be EXC_RETURN, so we must make sure\n     *       that LR is valid, exclude EXC_RETURN.\n     */\n    pstExc->uwCallStack[uwDepth++] = pstExc->pstContext->uwPC;\n    if ((pstExc->pstContext->uwLR >= LOSCFG_EXC_CODE_START_ADDR) && \\\n        (pstExc->pstContext->uwLR <= LOSCFG_EXC_CODE_START_ADDR + LOSCFG_EXC_CODE_SIZE))\n    {\n        pstExc->uwCallStack[uwDepth++] = pstExc->pstContext->uwLR - sizeof(VOID *);  /* lr = pc + 4 */\n        bFirstLrValid = TRUE;\n    }\n\n    /*\n     * get the start address and size of the stack before entering the exception\n     */\n    if (pstExc->usPhase == OS_EXC_IN_TASK)  /* task use PSP */\n    {\n        uwStackStartAddr = g_stLosTask.pstRunTask->uwTopOfStack;\n        uwStackSize = g_stLosTask.pstRunTask->uwStackSize;\n    }\n    else  /* init and interrupt use MSP */\n    {\n        uwStackStartAddr = LOSCFG_EXC_MSP_START_ADDR;\n        uwStackSize = LOSCFG_EXC_MSP_SIZE;\n    }\n\n    /*\n     * check stack overflow, if so, compensate for overflow, readjust stack start address and size.\n     */\n    if (uwSP < uwStackStartAddr)  /* stack top overflow */\n    {\n        if (pstExc->usPhase == OS_EXC_IN_TASK)\n        {\n            PRINT_ERR(\"task %s stack top overflow\\n\", g_stLosTask.pstRunTask->pcTaskName);\n        }\n        else\n        {\n            PRINT_ERR(\"MSP top overflow\\n\");\n        }\n        uwStackSize += (uwStackStartAddr - uwSP);  /* compensate overflow size */\n        uwStackStartAddr = uwSP;  /* readjust stack start address */\n    }\n\n    /*\n     * Traverses the entire stack from the top of the stack to the bottom of the stack,\n     * find all LR.\n     */\n    for (; uwSP < uwStackStartAddr + uwStackSize; uwSP += sizeof(UINT32))\n    {\n        uwLR = *(UINT32 *)uwSP;\n        if (uwLR % 2 == 0)  /* Thumb instruction, LR bit0 == 1 */\n        {\n            continue;\n        }\n\n        /*\n         * It may be LR, which must be further determined based on the start address\n         * and end address of the code segment.\n         */\n        if ((uwLR >= LOSCFG_EXC_CODE_START_ADDR) && (uwLR <= LOSCFG_EXC_CODE_START_ADDR + LOSCFG_EXC_CODE_SIZE) \\\n            && (uwDepth < LOSCFG_EXC_CALL_STACK_ANALYSIS_MAX_DEPTH))\n        {\n            uwPC = uwLR - sizeof(VOID *);  /* lr = pc + 4 */\n            /* the second depth(first LR) has been saved */\n            if ((uwDepth == 2) && (uwPC == pstExc->uwCallStack[1]) && (bFirstLrValid == TRUE))\n            {\n                continue;\n            }\n            pstExc->uwCallStack[uwDepth++] = uwPC;\n        }\n    }\n    pstExc->uwCallStackDepth = uwDepth;  /* save call stack depth */\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcHandleEntry\n Description : EXC handler entry\n Input       : uwExcType     --- EXC type\n             : uwFaultAddr   --- The address of an accurate address access error\n             : uwPid         --- Interrupt number\n             : puwExcBufAddr --- Point to the stack frame without FPU\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osExcHandleEntry(UINT32 uwExcType, UINT32 uwFaultAddr, UINT32 uwPid, EXC_CONTEXT_S *pstExcBufAddr)\n{\n    /* uwExcType high 16 bits: 0x01 - uwFaultAddr valid, 0x02 - in hwi */\n    UINT16 usTmpFlag = (uwExcType >> 16) & 0xFFFF;\n\n    g_uwCurNestCount++;\n#if (LOSCFG_PLATFORM_HWI == YES)\n    extern UINT32 g_vuwIntCount;\n    g_vuwIntCount++;\n#endif\n\n    /* Save interrupt nesting times */\n    m_stExcInfo.usNestCnt = (UINT16)g_uwCurNestCount;\n    /* uwExcType low 16 bits: exc type */\n    m_stExcInfo.usType = (UINT16)uwExcType & 0xFFFF;\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    /* Initializing a pointer to save an exception context */\n    m_puwExcContent = (UINT32 *)m_aucTaskArray;\n#endif\n\n    /* Save the fault address when an exception occurs if it is valid */\n    if (usTmpFlag & OS_EXC_FLAG_FAULTADDR_VALID)\n    {\n        m_stExcInfo.uwFaultAddr = uwFaultAddr;\n    }\n    else\n    {\n        m_stExcInfo.uwFaultAddr = OS_EXC_IMPRECISE_ACCESS_ADDR;\n    }\n\n    /* Save the phase of the exception */\n    extern BOOL g_bTaskScheduled;\n    if (g_bTaskScheduled && (NULL !=  g_stLosTask.pstRunTask))\n    {\n        if (usTmpFlag & OS_EXC_FLAG_IN_HWI)\n        {\n            m_stExcInfo.usPhase = OS_EXC_IN_HWI;\n            m_stExcInfo.uwThrdPid = uwPid;  /* interrupt number */\n        }\n        else\n        {\n            m_stExcInfo.usPhase = OS_EXC_IN_TASK;\n            m_stExcInfo.uwThrdPid = g_stLosTask.pstRunTask->uwTaskID;  /* task id */\n        }\n    }\n    else\n    {\n        m_stExcInfo.usPhase = OS_EXC_IN_INIT;\n        m_stExcInfo.uwThrdPid = 0xffffffff;\n    }\n\n    /* uwExcType BIT_28: Wether or not to use FPU */\n    if(uwExcType & OS_EXC_FLAG_NO_FLOAT)\n    {\n        m_stExcInfo.usFpuContext = 0;\n    #if FPU_EXIST\n        /* NOTE: S16-S31, S0-S15,FPSCR,NO_NAME invalid */\n        m_stExcInfo.pstContext = (EXC_CONTEXT_S *)((UINT8 *)pstExcBufAddr - 64); /* point to S16 */\n    #else\n        m_stExcInfo.pstContext = pstExcBufAddr; /* point to uwR4 */\n    #endif\n    }\n    else\n    {\n        m_stExcInfo.usFpuContext = 1;\n        m_stExcInfo.pstContext = pstExcBufAddr;  /* point to S16 */\n    }\n\n    osExcCallStackAnalysis(&m_stExcInfo);\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    osExcSave2DDR();\n#endif\n\n    osExcInfoDisplay(&m_stExcInfo);\n\n    LOS_Reboot();\n}\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n/*****************************************************************************\n Function    : osExcSaveIntStatus\n Description : Save NVIC register group\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSaveIntStatus(VOID)\n{\n    /* Save exc type */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_NVIC;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save total size of NVIC */\n    *((UINT32 *)m_puwExcContent) = 0x164; // = OS_NVIC_INT_ENABLE_SIZE + OS_NVIC_INT_PEND_SIZE + OS_NVIC_INT_ACT_SIZE + OS_NVIC_INT_PRI_SIZE + 12 + 4 + 4\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save interrupt enable register group (start addr: 0xE000E100, size: 32bytes, CMSIS-Core: NVIC->ISER[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SETENA_BASE, OS_NVIC_INT_ENABLE_SIZE);\n    m_puwExcContent =(UINT8 *)m_puwExcContent + OS_NVIC_INT_ENABLE_SIZE;\n\n    /* Save interrupt pend register group (start addr: 0xE000E200, size: 32bytes, CMSIS-Core: NVIC->ISPR[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SETPEND_BASE, OS_NVIC_INT_PEND_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_PEND_SIZE;\n\n    /* Save interrupt active status register group (start addr: 0xE000E300, size: 32bytes, CMSIS-Core: NVIC->IABR[0 - 7]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_INT_ACT_BASE, OS_NVIC_INT_ACT_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_ACT_SIZE;\n\n    /* Save interrupt priority register group (start addr: 0xE000E400, size: 240bytes), CMSIS-Core: NVIC->IP[0 - 239] */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_PRI_BASE, OS_NVIC_INT_PRI_SIZE);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + OS_NVIC_INT_PRI_SIZE;\n\n    /* Save system exception priority register group (start addr: 0xE000ED18, size: 12bytes, CMSIS-Core: SCB->SHP[0 - 11]) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_EXCPRI_BASE, 12);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 12;\n\n    /* Save system processing control and state register group (start addr: 0xE000ED24, size: 4bytes, CMSIS-Core: SCB->SHCSR) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_SHCSR, 4);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save interrupt control and status register group (start addr: 0xE000ED04, size: 4bytes, CMSIS-Core: SCB->ICSR) */\n    memcpy(m_puwExcContent, (const void *)OS_NVIC_INT_CTRL, 4);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcRegister\n Description : Register exception\n Input       : uwType  --- exception type\n             : pFunc   --- exception callback function\n             : pArg    --- exception save info arg, not pFunc\n Output      : None\n Return      : None\n *****************************************************************************/\nVOID osExcRegister(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg)\n{\n    EXC_INFO_ARRAY_S *pstExcInfo;\n\n    if (uwType == 0 || uwType >= OS_EXC_TYPE_MAX || pFunc == NULL)\n    {\n        PRINT_ERR(\"osExcRegister ERROR!\\n\");\n        return;\n    }\n\n    pstExcInfo = &(m_stExcArray[uwType - 1]);\n    pstExcInfo->uwType       = uwType;\n    pstExcInfo->pFnExcInfoCb = pFunc;\n    pstExcInfo->pArg         = pArg;\n    pstExcInfo->uwValid      = TRUE;\n}\n\n/*****************************************************************************\n Function    : osExcSaveSysInfo\n Description : Saving exception information by calling callback function recursively\n Input       : uwType  --- exception type(OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1)\n             : pFunc   --- callback function\n             : uwLoop  --- loop total count\n             : uwLen   --- The size of the data saved each time\n             : uwIdx   --- loop index\n Output      : None\n Return      : None\n *****************************************************************************/\nVOID osExcSaveSysInfo(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, UINT32 uwLoop, UINT32 uwLen, UINT32 uwIdx)\n{\n    UINT32 uwRet;\n    UINT32 uwBuffer[OS_EXC_MAX_BUF_LEN];\n\n    /* Save exception type and size */\n    *((UINT32 *)m_puwExcContent) = uwType;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n    *((UINT32 *)m_puwExcContent)  = uwLen * (uwLoop - uwIdx);\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    for (; uwIdx < uwLoop; uwIdx++)\n    {\n        memset((VOID *)uwBuffer, 0, sizeof(UINT32) * OS_EXC_MAX_BUF_LEN);\n        uwRet = pFunc(uwIdx, (VOID *)uwBuffer);\n        if (LOS_OK == uwRet)\n        {\n            memcpy(m_puwExcContent, (VOID *)uwBuffer, uwLen);\n        }\n        m_puwExcContent =(UINT8 *)m_puwExcContent + uwLen;\n    }\n}\n\n/*****************************************************************************\n Function    : osExcSaveInfo\n Description : save exception info\n Input       : uwType  --- exception type(OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1)\n             : pFunc   --- exception callback\n             : pArg    --- register arg, used to generate the arg passed to the callback\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSaveInfo(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID *pArg)\n{\n    UINT32 uwLen;\n    UINT32 uwIdx;\n    UINT32 uwLoop;\n    UINT32 uwTaskSwitchCount = 0;\n    OS_TASK_SWITCH_INFO *pstTaskSwitchInfo;\n\n    switch(uwType)\n    {\n        case OS_EXC_TYPE_TSK:  /* save task info */\n            uwLen = sizeof(TSK_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        case OS_EXC_TYPE_QUE:  /* save queue info */\n            uwLen = sizeof(QUEUE_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        case OS_EXC_TYPE_NVIC:  /* save NVIC info */\n            (VOID)pFunc(0, 0);\n            goto END;\n\n        case OS_EXC_TYPE_TSK_SWITCH:  /* save task switch info */\n            pstTaskSwitchInfo = pArg;\n            uwTaskSwitchCount = pstTaskSwitchInfo->ucIsFull & 0x7F;\n            uwLen = sizeof(UINT32) + sizeof(CHAR) * LOS_TASK_NAMELEN; /* auwPID + acName */\n            if (pstTaskSwitchInfo->ucIsFull & 0x80)\n            {\n                uwIdx = pstTaskSwitchInfo->ucIdx;\n                uwLoop = uwIdx + uwTaskSwitchCount;\n            }\n            else\n            {\n                uwIdx = 0;\n                uwLoop = pstTaskSwitchInfo->ucIdx;\n            }\n            break;\n\n        case OS_EXC_TYPE_MEM:  /* save mem info */\n            uwLen = sizeof(MEM_INFO_S);\n            uwLoop = *(UINT32 *)pArg;\n            uwIdx = 0;\n            break;\n\n        default:\n            goto END;\n    }\n    osExcSaveSysInfo(uwType, (EXC_INFO_SAVE_CALLBACK)pFunc, uwLoop, uwLen, uwIdx);\nEND:\n    return;\n}\n\n/*****************************************************************************\n Function    : osExcSave2DDR\n Description : Save exception info to RAM\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nstatic VOID osExcSave2DDR(VOID)\n{\n    UINT32 uwIdx = 0;\n    UINT32 uwExcContextSize;\n\n    if (m_stExcInfo.usFpuContext == 1)\n    {\n        uwExcContextSize = sizeof(EXC_CONTEXT_S);\n    }\n    else\n    {\n        uwExcContextSize = sizeof(EXC_CONTEXT_S) - 136; /* except FPU register */\n    }\n\n    memset(m_puwExcContent, 0xff, g_uwArraySize);\n\n    /* Cortex-M type */\n    *((UINT32 *)m_puwExcContent) = 4;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /*\n     * Save exception type: OS_EXC_TYPE_CONTEXT\n     */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_CONTEXT;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* The size of struct EXC_INFO_S(except member EXC_CONTEXT_S*) and exception context size */\n    *((UINT32 *)m_puwExcContent) = sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *) + uwExcContextSize;\n    m_puwExcContent = (UINT8 *)m_puwExcContent + 4;\n\n    /* Save struct m_stExcInfo except m_stExcInfo.pstContext */\n    memcpy((VOID *)m_puwExcContent, (VOID *)&m_stExcInfo, sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *));\n    m_puwExcContent = (UINT8 *)m_puwExcContent + sizeof(EXC_INFO_S) - sizeof(EXC_CONTEXT_S *);\n\n    /* Save struct EXC_CONTEXT_S */\n    if (m_stExcInfo.usFpuContext == 0)\n    {\n        #if FPU_EXIST\n        /* m_stExcInfo.pstContext: init --- point to S16, S16->S31 invalid\n         *                         + 64 --- point to uwR4\n         *                         copy uwR4 -> uwxPSR */\n        memcpy((VOID *)m_puwExcContent, (UINT8 *)m_stExcInfo.pstContext + 64, uwExcContextSize);\n        #else\n        memcpy((VOID *)m_puwExcContent, m_stExcInfo.pstContext, uwExcContextSize);\n        #endif\n    }\n    else\n    {\n        memcpy((VOID *)m_puwExcContent, m_stExcInfo.pstContext, uwExcContextSize);\n    }\n    m_puwExcContent = (UINT8 *)m_puwExcContent + uwExcContextSize;\n\n    /*\n     * Save exception type: OS_EXC_TYPE_CONTEXT+1 ---> OS_EXC_TYPE_MAX-1\n     */\n    for (uwIdx = 0; uwIdx < OS_EXC_TYPE_MAX - 1; uwIdx++)\n    {\n        if (m_stExcArray[uwIdx].uwValid == FALSE)\n        {\n            continue;\n        }\n        osExcSaveInfo(m_stExcArray[uwIdx].uwType, m_stExcArray[uwIdx].pFnExcInfoCb, m_stExcArray[uwIdx].pArg);\n    }\n\n    /*\n     * Save exception type: OS_EXC_TYPE_MAX\n     */\n    *((UINT32 *)m_puwExcContent) = OS_EXC_TYPE_MAX;\n    m_puwExcContent = (UINT8*)m_puwExcContent + 4;\n\n    return;\n}\n#endif /*(LOSCFG_SAVE_EXC_INFO == YES)*/\n\n/*****************************************************************************\n Function    : osExcInit\n Description : Initializes the EXC\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT_INIT VOID osExcInit(UINT32 uwArraySize)\n{\n#if (LOSCFG_PLATFORM_HWI == YES)\n    /* Register exception handler to interrupt vector table in RAM */\n    m_pstHwiForm[-14 + OS_SYS_VECTOR_CNT] = NMI_Handler;\n    m_pstHwiForm[-13 + OS_SYS_VECTOR_CNT] = HardFault_Handler;\n    m_pstHwiForm[-12 + OS_SYS_VECTOR_CNT] = MemManage_Handler;\n    m_pstHwiForm[-11 + OS_SYS_VECTOR_CNT] = BusFault_Handler;\n    m_pstHwiForm[-10 + OS_SYS_VECTOR_CNT] = UsageFault_Handler;\n    m_pstHwiForm[-5  + OS_SYS_VECTOR_CNT] = SVC_Handler;\n#endif\n\n    /* Enable USGFAULT(BIT_18), BUSFAULT(BIT_17), MEMFAULT(BIT_16) */\n    *(volatile UINT32 *)OS_NVIC_SHCSR |= 0x70000;\n\n    /* Enable DIV 0(BIT_4) exception, unaligned(BIT_3) disable */\n    *(volatile UINT32 *)OS_NVIC_CCR |= 0x10;\n\n#if (LOSCFG_SAVE_EXC_INFO == YES)\n    g_uwArraySize = uwArraySize;\n    osExcRegister((EXC_INFO_TYPE)OS_EXC_TYPE_NVIC, (EXC_INFO_SAVE_CALLBACK)osExcSaveIntStatus, NULL);\n#endif\n}\n\nVOID osBackTrace(VOID)\n{\n    return;\n}\n\n#endif /*(LOSCFG_PLATFORM_EXC == YES)*/\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m7/los_exc.inc",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#ifndef _LOS_EXC_INC\n#define _LOS_EXC_INC\n\n#include \"los_exc.ph\"\n#include \"los_sys.ph\"\n#ifdef LOSCFG_LIB_LIBC\n#include \"string.h\"\n#endif\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n\n/* 定义异常发生的阶段 */\n#define OS_EXC_IN_INIT              0\n#define OS_EXC_IN_TASK              1\n#define OS_EXC_IN_HWI               2\n\n/*\n *异常类型:uwFaultAddr域是否有效 标志位\n */\n#define OS_EXC_FLAG_FAULTADDR_VALID     0x01\n\n/*\n *异常类型:异常是否发生在硬中断中标志位\n */\n#define OS_EXC_FLAG_IN_HWI              0x02\n\n#define OS_EXC_IMPRECISE_ACCESS_ADDR    0xABABABAB\n\n#define OS_EXC_FLAG_NO_FLOAT            0x10000000\n\n\n#define OS_EXC_MAX_BUF_LEN          25\n#define OS_EXC_MAX_NEST_DEPTH       1\n\n#define OS_NVIC_SHCSR               0xE000ED24\n#define OS_NVIC_CCR                 0xE000ED14\n\n#define OS_NVIC_INT_ENABLE_SIZE     0x20\n#define OS_NVIC_INT_PRI_SIZE        0xF0\n\n#define OS_NVIC_INT_PEND_SIZE       OS_NVIC_INT_ACT_SIZE\n#define OS_NVIC_INT_ACT_SIZE        OS_NVIC_INT_ENABLE_SIZE\n\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:总线状态寄存器入栈时发生错误\n */\n#define OS_EXC_BF_STKERR           1\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:总线状态寄存器出栈时发生错误\n */\n#define OS_EXC_BF_UNSTKERR         2\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:总线状态寄存器不精确的数据访问违例\n */\n#define OS_EXC_BF_IMPRECISERR      3\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:总线状态寄存器精确的数据访问违例\n */\n#define OS_EXC_BF_PRECISERR        4\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:总线状态寄存器取指时的访问违例\n */\n#define OS_EXC_BF_IBUSERR          5\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:存储器管理状态寄存器入栈时发生错误\n */\n#define OS_EXC_MF_MSTKERR          6\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:存储器管理状态寄存器出栈时发生错误\n */\n#define OS_EXC_MF_MUNSTKERR        7\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:存储器管理状态寄存器数据访问违例\n */\n#define OS_EXC_MF_DACCVIOL         8\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:存储器管理状态寄存器取指访问违例\n */\n#define OS_EXC_MF_IACCVIOL         9\n\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:用法错误，表示除法运算时除数为零\n */\n#define OS_EXC_UF_DIVBYZERO        10\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:用法错误，未对齐访问导致的错误\n */\n#define OS_EXC_UF_UNALIGNED        11\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:用法错误，试图执行协处理器相关指令\n */\n#define OS_EXC_UF_NOCP             12\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:用法错误，在异常返回时试图非法地加载EXC_RETURN到PC\n */\n#define OS_EXC_UF_INVPC            13\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:用法错误，试图切入ARM状态\n */\n#define OS_EXC_UF_INVSTATE         14\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:用法错误，执行的指令其编码是未定义的——解码不能\n */\n#define OS_EXC_UF_UNDEFINSTR       15\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:NMI中断\n */\n\n#define OS_EXC_CAUSE_NMI           16\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:硬fault\n */\n#define OS_EXC_CAUSE_HARDFAULT     17\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:任务处理函数退出\n */\n#define OS_EXC_CAUSE_TASK_EXIT     18\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:致命错误\n */\n#define OS_EXC_CAUSE_FATAL_ERR     19\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:调试事件导致的硬fault\n */\n#define OS_EXC_CAUSE_DEBUGEVT      20\n\n/**\n *@ingroup los_exc\n *Cortex-M4异常具体类型:取向量时发生的硬fault\n */\n#define OS_EXC_CAUSE_VECTBL        21\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n#endif /* _LOS_EXC_INC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/cortex-m7/los_exc.ph",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef _LOS_EXC_PH\n#define _LOS_EXC_PH\n\n#include \"los_exc.h\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n#if (LOSCFG_PLATFORM_EXC == YES)\ntypedef enum\n{\n    OS_EXC_TYPE_CONTEXT     = 0,\n    OS_EXC_TYPE_TSK         = 1,\n    OS_EXC_TYPE_QUE         = 2,\n    OS_EXC_TYPE_NVIC        = 3,\n    OS_EXC_TYPE_TSK_SWITCH  = 4,\n    OS_EXC_TYPE_MEM         = 5,\n    OS_EXC_TYPE_MAX         = 6\n} EXC_INFO_TYPE;\n\ntypedef struct tagExcInfoCallBackArray\n{\n    EXC_INFO_TYPE           uwType;\n    UINT32                  uwValid;\n    EXC_INFO_SAVE_CALLBACK  pFnExcInfoCb;\n    VOID*                   pArg;\n}EXC_INFO_ARRAY_S;\n\n\n\n#define MAX_SCENE_INFO_SIZE     (8 + sizeof(EXC_INFO_S) - 4 + sizeof(EXC_CONTEXT_S))\n#define MAX_TSK_INFO_SIZE       (8 + sizeof(TSK_INFO_S)* (LOSCFG_BASE_CORE_TSK_LIMIT + 1))\n#define MAX_INT_INFO_SIZE       (8 + 0x164)\n\n#if (LOSCFG_BASE_IPC_QUEUE == YES)\n#define MAX_QUEUE_INFO_SIZE     (8 + sizeof(QUEUE_INFO_S)* LOSCFG_BASE_IPC_QUEUE_LIMIT)\n#else\n#define MAX_QUEUE_INFO_SIZE     (0)\n#endif\n\n#if (LOSCFG_BASE_CORE_EXC_TSK_SWITCH == YES)\n#define MAX_SWITCH_INFO_SIZE    (8 + (sizeof(UINT32) + sizeof(CHAR) * LOS_TASK_NAMELEN)* OS_TASK_SWITCH_INFO_COUNT)\n#else\n#define MAX_SWITCH_INFO_SIZE    (0)\n#endif\n\n#if (LOSCFG_BASE_MEM_NODE_INTEGRITY_CHECK == YES)\n#define MAX_MEM_INFO_SIZE       (8 + sizeof(MEM_INFO_S)* OS_SYS_MEM_NUM)\n#else\n#define MAX_MEM_INFO_SIZE       (0)\n#endif\n\n#define MAX_EXC_MEM_SIZE ( 4 + MAX_SCENE_INFO_SIZE + MAX_TSK_INFO_SIZE + MAX_QUEUE_INFO_SIZE + MAX_INT_INFO_SIZE + MAX_SWITCH_INFO_SIZE + MAX_MEM_INFO_SIZE + 4)\n\nVOID osExcRegister(EXC_INFO_TYPE uwType, EXC_INFO_SAVE_CALLBACK pFunc, VOID* pArg);\n#endif\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/include/los_exc.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef _LOS_EXC_H\n#define _LOS_EXC_H\n\n#include \"los_hwi.h\"\n#include \"los_task.ph\"\n#include \"los_queue.h\"\n#include \"los_config.h\"\n#include \"los_memcheck.h\"\n#include \"los_hw.h\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n#if (LOSCFG_PLATFORM_EXC == YES)\n\n\n#define OS_EXC_IN_INIT                      0\n#define OS_EXC_IN_TASK                      1\n#define OS_EXC_IN_HWI                       2\n\n#define OS_EXC_MAX_BUF_LEN                  25\n#define OS_EXC_MAX_NEST_DEPTH               1\n\n#define OS_EXC_FLAG_NO_FLOAT                0x10000000\n#define OS_EXC_FLAG_FAULTADDR_VALID         0x01\n#define OS_EXC_FLAG_IN_HWI                  0x02\n\n#define OS_EXC_IMPRECISE_ACCESS_ADDR        0xABABABAB\n\n/**\n *@ingroup los_exc\n * the struct of register files\n *\n * description: the register files that saved when exception triggered\n *\n * notes:the following register with prefix 'uw'  correspond to the registers in the cpu  data sheet.\n */\ntypedef struct tagExcContext\n{\n#if FPU_EXIST\n    UINT32 S16;\n    UINT32 S17;\n    UINT32 S18;\n    UINT32 S19;\n    UINT32 S20;\n    UINT32 S21;\n    UINT32 S22;\n    UINT32 S23;\n    UINT32 S24;\n    UINT32 S25;\n    UINT32 S26;\n    UINT32 S27;\n    UINT32 S28;\n    UINT32 S29;\n    UINT32 S30;\n    UINT32 S31;\n#endif\n    UINT32 uwR4;\n    UINT32 uwR5;\n    UINT32 uwR6;\n    UINT32 uwR7;\n    UINT32 uwR8;\n    UINT32 uwR9;\n    UINT32 uwR10;\n    UINT32 uwR11;\n    UINT32 uwPriMask;\n    UINT32 uwSP;\n    UINT32 uwR0;\n    UINT32 uwR1;\n    UINT32 uwR2;\n    UINT32 uwR3;\n    UINT32 uwR12;\n    UINT32 uwLR;\n    UINT32 uwPC;\n    UINT32 uwxPSR;\n#if FPU_EXIST\n    UINT32 S0;\n    UINT32 S1;\n    UINT32 S2;\n    UINT32 S3;\n    UINT32 S4;\n    UINT32 S5;\n    UINT32 S6;\n    UINT32 S7;\n    UINT32 S8;\n    UINT32 S9;\n    UINT32 S10;\n    UINT32 S11;\n    UINT32 S12;\n    UINT32 S13;\n    UINT32 S14;\n    UINT32 S15;\n    UINT32 FPSCR;\n    UINT32 NO_NAME;\n#endif\n}EXC_CONTEXT_S;\n\ntypedef UINT32 (*EXC_INFO_SAVE_CALLBACK)(UINT32 , VOID* );\ntypedef VOID (* EXC_PROC_FUNC)(UINT32, EXC_CONTEXT_S *);\nVOID osExcHandleEntry(UINT32 uwExcType, UINT32 uwFaultAddr, UINT32 uwPid, EXC_CONTEXT_S *  pstExcBufAddr);\n\n/**\n * @ingroup  los_hwi\n * @brief: Exception initialization.\n *\n * @par Description:\n * This API is used to configure the exception function vector table.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n *@param uwArraySize [IN] Memory size of exception.\n *\n * @retval: None\n * @par Dependency:\n * <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nVOID osExcInit(UINT32 uwArraySize);\n\nextern VOID NMI_Handler(VOID);\nextern VOID HardFault_Handler(VOID);\nextern VOID MemManage_Handler(VOID);\nextern VOID BusFault_Handler(VOID);\nextern VOID UsageFault_Handler(VOID);\nextern VOID SVC_Handler(VOID);\nextern VOID osBackTrace(VOID);\nextern UINT8 m_aucTaskArray[];\n\n/**\n *@ingroup los_exc\n *@brief Kernel panic function.\n *\n *@par Description:\n *Stack function that prints kernel panics.\n *@attention After this function is called and stack information is printed, the system will fail to respond.\n *@attention The input parameter can be NULL.\n *@param fmt [IN] Type #char* : variadic argument.\n *\n *@retval #None.\n *\n *@par Dependency:\n *los_exc.h: the header file that contains the API declaration.\n *@see None.\n *@since Huawei LiteOS V100R001C00\n*/\nvoid LOS_Panic(const char * fmt, ...);\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:总线状态寄存器入栈时发生错误\n */\n#define OS_EXC_BF_STKERR           1\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:总线状态寄存器出栈时发生错误\n */\n#define OS_EXC_BF_UNSTKERR         2\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:总线状态寄存器不精确的数据访问违例\n */\n#define OS_EXC_BF_IMPRECISERR      3\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:总线状态寄存器精确的数据访问违例\n */\n#define OS_EXC_BF_PRECISERR        4\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:总线状态寄存器取指时的访问违例\n */\n#define OS_EXC_BF_IBUSERR          5\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:总线错误，浮点惰性压栈错误，具有浮点单元的cortex-m4及cortex-m7中存在\n */\n#define OS_EXC_BF_LSPERR           6\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:存储器管理状态寄存器入栈时发生错误\n */\n#define OS_EXC_MF_MSTKERR          7\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:存储器管理状态寄存器出栈时发生错误\n */\n#define OS_EXC_MF_MUNSTKERR        8\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:存储器管理状态寄存器数据访问违例\n */\n#define OS_EXC_MF_DACCVIOL         9\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:存储器管理状态寄存器取指访问违例\n */\n#define OS_EXC_MF_IACCVIOL         10\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:存储器管理错误，浮点惰性压栈错误，具有浮点单元的cortex-m4及cortex-m7中存在\n */\n#define OS_EXC_MF_MLSPERR          11\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:用法错误，表示除法运算时除数为零\n */\n#define OS_EXC_UF_DIVBYZERO        12\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:用法错误，未对齐访问导致的错误\n */\n#define OS_EXC_UF_UNALIGNED        13\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:用法错误，试图执行协处理器相关指令\n */\n#define OS_EXC_UF_NOCP             14\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:用法错误，在异常返回时试图非法地加载EXC_RETURN到PC\n */\n#define OS_EXC_UF_INVPC            15\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:用法错误，试图切入ARM状态\n */\n#define OS_EXC_UF_INVSTATE         16\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:用法错误，执行的指令其编码是未定义的——解码不能\n */\n#define OS_EXC_UF_UNDEFINSTR       17\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:NMI中断\n */\n#define OS_EXC_CAUSE_NMI           18\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:硬fault\n */\n#define OS_EXC_CAUSE_HARDFAULT     19\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:存储器管理fault\n */\n#define OS_EXC_CAUSE_MEMFAULT      20\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:总线fault\n */\n#define OS_EXC_CAUSE_BUSFAULT      21\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:使用fault\n */\n#define OS_EXC_CAUSE_USAGEFAULT    22\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:SVC调用\n */\n#define OS_EXC_CAUSE_SVC           23\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:调试事件导致的硬fault\n */\n#define OS_EXC_CAUSE_DEBUGEVT      24\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:取向量时发生的硬fault\n */\n#define OS_EXC_CAUSE_VECTBL        25\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:任务处理函数退出\n */\n#define OS_EXC_CAUSE_TASK_EXIT     26\n\n/**\n *@ingroup los_exc\n *Cortex-M异常具体类型:致命错误\n */\n#define OS_EXC_CAUSE_FATAL_ERR     27\n\n/**\n *@ingroup los_exc\n * 异常信息结构体\n *\n * 描述:Cortex-M平台下的异常触发时保存的异常信息\n *\n */\ntypedef struct tagExcInfo\n{\n    UINT16 usPhase;              /**< 异常发生阶段： 0表示异常发生在初始化中，1表示异常发生在任务中，2表示异常发生在中断中 */\n    UINT16 usType;               /**< 异常类型，分高低两字节，出异常时高低字节分别对照上面列出的异常编号 */\n    UINT32 uwFaultAddr;          /**< 若为精确地址访问错误表示异常发生时的错误访问地址 */\n    UINT32 uwThrdPid;            /**< 在中断中发生异常，表示中断号。在任务中发生异常，表示任务id，如果发生在初始化中，则为0xffffffff */\n    UINT16 usNestCnt;            /**< 异常嵌套个数，目前仅支持第一次进入异常时执行注册的钩子函数 */\n    UINT16 usFpuContext;         /**< 是否保存浮点寄存器，1表示需要保存浮点寄存器 */\n    UINT32 uwCallStackDepth;     /**< 异常时调用栈分析深度 */\n    UINT32 uwCallStack[LOSCFG_EXC_CALL_STACK_ANALYSIS_MAX_DEPTH];  /**< 函数调用地址 */\n    EXC_CONTEXT_S *pstContext;   /**< 异常发生时的寄存器值，由usFpuContext决定寄存器中是否包含浮点寄存器的值 */\n}EXC_INFO_S;\n\nextern UINT32 g_uwCurNestCount;\nextern UINT32 g_vuwIntCount;\nextern EXC_INFO_S m_stExcInfo;\n\nVOID osExcInfoDisplay(EXC_INFO_S *pstExc);\n\nextern OS_TASK_SWITCH_INFO g_astTskSwitchInfo;\nextern UINT8 g_uwExcTbl[32];\n\n#endif\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n#endif /* _LOS_EXC_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/include/los_hw.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n /**@defgroup los_hw hardware\n   *@ingroup kernel\n */\n\n#ifndef _LOS_HW_H\n#define _LOS_HW_H\n\n#include \"los_base.h\"\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n/**\n * @ingroup los_hw\n * The initialization value of stack space.\n */\n#define EMPTY_STACK                 0xCACA\n\n/**\n * @ingroup los_hw\n * Trigger a task.\n */\n#define osTaskTrap()                __asm(\"   TRAP    #31\")\n\n/**\n * @ingroup los_hw\n * Check task schedule.\n */\n#define LOS_CHECK_SCHEDULE          ((!g_usLosTaskLock))\n\n/**\n * @ingroup los_hw\n * FPU exist macro: If it exist, save EXC_RETURN value in the context of the task to check\n * the size of the stack frame(BIT_4: 1 ---> 8 words, 0 ---> 26 wrods) used by the task.\n */\n#define FPU_EXIST  (  (defined ( __CC_ARM ) && defined ( __TARGET_FPU_VFP )) \\\n                   || (defined ( __ICCARM__ ) && defined ( __ARMVFP__ )) \\\n                   || (defined ( __GNUC__ ) && defined ( __VFP_FP__ ) && !defined( __SOFTFP__ )) )\n\n\n/**\n * @ingroup los_hw\n * Define the type of a task context control block.\n */\ntypedef struct tagTskContext\n{\n    UINT32 uwR4;\n    UINT32 uwR5;\n    UINT32 uwR6;\n    UINT32 uwR7;\n    UINT32 uwR8;\n    UINT32 uwR9;\n    UINT32 uwR10;\n    UINT32 uwR11;\n    UINT32 uwPriMask;\n#if FPU_EXIST\n    UINT32 uwExcReturn;\n#endif\n    UINT32 uwR0;\n    UINT32 uwR1;\n    UINT32 uwR2;\n    UINT32 uwR3;\n    UINT32 uwR12;\n    UINT32 uwLR;\n    UINT32 uwPC;\n    UINT32 uwxPSR;\n} TSK_CONTEXT_S;\n\n\n\n/**\n * @ingroup  los_hw\n * @brief: Task stack initialization.\n *\n * @par Description:\n * This API is used to initialize the task stack.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param  uwTaskID     [IN] Type#UINT32: TaskID.\n * @param  uwStackSize  [IN] Type#UINT32: Total size of the stack.\n * @param  pTopStack    [IN] Type#VOID *: Top of task's stack.\n *\n * @retval: pstContext Type#TSK_CONTEXT_S *.\n * @par Dependency:\n * <ul><li>los_hw.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern VOID * osTskStackInit(UINT32 uwTaskID, UINT32 uwStackSize, VOID *pTopStack);\n\n\n\n/**\n * @ingroup  los_hw\n * @brief: Task scheduling Function.\n *\n * @par Description:\n * This API is used to scheduling task.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param  None.\n *\n * @retval: None.\n * @par Dependency:\n * <ul><li>los_hw.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern VOID osSchedule(VOID);\n\n\n/**\n * @ingroup  los_hw\n * @brief: Function to determine whether task scheduling is required.\n *\n * @par Description:\n * This API is used to Judge and entry task scheduling.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param  None.\n *\n * @retval: None.\n * @par Dependency:\n * <ul><li>los_hw.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern VOID LOS_Schedule(VOID);\n\nLITE_OS_SEC_TEXT_MINOR VOID osTaskExit(VOID);\n\n/**\n * @ingroup  los_hw\n * @brief: The M3 wait interrupt instruction.\n *\n * @par Description:\n * This API is used to make CPU enter to power-save mode.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param  None.\n *\n * @retval: None.\n * @par Dependency:\n * <ul><li>los_hw.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\n\nextern VOID osEnterSleep(VOID);\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n\n#endif /* _LOS_HW_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/include/los_hw_tick.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n /**@defgroup los_hw hardware\n   *@ingroup kernel\n */\n\n#ifndef _LOS_HW_TICK_H\n#define _LOS_HW_TICK_H\n\n#include \"los_base.h\"\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n#if (LOSCFG_KERNEL_TICKLESS == YES)\n/**\n * @ingroup los_hwi\n * Check whether the counting direction of system tick is decreasing, it will be used to\n * readjust the value of the system tick, if not decreasing, please set this macro to NO.\n */\n#define LOSCFG_SYSTICK_CNT_DIR_DECREASE      YES\n\n/**\n * @ingroup los_hwi\n * Max reload value of system tick.\n */\n#define LOSCFG_SYSTICK_LOAD_RELOAD_MAX      SysTick_LOAD_RELOAD_Msk\n\n/*****************************************************************************\nFunction   : LOS_SysTickStop\nDescription: stop systick\nInput   : none\noutput  : none\nreturn  : none\n*****************************************************************************/\nLITE_OS_SEC_TEXT_MINOR static inline VOID LOS_SysTickStop(VOID)\n{\n    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;\n}\n\n/*****************************************************************************\nFunction   : LOS_SysTickStart\nDescription: start systick\nInput   : none\noutput  : none\nreturn  : none\n*****************************************************************************/\nLITE_OS_SEC_TEXT_MINOR static inline VOID LOS_SysTickStart(VOID)\n{\n    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;\n}\n\n/*****************************************************************************\nFunction   : LOS_SysTickGetIntStatus\nDescription: get systick interrupt status\nInput   : none\noutput  : none\nreturn  : systick interrupt status\n*****************************************************************************/\nLITE_OS_SEC_TEXT_MINOR static inline UINT32 LOS_SysTickGetIntStatus(VOID)\n{\n    return SCB->ICSR & SCB_ICSR_PENDSTSET_Msk;\n}\n\nextern VOID LOS_SysTickReload(UINT32 uwCyclesPerTick);\n\n#endif\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n\n#endif /* _LOS_HW_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/include/los_hwi.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n /**@defgroup los_hwi Hardware interrupt\n   *@ingroup kernel\n */\n#ifndef _LOS_HWI_H\n#define _LOS_HWI_H\n\n#include \"los_base.h\"\n#include \"los_sys.h\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n/**\n * @ingroup los_hwi\n * Maximum number of used hardware interrupts.\n */\n/*lint -e553*/\n#ifndef OS_HWI_MAX_NUM\n#if (__CORTEX_M == 0U)\n/* Cortex-m0 and Cortex-m0plus default 32 */\n#define OS_HWI_MAX_NUM              32\n#elif (__CORTEX_M == 3U || __CORTEX_M == 4U || __CORTEX_M == 7U)\n/* Cortex-m3,Cortex-m4 and Cortex-m7 default 240 */\n#define OS_HWI_MAX_NUM              240\n#endif\n#endif\n/*lint +e553*/\n\n/**\n * @ingroup los_hwi\n * Highest priority of a hardware interrupt.\n */\n#ifndef OS_HWI_PRIO_HIGHEST\n#define OS_HWI_PRIO_HIGHEST         0\n#endif\n\n/**\n * @ingroup los_hwi\n * Lowest priority of a hardware interrupt.\n */\n#ifndef OS_HWI_PRIO_LOWEST\n#define OS_HWI_PRIO_LOWEST          7\n#endif\n\n/**\n * @ingroup los_config\n * Configuration item for interrupt with argument\n */\n#ifndef OS_HWI_WITH_ARG\n#define OS_HWI_WITH_ARG             NO\n#endif\n\n/**\n * @ingroup los_hwi\n * Define the type of a hardware interrupt number.\n */\ntypedef UINT32 HWI_HANDLE_T;\n\n/**\n * @ingroup los_hwi\n * Define the type of a hardware interrupt priority.\n */\ntypedef UINT16 HWI_PRIOR_T;\n\n/**\n * @ingroup los_hwi\n * Define the type of hardware interrupt mode configurations.\n */\ntypedef UINT16 HWI_MODE_T;\n\n/**\n * @ingroup los_hwi\n * Define the type of the parameter used for the hardware interrupt creation function. The function of this parameter varies among platforms.\n */\ntypedef UINT32 HWI_ARG_T;\n\n/**\n * @ingroup  los_hwi\n * Define the type of a hardware interrupt handling function.\n */\n#if (OS_HWI_WITH_ARG == YES)\n\ntypedef VOID (* HWI_PROC_FUNC)(VOID *pParm);\ntypedef struct\n{\n    HWI_PROC_FUNC pfnHandler;\n    VOID*         pParm;\n} HWI_SLAVE_FUNC;\n\n#else\n\ntypedef VOID (* HWI_PROC_FUNC)(void);\n\n#endif\n\n/**\n * @ingroup  los_hwi\n * Define the type of a hardware interrupt vector table function.\n */\ntypedef VOID (**HWI_VECTOR_FUNC)(void);\n\n\n/**\n * @ingroup los_hwi\n * Count of interrupts.\n */\nextern UINT32  g_vuwIntCount;\n\n#if (LOSCFG_PLATFORM_HWI == YES)\n/**\n * @ingroup los_hwi\n * An interrupt is active.\n */\n#define OS_INT_ACTIVE               (g_vuwIntCount > 0)\n#else\n/**\n * @ingroup los_hwi\n * An interrupt is active.\n */\n#define OS_INT_ACTIVE               (osIntNumGet())\n#endif\n\n/**\n * @ingroup los_hwi\n * An interrupt is inactive.\n */\n#define OS_INT_INACTIVE             (!(OS_INT_ACTIVE))\n\n/**\n * @ingroup los_hwi\n * Count of M-Core system interrupt vector.\n */\n#define OS_SYS_VECTOR_CNT           16\n\n/**\n * @ingroup los_hwi\n * Count of M-Core interrupt vector.\n */\n#define OS_VECTOR_CNT               (OS_SYS_VECTOR_CNT + OS_HWI_MAX_NUM)\n\n/**\n * @ingroup los_hwi\n * AIRCR register priority group parameter .\n */\n#define OS_NVIC_AIRCR_PRIGROUP      7\n\n/**\n * @ingroup los_hwi\n * Boot interrupt vector table.\n */\nextern UINT32 _BootVectors[];\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: Invalid interrupt number.\n *\n * Value: 0x02000900\n *\n * Solution: Ensure that the interrupt number is valid. The value range of the interrupt number applicable for a Cortex-A7 platform is [OS_USER_HWI_MIN,OS_USER_HWI_MAX].\n */\n#define OS_ERRNO_HWI_NUM_INVALID                            LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x00)\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: Null hardware interrupt handling function.\n *\n * Value: 0x02000901\n *\n * Solution: Pass in a valid non-null hardware interrupt handling function.\n */\n#define OS_ERRNO_HWI_PROC_FUNC_NULL                         LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x01)\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: Insufficient interrupt resources for hardware interrupt creation.\n *\n * Value: 0x02000902\n *\n * Solution: Increase the configured maximum number of supported hardware interrupts.\n */\n#define OS_ERRNO_HWI_CB_UNAVAILABLE                         LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x02)\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: Insufficient memory for hardware interrupt initialization.\n *\n * Value: 0x02000903\n *\n * Solution: Expand the configured memory.\n */\n#define OS_ERRNO_HWI_NO_MEMORY                              LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x03)\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: The interrupt has already been created.\n *\n * Value: 0x02000904\n *\n * Solution: Check whether the interrupt specified by the passed-in interrupt number has already been created.\n */\n#define OS_ERRNO_HWI_ALREADY_CREATED                        LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x04)\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: Invalid interrupt priority.\n *\n * Value: 0x02000905\n *\n * Solution: Ensure that the interrupt priority is valid. The value range of the interrupt priority applicable for a Cortex-A7 platform is [0,15].\n */\n#define OS_ERRNO_HWI_PRIO_INVALID                           LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x05)\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: Incorrect interrupt creation mode.\n *\n * Value: 0x02000906\n *\n * Solution: The interrupt creation mode can be only set to OS_HWI_MODE_COMM or OS_HWI_MODE_FAST of which the value can be 0 or 1.\n */\n#define OS_ERRNO_HWI_MODE_INVALID                           LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x06)\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: The interrupt has already been created as a fast interrupt.\n *\n * Value: 0x02000907\n *\n * Solution: Check whether the interrupt specified by the passed-in interrupt number has already been created.\n */\n#define OS_ERRNO_HWI_FASTMODE_ALREADY_CREATED               LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x07)\n\n/**\n * @ingroup los_hwi\n * SysTick control and status register.\n */\n#define OS_SYSTICK_CONTROL_REG      0xE000E010\n\n/**\n * @ingroup los_hw\n * SysTick current value register.\n */\n#define OS_SYSTICK_CURRENT_REG      0xE000E018\n\n/**\n * @ingroup los_hwi\n * Interrupt Priority-Level Registers.\n */\n#define OS_NVIC_PRI_BASE            0xE000E400\n\n/**\n * @ingroup los_hwi\n * Interrupt enable register for 0-31.\n */\n#define OS_NVIC_SETENA_BASE         0xE000E100\n\n/**\n * @ingroup los_hwi\n * interrupt pending register.\n */\n#define OS_NVIC_SETPEND_BASE        0xE000E200\n\n/**\n * @ingroup los_hwi\n * ?D??ACTIVE????????\n */\n#define OS_NVIC_INT_ACT_BASE        0xE000E300\n\n/**\n * @ingroup los_hwi\n * Interrupt disable register for 0-31.\n */\n#define OS_NVIC_CLRENA_BASE         0xE000E180\n\n/**\n * @ingroup los_hwi\n * Interrupt control and status register.\n */\n#define OS_NVIC_INT_CTRL            0xE000ED04\n\n/**\n * @ingroup los_hwi\n * Vector table offset register.\n */\n#define OS_NVIC_VTOR                0xE000ED08\n\n/**\n * @ingroup los_hwi\n * Application interrupt and reset control register\n */\n#define OS_NVIC_AIRCR               0xE000ED0C\n\n/**\n * @ingroup los_hwi\n * System exception priority register.\n */\n#define OS_NVIC_EXCPRI_BASE         0xE000ED18\n\n/**\n * @ingroup los_hwi\n * Interrupt No. 1 :reset.\n */\n#define OS_EXC_RESET           1\n\n/**\n * @ingroup los_hwi\n * Interrupt No. 2 :Non-Maskable Interrupt.\n */\n#define OS_EXC_NMI             2\n\n/**\n * @ingroup los_hwi\n * Interrupt No. 3 :(hard)fault.\n */\n#define OS_EXC_HARD_FAULT      3\n\n/**\n * @ingroup los_hwi\n * Interrupt No. 4 :MemManage fault.\n */\n#define OS_EXC_MPU_FAULT       4\n\n/**\n * @ingroup los_hwi\n * Interrupt No. 5 :Bus fault.\n */\n#define OS_EXC_BUS_FAULT       5\n\n/**\n * @ingroup los_hwi\n * Interrupt No. 6 :Usage fault.\n */\n#define OS_EXC_USAGE_FAULT     6\n\n/**\n * @ingroup los_hwi\n * Interrupt No. 11 :SVCall.\n */\n#define OS_EXC_SVC_CALL        11\n\n/**\n * @ingroup los_hwi\n * Interrupt No. 12 :Debug monitor.\n */\n#define OS_EXC_DBG_MONITOR     12\n\n/**\n * @ingroup los_hwi\n * Interrupt No. 14 :PendSV.\n */\n#define OS_EXC_PEND_SV         14\n\n/**\n * @ingroup los_hwi\n * Interrupt No. 15 :SysTick.\n */\n#define OS_EXC_SYS_TICK        15\n\n\n/**\n * @ingroup los_hwi\n * hardware interrupt form mapping handling function array.\n */\nextern HWI_PROC_FUNC m_pstHwiForm[OS_VECTOR_CNT];\n\n#if (OS_HWI_WITH_ARG == YES)\n/**\n * @ingroup los_hwi\n * hardware interrupt Slave form mapping handling function array.\n */\nextern HWI_SLAVE_FUNC m_pstHwiSlaveForm[OS_VECTOR_CNT];\n\n/**\n * @ingroup los_hwi\n * Set interrupt vector table.\n */\n#define osSetVector(uwNum, pfnVector, uwArg)       \\\n    m_pstHwiForm[uwNum + OS_SYS_VECTOR_CNT] = (HWI_PROC_FUNC)osInterrupt;\\\n    m_pstHwiSlaveForm[uwNum + OS_SYS_VECTOR_CNT].pfnHandler= pfnVector; \\\n    m_pstHwiSlaveForm[uwNum + OS_SYS_VECTOR_CNT].pParm = (VOID*)uwArg;\n#else\n/**\n * @ingroup los_hwi\n * hardware interrupt Slave form mapping handling function array.\n */\nextern HWI_PROC_FUNC m_pstHwiSlaveForm[OS_VECTOR_CNT];\n\n/**\n * @ingroup los_hwi\n * Set interrupt vector table.\n */\n#define osSetVector(uwNum, pfnVector)       \\\n    m_pstHwiForm[uwNum + OS_SYS_VECTOR_CNT] = osInterrupt;\\\n    m_pstHwiSlaveForm[uwNum + OS_SYS_VECTOR_CNT] = pfnVector;\n#endif\n\n/**\n * @ingroup  los_hwi\n * @brief Create a hardware interrupt.\n *\n * @par Description:\n * This API is used to configure a hardware interrupt and register a hardware interrupt handling function.\n *\n * @attention\n * <ul>\n * <li>The hardware interrupt module is usable only when the configuration item for hardware interrupt tailoring is enabled.</li>\n * <li>Hardware interrupt number value range: [OS_USER_HWI_MIN,OS_USER_HWI_MAX]. The value range applicable for a Cortex-A7 platform is [32,95].</li>\n * <li>OS_HWI_MAX_NUM specifies the maximum number of interrupts that can be created.</li>\n * <li>Before executing an interrupt on a platform, refer to the chip manual of the platform.</li>\n * </ul>\n *\n * @param  uwHwiNum   [IN] Type#HWI_HANDLE_T: hardware interrupt number. The value range applicable for a Cortex-A7 platform is [32,95].\n * @param  usHwiPrio  [IN] Type#HWI_PRIOR_T: hardware interrupt priority. Ignore this parameter temporarily.\n * @param  usMode     [IN] Type#HWI_MODE_T: hardware interrupt mode. Ignore this parameter temporarily.\n * @param  pfnHandler [IN] Type#HWI_PROC_FUNC: interrupt handler used when a hardware interrupt is triggered.\n * @param  uwArg      [IN] Type#HWI_ARG_T: input parameter of the interrupt handler used when a hardware interrupt is triggered.\n *\n * @retval #OS_ERRNO_HWI_PROC_FUNC_NULL               0x02000901: Null hardware interrupt handling function.\n * @retval #OS_ERRNO_HWI_NUM_INVALID                     0x02000900: Invalid interrupt number.\n * @retval #OS_ERRNO_HWI_NO_MEMORY                     0x02000903: Insufficient memory for hardware interrupt creation.\n * @retval #OS_ERRNO_HWI_ALREADY_CREATED              0x02000904: The interrupt handler being created has already been created.\n * @retval #LOS_OK                                                       0,               : The interrupt is successfully created.\n * @par Dependency:\n * <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern UINT32 LOS_HwiCreate( HWI_HANDLE_T  uwHwiNum,\n                           HWI_PRIOR_T   usHwiPrio,\n                           HWI_MODE_T    usMode,\n                           HWI_PROC_FUNC pfnHandler,\n                           HWI_ARG_T     uwArg\n                           );\n\n/**\n * @ingroup  los_hwi\n * @brief: Hardware interrupt entry function.\n *\n * @par Description:\n * This API is used as all hardware interrupt handling function entry.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param:None.\n *\n * @retval:None.\n * @par Dependency:\n * <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern VOID  osInterrupt(VOID);\n\n\n\n/**\n * @ingroup  los_hwi\n * @brief: Get a interrupt number.\n *\n * @par Description:\n * This API is used to get the current interrupt number.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param: None.\n *\n * @retval: Interrupt Indexes number.\n * @par Dependency:\n * <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern UINT32 osIntNumGet(VOID);\n\n/**\n * @ingroup  los_hwi\n * @brief: Default vector handling function.\n *\n * @par Description:\n * This API is used to configure interrupt for null function.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param:None.\n *\n * @retval:None.\n * @par Dependency:\n * <ul><li>los_hwi.h: the header file that contains the API declaration.</li\n></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern VOID  osHwiDefaultHandler(VOID);\n\n/**\n * @ingroup  los_hwi\n * @brief: Reset the vector table.\n *\n * @par Description:\n * This API is used to reset the vector table.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param:None.\n *\n * @retval:None.\n * @par Dependency:\n * <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern VOID Reset_Handler(VOID);\n\n/**\n * @ingroup  los_hwi\n * @brief: Pended System Call.\n *\n * @par Description:\n * PendSV can be pended and is useful for an OS to pend an exception\n * so that an action can be performed after other important tasks are completed.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param:None.\n *\n * @retval:None.\n * @par Dependency:\n * <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern VOID PendSV_Handler(VOID);\n\n /**\n *@ingroup los_hwi\n *@brief Enable all interrupts.\n *\n *@par Description:\n *<ul>\n *<li>This API is used to enable all IRQ and FIQ interrupts in the CPSR.</li>\n *</ul>\n *@attention\n *<ul>\n *<li>None.</li>\n *</ul>\n *\n *@param None.\n *\n *@retval CPSR value obtained after all interrupts are enabled.\n *@par Dependency:\n *<ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n *@see LOS_IntRestore\n *@since Huawei LiteOS V100R001C00\n */\nextern UINTPTR LOS_IntUnLock(VOID);\n\n\n\n /**\n *@ingroup los_hwi\n *@brief Disable all interrupts.\n *\n *@par Description:\n *<ul>\n *<li>This API is used to disable all IRQ and FIQ interrupts in the CPSR.</li>\n *</ul>\n *@attention\n *<ul>\n *<li>None.</li>\n *</ul>\n *\n *@param None.\n *\n *@retval CPSR value obtained before all interrupts are disabled.\n *@par Dependency:\n *<ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n *@see LOS_IntRestore\n *@since Huawei LiteOS V100R001C00\n */\nextern UINTPTR LOS_IntLock(VOID);\n\n\n\n /**\n *@ingroup los_hwi\n *@brief Restore interrupts.\n *\n *@par Description:\n *<ul>\n *<li>This API is used to restore the CPSR value obtained before all interrupts are disabled.</li>\n *</ul>\n *@attention\n *<ul>\n *<li>This API can be called only after all interrupts are disabled, and the input parameter value should be the value returned by calling the all interrupt disabling API.</li>\n *</ul>\n *\n *@param uvIntSave [IN] CPSR value obtained before all interrupts are disabled.\n *\n *@retval None.\n *@par Dependency:\n *<ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n *@see LOS_IntLock\n *@since Huawei LiteOS V100R001C00\n */\nextern VOID LOS_IntRestore(UINTPTR uvIntSave);\n\n  /**\n *@ingroup los_hwi\n *@brief Get value from xPSR register.\n *\n *@par Description:\n *<ul>\n *<li>This API is used to Get value from xPSR register.</li>\n *</ul>\n *@attention\n *<ul>\n *<li>None.</li>\n *</ul>\n *\n *@param None.\n *\n *@retval xPSR register value.\n *@par Dependency:\n *<ul><li>los_hwi.h: the header file that contains the API declaration.</li></\nul>\n *@see LOS_IntRestore\n *@since Huawei LiteOS V100R001C00\n */\nextern VOID LOS_GetCpuCycle(UINT32 *puwCntHi, UINT32 *puwCntLo);\n\nextern UINT32 LOS_SysTickCurrCycleGet(VOID);\n\n\n/**\n * @ingroup  los_hwi\n * @brief Delete hardware interrupt.\n *\n * @par Description:\n * This API is used to delete hardware interrupt.\n *\n * @attention\n * <ul>\n * <li>The hardware interrupt module is usable only when the configuration item for hardware interrupt tailoring is enabled.</li>\n * <li>Hardware interrupt number value range: [OS_USER_HWI_MIN,OS_USER_HWI_MAX]. The value range applicable for a Cortex-A7 platform is [32,95].</li>\n * <li>OS_HWI_MAX_NUM specifies the maximum number of interrupts that can be created.</li>\n * <li>Before executing an interrupt on a platform, refer to the chip manual of the platform.</li>\n * </ul>\n *\n * @param  uwHwiNum   [IN] Type#HWI_HANDLE_T: hardware interrupt number. The value range applicable for a Cortex-A7 platform is [32,95].\n *\n * @retval #OS_ERRNO_HWI_NUM_INVALID              0x02000900: Invalid interrupt number.\n * @retval #LOS_OK                                  0: The interrupt is successfully delete.\n * @par Dependency:\n * <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern UINT32 LOS_HwiDelete(HWI_HANDLE_T uwHwiNum);\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n\n\n#endif /* _LOS_HWI_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/src/los_hw.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"los_base.h\"\n#include \"los_task.ph\"\n#include \"los_hw.h\"\n#include \"los_priqueue.ph\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n\n/*****************************************************************************\n Function    : osSchedule\n Description : task scheduling\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID osSchedule(VOID)\n{\n    osTaskSchedule();\n}\n\n/*****************************************************************************\n Function    : LOS_Schedule\n Description : Function to determine whether task scheduling is required\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID LOS_Schedule(VOID)\n{\n    UINTPTR uvIntSave;\n\n    uvIntSave = LOS_IntLock();\n\n    /* Find the highest task */\n    g_stLosTask.pstNewTask = LOS_DL_LIST_ENTRY(osPriqueueTop(), LOS_TASK_CB, stPendList);\n\n    /* In case that running is not highest then reschedule */\n    if (g_stLosTask.pstRunTask != g_stLosTask.pstNewTask)\n    {\n        if ((!g_usLosTaskLock))\n        {\n            (VOID)LOS_IntRestore(uvIntSave);\n\n            osTaskSchedule();\n\n            return;\n        }\n    }\n\n    (VOID)LOS_IntRestore(uvIntSave);\n}\n\n/*****************************************************************************\n Function    : osTaskExit\n Description : Task exit function\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT_MINOR VOID osTaskExit(VOID)\n{\n    __disable_irq();\n    while(1);\n}\n\n/*****************************************************************************\n Function    : osTskStackInit\n Description : Task stack initialization function\n Input       : uwTaskID     --- TaskID\n               uwStackSize  --- Total size of the stack\n               pTopStack    --- Top of task's stack\n Output      : None\n Return      : Context pointer\n *****************************************************************************/\nLITE_OS_SEC_TEXT_INIT VOID *osTskStackInit(UINT32 uwTaskID, UINT32 uwStackSize, VOID *pTopStack)\n{\n    TSK_CONTEXT_S  *pstContext;\n\n    /*initialize the task stack, write magic num to stack top*/\n    memset(pTopStack, OS_TASK_STACK_INIT, uwStackSize);\n    *((UINT32 *)(pTopStack)) = OS_TASK_MAGIC_WORD;\n\n    pstContext    = (TSK_CONTEXT_S *)(((UINT32)pTopStack + uwStackSize) - sizeof(TSK_CONTEXT_S));\n\n    pstContext->uwR4  = 0x04040404L;\n    pstContext->uwR5  = 0x05050505L;\n    pstContext->uwR6  = 0x06060606L;\n    pstContext->uwR7  = 0x07070707L;\n    pstContext->uwR8  = 0x08080808L;\n    pstContext->uwR9  = 0x09090909L;\n    pstContext->uwR10 = 0x10101010L;\n    pstContext->uwR11 = 0x11111111L;\n    /* The initial interruption state(PRIMASK value: 0 --- enable) of the task */\n    pstContext->uwPriMask = 0;\n#if FPU_EXIST\n    /**\n     * The initial EXC_RETURN value(use 8 word stack frame, return to thread mode and use PSP).\n     * Please do not modify it.\n     */\n    pstContext->uwExcReturn = 0xFFFFFFFD;\n#endif\n    pstContext->uwR0  = uwTaskID;\n    pstContext->uwR1  = 0x01010101L;\n    pstContext->uwR2  = 0x02020202L;\n    pstContext->uwR3  = 0x03030303L;\n    pstContext->uwR12 = 0x12121212L;\n    pstContext->uwLR  = (UINT32)osTaskExit;\n    pstContext->uwPC  = (UINT32)osTaskEntry;\n    pstContext->uwxPSR = 0x01000000L;\n\n    return (VOID *)pstContext;\n}\n\nLITE_OS_SEC_TEXT_INIT VOID osEnterSleep(VOID)\n{\n    __DSB();\n    __WFI();\n    __ISB();\n}\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/src/los_hw_tick.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"los_tick.ph\"\n#include \"los_base.h\"\n#include \"los_task.ph\"\n#include \"los_swtmr.h\"\n#include \"los_hwi.h\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n\n/*****************************************************************************\nFunction   : osTickStart\nDescription: Configure Tick Interrupt Start\nInput   : none\noutput  : none\nreturn  : LOS_OK - Success , or LOS_ERRNO_TICK_CFG_INVALID - failed\n*****************************************************************************/\nLITE_OS_SEC_TEXT_INIT UINT32 osTickStart(VOID)\n{\n    UINT32 uwRet;\n\n    if ((0 == OS_SYS_CLOCK)\n        || (0 == LOSCFG_BASE_CORE_TICK_PER_SECOND)\n        || (LOSCFG_BASE_CORE_TICK_PER_SECOND > OS_SYS_CLOCK))/*lint !e506*/\n    {\n        return LOS_ERRNO_TICK_CFG_INVALID;\n    }\n\n#if (LOSCFG_PLATFORM_HWI == YES)\n#if (OS_HWI_WITH_ARG == YES)\n    osSetVector(SysTick_IRQn, (HWI_PROC_FUNC)osTickHandler, NULL);\n#else\n    osSetVector(SysTick_IRQn, osTickHandler);\n#endif\n#endif\n\n    g_uwCyclesPerTick = OS_SYS_CLOCK / LOSCFG_BASE_CORE_TICK_PER_SECOND;\n    g_ullTickCount = 0;\n\n    uwRet = SysTick_Config(OS_SYS_CLOCK/LOSCFG_BASE_CORE_TICK_PER_SECOND);\n    if (uwRet == 1)\n    {\n        return LOS_ERRNO_TICK_PER_SEC_TOO_SMALL;\n    }\n\n    g_bSysTickStart = TRUE;\n\n    return LOS_OK;\n}\n\n#if (LOSCFG_KERNEL_TICKLESS == YES)\n/*****************************************************************************\nFunction   : LOS_SysTickReload\nDescription: reconfig systick\nInput   : none\noutput  : none\nreturn  : none\n*****************************************************************************/\nLITE_OS_SEC_TEXT_MINOR VOID LOS_SysTickReload(UINT32 uwCyclesPerTick)\n{\n    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;\n    SysTick->LOAD  = (uint32_t)(uwCyclesPerTick - 1UL);               /* set reload register */\n    SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;\n}\n#endif\n\n/*****************************************************************************\nFunction   : LOS_SysTickCurrCycleGet\nDescription: Get System cycle count\nInput   : none\noutput  : SysTick->VAL\nreturn  : none\n*****************************************************************************/\nLITE_OS_SEC_TEXT_MINOR UINT32 LOS_SysTickCurrCycleGet(VOID)\n{\n    UINT32 uwHwCycle;\n    UINTPTR uvIntSave;\n\n    uvIntSave = LOS_IntLock();\n    uwHwCycle = SysTick->VAL;\n\n    /*tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */\n    if (((SCB->ICSR & 0x4000000) != 0))\n    {\n        uwHwCycle = SysTick->VAL;\n        uwHwCycle += g_uwCyclesPerTick;\n    }\n\n    LOS_IntRestore(uvIntSave);\n\n    return uwHwCycle;\n}\n\n/*****************************************************************************\nFunction   : LOS_GetCpuCycle\nDescription: Get System cycle count\nInput   : none\noutput  : puwCntHi  --- CpuTick High 4 byte\n          puwCntLo  --- CpuTick Low 4 byte\nreturn  : none\n*****************************************************************************/\nLITE_OS_SEC_TEXT_MINOR VOID LOS_GetCpuCycle(UINT32 *puwCntHi, UINT32 *puwCntLo)\n{\n    UINT64 ullSwTick;\n    UINT64 ullCycle;\n    UINT32 uwHwCycle;\n    UINTPTR uvIntSave;\n\n    uvIntSave = LOS_IntLock();\n\n    ullSwTick = g_ullTickCount;\n    uwHwCycle = SysTick->VAL;\n\n    /*tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */\n    if (((SCB->ICSR & 0x4000000) != 0))\n    {\n        uwHwCycle = SysTick->VAL;\n        ullSwTick++;\n    }\n\n    ullCycle = (((ullSwTick) * g_uwCyclesPerTick) + (g_uwCyclesPerTick - uwHwCycle));\n\n    *puwCntHi = ullCycle >> 32;\n    *puwCntLo = ullCycle & 0xFFFFFFFFU;\n\n    LOS_IntRestore(uvIntSave);\n\n    return;\n}\n\n/*****************************************************************************\nFunction   : LOS_GetSystickCycle\nDescription: Get Sys tick cycle count\nInput   : none\noutput  : puwCntHi  --- SysTick count High 4 byte\n          puwCntLo  --- SysTick count Low 4 byte\nreturn  : none\n*****************************************************************************/\nLITE_OS_SEC_TEXT_MINOR VOID LOS_GetSystickCycle(UINT32 *puwCntHi, UINT32 *puwCntLo)\n{\n    UINT64 ullSwTick;\n    UINT64 ullCycle;\n    UINT32 uwHwCycle;\n    UINTPTR uvIntSave;\n    UINT32 uwSystickLoad;\n    UINT32 uwSystickCur;\n\n    uvIntSave = LOS_IntLock();\n\n    ullSwTick = g_ullTickCount;\n\n    uwSystickLoad = SysTick->LOAD;\n    uwSystickCur = SysTick->VAL;\n    uwHwCycle = uwSystickLoad - uwSystickCur;\n\n    /*tick has come, but may interrupt environment, not counting the Tick interrupt response, to do +1 */\n    if (((SCB->ICSR & 0x4000000) != 0))\n    {\n        uwHwCycle = uwSystickLoad - uwSystickCur;\n        ullSwTick++;\n    }\n\n    ullCycle = uwHwCycle + ullSwTick * uwSystickLoad;\n    *puwCntHi = ullCycle >> 32;\n    *puwCntLo = ullCycle & 0xFFFFFFFFU;\n\n    LOS_IntRestore(uvIntSave);\n\n    return;\n}\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cpluscplus */\n#endif /* __cpluscplus */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/arm-m/src/los_hwi.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"los_hwi.h\"\n#if (LOSCFG_KERNEL_TICKLESS == YES)\n#include \"los_tickless.ph\"\n#endif\n#if (LOSCFG_PLATFORM_HWI == NO)\n#include \"los_tick.ph\"\n#endif\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n#if (LOSCFG_PLATFORM_HWI == YES)\n\n/*lint -save -e40 -e522 -e533*/\n\nLITE_OS_SEC_DATA_INIT UINT32  g_vuwIntCount = 0;\n/*lint -restore*/\n#ifdef __ICCARM__\n#pragma  location = \".data.vector\"\n#elif defined (__CC_ARM) || defined (__GNUC__)\nLITE_OS_SEC_VEC\n#endif\n\nHWI_PROC_FUNC m_pstHwiForm[OS_VECTOR_CNT] =\n{\n    (HWI_PROC_FUNC)0,                    // [0] Top of Stack\n    (HWI_PROC_FUNC)Reset_Handler,        // [1] reset\n    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [2] NMI Handler\n    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [3] Hard Fault Handler\n    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [4] MPU Fault Handler\n    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [5] Bus Fault Handler\n    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [6] Usage Fault Handler\n    (HWI_PROC_FUNC)0,                    // [7] Reserved\n    (HWI_PROC_FUNC)0,                    // [8] Reserved\n    (HWI_PROC_FUNC)0,                    // [9] Reserved\n    (HWI_PROC_FUNC)0,                    // [10] Reserved\n    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [11] SVCall Handler\n    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [12] Debug Monitor Handler\n    (HWI_PROC_FUNC)0,                    // [13] Reserved\n    (HWI_PROC_FUNC)PendSV_Handler,       // [14] PendSV Handler\n    (HWI_PROC_FUNC)osHwiDefaultHandler,  // [15] SysTick Handler\n};\n#if (OS_HWI_WITH_ARG == YES)\nLITE_OS_SEC_DATA_INIT HWI_SLAVE_FUNC m_pstHwiSlaveForm[OS_VECTOR_CNT] = {{(HWI_PROC_FUNC)0,(HWI_ARG_T)0}};\n#else\nLITE_OS_SEC_DATA_INIT HWI_PROC_FUNC m_pstHwiSlaveForm[OS_VECTOR_CNT] = {0};\n#endif\n\n#endif /*(LOSCFG_PLATFORM_HWI == YES)*/\n\n/*****************************************************************************\n Function    : osIntNumGet\n Description : Get a interrupt number\n Input       : None\n Output      : None\n Return      : Interrupt Indexes number\n *****************************************************************************/\nLITE_OS_SEC_TEXT_MINOR UINT32 osIntNumGet(VOID)\n{\n    return __get_IPSR();\n}\n\n#if (LOSCFG_PLATFORM_HWI == YES)\n/*****************************************************************************\n Function    : osHwiDefaultHandler\n Description : default handler of the hardware interrupt\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\n/*lint -e529*/\nLITE_OS_SEC_TEXT_MINOR VOID  osHwiDefaultHandler(VOID)\n{\n    UINT32 uwIrqNum = osIntNumGet();\n    PRINT_ERR(\"%s irqnum:%d\\n\", __FUNCTION__, uwIrqNum);\n    while(1);\n}\n\n/*****************************************************************************\n Function    : osInterrupt\n Description : Hardware interrupt entry function\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nLITE_OS_SEC_TEXT VOID  osInterrupt(VOID)\n{\n    UINT32 uwHwiIndex;\n    UINT32 uwIntSave;\n\n#if(LOSCFG_KERNEL_RUNSTOP == YES)\n    SCB->SCR &= (UINT32)~((UINT32)SCB_SCR_SLEEPDEEP_Msk);\n#endif\n\n    uwIntSave = LOS_IntLock();\n\n    g_vuwIntCount++;\n\n    LOS_IntRestore(uwIntSave);\n\n    uwHwiIndex = osIntNumGet();\n#if (LOSCFG_KERNEL_TICKLESS == YES)\n    osUpdateKernelTickCount(uwHwiIndex);\n#endif\n\n#if (OS_HWI_WITH_ARG == YES)\n    if (m_pstHwiSlaveForm[uwHwiIndex].pfnHandler!=0)\n    {\n        m_pstHwiSlaveForm[uwHwiIndex].pfnHandler((VOID*)m_pstHwiSlaveForm[uwHwiIndex].pParm);\n    }\n#else\n    if (m_pstHwiSlaveForm[uwHwiIndex] !=0)\n    {\n        m_pstHwiSlaveForm[uwHwiIndex]();\n    }\n#endif\n    uwIntSave = LOS_IntLock();\n\n    g_vuwIntCount--;\n\n    LOS_IntRestore(uwIntSave);\n\n}\n/*****************************************************************************\n Function    : osHwiInit\n Description : initialization of the hardware interrupt\n Input       : None\n Output      : None\n Return      : OS_SUCCESS\n *****************************************************************************/\nLITE_OS_SEC_TEXT_INIT VOID osHwiInit()\n{\n    UINT32 uwIndex;\n\n    for(uwIndex = OS_SYS_VECTOR_CNT; uwIndex < OS_VECTOR_CNT; uwIndex++)\n    {\n        m_pstHwiForm[uwIndex] = (HWI_PROC_FUNC)osHwiDefaultHandler;\n    }\n\n    /* Interrupt vector table location */\n    SCB->VTOR = (UINT32)m_pstHwiForm;\n#if (__CORTEX_M >= 0x03U)  /* only for Cortex-M3 and above */\n    NVIC_SetPriorityGrouping(OS_NVIC_AIRCR_PRIGROUP);\n#endif\n\n    return;\n}\n/*****************************************************************************\n Function    : LOS_HwiCreate\n Description : create hardware interrupt\n Input       : uwHwiNum   --- hwi num to create\n               usHwiPrio  --- priority of the hwi\n               usMode     --- unused\n               pfnHandler --- hwi handler\n               uwArg      --- param of the hwi handler\n Output      : None\n Return      : OS_SUCCESS on success or error code on failure\n *****************************************************************************/\nLITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiCreate( HWI_HANDLE_T  uwHwiNum,\n                                      HWI_PRIOR_T   usHwiPrio,\n                                      HWI_MODE_T    usMode,\n                                      HWI_PROC_FUNC pfnHandler,\n                                      HWI_ARG_T     uwArg )\n{\n    UINTPTR uvIntSave;\n\n    if (NULL == pfnHandler)\n    {\n        return OS_ERRNO_HWI_PROC_FUNC_NULL;\n    }\n\n    if (uwHwiNum >= OS_HWI_MAX_NUM)\n    {\n        return OS_ERRNO_HWI_NUM_INVALID;\n    }\n\n    if (m_pstHwiForm[uwHwiNum + OS_SYS_VECTOR_CNT] != (HWI_PROC_FUNC)osHwiDefaultHandler)\n    {\n        return OS_ERRNO_HWI_ALREADY_CREATED;\n    }\n\n    if ((usHwiPrio > OS_HWI_PRIO_LOWEST) || (usHwiPrio < OS_HWI_PRIO_HIGHEST))\n    {\n        return OS_ERRNO_HWI_PRIO_INVALID;\n    }\n\n    uvIntSave = LOS_IntLock();\n#if (OS_HWI_WITH_ARG == YES)\n    osSetVector(uwHwiNum, pfnHandler, uwArg);\n#else\n    osSetVector(uwHwiNum, pfnHandler);\n#endif\n    NVIC_EnableIRQ((IRQn_Type)uwHwiNum);\n    NVIC_SetPriority((IRQn_Type)uwHwiNum, usHwiPrio);\n\n    LOS_IntRestore(uvIntSave);\n\n    return LOS_OK;\n\n}\n\n/*****************************************************************************\n Function    : LOS_HwiDelete\n Description : Delete hardware interrupt\n Input       : uwHwiNum   --- hwi num to delete\n Output      : None\n Return      : LOS_OK on success or error code on failure\n *****************************************************************************/\nLITE_OS_SEC_TEXT_INIT UINT32 LOS_HwiDelete(HWI_HANDLE_T uwHwiNum)\n{\n    UINT32 uwIntSave;\n\n    if (uwHwiNum >= OS_HWI_MAX_NUM)\n    {\n        return OS_ERRNO_HWI_NUM_INVALID;\n    }\n\n    NVIC_DisableIRQ((IRQn_Type)uwHwiNum);\n\n    uwIntSave = LOS_IntLock();\n\n    m_pstHwiForm[uwHwiNum + OS_SYS_VECTOR_CNT] = (HWI_PROC_FUNC)osHwiDefaultHandler;\n\n    LOS_IntRestore(uwIntSave);\n\n    return LOS_OK;\n}\n\n#else\n\n/*****************************************************************************\n Function    : SysTick_Handler\n Description : This function handles SysTick exception, Call LiteOS interface\n               osTickHandler.\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nvoid SysTick_Handler(void)\n{\n    if (g_bSysTickStart)\n    {\n        osTickHandler();\n    }\n    else\n    {\n        g_ullTickCount++;\n    }\n}\n\n#endif /*(LOSCFG_PLATFORM_HWI == YES)*/\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/arm_common_tables.h",
    "content": "/* ----------------------------------------------------------------------\n * Project:      CMSIS DSP Library\n * Title:        arm_common_tables.h\n * Description:  Extern declaration for common tables\n *\n * $Date:        27. January 2017\n * $Revision:    V.1.5.1\n *\n * Target Processor: Cortex-M cores\n * -------------------------------------------------------------------- */\n/*\n * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef _ARM_COMMON_TABLES_H\n#define _ARM_COMMON_TABLES_H\n\n#include \"arm_math.h\"\n\nextern const uint16_t armBitRevTable[1024];\nextern const q15_t armRecipTableQ15[64];\nextern const q31_t armRecipTableQ31[64];\nextern const float32_t twiddleCoef_16[32];\nextern const float32_t twiddleCoef_32[64];\nextern const float32_t twiddleCoef_64[128];\nextern const float32_t twiddleCoef_128[256];\nextern const float32_t twiddleCoef_256[512];\nextern const float32_t twiddleCoef_512[1024];\nextern const float32_t twiddleCoef_1024[2048];\nextern const float32_t twiddleCoef_2048[4096];\nextern const float32_t twiddleCoef_4096[8192];\n#define twiddleCoef twiddleCoef_4096\nextern const q31_t twiddleCoef_16_q31[24];\nextern const q31_t twiddleCoef_32_q31[48];\nextern const q31_t twiddleCoef_64_q31[96];\nextern const q31_t twiddleCoef_128_q31[192];\nextern const q31_t twiddleCoef_256_q31[384];\nextern const q31_t twiddleCoef_512_q31[768];\nextern const q31_t twiddleCoef_1024_q31[1536];\nextern const q31_t twiddleCoef_2048_q31[3072];\nextern const q31_t twiddleCoef_4096_q31[6144];\nextern const q15_t twiddleCoef_16_q15[24];\nextern const q15_t twiddleCoef_32_q15[48];\nextern const q15_t twiddleCoef_64_q15[96];\nextern const q15_t twiddleCoef_128_q15[192];\nextern const q15_t twiddleCoef_256_q15[384];\nextern const q15_t twiddleCoef_512_q15[768];\nextern const q15_t twiddleCoef_1024_q15[1536];\nextern const q15_t twiddleCoef_2048_q15[3072];\nextern const q15_t twiddleCoef_4096_q15[6144];\nextern const float32_t twiddleCoef_rfft_32[32];\nextern const float32_t twiddleCoef_rfft_64[64];\nextern const float32_t twiddleCoef_rfft_128[128];\nextern const float32_t twiddleCoef_rfft_256[256];\nextern const float32_t twiddleCoef_rfft_512[512];\nextern const float32_t twiddleCoef_rfft_1024[1024];\nextern const float32_t twiddleCoef_rfft_2048[2048];\nextern const float32_t twiddleCoef_rfft_4096[4096];\n\n/* floating-point bit reversal tables */\n#define ARMBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20)\n#define ARMBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48)\n#define ARMBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56)\n#define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208)\n#define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440)\n#define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448)\n#define ARMBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800)\n#define ARMBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808)\n#define ARMBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032)\n\nextern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH];\n\n/* fixed-point bit reversal tables */\n#define ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12)\n#define ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24)\n#define ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56)\n#define ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112)\n#define ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240)\n#define ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480)\n#define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992)\n#define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984)\n#define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032)\n\nextern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH];\nextern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH];\n\n/* Tables for Fast Math Sine and Cosine */\nextern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1];\nextern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1];\nextern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1];\n\n#endif /*  ARM_COMMON_TABLES_H */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/arm_const_structs.h",
    "content": "/* ----------------------------------------------------------------------\n * Project:      CMSIS DSP Library\n * Title:        arm_const_structs.h\n * Description:  Constant structs that are initialized for user convenience.\n *               For example, some can be given as arguments to the arm_cfft_f32() function.\n *\n * $Date:        27. January 2017\n * $Revision:    V.1.5.1\n *\n * Target Processor: Cortex-M cores\n * -------------------------------------------------------------------- */\n/*\n * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef _ARM_CONST_STRUCTS_H\n#define _ARM_CONST_STRUCTS_H\n\n#include \"arm_math.h\"\n#include \"arm_common_tables.h\"\n\n   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len16;\n   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len32;\n   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len64;\n   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len128;\n   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len256;\n   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len512;\n   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len1024;\n   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len2048;\n   extern const arm_cfft_instance_f32 arm_cfft_sR_f32_len4096;\n\n   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len16;\n   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len32;\n   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len64;\n   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len128;\n   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len256;\n   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len512;\n   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len1024;\n   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len2048;\n   extern const arm_cfft_instance_q31 arm_cfft_sR_q31_len4096;\n\n   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len16;\n   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len32;\n   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len64;\n   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len128;\n   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len256;\n   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len512;\n   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len1024;\n   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len2048;\n   extern const arm_cfft_instance_q15 arm_cfft_sR_q15_len4096;\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/arm_math.h",
    "content": "/* ----------------------------------------------------------------------\n * Project:      CMSIS DSP Library\n * Title:        arm_math.h\n * Description:  Public header file for CMSIS DSP Library\n *\n * $Date:        27. January 2017\n * $Revision:    V.1.5.1\n *\n * Target Processor: Cortex-M cores\n * -------------------------------------------------------------------- */\n/*\n * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n   \\mainpage CMSIS DSP Software Library\n   *\n   * Introduction\n   * ------------\n   *\n   * This user manual describes the CMSIS DSP software library,\n   * a suite of common signal processing functions for use on Cortex-M processor based devices.\n   *\n   * The library is divided into a number of functions each covering a specific category:\n   * - Basic math functions\n   * - Fast math functions\n   * - Complex math functions\n   * - Filters\n   * - Matrix functions\n   * - Transforms\n   * - Motor control functions\n   * - Statistical functions\n   * - Support functions\n   * - Interpolation functions\n   *\n   * The library has separate functions for operating on 8-bit integers, 16-bit integers,\n   * 32-bit integer and 32-bit floating-point values.\n   *\n   * Using the Library\n   * ------------\n   *\n   * The library installer contains prebuilt versions of the libraries in the <code>Lib</code> folder.\n   * - arm_cortexM7lfdp_math.lib (Cortex-M7, Little endian, Double Precision Floating Point Unit)\n   * - arm_cortexM7bfdp_math.lib (Cortex-M7, Big endian, Double Precision Floating Point Unit)\n   * - arm_cortexM7lfsp_math.lib (Cortex-M7, Little endian, Single Precision Floating Point Unit)\n   * - arm_cortexM7bfsp_math.lib (Cortex-M7, Big endian and Single Precision Floating Point Unit on)\n   * - arm_cortexM7l_math.lib (Cortex-M7, Little endian)\n   * - arm_cortexM7b_math.lib (Cortex-M7, Big endian)\n   * - arm_cortexM4lf_math.lib (Cortex-M4, Little endian, Floating Point Unit)\n   * - arm_cortexM4bf_math.lib (Cortex-M4, Big endian, Floating Point Unit)\n   * - arm_cortexM4l_math.lib (Cortex-M4, Little endian)\n   * - arm_cortexM4b_math.lib (Cortex-M4, Big endian)\n   * - arm_cortexM3l_math.lib (Cortex-M3, Little endian)\n   * - arm_cortexM3b_math.lib (Cortex-M3, Big endian)\n   * - arm_cortexM0l_math.lib (Cortex-M0 / Cortex-M0+, Little endian)\n   * - arm_cortexM0b_math.lib (Cortex-M0 / Cortex-M0+, Big endian)\n   * - arm_ARMv8MBLl_math.lib (ARMv8M Baseline, Little endian)\n   * - arm_ARMv8MMLl_math.lib (ARMv8M Mainline, Little endian)\n   * - arm_ARMv8MMLlfsp_math.lib (ARMv8M Mainline, Little endian, Single Precision Floating Point Unit)\n   * - arm_ARMv8MMLld_math.lib (ARMv8M Mainline, Little endian, DSP instructions)\n   * - arm_ARMv8MMLldfsp_math.lib (ARMv8M Mainline, Little endian, DSP instructions, Single Precision Floating Point Unit)\n   *\n   * The library functions are declared in the public file <code>arm_math.h</code> which is placed in the <code>Include</code> folder.\n   * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single\n   * public header file <code> arm_math.h</code> for Cortex-M cores with little endian and big endian. Same header file will be used for floating point unit(FPU) variants.\n   * Define the appropriate pre processor MACRO ARM_MATH_CM7 or ARM_MATH_CM4 or  ARM_MATH_CM3 or\n   * ARM_MATH_CM0 or ARM_MATH_CM0PLUS depending on the target processor in the application.\n   * For ARMv8M cores define pre processor MACRO ARM_MATH_ARMV8MBL or ARM_MATH_ARMV8MML.\n   * Set Pre processor MACRO __DSP_PRESENT if ARMv8M Mainline core supports DSP instructions.\n   *\n   *\n   * Examples\n   * --------\n   *\n   * The library ships with a number of examples which demonstrate how to use the library functions.\n   *\n   * Toolchain Support\n   * ------------\n   *\n   * The library has been developed and tested with MDK-ARM version 5.14.0.0\n   * The library is being tested in GCC and IAR toolchains and updates on this activity will be made available shortly.\n   *\n   * Building the Library\n   * ------------\n   *\n   * The library installer contains a project file to re build libraries on MDK-ARM Tool chain in the <code>CMSIS\\\\DSP_Lib\\\\Source\\\\ARM</code> folder.\n   * - arm_cortexM_math.uvprojx\n   *\n   *\n   * The libraries can be built by opening the arm_cortexM_math.uvprojx project in MDK-ARM, selecting a specific target, and defining the optional pre processor MACROs detailed above.\n   *\n   * Pre-processor Macros\n   * ------------\n   *\n   * Each library project have differant pre-processor macros.\n   *\n   * - UNALIGNED_SUPPORT_DISABLE:\n   *\n   * Define macro UNALIGNED_SUPPORT_DISABLE, If the silicon does not support unaligned memory access\n   *\n   * - ARM_MATH_BIG_ENDIAN:\n   *\n   * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets.\n   *\n   * - ARM_MATH_MATRIX_CHECK:\n   *\n   * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices\n   *\n   * - ARM_MATH_ROUNDING:\n   *\n   * Define macro ARM_MATH_ROUNDING for rounding on support functions\n   *\n   * - ARM_MATH_CMx:\n   *\n   * Define macro ARM_MATH_CM4 for building the library on Cortex-M4 target, ARM_MATH_CM3 for building library on Cortex-M3 target\n   * and ARM_MATH_CM0 for building library on Cortex-M0 target, ARM_MATH_CM0PLUS for building library on Cortex-M0+ target, and\n   * ARM_MATH_CM7 for building the library on cortex-M7.\n   *\n   * - ARM_MATH_ARMV8MxL:\n   *\n   * Define macro ARM_MATH_ARMV8MBL for building the library on ARMv8M Baseline target, ARM_MATH_ARMV8MBL for building library\n   * on ARMv8M Mainline target.\n   *\n   * - __FPU_PRESENT:\n   *\n   * Initialize macro __FPU_PRESENT = 1 when building on FPU supported Targets. Enable this macro for floating point libraries.\n   *\n   * - __DSP_PRESENT:\n   *\n   * Initialize macro __DSP_PRESENT = 1 when ARMv8M Mainline core supports DSP instructions.\n   *\n   * <hr>\n   * CMSIS-DSP in ARM::CMSIS Pack\n   * -----------------------------\n   *\n   * The following files relevant to CMSIS-DSP are present in the <b>ARM::CMSIS</b> Pack directories:\n   * |File/Folder                   |Content                                                                 |\n   * |------------------------------|------------------------------------------------------------------------|\n   * |\\b CMSIS\\\\Documentation\\\\DSP  | This documentation                                                     |\n   * |\\b CMSIS\\\\DSP_Lib             | Software license agreement (license.txt)                               |\n   * |\\b CMSIS\\\\DSP_Lib\\\\Examples   | Example projects demonstrating the usage of the library functions      |\n   * |\\b CMSIS\\\\DSP_Lib\\\\Source     | Source files for rebuilding the library                                |\n   *\n   * <hr>\n   * Revision History of CMSIS-DSP\n   * ------------\n   * Please refer to \\ref ChangeLog_pg.\n   *\n   * Copyright Notice\n   * ------------\n   *\n   * Copyright (C) 2010-2015 ARM Limited. All rights reserved.\n   */\n\n\n/**\n * @defgroup groupMath Basic Math Functions\n */\n\n/**\n * @defgroup groupFastMath Fast Math Functions\n * This set of functions provides a fast approximation to sine, cosine, and square root.\n * As compared to most of the other functions in the CMSIS math library, the fast math functions\n * operate on individual values and not arrays.\n * There are separate functions for Q15, Q31, and floating-point data.\n *\n */\n\n/**\n * @defgroup groupCmplxMath Complex Math Functions\n * This set of functions operates on complex data vectors.\n * The data in the complex arrays is stored in an interleaved fashion\n * (real, imag, real, imag, ...).\n * In the API functions, the number of samples in a complex array refers\n * to the number of complex values; the array contains twice this number of\n * real values.\n */\n\n/**\n * @defgroup groupFilters Filtering Functions\n */\n\n/**\n * @defgroup groupMatrix Matrix Functions\n *\n * This set of functions provides basic matrix math operations.\n * The functions operate on matrix data structures.  For example,\n * the type\n * definition for the floating-point matrix structure is shown\n * below:\n * <pre>\n *     typedef struct\n *     {\n *       uint16_t numRows;     // number of rows of the matrix.\n *       uint16_t numCols;     // number of columns of the matrix.\n *       float32_t *pData;     // points to the data of the matrix.\n *     } arm_matrix_instance_f32;\n * </pre>\n * There are similar definitions for Q15 and Q31 data types.\n *\n * The structure specifies the size of the matrix and then points to\n * an array of data.  The array is of size <code>numRows X numCols</code>\n * and the values are arranged in row order.  That is, the\n * matrix element (i, j) is stored at:\n * <pre>\n *     pData[i*numCols + j]\n * </pre>\n *\n * \\par Init Functions\n * There is an associated initialization function for each type of matrix\n * data structure.\n * The initialization function sets the values of the internal structure fields.\n * Refer to the function <code>arm_mat_init_f32()</code>, <code>arm_mat_init_q31()</code>\n * and <code>arm_mat_init_q15()</code> for floating-point, Q31 and Q15 types,  respectively.\n *\n * \\par\n * Use of the initialization function is optional. However, if initialization function is used\n * then the instance structure cannot be placed into a const data section.\n * To place the instance structure in a const data\n * section, manually initialize the data structure.  For example:\n * <pre>\n * <code>arm_matrix_instance_f32 S = {nRows, nColumns, pData};</code>\n * <code>arm_matrix_instance_q31 S = {nRows, nColumns, pData};</code>\n * <code>arm_matrix_instance_q15 S = {nRows, nColumns, pData};</code>\n * </pre>\n * where <code>nRows</code> specifies the number of rows, <code>nColumns</code>\n * specifies the number of columns, and <code>pData</code> points to the\n * data array.\n *\n * \\par Size Checking\n * By default all of the matrix functions perform size checking on the input and\n * output matrices.  For example, the matrix addition function verifies that the\n * two input matrices and the output matrix all have the same number of rows and\n * columns.  If the size check fails the functions return:\n * <pre>\n *     ARM_MATH_SIZE_MISMATCH\n * </pre>\n * Otherwise the functions return\n * <pre>\n *     ARM_MATH_SUCCESS\n * </pre>\n * There is some overhead associated with this matrix size checking.\n * The matrix size checking is enabled via the \\#define\n * <pre>\n *     ARM_MATH_MATRIX_CHECK\n * </pre>\n * within the library project settings.  By default this macro is defined\n * and size checking is enabled.  By changing the project settings and\n * undefining this macro size checking is eliminated and the functions\n * run a bit faster.  With size checking disabled the functions always\n * return <code>ARM_MATH_SUCCESS</code>.\n */\n\n/**\n * @defgroup groupTransforms Transform Functions\n */\n\n/**\n * @defgroup groupController Controller Functions\n */\n\n/**\n * @defgroup groupStats Statistics Functions\n */\n/**\n * @defgroup groupSupport Support Functions\n */\n\n/**\n * @defgroup groupInterpolation Interpolation Functions\n * These functions perform 1- and 2-dimensional interpolation of data.\n * Linear interpolation is used for 1-dimensional data and\n * bilinear interpolation is used for 2-dimensional data.\n */\n\n/**\n * @defgroup groupExamples Examples\n */\n#ifndef _ARM_MATH_H\n#define _ARM_MATH_H\n\n/* ignore some GCC warnings */\n#if defined ( __GNUC__ )\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wsign-conversion\"\n#pragma GCC diagnostic ignored \"-Wconversion\"\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#endif\n\n#define __CMSIS_GENERIC         /* disable NVIC and Systick functions */\n\n#if defined(ARM_MATH_CM7)\n  #include \"core_cm7.h\"\n  #define ARM_MATH_DSP\n#elif defined (ARM_MATH_CM4)\n  #include \"core_cm4.h\"\n  #define ARM_MATH_DSP\n#elif defined (ARM_MATH_CM3)\n  #include \"core_cm3.h\"\n#elif defined (ARM_MATH_CM0)\n  #include \"core_cm0.h\"\n  #define ARM_MATH_CM0_FAMILY\n#elif defined (ARM_MATH_CM0PLUS)\n  #include \"core_cm0plus.h\"\n  #define ARM_MATH_CM0_FAMILY\n#elif defined (ARM_MATH_ARMV8MBL)\n  #include \"core_armv8mbl.h\"\n  #define ARM_MATH_CM0_FAMILY\n#elif defined (ARM_MATH_ARMV8MML)\n  #include \"core_armv8mml.h\"\n  #if (defined (__DSP_PRESENT) && (__DSP_PRESENT == 1))\n    #define ARM_MATH_DSP\n  #endif\n#else\n  #error \"Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS, ARM_MATH_CM0, ARM_MATH_ARMV8MBL, ARM_MATH_ARMV8MML\"\n#endif\n\n#undef  __CMSIS_GENERIC         /* enable NVIC and Systick functions */\n#include \"string.h\"\n#include \"math.h\"\n#ifdef   __cplusplus\nextern \"C\"\n{\n#endif\n\n\n  /**\n   * @brief Macros required for reciprocal calculation in Normalized LMS\n   */\n\n#define DELTA_Q31          (0x100)\n#define DELTA_Q15          0x5\n#define INDEX_MASK         0x0000003F\n#ifndef PI\n  #define PI               3.14159265358979f\n#endif\n\n  /**\n   * @brief Macros required for SINE and COSINE Fast math approximations\n   */\n\n#define FAST_MATH_TABLE_SIZE  512\n#define FAST_MATH_Q31_SHIFT   (32 - 10)\n#define FAST_MATH_Q15_SHIFT   (16 - 10)\n#define CONTROLLER_Q31_SHIFT  (32 - 9)\n#define TABLE_SPACING_Q31     0x400000\n#define TABLE_SPACING_Q15     0x80\n\n  /**\n   * @brief Macros required for SINE and COSINE Controller functions\n   */\n  /* 1.31(q31) Fixed value of 2/360 */\n  /* -1 to +1 is divided into 360 values so total spacing is (2/360) */\n#define INPUT_SPACING         0xB60B61\n\n  /**\n   * @brief Macro for Unaligned Support\n   */\n#ifndef UNALIGNED_SUPPORT_DISABLE\n    #define ALIGN4\n#else\n  #if defined  (__GNUC__)\n    #define ALIGN4 __attribute__((aligned(4)))\n  #else\n    #define ALIGN4 __align(4)\n  #endif\n#endif   /* #ifndef UNALIGNED_SUPPORT_DISABLE */\n\n  /**\n   * @brief Error status returned by some functions in the library.\n   */\n\n  typedef enum\n  {\n    ARM_MATH_SUCCESS = 0,                /**< No error */\n    ARM_MATH_ARGUMENT_ERROR = -1,        /**< One or more arguments are incorrect */\n    ARM_MATH_LENGTH_ERROR = -2,          /**< Length of data buffer is incorrect */\n    ARM_MATH_SIZE_MISMATCH = -3,         /**< Size of matrices is not compatible with the operation. */\n    ARM_MATH_NANINF = -4,                /**< Not-a-number (NaN) or infinity is generated */\n    ARM_MATH_SINGULAR = -5,              /**< Generated by matrix inversion if the input matrix is singular and cannot be inverted. */\n    ARM_MATH_TEST_FAILURE = -6           /**< Test Failed  */\n  } arm_status;\n\n  /**\n   * @brief 8-bit fractional data type in 1.7 format.\n   */\n  typedef int8_t q7_t;\n\n  /**\n   * @brief 16-bit fractional data type in 1.15 format.\n   */\n  typedef int16_t q15_t;\n\n  /**\n   * @brief 32-bit fractional data type in 1.31 format.\n   */\n  typedef int32_t q31_t;\n\n  /**\n   * @brief 64-bit fractional data type in 1.63 format.\n   */\n  typedef int64_t q63_t;\n\n  /**\n   * @brief 32-bit floating-point type definition.\n   */\n  typedef float float32_t;\n\n  /**\n   * @brief 64-bit floating-point type definition.\n   */\n  typedef double float64_t;\n\n\n#define __SIMD32(addr)        (*(__SIMD32_TYPE **) & (addr))\n#define __SIMD32_CONST(addr)  ((__SIMD32_TYPE *)(addr))\n#define _SIMD32_OFFSET(addr)  (*(__SIMD32_TYPE *)  (addr))\n#define __SIMD64(addr)        (*(int64_t **) & (addr))\n\n/* #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */\n#if !defined (ARM_MATH_DSP)\n  /**\n   * @brief definition to pack two 16 bit values.\n   */\n#define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) <<    0) & (int32_t)0x0000FFFF) | \\\n                                    (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000)  )\n#define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) <<    0) & (int32_t)0xFFFF0000) | \\\n                                    (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF)  )\n\n/* #endif // defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */\n#endif /* !defined (ARM_MATH_DSP) */\n\n   /**\n   * @brief definition to pack four 8 bit values.\n   */\n#ifndef ARM_MATH_BIG_ENDIAN\n\n#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) <<  0) & (int32_t)0x000000FF) | \\\n                                (((int32_t)(v1) <<  8) & (int32_t)0x0000FF00) | \\\n                                (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \\\n                                (((int32_t)(v3) << 24) & (int32_t)0xFF000000)  )\n#else\n\n#define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) <<  0) & (int32_t)0x000000FF) | \\\n                                (((int32_t)(v2) <<  8) & (int32_t)0x0000FF00) | \\\n                                (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \\\n                                (((int32_t)(v0) << 24) & (int32_t)0xFF000000)  )\n\n#endif\n\n\n  /**\n   * @brief Clips Q63 to Q31 values.\n   */\n  CMSIS_INLINE __STATIC_INLINE q31_t clip_q63_to_q31(\n  q63_t x)\n  {\n    return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?\n      ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x;\n  }\n\n  /**\n   * @brief Clips Q63 to Q15 values.\n   */\n  CMSIS_INLINE __STATIC_INLINE q15_t clip_q63_to_q15(\n  q63_t x)\n  {\n    return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ?\n      ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15);\n  }\n\n  /**\n   * @brief Clips Q31 to Q7 values.\n   */\n  CMSIS_INLINE __STATIC_INLINE q7_t clip_q31_to_q7(\n  q31_t x)\n  {\n    return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ?\n      ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x;\n  }\n\n  /**\n   * @brief Clips Q31 to Q15 values.\n   */\n  CMSIS_INLINE __STATIC_INLINE q15_t clip_q31_to_q15(\n  q31_t x)\n  {\n    return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ?\n      ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x;\n  }\n\n  /**\n   * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format.\n   */\n\n  CMSIS_INLINE __STATIC_INLINE q63_t mult32x64(\n  q63_t x,\n  q31_t y)\n  {\n    return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) +\n            (((q63_t) (x >> 32) * y)));\n  }\n\n/*\n  #if defined (ARM_MATH_CM0_FAMILY) && defined ( __CC_ARM   )\n  #define __CLZ __clz\n  #endif\n */\n/* note: function can be removed when all toolchain support __CLZ for Cortex-M0 */\n#if defined (ARM_MATH_CM0_FAMILY) && ((defined (__ICCARM__))  )\n  CMSIS_INLINE __STATIC_INLINE uint32_t __CLZ(\n  q31_t data);\n\n  CMSIS_INLINE __STATIC_INLINE uint32_t __CLZ(\n  q31_t data)\n  {\n    uint32_t count = 0;\n    uint32_t mask = 0x80000000;\n\n    while ((data & mask) == 0)\n    {\n      count += 1u;\n      mask = mask >> 1u;\n    }\n\n    return (count);\n  }\n#endif\n\n  /**\n   * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type.\n   */\n\n  CMSIS_INLINE __STATIC_INLINE uint32_t arm_recip_q31(\n  q31_t in,\n  q31_t * dst,\n  q31_t * pRecipTable)\n  {\n    q31_t out;\n    uint32_t tempVal;\n    uint32_t index, i;\n    uint32_t signBits;\n\n    if (in > 0)\n    {\n      signBits = ((uint32_t) (__CLZ( in) - 1));\n    }\n    else\n    {\n      signBits = ((uint32_t) (__CLZ(-in) - 1));\n    }\n\n    /* Convert input sample to 1.31 format */\n    in = (in << signBits);\n\n    /* calculation of index for initial approximated Val */\n    index = (uint32_t)(in >> 24);\n    index = (index & INDEX_MASK);\n\n    /* 1.31 with exp 1 */\n    out = pRecipTable[index];\n\n    /* calculation of reciprocal value */\n    /* running approximation for two iterations */\n    for (i = 0u; i < 2u; i++)\n    {\n      tempVal = (uint32_t) (((q63_t) in * out) >> 31);\n      tempVal = 0x7FFFFFFFu - tempVal;\n      /*      1.31 with exp 1 */\n      /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */\n      out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30);\n    }\n\n    /* write output */\n    *dst = out;\n\n    /* return num of signbits of out = 1/in value */\n    return (signBits + 1u);\n  }\n\n\n  /**\n   * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type.\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t arm_recip_q15(\n  q15_t in,\n  q15_t * dst,\n  q15_t * pRecipTable)\n  {\n    q15_t out = 0;\n    uint32_t tempVal = 0;\n    uint32_t index = 0, i = 0;\n    uint32_t signBits = 0;\n\n    if (in > 0)\n    {\n      signBits = ((uint32_t)(__CLZ( in) - 17));\n    }\n    else\n    {\n      signBits = ((uint32_t)(__CLZ(-in) - 17));\n    }\n\n    /* Convert input sample to 1.15 format */\n    in = (in << signBits);\n\n    /* calculation of index for initial approximated Val */\n    index = (uint32_t)(in >>  8);\n    index = (index & INDEX_MASK);\n\n    /*      1.15 with exp 1  */\n    out = pRecipTable[index];\n\n    /* calculation of reciprocal value */\n    /* running approximation for two iterations */\n    for (i = 0u; i < 2u; i++)\n    {\n      tempVal = (uint32_t) (((q31_t) in * out) >> 15);\n      tempVal = 0x7FFFu - tempVal;\n      /*      1.15 with exp 1 */\n      out = (q15_t) (((q31_t) out * tempVal) >> 14);\n      /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */\n    }\n\n    /* write output */\n    *dst = out;\n\n    /* return num of signbits of out = 1/in value */\n    return (signBits + 1);\n  }\n\n\n  /*\n   * @brief C custom defined intrinisic function for only M0 processors\n   */\n#if defined(ARM_MATH_CM0_FAMILY)\n  CMSIS_INLINE __STATIC_INLINE q31_t __SSAT(\n  q31_t x,\n  uint32_t y)\n  {\n    int32_t posMax, negMin;\n    uint32_t i;\n\n    posMax = 1;\n    for (i = 0; i < (y - 1); i++)\n    {\n      posMax = posMax * 2;\n    }\n\n    if (x > 0)\n    {\n      posMax = (posMax - 1);\n\n      if (x > posMax)\n      {\n        x = posMax;\n      }\n    }\n    else\n    {\n      negMin = -posMax;\n\n      if (x < negMin)\n      {\n        x = negMin;\n      }\n    }\n    return (x);\n  }\n#endif /* end of ARM_MATH_CM0_FAMILY */\n\n\n  /*\n   * @brief C custom defined intrinsic function for M3 and M0 processors\n   */\n/* #if defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */\n#if !defined (ARM_MATH_DSP)\n\n  /*\n   * @brief C custom defined QADD8 for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __QADD8(\n  uint32_t x,\n  uint32_t y)\n  {\n    q31_t r, s, t, u;\n\n    r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF;\n    s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF;\n    t = __SSAT(((((q31_t)x <<  8) >> 24) + (((q31_t)y <<  8) >> 24)), 8) & (int32_t)0x000000FF;\n    u = __SSAT(((((q31_t)x      ) >> 24) + (((q31_t)y      ) >> 24)), 8) & (int32_t)0x000000FF;\n\n    return ((uint32_t)((u << 24) | (t << 16) | (s <<  8) | (r      )));\n  }\n\n\n  /*\n   * @brief C custom defined QSUB8 for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __QSUB8(\n  uint32_t x,\n  uint32_t y)\n  {\n    q31_t r, s, t, u;\n\n    r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF;\n    s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF;\n    t = __SSAT(((((q31_t)x <<  8) >> 24) - (((q31_t)y <<  8) >> 24)), 8) & (int32_t)0x000000FF;\n    u = __SSAT(((((q31_t)x      ) >> 24) - (((q31_t)y      ) >> 24)), 8) & (int32_t)0x000000FF;\n\n    return ((uint32_t)((u << 24) | (t << 16) | (s <<  8) | (r      )));\n  }\n\n\n  /*\n   * @brief C custom defined QADD16 for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __QADD16(\n  uint32_t x,\n  uint32_t y)\n  {\n/*  q31_t r,     s;  without initialisation 'arm_offset_q15 test' fails  but 'intrinsic' tests pass! for armCC */\n    q31_t r = 0, s = 0;\n\n    r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;\n    s = __SSAT(((((q31_t)x      ) >> 16) + (((q31_t)y      ) >> 16)), 16) & (int32_t)0x0000FFFF;\n\n    return ((uint32_t)((s << 16) | (r      )));\n  }\n\n\n  /*\n   * @brief C custom defined SHADD16 for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SHADD16(\n  uint32_t x,\n  uint32_t y)\n  {\n    q31_t r, s;\n\n    r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;\n    s = (((((q31_t)x      ) >> 16) + (((q31_t)y      ) >> 16)) >> 1) & (int32_t)0x0000FFFF;\n\n    return ((uint32_t)((s << 16) | (r      )));\n  }\n\n\n  /*\n   * @brief C custom defined QSUB16 for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __QSUB16(\n  uint32_t x,\n  uint32_t y)\n  {\n    q31_t r, s;\n\n    r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;\n    s = __SSAT(((((q31_t)x      ) >> 16) - (((q31_t)y      ) >> 16)), 16) & (int32_t)0x0000FFFF;\n\n    return ((uint32_t)((s << 16) | (r      )));\n  }\n\n\n  /*\n   * @brief C custom defined SHSUB16 for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SHSUB16(\n  uint32_t x,\n  uint32_t y)\n  {\n    q31_t r, s;\n\n    r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;\n    s = (((((q31_t)x      ) >> 16) - (((q31_t)y      ) >> 16)) >> 1) & (int32_t)0x0000FFFF;\n\n    return ((uint32_t)((s << 16) | (r      )));\n  }\n\n\n  /*\n   * @brief C custom defined QASX for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __QASX(\n  uint32_t x,\n  uint32_t y)\n  {\n    q31_t r, s;\n\n    r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y      ) >> 16)), 16) & (int32_t)0x0000FFFF;\n    s = __SSAT(((((q31_t)x      ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;\n\n    return ((uint32_t)((s << 16) | (r      )));\n  }\n\n\n  /*\n   * @brief C custom defined SHASX for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SHASX(\n  uint32_t x,\n  uint32_t y)\n  {\n    q31_t r, s;\n\n    r = (((((q31_t)x << 16) >> 16) - (((q31_t)y      ) >> 16)) >> 1) & (int32_t)0x0000FFFF;\n    s = (((((q31_t)x      ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;\n\n    return ((uint32_t)((s << 16) | (r      )));\n  }\n\n\n  /*\n   * @brief C custom defined QSAX for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __QSAX(\n  uint32_t x,\n  uint32_t y)\n  {\n    q31_t r, s;\n\n    r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y      ) >> 16)), 16) & (int32_t)0x0000FFFF;\n    s = __SSAT(((((q31_t)x      ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF;\n\n    return ((uint32_t)((s << 16) | (r      )));\n  }\n\n\n  /*\n   * @brief C custom defined SHSAX for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SHSAX(\n  uint32_t x,\n  uint32_t y)\n  {\n    q31_t r, s;\n\n    r = (((((q31_t)x << 16) >> 16) + (((q31_t)y      ) >> 16)) >> 1) & (int32_t)0x0000FFFF;\n    s = (((((q31_t)x      ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF;\n\n    return ((uint32_t)((s << 16) | (r      )));\n  }\n\n\n  /*\n   * @brief C custom defined SMUSDX for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SMUSDX(\n  uint32_t x,\n  uint32_t y)\n  {\n    return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y      ) >> 16)) -\n                       ((((q31_t)x      ) >> 16) * (((q31_t)y << 16) >> 16))   ));\n  }\n\n  /*\n   * @brief C custom defined SMUADX for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SMUADX(\n  uint32_t x,\n  uint32_t y)\n  {\n    return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y      ) >> 16)) +\n                       ((((q31_t)x      ) >> 16) * (((q31_t)y << 16) >> 16))   ));\n  }\n\n\n  /*\n   * @brief C custom defined QADD for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE int32_t __QADD(\n  int32_t x,\n  int32_t y)\n  {\n    return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y)));\n  }\n\n\n  /*\n   * @brief C custom defined QSUB for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE int32_t __QSUB(\n  int32_t x,\n  int32_t y)\n  {\n    return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y)));\n  }\n\n\n  /*\n   * @brief C custom defined SMLAD for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SMLAD(\n  uint32_t x,\n  uint32_t y,\n  uint32_t sum)\n  {\n    return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) +\n                       ((((q31_t)x      ) >> 16) * (((q31_t)y      ) >> 16)) +\n                       ( ((q31_t)sum    )                                  )   ));\n  }\n\n\n  /*\n   * @brief C custom defined SMLADX for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SMLADX(\n  uint32_t x,\n  uint32_t y,\n  uint32_t sum)\n  {\n    return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y      ) >> 16)) +\n                       ((((q31_t)x      ) >> 16) * (((q31_t)y << 16) >> 16)) +\n                       ( ((q31_t)sum    )                                  )   ));\n  }\n\n\n  /*\n   * @brief C custom defined SMLSDX for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SMLSDX(\n  uint32_t x,\n  uint32_t y,\n  uint32_t sum)\n  {\n    return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y      ) >> 16)) -\n                       ((((q31_t)x      ) >> 16) * (((q31_t)y << 16) >> 16)) +\n                       ( ((q31_t)sum    )                                  )   ));\n  }\n\n\n  /*\n   * @brief C custom defined SMLALD for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint64_t __SMLALD(\n  uint32_t x,\n  uint32_t y,\n  uint64_t sum)\n  {\n/*  return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */\n    return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) +\n                       ((((q31_t)x      ) >> 16) * (((q31_t)y      ) >> 16)) +\n                       ( ((q63_t)sum    )                                  )   ));\n  }\n\n\n  /*\n   * @brief C custom defined SMLALDX for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint64_t __SMLALDX(\n  uint32_t x,\n  uint32_t y,\n  uint64_t sum)\n  {\n/*  return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */\n    return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y      ) >> 16)) +\n                       ((((q31_t)x      ) >> 16) * (((q31_t)y << 16) >> 16)) +\n                       ( ((q63_t)sum    )                                  )   ));\n  }\n\n\n  /*\n   * @brief C custom defined SMUAD for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SMUAD(\n  uint32_t x,\n  uint32_t y)\n  {\n    return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) +\n                       ((((q31_t)x      ) >> 16) * (((q31_t)y      ) >> 16))   ));\n  }\n\n\n  /*\n   * @brief C custom defined SMUSD for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SMUSD(\n  uint32_t x,\n  uint32_t y)\n  {\n    return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) -\n                       ((((q31_t)x      ) >> 16) * (((q31_t)y      ) >> 16))   ));\n  }\n\n\n  /*\n   * @brief C custom defined SXTB16 for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __SXTB16(\n  uint32_t x)\n  {\n    return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) |\n                       ((((q31_t)x <<  8) >>  8) & (q31_t)0xFFFF0000)  ));\n  }\n\n  /*\n   * @brief C custom defined SMMLA for M3 and M0 processors\n   */\n  CMSIS_INLINE __STATIC_INLINE int32_t __SMMLA(\n  int32_t x,\n  int32_t y,\n  int32_t sum)\n  {\n    return (sum + (int32_t) (((int64_t) x * y) >> 32));\n  }\n\n#if 0\n  /*\n   * @brief C custom defined PKHBT for unavailable DSP extension\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __PKHBT(\n  uint32_t x,\n  uint32_t y,\n  uint32_t leftshift)\n  {\n    return ( ((x             ) & 0x0000FFFFUL) |\n             ((y << leftshift) & 0xFFFF0000UL)  );\n  }\n\n  /*\n   * @brief C custom defined PKHTB for unavailable DSP extension\n   */\n  CMSIS_INLINE __STATIC_INLINE uint32_t __PKHTB(\n  uint32_t x,\n  uint32_t y,\n  uint32_t rightshift)\n  {\n    return ( ((x              ) & 0xFFFF0000UL) |\n             ((y >> rightshift) & 0x0000FFFFUL)  );\n  }\n#endif\n\n/* #endif // defined (ARM_MATH_CM3) || defined (ARM_MATH_CM0_FAMILY) */\n#endif /* !defined (ARM_MATH_DSP) */\n\n\n  /**\n   * @brief Instance structure for the Q7 FIR filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;        /**< number of filter coefficients in the filter. */\n    q7_t *pState;            /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n    q7_t *pCoeffs;           /**< points to the coefficient array. The array is of length numTaps.*/\n  } arm_fir_instance_q7;\n\n  /**\n   * @brief Instance structure for the Q15 FIR filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;         /**< number of filter coefficients in the filter. */\n    q15_t *pState;            /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n    q15_t *pCoeffs;           /**< points to the coefficient array. The array is of length numTaps.*/\n  } arm_fir_instance_q15;\n\n  /**\n   * @brief Instance structure for the Q31 FIR filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;         /**< number of filter coefficients in the filter. */\n    q31_t *pState;            /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n    q31_t *pCoeffs;           /**< points to the coefficient array. The array is of length numTaps. */\n  } arm_fir_instance_q31;\n\n  /**\n   * @brief Instance structure for the floating-point FIR filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;     /**< number of filter coefficients in the filter. */\n    float32_t *pState;    /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n    float32_t *pCoeffs;   /**< points to the coefficient array. The array is of length numTaps. */\n  } arm_fir_instance_f32;\n\n\n  /**\n   * @brief Processing function for the Q7 FIR filter.\n   * @param[in]  S          points to an instance of the Q7 FIR filter structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_fir_q7(\n  const arm_fir_instance_q7 * S,\n  q7_t * pSrc,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q7 FIR filter.\n   * @param[in,out] S          points to an instance of the Q7 FIR structure.\n   * @param[in]     numTaps    Number of filter coefficients in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     blockSize  number of samples that are processed.\n   */\n  void arm_fir_init_q7(\n  arm_fir_instance_q7 * S,\n  uint16_t numTaps,\n  q7_t * pCoeffs,\n  q7_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q15 FIR filter.\n   * @param[in]  S          points to an instance of the Q15 FIR structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_fir_q15(\n  const arm_fir_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the fast Q15 FIR filter for Cortex-M3 and Cortex-M4.\n   * @param[in]  S          points to an instance of the Q15 FIR filter structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_fir_fast_q15(\n  const arm_fir_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q15 FIR filter.\n   * @param[in,out] S          points to an instance of the Q15 FIR filter structure.\n   * @param[in]     numTaps    Number of filter coefficients in the filter. Must be even and greater than or equal to 4.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     blockSize  number of samples that are processed at a time.\n   * @return The function returns ARM_MATH_SUCCESS if initialization was successful or ARM_MATH_ARGUMENT_ERROR if\n   * <code>numTaps</code> is not a supported value.\n   */\n  arm_status arm_fir_init_q15(\n  arm_fir_instance_q15 * S,\n  uint16_t numTaps,\n  q15_t * pCoeffs,\n  q15_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q31 FIR filter.\n   * @param[in]  S          points to an instance of the Q31 FIR filter structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_fir_q31(\n  const arm_fir_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the fast Q31 FIR filter for Cortex-M3 and Cortex-M4.\n   * @param[in]  S          points to an instance of the Q31 FIR structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_fir_fast_q31(\n  const arm_fir_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q31 FIR filter.\n   * @param[in,out] S          points to an instance of the Q31 FIR structure.\n   * @param[in]     numTaps    Number of filter coefficients in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     blockSize  number of samples that are processed at a time.\n   */\n  void arm_fir_init_q31(\n  arm_fir_instance_q31 * S,\n  uint16_t numTaps,\n  q31_t * pCoeffs,\n  q31_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the floating-point FIR filter.\n   * @param[in]  S          points to an instance of the floating-point FIR structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_fir_f32(\n  const arm_fir_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the floating-point FIR filter.\n   * @param[in,out] S          points to an instance of the floating-point FIR filter structure.\n   * @param[in]     numTaps    Number of filter coefficients in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     blockSize  number of samples that are processed at a time.\n   */\n  void arm_fir_init_f32(\n  arm_fir_instance_f32 * S,\n  uint16_t numTaps,\n  float32_t * pCoeffs,\n  float32_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Instance structure for the Q15 Biquad cascade filter.\n   */\n  typedef struct\n  {\n    int8_t numStages;        /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */\n    q15_t *pState;           /**< Points to the array of state coefficients.  The array is of length 4*numStages. */\n    q15_t *pCoeffs;          /**< Points to the array of coefficients.  The array is of length 5*numStages. */\n    int8_t postShift;        /**< Additional shift, in bits, applied to each output sample. */\n  } arm_biquad_casd_df1_inst_q15;\n\n  /**\n   * @brief Instance structure for the Q31 Biquad cascade filter.\n   */\n  typedef struct\n  {\n    uint32_t numStages;      /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */\n    q31_t *pState;           /**< Points to the array of state coefficients.  The array is of length 4*numStages. */\n    q31_t *pCoeffs;          /**< Points to the array of coefficients.  The array is of length 5*numStages. */\n    uint8_t postShift;       /**< Additional shift, in bits, applied to each output sample. */\n  } arm_biquad_casd_df1_inst_q31;\n\n  /**\n   * @brief Instance structure for the floating-point Biquad cascade filter.\n   */\n  typedef struct\n  {\n    uint32_t numStages;      /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */\n    float32_t *pState;       /**< Points to the array of state coefficients.  The array is of length 4*numStages. */\n    float32_t *pCoeffs;      /**< Points to the array of coefficients.  The array is of length 5*numStages. */\n  } arm_biquad_casd_df1_inst_f32;\n\n\n  /**\n   * @brief Processing function for the Q15 Biquad cascade filter.\n   * @param[in]  S          points to an instance of the Q15 Biquad cascade structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_biquad_cascade_df1_q15(\n  const arm_biquad_casd_df1_inst_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q15 Biquad cascade filter.\n   * @param[in,out] S          points to an instance of the Q15 Biquad cascade structure.\n   * @param[in]     numStages  number of 2nd order stages in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     postShift  Shift to be applied to the output. Varies according to the coefficients format\n   */\n  void arm_biquad_cascade_df1_init_q15(\n  arm_biquad_casd_df1_inst_q15 * S,\n  uint8_t numStages,\n  q15_t * pCoeffs,\n  q15_t * pState,\n  int8_t postShift);\n\n\n  /**\n   * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4.\n   * @param[in]  S          points to an instance of the Q15 Biquad cascade structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_biquad_cascade_df1_fast_q15(\n  const arm_biquad_casd_df1_inst_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q31 Biquad cascade filter\n   * @param[in]  S          points to an instance of the Q31 Biquad cascade structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_biquad_cascade_df1_q31(\n  const arm_biquad_casd_df1_inst_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4.\n   * @param[in]  S          points to an instance of the Q31 Biquad cascade structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_biquad_cascade_df1_fast_q31(\n  const arm_biquad_casd_df1_inst_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q31 Biquad cascade filter.\n   * @param[in,out] S          points to an instance of the Q31 Biquad cascade structure.\n   * @param[in]     numStages  number of 2nd order stages in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     postShift  Shift to be applied to the output. Varies according to the coefficients format\n   */\n  void arm_biquad_cascade_df1_init_q31(\n  arm_biquad_casd_df1_inst_q31 * S,\n  uint8_t numStages,\n  q31_t * pCoeffs,\n  q31_t * pState,\n  int8_t postShift);\n\n\n  /**\n   * @brief Processing function for the floating-point Biquad cascade filter.\n   * @param[in]  S          points to an instance of the floating-point Biquad cascade structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_biquad_cascade_df1_f32(\n  const arm_biquad_casd_df1_inst_f32 * S,\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the floating-point Biquad cascade filter.\n   * @param[in,out] S          points to an instance of the floating-point Biquad cascade structure.\n   * @param[in]     numStages  number of 2nd order stages in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   */\n  void arm_biquad_cascade_df1_init_f32(\n  arm_biquad_casd_df1_inst_f32 * S,\n  uint8_t numStages,\n  float32_t * pCoeffs,\n  float32_t * pState);\n\n\n  /**\n   * @brief Instance structure for the floating-point matrix structure.\n   */\n  typedef struct\n  {\n    uint16_t numRows;     /**< number of rows of the matrix.     */\n    uint16_t numCols;     /**< number of columns of the matrix.  */\n    float32_t *pData;     /**< points to the data of the matrix. */\n  } arm_matrix_instance_f32;\n\n\n  /**\n   * @brief Instance structure for the floating-point matrix structure.\n   */\n  typedef struct\n  {\n    uint16_t numRows;     /**< number of rows of the matrix.     */\n    uint16_t numCols;     /**< number of columns of the matrix.  */\n    float64_t *pData;     /**< points to the data of the matrix. */\n  } arm_matrix_instance_f64;\n\n  /**\n   * @brief Instance structure for the Q15 matrix structure.\n   */\n  typedef struct\n  {\n    uint16_t numRows;     /**< number of rows of the matrix.     */\n    uint16_t numCols;     /**< number of columns of the matrix.  */\n    q15_t *pData;         /**< points to the data of the matrix. */\n  } arm_matrix_instance_q15;\n\n  /**\n   * @brief Instance structure for the Q31 matrix structure.\n   */\n  typedef struct\n  {\n    uint16_t numRows;     /**< number of rows of the matrix.     */\n    uint16_t numCols;     /**< number of columns of the matrix.  */\n    q31_t *pData;         /**< points to the data of the matrix. */\n  } arm_matrix_instance_q31;\n\n\n  /**\n   * @brief Floating-point matrix addition.\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_add_f32(\n  const arm_matrix_instance_f32 * pSrcA,\n  const arm_matrix_instance_f32 * pSrcB,\n  arm_matrix_instance_f32 * pDst);\n\n\n  /**\n   * @brief Q15 matrix addition.\n   * @param[in]   pSrcA  points to the first input matrix structure\n   * @param[in]   pSrcB  points to the second input matrix structure\n   * @param[out]  pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_add_q15(\n  const arm_matrix_instance_q15 * pSrcA,\n  const arm_matrix_instance_q15 * pSrcB,\n  arm_matrix_instance_q15 * pDst);\n\n\n  /**\n   * @brief Q31 matrix addition.\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_add_q31(\n  const arm_matrix_instance_q31 * pSrcA,\n  const arm_matrix_instance_q31 * pSrcB,\n  arm_matrix_instance_q31 * pDst);\n\n\n  /**\n   * @brief Floating-point, complex, matrix multiplication.\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_cmplx_mult_f32(\n  const arm_matrix_instance_f32 * pSrcA,\n  const arm_matrix_instance_f32 * pSrcB,\n  arm_matrix_instance_f32 * pDst);\n\n\n  /**\n   * @brief Q15, complex,  matrix multiplication.\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_cmplx_mult_q15(\n  const arm_matrix_instance_q15 * pSrcA,\n  const arm_matrix_instance_q15 * pSrcB,\n  arm_matrix_instance_q15 * pDst,\n  q15_t * pScratch);\n\n\n  /**\n   * @brief Q31, complex, matrix multiplication.\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_cmplx_mult_q31(\n  const arm_matrix_instance_q31 * pSrcA,\n  const arm_matrix_instance_q31 * pSrcB,\n  arm_matrix_instance_q31 * pDst);\n\n\n  /**\n   * @brief Floating-point matrix transpose.\n   * @param[in]  pSrc  points to the input matrix\n   * @param[out] pDst  points to the output matrix\n   * @return    The function returns either  <code>ARM_MATH_SIZE_MISMATCH</code>\n   * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_trans_f32(\n  const arm_matrix_instance_f32 * pSrc,\n  arm_matrix_instance_f32 * pDst);\n\n\n  /**\n   * @brief Q15 matrix transpose.\n   * @param[in]  pSrc  points to the input matrix\n   * @param[out] pDst  points to the output matrix\n   * @return    The function returns either  <code>ARM_MATH_SIZE_MISMATCH</code>\n   * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_trans_q15(\n  const arm_matrix_instance_q15 * pSrc,\n  arm_matrix_instance_q15 * pDst);\n\n\n  /**\n   * @brief Q31 matrix transpose.\n   * @param[in]  pSrc  points to the input matrix\n   * @param[out] pDst  points to the output matrix\n   * @return    The function returns either  <code>ARM_MATH_SIZE_MISMATCH</code>\n   * or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_trans_q31(\n  const arm_matrix_instance_q31 * pSrc,\n  arm_matrix_instance_q31 * pDst);\n\n\n  /**\n   * @brief Floating-point matrix multiplication\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_mult_f32(\n  const arm_matrix_instance_f32 * pSrcA,\n  const arm_matrix_instance_f32 * pSrcB,\n  arm_matrix_instance_f32 * pDst);\n\n\n  /**\n   * @brief Q15 matrix multiplication\n   * @param[in]  pSrcA   points to the first input matrix structure\n   * @param[in]  pSrcB   points to the second input matrix structure\n   * @param[out] pDst    points to output matrix structure\n   * @param[in]  pState  points to the array for storing intermediate results\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_mult_q15(\n  const arm_matrix_instance_q15 * pSrcA,\n  const arm_matrix_instance_q15 * pSrcB,\n  arm_matrix_instance_q15 * pDst,\n  q15_t * pState);\n\n\n  /**\n   * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4\n   * @param[in]  pSrcA   points to the first input matrix structure\n   * @param[in]  pSrcB   points to the second input matrix structure\n   * @param[out] pDst    points to output matrix structure\n   * @param[in]  pState  points to the array for storing intermediate results\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_mult_fast_q15(\n  const arm_matrix_instance_q15 * pSrcA,\n  const arm_matrix_instance_q15 * pSrcB,\n  arm_matrix_instance_q15 * pDst,\n  q15_t * pState);\n\n\n  /**\n   * @brief Q31 matrix multiplication\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_mult_q31(\n  const arm_matrix_instance_q31 * pSrcA,\n  const arm_matrix_instance_q31 * pSrcB,\n  arm_matrix_instance_q31 * pDst);\n\n\n  /**\n   * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_mult_fast_q31(\n  const arm_matrix_instance_q31 * pSrcA,\n  const arm_matrix_instance_q31 * pSrcB,\n  arm_matrix_instance_q31 * pDst);\n\n\n  /**\n   * @brief Floating-point matrix subtraction\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_sub_f32(\n  const arm_matrix_instance_f32 * pSrcA,\n  const arm_matrix_instance_f32 * pSrcB,\n  arm_matrix_instance_f32 * pDst);\n\n\n  /**\n   * @brief Q15 matrix subtraction\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_sub_q15(\n  const arm_matrix_instance_q15 * pSrcA,\n  const arm_matrix_instance_q15 * pSrcB,\n  arm_matrix_instance_q15 * pDst);\n\n\n  /**\n   * @brief Q31 matrix subtraction\n   * @param[in]  pSrcA  points to the first input matrix structure\n   * @param[in]  pSrcB  points to the second input matrix structure\n   * @param[out] pDst   points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_sub_q31(\n  const arm_matrix_instance_q31 * pSrcA,\n  const arm_matrix_instance_q31 * pSrcB,\n  arm_matrix_instance_q31 * pDst);\n\n\n  /**\n   * @brief Floating-point matrix scaling.\n   * @param[in]  pSrc   points to the input matrix\n   * @param[in]  scale  scale factor\n   * @param[out] pDst   points to the output matrix\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_scale_f32(\n  const arm_matrix_instance_f32 * pSrc,\n  float32_t scale,\n  arm_matrix_instance_f32 * pDst);\n\n\n  /**\n   * @brief Q15 matrix scaling.\n   * @param[in]  pSrc        points to input matrix\n   * @param[in]  scaleFract  fractional portion of the scale factor\n   * @param[in]  shift       number of bits to shift the result by\n   * @param[out] pDst        points to output matrix\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_scale_q15(\n  const arm_matrix_instance_q15 * pSrc,\n  q15_t scaleFract,\n  int32_t shift,\n  arm_matrix_instance_q15 * pDst);\n\n\n  /**\n   * @brief Q31 matrix scaling.\n   * @param[in]  pSrc        points to input matrix\n   * @param[in]  scaleFract  fractional portion of the scale factor\n   * @param[in]  shift       number of bits to shift the result by\n   * @param[out] pDst        points to output matrix structure\n   * @return     The function returns either\n   * <code>ARM_MATH_SIZE_MISMATCH</code> or <code>ARM_MATH_SUCCESS</code> based on the outcome of size checking.\n   */\n  arm_status arm_mat_scale_q31(\n  const arm_matrix_instance_q31 * pSrc,\n  q31_t scaleFract,\n  int32_t shift,\n  arm_matrix_instance_q31 * pDst);\n\n\n  /**\n   * @brief  Q31 matrix initialization.\n   * @param[in,out] S         points to an instance of the floating-point matrix structure.\n   * @param[in]     nRows     number of rows in the matrix.\n   * @param[in]     nColumns  number of columns in the matrix.\n   * @param[in]     pData     points to the matrix data array.\n   */\n  void arm_mat_init_q31(\n  arm_matrix_instance_q31 * S,\n  uint16_t nRows,\n  uint16_t nColumns,\n  q31_t * pData);\n\n\n  /**\n   * @brief  Q15 matrix initialization.\n   * @param[in,out] S         points to an instance of the floating-point matrix structure.\n   * @param[in]     nRows     number of rows in the matrix.\n   * @param[in]     nColumns  number of columns in the matrix.\n   * @param[in]     pData     points to the matrix data array.\n   */\n  void arm_mat_init_q15(\n  arm_matrix_instance_q15 * S,\n  uint16_t nRows,\n  uint16_t nColumns,\n  q15_t * pData);\n\n\n  /**\n   * @brief  Floating-point matrix initialization.\n   * @param[in,out] S         points to an instance of the floating-point matrix structure.\n   * @param[in]     nRows     number of rows in the matrix.\n   * @param[in]     nColumns  number of columns in the matrix.\n   * @param[in]     pData     points to the matrix data array.\n   */\n  void arm_mat_init_f32(\n  arm_matrix_instance_f32 * S,\n  uint16_t nRows,\n  uint16_t nColumns,\n  float32_t * pData);\n\n\n\n  /**\n   * @brief Instance structure for the Q15 PID Control.\n   */\n  typedef struct\n  {\n    q15_t A0;           /**< The derived gain, A0 = Kp + Ki + Kd . */\n#if !defined (ARM_MATH_DSP)\n    q15_t A1;\n    q15_t A2;\n#else\n    q31_t A1;           /**< The derived gain A1 = -Kp - 2Kd | Kd.*/\n#endif\n    q15_t state[3];     /**< The state array of length 3. */\n    q15_t Kp;           /**< The proportional gain. */\n    q15_t Ki;           /**< The integral gain. */\n    q15_t Kd;           /**< The derivative gain. */\n  } arm_pid_instance_q15;\n\n  /**\n   * @brief Instance structure for the Q31 PID Control.\n   */\n  typedef struct\n  {\n    q31_t A0;            /**< The derived gain, A0 = Kp + Ki + Kd . */\n    q31_t A1;            /**< The derived gain, A1 = -Kp - 2Kd. */\n    q31_t A2;            /**< The derived gain, A2 = Kd . */\n    q31_t state[3];      /**< The state array of length 3. */\n    q31_t Kp;            /**< The proportional gain. */\n    q31_t Ki;            /**< The integral gain. */\n    q31_t Kd;            /**< The derivative gain. */\n  } arm_pid_instance_q31;\n\n  /**\n   * @brief Instance structure for the floating-point PID Control.\n   */\n  typedef struct\n  {\n    float32_t A0;          /**< The derived gain, A0 = Kp + Ki + Kd . */\n    float32_t A1;          /**< The derived gain, A1 = -Kp - 2Kd. */\n    float32_t A2;          /**< The derived gain, A2 = Kd . */\n    float32_t state[3];    /**< The state array of length 3. */\n    float32_t Kp;          /**< The proportional gain. */\n    float32_t Ki;          /**< The integral gain. */\n    float32_t Kd;          /**< The derivative gain. */\n  } arm_pid_instance_f32;\n\n\n\n  /**\n   * @brief  Initialization function for the floating-point PID Control.\n   * @param[in,out] S               points to an instance of the PID structure.\n   * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state 1 = reset the state.\n   */\n  void arm_pid_init_f32(\n  arm_pid_instance_f32 * S,\n  int32_t resetStateFlag);\n\n\n  /**\n   * @brief  Reset function for the floating-point PID Control.\n   * @param[in,out] S  is an instance of the floating-point PID Control structure\n   */\n  void arm_pid_reset_f32(\n  arm_pid_instance_f32 * S);\n\n\n  /**\n   * @brief  Initialization function for the Q31 PID Control.\n   * @param[in,out] S               points to an instance of the Q15 PID structure.\n   * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state 1 = reset the state.\n   */\n  void arm_pid_init_q31(\n  arm_pid_instance_q31 * S,\n  int32_t resetStateFlag);\n\n\n  /**\n   * @brief  Reset function for the Q31 PID Control.\n   * @param[in,out] S   points to an instance of the Q31 PID Control structure\n   */\n\n  void arm_pid_reset_q31(\n  arm_pid_instance_q31 * S);\n\n\n  /**\n   * @brief  Initialization function for the Q15 PID Control.\n   * @param[in,out] S               points to an instance of the Q15 PID structure.\n   * @param[in]     resetStateFlag  flag to reset the state. 0 = no change in state 1 = reset the state.\n   */\n  void arm_pid_init_q15(\n  arm_pid_instance_q15 * S,\n  int32_t resetStateFlag);\n\n\n  /**\n   * @brief  Reset function for the Q15 PID Control.\n   * @param[in,out] S  points to an instance of the q15 PID Control structure\n   */\n  void arm_pid_reset_q15(\n  arm_pid_instance_q15 * S);\n\n\n  /**\n   * @brief Instance structure for the floating-point Linear Interpolate function.\n   */\n  typedef struct\n  {\n    uint32_t nValues;           /**< nValues */\n    float32_t x1;               /**< x1 */\n    float32_t xSpacing;         /**< xSpacing */\n    float32_t *pYData;          /**< pointer to the table of Y values */\n  } arm_linear_interp_instance_f32;\n\n  /**\n   * @brief Instance structure for the floating-point bilinear interpolation function.\n   */\n  typedef struct\n  {\n    uint16_t numRows;   /**< number of rows in the data table. */\n    uint16_t numCols;   /**< number of columns in the data table. */\n    float32_t *pData;   /**< points to the data table. */\n  } arm_bilinear_interp_instance_f32;\n\n   /**\n   * @brief Instance structure for the Q31 bilinear interpolation function.\n   */\n  typedef struct\n  {\n    uint16_t numRows;   /**< number of rows in the data table. */\n    uint16_t numCols;   /**< number of columns in the data table. */\n    q31_t *pData;       /**< points to the data table. */\n  } arm_bilinear_interp_instance_q31;\n\n   /**\n   * @brief Instance structure for the Q15 bilinear interpolation function.\n   */\n  typedef struct\n  {\n    uint16_t numRows;   /**< number of rows in the data table. */\n    uint16_t numCols;   /**< number of columns in the data table. */\n    q15_t *pData;       /**< points to the data table. */\n  } arm_bilinear_interp_instance_q15;\n\n   /**\n   * @brief Instance structure for the Q15 bilinear interpolation function.\n   */\n  typedef struct\n  {\n    uint16_t numRows;   /**< number of rows in the data table. */\n    uint16_t numCols;   /**< number of columns in the data table. */\n    q7_t *pData;        /**< points to the data table. */\n  } arm_bilinear_interp_instance_q7;\n\n\n  /**\n   * @brief Q7 vector multiplication.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_mult_q7(\n  q7_t * pSrcA,\n  q7_t * pSrcB,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q15 vector multiplication.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_mult_q15(\n  q15_t * pSrcA,\n  q15_t * pSrcB,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q31 vector multiplication.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_mult_q31(\n  q31_t * pSrcA,\n  q31_t * pSrcB,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Floating-point vector multiplication.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_mult_f32(\n  float32_t * pSrcA,\n  float32_t * pSrcB,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Instance structure for the Q15 CFFT/CIFFT function.\n   */\n  typedef struct\n  {\n    uint16_t fftLen;                 /**< length of the FFT. */\n    uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */\n    uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */\n    q15_t *pTwiddle;                 /**< points to the Sin twiddle factor table. */\n    uint16_t *pBitRevTable;          /**< points to the bit reversal table. */\n    uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */\n    uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */\n  } arm_cfft_radix2_instance_q15;\n\n/* Deprecated */\n  arm_status arm_cfft_radix2_init_q15(\n  arm_cfft_radix2_instance_q15 * S,\n  uint16_t fftLen,\n  uint8_t ifftFlag,\n  uint8_t bitReverseFlag);\n\n/* Deprecated */\n  void arm_cfft_radix2_q15(\n  const arm_cfft_radix2_instance_q15 * S,\n  q15_t * pSrc);\n\n\n  /**\n   * @brief Instance structure for the Q15 CFFT/CIFFT function.\n   */\n  typedef struct\n  {\n    uint16_t fftLen;                 /**< length of the FFT. */\n    uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */\n    uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */\n    q15_t *pTwiddle;                 /**< points to the twiddle factor table. */\n    uint16_t *pBitRevTable;          /**< points to the bit reversal table. */\n    uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */\n    uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */\n  } arm_cfft_radix4_instance_q15;\n\n/* Deprecated */\n  arm_status arm_cfft_radix4_init_q15(\n  arm_cfft_radix4_instance_q15 * S,\n  uint16_t fftLen,\n  uint8_t ifftFlag,\n  uint8_t bitReverseFlag);\n\n/* Deprecated */\n  void arm_cfft_radix4_q15(\n  const arm_cfft_radix4_instance_q15 * S,\n  q15_t * pSrc);\n\n  /**\n   * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function.\n   */\n  typedef struct\n  {\n    uint16_t fftLen;                 /**< length of the FFT. */\n    uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */\n    uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */\n    q31_t *pTwiddle;                 /**< points to the Twiddle factor table. */\n    uint16_t *pBitRevTable;          /**< points to the bit reversal table. */\n    uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */\n    uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */\n  } arm_cfft_radix2_instance_q31;\n\n/* Deprecated */\n  arm_status arm_cfft_radix2_init_q31(\n  arm_cfft_radix2_instance_q31 * S,\n  uint16_t fftLen,\n  uint8_t ifftFlag,\n  uint8_t bitReverseFlag);\n\n/* Deprecated */\n  void arm_cfft_radix2_q31(\n  const arm_cfft_radix2_instance_q31 * S,\n  q31_t * pSrc);\n\n  /**\n   * @brief Instance structure for the Q31 CFFT/CIFFT function.\n   */\n  typedef struct\n  {\n    uint16_t fftLen;                 /**< length of the FFT. */\n    uint8_t ifftFlag;                /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */\n    uint8_t bitReverseFlag;          /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */\n    q31_t *pTwiddle;                 /**< points to the twiddle factor table. */\n    uint16_t *pBitRevTable;          /**< points to the bit reversal table. */\n    uint16_t twidCoefModifier;       /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */\n    uint16_t bitRevFactor;           /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */\n  } arm_cfft_radix4_instance_q31;\n\n/* Deprecated */\n  void arm_cfft_radix4_q31(\n  const arm_cfft_radix4_instance_q31 * S,\n  q31_t * pSrc);\n\n/* Deprecated */\n  arm_status arm_cfft_radix4_init_q31(\n  arm_cfft_radix4_instance_q31 * S,\n  uint16_t fftLen,\n  uint8_t ifftFlag,\n  uint8_t bitReverseFlag);\n\n  /**\n   * @brief Instance structure for the floating-point CFFT/CIFFT function.\n   */\n  typedef struct\n  {\n    uint16_t fftLen;                   /**< length of the FFT. */\n    uint8_t ifftFlag;                  /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */\n    uint8_t bitReverseFlag;            /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */\n    float32_t *pTwiddle;               /**< points to the Twiddle factor table. */\n    uint16_t *pBitRevTable;            /**< points to the bit reversal table. */\n    uint16_t twidCoefModifier;         /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */\n    uint16_t bitRevFactor;             /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */\n    float32_t onebyfftLen;             /**< value of 1/fftLen. */\n  } arm_cfft_radix2_instance_f32;\n\n/* Deprecated */\n  arm_status arm_cfft_radix2_init_f32(\n  arm_cfft_radix2_instance_f32 * S,\n  uint16_t fftLen,\n  uint8_t ifftFlag,\n  uint8_t bitReverseFlag);\n\n/* Deprecated */\n  void arm_cfft_radix2_f32(\n  const arm_cfft_radix2_instance_f32 * S,\n  float32_t * pSrc);\n\n  /**\n   * @brief Instance structure for the floating-point CFFT/CIFFT function.\n   */\n  typedef struct\n  {\n    uint16_t fftLen;                   /**< length of the FFT. */\n    uint8_t ifftFlag;                  /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */\n    uint8_t bitReverseFlag;            /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */\n    float32_t *pTwiddle;               /**< points to the Twiddle factor table. */\n    uint16_t *pBitRevTable;            /**< points to the bit reversal table. */\n    uint16_t twidCoefModifier;         /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */\n    uint16_t bitRevFactor;             /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */\n    float32_t onebyfftLen;             /**< value of 1/fftLen. */\n  } arm_cfft_radix4_instance_f32;\n\n/* Deprecated */\n  arm_status arm_cfft_radix4_init_f32(\n  arm_cfft_radix4_instance_f32 * S,\n  uint16_t fftLen,\n  uint8_t ifftFlag,\n  uint8_t bitReverseFlag);\n\n/* Deprecated */\n  void arm_cfft_radix4_f32(\n  const arm_cfft_radix4_instance_f32 * S,\n  float32_t * pSrc);\n\n  /**\n   * @brief Instance structure for the fixed-point CFFT/CIFFT function.\n   */\n  typedef struct\n  {\n    uint16_t fftLen;                   /**< length of the FFT. */\n    const q15_t *pTwiddle;             /**< points to the Twiddle factor table. */\n    const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */\n    uint16_t bitRevLength;             /**< bit reversal table length. */\n  } arm_cfft_instance_q15;\n\nvoid arm_cfft_q15(\n    const arm_cfft_instance_q15 * S,\n    q15_t * p1,\n    uint8_t ifftFlag,\n    uint8_t bitReverseFlag);\n\n  /**\n   * @brief Instance structure for the fixed-point CFFT/CIFFT function.\n   */\n  typedef struct\n  {\n    uint16_t fftLen;                   /**< length of the FFT. */\n    const q31_t *pTwiddle;             /**< points to the Twiddle factor table. */\n    const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */\n    uint16_t bitRevLength;             /**< bit reversal table length. */\n  } arm_cfft_instance_q31;\n\nvoid arm_cfft_q31(\n    const arm_cfft_instance_q31 * S,\n    q31_t * p1,\n    uint8_t ifftFlag,\n    uint8_t bitReverseFlag);\n\n  /**\n   * @brief Instance structure for the floating-point CFFT/CIFFT function.\n   */\n  typedef struct\n  {\n    uint16_t fftLen;                   /**< length of the FFT. */\n    const float32_t *pTwiddle;         /**< points to the Twiddle factor table. */\n    const uint16_t *pBitRevTable;      /**< points to the bit reversal table. */\n    uint16_t bitRevLength;             /**< bit reversal table length. */\n  } arm_cfft_instance_f32;\n\n  void arm_cfft_f32(\n  const arm_cfft_instance_f32 * S,\n  float32_t * p1,\n  uint8_t ifftFlag,\n  uint8_t bitReverseFlag);\n\n  /**\n   * @brief Instance structure for the Q15 RFFT/RIFFT function.\n   */\n  typedef struct\n  {\n    uint32_t fftLenReal;                      /**< length of the real FFT. */\n    uint8_t ifftFlagR;                        /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */\n    uint8_t bitReverseFlagR;                  /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */\n    uint32_t twidCoefRModifier;               /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */\n    q15_t *pTwiddleAReal;                     /**< points to the real twiddle factor table. */\n    q15_t *pTwiddleBReal;                     /**< points to the imag twiddle factor table. */\n    const arm_cfft_instance_q15 *pCfft;       /**< points to the complex FFT instance. */\n  } arm_rfft_instance_q15;\n\n  arm_status arm_rfft_init_q15(\n  arm_rfft_instance_q15 * S,\n  uint32_t fftLenReal,\n  uint32_t ifftFlagR,\n  uint32_t bitReverseFlag);\n\n  void arm_rfft_q15(\n  const arm_rfft_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst);\n\n  /**\n   * @brief Instance structure for the Q31 RFFT/RIFFT function.\n   */\n  typedef struct\n  {\n    uint32_t fftLenReal;                        /**< length of the real FFT. */\n    uint8_t ifftFlagR;                          /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */\n    uint8_t bitReverseFlagR;                    /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */\n    uint32_t twidCoefRModifier;                 /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */\n    q31_t *pTwiddleAReal;                       /**< points to the real twiddle factor table. */\n    q31_t *pTwiddleBReal;                       /**< points to the imag twiddle factor table. */\n    const arm_cfft_instance_q31 *pCfft;         /**< points to the complex FFT instance. */\n  } arm_rfft_instance_q31;\n\n  arm_status arm_rfft_init_q31(\n  arm_rfft_instance_q31 * S,\n  uint32_t fftLenReal,\n  uint32_t ifftFlagR,\n  uint32_t bitReverseFlag);\n\n  void arm_rfft_q31(\n  const arm_rfft_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst);\n\n  /**\n   * @brief Instance structure for the floating-point RFFT/RIFFT function.\n   */\n  typedef struct\n  {\n    uint32_t fftLenReal;                        /**< length of the real FFT. */\n    uint16_t fftLenBy2;                         /**< length of the complex FFT. */\n    uint8_t ifftFlagR;                          /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */\n    uint8_t bitReverseFlagR;                    /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */\n    uint32_t twidCoefRModifier;                     /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */\n    float32_t *pTwiddleAReal;                   /**< points to the real twiddle factor table. */\n    float32_t *pTwiddleBReal;                   /**< points to the imag twiddle factor table. */\n    arm_cfft_radix4_instance_f32 *pCfft;        /**< points to the complex FFT instance. */\n  } arm_rfft_instance_f32;\n\n  arm_status arm_rfft_init_f32(\n  arm_rfft_instance_f32 * S,\n  arm_cfft_radix4_instance_f32 * S_CFFT,\n  uint32_t fftLenReal,\n  uint32_t ifftFlagR,\n  uint32_t bitReverseFlag);\n\n  void arm_rfft_f32(\n  const arm_rfft_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pDst);\n\n  /**\n   * @brief Instance structure for the floating-point RFFT/RIFFT function.\n   */\ntypedef struct\n  {\n    arm_cfft_instance_f32 Sint;      /**< Internal CFFT structure. */\n    uint16_t fftLenRFFT;             /**< length of the real sequence */\n    float32_t * pTwiddleRFFT;        /**< Twiddle factors real stage  */\n  } arm_rfft_fast_instance_f32 ;\n\narm_status arm_rfft_fast_init_f32 (\n   arm_rfft_fast_instance_f32 * S,\n   uint16_t fftLen);\n\nvoid arm_rfft_fast_f32(\n  arm_rfft_fast_instance_f32 * S,\n  float32_t * p, float32_t * pOut,\n  uint8_t ifftFlag);\n\n  /**\n   * @brief Instance structure for the floating-point DCT4/IDCT4 function.\n   */\n  typedef struct\n  {\n    uint16_t N;                          /**< length of the DCT4. */\n    uint16_t Nby2;                       /**< half of the length of the DCT4. */\n    float32_t normalize;                 /**< normalizing factor. */\n    float32_t *pTwiddle;                 /**< points to the twiddle factor table. */\n    float32_t *pCosFactor;               /**< points to the cosFactor table. */\n    arm_rfft_instance_f32 *pRfft;        /**< points to the real FFT instance. */\n    arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */\n  } arm_dct4_instance_f32;\n\n\n  /**\n   * @brief  Initialization function for the floating-point DCT4/IDCT4.\n   * @param[in,out] S          points to an instance of floating-point DCT4/IDCT4 structure.\n   * @param[in]     S_RFFT     points to an instance of floating-point RFFT/RIFFT structure.\n   * @param[in]     S_CFFT     points to an instance of floating-point CFFT/CIFFT structure.\n   * @param[in]     N          length of the DCT4.\n   * @param[in]     Nby2       half of the length of the DCT4.\n   * @param[in]     normalize  normalizing factor.\n   * @return      arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>fftLenReal</code> is not a supported transform length.\n   */\n  arm_status arm_dct4_init_f32(\n  arm_dct4_instance_f32 * S,\n  arm_rfft_instance_f32 * S_RFFT,\n  arm_cfft_radix4_instance_f32 * S_CFFT,\n  uint16_t N,\n  uint16_t Nby2,\n  float32_t normalize);\n\n\n  /**\n   * @brief Processing function for the floating-point DCT4/IDCT4.\n   * @param[in]     S              points to an instance of the floating-point DCT4/IDCT4 structure.\n   * @param[in]     pState         points to state buffer.\n   * @param[in,out] pInlineBuffer  points to the in-place input and output buffer.\n   */\n  void arm_dct4_f32(\n  const arm_dct4_instance_f32 * S,\n  float32_t * pState,\n  float32_t * pInlineBuffer);\n\n\n  /**\n   * @brief Instance structure for the Q31 DCT4/IDCT4 function.\n   */\n  typedef struct\n  {\n    uint16_t N;                          /**< length of the DCT4. */\n    uint16_t Nby2;                       /**< half of the length of the DCT4. */\n    q31_t normalize;                     /**< normalizing factor. */\n    q31_t *pTwiddle;                     /**< points to the twiddle factor table. */\n    q31_t *pCosFactor;                   /**< points to the cosFactor table. */\n    arm_rfft_instance_q31 *pRfft;        /**< points to the real FFT instance. */\n    arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */\n  } arm_dct4_instance_q31;\n\n\n  /**\n   * @brief  Initialization function for the Q31 DCT4/IDCT4.\n   * @param[in,out] S          points to an instance of Q31 DCT4/IDCT4 structure.\n   * @param[in]     S_RFFT     points to an instance of Q31 RFFT/RIFFT structure\n   * @param[in]     S_CFFT     points to an instance of Q31 CFFT/CIFFT structure\n   * @param[in]     N          length of the DCT4.\n   * @param[in]     Nby2       half of the length of the DCT4.\n   * @param[in]     normalize  normalizing factor.\n   * @return      arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length.\n   */\n  arm_status arm_dct4_init_q31(\n  arm_dct4_instance_q31 * S,\n  arm_rfft_instance_q31 * S_RFFT,\n  arm_cfft_radix4_instance_q31 * S_CFFT,\n  uint16_t N,\n  uint16_t Nby2,\n  q31_t normalize);\n\n\n  /**\n   * @brief Processing function for the Q31 DCT4/IDCT4.\n   * @param[in]     S              points to an instance of the Q31 DCT4 structure.\n   * @param[in]     pState         points to state buffer.\n   * @param[in,out] pInlineBuffer  points to the in-place input and output buffer.\n   */\n  void arm_dct4_q31(\n  const arm_dct4_instance_q31 * S,\n  q31_t * pState,\n  q31_t * pInlineBuffer);\n\n\n  /**\n   * @brief Instance structure for the Q15 DCT4/IDCT4 function.\n   */\n  typedef struct\n  {\n    uint16_t N;                          /**< length of the DCT4. */\n    uint16_t Nby2;                       /**< half of the length of the DCT4. */\n    q15_t normalize;                     /**< normalizing factor. */\n    q15_t *pTwiddle;                     /**< points to the twiddle factor table. */\n    q15_t *pCosFactor;                   /**< points to the cosFactor table. */\n    arm_rfft_instance_q15 *pRfft;        /**< points to the real FFT instance. */\n    arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */\n  } arm_dct4_instance_q15;\n\n\n  /**\n   * @brief  Initialization function for the Q15 DCT4/IDCT4.\n   * @param[in,out] S          points to an instance of Q15 DCT4/IDCT4 structure.\n   * @param[in]     S_RFFT     points to an instance of Q15 RFFT/RIFFT structure.\n   * @param[in]     S_CFFT     points to an instance of Q15 CFFT/CIFFT structure.\n   * @param[in]     N          length of the DCT4.\n   * @param[in]     Nby2       half of the length of the DCT4.\n   * @param[in]     normalize  normalizing factor.\n   * @return      arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if <code>N</code> is not a supported transform length.\n   */\n  arm_status arm_dct4_init_q15(\n  arm_dct4_instance_q15 * S,\n  arm_rfft_instance_q15 * S_RFFT,\n  arm_cfft_radix4_instance_q15 * S_CFFT,\n  uint16_t N,\n  uint16_t Nby2,\n  q15_t normalize);\n\n\n  /**\n   * @brief Processing function for the Q15 DCT4/IDCT4.\n   * @param[in]     S              points to an instance of the Q15 DCT4 structure.\n   * @param[in]     pState         points to state buffer.\n   * @param[in,out] pInlineBuffer  points to the in-place input and output buffer.\n   */\n  void arm_dct4_q15(\n  const arm_dct4_instance_q15 * S,\n  q15_t * pState,\n  q15_t * pInlineBuffer);\n\n\n  /**\n   * @brief Floating-point vector addition.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_add_f32(\n  float32_t * pSrcA,\n  float32_t * pSrcB,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q7 vector addition.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_add_q7(\n  q7_t * pSrcA,\n  q7_t * pSrcB,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q15 vector addition.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_add_q15(\n  q15_t * pSrcA,\n  q15_t * pSrcB,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q31 vector addition.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_add_q31(\n  q31_t * pSrcA,\n  q31_t * pSrcB,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Floating-point vector subtraction.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_sub_f32(\n  float32_t * pSrcA,\n  float32_t * pSrcB,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q7 vector subtraction.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_sub_q7(\n  q7_t * pSrcA,\n  q7_t * pSrcB,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q15 vector subtraction.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_sub_q15(\n  q15_t * pSrcA,\n  q15_t * pSrcB,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q31 vector subtraction.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_sub_q31(\n  q31_t * pSrcA,\n  q31_t * pSrcB,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Multiplies a floating-point vector by a scalar.\n   * @param[in]  pSrc       points to the input vector\n   * @param[in]  scale      scale factor to be applied\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_scale_f32(\n  float32_t * pSrc,\n  float32_t scale,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Multiplies a Q7 vector by a scalar.\n   * @param[in]  pSrc        points to the input vector\n   * @param[in]  scaleFract  fractional portion of the scale value\n   * @param[in]  shift       number of bits to shift the result by\n   * @param[out] pDst        points to the output vector\n   * @param[in]  blockSize   number of samples in the vector\n   */\n  void arm_scale_q7(\n  q7_t * pSrc,\n  q7_t scaleFract,\n  int8_t shift,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Multiplies a Q15 vector by a scalar.\n   * @param[in]  pSrc        points to the input vector\n   * @param[in]  scaleFract  fractional portion of the scale value\n   * @param[in]  shift       number of bits to shift the result by\n   * @param[out] pDst        points to the output vector\n   * @param[in]  blockSize   number of samples in the vector\n   */\n  void arm_scale_q15(\n  q15_t * pSrc,\n  q15_t scaleFract,\n  int8_t shift,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Multiplies a Q31 vector by a scalar.\n   * @param[in]  pSrc        points to the input vector\n   * @param[in]  scaleFract  fractional portion of the scale value\n   * @param[in]  shift       number of bits to shift the result by\n   * @param[out] pDst        points to the output vector\n   * @param[in]  blockSize   number of samples in the vector\n   */\n  void arm_scale_q31(\n  q31_t * pSrc,\n  q31_t scaleFract,\n  int8_t shift,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q7 vector absolute value.\n   * @param[in]  pSrc       points to the input buffer\n   * @param[out] pDst       points to the output buffer\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_abs_q7(\n  q7_t * pSrc,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Floating-point vector absolute value.\n   * @param[in]  pSrc       points to the input buffer\n   * @param[out] pDst       points to the output buffer\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_abs_f32(\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q15 vector absolute value.\n   * @param[in]  pSrc       points to the input buffer\n   * @param[out] pDst       points to the output buffer\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_abs_q15(\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Q31 vector absolute value.\n   * @param[in]  pSrc       points to the input buffer\n   * @param[out] pDst       points to the output buffer\n   * @param[in]  blockSize  number of samples in each vector\n   */\n  void arm_abs_q31(\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Dot product of floating-point vectors.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[in]  blockSize  number of samples in each vector\n   * @param[out] result     output result returned here\n   */\n  void arm_dot_prod_f32(\n  float32_t * pSrcA,\n  float32_t * pSrcB,\n  uint32_t blockSize,\n  float32_t * result);\n\n\n  /**\n   * @brief Dot product of Q7 vectors.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[in]  blockSize  number of samples in each vector\n   * @param[out] result     output result returned here\n   */\n  void arm_dot_prod_q7(\n  q7_t * pSrcA,\n  q7_t * pSrcB,\n  uint32_t blockSize,\n  q31_t * result);\n\n\n  /**\n   * @brief Dot product of Q15 vectors.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[in]  blockSize  number of samples in each vector\n   * @param[out] result     output result returned here\n   */\n  void arm_dot_prod_q15(\n  q15_t * pSrcA,\n  q15_t * pSrcB,\n  uint32_t blockSize,\n  q63_t * result);\n\n\n  /**\n   * @brief Dot product of Q31 vectors.\n   * @param[in]  pSrcA      points to the first input vector\n   * @param[in]  pSrcB      points to the second input vector\n   * @param[in]  blockSize  number of samples in each vector\n   * @param[out] result     output result returned here\n   */\n  void arm_dot_prod_q31(\n  q31_t * pSrcA,\n  q31_t * pSrcB,\n  uint32_t blockSize,\n  q63_t * result);\n\n\n  /**\n   * @brief  Shifts the elements of a Q7 vector a specified number of bits.\n   * @param[in]  pSrc       points to the input vector\n   * @param[in]  shiftBits  number of bits to shift.  A positive value shifts left; a negative value shifts right.\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_shift_q7(\n  q7_t * pSrc,\n  int8_t shiftBits,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Shifts the elements of a Q15 vector a specified number of bits.\n   * @param[in]  pSrc       points to the input vector\n   * @param[in]  shiftBits  number of bits to shift.  A positive value shifts left; a negative value shifts right.\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_shift_q15(\n  q15_t * pSrc,\n  int8_t shiftBits,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Shifts the elements of a Q31 vector a specified number of bits.\n   * @param[in]  pSrc       points to the input vector\n   * @param[in]  shiftBits  number of bits to shift.  A positive value shifts left; a negative value shifts right.\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_shift_q31(\n  q31_t * pSrc,\n  int8_t shiftBits,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Adds a constant offset to a floating-point vector.\n   * @param[in]  pSrc       points to the input vector\n   * @param[in]  offset     is the offset to be added\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_offset_f32(\n  float32_t * pSrc,\n  float32_t offset,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Adds a constant offset to a Q7 vector.\n   * @param[in]  pSrc       points to the input vector\n   * @param[in]  offset     is the offset to be added\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_offset_q7(\n  q7_t * pSrc,\n  q7_t offset,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Adds a constant offset to a Q15 vector.\n   * @param[in]  pSrc       points to the input vector\n   * @param[in]  offset     is the offset to be added\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_offset_q15(\n  q15_t * pSrc,\n  q15_t offset,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Adds a constant offset to a Q31 vector.\n   * @param[in]  pSrc       points to the input vector\n   * @param[in]  offset     is the offset to be added\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_offset_q31(\n  q31_t * pSrc,\n  q31_t offset,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Negates the elements of a floating-point vector.\n   * @param[in]  pSrc       points to the input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_negate_f32(\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Negates the elements of a Q7 vector.\n   * @param[in]  pSrc       points to the input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_negate_q7(\n  q7_t * pSrc,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Negates the elements of a Q15 vector.\n   * @param[in]  pSrc       points to the input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_negate_q15(\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Negates the elements of a Q31 vector.\n   * @param[in]  pSrc       points to the input vector\n   * @param[out] pDst       points to the output vector\n   * @param[in]  blockSize  number of samples in the vector\n   */\n  void arm_negate_q31(\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Copies the elements of a floating-point vector.\n   * @param[in]  pSrc       input pointer\n   * @param[out] pDst       output pointer\n   * @param[in]  blockSize  number of samples to process\n   */\n  void arm_copy_f32(\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Copies the elements of a Q7 vector.\n   * @param[in]  pSrc       input pointer\n   * @param[out] pDst       output pointer\n   * @param[in]  blockSize  number of samples to process\n   */\n  void arm_copy_q7(\n  q7_t * pSrc,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Copies the elements of a Q15 vector.\n   * @param[in]  pSrc       input pointer\n   * @param[out] pDst       output pointer\n   * @param[in]  blockSize  number of samples to process\n   */\n  void arm_copy_q15(\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Copies the elements of a Q31 vector.\n   * @param[in]  pSrc       input pointer\n   * @param[out] pDst       output pointer\n   * @param[in]  blockSize  number of samples to process\n   */\n  void arm_copy_q31(\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Fills a constant value into a floating-point vector.\n   * @param[in]  value      input value to be filled\n   * @param[out] pDst       output pointer\n   * @param[in]  blockSize  number of samples to process\n   */\n  void arm_fill_f32(\n  float32_t value,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Fills a constant value into a Q7 vector.\n   * @param[in]  value      input value to be filled\n   * @param[out] pDst       output pointer\n   * @param[in]  blockSize  number of samples to process\n   */\n  void arm_fill_q7(\n  q7_t value,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Fills a constant value into a Q15 vector.\n   * @param[in]  value      input value to be filled\n   * @param[out] pDst       output pointer\n   * @param[in]  blockSize  number of samples to process\n   */\n  void arm_fill_q15(\n  q15_t value,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Fills a constant value into a Q31 vector.\n   * @param[in]  value      input value to be filled\n   * @param[out] pDst       output pointer\n   * @param[in]  blockSize  number of samples to process\n   */\n  void arm_fill_q31(\n  q31_t value,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n/**\n * @brief Convolution of floating-point sequences.\n * @param[in]  pSrcA    points to the first input sequence.\n * @param[in]  srcALen  length of the first input sequence.\n * @param[in]  pSrcB    points to the second input sequence.\n * @param[in]  srcBLen  length of the second input sequence.\n * @param[out] pDst     points to the location where the output result is written.  Length srcALen+srcBLen-1.\n */\n  void arm_conv_f32(\n  float32_t * pSrcA,\n  uint32_t srcALen,\n  float32_t * pSrcB,\n  uint32_t srcBLen,\n  float32_t * pDst);\n\n\n  /**\n   * @brief Convolution of Q15 sequences.\n   * @param[in]  pSrcA      points to the first input sequence.\n   * @param[in]  srcALen    length of the first input sequence.\n   * @param[in]  pSrcB      points to the second input sequence.\n   * @param[in]  srcBLen    length of the second input sequence.\n   * @param[out] pDst       points to the block of output data  Length srcALen+srcBLen-1.\n   * @param[in]  pScratch1  points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.\n   * @param[in]  pScratch2  points to scratch buffer of size min(srcALen, srcBLen).\n   */\n  void arm_conv_opt_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst,\n  q15_t * pScratch1,\n  q15_t * pScratch2);\n\n\n/**\n * @brief Convolution of Q15 sequences.\n * @param[in]  pSrcA    points to the first input sequence.\n * @param[in]  srcALen  length of the first input sequence.\n * @param[in]  pSrcB    points to the second input sequence.\n * @param[in]  srcBLen  length of the second input sequence.\n * @param[out] pDst     points to the location where the output result is written.  Length srcALen+srcBLen-1.\n */\n  void arm_conv_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst);\n\n\n  /**\n   * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4\n   * @param[in]  pSrcA    points to the first input sequence.\n   * @param[in]  srcALen  length of the first input sequence.\n   * @param[in]  pSrcB    points to the second input sequence.\n   * @param[in]  srcBLen  length of the second input sequence.\n   * @param[out] pDst     points to the block of output data  Length srcALen+srcBLen-1.\n   */\n  void arm_conv_fast_q15(\n          q15_t * pSrcA,\n          uint32_t srcALen,\n          q15_t * pSrcB,\n          uint32_t srcBLen,\n          q15_t * pDst);\n\n\n  /**\n   * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4\n   * @param[in]  pSrcA      points to the first input sequence.\n   * @param[in]  srcALen    length of the first input sequence.\n   * @param[in]  pSrcB      points to the second input sequence.\n   * @param[in]  srcBLen    length of the second input sequence.\n   * @param[out] pDst       points to the block of output data  Length srcALen+srcBLen-1.\n   * @param[in]  pScratch1  points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.\n   * @param[in]  pScratch2  points to scratch buffer of size min(srcALen, srcBLen).\n   */\n  void arm_conv_fast_opt_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst,\n  q15_t * pScratch1,\n  q15_t * pScratch2);\n\n\n  /**\n   * @brief Convolution of Q31 sequences.\n   * @param[in]  pSrcA    points to the first input sequence.\n   * @param[in]  srcALen  length of the first input sequence.\n   * @param[in]  pSrcB    points to the second input sequence.\n   * @param[in]  srcBLen  length of the second input sequence.\n   * @param[out] pDst     points to the block of output data  Length srcALen+srcBLen-1.\n   */\n  void arm_conv_q31(\n  q31_t * pSrcA,\n  uint32_t srcALen,\n  q31_t * pSrcB,\n  uint32_t srcBLen,\n  q31_t * pDst);\n\n\n  /**\n   * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4\n   * @param[in]  pSrcA    points to the first input sequence.\n   * @param[in]  srcALen  length of the first input sequence.\n   * @param[in]  pSrcB    points to the second input sequence.\n   * @param[in]  srcBLen  length of the second input sequence.\n   * @param[out] pDst     points to the block of output data  Length srcALen+srcBLen-1.\n   */\n  void arm_conv_fast_q31(\n  q31_t * pSrcA,\n  uint32_t srcALen,\n  q31_t * pSrcB,\n  uint32_t srcBLen,\n  q31_t * pDst);\n\n\n    /**\n   * @brief Convolution of Q7 sequences.\n   * @param[in]  pSrcA      points to the first input sequence.\n   * @param[in]  srcALen    length of the first input sequence.\n   * @param[in]  pSrcB      points to the second input sequence.\n   * @param[in]  srcBLen    length of the second input sequence.\n   * @param[out] pDst       points to the block of output data  Length srcALen+srcBLen-1.\n   * @param[in]  pScratch1  points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.\n   * @param[in]  pScratch2  points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).\n   */\n  void arm_conv_opt_q7(\n  q7_t * pSrcA,\n  uint32_t srcALen,\n  q7_t * pSrcB,\n  uint32_t srcBLen,\n  q7_t * pDst,\n  q15_t * pScratch1,\n  q15_t * pScratch2);\n\n\n  /**\n   * @brief Convolution of Q7 sequences.\n   * @param[in]  pSrcA    points to the first input sequence.\n   * @param[in]  srcALen  length of the first input sequence.\n   * @param[in]  pSrcB    points to the second input sequence.\n   * @param[in]  srcBLen  length of the second input sequence.\n   * @param[out] pDst     points to the block of output data  Length srcALen+srcBLen-1.\n   */\n  void arm_conv_q7(\n  q7_t * pSrcA,\n  uint32_t srcALen,\n  q7_t * pSrcB,\n  uint32_t srcBLen,\n  q7_t * pDst);\n\n\n  /**\n   * @brief Partial convolution of floating-point sequences.\n   * @param[in]  pSrcA       points to the first input sequence.\n   * @param[in]  srcALen     length of the first input sequence.\n   * @param[in]  pSrcB       points to the second input sequence.\n   * @param[in]  srcBLen     length of the second input sequence.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  firstIndex  is the first output sample to start with.\n   * @param[in]  numPoints   is the number of output points to be computed.\n   * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].\n   */\n  arm_status arm_conv_partial_f32(\n  float32_t * pSrcA,\n  uint32_t srcALen,\n  float32_t * pSrcB,\n  uint32_t srcBLen,\n  float32_t * pDst,\n  uint32_t firstIndex,\n  uint32_t numPoints);\n\n\n  /**\n   * @brief Partial convolution of Q15 sequences.\n   * @param[in]  pSrcA       points to the first input sequence.\n   * @param[in]  srcALen     length of the first input sequence.\n   * @param[in]  pSrcB       points to the second input sequence.\n   * @param[in]  srcBLen     length of the second input sequence.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  firstIndex  is the first output sample to start with.\n   * @param[in]  numPoints   is the number of output points to be computed.\n   * @param[in]  pScratch1   points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.\n   * @param[in]  pScratch2   points to scratch buffer of size min(srcALen, srcBLen).\n   * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].\n   */\n  arm_status arm_conv_partial_opt_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst,\n  uint32_t firstIndex,\n  uint32_t numPoints,\n  q15_t * pScratch1,\n  q15_t * pScratch2);\n\n\n  /**\n   * @brief Partial convolution of Q15 sequences.\n   * @param[in]  pSrcA       points to the first input sequence.\n   * @param[in]  srcALen     length of the first input sequence.\n   * @param[in]  pSrcB       points to the second input sequence.\n   * @param[in]  srcBLen     length of the second input sequence.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  firstIndex  is the first output sample to start with.\n   * @param[in]  numPoints   is the number of output points to be computed.\n   * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].\n   */\n  arm_status arm_conv_partial_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst,\n  uint32_t firstIndex,\n  uint32_t numPoints);\n\n\n  /**\n   * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4\n   * @param[in]  pSrcA       points to the first input sequence.\n   * @param[in]  srcALen     length of the first input sequence.\n   * @param[in]  pSrcB       points to the second input sequence.\n   * @param[in]  srcBLen     length of the second input sequence.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  firstIndex  is the first output sample to start with.\n   * @param[in]  numPoints   is the number of output points to be computed.\n   * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].\n   */\n  arm_status arm_conv_partial_fast_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst,\n  uint32_t firstIndex,\n  uint32_t numPoints);\n\n\n  /**\n   * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4\n   * @param[in]  pSrcA       points to the first input sequence.\n   * @param[in]  srcALen     length of the first input sequence.\n   * @param[in]  pSrcB       points to the second input sequence.\n   * @param[in]  srcBLen     length of the second input sequence.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  firstIndex  is the first output sample to start with.\n   * @param[in]  numPoints   is the number of output points to be computed.\n   * @param[in]  pScratch1   points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.\n   * @param[in]  pScratch2   points to scratch buffer of size min(srcALen, srcBLen).\n   * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].\n   */\n  arm_status arm_conv_partial_fast_opt_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst,\n  uint32_t firstIndex,\n  uint32_t numPoints,\n  q15_t * pScratch1,\n  q15_t * pScratch2);\n\n\n  /**\n   * @brief Partial convolution of Q31 sequences.\n   * @param[in]  pSrcA       points to the first input sequence.\n   * @param[in]  srcALen     length of the first input sequence.\n   * @param[in]  pSrcB       points to the second input sequence.\n   * @param[in]  srcBLen     length of the second input sequence.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  firstIndex  is the first output sample to start with.\n   * @param[in]  numPoints   is the number of output points to be computed.\n   * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].\n   */\n  arm_status arm_conv_partial_q31(\n  q31_t * pSrcA,\n  uint32_t srcALen,\n  q31_t * pSrcB,\n  uint32_t srcBLen,\n  q31_t * pDst,\n  uint32_t firstIndex,\n  uint32_t numPoints);\n\n\n  /**\n   * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4\n   * @param[in]  pSrcA       points to the first input sequence.\n   * @param[in]  srcALen     length of the first input sequence.\n   * @param[in]  pSrcB       points to the second input sequence.\n   * @param[in]  srcBLen     length of the second input sequence.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  firstIndex  is the first output sample to start with.\n   * @param[in]  numPoints   is the number of output points to be computed.\n   * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].\n   */\n  arm_status arm_conv_partial_fast_q31(\n  q31_t * pSrcA,\n  uint32_t srcALen,\n  q31_t * pSrcB,\n  uint32_t srcBLen,\n  q31_t * pDst,\n  uint32_t firstIndex,\n  uint32_t numPoints);\n\n\n  /**\n   * @brief Partial convolution of Q7 sequences\n   * @param[in]  pSrcA       points to the first input sequence.\n   * @param[in]  srcALen     length of the first input sequence.\n   * @param[in]  pSrcB       points to the second input sequence.\n   * @param[in]  srcBLen     length of the second input sequence.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  firstIndex  is the first output sample to start with.\n   * @param[in]  numPoints   is the number of output points to be computed.\n   * @param[in]  pScratch1   points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.\n   * @param[in]  pScratch2   points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).\n   * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].\n   */\n  arm_status arm_conv_partial_opt_q7(\n  q7_t * pSrcA,\n  uint32_t srcALen,\n  q7_t * pSrcB,\n  uint32_t srcBLen,\n  q7_t * pDst,\n  uint32_t firstIndex,\n  uint32_t numPoints,\n  q15_t * pScratch1,\n  q15_t * pScratch2);\n\n\n/**\n   * @brief Partial convolution of Q7 sequences.\n   * @param[in]  pSrcA       points to the first input sequence.\n   * @param[in]  srcALen     length of the first input sequence.\n   * @param[in]  pSrcB       points to the second input sequence.\n   * @param[in]  srcBLen     length of the second input sequence.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  firstIndex  is the first output sample to start with.\n   * @param[in]  numPoints   is the number of output points to be computed.\n   * @return  Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2].\n   */\n  arm_status arm_conv_partial_q7(\n  q7_t * pSrcA,\n  uint32_t srcALen,\n  q7_t * pSrcB,\n  uint32_t srcBLen,\n  q7_t * pDst,\n  uint32_t firstIndex,\n  uint32_t numPoints);\n\n\n  /**\n   * @brief Instance structure for the Q15 FIR decimator.\n   */\n  typedef struct\n  {\n    uint8_t M;                  /**< decimation factor. */\n    uint16_t numTaps;           /**< number of coefficients in the filter. */\n    q15_t *pCoeffs;             /**< points to the coefficient array. The array is of length numTaps.*/\n    q15_t *pState;              /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n  } arm_fir_decimate_instance_q15;\n\n  /**\n   * @brief Instance structure for the Q31 FIR decimator.\n   */\n  typedef struct\n  {\n    uint8_t M;                  /**< decimation factor. */\n    uint16_t numTaps;           /**< number of coefficients in the filter. */\n    q31_t *pCoeffs;             /**< points to the coefficient array. The array is of length numTaps.*/\n    q31_t *pState;              /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n  } arm_fir_decimate_instance_q31;\n\n  /**\n   * @brief Instance structure for the floating-point FIR decimator.\n   */\n  typedef struct\n  {\n    uint8_t M;                  /**< decimation factor. */\n    uint16_t numTaps;           /**< number of coefficients in the filter. */\n    float32_t *pCoeffs;         /**< points to the coefficient array. The array is of length numTaps.*/\n    float32_t *pState;          /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n  } arm_fir_decimate_instance_f32;\n\n\n  /**\n   * @brief Processing function for the floating-point FIR decimator.\n   * @param[in]  S          points to an instance of the floating-point FIR decimator structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data\n   * @param[in]  blockSize  number of input samples to process per call.\n   */\n  void arm_fir_decimate_f32(\n  const arm_fir_decimate_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the floating-point FIR decimator.\n   * @param[in,out] S          points to an instance of the floating-point FIR decimator structure.\n   * @param[in]     numTaps    number of coefficients in the filter.\n   * @param[in]     M          decimation factor.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     blockSize  number of input samples to process per call.\n   * @return    The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if\n   * <code>blockSize</code> is not a multiple of <code>M</code>.\n   */\n  arm_status arm_fir_decimate_init_f32(\n  arm_fir_decimate_instance_f32 * S,\n  uint16_t numTaps,\n  uint8_t M,\n  float32_t * pCoeffs,\n  float32_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q15 FIR decimator.\n   * @param[in]  S          points to an instance of the Q15 FIR decimator structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data\n   * @param[in]  blockSize  number of input samples to process per call.\n   */\n  void arm_fir_decimate_q15(\n  const arm_fir_decimate_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4.\n   * @param[in]  S          points to an instance of the Q15 FIR decimator structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data\n   * @param[in]  blockSize  number of input samples to process per call.\n   */\n  void arm_fir_decimate_fast_q15(\n  const arm_fir_decimate_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q15 FIR decimator.\n   * @param[in,out] S          points to an instance of the Q15 FIR decimator structure.\n   * @param[in]     numTaps    number of coefficients in the filter.\n   * @param[in]     M          decimation factor.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     blockSize  number of input samples to process per call.\n   * @return    The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if\n   * <code>blockSize</code> is not a multiple of <code>M</code>.\n   */\n  arm_status arm_fir_decimate_init_q15(\n  arm_fir_decimate_instance_q15 * S,\n  uint16_t numTaps,\n  uint8_t M,\n  q15_t * pCoeffs,\n  q15_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q31 FIR decimator.\n   * @param[in]  S     points to an instance of the Q31 FIR decimator structure.\n   * @param[in]  pSrc  points to the block of input data.\n   * @param[out] pDst  points to the block of output data\n   * @param[in] blockSize number of input samples to process per call.\n   */\n  void arm_fir_decimate_q31(\n  const arm_fir_decimate_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n  /**\n   * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4.\n   * @param[in]  S          points to an instance of the Q31 FIR decimator structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data\n   * @param[in]  blockSize  number of input samples to process per call.\n   */\n  void arm_fir_decimate_fast_q31(\n  arm_fir_decimate_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q31 FIR decimator.\n   * @param[in,out] S          points to an instance of the Q31 FIR decimator structure.\n   * @param[in]     numTaps    number of coefficients in the filter.\n   * @param[in]     M          decimation factor.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     blockSize  number of input samples to process per call.\n   * @return    The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if\n   * <code>blockSize</code> is not a multiple of <code>M</code>.\n   */\n  arm_status arm_fir_decimate_init_q31(\n  arm_fir_decimate_instance_q31 * S,\n  uint16_t numTaps,\n  uint8_t M,\n  q31_t * pCoeffs,\n  q31_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Instance structure for the Q15 FIR interpolator.\n   */\n  typedef struct\n  {\n    uint8_t L;                      /**< upsample factor. */\n    uint16_t phaseLength;           /**< length of each polyphase filter component. */\n    q15_t *pCoeffs;                 /**< points to the coefficient array. The array is of length L*phaseLength. */\n    q15_t *pState;                  /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */\n  } arm_fir_interpolate_instance_q15;\n\n  /**\n   * @brief Instance structure for the Q31 FIR interpolator.\n   */\n  typedef struct\n  {\n    uint8_t L;                      /**< upsample factor. */\n    uint16_t phaseLength;           /**< length of each polyphase filter component. */\n    q31_t *pCoeffs;                 /**< points to the coefficient array. The array is of length L*phaseLength. */\n    q31_t *pState;                  /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */\n  } arm_fir_interpolate_instance_q31;\n\n  /**\n   * @brief Instance structure for the floating-point FIR interpolator.\n   */\n  typedef struct\n  {\n    uint8_t L;                     /**< upsample factor. */\n    uint16_t phaseLength;          /**< length of each polyphase filter component. */\n    float32_t *pCoeffs;            /**< points to the coefficient array. The array is of length L*phaseLength. */\n    float32_t *pState;             /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */\n  } arm_fir_interpolate_instance_f32;\n\n\n  /**\n   * @brief Processing function for the Q15 FIR interpolator.\n   * @param[in]  S          points to an instance of the Q15 FIR interpolator structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of input samples to process per call.\n   */\n  void arm_fir_interpolate_q15(\n  const arm_fir_interpolate_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q15 FIR interpolator.\n   * @param[in,out] S          points to an instance of the Q15 FIR interpolator structure.\n   * @param[in]     L          upsample factor.\n   * @param[in]     numTaps    number of filter coefficients in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficient buffer.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     blockSize  number of input samples to process per call.\n   * @return        The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if\n   * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>.\n   */\n  arm_status arm_fir_interpolate_init_q15(\n  arm_fir_interpolate_instance_q15 * S,\n  uint8_t L,\n  uint16_t numTaps,\n  q15_t * pCoeffs,\n  q15_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q31 FIR interpolator.\n   * @param[in]  S          points to an instance of the Q15 FIR interpolator structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of input samples to process per call.\n   */\n  void arm_fir_interpolate_q31(\n  const arm_fir_interpolate_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q31 FIR interpolator.\n   * @param[in,out] S          points to an instance of the Q31 FIR interpolator structure.\n   * @param[in]     L          upsample factor.\n   * @param[in]     numTaps    number of filter coefficients in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficient buffer.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     blockSize  number of input samples to process per call.\n   * @return        The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if\n   * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>.\n   */\n  arm_status arm_fir_interpolate_init_q31(\n  arm_fir_interpolate_instance_q31 * S,\n  uint8_t L,\n  uint16_t numTaps,\n  q31_t * pCoeffs,\n  q31_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the floating-point FIR interpolator.\n   * @param[in]  S          points to an instance of the floating-point FIR interpolator structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of input samples to process per call.\n   */\n  void arm_fir_interpolate_f32(\n  const arm_fir_interpolate_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the floating-point FIR interpolator.\n   * @param[in,out] S          points to an instance of the floating-point FIR interpolator structure.\n   * @param[in]     L          upsample factor.\n   * @param[in]     numTaps    number of filter coefficients in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficient buffer.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     blockSize  number of input samples to process per call.\n   * @return        The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if\n   * the filter length <code>numTaps</code> is not a multiple of the interpolation factor <code>L</code>.\n   */\n  arm_status arm_fir_interpolate_init_f32(\n  arm_fir_interpolate_instance_f32 * S,\n  uint8_t L,\n  uint16_t numTaps,\n  float32_t * pCoeffs,\n  float32_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Instance structure for the high precision Q31 Biquad cascade filter.\n   */\n  typedef struct\n  {\n    uint8_t numStages;       /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */\n    q63_t *pState;           /**< points to the array of state coefficients.  The array is of length 4*numStages. */\n    q31_t *pCoeffs;          /**< points to the array of coefficients.  The array is of length 5*numStages. */\n    uint8_t postShift;       /**< additional shift, in bits, applied to each output sample. */\n  } arm_biquad_cas_df1_32x64_ins_q31;\n\n\n  /**\n   * @param[in]  S          points to an instance of the high precision Q31 Biquad cascade filter structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_biquad_cas_df1_32x64_q31(\n  const arm_biquad_cas_df1_32x64_ins_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @param[in,out] S          points to an instance of the high precision Q31 Biquad cascade filter structure.\n   * @param[in]     numStages  number of 2nd order stages in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     postShift  shift to be applied to the output. Varies according to the coefficients format\n   */\n  void arm_biquad_cas_df1_32x64_init_q31(\n  arm_biquad_cas_df1_32x64_ins_q31 * S,\n  uint8_t numStages,\n  q31_t * pCoeffs,\n  q63_t * pState,\n  uint8_t postShift);\n\n\n  /**\n   * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.\n   */\n  typedef struct\n  {\n    uint8_t numStages;         /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */\n    float32_t *pState;         /**< points to the array of state coefficients.  The array is of length 2*numStages. */\n    float32_t *pCoeffs;        /**< points to the array of coefficients.  The array is of length 5*numStages. */\n  } arm_biquad_cascade_df2T_instance_f32;\n\n  /**\n   * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.\n   */\n  typedef struct\n  {\n    uint8_t numStages;         /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */\n    float32_t *pState;         /**< points to the array of state coefficients.  The array is of length 4*numStages. */\n    float32_t *pCoeffs;        /**< points to the array of coefficients.  The array is of length 5*numStages. */\n  } arm_biquad_cascade_stereo_df2T_instance_f32;\n\n  /**\n   * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter.\n   */\n  typedef struct\n  {\n    uint8_t numStages;         /**< number of 2nd order stages in the filter.  Overall order is 2*numStages. */\n    float64_t *pState;         /**< points to the array of state coefficients.  The array is of length 2*numStages. */\n    float64_t *pCoeffs;        /**< points to the array of coefficients.  The array is of length 5*numStages. */\n  } arm_biquad_cascade_df2T_instance_f64;\n\n\n  /**\n   * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter.\n   * @param[in]  S          points to an instance of the filter data structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_biquad_cascade_df2T_f32(\n  const arm_biquad_cascade_df2T_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels\n   * @param[in]  S          points to an instance of the filter data structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_biquad_cascade_stereo_df2T_f32(\n  const arm_biquad_cascade_stereo_df2T_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter.\n   * @param[in]  S          points to an instance of the filter data structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_biquad_cascade_df2T_f64(\n  const arm_biquad_cascade_df2T_instance_f64 * S,\n  float64_t * pSrc,\n  float64_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the floating-point transposed direct form II Biquad cascade filter.\n   * @param[in,out] S          points to an instance of the filter data structure.\n   * @param[in]     numStages  number of 2nd order stages in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   */\n  void arm_biquad_cascade_df2T_init_f32(\n  arm_biquad_cascade_df2T_instance_f32 * S,\n  uint8_t numStages,\n  float32_t * pCoeffs,\n  float32_t * pState);\n\n\n  /**\n   * @brief  Initialization function for the floating-point transposed direct form II Biquad cascade filter.\n   * @param[in,out] S          points to an instance of the filter data structure.\n   * @param[in]     numStages  number of 2nd order stages in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   */\n  void arm_biquad_cascade_stereo_df2T_init_f32(\n  arm_biquad_cascade_stereo_df2T_instance_f32 * S,\n  uint8_t numStages,\n  float32_t * pCoeffs,\n  float32_t * pState);\n\n\n  /**\n   * @brief  Initialization function for the floating-point transposed direct form II Biquad cascade filter.\n   * @param[in,out] S          points to an instance of the filter data structure.\n   * @param[in]     numStages  number of 2nd order stages in the filter.\n   * @param[in]     pCoeffs    points to the filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   */\n  void arm_biquad_cascade_df2T_init_f64(\n  arm_biquad_cascade_df2T_instance_f64 * S,\n  uint8_t numStages,\n  float64_t * pCoeffs,\n  float64_t * pState);\n\n\n  /**\n   * @brief Instance structure for the Q15 FIR lattice filter.\n   */\n  typedef struct\n  {\n    uint16_t numStages;                  /**< number of filter stages. */\n    q15_t *pState;                       /**< points to the state variable array. The array is of length numStages. */\n    q15_t *pCoeffs;                      /**< points to the coefficient array. The array is of length numStages. */\n  } arm_fir_lattice_instance_q15;\n\n  /**\n   * @brief Instance structure for the Q31 FIR lattice filter.\n   */\n  typedef struct\n  {\n    uint16_t numStages;                  /**< number of filter stages. */\n    q31_t *pState;                       /**< points to the state variable array. The array is of length numStages. */\n    q31_t *pCoeffs;                      /**< points to the coefficient array. The array is of length numStages. */\n  } arm_fir_lattice_instance_q31;\n\n  /**\n   * @brief Instance structure for the floating-point FIR lattice filter.\n   */\n  typedef struct\n  {\n    uint16_t numStages;                  /**< number of filter stages. */\n    float32_t *pState;                   /**< points to the state variable array. The array is of length numStages. */\n    float32_t *pCoeffs;                  /**< points to the coefficient array. The array is of length numStages. */\n  } arm_fir_lattice_instance_f32;\n\n\n  /**\n   * @brief Initialization function for the Q15 FIR lattice filter.\n   * @param[in] S          points to an instance of the Q15 FIR lattice structure.\n   * @param[in] numStages  number of filter stages.\n   * @param[in] pCoeffs    points to the coefficient buffer.  The array is of length numStages.\n   * @param[in] pState     points to the state buffer.  The array is of length numStages.\n   */\n  void arm_fir_lattice_init_q15(\n  arm_fir_lattice_instance_q15 * S,\n  uint16_t numStages,\n  q15_t * pCoeffs,\n  q15_t * pState);\n\n\n  /**\n   * @brief Processing function for the Q15 FIR lattice filter.\n   * @param[in]  S          points to an instance of the Q15 FIR lattice structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_fir_lattice_q15(\n  const arm_fir_lattice_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Initialization function for the Q31 FIR lattice filter.\n   * @param[in] S          points to an instance of the Q31 FIR lattice structure.\n   * @param[in] numStages  number of filter stages.\n   * @param[in] pCoeffs    points to the coefficient buffer.  The array is of length numStages.\n   * @param[in] pState     points to the state buffer.   The array is of length numStages.\n   */\n  void arm_fir_lattice_init_q31(\n  arm_fir_lattice_instance_q31 * S,\n  uint16_t numStages,\n  q31_t * pCoeffs,\n  q31_t * pState);\n\n\n  /**\n   * @brief Processing function for the Q31 FIR lattice filter.\n   * @param[in]  S          points to an instance of the Q31 FIR lattice structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_fir_lattice_q31(\n  const arm_fir_lattice_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n/**\n * @brief Initialization function for the floating-point FIR lattice filter.\n * @param[in] S          points to an instance of the floating-point FIR lattice structure.\n * @param[in] numStages  number of filter stages.\n * @param[in] pCoeffs    points to the coefficient buffer.  The array is of length numStages.\n * @param[in] pState     points to the state buffer.  The array is of length numStages.\n */\n  void arm_fir_lattice_init_f32(\n  arm_fir_lattice_instance_f32 * S,\n  uint16_t numStages,\n  float32_t * pCoeffs,\n  float32_t * pState);\n\n\n  /**\n   * @brief Processing function for the floating-point FIR lattice filter.\n   * @param[in]  S          points to an instance of the floating-point FIR lattice structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_fir_lattice_f32(\n  const arm_fir_lattice_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Instance structure for the Q15 IIR lattice filter.\n   */\n  typedef struct\n  {\n    uint16_t numStages;                  /**< number of stages in the filter. */\n    q15_t *pState;                       /**< points to the state variable array. The array is of length numStages+blockSize. */\n    q15_t *pkCoeffs;                     /**< points to the reflection coefficient array. The array is of length numStages. */\n    q15_t *pvCoeffs;                     /**< points to the ladder coefficient array. The array is of length numStages+1. */\n  } arm_iir_lattice_instance_q15;\n\n  /**\n   * @brief Instance structure for the Q31 IIR lattice filter.\n   */\n  typedef struct\n  {\n    uint16_t numStages;                  /**< number of stages in the filter. */\n    q31_t *pState;                       /**< points to the state variable array. The array is of length numStages+blockSize. */\n    q31_t *pkCoeffs;                     /**< points to the reflection coefficient array. The array is of length numStages. */\n    q31_t *pvCoeffs;                     /**< points to the ladder coefficient array. The array is of length numStages+1. */\n  } arm_iir_lattice_instance_q31;\n\n  /**\n   * @brief Instance structure for the floating-point IIR lattice filter.\n   */\n  typedef struct\n  {\n    uint16_t numStages;                  /**< number of stages in the filter. */\n    float32_t *pState;                   /**< points to the state variable array. The array is of length numStages+blockSize. */\n    float32_t *pkCoeffs;                 /**< points to the reflection coefficient array. The array is of length numStages. */\n    float32_t *pvCoeffs;                 /**< points to the ladder coefficient array. The array is of length numStages+1. */\n  } arm_iir_lattice_instance_f32;\n\n\n  /**\n   * @brief Processing function for the floating-point IIR lattice filter.\n   * @param[in]  S          points to an instance of the floating-point IIR lattice structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_iir_lattice_f32(\n  const arm_iir_lattice_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Initialization function for the floating-point IIR lattice filter.\n   * @param[in] S          points to an instance of the floating-point IIR lattice structure.\n   * @param[in] numStages  number of stages in the filter.\n   * @param[in] pkCoeffs   points to the reflection coefficient buffer.  The array is of length numStages.\n   * @param[in] pvCoeffs   points to the ladder coefficient buffer.  The array is of length numStages+1.\n   * @param[in] pState     points to the state buffer.  The array is of length numStages+blockSize-1.\n   * @param[in] blockSize  number of samples to process.\n   */\n  void arm_iir_lattice_init_f32(\n  arm_iir_lattice_instance_f32 * S,\n  uint16_t numStages,\n  float32_t * pkCoeffs,\n  float32_t * pvCoeffs,\n  float32_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q31 IIR lattice filter.\n   * @param[in]  S          points to an instance of the Q31 IIR lattice structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_iir_lattice_q31(\n  const arm_iir_lattice_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Initialization function for the Q31 IIR lattice filter.\n   * @param[in] S          points to an instance of the Q31 IIR lattice structure.\n   * @param[in] numStages  number of stages in the filter.\n   * @param[in] pkCoeffs   points to the reflection coefficient buffer.  The array is of length numStages.\n   * @param[in] pvCoeffs   points to the ladder coefficient buffer.  The array is of length numStages+1.\n   * @param[in] pState     points to the state buffer.  The array is of length numStages+blockSize.\n   * @param[in] blockSize  number of samples to process.\n   */\n  void arm_iir_lattice_init_q31(\n  arm_iir_lattice_instance_q31 * S,\n  uint16_t numStages,\n  q31_t * pkCoeffs,\n  q31_t * pvCoeffs,\n  q31_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q15 IIR lattice filter.\n   * @param[in]  S          points to an instance of the Q15 IIR lattice structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[out] pDst       points to the block of output data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_iir_lattice_q15(\n  const arm_iir_lattice_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n/**\n * @brief Initialization function for the Q15 IIR lattice filter.\n * @param[in] S          points to an instance of the fixed-point Q15 IIR lattice structure.\n * @param[in] numStages  number of stages in the filter.\n * @param[in] pkCoeffs   points to reflection coefficient buffer.  The array is of length numStages.\n * @param[in] pvCoeffs   points to ladder coefficient buffer.  The array is of length numStages+1.\n * @param[in] pState     points to state buffer.  The array is of length numStages+blockSize.\n * @param[in] blockSize  number of samples to process per call.\n */\n  void arm_iir_lattice_init_q15(\n  arm_iir_lattice_instance_q15 * S,\n  uint16_t numStages,\n  q15_t * pkCoeffs,\n  q15_t * pvCoeffs,\n  q15_t * pState,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Instance structure for the floating-point LMS filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;    /**< number of coefficients in the filter. */\n    float32_t *pState;   /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n    float32_t *pCoeffs;  /**< points to the coefficient array. The array is of length numTaps. */\n    float32_t mu;        /**< step size that controls filter coefficient updates. */\n  } arm_lms_instance_f32;\n\n\n  /**\n   * @brief Processing function for floating-point LMS filter.\n   * @param[in]  S          points to an instance of the floating-point LMS filter structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[in]  pRef       points to the block of reference data.\n   * @param[out] pOut       points to the block of output data.\n   * @param[out] pErr       points to the block of error data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_lms_f32(\n  const arm_lms_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pRef,\n  float32_t * pOut,\n  float32_t * pErr,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Initialization function for floating-point LMS filter.\n   * @param[in] S          points to an instance of the floating-point LMS filter structure.\n   * @param[in] numTaps    number of filter coefficients.\n   * @param[in] pCoeffs    points to the coefficient buffer.\n   * @param[in] pState     points to state buffer.\n   * @param[in] mu         step size that controls filter coefficient updates.\n   * @param[in] blockSize  number of samples to process.\n   */\n  void arm_lms_init_f32(\n  arm_lms_instance_f32 * S,\n  uint16_t numTaps,\n  float32_t * pCoeffs,\n  float32_t * pState,\n  float32_t mu,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Instance structure for the Q15 LMS filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;    /**< number of coefficients in the filter. */\n    q15_t *pState;       /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n    q15_t *pCoeffs;      /**< points to the coefficient array. The array is of length numTaps. */\n    q15_t mu;            /**< step size that controls filter coefficient updates. */\n    uint32_t postShift;  /**< bit shift applied to coefficients. */\n  } arm_lms_instance_q15;\n\n\n  /**\n   * @brief Initialization function for the Q15 LMS filter.\n   * @param[in] S          points to an instance of the Q15 LMS filter structure.\n   * @param[in] numTaps    number of filter coefficients.\n   * @param[in] pCoeffs    points to the coefficient buffer.\n   * @param[in] pState     points to the state buffer.\n   * @param[in] mu         step size that controls filter coefficient updates.\n   * @param[in] blockSize  number of samples to process.\n   * @param[in] postShift  bit shift applied to coefficients.\n   */\n  void arm_lms_init_q15(\n  arm_lms_instance_q15 * S,\n  uint16_t numTaps,\n  q15_t * pCoeffs,\n  q15_t * pState,\n  q15_t mu,\n  uint32_t blockSize,\n  uint32_t postShift);\n\n\n  /**\n   * @brief Processing function for Q15 LMS filter.\n   * @param[in]  S          points to an instance of the Q15 LMS filter structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[in]  pRef       points to the block of reference data.\n   * @param[out] pOut       points to the block of output data.\n   * @param[out] pErr       points to the block of error data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_lms_q15(\n  const arm_lms_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pRef,\n  q15_t * pOut,\n  q15_t * pErr,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Instance structure for the Q31 LMS filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;    /**< number of coefficients in the filter. */\n    q31_t *pState;       /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n    q31_t *pCoeffs;      /**< points to the coefficient array. The array is of length numTaps. */\n    q31_t mu;            /**< step size that controls filter coefficient updates. */\n    uint32_t postShift;  /**< bit shift applied to coefficients. */\n  } arm_lms_instance_q31;\n\n\n  /**\n   * @brief Processing function for Q31 LMS filter.\n   * @param[in]  S          points to an instance of the Q15 LMS filter structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[in]  pRef       points to the block of reference data.\n   * @param[out] pOut       points to the block of output data.\n   * @param[out] pErr       points to the block of error data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_lms_q31(\n  const arm_lms_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pRef,\n  q31_t * pOut,\n  q31_t * pErr,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Initialization function for Q31 LMS filter.\n   * @param[in] S          points to an instance of the Q31 LMS filter structure.\n   * @param[in] numTaps    number of filter coefficients.\n   * @param[in] pCoeffs    points to coefficient buffer.\n   * @param[in] pState     points to state buffer.\n   * @param[in] mu         step size that controls filter coefficient updates.\n   * @param[in] blockSize  number of samples to process.\n   * @param[in] postShift  bit shift applied to coefficients.\n   */\n  void arm_lms_init_q31(\n  arm_lms_instance_q31 * S,\n  uint16_t numTaps,\n  q31_t * pCoeffs,\n  q31_t * pState,\n  q31_t mu,\n  uint32_t blockSize,\n  uint32_t postShift);\n\n\n  /**\n   * @brief Instance structure for the floating-point normalized LMS filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;     /**< number of coefficients in the filter. */\n    float32_t *pState;    /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n    float32_t *pCoeffs;   /**< points to the coefficient array. The array is of length numTaps. */\n    float32_t mu;         /**< step size that control filter coefficient updates. */\n    float32_t energy;     /**< saves previous frame energy. */\n    float32_t x0;         /**< saves previous input sample. */\n  } arm_lms_norm_instance_f32;\n\n\n  /**\n   * @brief Processing function for floating-point normalized LMS filter.\n   * @param[in]  S          points to an instance of the floating-point normalized LMS filter structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[in]  pRef       points to the block of reference data.\n   * @param[out] pOut       points to the block of output data.\n   * @param[out] pErr       points to the block of error data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_lms_norm_f32(\n  arm_lms_norm_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pRef,\n  float32_t * pOut,\n  float32_t * pErr,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Initialization function for floating-point normalized LMS filter.\n   * @param[in] S          points to an instance of the floating-point LMS filter structure.\n   * @param[in] numTaps    number of filter coefficients.\n   * @param[in] pCoeffs    points to coefficient buffer.\n   * @param[in] pState     points to state buffer.\n   * @param[in] mu         step size that controls filter coefficient updates.\n   * @param[in] blockSize  number of samples to process.\n   */\n  void arm_lms_norm_init_f32(\n  arm_lms_norm_instance_f32 * S,\n  uint16_t numTaps,\n  float32_t * pCoeffs,\n  float32_t * pState,\n  float32_t mu,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Instance structure for the Q31 normalized LMS filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;     /**< number of coefficients in the filter. */\n    q31_t *pState;        /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n    q31_t *pCoeffs;       /**< points to the coefficient array. The array is of length numTaps. */\n    q31_t mu;             /**< step size that controls filter coefficient updates. */\n    uint8_t postShift;    /**< bit shift applied to coefficients. */\n    q31_t *recipTable;    /**< points to the reciprocal initial value table. */\n    q31_t energy;         /**< saves previous frame energy. */\n    q31_t x0;             /**< saves previous input sample. */\n  } arm_lms_norm_instance_q31;\n\n\n  /**\n   * @brief Processing function for Q31 normalized LMS filter.\n   * @param[in]  S          points to an instance of the Q31 normalized LMS filter structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[in]  pRef       points to the block of reference data.\n   * @param[out] pOut       points to the block of output data.\n   * @param[out] pErr       points to the block of error data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_lms_norm_q31(\n  arm_lms_norm_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pRef,\n  q31_t * pOut,\n  q31_t * pErr,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Initialization function for Q31 normalized LMS filter.\n   * @param[in] S          points to an instance of the Q31 normalized LMS filter structure.\n   * @param[in] numTaps    number of filter coefficients.\n   * @param[in] pCoeffs    points to coefficient buffer.\n   * @param[in] pState     points to state buffer.\n   * @param[in] mu         step size that controls filter coefficient updates.\n   * @param[in] blockSize  number of samples to process.\n   * @param[in] postShift  bit shift applied to coefficients.\n   */\n  void arm_lms_norm_init_q31(\n  arm_lms_norm_instance_q31 * S,\n  uint16_t numTaps,\n  q31_t * pCoeffs,\n  q31_t * pState,\n  q31_t mu,\n  uint32_t blockSize,\n  uint8_t postShift);\n\n\n  /**\n   * @brief Instance structure for the Q15 normalized LMS filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;     /**< Number of coefficients in the filter. */\n    q15_t *pState;        /**< points to the state variable array. The array is of length numTaps+blockSize-1. */\n    q15_t *pCoeffs;       /**< points to the coefficient array. The array is of length numTaps. */\n    q15_t mu;             /**< step size that controls filter coefficient updates. */\n    uint8_t postShift;    /**< bit shift applied to coefficients. */\n    q15_t *recipTable;    /**< Points to the reciprocal initial value table. */\n    q15_t energy;         /**< saves previous frame energy. */\n    q15_t x0;             /**< saves previous input sample. */\n  } arm_lms_norm_instance_q15;\n\n\n  /**\n   * @brief Processing function for Q15 normalized LMS filter.\n   * @param[in]  S          points to an instance of the Q15 normalized LMS filter structure.\n   * @param[in]  pSrc       points to the block of input data.\n   * @param[in]  pRef       points to the block of reference data.\n   * @param[out] pOut       points to the block of output data.\n   * @param[out] pErr       points to the block of error data.\n   * @param[in]  blockSize  number of samples to process.\n   */\n  void arm_lms_norm_q15(\n  arm_lms_norm_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pRef,\n  q15_t * pOut,\n  q15_t * pErr,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Initialization function for Q15 normalized LMS filter.\n   * @param[in] S          points to an instance of the Q15 normalized LMS filter structure.\n   * @param[in] numTaps    number of filter coefficients.\n   * @param[in] pCoeffs    points to coefficient buffer.\n   * @param[in] pState     points to state buffer.\n   * @param[in] mu         step size that controls filter coefficient updates.\n   * @param[in] blockSize  number of samples to process.\n   * @param[in] postShift  bit shift applied to coefficients.\n   */\n  void arm_lms_norm_init_q15(\n  arm_lms_norm_instance_q15 * S,\n  uint16_t numTaps,\n  q15_t * pCoeffs,\n  q15_t * pState,\n  q15_t mu,\n  uint32_t blockSize,\n  uint8_t postShift);\n\n\n  /**\n   * @brief Correlation of floating-point sequences.\n   * @param[in]  pSrcA    points to the first input sequence.\n   * @param[in]  srcALen  length of the first input sequence.\n   * @param[in]  pSrcB    points to the second input sequence.\n   * @param[in]  srcBLen  length of the second input sequence.\n   * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.\n   */\n  void arm_correlate_f32(\n  float32_t * pSrcA,\n  uint32_t srcALen,\n  float32_t * pSrcB,\n  uint32_t srcBLen,\n  float32_t * pDst);\n\n\n   /**\n   * @brief Correlation of Q15 sequences\n   * @param[in]  pSrcA     points to the first input sequence.\n   * @param[in]  srcALen   length of the first input sequence.\n   * @param[in]  pSrcB     points to the second input sequence.\n   * @param[in]  srcBLen   length of the second input sequence.\n   * @param[out] pDst      points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.\n   * @param[in]  pScratch  points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.\n   */\n  void arm_correlate_opt_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst,\n  q15_t * pScratch);\n\n\n  /**\n   * @brief Correlation of Q15 sequences.\n   * @param[in]  pSrcA    points to the first input sequence.\n   * @param[in]  srcALen  length of the first input sequence.\n   * @param[in]  pSrcB    points to the second input sequence.\n   * @param[in]  srcBLen  length of the second input sequence.\n   * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.\n   */\n\n  void arm_correlate_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst);\n\n\n  /**\n   * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4.\n   * @param[in]  pSrcA    points to the first input sequence.\n   * @param[in]  srcALen  length of the first input sequence.\n   * @param[in]  pSrcB    points to the second input sequence.\n   * @param[in]  srcBLen  length of the second input sequence.\n   * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.\n   */\n\n  void arm_correlate_fast_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst);\n\n\n  /**\n   * @brief Correlation of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4.\n   * @param[in]  pSrcA     points to the first input sequence.\n   * @param[in]  srcALen   length of the first input sequence.\n   * @param[in]  pSrcB     points to the second input sequence.\n   * @param[in]  srcBLen   length of the second input sequence.\n   * @param[out] pDst      points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.\n   * @param[in]  pScratch  points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.\n   */\n  void arm_correlate_fast_opt_q15(\n  q15_t * pSrcA,\n  uint32_t srcALen,\n  q15_t * pSrcB,\n  uint32_t srcBLen,\n  q15_t * pDst,\n  q15_t * pScratch);\n\n\n  /**\n   * @brief Correlation of Q31 sequences.\n   * @param[in]  pSrcA    points to the first input sequence.\n   * @param[in]  srcALen  length of the first input sequence.\n   * @param[in]  pSrcB    points to the second input sequence.\n   * @param[in]  srcBLen  length of the second input sequence.\n   * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.\n   */\n  void arm_correlate_q31(\n  q31_t * pSrcA,\n  uint32_t srcALen,\n  q31_t * pSrcB,\n  uint32_t srcBLen,\n  q31_t * pDst);\n\n\n  /**\n   * @brief Correlation of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4\n   * @param[in]  pSrcA    points to the first input sequence.\n   * @param[in]  srcALen  length of the first input sequence.\n   * @param[in]  pSrcB    points to the second input sequence.\n   * @param[in]  srcBLen  length of the second input sequence.\n   * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.\n   */\n  void arm_correlate_fast_q31(\n  q31_t * pSrcA,\n  uint32_t srcALen,\n  q31_t * pSrcB,\n  uint32_t srcBLen,\n  q31_t * pDst);\n\n\n /**\n   * @brief Correlation of Q7 sequences.\n   * @param[in]  pSrcA      points to the first input sequence.\n   * @param[in]  srcALen    length of the first input sequence.\n   * @param[in]  pSrcB      points to the second input sequence.\n   * @param[in]  srcBLen    length of the second input sequence.\n   * @param[out] pDst       points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.\n   * @param[in]  pScratch1  points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2.\n   * @param[in]  pScratch2  points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen).\n   */\n  void arm_correlate_opt_q7(\n  q7_t * pSrcA,\n  uint32_t srcALen,\n  q7_t * pSrcB,\n  uint32_t srcBLen,\n  q7_t * pDst,\n  q15_t * pScratch1,\n  q15_t * pScratch2);\n\n\n  /**\n   * @brief Correlation of Q7 sequences.\n   * @param[in]  pSrcA    points to the first input sequence.\n   * @param[in]  srcALen  length of the first input sequence.\n   * @param[in]  pSrcB    points to the second input sequence.\n   * @param[in]  srcBLen  length of the second input sequence.\n   * @param[out] pDst     points to the block of output data  Length 2 * max(srcALen, srcBLen) - 1.\n   */\n  void arm_correlate_q7(\n  q7_t * pSrcA,\n  uint32_t srcALen,\n  q7_t * pSrcB,\n  uint32_t srcBLen,\n  q7_t * pDst);\n\n\n  /**\n   * @brief Instance structure for the floating-point sparse FIR filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;             /**< number of coefficients in the filter. */\n    uint16_t stateIndex;          /**< state buffer index.  Points to the oldest sample in the state buffer. */\n    float32_t *pState;            /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */\n    float32_t *pCoeffs;           /**< points to the coefficient array. The array is of length numTaps.*/\n    uint16_t maxDelay;            /**< maximum offset specified by the pTapDelay array. */\n    int32_t *pTapDelay;           /**< points to the array of delay values.  The array is of length numTaps. */\n  } arm_fir_sparse_instance_f32;\n\n  /**\n   * @brief Instance structure for the Q31 sparse FIR filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;             /**< number of coefficients in the filter. */\n    uint16_t stateIndex;          /**< state buffer index.  Points to the oldest sample in the state buffer. */\n    q31_t *pState;                /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */\n    q31_t *pCoeffs;               /**< points to the coefficient array. The array is of length numTaps.*/\n    uint16_t maxDelay;            /**< maximum offset specified by the pTapDelay array. */\n    int32_t *pTapDelay;           /**< points to the array of delay values.  The array is of length numTaps. */\n  } arm_fir_sparse_instance_q31;\n\n  /**\n   * @brief Instance structure for the Q15 sparse FIR filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;             /**< number of coefficients in the filter. */\n    uint16_t stateIndex;          /**< state buffer index.  Points to the oldest sample in the state buffer. */\n    q15_t *pState;                /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */\n    q15_t *pCoeffs;               /**< points to the coefficient array. The array is of length numTaps.*/\n    uint16_t maxDelay;            /**< maximum offset specified by the pTapDelay array. */\n    int32_t *pTapDelay;           /**< points to the array of delay values.  The array is of length numTaps. */\n  } arm_fir_sparse_instance_q15;\n\n  /**\n   * @brief Instance structure for the Q7 sparse FIR filter.\n   */\n  typedef struct\n  {\n    uint16_t numTaps;             /**< number of coefficients in the filter. */\n    uint16_t stateIndex;          /**< state buffer index.  Points to the oldest sample in the state buffer. */\n    q7_t *pState;                 /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */\n    q7_t *pCoeffs;                /**< points to the coefficient array. The array is of length numTaps.*/\n    uint16_t maxDelay;            /**< maximum offset specified by the pTapDelay array. */\n    int32_t *pTapDelay;           /**< points to the array of delay values.  The array is of length numTaps. */\n  } arm_fir_sparse_instance_q7;\n\n\n  /**\n   * @brief Processing function for the floating-point sparse FIR filter.\n   * @param[in]  S           points to an instance of the floating-point sparse FIR structure.\n   * @param[in]  pSrc        points to the block of input data.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  pScratchIn  points to a temporary buffer of size blockSize.\n   * @param[in]  blockSize   number of input samples to process per call.\n   */\n  void arm_fir_sparse_f32(\n  arm_fir_sparse_instance_f32 * S,\n  float32_t * pSrc,\n  float32_t * pDst,\n  float32_t * pScratchIn,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the floating-point sparse FIR filter.\n   * @param[in,out] S          points to an instance of the floating-point sparse FIR structure.\n   * @param[in]     numTaps    number of nonzero coefficients in the filter.\n   * @param[in]     pCoeffs    points to the array of filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     pTapDelay  points to the array of offset times.\n   * @param[in]     maxDelay   maximum offset time supported.\n   * @param[in]     blockSize  number of samples that will be processed per block.\n   */\n  void arm_fir_sparse_init_f32(\n  arm_fir_sparse_instance_f32 * S,\n  uint16_t numTaps,\n  float32_t * pCoeffs,\n  float32_t * pState,\n  int32_t * pTapDelay,\n  uint16_t maxDelay,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q31 sparse FIR filter.\n   * @param[in]  S           points to an instance of the Q31 sparse FIR structure.\n   * @param[in]  pSrc        points to the block of input data.\n   * @param[out] pDst        points to the block of output data\n   * @param[in]  pScratchIn  points to a temporary buffer of size blockSize.\n   * @param[in]  blockSize   number of input samples to process per call.\n   */\n  void arm_fir_sparse_q31(\n  arm_fir_sparse_instance_q31 * S,\n  q31_t * pSrc,\n  q31_t * pDst,\n  q31_t * pScratchIn,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q31 sparse FIR filter.\n   * @param[in,out] S          points to an instance of the Q31 sparse FIR structure.\n   * @param[in]     numTaps    number of nonzero coefficients in the filter.\n   * @param[in]     pCoeffs    points to the array of filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     pTapDelay  points to the array of offset times.\n   * @param[in]     maxDelay   maximum offset time supported.\n   * @param[in]     blockSize  number of samples that will be processed per block.\n   */\n  void arm_fir_sparse_init_q31(\n  arm_fir_sparse_instance_q31 * S,\n  uint16_t numTaps,\n  q31_t * pCoeffs,\n  q31_t * pState,\n  int32_t * pTapDelay,\n  uint16_t maxDelay,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q15 sparse FIR filter.\n   * @param[in]  S            points to an instance of the Q15 sparse FIR structure.\n   * @param[in]  pSrc         points to the block of input data.\n   * @param[out] pDst         points to the block of output data\n   * @param[in]  pScratchIn   points to a temporary buffer of size blockSize.\n   * @param[in]  pScratchOut  points to a temporary buffer of size blockSize.\n   * @param[in]  blockSize    number of input samples to process per call.\n   */\n  void arm_fir_sparse_q15(\n  arm_fir_sparse_instance_q15 * S,\n  q15_t * pSrc,\n  q15_t * pDst,\n  q15_t * pScratchIn,\n  q31_t * pScratchOut,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q15 sparse FIR filter.\n   * @param[in,out] S          points to an instance of the Q15 sparse FIR structure.\n   * @param[in]     numTaps    number of nonzero coefficients in the filter.\n   * @param[in]     pCoeffs    points to the array of filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     pTapDelay  points to the array of offset times.\n   * @param[in]     maxDelay   maximum offset time supported.\n   * @param[in]     blockSize  number of samples that will be processed per block.\n   */\n  void arm_fir_sparse_init_q15(\n  arm_fir_sparse_instance_q15 * S,\n  uint16_t numTaps,\n  q15_t * pCoeffs,\n  q15_t * pState,\n  int32_t * pTapDelay,\n  uint16_t maxDelay,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Processing function for the Q7 sparse FIR filter.\n   * @param[in]  S            points to an instance of the Q7 sparse FIR structure.\n   * @param[in]  pSrc         points to the block of input data.\n   * @param[out] pDst         points to the block of output data\n   * @param[in]  pScratchIn   points to a temporary buffer of size blockSize.\n   * @param[in]  pScratchOut  points to a temporary buffer of size blockSize.\n   * @param[in]  blockSize    number of input samples to process per call.\n   */\n  void arm_fir_sparse_q7(\n  arm_fir_sparse_instance_q7 * S,\n  q7_t * pSrc,\n  q7_t * pDst,\n  q7_t * pScratchIn,\n  q31_t * pScratchOut,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Initialization function for the Q7 sparse FIR filter.\n   * @param[in,out] S          points to an instance of the Q7 sparse FIR structure.\n   * @param[in]     numTaps    number of nonzero coefficients in the filter.\n   * @param[in]     pCoeffs    points to the array of filter coefficients.\n   * @param[in]     pState     points to the state buffer.\n   * @param[in]     pTapDelay  points to the array of offset times.\n   * @param[in]     maxDelay   maximum offset time supported.\n   * @param[in]     blockSize  number of samples that will be processed per block.\n   */\n  void arm_fir_sparse_init_q7(\n  arm_fir_sparse_instance_q7 * S,\n  uint16_t numTaps,\n  q7_t * pCoeffs,\n  q7_t * pState,\n  int32_t * pTapDelay,\n  uint16_t maxDelay,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Floating-point sin_cos function.\n   * @param[in]  theta   input value in degrees\n   * @param[out] pSinVal  points to the processed sine output.\n   * @param[out] pCosVal  points to the processed cos output.\n   */\n  void arm_sin_cos_f32(\n  float32_t theta,\n  float32_t * pSinVal,\n  float32_t * pCosVal);\n\n\n  /**\n   * @brief  Q31 sin_cos function.\n   * @param[in]  theta    scaled input value in degrees\n   * @param[out] pSinVal  points to the processed sine output.\n   * @param[out] pCosVal  points to the processed cosine output.\n   */\n  void arm_sin_cos_q31(\n  q31_t theta,\n  q31_t * pSinVal,\n  q31_t * pCosVal);\n\n\n  /**\n   * @brief  Floating-point complex conjugate.\n   * @param[in]  pSrc        points to the input vector\n   * @param[out] pDst        points to the output vector\n   * @param[in]  numSamples  number of complex samples in each vector\n   */\n  void arm_cmplx_conj_f32(\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t numSamples);\n\n  /**\n   * @brief  Q31 complex conjugate.\n   * @param[in]  pSrc        points to the input vector\n   * @param[out] pDst        points to the output vector\n   * @param[in]  numSamples  number of complex samples in each vector\n   */\n  void arm_cmplx_conj_q31(\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Q15 complex conjugate.\n   * @param[in]  pSrc        points to the input vector\n   * @param[out] pDst        points to the output vector\n   * @param[in]  numSamples  number of complex samples in each vector\n   */\n  void arm_cmplx_conj_q15(\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Floating-point complex magnitude squared\n   * @param[in]  pSrc        points to the complex input vector\n   * @param[out] pDst        points to the real output vector\n   * @param[in]  numSamples  number of complex samples in the input vector\n   */\n  void arm_cmplx_mag_squared_f32(\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Q31 complex magnitude squared\n   * @param[in]  pSrc        points to the complex input vector\n   * @param[out] pDst        points to the real output vector\n   * @param[in]  numSamples  number of complex samples in the input vector\n   */\n  void arm_cmplx_mag_squared_q31(\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Q15 complex magnitude squared\n   * @param[in]  pSrc        points to the complex input vector\n   * @param[out] pDst        points to the real output vector\n   * @param[in]  numSamples  number of complex samples in the input vector\n   */\n  void arm_cmplx_mag_squared_q15(\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t numSamples);\n\n\n /**\n   * @ingroup groupController\n   */\n\n  /**\n   * @defgroup PID PID Motor Control\n   *\n   * A Proportional Integral Derivative (PID) controller is a generic feedback control\n   * loop mechanism widely used in industrial control systems.\n   * A PID controller is the most commonly used type of feedback controller.\n   *\n   * This set of functions implements (PID) controllers\n   * for Q15, Q31, and floating-point data types.  The functions operate on a single sample\n   * of data and each call to the function returns a single processed value.\n   * <code>S</code> points to an instance of the PID control data structure.  <code>in</code>\n   * is the input sample value. The functions return the output value.\n   *\n   * \\par Algorithm:\n   * <pre>\n   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]\n   *    A0 = Kp + Ki + Kd\n   *    A1 = (-Kp ) - (2 * Kd )\n   *    A2 = Kd  </pre>\n   *\n   * \\par\n   * where \\c Kp is proportional constant, \\c Ki is Integral constant and \\c Kd is Derivative constant\n   *\n   * \\par\n   * \\image html PID.gif \"Proportional Integral Derivative Controller\"\n   *\n   * \\par\n   * The PID controller calculates an \"error\" value as the difference between\n   * the measured output and the reference input.\n   * The controller attempts to minimize the error by adjusting the process control inputs.\n   * The proportional value determines the reaction to the current error,\n   * the integral value determines the reaction based on the sum of recent errors,\n   * and the derivative value determines the reaction based on the rate at which the error has been changing.\n   *\n   * \\par Instance Structure\n   * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure.\n   * A separate instance structure must be defined for each PID Controller.\n   * There are separate instance structure declarations for each of the 3 supported data types.\n   *\n   * \\par Reset Functions\n   * There is also an associated reset function for each data type which clears the state array.\n   *\n   * \\par Initialization Functions\n   * There is also an associated initialization function for each data type.\n   * The initialization function performs the following operations:\n   * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains.\n   * - Zeros out the values in the state buffer.\n   *\n   * \\par\n   * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function.\n   *\n   * \\par Fixed-Point Behavior\n   * Care must be taken when using the fixed-point versions of the PID Controller functions.\n   * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered.\n   * Refer to the function specific documentation below for usage guidelines.\n   */\n\n  /**\n   * @addtogroup PID\n   * @{\n   */\n\n  /**\n   * @brief  Process function for the floating-point PID Control.\n   * @param[in,out] S   is an instance of the floating-point PID Control structure\n   * @param[in]     in  input sample to process\n   * @return out processed output sample.\n   */\n  CMSIS_INLINE __STATIC_INLINE float32_t arm_pid_f32(\n  arm_pid_instance_f32 * S,\n  float32_t in)\n  {\n    float32_t out;\n\n    /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]  */\n    out = (S->A0 * in) +\n      (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]);\n\n    /* Update state */\n    S->state[1] = S->state[0];\n    S->state[0] = in;\n    S->state[2] = out;\n\n    /* return to application */\n    return (out);\n\n  }\n\n  /**\n   * @brief  Process function for the Q31 PID Control.\n   * @param[in,out] S  points to an instance of the Q31 PID Control structure\n   * @param[in]     in  input sample to process\n   * @return out processed output sample.\n   *\n   * <b>Scaling and Overflow Behavior:</b>\n   * \\par\n   * The function is implemented using an internal 64-bit accumulator.\n   * The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit.\n   * Thus, if the accumulator result overflows it wraps around rather than clip.\n   * In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions.\n   * After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format.\n   */\n  CMSIS_INLINE __STATIC_INLINE q31_t arm_pid_q31(\n  arm_pid_instance_q31 * S,\n  q31_t in)\n  {\n    q63_t acc;\n    q31_t out;\n\n    /* acc = A0 * x[n]  */\n    acc = (q63_t) S->A0 * in;\n\n    /* acc += A1 * x[n-1] */\n    acc += (q63_t) S->A1 * S->state[0];\n\n    /* acc += A2 * x[n-2]  */\n    acc += (q63_t) S->A2 * S->state[1];\n\n    /* convert output to 1.31 format to add y[n-1] */\n    out = (q31_t) (acc >> 31u);\n\n    /* out += y[n-1] */\n    out += S->state[2];\n\n    /* Update state */\n    S->state[1] = S->state[0];\n    S->state[0] = in;\n    S->state[2] = out;\n\n    /* return to application */\n    return (out);\n  }\n\n\n  /**\n   * @brief  Process function for the Q15 PID Control.\n   * @param[in,out] S   points to an instance of the Q15 PID Control structure\n   * @param[in]     in  input sample to process\n   * @return out processed output sample.\n   *\n   * <b>Scaling and Overflow Behavior:</b>\n   * \\par\n   * The function is implemented using a 64-bit internal accumulator.\n   * Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result.\n   * The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format.\n   * There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved.\n   * After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits.\n   * Lastly, the accumulator is saturated to yield a result in 1.15 format.\n   */\n  CMSIS_INLINE __STATIC_INLINE q15_t arm_pid_q15(\n  arm_pid_instance_q15 * S,\n  q15_t in)\n  {\n    q63_t acc;\n    q15_t out;\n\n#if defined (ARM_MATH_DSP)\n    __SIMD32_TYPE *vstate;\n\n    /* Implementation of PID controller */\n\n    /* acc = A0 * x[n]  */\n    acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in);\n\n    /* acc += A1 * x[n-1] + A2 * x[n-2]  */\n    vstate = __SIMD32_CONST(S->state);\n    acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)*vstate, (uint64_t)acc);\n#else\n    /* acc = A0 * x[n]  */\n    acc = ((q31_t) S->A0) * in;\n\n    /* acc += A1 * x[n-1] + A2 * x[n-2]  */\n    acc += (q31_t) S->A1 * S->state[0];\n    acc += (q31_t) S->A2 * S->state[1];\n#endif\n\n    /* acc += y[n-1] */\n    acc += (q31_t) S->state[2] << 15;\n\n    /* saturate the output */\n    out = (q15_t) (__SSAT((acc >> 15), 16));\n\n    /* Update state */\n    S->state[1] = S->state[0];\n    S->state[0] = in;\n    S->state[2] = out;\n\n    /* return to application */\n    return (out);\n  }\n\n  /**\n   * @} end of PID group\n   */\n\n\n  /**\n   * @brief Floating-point matrix inverse.\n   * @param[in]  src   points to the instance of the input floating-point matrix structure.\n   * @param[out] dst   points to the instance of the output floating-point matrix structure.\n   * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.\n   * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR.\n   */\n  arm_status arm_mat_inverse_f32(\n  const arm_matrix_instance_f32 * src,\n  arm_matrix_instance_f32 * dst);\n\n\n  /**\n   * @brief Floating-point matrix inverse.\n   * @param[in]  src   points to the instance of the input floating-point matrix structure.\n   * @param[out] dst   points to the instance of the output floating-point matrix structure.\n   * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match.\n   * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR.\n   */\n  arm_status arm_mat_inverse_f64(\n  const arm_matrix_instance_f64 * src,\n  arm_matrix_instance_f64 * dst);\n\n\n\n  /**\n   * @ingroup groupController\n   */\n\n  /**\n   * @defgroup clarke Vector Clarke Transform\n   * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector.\n   * Generally the Clarke transform uses three-phase currents <code>Ia, Ib and Ic</code> to calculate currents\n   * in the two-phase orthogonal stator axis <code>Ialpha</code> and <code>Ibeta</code>.\n   * When <code>Ialpha</code> is superposed with <code>Ia</code> as shown in the figure below\n   * \\image html clarke.gif Stator current space vector and its components in (a,b).\n   * and <code>Ia + Ib + Ic = 0</code>, in this condition <code>Ialpha</code> and <code>Ibeta</code>\n   * can be calculated using only <code>Ia</code> and <code>Ib</code>.\n   *\n   * The function operates on a single sample of data and each call to the function returns the processed output.\n   * The library provides separate functions for Q31 and floating-point data types.\n   * \\par Algorithm\n   * \\image html clarkeFormula.gif\n   * where <code>Ia</code> and <code>Ib</code> are the instantaneous stator phases and\n   * <code>pIalpha</code> and <code>pIbeta</code> are the two coordinates of time invariant vector.\n   * \\par Fixed-Point Behavior\n   * Care must be taken when using the Q31 version of the Clarke transform.\n   * In particular, the overflow and saturation behavior of the accumulator used must be considered.\n   * Refer to the function specific documentation below for usage guidelines.\n   */\n\n  /**\n   * @addtogroup clarke\n   * @{\n   */\n\n  /**\n   *\n   * @brief  Floating-point Clarke transform\n   * @param[in]  Ia       input three-phase coordinate <code>a</code>\n   * @param[in]  Ib       input three-phase coordinate <code>b</code>\n   * @param[out] pIalpha  points to output two-phase orthogonal vector axis alpha\n   * @param[out] pIbeta   points to output two-phase orthogonal vector axis beta\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_clarke_f32(\n  float32_t Ia,\n  float32_t Ib,\n  float32_t * pIalpha,\n  float32_t * pIbeta)\n  {\n    /* Calculate pIalpha using the equation, pIalpha = Ia */\n    *pIalpha = Ia;\n\n    /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */\n    *pIbeta = ((float32_t) 0.57735026919 * Ia + (float32_t) 1.15470053838 * Ib);\n  }\n\n\n  /**\n   * @brief  Clarke transform for Q31 version\n   * @param[in]  Ia       input three-phase coordinate <code>a</code>\n   * @param[in]  Ib       input three-phase coordinate <code>b</code>\n   * @param[out] pIalpha  points to output two-phase orthogonal vector axis alpha\n   * @param[out] pIbeta   points to output two-phase orthogonal vector axis beta\n   *\n   * <b>Scaling and Overflow Behavior:</b>\n   * \\par\n   * The function is implemented using an internal 32-bit accumulator.\n   * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.\n   * There is saturation on the addition, hence there is no risk of overflow.\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_clarke_q31(\n  q31_t Ia,\n  q31_t Ib,\n  q31_t * pIalpha,\n  q31_t * pIbeta)\n  {\n    q31_t product1, product2;                    /* Temporary variables used to store intermediate results */\n\n    /* Calculating pIalpha from Ia by equation pIalpha = Ia */\n    *pIalpha = Ia;\n\n    /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */\n    product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30);\n\n    /* Intermediate product is calculated by (2/sqrt(3) * Ib) */\n    product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30);\n\n    /* pIbeta is calculated by adding the intermediate products */\n    *pIbeta = __QADD(product1, product2);\n  }\n\n  /**\n   * @} end of clarke group\n   */\n\n  /**\n   * @brief  Converts the elements of the Q7 vector to Q31 vector.\n   * @param[in]  pSrc       input pointer\n   * @param[out] pDst       output pointer\n   * @param[in]  blockSize  number of samples to process\n   */\n  void arm_q7_to_q31(\n  q7_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n\n  /**\n   * @ingroup groupController\n   */\n\n  /**\n   * @defgroup inv_clarke Vector Inverse Clarke Transform\n   * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases.\n   *\n   * The function operates on a single sample of data and each call to the function returns the processed output.\n   * The library provides separate functions for Q31 and floating-point data types.\n   * \\par Algorithm\n   * \\image html clarkeInvFormula.gif\n   * where <code>pIa</code> and <code>pIb</code> are the instantaneous stator phases and\n   * <code>Ialpha</code> and <code>Ibeta</code> are the two coordinates of time invariant vector.\n   * \\par Fixed-Point Behavior\n   * Care must be taken when using the Q31 version of the Clarke transform.\n   * In particular, the overflow and saturation behavior of the accumulator used must be considered.\n   * Refer to the function specific documentation below for usage guidelines.\n   */\n\n  /**\n   * @addtogroup inv_clarke\n   * @{\n   */\n\n   /**\n   * @brief  Floating-point Inverse Clarke transform\n   * @param[in]  Ialpha  input two-phase orthogonal vector axis alpha\n   * @param[in]  Ibeta   input two-phase orthogonal vector axis beta\n   * @param[out] pIa     points to output three-phase coordinate <code>a</code>\n   * @param[out] pIb     points to output three-phase coordinate <code>b</code>\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_inv_clarke_f32(\n  float32_t Ialpha,\n  float32_t Ibeta,\n  float32_t * pIa,\n  float32_t * pIb)\n  {\n    /* Calculating pIa from Ialpha by equation pIa = Ialpha */\n    *pIa = Ialpha;\n\n    /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */\n    *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta;\n  }\n\n\n  /**\n   * @brief  Inverse Clarke transform for Q31 version\n   * @param[in]  Ialpha  input two-phase orthogonal vector axis alpha\n   * @param[in]  Ibeta   input two-phase orthogonal vector axis beta\n   * @param[out] pIa     points to output three-phase coordinate <code>a</code>\n   * @param[out] pIb     points to output three-phase coordinate <code>b</code>\n   *\n   * <b>Scaling and Overflow Behavior:</b>\n   * \\par\n   * The function is implemented using an internal 32-bit accumulator.\n   * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.\n   * There is saturation on the subtraction, hence there is no risk of overflow.\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_inv_clarke_q31(\n  q31_t Ialpha,\n  q31_t Ibeta,\n  q31_t * pIa,\n  q31_t * pIb)\n  {\n    q31_t product1, product2;                    /* Temporary variables used to store intermediate results */\n\n    /* Calculating pIa from Ialpha by equation pIa = Ialpha */\n    *pIa = Ialpha;\n\n    /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */\n    product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31);\n\n    /* Intermediate product is calculated by (1/sqrt(3) * pIb) */\n    product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31);\n\n    /* pIb is calculated by subtracting the products */\n    *pIb = __QSUB(product2, product1);\n  }\n\n  /**\n   * @} end of inv_clarke group\n   */\n\n  /**\n   * @brief  Converts the elements of the Q7 vector to Q15 vector.\n   * @param[in]  pSrc       input pointer\n   * @param[out] pDst       output pointer\n   * @param[in]  blockSize  number of samples to process\n   */\n  void arm_q7_to_q15(\n  q7_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n\n  /**\n   * @ingroup groupController\n   */\n\n  /**\n   * @defgroup park Vector Park Transform\n   *\n   * Forward Park transform converts the input two-coordinate vector to flux and torque components.\n   * The Park transform can be used to realize the transformation of the <code>Ialpha</code> and the <code>Ibeta</code> currents\n   * from the stationary to the moving reference frame and control the spatial relationship between\n   * the stator vector current and rotor flux vector.\n   * If we consider the d axis aligned with the rotor flux, the diagram below shows the\n   * current vector and the relationship from the two reference frames:\n   * \\image html park.gif \"Stator current space vector and its component in (a,b) and in the d,q rotating reference frame\"\n   *\n   * The function operates on a single sample of data and each call to the function returns the processed output.\n   * The library provides separate functions for Q31 and floating-point data types.\n   * \\par Algorithm\n   * \\image html parkFormula.gif\n   * where <code>Ialpha</code> and <code>Ibeta</code> are the stator vector components,\n   * <code>pId</code> and <code>pIq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the\n   * cosine and sine values of theta (rotor flux position).\n   * \\par Fixed-Point Behavior\n   * Care must be taken when using the Q31 version of the Park transform.\n   * In particular, the overflow and saturation behavior of the accumulator used must be considered.\n   * Refer to the function specific documentation below for usage guidelines.\n   */\n\n  /**\n   * @addtogroup park\n   * @{\n   */\n\n  /**\n   * @brief Floating-point Park transform\n   * @param[in]  Ialpha  input two-phase vector coordinate alpha\n   * @param[in]  Ibeta   input two-phase vector coordinate beta\n   * @param[out] pId     points to output   rotor reference frame d\n   * @param[out] pIq     points to output   rotor reference frame q\n   * @param[in]  sinVal  sine value of rotation angle theta\n   * @param[in]  cosVal  cosine value of rotation angle theta\n   *\n   * The function implements the forward Park transform.\n   *\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_park_f32(\n  float32_t Ialpha,\n  float32_t Ibeta,\n  float32_t * pId,\n  float32_t * pIq,\n  float32_t sinVal,\n  float32_t cosVal)\n  {\n    /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */\n    *pId = Ialpha * cosVal + Ibeta * sinVal;\n\n    /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */\n    *pIq = -Ialpha * sinVal + Ibeta * cosVal;\n  }\n\n\n  /**\n   * @brief  Park transform for Q31 version\n   * @param[in]  Ialpha  input two-phase vector coordinate alpha\n   * @param[in]  Ibeta   input two-phase vector coordinate beta\n   * @param[out] pId     points to output rotor reference frame d\n   * @param[out] pIq     points to output rotor reference frame q\n   * @param[in]  sinVal  sine value of rotation angle theta\n   * @param[in]  cosVal  cosine value of rotation angle theta\n   *\n   * <b>Scaling and Overflow Behavior:</b>\n   * \\par\n   * The function is implemented using an internal 32-bit accumulator.\n   * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.\n   * There is saturation on the addition and subtraction, hence there is no risk of overflow.\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_park_q31(\n  q31_t Ialpha,\n  q31_t Ibeta,\n  q31_t * pId,\n  q31_t * pIq,\n  q31_t sinVal,\n  q31_t cosVal)\n  {\n    q31_t product1, product2;                    /* Temporary variables used to store intermediate results */\n    q31_t product3, product4;                    /* Temporary variables used to store intermediate results */\n\n    /* Intermediate product is calculated by (Ialpha * cosVal) */\n    product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31);\n\n    /* Intermediate product is calculated by (Ibeta * sinVal) */\n    product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31);\n\n\n    /* Intermediate product is calculated by (Ialpha * sinVal) */\n    product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31);\n\n    /* Intermediate product is calculated by (Ibeta * cosVal) */\n    product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31);\n\n    /* Calculate pId by adding the two intermediate products 1 and 2 */\n    *pId = __QADD(product1, product2);\n\n    /* Calculate pIq by subtracting the two intermediate products 3 from 4 */\n    *pIq = __QSUB(product4, product3);\n  }\n\n  /**\n   * @} end of park group\n   */\n\n  /**\n   * @brief  Converts the elements of the Q7 vector to floating-point vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[out] pDst       is output pointer\n   * @param[in]  blockSize  is the number of samples to process\n   */\n  void arm_q7_to_float(\n  q7_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @ingroup groupController\n   */\n\n  /**\n   * @defgroup inv_park Vector Inverse Park transform\n   * Inverse Park transform converts the input flux and torque components to two-coordinate vector.\n   *\n   * The function operates on a single sample of data and each call to the function returns the processed output.\n   * The library provides separate functions for Q31 and floating-point data types.\n   * \\par Algorithm\n   * \\image html parkInvFormula.gif\n   * where <code>pIalpha</code> and <code>pIbeta</code> are the stator vector components,\n   * <code>Id</code> and <code>Iq</code> are rotor vector components and <code>cosVal</code> and <code>sinVal</code> are the\n   * cosine and sine values of theta (rotor flux position).\n   * \\par Fixed-Point Behavior\n   * Care must be taken when using the Q31 version of the Park transform.\n   * In particular, the overflow and saturation behavior of the accumulator used must be considered.\n   * Refer to the function specific documentation below for usage guidelines.\n   */\n\n  /**\n   * @addtogroup inv_park\n   * @{\n   */\n\n   /**\n   * @brief  Floating-point Inverse Park transform\n   * @param[in]  Id       input coordinate of rotor reference frame d\n   * @param[in]  Iq       input coordinate of rotor reference frame q\n   * @param[out] pIalpha  points to output two-phase orthogonal vector axis alpha\n   * @param[out] pIbeta   points to output two-phase orthogonal vector axis beta\n   * @param[in]  sinVal   sine value of rotation angle theta\n   * @param[in]  cosVal   cosine value of rotation angle theta\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_inv_park_f32(\n  float32_t Id,\n  float32_t Iq,\n  float32_t * pIalpha,\n  float32_t * pIbeta,\n  float32_t sinVal,\n  float32_t cosVal)\n  {\n    /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */\n    *pIalpha = Id * cosVal - Iq * sinVal;\n\n    /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */\n    *pIbeta = Id * sinVal + Iq * cosVal;\n  }\n\n\n  /**\n   * @brief  Inverse Park transform for   Q31 version\n   * @param[in]  Id       input coordinate of rotor reference frame d\n   * @param[in]  Iq       input coordinate of rotor reference frame q\n   * @param[out] pIalpha  points to output two-phase orthogonal vector axis alpha\n   * @param[out] pIbeta   points to output two-phase orthogonal vector axis beta\n   * @param[in]  sinVal   sine value of rotation angle theta\n   * @param[in]  cosVal   cosine value of rotation angle theta\n   *\n   * <b>Scaling and Overflow Behavior:</b>\n   * \\par\n   * The function is implemented using an internal 32-bit accumulator.\n   * The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format.\n   * There is saturation on the addition, hence there is no risk of overflow.\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_inv_park_q31(\n  q31_t Id,\n  q31_t Iq,\n  q31_t * pIalpha,\n  q31_t * pIbeta,\n  q31_t sinVal,\n  q31_t cosVal)\n  {\n    q31_t product1, product2;                    /* Temporary variables used to store intermediate results */\n    q31_t product3, product4;                    /* Temporary variables used to store intermediate results */\n\n    /* Intermediate product is calculated by (Id * cosVal) */\n    product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31);\n\n    /* Intermediate product is calculated by (Iq * sinVal) */\n    product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31);\n\n\n    /* Intermediate product is calculated by (Id * sinVal) */\n    product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31);\n\n    /* Intermediate product is calculated by (Iq * cosVal) */\n    product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31);\n\n    /* Calculate pIalpha by using the two intermediate products 1 and 2 */\n    *pIalpha = __QSUB(product1, product2);\n\n    /* Calculate pIbeta by using the two intermediate products 3 and 4 */\n    *pIbeta = __QADD(product4, product3);\n  }\n\n  /**\n   * @} end of Inverse park group\n   */\n\n\n  /**\n   * @brief  Converts the elements of the Q31 vector to floating-point vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[out] pDst       is output pointer\n   * @param[in]  blockSize  is the number of samples to process\n   */\n  void arm_q31_to_float(\n  q31_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n  /**\n   * @ingroup groupInterpolation\n   */\n\n  /**\n   * @defgroup LinearInterpolate Linear Interpolation\n   *\n   * Linear interpolation is a method of curve fitting using linear polynomials.\n   * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line\n   *\n   * \\par\n   * \\image html LinearInterp.gif \"Linear interpolation\"\n   *\n   * \\par\n   * A  Linear Interpolate function calculates an output value(y), for the input(x)\n   * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values)\n   *\n   * \\par Algorithm:\n   * <pre>\n   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))\n   *       where x0, x1 are nearest values of input x\n   *             y0, y1 are nearest values to output y\n   * </pre>\n   *\n   * \\par\n   * This set of functions implements Linear interpolation process\n   * for Q7, Q15, Q31, and floating-point data types.  The functions operate on a single\n   * sample of data and each call to the function returns a single processed value.\n   * <code>S</code> points to an instance of the Linear Interpolate function data structure.\n   * <code>x</code> is the input sample value. The functions returns the output value.\n   *\n   * \\par\n   * if x is outside of the table boundary, Linear interpolation returns first value of the table\n   * if x is below input range and returns last value of table if x is above range.\n   */\n\n  /**\n   * @addtogroup LinearInterpolate\n   * @{\n   */\n\n  /**\n   * @brief  Process function for the floating-point Linear Interpolation Function.\n   * @param[in,out] S  is an instance of the floating-point Linear Interpolation structure\n   * @param[in]     x  input sample to process\n   * @return y processed output sample.\n   *\n   */\n  CMSIS_INLINE __STATIC_INLINE float32_t arm_linear_interp_f32(\n  arm_linear_interp_instance_f32 * S,\n  float32_t x)\n  {\n    float32_t y;\n    float32_t x0, x1;                            /* Nearest input values */\n    float32_t y0, y1;                            /* Nearest output values */\n    float32_t xSpacing = S->xSpacing;            /* spacing between input values */\n    int32_t i;                                   /* Index variable */\n    float32_t *pYData = S->pYData;               /* pointer to output table */\n\n    /* Calculation of index */\n    i = (int32_t) ((x - S->x1) / xSpacing);\n\n    if (i < 0)\n    {\n      /* Iniatilize output for below specified range as least output value of table */\n      y = pYData[0];\n    }\n    else if ((uint32_t)i >= S->nValues)\n    {\n      /* Iniatilize output for above specified range as last output value of table */\n      y = pYData[S->nValues - 1];\n    }\n    else\n    {\n      /* Calculation of nearest input values */\n      x0 = S->x1 +  i      * xSpacing;\n      x1 = S->x1 + (i + 1) * xSpacing;\n\n      /* Read of nearest output values */\n      y0 = pYData[i];\n      y1 = pYData[i + 1];\n\n      /* Calculation of output */\n      y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0));\n\n    }\n\n    /* returns output value */\n    return (y);\n  }\n\n\n   /**\n   *\n   * @brief  Process function for the Q31 Linear Interpolation Function.\n   * @param[in] pYData   pointer to Q31 Linear Interpolation table\n   * @param[in] x        input sample to process\n   * @param[in] nValues  number of table values\n   * @return y processed output sample.\n   *\n   * \\par\n   * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.\n   * This function can support maximum of table size 2^12.\n   *\n   */\n  CMSIS_INLINE __STATIC_INLINE q31_t arm_linear_interp_q31(\n  q31_t * pYData,\n  q31_t x,\n  uint32_t nValues)\n  {\n    q31_t y;                                     /* output */\n    q31_t y0, y1;                                /* Nearest output values */\n    q31_t fract;                                 /* fractional part */\n    int32_t index;                               /* Index to read nearest output values */\n\n    /* Input is in 12.20 format */\n    /* 12 bits for the table index */\n    /* Index value calculation */\n    index = ((x & (q31_t)0xFFF00000) >> 20);\n\n    if (index >= (int32_t)(nValues - 1))\n    {\n      return (pYData[nValues - 1]);\n    }\n    else if (index < 0)\n    {\n      return (pYData[0]);\n    }\n    else\n    {\n      /* 20 bits for the fractional part */\n      /* shift left by 11 to keep fract in 1.31 format */\n      fract = (x & 0x000FFFFF) << 11;\n\n      /* Read two nearest output values from the index in 1.31(q31) format */\n      y0 = pYData[index];\n      y1 = pYData[index + 1];\n\n      /* Calculation of y0 * (1-fract) and y is in 2.30 format */\n      y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32));\n\n      /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */\n      y += ((q31_t) (((q63_t) y1 * fract) >> 32));\n\n      /* Convert y to 1.31 format */\n      return (y << 1u);\n    }\n  }\n\n\n  /**\n   *\n   * @brief  Process function for the Q15 Linear Interpolation Function.\n   * @param[in] pYData   pointer to Q15 Linear Interpolation table\n   * @param[in] x        input sample to process\n   * @param[in] nValues  number of table values\n   * @return y processed output sample.\n   *\n   * \\par\n   * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.\n   * This function can support maximum of table size 2^12.\n   *\n   */\n  CMSIS_INLINE __STATIC_INLINE q15_t arm_linear_interp_q15(\n  q15_t * pYData,\n  q31_t x,\n  uint32_t nValues)\n  {\n    q63_t y;                                     /* output */\n    q15_t y0, y1;                                /* Nearest output values */\n    q31_t fract;                                 /* fractional part */\n    int32_t index;                               /* Index to read nearest output values */\n\n    /* Input is in 12.20 format */\n    /* 12 bits for the table index */\n    /* Index value calculation */\n    index = ((x & (int32_t)0xFFF00000) >> 20);\n\n    if (index >= (int32_t)(nValues - 1))\n    {\n      return (pYData[nValues - 1]);\n    }\n    else if (index < 0)\n    {\n      return (pYData[0]);\n    }\n    else\n    {\n      /* 20 bits for the fractional part */\n      /* fract is in 12.20 format */\n      fract = (x & 0x000FFFFF);\n\n      /* Read two nearest output values from the index */\n      y0 = pYData[index];\n      y1 = pYData[index + 1];\n\n      /* Calculation of y0 * (1-fract) and y is in 13.35 format */\n      y = ((q63_t) y0 * (0xFFFFF - fract));\n\n      /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */\n      y += ((q63_t) y1 * (fract));\n\n      /* convert y to 1.15 format */\n      return (q15_t) (y >> 20);\n    }\n  }\n\n\n  /**\n   *\n   * @brief  Process function for the Q7 Linear Interpolation Function.\n   * @param[in] pYData   pointer to Q7 Linear Interpolation table\n   * @param[in] x        input sample to process\n   * @param[in] nValues  number of table values\n   * @return y processed output sample.\n   *\n   * \\par\n   * Input sample <code>x</code> is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part.\n   * This function can support maximum of table size 2^12.\n   */\n  CMSIS_INLINE __STATIC_INLINE q7_t arm_linear_interp_q7(\n  q7_t * pYData,\n  q31_t x,\n  uint32_t nValues)\n  {\n    q31_t y;                                     /* output */\n    q7_t y0, y1;                                 /* Nearest output values */\n    q31_t fract;                                 /* fractional part */\n    uint32_t index;                              /* Index to read nearest output values */\n\n    /* Input is in 12.20 format */\n    /* 12 bits for the table index */\n    /* Index value calculation */\n    if (x < 0)\n    {\n      return (pYData[0]);\n    }\n    index = (x >> 20) & 0xfff;\n\n    if (index >= (nValues - 1))\n    {\n      return (pYData[nValues - 1]);\n    }\n    else\n    {\n      /* 20 bits for the fractional part */\n      /* fract is in 12.20 format */\n      fract = (x & 0x000FFFFF);\n\n      /* Read two nearest output values from the index and are in 1.7(q7) format */\n      y0 = pYData[index];\n      y1 = pYData[index + 1];\n\n      /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */\n      y = ((y0 * (0xFFFFF - fract)));\n\n      /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */\n      y += (y1 * fract);\n\n      /* convert y to 1.7(q7) format */\n      return (q7_t) (y >> 20);\n     }\n  }\n\n  /**\n   * @} end of LinearInterpolate group\n   */\n\n  /**\n   * @brief  Fast approximation to the trigonometric sine function for floating-point data.\n   * @param[in] x  input value in radians.\n   * @return  sin(x).\n   */\n  float32_t arm_sin_f32(\n  float32_t x);\n\n\n  /**\n   * @brief  Fast approximation to the trigonometric sine function for Q31 data.\n   * @param[in] x  Scaled input value in radians.\n   * @return  sin(x).\n   */\n  q31_t arm_sin_q31(\n  q31_t x);\n\n\n  /**\n   * @brief  Fast approximation to the trigonometric sine function for Q15 data.\n   * @param[in] x  Scaled input value in radians.\n   * @return  sin(x).\n   */\n  q15_t arm_sin_q15(\n  q15_t x);\n\n\n  /**\n   * @brief  Fast approximation to the trigonometric cosine function for floating-point data.\n   * @param[in] x  input value in radians.\n   * @return  cos(x).\n   */\n  float32_t arm_cos_f32(\n  float32_t x);\n\n\n  /**\n   * @brief Fast approximation to the trigonometric cosine function for Q31 data.\n   * @param[in] x  Scaled input value in radians.\n   * @return  cos(x).\n   */\n  q31_t arm_cos_q31(\n  q31_t x);\n\n\n  /**\n   * @brief  Fast approximation to the trigonometric cosine function for Q15 data.\n   * @param[in] x  Scaled input value in radians.\n   * @return  cos(x).\n   */\n  q15_t arm_cos_q15(\n  q15_t x);\n\n\n  /**\n   * @ingroup groupFastMath\n   */\n\n\n  /**\n   * @defgroup SQRT Square Root\n   *\n   * Computes the square root of a number.\n   * There are separate functions for Q15, Q31, and floating-point data types.\n   * The square root function is computed using the Newton-Raphson algorithm.\n   * This is an iterative algorithm of the form:\n   * <pre>\n   *      x1 = x0 - f(x0)/f'(x0)\n   * </pre>\n   * where <code>x1</code> is the current estimate,\n   * <code>x0</code> is the previous estimate, and\n   * <code>f'(x0)</code> is the derivative of <code>f()</code> evaluated at <code>x0</code>.\n   * For the square root function, the algorithm reduces to:\n   * <pre>\n   *     x0 = in/2                         [initial guess]\n   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]\n   * </pre>\n   */\n\n\n  /**\n   * @addtogroup SQRT\n   * @{\n   */\n\n  /**\n   * @brief  Floating-point square root function.\n   * @param[in]  in    input value.\n   * @param[out] pOut  square root of input value.\n   * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if\n   * <code>in</code> is negative value and returns zero output for negative values.\n   */\n  CMSIS_INLINE __STATIC_INLINE arm_status arm_sqrt_f32(\n  float32_t in,\n  float32_t * pOut)\n  {\n    if (in >= 0.0f)\n    {\n\n#if   (__FPU_USED == 1) && defined ( __CC_ARM   )\n      *pOut = __sqrtf(in);\n#elif (__FPU_USED == 1) && (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))\n      *pOut = __builtin_sqrtf(in);\n#elif (__FPU_USED == 1) && defined(__GNUC__)\n      *pOut = __builtin_sqrtf(in);\n#elif (__FPU_USED == 1) && defined ( __ICCARM__ ) && (__VER__ >= 6040000)\n      __ASM(\"VSQRT.F32 %0,%1\" : \"=t\"(*pOut) : \"t\"(in));\n#else\n      *pOut = sqrtf(in);\n#endif\n\n      return (ARM_MATH_SUCCESS);\n    }\n    else\n    {\n      *pOut = 0.0f;\n      return (ARM_MATH_ARGUMENT_ERROR);\n    }\n  }\n\n\n  /**\n   * @brief Q31 square root function.\n   * @param[in]  in    input value.  The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF.\n   * @param[out] pOut  square root of input value.\n   * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if\n   * <code>in</code> is negative value and returns zero output for negative values.\n   */\n  arm_status arm_sqrt_q31(\n  q31_t in,\n  q31_t * pOut);\n\n\n  /**\n   * @brief  Q15 square root function.\n   * @param[in]  in    input value.  The range of the input value is [0 +1) or 0x0000 to 0x7FFF.\n   * @param[out] pOut  square root of input value.\n   * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if\n   * <code>in</code> is negative value and returns zero output for negative values.\n   */\n  arm_status arm_sqrt_q15(\n  q15_t in,\n  q15_t * pOut);\n\n  /**\n   * @} end of SQRT group\n   */\n\n\n  /**\n   * @brief floating-point Circular write function.\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_circularWrite_f32(\n  int32_t * circBuffer,\n  int32_t L,\n  uint16_t * writeOffset,\n  int32_t bufferInc,\n  const int32_t * src,\n  int32_t srcInc,\n  uint32_t blockSize)\n  {\n    uint32_t i = 0u;\n    int32_t wOffset;\n\n    /* Copy the value of Index pointer that points\n     * to the current location where the input samples to be copied */\n    wOffset = *writeOffset;\n\n    /* Loop over the blockSize */\n    i = blockSize;\n\n    while (i > 0u)\n    {\n      /* copy the input sample to the circular buffer */\n      circBuffer[wOffset] = *src;\n\n      /* Update the input pointer */\n      src += srcInc;\n\n      /* Circularly update wOffset.  Watch out for positive and negative value */\n      wOffset += bufferInc;\n      if (wOffset >= L)\n        wOffset -= L;\n\n      /* Decrement the loop counter */\n      i--;\n    }\n\n    /* Update the index pointer */\n    *writeOffset = (uint16_t)wOffset;\n  }\n\n\n\n  /**\n   * @brief floating-point Circular Read function.\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_circularRead_f32(\n  int32_t * circBuffer,\n  int32_t L,\n  int32_t * readOffset,\n  int32_t bufferInc,\n  int32_t * dst,\n  int32_t * dst_base,\n  int32_t dst_length,\n  int32_t dstInc,\n  uint32_t blockSize)\n  {\n    uint32_t i = 0u;\n    int32_t rOffset, dst_end;\n\n    /* Copy the value of Index pointer that points\n     * to the current location from where the input samples to be read */\n    rOffset = *readOffset;\n    dst_end = (int32_t) (dst_base + dst_length);\n\n    /* Loop over the blockSize */\n    i = blockSize;\n\n    while (i > 0u)\n    {\n      /* copy the sample from the circular buffer to the destination buffer */\n      *dst = circBuffer[rOffset];\n\n      /* Update the input pointer */\n      dst += dstInc;\n\n      if (dst == (int32_t *) dst_end)\n      {\n        dst = dst_base;\n      }\n\n      /* Circularly update rOffset.  Watch out for positive and negative value  */\n      rOffset += bufferInc;\n\n      if (rOffset >= L)\n      {\n        rOffset -= L;\n      }\n\n      /* Decrement the loop counter */\n      i--;\n    }\n\n    /* Update the index pointer */\n    *readOffset = rOffset;\n  }\n\n\n  /**\n   * @brief Q15 Circular write function.\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_circularWrite_q15(\n  q15_t * circBuffer,\n  int32_t L,\n  uint16_t * writeOffset,\n  int32_t bufferInc,\n  const q15_t * src,\n  int32_t srcInc,\n  uint32_t blockSize)\n  {\n    uint32_t i = 0u;\n    int32_t wOffset;\n\n    /* Copy the value of Index pointer that points\n     * to the current location where the input samples to be copied */\n    wOffset = *writeOffset;\n\n    /* Loop over the blockSize */\n    i = blockSize;\n\n    while (i > 0u)\n    {\n      /* copy the input sample to the circular buffer */\n      circBuffer[wOffset] = *src;\n\n      /* Update the input pointer */\n      src += srcInc;\n\n      /* Circularly update wOffset.  Watch out for positive and negative value */\n      wOffset += bufferInc;\n      if (wOffset >= L)\n        wOffset -= L;\n\n      /* Decrement the loop counter */\n      i--;\n    }\n\n    /* Update the index pointer */\n    *writeOffset = (uint16_t)wOffset;\n  }\n\n\n  /**\n   * @brief Q15 Circular Read function.\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_circularRead_q15(\n  q15_t * circBuffer,\n  int32_t L,\n  int32_t * readOffset,\n  int32_t bufferInc,\n  q15_t * dst,\n  q15_t * dst_base,\n  int32_t dst_length,\n  int32_t dstInc,\n  uint32_t blockSize)\n  {\n    uint32_t i = 0;\n    int32_t rOffset, dst_end;\n\n    /* Copy the value of Index pointer that points\n     * to the current location from where the input samples to be read */\n    rOffset = *readOffset;\n\n    dst_end = (int32_t) (dst_base + dst_length);\n\n    /* Loop over the blockSize */\n    i = blockSize;\n\n    while (i > 0u)\n    {\n      /* copy the sample from the circular buffer to the destination buffer */\n      *dst = circBuffer[rOffset];\n\n      /* Update the input pointer */\n      dst += dstInc;\n\n      if (dst == (q15_t *) dst_end)\n      {\n        dst = dst_base;\n      }\n\n      /* Circularly update wOffset.  Watch out for positive and negative value */\n      rOffset += bufferInc;\n\n      if (rOffset >= L)\n      {\n        rOffset -= L;\n      }\n\n      /* Decrement the loop counter */\n      i--;\n    }\n\n    /* Update the index pointer */\n    *readOffset = rOffset;\n  }\n\n\n  /**\n   * @brief Q7 Circular write function.\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_circularWrite_q7(\n  q7_t * circBuffer,\n  int32_t L,\n  uint16_t * writeOffset,\n  int32_t bufferInc,\n  const q7_t * src,\n  int32_t srcInc,\n  uint32_t blockSize)\n  {\n    uint32_t i = 0u;\n    int32_t wOffset;\n\n    /* Copy the value of Index pointer that points\n     * to the current location where the input samples to be copied */\n    wOffset = *writeOffset;\n\n    /* Loop over the blockSize */\n    i = blockSize;\n\n    while (i > 0u)\n    {\n      /* copy the input sample to the circular buffer */\n      circBuffer[wOffset] = *src;\n\n      /* Update the input pointer */\n      src += srcInc;\n\n      /* Circularly update wOffset.  Watch out for positive and negative value */\n      wOffset += bufferInc;\n      if (wOffset >= L)\n        wOffset -= L;\n\n      /* Decrement the loop counter */\n      i--;\n    }\n\n    /* Update the index pointer */\n    *writeOffset = (uint16_t)wOffset;\n  }\n\n\n  /**\n   * @brief Q7 Circular Read function.\n   */\n  CMSIS_INLINE __STATIC_INLINE void arm_circularRead_q7(\n  q7_t * circBuffer,\n  int32_t L,\n  int32_t * readOffset,\n  int32_t bufferInc,\n  q7_t * dst,\n  q7_t * dst_base,\n  int32_t dst_length,\n  int32_t dstInc,\n  uint32_t blockSize)\n  {\n    uint32_t i = 0;\n    int32_t rOffset, dst_end;\n\n    /* Copy the value of Index pointer that points\n     * to the current location from where the input samples to be read */\n    rOffset = *readOffset;\n\n    dst_end = (int32_t) (dst_base + dst_length);\n\n    /* Loop over the blockSize */\n    i = blockSize;\n\n    while (i > 0u)\n    {\n      /* copy the sample from the circular buffer to the destination buffer */\n      *dst = circBuffer[rOffset];\n\n      /* Update the input pointer */\n      dst += dstInc;\n\n      if (dst == (q7_t *) dst_end)\n      {\n        dst = dst_base;\n      }\n\n      /* Circularly update rOffset.  Watch out for positive and negative value */\n      rOffset += bufferInc;\n\n      if (rOffset >= L)\n      {\n        rOffset -= L;\n      }\n\n      /* Decrement the loop counter */\n      i--;\n    }\n\n    /* Update the index pointer */\n    *readOffset = rOffset;\n  }\n\n\n  /**\n   * @brief  Sum of the squares of the elements of a Q31 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_power_q31(\n  q31_t * pSrc,\n  uint32_t blockSize,\n  q63_t * pResult);\n\n\n  /**\n   * @brief  Sum of the squares of the elements of a floating-point vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_power_f32(\n  float32_t * pSrc,\n  uint32_t blockSize,\n  float32_t * pResult);\n\n\n  /**\n   * @brief  Sum of the squares of the elements of a Q15 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_power_q15(\n  q15_t * pSrc,\n  uint32_t blockSize,\n  q63_t * pResult);\n\n\n  /**\n   * @brief  Sum of the squares of the elements of a Q7 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_power_q7(\n  q7_t * pSrc,\n  uint32_t blockSize,\n  q31_t * pResult);\n\n\n  /**\n   * @brief  Mean value of a Q7 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_mean_q7(\n  q7_t * pSrc,\n  uint32_t blockSize,\n  q7_t * pResult);\n\n\n  /**\n   * @brief  Mean value of a Q15 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_mean_q15(\n  q15_t * pSrc,\n  uint32_t blockSize,\n  q15_t * pResult);\n\n\n  /**\n   * @brief  Mean value of a Q31 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_mean_q31(\n  q31_t * pSrc,\n  uint32_t blockSize,\n  q31_t * pResult);\n\n\n  /**\n   * @brief  Mean value of a floating-point vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_mean_f32(\n  float32_t * pSrc,\n  uint32_t blockSize,\n  float32_t * pResult);\n\n\n  /**\n   * @brief  Variance of the elements of a floating-point vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_var_f32(\n  float32_t * pSrc,\n  uint32_t blockSize,\n  float32_t * pResult);\n\n\n  /**\n   * @brief  Variance of the elements of a Q31 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_var_q31(\n  q31_t * pSrc,\n  uint32_t blockSize,\n  q31_t * pResult);\n\n\n  /**\n   * @brief  Variance of the elements of a Q15 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_var_q15(\n  q15_t * pSrc,\n  uint32_t blockSize,\n  q15_t * pResult);\n\n\n  /**\n   * @brief  Root Mean Square of the elements of a floating-point vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_rms_f32(\n  float32_t * pSrc,\n  uint32_t blockSize,\n  float32_t * pResult);\n\n\n  /**\n   * @brief  Root Mean Square of the elements of a Q31 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_rms_q31(\n  q31_t * pSrc,\n  uint32_t blockSize,\n  q31_t * pResult);\n\n\n  /**\n   * @brief  Root Mean Square of the elements of a Q15 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_rms_q15(\n  q15_t * pSrc,\n  uint32_t blockSize,\n  q15_t * pResult);\n\n\n  /**\n   * @brief  Standard deviation of the elements of a floating-point vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_std_f32(\n  float32_t * pSrc,\n  uint32_t blockSize,\n  float32_t * pResult);\n\n\n  /**\n   * @brief  Standard deviation of the elements of a Q31 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_std_q31(\n  q31_t * pSrc,\n  uint32_t blockSize,\n  q31_t * pResult);\n\n\n  /**\n   * @brief  Standard deviation of the elements of a Q15 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output value.\n   */\n  void arm_std_q15(\n  q15_t * pSrc,\n  uint32_t blockSize,\n  q15_t * pResult);\n\n\n  /**\n   * @brief  Floating-point complex magnitude\n   * @param[in]  pSrc        points to the complex input vector\n   * @param[out] pDst        points to the real output vector\n   * @param[in]  numSamples  number of complex samples in the input vector\n   */\n  void arm_cmplx_mag_f32(\n  float32_t * pSrc,\n  float32_t * pDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Q31 complex magnitude\n   * @param[in]  pSrc        points to the complex input vector\n   * @param[out] pDst        points to the real output vector\n   * @param[in]  numSamples  number of complex samples in the input vector\n   */\n  void arm_cmplx_mag_q31(\n  q31_t * pSrc,\n  q31_t * pDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Q15 complex magnitude\n   * @param[in]  pSrc        points to the complex input vector\n   * @param[out] pDst        points to the real output vector\n   * @param[in]  numSamples  number of complex samples in the input vector\n   */\n  void arm_cmplx_mag_q15(\n  q15_t * pSrc,\n  q15_t * pDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Q15 complex dot product\n   * @param[in]  pSrcA       points to the first input vector\n   * @param[in]  pSrcB       points to the second input vector\n   * @param[in]  numSamples  number of complex samples in each vector\n   * @param[out] realResult  real part of the result returned here\n   * @param[out] imagResult  imaginary part of the result returned here\n   */\n  void arm_cmplx_dot_prod_q15(\n  q15_t * pSrcA,\n  q15_t * pSrcB,\n  uint32_t numSamples,\n  q31_t * realResult,\n  q31_t * imagResult);\n\n\n  /**\n   * @brief  Q31 complex dot product\n   * @param[in]  pSrcA       points to the first input vector\n   * @param[in]  pSrcB       points to the second input vector\n   * @param[in]  numSamples  number of complex samples in each vector\n   * @param[out] realResult  real part of the result returned here\n   * @param[out] imagResult  imaginary part of the result returned here\n   */\n  void arm_cmplx_dot_prod_q31(\n  q31_t * pSrcA,\n  q31_t * pSrcB,\n  uint32_t numSamples,\n  q63_t * realResult,\n  q63_t * imagResult);\n\n\n  /**\n   * @brief  Floating-point complex dot product\n   * @param[in]  pSrcA       points to the first input vector\n   * @param[in]  pSrcB       points to the second input vector\n   * @param[in]  numSamples  number of complex samples in each vector\n   * @param[out] realResult  real part of the result returned here\n   * @param[out] imagResult  imaginary part of the result returned here\n   */\n  void arm_cmplx_dot_prod_f32(\n  float32_t * pSrcA,\n  float32_t * pSrcB,\n  uint32_t numSamples,\n  float32_t * realResult,\n  float32_t * imagResult);\n\n\n  /**\n   * @brief  Q15 complex-by-real multiplication\n   * @param[in]  pSrcCmplx   points to the complex input vector\n   * @param[in]  pSrcReal    points to the real input vector\n   * @param[out] pCmplxDst   points to the complex output vector\n   * @param[in]  numSamples  number of samples in each vector\n   */\n  void arm_cmplx_mult_real_q15(\n  q15_t * pSrcCmplx,\n  q15_t * pSrcReal,\n  q15_t * pCmplxDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Q31 complex-by-real multiplication\n   * @param[in]  pSrcCmplx   points to the complex input vector\n   * @param[in]  pSrcReal    points to the real input vector\n   * @param[out] pCmplxDst   points to the complex output vector\n   * @param[in]  numSamples  number of samples in each vector\n   */\n  void arm_cmplx_mult_real_q31(\n  q31_t * pSrcCmplx,\n  q31_t * pSrcReal,\n  q31_t * pCmplxDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Floating-point complex-by-real multiplication\n   * @param[in]  pSrcCmplx   points to the complex input vector\n   * @param[in]  pSrcReal    points to the real input vector\n   * @param[out] pCmplxDst   points to the complex output vector\n   * @param[in]  numSamples  number of samples in each vector\n   */\n  void arm_cmplx_mult_real_f32(\n  float32_t * pSrcCmplx,\n  float32_t * pSrcReal,\n  float32_t * pCmplxDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Minimum value of a Q7 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] result     is output pointer\n   * @param[in]  index      is the array index of the minimum value in the input buffer.\n   */\n  void arm_min_q7(\n  q7_t * pSrc,\n  uint32_t blockSize,\n  q7_t * result,\n  uint32_t * index);\n\n\n  /**\n   * @brief  Minimum value of a Q15 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output pointer\n   * @param[in]  pIndex     is the array index of the minimum value in the input buffer.\n   */\n  void arm_min_q15(\n  q15_t * pSrc,\n  uint32_t blockSize,\n  q15_t * pResult,\n  uint32_t * pIndex);\n\n\n  /**\n   * @brief  Minimum value of a Q31 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output pointer\n   * @param[out] pIndex     is the array index of the minimum value in the input buffer.\n   */\n  void arm_min_q31(\n  q31_t * pSrc,\n  uint32_t blockSize,\n  q31_t * pResult,\n  uint32_t * pIndex);\n\n\n  /**\n   * @brief  Minimum value of a floating-point vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[in]  blockSize  is the number of samples to process\n   * @param[out] pResult    is output pointer\n   * @param[out] pIndex     is the array index of the minimum value in the input buffer.\n   */\n  void arm_min_f32(\n  float32_t * pSrc,\n  uint32_t blockSize,\n  float32_t * pResult,\n  uint32_t * pIndex);\n\n\n/**\n * @brief Maximum value of a Q7 vector.\n * @param[in]  pSrc       points to the input buffer\n * @param[in]  blockSize  length of the input vector\n * @param[out] pResult    maximum value returned here\n * @param[out] pIndex     index of maximum value returned here\n */\n  void arm_max_q7(\n  q7_t * pSrc,\n  uint32_t blockSize,\n  q7_t * pResult,\n  uint32_t * pIndex);\n\n\n/**\n * @brief Maximum value of a Q15 vector.\n * @param[in]  pSrc       points to the input buffer\n * @param[in]  blockSize  length of the input vector\n * @param[out] pResult    maximum value returned here\n * @param[out] pIndex     index of maximum value returned here\n */\n  void arm_max_q15(\n  q15_t * pSrc,\n  uint32_t blockSize,\n  q15_t * pResult,\n  uint32_t * pIndex);\n\n\n/**\n * @brief Maximum value of a Q31 vector.\n * @param[in]  pSrc       points to the input buffer\n * @param[in]  blockSize  length of the input vector\n * @param[out] pResult    maximum value returned here\n * @param[out] pIndex     index of maximum value returned here\n */\n  void arm_max_q31(\n  q31_t * pSrc,\n  uint32_t blockSize,\n  q31_t * pResult,\n  uint32_t * pIndex);\n\n\n/**\n * @brief Maximum value of a floating-point vector.\n * @param[in]  pSrc       points to the input buffer\n * @param[in]  blockSize  length of the input vector\n * @param[out] pResult    maximum value returned here\n * @param[out] pIndex     index of maximum value returned here\n */\n  void arm_max_f32(\n  float32_t * pSrc,\n  uint32_t blockSize,\n  float32_t * pResult,\n  uint32_t * pIndex);\n\n\n  /**\n   * @brief  Q15 complex-by-complex multiplication\n   * @param[in]  pSrcA       points to the first input vector\n   * @param[in]  pSrcB       points to the second input vector\n   * @param[out] pDst        points to the output vector\n   * @param[in]  numSamples  number of complex samples in each vector\n   */\n  void arm_cmplx_mult_cmplx_q15(\n  q15_t * pSrcA,\n  q15_t * pSrcB,\n  q15_t * pDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Q31 complex-by-complex multiplication\n   * @param[in]  pSrcA       points to the first input vector\n   * @param[in]  pSrcB       points to the second input vector\n   * @param[out] pDst        points to the output vector\n   * @param[in]  numSamples  number of complex samples in each vector\n   */\n  void arm_cmplx_mult_cmplx_q31(\n  q31_t * pSrcA,\n  q31_t * pSrcB,\n  q31_t * pDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief  Floating-point complex-by-complex multiplication\n   * @param[in]  pSrcA       points to the first input vector\n   * @param[in]  pSrcB       points to the second input vector\n   * @param[out] pDst        points to the output vector\n   * @param[in]  numSamples  number of complex samples in each vector\n   */\n  void arm_cmplx_mult_cmplx_f32(\n  float32_t * pSrcA,\n  float32_t * pSrcB,\n  float32_t * pDst,\n  uint32_t numSamples);\n\n\n  /**\n   * @brief Converts the elements of the floating-point vector to Q31 vector.\n   * @param[in]  pSrc       points to the floating-point input vector\n   * @param[out] pDst       points to the Q31 output vector\n   * @param[in]  blockSize  length of the input vector\n   */\n  void arm_float_to_q31(\n  float32_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Converts the elements of the floating-point vector to Q15 vector.\n   * @param[in]  pSrc       points to the floating-point input vector\n   * @param[out] pDst       points to the Q15 output vector\n   * @param[in]  blockSize  length of the input vector\n   */\n  void arm_float_to_q15(\n  float32_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief Converts the elements of the floating-point vector to Q7 vector.\n   * @param[in]  pSrc       points to the floating-point input vector\n   * @param[out] pDst       points to the Q7 output vector\n   * @param[in]  blockSize  length of the input vector\n   */\n  void arm_float_to_q7(\n  float32_t * pSrc,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Converts the elements of the Q31 vector to Q15 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[out] pDst       is output pointer\n   * @param[in]  blockSize  is the number of samples to process\n   */\n  void arm_q31_to_q15(\n  q31_t * pSrc,\n  q15_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Converts the elements of the Q31 vector to Q7 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[out] pDst       is output pointer\n   * @param[in]  blockSize  is the number of samples to process\n   */\n  void arm_q31_to_q7(\n  q31_t * pSrc,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Converts the elements of the Q15 vector to floating-point vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[out] pDst       is output pointer\n   * @param[in]  blockSize  is the number of samples to process\n   */\n  void arm_q15_to_float(\n  q15_t * pSrc,\n  float32_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Converts the elements of the Q15 vector to Q31 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[out] pDst       is output pointer\n   * @param[in]  blockSize  is the number of samples to process\n   */\n  void arm_q15_to_q31(\n  q15_t * pSrc,\n  q31_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @brief  Converts the elements of the Q15 vector to Q7 vector.\n   * @param[in]  pSrc       is input pointer\n   * @param[out] pDst       is output pointer\n   * @param[in]  blockSize  is the number of samples to process\n   */\n  void arm_q15_to_q7(\n  q15_t * pSrc,\n  q7_t * pDst,\n  uint32_t blockSize);\n\n\n  /**\n   * @ingroup groupInterpolation\n   */\n\n  /**\n   * @defgroup BilinearInterpolate Bilinear Interpolation\n   *\n   * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid.\n   * The underlying function <code>f(x, y)</code> is sampled on a regular grid and the interpolation process\n   * determines values between the grid points.\n   * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension.\n   * Bilinear interpolation is often used in image processing to rescale images.\n   * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types.\n   *\n   * <b>Algorithm</b>\n   * \\par\n   * The instance structure used by the bilinear interpolation functions describes a two dimensional data table.\n   * For floating-point, the instance structure is defined as:\n   * <pre>\n   *   typedef struct\n   *   {\n   *     uint16_t numRows;\n   *     uint16_t numCols;\n   *     float32_t *pData;\n   * } arm_bilinear_interp_instance_f32;\n   * </pre>\n   *\n   * \\par\n   * where <code>numRows</code> specifies the number of rows in the table;\n   * <code>numCols</code> specifies the number of columns in the table;\n   * and <code>pData</code> points to an array of size <code>numRows*numCols</code> values.\n   * The data table <code>pTable</code> is organized in row order and the supplied data values fall on integer indexes.\n   * That is, table element (x,y) is located at <code>pTable[x + y*numCols]</code> where x and y are integers.\n   *\n   * \\par\n   * Let <code>(x, y)</code> specify the desired interpolation point.  Then define:\n   * <pre>\n   *     XF = floor(x)\n   *     YF = floor(y)\n   * </pre>\n   * \\par\n   * The interpolated output point is computed as:\n   * <pre>\n   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))\n   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))\n   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)\n   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)\n   * </pre>\n   * Note that the coordinates (x, y) contain integer and fractional components.\n   * The integer components specify which portion of the table to use while the\n   * fractional components control the interpolation processor.\n   *\n   * \\par\n   * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output.\n   */\n\n  /**\n   * @addtogroup BilinearInterpolate\n   * @{\n   */\n\n\n  /**\n  *\n  * @brief  Floating-point bilinear interpolation.\n  * @param[in,out] S  points to an instance of the interpolation structure.\n  * @param[in]     X  interpolation coordinate.\n  * @param[in]     Y  interpolation coordinate.\n  * @return out interpolated value.\n  */\n  CMSIS_INLINE __STATIC_INLINE float32_t arm_bilinear_interp_f32(\n  const arm_bilinear_interp_instance_f32 * S,\n  float32_t X,\n  float32_t Y)\n  {\n    float32_t out;\n    float32_t f00, f01, f10, f11;\n    float32_t *pData = S->pData;\n    int32_t xIndex, yIndex, index;\n    float32_t xdiff, ydiff;\n    float32_t b1, b2, b3, b4;\n\n    xIndex = (int32_t) X;\n    yIndex = (int32_t) Y;\n\n    /* Care taken for table outside boundary */\n    /* Returns zero output when values are outside table boundary */\n    if (xIndex < 0 || xIndex > (S->numRows - 1) || yIndex < 0 || yIndex > (S->numCols - 1))\n    {\n      return (0);\n    }\n\n    /* Calculation of index for two nearest points in X-direction */\n    index = (xIndex - 1) + (yIndex - 1) * S->numCols;\n\n\n    /* Read two nearest points in X-direction */\n    f00 = pData[index];\n    f01 = pData[index + 1];\n\n    /* Calculation of index for two nearest points in Y-direction */\n    index = (xIndex - 1) + (yIndex) * S->numCols;\n\n\n    /* Read two nearest points in Y-direction */\n    f10 = pData[index];\n    f11 = pData[index + 1];\n\n    /* Calculation of intermediate values */\n    b1 = f00;\n    b2 = f01 - f00;\n    b3 = f10 - f00;\n    b4 = f00 - f01 - f10 + f11;\n\n    /* Calculation of fractional part in X */\n    xdiff = X - xIndex;\n\n    /* Calculation of fractional part in Y */\n    ydiff = Y - yIndex;\n\n    /* Calculation of bi-linear interpolated output */\n    out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff;\n\n    /* return to application */\n    return (out);\n  }\n\n\n  /**\n  *\n  * @brief  Q31 bilinear interpolation.\n  * @param[in,out] S  points to an instance of the interpolation structure.\n  * @param[in]     X  interpolation coordinate in 12.20 format.\n  * @param[in]     Y  interpolation coordinate in 12.20 format.\n  * @return out interpolated value.\n  */\n  CMSIS_INLINE __STATIC_INLINE q31_t arm_bilinear_interp_q31(\n  arm_bilinear_interp_instance_q31 * S,\n  q31_t X,\n  q31_t Y)\n  {\n    q31_t out;                                   /* Temporary output */\n    q31_t acc = 0;                               /* output */\n    q31_t xfract, yfract;                        /* X, Y fractional parts */\n    q31_t x1, x2, y1, y2;                        /* Nearest output values */\n    int32_t rI, cI;                              /* Row and column indices */\n    q31_t *pYData = S->pData;                    /* pointer to output table values */\n    uint32_t nCols = S->numCols;                 /* num of rows */\n\n    /* Input is in 12.20 format */\n    /* 12 bits for the table index */\n    /* Index value calculation */\n    rI = ((X & (q31_t)0xFFF00000) >> 20);\n\n    /* Input is in 12.20 format */\n    /* 12 bits for the table index */\n    /* Index value calculation */\n    cI = ((Y & (q31_t)0xFFF00000) >> 20);\n\n    /* Care taken for table outside boundary */\n    /* Returns zero output when values are outside table boundary */\n    if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1))\n    {\n      return (0);\n    }\n\n    /* 20 bits for the fractional part */\n    /* shift left xfract by 11 to keep 1.31 format */\n    xfract = (X & 0x000FFFFF) << 11u;\n\n    /* Read two nearest output values from the index */\n    x1 = pYData[(rI) + (int32_t)nCols * (cI)    ];\n    x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1];\n\n    /* 20 bits for the fractional part */\n    /* shift left yfract by 11 to keep 1.31 format */\n    yfract = (Y & 0x000FFFFF) << 11u;\n\n    /* Read two nearest output values from the index */\n    y1 = pYData[(rI) + (int32_t)nCols * (cI + 1)    ];\n    y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1];\n\n    /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */\n    out = ((q31_t) (((q63_t) x1  * (0x7FFFFFFF - xfract)) >> 32));\n    acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32));\n\n    /* x2 * (xfract) * (1-yfract)  in 3.29(q29) and adding to acc */\n    out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32));\n    acc += ((q31_t) ((q63_t) out * (xfract) >> 32));\n\n    /* y1 * (1 - xfract) * (yfract)  in 3.29(q29) and adding to acc */\n    out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32));\n    acc += ((q31_t) ((q63_t) out * (yfract) >> 32));\n\n    /* y2 * (xfract) * (yfract)  in 3.29(q29) and adding to acc */\n    out = ((q31_t) ((q63_t) y2 * (xfract) >> 32));\n    acc += ((q31_t) ((q63_t) out * (yfract) >> 32));\n\n    /* Convert acc to 1.31(q31) format */\n    return ((q31_t)(acc << 2));\n  }\n\n\n  /**\n  * @brief  Q15 bilinear interpolation.\n  * @param[in,out] S  points to an instance of the interpolation structure.\n  * @param[in]     X  interpolation coordinate in 12.20 format.\n  * @param[in]     Y  interpolation coordinate in 12.20 format.\n  * @return out interpolated value.\n  */\n  CMSIS_INLINE __STATIC_INLINE q15_t arm_bilinear_interp_q15(\n  arm_bilinear_interp_instance_q15 * S,\n  q31_t X,\n  q31_t Y)\n  {\n    q63_t acc = 0;                               /* output */\n    q31_t out;                                   /* Temporary output */\n    q15_t x1, x2, y1, y2;                        /* Nearest output values */\n    q31_t xfract, yfract;                        /* X, Y fractional parts */\n    int32_t rI, cI;                              /* Row and column indices */\n    q15_t *pYData = S->pData;                    /* pointer to output table values */\n    uint32_t nCols = S->numCols;                 /* num of rows */\n\n    /* Input is in 12.20 format */\n    /* 12 bits for the table index */\n    /* Index value calculation */\n    rI = ((X & (q31_t)0xFFF00000) >> 20);\n\n    /* Input is in 12.20 format */\n    /* 12 bits for the table index */\n    /* Index value calculation */\n    cI = ((Y & (q31_t)0xFFF00000) >> 20);\n\n    /* Care taken for table outside boundary */\n    /* Returns zero output when values are outside table boundary */\n    if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1))\n    {\n      return (0);\n    }\n\n    /* 20 bits for the fractional part */\n    /* xfract should be in 12.20 format */\n    xfract = (X & 0x000FFFFF);\n\n    /* Read two nearest output values from the index */\n    x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI)    ];\n    x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1];\n\n    /* 20 bits for the fractional part */\n    /* yfract should be in 12.20 format */\n    yfract = (Y & 0x000FFFFF);\n\n    /* Read two nearest output values from the index */\n    y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1)    ];\n    y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1];\n\n    /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */\n\n    /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */\n    /* convert 13.35 to 13.31 by right shifting  and out is in 1.31 */\n    out = (q31_t) (((q63_t) x1 * (0xFFFFF - xfract)) >> 4u);\n    acc = ((q63_t) out * (0xFFFFF - yfract));\n\n    /* x2 * (xfract) * (1-yfract)  in 1.51 and adding to acc */\n    out = (q31_t) (((q63_t) x2 * (0xFFFFF - yfract)) >> 4u);\n    acc += ((q63_t) out * (xfract));\n\n    /* y1 * (1 - xfract) * (yfract)  in 1.51 and adding to acc */\n    out = (q31_t) (((q63_t) y1 * (0xFFFFF - xfract)) >> 4u);\n    acc += ((q63_t) out * (yfract));\n\n    /* y2 * (xfract) * (yfract)  in 1.51 and adding to acc */\n    out = (q31_t) (((q63_t) y2 * (xfract)) >> 4u);\n    acc += ((q63_t) out * (yfract));\n\n    /* acc is in 13.51 format and down shift acc by 36 times */\n    /* Convert out to 1.15 format */\n    return ((q15_t)(acc >> 36));\n  }\n\n\n  /**\n  * @brief  Q7 bilinear interpolation.\n  * @param[in,out] S  points to an instance of the interpolation structure.\n  * @param[in]     X  interpolation coordinate in 12.20 format.\n  * @param[in]     Y  interpolation coordinate in 12.20 format.\n  * @return out interpolated value.\n  */\n  CMSIS_INLINE __STATIC_INLINE q7_t arm_bilinear_interp_q7(\n  arm_bilinear_interp_instance_q7 * S,\n  q31_t X,\n  q31_t Y)\n  {\n    q63_t acc = 0;                               /* output */\n    q31_t out;                                   /* Temporary output */\n    q31_t xfract, yfract;                        /* X, Y fractional parts */\n    q7_t x1, x2, y1, y2;                         /* Nearest output values */\n    int32_t rI, cI;                              /* Row and column indices */\n    q7_t *pYData = S->pData;                     /* pointer to output table values */\n    uint32_t nCols = S->numCols;                 /* num of rows */\n\n    /* Input is in 12.20 format */\n    /* 12 bits for the table index */\n    /* Index value calculation */\n    rI = ((X & (q31_t)0xFFF00000) >> 20);\n\n    /* Input is in 12.20 format */\n    /* 12 bits for the table index */\n    /* Index value calculation */\n    cI = ((Y & (q31_t)0xFFF00000) >> 20);\n\n    /* Care taken for table outside boundary */\n    /* Returns zero output when values are outside table boundary */\n    if (rI < 0 || rI > (S->numRows - 1) || cI < 0 || cI > (S->numCols - 1))\n    {\n      return (0);\n    }\n\n    /* 20 bits for the fractional part */\n    /* xfract should be in 12.20 format */\n    xfract = (X & (q31_t)0x000FFFFF);\n\n    /* Read two nearest output values from the index */\n    x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI)    ];\n    x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1];\n\n    /* 20 bits for the fractional part */\n    /* yfract should be in 12.20 format */\n    yfract = (Y & (q31_t)0x000FFFFF);\n\n    /* Read two nearest output values from the index */\n    y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1)    ];\n    y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1];\n\n    /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */\n    out = ((x1 * (0xFFFFF - xfract)));\n    acc = (((q63_t) out * (0xFFFFF - yfract)));\n\n    /* x2 * (xfract) * (1-yfract)  in 2.22 and adding to acc */\n    out = ((x2 * (0xFFFFF - yfract)));\n    acc += (((q63_t) out * (xfract)));\n\n    /* y1 * (1 - xfract) * (yfract)  in 2.22 and adding to acc */\n    out = ((y1 * (0xFFFFF - xfract)));\n    acc += (((q63_t) out * (yfract)));\n\n    /* y2 * (xfract) * (yfract)  in 2.22 and adding to acc */\n    out = ((y2 * (yfract)));\n    acc += (((q63_t) out * (xfract)));\n\n    /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */\n    return ((q7_t)(acc >> 40));\n  }\n\n  /**\n   * @} end of BilinearInterpolate group\n   */\n\n\n/* SMMLAR */\n#define multAcc_32x32_keep32_R(a, x, y) \\\n    a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32)\n\n/* SMMLSR */\n#define multSub_32x32_keep32_R(a, x, y) \\\n    a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32)\n\n/* SMMULR */\n#define mult_32x32_keep32_R(a, x, y) \\\n    a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32)\n\n/* SMMLA */\n#define multAcc_32x32_keep32(a, x, y) \\\n    a += (q31_t) (((q63_t) x * y) >> 32)\n\n/* SMMLS */\n#define multSub_32x32_keep32(a, x, y) \\\n    a -= (q31_t) (((q63_t) x * y) >> 32)\n\n/* SMMUL */\n#define mult_32x32_keep32(a, x, y) \\\n    a = (q31_t) (((q63_t) x * y ) >> 32)\n\n\n#if   defined ( __CC_ARM )\n  /* Enter low optimization region - place directly above function definition */\n  #if defined( ARM_MATH_CM4 ) || defined( ARM_MATH_CM7)\n    #define LOW_OPTIMIZATION_ENTER \\\n       _Pragma (\"push\")         \\\n       _Pragma (\"O1\")\n  #else\n    #define LOW_OPTIMIZATION_ENTER\n  #endif\n\n  /* Exit low optimization region - place directly after end of function definition */\n  #if defined ( ARM_MATH_CM4 ) || defined ( ARM_MATH_CM7 )\n    #define LOW_OPTIMIZATION_EXIT \\\n       _Pragma (\"pop\")\n  #else\n    #define LOW_OPTIMIZATION_EXIT\n  #endif\n\n  /* Enter low optimization region - place directly above function definition */\n  #define IAR_ONLY_LOW_OPTIMIZATION_ENTER\n\n  /* Exit low optimization region - place directly after end of function definition */\n  #define IAR_ONLY_LOW_OPTIMIZATION_EXIT\n\n#elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 )\n  #define LOW_OPTIMIZATION_ENTER\n  #define LOW_OPTIMIZATION_EXIT\n  #define IAR_ONLY_LOW_OPTIMIZATION_ENTER\n  #define IAR_ONLY_LOW_OPTIMIZATION_EXIT\n\n#elif defined ( __GNUC__ )\n  #define LOW_OPTIMIZATION_ENTER \\\n       __attribute__(( optimize(\"-O1\") ))\n  #define LOW_OPTIMIZATION_EXIT\n  #define IAR_ONLY_LOW_OPTIMIZATION_ENTER\n  #define IAR_ONLY_LOW_OPTIMIZATION_EXIT\n\n#elif defined ( __ICCARM__ )\n  /* Enter low optimization region - place directly above function definition */\n  #if defined ( ARM_MATH_CM4 ) || defined ( ARM_MATH_CM7 )\n    #define LOW_OPTIMIZATION_ENTER \\\n       _Pragma (\"optimize=low\")\n  #else\n    #define LOW_OPTIMIZATION_ENTER\n  #endif\n\n  /* Exit low optimization region - place directly after end of function definition */\n  #define LOW_OPTIMIZATION_EXIT\n\n  /* Enter low optimization region - place directly above function definition */\n  #if defined ( ARM_MATH_CM4 ) || defined ( ARM_MATH_CM7 )\n    #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \\\n       _Pragma (\"optimize=low\")\n  #else\n    #define IAR_ONLY_LOW_OPTIMIZATION_ENTER\n  #endif\n\n  /* Exit low optimization region - place directly after end of function definition */\n  #define IAR_ONLY_LOW_OPTIMIZATION_EXIT\n\n#elif defined ( __TI_ARM__ )\n  #define LOW_OPTIMIZATION_ENTER\n  #define LOW_OPTIMIZATION_EXIT\n  #define IAR_ONLY_LOW_OPTIMIZATION_ENTER\n  #define IAR_ONLY_LOW_OPTIMIZATION_EXIT\n\n#elif defined ( __CSMC__ )\n  #define LOW_OPTIMIZATION_ENTER\n  #define LOW_OPTIMIZATION_EXIT\n  #define IAR_ONLY_LOW_OPTIMIZATION_ENTER\n  #define IAR_ONLY_LOW_OPTIMIZATION_EXIT\n\n#elif defined ( __TASKING__ )\n  #define LOW_OPTIMIZATION_ENTER\n  #define LOW_OPTIMIZATION_EXIT\n  #define IAR_ONLY_LOW_OPTIMIZATION_ENTER\n  #define IAR_ONLY_LOW_OPTIMIZATION_EXIT\n\n#endif\n\n\n#ifdef   __cplusplus\n}\n#endif\n\n\n#if defined ( __GNUC__ )\n#pragma GCC diagnostic pop\n#endif\n\n#endif /* _ARM_MATH_H */\n\n/**\n *\n * End of file.\n */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/cmsis_armcc.h",
    "content": "/**************************************************************************//**\n * @file     cmsis_armcc.h\n * @brief    CMSIS compiler ARMCC (ARM compiler V5) header file\n * @version  V5.0.1\n * @date     03. February 2017\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2017 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef __CMSIS_ARMCC_H\n#define __CMSIS_ARMCC_H\n\n\n#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677)\n  #error \"Please use ARM Compiler Toolchain V4.0.677 or later!\"\n#endif\n\n/* CMSIS compiler control architecture macros */\n#if ((defined (__TARGET_ARCH_6_M  ) && (__TARGET_ARCH_6_M   == 1)) || \\\n     (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M  == 1))   )\n  #define __ARM_ARCH_6M__           1\n#endif\n\n#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M  == 1))\n  #define __ARM_ARCH_7M__           1\n#endif\n\n#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1))\n  #define __ARM_ARCH_7EM__          1\n#endif\n\n  /* __ARM_ARCH_8M_BASE__  not applicable */\n  /* __ARM_ARCH_8M_MAIN__  not applicable */\n\n\n/* CMSIS compiler specific defines */\n#ifndef   __ASM\n  #define __ASM                     __asm\n#endif\n#ifndef   __INLINE\n  #define __INLINE                  __inline\n#endif\n#ifndef   __STATIC_INLINE\n  #define __STATIC_INLINE           static __inline\n#endif\n#ifndef   __NO_RETURN\n  #define __NO_RETURN               __declspec(noreturn)\n#endif\n#ifndef   __USED\n  #define __USED                    __attribute__((used))\n#endif\n#ifndef   __WEAK\n  #define __WEAK                    __attribute__((weak))\n#endif\n#ifndef   __UNALIGNED_UINT32\n  #define __UNALIGNED_UINT32(x)     (*((__packed uint32_t *)(x)))\n#endif\n#ifndef   __ALIGNED\n  #define __ALIGNED(x)              __attribute__((aligned(x)))\n#endif\n#ifndef   __PACKED\n  #define __PACKED                  __attribute__((packed))\n#endif\n#ifndef   __PACKED_STRUCT\n  #define __PACKED_STRUCT           __packed struct\n#endif\n\n\n/* ###########################  Core Function Access  ########################### */\n/** \\ingroup  CMSIS_Core_FunctionInterface\n    \\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions\n  @{\n */\n\n/**\n  \\brief   Enable IRQ Interrupts\n  \\details Enables IRQ interrupts by clearing the I-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n/* intrinsic void __enable_irq();     */\n\n\n/**\n  \\brief   Disable IRQ Interrupts\n  \\details Disables IRQ interrupts by setting the I-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n/* intrinsic void __disable_irq();    */\n\n/**\n  \\brief   Get Control Register\n  \\details Returns the content of the Control Register.\n  \\return               Control Register value\n */\n__STATIC_INLINE uint32_t __get_CONTROL(void)\n{\n  register uint32_t __regControl         __ASM(\"control\");\n  return(__regControl);\n}\n\n\n/**\n  \\brief   Set Control Register\n  \\details Writes the given value to the Control Register.\n  \\param [in]    control  Control Register value to set\n */\n__STATIC_INLINE void __set_CONTROL(uint32_t control)\n{\n  register uint32_t __regControl         __ASM(\"control\");\n  __regControl = control;\n}\n\n\n/**\n  \\brief   Get IPSR Register\n  \\details Returns the content of the IPSR Register.\n  \\return               IPSR Register value\n */\n__STATIC_INLINE uint32_t __get_IPSR(void)\n{\n  register uint32_t __regIPSR          __ASM(\"ipsr\");\n  return(__regIPSR);\n}\n\n\n/**\n  \\brief   Get APSR Register\n  \\details Returns the content of the APSR Register.\n  \\return               APSR Register value\n */\n__STATIC_INLINE uint32_t __get_APSR(void)\n{\n  register uint32_t __regAPSR          __ASM(\"apsr\");\n  return(__regAPSR);\n}\n\n\n/**\n  \\brief   Get xPSR Register\n  \\details Returns the content of the xPSR Register.\n  \\return               xPSR Register value\n */\n__STATIC_INLINE uint32_t __get_xPSR(void)\n{\n  register uint32_t __regXPSR          __ASM(\"xpsr\");\n  return(__regXPSR);\n}\n\n\n/**\n  \\brief   Get Process Stack Pointer\n  \\details Returns the current value of the Process Stack Pointer (PSP).\n  \\return               PSP Register value\n */\n__STATIC_INLINE uint32_t __get_PSP(void)\n{\n  register uint32_t __regProcessStackPointer  __ASM(\"psp\");\n  return(__regProcessStackPointer);\n}\n\n\n/**\n  \\brief   Set Process Stack Pointer\n  \\details Assigns the given value to the Process Stack Pointer (PSP).\n  \\param [in]    topOfProcStack  Process Stack Pointer value to set\n */\n__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)\n{\n  register uint32_t __regProcessStackPointer  __ASM(\"psp\");\n  __regProcessStackPointer = topOfProcStack;\n}\n\n\n/**\n  \\brief   Get Main Stack Pointer\n  \\details Returns the current value of the Main Stack Pointer (MSP).\n  \\return               MSP Register value\n */\n__STATIC_INLINE uint32_t __get_MSP(void)\n{\n  register uint32_t __regMainStackPointer     __ASM(\"msp\");\n  return(__regMainStackPointer);\n}\n\n\n/**\n  \\brief   Set Main Stack Pointer\n  \\details Assigns the given value to the Main Stack Pointer (MSP).\n  \\param [in]    topOfMainStack  Main Stack Pointer value to set\n */\n__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)\n{\n  register uint32_t __regMainStackPointer     __ASM(\"msp\");\n  __regMainStackPointer = topOfMainStack;\n}\n\n\n/**\n  \\brief   Get Priority Mask\n  \\details Returns the current state of the priority mask bit from the Priority Mask Register.\n  \\return               Priority Mask value\n */\n__STATIC_INLINE uint32_t __get_PRIMASK(void)\n{\n  register uint32_t __regPriMask         __ASM(\"primask\");\n  return(__regPriMask);\n}\n\n\n/**\n  \\brief   Set Priority Mask\n  \\details Assigns the given value to the Priority Mask Register.\n  \\param [in]    priMask  Priority Mask\n */\n__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)\n{\n  register uint32_t __regPriMask         __ASM(\"primask\");\n  __regPriMask = (priMask);\n}\n\n\n#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \\\n     (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     )\n\n/**\n  \\brief   Enable FIQ\n  \\details Enables FIQ interrupts by clearing the F-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n#define __enable_fault_irq                __enable_fiq\n\n\n/**\n  \\brief   Disable FIQ\n  \\details Disables FIQ interrupts by setting the F-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n#define __disable_fault_irq               __disable_fiq\n\n\n/**\n  \\brief   Get Base Priority\n  \\details Returns the current value of the Base Priority register.\n  \\return               Base Priority register value\n */\n__STATIC_INLINE uint32_t  __get_BASEPRI(void)\n{\n  register uint32_t __regBasePri         __ASM(\"basepri\");\n  return(__regBasePri);\n}\n\n\n/**\n  \\brief   Set Base Priority\n  \\details Assigns the given value to the Base Priority register.\n  \\param [in]    basePri  Base Priority value to set\n */\n__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)\n{\n  register uint32_t __regBasePri         __ASM(\"basepri\");\n  __regBasePri = (basePri & 0xFFU);\n}\n\n\n/**\n  \\brief   Set Base Priority with condition\n  \\details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,\n           or the new value increases the BASEPRI priority level.\n  \\param [in]    basePri  Base Priority value to set\n */\n__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri)\n{\n  register uint32_t __regBasePriMax      __ASM(\"basepri_max\");\n  __regBasePriMax = (basePri & 0xFFU);\n}\n\n\n/**\n  \\brief   Get Fault Mask\n  \\details Returns the current value of the Fault Mask register.\n  \\return               Fault Mask register value\n */\n__STATIC_INLINE uint32_t __get_FAULTMASK(void)\n{\n  register uint32_t __regFaultMask       __ASM(\"faultmask\");\n  return(__regFaultMask);\n}\n\n\n/**\n  \\brief   Set Fault Mask\n  \\details Assigns the given value to the Fault Mask register.\n  \\param [in]    faultMask  Fault Mask value to set\n */\n__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)\n{\n  register uint32_t __regFaultMask       __ASM(\"faultmask\");\n  __regFaultMask = (faultMask & (uint32_t)1U);\n}\n\n#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \\\n           (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */\n\n\n#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     )\n\n/**\n  \\brief   Get FPSCR\n  \\details Returns the current value of the Floating Point Status/Control register.\n  \\return               Floating Point Status/Control register value\n */\n__STATIC_INLINE uint32_t __get_FPSCR(void)\n{\n#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\\n     (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\n  register uint32_t __regfpscr         __ASM(\"fpscr\");\n  return(__regfpscr);\n#else\n   return(0U);\n#endif\n}\n\n\n/**\n  \\brief   Set FPSCR\n  \\details Assigns the given value to the Floating Point Status/Control register.\n  \\param [in]    fpscr  Floating Point Status/Control value to set\n */\n__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)\n{\n#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\\n     (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\n  register uint32_t __regfpscr         __ASM(\"fpscr\");\n  __regfpscr = (fpscr);\n#else\n  (void)fpscr;\n#endif\n}\n\n#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */\n\n\n\n/*@} end of CMSIS_Core_RegAccFunctions */\n\n\n/* ##########################  Core Instruction Access  ######################### */\n/** \\defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface\n  Access to dedicated instructions\n  @{\n*/\n\n/**\n  \\brief   No Operation\n  \\details No Operation does nothing. This instruction can be used for code alignment purposes.\n */\n#define __NOP                             __nop\n\n\n/**\n  \\brief   Wait For Interrupt\n  \\details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.\n */\n#define __WFI                             __wfi\n\n\n/**\n  \\brief   Wait For Event\n  \\details Wait For Event is a hint instruction that permits the processor to enter\n           a low-power state until one of a number of events occurs.\n */\n#define __WFE                             __wfe\n\n\n/**\n  \\brief   Send Event\n  \\details Send Event is a hint instruction. It causes an event to be signaled to the CPU.\n */\n#define __SEV                             __sev\n\n\n/**\n  \\brief   Instruction Synchronization Barrier\n  \\details Instruction Synchronization Barrier flushes the pipeline in the processor,\n           so that all instructions following the ISB are fetched from cache or memory,\n           after the instruction has been completed.\n */\n#define __ISB() do {\\\n                   __schedule_barrier();\\\n                   __isb(0xF);\\\n                   __schedule_barrier();\\\n                } while (0U)\n\n/**\n  \\brief   Data Synchronization Barrier\n  \\details Acts as a special kind of Data Memory Barrier.\n           It completes when all explicit memory accesses before this instruction complete.\n */\n#define __DSB() do {\\\n                   __schedule_barrier();\\\n                   __dsb(0xF);\\\n                   __schedule_barrier();\\\n                } while (0U)\n\n/**\n  \\brief   Data Memory Barrier\n  \\details Ensures the apparent order of the explicit memory operations before\n           and after the instruction, without ensuring their completion.\n */\n#define __DMB() do {\\\n                   __schedule_barrier();\\\n                   __dmb(0xF);\\\n                   __schedule_barrier();\\\n                } while (0U)\n\n/**\n  \\brief   Reverse byte order (32 bit)\n  \\details Reverses the byte order in integer value.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n#define __REV                             __rev\n\n\n/**\n  \\brief   Reverse byte order (16 bit)\n  \\details Reverses the byte order in two unsigned short values.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n#ifndef __NO_EMBEDDED_ASM\n__attribute__((section(\".rev16_text\"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)\n{\n  rev16 r0, r0\n  bx lr\n}\n#endif\n\n\n/**\n  \\brief   Reverse byte order in signed short value\n  \\details Reverses the byte order in a signed short value with sign extension to integer.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n#ifndef __NO_EMBEDDED_ASM\n__attribute__((section(\".revsh_text\"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)\n{\n  revsh r0, r0\n  bx lr\n}\n#endif\n\n\n/**\n  \\brief   Rotate Right in unsigned value (32 bit)\n  \\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.\n  \\param [in]    op1  Value to rotate\n  \\param [in]    op2  Number of Bits to rotate\n  \\return               Rotated value\n */\n#define __ROR                             __ror\n\n\n/**\n  \\brief   Breakpoint\n  \\details Causes the processor to enter Debug state.\n           Debug tools can use this to investigate system state when the instruction at a particular address is reached.\n  \\param [in]    value  is ignored by the processor.\n                 If required, a debugger can use it to store additional information about the breakpoint.\n */\n#define __BKPT(value)                       __breakpoint(value)\n\n\n/**\n  \\brief   Reverse bit order of value\n  \\details Reverses the bit order of the given value.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \\\n     (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     )\n  #define __RBIT                          __rbit\n#else\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)\n{\n  uint32_t result;\n  int32_t s = (4 /*sizeof(v)*/ * 8) - 1; /* extra shift needed at end */\n\n  result = value;                      /* r will be reversed bits of v; first get LSB of v */\n  for (value >>= 1U; value; value >>= 1U)\n  {\n    result <<= 1U;\n    result |= value & 1U;\n    s--;\n  }\n  result <<= s;                        /* shift when v's highest bits are zero */\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Count leading zeros\n  \\details Counts the number of leading zeros of a data value.\n  \\param [in]  value  Value to count the leading zeros\n  \\return             number of leading zeros in value\n */\n#define __CLZ                             __clz\n\n\n#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \\\n     (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     )\n\n/**\n  \\brief   LDR Exclusive (8 bit)\n  \\details Executes a exclusive LDR instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)\n  #define __LDREXB(ptr)                                                        ((uint8_t ) __ldrex(ptr))\n#else\n  #define __LDREXB(ptr)          _Pragma(\"push\") _Pragma(\"diag_suppress 3731\") ((uint8_t ) __ldrex(ptr))  _Pragma(\"pop\")\n#endif\n\n\n/**\n  \\brief   LDR Exclusive (16 bit)\n  \\details Executes a exclusive LDR instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)\n  #define __LDREXH(ptr)                                                        ((uint16_t) __ldrex(ptr))\n#else\n  #define __LDREXH(ptr)          _Pragma(\"push\") _Pragma(\"diag_suppress 3731\") ((uint16_t) __ldrex(ptr))  _Pragma(\"pop\")\n#endif\n\n\n/**\n  \\brief   LDR Exclusive (32 bit)\n  \\details Executes a exclusive LDR instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)\n  #define __LDREXW(ptr)                                                        ((uint32_t ) __ldrex(ptr))\n#else\n  #define __LDREXW(ptr)          _Pragma(\"push\") _Pragma(\"diag_suppress 3731\") ((uint32_t ) __ldrex(ptr))  _Pragma(\"pop\")\n#endif\n\n\n/**\n  \\brief   STR Exclusive (8 bit)\n  \\details Executes a exclusive STR instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)\n  #define __STREXB(value, ptr)                                                 __strex(value, ptr)\n#else\n  #define __STREXB(value, ptr)   _Pragma(\"push\") _Pragma(\"diag_suppress 3731\") __strex(value, ptr)        _Pragma(\"pop\")\n#endif\n\n\n/**\n  \\brief   STR Exclusive (16 bit)\n  \\details Executes a exclusive STR instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)\n  #define __STREXH(value, ptr)                                                 __strex(value, ptr)\n#else\n  #define __STREXH(value, ptr)   _Pragma(\"push\") _Pragma(\"diag_suppress 3731\") __strex(value, ptr)        _Pragma(\"pop\")\n#endif\n\n\n/**\n  \\brief   STR Exclusive (32 bit)\n  \\details Executes a exclusive STR instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)\n  #define __STREXW(value, ptr)                                                 __strex(value, ptr)\n#else\n  #define __STREXW(value, ptr)   _Pragma(\"push\") _Pragma(\"diag_suppress 3731\") __strex(value, ptr)        _Pragma(\"pop\")\n#endif\n\n\n/**\n  \\brief   Remove the exclusive lock\n  \\details Removes the exclusive lock which is created by LDREX.\n */\n#define __CLREX                           __clrex\n\n\n/**\n  \\brief   Signed Saturate\n  \\details Saturates a signed value.\n  \\param [in]  value  Value to be saturated\n  \\param [in]    sat  Bit position to saturate to (1..32)\n  \\return             Saturated value\n */\n#define __SSAT                            __ssat\n\n\n/**\n  \\brief   Unsigned Saturate\n  \\details Saturates an unsigned value.\n  \\param [in]  value  Value to be saturated\n  \\param [in]    sat  Bit position to saturate to (0..31)\n  \\return             Saturated value\n */\n#define __USAT                            __usat\n\n\n/**\n  \\brief   Rotate Right with Extend (32 bit)\n  \\details Moves each bit of a bitstring right by one bit.\n           The carry input is shifted in at the left end of the bitstring.\n  \\param [in]    value  Value to rotate\n  \\return               Rotated value\n */\n#ifndef __NO_EMBEDDED_ASM\n__attribute__((section(\".rrx_text\"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)\n{\n  rrx r0, r0\n  bx lr\n}\n#endif\n\n\n/**\n  \\brief   LDRT Unprivileged (8 bit)\n  \\details Executes a Unprivileged LDRT instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n#define __LDRBT(ptr)                      ((uint8_t )  __ldrt(ptr))\n\n\n/**\n  \\brief   LDRT Unprivileged (16 bit)\n  \\details Executes a Unprivileged LDRT instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n#define __LDRHT(ptr)                      ((uint16_t)  __ldrt(ptr))\n\n\n/**\n  \\brief   LDRT Unprivileged (32 bit)\n  \\details Executes a Unprivileged LDRT instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n#define __LDRT(ptr)                       ((uint32_t ) __ldrt(ptr))\n\n\n/**\n  \\brief   STRT Unprivileged (8 bit)\n  \\details Executes a Unprivileged STRT instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n#define __STRBT(value, ptr)               __strt(value, ptr)\n\n\n/**\n  \\brief   STRT Unprivileged (16 bit)\n  \\details Executes a Unprivileged STRT instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n#define __STRHT(value, ptr)               __strt(value, ptr)\n\n\n/**\n  \\brief   STRT Unprivileged (32 bit)\n  \\details Executes a Unprivileged STRT instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n#define __STRT(value, ptr)                __strt(value, ptr)\n\n#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__  == 1)) || \\\n           (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */\n\n/*@}*/ /* end of group CMSIS_Core_InstructionInterface */\n\n\n/* ###################  Compiler specific Intrinsics  ########################### */\n/** \\defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics\n  Access to dedicated SIMD instructions\n  @{\n*/\n\n#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     )\n\n#define __SADD8                           __sadd8\n#define __QADD8                           __qadd8\n#define __SHADD8                          __shadd8\n#define __UADD8                           __uadd8\n#define __UQADD8                          __uqadd8\n#define __UHADD8                          __uhadd8\n#define __SSUB8                           __ssub8\n#define __QSUB8                           __qsub8\n#define __SHSUB8                          __shsub8\n#define __USUB8                           __usub8\n#define __UQSUB8                          __uqsub8\n#define __UHSUB8                          __uhsub8\n#define __SADD16                          __sadd16\n#define __QADD16                          __qadd16\n#define __SHADD16                         __shadd16\n#define __UADD16                          __uadd16\n#define __UQADD16                         __uqadd16\n#define __UHADD16                         __uhadd16\n#define __SSUB16                          __ssub16\n#define __QSUB16                          __qsub16\n#define __SHSUB16                         __shsub16\n#define __USUB16                          __usub16\n#define __UQSUB16                         __uqsub16\n#define __UHSUB16                         __uhsub16\n#define __SASX                            __sasx\n#define __QASX                            __qasx\n#define __SHASX                           __shasx\n#define __UASX                            __uasx\n#define __UQASX                           __uqasx\n#define __UHASX                           __uhasx\n#define __SSAX                            __ssax\n#define __QSAX                            __qsax\n#define __SHSAX                           __shsax\n#define __USAX                            __usax\n#define __UQSAX                           __uqsax\n#define __UHSAX                           __uhsax\n#define __USAD8                           __usad8\n#define __USADA8                          __usada8\n#define __SSAT16                          __ssat16\n#define __USAT16                          __usat16\n#define __UXTB16                          __uxtb16\n#define __UXTAB16                         __uxtab16\n#define __SXTB16                          __sxtb16\n#define __SXTAB16                         __sxtab16\n#define __SMUAD                           __smuad\n#define __SMUADX                          __smuadx\n#define __SMLAD                           __smlad\n#define __SMLADX                          __smladx\n#define __SMLALD                          __smlald\n#define __SMLALDX                         __smlaldx\n#define __SMUSD                           __smusd\n#define __SMUSDX                          __smusdx\n#define __SMLSD                           __smlsd\n#define __SMLSDX                          __smlsdx\n#define __SMLSLD                          __smlsld\n#define __SMLSLDX                         __smlsldx\n#define __SEL                             __sel\n#define __QADD                            __qadd\n#define __QSUB                            __qsub\n\n#define __PKHBT(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0x0000FFFFUL) |  \\\n                                           ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL)  )\n\n#define __PKHTB(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0xFFFF0000UL) |  \\\n                                           ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL)  )\n\n#define __SMMLA(ARG1,ARG2,ARG3)          ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \\\n                                                      ((int64_t)(ARG3) << 32U)     ) >> 32U))\n\n#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1))     ) */\n/*@} end of group CMSIS_SIMD_intrinsics */\n\n\n#endif /* __CMSIS_ARMCC_H */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/cmsis_armclang.h",
    "content": "/**************************************************************************//**\n * @file     cmsis_armclang.h\n * @brief    CMSIS compiler ARMCLANG (ARM compiler V6) header file\n * @version  V5.0.1\n * @date     02. February 2017\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2017 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef __CMSIS_ARMCLANG_H\n#define __CMSIS_ARMCLANG_H\n\n#ifndef __ARM_COMPAT_H\n#include <arm_compat.h>    /* Compatibility header for ARM Compiler 5 intrinsics */\n#endif\n\n/* CMSIS compiler specific defines */\n#ifndef   __ASM\n  #define __ASM                     __asm\n#endif\n#ifndef   __INLINE\n  #define __INLINE                  __inline\n#endif\n#ifndef   __STATIC_INLINE\n  #define __STATIC_INLINE           static __inline\n#endif\n#ifndef   __NO_RETURN\n  #define __NO_RETURN               __attribute__((noreturn))\n#endif\n#ifndef   __USED\n  #define __USED                    __attribute__((used))\n#endif\n#ifndef   __WEAK\n  #define __WEAK                    __attribute__((weak))\n#endif\n#ifndef   __UNALIGNED_UINT32\n  #pragma clang diagnostic push\n  #pragma clang diagnostic ignored \"-Wpacked\"\n  struct __attribute__((packed)) T_UINT32 { uint32_t v; };\n  #pragma clang diagnostic pop\n  #define __UNALIGNED_UINT32(x)     (((struct T_UINT32 *)(x))->v)\n#endif\n#ifndef   __ALIGNED\n  #define __ALIGNED(x)              __attribute__((aligned(x)))\n#endif\n#ifndef   __PACKED\n  #define __PACKED                  __attribute__((packed, aligned(1)))\n#endif\n#ifndef   __PACKED_STRUCT\n  #define __PACKED_STRUCT           struct __attribute__((packed, aligned(1)))\n#endif\n\n\n/* ###########################  Core Function Access  ########################### */\n/** \\ingroup  CMSIS_Core_FunctionInterface\n    \\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions\n  @{\n */\n\n/**\n  \\brief   Enable IRQ Interrupts\n  \\details Enables IRQ interrupts by clearing the I-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n/* intrinsic void __enable_irq();  see arm_compat.h */\n\n\n/**\n  \\brief   Disable IRQ Interrupts\n  \\details Disables IRQ interrupts by setting the I-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n/* intrinsic void __disable_irq();  see arm_compat.h */\n\n\n/**\n  \\brief   Get Control Register\n  \\details Returns the content of the Control Register.\n  \\return               Control Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_CONTROL(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, control\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Control Register (non-secure)\n  \\details Returns the content of the non-secure Control Register when in secure mode.\n  \\return               non-secure Control Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_CONTROL_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, control_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Control Register\n  \\details Writes the given value to the Control Register.\n  \\param [in]    control  Control Register value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_CONTROL(uint32_t control)\n{\n  __ASM volatile (\"MSR control, %0\" : : \"r\" (control) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Control Register (non-secure)\n  \\details Writes the given value to the non-secure Control Register when in secure state.\n  \\param [in]    control  Control Register value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_CONTROL_NS(uint32_t control)\n{\n  __ASM volatile (\"MSR control_ns, %0\" : : \"r\" (control) : \"memory\");\n}\n#endif\n\n\n/**\n  \\brief   Get IPSR Register\n  \\details Returns the content of the IPSR Register.\n  \\return               IPSR Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_IPSR(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, ipsr\" : \"=r\" (result) );\n  return(result);\n}\n\n\n/**\n  \\brief   Get APSR Register\n  \\details Returns the content of the APSR Register.\n  \\return               APSR Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_APSR(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, apsr\" : \"=r\" (result) );\n  return(result);\n}\n\n\n/**\n  \\brief   Get xPSR Register\n  \\details Returns the content of the xPSR Register.\n  \\return               xPSR Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, xpsr\" : \"=r\" (result) );\n  return(result);\n}\n\n\n/**\n  \\brief   Get Process Stack Pointer\n  \\details Returns the current value of the Process Stack Pointer (PSP).\n  \\return               PSP Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, psp\"  : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Process Stack Pointer (non-secure)\n  \\details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.\n  \\return               PSP Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSP_NS(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, psp_ns\"  : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Process Stack Pointer\n  \\details Assigns the given value to the Process Stack Pointer (PSP).\n  \\param [in]    topOfProcStack  Process Stack Pointer value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)\n{\n  __ASM volatile (\"MSR psp, %0\" : : \"r\" (topOfProcStack) : );\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Process Stack Pointer (non-secure)\n  \\details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.\n  \\param [in]    topOfProcStack  Process Stack Pointer value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack)\n{\n  __ASM volatile (\"MSR psp_ns, %0\" : : \"r\" (topOfProcStack) : );\n}\n#endif\n\n\n/**\n  \\brief   Get Main Stack Pointer\n  \\details Returns the current value of the Main Stack Pointer (MSP).\n  \\return               MSP Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, msp\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Main Stack Pointer (non-secure)\n  \\details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.\n  \\return               MSP Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSP_NS(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, msp_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Main Stack Pointer\n  \\details Assigns the given value to the Main Stack Pointer (MSP).\n  \\param [in]    topOfMainStack  Main Stack Pointer value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)\n{\n  __ASM volatile (\"MSR msp, %0\" : : \"r\" (topOfMainStack) : );\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Main Stack Pointer (non-secure)\n  \\details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.\n  \\param [in]    topOfMainStack  Main Stack Pointer value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack)\n{\n  __ASM volatile (\"MSR msp_ns, %0\" : : \"r\" (topOfMainStack) : );\n}\n#endif\n\n\n/**\n  \\brief   Get Priority Mask\n  \\details Returns the current state of the priority mask bit from the Priority Mask Register.\n  \\return               Priority Mask value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PRIMASK(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, primask\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Priority Mask (non-secure)\n  \\details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state.\n  \\return               Priority Mask value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PRIMASK_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, primask_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Priority Mask\n  \\details Assigns the given value to the Priority Mask Register.\n  \\param [in]    priMask  Priority Mask\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)\n{\n  __ASM volatile (\"MSR primask, %0\" : : \"r\" (priMask) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Priority Mask (non-secure)\n  \\details Assigns the given value to the non-secure Priority Mask Register when in secure state.\n  \\param [in]    priMask  Priority Mask\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PRIMASK_NS(uint32_t priMask)\n{\n  __ASM volatile (\"MSR primask_ns, %0\" : : \"r\" (priMask) : \"memory\");\n}\n#endif\n\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Enable FIQ\n  \\details Enables FIQ interrupts by clearing the F-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n#define __enable_fault_irq                __enable_fiq   /* see arm_compat.h */\n\n\n/**\n  \\brief   Disable FIQ\n  \\details Disables FIQ interrupts by setting the F-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n#define __disable_fault_irq               __disable_fiq   /* see arm_compat.h */\n\n\n/**\n  \\brief   Get Base Priority\n  \\details Returns the current value of the Base Priority register.\n  \\return               Base Priority register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_BASEPRI(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, basepri\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Base Priority (non-secure)\n  \\details Returns the current value of the non-secure Base Priority register when in secure state.\n  \\return               Base Priority register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_BASEPRI_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, basepri_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Base Priority\n  \\details Assigns the given value to the Base Priority register.\n  \\param [in]    basePri  Base Priority value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI(uint32_t basePri)\n{\n  __ASM volatile (\"MSR basepri, %0\" : : \"r\" (basePri) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Base Priority (non-secure)\n  \\details Assigns the given value to the non-secure Base Priority register when in secure state.\n  \\param [in]    basePri  Base Priority value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_BASEPRI_NS(uint32_t basePri)\n{\n  __ASM volatile (\"MSR basepri_ns, %0\" : : \"r\" (basePri) : \"memory\");\n}\n#endif\n\n\n/**\n  \\brief   Set Base Priority with condition\n  \\details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,\n           or the new value increases the BASEPRI priority level.\n  \\param [in]    basePri  Base Priority value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri)\n{\n  __ASM volatile (\"MSR basepri_max, %0\" : : \"r\" (basePri) : \"memory\");\n}\n\n\n/**\n  \\brief   Get Fault Mask\n  \\details Returns the current value of the Fault Mask register.\n  \\return               Fault Mask register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FAULTMASK(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, faultmask\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Fault Mask (non-secure)\n  \\details Returns the current value of the non-secure Fault Mask register when in secure state.\n  \\return               Fault Mask register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FAULTMASK_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, faultmask_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Fault Mask\n  \\details Assigns the given value to the Fault Mask register.\n  \\param [in]    faultMask  Fault Mask value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)\n{\n  __ASM volatile (\"MSR faultmask, %0\" : : \"r\" (faultMask) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Fault Mask (non-secure)\n  \\details Assigns the given value to the non-secure Fault Mask register when in secure state.\n  \\param [in]    faultMask  Fault Mask value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask)\n{\n  __ASM volatile (\"MSR faultmask_ns, %0\" : : \"r\" (faultMask) : \"memory\");\n}\n#endif\n\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\n\n/**\n  \\brief   Get Process Stack Pointer Limit\n  \\details Returns the current value of the Process Stack Pointer Limit (PSPLIM).\n  \\return               PSPLIM Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSPLIM(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, psplim\"  : \"=r\" (result) );\n  return(result);\n}\n\n\n#if ((defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3)) && \\\n     (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Get Process Stack Pointer Limit (non-secure)\n  \\details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.\n  \\return               PSPLIM Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSPLIM_NS(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, psplim_ns\"  : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Process Stack Pointer Limit\n  \\details Assigns the given value to the Process Stack Pointer Limit (PSPLIM).\n  \\param [in]    ProcStackPtrLimit  Process Stack Pointer Limit value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit)\n{\n  __ASM volatile (\"MSR psplim, %0\" : : \"r\" (ProcStackPtrLimit));\n}\n\n\n#if ((defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3)) && \\\n     (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Set Process Stack Pointer (non-secure)\n  \\details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.\n  \\param [in]    ProcStackPtrLimit  Process Stack Pointer Limit value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit)\n{\n  __ASM volatile (\"MSR psplim_ns, %0\\n\" : : \"r\" (ProcStackPtrLimit));\n}\n#endif\n\n\n/**\n  \\brief   Get Main Stack Pointer Limit\n  \\details Returns the current value of the Main Stack Pointer Limit (MSPLIM).\n  \\return               MSPLIM Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSPLIM(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, msplim\" : \"=r\" (result) );\n\n  return(result);\n}\n\n\n#if ((defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3)) && \\\n     (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Get Main Stack Pointer Limit (non-secure)\n  \\details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state.\n  \\return               MSPLIM Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSPLIM_NS(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, msplim_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Main Stack Pointer Limit\n  \\details Assigns the given value to the Main Stack Pointer Limit (MSPLIM).\n  \\param [in]    MainStackPtrLimit  Main Stack Pointer Limit value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_MSPLIM(uint32_t MainStackPtrLimit)\n{\n  __ASM volatile (\"MSR msplim, %0\" : : \"r\" (MainStackPtrLimit));\n}\n\n\n#if ((defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3)) && \\\n     (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Set Main Stack Pointer Limit (non-secure)\n  \\details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state.\n  \\param [in]    MainStackPtrLimit  Main Stack Pointer value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit)\n{\n  __ASM volatile (\"MSR msplim_ns, %0\" : : \"r\" (MainStackPtrLimit));\n}\n#endif\n\n#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n\n/**\n  \\brief   Get FPSCR\n  \\details Returns the current value of the Floating Point Status/Control register.\n  \\return               Floating Point Status/Control register value\n */\n/* #define __get_FPSCR      __builtin_arm_get_fpscr */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void)\n{\n#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\\n     (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\n  uint32_t result;\n\n  __ASM volatile (\"VMRS %0, fpscr\" : \"=r\" (result) );\n  return(result);\n#else\n  return(0U);\n#endif\n}\n\n\n/**\n  \\brief   Set FPSCR\n  \\details Assigns the given value to the Floating Point Status/Control register.\n  \\param [in]    fpscr  Floating Point Status/Control value to set\n */\n/* #define __set_FPSCR      __builtin_arm_set_fpscr */\n__attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)\n{\n#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\\n     (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\n  __ASM volatile (\"VMSR fpscr, %0\" : : \"r\" (fpscr) : \"memory\");\n#else\n  (void)fpscr;\n#endif\n}\n\n#endif /* ((defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\n\n\n\n/*@} end of CMSIS_Core_RegAccFunctions */\n\n\n/* ##########################  Core Instruction Access  ######################### */\n/** \\defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface\n  Access to dedicated instructions\n  @{\n*/\n\n/* Define macros for porting to both thumb1 and thumb2.\n * For thumb1, use low register (r0-r7), specified by constraint \"l\"\n * Otherwise, use general registers, specified by constraint \"r\" */\n#if defined (__thumb__) && !defined (__thumb2__)\n#define __CMSIS_GCC_OUT_REG(r) \"=l\" (r)\n#define __CMSIS_GCC_USE_REG(r) \"l\" (r)\n#else\n#define __CMSIS_GCC_OUT_REG(r) \"=r\" (r)\n#define __CMSIS_GCC_USE_REG(r) \"r\" (r)\n#endif\n\n/**\n  \\brief   No Operation\n  \\details No Operation does nothing. This instruction can be used for code alignment purposes.\n */\n#define __NOP          __builtin_arm_nop\n\n/**\n  \\brief   Wait For Interrupt\n  \\details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.\n */\n#define __WFI          __builtin_arm_wfi\n\n\n/**\n  \\brief   Wait For Event\n  \\details Wait For Event is a hint instruction that permits the processor to enter\n           a low-power state until one of a number of events occurs.\n */\n#define __WFE          __builtin_arm_wfe\n\n\n/**\n  \\brief   Send Event\n  \\details Send Event is a hint instruction. It causes an event to be signaled to the CPU.\n */\n#define __SEV          __builtin_arm_sev\n\n\n/**\n  \\brief   Instruction Synchronization Barrier\n  \\details Instruction Synchronization Barrier flushes the pipeline in the processor,\n           so that all instructions following the ISB are fetched from cache or memory,\n           after the instruction has been completed.\n */\n#define __ISB()        __builtin_arm_isb(0xF);\n\n/**\n  \\brief   Data Synchronization Barrier\n  \\details Acts as a special kind of Data Memory Barrier.\n           It completes when all explicit memory accesses before this instruction complete.\n */\n#define __DSB()        __builtin_arm_dsb(0xF);\n\n\n/**\n  \\brief   Data Memory Barrier\n  \\details Ensures the apparent order of the explicit memory operations before\n           and after the instruction, without ensuring their completion.\n */\n#define __DMB()        __builtin_arm_dmb(0xF);\n\n\n/**\n  \\brief   Reverse byte order (32 bit)\n  \\details Reverses the byte order in integer value.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n#define __REV          __builtin_bswap32\n\n\n/**\n  \\brief   Reverse byte order (16 bit)\n  \\details Reverses the byte order in two unsigned short values.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n#define __REV16          __builtin_bswap16                /* ToDo ARMCLANG: check if __builtin_bswap16 could be used */\n#if 0\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value)\n{\n  uint32_t result;\n\n  __ASM volatile (\"rev16 %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Reverse byte order in signed short value\n  \\details Reverses the byte order in a signed short value with sign extension to integer.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n                                                          /* ToDo ARMCLANG: check if __builtin_bswap16 could be used */\n__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value)\n{\n  int32_t result;\n\n  __ASM volatile (\"revsh %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return(result);\n}\n\n\n/**\n  \\brief   Rotate Right in unsigned value (32 bit)\n  \\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.\n  \\param [in]    op1  Value to rotate\n  \\param [in]    op2  Number of Bits to rotate\n  \\return               Rotated value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)\n{\n  return (op1 >> op2) | (op1 << (32U - op2));\n}\n\n\n/**\n  \\brief   Breakpoint\n  \\details Causes the processor to enter Debug state.\n           Debug tools can use this to investigate system state when the instruction at a particular address is reached.\n  \\param [in]    value  is ignored by the processor.\n                 If required, a debugger can use it to store additional information about the breakpoint.\n */\n#define __BKPT(value)                       __ASM volatile (\"bkpt \"#value)\n\n\n/**\n  \\brief   Reverse bit order of value\n  \\details Reverses the bit order of the given value.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n                                                          /* ToDo ARMCLANG: check if __builtin_arm_rbit is supported */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)\n{\n  uint32_t result;\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n   __ASM volatile (\"rbit %0, %1\" : \"=r\" (result) : \"r\" (value) );\n#else\n  int32_t s = (4 /*sizeof(v)*/ * 8) - 1; /* extra shift needed at end */\n\n  result = value;                      /* r will be reversed bits of v; first get LSB of v */\n  for (value >>= 1U; value; value >>= 1U)\n  {\n    result <<= 1U;\n    result |= value & 1U;\n    s--;\n  }\n  result <<= s;                        /* shift when v's highest bits are zero */\n#endif\n  return(result);\n}\n\n\n/**\n  \\brief   Count leading zeros\n  \\details Counts the number of leading zeros of a data value.\n  \\param [in]  value  Value to count the leading zeros\n  \\return             number of leading zeros in value\n */\n#define __CLZ             __builtin_clz\n\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\n/**\n  \\brief   LDR Exclusive (8 bit)\n  \\details Executes a exclusive LDR instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n#define __LDREXB        (uint8_t)__builtin_arm_ldrex\n\n\n/**\n  \\brief   LDR Exclusive (16 bit)\n  \\details Executes a exclusive LDR instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n#define __LDREXH        (uint16_t)__builtin_arm_ldrex\n\n\n/**\n  \\brief   LDR Exclusive (32 bit)\n  \\details Executes a exclusive LDR instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n#define __LDREXW        (uint32_t)__builtin_arm_ldrex\n\n\n/**\n  \\brief   STR Exclusive (8 bit)\n  \\details Executes a exclusive STR instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n#define __STREXB        (uint32_t)__builtin_arm_strex\n\n\n/**\n  \\brief   STR Exclusive (16 bit)\n  \\details Executes a exclusive STR instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n#define __STREXH        (uint32_t)__builtin_arm_strex\n\n\n/**\n  \\brief   STR Exclusive (32 bit)\n  \\details Executes a exclusive STR instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n#define __STREXW        (uint32_t)__builtin_arm_strex\n\n\n/**\n  \\brief   Remove the exclusive lock\n  \\details Removes the exclusive lock which is created by LDREX.\n */\n#define __CLREX             __builtin_arm_clrex\n\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Signed Saturate\n  \\details Saturates a signed value.\n  \\param [in]  value  Value to be saturated\n  \\param [in]    sat  Bit position to saturate to (1..32)\n  \\return             Saturated value\n */\n#define __SSAT             __builtin_arm_ssat\n\n\n/**\n  \\brief   Unsigned Saturate\n  \\details Saturates an unsigned value.\n  \\param [in]  value  Value to be saturated\n  \\param [in]    sat  Bit position to saturate to (0..31)\n  \\return             Saturated value\n */\n#define __USAT             __builtin_arm_usat\n\n\n/**\n  \\brief   Rotate Right with Extend (32 bit)\n  \\details Moves each bit of a bitstring right by one bit.\n           The carry input is shifted in at the left end of the bitstring.\n  \\param [in]    value  Value to rotate\n  \\return               Rotated value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value)\n{\n  uint32_t result;\n\n  __ASM volatile (\"rrx %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return(result);\n}\n\n\n/**\n  \\brief   LDRT Unprivileged (8 bit)\n  \\details Executes a Unprivileged LDRT instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *ptr)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ldrbt %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n  return ((uint8_t) result);    /* Add explicit type cast here */\n}\n\n\n/**\n  \\brief   LDRT Unprivileged (16 bit)\n  \\details Executes a Unprivileged LDRT instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *ptr)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ldrht %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n  return ((uint16_t) result);    /* Add explicit type cast here */\n}\n\n\n/**\n  \\brief   LDRT Unprivileged (32 bit)\n  \\details Executes a Unprivileged LDRT instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *ptr)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ldrt %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n  return(result);\n}\n\n\n/**\n  \\brief   STRT Unprivileged (8 bit)\n  \\details Executes a Unprivileged STRT instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *ptr)\n{\n  __ASM volatile (\"strbt %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   STRT Unprivileged (16 bit)\n  \\details Executes a Unprivileged STRT instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *ptr)\n{\n  __ASM volatile (\"strht %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   STRT Unprivileged (32 bit)\n  \\details Executes a Unprivileged STRT instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *ptr)\n{\n  __ASM volatile (\"strt %1, %0\" : \"=Q\" (*ptr) : \"r\" (value) );\n}\n\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\n/**\n  \\brief   Load-Acquire (8 bit)\n  \\details Executes a LDAB instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAB(volatile uint8_t *ptr)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ldab %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n  return ((uint8_t) result);\n}\n\n\n/**\n  \\brief   Load-Acquire (16 bit)\n  \\details Executes a LDAH instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAH(volatile uint16_t *ptr)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ldah %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n  return ((uint16_t) result);\n}\n\n\n/**\n  \\brief   Load-Acquire (32 bit)\n  \\details Executes a LDA instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDA(volatile uint32_t *ptr)\n{\n  uint32_t result;\n\n  __ASM volatile (\"lda %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n  return(result);\n}\n\n\n/**\n  \\brief   Store-Release (8 bit)\n  \\details Executes a STLB instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STLB(uint8_t value, volatile uint8_t *ptr)\n{\n  __ASM volatile (\"stlb %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   Store-Release (16 bit)\n  \\details Executes a STLH instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STLH(uint16_t value, volatile uint16_t *ptr)\n{\n  __ASM volatile (\"stlh %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   Store-Release (32 bit)\n  \\details Executes a STL instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STL(uint32_t value, volatile uint32_t *ptr)\n{\n  __ASM volatile (\"stl %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   Load-Acquire Exclusive (8 bit)\n  \\details Executes a LDAB exclusive instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n#define     __LDAEXB                 (uint8_t)__builtin_arm_ldaex\n\n\n/**\n  \\brief   Load-Acquire Exclusive (16 bit)\n  \\details Executes a LDAH exclusive instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n#define     __LDAEXH                 (uint16_t)__builtin_arm_ldaex\n\n\n/**\n  \\brief   Load-Acquire Exclusive (32 bit)\n  \\details Executes a LDA exclusive instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n#define     __LDAEX                  (uint32_t)__builtin_arm_ldaex\n\n\n/**\n  \\brief   Store-Release Exclusive (8 bit)\n  \\details Executes a STLB exclusive instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n#define     __STLEXB                 (uint32_t)__builtin_arm_stlex\n\n\n/**\n  \\brief   Store-Release Exclusive (16 bit)\n  \\details Executes a STLH exclusive instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n#define     __STLEXH                 (uint32_t)__builtin_arm_stlex\n\n\n/**\n  \\brief   Store-Release Exclusive (32 bit)\n  \\details Executes a STL exclusive instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n#define     __STLEX                  (uint32_t)__builtin_arm_stlex\n\n#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\n\n/*@}*/ /* end of group CMSIS_Core_InstructionInterface */\n\n\n/* ###################  Compiler specific Intrinsics  ########################### */\n/** \\defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics\n  Access to dedicated SIMD instructions\n  @{\n*/\n\n#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ssub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ssub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ssax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usad8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usada8 %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n#define __SSAT16(ARG1,ARG2) \\\n({                          \\\n  int32_t __RES, __ARG1 = (ARG1); \\\n  __ASM (\"ssat16 %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) ); \\\n  __RES; \\\n })\n\n#define __USAT16(ARG1,ARG2) \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1); \\\n  __ASM (\"usat16 %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) ); \\\n  __RES; \\\n })\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uxtb16 %0, %1\" : \"=r\" (result) : \"r\" (op1));\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uxtab16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sxtb16 %0, %1\" : \"=r\" (result) : \"r\" (op1));\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sxtab16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUAD  (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smuad %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smuadx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smlad %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smladx %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\n  __ASM volatile (\"smlald %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\n#else               /* Big endian */\n  __ASM volatile (\"smlald %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\n#endif\n\n  return(llr.w64);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\n  __ASM volatile (\"smlaldx %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\n#else               /* Big endian */\n  __ASM volatile (\"smlaldx %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\n#endif\n\n  return(llr.w64);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSD  (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smusd %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smusdx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smlsd %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smlsdx %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\n  __ASM volatile (\"smlsld %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\n#else               /* Big endian */\n  __ASM volatile (\"smlsld %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\n#endif\n\n  return(llr.w64);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\n  __ASM volatile (\"smlsldx %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\n#else               /* Big endian */\n  __ASM volatile (\"smlsldx %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\n#endif\n\n  return(llr.w64);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SEL  (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sel %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE  int32_t __QADD( int32_t op1,  int32_t op2)\n{\n  int32_t result;\n\n  __ASM volatile (\"qadd %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE  int32_t __QSUB( int32_t op1,  int32_t op2)\n{\n  int32_t result;\n\n  __ASM volatile (\"qsub %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n#if 0\n#define __PKHBT(ARG1,ARG2,ARG3) \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\\n  __ASM (\"pkhbt %0, %1, %2, lsl %3\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2), \"I\" (ARG3)  ); \\\n  __RES; \\\n })\n\n#define __PKHTB(ARG1,ARG2,ARG3) \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\\n  if (ARG3 == 0) \\\n    __ASM (\"pkhtb %0, %1, %2\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2)  ); \\\n  else \\\n    __ASM (\"pkhtb %0, %1, %2, asr %3\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2), \"I\" (ARG3)  ); \\\n  __RES; \\\n })\n#endif\n\n#define __PKHBT(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0x0000FFFFUL) |  \\\n                                           ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL)  )\n\n#define __PKHTB(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0xFFFF0000UL) |  \\\n                                           ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL)  )\n\n__attribute__((always_inline)) __STATIC_INLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)\n{\n  int32_t result;\n\n  __ASM volatile (\"smmla %0, %1, %2, %3\" : \"=r\" (result): \"r\"  (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n#endif /* (__ARM_FEATURE_DSP == 1) */\n/*@} end of group CMSIS_SIMD_intrinsics */\n\n\n#endif /* __CMSIS_ARMCLANG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/cmsis_compiler.h",
    "content": "/**************************************************************************//**\n * @file     cmsis_compiler.h\n * @brief    CMSIS compiler generic header file\n * @version  V5.0.1\n * @date     30. January 2017\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2017 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef __CMSIS_COMPILER_H\n#define __CMSIS_COMPILER_H\n\n#include <stdint.h>\n\n/*\n * ARM Compiler 4/5\n */\n#if   defined ( __CC_ARM )\n  #include \"cmsis_armcc.h\"\n\n\n/*\n * ARM Compiler 6 (armclang)\n */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #include \"cmsis_armclang.h\"\n\n\n/*\n * GNU Compiler\n */\n#elif defined ( __GNUC__ )\n  #include \"cmsis_gcc.h\"\n\n\n/*\n * IAR Compiler\n */\n#elif defined ( __ICCARM__ )\n\n  #ifndef   __ASM\n    #define __ASM                     __asm\n  #endif\n  #ifndef   __INLINE\n    #define __INLINE                  inline\n  #endif\n  #ifndef   __STATIC_INLINE\n    #define __STATIC_INLINE           static inline\n  #endif\n\n  #include <cmsis_iar.h>\n\n  #ifndef   __NO_RETURN\n    #define __NO_RETURN               __noreturn\n  #endif\n  #ifndef   __USED\n    #define __USED                    __root\n  #endif\n  #ifndef   __WEAK\n    #define __WEAK                    __weak\n  #endif\n  #ifndef   __UNALIGNED_UINT32\n    __packed struct T_UINT32 { uint32_t v; };\n      #define __UNALIGNED_UINT32(x)     (((struct T_UINT32 *)(x))->v)\n  #endif\n  #ifndef   __ALIGNED\n    #define __ALIGNED(x)\n  #endif\n  #ifndef   __PACKED\n    #define __PACKED                  __packed\n  #endif\n  #ifndef   __PACKED_STRUCT\n    #define __PACKED_STRUCT           __packed struct\n  #endif\n\n\n/*\n * TI ARM Compiler\n */\n#elif defined ( __TI_ARM__ )\n  #include <cmsis_ccs.h>\n\n  #ifndef   __ASM\n    #define __ASM                     __asm\n  #endif\n  #ifndef   __INLINE\n    #define __INLINE                  inline\n  #endif\n  #ifndef   __STATIC_INLINE\n    #define __STATIC_INLINE           static inline\n  #endif\n  #ifndef   __NO_RETURN\n    #define __NO_RETURN               __attribute__((noreturn))\n  #endif\n  #ifndef   __USED\n    #define __USED                    __attribute__((used))\n  #endif\n  #ifndef   __WEAK\n    #define __WEAK                    __attribute__((weak))\n  #endif\n  #ifndef   __UNALIGNED_UINT32\n    struct __attribute__((packed)) T_UINT32 { uint32_t v; };\n    #define __UNALIGNED_UINT32(x)     (((struct T_UINT32 *)(x))->v)\n  #endif\n  #ifndef   __ALIGNED\n    #define __ALIGNED(x)              __attribute__((aligned(x)))\n  #endif\n  #ifndef   __PACKED\n    #define __PACKED                  __attribute__((packed))\n  #endif\n  #ifndef   __PACKED_STRUCT\n    #define __PACKED_STRUCT           struct __attribute__((packed))\n  #endif\n\n\n/*\n * TASKING Compiler\n */\n#elif defined ( __TASKING__ )\n  /*\n   * The CMSIS functions have been implemented as intrinsics in the compiler.\n   * Please use \"carm -?i\" to get an up to date list of all intrinsics,\n   * Including the CMSIS ones.\n   */\n\n  #ifndef   __ASM\n    #define __ASM                     __asm\n  #endif\n  #ifndef   __INLINE\n    #define __INLINE                  inline\n  #endif\n  #ifndef   __STATIC_INLINE\n    #define __STATIC_INLINE           static inline\n  #endif\n  #ifndef   __NO_RETURN\n    #define __NO_RETURN               __attribute__((noreturn))\n  #endif\n  #ifndef   __USED\n    #define __USED                    __attribute__((used))\n  #endif\n  #ifndef   __WEAK\n    #define __WEAK                    __attribute__((weak))\n  #endif\n  #ifndef   __UNALIGNED_UINT32\n    struct __packed__ T_UINT32 { uint32_t v; };\n    #define __UNALIGNED_UINT32(x)     (((struct T_UINT32 *)(x))->v)\n  #endif\n  #ifndef   __ALIGNED\n    #define __ALIGNED(x)              __align(x)\n  #endif\n  #ifndef   __PACKED\n    #define __PACKED                  __packed__\n  #endif\n  #ifndef   __PACKED_STRUCT\n    #define __PACKED_STRUCT           struct __packed__\n  #endif\n\n\n/*\n * COSMIC Compiler\n */\n#elif defined ( __CSMC__ )\n   #include <cmsis_csm.h>\n\n #ifndef   __ASM\n    #define __ASM                     _asm\n  #endif\n  #ifndef   __INLINE\n    #define __INLINE                  inline\n  #endif\n  #ifndef   __STATIC_INLINE\n    #define __STATIC_INLINE           static inline\n  #endif\n  #ifndef   __NO_RETURN\n    // NO RETURN is automatically detected hence no warning here\n    #define __NO_RETURN\n  #endif\n  #ifndef   __USED\n    #warning No compiler specific solution for __USED. __USED is ignored.\n    #define __USED\n  #endif\n  #ifndef   __WEAK\n    #define __WEAK                    __weak\n  #endif\n  #ifndef   __UNALIGNED_UINT32\n    @packed struct T_UINT32 { uint32_t v; };\n    #define __UNALIGNED_UINT32(x)     (((struct T_UINT32 *)(x))->v)\n  #endif\n  #ifndef   __ALIGNED\n    #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored.\n    #define __ALIGNED(x)\n  #endif\n  #ifndef   __PACKED\n    #define __PACKED                  @packed\n  #endif\n  #ifndef   __PACKED_STRUCT\n    #define __PACKED_STRUCT           @packed struct\n  #endif\n\n\n#else\n  #error Unknown compiler.\n#endif\n\n  /**\n   * @brief definition to read/write two 16 bit values.\n   */\n#if   defined ( __CC_ARM )\n  #define __SIMD32_TYPE int32_t __packed\n  #define CMSIS_UNUSED __attribute__((unused))\n  #define CMSIS_INLINE __attribute__((always_inline))\n\n#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 )\n  #define __SIMD32_TYPE int32_t\n  #define CMSIS_UNUSED __attribute__((unused))\n  #define CMSIS_INLINE __attribute__((always_inline))\n\n#elif defined ( __GNUC__ )\n  #define __SIMD32_TYPE int32_t\n  #define CMSIS_UNUSED __attribute__((unused))\n  #define CMSIS_INLINE __attribute__((always_inline))\n\n#elif defined ( __ICCARM__ )\n  #define __SIMD32_TYPE int32_t __packed\n  #define CMSIS_UNUSED\n  #define CMSIS_INLINE\n\n#elif defined ( __TI_ARM__ )\n  #define __SIMD32_TYPE int32_t\n  #define CMSIS_UNUSED __attribute__((unused))\n  #define CMSIS_INLINE\n\n#elif defined ( __CSMC__ )\n  #define __SIMD32_TYPE int32_t\n  #define CMSIS_UNUSED\n  #define CMSIS_INLINE\n\n#elif defined ( __TASKING__ )\n  #define __SIMD32_TYPE __unaligned int32_t\n  #define CMSIS_UNUSED\n  #define CMSIS_INLINE\n\n#else\n  #error Unknown compiler\n#endif\n\n\n#endif /* __CMSIS_COMPILER_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/cmsis_gcc.h",
    "content": "/**************************************************************************//**\n * @file     cmsis_gcc.h\n * @brief    CMSIS compiler GCC header file\n * @version  V5.0.1\n * @date     02. February 2017\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2017 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef __CMSIS_GCC_H\n#define __CMSIS_GCC_H\n\n/* ignore some GCC warnings */\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wsign-conversion\"\n#pragma GCC diagnostic ignored \"-Wconversion\"\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n\n/* CMSIS compiler specific defines */\n#ifndef   __ASM\n  #define __ASM                     __asm\n#endif\n#ifndef   __INLINE\n  #define __INLINE                  inline\n#endif\n#ifndef   __STATIC_INLINE\n  #define __STATIC_INLINE           static inline\n#endif\n#ifndef   __NO_RETURN\n  #define __NO_RETURN               __attribute__((noreturn))\n#endif\n#ifndef   __USED\n  #define __USED                    __attribute__((used))\n#endif\n#ifndef   __WEAK\n  #define __WEAK                    __attribute__((weak))\n#endif\n#ifndef   __UNALIGNED_UINT32\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wpacked\"\n#pragma GCC diagnostic ignored \"-Wattributes\"\n  struct __attribute__((packed)) T_UINT32 { uint32_t v; };\n#pragma GCC diagnostic pop\n  #define __UNALIGNED_UINT32(x)     (((struct T_UINT32 *)(x))->v)\n#endif\n#ifndef   __ALIGNED\n  #define __ALIGNED(x)              __attribute__((aligned(x)))\n#endif\n#ifndef   __PACKED\n  #define __PACKED                  __attribute__((packed, aligned(1)))\n#endif\n#ifndef   __PACKED_STRUCT\n  #define __PACKED_STRUCT           struct __attribute__((packed, aligned(1)))\n#endif\n\n\n/* ###########################  Core Function Access  ########################### */\n/** \\ingroup  CMSIS_Core_FunctionInterface\n    \\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions\n  @{\n */\n\n/**\n  \\brief   Enable IRQ Interrupts\n  \\details Enables IRQ interrupts by clearing the I-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n__attribute__((always_inline)) __STATIC_INLINE void __enable_irq(void)\n{\n  __ASM volatile (\"cpsie i\" : : : \"memory\");\n}\n\n\n/**\n  \\brief   Disable IRQ Interrupts\n  \\details Disables IRQ interrupts by setting the I-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n__attribute__((always_inline)) __STATIC_INLINE void __disable_irq(void)\n{\n  __ASM volatile (\"cpsid i\" : : : \"memory\");\n}\n\n\n/**\n  \\brief   Get Control Register\n  \\details Returns the content of the Control Register.\n  \\return               Control Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_CONTROL(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, control\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Control Register (non-secure)\n  \\details Returns the content of the non-secure Control Register when in secure mode.\n  \\return               non-secure Control Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_CONTROL_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, control_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Control Register\n  \\details Writes the given value to the Control Register.\n  \\param [in]    control  Control Register value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_CONTROL(uint32_t control)\n{\n  __ASM volatile (\"MSR control, %0\" : : \"r\" (control) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Control Register (non-secure)\n  \\details Writes the given value to the non-secure Control Register when in secure state.\n  \\param [in]    control  Control Register value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_CONTROL_NS(uint32_t control)\n{\n  __ASM volatile (\"MSR control_ns, %0\" : : \"r\" (control) : \"memory\");\n}\n#endif\n\n\n/**\n  \\brief   Get IPSR Register\n  \\details Returns the content of the IPSR Register.\n  \\return               IPSR Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_IPSR(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, ipsr\" : \"=r\" (result) );\n  return(result);\n}\n\n\n/**\n  \\brief   Get APSR Register\n  \\details Returns the content of the APSR Register.\n  \\return               APSR Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_APSR(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, apsr\" : \"=r\" (result) );\n  return(result);\n}\n\n\n/**\n  \\brief   Get xPSR Register\n  \\details Returns the content of the xPSR Register.\n  \\return               xPSR Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_xPSR(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, xpsr\" : \"=r\" (result) );\n  return(result);\n}\n\n\n/**\n  \\brief   Get Process Stack Pointer\n  \\details Returns the current value of the Process Stack Pointer (PSP).\n  \\return               PSP Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSP(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, psp\"  : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Process Stack Pointer (non-secure)\n  \\details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.\n  \\return               PSP Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSP_NS(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, psp_ns\"  : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Process Stack Pointer\n  \\details Assigns the given value to the Process Stack Pointer (PSP).\n  \\param [in]    topOfProcStack  Process Stack Pointer value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)\n{\n  __ASM volatile (\"MSR psp, %0\" : : \"r\" (topOfProcStack) : );\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Process Stack Pointer (non-secure)\n  \\details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.\n  \\param [in]    topOfProcStack  Process Stack Pointer value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack)\n{\n  __ASM volatile (\"MSR psp_ns, %0\" : : \"r\" (topOfProcStack) : );\n}\n#endif\n\n\n/**\n  \\brief   Get Main Stack Pointer\n  \\details Returns the current value of the Main Stack Pointer (MSP).\n  \\return               MSP Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSP(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, msp\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Main Stack Pointer (non-secure)\n  \\details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.\n  \\return               MSP Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSP_NS(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, msp_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Main Stack Pointer\n  \\details Assigns the given value to the Main Stack Pointer (MSP).\n  \\param [in]    topOfMainStack  Main Stack Pointer value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)\n{\n  __ASM volatile (\"MSR msp, %0\" : : \"r\" (topOfMainStack) : );\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Main Stack Pointer (non-secure)\n  \\details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.\n  \\param [in]    topOfMainStack  Main Stack Pointer value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack)\n{\n  __ASM volatile (\"MSR msp_ns, %0\" : : \"r\" (topOfMainStack) : );\n}\n#endif\n\n\n/**\n  \\brief   Get Priority Mask\n  \\details Returns the current state of the priority mask bit from the Priority Mask Register.\n  \\return               Priority Mask value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PRIMASK(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, primask\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Priority Mask (non-secure)\n  \\details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state.\n  \\return               Priority Mask value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PRIMASK_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, primask_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Priority Mask\n  \\details Assigns the given value to the Priority Mask Register.\n  \\param [in]    priMask  Priority Mask\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)\n{\n  __ASM volatile (\"MSR primask, %0\" : : \"r\" (priMask) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Priority Mask (non-secure)\n  \\details Assigns the given value to the non-secure Priority Mask Register when in secure state.\n  \\param [in]    priMask  Priority Mask\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PRIMASK_NS(uint32_t priMask)\n{\n  __ASM volatile (\"MSR primask_ns, %0\" : : \"r\" (priMask) : \"memory\");\n}\n#endif\n\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Enable FIQ\n  \\details Enables FIQ interrupts by clearing the F-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n__attribute__((always_inline)) __STATIC_INLINE void __enable_fault_irq(void)\n{\n  __ASM volatile (\"cpsie f\" : : : \"memory\");\n}\n\n\n/**\n  \\brief   Disable FIQ\n  \\details Disables FIQ interrupts by setting the F-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n__attribute__((always_inline)) __STATIC_INLINE void __disable_fault_irq(void)\n{\n  __ASM volatile (\"cpsid f\" : : : \"memory\");\n}\n\n\n/**\n  \\brief   Get Base Priority\n  \\details Returns the current value of the Base Priority register.\n  \\return               Base Priority register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_BASEPRI(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, basepri\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Base Priority (non-secure)\n  \\details Returns the current value of the non-secure Base Priority register when in secure state.\n  \\return               Base Priority register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_BASEPRI_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, basepri_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Base Priority\n  \\details Assigns the given value to the Base Priority register.\n  \\param [in]    basePri  Base Priority value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI(uint32_t basePri)\n{\n  __ASM volatile (\"MSR basepri, %0\" : : \"r\" (basePri) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Base Priority (non-secure)\n  \\details Assigns the given value to the non-secure Base Priority register when in secure state.\n  \\param [in]    basePri  Base Priority value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_BASEPRI_NS(uint32_t basePri)\n{\n  __ASM volatile (\"MSR basepri_ns, %0\" : : \"r\" (basePri) : \"memory\");\n}\n#endif\n\n\n/**\n  \\brief   Set Base Priority with condition\n  \\details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,\n           or the new value increases the BASEPRI priority level.\n  \\param [in]    basePri  Base Priority value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri)\n{\n  __ASM volatile (\"MSR basepri_max, %0\" : : \"r\" (basePri) : \"memory\");\n}\n\n\n/**\n  \\brief   Get Fault Mask\n  \\details Returns the current value of the Fault Mask register.\n  \\return               Fault Mask register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FAULTMASK(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, faultmask\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Fault Mask (non-secure)\n  \\details Returns the current value of the non-secure Fault Mask register when in secure state.\n  \\return               Fault Mask register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_FAULTMASK_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, faultmask_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Fault Mask\n  \\details Assigns the given value to the Fault Mask register.\n  \\param [in]    faultMask  Fault Mask value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)\n{\n  __ASM volatile (\"MSR faultmask, %0\" : : \"r\" (faultMask) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Fault Mask (non-secure)\n  \\details Assigns the given value to the non-secure Fault Mask register when in secure state.\n  \\param [in]    faultMask  Fault Mask value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask)\n{\n  __ASM volatile (\"MSR faultmask_ns, %0\" : : \"r\" (faultMask) : \"memory\");\n}\n#endif\n\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\n\n/**\n  \\brief   Get Process Stack Pointer Limit\n  \\details Returns the current value of the Process Stack Pointer Limit (PSPLIM).\n  \\return               PSPLIM Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_PSPLIM(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, psplim\"  : \"=r\" (result) );\n  return(result);\n}\n\n\n#if ((defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3)) && \\\n     (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Get Process Stack Pointer Limit (non-secure)\n  \\details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.\n  \\return               PSPLIM Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_PSPLIM_NS(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, psplim_ns\"  : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Process Stack Pointer Limit\n  \\details Assigns the given value to the Process Stack Pointer Limit (PSPLIM).\n  \\param [in]    ProcStackPtrLimit  Process Stack Pointer Limit value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit)\n{\n  __ASM volatile (\"MSR psplim, %0\" : : \"r\" (ProcStackPtrLimit));\n}\n\n\n#if ((defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3)) && \\\n     (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Set Process Stack Pointer (non-secure)\n  \\details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.\n  \\param [in]    ProcStackPtrLimit  Process Stack Pointer Limit value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit)\n{\n  __ASM volatile (\"MSR psplim_ns, %0\\n\" : : \"r\" (ProcStackPtrLimit));\n}\n#endif\n\n\n/**\n  \\brief   Get Main Stack Pointer Limit\n  \\details Returns the current value of the Main Stack Pointer Limit (MSPLIM).\n  \\return               MSPLIM Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_MSPLIM(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, msplim\" : \"=r\" (result) );\n\n  return(result);\n}\n\n\n#if ((defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3)) && \\\n     (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Get Main Stack Pointer Limit (non-secure)\n  \\details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state.\n  \\return               MSPLIM Register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __TZ_get_MSPLIM_NS(void)\n{\n  register uint32_t result;\n\n  __ASM volatile (\"MRS %0, msplim_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Main Stack Pointer Limit\n  \\details Assigns the given value to the Main Stack Pointer Limit (MSPLIM).\n  \\param [in]    MainStackPtrLimit  Main Stack Pointer Limit value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_MSPLIM(uint32_t MainStackPtrLimit)\n{\n  __ASM volatile (\"MSR msplim, %0\" : : \"r\" (MainStackPtrLimit));\n}\n\n\n#if ((defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3)) && \\\n     (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Set Main Stack Pointer Limit (non-secure)\n  \\details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state.\n  \\param [in]    MainStackPtrLimit  Main Stack Pointer value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit)\n{\n  __ASM volatile (\"MSR msplim_ns, %0\" : : \"r\" (MainStackPtrLimit));\n}\n#endif\n\n#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n\n/**\n  \\brief   Get FPSCR\n  \\details Returns the current value of the Floating Point Status/Control register.\n  \\return               Floating Point Status/Control register value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __get_FPSCR(void)\n{\n#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\\n     (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\n  uint32_t result;\n\n  __ASM volatile (\"VMRS %0, fpscr\" : \"=r\" (result) );\n  return(result);\n#else\n   return(0U);\n#endif\n}\n\n\n/**\n  \\brief   Set FPSCR\n  \\details Assigns the given value to the Floating Point Status/Control register.\n  \\param [in]    fpscr  Floating Point Status/Control value to set\n */\n__attribute__((always_inline)) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)\n{\n#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\\n     (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\n  __ASM volatile (\"VMSR fpscr, %0\" : : \"r\" (fpscr) : \"vfpcc\", \"memory\");\n#else\n  (void)fpscr;\n#endif\n}\n\n#endif /* ((defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\n\n\n\n/*@} end of CMSIS_Core_RegAccFunctions */\n\n\n/* ##########################  Core Instruction Access  ######################### */\n/** \\defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface\n  Access to dedicated instructions\n  @{\n*/\n\n/* Define macros for porting to both thumb1 and thumb2.\n * For thumb1, use low register (r0-r7), specified by constraint \"l\"\n * Otherwise, use general registers, specified by constraint \"r\" */\n#if defined (__thumb__) && !defined (__thumb2__)\n#define __CMSIS_GCC_OUT_REG(r) \"=l\" (r)\n#define __CMSIS_GCC_RW_REG(r) \"+l\" (r)\n#define __CMSIS_GCC_USE_REG(r) \"l\" (r)\n#else\n#define __CMSIS_GCC_OUT_REG(r) \"=r\" (r)\n#define __CMSIS_GCC_RW_REG(r) \"+r\" (r)\n#define __CMSIS_GCC_USE_REG(r) \"r\" (r)\n#endif\n\n/**\n  \\brief   No Operation\n  \\details No Operation does nothing. This instruction can be used for code alignment purposes.\n */\n//__attribute__((always_inline)) __STATIC_INLINE void __NOP(void)\n//{\n//  __ASM volatile (\"nop\");\n//}\n#define __NOP()                             __ASM volatile (\"nop\")       /* This implementation generates debug information */\n\n/**\n  \\brief   Wait For Interrupt\n  \\details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.\n */\n//__attribute__((always_inline)) __STATIC_INLINE void __WFI(void)\n//{\n//  __ASM volatile (\"wfi\");\n//}\n#define __WFI()                             __ASM volatile (\"wfi\")       /* This implementation generates debug information */\n\n\n/**\n  \\brief   Wait For Event\n  \\details Wait For Event is a hint instruction that permits the processor to enter\n           a low-power state until one of a number of events occurs.\n */\n//__attribute__((always_inline)) __STATIC_INLINE void __WFE(void)\n//{\n//  __ASM volatile (\"wfe\");\n//}\n#define __WFE()                             __ASM volatile (\"wfe\")       /* This implementation generates debug information */\n\n\n/**\n  \\brief   Send Event\n  \\details Send Event is a hint instruction. It causes an event to be signaled to the CPU.\n */\n//__attribute__((always_inline)) __STATIC_INLINE void __SEV(void)\n//{\n//  __ASM volatile (\"sev\");\n//}\n#define __SEV()                             __ASM volatile (\"sev\")       /* This implementation generates debug information */\n\n\n/**\n  \\brief   Instruction Synchronization Barrier\n  \\details Instruction Synchronization Barrier flushes the pipeline in the processor,\n           so that all instructions following the ISB are fetched from cache or memory,\n           after the instruction has been completed.\n */\n__attribute__((always_inline)) __STATIC_INLINE void __ISB(void)\n{\n  __ASM volatile (\"isb 0xF\":::\"memory\");\n}\n\n\n/**\n  \\brief   Data Synchronization Barrier\n  \\details Acts as a special kind of Data Memory Barrier.\n           It completes when all explicit memory accesses before this instruction complete.\n */\n__attribute__((always_inline)) __STATIC_INLINE void __DSB(void)\n{\n  __ASM volatile (\"dsb 0xF\":::\"memory\");\n}\n\n\n/**\n  \\brief   Data Memory Barrier\n  \\details Ensures the apparent order of the explicit memory operations before\n           and after the instruction, without ensuring their completion.\n */\n__attribute__((always_inline)) __STATIC_INLINE void __DMB(void)\n{\n  __ASM volatile (\"dmb 0xF\":::\"memory\");\n}\n\n\n/**\n  \\brief   Reverse byte order (32 bit)\n  \\details Reverses the byte order in integer value.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV(uint32_t value)\n{\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)\n  return __builtin_bswap32(value);\n#else\n  uint32_t result;\n\n  __ASM volatile (\"rev %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return(result);\n#endif\n}\n\n\n/**\n  \\brief   Reverse byte order (16 bit)\n  \\details Reverses the byte order in two unsigned short values.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __REV16(uint32_t value)\n{\n  uint32_t result;\n\n  __ASM volatile (\"rev16 %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return(result);\n}\n\n\n/**\n  \\brief   Reverse byte order in signed short value\n  \\details Reverses the byte order in a signed short value with sign extension to integer.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n__attribute__((always_inline)) __STATIC_INLINE int32_t __REVSH(int32_t value)\n{\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n  return (short)__builtin_bswap16(value);\n#else\n  int32_t result;\n\n  __ASM volatile (\"revsh %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return(result);\n#endif\n}\n\n\n/**\n  \\brief   Rotate Right in unsigned value (32 bit)\n  \\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.\n  \\param [in]    op1  Value to rotate\n  \\param [in]    op2  Number of Bits to rotate\n  \\return               Rotated value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)\n{\n  return (op1 >> op2) | (op1 << (32U - op2));\n}\n\n\n/**\n  \\brief   Breakpoint\n  \\details Causes the processor to enter Debug state.\n           Debug tools can use this to investigate system state when the instruction at a particular address is reached.\n  \\param [in]    value  is ignored by the processor.\n                 If required, a debugger can use it to store additional information about the breakpoint.\n */\n#define __BKPT(value)                       __ASM volatile (\"bkpt \"#value)\n\n\n/**\n  \\brief   Reverse bit order of value\n  \\details Reverses the bit order of the given value.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value)\n{\n  uint32_t result;\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n   __ASM volatile (\"rbit %0, %1\" : \"=r\" (result) : \"r\" (value) );\n#else\n  int32_t s = (4 /*sizeof(v)*/ * 8) - 1; /* extra shift needed at end */\n\n  result = value;                      /* r will be reversed bits of v; first get LSB of v */\n  for (value >>= 1U; value; value >>= 1U)\n  {\n    result <<= 1U;\n    result |= value & 1U;\n    s--;\n  }\n  result <<= s;                        /* shift when v's highest bits are zero */\n#endif\n  return(result);\n}\n\n\n/**\n  \\brief   Count leading zeros\n  \\details Counts the number of leading zeros of a data value.\n  \\param [in]  value  Value to count the leading zeros\n  \\return             number of leading zeros in value\n */\n#define __CLZ             __builtin_clz\n\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\n/**\n  \\brief   LDR Exclusive (8 bit)\n  \\details Executes a exclusive LDR instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)\n{\n    uint32_t result;\n\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n   __ASM volatile (\"ldrexb %0, %1\" : \"=r\" (result) : \"Q\" (*addr) );\n#else\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\n       accepted by assembler. So has to use following less efficient pattern.\n    */\n   __ASM volatile (\"ldrexb %0, [%1]\" : \"=r\" (result) : \"r\" (addr) : \"memory\" );\n#endif\n   return ((uint8_t) result);    /* Add explicit type cast here */\n}\n\n\n/**\n  \\brief   LDR Exclusive (16 bit)\n  \\details Executes a exclusive LDR instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)\n{\n    uint32_t result;\n\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n   __ASM volatile (\"ldrexh %0, %1\" : \"=r\" (result) : \"Q\" (*addr) );\n#else\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\n       accepted by assembler. So has to use following less efficient pattern.\n    */\n   __ASM volatile (\"ldrexh %0, [%1]\" : \"=r\" (result) : \"r\" (addr) : \"memory\" );\n#endif\n   return ((uint16_t) result);    /* Add explicit type cast here */\n}\n\n\n/**\n  \\brief   LDR Exclusive (32 bit)\n  \\details Executes a exclusive LDR instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldrex %0, %1\" : \"=r\" (result) : \"Q\" (*addr) );\n   return(result);\n}\n\n\n/**\n  \\brief   STR Exclusive (8 bit)\n  \\details Executes a exclusive STR instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"strexb %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*addr) : \"r\" ((uint32_t)value) );\n   return(result);\n}\n\n\n/**\n  \\brief   STR Exclusive (16 bit)\n  \\details Executes a exclusive STR instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"strexh %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*addr) : \"r\" ((uint32_t)value) );\n   return(result);\n}\n\n\n/**\n  \\brief   STR Exclusive (32 bit)\n  \\details Executes a exclusive STR instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"strex %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*addr) : \"r\" (value) );\n   return(result);\n}\n\n\n/**\n  \\brief   Remove the exclusive lock\n  \\details Removes the exclusive lock which is created by LDREX.\n */\n__attribute__((always_inline)) __STATIC_INLINE void __CLREX(void)\n{\n  __ASM volatile (\"clrex\" ::: \"memory\");\n}\n\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Signed Saturate\n  \\details Saturates a signed value.\n  \\param [in]  value  Value to be saturated\n  \\param [in]    sat  Bit position to saturate to (1..32)\n  \\return             Saturated value\n */\n#define __SSAT(ARG1,ARG2) \\\n({                          \\\n  int32_t __RES, __ARG1 = (ARG1); \\\n  __ASM (\"ssat %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) ); \\\n  __RES; \\\n })\n\n\n/**\n  \\brief   Unsigned Saturate\n  \\details Saturates an unsigned value.\n  \\param [in]  value  Value to be saturated\n  \\param [in]    sat  Bit position to saturate to (0..31)\n  \\return             Saturated value\n */\n#define __USAT(ARG1,ARG2) \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1); \\\n  __ASM (\"usat %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) ); \\\n  __RES; \\\n })\n\n\n/**\n  \\brief   Rotate Right with Extend (32 bit)\n  \\details Moves each bit of a bitstring right by one bit.\n           The carry input is shifted in at the left end of the bitstring.\n  \\param [in]    value  Value to rotate\n  \\return               Rotated value\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __RRX(uint32_t value)\n{\n  uint32_t result;\n\n  __ASM volatile (\"rrx %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return(result);\n}\n\n\n/**\n  \\brief   LDRT Unprivileged (8 bit)\n  \\details Executes a Unprivileged LDRT instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDRBT(volatile uint8_t *ptr)\n{\n    uint32_t result;\n\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n   __ASM volatile (\"ldrbt %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n#else\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\n       accepted by assembler. So has to use following less efficient pattern.\n    */\n   __ASM volatile (\"ldrbt %0, [%1]\" : \"=r\" (result) : \"r\" (ptr) : \"memory\" );\n#endif\n   return ((uint8_t) result);    /* Add explicit type cast here */\n}\n\n\n/**\n  \\brief   LDRT Unprivileged (16 bit)\n  \\details Executes a Unprivileged LDRT instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDRHT(volatile uint16_t *ptr)\n{\n    uint32_t result;\n\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n   __ASM volatile (\"ldrht %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n#else\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\n       accepted by assembler. So has to use following less efficient pattern.\n    */\n   __ASM volatile (\"ldrht %0, [%1]\" : \"=r\" (result) : \"r\" (ptr) : \"memory\" );\n#endif\n   return ((uint16_t) result);    /* Add explicit type cast here */\n}\n\n\n/**\n  \\brief   LDRT Unprivileged (32 bit)\n  \\details Executes a Unprivileged LDRT instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDRT(volatile uint32_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldrt %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return(result);\n}\n\n\n/**\n  \\brief   STRT Unprivileged (8 bit)\n  \\details Executes a Unprivileged STRT instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STRBT(uint8_t value, volatile uint8_t *ptr)\n{\n   __ASM volatile (\"strbt %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   STRT Unprivileged (16 bit)\n  \\details Executes a Unprivileged STRT instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STRHT(uint16_t value, volatile uint16_t *ptr)\n{\n   __ASM volatile (\"strht %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   STRT Unprivileged (32 bit)\n  \\details Executes a Unprivileged STRT instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STRT(uint32_t value, volatile uint32_t *ptr)\n{\n   __ASM volatile (\"strt %1, %0\" : \"=Q\" (*ptr) : \"r\" (value) );\n}\n\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\n/**\n  \\brief   Load-Acquire (8 bit)\n  \\details Executes a LDAB instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAB(volatile uint8_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldab %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return ((uint8_t) result);\n}\n\n\n/**\n  \\brief   Load-Acquire (16 bit)\n  \\details Executes a LDAH instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAH(volatile uint16_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldah %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return ((uint16_t) result);\n}\n\n\n/**\n  \\brief   Load-Acquire (32 bit)\n  \\details Executes a LDA instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDA(volatile uint32_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"lda %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return(result);\n}\n\n\n/**\n  \\brief   Store-Release (8 bit)\n  \\details Executes a STLB instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STLB(uint8_t value, volatile uint8_t *ptr)\n{\n   __ASM volatile (\"stlb %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   Store-Release (16 bit)\n  \\details Executes a STLH instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STLH(uint16_t value, volatile uint16_t *ptr)\n{\n   __ASM volatile (\"stlh %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   Store-Release (32 bit)\n  \\details Executes a STL instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__attribute__((always_inline)) __STATIC_INLINE void __STL(uint32_t value, volatile uint32_t *ptr)\n{\n   __ASM volatile (\"stl %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   Load-Acquire Exclusive (8 bit)\n  \\details Executes a LDAB exclusive instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint8_t __LDAEXB(volatile uint8_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldaexb %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return ((uint8_t) result);\n}\n\n\n/**\n  \\brief   Load-Acquire Exclusive (16 bit)\n  \\details Executes a LDAH exclusive instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint16_t __LDAEXH(volatile uint16_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldaexh %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return ((uint16_t) result);\n}\n\n\n/**\n  \\brief   Load-Acquire Exclusive (32 bit)\n  \\details Executes a LDA exclusive instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __LDAEX(volatile uint32_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldaex %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return(result);\n}\n\n\n/**\n  \\brief   Store-Release Exclusive (8 bit)\n  \\details Executes a STLB exclusive instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"stlexb %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n   return(result);\n}\n\n\n/**\n  \\brief   Store-Release Exclusive (16 bit)\n  \\details Executes a STLH exclusive instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"stlexh %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n   return(result);\n}\n\n\n/**\n  \\brief   Store-Release Exclusive (32 bit)\n  \\details Executes a STL exclusive instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"stlex %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n   return(result);\n}\n\n#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\n\n/*@}*/ /* end of group CMSIS_Core_InstructionInterface */\n\n\n/* ###################  Compiler specific Intrinsics  ########################### */\n/** \\defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics\n  Access to dedicated SIMD instructions\n  @{\n*/\n\n#if (defined(__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))                             /* ToDo ARMCLANG: This should be ARCH >= ARMv7-M + SIMD */\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ssub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ssub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ssax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usad8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usada8 %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n#define __SSAT16(ARG1,ARG2) \\\n({                          \\\n  int32_t __RES, __ARG1 = (ARG1); \\\n  __ASM (\"ssat16 %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) ); \\\n  __RES; \\\n })\n\n#define __USAT16(ARG1,ARG2) \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1); \\\n  __ASM (\"usat16 %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) ); \\\n  __RES; \\\n })\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uxtb16 %0, %1\" : \"=r\" (result) : \"r\" (op1));\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uxtab16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sxtb16 %0, %1\" : \"=r\" (result) : \"r\" (op1));\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sxtab16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUAD  (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smuad %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smuadx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smlad %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smladx %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\n  __ASM volatile (\"smlald %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\n#else               /* Big endian */\n  __ASM volatile (\"smlald %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\n#endif\n\n  return(llr.w64);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\n  __ASM volatile (\"smlaldx %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\n#else               /* Big endian */\n  __ASM volatile (\"smlaldx %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\n#endif\n\n  return(llr.w64);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSD  (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smusd %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smusdx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smlsd %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smlsdx %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\n  __ASM volatile (\"smlsld %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\n#else               /* Big endian */\n  __ASM volatile (\"smlsld %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\n#endif\n\n  return(llr.w64);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\n  __ASM volatile (\"smlsldx %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\n#else               /* Big endian */\n  __ASM volatile (\"smlsldx %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\n#endif\n\n  return(llr.w64);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE uint32_t __SEL  (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sel %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE  int32_t __QADD( int32_t op1,  int32_t op2)\n{\n  int32_t result;\n\n  __ASM volatile (\"qadd %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__attribute__((always_inline)) __STATIC_INLINE  int32_t __QSUB( int32_t op1,  int32_t op2)\n{\n  int32_t result;\n\n  __ASM volatile (\"qsub %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n#if 0\n#define __PKHBT(ARG1,ARG2,ARG3) \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\\n  __ASM (\"pkhbt %0, %1, %2, lsl %3\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2), \"I\" (ARG3)  ); \\\n  __RES; \\\n })\n\n#define __PKHTB(ARG1,ARG2,ARG3) \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\\n  if (ARG3 == 0) \\\n    __ASM (\"pkhtb %0, %1, %2\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2)  ); \\\n  else \\\n    __ASM (\"pkhtb %0, %1, %2, asr %3\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2), \"I\" (ARG3)  ); \\\n  __RES; \\\n })\n#endif\n\n#define __PKHBT(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0x0000FFFFUL) |  \\\n                                           ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL)  )\n\n#define __PKHTB(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0xFFFF0000UL) |  \\\n                                           ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL)  )\n\n__attribute__((always_inline)) __STATIC_INLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)\n{\n int32_t result;\n\n __ASM volatile (\"smmla %0, %1, %2, %3\" : \"=r\" (result): \"r\"  (op1), \"r\" (op2), \"r\" (op3) );\n return(result);\n}\n\n#endif /* (__ARM_FEATURE_DSP == 1) */\n/*@} end of group CMSIS_SIMD_intrinsics */\n\n\n#pragma GCC diagnostic pop\n\n#endif /* __CMSIS_GCC_H */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_armv8mbl.h",
    "content": "/**************************************************************************//**\n * @file     core_armv8mbl.h\n * @brief    CMSIS ARMv8MBL Core Peripheral Access Layer Header File\n * @version  V5.0.1\n * @date     25. November 2016\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_ARMV8MBL_H_GENERIC\n#define __CORE_ARMV8MBL_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex_ARMv8MBL\n  @{\n */\n\n/*  CMSIS cmGrebe definitions */\n#define __ARMv8MBL_CMSIS_VERSION_MAIN  ( 5U)                                       /*!< [31:16] CMSIS HAL main version */\n#define __ARMv8MBL_CMSIS_VERSION_SUB   ( 0U)                                       /*!< [15:0]  CMSIS HAL sub version */\n#define __ARMv8MBL_CMSIS_VERSION       ((__ARMv8MBL_CMSIS_VERSION_MAIN << 16U) | \\\n                                         __ARMv8MBL_CMSIS_VERSION_SUB           )  /*!< CMSIS HAL version number */\n\n#define __CORTEX_M                     ( 2U)                                            /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    This core does not support an FPU at all\n*/\n#define __FPU_USED       0U\n\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_ARMV8MBL_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_ARMV8MBL_H_DEPENDANT\n#define __CORE_ARMV8MBL_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __ARMv8MBL_REV\n    #define __ARMv8MBL_REV               0x0000U\n    #warning \"__ARMv8MBL_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __FPU_PRESENT\n    #define __FPU_PRESENT             0U\n    #warning \"__FPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __SAUREGION_PRESENT\n    #define __SAUREGION_PRESENT       0U\n    #warning \"__SAUREGION_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __VTOR_PRESENT\n    #define __VTOR_PRESENT            0U\n    #warning \"__VTOR_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          2U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __ETM_PRESENT\n    #define __ETM_PRESENT             0U\n    #warning \"__ETM_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MTB_PRESENT\n    #define __MTB_PRESENT             0U\n    #warning \"__MTB_PRESENT not defined in device header file; using default!\"\n  #endif\n\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group ARMv8MBL */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core Debug Register\n  - Core MPU Register\n  - Core SAU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:28;              /*!< bit:  0..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */\n    uint32_t _reserved1:3;               /*!< bit: 25..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack-pointer select */\n    uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[16U];              /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[16U];\n  __IOM uint32_t ICER[16U];              /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[16U];\n  __IOM uint32_t ISPR[16U];              /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[16U];\n  __IOM uint32_t ICPR[16U];              /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[16U];\n  __IOM uint32_t IABR[16U];              /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */\n        uint32_t RESERVED4[16U];\n  __IOM uint32_t ITNS[16U];              /*!< Offset: 0x280 (R/W)  Interrupt Non-Secure State Register */\n        uint32_t RESERVED5[16U];\n  __IOM uint32_t IPR[124U];              /*!< Offset: 0x300 (R/W)  Interrupt Priority Register */\n}  NVIC_Type;\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n#else\n        uint32_t RESERVED0;\n#endif\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n        uint32_t RESERVED1;\n  __IOM uint32_t SHPR[2U];               /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_PENDNMISET_Pos            31U                                            /*!< SCB ICSR: PENDNMISET Position */\n#define SCB_ICSR_PENDNMISET_Msk            (1UL << SCB_ICSR_PENDNMISET_Pos)               /*!< SCB ICSR: PENDNMISET Mask */\n\n#define SCB_ICSR_PENDNMICLR_Pos            30U                                            /*!< SCB ICSR: PENDNMICLR Position */\n#define SCB_ICSR_PENDNMICLR_Msk            (1UL << SCB_ICSR_PENDNMICLR_Pos)               /*!< SCB ICSR: PENDNMICLR Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_STTNS_Pos                 24U                                            /*!< SCB ICSR: STTNS Position (Security Extension) */\n#define SCB_ICSR_STTNS_Msk                 (1UL << SCB_ICSR_STTNS_Pos)                    /*!< SCB ICSR: STTNS Mask (Security Extension) */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_RETTOBASE_Pos             11U                                            /*!< SCB ICSR: RETTOBASE Position */\n#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n/* SCB Vector Table Offset Register Definitions */\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */\n#endif\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_PRIS_Pos                 14U                                            /*!< SCB AIRCR: PRIS Position */\n#define SCB_AIRCR_PRIS_Msk                 (1UL << SCB_AIRCR_PRIS_Pos)                    /*!< SCB AIRCR: PRIS Mask */\n\n#define SCB_AIRCR_BFHFNMINS_Pos            13U                                            /*!< SCB AIRCR: BFHFNMINS Position */\n#define SCB_AIRCR_BFHFNMINS_Msk            (1UL << SCB_AIRCR_BFHFNMINS_Pos)               /*!< SCB AIRCR: BFHFNMINS Mask */\n\n#define SCB_AIRCR_SYSRESETREQS_Pos          3U                                            /*!< SCB AIRCR: SYSRESETREQS Position */\n#define SCB_AIRCR_SYSRESETREQS_Msk         (1UL << SCB_AIRCR_SYSRESETREQS_Pos)            /*!< SCB AIRCR: SYSRESETREQS Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEPS_Pos              3U                                            /*!< SCB SCR: SLEEPDEEPS Position */\n#define SCB_SCR_SLEEPDEEPS_Msk             (1UL << SCB_SCR_SLEEPDEEPS_Pos)                /*!< SCB SCR: SLEEPDEEPS Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_BP_Pos                     18U                                            /*!< SCB CCR: BP Position */\n#define SCB_CCR_BP_Msk                     (1UL << SCB_CCR_BP_Pos)                        /*!< SCB CCR: BP Mask */\n\n#define SCB_CCR_IC_Pos                     17U                                            /*!< SCB CCR: IC Position */\n#define SCB_CCR_IC_Msk                     (1UL << SCB_CCR_IC_Pos)                        /*!< SCB CCR: IC Mask */\n\n#define SCB_CCR_DC_Pos                     16U                                            /*!< SCB CCR: DC Position */\n#define SCB_CCR_DC_Msk                     (1UL << SCB_CCR_DC_Pos)                        /*!< SCB CCR: DC Mask */\n\n#define SCB_CCR_STKOFHFNMIGN_Pos           10U                                            /*!< SCB CCR: STKOFHFNMIGN Position */\n#define SCB_CCR_STKOFHFNMIGN_Msk           (1UL << SCB_CCR_STKOFHFNMIGN_Pos)              /*!< SCB CCR: STKOFHFNMIGN Mask */\n\n#define SCB_CCR_BFHFNMIGN_Pos               8U                                            /*!< SCB CCR: BFHFNMIGN Position */\n#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */\n\n#define SCB_CCR_DIV_0_TRP_Pos               4U                                            /*!< SCB CCR: DIV_0_TRP Position */\n#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n#define SCB_CCR_USERSETMPEND_Pos            1U                                            /*!< SCB CCR: USERSETMPEND Position */\n#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_HARDFAULTPENDED_Pos      21U                                            /*!< SCB SHCSR: HARDFAULTPENDED Position */\n#define SCB_SHCSR_HARDFAULTPENDED_Msk      (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos)         /*!< SCB SHCSR: HARDFAULTPENDED Mask */\n\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n#define SCB_SHCSR_SYSTICKACT_Pos           11U                                            /*!< SCB SHCSR: SYSTICKACT Position */\n#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */\n\n#define SCB_SHCSR_PENDSVACT_Pos            10U                                            /*!< SCB SHCSR: PENDSVACT Position */\n#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */\n\n#define SCB_SHCSR_SVCALLACT_Pos             7U                                            /*!< SCB SHCSR: SVCALLACT Position */\n#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */\n\n#define SCB_SHCSR_NMIACT_Pos                5U                                            /*!< SCB SHCSR: NMIACT Position */\n#define SCB_SHCSR_NMIACT_Msk               (1UL << SCB_SHCSR_NMIACT_Pos)                  /*!< SCB SHCSR: NMIACT Mask */\n\n#define SCB_SHCSR_HARDFAULTACT_Pos          2U                                            /*!< SCB SHCSR: HARDFAULTACT Position */\n#define SCB_SHCSR_HARDFAULTACT_Msk         (1UL << SCB_SHCSR_HARDFAULTACT_Pos)            /*!< SCB SHCSR: HARDFAULTACT Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)\n  \\brief    Type definitions for the Data Watchpoint and Trace (DWT)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Data Watchpoint and Trace Register (DWT).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  Control Register */\n        uint32_t RESERVED0[6U];\n  __IM  uint32_t PCSR;                   /*!< Offset: 0x01C (R/ )  Program Counter Sample Register */\n  __IOM uint32_t COMP0;                  /*!< Offset: 0x020 (R/W)  Comparator Register 0 */\n        uint32_t RESERVED1[1U];\n  __IOM uint32_t FUNCTION0;              /*!< Offset: 0x028 (R/W)  Function Register 0 */\n        uint32_t RESERVED2[1U];\n  __IOM uint32_t COMP1;                  /*!< Offset: 0x030 (R/W)  Comparator Register 1 */\n        uint32_t RESERVED3[1U];\n  __IOM uint32_t FUNCTION1;              /*!< Offset: 0x038 (R/W)  Function Register 1 */\n        uint32_t RESERVED4[1U];\n  __IOM uint32_t COMP2;                  /*!< Offset: 0x040 (R/W)  Comparator Register 2 */\n        uint32_t RESERVED5[1U];\n  __IOM uint32_t FUNCTION2;              /*!< Offset: 0x048 (R/W)  Function Register 2 */\n        uint32_t RESERVED6[1U];\n  __IOM uint32_t COMP3;                  /*!< Offset: 0x050 (R/W)  Comparator Register 3 */\n        uint32_t RESERVED7[1U];\n  __IOM uint32_t FUNCTION3;              /*!< Offset: 0x058 (R/W)  Function Register 3 */\n        uint32_t RESERVED8[1U];\n  __IOM uint32_t COMP4;                  /*!< Offset: 0x060 (R/W)  Comparator Register 4 */\n        uint32_t RESERVED9[1U];\n  __IOM uint32_t FUNCTION4;              /*!< Offset: 0x068 (R/W)  Function Register 4 */\n        uint32_t RESERVED10[1U];\n  __IOM uint32_t COMP5;                  /*!< Offset: 0x070 (R/W)  Comparator Register 5 */\n        uint32_t RESERVED11[1U];\n  __IOM uint32_t FUNCTION5;              /*!< Offset: 0x078 (R/W)  Function Register 5 */\n        uint32_t RESERVED12[1U];\n  __IOM uint32_t COMP6;                  /*!< Offset: 0x080 (R/W)  Comparator Register 6 */\n        uint32_t RESERVED13[1U];\n  __IOM uint32_t FUNCTION6;              /*!< Offset: 0x088 (R/W)  Function Register 6 */\n        uint32_t RESERVED14[1U];\n  __IOM uint32_t COMP7;                  /*!< Offset: 0x090 (R/W)  Comparator Register 7 */\n        uint32_t RESERVED15[1U];\n  __IOM uint32_t FUNCTION7;              /*!< Offset: 0x098 (R/W)  Function Register 7 */\n        uint32_t RESERVED16[1U];\n  __IOM uint32_t COMP8;                  /*!< Offset: 0x0A0 (R/W)  Comparator Register 8 */\n        uint32_t RESERVED17[1U];\n  __IOM uint32_t FUNCTION8;              /*!< Offset: 0x0A8 (R/W)  Function Register 8 */\n        uint32_t RESERVED18[1U];\n  __IOM uint32_t COMP9;                  /*!< Offset: 0x0B0 (R/W)  Comparator Register 9 */\n        uint32_t RESERVED19[1U];\n  __IOM uint32_t FUNCTION9;              /*!< Offset: 0x0B8 (R/W)  Function Register 9 */\n        uint32_t RESERVED20[1U];\n  __IOM uint32_t COMP10;                 /*!< Offset: 0x0C0 (R/W)  Comparator Register 10 */\n        uint32_t RESERVED21[1U];\n  __IOM uint32_t FUNCTION10;             /*!< Offset: 0x0C8 (R/W)  Function Register 10 */\n        uint32_t RESERVED22[1U];\n  __IOM uint32_t COMP11;                 /*!< Offset: 0x0D0 (R/W)  Comparator Register 11 */\n        uint32_t RESERVED23[1U];\n  __IOM uint32_t FUNCTION11;             /*!< Offset: 0x0D8 (R/W)  Function Register 11 */\n        uint32_t RESERVED24[1U];\n  __IOM uint32_t COMP12;                 /*!< Offset: 0x0E0 (R/W)  Comparator Register 12 */\n        uint32_t RESERVED25[1U];\n  __IOM uint32_t FUNCTION12;             /*!< Offset: 0x0E8 (R/W)  Function Register 12 */\n        uint32_t RESERVED26[1U];\n  __IOM uint32_t COMP13;                 /*!< Offset: 0x0F0 (R/W)  Comparator Register 13 */\n        uint32_t RESERVED27[1U];\n  __IOM uint32_t FUNCTION13;             /*!< Offset: 0x0F8 (R/W)  Function Register 13 */\n        uint32_t RESERVED28[1U];\n  __IOM uint32_t COMP14;                 /*!< Offset: 0x100 (R/W)  Comparator Register 14 */\n        uint32_t RESERVED29[1U];\n  __IOM uint32_t FUNCTION14;             /*!< Offset: 0x108 (R/W)  Function Register 14 */\n        uint32_t RESERVED30[1U];\n  __IOM uint32_t COMP15;                 /*!< Offset: 0x110 (R/W)  Comparator Register 15 */\n        uint32_t RESERVED31[1U];\n  __IOM uint32_t FUNCTION15;             /*!< Offset: 0x118 (R/W)  Function Register 15 */\n} DWT_Type;\n\n/* DWT Control Register Definitions */\n#define DWT_CTRL_NUMCOMP_Pos               28U                                         /*!< DWT CTRL: NUMCOMP Position */\n#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */\n\n#define DWT_CTRL_NOTRCPKT_Pos              27U                                         /*!< DWT CTRL: NOTRCPKT Position */\n#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */\n\n#define DWT_CTRL_NOEXTTRIG_Pos             26U                                         /*!< DWT CTRL: NOEXTTRIG Position */\n#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */\n\n#define DWT_CTRL_NOCYCCNT_Pos              25U                                         /*!< DWT CTRL: NOCYCCNT Position */\n#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */\n\n#define DWT_CTRL_NOPRFCNT_Pos              24U                                         /*!< DWT CTRL: NOPRFCNT Position */\n#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */\n\n/* DWT Comparator Function Register Definitions */\n#define DWT_FUNCTION_ID_Pos                27U                                         /*!< DWT FUNCTION: ID Position */\n#define DWT_FUNCTION_ID_Msk                (0x1FUL << DWT_FUNCTION_ID_Pos)             /*!< DWT FUNCTION: ID Mask */\n\n#define DWT_FUNCTION_MATCHED_Pos           24U                                         /*!< DWT FUNCTION: MATCHED Position */\n#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */\n\n#define DWT_FUNCTION_DATAVSIZE_Pos         10U                                         /*!< DWT FUNCTION: DATAVSIZE Position */\n#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */\n\n#define DWT_FUNCTION_ACTION_Pos             4U                                         /*!< DWT FUNCTION: ACTION Position */\n#define DWT_FUNCTION_ACTION_Msk            (0x3UL << DWT_FUNCTION_ACTION_Pos)          /*!< DWT FUNCTION: ACTION Mask */\n\n#define DWT_FUNCTION_MATCH_Pos              0U                                         /*!< DWT FUNCTION: MATCH Position */\n#define DWT_FUNCTION_MATCH_Msk             (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/)       /*!< DWT FUNCTION: MATCH Mask */\n\n/*@}*/ /* end of group CMSIS_DWT */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_TPI     Trace Port Interface (TPI)\n  \\brief    Type definitions for the Trace Port Interface (TPI)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Trace Port Interface Register (TPI).\n */\ntypedef struct\n{\n  __IOM uint32_t SSPSR;                  /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register */\n  __IOM uint32_t CSPSR;                  /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */\n        uint32_t RESERVED0[2U];\n  __IOM uint32_t ACPR;                   /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */\n        uint32_t RESERVED1[55U];\n  __IOM uint32_t SPPR;                   /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */\n        uint32_t RESERVED2[131U];\n  __IM  uint32_t FFSR;                   /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */\n  __IOM uint32_t FFCR;                   /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */\n  __IM  uint32_t FSCR;                   /*!< Offset: 0x308 (R/ )  Formatter Synchronization Counter Register */\n        uint32_t RESERVED3[759U];\n  __IM  uint32_t TRIGGER;                /*!< Offset: 0xEE8 (R/ )  TRIGGER */\n  __IM  uint32_t FIFO0;                  /*!< Offset: 0xEEC (R/ )  Integration ETM Data */\n  __IM  uint32_t ITATBCTR2;              /*!< Offset: 0xEF0 (R/ )  ITATBCTR2 */\n        uint32_t RESERVED4[1U];\n  __IM  uint32_t ITATBCTR0;              /*!< Offset: 0xEF8 (R/ )  ITATBCTR0 */\n  __IM  uint32_t FIFO1;                  /*!< Offset: 0xEFC (R/ )  Integration ITM Data */\n  __IOM uint32_t ITCTRL;                 /*!< Offset: 0xF00 (R/W)  Integration Mode Control */\n        uint32_t RESERVED5[39U];\n  __IOM uint32_t CLAIMSET;               /*!< Offset: 0xFA0 (R/W)  Claim tag set */\n  __IOM uint32_t CLAIMCLR;               /*!< Offset: 0xFA4 (R/W)  Claim tag clear */\n        uint32_t RESERVED7[8U];\n  __IM  uint32_t DEVID;                  /*!< Offset: 0xFC8 (R/ )  TPIU_DEVID */\n  __IM  uint32_t DEVTYPE;                /*!< Offset: 0xFCC (R/ )  TPIU_DEVTYPE */\n} TPI_Type;\n\n/* TPI Asynchronous Clock Prescaler Register Definitions */\n#define TPI_ACPR_PRESCALER_Pos              0U                                         /*!< TPI ACPR: PRESCALER Position */\n#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/)    /*!< TPI ACPR: PRESCALER Mask */\n\n/* TPI Selected Pin Protocol Register Definitions */\n#define TPI_SPPR_TXMODE_Pos                 0U                                         /*!< TPI SPPR: TXMODE Position */\n#define TPI_SPPR_TXMODE_Msk                (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/)          /*!< TPI SPPR: TXMODE Mask */\n\n/* TPI Formatter and Flush Status Register Definitions */\n#define TPI_FFSR_FtNonStop_Pos              3U                                         /*!< TPI FFSR: FtNonStop Position */\n#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */\n\n#define TPI_FFSR_TCPresent_Pos              2U                                         /*!< TPI FFSR: TCPresent Position */\n#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */\n\n#define TPI_FFSR_FtStopped_Pos              1U                                         /*!< TPI FFSR: FtStopped Position */\n#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */\n\n#define TPI_FFSR_FlInProg_Pos               0U                                         /*!< TPI FFSR: FlInProg Position */\n#define TPI_FFSR_FlInProg_Msk              (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/)        /*!< TPI FFSR: FlInProg Mask */\n\n/* TPI Formatter and Flush Control Register Definitions */\n#define TPI_FFCR_TrigIn_Pos                 8U                                         /*!< TPI FFCR: TrigIn Position */\n#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */\n\n#define TPI_FFCR_EnFCont_Pos                1U                                         /*!< TPI FFCR: EnFCont Position */\n#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */\n\n/* TPI TRIGGER Register Definitions */\n#define TPI_TRIGGER_TRIGGER_Pos             0U                                         /*!< TPI TRIGGER: TRIGGER Position */\n#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/)      /*!< TPI TRIGGER: TRIGGER Mask */\n\n/* TPI Integration ETM Data Register Definitions (FIFO0) */\n#define TPI_FIFO0_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO0: ITM_ATVALID Position */\n#define TPI_FIFO0_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos)        /*!< TPI FIFO0: ITM_ATVALID Mask */\n\n#define TPI_FIFO0_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO0: ITM_bytecount Position */\n#define TPI_FIFO0_ITM_bytecount_Msk        (0x3UL << TPI_FIFO0_ITM_bytecount_Pos)      /*!< TPI FIFO0: ITM_bytecount Mask */\n\n#define TPI_FIFO0_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO0: ETM_ATVALID Position */\n#define TPI_FIFO0_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos)        /*!< TPI FIFO0: ETM_ATVALID Mask */\n\n#define TPI_FIFO0_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO0: ETM_bytecount Position */\n#define TPI_FIFO0_ETM_bytecount_Msk        (0x3UL << TPI_FIFO0_ETM_bytecount_Pos)      /*!< TPI FIFO0: ETM_bytecount Mask */\n\n#define TPI_FIFO0_ETM2_Pos                 16U                                         /*!< TPI FIFO0: ETM2 Position */\n#define TPI_FIFO0_ETM2_Msk                 (0xFFUL << TPI_FIFO0_ETM2_Pos)              /*!< TPI FIFO0: ETM2 Mask */\n\n#define TPI_FIFO0_ETM1_Pos                  8U                                         /*!< TPI FIFO0: ETM1 Position */\n#define TPI_FIFO0_ETM1_Msk                 (0xFFUL << TPI_FIFO0_ETM1_Pos)              /*!< TPI FIFO0: ETM1 Mask */\n\n#define TPI_FIFO0_ETM0_Pos                  0U                                         /*!< TPI FIFO0: ETM0 Position */\n#define TPI_FIFO0_ETM0_Msk                 (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/)          /*!< TPI FIFO0: ETM0 Mask */\n\n/* TPI ITATBCTR2 Register Definitions */\n#define TPI_ITATBCTR2_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR2: ATREADY Position */\n#define TPI_ITATBCTR2_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/)    /*!< TPI ITATBCTR2: ATREADY Mask */\n\n/* TPI Integration ITM Data Register Definitions (FIFO1) */\n#define TPI_FIFO1_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO1: ITM_ATVALID Position */\n#define TPI_FIFO1_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos)        /*!< TPI FIFO1: ITM_ATVALID Mask */\n\n#define TPI_FIFO1_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO1: ITM_bytecount Position */\n#define TPI_FIFO1_ITM_bytecount_Msk        (0x3UL << TPI_FIFO1_ITM_bytecount_Pos)      /*!< TPI FIFO1: ITM_bytecount Mask */\n\n#define TPI_FIFO1_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO1: ETM_ATVALID Position */\n#define TPI_FIFO1_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos)        /*!< TPI FIFO1: ETM_ATVALID Mask */\n\n#define TPI_FIFO1_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO1: ETM_bytecount Position */\n#define TPI_FIFO1_ETM_bytecount_Msk        (0x3UL << TPI_FIFO1_ETM_bytecount_Pos)      /*!< TPI FIFO1: ETM_bytecount Mask */\n\n#define TPI_FIFO1_ITM2_Pos                 16U                                         /*!< TPI FIFO1: ITM2 Position */\n#define TPI_FIFO1_ITM2_Msk                 (0xFFUL << TPI_FIFO1_ITM2_Pos)              /*!< TPI FIFO1: ITM2 Mask */\n\n#define TPI_FIFO1_ITM1_Pos                  8U                                         /*!< TPI FIFO1: ITM1 Position */\n#define TPI_FIFO1_ITM1_Msk                 (0xFFUL << TPI_FIFO1_ITM1_Pos)              /*!< TPI FIFO1: ITM1 Mask */\n\n#define TPI_FIFO1_ITM0_Pos                  0U                                         /*!< TPI FIFO1: ITM0 Position */\n#define TPI_FIFO1_ITM0_Msk                 (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/)          /*!< TPI FIFO1: ITM0 Mask */\n\n/* TPI ITATBCTR0 Register Definitions */\n#define TPI_ITATBCTR0_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR0: ATREADY Position */\n#define TPI_ITATBCTR0_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/)    /*!< TPI ITATBCTR0: ATREADY Mask */\n\n/* TPI Integration Mode Control Register Definitions */\n#define TPI_ITCTRL_Mode_Pos                 0U                                         /*!< TPI ITCTRL: Mode Position */\n#define TPI_ITCTRL_Mode_Msk                (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/)          /*!< TPI ITCTRL: Mode Mask */\n\n/* TPI DEVID Register Definitions */\n#define TPI_DEVID_NRZVALID_Pos             11U                                         /*!< TPI DEVID: NRZVALID Position */\n#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */\n\n#define TPI_DEVID_MANCVALID_Pos            10U                                         /*!< TPI DEVID: MANCVALID Position */\n#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */\n\n#define TPI_DEVID_PTINVALID_Pos             9U                                         /*!< TPI DEVID: PTINVALID Position */\n#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */\n\n#define TPI_DEVID_MinBufSz_Pos              6U                                         /*!< TPI DEVID: MinBufSz Position */\n#define TPI_DEVID_MinBufSz_Msk             (0x7UL << TPI_DEVID_MinBufSz_Pos)           /*!< TPI DEVID: MinBufSz Mask */\n\n#define TPI_DEVID_AsynClkIn_Pos             5U                                         /*!< TPI DEVID: AsynClkIn Position */\n#define TPI_DEVID_AsynClkIn_Msk            (0x1UL << TPI_DEVID_AsynClkIn_Pos)          /*!< TPI DEVID: AsynClkIn Mask */\n\n#define TPI_DEVID_NrTraceInput_Pos          0U                                         /*!< TPI DEVID: NrTraceInput Position */\n#define TPI_DEVID_NrTraceInput_Msk         (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/)  /*!< TPI DEVID: NrTraceInput Mask */\n\n/* TPI DEVTYPE Register Definitions */\n#define TPI_DEVTYPE_MajorType_Pos           4U                                         /*!< TPI DEVTYPE: MajorType Position */\n#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */\n\n#define TPI_DEVTYPE_SubType_Pos             0U                                         /*!< TPI DEVTYPE: SubType Position */\n#define TPI_DEVTYPE_SubType_Msk            (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/)      /*!< TPI DEVTYPE: SubType Mask */\n\n/*@}*/ /* end of group CMSIS_TPI */\n\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region Number Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  MPU Region Limit Address Register */\n        uint32_t RESERVED0[7U];\n  __IOM uint32_t MAIR0;                  /*!< Offset: 0x030 (R/W)  MPU Memory Attribute Indirection Register 0 */\n  __IOM uint32_t MAIR1;                  /*!< Offset: 0x034 (R/W)  MPU Memory Attribute Indirection Register 1 */\n} MPU_Type;\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_BASE_Pos                   5U                                            /*!< MPU RBAR: BASE Position */\n#define MPU_RBAR_BASE_Msk                  (0x7FFFFFFUL << MPU_RBAR_BASE_Pos)             /*!< MPU RBAR: BASE Mask */\n\n#define MPU_RBAR_SH_Pos                     3U                                            /*!< MPU RBAR: SH Position */\n#define MPU_RBAR_SH_Msk                    (0x3UL << MPU_RBAR_SH_Pos)                     /*!< MPU RBAR: SH Mask */\n\n#define MPU_RBAR_AP_Pos                     1U                                            /*!< MPU RBAR: AP Position */\n#define MPU_RBAR_AP_Msk                    (0x3UL << MPU_RBAR_AP_Pos)                     /*!< MPU RBAR: AP Mask */\n\n#define MPU_RBAR_XN_Pos                     0U                                            /*!< MPU RBAR: XN Position */\n#define MPU_RBAR_XN_Msk                    (01UL /*<< MPU_RBAR_XN_Pos*/)                  /*!< MPU RBAR: XN Mask */\n\n/* MPU Region Limit Address Register Definitions */\n#define MPU_RLAR_LIMIT_Pos                  5U                                            /*!< MPU RLAR: LIMIT Position */\n#define MPU_RLAR_LIMIT_Msk                 (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos)            /*!< MPU RLAR: LIMIT Mask */\n\n#define MPU_RLAR_AttrIndx_Pos               1U                                            /*!< MPU RLAR: AttrIndx Position */\n#define MPU_RLAR_AttrIndx_Msk              (0x7UL << MPU_RLAR_AttrIndx_Pos)               /*!< MPU RLAR: AttrIndx Mask */\n\n#define MPU_RLAR_EN_Pos                     0U                                            /*!< MPU RLAR: EN Position */\n#define MPU_RLAR_EN_Msk                    (1UL /*<< MPU_RLAR_EN_Pos*/)                   /*!< MPU RLAR: EN Mask */\n\n/* MPU Memory Attribute Indirection Register 0 Definitions */\n#define MPU_MAIR0_Attr3_Pos                24U                                            /*!< MPU MAIR0: Attr3 Position */\n#define MPU_MAIR0_Attr3_Msk                (0xFFUL << MPU_MAIR0_Attr3_Pos)                /*!< MPU MAIR0: Attr3 Mask */\n\n#define MPU_MAIR0_Attr2_Pos                16U                                            /*!< MPU MAIR0: Attr2 Position */\n#define MPU_MAIR0_Attr2_Msk                (0xFFUL << MPU_MAIR0_Attr2_Pos)                /*!< MPU MAIR0: Attr2 Mask */\n\n#define MPU_MAIR0_Attr1_Pos                 8U                                            /*!< MPU MAIR0: Attr1 Position */\n#define MPU_MAIR0_Attr1_Msk                (0xFFUL << MPU_MAIR0_Attr1_Pos)                /*!< MPU MAIR0: Attr1 Mask */\n\n#define MPU_MAIR0_Attr0_Pos                 0U                                            /*!< MPU MAIR0: Attr0 Position */\n#define MPU_MAIR0_Attr0_Msk                (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/)            /*!< MPU MAIR0: Attr0 Mask */\n\n/* MPU Memory Attribute Indirection Register 1 Definitions */\n#define MPU_MAIR1_Attr7_Pos                24U                                            /*!< MPU MAIR1: Attr7 Position */\n#define MPU_MAIR1_Attr7_Msk                (0xFFUL << MPU_MAIR1_Attr7_Pos)                /*!< MPU MAIR1: Attr7 Mask */\n\n#define MPU_MAIR1_Attr6_Pos                16U                                            /*!< MPU MAIR1: Attr6 Position */\n#define MPU_MAIR1_Attr6_Msk                (0xFFUL << MPU_MAIR1_Attr6_Pos)                /*!< MPU MAIR1: Attr6 Mask */\n\n#define MPU_MAIR1_Attr5_Pos                 8U                                            /*!< MPU MAIR1: Attr5 Position */\n#define MPU_MAIR1_Attr5_Msk                (0xFFUL << MPU_MAIR1_Attr5_Pos)                /*!< MPU MAIR1: Attr5 Mask */\n\n#define MPU_MAIR1_Attr4_Pos                 0U                                            /*!< MPU MAIR1: Attr4 Position */\n#define MPU_MAIR1_Attr4_Msk                (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/)            /*!< MPU MAIR1: Attr4 Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif\n\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SAU     Security Attribution Unit (SAU)\n  \\brief    Type definitions for the Security Attribution Unit (SAU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Security Attribution Unit (SAU).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SAU Control Register */\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x004 (R/ )  SAU Type Register */\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  SAU Region Number Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  SAU Region Base Address Register */\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  SAU Region Limit Address Register */\n#endif\n} SAU_Type;\n\n/* SAU Control Register Definitions */\n#define SAU_CTRL_ALLNS_Pos                  1U                                            /*!< SAU CTRL: ALLNS Position */\n#define SAU_CTRL_ALLNS_Msk                 (1UL << SAU_CTRL_ALLNS_Pos)                    /*!< SAU CTRL: ALLNS Mask */\n\n#define SAU_CTRL_ENABLE_Pos                 0U                                            /*!< SAU CTRL: ENABLE Position */\n#define SAU_CTRL_ENABLE_Msk                (1UL /*<< SAU_CTRL_ENABLE_Pos*/)               /*!< SAU CTRL: ENABLE Mask */\n\n/* SAU Type Register Definitions */\n#define SAU_TYPE_SREGION_Pos                0U                                            /*!< SAU TYPE: SREGION Position */\n#define SAU_TYPE_SREGION_Msk               (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/)           /*!< SAU TYPE: SREGION Mask */\n\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n/* SAU Region Number Register Definitions */\n#define SAU_RNR_REGION_Pos                  0U                                            /*!< SAU RNR: REGION Position */\n#define SAU_RNR_REGION_Msk                 (0xFFUL /*<< SAU_RNR_REGION_Pos*/)             /*!< SAU RNR: REGION Mask */\n\n/* SAU Region Base Address Register Definitions */\n#define SAU_RBAR_BADDR_Pos                  5U                                            /*!< SAU RBAR: BADDR Position */\n#define SAU_RBAR_BADDR_Msk                 (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos)            /*!< SAU RBAR: BADDR Mask */\n\n/* SAU Region Limit Address Register Definitions */\n#define SAU_RLAR_LADDR_Pos                  5U                                            /*!< SAU RLAR: LADDR Position */\n#define SAU_RLAR_LADDR_Msk                 (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos)            /*!< SAU RLAR: LADDR Mask */\n\n#define SAU_RLAR_NSC_Pos                    1U                                            /*!< SAU RLAR: NSC Position */\n#define SAU_RLAR_NSC_Msk                   (1UL << SAU_RLAR_NSC_Pos)                      /*!< SAU RLAR: NSC Mask */\n\n#define SAU_RLAR_ENABLE_Pos                 0U                                            /*!< SAU RLAR: ENABLE Position */\n#define SAU_RLAR_ENABLE_Msk                (1UL /*<< SAU_RLAR_ENABLE_Pos*/)               /*!< SAU RLAR: ENABLE Mask */\n\n#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */\n\n/*@} end of group CMSIS_SAU */\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Type definitions for the Core Debug Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Core Debug Register (CoreDebug).\n */\ntypedef struct\n{\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\n        uint32_t RESERVED4[1U];\n  __IOM uint32_t DAUTHCTRL;              /*!< Offset: 0x014 (R/W)  Debug Authentication Control Register */\n  __IOM uint32_t DSCSR;                  /*!< Offset: 0x018 (R/W)  Debug Security Control and Status Register */\n} CoreDebug_Type;\n\n/* Debug Halting Control and Status Register Definitions */\n#define CoreDebug_DHCSR_DBGKEY_Pos         16U                                            /*!< CoreDebug DHCSR: DBGKEY Position */\n#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< CoreDebug DHCSR: DBGKEY Mask */\n\n#define CoreDebug_DHCSR_S_RESTART_ST_Pos   26U                                            /*!< CoreDebug DHCSR: S_RESTART_ST Position */\n#define CoreDebug_DHCSR_S_RESTART_ST_Msk   (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos)      /*!< CoreDebug DHCSR: S_RESTART_ST Mask */\n\n#define CoreDebug_DHCSR_S_RESET_ST_Pos     25U                                            /*!< CoreDebug DHCSR: S_RESET_ST Position */\n#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< CoreDebug DHCSR: S_RESET_ST Mask */\n\n#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24U                                            /*!< CoreDebug DHCSR: S_RETIRE_ST Position */\n#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */\n\n#define CoreDebug_DHCSR_S_LOCKUP_Pos       19U                                            /*!< CoreDebug DHCSR: S_LOCKUP Position */\n#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< CoreDebug DHCSR: S_LOCKUP Mask */\n\n#define CoreDebug_DHCSR_S_SLEEP_Pos        18U                                            /*!< CoreDebug DHCSR: S_SLEEP Position */\n#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< CoreDebug DHCSR: S_SLEEP Mask */\n\n#define CoreDebug_DHCSR_S_HALT_Pos         17U                                            /*!< CoreDebug DHCSR: S_HALT Position */\n#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< CoreDebug DHCSR: S_HALT Mask */\n\n#define CoreDebug_DHCSR_S_REGRDY_Pos       16U                                            /*!< CoreDebug DHCSR: S_REGRDY Position */\n#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< CoreDebug DHCSR: S_REGRDY Mask */\n\n#define CoreDebug_DHCSR_C_MASKINTS_Pos      3U                                            /*!< CoreDebug DHCSR: C_MASKINTS Position */\n#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< CoreDebug DHCSR: C_MASKINTS Mask */\n\n#define CoreDebug_DHCSR_C_STEP_Pos          2U                                            /*!< CoreDebug DHCSR: C_STEP Position */\n#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< CoreDebug DHCSR: C_STEP Mask */\n\n#define CoreDebug_DHCSR_C_HALT_Pos          1U                                            /*!< CoreDebug DHCSR: C_HALT Position */\n#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< CoreDebug DHCSR: C_HALT Mask */\n\n#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0U                                            /*!< CoreDebug DHCSR: C_DEBUGEN Position */\n#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/)     /*!< CoreDebug DHCSR: C_DEBUGEN Mask */\n\n/* Debug Core Register Selector Register Definitions */\n#define CoreDebug_DCRSR_REGWnR_Pos         16U                                            /*!< CoreDebug DCRSR: REGWnR Position */\n#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< CoreDebug DCRSR: REGWnR Mask */\n\n#define CoreDebug_DCRSR_REGSEL_Pos          0U                                            /*!< CoreDebug DCRSR: REGSEL Position */\n#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/)     /*!< CoreDebug DCRSR: REGSEL Mask */\n\n/* Debug Exception and Monitor Control Register */\n#define CoreDebug_DEMCR_DWTENA_Pos         24U                                            /*!< CoreDebug DEMCR: DWTENA Position */\n#define CoreDebug_DEMCR_DWTENA_Msk         (1UL << CoreDebug_DEMCR_DWTENA_Pos)            /*!< CoreDebug DEMCR: DWTENA Mask */\n\n#define CoreDebug_DEMCR_VC_HARDERR_Pos     10U                                            /*!< CoreDebug DEMCR: VC_HARDERR Position */\n#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< CoreDebug DEMCR: VC_HARDERR Mask */\n\n#define CoreDebug_DEMCR_VC_CORERESET_Pos    0U                                            /*!< CoreDebug DEMCR: VC_CORERESET Position */\n#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/)  /*!< CoreDebug DEMCR: VC_CORERESET Mask */\n\n/* Debug Authentication Control Register Definitions */\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos  3U                                            /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos)    /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */\n\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos  2U                                            /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos)    /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */\n\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos   1U                                            /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk  (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos)     /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */\n\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos   0U                                            /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk  (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */\n\n/* Debug Security Control and Status Register Definitions */\n#define CoreDebug_DSCSR_CDS_Pos            16U                                            /*!< CoreDebug DSCSR: CDS Position */\n#define CoreDebug_DSCSR_CDS_Msk            (1UL << CoreDebug_DSCSR_CDS_Pos)               /*!< CoreDebug DSCSR: CDS Mask */\n\n#define CoreDebug_DSCSR_SBRSEL_Pos          1U                                            /*!< CoreDebug DSCSR: SBRSEL Position */\n#define CoreDebug_DSCSR_SBRSEL_Msk         (1UL << CoreDebug_DSCSR_SBRSEL_Pos)            /*!< CoreDebug DSCSR: SBRSEL Mask */\n\n#define CoreDebug_DSCSR_SBRSELEN_Pos        0U                                            /*!< CoreDebug DSCSR: SBRSELEN Position */\n#define CoreDebug_DSCSR_SBRSELEN_Msk       (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/)      /*!< CoreDebug DSCSR: SBRSELEN Mask */\n\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n  #define SCS_BASE            (0xE000E000UL)                             /*!< System Control Space Base Address */\n  #define DWT_BASE            (0xE0001000UL)                             /*!< DWT Base Address */\n  #define TPI_BASE            (0xE0040000UL)                             /*!< TPI Base Address */\n  #define CoreDebug_BASE      (0xE000EDF0UL)                             /*!< Core Debug Base Address */\n  #define SysTick_BASE        (SCS_BASE +  0x0010UL)                     /*!< SysTick Base Address */\n  #define NVIC_BASE           (SCS_BASE +  0x0100UL)                     /*!< NVIC Base Address */\n  #define SCB_BASE            (SCS_BASE +  0x0D00UL)                     /*!< System Control Block Base Address */\n\n\n  #define SCB                 ((SCB_Type       *)     SCB_BASE         ) /*!< SCB configuration struct */\n  #define SysTick             ((SysTick_Type   *)     SysTick_BASE     ) /*!< SysTick configuration struct */\n  #define NVIC                ((NVIC_Type      *)     NVIC_BASE        ) /*!< NVIC configuration struct */\n  #define DWT                 ((DWT_Type       *)     DWT_BASE         ) /*!< DWT configuration struct */\n  #define TPI                 ((TPI_Type       *)     TPI_BASE         ) /*!< TPI configuration struct */\n  #define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE   ) /*!< Core Debug configuration struct */\n\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n    #define MPU_BASE          (SCS_BASE +  0x0D90UL)                     /*!< Memory Protection Unit */\n    #define MPU               ((MPU_Type       *)     MPU_BASE         ) /*!< Memory Protection Unit */\n  #endif\n\n  #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n    #define SAU_BASE          (SCS_BASE +  0x0DD0UL)                     /*!< Security Attribution Unit */\n    #define SAU               ((SAU_Type       *)     SAU_BASE         ) /*!< Security Attribution Unit */\n  #endif\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n  #define SCS_BASE_NS         (0xE002E000UL)                             /*!< System Control Space Base Address (non-secure address space) */\n  #define CoreDebug_BASE_NS   (0xE002EDF0UL)                             /*!< Core Debug Base Address           (non-secure address space) */\n  #define SysTick_BASE_NS     (SCS_BASE_NS +  0x0010UL)                  /*!< SysTick Base Address              (non-secure address space) */\n  #define NVIC_BASE_NS        (SCS_BASE_NS +  0x0100UL)                  /*!< NVIC Base Address                 (non-secure address space) */\n  #define SCB_BASE_NS         (SCS_BASE_NS +  0x0D00UL)                  /*!< System Control Block Base Address (non-secure address space) */\n\n  #define SCB_NS              ((SCB_Type       *)     SCB_BASE_NS      ) /*!< SCB configuration struct          (non-secure address space) */\n  #define SysTick_NS          ((SysTick_Type   *)     SysTick_BASE_NS  ) /*!< SysTick configuration struct      (non-secure address space) */\n  #define NVIC_NS             ((NVIC_Type      *)     NVIC_BASE_NS     ) /*!< NVIC configuration struct         (non-secure address space) */\n  #define CoreDebug_NS        ((CoreDebug_Type *)     CoreDebug_BASE_NS) /*!< Core Debug configuration struct   (non-secure address space) */\n\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n    #define MPU_BASE_NS       (SCS_BASE_NS +  0x0D90UL)                  /*!< Memory Protection Unit            (non-secure address space) */\n    #define MPU_NS            ((MPU_Type       *)     MPU_BASE_NS      ) /*!< Memory Protection Unit            (non-secure address space) */\n  #endif\n\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifndef CMSIS_NVIC_VIRTUAL\n/*#define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping   not available for ARMv8-M Baseline */\n/*#define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping   not available for ARMv8-M Baseline */\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n  #define NVIC_GetActive              __NVIC_GetActive\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifndef CMSIS_VECTAB_VIRTUAL\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n/* Interrupt Priorities are WORD accessible only under ARMv6M                   */\n/* The following MACROS handle generation of the register offset and byte masks */\n#define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL)\n#define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      )\n#define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      )\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt\n  \\details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   Get Interrupt Target State\n  \\details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n  \\return             1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Target State\n  \\details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n                      1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |=  ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)));\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Clear Interrupt Target State\n  \\details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n                      1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)));\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IPR[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n  else\n  {\n    SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n           If VTOR is not present address 0 must be mapped to SRAM.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n#else\n  uint32_t *vectors = (uint32_t *)0x0U;\n#endif\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n#else\n  uint32_t *vectors = (uint32_t *)0x0U;\n#endif\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__STATIC_INLINE void NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                 SCB_AIRCR_SYSRESETREQ_Msk);\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   Enable Interrupt (non-secure)\n  \\details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status (non-secure)\n  \\details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt (non-secure)\n  \\details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt (non-secure)\n  \\details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt (non-secure)\n  \\details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt (non-secure)\n  \\details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt (non-secure)\n  \\details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority (non-secure)\n  \\details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every non-secure processor exception.\n */\n__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->IPR[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n  else\n  {\n    SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority (non-secure)\n  \\details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n#endif /*  defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n    return 0U;           /* No FPU */\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##########################   SAU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SAUFunctions SAU Functions\n  \\brief    Functions that configure the SAU.\n  @{\n */\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n\n/**\n  \\brief   Enable SAU\n  \\details Enables the Security Attribution Unit (SAU).\n */\n__STATIC_INLINE void TZ_SAU_Enable(void)\n{\n    SAU->CTRL |=  (SAU_CTRL_ENABLE_Msk);\n}\n\n\n\n/**\n  \\brief   Disable SAU\n  \\details Disables the Security Attribution Unit (SAU).\n */\n__STATIC_INLINE void TZ_SAU_Disable(void)\n{\n    SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk);\n}\n\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n/*@} end of CMSIS_Core_SAUFunctions */\n\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   System Tick Configuration (non-secure)\n  \\details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>TZ_SysTick_Config_NS</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n\n */\n__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                         /* Reload value impossible */\n  }\n\n  SysTick_NS->LOAD  = (uint32_t)(ticks - 1UL);                            /* set reload register */\n  TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick_NS->VAL   = 0UL;                                                /* Load the SysTick Counter Value */\n  SysTick_NS->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                      SysTick_CTRL_TICKINT_Msk   |\n                      SysTick_CTRL_ENABLE_Msk;                            /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                           /* Function successful */\n}\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_ARMV8MBL_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_armv8mml.h",
    "content": "/**************************************************************************//**\n * @file     core_armv8mml.h\n * @brief    CMSIS ARMv8MML Core Peripheral Access Layer Header File\n * @version  V5.0.2\n * @date     07. December 2016\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_ARMV8MML_H_GENERIC\n#define __CORE_ARMV8MML_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex_ARMv8MML\n  @{\n */\n\n/*  CMSIS ARMv8MML definitions */\n#define __ARMv8MML_CMSIS_VERSION_MAIN  ( 5U)                                       /*!< [31:16] CMSIS HAL main version */\n#define __ARMv8MML_CMSIS_VERSION_SUB   ( 0U)                                       /*!< [15:0]  CMSIS HAL sub version */\n#define __ARMv8MML_CMSIS_VERSION       ((__ARMv8MML_CMSIS_VERSION_MAIN << 16U) | \\\n                                         __ARMv8MML_CMSIS_VERSION_SUB           )  /*!< CMSIS HAL version number */\n\n#define __CORTEX_M                     (81U)                                       /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions.\n*/\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #warning \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_ARMV8MML_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_ARMV8MML_H_DEPENDANT\n#define __CORE_ARMV8MML_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __ARMv8MML_REV\n    #define __ARMv8MML_REV               0x0000U\n    #warning \"__ARMv8MML_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __FPU_PRESENT\n    #define __FPU_PRESENT             0U\n    #warning \"__FPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __SAUREGION_PRESENT\n    #define __SAUREGION_PRESENT       0U\n    #warning \"__SAUREGION_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __DSP_PRESENT\n    #define __DSP_PRESENT             0U\n    #warning \"__DSP_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          3U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group ARMv8MML */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core Debug Register\n  - Core MPU Register\n  - Core SAU Register\n  - Core FPU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved */\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\n    uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n#define APSR_Q_Pos                         27U                                            /*!< APSR: Q Position */\n#define APSR_Q_Msk                         (1UL << APSR_Q_Pos)                            /*!< APSR: Q Mask */\n\n#define APSR_GE_Pos                        16U                                            /*!< APSR: GE Position */\n#define APSR_GE_Msk                        (0xFUL << APSR_GE_Pos)                         /*!< APSR: GE Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:7;               /*!< bit:  9..15  Reserved */\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\n    uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */\n    uint32_t IT:2;                       /*!< bit: 25..26  saved IT state   (read 0) */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_Q_Pos                         27U                                            /*!< xPSR: Q Position */\n#define xPSR_Q_Msk                         (1UL << xPSR_Q_Pos)                            /*!< xPSR: Q Mask */\n\n#define xPSR_IT_Pos                        25U                                            /*!< xPSR: IT Position */\n#define xPSR_IT_Msk                        (3UL << xPSR_IT_Pos)                           /*!< xPSR: IT Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_GE_Pos                        16U                                            /*!< xPSR: GE Position */\n#define xPSR_GE_Msk                        (0xFUL << xPSR_GE_Pos)                         /*!< xPSR: GE Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack-pointer select */\n    uint32_t FPCA:1;                     /*!< bit:      2  Floating-point context active */\n    uint32_t SFPA:1;                     /*!< bit:      3  Secure floating-point active */\n    uint32_t _reserved1:28;              /*!< bit:  4..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SFPA_Pos                    3U                                            /*!< CONTROL: SFPA Position */\n#define CONTROL_SFPA_Msk                   (1UL << CONTROL_SFPA_Pos)                      /*!< CONTROL: SFPA Mask */\n\n#define CONTROL_FPCA_Pos                    2U                                            /*!< CONTROL: FPCA Position */\n#define CONTROL_FPCA_Msk                   (1UL << CONTROL_FPCA_Pos)                      /*!< CONTROL: FPCA Mask */\n\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[16U];              /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[16U];\n  __IOM uint32_t ICER[16U];              /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[16U];\n  __IOM uint32_t ISPR[16U];              /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[16U];\n  __IOM uint32_t ICPR[16U];              /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[16U];\n  __IOM uint32_t IABR[16U];              /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */\n        uint32_t RESERVED4[16U];\n  __IOM uint32_t ITNS[16U];              /*!< Offset: 0x280 (R/W)  Interrupt Non-Secure State Register */\n        uint32_t RESERVED5[16U];\n  __IOM uint8_t  IPR[496U];              /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */\n        uint32_t RESERVED6[580U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */\n}  NVIC_Type;\n\n/* Software Triggered Interrupt Register Definitions */\n#define NVIC_STIR_INTID_Pos                 0U                                         /*!< STIR: INTLINESNUM Position */\n#define NVIC_STIR_INTID_Msk                (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/)        /*!< STIR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n  __IOM uint8_t  SHPR[12U];              /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11, 12-15) */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n  __IOM uint32_t CFSR;                   /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register */\n  __IOM uint32_t HFSR;                   /*!< Offset: 0x02C (R/W)  HardFault Status Register */\n  __IOM uint32_t DFSR;                   /*!< Offset: 0x030 (R/W)  Debug Fault Status Register */\n  __IOM uint32_t MMFAR;                  /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register */\n  __IOM uint32_t BFAR;                   /*!< Offset: 0x038 (R/W)  BusFault Address Register */\n  __IOM uint32_t AFSR;                   /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register */\n  __IM  uint32_t ID_PFR[2U];             /*!< Offset: 0x040 (R/ )  Processor Feature Register */\n  __IM  uint32_t ID_DFR;                 /*!< Offset: 0x048 (R/ )  Debug Feature Register */\n  __IM  uint32_t ID_ADR;                 /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register */\n  __IM  uint32_t ID_MMFR[4U];            /*!< Offset: 0x050 (R/ )  Memory Model Feature Register */\n  __IM  uint32_t ID_ISAR[6U];            /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register */\n  __IM  uint32_t CLIDR;                  /*!< Offset: 0x078 (R/ )  Cache Level ID register */\n  __IM  uint32_t CTR;                    /*!< Offset: 0x07C (R/ )  Cache Type register */\n  __IM  uint32_t CCSIDR;                 /*!< Offset: 0x080 (R/ )  Cache Size ID Register */\n  __IOM uint32_t CSSELR;                 /*!< Offset: 0x084 (R/W)  Cache Size Selection Register */\n  __IOM uint32_t CPACR;                  /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register */\n  __IOM uint32_t NSACR;                  /*!< Offset: 0x08C (R/W)  Non-Secure Access Control Register */\n        uint32_t RESERVED3[92U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0x200 ( /W)  Software Triggered Interrupt Register */\n        uint32_t RESERVED4[15U];\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x240 (R/ )  Media and VFP Feature Register 0 */\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x244 (R/ )  Media and VFP Feature Register 1 */\n  __IM  uint32_t MVFR2;                  /*!< Offset: 0x248 (R/ )  Media and VFP Feature Register 1 */\n        uint32_t RESERVED5[1U];\n  __OM  uint32_t ICIALLU;                /*!< Offset: 0x250 ( /W)  I-Cache Invalidate All to PoU */\n        uint32_t RESERVED6[1U];\n  __OM  uint32_t ICIMVAU;                /*!< Offset: 0x258 ( /W)  I-Cache Invalidate by MVA to PoU */\n  __OM  uint32_t DCIMVAC;                /*!< Offset: 0x25C ( /W)  D-Cache Invalidate by MVA to PoC */\n  __OM  uint32_t DCISW;                  /*!< Offset: 0x260 ( /W)  D-Cache Invalidate by Set-way */\n  __OM  uint32_t DCCMVAU;                /*!< Offset: 0x264 ( /W)  D-Cache Clean by MVA to PoU */\n  __OM  uint32_t DCCMVAC;                /*!< Offset: 0x268 ( /W)  D-Cache Clean by MVA to PoC */\n  __OM  uint32_t DCCSW;                  /*!< Offset: 0x26C ( /W)  D-Cache Clean by Set-way */\n  __OM  uint32_t DCCIMVAC;               /*!< Offset: 0x270 ( /W)  D-Cache Clean and Invalidate by MVA to PoC */\n  __OM  uint32_t DCCISW;                 /*!< Offset: 0x274 ( /W)  D-Cache Clean and Invalidate by Set-way */\n        uint32_t RESERVED7[6U];\n  __IOM uint32_t ITCMCR;                 /*!< Offset: 0x290 (R/W)  Instruction Tightly-Coupled Memory Control Register */\n  __IOM uint32_t DTCMCR;                 /*!< Offset: 0x294 (R/W)  Data Tightly-Coupled Memory Control Registers */\n  __IOM uint32_t AHBPCR;                 /*!< Offset: 0x298 (R/W)  AHBP Control Register */\n  __IOM uint32_t CACR;                   /*!< Offset: 0x29C (R/W)  L1 Cache Control Register */\n  __IOM uint32_t AHBSCR;                 /*!< Offset: 0x2A0 (R/W)  AHB Slave Control Register */\n        uint32_t RESERVED8[1U];\n  __IOM uint32_t ABFSR;                  /*!< Offset: 0x2A8 (R/W)  Auxiliary Bus Fault Status Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_PENDNMISET_Pos            31U                                            /*!< SCB ICSR: PENDNMISET Position */\n#define SCB_ICSR_PENDNMISET_Msk            (1UL << SCB_ICSR_PENDNMISET_Pos)               /*!< SCB ICSR: PENDNMISET Mask */\n\n#define SCB_ICSR_PENDNMICLR_Pos            30U                                            /*!< SCB ICSR: PENDNMICLR Position */\n#define SCB_ICSR_PENDNMICLR_Msk            (1UL << SCB_ICSR_PENDNMICLR_Pos)               /*!< SCB ICSR: PENDNMICLR Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_STTNS_Pos                 24U                                            /*!< SCB ICSR: STTNS Position (Security Extension) */\n#define SCB_ICSR_STTNS_Msk                 (1UL << SCB_ICSR_STTNS_Pos)                    /*!< SCB ICSR: STTNS Mask (Security Extension) */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_RETTOBASE_Pos             11U                                            /*!< SCB ICSR: RETTOBASE Position */\n#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n/* SCB Vector Table Offset Register Definitions */\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_PRIS_Pos                 14U                                            /*!< SCB AIRCR: PRIS Position */\n#define SCB_AIRCR_PRIS_Msk                 (1UL << SCB_AIRCR_PRIS_Pos)                    /*!< SCB AIRCR: PRIS Mask */\n\n#define SCB_AIRCR_BFHFNMINS_Pos            13U                                            /*!< SCB AIRCR: BFHFNMINS Position */\n#define SCB_AIRCR_BFHFNMINS_Msk            (1UL << SCB_AIRCR_BFHFNMINS_Pos)               /*!< SCB AIRCR: BFHFNMINS Mask */\n\n#define SCB_AIRCR_PRIGROUP_Pos              8U                                            /*!< SCB AIRCR: PRIGROUP Position */\n#define SCB_AIRCR_PRIGROUP_Msk             (7UL << SCB_AIRCR_PRIGROUP_Pos)                /*!< SCB AIRCR: PRIGROUP Mask */\n\n#define SCB_AIRCR_SYSRESETREQS_Pos          3U                                            /*!< SCB AIRCR: SYSRESETREQS Position */\n#define SCB_AIRCR_SYSRESETREQS_Msk         (1UL << SCB_AIRCR_SYSRESETREQS_Pos)            /*!< SCB AIRCR: SYSRESETREQS Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEPS_Pos              3U                                            /*!< SCB SCR: SLEEPDEEPS Position */\n#define SCB_SCR_SLEEPDEEPS_Msk             (1UL << SCB_SCR_SLEEPDEEPS_Pos)                /*!< SCB SCR: SLEEPDEEPS Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_BP_Pos                     18U                                            /*!< SCB CCR: BP Position */\n#define SCB_CCR_BP_Msk                     (1UL << SCB_CCR_BP_Pos)                        /*!< SCB CCR: BP Mask */\n\n#define SCB_CCR_IC_Pos                     17U                                            /*!< SCB CCR: IC Position */\n#define SCB_CCR_IC_Msk                     (1UL << SCB_CCR_IC_Pos)                        /*!< SCB CCR: IC Mask */\n\n#define SCB_CCR_DC_Pos                     16U                                            /*!< SCB CCR: DC Position */\n#define SCB_CCR_DC_Msk                     (1UL << SCB_CCR_DC_Pos)                        /*!< SCB CCR: DC Mask */\n\n#define SCB_CCR_STKOFHFNMIGN_Pos           10U                                            /*!< SCB CCR: STKOFHFNMIGN Position */\n#define SCB_CCR_STKOFHFNMIGN_Msk           (1UL << SCB_CCR_STKOFHFNMIGN_Pos)              /*!< SCB CCR: STKOFHFNMIGN Mask */\n\n#define SCB_CCR_BFHFNMIGN_Pos               8U                                            /*!< SCB CCR: BFHFNMIGN Position */\n#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */\n\n#define SCB_CCR_DIV_0_TRP_Pos               4U                                            /*!< SCB CCR: DIV_0_TRP Position */\n#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n#define SCB_CCR_USERSETMPEND_Pos            1U                                            /*!< SCB CCR: USERSETMPEND Position */\n#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_HARDFAULTPENDED_Pos      21U                                            /*!< SCB SHCSR: HARDFAULTPENDED Position */\n#define SCB_SHCSR_HARDFAULTPENDED_Msk      (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos)         /*!< SCB SHCSR: HARDFAULTPENDED Mask */\n\n#define SCB_SHCSR_SECUREFAULTPENDED_Pos    20U                                            /*!< SCB SHCSR: SECUREFAULTPENDED Position */\n#define SCB_SHCSR_SECUREFAULTPENDED_Msk    (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos)       /*!< SCB SHCSR: SECUREFAULTPENDED Mask */\n\n#define SCB_SHCSR_SECUREFAULTENA_Pos       19U                                            /*!< SCB SHCSR: SECUREFAULTENA Position */\n#define SCB_SHCSR_SECUREFAULTENA_Msk       (1UL << SCB_SHCSR_SECUREFAULTENA_Pos)          /*!< SCB SHCSR: SECUREFAULTENA Mask */\n\n#define SCB_SHCSR_USGFAULTENA_Pos          18U                                            /*!< SCB SHCSR: USGFAULTENA Position */\n#define SCB_SHCSR_USGFAULTENA_Msk          (1UL << SCB_SHCSR_USGFAULTENA_Pos)             /*!< SCB SHCSR: USGFAULTENA Mask */\n\n#define SCB_SHCSR_BUSFAULTENA_Pos          17U                                            /*!< SCB SHCSR: BUSFAULTENA Position */\n#define SCB_SHCSR_BUSFAULTENA_Msk          (1UL << SCB_SHCSR_BUSFAULTENA_Pos)             /*!< SCB SHCSR: BUSFAULTENA Mask */\n\n#define SCB_SHCSR_MEMFAULTENA_Pos          16U                                            /*!< SCB SHCSR: MEMFAULTENA Position */\n#define SCB_SHCSR_MEMFAULTENA_Msk          (1UL << SCB_SHCSR_MEMFAULTENA_Pos)             /*!< SCB SHCSR: MEMFAULTENA Mask */\n\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n#define SCB_SHCSR_BUSFAULTPENDED_Pos       14U                                            /*!< SCB SHCSR: BUSFAULTPENDED Position */\n#define SCB_SHCSR_BUSFAULTPENDED_Msk       (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos)          /*!< SCB SHCSR: BUSFAULTPENDED Mask */\n\n#define SCB_SHCSR_MEMFAULTPENDED_Pos       13U                                            /*!< SCB SHCSR: MEMFAULTPENDED Position */\n#define SCB_SHCSR_MEMFAULTPENDED_Msk       (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos)          /*!< SCB SHCSR: MEMFAULTPENDED Mask */\n\n#define SCB_SHCSR_USGFAULTPENDED_Pos       12U                                            /*!< SCB SHCSR: USGFAULTPENDED Position */\n#define SCB_SHCSR_USGFAULTPENDED_Msk       (1UL << SCB_SHCSR_USGFAULTPENDED_Pos)          /*!< SCB SHCSR: USGFAULTPENDED Mask */\n\n#define SCB_SHCSR_SYSTICKACT_Pos           11U                                            /*!< SCB SHCSR: SYSTICKACT Position */\n#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */\n\n#define SCB_SHCSR_PENDSVACT_Pos            10U                                            /*!< SCB SHCSR: PENDSVACT Position */\n#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */\n\n#define SCB_SHCSR_MONITORACT_Pos            8U                                            /*!< SCB SHCSR: MONITORACT Position */\n#define SCB_SHCSR_MONITORACT_Msk           (1UL << SCB_SHCSR_MONITORACT_Pos)              /*!< SCB SHCSR: MONITORACT Mask */\n\n#define SCB_SHCSR_SVCALLACT_Pos             7U                                            /*!< SCB SHCSR: SVCALLACT Position */\n#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */\n\n#define SCB_SHCSR_NMIACT_Pos                5U                                            /*!< SCB SHCSR: NMIACT Position */\n#define SCB_SHCSR_NMIACT_Msk               (1UL << SCB_SHCSR_NMIACT_Pos)                  /*!< SCB SHCSR: NMIACT Mask */\n\n#define SCB_SHCSR_SECUREFAULTACT_Pos        4U                                            /*!< SCB SHCSR: SECUREFAULTACT Position */\n#define SCB_SHCSR_SECUREFAULTACT_Msk       (1UL << SCB_SHCSR_SECUREFAULTACT_Pos)          /*!< SCB SHCSR: SECUREFAULTACT Mask */\n\n#define SCB_SHCSR_USGFAULTACT_Pos           3U                                            /*!< SCB SHCSR: USGFAULTACT Position */\n#define SCB_SHCSR_USGFAULTACT_Msk          (1UL << SCB_SHCSR_USGFAULTACT_Pos)             /*!< SCB SHCSR: USGFAULTACT Mask */\n\n#define SCB_SHCSR_HARDFAULTACT_Pos          2U                                            /*!< SCB SHCSR: HARDFAULTACT Position */\n#define SCB_SHCSR_HARDFAULTACT_Msk         (1UL << SCB_SHCSR_HARDFAULTACT_Pos)            /*!< SCB SHCSR: HARDFAULTACT Mask */\n\n#define SCB_SHCSR_BUSFAULTACT_Pos           1U                                            /*!< SCB SHCSR: BUSFAULTACT Position */\n#define SCB_SHCSR_BUSFAULTACT_Msk          (1UL << SCB_SHCSR_BUSFAULTACT_Pos)             /*!< SCB SHCSR: BUSFAULTACT Mask */\n\n#define SCB_SHCSR_MEMFAULTACT_Pos           0U                                            /*!< SCB SHCSR: MEMFAULTACT Position */\n#define SCB_SHCSR_MEMFAULTACT_Msk          (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/)         /*!< SCB SHCSR: MEMFAULTACT Mask */\n\n/* SCB Configurable Fault Status Register Definitions */\n#define SCB_CFSR_USGFAULTSR_Pos            16U                                            /*!< SCB CFSR: Usage Fault Status Register Position */\n#define SCB_CFSR_USGFAULTSR_Msk            (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos)          /*!< SCB CFSR: Usage Fault Status Register Mask */\n\n#define SCB_CFSR_BUSFAULTSR_Pos             8U                                            /*!< SCB CFSR: Bus Fault Status Register Position */\n#define SCB_CFSR_BUSFAULTSR_Msk            (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos)            /*!< SCB CFSR: Bus Fault Status Register Mask */\n\n#define SCB_CFSR_MEMFAULTSR_Pos             0U                                            /*!< SCB CFSR: Memory Manage Fault Status Register Position */\n#define SCB_CFSR_MEMFAULTSR_Msk            (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/)        /*!< SCB CFSR: Memory Manage Fault Status Register Mask */\n\n/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_MMARVALID_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 7U)               /*!< SCB CFSR (MMFSR): MMARVALID Position */\n#define SCB_CFSR_MMARVALID_Msk             (1UL << SCB_CFSR_MMARVALID_Pos)                /*!< SCB CFSR (MMFSR): MMARVALID Mask */\n\n#define SCB_CFSR_MLSPERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 5U)               /*!< SCB CFSR (MMFSR): MLSPERR Position */\n#define SCB_CFSR_MLSPERR_Msk               (1UL << SCB_CFSR_MLSPERR_Pos)                  /*!< SCB CFSR (MMFSR): MLSPERR Mask */\n\n#define SCB_CFSR_MSTKERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 4U)               /*!< SCB CFSR (MMFSR): MSTKERR Position */\n#define SCB_CFSR_MSTKERR_Msk               (1UL << SCB_CFSR_MSTKERR_Pos)                  /*!< SCB CFSR (MMFSR): MSTKERR Mask */\n\n#define SCB_CFSR_MUNSTKERR_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 3U)               /*!< SCB CFSR (MMFSR): MUNSTKERR Position */\n#define SCB_CFSR_MUNSTKERR_Msk             (1UL << SCB_CFSR_MUNSTKERR_Pos)                /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */\n\n#define SCB_CFSR_DACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 1U)               /*!< SCB CFSR (MMFSR): DACCVIOL Position */\n#define SCB_CFSR_DACCVIOL_Msk              (1UL << SCB_CFSR_DACCVIOL_Pos)                 /*!< SCB CFSR (MMFSR): DACCVIOL Mask */\n\n#define SCB_CFSR_IACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 0U)               /*!< SCB CFSR (MMFSR): IACCVIOL Position */\n#define SCB_CFSR_IACCVIOL_Msk              (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/)             /*!< SCB CFSR (MMFSR): IACCVIOL Mask */\n\n/* BusFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_BFARVALID_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 7U)                  /*!< SCB CFSR (BFSR): BFARVALID Position */\n#define SCB_CFSR_BFARVALID_Msk            (1UL << SCB_CFSR_BFARVALID_Pos)                 /*!< SCB CFSR (BFSR): BFARVALID Mask */\n\n#define SCB_CFSR_LSPERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 5U)                  /*!< SCB CFSR (BFSR): LSPERR Position */\n#define SCB_CFSR_LSPERR_Msk               (1UL << SCB_CFSR_LSPERR_Pos)                    /*!< SCB CFSR (BFSR): LSPERR Mask */\n\n#define SCB_CFSR_STKERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 4U)                  /*!< SCB CFSR (BFSR): STKERR Position */\n#define SCB_CFSR_STKERR_Msk               (1UL << SCB_CFSR_STKERR_Pos)                    /*!< SCB CFSR (BFSR): STKERR Mask */\n\n#define SCB_CFSR_UNSTKERR_Pos             (SCB_CFSR_BUSFAULTSR_Pos + 3U)                  /*!< SCB CFSR (BFSR): UNSTKERR Position */\n#define SCB_CFSR_UNSTKERR_Msk             (1UL << SCB_CFSR_UNSTKERR_Pos)                  /*!< SCB CFSR (BFSR): UNSTKERR Mask */\n\n#define SCB_CFSR_IMPRECISERR_Pos          (SCB_CFSR_BUSFAULTSR_Pos + 2U)                  /*!< SCB CFSR (BFSR): IMPRECISERR Position */\n#define SCB_CFSR_IMPRECISERR_Msk          (1UL << SCB_CFSR_IMPRECISERR_Pos)               /*!< SCB CFSR (BFSR): IMPRECISERR Mask */\n\n#define SCB_CFSR_PRECISERR_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 1U)                  /*!< SCB CFSR (BFSR): PRECISERR Position */\n#define SCB_CFSR_PRECISERR_Msk            (1UL << SCB_CFSR_PRECISERR_Pos)                 /*!< SCB CFSR (BFSR): PRECISERR Mask */\n\n#define SCB_CFSR_IBUSERR_Pos              (SCB_CFSR_BUSFAULTSR_Pos + 0U)                  /*!< SCB CFSR (BFSR): IBUSERR Position */\n#define SCB_CFSR_IBUSERR_Msk              (1UL << SCB_CFSR_IBUSERR_Pos)                   /*!< SCB CFSR (BFSR): IBUSERR Mask */\n\n/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_DIVBYZERO_Pos            (SCB_CFSR_USGFAULTSR_Pos + 9U)                  /*!< SCB CFSR (UFSR): DIVBYZERO Position */\n#define SCB_CFSR_DIVBYZERO_Msk            (1UL << SCB_CFSR_DIVBYZERO_Pos)                 /*!< SCB CFSR (UFSR): DIVBYZERO Mask */\n\n#define SCB_CFSR_UNALIGNED_Pos            (SCB_CFSR_USGFAULTSR_Pos + 8U)                  /*!< SCB CFSR (UFSR): UNALIGNED Position */\n#define SCB_CFSR_UNALIGNED_Msk            (1UL << SCB_CFSR_UNALIGNED_Pos)                 /*!< SCB CFSR (UFSR): UNALIGNED Mask */\n\n#define SCB_CFSR_STKOF_Pos                (SCB_CFSR_USGFAULTSR_Pos + 4U)                  /*!< SCB CFSR (UFSR): STKOF Position */\n#define SCB_CFSR_STKOF_Msk                (1UL << SCB_CFSR_STKOF_Pos)                     /*!< SCB CFSR (UFSR): STKOF Mask */\n\n#define SCB_CFSR_NOCP_Pos                 (SCB_CFSR_USGFAULTSR_Pos + 3U)                  /*!< SCB CFSR (UFSR): NOCP Position */\n#define SCB_CFSR_NOCP_Msk                 (1UL << SCB_CFSR_NOCP_Pos)                      /*!< SCB CFSR (UFSR): NOCP Mask */\n\n#define SCB_CFSR_INVPC_Pos                (SCB_CFSR_USGFAULTSR_Pos + 2U)                  /*!< SCB CFSR (UFSR): INVPC Position */\n#define SCB_CFSR_INVPC_Msk                (1UL << SCB_CFSR_INVPC_Pos)                     /*!< SCB CFSR (UFSR): INVPC Mask */\n\n#define SCB_CFSR_INVSTATE_Pos             (SCB_CFSR_USGFAULTSR_Pos + 1U)                  /*!< SCB CFSR (UFSR): INVSTATE Position */\n#define SCB_CFSR_INVSTATE_Msk             (1UL << SCB_CFSR_INVSTATE_Pos)                  /*!< SCB CFSR (UFSR): INVSTATE Mask */\n\n#define SCB_CFSR_UNDEFINSTR_Pos           (SCB_CFSR_USGFAULTSR_Pos + 0U)                  /*!< SCB CFSR (UFSR): UNDEFINSTR Position */\n#define SCB_CFSR_UNDEFINSTR_Msk           (1UL << SCB_CFSR_UNDEFINSTR_Pos)                /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */\n\n/* SCB Hard Fault Status Register Definitions */\n#define SCB_HFSR_DEBUGEVT_Pos              31U                                            /*!< SCB HFSR: DEBUGEVT Position */\n#define SCB_HFSR_DEBUGEVT_Msk              (1UL << SCB_HFSR_DEBUGEVT_Pos)                 /*!< SCB HFSR: DEBUGEVT Mask */\n\n#define SCB_HFSR_FORCED_Pos                30U                                            /*!< SCB HFSR: FORCED Position */\n#define SCB_HFSR_FORCED_Msk                (1UL << SCB_HFSR_FORCED_Pos)                   /*!< SCB HFSR: FORCED Mask */\n\n#define SCB_HFSR_VECTTBL_Pos                1U                                            /*!< SCB HFSR: VECTTBL Position */\n#define SCB_HFSR_VECTTBL_Msk               (1UL << SCB_HFSR_VECTTBL_Pos)                  /*!< SCB HFSR: VECTTBL Mask */\n\n/* SCB Debug Fault Status Register Definitions */\n#define SCB_DFSR_EXTERNAL_Pos               4U                                            /*!< SCB DFSR: EXTERNAL Position */\n#define SCB_DFSR_EXTERNAL_Msk              (1UL << SCB_DFSR_EXTERNAL_Pos)                 /*!< SCB DFSR: EXTERNAL Mask */\n\n#define SCB_DFSR_VCATCH_Pos                 3U                                            /*!< SCB DFSR: VCATCH Position */\n#define SCB_DFSR_VCATCH_Msk                (1UL << SCB_DFSR_VCATCH_Pos)                   /*!< SCB DFSR: VCATCH Mask */\n\n#define SCB_DFSR_DWTTRAP_Pos                2U                                            /*!< SCB DFSR: DWTTRAP Position */\n#define SCB_DFSR_DWTTRAP_Msk               (1UL << SCB_DFSR_DWTTRAP_Pos)                  /*!< SCB DFSR: DWTTRAP Mask */\n\n#define SCB_DFSR_BKPT_Pos                   1U                                            /*!< SCB DFSR: BKPT Position */\n#define SCB_DFSR_BKPT_Msk                  (1UL << SCB_DFSR_BKPT_Pos)                     /*!< SCB DFSR: BKPT Mask */\n\n#define SCB_DFSR_HALTED_Pos                 0U                                            /*!< SCB DFSR: HALTED Position */\n#define SCB_DFSR_HALTED_Msk                (1UL /*<< SCB_DFSR_HALTED_Pos*/)               /*!< SCB DFSR: HALTED Mask */\n\n/* SCB Non-Secure Access Control Register Definitions */\n#define SCB_NSACR_CP11_Pos                 11U                                            /*!< SCB NSACR: CP11 Position */\n#define SCB_NSACR_CP11_Msk                 (1UL << SCB_NSACR_CP11_Pos)                    /*!< SCB NSACR: CP11 Mask */\n\n#define SCB_NSACR_CP10_Pos                 10U                                            /*!< SCB NSACR: CP10 Position */\n#define SCB_NSACR_CP10_Msk                 (1UL << SCB_NSACR_CP10_Pos)                    /*!< SCB NSACR: CP10 Mask */\n\n#define SCB_NSACR_CPn_Pos                   0U                                            /*!< SCB NSACR: CPn Position */\n#define SCB_NSACR_CPn_Msk                  (1UL /*<< SCB_NSACR_CPn_Pos*/)                 /*!< SCB NSACR: CPn Mask */\n\n/* SCB Cache Level ID Register Definitions */\n#define SCB_CLIDR_LOUU_Pos                 27U                                            /*!< SCB CLIDR: LoUU Position */\n#define SCB_CLIDR_LOUU_Msk                 (7UL << SCB_CLIDR_LOUU_Pos)                    /*!< SCB CLIDR: LoUU Mask */\n\n#define SCB_CLIDR_LOC_Pos                  24U                                            /*!< SCB CLIDR: LoC Position */\n#define SCB_CLIDR_LOC_Msk                  (7UL << SCB_CLIDR_LOC_Pos)                     /*!< SCB CLIDR: LoC Mask */\n\n/* SCB Cache Type Register Definitions */\n#define SCB_CTR_FORMAT_Pos                 29U                                            /*!< SCB CTR: Format Position */\n#define SCB_CTR_FORMAT_Msk                 (7UL << SCB_CTR_FORMAT_Pos)                    /*!< SCB CTR: Format Mask */\n\n#define SCB_CTR_CWG_Pos                    24U                                            /*!< SCB CTR: CWG Position */\n#define SCB_CTR_CWG_Msk                    (0xFUL << SCB_CTR_CWG_Pos)                     /*!< SCB CTR: CWG Mask */\n\n#define SCB_CTR_ERG_Pos                    20U                                            /*!< SCB CTR: ERG Position */\n#define SCB_CTR_ERG_Msk                    (0xFUL << SCB_CTR_ERG_Pos)                     /*!< SCB CTR: ERG Mask */\n\n#define SCB_CTR_DMINLINE_Pos               16U                                            /*!< SCB CTR: DminLine Position */\n#define SCB_CTR_DMINLINE_Msk               (0xFUL << SCB_CTR_DMINLINE_Pos)                /*!< SCB CTR: DminLine Mask */\n\n#define SCB_CTR_IMINLINE_Pos                0U                                            /*!< SCB CTR: ImInLine Position */\n#define SCB_CTR_IMINLINE_Msk               (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/)            /*!< SCB CTR: ImInLine Mask */\n\n/* SCB Cache Size ID Register Definitions */\n#define SCB_CCSIDR_WT_Pos                  31U                                            /*!< SCB CCSIDR: WT Position */\n#define SCB_CCSIDR_WT_Msk                  (1UL << SCB_CCSIDR_WT_Pos)                     /*!< SCB CCSIDR: WT Mask */\n\n#define SCB_CCSIDR_WB_Pos                  30U                                            /*!< SCB CCSIDR: WB Position */\n#define SCB_CCSIDR_WB_Msk                  (1UL << SCB_CCSIDR_WB_Pos)                     /*!< SCB CCSIDR: WB Mask */\n\n#define SCB_CCSIDR_RA_Pos                  29U                                            /*!< SCB CCSIDR: RA Position */\n#define SCB_CCSIDR_RA_Msk                  (1UL << SCB_CCSIDR_RA_Pos)                     /*!< SCB CCSIDR: RA Mask */\n\n#define SCB_CCSIDR_WA_Pos                  28U                                            /*!< SCB CCSIDR: WA Position */\n#define SCB_CCSIDR_WA_Msk                  (1UL << SCB_CCSIDR_WA_Pos)                     /*!< SCB CCSIDR: WA Mask */\n\n#define SCB_CCSIDR_NUMSETS_Pos             13U                                            /*!< SCB CCSIDR: NumSets Position */\n#define SCB_CCSIDR_NUMSETS_Msk             (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos)           /*!< SCB CCSIDR: NumSets Mask */\n\n#define SCB_CCSIDR_ASSOCIATIVITY_Pos        3U                                            /*!< SCB CCSIDR: Associativity Position */\n#define SCB_CCSIDR_ASSOCIATIVITY_Msk       (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos)      /*!< SCB CCSIDR: Associativity Mask */\n\n#define SCB_CCSIDR_LINESIZE_Pos             0U                                            /*!< SCB CCSIDR: LineSize Position */\n#define SCB_CCSIDR_LINESIZE_Msk            (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/)           /*!< SCB CCSIDR: LineSize Mask */\n\n/* SCB Cache Size Selection Register Definitions */\n#define SCB_CSSELR_LEVEL_Pos                1U                                            /*!< SCB CSSELR: Level Position */\n#define SCB_CSSELR_LEVEL_Msk               (7UL << SCB_CSSELR_LEVEL_Pos)                  /*!< SCB CSSELR: Level Mask */\n\n#define SCB_CSSELR_IND_Pos                  0U                                            /*!< SCB CSSELR: InD Position */\n#define SCB_CSSELR_IND_Msk                 (1UL /*<< SCB_CSSELR_IND_Pos*/)                /*!< SCB CSSELR: InD Mask */\n\n/* SCB Software Triggered Interrupt Register Definitions */\n#define SCB_STIR_INTID_Pos                  0U                                            /*!< SCB STIR: INTID Position */\n#define SCB_STIR_INTID_Msk                 (0x1FFUL /*<< SCB_STIR_INTID_Pos*/)            /*!< SCB STIR: INTID Mask */\n\n/* SCB D-Cache Invalidate by Set-way Register Definitions */\n#define SCB_DCISW_WAY_Pos                  30U                                            /*!< SCB DCISW: Way Position */\n#define SCB_DCISW_WAY_Msk                  (3UL << SCB_DCISW_WAY_Pos)                     /*!< SCB DCISW: Way Mask */\n\n#define SCB_DCISW_SET_Pos                   5U                                            /*!< SCB DCISW: Set Position */\n#define SCB_DCISW_SET_Msk                  (0x1FFUL << SCB_DCISW_SET_Pos)                 /*!< SCB DCISW: Set Mask */\n\n/* SCB D-Cache Clean by Set-way Register Definitions */\n#define SCB_DCCSW_WAY_Pos                  30U                                            /*!< SCB DCCSW: Way Position */\n#define SCB_DCCSW_WAY_Msk                  (3UL << SCB_DCCSW_WAY_Pos)                     /*!< SCB DCCSW: Way Mask */\n\n#define SCB_DCCSW_SET_Pos                   5U                                            /*!< SCB DCCSW: Set Position */\n#define SCB_DCCSW_SET_Msk                  (0x1FFUL << SCB_DCCSW_SET_Pos)                 /*!< SCB DCCSW: Set Mask */\n\n/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */\n#define SCB_DCCISW_WAY_Pos                 30U                                            /*!< SCB DCCISW: Way Position */\n#define SCB_DCCISW_WAY_Msk                 (3UL << SCB_DCCISW_WAY_Pos)                    /*!< SCB DCCISW: Way Mask */\n\n#define SCB_DCCISW_SET_Pos                  5U                                            /*!< SCB DCCISW: Set Position */\n#define SCB_DCCISW_SET_Msk                 (0x1FFUL << SCB_DCCISW_SET_Pos)                /*!< SCB DCCISW: Set Mask */\n\n/* Instruction Tightly-Coupled Memory Control Register Definitions */\n#define SCB_ITCMCR_SZ_Pos                   3U                                            /*!< SCB ITCMCR: SZ Position */\n#define SCB_ITCMCR_SZ_Msk                  (0xFUL << SCB_ITCMCR_SZ_Pos)                   /*!< SCB ITCMCR: SZ Mask */\n\n#define SCB_ITCMCR_RETEN_Pos                2U                                            /*!< SCB ITCMCR: RETEN Position */\n#define SCB_ITCMCR_RETEN_Msk               (1UL << SCB_ITCMCR_RETEN_Pos)                  /*!< SCB ITCMCR: RETEN Mask */\n\n#define SCB_ITCMCR_RMW_Pos                  1U                                            /*!< SCB ITCMCR: RMW Position */\n#define SCB_ITCMCR_RMW_Msk                 (1UL << SCB_ITCMCR_RMW_Pos)                    /*!< SCB ITCMCR: RMW Mask */\n\n#define SCB_ITCMCR_EN_Pos                   0U                                            /*!< SCB ITCMCR: EN Position */\n#define SCB_ITCMCR_EN_Msk                  (1UL /*<< SCB_ITCMCR_EN_Pos*/)                 /*!< SCB ITCMCR: EN Mask */\n\n/* Data Tightly-Coupled Memory Control Register Definitions */\n#define SCB_DTCMCR_SZ_Pos                   3U                                            /*!< SCB DTCMCR: SZ Position */\n#define SCB_DTCMCR_SZ_Msk                  (0xFUL << SCB_DTCMCR_SZ_Pos)                   /*!< SCB DTCMCR: SZ Mask */\n\n#define SCB_DTCMCR_RETEN_Pos                2U                                            /*!< SCB DTCMCR: RETEN Position */\n#define SCB_DTCMCR_RETEN_Msk               (1UL << SCB_DTCMCR_RETEN_Pos)                   /*!< SCB DTCMCR: RETEN Mask */\n\n#define SCB_DTCMCR_RMW_Pos                  1U                                            /*!< SCB DTCMCR: RMW Position */\n#define SCB_DTCMCR_RMW_Msk                 (1UL << SCB_DTCMCR_RMW_Pos)                    /*!< SCB DTCMCR: RMW Mask */\n\n#define SCB_DTCMCR_EN_Pos                   0U                                            /*!< SCB DTCMCR: EN Position */\n#define SCB_DTCMCR_EN_Msk                  (1UL /*<< SCB_DTCMCR_EN_Pos*/)                 /*!< SCB DTCMCR: EN Mask */\n\n/* AHBP Control Register Definitions */\n#define SCB_AHBPCR_SZ_Pos                   1U                                            /*!< SCB AHBPCR: SZ Position */\n#define SCB_AHBPCR_SZ_Msk                  (7UL << SCB_AHBPCR_SZ_Pos)                     /*!< SCB AHBPCR: SZ Mask */\n\n#define SCB_AHBPCR_EN_Pos                   0U                                            /*!< SCB AHBPCR: EN Position */\n#define SCB_AHBPCR_EN_Msk                  (1UL /*<< SCB_AHBPCR_EN_Pos*/)                 /*!< SCB AHBPCR: EN Mask */\n\n/* L1 Cache Control Register Definitions */\n#define SCB_CACR_FORCEWT_Pos                2U                                            /*!< SCB CACR: FORCEWT Position */\n#define SCB_CACR_FORCEWT_Msk               (1UL << SCB_CACR_FORCEWT_Pos)                  /*!< SCB CACR: FORCEWT Mask */\n\n#define SCB_CACR_ECCEN_Pos                  1U                                            /*!< SCB CACR: ECCEN Position */\n#define SCB_CACR_ECCEN_Msk                 (1UL << SCB_CACR_ECCEN_Pos)                    /*!< SCB CACR: ECCEN Mask */\n\n#define SCB_CACR_SIWT_Pos                   0U                                            /*!< SCB CACR: SIWT Position */\n#define SCB_CACR_SIWT_Msk                  (1UL /*<< SCB_CACR_SIWT_Pos*/)                 /*!< SCB CACR: SIWT Mask */\n\n/* AHBS Control Register Definitions */\n#define SCB_AHBSCR_INITCOUNT_Pos           11U                                            /*!< SCB AHBSCR: INITCOUNT Position */\n#define SCB_AHBSCR_INITCOUNT_Msk           (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos)           /*!< SCB AHBSCR: INITCOUNT Mask */\n\n#define SCB_AHBSCR_TPRI_Pos                 2U                                            /*!< SCB AHBSCR: TPRI Position */\n#define SCB_AHBSCR_TPRI_Msk                (0x1FFUL << SCB_AHBPCR_TPRI_Pos)               /*!< SCB AHBSCR: TPRI Mask */\n\n#define SCB_AHBSCR_CTL_Pos                  0U                                            /*!< SCB AHBSCR: CTL Position*/\n#define SCB_AHBSCR_CTL_Msk                 (3UL /*<< SCB_AHBPCR_CTL_Pos*/)                /*!< SCB AHBSCR: CTL Mask */\n\n/* Auxiliary Bus Fault Status Register Definitions */\n#define SCB_ABFSR_AXIMTYPE_Pos              8U                                            /*!< SCB ABFSR: AXIMTYPE Position*/\n#define SCB_ABFSR_AXIMTYPE_Msk             (3UL << SCB_ABFSR_AXIMTYPE_Pos)                /*!< SCB ABFSR: AXIMTYPE Mask */\n\n#define SCB_ABFSR_EPPB_Pos                  4U                                            /*!< SCB ABFSR: EPPB Position*/\n#define SCB_ABFSR_EPPB_Msk                 (1UL << SCB_ABFSR_EPPB_Pos)                    /*!< SCB ABFSR: EPPB Mask */\n\n#define SCB_ABFSR_AXIM_Pos                  3U                                            /*!< SCB ABFSR: AXIM Position*/\n#define SCB_ABFSR_AXIM_Msk                 (1UL << SCB_ABFSR_AXIM_Pos)                    /*!< SCB ABFSR: AXIM Mask */\n\n#define SCB_ABFSR_AHBP_Pos                  2U                                            /*!< SCB ABFSR: AHBP Position*/\n#define SCB_ABFSR_AHBP_Msk                 (1UL << SCB_ABFSR_AHBP_Pos)                    /*!< SCB ABFSR: AHBP Mask */\n\n#define SCB_ABFSR_DTCM_Pos                  1U                                            /*!< SCB ABFSR: DTCM Position*/\n#define SCB_ABFSR_DTCM_Msk                 (1UL << SCB_ABFSR_DTCM_Pos)                    /*!< SCB ABFSR: DTCM Mask */\n\n#define SCB_ABFSR_ITCM_Pos                  0U                                            /*!< SCB ABFSR: ITCM Position*/\n#define SCB_ABFSR_ITCM_Msk                 (1UL /*<< SCB_ABFSR_ITCM_Pos*/)                /*!< SCB ABFSR: ITCM Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)\n  \\brief    Type definitions for the System Control and ID Register not in the SCB\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control and ID Register not in the SCB.\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IM  uint32_t ICTR;                   /*!< Offset: 0x004 (R/ )  Interrupt Controller Type Register */\n  __IOM uint32_t ACTLR;                  /*!< Offset: 0x008 (R/W)  Auxiliary Control Register */\n  __IOM uint32_t CPPWR;                  /*!< Offset: 0x00C (R/W)  Coprocessor Power Control  Register */\n} SCnSCB_Type;\n\n/* Interrupt Controller Type Register Definitions */\n#define SCnSCB_ICTR_INTLINESNUM_Pos         0U                                         /*!< ICTR: INTLINESNUM Position */\n#define SCnSCB_ICTR_INTLINESNUM_Msk        (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/)  /*!< ICTR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_SCnotSCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_ITM     Instrumentation Trace Macrocell (ITM)\n  \\brief    Type definitions for the Instrumentation Trace Macrocell (ITM)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Instrumentation Trace Macrocell Register (ITM).\n */\ntypedef struct\n{\n  __OM  union\n  {\n    __OM  uint8_t    u8;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit */\n    __OM  uint16_t   u16;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 16-bit */\n    __OM  uint32_t   u32;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 32-bit */\n  }  PORT [32U];                         /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers */\n        uint32_t RESERVED0[864U];\n  __IOM uint32_t TER;                    /*!< Offset: 0xE00 (R/W)  ITM Trace Enable Register */\n        uint32_t RESERVED1[15U];\n  __IOM uint32_t TPR;                    /*!< Offset: 0xE40 (R/W)  ITM Trace Privilege Register */\n        uint32_t RESERVED2[15U];\n  __IOM uint32_t TCR;                    /*!< Offset: 0xE80 (R/W)  ITM Trace Control Register */\n        uint32_t RESERVED3[29U];\n  __OM  uint32_t IWR;                    /*!< Offset: 0xEF8 ( /W)  ITM Integration Write Register */\n  __IM  uint32_t IRR;                    /*!< Offset: 0xEFC (R/ )  ITM Integration Read Register */\n  __IOM uint32_t IMCR;                   /*!< Offset: 0xF00 (R/W)  ITM Integration Mode Control Register */\n        uint32_t RESERVED4[43U];\n  __OM  uint32_t LAR;                    /*!< Offset: 0xFB0 ( /W)  ITM Lock Access Register */\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R/ )  ITM Lock Status Register */\n        uint32_t RESERVED5[1U];\n  __IM  uint32_t DEVARCH;                /*!< Offset: 0xFBC (R/ )  ITM Device Architecture Register */\n        uint32_t RESERVED6[4U];\n  __IM  uint32_t PID4;                   /*!< Offset: 0xFD0 (R/ )  ITM Peripheral Identification Register #4 */\n  __IM  uint32_t PID5;                   /*!< Offset: 0xFD4 (R/ )  ITM Peripheral Identification Register #5 */\n  __IM  uint32_t PID6;                   /*!< Offset: 0xFD8 (R/ )  ITM Peripheral Identification Register #6 */\n  __IM  uint32_t PID7;                   /*!< Offset: 0xFDC (R/ )  ITM Peripheral Identification Register #7 */\n  __IM  uint32_t PID0;                   /*!< Offset: 0xFE0 (R/ )  ITM Peripheral Identification Register #0 */\n  __IM  uint32_t PID1;                   /*!< Offset: 0xFE4 (R/ )  ITM Peripheral Identification Register #1 */\n  __IM  uint32_t PID2;                   /*!< Offset: 0xFE8 (R/ )  ITM Peripheral Identification Register #2 */\n  __IM  uint32_t PID3;                   /*!< Offset: 0xFEC (R/ )  ITM Peripheral Identification Register #3 */\n  __IM  uint32_t CID0;                   /*!< Offset: 0xFF0 (R/ )  ITM Component  Identification Register #0 */\n  __IM  uint32_t CID1;                   /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */\n  __IM  uint32_t CID2;                   /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */\n  __IM  uint32_t CID3;                   /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */\n} ITM_Type;\n\n/* ITM Stimulus Port Register Definitions */\n#define ITM_STIM_DISABLED_Pos               1U                                            /*!< ITM STIM: DISABLED Position */\n#define ITM_STIM_DISABLED_Msk              (0x1UL << ITM_STIM_DISABLED_Pos)               /*!< ITM STIM: DISABLED Mask */\n\n#define ITM_STIM_FIFOREADY_Pos              0U                                            /*!< ITM STIM: FIFOREADY Position */\n#define ITM_STIM_FIFOREADY_Msk             (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/)          /*!< ITM STIM: FIFOREADY Mask */\n\n/* ITM Trace Privilege Register Definitions */\n#define ITM_TPR_PRIVMASK_Pos                0U                                            /*!< ITM TPR: PRIVMASK Position */\n#define ITM_TPR_PRIVMASK_Msk               (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/)            /*!< ITM TPR: PRIVMASK Mask */\n\n/* ITM Trace Control Register Definitions */\n#define ITM_TCR_BUSY_Pos                   23U                                            /*!< ITM TCR: BUSY Position */\n#define ITM_TCR_BUSY_Msk                   (1UL << ITM_TCR_BUSY_Pos)                      /*!< ITM TCR: BUSY Mask */\n\n#define ITM_TCR_TRACEBUSID_Pos             16U                                            /*!< ITM TCR: ATBID Position */\n#define ITM_TCR_TRACEBUSID_Msk             (0x7FUL << ITM_TCR_TRACEBUSID_Pos)             /*!< ITM TCR: ATBID Mask */\n\n#define ITM_TCR_GTSFREQ_Pos                10U                                            /*!< ITM TCR: Global timestamp frequency Position */\n#define ITM_TCR_GTSFREQ_Msk                (3UL << ITM_TCR_GTSFREQ_Pos)                   /*!< ITM TCR: Global timestamp frequency Mask */\n\n#define ITM_TCR_TSPRESCALE_Pos              8U                                            /*!< ITM TCR: TSPRESCALE Position */\n#define ITM_TCR_TSPRESCALE_Msk             (3UL << ITM_TCR_TSPRESCALE_Pos)                /*!< ITM TCR: TSPRESCALE Mask */\n\n#define ITM_TCR_STALLENA_Pos                5U                                            /*!< ITM TCR: STALLENA Position */\n#define ITM_TCR_STALLENA_Msk               (1UL << ITM_TCR_STALLENA_Pos)                  /*!< ITM TCR: STALLENA Mask */\n\n#define ITM_TCR_SWOENA_Pos                  4U                                            /*!< ITM TCR: SWOENA Position */\n#define ITM_TCR_SWOENA_Msk                 (1UL << ITM_TCR_SWOENA_Pos)                    /*!< ITM TCR: SWOENA Mask */\n\n#define ITM_TCR_DWTENA_Pos                  3U                                            /*!< ITM TCR: DWTENA Position */\n#define ITM_TCR_DWTENA_Msk                 (1UL << ITM_TCR_DWTENA_Pos)                    /*!< ITM TCR: DWTENA Mask */\n\n#define ITM_TCR_SYNCENA_Pos                 2U                                            /*!< ITM TCR: SYNCENA Position */\n#define ITM_TCR_SYNCENA_Msk                (1UL << ITM_TCR_SYNCENA_Pos)                   /*!< ITM TCR: SYNCENA Mask */\n\n#define ITM_TCR_TSENA_Pos                   1U                                            /*!< ITM TCR: TSENA Position */\n#define ITM_TCR_TSENA_Msk                  (1UL << ITM_TCR_TSENA_Pos)                     /*!< ITM TCR: TSENA Mask */\n\n#define ITM_TCR_ITMENA_Pos                  0U                                            /*!< ITM TCR: ITM Enable bit Position */\n#define ITM_TCR_ITMENA_Msk                 (1UL /*<< ITM_TCR_ITMENA_Pos*/)                /*!< ITM TCR: ITM Enable bit Mask */\n\n/* ITM Integration Write Register Definitions */\n#define ITM_IWR_ATVALIDM_Pos                0U                                            /*!< ITM IWR: ATVALIDM Position */\n#define ITM_IWR_ATVALIDM_Msk               (1UL /*<< ITM_IWR_ATVALIDM_Pos*/)              /*!< ITM IWR: ATVALIDM Mask */\n\n/* ITM Integration Read Register Definitions */\n#define ITM_IRR_ATREADYM_Pos                0U                                            /*!< ITM IRR: ATREADYM Position */\n#define ITM_IRR_ATREADYM_Msk               (1UL /*<< ITM_IRR_ATREADYM_Pos*/)              /*!< ITM IRR: ATREADYM Mask */\n\n/* ITM Integration Mode Control Register Definitions */\n#define ITM_IMCR_INTEGRATION_Pos            0U                                            /*!< ITM IMCR: INTEGRATION Position */\n#define ITM_IMCR_INTEGRATION_Msk           (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/)          /*!< ITM IMCR: INTEGRATION Mask */\n\n/* ITM Lock Status Register Definitions */\n#define ITM_LSR_ByteAcc_Pos                 2U                                            /*!< ITM LSR: ByteAcc Position */\n#define ITM_LSR_ByteAcc_Msk                (1UL << ITM_LSR_ByteAcc_Pos)                   /*!< ITM LSR: ByteAcc Mask */\n\n#define ITM_LSR_Access_Pos                  1U                                            /*!< ITM LSR: Access Position */\n#define ITM_LSR_Access_Msk                 (1UL << ITM_LSR_Access_Pos)                    /*!< ITM LSR: Access Mask */\n\n#define ITM_LSR_Present_Pos                 0U                                            /*!< ITM LSR: Present Position */\n#define ITM_LSR_Present_Msk                (1UL /*<< ITM_LSR_Present_Pos*/)               /*!< ITM LSR: Present Mask */\n\n/*@}*/ /* end of group CMSIS_ITM */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)\n  \\brief    Type definitions for the Data Watchpoint and Trace (DWT)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Data Watchpoint and Trace Register (DWT).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  Control Register */\n  __IOM uint32_t CYCCNT;                 /*!< Offset: 0x004 (R/W)  Cycle Count Register */\n  __IOM uint32_t CPICNT;                 /*!< Offset: 0x008 (R/W)  CPI Count Register */\n  __IOM uint32_t EXCCNT;                 /*!< Offset: 0x00C (R/W)  Exception Overhead Count Register */\n  __IOM uint32_t SLEEPCNT;               /*!< Offset: 0x010 (R/W)  Sleep Count Register */\n  __IOM uint32_t LSUCNT;                 /*!< Offset: 0x014 (R/W)  LSU Count Register */\n  __IOM uint32_t FOLDCNT;                /*!< Offset: 0x018 (R/W)  Folded-instruction Count Register */\n  __IM  uint32_t PCSR;                   /*!< Offset: 0x01C (R/ )  Program Counter Sample Register */\n  __IOM uint32_t COMP0;                  /*!< Offset: 0x020 (R/W)  Comparator Register 0 */\n        uint32_t RESERVED1[1U];\n  __IOM uint32_t FUNCTION0;              /*!< Offset: 0x028 (R/W)  Function Register 0 */\n        uint32_t RESERVED2[1U];\n  __IOM uint32_t COMP1;                  /*!< Offset: 0x030 (R/W)  Comparator Register 1 */\n        uint32_t RESERVED3[1U];\n  __IOM uint32_t FUNCTION1;              /*!< Offset: 0x038 (R/W)  Function Register 1 */\n        uint32_t RESERVED4[1U];\n  __IOM uint32_t COMP2;                  /*!< Offset: 0x040 (R/W)  Comparator Register 2 */\n        uint32_t RESERVED5[1U];\n  __IOM uint32_t FUNCTION2;              /*!< Offset: 0x048 (R/W)  Function Register 2 */\n        uint32_t RESERVED6[1U];\n  __IOM uint32_t COMP3;                  /*!< Offset: 0x050 (R/W)  Comparator Register 3 */\n        uint32_t RESERVED7[1U];\n  __IOM uint32_t FUNCTION3;              /*!< Offset: 0x058 (R/W)  Function Register 3 */\n        uint32_t RESERVED8[1U];\n  __IOM uint32_t COMP4;                  /*!< Offset: 0x060 (R/W)  Comparator Register 4 */\n        uint32_t RESERVED9[1U];\n  __IOM uint32_t FUNCTION4;              /*!< Offset: 0x068 (R/W)  Function Register 4 */\n        uint32_t RESERVED10[1U];\n  __IOM uint32_t COMP5;                  /*!< Offset: 0x070 (R/W)  Comparator Register 5 */\n        uint32_t RESERVED11[1U];\n  __IOM uint32_t FUNCTION5;              /*!< Offset: 0x078 (R/W)  Function Register 5 */\n        uint32_t RESERVED12[1U];\n  __IOM uint32_t COMP6;                  /*!< Offset: 0x080 (R/W)  Comparator Register 6 */\n        uint32_t RESERVED13[1U];\n  __IOM uint32_t FUNCTION6;              /*!< Offset: 0x088 (R/W)  Function Register 6 */\n        uint32_t RESERVED14[1U];\n  __IOM uint32_t COMP7;                  /*!< Offset: 0x090 (R/W)  Comparator Register 7 */\n        uint32_t RESERVED15[1U];\n  __IOM uint32_t FUNCTION7;              /*!< Offset: 0x098 (R/W)  Function Register 7 */\n        uint32_t RESERVED16[1U];\n  __IOM uint32_t COMP8;                  /*!< Offset: 0x0A0 (R/W)  Comparator Register 8 */\n        uint32_t RESERVED17[1U];\n  __IOM uint32_t FUNCTION8;              /*!< Offset: 0x0A8 (R/W)  Function Register 8 */\n        uint32_t RESERVED18[1U];\n  __IOM uint32_t COMP9;                  /*!< Offset: 0x0B0 (R/W)  Comparator Register 9 */\n        uint32_t RESERVED19[1U];\n  __IOM uint32_t FUNCTION9;              /*!< Offset: 0x0B8 (R/W)  Function Register 9 */\n        uint32_t RESERVED20[1U];\n  __IOM uint32_t COMP10;                 /*!< Offset: 0x0C0 (R/W)  Comparator Register 10 */\n        uint32_t RESERVED21[1U];\n  __IOM uint32_t FUNCTION10;             /*!< Offset: 0x0C8 (R/W)  Function Register 10 */\n        uint32_t RESERVED22[1U];\n  __IOM uint32_t COMP11;                 /*!< Offset: 0x0D0 (R/W)  Comparator Register 11 */\n        uint32_t RESERVED23[1U];\n  __IOM uint32_t FUNCTION11;             /*!< Offset: 0x0D8 (R/W)  Function Register 11 */\n        uint32_t RESERVED24[1U];\n  __IOM uint32_t COMP12;                 /*!< Offset: 0x0E0 (R/W)  Comparator Register 12 */\n        uint32_t RESERVED25[1U];\n  __IOM uint32_t FUNCTION12;             /*!< Offset: 0x0E8 (R/W)  Function Register 12 */\n        uint32_t RESERVED26[1U];\n  __IOM uint32_t COMP13;                 /*!< Offset: 0x0F0 (R/W)  Comparator Register 13 */\n        uint32_t RESERVED27[1U];\n  __IOM uint32_t FUNCTION13;             /*!< Offset: 0x0F8 (R/W)  Function Register 13 */\n        uint32_t RESERVED28[1U];\n  __IOM uint32_t COMP14;                 /*!< Offset: 0x100 (R/W)  Comparator Register 14 */\n        uint32_t RESERVED29[1U];\n  __IOM uint32_t FUNCTION14;             /*!< Offset: 0x108 (R/W)  Function Register 14 */\n        uint32_t RESERVED30[1U];\n  __IOM uint32_t COMP15;                 /*!< Offset: 0x110 (R/W)  Comparator Register 15 */\n        uint32_t RESERVED31[1U];\n  __IOM uint32_t FUNCTION15;             /*!< Offset: 0x118 (R/W)  Function Register 15 */\n        uint32_t RESERVED32[934U];\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R  )  Lock Status Register */\n        uint32_t RESERVED33[1U];\n  __IM  uint32_t DEVARCH;                /*!< Offset: 0xFBC (R/ )  Device Architecture Register */\n} DWT_Type;\n\n/* DWT Control Register Definitions */\n#define DWT_CTRL_NUMCOMP_Pos               28U                                         /*!< DWT CTRL: NUMCOMP Position */\n#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */\n\n#define DWT_CTRL_NOTRCPKT_Pos              27U                                         /*!< DWT CTRL: NOTRCPKT Position */\n#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */\n\n#define DWT_CTRL_NOEXTTRIG_Pos             26U                                         /*!< DWT CTRL: NOEXTTRIG Position */\n#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */\n\n#define DWT_CTRL_NOCYCCNT_Pos              25U                                         /*!< DWT CTRL: NOCYCCNT Position */\n#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */\n\n#define DWT_CTRL_NOPRFCNT_Pos              24U                                         /*!< DWT CTRL: NOPRFCNT Position */\n#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */\n\n#define DWT_CTRL_CYCDISS_Pos               23U                                         /*!< DWT CTRL: CYCDISS Position */\n#define DWT_CTRL_CYCDISS_Msk               (0x1UL << DWT_CTRL_CYCDISS_Pos)             /*!< DWT CTRL: CYCDISS Mask */\n\n#define DWT_CTRL_CYCEVTENA_Pos             22U                                         /*!< DWT CTRL: CYCEVTENA Position */\n#define DWT_CTRL_CYCEVTENA_Msk             (0x1UL << DWT_CTRL_CYCEVTENA_Pos)           /*!< DWT CTRL: CYCEVTENA Mask */\n\n#define DWT_CTRL_FOLDEVTENA_Pos            21U                                         /*!< DWT CTRL: FOLDEVTENA Position */\n#define DWT_CTRL_FOLDEVTENA_Msk            (0x1UL << DWT_CTRL_FOLDEVTENA_Pos)          /*!< DWT CTRL: FOLDEVTENA Mask */\n\n#define DWT_CTRL_LSUEVTENA_Pos             20U                                         /*!< DWT CTRL: LSUEVTENA Position */\n#define DWT_CTRL_LSUEVTENA_Msk             (0x1UL << DWT_CTRL_LSUEVTENA_Pos)           /*!< DWT CTRL: LSUEVTENA Mask */\n\n#define DWT_CTRL_SLEEPEVTENA_Pos           19U                                         /*!< DWT CTRL: SLEEPEVTENA Position */\n#define DWT_CTRL_SLEEPEVTENA_Msk           (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos)         /*!< DWT CTRL: SLEEPEVTENA Mask */\n\n#define DWT_CTRL_EXCEVTENA_Pos             18U                                         /*!< DWT CTRL: EXCEVTENA Position */\n#define DWT_CTRL_EXCEVTENA_Msk             (0x1UL << DWT_CTRL_EXCEVTENA_Pos)           /*!< DWT CTRL: EXCEVTENA Mask */\n\n#define DWT_CTRL_CPIEVTENA_Pos             17U                                         /*!< DWT CTRL: CPIEVTENA Position */\n#define DWT_CTRL_CPIEVTENA_Msk             (0x1UL << DWT_CTRL_CPIEVTENA_Pos)           /*!< DWT CTRL: CPIEVTENA Mask */\n\n#define DWT_CTRL_EXCTRCENA_Pos             16U                                         /*!< DWT CTRL: EXCTRCENA Position */\n#define DWT_CTRL_EXCTRCENA_Msk             (0x1UL << DWT_CTRL_EXCTRCENA_Pos)           /*!< DWT CTRL: EXCTRCENA Mask */\n\n#define DWT_CTRL_PCSAMPLENA_Pos            12U                                         /*!< DWT CTRL: PCSAMPLENA Position */\n#define DWT_CTRL_PCSAMPLENA_Msk            (0x1UL << DWT_CTRL_PCSAMPLENA_Pos)          /*!< DWT CTRL: PCSAMPLENA Mask */\n\n#define DWT_CTRL_SYNCTAP_Pos               10U                                         /*!< DWT CTRL: SYNCTAP Position */\n#define DWT_CTRL_SYNCTAP_Msk               (0x3UL << DWT_CTRL_SYNCTAP_Pos)             /*!< DWT CTRL: SYNCTAP Mask */\n\n#define DWT_CTRL_CYCTAP_Pos                 9U                                         /*!< DWT CTRL: CYCTAP Position */\n#define DWT_CTRL_CYCTAP_Msk                (0x1UL << DWT_CTRL_CYCTAP_Pos)              /*!< DWT CTRL: CYCTAP Mask */\n\n#define DWT_CTRL_POSTINIT_Pos               5U                                         /*!< DWT CTRL: POSTINIT Position */\n#define DWT_CTRL_POSTINIT_Msk              (0xFUL << DWT_CTRL_POSTINIT_Pos)            /*!< DWT CTRL: POSTINIT Mask */\n\n#define DWT_CTRL_POSTPRESET_Pos             1U                                         /*!< DWT CTRL: POSTPRESET Position */\n#define DWT_CTRL_POSTPRESET_Msk            (0xFUL << DWT_CTRL_POSTPRESET_Pos)          /*!< DWT CTRL: POSTPRESET Mask */\n\n#define DWT_CTRL_CYCCNTENA_Pos              0U                                         /*!< DWT CTRL: CYCCNTENA Position */\n#define DWT_CTRL_CYCCNTENA_Msk             (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/)       /*!< DWT CTRL: CYCCNTENA Mask */\n\n/* DWT CPI Count Register Definitions */\n#define DWT_CPICNT_CPICNT_Pos               0U                                         /*!< DWT CPICNT: CPICNT Position */\n#define DWT_CPICNT_CPICNT_Msk              (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/)       /*!< DWT CPICNT: CPICNT Mask */\n\n/* DWT Exception Overhead Count Register Definitions */\n#define DWT_EXCCNT_EXCCNT_Pos               0U                                         /*!< DWT EXCCNT: EXCCNT Position */\n#define DWT_EXCCNT_EXCCNT_Msk              (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/)       /*!< DWT EXCCNT: EXCCNT Mask */\n\n/* DWT Sleep Count Register Definitions */\n#define DWT_SLEEPCNT_SLEEPCNT_Pos           0U                                         /*!< DWT SLEEPCNT: SLEEPCNT Position */\n#define DWT_SLEEPCNT_SLEEPCNT_Msk          (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/)   /*!< DWT SLEEPCNT: SLEEPCNT Mask */\n\n/* DWT LSU Count Register Definitions */\n#define DWT_LSUCNT_LSUCNT_Pos               0U                                         /*!< DWT LSUCNT: LSUCNT Position */\n#define DWT_LSUCNT_LSUCNT_Msk              (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/)       /*!< DWT LSUCNT: LSUCNT Mask */\n\n/* DWT Folded-instruction Count Register Definitions */\n#define DWT_FOLDCNT_FOLDCNT_Pos             0U                                         /*!< DWT FOLDCNT: FOLDCNT Position */\n#define DWT_FOLDCNT_FOLDCNT_Msk            (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/)     /*!< DWT FOLDCNT: FOLDCNT Mask */\n\n/* DWT Comparator Function Register Definitions */\n#define DWT_FUNCTION_ID_Pos                27U                                         /*!< DWT FUNCTION: ID Position */\n#define DWT_FUNCTION_ID_Msk                (0x1FUL << DWT_FUNCTION_ID_Pos)             /*!< DWT FUNCTION: ID Mask */\n\n#define DWT_FUNCTION_MATCHED_Pos           24U                                         /*!< DWT FUNCTION: MATCHED Position */\n#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */\n\n#define DWT_FUNCTION_DATAVSIZE_Pos         10U                                         /*!< DWT FUNCTION: DATAVSIZE Position */\n#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */\n\n#define DWT_FUNCTION_ACTION_Pos             4U                                         /*!< DWT FUNCTION: ACTION Position */\n#define DWT_FUNCTION_ACTION_Msk            (0x1UL << DWT_FUNCTION_ACTION_Pos)          /*!< DWT FUNCTION: ACTION Mask */\n\n#define DWT_FUNCTION_MATCH_Pos              0U                                         /*!< DWT FUNCTION: MATCH Position */\n#define DWT_FUNCTION_MATCH_Msk             (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/)       /*!< DWT FUNCTION: MATCH Mask */\n\n/*@}*/ /* end of group CMSIS_DWT */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_TPI     Trace Port Interface (TPI)\n  \\brief    Type definitions for the Trace Port Interface (TPI)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Trace Port Interface Register (TPI).\n */\ntypedef struct\n{\n  __IOM uint32_t SSPSR;                  /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register */\n  __IOM uint32_t CSPSR;                  /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */\n        uint32_t RESERVED0[2U];\n  __IOM uint32_t ACPR;                   /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */\n        uint32_t RESERVED1[55U];\n  __IOM uint32_t SPPR;                   /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */\n        uint32_t RESERVED2[131U];\n  __IM  uint32_t FFSR;                   /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */\n  __IOM uint32_t FFCR;                   /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */\n  __IM  uint32_t FSCR;                   /*!< Offset: 0x308 (R/ )  Formatter Synchronization Counter Register */\n        uint32_t RESERVED3[759U];\n  __IM  uint32_t TRIGGER;                /*!< Offset: 0xEE8 (R/ )  TRIGGER */\n  __IM  uint32_t FIFO0;                  /*!< Offset: 0xEEC (R/ )  Integration ETM Data */\n  __IM  uint32_t ITATBCTR2;              /*!< Offset: 0xEF0 (R/ )  ITATBCTR2 */\n        uint32_t RESERVED4[1U];\n  __IM  uint32_t ITATBCTR0;              /*!< Offset: 0xEF8 (R/ )  ITATBCTR0 */\n  __IM  uint32_t FIFO1;                  /*!< Offset: 0xEFC (R/ )  Integration ITM Data */\n  __IOM uint32_t ITCTRL;                 /*!< Offset: 0xF00 (R/W)  Integration Mode Control */\n        uint32_t RESERVED5[39U];\n  __IOM uint32_t CLAIMSET;               /*!< Offset: 0xFA0 (R/W)  Claim tag set */\n  __IOM uint32_t CLAIMCLR;               /*!< Offset: 0xFA4 (R/W)  Claim tag clear */\n        uint32_t RESERVED7[8U];\n  __IM  uint32_t DEVID;                  /*!< Offset: 0xFC8 (R/ )  TPIU_DEVID */\n  __IM  uint32_t DEVTYPE;                /*!< Offset: 0xFCC (R/ )  TPIU_DEVTYPE */\n} TPI_Type;\n\n/* TPI Asynchronous Clock Prescaler Register Definitions */\n#define TPI_ACPR_PRESCALER_Pos              0U                                         /*!< TPI ACPR: PRESCALER Position */\n#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/)    /*!< TPI ACPR: PRESCALER Mask */\n\n/* TPI Selected Pin Protocol Register Definitions */\n#define TPI_SPPR_TXMODE_Pos                 0U                                         /*!< TPI SPPR: TXMODE Position */\n#define TPI_SPPR_TXMODE_Msk                (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/)          /*!< TPI SPPR: TXMODE Mask */\n\n/* TPI Formatter and Flush Status Register Definitions */\n#define TPI_FFSR_FtNonStop_Pos              3U                                         /*!< TPI FFSR: FtNonStop Position */\n#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */\n\n#define TPI_FFSR_TCPresent_Pos              2U                                         /*!< TPI FFSR: TCPresent Position */\n#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */\n\n#define TPI_FFSR_FtStopped_Pos              1U                                         /*!< TPI FFSR: FtStopped Position */\n#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */\n\n#define TPI_FFSR_FlInProg_Pos               0U                                         /*!< TPI FFSR: FlInProg Position */\n#define TPI_FFSR_FlInProg_Msk              (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/)        /*!< TPI FFSR: FlInProg Mask */\n\n/* TPI Formatter and Flush Control Register Definitions */\n#define TPI_FFCR_TrigIn_Pos                 8U                                         /*!< TPI FFCR: TrigIn Position */\n#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */\n\n#define TPI_FFCR_EnFCont_Pos                1U                                         /*!< TPI FFCR: EnFCont Position */\n#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */\n\n/* TPI TRIGGER Register Definitions */\n#define TPI_TRIGGER_TRIGGER_Pos             0U                                         /*!< TPI TRIGGER: TRIGGER Position */\n#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/)      /*!< TPI TRIGGER: TRIGGER Mask */\n\n/* TPI Integration ETM Data Register Definitions (FIFO0) */\n#define TPI_FIFO0_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO0: ITM_ATVALID Position */\n#define TPI_FIFO0_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos)        /*!< TPI FIFO0: ITM_ATVALID Mask */\n\n#define TPI_FIFO0_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO0: ITM_bytecount Position */\n#define TPI_FIFO0_ITM_bytecount_Msk        (0x3UL << TPI_FIFO0_ITM_bytecount_Pos)      /*!< TPI FIFO0: ITM_bytecount Mask */\n\n#define TPI_FIFO0_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO0: ETM_ATVALID Position */\n#define TPI_FIFO0_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos)        /*!< TPI FIFO0: ETM_ATVALID Mask */\n\n#define TPI_FIFO0_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO0: ETM_bytecount Position */\n#define TPI_FIFO0_ETM_bytecount_Msk        (0x3UL << TPI_FIFO0_ETM_bytecount_Pos)      /*!< TPI FIFO0: ETM_bytecount Mask */\n\n#define TPI_FIFO0_ETM2_Pos                 16U                                         /*!< TPI FIFO0: ETM2 Position */\n#define TPI_FIFO0_ETM2_Msk                 (0xFFUL << TPI_FIFO0_ETM2_Pos)              /*!< TPI FIFO0: ETM2 Mask */\n\n#define TPI_FIFO0_ETM1_Pos                  8U                                         /*!< TPI FIFO0: ETM1 Position */\n#define TPI_FIFO0_ETM1_Msk                 (0xFFUL << TPI_FIFO0_ETM1_Pos)              /*!< TPI FIFO0: ETM1 Mask */\n\n#define TPI_FIFO0_ETM0_Pos                  0U                                         /*!< TPI FIFO0: ETM0 Position */\n#define TPI_FIFO0_ETM0_Msk                 (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/)          /*!< TPI FIFO0: ETM0 Mask */\n\n/* TPI ITATBCTR2 Register Definitions */\n#define TPI_ITATBCTR2_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR2: ATREADY Position */\n#define TPI_ITATBCTR2_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/)    /*!< TPI ITATBCTR2: ATREADY Mask */\n\n/* TPI Integration ITM Data Register Definitions (FIFO1) */\n#define TPI_FIFO1_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO1: ITM_ATVALID Position */\n#define TPI_FIFO1_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos)        /*!< TPI FIFO1: ITM_ATVALID Mask */\n\n#define TPI_FIFO1_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO1: ITM_bytecount Position */\n#define TPI_FIFO1_ITM_bytecount_Msk        (0x3UL << TPI_FIFO1_ITM_bytecount_Pos)      /*!< TPI FIFO1: ITM_bytecount Mask */\n\n#define TPI_FIFO1_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO1: ETM_ATVALID Position */\n#define TPI_FIFO1_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos)        /*!< TPI FIFO1: ETM_ATVALID Mask */\n\n#define TPI_FIFO1_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO1: ETM_bytecount Position */\n#define TPI_FIFO1_ETM_bytecount_Msk        (0x3UL << TPI_FIFO1_ETM_bytecount_Pos)      /*!< TPI FIFO1: ETM_bytecount Mask */\n\n#define TPI_FIFO1_ITM2_Pos                 16U                                         /*!< TPI FIFO1: ITM2 Position */\n#define TPI_FIFO1_ITM2_Msk                 (0xFFUL << TPI_FIFO1_ITM2_Pos)              /*!< TPI FIFO1: ITM2 Mask */\n\n#define TPI_FIFO1_ITM1_Pos                  8U                                         /*!< TPI FIFO1: ITM1 Position */\n#define TPI_FIFO1_ITM1_Msk                 (0xFFUL << TPI_FIFO1_ITM1_Pos)              /*!< TPI FIFO1: ITM1 Mask */\n\n#define TPI_FIFO1_ITM0_Pos                  0U                                         /*!< TPI FIFO1: ITM0 Position */\n#define TPI_FIFO1_ITM0_Msk                 (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/)          /*!< TPI FIFO1: ITM0 Mask */\n\n/* TPI ITATBCTR0 Register Definitions */\n#define TPI_ITATBCTR0_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR0: ATREADY Position */\n#define TPI_ITATBCTR0_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/)    /*!< TPI ITATBCTR0: ATREADY Mask */\n\n/* TPI Integration Mode Control Register Definitions */\n#define TPI_ITCTRL_Mode_Pos                 0U                                         /*!< TPI ITCTRL: Mode Position */\n#define TPI_ITCTRL_Mode_Msk                (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/)          /*!< TPI ITCTRL: Mode Mask */\n\n/* TPI DEVID Register Definitions */\n#define TPI_DEVID_NRZVALID_Pos             11U                                         /*!< TPI DEVID: NRZVALID Position */\n#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */\n\n#define TPI_DEVID_MANCVALID_Pos            10U                                         /*!< TPI DEVID: MANCVALID Position */\n#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */\n\n#define TPI_DEVID_PTINVALID_Pos             9U                                         /*!< TPI DEVID: PTINVALID Position */\n#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */\n\n#define TPI_DEVID_MinBufSz_Pos              6U                                         /*!< TPI DEVID: MinBufSz Position */\n#define TPI_DEVID_MinBufSz_Msk             (0x7UL << TPI_DEVID_MinBufSz_Pos)           /*!< TPI DEVID: MinBufSz Mask */\n\n#define TPI_DEVID_AsynClkIn_Pos             5U                                         /*!< TPI DEVID: AsynClkIn Position */\n#define TPI_DEVID_AsynClkIn_Msk            (0x1UL << TPI_DEVID_AsynClkIn_Pos)          /*!< TPI DEVID: AsynClkIn Mask */\n\n#define TPI_DEVID_NrTraceInput_Pos          0U                                         /*!< TPI DEVID: NrTraceInput Position */\n#define TPI_DEVID_NrTraceInput_Msk         (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/)  /*!< TPI DEVID: NrTraceInput Mask */\n\n/* TPI DEVTYPE Register Definitions */\n#define TPI_DEVTYPE_MajorType_Pos           4U                                         /*!< TPI DEVTYPE: MajorType Position */\n#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */\n\n#define TPI_DEVTYPE_SubType_Pos             0U                                         /*!< TPI DEVTYPE: SubType Position */\n#define TPI_DEVTYPE_SubType_Msk            (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/)      /*!< TPI DEVTYPE: SubType Mask */\n\n/*@}*/ /* end of group CMSIS_TPI */\n\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region Number Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  MPU Region Limit Address Register */\n  __IOM uint32_t RBAR_A1;                /*!< Offset: 0x014 (R/W)  MPU Region Base Address Register Alias 1 */\n  __IOM uint32_t RLAR_A1;                /*!< Offset: 0x018 (R/W)  MPU Region Limit Address Register Alias 1 */\n  __IOM uint32_t RBAR_A2;                /*!< Offset: 0x01C (R/W)  MPU Region Base Address Register Alias 2 */\n  __IOM uint32_t RLAR_A2;                /*!< Offset: 0x020 (R/W)  MPU Region Limit Address Register Alias 2 */\n  __IOM uint32_t RBAR_A3;                /*!< Offset: 0x024 (R/W)  MPU Region Base Address Register Alias 3 */\n  __IOM uint32_t RLAR_A3;                /*!< Offset: 0x028 (R/W)  MPU Region Limit Address Register Alias 3 */\n        uint32_t RESERVED0[1];\n  __IOM uint32_t MAIR0;                  /*!< Offset: 0x030 (R/W)  MPU Memory Attribute Indirection Register 0 */\n  __IOM uint32_t MAIR1;                  /*!< Offset: 0x034 (R/W)  MPU Memory Attribute Indirection Register 1 */\n} MPU_Type;\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_ADDR_Pos                   5U                                            /*!< MPU RBAR: ADDR Position */\n#define MPU_RBAR_ADDR_Msk                  (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos)             /*!< MPU RBAR: ADDR Mask */\n\n#define MPU_RBAR_SH_Pos                     3U                                            /*!< MPU RBAR: SH Position */\n#define MPU_RBAR_SH_Msk                    (0x3UL << MPU_RBAR_SH_Pos)                     /*!< MPU RBAR: SH Mask */\n\n#define MPU_RBAR_AP_Pos                     1U                                            /*!< MPU RBAR: AP Position */\n#define MPU_RBAR_AP_Msk                    (0x3UL << MPU_RBAR_AP_Pos)                     /*!< MPU RBAR: AP Mask */\n\n#define MPU_RBAR_XN_Pos                     0U                                            /*!< MPU RBAR: XN Position */\n#define MPU_RBAR_XN_Msk                    (01UL /*<< MPU_RBAR_XN_Pos*/)                  /*!< MPU RBAR: XN Mask */\n\n/* MPU Region Limit Address Register Definitions */\n#define MPU_RLAR_LIMIT_Pos                  5U                                            /*!< MPU RLAR: LIMIT Position */\n#define MPU_RLAR_LIMIT_Msk                 (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos)            /*!< MPU RLAR: LIMIT Mask */\n\n#define MPU_RLAR_AttrIndx_Pos               1U                                            /*!< MPU RLAR: AttrIndx Position */\n#define MPU_RLAR_AttrIndx_Msk              (0x7UL << MPU_RLAR_AttrIndx_Pos)               /*!< MPU RLAR: AttrIndx Mask */\n\n#define MPU_RLAR_EN_Pos                     0U                                            /*!< MPU RLAR: Region enable bit Position */\n#define MPU_RLAR_EN_Msk                    (1UL /*<< MPU_RLAR_EN_Pos*/)                   /*!< MPU RLAR: Region enable bit Disable Mask */\n\n/* MPU Memory Attribute Indirection Register 0 Definitions */\n#define MPU_MAIR0_Attr3_Pos                24U                                            /*!< MPU MAIR0: Attr3 Position */\n#define MPU_MAIR0_Attr3_Msk                (0xFFUL << MPU_MAIR0_Attr3_Pos)                /*!< MPU MAIR0: Attr3 Mask */\n\n#define MPU_MAIR0_Attr2_Pos                16U                                            /*!< MPU MAIR0: Attr2 Position */\n#define MPU_MAIR0_Attr2_Msk                (0xFFUL << MPU_MAIR0_Attr2_Pos)                /*!< MPU MAIR0: Attr2 Mask */\n\n#define MPU_MAIR0_Attr1_Pos                 8U                                            /*!< MPU MAIR0: Attr1 Position */\n#define MPU_MAIR0_Attr1_Msk                (0xFFUL << MPU_MAIR0_Attr1_Pos)                /*!< MPU MAIR0: Attr1 Mask */\n\n#define MPU_MAIR0_Attr0_Pos                 0U                                            /*!< MPU MAIR0: Attr0 Position */\n#define MPU_MAIR0_Attr0_Msk                (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/)            /*!< MPU MAIR0: Attr0 Mask */\n\n/* MPU Memory Attribute Indirection Register 1 Definitions */\n#define MPU_MAIR1_Attr7_Pos                24U                                            /*!< MPU MAIR1: Attr7 Position */\n#define MPU_MAIR1_Attr7_Msk                (0xFFUL << MPU_MAIR1_Attr7_Pos)                /*!< MPU MAIR1: Attr7 Mask */\n\n#define MPU_MAIR1_Attr6_Pos                16U                                            /*!< MPU MAIR1: Attr6 Position */\n#define MPU_MAIR1_Attr6_Msk                (0xFFUL << MPU_MAIR1_Attr6_Pos)                /*!< MPU MAIR1: Attr6 Mask */\n\n#define MPU_MAIR1_Attr5_Pos                 8U                                            /*!< MPU MAIR1: Attr5 Position */\n#define MPU_MAIR1_Attr5_Msk                (0xFFUL << MPU_MAIR1_Attr5_Pos)                /*!< MPU MAIR1: Attr5 Mask */\n\n#define MPU_MAIR1_Attr4_Pos                 0U                                            /*!< MPU MAIR1: Attr4 Position */\n#define MPU_MAIR1_Attr4_Msk                (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/)            /*!< MPU MAIR1: Attr4 Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif\n\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SAU     Security Attribution Unit (SAU)\n  \\brief    Type definitions for the Security Attribution Unit (SAU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Security Attribution Unit (SAU).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SAU Control Register */\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x004 (R/ )  SAU Type Register */\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  SAU Region Number Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  SAU Region Base Address Register */\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  SAU Region Limit Address Register */\n#else\n        uint32_t RESERVED0[3];\n#endif\n  __IOM uint32_t SFSR;                   /*!< Offset: 0x014 (R/W)  Secure Fault Status Register */\n  __IOM uint32_t SFAR;                   /*!< Offset: 0x018 (R/W)  Secure Fault Address Register */\n} SAU_Type;\n\n/* SAU Control Register Definitions */\n#define SAU_CTRL_ALLNS_Pos                  1U                                            /*!< SAU CTRL: ALLNS Position */\n#define SAU_CTRL_ALLNS_Msk                 (1UL << SAU_CTRL_ALLNS_Pos)                    /*!< SAU CTRL: ALLNS Mask */\n\n#define SAU_CTRL_ENABLE_Pos                 0U                                            /*!< SAU CTRL: ENABLE Position */\n#define SAU_CTRL_ENABLE_Msk                (1UL /*<< SAU_CTRL_ENABLE_Pos*/)               /*!< SAU CTRL: ENABLE Mask */\n\n/* SAU Type Register Definitions */\n#define SAU_TYPE_SREGION_Pos                0U                                            /*!< SAU TYPE: SREGION Position */\n#define SAU_TYPE_SREGION_Msk               (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/)           /*!< SAU TYPE: SREGION Mask */\n\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n/* SAU Region Number Register Definitions */\n#define SAU_RNR_REGION_Pos                  0U                                            /*!< SAU RNR: REGION Position */\n#define SAU_RNR_REGION_Msk                 (0xFFUL /*<< SAU_RNR_REGION_Pos*/)             /*!< SAU RNR: REGION Mask */\n\n/* SAU Region Base Address Register Definitions */\n#define SAU_RBAR_BADDR_Pos                  5U                                            /*!< SAU RBAR: BADDR Position */\n#define SAU_RBAR_BADDR_Msk                 (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos)            /*!< SAU RBAR: BADDR Mask */\n\n/* SAU Region Limit Address Register Definitions */\n#define SAU_RLAR_LADDR_Pos                  5U                                            /*!< SAU RLAR: LADDR Position */\n#define SAU_RLAR_LADDR_Msk                 (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos)            /*!< SAU RLAR: LADDR Mask */\n\n#define SAU_RLAR_NSC_Pos                    1U                                            /*!< SAU RLAR: NSC Position */\n#define SAU_RLAR_NSC_Msk                   (1UL << SAU_RLAR_NSC_Pos)                      /*!< SAU RLAR: NSC Mask */\n\n#define SAU_RLAR_ENABLE_Pos                 0U                                            /*!< SAU RLAR: ENABLE Position */\n#define SAU_RLAR_ENABLE_Msk                (1UL /*<< SAU_RLAR_ENABLE_Pos*/)               /*!< SAU RLAR: ENABLE Mask */\n\n#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */\n\n/* Secure Fault Status Register Definitions */\n#define SAU_SFSR_LSERR_Pos                  7U                                            /*!< SAU SFSR: LSERR Position */\n#define SAU_SFSR_LSERR_Msk                 (1UL << SAU_SFSR_LSERR_Pos)                    /*!< SAU SFSR: LSERR Mask */\n\n#define SAU_SFSR_SFARVALID_Pos              6U                                            /*!< SAU SFSR: SFARVALID Position */\n#define SAU_SFSR_SFARVALID_Msk             (1UL << SAU_SFSR_SFARVALID_Pos)                /*!< SAU SFSR: SFARVALID Mask */\n\n#define SAU_SFSR_LSPERR_Pos                 5U                                            /*!< SAU SFSR: LSPERR Position */\n#define SAU_SFSR_LSPERR_Msk                (1UL << SAU_SFSR_LSPERR_Pos)                   /*!< SAU SFSR: LSPERR Mask */\n\n#define SAU_SFSR_INVTRAN_Pos                4U                                            /*!< SAU SFSR: INVTRAN Position */\n#define SAU_SFSR_INVTRAN_Msk               (1UL << SAU_SFSR_INVTRAN_Pos)                  /*!< SAU SFSR: INVTRAN Mask */\n\n#define SAU_SFSR_AUVIOL_Pos                 3U                                            /*!< SAU SFSR: AUVIOL Position */\n#define SAU_SFSR_AUVIOL_Msk                (1UL << SAU_SFSR_AUVIOL_Pos)                   /*!< SAU SFSR: AUVIOL Mask */\n\n#define SAU_SFSR_INVER_Pos                  2U                                            /*!< SAU SFSR: INVER Position */\n#define SAU_SFSR_INVER_Msk                 (1UL << SAU_SFSR_INVER_Pos)                    /*!< SAU SFSR: INVER Mask */\n\n#define SAU_SFSR_INVIS_Pos                  1U                                            /*!< SAU SFSR: INVIS Position */\n#define SAU_SFSR_INVIS_Msk                 (1UL << SAU_SFSR_INVIS_Pos)                    /*!< SAU SFSR: INVIS Mask */\n\n#define SAU_SFSR_INVEP_Pos                  0U                                            /*!< SAU SFSR: INVEP Position */\n#define SAU_SFSR_INVEP_Msk                 (1UL /*<< SAU_SFSR_INVEP_Pos*/)                /*!< SAU SFSR: INVEP Mask */\n\n/*@} end of group CMSIS_SAU */\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_FPU     Floating Point Unit (FPU)\n  \\brief    Type definitions for the Floating Point Unit (FPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Floating Point Unit (FPU).\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IOM uint32_t FPCCR;                  /*!< Offset: 0x004 (R/W)  Floating-Point Context Control Register */\n  __IOM uint32_t FPCAR;                  /*!< Offset: 0x008 (R/W)  Floating-Point Context Address Register */\n  __IOM uint32_t FPDSCR;                 /*!< Offset: 0x00C (R/W)  Floating-Point Default Status Control Register */\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x010 (R/ )  Media and FP Feature Register 0 */\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x014 (R/ )  Media and FP Feature Register 1 */\n} FPU_Type;\n\n/* Floating-Point Context Control Register Definitions */\n#define FPU_FPCCR_ASPEN_Pos                31U                                            /*!< FPCCR: ASPEN bit Position */\n#define FPU_FPCCR_ASPEN_Msk                (1UL << FPU_FPCCR_ASPEN_Pos)                   /*!< FPCCR: ASPEN bit Mask */\n\n#define FPU_FPCCR_LSPEN_Pos                30U                                            /*!< FPCCR: LSPEN Position */\n#define FPU_FPCCR_LSPEN_Msk                (1UL << FPU_FPCCR_LSPEN_Pos)                   /*!< FPCCR: LSPEN bit Mask */\n\n#define FPU_FPCCR_LSPENS_Pos               29U                                            /*!< FPCCR: LSPENS Position */\n#define FPU_FPCCR_LSPENS_Msk               (1UL << FPU_FPCCR_LSPENS_Pos)                  /*!< FPCCR: LSPENS bit Mask */\n\n#define FPU_FPCCR_CLRONRET_Pos             28U                                            /*!< FPCCR: CLRONRET Position */\n#define FPU_FPCCR_CLRONRET_Msk             (1UL << FPU_FPCCR_CLRONRET_Pos)                /*!< FPCCR: CLRONRET bit Mask */\n\n#define FPU_FPCCR_CLRONRETS_Pos            27U                                            /*!< FPCCR: CLRONRETS Position */\n#define FPU_FPCCR_CLRONRETS_Msk            (1UL << FPU_FPCCR_CLRONRETS_Pos)               /*!< FPCCR: CLRONRETS bit Mask */\n\n#define FPU_FPCCR_TS_Pos                   26U                                            /*!< FPCCR: TS Position */\n#define FPU_FPCCR_TS_Msk                   (1UL << FPU_FPCCR_TS_Pos)                      /*!< FPCCR: TS bit Mask */\n\n#define FPU_FPCCR_UFRDY_Pos                10U                                            /*!< FPCCR: UFRDY Position */\n#define FPU_FPCCR_UFRDY_Msk                (1UL << FPU_FPCCR_UFRDY_Pos)                   /*!< FPCCR: UFRDY bit Mask */\n\n#define FPU_FPCCR_SPLIMVIOL_Pos             9U                                            /*!< FPCCR: SPLIMVIOL Position */\n#define FPU_FPCCR_SPLIMVIOL_Msk            (1UL << FPU_FPCCR_SPLIMVIOL_Pos)               /*!< FPCCR: SPLIMVIOL bit Mask */\n\n#define FPU_FPCCR_MONRDY_Pos                8U                                            /*!< FPCCR: MONRDY Position */\n#define FPU_FPCCR_MONRDY_Msk               (1UL << FPU_FPCCR_MONRDY_Pos)                  /*!< FPCCR: MONRDY bit Mask */\n\n#define FPU_FPCCR_SFRDY_Pos                 7U                                            /*!< FPCCR: SFRDY Position */\n#define FPU_FPCCR_SFRDY_Msk                (1UL << FPU_FPCCR_SFRDY_Pos)                   /*!< FPCCR: SFRDY bit Mask */\n\n#define FPU_FPCCR_BFRDY_Pos                 6U                                            /*!< FPCCR: BFRDY Position */\n#define FPU_FPCCR_BFRDY_Msk                (1UL << FPU_FPCCR_BFRDY_Pos)                   /*!< FPCCR: BFRDY bit Mask */\n\n#define FPU_FPCCR_MMRDY_Pos                 5U                                            /*!< FPCCR: MMRDY Position */\n#define FPU_FPCCR_MMRDY_Msk                (1UL << FPU_FPCCR_MMRDY_Pos)                   /*!< FPCCR: MMRDY bit Mask */\n\n#define FPU_FPCCR_HFRDY_Pos                 4U                                            /*!< FPCCR: HFRDY Position */\n#define FPU_FPCCR_HFRDY_Msk                (1UL << FPU_FPCCR_HFRDY_Pos)                   /*!< FPCCR: HFRDY bit Mask */\n\n#define FPU_FPCCR_THREAD_Pos                3U                                            /*!< FPCCR: processor mode bit Position */\n#define FPU_FPCCR_THREAD_Msk               (1UL << FPU_FPCCR_THREAD_Pos)                  /*!< FPCCR: processor mode active bit Mask */\n\n#define FPU_FPCCR_S_Pos                     2U                                            /*!< FPCCR: Security status of the FP context bit Position */\n#define FPU_FPCCR_S_Msk                    (1UL << FPU_FPCCR_S_Pos)                       /*!< FPCCR: Security status of the FP context bit Mask */\n\n#define FPU_FPCCR_USER_Pos                  1U                                            /*!< FPCCR: privilege level bit Position */\n#define FPU_FPCCR_USER_Msk                 (1UL << FPU_FPCCR_USER_Pos)                    /*!< FPCCR: privilege level bit Mask */\n\n#define FPU_FPCCR_LSPACT_Pos                0U                                            /*!< FPCCR: Lazy state preservation active bit Position */\n#define FPU_FPCCR_LSPACT_Msk               (1UL /*<< FPU_FPCCR_LSPACT_Pos*/)              /*!< FPCCR: Lazy state preservation active bit Mask */\n\n/* Floating-Point Context Address Register Definitions */\n#define FPU_FPCAR_ADDRESS_Pos               3U                                            /*!< FPCAR: ADDRESS bit Position */\n#define FPU_FPCAR_ADDRESS_Msk              (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos)        /*!< FPCAR: ADDRESS bit Mask */\n\n/* Floating-Point Default Status Control Register Definitions */\n#define FPU_FPDSCR_AHP_Pos                 26U                                            /*!< FPDSCR: AHP bit Position */\n#define FPU_FPDSCR_AHP_Msk                 (1UL << FPU_FPDSCR_AHP_Pos)                    /*!< FPDSCR: AHP bit Mask */\n\n#define FPU_FPDSCR_DN_Pos                  25U                                            /*!< FPDSCR: DN bit Position */\n#define FPU_FPDSCR_DN_Msk                  (1UL << FPU_FPDSCR_DN_Pos)                     /*!< FPDSCR: DN bit Mask */\n\n#define FPU_FPDSCR_FZ_Pos                  24U                                            /*!< FPDSCR: FZ bit Position */\n#define FPU_FPDSCR_FZ_Msk                  (1UL << FPU_FPDSCR_FZ_Pos)                     /*!< FPDSCR: FZ bit Mask */\n\n#define FPU_FPDSCR_RMode_Pos               22U                                            /*!< FPDSCR: RMode bit Position */\n#define FPU_FPDSCR_RMode_Msk               (3UL << FPU_FPDSCR_RMode_Pos)                  /*!< FPDSCR: RMode bit Mask */\n\n/* Media and FP Feature Register 0 Definitions */\n#define FPU_MVFR0_FP_rounding_modes_Pos    28U                                            /*!< MVFR0: FP rounding modes bits Position */\n#define FPU_MVFR0_FP_rounding_modes_Msk    (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos)     /*!< MVFR0: FP rounding modes bits Mask */\n\n#define FPU_MVFR0_Short_vectors_Pos        24U                                            /*!< MVFR0: Short vectors bits Position */\n#define FPU_MVFR0_Short_vectors_Msk        (0xFUL << FPU_MVFR0_Short_vectors_Pos)         /*!< MVFR0: Short vectors bits Mask */\n\n#define FPU_MVFR0_Square_root_Pos          20U                                            /*!< MVFR0: Square root bits Position */\n#define FPU_MVFR0_Square_root_Msk          (0xFUL << FPU_MVFR0_Square_root_Pos)           /*!< MVFR0: Square root bits Mask */\n\n#define FPU_MVFR0_Divide_Pos               16U                                            /*!< MVFR0: Divide bits Position */\n#define FPU_MVFR0_Divide_Msk               (0xFUL << FPU_MVFR0_Divide_Pos)                /*!< MVFR0: Divide bits Mask */\n\n#define FPU_MVFR0_FP_excep_trapping_Pos    12U                                            /*!< MVFR0: FP exception trapping bits Position */\n#define FPU_MVFR0_FP_excep_trapping_Msk    (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos)     /*!< MVFR0: FP exception trapping bits Mask */\n\n#define FPU_MVFR0_Double_precision_Pos      8U                                            /*!< MVFR0: Double-precision bits Position */\n#define FPU_MVFR0_Double_precision_Msk     (0xFUL << FPU_MVFR0_Double_precision_Pos)      /*!< MVFR0: Double-precision bits Mask */\n\n#define FPU_MVFR0_Single_precision_Pos      4U                                            /*!< MVFR0: Single-precision bits Position */\n#define FPU_MVFR0_Single_precision_Msk     (0xFUL << FPU_MVFR0_Single_precision_Pos)      /*!< MVFR0: Single-precision bits Mask */\n\n#define FPU_MVFR0_A_SIMD_registers_Pos      0U                                            /*!< MVFR0: A_SIMD registers bits Position */\n#define FPU_MVFR0_A_SIMD_registers_Msk     (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/)  /*!< MVFR0: A_SIMD registers bits Mask */\n\n/* Media and FP Feature Register 1 Definitions */\n#define FPU_MVFR1_FP_fused_MAC_Pos         28U                                            /*!< MVFR1: FP fused MAC bits Position */\n#define FPU_MVFR1_FP_fused_MAC_Msk         (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos)          /*!< MVFR1: FP fused MAC bits Mask */\n\n#define FPU_MVFR1_FP_HPFP_Pos              24U                                            /*!< MVFR1: FP HPFP bits Position */\n#define FPU_MVFR1_FP_HPFP_Msk              (0xFUL << FPU_MVFR1_FP_HPFP_Pos)               /*!< MVFR1: FP HPFP bits Mask */\n\n#define FPU_MVFR1_D_NaN_mode_Pos            4U                                            /*!< MVFR1: D_NaN mode bits Position */\n#define FPU_MVFR1_D_NaN_mode_Msk           (0xFUL << FPU_MVFR1_D_NaN_mode_Pos)            /*!< MVFR1: D_NaN mode bits Mask */\n\n#define FPU_MVFR1_FtZ_mode_Pos              0U                                            /*!< MVFR1: FtZ mode bits Position */\n#define FPU_MVFR1_FtZ_mode_Msk             (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/)          /*!< MVFR1: FtZ mode bits Mask */\n\n/*@} end of group CMSIS_FPU */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Type definitions for the Core Debug Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Core Debug Register (CoreDebug).\n */\ntypedef struct\n{\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\n        uint32_t RESERVED4[1U];\n  __IOM uint32_t DAUTHCTRL;              /*!< Offset: 0x014 (R/W)  Debug Authentication Control Register */\n  __IOM uint32_t DSCSR;                  /*!< Offset: 0x018 (R/W)  Debug Security Control and Status Register */\n} CoreDebug_Type;\n\n/* Debug Halting Control and Status Register Definitions */\n#define CoreDebug_DHCSR_DBGKEY_Pos         16U                                            /*!< CoreDebug DHCSR: DBGKEY Position */\n#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< CoreDebug DHCSR: DBGKEY Mask */\n\n#define CoreDebug_DHCSR_S_RESTART_ST_Pos   26U                                            /*!< CoreDebug DHCSR: S_RESTART_ST Position */\n#define CoreDebug_DHCSR_S_RESTART_ST_Msk   (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos)      /*!< CoreDebug DHCSR: S_RESTART_ST Mask */\n\n#define CoreDebug_DHCSR_S_RESET_ST_Pos     25U                                            /*!< CoreDebug DHCSR: S_RESET_ST Position */\n#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< CoreDebug DHCSR: S_RESET_ST Mask */\n\n#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24U                                            /*!< CoreDebug DHCSR: S_RETIRE_ST Position */\n#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */\n\n#define CoreDebug_DHCSR_S_LOCKUP_Pos       19U                                            /*!< CoreDebug DHCSR: S_LOCKUP Position */\n#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< CoreDebug DHCSR: S_LOCKUP Mask */\n\n#define CoreDebug_DHCSR_S_SLEEP_Pos        18U                                            /*!< CoreDebug DHCSR: S_SLEEP Position */\n#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< CoreDebug DHCSR: S_SLEEP Mask */\n\n#define CoreDebug_DHCSR_S_HALT_Pos         17U                                            /*!< CoreDebug DHCSR: S_HALT Position */\n#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< CoreDebug DHCSR: S_HALT Mask */\n\n#define CoreDebug_DHCSR_S_REGRDY_Pos       16U                                            /*!< CoreDebug DHCSR: S_REGRDY Position */\n#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< CoreDebug DHCSR: S_REGRDY Mask */\n\n#define CoreDebug_DHCSR_C_SNAPSTALL_Pos     5U                                            /*!< CoreDebug DHCSR: C_SNAPSTALL Position */\n#define CoreDebug_DHCSR_C_SNAPSTALL_Msk    (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos)       /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */\n\n#define CoreDebug_DHCSR_C_MASKINTS_Pos      3U                                            /*!< CoreDebug DHCSR: C_MASKINTS Position */\n#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< CoreDebug DHCSR: C_MASKINTS Mask */\n\n#define CoreDebug_DHCSR_C_STEP_Pos          2U                                            /*!< CoreDebug DHCSR: C_STEP Position */\n#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< CoreDebug DHCSR: C_STEP Mask */\n\n#define CoreDebug_DHCSR_C_HALT_Pos          1U                                            /*!< CoreDebug DHCSR: C_HALT Position */\n#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< CoreDebug DHCSR: C_HALT Mask */\n\n#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0U                                            /*!< CoreDebug DHCSR: C_DEBUGEN Position */\n#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/)     /*!< CoreDebug DHCSR: C_DEBUGEN Mask */\n\n/* Debug Core Register Selector Register Definitions */\n#define CoreDebug_DCRSR_REGWnR_Pos         16U                                            /*!< CoreDebug DCRSR: REGWnR Position */\n#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< CoreDebug DCRSR: REGWnR Mask */\n\n#define CoreDebug_DCRSR_REGSEL_Pos          0U                                            /*!< CoreDebug DCRSR: REGSEL Position */\n#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/)     /*!< CoreDebug DCRSR: REGSEL Mask */\n\n/* Debug Exception and Monitor Control Register Definitions */\n#define CoreDebug_DEMCR_TRCENA_Pos         24U                                            /*!< CoreDebug DEMCR: TRCENA Position */\n#define CoreDebug_DEMCR_TRCENA_Msk         (1UL << CoreDebug_DEMCR_TRCENA_Pos)            /*!< CoreDebug DEMCR: TRCENA Mask */\n\n#define CoreDebug_DEMCR_MON_REQ_Pos        19U                                            /*!< CoreDebug DEMCR: MON_REQ Position */\n#define CoreDebug_DEMCR_MON_REQ_Msk        (1UL << CoreDebug_DEMCR_MON_REQ_Pos)           /*!< CoreDebug DEMCR: MON_REQ Mask */\n\n#define CoreDebug_DEMCR_MON_STEP_Pos       18U                                            /*!< CoreDebug DEMCR: MON_STEP Position */\n#define CoreDebug_DEMCR_MON_STEP_Msk       (1UL << CoreDebug_DEMCR_MON_STEP_Pos)          /*!< CoreDebug DEMCR: MON_STEP Mask */\n\n#define CoreDebug_DEMCR_MON_PEND_Pos       17U                                            /*!< CoreDebug DEMCR: MON_PEND Position */\n#define CoreDebug_DEMCR_MON_PEND_Msk       (1UL << CoreDebug_DEMCR_MON_PEND_Pos)          /*!< CoreDebug DEMCR: MON_PEND Mask */\n\n#define CoreDebug_DEMCR_MON_EN_Pos         16U                                            /*!< CoreDebug DEMCR: MON_EN Position */\n#define CoreDebug_DEMCR_MON_EN_Msk         (1UL << CoreDebug_DEMCR_MON_EN_Pos)            /*!< CoreDebug DEMCR: MON_EN Mask */\n\n#define CoreDebug_DEMCR_VC_HARDERR_Pos     10U                                            /*!< CoreDebug DEMCR: VC_HARDERR Position */\n#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< CoreDebug DEMCR: VC_HARDERR Mask */\n\n#define CoreDebug_DEMCR_VC_INTERR_Pos       9U                                            /*!< CoreDebug DEMCR: VC_INTERR Position */\n#define CoreDebug_DEMCR_VC_INTERR_Msk      (1UL << CoreDebug_DEMCR_VC_INTERR_Pos)         /*!< CoreDebug DEMCR: VC_INTERR Mask */\n\n#define CoreDebug_DEMCR_VC_BUSERR_Pos       8U                                            /*!< CoreDebug DEMCR: VC_BUSERR Position */\n#define CoreDebug_DEMCR_VC_BUSERR_Msk      (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos)         /*!< CoreDebug DEMCR: VC_BUSERR Mask */\n\n#define CoreDebug_DEMCR_VC_STATERR_Pos      7U                                            /*!< CoreDebug DEMCR: VC_STATERR Position */\n#define CoreDebug_DEMCR_VC_STATERR_Msk     (1UL << CoreDebug_DEMCR_VC_STATERR_Pos)        /*!< CoreDebug DEMCR: VC_STATERR Mask */\n\n#define CoreDebug_DEMCR_VC_CHKERR_Pos       6U                                            /*!< CoreDebug DEMCR: VC_CHKERR Position */\n#define CoreDebug_DEMCR_VC_CHKERR_Msk      (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos)         /*!< CoreDebug DEMCR: VC_CHKERR Mask */\n\n#define CoreDebug_DEMCR_VC_NOCPERR_Pos      5U                                            /*!< CoreDebug DEMCR: VC_NOCPERR Position */\n#define CoreDebug_DEMCR_VC_NOCPERR_Msk     (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos)        /*!< CoreDebug DEMCR: VC_NOCPERR Mask */\n\n#define CoreDebug_DEMCR_VC_MMERR_Pos        4U                                            /*!< CoreDebug DEMCR: VC_MMERR Position */\n#define CoreDebug_DEMCR_VC_MMERR_Msk       (1UL << CoreDebug_DEMCR_VC_MMERR_Pos)          /*!< CoreDebug DEMCR: VC_MMERR Mask */\n\n#define CoreDebug_DEMCR_VC_CORERESET_Pos    0U                                            /*!< CoreDebug DEMCR: VC_CORERESET Position */\n#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/)  /*!< CoreDebug DEMCR: VC_CORERESET Mask */\n\n/* Debug Authentication Control Register Definitions */\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos  3U                                            /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos)    /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */\n\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos  2U                                            /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos)    /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */\n\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos   1U                                            /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk  (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos)     /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */\n\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos   0U                                            /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk  (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */\n\n/* Debug Security Control and Status Register Definitions */\n#define CoreDebug_DSCSR_CDS_Pos            16U                                            /*!< CoreDebug DSCSR: CDS Position */\n#define CoreDebug_DSCSR_CDS_Msk            (1UL << CoreDebug_DSCSR_CDS_Pos)               /*!< CoreDebug DSCSR: CDS Mask */\n\n#define CoreDebug_DSCSR_SBRSEL_Pos          1U                                            /*!< CoreDebug DSCSR: SBRSEL Position */\n#define CoreDebug_DSCSR_SBRSEL_Msk         (1UL << CoreDebug_DSCSR_SBRSEL_Pos)            /*!< CoreDebug DSCSR: SBRSEL Mask */\n\n#define CoreDebug_DSCSR_SBRSELEN_Pos        0U                                            /*!< CoreDebug DSCSR: SBRSELEN Position */\n#define CoreDebug_DSCSR_SBRSELEN_Msk       (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/)      /*!< CoreDebug DSCSR: SBRSELEN Mask */\n\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n  #define SCS_BASE            (0xE000E000UL)                             /*!< System Control Space Base Address */\n  #define ITM_BASE            (0xE0000000UL)                             /*!< ITM Base Address */\n  #define DWT_BASE            (0xE0001000UL)                             /*!< DWT Base Address */\n  #define TPI_BASE            (0xE0040000UL)                             /*!< TPI Base Address */\n  #define CoreDebug_BASE      (0xE000EDF0UL)                             /*!< Core Debug Base Address */\n  #define SysTick_BASE        (SCS_BASE +  0x0010UL)                     /*!< SysTick Base Address */\n  #define NVIC_BASE           (SCS_BASE +  0x0100UL)                     /*!< NVIC Base Address */\n  #define SCB_BASE            (SCS_BASE +  0x0D00UL)                     /*!< System Control Block Base Address */\n\n  #define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE         ) /*!< System control Register not in SCB */\n  #define SCB                 ((SCB_Type       *)     SCB_BASE         ) /*!< SCB configuration struct */\n  #define SysTick             ((SysTick_Type   *)     SysTick_BASE     ) /*!< SysTick configuration struct */\n  #define NVIC                ((NVIC_Type      *)     NVIC_BASE        ) /*!< NVIC configuration struct */\n  #define ITM                 ((ITM_Type       *)     ITM_BASE         ) /*!< ITM configuration struct */\n  #define DWT                 ((DWT_Type       *)     DWT_BASE         ) /*!< DWT configuration struct */\n  #define TPI                 ((TPI_Type       *)     TPI_BASE         ) /*!< TPI configuration struct */\n  #define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE   ) /*!< Core Debug configuration struct */\n\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n    #define MPU_BASE          (SCS_BASE +  0x0D90UL)                     /*!< Memory Protection Unit */\n    #define MPU               ((MPU_Type       *)     MPU_BASE         ) /*!< Memory Protection Unit */\n  #endif\n\n  #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n    #define SAU_BASE          (SCS_BASE +  0x0DD0UL)                     /*!< Security Attribution Unit */\n    #define SAU               ((SAU_Type       *)     SAU_BASE         ) /*!< Security Attribution Unit */\n  #endif\n\n  #define FPU_BASE            (SCS_BASE +  0x0F30UL)                     /*!< Floating Point Unit */\n  #define FPU                 ((FPU_Type       *)     FPU_BASE         ) /*!< Floating Point Unit */\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n  #define SCS_BASE_NS         (0xE002E000UL)                             /*!< System Control Space Base Address (non-secure address space) */\n  #define CoreDebug_BASE_NS   (0xE002EDF0UL)                             /*!< Core Debug Base Address           (non-secure address space) */\n  #define SysTick_BASE_NS     (SCS_BASE_NS +  0x0010UL)                  /*!< SysTick Base Address              (non-secure address space) */\n  #define NVIC_BASE_NS        (SCS_BASE_NS +  0x0100UL)                  /*!< NVIC Base Address                 (non-secure address space) */\n  #define SCB_BASE_NS         (SCS_BASE_NS +  0x0D00UL)                  /*!< System Control Block Base Address (non-secure address space) */\n\n  #define SCnSCB_NS           ((SCnSCB_Type    *)     SCS_BASE_NS      ) /*!< System control Register not in SCB(non-secure address space) */\n  #define SCB_NS              ((SCB_Type       *)     SCB_BASE_NS      ) /*!< SCB configuration struct          (non-secure address space) */\n  #define SysTick_NS          ((SysTick_Type   *)     SysTick_BASE_NS  ) /*!< SysTick configuration struct      (non-secure address space) */\n  #define NVIC_NS             ((NVIC_Type      *)     NVIC_BASE_NS     ) /*!< NVIC configuration struct         (non-secure address space) */\n  #define CoreDebug_NS        ((CoreDebug_Type *)     CoreDebug_BASE_NS) /*!< Core Debug configuration struct   (non-secure address space) */\n\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n    #define MPU_BASE_NS       (SCS_BASE_NS +  0x0D90UL)                  /*!< Memory Protection Unit            (non-secure address space) */\n    #define MPU_NS            ((MPU_Type       *)     MPU_BASE_NS      ) /*!< Memory Protection Unit            (non-secure address space) */\n  #endif\n\n  #define FPU_BASE_NS         (SCS_BASE_NS +  0x0F30UL)                  /*!< Floating Point Unit               (non-secure address space) */\n  #define FPU_NS              ((FPU_Type       *)     FPU_BASE_NS      ) /*!< Floating Point Unit               (non-secure address space) */\n\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Debug Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifndef CMSIS_NVIC_VIRTUAL\n  #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping\n  #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n  #define NVIC_GetActive              __NVIC_GetActive\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifndef CMSIS_VECTAB_VIRTUAL\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n\n/**\n  \\brief   Set Priority Grouping\n  \\details Sets the priority grouping field using the required unlock sequence.\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\n           Only values from 0..7 are used.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]      PriorityGroup  Priority grouping field.\n */\n__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)\n{\n  uint32_t reg_value;\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\n\n  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */\n  reg_value  =  (reg_value                                   |\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                (PriorityGroupTmp << 8U)                      );              /* Insert write key and priorty group */\n  SCB->AIRCR =  reg_value;\n}\n\n\n/**\n  \\brief   Get Priority Grouping\n  \\details Reads the priority grouping field from the NVIC Interrupt Controller.\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void)\n{\n  return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\n}\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt\n  \\details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   Get Interrupt Target State\n  \\details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n  \\return             1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Target State\n  \\details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n                      1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |=  ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)));\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Clear Interrupt Target State\n  \\details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n                      1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)));\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IPR[((uint32_t)(int32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n  else\n  {\n    SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return(((uint32_t)NVIC->IPR[((uint32_t)(int32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Encode Priority\n  \\details Encodes the priority for an interrupt with the given priority group,\n           preemptive priority value, and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [in]   PreemptPriority  Preemptive priority value (starting from 0).\n  \\param [in]       SubPriority  Subpriority value (starting from 0).\n  \\return                        Encoded priority. Value can be used in the function \\ref NVIC_SetPriority().\n */\n__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  return (\n           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |\n           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))\n         );\n}\n\n\n/**\n  \\brief   Decode Priority\n  \\details Decodes an interrupt priority value with a given priority group to\n           preemptive priority value and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.\n  \\param [in]         Priority   Priority value, which can be retrieved with the function \\ref NVIC_GetPriority().\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [out] pPreemptPriority  Preemptive priority value (starting from 0).\n  \\param [out]     pSubPriority  Subpriority value (starting from 0).\n */\n__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);\n  *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL);\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__STATIC_INLINE void NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |\n                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |\n                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   Set Priority Grouping (non-secure)\n  \\details Sets the non-secure priority grouping field when in secure state using the required unlock sequence.\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\n           Only values from 0..7 are used.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]      PriorityGroup  Priority grouping field.\n */\n__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup)\n{\n  uint32_t reg_value;\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\n\n  reg_value  =  SCB_NS->AIRCR;                                                   /* read old register configuration    */\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk));             /* clear bits to change               */\n  reg_value  =  (reg_value                                   |\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                (PriorityGroupTmp << 8U)                      );              /* Insert write key and priorty group */\n  SCB_NS->AIRCR =  reg_value;\n}\n\n\n/**\n  \\brief   Get Priority Grouping (non-secure)\n  \\details Reads the priority grouping field from the non-secure NVIC when in secure state.\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void)\n{\n  return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\n}\n\n\n/**\n  \\brief   Enable Interrupt (non-secure)\n  \\details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status (non-secure)\n  \\details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt (non-secure)\n  \\details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt (non-secure)\n  \\details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt (non-secure)\n  \\details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt (non-secure)\n  \\details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt (non-secure)\n  \\details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority (non-secure)\n  \\details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every non-secure processor exception.\n */\n__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n  else\n  {\n    SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority (non-secure)\n  \\details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return(((uint32_t)NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return(((uint32_t)SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n#endif /*  defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n  uint32_t mvfr0;\n\n  mvfr0 = FPU->MVFR0;\n  if      ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U)\n  {\n    return 2U;           /* Double + Single precision FPU */\n  }\n  else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U)\n  {\n    return 1U;           /* Single precision FPU */\n  }\n  else\n  {\n    return 0U;           /* No FPU */\n  }\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##########################   SAU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SAUFunctions SAU Functions\n  \\brief    Functions that configure the SAU.\n  @{\n */\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n\n/**\n  \\brief   Enable SAU\n  \\details Enables the Security Attribution Unit (SAU).\n */\n__STATIC_INLINE void TZ_SAU_Enable(void)\n{\n    SAU->CTRL |=  (SAU_CTRL_ENABLE_Msk);\n}\n\n\n\n/**\n  \\brief   Disable SAU\n  \\details Disables the Security Attribution Unit (SAU).\n */\n__STATIC_INLINE void TZ_SAU_Disable(void)\n{\n    SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk);\n}\n\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n/*@} end of CMSIS_Core_SAUFunctions */\n\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   System Tick Configuration (non-secure)\n  \\details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>TZ_SysTick_Config_NS</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n\n */\n__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                         /* Reload value impossible */\n  }\n\n  SysTick_NS->LOAD  = (uint32_t)(ticks - 1UL);                            /* set reload register */\n  TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick_NS->VAL   = 0UL;                                                /* Load the SysTick Counter Value */\n  SysTick_NS->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                      SysTick_CTRL_TICKINT_Msk   |\n                      SysTick_CTRL_ENABLE_Msk;                            /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                           /* Function successful */\n}\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n/* ##################################### Debug In/Output function ########################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_core_DebugFunctions ITM Functions\n  \\brief    Functions that access the ITM debug interface.\n  @{\n */\n\nextern volatile int32_t ITM_RxBuffer;                              /*!< External variable to receive characters. */\n#define                 ITM_RXBUFFER_EMPTY  ((int32_t)0x5AA55AA5U) /*!< Value identifying \\ref ITM_RxBuffer is ready for next character. */\n\n\n/**\n  \\brief   ITM Send Character\n  \\details Transmits a character via the ITM channel 0, and\n           \\li Just returns when no debugger is connected that has booked the output.\n           \\li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.\n  \\param [in]     ch  Character to transmit.\n  \\returns            Character to transmit.\n */\n__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)\n{\n  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */\n      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */\n  {\n    while (ITM->PORT[0U].u32 == 0UL)\n    {\n      __NOP();\n    }\n    ITM->PORT[0U].u8 = (uint8_t)ch;\n  }\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Receive Character\n  \\details Inputs a character via the external variable \\ref ITM_RxBuffer.\n  \\return             Received character.\n  \\return         -1  No character pending.\n */\n__STATIC_INLINE int32_t ITM_ReceiveChar (void)\n{\n  int32_t ch = -1;                           /* no character available */\n\n  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY)\n  {\n    ch = ITM_RxBuffer;\n    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */\n  }\n\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Check Character\n  \\details Checks whether a character is pending for reading in the variable \\ref ITM_RxBuffer.\n  \\return          0  No character available.\n  \\return          1  Character available.\n */\n__STATIC_INLINE int32_t ITM_CheckChar (void)\n{\n\n  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY)\n  {\n    return (0);                              /* no character available */\n  }\n  else\n  {\n    return (1);                              /*    character available */\n  }\n}\n\n/*@} end of CMSIS_core_DebugFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_ARMV8MML_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_cm0.h",
    "content": "/**************************************************************************//**\n * @file     core_cm0.h\n * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File\n * @version  V5.0.1\n * @date     25. November 2016\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_CM0_H_GENERIC\n#define __CORE_CM0_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex_M0\n  @{\n */\n\n/*  CMSIS CM0 definitions */\n#define __CM0_CMSIS_VERSION_MAIN  ( 5U)                                  /*!< [31:16] CMSIS HAL main version */\n#define __CM0_CMSIS_VERSION_SUB   ( 0U)                                  /*!< [15:0]  CMSIS HAL sub version */\n#define __CM0_CMSIS_VERSION       ((__CM0_CMSIS_VERSION_MAIN << 16U) | \\\n                                    __CM0_CMSIS_VERSION_SUB           )  /*!< CMSIS HAL version number */\n\n#define __CORTEX_M                (0U)                                   /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    This core does not support an FPU at all\n*/\n#define __FPU_USED       0U\n\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM0_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_CM0_H_DEPENDANT\n#define __CORE_CM0_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __CM0_REV\n    #define __CM0_REV               0x0000U\n    #warning \"__CM0_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          2U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group Cortex_M0 */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:28;              /*!< bit:  0..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */\n    uint32_t _reserved1:3;               /*!< bit: 25..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:1;               /*!< bit:      0  Reserved */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */\n    uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[1U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[31U];\n  __IOM uint32_t ICER[1U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[31U];\n  __IOM uint32_t ISPR[1U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[31U];\n  __IOM uint32_t ICPR[1U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[31U];\n        uint32_t RESERVED4[64U];\n  __IOM uint32_t IP[8U];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register */\n}  NVIC_Type;\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n        uint32_t RESERVED0;\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n        uint32_t RESERVED1;\n  __IOM uint32_t SHP[2U];                /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_NMIPENDSET_Pos            31U                                            /*!< SCB ICSR: NMIPENDSET Position */\n#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_STKALIGN_Pos                9U                                            /*!< SCB CCR: STKALIGN Position */\n#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor.\n            Therefore they are not covered by the Cortex-M0 header file.\n  @{\n */\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */\n#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */\n#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */\n#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */\n\n#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */\n#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */\n#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */\n\n\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifndef CMSIS_NVIC_VIRTUAL\n/*#define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping   not available for Cortex-M0 */\n/*#define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping   not available for Cortex-M0 */\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n/*#define NVIC_GetActive              __NVIC_GetActive             not available for Cortex-M0 */\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifndef CMSIS_VECTAB_VIRTUAL\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n/* Interrupt Priorities are WORD accessible only under ARMv6M                   */\n/* The following MACROS handle generation of the register offset and byte masks */\n#define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL)\n#define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      )\n#define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      )\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n  else\n  {\n    SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           Address 0 must be mapped to SRAM.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n  uint32_t *vectors = (uint32_t *)0x0U;\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n  uint32_t *vectors = (uint32_t *)0x0U;\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__STATIC_INLINE void NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                 SCB_AIRCR_SYSRESETREQ_Msk);\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n    return 0U;           /* No FPU */\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM0_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_cm0plus.h",
    "content": "/**************************************************************************//**\n * @file     core_cm0plus.h\n * @brief    CMSIS Cortex-M0+ Core Peripheral Access Layer Header File\n * @version  V5.0.1\n * @date     25. November 2016\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_CM0PLUS_H_GENERIC\n#define __CORE_CM0PLUS_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex-M0+\n  @{\n */\n\n/*  CMSIS CM0+ definitions */\n#define __CM0PLUS_CMSIS_VERSION_MAIN ( 5U)                                      /*!< [31:16] CMSIS HAL main version */\n#define __CM0PLUS_CMSIS_VERSION_SUB  ( 0U)                                      /*!< [15:0]  CMSIS HAL sub version */\n#define __CM0PLUS_CMSIS_VERSION      ((__CM0PLUS_CMSIS_VERSION_MAIN << 16U) | \\\n                                       __CM0PLUS_CMSIS_VERSION_SUB           )  /*!< CMSIS HAL version number */\n\n#define __CORTEX_M                   (0U)                                       /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    This core does not support an FPU at all\n*/\n#define __FPU_USED       0U\n\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM0PLUS_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_CM0PLUS_H_DEPENDANT\n#define __CORE_CM0PLUS_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __CM0PLUS_REV\n    #define __CM0PLUS_REV             0x0000U\n    #warning \"__CM0PLUS_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __VTOR_PRESENT\n    #define __VTOR_PRESENT            0U\n    #warning \"__VTOR_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          2U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group Cortex-M0+ */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core MPU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:28;              /*!< bit:  0..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */\n    uint32_t _reserved1:3;               /*!< bit: 25..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */\n    uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[1U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[31U];\n  __IOM uint32_t ICER[1U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[31U];\n  __IOM uint32_t ISPR[1U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[31U];\n  __IOM uint32_t ICPR[1U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[31U];\n        uint32_t RESERVED4[64U];\n  __IOM uint32_t IP[8U];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register */\n}  NVIC_Type;\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n#else\n        uint32_t RESERVED0;\n#endif\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n        uint32_t RESERVED1;\n  __IOM uint32_t SHP[2U];                /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_NMIPENDSET_Pos            31U                                            /*!< SCB ICSR: NMIPENDSET Position */\n#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_VTOR_TBLOFF_Pos                 8U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos)            /*!< SCB VTOR: TBLOFF Mask */\n#endif\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_STKALIGN_Pos                9U                                            /*!< SCB CCR: STKALIGN Position */\n#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RASR;                   /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register */\n} MPU_Type;\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_ADDR_Pos                   8U                                            /*!< MPU RBAR: ADDR Position */\n#define MPU_RBAR_ADDR_Msk                  (0xFFFFFFUL << MPU_RBAR_ADDR_Pos)              /*!< MPU RBAR: ADDR Mask */\n\n#define MPU_RBAR_VALID_Pos                  4U                                            /*!< MPU RBAR: VALID Position */\n#define MPU_RBAR_VALID_Msk                 (1UL << MPU_RBAR_VALID_Pos)                    /*!< MPU RBAR: VALID Mask */\n\n#define MPU_RBAR_REGION_Pos                 0U                                            /*!< MPU RBAR: REGION Position */\n#define MPU_RBAR_REGION_Msk                (0xFUL /*<< MPU_RBAR_REGION_Pos*/)             /*!< MPU RBAR: REGION Mask */\n\n/* MPU Region Attribute and Size Register Definitions */\n#define MPU_RASR_ATTRS_Pos                 16U                                            /*!< MPU RASR: MPU Region Attribute field Position */\n#define MPU_RASR_ATTRS_Msk                 (0xFFFFUL << MPU_RASR_ATTRS_Pos)               /*!< MPU RASR: MPU Region Attribute field Mask */\n\n#define MPU_RASR_XN_Pos                    28U                                            /*!< MPU RASR: ATTRS.XN Position */\n#define MPU_RASR_XN_Msk                    (1UL << MPU_RASR_XN_Pos)                       /*!< MPU RASR: ATTRS.XN Mask */\n\n#define MPU_RASR_AP_Pos                    24U                                            /*!< MPU RASR: ATTRS.AP Position */\n#define MPU_RASR_AP_Msk                    (0x7UL << MPU_RASR_AP_Pos)                     /*!< MPU RASR: ATTRS.AP Mask */\n\n#define MPU_RASR_TEX_Pos                   19U                                            /*!< MPU RASR: ATTRS.TEX Position */\n#define MPU_RASR_TEX_Msk                   (0x7UL << MPU_RASR_TEX_Pos)                    /*!< MPU RASR: ATTRS.TEX Mask */\n\n#define MPU_RASR_S_Pos                     18U                                            /*!< MPU RASR: ATTRS.S Position */\n#define MPU_RASR_S_Msk                     (1UL << MPU_RASR_S_Pos)                        /*!< MPU RASR: ATTRS.S Mask */\n\n#define MPU_RASR_C_Pos                     17U                                            /*!< MPU RASR: ATTRS.C Position */\n#define MPU_RASR_C_Msk                     (1UL << MPU_RASR_C_Pos)                        /*!< MPU RASR: ATTRS.C Mask */\n\n#define MPU_RASR_B_Pos                     16U                                            /*!< MPU RASR: ATTRS.B Position */\n#define MPU_RASR_B_Msk                     (1UL << MPU_RASR_B_Pos)                        /*!< MPU RASR: ATTRS.B Mask */\n\n#define MPU_RASR_SRD_Pos                    8U                                            /*!< MPU RASR: Sub-Region Disable Position */\n#define MPU_RASR_SRD_Msk                   (0xFFUL << MPU_RASR_SRD_Pos)                   /*!< MPU RASR: Sub-Region Disable Mask */\n\n#define MPU_RASR_SIZE_Pos                   1U                                            /*!< MPU RASR: Region Size Field Position */\n#define MPU_RASR_SIZE_Msk                  (0x1FUL << MPU_RASR_SIZE_Pos)                  /*!< MPU RASR: Region Size Field Mask */\n\n#define MPU_RASR_ENABLE_Pos                 0U                                            /*!< MPU RASR: Region enable bit Position */\n#define MPU_RASR_ENABLE_Msk                (1UL /*<< MPU_RASR_ENABLE_Pos*/)               /*!< MPU RASR: Region enable bit Disable Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor.\n            Therefore they are not covered by the Cortex-M0+ header file.\n  @{\n */\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */\n#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */\n#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */\n#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */\n\n#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */\n#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */\n#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit */\n  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit */\n#endif\n\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifndef CMSIS_NVIC_VIRTUAL\n/*#define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping   not available for Cortex-M0+ */\n/*#define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping   not available for Cortex-M0+ */\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n/*#define NVIC_GetActive              __NVIC_GetActive             not available for Cortex-M0+ */\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifndef CMSIS_VECTAB_VIRTUAL\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n/* Interrupt Priorities are WORD accessible only under ARMv6M                   */\n/* The following MACROS handle generation of the register offset and byte masks */\n#define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL)\n#define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      )\n#define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      )\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n  else\n  {\n    SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n           If VTOR is not present address 0 must be mapped to SRAM.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n#else\n    uint32_t *vectors = (uint32_t *)0x0U;\n#endif\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n#else\n  uint32_t *vectors = (uint32_t *)0x0U;\n#endif\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__STATIC_INLINE void NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                 SCB_AIRCR_SYSRESETREQ_Msk);\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n    return 0U;           /* No FPU */\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM0PLUS_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_cm23.h",
    "content": "/**************************************************************************//**\n * @file     core_cm23.h\n * @brief    CMSIS Cortex-M23 Core Peripheral Access Layer Header File\n * @version  V5.0.1\n * @date     25. November 2016\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_CM23_H_GENERIC\n#define __CORE_CM23_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex_M23\n  @{\n */\n\n/*  CMSIS cmGrebe definitions */\n#define __CM23_CMSIS_VERSION_MAIN  ( 5U)                                       /*!< [31:16] CMSIS HAL main version */\n#define __CM23_CMSIS_VERSION_SUB   ( 0U)                                       /*!< [15:0]  CMSIS HAL sub version */\n#define __CM23_CMSIS_VERSION       ((__CM23_CMSIS_VERSION_MAIN << 16U) | \\\n                                     __CM23_CMSIS_VERSION_SUB           )      /*!< CMSIS HAL version number */\n\n#define __CORTEX_M                     (23U)                                   /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    This core does not support an FPU at all\n*/\n#define __FPU_USED       0U\n\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM23_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_CM23_H_DEPENDANT\n#define __CORE_CM23_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __CM23_REV\n    #define __CM23_REV                0x0000U\n    #warning \"__CM23_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __FPU_PRESENT\n    #define __FPU_PRESENT             0U\n    #warning \"__FPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __SAUREGION_PRESENT\n    #define __SAUREGION_PRESENT       0U\n    #warning \"__SAUREGION_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __VTOR_PRESENT\n    #define __VTOR_PRESENT            0U\n    #warning \"__VTOR_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          2U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __ETM_PRESENT\n    #define __ETM_PRESENT             0U\n    #warning \"__ETM_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MTB_PRESENT\n    #define __MTB_PRESENT             0U\n    #warning \"__MTB_PRESENT not defined in device header file; using default!\"\n  #endif\n\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group Cortex_M23 */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core Debug Register\n  - Core MPU Register\n  - Core SAU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:28;              /*!< bit:  0..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */\n    uint32_t _reserved1:3;               /*!< bit: 25..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack-pointer select */\n    uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[16U];              /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[16U];\n  __IOM uint32_t ICER[16U];              /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[16U];\n  __IOM uint32_t ISPR[16U];              /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[16U];\n  __IOM uint32_t ICPR[16U];              /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[16U];\n  __IOM uint32_t IABR[16U];              /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */\n        uint32_t RESERVED4[16U];\n  __IOM uint32_t ITNS[16U];              /*!< Offset: 0x280 (R/W)  Interrupt Non-Secure State Register */\n        uint32_t RESERVED5[16U];\n  __IOM uint32_t IPR[124U];              /*!< Offset: 0x300 (R/W)  Interrupt Priority Register */\n}  NVIC_Type;\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n#else\n        uint32_t RESERVED0;\n#endif\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n        uint32_t RESERVED1;\n  __IOM uint32_t SHPR[2U];               /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_PENDNMISET_Pos            31U                                            /*!< SCB ICSR: PENDNMISET Position */\n#define SCB_ICSR_PENDNMISET_Msk            (1UL << SCB_ICSR_PENDNMISET_Pos)               /*!< SCB ICSR: PENDNMISET Mask */\n\n#define SCB_ICSR_PENDNMICLR_Pos            30U                                            /*!< SCB ICSR: PENDNMICLR Position */\n#define SCB_ICSR_PENDNMICLR_Msk            (1UL << SCB_ICSR_PENDNMICLR_Pos)               /*!< SCB ICSR: PENDNMICLR Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_STTNS_Pos                 24U                                            /*!< SCB ICSR: STTNS Position (Security Extension) */\n#define SCB_ICSR_STTNS_Msk                 (1UL << SCB_ICSR_STTNS_Pos)                    /*!< SCB ICSR: STTNS Mask (Security Extension) */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_RETTOBASE_Pos             11U                                            /*!< SCB ICSR: RETTOBASE Position */\n#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n/* SCB Vector Table Offset Register Definitions */\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */\n#endif\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_PRIS_Pos                 14U                                            /*!< SCB AIRCR: PRIS Position */\n#define SCB_AIRCR_PRIS_Msk                 (1UL << SCB_AIRCR_PRIS_Pos)                    /*!< SCB AIRCR: PRIS Mask */\n\n#define SCB_AIRCR_BFHFNMINS_Pos            13U                                            /*!< SCB AIRCR: BFHFNMINS Position */\n#define SCB_AIRCR_BFHFNMINS_Msk            (1UL << SCB_AIRCR_BFHFNMINS_Pos)               /*!< SCB AIRCR: BFHFNMINS Mask */\n\n#define SCB_AIRCR_SYSRESETREQS_Pos          3U                                            /*!< SCB AIRCR: SYSRESETREQS Position */\n#define SCB_AIRCR_SYSRESETREQS_Msk         (1UL << SCB_AIRCR_SYSRESETREQS_Pos)            /*!< SCB AIRCR: SYSRESETREQS Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEPS_Pos              3U                                            /*!< SCB SCR: SLEEPDEEPS Position */\n#define SCB_SCR_SLEEPDEEPS_Msk             (1UL << SCB_SCR_SLEEPDEEPS_Pos)                /*!< SCB SCR: SLEEPDEEPS Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_BP_Pos                     18U                                            /*!< SCB CCR: BP Position */\n#define SCB_CCR_BP_Msk                     (1UL << SCB_CCR_BP_Pos)                        /*!< SCB CCR: BP Mask */\n\n#define SCB_CCR_IC_Pos                     17U                                            /*!< SCB CCR: IC Position */\n#define SCB_CCR_IC_Msk                     (1UL << SCB_CCR_IC_Pos)                        /*!< SCB CCR: IC Mask */\n\n#define SCB_CCR_DC_Pos                     16U                                            /*!< SCB CCR: DC Position */\n#define SCB_CCR_DC_Msk                     (1UL << SCB_CCR_DC_Pos)                        /*!< SCB CCR: DC Mask */\n\n#define SCB_CCR_STKOFHFNMIGN_Pos           10U                                            /*!< SCB CCR: STKOFHFNMIGN Position */\n#define SCB_CCR_STKOFHFNMIGN_Msk           (1UL << SCB_CCR_STKOFHFNMIGN_Pos)              /*!< SCB CCR: STKOFHFNMIGN Mask */\n\n#define SCB_CCR_BFHFNMIGN_Pos               8U                                            /*!< SCB CCR: BFHFNMIGN Position */\n#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */\n\n#define SCB_CCR_DIV_0_TRP_Pos               4U                                            /*!< SCB CCR: DIV_0_TRP Position */\n#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n#define SCB_CCR_USERSETMPEND_Pos            1U                                            /*!< SCB CCR: USERSETMPEND Position */\n#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_HARDFAULTPENDED_Pos      21U                                            /*!< SCB SHCSR: HARDFAULTPENDED Position */\n#define SCB_SHCSR_HARDFAULTPENDED_Msk      (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos)         /*!< SCB SHCSR: HARDFAULTPENDED Mask */\n\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n#define SCB_SHCSR_SYSTICKACT_Pos           11U                                            /*!< SCB SHCSR: SYSTICKACT Position */\n#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */\n\n#define SCB_SHCSR_PENDSVACT_Pos            10U                                            /*!< SCB SHCSR: PENDSVACT Position */\n#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */\n\n#define SCB_SHCSR_SVCALLACT_Pos             7U                                            /*!< SCB SHCSR: SVCALLACT Position */\n#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */\n\n#define SCB_SHCSR_NMIACT_Pos                5U                                            /*!< SCB SHCSR: NMIACT Position */\n#define SCB_SHCSR_NMIACT_Msk               (1UL << SCB_SHCSR_NMIACT_Pos)                  /*!< SCB SHCSR: NMIACT Mask */\n\n#define SCB_SHCSR_HARDFAULTACT_Pos          2U                                            /*!< SCB SHCSR: HARDFAULTACT Position */\n#define SCB_SHCSR_HARDFAULTACT_Msk         (1UL << SCB_SHCSR_HARDFAULTACT_Pos)            /*!< SCB SHCSR: HARDFAULTACT Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)\n  \\brief    Type definitions for the Data Watchpoint and Trace (DWT)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Data Watchpoint and Trace Register (DWT).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  Control Register */\n        uint32_t RESERVED0[6U];\n  __IM  uint32_t PCSR;                   /*!< Offset: 0x01C (R/ )  Program Counter Sample Register */\n  __IOM uint32_t COMP0;                  /*!< Offset: 0x020 (R/W)  Comparator Register 0 */\n        uint32_t RESERVED1[1U];\n  __IOM uint32_t FUNCTION0;              /*!< Offset: 0x028 (R/W)  Function Register 0 */\n        uint32_t RESERVED2[1U];\n  __IOM uint32_t COMP1;                  /*!< Offset: 0x030 (R/W)  Comparator Register 1 */\n        uint32_t RESERVED3[1U];\n  __IOM uint32_t FUNCTION1;              /*!< Offset: 0x038 (R/W)  Function Register 1 */\n        uint32_t RESERVED4[1U];\n  __IOM uint32_t COMP2;                  /*!< Offset: 0x040 (R/W)  Comparator Register 2 */\n        uint32_t RESERVED5[1U];\n  __IOM uint32_t FUNCTION2;              /*!< Offset: 0x048 (R/W)  Function Register 2 */\n        uint32_t RESERVED6[1U];\n  __IOM uint32_t COMP3;                  /*!< Offset: 0x050 (R/W)  Comparator Register 3 */\n        uint32_t RESERVED7[1U];\n  __IOM uint32_t FUNCTION3;              /*!< Offset: 0x058 (R/W)  Function Register 3 */\n        uint32_t RESERVED8[1U];\n  __IOM uint32_t COMP4;                  /*!< Offset: 0x060 (R/W)  Comparator Register 4 */\n        uint32_t RESERVED9[1U];\n  __IOM uint32_t FUNCTION4;              /*!< Offset: 0x068 (R/W)  Function Register 4 */\n        uint32_t RESERVED10[1U];\n  __IOM uint32_t COMP5;                  /*!< Offset: 0x070 (R/W)  Comparator Register 5 */\n        uint32_t RESERVED11[1U];\n  __IOM uint32_t FUNCTION5;              /*!< Offset: 0x078 (R/W)  Function Register 5 */\n        uint32_t RESERVED12[1U];\n  __IOM uint32_t COMP6;                  /*!< Offset: 0x080 (R/W)  Comparator Register 6 */\n        uint32_t RESERVED13[1U];\n  __IOM uint32_t FUNCTION6;              /*!< Offset: 0x088 (R/W)  Function Register 6 */\n        uint32_t RESERVED14[1U];\n  __IOM uint32_t COMP7;                  /*!< Offset: 0x090 (R/W)  Comparator Register 7 */\n        uint32_t RESERVED15[1U];\n  __IOM uint32_t FUNCTION7;              /*!< Offset: 0x098 (R/W)  Function Register 7 */\n        uint32_t RESERVED16[1U];\n  __IOM uint32_t COMP8;                  /*!< Offset: 0x0A0 (R/W)  Comparator Register 8 */\n        uint32_t RESERVED17[1U];\n  __IOM uint32_t FUNCTION8;              /*!< Offset: 0x0A8 (R/W)  Function Register 8 */\n        uint32_t RESERVED18[1U];\n  __IOM uint32_t COMP9;                  /*!< Offset: 0x0B0 (R/W)  Comparator Register 9 */\n        uint32_t RESERVED19[1U];\n  __IOM uint32_t FUNCTION9;              /*!< Offset: 0x0B8 (R/W)  Function Register 9 */\n        uint32_t RESERVED20[1U];\n  __IOM uint32_t COMP10;                 /*!< Offset: 0x0C0 (R/W)  Comparator Register 10 */\n        uint32_t RESERVED21[1U];\n  __IOM uint32_t FUNCTION10;             /*!< Offset: 0x0C8 (R/W)  Function Register 10 */\n        uint32_t RESERVED22[1U];\n  __IOM uint32_t COMP11;                 /*!< Offset: 0x0D0 (R/W)  Comparator Register 11 */\n        uint32_t RESERVED23[1U];\n  __IOM uint32_t FUNCTION11;             /*!< Offset: 0x0D8 (R/W)  Function Register 11 */\n        uint32_t RESERVED24[1U];\n  __IOM uint32_t COMP12;                 /*!< Offset: 0x0E0 (R/W)  Comparator Register 12 */\n        uint32_t RESERVED25[1U];\n  __IOM uint32_t FUNCTION12;             /*!< Offset: 0x0E8 (R/W)  Function Register 12 */\n        uint32_t RESERVED26[1U];\n  __IOM uint32_t COMP13;                 /*!< Offset: 0x0F0 (R/W)  Comparator Register 13 */\n        uint32_t RESERVED27[1U];\n  __IOM uint32_t FUNCTION13;             /*!< Offset: 0x0F8 (R/W)  Function Register 13 */\n        uint32_t RESERVED28[1U];\n  __IOM uint32_t COMP14;                 /*!< Offset: 0x100 (R/W)  Comparator Register 14 */\n        uint32_t RESERVED29[1U];\n  __IOM uint32_t FUNCTION14;             /*!< Offset: 0x108 (R/W)  Function Register 14 */\n        uint32_t RESERVED30[1U];\n  __IOM uint32_t COMP15;                 /*!< Offset: 0x110 (R/W)  Comparator Register 15 */\n        uint32_t RESERVED31[1U];\n  __IOM uint32_t FUNCTION15;             /*!< Offset: 0x118 (R/W)  Function Register 15 */\n} DWT_Type;\n\n/* DWT Control Register Definitions */\n#define DWT_CTRL_NUMCOMP_Pos               28U                                         /*!< DWT CTRL: NUMCOMP Position */\n#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */\n\n#define DWT_CTRL_NOTRCPKT_Pos              27U                                         /*!< DWT CTRL: NOTRCPKT Position */\n#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */\n\n#define DWT_CTRL_NOEXTTRIG_Pos             26U                                         /*!< DWT CTRL: NOEXTTRIG Position */\n#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */\n\n#define DWT_CTRL_NOCYCCNT_Pos              25U                                         /*!< DWT CTRL: NOCYCCNT Position */\n#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */\n\n#define DWT_CTRL_NOPRFCNT_Pos              24U                                         /*!< DWT CTRL: NOPRFCNT Position */\n#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */\n\n/* DWT Comparator Function Register Definitions */\n#define DWT_FUNCTION_ID_Pos                27U                                         /*!< DWT FUNCTION: ID Position */\n#define DWT_FUNCTION_ID_Msk                (0x1FUL << DWT_FUNCTION_ID_Pos)             /*!< DWT FUNCTION: ID Mask */\n\n#define DWT_FUNCTION_MATCHED_Pos           24U                                         /*!< DWT FUNCTION: MATCHED Position */\n#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */\n\n#define DWT_FUNCTION_DATAVSIZE_Pos         10U                                         /*!< DWT FUNCTION: DATAVSIZE Position */\n#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */\n\n#define DWT_FUNCTION_ACTION_Pos             4U                                         /*!< DWT FUNCTION: ACTION Position */\n#define DWT_FUNCTION_ACTION_Msk            (0x3UL << DWT_FUNCTION_ACTION_Pos)          /*!< DWT FUNCTION: ACTION Mask */\n\n#define DWT_FUNCTION_MATCH_Pos              0U                                         /*!< DWT FUNCTION: MATCH Position */\n#define DWT_FUNCTION_MATCH_Msk             (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/)       /*!< DWT FUNCTION: MATCH Mask */\n\n/*@}*/ /* end of group CMSIS_DWT */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_TPI     Trace Port Interface (TPI)\n  \\brief    Type definitions for the Trace Port Interface (TPI)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Trace Port Interface Register (TPI).\n */\ntypedef struct\n{\n  __IOM uint32_t SSPSR;                  /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register */\n  __IOM uint32_t CSPSR;                  /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */\n        uint32_t RESERVED0[2U];\n  __IOM uint32_t ACPR;                   /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */\n        uint32_t RESERVED1[55U];\n  __IOM uint32_t SPPR;                   /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */\n        uint32_t RESERVED2[131U];\n  __IM  uint32_t FFSR;                   /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */\n  __IOM uint32_t FFCR;                   /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */\n  __IM  uint32_t FSCR;                   /*!< Offset: 0x308 (R/ )  Formatter Synchronization Counter Register */\n        uint32_t RESERVED3[759U];\n  __IM  uint32_t TRIGGER;                /*!< Offset: 0xEE8 (R/ )  TRIGGER */\n  __IM  uint32_t FIFO0;                  /*!< Offset: 0xEEC (R/ )  Integration ETM Data */\n  __IM  uint32_t ITATBCTR2;              /*!< Offset: 0xEF0 (R/ )  ITATBCTR2 */\n        uint32_t RESERVED4[1U];\n  __IM  uint32_t ITATBCTR0;              /*!< Offset: 0xEF8 (R/ )  ITATBCTR0 */\n  __IM  uint32_t FIFO1;                  /*!< Offset: 0xEFC (R/ )  Integration ITM Data */\n  __IOM uint32_t ITCTRL;                 /*!< Offset: 0xF00 (R/W)  Integration Mode Control */\n        uint32_t RESERVED5[39U];\n  __IOM uint32_t CLAIMSET;               /*!< Offset: 0xFA0 (R/W)  Claim tag set */\n  __IOM uint32_t CLAIMCLR;               /*!< Offset: 0xFA4 (R/W)  Claim tag clear */\n        uint32_t RESERVED7[8U];\n  __IM  uint32_t DEVID;                  /*!< Offset: 0xFC8 (R/ )  TPIU_DEVID */\n  __IM  uint32_t DEVTYPE;                /*!< Offset: 0xFCC (R/ )  TPIU_DEVTYPE */\n} TPI_Type;\n\n/* TPI Asynchronous Clock Prescaler Register Definitions */\n#define TPI_ACPR_PRESCALER_Pos              0U                                         /*!< TPI ACPR: PRESCALER Position */\n#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/)    /*!< TPI ACPR: PRESCALER Mask */\n\n/* TPI Selected Pin Protocol Register Definitions */\n#define TPI_SPPR_TXMODE_Pos                 0U                                         /*!< TPI SPPR: TXMODE Position */\n#define TPI_SPPR_TXMODE_Msk                (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/)          /*!< TPI SPPR: TXMODE Mask */\n\n/* TPI Formatter and Flush Status Register Definitions */\n#define TPI_FFSR_FtNonStop_Pos              3U                                         /*!< TPI FFSR: FtNonStop Position */\n#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */\n\n#define TPI_FFSR_TCPresent_Pos              2U                                         /*!< TPI FFSR: TCPresent Position */\n#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */\n\n#define TPI_FFSR_FtStopped_Pos              1U                                         /*!< TPI FFSR: FtStopped Position */\n#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */\n\n#define TPI_FFSR_FlInProg_Pos               0U                                         /*!< TPI FFSR: FlInProg Position */\n#define TPI_FFSR_FlInProg_Msk              (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/)        /*!< TPI FFSR: FlInProg Mask */\n\n/* TPI Formatter and Flush Control Register Definitions */\n#define TPI_FFCR_TrigIn_Pos                 8U                                         /*!< TPI FFCR: TrigIn Position */\n#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */\n\n#define TPI_FFCR_EnFCont_Pos                1U                                         /*!< TPI FFCR: EnFCont Position */\n#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */\n\n/* TPI TRIGGER Register Definitions */\n#define TPI_TRIGGER_TRIGGER_Pos             0U                                         /*!< TPI TRIGGER: TRIGGER Position */\n#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/)      /*!< TPI TRIGGER: TRIGGER Mask */\n\n/* TPI Integration ETM Data Register Definitions (FIFO0) */\n#define TPI_FIFO0_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO0: ITM_ATVALID Position */\n#define TPI_FIFO0_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos)        /*!< TPI FIFO0: ITM_ATVALID Mask */\n\n#define TPI_FIFO0_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO0: ITM_bytecount Position */\n#define TPI_FIFO0_ITM_bytecount_Msk        (0x3UL << TPI_FIFO0_ITM_bytecount_Pos)      /*!< TPI FIFO0: ITM_bytecount Mask */\n\n#define TPI_FIFO0_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO0: ETM_ATVALID Position */\n#define TPI_FIFO0_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos)        /*!< TPI FIFO0: ETM_ATVALID Mask */\n\n#define TPI_FIFO0_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO0: ETM_bytecount Position */\n#define TPI_FIFO0_ETM_bytecount_Msk        (0x3UL << TPI_FIFO0_ETM_bytecount_Pos)      /*!< TPI FIFO0: ETM_bytecount Mask */\n\n#define TPI_FIFO0_ETM2_Pos                 16U                                         /*!< TPI FIFO0: ETM2 Position */\n#define TPI_FIFO0_ETM2_Msk                 (0xFFUL << TPI_FIFO0_ETM2_Pos)              /*!< TPI FIFO0: ETM2 Mask */\n\n#define TPI_FIFO0_ETM1_Pos                  8U                                         /*!< TPI FIFO0: ETM1 Position */\n#define TPI_FIFO0_ETM1_Msk                 (0xFFUL << TPI_FIFO0_ETM1_Pos)              /*!< TPI FIFO0: ETM1 Mask */\n\n#define TPI_FIFO0_ETM0_Pos                  0U                                         /*!< TPI FIFO0: ETM0 Position */\n#define TPI_FIFO0_ETM0_Msk                 (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/)          /*!< TPI FIFO0: ETM0 Mask */\n\n/* TPI ITATBCTR2 Register Definitions */\n#define TPI_ITATBCTR2_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR2: ATREADY Position */\n#define TPI_ITATBCTR2_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/)    /*!< TPI ITATBCTR2: ATREADY Mask */\n\n/* TPI Integration ITM Data Register Definitions (FIFO1) */\n#define TPI_FIFO1_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO1: ITM_ATVALID Position */\n#define TPI_FIFO1_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos)        /*!< TPI FIFO1: ITM_ATVALID Mask */\n\n#define TPI_FIFO1_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO1: ITM_bytecount Position */\n#define TPI_FIFO1_ITM_bytecount_Msk        (0x3UL << TPI_FIFO1_ITM_bytecount_Pos)      /*!< TPI FIFO1: ITM_bytecount Mask */\n\n#define TPI_FIFO1_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO1: ETM_ATVALID Position */\n#define TPI_FIFO1_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos)        /*!< TPI FIFO1: ETM_ATVALID Mask */\n\n#define TPI_FIFO1_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO1: ETM_bytecount Position */\n#define TPI_FIFO1_ETM_bytecount_Msk        (0x3UL << TPI_FIFO1_ETM_bytecount_Pos)      /*!< TPI FIFO1: ETM_bytecount Mask */\n\n#define TPI_FIFO1_ITM2_Pos                 16U                                         /*!< TPI FIFO1: ITM2 Position */\n#define TPI_FIFO1_ITM2_Msk                 (0xFFUL << TPI_FIFO1_ITM2_Pos)              /*!< TPI FIFO1: ITM2 Mask */\n\n#define TPI_FIFO1_ITM1_Pos                  8U                                         /*!< TPI FIFO1: ITM1 Position */\n#define TPI_FIFO1_ITM1_Msk                 (0xFFUL << TPI_FIFO1_ITM1_Pos)              /*!< TPI FIFO1: ITM1 Mask */\n\n#define TPI_FIFO1_ITM0_Pos                  0U                                         /*!< TPI FIFO1: ITM0 Position */\n#define TPI_FIFO1_ITM0_Msk                 (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/)          /*!< TPI FIFO1: ITM0 Mask */\n\n/* TPI ITATBCTR0 Register Definitions */\n#define TPI_ITATBCTR0_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR0: ATREADY Position */\n#define TPI_ITATBCTR0_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/)    /*!< TPI ITATBCTR0: ATREADY Mask */\n\n/* TPI Integration Mode Control Register Definitions */\n#define TPI_ITCTRL_Mode_Pos                 0U                                         /*!< TPI ITCTRL: Mode Position */\n#define TPI_ITCTRL_Mode_Msk                (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/)          /*!< TPI ITCTRL: Mode Mask */\n\n/* TPI DEVID Register Definitions */\n#define TPI_DEVID_NRZVALID_Pos             11U                                         /*!< TPI DEVID: NRZVALID Position */\n#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */\n\n#define TPI_DEVID_MANCVALID_Pos            10U                                         /*!< TPI DEVID: MANCVALID Position */\n#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */\n\n#define TPI_DEVID_PTINVALID_Pos             9U                                         /*!< TPI DEVID: PTINVALID Position */\n#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */\n\n#define TPI_DEVID_MinBufSz_Pos              6U                                         /*!< TPI DEVID: MinBufSz Position */\n#define TPI_DEVID_MinBufSz_Msk             (0x7UL << TPI_DEVID_MinBufSz_Pos)           /*!< TPI DEVID: MinBufSz Mask */\n\n#define TPI_DEVID_AsynClkIn_Pos             5U                                         /*!< TPI DEVID: AsynClkIn Position */\n#define TPI_DEVID_AsynClkIn_Msk            (0x1UL << TPI_DEVID_AsynClkIn_Pos)          /*!< TPI DEVID: AsynClkIn Mask */\n\n#define TPI_DEVID_NrTraceInput_Pos          0U                                         /*!< TPI DEVID: NrTraceInput Position */\n#define TPI_DEVID_NrTraceInput_Msk         (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/)  /*!< TPI DEVID: NrTraceInput Mask */\n\n/* TPI DEVTYPE Register Definitions */\n#define TPI_DEVTYPE_MajorType_Pos           4U                                         /*!< TPI DEVTYPE: MajorType Position */\n#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */\n\n#define TPI_DEVTYPE_SubType_Pos             0U                                         /*!< TPI DEVTYPE: SubType Position */\n#define TPI_DEVTYPE_SubType_Msk            (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/)      /*!< TPI DEVTYPE: SubType Mask */\n\n/*@}*/ /* end of group CMSIS_TPI */\n\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region Number Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  MPU Region Limit Address Register */\n        uint32_t RESERVED0[7U];\n  __IOM uint32_t MAIR0;                  /*!< Offset: 0x030 (R/W)  MPU Memory Attribute Indirection Register 0 */\n  __IOM uint32_t MAIR1;                  /*!< Offset: 0x034 (R/W)  MPU Memory Attribute Indirection Register 1 */\n} MPU_Type;\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_BASE_Pos                   5U                                            /*!< MPU RBAR: BASE Position */\n#define MPU_RBAR_BASE_Msk                  (0x7FFFFFFUL << MPU_RBAR_BASE_Pos)             /*!< MPU RBAR: BASE Mask */\n\n#define MPU_RBAR_SH_Pos                     3U                                            /*!< MPU RBAR: SH Position */\n#define MPU_RBAR_SH_Msk                    (0x3UL << MPU_RBAR_SH_Pos)                     /*!< MPU RBAR: SH Mask */\n\n#define MPU_RBAR_AP_Pos                     1U                                            /*!< MPU RBAR: AP Position */\n#define MPU_RBAR_AP_Msk                    (0x3UL << MPU_RBAR_AP_Pos)                     /*!< MPU RBAR: AP Mask */\n\n#define MPU_RBAR_XN_Pos                     0U                                            /*!< MPU RBAR: XN Position */\n#define MPU_RBAR_XN_Msk                    (01UL /*<< MPU_RBAR_XN_Pos*/)                  /*!< MPU RBAR: XN Mask */\n\n/* MPU Region Limit Address Register Definitions */\n#define MPU_RLAR_LIMIT_Pos                  5U                                            /*!< MPU RLAR: LIMIT Position */\n#define MPU_RLAR_LIMIT_Msk                 (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos)            /*!< MPU RLAR: LIMIT Mask */\n\n#define MPU_RLAR_AttrIndx_Pos               1U                                            /*!< MPU RLAR: AttrIndx Position */\n#define MPU_RLAR_AttrIndx_Msk              (0x7UL << MPU_RLAR_AttrIndx_Pos)               /*!< MPU RLAR: AttrIndx Mask */\n\n#define MPU_RLAR_EN_Pos                     0U                                            /*!< MPU RLAR: EN Position */\n#define MPU_RLAR_EN_Msk                    (1UL /*<< MPU_RLAR_EN_Pos*/)                   /*!< MPU RLAR: EN Mask */\n\n/* MPU Memory Attribute Indirection Register 0 Definitions */\n#define MPU_MAIR0_Attr3_Pos                24U                                            /*!< MPU MAIR0: Attr3 Position */\n#define MPU_MAIR0_Attr3_Msk                (0xFFUL << MPU_MAIR0_Attr3_Pos)                /*!< MPU MAIR0: Attr3 Mask */\n\n#define MPU_MAIR0_Attr2_Pos                16U                                            /*!< MPU MAIR0: Attr2 Position */\n#define MPU_MAIR0_Attr2_Msk                (0xFFUL << MPU_MAIR0_Attr2_Pos)                /*!< MPU MAIR0: Attr2 Mask */\n\n#define MPU_MAIR0_Attr1_Pos                 8U                                            /*!< MPU MAIR0: Attr1 Position */\n#define MPU_MAIR0_Attr1_Msk                (0xFFUL << MPU_MAIR0_Attr1_Pos)                /*!< MPU MAIR0: Attr1 Mask */\n\n#define MPU_MAIR0_Attr0_Pos                 0U                                            /*!< MPU MAIR0: Attr0 Position */\n#define MPU_MAIR0_Attr0_Msk                (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/)            /*!< MPU MAIR0: Attr0 Mask */\n\n/* MPU Memory Attribute Indirection Register 1 Definitions */\n#define MPU_MAIR1_Attr7_Pos                24U                                            /*!< MPU MAIR1: Attr7 Position */\n#define MPU_MAIR1_Attr7_Msk                (0xFFUL << MPU_MAIR1_Attr7_Pos)                /*!< MPU MAIR1: Attr7 Mask */\n\n#define MPU_MAIR1_Attr6_Pos                16U                                            /*!< MPU MAIR1: Attr6 Position */\n#define MPU_MAIR1_Attr6_Msk                (0xFFUL << MPU_MAIR1_Attr6_Pos)                /*!< MPU MAIR1: Attr6 Mask */\n\n#define MPU_MAIR1_Attr5_Pos                 8U                                            /*!< MPU MAIR1: Attr5 Position */\n#define MPU_MAIR1_Attr5_Msk                (0xFFUL << MPU_MAIR1_Attr5_Pos)                /*!< MPU MAIR1: Attr5 Mask */\n\n#define MPU_MAIR1_Attr4_Pos                 0U                                            /*!< MPU MAIR1: Attr4 Position */\n#define MPU_MAIR1_Attr4_Msk                (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/)            /*!< MPU MAIR1: Attr4 Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif\n\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SAU     Security Attribution Unit (SAU)\n  \\brief    Type definitions for the Security Attribution Unit (SAU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Security Attribution Unit (SAU).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SAU Control Register */\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x004 (R/ )  SAU Type Register */\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  SAU Region Number Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  SAU Region Base Address Register */\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  SAU Region Limit Address Register */\n#endif\n} SAU_Type;\n\n/* SAU Control Register Definitions */\n#define SAU_CTRL_ALLNS_Pos                  1U                                            /*!< SAU CTRL: ALLNS Position */\n#define SAU_CTRL_ALLNS_Msk                 (1UL << SAU_CTRL_ALLNS_Pos)                    /*!< SAU CTRL: ALLNS Mask */\n\n#define SAU_CTRL_ENABLE_Pos                 0U                                            /*!< SAU CTRL: ENABLE Position */\n#define SAU_CTRL_ENABLE_Msk                (1UL /*<< SAU_CTRL_ENABLE_Pos*/)               /*!< SAU CTRL: ENABLE Mask */\n\n/* SAU Type Register Definitions */\n#define SAU_TYPE_SREGION_Pos                0U                                            /*!< SAU TYPE: SREGION Position */\n#define SAU_TYPE_SREGION_Msk               (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/)           /*!< SAU TYPE: SREGION Mask */\n\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n/* SAU Region Number Register Definitions */\n#define SAU_RNR_REGION_Pos                  0U                                            /*!< SAU RNR: REGION Position */\n#define SAU_RNR_REGION_Msk                 (0xFFUL /*<< SAU_RNR_REGION_Pos*/)             /*!< SAU RNR: REGION Mask */\n\n/* SAU Region Base Address Register Definitions */\n#define SAU_RBAR_BADDR_Pos                  5U                                            /*!< SAU RBAR: BADDR Position */\n#define SAU_RBAR_BADDR_Msk                 (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos)            /*!< SAU RBAR: BADDR Mask */\n\n/* SAU Region Limit Address Register Definitions */\n#define SAU_RLAR_LADDR_Pos                  5U                                            /*!< SAU RLAR: LADDR Position */\n#define SAU_RLAR_LADDR_Msk                 (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos)            /*!< SAU RLAR: LADDR Mask */\n\n#define SAU_RLAR_NSC_Pos                    1U                                            /*!< SAU RLAR: NSC Position */\n#define SAU_RLAR_NSC_Msk                   (1UL << SAU_RLAR_NSC_Pos)                      /*!< SAU RLAR: NSC Mask */\n\n#define SAU_RLAR_ENABLE_Pos                 0U                                            /*!< SAU RLAR: ENABLE Position */\n#define SAU_RLAR_ENABLE_Msk                (1UL /*<< SAU_RLAR_ENABLE_Pos*/)               /*!< SAU RLAR: ENABLE Mask */\n\n#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */\n\n/*@} end of group CMSIS_SAU */\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Type definitions for the Core Debug Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Core Debug Register (CoreDebug).\n */\ntypedef struct\n{\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\n        uint32_t RESERVED4[1U];\n  __IOM uint32_t DAUTHCTRL;              /*!< Offset: 0x014 (R/W)  Debug Authentication Control Register */\n  __IOM uint32_t DSCSR;                  /*!< Offset: 0x018 (R/W)  Debug Security Control and Status Register */\n} CoreDebug_Type;\n\n/* Debug Halting Control and Status Register Definitions */\n#define CoreDebug_DHCSR_DBGKEY_Pos         16U                                            /*!< CoreDebug DHCSR: DBGKEY Position */\n#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< CoreDebug DHCSR: DBGKEY Mask */\n\n#define CoreDebug_DHCSR_S_RESTART_ST_Pos   26U                                            /*!< CoreDebug DHCSR: S_RESTART_ST Position */\n#define CoreDebug_DHCSR_S_RESTART_ST_Msk   (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos)      /*!< CoreDebug DHCSR: S_RESTART_ST Mask */\n\n#define CoreDebug_DHCSR_S_RESET_ST_Pos     25U                                            /*!< CoreDebug DHCSR: S_RESET_ST Position */\n#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< CoreDebug DHCSR: S_RESET_ST Mask */\n\n#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24U                                            /*!< CoreDebug DHCSR: S_RETIRE_ST Position */\n#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */\n\n#define CoreDebug_DHCSR_S_LOCKUP_Pos       19U                                            /*!< CoreDebug DHCSR: S_LOCKUP Position */\n#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< CoreDebug DHCSR: S_LOCKUP Mask */\n\n#define CoreDebug_DHCSR_S_SLEEP_Pos        18U                                            /*!< CoreDebug DHCSR: S_SLEEP Position */\n#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< CoreDebug DHCSR: S_SLEEP Mask */\n\n#define CoreDebug_DHCSR_S_HALT_Pos         17U                                            /*!< CoreDebug DHCSR: S_HALT Position */\n#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< CoreDebug DHCSR: S_HALT Mask */\n\n#define CoreDebug_DHCSR_S_REGRDY_Pos       16U                                            /*!< CoreDebug DHCSR: S_REGRDY Position */\n#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< CoreDebug DHCSR: S_REGRDY Mask */\n\n#define CoreDebug_DHCSR_C_MASKINTS_Pos      3U                                            /*!< CoreDebug DHCSR: C_MASKINTS Position */\n#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< CoreDebug DHCSR: C_MASKINTS Mask */\n\n#define CoreDebug_DHCSR_C_STEP_Pos          2U                                            /*!< CoreDebug DHCSR: C_STEP Position */\n#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< CoreDebug DHCSR: C_STEP Mask */\n\n#define CoreDebug_DHCSR_C_HALT_Pos          1U                                            /*!< CoreDebug DHCSR: C_HALT Position */\n#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< CoreDebug DHCSR: C_HALT Mask */\n\n#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0U                                            /*!< CoreDebug DHCSR: C_DEBUGEN Position */\n#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/)     /*!< CoreDebug DHCSR: C_DEBUGEN Mask */\n\n/* Debug Core Register Selector Register Definitions */\n#define CoreDebug_DCRSR_REGWnR_Pos         16U                                            /*!< CoreDebug DCRSR: REGWnR Position */\n#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< CoreDebug DCRSR: REGWnR Mask */\n\n#define CoreDebug_DCRSR_REGSEL_Pos          0U                                            /*!< CoreDebug DCRSR: REGSEL Position */\n#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/)     /*!< CoreDebug DCRSR: REGSEL Mask */\n\n/* Debug Exception and Monitor Control Register */\n#define CoreDebug_DEMCR_DWTENA_Pos         24U                                            /*!< CoreDebug DEMCR: DWTENA Position */\n#define CoreDebug_DEMCR_DWTENA_Msk         (1UL << CoreDebug_DEMCR_DWTENA_Pos)            /*!< CoreDebug DEMCR: DWTENA Mask */\n\n#define CoreDebug_DEMCR_VC_HARDERR_Pos     10U                                            /*!< CoreDebug DEMCR: VC_HARDERR Position */\n#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< CoreDebug DEMCR: VC_HARDERR Mask */\n\n#define CoreDebug_DEMCR_VC_CORERESET_Pos    0U                                            /*!< CoreDebug DEMCR: VC_CORERESET Position */\n#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/)  /*!< CoreDebug DEMCR: VC_CORERESET Mask */\n\n/* Debug Authentication Control Register Definitions */\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos  3U                                            /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos)    /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */\n\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos  2U                                            /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos)    /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */\n\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos   1U                                            /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk  (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos)     /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */\n\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos   0U                                            /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk  (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */\n\n/* Debug Security Control and Status Register Definitions */\n#define CoreDebug_DSCSR_CDS_Pos            16U                                            /*!< CoreDebug DSCSR: CDS Position */\n#define CoreDebug_DSCSR_CDS_Msk            (1UL << CoreDebug_DSCSR_CDS_Pos)               /*!< CoreDebug DSCSR: CDS Mask */\n\n#define CoreDebug_DSCSR_SBRSEL_Pos          1U                                            /*!< CoreDebug DSCSR: SBRSEL Position */\n#define CoreDebug_DSCSR_SBRSEL_Msk         (1UL << CoreDebug_DSCSR_SBRSEL_Pos)            /*!< CoreDebug DSCSR: SBRSEL Mask */\n\n#define CoreDebug_DSCSR_SBRSELEN_Pos        0U                                            /*!< CoreDebug DSCSR: SBRSELEN Position */\n#define CoreDebug_DSCSR_SBRSELEN_Msk       (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/)      /*!< CoreDebug DSCSR: SBRSELEN Mask */\n\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n  #define SCS_BASE            (0xE000E000UL)                             /*!< System Control Space Base Address */\n  #define DWT_BASE            (0xE0001000UL)                             /*!< DWT Base Address */\n  #define TPI_BASE            (0xE0040000UL)                             /*!< TPI Base Address */\n  #define CoreDebug_BASE      (0xE000EDF0UL)                             /*!< Core Debug Base Address */\n  #define SysTick_BASE        (SCS_BASE +  0x0010UL)                     /*!< SysTick Base Address */\n  #define NVIC_BASE           (SCS_BASE +  0x0100UL)                     /*!< NVIC Base Address */\n  #define SCB_BASE            (SCS_BASE +  0x0D00UL)                     /*!< System Control Block Base Address */\n\n\n  #define SCB                 ((SCB_Type       *)     SCB_BASE         ) /*!< SCB configuration struct */\n  #define SysTick             ((SysTick_Type   *)     SysTick_BASE     ) /*!< SysTick configuration struct */\n  #define NVIC                ((NVIC_Type      *)     NVIC_BASE        ) /*!< NVIC configuration struct */\n  #define DWT                 ((DWT_Type       *)     DWT_BASE         ) /*!< DWT configuration struct */\n  #define TPI                 ((TPI_Type       *)     TPI_BASE         ) /*!< TPI configuration struct */\n  #define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE   ) /*!< Core Debug configuration struct */\n\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n    #define MPU_BASE          (SCS_BASE +  0x0D90UL)                     /*!< Memory Protection Unit */\n    #define MPU               ((MPU_Type       *)     MPU_BASE         ) /*!< Memory Protection Unit */\n  #endif\n\n  #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n    #define SAU_BASE          (SCS_BASE +  0x0DD0UL)                     /*!< Security Attribution Unit */\n    #define SAU               ((SAU_Type       *)     SAU_BASE         ) /*!< Security Attribution Unit */\n  #endif\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n  #define SCS_BASE_NS         (0xE002E000UL)                             /*!< System Control Space Base Address (non-secure address space) */\n  #define CoreDebug_BASE_NS   (0xE002EDF0UL)                             /*!< Core Debug Base Address           (non-secure address space) */\n  #define SysTick_BASE_NS     (SCS_BASE_NS +  0x0010UL)                  /*!< SysTick Base Address              (non-secure address space) */\n  #define NVIC_BASE_NS        (SCS_BASE_NS +  0x0100UL)                  /*!< NVIC Base Address                 (non-secure address space) */\n  #define SCB_BASE_NS         (SCS_BASE_NS +  0x0D00UL)                  /*!< System Control Block Base Address (non-secure address space) */\n\n  #define SCB_NS              ((SCB_Type       *)     SCB_BASE_NS      ) /*!< SCB configuration struct          (non-secure address space) */\n  #define SysTick_NS          ((SysTick_Type   *)     SysTick_BASE_NS  ) /*!< SysTick configuration struct      (non-secure address space) */\n  #define NVIC_NS             ((NVIC_Type      *)     NVIC_BASE_NS     ) /*!< NVIC configuration struct         (non-secure address space) */\n  #define CoreDebug_NS        ((CoreDebug_Type *)     CoreDebug_BASE_NS) /*!< Core Debug configuration struct   (non-secure address space) */\n\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n    #define MPU_BASE_NS       (SCS_BASE_NS +  0x0D90UL)                  /*!< Memory Protection Unit            (non-secure address space) */\n    #define MPU_NS            ((MPU_Type       *)     MPU_BASE_NS      ) /*!< Memory Protection Unit            (non-secure address space) */\n  #endif\n\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifndef CMSIS_NVIC_VIRTUAL\n/*#define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping   not available for Cortex-M23 */\n/*#define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping   not available for Cortex-M23 */\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n  #define NVIC_GetActive              __NVIC_GetActive\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifndef CMSIS_VECTAB_VIRTUAL\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n/* Interrupt Priorities are WORD accessible only under ARMv6M                   */\n/* The following MACROS handle generation of the register offset and byte masks */\n#define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL)\n#define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      )\n#define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      )\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt\n  \\details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   Get Interrupt Target State\n  \\details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n  \\return             1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Target State\n  \\details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n                      1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |=  ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)));\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Clear Interrupt Target State\n  \\details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n                      1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)));\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IPR[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IPR[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n  else\n  {\n    SCB->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return((uint32_t)(((SCB->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n           If VTOR is not present address 0 must be mapped to SRAM.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n#else\n  uint32_t *vectors = (uint32_t *)0x0U;\n#endif\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n#if defined (__VTOR_PRESENT) && (__VTOR_PRESENT == 1U)\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n#else\n  uint32_t *vectors = (uint32_t *)0x0U;\n#endif\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__STATIC_INLINE void NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                 SCB_AIRCR_SYSRESETREQ_Msk);\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   Enable Interrupt (non-secure)\n  \\details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status (non-secure)\n  \\details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt (non-secure)\n  \\details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt (non-secure)\n  \\details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt (non-secure)\n  \\details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt (non-secure)\n  \\details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt (non-secure)\n  \\details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority (non-secure)\n  \\details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every non-secure processor exception.\n */\n__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->IPR[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC_NS->IPR[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n  else\n  {\n    SCB_NS->SHPR[_SHP_IDX(IRQn)] = ((uint32_t)(SCB_NS->SHPR[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority (non-secure)\n  \\details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->IPR[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return((uint32_t)(((SCB_NS->SHPR[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n#endif /*  defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n    return 0U;           /* No FPU */\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##########################   SAU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SAUFunctions SAU Functions\n  \\brief    Functions that configure the SAU.\n  @{\n */\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n\n/**\n  \\brief   Enable SAU\n  \\details Enables the Security Attribution Unit (SAU).\n */\n__STATIC_INLINE void TZ_SAU_Enable(void)\n{\n    SAU->CTRL |=  (SAU_CTRL_ENABLE_Msk);\n}\n\n\n\n/**\n  \\brief   Disable SAU\n  \\details Disables the Security Attribution Unit (SAU).\n */\n__STATIC_INLINE void TZ_SAU_Disable(void)\n{\n    SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk);\n}\n\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n/*@} end of CMSIS_Core_SAUFunctions */\n\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   System Tick Configuration (non-secure)\n  \\details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>TZ_SysTick_Config_NS</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n\n */\n__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                         /* Reload value impossible */\n  }\n\n  SysTick_NS->LOAD  = (uint32_t)(ticks - 1UL);                            /* set reload register */\n  TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick_NS->VAL   = 0UL;                                                /* Load the SysTick Counter Value */\n  SysTick_NS->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                      SysTick_CTRL_TICKINT_Msk   |\n                      SysTick_CTRL_ENABLE_Msk;                            /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                           /* Function successful */\n}\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM23_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_cm3.h",
    "content": "\n/**************************************************************************//**\n * @file     core_cm3.h\n * @brief    CMSIS Cortex-M3 Core Peripheral Access Layer Header File\n * @version  V5.0.1\n * @date     30. January 2017\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_CM3_H_GENERIC\n#define __CORE_CM3_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex_M3\n  @{\n */\n\n/*  CMSIS CM3 definitions */\n#define __CM3_CMSIS_VERSION_MAIN  ( 5U)                                  /*!< [31:16] CMSIS HAL main version */\n#define __CM3_CMSIS_VERSION_SUB   ( 0U)                                  /*!< [15:0]  CMSIS HAL sub version */\n#define __CM3_CMSIS_VERSION       ((__CM3_CMSIS_VERSION_MAIN << 16U) | \\\n                                    __CM3_CMSIS_VERSION_SUB           )  /*!< CMSIS HAL version number */\n\n#define __CORTEX_M                (3U)                                   /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    This core does not support an FPU at all\n*/\n#define __FPU_USED       0U\n\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM3_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_CM3_H_DEPENDANT\n#define __CORE_CM3_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __CM3_REV\n    #define __CM3_REV               0x0200U\n    #warning \"__CM3_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          3U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group Cortex_M3 */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core Debug Register\n  - Core MPU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:27;              /*!< bit:  0..26  Reserved */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n#define APSR_Q_Pos                         27U                                            /*!< APSR: Q Position */\n#define APSR_Q_Msk                         (1UL << APSR_Q_Pos)                            /*!< APSR: Q Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:1;               /*!< bit:      9  Reserved */\n    uint32_t ICI_IT_1:6;                 /*!< bit: 10..15  ICI/IT part 1 */\n    uint32_t _reserved1:8;               /*!< bit: 16..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit */\n    uint32_t ICI_IT_2:2;                 /*!< bit: 25..26  ICI/IT part 2 */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_Q_Pos                         27U                                            /*!< xPSR: Q Position */\n#define xPSR_Q_Msk                         (1UL << xPSR_Q_Pos)                            /*!< xPSR: Q Mask */\n\n#define xPSR_ICI_IT_2_Pos                  25U                                            /*!< xPSR: ICI/IT part 2 Position */\n#define xPSR_ICI_IT_2_Msk                  (3UL << xPSR_ICI_IT_2_Pos)                     /*!< xPSR: ICI/IT part 2 Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_ICI_IT_1_Pos                  10U                                            /*!< xPSR: ICI/IT part 1 Position */\n#define xPSR_ICI_IT_1_Msk                  (0x3FUL << xPSR_ICI_IT_1_Pos)                  /*!< xPSR: ICI/IT part 1 Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */\n    uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[8U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[24U];\n  __IOM uint32_t ICER[8U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[24U];\n  __IOM uint32_t ISPR[8U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[24U];\n  __IOM uint32_t ICPR[8U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[24U];\n  __IOM uint32_t IABR[8U];               /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */\n        uint32_t RESERVED4[56U];\n  __IOM uint8_t  IP[240U];               /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */\n        uint32_t RESERVED5[644U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */\n}  NVIC_Type;\n\n/* Software Triggered Interrupt Register Definitions */\n#define NVIC_STIR_INTID_Pos                 0U                                         /*!< STIR: INTLINESNUM Position */\n#define NVIC_STIR_INTID_Msk                (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/)        /*!< STIR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n  __IOM uint8_t  SHP[12U];               /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11, 12-15) */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n  __IOM uint32_t CFSR;                   /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register */\n  __IOM uint32_t HFSR;                   /*!< Offset: 0x02C (R/W)  HardFault Status Register */\n  __IOM uint32_t DFSR;                   /*!< Offset: 0x030 (R/W)  Debug Fault Status Register */\n  __IOM uint32_t MMFAR;                  /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register */\n  __IOM uint32_t BFAR;                   /*!< Offset: 0x038 (R/W)  BusFault Address Register */\n  __IOM uint32_t AFSR;                   /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register */\n  __IM  uint32_t PFR[2U];                /*!< Offset: 0x040 (R/ )  Processor Feature Register */\n  __IM  uint32_t DFR;                    /*!< Offset: 0x048 (R/ )  Debug Feature Register */\n  __IM  uint32_t ADR;                    /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register */\n  __IM  uint32_t MMFR[4U];               /*!< Offset: 0x050 (R/ )  Memory Model Feature Register */\n  __IM  uint32_t ISAR[5U];               /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register */\n        uint32_t RESERVED0[5U];\n  __IOM uint32_t CPACR;                  /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_NMIPENDSET_Pos            31U                                            /*!< SCB ICSR: NMIPENDSET Position */\n#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_RETTOBASE_Pos             11U                                            /*!< SCB ICSR: RETTOBASE Position */\n#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n/* SCB Vector Table Offset Register Definitions */\n#if defined (__CM3_REV) && (__CM3_REV < 0x0201U)                   /* core r2p1 */\n#define SCB_VTOR_TBLBASE_Pos               29U                                            /*!< SCB VTOR: TBLBASE Position */\n#define SCB_VTOR_TBLBASE_Msk               (1UL << SCB_VTOR_TBLBASE_Pos)                  /*!< SCB VTOR: TBLBASE Mask */\n\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos)            /*!< SCB VTOR: TBLOFF Mask */\n#else\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */\n#endif\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_PRIGROUP_Pos              8U                                            /*!< SCB AIRCR: PRIGROUP Position */\n#define SCB_AIRCR_PRIGROUP_Msk             (7UL << SCB_AIRCR_PRIGROUP_Pos)                /*!< SCB AIRCR: PRIGROUP Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n#define SCB_AIRCR_VECTRESET_Pos             0U                                            /*!< SCB AIRCR: VECTRESET Position */\n#define SCB_AIRCR_VECTRESET_Msk            (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/)           /*!< SCB AIRCR: VECTRESET Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_STKALIGN_Pos                9U                                            /*!< SCB CCR: STKALIGN Position */\n#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */\n\n#define SCB_CCR_BFHFNMIGN_Pos               8U                                            /*!< SCB CCR: BFHFNMIGN Position */\n#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */\n\n#define SCB_CCR_DIV_0_TRP_Pos               4U                                            /*!< SCB CCR: DIV_0_TRP Position */\n#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n#define SCB_CCR_USERSETMPEND_Pos            1U                                            /*!< SCB CCR: USERSETMPEND Position */\n#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */\n\n#define SCB_CCR_NONBASETHRDENA_Pos          0U                                            /*!< SCB CCR: NONBASETHRDENA Position */\n#define SCB_CCR_NONBASETHRDENA_Msk         (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/)        /*!< SCB CCR: NONBASETHRDENA Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_USGFAULTENA_Pos          18U                                            /*!< SCB SHCSR: USGFAULTENA Position */\n#define SCB_SHCSR_USGFAULTENA_Msk          (1UL << SCB_SHCSR_USGFAULTENA_Pos)             /*!< SCB SHCSR: USGFAULTENA Mask */\n\n#define SCB_SHCSR_BUSFAULTENA_Pos          17U                                            /*!< SCB SHCSR: BUSFAULTENA Position */\n#define SCB_SHCSR_BUSFAULTENA_Msk          (1UL << SCB_SHCSR_BUSFAULTENA_Pos)             /*!< SCB SHCSR: BUSFAULTENA Mask */\n\n#define SCB_SHCSR_MEMFAULTENA_Pos          16U                                            /*!< SCB SHCSR: MEMFAULTENA Position */\n#define SCB_SHCSR_MEMFAULTENA_Msk          (1UL << SCB_SHCSR_MEMFAULTENA_Pos)             /*!< SCB SHCSR: MEMFAULTENA Mask */\n\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n#define SCB_SHCSR_BUSFAULTPENDED_Pos       14U                                            /*!< SCB SHCSR: BUSFAULTPENDED Position */\n#define SCB_SHCSR_BUSFAULTPENDED_Msk       (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos)          /*!< SCB SHCSR: BUSFAULTPENDED Mask */\n\n#define SCB_SHCSR_MEMFAULTPENDED_Pos       13U                                            /*!< SCB SHCSR: MEMFAULTPENDED Position */\n#define SCB_SHCSR_MEMFAULTPENDED_Msk       (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos)          /*!< SCB SHCSR: MEMFAULTPENDED Mask */\n\n#define SCB_SHCSR_USGFAULTPENDED_Pos       12U                                            /*!< SCB SHCSR: USGFAULTPENDED Position */\n#define SCB_SHCSR_USGFAULTPENDED_Msk       (1UL << SCB_SHCSR_USGFAULTPENDED_Pos)          /*!< SCB SHCSR: USGFAULTPENDED Mask */\n\n#define SCB_SHCSR_SYSTICKACT_Pos           11U                                            /*!< SCB SHCSR: SYSTICKACT Position */\n#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */\n\n#define SCB_SHCSR_PENDSVACT_Pos            10U                                            /*!< SCB SHCSR: PENDSVACT Position */\n#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */\n\n#define SCB_SHCSR_MONITORACT_Pos            8U                                            /*!< SCB SHCSR: MONITORACT Position */\n#define SCB_SHCSR_MONITORACT_Msk           (1UL << SCB_SHCSR_MONITORACT_Pos)              /*!< SCB SHCSR: MONITORACT Mask */\n\n#define SCB_SHCSR_SVCALLACT_Pos             7U                                            /*!< SCB SHCSR: SVCALLACT Position */\n#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */\n\n#define SCB_SHCSR_USGFAULTACT_Pos           3U                                            /*!< SCB SHCSR: USGFAULTACT Position */\n#define SCB_SHCSR_USGFAULTACT_Msk          (1UL << SCB_SHCSR_USGFAULTACT_Pos)             /*!< SCB SHCSR: USGFAULTACT Mask */\n\n#define SCB_SHCSR_BUSFAULTACT_Pos           1U                                            /*!< SCB SHCSR: BUSFAULTACT Position */\n#define SCB_SHCSR_BUSFAULTACT_Msk          (1UL << SCB_SHCSR_BUSFAULTACT_Pos)             /*!< SCB SHCSR: BUSFAULTACT Mask */\n\n#define SCB_SHCSR_MEMFAULTACT_Pos           0U                                            /*!< SCB SHCSR: MEMFAULTACT Position */\n#define SCB_SHCSR_MEMFAULTACT_Msk          (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/)         /*!< SCB SHCSR: MEMFAULTACT Mask */\n\n/* SCB Configurable Fault Status Register Definitions */\n#define SCB_CFSR_USGFAULTSR_Pos            16U                                            /*!< SCB CFSR: Usage Fault Status Register Position */\n#define SCB_CFSR_USGFAULTSR_Msk            (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos)          /*!< SCB CFSR: Usage Fault Status Register Mask */\n\n#define SCB_CFSR_BUSFAULTSR_Pos             8U                                            /*!< SCB CFSR: Bus Fault Status Register Position */\n#define SCB_CFSR_BUSFAULTSR_Msk            (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos)            /*!< SCB CFSR: Bus Fault Status Register Mask */\n\n#define SCB_CFSR_MEMFAULTSR_Pos             0U                                            /*!< SCB CFSR: Memory Manage Fault Status Register Position */\n#define SCB_CFSR_MEMFAULTSR_Msk            (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/)        /*!< SCB CFSR: Memory Manage Fault Status Register Mask */\n\n/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_MMARVALID_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 7U)               /*!< SCB CFSR (MMFSR): MMARVALID Position */\n#define SCB_CFSR_MMARVALID_Msk             (1UL << SCB_CFSR_MMARVALID_Pos)                /*!< SCB CFSR (MMFSR): MMARVALID Mask */\n\n#define SCB_CFSR_MSTKERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 4U)               /*!< SCB CFSR (MMFSR): MSTKERR Position */\n#define SCB_CFSR_MSTKERR_Msk               (1UL << SCB_CFSR_MSTKERR_Pos)                  /*!< SCB CFSR (MMFSR): MSTKERR Mask */\n\n#define SCB_CFSR_MUNSTKERR_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 3U)               /*!< SCB CFSR (MMFSR): MUNSTKERR Position */\n#define SCB_CFSR_MUNSTKERR_Msk             (1UL << SCB_CFSR_MUNSTKERR_Pos)                /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */\n\n#define SCB_CFSR_DACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 1U)               /*!< SCB CFSR (MMFSR): DACCVIOL Position */\n#define SCB_CFSR_DACCVIOL_Msk              (1UL << SCB_CFSR_DACCVIOL_Pos)                 /*!< SCB CFSR (MMFSR): DACCVIOL Mask */\n\n#define SCB_CFSR_IACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 0U)               /*!< SCB CFSR (MMFSR): IACCVIOL Position */\n#define SCB_CFSR_IACCVIOL_Msk              (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/)             /*!< SCB CFSR (MMFSR): IACCVIOL Mask */\n\n/* BusFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_BFARVALID_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 7U)                  /*!< SCB CFSR (BFSR): BFARVALID Position */\n#define SCB_CFSR_BFARVALID_Msk            (1UL << SCB_CFSR_BFARVALID_Pos)                 /*!< SCB CFSR (BFSR): BFARVALID Mask */\n\n#define SCB_CFSR_STKERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 4U)                  /*!< SCB CFSR (BFSR): STKERR Position */\n#define SCB_CFSR_STKERR_Msk               (1UL << SCB_CFSR_STKERR_Pos)                    /*!< SCB CFSR (BFSR): STKERR Mask */\n\n#define SCB_CFSR_UNSTKERR_Pos             (SCB_CFSR_BUSFAULTSR_Pos + 3U)                  /*!< SCB CFSR (BFSR): UNSTKERR Position */\n#define SCB_CFSR_UNSTKERR_Msk             (1UL << SCB_CFSR_UNSTKERR_Pos)                  /*!< SCB CFSR (BFSR): UNSTKERR Mask */\n\n#define SCB_CFSR_IMPRECISERR_Pos          (SCB_CFSR_BUSFAULTSR_Pos + 2U)                  /*!< SCB CFSR (BFSR): IMPRECISERR Position */\n#define SCB_CFSR_IMPRECISERR_Msk          (1UL << SCB_CFSR_IMPRECISERR_Pos)               /*!< SCB CFSR (BFSR): IMPRECISERR Mask */\n\n#define SCB_CFSR_PRECISERR_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 1U)                  /*!< SCB CFSR (BFSR): PRECISERR Position */\n#define SCB_CFSR_PRECISERR_Msk            (1UL << SCB_CFSR_PRECISERR_Pos)                 /*!< SCB CFSR (BFSR): PRECISERR Mask */\n\n#define SCB_CFSR_IBUSERR_Pos              (SCB_CFSR_BUSFAULTSR_Pos + 0U)                  /*!< SCB CFSR (BFSR): IBUSERR Position */\n#define SCB_CFSR_IBUSERR_Msk              (1UL << SCB_CFSR_IBUSERR_Pos)                   /*!< SCB CFSR (BFSR): IBUSERR Mask */\n\n/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_DIVBYZERO_Pos            (SCB_CFSR_USGFAULTSR_Pos + 9U)                  /*!< SCB CFSR (UFSR): DIVBYZERO Position */\n#define SCB_CFSR_DIVBYZERO_Msk            (1UL << SCB_CFSR_DIVBYZERO_Pos)                 /*!< SCB CFSR (UFSR): DIVBYZERO Mask */\n\n#define SCB_CFSR_UNALIGNED_Pos            (SCB_CFSR_USGFAULTSR_Pos + 8U)                  /*!< SCB CFSR (UFSR): UNALIGNED Position */\n#define SCB_CFSR_UNALIGNED_Msk            (1UL << SCB_CFSR_UNALIGNED_Pos)                 /*!< SCB CFSR (UFSR): UNALIGNED Mask */\n\n#define SCB_CFSR_NOCP_Pos                 (SCB_CFSR_USGFAULTSR_Pos + 3U)                  /*!< SCB CFSR (UFSR): NOCP Position */\n#define SCB_CFSR_NOCP_Msk                 (1UL << SCB_CFSR_NOCP_Pos)                      /*!< SCB CFSR (UFSR): NOCP Mask */\n\n#define SCB_CFSR_INVPC_Pos                (SCB_CFSR_USGFAULTSR_Pos + 2U)                  /*!< SCB CFSR (UFSR): INVPC Position */\n#define SCB_CFSR_INVPC_Msk                (1UL << SCB_CFSR_INVPC_Pos)                     /*!< SCB CFSR (UFSR): INVPC Mask */\n\n#define SCB_CFSR_INVSTATE_Pos             (SCB_CFSR_USGFAULTSR_Pos + 1U)                  /*!< SCB CFSR (UFSR): INVSTATE Position */\n#define SCB_CFSR_INVSTATE_Msk             (1UL << SCB_CFSR_INVSTATE_Pos)                  /*!< SCB CFSR (UFSR): INVSTATE Mask */\n\n#define SCB_CFSR_UNDEFINSTR_Pos           (SCB_CFSR_USGFAULTSR_Pos + 0U)                  /*!< SCB CFSR (UFSR): UNDEFINSTR Position */\n#define SCB_CFSR_UNDEFINSTR_Msk           (1UL << SCB_CFSR_UNDEFINSTR_Pos)                /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */\n\n/* SCB Hard Fault Status Register Definitions */\n#define SCB_HFSR_DEBUGEVT_Pos              31U                                            /*!< SCB HFSR: DEBUGEVT Position */\n#define SCB_HFSR_DEBUGEVT_Msk              (1UL << SCB_HFSR_DEBUGEVT_Pos)                 /*!< SCB HFSR: DEBUGEVT Mask */\n\n#define SCB_HFSR_FORCED_Pos                30U                                            /*!< SCB HFSR: FORCED Position */\n#define SCB_HFSR_FORCED_Msk                (1UL << SCB_HFSR_FORCED_Pos)                   /*!< SCB HFSR: FORCED Mask */\n\n#define SCB_HFSR_VECTTBL_Pos                1U                                            /*!< SCB HFSR: VECTTBL Position */\n#define SCB_HFSR_VECTTBL_Msk               (1UL << SCB_HFSR_VECTTBL_Pos)                  /*!< SCB HFSR: VECTTBL Mask */\n\n/* SCB Debug Fault Status Register Definitions */\n#define SCB_DFSR_EXTERNAL_Pos               4U                                            /*!< SCB DFSR: EXTERNAL Position */\n#define SCB_DFSR_EXTERNAL_Msk              (1UL << SCB_DFSR_EXTERNAL_Pos)                 /*!< SCB DFSR: EXTERNAL Mask */\n\n#define SCB_DFSR_VCATCH_Pos                 3U                                            /*!< SCB DFSR: VCATCH Position */\n#define SCB_DFSR_VCATCH_Msk                (1UL << SCB_DFSR_VCATCH_Pos)                   /*!< SCB DFSR: VCATCH Mask */\n\n#define SCB_DFSR_DWTTRAP_Pos                2U                                            /*!< SCB DFSR: DWTTRAP Position */\n#define SCB_DFSR_DWTTRAP_Msk               (1UL << SCB_DFSR_DWTTRAP_Pos)                  /*!< SCB DFSR: DWTTRAP Mask */\n\n#define SCB_DFSR_BKPT_Pos                   1U                                            /*!< SCB DFSR: BKPT Position */\n#define SCB_DFSR_BKPT_Msk                  (1UL << SCB_DFSR_BKPT_Pos)                     /*!< SCB DFSR: BKPT Mask */\n\n#define SCB_DFSR_HALTED_Pos                 0U                                            /*!< SCB DFSR: HALTED Position */\n#define SCB_DFSR_HALTED_Msk                (1UL /*<< SCB_DFSR_HALTED_Pos*/)               /*!< SCB DFSR: HALTED Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)\n  \\brief    Type definitions for the System Control and ID Register not in the SCB\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control and ID Register not in the SCB.\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IM  uint32_t ICTR;                   /*!< Offset: 0x004 (R/ )  Interrupt Controller Type Register */\n#if defined (__CM3_REV) && (__CM3_REV >= 0x200U)\n  __IOM uint32_t ACTLR;                  /*!< Offset: 0x008 (R/W)  Auxiliary Control Register */\n#else\n        uint32_t RESERVED1[1U];\n#endif\n} SCnSCB_Type;\n\n/* Interrupt Controller Type Register Definitions */\n#define SCnSCB_ICTR_INTLINESNUM_Pos         0U                                         /*!< ICTR: INTLINESNUM Position */\n#define SCnSCB_ICTR_INTLINESNUM_Msk        (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/)  /*!< ICTR: INTLINESNUM Mask */\n\n/* Auxiliary Control Register Definitions */\n\n#define SCnSCB_ACTLR_DISFOLD_Pos            2U                                         /*!< ACTLR: DISFOLD Position */\n#define SCnSCB_ACTLR_DISFOLD_Msk           (1UL << SCnSCB_ACTLR_DISFOLD_Pos)           /*!< ACTLR: DISFOLD Mask */\n\n#define SCnSCB_ACTLR_DISDEFWBUF_Pos         1U                                         /*!< ACTLR: DISDEFWBUF Position */\n#define SCnSCB_ACTLR_DISDEFWBUF_Msk        (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos)        /*!< ACTLR: DISDEFWBUF Mask */\n\n#define SCnSCB_ACTLR_DISMCYCINT_Pos         0U                                         /*!< ACTLR: DISMCYCINT Position */\n#define SCnSCB_ACTLR_DISMCYCINT_Msk        (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/)    /*!< ACTLR: DISMCYCINT Mask */\n\n/*@} end of group CMSIS_SCnotSCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_ITM     Instrumentation Trace Macrocell (ITM)\n  \\brief    Type definitions for the Instrumentation Trace Macrocell (ITM)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Instrumentation Trace Macrocell Register (ITM).\n */\ntypedef struct\n{\n  __OM  union\n  {\n    __OM  uint8_t    u8;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit */\n    __OM  uint16_t   u16;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 16-bit */\n    __OM  uint32_t   u32;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 32-bit */\n  }  PORT [32U];                         /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers */\n        uint32_t RESERVED0[864U];\n  __IOM uint32_t TER;                    /*!< Offset: 0xE00 (R/W)  ITM Trace Enable Register */\n        uint32_t RESERVED1[15U];\n  __IOM uint32_t TPR;                    /*!< Offset: 0xE40 (R/W)  ITM Trace Privilege Register */\n        uint32_t RESERVED2[15U];\n  __IOM uint32_t TCR;                    /*!< Offset: 0xE80 (R/W)  ITM Trace Control Register */\n        uint32_t RESERVED3[29U];\n  __OM  uint32_t IWR;                    /*!< Offset: 0xEF8 ( /W)  ITM Integration Write Register */\n  __IM  uint32_t IRR;                    /*!< Offset: 0xEFC (R/ )  ITM Integration Read Register */\n  __IOM uint32_t IMCR;                   /*!< Offset: 0xF00 (R/W)  ITM Integration Mode Control Register */\n        uint32_t RESERVED4[43U];\n  __OM  uint32_t LAR;                    /*!< Offset: 0xFB0 ( /W)  ITM Lock Access Register */\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R/ )  ITM Lock Status Register */\n        uint32_t RESERVED5[6U];\n  __IM  uint32_t PID4;                   /*!< Offset: 0xFD0 (R/ )  ITM Peripheral Identification Register #4 */\n  __IM  uint32_t PID5;                   /*!< Offset: 0xFD4 (R/ )  ITM Peripheral Identification Register #5 */\n  __IM  uint32_t PID6;                   /*!< Offset: 0xFD8 (R/ )  ITM Peripheral Identification Register #6 */\n  __IM  uint32_t PID7;                   /*!< Offset: 0xFDC (R/ )  ITM Peripheral Identification Register #7 */\n  __IM  uint32_t PID0;                   /*!< Offset: 0xFE0 (R/ )  ITM Peripheral Identification Register #0 */\n  __IM  uint32_t PID1;                   /*!< Offset: 0xFE4 (R/ )  ITM Peripheral Identification Register #1 */\n  __IM  uint32_t PID2;                   /*!< Offset: 0xFE8 (R/ )  ITM Peripheral Identification Register #2 */\n  __IM  uint32_t PID3;                   /*!< Offset: 0xFEC (R/ )  ITM Peripheral Identification Register #3 */\n  __IM  uint32_t CID0;                   /*!< Offset: 0xFF0 (R/ )  ITM Component  Identification Register #0 */\n  __IM  uint32_t CID1;                   /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */\n  __IM  uint32_t CID2;                   /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */\n  __IM  uint32_t CID3;                   /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */\n} ITM_Type;\n\n/* ITM Trace Privilege Register Definitions */\n#define ITM_TPR_PRIVMASK_Pos                0U                                            /*!< ITM TPR: PRIVMASK Position */\n#define ITM_TPR_PRIVMASK_Msk               (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/)            /*!< ITM TPR: PRIVMASK Mask */\n\n/* ITM Trace Control Register Definitions */\n#define ITM_TCR_BUSY_Pos                   23U                                            /*!< ITM TCR: BUSY Position */\n#define ITM_TCR_BUSY_Msk                   (1UL << ITM_TCR_BUSY_Pos)                      /*!< ITM TCR: BUSY Mask */\n\n#define ITM_TCR_TraceBusID_Pos             16U                                            /*!< ITM TCR: ATBID Position */\n#define ITM_TCR_TraceBusID_Msk             (0x7FUL << ITM_TCR_TraceBusID_Pos)             /*!< ITM TCR: ATBID Mask */\n\n#define ITM_TCR_GTSFREQ_Pos                10U                                            /*!< ITM TCR: Global timestamp frequency Position */\n#define ITM_TCR_GTSFREQ_Msk                (3UL << ITM_TCR_GTSFREQ_Pos)                   /*!< ITM TCR: Global timestamp frequency Mask */\n\n#define ITM_TCR_TSPrescale_Pos              8U                                            /*!< ITM TCR: TSPrescale Position */\n#define ITM_TCR_TSPrescale_Msk             (3UL << ITM_TCR_TSPrescale_Pos)                /*!< ITM TCR: TSPrescale Mask */\n\n#define ITM_TCR_SWOENA_Pos                  4U                                            /*!< ITM TCR: SWOENA Position */\n#define ITM_TCR_SWOENA_Msk                 (1UL << ITM_TCR_SWOENA_Pos)                    /*!< ITM TCR: SWOENA Mask */\n\n#define ITM_TCR_DWTENA_Pos                  3U                                            /*!< ITM TCR: DWTENA Position */\n#define ITM_TCR_DWTENA_Msk                 (1UL << ITM_TCR_DWTENA_Pos)                    /*!< ITM TCR: DWTENA Mask */\n\n#define ITM_TCR_SYNCENA_Pos                 2U                                            /*!< ITM TCR: SYNCENA Position */\n#define ITM_TCR_SYNCENA_Msk                (1UL << ITM_TCR_SYNCENA_Pos)                   /*!< ITM TCR: SYNCENA Mask */\n\n#define ITM_TCR_TSENA_Pos                   1U                                            /*!< ITM TCR: TSENA Position */\n#define ITM_TCR_TSENA_Msk                  (1UL << ITM_TCR_TSENA_Pos)                     /*!< ITM TCR: TSENA Mask */\n\n#define ITM_TCR_ITMENA_Pos                  0U                                            /*!< ITM TCR: ITM Enable bit Position */\n#define ITM_TCR_ITMENA_Msk                 (1UL /*<< ITM_TCR_ITMENA_Pos*/)                /*!< ITM TCR: ITM Enable bit Mask */\n\n/* ITM Integration Write Register Definitions */\n#define ITM_IWR_ATVALIDM_Pos                0U                                            /*!< ITM IWR: ATVALIDM Position */\n#define ITM_IWR_ATVALIDM_Msk               (1UL /*<< ITM_IWR_ATVALIDM_Pos*/)              /*!< ITM IWR: ATVALIDM Mask */\n\n/* ITM Integration Read Register Definitions */\n#define ITM_IRR_ATREADYM_Pos                0U                                            /*!< ITM IRR: ATREADYM Position */\n#define ITM_IRR_ATREADYM_Msk               (1UL /*<< ITM_IRR_ATREADYM_Pos*/)              /*!< ITM IRR: ATREADYM Mask */\n\n/* ITM Integration Mode Control Register Definitions */\n#define ITM_IMCR_INTEGRATION_Pos            0U                                            /*!< ITM IMCR: INTEGRATION Position */\n#define ITM_IMCR_INTEGRATION_Msk           (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/)          /*!< ITM IMCR: INTEGRATION Mask */\n\n/* ITM Lock Status Register Definitions */\n#define ITM_LSR_ByteAcc_Pos                 2U                                            /*!< ITM LSR: ByteAcc Position */\n#define ITM_LSR_ByteAcc_Msk                (1UL << ITM_LSR_ByteAcc_Pos)                   /*!< ITM LSR: ByteAcc Mask */\n\n#define ITM_LSR_Access_Pos                  1U                                            /*!< ITM LSR: Access Position */\n#define ITM_LSR_Access_Msk                 (1UL << ITM_LSR_Access_Pos)                    /*!< ITM LSR: Access Mask */\n\n#define ITM_LSR_Present_Pos                 0U                                            /*!< ITM LSR: Present Position */\n#define ITM_LSR_Present_Msk                (1UL /*<< ITM_LSR_Present_Pos*/)               /*!< ITM LSR: Present Mask */\n\n/*@}*/ /* end of group CMSIS_ITM */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)\n  \\brief    Type definitions for the Data Watchpoint and Trace (DWT)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Data Watchpoint and Trace Register (DWT).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  Control Register */\n  __IOM uint32_t CYCCNT;                 /*!< Offset: 0x004 (R/W)  Cycle Count Register */\n  __IOM uint32_t CPICNT;                 /*!< Offset: 0x008 (R/W)  CPI Count Register */\n  __IOM uint32_t EXCCNT;                 /*!< Offset: 0x00C (R/W)  Exception Overhead Count Register */\n  __IOM uint32_t SLEEPCNT;               /*!< Offset: 0x010 (R/W)  Sleep Count Register */\n  __IOM uint32_t LSUCNT;                 /*!< Offset: 0x014 (R/W)  LSU Count Register */\n  __IOM uint32_t FOLDCNT;                /*!< Offset: 0x018 (R/W)  Folded-instruction Count Register */\n  __IM  uint32_t PCSR;                   /*!< Offset: 0x01C (R/ )  Program Counter Sample Register */\n  __IOM uint32_t COMP0;                  /*!< Offset: 0x020 (R/W)  Comparator Register 0 */\n  __IOM uint32_t MASK0;                  /*!< Offset: 0x024 (R/W)  Mask Register 0 */\n  __IOM uint32_t FUNCTION0;              /*!< Offset: 0x028 (R/W)  Function Register 0 */\n        uint32_t RESERVED0[1U];\n  __IOM uint32_t COMP1;                  /*!< Offset: 0x030 (R/W)  Comparator Register 1 */\n  __IOM uint32_t MASK1;                  /*!< Offset: 0x034 (R/W)  Mask Register 1 */\n  __IOM uint32_t FUNCTION1;              /*!< Offset: 0x038 (R/W)  Function Register 1 */\n        uint32_t RESERVED1[1U];\n  __IOM uint32_t COMP2;                  /*!< Offset: 0x040 (R/W)  Comparator Register 2 */\n  __IOM uint32_t MASK2;                  /*!< Offset: 0x044 (R/W)  Mask Register 2 */\n  __IOM uint32_t FUNCTION2;              /*!< Offset: 0x048 (R/W)  Function Register 2 */\n        uint32_t RESERVED2[1U];\n  __IOM uint32_t COMP3;                  /*!< Offset: 0x050 (R/W)  Comparator Register 3 */\n  __IOM uint32_t MASK3;                  /*!< Offset: 0x054 (R/W)  Mask Register 3 */\n  __IOM uint32_t FUNCTION3;              /*!< Offset: 0x058 (R/W)  Function Register 3 */\n} DWT_Type;\n\n/* DWT Control Register Definitions */\n#define DWT_CTRL_NUMCOMP_Pos               28U                                         /*!< DWT CTRL: NUMCOMP Position */\n#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */\n\n#define DWT_CTRL_NOTRCPKT_Pos              27U                                         /*!< DWT CTRL: NOTRCPKT Position */\n#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */\n\n#define DWT_CTRL_NOEXTTRIG_Pos             26U                                         /*!< DWT CTRL: NOEXTTRIG Position */\n#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */\n\n#define DWT_CTRL_NOCYCCNT_Pos              25U                                         /*!< DWT CTRL: NOCYCCNT Position */\n#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */\n\n#define DWT_CTRL_NOPRFCNT_Pos              24U                                         /*!< DWT CTRL: NOPRFCNT Position */\n#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */\n\n#define DWT_CTRL_CYCEVTENA_Pos             22U                                         /*!< DWT CTRL: CYCEVTENA Position */\n#define DWT_CTRL_CYCEVTENA_Msk             (0x1UL << DWT_CTRL_CYCEVTENA_Pos)           /*!< DWT CTRL: CYCEVTENA Mask */\n\n#define DWT_CTRL_FOLDEVTENA_Pos            21U                                         /*!< DWT CTRL: FOLDEVTENA Position */\n#define DWT_CTRL_FOLDEVTENA_Msk            (0x1UL << DWT_CTRL_FOLDEVTENA_Pos)          /*!< DWT CTRL: FOLDEVTENA Mask */\n\n#define DWT_CTRL_LSUEVTENA_Pos             20U                                         /*!< DWT CTRL: LSUEVTENA Position */\n#define DWT_CTRL_LSUEVTENA_Msk             (0x1UL << DWT_CTRL_LSUEVTENA_Pos)           /*!< DWT CTRL: LSUEVTENA Mask */\n\n#define DWT_CTRL_SLEEPEVTENA_Pos           19U                                         /*!< DWT CTRL: SLEEPEVTENA Position */\n#define DWT_CTRL_SLEEPEVTENA_Msk           (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos)         /*!< DWT CTRL: SLEEPEVTENA Mask */\n\n#define DWT_CTRL_EXCEVTENA_Pos             18U                                         /*!< DWT CTRL: EXCEVTENA Position */\n#define DWT_CTRL_EXCEVTENA_Msk             (0x1UL << DWT_CTRL_EXCEVTENA_Pos)           /*!< DWT CTRL: EXCEVTENA Mask */\n\n#define DWT_CTRL_CPIEVTENA_Pos             17U                                         /*!< DWT CTRL: CPIEVTENA Position */\n#define DWT_CTRL_CPIEVTENA_Msk             (0x1UL << DWT_CTRL_CPIEVTENA_Pos)           /*!< DWT CTRL: CPIEVTENA Mask */\n\n#define DWT_CTRL_EXCTRCENA_Pos             16U                                         /*!< DWT CTRL: EXCTRCENA Position */\n#define DWT_CTRL_EXCTRCENA_Msk             (0x1UL << DWT_CTRL_EXCTRCENA_Pos)           /*!< DWT CTRL: EXCTRCENA Mask */\n\n#define DWT_CTRL_PCSAMPLENA_Pos            12U                                         /*!< DWT CTRL: PCSAMPLENA Position */\n#define DWT_CTRL_PCSAMPLENA_Msk            (0x1UL << DWT_CTRL_PCSAMPLENA_Pos)          /*!< DWT CTRL: PCSAMPLENA Mask */\n\n#define DWT_CTRL_SYNCTAP_Pos               10U                                         /*!< DWT CTRL: SYNCTAP Position */\n#define DWT_CTRL_SYNCTAP_Msk               (0x3UL << DWT_CTRL_SYNCTAP_Pos)             /*!< DWT CTRL: SYNCTAP Mask */\n\n#define DWT_CTRL_CYCTAP_Pos                 9U                                         /*!< DWT CTRL: CYCTAP Position */\n#define DWT_CTRL_CYCTAP_Msk                (0x1UL << DWT_CTRL_CYCTAP_Pos)              /*!< DWT CTRL: CYCTAP Mask */\n\n#define DWT_CTRL_POSTINIT_Pos               5U                                         /*!< DWT CTRL: POSTINIT Position */\n#define DWT_CTRL_POSTINIT_Msk              (0xFUL << DWT_CTRL_POSTINIT_Pos)            /*!< DWT CTRL: POSTINIT Mask */\n\n#define DWT_CTRL_POSTPRESET_Pos             1U                                         /*!< DWT CTRL: POSTPRESET Position */\n#define DWT_CTRL_POSTPRESET_Msk            (0xFUL << DWT_CTRL_POSTPRESET_Pos)          /*!< DWT CTRL: POSTPRESET Mask */\n\n#define DWT_CTRL_CYCCNTENA_Pos              0U                                         /*!< DWT CTRL: CYCCNTENA Position */\n#define DWT_CTRL_CYCCNTENA_Msk             (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/)       /*!< DWT CTRL: CYCCNTENA Mask */\n\n/* DWT CPI Count Register Definitions */\n#define DWT_CPICNT_CPICNT_Pos               0U                                         /*!< DWT CPICNT: CPICNT Position */\n#define DWT_CPICNT_CPICNT_Msk              (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/)       /*!< DWT CPICNT: CPICNT Mask */\n\n/* DWT Exception Overhead Count Register Definitions */\n#define DWT_EXCCNT_EXCCNT_Pos               0U                                         /*!< DWT EXCCNT: EXCCNT Position */\n#define DWT_EXCCNT_EXCCNT_Msk              (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/)       /*!< DWT EXCCNT: EXCCNT Mask */\n\n/* DWT Sleep Count Register Definitions */\n#define DWT_SLEEPCNT_SLEEPCNT_Pos           0U                                         /*!< DWT SLEEPCNT: SLEEPCNT Position */\n#define DWT_SLEEPCNT_SLEEPCNT_Msk          (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/)   /*!< DWT SLEEPCNT: SLEEPCNT Mask */\n\n/* DWT LSU Count Register Definitions */\n#define DWT_LSUCNT_LSUCNT_Pos               0U                                         /*!< DWT LSUCNT: LSUCNT Position */\n#define DWT_LSUCNT_LSUCNT_Msk              (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/)       /*!< DWT LSUCNT: LSUCNT Mask */\n\n/* DWT Folded-instruction Count Register Definitions */\n#define DWT_FOLDCNT_FOLDCNT_Pos             0U                                         /*!< DWT FOLDCNT: FOLDCNT Position */\n#define DWT_FOLDCNT_FOLDCNT_Msk            (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/)     /*!< DWT FOLDCNT: FOLDCNT Mask */\n\n/* DWT Comparator Mask Register Definitions */\n#define DWT_MASK_MASK_Pos                   0U                                         /*!< DWT MASK: MASK Position */\n#define DWT_MASK_MASK_Msk                  (0x1FUL /*<< DWT_MASK_MASK_Pos*/)           /*!< DWT MASK: MASK Mask */\n\n/* DWT Comparator Function Register Definitions */\n#define DWT_FUNCTION_MATCHED_Pos           24U                                         /*!< DWT FUNCTION: MATCHED Position */\n#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */\n\n#define DWT_FUNCTION_DATAVADDR1_Pos        16U                                         /*!< DWT FUNCTION: DATAVADDR1 Position */\n#define DWT_FUNCTION_DATAVADDR1_Msk        (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos)      /*!< DWT FUNCTION: DATAVADDR1 Mask */\n\n#define DWT_FUNCTION_DATAVADDR0_Pos        12U                                         /*!< DWT FUNCTION: DATAVADDR0 Position */\n#define DWT_FUNCTION_DATAVADDR0_Msk        (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos)      /*!< DWT FUNCTION: DATAVADDR0 Mask */\n\n#define DWT_FUNCTION_DATAVSIZE_Pos         10U                                         /*!< DWT FUNCTION: DATAVSIZE Position */\n#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */\n\n#define DWT_FUNCTION_LNK1ENA_Pos            9U                                         /*!< DWT FUNCTION: LNK1ENA Position */\n#define DWT_FUNCTION_LNK1ENA_Msk           (0x1UL << DWT_FUNCTION_LNK1ENA_Pos)         /*!< DWT FUNCTION: LNK1ENA Mask */\n\n#define DWT_FUNCTION_DATAVMATCH_Pos         8U                                         /*!< DWT FUNCTION: DATAVMATCH Position */\n#define DWT_FUNCTION_DATAVMATCH_Msk        (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos)      /*!< DWT FUNCTION: DATAVMATCH Mask */\n\n#define DWT_FUNCTION_CYCMATCH_Pos           7U                                         /*!< DWT FUNCTION: CYCMATCH Position */\n#define DWT_FUNCTION_CYCMATCH_Msk          (0x1UL << DWT_FUNCTION_CYCMATCH_Pos)        /*!< DWT FUNCTION: CYCMATCH Mask */\n\n#define DWT_FUNCTION_EMITRANGE_Pos          5U                                         /*!< DWT FUNCTION: EMITRANGE Position */\n#define DWT_FUNCTION_EMITRANGE_Msk         (0x1UL << DWT_FUNCTION_EMITRANGE_Pos)       /*!< DWT FUNCTION: EMITRANGE Mask */\n\n#define DWT_FUNCTION_FUNCTION_Pos           0U                                         /*!< DWT FUNCTION: FUNCTION Position */\n#define DWT_FUNCTION_FUNCTION_Msk          (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/)    /*!< DWT FUNCTION: FUNCTION Mask */\n\n/*@}*/ /* end of group CMSIS_DWT */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_TPI     Trace Port Interface (TPI)\n  \\brief    Type definitions for the Trace Port Interface (TPI)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Trace Port Interface Register (TPI).\n */\ntypedef struct\n{\n  __IOM uint32_t SSPSR;                  /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register */\n  __IOM uint32_t CSPSR;                  /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */\n        uint32_t RESERVED0[2U];\n  __IOM uint32_t ACPR;                   /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */\n        uint32_t RESERVED1[55U];\n  __IOM uint32_t SPPR;                   /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */\n        uint32_t RESERVED2[131U];\n  __IM  uint32_t FFSR;                   /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */\n  __IOM uint32_t FFCR;                   /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */\n  __IM  uint32_t FSCR;                   /*!< Offset: 0x308 (R/ )  Formatter Synchronization Counter Register */\n        uint32_t RESERVED3[759U];\n  __IM  uint32_t TRIGGER;                /*!< Offset: 0xEE8 (R/ )  TRIGGER */\n  __IM  uint32_t FIFO0;                  /*!< Offset: 0xEEC (R/ )  Integration ETM Data */\n  __IM  uint32_t ITATBCTR2;              /*!< Offset: 0xEF0 (R/ )  ITATBCTR2 */\n        uint32_t RESERVED4[1U];\n  __IM  uint32_t ITATBCTR0;              /*!< Offset: 0xEF8 (R/ )  ITATBCTR0 */\n  __IM  uint32_t FIFO1;                  /*!< Offset: 0xEFC (R/ )  Integration ITM Data */\n  __IOM uint32_t ITCTRL;                 /*!< Offset: 0xF00 (R/W)  Integration Mode Control */\n        uint32_t RESERVED5[39U];\n  __IOM uint32_t CLAIMSET;               /*!< Offset: 0xFA0 (R/W)  Claim tag set */\n  __IOM uint32_t CLAIMCLR;               /*!< Offset: 0xFA4 (R/W)  Claim tag clear */\n        uint32_t RESERVED7[8U];\n  __IM  uint32_t DEVID;                  /*!< Offset: 0xFC8 (R/ )  TPIU_DEVID */\n  __IM  uint32_t DEVTYPE;                /*!< Offset: 0xFCC (R/ )  TPIU_DEVTYPE */\n} TPI_Type;\n\n/* TPI Asynchronous Clock Prescaler Register Definitions */\n#define TPI_ACPR_PRESCALER_Pos              0U                                         /*!< TPI ACPR: PRESCALER Position */\n#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/)    /*!< TPI ACPR: PRESCALER Mask */\n\n/* TPI Selected Pin Protocol Register Definitions */\n#define TPI_SPPR_TXMODE_Pos                 0U                                         /*!< TPI SPPR: TXMODE Position */\n#define TPI_SPPR_TXMODE_Msk                (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/)          /*!< TPI SPPR: TXMODE Mask */\n\n/* TPI Formatter and Flush Status Register Definitions */\n#define TPI_FFSR_FtNonStop_Pos              3U                                         /*!< TPI FFSR: FtNonStop Position */\n#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */\n\n#define TPI_FFSR_TCPresent_Pos              2U                                         /*!< TPI FFSR: TCPresent Position */\n#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */\n\n#define TPI_FFSR_FtStopped_Pos              1U                                         /*!< TPI FFSR: FtStopped Position */\n#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */\n\n#define TPI_FFSR_FlInProg_Pos               0U                                         /*!< TPI FFSR: FlInProg Position */\n#define TPI_FFSR_FlInProg_Msk              (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/)        /*!< TPI FFSR: FlInProg Mask */\n\n/* TPI Formatter and Flush Control Register Definitions */\n#define TPI_FFCR_TrigIn_Pos                 8U                                         /*!< TPI FFCR: TrigIn Position */\n#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */\n\n#define TPI_FFCR_EnFCont_Pos                1U                                         /*!< TPI FFCR: EnFCont Position */\n#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */\n\n/* TPI TRIGGER Register Definitions */\n#define TPI_TRIGGER_TRIGGER_Pos             0U                                         /*!< TPI TRIGGER: TRIGGER Position */\n#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/)      /*!< TPI TRIGGER: TRIGGER Mask */\n\n/* TPI Integration ETM Data Register Definitions (FIFO0) */\n#define TPI_FIFO0_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO0: ITM_ATVALID Position */\n#define TPI_FIFO0_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos)        /*!< TPI FIFO0: ITM_ATVALID Mask */\n\n#define TPI_FIFO0_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO0: ITM_bytecount Position */\n#define TPI_FIFO0_ITM_bytecount_Msk        (0x3UL << TPI_FIFO0_ITM_bytecount_Pos)      /*!< TPI FIFO0: ITM_bytecount Mask */\n\n#define TPI_FIFO0_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO0: ETM_ATVALID Position */\n#define TPI_FIFO0_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos)        /*!< TPI FIFO0: ETM_ATVALID Mask */\n\n#define TPI_FIFO0_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO0: ETM_bytecount Position */\n#define TPI_FIFO0_ETM_bytecount_Msk        (0x3UL << TPI_FIFO0_ETM_bytecount_Pos)      /*!< TPI FIFO0: ETM_bytecount Mask */\n\n#define TPI_FIFO0_ETM2_Pos                 16U                                         /*!< TPI FIFO0: ETM2 Position */\n#define TPI_FIFO0_ETM2_Msk                 (0xFFUL << TPI_FIFO0_ETM2_Pos)              /*!< TPI FIFO0: ETM2 Mask */\n\n#define TPI_FIFO0_ETM1_Pos                  8U                                         /*!< TPI FIFO0: ETM1 Position */\n#define TPI_FIFO0_ETM1_Msk                 (0xFFUL << TPI_FIFO0_ETM1_Pos)              /*!< TPI FIFO0: ETM1 Mask */\n\n#define TPI_FIFO0_ETM0_Pos                  0U                                         /*!< TPI FIFO0: ETM0 Position */\n#define TPI_FIFO0_ETM0_Msk                 (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/)          /*!< TPI FIFO0: ETM0 Mask */\n\n/* TPI ITATBCTR2 Register Definitions */\n#define TPI_ITATBCTR2_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR2: ATREADY Position */\n#define TPI_ITATBCTR2_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/)    /*!< TPI ITATBCTR2: ATREADY Mask */\n\n/* TPI Integration ITM Data Register Definitions (FIFO1) */\n#define TPI_FIFO1_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO1: ITM_ATVALID Position */\n#define TPI_FIFO1_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos)        /*!< TPI FIFO1: ITM_ATVALID Mask */\n\n#define TPI_FIFO1_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO1: ITM_bytecount Position */\n#define TPI_FIFO1_ITM_bytecount_Msk        (0x3UL << TPI_FIFO1_ITM_bytecount_Pos)      /*!< TPI FIFO1: ITM_bytecount Mask */\n\n#define TPI_FIFO1_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO1: ETM_ATVALID Position */\n#define TPI_FIFO1_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos)        /*!< TPI FIFO1: ETM_ATVALID Mask */\n\n#define TPI_FIFO1_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO1: ETM_bytecount Position */\n#define TPI_FIFO1_ETM_bytecount_Msk        (0x3UL << TPI_FIFO1_ETM_bytecount_Pos)      /*!< TPI FIFO1: ETM_bytecount Mask */\n\n#define TPI_FIFO1_ITM2_Pos                 16U                                         /*!< TPI FIFO1: ITM2 Position */\n#define TPI_FIFO1_ITM2_Msk                 (0xFFUL << TPI_FIFO1_ITM2_Pos)              /*!< TPI FIFO1: ITM2 Mask */\n\n#define TPI_FIFO1_ITM1_Pos                  8U                                         /*!< TPI FIFO1: ITM1 Position */\n#define TPI_FIFO1_ITM1_Msk                 (0xFFUL << TPI_FIFO1_ITM1_Pos)              /*!< TPI FIFO1: ITM1 Mask */\n\n#define TPI_FIFO1_ITM0_Pos                  0U                                         /*!< TPI FIFO1: ITM0 Position */\n#define TPI_FIFO1_ITM0_Msk                 (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/)          /*!< TPI FIFO1: ITM0 Mask */\n\n/* TPI ITATBCTR0 Register Definitions */\n#define TPI_ITATBCTR0_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR0: ATREADY Position */\n#define TPI_ITATBCTR0_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/)    /*!< TPI ITATBCTR0: ATREADY Mask */\n\n/* TPI Integration Mode Control Register Definitions */\n#define TPI_ITCTRL_Mode_Pos                 0U                                         /*!< TPI ITCTRL: Mode Position */\n#define TPI_ITCTRL_Mode_Msk                (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/)          /*!< TPI ITCTRL: Mode Mask */\n\n/* TPI DEVID Register Definitions */\n#define TPI_DEVID_NRZVALID_Pos             11U                                         /*!< TPI DEVID: NRZVALID Position */\n#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */\n\n#define TPI_DEVID_MANCVALID_Pos            10U                                         /*!< TPI DEVID: MANCVALID Position */\n#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */\n\n#define TPI_DEVID_PTINVALID_Pos             9U                                         /*!< TPI DEVID: PTINVALID Position */\n#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */\n\n#define TPI_DEVID_MinBufSz_Pos              6U                                         /*!< TPI DEVID: MinBufSz Position */\n#define TPI_DEVID_MinBufSz_Msk             (0x7UL << TPI_DEVID_MinBufSz_Pos)           /*!< TPI DEVID: MinBufSz Mask */\n\n#define TPI_DEVID_AsynClkIn_Pos             5U                                         /*!< TPI DEVID: AsynClkIn Position */\n#define TPI_DEVID_AsynClkIn_Msk            (0x1UL << TPI_DEVID_AsynClkIn_Pos)          /*!< TPI DEVID: AsynClkIn Mask */\n\n#define TPI_DEVID_NrTraceInput_Pos          0U                                         /*!< TPI DEVID: NrTraceInput Position */\n#define TPI_DEVID_NrTraceInput_Msk         (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/)  /*!< TPI DEVID: NrTraceInput Mask */\n\n/* TPI DEVTYPE Register Definitions */\n#define TPI_DEVTYPE_MajorType_Pos           4U                                         /*!< TPI DEVTYPE: MajorType Position */\n#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */\n\n#define TPI_DEVTYPE_SubType_Pos             0U                                         /*!< TPI DEVTYPE: SubType Position */\n#define TPI_DEVTYPE_SubType_Msk            (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/)      /*!< TPI DEVTYPE: SubType Mask */\n\n/*@}*/ /* end of group CMSIS_TPI */\n\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RASR;                   /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A1;                /*!< Offset: 0x014 (R/W)  MPU Alias 1 Region Base Address Register */\n  __IOM uint32_t RASR_A1;                /*!< Offset: 0x018 (R/W)  MPU Alias 1 Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A2;                /*!< Offset: 0x01C (R/W)  MPU Alias 2 Region Base Address Register */\n  __IOM uint32_t RASR_A2;                /*!< Offset: 0x020 (R/W)  MPU Alias 2 Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A3;                /*!< Offset: 0x024 (R/W)  MPU Alias 3 Region Base Address Register */\n  __IOM uint32_t RASR_A3;                /*!< Offset: 0x028 (R/W)  MPU Alias 3 Region Attribute and Size Register */\n} MPU_Type;\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_ADDR_Pos                   5U                                            /*!< MPU RBAR: ADDR Position */\n#define MPU_RBAR_ADDR_Msk                  (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos)             /*!< MPU RBAR: ADDR Mask */\n\n#define MPU_RBAR_VALID_Pos                  4U                                            /*!< MPU RBAR: VALID Position */\n#define MPU_RBAR_VALID_Msk                 (1UL << MPU_RBAR_VALID_Pos)                    /*!< MPU RBAR: VALID Mask */\n\n#define MPU_RBAR_REGION_Pos                 0U                                            /*!< MPU RBAR: REGION Position */\n#define MPU_RBAR_REGION_Msk                (0xFUL /*<< MPU_RBAR_REGION_Pos*/)             /*!< MPU RBAR: REGION Mask */\n\n/* MPU Region Attribute and Size Register Definitions */\n#define MPU_RASR_ATTRS_Pos                 16U                                            /*!< MPU RASR: MPU Region Attribute field Position */\n#define MPU_RASR_ATTRS_Msk                 (0xFFFFUL << MPU_RASR_ATTRS_Pos)               /*!< MPU RASR: MPU Region Attribute field Mask */\n\n#define MPU_RASR_XN_Pos                    28U                                            /*!< MPU RASR: ATTRS.XN Position */\n#define MPU_RASR_XN_Msk                    (1UL << MPU_RASR_XN_Pos)                       /*!< MPU RASR: ATTRS.XN Mask */\n\n#define MPU_RASR_AP_Pos                    24U                                            /*!< MPU RASR: ATTRS.AP Position */\n#define MPU_RASR_AP_Msk                    (0x7UL << MPU_RASR_AP_Pos)                     /*!< MPU RASR: ATTRS.AP Mask */\n\n#define MPU_RASR_TEX_Pos                   19U                                            /*!< MPU RASR: ATTRS.TEX Position */\n#define MPU_RASR_TEX_Msk                   (0x7UL << MPU_RASR_TEX_Pos)                    /*!< MPU RASR: ATTRS.TEX Mask */\n\n#define MPU_RASR_S_Pos                     18U                                            /*!< MPU RASR: ATTRS.S Position */\n#define MPU_RASR_S_Msk                     (1UL << MPU_RASR_S_Pos)                        /*!< MPU RASR: ATTRS.S Mask */\n\n#define MPU_RASR_C_Pos                     17U                                            /*!< MPU RASR: ATTRS.C Position */\n#define MPU_RASR_C_Msk                     (1UL << MPU_RASR_C_Pos)                        /*!< MPU RASR: ATTRS.C Mask */\n\n#define MPU_RASR_B_Pos                     16U                                            /*!< MPU RASR: ATTRS.B Position */\n#define MPU_RASR_B_Msk                     (1UL << MPU_RASR_B_Pos)                        /*!< MPU RASR: ATTRS.B Mask */\n\n#define MPU_RASR_SRD_Pos                    8U                                            /*!< MPU RASR: Sub-Region Disable Position */\n#define MPU_RASR_SRD_Msk                   (0xFFUL << MPU_RASR_SRD_Pos)                   /*!< MPU RASR: Sub-Region Disable Mask */\n\n#define MPU_RASR_SIZE_Pos                   1U                                            /*!< MPU RASR: Region Size Field Position */\n#define MPU_RASR_SIZE_Msk                  (0x1FUL << MPU_RASR_SIZE_Pos)                  /*!< MPU RASR: Region Size Field Mask */\n\n#define MPU_RASR_ENABLE_Pos                 0U                                            /*!< MPU RASR: Region enable bit Position */\n#define MPU_RASR_ENABLE_Msk                (1UL /*<< MPU_RASR_ENABLE_Pos*/)               /*!< MPU RASR: Region enable bit Disable Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Type definitions for the Core Debug Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Core Debug Register (CoreDebug).\n */\ntypedef struct\n{\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\n} CoreDebug_Type;\n\n/* Debug Halting Control and Status Register Definitions */\n#define CoreDebug_DHCSR_DBGKEY_Pos         16U                                            /*!< CoreDebug DHCSR: DBGKEY Position */\n#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< CoreDebug DHCSR: DBGKEY Mask */\n\n#define CoreDebug_DHCSR_S_RESET_ST_Pos     25U                                            /*!< CoreDebug DHCSR: S_RESET_ST Position */\n#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< CoreDebug DHCSR: S_RESET_ST Mask */\n\n#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24U                                            /*!< CoreDebug DHCSR: S_RETIRE_ST Position */\n#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */\n\n#define CoreDebug_DHCSR_S_LOCKUP_Pos       19U                                            /*!< CoreDebug DHCSR: S_LOCKUP Position */\n#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< CoreDebug DHCSR: S_LOCKUP Mask */\n\n#define CoreDebug_DHCSR_S_SLEEP_Pos        18U                                            /*!< CoreDebug DHCSR: S_SLEEP Position */\n#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< CoreDebug DHCSR: S_SLEEP Mask */\n\n#define CoreDebug_DHCSR_S_HALT_Pos         17U                                            /*!< CoreDebug DHCSR: S_HALT Position */\n#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< CoreDebug DHCSR: S_HALT Mask */\n\n#define CoreDebug_DHCSR_S_REGRDY_Pos       16U                                            /*!< CoreDebug DHCSR: S_REGRDY Position */\n#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< CoreDebug DHCSR: S_REGRDY Mask */\n\n#define CoreDebug_DHCSR_C_SNAPSTALL_Pos     5U                                            /*!< CoreDebug DHCSR: C_SNAPSTALL Position */\n#define CoreDebug_DHCSR_C_SNAPSTALL_Msk    (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos)       /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */\n\n#define CoreDebug_DHCSR_C_MASKINTS_Pos      3U                                            /*!< CoreDebug DHCSR: C_MASKINTS Position */\n#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< CoreDebug DHCSR: C_MASKINTS Mask */\n\n#define CoreDebug_DHCSR_C_STEP_Pos          2U                                            /*!< CoreDebug DHCSR: C_STEP Position */\n#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< CoreDebug DHCSR: C_STEP Mask */\n\n#define CoreDebug_DHCSR_C_HALT_Pos          1U                                            /*!< CoreDebug DHCSR: C_HALT Position */\n#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< CoreDebug DHCSR: C_HALT Mask */\n\n#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0U                                            /*!< CoreDebug DHCSR: C_DEBUGEN Position */\n#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/)     /*!< CoreDebug DHCSR: C_DEBUGEN Mask */\n\n/* Debug Core Register Selector Register Definitions */\n#define CoreDebug_DCRSR_REGWnR_Pos         16U                                            /*!< CoreDebug DCRSR: REGWnR Position */\n#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< CoreDebug DCRSR: REGWnR Mask */\n\n#define CoreDebug_DCRSR_REGSEL_Pos          0U                                            /*!< CoreDebug DCRSR: REGSEL Position */\n#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/)     /*!< CoreDebug DCRSR: REGSEL Mask */\n\n/* Debug Exception and Monitor Control Register Definitions */\n#define CoreDebug_DEMCR_TRCENA_Pos         24U                                            /*!< CoreDebug DEMCR: TRCENA Position */\n#define CoreDebug_DEMCR_TRCENA_Msk         (1UL << CoreDebug_DEMCR_TRCENA_Pos)            /*!< CoreDebug DEMCR: TRCENA Mask */\n\n#define CoreDebug_DEMCR_MON_REQ_Pos        19U                                            /*!< CoreDebug DEMCR: MON_REQ Position */\n#define CoreDebug_DEMCR_MON_REQ_Msk        (1UL << CoreDebug_DEMCR_MON_REQ_Pos)           /*!< CoreDebug DEMCR: MON_REQ Mask */\n\n#define CoreDebug_DEMCR_MON_STEP_Pos       18U                                            /*!< CoreDebug DEMCR: MON_STEP Position */\n#define CoreDebug_DEMCR_MON_STEP_Msk       (1UL << CoreDebug_DEMCR_MON_STEP_Pos)          /*!< CoreDebug DEMCR: MON_STEP Mask */\n\n#define CoreDebug_DEMCR_MON_PEND_Pos       17U                                            /*!< CoreDebug DEMCR: MON_PEND Position */\n#define CoreDebug_DEMCR_MON_PEND_Msk       (1UL << CoreDebug_DEMCR_MON_PEND_Pos)          /*!< CoreDebug DEMCR: MON_PEND Mask */\n\n#define CoreDebug_DEMCR_MON_EN_Pos         16U                                            /*!< CoreDebug DEMCR: MON_EN Position */\n#define CoreDebug_DEMCR_MON_EN_Msk         (1UL << CoreDebug_DEMCR_MON_EN_Pos)            /*!< CoreDebug DEMCR: MON_EN Mask */\n\n#define CoreDebug_DEMCR_VC_HARDERR_Pos     10U                                            /*!< CoreDebug DEMCR: VC_HARDERR Position */\n#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< CoreDebug DEMCR: VC_HARDERR Mask */\n\n#define CoreDebug_DEMCR_VC_INTERR_Pos       9U                                            /*!< CoreDebug DEMCR: VC_INTERR Position */\n#define CoreDebug_DEMCR_VC_INTERR_Msk      (1UL << CoreDebug_DEMCR_VC_INTERR_Pos)         /*!< CoreDebug DEMCR: VC_INTERR Mask */\n\n#define CoreDebug_DEMCR_VC_BUSERR_Pos       8U                                            /*!< CoreDebug DEMCR: VC_BUSERR Position */\n#define CoreDebug_DEMCR_VC_BUSERR_Msk      (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos)         /*!< CoreDebug DEMCR: VC_BUSERR Mask */\n\n#define CoreDebug_DEMCR_VC_STATERR_Pos      7U                                            /*!< CoreDebug DEMCR: VC_STATERR Position */\n#define CoreDebug_DEMCR_VC_STATERR_Msk     (1UL << CoreDebug_DEMCR_VC_STATERR_Pos)        /*!< CoreDebug DEMCR: VC_STATERR Mask */\n\n#define CoreDebug_DEMCR_VC_CHKERR_Pos       6U                                            /*!< CoreDebug DEMCR: VC_CHKERR Position */\n#define CoreDebug_DEMCR_VC_CHKERR_Msk      (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos)         /*!< CoreDebug DEMCR: VC_CHKERR Mask */\n\n#define CoreDebug_DEMCR_VC_NOCPERR_Pos      5U                                            /*!< CoreDebug DEMCR: VC_NOCPERR Position */\n#define CoreDebug_DEMCR_VC_NOCPERR_Msk     (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos)        /*!< CoreDebug DEMCR: VC_NOCPERR Mask */\n\n#define CoreDebug_DEMCR_VC_MMERR_Pos        4U                                            /*!< CoreDebug DEMCR: VC_MMERR Position */\n#define CoreDebug_DEMCR_VC_MMERR_Msk       (1UL << CoreDebug_DEMCR_VC_MMERR_Pos)          /*!< CoreDebug DEMCR: VC_MMERR Mask */\n\n#define CoreDebug_DEMCR_VC_CORERESET_Pos    0U                                            /*!< CoreDebug DEMCR: VC_CORERESET Position */\n#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/)  /*!< CoreDebug DEMCR: VC_CORERESET Mask */\n\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */\n#define ITM_BASE            (0xE0000000UL)                            /*!< ITM Base Address */\n#define DWT_BASE            (0xE0001000UL)                            /*!< DWT Base Address */\n#define TPI_BASE            (0xE0040000UL)                            /*!< TPI Base Address */\n#define CoreDebug_BASE      (0xE000EDF0UL)                            /*!< Core Debug Base Address */\n#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */\n#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */\n#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */\n\n#define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE      )   /*!< System control Register not in SCB */\n#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */\n#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */\n#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */\n#define ITM                 ((ITM_Type       *)     ITM_BASE      )   /*!< ITM configuration struct */\n#define DWT                 ((DWT_Type       *)     DWT_BASE      )   /*!< DWT configuration struct */\n#define TPI                 ((TPI_Type       *)     TPI_BASE      )   /*!< TPI configuration struct */\n#define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE)   /*!< Core Debug configuration struct */\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit */\n  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit */\n#endif\n\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Debug Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifdef CMSIS_NVIC_VIRTUAL\n  #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE\n    #define CMSIS_NVIC_VIRTUAL_HEADER_FILE \"cmsis_nvic_virtual.h\"\n  #endif\n  #include CMSIS_NVIC_VIRTUAL_HEADER_FILE\n#else\n  #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping\n  #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n  #define NVIC_GetActive              __NVIC_GetActive\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n  #define NVIC_SystemReset            __NVIC_SystemReset\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifdef CMSIS_VECTAB_VIRTUAL\n  #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE\n   #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE \"cmsis_vectab_virtual.h\"\n  #endif\n  #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE\n#else\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n\n/**\n  \\brief   Set Priority Grouping\n  \\details Sets the priority grouping field using the required unlock sequence.\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\n           Only values from 0..7 are used.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]      PriorityGroup  Priority grouping field.\n */\nCMSIS_INLINE __STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)\n{\n  uint32_t reg_value;\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\n\n  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */\n  reg_value  =  (reg_value                                   |\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                (PriorityGroupTmp << 8U)                      );              /* Insert write key and priorty group */\n  SCB->AIRCR =  reg_value;\n}\n\n\n/**\n  \\brief   Get Priority Grouping\n  \\details Reads the priority grouping field from the NVIC Interrupt Controller.\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\n */\nCMSIS_INLINE __STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void)\n{\n  return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\n}\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\nCMSIS_INLINE __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\nCMSIS_INLINE __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\nCMSIS_INLINE __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\nCMSIS_INLINE __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\nCMSIS_INLINE __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\nCMSIS_INLINE __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt\n  \\details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\nCMSIS_INLINE __STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\nCMSIS_INLINE __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IP[((uint32_t)(int32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n  else\n  {\n    SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\nCMSIS_INLINE __STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Encode Priority\n  \\details Encodes the priority for an interrupt with the given priority group,\n           preemptive priority value, and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [in]   PreemptPriority  Preemptive priority value (starting from 0).\n  \\param [in]       SubPriority  Subpriority value (starting from 0).\n  \\return                        Encoded priority. Value can be used in the function \\ref NVIC_SetPriority().\n */\nCMSIS_INLINE __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  return (\n           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |\n           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))\n         );\n}\n\n\n/**\n  \\brief   Decode Priority\n  \\details Decodes an interrupt priority value with a given priority group to\n           preemptive priority value and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.\n  \\param [in]         Priority   Priority value, which can be retrieved with the function \\ref NVIC_GetPriority().\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [out] pPreemptPriority  Preemptive priority value (starting from 0).\n  \\param [out]     pSubPriority  Subpriority value (starting from 0).\n */\nCMSIS_INLINE __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);\n  *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL);\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\nCMSIS_INLINE __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\nCMSIS_INLINE __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\nCMSIS_INLINE __STATIC_INLINE void __NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |\n                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |\n                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\nCMSIS_INLINE __STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n    return 0U;           /* No FPU */\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\nCMSIS_INLINE __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n/* ##################################### Debug In/Output function ########################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_core_DebugFunctions ITM Functions\n  \\brief    Functions that access the ITM debug interface.\n  @{\n */\n\nextern volatile int32_t ITM_RxBuffer;                              /*!< External variable to receive characters. */\n#define                 ITM_RXBUFFER_EMPTY  ((int32_t)0x5AA55AA5U) /*!< Value identifying \\ref ITM_RxBuffer is ready for next character. */\n\n\n/**\n  \\brief   ITM Send Character\n  \\details Transmits a character via the ITM channel 0, and\n           \\li Just returns when no debugger is connected that has booked the output.\n           \\li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.\n  \\param [in]     ch  Character to transmit.\n  \\returns            Character to transmit.\n */\nCMSIS_INLINE __STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)\n{\n  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */\n      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */\n  {\n    while (ITM->PORT[0U].u32 == 0UL)\n    {\n      __NOP();\n    }\n    ITM->PORT[0U].u8 = (uint8_t)ch;\n  }\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Receive Character\n  \\details Inputs a character via the external variable \\ref ITM_RxBuffer.\n  \\return             Received character.\n  \\return         -1  No character pending.\n */\nCMSIS_INLINE __STATIC_INLINE int32_t ITM_ReceiveChar (void)\n{\n  int32_t ch = -1;                           /* no character available */\n\n  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY)\n  {\n    ch = ITM_RxBuffer;\n    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */\n  }\n\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Check Character\n  \\details Checks whether a character is pending for reading in the variable \\ref ITM_RxBuffer.\n  \\return          0  No character available.\n  \\return          1  Character available.\n */\nCMSIS_INLINE __STATIC_INLINE int32_t ITM_CheckChar (void)\n{\n\n  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY)\n  {\n    return (0);                              /* no character available */\n  }\n  else\n  {\n    return (1);                              /*    character available */\n  }\n}\n\n/*@} end of CMSIS_core_DebugFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM3_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_cm33.h",
    "content": "/**************************************************************************//**\n * @file     core_cm33.h\n * @brief    CMSIS Cortex-M33 Core Peripheral Access Layer Header File\n * @version  V5.0.2\n * @date     07. December 2016\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_CM33_H_GENERIC\n#define __CORE_CM33_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex_M33\n  @{\n */\n\n/*  CMSIS CM33 definitions */\n#define __CM33_CMSIS_VERSION_MAIN  ( 5U)                                      /*!< [31:16] CMSIS HAL main version */\n#define __CM33_CMSIS_VERSION_SUB   ( 0U)                                      /*!< [15:0]  CMSIS HAL sub version */\n#define __CM33_CMSIS_VERSION       ((__CM33_CMSIS_VERSION_MAIN << 16U) | \\\n                                     __CM33_CMSIS_VERSION_SUB           )     /*!< CMSIS HAL version number */\n\n#define __CORTEX_M                 (33U)                                      /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions.\n*/\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #warning \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM33_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_CM33_H_DEPENDANT\n#define __CORE_CM33_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __CM33_REV\n    #define __CM33_REV                0x0000U\n    #warning \"__CM33_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __FPU_PRESENT\n    #define __FPU_PRESENT             0U\n    #warning \"__FPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __SAUREGION_PRESENT\n    #define __SAUREGION_PRESENT       0U\n    #warning \"__SAUREGION_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __DSP_PRESENT\n    #define __DSP_PRESENT             0U\n    #warning \"__DSP_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          3U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group Cortex_M33 */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core Debug Register\n  - Core MPU Register\n  - Core SAU Register\n  - Core FPU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved */\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\n    uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n#define APSR_Q_Pos                         27U                                            /*!< APSR: Q Position */\n#define APSR_Q_Msk                         (1UL << APSR_Q_Pos)                            /*!< APSR: Q Mask */\n\n#define APSR_GE_Pos                        16U                                            /*!< APSR: GE Position */\n#define APSR_GE_Msk                        (0xFUL << APSR_GE_Pos)                         /*!< APSR: GE Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:7;               /*!< bit:  9..15  Reserved */\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\n    uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */\n    uint32_t IT:2;                       /*!< bit: 25..26  saved IT state   (read 0) */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_Q_Pos                         27U                                            /*!< xPSR: Q Position */\n#define xPSR_Q_Msk                         (1UL << xPSR_Q_Pos)                            /*!< xPSR: Q Mask */\n\n#define xPSR_IT_Pos                        25U                                            /*!< xPSR: IT Position */\n#define xPSR_IT_Msk                        (3UL << xPSR_IT_Pos)                           /*!< xPSR: IT Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_GE_Pos                        16U                                            /*!< xPSR: GE Position */\n#define xPSR_GE_Msk                        (0xFUL << xPSR_GE_Pos)                         /*!< xPSR: GE Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack-pointer select */\n    uint32_t FPCA:1;                     /*!< bit:      2  Floating-point context active */\n    uint32_t SFPA:1;                     /*!< bit:      3  Secure floating-point active */\n    uint32_t _reserved1:28;              /*!< bit:  4..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SFPA_Pos                    3U                                            /*!< CONTROL: SFPA Position */\n#define CONTROL_SFPA_Msk                   (1UL << CONTROL_SFPA_Pos)                      /*!< CONTROL: SFPA Mask */\n\n#define CONTROL_FPCA_Pos                    2U                                            /*!< CONTROL: FPCA Position */\n#define CONTROL_FPCA_Msk                   (1UL << CONTROL_FPCA_Pos)                      /*!< CONTROL: FPCA Mask */\n\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[16U];              /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[16U];\n  __IOM uint32_t ICER[16U];              /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[16U];\n  __IOM uint32_t ISPR[16U];              /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[16U];\n  __IOM uint32_t ICPR[16U];              /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[16U];\n  __IOM uint32_t IABR[16U];              /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */\n        uint32_t RESERVED4[16U];\n  __IOM uint32_t ITNS[16U];              /*!< Offset: 0x280 (R/W)  Interrupt Non-Secure State Register */\n        uint32_t RESERVED5[16U];\n  __IOM uint8_t  IPR[496U];              /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */\n        uint32_t RESERVED6[580U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */\n}  NVIC_Type;\n\n/* Software Triggered Interrupt Register Definitions */\n#define NVIC_STIR_INTID_Pos                 0U                                         /*!< STIR: INTLINESNUM Position */\n#define NVIC_STIR_INTID_Msk                (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/)        /*!< STIR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n  __IOM uint8_t  SHPR[12U];              /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11, 12-15) */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n  __IOM uint32_t CFSR;                   /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register */\n  __IOM uint32_t HFSR;                   /*!< Offset: 0x02C (R/W)  HardFault Status Register */\n  __IOM uint32_t DFSR;                   /*!< Offset: 0x030 (R/W)  Debug Fault Status Register */\n  __IOM uint32_t MMFAR;                  /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register */\n  __IOM uint32_t BFAR;                   /*!< Offset: 0x038 (R/W)  BusFault Address Register */\n  __IOM uint32_t AFSR;                   /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register */\n  __IM  uint32_t ID_PFR[2U];             /*!< Offset: 0x040 (R/ )  Processor Feature Register */\n  __IM  uint32_t ID_DFR;                 /*!< Offset: 0x048 (R/ )  Debug Feature Register */\n  __IM  uint32_t ID_ADR;                 /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register */\n  __IM  uint32_t ID_MMFR[4U];            /*!< Offset: 0x050 (R/ )  Memory Model Feature Register */\n  __IM  uint32_t ID_ISAR[6U];            /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register */\n  __IM  uint32_t CLIDR;                  /*!< Offset: 0x078 (R/ )  Cache Level ID register */\n  __IM  uint32_t CTR;                    /*!< Offset: 0x07C (R/ )  Cache Type register */\n  __IM  uint32_t CCSIDR;                 /*!< Offset: 0x080 (R/ )  Cache Size ID Register */\n  __IOM uint32_t CSSELR;                 /*!< Offset: 0x084 (R/W)  Cache Size Selection Register */\n  __IOM uint32_t CPACR;                  /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register */\n  __IOM uint32_t NSACR;                  /*!< Offset: 0x08C (R/W)  Non-Secure Access Control Register */\n        uint32_t RESERVED3[92U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0x200 ( /W)  Software Triggered Interrupt Register */\n        uint32_t RESERVED4[15U];\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x240 (R/ )  Media and VFP Feature Register 0 */\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x244 (R/ )  Media and VFP Feature Register 1 */\n  __IM  uint32_t MVFR2;                  /*!< Offset: 0x248 (R/ )  Media and VFP Feature Register 1 */\n        uint32_t RESERVED5[1U];\n  __OM  uint32_t ICIALLU;                /*!< Offset: 0x250 ( /W)  I-Cache Invalidate All to PoU */\n        uint32_t RESERVED6[1U];\n  __OM  uint32_t ICIMVAU;                /*!< Offset: 0x258 ( /W)  I-Cache Invalidate by MVA to PoU */\n  __OM  uint32_t DCIMVAC;                /*!< Offset: 0x25C ( /W)  D-Cache Invalidate by MVA to PoC */\n  __OM  uint32_t DCISW;                  /*!< Offset: 0x260 ( /W)  D-Cache Invalidate by Set-way */\n  __OM  uint32_t DCCMVAU;                /*!< Offset: 0x264 ( /W)  D-Cache Clean by MVA to PoU */\n  __OM  uint32_t DCCMVAC;                /*!< Offset: 0x268 ( /W)  D-Cache Clean by MVA to PoC */\n  __OM  uint32_t DCCSW;                  /*!< Offset: 0x26C ( /W)  D-Cache Clean by Set-way */\n  __OM  uint32_t DCCIMVAC;               /*!< Offset: 0x270 ( /W)  D-Cache Clean and Invalidate by MVA to PoC */\n  __OM  uint32_t DCCISW;                 /*!< Offset: 0x274 ( /W)  D-Cache Clean and Invalidate by Set-way */\n        uint32_t RESERVED7[6U];\n  __IOM uint32_t ITCMCR;                 /*!< Offset: 0x290 (R/W)  Instruction Tightly-Coupled Memory Control Register */\n  __IOM uint32_t DTCMCR;                 /*!< Offset: 0x294 (R/W)  Data Tightly-Coupled Memory Control Registers */\n  __IOM uint32_t AHBPCR;                 /*!< Offset: 0x298 (R/W)  AHBP Control Register */\n  __IOM uint32_t CACR;                   /*!< Offset: 0x29C (R/W)  L1 Cache Control Register */\n  __IOM uint32_t AHBSCR;                 /*!< Offset: 0x2A0 (R/W)  AHB Slave Control Register */\n        uint32_t RESERVED8[1U];\n  __IOM uint32_t ABFSR;                  /*!< Offset: 0x2A8 (R/W)  Auxiliary Bus Fault Status Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_PENDNMISET_Pos            31U                                            /*!< SCB ICSR: PENDNMISET Position */\n#define SCB_ICSR_PENDNMISET_Msk            (1UL << SCB_ICSR_PENDNMISET_Pos)               /*!< SCB ICSR: PENDNMISET Mask */\n\n#define SCB_ICSR_PENDNMICLR_Pos            30U                                            /*!< SCB ICSR: PENDNMICLR Position */\n#define SCB_ICSR_PENDNMICLR_Msk            (1UL << SCB_ICSR_PENDNMICLR_Pos)               /*!< SCB ICSR: PENDNMICLR Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_STTNS_Pos                 24U                                            /*!< SCB ICSR: STTNS Position (Security Extension) */\n#define SCB_ICSR_STTNS_Msk                 (1UL << SCB_ICSR_STTNS_Pos)                    /*!< SCB ICSR: STTNS Mask (Security Extension) */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_RETTOBASE_Pos             11U                                            /*!< SCB ICSR: RETTOBASE Position */\n#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n/* SCB Vector Table Offset Register Definitions */\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_PRIS_Pos                 14U                                            /*!< SCB AIRCR: PRIS Position */\n#define SCB_AIRCR_PRIS_Msk                 (1UL << SCB_AIRCR_PRIS_Pos)                    /*!< SCB AIRCR: PRIS Mask */\n\n#define SCB_AIRCR_BFHFNMINS_Pos            13U                                            /*!< SCB AIRCR: BFHFNMINS Position */\n#define SCB_AIRCR_BFHFNMINS_Msk            (1UL << SCB_AIRCR_BFHFNMINS_Pos)               /*!< SCB AIRCR: BFHFNMINS Mask */\n\n#define SCB_AIRCR_PRIGROUP_Pos              8U                                            /*!< SCB AIRCR: PRIGROUP Position */\n#define SCB_AIRCR_PRIGROUP_Msk             (7UL << SCB_AIRCR_PRIGROUP_Pos)                /*!< SCB AIRCR: PRIGROUP Mask */\n\n#define SCB_AIRCR_SYSRESETREQS_Pos          3U                                            /*!< SCB AIRCR: SYSRESETREQS Position */\n#define SCB_AIRCR_SYSRESETREQS_Msk         (1UL << SCB_AIRCR_SYSRESETREQS_Pos)            /*!< SCB AIRCR: SYSRESETREQS Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEPS_Pos              3U                                            /*!< SCB SCR: SLEEPDEEPS Position */\n#define SCB_SCR_SLEEPDEEPS_Msk             (1UL << SCB_SCR_SLEEPDEEPS_Pos)                /*!< SCB SCR: SLEEPDEEPS Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_BP_Pos                     18U                                            /*!< SCB CCR: BP Position */\n#define SCB_CCR_BP_Msk                     (1UL << SCB_CCR_BP_Pos)                        /*!< SCB CCR: BP Mask */\n\n#define SCB_CCR_IC_Pos                     17U                                            /*!< SCB CCR: IC Position */\n#define SCB_CCR_IC_Msk                     (1UL << SCB_CCR_IC_Pos)                        /*!< SCB CCR: IC Mask */\n\n#define SCB_CCR_DC_Pos                     16U                                            /*!< SCB CCR: DC Position */\n#define SCB_CCR_DC_Msk                     (1UL << SCB_CCR_DC_Pos)                        /*!< SCB CCR: DC Mask */\n\n#define SCB_CCR_STKOFHFNMIGN_Pos           10U                                            /*!< SCB CCR: STKOFHFNMIGN Position */\n#define SCB_CCR_STKOFHFNMIGN_Msk           (1UL << SCB_CCR_STKOFHFNMIGN_Pos)              /*!< SCB CCR: STKOFHFNMIGN Mask */\n\n#define SCB_CCR_BFHFNMIGN_Pos               8U                                            /*!< SCB CCR: BFHFNMIGN Position */\n#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */\n\n#define SCB_CCR_DIV_0_TRP_Pos               4U                                            /*!< SCB CCR: DIV_0_TRP Position */\n#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n#define SCB_CCR_USERSETMPEND_Pos            1U                                            /*!< SCB CCR: USERSETMPEND Position */\n#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_HARDFAULTPENDED_Pos      21U                                            /*!< SCB SHCSR: HARDFAULTPENDED Position */\n#define SCB_SHCSR_HARDFAULTPENDED_Msk      (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos)         /*!< SCB SHCSR: HARDFAULTPENDED Mask */\n\n#define SCB_SHCSR_SECUREFAULTPENDED_Pos    20U                                            /*!< SCB SHCSR: SECUREFAULTPENDED Position */\n#define SCB_SHCSR_SECUREFAULTPENDED_Msk    (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos)       /*!< SCB SHCSR: SECUREFAULTPENDED Mask */\n\n#define SCB_SHCSR_SECUREFAULTENA_Pos       19U                                            /*!< SCB SHCSR: SECUREFAULTENA Position */\n#define SCB_SHCSR_SECUREFAULTENA_Msk       (1UL << SCB_SHCSR_SECUREFAULTENA_Pos)          /*!< SCB SHCSR: SECUREFAULTENA Mask */\n\n#define SCB_SHCSR_USGFAULTENA_Pos          18U                                            /*!< SCB SHCSR: USGFAULTENA Position */\n#define SCB_SHCSR_USGFAULTENA_Msk          (1UL << SCB_SHCSR_USGFAULTENA_Pos)             /*!< SCB SHCSR: USGFAULTENA Mask */\n\n#define SCB_SHCSR_BUSFAULTENA_Pos          17U                                            /*!< SCB SHCSR: BUSFAULTENA Position */\n#define SCB_SHCSR_BUSFAULTENA_Msk          (1UL << SCB_SHCSR_BUSFAULTENA_Pos)             /*!< SCB SHCSR: BUSFAULTENA Mask */\n\n#define SCB_SHCSR_MEMFAULTENA_Pos          16U                                            /*!< SCB SHCSR: MEMFAULTENA Position */\n#define SCB_SHCSR_MEMFAULTENA_Msk          (1UL << SCB_SHCSR_MEMFAULTENA_Pos)             /*!< SCB SHCSR: MEMFAULTENA Mask */\n\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n#define SCB_SHCSR_BUSFAULTPENDED_Pos       14U                                            /*!< SCB SHCSR: BUSFAULTPENDED Position */\n#define SCB_SHCSR_BUSFAULTPENDED_Msk       (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos)          /*!< SCB SHCSR: BUSFAULTPENDED Mask */\n\n#define SCB_SHCSR_MEMFAULTPENDED_Pos       13U                                            /*!< SCB SHCSR: MEMFAULTPENDED Position */\n#define SCB_SHCSR_MEMFAULTPENDED_Msk       (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos)          /*!< SCB SHCSR: MEMFAULTPENDED Mask */\n\n#define SCB_SHCSR_USGFAULTPENDED_Pos       12U                                            /*!< SCB SHCSR: USGFAULTPENDED Position */\n#define SCB_SHCSR_USGFAULTPENDED_Msk       (1UL << SCB_SHCSR_USGFAULTPENDED_Pos)          /*!< SCB SHCSR: USGFAULTPENDED Mask */\n\n#define SCB_SHCSR_SYSTICKACT_Pos           11U                                            /*!< SCB SHCSR: SYSTICKACT Position */\n#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */\n\n#define SCB_SHCSR_PENDSVACT_Pos            10U                                            /*!< SCB SHCSR: PENDSVACT Position */\n#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */\n\n#define SCB_SHCSR_MONITORACT_Pos            8U                                            /*!< SCB SHCSR: MONITORACT Position */\n#define SCB_SHCSR_MONITORACT_Msk           (1UL << SCB_SHCSR_MONITORACT_Pos)              /*!< SCB SHCSR: MONITORACT Mask */\n\n#define SCB_SHCSR_SVCALLACT_Pos             7U                                            /*!< SCB SHCSR: SVCALLACT Position */\n#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */\n\n#define SCB_SHCSR_NMIACT_Pos                5U                                            /*!< SCB SHCSR: NMIACT Position */\n#define SCB_SHCSR_NMIACT_Msk               (1UL << SCB_SHCSR_NMIACT_Pos)                  /*!< SCB SHCSR: NMIACT Mask */\n\n#define SCB_SHCSR_SECUREFAULTACT_Pos        4U                                            /*!< SCB SHCSR: SECUREFAULTACT Position */\n#define SCB_SHCSR_SECUREFAULTACT_Msk       (1UL << SCB_SHCSR_SECUREFAULTACT_Pos)          /*!< SCB SHCSR: SECUREFAULTACT Mask */\n\n#define SCB_SHCSR_USGFAULTACT_Pos           3U                                            /*!< SCB SHCSR: USGFAULTACT Position */\n#define SCB_SHCSR_USGFAULTACT_Msk          (1UL << SCB_SHCSR_USGFAULTACT_Pos)             /*!< SCB SHCSR: USGFAULTACT Mask */\n\n#define SCB_SHCSR_HARDFAULTACT_Pos          2U                                            /*!< SCB SHCSR: HARDFAULTACT Position */\n#define SCB_SHCSR_HARDFAULTACT_Msk         (1UL << SCB_SHCSR_HARDFAULTACT_Pos)            /*!< SCB SHCSR: HARDFAULTACT Mask */\n\n#define SCB_SHCSR_BUSFAULTACT_Pos           1U                                            /*!< SCB SHCSR: BUSFAULTACT Position */\n#define SCB_SHCSR_BUSFAULTACT_Msk          (1UL << SCB_SHCSR_BUSFAULTACT_Pos)             /*!< SCB SHCSR: BUSFAULTACT Mask */\n\n#define SCB_SHCSR_MEMFAULTACT_Pos           0U                                            /*!< SCB SHCSR: MEMFAULTACT Position */\n#define SCB_SHCSR_MEMFAULTACT_Msk          (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/)         /*!< SCB SHCSR: MEMFAULTACT Mask */\n\n/* SCB Configurable Fault Status Register Definitions */\n#define SCB_CFSR_USGFAULTSR_Pos            16U                                            /*!< SCB CFSR: Usage Fault Status Register Position */\n#define SCB_CFSR_USGFAULTSR_Msk            (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos)          /*!< SCB CFSR: Usage Fault Status Register Mask */\n\n#define SCB_CFSR_BUSFAULTSR_Pos             8U                                            /*!< SCB CFSR: Bus Fault Status Register Position */\n#define SCB_CFSR_BUSFAULTSR_Msk            (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos)            /*!< SCB CFSR: Bus Fault Status Register Mask */\n\n#define SCB_CFSR_MEMFAULTSR_Pos             0U                                            /*!< SCB CFSR: Memory Manage Fault Status Register Position */\n#define SCB_CFSR_MEMFAULTSR_Msk            (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/)        /*!< SCB CFSR: Memory Manage Fault Status Register Mask */\n\n/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_MMARVALID_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 7U)               /*!< SCB CFSR (MMFSR): MMARVALID Position */\n#define SCB_CFSR_MMARVALID_Msk             (1UL << SCB_CFSR_MMARVALID_Pos)                /*!< SCB CFSR (MMFSR): MMARVALID Mask */\n\n#define SCB_CFSR_MLSPERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 5U)               /*!< SCB CFSR (MMFSR): MLSPERR Position */\n#define SCB_CFSR_MLSPERR_Msk               (1UL << SCB_CFSR_MLSPERR_Pos)                  /*!< SCB CFSR (MMFSR): MLSPERR Mask */\n\n#define SCB_CFSR_MSTKERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 4U)               /*!< SCB CFSR (MMFSR): MSTKERR Position */\n#define SCB_CFSR_MSTKERR_Msk               (1UL << SCB_CFSR_MSTKERR_Pos)                  /*!< SCB CFSR (MMFSR): MSTKERR Mask */\n\n#define SCB_CFSR_MUNSTKERR_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 3U)               /*!< SCB CFSR (MMFSR): MUNSTKERR Position */\n#define SCB_CFSR_MUNSTKERR_Msk             (1UL << SCB_CFSR_MUNSTKERR_Pos)                /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */\n\n#define SCB_CFSR_DACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 1U)               /*!< SCB CFSR (MMFSR): DACCVIOL Position */\n#define SCB_CFSR_DACCVIOL_Msk              (1UL << SCB_CFSR_DACCVIOL_Pos)                 /*!< SCB CFSR (MMFSR): DACCVIOL Mask */\n\n#define SCB_CFSR_IACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 0U)               /*!< SCB CFSR (MMFSR): IACCVIOL Position */\n#define SCB_CFSR_IACCVIOL_Msk              (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/)             /*!< SCB CFSR (MMFSR): IACCVIOL Mask */\n\n/* BusFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_BFARVALID_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 7U)                  /*!< SCB CFSR (BFSR): BFARVALID Position */\n#define SCB_CFSR_BFARVALID_Msk            (1UL << SCB_CFSR_BFARVALID_Pos)                 /*!< SCB CFSR (BFSR): BFARVALID Mask */\n\n#define SCB_CFSR_LSPERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 5U)                  /*!< SCB CFSR (BFSR): LSPERR Position */\n#define SCB_CFSR_LSPERR_Msk               (1UL << SCB_CFSR_LSPERR_Pos)                    /*!< SCB CFSR (BFSR): LSPERR Mask */\n\n#define SCB_CFSR_STKERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 4U)                  /*!< SCB CFSR (BFSR): STKERR Position */\n#define SCB_CFSR_STKERR_Msk               (1UL << SCB_CFSR_STKERR_Pos)                    /*!< SCB CFSR (BFSR): STKERR Mask */\n\n#define SCB_CFSR_UNSTKERR_Pos             (SCB_CFSR_BUSFAULTSR_Pos + 3U)                  /*!< SCB CFSR (BFSR): UNSTKERR Position */\n#define SCB_CFSR_UNSTKERR_Msk             (1UL << SCB_CFSR_UNSTKERR_Pos)                  /*!< SCB CFSR (BFSR): UNSTKERR Mask */\n\n#define SCB_CFSR_IMPRECISERR_Pos          (SCB_CFSR_BUSFAULTSR_Pos + 2U)                  /*!< SCB CFSR (BFSR): IMPRECISERR Position */\n#define SCB_CFSR_IMPRECISERR_Msk          (1UL << SCB_CFSR_IMPRECISERR_Pos)               /*!< SCB CFSR (BFSR): IMPRECISERR Mask */\n\n#define SCB_CFSR_PRECISERR_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 1U)                  /*!< SCB CFSR (BFSR): PRECISERR Position */\n#define SCB_CFSR_PRECISERR_Msk            (1UL << SCB_CFSR_PRECISERR_Pos)                 /*!< SCB CFSR (BFSR): PRECISERR Mask */\n\n#define SCB_CFSR_IBUSERR_Pos              (SCB_CFSR_BUSFAULTSR_Pos + 0U)                  /*!< SCB CFSR (BFSR): IBUSERR Position */\n#define SCB_CFSR_IBUSERR_Msk              (1UL << SCB_CFSR_IBUSERR_Pos)                   /*!< SCB CFSR (BFSR): IBUSERR Mask */\n\n/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_DIVBYZERO_Pos            (SCB_CFSR_USGFAULTSR_Pos + 9U)                  /*!< SCB CFSR (UFSR): DIVBYZERO Position */\n#define SCB_CFSR_DIVBYZERO_Msk            (1UL << SCB_CFSR_DIVBYZERO_Pos)                 /*!< SCB CFSR (UFSR): DIVBYZERO Mask */\n\n#define SCB_CFSR_UNALIGNED_Pos            (SCB_CFSR_USGFAULTSR_Pos + 8U)                  /*!< SCB CFSR (UFSR): UNALIGNED Position */\n#define SCB_CFSR_UNALIGNED_Msk            (1UL << SCB_CFSR_UNALIGNED_Pos)                 /*!< SCB CFSR (UFSR): UNALIGNED Mask */\n\n#define SCB_CFSR_STKOF_Pos                (SCB_CFSR_USGFAULTSR_Pos + 4U)                  /*!< SCB CFSR (UFSR): STKOF Position */\n#define SCB_CFSR_STKOF_Msk                (1UL << SCB_CFSR_STKOF_Pos)                     /*!< SCB CFSR (UFSR): STKOF Mask */\n\n#define SCB_CFSR_NOCP_Pos                 (SCB_CFSR_USGFAULTSR_Pos + 3U)                  /*!< SCB CFSR (UFSR): NOCP Position */\n#define SCB_CFSR_NOCP_Msk                 (1UL << SCB_CFSR_NOCP_Pos)                      /*!< SCB CFSR (UFSR): NOCP Mask */\n\n#define SCB_CFSR_INVPC_Pos                (SCB_CFSR_USGFAULTSR_Pos + 2U)                  /*!< SCB CFSR (UFSR): INVPC Position */\n#define SCB_CFSR_INVPC_Msk                (1UL << SCB_CFSR_INVPC_Pos)                     /*!< SCB CFSR (UFSR): INVPC Mask */\n\n#define SCB_CFSR_INVSTATE_Pos             (SCB_CFSR_USGFAULTSR_Pos + 1U)                  /*!< SCB CFSR (UFSR): INVSTATE Position */\n#define SCB_CFSR_INVSTATE_Msk             (1UL << SCB_CFSR_INVSTATE_Pos)                  /*!< SCB CFSR (UFSR): INVSTATE Mask */\n\n#define SCB_CFSR_UNDEFINSTR_Pos           (SCB_CFSR_USGFAULTSR_Pos + 0U)                  /*!< SCB CFSR (UFSR): UNDEFINSTR Position */\n#define SCB_CFSR_UNDEFINSTR_Msk           (1UL << SCB_CFSR_UNDEFINSTR_Pos)                /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */\n\n/* SCB Hard Fault Status Register Definitions */\n#define SCB_HFSR_DEBUGEVT_Pos              31U                                            /*!< SCB HFSR: DEBUGEVT Position */\n#define SCB_HFSR_DEBUGEVT_Msk              (1UL << SCB_HFSR_DEBUGEVT_Pos)                 /*!< SCB HFSR: DEBUGEVT Mask */\n\n#define SCB_HFSR_FORCED_Pos                30U                                            /*!< SCB HFSR: FORCED Position */\n#define SCB_HFSR_FORCED_Msk                (1UL << SCB_HFSR_FORCED_Pos)                   /*!< SCB HFSR: FORCED Mask */\n\n#define SCB_HFSR_VECTTBL_Pos                1U                                            /*!< SCB HFSR: VECTTBL Position */\n#define SCB_HFSR_VECTTBL_Msk               (1UL << SCB_HFSR_VECTTBL_Pos)                  /*!< SCB HFSR: VECTTBL Mask */\n\n/* SCB Debug Fault Status Register Definitions */\n#define SCB_DFSR_EXTERNAL_Pos               4U                                            /*!< SCB DFSR: EXTERNAL Position */\n#define SCB_DFSR_EXTERNAL_Msk              (1UL << SCB_DFSR_EXTERNAL_Pos)                 /*!< SCB DFSR: EXTERNAL Mask */\n\n#define SCB_DFSR_VCATCH_Pos                 3U                                            /*!< SCB DFSR: VCATCH Position */\n#define SCB_DFSR_VCATCH_Msk                (1UL << SCB_DFSR_VCATCH_Pos)                   /*!< SCB DFSR: VCATCH Mask */\n\n#define SCB_DFSR_DWTTRAP_Pos                2U                                            /*!< SCB DFSR: DWTTRAP Position */\n#define SCB_DFSR_DWTTRAP_Msk               (1UL << SCB_DFSR_DWTTRAP_Pos)                  /*!< SCB DFSR: DWTTRAP Mask */\n\n#define SCB_DFSR_BKPT_Pos                   1U                                            /*!< SCB DFSR: BKPT Position */\n#define SCB_DFSR_BKPT_Msk                  (1UL << SCB_DFSR_BKPT_Pos)                     /*!< SCB DFSR: BKPT Mask */\n\n#define SCB_DFSR_HALTED_Pos                 0U                                            /*!< SCB DFSR: HALTED Position */\n#define SCB_DFSR_HALTED_Msk                (1UL /*<< SCB_DFSR_HALTED_Pos*/)               /*!< SCB DFSR: HALTED Mask */\n\n/* SCB Non-Secure Access Control Register Definitions */\n#define SCB_NSACR_CP11_Pos                 11U                                            /*!< SCB NSACR: CP11 Position */\n#define SCB_NSACR_CP11_Msk                 (1UL << SCB_NSACR_CP11_Pos)                    /*!< SCB NSACR: CP11 Mask */\n\n#define SCB_NSACR_CP10_Pos                 10U                                            /*!< SCB NSACR: CP10 Position */\n#define SCB_NSACR_CP10_Msk                 (1UL << SCB_NSACR_CP10_Pos)                    /*!< SCB NSACR: CP10 Mask */\n\n#define SCB_NSACR_CPn_Pos                   0U                                            /*!< SCB NSACR: CPn Position */\n#define SCB_NSACR_CPn_Msk                  (1UL /*<< SCB_NSACR_CPn_Pos*/)                 /*!< SCB NSACR: CPn Mask */\n\n/* SCB Cache Level ID Register Definitions */\n#define SCB_CLIDR_LOUU_Pos                 27U                                            /*!< SCB CLIDR: LoUU Position */\n#define SCB_CLIDR_LOUU_Msk                 (7UL << SCB_CLIDR_LOUU_Pos)                    /*!< SCB CLIDR: LoUU Mask */\n\n#define SCB_CLIDR_LOC_Pos                  24U                                            /*!< SCB CLIDR: LoC Position */\n#define SCB_CLIDR_LOC_Msk                  (7UL << SCB_CLIDR_LOC_Pos)                     /*!< SCB CLIDR: LoC Mask */\n\n/* SCB Cache Type Register Definitions */\n#define SCB_CTR_FORMAT_Pos                 29U                                            /*!< SCB CTR: Format Position */\n#define SCB_CTR_FORMAT_Msk                 (7UL << SCB_CTR_FORMAT_Pos)                    /*!< SCB CTR: Format Mask */\n\n#define SCB_CTR_CWG_Pos                    24U                                            /*!< SCB CTR: CWG Position */\n#define SCB_CTR_CWG_Msk                    (0xFUL << SCB_CTR_CWG_Pos)                     /*!< SCB CTR: CWG Mask */\n\n#define SCB_CTR_ERG_Pos                    20U                                            /*!< SCB CTR: ERG Position */\n#define SCB_CTR_ERG_Msk                    (0xFUL << SCB_CTR_ERG_Pos)                     /*!< SCB CTR: ERG Mask */\n\n#define SCB_CTR_DMINLINE_Pos               16U                                            /*!< SCB CTR: DminLine Position */\n#define SCB_CTR_DMINLINE_Msk               (0xFUL << SCB_CTR_DMINLINE_Pos)                /*!< SCB CTR: DminLine Mask */\n\n#define SCB_CTR_IMINLINE_Pos                0U                                            /*!< SCB CTR: ImInLine Position */\n#define SCB_CTR_IMINLINE_Msk               (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/)            /*!< SCB CTR: ImInLine Mask */\n\n/* SCB Cache Size ID Register Definitions */\n#define SCB_CCSIDR_WT_Pos                  31U                                            /*!< SCB CCSIDR: WT Position */\n#define SCB_CCSIDR_WT_Msk                  (1UL << SCB_CCSIDR_WT_Pos)                     /*!< SCB CCSIDR: WT Mask */\n\n#define SCB_CCSIDR_WB_Pos                  30U                                            /*!< SCB CCSIDR: WB Position */\n#define SCB_CCSIDR_WB_Msk                  (1UL << SCB_CCSIDR_WB_Pos)                     /*!< SCB CCSIDR: WB Mask */\n\n#define SCB_CCSIDR_RA_Pos                  29U                                            /*!< SCB CCSIDR: RA Position */\n#define SCB_CCSIDR_RA_Msk                  (1UL << SCB_CCSIDR_RA_Pos)                     /*!< SCB CCSIDR: RA Mask */\n\n#define SCB_CCSIDR_WA_Pos                  28U                                            /*!< SCB CCSIDR: WA Position */\n#define SCB_CCSIDR_WA_Msk                  (1UL << SCB_CCSIDR_WA_Pos)                     /*!< SCB CCSIDR: WA Mask */\n\n#define SCB_CCSIDR_NUMSETS_Pos             13U                                            /*!< SCB CCSIDR: NumSets Position */\n#define SCB_CCSIDR_NUMSETS_Msk             (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos)           /*!< SCB CCSIDR: NumSets Mask */\n\n#define SCB_CCSIDR_ASSOCIATIVITY_Pos        3U                                            /*!< SCB CCSIDR: Associativity Position */\n#define SCB_CCSIDR_ASSOCIATIVITY_Msk       (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos)      /*!< SCB CCSIDR: Associativity Mask */\n\n#define SCB_CCSIDR_LINESIZE_Pos             0U                                            /*!< SCB CCSIDR: LineSize Position */\n#define SCB_CCSIDR_LINESIZE_Msk            (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/)           /*!< SCB CCSIDR: LineSize Mask */\n\n/* SCB Cache Size Selection Register Definitions */\n#define SCB_CSSELR_LEVEL_Pos                1U                                            /*!< SCB CSSELR: Level Position */\n#define SCB_CSSELR_LEVEL_Msk               (7UL << SCB_CSSELR_LEVEL_Pos)                  /*!< SCB CSSELR: Level Mask */\n\n#define SCB_CSSELR_IND_Pos                  0U                                            /*!< SCB CSSELR: InD Position */\n#define SCB_CSSELR_IND_Msk                 (1UL /*<< SCB_CSSELR_IND_Pos*/)                /*!< SCB CSSELR: InD Mask */\n\n/* SCB Software Triggered Interrupt Register Definitions */\n#define SCB_STIR_INTID_Pos                  0U                                            /*!< SCB STIR: INTID Position */\n#define SCB_STIR_INTID_Msk                 (0x1FFUL /*<< SCB_STIR_INTID_Pos*/)            /*!< SCB STIR: INTID Mask */\n\n/* SCB D-Cache Invalidate by Set-way Register Definitions */\n#define SCB_DCISW_WAY_Pos                  30U                                            /*!< SCB DCISW: Way Position */\n#define SCB_DCISW_WAY_Msk                  (3UL << SCB_DCISW_WAY_Pos)                     /*!< SCB DCISW: Way Mask */\n\n#define SCB_DCISW_SET_Pos                   5U                                            /*!< SCB DCISW: Set Position */\n#define SCB_DCISW_SET_Msk                  (0x1FFUL << SCB_DCISW_SET_Pos)                 /*!< SCB DCISW: Set Mask */\n\n/* SCB D-Cache Clean by Set-way Register Definitions */\n#define SCB_DCCSW_WAY_Pos                  30U                                            /*!< SCB DCCSW: Way Position */\n#define SCB_DCCSW_WAY_Msk                  (3UL << SCB_DCCSW_WAY_Pos)                     /*!< SCB DCCSW: Way Mask */\n\n#define SCB_DCCSW_SET_Pos                   5U                                            /*!< SCB DCCSW: Set Position */\n#define SCB_DCCSW_SET_Msk                  (0x1FFUL << SCB_DCCSW_SET_Pos)                 /*!< SCB DCCSW: Set Mask */\n\n/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */\n#define SCB_DCCISW_WAY_Pos                 30U                                            /*!< SCB DCCISW: Way Position */\n#define SCB_DCCISW_WAY_Msk                 (3UL << SCB_DCCISW_WAY_Pos)                    /*!< SCB DCCISW: Way Mask */\n\n#define SCB_DCCISW_SET_Pos                  5U                                            /*!< SCB DCCISW: Set Position */\n#define SCB_DCCISW_SET_Msk                 (0x1FFUL << SCB_DCCISW_SET_Pos)                /*!< SCB DCCISW: Set Mask */\n\n/* Instruction Tightly-Coupled Memory Control Register Definitions */\n#define SCB_ITCMCR_SZ_Pos                   3U                                            /*!< SCB ITCMCR: SZ Position */\n#define SCB_ITCMCR_SZ_Msk                  (0xFUL << SCB_ITCMCR_SZ_Pos)                   /*!< SCB ITCMCR: SZ Mask */\n\n#define SCB_ITCMCR_RETEN_Pos                2U                                            /*!< SCB ITCMCR: RETEN Position */\n#define SCB_ITCMCR_RETEN_Msk               (1UL << SCB_ITCMCR_RETEN_Pos)                  /*!< SCB ITCMCR: RETEN Mask */\n\n#define SCB_ITCMCR_RMW_Pos                  1U                                            /*!< SCB ITCMCR: RMW Position */\n#define SCB_ITCMCR_RMW_Msk                 (1UL << SCB_ITCMCR_RMW_Pos)                    /*!< SCB ITCMCR: RMW Mask */\n\n#define SCB_ITCMCR_EN_Pos                   0U                                            /*!< SCB ITCMCR: EN Position */\n#define SCB_ITCMCR_EN_Msk                  (1UL /*<< SCB_ITCMCR_EN_Pos*/)                 /*!< SCB ITCMCR: EN Mask */\n\n/* Data Tightly-Coupled Memory Control Register Definitions */\n#define SCB_DTCMCR_SZ_Pos                   3U                                            /*!< SCB DTCMCR: SZ Position */\n#define SCB_DTCMCR_SZ_Msk                  (0xFUL << SCB_DTCMCR_SZ_Pos)                   /*!< SCB DTCMCR: SZ Mask */\n\n#define SCB_DTCMCR_RETEN_Pos                2U                                            /*!< SCB DTCMCR: RETEN Position */\n#define SCB_DTCMCR_RETEN_Msk               (1UL << SCB_DTCMCR_RETEN_Pos)                   /*!< SCB DTCMCR: RETEN Mask */\n\n#define SCB_DTCMCR_RMW_Pos                  1U                                            /*!< SCB DTCMCR: RMW Position */\n#define SCB_DTCMCR_RMW_Msk                 (1UL << SCB_DTCMCR_RMW_Pos)                    /*!< SCB DTCMCR: RMW Mask */\n\n#define SCB_DTCMCR_EN_Pos                   0U                                            /*!< SCB DTCMCR: EN Position */\n#define SCB_DTCMCR_EN_Msk                  (1UL /*<< SCB_DTCMCR_EN_Pos*/)                 /*!< SCB DTCMCR: EN Mask */\n\n/* AHBP Control Register Definitions */\n#define SCB_AHBPCR_SZ_Pos                   1U                                            /*!< SCB AHBPCR: SZ Position */\n#define SCB_AHBPCR_SZ_Msk                  (7UL << SCB_AHBPCR_SZ_Pos)                     /*!< SCB AHBPCR: SZ Mask */\n\n#define SCB_AHBPCR_EN_Pos                   0U                                            /*!< SCB AHBPCR: EN Position */\n#define SCB_AHBPCR_EN_Msk                  (1UL /*<< SCB_AHBPCR_EN_Pos*/)                 /*!< SCB AHBPCR: EN Mask */\n\n/* L1 Cache Control Register Definitions */\n#define SCB_CACR_FORCEWT_Pos                2U                                            /*!< SCB CACR: FORCEWT Position */\n#define SCB_CACR_FORCEWT_Msk               (1UL << SCB_CACR_FORCEWT_Pos)                  /*!< SCB CACR: FORCEWT Mask */\n\n#define SCB_CACR_ECCEN_Pos                  1U                                            /*!< SCB CACR: ECCEN Position */\n#define SCB_CACR_ECCEN_Msk                 (1UL << SCB_CACR_ECCEN_Pos)                    /*!< SCB CACR: ECCEN Mask */\n\n#define SCB_CACR_SIWT_Pos                   0U                                            /*!< SCB CACR: SIWT Position */\n#define SCB_CACR_SIWT_Msk                  (1UL /*<< SCB_CACR_SIWT_Pos*/)                 /*!< SCB CACR: SIWT Mask */\n\n/* AHBS Control Register Definitions */\n#define SCB_AHBSCR_INITCOUNT_Pos           11U                                            /*!< SCB AHBSCR: INITCOUNT Position */\n#define SCB_AHBSCR_INITCOUNT_Msk           (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos)           /*!< SCB AHBSCR: INITCOUNT Mask */\n\n#define SCB_AHBSCR_TPRI_Pos                 2U                                            /*!< SCB AHBSCR: TPRI Position */\n#define SCB_AHBSCR_TPRI_Msk                (0x1FFUL << SCB_AHBPCR_TPRI_Pos)               /*!< SCB AHBSCR: TPRI Mask */\n\n#define SCB_AHBSCR_CTL_Pos                  0U                                            /*!< SCB AHBSCR: CTL Position*/\n#define SCB_AHBSCR_CTL_Msk                 (3UL /*<< SCB_AHBPCR_CTL_Pos*/)                /*!< SCB AHBSCR: CTL Mask */\n\n/* Auxiliary Bus Fault Status Register Definitions */\n#define SCB_ABFSR_AXIMTYPE_Pos              8U                                            /*!< SCB ABFSR: AXIMTYPE Position*/\n#define SCB_ABFSR_AXIMTYPE_Msk             (3UL << SCB_ABFSR_AXIMTYPE_Pos)                /*!< SCB ABFSR: AXIMTYPE Mask */\n\n#define SCB_ABFSR_EPPB_Pos                  4U                                            /*!< SCB ABFSR: EPPB Position*/\n#define SCB_ABFSR_EPPB_Msk                 (1UL << SCB_ABFSR_EPPB_Pos)                    /*!< SCB ABFSR: EPPB Mask */\n\n#define SCB_ABFSR_AXIM_Pos                  3U                                            /*!< SCB ABFSR: AXIM Position*/\n#define SCB_ABFSR_AXIM_Msk                 (1UL << SCB_ABFSR_AXIM_Pos)                    /*!< SCB ABFSR: AXIM Mask */\n\n#define SCB_ABFSR_AHBP_Pos                  2U                                            /*!< SCB ABFSR: AHBP Position*/\n#define SCB_ABFSR_AHBP_Msk                 (1UL << SCB_ABFSR_AHBP_Pos)                    /*!< SCB ABFSR: AHBP Mask */\n\n#define SCB_ABFSR_DTCM_Pos                  1U                                            /*!< SCB ABFSR: DTCM Position*/\n#define SCB_ABFSR_DTCM_Msk                 (1UL << SCB_ABFSR_DTCM_Pos)                    /*!< SCB ABFSR: DTCM Mask */\n\n#define SCB_ABFSR_ITCM_Pos                  0U                                            /*!< SCB ABFSR: ITCM Position*/\n#define SCB_ABFSR_ITCM_Msk                 (1UL /*<< SCB_ABFSR_ITCM_Pos*/)                /*!< SCB ABFSR: ITCM Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)\n  \\brief    Type definitions for the System Control and ID Register not in the SCB\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control and ID Register not in the SCB.\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IM  uint32_t ICTR;                   /*!< Offset: 0x004 (R/ )  Interrupt Controller Type Register */\n  __IOM uint32_t ACTLR;                  /*!< Offset: 0x008 (R/W)  Auxiliary Control Register */\n  __IOM uint32_t CPPWR;                  /*!< Offset: 0x00C (R/W)  Coprocessor Power Control  Register */\n} SCnSCB_Type;\n\n/* Interrupt Controller Type Register Definitions */\n#define SCnSCB_ICTR_INTLINESNUM_Pos         0U                                         /*!< ICTR: INTLINESNUM Position */\n#define SCnSCB_ICTR_INTLINESNUM_Msk        (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/)  /*!< ICTR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_SCnotSCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_ITM     Instrumentation Trace Macrocell (ITM)\n  \\brief    Type definitions for the Instrumentation Trace Macrocell (ITM)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Instrumentation Trace Macrocell Register (ITM).\n */\ntypedef struct\n{\n  __OM  union\n  {\n    __OM  uint8_t    u8;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit */\n    __OM  uint16_t   u16;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 16-bit */\n    __OM  uint32_t   u32;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 32-bit */\n  }  PORT [32U];                         /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers */\n        uint32_t RESERVED0[864U];\n  __IOM uint32_t TER;                    /*!< Offset: 0xE00 (R/W)  ITM Trace Enable Register */\n        uint32_t RESERVED1[15U];\n  __IOM uint32_t TPR;                    /*!< Offset: 0xE40 (R/W)  ITM Trace Privilege Register */\n        uint32_t RESERVED2[15U];\n  __IOM uint32_t TCR;                    /*!< Offset: 0xE80 (R/W)  ITM Trace Control Register */\n        uint32_t RESERVED3[29U];\n  __OM  uint32_t IWR;                    /*!< Offset: 0xEF8 ( /W)  ITM Integration Write Register */\n  __IM  uint32_t IRR;                    /*!< Offset: 0xEFC (R/ )  ITM Integration Read Register */\n  __IOM uint32_t IMCR;                   /*!< Offset: 0xF00 (R/W)  ITM Integration Mode Control Register */\n        uint32_t RESERVED4[43U];\n  __OM  uint32_t LAR;                    /*!< Offset: 0xFB0 ( /W)  ITM Lock Access Register */\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R/ )  ITM Lock Status Register */\n        uint32_t RESERVED5[1U];\n  __IM  uint32_t DEVARCH;                /*!< Offset: 0xFBC (R/ )  ITM Device Architecture Register */\n        uint32_t RESERVED6[4U];\n  __IM  uint32_t PID4;                   /*!< Offset: 0xFD0 (R/ )  ITM Peripheral Identification Register #4 */\n  __IM  uint32_t PID5;                   /*!< Offset: 0xFD4 (R/ )  ITM Peripheral Identification Register #5 */\n  __IM  uint32_t PID6;                   /*!< Offset: 0xFD8 (R/ )  ITM Peripheral Identification Register #6 */\n  __IM  uint32_t PID7;                   /*!< Offset: 0xFDC (R/ )  ITM Peripheral Identification Register #7 */\n  __IM  uint32_t PID0;                   /*!< Offset: 0xFE0 (R/ )  ITM Peripheral Identification Register #0 */\n  __IM  uint32_t PID1;                   /*!< Offset: 0xFE4 (R/ )  ITM Peripheral Identification Register #1 */\n  __IM  uint32_t PID2;                   /*!< Offset: 0xFE8 (R/ )  ITM Peripheral Identification Register #2 */\n  __IM  uint32_t PID3;                   /*!< Offset: 0xFEC (R/ )  ITM Peripheral Identification Register #3 */\n  __IM  uint32_t CID0;                   /*!< Offset: 0xFF0 (R/ )  ITM Component  Identification Register #0 */\n  __IM  uint32_t CID1;                   /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */\n  __IM  uint32_t CID2;                   /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */\n  __IM  uint32_t CID3;                   /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */\n} ITM_Type;\n\n/* ITM Stimulus Port Register Definitions */\n#define ITM_STIM_DISABLED_Pos               1U                                            /*!< ITM STIM: DISABLED Position */\n#define ITM_STIM_DISABLED_Msk              (0x1UL << ITM_STIM_DISABLED_Pos)               /*!< ITM STIM: DISABLED Mask */\n\n#define ITM_STIM_FIFOREADY_Pos              0U                                            /*!< ITM STIM: FIFOREADY Position */\n#define ITM_STIM_FIFOREADY_Msk             (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/)          /*!< ITM STIM: FIFOREADY Mask */\n\n/* ITM Trace Privilege Register Definitions */\n#define ITM_TPR_PRIVMASK_Pos                0U                                            /*!< ITM TPR: PRIVMASK Position */\n#define ITM_TPR_PRIVMASK_Msk               (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/)            /*!< ITM TPR: PRIVMASK Mask */\n\n/* ITM Trace Control Register Definitions */\n#define ITM_TCR_BUSY_Pos                   23U                                            /*!< ITM TCR: BUSY Position */\n#define ITM_TCR_BUSY_Msk                   (1UL << ITM_TCR_BUSY_Pos)                      /*!< ITM TCR: BUSY Mask */\n\n#define ITM_TCR_TRACEBUSID_Pos             16U                                            /*!< ITM TCR: ATBID Position */\n#define ITM_TCR_TRACEBUSID_Msk             (0x7FUL << ITM_TCR_TRACEBUSID_Pos)             /*!< ITM TCR: ATBID Mask */\n\n#define ITM_TCR_GTSFREQ_Pos                10U                                            /*!< ITM TCR: Global timestamp frequency Position */\n#define ITM_TCR_GTSFREQ_Msk                (3UL << ITM_TCR_GTSFREQ_Pos)                   /*!< ITM TCR: Global timestamp frequency Mask */\n\n#define ITM_TCR_TSPRESCALE_Pos              8U                                            /*!< ITM TCR: TSPRESCALE Position */\n#define ITM_TCR_TSPRESCALE_Msk             (3UL << ITM_TCR_TSPRESCALE_Pos)                /*!< ITM TCR: TSPRESCALE Mask */\n\n#define ITM_TCR_STALLENA_Pos                5U                                            /*!< ITM TCR: STALLENA Position */\n#define ITM_TCR_STALLENA_Msk               (1UL << ITM_TCR_STALLENA_Pos)                  /*!< ITM TCR: STALLENA Mask */\n\n#define ITM_TCR_SWOENA_Pos                  4U                                            /*!< ITM TCR: SWOENA Position */\n#define ITM_TCR_SWOENA_Msk                 (1UL << ITM_TCR_SWOENA_Pos)                    /*!< ITM TCR: SWOENA Mask */\n\n#define ITM_TCR_DWTENA_Pos                  3U                                            /*!< ITM TCR: DWTENA Position */\n#define ITM_TCR_DWTENA_Msk                 (1UL << ITM_TCR_DWTENA_Pos)                    /*!< ITM TCR: DWTENA Mask */\n\n#define ITM_TCR_SYNCENA_Pos                 2U                                            /*!< ITM TCR: SYNCENA Position */\n#define ITM_TCR_SYNCENA_Msk                (1UL << ITM_TCR_SYNCENA_Pos)                   /*!< ITM TCR: SYNCENA Mask */\n\n#define ITM_TCR_TSENA_Pos                   1U                                            /*!< ITM TCR: TSENA Position */\n#define ITM_TCR_TSENA_Msk                  (1UL << ITM_TCR_TSENA_Pos)                     /*!< ITM TCR: TSENA Mask */\n\n#define ITM_TCR_ITMENA_Pos                  0U                                            /*!< ITM TCR: ITM Enable bit Position */\n#define ITM_TCR_ITMENA_Msk                 (1UL /*<< ITM_TCR_ITMENA_Pos*/)                /*!< ITM TCR: ITM Enable bit Mask */\n\n/* ITM Integration Write Register Definitions */\n#define ITM_IWR_ATVALIDM_Pos                0U                                            /*!< ITM IWR: ATVALIDM Position */\n#define ITM_IWR_ATVALIDM_Msk               (1UL /*<< ITM_IWR_ATVALIDM_Pos*/)              /*!< ITM IWR: ATVALIDM Mask */\n\n/* ITM Integration Read Register Definitions */\n#define ITM_IRR_ATREADYM_Pos                0U                                            /*!< ITM IRR: ATREADYM Position */\n#define ITM_IRR_ATREADYM_Msk               (1UL /*<< ITM_IRR_ATREADYM_Pos*/)              /*!< ITM IRR: ATREADYM Mask */\n\n/* ITM Integration Mode Control Register Definitions */\n#define ITM_IMCR_INTEGRATION_Pos            0U                                            /*!< ITM IMCR: INTEGRATION Position */\n#define ITM_IMCR_INTEGRATION_Msk           (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/)          /*!< ITM IMCR: INTEGRATION Mask */\n\n/* ITM Lock Status Register Definitions */\n#define ITM_LSR_ByteAcc_Pos                 2U                                            /*!< ITM LSR: ByteAcc Position */\n#define ITM_LSR_ByteAcc_Msk                (1UL << ITM_LSR_ByteAcc_Pos)                   /*!< ITM LSR: ByteAcc Mask */\n\n#define ITM_LSR_Access_Pos                  1U                                            /*!< ITM LSR: Access Position */\n#define ITM_LSR_Access_Msk                 (1UL << ITM_LSR_Access_Pos)                    /*!< ITM LSR: Access Mask */\n\n#define ITM_LSR_Present_Pos                 0U                                            /*!< ITM LSR: Present Position */\n#define ITM_LSR_Present_Msk                (1UL /*<< ITM_LSR_Present_Pos*/)               /*!< ITM LSR: Present Mask */\n\n/*@}*/ /* end of group CMSIS_ITM */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)\n  \\brief    Type definitions for the Data Watchpoint and Trace (DWT)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Data Watchpoint and Trace Register (DWT).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  Control Register */\n  __IOM uint32_t CYCCNT;                 /*!< Offset: 0x004 (R/W)  Cycle Count Register */\n  __IOM uint32_t CPICNT;                 /*!< Offset: 0x008 (R/W)  CPI Count Register */\n  __IOM uint32_t EXCCNT;                 /*!< Offset: 0x00C (R/W)  Exception Overhead Count Register */\n  __IOM uint32_t SLEEPCNT;               /*!< Offset: 0x010 (R/W)  Sleep Count Register */\n  __IOM uint32_t LSUCNT;                 /*!< Offset: 0x014 (R/W)  LSU Count Register */\n  __IOM uint32_t FOLDCNT;                /*!< Offset: 0x018 (R/W)  Folded-instruction Count Register */\n  __IM  uint32_t PCSR;                   /*!< Offset: 0x01C (R/ )  Program Counter Sample Register */\n  __IOM uint32_t COMP0;                  /*!< Offset: 0x020 (R/W)  Comparator Register 0 */\n        uint32_t RESERVED1[1U];\n  __IOM uint32_t FUNCTION0;              /*!< Offset: 0x028 (R/W)  Function Register 0 */\n        uint32_t RESERVED2[1U];\n  __IOM uint32_t COMP1;                  /*!< Offset: 0x030 (R/W)  Comparator Register 1 */\n        uint32_t RESERVED3[1U];\n  __IOM uint32_t FUNCTION1;              /*!< Offset: 0x038 (R/W)  Function Register 1 */\n        uint32_t RESERVED4[1U];\n  __IOM uint32_t COMP2;                  /*!< Offset: 0x040 (R/W)  Comparator Register 2 */\n        uint32_t RESERVED5[1U];\n  __IOM uint32_t FUNCTION2;              /*!< Offset: 0x048 (R/W)  Function Register 2 */\n        uint32_t RESERVED6[1U];\n  __IOM uint32_t COMP3;                  /*!< Offset: 0x050 (R/W)  Comparator Register 3 */\n        uint32_t RESERVED7[1U];\n  __IOM uint32_t FUNCTION3;              /*!< Offset: 0x058 (R/W)  Function Register 3 */\n        uint32_t RESERVED8[1U];\n  __IOM uint32_t COMP4;                  /*!< Offset: 0x060 (R/W)  Comparator Register 4 */\n        uint32_t RESERVED9[1U];\n  __IOM uint32_t FUNCTION4;              /*!< Offset: 0x068 (R/W)  Function Register 4 */\n        uint32_t RESERVED10[1U];\n  __IOM uint32_t COMP5;                  /*!< Offset: 0x070 (R/W)  Comparator Register 5 */\n        uint32_t RESERVED11[1U];\n  __IOM uint32_t FUNCTION5;              /*!< Offset: 0x078 (R/W)  Function Register 5 */\n        uint32_t RESERVED12[1U];\n  __IOM uint32_t COMP6;                  /*!< Offset: 0x080 (R/W)  Comparator Register 6 */\n        uint32_t RESERVED13[1U];\n  __IOM uint32_t FUNCTION6;              /*!< Offset: 0x088 (R/W)  Function Register 6 */\n        uint32_t RESERVED14[1U];\n  __IOM uint32_t COMP7;                  /*!< Offset: 0x090 (R/W)  Comparator Register 7 */\n        uint32_t RESERVED15[1U];\n  __IOM uint32_t FUNCTION7;              /*!< Offset: 0x098 (R/W)  Function Register 7 */\n        uint32_t RESERVED16[1U];\n  __IOM uint32_t COMP8;                  /*!< Offset: 0x0A0 (R/W)  Comparator Register 8 */\n        uint32_t RESERVED17[1U];\n  __IOM uint32_t FUNCTION8;              /*!< Offset: 0x0A8 (R/W)  Function Register 8 */\n        uint32_t RESERVED18[1U];\n  __IOM uint32_t COMP9;                  /*!< Offset: 0x0B0 (R/W)  Comparator Register 9 */\n        uint32_t RESERVED19[1U];\n  __IOM uint32_t FUNCTION9;              /*!< Offset: 0x0B8 (R/W)  Function Register 9 */\n        uint32_t RESERVED20[1U];\n  __IOM uint32_t COMP10;                 /*!< Offset: 0x0C0 (R/W)  Comparator Register 10 */\n        uint32_t RESERVED21[1U];\n  __IOM uint32_t FUNCTION10;             /*!< Offset: 0x0C8 (R/W)  Function Register 10 */\n        uint32_t RESERVED22[1U];\n  __IOM uint32_t COMP11;                 /*!< Offset: 0x0D0 (R/W)  Comparator Register 11 */\n        uint32_t RESERVED23[1U];\n  __IOM uint32_t FUNCTION11;             /*!< Offset: 0x0D8 (R/W)  Function Register 11 */\n        uint32_t RESERVED24[1U];\n  __IOM uint32_t COMP12;                 /*!< Offset: 0x0E0 (R/W)  Comparator Register 12 */\n        uint32_t RESERVED25[1U];\n  __IOM uint32_t FUNCTION12;             /*!< Offset: 0x0E8 (R/W)  Function Register 12 */\n        uint32_t RESERVED26[1U];\n  __IOM uint32_t COMP13;                 /*!< Offset: 0x0F0 (R/W)  Comparator Register 13 */\n        uint32_t RESERVED27[1U];\n  __IOM uint32_t FUNCTION13;             /*!< Offset: 0x0F8 (R/W)  Function Register 13 */\n        uint32_t RESERVED28[1U];\n  __IOM uint32_t COMP14;                 /*!< Offset: 0x100 (R/W)  Comparator Register 14 */\n        uint32_t RESERVED29[1U];\n  __IOM uint32_t FUNCTION14;             /*!< Offset: 0x108 (R/W)  Function Register 14 */\n        uint32_t RESERVED30[1U];\n  __IOM uint32_t COMP15;                 /*!< Offset: 0x110 (R/W)  Comparator Register 15 */\n        uint32_t RESERVED31[1U];\n  __IOM uint32_t FUNCTION15;             /*!< Offset: 0x118 (R/W)  Function Register 15 */\n        uint32_t RESERVED32[934U];\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R  )  Lock Status Register */\n        uint32_t RESERVED33[1U];\n  __IM  uint32_t DEVARCH;                /*!< Offset: 0xFBC (R/ )  Device Architecture Register */\n} DWT_Type;\n\n/* DWT Control Register Definitions */\n#define DWT_CTRL_NUMCOMP_Pos               28U                                         /*!< DWT CTRL: NUMCOMP Position */\n#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */\n\n#define DWT_CTRL_NOTRCPKT_Pos              27U                                         /*!< DWT CTRL: NOTRCPKT Position */\n#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */\n\n#define DWT_CTRL_NOEXTTRIG_Pos             26U                                         /*!< DWT CTRL: NOEXTTRIG Position */\n#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */\n\n#define DWT_CTRL_NOCYCCNT_Pos              25U                                         /*!< DWT CTRL: NOCYCCNT Position */\n#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */\n\n#define DWT_CTRL_NOPRFCNT_Pos              24U                                         /*!< DWT CTRL: NOPRFCNT Position */\n#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */\n\n#define DWT_CTRL_CYCDISS_Pos               23U                                         /*!< DWT CTRL: CYCDISS Position */\n#define DWT_CTRL_CYCDISS_Msk               (0x1UL << DWT_CTRL_CYCDISS_Pos)             /*!< DWT CTRL: CYCDISS Mask */\n\n#define DWT_CTRL_CYCEVTENA_Pos             22U                                         /*!< DWT CTRL: CYCEVTENA Position */\n#define DWT_CTRL_CYCEVTENA_Msk             (0x1UL << DWT_CTRL_CYCEVTENA_Pos)           /*!< DWT CTRL: CYCEVTENA Mask */\n\n#define DWT_CTRL_FOLDEVTENA_Pos            21U                                         /*!< DWT CTRL: FOLDEVTENA Position */\n#define DWT_CTRL_FOLDEVTENA_Msk            (0x1UL << DWT_CTRL_FOLDEVTENA_Pos)          /*!< DWT CTRL: FOLDEVTENA Mask */\n\n#define DWT_CTRL_LSUEVTENA_Pos             20U                                         /*!< DWT CTRL: LSUEVTENA Position */\n#define DWT_CTRL_LSUEVTENA_Msk             (0x1UL << DWT_CTRL_LSUEVTENA_Pos)           /*!< DWT CTRL: LSUEVTENA Mask */\n\n#define DWT_CTRL_SLEEPEVTENA_Pos           19U                                         /*!< DWT CTRL: SLEEPEVTENA Position */\n#define DWT_CTRL_SLEEPEVTENA_Msk           (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos)         /*!< DWT CTRL: SLEEPEVTENA Mask */\n\n#define DWT_CTRL_EXCEVTENA_Pos             18U                                         /*!< DWT CTRL: EXCEVTENA Position */\n#define DWT_CTRL_EXCEVTENA_Msk             (0x1UL << DWT_CTRL_EXCEVTENA_Pos)           /*!< DWT CTRL: EXCEVTENA Mask */\n\n#define DWT_CTRL_CPIEVTENA_Pos             17U                                         /*!< DWT CTRL: CPIEVTENA Position */\n#define DWT_CTRL_CPIEVTENA_Msk             (0x1UL << DWT_CTRL_CPIEVTENA_Pos)           /*!< DWT CTRL: CPIEVTENA Mask */\n\n#define DWT_CTRL_EXCTRCENA_Pos             16U                                         /*!< DWT CTRL: EXCTRCENA Position */\n#define DWT_CTRL_EXCTRCENA_Msk             (0x1UL << DWT_CTRL_EXCTRCENA_Pos)           /*!< DWT CTRL: EXCTRCENA Mask */\n\n#define DWT_CTRL_PCSAMPLENA_Pos            12U                                         /*!< DWT CTRL: PCSAMPLENA Position */\n#define DWT_CTRL_PCSAMPLENA_Msk            (0x1UL << DWT_CTRL_PCSAMPLENA_Pos)          /*!< DWT CTRL: PCSAMPLENA Mask */\n\n#define DWT_CTRL_SYNCTAP_Pos               10U                                         /*!< DWT CTRL: SYNCTAP Position */\n#define DWT_CTRL_SYNCTAP_Msk               (0x3UL << DWT_CTRL_SYNCTAP_Pos)             /*!< DWT CTRL: SYNCTAP Mask */\n\n#define DWT_CTRL_CYCTAP_Pos                 9U                                         /*!< DWT CTRL: CYCTAP Position */\n#define DWT_CTRL_CYCTAP_Msk                (0x1UL << DWT_CTRL_CYCTAP_Pos)              /*!< DWT CTRL: CYCTAP Mask */\n\n#define DWT_CTRL_POSTINIT_Pos               5U                                         /*!< DWT CTRL: POSTINIT Position */\n#define DWT_CTRL_POSTINIT_Msk              (0xFUL << DWT_CTRL_POSTINIT_Pos)            /*!< DWT CTRL: POSTINIT Mask */\n\n#define DWT_CTRL_POSTPRESET_Pos             1U                                         /*!< DWT CTRL: POSTPRESET Position */\n#define DWT_CTRL_POSTPRESET_Msk            (0xFUL << DWT_CTRL_POSTPRESET_Pos)          /*!< DWT CTRL: POSTPRESET Mask */\n\n#define DWT_CTRL_CYCCNTENA_Pos              0U                                         /*!< DWT CTRL: CYCCNTENA Position */\n#define DWT_CTRL_CYCCNTENA_Msk             (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/)       /*!< DWT CTRL: CYCCNTENA Mask */\n\n/* DWT CPI Count Register Definitions */\n#define DWT_CPICNT_CPICNT_Pos               0U                                         /*!< DWT CPICNT: CPICNT Position */\n#define DWT_CPICNT_CPICNT_Msk              (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/)       /*!< DWT CPICNT: CPICNT Mask */\n\n/* DWT Exception Overhead Count Register Definitions */\n#define DWT_EXCCNT_EXCCNT_Pos               0U                                         /*!< DWT EXCCNT: EXCCNT Position */\n#define DWT_EXCCNT_EXCCNT_Msk              (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/)       /*!< DWT EXCCNT: EXCCNT Mask */\n\n/* DWT Sleep Count Register Definitions */\n#define DWT_SLEEPCNT_SLEEPCNT_Pos           0U                                         /*!< DWT SLEEPCNT: SLEEPCNT Position */\n#define DWT_SLEEPCNT_SLEEPCNT_Msk          (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/)   /*!< DWT SLEEPCNT: SLEEPCNT Mask */\n\n/* DWT LSU Count Register Definitions */\n#define DWT_LSUCNT_LSUCNT_Pos               0U                                         /*!< DWT LSUCNT: LSUCNT Position */\n#define DWT_LSUCNT_LSUCNT_Msk              (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/)       /*!< DWT LSUCNT: LSUCNT Mask */\n\n/* DWT Folded-instruction Count Register Definitions */\n#define DWT_FOLDCNT_FOLDCNT_Pos             0U                                         /*!< DWT FOLDCNT: FOLDCNT Position */\n#define DWT_FOLDCNT_FOLDCNT_Msk            (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/)     /*!< DWT FOLDCNT: FOLDCNT Mask */\n\n/* DWT Comparator Function Register Definitions */\n#define DWT_FUNCTION_ID_Pos                27U                                         /*!< DWT FUNCTION: ID Position */\n#define DWT_FUNCTION_ID_Msk                (0x1FUL << DWT_FUNCTION_ID_Pos)             /*!< DWT FUNCTION: ID Mask */\n\n#define DWT_FUNCTION_MATCHED_Pos           24U                                         /*!< DWT FUNCTION: MATCHED Position */\n#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */\n\n#define DWT_FUNCTION_DATAVSIZE_Pos         10U                                         /*!< DWT FUNCTION: DATAVSIZE Position */\n#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */\n\n#define DWT_FUNCTION_ACTION_Pos             4U                                         /*!< DWT FUNCTION: ACTION Position */\n#define DWT_FUNCTION_ACTION_Msk            (0x1UL << DWT_FUNCTION_ACTION_Pos)          /*!< DWT FUNCTION: ACTION Mask */\n\n#define DWT_FUNCTION_MATCH_Pos              0U                                         /*!< DWT FUNCTION: MATCH Position */\n#define DWT_FUNCTION_MATCH_Msk             (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/)       /*!< DWT FUNCTION: MATCH Mask */\n\n/*@}*/ /* end of group CMSIS_DWT */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_TPI     Trace Port Interface (TPI)\n  \\brief    Type definitions for the Trace Port Interface (TPI)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Trace Port Interface Register (TPI).\n */\ntypedef struct\n{\n  __IOM uint32_t SSPSR;                  /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register */\n  __IOM uint32_t CSPSR;                  /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */\n        uint32_t RESERVED0[2U];\n  __IOM uint32_t ACPR;                   /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */\n        uint32_t RESERVED1[55U];\n  __IOM uint32_t SPPR;                   /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */\n        uint32_t RESERVED2[131U];\n  __IM  uint32_t FFSR;                   /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */\n  __IOM uint32_t FFCR;                   /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */\n  __IM  uint32_t FSCR;                   /*!< Offset: 0x308 (R/ )  Formatter Synchronization Counter Register */\n        uint32_t RESERVED3[759U];\n  __IM  uint32_t TRIGGER;                /*!< Offset: 0xEE8 (R/ )  TRIGGER */\n  __IM  uint32_t FIFO0;                  /*!< Offset: 0xEEC (R/ )  Integration ETM Data */\n  __IM  uint32_t ITATBCTR2;              /*!< Offset: 0xEF0 (R/ )  ITATBCTR2 */\n        uint32_t RESERVED4[1U];\n  __IM  uint32_t ITATBCTR0;              /*!< Offset: 0xEF8 (R/ )  ITATBCTR0 */\n  __IM  uint32_t FIFO1;                  /*!< Offset: 0xEFC (R/ )  Integration ITM Data */\n  __IOM uint32_t ITCTRL;                 /*!< Offset: 0xF00 (R/W)  Integration Mode Control */\n        uint32_t RESERVED5[39U];\n  __IOM uint32_t CLAIMSET;               /*!< Offset: 0xFA0 (R/W)  Claim tag set */\n  __IOM uint32_t CLAIMCLR;               /*!< Offset: 0xFA4 (R/W)  Claim tag clear */\n        uint32_t RESERVED7[8U];\n  __IM  uint32_t DEVID;                  /*!< Offset: 0xFC8 (R/ )  TPIU_DEVID */\n  __IM  uint32_t DEVTYPE;                /*!< Offset: 0xFCC (R/ )  TPIU_DEVTYPE */\n} TPI_Type;\n\n/* TPI Asynchronous Clock Prescaler Register Definitions */\n#define TPI_ACPR_PRESCALER_Pos              0U                                         /*!< TPI ACPR: PRESCALER Position */\n#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/)    /*!< TPI ACPR: PRESCALER Mask */\n\n/* TPI Selected Pin Protocol Register Definitions */\n#define TPI_SPPR_TXMODE_Pos                 0U                                         /*!< TPI SPPR: TXMODE Position */\n#define TPI_SPPR_TXMODE_Msk                (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/)          /*!< TPI SPPR: TXMODE Mask */\n\n/* TPI Formatter and Flush Status Register Definitions */\n#define TPI_FFSR_FtNonStop_Pos              3U                                         /*!< TPI FFSR: FtNonStop Position */\n#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */\n\n#define TPI_FFSR_TCPresent_Pos              2U                                         /*!< TPI FFSR: TCPresent Position */\n#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */\n\n#define TPI_FFSR_FtStopped_Pos              1U                                         /*!< TPI FFSR: FtStopped Position */\n#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */\n\n#define TPI_FFSR_FlInProg_Pos               0U                                         /*!< TPI FFSR: FlInProg Position */\n#define TPI_FFSR_FlInProg_Msk              (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/)        /*!< TPI FFSR: FlInProg Mask */\n\n/* TPI Formatter and Flush Control Register Definitions */\n#define TPI_FFCR_TrigIn_Pos                 8U                                         /*!< TPI FFCR: TrigIn Position */\n#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */\n\n#define TPI_FFCR_EnFCont_Pos                1U                                         /*!< TPI FFCR: EnFCont Position */\n#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */\n\n/* TPI TRIGGER Register Definitions */\n#define TPI_TRIGGER_TRIGGER_Pos             0U                                         /*!< TPI TRIGGER: TRIGGER Position */\n#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/)      /*!< TPI TRIGGER: TRIGGER Mask */\n\n/* TPI Integration ETM Data Register Definitions (FIFO0) */\n#define TPI_FIFO0_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO0: ITM_ATVALID Position */\n#define TPI_FIFO0_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos)        /*!< TPI FIFO0: ITM_ATVALID Mask */\n\n#define TPI_FIFO0_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO0: ITM_bytecount Position */\n#define TPI_FIFO0_ITM_bytecount_Msk        (0x3UL << TPI_FIFO0_ITM_bytecount_Pos)      /*!< TPI FIFO0: ITM_bytecount Mask */\n\n#define TPI_FIFO0_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO0: ETM_ATVALID Position */\n#define TPI_FIFO0_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos)        /*!< TPI FIFO0: ETM_ATVALID Mask */\n\n#define TPI_FIFO0_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO0: ETM_bytecount Position */\n#define TPI_FIFO0_ETM_bytecount_Msk        (0x3UL << TPI_FIFO0_ETM_bytecount_Pos)      /*!< TPI FIFO0: ETM_bytecount Mask */\n\n#define TPI_FIFO0_ETM2_Pos                 16U                                         /*!< TPI FIFO0: ETM2 Position */\n#define TPI_FIFO0_ETM2_Msk                 (0xFFUL << TPI_FIFO0_ETM2_Pos)              /*!< TPI FIFO0: ETM2 Mask */\n\n#define TPI_FIFO0_ETM1_Pos                  8U                                         /*!< TPI FIFO0: ETM1 Position */\n#define TPI_FIFO0_ETM1_Msk                 (0xFFUL << TPI_FIFO0_ETM1_Pos)              /*!< TPI FIFO0: ETM1 Mask */\n\n#define TPI_FIFO0_ETM0_Pos                  0U                                         /*!< TPI FIFO0: ETM0 Position */\n#define TPI_FIFO0_ETM0_Msk                 (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/)          /*!< TPI FIFO0: ETM0 Mask */\n\n/* TPI ITATBCTR2 Register Definitions */\n#define TPI_ITATBCTR2_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR2: ATREADY Position */\n#define TPI_ITATBCTR2_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/)    /*!< TPI ITATBCTR2: ATREADY Mask */\n\n/* TPI Integration ITM Data Register Definitions (FIFO1) */\n#define TPI_FIFO1_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO1: ITM_ATVALID Position */\n#define TPI_FIFO1_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos)        /*!< TPI FIFO1: ITM_ATVALID Mask */\n\n#define TPI_FIFO1_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO1: ITM_bytecount Position */\n#define TPI_FIFO1_ITM_bytecount_Msk        (0x3UL << TPI_FIFO1_ITM_bytecount_Pos)      /*!< TPI FIFO1: ITM_bytecount Mask */\n\n#define TPI_FIFO1_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO1: ETM_ATVALID Position */\n#define TPI_FIFO1_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos)        /*!< TPI FIFO1: ETM_ATVALID Mask */\n\n#define TPI_FIFO1_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO1: ETM_bytecount Position */\n#define TPI_FIFO1_ETM_bytecount_Msk        (0x3UL << TPI_FIFO1_ETM_bytecount_Pos)      /*!< TPI FIFO1: ETM_bytecount Mask */\n\n#define TPI_FIFO1_ITM2_Pos                 16U                                         /*!< TPI FIFO1: ITM2 Position */\n#define TPI_FIFO1_ITM2_Msk                 (0xFFUL << TPI_FIFO1_ITM2_Pos)              /*!< TPI FIFO1: ITM2 Mask */\n\n#define TPI_FIFO1_ITM1_Pos                  8U                                         /*!< TPI FIFO1: ITM1 Position */\n#define TPI_FIFO1_ITM1_Msk                 (0xFFUL << TPI_FIFO1_ITM1_Pos)              /*!< TPI FIFO1: ITM1 Mask */\n\n#define TPI_FIFO1_ITM0_Pos                  0U                                         /*!< TPI FIFO1: ITM0 Position */\n#define TPI_FIFO1_ITM0_Msk                 (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/)          /*!< TPI FIFO1: ITM0 Mask */\n\n/* TPI ITATBCTR0 Register Definitions */\n#define TPI_ITATBCTR0_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR0: ATREADY Position */\n#define TPI_ITATBCTR0_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/)    /*!< TPI ITATBCTR0: ATREADY Mask */\n\n/* TPI Integration Mode Control Register Definitions */\n#define TPI_ITCTRL_Mode_Pos                 0U                                         /*!< TPI ITCTRL: Mode Position */\n#define TPI_ITCTRL_Mode_Msk                (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/)          /*!< TPI ITCTRL: Mode Mask */\n\n/* TPI DEVID Register Definitions */\n#define TPI_DEVID_NRZVALID_Pos             11U                                         /*!< TPI DEVID: NRZVALID Position */\n#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */\n\n#define TPI_DEVID_MANCVALID_Pos            10U                                         /*!< TPI DEVID: MANCVALID Position */\n#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */\n\n#define TPI_DEVID_PTINVALID_Pos             9U                                         /*!< TPI DEVID: PTINVALID Position */\n#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */\n\n#define TPI_DEVID_MinBufSz_Pos              6U                                         /*!< TPI DEVID: MinBufSz Position */\n#define TPI_DEVID_MinBufSz_Msk             (0x7UL << TPI_DEVID_MinBufSz_Pos)           /*!< TPI DEVID: MinBufSz Mask */\n\n#define TPI_DEVID_AsynClkIn_Pos             5U                                         /*!< TPI DEVID: AsynClkIn Position */\n#define TPI_DEVID_AsynClkIn_Msk            (0x1UL << TPI_DEVID_AsynClkIn_Pos)          /*!< TPI DEVID: AsynClkIn Mask */\n\n#define TPI_DEVID_NrTraceInput_Pos          0U                                         /*!< TPI DEVID: NrTraceInput Position */\n#define TPI_DEVID_NrTraceInput_Msk         (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/)  /*!< TPI DEVID: NrTraceInput Mask */\n\n/* TPI DEVTYPE Register Definitions */\n#define TPI_DEVTYPE_MajorType_Pos           4U                                         /*!< TPI DEVTYPE: MajorType Position */\n#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */\n\n#define TPI_DEVTYPE_SubType_Pos             0U                                         /*!< TPI DEVTYPE: SubType Position */\n#define TPI_DEVTYPE_SubType_Msk            (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/)      /*!< TPI DEVTYPE: SubType Mask */\n\n/*@}*/ /* end of group CMSIS_TPI */\n\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region Number Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  MPU Region Limit Address Register */\n  __IOM uint32_t RBAR_A1;                /*!< Offset: 0x014 (R/W)  MPU Region Base Address Register Alias 1 */\n  __IOM uint32_t RLAR_A1;                /*!< Offset: 0x018 (R/W)  MPU Region Limit Address Register Alias 1 */\n  __IOM uint32_t RBAR_A2;                /*!< Offset: 0x01C (R/W)  MPU Region Base Address Register Alias 2 */\n  __IOM uint32_t RLAR_A2;                /*!< Offset: 0x020 (R/W)  MPU Region Limit Address Register Alias 2 */\n  __IOM uint32_t RBAR_A3;                /*!< Offset: 0x024 (R/W)  MPU Region Base Address Register Alias 3 */\n  __IOM uint32_t RLAR_A3;                /*!< Offset: 0x028 (R/W)  MPU Region Limit Address Register Alias 3 */\n        uint32_t RESERVED0[1];\n  __IOM uint32_t MAIR0;                  /*!< Offset: 0x030 (R/W)  MPU Memory Attribute Indirection Register 0 */\n  __IOM uint32_t MAIR1;                  /*!< Offset: 0x034 (R/W)  MPU Memory Attribute Indirection Register 1 */\n} MPU_Type;\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_ADDR_Pos                   5U                                            /*!< MPU RBAR: ADDR Position */\n#define MPU_RBAR_ADDR_Msk                  (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos)             /*!< MPU RBAR: ADDR Mask */\n\n#define MPU_RBAR_SH_Pos                     3U                                            /*!< MPU RBAR: SH Position */\n#define MPU_RBAR_SH_Msk                    (0x3UL << MPU_RBAR_SH_Pos)                     /*!< MPU RBAR: SH Mask */\n\n#define MPU_RBAR_AP_Pos                     1U                                            /*!< MPU RBAR: AP Position */\n#define MPU_RBAR_AP_Msk                    (0x3UL << MPU_RBAR_AP_Pos)                     /*!< MPU RBAR: AP Mask */\n\n#define MPU_RBAR_XN_Pos                     0U                                            /*!< MPU RBAR: XN Position */\n#define MPU_RBAR_XN_Msk                    (01UL /*<< MPU_RBAR_XN_Pos*/)                  /*!< MPU RBAR: XN Mask */\n\n/* MPU Region Limit Address Register Definitions */\n#define MPU_RLAR_LIMIT_Pos                  5U                                            /*!< MPU RLAR: LIMIT Position */\n#define MPU_RLAR_LIMIT_Msk                 (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos)            /*!< MPU RLAR: LIMIT Mask */\n\n#define MPU_RLAR_AttrIndx_Pos               1U                                            /*!< MPU RLAR: AttrIndx Position */\n#define MPU_RLAR_AttrIndx_Msk              (0x7UL << MPU_RLAR_AttrIndx_Pos)               /*!< MPU RLAR: AttrIndx Mask */\n\n#define MPU_RLAR_EN_Pos                     0U                                            /*!< MPU RLAR: Region enable bit Position */\n#define MPU_RLAR_EN_Msk                    (1UL /*<< MPU_RLAR_EN_Pos*/)                   /*!< MPU RLAR: Region enable bit Disable Mask */\n\n/* MPU Memory Attribute Indirection Register 0 Definitions */\n#define MPU_MAIR0_Attr3_Pos                24U                                            /*!< MPU MAIR0: Attr3 Position */\n#define MPU_MAIR0_Attr3_Msk                (0xFFUL << MPU_MAIR0_Attr3_Pos)                /*!< MPU MAIR0: Attr3 Mask */\n\n#define MPU_MAIR0_Attr2_Pos                16U                                            /*!< MPU MAIR0: Attr2 Position */\n#define MPU_MAIR0_Attr2_Msk                (0xFFUL << MPU_MAIR0_Attr2_Pos)                /*!< MPU MAIR0: Attr2 Mask */\n\n#define MPU_MAIR0_Attr1_Pos                 8U                                            /*!< MPU MAIR0: Attr1 Position */\n#define MPU_MAIR0_Attr1_Msk                (0xFFUL << MPU_MAIR0_Attr1_Pos)                /*!< MPU MAIR0: Attr1 Mask */\n\n#define MPU_MAIR0_Attr0_Pos                 0U                                            /*!< MPU MAIR0: Attr0 Position */\n#define MPU_MAIR0_Attr0_Msk                (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/)            /*!< MPU MAIR0: Attr0 Mask */\n\n/* MPU Memory Attribute Indirection Register 1 Definitions */\n#define MPU_MAIR1_Attr7_Pos                24U                                            /*!< MPU MAIR1: Attr7 Position */\n#define MPU_MAIR1_Attr7_Msk                (0xFFUL << MPU_MAIR1_Attr7_Pos)                /*!< MPU MAIR1: Attr7 Mask */\n\n#define MPU_MAIR1_Attr6_Pos                16U                                            /*!< MPU MAIR1: Attr6 Position */\n#define MPU_MAIR1_Attr6_Msk                (0xFFUL << MPU_MAIR1_Attr6_Pos)                /*!< MPU MAIR1: Attr6 Mask */\n\n#define MPU_MAIR1_Attr5_Pos                 8U                                            /*!< MPU MAIR1: Attr5 Position */\n#define MPU_MAIR1_Attr5_Msk                (0xFFUL << MPU_MAIR1_Attr5_Pos)                /*!< MPU MAIR1: Attr5 Mask */\n\n#define MPU_MAIR1_Attr4_Pos                 0U                                            /*!< MPU MAIR1: Attr4 Position */\n#define MPU_MAIR1_Attr4_Msk                (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/)            /*!< MPU MAIR1: Attr4 Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif\n\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SAU     Security Attribution Unit (SAU)\n  \\brief    Type definitions for the Security Attribution Unit (SAU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Security Attribution Unit (SAU).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SAU Control Register */\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x004 (R/ )  SAU Type Register */\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  SAU Region Number Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  SAU Region Base Address Register */\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  SAU Region Limit Address Register */\n#else\n        uint32_t RESERVED0[3];\n#endif\n  __IOM uint32_t SFSR;                   /*!< Offset: 0x014 (R/W)  Secure Fault Status Register */\n  __IOM uint32_t SFAR;                   /*!< Offset: 0x018 (R/W)  Secure Fault Address Register */\n} SAU_Type;\n\n/* SAU Control Register Definitions */\n#define SAU_CTRL_ALLNS_Pos                  1U                                            /*!< SAU CTRL: ALLNS Position */\n#define SAU_CTRL_ALLNS_Msk                 (1UL << SAU_CTRL_ALLNS_Pos)                    /*!< SAU CTRL: ALLNS Mask */\n\n#define SAU_CTRL_ENABLE_Pos                 0U                                            /*!< SAU CTRL: ENABLE Position */\n#define SAU_CTRL_ENABLE_Msk                (1UL /*<< SAU_CTRL_ENABLE_Pos*/)               /*!< SAU CTRL: ENABLE Mask */\n\n/* SAU Type Register Definitions */\n#define SAU_TYPE_SREGION_Pos                0U                                            /*!< SAU TYPE: SREGION Position */\n#define SAU_TYPE_SREGION_Msk               (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/)           /*!< SAU TYPE: SREGION Mask */\n\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n/* SAU Region Number Register Definitions */\n#define SAU_RNR_REGION_Pos                  0U                                            /*!< SAU RNR: REGION Position */\n#define SAU_RNR_REGION_Msk                 (0xFFUL /*<< SAU_RNR_REGION_Pos*/)             /*!< SAU RNR: REGION Mask */\n\n/* SAU Region Base Address Register Definitions */\n#define SAU_RBAR_BADDR_Pos                  5U                                            /*!< SAU RBAR: BADDR Position */\n#define SAU_RBAR_BADDR_Msk                 (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos)            /*!< SAU RBAR: BADDR Mask */\n\n/* SAU Region Limit Address Register Definitions */\n#define SAU_RLAR_LADDR_Pos                  5U                                            /*!< SAU RLAR: LADDR Position */\n#define SAU_RLAR_LADDR_Msk                 (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos)            /*!< SAU RLAR: LADDR Mask */\n\n#define SAU_RLAR_NSC_Pos                    1U                                            /*!< SAU RLAR: NSC Position */\n#define SAU_RLAR_NSC_Msk                   (1UL << SAU_RLAR_NSC_Pos)                      /*!< SAU RLAR: NSC Mask */\n\n#define SAU_RLAR_ENABLE_Pos                 0U                                            /*!< SAU RLAR: ENABLE Position */\n#define SAU_RLAR_ENABLE_Msk                (1UL /*<< SAU_RLAR_ENABLE_Pos*/)               /*!< SAU RLAR: ENABLE Mask */\n\n#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */\n\n/* Secure Fault Status Register Definitions */\n#define SAU_SFSR_LSERR_Pos                  7U                                            /*!< SAU SFSR: LSERR Position */\n#define SAU_SFSR_LSERR_Msk                 (1UL << SAU_SFSR_LSERR_Pos)                    /*!< SAU SFSR: LSERR Mask */\n\n#define SAU_SFSR_SFARVALID_Pos              6U                                            /*!< SAU SFSR: SFARVALID Position */\n#define SAU_SFSR_SFARVALID_Msk             (1UL << SAU_SFSR_SFARVALID_Pos)                /*!< SAU SFSR: SFARVALID Mask */\n\n#define SAU_SFSR_LSPERR_Pos                 5U                                            /*!< SAU SFSR: LSPERR Position */\n#define SAU_SFSR_LSPERR_Msk                (1UL << SAU_SFSR_LSPERR_Pos)                   /*!< SAU SFSR: LSPERR Mask */\n\n#define SAU_SFSR_INVTRAN_Pos                4U                                            /*!< SAU SFSR: INVTRAN Position */\n#define SAU_SFSR_INVTRAN_Msk               (1UL << SAU_SFSR_INVTRAN_Pos)                  /*!< SAU SFSR: INVTRAN Mask */\n\n#define SAU_SFSR_AUVIOL_Pos                 3U                                            /*!< SAU SFSR: AUVIOL Position */\n#define SAU_SFSR_AUVIOL_Msk                (1UL << SAU_SFSR_AUVIOL_Pos)                   /*!< SAU SFSR: AUVIOL Mask */\n\n#define SAU_SFSR_INVER_Pos                  2U                                            /*!< SAU SFSR: INVER Position */\n#define SAU_SFSR_INVER_Msk                 (1UL << SAU_SFSR_INVER_Pos)                    /*!< SAU SFSR: INVER Mask */\n\n#define SAU_SFSR_INVIS_Pos                  1U                                            /*!< SAU SFSR: INVIS Position */\n#define SAU_SFSR_INVIS_Msk                 (1UL << SAU_SFSR_INVIS_Pos)                    /*!< SAU SFSR: INVIS Mask */\n\n#define SAU_SFSR_INVEP_Pos                  0U                                            /*!< SAU SFSR: INVEP Position */\n#define SAU_SFSR_INVEP_Msk                 (1UL /*<< SAU_SFSR_INVEP_Pos*/)                /*!< SAU SFSR: INVEP Mask */\n\n/*@} end of group CMSIS_SAU */\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_FPU     Floating Point Unit (FPU)\n  \\brief    Type definitions for the Floating Point Unit (FPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Floating Point Unit (FPU).\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IOM uint32_t FPCCR;                  /*!< Offset: 0x004 (R/W)  Floating-Point Context Control Register */\n  __IOM uint32_t FPCAR;                  /*!< Offset: 0x008 (R/W)  Floating-Point Context Address Register */\n  __IOM uint32_t FPDSCR;                 /*!< Offset: 0x00C (R/W)  Floating-Point Default Status Control Register */\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x010 (R/ )  Media and FP Feature Register 0 */\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x014 (R/ )  Media and FP Feature Register 1 */\n} FPU_Type;\n\n/* Floating-Point Context Control Register Definitions */\n#define FPU_FPCCR_ASPEN_Pos                31U                                            /*!< FPCCR: ASPEN bit Position */\n#define FPU_FPCCR_ASPEN_Msk                (1UL << FPU_FPCCR_ASPEN_Pos)                   /*!< FPCCR: ASPEN bit Mask */\n\n#define FPU_FPCCR_LSPEN_Pos                30U                                            /*!< FPCCR: LSPEN Position */\n#define FPU_FPCCR_LSPEN_Msk                (1UL << FPU_FPCCR_LSPEN_Pos)                   /*!< FPCCR: LSPEN bit Mask */\n\n#define FPU_FPCCR_LSPENS_Pos               29U                                            /*!< FPCCR: LSPENS Position */\n#define FPU_FPCCR_LSPENS_Msk               (1UL << FPU_FPCCR_LSPENS_Pos)                  /*!< FPCCR: LSPENS bit Mask */\n\n#define FPU_FPCCR_CLRONRET_Pos             28U                                            /*!< FPCCR: CLRONRET Position */\n#define FPU_FPCCR_CLRONRET_Msk             (1UL << FPU_FPCCR_CLRONRET_Pos)                /*!< FPCCR: CLRONRET bit Mask */\n\n#define FPU_FPCCR_CLRONRETS_Pos            27U                                            /*!< FPCCR: CLRONRETS Position */\n#define FPU_FPCCR_CLRONRETS_Msk            (1UL << FPU_FPCCR_CLRONRETS_Pos)               /*!< FPCCR: CLRONRETS bit Mask */\n\n#define FPU_FPCCR_TS_Pos                   26U                                            /*!< FPCCR: TS Position */\n#define FPU_FPCCR_TS_Msk                   (1UL << FPU_FPCCR_TS_Pos)                      /*!< FPCCR: TS bit Mask */\n\n#define FPU_FPCCR_UFRDY_Pos                10U                                            /*!< FPCCR: UFRDY Position */\n#define FPU_FPCCR_UFRDY_Msk                (1UL << FPU_FPCCR_UFRDY_Pos)                   /*!< FPCCR: UFRDY bit Mask */\n\n#define FPU_FPCCR_SPLIMVIOL_Pos             9U                                            /*!< FPCCR: SPLIMVIOL Position */\n#define FPU_FPCCR_SPLIMVIOL_Msk            (1UL << FPU_FPCCR_SPLIMVIOL_Pos)               /*!< FPCCR: SPLIMVIOL bit Mask */\n\n#define FPU_FPCCR_MONRDY_Pos                8U                                            /*!< FPCCR: MONRDY Position */\n#define FPU_FPCCR_MONRDY_Msk               (1UL << FPU_FPCCR_MONRDY_Pos)                  /*!< FPCCR: MONRDY bit Mask */\n\n#define FPU_FPCCR_SFRDY_Pos                 7U                                            /*!< FPCCR: SFRDY Position */\n#define FPU_FPCCR_SFRDY_Msk                (1UL << FPU_FPCCR_SFRDY_Pos)                   /*!< FPCCR: SFRDY bit Mask */\n\n#define FPU_FPCCR_BFRDY_Pos                 6U                                            /*!< FPCCR: BFRDY Position */\n#define FPU_FPCCR_BFRDY_Msk                (1UL << FPU_FPCCR_BFRDY_Pos)                   /*!< FPCCR: BFRDY bit Mask */\n\n#define FPU_FPCCR_MMRDY_Pos                 5U                                            /*!< FPCCR: MMRDY Position */\n#define FPU_FPCCR_MMRDY_Msk                (1UL << FPU_FPCCR_MMRDY_Pos)                   /*!< FPCCR: MMRDY bit Mask */\n\n#define FPU_FPCCR_HFRDY_Pos                 4U                                            /*!< FPCCR: HFRDY Position */\n#define FPU_FPCCR_HFRDY_Msk                (1UL << FPU_FPCCR_HFRDY_Pos)                   /*!< FPCCR: HFRDY bit Mask */\n\n#define FPU_FPCCR_THREAD_Pos                3U                                            /*!< FPCCR: processor mode bit Position */\n#define FPU_FPCCR_THREAD_Msk               (1UL << FPU_FPCCR_THREAD_Pos)                  /*!< FPCCR: processor mode active bit Mask */\n\n#define FPU_FPCCR_S_Pos                     2U                                            /*!< FPCCR: Security status of the FP context bit Position */\n#define FPU_FPCCR_S_Msk                    (1UL << FPU_FPCCR_S_Pos)                       /*!< FPCCR: Security status of the FP context bit Mask */\n\n#define FPU_FPCCR_USER_Pos                  1U                                            /*!< FPCCR: privilege level bit Position */\n#define FPU_FPCCR_USER_Msk                 (1UL << FPU_FPCCR_USER_Pos)                    /*!< FPCCR: privilege level bit Mask */\n\n#define FPU_FPCCR_LSPACT_Pos                0U                                            /*!< FPCCR: Lazy state preservation active bit Position */\n#define FPU_FPCCR_LSPACT_Msk               (1UL /*<< FPU_FPCCR_LSPACT_Pos*/)              /*!< FPCCR: Lazy state preservation active bit Mask */\n\n/* Floating-Point Context Address Register Definitions */\n#define FPU_FPCAR_ADDRESS_Pos               3U                                            /*!< FPCAR: ADDRESS bit Position */\n#define FPU_FPCAR_ADDRESS_Msk              (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos)        /*!< FPCAR: ADDRESS bit Mask */\n\n/* Floating-Point Default Status Control Register Definitions */\n#define FPU_FPDSCR_AHP_Pos                 26U                                            /*!< FPDSCR: AHP bit Position */\n#define FPU_FPDSCR_AHP_Msk                 (1UL << FPU_FPDSCR_AHP_Pos)                    /*!< FPDSCR: AHP bit Mask */\n\n#define FPU_FPDSCR_DN_Pos                  25U                                            /*!< FPDSCR: DN bit Position */\n#define FPU_FPDSCR_DN_Msk                  (1UL << FPU_FPDSCR_DN_Pos)                     /*!< FPDSCR: DN bit Mask */\n\n#define FPU_FPDSCR_FZ_Pos                  24U                                            /*!< FPDSCR: FZ bit Position */\n#define FPU_FPDSCR_FZ_Msk                  (1UL << FPU_FPDSCR_FZ_Pos)                     /*!< FPDSCR: FZ bit Mask */\n\n#define FPU_FPDSCR_RMode_Pos               22U                                            /*!< FPDSCR: RMode bit Position */\n#define FPU_FPDSCR_RMode_Msk               (3UL << FPU_FPDSCR_RMode_Pos)                  /*!< FPDSCR: RMode bit Mask */\n\n/* Media and FP Feature Register 0 Definitions */\n#define FPU_MVFR0_FP_rounding_modes_Pos    28U                                            /*!< MVFR0: FP rounding modes bits Position */\n#define FPU_MVFR0_FP_rounding_modes_Msk    (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos)     /*!< MVFR0: FP rounding modes bits Mask */\n\n#define FPU_MVFR0_Short_vectors_Pos        24U                                            /*!< MVFR0: Short vectors bits Position */\n#define FPU_MVFR0_Short_vectors_Msk        (0xFUL << FPU_MVFR0_Short_vectors_Pos)         /*!< MVFR0: Short vectors bits Mask */\n\n#define FPU_MVFR0_Square_root_Pos          20U                                            /*!< MVFR0: Square root bits Position */\n#define FPU_MVFR0_Square_root_Msk          (0xFUL << FPU_MVFR0_Square_root_Pos)           /*!< MVFR0: Square root bits Mask */\n\n#define FPU_MVFR0_Divide_Pos               16U                                            /*!< MVFR0: Divide bits Position */\n#define FPU_MVFR0_Divide_Msk               (0xFUL << FPU_MVFR0_Divide_Pos)                /*!< MVFR0: Divide bits Mask */\n\n#define FPU_MVFR0_FP_excep_trapping_Pos    12U                                            /*!< MVFR0: FP exception trapping bits Position */\n#define FPU_MVFR0_FP_excep_trapping_Msk    (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos)     /*!< MVFR0: FP exception trapping bits Mask */\n\n#define FPU_MVFR0_Double_precision_Pos      8U                                            /*!< MVFR0: Double-precision bits Position */\n#define FPU_MVFR0_Double_precision_Msk     (0xFUL << FPU_MVFR0_Double_precision_Pos)      /*!< MVFR0: Double-precision bits Mask */\n\n#define FPU_MVFR0_Single_precision_Pos      4U                                            /*!< MVFR0: Single-precision bits Position */\n#define FPU_MVFR0_Single_precision_Msk     (0xFUL << FPU_MVFR0_Single_precision_Pos)      /*!< MVFR0: Single-precision bits Mask */\n\n#define FPU_MVFR0_A_SIMD_registers_Pos      0U                                            /*!< MVFR0: A_SIMD registers bits Position */\n#define FPU_MVFR0_A_SIMD_registers_Msk     (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/)  /*!< MVFR0: A_SIMD registers bits Mask */\n\n/* Media and FP Feature Register 1 Definitions */\n#define FPU_MVFR1_FP_fused_MAC_Pos         28U                                            /*!< MVFR1: FP fused MAC bits Position */\n#define FPU_MVFR1_FP_fused_MAC_Msk         (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos)          /*!< MVFR1: FP fused MAC bits Mask */\n\n#define FPU_MVFR1_FP_HPFP_Pos              24U                                            /*!< MVFR1: FP HPFP bits Position */\n#define FPU_MVFR1_FP_HPFP_Msk              (0xFUL << FPU_MVFR1_FP_HPFP_Pos)               /*!< MVFR1: FP HPFP bits Mask */\n\n#define FPU_MVFR1_D_NaN_mode_Pos            4U                                            /*!< MVFR1: D_NaN mode bits Position */\n#define FPU_MVFR1_D_NaN_mode_Msk           (0xFUL << FPU_MVFR1_D_NaN_mode_Pos)            /*!< MVFR1: D_NaN mode bits Mask */\n\n#define FPU_MVFR1_FtZ_mode_Pos              0U                                            /*!< MVFR1: FtZ mode bits Position */\n#define FPU_MVFR1_FtZ_mode_Msk             (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/)          /*!< MVFR1: FtZ mode bits Mask */\n\n/*@} end of group CMSIS_FPU */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Type definitions for the Core Debug Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Core Debug Register (CoreDebug).\n */\ntypedef struct\n{\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\n        uint32_t RESERVED4[1U];\n  __IOM uint32_t DAUTHCTRL;              /*!< Offset: 0x014 (R/W)  Debug Authentication Control Register */\n  __IOM uint32_t DSCSR;                  /*!< Offset: 0x018 (R/W)  Debug Security Control and Status Register */\n} CoreDebug_Type;\n\n/* Debug Halting Control and Status Register Definitions */\n#define CoreDebug_DHCSR_DBGKEY_Pos         16U                                            /*!< CoreDebug DHCSR: DBGKEY Position */\n#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< CoreDebug DHCSR: DBGKEY Mask */\n\n#define CoreDebug_DHCSR_S_RESTART_ST_Pos   26U                                            /*!< CoreDebug DHCSR: S_RESTART_ST Position */\n#define CoreDebug_DHCSR_S_RESTART_ST_Msk   (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos)      /*!< CoreDebug DHCSR: S_RESTART_ST Mask */\n\n#define CoreDebug_DHCSR_S_RESET_ST_Pos     25U                                            /*!< CoreDebug DHCSR: S_RESET_ST Position */\n#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< CoreDebug DHCSR: S_RESET_ST Mask */\n\n#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24U                                            /*!< CoreDebug DHCSR: S_RETIRE_ST Position */\n#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */\n\n#define CoreDebug_DHCSR_S_LOCKUP_Pos       19U                                            /*!< CoreDebug DHCSR: S_LOCKUP Position */\n#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< CoreDebug DHCSR: S_LOCKUP Mask */\n\n#define CoreDebug_DHCSR_S_SLEEP_Pos        18U                                            /*!< CoreDebug DHCSR: S_SLEEP Position */\n#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< CoreDebug DHCSR: S_SLEEP Mask */\n\n#define CoreDebug_DHCSR_S_HALT_Pos         17U                                            /*!< CoreDebug DHCSR: S_HALT Position */\n#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< CoreDebug DHCSR: S_HALT Mask */\n\n#define CoreDebug_DHCSR_S_REGRDY_Pos       16U                                            /*!< CoreDebug DHCSR: S_REGRDY Position */\n#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< CoreDebug DHCSR: S_REGRDY Mask */\n\n#define CoreDebug_DHCSR_C_SNAPSTALL_Pos     5U                                            /*!< CoreDebug DHCSR: C_SNAPSTALL Position */\n#define CoreDebug_DHCSR_C_SNAPSTALL_Msk    (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos)       /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */\n\n#define CoreDebug_DHCSR_C_MASKINTS_Pos      3U                                            /*!< CoreDebug DHCSR: C_MASKINTS Position */\n#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< CoreDebug DHCSR: C_MASKINTS Mask */\n\n#define CoreDebug_DHCSR_C_STEP_Pos          2U                                            /*!< CoreDebug DHCSR: C_STEP Position */\n#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< CoreDebug DHCSR: C_STEP Mask */\n\n#define CoreDebug_DHCSR_C_HALT_Pos          1U                                            /*!< CoreDebug DHCSR: C_HALT Position */\n#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< CoreDebug DHCSR: C_HALT Mask */\n\n#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0U                                            /*!< CoreDebug DHCSR: C_DEBUGEN Position */\n#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/)     /*!< CoreDebug DHCSR: C_DEBUGEN Mask */\n\n/* Debug Core Register Selector Register Definitions */\n#define CoreDebug_DCRSR_REGWnR_Pos         16U                                            /*!< CoreDebug DCRSR: REGWnR Position */\n#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< CoreDebug DCRSR: REGWnR Mask */\n\n#define CoreDebug_DCRSR_REGSEL_Pos          0U                                            /*!< CoreDebug DCRSR: REGSEL Position */\n#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/)     /*!< CoreDebug DCRSR: REGSEL Mask */\n\n/* Debug Exception and Monitor Control Register Definitions */\n#define CoreDebug_DEMCR_TRCENA_Pos         24U                                            /*!< CoreDebug DEMCR: TRCENA Position */\n#define CoreDebug_DEMCR_TRCENA_Msk         (1UL << CoreDebug_DEMCR_TRCENA_Pos)            /*!< CoreDebug DEMCR: TRCENA Mask */\n\n#define CoreDebug_DEMCR_MON_REQ_Pos        19U                                            /*!< CoreDebug DEMCR: MON_REQ Position */\n#define CoreDebug_DEMCR_MON_REQ_Msk        (1UL << CoreDebug_DEMCR_MON_REQ_Pos)           /*!< CoreDebug DEMCR: MON_REQ Mask */\n\n#define CoreDebug_DEMCR_MON_STEP_Pos       18U                                            /*!< CoreDebug DEMCR: MON_STEP Position */\n#define CoreDebug_DEMCR_MON_STEP_Msk       (1UL << CoreDebug_DEMCR_MON_STEP_Pos)          /*!< CoreDebug DEMCR: MON_STEP Mask */\n\n#define CoreDebug_DEMCR_MON_PEND_Pos       17U                                            /*!< CoreDebug DEMCR: MON_PEND Position */\n#define CoreDebug_DEMCR_MON_PEND_Msk       (1UL << CoreDebug_DEMCR_MON_PEND_Pos)          /*!< CoreDebug DEMCR: MON_PEND Mask */\n\n#define CoreDebug_DEMCR_MON_EN_Pos         16U                                            /*!< CoreDebug DEMCR: MON_EN Position */\n#define CoreDebug_DEMCR_MON_EN_Msk         (1UL << CoreDebug_DEMCR_MON_EN_Pos)            /*!< CoreDebug DEMCR: MON_EN Mask */\n\n#define CoreDebug_DEMCR_VC_HARDERR_Pos     10U                                            /*!< CoreDebug DEMCR: VC_HARDERR Position */\n#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< CoreDebug DEMCR: VC_HARDERR Mask */\n\n#define CoreDebug_DEMCR_VC_INTERR_Pos       9U                                            /*!< CoreDebug DEMCR: VC_INTERR Position */\n#define CoreDebug_DEMCR_VC_INTERR_Msk      (1UL << CoreDebug_DEMCR_VC_INTERR_Pos)         /*!< CoreDebug DEMCR: VC_INTERR Mask */\n\n#define CoreDebug_DEMCR_VC_BUSERR_Pos       8U                                            /*!< CoreDebug DEMCR: VC_BUSERR Position */\n#define CoreDebug_DEMCR_VC_BUSERR_Msk      (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos)         /*!< CoreDebug DEMCR: VC_BUSERR Mask */\n\n#define CoreDebug_DEMCR_VC_STATERR_Pos      7U                                            /*!< CoreDebug DEMCR: VC_STATERR Position */\n#define CoreDebug_DEMCR_VC_STATERR_Msk     (1UL << CoreDebug_DEMCR_VC_STATERR_Pos)        /*!< CoreDebug DEMCR: VC_STATERR Mask */\n\n#define CoreDebug_DEMCR_VC_CHKERR_Pos       6U                                            /*!< CoreDebug DEMCR: VC_CHKERR Position */\n#define CoreDebug_DEMCR_VC_CHKERR_Msk      (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos)         /*!< CoreDebug DEMCR: VC_CHKERR Mask */\n\n#define CoreDebug_DEMCR_VC_NOCPERR_Pos      5U                                            /*!< CoreDebug DEMCR: VC_NOCPERR Position */\n#define CoreDebug_DEMCR_VC_NOCPERR_Msk     (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos)        /*!< CoreDebug DEMCR: VC_NOCPERR Mask */\n\n#define CoreDebug_DEMCR_VC_MMERR_Pos        4U                                            /*!< CoreDebug DEMCR: VC_MMERR Position */\n#define CoreDebug_DEMCR_VC_MMERR_Msk       (1UL << CoreDebug_DEMCR_VC_MMERR_Pos)          /*!< CoreDebug DEMCR: VC_MMERR Mask */\n\n#define CoreDebug_DEMCR_VC_CORERESET_Pos    0U                                            /*!< CoreDebug DEMCR: VC_CORERESET Position */\n#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/)  /*!< CoreDebug DEMCR: VC_CORERESET Mask */\n\n/* Debug Authentication Control Register Definitions */\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos  3U                                            /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos)    /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */\n\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos  2U                                            /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos)    /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */\n\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos   1U                                            /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk  (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos)     /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */\n\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos   0U                                            /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk  (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */\n\n/* Debug Security Control and Status Register Definitions */\n#define CoreDebug_DSCSR_CDS_Pos            16U                                            /*!< CoreDebug DSCSR: CDS Position */\n#define CoreDebug_DSCSR_CDS_Msk            (1UL << CoreDebug_DSCSR_CDS_Pos)               /*!< CoreDebug DSCSR: CDS Mask */\n\n#define CoreDebug_DSCSR_SBRSEL_Pos          1U                                            /*!< CoreDebug DSCSR: SBRSEL Position */\n#define CoreDebug_DSCSR_SBRSEL_Msk         (1UL << CoreDebug_DSCSR_SBRSEL_Pos)            /*!< CoreDebug DSCSR: SBRSEL Mask */\n\n#define CoreDebug_DSCSR_SBRSELEN_Pos        0U                                            /*!< CoreDebug DSCSR: SBRSELEN Position */\n#define CoreDebug_DSCSR_SBRSELEN_Msk       (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/)      /*!< CoreDebug DSCSR: SBRSELEN Mask */\n\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n  #define SCS_BASE            (0xE000E000UL)                             /*!< System Control Space Base Address */\n  #define ITM_BASE            (0xE0000000UL)                             /*!< ITM Base Address */\n  #define DWT_BASE            (0xE0001000UL)                             /*!< DWT Base Address */\n  #define TPI_BASE            (0xE0040000UL)                             /*!< TPI Base Address */\n  #define CoreDebug_BASE      (0xE000EDF0UL)                             /*!< Core Debug Base Address */\n  #define SysTick_BASE        (SCS_BASE +  0x0010UL)                     /*!< SysTick Base Address */\n  #define NVIC_BASE           (SCS_BASE +  0x0100UL)                     /*!< NVIC Base Address */\n  #define SCB_BASE            (SCS_BASE +  0x0D00UL)                     /*!< System Control Block Base Address */\n\n  #define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE         ) /*!< System control Register not in SCB */\n  #define SCB                 ((SCB_Type       *)     SCB_BASE         ) /*!< SCB configuration struct */\n  #define SysTick             ((SysTick_Type   *)     SysTick_BASE     ) /*!< SysTick configuration struct */\n  #define NVIC                ((NVIC_Type      *)     NVIC_BASE        ) /*!< NVIC configuration struct */\n  #define ITM                 ((ITM_Type       *)     ITM_BASE         ) /*!< ITM configuration struct */\n  #define DWT                 ((DWT_Type       *)     DWT_BASE         ) /*!< DWT configuration struct */\n  #define TPI                 ((TPI_Type       *)     TPI_BASE         ) /*!< TPI configuration struct */\n  #define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE   ) /*!< Core Debug configuration struct */\n\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n    #define MPU_BASE          (SCS_BASE +  0x0D90UL)                     /*!< Memory Protection Unit */\n    #define MPU               ((MPU_Type       *)     MPU_BASE         ) /*!< Memory Protection Unit */\n  #endif\n\n  #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n    #define SAU_BASE          (SCS_BASE +  0x0DD0UL)                     /*!< Security Attribution Unit */\n    #define SAU               ((SAU_Type       *)     SAU_BASE         ) /*!< Security Attribution Unit */\n  #endif\n\n  #define FPU_BASE            (SCS_BASE +  0x0F30UL)                     /*!< Floating Point Unit */\n  #define FPU                 ((FPU_Type       *)     FPU_BASE         ) /*!< Floating Point Unit */\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n  #define SCS_BASE_NS         (0xE002E000UL)                             /*!< System Control Space Base Address (non-secure address space) */\n  #define CoreDebug_BASE_NS   (0xE002EDF0UL)                             /*!< Core Debug Base Address           (non-secure address space) */\n  #define SysTick_BASE_NS     (SCS_BASE_NS +  0x0010UL)                  /*!< SysTick Base Address              (non-secure address space) */\n  #define NVIC_BASE_NS        (SCS_BASE_NS +  0x0100UL)                  /*!< NVIC Base Address                 (non-secure address space) */\n  #define SCB_BASE_NS         (SCS_BASE_NS +  0x0D00UL)                  /*!< System Control Block Base Address (non-secure address space) */\n\n  #define SCnSCB_NS           ((SCnSCB_Type    *)     SCS_BASE_NS      ) /*!< System control Register not in SCB(non-secure address space) */\n  #define SCB_NS              ((SCB_Type       *)     SCB_BASE_NS      ) /*!< SCB configuration struct          (non-secure address space) */\n  #define SysTick_NS          ((SysTick_Type   *)     SysTick_BASE_NS  ) /*!< SysTick configuration struct      (non-secure address space) */\n  #define NVIC_NS             ((NVIC_Type      *)     NVIC_BASE_NS     ) /*!< NVIC configuration struct         (non-secure address space) */\n  #define CoreDebug_NS        ((CoreDebug_Type *)     CoreDebug_BASE_NS) /*!< Core Debug configuration struct   (non-secure address space) */\n\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n    #define MPU_BASE_NS       (SCS_BASE_NS +  0x0D90UL)                  /*!< Memory Protection Unit            (non-secure address space) */\n    #define MPU_NS            ((MPU_Type       *)     MPU_BASE_NS      ) /*!< Memory Protection Unit            (non-secure address space) */\n  #endif\n\n  #define FPU_BASE_NS         (SCS_BASE_NS +  0x0F30UL)                  /*!< Floating Point Unit               (non-secure address space) */\n  #define FPU_NS              ((FPU_Type       *)     FPU_BASE_NS      ) /*!< Floating Point Unit               (non-secure address space) */\n\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Debug Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifndef CMSIS_NVIC_VIRTUAL\n  #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping\n  #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n  #define NVIC_GetActive              __NVIC_GetActive\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifndef CMSIS_VECTAB_VIRTUAL\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n\n/**\n  \\brief   Set Priority Grouping\n  \\details Sets the priority grouping field using the required unlock sequence.\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\n           Only values from 0..7 are used.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]      PriorityGroup  Priority grouping field.\n */\n__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)\n{\n  uint32_t reg_value;\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\n\n  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */\n  reg_value  =  (reg_value                                   |\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                (PriorityGroupTmp << 8U)                      );              /* Insert write key and priorty group */\n  SCB->AIRCR =  reg_value;\n}\n\n\n/**\n  \\brief   Get Priority Grouping\n  \\details Reads the priority grouping field from the NVIC Interrupt Controller.\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void)\n{\n  return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\n}\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt\n  \\details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   Get Interrupt Target State\n  \\details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n  \\return             1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Target State\n  \\details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n                      1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] |=  ((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)));\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Clear Interrupt Target State\n  \\details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n                      1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)));\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IPR[((uint32_t)(int32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n  else\n  {\n    SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return(((uint32_t)NVIC->IPR[((uint32_t)(int32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Encode Priority\n  \\details Encodes the priority for an interrupt with the given priority group,\n           preemptive priority value, and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [in]   PreemptPriority  Preemptive priority value (starting from 0).\n  \\param [in]       SubPriority  Subpriority value (starting from 0).\n  \\return                        Encoded priority. Value can be used in the function \\ref NVIC_SetPriority().\n */\n__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  return (\n           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |\n           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))\n         );\n}\n\n\n/**\n  \\brief   Decode Priority\n  \\details Decodes an interrupt priority value with a given priority group to\n           preemptive priority value and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.\n  \\param [in]         Priority   Priority value, which can be retrieved with the function \\ref NVIC_GetPriority().\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [out] pPreemptPriority  Preemptive priority value (starting from 0).\n  \\param [out]     pSubPriority  Subpriority value (starting from 0).\n */\n__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);\n  *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL);\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__STATIC_INLINE void NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |\n                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |\n                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   Set Priority Grouping (non-secure)\n  \\details Sets the non-secure priority grouping field when in secure state using the required unlock sequence.\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\n           Only values from 0..7 are used.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]      PriorityGroup  Priority grouping field.\n */\n__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup)\n{\n  uint32_t reg_value;\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\n\n  reg_value  =  SCB_NS->AIRCR;                                                   /* read old register configuration    */\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk));             /* clear bits to change               */\n  reg_value  =  (reg_value                                   |\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                (PriorityGroupTmp << 8U)                      );              /* Insert write key and priorty group */\n  SCB_NS->AIRCR =  reg_value;\n}\n\n\n/**\n  \\brief   Get Priority Grouping (non-secure)\n  \\details Reads the priority grouping field from the non-secure NVIC when in secure state.\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void)\n{\n  return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\n}\n\n\n/**\n  \\brief   Enable Interrupt (non-secure)\n  \\details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status (non-secure)\n  \\details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt (non-secure)\n  \\details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt (non-secure)\n  \\details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt (non-secure)\n  \\details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt (non-secure)\n  \\details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt (non-secure)\n  \\details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority (non-secure)\n  \\details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every non-secure processor exception.\n */\n__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n  else\n  {\n    SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority (non-secure)\n  \\details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return(((uint32_t)NVIC_NS->IPR[((uint32_t)(int32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return(((uint32_t)SCB_NS->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n#endif /*  defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n  uint32_t mvfr0;\n\n  mvfr0 = FPU->MVFR0;\n  if      ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U)\n  {\n    return 2U;           /* Double + Single precision FPU */\n  }\n  else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U)\n  {\n    return 1U;           /* Single precision FPU */\n  }\n  else\n  {\n    return 0U;           /* No FPU */\n  }\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##########################   SAU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SAUFunctions SAU Functions\n  \\brief    Functions that configure the SAU.\n  @{\n */\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n\n/**\n  \\brief   Enable SAU\n  \\details Enables the Security Attribution Unit (SAU).\n */\n__STATIC_INLINE void TZ_SAU_Enable(void)\n{\n    SAU->CTRL |=  (SAU_CTRL_ENABLE_Msk);\n}\n\n\n\n/**\n  \\brief   Disable SAU\n  \\details Disables the Security Attribution Unit (SAU).\n */\n__STATIC_INLINE void TZ_SAU_Disable(void)\n{\n    SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk);\n}\n\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n/*@} end of CMSIS_Core_SAUFunctions */\n\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   System Tick Configuration (non-secure)\n  \\details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>TZ_SysTick_Config_NS</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n\n */\n__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                         /* Reload value impossible */\n  }\n\n  SysTick_NS->LOAD  = (uint32_t)(ticks - 1UL);                            /* set reload register */\n  TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick_NS->VAL   = 0UL;                                                /* Load the SysTick Counter Value */\n  SysTick_NS->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                      SysTick_CTRL_TICKINT_Msk   |\n                      SysTick_CTRL_ENABLE_Msk;                            /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                           /* Function successful */\n}\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n/* ##################################### Debug In/Output function ########################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_core_DebugFunctions ITM Functions\n  \\brief    Functions that access the ITM debug interface.\n  @{\n */\n\nextern volatile int32_t ITM_RxBuffer;                              /*!< External variable to receive characters. */\n#define                 ITM_RXBUFFER_EMPTY  ((int32_t)0x5AA55AA5U) /*!< Value identifying \\ref ITM_RxBuffer is ready for next character. */\n\n\n/**\n  \\brief   ITM Send Character\n  \\details Transmits a character via the ITM channel 0, and\n           \\li Just returns when no debugger is connected that has booked the output.\n           \\li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.\n  \\param [in]     ch  Character to transmit.\n  \\returns            Character to transmit.\n */\n__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)\n{\n  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */\n      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */\n  {\n    while (ITM->PORT[0U].u32 == 0UL)\n    {\n      __NOP();\n    }\n    ITM->PORT[0U].u8 = (uint8_t)ch;\n  }\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Receive Character\n  \\details Inputs a character via the external variable \\ref ITM_RxBuffer.\n  \\return             Received character.\n  \\return         -1  No character pending.\n */\n__STATIC_INLINE int32_t ITM_ReceiveChar (void)\n{\n  int32_t ch = -1;                           /* no character available */\n\n  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY)\n  {\n    ch = ITM_RxBuffer;\n    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */\n  }\n\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Check Character\n  \\details Checks whether a character is pending for reading in the variable \\ref ITM_RxBuffer.\n  \\return          0  No character available.\n  \\return          1  Character available.\n */\n__STATIC_INLINE int32_t ITM_CheckChar (void)\n{\n\n  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY)\n  {\n    return (0);                              /* no character available */\n  }\n  else\n  {\n    return (1);                              /*    character available */\n  }\n}\n\n/*@} end of CMSIS_core_DebugFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM33_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_cm4.h",
    "content": "/**************************************************************************//**\n * @file     core_cm4.h\n * @brief    CMSIS Cortex-M4 Core Peripheral Access Layer Header File\n * @version  V5.0.1\n * @date     30. January 2017\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_CM4_H_GENERIC\n#define __CORE_CM4_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex_M4\n  @{\n */\n\n/*  CMSIS CM4 definitions */\n#define __CM4_CMSIS_VERSION_MAIN  ( 5U)                                  /*!< [31:16] CMSIS HAL main version */\n#define __CM4_CMSIS_VERSION_SUB   ( 0U)                                  /*!< [15:0]  CMSIS HAL sub version */\n#define __CM4_CMSIS_VERSION       ((__CM4_CMSIS_VERSION_MAIN << 16U) | \\\n                                    __CM4_CMSIS_VERSION_SUB           )  /*!< CMSIS HAL version number */\n\n#define __CORTEX_M                (4U)                                   /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions.\n*/\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #warning \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM4_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_CM4_H_DEPENDANT\n#define __CORE_CM4_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __CM4_REV\n    #define __CM4_REV               0x0000U\n    #warning \"__CM4_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __FPU_PRESENT\n    #define __FPU_PRESENT             0U\n    #warning \"__FPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          3U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group Cortex_M4 */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core Debug Register\n  - Core MPU Register\n  - Core FPU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved */\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\n    uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n#define APSR_Q_Pos                         27U                                            /*!< APSR: Q Position */\n#define APSR_Q_Msk                         (1UL << APSR_Q_Pos)                            /*!< APSR: Q Mask */\n\n#define APSR_GE_Pos                        16U                                            /*!< APSR: GE Position */\n#define APSR_GE_Msk                        (0xFUL << APSR_GE_Pos)                         /*!< APSR: GE Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:1;               /*!< bit:      9  Reserved */\n    uint32_t ICI_IT_1:6;                 /*!< bit: 10..15  ICI/IT part 1 */\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\n    uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit */\n    uint32_t ICI_IT_2:2;                 /*!< bit: 25..26  ICI/IT part 2 */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_Q_Pos                         27U                                            /*!< xPSR: Q Position */\n#define xPSR_Q_Msk                         (1UL << xPSR_Q_Pos)                            /*!< xPSR: Q Mask */\n\n#define xPSR_ICI_IT_2_Pos                  25U                                            /*!< xPSR: ICI/IT part 2 Position */\n#define xPSR_ICI_IT_2_Msk                  (3UL << xPSR_ICI_IT_2_Pos)                     /*!< xPSR: ICI/IT part 2 Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_GE_Pos                        16U                                            /*!< xPSR: GE Position */\n#define xPSR_GE_Msk                        (0xFUL << xPSR_GE_Pos)                         /*!< xPSR: GE Mask */\n\n#define xPSR_ICI_IT_1_Pos                  10U                                            /*!< xPSR: ICI/IT part 1 Position */\n#define xPSR_ICI_IT_1_Msk                  (0x3FUL << xPSR_ICI_IT_1_Pos)                  /*!< xPSR: ICI/IT part 1 Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */\n    uint32_t FPCA:1;                     /*!< bit:      2  FP extension active flag */\n    uint32_t _reserved0:29;              /*!< bit:  3..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_FPCA_Pos                    2U                                            /*!< CONTROL: FPCA Position */\n#define CONTROL_FPCA_Msk                   (1UL << CONTROL_FPCA_Pos)                      /*!< CONTROL: FPCA Mask */\n\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[8U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[24U];\n  __IOM uint32_t ICER[8U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[24U];\n  __IOM uint32_t ISPR[8U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[24U];\n  __IOM uint32_t ICPR[8U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[24U];\n  __IOM uint32_t IABR[8U];               /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */\n        uint32_t RESERVED4[56U];\n  __IOM uint8_t  IP[240U];               /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */\n        uint32_t RESERVED5[644U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */\n}  NVIC_Type;\n\n/* Software Triggered Interrupt Register Definitions */\n#define NVIC_STIR_INTID_Pos                 0U                                         /*!< STIR: INTLINESNUM Position */\n#define NVIC_STIR_INTID_Msk                (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/)        /*!< STIR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n  __IOM uint8_t  SHP[12U];               /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11, 12-15) */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n  __IOM uint32_t CFSR;                   /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register */\n  __IOM uint32_t HFSR;                   /*!< Offset: 0x02C (R/W)  HardFault Status Register */\n  __IOM uint32_t DFSR;                   /*!< Offset: 0x030 (R/W)  Debug Fault Status Register */\n  __IOM uint32_t MMFAR;                  /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register */\n  __IOM uint32_t BFAR;                   /*!< Offset: 0x038 (R/W)  BusFault Address Register */\n  __IOM uint32_t AFSR;                   /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register */\n  __IM  uint32_t PFR[2U];                /*!< Offset: 0x040 (R/ )  Processor Feature Register */\n  __IM  uint32_t DFR;                    /*!< Offset: 0x048 (R/ )  Debug Feature Register */\n  __IM  uint32_t ADR;                    /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register */\n  __IM  uint32_t MMFR[4U];               /*!< Offset: 0x050 (R/ )  Memory Model Feature Register */\n  __IM  uint32_t ISAR[5U];               /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register */\n        uint32_t RESERVED0[5U];\n  __IOM uint32_t CPACR;                  /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_NMIPENDSET_Pos            31U                                            /*!< SCB ICSR: NMIPENDSET Position */\n#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_RETTOBASE_Pos             11U                                            /*!< SCB ICSR: RETTOBASE Position */\n#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n/* SCB Vector Table Offset Register Definitions */\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_PRIGROUP_Pos              8U                                            /*!< SCB AIRCR: PRIGROUP Position */\n#define SCB_AIRCR_PRIGROUP_Msk             (7UL << SCB_AIRCR_PRIGROUP_Pos)                /*!< SCB AIRCR: PRIGROUP Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n#define SCB_AIRCR_VECTRESET_Pos             0U                                            /*!< SCB AIRCR: VECTRESET Position */\n#define SCB_AIRCR_VECTRESET_Msk            (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/)           /*!< SCB AIRCR: VECTRESET Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_STKALIGN_Pos                9U                                            /*!< SCB CCR: STKALIGN Position */\n#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */\n\n#define SCB_CCR_BFHFNMIGN_Pos               8U                                            /*!< SCB CCR: BFHFNMIGN Position */\n#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */\n\n#define SCB_CCR_DIV_0_TRP_Pos               4U                                            /*!< SCB CCR: DIV_0_TRP Position */\n#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n#define SCB_CCR_USERSETMPEND_Pos            1U                                            /*!< SCB CCR: USERSETMPEND Position */\n#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */\n\n#define SCB_CCR_NONBASETHRDENA_Pos          0U                                            /*!< SCB CCR: NONBASETHRDENA Position */\n#define SCB_CCR_NONBASETHRDENA_Msk         (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/)        /*!< SCB CCR: NONBASETHRDENA Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_USGFAULTENA_Pos          18U                                            /*!< SCB SHCSR: USGFAULTENA Position */\n#define SCB_SHCSR_USGFAULTENA_Msk          (1UL << SCB_SHCSR_USGFAULTENA_Pos)             /*!< SCB SHCSR: USGFAULTENA Mask */\n\n#define SCB_SHCSR_BUSFAULTENA_Pos          17U                                            /*!< SCB SHCSR: BUSFAULTENA Position */\n#define SCB_SHCSR_BUSFAULTENA_Msk          (1UL << SCB_SHCSR_BUSFAULTENA_Pos)             /*!< SCB SHCSR: BUSFAULTENA Mask */\n\n#define SCB_SHCSR_MEMFAULTENA_Pos          16U                                            /*!< SCB SHCSR: MEMFAULTENA Position */\n#define SCB_SHCSR_MEMFAULTENA_Msk          (1UL << SCB_SHCSR_MEMFAULTENA_Pos)             /*!< SCB SHCSR: MEMFAULTENA Mask */\n\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n#define SCB_SHCSR_BUSFAULTPENDED_Pos       14U                                            /*!< SCB SHCSR: BUSFAULTPENDED Position */\n#define SCB_SHCSR_BUSFAULTPENDED_Msk       (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos)          /*!< SCB SHCSR: BUSFAULTPENDED Mask */\n\n#define SCB_SHCSR_MEMFAULTPENDED_Pos       13U                                            /*!< SCB SHCSR: MEMFAULTPENDED Position */\n#define SCB_SHCSR_MEMFAULTPENDED_Msk       (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos)          /*!< SCB SHCSR: MEMFAULTPENDED Mask */\n\n#define SCB_SHCSR_USGFAULTPENDED_Pos       12U                                            /*!< SCB SHCSR: USGFAULTPENDED Position */\n#define SCB_SHCSR_USGFAULTPENDED_Msk       (1UL << SCB_SHCSR_USGFAULTPENDED_Pos)          /*!< SCB SHCSR: USGFAULTPENDED Mask */\n\n#define SCB_SHCSR_SYSTICKACT_Pos           11U                                            /*!< SCB SHCSR: SYSTICKACT Position */\n#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */\n\n#define SCB_SHCSR_PENDSVACT_Pos            10U                                            /*!< SCB SHCSR: PENDSVACT Position */\n#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */\n\n#define SCB_SHCSR_MONITORACT_Pos            8U                                            /*!< SCB SHCSR: MONITORACT Position */\n#define SCB_SHCSR_MONITORACT_Msk           (1UL << SCB_SHCSR_MONITORACT_Pos)              /*!< SCB SHCSR: MONITORACT Mask */\n\n#define SCB_SHCSR_SVCALLACT_Pos             7U                                            /*!< SCB SHCSR: SVCALLACT Position */\n#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */\n\n#define SCB_SHCSR_USGFAULTACT_Pos           3U                                            /*!< SCB SHCSR: USGFAULTACT Position */\n#define SCB_SHCSR_USGFAULTACT_Msk          (1UL << SCB_SHCSR_USGFAULTACT_Pos)             /*!< SCB SHCSR: USGFAULTACT Mask */\n\n#define SCB_SHCSR_BUSFAULTACT_Pos           1U                                            /*!< SCB SHCSR: BUSFAULTACT Position */\n#define SCB_SHCSR_BUSFAULTACT_Msk          (1UL << SCB_SHCSR_BUSFAULTACT_Pos)             /*!< SCB SHCSR: BUSFAULTACT Mask */\n\n#define SCB_SHCSR_MEMFAULTACT_Pos           0U                                            /*!< SCB SHCSR: MEMFAULTACT Position */\n#define SCB_SHCSR_MEMFAULTACT_Msk          (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/)         /*!< SCB SHCSR: MEMFAULTACT Mask */\n\n/* SCB Configurable Fault Status Register Definitions */\n#define SCB_CFSR_USGFAULTSR_Pos            16U                                            /*!< SCB CFSR: Usage Fault Status Register Position */\n#define SCB_CFSR_USGFAULTSR_Msk            (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos)          /*!< SCB CFSR: Usage Fault Status Register Mask */\n\n#define SCB_CFSR_BUSFAULTSR_Pos             8U                                            /*!< SCB CFSR: Bus Fault Status Register Position */\n#define SCB_CFSR_BUSFAULTSR_Msk            (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos)            /*!< SCB CFSR: Bus Fault Status Register Mask */\n\n#define SCB_CFSR_MEMFAULTSR_Pos             0U                                            /*!< SCB CFSR: Memory Manage Fault Status Register Position */\n#define SCB_CFSR_MEMFAULTSR_Msk            (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/)        /*!< SCB CFSR: Memory Manage Fault Status Register Mask */\n\n/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_MMARVALID_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 7U)               /*!< SCB CFSR (MMFSR): MMARVALID Position */\n#define SCB_CFSR_MMARVALID_Msk             (1UL << SCB_CFSR_MMARVALID_Pos)                /*!< SCB CFSR (MMFSR): MMARVALID Mask */\n\n#define SCB_CFSR_MLSPERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 5U)               /*!< SCB CFSR (MMFSR): MLSPERR Position */\n#define SCB_CFSR_MLSPERR_Msk               (1UL << SCB_CFSR_MLSPERR_Pos)                  /*!< SCB CFSR (MMFSR): MLSPERR Mask */\n\n#define SCB_CFSR_MSTKERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 4U)               /*!< SCB CFSR (MMFSR): MSTKERR Position */\n#define SCB_CFSR_MSTKERR_Msk               (1UL << SCB_CFSR_MSTKERR_Pos)                  /*!< SCB CFSR (MMFSR): MSTKERR Mask */\n\n#define SCB_CFSR_MUNSTKERR_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 3U)               /*!< SCB CFSR (MMFSR): MUNSTKERR Position */\n#define SCB_CFSR_MUNSTKERR_Msk             (1UL << SCB_CFSR_MUNSTKERR_Pos)                /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */\n\n#define SCB_CFSR_DACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 1U)               /*!< SCB CFSR (MMFSR): DACCVIOL Position */\n#define SCB_CFSR_DACCVIOL_Msk              (1UL << SCB_CFSR_DACCVIOL_Pos)                 /*!< SCB CFSR (MMFSR): DACCVIOL Mask */\n\n#define SCB_CFSR_IACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 0U)               /*!< SCB CFSR (MMFSR): IACCVIOL Position */\n#define SCB_CFSR_IACCVIOL_Msk              (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/)             /*!< SCB CFSR (MMFSR): IACCVIOL Mask */\n\n/* BusFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_BFARVALID_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 7U)                  /*!< SCB CFSR (BFSR): BFARVALID Position */\n#define SCB_CFSR_BFARVALID_Msk            (1UL << SCB_CFSR_BFARVALID_Pos)                 /*!< SCB CFSR (BFSR): BFARVALID Mask */\n\n#define SCB_CFSR_LSPERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 5U)                  /*!< SCB CFSR (BFSR): LSPERR Position */\n#define SCB_CFSR_LSPERR_Msk               (1UL << SCB_CFSR_LSPERR_Pos)                    /*!< SCB CFSR (BFSR): LSPERR Mask */\n\n#define SCB_CFSR_STKERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 4U)                  /*!< SCB CFSR (BFSR): STKERR Position */\n#define SCB_CFSR_STKERR_Msk               (1UL << SCB_CFSR_STKERR_Pos)                    /*!< SCB CFSR (BFSR): STKERR Mask */\n\n#define SCB_CFSR_UNSTKERR_Pos             (SCB_CFSR_BUSFAULTSR_Pos + 3U)                  /*!< SCB CFSR (BFSR): UNSTKERR Position */\n#define SCB_CFSR_UNSTKERR_Msk             (1UL << SCB_CFSR_UNSTKERR_Pos)                  /*!< SCB CFSR (BFSR): UNSTKERR Mask */\n\n#define SCB_CFSR_IMPRECISERR_Pos          (SCB_CFSR_BUSFAULTSR_Pos + 2U)                  /*!< SCB CFSR (BFSR): IMPRECISERR Position */\n#define SCB_CFSR_IMPRECISERR_Msk          (1UL << SCB_CFSR_IMPRECISERR_Pos)               /*!< SCB CFSR (BFSR): IMPRECISERR Mask */\n\n#define SCB_CFSR_PRECISERR_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 1U)                  /*!< SCB CFSR (BFSR): PRECISERR Position */\n#define SCB_CFSR_PRECISERR_Msk            (1UL << SCB_CFSR_PRECISERR_Pos)                 /*!< SCB CFSR (BFSR): PRECISERR Mask */\n\n#define SCB_CFSR_IBUSERR_Pos              (SCB_CFSR_BUSFAULTSR_Pos + 0U)                  /*!< SCB CFSR (BFSR): IBUSERR Position */\n#define SCB_CFSR_IBUSERR_Msk              (1UL << SCB_CFSR_IBUSERR_Pos)                   /*!< SCB CFSR (BFSR): IBUSERR Mask */\n\n/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_DIVBYZERO_Pos            (SCB_CFSR_USGFAULTSR_Pos + 9U)                  /*!< SCB CFSR (UFSR): DIVBYZERO Position */\n#define SCB_CFSR_DIVBYZERO_Msk            (1UL << SCB_CFSR_DIVBYZERO_Pos)                 /*!< SCB CFSR (UFSR): DIVBYZERO Mask */\n\n#define SCB_CFSR_UNALIGNED_Pos            (SCB_CFSR_USGFAULTSR_Pos + 8U)                  /*!< SCB CFSR (UFSR): UNALIGNED Position */\n#define SCB_CFSR_UNALIGNED_Msk            (1UL << SCB_CFSR_UNALIGNED_Pos)                 /*!< SCB CFSR (UFSR): UNALIGNED Mask */\n\n#define SCB_CFSR_NOCP_Pos                 (SCB_CFSR_USGFAULTSR_Pos + 3U)                  /*!< SCB CFSR (UFSR): NOCP Position */\n#define SCB_CFSR_NOCP_Msk                 (1UL << SCB_CFSR_NOCP_Pos)                      /*!< SCB CFSR (UFSR): NOCP Mask */\n\n#define SCB_CFSR_INVPC_Pos                (SCB_CFSR_USGFAULTSR_Pos + 2U)                  /*!< SCB CFSR (UFSR): INVPC Position */\n#define SCB_CFSR_INVPC_Msk                (1UL << SCB_CFSR_INVPC_Pos)                     /*!< SCB CFSR (UFSR): INVPC Mask */\n\n#define SCB_CFSR_INVSTATE_Pos             (SCB_CFSR_USGFAULTSR_Pos + 1U)                  /*!< SCB CFSR (UFSR): INVSTATE Position */\n#define SCB_CFSR_INVSTATE_Msk             (1UL << SCB_CFSR_INVSTATE_Pos)                  /*!< SCB CFSR (UFSR): INVSTATE Mask */\n\n#define SCB_CFSR_UNDEFINSTR_Pos           (SCB_CFSR_USGFAULTSR_Pos + 0U)                  /*!< SCB CFSR (UFSR): UNDEFINSTR Position */\n#define SCB_CFSR_UNDEFINSTR_Msk           (1UL << SCB_CFSR_UNDEFINSTR_Pos)                /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */\n\n/* SCB Hard Fault Status Register Definitions */\n#define SCB_HFSR_DEBUGEVT_Pos              31U                                            /*!< SCB HFSR: DEBUGEVT Position */\n#define SCB_HFSR_DEBUGEVT_Msk              (1UL << SCB_HFSR_DEBUGEVT_Pos)                 /*!< SCB HFSR: DEBUGEVT Mask */\n\n#define SCB_HFSR_FORCED_Pos                30U                                            /*!< SCB HFSR: FORCED Position */\n#define SCB_HFSR_FORCED_Msk                (1UL << SCB_HFSR_FORCED_Pos)                   /*!< SCB HFSR: FORCED Mask */\n\n#define SCB_HFSR_VECTTBL_Pos                1U                                            /*!< SCB HFSR: VECTTBL Position */\n#define SCB_HFSR_VECTTBL_Msk               (1UL << SCB_HFSR_VECTTBL_Pos)                  /*!< SCB HFSR: VECTTBL Mask */\n\n/* SCB Debug Fault Status Register Definitions */\n#define SCB_DFSR_EXTERNAL_Pos               4U                                            /*!< SCB DFSR: EXTERNAL Position */\n#define SCB_DFSR_EXTERNAL_Msk              (1UL << SCB_DFSR_EXTERNAL_Pos)                 /*!< SCB DFSR: EXTERNAL Mask */\n\n#define SCB_DFSR_VCATCH_Pos                 3U                                            /*!< SCB DFSR: VCATCH Position */\n#define SCB_DFSR_VCATCH_Msk                (1UL << SCB_DFSR_VCATCH_Pos)                   /*!< SCB DFSR: VCATCH Mask */\n\n#define SCB_DFSR_DWTTRAP_Pos                2U                                            /*!< SCB DFSR: DWTTRAP Position */\n#define SCB_DFSR_DWTTRAP_Msk               (1UL << SCB_DFSR_DWTTRAP_Pos)                  /*!< SCB DFSR: DWTTRAP Mask */\n\n#define SCB_DFSR_BKPT_Pos                   1U                                            /*!< SCB DFSR: BKPT Position */\n#define SCB_DFSR_BKPT_Msk                  (1UL << SCB_DFSR_BKPT_Pos)                     /*!< SCB DFSR: BKPT Mask */\n\n#define SCB_DFSR_HALTED_Pos                 0U                                            /*!< SCB DFSR: HALTED Position */\n#define SCB_DFSR_HALTED_Msk                (1UL /*<< SCB_DFSR_HALTED_Pos*/)               /*!< SCB DFSR: HALTED Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)\n  \\brief    Type definitions for the System Control and ID Register not in the SCB\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control and ID Register not in the SCB.\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IM  uint32_t ICTR;                   /*!< Offset: 0x004 (R/ )  Interrupt Controller Type Register */\n  __IOM uint32_t ACTLR;                  /*!< Offset: 0x008 (R/W)  Auxiliary Control Register */\n} SCnSCB_Type;\n\n/* Interrupt Controller Type Register Definitions */\n#define SCnSCB_ICTR_INTLINESNUM_Pos         0U                                         /*!< ICTR: INTLINESNUM Position */\n#define SCnSCB_ICTR_INTLINESNUM_Msk        (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/)  /*!< ICTR: INTLINESNUM Mask */\n\n/* Auxiliary Control Register Definitions */\n#define SCnSCB_ACTLR_DISOOFP_Pos            9U                                         /*!< ACTLR: DISOOFP Position */\n#define SCnSCB_ACTLR_DISOOFP_Msk           (1UL << SCnSCB_ACTLR_DISOOFP_Pos)           /*!< ACTLR: DISOOFP Mask */\n\n#define SCnSCB_ACTLR_DISFPCA_Pos            8U                                         /*!< ACTLR: DISFPCA Position */\n#define SCnSCB_ACTLR_DISFPCA_Msk           (1UL << SCnSCB_ACTLR_DISFPCA_Pos)           /*!< ACTLR: DISFPCA Mask */\n\n#define SCnSCB_ACTLR_DISFOLD_Pos            2U                                         /*!< ACTLR: DISFOLD Position */\n#define SCnSCB_ACTLR_DISFOLD_Msk           (1UL << SCnSCB_ACTLR_DISFOLD_Pos)           /*!< ACTLR: DISFOLD Mask */\n\n#define SCnSCB_ACTLR_DISDEFWBUF_Pos         1U                                         /*!< ACTLR: DISDEFWBUF Position */\n#define SCnSCB_ACTLR_DISDEFWBUF_Msk        (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos)        /*!< ACTLR: DISDEFWBUF Mask */\n\n#define SCnSCB_ACTLR_DISMCYCINT_Pos         0U                                         /*!< ACTLR: DISMCYCINT Position */\n#define SCnSCB_ACTLR_DISMCYCINT_Msk        (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/)    /*!< ACTLR: DISMCYCINT Mask */\n\n/*@} end of group CMSIS_SCnotSCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_ITM     Instrumentation Trace Macrocell (ITM)\n  \\brief    Type definitions for the Instrumentation Trace Macrocell (ITM)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Instrumentation Trace Macrocell Register (ITM).\n */\ntypedef struct\n{\n  __OM  union\n  {\n    __OM  uint8_t    u8;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit */\n    __OM  uint16_t   u16;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 16-bit */\n    __OM  uint32_t   u32;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 32-bit */\n  }  PORT [32U];                         /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers */\n        uint32_t RESERVED0[864U];\n  __IOM uint32_t TER;                    /*!< Offset: 0xE00 (R/W)  ITM Trace Enable Register */\n        uint32_t RESERVED1[15U];\n  __IOM uint32_t TPR;                    /*!< Offset: 0xE40 (R/W)  ITM Trace Privilege Register */\n        uint32_t RESERVED2[15U];\n  __IOM uint32_t TCR;                    /*!< Offset: 0xE80 (R/W)  ITM Trace Control Register */\n        uint32_t RESERVED3[29U];\n  __OM  uint32_t IWR;                    /*!< Offset: 0xEF8 ( /W)  ITM Integration Write Register */\n  __IM  uint32_t IRR;                    /*!< Offset: 0xEFC (R/ )  ITM Integration Read Register */\n  __IOM uint32_t IMCR;                   /*!< Offset: 0xF00 (R/W)  ITM Integration Mode Control Register */\n        uint32_t RESERVED4[43U];\n  __OM  uint32_t LAR;                    /*!< Offset: 0xFB0 ( /W)  ITM Lock Access Register */\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R/ )  ITM Lock Status Register */\n        uint32_t RESERVED5[6U];\n  __IM  uint32_t PID4;                   /*!< Offset: 0xFD0 (R/ )  ITM Peripheral Identification Register #4 */\n  __IM  uint32_t PID5;                   /*!< Offset: 0xFD4 (R/ )  ITM Peripheral Identification Register #5 */\n  __IM  uint32_t PID6;                   /*!< Offset: 0xFD8 (R/ )  ITM Peripheral Identification Register #6 */\n  __IM  uint32_t PID7;                   /*!< Offset: 0xFDC (R/ )  ITM Peripheral Identification Register #7 */\n  __IM  uint32_t PID0;                   /*!< Offset: 0xFE0 (R/ )  ITM Peripheral Identification Register #0 */\n  __IM  uint32_t PID1;                   /*!< Offset: 0xFE4 (R/ )  ITM Peripheral Identification Register #1 */\n  __IM  uint32_t PID2;                   /*!< Offset: 0xFE8 (R/ )  ITM Peripheral Identification Register #2 */\n  __IM  uint32_t PID3;                   /*!< Offset: 0xFEC (R/ )  ITM Peripheral Identification Register #3 */\n  __IM  uint32_t CID0;                   /*!< Offset: 0xFF0 (R/ )  ITM Component  Identification Register #0 */\n  __IM  uint32_t CID1;                   /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */\n  __IM  uint32_t CID2;                   /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */\n  __IM  uint32_t CID3;                   /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */\n} ITM_Type;\n\n/* ITM Trace Privilege Register Definitions */\n#define ITM_TPR_PRIVMASK_Pos                0U                                            /*!< ITM TPR: PRIVMASK Position */\n#define ITM_TPR_PRIVMASK_Msk               (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/)            /*!< ITM TPR: PRIVMASK Mask */\n\n/* ITM Trace Control Register Definitions */\n#define ITM_TCR_BUSY_Pos                   23U                                            /*!< ITM TCR: BUSY Position */\n#define ITM_TCR_BUSY_Msk                   (1UL << ITM_TCR_BUSY_Pos)                      /*!< ITM TCR: BUSY Mask */\n\n#define ITM_TCR_TraceBusID_Pos             16U                                            /*!< ITM TCR: ATBID Position */\n#define ITM_TCR_TraceBusID_Msk             (0x7FUL << ITM_TCR_TraceBusID_Pos)             /*!< ITM TCR: ATBID Mask */\n\n#define ITM_TCR_GTSFREQ_Pos                10U                                            /*!< ITM TCR: Global timestamp frequency Position */\n#define ITM_TCR_GTSFREQ_Msk                (3UL << ITM_TCR_GTSFREQ_Pos)                   /*!< ITM TCR: Global timestamp frequency Mask */\n\n#define ITM_TCR_TSPrescale_Pos              8U                                            /*!< ITM TCR: TSPrescale Position */\n#define ITM_TCR_TSPrescale_Msk             (3UL << ITM_TCR_TSPrescale_Pos)                /*!< ITM TCR: TSPrescale Mask */\n\n#define ITM_TCR_SWOENA_Pos                  4U                                            /*!< ITM TCR: SWOENA Position */\n#define ITM_TCR_SWOENA_Msk                 (1UL << ITM_TCR_SWOENA_Pos)                    /*!< ITM TCR: SWOENA Mask */\n\n#define ITM_TCR_DWTENA_Pos                  3U                                            /*!< ITM TCR: DWTENA Position */\n#define ITM_TCR_DWTENA_Msk                 (1UL << ITM_TCR_DWTENA_Pos)                    /*!< ITM TCR: DWTENA Mask */\n\n#define ITM_TCR_SYNCENA_Pos                 2U                                            /*!< ITM TCR: SYNCENA Position */\n#define ITM_TCR_SYNCENA_Msk                (1UL << ITM_TCR_SYNCENA_Pos)                   /*!< ITM TCR: SYNCENA Mask */\n\n#define ITM_TCR_TSENA_Pos                   1U                                            /*!< ITM TCR: TSENA Position */\n#define ITM_TCR_TSENA_Msk                  (1UL << ITM_TCR_TSENA_Pos)                     /*!< ITM TCR: TSENA Mask */\n\n#define ITM_TCR_ITMENA_Pos                  0U                                            /*!< ITM TCR: ITM Enable bit Position */\n#define ITM_TCR_ITMENA_Msk                 (1UL /*<< ITM_TCR_ITMENA_Pos*/)                /*!< ITM TCR: ITM Enable bit Mask */\n\n/* ITM Integration Write Register Definitions */\n#define ITM_IWR_ATVALIDM_Pos                0U                                            /*!< ITM IWR: ATVALIDM Position */\n#define ITM_IWR_ATVALIDM_Msk               (1UL /*<< ITM_IWR_ATVALIDM_Pos*/)              /*!< ITM IWR: ATVALIDM Mask */\n\n/* ITM Integration Read Register Definitions */\n#define ITM_IRR_ATREADYM_Pos                0U                                            /*!< ITM IRR: ATREADYM Position */\n#define ITM_IRR_ATREADYM_Msk               (1UL /*<< ITM_IRR_ATREADYM_Pos*/)              /*!< ITM IRR: ATREADYM Mask */\n\n/* ITM Integration Mode Control Register Definitions */\n#define ITM_IMCR_INTEGRATION_Pos            0U                                            /*!< ITM IMCR: INTEGRATION Position */\n#define ITM_IMCR_INTEGRATION_Msk           (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/)          /*!< ITM IMCR: INTEGRATION Mask */\n\n/* ITM Lock Status Register Definitions */\n#define ITM_LSR_ByteAcc_Pos                 2U                                            /*!< ITM LSR: ByteAcc Position */\n#define ITM_LSR_ByteAcc_Msk                (1UL << ITM_LSR_ByteAcc_Pos)                   /*!< ITM LSR: ByteAcc Mask */\n\n#define ITM_LSR_Access_Pos                  1U                                            /*!< ITM LSR: Access Position */\n#define ITM_LSR_Access_Msk                 (1UL << ITM_LSR_Access_Pos)                    /*!< ITM LSR: Access Mask */\n\n#define ITM_LSR_Present_Pos                 0U                                            /*!< ITM LSR: Present Position */\n#define ITM_LSR_Present_Msk                (1UL /*<< ITM_LSR_Present_Pos*/)               /*!< ITM LSR: Present Mask */\n\n/*@}*/ /* end of group CMSIS_ITM */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)\n  \\brief    Type definitions for the Data Watchpoint and Trace (DWT)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Data Watchpoint and Trace Register (DWT).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  Control Register */\n  __IOM uint32_t CYCCNT;                 /*!< Offset: 0x004 (R/W)  Cycle Count Register */\n  __IOM uint32_t CPICNT;                 /*!< Offset: 0x008 (R/W)  CPI Count Register */\n  __IOM uint32_t EXCCNT;                 /*!< Offset: 0x00C (R/W)  Exception Overhead Count Register */\n  __IOM uint32_t SLEEPCNT;               /*!< Offset: 0x010 (R/W)  Sleep Count Register */\n  __IOM uint32_t LSUCNT;                 /*!< Offset: 0x014 (R/W)  LSU Count Register */\n  __IOM uint32_t FOLDCNT;                /*!< Offset: 0x018 (R/W)  Folded-instruction Count Register */\n  __IM  uint32_t PCSR;                   /*!< Offset: 0x01C (R/ )  Program Counter Sample Register */\n  __IOM uint32_t COMP0;                  /*!< Offset: 0x020 (R/W)  Comparator Register 0 */\n  __IOM uint32_t MASK0;                  /*!< Offset: 0x024 (R/W)  Mask Register 0 */\n  __IOM uint32_t FUNCTION0;              /*!< Offset: 0x028 (R/W)  Function Register 0 */\n        uint32_t RESERVED0[1U];\n  __IOM uint32_t COMP1;                  /*!< Offset: 0x030 (R/W)  Comparator Register 1 */\n  __IOM uint32_t MASK1;                  /*!< Offset: 0x034 (R/W)  Mask Register 1 */\n  __IOM uint32_t FUNCTION1;              /*!< Offset: 0x038 (R/W)  Function Register 1 */\n        uint32_t RESERVED1[1U];\n  __IOM uint32_t COMP2;                  /*!< Offset: 0x040 (R/W)  Comparator Register 2 */\n  __IOM uint32_t MASK2;                  /*!< Offset: 0x044 (R/W)  Mask Register 2 */\n  __IOM uint32_t FUNCTION2;              /*!< Offset: 0x048 (R/W)  Function Register 2 */\n        uint32_t RESERVED2[1U];\n  __IOM uint32_t COMP3;                  /*!< Offset: 0x050 (R/W)  Comparator Register 3 */\n  __IOM uint32_t MASK3;                  /*!< Offset: 0x054 (R/W)  Mask Register 3 */\n  __IOM uint32_t FUNCTION3;              /*!< Offset: 0x058 (R/W)  Function Register 3 */\n} DWT_Type;\n\n/* DWT Control Register Definitions */\n#define DWT_CTRL_NUMCOMP_Pos               28U                                         /*!< DWT CTRL: NUMCOMP Position */\n#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */\n\n#define DWT_CTRL_NOTRCPKT_Pos              27U                                         /*!< DWT CTRL: NOTRCPKT Position */\n#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */\n\n#define DWT_CTRL_NOEXTTRIG_Pos             26U                                         /*!< DWT CTRL: NOEXTTRIG Position */\n#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */\n\n#define DWT_CTRL_NOCYCCNT_Pos              25U                                         /*!< DWT CTRL: NOCYCCNT Position */\n#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */\n\n#define DWT_CTRL_NOPRFCNT_Pos              24U                                         /*!< DWT CTRL: NOPRFCNT Position */\n#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */\n\n#define DWT_CTRL_CYCEVTENA_Pos             22U                                         /*!< DWT CTRL: CYCEVTENA Position */\n#define DWT_CTRL_CYCEVTENA_Msk             (0x1UL << DWT_CTRL_CYCEVTENA_Pos)           /*!< DWT CTRL: CYCEVTENA Mask */\n\n#define DWT_CTRL_FOLDEVTENA_Pos            21U                                         /*!< DWT CTRL: FOLDEVTENA Position */\n#define DWT_CTRL_FOLDEVTENA_Msk            (0x1UL << DWT_CTRL_FOLDEVTENA_Pos)          /*!< DWT CTRL: FOLDEVTENA Mask */\n\n#define DWT_CTRL_LSUEVTENA_Pos             20U                                         /*!< DWT CTRL: LSUEVTENA Position */\n#define DWT_CTRL_LSUEVTENA_Msk             (0x1UL << DWT_CTRL_LSUEVTENA_Pos)           /*!< DWT CTRL: LSUEVTENA Mask */\n\n#define DWT_CTRL_SLEEPEVTENA_Pos           19U                                         /*!< DWT CTRL: SLEEPEVTENA Position */\n#define DWT_CTRL_SLEEPEVTENA_Msk           (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos)         /*!< DWT CTRL: SLEEPEVTENA Mask */\n\n#define DWT_CTRL_EXCEVTENA_Pos             18U                                         /*!< DWT CTRL: EXCEVTENA Position */\n#define DWT_CTRL_EXCEVTENA_Msk             (0x1UL << DWT_CTRL_EXCEVTENA_Pos)           /*!< DWT CTRL: EXCEVTENA Mask */\n\n#define DWT_CTRL_CPIEVTENA_Pos             17U                                         /*!< DWT CTRL: CPIEVTENA Position */\n#define DWT_CTRL_CPIEVTENA_Msk             (0x1UL << DWT_CTRL_CPIEVTENA_Pos)           /*!< DWT CTRL: CPIEVTENA Mask */\n\n#define DWT_CTRL_EXCTRCENA_Pos             16U                                         /*!< DWT CTRL: EXCTRCENA Position */\n#define DWT_CTRL_EXCTRCENA_Msk             (0x1UL << DWT_CTRL_EXCTRCENA_Pos)           /*!< DWT CTRL: EXCTRCENA Mask */\n\n#define DWT_CTRL_PCSAMPLENA_Pos            12U                                         /*!< DWT CTRL: PCSAMPLENA Position */\n#define DWT_CTRL_PCSAMPLENA_Msk            (0x1UL << DWT_CTRL_PCSAMPLENA_Pos)          /*!< DWT CTRL: PCSAMPLENA Mask */\n\n#define DWT_CTRL_SYNCTAP_Pos               10U                                         /*!< DWT CTRL: SYNCTAP Position */\n#define DWT_CTRL_SYNCTAP_Msk               (0x3UL << DWT_CTRL_SYNCTAP_Pos)             /*!< DWT CTRL: SYNCTAP Mask */\n\n#define DWT_CTRL_CYCTAP_Pos                 9U                                         /*!< DWT CTRL: CYCTAP Position */\n#define DWT_CTRL_CYCTAP_Msk                (0x1UL << DWT_CTRL_CYCTAP_Pos)              /*!< DWT CTRL: CYCTAP Mask */\n\n#define DWT_CTRL_POSTINIT_Pos               5U                                         /*!< DWT CTRL: POSTINIT Position */\n#define DWT_CTRL_POSTINIT_Msk              (0xFUL << DWT_CTRL_POSTINIT_Pos)            /*!< DWT CTRL: POSTINIT Mask */\n\n#define DWT_CTRL_POSTPRESET_Pos             1U                                         /*!< DWT CTRL: POSTPRESET Position */\n#define DWT_CTRL_POSTPRESET_Msk            (0xFUL << DWT_CTRL_POSTPRESET_Pos)          /*!< DWT CTRL: POSTPRESET Mask */\n\n#define DWT_CTRL_CYCCNTENA_Pos              0U                                         /*!< DWT CTRL: CYCCNTENA Position */\n#define DWT_CTRL_CYCCNTENA_Msk             (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/)       /*!< DWT CTRL: CYCCNTENA Mask */\n\n/* DWT CPI Count Register Definitions */\n#define DWT_CPICNT_CPICNT_Pos               0U                                         /*!< DWT CPICNT: CPICNT Position */\n#define DWT_CPICNT_CPICNT_Msk              (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/)       /*!< DWT CPICNT: CPICNT Mask */\n\n/* DWT Exception Overhead Count Register Definitions */\n#define DWT_EXCCNT_EXCCNT_Pos               0U                                         /*!< DWT EXCCNT: EXCCNT Position */\n#define DWT_EXCCNT_EXCCNT_Msk              (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/)       /*!< DWT EXCCNT: EXCCNT Mask */\n\n/* DWT Sleep Count Register Definitions */\n#define DWT_SLEEPCNT_SLEEPCNT_Pos           0U                                         /*!< DWT SLEEPCNT: SLEEPCNT Position */\n#define DWT_SLEEPCNT_SLEEPCNT_Msk          (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/)   /*!< DWT SLEEPCNT: SLEEPCNT Mask */\n\n/* DWT LSU Count Register Definitions */\n#define DWT_LSUCNT_LSUCNT_Pos               0U                                         /*!< DWT LSUCNT: LSUCNT Position */\n#define DWT_LSUCNT_LSUCNT_Msk              (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/)       /*!< DWT LSUCNT: LSUCNT Mask */\n\n/* DWT Folded-instruction Count Register Definitions */\n#define DWT_FOLDCNT_FOLDCNT_Pos             0U                                         /*!< DWT FOLDCNT: FOLDCNT Position */\n#define DWT_FOLDCNT_FOLDCNT_Msk            (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/)     /*!< DWT FOLDCNT: FOLDCNT Mask */\n\n/* DWT Comparator Mask Register Definitions */\n#define DWT_MASK_MASK_Pos                   0U                                         /*!< DWT MASK: MASK Position */\n#define DWT_MASK_MASK_Msk                  (0x1FUL /*<< DWT_MASK_MASK_Pos*/)           /*!< DWT MASK: MASK Mask */\n\n/* DWT Comparator Function Register Definitions */\n#define DWT_FUNCTION_MATCHED_Pos           24U                                         /*!< DWT FUNCTION: MATCHED Position */\n#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */\n\n#define DWT_FUNCTION_DATAVADDR1_Pos        16U                                         /*!< DWT FUNCTION: DATAVADDR1 Position */\n#define DWT_FUNCTION_DATAVADDR1_Msk        (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos)      /*!< DWT FUNCTION: DATAVADDR1 Mask */\n\n#define DWT_FUNCTION_DATAVADDR0_Pos        12U                                         /*!< DWT FUNCTION: DATAVADDR0 Position */\n#define DWT_FUNCTION_DATAVADDR0_Msk        (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos)      /*!< DWT FUNCTION: DATAVADDR0 Mask */\n\n#define DWT_FUNCTION_DATAVSIZE_Pos         10U                                         /*!< DWT FUNCTION: DATAVSIZE Position */\n#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */\n\n#define DWT_FUNCTION_LNK1ENA_Pos            9U                                         /*!< DWT FUNCTION: LNK1ENA Position */\n#define DWT_FUNCTION_LNK1ENA_Msk           (0x1UL << DWT_FUNCTION_LNK1ENA_Pos)         /*!< DWT FUNCTION: LNK1ENA Mask */\n\n#define DWT_FUNCTION_DATAVMATCH_Pos         8U                                         /*!< DWT FUNCTION: DATAVMATCH Position */\n#define DWT_FUNCTION_DATAVMATCH_Msk        (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos)      /*!< DWT FUNCTION: DATAVMATCH Mask */\n\n#define DWT_FUNCTION_CYCMATCH_Pos           7U                                         /*!< DWT FUNCTION: CYCMATCH Position */\n#define DWT_FUNCTION_CYCMATCH_Msk          (0x1UL << DWT_FUNCTION_CYCMATCH_Pos)        /*!< DWT FUNCTION: CYCMATCH Mask */\n\n#define DWT_FUNCTION_EMITRANGE_Pos          5U                                         /*!< DWT FUNCTION: EMITRANGE Position */\n#define DWT_FUNCTION_EMITRANGE_Msk         (0x1UL << DWT_FUNCTION_EMITRANGE_Pos)       /*!< DWT FUNCTION: EMITRANGE Mask */\n\n#define DWT_FUNCTION_FUNCTION_Pos           0U                                         /*!< DWT FUNCTION: FUNCTION Position */\n#define DWT_FUNCTION_FUNCTION_Msk          (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/)    /*!< DWT FUNCTION: FUNCTION Mask */\n\n/*@}*/ /* end of group CMSIS_DWT */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_TPI     Trace Port Interface (TPI)\n  \\brief    Type definitions for the Trace Port Interface (TPI)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Trace Port Interface Register (TPI).\n */\ntypedef struct\n{\n  __IOM uint32_t SSPSR;                  /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register */\n  __IOM uint32_t CSPSR;                  /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */\n        uint32_t RESERVED0[2U];\n  __IOM uint32_t ACPR;                   /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */\n        uint32_t RESERVED1[55U];\n  __IOM uint32_t SPPR;                   /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */\n        uint32_t RESERVED2[131U];\n  __IM  uint32_t FFSR;                   /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */\n  __IOM uint32_t FFCR;                   /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */\n  __IM  uint32_t FSCR;                   /*!< Offset: 0x308 (R/ )  Formatter Synchronization Counter Register */\n        uint32_t RESERVED3[759U];\n  __IM  uint32_t TRIGGER;                /*!< Offset: 0xEE8 (R/ )  TRIGGER */\n  __IM  uint32_t FIFO0;                  /*!< Offset: 0xEEC (R/ )  Integration ETM Data */\n  __IM  uint32_t ITATBCTR2;              /*!< Offset: 0xEF0 (R/ )  ITATBCTR2 */\n        uint32_t RESERVED4[1U];\n  __IM  uint32_t ITATBCTR0;              /*!< Offset: 0xEF8 (R/ )  ITATBCTR0 */\n  __IM  uint32_t FIFO1;                  /*!< Offset: 0xEFC (R/ )  Integration ITM Data */\n  __IOM uint32_t ITCTRL;                 /*!< Offset: 0xF00 (R/W)  Integration Mode Control */\n        uint32_t RESERVED5[39U];\n  __IOM uint32_t CLAIMSET;               /*!< Offset: 0xFA0 (R/W)  Claim tag set */\n  __IOM uint32_t CLAIMCLR;               /*!< Offset: 0xFA4 (R/W)  Claim tag clear */\n        uint32_t RESERVED7[8U];\n  __IM  uint32_t DEVID;                  /*!< Offset: 0xFC8 (R/ )  TPIU_DEVID */\n  __IM  uint32_t DEVTYPE;                /*!< Offset: 0xFCC (R/ )  TPIU_DEVTYPE */\n} TPI_Type;\n\n/* TPI Asynchronous Clock Prescaler Register Definitions */\n#define TPI_ACPR_PRESCALER_Pos              0U                                         /*!< TPI ACPR: PRESCALER Position */\n#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/)    /*!< TPI ACPR: PRESCALER Mask */\n\n/* TPI Selected Pin Protocol Register Definitions */\n#define TPI_SPPR_TXMODE_Pos                 0U                                         /*!< TPI SPPR: TXMODE Position */\n#define TPI_SPPR_TXMODE_Msk                (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/)          /*!< TPI SPPR: TXMODE Mask */\n\n/* TPI Formatter and Flush Status Register Definitions */\n#define TPI_FFSR_FtNonStop_Pos              3U                                         /*!< TPI FFSR: FtNonStop Position */\n#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */\n\n#define TPI_FFSR_TCPresent_Pos              2U                                         /*!< TPI FFSR: TCPresent Position */\n#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */\n\n#define TPI_FFSR_FtStopped_Pos              1U                                         /*!< TPI FFSR: FtStopped Position */\n#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */\n\n#define TPI_FFSR_FlInProg_Pos               0U                                         /*!< TPI FFSR: FlInProg Position */\n#define TPI_FFSR_FlInProg_Msk              (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/)        /*!< TPI FFSR: FlInProg Mask */\n\n/* TPI Formatter and Flush Control Register Definitions */\n#define TPI_FFCR_TrigIn_Pos                 8U                                         /*!< TPI FFCR: TrigIn Position */\n#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */\n\n#define TPI_FFCR_EnFCont_Pos                1U                                         /*!< TPI FFCR: EnFCont Position */\n#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */\n\n/* TPI TRIGGER Register Definitions */\n#define TPI_TRIGGER_TRIGGER_Pos             0U                                         /*!< TPI TRIGGER: TRIGGER Position */\n#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/)      /*!< TPI TRIGGER: TRIGGER Mask */\n\n/* TPI Integration ETM Data Register Definitions (FIFO0) */\n#define TPI_FIFO0_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO0: ITM_ATVALID Position */\n#define TPI_FIFO0_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos)        /*!< TPI FIFO0: ITM_ATVALID Mask */\n\n#define TPI_FIFO0_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO0: ITM_bytecount Position */\n#define TPI_FIFO0_ITM_bytecount_Msk        (0x3UL << TPI_FIFO0_ITM_bytecount_Pos)      /*!< TPI FIFO0: ITM_bytecount Mask */\n\n#define TPI_FIFO0_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO0: ETM_ATVALID Position */\n#define TPI_FIFO0_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos)        /*!< TPI FIFO0: ETM_ATVALID Mask */\n\n#define TPI_FIFO0_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO0: ETM_bytecount Position */\n#define TPI_FIFO0_ETM_bytecount_Msk        (0x3UL << TPI_FIFO0_ETM_bytecount_Pos)      /*!< TPI FIFO0: ETM_bytecount Mask */\n\n#define TPI_FIFO0_ETM2_Pos                 16U                                         /*!< TPI FIFO0: ETM2 Position */\n#define TPI_FIFO0_ETM2_Msk                 (0xFFUL << TPI_FIFO0_ETM2_Pos)              /*!< TPI FIFO0: ETM2 Mask */\n\n#define TPI_FIFO0_ETM1_Pos                  8U                                         /*!< TPI FIFO0: ETM1 Position */\n#define TPI_FIFO0_ETM1_Msk                 (0xFFUL << TPI_FIFO0_ETM1_Pos)              /*!< TPI FIFO0: ETM1 Mask */\n\n#define TPI_FIFO0_ETM0_Pos                  0U                                         /*!< TPI FIFO0: ETM0 Position */\n#define TPI_FIFO0_ETM0_Msk                 (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/)          /*!< TPI FIFO0: ETM0 Mask */\n\n/* TPI ITATBCTR2 Register Definitions */\n#define TPI_ITATBCTR2_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR2: ATREADY Position */\n#define TPI_ITATBCTR2_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/)    /*!< TPI ITATBCTR2: ATREADY Mask */\n\n/* TPI Integration ITM Data Register Definitions (FIFO1) */\n#define TPI_FIFO1_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO1: ITM_ATVALID Position */\n#define TPI_FIFO1_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos)        /*!< TPI FIFO1: ITM_ATVALID Mask */\n\n#define TPI_FIFO1_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO1: ITM_bytecount Position */\n#define TPI_FIFO1_ITM_bytecount_Msk        (0x3UL << TPI_FIFO1_ITM_bytecount_Pos)      /*!< TPI FIFO1: ITM_bytecount Mask */\n\n#define TPI_FIFO1_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO1: ETM_ATVALID Position */\n#define TPI_FIFO1_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos)        /*!< TPI FIFO1: ETM_ATVALID Mask */\n\n#define TPI_FIFO1_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO1: ETM_bytecount Position */\n#define TPI_FIFO1_ETM_bytecount_Msk        (0x3UL << TPI_FIFO1_ETM_bytecount_Pos)      /*!< TPI FIFO1: ETM_bytecount Mask */\n\n#define TPI_FIFO1_ITM2_Pos                 16U                                         /*!< TPI FIFO1: ITM2 Position */\n#define TPI_FIFO1_ITM2_Msk                 (0xFFUL << TPI_FIFO1_ITM2_Pos)              /*!< TPI FIFO1: ITM2 Mask */\n\n#define TPI_FIFO1_ITM1_Pos                  8U                                         /*!< TPI FIFO1: ITM1 Position */\n#define TPI_FIFO1_ITM1_Msk                 (0xFFUL << TPI_FIFO1_ITM1_Pos)              /*!< TPI FIFO1: ITM1 Mask */\n\n#define TPI_FIFO1_ITM0_Pos                  0U                                         /*!< TPI FIFO1: ITM0 Position */\n#define TPI_FIFO1_ITM0_Msk                 (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/)          /*!< TPI FIFO1: ITM0 Mask */\n\n/* TPI ITATBCTR0 Register Definitions */\n#define TPI_ITATBCTR0_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR0: ATREADY Position */\n#define TPI_ITATBCTR0_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/)    /*!< TPI ITATBCTR0: ATREADY Mask */\n\n/* TPI Integration Mode Control Register Definitions */\n#define TPI_ITCTRL_Mode_Pos                 0U                                         /*!< TPI ITCTRL: Mode Position */\n#define TPI_ITCTRL_Mode_Msk                (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/)          /*!< TPI ITCTRL: Mode Mask */\n\n/* TPI DEVID Register Definitions */\n#define TPI_DEVID_NRZVALID_Pos             11U                                         /*!< TPI DEVID: NRZVALID Position */\n#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */\n\n#define TPI_DEVID_MANCVALID_Pos            10U                                         /*!< TPI DEVID: MANCVALID Position */\n#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */\n\n#define TPI_DEVID_PTINVALID_Pos             9U                                         /*!< TPI DEVID: PTINVALID Position */\n#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */\n\n#define TPI_DEVID_MinBufSz_Pos              6U                                         /*!< TPI DEVID: MinBufSz Position */\n#define TPI_DEVID_MinBufSz_Msk             (0x7UL << TPI_DEVID_MinBufSz_Pos)           /*!< TPI DEVID: MinBufSz Mask */\n\n#define TPI_DEVID_AsynClkIn_Pos             5U                                         /*!< TPI DEVID: AsynClkIn Position */\n#define TPI_DEVID_AsynClkIn_Msk            (0x1UL << TPI_DEVID_AsynClkIn_Pos)          /*!< TPI DEVID: AsynClkIn Mask */\n\n#define TPI_DEVID_NrTraceInput_Pos          0U                                         /*!< TPI DEVID: NrTraceInput Position */\n#define TPI_DEVID_NrTraceInput_Msk         (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/)  /*!< TPI DEVID: NrTraceInput Mask */\n\n/* TPI DEVTYPE Register Definitions */\n#define TPI_DEVTYPE_MajorType_Pos           4U                                         /*!< TPI DEVTYPE: MajorType Position */\n#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */\n\n#define TPI_DEVTYPE_SubType_Pos             0U                                         /*!< TPI DEVTYPE: SubType Position */\n#define TPI_DEVTYPE_SubType_Msk            (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/)      /*!< TPI DEVTYPE: SubType Mask */\n\n/*@}*/ /* end of group CMSIS_TPI */\n\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RASR;                   /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A1;                /*!< Offset: 0x014 (R/W)  MPU Alias 1 Region Base Address Register */\n  __IOM uint32_t RASR_A1;                /*!< Offset: 0x018 (R/W)  MPU Alias 1 Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A2;                /*!< Offset: 0x01C (R/W)  MPU Alias 2 Region Base Address Register */\n  __IOM uint32_t RASR_A2;                /*!< Offset: 0x020 (R/W)  MPU Alias 2 Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A3;                /*!< Offset: 0x024 (R/W)  MPU Alias 3 Region Base Address Register */\n  __IOM uint32_t RASR_A3;                /*!< Offset: 0x028 (R/W)  MPU Alias 3 Region Attribute and Size Register */\n} MPU_Type;\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_ADDR_Pos                   5U                                            /*!< MPU RBAR: ADDR Position */\n#define MPU_RBAR_ADDR_Msk                  (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos)             /*!< MPU RBAR: ADDR Mask */\n\n#define MPU_RBAR_VALID_Pos                  4U                                            /*!< MPU RBAR: VALID Position */\n#define MPU_RBAR_VALID_Msk                 (1UL << MPU_RBAR_VALID_Pos)                    /*!< MPU RBAR: VALID Mask */\n\n#define MPU_RBAR_REGION_Pos                 0U                                            /*!< MPU RBAR: REGION Position */\n#define MPU_RBAR_REGION_Msk                (0xFUL /*<< MPU_RBAR_REGION_Pos*/)             /*!< MPU RBAR: REGION Mask */\n\n/* MPU Region Attribute and Size Register Definitions */\n#define MPU_RASR_ATTRS_Pos                 16U                                            /*!< MPU RASR: MPU Region Attribute field Position */\n#define MPU_RASR_ATTRS_Msk                 (0xFFFFUL << MPU_RASR_ATTRS_Pos)               /*!< MPU RASR: MPU Region Attribute field Mask */\n\n#define MPU_RASR_XN_Pos                    28U                                            /*!< MPU RASR: ATTRS.XN Position */\n#define MPU_RASR_XN_Msk                    (1UL << MPU_RASR_XN_Pos)                       /*!< MPU RASR: ATTRS.XN Mask */\n\n#define MPU_RASR_AP_Pos                    24U                                            /*!< MPU RASR: ATTRS.AP Position */\n#define MPU_RASR_AP_Msk                    (0x7UL << MPU_RASR_AP_Pos)                     /*!< MPU RASR: ATTRS.AP Mask */\n\n#define MPU_RASR_TEX_Pos                   19U                                            /*!< MPU RASR: ATTRS.TEX Position */\n#define MPU_RASR_TEX_Msk                   (0x7UL << MPU_RASR_TEX_Pos)                    /*!< MPU RASR: ATTRS.TEX Mask */\n\n#define MPU_RASR_S_Pos                     18U                                            /*!< MPU RASR: ATTRS.S Position */\n#define MPU_RASR_S_Msk                     (1UL << MPU_RASR_S_Pos)                        /*!< MPU RASR: ATTRS.S Mask */\n\n#define MPU_RASR_C_Pos                     17U                                            /*!< MPU RASR: ATTRS.C Position */\n#define MPU_RASR_C_Msk                     (1UL << MPU_RASR_C_Pos)                        /*!< MPU RASR: ATTRS.C Mask */\n\n#define MPU_RASR_B_Pos                     16U                                            /*!< MPU RASR: ATTRS.B Position */\n#define MPU_RASR_B_Msk                     (1UL << MPU_RASR_B_Pos)                        /*!< MPU RASR: ATTRS.B Mask */\n\n#define MPU_RASR_SRD_Pos                    8U                                            /*!< MPU RASR: Sub-Region Disable Position */\n#define MPU_RASR_SRD_Msk                   (0xFFUL << MPU_RASR_SRD_Pos)                   /*!< MPU RASR: Sub-Region Disable Mask */\n\n#define MPU_RASR_SIZE_Pos                   1U                                            /*!< MPU RASR: Region Size Field Position */\n#define MPU_RASR_SIZE_Msk                  (0x1FUL << MPU_RASR_SIZE_Pos)                  /*!< MPU RASR: Region Size Field Mask */\n\n#define MPU_RASR_ENABLE_Pos                 0U                                            /*!< MPU RASR: Region enable bit Position */\n#define MPU_RASR_ENABLE_Msk                (1UL /*<< MPU_RASR_ENABLE_Pos*/)               /*!< MPU RASR: Region enable bit Disable Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_FPU     Floating Point Unit (FPU)\n  \\brief    Type definitions for the Floating Point Unit (FPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Floating Point Unit (FPU).\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IOM uint32_t FPCCR;                  /*!< Offset: 0x004 (R/W)  Floating-Point Context Control Register */\n  __IOM uint32_t FPCAR;                  /*!< Offset: 0x008 (R/W)  Floating-Point Context Address Register */\n  __IOM uint32_t FPDSCR;                 /*!< Offset: 0x00C (R/W)  Floating-Point Default Status Control Register */\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x010 (R/ )  Media and FP Feature Register 0 */\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x014 (R/ )  Media and FP Feature Register 1 */\n} FPU_Type;\n\n/* Floating-Point Context Control Register Definitions */\n#define FPU_FPCCR_ASPEN_Pos                31U                                            /*!< FPCCR: ASPEN bit Position */\n#define FPU_FPCCR_ASPEN_Msk                (1UL << FPU_FPCCR_ASPEN_Pos)                   /*!< FPCCR: ASPEN bit Mask */\n\n#define FPU_FPCCR_LSPEN_Pos                30U                                            /*!< FPCCR: LSPEN Position */\n#define FPU_FPCCR_LSPEN_Msk                (1UL << FPU_FPCCR_LSPEN_Pos)                   /*!< FPCCR: LSPEN bit Mask */\n\n#define FPU_FPCCR_MONRDY_Pos                8U                                            /*!< FPCCR: MONRDY Position */\n#define FPU_FPCCR_MONRDY_Msk               (1UL << FPU_FPCCR_MONRDY_Pos)                  /*!< FPCCR: MONRDY bit Mask */\n\n#define FPU_FPCCR_BFRDY_Pos                 6U                                            /*!< FPCCR: BFRDY Position */\n#define FPU_FPCCR_BFRDY_Msk                (1UL << FPU_FPCCR_BFRDY_Pos)                   /*!< FPCCR: BFRDY bit Mask */\n\n#define FPU_FPCCR_MMRDY_Pos                 5U                                            /*!< FPCCR: MMRDY Position */\n#define FPU_FPCCR_MMRDY_Msk                (1UL << FPU_FPCCR_MMRDY_Pos)                   /*!< FPCCR: MMRDY bit Mask */\n\n#define FPU_FPCCR_HFRDY_Pos                 4U                                            /*!< FPCCR: HFRDY Position */\n#define FPU_FPCCR_HFRDY_Msk                (1UL << FPU_FPCCR_HFRDY_Pos)                   /*!< FPCCR: HFRDY bit Mask */\n\n#define FPU_FPCCR_THREAD_Pos                3U                                            /*!< FPCCR: processor mode bit Position */\n#define FPU_FPCCR_THREAD_Msk               (1UL << FPU_FPCCR_THREAD_Pos)                  /*!< FPCCR: processor mode active bit Mask */\n\n#define FPU_FPCCR_USER_Pos                  1U                                            /*!< FPCCR: privilege level bit Position */\n#define FPU_FPCCR_USER_Msk                 (1UL << FPU_FPCCR_USER_Pos)                    /*!< FPCCR: privilege level bit Mask */\n\n#define FPU_FPCCR_LSPACT_Pos                0U                                            /*!< FPCCR: Lazy state preservation active bit Position */\n#define FPU_FPCCR_LSPACT_Msk               (1UL /*<< FPU_FPCCR_LSPACT_Pos*/)              /*!< FPCCR: Lazy state preservation active bit Mask */\n\n/* Floating-Point Context Address Register Definitions */\n#define FPU_FPCAR_ADDRESS_Pos               3U                                            /*!< FPCAR: ADDRESS bit Position */\n#define FPU_FPCAR_ADDRESS_Msk              (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos)        /*!< FPCAR: ADDRESS bit Mask */\n\n/* Floating-Point Default Status Control Register Definitions */\n#define FPU_FPDSCR_AHP_Pos                 26U                                            /*!< FPDSCR: AHP bit Position */\n#define FPU_FPDSCR_AHP_Msk                 (1UL << FPU_FPDSCR_AHP_Pos)                    /*!< FPDSCR: AHP bit Mask */\n\n#define FPU_FPDSCR_DN_Pos                  25U                                            /*!< FPDSCR: DN bit Position */\n#define FPU_FPDSCR_DN_Msk                  (1UL << FPU_FPDSCR_DN_Pos)                     /*!< FPDSCR: DN bit Mask */\n\n#define FPU_FPDSCR_FZ_Pos                  24U                                            /*!< FPDSCR: FZ bit Position */\n#define FPU_FPDSCR_FZ_Msk                  (1UL << FPU_FPDSCR_FZ_Pos)                     /*!< FPDSCR: FZ bit Mask */\n\n#define FPU_FPDSCR_RMode_Pos               22U                                            /*!< FPDSCR: RMode bit Position */\n#define FPU_FPDSCR_RMode_Msk               (3UL << FPU_FPDSCR_RMode_Pos)                  /*!< FPDSCR: RMode bit Mask */\n\n/* Media and FP Feature Register 0 Definitions */\n#define FPU_MVFR0_FP_rounding_modes_Pos    28U                                            /*!< MVFR0: FP rounding modes bits Position */\n#define FPU_MVFR0_FP_rounding_modes_Msk    (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos)     /*!< MVFR0: FP rounding modes bits Mask */\n\n#define FPU_MVFR0_Short_vectors_Pos        24U                                            /*!< MVFR0: Short vectors bits Position */\n#define FPU_MVFR0_Short_vectors_Msk        (0xFUL << FPU_MVFR0_Short_vectors_Pos)         /*!< MVFR0: Short vectors bits Mask */\n\n#define FPU_MVFR0_Square_root_Pos          20U                                            /*!< MVFR0: Square root bits Position */\n#define FPU_MVFR0_Square_root_Msk          (0xFUL << FPU_MVFR0_Square_root_Pos)           /*!< MVFR0: Square root bits Mask */\n\n#define FPU_MVFR0_Divide_Pos               16U                                            /*!< MVFR0: Divide bits Position */\n#define FPU_MVFR0_Divide_Msk               (0xFUL << FPU_MVFR0_Divide_Pos)                /*!< MVFR0: Divide bits Mask */\n\n#define FPU_MVFR0_FP_excep_trapping_Pos    12U                                            /*!< MVFR0: FP exception trapping bits Position */\n#define FPU_MVFR0_FP_excep_trapping_Msk    (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos)     /*!< MVFR0: FP exception trapping bits Mask */\n\n#define FPU_MVFR0_Double_precision_Pos      8U                                            /*!< MVFR0: Double-precision bits Position */\n#define FPU_MVFR0_Double_precision_Msk     (0xFUL << FPU_MVFR0_Double_precision_Pos)      /*!< MVFR0: Double-precision bits Mask */\n\n#define FPU_MVFR0_Single_precision_Pos      4U                                            /*!< MVFR0: Single-precision bits Position */\n#define FPU_MVFR0_Single_precision_Msk     (0xFUL << FPU_MVFR0_Single_precision_Pos)      /*!< MVFR0: Single-precision bits Mask */\n\n#define FPU_MVFR0_A_SIMD_registers_Pos      0U                                            /*!< MVFR0: A_SIMD registers bits Position */\n#define FPU_MVFR0_A_SIMD_registers_Msk     (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/)  /*!< MVFR0: A_SIMD registers bits Mask */\n\n/* Media and FP Feature Register 1 Definitions */\n#define FPU_MVFR1_FP_fused_MAC_Pos         28U                                            /*!< MVFR1: FP fused MAC bits Position */\n#define FPU_MVFR1_FP_fused_MAC_Msk         (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos)          /*!< MVFR1: FP fused MAC bits Mask */\n\n#define FPU_MVFR1_FP_HPFP_Pos              24U                                            /*!< MVFR1: FP HPFP bits Position */\n#define FPU_MVFR1_FP_HPFP_Msk              (0xFUL << FPU_MVFR1_FP_HPFP_Pos)               /*!< MVFR1: FP HPFP bits Mask */\n\n#define FPU_MVFR1_D_NaN_mode_Pos            4U                                            /*!< MVFR1: D_NaN mode bits Position */\n#define FPU_MVFR1_D_NaN_mode_Msk           (0xFUL << FPU_MVFR1_D_NaN_mode_Pos)            /*!< MVFR1: D_NaN mode bits Mask */\n\n#define FPU_MVFR1_FtZ_mode_Pos              0U                                            /*!< MVFR1: FtZ mode bits Position */\n#define FPU_MVFR1_FtZ_mode_Msk             (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/)          /*!< MVFR1: FtZ mode bits Mask */\n\n/*@} end of group CMSIS_FPU */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Type definitions for the Core Debug Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Core Debug Register (CoreDebug).\n */\ntypedef struct\n{\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\n} CoreDebug_Type;\n\n/* Debug Halting Control and Status Register Definitions */\n#define CoreDebug_DHCSR_DBGKEY_Pos         16U                                            /*!< CoreDebug DHCSR: DBGKEY Position */\n#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< CoreDebug DHCSR: DBGKEY Mask */\n\n#define CoreDebug_DHCSR_S_RESET_ST_Pos     25U                                            /*!< CoreDebug DHCSR: S_RESET_ST Position */\n#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< CoreDebug DHCSR: S_RESET_ST Mask */\n\n#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24U                                            /*!< CoreDebug DHCSR: S_RETIRE_ST Position */\n#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */\n\n#define CoreDebug_DHCSR_S_LOCKUP_Pos       19U                                            /*!< CoreDebug DHCSR: S_LOCKUP Position */\n#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< CoreDebug DHCSR: S_LOCKUP Mask */\n\n#define CoreDebug_DHCSR_S_SLEEP_Pos        18U                                            /*!< CoreDebug DHCSR: S_SLEEP Position */\n#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< CoreDebug DHCSR: S_SLEEP Mask */\n\n#define CoreDebug_DHCSR_S_HALT_Pos         17U                                            /*!< CoreDebug DHCSR: S_HALT Position */\n#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< CoreDebug DHCSR: S_HALT Mask */\n\n#define CoreDebug_DHCSR_S_REGRDY_Pos       16U                                            /*!< CoreDebug DHCSR: S_REGRDY Position */\n#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< CoreDebug DHCSR: S_REGRDY Mask */\n\n#define CoreDebug_DHCSR_C_SNAPSTALL_Pos     5U                                            /*!< CoreDebug DHCSR: C_SNAPSTALL Position */\n#define CoreDebug_DHCSR_C_SNAPSTALL_Msk    (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos)       /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */\n\n#define CoreDebug_DHCSR_C_MASKINTS_Pos      3U                                            /*!< CoreDebug DHCSR: C_MASKINTS Position */\n#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< CoreDebug DHCSR: C_MASKINTS Mask */\n\n#define CoreDebug_DHCSR_C_STEP_Pos          2U                                            /*!< CoreDebug DHCSR: C_STEP Position */\n#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< CoreDebug DHCSR: C_STEP Mask */\n\n#define CoreDebug_DHCSR_C_HALT_Pos          1U                                            /*!< CoreDebug DHCSR: C_HALT Position */\n#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< CoreDebug DHCSR: C_HALT Mask */\n\n#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0U                                            /*!< CoreDebug DHCSR: C_DEBUGEN Position */\n#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/)     /*!< CoreDebug DHCSR: C_DEBUGEN Mask */\n\n/* Debug Core Register Selector Register Definitions */\n#define CoreDebug_DCRSR_REGWnR_Pos         16U                                            /*!< CoreDebug DCRSR: REGWnR Position */\n#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< CoreDebug DCRSR: REGWnR Mask */\n\n#define CoreDebug_DCRSR_REGSEL_Pos          0U                                            /*!< CoreDebug DCRSR: REGSEL Position */\n#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/)     /*!< CoreDebug DCRSR: REGSEL Mask */\n\n/* Debug Exception and Monitor Control Register Definitions */\n#define CoreDebug_DEMCR_TRCENA_Pos         24U                                            /*!< CoreDebug DEMCR: TRCENA Position */\n#define CoreDebug_DEMCR_TRCENA_Msk         (1UL << CoreDebug_DEMCR_TRCENA_Pos)            /*!< CoreDebug DEMCR: TRCENA Mask */\n\n#define CoreDebug_DEMCR_MON_REQ_Pos        19U                                            /*!< CoreDebug DEMCR: MON_REQ Position */\n#define CoreDebug_DEMCR_MON_REQ_Msk        (1UL << CoreDebug_DEMCR_MON_REQ_Pos)           /*!< CoreDebug DEMCR: MON_REQ Mask */\n\n#define CoreDebug_DEMCR_MON_STEP_Pos       18U                                            /*!< CoreDebug DEMCR: MON_STEP Position */\n#define CoreDebug_DEMCR_MON_STEP_Msk       (1UL << CoreDebug_DEMCR_MON_STEP_Pos)          /*!< CoreDebug DEMCR: MON_STEP Mask */\n\n#define CoreDebug_DEMCR_MON_PEND_Pos       17U                                            /*!< CoreDebug DEMCR: MON_PEND Position */\n#define CoreDebug_DEMCR_MON_PEND_Msk       (1UL << CoreDebug_DEMCR_MON_PEND_Pos)          /*!< CoreDebug DEMCR: MON_PEND Mask */\n\n#define CoreDebug_DEMCR_MON_EN_Pos         16U                                            /*!< CoreDebug DEMCR: MON_EN Position */\n#define CoreDebug_DEMCR_MON_EN_Msk         (1UL << CoreDebug_DEMCR_MON_EN_Pos)            /*!< CoreDebug DEMCR: MON_EN Mask */\n\n#define CoreDebug_DEMCR_VC_HARDERR_Pos     10U                                            /*!< CoreDebug DEMCR: VC_HARDERR Position */\n#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< CoreDebug DEMCR: VC_HARDERR Mask */\n\n#define CoreDebug_DEMCR_VC_INTERR_Pos       9U                                            /*!< CoreDebug DEMCR: VC_INTERR Position */\n#define CoreDebug_DEMCR_VC_INTERR_Msk      (1UL << CoreDebug_DEMCR_VC_INTERR_Pos)         /*!< CoreDebug DEMCR: VC_INTERR Mask */\n\n#define CoreDebug_DEMCR_VC_BUSERR_Pos       8U                                            /*!< CoreDebug DEMCR: VC_BUSERR Position */\n#define CoreDebug_DEMCR_VC_BUSERR_Msk      (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos)         /*!< CoreDebug DEMCR: VC_BUSERR Mask */\n\n#define CoreDebug_DEMCR_VC_STATERR_Pos      7U                                            /*!< CoreDebug DEMCR: VC_STATERR Position */\n#define CoreDebug_DEMCR_VC_STATERR_Msk     (1UL << CoreDebug_DEMCR_VC_STATERR_Pos)        /*!< CoreDebug DEMCR: VC_STATERR Mask */\n\n#define CoreDebug_DEMCR_VC_CHKERR_Pos       6U                                            /*!< CoreDebug DEMCR: VC_CHKERR Position */\n#define CoreDebug_DEMCR_VC_CHKERR_Msk      (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos)         /*!< CoreDebug DEMCR: VC_CHKERR Mask */\n\n#define CoreDebug_DEMCR_VC_NOCPERR_Pos      5U                                            /*!< CoreDebug DEMCR: VC_NOCPERR Position */\n#define CoreDebug_DEMCR_VC_NOCPERR_Msk     (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos)        /*!< CoreDebug DEMCR: VC_NOCPERR Mask */\n\n#define CoreDebug_DEMCR_VC_MMERR_Pos        4U                                            /*!< CoreDebug DEMCR: VC_MMERR Position */\n#define CoreDebug_DEMCR_VC_MMERR_Msk       (1UL << CoreDebug_DEMCR_VC_MMERR_Pos)          /*!< CoreDebug DEMCR: VC_MMERR Mask */\n\n#define CoreDebug_DEMCR_VC_CORERESET_Pos    0U                                            /*!< CoreDebug DEMCR: VC_CORERESET Position */\n#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/)  /*!< CoreDebug DEMCR: VC_CORERESET Mask */\n\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */\n#define ITM_BASE            (0xE0000000UL)                            /*!< ITM Base Address */\n#define DWT_BASE            (0xE0001000UL)                            /*!< DWT Base Address */\n#define TPI_BASE            (0xE0040000UL)                            /*!< TPI Base Address */\n#define CoreDebug_BASE      (0xE000EDF0UL)                            /*!< Core Debug Base Address */\n#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */\n#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */\n#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */\n\n#define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE      )   /*!< System control Register not in SCB */\n#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */\n#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */\n#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */\n#define ITM                 ((ITM_Type       *)     ITM_BASE      )   /*!< ITM configuration struct */\n#define DWT                 ((DWT_Type       *)     DWT_BASE      )   /*!< DWT configuration struct */\n#define TPI                 ((TPI_Type       *)     TPI_BASE      )   /*!< TPI configuration struct */\n#define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE)   /*!< Core Debug configuration struct */\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit */\n  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit */\n#endif\n\n#define FPU_BASE            (SCS_BASE +  0x0F30UL)                    /*!< Floating Point Unit */\n#define FPU                 ((FPU_Type       *)     FPU_BASE      )   /*!< Floating Point Unit */\n\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Debug Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifdef CMSIS_NVIC_VIRTUAL\n  #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE\n    #define CMSIS_NVIC_VIRTUAL_HEADER_FILE \"cmsis_nvic_virtual.h\"\n  #endif\n  #include CMSIS_NVIC_VIRTUAL_HEADER_FILE\n#else\n  #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping\n  #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n  #define NVIC_GetActive              __NVIC_GetActive\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n  #define NVIC_SystemReset            __NVIC_SystemReset\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifdef CMSIS_VECTAB_VIRTUAL\n  #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE\n   #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE \"cmsis_vectab_virtual.h\"\n  #endif\n  #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE\n#else\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n\n/**\n  \\brief   Set Priority Grouping\n  \\details Sets the priority grouping field using the required unlock sequence.\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\n           Only values from 0..7 are used.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]      PriorityGroup  Priority grouping field.\n */\n__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)\n{\n  uint32_t reg_value;\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\n\n  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */\n  reg_value  =  (reg_value                                   |\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                (PriorityGroupTmp << 8U)                      );              /* Insert write key and priorty group */\n  SCB->AIRCR =  reg_value;\n}\n\n\n/**\n  \\brief   Get Priority Grouping\n  \\details Reads the priority grouping field from the NVIC Interrupt Controller.\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void)\n{\n  return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\n}\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt\n  \\details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IP[((uint32_t)(int32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n  else\n  {\n    SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Encode Priority\n  \\details Encodes the priority for an interrupt with the given priority group,\n           preemptive priority value, and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [in]   PreemptPriority  Preemptive priority value (starting from 0).\n  \\param [in]       SubPriority  Subpriority value (starting from 0).\n  \\return                        Encoded priority. Value can be used in the function \\ref NVIC_SetPriority().\n */\n__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  return (\n           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |\n           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))\n         );\n}\n\n\n/**\n  \\brief   Decode Priority\n  \\details Decodes an interrupt priority value with a given priority group to\n           preemptive priority value and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.\n  \\param [in]         Priority   Priority value, which can be retrieved with the function \\ref NVIC_GetPriority().\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [out] pPreemptPriority  Preemptive priority value (starting from 0).\n  \\param [out]     pSubPriority  Subpriority value (starting from 0).\n */\n__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);\n  *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL);\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__STATIC_INLINE void __NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |\n                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |\n                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n  uint32_t mvfr0;\n\n  mvfr0 = FPU->MVFR0;\n  if      ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U)\n  {\n    return 1U;           /* Single precision FPU */\n  }\n  else\n  {\n    return 0U;           /* No FPU */\n  }\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n/* ##################################### Debug In/Output function ########################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_core_DebugFunctions ITM Functions\n  \\brief    Functions that access the ITM debug interface.\n  @{\n */\n\nextern volatile int32_t ITM_RxBuffer;                              /*!< External variable to receive characters. */\n#define                 ITM_RXBUFFER_EMPTY  ((int32_t)0x5AA55AA5U) /*!< Value identifying \\ref ITM_RxBuffer is ready for next character. */\n\n\n/**\n  \\brief   ITM Send Character\n  \\details Transmits a character via the ITM channel 0, and\n           \\li Just returns when no debugger is connected that has booked the output.\n           \\li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.\n  \\param [in]     ch  Character to transmit.\n  \\returns            Character to transmit.\n */\n__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)\n{\n  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */\n      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */\n  {\n    while (ITM->PORT[0U].u32 == 0UL)\n    {\n      __NOP();\n    }\n    ITM->PORT[0U].u8 = (uint8_t)ch;\n  }\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Receive Character\n  \\details Inputs a character via the external variable \\ref ITM_RxBuffer.\n  \\return             Received character.\n  \\return         -1  No character pending.\n */\n__STATIC_INLINE int32_t ITM_ReceiveChar (void)\n{\n  int32_t ch = -1;                           /* no character available */\n\n  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY)\n  {\n    ch = ITM_RxBuffer;\n    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */\n  }\n\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Check Character\n  \\details Checks whether a character is pending for reading in the variable \\ref ITM_RxBuffer.\n  \\return          0  No character available.\n  \\return          1  Character available.\n */\n__STATIC_INLINE int32_t ITM_CheckChar (void)\n{\n\n  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY)\n  {\n    return (0);                              /* no character available */\n  }\n  else\n  {\n    return (1);                              /*    character available */\n  }\n}\n\n/*@} end of CMSIS_core_DebugFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM4_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_cm7.h",
    "content": "/**************************************************************************//**\n * @file     core_cm7.h\n * @brief    CMSIS Cortex-M7 Core Peripheral Access Layer Header File\n * @version  V5.0.1\n * @date     25. November 2016\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_CM7_H_GENERIC\n#define __CORE_CM7_H_GENERIC\n\n#include <los_typedef.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex_M7\n  @{\n */\n\n/*  CMSIS CM7 definitions */\n#define __CM7_CMSIS_VERSION_MAIN  ( 5U)                                      /*!< [31:16] CMSIS HAL main version */\n#define __CM7_CMSIS_VERSION_SUB   ( 0U)                                      /*!< [15:0]  CMSIS HAL sub version */\n#define __CM7_CMSIS_VERSION       ((__CM7_CMSIS_VERSION_MAIN << 16U) | \\\n                                    __CM7_CMSIS_VERSION_SUB           )      /*!< CMSIS HAL version number */\n\n#define __CORTEX_M                (7U)                                       /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions.\n*/\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #warning \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM7_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_CM7_H_DEPENDANT\n#define __CORE_CM7_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __CM7_REV\n    #define __CM7_REV               0x0000U\n    #warning \"__CM7_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __FPU_PRESENT\n    #define __FPU_PRESENT             0U\n    #warning \"__FPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __ICACHE_PRESENT\n    #define __ICACHE_PRESENT          0U\n    #warning \"__ICACHE_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __DCACHE_PRESENT\n    #define __DCACHE_PRESENT          0U\n    #warning \"__DCACHE_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __DTCM_PRESENT\n    #define __DTCM_PRESENT            0U\n    #warning \"__DTCM_PRESENT        not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          3U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group Cortex_M7 */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core Debug Register\n  - Core MPU Register\n  - Core FPU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved */\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\n    uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n#define APSR_Q_Pos                         27U                                            /*!< APSR: Q Position */\n#define APSR_Q_Msk                         (1UL << APSR_Q_Pos)                            /*!< APSR: Q Mask */\n\n#define APSR_GE_Pos                        16U                                            /*!< APSR: GE Position */\n#define APSR_GE_Msk                        (0xFUL << APSR_GE_Pos)                         /*!< APSR: GE Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:1;               /*!< bit:      9  Reserved */\n    uint32_t ICI_IT_1:6;                 /*!< bit: 10..15  ICI/IT part 1 */\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\n    uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit */\n    uint32_t ICI_IT_2:2;                 /*!< bit: 25..26  ICI/IT part 2 */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_Q_Pos                         27U                                            /*!< xPSR: Q Position */\n#define xPSR_Q_Msk                         (1UL << xPSR_Q_Pos)                            /*!< xPSR: Q Mask */\n\n#define xPSR_ICI_IT_2_Pos                  25U                                            /*!< xPSR: ICI/IT part 2 Position */\n#define xPSR_ICI_IT_2_Msk                  (3UL << xPSR_ICI_IT_2_Pos)                     /*!< xPSR: ICI/IT part 2 Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_GE_Pos                        16U                                            /*!< xPSR: GE Position */\n#define xPSR_GE_Msk                        (0xFUL << xPSR_GE_Pos)                         /*!< xPSR: GE Mask */\n\n#define xPSR_ICI_IT_1_Pos                  10U                                            /*!< xPSR: ICI/IT part 1 Position */\n#define xPSR_ICI_IT_1_Msk                  (0x3FUL << xPSR_ICI_IT_1_Pos)                  /*!< xPSR: ICI/IT part 1 Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */\n    uint32_t FPCA:1;                     /*!< bit:      2  FP extension active flag */\n    uint32_t _reserved0:29;              /*!< bit:  3..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_FPCA_Pos                    2U                                            /*!< CONTROL: FPCA Position */\n#define CONTROL_FPCA_Msk                   (1UL << CONTROL_FPCA_Pos)                      /*!< CONTROL: FPCA Mask */\n\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[8U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[24U];\n  __IOM uint32_t ICER[8U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[24U];\n  __IOM uint32_t ISPR[8U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[24U];\n  __IOM uint32_t ICPR[8U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[24U];\n  __IOM uint32_t IABR[8U];               /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */\n        uint32_t RESERVED4[56U];\n  __IOM uint8_t  IP[240U];               /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */\n        uint32_t RESERVED5[644U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */\n}  NVIC_Type;\n\n/* Software Triggered Interrupt Register Definitions */\n#define NVIC_STIR_INTID_Pos                 0U                                         /*!< STIR: INTLINESNUM Position */\n#define NVIC_STIR_INTID_Msk                (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/)        /*!< STIR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n  __IOM uint8_t  SHPR[12U];              /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11, 12-15) */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n  __IOM uint32_t CFSR;                   /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register */\n  __IOM uint32_t HFSR;                   /*!< Offset: 0x02C (R/W)  HardFault Status Register */\n  __IOM uint32_t DFSR;                   /*!< Offset: 0x030 (R/W)  Debug Fault Status Register */\n  __IOM uint32_t MMFAR;                  /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register */\n  __IOM uint32_t BFAR;                   /*!< Offset: 0x038 (R/W)  BusFault Address Register */\n  __IOM uint32_t AFSR;                   /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register */\n  __IM  uint32_t ID_PFR[2U];             /*!< Offset: 0x040 (R/ )  Processor Feature Register */\n  __IM  uint32_t ID_DFR;                 /*!< Offset: 0x048 (R/ )  Debug Feature Register */\n  __IM  uint32_t ID_AFR;                 /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register */\n  __IM  uint32_t ID_MFR[4U];             /*!< Offset: 0x050 (R/ )  Memory Model Feature Register */\n  __IM  uint32_t ID_ISAR[5U];            /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register */\n        uint32_t RESERVED0[1U];\n  __IM  uint32_t CLIDR;                  /*!< Offset: 0x078 (R/ )  Cache Level ID register */\n  __IM  uint32_t CTR;                    /*!< Offset: 0x07C (R/ )  Cache Type register */\n  __IM  uint32_t CCSIDR;                 /*!< Offset: 0x080 (R/ )  Cache Size ID Register */\n  __IOM uint32_t CSSELR;                 /*!< Offset: 0x084 (R/W)  Cache Size Selection Register */\n  __IOM uint32_t CPACR;                  /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register */\n        uint32_t RESERVED3[93U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0x200 ( /W)  Software Triggered Interrupt Register */\n        uint32_t RESERVED4[15U];\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x240 (R/ )  Media and VFP Feature Register 0 */\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x244 (R/ )  Media and VFP Feature Register 1 */\n  __IM  uint32_t MVFR2;                  /*!< Offset: 0x248 (R/ )  Media and VFP Feature Register 1 */\n        uint32_t RESERVED5[1U];\n  __OM  uint32_t ICIALLU;                /*!< Offset: 0x250 ( /W)  I-Cache Invalidate All to PoU */\n        uint32_t RESERVED6[1U];\n  __OM  uint32_t ICIMVAU;                /*!< Offset: 0x258 ( /W)  I-Cache Invalidate by MVA to PoU */\n  __OM  uint32_t DCIMVAC;                /*!< Offset: 0x25C ( /W)  D-Cache Invalidate by MVA to PoC */\n  __OM  uint32_t DCISW;                  /*!< Offset: 0x260 ( /W)  D-Cache Invalidate by Set-way */\n  __OM  uint32_t DCCMVAU;                /*!< Offset: 0x264 ( /W)  D-Cache Clean by MVA to PoU */\n  __OM  uint32_t DCCMVAC;                /*!< Offset: 0x268 ( /W)  D-Cache Clean by MVA to PoC */\n  __OM  uint32_t DCCSW;                  /*!< Offset: 0x26C ( /W)  D-Cache Clean by Set-way */\n  __OM  uint32_t DCCIMVAC;               /*!< Offset: 0x270 ( /W)  D-Cache Clean and Invalidate by MVA to PoC */\n  __OM  uint32_t DCCISW;                 /*!< Offset: 0x274 ( /W)  D-Cache Clean and Invalidate by Set-way */\n        uint32_t RESERVED7[6U];\n  __IOM uint32_t ITCMCR;                 /*!< Offset: 0x290 (R/W)  Instruction Tightly-Coupled Memory Control Register */\n  __IOM uint32_t DTCMCR;                 /*!< Offset: 0x294 (R/W)  Data Tightly-Coupled Memory Control Registers */\n  __IOM uint32_t AHBPCR;                 /*!< Offset: 0x298 (R/W)  AHBP Control Register */\n  __IOM uint32_t CACR;                   /*!< Offset: 0x29C (R/W)  L1 Cache Control Register */\n  __IOM uint32_t AHBSCR;                 /*!< Offset: 0x2A0 (R/W)  AHB Slave Control Register */\n        uint32_t RESERVED8[1U];\n  __IOM uint32_t ABFSR;                  /*!< Offset: 0x2A8 (R/W)  Auxiliary Bus Fault Status Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_NMIPENDSET_Pos            31U                                            /*!< SCB ICSR: NMIPENDSET Position */\n#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_RETTOBASE_Pos             11U                                            /*!< SCB ICSR: RETTOBASE Position */\n#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n/* SCB Vector Table Offset Register Definitions */\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_PRIGROUP_Pos              8U                                            /*!< SCB AIRCR: PRIGROUP Position */\n#define SCB_AIRCR_PRIGROUP_Msk             (7UL << SCB_AIRCR_PRIGROUP_Pos)                /*!< SCB AIRCR: PRIGROUP Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n#define SCB_AIRCR_VECTRESET_Pos             0U                                            /*!< SCB AIRCR: VECTRESET Position */\n#define SCB_AIRCR_VECTRESET_Msk            (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/)           /*!< SCB AIRCR: VECTRESET Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_BP_Pos                      18U                                           /*!< SCB CCR: Branch prediction enable bit Position */\n#define SCB_CCR_BP_Msk                     (1UL << SCB_CCR_BP_Pos)                        /*!< SCB CCR: Branch prediction enable bit Mask */\n\n#define SCB_CCR_IC_Pos                      17U                                           /*!< SCB CCR: Instruction cache enable bit Position */\n#define SCB_CCR_IC_Msk                     (1UL << SCB_CCR_IC_Pos)                        /*!< SCB CCR: Instruction cache enable bit Mask */\n\n#define SCB_CCR_DC_Pos                      16U                                           /*!< SCB CCR: Cache enable bit Position */\n#define SCB_CCR_DC_Msk                     (1UL << SCB_CCR_DC_Pos)                        /*!< SCB CCR: Cache enable bit Mask */\n\n#define SCB_CCR_STKALIGN_Pos                9U                                            /*!< SCB CCR: STKALIGN Position */\n#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */\n\n#define SCB_CCR_BFHFNMIGN_Pos               8U                                            /*!< SCB CCR: BFHFNMIGN Position */\n#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */\n\n#define SCB_CCR_DIV_0_TRP_Pos               4U                                            /*!< SCB CCR: DIV_0_TRP Position */\n#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n#define SCB_CCR_USERSETMPEND_Pos            1U                                            /*!< SCB CCR: USERSETMPEND Position */\n#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */\n\n#define SCB_CCR_NONBASETHRDENA_Pos          0U                                            /*!< SCB CCR: NONBASETHRDENA Position */\n#define SCB_CCR_NONBASETHRDENA_Msk         (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/)        /*!< SCB CCR: NONBASETHRDENA Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_USGFAULTENA_Pos          18U                                            /*!< SCB SHCSR: USGFAULTENA Position */\n#define SCB_SHCSR_USGFAULTENA_Msk          (1UL << SCB_SHCSR_USGFAULTENA_Pos)             /*!< SCB SHCSR: USGFAULTENA Mask */\n\n#define SCB_SHCSR_BUSFAULTENA_Pos          17U                                            /*!< SCB SHCSR: BUSFAULTENA Position */\n#define SCB_SHCSR_BUSFAULTENA_Msk          (1UL << SCB_SHCSR_BUSFAULTENA_Pos)             /*!< SCB SHCSR: BUSFAULTENA Mask */\n\n#define SCB_SHCSR_MEMFAULTENA_Pos          16U                                            /*!< SCB SHCSR: MEMFAULTENA Position */\n#define SCB_SHCSR_MEMFAULTENA_Msk          (1UL << SCB_SHCSR_MEMFAULTENA_Pos)             /*!< SCB SHCSR: MEMFAULTENA Mask */\n\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n#define SCB_SHCSR_BUSFAULTPENDED_Pos       14U                                            /*!< SCB SHCSR: BUSFAULTPENDED Position */\n#define SCB_SHCSR_BUSFAULTPENDED_Msk       (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos)          /*!< SCB SHCSR: BUSFAULTPENDED Mask */\n\n#define SCB_SHCSR_MEMFAULTPENDED_Pos       13U                                            /*!< SCB SHCSR: MEMFAULTPENDED Position */\n#define SCB_SHCSR_MEMFAULTPENDED_Msk       (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos)          /*!< SCB SHCSR: MEMFAULTPENDED Mask */\n\n#define SCB_SHCSR_USGFAULTPENDED_Pos       12U                                            /*!< SCB SHCSR: USGFAULTPENDED Position */\n#define SCB_SHCSR_USGFAULTPENDED_Msk       (1UL << SCB_SHCSR_USGFAULTPENDED_Pos)          /*!< SCB SHCSR: USGFAULTPENDED Mask */\n\n#define SCB_SHCSR_SYSTICKACT_Pos           11U                                            /*!< SCB SHCSR: SYSTICKACT Position */\n#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */\n\n#define SCB_SHCSR_PENDSVACT_Pos            10U                                            /*!< SCB SHCSR: PENDSVACT Position */\n#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */\n\n#define SCB_SHCSR_MONITORACT_Pos            8U                                            /*!< SCB SHCSR: MONITORACT Position */\n#define SCB_SHCSR_MONITORACT_Msk           (1UL << SCB_SHCSR_MONITORACT_Pos)              /*!< SCB SHCSR: MONITORACT Mask */\n\n#define SCB_SHCSR_SVCALLACT_Pos             7U                                            /*!< SCB SHCSR: SVCALLACT Position */\n#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */\n\n#define SCB_SHCSR_USGFAULTACT_Pos           3U                                            /*!< SCB SHCSR: USGFAULTACT Position */\n#define SCB_SHCSR_USGFAULTACT_Msk          (1UL << SCB_SHCSR_USGFAULTACT_Pos)             /*!< SCB SHCSR: USGFAULTACT Mask */\n\n#define SCB_SHCSR_BUSFAULTACT_Pos           1U                                            /*!< SCB SHCSR: BUSFAULTACT Position */\n#define SCB_SHCSR_BUSFAULTACT_Msk          (1UL << SCB_SHCSR_BUSFAULTACT_Pos)             /*!< SCB SHCSR: BUSFAULTACT Mask */\n\n#define SCB_SHCSR_MEMFAULTACT_Pos           0U                                            /*!< SCB SHCSR: MEMFAULTACT Position */\n#define SCB_SHCSR_MEMFAULTACT_Msk          (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/)         /*!< SCB SHCSR: MEMFAULTACT Mask */\n\n/* SCB Configurable Fault Status Register Definitions */\n#define SCB_CFSR_USGFAULTSR_Pos            16U                                            /*!< SCB CFSR: Usage Fault Status Register Position */\n#define SCB_CFSR_USGFAULTSR_Msk            (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos)          /*!< SCB CFSR: Usage Fault Status Register Mask */\n\n#define SCB_CFSR_BUSFAULTSR_Pos             8U                                            /*!< SCB CFSR: Bus Fault Status Register Position */\n#define SCB_CFSR_BUSFAULTSR_Msk            (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos)            /*!< SCB CFSR: Bus Fault Status Register Mask */\n\n#define SCB_CFSR_MEMFAULTSR_Pos             0U                                            /*!< SCB CFSR: Memory Manage Fault Status Register Position */\n#define SCB_CFSR_MEMFAULTSR_Msk            (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/)        /*!< SCB CFSR: Memory Manage Fault Status Register Mask */\n\n/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_MMARVALID_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 7U)               /*!< SCB CFSR (MMFSR): MMARVALID Position */\n#define SCB_CFSR_MMARVALID_Msk             (1UL << SCB_CFSR_MMARVALID_Pos)                /*!< SCB CFSR (MMFSR): MMARVALID Mask */\n\n#define SCB_CFSR_MLSPERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 5U)               /*!< SCB CFSR (MMFSR): MLSPERR Position */\n#define SCB_CFSR_MLSPERR_Msk               (1UL << SCB_CFSR_MLSPERR_Pos)                  /*!< SCB CFSR (MMFSR): MLSPERR Mask */\n\n#define SCB_CFSR_MSTKERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 4U)               /*!< SCB CFSR (MMFSR): MSTKERR Position */\n#define SCB_CFSR_MSTKERR_Msk               (1UL << SCB_CFSR_MSTKERR_Pos)                  /*!< SCB CFSR (MMFSR): MSTKERR Mask */\n\n#define SCB_CFSR_MUNSTKERR_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 3U)               /*!< SCB CFSR (MMFSR): MUNSTKERR Position */\n#define SCB_CFSR_MUNSTKERR_Msk             (1UL << SCB_CFSR_MUNSTKERR_Pos)                /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */\n\n#define SCB_CFSR_DACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 1U)               /*!< SCB CFSR (MMFSR): DACCVIOL Position */\n#define SCB_CFSR_DACCVIOL_Msk              (1UL << SCB_CFSR_DACCVIOL_Pos)                 /*!< SCB CFSR (MMFSR): DACCVIOL Mask */\n\n#define SCB_CFSR_IACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 0U)               /*!< SCB CFSR (MMFSR): IACCVIOL Position */\n#define SCB_CFSR_IACCVIOL_Msk              (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/)             /*!< SCB CFSR (MMFSR): IACCVIOL Mask */\n\n/* BusFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_BFARVALID_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 7U)                  /*!< SCB CFSR (BFSR): BFARVALID Position */\n#define SCB_CFSR_BFARVALID_Msk            (1UL << SCB_CFSR_BFARVALID_Pos)                 /*!< SCB CFSR (BFSR): BFARVALID Mask */\n\n#define SCB_CFSR_LSPERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 5U)                  /*!< SCB CFSR (BFSR): LSPERR Position */\n#define SCB_CFSR_LSPERR_Msk               (1UL << SCB_CFSR_LSPERR_Pos)                    /*!< SCB CFSR (BFSR): LSPERR Mask */\n\n#define SCB_CFSR_STKERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 4U)                  /*!< SCB CFSR (BFSR): STKERR Position */\n#define SCB_CFSR_STKERR_Msk               (1UL << SCB_CFSR_STKERR_Pos)                    /*!< SCB CFSR (BFSR): STKERR Mask */\n\n#define SCB_CFSR_UNSTKERR_Pos             (SCB_CFSR_BUSFAULTSR_Pos + 3U)                  /*!< SCB CFSR (BFSR): UNSTKERR Position */\n#define SCB_CFSR_UNSTKERR_Msk             (1UL << SCB_CFSR_UNSTKERR_Pos)                  /*!< SCB CFSR (BFSR): UNSTKERR Mask */\n\n#define SCB_CFSR_IMPRECISERR_Pos          (SCB_CFSR_BUSFAULTSR_Pos + 2U)                  /*!< SCB CFSR (BFSR): IMPRECISERR Position */\n#define SCB_CFSR_IMPRECISERR_Msk          (1UL << SCB_CFSR_IMPRECISERR_Pos)               /*!< SCB CFSR (BFSR): IMPRECISERR Mask */\n\n#define SCB_CFSR_PRECISERR_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 1U)                  /*!< SCB CFSR (BFSR): PRECISERR Position */\n#define SCB_CFSR_PRECISERR_Msk            (1UL << SCB_CFSR_PRECISERR_Pos)                 /*!< SCB CFSR (BFSR): PRECISERR Mask */\n\n#define SCB_CFSR_IBUSERR_Pos              (SCB_CFSR_BUSFAULTSR_Pos + 0U)                  /*!< SCB CFSR (BFSR): IBUSERR Position */\n#define SCB_CFSR_IBUSERR_Msk              (1UL << SCB_CFSR_IBUSERR_Pos)                   /*!< SCB CFSR (BFSR): IBUSERR Mask */\n\n/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_DIVBYZERO_Pos            (SCB_CFSR_USGFAULTSR_Pos + 9U)                  /*!< SCB CFSR (UFSR): DIVBYZERO Position */\n#define SCB_CFSR_DIVBYZERO_Msk            (1UL << SCB_CFSR_DIVBYZERO_Pos)                 /*!< SCB CFSR (UFSR): DIVBYZERO Mask */\n\n#define SCB_CFSR_UNALIGNED_Pos            (SCB_CFSR_USGFAULTSR_Pos + 8U)                  /*!< SCB CFSR (UFSR): UNALIGNED Position */\n#define SCB_CFSR_UNALIGNED_Msk            (1UL << SCB_CFSR_UNALIGNED_Pos)                 /*!< SCB CFSR (UFSR): UNALIGNED Mask */\n\n#define SCB_CFSR_NOCP_Pos                 (SCB_CFSR_USGFAULTSR_Pos + 3U)                  /*!< SCB CFSR (UFSR): NOCP Position */\n#define SCB_CFSR_NOCP_Msk                 (1UL << SCB_CFSR_NOCP_Pos)                      /*!< SCB CFSR (UFSR): NOCP Mask */\n\n#define SCB_CFSR_INVPC_Pos                (SCB_CFSR_USGFAULTSR_Pos + 2U)                  /*!< SCB CFSR (UFSR): INVPC Position */\n#define SCB_CFSR_INVPC_Msk                (1UL << SCB_CFSR_INVPC_Pos)                     /*!< SCB CFSR (UFSR): INVPC Mask */\n\n#define SCB_CFSR_INVSTATE_Pos             (SCB_CFSR_USGFAULTSR_Pos + 1U)                  /*!< SCB CFSR (UFSR): INVSTATE Position */\n#define SCB_CFSR_INVSTATE_Msk             (1UL << SCB_CFSR_INVSTATE_Pos)                  /*!< SCB CFSR (UFSR): INVSTATE Mask */\n\n#define SCB_CFSR_UNDEFINSTR_Pos           (SCB_CFSR_USGFAULTSR_Pos + 0U)                  /*!< SCB CFSR (UFSR): UNDEFINSTR Position */\n#define SCB_CFSR_UNDEFINSTR_Msk           (1UL << SCB_CFSR_UNDEFINSTR_Pos)                /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */\n\n/* SCB Hard Fault Status Register Definitions */\n#define SCB_HFSR_DEBUGEVT_Pos              31U                                            /*!< SCB HFSR: DEBUGEVT Position */\n#define SCB_HFSR_DEBUGEVT_Msk              (1UL << SCB_HFSR_DEBUGEVT_Pos)                 /*!< SCB HFSR: DEBUGEVT Mask */\n\n#define SCB_HFSR_FORCED_Pos                30U                                            /*!< SCB HFSR: FORCED Position */\n#define SCB_HFSR_FORCED_Msk                (1UL << SCB_HFSR_FORCED_Pos)                   /*!< SCB HFSR: FORCED Mask */\n\n#define SCB_HFSR_VECTTBL_Pos                1U                                            /*!< SCB HFSR: VECTTBL Position */\n#define SCB_HFSR_VECTTBL_Msk               (1UL << SCB_HFSR_VECTTBL_Pos)                  /*!< SCB HFSR: VECTTBL Mask */\n\n/* SCB Debug Fault Status Register Definitions */\n#define SCB_DFSR_EXTERNAL_Pos               4U                                            /*!< SCB DFSR: EXTERNAL Position */\n#define SCB_DFSR_EXTERNAL_Msk              (1UL << SCB_DFSR_EXTERNAL_Pos)                 /*!< SCB DFSR: EXTERNAL Mask */\n\n#define SCB_DFSR_VCATCH_Pos                 3U                                            /*!< SCB DFSR: VCATCH Position */\n#define SCB_DFSR_VCATCH_Msk                (1UL << SCB_DFSR_VCATCH_Pos)                   /*!< SCB DFSR: VCATCH Mask */\n\n#define SCB_DFSR_DWTTRAP_Pos                2U                                            /*!< SCB DFSR: DWTTRAP Position */\n#define SCB_DFSR_DWTTRAP_Msk               (1UL << SCB_DFSR_DWTTRAP_Pos)                  /*!< SCB DFSR: DWTTRAP Mask */\n\n#define SCB_DFSR_BKPT_Pos                   1U                                            /*!< SCB DFSR: BKPT Position */\n#define SCB_DFSR_BKPT_Msk                  (1UL << SCB_DFSR_BKPT_Pos)                     /*!< SCB DFSR: BKPT Mask */\n\n#define SCB_DFSR_HALTED_Pos                 0U                                            /*!< SCB DFSR: HALTED Position */\n#define SCB_DFSR_HALTED_Msk                (1UL /*<< SCB_DFSR_HALTED_Pos*/)               /*!< SCB DFSR: HALTED Mask */\n\n/* SCB Cache Level ID Register Definitions */\n#define SCB_CLIDR_LOUU_Pos                 27U                                            /*!< SCB CLIDR: LoUU Position */\n#define SCB_CLIDR_LOUU_Msk                 (7UL << SCB_CLIDR_LOUU_Pos)                    /*!< SCB CLIDR: LoUU Mask */\n\n#define SCB_CLIDR_LOC_Pos                  24U                                            /*!< SCB CLIDR: LoC Position */\n#define SCB_CLIDR_LOC_Msk                  (7UL << SCB_CLIDR_LOC_Pos)                     /*!< SCB CLIDR: LoC Mask */\n\n/* SCB Cache Type Register Definitions */\n#define SCB_CTR_FORMAT_Pos                 29U                                            /*!< SCB CTR: Format Position */\n#define SCB_CTR_FORMAT_Msk                 (7UL << SCB_CTR_FORMAT_Pos)                    /*!< SCB CTR: Format Mask */\n\n#define SCB_CTR_CWG_Pos                    24U                                            /*!< SCB CTR: CWG Position */\n#define SCB_CTR_CWG_Msk                    (0xFUL << SCB_CTR_CWG_Pos)                     /*!< SCB CTR: CWG Mask */\n\n#define SCB_CTR_ERG_Pos                    20U                                            /*!< SCB CTR: ERG Position */\n#define SCB_CTR_ERG_Msk                    (0xFUL << SCB_CTR_ERG_Pos)                     /*!< SCB CTR: ERG Mask */\n\n#define SCB_CTR_DMINLINE_Pos               16U                                            /*!< SCB CTR: DminLine Position */\n#define SCB_CTR_DMINLINE_Msk               (0xFUL << SCB_CTR_DMINLINE_Pos)                /*!< SCB CTR: DminLine Mask */\n\n#define SCB_CTR_IMINLINE_Pos                0U                                            /*!< SCB CTR: ImInLine Position */\n#define SCB_CTR_IMINLINE_Msk               (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/)            /*!< SCB CTR: ImInLine Mask */\n\n/* SCB Cache Size ID Register Definitions */\n#define SCB_CCSIDR_WT_Pos                  31U                                            /*!< SCB CCSIDR: WT Position */\n#define SCB_CCSIDR_WT_Msk                  (1UL << SCB_CCSIDR_WT_Pos)                     /*!< SCB CCSIDR: WT Mask */\n\n#define SCB_CCSIDR_WB_Pos                  30U                                            /*!< SCB CCSIDR: WB Position */\n#define SCB_CCSIDR_WB_Msk                  (1UL << SCB_CCSIDR_WB_Pos)                     /*!< SCB CCSIDR: WB Mask */\n\n#define SCB_CCSIDR_RA_Pos                  29U                                            /*!< SCB CCSIDR: RA Position */\n#define SCB_CCSIDR_RA_Msk                  (1UL << SCB_CCSIDR_RA_Pos)                     /*!< SCB CCSIDR: RA Mask */\n\n#define SCB_CCSIDR_WA_Pos                  28U                                            /*!< SCB CCSIDR: WA Position */\n#define SCB_CCSIDR_WA_Msk                  (1UL << SCB_CCSIDR_WA_Pos)                     /*!< SCB CCSIDR: WA Mask */\n\n#define SCB_CCSIDR_NUMSETS_Pos             13U                                            /*!< SCB CCSIDR: NumSets Position */\n#define SCB_CCSIDR_NUMSETS_Msk             (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos)           /*!< SCB CCSIDR: NumSets Mask */\n\n#define SCB_CCSIDR_ASSOCIATIVITY_Pos        3U                                            /*!< SCB CCSIDR: Associativity Position */\n#define SCB_CCSIDR_ASSOCIATIVITY_Msk       (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos)      /*!< SCB CCSIDR: Associativity Mask */\n\n#define SCB_CCSIDR_LINESIZE_Pos             0U                                            /*!< SCB CCSIDR: LineSize Position */\n#define SCB_CCSIDR_LINESIZE_Msk            (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/)           /*!< SCB CCSIDR: LineSize Mask */\n\n/* SCB Cache Size Selection Register Definitions */\n#define SCB_CSSELR_LEVEL_Pos                1U                                            /*!< SCB CSSELR: Level Position */\n#define SCB_CSSELR_LEVEL_Msk               (7UL << SCB_CSSELR_LEVEL_Pos)                  /*!< SCB CSSELR: Level Mask */\n\n#define SCB_CSSELR_IND_Pos                  0U                                            /*!< SCB CSSELR: InD Position */\n#define SCB_CSSELR_IND_Msk                 (1UL /*<< SCB_CSSELR_IND_Pos*/)                /*!< SCB CSSELR: InD Mask */\n\n/* SCB Software Triggered Interrupt Register Definitions */\n#define SCB_STIR_INTID_Pos                  0U                                            /*!< SCB STIR: INTID Position */\n#define SCB_STIR_INTID_Msk                 (0x1FFUL /*<< SCB_STIR_INTID_Pos*/)            /*!< SCB STIR: INTID Mask */\n\n/* SCB D-Cache Invalidate by Set-way Register Definitions */\n#define SCB_DCISW_WAY_Pos                  30U                                            /*!< SCB DCISW: Way Position */\n#define SCB_DCISW_WAY_Msk                  (3UL << SCB_DCISW_WAY_Pos)                     /*!< SCB DCISW: Way Mask */\n\n#define SCB_DCISW_SET_Pos                   5U                                            /*!< SCB DCISW: Set Position */\n#define SCB_DCISW_SET_Msk                  (0x1FFUL << SCB_DCISW_SET_Pos)                 /*!< SCB DCISW: Set Mask */\n\n/* SCB D-Cache Clean by Set-way Register Definitions */\n#define SCB_DCCSW_WAY_Pos                  30U                                            /*!< SCB DCCSW: Way Position */\n#define SCB_DCCSW_WAY_Msk                  (3UL << SCB_DCCSW_WAY_Pos)                     /*!< SCB DCCSW: Way Mask */\n\n#define SCB_DCCSW_SET_Pos                   5U                                            /*!< SCB DCCSW: Set Position */\n#define SCB_DCCSW_SET_Msk                  (0x1FFUL << SCB_DCCSW_SET_Pos)                 /*!< SCB DCCSW: Set Mask */\n\n/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */\n#define SCB_DCCISW_WAY_Pos                 30U                                            /*!< SCB DCCISW: Way Position */\n#define SCB_DCCISW_WAY_Msk                 (3UL << SCB_DCCISW_WAY_Pos)                    /*!< SCB DCCISW: Way Mask */\n\n#define SCB_DCCISW_SET_Pos                  5U                                            /*!< SCB DCCISW: Set Position */\n#define SCB_DCCISW_SET_Msk                 (0x1FFUL << SCB_DCCISW_SET_Pos)                /*!< SCB DCCISW: Set Mask */\n\n/* Instruction Tightly-Coupled Memory Control Register Definitions */\n#define SCB_ITCMCR_SZ_Pos                   3U                                            /*!< SCB ITCMCR: SZ Position */\n#define SCB_ITCMCR_SZ_Msk                  (0xFUL << SCB_ITCMCR_SZ_Pos)                   /*!< SCB ITCMCR: SZ Mask */\n\n#define SCB_ITCMCR_RETEN_Pos                2U                                            /*!< SCB ITCMCR: RETEN Position */\n#define SCB_ITCMCR_RETEN_Msk               (1UL << SCB_ITCMCR_RETEN_Pos)                  /*!< SCB ITCMCR: RETEN Mask */\n\n#define SCB_ITCMCR_RMW_Pos                  1U                                            /*!< SCB ITCMCR: RMW Position */\n#define SCB_ITCMCR_RMW_Msk                 (1UL << SCB_ITCMCR_RMW_Pos)                    /*!< SCB ITCMCR: RMW Mask */\n\n#define SCB_ITCMCR_EN_Pos                   0U                                            /*!< SCB ITCMCR: EN Position */\n#define SCB_ITCMCR_EN_Msk                  (1UL /*<< SCB_ITCMCR_EN_Pos*/)                 /*!< SCB ITCMCR: EN Mask */\n\n/* Data Tightly-Coupled Memory Control Register Definitions */\n#define SCB_DTCMCR_SZ_Pos                   3U                                            /*!< SCB DTCMCR: SZ Position */\n#define SCB_DTCMCR_SZ_Msk                  (0xFUL << SCB_DTCMCR_SZ_Pos)                   /*!< SCB DTCMCR: SZ Mask */\n\n#define SCB_DTCMCR_RETEN_Pos                2U                                            /*!< SCB DTCMCR: RETEN Position */\n#define SCB_DTCMCR_RETEN_Msk               (1UL << SCB_DTCMCR_RETEN_Pos)                   /*!< SCB DTCMCR: RETEN Mask */\n\n#define SCB_DTCMCR_RMW_Pos                  1U                                            /*!< SCB DTCMCR: RMW Position */\n#define SCB_DTCMCR_RMW_Msk                 (1UL << SCB_DTCMCR_RMW_Pos)                    /*!< SCB DTCMCR: RMW Mask */\n\n#define SCB_DTCMCR_EN_Pos                   0U                                            /*!< SCB DTCMCR: EN Position */\n#define SCB_DTCMCR_EN_Msk                  (1UL /*<< SCB_DTCMCR_EN_Pos*/)                 /*!< SCB DTCMCR: EN Mask */\n\n/* AHBP Control Register Definitions */\n#define SCB_AHBPCR_SZ_Pos                   1U                                            /*!< SCB AHBPCR: SZ Position */\n#define SCB_AHBPCR_SZ_Msk                  (7UL << SCB_AHBPCR_SZ_Pos)                     /*!< SCB AHBPCR: SZ Mask */\n\n#define SCB_AHBPCR_EN_Pos                   0U                                            /*!< SCB AHBPCR: EN Position */\n#define SCB_AHBPCR_EN_Msk                  (1UL /*<< SCB_AHBPCR_EN_Pos*/)                 /*!< SCB AHBPCR: EN Mask */\n\n/* L1 Cache Control Register Definitions */\n#define SCB_CACR_FORCEWT_Pos                2U                                            /*!< SCB CACR: FORCEWT Position */\n#define SCB_CACR_FORCEWT_Msk               (1UL << SCB_CACR_FORCEWT_Pos)                  /*!< SCB CACR: FORCEWT Mask */\n\n#define SCB_CACR_ECCEN_Pos                  1U                                            /*!< SCB CACR: ECCEN Position */\n#define SCB_CACR_ECCEN_Msk                 (1UL << SCB_CACR_ECCEN_Pos)                    /*!< SCB CACR: ECCEN Mask */\n\n#define SCB_CACR_SIWT_Pos                   0U                                            /*!< SCB CACR: SIWT Position */\n#define SCB_CACR_SIWT_Msk                  (1UL /*<< SCB_CACR_SIWT_Pos*/)                 /*!< SCB CACR: SIWT Mask */\n\n/* AHBS Control Register Definitions */\n#define SCB_AHBSCR_INITCOUNT_Pos           11U                                            /*!< SCB AHBSCR: INITCOUNT Position */\n#define SCB_AHBSCR_INITCOUNT_Msk           (0x1FUL << SCB_AHBPCR_INITCOUNT_Pos)           /*!< SCB AHBSCR: INITCOUNT Mask */\n\n#define SCB_AHBSCR_TPRI_Pos                 2U                                            /*!< SCB AHBSCR: TPRI Position */\n#define SCB_AHBSCR_TPRI_Msk                (0x1FFUL << SCB_AHBPCR_TPRI_Pos)               /*!< SCB AHBSCR: TPRI Mask */\n\n#define SCB_AHBSCR_CTL_Pos                  0U                                            /*!< SCB AHBSCR: CTL Position*/\n#define SCB_AHBSCR_CTL_Msk                 (3UL /*<< SCB_AHBPCR_CTL_Pos*/)                /*!< SCB AHBSCR: CTL Mask */\n\n/* Auxiliary Bus Fault Status Register Definitions */\n#define SCB_ABFSR_AXIMTYPE_Pos              8U                                            /*!< SCB ABFSR: AXIMTYPE Position*/\n#define SCB_ABFSR_AXIMTYPE_Msk             (3UL << SCB_ABFSR_AXIMTYPE_Pos)                /*!< SCB ABFSR: AXIMTYPE Mask */\n\n#define SCB_ABFSR_EPPB_Pos                  4U                                            /*!< SCB ABFSR: EPPB Position*/\n#define SCB_ABFSR_EPPB_Msk                 (1UL << SCB_ABFSR_EPPB_Pos)                    /*!< SCB ABFSR: EPPB Mask */\n\n#define SCB_ABFSR_AXIM_Pos                  3U                                            /*!< SCB ABFSR: AXIM Position*/\n#define SCB_ABFSR_AXIM_Msk                 (1UL << SCB_ABFSR_AXIM_Pos)                    /*!< SCB ABFSR: AXIM Mask */\n\n#define SCB_ABFSR_AHBP_Pos                  2U                                            /*!< SCB ABFSR: AHBP Position*/\n#define SCB_ABFSR_AHBP_Msk                 (1UL << SCB_ABFSR_AHBP_Pos)                    /*!< SCB ABFSR: AHBP Mask */\n\n#define SCB_ABFSR_DTCM_Pos                  1U                                            /*!< SCB ABFSR: DTCM Position*/\n#define SCB_ABFSR_DTCM_Msk                 (1UL << SCB_ABFSR_DTCM_Pos)                    /*!< SCB ABFSR: DTCM Mask */\n\n#define SCB_ABFSR_ITCM_Pos                  0U                                            /*!< SCB ABFSR: ITCM Position*/\n#define SCB_ABFSR_ITCM_Msk                 (1UL /*<< SCB_ABFSR_ITCM_Pos*/)                /*!< SCB ABFSR: ITCM Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)\n  \\brief    Type definitions for the System Control and ID Register not in the SCB\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control and ID Register not in the SCB.\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IM  uint32_t ICTR;                   /*!< Offset: 0x004 (R/ )  Interrupt Controller Type Register */\n  __IOM uint32_t ACTLR;                  /*!< Offset: 0x008 (R/W)  Auxiliary Control Register */\n} SCnSCB_Type;\n\n/* Interrupt Controller Type Register Definitions */\n#define SCnSCB_ICTR_INTLINESNUM_Pos         0U                                         /*!< ICTR: INTLINESNUM Position */\n#define SCnSCB_ICTR_INTLINESNUM_Msk        (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/)  /*!< ICTR: INTLINESNUM Mask */\n\n/* Auxiliary Control Register Definitions */\n#define SCnSCB_ACTLR_DISITMATBFLUSH_Pos    12U                                         /*!< ACTLR: DISITMATBFLUSH Position */\n#define SCnSCB_ACTLR_DISITMATBFLUSH_Msk    (1UL << SCnSCB_ACTLR_DISITMATBFLUSH_Pos)    /*!< ACTLR: DISITMATBFLUSH Mask */\n\n#define SCnSCB_ACTLR_DISRAMODE_Pos         11U                                         /*!< ACTLR: DISRAMODE Position */\n#define SCnSCB_ACTLR_DISRAMODE_Msk         (1UL << SCnSCB_ACTLR_DISRAMODE_Pos)         /*!< ACTLR: DISRAMODE Mask */\n\n#define SCnSCB_ACTLR_FPEXCODIS_Pos         10U                                         /*!< ACTLR: FPEXCODIS Position */\n#define SCnSCB_ACTLR_FPEXCODIS_Msk         (1UL << SCnSCB_ACTLR_FPEXCODIS_Pos)         /*!< ACTLR: FPEXCODIS Mask */\n\n#define SCnSCB_ACTLR_DISFOLD_Pos            2U                                         /*!< ACTLR: DISFOLD Position */\n#define SCnSCB_ACTLR_DISFOLD_Msk           (1UL << SCnSCB_ACTLR_DISFOLD_Pos)           /*!< ACTLR: DISFOLD Mask */\n\n#define SCnSCB_ACTLR_DISMCYCINT_Pos         0U                                         /*!< ACTLR: DISMCYCINT Position */\n#define SCnSCB_ACTLR_DISMCYCINT_Msk        (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/)    /*!< ACTLR: DISMCYCINT Mask */\n\n/*@} end of group CMSIS_SCnotSCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_ITM     Instrumentation Trace Macrocell (ITM)\n  \\brief    Type definitions for the Instrumentation Trace Macrocell (ITM)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Instrumentation Trace Macrocell Register (ITM).\n */\ntypedef struct\n{\n  __OM  union\n  {\n    __OM  uint8_t    u8;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit */\n    __OM  uint16_t   u16;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 16-bit */\n    __OM  uint32_t   u32;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 32-bit */\n  }  PORT [32U];                         /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers */\n        uint32_t RESERVED0[864U];\n  __IOM uint32_t TER;                    /*!< Offset: 0xE00 (R/W)  ITM Trace Enable Register */\n        uint32_t RESERVED1[15U];\n  __IOM uint32_t TPR;                    /*!< Offset: 0xE40 (R/W)  ITM Trace Privilege Register */\n        uint32_t RESERVED2[15U];\n  __IOM uint32_t TCR;                    /*!< Offset: 0xE80 (R/W)  ITM Trace Control Register */\n        uint32_t RESERVED3[29U];\n  __OM  uint32_t IWR;                    /*!< Offset: 0xEF8 ( /W)  ITM Integration Write Register */\n  __IM  uint32_t IRR;                    /*!< Offset: 0xEFC (R/ )  ITM Integration Read Register */\n  __IOM uint32_t IMCR;                   /*!< Offset: 0xF00 (R/W)  ITM Integration Mode Control Register */\n        uint32_t RESERVED4[43U];\n  __OM  uint32_t LAR;                    /*!< Offset: 0xFB0 ( /W)  ITM Lock Access Register */\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R/ )  ITM Lock Status Register */\n        uint32_t RESERVED5[6U];\n  __IM  uint32_t PID4;                   /*!< Offset: 0xFD0 (R/ )  ITM Peripheral Identification Register #4 */\n  __IM  uint32_t PID5;                   /*!< Offset: 0xFD4 (R/ )  ITM Peripheral Identification Register #5 */\n  __IM  uint32_t PID6;                   /*!< Offset: 0xFD8 (R/ )  ITM Peripheral Identification Register #6 */\n  __IM  uint32_t PID7;                   /*!< Offset: 0xFDC (R/ )  ITM Peripheral Identification Register #7 */\n  __IM  uint32_t PID0;                   /*!< Offset: 0xFE0 (R/ )  ITM Peripheral Identification Register #0 */\n  __IM  uint32_t PID1;                   /*!< Offset: 0xFE4 (R/ )  ITM Peripheral Identification Register #1 */\n  __IM  uint32_t PID2;                   /*!< Offset: 0xFE8 (R/ )  ITM Peripheral Identification Register #2 */\n  __IM  uint32_t PID3;                   /*!< Offset: 0xFEC (R/ )  ITM Peripheral Identification Register #3 */\n  __IM  uint32_t CID0;                   /*!< Offset: 0xFF0 (R/ )  ITM Component  Identification Register #0 */\n  __IM  uint32_t CID1;                   /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */\n  __IM  uint32_t CID2;                   /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */\n  __IM  uint32_t CID3;                   /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */\n} ITM_Type;\n\n/* ITM Trace Privilege Register Definitions */\n#define ITM_TPR_PRIVMASK_Pos                0U                                            /*!< ITM TPR: PRIVMASK Position */\n#define ITM_TPR_PRIVMASK_Msk               (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/)            /*!< ITM TPR: PRIVMASK Mask */\n\n/* ITM Trace Control Register Definitions */\n#define ITM_TCR_BUSY_Pos                   23U                                            /*!< ITM TCR: BUSY Position */\n#define ITM_TCR_BUSY_Msk                   (1UL << ITM_TCR_BUSY_Pos)                      /*!< ITM TCR: BUSY Mask */\n\n#define ITM_TCR_TraceBusID_Pos             16U                                            /*!< ITM TCR: ATBID Position */\n#define ITM_TCR_TraceBusID_Msk             (0x7FUL << ITM_TCR_TraceBusID_Pos)             /*!< ITM TCR: ATBID Mask */\n\n#define ITM_TCR_GTSFREQ_Pos                10U                                            /*!< ITM TCR: Global timestamp frequency Position */\n#define ITM_TCR_GTSFREQ_Msk                (3UL << ITM_TCR_GTSFREQ_Pos)                   /*!< ITM TCR: Global timestamp frequency Mask */\n\n#define ITM_TCR_TSPrescale_Pos              8U                                            /*!< ITM TCR: TSPrescale Position */\n#define ITM_TCR_TSPrescale_Msk             (3UL << ITM_TCR_TSPrescale_Pos)                /*!< ITM TCR: TSPrescale Mask */\n\n#define ITM_TCR_SWOENA_Pos                  4U                                            /*!< ITM TCR: SWOENA Position */\n#define ITM_TCR_SWOENA_Msk                 (1UL << ITM_TCR_SWOENA_Pos)                    /*!< ITM TCR: SWOENA Mask */\n\n#define ITM_TCR_DWTENA_Pos                  3U                                            /*!< ITM TCR: DWTENA Position */\n#define ITM_TCR_DWTENA_Msk                 (1UL << ITM_TCR_DWTENA_Pos)                    /*!< ITM TCR: DWTENA Mask */\n\n#define ITM_TCR_SYNCENA_Pos                 2U                                            /*!< ITM TCR: SYNCENA Position */\n#define ITM_TCR_SYNCENA_Msk                (1UL << ITM_TCR_SYNCENA_Pos)                   /*!< ITM TCR: SYNCENA Mask */\n\n#define ITM_TCR_TSENA_Pos                   1U                                            /*!< ITM TCR: TSENA Position */\n#define ITM_TCR_TSENA_Msk                  (1UL << ITM_TCR_TSENA_Pos)                     /*!< ITM TCR: TSENA Mask */\n\n#define ITM_TCR_ITMENA_Pos                  0U                                            /*!< ITM TCR: ITM Enable bit Position */\n#define ITM_TCR_ITMENA_Msk                 (1UL /*<< ITM_TCR_ITMENA_Pos*/)                /*!< ITM TCR: ITM Enable bit Mask */\n\n/* ITM Integration Write Register Definitions */\n#define ITM_IWR_ATVALIDM_Pos                0U                                            /*!< ITM IWR: ATVALIDM Position */\n#define ITM_IWR_ATVALIDM_Msk               (1UL /*<< ITM_IWR_ATVALIDM_Pos*/)              /*!< ITM IWR: ATVALIDM Mask */\n\n/* ITM Integration Read Register Definitions */\n#define ITM_IRR_ATREADYM_Pos                0U                                            /*!< ITM IRR: ATREADYM Position */\n#define ITM_IRR_ATREADYM_Msk               (1UL /*<< ITM_IRR_ATREADYM_Pos*/)              /*!< ITM IRR: ATREADYM Mask */\n\n/* ITM Integration Mode Control Register Definitions */\n#define ITM_IMCR_INTEGRATION_Pos            0U                                            /*!< ITM IMCR: INTEGRATION Position */\n#define ITM_IMCR_INTEGRATION_Msk           (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/)          /*!< ITM IMCR: INTEGRATION Mask */\n\n/* ITM Lock Status Register Definitions */\n#define ITM_LSR_ByteAcc_Pos                 2U                                            /*!< ITM LSR: ByteAcc Position */\n#define ITM_LSR_ByteAcc_Msk                (1UL << ITM_LSR_ByteAcc_Pos)                   /*!< ITM LSR: ByteAcc Mask */\n\n#define ITM_LSR_Access_Pos                  1U                                            /*!< ITM LSR: Access Position */\n#define ITM_LSR_Access_Msk                 (1UL << ITM_LSR_Access_Pos)                    /*!< ITM LSR: Access Mask */\n\n#define ITM_LSR_Present_Pos                 0U                                            /*!< ITM LSR: Present Position */\n#define ITM_LSR_Present_Msk                (1UL /*<< ITM_LSR_Present_Pos*/)               /*!< ITM LSR: Present Mask */\n\n/*@}*/ /* end of group CMSIS_ITM */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)\n  \\brief    Type definitions for the Data Watchpoint and Trace (DWT)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Data Watchpoint and Trace Register (DWT).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  Control Register */\n  __IOM uint32_t CYCCNT;                 /*!< Offset: 0x004 (R/W)  Cycle Count Register */\n  __IOM uint32_t CPICNT;                 /*!< Offset: 0x008 (R/W)  CPI Count Register */\n  __IOM uint32_t EXCCNT;                 /*!< Offset: 0x00C (R/W)  Exception Overhead Count Register */\n  __IOM uint32_t SLEEPCNT;               /*!< Offset: 0x010 (R/W)  Sleep Count Register */\n  __IOM uint32_t LSUCNT;                 /*!< Offset: 0x014 (R/W)  LSU Count Register */\n  __IOM uint32_t FOLDCNT;                /*!< Offset: 0x018 (R/W)  Folded-instruction Count Register */\n  __IM  uint32_t PCSR;                   /*!< Offset: 0x01C (R/ )  Program Counter Sample Register */\n  __IOM uint32_t COMP0;                  /*!< Offset: 0x020 (R/W)  Comparator Register 0 */\n  __IOM uint32_t MASK0;                  /*!< Offset: 0x024 (R/W)  Mask Register 0 */\n  __IOM uint32_t FUNCTION0;              /*!< Offset: 0x028 (R/W)  Function Register 0 */\n        uint32_t RESERVED0[1U];\n  __IOM uint32_t COMP1;                  /*!< Offset: 0x030 (R/W)  Comparator Register 1 */\n  __IOM uint32_t MASK1;                  /*!< Offset: 0x034 (R/W)  Mask Register 1 */\n  __IOM uint32_t FUNCTION1;              /*!< Offset: 0x038 (R/W)  Function Register 1 */\n        uint32_t RESERVED1[1U];\n  __IOM uint32_t COMP2;                  /*!< Offset: 0x040 (R/W)  Comparator Register 2 */\n  __IOM uint32_t MASK2;                  /*!< Offset: 0x044 (R/W)  Mask Register 2 */\n  __IOM uint32_t FUNCTION2;              /*!< Offset: 0x048 (R/W)  Function Register 2 */\n        uint32_t RESERVED2[1U];\n  __IOM uint32_t COMP3;                  /*!< Offset: 0x050 (R/W)  Comparator Register 3 */\n  __IOM uint32_t MASK3;                  /*!< Offset: 0x054 (R/W)  Mask Register 3 */\n  __IOM uint32_t FUNCTION3;              /*!< Offset: 0x058 (R/W)  Function Register 3 */\n        uint32_t RESERVED3[981U];\n  __OM  uint32_t LAR;                    /*!< Offset: 0xFB0 (  W)  Lock Access Register */\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R  )  Lock Status Register */\n} DWT_Type;\n\n/* DWT Control Register Definitions */\n#define DWT_CTRL_NUMCOMP_Pos               28U                                         /*!< DWT CTRL: NUMCOMP Position */\n#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */\n\n#define DWT_CTRL_NOTRCPKT_Pos              27U                                         /*!< DWT CTRL: NOTRCPKT Position */\n#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */\n\n#define DWT_CTRL_NOEXTTRIG_Pos             26U                                         /*!< DWT CTRL: NOEXTTRIG Position */\n#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */\n\n#define DWT_CTRL_NOCYCCNT_Pos              25U                                         /*!< DWT CTRL: NOCYCCNT Position */\n#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */\n\n#define DWT_CTRL_NOPRFCNT_Pos              24U                                         /*!< DWT CTRL: NOPRFCNT Position */\n#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */\n\n#define DWT_CTRL_CYCEVTENA_Pos             22U                                         /*!< DWT CTRL: CYCEVTENA Position */\n#define DWT_CTRL_CYCEVTENA_Msk             (0x1UL << DWT_CTRL_CYCEVTENA_Pos)           /*!< DWT CTRL: CYCEVTENA Mask */\n\n#define DWT_CTRL_FOLDEVTENA_Pos            21U                                         /*!< DWT CTRL: FOLDEVTENA Position */\n#define DWT_CTRL_FOLDEVTENA_Msk            (0x1UL << DWT_CTRL_FOLDEVTENA_Pos)          /*!< DWT CTRL: FOLDEVTENA Mask */\n\n#define DWT_CTRL_LSUEVTENA_Pos             20U                                         /*!< DWT CTRL: LSUEVTENA Position */\n#define DWT_CTRL_LSUEVTENA_Msk             (0x1UL << DWT_CTRL_LSUEVTENA_Pos)           /*!< DWT CTRL: LSUEVTENA Mask */\n\n#define DWT_CTRL_SLEEPEVTENA_Pos           19U                                         /*!< DWT CTRL: SLEEPEVTENA Position */\n#define DWT_CTRL_SLEEPEVTENA_Msk           (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos)         /*!< DWT CTRL: SLEEPEVTENA Mask */\n\n#define DWT_CTRL_EXCEVTENA_Pos             18U                                         /*!< DWT CTRL: EXCEVTENA Position */\n#define DWT_CTRL_EXCEVTENA_Msk             (0x1UL << DWT_CTRL_EXCEVTENA_Pos)           /*!< DWT CTRL: EXCEVTENA Mask */\n\n#define DWT_CTRL_CPIEVTENA_Pos             17U                                         /*!< DWT CTRL: CPIEVTENA Position */\n#define DWT_CTRL_CPIEVTENA_Msk             (0x1UL << DWT_CTRL_CPIEVTENA_Pos)           /*!< DWT CTRL: CPIEVTENA Mask */\n\n#define DWT_CTRL_EXCTRCENA_Pos             16U                                         /*!< DWT CTRL: EXCTRCENA Position */\n#define DWT_CTRL_EXCTRCENA_Msk             (0x1UL << DWT_CTRL_EXCTRCENA_Pos)           /*!< DWT CTRL: EXCTRCENA Mask */\n\n#define DWT_CTRL_PCSAMPLENA_Pos            12U                                         /*!< DWT CTRL: PCSAMPLENA Position */\n#define DWT_CTRL_PCSAMPLENA_Msk            (0x1UL << DWT_CTRL_PCSAMPLENA_Pos)          /*!< DWT CTRL: PCSAMPLENA Mask */\n\n#define DWT_CTRL_SYNCTAP_Pos               10U                                         /*!< DWT CTRL: SYNCTAP Position */\n#define DWT_CTRL_SYNCTAP_Msk               (0x3UL << DWT_CTRL_SYNCTAP_Pos)             /*!< DWT CTRL: SYNCTAP Mask */\n\n#define DWT_CTRL_CYCTAP_Pos                 9U                                         /*!< DWT CTRL: CYCTAP Position */\n#define DWT_CTRL_CYCTAP_Msk                (0x1UL << DWT_CTRL_CYCTAP_Pos)              /*!< DWT CTRL: CYCTAP Mask */\n\n#define DWT_CTRL_POSTINIT_Pos               5U                                         /*!< DWT CTRL: POSTINIT Position */\n#define DWT_CTRL_POSTINIT_Msk              (0xFUL << DWT_CTRL_POSTINIT_Pos)            /*!< DWT CTRL: POSTINIT Mask */\n\n#define DWT_CTRL_POSTPRESET_Pos             1U                                         /*!< DWT CTRL: POSTPRESET Position */\n#define DWT_CTRL_POSTPRESET_Msk            (0xFUL << DWT_CTRL_POSTPRESET_Pos)          /*!< DWT CTRL: POSTPRESET Mask */\n\n#define DWT_CTRL_CYCCNTENA_Pos              0U                                         /*!< DWT CTRL: CYCCNTENA Position */\n#define DWT_CTRL_CYCCNTENA_Msk             (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/)       /*!< DWT CTRL: CYCCNTENA Mask */\n\n/* DWT CPI Count Register Definitions */\n#define DWT_CPICNT_CPICNT_Pos               0U                                         /*!< DWT CPICNT: CPICNT Position */\n#define DWT_CPICNT_CPICNT_Msk              (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/)       /*!< DWT CPICNT: CPICNT Mask */\n\n/* DWT Exception Overhead Count Register Definitions */\n#define DWT_EXCCNT_EXCCNT_Pos               0U                                         /*!< DWT EXCCNT: EXCCNT Position */\n#define DWT_EXCCNT_EXCCNT_Msk              (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/)       /*!< DWT EXCCNT: EXCCNT Mask */\n\n/* DWT Sleep Count Register Definitions */\n#define DWT_SLEEPCNT_SLEEPCNT_Pos           0U                                         /*!< DWT SLEEPCNT: SLEEPCNT Position */\n#define DWT_SLEEPCNT_SLEEPCNT_Msk          (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/)   /*!< DWT SLEEPCNT: SLEEPCNT Mask */\n\n/* DWT LSU Count Register Definitions */\n#define DWT_LSUCNT_LSUCNT_Pos               0U                                         /*!< DWT LSUCNT: LSUCNT Position */\n#define DWT_LSUCNT_LSUCNT_Msk              (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/)       /*!< DWT LSUCNT: LSUCNT Mask */\n\n/* DWT Folded-instruction Count Register Definitions */\n#define DWT_FOLDCNT_FOLDCNT_Pos             0U                                         /*!< DWT FOLDCNT: FOLDCNT Position */\n#define DWT_FOLDCNT_FOLDCNT_Msk            (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/)     /*!< DWT FOLDCNT: FOLDCNT Mask */\n\n/* DWT Comparator Mask Register Definitions */\n#define DWT_MASK_MASK_Pos                   0U                                         /*!< DWT MASK: MASK Position */\n#define DWT_MASK_MASK_Msk                  (0x1FUL /*<< DWT_MASK_MASK_Pos*/)           /*!< DWT MASK: MASK Mask */\n\n/* DWT Comparator Function Register Definitions */\n#define DWT_FUNCTION_MATCHED_Pos           24U                                         /*!< DWT FUNCTION: MATCHED Position */\n#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */\n\n#define DWT_FUNCTION_DATAVADDR1_Pos        16U                                         /*!< DWT FUNCTION: DATAVADDR1 Position */\n#define DWT_FUNCTION_DATAVADDR1_Msk        (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos)      /*!< DWT FUNCTION: DATAVADDR1 Mask */\n\n#define DWT_FUNCTION_DATAVADDR0_Pos        12U                                         /*!< DWT FUNCTION: DATAVADDR0 Position */\n#define DWT_FUNCTION_DATAVADDR0_Msk        (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos)      /*!< DWT FUNCTION: DATAVADDR0 Mask */\n\n#define DWT_FUNCTION_DATAVSIZE_Pos         10U                                         /*!< DWT FUNCTION: DATAVSIZE Position */\n#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */\n\n#define DWT_FUNCTION_LNK1ENA_Pos            9U                                         /*!< DWT FUNCTION: LNK1ENA Position */\n#define DWT_FUNCTION_LNK1ENA_Msk           (0x1UL << DWT_FUNCTION_LNK1ENA_Pos)         /*!< DWT FUNCTION: LNK1ENA Mask */\n\n#define DWT_FUNCTION_DATAVMATCH_Pos         8U                                         /*!< DWT FUNCTION: DATAVMATCH Position */\n#define DWT_FUNCTION_DATAVMATCH_Msk        (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos)      /*!< DWT FUNCTION: DATAVMATCH Mask */\n\n#define DWT_FUNCTION_CYCMATCH_Pos           7U                                         /*!< DWT FUNCTION: CYCMATCH Position */\n#define DWT_FUNCTION_CYCMATCH_Msk          (0x1UL << DWT_FUNCTION_CYCMATCH_Pos)        /*!< DWT FUNCTION: CYCMATCH Mask */\n\n#define DWT_FUNCTION_EMITRANGE_Pos          5U                                         /*!< DWT FUNCTION: EMITRANGE Position */\n#define DWT_FUNCTION_EMITRANGE_Msk         (0x1UL << DWT_FUNCTION_EMITRANGE_Pos)       /*!< DWT FUNCTION: EMITRANGE Mask */\n\n#define DWT_FUNCTION_FUNCTION_Pos           0U                                         /*!< DWT FUNCTION: FUNCTION Position */\n#define DWT_FUNCTION_FUNCTION_Msk          (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/)    /*!< DWT FUNCTION: FUNCTION Mask */\n\n/*@}*/ /* end of group CMSIS_DWT */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_TPI     Trace Port Interface (TPI)\n  \\brief    Type definitions for the Trace Port Interface (TPI)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Trace Port Interface Register (TPI).\n */\ntypedef struct\n{\n  __IOM uint32_t SSPSR;                  /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register */\n  __IOM uint32_t CSPSR;                  /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */\n        uint32_t RESERVED0[2U];\n  __IOM uint32_t ACPR;                   /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */\n        uint32_t RESERVED1[55U];\n  __IOM uint32_t SPPR;                   /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */\n        uint32_t RESERVED2[131U];\n  __IM  uint32_t FFSR;                   /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */\n  __IOM uint32_t FFCR;                   /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */\n  __IM  uint32_t FSCR;                   /*!< Offset: 0x308 (R/ )  Formatter Synchronization Counter Register */\n        uint32_t RESERVED3[759U];\n  __IM  uint32_t TRIGGER;                /*!< Offset: 0xEE8 (R/ )  TRIGGER */\n  __IM  uint32_t FIFO0;                  /*!< Offset: 0xEEC (R/ )  Integration ETM Data */\n  __IM  uint32_t ITATBCTR2;              /*!< Offset: 0xEF0 (R/ )  ITATBCTR2 */\n        uint32_t RESERVED4[1U];\n  __IM  uint32_t ITATBCTR0;              /*!< Offset: 0xEF8 (R/ )  ITATBCTR0 */\n  __IM  uint32_t FIFO1;                  /*!< Offset: 0xEFC (R/ )  Integration ITM Data */\n  __IOM uint32_t ITCTRL;                 /*!< Offset: 0xF00 (R/W)  Integration Mode Control */\n        uint32_t RESERVED5[39U];\n  __IOM uint32_t CLAIMSET;               /*!< Offset: 0xFA0 (R/W)  Claim tag set */\n  __IOM uint32_t CLAIMCLR;               /*!< Offset: 0xFA4 (R/W)  Claim tag clear */\n        uint32_t RESERVED7[8U];\n  __IM  uint32_t DEVID;                  /*!< Offset: 0xFC8 (R/ )  TPIU_DEVID */\n  __IM  uint32_t DEVTYPE;                /*!< Offset: 0xFCC (R/ )  TPIU_DEVTYPE */\n} TPI_Type;\n\n/* TPI Asynchronous Clock Prescaler Register Definitions */\n#define TPI_ACPR_PRESCALER_Pos              0U                                         /*!< TPI ACPR: PRESCALER Position */\n#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/)    /*!< TPI ACPR: PRESCALER Mask */\n\n/* TPI Selected Pin Protocol Register Definitions */\n#define TPI_SPPR_TXMODE_Pos                 0U                                         /*!< TPI SPPR: TXMODE Position */\n#define TPI_SPPR_TXMODE_Msk                (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/)          /*!< TPI SPPR: TXMODE Mask */\n\n/* TPI Formatter and Flush Status Register Definitions */\n#define TPI_FFSR_FtNonStop_Pos              3U                                         /*!< TPI FFSR: FtNonStop Position */\n#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */\n\n#define TPI_FFSR_TCPresent_Pos              2U                                         /*!< TPI FFSR: TCPresent Position */\n#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */\n\n#define TPI_FFSR_FtStopped_Pos              1U                                         /*!< TPI FFSR: FtStopped Position */\n#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */\n\n#define TPI_FFSR_FlInProg_Pos               0U                                         /*!< TPI FFSR: FlInProg Position */\n#define TPI_FFSR_FlInProg_Msk              (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/)        /*!< TPI FFSR: FlInProg Mask */\n\n/* TPI Formatter and Flush Control Register Definitions */\n#define TPI_FFCR_TrigIn_Pos                 8U                                         /*!< TPI FFCR: TrigIn Position */\n#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */\n\n#define TPI_FFCR_EnFCont_Pos                1U                                         /*!< TPI FFCR: EnFCont Position */\n#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */\n\n/* TPI TRIGGER Register Definitions */\n#define TPI_TRIGGER_TRIGGER_Pos             0U                                         /*!< TPI TRIGGER: TRIGGER Position */\n#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/)      /*!< TPI TRIGGER: TRIGGER Mask */\n\n/* TPI Integration ETM Data Register Definitions (FIFO0) */\n#define TPI_FIFO0_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO0: ITM_ATVALID Position */\n#define TPI_FIFO0_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos)        /*!< TPI FIFO0: ITM_ATVALID Mask */\n\n#define TPI_FIFO0_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO0: ITM_bytecount Position */\n#define TPI_FIFO0_ITM_bytecount_Msk        (0x3UL << TPI_FIFO0_ITM_bytecount_Pos)      /*!< TPI FIFO0: ITM_bytecount Mask */\n\n#define TPI_FIFO0_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO0: ETM_ATVALID Position */\n#define TPI_FIFO0_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos)        /*!< TPI FIFO0: ETM_ATVALID Mask */\n\n#define TPI_FIFO0_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO0: ETM_bytecount Position */\n#define TPI_FIFO0_ETM_bytecount_Msk        (0x3UL << TPI_FIFO0_ETM_bytecount_Pos)      /*!< TPI FIFO0: ETM_bytecount Mask */\n\n#define TPI_FIFO0_ETM2_Pos                 16U                                         /*!< TPI FIFO0: ETM2 Position */\n#define TPI_FIFO0_ETM2_Msk                 (0xFFUL << TPI_FIFO0_ETM2_Pos)              /*!< TPI FIFO0: ETM2 Mask */\n\n#define TPI_FIFO0_ETM1_Pos                  8U                                         /*!< TPI FIFO0: ETM1 Position */\n#define TPI_FIFO0_ETM1_Msk                 (0xFFUL << TPI_FIFO0_ETM1_Pos)              /*!< TPI FIFO0: ETM1 Mask */\n\n#define TPI_FIFO0_ETM0_Pos                  0U                                         /*!< TPI FIFO0: ETM0 Position */\n#define TPI_FIFO0_ETM0_Msk                 (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/)          /*!< TPI FIFO0: ETM0 Mask */\n\n/* TPI ITATBCTR2 Register Definitions */\n#define TPI_ITATBCTR2_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR2: ATREADY Position */\n#define TPI_ITATBCTR2_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/)    /*!< TPI ITATBCTR2: ATREADY Mask */\n\n/* TPI Integration ITM Data Register Definitions (FIFO1) */\n#define TPI_FIFO1_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO1: ITM_ATVALID Position */\n#define TPI_FIFO1_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos)        /*!< TPI FIFO1: ITM_ATVALID Mask */\n\n#define TPI_FIFO1_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO1: ITM_bytecount Position */\n#define TPI_FIFO1_ITM_bytecount_Msk        (0x3UL << TPI_FIFO1_ITM_bytecount_Pos)      /*!< TPI FIFO1: ITM_bytecount Mask */\n\n#define TPI_FIFO1_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO1: ETM_ATVALID Position */\n#define TPI_FIFO1_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos)        /*!< TPI FIFO1: ETM_ATVALID Mask */\n\n#define TPI_FIFO1_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO1: ETM_bytecount Position */\n#define TPI_FIFO1_ETM_bytecount_Msk        (0x3UL << TPI_FIFO1_ETM_bytecount_Pos)      /*!< TPI FIFO1: ETM_bytecount Mask */\n\n#define TPI_FIFO1_ITM2_Pos                 16U                                         /*!< TPI FIFO1: ITM2 Position */\n#define TPI_FIFO1_ITM2_Msk                 (0xFFUL << TPI_FIFO1_ITM2_Pos)              /*!< TPI FIFO1: ITM2 Mask */\n\n#define TPI_FIFO1_ITM1_Pos                  8U                                         /*!< TPI FIFO1: ITM1 Position */\n#define TPI_FIFO1_ITM1_Msk                 (0xFFUL << TPI_FIFO1_ITM1_Pos)              /*!< TPI FIFO1: ITM1 Mask */\n\n#define TPI_FIFO1_ITM0_Pos                  0U                                         /*!< TPI FIFO1: ITM0 Position */\n#define TPI_FIFO1_ITM0_Msk                 (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/)          /*!< TPI FIFO1: ITM0 Mask */\n\n/* TPI ITATBCTR0 Register Definitions */\n#define TPI_ITATBCTR0_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR0: ATREADY Position */\n#define TPI_ITATBCTR0_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/)    /*!< TPI ITATBCTR0: ATREADY Mask */\n\n/* TPI Integration Mode Control Register Definitions */\n#define TPI_ITCTRL_Mode_Pos                 0U                                         /*!< TPI ITCTRL: Mode Position */\n#define TPI_ITCTRL_Mode_Msk                (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/)          /*!< TPI ITCTRL: Mode Mask */\n\n/* TPI DEVID Register Definitions */\n#define TPI_DEVID_NRZVALID_Pos             11U                                         /*!< TPI DEVID: NRZVALID Position */\n#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */\n\n#define TPI_DEVID_MANCVALID_Pos            10U                                         /*!< TPI DEVID: MANCVALID Position */\n#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */\n\n#define TPI_DEVID_PTINVALID_Pos             9U                                         /*!< TPI DEVID: PTINVALID Position */\n#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */\n\n#define TPI_DEVID_MinBufSz_Pos              6U                                         /*!< TPI DEVID: MinBufSz Position */\n#define TPI_DEVID_MinBufSz_Msk             (0x7UL << TPI_DEVID_MinBufSz_Pos)           /*!< TPI DEVID: MinBufSz Mask */\n\n#define TPI_DEVID_AsynClkIn_Pos             5U                                         /*!< TPI DEVID: AsynClkIn Position */\n#define TPI_DEVID_AsynClkIn_Msk            (0x1UL << TPI_DEVID_AsynClkIn_Pos)          /*!< TPI DEVID: AsynClkIn Mask */\n\n#define TPI_DEVID_NrTraceInput_Pos          0U                                         /*!< TPI DEVID: NrTraceInput Position */\n#define TPI_DEVID_NrTraceInput_Msk         (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/)  /*!< TPI DEVID: NrTraceInput Mask */\n\n/* TPI DEVTYPE Register Definitions */\n#define TPI_DEVTYPE_MajorType_Pos           4U                                         /*!< TPI DEVTYPE: MajorType Position */\n#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */\n\n#define TPI_DEVTYPE_SubType_Pos             0U                                         /*!< TPI DEVTYPE: SubType Position */\n#define TPI_DEVTYPE_SubType_Msk            (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/)      /*!< TPI DEVTYPE: SubType Mask */\n\n/*@}*/ /* end of group CMSIS_TPI */\n\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RASR;                   /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A1;                /*!< Offset: 0x014 (R/W)  MPU Alias 1 Region Base Address Register */\n  __IOM uint32_t RASR_A1;                /*!< Offset: 0x018 (R/W)  MPU Alias 1 Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A2;                /*!< Offset: 0x01C (R/W)  MPU Alias 2 Region Base Address Register */\n  __IOM uint32_t RASR_A2;                /*!< Offset: 0x020 (R/W)  MPU Alias 2 Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A3;                /*!< Offset: 0x024 (R/W)  MPU Alias 3 Region Base Address Register */\n  __IOM uint32_t RASR_A3;                /*!< Offset: 0x028 (R/W)  MPU Alias 3 Region Attribute and Size Register */\n} MPU_Type;\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_ADDR_Pos                   5U                                            /*!< MPU RBAR: ADDR Position */\n#define MPU_RBAR_ADDR_Msk                  (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos)             /*!< MPU RBAR: ADDR Mask */\n\n#define MPU_RBAR_VALID_Pos                  4U                                            /*!< MPU RBAR: VALID Position */\n#define MPU_RBAR_VALID_Msk                 (1UL << MPU_RBAR_VALID_Pos)                    /*!< MPU RBAR: VALID Mask */\n\n#define MPU_RBAR_REGION_Pos                 0U                                            /*!< MPU RBAR: REGION Position */\n#define MPU_RBAR_REGION_Msk                (0xFUL /*<< MPU_RBAR_REGION_Pos*/)             /*!< MPU RBAR: REGION Mask */\n\n/* MPU Region Attribute and Size Register Definitions */\n#define MPU_RASR_ATTRS_Pos                 16U                                            /*!< MPU RASR: MPU Region Attribute field Position */\n#define MPU_RASR_ATTRS_Msk                 (0xFFFFUL << MPU_RASR_ATTRS_Pos)               /*!< MPU RASR: MPU Region Attribute field Mask */\n\n#define MPU_RASR_XN_Pos                    28U                                            /*!< MPU RASR: ATTRS.XN Position */\n#define MPU_RASR_XN_Msk                    (1UL << MPU_RASR_XN_Pos)                       /*!< MPU RASR: ATTRS.XN Mask */\n\n#define MPU_RASR_AP_Pos                    24U                                            /*!< MPU RASR: ATTRS.AP Position */\n#define MPU_RASR_AP_Msk                    (0x7UL << MPU_RASR_AP_Pos)                     /*!< MPU RASR: ATTRS.AP Mask */\n\n#define MPU_RASR_TEX_Pos                   19U                                            /*!< MPU RASR: ATTRS.TEX Position */\n#define MPU_RASR_TEX_Msk                   (0x7UL << MPU_RASR_TEX_Pos)                    /*!< MPU RASR: ATTRS.TEX Mask */\n\n#define MPU_RASR_S_Pos                     18U                                            /*!< MPU RASR: ATTRS.S Position */\n#define MPU_RASR_S_Msk                     (1UL << MPU_RASR_S_Pos)                        /*!< MPU RASR: ATTRS.S Mask */\n\n#define MPU_RASR_C_Pos                     17U                                            /*!< MPU RASR: ATTRS.C Position */\n#define MPU_RASR_C_Msk                     (1UL << MPU_RASR_C_Pos)                        /*!< MPU RASR: ATTRS.C Mask */\n\n#define MPU_RASR_B_Pos                     16U                                            /*!< MPU RASR: ATTRS.B Position */\n#define MPU_RASR_B_Msk                     (1UL << MPU_RASR_B_Pos)                        /*!< MPU RASR: ATTRS.B Mask */\n\n#define MPU_RASR_SRD_Pos                    8U                                            /*!< MPU RASR: Sub-Region Disable Position */\n#define MPU_RASR_SRD_Msk                   (0xFFUL << MPU_RASR_SRD_Pos)                   /*!< MPU RASR: Sub-Region Disable Mask */\n\n#define MPU_RASR_SIZE_Pos                   1U                                            /*!< MPU RASR: Region Size Field Position */\n#define MPU_RASR_SIZE_Msk                  (0x1FUL << MPU_RASR_SIZE_Pos)                  /*!< MPU RASR: Region Size Field Mask */\n\n#define MPU_RASR_ENABLE_Pos                 0U                                            /*!< MPU RASR: Region enable bit Position */\n#define MPU_RASR_ENABLE_Msk                (1UL /*<< MPU_RASR_ENABLE_Pos*/)               /*!< MPU RASR: Region enable bit Disable Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_FPU     Floating Point Unit (FPU)\n  \\brief    Type definitions for the Floating Point Unit (FPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Floating Point Unit (FPU).\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IOM uint32_t FPCCR;                  /*!< Offset: 0x004 (R/W)  Floating-Point Context Control Register */\n  __IOM uint32_t FPCAR;                  /*!< Offset: 0x008 (R/W)  Floating-Point Context Address Register */\n  __IOM uint32_t FPDSCR;                 /*!< Offset: 0x00C (R/W)  Floating-Point Default Status Control Register */\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x010 (R/ )  Media and FP Feature Register 0 */\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x014 (R/ )  Media and FP Feature Register 1 */\n  __IM  uint32_t MVFR2;                  /*!< Offset: 0x018 (R/ )  Media and FP Feature Register 2 */\n} FPU_Type;\n\n/* Floating-Point Context Control Register Definitions */\n#define FPU_FPCCR_ASPEN_Pos                31U                                            /*!< FPCCR: ASPEN bit Position */\n#define FPU_FPCCR_ASPEN_Msk                (1UL << FPU_FPCCR_ASPEN_Pos)                   /*!< FPCCR: ASPEN bit Mask */\n\n#define FPU_FPCCR_LSPEN_Pos                30U                                            /*!< FPCCR: LSPEN Position */\n#define FPU_FPCCR_LSPEN_Msk                (1UL << FPU_FPCCR_LSPEN_Pos)                   /*!< FPCCR: LSPEN bit Mask */\n\n#define FPU_FPCCR_MONRDY_Pos                8U                                            /*!< FPCCR: MONRDY Position */\n#define FPU_FPCCR_MONRDY_Msk               (1UL << FPU_FPCCR_MONRDY_Pos)                  /*!< FPCCR: MONRDY bit Mask */\n\n#define FPU_FPCCR_BFRDY_Pos                 6U                                            /*!< FPCCR: BFRDY Position */\n#define FPU_FPCCR_BFRDY_Msk                (1UL << FPU_FPCCR_BFRDY_Pos)                   /*!< FPCCR: BFRDY bit Mask */\n\n#define FPU_FPCCR_MMRDY_Pos                 5U                                            /*!< FPCCR: MMRDY Position */\n#define FPU_FPCCR_MMRDY_Msk                (1UL << FPU_FPCCR_MMRDY_Pos)                   /*!< FPCCR: MMRDY bit Mask */\n\n#define FPU_FPCCR_HFRDY_Pos                 4U                                            /*!< FPCCR: HFRDY Position */\n#define FPU_FPCCR_HFRDY_Msk                (1UL << FPU_FPCCR_HFRDY_Pos)                   /*!< FPCCR: HFRDY bit Mask */\n\n#define FPU_FPCCR_THREAD_Pos                3U                                            /*!< FPCCR: processor mode bit Position */\n#define FPU_FPCCR_THREAD_Msk               (1UL << FPU_FPCCR_THREAD_Pos)                  /*!< FPCCR: processor mode active bit Mask */\n\n#define FPU_FPCCR_USER_Pos                  1U                                            /*!< FPCCR: privilege level bit Position */\n#define FPU_FPCCR_USER_Msk                 (1UL << FPU_FPCCR_USER_Pos)                    /*!< FPCCR: privilege level bit Mask */\n\n#define FPU_FPCCR_LSPACT_Pos                0U                                            /*!< FPCCR: Lazy state preservation active bit Position */\n#define FPU_FPCCR_LSPACT_Msk               (1UL /*<< FPU_FPCCR_LSPACT_Pos*/)              /*!< FPCCR: Lazy state preservation active bit Mask */\n\n/* Floating-Point Context Address Register Definitions */\n#define FPU_FPCAR_ADDRESS_Pos               3U                                            /*!< FPCAR: ADDRESS bit Position */\n#define FPU_FPCAR_ADDRESS_Msk              (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos)        /*!< FPCAR: ADDRESS bit Mask */\n\n/* Floating-Point Default Status Control Register Definitions */\n#define FPU_FPDSCR_AHP_Pos                 26U                                            /*!< FPDSCR: AHP bit Position */\n#define FPU_FPDSCR_AHP_Msk                 (1UL << FPU_FPDSCR_AHP_Pos)                    /*!< FPDSCR: AHP bit Mask */\n\n#define FPU_FPDSCR_DN_Pos                  25U                                            /*!< FPDSCR: DN bit Position */\n#define FPU_FPDSCR_DN_Msk                  (1UL << FPU_FPDSCR_DN_Pos)                     /*!< FPDSCR: DN bit Mask */\n\n#define FPU_FPDSCR_FZ_Pos                  24U                                            /*!< FPDSCR: FZ bit Position */\n#define FPU_FPDSCR_FZ_Msk                  (1UL << FPU_FPDSCR_FZ_Pos)                     /*!< FPDSCR: FZ bit Mask */\n\n#define FPU_FPDSCR_RMode_Pos               22U                                            /*!< FPDSCR: RMode bit Position */\n#define FPU_FPDSCR_RMode_Msk               (3UL << FPU_FPDSCR_RMode_Pos)                  /*!< FPDSCR: RMode bit Mask */\n\n/* Media and FP Feature Register 0 Definitions */\n#define FPU_MVFR0_FP_rounding_modes_Pos    28U                                            /*!< MVFR0: FP rounding modes bits Position */\n#define FPU_MVFR0_FP_rounding_modes_Msk    (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos)     /*!< MVFR0: FP rounding modes bits Mask */\n\n#define FPU_MVFR0_Short_vectors_Pos        24U                                            /*!< MVFR0: Short vectors bits Position */\n#define FPU_MVFR0_Short_vectors_Msk        (0xFUL << FPU_MVFR0_Short_vectors_Pos)         /*!< MVFR0: Short vectors bits Mask */\n\n#define FPU_MVFR0_Square_root_Pos          20U                                            /*!< MVFR0: Square root bits Position */\n#define FPU_MVFR0_Square_root_Msk          (0xFUL << FPU_MVFR0_Square_root_Pos)           /*!< MVFR0: Square root bits Mask */\n\n#define FPU_MVFR0_Divide_Pos               16U                                            /*!< MVFR0: Divide bits Position */\n#define FPU_MVFR0_Divide_Msk               (0xFUL << FPU_MVFR0_Divide_Pos)                /*!< MVFR0: Divide bits Mask */\n\n#define FPU_MVFR0_FP_excep_trapping_Pos    12U                                            /*!< MVFR0: FP exception trapping bits Position */\n#define FPU_MVFR0_FP_excep_trapping_Msk    (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos)     /*!< MVFR0: FP exception trapping bits Mask */\n\n#define FPU_MVFR0_Double_precision_Pos      8U                                            /*!< MVFR0: Double-precision bits Position */\n#define FPU_MVFR0_Double_precision_Msk     (0xFUL << FPU_MVFR0_Double_precision_Pos)      /*!< MVFR0: Double-precision bits Mask */\n\n#define FPU_MVFR0_Single_precision_Pos      4U                                            /*!< MVFR0: Single-precision bits Position */\n#define FPU_MVFR0_Single_precision_Msk     (0xFUL << FPU_MVFR0_Single_precision_Pos)      /*!< MVFR0: Single-precision bits Mask */\n\n#define FPU_MVFR0_A_SIMD_registers_Pos      0U                                            /*!< MVFR0: A_SIMD registers bits Position */\n#define FPU_MVFR0_A_SIMD_registers_Msk     (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/)  /*!< MVFR0: A_SIMD registers bits Mask */\n\n/* Media and FP Feature Register 1 Definitions */\n#define FPU_MVFR1_FP_fused_MAC_Pos         28U                                            /*!< MVFR1: FP fused MAC bits Position */\n#define FPU_MVFR1_FP_fused_MAC_Msk         (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos)          /*!< MVFR1: FP fused MAC bits Mask */\n\n#define FPU_MVFR1_FP_HPFP_Pos              24U                                            /*!< MVFR1: FP HPFP bits Position */\n#define FPU_MVFR1_FP_HPFP_Msk              (0xFUL << FPU_MVFR1_FP_HPFP_Pos)               /*!< MVFR1: FP HPFP bits Mask */\n\n#define FPU_MVFR1_D_NaN_mode_Pos            4U                                            /*!< MVFR1: D_NaN mode bits Position */\n#define FPU_MVFR1_D_NaN_mode_Msk           (0xFUL << FPU_MVFR1_D_NaN_mode_Pos)            /*!< MVFR1: D_NaN mode bits Mask */\n\n#define FPU_MVFR1_FtZ_mode_Pos              0U                                            /*!< MVFR1: FtZ mode bits Position */\n#define FPU_MVFR1_FtZ_mode_Msk             (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/)          /*!< MVFR1: FtZ mode bits Mask */\n\n/* Media and FP Feature Register 2 Definitions */\n\n/*@} end of group CMSIS_FPU */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Type definitions for the Core Debug Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Core Debug Register (CoreDebug).\n */\ntypedef struct\n{\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\n} CoreDebug_Type;\n\n/* Debug Halting Control and Status Register Definitions */\n#define CoreDebug_DHCSR_DBGKEY_Pos         16U                                            /*!< CoreDebug DHCSR: DBGKEY Position */\n#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< CoreDebug DHCSR: DBGKEY Mask */\n\n#define CoreDebug_DHCSR_S_RESET_ST_Pos     25U                                            /*!< CoreDebug DHCSR: S_RESET_ST Position */\n#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< CoreDebug DHCSR: S_RESET_ST Mask */\n\n#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24U                                            /*!< CoreDebug DHCSR: S_RETIRE_ST Position */\n#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */\n\n#define CoreDebug_DHCSR_S_LOCKUP_Pos       19U                                            /*!< CoreDebug DHCSR: S_LOCKUP Position */\n#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< CoreDebug DHCSR: S_LOCKUP Mask */\n\n#define CoreDebug_DHCSR_S_SLEEP_Pos        18U                                            /*!< CoreDebug DHCSR: S_SLEEP Position */\n#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< CoreDebug DHCSR: S_SLEEP Mask */\n\n#define CoreDebug_DHCSR_S_HALT_Pos         17U                                            /*!< CoreDebug DHCSR: S_HALT Position */\n#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< CoreDebug DHCSR: S_HALT Mask */\n\n#define CoreDebug_DHCSR_S_REGRDY_Pos       16U                                            /*!< CoreDebug DHCSR: S_REGRDY Position */\n#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< CoreDebug DHCSR: S_REGRDY Mask */\n\n#define CoreDebug_DHCSR_C_SNAPSTALL_Pos     5U                                            /*!< CoreDebug DHCSR: C_SNAPSTALL Position */\n#define CoreDebug_DHCSR_C_SNAPSTALL_Msk    (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos)       /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */\n\n#define CoreDebug_DHCSR_C_MASKINTS_Pos      3U                                            /*!< CoreDebug DHCSR: C_MASKINTS Position */\n#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< CoreDebug DHCSR: C_MASKINTS Mask */\n\n#define CoreDebug_DHCSR_C_STEP_Pos          2U                                            /*!< CoreDebug DHCSR: C_STEP Position */\n#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< CoreDebug DHCSR: C_STEP Mask */\n\n#define CoreDebug_DHCSR_C_HALT_Pos          1U                                            /*!< CoreDebug DHCSR: C_HALT Position */\n#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< CoreDebug DHCSR: C_HALT Mask */\n\n#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0U                                            /*!< CoreDebug DHCSR: C_DEBUGEN Position */\n#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/)     /*!< CoreDebug DHCSR: C_DEBUGEN Mask */\n\n/* Debug Core Register Selector Register Definitions */\n#define CoreDebug_DCRSR_REGWnR_Pos         16U                                            /*!< CoreDebug DCRSR: REGWnR Position */\n#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< CoreDebug DCRSR: REGWnR Mask */\n\n#define CoreDebug_DCRSR_REGSEL_Pos          0U                                            /*!< CoreDebug DCRSR: REGSEL Position */\n#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/)     /*!< CoreDebug DCRSR: REGSEL Mask */\n\n/* Debug Exception and Monitor Control Register Definitions */\n#define CoreDebug_DEMCR_TRCENA_Pos         24U                                            /*!< CoreDebug DEMCR: TRCENA Position */\n#define CoreDebug_DEMCR_TRCENA_Msk         (1UL << CoreDebug_DEMCR_TRCENA_Pos)            /*!< CoreDebug DEMCR: TRCENA Mask */\n\n#define CoreDebug_DEMCR_MON_REQ_Pos        19U                                            /*!< CoreDebug DEMCR: MON_REQ Position */\n#define CoreDebug_DEMCR_MON_REQ_Msk        (1UL << CoreDebug_DEMCR_MON_REQ_Pos)           /*!< CoreDebug DEMCR: MON_REQ Mask */\n\n#define CoreDebug_DEMCR_MON_STEP_Pos       18U                                            /*!< CoreDebug DEMCR: MON_STEP Position */\n#define CoreDebug_DEMCR_MON_STEP_Msk       (1UL << CoreDebug_DEMCR_MON_STEP_Pos)          /*!< CoreDebug DEMCR: MON_STEP Mask */\n\n#define CoreDebug_DEMCR_MON_PEND_Pos       17U                                            /*!< CoreDebug DEMCR: MON_PEND Position */\n#define CoreDebug_DEMCR_MON_PEND_Msk       (1UL << CoreDebug_DEMCR_MON_PEND_Pos)          /*!< CoreDebug DEMCR: MON_PEND Mask */\n\n#define CoreDebug_DEMCR_MON_EN_Pos         16U                                            /*!< CoreDebug DEMCR: MON_EN Position */\n#define CoreDebug_DEMCR_MON_EN_Msk         (1UL << CoreDebug_DEMCR_MON_EN_Pos)            /*!< CoreDebug DEMCR: MON_EN Mask */\n\n#define CoreDebug_DEMCR_VC_HARDERR_Pos     10U                                            /*!< CoreDebug DEMCR: VC_HARDERR Position */\n#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< CoreDebug DEMCR: VC_HARDERR Mask */\n\n#define CoreDebug_DEMCR_VC_INTERR_Pos       9U                                            /*!< CoreDebug DEMCR: VC_INTERR Position */\n#define CoreDebug_DEMCR_VC_INTERR_Msk      (1UL << CoreDebug_DEMCR_VC_INTERR_Pos)         /*!< CoreDebug DEMCR: VC_INTERR Mask */\n\n#define CoreDebug_DEMCR_VC_BUSERR_Pos       8U                                            /*!< CoreDebug DEMCR: VC_BUSERR Position */\n#define CoreDebug_DEMCR_VC_BUSERR_Msk      (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos)         /*!< CoreDebug DEMCR: VC_BUSERR Mask */\n\n#define CoreDebug_DEMCR_VC_STATERR_Pos      7U                                            /*!< CoreDebug DEMCR: VC_STATERR Position */\n#define CoreDebug_DEMCR_VC_STATERR_Msk     (1UL << CoreDebug_DEMCR_VC_STATERR_Pos)        /*!< CoreDebug DEMCR: VC_STATERR Mask */\n\n#define CoreDebug_DEMCR_VC_CHKERR_Pos       6U                                            /*!< CoreDebug DEMCR: VC_CHKERR Position */\n#define CoreDebug_DEMCR_VC_CHKERR_Msk      (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos)         /*!< CoreDebug DEMCR: VC_CHKERR Mask */\n\n#define CoreDebug_DEMCR_VC_NOCPERR_Pos      5U                                            /*!< CoreDebug DEMCR: VC_NOCPERR Position */\n#define CoreDebug_DEMCR_VC_NOCPERR_Msk     (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos)        /*!< CoreDebug DEMCR: VC_NOCPERR Mask */\n\n#define CoreDebug_DEMCR_VC_MMERR_Pos        4U                                            /*!< CoreDebug DEMCR: VC_MMERR Position */\n#define CoreDebug_DEMCR_VC_MMERR_Msk       (1UL << CoreDebug_DEMCR_VC_MMERR_Pos)          /*!< CoreDebug DEMCR: VC_MMERR Mask */\n\n#define CoreDebug_DEMCR_VC_CORERESET_Pos    0U                                            /*!< CoreDebug DEMCR: VC_CORERESET Position */\n#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/)  /*!< CoreDebug DEMCR: VC_CORERESET Mask */\n\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */\n#define ITM_BASE            (0xE0000000UL)                            /*!< ITM Base Address */\n#define DWT_BASE            (0xE0001000UL)                            /*!< DWT Base Address */\n#define TPI_BASE            (0xE0040000UL)                            /*!< TPI Base Address */\n#define CoreDebug_BASE      (0xE000EDF0UL)                            /*!< Core Debug Base Address */\n#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */\n#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */\n#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */\n\n#define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE      )   /*!< System control Register not in SCB */\n#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */\n#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */\n#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */\n#define ITM                 ((ITM_Type       *)     ITM_BASE      )   /*!< ITM configuration struct */\n#define DWT                 ((DWT_Type       *)     DWT_BASE      )   /*!< DWT configuration struct */\n#define TPI                 ((TPI_Type       *)     TPI_BASE      )   /*!< TPI configuration struct */\n#define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE)   /*!< Core Debug configuration struct */\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit */\n  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit */\n#endif\n\n#define FPU_BASE            (SCS_BASE +  0x0F30UL)                    /*!< Floating Point Unit */\n#define FPU                 ((FPU_Type       *)     FPU_BASE      )   /*!< Floating Point Unit */\n\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Debug Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifndef CMSIS_NVIC_VIRTUAL\n  #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping\n  #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n  #define NVIC_GetActive              __NVIC_GetActive\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifndef CMSIS_VECTAB_VIRTUAL\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n\n/**\n  \\brief   Set Priority Grouping\n  \\details Sets the priority grouping field using the required unlock sequence.\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\n           Only values from 0..7 are used.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]      PriorityGroup  Priority grouping field.\n */\n__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)\n{\n  uint32_t reg_value;\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\n\n  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */\n  reg_value  =  (reg_value                                   |\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                (PriorityGroupTmp << 8U)                      );              /* Insert write key and priorty group */\n  SCB->AIRCR =  reg_value;\n}\n\n\n/**\n  \\brief   Get Priority Grouping\n  \\details Reads the priority grouping field from the NVIC Interrupt Controller.\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void)\n{\n  return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\n}\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt\n  \\details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IP[((uint32_t)(int32_t)IRQn)]                = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n  else\n  {\n    SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)]                >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return(((uint32_t)SCB->SHPR[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Encode Priority\n  \\details Encodes the priority for an interrupt with the given priority group,\n           preemptive priority value, and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [in]   PreemptPriority  Preemptive priority value (starting from 0).\n  \\param [in]       SubPriority  Subpriority value (starting from 0).\n  \\return                        Encoded priority. Value can be used in the function \\ref NVIC_SetPriority().\n */\n__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  return (\n           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |\n           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))\n         );\n}\n\n\n/**\n  \\brief   Decode Priority\n  \\details Decodes an interrupt priority value with a given priority group to\n           preemptive priority value and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.\n  \\param [in]         Priority   Priority value, which can be retrieved with the function \\ref NVIC_GetPriority().\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [out] pPreemptPriority  Preemptive priority value (starting from 0).\n  \\param [out]     pSubPriority  Subpriority value (starting from 0).\n */\n__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);\n  *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL);\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__STATIC_INLINE void NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |\n                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |\n                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n  uint32_t mvfr0;\n\n  mvfr0 = SCB->MVFR0;\n  if      ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U)\n  {\n    return 2U;           /* Double + Single precision FPU */\n  }\n  else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U)\n  {\n    return 1U;           /* Single precision FPU */\n  }\n  else\n  {\n    return 0U;           /* No FPU */\n  }\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##########################  Cache functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_CacheFunctions Cache Functions\n  \\brief    Functions that configure Instruction and Data cache.\n  @{\n */\n\n/* Cache Size ID Register Macros */\n#define CCSIDR_WAYS(x)         (((x) & SCB_CCSIDR_ASSOCIATIVITY_Msk) >> SCB_CCSIDR_ASSOCIATIVITY_Pos)\n#define CCSIDR_SETS(x)         (((x) & SCB_CCSIDR_NUMSETS_Msk      ) >> SCB_CCSIDR_NUMSETS_Pos      )\n\n\n/**\n  \\brief   Enable I-Cache\n  \\details Turns on I-Cache\n  */\n__STATIC_INLINE void SCB_EnableICache (void)\n{\n  #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)\n    __DSB();\n    __ISB();\n    SCB->ICIALLU = 0UL;                     /* invalidate I-Cache */\n    __DSB();\n    __ISB();\n    SCB->CCR |=  (uint32_t)SCB_CCR_IC_Msk;  /* enable I-Cache */\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/**\n  \\brief   Disable I-Cache\n  \\details Turns off I-Cache\n  */\n__STATIC_INLINE void SCB_DisableICache (void)\n{\n  #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)\n    __DSB();\n    __ISB();\n    SCB->CCR &= ~(uint32_t)SCB_CCR_IC_Msk;  /* disable I-Cache */\n    SCB->ICIALLU = 0UL;                     /* invalidate I-Cache */\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/**\n  \\brief   Invalidate I-Cache\n  \\details Invalidates I-Cache\n  */\n__STATIC_INLINE void SCB_InvalidateICache (void)\n{\n  #if defined (__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)\n    __DSB();\n    __ISB();\n    SCB->ICIALLU = 0UL;\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/**\n  \\brief   Enable D-Cache\n  \\details Turns on D-Cache\n  */\n__STATIC_INLINE void SCB_EnableDCache (void)\n{\n  #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)\n    uint32_t ccsidr;\n    uint32_t sets;\n    uint32_t ways;\n\n    SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/  /* Level 1 data cache */\n    __DSB();\n\n    ccsidr = SCB->CCSIDR;\n\n                                            /* invalidate D-Cache */\n    sets = (uint32_t)(CCSIDR_SETS(ccsidr));\n    do {\n      ways = (uint32_t)(CCSIDR_WAYS(ccsidr));\n      do {\n        SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) |\n                      ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk)  );\n        #if defined ( __CC_ARM )\n          __schedule_barrier();\n        #endif\n      } while (ways-- != 0U);\n    } while(sets-- != 0U);\n    __DSB();\n\n    SCB->CCR |=  (uint32_t)SCB_CCR_DC_Msk;  /* enable D-Cache */\n\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/**\n  \\brief   Disable D-Cache\n  \\details Turns off D-Cache\n  */\n__STATIC_INLINE void SCB_DisableDCache (void)\n{\n  #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)\n    register uint32_t ccsidr;\n    register uint32_t sets;\n    register uint32_t ways;\n\n    SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/  /* Level 1 data cache */\n    __DSB();\n\n    SCB->CCR &= ~(uint32_t)SCB_CCR_DC_Msk;  /* disable D-Cache */\n    __DSB();\n\n    ccsidr = SCB->CCSIDR;\n\n                                            /* clean & invalidate D-Cache */\n    sets = (uint32_t)(CCSIDR_SETS(ccsidr));\n    do {\n      ways = (uint32_t)(CCSIDR_WAYS(ccsidr));\n      do {\n        SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) |\n                       ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk)  );\n        #if defined ( __CC_ARM )\n          __schedule_barrier();\n        #endif\n      } while (ways-- != 0U);\n    } while(sets-- != 0U);\n\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/**\n  \\brief   Invalidate D-Cache\n  \\details Invalidates D-Cache\n  */\n__STATIC_INLINE void SCB_InvalidateDCache (void)\n{\n  #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)\n    uint32_t ccsidr;\n    uint32_t sets;\n    uint32_t ways;\n\n    SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/  /* Level 1 data cache */\n    __DSB();\n\n    ccsidr = SCB->CCSIDR;\n\n                                            /* invalidate D-Cache */\n    sets = (uint32_t)(CCSIDR_SETS(ccsidr));\n    do {\n      ways = (uint32_t)(CCSIDR_WAYS(ccsidr));\n      do {\n        SCB->DCISW = (((sets << SCB_DCISW_SET_Pos) & SCB_DCISW_SET_Msk) |\n                      ((ways << SCB_DCISW_WAY_Pos) & SCB_DCISW_WAY_Msk)  );\n        #if defined ( __CC_ARM )\n          __schedule_barrier();\n        #endif\n      } while (ways-- != 0U);\n    } while(sets-- != 0U);\n\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/**\n  \\brief   Clean D-Cache\n  \\details Cleans D-Cache\n  */\n__STATIC_INLINE void SCB_CleanDCache (void)\n{\n  #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)\n    uint32_t ccsidr;\n    uint32_t sets;\n    uint32_t ways;\n\n     SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/  /* Level 1 data cache */\n   __DSB();\n\n    ccsidr = SCB->CCSIDR;\n\n                                            /* clean D-Cache */\n    sets = (uint32_t)(CCSIDR_SETS(ccsidr));\n    do {\n      ways = (uint32_t)(CCSIDR_WAYS(ccsidr));\n      do {\n        SCB->DCCSW = (((sets << SCB_DCCSW_SET_Pos) & SCB_DCCSW_SET_Msk) |\n                      ((ways << SCB_DCCSW_WAY_Pos) & SCB_DCCSW_WAY_Msk)  );\n        #if defined ( __CC_ARM )\n          __schedule_barrier();\n        #endif\n      } while (ways-- != 0U);\n    } while(sets-- != 0U);\n\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/**\n  \\brief   Clean & Invalidate D-Cache\n  \\details Cleans and Invalidates D-Cache\n  */\n__STATIC_INLINE void SCB_CleanInvalidateDCache (void)\n{\n  #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)\n    uint32_t ccsidr;\n    uint32_t sets;\n    uint32_t ways;\n\n    SCB->CSSELR = 0U; /*(0U << 1U) | 0U;*/  /* Level 1 data cache */\n    __DSB();\n\n    ccsidr = SCB->CCSIDR;\n\n                                            /* clean & invalidate D-Cache */\n    sets = (uint32_t)(CCSIDR_SETS(ccsidr));\n    do {\n      ways = (uint32_t)(CCSIDR_WAYS(ccsidr));\n      do {\n        SCB->DCCISW = (((sets << SCB_DCCISW_SET_Pos) & SCB_DCCISW_SET_Msk) |\n                       ((ways << SCB_DCCISW_WAY_Pos) & SCB_DCCISW_WAY_Msk)  );\n        #if defined ( __CC_ARM )\n          __schedule_barrier();\n        #endif\n      } while (ways-- != 0U);\n    } while(sets-- != 0U);\n\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/**\n  \\brief   D-Cache Invalidate by address\n  \\details Invalidates D-Cache for the given address\n  \\param[in]   addr    address (aligned to 32-byte boundary)\n  \\param[in]   dsize   size of memory block (in number of bytes)\n*/\n__STATIC_INLINE void SCB_InvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize)\n{\n  #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)\n     int32_t op_size = dsize;\n    uint32_t op_addr = (uint32_t)addr;\n     int32_t linesize = 32;                /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */\n\n    __DSB();\n\n    while (op_size > 0) {\n      SCB->DCIMVAC = op_addr;\n      op_addr += (uint32_t)linesize;\n      op_size -=           linesize;\n    }\n\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/**\n  \\brief   D-Cache Clean by address\n  \\details Cleans D-Cache for the given address\n  \\param[in]   addr    address (aligned to 32-byte boundary)\n  \\param[in]   dsize   size of memory block (in number of bytes)\n*/\n__STATIC_INLINE void SCB_CleanDCache_by_Addr (uint32_t *addr, int32_t dsize)\n{\n  #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)\n     int32_t op_size = dsize;\n    uint32_t op_addr = (uint32_t) addr;\n     int32_t linesize = 32;                /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */\n\n    __DSB();\n\n    while (op_size > 0) {\n      SCB->DCCMVAC = op_addr;\n      op_addr += (uint32_t)linesize;\n      op_size -=           linesize;\n    }\n\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/**\n  \\brief   D-Cache Clean and Invalidate by address\n  \\details Cleans and invalidates D_Cache for the given address\n  \\param[in]   addr    address (aligned to 32-byte boundary)\n  \\param[in]   dsize   size of memory block (in number of bytes)\n*/\n__STATIC_INLINE void SCB_CleanInvalidateDCache_by_Addr (uint32_t *addr, int32_t dsize)\n{\n  #if defined (__DCACHE_PRESENT) && (__DCACHE_PRESENT == 1U)\n     int32_t op_size = dsize;\n    uint32_t op_addr = (uint32_t) addr;\n     int32_t linesize = 32;                /* in Cortex-M7 size of cache line is fixed to 8 words (32 bytes) */\n\n    __DSB();\n\n    while (op_size > 0) {\n      SCB->DCCIMVAC = op_addr;\n      op_addr += (uint32_t)linesize;\n      op_size -=           linesize;\n    }\n\n    __DSB();\n    __ISB();\n  #endif\n}\n\n\n/*@} end of CMSIS_Core_CacheFunctions */\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n/* ##################################### Debug In/Output function ########################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_core_DebugFunctions ITM Functions\n  \\brief    Functions that access the ITM debug interface.\n  @{\n */\n\nextern volatile int32_t ITM_RxBuffer;                              /*!< External variable to receive characters. */\n#define                 ITM_RXBUFFER_EMPTY  ((int32_t)0x5AA55AA5U) /*!< Value identifying \\ref ITM_RxBuffer is ready for next character. */\n\n\n/**\n  \\brief   ITM Send Character\n  \\details Transmits a character via the ITM channel 0, and\n           \\li Just returns when no debugger is connected that has booked the output.\n           \\li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.\n  \\param [in]     ch  Character to transmit.\n  \\returns            Character to transmit.\n */\n__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)\n{\n  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */\n      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */\n  {\n    while (ITM->PORT[0U].u32 == 0UL)\n    {\n      __NOP();\n    }\n    ITM->PORT[0U].u8 = (uint8_t)ch;\n  }\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Receive Character\n  \\details Inputs a character via the external variable \\ref ITM_RxBuffer.\n  \\return             Received character.\n  \\return         -1  No character pending.\n */\n__STATIC_INLINE int32_t ITM_ReceiveChar (void)\n{\n  int32_t ch = -1;                           /* no character available */\n\n  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY)\n  {\n    ch = ITM_RxBuffer;\n    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */\n  }\n\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Check Character\n  \\details Checks whether a character is pending for reading in the variable \\ref ITM_RxBuffer.\n  \\return          0  No character available.\n  \\return          1  Character available.\n */\n__STATIC_INLINE int32_t ITM_CheckChar (void)\n{\n\n  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY)\n  {\n    return (0);                              /* no character available */\n  }\n  else\n  {\n    return (1);                              /*    character available */\n  }\n}\n\n/*@} end of CMSIS_core_DebugFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM7_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_sc000.h",
    "content": "/**************************************************************************//**\n * @file     core_sc000.h\n * @brief    CMSIS SC000 Core Peripheral Access Layer Header File\n * @version  V5.0.1\n * @date     25. November 2016\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_SC000_H_GENERIC\n#define __CORE_SC000_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup SC000\n  @{\n */\n\n/*  CMSIS SC000 definitions */\n#define __SC000_CMSIS_VERSION_MAIN  ( 5U)                                    /*!< [31:16] CMSIS HAL main version */\n#define __SC000_CMSIS_VERSION_SUB   ( 0U)                                    /*!< [15:0]  CMSIS HAL sub version */\n#define __SC000_CMSIS_VERSION       ((__SC000_CMSIS_VERSION_MAIN << 16U) | \\\n                                      __SC000_CMSIS_VERSION_SUB           )  /*!< CMSIS HAL version number */\n\n#define __CORTEX_SC                 (000U)                                   /*!< Cortex secure core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    This core does not support an FPU at all\n*/\n#define __FPU_USED       0U\n\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_SC000_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_SC000_H_DEPENDANT\n#define __CORE_SC000_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __SC000_REV\n    #define __SC000_REV             0x0000U\n    #warning \"__SC000_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          2U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group SC000 */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core MPU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:28;              /*!< bit:  0..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */\n    uint32_t _reserved1:3;               /*!< bit: 25..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:1;               /*!< bit:      0  Reserved */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */\n    uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[1U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[31U];\n  __IOM uint32_t ICER[1U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[31U];\n  __IOM uint32_t ISPR[1U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[31U];\n  __IOM uint32_t ICPR[1U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[31U];\n        uint32_t RESERVED4[64U];\n  __IOM uint32_t IP[8U];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register */\n}  NVIC_Type;\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n        uint32_t RESERVED0[1U];\n  __IOM uint32_t SHP[2U];                /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n        uint32_t RESERVED1[154U];\n  __IOM uint32_t SFCR;                   /*!< Offset: 0x290 (R/W)  Security Features Control Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_NMIPENDSET_Pos            31U                                            /*!< SCB ICSR: NMIPENDSET Position */\n#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_STKALIGN_Pos                9U                                            /*!< SCB CCR: STKALIGN Position */\n#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)\n  \\brief    Type definitions for the System Control and ID Register not in the SCB\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control and ID Register not in the SCB.\n */\ntypedef struct\n{\n        uint32_t RESERVED0[2U];\n  __IOM uint32_t ACTLR;                  /*!< Offset: 0x008 (R/W)  Auxiliary Control Register */\n} SCnSCB_Type;\n\n/* Auxiliary Control Register Definitions */\n#define SCnSCB_ACTLR_DISMCYCINT_Pos         0U                                         /*!< ACTLR: DISMCYCINT Position */\n#define SCnSCB_ACTLR_DISMCYCINT_Msk        (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/)    /*!< ACTLR: DISMCYCINT Mask */\n\n/*@} end of group CMSIS_SCnotSCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RASR;                   /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register */\n} MPU_Type;\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_ADDR_Pos                   8U                                            /*!< MPU RBAR: ADDR Position */\n#define MPU_RBAR_ADDR_Msk                  (0xFFFFFFUL << MPU_RBAR_ADDR_Pos)              /*!< MPU RBAR: ADDR Mask */\n\n#define MPU_RBAR_VALID_Pos                  4U                                            /*!< MPU RBAR: VALID Position */\n#define MPU_RBAR_VALID_Msk                 (1UL << MPU_RBAR_VALID_Pos)                    /*!< MPU RBAR: VALID Mask */\n\n#define MPU_RBAR_REGION_Pos                 0U                                            /*!< MPU RBAR: REGION Position */\n#define MPU_RBAR_REGION_Msk                (0xFUL /*<< MPU_RBAR_REGION_Pos*/)             /*!< MPU RBAR: REGION Mask */\n\n/* MPU Region Attribute and Size Register Definitions */\n#define MPU_RASR_ATTRS_Pos                 16U                                            /*!< MPU RASR: MPU Region Attribute field Position */\n#define MPU_RASR_ATTRS_Msk                 (0xFFFFUL << MPU_RASR_ATTRS_Pos)               /*!< MPU RASR: MPU Region Attribute field Mask */\n\n#define MPU_RASR_XN_Pos                    28U                                            /*!< MPU RASR: ATTRS.XN Position */\n#define MPU_RASR_XN_Msk                    (1UL << MPU_RASR_XN_Pos)                       /*!< MPU RASR: ATTRS.XN Mask */\n\n#define MPU_RASR_AP_Pos                    24U                                            /*!< MPU RASR: ATTRS.AP Position */\n#define MPU_RASR_AP_Msk                    (0x7UL << MPU_RASR_AP_Pos)                     /*!< MPU RASR: ATTRS.AP Mask */\n\n#define MPU_RASR_TEX_Pos                   19U                                            /*!< MPU RASR: ATTRS.TEX Position */\n#define MPU_RASR_TEX_Msk                   (0x7UL << MPU_RASR_TEX_Pos)                    /*!< MPU RASR: ATTRS.TEX Mask */\n\n#define MPU_RASR_S_Pos                     18U                                            /*!< MPU RASR: ATTRS.S Position */\n#define MPU_RASR_S_Msk                     (1UL << MPU_RASR_S_Pos)                        /*!< MPU RASR: ATTRS.S Mask */\n\n#define MPU_RASR_C_Pos                     17U                                            /*!< MPU RASR: ATTRS.C Position */\n#define MPU_RASR_C_Msk                     (1UL << MPU_RASR_C_Pos)                        /*!< MPU RASR: ATTRS.C Mask */\n\n#define MPU_RASR_B_Pos                     16U                                            /*!< MPU RASR: ATTRS.B Position */\n#define MPU_RASR_B_Msk                     (1UL << MPU_RASR_B_Pos)                        /*!< MPU RASR: ATTRS.B Mask */\n\n#define MPU_RASR_SRD_Pos                    8U                                            /*!< MPU RASR: Sub-Region Disable Position */\n#define MPU_RASR_SRD_Msk                   (0xFFUL << MPU_RASR_SRD_Pos)                   /*!< MPU RASR: Sub-Region Disable Mask */\n\n#define MPU_RASR_SIZE_Pos                   1U                                            /*!< MPU RASR: Region Size Field Position */\n#define MPU_RASR_SIZE_Msk                  (0x1FUL << MPU_RASR_SIZE_Pos)                  /*!< MPU RASR: Region Size Field Mask */\n\n#define MPU_RASR_ENABLE_Pos                 0U                                            /*!< MPU RASR: Region enable bit Position */\n#define MPU_RASR_ENABLE_Msk                (1UL /*<< MPU_RASR_ENABLE_Pos*/)               /*!< MPU RASR: Region enable bit Disable Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    SC000 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor.\n            Therefore they are not covered by the SC000 header file.\n  @{\n */\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */\n#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */\n#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */\n#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */\n\n#define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE      )   /*!< System control Register not in SCB */\n#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */\n#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */\n#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit */\n  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit */\n#endif\n\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifndef CMSIS_NVIC_VIRTUAL\n/*#define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping   not available for SC000 */\n/*#define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping   not available for SC000 */\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n/*#define NVIC_GetActive              __NVIC_GetActive             not available for SC000 */\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifndef CMSIS_VECTAB_VIRTUAL\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n/* Interrupt Priorities are WORD accessible only under ARMv6M                   */\n/* The following MACROS handle generation of the register offset and byte masks */\n#define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL)\n#define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      )\n#define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      )\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n  else\n  {\n    SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__STATIC_INLINE void NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                 SCB_AIRCR_SYSRESETREQ_Msk);\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n    return 0U;           /* No FPU */\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_SC000_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/core_sc300.h",
    "content": "/**************************************************************************//**\n * @file     core_sc300.h\n * @brief    CMSIS SC300 Core Peripheral Access Layer Header File\n * @version  V5.0.1\n * @date     25. November 2016\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_SC300_H_GENERIC\n#define __CORE_SC300_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup SC3000\n  @{\n */\n\n/*  CMSIS SC300 definitions */\n#define __SC300_CMSIS_VERSION_MAIN  ( 5U)                                    /*!< [31:16] CMSIS HAL main version */\n#define __SC300_CMSIS_VERSION_SUB   ( 0U)                                    /*!< [15:0]  CMSIS HAL sub version */\n#define __SC300_CMSIS_VERSION       ((__SC300_CMSIS_VERSION_MAIN << 16U) | \\\n                                      __SC300_CMSIS_VERSION_SUB           )  /*!< CMSIS HAL version number */\n\n#define __CORTEX_SC                 (300U)                                   /*!< Cortex secure core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    This core does not support an FPU at all\n*/\n#define __FPU_USED       0U\n\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_PCS_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_SC300_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_SC300_H_DEPENDANT\n#define __CORE_SC300_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __SC300_REV\n    #define __SC300_REV               0x0000U\n    #warning \"__SC300_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          3U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group SC300 */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core Debug Register\n  - Core MPU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:27;              /*!< bit:  0..26  Reserved */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n#define APSR_Q_Pos                         27U                                            /*!< APSR: Q Position */\n#define APSR_Q_Msk                         (1UL << APSR_Q_Pos)                            /*!< APSR: Q Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:1;               /*!< bit:      9  Reserved */\n    uint32_t ICI_IT_1:6;                 /*!< bit: 10..15  ICI/IT part 1 */\n    uint32_t _reserved1:8;               /*!< bit: 16..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit */\n    uint32_t ICI_IT_2:2;                 /*!< bit: 25..26  ICI/IT part 2 */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_Q_Pos                         27U                                            /*!< xPSR: Q Position */\n#define xPSR_Q_Msk                         (1UL << xPSR_Q_Pos)                            /*!< xPSR: Q Mask */\n\n#define xPSR_ICI_IT_2_Pos                  25U                                            /*!< xPSR: ICI/IT part 2 Position */\n#define xPSR_ICI_IT_2_Msk                  (3UL << xPSR_ICI_IT_2_Pos)                     /*!< xPSR: ICI/IT part 2 Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_ICI_IT_1_Pos                  10U                                            /*!< xPSR: ICI/IT part 1 Position */\n#define xPSR_ICI_IT_1_Msk                  (0x3FUL << xPSR_ICI_IT_1_Pos)                  /*!< xPSR: ICI/IT part 1 Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */\n    uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[8U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[24U];\n  __IOM uint32_t ICER[8U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[24U];\n  __IOM uint32_t ISPR[8U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[24U];\n  __IOM uint32_t ICPR[8U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[24U];\n  __IOM uint32_t IABR[8U];               /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */\n        uint32_t RESERVED4[56U];\n  __IOM uint8_t  IP[240U];               /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */\n        uint32_t RESERVED5[644U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */\n}  NVIC_Type;\n\n/* Software Triggered Interrupt Register Definitions */\n#define NVIC_STIR_INTID_Pos                 0U                                         /*!< STIR: INTLINESNUM Position */\n#define NVIC_STIR_INTID_Msk                (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/)        /*!< STIR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n  __IOM uint8_t  SHP[12U];               /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11, 12-15) */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n  __IOM uint32_t CFSR;                   /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register */\n  __IOM uint32_t HFSR;                   /*!< Offset: 0x02C (R/W)  HardFault Status Register */\n  __IOM uint32_t DFSR;                   /*!< Offset: 0x030 (R/W)  Debug Fault Status Register */\n  __IOM uint32_t MMFAR;                  /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register */\n  __IOM uint32_t BFAR;                   /*!< Offset: 0x038 (R/W)  BusFault Address Register */\n  __IOM uint32_t AFSR;                   /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register */\n  __IM  uint32_t PFR[2U];                /*!< Offset: 0x040 (R/ )  Processor Feature Register */\n  __IM  uint32_t DFR;                    /*!< Offset: 0x048 (R/ )  Debug Feature Register */\n  __IM  uint32_t ADR;                    /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register */\n  __IM  uint32_t MMFR[4U];               /*!< Offset: 0x050 (R/ )  Memory Model Feature Register */\n  __IM  uint32_t ISAR[5U];               /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register */\n        uint32_t RESERVED0[5U];\n  __IOM uint32_t CPACR;                  /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register */\n        uint32_t RESERVED1[129U];\n  __IOM uint32_t SFCR;                   /*!< Offset: 0x290 (R/W)  Security Features Control Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_NMIPENDSET_Pos            31U                                            /*!< SCB ICSR: NMIPENDSET Position */\n#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_RETTOBASE_Pos             11U                                            /*!< SCB ICSR: RETTOBASE Position */\n#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n/* SCB Vector Table Offset Register Definitions */\n#define SCB_VTOR_TBLBASE_Pos               29U                                            /*!< SCB VTOR: TBLBASE Position */\n#define SCB_VTOR_TBLBASE_Msk               (1UL << SCB_VTOR_TBLBASE_Pos)                  /*!< SCB VTOR: TBLBASE Mask */\n\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x3FFFFFUL << SCB_VTOR_TBLOFF_Pos)            /*!< SCB VTOR: TBLOFF Mask */\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_PRIGROUP_Pos              8U                                            /*!< SCB AIRCR: PRIGROUP Position */\n#define SCB_AIRCR_PRIGROUP_Msk             (7UL << SCB_AIRCR_PRIGROUP_Pos)                /*!< SCB AIRCR: PRIGROUP Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n#define SCB_AIRCR_VECTRESET_Pos             0U                                            /*!< SCB AIRCR: VECTRESET Position */\n#define SCB_AIRCR_VECTRESET_Msk            (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/)           /*!< SCB AIRCR: VECTRESET Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_STKALIGN_Pos                9U                                            /*!< SCB CCR: STKALIGN Position */\n#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */\n\n#define SCB_CCR_BFHFNMIGN_Pos               8U                                            /*!< SCB CCR: BFHFNMIGN Position */\n#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */\n\n#define SCB_CCR_DIV_0_TRP_Pos               4U                                            /*!< SCB CCR: DIV_0_TRP Position */\n#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n#define SCB_CCR_USERSETMPEND_Pos            1U                                            /*!< SCB CCR: USERSETMPEND Position */\n#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */\n\n#define SCB_CCR_NONBASETHRDENA_Pos          0U                                            /*!< SCB CCR: NONBASETHRDENA Position */\n#define SCB_CCR_NONBASETHRDENA_Msk         (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/)        /*!< SCB CCR: NONBASETHRDENA Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_USGFAULTENA_Pos          18U                                            /*!< SCB SHCSR: USGFAULTENA Position */\n#define SCB_SHCSR_USGFAULTENA_Msk          (1UL << SCB_SHCSR_USGFAULTENA_Pos)             /*!< SCB SHCSR: USGFAULTENA Mask */\n\n#define SCB_SHCSR_BUSFAULTENA_Pos          17U                                            /*!< SCB SHCSR: BUSFAULTENA Position */\n#define SCB_SHCSR_BUSFAULTENA_Msk          (1UL << SCB_SHCSR_BUSFAULTENA_Pos)             /*!< SCB SHCSR: BUSFAULTENA Mask */\n\n#define SCB_SHCSR_MEMFAULTENA_Pos          16U                                            /*!< SCB SHCSR: MEMFAULTENA Position */\n#define SCB_SHCSR_MEMFAULTENA_Msk          (1UL << SCB_SHCSR_MEMFAULTENA_Pos)             /*!< SCB SHCSR: MEMFAULTENA Mask */\n\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n#define SCB_SHCSR_BUSFAULTPENDED_Pos       14U                                            /*!< SCB SHCSR: BUSFAULTPENDED Position */\n#define SCB_SHCSR_BUSFAULTPENDED_Msk       (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos)          /*!< SCB SHCSR: BUSFAULTPENDED Mask */\n\n#define SCB_SHCSR_MEMFAULTPENDED_Pos       13U                                            /*!< SCB SHCSR: MEMFAULTPENDED Position */\n#define SCB_SHCSR_MEMFAULTPENDED_Msk       (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos)          /*!< SCB SHCSR: MEMFAULTPENDED Mask */\n\n#define SCB_SHCSR_USGFAULTPENDED_Pos       12U                                            /*!< SCB SHCSR: USGFAULTPENDED Position */\n#define SCB_SHCSR_USGFAULTPENDED_Msk       (1UL << SCB_SHCSR_USGFAULTPENDED_Pos)          /*!< SCB SHCSR: USGFAULTPENDED Mask */\n\n#define SCB_SHCSR_SYSTICKACT_Pos           11U                                            /*!< SCB SHCSR: SYSTICKACT Position */\n#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */\n\n#define SCB_SHCSR_PENDSVACT_Pos            10U                                            /*!< SCB SHCSR: PENDSVACT Position */\n#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */\n\n#define SCB_SHCSR_MONITORACT_Pos            8U                                            /*!< SCB SHCSR: MONITORACT Position */\n#define SCB_SHCSR_MONITORACT_Msk           (1UL << SCB_SHCSR_MONITORACT_Pos)              /*!< SCB SHCSR: MONITORACT Mask */\n\n#define SCB_SHCSR_SVCALLACT_Pos             7U                                            /*!< SCB SHCSR: SVCALLACT Position */\n#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */\n\n#define SCB_SHCSR_USGFAULTACT_Pos           3U                                            /*!< SCB SHCSR: USGFAULTACT Position */\n#define SCB_SHCSR_USGFAULTACT_Msk          (1UL << SCB_SHCSR_USGFAULTACT_Pos)             /*!< SCB SHCSR: USGFAULTACT Mask */\n\n#define SCB_SHCSR_BUSFAULTACT_Pos           1U                                            /*!< SCB SHCSR: BUSFAULTACT Position */\n#define SCB_SHCSR_BUSFAULTACT_Msk          (1UL << SCB_SHCSR_BUSFAULTACT_Pos)             /*!< SCB SHCSR: BUSFAULTACT Mask */\n\n#define SCB_SHCSR_MEMFAULTACT_Pos           0U                                            /*!< SCB SHCSR: MEMFAULTACT Position */\n#define SCB_SHCSR_MEMFAULTACT_Msk          (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/)         /*!< SCB SHCSR: MEMFAULTACT Mask */\n\n/* SCB Configurable Fault Status Register Definitions */\n#define SCB_CFSR_USGFAULTSR_Pos            16U                                            /*!< SCB CFSR: Usage Fault Status Register Position */\n#define SCB_CFSR_USGFAULTSR_Msk            (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos)          /*!< SCB CFSR: Usage Fault Status Register Mask */\n\n#define SCB_CFSR_BUSFAULTSR_Pos             8U                                            /*!< SCB CFSR: Bus Fault Status Register Position */\n#define SCB_CFSR_BUSFAULTSR_Msk            (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos)            /*!< SCB CFSR: Bus Fault Status Register Mask */\n\n#define SCB_CFSR_MEMFAULTSR_Pos             0U                                            /*!< SCB CFSR: Memory Manage Fault Status Register Position */\n#define SCB_CFSR_MEMFAULTSR_Msk            (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/)        /*!< SCB CFSR: Memory Manage Fault Status Register Mask */\n\n/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_MMARVALID_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 7U)               /*!< SCB CFSR (MMFSR): MMARVALID Position */\n#define SCB_CFSR_MMARVALID_Msk             (1UL << SCB_CFSR_MMARVALID_Pos)                /*!< SCB CFSR (MMFSR): MMARVALID Mask */\n\n#define SCB_CFSR_MSTKERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 4U)               /*!< SCB CFSR (MMFSR): MSTKERR Position */\n#define SCB_CFSR_MSTKERR_Msk               (1UL << SCB_CFSR_MSTKERR_Pos)                  /*!< SCB CFSR (MMFSR): MSTKERR Mask */\n\n#define SCB_CFSR_MUNSTKERR_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 3U)               /*!< SCB CFSR (MMFSR): MUNSTKERR Position */\n#define SCB_CFSR_MUNSTKERR_Msk             (1UL << SCB_CFSR_MUNSTKERR_Pos)                /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */\n\n#define SCB_CFSR_DACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 1U)               /*!< SCB CFSR (MMFSR): DACCVIOL Position */\n#define SCB_CFSR_DACCVIOL_Msk              (1UL << SCB_CFSR_DACCVIOL_Pos)                 /*!< SCB CFSR (MMFSR): DACCVIOL Mask */\n\n#define SCB_CFSR_IACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 0U)               /*!< SCB CFSR (MMFSR): IACCVIOL Position */\n#define SCB_CFSR_IACCVIOL_Msk              (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/)             /*!< SCB CFSR (MMFSR): IACCVIOL Mask */\n\n/* BusFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_BFARVALID_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 7U)                  /*!< SCB CFSR (BFSR): BFARVALID Position */\n#define SCB_CFSR_BFARVALID_Msk            (1UL << SCB_CFSR_BFARVALID_Pos)                 /*!< SCB CFSR (BFSR): BFARVALID Mask */\n\n#define SCB_CFSR_STKERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 4U)                  /*!< SCB CFSR (BFSR): STKERR Position */\n#define SCB_CFSR_STKERR_Msk               (1UL << SCB_CFSR_STKERR_Pos)                    /*!< SCB CFSR (BFSR): STKERR Mask */\n\n#define SCB_CFSR_UNSTKERR_Pos             (SCB_CFSR_BUSFAULTSR_Pos + 3U)                  /*!< SCB CFSR (BFSR): UNSTKERR Position */\n#define SCB_CFSR_UNSTKERR_Msk             (1UL << SCB_CFSR_UNSTKERR_Pos)                  /*!< SCB CFSR (BFSR): UNSTKERR Mask */\n\n#define SCB_CFSR_IMPRECISERR_Pos          (SCB_CFSR_BUSFAULTSR_Pos + 2U)                  /*!< SCB CFSR (BFSR): IMPRECISERR Position */\n#define SCB_CFSR_IMPRECISERR_Msk          (1UL << SCB_CFSR_IMPRECISERR_Pos)               /*!< SCB CFSR (BFSR): IMPRECISERR Mask */\n\n#define SCB_CFSR_PRECISERR_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 1U)                  /*!< SCB CFSR (BFSR): PRECISERR Position */\n#define SCB_CFSR_PRECISERR_Msk            (1UL << SCB_CFSR_PRECISERR_Pos)                 /*!< SCB CFSR (BFSR): PRECISERR Mask */\n\n#define SCB_CFSR_IBUSERR_Pos              (SCB_CFSR_BUSFAULTSR_Pos + 0U)                  /*!< SCB CFSR (BFSR): IBUSERR Position */\n#define SCB_CFSR_IBUSERR_Msk              (1UL << SCB_CFSR_IBUSERR_Pos)                   /*!< SCB CFSR (BFSR): IBUSERR Mask */\n\n/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_DIVBYZERO_Pos            (SCB_CFSR_USGFAULTSR_Pos + 9U)                  /*!< SCB CFSR (UFSR): DIVBYZERO Position */\n#define SCB_CFSR_DIVBYZERO_Msk            (1UL << SCB_CFSR_DIVBYZERO_Pos)                 /*!< SCB CFSR (UFSR): DIVBYZERO Mask */\n\n#define SCB_CFSR_UNALIGNED_Pos            (SCB_CFSR_USGFAULTSR_Pos + 8U)                  /*!< SCB CFSR (UFSR): UNALIGNED Position */\n#define SCB_CFSR_UNALIGNED_Msk            (1UL << SCB_CFSR_UNALIGNED_Pos)                 /*!< SCB CFSR (UFSR): UNALIGNED Mask */\n\n#define SCB_CFSR_NOCP_Pos                 (SCB_CFSR_USGFAULTSR_Pos + 3U)                  /*!< SCB CFSR (UFSR): NOCP Position */\n#define SCB_CFSR_NOCP_Msk                 (1UL << SCB_CFSR_NOCP_Pos)                      /*!< SCB CFSR (UFSR): NOCP Mask */\n\n#define SCB_CFSR_INVPC_Pos                (SCB_CFSR_USGFAULTSR_Pos + 2U)                  /*!< SCB CFSR (UFSR): INVPC Position */\n#define SCB_CFSR_INVPC_Msk                (1UL << SCB_CFSR_INVPC_Pos)                     /*!< SCB CFSR (UFSR): INVPC Mask */\n\n#define SCB_CFSR_INVSTATE_Pos             (SCB_CFSR_USGFAULTSR_Pos + 1U)                  /*!< SCB CFSR (UFSR): INVSTATE Position */\n#define SCB_CFSR_INVSTATE_Msk             (1UL << SCB_CFSR_INVSTATE_Pos)                  /*!< SCB CFSR (UFSR): INVSTATE Mask */\n\n#define SCB_CFSR_UNDEFINSTR_Pos           (SCB_CFSR_USGFAULTSR_Pos + 0U)                  /*!< SCB CFSR (UFSR): UNDEFINSTR Position */\n#define SCB_CFSR_UNDEFINSTR_Msk           (1UL << SCB_CFSR_UNDEFINSTR_Pos)                /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */\n\n/* SCB Hard Fault Status Register Definitions */\n#define SCB_HFSR_DEBUGEVT_Pos              31U                                            /*!< SCB HFSR: DEBUGEVT Position */\n#define SCB_HFSR_DEBUGEVT_Msk              (1UL << SCB_HFSR_DEBUGEVT_Pos)                 /*!< SCB HFSR: DEBUGEVT Mask */\n\n#define SCB_HFSR_FORCED_Pos                30U                                            /*!< SCB HFSR: FORCED Position */\n#define SCB_HFSR_FORCED_Msk                (1UL << SCB_HFSR_FORCED_Pos)                   /*!< SCB HFSR: FORCED Mask */\n\n#define SCB_HFSR_VECTTBL_Pos                1U                                            /*!< SCB HFSR: VECTTBL Position */\n#define SCB_HFSR_VECTTBL_Msk               (1UL << SCB_HFSR_VECTTBL_Pos)                  /*!< SCB HFSR: VECTTBL Mask */\n\n/* SCB Debug Fault Status Register Definitions */\n#define SCB_DFSR_EXTERNAL_Pos               4U                                            /*!< SCB DFSR: EXTERNAL Position */\n#define SCB_DFSR_EXTERNAL_Msk              (1UL << SCB_DFSR_EXTERNAL_Pos)                 /*!< SCB DFSR: EXTERNAL Mask */\n\n#define SCB_DFSR_VCATCH_Pos                 3U                                            /*!< SCB DFSR: VCATCH Position */\n#define SCB_DFSR_VCATCH_Msk                (1UL << SCB_DFSR_VCATCH_Pos)                   /*!< SCB DFSR: VCATCH Mask */\n\n#define SCB_DFSR_DWTTRAP_Pos                2U                                            /*!< SCB DFSR: DWTTRAP Position */\n#define SCB_DFSR_DWTTRAP_Msk               (1UL << SCB_DFSR_DWTTRAP_Pos)                  /*!< SCB DFSR: DWTTRAP Mask */\n\n#define SCB_DFSR_BKPT_Pos                   1U                                            /*!< SCB DFSR: BKPT Position */\n#define SCB_DFSR_BKPT_Msk                  (1UL << SCB_DFSR_BKPT_Pos)                     /*!< SCB DFSR: BKPT Mask */\n\n#define SCB_DFSR_HALTED_Pos                 0U                                            /*!< SCB DFSR: HALTED Position */\n#define SCB_DFSR_HALTED_Msk                (1UL /*<< SCB_DFSR_HALTED_Pos*/)               /*!< SCB DFSR: HALTED Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)\n  \\brief    Type definitions for the System Control and ID Register not in the SCB\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control and ID Register not in the SCB.\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IM  uint32_t ICTR;                   /*!< Offset: 0x004 (R/ )  Interrupt Controller Type Register */\n        uint32_t RESERVED1[1U];\n} SCnSCB_Type;\n\n/* Interrupt Controller Type Register Definitions */\n#define SCnSCB_ICTR_INTLINESNUM_Pos         0U                                         /*!< ICTR: INTLINESNUM Position */\n#define SCnSCB_ICTR_INTLINESNUM_Msk        (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/)  /*!< ICTR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_SCnotSCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_ITM     Instrumentation Trace Macrocell (ITM)\n  \\brief    Type definitions for the Instrumentation Trace Macrocell (ITM)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Instrumentation Trace Macrocell Register (ITM).\n */\ntypedef struct\n{\n  __OM  union\n  {\n    __OM  uint8_t    u8;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit */\n    __OM  uint16_t   u16;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 16-bit */\n    __OM  uint32_t   u32;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 32-bit */\n  }  PORT [32U];                         /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers */\n        uint32_t RESERVED0[864U];\n  __IOM uint32_t TER;                    /*!< Offset: 0xE00 (R/W)  ITM Trace Enable Register */\n        uint32_t RESERVED1[15U];\n  __IOM uint32_t TPR;                    /*!< Offset: 0xE40 (R/W)  ITM Trace Privilege Register */\n        uint32_t RESERVED2[15U];\n  __IOM uint32_t TCR;                    /*!< Offset: 0xE80 (R/W)  ITM Trace Control Register */\n        uint32_t RESERVED3[29U];\n  __OM  uint32_t IWR;                    /*!< Offset: 0xEF8 ( /W)  ITM Integration Write Register */\n  __IM  uint32_t IRR;                    /*!< Offset: 0xEFC (R/ )  ITM Integration Read Register */\n  __IOM uint32_t IMCR;                   /*!< Offset: 0xF00 (R/W)  ITM Integration Mode Control Register */\n        uint32_t RESERVED4[43U];\n  __OM  uint32_t LAR;                    /*!< Offset: 0xFB0 ( /W)  ITM Lock Access Register */\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R/ )  ITM Lock Status Register */\n        uint32_t RESERVED5[6U];\n  __IM  uint32_t PID4;                   /*!< Offset: 0xFD0 (R/ )  ITM Peripheral Identification Register #4 */\n  __IM  uint32_t PID5;                   /*!< Offset: 0xFD4 (R/ )  ITM Peripheral Identification Register #5 */\n  __IM  uint32_t PID6;                   /*!< Offset: 0xFD8 (R/ )  ITM Peripheral Identification Register #6 */\n  __IM  uint32_t PID7;                   /*!< Offset: 0xFDC (R/ )  ITM Peripheral Identification Register #7 */\n  __IM  uint32_t PID0;                   /*!< Offset: 0xFE0 (R/ )  ITM Peripheral Identification Register #0 */\n  __IM  uint32_t PID1;                   /*!< Offset: 0xFE4 (R/ )  ITM Peripheral Identification Register #1 */\n  __IM  uint32_t PID2;                   /*!< Offset: 0xFE8 (R/ )  ITM Peripheral Identification Register #2 */\n  __IM  uint32_t PID3;                   /*!< Offset: 0xFEC (R/ )  ITM Peripheral Identification Register #3 */\n  __IM  uint32_t CID0;                   /*!< Offset: 0xFF0 (R/ )  ITM Component  Identification Register #0 */\n  __IM  uint32_t CID1;                   /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */\n  __IM  uint32_t CID2;                   /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */\n  __IM  uint32_t CID3;                   /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */\n} ITM_Type;\n\n/* ITM Trace Privilege Register Definitions */\n#define ITM_TPR_PRIVMASK_Pos                0U                                            /*!< ITM TPR: PRIVMASK Position */\n#define ITM_TPR_PRIVMASK_Msk               (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/)            /*!< ITM TPR: PRIVMASK Mask */\n\n/* ITM Trace Control Register Definitions */\n#define ITM_TCR_BUSY_Pos                   23U                                            /*!< ITM TCR: BUSY Position */\n#define ITM_TCR_BUSY_Msk                   (1UL << ITM_TCR_BUSY_Pos)                      /*!< ITM TCR: BUSY Mask */\n\n#define ITM_TCR_TraceBusID_Pos             16U                                            /*!< ITM TCR: ATBID Position */\n#define ITM_TCR_TraceBusID_Msk             (0x7FUL << ITM_TCR_TraceBusID_Pos)             /*!< ITM TCR: ATBID Mask */\n\n#define ITM_TCR_GTSFREQ_Pos                10U                                            /*!< ITM TCR: Global timestamp frequency Position */\n#define ITM_TCR_GTSFREQ_Msk                (3UL << ITM_TCR_GTSFREQ_Pos)                   /*!< ITM TCR: Global timestamp frequency Mask */\n\n#define ITM_TCR_TSPrescale_Pos              8U                                            /*!< ITM TCR: TSPrescale Position */\n#define ITM_TCR_TSPrescale_Msk             (3UL << ITM_TCR_TSPrescale_Pos)                /*!< ITM TCR: TSPrescale Mask */\n\n#define ITM_TCR_SWOENA_Pos                  4U                                            /*!< ITM TCR: SWOENA Position */\n#define ITM_TCR_SWOENA_Msk                 (1UL << ITM_TCR_SWOENA_Pos)                    /*!< ITM TCR: SWOENA Mask */\n\n#define ITM_TCR_DWTENA_Pos                  3U                                            /*!< ITM TCR: DWTENA Position */\n#define ITM_TCR_DWTENA_Msk                 (1UL << ITM_TCR_DWTENA_Pos)                    /*!< ITM TCR: DWTENA Mask */\n\n#define ITM_TCR_SYNCENA_Pos                 2U                                            /*!< ITM TCR: SYNCENA Position */\n#define ITM_TCR_SYNCENA_Msk                (1UL << ITM_TCR_SYNCENA_Pos)                   /*!< ITM TCR: SYNCENA Mask */\n\n#define ITM_TCR_TSENA_Pos                   1U                                            /*!< ITM TCR: TSENA Position */\n#define ITM_TCR_TSENA_Msk                  (1UL << ITM_TCR_TSENA_Pos)                     /*!< ITM TCR: TSENA Mask */\n\n#define ITM_TCR_ITMENA_Pos                  0U                                            /*!< ITM TCR: ITM Enable bit Position */\n#define ITM_TCR_ITMENA_Msk                 (1UL /*<< ITM_TCR_ITMENA_Pos*/)                /*!< ITM TCR: ITM Enable bit Mask */\n\n/* ITM Integration Write Register Definitions */\n#define ITM_IWR_ATVALIDM_Pos                0U                                            /*!< ITM IWR: ATVALIDM Position */\n#define ITM_IWR_ATVALIDM_Msk               (1UL /*<< ITM_IWR_ATVALIDM_Pos*/)              /*!< ITM IWR: ATVALIDM Mask */\n\n/* ITM Integration Read Register Definitions */\n#define ITM_IRR_ATREADYM_Pos                0U                                            /*!< ITM IRR: ATREADYM Position */\n#define ITM_IRR_ATREADYM_Msk               (1UL /*<< ITM_IRR_ATREADYM_Pos*/)              /*!< ITM IRR: ATREADYM Mask */\n\n/* ITM Integration Mode Control Register Definitions */\n#define ITM_IMCR_INTEGRATION_Pos            0U                                            /*!< ITM IMCR: INTEGRATION Position */\n#define ITM_IMCR_INTEGRATION_Msk           (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/)          /*!< ITM IMCR: INTEGRATION Mask */\n\n/* ITM Lock Status Register Definitions */\n#define ITM_LSR_ByteAcc_Pos                 2U                                            /*!< ITM LSR: ByteAcc Position */\n#define ITM_LSR_ByteAcc_Msk                (1UL << ITM_LSR_ByteAcc_Pos)                   /*!< ITM LSR: ByteAcc Mask */\n\n#define ITM_LSR_Access_Pos                  1U                                            /*!< ITM LSR: Access Position */\n#define ITM_LSR_Access_Msk                 (1UL << ITM_LSR_Access_Pos)                    /*!< ITM LSR: Access Mask */\n\n#define ITM_LSR_Present_Pos                 0U                                            /*!< ITM LSR: Present Position */\n#define ITM_LSR_Present_Msk                (1UL /*<< ITM_LSR_Present_Pos*/)               /*!< ITM LSR: Present Mask */\n\n/*@}*/ /* end of group CMSIS_ITM */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)\n  \\brief    Type definitions for the Data Watchpoint and Trace (DWT)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Data Watchpoint and Trace Register (DWT).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  Control Register */\n  __IOM uint32_t CYCCNT;                 /*!< Offset: 0x004 (R/W)  Cycle Count Register */\n  __IOM uint32_t CPICNT;                 /*!< Offset: 0x008 (R/W)  CPI Count Register */\n  __IOM uint32_t EXCCNT;                 /*!< Offset: 0x00C (R/W)  Exception Overhead Count Register */\n  __IOM uint32_t SLEEPCNT;               /*!< Offset: 0x010 (R/W)  Sleep Count Register */\n  __IOM uint32_t LSUCNT;                 /*!< Offset: 0x014 (R/W)  LSU Count Register */\n  __IOM uint32_t FOLDCNT;                /*!< Offset: 0x018 (R/W)  Folded-instruction Count Register */\n  __IM  uint32_t PCSR;                   /*!< Offset: 0x01C (R/ )  Program Counter Sample Register */\n  __IOM uint32_t COMP0;                  /*!< Offset: 0x020 (R/W)  Comparator Register 0 */\n  __IOM uint32_t MASK0;                  /*!< Offset: 0x024 (R/W)  Mask Register 0 */\n  __IOM uint32_t FUNCTION0;              /*!< Offset: 0x028 (R/W)  Function Register 0 */\n        uint32_t RESERVED0[1U];\n  __IOM uint32_t COMP1;                  /*!< Offset: 0x030 (R/W)  Comparator Register 1 */\n  __IOM uint32_t MASK1;                  /*!< Offset: 0x034 (R/W)  Mask Register 1 */\n  __IOM uint32_t FUNCTION1;              /*!< Offset: 0x038 (R/W)  Function Register 1 */\n        uint32_t RESERVED1[1U];\n  __IOM uint32_t COMP2;                  /*!< Offset: 0x040 (R/W)  Comparator Register 2 */\n  __IOM uint32_t MASK2;                  /*!< Offset: 0x044 (R/W)  Mask Register 2 */\n  __IOM uint32_t FUNCTION2;              /*!< Offset: 0x048 (R/W)  Function Register 2 */\n        uint32_t RESERVED2[1U];\n  __IOM uint32_t COMP3;                  /*!< Offset: 0x050 (R/W)  Comparator Register 3 */\n  __IOM uint32_t MASK3;                  /*!< Offset: 0x054 (R/W)  Mask Register 3 */\n  __IOM uint32_t FUNCTION3;              /*!< Offset: 0x058 (R/W)  Function Register 3 */\n} DWT_Type;\n\n/* DWT Control Register Definitions */\n#define DWT_CTRL_NUMCOMP_Pos               28U                                         /*!< DWT CTRL: NUMCOMP Position */\n#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */\n\n#define DWT_CTRL_NOTRCPKT_Pos              27U                                         /*!< DWT CTRL: NOTRCPKT Position */\n#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */\n\n#define DWT_CTRL_NOEXTTRIG_Pos             26U                                         /*!< DWT CTRL: NOEXTTRIG Position */\n#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */\n\n#define DWT_CTRL_NOCYCCNT_Pos              25U                                         /*!< DWT CTRL: NOCYCCNT Position */\n#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */\n\n#define DWT_CTRL_NOPRFCNT_Pos              24U                                         /*!< DWT CTRL: NOPRFCNT Position */\n#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */\n\n#define DWT_CTRL_CYCEVTENA_Pos             22U                                         /*!< DWT CTRL: CYCEVTENA Position */\n#define DWT_CTRL_CYCEVTENA_Msk             (0x1UL << DWT_CTRL_CYCEVTENA_Pos)           /*!< DWT CTRL: CYCEVTENA Mask */\n\n#define DWT_CTRL_FOLDEVTENA_Pos            21U                                         /*!< DWT CTRL: FOLDEVTENA Position */\n#define DWT_CTRL_FOLDEVTENA_Msk            (0x1UL << DWT_CTRL_FOLDEVTENA_Pos)          /*!< DWT CTRL: FOLDEVTENA Mask */\n\n#define DWT_CTRL_LSUEVTENA_Pos             20U                                         /*!< DWT CTRL: LSUEVTENA Position */\n#define DWT_CTRL_LSUEVTENA_Msk             (0x1UL << DWT_CTRL_LSUEVTENA_Pos)           /*!< DWT CTRL: LSUEVTENA Mask */\n\n#define DWT_CTRL_SLEEPEVTENA_Pos           19U                                         /*!< DWT CTRL: SLEEPEVTENA Position */\n#define DWT_CTRL_SLEEPEVTENA_Msk           (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos)         /*!< DWT CTRL: SLEEPEVTENA Mask */\n\n#define DWT_CTRL_EXCEVTENA_Pos             18U                                         /*!< DWT CTRL: EXCEVTENA Position */\n#define DWT_CTRL_EXCEVTENA_Msk             (0x1UL << DWT_CTRL_EXCEVTENA_Pos)           /*!< DWT CTRL: EXCEVTENA Mask */\n\n#define DWT_CTRL_CPIEVTENA_Pos             17U                                         /*!< DWT CTRL: CPIEVTENA Position */\n#define DWT_CTRL_CPIEVTENA_Msk             (0x1UL << DWT_CTRL_CPIEVTENA_Pos)           /*!< DWT CTRL: CPIEVTENA Mask */\n\n#define DWT_CTRL_EXCTRCENA_Pos             16U                                         /*!< DWT CTRL: EXCTRCENA Position */\n#define DWT_CTRL_EXCTRCENA_Msk             (0x1UL << DWT_CTRL_EXCTRCENA_Pos)           /*!< DWT CTRL: EXCTRCENA Mask */\n\n#define DWT_CTRL_PCSAMPLENA_Pos            12U                                         /*!< DWT CTRL: PCSAMPLENA Position */\n#define DWT_CTRL_PCSAMPLENA_Msk            (0x1UL << DWT_CTRL_PCSAMPLENA_Pos)          /*!< DWT CTRL: PCSAMPLENA Mask */\n\n#define DWT_CTRL_SYNCTAP_Pos               10U                                         /*!< DWT CTRL: SYNCTAP Position */\n#define DWT_CTRL_SYNCTAP_Msk               (0x3UL << DWT_CTRL_SYNCTAP_Pos)             /*!< DWT CTRL: SYNCTAP Mask */\n\n#define DWT_CTRL_CYCTAP_Pos                 9U                                         /*!< DWT CTRL: CYCTAP Position */\n#define DWT_CTRL_CYCTAP_Msk                (0x1UL << DWT_CTRL_CYCTAP_Pos)              /*!< DWT CTRL: CYCTAP Mask */\n\n#define DWT_CTRL_POSTINIT_Pos               5U                                         /*!< DWT CTRL: POSTINIT Position */\n#define DWT_CTRL_POSTINIT_Msk              (0xFUL << DWT_CTRL_POSTINIT_Pos)            /*!< DWT CTRL: POSTINIT Mask */\n\n#define DWT_CTRL_POSTPRESET_Pos             1U                                         /*!< DWT CTRL: POSTPRESET Position */\n#define DWT_CTRL_POSTPRESET_Msk            (0xFUL << DWT_CTRL_POSTPRESET_Pos)          /*!< DWT CTRL: POSTPRESET Mask */\n\n#define DWT_CTRL_CYCCNTENA_Pos              0U                                         /*!< DWT CTRL: CYCCNTENA Position */\n#define DWT_CTRL_CYCCNTENA_Msk             (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/)       /*!< DWT CTRL: CYCCNTENA Mask */\n\n/* DWT CPI Count Register Definitions */\n#define DWT_CPICNT_CPICNT_Pos               0U                                         /*!< DWT CPICNT: CPICNT Position */\n#define DWT_CPICNT_CPICNT_Msk              (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/)       /*!< DWT CPICNT: CPICNT Mask */\n\n/* DWT Exception Overhead Count Register Definitions */\n#define DWT_EXCCNT_EXCCNT_Pos               0U                                         /*!< DWT EXCCNT: EXCCNT Position */\n#define DWT_EXCCNT_EXCCNT_Msk              (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/)       /*!< DWT EXCCNT: EXCCNT Mask */\n\n/* DWT Sleep Count Register Definitions */\n#define DWT_SLEEPCNT_SLEEPCNT_Pos           0U                                         /*!< DWT SLEEPCNT: SLEEPCNT Position */\n#define DWT_SLEEPCNT_SLEEPCNT_Msk          (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/)   /*!< DWT SLEEPCNT: SLEEPCNT Mask */\n\n/* DWT LSU Count Register Definitions */\n#define DWT_LSUCNT_LSUCNT_Pos               0U                                         /*!< DWT LSUCNT: LSUCNT Position */\n#define DWT_LSUCNT_LSUCNT_Msk              (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/)       /*!< DWT LSUCNT: LSUCNT Mask */\n\n/* DWT Folded-instruction Count Register Definitions */\n#define DWT_FOLDCNT_FOLDCNT_Pos             0U                                         /*!< DWT FOLDCNT: FOLDCNT Position */\n#define DWT_FOLDCNT_FOLDCNT_Msk            (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/)     /*!< DWT FOLDCNT: FOLDCNT Mask */\n\n/* DWT Comparator Mask Register Definitions */\n#define DWT_MASK_MASK_Pos                   0U                                         /*!< DWT MASK: MASK Position */\n#define DWT_MASK_MASK_Msk                  (0x1FUL /*<< DWT_MASK_MASK_Pos*/)           /*!< DWT MASK: MASK Mask */\n\n/* DWT Comparator Function Register Definitions */\n#define DWT_FUNCTION_MATCHED_Pos           24U                                         /*!< DWT FUNCTION: MATCHED Position */\n#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */\n\n#define DWT_FUNCTION_DATAVADDR1_Pos        16U                                         /*!< DWT FUNCTION: DATAVADDR1 Position */\n#define DWT_FUNCTION_DATAVADDR1_Msk        (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos)      /*!< DWT FUNCTION: DATAVADDR1 Mask */\n\n#define DWT_FUNCTION_DATAVADDR0_Pos        12U                                         /*!< DWT FUNCTION: DATAVADDR0 Position */\n#define DWT_FUNCTION_DATAVADDR0_Msk        (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos)      /*!< DWT FUNCTION: DATAVADDR0 Mask */\n\n#define DWT_FUNCTION_DATAVSIZE_Pos         10U                                         /*!< DWT FUNCTION: DATAVSIZE Position */\n#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */\n\n#define DWT_FUNCTION_LNK1ENA_Pos            9U                                         /*!< DWT FUNCTION: LNK1ENA Position */\n#define DWT_FUNCTION_LNK1ENA_Msk           (0x1UL << DWT_FUNCTION_LNK1ENA_Pos)         /*!< DWT FUNCTION: LNK1ENA Mask */\n\n#define DWT_FUNCTION_DATAVMATCH_Pos         8U                                         /*!< DWT FUNCTION: DATAVMATCH Position */\n#define DWT_FUNCTION_DATAVMATCH_Msk        (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos)      /*!< DWT FUNCTION: DATAVMATCH Mask */\n\n#define DWT_FUNCTION_CYCMATCH_Pos           7U                                         /*!< DWT FUNCTION: CYCMATCH Position */\n#define DWT_FUNCTION_CYCMATCH_Msk          (0x1UL << DWT_FUNCTION_CYCMATCH_Pos)        /*!< DWT FUNCTION: CYCMATCH Mask */\n\n#define DWT_FUNCTION_EMITRANGE_Pos          5U                                         /*!< DWT FUNCTION: EMITRANGE Position */\n#define DWT_FUNCTION_EMITRANGE_Msk         (0x1UL << DWT_FUNCTION_EMITRANGE_Pos)       /*!< DWT FUNCTION: EMITRANGE Mask */\n\n#define DWT_FUNCTION_FUNCTION_Pos           0U                                         /*!< DWT FUNCTION: FUNCTION Position */\n#define DWT_FUNCTION_FUNCTION_Msk          (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/)    /*!< DWT FUNCTION: FUNCTION Mask */\n\n/*@}*/ /* end of group CMSIS_DWT */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_TPI     Trace Port Interface (TPI)\n  \\brief    Type definitions for the Trace Port Interface (TPI)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Trace Port Interface Register (TPI).\n */\ntypedef struct\n{\n  __IOM uint32_t SSPSR;                  /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register */\n  __IOM uint32_t CSPSR;                  /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */\n        uint32_t RESERVED0[2U];\n  __IOM uint32_t ACPR;                   /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */\n        uint32_t RESERVED1[55U];\n  __IOM uint32_t SPPR;                   /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */\n        uint32_t RESERVED2[131U];\n  __IM  uint32_t FFSR;                   /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */\n  __IOM uint32_t FFCR;                   /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */\n  __IM  uint32_t FSCR;                   /*!< Offset: 0x308 (R/ )  Formatter Synchronization Counter Register */\n        uint32_t RESERVED3[759U];\n  __IM  uint32_t TRIGGER;                /*!< Offset: 0xEE8 (R/ )  TRIGGER */\n  __IM  uint32_t FIFO0;                  /*!< Offset: 0xEEC (R/ )  Integration ETM Data */\n  __IM  uint32_t ITATBCTR2;              /*!< Offset: 0xEF0 (R/ )  ITATBCTR2 */\n        uint32_t RESERVED4[1U];\n  __IM  uint32_t ITATBCTR0;              /*!< Offset: 0xEF8 (R/ )  ITATBCTR0 */\n  __IM  uint32_t FIFO1;                  /*!< Offset: 0xEFC (R/ )  Integration ITM Data */\n  __IOM uint32_t ITCTRL;                 /*!< Offset: 0xF00 (R/W)  Integration Mode Control */\n        uint32_t RESERVED5[39U];\n  __IOM uint32_t CLAIMSET;               /*!< Offset: 0xFA0 (R/W)  Claim tag set */\n  __IOM uint32_t CLAIMCLR;               /*!< Offset: 0xFA4 (R/W)  Claim tag clear */\n        uint32_t RESERVED7[8U];\n  __IM  uint32_t DEVID;                  /*!< Offset: 0xFC8 (R/ )  TPIU_DEVID */\n  __IM  uint32_t DEVTYPE;                /*!< Offset: 0xFCC (R/ )  TPIU_DEVTYPE */\n} TPI_Type;\n\n/* TPI Asynchronous Clock Prescaler Register Definitions */\n#define TPI_ACPR_PRESCALER_Pos              0U                                         /*!< TPI ACPR: PRESCALER Position */\n#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/)    /*!< TPI ACPR: PRESCALER Mask */\n\n/* TPI Selected Pin Protocol Register Definitions */\n#define TPI_SPPR_TXMODE_Pos                 0U                                         /*!< TPI SPPR: TXMODE Position */\n#define TPI_SPPR_TXMODE_Msk                (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/)          /*!< TPI SPPR: TXMODE Mask */\n\n/* TPI Formatter and Flush Status Register Definitions */\n#define TPI_FFSR_FtNonStop_Pos              3U                                         /*!< TPI FFSR: FtNonStop Position */\n#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */\n\n#define TPI_FFSR_TCPresent_Pos              2U                                         /*!< TPI FFSR: TCPresent Position */\n#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */\n\n#define TPI_FFSR_FtStopped_Pos              1U                                         /*!< TPI FFSR: FtStopped Position */\n#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */\n\n#define TPI_FFSR_FlInProg_Pos               0U                                         /*!< TPI FFSR: FlInProg Position */\n#define TPI_FFSR_FlInProg_Msk              (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/)        /*!< TPI FFSR: FlInProg Mask */\n\n/* TPI Formatter and Flush Control Register Definitions */\n#define TPI_FFCR_TrigIn_Pos                 8U                                         /*!< TPI FFCR: TrigIn Position */\n#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */\n\n#define TPI_FFCR_EnFCont_Pos                1U                                         /*!< TPI FFCR: EnFCont Position */\n#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */\n\n/* TPI TRIGGER Register Definitions */\n#define TPI_TRIGGER_TRIGGER_Pos             0U                                         /*!< TPI TRIGGER: TRIGGER Position */\n#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/)      /*!< TPI TRIGGER: TRIGGER Mask */\n\n/* TPI Integration ETM Data Register Definitions (FIFO0) */\n#define TPI_FIFO0_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO0: ITM_ATVALID Position */\n#define TPI_FIFO0_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos)        /*!< TPI FIFO0: ITM_ATVALID Mask */\n\n#define TPI_FIFO0_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO0: ITM_bytecount Position */\n#define TPI_FIFO0_ITM_bytecount_Msk        (0x3UL << TPI_FIFO0_ITM_bytecount_Pos)      /*!< TPI FIFO0: ITM_bytecount Mask */\n\n#define TPI_FIFO0_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO0: ETM_ATVALID Position */\n#define TPI_FIFO0_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos)        /*!< TPI FIFO0: ETM_ATVALID Mask */\n\n#define TPI_FIFO0_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO0: ETM_bytecount Position */\n#define TPI_FIFO0_ETM_bytecount_Msk        (0x3UL << TPI_FIFO0_ETM_bytecount_Pos)      /*!< TPI FIFO0: ETM_bytecount Mask */\n\n#define TPI_FIFO0_ETM2_Pos                 16U                                         /*!< TPI FIFO0: ETM2 Position */\n#define TPI_FIFO0_ETM2_Msk                 (0xFFUL << TPI_FIFO0_ETM2_Pos)              /*!< TPI FIFO0: ETM2 Mask */\n\n#define TPI_FIFO0_ETM1_Pos                  8U                                         /*!< TPI FIFO0: ETM1 Position */\n#define TPI_FIFO0_ETM1_Msk                 (0xFFUL << TPI_FIFO0_ETM1_Pos)              /*!< TPI FIFO0: ETM1 Mask */\n\n#define TPI_FIFO0_ETM0_Pos                  0U                                         /*!< TPI FIFO0: ETM0 Position */\n#define TPI_FIFO0_ETM0_Msk                 (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/)          /*!< TPI FIFO0: ETM0 Mask */\n\n/* TPI ITATBCTR2 Register Definitions */\n#define TPI_ITATBCTR2_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR2: ATREADY Position */\n#define TPI_ITATBCTR2_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/)    /*!< TPI ITATBCTR2: ATREADY Mask */\n\n/* TPI Integration ITM Data Register Definitions (FIFO1) */\n#define TPI_FIFO1_ITM_ATVALID_Pos          29U                                         /*!< TPI FIFO1: ITM_ATVALID Position */\n#define TPI_FIFO1_ITM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos)        /*!< TPI FIFO1: ITM_ATVALID Mask */\n\n#define TPI_FIFO1_ITM_bytecount_Pos        27U                                         /*!< TPI FIFO1: ITM_bytecount Position */\n#define TPI_FIFO1_ITM_bytecount_Msk        (0x3UL << TPI_FIFO1_ITM_bytecount_Pos)      /*!< TPI FIFO1: ITM_bytecount Mask */\n\n#define TPI_FIFO1_ETM_ATVALID_Pos          26U                                         /*!< TPI FIFO1: ETM_ATVALID Position */\n#define TPI_FIFO1_ETM_ATVALID_Msk          (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos)        /*!< TPI FIFO1: ETM_ATVALID Mask */\n\n#define TPI_FIFO1_ETM_bytecount_Pos        24U                                         /*!< TPI FIFO1: ETM_bytecount Position */\n#define TPI_FIFO1_ETM_bytecount_Msk        (0x3UL << TPI_FIFO1_ETM_bytecount_Pos)      /*!< TPI FIFO1: ETM_bytecount Mask */\n\n#define TPI_FIFO1_ITM2_Pos                 16U                                         /*!< TPI FIFO1: ITM2 Position */\n#define TPI_FIFO1_ITM2_Msk                 (0xFFUL << TPI_FIFO1_ITM2_Pos)              /*!< TPI FIFO1: ITM2 Mask */\n\n#define TPI_FIFO1_ITM1_Pos                  8U                                         /*!< TPI FIFO1: ITM1 Position */\n#define TPI_FIFO1_ITM1_Msk                 (0xFFUL << TPI_FIFO1_ITM1_Pos)              /*!< TPI FIFO1: ITM1 Mask */\n\n#define TPI_FIFO1_ITM0_Pos                  0U                                         /*!< TPI FIFO1: ITM0 Position */\n#define TPI_FIFO1_ITM0_Msk                 (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/)          /*!< TPI FIFO1: ITM0 Mask */\n\n/* TPI ITATBCTR0 Register Definitions */\n#define TPI_ITATBCTR0_ATREADY_Pos           0U                                         /*!< TPI ITATBCTR0: ATREADY Position */\n#define TPI_ITATBCTR0_ATREADY_Msk          (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/)    /*!< TPI ITATBCTR0: ATREADY Mask */\n\n/* TPI Integration Mode Control Register Definitions */\n#define TPI_ITCTRL_Mode_Pos                 0U                                         /*!< TPI ITCTRL: Mode Position */\n#define TPI_ITCTRL_Mode_Msk                (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/)          /*!< TPI ITCTRL: Mode Mask */\n\n/* TPI DEVID Register Definitions */\n#define TPI_DEVID_NRZVALID_Pos             11U                                         /*!< TPI DEVID: NRZVALID Position */\n#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */\n\n#define TPI_DEVID_MANCVALID_Pos            10U                                         /*!< TPI DEVID: MANCVALID Position */\n#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */\n\n#define TPI_DEVID_PTINVALID_Pos             9U                                         /*!< TPI DEVID: PTINVALID Position */\n#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */\n\n#define TPI_DEVID_MinBufSz_Pos              6U                                         /*!< TPI DEVID: MinBufSz Position */\n#define TPI_DEVID_MinBufSz_Msk             (0x7UL << TPI_DEVID_MinBufSz_Pos)           /*!< TPI DEVID: MinBufSz Mask */\n\n#define TPI_DEVID_AsynClkIn_Pos             5U                                         /*!< TPI DEVID: AsynClkIn Position */\n#define TPI_DEVID_AsynClkIn_Msk            (0x1UL << TPI_DEVID_AsynClkIn_Pos)          /*!< TPI DEVID: AsynClkIn Mask */\n\n#define TPI_DEVID_NrTraceInput_Pos          0U                                         /*!< TPI DEVID: NrTraceInput Position */\n#define TPI_DEVID_NrTraceInput_Msk         (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/)  /*!< TPI DEVID: NrTraceInput Mask */\n\n/* TPI DEVTYPE Register Definitions */\n#define TPI_DEVTYPE_MajorType_Pos           4U                                         /*!< TPI DEVTYPE: MajorType Position */\n#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */\n\n#define TPI_DEVTYPE_SubType_Pos             0U                                         /*!< TPI DEVTYPE: SubType Position */\n#define TPI_DEVTYPE_SubType_Msk            (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/)      /*!< TPI DEVTYPE: SubType Mask */\n\n/*@}*/ /* end of group CMSIS_TPI */\n\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RASR;                   /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A1;                /*!< Offset: 0x014 (R/W)  MPU Alias 1 Region Base Address Register */\n  __IOM uint32_t RASR_A1;                /*!< Offset: 0x018 (R/W)  MPU Alias 1 Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A2;                /*!< Offset: 0x01C (R/W)  MPU Alias 2 Region Base Address Register */\n  __IOM uint32_t RASR_A2;                /*!< Offset: 0x020 (R/W)  MPU Alias 2 Region Attribute and Size Register */\n  __IOM uint32_t RBAR_A3;                /*!< Offset: 0x024 (R/W)  MPU Alias 3 Region Base Address Register */\n  __IOM uint32_t RASR_A3;                /*!< Offset: 0x028 (R/W)  MPU Alias 3 Region Attribute and Size Register */\n} MPU_Type;\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_ADDR_Pos                   5U                                            /*!< MPU RBAR: ADDR Position */\n#define MPU_RBAR_ADDR_Msk                  (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos)             /*!< MPU RBAR: ADDR Mask */\n\n#define MPU_RBAR_VALID_Pos                  4U                                            /*!< MPU RBAR: VALID Position */\n#define MPU_RBAR_VALID_Msk                 (1UL << MPU_RBAR_VALID_Pos)                    /*!< MPU RBAR: VALID Mask */\n\n#define MPU_RBAR_REGION_Pos                 0U                                            /*!< MPU RBAR: REGION Position */\n#define MPU_RBAR_REGION_Msk                (0xFUL /*<< MPU_RBAR_REGION_Pos*/)             /*!< MPU RBAR: REGION Mask */\n\n/* MPU Region Attribute and Size Register Definitions */\n#define MPU_RASR_ATTRS_Pos                 16U                                            /*!< MPU RASR: MPU Region Attribute field Position */\n#define MPU_RASR_ATTRS_Msk                 (0xFFFFUL << MPU_RASR_ATTRS_Pos)               /*!< MPU RASR: MPU Region Attribute field Mask */\n\n#define MPU_RASR_XN_Pos                    28U                                            /*!< MPU RASR: ATTRS.XN Position */\n#define MPU_RASR_XN_Msk                    (1UL << MPU_RASR_XN_Pos)                       /*!< MPU RASR: ATTRS.XN Mask */\n\n#define MPU_RASR_AP_Pos                    24U                                            /*!< MPU RASR: ATTRS.AP Position */\n#define MPU_RASR_AP_Msk                    (0x7UL << MPU_RASR_AP_Pos)                     /*!< MPU RASR: ATTRS.AP Mask */\n\n#define MPU_RASR_TEX_Pos                   19U                                            /*!< MPU RASR: ATTRS.TEX Position */\n#define MPU_RASR_TEX_Msk                   (0x7UL << MPU_RASR_TEX_Pos)                    /*!< MPU RASR: ATTRS.TEX Mask */\n\n#define MPU_RASR_S_Pos                     18U                                            /*!< MPU RASR: ATTRS.S Position */\n#define MPU_RASR_S_Msk                     (1UL << MPU_RASR_S_Pos)                        /*!< MPU RASR: ATTRS.S Mask */\n\n#define MPU_RASR_C_Pos                     17U                                            /*!< MPU RASR: ATTRS.C Position */\n#define MPU_RASR_C_Msk                     (1UL << MPU_RASR_C_Pos)                        /*!< MPU RASR: ATTRS.C Mask */\n\n#define MPU_RASR_B_Pos                     16U                                            /*!< MPU RASR: ATTRS.B Position */\n#define MPU_RASR_B_Msk                     (1UL << MPU_RASR_B_Pos)                        /*!< MPU RASR: ATTRS.B Mask */\n\n#define MPU_RASR_SRD_Pos                    8U                                            /*!< MPU RASR: Sub-Region Disable Position */\n#define MPU_RASR_SRD_Msk                   (0xFFUL << MPU_RASR_SRD_Pos)                   /*!< MPU RASR: Sub-Region Disable Mask */\n\n#define MPU_RASR_SIZE_Pos                   1U                                            /*!< MPU RASR: Region Size Field Position */\n#define MPU_RASR_SIZE_Msk                  (0x1FUL << MPU_RASR_SIZE_Pos)                  /*!< MPU RASR: Region Size Field Mask */\n\n#define MPU_RASR_ENABLE_Pos                 0U                                            /*!< MPU RASR: Region enable bit Position */\n#define MPU_RASR_ENABLE_Msk                (1UL /*<< MPU_RASR_ENABLE_Pos*/)               /*!< MPU RASR: Region enable bit Disable Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Type definitions for the Core Debug Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Core Debug Register (CoreDebug).\n */\ntypedef struct\n{\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\n} CoreDebug_Type;\n\n/* Debug Halting Control and Status Register Definitions */\n#define CoreDebug_DHCSR_DBGKEY_Pos         16U                                            /*!< CoreDebug DHCSR: DBGKEY Position */\n#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< CoreDebug DHCSR: DBGKEY Mask */\n\n#define CoreDebug_DHCSR_S_RESET_ST_Pos     25U                                            /*!< CoreDebug DHCSR: S_RESET_ST Position */\n#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< CoreDebug DHCSR: S_RESET_ST Mask */\n\n#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24U                                            /*!< CoreDebug DHCSR: S_RETIRE_ST Position */\n#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */\n\n#define CoreDebug_DHCSR_S_LOCKUP_Pos       19U                                            /*!< CoreDebug DHCSR: S_LOCKUP Position */\n#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< CoreDebug DHCSR: S_LOCKUP Mask */\n\n#define CoreDebug_DHCSR_S_SLEEP_Pos        18U                                            /*!< CoreDebug DHCSR: S_SLEEP Position */\n#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< CoreDebug DHCSR: S_SLEEP Mask */\n\n#define CoreDebug_DHCSR_S_HALT_Pos         17U                                            /*!< CoreDebug DHCSR: S_HALT Position */\n#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< CoreDebug DHCSR: S_HALT Mask */\n\n#define CoreDebug_DHCSR_S_REGRDY_Pos       16U                                            /*!< CoreDebug DHCSR: S_REGRDY Position */\n#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< CoreDebug DHCSR: S_REGRDY Mask */\n\n#define CoreDebug_DHCSR_C_SNAPSTALL_Pos     5U                                            /*!< CoreDebug DHCSR: C_SNAPSTALL Position */\n#define CoreDebug_DHCSR_C_SNAPSTALL_Msk    (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos)       /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */\n\n#define CoreDebug_DHCSR_C_MASKINTS_Pos      3U                                            /*!< CoreDebug DHCSR: C_MASKINTS Position */\n#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< CoreDebug DHCSR: C_MASKINTS Mask */\n\n#define CoreDebug_DHCSR_C_STEP_Pos          2U                                            /*!< CoreDebug DHCSR: C_STEP Position */\n#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< CoreDebug DHCSR: C_STEP Mask */\n\n#define CoreDebug_DHCSR_C_HALT_Pos          1U                                            /*!< CoreDebug DHCSR: C_HALT Position */\n#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< CoreDebug DHCSR: C_HALT Mask */\n\n#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0U                                            /*!< CoreDebug DHCSR: C_DEBUGEN Position */\n#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/)     /*!< CoreDebug DHCSR: C_DEBUGEN Mask */\n\n/* Debug Core Register Selector Register Definitions */\n#define CoreDebug_DCRSR_REGWnR_Pos         16U                                            /*!< CoreDebug DCRSR: REGWnR Position */\n#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< CoreDebug DCRSR: REGWnR Mask */\n\n#define CoreDebug_DCRSR_REGSEL_Pos          0U                                            /*!< CoreDebug DCRSR: REGSEL Position */\n#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/)     /*!< CoreDebug DCRSR: REGSEL Mask */\n\n/* Debug Exception and Monitor Control Register Definitions */\n#define CoreDebug_DEMCR_TRCENA_Pos         24U                                            /*!< CoreDebug DEMCR: TRCENA Position */\n#define CoreDebug_DEMCR_TRCENA_Msk         (1UL << CoreDebug_DEMCR_TRCENA_Pos)            /*!< CoreDebug DEMCR: TRCENA Mask */\n\n#define CoreDebug_DEMCR_MON_REQ_Pos        19U                                            /*!< CoreDebug DEMCR: MON_REQ Position */\n#define CoreDebug_DEMCR_MON_REQ_Msk        (1UL << CoreDebug_DEMCR_MON_REQ_Pos)           /*!< CoreDebug DEMCR: MON_REQ Mask */\n\n#define CoreDebug_DEMCR_MON_STEP_Pos       18U                                            /*!< CoreDebug DEMCR: MON_STEP Position */\n#define CoreDebug_DEMCR_MON_STEP_Msk       (1UL << CoreDebug_DEMCR_MON_STEP_Pos)          /*!< CoreDebug DEMCR: MON_STEP Mask */\n\n#define CoreDebug_DEMCR_MON_PEND_Pos       17U                                            /*!< CoreDebug DEMCR: MON_PEND Position */\n#define CoreDebug_DEMCR_MON_PEND_Msk       (1UL << CoreDebug_DEMCR_MON_PEND_Pos)          /*!< CoreDebug DEMCR: MON_PEND Mask */\n\n#define CoreDebug_DEMCR_MON_EN_Pos         16U                                            /*!< CoreDebug DEMCR: MON_EN Position */\n#define CoreDebug_DEMCR_MON_EN_Msk         (1UL << CoreDebug_DEMCR_MON_EN_Pos)            /*!< CoreDebug DEMCR: MON_EN Mask */\n\n#define CoreDebug_DEMCR_VC_HARDERR_Pos     10U                                            /*!< CoreDebug DEMCR: VC_HARDERR Position */\n#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< CoreDebug DEMCR: VC_HARDERR Mask */\n\n#define CoreDebug_DEMCR_VC_INTERR_Pos       9U                                            /*!< CoreDebug DEMCR: VC_INTERR Position */\n#define CoreDebug_DEMCR_VC_INTERR_Msk      (1UL << CoreDebug_DEMCR_VC_INTERR_Pos)         /*!< CoreDebug DEMCR: VC_INTERR Mask */\n\n#define CoreDebug_DEMCR_VC_BUSERR_Pos       8U                                            /*!< CoreDebug DEMCR: VC_BUSERR Position */\n#define CoreDebug_DEMCR_VC_BUSERR_Msk      (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos)         /*!< CoreDebug DEMCR: VC_BUSERR Mask */\n\n#define CoreDebug_DEMCR_VC_STATERR_Pos      7U                                            /*!< CoreDebug DEMCR: VC_STATERR Position */\n#define CoreDebug_DEMCR_VC_STATERR_Msk     (1UL << CoreDebug_DEMCR_VC_STATERR_Pos)        /*!< CoreDebug DEMCR: VC_STATERR Mask */\n\n#define CoreDebug_DEMCR_VC_CHKERR_Pos       6U                                            /*!< CoreDebug DEMCR: VC_CHKERR Position */\n#define CoreDebug_DEMCR_VC_CHKERR_Msk      (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos)         /*!< CoreDebug DEMCR: VC_CHKERR Mask */\n\n#define CoreDebug_DEMCR_VC_NOCPERR_Pos      5U                                            /*!< CoreDebug DEMCR: VC_NOCPERR Position */\n#define CoreDebug_DEMCR_VC_NOCPERR_Msk     (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos)        /*!< CoreDebug DEMCR: VC_NOCPERR Mask */\n\n#define CoreDebug_DEMCR_VC_MMERR_Pos        4U                                            /*!< CoreDebug DEMCR: VC_MMERR Position */\n#define CoreDebug_DEMCR_VC_MMERR_Msk       (1UL << CoreDebug_DEMCR_VC_MMERR_Pos)          /*!< CoreDebug DEMCR: VC_MMERR Mask */\n\n#define CoreDebug_DEMCR_VC_CORERESET_Pos    0U                                            /*!< CoreDebug DEMCR: VC_CORERESET Position */\n#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/)  /*!< CoreDebug DEMCR: VC_CORERESET Mask */\n\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */\n#define ITM_BASE            (0xE0000000UL)                            /*!< ITM Base Address */\n#define DWT_BASE            (0xE0001000UL)                            /*!< DWT Base Address */\n#define TPI_BASE            (0xE0040000UL)                            /*!< TPI Base Address */\n#define CoreDebug_BASE      (0xE000EDF0UL)                            /*!< Core Debug Base Address */\n#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */\n#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */\n#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */\n\n#define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE      )   /*!< System control Register not in SCB */\n#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */\n#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */\n#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */\n#define ITM                 ((ITM_Type       *)     ITM_BASE      )   /*!< ITM configuration struct */\n#define DWT                 ((DWT_Type       *)     DWT_BASE      )   /*!< DWT configuration struct */\n#define TPI                 ((TPI_Type       *)     TPI_BASE      )   /*!< TPI configuration struct */\n#define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE)   /*!< Core Debug configuration struct */\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit */\n  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit */\n#endif\n\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Debug Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifndef CMSIS_NVIC_VIRTUAL\n  #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping\n  #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n  #define NVIC_GetActive              __NVIC_GetActive\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifndef CMSIS_VECTAB_VIRTUAL\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n\n/**\n  \\brief   Set Priority Grouping\n  \\details Sets the priority grouping field using the required unlock sequence.\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\n           Only values from 0..7 are used.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]      PriorityGroup  Priority grouping field.\n */\n__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)\n{\n  uint32_t reg_value;\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\n\n  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */\n  reg_value  =  (reg_value                                   |\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                (PriorityGroupTmp << 8U)                      );              /* Insert write key and priorty group */\n  SCB->AIRCR =  reg_value;\n}\n\n\n/**\n  \\brief   Get Priority Grouping\n  \\details Reads the priority grouping field from the NVIC Interrupt Controller.\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void)\n{\n  return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\n}\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt\n  \\details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IP[((uint32_t)(int32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n  else\n  {\n    SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Encode Priority\n  \\details Encodes the priority for an interrupt with the given priority group,\n           preemptive priority value, and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [in]   PreemptPriority  Preemptive priority value (starting from 0).\n  \\param [in]       SubPriority  Subpriority value (starting from 0).\n  \\return                        Encoded priority. Value can be used in the function \\ref NVIC_SetPriority().\n */\n__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  return (\n           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |\n           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))\n         );\n}\n\n\n/**\n  \\brief   Decode Priority\n  \\details Decodes an interrupt priority value with a given priority group to\n           preemptive priority value and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.\n  \\param [in]         Priority   Priority value, which can be retrieved with the function \\ref NVIC_GetPriority().\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [out] pPreemptPriority  Preemptive priority value (starting from 0).\n  \\param [out]     pSubPriority  Subpriority value (starting from 0).\n */\n__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);\n  *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL);\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__STATIC_INLINE void NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |\n                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |\n                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n    return 0U;           /* No FPU */\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n/* ##################################### Debug In/Output function ########################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_core_DebugFunctions ITM Functions\n  \\brief    Functions that access the ITM debug interface.\n  @{\n */\n\nextern volatile int32_t ITM_RxBuffer;                              /*!< External variable to receive characters. */\n#define                 ITM_RXBUFFER_EMPTY  ((int32_t)0x5AA55AA5U) /*!< Value identifying \\ref ITM_RxBuffer is ready for next character. */\n\n\n/**\n  \\brief   ITM Send Character\n  \\details Transmits a character via the ITM channel 0, and\n           \\li Just returns when no debugger is connected that has booked the output.\n           \\li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.\n  \\param [in]     ch  Character to transmit.\n  \\returns            Character to transmit.\n */\n__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)\n{\n  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */\n      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */\n  {\n    while (ITM->PORT[0U].u32 == 0UL)\n    {\n      __NOP();\n    }\n    ITM->PORT[0U].u8 = (uint8_t)ch;\n  }\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Receive Character\n  \\details Inputs a character via the external variable \\ref ITM_RxBuffer.\n  \\return             Received character.\n  \\return         -1  No character pending.\n */\n__STATIC_INLINE int32_t ITM_ReceiveChar (void)\n{\n  int32_t ch = -1;                           /* no character available */\n\n  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY)\n  {\n    ch = ITM_RxBuffer;\n    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */\n  }\n\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Check Character\n  \\details Checks whether a character is pending for reading in the variable \\ref ITM_RxBuffer.\n  \\return          0  No character available.\n  \\return          1  Character available.\n */\n__STATIC_INLINE int32_t ITM_CheckChar (void)\n{\n\n  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY)\n  {\n    return (0);                              /* no character available */\n  }\n  else\n  {\n    return (1);                              /*    character available */\n  }\n}\n\n/*@} end of CMSIS_core_DebugFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_SC300_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "Huawei_LiteOS/arch/arm/common/cmsis/tz_context.h",
    "content": "/*\n * Copyright (c) 2015-2016 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * ----------------------------------------------------------------------------\n *\n * $Date:        21. September 2016\n * $Revision:    V1.0\n *\n * Project:      TrustZone for ARMv8-M\n * Title:        Context Management for ARMv8-M TrustZone\n *\n * Version 1.0\n *    Initial Release\n *---------------------------------------------------------------------------*/\n\n#ifndef TZ_CONTEXT_H\n#define TZ_CONTEXT_H\n\n#include <stdint.h>\n\n#ifndef TZ_MODULEID_T\n#define TZ_MODULEID_T\n/// \\details Data type that identifies secure software modules called by a process.\ntypedef uint32_t TZ_ModuleId_t;\n#endif\n\n/// \\details TZ Memory ID identifies an allocated memory slot.\ntypedef uint32_t TZ_MemoryId_t;\n\n/// Initialize secure context memory system\n/// \\return execution status (1: success, 0: error)\nuint32_t TZ_InitContextSystem_S (void);\n\n/// Allocate context memory for calling secure software modules in TrustZone\n/// \\param[in]  module   identifies software modules called from non-secure mode\n/// \\return value != 0 id TrustZone memory slot identifier\n/// \\return value 0    no memory available or internal error\nTZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module);\n\n/// Free context memory that was previously allocated with \\ref TZ_AllocModuleContext_S\n/// \\param[in]  id  TrustZone memory slot identifier\n/// \\return execution status (1: success, 0: error)\nuint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id);\n\n/// Load secure context (called on RTOS thread context switch)\n/// \\param[in]  id  TrustZone memory slot identifier\n/// \\return execution status (1: success, 0: error)\nuint32_t TZ_LoadContext_S (TZ_MemoryId_t id);\n\n/// Store secure context (called on RTOS thread context switch)\n/// \\param[in]  id  TrustZone memory slot identifier\n/// \\return execution status (1: success, 0: error)\nuint32_t TZ_StoreContext_S (TZ_MemoryId_t id);\n\n#endif  // TZ_CONTEXT_H\n"
  },
  {
    "path": "Huawei_LiteOS/arch/msp430/include/los_hw.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n /**@defgroup los_hw hardware\n   *@ingroup kernel\n */\n\n#ifndef _LOS_HW_H\n#define _LOS_HW_H\n\n#include \"los_base.h\"\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n/**\n * @ingroup los_hw\n * The initialization value of stack space.\n */\n#define EMPTY_STACK                 0xCACA\n\n\n/**\n * @ingroup los_hw\n * Check task schedule.\n */\n#define LOS_CHECK_SCHEDULE          ((!g_usLosTaskLock))\n\n/**\n * @ingroup los_hw\n * Define the type of a task context control block.\n */\n\ntypedef struct tagTskContext\n{\n#if (__CODE_MODEL__ != __CODE_MODEL_LARGE__) && \\\n    (__DATA_MODEL__ != __DATA_MODEL_LARGE__)\n    unsigned int  r4;\n    unsigned int  r5;\n    unsigned int  r6;\n    unsigned int  r7;\n    unsigned int  r8;\n    unsigned int  r9;\n    unsigned int  r10;\n    unsigned int  r11;\n    unsigned int  r12;\n    unsigned int  r13;\n    unsigned int  r14;\n    unsigned int  r15;\n#else\n    unsigned long r4;\n    unsigned long r5;\n    unsigned long r6;\n    unsigned long r7;\n    unsigned long r8;\n    unsigned long r9;\n    unsigned long r10;\n    unsigned long r11;\n    unsigned long r12;\n    unsigned long r13;\n    unsigned long r14;\n    unsigned long r15;\n#endif\n    unsigned int sr;\n    unsigned int pc;\n} TSK_CONTEXT_S;\n\n\n/**\n * @ingroup  los_hw\n * @brief: Task stack initialization.\n *\n * @par Description:\n * This API is used to initialize the task stack.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param  uwTaskID     [IN] Type#UINT32: TaskID.\n * @param  uwStackSize  [IN] Type#UINT32: Total size of the stack.\n * @param  pTopStack    [IN] Type#VOID *: Top of task's stack.\n *\n * @retval: pstContext Type#TSK_CONTEXT_S *.\n * @par Dependency:\n * <ul><li>los_hw.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern VOID * osTskStackInit(UINT32 uwTaskID, UINT32 uwStackSize, VOID *pTopStack);\n\n\n\n/**\n * @ingroup  los_hw\n * @brief: Task scheduling Function.\n *\n * @par Description:\n * This API is used to scheduling task.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param  None.\n *\n * @retval: None.\n * @par Dependency:\n * <ul><li>los_hw.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern VOID osSchedule(VOID);\n\n\n/**\n * @ingroup  los_hw\n * @brief: Function to determine whether task scheduling is required.\n *\n * @par Description:\n * This API is used to Judge and entry task scheduling.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param  None.\n *\n * @retval: None.\n * @par Dependency:\n * <ul><li>los_hw.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern VOID LOS_Schedule(VOID);\n\nLITE_OS_SEC_TEXT_MINOR VOID osTaskExit(VOID);\n\n/**\n * @ingroup  los_hw\n * @brief: Enter CPU low power mode.\n *\n * @par Description:\n * This API is used to make CPU enter to power-save mode.\n *\n * @attention:\n * <ul><li>None.</li></ul>\n *\n * @param  None.\n *\n * @retval: None.\n * @par Dependency:\n * <ul><li>los_hw.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\n\nextern VOID osEnterSleep(VOID);\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n\n#endif /* _LOS_HW_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/msp430/include/los_hwi.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n /**@defgroup los_hwi Hardware interrupt\n   *@ingroup kernel\n */\n#ifndef _LOS_HWI_H\n#define _LOS_HWI_H\n\n#include \"los_errno.h\"\n#include \"stdint.h\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n/**\n * @ingroup  los_hwi\n * Define the type of a hardware interrupt handling function.\n */\n\nstruct hwi_int_handle\n{\n    void   (* pfn) (uintptr_t);\n    uintptr_t arg;\n};\n\n\n/**\n * @ingroup los_hwi\n * Count of interrupts.\n */\nextern unsigned char g_int_cnt;\n\n/**\n * @ingroup los_hwi\n * An interrupt is active.\n */\n#define OS_INT_ACTIVE               (g_int_cnt > 0)\n\n\n/**\n * @ingroup los_hwi\n * An interrupt is inactive.\n */\n#define OS_INT_INACTIVE             (!(OS_INT_ACTIVE))\n\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: Invalid interrupt number.\n *\n * Value: 0x02000900\n *\n * Solution: Ensure that the interrupt number is valid. The value range of the interrupt vector is [0, RESET_VECTOR], the defination for vector numbers can be found at the SOC header file, for example: msp430f5438a.h.\n */\n#define OS_ERRNO_HWI_NUM_INVALID                            LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x00)\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: Null hardware interrupt handling function.\n *\n * Value: 0x02000901\n *\n * Solution: Pass in a valid non-null hardware interrupt handling function.\n */\n#define OS_ERRNO_HWI_PROC_FUNC_NULL                         LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x01)\n\n/**\n * @ingroup los_hwi\n * Hardware interrupt error code: The interrupt has already been created.\n *\n * Value: 0x02000904\n *\n * Solution: Check whether the interrupt specified by the passed-in interrupt number has already been created.\n */\n#define OS_ERRNO_HWI_ALREADY_CREATED                        LOS_ERRNO_OS_ERROR(LOS_MOD_HWI, 0x04)\n\n/**\n * @ingroup  los_hwi\n * @brief Create a hardware interrupt.\n *\n * @par Description:\n * This API is used to configure a hardware interrupt and register a hardware interrupt handling function.\n *\n * @attention\n * <ul>\n * <li>Hardware interrupt vector number value range: [0, RESET_VECTOR]. The usable vector numbers can be found at the SOC header files, for example: msp430f5438a.h.</li>\n * <li>Before executing an interrupt on a platform, refer to the chip manual of the platform.</li>\n * </ul>\n *\n * @param  vector [IN] Type#int: hardware interrupt vector number. For example: WDT_VECTOR, RESET_VECTOR.\n * @param  prio   [IN] Type#int: hardware interrupt priority. Not used.\n * @param  mode   [IN] Type#int: hardware interrupt mode. Not used.\n * @param  pfn    [IN] Type#void (*) (uintptr_t): interrupt handler used when a hardware interrupt is triggered.\n * @param  arg    [IN] Type#uintptr_t: input parameter of the interrupt handler used when a hardware interrupt is triggered.\n *\n * @retval #OS_ERRNO_HWI_NUM_INVALID                  0x02000900: Invalid interrupt number.\n * @retval #OS_ERRNO_HWI_PROC_FUNC_NULL               0x02000901: Null hardware interrupt handling function.\n * @retval #OS_ERRNO_HWI_ALREADY_CREATED              0x02000904: The interrupt handler being created has already been created.\n * @retval #LOS_OK                                    0x00000000: The interrupt is successfully created.\n * @par Dependency:\n * <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern UINT32 LOS_HwiCreate (int irq,int prio, int mode,\n                             void (*pfn) (uintptr_t),\n                             uintptr_t arg);\n\n/**\n *@ingroup los_hwi\n *@brief Enable all interrupts.\n *\n *@par Description:\n *<ul>\n *<li>This API is used to enable all interrupts.</li>\n *</ul>\n *@attention\n *<ul>\n *<li>None.</li>\n *</ul>\n *\n *@param None.\n *\n *@retval original interrupt mask status.\n *@par Dependency:\n *<ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n *@see LOS_IntRestore\n *@since Huawei LiteOS V100R001C00\n */\nextern uintptr_t LOS_IntUnLock (void);\n\n\n/**\n *@ingroup los_hwi\n *@brief Disable all interrupts.\n *\n *@par Description:\n *<ul>\n *<li>This API is used to disable all interrupts.</li>\n *</ul>\n *@attention\n *<ul>\n *<li>None.</li>\n *</ul>\n *\n *@param None.\n *\n *@retval original interrupt mask status.\n *@par Dependency:\n *<ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n *@see LOS_IntRestore\n *@since Huawei LiteOS V100R001C00\n */\nextern uintptr_t LOS_IntLock (void);\n\n\n/**\n *@ingroup los_hwi\n *@brief Restore interrupts.\n *\n *@par Description:\n *<ul>\n *<li>This API is used to restore the interrupt mask status.</li>\n *</ul>\n *@attention\n *<ul>\n *<li>This API can be called only after all interrupts are disabled, and the input parameter value should be the value returned by calling the all interrupt disabling API.</li>\n *</ul>\n *\n *@param mask [IN] new interrupt mask.\n *\n *@retval None.\n *@par Dependency:\n *<ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n *@see LOS_IntLock\n *@since Huawei LiteOS V100R001C00\n */\nextern void LOS_IntRestore (uintptr_t mask);\n\n\n/**\n * @ingroup  los_hwi\n * @brief Delete hardware interrupt.\n *\n * @par Description:\n * This API is used to delete hardware interrupt vector handler.\n *\n * @attention\n * <ul>\n * <li>Hardware interrupt vector value range: [0, RESET_VECTOR].</li>\n * <li>RESET_VECTOR specifies the maximum number of interrupts that can be created.</li>\n * <li>Before executing an interrupt on a platform, refer to the chip manual of the platform.</li>\n * </ul>\n *\n * @param  vector [IN] Type#int: hardware interrupt vector number.\n *\n * @retval #OS_ERRNO_HWI_NUM_INVALID              0x02000900: Invalid interrupt number.\n * @retval #LOS_OK                                0x00000000: The interrupt is successfully delete.\n * @par Dependency:\n * <ul><li>los_hwi.h: the header file that contains the API declaration.</li></ul>\n * @see None.\n * @since Huawei LiteOS V100R001C00\n */\nextern UINT32 LOS_HwiDelete (int vector);\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n#endif /* _LOS_HWI_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/msp430/src/ccsmacros.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef _CCSMACROS_H\n#define _CCSMACROS_H\n\n#if __LARGE_DATA_MODEL__ == 1\n#define PTR_SIZE        4\n#define PCMP            CMPX.A\n#define PMOV            MOVA\n#define PSUB            SUBX.A\n#else\n#define PTR_SIZE        2\n#define PCMP            CMP.W\n#define PMOV            MOV.W\n#define PSUB            SUB.W\n#endif\n\n#if __LARGE_CODE_MODEL__ == 1\n#define FRET            RETA\n#define FCALL           CALLA\n#else\n#define FRET            RET\n#define FCALL           CALL\n#endif\n\n#if (__LARGE_DATA_MODEL__ == 1) || (__LARGE_CODE_MODEL__ == 1)\n#define REG_SIZE        4\n#define XMOV            MOVA\n#define XPUSH           PUSH.A\n#define XPUSHM          PUSHM.A\n#define XPOP            POP.A\n#define XPOPM           POPM.A\n#else\n#define REG_SIZE        2\n#define XMOV            MOV.W\n#define XPUSH           PUSH.W\n#define XPUSHM          PUSHM.W\n#define XPOP            POP.W\n#define XPOPM           POPM.W\n#endif\n\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/msp430/src/los_dispatch_ccs.asm",
    "content": ";/*----------------------------------------------------------------------------\n; * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n; * All rights reserved.\n; * Redistribution and use in source and binary forms, with or without modification,\n; * are permitted provided that the following conditions are met:\n; * 1. Redistributions of source code must retain the above copyright notice, this list of\n; * conditions and the following disclaimer.\n; * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n; * of conditions and the following disclaimer in the documentation and/or other materials\n; * provided with the distribution.\n; * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n; * to endorse or promote products derived from this software without specific prior written\n; * permission.\n; * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n; * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n; * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n; * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n; * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n; * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n; * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n; * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n; * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n; * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n; *---------------------------------------------------------------------------*/\n;/*----------------------------------------------------------------------------\n; * Notice of Export Control Law\n; * ===============================================\n; * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n; * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n; * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n; * applicable export control laws and regulations.\n; *---------------------------------------------------------------------------*/\n\n        .cdecls C, LIST, \"msp430.h\"         ; Include device header file\n        .cdecls C, LIST, \"ccsmacros.h\"      ; Include macros used ccs header file\n\n        .data\n        .global _los_heap_start\n        .global _los_heap_end\n\n        .asg    256,    LOSCFG_MSP430_IRQ_SIZE\n\n        .align  4\n_los_heap_start:\n        .ulong  __HEAP_START\n_los_heap_end:\n        .ulong  __STACK_END - LOSCFG_MSP430_IRQ_SIZE\n\n        .text\n        .global LOS_IntLock\n        .global LOS_IntUnLock\n        .global LOS_IntRestore\n        .global LOS_StartToRun\n        .global osSchedule\n        .ref    g_bTaskScheduled\n        .ref    g_stLosTask\n        .ref    g_int_cnt\n        .ref    osTaskSwitchCheck\n        .ref    g_usLosTaskLock\n        .ref    osHwiDispatch\n        .retain\n        .retainrefs\n\n        .asg    0x10, TASK_STATUS_RUNNING\n\n;-------------------------------------------------------------------------------\n;       irq vectors\n;-------------------------------------------------------------------------------\n\n        .asg    0, irq\n\n        .loop\n\n        .if irq < 10\n        .sect   \".int0:irq:\"\n        .else\n        .sect   \".int:irq:\"\n        .endif\n\n        .short  irq_stub:irq:\n\n        .break ($symcmp (\"\"\".int:irq:\"\"\", SYSNMI_VECTOR) = 0)\n\n        .eval   irq + 1, irq\n        .endloop\n\n;-------------------------------------------------------------------------------\n;       irq entry stubs\n;-------------------------------------------------------------------------------\n\n        .sect   \".text:_isr\"\n\n        .asg    irq + 1, irqs\n        .asg    0, irq\nirq_stubs:\n        .loop   irqs\nirq_stub:irq:\n        FCALL   #irq_handler\n\n        .eval   irq + 1, irq\n        .endloop\n\n        .unasg  irq\n        .unasg  irqs\n\nirq_handler:\n\n        ;\n        ; now the stack:\n        ;\n        ; +-------------------------+----+----+\n        ; | irq_stubs + irq * 4 + 4 | SR | PC |\n        ; +-------------------------+----+----+\n        ;\n\n        XPUSH   r14\n        XPUSH   r13\n        XPUSH   r12\n        XMOV    (3 * REG_SIZE)(sp), r12\n        XMOV    r15, (3 * REG_SIZE)(sp)\n\n        ;\n        ; now the stack:\n        ;\n        ; +-----+-----+-----+-----+----+----+\n        ; | R12 | R13 | R14 | R15 | SR | PC |\n        ; +-----+-----+-----+-----+----+----+\n        ;\n        ; now r12 = irq_stubs + irq * 4 + 4,\n        ;\n        ; ((r12 - (irq_stubs + 4)) / 4) is the irq number\n        ; ((r12 - (irq_stubs + 4)) / 2) is the vector number\n        ;\n\n        INC.B   &g_int_cnt\n        CMP.B   #1, &g_int_cnt\n        JNE     already_on_irq_stack\n\n        XMOV    sp, &__STACK_END - REG_SIZE\n        XMOV    #__STACK_END - REG_SIZE, sp\nalready_on_irq_stack:\n\n        SUB.W   #irq_stubs + 4, r12             ; irq_stubs at CODE16\n        RRA.w   r12\n        RRA.w   r12\n\n        FCALL   #osHwiDispatch                  ; interrupt can be enabld in osHwiDispatch\n\n        DINT\n        NOP                                     ; required by architecture\n\n        DEC.B   &g_int_cnt\n        CMP.B   #0, &g_int_cnt\n        JNE     _rfi\n\n        XMOV    0(sp), sp\n\n        CMP.W   #0, &g_usLosTaskLock\n        JNE     _rfi\n\n        PCMP    &g_stLosTask + PTR_SIZE, &g_stLosTask\n        JEQ     _rfi            ; need schedule, save context\n\n        XPUSHM  #8, r11         ; save r4-r11\n\n_switch_new:\n\n        PMOV    &g_stLosTask, r12\n        PMOV    sp, 0(r12)\n        BIC.W   #TASK_STATUS_RUNNING, PTR_SIZE(r12)\n\n        FCALL   #osTaskSwitchCheck\n\n_load_new:\n        PMOV    &g_stLosTask + PTR_SIZE, r12\n        PMOV    r12, &g_stLosTask\n        PMOV    0(r12), sp\n        BIS.W   #TASK_STATUS_RUNNING, PTR_SIZE(r12)\n        XPOPM   #8, r11\n\n_rfi:\n        XPOPM   #4, r15\n        RETI\n\nLOS_StartToRun:\n        DINT\n        NOP                     ; required by architecture\n        MOV.W   #1, &g_bTaskScheduled\n        JMP     _load_new\n\nosSchedule:\n        MOV.W   sr, r12\n        DINT\n        NOP                     ; required by architecture\n        PCMP    &g_stLosTask + PTR_SIZE, &g_stLosTask\n        JEQ     _ret\n\n        .if __LARGE_CODE_MODEL__ = 1\n\n        ;\n        ; fake ra for calla as the same with interrupt:\n        ;\n        ; +---------+---------+    +----+----+\n        ; | ra00:15 | ra16:19 | -> | sr | ra |\n        ; +---------+---------+    +----+----+\n        ;\n        ; ra16:19 in sr16:19\n        ;\n\n        MOV.W   2(sp), r13\n        RLA     r13\n        RLA     r13\n        RLA     r13\n        RLA     r13\n        SWPB    r13\n        BIS.W   r13, r12\n\n        MOV.W   0(sp), 2(sp)\n        MOV.W   r12, 0(sp)\n\n        .else\n\n        PUSH.W  r12\n\n        .endif\n\n        PSUB    #4 * REG_SIZE, sp   ; reserve space for r12-r15, needless save\n\n        XPUSHM  #8, r11             ; save r4-r11\n\n        JMP     _switch_new\n\n_ret:\n        NOP                         ; required by architecture\n        MOV.W   r12, sr\n        NOP                         ; required by architecture\n        FRET\n\nLOS_IntLock:\n        MOV.W   sr, r12\n        AND.W   #GIE, r12\n        DINT\n        NOP                         ; required by architecture\n        FRET\n\nLOS_IntUnLock:\n        MOV.W   sr, r12\n        AND.W   #GIE, r12\n        NOP                         ; required by architecture\n        EINT\n        NOP\n        FRET\n\nLOS_IntRestore:\n        AND.W   #GIE, r12\n        NOP                         ; required by architecture\n        BIS.W   r12, sr\n        NOP                         ; required by architecture\n        FRET\n\n;-------------------------------------------------------------------------------\n;       System HEAP\n;-------------------------------------------------------------------------------\n\n        .sect   .sysmem\n        .align  8\n__HEAP_START:\n\n;-------------------------------------------------------------------------------\n;       Stack Pointer definition\n;-------------------------------------------------------------------------------\n\n        .global __STACK_END\n        .sect   .stack\n\n        .end\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/msp430/src/los_dispatch_iar.s43",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"msp430.h\"                     ; #define controlled include file\n#include \"macros.m43\"\n\n#include \"target_config.h\"\n\n        EXTERN  osHwiDispatch\n        EXTERN  g_int_cnt\n        EXTERN  g_stLosTask\n        EXTERN  g_bTaskScheduled\n        EXTERN  osTaskSwitchCheck\n        EXTERN  g_usLosTaskLock\n\n        PUBLIC  LOS_IntLock\n        PUBLIC  LOS_IntUnLock\n        PUBLIC  LOS_IntRestore\n        PUBLIC  LOS_StartToRun\n        PUBLIC  osSchedule\n        PUBLIC  _los_heap_start\n        PUBLIC  _los_heap_size\n\n#define TASK_STATUS_RUNNING             0x10\n\n#if __DATA_MODEL__ == __DATA_MODEL_LARGE__\n#define PTR_SIZE                        4\n#define PCMP    CMPX.A                  /* pointer compare */\n#define PMOV    MOVA                    /* pointer movation */\n#define PSUB    SUBX.A\n#else\n#define PTR_SIZE                        2\n#define PCMP    CMP.W                   /* pointer compare */\n#define PMOV    MOV.W                   /* pointer movation */\n#define PSUB    SUB.W\n#endif\n\n        /* forward declarations of segments */\n\n        RSEG    CSTACK:DATA:NOROOT\n        RSEG    DATA20_HEAP:DATA:NOROOT\n\n        NAME    los_dispatch            ; module name\n\n        /*\n         * create interrupt vector table for all interrupts\n         */\n\n        RSEG    INTVEC:CONST:CODE:ROOT(1)\n        ORG     0\n\nstub    SET     irq_stubs\n        REPT    RESET_VECTOR / 2 - 1\n        DC16    stub\nstub    SET     stub + 4\n        ENDR\n\n        ; entry (reset) at 0xfffe set by __program_start\n\n#ifndef LOSCFG_MSP430_IRQ_SIZE\n#define LOSCFG_MSP430_IRQ_SIZE          256\n#endif\n\n        RSEG    DATA16_C\n_los_heap_start\n        DC32    (sfe (DATA20_HEAP) + 7) & ~7\n_los_heap_size\n        DC32    ((sfe (CSTACK)) & ~7) - ((sfe (DATA20_HEAP) + 7) & ~7) - LOSCFG_MSP430_IRQ_SIZE\n\n        RSEG    CODE16                  ; place program in 'CODE16' segment\n\nirq_stubs:\n        REPT    RESET_VECTOR / 2 - 1\n#if REG_SIZE == 4\n        CALLA   #irq_handler\n#else\n        CALL    #irq_handler\n#endif\n        ENDR\n\nirq_handler:\n\n        /*\n         * now the stack:\n         *\n         * +-------------------------+----+----+\n         * | irq_stubs + irq * 4 + 4 | SR | PC |\n         * +-------------------------+----+----+\n         */\n\n        XPUSH   r14\n        XPUSH   r13\n        XPUSH   r12\n        XMOV    (3 * REG_SIZE)(sp), r12\n        XMOV    r15, (3 * REG_SIZE)(sp)\n\n        /*\n         * now the stack:\n         *\n         * +-----+-----+-----+-----+----+----+\n         * | R12 | R13 | R14 | R15 | SR | PC |\n         * +-----+-----+-----+-----+----+----+\n         *\n         * now r12 = irq_stubs + irq * 4 + 4,\n         * \n         * ((r12 - (irq_stubs + 4)) / 4) is the irq number\n         * ((r12 - (irq_stubs + 4)) / 2) is the vector number\n         */\n\n        INC.B   &g_int_cnt\n        CMP.B   #1, &g_int_cnt\n        JNE     already_on_irq_stack\n\n        XMOV    sp, &sfe (CSTACK) - REG_SIZE\n        XMOV    #sfe (CSTACK) - REG_SIZE, sp\n\nalready_on_irq_stack:\n\n        SUB.W   #irq_stubs + 4, r12             ; irq_stubs at CODE16\n        RRA.W   r12\n\n        FCALL   #osHwiDispatch                  ; interrupt can be enabld in osHwiDispatch\n\n        DINT\n        NOP                                     ; required by architecture\n\n        DEC.B   &g_int_cnt\n        CMP.B   #0, &g_int_cnt\n        JNE     _rfi\n\n        XMOV    0(sp), sp\n\n        CMP.W   #0, &g_usLosTaskLock\n        JNE     _rfi\n\n        PCMP    &g_stLosTask + PTR_SIZE, &g_stLosTask\n        JEQ     _rfi            ; need schedule, save context\n\n        XPUSHM  #8, r11         ; save r4-r11\n\n_switch_new:\n\n        PMOV    &g_stLosTask, r12\n        PMOV    sp, 0(r12)\n        BIC.W   #TASK_STATUS_RUNNING, PTR_SIZE(r12)\n\n        FCALL   #osTaskSwitchCheck\n\n_load_new:\n        PMOV    &g_stLosTask + PTR_SIZE, r12\n        PMOV    r12, &g_stLosTask\n        PMOV    0(r12), sp\n        BIS.W   #TASK_STATUS_RUNNING, PTR_SIZE(r12)\n        XPOPM   #8, r11\n\n_rfi:\n        XPOPM   #4, r15\n        RETI\n\nLOS_StartToRun:\n        DINT\n        NOP                     ; required by architecture\n        MOV.W   #1, &g_bTaskScheduled\n        JMP     _load_new\n\nosSchedule:\n        MOV.W   sr, r12\n        DINT\n        NOP                     ; required by architecture\n        PCMP    &g_stLosTask + PTR_SIZE, &g_stLosTask\n        JEQ     _ret\n\n#if __CODE_MODEL__ == __CODE_MODEL_LARGE__\n\n        /*\n         * fake ra for calla as the same with interrupt:\n         *\n         * +---------+---------+    +----+----+\n         * | ra00:15 | ra16:19 | -> | sr | ra |\n         * +---------+---------+    +----+----+\n         *\n         * ra16:19 in sr16:19\n         */\n\n        MOV.W   2(sp), r13\n        RLA     r13\n        RLA     r13\n        RLA     r13\n        RLA     r13\n        SWPB    r13\n        BIS.W   r13, r12\n\n        MOV.W   0(sp), 2(sp)\n        MOV.W   r12, 0(sp)\n#else\n        PUSH.W  r12\n#endif\n\n        PSUB    #4 * REG_SIZE, sp   ; reserve space for r12-r15, needless save\n\n        XPUSHM  #8, r11             ; save r4-r11\n\n        JMP     _switch_new\n\n_ret:\n        NOP                         ; required by architecture\n        MOV.W   r12, sr\n        NOP                         ; required by architecture\n        FRET\n\nLOS_IntLock:\n        MOV.W   sr, r12\n        AND.W   #GIE, r12\n        DINT\n        NOP                         ; required by architecture\n        FRET\n\nLOS_IntUnLock:\n        MOV.W   sr, r12\n        AND.W   #GIE, r12\n        NOP                         ; required by architecture\n        EINT\n        NOP\n        FRET\n\nLOS_IntRestore:\n        AND.W   #GIE, r12\n        NOP                         ; required by architecture\n        BIS.W   r12, sr\n        NOP                         ; required by architecture\n        FRET\n\n        END\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/msp430/src/los_hw.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"los_base.h\"\n#include \"los_hwi.h\"\n#include \"los_task.ph\"\n#include \"los_memory.h\"\n#include \"los_membox.h\"\n#include \"los_priqueue.ph\"\n\nvoid LOS_Schedule (void)\n{\n    uintptr_t flags;\n    BOOL      need_schedule = FALSE;\n\n    flags = LOS_IntLock ();\n\n    g_stLosTask.pstNewTask = LOS_DL_LIST_ENTRY (osPriqueueTop (),\n                                                LOS_TASK_CB, stPendList);/*lint !e413*/\n\n    need_schedule = (g_stLosTask.pstRunTask != g_stLosTask.pstNewTask) &&\n                    (!g_usLosTaskLock) && (!OS_INT_ACTIVE);\n\n    (void) LOS_IntRestore (flags);\n\n    if (need_schedule)\n    {\n        osSchedule ();\n    }\n}\n\nstatic void osTaskExit (void)\n{\n    LOS_IntUnLock();\n\n    while (1)\n    {\n        LOS_TaskDelay (0xffffffff);\n    };\n}\n\n/*****************************************************************************\n Function    : osTskStackInit\n Description : task stack initialization\n Input       : tid        -- task id\n               stack_size -- task stack size\n               stack      -- task stack\n Output      : None\n Return      : OS_SUCCESS on success or error code on failure\n *****************************************************************************/\nvoid * osTskStackInit (UINT32 tid, UINT32 stack_size, VOID * stack)\n{\n    TSK_CONTEXT_S * context;\n\n#if (LOSCFG_STATIC_TASK == NO)\n\n    UINT32 i;\n\n    /*initialize the task stack, write magic num to stack top*/\n\n    for (i = 0; i < (stack_size / sizeof (UINT32)); i++)\n    {\n        ((UINT32 *) stack) [i] = OS_TASK_STACK_INIT;\n    }\n\n    *((UINT32 *) stack) = OS_TASK_MAGIC_WORD;\n\n#endif\n\n    /* fake return address in stack */\n\n#if __CODE_MODEL__ == __CODE_MODEL_LARGE__\n    stack = (void *) (((char *) stack + stack_size) - 4);\n#else\n    stack = (void *) (((char *) stack + stack_size) - 2);\n#endif\n\n    *((void (**) (void)) stack) = osTaskExit;\n\n    /* make extra 4 bytes after the context to fake return address in stack */\n\n    context = (TSK_CONTEXT_S *) (((char *) stack) - sizeof (TSK_CONTEXT_S));\n\n    /*initialize the task context*/\n\n    context->pc  = ((((unsigned long) &osTaskEntry)) & 0xffff);\n\n#if __CODE_MODEL__ == __CODE_MODEL_LARGE__\n    context->sr  = ((((unsigned long) &osTaskEntry) >> 4) & 0xf000) | GIE;\n#else\n    context->sr  = GIE;\n#endif\n\n    context->r12 = tid;\n    context->r13 = 0;\n\n    return (void *) context;\n}\n\n#if (LOSCFG_KERNEL_RUNSTOP == YES)\nvoid osEnterSleep (void)\n{\n    //_BIS_SR (LPM0_bits + GIE);  /* Enter LPM0 w/ interrupt */\n}\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/msp430/src/los_hw_tick.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include <msp430.h>\n#include <los_typedef.h>\n#include <los_hwi.h>\n\nextern void osTickHandler (void);\n\nUINT32 osTickStart (void)\n{\n    UINT32 ret = LOS_NOK;\n\n    if (LOSCFG_BASE_CORE_TICK_PER_SECOND > 100)\n    {\n        return ret;\n    }\n\n    ret = LOS_HwiCreate (TIMER1_A0_VECTOR, 0, 0, (void (*) (uintptr_t)) osTickHandler, 0);\n\n    if (ret != LOS_OK)\n    {\n        return ret;\n    }\n\n    TA1CCTL0 =  CCIE;                           /* capture/compare interrupt enable */\n    TA1CTL   =  TASSEL_1 + ID_0 + MC_1 + TACLR; /* select 32k clock, input divider = /1, up-mode and clear */\n    TA1CCR0  =  32768 / LOSCFG_BASE_CORE_TICK_PER_SECOND;\n\n    return LOS_OK;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/arch/msp430/src/los_hwi.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"los_hwi.h\"\n#include \"los_memory.h\"\n#include \"string.h\"\n\nunsigned char g_int_cnt = 0;\n\n\n#if defined (__ICC430__)\n\nstatic struct hwi_int_handle s_irq_table [RESET_VECTOR >> 1] = {0};\n\n#elif defined (__TI_COMPILER_VERSION__)\n\nstatic struct hwi_int_handle s_irq_table [RESET_VECTOR] = {0};\n\n#endif\n\n/*****************************************************************************\n Function    : osHwiInit\n Description : initialization of the hardware interrupt\n Input       : None\n Output      : None\n Return      : None\n *****************************************************************************/\nvoid osHwiInit (void)\n{\n    return;\n}\n\nvoid osHwiDispatch (int vector)\n{\n    int irq;\n\n    if ((vector < 0) || (vector >= RESET_VECTOR))\n    {\n        PRINT_ERR (\"unexpected irq\\n\");\n        return;\n    }\n\n#if defined (__ICC430__)\n\n    irq = vector >> 1;\n\n#elif defined (__TI_COMPILER_VERSION__)\n\n    irq = vector;\n\n#endif\n\n    if (s_irq_table [irq].pfn == NULL)\n    {\n        PRINT_ERR (\"unexpected irq\\n\");\n        return;\n    }\n\n    s_irq_table [irq].pfn (s_irq_table [irq].arg);\n}\n\n/*****************************************************************************\n Function    : LOS_HwiCreate\n Description : create hardware interrupt\n Input       : vector --- vector number\n               prio   --- not used\n               pfn    --- vector handler\n               arg    --- param of the vector handler\n Output      : None\n Return      : OS_SUCCESS on success or error code on failure\n *****************************************************************************/\nUINT32 LOS_HwiCreate (int vector, int prio, int mode,\n                      void (* pfn) (uintptr_t), uintptr_t arg)\n{\n    int     irq;\n\n    (void) mode;        /* not used for now */\n\n    if (pfn == NULL)\n    {\n        return OS_ERRNO_HWI_PROC_FUNC_NULL;\n    }\n\n    if ((vector < 0) || (vector >= RESET_VECTOR))\n    {\n        return OS_ERRNO_HWI_NUM_INVALID;\n    }\n\n#if defined (__ICC430__)\n\n    irq = vector >> 1;\n\n#elif defined (__TI_COMPILER_VERSION__)\n\n    irq = vector;\n\n#endif\n\n    if (s_irq_table [irq].pfn != NULL)\n    {\n        return OS_ERRNO_HWI_ALREADY_CREATED;\n    }\n\n    s_irq_table [irq].pfn = pfn;\n    s_irq_table [irq].arg = arg;\n\n    return 0;\n}\n\n\n/*****************************************************************************\n Function    : LOS_HwiDelete\n Description : delete hardware interrupt\n Input       : vector --- hwi vector to delete\n Output      : None\n Return      : OS_SUCCESS on success or error code on failure\n *****************************************************************************/\nUINT32 LOS_HwiDelete (int vector)\n{\n    if ((vector < 0) || (vector >= RESET_VECTOR))\n    {\n        return OS_ERRNO_HWI_NUM_INVALID;\n    }\n\n\n#if defined (__ICC430__)\n\n    s_irq_table [vector >> 1].pfn = NULL;\n\n#elif defined (__TI_COMPILER_VERSION__)\n\n    s_irq_table [vector].pfn = NULL;\n\n#endif\n\n    return LOS_OK;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/build/Makefile",
    "content": "#blank makefile now"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/agent_list.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef _ATINY_LIST_H\n\n#define _ATINY_LIST_H\n#define ATINY_INLINE static inline\n\n\n#ifdef __cplusplus\n#if __cplusplus\n\nextern \"C\" {\n\n#endif /* __cplusplus */\n\n#endif /* __cplusplus */\n\n\n/**\n\n *@ingroup atiny_list\n\n *Structure of a node in a doubly linked list.\n\n */\n\ntypedef struct atiny_dl_list\n{\n    struct atiny_dl_list *prev;            /**< Current node's pointer to the previous node*/\n    struct atiny_dl_list *next;            /**< Current node's pointer to the next node*/\n\n} atiny_dl_list;\n\n\nATINY_INLINE void atiny_list_init(atiny_dl_list *list)\n{\n    list->next = list;\n    list->prev = list;\n}\n\n#define ATINY_DL_LIST_FIRST(object) ((object)->next)\n\nATINY_INLINE void atiny_list_add(atiny_dl_list *list, atiny_dl_list *node)\n{\n    node->next = list->next;\n    node->prev = list;\n    list->next->prev = node;\n    list->next = node;\n}\n\nATINY_INLINE void atiny_list_insert_tail(atiny_dl_list *list, atiny_dl_list *node)\n{\n    atiny_list_add(list->prev, node);\n}\n\nATINY_INLINE atiny_dl_list * atiny_list_get_head(atiny_dl_list *header)\n{\n    return header->next;\n}\n\nATINY_INLINE void atiny_list_delete(atiny_dl_list *node)\n{\n    node->next->prev = node->prev;\n    node->prev->next = node->next;\n    node->next = (atiny_dl_list *)NULL;\n    node->prev = (atiny_dl_list *)NULL;\n}\n\nATINY_INLINE int atiny_list_empty(atiny_dl_list *node)\n{\n    return (node->next == node);\n}\n\n#define ATINY_OFFSET_OF_FIELD(type, field)    ((UINT32)&(((type *)0)->field))\n#define ATINY_OFF_SET_OF(type, member) ((long)&((type *)0)->member)   /*lint -e(413) */\n#define ATINY_FIELD_TO_STRUCT(field_addr, type, member) \\\n    ((type *)((char *)(field_addr) - ATINY_OFF_SET_OF(type, member)))\n\n#define ATINY_DL_LIST_ENTRY(item, type, member)\\\n    ((type *)((char *)item - ATINY_OFF_SET_OF(type, member)))\\\n\n\n#define ATINY_DL_LIST_FOR_EACH_ENTRY(item, list, type, member)\\\n    for (item = ATINY_DL_LIST_ENTRY((list)->next, type, member);\\\n        &item->member != (list);\\\n        item = ATINY_DL_LIST_ENTRY(item->member.next, type, member))\n\n\n#define ATINY_DL_LIST_FOR_EACH_ENTRY_SAFE(item, next, list, type, member)\\\n    for (item = ATINY_DL_LIST_ENTRY((list)->next, type, member),\\\n        next = ATINY_DL_LIST_ENTRY(item->member->next, type, member);\\\n        &item->member != (list);\\\n        item = next, item = ATINY_DL_LIST_ENTRY(item->member.next, type, member))\n\nATINY_INLINE void ATINY_ListDel(atiny_dl_list *pstPrevNode, atiny_dl_list *pstNextNode)\n{\n    pstNextNode->prev = pstPrevNode;\n    pstPrevNode->next = pstNextNode;\n}\n\nATINY_INLINE void ATINY_ListDelInit(atiny_dl_list *pstList)\n{\n    ATINY_ListDel(pstList->prev, pstList->next);\n    atiny_list_init(pstList);\n}\n\n#define ATINY_DL_LIST_FOR_EACH(item, list)\\\n    for ((item) = (list)->next;\\\n        (item) != (list);\\\n        (item) = (item)->next)\n\n#define ATINY_DL_LIST_FOR_EACH_SAFE(item, next, list)\\\n    for (item = (list)->next, next = item->next; item != (list);\\\n        item = next, next = item->next)\n\n#define ATINY_DL_LIST_HEAD(list)\\\n            atiny_dl_list list = { &(list), &(list) }\n\n#ifdef __cplusplus\n\n#if __cplusplus\n\n}\n\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n#endif /* _ATINY_LIST_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/agenttiny.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"internals.h\"\n#include \"atiny_lwm2m/agenttiny.h\"\n#include \"atiny_context.h\"\n#include \"connection.h\"\n#include \"log/atiny_log.h\"\n#include \"atiny_rpt.h\"\n#include \"osdepends/atiny_osdep.h\"\n#ifdef CONFIG_FEATURE_FOTA\n#include \"atiny_fota_manager.h\"\n#endif\n\n\n\nint g_reboot = 0;\n\n\nvoid observe_handle_ack(lwm2m_transaction_t *transacP, void *message);\nstatic int atiny_check_bootstrap_init_param(atiny_param_t *atiny_params);\n\nstatic handle_data_t g_atiny_handle;\n\n/*\n * modify date:   2018-06-20\n * description: in order to check the params for the bootstrap, expecialy for the mode and the ip/port\n * return:\n *              success: ATINY_OK\n *              fail:    ATINY_ARG_INVALID\n *\n */\nstatic int atiny_check_bootstrap_init_param(atiny_param_t *atiny_params)\n{\n    if(NULL == atiny_params)\n    {\n        return ATINY_ARG_INVALID;\n    }\n\n    if(BOOTSTRAP_FACTORY == atiny_params->server_params.bootstrap_mode)\n    {\n        if((NULL == atiny_params->security_params[0].server_ip) || (NULL == atiny_params->security_params[0].server_port))\n        {\n            LOG(\"[bootstrap_tag]: BOOTSTRAP_FACTORY mode's params is wrong, should have iot server ip/port\");\n            return ATINY_ARG_INVALID;\n        }\n    }\n    else if(BOOTSTRAP_CLIENT_INITIATED == atiny_params->server_params.bootstrap_mode)\n    {\n        if((NULL == atiny_params->security_params[1].server_ip) || (NULL == atiny_params->security_params[1].server_port))\n        {\n            LOG(\"[bootstrap_tag]: BOOTSTRAP_CLIENT_INITIATED mode's params is wrong, should have bootstrap server ip/port\");\n            return ATINY_ARG_INVALID;\n        }\n    }\n    else if(BOOTSTRAP_SEQUENCE == atiny_params->server_params.bootstrap_mode)\n    {\n        return ATINY_OK;\n    }\n    else\n    {\n        //it is ok? if the mode value is not 0,1,2, we all set it to 2 ?\n        LOG(\"[bootstrap_tag]: BOOTSTRAP only have three mode, should been :0,1,2\");\n        return ATINY_ARG_INVALID;\n    }\n\n\n    return ATINY_OK;\n}\n\n#ifdef LWM2M_BOOTSTRAP\nstatic int atiny_check_psk_init_param(atiny_param_t *atiny_params)\n{\n    int i = 0;\n    int psk_id_len = 0;\n    int psk_len = 0;\n    const int PSK_ID_LIMIT_LEN = 128;\n    const int PSK_LIMIT_LEN = 64;\n    int total_element = 0;\n\n    if(NULL == atiny_params)\n    {\n        return ATINY_ARG_INVALID;\n    }\n\n    //security_params have 2 element, we have 2 pair psk.\n    total_element = (sizeof(atiny_params->security_params)) / (sizeof(atiny_params->security_params[0]));\n\n    for(i = 0; i < total_element; i++)\n    {\n        //if there are null, we could run not in security mode\n        if((atiny_params->security_params[i].psk_Id != NULL) && (atiny_params->security_params[i].psk != NULL))\n        {\n            psk_id_len = strlen(atiny_params->security_params[i].psk_Id);\n            psk_len = strlen(atiny_params->security_params[i].psk);\n\n            //the limit of the len, please read RFC4279  or OMA-TS-LightweightM2M E.1.1\n            if((psk_id_len > PSK_ID_LIMIT_LEN) || (psk_len > PSK_LIMIT_LEN))\n            {\n                LOG(\"[bootstrap_tag]: psk_Id len over 128 or psk len over 64\");\n                return ATINY_ARG_INVALID;\n            }\n        }\n    }\n\n    return ATINY_OK;\n}\n#endif\n\n\nint  atiny_init(atiny_param_t *atiny_params, void **phandle)\n{\n    int result;\n    \n    result = atiny_init_rpt();\n    if (result != ATINY_OK)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_init_rpt fail,ret=%d\", result);\n        return result;\n    }\n\n    if (NULL == atiny_params || NULL == phandle)\n    {\n        ATINY_LOG(LOG_FATAL, \"Invalid args\");\n        return ATINY_ARG_INVALID;\n    }\n\n    if(ATINY_OK != atiny_check_bootstrap_init_param(atiny_params))\n    {\n        LOG(\"[bootstrap_tag]: BOOTSTRAP's params are wrong\");\n        return ATINY_ARG_INVALID;\n    }\n\n#ifdef LWM2M_BOOTSTRAP\n    if(ATINY_OK != atiny_check_psk_init_param(atiny_params))\n    {\n        LOG(\"[bootstrap_tag]: psk params are wrong\");\n    }\n#endif\n\n    memset((void *)&g_atiny_handle, 0, sizeof(handle_data_t));\n\n    g_atiny_handle.quit_sem = atiny_mutex_create();\n    if (NULL == g_atiny_handle.quit_sem)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_mutex_create fail\");\n        return ATINY_RESOURCE_NOT_ENOUGH;\n    }\n    atiny_mutex_lock(g_atiny_handle.quit_sem);\n    g_atiny_handle.atiny_params = *atiny_params;\n    *phandle = &g_atiny_handle;\n\n#ifdef CONFIG_FEATURE_FOTA\n\n    return atiny_fota_manager_set_storage_device(atiny_fota_manager_get_instance());\n#else\n    return ATINY_OK;\n#endif\n\n}\n\n/*\n * add date:     2018-06-05\n * description:  get bootstrap info from atiny_params which from user, set bs_sequence_state and bs_server_uri for lwm2m_context.\n *\n * return:       none\n * param:\n *     in:  atiny_params\n *     out: lwm2m_context\n */\nvoid atiny_set_bootstrap_sequence_state(atiny_param_t *atiny_params, lwm2m_context_t *lwm2m_context)\n{\n    (void)lwm2m_initBootStrap(lwm2m_context, atiny_params->server_params.bootstrap_mode);\n}\n\n\n\n/*\n* modify info:\n*     date:    2018-05-30\n*     reason:  modify for bootstrap mode, origin code only support FACTORY mode.\n*/\nint atiny_init_objects(atiny_param_t *atiny_params, const atiny_device_info_t *device_info, handle_data_t *handle)\n{\n    int result;\n    client_data_t *pdata;\n    lwm2m_context_t *lwm2m_context = NULL;\n    uint16_t serverId = SERVER_ID;\n    char *epname = (char *)device_info->endpoint_name;\n\n\n\n    pdata = &handle->client_data;\n    memset(pdata, 0, sizeof(client_data_t));\n\n    ATINY_LOG(LOG_INFO, \"Trying to init objects\");\n\n    lwm2m_context = lwm2m_init(pdata);\n    if (NULL == lwm2m_context)\n    {\n        ATINY_LOG(LOG_FATAL, \"lwm2m_init fail\");\n        return ATINY_MALLOC_FAILED;\n    }\n    lwm2m_context->observe_mutex = atiny_mutex_create();\n    if (NULL == lwm2m_context->observe_mutex)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_mutex_create fail\");\n        lwm2m_free(lwm2m_context);\n        return ATINY_RESOURCE_NOT_ENOUGH;\n    }\n\n    pdata->lwm2mH = lwm2m_context;\n\n    handle->lwm2m_context = lwm2m_context;\n\n    //even if not in bootstrap sequence mode, still set it NO_BS_SEQUENCE_STATE\n    atiny_set_bootstrap_sequence_state(atiny_params, lwm2m_context);\n\n    handle->obj_array[OBJ_SECURITY_INDEX] = get_security_object(serverId, atiny_params, lwm2m_context);\n\n    if (NULL ==  handle->obj_array[OBJ_SECURITY_INDEX])\n    {\n        ATINY_LOG(LOG_FATAL, \"Failed to create security object\");\n        return ATINY_MALLOC_FAILED;\n    }\n    pdata->securityObjP = handle->obj_array[OBJ_SECURITY_INDEX];\n\n    handle->obj_array[OBJ_SERVER_INDEX] = get_server_object(serverId, atiny_params->server_params.binding,\n                                          atiny_params->server_params.life_time, atiny_params->server_params.storing_cnt != 0);\n    if (NULL == handle->obj_array[OBJ_SERVER_INDEX])\n    {\n        ATINY_LOG(LOG_FATAL, \"Failed to create server object\");\n        return ATINY_MALLOC_FAILED;\n    }\n\n    handle->obj_array[OBJ_ACCESS_CONTROL_INDEX] = acc_ctrl_create_object();\n    if (NULL == handle->obj_array[OBJ_ACCESS_CONTROL_INDEX])\n    {\n        ATINY_LOG(LOG_FATAL, \"Failed to create access control object\");\n        return ATINY_MALLOC_FAILED;\n    }\n\n    handle->obj_array[OBJ_DEVICE_INDEX] = get_object_device(atiny_params, device_info->manufacturer);\n    if (NULL == handle->obj_array[OBJ_DEVICE_INDEX])\n    {\n        ATINY_LOG(LOG_FATAL, \"Failed to create device object\");\n        return ATINY_MALLOC_FAILED;\n    }\n\n    handle->obj_array[OBJ_CONNECT_INDEX] = get_object_conn_m(atiny_params);\n    if (NULL == handle->obj_array[OBJ_CONNECT_INDEX])\n    {\n        ATINY_LOG(LOG_FATAL, \"Failed to create connect object\");\n        return ATINY_MALLOC_FAILED;\n    }\n\n    handle->obj_array[OBJ_FIRMWARE_INDEX] = get_object_firmware(atiny_params);\n#ifdef CONFIG_FEATURE_FOTA\n    if (NULL == handle->obj_array[OBJ_FIRMWARE_INDEX])\n    {\n        ATINY_LOG(LOG_FATAL, \"Failed to create firmware object\");\n        return ATINY_MALLOC_FAILED;\n    }\n#endif\n\n    handle->obj_array[OBJ_LOCATION_INDEX] = get_object_location();\n    if (NULL == handle->obj_array[OBJ_LOCATION_INDEX])\n    {\n        ATINY_LOG(LOG_FATAL, \"Failed to create location object\");\n        return ATINY_MALLOC_FAILED;\n    }\n\n    handle->obj_array[OBJ_APP_INDEX] = get_binary_app_data_object(atiny_params);\n    if (NULL == handle->obj_array[OBJ_APP_INDEX])\n    {\n        ATINY_LOG(LOG_FATAL, \"Failed to create app object\");\n        return ATINY_MALLOC_FAILED;\n    }\n\n    result = lwm2m_configure(lwm2m_context, epname, NULL, NULL, OBJ_MAX_NUM, handle->obj_array);\n    if (result != 0)\n    {\n        return ATINY_RESOURCE_NOT_FOUND;\n    }\n\n    return ATINY_OK;\n}\n\nstatic int lwm2m_poll(handle_data_t *phandle, uint32_t *timeout)\n{\n    client_data_t *dataP;\n    int numBytes;\n    connection_t *connP;\n    lwm2m_context_t *contextP = phandle->lwm2m_context;\n    uint8_t *recv_buffer = phandle->recv_buffer;\n\n    dataP = (client_data_t *)(contextP->userData);\n    connP = dataP->connList;\n\n    while (connP != NULL)\n    {\n        numBytes = lwm2m_buffer_recv(connP, recv_buffer, MAX_PACKET_SIZE, *timeout);\n        if (numBytes <= 0)\n        {\n            ATINY_LOG(LOG_INFO, \"no packet arrived!\");\n        }\n        else\n        {\n            output_buffer(stderr, recv_buffer, numBytes, 0);\n            lwm2m_handle_packet(contextP, recv_buffer, numBytes, connP);\n        }\n        connP = connP->next;\n    }\n\n    return ATINY_OK;\n}\n\nvoid atiny_destroy(void *handle)\n{\n    handle_data_t *handle_data = (handle_data_t *)handle;\n\n    if (handle_data == NULL)\n    {\n        return;\n    }\n#ifdef CONFIG_FEATURE_FOTA\n    atiny_fota_manager_destroy(atiny_fota_manager_get_instance());\n#endif\n    if(handle_data->recv_buffer != NULL)\n    {\n        lwm2m_free(handle_data->recv_buffer);\n    }\n    if (handle_data->obj_array[OBJ_SECURITY_INDEX] != NULL)\n    {\n        clean_security_object(handle_data->obj_array[OBJ_SECURITY_INDEX]);\n    }\n\n    if (handle_data->obj_array[OBJ_SERVER_INDEX] != NULL)\n    {\n        clean_server_object(handle_data->obj_array[OBJ_SERVER_INDEX]);\n    }\n\n    if (handle_data->obj_array[OBJ_ACCESS_CONTROL_INDEX] != NULL)\n    {\n        acl_ctrl_free_object(handle_data->obj_array[OBJ_ACCESS_CONTROL_INDEX]);\n    }\n\n    if (handle_data->obj_array[OBJ_DEVICE_INDEX] != NULL)\n    {\n        free_object_device(handle_data->obj_array[OBJ_DEVICE_INDEX]);\n    }\n\n    if (handle_data->obj_array[OBJ_CONNECT_INDEX] != NULL)\n    {\n        free_object_conn_m(handle_data->obj_array[OBJ_CONNECT_INDEX]);\n    }\n\n    if (handle_data->obj_array[OBJ_FIRMWARE_INDEX] != NULL)\n    {\n        free_object_firmware(handle_data->obj_array[OBJ_FIRMWARE_INDEX]);\n    }\n\n    if (handle_data->obj_array[OBJ_LOCATION_INDEX] != NULL)\n    {\n        free_object_location(handle_data->obj_array[OBJ_LOCATION_INDEX]);\n    }\n\n    if (handle_data->obj_array[OBJ_APP_INDEX] != NULL)\n    {\n        free_binary_app_data_object(handle_data->obj_array[OBJ_APP_INDEX]);\n    }\n    atiny_destroy_rpt();\n\n    if (handle_data->lwm2m_context != NULL)\n    {\n        if (handle_data->lwm2m_context->observe_mutex != NULL)\n        {\n            atiny_mutex_destroy(handle_data->lwm2m_context->observe_mutex);\n        }\n        lwm2m_close(handle_data->lwm2m_context);\n    }\n    atiny_mutex_unlock(handle_data->quit_sem);\n}\n\nvoid atiny_event_handle(module_type_t type, int code, const char *arg, int arg_len)\n{\n    switch (type)\n    {\n    case MODULE_LWM2M:\n    {\n        if (code == STATE_REGISTERED)\n        {\n            atiny_event_notify(ATINY_REG_OK, NULL, 0);\n#ifdef CONFIG_FEATURE_FOTA\n            (void)atiny_fota_manager_repot_result(atiny_fota_manager_get_instance());\n#endif\n        }\n        else if (code == STATE_REG_FAILED)\n        {\n            atiny_event_notify(ATINY_REG_FAIL, NULL, 0);\n\n        }\n        break;\n    }\n    case MODULE_NET:\n    {\n        break;\n    }\n    case MODULE_URI:\n    {\n        if ((arg == NULL) || (arg_len < sizeof(lwm2m_uri_t)))\n        {\n            break;\n        }\n\n        if (code == OBSERVE_UNSUBSCRIBE)\n        {\n            if (dm_isUriOpaqueHandle((lwm2m_uri_t *)arg))\n            {\n                atiny_report_type_e rpt_type = APP_DATA;\n                atiny_event_notify(ATINY_DATA_UNSUBSCRIBLE, (char *)&rpt_type, sizeof(rpt_type));\n            }\n            (void)atiny_clear_rpt_data((lwm2m_uri_t *)arg, SENT_FAIL);\n        }\n        else if (code == OBSERVE_SUBSCRIBE)\n        {\n            if (dm_isUriOpaqueHandle((lwm2m_uri_t *)arg))\n            {\n                atiny_report_type_e rpt_type = APP_DATA;\n                atiny_event_notify(ATINY_DATA_SUBSCRIBLE, (char *)&rpt_type, sizeof(rpt_type));\n            }\n        }\n\n        break;\n    }\n    default:\n    {\n        break;\n    }\n    }\n\n}\n\nvoid reboot_check(void)\n{\n    if(g_reboot == 1)\n    {\n        (void)atiny_cmd_ioctl(ATINY_DO_DEV_REBOOT, NULL, 0);\n    }\n}\n\nstatic void atiny_connection_err_notify(lwm2m_context_t *context, connection_err_e err_type, bool boostrap_flag)\n{\n    handle_data_t *handle = NULL;\n\n    if((NULL == context) || (NULL == context->userData))\n    {\n        ATINY_LOG(LOG_ERR, \"null point\");\n        return;\n    }\n\n    if(!boostrap_flag)\n    {\n        handle = ATINY_FIELD_TO_STRUCT(context->userData, handle_data_t, client_data);\n        (void)atiny_reconnect(handle);\n    }\n    ATINY_LOG(LOG_INFO, \"connection err type %d bootstrap %d\", err_type, boostrap_flag);\n}\n\n\nstatic void atiny_handle_reconnect(handle_data_t *handle)\n{\n    if(handle->reconnect_flag)\n    {\n        (void)lwm2m_reconnect(handle->lwm2m_context);\n        handle->reconnect_flag = false;\n        ATINY_LOG(LOG_INFO, \"lwm2m reconnect\");\n    }\n}\n\nint atiny_bind(atiny_device_info_t *device_info, void *phandle)\n{\n    handle_data_t *handle = (handle_data_t *)phandle;\n    uint32_t timeout;\n    int ret;\n\n    if ((NULL == device_info) || (NULL == phandle))\n    {\n        ATINY_LOG(LOG_FATAL, \"Parameter null\");\n        atiny_deinit(phandle);\n        return ATINY_ARG_INVALID;\n    }\n\n    if (NULL == device_info->endpoint_name)\n    {\n        ATINY_LOG(LOG_FATAL, \"Endpoint name null\");\n        atiny_deinit(phandle);\n        return ATINY_ARG_INVALID;\n    }\n\n    if (NULL == device_info->manufacturer)\n    {\n        ATINY_LOG(LOG_FATAL, \"Manufacturer name null\");\n        atiny_deinit(phandle);\n        return ATINY_ARG_INVALID;\n    }\n\n    ret = atiny_init_objects(&handle->atiny_params, device_info, handle);\n    if (ret != ATINY_OK)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_init_object fail %d\", ret);\n        atiny_destroy(handle);\n        return ret;\n    }\n#ifdef CONFIG_FEATURE_FOTA\n    (void)atiny_fota_manager_set_lwm2m_context(atiny_fota_manager_get_instance(), handle->lwm2m_context);\n#endif\n    lwm2m_register_observe_ack_call_back(observe_handle_ack);\n    lwm2m_register_event_handler(atiny_event_handle);\n    lwm2m_register_connection_err_notify(atiny_connection_err_notify);\n\n    handle->recv_buffer = (uint8_t *)lwm2m_malloc(MAX_PACKET_SIZE);\n    if(handle->recv_buffer == NULL)\n    {\n        ATINY_LOG(LOG_FATAL, \"memory not enough\");\n        return ATINY_MALLOC_FAILED;\n    }\n\n    while (!handle->atiny_quit)\n    {\n        timeout = BIND_TIMEOUT;\n\n        (void)atiny_step_rpt(handle->lwm2m_context);\n        atiny_handle_reconnect(handle);\n        (void)lwm2m_step(handle->lwm2m_context, (time_t *)&timeout);\n        reboot_check();\n        (void)lwm2m_poll(handle, &timeout);\n    }\n\n    atiny_destroy(phandle);\n\n    return ATINY_OK;\n}\n\nvoid atiny_deinit(void *phandle)\n{\n    handle_data_t *handle;\n    void *sem = NULL;\n\n    if (phandle == NULL)\n    {\n        return;\n    }\n\n    handle = (handle_data_t *)phandle;\n    handle->atiny_quit = 1;\n    sem = handle->quit_sem;\n    atiny_mutex_lock(sem);\n    atiny_mutex_destroy(sem);\n}\n\nint atiny_data_report(void *phandle, data_report_t *report_data)\n{\n    lwm2m_uri_t uri;\n    int ret;\n    data_report_t data;\n\n\n    if (NULL == phandle || NULL == report_data || report_data->len <= 0\n            || report_data->len > MAX_REPORT_DATA_LEN || NULL == report_data->buf)\n    {\n        ATINY_LOG(LOG_ERR, \"invalid args\");\n        return ATINY_ARG_INVALID;\n    }\n\n    memset((void *)&uri, 0, sizeof(uri));\n\n    switch (report_data->type)\n    {\n    case FIRMWARE_UPDATE_STATE:\n        (void)lwm2m_stringToUri(\"/5/0/3\", 6, &uri);\n        break;\n    case APP_DATA:\n        get_resource_uri(BINARY_APP_DATA_OBJECT_ID, 0, BINARY_APP_DATA_RES_ID, &uri);\n        break;\n    default:\n        return ATINY_RESOURCE_NOT_FOUND;\n    }\n\n    memcpy(&data, report_data, sizeof(data));\n    data.buf = lwm2m_malloc(report_data->len);\n    if (NULL == data.buf)\n    {\n        ATINY_LOG(LOG_ERR, \"lwm2m_malloc fail,len %d\", data.len);\n        return ATINY_MALLOC_FAILED;;\n    }\n    memcpy(data.buf, report_data->buf, report_data->len);\n\n    ret = atiny_queue_rpt_data(&uri, &data);\n\n    if (ATINY_OK != ret)\n    {\n        if (data.buf != NULL)\n        {\n            lwm2m_free(data.buf);\n        }\n    }\n\n    return ret;\n}\n\nint atiny_data_change(void *phandle, const char *data_type)\n{\n    lwm2m_uri_t uri;\n    handle_data_t *handle;\n\n    if (NULL == phandle || NULL == data_type)\n    {\n        ATINY_LOG(LOG_ERR, \"invalid args\");\n        return ATINY_ARG_INVALID;\n    }\n\n    memset((void *)&uri, 0, sizeof(uri));\n    handle = (handle_data_t *)phandle;\n\n    if (handle->lwm2m_context->state != STATE_READY)\n    {\n        ATINY_LOG(LOG_INFO, \"not registered\");\n        return ATINY_CLIENT_UNREGISTERED;\n    }\n\n    (void)lwm2m_stringToUri(data_type, strlen(data_type), &uri);\n\n    atiny_mutex_lock(handle->lwm2m_context->observe_mutex);\n    lwm2m_resource_value_changed(handle->lwm2m_context, &uri);\n    atiny_mutex_unlock(handle->lwm2m_context->observe_mutex);\n\n    return ATINY_OK;\n}\n\nvoid observe_handle_ack(lwm2m_transaction_t *transacP, void *message)\n{\n    atiny_ack_callback ack_callback = (atiny_ack_callback)transacP->cfg.callback;\n    if (transacP->ack_received)\n    {\n        ack_callback((atiny_report_type_e)(transacP->cfg.type), transacP->cfg.cookie, SENT_SUCCESS);\n    }\n    else if (transacP->retrans_counter > COAP_MAX_RETRANSMIT)\n    {\n        ack_callback((atiny_report_type_e)(transacP->cfg.type), transacP->cfg.cookie, SENT_TIME_OUT);\n    }\n    else\n    {\n        ack_callback((atiny_report_type_e)(transacP->cfg.type), transacP->cfg.cookie, SENT_FAIL);\n    }\n}\n\nint atiny_reconnect(void *phandle)\n{\n    handle_data_t *handle = (handle_data_t *)phandle;\n\n\n    if (NULL == phandle)\n    {\n        ATINY_LOG(LOG_FATAL, \"Parameter null\");\n        return ATINY_ARG_INVALID;\n    }\n    handle->reconnect_flag = true;\n\n    return ATINY_OK;\n}\n\nvoid atiny_set_reboot_flag()\n{\n    g_reboot = true;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/atiny_context.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef _ATINY_CONTEXT_H\n#define _ATINY_CONTEXT_H\n#include \"liblwm2m.h\"\n#include \"atiny_lwm2m/agenttiny.h\"\n#include \"object_comm.h\"\n\n#define SERVER_URI_MAX_LEN      (64)\n#define MAX_PACKET_SIZE         (1024)\n#define SERVER_ID               (123)\n#define BIND_TIMEOUT            (10)\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n\n\n/**\n\n *@ingroup handle_data_t\n\n *Structure of agentiny hanle.\n\n */\n \n enum\n{\n    OBJ_SECURITY_INDEX = 0,\n    OBJ_SERVER_INDEX,\n    OBJ_ACCESS_CONTROL_INDEX,\n    OBJ_DEVICE_INDEX,\n    OBJ_CONNECT_INDEX,\n    OBJ_FIRMWARE_INDEX,\n    OBJ_LOCATION_INDEX,\n    OBJ_APP_INDEX,\n    OBJ_MAX_NUM,\n};\n \ntypedef struct\n{\n    lwm2m_context_t  *lwm2m_context;\n    atiny_param_t     atiny_params;\n    client_data_t     client_data;\n    lwm2m_object_t   *obj_array[OBJ_MAX_NUM];\n    int atiny_quit;\n    int reconnect_flag;\n    void *quit_sem;\n    int reboot_flag;\n    uint8_t *recv_buffer;\n} handle_data_t;\n\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif /* _ATINY_INNER_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/atiny_fota_manager.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"atiny_fota_manager.h\"\n#include \"atiny_fota_state.h\"\n#include <string.h>\n#include \"firmware_update.h\"\n#include \"ota/package.h\"\n\nstruct atiny_fota_manager_tag_s\n{\n    char *pkg_uri;\n    atiny_fota_state_e state;\n    atiny_update_result_e update_result;\n    atiny_fota_idle_state_s idle_state;\n    atiny_fota_downloading_state_s downloading_state;\n    atiny_fota_downloaded_state_s downloaded_state;\n    atiny_fota_updating_state_s updating_state;\n    atiny_fota_state_s *current;\n    pack_storage_device_api_s *device;\n    lwm2m_context_t  *lwm2m_context;\n    uint32_t cookie;\n    bool wait_ack_flag;\n    atiny_fota_state_e rpt_state;\n    ota_opt_s ota_opt;\n    bool init_flag;\n};\n\n#define PULL_ONLY 0\n\nstatic uint32_t g_firmware_cookie = 0;\n\n\nchar *atiny_fota_manager_get_pkg_uri(const atiny_fota_manager_s *thi)\n{\n    ASSERT_THIS(return NULL);\n    return thi->pkg_uri;\n}\nint atiny_fota_manager_get_state(const atiny_fota_manager_s *thi)\n{\n    ASSERT_THIS(return ATINY_FOTA_IDLE);\n    return thi->state;\n}\n\nint atiny_fota_manager_get_rpt_state(const atiny_fota_manager_s *thi)\n{\n    ASSERT_THIS(return ATINY_FOTA_IDLE);\n    return thi->rpt_state;\n}\n\nint atiny_fota_manager_get_update_result(const atiny_fota_manager_s *thi)\n{\n    ASSERT_THIS(return ATINY_FIRMWARE_UPDATE_NULL);\n    return thi->update_result;\n}\nvoid atiny_fota_manager_set_update_result(atiny_fota_manager_s *thi, atiny_update_result_e result)\n{\n    ASSERT_THIS(return);\n    thi->update_result = result;\n}\n\nint atiny_fota_manager_get_deliver_method(const atiny_fota_manager_s *thi)\n{\n    return\n        PULL_ONLY;\n}\nint atiny_fota_manager_start_download(atiny_fota_manager_s *thi, const char *uri, uint32_t len)\n{\n\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n    if(thi->state != thi->rpt_state)\n    {\n        ATINY_LOG(LOG_ERR, \"start download busy state %u rpt state %u\",\n                  thi->state, thi->rpt_state);\n        return ATINY_ERR;\n    }\n\n    if(NULL == thi->current || uri == NULL)\n    {\n        ATINY_LOG(LOG_ERR, \"null pointer\");\n        return ATINY_ERR;\n    }\n\n    if(thi->pkg_uri)\n    {\n        atiny_free(thi->pkg_uri);\n        thi->pkg_uri = NULL;\n    }\n    thi->pkg_uri = atiny_malloc(len + 1);\n    if(NULL == thi->pkg_uri)\n    {\n        ATINY_LOG(LOG_ERR, \"lwm2m_strdup fail\");\n        return ATINY_ERR;\n    }\n    memcpy(thi->pkg_uri, uri, len);\n    thi->pkg_uri[len] = '\\0';\n    ATINY_LOG(LOG_INFO, \"start download\");\n    return thi->current->start_download(thi->current, thi->pkg_uri);\n}\nint atiny_fota_manager_execute_update(atiny_fota_manager_s *thi)\n{\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    if(thi->state != thi->rpt_state)\n    {\n        ATINY_LOG(LOG_ERR, \"execute update busy state %u rpt state %u\",\n                  thi->state, thi->rpt_state);\n        return ATINY_ERR;\n    }\n\n    if(NULL == thi->current)\n    {\n        ATINY_LOG(LOG_ERR, \"current null pointer\");\n        return ATINY_ERR;\n    }\n\n    ATINY_LOG(LOG_INFO, \"excecute update\");\n    return thi->current->execute_update(thi->current);\n}\n\nint atiny_fota_manager_finish_download(atiny_fota_manager_s *thi, int result)\n{\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    if(thi->state != thi->rpt_state)\n    {\n        ATINY_LOG(LOG_ERR, \"finish download busy state %u rpt state %u\",\n                  thi->state, thi->rpt_state);\n        return ATINY_ERR;\n    }\n\n    if(NULL == thi->current)\n    {\n        ATINY_LOG(LOG_ERR, \"current null pointer\");\n        return ATINY_ERR;\n    }\n\n    ATINY_LOG(LOG_INFO, \"finish download result %d\", result);\n    return thi->current->finish_download(thi->current, result);\n}\nint atiny_fota_manager_repot_result(atiny_fota_manager_s *thi)\n{\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    if(NULL == thi->current)\n    {\n        ATINY_LOG(LOG_ERR, \"current null pointer\");\n        return ATINY_ERR;\n    }\n\n    return thi->current->repot_result(thi->current);\n}\n\n\nint atiny_fota_manager_set_state(atiny_fota_manager_s *thi, atiny_fota_state_e state)\n{\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    if(state > ATINY_FOTA_UPDATING)\n    {\n        ATINY_LOG(LOG_ERR, \"invalid download state %d\", state);\n        return ATINY_ARG_INVALID;\n    }\n\n    ATINY_LOG(LOG_INFO, \"download stat from %d to %d\", thi->state, state);\n    if(thi->state != state)\n    {\n        /*lint -e614 */\n        atiny_fota_state_s *states[ATINY_FOTA_UPDATING + 1];\n        states[ATINY_FOTA_IDLE] = ATINY_GET_STATE(thi->idle_state);\n        states[ATINY_FOTA_DOWNLOADING] = ATINY_GET_STATE(thi->downloading_state);\n        states[ATINY_FOTA_DOWNLOADED] = ATINY_GET_STATE(thi->downloaded_state);\n        states[ATINY_FOTA_UPDATING] = ATINY_GET_STATE(thi->updating_state);\n        thi->current = states[state];\n        thi->state = state;\n        thi->wait_ack_flag = false;\n        /*lint +e614 */\n    }\n    thi->rpt_state = state;\n    atiny_event_notify(ATINY_FOTA_STATE, (const char *)&thi->state, sizeof(thi->state));\n    return ATINY_OK;\n}\n\nint atiny_fota_manager_rpt_state(atiny_fota_manager_s *thi, atiny_fota_state_e rpt_state)\n{\n    lwm2m_uri_t uri;\n    const char *uri_str = \"/5/0/3\";\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    atiny_fota_manager_save_rpt_state(thi, rpt_state);\n    memset((void *)&uri, 0, sizeof(uri));\n    (void)lwm2m_stringToUri(uri_str, strlen(uri_str), &uri);\n    lwm2m_resource_value_changed(thi->lwm2m_context, &uri);\n    return ATINY_OK;\n}\n\nvoid atiny_fota_manager_save_rpt_state(atiny_fota_manager_s *thi, atiny_fota_state_e rpt_state)\n{\n\n    ASSERT_THIS(return);\n\n    ATINY_LOG(LOG_INFO, \"rpt download state %d\", rpt_state);\n    thi->rpt_state = rpt_state;\n    thi->wait_ack_flag = true;\n    thi->cookie = g_firmware_cookie++;\n}\n\n\nstatic int atiny_fota_manager_flag_read(void* buf, int32_t len)\n{\n    int (*read_flash)(ota_flash_type_e type, void *buf, int32_t len, uint32_t location) =\n                atiny_fota_manager_get_instance()->ota_opt.read_flash;\n    if (read_flash)\n    {\n        return read_flash(OTA_UPDATE_INFO, buf, len, 0);\n    }\n    ATINY_LOG(LOG_ERR, \"write_flash null\");\n    return -1;\n}\n\nstatic int atiny_fota_manager_flag_write(const void* buf, int32_t len)\n{\n    int (*write_flash)(ota_flash_type_e type, const void *buf, int32_t len, uint32_t location) =\n                atiny_fota_manager_get_instance()->ota_opt.write_flash;\n\n    if (write_flash)\n    {\n        return write_flash(OTA_UPDATE_INFO, buf, len, 0);\n    }\n    ATINY_LOG(LOG_ERR, \"write_flash null\");\n    return -1;\n}\n\n\nint atiny_fota_manager_set_storage_device(atiny_fota_manager_s *thi)\n{\n    int ret;\n    flag_op_s flag_op;\n    pack_params_s pack_param;\n\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    ret = atiny_cmd_ioctl(ATINY_GET_OTA_OPT, (char * )&thi->ota_opt, sizeof(thi->ota_opt));\n    if (ret != ATINY_OK)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_cmd_ioctl fail\");\n        return ret;\n    }\n\n    flag_op.func_flag_read = atiny_fota_manager_flag_read;\n    flag_op.func_flag_write = atiny_fota_manager_flag_write;\n    (void)flag_init(&flag_op);\n    ret = flag_upgrade_init();\n    if (ret != ATINY_OK)\n    {\n        ATINY_LOG(LOG_FATAL, \"flag_upgrade_init fail\");\n        return ret;\n    }\n\n    memcpy(&pack_param.ota_opt, &thi->ota_opt, sizeof(pack_param.ota_opt));\n    pack_param.malloc = atiny_malloc;\n    pack_param.free = atiny_free;\n    pack_param.printf = atiny_printf;\n    ret = pack_init_device(&pack_param);\n    if (ret != ATINY_OK)\n    {\n        ATINY_LOG(LOG_FATAL, \"pack_init_device fail\");\n        return ret;\n    }\n\n    thi->device = pack_get_device();\n    return atiny_fota_idle_state_int_report_result(&thi->idle_state);\n}\n\npack_storage_device_api_s *atiny_fota_manager_get_storage_device(atiny_fota_manager_s *thi)\n{\n    ASSERT_THIS(return NULL);\n    return thi->device;\n}\n\n\nvoid atiny_fota_manager_update_notify(firmware_update_rst_e rst, void *param)\n{\n    atiny_fota_manager_s *thi = ( atiny_fota_manager_s *)param;\n    (void)atiny_fota_manager_finish_download(thi, rst);\n}\nvoid atiny_fota_manager_init(atiny_fota_manager_s *thi)\n{\n    memset(thi, 0, sizeof(*thi));\n    atiny_fota_idle_state_init(&thi->idle_state, thi);\n    atiny_fota_downloading_state_init(&thi->downloading_state, thi);\n    atiny_fota_downloaded_state_init(&thi->downloaded_state, thi);\n    atiny_fota_updating_state_init(&thi->updating_state, thi);\n    thi->current = ATINY_GET_STATE(thi->idle_state);\n    set_firmware_update_notify(atiny_fota_manager_update_notify, thi);\n    atiny_event_notify(ATINY_FOTA_STATE, (const char *)&thi->state, sizeof(thi->state));\n    thi->init_flag = true;\n}\n\nvoid atiny_fota_manager_destroy(atiny_fota_manager_s *thi)\n{\n    ASSERT_THIS(return);\n\n    if(thi->pkg_uri)\n    {\n        atiny_free(thi->pkg_uri);\n    }\n    /*lint -e668 */\n    memset(thi, 0, sizeof(*thi));\n    /*lint +e668 */\n}\n\nint atiny_fota_manager_set_lwm2m_context(atiny_fota_manager_s *thi, lwm2m_context_t  *lwm2m_context)\n{\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n    thi->lwm2m_context = lwm2m_context;\n    return ATINY_OK;\n}\nlwm2m_context_t *atiny_fota_manager_get_lwm2m_context(atiny_fota_manager_s *thi)\n{\n    ASSERT_THIS(return NULL);\n    return thi->lwm2m_context;\n}\n\nstatic int atiny_fota_manager_rcv_notify_ack(atiny_fota_manager_s *thi, data_send_status_e status)\n{\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    if(NULL == thi->current)\n    {\n        ATINY_LOG(LOG_ERR, \"current null pointer\");\n        return ATINY_ERR;\n    }\n\n    return thi->current->recv_notify_ack(thi->current, status);\n}\n\nstatic void atiny_fota_manager_notify_ack_callback(atiny_report_type_e type, int cookie, data_send_status_e status)\n{\n    ATINY_LOG(LOG_INFO, \"download state ack type %d rev cookie %u expect cookie %u status %d, rpt stat %d\", type,  (uint32_t)cookie, atiny_fota_manager_get_instance()->cookie,  status,\n              atiny_fota_manager_get_instance()->rpt_state);\n    if((atiny_fota_manager_get_instance()->wait_ack_flag) && atiny_fota_manager_get_instance()->cookie == cookie)\n    {\n        (void)atiny_fota_manager_rcv_notify_ack(atiny_fota_manager_get_instance(), status);\n        atiny_fota_manager_get_instance()->wait_ack_flag = false;\n    }\n\n}\n\n\nvoid atiny_fota_manager_get_data_cfg(const atiny_fota_manager_s *thi, lwm2m_data_cfg_t *data_cfg)\n{\n    ASSERT_THIS(return);\n    if(NULL == data_cfg)\n    {\n        ATINY_LOG(LOG_ERR, \"current null pointer\");\n        return;\n    }\n\n    data_cfg->callback = (lwm2m_data_process)atiny_fota_manager_notify_ack_callback;\n    data_cfg->cookie = thi->cookie;\n    // ATINY_LOG(LOG_INFO, \"download cookie %d\", data_cfg->cookie);\n    data_cfg->type = FIRMWARE_UPDATE_STATE;\n}\n\n\n\nstatic atiny_fota_manager_s g_fota_manager;\natiny_fota_manager_s *atiny_fota_manager_get_instance(void)\n{\n    atiny_fota_manager_s *manager = &g_fota_manager;\n    if(manager->init_flag)\n    {\n        return manager;\n    }\n\n    atiny_fota_manager_init(manager);\n    return manager;\n}\n\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/atiny_fota_manager.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2014 Bosch Software Innovations GmbH, Germany.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Bosch Software Innovations GmbH - Please refer to git log\n *\n *******************************************************************************/\n\n#ifndef ATINY_FOTA_MANAGER_H_\n#define ATINY_FOTA_MANAGER_H_\n\n#include \"atiny_lwm2m/agenttiny.h\"\n#include \"liblwm2m.h\"\n#include \"ota/package.h\"\n\n#define array_size(a) (sizeof(a)/sizeof(*(a)))\n\n\n/*\n0: Initial value. Once the updating process is initiated (Download /Update), this Resource MUST be reset to Initial value.\n1: Firmware updated successfully,\n2: Not enough flash memory for the new firmware package.\n3. Out of RAM during downloading process.\n4: Connection lost during downloading process.\n5: Integrity check failure for new downloaded package.\n6: Unsupported package type.\n7: Invalid URI\n8: Firmware update failed\n9: Unsupported protocol\n\n*/\n\ntypedef int atiny_fota_state_e;\nenum //atiny_fota_state_e\n{\n    ATINY_FOTA_IDLE = 0,\n    ATINY_FOTA_DOWNLOADING,\n    ATINY_FOTA_DOWNLOADED,\n    ATINY_FOTA_UPDATING\n};\n\n\ntypedef int atiny_update_result_e;\nenum\n{\n    ATINY_FIRMWARE_UPDATE_NULL = 0,\n    ATINY_FIRMWARE_UPDATE_SUCCESS = 1,\n    ATINY_FIRMWARE_UPDATE_FAIL = 8\n};\n\nstruct atiny_fota_manager_tag_s;\ntypedef struct atiny_fota_manager_tag_s atiny_fota_manager_s;\n\n#ifdef __cplusplus\n    extern \"C\" {\n#endif\n\nchar * atiny_fota_manager_get_pkg_uri(const atiny_fota_manager_s *thi);\nint atiny_fota_manager_get_state(const atiny_fota_manager_s *thi);\nint atiny_fota_manager_get_update_result(const atiny_fota_manager_s *thi);\nvoid atiny_fota_manager_set_update_result(atiny_fota_manager_s *thi, atiny_update_result_e result);\nint atiny_fota_manager_get_deliver_method(const atiny_fota_manager_s *thi);\nint atiny_fota_manager_start_download(atiny_fota_manager_s *thi, const char *uri, uint32_t len);\nint atiny_fota_manager_execute_update(atiny_fota_manager_s *thi);\nint atiny_fota_manager_repot_result(atiny_fota_manager_s *thi);\nint atiny_fota_manager_set_state(atiny_fota_manager_s *thi, atiny_fota_state_e state);\nint atiny_fota_manager_set_storage_device(atiny_fota_manager_s *thi);\npack_storage_device_api_s *atiny_fota_manager_get_storage_device(atiny_fota_manager_s *thi);\nint atiny_fota_manager_set_lwm2m_context(atiny_fota_manager_s *thi, lwm2m_context_t*  lwm2m_context);\nlwm2m_context_t* atiny_fota_manager_get_lwm2m_context(atiny_fota_manager_s *thi);\nvoid atiny_fota_manager_get_data_cfg(const atiny_fota_manager_s *thi, lwm2m_data_cfg_t *data_cfg);\n\nvoid atiny_fota_manager_destroy(atiny_fota_manager_s *thi);\nint atiny_fota_manager_rpt_state(atiny_fota_manager_s *thi, atiny_fota_state_e rpt_state);\nvoid atiny_fota_manager_save_rpt_state(atiny_fota_manager_s *thi, atiny_fota_state_e rpt_state);\n\n\natiny_fota_state_e atiny_fota_manager_get_rpt_state(const atiny_fota_manager_s *thi);\n\n\n\natiny_fota_manager_s * atiny_fota_manager_get_instance(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n\n#endif /* ATINY_FOTA_MANAGER_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/atiny_fota_state.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"atiny_fota_state.h\"\n#include <string.h>\n#include \"firmware_update.h\"\n\n\n//TODO:set the update detail result\nstatic int atiny_fota_state_default_handle(struct atiny_fota_state_tag_s *thi)\n{\n    ASSERT_THIS(return ATINY_ERR);\n\n    ATINY_LOG(LOG_ERR, \"err state handle state %d\", thi->manager ?\n              atiny_fota_manager_get_state(thi->manager) : -1);\n    return ATINY_ERR;\n}\n\n\nvoid atiny_fota_state_init(atiny_fota_state_s *thi, atiny_fota_manager_s *manager)\n{\n    thi->start_download = (int (*)(struct atiny_fota_state_tag_s * thi, const char *uri))atiny_fota_state_default_handle;\n    thi->execute_update = atiny_fota_state_default_handle;\n    thi->finish_download = (int (*)(struct atiny_fota_state_tag_s * thi, int result))atiny_fota_state_default_handle;\n    thi->repot_result = atiny_fota_state_default_handle;\n    thi->recv_notify_ack = (int (*)(struct atiny_fota_state_tag_s  * thi, data_send_status_e status))atiny_fota_state_default_handle;\n    thi->manager = manager;\n}\n\n\nstatic int atiny_fota_start_download(atiny_fota_state_s *thi, const char *uri)\n{\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    atiny_fota_manager_set_update_result(thi->manager, ATINY_FIRMWARE_UPDATE_NULL);\n\n\n    return atiny_fota_manager_rpt_state(thi->manager, ATINY_FOTA_DOWNLOADING);\n}\n\nstatic int atiny_fota_idle_state_recv_notify_ack(atiny_fota_state_s *thi, data_send_status_e status)\n{\n    int ret;\n    atiny_fota_state_e rpt_state;\n\n    if(SENT_SUCCESS != status)\n    {\n        ATINY_LOG(LOG_ERR, \"idle state notify fail %d\", status);\n        atiny_fota_manager_set_update_result(thi->manager, ATINY_FIRMWARE_UPDATE_FAIL);\n        return atiny_fota_manager_set_state(thi->manager, ATINY_FOTA_IDLE);\n    }\n\n    rpt_state = atiny_fota_manager_get_rpt_state(thi->manager) ;\n\n    //idle and downloaded rpt ack\n    if((ATINY_FOTA_IDLE == rpt_state) || (ATINY_FOTA_DOWNLOADED == rpt_state))\n    {\n        return atiny_fota_manager_set_state(thi->manager, rpt_state);\n    }\n\n    //updating rpt ack\n    if(ATINY_FOTA_UPDATING == rpt_state)\n    {\n        ATINY_LOG(LOG_ERR, \"idle state recv updaing state ack\");\n        return ATINY_ERR;\n    }\n\n    //downloading rpt ack\n    //TODO, return then proper result\n    ret = start_firmware_download(atiny_fota_manager_get_lwm2m_context(thi->manager), atiny_fota_manager_get_pkg_uri(thi->manager),\n                                  atiny_fota_manager_get_storage_device(thi->manager));\n    if(ret  == ATINY_OK)\n    {\n        return atiny_fota_manager_set_state(thi->manager, ATINY_FOTA_DOWNLOADING);\n\n    }\n    ATINY_LOG(LOG_ERR, \"start_firmware_download fail %d\", ret);\n    atiny_fota_manager_set_update_result(thi->manager, ATINY_FIRMWARE_UPDATE_FAIL);\n    return atiny_fota_manager_rpt_state(thi->manager, ATINY_FOTA_IDLE);\n\n}\n\nstatic int atiny_fota_idle_state_get_result(void)\n{\n   upgrade_state_e state;\n\n   if(flag_upgrade_get_result(&state) != ATINY_OK)\n   {\n        ATINY_LOG(LOG_ERR, \"ota_check_update_state fail\");\n        return ATINY_ERR;\n   }\n\n   return (OTA_SUCCEED == state) ? ATINY_OK : ATINY_ERR;\n}\n\nint atiny_fota_idle_state_int_report_result(atiny_fota_idle_state_s *thi)\n{\n    lwm2m_observe_info_t observe_info;\n    int ret = ATINY_ERR;\n    int result = ATINY_ERR;\n\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    thi->report_flag = false;\n    memset(&observe_info, 0, sizeof(lwm2m_observe_info_t));\n    if(flag_read(FLAG_APP, &observe_info, sizeof(observe_info)) != ATINY_OK)\n    {\n        ATINY_LOG(LOG_ERR, \"flag_write fail\");\n        goto EXIT;\n    }\n\n    if(0 == observe_info.tokenLen)\n    {\n        return ATINY_OK;\n    }\n\n    ret = atiny_fota_idle_state_get_result();\n    if(ret != ATINY_OK)\n    {\n        ATINY_LOG(LOG_ERR, \"get_software_result fail\");\n    }\n\n    result = ATINY_OK;\n    thi->report_result = ret;\n    thi->report_flag = true;\n    memcpy(&thi->observe_info, &observe_info, sizeof(thi->observe_info));\n    ATINY_LOG(LOG_INFO, \"need to rpt result %d\", ret);\nEXIT:\n    memset(&observe_info, 0, sizeof(observe_info));\n    if(flag_write(FLAG_APP, &observe_info, sizeof(observe_info)) != ATINY_OK)\n    {\n        ATINY_LOG(LOG_ERR, \"flag_write fail\");\n    }\n    return result;\n}\n\nstatic int atiny_fota_idle_state_report_result(atiny_fota_state_s *thi)\n{\n    int ret = ATINY_ERR;\n    atiny_fota_idle_state_s *idle_stat = (atiny_fota_idle_state_s *)thi;\n    int state;\n    lwm2m_data_cfg_t dataCfg = {0};\n\n\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    if(!idle_stat->report_flag)\n    {\n        return ATINY_OK;\n    }\n\n    idle_stat->report_flag = false;\n\n    state = ((ATINY_OK == idle_stat->report_result) ?  ATINY_FOTA_IDLE : ATINY_FOTA_DOWNLOADED);\n    atiny_fota_manager_set_update_result(thi->manager, (ATINY_OK == idle_stat->report_result) ? ATINY_FIRMWARE_UPDATE_SUCCESS : ATINY_FIRMWARE_UPDATE_FAIL);\n    atiny_fota_manager_save_rpt_state(thi->manager, state);\n    atiny_fota_manager_get_data_cfg(thi->manager, &dataCfg);\n    ret = lwm2m_send_notify(atiny_fota_manager_get_lwm2m_context(thi->manager),\n                            &idle_stat->observe_info, state, &dataCfg);\n    ATINY_LOG(LOG_INFO, \"lwm2m_send_notify result %d, state %d\", ret, state);\n    return ret;\n}\n\n\nvoid atiny_fota_idle_state_init(atiny_fota_idle_state_s *thi, atiny_fota_manager_s *manager)\n{\n    memset(thi, 0, sizeof(*thi));\n    atiny_fota_state_init(&thi->interface, manager);\n    thi->interface.start_download = atiny_fota_start_download;\n    thi->interface.repot_result = atiny_fota_idle_state_report_result;\n    thi->interface.recv_notify_ack = atiny_fota_idle_state_recv_notify_ack;\n}\nstatic int atiny_fota_downloading_state_finish_download(atiny_fota_state_s *thi, int result)\n{\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n    if(ATINY_OK != result)\n    {\n        atiny_fota_manager_set_update_result(thi->manager, ATINY_FIRMWARE_UPDATE_FAIL);\n    }\n\n    return atiny_fota_manager_rpt_state(thi->manager, (ATINY_OK == result) ? ATINY_FOTA_DOWNLOADED : ATINY_FOTA_IDLE);\n}\n\n\nstatic int atiny_fota_downloading_state_recv_notify_ack(atiny_fota_state_s *thi, data_send_status_e status)\n{\n    atiny_fota_state_e rpt_state;\n\n    if(SENT_SUCCESS != status)\n    {\n        ATINY_LOG(LOG_ERR, \"downloading state notify ack fail %d\", status);\n        atiny_fota_manager_set_update_result(thi->manager, ATINY_FIRMWARE_UPDATE_FAIL);\n        return atiny_fota_manager_set_state(thi->manager, ATINY_FOTA_IDLE);\n    }\n\n    rpt_state = atiny_fota_manager_get_rpt_state(thi->manager);\n    if((ATINY_FOTA_IDLE == rpt_state) || (ATINY_FOTA_DOWNLOADED == rpt_state))\n    {\n        return atiny_fota_manager_set_state(thi->manager, rpt_state);\n    }\n    else\n    {\n        ATINY_LOG(LOG_ERR, \"recv notify ack err  in downloading state, rpt state %d\", rpt_state);\n        return ATINY_ERR;\n    }\n}\nvoid atiny_fota_downloading_state_init(atiny_fota_downloading_state_s *thi, atiny_fota_manager_s *manager)\n{\n    atiny_fota_state_init(&thi->interface, manager);\n    thi->interface.finish_download = atiny_fota_downloading_state_finish_download;\n    thi->interface.recv_notify_ack = atiny_fota_downloading_state_recv_notify_ack;\n}\n\nstatic int atiny_fota_downloaded_state_execute_update(atiny_fota_state_s *thi)\n{\n    atiny_fota_state_e rpt_state = ATINY_FOTA_UPDATING;\n\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n\n    if(atiny_fota_manager_get_update_result(thi->manager) != ATINY_FIRMWARE_UPDATE_NULL)\n    {\n        rpt_state = ATINY_FOTA_IDLE;\n        atiny_fota_manager_set_update_result(thi->manager, ATINY_FIRMWARE_UPDATE_FAIL);\n    }\n\n    return atiny_fota_manager_rpt_state(thi->manager, rpt_state);\n}\n\n\nstatic int atiny_fota_downloaded_state_recv_notify_ack(atiny_fota_state_s *thi, data_send_status_e status)\n{\n    int ret;\n    atiny_fota_state_e rpt_state;\n    lwm2m_observe_info_t observe_info;\n    pack_storage_device_api_s *device;\n\n    ASSERT_THIS(return ATINY_ARG_INVALID);\n    if(SENT_SUCCESS != status)\n    {\n        ATINY_LOG(LOG_ERR, \"downloaded state notify fail %d\", status);\n        atiny_fota_manager_set_update_result(thi->manager, ATINY_FIRMWARE_UPDATE_FAIL);\n        return atiny_fota_manager_set_state(thi->manager, ATINY_FOTA_IDLE);\n    }\n\n    rpt_state = atiny_fota_manager_get_rpt_state(thi->manager);\n    //rpt downloading state ack\n    if(ATINY_FOTA_DOWNLOADING == rpt_state)\n    {\n        ret = start_firmware_download(atiny_fota_manager_get_lwm2m_context(thi->manager), atiny_fota_manager_get_pkg_uri(thi->manager),\n                                      atiny_fota_manager_get_storage_device(thi->manager));\n        if(ret  == ATINY_OK)\n        {\n            return atiny_fota_manager_set_state(thi->manager, ATINY_FOTA_DOWNLOADING);\n\n        }\n        ATINY_LOG(LOG_ERR, \"start_firmware_download fail %d\", ret);\n        atiny_fota_manager_set_update_result(thi->manager, ATINY_FIRMWARE_UPDATE_FAIL);\n        (void)atiny_fota_manager_rpt_state(thi->manager, ATINY_FOTA_IDLE);\n        return ATINY_ERR;\n    }\n\n    //rpt idle state ack\n    if(ATINY_FOTA_IDLE == rpt_state)\n    {\n        return atiny_fota_manager_set_state(thi->manager, rpt_state);\n    }\n\n    //rpt downloaded state ack\n    if(ATINY_FOTA_DOWNLOADED == rpt_state)\n    {\n        return ATINY_OK;\n    }\n\n    //rpt updating state ack\n    if(lwm2m_get_observe_info(atiny_fota_manager_get_lwm2m_context(thi->manager), &observe_info) != COAP_NO_ERROR\n            || 0 == observe_info.tokenLen)\n    {\n        ATINY_LOG(LOG_ERR, \"lwm2m_get_observe_info fail\");\n        goto EXIT_DOWNLOADED;\n    }\n\n    device = atiny_fota_manager_get_storage_device(thi->manager);\n    if((NULL == device) || (NULL == device->active_software) || (device->active_software(device) != ATINY_OK))\n    {\n        ATINY_LOG(LOG_ERR, \"active_software fail\");\n        goto EXIT_DOWNLOADED;\n    }\n\n    if(flag_write(FLAG_APP, &observe_info, sizeof(observe_info)) != ATINY_OK)\n    {\n        ATINY_LOG(LOG_ERR, \"flag_write fail\");\n        goto EXIT_DOWNLOADED;\n    }\n\n    atiny_set_reboot_flag();\n    return atiny_fota_manager_set_state(thi->manager, ATINY_FOTA_UPDATING);\n\nEXIT_DOWNLOADED:\n\n    atiny_fota_manager_set_update_result(thi->manager, ATINY_FIRMWARE_UPDATE_FAIL);\n    (void)atiny_fota_manager_rpt_state(thi->manager, ATINY_FOTA_DOWNLOADED);\n    return ATINY_ERR;\n}\n\n\nvoid atiny_fota_downloaded_state_init(atiny_fota_downloaded_state_s *thi, atiny_fota_manager_s *manager)\n{\n    atiny_fota_state_init(&thi->interface, manager);\n    thi->interface.start_download = atiny_fota_start_download;\n    thi->interface.execute_update = atiny_fota_downloaded_state_execute_update;\n    thi->interface.recv_notify_ack = atiny_fota_downloaded_state_recv_notify_ack;\n}\n\nvoid atiny_fota_updating_state_init(atiny_fota_updating_state_s *thi, atiny_fota_manager_s *manager)\n{\n    atiny_fota_state_init(&thi->interface, manager);\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/atiny_fota_state.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2014 Bosch Software Innovations GmbH, Germany.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Bosch Software Innovations GmbH - Please refer to git log\n *\n *******************************************************************************/\n\n#ifndef ATINY_FOTA_STATE_H_\n#define ATINY_FOTA_STATE_H_\n#include \"atiny_fota_manager.h\"\n#include \"log/atiny_log.h\"\n#include \"object_comm.h\"\n#include \"flag_manager.h\"\n#include \"upgrade_flag.h\"\n\n\n\n#define ASSERT_THIS(do_something) \\\n        if(NULL == thi)\\\n        {\\\n            ATINY_LOG(LOG_ERR, \"this null pointer\");\\\n            do_something;\\\n        }\n\n#define ATINY_GET_STATE(state) (&((state).interface))\n\n#define CALL_MEM_FUNCTION_R(object, func,  ret, ...) do\\\n{\\\n    if(NULL != (object) && (NULL != (object)->func))\\\n    {\\\n        (ret) = (object)->func(__VA_ARGS__);\\\n    }\\\n}while(0)\n\n\ntypedef struct atiny_fota_state_tag_s\n{\n    int (*start_download)(struct atiny_fota_state_tag_s * thi, const char *uri);\n    int (*execute_update)(struct atiny_fota_state_tag_s * thi);\n    int (*finish_download)(struct atiny_fota_state_tag_s * thi, int result);\n    int (*repot_result)(struct atiny_fota_state_tag_s *thi);\n    int (*recv_notify_ack)(struct atiny_fota_state_tag_s *thi, data_send_status_e status);\n    atiny_fota_manager_s *manager;\n}atiny_fota_state_s;\n\ntypedef struct\n{\n    atiny_fota_state_s interface;\n    lwm2m_observe_info_t observe_info;\n    int report_result;\n    bool report_flag;\n}atiny_fota_idle_state_s;\n\ntypedef struct atiny_fota_downloading_state_tag_s\n{\n    atiny_fota_state_s interface;\n}atiny_fota_downloading_state_s;\n\ntypedef atiny_fota_downloading_state_s atiny_fota_downloaded_state_s;\ntypedef atiny_fota_downloading_state_s atiny_fota_updating_state_s;\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\nvoid atiny_fota_state_init(atiny_fota_state_s *thi, atiny_fota_manager_s *manager);\n\nvoid atiny_fota_idle_state_init(atiny_fota_idle_state_s *thi, atiny_fota_manager_s *manager);\nint atiny_fota_idle_state_int_report_result(atiny_fota_idle_state_s * thi);\n\n\n\nvoid atiny_fota_downloading_state_init(atiny_fota_downloading_state_s *thi, atiny_fota_manager_s *manager);\n\nvoid atiny_fota_downloaded_state_init(atiny_fota_downloaded_state_s *thi, atiny_fota_manager_s *manager);\n\nvoid atiny_fota_updating_state_init(atiny_fota_updating_state_s *thi, atiny_fota_manager_s *manager);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ATINY_FOTA_STATE_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/atiny_rpt.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"liblwm2m.h\"\n#include \"atiny_rpt.h\"\n#include \"log/atiny_log.h\"\n\ntypedef struct _atiny_rpt_list_t\n{\n    atiny_dl_list node;\n    lwm2m_uri_t uri;\n    atiny_dl_list rpt_list;\n    uint32_t rpt_node_cnt;\n    uint32_t max_cnt;\n} atiny_rpt_list_t;\n\ntypedef struct\n{\n    atiny_dl_list list;\n    data_report_t data;\n} atiny_rpt_node_t;\n\nstatic atiny_dl_list g_atiny_rpt_table;\nstatic void *g_mutex = NULL;\n\n// TODO: when free, recorrect then callback code\n\nstatic int atiny_is_uri_equal(const lwm2m_uri_t *uri0, const lwm2m_uri_t *uri1)\n{\n    if (LWM2M_URI_IS_SET_RESOURCE(uri0) && LWM2M_URI_IS_SET_RESOURCE(uri1))\n    {\n        return (uri0->objectId == uri1->objectId) && (uri0->instanceId == uri1->instanceId)\n               && (uri0->resourceId == uri1->resourceId);\n    }\n\n    return (uri0->objectId == uri1->objectId) && (uri0->instanceId == uri1->instanceId);\n}\n\nstatic atiny_rpt_list_t *atiny_find_rpt_list(const lwm2m_uri_t *uri)\n{\n    atiny_dl_list *item;\n    atiny_dl_list *next;\n\n    ATINY_DL_LIST_FOR_EACH_SAFE(item, next, &g_atiny_rpt_table)\n    {\n        atiny_rpt_list_t *data_node = (atiny_rpt_list_t *)item;\n\n        if (atiny_is_uri_equal(&data_node->uri, uri))\n        {\n            return data_node;\n        }\n    }\n\n    return NULL;\n}\n\nstatic void atiny_free_list(atiny_dl_list *list,  void(*free_data)(atiny_dl_list *node, void *param),  void *param)\n{\n    atiny_dl_list *item;\n    atiny_dl_list *next;\n\n    ATINY_DL_LIST_FOR_EACH_SAFE(item, next, list)\n    {\n        atiny_list_delete(item);\n\n        if (free_data != NULL)\n        {\n            free_data(item, param);\n        }\n        lwm2m_free(item);\n    }\n}\n\nstatic void atiny_visit_list(atiny_dl_list *list,  void(*visit_data)(atiny_dl_list *node, void *param), void *param)\n{\n    atiny_dl_list *item;\n    atiny_dl_list *next;\n\n    ATINY_DL_LIST_FOR_EACH_SAFE(item, next, list)\n    {\n        visit_data(item, param);\n    }\n}\n\nstatic void atiny_clear_rpt_list_node_data(atiny_dl_list *node,  void *result)\n{\n    atiny_rpt_node_t *rpt_node = (atiny_rpt_node_t *)node;\n\n    if (rpt_node->data.callback)\n    {\n        rpt_node->data.callback(rpt_node->data.type,\n                                rpt_node->data.cookie, (data_send_status_e)(long)result);\n    }\n\n    if (rpt_node->data.buf)\n    {\n        lwm2m_free(rpt_node->data.buf);\n        rpt_node->data.buf = NULL;\n    }\n}\n\nstatic void atiny_clear_rpt_list(atiny_dl_list *node, void *result)\n{\n    atiny_rpt_list_t *rpt_list = (atiny_rpt_list_t *)node;\n    atiny_free_list(&rpt_list->rpt_list, atiny_clear_rpt_list_node_data, result);\n}\n\nstatic void atiny_notify_stack_rpt_data_change(atiny_dl_list *node, void *context)\n{\n    atiny_rpt_list_t *rpt_list = (atiny_rpt_list_t *)node;\n\n    if (!atiny_list_empty(&rpt_list->rpt_list))\n    {\n        ATINY_LOG(LOG_INFO, \"data change cnt %d \"URI_FORMAT,  rpt_list->rpt_node_cnt, URI_LOG_PARAM(&rpt_list->uri));\n        lwm2m_resource_value_changed(context, &rpt_list->uri);\n    }\n}\n\nint atiny_init_rpt(void)\n{\n    atiny_list_init(&g_atiny_rpt_table);\n    g_mutex = atiny_mutex_create();\n\n    if (NULL == g_mutex)\n    {\n        ATINY_LOG(LOG_ERR, \"atiny_mutex_create fail\");\n        return ATINY_RESOURCE_NOT_ENOUGH;;\n    }\n\n    return ATINY_OK;\n}\n\nint atiny_add_rpt_uri(const lwm2m_uri_t *uri,  rpt_list_t *list)\n{\n    atiny_rpt_list_t *rpt_list  = NULL;\n    int ret = ATINY_ARG_INVALID;\n\n    if (NULL == uri)\n    {\n        ATINY_LOG(LOG_ERR, \"null point\");\n        return ATINY_ARG_INVALID;\n    }\n\n    if (NULL == list)\n    {\n        ATINY_LOG(LOG_ERR, \"null point\");\n        return ATINY_ARG_INVALID;\n    }\n\n    *list = NULL;\n\n    atiny_mutex_lock(g_mutex);\n\n    do\n    {\n        rpt_list = atiny_find_rpt_list(uri);\n\n        if (rpt_list != NULL)\n        {\n            ATINY_LOG(LOG_ERR, \"uri exist,\" URI_FORMAT, URI_LOG_PARAM(uri));\n            break;\n        }\n\n        rpt_list = lwm2m_malloc(sizeof(*rpt_list));\n\n        if (NULL == rpt_list)\n        {\n            ATINY_LOG(LOG_ERR, \"lwm2m_malloc fail,\" URI_FORMAT, URI_LOG_PARAM(uri));\n            break;\n        }\n\n        memset(rpt_list, 0, sizeof(*rpt_list));\n        atiny_list_init(&rpt_list->rpt_list);\n        memcpy(&rpt_list->uri, uri, sizeof(rpt_list->uri));\n        rpt_list->max_cnt = MAX_BUFFER_REPORT_CNT;\n        atiny_list_insert_tail(&g_atiny_rpt_table, &rpt_list->node);\n        ret = ATINY_OK;\n\n    }\n    while (0);\n\n    atiny_mutex_unlock(g_mutex);\n\n    *list = rpt_list;\n\n    return ret;\n}\n\nint atiny_rm_rpt_uri(const lwm2m_uri_t *uri)\n{\n\n    int ret = ATINY_ARG_INVALID;\n\n    if (NULL == uri)\n    {\n        ATINY_LOG(LOG_ERR, \"null point\");\n        return ATINY_ARG_INVALID;\n    }\n\n    atiny_mutex_lock(g_mutex);\n\n    do\n    {\n        atiny_rpt_list_t *rpt_list  = NULL;\n        rpt_list = atiny_find_rpt_list(uri);\n\n        if (NULL == rpt_list)\n        {\n            ATINY_LOG(LOG_ERR, \"uri not exit,\" URI_FORMAT, URI_LOG_PARAM(uri));\n            break;\n        }\n\n        atiny_list_delete(&rpt_list->node);\n        atiny_free_list(&rpt_list->rpt_list, atiny_clear_rpt_list_node_data,  (void *)NOT_SENT);\n        lwm2m_free(rpt_list);\n\n        ret = ATINY_OK;\n    }\n    while (0);\n\n    atiny_mutex_unlock(g_mutex);\n\n    return ret;\n}\n\nint atiny_dequeue_rpt_data(rpt_list_t rpt_list,  data_report_t *data)\n{\n    int ret = ATINY_RESOURCE_NOT_FOUND;\n\n    if (NULL == rpt_list || (NULL == data))\n    {\n        ATINY_LOG(LOG_ERR, \"null point\");\n        return ATINY_ARG_INVALID;\n    }\n\n    atiny_mutex_lock(g_mutex);\n\n    do\n    {\n        atiny_rpt_node_t *data_node;\n\n        if (atiny_list_empty(&rpt_list->rpt_list))\n        {\n\n            ATINY_LOG(LOG_INFO, \"dequeue empty rpt list\");\n            break;\n        }\n\n        data_node = (atiny_rpt_node_t *)rpt_list->rpt_list.next;\n        atiny_list_delete(&data_node->list);\n        rpt_list->rpt_node_cnt--;\n\n        memcpy((void *)data, (void *)&data_node->data, sizeof(*data));\n        lwm2m_free(data_node);\n\n        ret = ATINY_OK;\n    }\n    while (0);\n\n    atiny_mutex_unlock(g_mutex);\n\n    return ret;\n}\n\nint atiny_queue_rpt_data(const lwm2m_uri_t *uri, const data_report_t *data)\n{\n    int ret = ATINY_MALLOC_FAILED;\n\n    if ((NULL == uri) || (NULL == data))\n    {\n        ATINY_LOG(LOG_ERR, \"null point\");\n        return ATINY_ARG_INVALID;\n    }\n\n    atiny_mutex_lock(g_mutex);\n\n    do\n    {\n        atiny_rpt_list_t *rpt_list;\n        atiny_rpt_node_t *data_node;\n\n        rpt_list = atiny_find_rpt_list(uri);\n\n        if (NULL == rpt_list)\n        {\n            ATINY_LOG(LOG_INFO, \"uri rpt list not exit,\" URI_FORMAT, URI_LOG_PARAM(uri));\n            ret = ATINY_RESOURCE_NOT_FOUND;\n            break;\n        }\n\n        if (rpt_list->rpt_node_cnt >= rpt_list->max_cnt)\n        {\n            ATINY_LOG(LOG_INFO, \"uri rpt exceed rpt cnt %d max cnt %d,\" URI_FORMAT,\n                      rpt_list->rpt_node_cnt, rpt_list->max_cnt, URI_LOG_PARAM(uri));\n            ret = ATINY_RESOURCE_NOT_ENOUGH;\n            break;\n        }\n\n        data_node = lwm2m_malloc(sizeof(*data_node));\n\n        if (NULL == data_node)\n        {\n            ATINY_LOG(LOG_ERR, \"malloc fail,\" URI_FORMAT, URI_LOG_PARAM(uri));\n            break;\n        }\n\n        memset((void *)&data_node->list, 0, sizeof(data_node->list));\n        memcpy((void *)&data_node->data, (void *)data, sizeof(data_node->data));\n        atiny_list_insert_tail(&rpt_list->rpt_list, &data_node->list);\n        rpt_list->rpt_node_cnt++;\n\n        ret = ATINY_OK;\n\n    }\n    while (0);\n\n    atiny_mutex_unlock(g_mutex);\n\n    return ret;\n\n}\n\nint atiny_clear_rpt_data(const lwm2m_uri_t *uri, int result)\n{\n    int ret = ATINY_RESOURCE_NOT_FOUND;\n\n    if (NULL == uri)\n    {\n        ATINY_LOG(LOG_ERR, \"null point\");\n        return ATINY_ARG_INVALID;\n    }\n\n    atiny_mutex_lock(g_mutex);\n\n    do\n    {\n        atiny_rpt_list_t *rpt_list;\n\n        rpt_list = atiny_find_rpt_list(uri);\n\n        if (NULL == rpt_list)\n        {\n            ATINY_LOG(LOG_ERR, \"uri rpt list not exit,\" URI_FORMAT, URI_LOG_PARAM(uri));\n            break;\n        }\n\n        atiny_free_list(&rpt_list->rpt_list, atiny_clear_rpt_list_node_data, (void *)result);\n        rpt_list->rpt_node_cnt = 0;\n\n        ret = ATINY_OK;\n    }\n    while (0);\n\n    atiny_mutex_unlock(g_mutex);\n\n    return ret;\n}\n\nint atiny_step_rpt(lwm2m_context_t *context)\n{\n    atiny_mutex_lock(g_mutex);\n    atiny_visit_list(&g_atiny_rpt_table, atiny_notify_stack_rpt_data_change, context);\n    atiny_mutex_unlock(g_mutex);\n    return ATINY_OK;\n}\n\nvoid atiny_destroy_rpt(void)\n{\n    atiny_free_list(&g_atiny_rpt_table, atiny_clear_rpt_list, (void *)NOT_SENT);\n    atiny_mutex_destroy(g_mutex);\n    g_mutex = NULL;\n}\n\nint atiny_set_max_rpt_cnt(const lwm2m_uri_t *uri, uint32_t max_rpt_cnt)\n{\n    int ret = ATINY_RESOURCE_NOT_FOUND;\n\n    atiny_mutex_lock(g_mutex);\n\n    do\n    {\n        atiny_rpt_list_t *rpt_list;\n\n        rpt_list = atiny_find_rpt_list(uri);\n\n        if (NULL == rpt_list)\n        {\n            ATINY_LOG(LOG_ERR, \"uri rpt list not exit,\" URI_FORMAT, URI_LOG_PARAM(uri));\n            break;\n        }\n\n        rpt_list->max_cnt = max_rpt_cnt;\n        ret = ATINY_OK;\n    }\n    while (0);\n\n    atiny_mutex_unlock(g_mutex);\n\n    return ret;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/atiny_rpt.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef ATINY_RPT_H\n#define ATINY_RPT_H\n#include \"atiny_lwm2m/agenttiny.h\"\n#include \"agent_list.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define URI_FORMAT \"uri(flag:0x%x, objId:%d, instId:%d, resId:%d)\"\n#define URI_LOG_PARAM(uri) (uri)->flag, (uri)->objectId, (uri)->instanceId, (uri)->resourceId\n\nATINY_INLINE void get_instance_uri(uint16_t object_id, uint16_t instance_id, lwm2m_uri_t* uri)\n{\n    if (uri == NULL)\n    {\n        return;\n    }\n    uri->flag = LWM2M_URI_FLAG_OBJECT_ID | LWM2M_URI_FLAG_INSTANCE_ID;\n    uri->objectId = object_id;\n    uri->instanceId = instance_id;\n    uri->resourceId = 0;\n}\n\nATINY_INLINE void get_resource_uri(uint16_t object_id, uint16_t instance_id, uint16_t resource_id, lwm2m_uri_t* uri)\n{\n    if (uri == NULL)\n    {\n        return;\n    }\n    uri->flag = LWM2M_URI_FLAG_OBJECT_ID | LWM2M_URI_FLAG_INSTANCE_ID | LWM2M_URI_FLAG_RESOURCE_ID;\n    uri->objectId = object_id;\n    uri->instanceId = instance_id;\n    uri->resourceId = resource_id;\n}\n\nstruct _atiny_rpt_list_t;\ntypedef struct _atiny_rpt_list_t* rpt_list_t;\n\nint atiny_init_rpt(void);\nint atiny_add_rpt_uri(const lwm2m_uri_t* uri,  rpt_list_t* list);\nint atiny_rm_rpt_uri(const lwm2m_uri_t* uri);\n\nint atiny_dequeue_rpt_data(rpt_list_t rpt_list,  data_report_t* data);\nint atiny_queue_rpt_data(const lwm2m_uri_t* uri, const data_report_t* data);\nint atiny_clear_rpt_data(const lwm2m_uri_t* uri, int result);\n\nint atiny_step_rpt(lwm2m_context_t* context);\nvoid atiny_destroy_rpt(void);\nint atiny_set_max_rpt_cnt(const lwm2m_uri_t* uri, uint32_t max_rpt_cnt);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/connection.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2015 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Christian Renz - Please refer to git log\n *\n *******************************************************************************/\n#include <ctype.h>\n#include \"connection.h\"\n\n\n#if defined (WITH_DTLS)\n#include \"dtls_interface.h\"\n#endif\n#include \"sal/atiny_socket.h\"\n#include \"log/atiny_log.h\"\n#include \"object_comm.h\"\n\n#define COAP_PORT \"5683\"\n#define COAPS_PORT \"5684\"\n\nstatic lwm2m_connection_err_notify_t g_connection_err_notify = NULL;\n\nstatic inline void inc_connection_stat(connection_t *connection, connection_err_e type)\n{\n    static const uint16_t max_num[CONNECTION_ERR_MAX] = {MAX_SEND_ERR_NUM,\n                                                         MAX_RECV_ERR_NUM\n                                                        };\n\n    connection->errs[type]++;\n    if(connection->errs[type] >= max_num[type])\n    {\n        connection->errs[type] = 0;\n        if(g_connection_err_notify)\n        {\n            g_connection_err_notify(connection->lwm2mH, type, connection->bootstrap_flag);\n        }\n    }\n}\n\n\nint connection_parse_host_ip(char *uri, char **parsed_host, char **parsed_port)\n{\n    char *host;\n    char *port;\n    char *defaultport;\n    if (uri == NULL)\n    {\n        ATINY_LOG(LOG_INFO, \"uri is NULL!!!\");\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    //ATINY_LOG(LOG_INFO, \"uri is %s\\n\", uri);\n\n    // parse uri in the form \"coaps://[host]:[port]\"\n\n    if (0 == strncmp(uri, \"coaps://\", strlen(\"coaps://\")))\n    {\n        host = uri + strlen(\"coaps://\");\n        defaultport = COAPS_PORT;\n    }\n    else if (0 == strncmp(uri, \"coap://\", strlen(\"coap://\")))\n    {\n        host = uri + strlen(\"coap://\");\n        defaultport = COAP_PORT;\n    }\n    else\n    {\n        ATINY_LOG(LOG_INFO, \"come here1!!!\");\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    port = strrchr(host, ':');\n    if (port == NULL)\n    {\n        port = defaultport;\n    }\n    else\n    {\n        // remove brackets\n        if (host[0] == '[')\n        {\n            host++;\n\n            if (*(port - 1) == ']')\n            {\n                *(port - 1) = 0;\n            }\n            else\n            {\n                ATINY_LOG(LOG_INFO, \"come here2!!!\");\n                return COAP_500_INTERNAL_SERVER_ERROR;\n            }\n        }\n\n        // split strings\n        *port = 0;\n        port++;\n    }\n\n    *parsed_host = host;\n    *parsed_port = port;\n\n    return COAP_NO_ERROR;\n}\n\n#ifdef LWM2M_BOOTSTRAP\nvoid connection_striger_server_initiated_bs(connection_t * sessionH)\n{\n    (void)sessionH;\n    (void)atiny_cmd_ioctl(ATINY_TRIGER_SERVER_INITIATED_BS, NULL, 0);\n}\n#endif\n\n#ifdef WITH_DTLS\nint connection_connect_dtls(connection_t *connP, security_instance_t *targetP, const char *host, const char *port, int client_or_server)\n{\n    int ret;\n    dtls_shakehand_info_s info;\n    dtls_establish_info_s establish_info;\n\n    establish_info.psk_or_cert = VERIFY_WITH_PSK;\n    establish_info.udp_or_tcp = MBEDTLS_NET_PROTO_UDP;\n    establish_info.v.p.psk = (const unsigned char *)targetP->secretKey;\n    establish_info.v.p.psk_len = targetP->secretKeyLen;\n    establish_info.v.p.psk_identity = (const unsigned char *)targetP->publicIdentity;\n\n    connP->net_context = (void *)dtls_ssl_new(&establish_info, client_or_server);\n    if (NULL == connP->net_context)\n    {\n        ATINY_LOG(LOG_INFO, \"connP->ssl is NULL in connection_create\");\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n\n    memset(&info, 0, sizeof(info));\n    info.client_or_server = client_or_server;\n    info.finish_notify = NULL;\n    info.step_notify   = NULL;\n    info.udp_or_tcp = MBEDTLS_NET_PROTO_UDP;\n    info.psk_or_cert = VERIFY_WITH_PSK;\n#ifdef LWM2M_BOOTSTRAP\n    info.step_notify = (void(*)(void *))lwm2m_step_striger_server_initiated_bs;\n    info.param = (void(*)(void *))connP;\n#endif\n\n    if (MBEDTLS_SSL_IS_CLIENT == client_or_server)\n    {\n        info.u.c.host = host;\n        info.u.c.port = port;\n        info.timeout = DTLS_UDP_CLIENT_SHAKEHAND_TIMEOUT;\n    }\n    else\n    {\n#ifdef LWM2M_BOOTSTRAP\n        info.timeout = targetP->clientHoldOffTime;\n        info.u.s.local_port = port;\n        timer_init(&connP->server_triger_timer, LWM2M_TRIGER_SERVER_MODE_INITIATED_TIME, (void(*)(void*))connection_striger_server_initiated_bs, connP);\n        timer_start(&connP->server_triger_timer);\n#endif\n    }\n    ret = dtls_shakehand(connP->net_context, &info);\n#ifdef LWM2M_BOOTSTRAP\n    timer_stop(&connP->server_triger_timer);\n#endif\n    if (ret != 0)\n    {\n        ATINY_LOG(LOG_INFO, \"ret is %d in connection_create\", ret);\n        dtls_ssl_destroy((mbedtls_ssl_context *)connP->net_context);\n        connP->net_context = NULL;\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    connP->dtls_flag = true;\n\n    return COAP_NO_ERROR;\n}\n\n#endif\n\n\nconnection_t *connection_create(connection_t *connList,\n                                lwm2m_object_t *securityObj,\n                                int instanceId,\n                                lwm2m_context_t *lwm2mH,\n                                int client_or_server)\n{\n    connection_t *connP = NULL;\n    char *host;\n    char *port;\n    security_instance_t *targetP;\n    char *uri = NULL;\n    connection_t * ret = NULL;\n\n    ATINY_LOG(LOG_INFO, \"now come into connection_create!!!\");\n\n    targetP = (security_instance_t *)LWM2M_LIST_FIND(securityObj->instanceList, instanceId);\n    if (NULL == targetP || targetP->uri == NULL)\n    {\n        return NULL;\n    }\n\n\n    if (LWM2M_IS_CLIENT == client_or_server)\n    {\n        uri = atiny_strdup(targetP->uri);\n        if (uri == NULL)\n        {\n            ATINY_LOG(LOG_INFO, \"atiny_strdup null!!!\");\n            goto fail;\n        }\n        if (connection_parse_host_ip(uri, &host, &port) != COAP_NO_ERROR)\n        {\n            goto fail;\n        }\n    }\n    else\n    {\n        host = NULL;\n        port = (char *)((targetP->securityMode != LWM2M_SECURITY_MODE_NONE) ? COAPS_PORT : COAP_PORT);\n    }\n\n    connP = (connection_t *)lwm2m_malloc(sizeof(connection_t));\n    if (connP == NULL)\n    {\n        ATINY_LOG(LOG_INFO, \"connP is NULL!!!\");\n         goto fail;\n    }\n\n    memset(connP, 0, sizeof(connection_t));\n\n#ifdef WITH_DTLS\n\n    if (targetP->securityMode != LWM2M_SECURITY_MODE_NONE)\n    {\n        if (connection_connect_dtls(connP, targetP, host, port, client_or_server) != COAP_NO_ERROR)\n        {\n            goto fail;\n        }\n    }\n    else\n#endif\n    {\n        // no dtls session\n        if (LWM2M_IS_CLIENT == client_or_server)\n        {\n            connP->net_context = atiny_net_connect(host, port, ATINY_PROTO_UDP);\n        }\n        else\n        {\n            connP->net_context = atiny_net_bind(host, port, ATINY_PROTO_UDP);\n\n            #ifdef LWM2M_BOOTSTRAP\n            if (connP->net_context)\n            {\n                connection_striger_server_initiated_bs(connP);\n                timer_init(&connP->server_triger_timer, LWM2M_TRIGER_SERVER_MODE_INITIATED_TIME, (void(*)(void*))connection_striger_server_initiated_bs, connP);\n                timer_start(&connP->server_triger_timer);\n            }\n            #endif\n        }\n\n        if (NULL == connP->net_context)\n        {\n            ATINY_LOG(LOG_INFO, \"net_context is NULL in connection_create\");\n            goto fail;\n        }\n        connP->dtls_flag = false;\n    }\n\n    connP->next = connList;\n    connP->securityObj = securityObj;\n    connP->securityInstId = instanceId;\n    connP->lwm2mH = lwm2mH;\n    connP->bootstrap_flag = targetP->isBootstrap;\n\n    ret = connP;\nfail:\n    if (uri)\n    {\n        lwm2m_free(uri);\n    }\n    if (ret == NULL && connP)\n    {\n        lwm2m_free(connP);\n    }\n\n    return ret;\n}\n\nvoid connection_free(connection_t *connP)\n{\n    if(connP == NULL)\n    {\n        return;\n    }\n#ifdef WITH_DTLS\n\n    if (connP->dtls_flag == true)\n    {\n        dtls_ssl_destroy(connP->net_context);\n    }\n    else\n#endif\n    {\n        atiny_net_close(connP->net_context);\n    }\n\n    return;\n}\n\n\nvoid *lwm2m_connect_server(uint16_t secObjInstID, void *userData, bool isServer)\n{\n    client_data_t *dataP;\n    lwm2m_list_t *instance;\n    connection_t *newConnP = NULL;\n    lwm2m_object_t   *securityObj;\n\n    dataP = (client_data_t *)userData;\n    securityObj = dataP->securityObjP;\n\n    ATINY_LOG(LOG_INFO, \"Now come into Connection creation in lwm2m_connect_server %d.\\n\", isServer);\n\n    instance = LWM2M_LIST_FIND(dataP->securityObjP->instanceList, secObjInstID);\n\n    if (instance == NULL)\n    {\n        return NULL;\n    }\n\n    newConnP = connection_create(dataP->connList, securityObj, instance->id, dataP->lwm2mH,\n                                isServer ? LWM2M_IS_SERVER : LWM2M_IS_CLIENT);\n\n    if (newConnP == NULL)\n    {\n        ATINY_LOG(LOG_INFO, \"Connection creation failed.\\n\");\n        return NULL;\n    }\n    ATINY_LOG(LOG_INFO, \"Connection creation successfully in lwm2m_connect_server.\\n\");\n    dataP->connList = newConnP;\n\n    return (void *)newConnP;\n}\n\nvoid lwm2m_close_connection(void *sessionH, void *userData)\n{\n    client_data_t *app_data;\n    connection_t *targetP;\n\n    app_data = (client_data_t *)userData;\n    targetP = (connection_t *)sessionH;\n#ifdef LWM2M_BOOTSTRAP\n    timer_stop(&targetP->server_triger_timer);\n#endif\n    if (targetP == app_data->connList)\n    {\n        app_data->connList = targetP->next;\n        connection_free(targetP);\n        lwm2m_free(targetP);\n    }\n    else\n    {\n        connection_t *parentP;\n\n        parentP = app_data->connList;\n\n        while (parentP != NULL && parentP->next != targetP)\n        {\n            parentP = parentP->next;\n        }\n\n        if (parentP != NULL)\n        {\n            parentP->next = targetP->next;\n            connection_free(targetP);\n            lwm2m_free(targetP);\n        }\n    }\n\n    return;\n}\n\n\nint lwm2m_buffer_recv(void *sessionH, uint8_t *buffer, size_t length, uint32_t timeout)\n{\n    connection_t *connP = (connection_t *) sessionH;\n    int ret = -1;\n    const int TIME_OUT = -2;\n\n    timeout *= 1000;\n#ifdef WITH_DTLS\n\n    if (connP->dtls_flag == true)\n    {\n        // security\n        ret = dtls_read(connP->net_context, buffer, length, timeout);\n    }\n    else\n#endif\n    {\n        ret = atiny_net_recv_timeout(connP->net_context, buffer, length, timeout);\n    }\n\n    if((ret < 0) && (ret != TIME_OUT))\n    {\n        inc_connection_stat(connP, CONNECTION_RECV_ERR);\n    }\n    else\n    {\n        connP->errs[CONNECTION_RECV_ERR] = 0;\n    }\n    return ret;\n}\n\nstatic bool connection_is_valid(void *user_data, void *session)\n{\n    client_data_t *data = (client_data_t *)user_data;\n    connection_t *conn;\n    if (data == NULL || data->connList == NULL)\n    {\n        return false;\n    }\n\n    conn = data->connList;\n    while(conn != NULL)\n    {\n        if (conn == session)\n        {\n            return true;\n        }\n        conn = conn->next;\n    }\n\n    return false;\n}\n\nuint8_t lwm2m_buffer_send(void *sessionH,\n                          uint8_t *buffer,\n                          size_t length,\n                          void *userdata)\n{\n    connection_t *connP = (connection_t *) sessionH;\n    int ret;\n    /* should check the valid of the connection,because coap tranctions does not update the session */\n    if (connP == NULL || (!connection_is_valid(userdata, sessionH)))\n    {\n        ATINY_LOG(LOG_INFO, \"#> failed sending %lu bytes, missing connection\\r\\n\", (unsigned long)length);\n        return COAP_500_INTERNAL_SERVER_ERROR ;\n    }\n\n    ATINY_LOG(LOG_INFO, \"call connection_send in lwm2m_buffer_send, length is %d\\n\", length);\n\n#ifdef WITH_DTLS\n\n    if (connP->dtls_flag == true)\n    {\n        // security\n        ret = dtls_write(connP->net_context, buffer, length);\n    }\n    else\n#endif\n    {\n        ret = atiny_net_send(connP->net_context, buffer, length);\n    }\n\n    if(ret >= 0)\n    {\n        connP->errs[CONNECTION_SEND_ERR] = 0;\n        return COAP_NO_ERROR;\n    }\n    else\n    {\n        inc_connection_stat(connP, CONNECTION_SEND_ERR);\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n}\n\nbool lwm2m_session_is_equal(void *session1, void *session2, void *userData)\n{\n    return (session1 == session2);\n}\n\nvoid lwm2m_register_connection_err_notify(lwm2m_connection_err_notify_t nofiy)\n{\n    g_connection_err_notify = nofiy;\n}\n\n#ifdef LWM2M_BOOTSTRAP\nvoid lwm2m_step_striger_server_initiated_bs(connection_t * sessionH)\n{\n    if (sessionH == NULL)\n    {\n        return;\n    }\n    timer_step(&sessionH->server_triger_timer);\n}\nvoid lwm2m_stop_striger_server_initiated_bs(connection_t * sessionH)\n{\n    if (sessionH == NULL)\n    {\n        return;\n    }\n    timer_stop(&sessionH->server_triger_timer);\n}\n\n\nbool lwm2m_is_sec_obj_uri_valid(uint16_t secObjInstID, void *userData)\n{\n    client_data_t *dataP;\n    lwm2m_object_t   *securityObj;\n    dataP = (client_data_t *)userData;\n    securityObj = dataP->securityObjP;\n    security_instance_t *targetP;\n\n    targetP = (security_instance_t *)LWM2M_LIST_FIND(securityObj->instanceList, secObjInstID);\n    return !(((NULL == targetP)\n            || (targetP->uri == NULL)\n            || (targetP->uri[0] == '\\0')));\n}\n#endif\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/connection.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2015 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Simon Bernard - initial API and implementation\n *    Christian Renz - Please refer to git log\n *\n *******************************************************************************/\n\n#ifndef DTLS_CONN_H_\n#define DTLS_CONN_H_\n#include <stdint.h>\n#include <stddef.h>\n#include <stdbool.h>\n#include \"util_timer.h\"\n#include \"liblwm2m.h\"\n\n\n// after 40sec of inactivity we rehandshake\n#define DTLS_NAT_TIMEOUT 40\n\n#define LWM2M_IS_CLIENT                   0\n#define LWM2M_IS_SERVER                   1\n\n/* timeout for udp client shakehand,the unit is second */\n#ifndef DTLS_UDP_CLIENT_SHAKEHAND_TIMEOUT\n#define DTLS_UDP_CLIENT_SHAKEHAND_TIMEOUT 60\n#endif\n\ntypedef enum\n{\n    CONNECTION_SEND_ERR,\n    CONNECTION_RECV_ERR,\n    CONNECTION_ERR_MAX\n} connection_err_e;\n\ntypedef struct _connection_t\n{\n    struct _connection_t*   next;\n    void* net_context;\n    lwm2m_object_t* securityObj;\n    int securityInstId;\n    uint16_t dtls_flag;\n    uint16_t bootstrap_flag;\n    lwm2m_context_t* lwm2mH;\n    uint16_t errs[CONNECTION_ERR_MAX];\n#ifdef LWM2M_BOOTSTRAP\n    util_timer_t server_triger_timer;\n#endif\n} connection_t;\n\ntypedef void (*lwm2m_connection_err_notify_t)(lwm2m_context_t* context, connection_err_e err_type, bool boostrap_flag);\n\n\nint lwm2m_buffer_recv(void* sessionH, uint8_t* buffer, size_t length, uint32_t timeout);\nvoid lwm2m_register_connection_err_notify(lwm2m_connection_err_notify_t nofiy);\n\n\n#ifdef LWM2M_BOOTSTRAP\nvoid lwm2m_step_striger_server_initiated_bs(connection_t * sessionH);\nvoid lwm2m_stop_striger_server_initiated_bs(connection_t * sessionH);\nbool lwm2m_is_sec_obj_uri_valid(uint16_t secObjInstID, void *userData);\n#endif\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/firmware_update.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"internals.h\"\n#include \"atiny_lwm2m/agenttiny.h\"\n#include \"log/atiny_log.h\"\n#include \"ota/package.h\"\n#include \"firmware_update.h\"\n\n#define FW_BLOCK_SIZE (512)\n\n#define COAP_PROTO_PREFIX \"coap://\"\n#define COAPS_PROTO_PREFIX \"coaps://\"\n\ntypedef struct fw_update_record\n{\n    uint8_t in_use;\n    uint8_t block_more;\n    uint16_t block_size;\n    uint32_t block_num;\n    uint32_t block_offset;\n    uint32_t uri_len;\n    char *uri;\n} fw_update_record_t;\n\nstatic char *g_ota_uri = NULL;\nstatic pack_storage_device_api_s *g_fota_storage_device = NULL;\nstatic fw_update_record_t g_fw_update_record = {0};\n\nstatic firmware_update_notify g_firmware_update_notify = NULL;\nstatic void *g_firmware_update_notify_param = NULL;\n\nstatic void firmware_download_reply(lwm2m_transaction_t *transacP,\n                                    void *message)\n{\n    coap_packet_t *packet = (coap_packet_t *)message;\n    lwm2m_context_t *contextP = (lwm2m_context_t *)(transacP->userData);\n    lwm2m_transaction_t *transaction;\n    uint32_t len = 0;\n    uint32_t block_num = 0;\n    uint8_t block2_more = 0;\n    uint16_t block_size = FW_BLOCK_SIZE;\n    uint32_t block_offset = 0;\n    int ret = 0;\n\n    if(NULL == message)\n    {\n        ATINY_LOG(LOG_INFO, \"transaction timeout\");\n        goto failed_exit;\n    }\n\n    if(1 != coap_get_header_block2(message, &block_num, &block2_more, &block_size, &block_offset))\n    {\n        ATINY_LOG(LOG_ERR, \"coap_get_header_block2 failed\");\n        goto failed_exit;\n    }\n    ATINY_LOG(LOG_ERR, \"block_num : %lu, block2_more : %lu, block_offset : %lu, payload_len is %u\",\n              block_num, (uint32_t)block2_more, block_offset, packet->payload_len);\n\n    if(0 == block_num)\n    {\n        g_fw_update_record.in_use = 1;\n    }\n\n    g_fw_update_record.block_size = block_size;\n    g_fw_update_record.block_num = block_num;\n    g_fw_update_record.block_offset = block_offset;\n    g_fw_update_record.block_more = block2_more;\n\n    len = (uint32_t)(packet->payload_len);\n    if(g_fota_storage_device && g_fota_storage_device->write_software)\n    {\n        ret = g_fota_storage_device->write_software(g_fota_storage_device, block_offset, packet->payload, len);\n        if(ret != 0)\n            goto failed_exit;\n    }\n    else if(NULL == g_fota_storage_device)\n        ATINY_LOG(LOG_ERR, \"g_fota_storage_device NULL\");\n    else\n        ATINY_LOG(LOG_ERR, \"g_fota_storage_device->write_software NULL\");\n\n    len = block_offset + (uint32_t)(packet->payload_len);\n\n    if(block2_more)\n    {\n        transaction = transaction_new(transacP->peerH, COAP_GET, NULL, NULL, contextP->nextMID++, 4, NULL);\n        if(!transaction)\n        {\n            ATINY_LOG(LOG_ERR, \"transaction_new failed\");\n            goto failed_exit;\n        }\n        ret = coap_set_header_uri_path(transaction->message, g_ota_uri);\n        if(ret < 0 || NULL == transaction->message->uri_path)\n        {\n            transaction_free(transaction);\n            goto failed_exit;\n        }\n        //coap_set_header_uri_query(transaction->message, query);\n        ret = coap_set_header_block2(transaction->message, g_fw_update_record.block_num + 1, 0, g_fw_update_record.block_size);\n        if(ret < 0)\n        {\n            transaction_free(transaction);\n            goto failed_exit;\n        }\n        ATINY_LOG(LOG_DEBUG, \"get next : %lu\", block_num + 1);\n\n        transaction->callback = firmware_download_reply;\n        transaction->userData = (void *)contextP;\n\n        contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n\n        if(transaction_send(contextP, transaction) != 0)\n        {\n            ATINY_LOG(LOG_ERR, \"transaction_send failed\");\n            goto failed_exit;\n        }\n    }\n    else\n    {\n        ret = ATINY_ERR;\n        if(g_fota_storage_device && g_fota_storage_device->write_software_end)\n            ret = g_fota_storage_device->write_software_end(g_fota_storage_device, PACK_DOWNLOAD_OK, len);\n        else if(NULL == g_fota_storage_device)\n            ATINY_LOG(LOG_ERR, \"g_fota_storage_device NULL\");\n        else\n            ATINY_LOG(LOG_ERR, \"g_fota_storage_device->write_software_end NULL\");\n        ATINY_LOG(LOG_ERR, \"g_firmware_update_notify FIRMWARE_UPDATE_RST_SUCCESS, write end ret %d\", ret);\n        if(g_firmware_update_notify)\n            g_firmware_update_notify((ret == ATINY_OK) ?  FIRMWARE_UPDATE_RST_SUCCESS : FIRMWARE_UPDATE_RST_FAILED, g_firmware_update_notify_param);\n        ATINY_LOG(LOG_ERR, \"download success, total size : %lu, write end ret %d\", len, ret);\n    }\n    return;\nfailed_exit:\n    if(g_fota_storage_device && g_fota_storage_device->write_software_end)\n        (void)g_fota_storage_device->write_software_end(g_fota_storage_device, PACK_DOWNLOAD_FAIL, len);\n    else if(NULL == g_fota_storage_device)\n        ATINY_LOG(LOG_ERR, \"g_fota_storage_device NULL\");\n    else\n        ATINY_LOG(LOG_ERR, \"g_fota_storage_device->write_software_end NULL\");\n    ATINY_LOG(LOG_INFO, \"g_firmware_update_notify FIRMWARE_UPDATE_RST_FAILED\");\n    if(g_firmware_update_notify)\n        g_firmware_update_notify(FIRMWARE_UPDATE_RST_FAILED, g_firmware_update_notify_param);\n    return;\n}\n\nstatic int record_fw_uri(char *uri, int uri_len)\n{\n    if(!uri || *uri == '\\0' || uri_len <= 0)\n    {\n        return -1;\n    }\n\n    g_fw_update_record.uri = (char *)lwm2m_malloc(uri_len + 1);\n    if(NULL == g_fw_update_record.uri)\n    {\n        ATINY_LOG(LOG_ERR, \"lwm2m_malloc failed\");\n        return -1;\n    }\n    memcpy(g_fw_update_record.uri, uri, uri_len);\n    g_fw_update_record.uri[uri_len] = '\\0';\n    g_fw_update_record.uri_len = uri_len;\n\n    return 0;\n}\n\nstatic int update_uri_info(char *uri, int uri_len, unsigned char *update_flag)\n{\n    int ret = -1;\n\n    if(!uri || *uri == '\\0' || uri_len <= 0 || !update_flag)\n    {\n        return -1;\n    }\n\n    if(1 == g_fw_update_record.in_use && NULL != g_fw_update_record.uri && 0 == memcmp(g_fw_update_record.uri, uri, uri_len))\n    {\n        *update_flag = 0;\n        return 0;\n    }\n    else\n    {\n        if(NULL != g_fw_update_record.uri)\n        {\n            lwm2m_free(g_fw_update_record.uri);\n            g_fw_update_record.uri = NULL;\n        }\n        memset(&g_fw_update_record, 0x0, sizeof(g_fw_update_record));\n        ret = record_fw_uri(uri, uri_len);\n        *update_flag = 1;\n        if(0 != ret)\n        {\n            ATINY_LOG(LOG_ERR, \"record_fw_uri failed\");\n            return -1;\n        }\n        return 0;\n    }\n}\n\nvoid set_firmware_update_notify(firmware_update_notify notify_cb, void *param)\n{\n    g_firmware_update_notify = notify_cb;\n    g_firmware_update_notify_param = param;\n\n    return;\n}\n\nint parse_firmware_uri(char *uri, int uri_len)\n{\n    char *char_p, *path;\n    int path_len, proto_len;\n\n    if(!uri || *uri == '\\0' || uri_len <= 0)\n    {\n        return -1;\n    }\n\n    if(0 == strncmp(uri, COAP_PROTO_PREFIX, strlen(COAP_PROTO_PREFIX)))\n        proto_len = strlen(COAP_PROTO_PREFIX);\n    else if(0 == strncmp(uri, COAPS_PROTO_PREFIX, strlen(COAPS_PROTO_PREFIX)))\n        proto_len = strlen(COAPS_PROTO_PREFIX);\n    else\n    {\n        ATINY_LOG(LOG_ERR, \"unsupported proto\");\n        return -1;\n    }\n    //暂不考虑query\n    char_p = uri + proto_len;\n    if(*char_p == '\\0') // eg. just \"coap://\"\n        return -1;\n    path = strchr(char_p, '/');\n    if(NULL == path)\n        return -1;\n    path_len = uri_len - (path - uri);\n\n    g_ota_uri = (char *)lwm2m_malloc(path_len + 1);\n    if(!g_ota_uri)\n    {\n        ATINY_LOG(LOG_ERR, \"lwm2m_malloc failed\");\n        return -1;\n    }\n    /*lint -esym(668,memcpy) */\n    memcpy(g_ota_uri, path, path_len);\n    g_ota_uri[path_len] = '\\0';\n\n    return 0;\n}\n\nint start_firmware_download(lwm2m_context_t *contextP, char *uri,\n                            pack_storage_device_api_s *storage_device_p)\n{\n    lwm2m_transaction_t *transaction;\n    unsigned char update_flag = 0;\n    int ret = -1;\n    int uri_len;\n    lwm2m_server_t *server;\n\n    if(!contextP || !uri || *uri == '\\0' || !storage_device_p)\n    {\n        ATINY_LOG(LOG_ERR, \"invalid params\");\n        return -1;\n    }\n    ATINY_LOG(LOG_ERR, \"start download\");\n    g_fota_storage_device = storage_device_p;\n    uri_len = strlen(uri);\n    server = registration_get_registered_server(contextP);\n    if(NULL == server)\n    {\n        ATINY_LOG(LOG_ERR, \"registration_get_registered_server failed\");\n        return -1;\n    }\n\n    ret = update_uri_info(uri, uri_len, &update_flag);\n    if(0 != ret)\n    {\n        ;// continue to although update_uri_info failed\n    }\n\n    ATINY_LOG(LOG_DEBUG, \"update_flag = %u\", update_flag);\n    if(!(0 == update_flag && NULL != g_ota_uri))\n    {\n        if(NULL != g_ota_uri)\n        {\n            lwm2m_free(g_ota_uri);\n            g_ota_uri = NULL;\n        }\n        ret = parse_firmware_uri(uri, uri_len);\n        if(0 != ret)\n        {\n            ATINY_LOG(LOG_ERR, \"parse_firmware_uri failed\");\n            return -1;\n        }\n    }\n\n    transaction = transaction_new(server->sessionH, COAP_GET, NULL, NULL, contextP->nextMID++, 4, NULL);\n    if(!transaction)\n    {\n        ATINY_LOG(LOG_ERR, \"transaction_new failed\");\n        return -1;\n    }\n    ret = coap_set_header_uri_path(transaction->message, g_ota_uri);\n    if(ret < 0 || NULL == transaction->message->uri_path)\n    {\n        transaction_free(transaction);\n        return -1;\n    }\n    //coap_set_header_uri_query(transaction->message, query);\n    if(1 == g_fw_update_record.in_use)\n    {\n        ret = coap_set_header_block2(transaction->message, g_fw_update_record.block_num + 1, 0, g_fw_update_record.block_size);\n    }\n    else\n    {\n        ret = coap_set_header_block2(transaction->message, 0, 0, FW_BLOCK_SIZE);\n    }\n    if(ret != 1)\n    {\n        transaction_free(transaction);\n        return -1;\n    }\n\n    transaction->callback = firmware_download_reply;\n    transaction->userData = (void *)contextP;\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n\n    if(transaction_send(contextP, transaction) != 0)\n    {\n        ATINY_LOG(LOG_ERR, \"transaction_send failed\");\n        return -1;\n    }\n\n    return 0;\n}\n\nvoid clean_firmware_record(void)\n{\n    if(NULL != g_ota_uri)\n    {\n        lwm2m_free(g_ota_uri);\n        g_ota_uri = NULL;\n    }\n    if(NULL != g_fw_update_record.uri)\n    {\n        lwm2m_free(g_fw_update_record.uri);\n        g_fw_update_record.uri = NULL;\n    }\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/firmware_update.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef __FIRMWARE_UPDATE_H__\n#define __FIRMWARE_UPDATE_H__\n\ntypedef enum firmware_update_rst\n{\n    FIRMWARE_UPDATE_RST_SUCCESS = 0,\n    FIRMWARE_UPDATE_RST_FAILED,\n    FIRMWARE_UPDATE_RST_MAX\n}firmware_update_rst_e;\n\ntypedef void (*firmware_update_notify)(firmware_update_rst_e rst, void *param);\n\nvoid set_firmware_update_notify(firmware_update_notify notify_cb, void *param);\nint start_firmware_download(lwm2m_context_t *contextP, char *uri, pack_storage_device_api_s *storage_device_p);\nvoid clean_firmware_record(void);\n\n#endif /* __FIRMWARE_UPDATE_H__ */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/object_access_control.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2015 Bosch Software Innovations GmbH Germany.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - please refer to git log\n *\n ******************************************************************************/\n\n/*\n * This \"Access Control\" object is optional and multiple instantiated\n *\n *  Resources:\n *\n *          Name         | ID | Oper. | Inst. | Mand.|  Type   | Range | Units |\n *  ---------------------+----+-------+-------+------+---------+-------+-------+\n *  Object ID            |  0 |   R   | Single|  Yes | Integer |1-65534|       |\n *  Object instance ID   |  1 |   R   | Single|  Yes | Integer |0-65535|       |\n *  ACL                  |  2 |   RW  | Multi.|  No  | Integer | 16bit |       |\n *  Access Control Owner |  3 |   RW  | Single|  Yes | Integer |0-65535|       |\n */\n\n#include \"internals.h\"\n#include \"object_comm.h\"\n#include <string.h>\n\n// Resource Id's:\n#define RES_M_OBJECT_ID             0\n#define RES_M_OBJECT_INSTANCE_ID    1\n#define RES_O_ACL                   2\n#define RES_M_ACCESS_CONTROL_OWNER  3\n\n#define MAX_DATA_VAL 65535\n\ntypedef struct acc_ctrl_ri_s\n{\n    // linked list:\n    struct acc_ctrl_ri_s   *next;       // matches lwm2m_list_t::next\n    uint16_t                resInstId;  // matches lwm2m_list_t::id, ..serverID\n    // resource data:\n    uint16_t                accCtrlValue;\n} acc_ctrl_ri_t;\n\ntypedef struct acc_ctrl_oi_s\n{\n    //linked list:\n    struct acc_ctrl_oi_s   *next;       // matches lwm2m_list_t::next\n    uint16_t                objInstId;  // matches lwm2m_list_t::id\n    // resources\n    uint16_t                objectId;\n    uint16_t                objectInstId;\n    uint16_t                accCtrlOwner;\n    acc_ctrl_ri_t          *accCtrlValList;\n} acc_ctrl_oi_t;\n\n\nstatic uint8_t prv_set_tlv(lwm2m_data_t *dataP, acc_ctrl_oi_t *accCtrlOiP)\n{\n    switch (dataP->id)\n    {\n    case RES_M_OBJECT_ID:\n        lwm2m_data_encode_int(accCtrlOiP->objectId, dataP);\n        return COAP_205_CONTENT;\n    case RES_M_OBJECT_INSTANCE_ID:\n        lwm2m_data_encode_int(accCtrlOiP->objectInstId, dataP);\n        return COAP_205_CONTENT;\n    case RES_O_ACL:\n    {\n        int ri;\n        acc_ctrl_ri_t *accCtrlRiP;\n        for (accCtrlRiP = accCtrlOiP->accCtrlValList, ri = 0;\n                accCtrlRiP != NULL;\n                accCtrlRiP = accCtrlRiP->next, ri++);\n\n        if (ri == 0) // no values!\n        {\n            return COAP_404_NOT_FOUND;\n        }\n        else\n        {\n            lwm2m_data_t *subTlvP = lwm2m_data_new(ri);\n            if (subTlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n            for (accCtrlRiP = accCtrlOiP->accCtrlValList, ri = 0;\n                    accCtrlRiP != NULL;\n                    accCtrlRiP = accCtrlRiP->next, ri++)\n            {\n                subTlvP[ri].id = accCtrlRiP->resInstId;\n                lwm2m_data_encode_int(accCtrlRiP->accCtrlValue, &subTlvP[ri]);\n            }\n            lwm2m_data_encode_instances(subTlvP, ri, dataP);\n            return COAP_205_CONTENT;\n        }\n    }\n    case RES_M_ACCESS_CONTROL_OWNER:\n        lwm2m_data_encode_int(accCtrlOiP->accCtrlOwner, dataP);\n        return COAP_205_CONTENT;\n    default:\n        return COAP_404_NOT_FOUND ;\n    }\n}\n\nstatic uint8_t prv_read(uint16_t instanceId, int *numDataP,\n                        lwm2m_data_t **dataArrayP, lwm2m_data_cfg_t *dataCfg, lwm2m_object_t *objectP)\n{\n    uint8_t result;\n    int     ri, ni;\n\n    // multi-instance object: search instance\n    acc_ctrl_oi_t *accCtrlOiP =\n        (acc_ctrl_oi_t *)lwm2m_list_find(objectP->instanceList, instanceId);\n    if (accCtrlOiP == NULL)\n    {\n        return COAP_404_NOT_FOUND ;\n    }\n\n    // is the server asking for the full object ?\n    if (*numDataP == 0)\n    {\n        uint16_t resList[] =\n        {\n            RES_M_OBJECT_ID,\n            RES_M_OBJECT_INSTANCE_ID,\n            RES_O_ACL,  // prv_set_tlv will return COAP_404_NOT_FOUND w/o values!\n            RES_M_ACCESS_CONTROL_OWNER\n        };\n        int nbRes = sizeof(resList) / sizeof(uint16_t);\n\n        *dataArrayP = lwm2m_data_new(nbRes);\n        if (*dataArrayP == NULL)\n            return COAP_500_INTERNAL_SERVER_ERROR ;\n        *numDataP = nbRes;\n        for (ri = 0; ri < nbRes; ri++)\n        {\n            (*dataArrayP)[ri].id = resList[ri];\n        }\n    }\n\n    ni = ri = 0;\n    do\n    {\n        result = prv_set_tlv((*dataArrayP) + ni, accCtrlOiP);\n        if (result == COAP_404_NOT_FOUND)\n        {\n            ri++;\n            if (*numDataP > 1) result = COAP_205_CONTENT;\n        }\n        else if (ri > 0)    // copy new one by ri skipped ones in front\n        {\n            (*dataArrayP)[ni - ri] = (*dataArrayP)[ni];\n        }\n        ni++;\n    }\n    while (ni < *numDataP && result == COAP_205_CONTENT);\n    *numDataP = ni - ri;\n\n    return result;\n}\n\nstatic bool prv_add_ac_val(acc_ctrl_oi_t *accCtrlOiP,\n                           uint16_t acResId, uint16_t acValue)\n{\n    bool ret = false;\n    acc_ctrl_ri_t *accCtrlRiP;\n    accCtrlRiP = (acc_ctrl_ri_t *)lwm2m_malloc(sizeof(acc_ctrl_ri_t));\n    if (accCtrlRiP == NULL)\n    {\n        return ret;\n    }\n    else\n    {\n        memset(accCtrlRiP, 0, sizeof(acc_ctrl_ri_t));\n        accCtrlRiP->resInstId      = acResId;\n        accCtrlRiP->accCtrlValue   = acValue;\n\n        accCtrlOiP->accCtrlValList = (acc_ctrl_ri_t *)\n                                     LWM2M_LIST_ADD(accCtrlOiP->accCtrlValList, accCtrlRiP);\n        ret = true;\n    }\n    return ret;\n}\n\nstatic uint8_t prv_write_resources(uint16_t instanceId, int numData,\n                                   lwm2m_data_t *tlvArray, lwm2m_object_t *objectP, bool doCreate)\n{\n    int i;\n    uint8_t result = COAP_NO_ERROR;\n    int64_t value;\n    lwm2m_data_t *subTlvArray;\n    int ri;\n\n    acc_ctrl_oi_t *accCtrlOiP = (acc_ctrl_oi_t *)\n                                lwm2m_list_find(objectP->instanceList, instanceId);\n    if (NULL == accCtrlOiP)\n        return COAP_404_NOT_FOUND ;\n\n    i = 0;\n    do\n    {\n        switch (tlvArray[i].id)\n        {\n        case RES_M_OBJECT_ID:\n            if (doCreate == false)\n            {\n                result = COAP_405_METHOD_NOT_ALLOWED;\n            }\n            else\n            {\n                if (1 != lwm2m_data_decode_int(&tlvArray[i], &value))\n                {\n                    result = COAP_400_BAD_REQUEST;\n                }\n                else if (value < 1 || value > 65534)\n                {\n                    result = COAP_406_NOT_ACCEPTABLE;\n                }\n                else\n                {\n                    accCtrlOiP->objectId = value;\n                    result = COAP_204_CHANGED;\n                }\n            }\n            break;\n        case RES_M_OBJECT_INSTANCE_ID:\n            if (doCreate == false)\n            {\n                result = COAP_405_METHOD_NOT_ALLOWED;\n            }\n            else\n            {\n                if (1 != lwm2m_data_decode_int(&tlvArray[i], &value))\n                {\n                    result = COAP_400_BAD_REQUEST;\n                }\n                else if (value < 0 || value > MAX_DATA_VAL)\n                {\n                    result = COAP_406_NOT_ACCEPTABLE;\n                }\n                else\n                {\n                    accCtrlOiP->objectInstId = value;\n                    result = COAP_204_CHANGED;\n                }\n            }\n            break;\n        case RES_O_ACL:\n        {\n            if (tlvArray[i].type != LWM2M_TYPE_MULTIPLE_RESOURCE)\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n            else\n            {\n                // MR-Write: Replace-implementation variant only\n                // see LWM2M-TS:5.4.3 (wakaama has no part-update switch)\n\n                // 1st: save accValueList!\n                acc_ctrl_ri_t *acValListSave = accCtrlOiP->accCtrlValList;\n                accCtrlOiP->accCtrlValList = NULL;\n\n                subTlvArray = tlvArray[i].value.asChildren.array;\n\n                if (tlvArray[i].value.asChildren.count == 0)\n                {\n                    result = COAP_204_CHANGED;\n                }\n                else if (subTlvArray == NULL)\n                {\n                    result = COAP_400_BAD_REQUEST;\n                }\n                else\n                {\n                    for (ri = 0; ri < tlvArray[i].value.asChildren.count; ri++)\n                    {\n                        if (1 != lwm2m_data_decode_int(&subTlvArray[ri], &value))\n                        {\n                            result = COAP_400_BAD_REQUEST;\n                            break;\n                        }\n                        else if (value < 0 || value > 0xFFFF)\n                        {\n                            result = COAP_406_NOT_ACCEPTABLE;\n                            break;\n                        }\n                        else if (!prv_add_ac_val(accCtrlOiP, subTlvArray[ri].id,\n                                                 (uint16_t)value))\n                        {\n                            result = COAP_500_INTERNAL_SERVER_ERROR;\n                            break;\n                        }\n                        else\n                        {\n                            result = COAP_204_CHANGED;\n                        }\n                    }\n                }\n\n                if (result != COAP_204_CHANGED)\n                {\n                    // free pot. partial created new ones\n                    LWM2M_LIST_FREE(accCtrlOiP->accCtrlValList);\n                    // restore old values:\n                    accCtrlOiP->accCtrlValList = acValListSave;\n                }\n                else\n                {\n                    // final free saved value list\n                    LWM2M_LIST_FREE(acValListSave);\n                }\n            }\n        }\n        break;\n        case RES_M_ACCESS_CONTROL_OWNER:\n        {\n            if (1 == lwm2m_data_decode_int(tlvArray + i, &value))\n            {\n                if (value >= 0 && value <= MAX_DATA_VAL)\n                {\n                    accCtrlOiP->accCtrlOwner = value;\n                    result = COAP_204_CHANGED;\n                }\n                else\n                {\n                    result = COAP_406_NOT_ACCEPTABLE;\n                }\n            }\n            else\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n        }\n        break;\n        default:\n            return COAP_404_NOT_FOUND ;\n        }\n        i++;\n    }\n    while (i < numData && result == COAP_204_CHANGED );\n\n    return result;\n}\n\nstatic uint8_t prv_write(uint16_t instanceId, int numData,\n                         lwm2m_data_t *tlvArray, lwm2m_object_t *objectP)\n{\n    return prv_write_resources(instanceId, numData, tlvArray, objectP, false);\n}\n\nstatic uint8_t prv_delete(uint16_t id, lwm2m_object_t *objectP)\n{\n    acc_ctrl_oi_t *targetP;\n\n    objectP->instanceList = lwm2m_list_remove(objectP->instanceList, id,\n                            (lwm2m_list_t **)&targetP);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n\n    LWM2M_LIST_FREE(targetP->accCtrlValList);\n    lwm2m_free(targetP);\n\n    return COAP_202_DELETED;\n}\n\nstatic uint8_t prv_create(uint16_t objInstId, int numData,\n                          lwm2m_data_t *tlvArray, lwm2m_object_t *objectP)\n{\n    acc_ctrl_oi_t *targetP;\n    uint8_t result;\n\n    targetP = (acc_ctrl_oi_t *)lwm2m_malloc(sizeof(acc_ctrl_oi_t));\n    if (NULL == targetP) return COAP_500_INTERNAL_SERVER_ERROR;\n    memset(targetP, 0, sizeof(acc_ctrl_oi_t));\n\n    targetP->objInstId    = objInstId;\n    objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, targetP);\n\n    result = prv_write_resources(objInstId, numData, tlvArray, objectP, true);\n\n    if (result != COAP_204_CHANGED)\n    {\n        (void)prv_delete(objInstId, objectP);\n    }\n    else\n    {\n        result = COAP_201_CREATED;\n    }\n    return result;\n}\n\n/*\n * Create an empty multiple instance LWM2M Object: Access Control\n */\nlwm2m_object_t *acc_ctrl_create_object(void)\n{\n    /*\n     * The acc_ctrl_create_object() function creates an empty object\n     * and returns a pointer to the structure that represents it.\n     */\n    lwm2m_object_t *accCtrlObj = NULL;\n\n    accCtrlObj = (lwm2m_object_t *) lwm2m_malloc(sizeof(lwm2m_object_t));\n\n    if (NULL != accCtrlObj)\n    {\n        memset(accCtrlObj, 0, sizeof(lwm2m_object_t));\n        /*\n         * It assign his unique object ID\n         * The 2 is the standard ID for the optional object \"Access Control\".\n         */\n        accCtrlObj->objID = LWM2M_ACL_OBJECT_ID;\n        // Init callbacks, empty instanceList!\n        accCtrlObj->readFunc    = prv_read;\n        accCtrlObj->writeFunc   = prv_write;\n        accCtrlObj->createFunc  = prv_create;\n        accCtrlObj->deleteFunc  = prv_delete;\n    }\n    return accCtrlObj;\n}\n\nvoid acl_ctrl_free_object(lwm2m_object_t *objectP)\n{\n    acc_ctrl_oi_t *accCtrlOiT;\n    acc_ctrl_oi_t *accCtrlOiP = (acc_ctrl_oi_t *)objectP->instanceList;\n    while (accCtrlOiP != NULL)\n    {\n        // first free acl (multiple resource!):\n        LWM2M_LIST_FREE(accCtrlOiP->accCtrlValList);\n        accCtrlOiT = accCtrlOiP;\n        accCtrlOiP = accCtrlOiP->next;\n        lwm2m_free(accCtrlOiT);\n    }\n    lwm2m_free(objectP);\n}\n\nbool  acc_ctrl_obj_add_inst (lwm2m_object_t *accCtrlObjP, uint16_t instId,\n                             uint16_t acObjectId, uint16_t acObjInstId, uint16_t acOwner)\n{\n    bool ret = false;\n\n    if (NULL == accCtrlObjP)\n    {\n        return ret;\n    }\n    else\n    {\n        // create an access control object instance\n        acc_ctrl_oi_t *accCtrlOiP;\n        accCtrlOiP = (acc_ctrl_oi_t *)lwm2m_malloc(sizeof(acc_ctrl_oi_t));\n        if (NULL == accCtrlOiP)\n        {\n            return ret;\n        }\n        else\n        {\n            memset(accCtrlOiP, 0, sizeof(acc_ctrl_oi_t));\n            // list: key\n            accCtrlOiP->objInstId    = instId;\n            // object instance data:\n            accCtrlOiP->objectId     = acObjectId;\n            accCtrlOiP->objectInstId = acObjInstId;\n            accCtrlOiP->accCtrlOwner = acOwner;\n\n            accCtrlObjP->instanceList =\n                LWM2M_LIST_ADD(accCtrlObjP->instanceList, accCtrlOiP);\n            ret = true;\n        }\n    }\n    return ret;\n}\n\nbool acc_ctrl_oi_add_ac_val (lwm2m_object_t *accCtrlObjP, uint16_t instId,\n                             uint16_t acResId, uint16_t acValue)\n{\n    bool ret = false;\n\n    acc_ctrl_oi_t *accCtrlOiP = (acc_ctrl_oi_t *)\n                                lwm2m_list_find(accCtrlObjP->instanceList, instId);\n    if (NULL == accCtrlOiP)\n        return ret;\n\n    return prv_add_ac_val (accCtrlOiP, acResId, acValue);\n}\n\nstatic acc_ctrl_oi_t *prv_get_acc_instance(acc_ctrl_oi_t *accCtrlOiP, uint16_t objId, uint16_t instId)\n{\n    acc_ctrl_oi_t *itor = accCtrlOiP;\n\n    while (itor)\n    {\n        if (itor->objectId == objId && itor->objectInstId == instId)\n        {\n            return itor;\n        }\n        itor = itor->next;\n    }\n\n    return NULL;\n}\n\nstatic acc_ctrl_ri_t *prv_get_acl_instance(acc_ctrl_ri_t *accCtrlRiP, uint16_t serverId)\n{\n    acc_ctrl_ri_t *targetP;\n\n    targetP = (acc_ctrl_ri_t *)LWM2M_LIST_FIND(accCtrlRiP, serverId);\n    if (NULL == targetP)\n    {\n        targetP = (acc_ctrl_ri_t *)LWM2M_LIST_FIND(accCtrlRiP, 0);\n    }\n\n    return targetP;\n}\n\nstatic inline bool prv_auth_match(OBJ_ACC_OPERATE op, uint16_t auth_op)\n{\n    return auth_op & (0x01 << op);\n}\n\nstatic bool prv_check_instance_auth(acc_ctrl_oi_t *accCtrlOiP, uint16_t objId, uint16_t instId,\n                                    uint16_t serverId, OBJ_ACC_OPERATE op)\n{\n    acc_ctrl_oi_t *targetP;\n    acc_ctrl_ri_t *accCtrlRiP;\n\n    targetP = prv_get_acc_instance(accCtrlOiP, objId, instId);\n    if (NULL == targetP)\n    {\n        return false;\n    }\n    accCtrlRiP = prv_get_acl_instance(targetP->accCtrlValList, serverId);\n    if (NULL == accCtrlRiP)\n    {\n        return targetP->accCtrlOwner == serverId;\n    }\n    return prv_auth_match(op, accCtrlRiP->accCtrlValue);\n}\n\nstatic uint8_t prv_acc_self_auth_check(acc_ctrl_oi_t *accCtrlOiP, lwm2m_uri_t *uri,\n                                       OBJ_ACC_OPERATE op, uint16_t serverId)\n{\n    acc_ctrl_oi_t *targetP;\n\n    if (LWM2M_URI_IS_SET_INSTANCE(uri))\n    {\n        targetP = (acc_ctrl_oi_t *)LWM2M_LIST_FIND(accCtrlOiP, uri->instanceId);\n        if (NULL != targetP && targetP->accCtrlOwner == serverId)\n        {\n            return COAP_NO_ERROR;\n        }\n        else\n        {\n            return COAP_401_UNAUTHORIZED;\n        }\n    }\n    else\n    {\n        targetP = accCtrlOiP;\n        while (targetP)\n        {\n            if (targetP->accCtrlOwner != serverId)\n            {\n                return COAP_401_UNAUTHORIZED;\n            }\n            targetP = targetP->next;\n        }\n        return COAP_NO_ERROR;\n    }\n}\n\nstatic uint8_t prv_pre_auth_check(acc_ctrl_oi_t *accCtrlOiP, lwm2m_uri_t *uri,\n                                  OBJ_ACC_OPERATE op, uint16_t serverId)\n{\n    if (OBJ_ACC_CREATE == op)\n    {\n        if (!prv_check_instance_auth(accCtrlOiP, uri->objectId, MAX_DATA_VAL, serverId, op))\n        {\n            return COAP_401_UNAUTHORIZED;\n        }\n\n        return COAP_NO_ERROR;\n    }\n    else if (OBJ_ACC_DISCOVER == op)\n    {\n        return COAP_NO_ERROR;\n    }\n    else if (uri->objectId == LWM2M_ACL_OBJECT_ID)\n    {\n        return prv_acc_self_auth_check(accCtrlOiP, uri, op, serverId);\n    }\n    else\n    {\n        if (LWM2M_URI_IS_SET_INSTANCE(uri))\n        {\n            if (!prv_check_instance_auth(accCtrlOiP, uri->objectId, uri->instanceId, serverId, op))\n            {\n                return COAP_401_UNAUTHORIZED;\n            }\n        }\n    }\n\n    return COAP_NO_ERROR;\n}\n\nstatic uint8_t prv_post_action_check(lwm2m_uri_t *uri, OBJ_ACC_OPERATE op)\n{\n    if (LWM2M_URI_IS_SET_RESOURCE(uri))\n    {\n        return COAP_NO_ERROR;\n    }\n    else if (LWM2M_URI_IS_SET_INSTANCE(uri))\n    {\n        if (OBJ_ACC_EXCUTE == op)\n        {\n            return COAP_405_METHOD_NOT_ALLOWED;\n        }\n        else\n        {\n            /*\n             * For the write operation, check whether the resources\n             * can be written or not, is in the write operation of\n             * the specific object.\n             */\n            return COAP_NO_ERROR;\n        }\n    }\n    else\n    {\n        if (OBJ_ACC_WRITE_ATTR == op || OBJ_ACC_CREATE == op)\n        {\n            return COAP_NO_ERROR;\n        }\n        else if (OBJ_ACC_NOTIFY == op\n                 || OBJ_ACC_READ == op || OBJ_ACC_OBSERVE == op)\n        {\n            /*\n             * We should do the auth check in object_read interface\n             * and just ignore here.\n             */\n            return COAP_NO_ERROR;\n        }\n        else\n        {\n            return COAP_405_METHOD_NOT_ALLOWED;\n        }\n    }\n}\n\nstatic int prv_get_srv_cnt(lwm2m_server_t *serverP)\n{\n    lwm2m_server_t *itor = serverP;\n    int cnt = 0;\n\n    while (itor)\n    {\n        if (!itor->dirty)\n        {\n            ++cnt;\n        }\n        itor = itor->next;\n    }\n\n    return cnt;\n}\n\nuint8_t acc_auth_operate(lwm2m_context_t *contextP, lwm2m_uri_t *uri,\n                         OBJ_ACC_OPERATE op, uint16_t serverId)\n{\n    uint8_t ret;\n    lwm2m_object_t *accCtrlObjP;\n    acc_ctrl_oi_t *accCtrlOiP;\n\n    if (prv_get_srv_cnt(contextP->serverList) <= 1)\n    {\n        return COAP_NO_ERROR;\n    }\n\n    if (0 == serverId)\n    {\n        return COAP_NO_ERROR;\n    }\n\n    accCtrlObjP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, LWM2M_ACL_OBJECT_ID);\n\n    if (NULL == accCtrlObjP)\n    {\n        return COAP_401_UNAUTHORIZED;\n    }\n\n    accCtrlOiP = (acc_ctrl_oi_t *)(accCtrlObjP->instanceList);\n\n    if (NULL == accCtrlOiP)\n    {\n        return COAP_401_UNAUTHORIZED;\n    }\n\n    if ((ret = prv_pre_auth_check(accCtrlOiP, uri, op, serverId)) != COAP_NO_ERROR)\n    {\n        return ret;\n    }\n\n    if ((ret = prv_post_action_check(uri, op)) != COAP_NO_ERROR)\n    {\n        return ret;\n    }\n\n    return COAP_NO_ERROR;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/object_binary_app_data_container.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*\n * Implements an object for binary_app_data_container purpose\n *\n *                  Multiple\n * Object                      |  ID   | Instances | Mandatoty |\n * binary_app_data_container   |  19   |    Yes    |    No     |\n *\n *  Resources:\n *              Supported    Multiple\n *  Name | ID | Operations | Instances | Mandatory |  Type   | Range | Units | Description |\n *  Data |  0 |    R/W     |    No     |    Yes    | Opaque  |       |       |             |\n *\n */\n#include \"object_comm.h\"\n#include \"atiny_rpt.h\"\n#include \"log/atiny_log.h\"\n\n\n\n#define PRV_TLV_BUFFER_SIZE 64\n\n#define MIN_SAVE_CNT 1\n#define BINARY_APP_DATA_OBJECT_INSTANCE_NUM 2\n\n\n/*\n * Multiple instance objects can use userdata to store data that will be shared between the different instances.\n * The lwm2m_object_t object structure - which represent every object of the liblwm2m as seen in the single instance\n * object - contain a chained list called instanceList with the object specific structure plat_instance_t:\n */\ntypedef struct _prv_instance_\n{\n    /*\n     * The first two are mandatories and represent the pointer to the next instance and the ID of this one. The rest\n     * is the instance scope user data (uint8_t test in this case)\n     */\n    struct _prv_instance_ *next;    // matches lwm2m_list_t::next\n    uint16_t shortID;               // matches lwm2m_list_t::id\n    rpt_list_t header;\n    uint8_t  test;\n    double   dec;\n#define OPAR_NUM 5\n    uint8_t  opaq[OPAR_NUM];\n} plat_instance_t;\n\n#define ARRAY_MAXNUM  16\nstatic void prv_output_buffer(uint8_t *buffer,\n                              int length)\n{\n    int i;\n    uint8_t array[ARRAY_MAXNUM];\n\n    i = 0;\n    while (i < length)\n    {\n        int j;\n        fprintf(stderr, \"  \");\n\n        memcpy(array, buffer + i, ARRAY_MAXNUM);\n\n        for (j = 0 ; j < ARRAY_MAXNUM && i + j < length; j++)\n        {\n            fprintf(stderr, \"%02X \", array[j]);\n        }\n        while (j < ARRAY_MAXNUM)\n        {\n            fprintf(stderr, \"   \");\n            j++;\n        }\n        fprintf(stderr, \"  \");\n        for (j = 0 ; j < ARRAY_MAXNUM && i + j < length; j++)\n        {\n            if (isprint(array[j]))\n                fprintf(stderr, \"%c \", array[j]);\n            else\n                fprintf(stderr, \". \");\n        }\n        fprintf(stderr, \"\\n\");\n\n        i += ARRAY_MAXNUM;\n    }\n}\n\nstatic uint8_t prv_read_data(plat_instance_t *targetP,\n                             int data_number,\n                             lwm2m_data_t *dataArrayP,\n                             lwm2m_data_cfg_t *dataCfg)\n{\n    int i;\n    data_report_t data;\n    int ret;\n\n    for (i = 0 ; i < data_number ; i++)\n    {\n        switch (dataArrayP[i].id)\n        {\n        case 0:\n            //printf(\"19/0/0 read\\r\\n\");\n            if(NULL == dataCfg)\n            {\n                uint8_t *buf = lwm2m_malloc(sizeof(*buf));\n                if(NULL == buf)\n                {\n                    ATINY_LOG(LOG_ERR, \"malloc null\");\n                    return COAP_404_NOT_FOUND;\n                }\n                *buf = 0;\n                dataArrayP[i].id = 0;\n                dataArrayP[i].type = LWM2M_TYPE_OPAQUE;\n                dataArrayP[i].value.asBuffer.buffer = buf;\n                dataArrayP[i].value.asBuffer.length = 1;\n            }\n            else\n            {\n                ret = atiny_dequeue_rpt_data((targetP->header), &data);\n                if (ret != ATINY_OK)\n                {\n                    ATINY_LOG(LOG_INFO, \"atiny_dequeue_rpt_data fail,ret=%d\", ret);\n                    return COAP_404_NOT_FOUND;\n                }\n                else\n                {\n                    ATINY_LOG(LOG_DEBUG, \"atiny_dequeue_rpt_data sucessfully\");\n                }\n\n                dataArrayP[i].id = 0;\n                dataArrayP[i].type = LWM2M_TYPE_OPAQUE;\n                dataArrayP[i].value.asBuffer.buffer = data.buf;\n                dataArrayP[i].value.asBuffer.length = data.len;\n                dataCfg->type = data.type;\n                dataCfg->cookie = data.cookie;\n                dataCfg->callback = (lwm2m_data_process)data.callback;\n            }\n            break;\n        default:\n            return COAP_404_NOT_FOUND;\n        }\n    }\n\n    return COAP_205_CONTENT;\n}\n\nstatic void prv_destroy_data_buf(int data_number, lwm2m_data_t *data_array)\n{\n    int i;\n    for (i = 0 ; i < data_number; i++)\n    {\n        switch (data_array[i].id)\n        {\n        case 0:\n            if(data_array[i].value.asBuffer.buffer != NULL)\n            {\n                lwm2m_free(data_array[i].value.asBuffer.buffer);\n                data_array[i].value.asBuffer.buffer = NULL;\n                data_array[i].value.asBuffer.length = 0;\n            }\n            break;\n        default:\n            break;\n        }\n\n    }\n\n}\n\nstatic uint8_t prv_read(uint16_t instanceId,\n                        int *numDataP,\n                        lwm2m_data_t **dataArrayP,\n                        lwm2m_data_cfg_t *dataCfg,\n                        lwm2m_object_t *objectP)\n{\n    plat_instance_t *targetP;\n    uint8_t ret;\n    int new_data_flag = false;\n\n\n    targetP = (plat_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);\n    if (NULL == targetP)\n    {\n        ATINY_LOG(LOG_ERR, \"plat inst not found %d\", instanceId);\n        return COAP_404_NOT_FOUND;\n    }\n\n    if (*numDataP == 0)\n    {\n        *dataArrayP = lwm2m_data_new(1);\n        if (*dataArrayP == NULL)\n        {\n            ATINY_LOG(LOG_ERR, \"lwm2m_data_new null\");\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n\n        *numDataP = 1;\n        (*dataArrayP)[0].id = 0;\n        new_data_flag = true;\n    }\n\n    ret = prv_read_data(targetP, *numDataP, *dataArrayP, dataCfg);\n    if(ret != COAP_205_CONTENT)\n    {\n\n        prv_destroy_data_buf(*numDataP, *dataArrayP);\n        if(new_data_flag)\n        {\n            lwm2m_free(*dataArrayP);\n            *dataArrayP = NULL;\n        }\n    }\n\n    return ret;\n}\n\nstatic uint8_t prv_discover(uint16_t instanceId,\n                            int *numDataP,\n                            lwm2m_data_t **dataArrayP,\n                            lwm2m_object_t *objectP)\n{\n    int i;\n\n    // is the server asking for the full object ?\n    if (*numDataP == 0)\n    {\n        *dataArrayP = lwm2m_data_new(3);\n        if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        *numDataP = 3;\n        (*dataArrayP)[0].id = 1;\n        (*dataArrayP)[1].id = 2;\n        (*dataArrayP)[2].id = 3;\n    }\n    else\n    {\n        for (i = 0; i < *numDataP; i++)\n        {\n            switch ((*dataArrayP)[i].id)\n            {\n            case 1:\n            case 2:\n            case 3:\n                break;\n            default:\n                return COAP_404_NOT_FOUND;\n            }\n        }\n    }\n\n    return COAP_205_CONTENT;\n}\n\nstatic uint8_t prv_write(uint16_t instanceId,\n                         int numData,\n                         lwm2m_data_t *dataArray,\n                         lwm2m_object_t *objectP)\n{\n    plat_instance_t *targetP;\n    int i;\n\n    targetP = (plat_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n\n    for (i = 0 ; i < numData ; i++)\n    {\n        switch (dataArray[i].id)\n        {\n        case 0:\n        {\n            (void)atiny_cmd_ioctl(ATINY_WRITE_APP_DATA, (char *)(dataArray[i].value.asBuffer.buffer), dataArray->value.asBuffer.length);\n            break;\n        }\n        default:\n            return COAP_404_NOT_FOUND;\n        }\n    }\n\n    return COAP_204_CHANGED;\n}\n\n\nstatic uint8_t prv_delete(uint16_t id,\n                          lwm2m_object_t *objectP)\n{\n    plat_instance_t *targetP;\n    lwm2m_uri_t uri;\n\n    objectP->instanceList = lwm2m_list_remove(objectP->instanceList, id, (lwm2m_list_t **)&targetP);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n\n    get_resource_uri(objectP->objID,  targetP->shortID,  BINARY_APP_DATA_RES_ID, &uri);\n    (void)atiny_rm_rpt_uri(&uri);\n    lwm2m_free(targetP);\n\n    return COAP_202_DELETED;\n}\n\nstatic uint8_t prv_create(uint16_t instanceId,\n                          int numData,\n                          lwm2m_data_t *dataArray,\n                          lwm2m_object_t *objectP)\n{\n    plat_instance_t *targetP;\n    uint8_t result;\n    int ret;\n    lwm2m_uri_t uri;\n\n\n    targetP = (plat_instance_t *)lwm2m_malloc(sizeof(plat_instance_t));\n    if (NULL == targetP) return COAP_500_INTERNAL_SERVER_ERROR;\n    memset(targetP, 0, sizeof(plat_instance_t));\n    //atiny_list_init(&(targetP->header));\n\n    //TODO: if instanceId not valid\n    get_resource_uri(BINARY_APP_DATA_OBJECT_ID, instanceId, BINARY_APP_DATA_RES_ID, &uri);\n    ret = atiny_add_rpt_uri(&uri, &targetP->header);\n    if(ret != ATINY_OK)\n    {\n        ATINY_LOG(LOG_ERR, \"atiny_add_rpt_uri fail %d\", ret);\n        lwm2m_free(targetP);\n        return COAP_404_NOT_FOUND;\n    }\n\n    targetP->shortID = instanceId;\n    objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, targetP);\n\n    result = prv_write(instanceId, numData, dataArray, objectP);\n\n    if (result != COAP_204_CHANGED)\n    {\n        (void)prv_delete(instanceId, objectP);\n    }\n    else\n    {\n        result = COAP_201_CREATED;\n    }\n\n    return result;\n}\n\nstatic uint8_t prv_exec(uint16_t instanceId,\n                        uint16_t resourceId,\n                        uint8_t *buffer,\n                        int length,\n                        lwm2m_object_t *objectP)\n{\n\n    if (NULL == lwm2m_list_find(objectP->instanceList, instanceId)) return COAP_404_NOT_FOUND;\n\n    switch (resourceId)\n    {\n    case 0:\n    {\n        ATINY_LOG(LOG_INFO, \"no in prv_exec+++++++++++++++++++++++++++\");\n        return COAP_204_CHANGED;\n    }\n    case 1:\n        return COAP_405_METHOD_NOT_ALLOWED;\n    case 2:\n        fprintf(stdout, \"\\r\\n-----------------\\r\\n\"\n                \"Execute on %hu/%d/%d\\r\\n\"\n                \" Parameter (%d bytes):\\r\\n\",\n                objectP->objID, instanceId, resourceId, length);\n        prv_output_buffer((uint8_t *)buffer, length);\n        fprintf(stdout, \"-----------------\\r\\n\\r\\n\");\n        return COAP_204_CHANGED;\n    case 3:\n        return COAP_405_METHOD_NOT_ALLOWED;\n    default:\n        return COAP_404_NOT_FOUND;\n    }\n}\n\nvoid display_binary_app_data_object(lwm2m_object_t *object)\n{\n#ifdef WITH_LOGS\n    fprintf(stdout, \"  /%u: Test object, instances:\\r\\n\", object->objID);\n    plat_instance_t *instance = (plat_instance_t *)object->instanceList;\n    while (instance != NULL)\n    {\n        fprintf(stdout, \"    /%u/%u: shortId: %u, test: %u\\r\\n\",\n                object->objID, instance->shortID,\n                instance->shortID, instance->test);\n        instance = (plat_instance_t *)instance->next;\n    }\n#endif\n}\n\nlwm2m_object_t *get_binary_app_data_object(atiny_param_t *atiny_params)\n{\n    lwm2m_object_t *appObj;\n\n    appObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));\n\n    if (NULL != appObj)\n    {\n        int i;\n        plat_instance_t *targetP;\n        lwm2m_uri_t uri;\n        int ret = ATINY_OK;\n\n        memset(appObj, 0, sizeof(lwm2m_object_t));\n\n        appObj->objID = BINARY_APP_DATA_OBJECT_ID;\n        for (i = 0 ; i < BINARY_APP_DATA_OBJECT_INSTANCE_NUM; i++)\n        {\n            targetP = (plat_instance_t *)lwm2m_malloc(sizeof(plat_instance_t));\n            if (NULL == targetP)\n            {\n                break;\n            }\n            memset(targetP, 0, sizeof(plat_instance_t));\n            get_resource_uri(BINARY_APP_DATA_OBJECT_ID, i, BINARY_APP_DATA_RES_ID, &uri);\n            ret = atiny_add_rpt_uri(&uri, &targetP->header);\n            if(ret != ATINY_OK)\n            {\n                ATINY_LOG(LOG_ERR, \"atiny_add_rpt_uri fail %d\", ret);\n                lwm2m_free(targetP);\n                break;\n            }\n            (void)atiny_set_max_rpt_cnt(&uri, MAX(MIN_SAVE_CNT, atiny_params->server_params.storing_cnt));\n            targetP->shortID = i;\n            appObj->instanceList = LWM2M_LIST_ADD(appObj->instanceList, targetP);\n        }\n\n        if(i < BINARY_APP_DATA_OBJECT_INSTANCE_NUM)\n        {\n            free_binary_app_data_object(appObj);\n            return NULL;\n        }\n\n        /*\n         * From a single instance object, two more functions are available.\n         * - The first one (createFunc) create a new instance and filled it with the provided informations. If an ID is\n         *   provided a check is done for verifying his disponibility, or a new one is generated.\n         * - The other one (deleteFunc) delete an instance by removing it from the instance list (and freeing the memory\n         *   allocated to it)\n         */\n        appObj->readFunc = prv_read;\n        appObj->discoverFunc = prv_discover;\n        appObj->writeFunc = prv_write;\n        appObj->executeFunc = prv_exec;\n        appObj->createFunc = prv_create;\n        appObj->deleteFunc = prv_delete;\n    }\n\n    return appObj;\n}\n\nstatic void free_binary_app_data_object_rpt(lwm2m_object_t *object)\n{\n    lwm2m_list_t *cur = object->instanceList;\n    lwm2m_uri_t uri;\n    while(cur)\n    {\n        get_resource_uri(object->objID, ((plat_instance_t *)cur)->shortID, BINARY_APP_DATA_RES_ID, &uri);\n        (void)atiny_rm_rpt_uri(&uri);\n        cur = cur->next;\n    }\n}\n\nvoid free_binary_app_data_object(lwm2m_object_t *object)\n{\n    free_binary_app_data_object_rpt(object);\n    LWM2M_LIST_FREE(object->instanceList);\n    if (object->userData != NULL)\n    {\n        lwm2m_free(object->userData);\n        object->userData = NULL;\n    }\n    lwm2m_free(object);\n}\n\nvoid set_binary_app_data_object_rpt_max_cnt(uint32_t max_rpt_cnt)\n{\n    lwm2m_uri_t uri;\n\n    get_resource_uri(BINARY_APP_DATA_OBJECT_ID, 0, BINARY_APP_DATA_RES_ID, &uri);\n    (void)atiny_set_max_rpt_cnt(&uri, MAX(MIN_SAVE_CNT, max_rpt_cnt));\n}\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/object_comm.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2014 Bosch Software Innovations GmbH, Germany.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Bosch Software Innovations GmbH - Please refer to git log\n *\n *******************************************************************************/\n/*\n * object_comm.h\n *\n *  General functions of lwm2m test client.\n *\n *  Created on: 22.01.2015\n *  Author: Achim Kraus\n *  Copyright (c) 2015 Bosch Software Innovations GmbH, Germany. All rights reserved.\n */\n\n#ifndef OBJECT_COMM_H_\n#define OBJECT_COMM_H_\n\n#include \"internals.h\"\n#include \"atiny_lwm2m/agenttiny.h\"\n#include \"connection.h\"\n#include \"agent_list.h\"\n\n#ifndef MAX\n#define MAX(a, b) ((a) >= (b)? (a) : (b))\n#endif\n\nextern int g_reboot;\n\ntypedef struct\n{\n    lwm2m_object_t * securityObjP;\n    lwm2m_object_t * serverObject;\n    connection_t  *connList;\n    lwm2m_context_t * lwm2mH;\n} client_data_t;\n\ntypedef struct _security_instance_\n{\n    struct _security_instance_ * next;        // matches lwm2m_list_t::next\n    uint16_t                     instanceId;  // matches lwm2m_list_t::id\n    char *                       uri;\n    bool                         isBootstrap;\n    uint8_t                      securityMode;\n    char *                       publicIdentity;\n    uint16_t                     publicIdLen;\n    char *                       serverPublicKey;\n    uint16_t                     serverPublicKeyLen;\n    char *                       secretKey;\n    uint16_t                     secretKeyLen;\n    uint8_t                      smsSecurityMode;\n    char *                       smsParams; // SMS binding key parameters\n    uint16_t                     smsParamsLen;\n    char *                       smsSecret; // SMS binding secret key\n    uint16_t                     smsSecretLen;\n    uint16_t                     shortID;\n    uint32_t                     clientHoldOffTime;\n    uint32_t                     bootstrapServerAccountTimeout;\n} security_instance_t;\n\ntypedef struct _data_node_t\n{\n    atiny_dl_list list;\n    data_report_t data;\n}data_node_t;\n/*\n * object_device.c\n */\nlwm2m_object_t * get_object_device(atiny_param_t *atiny_params, const char* manufacturer);\nvoid free_object_device(lwm2m_object_t * objectP);\nvoid display_device_object(lwm2m_object_t * objectP);\n/*\n * object_firmware.c\n */\nlwm2m_object_t * get_object_firmware(atiny_param_t *atiny_params);\nvoid free_object_firmware(lwm2m_object_t * objectP);\n/*\n * object_location.c\n */\nlwm2m_object_t * get_object_location(void);\nvoid free_object_location(lwm2m_object_t * object);\nvoid display_location_object(lwm2m_object_t * objectP);\n/*\n * object_test.c\n */\n#define TEST_OBJECT_ID 31024\nlwm2m_object_t * get_test_object(void);\nvoid free_test_object(lwm2m_object_t * object);\nvoid display_test_object(lwm2m_object_t * objectP);\n\n/*\n * binary_app_data_object.c\n */\n#define BINARY_APP_DATA_OBJECT_ID 19\n#define BINARY_APP_DATA_RES_ID 0\nlwm2m_object_t * get_binary_app_data_object(atiny_param_t *atiny_params);\nvoid free_binary_app_data_object(lwm2m_object_t * object);\nvoid display_binary_app_data_object(lwm2m_object_t * objectP);\nvoid set_binary_app_data_object_rpt_max_cnt(uint32_t max_rpt_cnt);\n\n\n/*\n * object_server.c\n */\nlwm2m_object_t * get_server_object(int serverId, const char* binding, int lifetime, bool storing);\nvoid clean_server_object(lwm2m_object_t * object);\nvoid display_server_object(lwm2m_object_t * objectP);\nvoid copy_server_object(lwm2m_object_t * objectDest, lwm2m_object_t * objectSrc);\n\n/*\n * object_connectivity_moni.c\n */\nlwm2m_object_t * get_object_conn_m(atiny_param_t *atiny_params);\nvoid free_object_conn_m(lwm2m_object_t * objectP);\nuint8_t connectivity_moni_change(lwm2m_data_t * dataArray, lwm2m_object_t * objectP);\n\n/*\n * object_connectivity_stat.c\n */\nextern lwm2m_object_t * get_object_conn_s(void);\nvoid free_object_conn_s(lwm2m_object_t * objectP);\nextern void conn_s_updateTxStatistic(lwm2m_object_t * objectP, uint16_t txDataByte, bool smsBased);\nextern void conn_s_updateRxStatistic(lwm2m_object_t * objectP, uint16_t rxDataByte, bool smsBased);\n\n/*\n * object_access_control.c\n */\ntypedef enum\n{\n    OBJ_ACC_READ       = 0,\n    OBJ_ACC_WRITE_ATTR = 0,\n    OBJ_ACC_OBSERVE    = 0,\n    OBJ_ACC_NOTIFY     = 0,\n    OBJ_ACC_WRITE      = 1,\n    OBJ_ACC_EXCUTE     = 2,\n    OBJ_ACC_DELETE     = 3,\n    OBJ_ACC_CREATE     = 4,\n    OBJ_ACC_DISCOVER   = 5,\n\n} OBJ_ACC_OPERATE;\n\n#define ACC_AUTH_R     (0x01 << OBJ_ACC_READ)\n#define ACC_AUTH_W     (0x01 << OBJ_ACC_WRITE)\n#define ACC_AUTH_E     (0x01 << OBJ_ACC_EXCUTE)\n#define ACC_AUTH_D     (0x01 << OBJ_ACC_DELETE)\n#define ACC_AUTH_C     (0x01 << OBJ_ACC_CREATE)\n\nlwm2m_object_t* acc_ctrl_create_object(void);\nvoid acl_ctrl_free_object(lwm2m_object_t * objectP);\nbool  acc_ctrl_obj_add_inst (lwm2m_object_t* accCtrlObjP, uint16_t instId,\n                 uint16_t acObjectId, uint16_t acObjInstId, uint16_t acOwner);\nbool  acc_ctrl_oi_add_ac_val(lwm2m_object_t* accCtrlObjP, uint16_t instId,\n                 uint16_t aclResId, uint16_t acValue);\nuint8_t acc_auth_operate(lwm2m_context_t* contextP, lwm2m_uri_t* uri,\n                 OBJ_ACC_OPERATE op, uint16_t serverId);\n\n/*\n * object_comm.c\n */\nvoid handle_value_changed(lwm2m_context_t* lwm2mH, lwm2m_uri_t* uri, const char * value, size_t valueLength);\n\n/*\n * object_security.c\n */\nlwm2m_object_t * get_security_object(uint16_t serverId,atiny_param_t* atiny_params,lwm2m_context_t* lwm2m_context);\nvoid clean_security_object(lwm2m_object_t * objectP);\nchar * get_server_uri(lwm2m_object_t * objectP, uint16_t secObjInstID);\nvoid display_security_object(lwm2m_object_t * objectP);\nvoid copy_security_object(lwm2m_object_t * objectDest, lwm2m_object_t * objectSrc);\n\nint prv_refreshServerList(lwm2m_context_t * contextP);\nvoid output_buffer(FILE * stream, uint8_t * buffer, int length, int indent);\nvoid atiny_set_reboot_flag(void);\n#endif /* LWM2MCLIENT_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/object_connectivity_moni.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2014 Bosch Software Innovations GmbH Germany.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n *  This Connectivity Monitoring object is optional and has a single instance\n *\n *  Resources:\n *\n *          Name             | ID | Oper. | Inst. | Mand.|  Type   | Range | Units |\n *  Network Bearer           |  0 |  R    | Single|  Yes | Integer |       |       |\n *  Available Network Bearer |  1 |  R    | Multi |  Yes | Integer |       |       |\n *  Radio Signal Strength    |  2 |  R    | Single|  Yes | Integer |       | dBm   |\n *  Link Quality             |  3 |  R    | Single|  No  | Integer | 0-100 |   %   |\n *  IP Addresses             |  4 |  R    | Multi |  Yes | String  |       |       |\n *  Router IP Addresses      |  5 |  R    | Multi |  No  | String  |       |       |\n *  Link Utilization         |  6 |  R    | Single|  No  | Integer | 0-100 |   %   |\n *  APN                      |  7 |  R    | Multi |  No  | String  |       |       |\n *  Cell ID                  |  8 |  R    | Single|  No  | Integer |       |       |\n *  SMNC                     |  9 |  R    | Single|  No  | Integer | 0-999 |   %   |\n *  SMCC                     | 10 |  R    | Single|  No  | Integer | 0-999 |       |\n *\n */\n\n#include \"internals.h\"\n#include \"atiny_lwm2m/agenttiny.h\"\n\n// Resource Id's:\n#define RES_M_NETWORK_BEARER            0\n#define RES_M_AVL_NETWORK_BEARER        1\n#define RES_M_RADIO_SIGNAL_STRENGTH     2\n#define RES_O_LINK_QUALITY              3\n#define RES_M_IP_ADDRESSES              4\n#define RES_O_ROUTER_IP_ADDRESS         5\n#define RES_O_LINK_UTILIZATION          6\n#define RES_O_APN                       7\n#define RES_O_CELL_ID                   8\n#define RES_O_SMNC                      9\n#define RES_O_SMCC                      10\n\n#define VALUE_NETWORK_BEARER_GSM    0   //GSM see\n#define VALUE_AVL_NETWORK_BEARER_1  0   //GSM\n#define VALUE_AVL_NETWORK_BEARER_2  21  //WLAN\n#define VALUE_AVL_NETWORK_BEARER_3  41  //Ethernet\n#define VALUE_AVL_NETWORK_BEARER_4  42  //DSL\n#define VALUE_AVL_NETWORK_BEARER_5  43  //PLC\n#define VALUE_IP_ADDRESS_1              \"192.168.178.101\"\n#define VALUE_IP_ADDRESS_2              \"192.168.178.102\"\n#define VALUE_ROUTER_IP_ADDRESS_1       \"192.168.178.001\"\n#define VALUE_ROUTER_IP_ADDRESS_2       \"192.168.178.002\"\n#define VALUE_APN_1                     \"web.vodafone.de\"\n#define VALUE_APN_2                     \"cda.vodafone.de\"\n#define VALUE_CELL_ID                   69696969\n#define VALUE_RADIO_SIGNAL_STRENGTH     80                  //dBm\n#define VALUE_LINK_QUALITY              98\n#define VALUE_LINK_UTILIZATION          666\n#define VALUE_SMNC                      33\n#define VALUE_SMCC                      44\n#define IP4ADDR_STRLEN_MAX              16\n#define IPADDRT_LIMIT 2\ntypedef struct\n{\n    char ipAddresses[IPADDRT_LIMIT][IP4ADDR_STRLEN_MAX];        // limited to 2!\n    char routerIpAddresses[IPADDRT_LIMIT][IP4ADDR_STRLEN_MAX];  // limited to 2!\n    long cellId;\n    int signalStrength;\n    int linkQuality;\n    int linkUtilization;\n} conn_m_data_t;\n\nstatic uint8_t prv_set_value(lwm2m_data_t *dataP,\n                             conn_m_data_t *connDataP)\n{\n    switch (dataP->id)\n    {\n    case RES_M_NETWORK_BEARER:\n        lwm2m_data_encode_int(VALUE_NETWORK_BEARER_GSM, dataP);\n        return COAP_205_CONTENT;\n    case RES_M_AVL_NETWORK_BEARER:\n    {\n        int riCnt = 1;   // reduced to 1 instance to fit in one block size\n        lwm2m_data_t *subTlvP;\n        int networkbearer = 0;\n\n        subTlvP = lwm2m_data_new(riCnt);\n        if (subTlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        subTlvP[0].id    = 0;\n        (void)atiny_cmd_ioctl(ATINY_GET_NETWORK_BEARER, (char *)&networkbearer, sizeof(int));\n        lwm2m_data_encode_int(networkbearer, subTlvP);\n        lwm2m_data_encode_instances(subTlvP, riCnt, dataP);\n        return COAP_205_CONTENT ;\n    }\n    case RES_M_RADIO_SIGNAL_STRENGTH: //s-int\n    {\n        int signalstrength = 0;\n        (void)atiny_cmd_ioctl(ATINY_GET_SIGNAL_STRENGTH, (char *)&signalstrength, sizeof(int));\n        lwm2m_data_encode_int(connDataP->signalStrength, dataP);\n        return COAP_205_CONTENT;\n    }\n    case RES_O_LINK_QUALITY: //s-int\n    {\n        int linkQuality;\n        (void)atiny_cmd_ioctl(ATINY_GET_LINK_QUALITY, (char *)&linkQuality, sizeof(int));\n        lwm2m_data_encode_int(linkQuality, dataP);\n        return COAP_205_CONTENT ;\n    }\n    case RES_M_IP_ADDRESSES:\n    {\n        int ri, riCnt = 1;   // reduced to 1 instance to fit in one block size\n        lwm2m_data_t *subTlvP = lwm2m_data_new(riCnt);\n        if (subTlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        for (ri = 0; ri < riCnt; ri++)\n        {\n            subTlvP[ri].id = ri;\n            lwm2m_data_encode_string(connDataP->ipAddresses[ri], subTlvP + ri);\n        }\n        lwm2m_data_encode_instances(subTlvP, riCnt, dataP);\n        return COAP_205_CONTENT ;\n    }\n    case RES_O_ROUTER_IP_ADDRESS:\n    {\n        int ri, riCnt = 1;   // reduced to 1 instance to fit in one block size\n        lwm2m_data_t *subTlvP = lwm2m_data_new(riCnt);\n        if (subTlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        for (ri = 0; ri < riCnt; ri++)\n        {\n            subTlvP[ri].id = ri;\n            lwm2m_data_encode_string(connDataP->routerIpAddresses[ri], subTlvP + ri);\n        }\n        lwm2m_data_encode_instances(subTlvP, riCnt, dataP);\n        return COAP_205_CONTENT ;\n    }\n    case RES_O_LINK_UTILIZATION:\n    {\n        int linkUtilization;\n        (void)atiny_cmd_ioctl(ATINY_GET_LINK_UTILIZATION, (char *)&linkUtilization, sizeof(int));\n        lwm2m_data_encode_int(connDataP->linkUtilization, dataP);\n        return COAP_205_CONTENT;\n    }\n    case RES_O_APN:\n    {\n        int riCnt = 1;   // reduced to 1 instance to fit in one block size\n        lwm2m_data_t *subTlvP;\n        subTlvP = lwm2m_data_new(riCnt);\n        if (subTlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        subTlvP[0].id     = 0;\n        lwm2m_data_encode_string(VALUE_APN_1, subTlvP);\n        lwm2m_data_encode_instances(subTlvP, riCnt, dataP);\n        return COAP_205_CONTENT;\n    }\n    case RES_O_CELL_ID:\n    {\n        int cellId = 0;\n        (void)atiny_cmd_ioctl(ATINY_GET_CELL_ID, (char *)&cellId, sizeof(int));\n        lwm2m_data_encode_int(cellId, dataP);\n        return COAP_205_CONTENT ;\n    }\n\n    case RES_O_SMNC:\n        lwm2m_data_encode_int(VALUE_SMNC, dataP);\n        return COAP_205_CONTENT ;\n\n    case RES_O_SMCC:\n        lwm2m_data_encode_int(VALUE_SMCC, dataP);\n        return COAP_205_CONTENT ;\n\n    default:\n        return COAP_404_NOT_FOUND ;\n    }\n}\n\nstatic uint8_t prv_read(uint16_t instanceId,\n                        int *numDataP,\n                        lwm2m_data_t **dataArrayP,\n                        lwm2m_data_cfg_t *dataCfg,\n                        lwm2m_object_t *objectP)\n{\n    uint8_t result;\n    int i;\n\n    // this is a single instance object\n    if (instanceId != 0)\n    {\n        return COAP_404_NOT_FOUND ;\n    }\n\n    // is the server asking for the full object ?\n    if (*numDataP == 0)\n    {\n        uint16_t resList[] =\n        {\n            RES_M_NETWORK_BEARER,\n            RES_M_AVL_NETWORK_BEARER,\n            RES_M_RADIO_SIGNAL_STRENGTH,\n            RES_O_LINK_QUALITY,\n            RES_M_IP_ADDRESSES,\n            RES_O_ROUTER_IP_ADDRESS,\n            RES_O_LINK_UTILIZATION,\n            RES_O_APN,\n            RES_O_CELL_ID,\n            RES_O_SMNC,\n            RES_O_SMCC\n        };\n        int nbRes = sizeof(resList) / sizeof(uint16_t);\n\n        *dataArrayP = lwm2m_data_new(nbRes);\n        if (*dataArrayP == NULL)\n            return COAP_500_INTERNAL_SERVER_ERROR ;\n        *numDataP = nbRes;\n        for (i = 0; i < nbRes; i++)\n        {\n            (*dataArrayP)[i].id = resList[i];\n        }\n    }\n\n    i = 0;\n    do\n    {\n        result = prv_set_value((*dataArrayP) + i, (conn_m_data_t *) (objectP->userData));\n        i++;\n    }\n    while (i < *numDataP && result == COAP_205_CONTENT );\n\n    return result;\n}\n\nlwm2m_object_t *get_object_conn_m(atiny_param_t *atiny_params)\n{\n    /*\n     * The get_object_conn_m() function create the object itself and return a pointer to the structure that represent it.\n     */\n    lwm2m_object_t *connObj;\n\n    connObj = (lwm2m_object_t *) lwm2m_malloc(sizeof(lwm2m_object_t));\n\n    if (NULL != connObj)\n    {\n        memset(connObj, 0, sizeof(lwm2m_object_t));\n\n        /*\n         * It assigns his unique ID\n         */\n        connObj->objID = LWM2M_CONN_MONITOR_OBJECT_ID;\n\n        /*\n         * and its unique instance\n         *\n         */\n        connObj->instanceList = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t));\n        if (NULL != connObj->instanceList)\n        {\n            memset(connObj->instanceList, 0, sizeof(lwm2m_list_t));\n        }\n        else\n        {\n            lwm2m_free(connObj);\n            return NULL;\n        }\n\n        /*\n         * And the private function that will access the object.\n         * Those function will be called when a read/write/execute query is made by the server. In fact the library don't need to\n         * know the resources of the object, only the server does.\n         */\n        connObj->readFunc = prv_read;\n        connObj->executeFunc = NULL;\n        connObj->userData = lwm2m_malloc(sizeof(conn_m_data_t));\n\n        /*\n         * Also some user data can be stored in the object with a private structure containing the needed variables\n         */\n        if (NULL != connObj->userData)\n        {\n            conn_m_data_t *myData = (conn_m_data_t *) connObj->userData;\n            memset((void *)myData, 0, sizeof(conn_m_data_t));\n            myData->cellId          = VALUE_CELL_ID;\n            myData->signalStrength  = VALUE_RADIO_SIGNAL_STRENGTH;\n            myData->linkQuality     = VALUE_LINK_QUALITY;\n            myData->linkUtilization = VALUE_LINK_UTILIZATION;\n            strncpy(myData->ipAddresses[0], VALUE_IP_ADDRESS_1, IP4ADDR_STRLEN_MAX - 1);\n            strncpy(myData->ipAddresses[1], VALUE_IP_ADDRESS_2, IP4ADDR_STRLEN_MAX - 1);\n            strncpy(myData->routerIpAddresses[0], VALUE_ROUTER_IP_ADDRESS_1, IP4ADDR_STRLEN_MAX - 1);\n            strncpy(myData->routerIpAddresses[1], VALUE_ROUTER_IP_ADDRESS_2, IP4ADDR_STRLEN_MAX - 1);\n        }\n        else\n        {\n            lwm2m_list_free(connObj->instanceList);\n            lwm2m_free(connObj);\n            connObj = NULL;\n        }\n    }\n    return connObj;\n}\n\nvoid free_object_conn_m(lwm2m_object_t *objectP)\n{\n    lwm2m_free(objectP->userData);\n    lwm2m_list_free(objectP->instanceList);\n    lwm2m_free(objectP);\n}\n\nuint8_t connectivity_moni_change(lwm2m_data_t *dataArray,\n                                 lwm2m_object_t *objectP)\n{\n    int64_t value;\n    uint8_t result;\n    conn_m_data_t *data;\n\n    data = (conn_m_data_t *) (objectP->userData);\n\n    switch (dataArray->id)\n    {\n    case RES_M_RADIO_SIGNAL_STRENGTH:\n        if (1 == lwm2m_data_decode_int(dataArray, &value))\n        {\n            data->signalStrength = value;\n            result = COAP_204_CHANGED;\n        }\n        else\n        {\n            result = COAP_400_BAD_REQUEST;\n        }\n        break;\n\n    case RES_O_LINK_QUALITY:\n        if (1 == lwm2m_data_decode_int(dataArray, &value))\n        {\n            data->linkQuality = value;\n            result = COAP_204_CHANGED;\n        }\n        else\n        {\n            result = COAP_400_BAD_REQUEST;\n        }\n        break;\n\n    case RES_M_IP_ADDRESSES:\n        if (sizeof(data->ipAddresses[0]) <= dataArray->value.asBuffer.length)\n        {\n            result = COAP_400_BAD_REQUEST;\n        }\n        else\n        {\n            memset(data->ipAddresses[0], 0, sizeof(data->ipAddresses[0]));\n            memcpy(data->ipAddresses[0], dataArray->value.asBuffer.buffer, dataArray->value.asBuffer.length);\n            data->ipAddresses[0][dataArray->value.asBuffer.length] = 0;\n            result = COAP_204_CHANGED;\n        }\n        break;\n\n    case RES_O_ROUTER_IP_ADDRESS:\n        if (sizeof(data->routerIpAddresses[0]) <= dataArray->value.asBuffer.length)\n        {\n            result = COAP_400_BAD_REQUEST;\n        }\n        else\n        {\n            memset(data->routerIpAddresses[0], 0, sizeof(data->routerIpAddresses[0]));\n            memcpy(data->routerIpAddresses[0], dataArray->value.asBuffer.buffer, dataArray->value.asBuffer.length);\n            data->routerIpAddresses[0][dataArray->value.asBuffer.length] = 0;\n            result = COAP_204_CHANGED;\n        }\n        break;\n\n    case RES_O_CELL_ID:\n        if (1 == lwm2m_data_decode_int(dataArray, &value))\n        {\n            data->cellId = value;\n            result = COAP_204_CHANGED;\n        }\n        else\n        {\n            result = COAP_400_BAD_REQUEST;\n        }\n        break;\n\n    default:\n        result = COAP_405_METHOD_NOT_ALLOWED;\n    }\n\n    return result;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/object_connectivity_stat.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2015 Bosch Software Innovations GmbH Germany.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Bosch Software Innovations GmbH - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n * This connectivity statistics object is optional and single instance only\n *\n *  Resources:\n *\n *          Name         | ID | Oper. | Inst. | Mand.|  Type   | Range | Units | Description |\n *  SMS Tx Counter       |  0 |   R   | Single|  No  | Integer |       |       |             |\n *  SMS Rx Counter       |  1 |   R   | Single|  No  | Integer |       |       |             |\n *  Tx Data              |  2 |   R   | Single|  No  | Integer |       | kByte |             |\n *  Rx Data              |  3 |   R   | Single|  No  | Integer |       | kByte |             |\n *  Max Message Size     |  4 |   R   | Single|  No  | Integer |       | Byte  |             |\n *  Average Message Size |  5 |   R   | Single|  No  | Integer |       | Byte  |             |\n *  StartOrReset         |  6 |   E   | Single|  Yes | Integer |       |       |             |\n */\n\n#include \"internals.h\"\n\n// Resource Id's:\n#define RES_O_SMS_TX_COUNTER            0\n#define RES_O_SMS_RX_COUNTER            1\n#define RES_O_TX_DATA                   2\n#define RES_O_RX_DATA                   3\n#define RES_O_MAX_MESSAGE_SIZE          4\n#define RES_O_AVERAGE_MESSAGE_SIZE      5\n#define RES_M_START_OR_RESET            6\n\ntypedef struct\n{\n    int64_t   smsTxCounter;\n    int64_t   smsRxCounter;\n    int64_t   txDataByte;             // report in kByte!\n    int64_t   rxDataByte;             // report in kByte!\n    int64_t   maxMessageSize;\n    int64_t   avrMessageSize;\n    int64_t   messageCount;           // private for incremental average calc.\n    bool      collectDataStarted;\n} conn_s_data_t;\n\nstatic uint8_t prv_set_tlv(lwm2m_data_t *dataP, conn_s_data_t *connStDataP)\n{\n    switch (dataP->id)\n    {\n    case RES_O_SMS_TX_COUNTER:\n        lwm2m_data_encode_int(connStDataP->smsTxCounter, dataP);\n        return COAP_205_CONTENT;\n    case RES_O_SMS_RX_COUNTER:\n        lwm2m_data_encode_int(connStDataP->smsRxCounter, dataP);\n        return COAP_205_CONTENT;\n    case RES_O_TX_DATA:\n        lwm2m_data_encode_int(connStDataP->txDataByte / 1024, dataP);\n        return COAP_205_CONTENT;\n    case RES_O_RX_DATA:\n        lwm2m_data_encode_int(connStDataP->rxDataByte / 1024, dataP);\n        return COAP_205_CONTENT;\n    case RES_O_MAX_MESSAGE_SIZE:\n        lwm2m_data_encode_int(connStDataP->maxMessageSize, dataP);\n        return COAP_205_CONTENT;\n    case RES_O_AVERAGE_MESSAGE_SIZE:\n        lwm2m_data_encode_int(connStDataP->avrMessageSize, dataP);\n        return COAP_205_CONTENT;\n    default:\n        return COAP_404_NOT_FOUND ;\n    }\n}\n\nstatic uint8_t prv_read(uint16_t instanceId, int *numDataP, lwm2m_data_t **dataArrayP, lwm2m_data_cfg_t *dataCfg, lwm2m_object_t *objectP)\n{\n    uint8_t result;\n    int i;\n\n    // this is a single instance object\n    if (instanceId != 0)\n    {\n        return COAP_404_NOT_FOUND ;\n    }\n\n    // is the server asking for the full object ?\n    if (*numDataP == 0)\n    {\n        uint16_t resList[] =\n        {\n            RES_O_SMS_TX_COUNTER,\n            RES_O_SMS_RX_COUNTER,\n            RES_O_TX_DATA,\n            RES_O_RX_DATA,\n            RES_O_MAX_MESSAGE_SIZE,\n            RES_O_AVERAGE_MESSAGE_SIZE\n        };\n        int nbRes = sizeof(resList) / sizeof(uint16_t);\n\n        *dataArrayP = lwm2m_data_new(nbRes);\n        if (*dataArrayP == NULL)\n            return COAP_500_INTERNAL_SERVER_ERROR ;\n        *numDataP = nbRes;\n        for (i = 0; i < nbRes; i++)\n        {\n            (*dataArrayP)[i].id = resList[i];\n        }\n    }\n\n    i = 0;\n    do\n    {\n        result = prv_set_tlv((*dataArrayP) + i, (conn_s_data_t *) (objectP->userData));\n        i++;\n    }\n    while (i < *numDataP && result == COAP_205_CONTENT );\n\n    return result;\n}\n\nstatic void prv_resetCounter(lwm2m_object_t *objectP, bool start)\n{\n    conn_s_data_t *myData = (conn_s_data_t *) objectP->userData;\n    myData->smsTxCounter        = 0;\n    myData->smsRxCounter        = 0;\n    myData->txDataByte          = 0;\n    myData->rxDataByte          = 0;\n    myData->maxMessageSize      = 0;\n    myData->avrMessageSize      = 0;\n    myData->messageCount        = 0;\n    myData->collectDataStarted  = start;\n}\n\nstatic uint8_t prv_exec(uint16_t instanceId, uint16_t resourceId,\n                        uint8_t *buffer, int length, lwm2m_object_t *objectP)\n{\n    // this is a single instance object\n    if (instanceId != 0)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    if (length != 0) return COAP_400_BAD_REQUEST;\n\n    switch (resourceId)\n    {\n    case RES_M_START_OR_RESET:\n        prv_resetCounter(objectP, true);\n        return COAP_204_CHANGED;\n    default:\n        return COAP_405_METHOD_NOT_ALLOWED;\n    }\n}\n\nvoid conn_s_updateTxStatistic(lwm2m_object_t *objectP, uint16_t txDataByte, bool smsBased)\n{\n    conn_s_data_t *myData = (conn_s_data_t *) (objectP->userData);\n    if (myData->collectDataStarted)\n    {\n        myData->txDataByte += txDataByte;\n        myData->messageCount++;\n        myData->avrMessageSize = (myData->txDataByte + myData->rxDataByte) /\n                                 myData->messageCount;\n        if (txDataByte > myData->maxMessageSize)\n            myData->maxMessageSize = txDataByte;\n        if (smsBased) myData->smsTxCounter++;\n    }\n}\n\nvoid conn_s_updateRxStatistic(lwm2m_object_t *objectP, uint16_t rxDataByte, bool smsBased)\n{\n    conn_s_data_t *myData = (conn_s_data_t *) (objectP->userData);\n    if (myData->collectDataStarted)\n    {\n        myData->rxDataByte += rxDataByte;\n        myData->messageCount++;\n        myData->avrMessageSize = (myData->txDataByte + myData->rxDataByte) /\n                                 myData->messageCount;\n        if (rxDataByte > myData->maxMessageSize)\n            myData->maxMessageSize = rxDataByte;\n        myData->txDataByte += rxDataByte;\n        if (smsBased) myData->smsRxCounter++;\n    }\n}\n\n\nlwm2m_object_t *get_object_conn_s(void)\n{\n    /*\n     * The get_object_conn_s() function create the object itself and return\n     * a pointer to the structure that represent it.\n     */\n    lwm2m_object_t *connObj;\n\n    connObj = (lwm2m_object_t *) lwm2m_malloc(sizeof(lwm2m_object_t));\n\n    if (NULL != connObj)\n    {\n        memset(connObj, 0, sizeof(lwm2m_object_t));\n\n        /*\n         * It assign his unique ID\n         * The 7 is the standard ID for the optional object \"Connectivity Statistics\".\n         */\n        connObj->objID = LWM2M_CONN_STATS_OBJECT_ID;\n        connObj->instanceList = lwm2m_malloc(sizeof(lwm2m_list_t));\n        if (NULL != connObj->instanceList)\n        {\n            memset(connObj->instanceList, 0, sizeof(lwm2m_list_t));\n        }\n        else\n        {\n            lwm2m_free(connObj);\n            return NULL;\n        }\n\n        /*\n         * And the private function that will access the object.\n         * Those function will be called when a read/execute/close\n         * query is made by the server or core. In fact the library don't need\n         * to know the resources of the object, only the server does.\n         */\n        connObj->readFunc     = prv_read;\n        connObj->executeFunc  = prv_exec;\n        connObj->userData     = lwm2m_malloc(sizeof(conn_s_data_t));\n\n        /*\n         * Also some user data can be stored in the object with a private\n         * structure containing the needed variables.\n         */\n        if (NULL != connObj->userData)\n        {\n            prv_resetCounter(connObj, false);\n        }\n        else\n        {\n            lwm2m_free(connObj->instanceList);\n            lwm2m_free(connObj);\n            connObj = NULL;\n        }\n    }\n    return connObj;\n}\n\nvoid free_object_conn_s(lwm2m_object_t *objectP)\n{\n    lwm2m_free(objectP->userData);\n    lwm2m_list_free(objectP->instanceList);\n    lwm2m_free(objectP);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/object_device.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    domedambrosio - Please refer to git log\n *    Fabien Fleutot - Please refer to git log\n *    Axel Lorente - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n/*\n * This object is single instance only, and is mandatory to all LWM2M device as it describe the object such as its\n * manufacturer, model, etc...\n */\n\n#include \"object_comm.h\"\n\n#define PRV_OFFSET_MAXLEN   7 //+HH:MM\\0 at max\n#define PRV_TIMEZONE_MAXLEN 25\n#define MAX_STRING_LEN  64\n\n// Resource Id's:\n#define RES_O_MANUFACTURER          0\n#define RES_O_MODEL_NUMBER          1\n#define RES_O_SERIAL_NUMBER         2\n#define RES_O_FIRMWARE_VERSION      3\n#define RES_M_REBOOT                4\n#define RES_O_FACTORY_RESET         5\n#define RES_O_AVL_POWER_SOURCES     6\n#define RES_O_POWER_SOURCE_VOLTAGE  7\n#define RES_O_POWER_SOURCE_CURRENT  8\n#define RES_O_BATTERY_LEVEL         9\n#define RES_O_MEMORY_FREE           10\n#define RES_M_ERROR_CODE            11\n#define RES_O_RESET_ERROR_CODE      12\n#define RES_O_CURRENT_TIME          13\n#define RES_O_UTC_OFFSET            14\n#define RES_O_TIMEZONE              15\n#define RES_M_BINDING_MODES         16\n// since TS 20141126-C:\n#define RES_O_DEVICE_TYPE           17\n#define RES_O_HARDWARE_VERSION      18\n#define RES_O_SOFTWARE_VERSION      19\n#define RES_O_BATTERY_STATUS        20\n#define RES_O_MEMORY_TOTAL          21\n\n// basic check that the time offset value is at ISO 8601 format\n// bug: +12:30 is considered a valid value by this function\nstatic int prv_check_time_offset(char *buffer,\n                                 int length)\n{\n    int min_index;\n\n    if (length != 3 && length != 5 && length != 6) return 0;\n    if (buffer[0] != '-' && buffer[0] != '+') return 0;\n    switch (buffer[1])\n    {\n    case '0':\n        if (buffer[2] < '0' || buffer[2] > '9') return 0;\n        break;\n    case '1':\n        if (buffer[2] < '0' || buffer[2] > '2') return 0;\n        break;\n    default:\n        return 0;\n    }\n    switch (length)\n    {\n    case 3:\n        return 1;\n    case 5:\n        min_index = 3;\n        break;\n    case 6:\n        if (buffer[3] != ':') return 0;\n        min_index = 4;\n        break;\n    default:\n        // never happen\n        return 0;\n    }\n    if (buffer[min_index] < '0' || buffer[min_index] > '5') return 0;\n    if (buffer[min_index + 1] < '0' || buffer[min_index + 1] > '9') return 0;\n\n    return 1;\n}\n\nstatic uint8_t prv_set_value(lwm2m_data_t *dataP)\n{\n    char str[MAX_STRING_LEN + 1] = {0};\n    int64_t current_time;\n    char UTC_offset[PRV_OFFSET_MAXLEN];\n    char timezone[PRV_TIMEZONE_MAXLEN];\n    lwm2m_data_t *subTlvP;\n    int power;\n    int voltage;\n    int battery_level;\n    int free_memory;\n    int err;\n    int result;\n    // a simple switch structure is used to respond at the specified resource asked\n    switch (dataP->id)\n    {\n    case RES_O_MANUFACTURER:\n        result = atiny_cmd_ioctl(ATINY_GET_MANUFACTURER, str, MAX_STRING_LEN);\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_string(str, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n\n    case RES_O_MODEL_NUMBER:\n        result = atiny_cmd_ioctl(ATINY_GET_MODEL_NUMBER, str, MAX_STRING_LEN);\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_string(str, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n\n    case RES_O_SERIAL_NUMBER:\n        result = atiny_cmd_ioctl(ATINY_GET_SERIAL_NUMBER, str, MAX_STRING_LEN);\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_string(str, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n\n    case RES_O_FIRMWARE_VERSION:\n        result = atiny_cmd_ioctl(ATINY_GET_FIRMWARE_VER, str, MAX_STRING_LEN);\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_string(str, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n\n    case RES_M_REBOOT:\n        return COAP_405_METHOD_NOT_ALLOWED;\n\n    case RES_O_FACTORY_RESET:\n        return COAP_405_METHOD_NOT_ALLOWED;\n\n    case RES_O_AVL_POWER_SOURCES:\n    {\n        subTlvP = lwm2m_data_new(1);\n        if (subTlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        subTlvP[0].id = 0;\n        result = atiny_cmd_ioctl(ATINY_GET_POWER_SOURCE, (char *)&power, sizeof(int));\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_int(power, subTlvP);\n            lwm2m_data_encode_instances(subTlvP, 1, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            lwm2m_free(subTlvP);\n            return COAP_400_BAD_REQUEST;\n        }\n    }\n\n    case RES_O_POWER_SOURCE_VOLTAGE:\n    {\n        subTlvP = lwm2m_data_new(1);\n        if (subTlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        subTlvP[0].id = 0;\n        result = atiny_cmd_ioctl(ATINY_GET_SOURCE_VOLTAGE, (char *)&voltage, sizeof(int));\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_int(voltage, subTlvP);\n            lwm2m_data_encode_instances(subTlvP, 1, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            lwm2m_free(subTlvP);\n            return COAP_400_BAD_REQUEST;\n        }\n    }\n\n    case RES_O_POWER_SOURCE_CURRENT:\n    {\n        subTlvP = lwm2m_data_new(1);\n        if (subTlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        subTlvP[0].id = 0;\n        result = atiny_cmd_ioctl(ATINY_GET_POWER_CURRENT, (char *)&power, sizeof(int));\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_int(power, &subTlvP[0]);\n            lwm2m_data_encode_instances(subTlvP, 1, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            lwm2m_free(subTlvP);\n            return COAP_400_BAD_REQUEST;\n        }\n    }\n\n    case RES_O_BATTERY_LEVEL:\n    {\n        result = atiny_cmd_ioctl(ATINY_GET_BATERRY_LEVEL, (char *)&battery_level, sizeof(int));\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_int(battery_level, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n    }\n\n    case RES_O_MEMORY_FREE:\n    {\n        result = atiny_cmd_ioctl(ATINY_GET_MEMORY_FREE, (char *)&free_memory, sizeof(int));\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_int(free_memory, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n    }\n\n    case RES_M_ERROR_CODE:\n    {\n        subTlvP = lwm2m_data_new(1);\n        if (subTlvP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        subTlvP[0].id = 0;\n        result = atiny_cmd_ioctl(ATINY_GET_DEV_ERR, (char *)&err, sizeof(int));\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_int(err, subTlvP);\n            lwm2m_data_encode_instances(subTlvP, 1, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            lwm2m_free(subTlvP);\n            return COAP_400_BAD_REQUEST;\n        }\n    }\n    case RES_O_RESET_ERROR_CODE:\n        return COAP_405_METHOD_NOT_ALLOWED;\n\n    case RES_O_CURRENT_TIME:\n        result = atiny_cmd_ioctl(ATINY_GET_CURRENT_TIME, (char *)&current_time, sizeof(int64_t));\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_int(current_time, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n\n    case RES_O_UTC_OFFSET:\n        result = atiny_cmd_ioctl(ATINY_GET_UTC_OFFSET, UTC_offset, PRV_OFFSET_MAXLEN);\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_string(UTC_offset, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n\n    case RES_O_TIMEZONE:\n        result = atiny_cmd_ioctl(ATINY_GET_TIMEZONE, timezone, PRV_TIMEZONE_MAXLEN);\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_string(timezone, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n\n    case RES_M_BINDING_MODES:\n        result = atiny_cmd_ioctl(ATINY_GET_BINDING_MODES, str, MAX_STRING_LEN);\n        if(result == ATINY_OK)\n        {\n            lwm2m_data_encode_string(str, dataP);\n            return COAP_205_CONTENT;\n        }\n        else\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n    default:\n        return COAP_404_NOT_FOUND;\n    }\n}\n\nstatic uint8_t prv_device_read(uint16_t instanceId,\n                               int *numDataP,\n                               lwm2m_data_t **dataArrayP,\n                               lwm2m_data_cfg_t *dataCfg,\n                               lwm2m_object_t *objectP)\n{\n    uint8_t result;\n    int i;\n\n    // this is a single instance object\n    if (instanceId != 0)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    // is the server asking for the full object ?\n    if (*numDataP == 0)\n    {\n        uint16_t resList[] =\n        {\n            RES_O_MANUFACTURER,\n            RES_O_MODEL_NUMBER,\n            RES_O_SERIAL_NUMBER,\n            RES_O_FIRMWARE_VERSION,\n            //E: RES_M_REBOOT,\n            //E: RES_O_FACTORY_RESET,\n            RES_O_AVL_POWER_SOURCES,\n            RES_O_POWER_SOURCE_VOLTAGE,\n            RES_O_POWER_SOURCE_CURRENT,\n            RES_O_BATTERY_LEVEL,\n            RES_O_MEMORY_FREE,\n            RES_M_ERROR_CODE,\n            //E: RES_O_RESET_ERROR_CODE,\n            RES_O_CURRENT_TIME,\n            RES_O_UTC_OFFSET,\n            RES_O_TIMEZONE,\n            RES_M_BINDING_MODES\n        };\n        int nbRes = sizeof(resList) / sizeof(uint16_t);\n\n        *dataArrayP = lwm2m_data_new(nbRes);\n        if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        *numDataP = nbRes;\n        for (i = 0 ; i < nbRes ; i++)\n        {\n            (*dataArrayP)[i].id = resList[i];\n        }\n    }\n\n    i = 0;\n    do\n    {\n        result = prv_set_value((*dataArrayP) + i);\n        i++;\n    }\n    while (i < *numDataP && result == COAP_205_CONTENT);\n\n    return result;\n}\n\nstatic uint8_t prv_device_discover(uint16_t instanceId,\n                                   int *numDataP,\n                                   lwm2m_data_t **dataArrayP,\n                                   lwm2m_object_t *objectP)\n{\n    uint8_t result;\n    int i;\n\n    // this is a single instance object\n    if (instanceId != 0)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    result = COAP_205_CONTENT;\n\n    // is the server asking for the full object ?\n    if (*numDataP == 0)\n    {\n        uint16_t resList[] =\n        {\n            RES_O_MANUFACTURER,\n            RES_O_MODEL_NUMBER,\n            RES_O_SERIAL_NUMBER,\n            RES_O_FIRMWARE_VERSION,\n            RES_M_REBOOT,\n            RES_O_FACTORY_RESET,\n            RES_O_AVL_POWER_SOURCES,\n            RES_O_POWER_SOURCE_VOLTAGE,\n            RES_O_POWER_SOURCE_CURRENT,\n            RES_O_BATTERY_LEVEL,\n            RES_O_MEMORY_FREE,\n            RES_M_ERROR_CODE,\n            RES_O_RESET_ERROR_CODE,\n            RES_O_CURRENT_TIME,\n            RES_O_UTC_OFFSET,\n            RES_O_TIMEZONE,\n            RES_M_BINDING_MODES\n        };\n        int nbRes = sizeof(resList) / sizeof(uint16_t);\n\n        *dataArrayP = lwm2m_data_new(nbRes);\n        if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        *numDataP = nbRes;\n        for (i = 0; i < nbRes; i++)\n        {\n            (*dataArrayP)[i].id = resList[i];\n        }\n    }\n    else\n    {\n        for (i = 0; i < *numDataP && result == COAP_205_CONTENT; i++)\n        {\n            switch ((*dataArrayP)[i].id)\n            {\n            case RES_O_MANUFACTURER:\n            case RES_O_MODEL_NUMBER:\n            case RES_O_SERIAL_NUMBER:\n            case RES_O_FIRMWARE_VERSION:\n            case RES_M_REBOOT:\n            case RES_O_FACTORY_RESET:\n            case RES_O_AVL_POWER_SOURCES:\n            case RES_O_POWER_SOURCE_VOLTAGE:\n            case RES_O_POWER_SOURCE_CURRENT:\n            case RES_O_BATTERY_LEVEL:\n            case RES_O_MEMORY_FREE:\n            case RES_M_ERROR_CODE:\n            case RES_O_RESET_ERROR_CODE:\n            case RES_O_CURRENT_TIME:\n            case RES_O_UTC_OFFSET:\n            case RES_O_TIMEZONE:\n            case RES_M_BINDING_MODES:\n                break;\n            default:\n                result = COAP_404_NOT_FOUND;\n            }\n        }\n    }\n\n    return result;\n}\n\nstatic uint8_t prv_device_write(uint16_t instanceId,\n                                int numData,\n                                lwm2m_data_t *dataArray,\n                                lwm2m_object_t *objectP)\n{\n    int i;\n    uint8_t result;\n    int64_t current_time;\n\n    // this is a single instance object\n    if (instanceId != 0)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    i = 0;\n\n    do\n    {\n        switch (dataArray[i].id)\n        {\n        case RES_O_CURRENT_TIME:\n            if (1 == lwm2m_data_decode_int(dataArray + i, &current_time))\n            {\n                result = atiny_cmd_ioctl(ATINY_SET_CURRENT_TIME, (char *)&current_time, sizeof(int64_t));\n                if(result == ATINY_OK)\n                {\n                    return COAP_204_CHANGED;\n                }\n                else\n                {\n                    return COAP_400_BAD_REQUEST;\n                }\n            }\n            else\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n            break;\n\n        case RES_O_UTC_OFFSET:\n            if (1 == prv_check_time_offset((char *)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length))\n            {\n                result = atiny_cmd_ioctl(ATINY_SET_UTC_OFFSET, (char *)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);\n                if(result == ATINY_OK)\n                {\n                    return COAP_204_CHANGED;\n                }\n                else\n                {\n                    return COAP_400_BAD_REQUEST;\n                }\n            }\n            else\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n            break;\n\n        case RES_O_TIMEZONE:\n            result = atiny_cmd_ioctl(ATINY_SET_TIMEZONE, (char *)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);\n            if(result == ATINY_OK)\n            {\n                return COAP_204_CHANGED;\n            }\n            else\n            {\n                return COAP_400_BAD_REQUEST;\n            }\n        //break;\n\n        default:\n            result = COAP_405_METHOD_NOT_ALLOWED;\n        }\n\n        i++;\n    }\n    while (i < numData && result == COAP_204_CHANGED);\n\n    return result;\n}\n\nstatic uint8_t prv_device_execute(uint16_t instanceId,\n                                  uint16_t resourceId,\n                                  uint8_t *buffer,\n                                  int length,\n                                  lwm2m_object_t *objectP)\n{\n    int result;\n    // this is a single instance object\n    if (instanceId != 0)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    if (length != 0) return COAP_400_BAD_REQUEST;\n\n    switch (resourceId)\n    {\n    case RES_M_REBOOT:\n        g_reboot = 1;\n        return COAP_204_CHANGED;\n    case RES_O_FACTORY_RESET:\n        result = atiny_cmd_ioctl(ATINY_DO_FACTORY_RESET, NULL, 0);\n        if(result == ATINY_OK)\n        {\n            return COAP_204_CHANGED;\n        }\n        else\n        {\n            return COAP_503_SERVICE_UNAVAILABLE;\n        }\n    case RES_O_RESET_ERROR_CODE:\n        result = atiny_cmd_ioctl(ATINY_DO_RESET_DEV_ERR, NULL, 0);\n        if(result == ATINY_OK)\n        {\n            return COAP_204_CHANGED;\n        }\n        else\n        {\n            return COAP_503_SERVICE_UNAVAILABLE;\n        }\n    default:\n        return COAP_405_METHOD_NOT_ALLOWED;\n    }\n}\n\nvoid display_device_object(lwm2m_object_t *object)\n{\n#ifdef WITH_LOGS\n\n#endif\n}\n\n\nlwm2m_object_t *get_object_device(atiny_param_t *atiny_params, const char *manufacturer)\n{\n    /*\n     * The get_object_device function create the object itself and return a pointer to the structure that represent it.\n     */\n    lwm2m_object_t *deviceObj;\n\n    deviceObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));\n\n    if (NULL != deviceObj)\n    {\n        memset(deviceObj, 0, sizeof(lwm2m_object_t));\n\n        /*\n         * It assigns his unique ID\n         * The 3 is the standard ID for the mandatory object \"Object device\".\n         */\n        deviceObj->objID = LWM2M_DEVICE_OBJECT_ID;\n\n        /*\n         * and its unique instance\n         *\n         */\n        deviceObj->instanceList = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t));\n        if (NULL != deviceObj->instanceList)\n        {\n            memset(deviceObj->instanceList, 0, sizeof(lwm2m_list_t));\n        }\n        else\n        {\n            lwm2m_free(deviceObj);\n            return NULL;\n        }\n\n        /*\n         * And the private function that will access the object.\n         * Those function will be called when a read/write/execute query is made by the server. In fact the library don't need to\n         * know the resources of the object, only the server does.\n         */\n        deviceObj->readFunc     = prv_device_read;\n        deviceObj->discoverFunc = prv_device_discover;\n        deviceObj->writeFunc    = prv_device_write;\n        deviceObj->executeFunc  = prv_device_execute;\n    }\n\n    return deviceObj;\n}\n\nvoid free_object_device(lwm2m_object_t *objectP)\n{\n    if (NULL != objectP->userData)\n    {\n        lwm2m_free(objectP->userData);\n        objectP->userData = NULL;\n    }\n    if (NULL != objectP->instanceList)\n    {\n        lwm2m_list_free(objectP->instanceList);\n        objectP->instanceList = NULL;\n    }\n\n    lwm2m_free(objectP);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/object_firmware.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Julien Vermillard - initial implementation\n *    Fabien Fleutot - Please refer to git log\n *    David Navarro, Intel Corporation - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n * This object is single instance only, and provide firmware upgrade functionality.\n * Object ID is 5.\n */\n\n/*\n * resources:\n * 0 package                   write\n * 1 package url               write\n * 2 update                    exec\n * 3 state                     read\n * 4 update supported objects  read/write\n * 5 update result             read\n */\n\n#include \"internals.h\"\n#include \"atiny_lwm2m/agenttiny.h\"\n#include \"log/atiny_log.h\"\n\n#ifdef CONFIG_FEATURE_FOTA\n#include \"atiny_fota_manager.h\"\n\n\n// ---- private object \"Firmware\" specific defines ----\n// Resource Id's:\n#define RES_M_PACKAGE                   0\n#define RES_M_PACKAGE_URI               1\n#define RES_M_UPDATE                    2\n#define RES_M_STATE                     3\n#define RES_O_UPDATE_SUPPORTED_OBJECTS  4\n#define RES_M_UPDATE_RESULT             5\n#define RES_O_PKG_NAME                  6\n#define RES_O_PKG_VERSION               7\n#define RES_O_FIRMWARE_UPDATE_DELIVER_METHOD               8\n\n\nstatic uint8_t prv_firmware_read(uint16_t instanceId,\n                                 int *numDataP,\n                                 lwm2m_data_t **dataArrayP,\n                                 lwm2m_data_cfg_t *dataCfg,\n                                 lwm2m_object_t *objectP)\n{\n    uint32_t i;\n    uint8_t result;\n\n    // this is a single instance object\n    if (instanceId != 0)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    // is the server asking for the full object ?\n    if (*numDataP == 0)\n    {\n        uint16_t resources[] = {RES_M_PACKAGE_URI, RES_M_STATE,\n                                RES_M_UPDATE_RESULT, RES_O_FIRMWARE_UPDATE_DELIVER_METHOD\n                               };\n        *dataArrayP = lwm2m_data_new(array_size(resources));\n        if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        *numDataP = array_size(resources);\n        for(i = 0 ; i < array_size(resources); ++i)\n        {\n            (*dataArrayP)[i].id = resources[i];\n        }\n    }\n\n    i = 0;\n    do\n    {\n        switch ((*dataArrayP)[i].id)\n        {\n        case RES_M_PACKAGE:\n            result = COAP_405_METHOD_NOT_ALLOWED;\n            break;\n        case RES_M_PACKAGE_URI:\n        {\n#ifdef CONFIG_FEATURE_FOTA\n            const char *pkg_uri;\n            pkg_uri = atiny_fota_manager_get_pkg_uri(atiny_fota_manager_get_instance());\n            if(pkg_uri == NULL)\n            {\n                pkg_uri = \"\";\n            }\n            lwm2m_data_encode_nstring(pkg_uri, strlen(pkg_uri) + 1, *dataArrayP + i);\n            result = COAP_205_CONTENT;\n#else \n            result = COAP_405_METHOD_NOT_ALLOWED; \n#endif \n            break;\n        }\n\n        case RES_M_UPDATE:\n            result = COAP_405_METHOD_NOT_ALLOWED;\n            break;\n\n        case RES_M_STATE:\n            // firmware update state (int)\n        {\n#ifdef CONFIG_FEATURE_FOTA    \n            int state = atiny_fota_manager_get_rpt_state(atiny_fota_manager_get_instance());\n            lwm2m_data_encode_int(state, *dataArrayP + i);\n            result = COAP_205_CONTENT;\n#else\n            result = COAP_405_METHOD_NOT_ALLOWED; \n#endif\n            break;\n        }\n\n        case RES_M_UPDATE_RESULT:\n        {\n#ifdef CONFIG_FEATURE_FOTA    \n            int updateresult = atiny_fota_manager_get_update_result(atiny_fota_manager_get_instance());\n            lwm2m_data_encode_int(updateresult, *dataArrayP + i);\n            result = COAP_205_CONTENT;\n#else\n            result = COAP_405_METHOD_NOT_ALLOWED; \n#endif         \n            break;\n        }\n\n        case RES_O_FIRMWARE_UPDATE_DELIVER_METHOD:\n        {\n#ifdef CONFIG_FEATURE_FOTA   \n            int method = atiny_fota_manager_get_deliver_method(atiny_fota_manager_get_instance());\n            lwm2m_data_encode_int(method, *dataArrayP + i);\n            result = COAP_205_CONTENT;\n#else\n            result = COAP_405_METHOD_NOT_ALLOWED; \n#endif\n\n        }\n        break;\n        default:\n            result = COAP_404_NOT_FOUND;\n        }\n\n        i++;\n    }\n    while (i < *numDataP && result == COAP_205_CONTENT);\n\n#ifdef CONFIG_FEATURE_FOTA   \n    if(dataCfg && (1 == *numDataP) && (RES_M_STATE == (*dataArrayP)[0].id))\n    {\n        atiny_fota_manager_get_data_cfg(atiny_fota_manager_get_instance(), dataCfg);\n    }\n#endif\n\n    return result;\n}\n\nstatic uint8_t prv_firmware_write(uint16_t instanceId,\n                                  int numData,\n                                  lwm2m_data_t *dataArray,\n                                  lwm2m_object_t *objectP)\n{\n    int i;\n    uint8_t result;\n\n    // this is a single instance object\n    if (instanceId != 0)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    i = 0;\n\n    do\n    {\n        switch (dataArray[i].id)\n        {\n\n        case RES_M_PACKAGE_URI:\n            // URL for download the firmware\n        {\n            int ret;\n            if(dataArray[i].type != LWM2M_TYPE_STRING || NULL == dataArray[i].value.asBuffer.buffer)\n            {\n                ATINY_LOG(LOG_ERR, \"type ERR %d\", dataArray[i].type);\n                result = COAP_400_BAD_REQUEST;\n                break;\n            }\n#ifdef CONFIG_FEATURE_FOTA   \n\n            ret = atiny_fota_manager_start_download(atiny_fota_manager_get_instance(), \\\n                                                    (const char *)(dataArray[i].value.asBuffer.buffer), dataArray[i].value.asBuffer.length);\n#else\n            ret = ATINY_ERR;\n#endif\n            result = (ATINY_OK == ret ? COAP_204_CHANGED : COAP_405_METHOD_NOT_ALLOWED);\n            break;\n        }\n\n        default:\n            result = COAP_405_METHOD_NOT_ALLOWED;\n        }\n\n        i++;\n    }\n    while (i < numData && result == COAP_204_CHANGED);\n\n    return result;\n}\n\nstatic uint8_t prv_firmware_execute(uint16_t instanceId,\n                                    uint16_t resourceId,\n                                    uint8_t *buffer,\n                                    int length,\n                                    lwm2m_object_t *objectP)\n{\n\n    // this is a single instance object\n    if (instanceId != 0)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    if (length != 0) return COAP_400_BAD_REQUEST;\n\n    // for execute callback, resId is always set.\n    switch (resourceId)\n    {\n    case RES_M_UPDATE:\n    {\n#ifdef CONFIG_FEATURE_FOTA \n        int ret = atiny_fota_manager_execute_update(atiny_fota_manager_get_instance());\n#else\n        int ret = ATINY_ERR;\n#endif\n        if (ATINY_OK == ret)\n        {\n            return COAP_204_CHANGED;\n        }\n        else\n        {\n            // firmware update already running\n#ifdef CONFIG_FEATURE_FOTA\n            return COAP_400_BAD_REQUEST;\n#else\n            return COAP_405_METHOD_NOT_ALLOWED;\n#endif\n        }\n    }\n    default:\n        return COAP_405_METHOD_NOT_ALLOWED;\n    }\n\n\n}\n\n\nlwm2m_object_t *get_object_firmware(atiny_param_t *atiny_params)\n{\n    /*\n     * The get_object_firmware function create the object itself and return a pointer to the structure that represent it.\n     */\n    lwm2m_object_t *firmwareObj;\n\n    firmwareObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));\n\n    if (NULL != firmwareObj)\n    {\n        memset(firmwareObj, 0, sizeof(lwm2m_object_t));\n\n        /*\n         * It assigns its unique ID\n         * The 5 is the standard ID for the optional object \"Object firmware\".\n         */\n        firmwareObj->objID = LWM2M_FIRMWARE_UPDATE_OBJECT_ID;\n\n        /*\n         * and its unique instance\n         *\n         */\n        firmwareObj->instanceList = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t));\n        if (NULL != firmwareObj->instanceList)\n        {\n            memset(firmwareObj->instanceList, 0, sizeof(lwm2m_list_t));\n        }\n        else\n        {\n            lwm2m_free(firmwareObj);\n            return NULL;\n        }\n\n        /*\n         * And the private function that will access the object.\n         * Those function will be called when a read/write/execute query is made by the server. In fact the library don't need to\n         * know the resources of the object, only the server does.\n         */\n        firmwareObj->readFunc    = prv_firmware_read;\n        firmwareObj->writeFunc   = prv_firmware_write;\n        firmwareObj->executeFunc = prv_firmware_execute;\n        firmwareObj->userData    = NULL;\n\n        /*\n         * Also some user data can be stored in the object with a private structure containing the needed variables\n         */\n    }\n\n    return firmwareObj;\n}\n\nvoid free_object_firmware(lwm2m_object_t *objectP)\n{\n    if (NULL != objectP->userData)\n    {\n        lwm2m_free(objectP->userData);\n        objectP->userData = NULL;\n    }\n    if (NULL != objectP->instanceList)\n    {\n        lwm2m_free(objectP->instanceList);\n        objectP->instanceList = NULL;\n    }\n    lwm2m_free(objectP);\n}\n\n#else\n\n\nlwm2m_object_t *get_object_firmware(atiny_param_t *atiny_params)\n{\n    (void)atiny_params;\n    return NULL;\n}\n\n\nvoid free_object_firmware(lwm2m_object_t *objectP)\n{\n    (void)objectP;\n}\n\n#endif\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/object_location.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2014 Bosch Software Innovations GmbH, Germany.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *\n ******************************************************************************/\n/*! \\file\n  LWM2M object \"Location\" implementation\n\n  \\author Joerg Hubschneider\n*/\n\n/*\n *  Object     |      | Multiple  |     | Description                   |\n *  Name       |  ID  | Instances |Mand.|                               |\n *-------------+------+-----------+-----+-------------------------------+\n *  Location   |   6  |    No     |  No |  see TS E.7 page 101          |\n *\n *  Resources:\n *  Name        | ID  | Oper.|Instances|Mand.|  Type   | Range | Units | Description                                                                      |\n * -------------+-----+------+---------+-----+---------+-------+-------+----------------------------------------------------------------------------------+\n *  Latitude    |  0  |  R   | Single  | Yes | Float   |       |  Deg  | The decimal notation of latitude  e.g. -  45.5723  [Worlds Geodetic System 1984].|\n *  Longitude   |  1  |  R   | Single  | Yes | Float   |       |  Deg  | The decimal notation of longitude e.g. - 153.21760 [Worlds Geodetic System 1984].|\n *  Altitude    |  2  |  R   | Single  | No  | Float   |       |   m   | The decimal notation of altitude in meters above sea level.                      |\n *  Radius      |  3  |  R   | Single  | No  | Float   |       |   m   | The value in the Radius Resource indicates the size in meters of a circular area |\n *              |     |      |         |     |         |       |       | around a point of geometry.                                                      |\n *  Velocity    |  4  |  R   | Single  | No  | Opaque  |       |   *   | The velocity of the device as defined in 3GPP 23.032 GAD specification(*).       |\n *              |     |      |         |     |         |       |       | This set of values may not be available if the device is static.                 |\n *              |     |      |         |     |         |       |       | opaque: see OMA_TS 6.3.2                                                         |\n *  Timestamp   |  5  |  R   | Single  | Yes | Time    |       |   s   | The timestamp when the location measurement was performed.                       |\n *  Speed       |  6  |  R   | Single  | No  | Float   |       |  m/s  | Speed is the time rate of change in position of a LwM2M Client without regard    |\n *              |     |      |         |     |         |       |       | for direction: the scalar component of velocity.                                 |\n */\n\n#include \"internals.h\"\n#include \"object_comm.h\"\n#ifdef LWM2M_CLIENT_MODE\n\n\n// ---- private \"object location\" specific defines ----\n// Resource Id's:\n#define RES_M_LATITUDE     0\n#define RES_M_LONGITUDE    1\n#define RES_O_ALTITUDE     2\n#define RES_O_RADIUS       3\n#define RES_O_VELOCITY     4\n#define RES_M_TIMESTAMP    5\n#define RES_O_SPEED        6\n\n/**\nimplementation for all read-able resources\n*/\nstatic uint8_t prv_res2tlv(lwm2m_data_t *dataP)\n{\n    //-------------------------------------------------------------------- JH --\n    uint8_t ret = COAP_205_CONTENT;\n    float get_value;\n    uint64_t timestamp;\n    atiny_velocity_s velocity;\n\n    switch (dataP->id)     // location resourceId\n    {\n    case RES_M_LATITUDE:\n        if (atiny_cmd_ioctl(ATINY_GET_LATITUDE, (char *)&get_value, sizeof(float)) == ATINY_OK)\n        {\n            lwm2m_data_encode_float(get_value, dataP);\n        }\n        else\n        {\n            ret = COAP_400_BAD_REQUEST;\n        }\n        break;\n    case RES_M_LONGITUDE:\n        if (atiny_cmd_ioctl(ATINY_GET_LONGITUDE, (char *)&get_value, sizeof(float)) == ATINY_OK)\n        {\n            lwm2m_data_encode_float(get_value, dataP);\n        }\n        else\n        {\n            ret = COAP_400_BAD_REQUEST;\n        }\n        break;\n    case RES_O_ALTITUDE:\n        if (atiny_cmd_ioctl(ATINY_GET_ALTITUDE, (char *)&get_value, sizeof(float)) == ATINY_OK)\n        {\n            lwm2m_data_encode_float(get_value, dataP);\n        }\n        else\n        {\n            ret = COAP_400_BAD_REQUEST;\n        }\n        break;\n    case RES_O_RADIUS:\n        if (atiny_cmd_ioctl(ATINY_GET_RADIUS, (char *)&get_value, sizeof(float)) == ATINY_OK)\n        {\n            lwm2m_data_encode_float(get_value, dataP);\n        }\n        else\n        {\n            ret = COAP_400_BAD_REQUEST;\n        }\n        break;\n    case RES_O_VELOCITY:\n        if (atiny_cmd_ioctl(ATINY_GET_VELOCITY, (char *)&velocity, sizeof(velocity)) == ATINY_OK)\n        {\n            lwm2m_data_encode_opaque(velocity.opaque, velocity.length, dataP);\n        }\n        else\n        {\n            ret = COAP_400_BAD_REQUEST;\n        }\n        break;\n    case RES_M_TIMESTAMP:\n        if (atiny_cmd_ioctl(ATINY_GET_TIMESTAMP, (char *)&timestamp, sizeof(uint64_t)) == ATINY_OK)\n        {\n            lwm2m_data_encode_float(timestamp, dataP);\n        }\n        else\n        {\n            ret = COAP_400_BAD_REQUEST;\n        }\n        break;\n    case RES_O_SPEED:\n        if (atiny_cmd_ioctl(ATINY_GET_SPEED, (char *)&get_value, sizeof(float)) == ATINY_OK)\n        {\n            lwm2m_data_encode_float(get_value, dataP);\n        }\n        else\n        {\n            ret = COAP_400_BAD_REQUEST;\n        }\n        break;\n    default:\n        ret = COAP_404_NOT_FOUND;\n        break;\n    }\n\n    return ret;\n}\n\n\n/**\n  * Implementation (callback-) function of reading object resources. For whole\n  * object, single resources or a sequence of resources\n  * see 3GPP TS 23.032 V11.0.0(2012-09) page 23,24.\n  * implemented for: HORIZONTAL_VELOCITY_WITH_UNCERTAINT\n  * @param objInstId    in,     instances ID of the location object to read\n  * @param numDataP     in/out, pointer to the number of resource to read. 0 is the\n  *                             exception for all readable resource of object instance\n  * @param tlvArrayP    in/out, TLV data sequence with initialized resource ID to read\n  * @param objectP      in,     private location data structure\n  */\nstatic uint8_t prv_location_read(uint16_t objInstId,\n                                 int  *numDataP,\n                                 lwm2m_data_t **tlvArrayP,\n                                 lwm2m_data_cfg_t *dataCfg,\n                                 lwm2m_object_t  *objectP)\n{\n    //-------------------------------------------------------------------- JH --\n    int     i;\n    uint8_t result = COAP_500_INTERNAL_SERVER_ERROR;\n\n    // defined as single instance object!\n    if (objInstId != 0) return COAP_404_NOT_FOUND;\n\n    if (*numDataP == 0)     // full object, readable resources!\n    {\n        uint16_t readResIds[] =\n        {\n            RES_M_LATITUDE,\n            RES_M_LONGITUDE,\n            RES_O_ALTITUDE,\n            RES_O_RADIUS,\n            RES_O_VELOCITY,\n            RES_M_TIMESTAMP,\n            RES_O_SPEED\n        }; // readable resources!\n\n        *numDataP  = sizeof(readResIds) / sizeof(uint16_t);\n        *tlvArrayP = lwm2m_data_new(*numDataP);\n        if (*tlvArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n        // init readable resource id's\n        for (i = 0 ; i < *numDataP ; i++)\n        {\n            (*tlvArrayP)[i].id = readResIds[i];\n        }\n    }\n\n    for (i = 0 ; i < *numDataP ; i++)\n    {\n        result = prv_res2tlv ((*tlvArrayP) + i);\n        if (result != COAP_205_CONTENT) break;\n    }\n\n    return result;\n}\n\nvoid display_location_object(lwm2m_object_t *object)\n{\n#ifdef WITH_LOGS\n    float latitude = 0.0f;\n    float longitude = 0.0f;\n    float altitude = 0.0f;\n    float radius = 0.0f;\n    float speed = 0.0f;\n    uint64_t timestamp = 0U;\n\n    (void)atiny_cmd_ioctl(ATINY_GET_LATITUDE, &latitude, sizeof(float));\n    (void)atiny_cmd_ioctl(ATINY_GET_LONGITUDE, &longitude, sizeof(float));\n    (void)atiny_cmd_ioctl(ATINY_GET_ALTITUDE, &altitude, sizeof(float));\n    (void)atiny_cmd_ioctl(ATINY_GET_RADIUS, &radius, sizeof(float));\n    (void)atiny_cmd_ioctl(ATINY_GET_SPEED, &speed, sizeof(float));\n    (void)atiny_cmd_ioctl(ATINY_GET_TIMESTAMP, &timestamp, sizeof(uint64_t));\n\n    fprintf(stdout, \"  /%u: Location object:\\r\\n\", object->objID);\n    fprintf(stdout, \"    latitude: %.6f, longitude: %.6f, altitude: %.6f, radius: %.6f, timestamp: %lu, speed: %.6f\\r\\n\",\n            latitude, longitude, altitude, radius, timestamp, speed);\n\n#endif\n}\n\n/**\n  * This function creates the LWM2M Location.\n  * @return gives back allocated LWM2M data object structure pointer. On error,\n  * NULL value is returned.\n  */\nlwm2m_object_t *get_object_location(void)\n{\n    //-------------------------------------------------------------------- JH --\n    lwm2m_object_t *locationObj;\n\n    locationObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));\n    if (NULL != locationObj)\n    {\n        memset(locationObj, 0, sizeof(lwm2m_object_t));\n\n        // It assigns its unique ID\n        // The 6 is the standard ID for the optional object \"Location\".\n        locationObj->objID = LWM2M_LOCATION_OBJECT_ID;\n\n        // and its unique instance\n        locationObj->instanceList = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t));\n        if (NULL != locationObj->instanceList)\n        {\n            memset(locationObj->instanceList, 0, sizeof(lwm2m_list_t));\n        }\n        else\n        {\n            lwm2m_free(locationObj);\n            return NULL;\n        }\n\n        // And the private function that will access the object.\n        // Those function will be called when a read query is made by the server.\n        // In fact the library don't need to know the resources of the object, only the server does.\n        //\n        locationObj->readFunc    = prv_location_read;\n    }\n\n    return locationObj;\n}\n\nvoid free_object_location(lwm2m_object_t *object)\n{\n    lwm2m_list_free(object->instanceList);\n    lwm2m_free(object->userData);\n    lwm2m_free(object);\n}\n\n#endif  //LWM2M_CLIENT_MODE\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/object_security.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *    Ville Skytt? - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n *  Resources:\n *\n *          Name            | ID | Operations | Instances | Mandatory |  Type   |  Range  | Units |\n *  Server URI              |  0 |            |  Single   |    Yes    | String  |         |       |\n *  Bootstrap Server        |  1 |            |  Single   |    Yes    | Boolean |         |       |\n *  Security Mode           |  2 |            |  Single   |    Yes    | Integer |   0-3   |       |\n *  Public Key or ID        |  3 |            |  Single   |    Yes    | Opaque  |         |       |\n *  Server Public Key or ID |  4 |            |  Single   |    Yes    | Opaque  |         |       |\n *  Secret Key              |  5 |            |  Single   |    Yes    | Opaque  |         |       |\n *  SMS Security Mode       |  6 |            |  Single   |    No     | Integer |  0-255  |       |\n *  SMS Binding Key Param.  |  7 |            |  Single   |    No     | Opaque  |   6 B   |       |\n *  SMS Binding Secret Keys |  8 |            |  Single   |    No     | Opaque  | 32-48 B |       |\n *  Server SMS Number       |  9 |            |  Single   |    No     | String  |         |       |\n *  Short Server ID         | 10 |            |  Single   |    No     | Integer | 1-65535 |       |\n *  Client Hold Off Time    | 11 |            |  Single   |    No     | Integer |         |   s   |\n *  BS Account Timeout      | 12 |            |  Single   |    No     | Integer |         |   s   |\n *\n */\n\n/*\n * Here we implement a very basic LWM2M Security Object which only knows NoSec security mode.\n */\n\n#include \"internals.h\"\n#include \"object_comm.h\"\n\nstatic uint8_t prv_get_value(lwm2m_data_t *dataP,\n                             security_instance_t *targetP)\n{\n    switch (dataP->id)\n    {\n    case LWM2M_SECURITY_URI_ID:\n        lwm2m_data_encode_string(targetP->uri, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_BOOTSTRAP_ID:\n        lwm2m_data_encode_bool(targetP->isBootstrap, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_SECURITY_ID:\n        lwm2m_data_encode_int(targetP->securityMode, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_PUBLIC_KEY_ID:\n        lwm2m_data_encode_opaque((uint8_t *)targetP->publicIdentity, targetP->publicIdLen, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID:\n        lwm2m_data_encode_opaque((uint8_t *)targetP->serverPublicKey, targetP->serverPublicKeyLen, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_SECRET_KEY_ID:\n        lwm2m_data_encode_opaque((uint8_t *)targetP->secretKey, targetP->secretKeyLen, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_SMS_SECURITY_ID:\n        lwm2m_data_encode_int(targetP->smsSecurityMode, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_SMS_KEY_PARAM_ID:\n        lwm2m_data_encode_opaque((uint8_t *)targetP->smsParams, targetP->smsParamsLen, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_SMS_SECRET_KEY_ID:\n        lwm2m_data_encode_opaque((uint8_t *)targetP->smsSecret, targetP->smsSecretLen, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_SMS_SERVER_NUMBER_ID:\n        lwm2m_data_encode_int(0, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_SHORT_SERVER_ID:\n        lwm2m_data_encode_int(targetP->shortID, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_HOLD_OFF_ID:\n        lwm2m_data_encode_int(targetP->clientHoldOffTime, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SECURITY_BOOTSTRAP_TIMEOUT_ID:\n        lwm2m_data_encode_int(targetP->bootstrapServerAccountTimeout, dataP);\n        return COAP_205_CONTENT;\n\n    default:\n        return COAP_404_NOT_FOUND;\n    }\n}\n\nstatic uint8_t prv_security_read(uint16_t instanceId,\n                                 int *numDataP,\n                                 lwm2m_data_t **dataArrayP,\n                                 lwm2m_data_cfg_t *dataCfg,\n                                 lwm2m_object_t *objectP)\n{\n    security_instance_t *targetP;\n    uint8_t result;\n    int i;\n\n    targetP = (security_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n\n    // is the server asking for the full instance ?\n    if (*numDataP == 0)\n    {\n        uint16_t resList[] = {LWM2M_SECURITY_URI_ID,\n                              LWM2M_SECURITY_BOOTSTRAP_ID,\n                              LWM2M_SECURITY_SECURITY_ID,\n                              LWM2M_SECURITY_PUBLIC_KEY_ID,\n                              LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID,\n                              LWM2M_SECURITY_SECRET_KEY_ID,\n                              LWM2M_SECURITY_SMS_SECURITY_ID,\n                              LWM2M_SECURITY_SMS_KEY_PARAM_ID,\n                              LWM2M_SECURITY_SMS_SECRET_KEY_ID,\n                              LWM2M_SECURITY_SMS_SERVER_NUMBER_ID,\n                              LWM2M_SECURITY_SHORT_SERVER_ID,\n                              LWM2M_SECURITY_HOLD_OFF_ID,\n                              LWM2M_SECURITY_BOOTSTRAP_TIMEOUT_ID\n                             };\n        int nbRes = sizeof(resList) / sizeof(uint16_t);\n\n        *dataArrayP = lwm2m_data_new(nbRes);\n        if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        *numDataP = nbRes;\n        for (i = 0 ; i < nbRes ; i++)\n        {\n            (*dataArrayP)[i].id = resList[i];\n        }\n    }\n\n    i = 0;\n    do\n    {\n        result = prv_get_value((*dataArrayP) + i, targetP);\n        i++;\n    }\n    while (i < *numDataP && result == COAP_205_CONTENT);\n\n    return result;\n}\n\n#ifdef LWM2M_BOOTSTRAP\n\nstatic uint8_t prv_security_write(uint16_t instanceId,\n                                  int numData,\n                                  lwm2m_data_t *dataArray,\n                                  lwm2m_object_t *objectP)\n{\n    security_instance_t *targetP;\n    int i;\n    uint8_t result = COAP_204_CHANGED;\n\n    targetP = (security_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);\n    if (NULL == targetP)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    i = 0;\n    do\n    {\n        switch (dataArray[i].id)\n        {\n        case LWM2M_SECURITY_URI_ID:\n            if (targetP->uri != NULL) lwm2m_free(targetP->uri);\n            targetP->uri = (char *)lwm2m_malloc(dataArray[i].value.asBuffer.length + 1);\n            if (targetP->uri != NULL)\n            {\n                memset(targetP->uri, 0, dataArray[i].value.asBuffer.length + 1);\n                strncpy(targetP->uri, (char *)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);\n                result = COAP_204_CHANGED;\n            }\n            else\n            {\n                result = COAP_500_INTERNAL_SERVER_ERROR;\n            }\n            break;\n\n        case LWM2M_SECURITY_BOOTSTRAP_ID:\n            if (1 == lwm2m_data_decode_bool(dataArray + i, &(targetP->isBootstrap)))\n            {\n                result = COAP_204_CHANGED;\n            }\n            else\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n            break;\n\n        case LWM2M_SECURITY_SECURITY_ID:\n        {\n            int64_t value;\n\n            if (1 == lwm2m_data_decode_int(dataArray + i, &value))\n            {\n                if (value >= 0 && value <= 3)\n                {\n                    targetP->securityMode = value;\n                    result = COAP_204_CHANGED;\n                }\n                else\n                {\n                    result = COAP_406_NOT_ACCEPTABLE;\n                }\n            }\n            else\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n        }\n        break;\n        case LWM2M_SECURITY_PUBLIC_KEY_ID:\n            if (targetP->publicIdentity != NULL) lwm2m_free(targetP->publicIdentity);\n            targetP->publicIdentity = (char *)lwm2m_malloc(dataArray[i].value.asBuffer.length + 1);\n            if (targetP->publicIdentity != NULL)\n            {\n                memset(targetP->publicIdentity, 0, dataArray[i].value.asBuffer.length + 1);\n                memcpy(targetP->publicIdentity, (char *)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);\n                targetP->publicIdLen = dataArray[i].value.asBuffer.length;\n                result = COAP_204_CHANGED;\n            }\n            else\n            {\n                result = COAP_500_INTERNAL_SERVER_ERROR;\n            }\n            break;\n\n        case LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID:\n            if (targetP->serverPublicKey != NULL) lwm2m_free(targetP->serverPublicKey);\n            targetP->serverPublicKey = (char *)lwm2m_malloc(dataArray[i].value.asBuffer.length + 1);\n            if (targetP->serverPublicKey != NULL)\n            {\n                memset(targetP->serverPublicKey, 0, dataArray[i].value.asBuffer.length + 1);\n                memcpy(targetP->serverPublicKey, (char *)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);\n                targetP->serverPublicKeyLen = dataArray[i].value.asBuffer.length;\n                result = COAP_204_CHANGED;\n            }\n            else\n            {\n                result = COAP_500_INTERNAL_SERVER_ERROR;\n            }\n            break;\n\n        case LWM2M_SECURITY_SECRET_KEY_ID:\n            if (targetP->secretKey != NULL) lwm2m_free(targetP->secretKey);\n            targetP->secretKey = (char *)lwm2m_malloc(dataArray[i].value.asBuffer.length + 1);\n            if (targetP->secretKey != NULL)\n            {\n                memset(targetP->secretKey, 0, dataArray[i].value.asBuffer.length + 1);\n                memcpy(targetP->secretKey, (char *)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);\n                targetP->secretKeyLen = dataArray[i].value.asBuffer.length;\n                result = COAP_204_CHANGED;\n            }\n            else\n            {\n                result = COAP_500_INTERNAL_SERVER_ERROR;\n            }\n            break;\n\n        case LWM2M_SECURITY_SMS_SECURITY_ID:\n            // Let just ignore this\n            result = COAP_204_CHANGED;\n            break;\n\n        case LWM2M_SECURITY_SMS_KEY_PARAM_ID:\n            // Let just ignore this\n            result = COAP_204_CHANGED;\n            break;\n\n        case LWM2M_SECURITY_SMS_SECRET_KEY_ID:\n            // Let just ignore this\n            result = COAP_204_CHANGED;\n            break;\n\n        case LWM2M_SECURITY_SMS_SERVER_NUMBER_ID:\n            // Let just ignore this\n            result = COAP_204_CHANGED;\n            break;\n\n        case LWM2M_SECURITY_SHORT_SERVER_ID:\n        {\n            int64_t value;\n\n            if (1 == lwm2m_data_decode_int(dataArray + i, &value))\n            {\n                if (value >= 0 && value <= 0xFFFF)\n                {\n                    targetP->shortID = value;\n                    result = COAP_204_CHANGED;\n                }\n                else\n                {\n                    result = COAP_406_NOT_ACCEPTABLE;\n                }\n            }\n            else\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n        }\n        break;\n\n        case LWM2M_SECURITY_HOLD_OFF_ID:\n        {\n            int64_t value;\n\n            if (1 == lwm2m_data_decode_int(dataArray + i, &value))\n            {\n                if (value >= 0 && value <= UINT32_MAX)\n                {\n                    targetP->clientHoldOffTime = value;\n                    result = COAP_204_CHANGED;\n                }\n                else\n                {\n                    result = COAP_406_NOT_ACCEPTABLE;\n                }\n            }\n            else\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n            break;\n        }\n\n        case LWM2M_SECURITY_BOOTSTRAP_TIMEOUT_ID:\n        {\n            int64_t value;\n\n            if (1 == lwm2m_data_decode_int(dataArray + i, &value))\n            {\n                if (value >= 0 && value <= UINT32_MAX)\n                {\n                    targetP->bootstrapServerAccountTimeout = value;\n                    result = COAP_204_CHANGED;\n                }\n                else\n                {\n                    result = COAP_406_NOT_ACCEPTABLE;\n                }\n            }\n            else\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n            break;\n        }\n\n        default:\n            return COAP_400_BAD_REQUEST;\n        }\n        i++;\n    }\n    while (i < numData && result == COAP_204_CHANGED);\n\n    return result;\n}\n\nstatic uint8_t prv_security_delete(uint16_t id,\n                                   lwm2m_object_t *objectP)\n{\n    security_instance_t *targetP;\n\n    objectP->instanceList = lwm2m_list_remove(objectP->instanceList, id, (lwm2m_list_t **)&targetP);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n    if (NULL != targetP->uri)\n    {\n        lwm2m_free(targetP->uri);\n    }\n\n    lwm2m_free(targetP);\n\n    return COAP_202_DELETED;\n}\n\nstatic uint8_t prv_security_create(uint16_t instanceId,\n                                   int numData,\n                                   lwm2m_data_t *dataArray,\n                                   lwm2m_object_t *objectP)\n{\n    security_instance_t *targetP;\n    uint8_t result;\n\n    targetP = (security_instance_t *)lwm2m_malloc(sizeof(security_instance_t));\n    if (NULL == targetP) return COAP_500_INTERNAL_SERVER_ERROR;\n    memset(targetP, 0, sizeof(security_instance_t));\n\n    targetP->instanceId = instanceId;\n    objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, targetP);\n\n    result = prv_security_write(instanceId, numData, dataArray, objectP);\n\n    if (result != COAP_204_CHANGED)\n    {\n        (void)prv_security_delete(instanceId, objectP);\n    }\n    else\n    {\n        result = COAP_201_CREATED;\n    }\n\n    return result;\n}\n#endif\n\nvoid copy_security_object(lwm2m_object_t *objectDest, lwm2m_object_t *objectSrc)\n{\n    security_instance_t *instanceSrc;\n    security_instance_t *previousInstanceDest = NULL;\n    memcpy(objectDest, objectSrc, sizeof(lwm2m_object_t));\n    objectDest->instanceList = NULL;\n    objectDest->userData = NULL;\n\n    instanceSrc = (security_instance_t *)objectSrc->instanceList;\n    while (instanceSrc != NULL)\n    {\n        security_instance_t *instanceDest = (security_instance_t *)lwm2m_malloc(sizeof(security_instance_t));\n        if (NULL == instanceDest)\n        {\n            return;\n        }\n        memcpy(instanceDest, instanceSrc, sizeof(security_instance_t));\n        instanceDest->uri = (char *)lwm2m_malloc(strlen(instanceSrc->uri) + 1);\n        if (instanceDest->uri == NULL)\n        {\n            lwm2m_free(instanceDest);\n            return;\n        }\n        strncpy(instanceDest->uri, instanceSrc->uri, strlen(instanceSrc->uri) + 1);\n        if (instanceSrc->securityMode == LWM2M_SECURITY_MODE_PRE_SHARED_KEY)\n        {\n            instanceDest->publicIdentity = lwm2m_strdup(instanceSrc->publicIdentity);\n            instanceDest->secretKey = lwm2m_strdup(instanceSrc->secretKey);\n        }\n        instanceSrc = (security_instance_t *)instanceSrc->next;\n        if (previousInstanceDest == NULL)\n        {\n            objectDest->instanceList = (lwm2m_list_t *)instanceDest;\n        }\n        else\n        {\n            previousInstanceDest->next = instanceDest;\n        }\n        previousInstanceDest = instanceDest;\n    }\n}\n\nvoid display_security_object(lwm2m_object_t *object)\n{\n#ifdef WITH_LOGS\n    fprintf(stdout, \"  /%u: Security object, instances:\\r\\n\", object->objID);\n    security_instance_t *instance = (security_instance_t *)object->instanceList;\n    while (instance != NULL)\n    {\n        fprintf(stdout, \"    /%u/%u: instanceId: %u, uri: %s, isBootstrap: %s, shortId: %u, clientHoldOffTime: %u\\r\\n\",\n                object->objID, instance->instanceId,\n                instance->instanceId, instance->uri, instance->isBootstrap ? \"true\" : \"false\",\n                instance->shortID, instance->clientHoldOffTime);\n        instance = (security_instance_t *)instance->next;\n    }\n#endif\n}\n\nvoid clean_security_object(lwm2m_object_t *objectP)\n{\n    if(NULL == objectP)\n    {\n        return;\n    }\n    while (objectP->instanceList != NULL)\n    {\n        security_instance_t *securityInstance = (security_instance_t *)objectP->instanceList;\n        objectP->instanceList = objectP->instanceList->next;\n        if (NULL != securityInstance->uri)\n        {\n            lwm2m_free(securityInstance->uri);\n        }\n        if (securityInstance->securityMode == LWM2M_SECURITY_MODE_PRE_SHARED_KEY)\n        {\n            lwm2m_free(securityInstance->publicIdentity);\n            lwm2m_free(securityInstance->secretKey);\n        }\n        lwm2m_free(securityInstance);\n    }\n\n    lwm2m_free(objectP);\n}\n/*\n * modify date:  2018-06-25\n * description:  add one or two instance for security object. id 0 for iot server(uri,psk), id 1 for bs server.\n * return:       a object: lwm2m_object_t\n * pay attention:\n */\nlwm2m_object_t *get_security_object(uint16_t serverId, atiny_param_t *atiny_params, lwm2m_context_t *lwm2m_context)\n{\n    //const int URI_MAX_LEN = 64;\n#define URI_MAX_LEN 64\n    lwm2m_object_t *securityObj = NULL;\n    char serverUri[URI_MAX_LEN];\n    security_instance_t *targetP = NULL;\n    int i = 0;\n    char *bsPskId = NULL;\n    char *psk = NULL;\n    uint16_t pskLen = 0;\n\n    const uint8_t INS_IOT_SERVER_FLAG = 0x01;\n    const uint8_t INS_BS_SERVER_FLAG = 0x02;\n    uint8_t  ins_flag = 0x00;\n    uint8_t total_ins = 1;\n    uint8_t security_params_index = 0;\n\n\n    switch(atiny_params->server_params.bootstrap_mode)\n    {\n    case BOOTSTRAP_FACTORY:\n        ins_flag |= INS_IOT_SERVER_FLAG;\n        total_ins = 1;\n        break;\n    case BOOTSTRAP_SEQUENCE:\n        if ((atiny_params->security_params[0].server_ip != NULL) && (atiny_params->security_params[0].server_port != NULL))\n        {\n            ins_flag |= INS_IOT_SERVER_FLAG;\n            ins_flag |= INS_BS_SERVER_FLAG;\n\n            total_ins = 2;\n        }\n        else\n        {\n            ins_flag |= INS_BS_SERVER_FLAG;\n            total_ins = 1;\n        }\n        break;\n    case BOOTSTRAP_CLIENT_INITIATED:\n        ins_flag |= INS_BS_SERVER_FLAG;\n        total_ins = 1;\n        break;\n    default:\n        return NULL;\n        //break;\n    }\n\n    securityObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));\n    if (NULL == securityObj)\n    {\n        return NULL;\n    }\n\n    memset(securityObj, 0, sizeof(lwm2m_object_t));\n    securityObj->objID = LWM2M_SECURITY_OBJECT_ID;\n\n\n    //at most, have two instance. in fact\n    for(i = 0; i < total_ins; i++)\n    {\n        //Manually create an hardcoded instance\n        targetP = (security_instance_t *)lwm2m_malloc(sizeof(security_instance_t));\n        if (NULL == targetP)\n        {\n            //lwm2m_free(securityObj);\n            clean_security_object(securityObj);\n            return NULL;\n        }\n\n        memset(targetP, 0, sizeof(security_instance_t));\n        if((ins_flag & INS_IOT_SERVER_FLAG) && (ins_flag & INS_BS_SERVER_FLAG))\n        {\n            targetP->instanceId = i;   //i=0 for iot_server, i=1 for bs_server\n            targetP->isBootstrap = ((i == 0) ? (false) : (true));\n            security_params_index = i;\n        }\n        else\n        {\n            if(ins_flag & INS_IOT_SERVER_FLAG)\n            {\n                targetP->instanceId = 0;\n                targetP->isBootstrap = false;\n                security_params_index = 0;\n            }\n            else  //if(ins_flag & INS_BS_SERVER_FLAG)  //even if not set INS_BS_SERVER_FLAG, still run in a certain process.\n            {\n                targetP->instanceId = 1;\n                targetP->isBootstrap = true;\n                security_params_index = 1;\n            }\n        }\n        // After instance id is initialized\n        securityObj->instanceList = LWM2M_LIST_ADD(securityObj->instanceList, targetP);\n\n        bsPskId = atiny_params->security_params[security_params_index].psk_Id;\n        psk = atiny_params->security_params[security_params_index].psk;\n        pskLen = atiny_params->security_params[security_params_index].psk_len;\n\n\n        if (atiny_params->security_params[security_params_index].server_ip && atiny_params->security_params[security_params_index].server_port)\n        {\n            if (psk != NULL)\n            {\n                (void)atiny_snprintf(serverUri, URI_MAX_LEN, \"coaps://%s:%s\", atiny_params->security_params[security_params_index].server_ip,\n                                     atiny_params->security_params[security_params_index].server_port);\n            }\n            else\n            {\n                (void)atiny_snprintf(serverUri, URI_MAX_LEN, \"coap://%s:%s\", atiny_params->security_params[security_params_index].server_ip,\n                                     atiny_params->security_params[security_params_index].server_port);\n            }\n        }\n        else\n        {\n            serverUri[0] = '\\0';\n        }\n\n        targetP->uri = (char *)lwm2m_strdup(serverUri);\n        if (NULL == targetP->uri)\n        {\n            //lwm2m_free(securityObj);\n            //lwm2m_free(targetP);\n            clean_security_object(securityObj);\n            return NULL;\n        }\n\n        targetP->securityMode = LWM2M_SECURITY_MODE_NONE;\n        if (bsPskId != NULL && psk != NULL)\n        {\n            targetP->securityMode = LWM2M_SECURITY_MODE_PRE_SHARED_KEY;\n            targetP->publicIdentity = (char *)lwm2m_strdup(bsPskId);\n            if(targetP->publicIdentity == NULL)\n            {\n                clean_security_object(securityObj);\n                return NULL;\n            }\n            targetP->publicIdLen = strlen(bsPskId);\n            if (pskLen > 0)\n            {\n                targetP->secretKey = (char *)lwm2m_malloc(pskLen);\n                if (targetP->secretKey == NULL)\n                {\n                    clean_security_object(securityObj);\n                    return NULL;\n                }\n                memcpy(targetP->secretKey, psk, pskLen);\n                targetP->secretKeyLen = pskLen;\n            }\n        }\n\n        targetP->shortID = serverId;\n        //10? is suitable? it could be changed by the bs server. for lwm2m_server_t member lifetime.\n        targetP->clientHoldOffTime = atiny_params->server_params.hold_off_time;\n    } //end for loop\n\n\n    securityObj->readFunc = prv_security_read;\n#ifdef LWM2M_BOOTSTRAP\n    securityObj->writeFunc = prv_security_write;\n    securityObj->createFunc = prv_security_create;\n    securityObj->deleteFunc = prv_security_delete;\n#endif\n\n    return securityObj;\n}\n\n\n\n/********************* Security Obj Helpers **********************/\n\nchar *security_get_uri(lwm2m_object_t *objectP, uint16_t secObjInstID)\n{\n    security_instance_t *targetP = (security_instance_t *)LWM2M_LIST_FIND(objectP->instanceList, secObjInstID);\n\n    if (NULL != targetP)\n    {\n        return lwm2m_strdup(targetP->uri);\n    }\n\n    return NULL;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/object_server.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Julien Vermillard, Sierra Wireless\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n *  Resources:\n *\n *          Name         | ID | Operations | Instances | Mandatory |  Type   |  Range  | Units |\n *  Short ID             |  0 |     R      |  Single   |    Yes    | Integer | 1-65535 |       |\n *  Lifetime             |  1 |    R/W     |  Single   |    Yes    | Integer |         |   s   |\n *  Default Min Period   |  2 |    R/W     |  Single   |    No     | Integer |         |   s   |\n *  Default Max Period   |  3 |    R/W     |  Single   |    No     | Integer |         |   s   |\n *  Disable              |  4 |     E      |  Single   |    No     |         |         |       |\n *  Disable Timeout      |  5 |    R/W     |  Single   |    No     | Integer |         |   s   |\n *  Notification Storing |  6 |    R/W     |  Single   |    Yes    | Boolean |         |       |\n *  Binding              |  7 |    R/W     |  Single   |    Yes    | String  |         |       |\n *  Registration Update  |  8 |     E      |  Single   |    Yes    |         |         |       |\n *\n */\n\n#include \"internals.h\"\n#include \"object_comm.h\"\n\ntypedef struct _server_instance_\n{\n    struct _server_instance_ *next;    // matches lwm2m_list_t::next\n    uint16_t    instanceId;            // matches lwm2m_list_t::id\n    uint16_t    shortServerId;\n    uint32_t    lifetime;\n    uint32_t    defaultMinPeriod;\n    uint32_t    defaultMaxPeriod;\n    uint32_t    disableTimeout;\n    bool        storing;\n    char        binding[4];\n} server_instance_t;\n\nstatic uint8_t prv_get_value(lwm2m_data_t *dataP,\n                             server_instance_t *targetP)\n{\n    switch (dataP->id)\n    {\n    case LWM2M_SERVER_SHORT_ID_ID:\n        lwm2m_data_encode_int(targetP->shortServerId, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SERVER_LIFETIME_ID:\n        lwm2m_data_encode_int(targetP->lifetime, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SERVER_MIN_PERIOD_ID:\n        lwm2m_data_encode_int(targetP->defaultMinPeriod, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SERVER_MAX_PERIOD_ID:\n        lwm2m_data_encode_int(targetP->defaultMaxPeriod, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SERVER_DISABLE_ID:\n        return COAP_405_METHOD_NOT_ALLOWED;\n\n    case LWM2M_SERVER_TIMEOUT_ID:\n        lwm2m_data_encode_int(targetP->disableTimeout, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SERVER_STORING_ID:\n        lwm2m_data_encode_bool(targetP->storing, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SERVER_BINDING_ID:\n        lwm2m_data_encode_string(targetP->binding, dataP);\n        return COAP_205_CONTENT;\n\n    case LWM2M_SERVER_UPDATE_ID:\n        return COAP_405_METHOD_NOT_ALLOWED;\n\n    default:\n        return COAP_404_NOT_FOUND;\n    }\n}\n\nstatic uint8_t prv_server_read(uint16_t instanceId,\n                               int *numDataP,\n                               lwm2m_data_t **dataArrayP,\n                               lwm2m_data_cfg_t *dataCfg,\n                               lwm2m_object_t *objectP)\n{\n    server_instance_t *targetP;\n    uint8_t result;\n    int i;\n\n    targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n\n    // is the server asking for the full instance ?\n    if (*numDataP == 0)\n    {\n        uint16_t resList[] =\n        {\n            LWM2M_SERVER_SHORT_ID_ID,\n            LWM2M_SERVER_LIFETIME_ID,\n            LWM2M_SERVER_MIN_PERIOD_ID,\n            LWM2M_SERVER_MAX_PERIOD_ID,\n            LWM2M_SERVER_TIMEOUT_ID,\n            LWM2M_SERVER_STORING_ID,\n            LWM2M_SERVER_BINDING_ID\n        };\n        int nbRes = sizeof(resList) / sizeof(uint16_t);\n\n        *dataArrayP = lwm2m_data_new(nbRes);\n        if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        *numDataP = nbRes;\n        for (i = 0 ; i < nbRes ; i++)\n        {\n            (*dataArrayP)[i].id = resList[i];\n        }\n    }\n\n    i = 0;\n    do\n    {\n        result = prv_get_value((*dataArrayP) + i, targetP);\n        i++;\n    }\n    while (i < *numDataP && result == COAP_205_CONTENT);\n\n    return result;\n}\n\nstatic uint8_t prv_server_discover(uint16_t instanceId,\n                                   int *numDataP,\n                                   lwm2m_data_t **dataArrayP,\n                                   lwm2m_object_t *objectP)\n{\n    uint8_t result;\n    int i;\n\n    result = COAP_205_CONTENT;\n\n    // is the server asking for the full object ?\n    if (*numDataP == 0)\n    {\n        uint16_t resList[] =\n        {\n            LWM2M_SERVER_SHORT_ID_ID,\n            LWM2M_SERVER_LIFETIME_ID,\n            LWM2M_SERVER_MIN_PERIOD_ID,\n            LWM2M_SERVER_MAX_PERIOD_ID,\n            LWM2M_SERVER_DISABLE_ID,\n            LWM2M_SERVER_TIMEOUT_ID,\n            LWM2M_SERVER_STORING_ID,\n            LWM2M_SERVER_BINDING_ID,\n            LWM2M_SERVER_UPDATE_ID\n        };\n        int nbRes = sizeof(resList) / sizeof(uint16_t);\n\n        *dataArrayP = lwm2m_data_new(nbRes);\n        if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        *numDataP = nbRes;\n        for (i = 0; i < nbRes; i++)\n        {\n            (*dataArrayP)[i].id = resList[i];\n        }\n    }\n    else\n    {\n        for (i = 0; i < *numDataP && result == COAP_205_CONTENT; i++)\n        {\n            switch ((*dataArrayP)[i].id)\n            {\n            case LWM2M_SERVER_SHORT_ID_ID:\n            case LWM2M_SERVER_LIFETIME_ID:\n            case LWM2M_SERVER_MIN_PERIOD_ID:\n            case LWM2M_SERVER_MAX_PERIOD_ID:\n            case LWM2M_SERVER_DISABLE_ID:\n            case LWM2M_SERVER_TIMEOUT_ID:\n            case LWM2M_SERVER_STORING_ID:\n            case LWM2M_SERVER_BINDING_ID:\n            case LWM2M_SERVER_UPDATE_ID:\n                break;\n            default:\n                result = COAP_404_NOT_FOUND;\n            }\n        }\n    }\n\n    return result;\n}\n\nstatic uint8_t prv_set_int_value(lwm2m_data_t *dataArray, uint32_t *data)\n{\n    uint8_t result;\n    int64_t value;\n\n    if (1 == lwm2m_data_decode_int(dataArray, &value))\n    {\n        if (value >= 0 && value <= 0xFFFFFFFF)\n        {\n            *data = value;\n            result = COAP_204_CHANGED;\n        }\n        else\n        {\n            result = COAP_406_NOT_ACCEPTABLE;\n        }\n    }\n    else\n    {\n        result = COAP_400_BAD_REQUEST;\n    }\n    return result;\n}\n\nbool prv_server_check_binding_valid(const char *binding, size_t size)\n{\n    if (binding != NULL && (strncmp(binding, \"U\", size) == 0\n            || strncmp(binding, \"UQ\", size) == 0\n            || strncmp(binding, \"S\", size) == 0\n            || strncmp(binding, \"SQ\", size) == 0\n            || strncmp(binding, \"US\", size) == 0\n            || strncmp(binding, \"UQS\", size) == 0))\n    {\n        return true;\n    }\n    else\n    {\n        return false;\n    }\n}\nstatic uint8_t prv_server_write(uint16_t instanceId,\n                                int numData,\n                                lwm2m_data_t *dataArray,\n                                lwm2m_object_t *objectP)\n{\n    server_instance_t *targetP;\n    int i;\n    uint8_t result;\n\n    targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);\n    if (NULL == targetP)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    i = 0;\n    do\n    {\n        switch (dataArray[i].id)\n        {\n        case LWM2M_SERVER_SHORT_ID_ID:\n        {\n            uint32_t value = targetP->shortServerId;\n            result = prv_set_int_value(dataArray + i, &value);\n            if (COAP_204_CHANGED == result)\n            {\n                if (0 < value && 0xFFFF >= value)\n                {\n                    targetP->shortServerId = value;\n                }\n                else\n                {\n                    result = COAP_406_NOT_ACCEPTABLE;\n                }\n            }\n        }\n        break;\n\n        case LWM2M_SERVER_LIFETIME_ID:\n            result = prv_set_int_value(dataArray + i, (uint32_t *) & (targetP->lifetime));\n            break;\n\n        case LWM2M_SERVER_MIN_PERIOD_ID:\n            result = prv_set_int_value(dataArray + i, &(targetP->defaultMinPeriod));\n            break;\n\n        case LWM2M_SERVER_MAX_PERIOD_ID:\n            result = prv_set_int_value(dataArray + i, &(targetP->defaultMaxPeriod));\n            break;\n\n        case LWM2M_SERVER_DISABLE_ID:\n            result = COAP_405_METHOD_NOT_ALLOWED;\n            break;\n\n        case LWM2M_SERVER_TIMEOUT_ID:\n            result = prv_set_int_value(dataArray + i, &(targetP->disableTimeout));\n            break;\n\n        case LWM2M_SERVER_STORING_ID:\n        {\n            bool value;\n\n            if (1 == lwm2m_data_decode_bool(dataArray + i, &value))\n            {\n                targetP->storing = value;\n                if(!value)\n                {\n                    set_binary_app_data_object_rpt_max_cnt(value);\n                }\n                result = COAP_204_CHANGED;\n            }\n            else\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n        }\n        break;\n\n        case LWM2M_SERVER_BINDING_ID:\n            if ((dataArray[i].type == LWM2M_TYPE_STRING || dataArray[i].type == LWM2M_TYPE_OPAQUE)\n                    && dataArray[i].value.asBuffer.length > 0 && dataArray[i].value.asBuffer.length <= 3\n                    && prv_server_check_binding_valid((char *)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length))\n            {\n                memset(targetP->binding, 0, sizeof(targetP->binding));\n                strncpy(targetP->binding, (char *)dataArray[i].value.asBuffer.buffer, dataArray[i].value.asBuffer.length);\n                result = COAP_204_CHANGED;\n            }\n            else\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n            break;\n\n        case LWM2M_SERVER_UPDATE_ID:\n            result = COAP_405_METHOD_NOT_ALLOWED;\n            break;\n\n        default:\n            return COAP_404_NOT_FOUND;\n        }\n        i++;\n    }\n    while (i < numData && result == COAP_204_CHANGED);\n\n    return result;\n}\n\nstatic uint8_t prv_server_execute(uint16_t instanceId,\n                                  uint16_t resourceId,\n                                  uint8_t *buffer,\n                                  int length,\n                                  lwm2m_object_t *objectP)\n\n{\n    server_instance_t *targetP;\n\n    targetP = (server_instance_t *)lwm2m_list_find(objectP->instanceList, instanceId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n\n    switch (resourceId)\n    {\n    case LWM2M_SERVER_DISABLE_ID:\n        // executed in core, if COAP_204_CHANGED is returned\n        if (0 < targetP->disableTimeout) return COAP_204_CHANGED;\n        else return COAP_405_METHOD_NOT_ALLOWED;\n    case LWM2M_SERVER_UPDATE_ID:\n        // executed in core, if COAP_204_CHANGED is returned\n        return COAP_204_CHANGED;\n    default:\n        return COAP_405_METHOD_NOT_ALLOWED;\n    }\n}\n\nstatic uint8_t prv_server_delete(uint16_t id,\n                                 lwm2m_object_t *objectP)\n{\n    server_instance_t *serverInstance;\n\n    objectP->instanceList = lwm2m_list_remove(objectP->instanceList, id, (lwm2m_list_t **)&serverInstance);\n    if (NULL == serverInstance) return COAP_404_NOT_FOUND;\n\n    lwm2m_free(serverInstance);\n\n    return COAP_202_DELETED;\n}\n\nstatic uint8_t prv_server_create(uint16_t instanceId,\n                                 int numData,\n                                 lwm2m_data_t *dataArray,\n                                 lwm2m_object_t *objectP)\n{\n    server_instance_t *serverInstance;\n    uint8_t result;\n\n    serverInstance = (server_instance_t *)lwm2m_malloc(sizeof(server_instance_t));\n    if (NULL == serverInstance) return COAP_500_INTERNAL_SERVER_ERROR;\n    memset(serverInstance, 0, sizeof(server_instance_t));\n\n    serverInstance->instanceId = instanceId;\n    objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, serverInstance);\n\n    result = prv_server_write(instanceId, numData, dataArray, objectP);\n\n    if (result != COAP_204_CHANGED)\n    {\n        (void)prv_server_delete(instanceId, objectP);\n    }\n    else\n    {\n        result = COAP_201_CREATED;\n    }\n\n    return result;\n}\n\nvoid copy_server_object(lwm2m_object_t *objectDest, lwm2m_object_t *objectSrc)\n{\n    server_instance_t *instanceSrc = NULL;\n    server_instance_t *previousInstanceDest = NULL;\n\n    memcpy(objectDest, objectSrc, sizeof(lwm2m_object_t));\n    objectDest->instanceList = NULL;\n    objectDest->userData = NULL;\n    instanceSrc = (server_instance_t *)objectSrc->instanceList;\n    while (instanceSrc != NULL)\n    {\n        server_instance_t *instanceDest = (server_instance_t *)lwm2m_malloc(sizeof(server_instance_t));\n        if (NULL == instanceDest)\n        {\n            return;\n        }\n        memcpy(instanceDest, instanceSrc, sizeof(server_instance_t));\n        // not sure it's necessary:\n        strncpy(instanceDest->binding, instanceSrc->binding, 4);\n        instanceSrc = (server_instance_t *)instanceSrc->next;\n        if (previousInstanceDest == NULL)\n        {\n            objectDest->instanceList = (lwm2m_list_t *)instanceDest;\n        }\n        else\n        {\n            previousInstanceDest->next = instanceDest;\n        }\n        previousInstanceDest = instanceDest;\n    }\n}\n\nvoid display_server_object(lwm2m_object_t *object)\n{\n#ifdef WITH_LOGS\n    fprintf(stdout, \"  /%u: Server object, instances:\\r\\n\", object->objID);\n    server_instance_t *serverInstance = (server_instance_t *)object->instanceList;\n    while (serverInstance != NULL)\n    {\n        fprintf(stdout, \"    /%u/%u: instanceId: %u, shortServerId: %u, lifetime: %u, storing: %s, binding: %s\\r\\n\",\n                object->objID, serverInstance->instanceId,\n                serverInstance->instanceId, serverInstance->shortServerId, serverInstance->lifetime,\n                serverInstance->storing ? \"true\" : \"false\", serverInstance->binding);\n        serverInstance = (server_instance_t *)serverInstance->next;\n    }\n#endif\n}\n//objArray[1] = get_server_object(serverId, \"U\", lifetime, false);\nlwm2m_object_t *get_server_object(int serverId,\n                                  const char *binding,\n                                  int lifetime,\n                                  bool storing)\n{\n    lwm2m_object_t *serverObj;\n\n    serverObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));\n\n    if (NULL != serverObj)\n    {\n        server_instance_t *serverInstance;\n\n        memset(serverObj, 0, sizeof(lwm2m_object_t));\n\n        serverObj->objID = LWM2M_SERVER_OBJECT_ID;\n\n        // Manually create an hardcoded server\n        serverInstance = (server_instance_t *)lwm2m_malloc(sizeof(server_instance_t));\n        if (NULL == serverInstance)\n        {\n            lwm2m_free(serverObj);\n            return NULL;\n        }\n\n        memset(serverInstance, 0, sizeof(server_instance_t));\n        serverInstance->instanceId = 0;\n        serverInstance->shortServerId = serverId;\n        if (lifetime <= 0)\n        {\n            serverInstance->lifetime = LWM2M_DEFAULT_LIFETIME;\n        }\n        else\n        {\n            serverInstance->lifetime = lifetime;\n        }\n\n        serverInstance->storing = storing;\n        if(prv_server_check_binding_valid(binding, strlen(binding)))\n        {\n            memcpy(serverInstance->binding, binding, strlen(binding) + 1);\n        }\n        else\n        {\n            lwm2m_free(serverObj);\n            lwm2m_free(serverInstance);\n            return NULL;\n        }\n\n        serverObj->instanceList = LWM2M_LIST_ADD(serverObj->instanceList, serverInstance);\n\n        serverObj->readFunc = prv_server_read;\n        serverObj->discoverFunc = prv_server_discover;\n        serverObj->writeFunc = prv_server_write;\n        serverObj->createFunc = prv_server_create;\n        serverObj->deleteFunc = prv_server_delete;\n        serverObj->executeFunc = prv_server_execute;\n    }\n\n    return serverObj;\n}\n\nvoid clean_server_object(lwm2m_object_t *object)\n{\n    if(NULL == object)\n    {\n        return;\n    }\n    while (object->instanceList != NULL)\n    {\n        server_instance_t *serverInstance = (server_instance_t *)object->instanceList;\n        object->instanceList = object->instanceList->next;\n        lwm2m_free(serverInstance);\n    }\n    lwm2m_free(object);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/platform_adapter.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014, 2015 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *******************************************************************************/\n\n#include <stdarg.h>\n\n#include \"internals.h\"\n#include \"osdepends/atiny_osdep.h\"\n\n#ifndef LWM2M_MEMORY_TRACE\n\nvoid *lwm2m_malloc(size_t s)\n{\n    void *mem = NULL;\n    mem = atiny_malloc(s);\n    return mem;\n}\n\nvoid lwm2m_free(void *p)\n{\n    if(NULL != p)\n        atiny_free(p);\n}\n\n\nchar *lwm2m_strdup(const char *str)\n{\n    int len = strlen(str) + 1;\n    void *new = lwm2m_malloc(len);\n    if (new == NULL)\n        return NULL;\n    return (char *)memcpy(new, str, len);\n\n}\n\n#endif\n\nint lwm2m_strncmp(const char *s1,\n                  const char *s2,\n                  size_t n)\n{\n    return strncmp(s1, s2, n);\n}\n\ntime_t lwm2m_gettime(void)\n{\n    return (uint32_t)(atiny_gettime_ms() / 1000);\n}\n\nint lwm2m_rand(void *output, size_t len)\n{\n    return atiny_random(output, len);\n}\n\nvoid lwm2m_delay(uint32_t second)\n{\n    atiny_delay(second);\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/util_timer.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifdef LWM2M_BOOTSTRAP\n#ifdef LWM2M_CLIENT_MODE\n#include \"util_timer.h\"\n#include \"liblwm2m.h\"\n\nvoid timer_init(util_timer_t *timer, time_t interval, void(*callback)(void *param), void *param)\n{\n    timer->expireTime = lwm2m_gettime() + interval;\n    timer->interval = interval;\n    timer->startFlag = false;\n    timer->callback = callback;\n    timer->param = param;\n}\n\nvoid timer_start(util_timer_t *timer)\n{\n    timer->startFlag = true;\n}\n\nvoid timer_stop(util_timer_t *timer)\n{\n    timer->startFlag = false;\n}\nvoid timer_step(util_timer_t *timer)\n{\n    time_t current;\n\n    if (!timer->startFlag)\n    {\n        return;\n    }\n\n    current = lwm2m_gettime();\n    if (current < timer->expireTime)\n    {\n        return;\n    }\n\n    if (timer->callback)\n    {\n        timer->callback(timer->param);\n    }\n\n    timer->expireTime = current + timer->interval;\n}\n\n#endif // LWM2M_CLIENT_MODE\n#endif // LWM2M_BOOTSTRAP\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_lwm2m/util_timer.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/**@defgroup agent AgentTiny\n * @defgroup agenttiny Agenttiny Definition\n * @ingroup agent\n */\n\n\n\n#ifndef _UTIL_TIMER_H_\n#define _UTIL_TIMER_H_\n#include <stdint.h>\n#include <stddef.h>\n#include <stdbool.h>\n#include <time.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n#ifdef LWM2M_BOOTSTRAP\n#ifdef LWM2M_CLIENT_MODE\n\n// time uint is second, and max value 0xffffffff is hundreds of years.so ignore the turn to 0 problem\ntypedef struct\n{\n    time_t expireTime;\n    time_t interval;\n    void(*callback)(void *param);\n    void *param;\n    bool startFlag;\n}util_timer_t;\n\nvoid timer_init(util_timer_t *timer, time_t interval, void(*callback)(void *param), void *param);\nvoid timer_start(util_timer_t *timer);\nvoid timer_stop(util_timer_t *timer);\nvoid timer_step(util_timer_t *timer);\n\n\n#endif // LWM2M_CLIENT_MODE\n\n#endif // LWM2M_BOOTSTRAP\n\n#ifdef __cplusplus\n}\n#endif\n\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_mqtt/flash_manager.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"flash_manager.h\"\n#include \"log/atiny_log.h\"\n\n#define FLASH_MAGIC_NUM 0x57381232\n\n#define MAGIC_NUM_POS 0\n#define TOTAL_LEN_POS 4\n#define DATA_POS 8\n\n#define MAX_FLASH_INFO ((STRING_MAX_LEN + 1) * (MAX_DATA_ITEM) + DATA_POS)\n\n\nstatic int (*g_cmd_ioctl)(mqtt_cmd_e cmd, void *arg, int32_t len);\n\nstatic int flash_manager_parse(const char *buf, uint32_t len, flash_info_s *flash_info)\n{\n    uint32_t i;\n    uint32_t tmp_len;\n    int ret;\n\n    for (i = 0; i < MAX_DATA_ITEM; i++)\n    {\n        tmp_len = strnlen(buf, len);\n        if ((tmp_len >= len) || (tmp_len > STRING_MAX_LEN))\n        {\n           ATINY_LOG(LOG_FATAL, \"string len err tmp_len %ld,len %ld\", tmp_len, len);\n           break;\n        }\n\n        flash_info->items[i] = atiny_strdup(buf);\n        if (flash_info->items[i] == NULL)\n        {\n            ATINY_LOG(LOG_FATAL, \"atiny_strdup fail\");\n            ret = ATINY_MALLOC_FAILED;\n            goto EXIT_ERR;\n        }\n        buf += (tmp_len + 1);\n        len -= (tmp_len + 1);\n    }\n\n    if ((i != MAX_DATA_ITEM) || (len \r!= 0))\n    {\n        ATINY_LOG(LOG_FATAL, \"data info err item num %ld,left len %ld\", i, len);\n        ret = ATINY_ERR;\n        goto EXIT_ERR;\n    }\n    ATINY_LOG(LOG_INFO, \"deviceid and password exist\");\n    return ATINY_OK;\n\nEXIT_ERR:\n    flash_manager_destroy_flash_info(flash_info);\n    return ret;\n\n}\n\nstatic int flash_manager_get_need_len(const flash_info_s *flash_info, uint32_t *len)\n{\n   uint32_t i;\n\n   *len  = DATA_POS;\n   for (i = 0; i < MAX_DATA_ITEM; i++)\n   {\n       uint32_t tmp_len = strnlen(flash_info->items[i], MAX_FLASH_INFO);\n       *len += (tmp_len + 1);\n       if (*len > MAX_FLASH_INFO)\n       {\n           ATINY_LOG(LOG_ERR, \"write info exceed max\");\n           return ATINY_ERR;\n       }\n\n   }\n   return ATINY_OK;\n}\n\nstatic void flash_manager_write_buffer(const flash_info_s *flash_info, char *buf, uint32_t len)\n{\n   uint32_t i;\n   *((uint32_t *)buf) = FLASH_MAGIC_NUM;\n   *((uint32_t *)&buf[TOTAL_LEN_POS]) = len;\n\n   buf += DATA_POS;\n   len -= DATA_POS;\n   for (i = 0; i < MAX_DATA_ITEM; i++)\n   {\n     int32_t tmp_len;\n     tmp_len = snprintf(buf, len, \"%s\", flash_info->items[i]);\n     if ((tmp_len >= len) || (tmp_len < 0))\n     {\n        ATINY_LOG(LOG_FATAL, \"snprintf err,tmp_len %ld, len %d\", tmp_len, len);\n        return;\n     }\n     buf += (tmp_len + 1);\n     len -= (tmp_len + 1);\n   }\n}\n\nvoid flash_manager_init(int (*cmd_ioctl)(mqtt_cmd_e cmd, void *arg, int32_t len))\n{\n    g_cmd_ioctl = cmd_ioctl;\n}\n\nint flash_manager_read(flash_info_s *flash_info)\n{\n    int ret;\n    uint32_t len;\n    uint32_t magic_num;\n    uint8_t *buf;\n\n    memset(flash_info, 0, sizeof(*flash_info));\n    buf = atiny_malloc(MAX_FLASH_INFO);\n    if (buf == NULL)\n    {\n        ATINY_LOG(LOG_ERR, \"atiny_malloc fail len %d\", MAX_FLASH_INFO);\n        return ATINY_MALLOC_FAILED;\n    }\n\n    ret = g_cmd_ioctl(MQTT_READ_SECRET_INFO, buf, MAX_FLASH_INFO);\n    if (ret != ATINY_OK)\n    {\n        ATINY_LOG(LOG_FATAL, \"g_cmd_ioctl MQTT_READ_SECRET_INFO fail ret %ld\", ret);\n         goto EXIT;\n    }\n\n    magic_num = *((uint32_t*)buf);\n    if (magic_num != FLASH_MAGIC_NUM)\n    {\n        ATINY_LOG(LOG_INFO, \"mqtt flash info not valid\");\n         goto EXIT;\n    }\n\n\n    len = *((uint32_t*)&buf[TOTAL_LEN_POS]);\n    if ((len > MAX_FLASH_INFO) || (len <= DATA_POS))\n    {\n        ATINY_LOG(LOG_ERR, \"mqtt flash info len %d invalid\", len);\n         goto EXIT;\n    }\n\n    ret = flash_manager_parse((char *)(buf + DATA_POS), len - DATA_POS, flash_info);\n\nEXIT:\n    atiny_free(buf);\n    return ret;\n}\n\nint flash_manager_write(const flash_info_s *flash_info)\n{\n    uint32_t len;\n    int ret;\n    uint8_t *buf;\n\n    ret = flash_manager_get_need_len(flash_info, &len);\n    if (ret != ATINY_OK)\n    {\n        return ret;\n    }\n\n    buf = atiny_malloc(MAX_FLASH_INFO);\n    if (buf == NULL)\n    {\n        ATINY_LOG(LOG_ERR, \"atiny_malloc fail len %d\", len);\n        return ATINY_MALLOC_FAILED;\n    }\n\n    flash_manager_write_buffer(flash_info, (char *)buf, len);\n    ret = g_cmd_ioctl(MQTT_SAVE_SECRET_INFO, buf, MAX_FLASH_INFO);\n    atiny_free(buf);\n    if (ret != ATINY_OK)\n    {\n        ATINY_LOG(LOG_FATAL, \"g_cmd_ioctl MQTT_SAVE_SECRET_INFO fail ret %d, len ld\", ret, len);\n\n    }\n    return ret;\n}\nvoid flash_manager_destroy_flash_info(flash_info_s *flash_info)\n{\n   uint32_t i;\n\n   for (i = 0; i < MAX_DATA_ITEM; i++)\n   {\n       TRY_FREE_MEM(flash_info->items[i]);\n   }\n}\n\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_mqtt/flash_manager.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef FLASH_MANAGER_H\n#define FLASH_MANAGER_H\n\n#include \"atiny_mqtt/mqtt_client.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define STRING_MAX_LEN 256\n\n\n#ifndef array_size\n#define array_size(a) (sizeof(a)/sizeof(*(a)))\n#endif\n\n#define TRY_FREE_MEM(mem) \\\ndo\\\n{\\\n    if(NULL != (mem))\\\n    {\\\n       atiny_free(mem);\\\n       (mem) = NULL;\\\n    }\\\n}while(0)\n\n\nenum\n{\n    PRODUCT_IDX,\n    NODEID_IDX,\n    DEVICEID_IDX,\n    PASSWORD_IDX,\n    MAX_DATA_ITEM\n};\n\n\ntypedef struct\n{\n    char *items[MAX_DATA_ITEM];\n}flash_info_s;\n\n\n/*flash_info info is malloc, should destroy if not used*/\nvoid flash_manager_init(int (*cmd_ioctl)(mqtt_cmd_e cmd, void *arg, int32_t len));\nint flash_manager_read(flash_info_s *flash_info);\nint flash_manager_write(const flash_info_s *flash_info);\nvoid flash_manager_destroy_flash_info(flash_info_s *flash_info);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* FLASH_MANAGER_H */\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_mqtt/hmac.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#include \"hmac.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/platform.h\"\n\n#include \"mbedtls/md_internal.h\"\n#include \"osdepends/atiny_osdep.h\"\n#include \"dtls_interface.h\"\n\n\n\nint mbedtls_hmac_calc(mbedtls_hmac_t *hmac_info)\n{\n    int ret;\n\n    mbedtls_md_context_t mbedtls_md_ctx;\n    const mbedtls_md_info_t *md_info;\n\n    if (hmac_info == NULL || hmac_info->secret == NULL || hmac_info->input == NULL\n        || hmac_info->secret_len <= 0 || hmac_info->input_len <= 0 || hmac_info->digest_len <= 0)\n    {\n        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;\n    }\n\n    md_info = mbedtls_md_info_from_type(hmac_info->hmac_type);\n    if (md_info == NULL || md_info->size > hmac_info->digest_len)\n    {\n        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;\n    }\n\n    mbedtls_md_init(&mbedtls_md_ctx);\n    memset(hmac_info->digest, 0x00, hmac_info->digest_len);\n\n    ret = mbedtls_md_setup(&mbedtls_md_ctx, md_info, 1);\n    if (ret != 0)\n    {\n        printf(\"mbedtls_md_setup() returned -0x%04x\\n\", -ret);\n        goto exit;\n    }\n\n    (void)mbedtls_md_hmac_starts(&mbedtls_md_ctx, hmac_info->secret, hmac_info->secret_len);\n    (void)mbedtls_md_hmac_update(&mbedtls_md_ctx, hmac_info->input, hmac_info->input_len);\n    (void)mbedtls_md_hmac_finish(&mbedtls_md_ctx, hmac_info->digest);\n\n    exit:\n    mbedtls_md_free(&mbedtls_md_ctx);\n\n    return ret;\n}\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_mqtt/hmac.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef _HMAC_H_\n#define _HMAC_H_\n#include \"mbedtls/md.h\"\n\n#ifdef __cplusplus\n#if __cplusplus\nextern \"C\" {\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\ntypedef struct _mbedtls_hmac_t\n{\n    const unsigned char *secret;\n    const unsigned char *input;\n    unsigned char *digest;\n    size_t secret_len;\n    size_t input_len;\n    size_t digest_len;\n    mbedtls_md_type_t hmac_type;\n}mbedtls_hmac_t;\n\nint mbedtls_hmac_calc(mbedtls_hmac_t *hmac_info);\n\n\n#ifdef __cplusplus\n#if __cplusplus\n}\n#endif /* __cplusplus */\n#endif /* __cplusplus */\n\n#endif /* _HMAC_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/agent_tiny/atiny_mqtt/mqtt_client.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"atiny_mqtt/mqtt_client.h\"\n#include \"los_base.h\"\n#include \"los_task.ph\"\n#include \"los_typedef.h\"\n#include \"los_sys.h\"\n#include \"log/atiny_log.h\"\n#include \"MQTTClient.h\"\n#include \"flash_manager.h\"\n#include \"dtls_interface.h\"\n#include \"cJSON.h\"\n#include \"hmac.h\"\n\n#define MQTT_VERSION_3_1 (3)\n#define MQTT_VERSION_3_1_1 (4)\n\n#define VARIABLE_SIZE (4 + 1)\n#define CMD_TOPIC_FMT \"/huawei/v1/devices/%s/command/%s\"\n#define DATA_TOPIC_FMT \"/huawei/v1/devices/%s/data/%s\"\n#define SECRET_NOTIFY_TOPIC_FMT \"/huawei/v1/products/%s/sn/%s/secretNotify\"\n#define SECRET_ACK_TOPIC_FMT \"/huawei/v1/products/%s/sn/%s/secretACK\"\n\n#define MQTT_TIME_BUF_LEN 11\n\n#define IS_VALID_NAME_LEN(name) (strnlen((name), STRING_MAX_LEN + 1) <= STRING_MAX_LEN)\n\ntypedef enum\n{\n    MQTT_CONNECT_WITH_PRODUCT_ID,\n    MQTT_CONNECT_WITH_DEVICE_ID\n}mqtt_dynamic_connect_state_e;\n\ntypedef struct\n{\n    mqtt_static_connection_info_s save_info;\n    char *  got_password;\n    mqtt_dynamic_connect_state_e state;\n    uint8_t connection_update_flag;\n    uint8_t has_device_id; //\n    uint8_t reserve[2];\n}mqtt_dynamic_info_s;\n\nstruct mqtt_client_tag_s\n{\n    mqtt_device_info_s device_info;\n    MQTTClient client;\n    mqtt_param_s params;\n    mqtt_dynamic_info_s dynamic_info;\n    char *sub_topic;\n    uint8_t init_flag;\n    uint8_t reserve[3];\n};\n\nstatic uint8_t g_mqtt_sendbuf[MQTT_SENDBUF_SIZE];\n\n/* reserve 1 byte for string end 0 for jason */\nstatic uint8_t g_mqtt_readbuf[MQTT_READBUF_SIZE + 1];\n\nstatic mqtt_client_s g_mqtt_client;\n\nstatic int mqtt_cmd_ioctl(mqtt_cmd_e cmd, void *arg, int32_t len)\n{\n    mqtt_client_s* handle = &g_mqtt_client;\n\n    if (handle->params.cmd_ioctl != NULL)\n    {\n        return handle->params.cmd_ioctl(cmd, arg, len);\n    }\n    ATINY_LOG(LOG_FATAL, \"cmd_ioctl null\");\n    return ATINY_ERR;\n}\n\nstatic void mqtt_free_params(mqtt_param_s *param)\n{\n\n    TRY_FREE_MEM(param->server_ip);\n    TRY_FREE_MEM(param->server_port);\n    switch(param->info.security_type)\n    {\n    case MQTT_SECURITY_TYPE_PSK:\n        TRY_FREE_MEM(param->info.u.psk.psk_id);\n        TRY_FREE_MEM(param->info.u.psk.psk);\n        break;\n    case MQTT_SECURITY_TYPE_CA:\n        TRY_FREE_MEM(param->info.u.ca.ca_crt);\n        break;\n    default:\n        break;\n    }\n}\n\nstatic int mqtt_check_param(const mqtt_param_s *param)\n{\n    if ((param->server_ip == NULL)\n        || (param->server_port == NULL)\n        || (param->info.security_type >= MQTT_SECURITY_TYPE_MAX)\n        || (param->cmd_ioctl == NULL))\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid param, sec type %d\", param->info.security_type);\n        return ATINY_ARG_INVALID;\n    }\n    if (param->info.security_type == MQTT_SECURITY_TYPE_PSK)\n    {\n        if ((param->info.u.psk.psk == NULL)\n            || (param->info.u.psk.psk_len <= 0)\n            || (param->info.u.psk.psk_id == NULL)\n            || (param->info.u.psk.psk_id_len <= 0))\n        {\n            ATINY_LOG(LOG_FATAL, \"invalid psk\");\n            return ATINY_ARG_INVALID;\n        }\n    }\n\n    if (param->info.security_type == MQTT_SECURITY_TYPE_CA)\n    {\n        if (param->info.u.ca.ca_crt == NULL)\n        {\n            ATINY_LOG(LOG_FATAL, \"invalid ca\");\n            return ATINY_ARG_INVALID;\n        }\n    }\n\n    return ATINY_OK;\n}\n\nstatic int mqtt_dup_param(mqtt_param_s *dest, const mqtt_param_s *src)\n{\n    memset(dest, 0, sizeof(*dest));\n\n    dest->info.security_type = src->info.security_type;\n    dest->cmd_ioctl = src->cmd_ioctl;\n\n    dest->server_ip = atiny_strdup(src->server_ip);\n    if(NULL == dest->server_ip)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_strdup NULL\");\n        return ATINY_MALLOC_FAILED;\n    }\n\n    dest->server_port = atiny_strdup(src->server_port);\n    if(NULL == dest->server_port)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_strdup NULL\");\n        goto mqtt_param_dup_failed;\n    }\n\n    switch(src->info.security_type)\n    {\n        case MQTT_SECURITY_TYPE_PSK:\n            dest->info.u.psk.psk_id = (uint8_t *)atiny_malloc(src->info.u.psk.psk_id_len);\n            if(NULL == dest->info.u.psk.psk_id)\n            {\n                ATINY_LOG(LOG_FATAL, \"atiny_strdup NULL\");\n                goto mqtt_param_dup_failed;\n            }\n            memcpy(dest->info.u.psk.psk_id, src->info.u.psk.psk_id, src->info.u.psk.psk_id_len);\n            dest->info.u.psk.psk_id_len = src->info.u.psk.psk_id_len;\n\n            dest->info.u.psk.psk = (unsigned char *)atiny_malloc(src->info.u.psk.psk_len);\n            if(NULL == dest->info.u.psk.psk)\n            {\n                ATINY_LOG(LOG_FATAL, \"atiny_strdup NULL\");\n                goto mqtt_param_dup_failed;\n            }\n            memcpy(dest->info.u.psk.psk, src->info.u.psk.psk, src->info.u.psk.psk_len);\n            dest->info.u.psk.psk_len = src->info.u.psk.psk_len;\n            break;\n\n        case MQTT_SECURITY_TYPE_CA:\n            dest->info.u.ca.ca_crt = (char *)atiny_malloc(src->info.u.ca.ca_len);\n            if(NULL == dest->info.u.ca.ca_crt)\n            {\n                ATINY_LOG(LOG_FATAL, \"atiny_strdup NULL\");\n                goto mqtt_param_dup_failed;\n            }\n            memcpy(dest->info.u.ca.ca_crt, src->info.u.ca.ca_crt, src->info.u.ca.ca_len);\n            dest->info.u.ca.ca_len = src->info.u.ca.ca_len;\n            break;\n        default:\n            break;\n    }\n\n\n    return ATINY_OK;\n\nmqtt_param_dup_failed:\n    mqtt_free_params(dest);\n    return ATINY_MALLOC_FAILED;\n}\n\nstatic void mqtt_free_device_info(mqtt_device_info_s *info)\n{\n\n    TRY_FREE_MEM(info->password);\n    if(MQTT_STATIC_CONNECT == info->connection_type)\n    {\n        TRY_FREE_MEM(info->u.s_info.deviceid);\n    }\n    else\n    {\n        TRY_FREE_MEM(info->u.d_info.productid);\n        TRY_FREE_MEM(info->u.d_info.nodeid);\n    }\n}\n\nstatic void mqtt_free_dynamic_info(mqtt_client_s* handle)\n{\n    if (handle->sub_topic)\n    {\n        (void)MQTTSetMessageHandler(&handle->client, handle->sub_topic, NULL);\n        atiny_free(handle->sub_topic);\n        handle->sub_topic = NULL;\n    }\n    TRY_FREE_MEM(handle->dynamic_info.save_info.deviceid);\n    TRY_FREE_MEM(handle->dynamic_info.got_password);\n}\n\nstatic int mqtt_check_device_info(const mqtt_device_info_s *info)\n{\n    if((info->connection_type >= MQTT_MAX_CONNECTION_TYPE)\n        || (info->codec_mode >= MQTT_MAX_CODEC_MODE)\n        || (info->sign_type >= MQTT_MAX_SIGN_TYPE)\n        || (NULL == info->password)\n        || (!IS_VALID_NAME_LEN(info->password)))\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid device info con_type %d codec_mode %d signe type %d\",\n            info->connection_type, info->codec_mode, info->sign_type);\n        return ATINY_ARG_INVALID;\n    }\n\n    if ((info->connection_type == MQTT_STATIC_CONNECT)\n        && ((NULL == info->u.s_info.deviceid)\n        || (!IS_VALID_NAME_LEN(info->u.s_info.deviceid))))\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid static device info con_type %d codec_mode %d signe type %d\",\n            info->connection_type, info->codec_mode, info->sign_type);\n        return ATINY_ARG_INVALID;\n    }\n\n    if ((info->connection_type == MQTT_DYNAMIC_CONNECT)\n        &&((NULL == info->u.d_info.productid)\n        || (!IS_VALID_NAME_LEN(info->u.d_info.productid))\n        || (NULL == info->u.d_info.nodeid)\n        || !(IS_VALID_NAME_LEN(info->u.d_info.nodeid))))\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid dynamic device info con_type %d codec_mode %d signe type %d\",\n            info->connection_type, info->codec_mode, info->sign_type);\n        return ATINY_ARG_INVALID;\n    }\n\n    return ATINY_OK;\n\n}\n\nstatic int mqtt_dup_device_info(mqtt_device_info_s *dest, const mqtt_device_info_s *src)\n{\n    memset(dest, 0, sizeof(*dest));\n    dest->connection_type = src->connection_type;\n    dest->sign_type = src->sign_type;\n    dest->codec_mode = src->codec_mode;\n    dest->password = atiny_strdup(src->password);\n    if (NULL == dest->password)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_strdup fail\");\n        return ATINY_MALLOC_FAILED;\n    }\n\n    if(MQTT_STATIC_CONNECT == src->connection_type)\n    {\n        dest->u.s_info.deviceid = atiny_strdup(src->u.s_info.deviceid);\n        if (NULL == dest->u.s_info.deviceid)\n        {\n            ATINY_LOG(LOG_FATAL, \"atiny_strdup fail\");\n            goto MALLOC_FAIL;\n        }\n    }\n    else\n    {\n\n        dest->u.d_info.productid = atiny_strdup(src->u.d_info.productid);\n        if (NULL == dest->u.d_info.productid)\n        {\n            ATINY_LOG(LOG_FATAL, \"atiny_strdup fail\");\n            goto MALLOC_FAIL;\n        }\n        dest->u.d_info.nodeid = atiny_strdup(src->u.d_info.nodeid);\n        if (NULL == dest->u.d_info.nodeid)\n        {\n            ATINY_LOG(LOG_FATAL, \"atiny_strdup fail\");\n            goto MALLOC_FAIL;\n        }\n    }\n\n    return ATINY_OK;\n\nMALLOC_FAIL:\n    mqtt_free_device_info(dest);\n    return ATINY_MALLOC_FAILED;\n}\n\nstatic bool mqtt_is_connectting_with_deviceid(const mqtt_client_s* handle)\n{\n    return (MQTT_STATIC_CONNECT == handle->device_info.connection_type)\n           || (handle->dynamic_info.state == MQTT_CONNECT_WITH_DEVICE_ID);\n}\n\nstatic char *mqtt_add_strings(const char* strs[], uint32_t tmp_len[], uint32_t str_num)\n{\n    uint32_t i;\n    const char hyphen = '_';\n    uint32_t len = 0;\n    char *result;\n    char *cur;\n\n    for (i = 0; i < str_num; i++)\n    {\n        tmp_len[i] = strnlen(strs[i], STRING_MAX_LEN);\n        len += (tmp_len[i] + 1);\n    }\n\n    result = atiny_malloc(len);\n    if (result == NULL)\n    {\n        ATINY_LOG(LOG_FATAL, \"mqtt_cmd_ioctl fail\");\n        return NULL;\n    }\n\n    cur = result;\n    for (i = 0; i < str_num; i++)\n    {\n        memcpy(cur, strs[i], tmp_len[i]);\n        cur += tmp_len[i];\n        if (i != str_num - 1)\n        {\n            *cur = hyphen;\n            cur++;\n        }\n    }\n    *cur = '\\0';\n\n    return result;\n}\n\nstatic const char *mqtt_connection_type_to_str(mqtt_connection_type_e type)\n{\n    return MQTT_STATIC_CONNECT == type ? \"0\" : \"1\";\n}\n\nstatic const char *mqtt_sign_type_to_str(mqtt_password_sign_type_e type)\n{\n    return MQTT_SIGN_TYPE_HMACSHA256_NO_CHECK_TIME == type ? \"0\" : \"1\";\n}\n\nstatic void mqtt_bin_to_str(const uint8_t *bin_buf, char *str_buf, uint32_t bin_len)\n{\n    uint32_t i;\n\n    for(i = 0; i < bin_len; i++)\n    {\n        (void)snprintf(str_buf + i * 2, 3, \"%02x\", bin_buf[i]);\n    }\n}\nstatic char *mqtt_get_send_password(char *password, char *time)\n{\n    uint8_t hmac[32];\n    const uint32_t len = sizeof(hmac) * 2 + 1;\n    char *result;\n    int ret;\n\n    mbedtls_hmac_t hmac_info;\n\n    hmac_info.secret = (uint8_t *)time;\n    hmac_info.secret_len = strnlen(time, MQTT_TIME_BUF_LEN);\n    hmac_info.input = (uint8_t *)password;\n    hmac_info.input_len = strnlen(password, STRING_MAX_LEN);\n    hmac_info.digest = hmac;\n    hmac_info.digest_len = sizeof(hmac);\n    hmac_info.hmac_type = MBEDTLS_MD_SHA256;\n    ret = mbedtls_hmac_calc(&hmac_info);\n    if (ret != ATINY_OK)\n    {\n        ATINY_LOG(LOG_FATAL, \"mbedtls_hmac_calc fail,ret %d\", ret);\n        return NULL;\n    }\n\n    result = atiny_malloc(len);\n    if (result == NULL)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_malloc fail\");\n        return NULL;\n    }\n\n    mqtt_bin_to_str(hmac, result, sizeof(hmac));\n    return result;\n}\n\nstatic void mqtt_destroy_data_connection_info(MQTTPacket_connectData *data)\n{\n    TRY_FREE_MEM(data->clientID.cstring);\n    TRY_FREE_MEM(data->password.cstring);\n}\n\nstatic int mqtt_get_connection_info(mqtt_client_s* handle, MQTTPacket_connectData *data)\n{\n    char *strs[5];\n    uint32_t tmp[array_size(strs)];\n    uint32_t str_num = 0;\n    char time[MQTT_TIME_BUF_LEN];\n    char *password;\n\n    if (mqtt_is_connectting_with_deviceid(handle))\n    {\n        if (handle->device_info.connection_type == MQTT_STATIC_CONNECT)\n        {\n            strs[0] = handle->device_info.u.s_info.deviceid;\n            password = handle->device_info.password;\n        }\n        else\n        {\n            strs[0] = handle->dynamic_info.save_info.deviceid;\n            password = handle->dynamic_info.got_password;\n        }\n        str_num = 1;\n        ATINY_LOG(LOG_INFO, \"try static connect\");\n    }\n    else\n    {\n        strs[0] = handle->device_info.u.d_info.productid;\n        strs[1] = handle->device_info.u.d_info.nodeid;\n        str_num = 2;\n        password = handle->device_info.password;\n        ATINY_LOG(LOG_INFO, \"try dynamic connect\");\n    }\n\n    strs[str_num++] = (char *)mqtt_connection_type_to_str(\n            mqtt_is_connectting_with_deviceid(handle) ? MQTT_STATIC_CONNECT : MQTT_DYNAMIC_CONNECT);\n    strs[str_num++] = (char *)mqtt_sign_type_to_str(handle->device_info.sign_type);\n    if (mqtt_cmd_ioctl(MQTT_GET_TIME, time, sizeof(time)) != ATINY_OK)\n    {\n        ATINY_LOG(LOG_FATAL, \"mqtt_cmd_ioctl fail\");\n        return ATINY_ERR;\n    }\n    time[sizeof(time) - 1] = '\\0';\n    strs[str_num++] = time;\n\n    data->clientID.cstring = mqtt_add_strings((const char **)strs, tmp, str_num);\n    if (data->clientID.cstring == NULL)\n    {\n        return ATINY_MALLOC_FAILED;\n    }\n\n    data->username.cstring = strs[0]; //deviceid or pruoductid\n    data->password.cstring = mqtt_get_send_password(password, time);\n\n    if (data->password.cstring == NULL)\n    {\n        return ATINY_ERR;\n    }\n\n    ATINY_LOG(LOG_DEBUG, \"send user %s client %s\", data->username.cstring,\n                data->clientID.cstring);\n\n    return ATINY_OK;\n}\n\nstatic char *mqtt_get_topic(const mqtt_client_s* handle, const char *fmt, uint32_t fixed_size,\n            const char *deviceid_or_productid, const char *sn_or_codec_mode)\n{\n    uint32_t len;\n    char *topic;\n\n    len = fixed_size + strnlen(deviceid_or_productid, STRING_MAX_LEN) + strnlen(sn_or_codec_mode, STRING_MAX_LEN) + 1;\n    topic = atiny_malloc(len);\n    if (topic == NULL)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_malloc fail, len %d\", len);\n        return NULL;\n    }\n\n    (void)snprintf(topic, len, fmt, deviceid_or_productid, sn_or_codec_mode);\n\n    return topic;\n}\n\n\nstatic char *mqtt_get_device_topic(const mqtt_client_s* handle, const char *fmt, uint32_t fixed_size)\n{\n    char *deviceid;\n    const char *codec_mode[MQTT_MAX_CODEC_MODE] = {\"binary\", \"json\"};\n\n    deviceid = ((handle->device_info.connection_type == MQTT_STATIC_CONNECT) ?\n                handle->device_info.u.s_info.deviceid : handle->dynamic_info.save_info.deviceid);\n\n    return mqtt_get_topic(handle, fmt, fixed_size, deviceid, codec_mode[handle->device_info.codec_mode]);\n\n}\n\nstatic char *mqtt_get_secret_topic(const mqtt_client_s* handle, const char *fmt, uint32_t fixed_size)\n{\n    return mqtt_get_topic(handle, fmt, fixed_size,\n            handle->device_info.u.d_info.productid, handle->device_info.u.d_info.nodeid);\n}\n\nstatic int mqtt_parse_secret_topic(mqtt_client_s* handle, const char *payload, uint32_t len)\n{\n\n    //TODO:parse json, log\n    cJSON *msg_type;\n    cJSON *deviceid;\n    cJSON *secret;\n    cJSON * root = NULL;\n    int ret = ATINY_ERR;\n\n\n    root = cJSON_Parse(payload);\n    if (root == NULL)\n    {\n        ATINY_LOG(LOG_ERR, \"err secret notify, len %d, msg %s\", len, payload);\n         goto EXIT;\n    }\n\n    msg_type = cJSON_GetObjectItem(root, MQTT_MSG_TYPE);\n    if ((msg_type == NULL) || (msg_type->valuestring == NULL)\n        || (strncmp(msg_type->valuestring, \"cloudSendSecret\", STRING_MAX_LEN + 1) != 0))\n    {\n        ATINY_LOG(LOG_ERR, \"msg_type not right\");\n        goto EXIT;\n    }\n\n    deviceid = cJSON_GetObjectItem(root, \"deviceid\");\n    if ((deviceid == NULL) || (deviceid->valuestring == NULL)\n        || (!IS_VALID_NAME_LEN(deviceid->valuestring)))\n    {\n        ATINY_LOG(LOG_ERR, \"deviceid not right\");\n        goto EXIT;\n    }\n\n    secret = cJSON_GetObjectItem(root, \"secret\");\n    if ((secret == NULL) || (secret->valuestring == NULL)\n        || (!IS_VALID_NAME_LEN(secret->valuestring)))\n    {\n        ATINY_LOG(LOG_ERR, \"secret not right\");\n        goto EXIT;\n    }\n\n    handle->dynamic_info.has_device_id = false;\n    TRY_FREE_MEM(handle->dynamic_info.save_info.deviceid);\n    handle->dynamic_info.save_info.deviceid = atiny_strdup(deviceid->valuestring);\n    if (handle->dynamic_info.save_info.deviceid == NULL)\n    {\n        ATINY_LOG(LOG_INFO, \"atiny_strdup null\");\n        goto EXIT;\n    }\n    TRY_FREE_MEM(handle->dynamic_info.got_password);\n    handle->dynamic_info.got_password = atiny_strdup(secret->valuestring);\n    if (handle->dynamic_info.got_password == NULL)\n    {\n        ATINY_LOG(LOG_INFO, \"atiny_strdup null\");\n        goto EXIT;\n    }\n    handle->dynamic_info.has_device_id = true;\n    handle->dynamic_info.connection_update_flag = true;\n    ret = ATINY_OK;\n    ATINY_LOG(LOG_INFO, \"get secret info right\");\nEXIT:\n    if (root)\n    {\n        cJSON_Delete(root);\n    }\n    return ret;\n}\n\nstatic void mqtt_send_secret_ack(mqtt_client_s* handle)\n{\n    MQTTMessage message;\n    int rc;\n\n    char* topic = mqtt_get_secret_topic(handle, SECRET_ACK_TOPIC_FMT, sizeof(SECRET_ACK_TOPIC_FMT) - VARIABLE_SIZE);\n    if (topic == NULL)\n    {\n        return;\n    }\n    memset(&message, 0, sizeof(message));\n    message.qos = QOS1;\n    rc = MQTTPublish(&handle->client, topic, &message);\n    atiny_free(topic);\n    if (rc != MQTT_SUCCESS)\n    {\n        ATINY_LOG(LOG_FATAL, \"MQTTPublish fail,rc %d\", rc);\n    }\n}\n\n/*lint -e529*/\nstatic int mqtt_modify_payload(MessageData *md)\n{\n    char *end = ((char *)md->message->payload) + md->message->payloadlen;\n    static uint32_t callback_err;\n\n    /* add for jason parse,then not need to copy in callback */\n    if ((end >= (char *)g_mqtt_readbuf) && (end < (char *)(g_mqtt_readbuf + sizeof(g_mqtt_readbuf))))\n    {\n         *end = '\\0';\n         return ATINY_OK;\n    }\n\n    /*  should not happen */\n    ATINY_LOG(LOG_ERR, \"not expect msg callback err, pl %p, len %ld, err num %ld\", md->message->payload, md->message->payloadlen, ++callback_err);\n\n    return ATINY_ERR;\n}\n/*lint +e529*/\n\nstatic void mqtt_recv_secret_topic(MessageData *md)\n{\n    mqtt_client_s* handle = &g_mqtt_client;\n\n    if ((md == NULL) || (md->message == NULL)\n        || (md->message->payload == NULL)\n        || (md->message->payloadlen == 0)\n        || (mqtt_modify_payload(md) != ATINY_OK))\n    {\n        ATINY_LOG(LOG_FATAL, \"null point or msg err, len %ld\", md->message->payloadlen);\n        return;\n    }\n\n    if (mqtt_parse_secret_topic(handle, md->message->payload, md->message->payloadlen) == ATINY_OK)\n    {\n        flash_info_s flash_info;\n        flash_info.items[PRODUCT_IDX] = handle->device_info.u.d_info.productid;\n        flash_info.items[NODEID_IDX] = handle->device_info.u.d_info.nodeid;\n        flash_info.items[DEVICEID_IDX] = handle->dynamic_info.save_info.deviceid;\n        flash_info.items[PASSWORD_IDX] = handle->dynamic_info.got_password;\n        if (flash_manager_write(&flash_info) != ATINY_OK)\n        {\n            return;\n        }\n        mqtt_send_secret_ack(handle);\n    }\n}\n\nstatic void mqtt_recv_cmd_topic(MessageData *md)\n{\n    if ((md == NULL) || (md->message == NULL)\n        || (mqtt_modify_payload(md) != ATINY_OK))\n    {\n        ATINY_LOG(LOG_FATAL, \"null point\");\n        return;\n    }\n    (void)mqtt_cmd_ioctl(MQTT_RCV_MSG, md->message->payload, md->message->payloadlen);\n}\n\nstatic int mqtt_subscribe_topic(mqtt_client_s* handle)\n{\n    char *topic;\n    void (*topi_callback)(MessageData *md);\n    int rc;\n\n    if (handle->sub_topic)\n    {\n        (void)MQTTSetMessageHandler(&handle->client, handle->sub_topic, NULL);\n        atiny_free(handle->sub_topic);\n        handle->sub_topic = NULL;\n    }\n\n    if (mqtt_is_connectting_with_deviceid(handle))\n    {\n        topic = mqtt_get_device_topic(handle, CMD_TOPIC_FMT, sizeof(CMD_TOPIC_FMT) - VARIABLE_SIZE);\n        topi_callback = mqtt_recv_cmd_topic;\n        ATINY_LOG(LOG_INFO, \"try subcribe static topic\");\n    }\n    else\n    {\n        topic = mqtt_get_secret_topic(handle, SECRET_NOTIFY_TOPIC_FMT, sizeof(SECRET_NOTIFY_TOPIC_FMT) - VARIABLE_SIZE);;\n        topi_callback = mqtt_recv_secret_topic;\n         ATINY_LOG(LOG_INFO, \"try subcribe dynamic topic\");\n    }\n\n    if (topic == NULL)\n    {\n        return ATINY_ERR;\n    }\n\n\n    rc = MQTTSubscribe(&handle->client, topic, QOS1, topi_callback);\n    if (rc != MQTT_SUCCESS)\n    {\n         ATINY_LOG(LOG_FATAL, \"MQTTSubscribe fail,rc=%d, topic=%s\", rc, topic);\n         atiny_free(topic);\n    }\n    else\n    {\n        handle->sub_topic = topic;\n    }\n\n    return rc;\n}\n\nstatic void mqtt_disconnect( MQTTClient *client, Network *n)\n{\n    if (MQTTIsConnected(client))\n    {\n        (void)MQTTDisconnect(client);\n    }\n    NetworkDisconnect(n);\n\n    ATINY_LOG(LOG_ERR, \"mqtt_disconnect\");\n}\n\nstatic inline void mqtt_inc_fail_cnt(int32_t *conn_failed_cnt)\n{\n    if(*conn_failed_cnt < MQTT_CONN_FAILED_MAX_TIMES)\n    {\n        (*conn_failed_cnt)++;\n    }\n}\n\nstatic void mqtt_proc_connect_err( MQTTClient *client, Network *n, int32_t *conn_failed_cnt)\n{\n    mqtt_inc_fail_cnt(conn_failed_cnt);\n    mqtt_disconnect(client, n);\n}\n\nstatic void mqtt_proc_connect_nack(mqtt_client_s* handle)\n{\n    if (handle->device_info.connection_type == MQTT_DYNAMIC_CONNECT)\n    {\n        if (handle->dynamic_info.state == MQTT_CONNECT_WITH_DEVICE_ID)\n        {\n            handle->dynamic_info.state = MQTT_CONNECT_WITH_PRODUCT_ID;\n        }\n        else\n        {\n            if (handle->dynamic_info.has_device_id)\n            {\n                handle->dynamic_info.state = MQTT_CONNECT_WITH_DEVICE_ID;\n            }\n        }\n    }\n}\n\nstatic mqtt_security_info_s *mqtt_get_security_info(void)\n{\n    mqtt_client_s* handle = &g_mqtt_client;\n    return &handle->params.info;\n}\n\nstatic void mqtt_read_flash_info(mqtt_client_s* handle)\n{\n    flash_info_s flash_info;\n\n    if (handle->device_info.connection_type == MQTT_STATIC_CONNECT)\n    {\n        return;\n    }\n\n    memset(&handle->dynamic_info, 0, sizeof(handle->dynamic_info));\n    memset(&flash_info, 0, sizeof(flash_info));\n    if (flash_manager_read(&flash_info) != ATINY_OK)\n    {\n        return;\n    }\n\n    if ((strcmp(flash_info.items[PRODUCT_IDX], handle->device_info.u.d_info.productid) != 0)\n        || (strcmp(flash_info.items[NODEID_IDX], handle->device_info.u.d_info.nodeid) != 0))\n    {\n        ATINY_LOG(LOG_INFO, \"flash info for the nodeid and not use\");\n        flash_manager_destroy_flash_info(&flash_info);\n        return;\n    }\n\n    ATINY_LOG(LOG_DEBUG, \"mqtt read info deviceid %s,procid %s,nodid %s\",\n            flash_info.items[DEVICEID_IDX], flash_info.items[PRODUCT_IDX], flash_info.items[NODEID_IDX]);\n\n    handle->dynamic_info.save_info.deviceid = flash_info.items[DEVICEID_IDX];\n    flash_info.items[DEVICEID_IDX] = NULL;\n    handle->dynamic_info.got_password =  flash_info.items[PASSWORD_IDX];\n    flash_info.items[PASSWORD_IDX] = NULL;\n    handle->dynamic_info.has_device_id = true;\n    handle->dynamic_info.state = MQTT_CONNECT_WITH_DEVICE_ID;\n    flash_manager_destroy_flash_info(&flash_info);\n}\n\nint  atiny_mqtt_init(const mqtt_param_s *params, mqtt_client_s **phandle)\n{\n    cJSON_InitHooks(NULL);\n    if (params == NULL || phandle == NULL\n        || params->info.security_type != MQTT_SECURITY_TYPE_CA\n        || mqtt_check_param(params) != ATINY_OK)\n    {\n        ATINY_LOG(LOG_FATAL, \"Invalid args\");\n        return ATINY_ARG_INVALID;\n    }\n\n    if (g_mqtt_client.init_flag)\n    {\n        ATINY_LOG(LOG_FATAL, \"mqtt reinit\");\n        return ATINY_ERR;\n    }\n\n    memset(&g_mqtt_client, 0, sizeof(g_mqtt_client));\n\n    if (ATINY_OK != mqtt_dup_param(&(g_mqtt_client.params), params))\n    {\n        return ATINY_MALLOC_FAILED;\n    }\n\n    flash_manager_init(mqtt_cmd_ioctl);\n\n    *phandle = &g_mqtt_client;\n\n    g_mqtt_client.init_flag = true;\n\n    return ATINY_OK;\n}\n\nint atiny_mqtt_bind(const mqtt_device_info_s* device_info, mqtt_client_s* handle)\n{\n    Network n;\n    MQTTClient *client = NULL;\n    mqtt_param_s *params;\n    int rc;\n    int32_t conn_failed_cnt = 0;\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    Timer timer;\n    int result = ATINY_ERR;\n\n    if (NULL == handle)\n    {\n        ATINY_LOG(LOG_FATAL, \"handle null\");\n        return ATINY_ARG_INVALID;\n    }\n\n    if((device_info == NULL)\n        || (mqtt_check_device_info(device_info) != ATINY_OK))\n    {\n        ATINY_LOG(LOG_FATAL, \"parameter invalid\");\n        result = ATINY_ARG_INVALID;\n        goto  atiny_bind_quit;\n    }\n\n    dtls_init();\n\n    client = &(handle->client);\n    params = &(handle->params);\n\n    rc = mqtt_dup_device_info(&(handle->device_info), device_info);\n    if (rc != ATINY_OK)\n    {\n        goto  atiny_bind_quit;\n    }\n\n    mqtt_read_flash_info(handle);\n\n    NetworkInit(&n, mqtt_get_security_info);\n\n    memset(client, 0x0, sizeof(MQTTClient));\n    rc = MQTTClientInit(client, &n, MQTT_COMMAND_TIMEOUT_MS, g_mqtt_sendbuf, MQTT_SENDBUF_SIZE, g_mqtt_readbuf, MQTT_READBUF_SIZE);\n    if (rc != MQTT_SUCCESS)\n    {\n        ATINY_LOG(LOG_FATAL, \"MQTTClientInit fail,rc %d\", rc);\n        goto  atiny_bind_quit;\n    }\n\n    data.willFlag = 0;\n    data.MQTTVersion = MQTT_VERSION_3_1_1;\n    data.keepAliveInterval = MQTT_KEEPALIVE_INTERVAL_S;\n    data.cleansession = true;\n\n    while(true)\n    {\n        if(conn_failed_cnt > 0)\n        {\n            ATINY_LOG(LOG_INFO, \"reconnect delay : %d\", conn_failed_cnt);\n            (void)LOS_TaskDelay(MQTT_CONN_FAILED_BASE_DELAY << conn_failed_cnt);\n        }\n\n        rc = NetworkConnect(&n, params->server_ip, atoi(params->server_port));\n        if(rc != 0)\n        {\n            ATINY_LOG(LOG_ERR, \"NetworkConnect fail: %d\", rc);\n            mqtt_inc_fail_cnt(&conn_failed_cnt);\n            continue;\n        }\n\n        if(mqtt_get_connection_info(handle, &data) != ATINY_OK)\n        {\n            mqtt_destroy_data_connection_info(&data);\n            mqtt_proc_connect_err(client, &n, &conn_failed_cnt);\n            continue;\n        }\n\n        rc = MQTTConnect(client, &data);\n        mqtt_destroy_data_connection_info(&data);\n        ATINY_LOG(LOG_DEBUG, \"CONNACK : %d\", rc);\n        if(MQTT_SUCCESS != rc)\n        {\n            // receive connection nack value\n            if (rc != MQTT_SUCCESS)\n            {\n                mqtt_proc_connect_nack(handle);\n            }\n            ATINY_LOG(LOG_ERR, \"MQTTConnect failed %d\", rc);\n            mqtt_proc_connect_err(client, &n, &conn_failed_cnt);\n            continue;\n        }\n\n        if(ATINY_OK != mqtt_subscribe_topic(handle))\n        {\n            ATINY_LOG(LOG_ERR, \"mqtt_subscribe_topic failed\");\n            mqtt_proc_connect_err(client, &n, &conn_failed_cnt);\n            continue;\n        }\n\n        conn_failed_cnt = 0;\n        if (!mqtt_is_connectting_with_deviceid(handle))\n        {\n            TimerInit(&timer);\n            TimerCountdownMS(&timer, MQTT_WRITE_FOR_SECRET_TIMEOUT);\n        }\n        while (rc >= 0 && MQTTIsConnected(client))\n        {\n            rc = MQTTYield(client, MQTT_EVENTS_HANDLE_PERIOD_MS);\n\n            // receive secret info\n            if (handle->dynamic_info.connection_update_flag)\n            {\n                ATINY_LOG(LOG_INFO, \"recv secret info\");\n                ATINY_LOG(LOG_DEBUG, \"secret info deviceid %s\", handle->dynamic_info.save_info.deviceid);\n                handle->dynamic_info.connection_update_flag = false;\n                handle->dynamic_info.state = MQTT_CONNECT_WITH_DEVICE_ID;\n                break;\n            }\n\n            // wait secret info timeout.\n            if (!mqtt_is_connectting_with_deviceid(handle) && (TimerIsExpired(&timer)))\n            {\n                if (handle->dynamic_info.has_device_id)\n                {\n                    handle->dynamic_info.state = MQTT_CONNECT_WITH_DEVICE_ID;\n                }\n                break;\n            }\n        }\n\n        mqtt_disconnect(client, &n);\n    }\n\n    result = ATINY_OK;\natiny_bind_quit:\n    mqtt_free_dynamic_info(handle);\n    mqtt_free_params(&(handle->params));\n    (void)atiny_task_mutex_lock(&client->mutex);\n    mqtt_free_device_info(&(handle->device_info));\n    (void)atiny_task_mutex_unlock(&client->mutex);\n    MQTTClientDeInit(client);\n    handle->init_flag = false;\n    return result;\n}\n\nint atiny_mqtt_data_send(mqtt_client_s *phandle, const char *msg,  uint32_t msg_len, mqtt_qos_e qos)\n{\n    MQTTMessage message;\n    int rc;\n    char* topic;\n    size_t payloadlen;\n\n    if ((phandle == NULL) || (qos >= MQTT_QOS_MAX))\n    {\n        ATINY_LOG(LOG_FATAL, \"Parameter invalid\");\n        return ATINY_ARG_INVALID;\n    }\n    if (phandle->device_info.codec_mode == MQTT_CODEC_MODE_JSON)\n    {\n        if (msg == NULL || msg_len <= 0)\n        {\n            ATINY_LOG(LOG_FATAL, \"msg invalid\");\n            return ATINY_ARG_INVALID;\n        }\n        payloadlen = strnlen(msg, msg_len);\n    }\n    else\n    {\n        if (msg == NULL && msg_len > 0)\n        {\n            ATINY_LOG(LOG_FATAL, \"msg invalid\");\n            return ATINY_ARG_INVALID;\n        }\n        payloadlen = msg_len;\n    }\n\n    if (!atiny_mqtt_isconnected(phandle))\n    {\n        ATINY_LOG(LOG_FATAL, \"not connected\");\n        return ATINY_ERR;\n    }\n\n    topic = mqtt_get_device_topic(phandle, DATA_TOPIC_FMT, sizeof(DATA_TOPIC_FMT) - VARIABLE_SIZE);\n    if (topic == NULL)\n    {\n        return ATINY_MALLOC_FAILED;\n    }\n    memset(&message, 0, sizeof(message));\n    message.qos = (enum QoS)qos;\n    message.payload = (void *)msg;\n    message.payloadlen = payloadlen;\n    rc = MQTTPublish(&phandle->client, topic, &message);\n    atiny_free(topic);\n    if (rc != MQTT_SUCCESS)\n    {\n        ATINY_LOG(LOG_FATAL, \"MQTTPublish fail,rc %d\", rc);\n        return ATINY_ERR;\n    }\n    return ATINY_OK;\n}\n\nint atiny_mqtt_isconnected(mqtt_client_s* phandle)\n{\n    if (NULL == phandle)\n    {\n        ATINY_LOG(LOG_ERR, \"invalid args\");\n        return false;\n    }\n    return mqtt_is_connectting_with_deviceid(phandle) && MQTTIsConnected(&(phandle->client));\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/CONTRIBUTING.md",
    "content": "# Guide to contributing\n\nPlease read this if you intend to contribute to the project.\n\n## Legal stuff\n\nApologies in advance for the extra work required here - this is necessary to comply with the Eclipse Foundation's\nstrict IP policy.\n\nPlease also read [this](http://wiki.eclipse.org/Development_Resources/Contributing_via_Git)\n\nIn order for any contributions to be accepted you MUST do the following things.\n\n* Sign the [Eclipse Foundation Contributor License Agreement](http://www.eclipse.org/legal/CLA.php).\nTo sign the Eclipse CLA you need to:\n\n  * Obtain an Eclipse Foundation userid. Anyone who currently uses Eclipse Bugzilla or Gerrit systems already has one of those.\nIf you don’t, you need to [register](https://dev.eclipse.org/site_login/createaccount.php).\n\n  * Login into the [projects portal](https://projects.eclipse.org/), select “My Account”, and then the “Contributor License Agreement” tab.\n\n* Add your github username in your Eclipse Foundation account settings. Log in it to Eclipse and go to account settings.\n\n* \"Sign-off\" your commits\n\nEvery commit you make in your patch or pull request MUST be \"signed off\".\n\nYou do this by adding the `-s` flag when you make the commit(s), e.g.\n\n    git commit -s -m \"Shave the yak some more\"\n\n## Making your changes\n\n* Fork the repository on GitHub\n* Create a new branch for your changes\n* Make your changes\n* Make sure you include tests\n* Make sure the test suite passes after your changes\n* Commit your changes into that branch\n* Use descriptive and meaningful commit messages\n* If you have a lot of commits squash them into a single commit\n* Make sure you use the `-s` flag when committing as explained above.\n* Push your changes to your branch in your forked repository\n\n## Submitting the changes\n\nSubmit a pull request via the normal GitHub UI.\n\n## After submitting\n\n* Do not use your branch for any other development, otherwise further changes that you make will be visible in the PR.\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/EDL-v1.0",
    "content": "*Eclipse Distribution License - v 1.0*\n\nCopyright (c) 2007, Eclipse Foundation, Inc. and its licensors.\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n  * Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n  * Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in the\n    documentation and/or other materials provided with the distribution.\n  * Neither the name of the Eclipse Foundation, Inc. nor the names of\n    its contributors may be used to endorse or promote products derived\n    from this software without specific prior written permission. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/EPL-v1.0",
    "content": "\n    Eclipse Public License - v 1.0\n\nTHE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\nPUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION OF\nTHE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\n*1. DEFINITIONS*\n\n\"Contribution\" means:\n\na) in the case of the initial Contributor, the initial code and\ndocumentation distributed under this Agreement, and\n\nb) in the case of each subsequent Contributor:\n\ni) changes to the Program, and\n\nii) additions to the Program;\n\nwhere such changes and/or additions to the Program originate from and\nare distributed by that particular Contributor. A Contribution\n'originates' from a Contributor if it was added to the Program by such\nContributor itself or anyone acting on such Contributor's behalf.\nContributions do not include additions to the Program which: (i) are\nseparate modules of software distributed in conjunction with the Program\nunder their own license agreement, and (ii) are not derivative works of\nthe Program.\n\n\"Contributor\" means any person or entity that distributes the Program.\n\n\"Licensed Patents\" mean patent claims licensable by a Contributor which\nare necessarily infringed by the use or sale of its Contribution alone\nor when combined with the Program.\n\n\"Program\" means the Contributions distributed in accordance with this\nAgreement.\n\n\"Recipient\" means anyone who receives the Program under this Agreement,\nincluding all Contributors.\n\n*2. GRANT OF RIGHTS*\n\na) Subject to the terms of this Agreement, each Contributor hereby\ngrants Recipient a non-exclusive, worldwide, royalty-free copyright\nlicense to reproduce, prepare derivative works of, publicly display,\npublicly perform, distribute and sublicense the Contribution of such\nContributor, if any, and such derivative works, in source code and\nobject code form.\n\nb) Subject to the terms of this Agreement, each Contributor hereby\ngrants Recipient a non-exclusive, worldwide, royalty-free patent license\nunder Licensed Patents to make, use, sell, offer to sell, import and\notherwise transfer the Contribution of such Contributor, if any, in\nsource code and object code form. This patent license shall apply to the\ncombination of the Contribution and the Program if, at the time the\nContribution is added by the Contributor, such addition of the\nContribution causes such combination to be covered by the Licensed\nPatents. The patent license shall not apply to any other combinations\nwhich include the Contribution. No hardware per se is licensed hereunder.\n\nc) Recipient understands that although each Contributor grants the\nlicenses to its Contributions set forth herein, no assurances are\nprovided by any Contributor that the Program does not infringe the\npatent or other intellectual property rights of any other entity. Each\nContributor disclaims any liability to Recipient for claims brought by\nany other entity based on infringement of intellectual property rights\nor otherwise. As a condition to exercising the rights and licenses\ngranted hereunder, each Recipient hereby assumes sole responsibility to\nsecure any other intellectual property rights needed, if any. For\nexample, if a third party patent license is required to allow Recipient\nto distribute the Program, it is Recipient's responsibility to acquire\nthat license before distributing the Program.\n\nd) Each Contributor represents that to its knowledge it has sufficient\ncopyright rights in its Contribution, if any, to grant the copyright\nlicense set forth in this Agreement.\n\n*3. REQUIREMENTS*\n\nA Contributor may choose to distribute the Program in object code form\nunder its own license agreement, provided that:\n\na) it complies with the terms and conditions of this Agreement; and\n\nb) its license agreement:\n\ni) effectively disclaims on behalf of all Contributors all warranties\nand conditions, express and implied, including warranties or conditions\nof title and non-infringement, and implied warranties or conditions of\nmerchantability and fitness for a particular purpose;\n\nii) effectively excludes on behalf of all Contributors all liability for\ndamages, including direct, indirect, special, incidental and\nconsequential damages, such as lost profits;\n\niii) states that any provisions which differ from this Agreement are\noffered by that Contributor alone and not by any other party; and\n\niv) states that source code for the Program is available from such\nContributor, and informs licensees how to obtain it in a reasonable\nmanner on or through a medium customarily used for software exchange.\n\nWhen the Program is made available in source code form:\n\na) it must be made available under this Agreement; and\n\nb) a copy of this Agreement must be included with each copy of the Program.\n\nContributors may not remove or alter any copyright notices contained\nwithin the Program.\n\nEach Contributor must identify itself as the originator of its\nContribution, if any, in a manner that reasonably allows subsequent\nRecipients to identify the originator of the Contribution.\n\n*4. COMMERCIAL DISTRIBUTION*\n\nCommercial distributors of software may accept certain responsibilities\nwith respect to end users, business partners and the like. While this\nlicense is intended to facilitate the commercial use of the Program, the\nContributor who includes the Program in a commercial product offering\nshould do so in a manner which does not create potential liability for\nother Contributors. Therefore, if a Contributor includes the Program in\na commercial product offering, such Contributor (\"Commercial\nContributor\") hereby agrees to defend and indemnify every other\nContributor (\"Indemnified Contributor\") against any losses, damages and\ncosts (collectively \"Losses\") arising from claims, lawsuits and other\nlegal actions brought by a third party against the Indemnified\nContributor to the extent caused by the acts or omissions of such\nCommercial Contributor in connection with its distribution of the\nProgram in a commercial product offering. The obligations in this\nsection do not apply to any claims or Losses relating to any actual or\nalleged intellectual property infringement. In order to qualify, an\nIndemnified Contributor must: a) promptly notify the Commercial\nContributor in writing of such claim, and b) allow the Commercial\nContributor to control, and cooperate with the Commercial Contributor\nin, the defense and any related settlement negotiations. The Indemnified\nContributor may participate in any such claim at its own expense.\n\nFor example, a Contributor might include the Program in a commercial\nproduct offering, Product X. That Contributor is then a Commercial\nContributor. If that Commercial Contributor then makes performance\nclaims, or offers warranties related to Product X, those performance\nclaims and warranties are such Commercial Contributor's responsibility\nalone. Under this section, the Commercial Contributor would have to\ndefend claims against the other Contributors related to those\nperformance claims and warranties, and if a court requires any other\nContributor to pay any damages as a result, the Commercial Contributor\nmust pay those damages.\n\n*5. NO WARRANTY*\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED\nON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\nEITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\nOR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR\nA PARTICULAR PURPOSE. Each Recipient is solely responsible for\ndetermining the appropriateness of using and distributing the Program\nand assumes all risks associated with its exercise of rights under this\nAgreement , including but not limited to the risks and costs of program\nerrors, compliance with applicable laws, damage to or loss of data,\nprograms or equipment, and unavailability or interruption of operations.\n\n*6. DISCLAIMER OF LIABILITY*\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR\nANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING\nWITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR\nDISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED\nHEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n*7. GENERAL*\n\nIf any provision of this Agreement is invalid or unenforceable under\napplicable law, it shall not affect the validity or enforceability of\nthe remainder of the terms of this Agreement, and without further action\nby the parties hereto, such provision shall be reformed to the minimum\nextent necessary to make such provision valid and enforceable.\n\nIf Recipient institutes patent litigation against any entity (including\na cross-claim or counterclaim in a lawsuit) alleging that the Program\nitself (excluding combinations of the Program with other software or\nhardware) infringes such Recipient's patent(s), then such Recipient's\nrights granted under Section 2(b) shall terminate as of the date such\nlitigation is filed.\n\nAll Recipient's rights under this Agreement shall terminate if it fails\nto comply with any of the material terms or conditions of this Agreement\nand does not cure such failure in a reasonable period of time after\nbecoming aware of such noncompliance. If all Recipient's rights under\nthis Agreement terminate, Recipient agrees to cease use and distribution\nof the Program as soon as reasonably practicable. However, Recipient's\nobligations under this Agreement and any licenses granted by Recipient\nrelating to the Program shall continue and survive.\n\nEveryone is permitted to copy and distribute copies of this Agreement,\nbut in order to avoid inconsistency the Agreement is copyrighted and may\nonly be modified in the following manner. The Agreement Steward reserves\nthe right to publish new versions (including revisions) of this\nAgreement from time to time. No one other than the Agreement Steward has\nthe right to modify this Agreement. The Eclipse Foundation is the\ninitial Agreement Steward. The Eclipse Foundation may assign the\nresponsibility to serve as the Agreement Steward to a suitable separate\nentity. Each new version of the Agreement will be given a distinguishing\nversion number. The Program (including Contributions) may always be\ndistributed subject to the version of the Agreement under which it was\nreceived. In addition, after a new version of the Agreement is\npublished, Contributor may elect to distribute the Program (including\nits Contributions) under the new version. Except as expressly stated in\nSections 2(a) and 2(b) above, Recipient receives no rights or licenses\nto the intellectual property of any Contributor under this Agreement,\nwhether expressly, by implication, estoppel or otherwise. All rights in\nthe Program not expressly granted under this Agreement are reserved.\n\nThis Agreement is governed by the laws of the State of New York and the\nintellectual property laws of the United States of America. No party to\nthis Agreement will bring a legal action under this Agreement more than\none year after the cause of action arose. Each party waives its rights\nto a jury trial in any resulting litigation.\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/README.md",
    "content": "Wakaama (formerly liblwm2m) is an implementation of the Open Mobile Alliance's LightWeight M2M\nprotocol (LWM2M).\n\nDevelopers mailing list: https://dev.eclipse.org/mailman/listinfo/wakaama-dev\n\n## Source Layout\n\n    -+- core                   (the LWM2M engine)\n     |    |\n     |    +- er-coap-13        (Slightly modified Erbium's CoAP engine from\n     |                          http://people.inf.ethz.ch/mkovatsc/erbium.php\n     |\n     +- tests                  (test cases)\n     |\n     +- examples\n          |\n          +- bootstrap_server  (a command-line LWM2M bootstrap server)\n          |\n          +- client            (a command-line LWM2M client with several test objects)\n          |\n          +- lightclient       (a very simple command-line LWM2M client with several test objects)\n          |\n          +- server            (a command-line LWM2M server)\n          |\n          +- shared            (utility functions for connection handling and command-\n                                line interface)\n\n\n## Compiling\n\nWakaama is not a library but files to be built with an application.\nWakaama uses CMake >= 3. Look at examples/server/CMakeLists.txt for an\nexample of how to include it.\nSeveral compilation switches are used:\n - LWM2M_BIG_ENDIAN if your target platform uses big-endian format.\n - LWM2M_LITTLE_ENDIAN if your target platform uses little-endian format.\n - LWM2M_CLIENT_MODE to enable LWM2M Client interfaces.\n - LWM2M_SERVER_MODE to enable LWM2M Server interfaces.\n - LWM2M_BOOTSTRAP_SERVER_MODE to enable LWM2M Bootstrap Server interfaces.\n - LWM2M_BOOTSTRAP to enable LWM2M Bootstrap support in a LWM2M Client.\n - LWM2M_SUPPORT_JSON to enable JSON payload support (implicit when defining LWM2M_SERVER_MODE)\n - LWM2M_OLD_CONTENT_FORMAT_SUPPORT to support the deprecated content format values for TLV and JSON.\n\nDepending on your platform, you need to define LWM2M_BIG_ENDIAN or LWM2M_LITTLE_ENDIAN.\nLWM2M_CLIENT_MODE and LWM2M_SERVER_MODE can be defined at the same time.\n\n\n## Examples\n\nThere are some example applications provided to test the server, client and bootstrap capabilities of Wakaama.\nThe following recipes assume you are on a unix like platform and you have cmake and make installed.\n\n### Server example\n * Create a build directory and change to that.\n * ``cmake [wakaama directory]/examples/server``\n * ``make``\n * ``./lwm2mserver [Options]``\n\nThe lwm2mserver listens on UDP port 5683. It features a basic command line\ninterface. Type 'help' for a list of supported commands.\n\nOptions are:\n - -4\t\tUse IPv4 connection. Default: IPv6 connection\n\n### Test client example\n * Create a build directory and change to that.\n * ``cmake [wakaama directory]/examples/client``\n * ``make``\n * ``./lwm2mclient [Options]``\n\nDTLS feature requires the tinydtls submodule. To include it, on the first run,\nuse the following commands to retrieve the sources:\n * ``git submodule init``\n * ``git submodule update``\n\nYou need to install autoconf and automake to build with tinydtls.\n\nBuild with tinydtls:\n * Create a build directory and change to that.\n * ``cmake -DDTLS=1 [wakaama directory]/examples/client``\n * ``make``\n * ``./lwm2mclient [Options]``\n\nThe lwm2mclient features nine LWM2M objects:\n - Security Object (id: 0)\n - Server Object (id: 1)\n - Access Control Object (id: 2) as a skeleton\n - Device Object (id: 3) containing hard-coded values from the Example LWM2M\n Client of Appendix E of the LWM2M Technical Specification.\n - Connectivity Monitoring Object (id: 4) as a skeleton\n - Firmware Update Object (id: 5) as a skeleton.\n - Location Object (id: 6) as a skeleton.\n - Connectivity Statistics Object (id: 7) as a skeleton.\n - Test Object (id: 31024) with the following description:\n\n                           Multiple\n          Object |  ID   | Instances | Mandatory |\n           Test  | 31024 |    Yes    |    No     |\n\n           Resources:\n                       Supported    Multiple\n           Name | ID | Operations | Instances | Mandatory |  Type   | Range |\n           test |  1 |    R/W     |    No     |    Yes    | Integer | 0-255 |\n           exec |  2 |     E      |    No     |    Yes    |         |       |\n           dec  |  3 |    R/W     |    No     |    Yes    |  Float  |       |\n\nThe lwm2mclient opens udp port 56830 and tries to register to a LWM2M Server at\n127.0.0.1:5683. It features a basic command line interface. Type 'help' for a\nlist of supported commands.\n\nOptions are:\n- -n NAME\tSet the endpoint name of the Client. Default: testlwm2mclient\n- -l PORT\tSet the local UDP port of the Client. Default: 56830\n- -h HOST\tSet the hostname of the LWM2M Server to connect to. Default: localhost\n- -p HOST\tSet the port of the LWM2M Server to connect to. Default: 5683\n- -4\t\tUse IPv4 connection. Default: IPv6 connection\n- -t TIME\tSet the lifetime of the Client. Default: 300\n- -b\t\tBootstrap requested.\n- -c\t\tChange battery level over time.\n  \nIf DTLS feature enable:\n- -i Set the device management or bootstrap server PSK identity. If not set use none secure mode\n- -s Set the device management or bootstrap server Pre-Shared-Key. If not set use none secure mode\n\nTo launch a bootstrap session:\n``./lwm2mclient -b``\n\n### Simpler test client example\n\nIn the any directory, run the following commands:\n * Create a build directory and change to that.\n * ``cmake [wakaama directory]/examples/lightclient``\n * ``make``\n * ``./lightclient [Options]``\n\nThe lightclient is much simpler that the lwm2mclient and features only four\nLWM2M objects:\n - Security Object (id: 0)\n - Server Object (id: 1)\n - Device Object (id: 3) containing hard-coded values from the Example LWM2M\n Client of Appendix E of the LWM2M Technical Specification.\n - Test Object (id: 31024) from the lwm2mclient as described above.\n\nThe lightclient does not feature any command-line interface.\n\nOptions are:\n -  -n NAME\tSet the endpoint name of the Client. Default: testlightclient\n - -l PORT\tSet the local UDP port of the Client. Default: 56830\n - -4\t\tUse IPv4 connection. Default: IPv6 connection\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/TODO",
    "content": "LWM2M Features\n--------------\n\n - Access Control List\n \n - JSON support\n  \n - Add token in every message\n \n - Handle Observe parameters\n \n - Keep-alive mechanism\n \n - Support for Object Link datatype\n \n - Discover method support\n \n \n Bugfixes\n --------\n \n \n Implementation Improvements\n ---------------------------\n \n  - Store lwm2m_transaction_t per peer\n  \n  - bufferize all CoaP messages until all callbacks returned\n  Currently if a server sends a request from its monitoring callback upon client\n  registration, the client will receive the request before the ACK to its register\n  and it will discard it.\n  \n  - Easy access to the lwm2m_context_t from objects callbacks\n  \n  - Use an unified result callback\n  Add some parameter so that the same user callback can be used for all DM operations.\n   \n  - Use lwm2m-*-t types in er-coap-13\n  To avoid multiple conversions.\n  \n  - Switch to void* parameters in lwm2m_list_* APIs\n  \n  - Utility functions to easily implements objects\n  The utility will just use read and write individual resources. Either statically or\n  through callbacks. See [https://github.com/01org/libdmclient]/tests/mgtobj/utils/static_mo_util.h\n  \n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/about.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"\n    \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\"/>\n<title>About</title>\n</head>\n<body lang=\"EN-US\">\n<h2>About This Content</h2>\n \n<p>April 24, 2014</p>\t\n<h3>License</h3>\n\n<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise \nindicated below, the Content is provided to you under the terms and conditions of the\nEclipse Public License Version 1.0 (&quot;EPL&quot;) and the Eclipse Distribution License Version 1.0 (&quot;EDL&quot;).\nA copy of the EPL is available at\n<a href=\"http://www.eclipse.org/legal/epl-v10.html\">http://www.eclipse.org/legal/epl-v10.html</a>.\nA copy of the EDL is available at\n<a href=\"http://www.eclipse.org/org/documents/edl-v10.php\">http://www.eclipse.org/org/documents/edl-v10.php</a>.\nFor purposes of the EPL, &quot;Program&quot; will mean the Content.</p>\n\n<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is \nbeing redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may\napply to your use of any object code in the Content.  Check the Redistributor's license that was \nprovided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise\nindicated below, the terms and conditions of the EPL still apply to any source code in the Content\nand such source code may be obtained at <a href=\"http://www.eclipse.org/\">http://www.eclipse.org</a>.</p>\n\n\t\t\n\t\t<h3>Third Party Content</h3>\n\t\t<p>The Content includes items that have been sourced from third parties as set out below. If you \n\t\tdid not receive this Content directly from the Eclipse Foundation, the following is provided \n\t\tfor informational purposes only, and you should look to the Redistributor's license for \n\t\tterms and conditions of use.</p>\n\t\t<p>\n\t\t<strong>er-coap-13</strong> <br/><br/>\n\t\tErbium's CoAP engine from\n\t\t<a href=\"http://people.inf.ethz.ch/mkovatsc/erbium.php\">http://people.inf.ethz.ch/mkovatsc/erbium.php</a>\n\t\tYour use of er-coap-13 is subject to the terms and conditions of the BSD license contained in the file LICENSE\n\t\tin core/er-coap-13\n\t\t</p>\n\n\n</body>\n</html>\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/block1.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2016 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Simon Bernard - initial API and implementation\n *\n *******************************************************************************/\n/*\n Copyright (c) 2016 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n*/\n#include \"internals.h\"\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n\n// the maximum payload transferred by block1 we accumulate per server\n#define MAX_BLOCK1_SIZE 4096\n\nuint8_t coap_block1_handler(lwm2m_block1_data_t **pBlock1Data,\n                            uint16_t mid,\n                            uint8_t *buffer,\n                            size_t length,\n                            uint16_t blockSize,\n                            uint32_t blockNum,\n                            bool blockMore,\n                            uint8_t **outputBuffer,\n                            size_t *outputLength)\n{\n    lwm2m_block1_data_t *block1Data = *pBlock1Data;;\n\n    // manage new block1 transfer\n    if (blockNum == 0)\n    {\n        // we already have block1 data for this server, clear it\n        if (block1Data != NULL)\n        {\n            lwm2m_free(block1Data->block1buffer);\n        }\n        else\n        {\n            block1Data = lwm2m_malloc(sizeof(lwm2m_block1_data_t));\n            *pBlock1Data = block1Data;\n            if (NULL == block1Data) return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n\n        block1Data->block1buffer = lwm2m_malloc(length);\n        block1Data->block1bufferSize = length;\n        if (NULL == block1Data->block1buffer) return COAP_500_INTERNAL_SERVER_ERROR;\n\n        // write new block in buffer\n        memcpy(block1Data->block1buffer, buffer, length);\n        block1Data->lastmid = mid;\n    }\n    // manage already started block1 transfer\n    else\n    {\n        if (block1Data == NULL)\n        {\n            // we never receive the first block\n            // TODO should we clean block1 data for this server ?\n            return COAP_408_REQ_ENTITY_INCOMPLETE;\n        }\n\n        // If this is a retransmission, we already did that.\n        if (block1Data->lastmid != mid)\n        {\n            uint8_t *oldBuffer = block1Data->block1buffer;\n            size_t oldSize = block1Data->block1bufferSize;\n\n            if (block1Data->block1bufferSize != blockSize * blockNum)\n            {\n                // we don't receive block in right order\n                // TODO should we clean block1 data for this server ?\n                return COAP_408_REQ_ENTITY_INCOMPLETE;\n            }\n\n            // is it too large?\n            if (block1Data->block1bufferSize + length >= MAX_BLOCK1_SIZE)\n            {\n                return COAP_413_ENTITY_TOO_LARGE;\n            }\n            // re-alloc new buffer\n            block1Data->block1bufferSize = oldSize + length;\n            block1Data->block1buffer = lwm2m_malloc(block1Data->block1bufferSize);\n            if (NULL == block1Data->block1buffer) return COAP_500_INTERNAL_SERVER_ERROR;\n            memcpy(block1Data->block1buffer, oldBuffer, oldSize);\n            lwm2m_free(oldBuffer);\n\n            // write new block in buffer\n            memcpy(block1Data->block1buffer + oldSize, buffer, length);\n            block1Data->lastmid = mid;\n        }\n    }\n\n    if (blockMore)\n    {\n        *outputLength = (size_t) - 1;\n        return COAP_231_CONTINUE;\n    }\n    else\n    {\n        // buffer is full, set output parameter\n        // we don't free it to be able to send retransmission\n        *outputLength = block1Data->block1bufferSize;\n        *outputBuffer = block1Data->block1buffer;\n\n        return NO_ERROR;\n    }\n}\n\nvoid free_block1_buffer(lwm2m_block1_data_t *block1Data)\n{\n    if (block1Data != NULL)\n    {\n        // free block1 buffer\n        lwm2m_free(block1Data->block1buffer);\n        block1Data->block1bufferSize = 0 ;\n\n        // free current element\n        lwm2m_free(block1Data);\n    }\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/bootstrap.c",
    "content": "/*******************************************************************************\n *\n * Copyright (c) 2015 Sierra Wireless and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Pascal Rieux - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    David Navarro, Intel Corporation - Please refer to git log\n *\n *******************************************************************************/\n\n#include \"internals.h\"\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n\n#ifdef LWM2M_CLIENT_MODE\n#ifdef LWM2M_BOOTSTRAP\n\n#define PRV_QUERY_BUFFER_LENGTH 200\n\n\nstatic void prv_handleResponse(lwm2m_server_t *bootstrapServer,\n                               coap_packet_t *message)\n{\n    if (COAP_204_CHANGED == message->code)\n    {\n        LOG(\"Received ACK/2.04, Bootstrap pending, waiting for DEL/PUT from BS server...\");\n        bootstrapServer->status = STATE_BS_PENDING;\n        bootstrapServer->registration = lwm2m_gettime() + COAP_EXCHANGE_LIFETIME;\n    }\n    else\n    {\n        bootstrapServer->status = STATE_BS_FAILING;\n    }\n}\n\nstatic void prv_handleBootstrapReply(lwm2m_transaction_t *transaction,\n                                     void *message)\n{\n    lwm2m_server_t *bootstrapServer = (lwm2m_server_t *)transaction->userData;\n    coap_packet_t *coapMessage = (coap_packet_t *)message;\n\n    LOG(\"Entering\");\n\n    if (bootstrapServer->status == STATE_BS_INITIATED)\n    {\n        if (NULL != coapMessage && COAP_TYPE_RST != coapMessage->type)\n        {\n            prv_handleResponse(bootstrapServer, coapMessage);\n        }\n        else\n        {\n            bootstrapServer->status = STATE_BS_FAILING;\n        }\n    }\n}\n\n// start a device initiated bootstrap\nstatic void prv_requestBootstrap(lwm2m_context_t *context,\n                                 lwm2m_server_t *bootstrapServer)\n{\n    char query[PRV_QUERY_BUFFER_LENGTH];\n    int query_length = 0;\n    int res;\n\n    LOG(\"Entering\");\n\n    query_length = utils_stringCopy(query, PRV_QUERY_BUFFER_LENGTH, QUERY_STARTER QUERY_NAME);\n    if (query_length < 0)\n    {\n        bootstrapServer->status = STATE_BS_FAILING;\n        return;\n    }\n    res = utils_stringCopy(query + query_length, PRV_QUERY_BUFFER_LENGTH - query_length, context->endpointName);\n    if (res < 0)\n    {\n        bootstrapServer->status = STATE_BS_FAILING;\n        return;\n    }\n    query_length += res;\n\n    if (bootstrapServer->sessionH == NULL)\n    {\n        bootstrapServer->sessionH = lwm2m_connect_server(bootstrapServer->secObjInstID, context->userData, false);\n    }\n\n    if (bootstrapServer->sessionH != NULL)\n    {\n        lwm2m_transaction_t *transaction = NULL;\n\n        LOG(\"Bootstrap server connection opened\");\n\n        transaction = transaction_new(bootstrapServer->sessionH, COAP_POST, NULL, NULL, context->nextMID++, 4, NULL);\n        if (transaction == NULL)\n        {\n            bootstrapServer->status = STATE_BS_FAILING;\n            return;\n        }\n\n        coap_set_header_uri_path(transaction->message, \"/\"URI_BOOTSTRAP_SEGMENT);\n        coap_set_header_uri_query(transaction->message, query);\n        transaction->callback = prv_handleBootstrapReply;\n        transaction->userData = (void *)bootstrapServer;\n        context->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(context->transactionList, transaction);\n        if (transaction_send(context, transaction) == 0)\n        {\n            LOG(\"CI bootstrap requested to BS server\");\n            bootstrapServer->status = STATE_BS_INITIATED;\n        }\n    }\n    else\n    {\n        LOG(\"Connecting bootstrap server failed\");\n        bootstrapServer->status = STATE_BS_FAILED;\n    }\n}\n\n\nstatic void prv_resetBootstrapServer(lwm2m_server_t *serverP, void *userData)\n{\n     if (serverP->sessionH != NULL)\n     {\n         lwm2m_close_connection(serverP->sessionH, userData);\n         serverP->sessionH = NULL;\n     }\n     free_block1_buffer(serverP->block1Data);\n     serverP->block1Data = NULL;\n}\n\n\nstatic void prv_createBsConnection(lwm2m_context_t *contextP, lwm2m_server_t *targetP)\n{\n\n    prv_resetBootstrapServer(targetP, contextP->userData);\n\n    if (lwm2m_isBsCtrlInServerInitiatedBs(contextP))\n    {\n        if (targetP != NULL)\n        {\n            targetP->sessionH = lwm2m_connect_server(targetP->secObjInstID, contextP->userData, true);\n        }\n        return;\n    }\n\n    targetP->sessionH = lwm2m_connect_server(targetP->secObjInstID, contextP->userData, false);\n}\n\n\n\n/*\n * modify info:\n * modify date:     2019-06-04\n * modify place:    STATE_BS_HOLD_OFF, STATE_BS_PENDING\n * pay attention:\n *                  the targetP->status are important, change one, should take care of other status.\n *\n */\nvoid bootstrap_step(lwm2m_context_t *contextP,\n                    uint32_t currentTime,\n                    time_t *timeoutP)\n{\n    lwm2m_server_t *targetP;\n\n    LOG(\"entering\");\n    targetP = contextP->bootstrapServerList;\n    while (targetP != NULL)\n    {\n        time_t timeOut;\n\n        LOG_ARG(\"Initial status: %s\", STR_STATUS(targetP->status));\n        switch (targetP->status)\n        {\n        case STATE_DEREGISTERED:\n            //pay attention: targetP->lifetime come from securityobj instance, it's init value is 10. too small, too short for\n            //STATE_BS_HOLD_OFF. of course, the value could be wrote by the bs server. encode decode used for securityobj/serverobj instance\n\n            targetP->registration =  currentTime;\n            if(lwm2m_isBsCtrlInServerInitiatedBs(contextP))\n            {\n                targetP->registration = (currentTime + targetP->lifetime);\n            }\n            prv_createBsConnection(contextP, targetP);\n            currentTime = lwm2m_gettime();\n            targetP->status = STATE_BS_HOLD_OFF;\n\n            timeOut = (targetP->registration - currentTime);\n            if (timeOut < 0)\n            {\n                timeOut = 0;\n            }\n            if (*timeoutP > timeOut)\n            {\n                *timeoutP = timeOut;\n            }\n            break;\n\n        case STATE_BS_HOLD_OFF:\n            if (targetP->registration <= currentTime)\n            {\n                if (lwm2m_isBsCtrlInServerInitiatedBs(contextP))\n                {\n                    lwm2m_stop_striger_server_initiated_bs(targetP->sessionH);\n                    targetP->status = STATE_REG_FAILED;\n                }\n                else\n                {\n                    prv_requestBootstrap(contextP, targetP);\n                }\n            }\n            else if (*timeoutP > targetP->registration - currentTime)\n            {\n                *timeoutP = targetP->registration - currentTime;\n                 lwm2m_step_striger_server_initiated_bs(targetP->sessionH);\n            }\n            break;\n\n\n        case STATE_BS_INITIATED:\n            // waiting\n            break;\n\n        case STATE_BS_PENDING:\n            if (targetP->registration <= currentTime)\n            {\n               targetP->status = STATE_BS_FAILING;\n               *timeoutP = 0;\n            }\n            else if (*timeoutP > targetP->registration - currentTime)\n            {\n                *timeoutP = targetP->registration - currentTime;\n            }\n            break;\n\n        case STATE_BS_FINISHING:\n            if (targetP->sessionH != NULL)\n            {\n                lwm2m_close_connection(targetP->sessionH, contextP->userData);\n                targetP->sessionH = NULL;\n            }\n            targetP->status = STATE_BS_FINISHED;\n            *timeoutP = 0;\n            break;\n\n        case STATE_BS_FAILING:\n            if (targetP->sessionH != NULL)\n            {\n                lwm2m_close_connection(targetP->sessionH, contextP->userData);\n                targetP->sessionH = NULL;\n            }\n            targetP->status = STATE_BS_FAILED;\n            *timeoutP = 0;\n            break;\n\n        default:\n            break;\n        }\n        LOG_ARG(\"Finalal status: %s\", STR_STATUS(targetP->status));\n\n        if (lwm2m_isBsCtrlInServerInitiatedBs(contextP))\n        {\n            return;\n        }\n        targetP = targetP->next;\n    }\n\n\n}\n\nuint8_t bootstrap_handleFinish(lwm2m_context_t *context,\n                               void *fromSessionH)\n{\n    lwm2m_server_t *bootstrapServer;\n\n    LOG(\"Entering\");\n    bootstrapServer = utils_findBootstrapServer(context, fromSessionH);\n    if (bootstrapServer != NULL\n            && bootstrapServer->status == STATE_BS_PENDING)\n    {\n        if (object_getServers(context, true) == 0)\n        {\n            LOG(\"Bootstrap server status changed to STATE_BS_FINISHING\");\n            bootstrapServer->status = STATE_BS_FINISHING;\n            return COAP_204_CHANGED;\n        }\n        else\n        {\n            return COAP_406_NOT_ACCEPTABLE;\n        }\n    }\n\n    return COAP_IGNORE;\n}\nbool bootstrap_isBsServerIpValid(const lwm2m_context_t *contextP)\n{\n    lwm2m_server_t *targetP;\n\n    targetP = contextP->bootstrapServerList;\n    while (targetP != NULL)\n    {\n        if(lwm2m_is_sec_obj_uri_valid(targetP->secObjInstID, contextP->userData))\n        {\n            return true;\n        }\n        targetP = targetP->next;\n    }\n\n    return false;\n}\n\n\n/*\n * Reset the bootstrap servers statuses\n *\n * TODO: handle LWM2M Servers the client is registered to ?\n *\n */\nvoid bootstrap_start(lwm2m_context_t *contextP)\n{\n    lwm2m_server_t *targetP;\n\n    LOG(\"Entering\");\n    targetP = contextP->bootstrapServerList;\n    while (targetP != NULL)\n    {\n        targetP->status = STATE_DEREGISTERED;\n        targetP = targetP->next;\n    }\n}\n\n/*\n * Returns STATE_BS_PENDING if at least one bootstrap is still pending\n * Returns STATE_BS_FINISHED if at least one bootstrap succeeded and no bootstrap is pending\n * Returns STATE_BS_FAILED if all bootstrap failed.\n */\nlwm2m_status_t bootstrap_getStatus(lwm2m_context_t *contextP)\n{\n    lwm2m_server_t *targetP;\n    lwm2m_status_t bs_status;\n\n    LOG(\"Entering\");\n    targetP = contextP->bootstrapServerList;\n    bs_status = STATE_BS_FAILED;\n\n    while (targetP != NULL)\n    {\n        switch (targetP->status)\n        {\n        case STATE_BS_FINISHED:\n            if (bs_status == STATE_BS_FAILED)\n            {\n                bs_status = STATE_BS_FINISHED;\n            }\n            break;\n\n        case STATE_BS_HOLD_OFF:\n        case STATE_BS_INITIATED:\n        case STATE_BS_PENDING:\n        case STATE_BS_FINISHING:\n        case STATE_BS_FAILING:\n            bs_status = STATE_BS_PENDING;\n            break;\n\n        default:\n            break;\n        }\n        targetP = targetP->next;\n    }\n\n    LOG_ARG(\"Returned status: %s\", STR_STATUS(bs_status));\n\n    return bs_status;\n}\n\nstatic uint8_t prv_checkServerStatus(lwm2m_server_t *serverP)\n{\n    LOG_ARG(\"Initial status: %s\", STR_STATUS(serverP->status));\n\n    switch (serverP->status)\n    {\n    case STATE_BS_HOLD_OFF:\n        serverP->status = STATE_BS_PENDING;\n        LOG_ARG(\"Status changed to: %s\", STR_STATUS(serverP->status));\n        break;\n\n    case STATE_BS_INITIATED:\n        // The ACK was probably lost\n        serverP->status = STATE_BS_PENDING;\n        LOG_ARG(\"Status changed to: %s\", STR_STATUS(serverP->status));\n        break;\n\n    case STATE_DEREGISTERED:\n    // server initiated bootstrap\n    case STATE_BS_PENDING:\n        serverP->registration = lwm2m_gettime() + COAP_EXCHANGE_LIFETIME;\n        break;\n\n    case STATE_BS_FINISHED:\n    case STATE_BS_FINISHING:\n    case STATE_BS_FAILING:\n    case STATE_BS_FAILED:\n    default:\n        LOG(\"Returning COAP_IGNORE\");\n        return COAP_IGNORE;\n    }\n\n    return COAP_NO_ERROR;\n}\n\nstatic void prv_tagServer(lwm2m_context_t *contextP,\n                          uint16_t id)\n{\n    lwm2m_server_t *targetP;\n\n    targetP = (lwm2m_server_t *)LWM2M_LIST_FIND(contextP->bootstrapServerList, id);\n    if (targetP == NULL)\n    {\n        targetP = (lwm2m_server_t *)LWM2M_LIST_FIND(contextP->serverList, id);\n    }\n    if (targetP != NULL)\n    {\n        targetP->dirty = true;\n    }\n}\n\nstatic void prv_tagAllServer(lwm2m_context_t *contextP,\n                             lwm2m_server_t *serverP)\n{\n    lwm2m_server_t *targetP;\n\n    targetP = contextP->bootstrapServerList;\n    while (targetP != NULL)\n    {\n        if (targetP != serverP)\n        {\n            targetP->dirty = true;\n        }\n        targetP = targetP->next;\n    }\n    targetP = contextP->serverList;\n    while (targetP != NULL)\n    {\n        targetP->dirty = true;\n        targetP = targetP->next;\n    }\n}\n\nuint8_t bootstrap_handleCommand(lwm2m_context_t *contextP,\n                                lwm2m_uri_t *uriP,\n                                lwm2m_server_t *serverP,\n                                coap_packet_t *message,\n                                coap_packet_t *response)\n{\n    uint8_t result;\n    lwm2m_media_type_t format;\n\n    LOG_ARG(\"Code: %02X\", message->code);\n    LOG_URI(uriP);\n    format = utils_convertMediaType(message->content_type);\n\n    result = prv_checkServerStatus(serverP);\n    if (result != COAP_NO_ERROR) return result;\n\n    switch (message->code)\n    {\n    case COAP_PUT:\n    {\n        if (LWM2M_URI_IS_SET_INSTANCE(uriP))\n        {\n            if (object_isInstanceNew(contextP, uriP->objectId, uriP->instanceId))\n            {\n                result = object_create(contextP, uriP, format, message->payload, message->payload_len);\n                if (COAP_201_CREATED == result)\n                {\n                    result = COAP_204_CHANGED;\n                }\n            }\n            else\n            {\n                result = object_write(contextP, uriP, format, message->payload, message->payload_len);\n                if (uriP->objectId == LWM2M_SECURITY_OBJECT_ID\n                        && result == COAP_204_CHANGED)\n                {\n                    prv_tagServer(contextP, uriP->instanceId);\n                }\n            }\n        }\n        else\n        {\n            lwm2m_data_t *dataP = NULL;\n            int size = 0;\n            int i;\n\n            if (message->payload_len == 0 || message->payload == 0)\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n            else\n            {\n                size = lwm2m_data_parse(uriP, message->payload, message->payload_len, format, &dataP);\n                if (size == 0)\n                {\n                    result = COAP_500_INTERNAL_SERVER_ERROR;\n                    break;\n                }\n\n                for (i = 0 ; i < size ; i++)\n                {\n                    if(dataP[i].type == LWM2M_TYPE_OBJECT_INSTANCE)\n                    {\n                        if (object_isInstanceNew(contextP, uriP->objectId, dataP[i].id))\n                        {\n                            result = object_createInstance(contextP, uriP, &dataP[i]);\n                            if (COAP_201_CREATED == result)\n                            {\n                                result = COAP_204_CHANGED;\n                            }\n                        }\n                        else\n                        {\n                            result = object_writeInstance(contextP, uriP, &dataP[i]);\n                            if (uriP->objectId == LWM2M_SECURITY_OBJECT_ID\n                                    && result == COAP_204_CHANGED)\n                            {\n                                prv_tagServer(contextP, dataP[i].id);\n                            }\n                        }\n\n                        if(result != COAP_204_CHANGED) // Stop object create or write when result is error\n                        {\n                            break;\n                        }\n                    }\n                    else\n                    {\n                        result = COAP_400_BAD_REQUEST;\n                    }\n                }\n                lwm2m_data_free(size, dataP);\n            }\n        }\n    }\n    break;\n\n    case COAP_DELETE:\n    {\n        if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n        {\n            result = COAP_400_BAD_REQUEST;\n        }\n        else\n        {\n            result = object_delete(contextP, uriP);\n            if (uriP->objectId == LWM2M_SECURITY_OBJECT_ID\n                    && result == COAP_202_DELETED)\n            {\n                if (LWM2M_URI_IS_SET_INSTANCE(uriP))\n                {\n                    prv_tagServer(contextP, uriP->instanceId);\n                }\n                else\n                {\n                    prv_tagAllServer(contextP, NULL);\n                }\n            }\n        }\n    }\n    break;\n\n    case COAP_GET:\n    case COAP_POST:\n    default:\n        result = COAP_400_BAD_REQUEST;\n        break;\n    }\n\n    if (result == COAP_202_DELETED\n            || result == COAP_204_CHANGED)\n    {\n        if (serverP->status != STATE_BS_PENDING)\n        {\n            serverP->status = STATE_BS_PENDING;\n            contextP->state = STATE_BOOTSTRAPPING;\n        }\n        lwm2m_stop_striger_server_initiated_bs(serverP->sessionH);    }\n    LOG_ARG(\"Server status: %s\", STR_STATUS(serverP->status));\n\n    return result;\n}\n\nuint8_t bootstrap_handleDeleteAll(lwm2m_context_t *contextP,\n                                  void *fromSessionH)\n{\n    lwm2m_server_t *serverP;\n    uint8_t result;\n    lwm2m_object_t *objectP;\n\n    LOG(\"Entering\");\n    serverP = utils_findBootstrapServer(contextP, fromSessionH);\n    if (serverP == NULL) return COAP_IGNORE;\n    result = prv_checkServerStatus(serverP);\n    if (result != COAP_NO_ERROR) return result;\n\n    result = COAP_202_DELETED;\n    for (objectP = contextP->objectList; objectP != NULL; objectP = objectP->next)\n    {\n        lwm2m_uri_t uri;\n\n        memset(&uri, 0, sizeof(lwm2m_uri_t));\n        uri.flag = LWM2M_URI_FLAG_OBJECT_ID;\n        uri.objectId = objectP->objID;\n\n        if (objectP->objID == LWM2M_SECURITY_OBJECT_ID)\n        {\n            lwm2m_list_t *instanceP;\n\n            instanceP = objectP->instanceList;\n            while (NULL != instanceP\n                    && result == COAP_202_DELETED)\n            {\n                if (instanceP->id == serverP->secObjInstID)\n                {\n                    instanceP = instanceP->next;\n                }\n                else\n                {\n                    uri.flag = LWM2M_URI_FLAG_OBJECT_ID | LWM2M_URI_FLAG_INSTANCE_ID;\n                    uri.instanceId = instanceP->id;\n                    result = object_delete(contextP, &uri);\n                    instanceP = objectP->instanceList;\n                }\n            }\n            if (result == COAP_202_DELETED)\n            {\n                prv_tagAllServer(contextP, serverP);\n            }\n        }\n        else\n        {\n            result = object_delete(contextP, &uri);\n            if (result == COAP_405_METHOD_NOT_ALLOWED)\n            {\n                // Fake a successful deletion for static objects like the Device object.\n                result = COAP_202_DELETED;\n            }\n        }\n    }\n\n    return result;\n}\n#endif\n#endif\n\n#ifdef LWM2M_BOOTSTRAP_SERVER_MODE\nuint8_t bootstrap_handleRequest(lwm2m_context_t *contextP,\n                                lwm2m_uri_t *uriP,\n                                void *fromSessionH,\n                                coap_packet_t *message,\n                                coap_packet_t *response)\n{\n    uint8_t result;\n    char *name;\n\n    LOG_URI(uriP);\n    if (contextP->bootstrapCallback == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n    if (message->code != COAP_POST) return COAP_400_BAD_REQUEST;\n    if (message->uri_query == NULL) return COAP_400_BAD_REQUEST;\n    if (message->payload != NULL) return COAP_400_BAD_REQUEST;\n\n    if (lwm2m_strncmp((char *)message->uri_query->data, QUERY_NAME, QUERY_NAME_LEN) != 0)\n    {\n        return COAP_400_BAD_REQUEST;\n    }\n\n    if (message->uri_query->len == QUERY_NAME_LEN) return COAP_400_BAD_REQUEST;\n    if (message->uri_query->next != NULL) return COAP_400_BAD_REQUEST;\n\n    name = (char *)lwm2m_malloc(message->uri_query->len - QUERY_NAME_LEN + 1);\n    if (name == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    memcpy(name, message->uri_query->data + QUERY_NAME_LEN, message->uri_query->len - QUERY_NAME_LEN);\n    name[message->uri_query->len - QUERY_NAME_LEN] = 0;\n\n    result = contextP->bootstrapCallback(fromSessionH, COAP_NO_ERROR, NULL, name, contextP->bootstrapUserData);\n\n    lwm2m_free(name);\n\n    return result;\n}\n\nvoid lwm2m_set_bootstrap_callback(lwm2m_context_t *contextP,\n                                  lwm2m_bootstrap_callback_t callback,\n                                  void *userData)\n{\n    LOG(\"Entering\");\n    contextP->bootstrapCallback = callback;\n    contextP->bootstrapUserData = userData;\n}\n\nstatic void prv_resultCallback(lwm2m_transaction_t *transacP,\n                               void *message)\n{\n    bs_data_t *dataP = (bs_data_t *)transacP->userData;\n    lwm2m_uri_t *uriP;\n\n    if (dataP->isUri == true)\n    {\n        uriP = &dataP->uri;\n    }\n    else\n    {\n        uriP = NULL;\n    }\n\n    if (message == NULL)\n    {\n        dataP->callback(transacP->peerH,\n                        COAP_503_SERVICE_UNAVAILABLE,\n                        uriP,\n                        NULL,\n                        dataP->userData);\n    }\n    else\n    {\n        coap_packet_t *packet = (coap_packet_t *)message;\n\n        dataP->callback(transacP->peerH,\n                        packet->code,\n                        uriP,\n                        NULL,\n                        dataP->userData);\n    }\n    lwm2m_free(dataP);\n}\n\nint lwm2m_bootstrap_delete(lwm2m_context_t *contextP,\n                           void *sessionH,\n                           lwm2m_uri_t *uriP)\n{\n    lwm2m_transaction_t *transaction;\n    bs_data_t *dataP;\n\n    LOG_URI(uriP);\n    transaction = transaction_new(sessionH, COAP_DELETE, NULL, uriP, contextP->nextMID++, 4, NULL);\n    if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    dataP = (bs_data_t *)lwm2m_malloc(sizeof(bs_data_t));\n    if (dataP == NULL)\n    {\n        transaction_free(transaction);\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n    if (uriP == NULL)\n    {\n        dataP->isUri = false;\n    }\n    else\n    {\n        dataP->isUri = true;\n        memcpy(&dataP->uri, uriP, sizeof(lwm2m_uri_t));\n    }\n    dataP->callback = contextP->bootstrapCallback;\n    dataP->userData = contextP->bootstrapUserData;\n\n    transaction->callback = prv_resultCallback;\n    transaction->userData = (void *)dataP;\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n\n    return transaction_send(contextP, transaction);\n}\n\nint lwm2m_bootstrap_write(lwm2m_context_t *contextP,\n                          void *sessionH,\n                          lwm2m_uri_t *uriP,\n                          lwm2m_media_type_t format,\n                          uint8_t *buffer,\n                          size_t length)\n{\n    lwm2m_transaction_t *transaction;\n    bs_data_t *dataP;\n\n    LOG_URI(uriP);\n    if (uriP == NULL\n            || buffer == NULL\n            || length == 0)\n    {\n        return COAP_400_BAD_REQUEST;\n    }\n\n    transaction = transaction_new(sessionH, COAP_PUT, NULL, uriP, contextP->nextMID++, 4, NULL);\n    if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    coap_set_header_content_type(transaction->message, format);\n    coap_set_payload(transaction->message, buffer, length);\n\n    dataP = (bs_data_t *)lwm2m_malloc(sizeof(bs_data_t));\n    if (dataP == NULL)\n    {\n        transaction_free(transaction);\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n    dataP->isUri = true;\n    memcpy(&dataP->uri, uriP, sizeof(lwm2m_uri_t));\n    dataP->callback = contextP->bootstrapCallback;\n    dataP->userData = contextP->bootstrapUserData;\n\n    transaction->callback = prv_resultCallback;\n    transaction->userData = (void *)dataP;\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n\n    return transaction_send(contextP, transaction);\n}\n\nint lwm2m_bootstrap_finish(lwm2m_context_t *contextP,\n                           void *sessionH)\n{\n    lwm2m_transaction_t *transaction;\n    bs_data_t *dataP;\n\n    LOG(\"Entering\");\n    transaction = transaction_new(sessionH, COAP_POST, NULL, NULL, contextP->nextMID++, 4, NULL);\n    if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    coap_set_header_uri_path(transaction->message, \"/\"URI_BOOTSTRAP_SEGMENT);\n\n    dataP = (bs_data_t *)lwm2m_malloc(sizeof(bs_data_t));\n    if (dataP == NULL)\n    {\n        transaction_free(transaction);\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n    dataP->isUri = false;\n    dataP->callback = contextP->bootstrapCallback;\n    dataP->userData = contextP->bootstrapUserData;\n\n    transaction->callback = prv_resultCallback;\n    transaction->userData = (void *)dataP;\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n\n    return transaction_send(contextP, transaction);\n}\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/data.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n*\n* Copyright (c) 2013, 2014 Intel Corporation and others.\n* All rights reserved. This program and the accompanying materials\n* are made available under the terms of the Eclipse Public License v1.0\n* and Eclipse Distribution License v1.0 which accompany this distribution.\n*\n* The Eclipse Public License is available at\n*    http://www.eclipse.org/legal/epl-v10.html\n* The Eclipse Distribution License is available at\n*    http://www.eclipse.org/org/documents/edl-v10.php.\n*\n* Contributors:\n*    David Navarro, Intel Corporation - initial API and implementation\n*    Fabien Fleutot - Please refer to git log\n*    Bosch Software Innovations GmbH - Please refer to git log\n*\n*******************************************************************************/\n\n#include \"internals.h\"\n#include <float.h>\n\n#define _PRV_STR_LENGTH 32\n\n\nvoid lwm2m_data_decode_opaque(const lwm2m_data_t *dataP,\n                              int8_t *valueP)\n{\n    memcpy(valueP, dataP->value.asBuffer.buffer, dataP->value.asBuffer.length);\n}\n\n// dataP array length is assumed to be 1.\nstatic int prv_textSerialize(lwm2m_data_t *dataP,\n                             uint8_t **bufferP)\n{\n    size_t res;\n\n    switch (dataP->type)\n    {\n    case LWM2M_TYPE_STRING:\n        *bufferP = (uint8_t *)lwm2m_malloc(dataP->value.asBuffer.length);\n        if (*bufferP == NULL) return 0;\n        memcpy(*bufferP, dataP->value.asBuffer.buffer, dataP->value.asBuffer.length);\n        return (int)dataP->value.asBuffer.length;\n\n    case LWM2M_TYPE_INTEGER:\n    {\n        uint8_t intString[_PRV_STR_LENGTH];\n\n        res = utils_intToText(dataP->value.asInteger, intString, _PRV_STR_LENGTH);\n        if (res == 0) return -1;\n\n        *bufferP = (uint8_t *)lwm2m_malloc(res);\n        if (NULL == *bufferP) return -1;\n\n        memcpy(*bufferP, intString, res);\n\n        return (int)res;\n    }\n\n    case LWM2M_TYPE_FLOAT:\n    {\n        uint8_t floatString[_PRV_STR_LENGTH * 2];\n\n        res = utils_floatToText(dataP->value.asFloat, floatString, _PRV_STR_LENGTH * 2);\n        if (res == 0) return -1;\n\n        *bufferP = (uint8_t *)lwm2m_malloc(res);\n        if (NULL == *bufferP) return -1;\n\n        memcpy(*bufferP, floatString, res);\n\n        return (int)res;\n    }\n\n    case LWM2M_TYPE_BOOLEAN:\n        *bufferP = (uint8_t *)lwm2m_malloc(1);\n        if (NULL == *bufferP) return -1;\n\n        *bufferP[0] = dataP->value.asBoolean ? '1' : '0';\n\n        return 1;\n\n    case LWM2M_TYPE_OBJECT_LINK:\n    {\n        char stringBuffer[11];\n        size_t length;\n\n        length = utils_intToText(dataP->value.asObjLink.objectId, (uint8_t *)stringBuffer, 5);\n        if (length == 0) return -1;\n\n        stringBuffer[5] = ':';\n        res = length + 1;\n\n        length = utils_intToText(dataP->value.asObjLink.objectInstanceId, (uint8_t *)stringBuffer + res, 5);\n        if (length == 0) return -1;\n\n        res += length;\n\n        *bufferP = (uint8_t *)lwm2m_malloc(res);\n        if (*bufferP == NULL) return -1;\n\n        memcpy(*bufferP, stringBuffer, res);\n\n        return res;\n    }\n\n    case LWM2M_TYPE_OPAQUE:\n    {\n        size_t length;\n\n        length = utils_base64GetSize(dataP->value.asBuffer.length);\n        *bufferP = (uint8_t *)lwm2m_malloc(length);\n        if (*bufferP == NULL) return 0;\n        length = utils_base64Encode(dataP->value.asBuffer.buffer, dataP->value.asBuffer.length, *bufferP, length);\n        if (length == 0)\n        {\n            lwm2m_free(*bufferP);\n            *bufferP = NULL;\n            return 0;\n        }\n        return (int)length;\n    }\n\n    case LWM2M_TYPE_UNDEFINED:\n    default:\n        return -1;\n    }\n}\n\nstatic int prv_setBuffer(lwm2m_data_t *dataP,\n                         uint8_t *buffer,\n                         size_t bufferLen)\n{\n    dataP->value.asBuffer.buffer = (uint8_t *)lwm2m_malloc(bufferLen);\n    if (dataP->value.asBuffer.buffer == NULL)\n    {\n        return 0;\n    }\n    dataP->value.asBuffer.length = bufferLen;\n    memcpy(dataP->value.asBuffer.buffer, buffer, bufferLen);\n\n    return 1;\n}\n\nlwm2m_data_t *lwm2m_data_new(int size)\n{\n    lwm2m_data_t *dataP;\n\n    LOG_ARG(\"size: %d\", size);\n    if (size <= 0) return NULL;\n\n    dataP = (lwm2m_data_t *)lwm2m_malloc(size * sizeof(lwm2m_data_t));\n\n    if (dataP != NULL)\n    {\n        memset(dataP, 0, size * sizeof(lwm2m_data_t));\n    }\n\n    return dataP;\n}\n\nvoid lwm2m_data_free(int size,\n                     lwm2m_data_t *dataP)\n{\n    int i;\n\n    LOG_ARG(\"size: %d\", size);\n    if (size == 0 || dataP == NULL) return;\n\n    for (i = 0; i < size; i++)\n    {\n        switch (dataP[i].type)\n        {\n        case LWM2M_TYPE_MULTIPLE_RESOURCE:\n        case LWM2M_TYPE_OBJECT_INSTANCE:\n        case LWM2M_TYPE_OBJECT:\n            lwm2m_data_free(dataP[i].value.asChildren.count, dataP[i].value.asChildren.array);\n            break;\n\n        case LWM2M_TYPE_STRING:\n        case LWM2M_TYPE_OPAQUE:\n            if (dataP[i].value.asBuffer.buffer != NULL)\n            {\n                lwm2m_free(dataP[i].value.asBuffer.buffer);\n            }\n\n        default:\n            // do nothing\n            break;\n        }\n    }\n    lwm2m_free(dataP);\n}\n\nvoid lwm2m_data_encode_string(const char *string,\n                              lwm2m_data_t *dataP)\n{\n    size_t len;\n    int res;\n\n    LOG_ARG(\"\\\"%s\\\"\", string);\n    if (string == NULL)\n    {\n        len = 0;\n    }\n    else\n    {\n        for (len = 0; string[len] != 0; len++);\n    }\n\n    if (len == 0)\n    {\n        dataP->value.asBuffer.length = 0;\n        dataP->value.asBuffer.buffer = NULL;\n        res = 1;\n    }\n    else\n    {\n        res = prv_setBuffer(dataP, (uint8_t *)string, len);\n    }\n\n    if (res == 1)\n    {\n        dataP->type = LWM2M_TYPE_STRING;\n    }\n    else\n    {\n        dataP->type = LWM2M_TYPE_UNDEFINED;\n    }\n}\n\nvoid lwm2m_data_encode_opaque(uint8_t *buffer,\n                              size_t length,\n                              lwm2m_data_t *dataP)\n{\n    int res;\n\n    LOG_ARG(\"length: %d\", length);\n    if (length == 0)\n    {\n        dataP->value.asBuffer.length = 0;\n        dataP->value.asBuffer.buffer = NULL;\n        res = 1;\n    }\n    else\n    {\n        res = prv_setBuffer(dataP, buffer, length);\n    }\n\n    if (res == 1)\n    {\n        dataP->type = LWM2M_TYPE_OPAQUE;\n    }\n    else\n    {\n        dataP->type = LWM2M_TYPE_UNDEFINED;\n    }\n}\n\nvoid lwm2m_data_encode_nstring(const char *string,\n                               size_t length,\n                               lwm2m_data_t *dataP)\n{\n    LOG_ARG(\"length: %d, string: \\\"%s\\\"\", length, string);\n    lwm2m_data_encode_opaque((uint8_t *)string, length, dataP);\n\n    if (dataP->type == LWM2M_TYPE_OPAQUE)\n    {\n        dataP->type = LWM2M_TYPE_STRING;\n    }\n}\n\nvoid lwm2m_data_encode_int(int64_t value,\n                           lwm2m_data_t *dataP)\n{\n    LOG_ARG(\"value: %\" PRId64 \"\", value);\n    dataP->type = LWM2M_TYPE_INTEGER;\n    dataP->value.asInteger = value;\n}\n\nint lwm2m_data_decode_int(const lwm2m_data_t *dataP,\n                          int64_t *valueP)\n{\n    int result;\n\n    LOG(\"Entering\");\n    switch (dataP->type)\n    {\n    case LWM2M_TYPE_INTEGER:\n        *valueP = dataP->value.asInteger;\n        result = 1;\n        break;\n\n    case LWM2M_TYPE_STRING:\n        result = utils_textToInt(dataP->value.asBuffer.buffer, dataP->value.asBuffer.length, valueP);\n        break;\n\n    case LWM2M_TYPE_OPAQUE:\n        switch (dataP->value.asBuffer.length)\n        {\n        case 1:\n            *valueP = (int8_t)dataP->value.asBuffer.buffer[0];\n            result = 1;\n            break;\n\n        case 2:\n        {\n            int16_t value;\n\n            utils_copyValue(&value, dataP->value.asBuffer.buffer, dataP->value.asBuffer.length);\n\n            *valueP = value;\n            result = 1;\n            break;\n        }\n\n        case 4:\n        {\n            int32_t value;\n\n            utils_copyValue(&value, dataP->value.asBuffer.buffer, dataP->value.asBuffer.length);\n\n            *valueP = value;\n            result = 1;\n            break;\n        }\n\n        case 8:\n            utils_copyValue(valueP, dataP->value.asBuffer.buffer, dataP->value.asBuffer.length);\n            result = 1;\n            break;\n\n        default:\n            result = 0;\n        }\n        break;\n\n    default:\n        return 0;\n    }\n    LOG_ARG(\"result: %d, value: %\" PRId64, result, *valueP);\n\n    return result;\n}\n\nvoid lwm2m_data_encode_float(double value,\n                             lwm2m_data_t *dataP)\n{\n    LOG_ARG(\"value: %f\", value);\n    dataP->type = LWM2M_TYPE_FLOAT;\n    dataP->value.asFloat = value;\n}\n\nint lwm2m_data_decode_float(const lwm2m_data_t *dataP,\n                            double *valueP)\n{\n    int result;\n\n    LOG(\"Entering\");\n    switch (dataP->type)\n    {\n    case LWM2M_TYPE_FLOAT:\n        *valueP = dataP->value.asFloat;\n        result = 1;\n        break;\n\n    case LWM2M_TYPE_INTEGER:\n        *valueP = (double)dataP->value.asInteger;\n        result = 1;\n        break;\n\n    case LWM2M_TYPE_STRING:\n        result = utils_textToFloat(dataP->value.asBuffer.buffer, dataP->value.asBuffer.length, valueP);\n        break;\n\n    case LWM2M_TYPE_OPAQUE:\n        switch (dataP->value.asBuffer.length)\n        {\n        case 4:\n        {\n            float temp;\n\n            utils_copyValue(&temp, dataP->value.asBuffer.buffer, dataP->value.asBuffer.length);\n\n            *valueP = temp;\n            result = 1;\n        }\n        break;\n\n        case 8:\n            utils_copyValue(valueP, dataP->value.asBuffer.buffer, dataP->value.asBuffer.length);\n            result = 1;\n            break;\n\n        default:\n            result = 0;\n        }\n        break;\n\n    default:\n        result = 0;\n    }\n\n    LOG_ARG(\"result: %d, value: %f\", result, *valueP);\n\n    return result;\n}\n\nvoid lwm2m_data_encode_bool(bool value,\n                            lwm2m_data_t *dataP)\n{\n    LOG_ARG(\"value: %s\", value ? \"true\" : \"false\");\n    dataP->type = LWM2M_TYPE_BOOLEAN;\n    dataP->value.asBoolean = value;\n}\n\nint lwm2m_data_decode_bool(const lwm2m_data_t *dataP,\n                           bool *valueP)\n{\n    int result;\n\n    LOG(\"Entering\");\n    switch (dataP->type)\n    {\n    case LWM2M_TYPE_BOOLEAN:\n        *valueP = dataP->value.asBoolean;\n        result = 1;\n        break;\n\n    case LWM2M_TYPE_STRING:\n        if (dataP->value.asBuffer.length != 1) return 0;\n\n        switch (dataP->value.asBuffer.buffer[0])\n        {\n        case '0':\n            *valueP = false;\n            result = 1;\n            break;\n        case '1':\n            *valueP = true;\n            result = 1;\n            break;\n        default:\n            result = 0;\n            break;\n        }\n        break;\n\n    case LWM2M_TYPE_OPAQUE:\n        if (dataP->value.asBuffer.length != 1) return 0;\n\n        switch (dataP->value.asBuffer.buffer[0])\n        {\n        case 0:\n            *valueP = false;\n            result = 1;\n            break;\n        case 1:\n            *valueP = true;\n            result = 1;\n            break;\n        default:\n            result = 0;\n            break;\n        }\n        break;\n\n    default:\n        result = 0;\n        break;\n    }\n\n    LOG_ARG(\"result: %d, value: %s\", result, *valueP ? \"true\" : \"false\");\n\n    return result;\n}\n\nvoid lwm2m_data_encode_objlink(uint16_t objectId,\n                               uint16_t objectInstanceId,\n                               lwm2m_data_t *dataP)\n{\n    LOG_ARG(\"value: %d/%d\", objectId, objectInstanceId);\n    dataP->type = LWM2M_TYPE_OBJECT_LINK;\n    dataP->value.asObjLink.objectId = objectId;\n    dataP->value.asObjLink.objectInstanceId = objectInstanceId;\n}\n\nvoid lwm2m_data_include(lwm2m_data_t *subDataP,\n                        size_t count,\n                        lwm2m_data_t *dataP)\n{\n    LOG_ARG(\"count: %d\", count);\n    if (subDataP == NULL || count == 0) return;\n\n    switch (subDataP[0].type)\n    {\n    case LWM2M_TYPE_STRING:\n    case LWM2M_TYPE_OPAQUE:\n    case LWM2M_TYPE_INTEGER:\n    case LWM2M_TYPE_FLOAT:\n    case LWM2M_TYPE_BOOLEAN:\n    case LWM2M_TYPE_OBJECT_LINK:\n    case LWM2M_TYPE_MULTIPLE_RESOURCE:\n        dataP->type = LWM2M_TYPE_OBJECT_INSTANCE;\n        break;\n    case LWM2M_TYPE_OBJECT_INSTANCE:\n        dataP->type = LWM2M_TYPE_OBJECT;\n        break;\n    default:\n        return;\n    }\n    dataP->value.asChildren.count = count;\n    dataP->value.asChildren.array = subDataP;\n}\n\nvoid lwm2m_data_encode_instances(lwm2m_data_t *subDataP,\n                                 size_t count,\n                                 lwm2m_data_t *dataP)\n{\n    LOG_ARG(\"count: %d\", count);\n    lwm2m_data_include(subDataP, count, dataP);\n    dataP->type = LWM2M_TYPE_MULTIPLE_RESOURCE;\n}\n\nint lwm2m_data_parse(lwm2m_uri_t *uriP,\n                     uint8_t *buffer,\n                     size_t bufferLen,\n                     lwm2m_media_type_t format,\n                     lwm2m_data_t **dataP)\n{\n    int res;\n\n    LOG_ARG(\"format: %s, bufferLen: %d\", STR_MEDIA_TYPE(format), bufferLen);\n    LOG_URI(uriP);\n    switch (format)\n    {\n    case LWM2M_CONTENT_TEXT:\n        if (!LWM2M_URI_IS_SET_RESOURCE(uriP)) return 0;\n        *dataP = lwm2m_data_new(1);\n        if (*dataP == NULL) return 0;\n        (*dataP)->id = uriP->resourceId;\n        (*dataP)->type = LWM2M_TYPE_STRING;\n        res = prv_setBuffer(*dataP, buffer, bufferLen);\n        if (res == 0)\n        {\n            lwm2m_data_free(1, *dataP);\n            *dataP = NULL;\n        }\n        return res;\n\n    case LWM2M_CONTENT_OPAQUE:\n        if (!LWM2M_URI_IS_SET_RESOURCE(uriP)) return 0;\n        *dataP = lwm2m_data_new(1);\n        if (*dataP == NULL) return 0;\n        (*dataP)->id = uriP->resourceId;\n        (*dataP)->type = LWM2M_TYPE_OPAQUE;\n        res = prv_setBuffer(*dataP, buffer, bufferLen);\n        if (res == 0)\n        {\n            lwm2m_data_free(1, *dataP);\n            *dataP = NULL;\n        }\n        return res;\n\n#ifdef LWM2M_OLD_CONTENT_FORMAT_SUPPORT\n    case LWM2M_CONTENT_TLV_OLD:\n#endif\n    case LWM2M_CONTENT_TLV:\n        return tlv_parse(buffer, bufferLen, dataP);\n\n#ifdef LWM2M_SUPPORT_JSON\n#ifdef LWM2M_OLD_CONTENT_FORMAT_SUPPORT\n    case LWM2M_CONTENT_JSON_OLD:\n#endif\n    case LWM2M_CONTENT_JSON:\n        return json_parse(uriP, buffer, bufferLen, dataP);\n#endif\n\n    default:\n        return 0;\n    }\n}\n\nint lwm2m_data_serialize(lwm2m_uri_t *uriP,\n                         int size,\n                         lwm2m_data_t *dataP,\n                         lwm2m_media_type_t *formatP,\n                         uint8_t **bufferP)\n{\n    LOG_URI(uriP);\n    LOG_ARG(\"size: %d, formatP: %s\", size, STR_MEDIA_TYPE(*formatP));\n\n    // Check format\n    if (*formatP == LWM2M_CONTENT_TEXT\n            || *formatP == LWM2M_CONTENT_OPAQUE)\n    {\n        if (size != 1\n                || (uriP != NULL && !LWM2M_URI_IS_SET_RESOURCE(uriP))\n                || dataP->type == LWM2M_TYPE_OBJECT\n                || dataP->type == LWM2M_TYPE_OBJECT_INSTANCE\n                || dataP->type == LWM2M_TYPE_MULTIPLE_RESOURCE)\n        {\n#ifdef LWM2M_SUPPORT_JSON\n            *formatP = LWM2M_CONTENT_JSON;\n#else\n            *formatP = LWM2M_CONTENT_TLV;\n#endif\n        }\n    }\n\n    if (*formatP == LWM2M_CONTENT_OPAQUE\n            && dataP->type != LWM2M_TYPE_OPAQUE)\n    {\n        LOG(\"Opaque format is reserved to opaque resources.\");\n        return -1;\n    }\n\n    if (dm_isUriOpaqueHandle(uriP))\n    {\n        *formatP = LWM2M_CONTENT_OPAQUE;\n    }\n\n    LOG_ARG(\"Final format: %s\", STR_MEDIA_TYPE(*formatP));\n\n    switch (*formatP)\n    {\n    case LWM2M_CONTENT_TEXT:\n        return prv_textSerialize(dataP, bufferP);\n\n    case LWM2M_CONTENT_OPAQUE:\n        *bufferP = (uint8_t *)lwm2m_malloc(dataP->value.asBuffer.length);\n        if (*bufferP == NULL) return -1;\n        memcpy(*bufferP, dataP->value.asBuffer.buffer, dataP->value.asBuffer.length);\n        return (int)dataP->value.asBuffer.length;\n\n    case LWM2M_CONTENT_TLV:\n    case LWM2M_CONTENT_TLV_OLD:\n    {\n        bool isResourceInstance;\n\n        if (uriP != NULL && LWM2M_URI_IS_SET_RESOURCE(uriP)\n                && (size != 1 || dataP->id != uriP->resourceId))\n        {\n            isResourceInstance = true;\n        }\n        else\n        {\n            isResourceInstance = false;\n        }\n        return tlv_serialize(isResourceInstance, size, dataP, bufferP);\n    }\n\n#ifdef LWM2M_CLIENT_MODE\n    case LWM2M_CONTENT_LINK:\n        return discover_serialize(NULL, uriP, NULL, size, dataP, bufferP);\n#endif\n#ifdef LWM2M_SUPPORT_JSON\n    case LWM2M_CONTENT_JSON:\n    case LWM2M_CONTENT_JSON_OLD:\n        return json_serialize(uriP, size, dataP, bufferP);\n#endif\n\n    default:\n        return -1;\n    }\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/discover.c",
    "content": "/*******************************************************************************\n*\n* Copyright (c) 2015 Intel Corporation and others.\n* All rights reserved. This program and the accompanying materials\n* are made available under the terms of the Eclipse Public License v1.0\n* and Eclipse Distribution License v1.0 which accompany this distribution.\n*\n* The Eclipse Public License is available at\n*    http://www.eclipse.org/legal/epl-v10.html\n* The Eclipse Distribution License is available at\n*    http://www.eclipse.org/org/documents/edl-v10.php.\n*\n* Contributors:\n*    David Navarro, Intel Corporation - initial API and implementation\n*\n*******************************************************************************/\n\n\n#include \"internals.h\"\n\n#define PRV_LINK_BUFFER_SIZE  1024\n\n\n#define PRV_CONCAT_STR(buf, len, index, str, str_len)    \\\n    {                                                    \\\n        if ((len)-(index) < (str_len)) return -1;        \\\n        memcpy((buf)+(index), (str), (str_len));         \\\n        (index) += (str_len);                            \\\n    }\n\n\n#ifdef LWM2M_CLIENT_MODE\n\nstatic lwm2m_attributes_t *prv_findAttributes(lwm2m_context_t *contextP,\n        lwm2m_uri_t *uriP,\n        lwm2m_server_t *serverP)\n{\n    lwm2m_observed_t *observedP;\n    lwm2m_watcher_t *watcherP;\n    lwm2m_attributes_t *paramP;\n\n    paramP = NULL;\n\n    if (contextP == NULL) return NULL;\n    if (serverP == NULL) return NULL;\n\n    observedP = observe_findByUri(contextP, uriP);\n    if (observedP == NULL || observedP->watcherList == NULL) return NULL;\n\n    for (watcherP = observedP->watcherList; watcherP != NULL; watcherP = watcherP->next)\n    {\n        if (watcherP->server == serverP)\n        {\n            paramP = watcherP->parameters;\n        }\n    }\n\n    return paramP;\n}\n\nstatic int prv_serializeAttributes(lwm2m_context_t *contextP,\n                                   lwm2m_uri_t *uriP,\n                                   lwm2m_server_t *serverP,\n                                   lwm2m_attributes_t *objectParamP,\n                                   uint8_t *buffer,\n                                   size_t uriLen,\n                                   size_t bufferLen)\n{\n    int head;\n    int res;\n    lwm2m_attributes_t *paramP;\n\n    head = 0;\n\n    paramP = prv_findAttributes(contextP, uriP, serverP);\n    if (paramP == NULL) paramP = objectParamP;\n\n    if (paramP != NULL)\n    {\n        head = uriLen;\n\n        if (paramP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD)\n        {\n            PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);\n            PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MIN_PERIOD_STR, ATTR_MIN_PERIOD_LEN);\n\n            res = utils_intToText(paramP->minPeriod, buffer + head, bufferLen - head);\n            if (res <= 0) return -1;\n            head += res;\n        }\n        else if (objectParamP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD)\n        {\n            PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);\n            PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MIN_PERIOD_STR, ATTR_MIN_PERIOD_LEN);\n\n            res = utils_intToText(objectParamP->minPeriod, buffer + head, bufferLen - head);\n            if (res <= 0) return -1;\n            head += res;\n        }\n\n        if (paramP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD)\n        {\n            PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);\n            PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MAX_PERIOD_STR, ATTR_MAX_PERIOD_LEN);\n\n            res = utils_intToText(paramP->maxPeriod, buffer + head, bufferLen - head);\n            if (res <= 0) return -1;\n            head += res;\n        }\n        else if (objectParamP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD)\n        {\n            PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);\n            PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_MAX_PERIOD_STR, ATTR_MAX_PERIOD_LEN);\n\n            res = utils_intToText(objectParamP->maxPeriod, buffer + head, bufferLen - head);\n            if (res <= 0) return -1;\n            head += res;\n        }\n\n        if (paramP->toSet & LWM2M_ATTR_FLAG_GREATER_THAN)\n        {\n            PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);\n            PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_GREATER_THAN_STR, ATTR_GREATER_THAN_LEN);\n\n            res = utils_floatToText(paramP->greaterThan, buffer + head, bufferLen - head);\n            if (res <= 0) return -1;\n            head += res;\n        }\n        if (paramP->toSet & LWM2M_ATTR_FLAG_LESS_THAN)\n        {\n            PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);\n            PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_LESS_THAN_STR, ATTR_LESS_THAN_LEN);\n\n            res = utils_floatToText(paramP->lessThan, buffer + head, bufferLen - head);\n            if (res <= 0) return -1;\n            head += res;\n        }\n        if (paramP->toSet & LWM2M_ATTR_FLAG_STEP)\n        {\n            PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ATTR_SEPARATOR, LINK_ATTR_SEPARATOR_SIZE);\n            PRV_CONCAT_STR(buffer, bufferLen, head, ATTR_STEP_STR, ATTR_STEP_LEN);\n\n            res = utils_floatToText(paramP->step, buffer + head, bufferLen - head);\n            if (res <= 0) return -1;\n            head += res;\n        }\n        PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ITEM_ATTR_END, LINK_ITEM_ATTR_END_SIZE);\n    }\n\n    if (head > 0) head -= uriLen + 1;\n\n    return head;\n}\n\nstatic int prv_serializeLinkData(lwm2m_context_t *contextP,\n                                 lwm2m_data_t *tlvP,\n                                 lwm2m_server_t *serverP,\n                                 lwm2m_attributes_t *objectParamP,\n                                 lwm2m_uri_t *parentUriP,\n                                 uint8_t *parentUriStr,\n                                 size_t parentUriLen,\n                                 uint8_t *buffer,\n                                 size_t bufferLen)\n{\n    int head;\n    int res;\n    lwm2m_uri_t uri;\n\n    head = 0;\n\n    switch (tlvP->type)\n    {\n    case LWM2M_TYPE_UNDEFINED:\n    case LWM2M_TYPE_STRING:\n    case LWM2M_TYPE_OPAQUE:\n    case LWM2M_TYPE_INTEGER:\n    case LWM2M_TYPE_FLOAT:\n    case LWM2M_TYPE_BOOLEAN:\n    case LWM2M_TYPE_OBJECT_LINK:\n    case LWM2M_TYPE_MULTIPLE_RESOURCE:\n        if (bufferLen < LINK_ITEM_START_SIZE) return -1;\n        memcpy(buffer + head, LINK_ITEM_START, LINK_ITEM_START_SIZE);\n        head = LINK_ITEM_START_SIZE;\n\n        if (parentUriLen > 0)\n        {\n            if (bufferLen - head < parentUriLen) return -1;\n            memcpy(buffer + head, parentUriStr, parentUriLen);\n            head += parentUriLen;\n        }\n\n        if (bufferLen - head < LINK_URI_SEPARATOR_SIZE) return -1;\n        memcpy(buffer + head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE);\n        head += LINK_URI_SEPARATOR_SIZE;\n\n        res = utils_intToText(tlvP->id, buffer + head, bufferLen - head);\n        if (res <= 0) return -1;\n        head += res;\n\n        if (tlvP->type == LWM2M_TYPE_MULTIPLE_RESOURCE)\n        {\n            if (bufferLen - head < LINK_ITEM_DIM_START_SIZE) return -1;\n            memcpy(buffer + head, LINK_ITEM_DIM_START, LINK_ITEM_DIM_START_SIZE);\n            head += LINK_ITEM_DIM_START_SIZE;\n\n            res = utils_intToText(tlvP->value.asChildren.count, buffer + head, bufferLen - head);\n            if (res <= 0) return -1;\n            head += res;\n\n            if (bufferLen - head < LINK_ITEM_ATTR_END_SIZE) return -1;\n            memcpy(buffer + head, LINK_ITEM_ATTR_END, LINK_ITEM_ATTR_END_SIZE);\n            head += LINK_ITEM_ATTR_END_SIZE;\n        }\n        else\n        {\n            if (bufferLen - head < LINK_ITEM_END_SIZE) return -1;\n            memcpy(buffer + head, LINK_ITEM_END, LINK_ITEM_END_SIZE);\n            head += LINK_ITEM_END_SIZE;\n        }\n\n        if (serverP != NULL)\n        {\n            memcpy(&uri, parentUriP, sizeof(lwm2m_uri_t));\n            uri.resourceId = tlvP->id;\n            uri.flag |= LWM2M_URI_FLAG_RESOURCE_ID;\n            res = prv_serializeAttributes(contextP, &uri, serverP, objectParamP, buffer, head - 1, bufferLen);\n            if (res < 0) return -1;    // careful, 0 is valid\n            if (res > 0) head += res;\n        }\n        break;\n\n    case LWM2M_TYPE_OBJECT_INSTANCE:\n    {\n        uint8_t uriStr[URI_MAX_STRING_LEN];\n        size_t uriLen;\n        size_t index;\n\n        if (parentUriLen > 0)\n        {\n            if (URI_MAX_STRING_LEN < parentUriLen) return -1;\n            memcpy(uriStr, parentUriStr, parentUriLen);\n            uriLen = parentUriLen;\n        }\n        else\n        {\n            uriLen = 0;\n        }\n\n        if (URI_MAX_STRING_LEN - uriLen < LINK_URI_SEPARATOR_SIZE) return -1;\n        memcpy(uriStr + uriLen, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE);\n        uriLen += LINK_URI_SEPARATOR_SIZE;\n\n        res = utils_intToText(tlvP->id, uriStr + uriLen, URI_MAX_STRING_LEN - uriLen);\n        if (res <= 0) return -1;\n        uriLen += res;\n\n        memcpy(&uri, parentUriP, sizeof(lwm2m_uri_t));\n        uri.instanceId = tlvP->id;\n        uri.flag |= LWM2M_URI_FLAG_INSTANCE_ID;\n\n        head = 0;\n        PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ITEM_START, LINK_ITEM_START_SIZE);\n        PRV_CONCAT_STR(buffer, bufferLen, head, uriStr, uriLen);\n        PRV_CONCAT_STR(buffer, bufferLen, head, LINK_ITEM_END, LINK_ITEM_END_SIZE);\n        if (serverP != NULL)\n        {\n            res = prv_serializeAttributes(contextP, &uri, serverP, NULL, buffer, head - 1, bufferLen);\n            if (res < 0) return -1;    // careful, 0 is valid\n            if (res == 0) head = 0;    // rewind\n            else head += res;\n        }\n        for (index = 0; index < tlvP->value.asChildren.count; index++)\n        {\n            res = prv_serializeLinkData(contextP, tlvP->value.asChildren.array + index, serverP, objectParamP, &uri, uriStr, uriLen, buffer + head, bufferLen - head);\n            if (res < 0) return -1;\n            head += res;\n        }\n    }\n    break;\n\n    case LWM2M_TYPE_OBJECT:\n    default:\n        return -1;\n    }\n\n    return head;\n}\n\nint discover_serialize(lwm2m_context_t *contextP,\n                       lwm2m_uri_t *uriP,\n                       lwm2m_server_t *serverP,\n                       int size,\n                       lwm2m_data_t *dataP,\n                       uint8_t **bufferP)\n{\n    uint8_t bufferLink[PRV_LINK_BUFFER_SIZE];\n    uint8_t baseUriStr[URI_MAX_STRING_LEN];\n    int baseUriLen;\n    int index;\n    size_t head;\n    int res;\n    lwm2m_uri_t parentUri;\n    lwm2m_attributes_t *paramP;\n    lwm2m_attributes_t mergedParam;\n\n    LOG_ARG(\"size: %d\", size);\n    LOG_URI(uriP);\n\n    head = 0;\n    memset(&parentUri, 0, sizeof(lwm2m_uri_t));\n    parentUri.objectId = uriP->objectId;\n    parentUri.flag = LWM2M_URI_FLAG_OBJECT_ID;\n\n    if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n    {\n        lwm2m_uri_t tempUri;\n        lwm2m_attributes_t *objParamP;\n        lwm2m_attributes_t *instParamP;\n\n        memset(&parentUri, 0, sizeof(lwm2m_uri_t));\n        tempUri.objectId = uriP->objectId;\n        tempUri.flag = LWM2M_URI_FLAG_OBJECT_ID;\n\n        // get object level attributes\n        objParamP = prv_findAttributes(contextP, &tempUri, serverP);\n\n        // get object instance level attributes\n        tempUri.instanceId = uriP->instanceId;\n        tempUri.flag = LWM2M_URI_FLAG_INSTANCE_ID;\n        instParamP = prv_findAttributes(contextP, &tempUri, serverP);\n\n        if (objParamP != NULL)\n        {\n            if (instParamP != NULL)\n            {\n                memset(&mergedParam, 0, sizeof(lwm2m_attributes_t));\n                mergedParam.toSet = objParamP->toSet | instParamP->toSet;\n                if (mergedParam.toSet & LWM2M_ATTR_FLAG_MIN_PERIOD)\n                {\n                    if (instParamP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD)\n                    {\n                        mergedParam.minPeriod = instParamP->minPeriod;\n                    }\n                    else\n                    {\n                        mergedParam.minPeriod = objParamP->minPeriod;\n                    }\n                }\n                if (mergedParam.toSet & LWM2M_ATTR_FLAG_MAX_PERIOD)\n                {\n                    if (instParamP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD)\n                    {\n                        mergedParam.maxPeriod = instParamP->maxPeriod;\n                    }\n                    else\n                    {\n                        mergedParam.maxPeriod = objParamP->maxPeriod;\n                    }\n                }\n                paramP = &mergedParam;\n            }\n            else\n            {\n                paramP = objParamP;\n            }\n        }\n        else\n        {\n            paramP = instParamP;\n        }\n        uriP->flag &= ~LWM2M_URI_FLAG_RESOURCE_ID;\n    }\n    else\n    {\n        paramP = NULL;\n\n        if (LWM2M_URI_IS_SET_INSTANCE(uriP))\n        {\n            PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_START, LINK_ITEM_START_SIZE);\n            PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE);\n            res = utils_intToText(uriP->objectId, bufferLink + head, PRV_LINK_BUFFER_SIZE - head);\n            if (res <= 0) return -1;\n            head += res;\n            PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE);\n            res = utils_intToText(uriP->instanceId, bufferLink + head, PRV_LINK_BUFFER_SIZE - head);\n            if (res <= 0) return -1;\n            head += res;\n            PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_END, LINK_ITEM_END_SIZE);\n            parentUri.instanceId = uriP->instanceId;\n            parentUri.flag = LWM2M_URI_FLAG_INSTANCE_ID;\n            if (serverP != NULL)\n            {\n                res = prv_serializeAttributes(contextP, &parentUri, serverP, NULL, bufferLink, head - 1, PRV_LINK_BUFFER_SIZE);\n                if (res < 0) return -1;    // careful, 0 is valid\n            }\n            else\n            {\n                res = 0;\n            }\n            head += res;\n        }\n        else\n        {\n            PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_START, LINK_ITEM_START_SIZE);\n            PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_URI_SEPARATOR, LINK_URI_SEPARATOR_SIZE);\n            res = utils_intToText(uriP->objectId, bufferLink + head, PRV_LINK_BUFFER_SIZE - head);\n            if (res <= 0) return -1;\n            head += res;\n            PRV_CONCAT_STR(bufferLink, PRV_LINK_BUFFER_SIZE, head, LINK_ITEM_END, LINK_ITEM_END_SIZE);\n\n            if (serverP != NULL)\n            {\n                res = prv_serializeAttributes(contextP, &parentUri, serverP, NULL, bufferLink, head - 1, PRV_LINK_BUFFER_SIZE);\n                if (res < 0) return -1;    // careful, 0 is valid\n                head += res;\n            }\n        }\n    }\n\n    baseUriLen = uri_toString(uriP, baseUriStr, URI_MAX_STRING_LEN, NULL);\n    if (baseUriLen < 0) return -1;\n    baseUriLen -= 1;\n\n    for (index = 0; index < size && head < PRV_LINK_BUFFER_SIZE; index++)\n    {\n        res = prv_serializeLinkData(contextP, dataP + index, serverP, paramP, uriP, baseUriStr, baseUriLen, bufferLink + head, PRV_LINK_BUFFER_SIZE - head);\n        if (res < 0) return -1;\n        head += res;\n    }\n\n    if (head > 0)\n    {\n        head -= 1;\n\n        *bufferP = (uint8_t *)lwm2m_malloc(head);\n        if (*bufferP == NULL) return 0;\n        memcpy(*bufferP, bufferLink, head);\n    }\n\n    return (int)head;\n}\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/er-coap-13/LICENSE",
    "content": "/*\n * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the Institute nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file is part of the Contiki operating system.\n */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/er-coap-13/er-coap-13.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*\n * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the Institute nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file is part of the Contiki operating system.\n */\n\n/**\n * \\file\n *      An implementation of the Constrained Application Protocol (draft 12)\n * \\author\n *      Matthias Kovatsch <kovatsch@inf.ethz.ch>\n * \\contributors\n *    David Navarro, Intel Corporation - Adapt to usage in liblwm2m\n */\n\n\n#include <stdlib.h>\n\n#include <string.h>\n#include <stdio.h>\n\n#include \"er-coap-13.h\"\n#include \"internals.h\"\n#include \"liblwm2m.h\" /* for lwm2m_malloc() and lwm2m_free() */\n\n#define DEBUG 0\n#if DEBUG\n#include <stdio.h>\n#define PRINTF(...) printf(__VA_ARGS__)\n#define PRINT6ADDR(addr) PRINTF(\"[%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x]\", ((uint8_t *)addr)[0], ((uint8_t *)addr)[1], ((uint8_t *)addr)[2], ((uint8_t *)addr)[3], ((uint8_t *)addr)[4], ((uint8_t *)addr)[5], ((uint8_t *)addr)[6], ((uint8_t *)addr)[7], ((uint8_t *)addr)[8], ((uint8_t *)addr)[9], ((uint8_t *)addr)[10], ((uint8_t *)addr)[11], ((uint8_t *)addr)[12], ((uint8_t *)addr)[13], ((uint8_t *)addr)[14], ((uint8_t *)addr)[15])\n#define PRINTLLADDR(lladdr) PRINTF(\"[%02x:%02x:%02x:%02x:%02x:%02x]\",(lladdr)->addr[0], (lladdr)->addr[1], (lladdr)->addr[2], (lladdr)->addr[3],(lladdr)->addr[4], (lladdr)->addr[5])\n#else\n#define PRINTF(...)\n#define PRINT6ADDR(addr)\n#define PRINTLLADDR(addr)\n#endif\n\n/*-----------------------------------------------------------------------------------*/\n/*- Variables -----------------------------------------------------------------------*/\n/*-----------------------------------------------------------------------------------*/\nstatic uint16_t current_mid = 0;\n\ncoap_status_t coap_error_code = NO_ERROR;\nconst char *coap_error_message = \"\";\n/*-----------------------------------------------------------------------------------*/\n/*- LOCAL HELP FUNCTIONS ------------------------------------------------------------*/\n/*-----------------------------------------------------------------------------------*/\nstatic\nuint16_t\ncoap_log_2(uint16_t value)\n{\n    uint16_t result = 0;\n    do\n    {\n        value = value >> 1;\n        result++;\n    }\n    while (value);\n\n    return result ? result - 1 : result;\n}\n/*-----------------------------------------------------------------------------------*/\nstatic\nuint32_t\ncoap_parse_int_option(uint8_t *bytes, size_t length)\n{\n    uint32_t var = 0;\n    size_t i = 0;\n    while (i < length)\n    {\n        var <<= 8;\n        var |= bytes[i++];\n    }\n    return var;\n}\n/*-----------------------------------------------------------------------------------*/\nstatic\nuint8_t\ncoap_option_nibble(unsigned int value)\n{\n    if (value < 13)\n    {\n        return value;\n    }\n    else if (value <= 0xFF + 13)\n    {\n        return 13;\n    }\n    else\n    {\n        return 14;\n    }\n}\n/*-----------------------------------------------------------------------------------*/\nstatic\nsize_t\ncoap_set_option_header(unsigned int delta, size_t length, uint8_t *buffer)\n{\n    size_t written = 0;\n    unsigned int *x = &delta;\n\n    buffer[0] = coap_option_nibble(delta) << 4 | coap_option_nibble(length);\n\n    /* avoids code duplication without function overhead */\n    do\n    {\n        if (*x > 268)\n        {\n            buffer[++written] = (*x - 269) >> 8;\n            buffer[++written] = (*x - 269);\n        }\n        else if (*x > 12)\n        {\n            buffer[++written] = (*x - 13);\n        }\n    }\n    while (x != (unsigned int *)&length && NULL != (x = (unsigned int *)&length));\n\n    PRINTF(\"WRITTEN %u B opt header\\n\", written);\n\n    return ++written;\n}\n/*-----------------------------------------------------------------------------------*/\nstatic\nsize_t\ncoap_serialize_int_option(unsigned int number, unsigned int current_number, uint8_t *buffer, uint32_t value)\n{\n    size_t i = 0;\n\n    if (0xFF000000 & value) ++i;\n    if (0xFFFF0000 & value) ++i;\n    if (0xFFFFFF00 & value) ++i;\n    if (0xFFFFFFFF & value) ++i;\n\n    PRINTF(\"OPTION %u (delta %u, len %u)\\n\", number, number - current_number, i);\n\n    i = coap_set_option_header(number - current_number, i, buffer);\n\n    if (0xFF000000 & value) buffer[i++] = (uint8_t) (value >> 24);\n    if (0xFFFF0000 & value) buffer[i++] = (uint8_t) (value >> 16);\n    if (0xFFFFFF00 & value) buffer[i++] = (uint8_t) (value >> 8);\n    if (0xFFFFFFFF & value) buffer[i++] = (uint8_t) (value);\n\n    return i;\n}\n/*-----------------------------------------------------------------------------------*/\nstatic\nsize_t\ncoap_serialize_array_option(unsigned int number, unsigned int current_number, uint8_t *buffer, uint8_t *array, size_t length, char split_char)\n{\n    size_t i = 0;\n\n    if (split_char != '\\0')\n    {\n        size_t j;\n        uint8_t *part_start = array;\n        uint8_t *part_end = NULL;\n        size_t temp_length;\n\n        for (j = 0; j <= length; ++j)\n        {\n            if (array[j] == split_char || j == length)\n            {\n                part_end = array + j;\n                temp_length = part_end - part_start;\n\n                i += coap_set_option_header(number - current_number, temp_length, &buffer[i]);\n                memcpy(&buffer[i], part_start, temp_length);\n                i += temp_length;\n\n                PRINTF(\"OPTION type %u, delta %u, len %u, part [%.*s]\\n\", number, number - current_number, i, temp_length, part_start);\n\n                ++j; /* skip the splitter */\n                current_number = number;\n                part_start = array + j;\n            }\n        } /* for */\n    }\n    else\n    {\n        i += coap_set_option_header(number - current_number, length, &buffer[i]);\n        memcpy(&buffer[i], array, length);\n        i += length;\n\n        PRINTF(\"OPTION type %u, delta %u, len %u\\n\", number, number - current_number, length);\n    }\n\n    return i;\n}\n/*-----------------------------------------------------------------------------------*/\nstatic\nsize_t\ncoap_serialize_multi_option(unsigned int number, unsigned int current_number, uint8_t *buffer, multi_option_t *array)\n{\n    size_t i = 0;\n    multi_option_t *j;\n\n    for (j = array; j != NULL; j = j->next)\n    {\n        i += coap_set_option_header(number - current_number, j->len, &buffer[i]);\n        current_number = number;\n        memcpy(&buffer[i], j->data, j->len);\n        i += j->len;\n    } /* for */\n\n    return i;\n}\n/*-----------------------------------------------------------------------------------*/\nstatic\nvoid\ncoap_merge_multi_option(uint8_t **dst, size_t *dst_len, uint8_t *option, size_t option_len, char separator)\n{\n    /* Merge multiple options. */\n    if (*dst_len > 0)\n    {\n        /* dst already contains an option: concatenate */\n        (*dst)[*dst_len] = separator;\n        *dst_len += 1;\n\n        /* memmove handles 2-byte option headers */\n        memmove((*dst) + (*dst_len), option, option_len);\n\n        *dst_len += option_len;\n    }\n    else\n    {\n        /* dst is empty: set to option */\n        *dst = option;\n        *dst_len = option_len;\n    }\n}\n\nvoid\ncoap_add_multi_option(multi_option_t **dst, uint8_t *option, size_t option_len, uint8_t is_static)\n{\n    multi_option_t *opt = (multi_option_t *)lwm2m_malloc(sizeof(multi_option_t));\n\n    if (opt)\n    {\n        opt->next = NULL;\n        opt->len = (uint8_t)option_len;\n        if (is_static)\n        {\n            opt->data = option;\n            opt->is_static = 1;\n        }\n        else\n        {\n            opt->is_static = 0;\n            opt->data = (uint8_t *)lwm2m_malloc(option_len);\n            if (opt->data == NULL)\n            {\n                lwm2m_free(opt);\n                return;\n            }\n            memcpy(opt->data, option, option_len);\n        }\n\n        if (*dst)\n        {\n            multi_option_t *i = *dst;\n            while (i->next)\n            {\n                i = i->next;\n            }\n            i->next = opt;\n        }\n        else\n        {\n            *dst = opt;\n        }\n    }\n}\n\nvoid\nfree_multi_option(multi_option_t *dst)\n{\n    if (dst)\n    {\n        multi_option_t *n = dst->next;\n        dst->next = NULL;\n        if (dst->is_static == 0)\n        {\n            lwm2m_free(dst->data);\n        }\n        lwm2m_free(dst);\n        free_multi_option(n);\n    }\n}\n\nchar *coap_get_multi_option_as_string(multi_option_t *option)\n{\n    size_t len = 0;\n    multi_option_t *opt;\n    char *output;\n\n    for (opt = option; opt != NULL; opt = opt->next)\n    {\n        len += opt->len + 1;     // for separator\n    }\n\n    output = lwm2m_malloc(len + 1); // for String terminator\n    if (output != NULL)\n    {\n        size_t i = 0;\n\n        for (opt = option; opt != NULL; opt = opt->next)\n        {\n            output[i] = '/';\n            i += 1;\n\n            memmove(output + i, opt->data, opt->len);\n            i += opt->len;\n        }\n        output[i] = 0;\n    }\n\n    return output;\n}\n\n/*-----------------------------------------------------------------------------------*/\nstatic\nint\ncoap_get_variable(const uint8_t *buffer, size_t length, const char *name, const char **output)\n{\n    const uint8_t *start = NULL;\n    const uint8_t *end = NULL;\n    const uint8_t *value_end = NULL;\n    size_t name_len = 0;\n\n    /*initialize the output buffer first*/\n    *output = 0;\n\n    name_len = strlen(name);\n    end = buffer + length;\n\n    for (start = buffer; start + name_len < end; ++start)\n    {\n        if ((start == buffer || start[-1] == '&') && start[name_len] == '=' &&\n                strncmp(name, (char *)start, name_len) == 0)\n        {\n\n            /* Point start to variable value */\n            start += name_len + 1;\n\n            /* Point end to the end of the value */\n            value_end = (const uint8_t *) memchr(start, '&', end - start);\n            if (value_end == NULL)\n            {\n                value_end = end;\n            }\n\n            *output = (char *)start;\n\n            return (value_end - start);\n        }\n    }\n\n    return 0;\n}\n\n/*-----------------------------------------------------------------------------------*/\nuint16_t\ncoap_get_mid()\n{\n    return ++current_mid;\n}\n/*-----------------------------------------------------------------------------------*/\n/*- MEASSAGE PROCESSING -------------------------------------------------------------*/\n/*-----------------------------------------------------------------------------------*/\nvoid\ncoap_init_message(void *packet, coap_message_type_t type, uint8_t code, uint16_t mid)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    /* Important thing */\n    memset(coap_pkt, 0, sizeof(coap_packet_t));\n\n    coap_pkt->type = type;\n    coap_pkt->code = code;\n    coap_pkt->mid = mid;\n}\n\nvoid\ncoap_free_header(void *packet)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    free_multi_option(coap_pkt->uri_path);\n    free_multi_option(coap_pkt->uri_query);\n    free_multi_option(coap_pkt->location_path);\n    coap_pkt->uri_path = NULL;\n    coap_pkt->uri_query = NULL;\n    coap_pkt->location_path = NULL;\n}\n\n/*-----------------------------------------------------------------------------------*/\nsize_t coap_serialize_get_size(void *packet)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n    size_t length = 0;\n\n    length = COAP_HEADER_LEN + coap_pkt->payload_len + coap_pkt->token_len;\n\n    if (IS_OPTION(coap_pkt, COAP_OPTION_IF_MATCH))\n    {\n        length += COAP_MAX_OPTION_HEADER_LEN + coap_pkt->if_match_len;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_URI_HOST))\n    {\n        length += COAP_MAX_OPTION_HEADER_LEN + coap_pkt->uri_host_len;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_ETAG))\n    {\n        length += COAP_MAX_OPTION_HEADER_LEN + coap_pkt->etag_len;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_IF_NONE_MATCH))\n    {\n        // can be stored in extended fields\n        length += COAP_MAX_OPTION_HEADER_LEN;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_OBSERVE))\n    {\n        // can be stored in extended fields\n        length += COAP_MAX_OPTION_HEADER_LEN;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_URI_PORT))\n    {\n        // can be stored in extended fields\n        length += COAP_MAX_OPTION_HEADER_LEN;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_LOCATION_PATH))\n    {\n        multi_option_t *optP;\n\n        for (optP = coap_pkt->location_path ; optP != NULL ; optP = optP->next)\n        {\n            length += COAP_MAX_OPTION_HEADER_LEN + optP->len;\n        }\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_URI_PATH))\n    {\n        multi_option_t *optP;\n\n        for (optP = coap_pkt->uri_path ; optP != NULL ; optP = optP->next)\n        {\n            length += COAP_MAX_OPTION_HEADER_LEN + optP->len;\n        }\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_CONTENT_TYPE))\n    {\n        // can be stored in extended fields\n        length += COAP_MAX_OPTION_HEADER_LEN;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_MAX_AGE))\n    {\n        // can be stored in extended fields\n        length += COAP_MAX_OPTION_HEADER_LEN;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_URI_QUERY))\n    {\n        multi_option_t *optP;\n\n        for (optP = coap_pkt->uri_query ; optP != NULL ; optP = optP->next)\n        {\n            length += COAP_MAX_OPTION_HEADER_LEN + optP->len;\n        }\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_ACCEPT))\n    {\n        length += coap_pkt->accept_num * COAP_MAX_OPTION_HEADER_LEN;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_LOCATION_QUERY))\n    {\n        length += COAP_MAX_OPTION_HEADER_LEN + coap_pkt->location_query_len;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_BLOCK2))\n    {\n        // can be stored in extended fields\n        length += COAP_MAX_OPTION_HEADER_LEN;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_BLOCK1))\n    {\n        // can be stored in extended fields\n        length += COAP_MAX_OPTION_HEADER_LEN;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_SIZE))\n    {\n        // can be stored in extended fields\n        length += COAP_MAX_OPTION_HEADER_LEN;\n    }\n    if (IS_OPTION(coap_pkt, COAP_OPTION_PROXY_URI))\n    {\n        length += COAP_MAX_OPTION_HEADER_LEN + coap_pkt->proxy_uri_len;\n    }\n\n    if (coap_pkt->payload_len)\n    {\n        // Account for the payload marker.\n        length += 1;\n    }\n\n    return length;\n}\n\n/*-----------------------------------------------------------------------------------*/\nsize_t\ncoap_serialize_message(void *packet, uint8_t *buffer)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n    uint8_t *option;\n    unsigned int current_number = 0;\n\n    /* Initialize */\n    coap_pkt->buffer = buffer;\n    coap_pkt->version = 1;\n\n    PRINTF(\"-Serializing MID %u to %p, \", coap_pkt->mid, coap_pkt->buffer);\n\n    /* set header fields */\n    coap_pkt->buffer[0]  = 0x00;\n    coap_pkt->buffer[0] |= COAP_HEADER_VERSION_MASK & (coap_pkt->version) << COAP_HEADER_VERSION_POSITION;\n    coap_pkt->buffer[0] |= COAP_HEADER_TYPE_MASK & (coap_pkt->type) << COAP_HEADER_TYPE_POSITION;\n    coap_pkt->buffer[0] |= COAP_HEADER_TOKEN_LEN_MASK & (coap_pkt->token_len) << COAP_HEADER_TOKEN_LEN_POSITION;\n    coap_pkt->buffer[1] = coap_pkt->code;\n    coap_pkt->buffer[2] = (uint8_t) ((coap_pkt->mid) >> 8);\n    coap_pkt->buffer[3] = (uint8_t) (coap_pkt->mid);\n\n    /* set Token */\n    PRINTF(\"Token (len %u)\", coap_pkt->token_len);\n    option = coap_pkt->buffer + COAP_HEADER_LEN;\n    for (current_number = 0; current_number < coap_pkt->token_len; ++current_number)\n    {\n        PRINTF(\" %02X\", coap_pkt->token[current_number]);\n        *option = coap_pkt->token[current_number];\n        ++option;\n    }\n    PRINTF(\"-\\n\");\n\n    /* Serialize options */\n    current_number = 0;\n\n    PRINTF(\"-Serializing options at %p-\\n\", option);\n\n    /* The options must be serialized in the order of their number */\n    COAP_SERIALIZE_BYTE_OPTION(   COAP_OPTION_IF_MATCH,       if_match, \"If-Match\")\n    COAP_SERIALIZE_STRING_OPTION( COAP_OPTION_URI_HOST,       uri_host, '\\0', \"Uri-Host\")\n    COAP_SERIALIZE_BYTE_OPTION(   COAP_OPTION_ETAG,           etag, \"ETag\")\n    COAP_SERIALIZE_INT_OPTION(    COAP_OPTION_IF_NONE_MATCH,  content_type - coap_pkt->content_type, \"If-None-Match\") /* hack to get a zero field */\n    COAP_SERIALIZE_INT_OPTION(    COAP_OPTION_OBSERVE,        observe, \"Observe\")\n    COAP_SERIALIZE_INT_OPTION(    COAP_OPTION_URI_PORT,       uri_port, \"Uri-Port\")\n    COAP_SERIALIZE_MULTI_OPTION(  COAP_OPTION_LOCATION_PATH,  location_path, \"Location-Path\")\n    COAP_SERIALIZE_MULTI_OPTION(  COAP_OPTION_URI_PATH,       uri_path, \"Uri-Path\")\n    COAP_SERIALIZE_INT_OPTION(    COAP_OPTION_CONTENT_TYPE,   content_type, \"Content-Format\")\n    COAP_SERIALIZE_INT_OPTION(    COAP_OPTION_MAX_AGE,        max_age, \"Max-Age\")\n    COAP_SERIALIZE_MULTI_OPTION(  COAP_OPTION_URI_QUERY,      uri_query, \"Uri-Query\")\n    COAP_SERIALIZE_ACCEPT_OPTION( COAP_OPTION_ACCEPT,         accept, \"Accept\")\n    COAP_SERIALIZE_STRING_OPTION( COAP_OPTION_LOCATION_QUERY, location_query, '&', \"Location-Query\")\n    COAP_SERIALIZE_BLOCK_OPTION(  COAP_OPTION_BLOCK2,         block2, \"Block2\")\n    COAP_SERIALIZE_BLOCK_OPTION(  COAP_OPTION_BLOCK1,         block1, \"Block1\")\n    COAP_SERIALIZE_INT_OPTION(    COAP_OPTION_SIZE,           size, \"Size\")\n    COAP_SERIALIZE_STRING_OPTION( COAP_OPTION_PROXY_URI,      proxy_uri, '\\0', \"Proxy-Uri\")\n\n    PRINTF(\"-Done serializing at %p----\\n\", option);\n\n    /* Free allocated header fields */\n    coap_free_header(packet);\n\n    /* Pack payload */\n    /* Payload marker */\n    if (coap_pkt->payload_len)\n    {\n        *option = 0xFF;\n        ++option;\n    }\n\n    memmove(option, coap_pkt->payload, coap_pkt->payload_len);\n\n    PRINTF(\"-Done %u B (header len %u, payload len %u)-\\n\", coap_pkt->payload_len + option - buffer, option - buffer, coap_pkt->payload_len);\n\n    PRINTF(\"Dump [0x%02X %02X %02X %02X  %02X %02X %02X %02X]\\n\",\n           coap_pkt->buffer[0],\n           coap_pkt->buffer[1],\n           coap_pkt->buffer[2],\n           coap_pkt->buffer[3],\n           coap_pkt->buffer[4],\n           coap_pkt->buffer[5],\n           coap_pkt->buffer[6],\n           coap_pkt->buffer[7]\n          );\n\n    return (option - buffer) + coap_pkt->payload_len; /* packet length */\n}\n/*-----------------------------------------------------------------------------------*/\ncoap_status_t\ncoap_parse_message(void *packet, uint8_t *data, uint16_t data_len)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n    uint8_t *current_option;\n    unsigned int option_number = 0;\n    unsigned int option_delta = 0;\n    size_t option_length = 0;\n    unsigned int *x;\n\n    /* Initialize packet */\n    memset(coap_pkt, 0, sizeof(coap_packet_t));\n\n    /* pointer to packet bytes */\n    coap_pkt->buffer = data;\n\n    /* parse header fields */\n    coap_pkt->version = (COAP_HEADER_VERSION_MASK & coap_pkt->buffer[0]) >> COAP_HEADER_VERSION_POSITION;\n    coap_pkt->type = (coap_message_type_t)((COAP_HEADER_TYPE_MASK & coap_pkt->buffer[0]) >> COAP_HEADER_TYPE_POSITION);\n    coap_pkt->token_len = MIN(COAP_TOKEN_LEN, (COAP_HEADER_TOKEN_LEN_MASK & coap_pkt->buffer[0]) >> COAP_HEADER_TOKEN_LEN_POSITION);\n    coap_pkt->code = coap_pkt->buffer[1];\n    coap_pkt->mid = coap_pkt->buffer[2] << 8 | coap_pkt->buffer[3];\n\n    if (coap_pkt->version != 1)\n    {\n        coap_error_message = \"CoAP version must be 1\";\n        return BAD_REQUEST_4_00;\n    }\n\n    current_option = data + COAP_HEADER_LEN;\n\n    if (coap_pkt->token_len != 0)\n    {\n        memcpy(coap_pkt->token, current_option, coap_pkt->token_len);\n        SET_OPTION(coap_pkt, COAP_OPTION_TOKEN);\n\n        PRINTF(\"Token (len %u) [0x%02X%02X%02X%02X%02X%02X%02X%02X]\\n\", coap_pkt->token_len,\n               coap_pkt->token[0],\n               coap_pkt->token[1],\n               coap_pkt->token[2],\n               coap_pkt->token[3],\n               coap_pkt->token[4],\n               coap_pkt->token[5],\n               coap_pkt->token[6],\n               coap_pkt->token[7]\n              ); /*FIXME always prints 8 bytes */\n    }\n\n    /* parse options */\n    current_option += coap_pkt->token_len;\n\n    while (current_option < data + data_len)\n    {\n        /* Payload marker 0xFF, currently only checking for 0xF* because rest is reserved */\n        if ((current_option[0] & 0xF0) == 0xF0)\n        {\n            coap_pkt->payload = ++current_option;\n            coap_pkt->payload_len = data_len - (coap_pkt->payload - data);\n\n            break;\n        }\n\n        option_delta = current_option[0] >> 4;\n        option_length = current_option[0] & 0x0F;\n        ++current_option;\n\n        /* avoids code duplication without function overhead */\n        x = &option_delta;\n        do\n        {\n            if (*x == 13)\n            {\n                *x += current_option[0];\n                ++current_option;\n            }\n            else if (*x == 14)\n            {\n                *x += 255;\n                *x += current_option[0] << 8;\n                ++current_option;\n                *x += current_option[0];\n                ++current_option;\n            }\n        }\n        while (x != (unsigned int *)&option_length && NULL != (x = (unsigned int *)&option_length));\n\n        option_number += option_delta;\n\n        if (current_option + option_length > data + data_len)\n        {\n            PRINTF(\"OPTION %u (delta %u, len %u) has invalid length.\\n\", option_number, option_delta, option_length);\n            return BAD_REQUEST_4_00;\n        }\n        else\n        {\n            PRINTF(\"OPTION %u (delta %u, len %u): \", option_number, option_delta, option_length);\n        }\n\n        SET_OPTION(coap_pkt, option_number);\n\n        switch (option_number)\n        {\n        case COAP_OPTION_CONTENT_TYPE:\n            coap_pkt->content_type = (coap_content_type_t)coap_parse_int_option(current_option, option_length);\n            PRINTF(\"Content-Format [%u]\\n\", coap_pkt->content_type);\n            break;\n        case COAP_OPTION_MAX_AGE:\n            coap_pkt->max_age = coap_parse_int_option(current_option, option_length);\n            PRINTF(\"Max-Age [%lu]\\n\", coap_pkt->max_age);\n            break;\n        case COAP_OPTION_ETAG:\n            coap_pkt->etag_len = (uint8_t)(MIN(COAP_ETAG_LEN, option_length));\n            memcpy(coap_pkt->etag, current_option, coap_pkt->etag_len);\n            PRINTF(\"ETag %u [0x%02X%02X%02X%02X%02X%02X%02X%02X]\\n\", coap_pkt->etag_len,\n                   coap_pkt->etag[0],\n                   coap_pkt->etag[1],\n                   coap_pkt->etag[2],\n                   coap_pkt->etag[3],\n                   coap_pkt->etag[4],\n                   coap_pkt->etag[5],\n                   coap_pkt->etag[6],\n                   coap_pkt->etag[7]\n                  ); /*FIXME always prints 8 bytes */\n            break;\n        case COAP_OPTION_ACCEPT:\n            if (coap_pkt->accept_num < COAP_MAX_ACCEPT_NUM)\n            {\n                coap_pkt->accept[coap_pkt->accept_num] = coap_parse_int_option(current_option, option_length);\n                coap_pkt->accept_num += 1;\n                PRINTF(\"Accept [%u]\\n\", coap_pkt->content_type);\n            }\n            break;\n        case COAP_OPTION_IF_MATCH:\n            /*FIXME support multiple ETags */\n            coap_pkt->if_match_len = (uint8_t)(MIN(COAP_ETAG_LEN, option_length));\n            memcpy(coap_pkt->if_match, current_option, coap_pkt->if_match_len);\n            PRINTF(\"If-Match %u [0x%02X%02X%02X%02X%02X%02X%02X%02X]\\n\", coap_pkt->if_match_len,\n                   coap_pkt->if_match[0],\n                   coap_pkt->if_match[1],\n                   coap_pkt->if_match[2],\n                   coap_pkt->if_match[3],\n                   coap_pkt->if_match[4],\n                   coap_pkt->if_match[5],\n                   coap_pkt->if_match[6],\n                   coap_pkt->if_match[7]\n                  ); /*FIXME always prints 8 bytes */\n            break;\n        case COAP_OPTION_IF_NONE_MATCH:\n            coap_pkt->if_none_match = 1;\n            PRINTF(\"If-None-Match\\n\");\n            break;\n\n        case COAP_OPTION_URI_HOST:\n            coap_pkt->uri_host = current_option;\n            coap_pkt->uri_host_len = option_length;\n            PRINTF(\"Uri-Host [%.*s]\\n\", coap_pkt->uri_host_len, coap_pkt->uri_host);\n            break;\n        case COAP_OPTION_URI_PORT:\n            coap_pkt->uri_port = coap_parse_int_option(current_option, option_length);\n            PRINTF(\"Uri-Port [%u]\\n\", coap_pkt->uri_port);\n            break;\n        case COAP_OPTION_URI_PATH:\n            /* coap_merge_multi_option() operates in-place on the IPBUF, but final packet field should be const string -> cast to string */\n            // coap_merge_multi_option( (char **) &(coap_pkt->uri_path), &(coap_pkt->uri_path_len), current_option, option_length, 0);\n            coap_add_multi_option( &(coap_pkt->uri_path), current_option, option_length, 1);\n            PRINTF(\"Uri-Path [%.*s]\\n\", option_length, current_option);\n            break;\n        case COAP_OPTION_URI_QUERY:\n            /* coap_merge_multi_option() operates in-place on the IPBUF, but final packet field should be const string -> cast to string */\n            // coap_merge_multi_option( (char **) &(coap_pkt->uri_query), &(coap_pkt->uri_query_len), current_option, option_length, '&');\n            coap_add_multi_option( &(coap_pkt->uri_query), current_option, option_length, 1);\n            PRINTF(\"Uri-Query [%.*s]\\n\", option_length, current_option);\n            break;\n\n        case COAP_OPTION_LOCATION_PATH:\n            coap_add_multi_option( &(coap_pkt->location_path), current_option, option_length, 1);\n            break;\n        case COAP_OPTION_LOCATION_QUERY:\n            /* coap_merge_multi_option() operates in-place on the IPBUF, but final packet field should be const string -> cast to string */\n            coap_merge_multi_option( &(coap_pkt->location_query), &(coap_pkt->location_query_len), current_option, option_length, '&');\n            PRINTF(\"Location-Query [%.*s]\\n\", option_length, current_option);\n            break;\n\n        case COAP_OPTION_PROXY_URI:\n            /*FIXME check for own end-point */\n            coap_pkt->proxy_uri = current_option;\n            coap_pkt->proxy_uri_len = option_length;\n            /*TODO length > 270 not implemented (actually not required) */\n            PRINTF(\"Proxy-Uri NOT IMPLEMENTED [%.*s]\\n\", coap_pkt->proxy_uri_len, coap_pkt->proxy_uri);\n            coap_error_message = \"This is a constrained server (Contiki)\";\n            return PROXYING_NOT_SUPPORTED_5_05;\n        //        break;\n\n        case COAP_OPTION_OBSERVE:\n            coap_pkt->observe = coap_parse_int_option(current_option, option_length);\n            PRINTF(\"Observe [%lu]\\n\", coap_pkt->observe);\n            break;\n        case COAP_OPTION_BLOCK2:\n            coap_pkt->block2_num = coap_parse_int_option(current_option, option_length);\n            coap_pkt->block2_more = (coap_pkt->block2_num & 0x08) >> 3;\n            coap_pkt->block2_size = 16 << (coap_pkt->block2_num & 0x07);\n            coap_pkt->block2_offset = (coap_pkt->block2_num & ~0x0000000F) << (coap_pkt->block2_num & 0x07);\n            coap_pkt->block2_num >>= 4;\n            PRINTF(\"Block2 [%lu%s (%u B/blk)]\\n\", coap_pkt->block2_num, coap_pkt->block2_more ? \"+\" : \"\", coap_pkt->block2_size);\n            break;\n        case COAP_OPTION_BLOCK1:\n            coap_pkt->block1_num = coap_parse_int_option(current_option, option_length);\n            coap_pkt->block1_more = (coap_pkt->block1_num & 0x08) >> 3;\n            coap_pkt->block1_size = 16 << (coap_pkt->block1_num & 0x07);\n            coap_pkt->block1_offset = (coap_pkt->block1_num & ~0x0000000F) << (coap_pkt->block1_num & 0x07);\n            coap_pkt->block1_num >>= 4;\n            PRINTF(\"Block1 [%lu%s (%u B/blk)]\\n\", coap_pkt->block1_num, coap_pkt->block1_more ? \"+\" : \"\", coap_pkt->block1_size);\n            break;\n        case COAP_OPTION_SIZE:\n            coap_pkt->size = coap_parse_int_option(current_option, option_length);\n            PRINTF(\"Size [%lu]\\n\", coap_pkt->size);\n            break;\n        default:\n            PRINTF(\"unknown (%u)\\n\", option_number);\n            /* Check if critical (odd) */\n            if (option_number & 1)\n            {\n                coap_error_message = \"Unsupported critical option\";\n                return BAD_OPTION_4_02;\n            }\n        }\n\n        current_option += option_length;\n    } /* for */\n    PRINTF(\"-Done parsing-------\\n\");\n\n\n\n    return NO_ERROR;\n}\n/*-----------------------------------------------------------------------------------*/\n/*- REST FRAMEWORK FUNCTIONS --------------------------------------------------------*/\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_query_variable(void *packet, const char *name, const char **output)\n{\n    /*\n      coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n      if (IS_OPTION(coap_pkt, COAP_OPTION_URI_QUERY)) {\n        return coap_get_variable(coap_pkt->uri_query, coap_pkt->uri_query_len, name, output);\n      }\n    */\n    return 0;\n}\n\nint\ncoap_get_post_variable(void *packet, const char *name, const char **output)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (coap_pkt->payload_len)\n    {\n        return coap_get_variable(coap_pkt->payload, coap_pkt->payload_len, name, output);\n    }\n    return 0;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_set_status_code(void *packet, unsigned int code)\n{\n    if (code <= 0xFF)\n    {\n        ((coap_packet_t *)packet)->code = (uint8_t) code;\n        return 1;\n    }\n    else\n    {\n        return 0;\n    }\n}\n/*-----------------------------------------------------------------------------------*/\n/*- HEADER OPTION GETTERS AND SETTERS -----------------------------------------------*/\n/*-----------------------------------------------------------------------------------*/\nunsigned int\ncoap_get_header_content_type(void *packet)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_CONTENT_TYPE)) return (unsigned int) - 1;\n\n    return coap_pkt->content_type;\n}\n\nint\ncoap_set_header_content_type(void *packet, unsigned int content_type)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    coap_pkt->content_type = (coap_content_type_t) content_type;\n    SET_OPTION(coap_pkt, COAP_OPTION_CONTENT_TYPE);\n    return 1;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_accept(void *packet, const uint16_t **accept)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_ACCEPT)) return 0;\n\n    *accept = coap_pkt->accept;\n    return coap_pkt->accept_num;\n}\n\nint\ncoap_set_header_accept(void *packet, uint16_t accept)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (coap_pkt->accept_num < COAP_MAX_ACCEPT_NUM)\n    {\n        coap_pkt->accept[coap_pkt->accept_num] = accept;\n        coap_pkt->accept_num += 1;\n\n        SET_OPTION(coap_pkt, COAP_OPTION_ACCEPT);\n    }\n    return coap_pkt->accept_num;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_max_age(void *packet, uint32_t *age)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_MAX_AGE))\n    {\n        *age = COAP_DEFAULT_MAX_AGE;\n    }\n    else\n    {\n        *age = coap_pkt->max_age;\n    }\n    return 1;\n}\n\nint\ncoap_set_header_max_age(void *packet, uint32_t age)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    coap_pkt->max_age = age;\n    SET_OPTION(coap_pkt, COAP_OPTION_MAX_AGE);\n    return 1;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_etag(void *packet, const uint8_t **etag)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_ETAG)) return 0;\n\n    *etag = coap_pkt->etag;\n    return coap_pkt->etag_len;\n}\n\nint\ncoap_set_header_etag(void *packet, const uint8_t *etag, size_t etag_len)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    coap_pkt->etag_len = (uint8_t)(MIN(COAP_ETAG_LEN, etag_len));\n    memcpy(coap_pkt->etag, etag, coap_pkt->etag_len);\n\n    SET_OPTION(coap_pkt, COAP_OPTION_ETAG);\n    return coap_pkt->etag_len;\n}\n/*-----------------------------------------------------------------------------------*/\n/*FIXME support multiple ETags */\nint\ncoap_get_header_if_match(void *packet, const uint8_t **etag)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_IF_MATCH)) return 0;\n\n    *etag = coap_pkt->if_match;\n    return coap_pkt->if_match_len;\n}\n\nint\ncoap_set_header_if_match(void *packet, const uint8_t *etag, size_t etag_len)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    coap_pkt->if_match_len = (uint8_t)(MIN(COAP_ETAG_LEN, etag_len));\n    memcpy(coap_pkt->if_match, etag, coap_pkt->if_match_len);\n\n    SET_OPTION(coap_pkt, COAP_OPTION_IF_MATCH);\n    return coap_pkt->if_match_len;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_if_none_match(void *packet)\n{\n    return IS_OPTION((coap_packet_t *)packet, COAP_OPTION_IF_NONE_MATCH) ? 1 : 0;\n}\n\nint\ncoap_set_header_if_none_match(void *packet)\n{\n    SET_OPTION((coap_packet_t *)packet, COAP_OPTION_IF_NONE_MATCH);\n    return 1;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_token(void *packet, const uint8_t **token)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_TOKEN)) return 0;\n\n    *token = coap_pkt->token;\n    return coap_pkt->token_len;\n}\n\nint\ncoap_set_header_token(void *packet, const uint8_t *token, size_t token_len)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    coap_pkt->token_len = (uint8_t)(MIN(COAP_TOKEN_LEN, token_len));\n    memcpy(coap_pkt->token, token, coap_pkt->token_len);\n\n    SET_OPTION(coap_pkt, COAP_OPTION_TOKEN);\n    return coap_pkt->token_len;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_proxy_uri(void *packet, const char **uri)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_PROXY_URI)) return 0;\n\n    *uri = (const char *)coap_pkt->proxy_uri;\n    return coap_pkt->proxy_uri_len;\n}\n\nint\ncoap_set_header_proxy_uri(void *packet, const char *uri)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    coap_pkt->proxy_uri = (uint8_t *)uri;\n    coap_pkt->proxy_uri_len = strlen(uri);\n\n    SET_OPTION(coap_pkt, COAP_OPTION_PROXY_URI);\n    return coap_pkt->proxy_uri_len;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_uri_host(void *packet, const char **host)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_URI_HOST)) return 0;\n\n    *host = (char *)coap_pkt->uri_host;\n    return coap_pkt->uri_host_len;\n}\n\nint\ncoap_set_header_uri_host(void *packet, const char *host)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    coap_pkt->uri_host = (uint8_t *)host;\n    coap_pkt->uri_host_len = strlen(host);\n\n    SET_OPTION(coap_pkt, COAP_OPTION_URI_HOST);\n    return coap_pkt->uri_host_len;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_uri_path(void *packet, const char **path)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_URI_PATH)) return 0;\n\n    *path = NULL; //coap_pkt->uri_path;\n    return 0; //coap_pkt->uri_path_len;\n}\n\nint\ncoap_set_header_uri_path(void *packet, const char *path)\n{\n    coap_packet_t *coap_pkt = (coap_packet_t *) packet;\n    int length = 0;\n\n    free_multi_option(coap_pkt->uri_path);\n    coap_pkt->uri_path = NULL;\n\n    if (path[0] == '/') ++path;\n\n    do\n    {\n        int i = 0;\n\n        while (path[i] != 0 && path[i] != '/') i++;\n        coap_add_multi_option(&(coap_pkt->uri_path), (uint8_t *)path, i, 0);\n\n        if (path[i] == '/') i++;\n        path += i;\n        length += i;\n    }\n    while (path[0] != 0);\n\n    SET_OPTION(coap_pkt, COAP_OPTION_URI_PATH);\n    return length;\n}\n\nint\ncoap_set_header_uri_path_segment(void *packet, const char *segment)\n{\n    coap_packet_t *coap_pkt = (coap_packet_t *) packet;\n    int length;\n\n    if (segment == NULL || segment[0] == 0)\n    {\n        coap_add_multi_option(&(coap_pkt->uri_path), NULL, 0, 1);\n        length = 0;\n    }\n    else\n    {\n        length = strlen(segment);\n        coap_add_multi_option(&(coap_pkt->uri_path), (uint8_t *)segment, length, 0);\n    }\n\n    SET_OPTION(coap_pkt, COAP_OPTION_URI_PATH);\n    return length;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_uri_query(void *packet, const char **query)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_URI_QUERY)) return 0;\n\n    *query = NULL; //coap_pkt->uri_query;\n    return 0; //coap_pkt->uri_query_len;\n}\n\nint\ncoap_set_header_uri_query(void *packet, const char *query)\n{\n    int length = 0;\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    free_multi_option(coap_pkt->uri_query);\n    coap_pkt->uri_query = NULL;\n\n    if (query[0] == '?') ++query;\n\n    do\n    {\n        int i = 0;\n\n        while (query[i] != 0 && query[i] != '&') i++;\n        coap_add_multi_option(&(coap_pkt->uri_query), (uint8_t *)query, i, 0);\n\n        if (query[i] == '&') i++;\n        query += i;\n        length += i;\n    }\n    while (query[0] != 0);\n\n    SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    return length;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_location_path(void *packet, const char **path)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_LOCATION_PATH)) return 0;\n\n    *path = NULL; //coap_pkt->location_path;\n    return 0; //coap_pkt->location_path_len;\n}\n\nint\ncoap_set_header_location_path(void *packet, const char *path)\n{\n    coap_packet_t *coap_pkt = (coap_packet_t *) packet;\n    int length = 0;\n\n    free_multi_option(coap_pkt->location_path);\n    coap_pkt->location_path = NULL;\n\n    if (path[0] == '/') ++path;\n\n    do\n    {\n        int i = 0;\n\n        while (path[i] != 0 && path[i] != '/') i++;\n        coap_add_multi_option(&(coap_pkt->location_path), (uint8_t *)path, i, 0);\n\n        if (path[i] == '/') i++;\n        path += i;\n        length += i;\n    }\n    while (path[0] != 0);\n\n    SET_OPTION(coap_pkt, COAP_OPTION_LOCATION_PATH);\n    return length;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_location_query(void *packet, const char **query)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_LOCATION_QUERY)) return 0;\n\n    *query = (const char *)coap_pkt->location_query;\n    return coap_pkt->location_query_len;\n}\n\nint\ncoap_set_header_location_query(void *packet, char *query)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    while (query[0] == '?') ++query;\n\n    coap_pkt->location_query = (uint8_t *)query;\n    coap_pkt->location_query_len = strlen(query);\n\n    SET_OPTION(coap_pkt, COAP_OPTION_LOCATION_QUERY);\n    return coap_pkt->location_query_len;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_observe(void *packet, uint32_t *observe)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_OBSERVE)) return 0;\n\n    *observe = coap_pkt->observe;\n    return 1;\n}\n\nint\ncoap_set_header_observe(void *packet, uint32_t observe)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    coap_pkt->observe = 0x00FFFFFF & observe;\n    SET_OPTION(coap_pkt, COAP_OPTION_OBSERVE);\n    return 1;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_block2(void *packet, uint32_t *num, uint8_t *more, uint16_t *size, uint32_t *offset)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_BLOCK2)) return 0;\n\n    /* pointers may be NULL to get only specific block parameters */\n    if (num != NULL) *num = coap_pkt->block2_num;\n    if (more != NULL) *more = coap_pkt->block2_more;\n    if (size != NULL) *size = coap_pkt->block2_size;\n    if (offset != NULL) *offset = coap_pkt->block2_offset;\n\n    return 1;\n}\n\nint\ncoap_set_header_block2(void *packet, uint32_t num, uint8_t more, uint16_t size)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (size < 16) return 0;\n    if (size > 2048) return 0;\n    if (num > 0x0FFFFF) return 0;\n\n    coap_pkt->block2_num = num;\n    coap_pkt->block2_more = more ? 1 : 0;\n    coap_pkt->block2_size = size;\n\n    SET_OPTION(coap_pkt, COAP_OPTION_BLOCK2);\n    return 1;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_block1(void *packet, uint32_t *num, uint8_t *more, uint16_t *size, uint32_t *offset)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_BLOCK1)) return 0;\n\n    /* pointers may be NULL to get only specific block parameters */\n    if (num != NULL) *num = coap_pkt->block1_num;\n    if (more != NULL) *more = coap_pkt->block1_more;\n    if (size != NULL) *size = coap_pkt->block1_size;\n    if (offset != NULL) *offset = coap_pkt->block1_offset;\n\n    return 1;\n}\n\nint\ncoap_set_header_block1(void *packet, uint32_t num, uint8_t more, uint16_t size)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (size < 16) return 0;\n    if (size > 2048) return 0;\n    if (num > 0x0FFFFF) return 0;\n\n    coap_pkt->block1_num = num;\n    coap_pkt->block1_more = more;\n    coap_pkt->block1_size = size;\n\n    SET_OPTION(coap_pkt, COAP_OPTION_BLOCK1);\n    return 1;\n}\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_header_size(void *packet, uint32_t *size)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (!IS_OPTION(coap_pkt, COAP_OPTION_SIZE)) return 0;\n\n    *size = coap_pkt->size;\n    return 1;\n}\n\nint\ncoap_set_header_size(void *packet, uint32_t size)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    coap_pkt->size = size;\n    SET_OPTION(coap_pkt, COAP_OPTION_SIZE);\n    return 1;\n}\n/*-----------------------------------------------------------------------------------*/\n/*- PAYLOAD -------------------------------------------------------------------------*/\n/*-----------------------------------------------------------------------------------*/\nint\ncoap_get_payload(void *packet, const uint8_t **payload)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    if (coap_pkt->payload)\n    {\n        *payload = coap_pkt->payload;\n        return coap_pkt->payload_len;\n    }\n    else\n    {\n        *payload = NULL;\n        return 0;\n    }\n}\n\nint\ncoap_set_payload(void *packet, const void *payload, size_t length)\n{\n    coap_packet_t *const coap_pkt = (coap_packet_t *) packet;\n\n    coap_pkt->payload = (uint8_t *) payload;\n    coap_pkt->payload_len = (uint16_t)(length);\n\n    return coap_pkt->payload_len;\n}\n/*-----------------------------------------------------------------------------------*/\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/er-coap-13/er-coap-13.h",
    "content": "/*\n * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the Institute nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file is part of the Contiki operating system.\n */\n\n/**\n * \\file\n *      An implementation of the Constrained Application Protocol (draft 12)\n * \\author\n *      Matthias Kovatsch <kovatsch@inf.ethz.ch>\n * \\contributors\n *    David Navarro, Intel Corporation - Adapt to usage in liblwm2m\n */\n\n\n#ifndef COAP_13_H_\n#define COAP_13_H_\n\n#include <stdint.h>\n#include <stddef.h> /* for size_t */\n\n/*\n * The maximum buffer size that is provided for resource responses and must be respected due to the limited IP buffer.\n * Larger data must be handled by the resource and will be sent chunk-wise through a TCP stream or CoAP blocks.\n */\n#ifndef REST_MAX_CHUNK_SIZE\n#define REST_MAX_CHUNK_SIZE     128\n#endif\n\n#define COAP_DEFAULT_MAX_AGE                 60\n#define COAP_RESPONSE_TIMEOUT                4\n#define COAP_MAX_RETRANSMIT                  4\n#define COAP_ACK_RANDOM_FACTOR               1.5\n#define COAP_MAX_LATENCY                     100\n#define COAP_PROCESSING_DELAY                COAP_RESPONSE_TIMEOUT\n\n#define COAP_MAX_TRANSMIT_WAIT               ((COAP_RESPONSE_TIMEOUT * ( (1 << (COAP_MAX_RETRANSMIT + 1) ) - 1) * COAP_ACK_RANDOM_FACTOR))\n#define COAP_MAX_TRANSMIT_SPAN               ((COAP_RESPONSE_TIMEOUT * ( (1 << COAP_MAX_RETRANSMIT) - 1) * COAP_ACK_RANDOM_FACTOR))\n#define COAP_EXCHANGE_LIFETIME               (COAP_MAX_TRANSMIT_SPAN + (2 * COAP_MAX_LATENCY) + COAP_PROCESSING_DELAY)\n\n#define COAP_HEADER_LEN                      4 /* | version:0x03 type:0x0C tkl:0xF0 | code | mid:0x00FF | mid:0xFF00 | */\n#define COAP_ETAG_LEN                        8 /* The maximum number of bytes for the ETag */\n#define COAP_TOKEN_LEN                       8 /* The maximum number of bytes for the Token */\n#define COAP_MAX_ACCEPT_NUM                  2 /* The maximum number of accept preferences to parse/store */\n\n#define COAP_MAX_OPTION_HEADER_LEN           5\n\n#define COAP_HEADER_VERSION_MASK             0xC0\n#define COAP_HEADER_VERSION_POSITION         6\n#define COAP_HEADER_TYPE_MASK                0x30\n#define COAP_HEADER_TYPE_POSITION            4\n#define COAP_HEADER_TOKEN_LEN_MASK           0x0F\n#define COAP_HEADER_TOKEN_LEN_POSITION       0\n\n#define COAP_HEADER_OPTION_DELTA_MASK        0xF0\n#define COAP_HEADER_OPTION_SHORT_LENGTH_MASK 0x0F\n\n/*\n * Conservative size limit, as not all options have to be set at the same time.\n */\n#ifndef COAP_MAX_HEADER_SIZE\n/*                            Hdr CoT Age  Tag              Obs  Tok               Blo strings */\n#define COAP_MAX_HEADER_SIZE  (4 + 3 + 5 + 1+COAP_ETAG_LEN + 3 + 1+COAP_TOKEN_LEN + 4 + 30) /* 70 */\n#endif /* COAP_MAX_HEADER_SIZE */\n\n#define COAP_MAX_PACKET_SIZE  (COAP_MAX_HEADER_SIZE + REST_MAX_CHUNK_SIZE)\n/*                                        0/14          48 for IPv6 (28 for IPv4) */\n#if COAP_MAX_PACKET_SIZE > (UIP_BUFSIZE - UIP_LLH_LEN - UIP_IPUDPH_LEN)\n//#error \"UIP_CONF_BUFFER_SIZE too small for REST_MAX_CHUNK_SIZE\"\n#endif\n\n\n/* Bitmap for set options */\nenum { OPTION_MAP_SIZE = sizeof(uint8_t) * 8 };\n#define SET_OPTION(packet, opt) {if (opt <= sizeof((packet)->options) * OPTION_MAP_SIZE) {(packet)->options[opt / OPTION_MAP_SIZE] |= 1 << (opt % OPTION_MAP_SIZE);}}\n#define IS_OPTION(packet, opt) ((opt <= sizeof((packet)->options) * OPTION_MAP_SIZE)?(packet)->options[opt / OPTION_MAP_SIZE] & (1 << (opt % OPTION_MAP_SIZE)):0)\n\n#ifndef MIN\n#define MIN(a, b) ((a) < (b)? (a) : (b))\n#endif /* MIN */\n\n/* CoAP message types */\ntypedef enum\n{\n    COAP_TYPE_CON, /* confirmables */\n    COAP_TYPE_NON, /* non-confirmables */\n    COAP_TYPE_ACK, /* acknowledgements */\n    COAP_TYPE_RST  /* reset */\n} coap_message_type_t;\n\n/* CoAP request method codes */\ntypedef enum\n{\n    COAP_GET = 1,\n    COAP_POST,\n    COAP_PUT,\n    COAP_DELETE\n} coap_method_t;\n\n/* CoAP response codes */\ntypedef enum\n{\n    NO_ERROR = 0,\n\n    CREATED_2_01 = 65,                    /* CREATED */\n    DELETED_2_02 = 66,                    /* DELETED */\n    VALID_2_03 = 67,                      /* NOT_MODIFIED */\n    CHANGED_2_04 = 68,                    /* CHANGED */\n    CONTENT_2_05 = 69,                    /* OK */\n\n    BAD_REQUEST_4_00 = 128,               /* BAD_REQUEST */\n    UNAUTHORIZED_4_01 = 129,              /* UNAUTHORIZED */\n    BAD_OPTION_4_02 = 130,                /* BAD_OPTION */\n    FORBIDDEN_4_03 = 131,                 /* FORBIDDEN */\n    NOT_FOUND_4_04 = 132,                 /* NOT_FOUND */\n    METHOD_NOT_ALLOWED_4_05 = 133,        /* METHOD_NOT_ALLOWED */\n    NOT_ACCEPTABLE_4_06 = 134,            /* NOT_ACCEPTABLE */\n    PRECONDITION_FAILED_4_12 = 140,       /* BAD_REQUEST */\n    REQUEST_ENTITY_TOO_LARGE_4_13 = 141,  /* REQUEST_ENTITY_TOO_LARGE */\n    UNSUPPORTED_MEDIA_TYPE_4_15 = 143,    /* UNSUPPORTED_MEDIA_TYPE */\n\n    INTERNAL_SERVER_ERROR_5_00 = 160,     /* INTERNAL_SERVER_ERROR */\n    NOT_IMPLEMENTED_5_01 = 161,           /* NOT_IMPLEMENTED */\n    BAD_GATEWAY_5_02 = 162,               /* BAD_GATEWAY */\n    SERVICE_UNAVAILABLE_5_03 = 163,       /* SERVICE_UNAVAILABLE */\n    GATEWAY_TIMEOUT_5_04 = 164,           /* GATEWAY_TIMEOUT */\n    PROXYING_NOT_SUPPORTED_5_05 = 165,    /* PROXYING_NOT_SUPPORTED */\n\n    /* Erbium errors */\n    MEMORY_ALLOCATION_ERROR = 192,\n    PACKET_SERIALIZATION_ERROR,\n\n    /* Erbium hooks */\n    MANUAL_RESPONSE\n\n} coap_status_t;\n\n/* CoAP header options */\ntypedef enum\n{\n    COAP_OPTION_IF_MATCH = 1,       /* 0-8 B */\n    COAP_OPTION_URI_HOST = 3,       /* 1-255 B */\n    COAP_OPTION_ETAG = 4,           /* 1-8 B */\n    COAP_OPTION_IF_NONE_MATCH = 5,  /* 0 B */\n    COAP_OPTION_OBSERVE = 6,        /* 0-3 B */\n    COAP_OPTION_URI_PORT = 7,       /* 0-2 B */\n    COAP_OPTION_LOCATION_PATH = 8,  /* 0-255 B */\n    COAP_OPTION_URI_PATH = 11,      /* 0-255 B */\n    COAP_OPTION_CONTENT_TYPE = 12,  /* 0-2 B */\n    COAP_OPTION_MAX_AGE = 14,       /* 0-4 B */\n    COAP_OPTION_URI_QUERY = 15,     /* 0-270 B */\n    COAP_OPTION_ACCEPT = 17,        /* 0-2 B */\n    COAP_OPTION_TOKEN = 19,         /* 1-8 B */\n    COAP_OPTION_LOCATION_QUERY = 20, /* 1-270 B */\n    COAP_OPTION_BLOCK2 = 23,        /* 1-3 B */\n    COAP_OPTION_BLOCK1 = 27,        /* 1-3 B */\n    COAP_OPTION_SIZE = 28,          /* 0-4 B */\n    COAP_OPTION_PROXY_URI = 35,     /* 1-270 B */\n    OPTION_MAX_VALUE = 0xFFFF\n} coap_option_t;\n\n/* CoAP Content-Types */\ntypedef enum\n{\n    TEXT_PLAIN = 0,\n    TEXT_XML = 1, /* Indented types are not in the initial registry. */\n    TEXT_CSV = 2,\n    TEXT_HTML = 3,\n    IMAGE_GIF = 21,\n    IMAGE_JPEG = 22,\n    IMAGE_PNG = 23,\n    IMAGE_TIFF = 24,\n    AUDIO_RAW = 25,\n    VIDEO_RAW = 26,\n    APPLICATION_LINK_FORMAT = 40,\n    APPLICATION_XML = 41,\n    APPLICATION_OCTET_STREAM = 42,\n    APPLICATION_RDF_XML = 43,\n    APPLICATION_SOAP_XML = 44,\n    APPLICATION_ATOM_XML = 45,\n    APPLICATION_XMPP_XML = 46,\n    APPLICATION_EXI = 47,\n    APPLICATION_FASTINFOSET = 48,\n    APPLICATION_SOAP_FASTINFOSET = 49,\n    APPLICATION_JSON = 50,\n    APPLICATION_X_OBIX_BINARY = 51,\n    CONTENT_MAX_VALUE = 0xFFFF\n} coap_content_type_t;\n\ntypedef struct _multi_option_t\n{\n    struct _multi_option_t* next;\n    uint8_t is_static;\n    uint8_t len;\n    uint8_t* data;\n} multi_option_t;\n\n/* Parsed message struct */\ntypedef struct\n{\n    uint8_t* buffer; /* pointer to CoAP header / incoming packet buffer / memory to serialize packet */\n\n    uint8_t version;\n    coap_message_type_t type;\n    uint8_t code;\n    uint16_t mid;\n\n    uint8_t options[COAP_OPTION_PROXY_URI / OPTION_MAP_SIZE + 1]; /* Bitmap to check if option is set */\n\n    coap_content_type_t content_type; /* Parse options once and store; allows setting options in random order  */\n    uint32_t max_age;\n    size_t proxy_uri_len;\n    const uint8_t* proxy_uri;\n    uint8_t etag_len;\n    uint8_t etag[COAP_ETAG_LEN];\n    size_t uri_host_len;\n    const uint8_t* uri_host;\n    multi_option_t* location_path;\n    uint16_t uri_port;\n    size_t location_query_len;\n    uint8_t* location_query;\n    multi_option_t* uri_path;\n    uint32_t observe;\n    uint8_t token_len;\n    uint8_t token[COAP_TOKEN_LEN];\n    uint8_t accept_num;\n    uint16_t accept[COAP_MAX_ACCEPT_NUM];\n    uint8_t if_match_len;\n    uint8_t if_match[COAP_ETAG_LEN];\n    uint32_t block2_num;\n    uint8_t block2_more;\n    uint16_t block2_size;\n    uint32_t block2_offset;\n    uint32_t block1_num;\n    uint8_t block1_more;\n    uint16_t block1_size;\n    uint32_t block1_offset;\n    uint32_t size;\n    multi_option_t* uri_query;\n    uint8_t if_none_match;\n\n    uint16_t payload_len;\n    uint8_t* payload;\n\n} coap_packet_t;\n\n/* Option format serialization*/\n#define COAP_SERIALIZE_INT_OPTION(number, field, text)  \\\n    if (IS_OPTION(coap_pkt, number)) { \\\n        PRINTF(text\" [%u]\\n\", coap_pkt->field); \\\n        option += coap_serialize_int_option(number, current_number, option, coap_pkt->field); \\\n        current_number = number; \\\n    }\n#define COAP_SERIALIZE_BYTE_OPTION(number, field, text)      \\\n    if (IS_OPTION(coap_pkt, number)) { \\\n        PRINTF(text\" %u [0x%02X%02X%02X%02X%02X%02X%02X%02X]\\n\", coap_pkt->field##_len, \\\n               coap_pkt->field[0], \\\n               coap_pkt->field[1], \\\n               coap_pkt->field[2], \\\n               coap_pkt->field[3], \\\n               coap_pkt->field[4], \\\n               coap_pkt->field[5], \\\n               coap_pkt->field[6], \\\n               coap_pkt->field[7] \\\n              ); /*FIXME always prints 8 bytes */ \\\n        option += coap_serialize_array_option(number, current_number, option, coap_pkt->field, coap_pkt->field##_len, '\\0'); \\\n        current_number = number; \\\n    }\n#define COAP_SERIALIZE_STRING_OPTION(number, field, splitter, text)      \\\n    if (IS_OPTION(coap_pkt, number)) { \\\n        PRINTF(text\" [%.*s]\\n\", coap_pkt->field##_len, coap_pkt->field); \\\n        option += coap_serialize_array_option(number, current_number, option, (uint8_t *) coap_pkt->field, coap_pkt->field##_len, splitter); \\\n        current_number = number; \\\n    }\n#define COAP_SERIALIZE_MULTI_OPTION(number, field, text)      \\\n    if (IS_OPTION(coap_pkt, number)) { \\\n        PRINTF(text); \\\n        option += coap_serialize_multi_option(number, current_number, option, coap_pkt->field); \\\n        current_number = number; \\\n    }\n#define COAP_SERIALIZE_ACCEPT_OPTION(number, field, text)  \\\n    if (IS_OPTION(coap_pkt, number)) { \\\n        int i; \\\n        for (i=0; i<coap_pkt->field##_num; ++i) \\\n        { \\\n            PRINTF(text\" [%u]\\n\", coap_pkt->field[i]); \\\n            option += coap_serialize_int_option(number, current_number, option, coap_pkt->field[i]); \\\n            current_number = number; \\\n        } \\\n    }\n#define COAP_SERIALIZE_BLOCK_OPTION(number, field, text)      \\\n    if (IS_OPTION(coap_pkt, number)) \\\n    { \\\n        uint32_t block = coap_pkt->field##_num << 4; \\\n        PRINTF(text\" [%lu%s (%u B/blk)]\\n\", coap_pkt->field##_num, coap_pkt->field##_more ? \"+\" : \"\", coap_pkt->field##_size); \\\n        if (coap_pkt->field##_more) block |= 0x8; \\\n        block |= 0xF & coap_log_2(coap_pkt->field##_size/16); \\\n        PRINTF(text\" encoded: 0x%lX\\n\", block); \\\n        option += coap_serialize_int_option(number, current_number, option, block); \\\n        current_number = number; \\\n    }\n\n/* To store error code and human-readable payload */\nextern const char* coap_error_message;\n\nuint16_t coap_get_mid(void);\n\nvoid coap_init_message(void* packet, coap_message_type_t type, uint8_t code, uint16_t mid);\nsize_t coap_serialize_get_size(void* packet);\nsize_t coap_serialize_message(void* packet, uint8_t* buffer);\ncoap_status_t coap_parse_message(void* request, uint8_t* data, uint16_t data_len);\nvoid coap_free_header(void* packet);\n\nchar* coap_get_multi_option_as_string(multi_option_t* option);\nvoid coap_add_multi_option(multi_option_t** dst, uint8_t* option, size_t option_len, uint8_t is_static);\nvoid free_multi_option(multi_option_t* dst);\n\nint coap_get_query_variable(void* packet, const char* name, const char** output);\nint coap_get_post_variable(void* packet, const char* name, const char** output);\n\n/*-----------------------------------------------------------------------------------*/\n\nint coap_set_status_code(void* packet, unsigned int code);\n\nunsigned int coap_get_header_content_type(void* packet);\nint coap_set_header_content_type(void* packet, unsigned int content_type);\n\nint coap_get_header_accept(void* packet, const uint16_t** accept);\nint coap_set_header_accept(void* packet, uint16_t accept);\n\nint coap_get_header_max_age(void* packet, uint32_t* age);\nint coap_set_header_max_age(void* packet, uint32_t age);\n\nint coap_get_header_etag(void* packet, const uint8_t** etag);\nint coap_set_header_etag(void* packet, const uint8_t* etag, size_t etag_len);\n\nint coap_get_header_if_match(void* packet, const uint8_t** etag);\nint coap_set_header_if_match(void* packet, const uint8_t* etag, size_t etag_len);\n\nint coap_get_header_if_none_match(void* packet);\nint coap_set_header_if_none_match(void* packet);\n\nint coap_get_header_token(void* packet, const uint8_t** token);\nint coap_set_header_token(void* packet, const uint8_t* token, size_t token_len);\n\nint coap_get_header_proxy_uri(void* packet, const char** uri); /* In-place string might not be 0-terminated. */\nint coap_set_header_proxy_uri(void* packet, const char* uri);\n\nint coap_get_header_uri_host(void* packet, const char** host); /* In-place string might not be 0-terminated. */\nint coap_set_header_uri_host(void* packet, const char* host);\n\nint coap_get_header_uri_path(void* packet, const char** path); /* In-place string might not be 0-terminated. */\nint coap_set_header_uri_path(void* packet, const char* path);\nint coap_set_header_uri_path_segment(void* packet, const char* path);\n\nint coap_get_header_uri_query(void* packet, const char** query); /* In-place string might not be 0-terminated. */\nint coap_set_header_uri_query(void* packet, const char* query);\n\nint coap_get_header_location_path(void* packet, const char** path); /* In-place string might not be 0-terminated. */\nint coap_set_header_location_path(void* packet, const char* path); /* Also splits optional query into Location-Query option. */\n\nint coap_get_header_location_query(void* packet, const char** query); /* In-place string might not be 0-terminated. */\nint coap_set_header_location_query(void* packet, char* query);\n\nint coap_get_header_observe(void* packet, uint32_t* observe);\nint coap_set_header_observe(void* packet, uint32_t observe);\n\nint coap_get_header_block2(void* packet, uint32_t* num, uint8_t* more, uint16_t* size, uint32_t* offset);\nint coap_set_header_block2(void* packet, uint32_t num, uint8_t more, uint16_t size);\n\nint coap_get_header_block1(void* packet, uint32_t* num, uint8_t* more, uint16_t* size, uint32_t* offset);\nint coap_set_header_block1(void* packet, uint32_t num, uint8_t more, uint16_t size);\n\nint coap_get_header_size(void* packet, uint32_t* size);\nint coap_set_header_size(void* packet, uint32_t size);\n\nint coap_get_payload(void* packet, const uint8_t** payload);\nint coap_set_payload(void* packet, const void* payload, size_t length);\n\n#endif /* COAP_13_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/internals.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Fabien Fleutot - Please refer to git log\n *    Toby Jaffey - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *    Scott Bertin - Please refer to git log\n *\n *******************************************************************************/\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n#ifndef _LWM2M_INTERNALS_H_\n#define _LWM2M_INTERNALS_H_\n\n#include \"liblwm2m.h\"\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdint.h>\n#include <stddef.h>\n#include <stdbool.h>\n\n#include \"er-coap-13/er-coap-13.h\"\n#include \"connection.h\"\n\n\n#ifdef LWM2M_WITH_LOGS\n#include <inttypes.h>\n#define LOG(STR) (void)lwm2m_printf(\"[%d][%s:%d] \" STR \"\\r\\n\", (uint32_t)lwm2m_gettime(), __func__ , __LINE__)\n#define LOG_ARG(FMT, ...) (void)lwm2m_printf(\"[%d][%s:%d] \" FMT \"\\r\\n\", (uint32_t)lwm2m_gettime(), __func__ , __LINE__ , __VA_ARGS__)\n#define LOG_URI(URI)                                                                \\\n{                                                                                   \\\n    if ((URI) == NULL) (void)lwm2m_printf(\"[%s:%d] NULL\\r\\n\", __func__ , __LINE__);     \\\n    else                                                                            \\\n    {                                                                               \\\n        (void)lwm2m_printf(\"[%s:%d] /%d\", __func__ , __LINE__ , (URI)->objectId);       \\\n        if (LWM2M_URI_IS_SET_INSTANCE(URI)) (void)lwm2m_printf(\"/%d\", (URI)->instanceId); \\\n        if (LWM2M_URI_IS_SET_RESOURCE(URI)) (void)lwm2m_printf(\"/%d\", (URI)->resourceId); \\\n        (void)lwm2m_printf(\"\\r\\n\");                                                       \\\n    }                                                                               \\\n}\n#define UNUSEX(x)\n#define STR_STATUS(S)                                           \\\n((S) == STATE_DEREGISTERED ? \"STATE_DEREGISTERED\" :             \\\n((S) == STATE_REG_PENDING ? \"STATE_REG_PENDING\" :               \\\n((S) == STATE_REGISTERED ? \"STATE_REGISTERED\" :                 \\\n((S) == STATE_REG_FAILED ? \"STATE_REG_FAILED\" :                 \\\n((S) == STATE_REG_UPDATE_PENDING ? \"STATE_REG_UPDATE_PENDING\" : \\\n((S) == STATE_REG_UPDATE_NEEDED ? \"STATE_REG_UPDATE_NEEDED\" :   \\\n((S) == STATE_REG_FULL_UPDATE_NEEDED ? \"STATE_REG_FULL_UPDATE_NEEDED\" :   \\\n((S) == STATE_DEREG_PENDING ? \"STATE_DEREG_PENDING\" :           \\\n((S) == STATE_BS_HOLD_OFF ? \"STATE_BS_HOLD_OFF\" :               \\\n((S) == STATE_BS_INITIATED ? \"STATE_BS_INITIATED\" :             \\\n((S) == STATE_BS_PENDING ? \"STATE_BS_PENDING\" :                 \\\n((S) == STATE_BS_FINISHED ? \"STATE_BS_FINISHED\" :               \\\n((S) == STATE_BS_FINISHING ? \"STATE_BS_FINISHING\" :             \\\n((S) == STATE_BS_FAILING ? \"STATE_BS_FAILING\" :                 \\\n((S) == STATE_BS_FAILED ? \"STATE_BS_FAILED\" :                   \\\n\"Unknown\")))))))))))))))\n#define STR_MEDIA_TYPE(M)                                \\\n((M) == LWM2M_CONTENT_TEXT ? \"LWM2M_CONTENT_TEXT\" :      \\\n((M) == LWM2M_CONTENT_LINK ? \"LWM2M_CONTENT_LINK\" :      \\\n((M) == LWM2M_CONTENT_OPAQUE ? \"LWM2M_CONTENT_OPAQUE\" :  \\\n((M) == LWM2M_CONTENT_TLV ? \"LWM2M_CONTENT_TLV\" :        \\\n((M) == LWM2M_CONTENT_JSON ? \"LWM2M_CONTENT_JSON\" :      \\\n\"Unknown\")))))\n#define STR_STATE(S)                                \\\n((S) == STATE_INITIAL ? \"STATE_INITIAL\" :      \\\n((S) == STATE_BOOTSTRAP_REQUIRED ? \"STATE_BOOTSTRAP_REQUIRED\" :      \\\n((S) == STATE_BOOTSTRAPPING ? \"STATE_BOOTSTRAPPING\" :  \\\n((S) == STATE_REGISTER_REQUIRED ? \"STATE_REGISTER_REQUIRED\" :        \\\n((S) == STATE_REGISTERING ? \"STATE_REGISTERING\" :      \\\n((S) == STATE_READY ? \"STATE_READY\" :      \\\n\"Unknown\"))))))\n#else\n#define UNUSEX(x) (x)=(x)\n#define LOG_ARG(FMT, ...)\n#define LOG(STR)\n#define LOG_URI(URI)\n#endif\n\n#define LWM2M_DEFAULT_LIFETIME  86400\n\n#ifdef LWM2M_SUPPORT_JSON\n#define REG_LWM2M_RESOURCE_TYPE     \">;rt=\\\"oma.lwm2m\\\";ct=11543,\"\n#define REG_LWM2M_RESOURCE_TYPE_LEN 25\n#else\n#define REG_LWM2M_RESOURCE_TYPE     \">;rt=\\\"oma.lwm2m\\\",\"\n#define REG_LWM2M_RESOURCE_TYPE_LEN 17\n#endif\n#define REG_START           \"<\"\n#define REG_DEFAULT_PATH    \"/\"\n\n#define REG_OBJECT_MIN_LEN  5   // \"</n>,\"\n#define REG_PATH_END        \">,\"\n#define REG_PATH_SEPARATOR  \"/\"\n\n#define REG_OBJECT_PATH             \"<%s/%hu>,\"\n#define REG_OBJECT_INSTANCE_PATH    \"<%s/%hu/%hu>,\"\n\n#define URI_REGISTRATION_SEGMENT        \"rd\"\n#define URI_REGISTRATION_SEGMENT_LEN    2\n#define URI_BOOTSTRAP_SEGMENT           \"bs\"\n#define URI_BOOTSTRAP_SEGMENT_LEN       2\n\n#define QUERY_STARTER       \"?\"\n#define QUERY_NAME          \"ep=\"\n#define QUERY_NAME_LEN      3       // strlen(\"ep=\")\n#define QUERY_SMS           \"sms=\"\n#define QUERY_SMS_LEN       4\n#define QUERY_LIFETIME      \"lt=\"\n#define QUERY_LIFETIME_LEN  3\n#define QUERY_VERSION       \"lwm2m=\"\n#define QUERY_VERSION_LEN   6\n#define QUERY_BINDING       \"b=\"\n#define QUERY_BINDING_LEN   2\n#define QUERY_DELIMITER     \"&\"\n\n#define LWM2M_VERSION      \"1.0\"\n#define LWM2M_VERSION_LEN  3\n\n#define QUERY_VERSION_FULL      QUERY_VERSION LWM2M_VERSION\n#define QUERY_VERSION_FULL_LEN  QUERY_VERSION_LEN+LWM2M_VERSION_LEN\n\n#define REG_URI_START       '<'\n#define REG_URI_END         '>'\n#define REG_DELIMITER       ','\n#define REG_ATTR_SEPARATOR  ';'\n#define REG_ATTR_EQUALS     '='\n#define REG_ATTR_TYPE_KEY           \"rt\"\n#define REG_ATTR_TYPE_KEY_LEN       2\n#define REG_ATTR_TYPE_VALUE         \"\\\"oma.lwm2m\\\"\"\n#define REG_ATTR_TYPE_VALUE_LEN     11\n#define REG_ATTR_CONTENT_KEY        \"ct\"\n#define REG_ATTR_CONTENT_KEY_LEN    2\n#define REG_ATTR_CONTENT_JSON       \"11543\"   // Temporary value\n#define REG_ATTR_CONTENT_JSON_LEN   5\n\n#define ATTR_SERVER_ID_STR       \"ep=\"\n#define ATTR_SERVER_ID_LEN       3\n#define ATTR_MIN_PERIOD_STR      \"pmin=\"\n#define ATTR_MIN_PERIOD_LEN      5\n#define ATTR_MAX_PERIOD_STR      \"pmax=\"\n#define ATTR_MAX_PERIOD_LEN      5\n#define ATTR_GREATER_THAN_STR    \"gt=\"\n#define ATTR_GREATER_THAN_LEN    3\n#define ATTR_LESS_THAN_STR       \"lt=\"\n#define ATTR_LESS_THAN_LEN       3\n#define ATTR_STEP_STR            \"st=\"\n#define ATTR_STEP_LEN            3\n#define ATTR_DIMENSION_STR       \"dim=\"\n#define ATTR_DIMENSION_LEN       4\n\n#define URI_MAX_STRING_LEN    18      // /65535/65535/65535\n#define _PRV_64BIT_BUFFER_SIZE 8\n\n#define LINK_ITEM_START             \"<\"\n#define LINK_ITEM_START_SIZE        1\n#define LINK_ITEM_END               \">,\"\n#define LINK_ITEM_END_SIZE          2\n#define LINK_ITEM_DIM_START         \">;dim=\"\n#define LINK_ITEM_DIM_START_SIZE    6\n#define LINK_ITEM_ATTR_END          \",\"\n#define LINK_ITEM_ATTR_END_SIZE     1\n#define LINK_URI_SEPARATOR          \"/\"\n#define LINK_URI_SEPARATOR_SIZE     1\n#define LINK_ATTR_SEPARATOR         \";\"\n#define LINK_ATTR_SEPARATOR_SIZE    1\n\n#define ATTR_FLAG_NUMERIC (uint8_t)(LWM2M_ATTR_FLAG_LESS_THAN | LWM2M_ATTR_FLAG_GREATER_THAN | LWM2M_ATTR_FLAG_STEP)\n\n#define LWM2M_URI_FLAG_DM           (uint8_t)0x00\n#define LWM2M_URI_FLAG_DELETE_ALL   (uint8_t)0x10\n#define LWM2M_URI_FLAG_REGISTRATION (uint8_t)0x20\n#define LWM2M_URI_FLAG_BOOTSTRAP    (uint8_t)0x40\n\n#define LWM2M_URI_MASK_TYPE (uint8_t)0x70\n#define LWM2M_URI_MASK_ID   (uint8_t)0x07\n\ntypedef struct\n{\n    uint16_t clientID;\n    lwm2m_uri_t uri;\n    lwm2m_result_callback_t callback;\n    void * userData;\n} dm_data_t;\n\ntypedef enum\n{\n    URI_DEPTH_OBJECT,\n    URI_DEPTH_OBJECT_INSTANCE,\n    URI_DEPTH_RESOURCE,\n    URI_DEPTH_RESOURCE_INSTANCE\n} uri_depth_t;\n\n#ifdef LWM2M_BOOTSTRAP_SERVER_MODE\ntypedef struct\n{\n    bool        isUri;\n    lwm2m_uri_t uri;\n    lwm2m_bootstrap_callback_t callback;\n    void *      userData;\n} bs_data_t;\n#endif\n\n// defined in uri.c\nlwm2m_uri_t * uri_decode(char * altPath, multi_option_t *uriPath);\nint uri_getNumber(uint8_t * uriString, size_t uriLength);\nint uri_toString(lwm2m_uri_t * uriP, uint8_t * buffer, size_t bufferLen, uri_depth_t * depthP);\n\n// defined in objects.c\nuint8_t object_readData(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, int * sizeP, lwm2m_data_t ** dataP, lwm2m_data_cfg_t *cfg, uint16_t serverId);\nuint8_t object_read(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_media_type_t * formatP, uint8_t ** bufferP, size_t * lengthP, uint16_t serverId);\nuint8_t object_write(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_media_type_t format, uint8_t * buffer, size_t length);\nuint8_t object_create(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_media_type_t format, uint8_t * buffer, size_t length);\nuint8_t object_execute(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, uint8_t * buffer, size_t length);\nuint8_t object_delete(lwm2m_context_t * contextP, lwm2m_uri_t * uriP);\nuint8_t object_discover(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP, uint8_t ** bufferP, size_t * lengthP);\nuint8_t object_checkReadable(lwm2m_context_t * contextP, lwm2m_uri_t * uriP);\nuint8_t object_checkNumeric(lwm2m_context_t * contextP, lwm2m_uri_t * uriP);\nbool object_isInstanceNew(lwm2m_context_t * contextP, uint16_t objectId, uint16_t instanceId);\nint object_getRegisterPayloadBufferLength(lwm2m_context_t * contextP);\nint object_getRegisterPayload(lwm2m_context_t * contextP, uint8_t * buffer, size_t length);\nint object_getServers(lwm2m_context_t * contextP, bool checkOnly);\nuint8_t object_createInstance(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_data_t * dataP);\nuint8_t object_writeInstance(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_data_t * dataP);\n\n// defined in transaction.c\nlwm2m_transaction_t * transaction_new(void * sessionH, unsigned char method, char * altPath, lwm2m_uri_t * uriP, uint16_t mID, uint8_t token_len, uint8_t* token);\nint transaction_send(lwm2m_context_t * contextP, lwm2m_transaction_t * transacP);\nvoid transaction_free(lwm2m_transaction_t * transacP);\nvoid transaction_remove(lwm2m_context_t * contextP, lwm2m_transaction_t * transacP);\nbool transaction_handleResponse(lwm2m_context_t * contextP, void * fromSessionH, coap_packet_t * message, coap_packet_t * response);\nvoid transaction_step(lwm2m_context_t * contextP, time_t currentTime, time_t * timeoutP);\n\n// defined in management.c\nuint8_t dm_handleRequest(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP, coap_packet_t * message, coap_packet_t * response);\n\n// defined in observe.c\nuint8_t observe_handleRequest(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP, int size, lwm2m_data_t * dataP, coap_packet_t * message, coap_packet_t * response);\nvoid observe_cancel(lwm2m_context_t * contextP, uint16_t mid, void * fromSessionH);\nuint8_t observe_setParameters(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP, lwm2m_attributes_t * attrP);\nvoid observe_step(lwm2m_context_t * contextP, time_t currentTime, time_t * timeoutP);\nvoid observe_clear(lwm2m_context_t * contextP, lwm2m_uri_t * uriP);\n//bool observe_handleNotify(lwm2m_context_t * contextP, void * fromSessionH, coap_packet_t * message, coap_packet_t * response);\nvoid observe_remove(lwm2m_observation_t * observationP);\nlwm2m_observed_t * observe_findByUri(lwm2m_context_t * contextP, lwm2m_uri_t * uriP);\n\n// defined in registration.c\n//uint8_t registration_handleRequest(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, void * fromSessionH, coap_packet_t * message, coap_packet_t * response);\nvoid registration_deregister(lwm2m_context_t * contextP, lwm2m_server_t * serverP);\nvoid registration_freeClient(lwm2m_client_t * clientP);\nuint8_t registration_start(lwm2m_context_t * contextP);\nvoid registration_step(lwm2m_context_t * contextP, time_t currentTime, time_t * timeoutP);\nlwm2m_status_t registration_getStatus(lwm2m_context_t * contextP);\nvoid registration_reset(lwm2m_context_t * contextP, lwm2m_server_t * serverP);\n\n// defined in packet.c\nuint8_t message_send(lwm2m_context_t * contextP, coap_packet_t * message, void * sessionH);\n\n// defined in bootstrap.c\nvoid bootstrap_step(lwm2m_context_t * contextP, uint32_t currentTime, time_t* timeoutP);\nuint8_t bootstrap_handleCommand(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP, coap_packet_t * message, coap_packet_t * response);\nuint8_t bootstrap_handleDeleteAll(lwm2m_context_t * context, void * fromSessionH);\nuint8_t bootstrap_handleFinish(lwm2m_context_t * context, void * fromSessionH);\nuint8_t bootstrap_handleRequest(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, void * fromSessionH, coap_packet_t * message, coap_packet_t * response);\nvoid bootstrap_start(lwm2m_context_t * contextP);\nlwm2m_status_t bootstrap_getStatus(lwm2m_context_t * contextP);\nbool bootstrap_isBsServerIpValid(const lwm2m_context_t *contextP);\n\n\n// defined in tlv.c\nint tlv_parse(uint8_t * buffer, size_t bufferLen, lwm2m_data_t ** dataP);\nint tlv_serialize(bool isResourceInstance, int size, lwm2m_data_t * dataP, uint8_t ** bufferP);\n\n// defined in json.c\n#ifdef LWM2M_SUPPORT_JSON\nint json_parse(lwm2m_uri_t * uriP, uint8_t * buffer, size_t bufferLen, lwm2m_data_t ** dataP);\nint json_serialize(lwm2m_uri_t * uriP, int size, lwm2m_data_t * tlvP, uint8_t ** bufferP);\n#endif\n\n// defined in discover.c\nint discover_serialize(lwm2m_context_t * contextP, lwm2m_uri_t * uriP, lwm2m_server_t * serverP, int size, lwm2m_data_t * dataP, uint8_t ** bufferP);\n\n// defined in block1.c\nuint8_t coap_block1_handler(lwm2m_block1_data_t ** block1Data, uint16_t mid, uint8_t * buffer, size_t length, uint16_t blockSize, uint32_t blockNum, bool blockMore, uint8_t ** outputBuffer, size_t * outputLength);\nvoid free_block1_buffer(lwm2m_block1_data_t * block1Data);\n\n// defined in utils.c\nlwm2m_data_type_t utils_depthToDatatype(uri_depth_t depth);\nlwm2m_binding_t utils_stringToBinding(uint8_t *buffer, size_t length);\nlwm2m_media_type_t utils_convertMediaType(coap_content_type_t type);\nint utils_isAltPathValid(const char * altPath);\nint utils_stringCopy(char * buffer, size_t length, const char * str);\nsize_t utils_intToText(int64_t data, uint8_t * string, size_t length);\nsize_t utils_floatToText(double data, uint8_t * string, size_t length);\nint utils_textToInt(uint8_t * buffer, int length, int64_t * dataP);\nint utils_textToFloat(uint8_t * buffer, int length, double * dataP);\nvoid utils_copyValue(void * dst, const void * src, size_t len);\nsize_t utils_base64GetSize(size_t dataLen);\nsize_t utils_base64Encode(uint8_t * dataP, size_t dataLen, uint8_t * bufferP, size_t bufferLen);\n#ifdef LWM2M_CLIENT_MODE\nlwm2m_server_t * utils_findServer(lwm2m_context_t * contextP, void * fromSessionH);\nlwm2m_server_t * utils_findBootstrapServer(lwm2m_context_t * contextP, void * fromSessionH);\n#endif\nstatic inline int dm_isUriOpaqueHandle(const lwm2m_uri_t * uriP)\n{\n    return (19 == uriP->objectId);\n}\n\n lwm2m_server_t * registration_get_registered_server(lwm2m_context_t * contextP);\nbool lwm2m_isBsCtrlInServerInitiatedBs(const lwm2m_context_t *contextP);\n\n\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/json.c",
    "content": "/*******************************************************************************\n *\n * Copyright (c) 2015 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *\n *******************************************************************************/\n\n\n#include \"internals.h\"\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <inttypes.h>\n\n\n#ifdef LWM2M_SUPPORT_JSON\n\n#define PRV_JSON_BUFFER_SIZE 1024\n\n#define JSON_MIN_ARRAY_LEN      21      // e\":[{\"n\":\"N\",\"v\":X}]}\n#define JSON_MIN_BASE_LEN        7      // n\":\"N\",\n#define JSON_ITEM_MAX_SIZE      36      // with ten characters for value\n#define JSON_MIN_BX_LEN          5      // bt\":1\n\n#define JSON_FALSE_STRING  \"false\"\n#define JSON_TRUE_STRING   \"true\"\n\n#define JSON_RES_ITEM_URI           \"{\\\"n\\\":\\\"\"\n#define JSON_RES_ITEM_URI_SIZE      6\n#define JSON_ITEM_BOOL_TRUE         \"\\\",\\\"bv\\\":true},\"\n#define JSON_ITEM_BOOL_TRUE_SIZE    13\n#define JSON_ITEM_BOOL_FALSE        \"\\\",\\\"bv\\\":false},\"\n#define JSON_ITEM_BOOL_FALSE_SIZE   14\n#define JSON_ITEM_NUM               \"\\\",\\\"v\\\":\"\n#define JSON_ITEM_NUM_SIZE          6\n#define JSON_ITEM_NUM_END           \"},\"\n#define JSON_ITEM_NUM_END_SIZE      2\n#define JSON_ITEM_STRING_BEGIN      \"\\\",\\\"sv\\\":\\\"\"\n#define JSON_ITEM_STRING_BEGIN_SIZE 8\n#define JSON_ITEM_STRING_END        \"\\\"},\"\n#define JSON_ITEM_STRING_END_SIZE   3\n\n#define JSON_BN_HEADER_1        \"{\\\"bn\\\":\\\"\"\n#define JSON_BN_HEADER_1_SIZE   7\n#define JSON_BN_HEADER_2        \"\\\",\\\"e\\\":[\"\n#define JSON_BN_HEADER_2_SIZE   7\n#define JSON_HEADER             \"{\\\"e\\\":[\"\n#define JSON_HEADER_SIZE        6\n#define JSON_FOOTER             \"]}\"\n#define JSON_FOOTER_SIZE        2\n\n\n#define _GO_TO_NEXT_CHAR(I,B,L)         \\\n    {                                   \\\n        I++;                            \\\n        I += prv_skipSpace(B+I, L-I);   \\\n        if (I == L) goto error;         \\\n    }\n\ntypedef enum\n{\n    _STEP_START,\n    _STEP_TOKEN,\n    _STEP_ANY_SEPARATOR,\n    _STEP_SEPARATOR,\n    _STEP_QUOTED_VALUE,\n    _STEP_VALUE,\n    _STEP_DONE\n} _itemState;\n\ntypedef enum\n{\n    _TYPE_UNSET,\n    _TYPE_FALSE,\n    _TYPE_TRUE,\n    _TYPE_FLOAT,\n    _TYPE_STRING\n} _type;\n\ntypedef struct\n{\n    uint16_t    ids[4];\n    _type       type;\n    uint8_t    *value;\n    size_t      valueLen;\n} _record_t;\n\nstatic int prv_isReserved(char sign)\n{\n    if (sign == '['\n            || sign == '{'\n            || sign == ']'\n            || sign == '}'\n            || sign == ':'\n            || sign == ','\n            || sign == '\"')\n    {\n        return 1;\n    }\n\n    return 0;\n}\n\nstatic int prv_isWhiteSpace(uint8_t sign)\n{\n    if (sign == 0x20\n            || sign == 0x09\n            || sign == 0x0A\n            || sign == 0x0D)\n    {\n        return 1;\n    }\n\n    return 0;\n}\n\nstatic size_t prv_skipSpace(uint8_t *buffer,\n                            size_t bufferLen)\n{\n    size_t i;\n\n    i = 0;\n    while ((i < bufferLen)\n            && prv_isWhiteSpace(buffer[i]))\n    {\n        i++;\n    }\n\n    return i;\n}\n\nstatic int prv_split(uint8_t *buffer,\n                     size_t bufferLen,\n                     int *tokenStartP,\n                     int *tokenLenP,\n                     int *valueStartP,\n                     int *valueLenP)\n{\n    size_t index;\n    _itemState step;\n\n    index = 0;\n    step = _STEP_START;\n\n    index = prv_skipSpace(buffer + index, bufferLen - index);\n    if (index == bufferLen) return -1;\n\n    while ((index < bufferLen)\n            && (buffer[index] != ','))\n    {\n        switch (step)\n        {\n        case _STEP_START:\n            if (buffer[index] != '\"') return -1;\n            *tokenStartP = index + 1;\n            step = _STEP_TOKEN;\n            break;\n\n        case _STEP_TOKEN:\n            if (buffer[index] == '\"')\n            {\n                *tokenLenP = index - *tokenStartP;\n                step = _STEP_ANY_SEPARATOR;\n            }\n            break;\n\n        case _STEP_ANY_SEPARATOR:\n            if (buffer[index] != ':') return -1;\n            step = _STEP_SEPARATOR;\n            break;\n\n        case _STEP_SEPARATOR:\n            if (buffer[index] == '\"')\n            {\n                *valueStartP = index;\n                step = _STEP_QUOTED_VALUE;\n            }\n            else if (!prv_isReserved(buffer[index]))\n            {\n                *valueStartP = index;\n                step = _STEP_VALUE;\n            }\n            else\n            {\n                return -1;\n            }\n            break;\n\n        case _STEP_QUOTED_VALUE:\n            if (buffer[index] == '\"' && buffer[index - 1] != '\\\\' )\n            {\n                *valueLenP = index - *valueStartP + 1;\n                step = _STEP_DONE;\n            }\n            break;\n\n        case _STEP_VALUE:\n            if (prv_isWhiteSpace(buffer[index]))\n            {\n                *valueLenP = index - *valueStartP;\n                step = _STEP_DONE;\n            }\n            break;\n\n        case _STEP_DONE:\n        default:\n            return -1;\n        }\n\n        index++;\n        if (step == _STEP_START\n                || step == _STEP_ANY_SEPARATOR\n                || step == _STEP_SEPARATOR\n                || step == _STEP_DONE)\n        {\n            index += prv_skipSpace(buffer + index, bufferLen - index);\n        }\n    }\n\n    if (step == _STEP_VALUE)\n    {\n        *valueLenP = index - *valueStartP;\n        step = _STEP_DONE;\n    }\n\n    if (step != _STEP_DONE) return -1;\n\n    return (int)index;\n}\n\nstatic int prv_countItems(uint8_t *buffer,\n                          size_t bufferLen)\n{\n    int count;\n    size_t index;\n    int in;\n\n    count = 0;\n    index = 0;\n    in = 0;\n\n    while (index < bufferLen)\n    {\n        if (in == 0)\n        {\n            if (buffer[index] != '{') return -1;\n            in = 1;\n            _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n        }\n        else\n        {\n            if (buffer[index] == '{') return -1;\n            if (buffer[index] == '}')\n            {\n                in = 0;\n                count++;\n                _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n                if (buffer[index] == ']')\n                {\n                    break;\n                }\n                if (buffer[index] != ',') return -1;\n                _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n            }\n            else\n            {\n                _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n            }\n        }\n    }\n    if (in == 1) return -1;\n\n    return count;\n\nerror:\n    return -1;\n}\n\nstatic int prv_parseItem(uint8_t *buffer,\n                         size_t bufferLen,\n                         _record_t *recordP)\n{\n    size_t index;\n\n    memset(recordP->ids, 0xFF, 4 * sizeof(uint16_t));\n    recordP->type = _TYPE_UNSET;\n    recordP->value = NULL;\n    recordP->valueLen = 0;\n\n    index = 0;\n    do\n    {\n        int tokenStart;\n        int tokenLen;\n        int valueStart;\n        int valueLen;\n        int next;\n\n        next = prv_split(buffer + index, bufferLen - index, &tokenStart, &tokenLen, &valueStart, &valueLen);\n        if (next < 0) return -1;\n\n        switch (tokenLen)\n        {\n        case 1:\n        {\n            switch (buffer[index + tokenStart])\n            {\n            case 'n':\n            {\n                int i;\n                int j;\n\n                if (recordP->ids[0] != LWM2M_MAX_ID) return -1;\n\n                // Check for \" around URI\n                if (valueLen < 3\n                        || buffer[index + valueStart] != '\"'\n                        || buffer[index + valueStart + valueLen - 1] != '\"')\n                {\n                    return -1;\n                }\n                // Ignore starting /\n                if (buffer[index + valueStart + 1] == '/')\n                {\n                    if (valueLen < 4)\n                    {\n                        return -1;\n                    }\n                    valueStart += 1;\n                    valueLen -= 1;\n                }\n                i = 0;\n                j = 0;\n                do\n                {\n                    uint32_t readId;\n\n                    readId = 0;\n                    i++;\n                    while (i < valueLen - 1 && buffer[index + valueStart + i] != '/')\n                    {\n                        if (buffer[index + valueStart + i] < '0'\n                                || buffer[index + valueStart + i] > '9')\n                        {\n                            return -1;\n                        }\n                        readId *= 10;\n                        readId += buffer[index + valueStart + i] - '0';\n                        if (readId > LWM2M_MAX_ID) return -1;\n                        i++;\n                    }\n                    recordP->ids[j] = readId;\n                    j++;\n                }\n                while (i < valueLen - 1 && j < 4 && buffer[index + valueStart + i] == '/');\n                if (i < valueLen - 1 ) return -1;\n            }\n            break;\n\n            case 'v':\n                if (recordP->type != _TYPE_UNSET) return -1;\n                recordP->type = _TYPE_FLOAT;\n                recordP->value = buffer + index + valueStart;\n                recordP->valueLen = valueLen;\n                break;\n\n            case 't':\n                // TODO: support time\n                break;\n\n            default:\n                return -1;\n            }\n        }\n        break;\n\n        case 2:\n        {\n            // \"bv\", \"ov\", or \"sv\"\n            if (buffer[index + tokenStart + 1] != 'v') return -1;\n            switch (buffer[index + tokenStart])\n            {\n            case 'b':\n                if (recordP->type != _TYPE_UNSET) return -1;\n                if (0 == lwm2m_strncmp(JSON_TRUE_STRING, (char *)buffer + index + valueStart, valueLen))\n                {\n                    recordP->type = _TYPE_TRUE;\n                }\n                else if (0 == lwm2m_strncmp(JSON_FALSE_STRING, (char *)buffer + index + valueStart, valueLen))\n                {\n                    recordP->type = _TYPE_FALSE;\n                }\n                else\n                {\n                    return -1;\n                }\n                break;\n\n            case 'o':\n                if (recordP->type != _TYPE_UNSET) return -1;\n                // TODO: support object link\n                break;\n\n            case 's':\n                if (recordP->type != _TYPE_UNSET) return -1;\n                // Check for \" around value\n                if (valueLen < 2\n                        || buffer[index + valueStart] != '\"'\n                        || buffer[index + valueStart + valueLen - 1] != '\"')\n                {\n                    return -1;\n                }\n                recordP->type = _TYPE_STRING;\n                recordP->value = buffer + index + valueStart + 1;\n                recordP->valueLen = valueLen - 2;\n                break;\n\n            default:\n                return -1;\n            }\n        }\n        break;\n\n        default:\n            return -1;\n        }\n\n        index += next + 1;\n    }\n    while (index < bufferLen);\n\n    return 0;\n}\n\nstatic bool prv_convertValue(_record_t *recordP,\n                             lwm2m_data_t *targetP)\n{\n    switch (recordP->type)\n    {\n    case _TYPE_FALSE:\n        lwm2m_data_encode_bool(false, targetP);\n        break;\n    case _TYPE_TRUE:\n        lwm2m_data_encode_bool(true, targetP);\n        break;\n    case _TYPE_FLOAT:\n    {\n        size_t i;\n\n        i = 0;\n        while (i < recordP->valueLen\n                && recordP->value[i] != '.')\n        {\n            i++;\n        }\n        if (i == recordP->valueLen)\n        {\n            int64_t value;\n\n            if ( 1 != utils_textToInt(recordP->value,\n                                      recordP->valueLen,\n                                      &value))\n            {\n                return false;\n            }\n\n            lwm2m_data_encode_int(value, targetP);\n        }\n        else\n        {\n            double value;\n\n            if ( 1 != utils_textToFloat(recordP->value,\n                                        recordP->valueLen,\n                                        &value))\n            {\n                return false;\n            }\n\n            lwm2m_data_encode_float(value, targetP);\n        }\n    }\n    break;\n\n    case _TYPE_STRING:\n        lwm2m_data_encode_opaque(recordP->value, recordP->valueLen, targetP);\n        targetP->type = LWM2M_TYPE_STRING;\n        break;\n\n    case _TYPE_UNSET:\n    default:\n        return false;\n    }\n\n    return true;\n}\n\nstatic lwm2m_data_t *prv_findDataItem(lwm2m_data_t *listP,\n                                      int count,\n                                      uint16_t id)\n{\n    int i;\n\n    i = 0;\n    while (i < count)\n    {\n        if (listP[i].type != LWM2M_TYPE_UNDEFINED && listP[i].id == id)\n        {\n            return listP + i;\n        }\n        i++;\n    }\n\n    return NULL;\n}\n\nstatic uri_depth_t prv_decreaseLevel(uri_depth_t level)\n{\n    switch(level)\n    {\n    case URI_DEPTH_OBJECT:\n        return URI_DEPTH_OBJECT_INSTANCE;\n    case URI_DEPTH_OBJECT_INSTANCE:\n        return URI_DEPTH_RESOURCE;\n    case URI_DEPTH_RESOURCE:\n        return URI_DEPTH_RESOURCE_INSTANCE;\n    case URI_DEPTH_RESOURCE_INSTANCE:\n        return URI_DEPTH_RESOURCE_INSTANCE;\n    default:\n        return URI_DEPTH_RESOURCE;\n    }\n}\n\nstatic lwm2m_data_t *prv_extendData(lwm2m_data_t *parentP)\n{\n    lwm2m_data_t *newP;\n\n    newP = lwm2m_data_new(parentP->value.asChildren.count + 1);\n    if (newP == NULL) return NULL;\n    if (parentP->value.asChildren.array != NULL)\n    {\n        memcpy(newP, parentP->value.asChildren.array, parentP->value.asChildren.count * sizeof(lwm2m_data_t));\n        lwm2m_free(parentP->value.asChildren.array);     // do not use lwm2m_data_free() to keep pointed values\n    }\n    parentP->value.asChildren.array = newP;\n    parentP->value.asChildren.count += 1;\n\n    return newP + parentP->value.asChildren.count - 1;\n}\n\nstatic int prv_convertRecord(lwm2m_uri_t *uriP,\n                             _record_t *recordArray,\n                             int count,\n                             lwm2m_data_t **dataP)\n{\n    int index;\n    int freeIndex;\n    lwm2m_data_t *rootP;\n    int size;\n    uri_depth_t rootLevel;\n\n    if (uriP == NULL)\n    {\n        size = count;\n        *dataP = lwm2m_data_new(count);\n        if (NULL == *dataP) return -1;\n        rootLevel = URI_DEPTH_OBJECT;\n        rootP = *dataP;\n    }\n    else\n    {\n        lwm2m_data_t *parentP;\n        size = 1;\n\n        *dataP = lwm2m_data_new(1);\n        if (NULL == *dataP) return -1;\n        (*dataP)->type = LWM2M_TYPE_OBJECT;\n        (*dataP)->id = uriP->objectId;\n        rootLevel = URI_DEPTH_OBJECT_INSTANCE;\n        parentP = *dataP;\n        if (LWM2M_URI_IS_SET_INSTANCE(uriP))\n        {\n            parentP->value.asChildren.count = 1;\n            parentP->value.asChildren.array = lwm2m_data_new(1);\n            if (NULL == parentP->value.asChildren.array) goto error;\n            parentP = parentP->value.asChildren.array;\n            parentP->type = LWM2M_TYPE_OBJECT_INSTANCE;\n            parentP->id = uriP->instanceId;\n            rootLevel = URI_DEPTH_RESOURCE;\n            if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n            {\n                parentP->value.asChildren.count = 1;\n                parentP->value.asChildren.array = lwm2m_data_new(1);\n                if (NULL == parentP->value.asChildren.array) goto error;\n                parentP = parentP->value.asChildren.array;\n                parentP->type = LWM2M_TYPE_UNDEFINED;\n                parentP->id = uriP->resourceId;\n                rootLevel = URI_DEPTH_RESOURCE_INSTANCE;\n            }\n        }\n        parentP->value.asChildren.count = count;\n        parentP->value.asChildren.array = lwm2m_data_new(count);\n        if (NULL == parentP->value.asChildren.array) goto error;\n        rootP = parentP->value.asChildren.array;\n    }\n\n    freeIndex = 0;\n    for (index = 0 ; index < count ; index++)\n    {\n        lwm2m_data_t *targetP;\n        int resSegmentIndex;\n        int i;\n\n        // check URI depth\n        // resSegmentIndex is set to the resource segment position\n        switch(rootLevel)\n        {\n        case URI_DEPTH_OBJECT:\n            resSegmentIndex = 2;\n            break;\n        case URI_DEPTH_OBJECT_INSTANCE:\n            resSegmentIndex = 1;\n            break;\n        case URI_DEPTH_RESOURCE:\n            resSegmentIndex = 0;\n            break;\n        case URI_DEPTH_RESOURCE_INSTANCE:\n            resSegmentIndex = -1;\n            break;\n        default:\n            goto error;\n        }\n        for (i = 0 ; i <= resSegmentIndex ; i++)\n        {\n            if (recordArray[index].ids[i] == LWM2M_MAX_ID) goto error;\n        }\n        if (resSegmentIndex < 2)\n        {\n            if (recordArray[index].ids[resSegmentIndex + 2] != LWM2M_MAX_ID) goto error;\n        }\n\n        targetP = prv_findDataItem(rootP, count, recordArray[index].ids[0]);\n        if (targetP == NULL)\n        {\n            targetP = rootP + freeIndex;\n            freeIndex++;\n            targetP->id = recordArray[index].ids[0];\n            targetP->type = utils_depthToDatatype(rootLevel);\n        }\n        if (recordArray[index].ids[1] != LWM2M_MAX_ID)\n        {\n            lwm2m_data_t *parentP;\n            uri_depth_t level;\n\n            parentP = targetP;\n            level = prv_decreaseLevel(rootLevel);\n            for (i = 1 ; i <= resSegmentIndex ; i++)\n            {\n                targetP = prv_findDataItem(parentP->value.asChildren.array, parentP->value.asChildren.count, recordArray[index].ids[i]);\n                if (targetP == NULL)\n                {\n                    targetP = prv_extendData(parentP);\n                    if (targetP == NULL) goto error;\n                    targetP->id = recordArray[index].ids[i];\n                    targetP->type = utils_depthToDatatype(level);\n                }\n                level = prv_decreaseLevel(level);\n                parentP = targetP;\n            }\n            if (recordArray[index].ids[resSegmentIndex + 1] != LWM2M_MAX_ID)\n            {\n                targetP->type = LWM2M_TYPE_MULTIPLE_RESOURCE;\n                targetP = prv_extendData(targetP);\n                if (targetP == NULL) goto error;\n                targetP->id = recordArray[index].ids[resSegmentIndex + 1];\n                targetP->type = LWM2M_TYPE_UNDEFINED;\n            }\n        }\n\n        if (true != prv_convertValue(recordArray + index, targetP)) goto error;\n    }\n\n    return size;\n\nerror:\n    lwm2m_data_free(size, *dataP);\n    *dataP = NULL;\n\n    return -1;\n}\n\nstatic int prv_dataStrip(int size,\n                         lwm2m_data_t *dataP,\n                         lwm2m_data_t **resultP)\n{\n    int i;\n    int j;\n    int realSize;\n\n    realSize = 0;\n    for (i = 0 ; i < size ; i++)\n    {\n        if (dataP[i].type != LWM2M_TYPE_UNDEFINED)\n        {\n            realSize++;\n        }\n    }\n\n    *resultP = lwm2m_data_new(realSize);\n    if (*resultP == NULL) return -1;\n\n    j = 0;\n    for (i = 0 ; i < size ; i++)\n    {\n        if (dataP[i].type != LWM2M_TYPE_UNDEFINED)\n        {\n            memcpy((*resultP) + j, dataP + i, sizeof(lwm2m_data_t));\n\n            if (dataP[i].type == LWM2M_TYPE_OBJECT\n                    || dataP[i].type == LWM2M_TYPE_OBJECT_INSTANCE\n                    || dataP[i].type == LWM2M_TYPE_MULTIPLE_RESOURCE)\n            {\n                int childLen;\n\n                childLen = prv_dataStrip(dataP[i].value.asChildren.count, dataP[i].value.asChildren.array, &((*resultP)[j].value.asChildren.array));\n                if (childLen <= 0)\n                {\n                    // skip this one\n                    j--;\n                }\n                else\n                {\n                    (*resultP)[j].value.asChildren.count = childLen;\n                }\n            }\n            else\n            {\n                dataP[i].value.asBuffer.buffer = NULL;\n            }\n\n            j++;\n        }\n    }\n\n    return realSize;\n}\n\nint json_parse(lwm2m_uri_t *uriP,\n               uint8_t *buffer,\n               size_t bufferLen,\n               lwm2m_data_t **dataP)\n{\n    size_t index;\n    int count = 0;\n    bool eFound = false;\n    bool bnFound = false;\n    bool btFound = false;\n    int bnStart;\n    int bnLen;\n    _record_t *recordArray;\n    lwm2m_data_t *parsedP;\n\n    LOG_ARG(\"bufferLen: %d, buffer: \\\"%s\\\"\", bufferLen, (char *)buffer);\n    LOG_URI(uriP);\n    *dataP = NULL;\n    recordArray = NULL;\n    parsedP = NULL;\n\n    index = prv_skipSpace(buffer, bufferLen);\n    if (index == bufferLen) return -1;\n\n    if (buffer[index] != '{') return -1;\n    do\n    {\n        _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n        if (buffer[index] != '\"') goto error;\n        if (index++ >= bufferLen) goto error;\n        switch (buffer[index])\n        {\n        case 'e':\n        {\n            int recordIndex;\n\n            if (bufferLen - index < JSON_MIN_ARRAY_LEN) goto error;\n            index++;\n            if (buffer[index] != '\"') goto error;\n            if (eFound == true) goto error;\n            eFound = true;\n\n            _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n            if (buffer[index] != ':') goto error;\n            _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n            if (buffer[index] != '[') goto error;\n            _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n            count = prv_countItems(buffer + index, bufferLen - index);\n            if (count <= 0) goto error;\n            recordArray = (_record_t *)lwm2m_malloc(count * sizeof(_record_t));\n            if (recordArray == NULL) goto error;\n            // at this point we are sure buffer[index] is '{' and all { and } are matching\n            recordIndex = 0;\n            while (recordIndex < count)\n            {\n                int itemLen;\n\n                if (buffer[index] != '{') goto error;\n                itemLen = 0;\n                while (buffer[index + itemLen] != '}') itemLen++;\n                if (0 != prv_parseItem(buffer + index + 1, itemLen - 1, recordArray + recordIndex))\n                {\n                    goto error;\n                }\n                recordIndex++;\n                index += itemLen;\n                _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n                switch (buffer[index])\n                {\n                case ',':\n                    _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n                    break;\n                case ']':\n                    if (recordIndex == count) break;\n                // else this is an error\n                default:\n                    goto error;\n                }\n            }\n            if (buffer[index] != ']') goto error;\n        }\n        break;\n\n        case 'b':\n            if (bufferLen - index < JSON_MIN_BX_LEN) goto error;\n            index++;\n            switch (buffer[index])\n            {\n            case 't':\n                index++;\n                if (buffer[index] != '\"') goto error;\n                if (btFound == true) goto error;\n                btFound = true;\n\n                // TODO: handle timed values\n                // temp: skip this token\n                while(index < bufferLen && buffer[index] != ',' && buffer[index] != '}') index++;\n                if (index == bufferLen) goto error;\n                index--;\n                // end temp\n                break;\n            case 'n':\n            {\n                int next;\n                int tokenStart;\n                int tokenLen;\n                int itemLen;\n\n                index++;\n                if (buffer[index] != '\"') goto error;\n                if (bnFound == true) goto error;\n                bnFound = true;\n                index -= 3;\n                itemLen = 0;\n                while (buffer[index + itemLen] != '}'\n                        && buffer[index + itemLen] != ','\n                        && index + itemLen < bufferLen)\n                {\n                    itemLen++;\n                }\n                if (index + itemLen == bufferLen) goto error;\n                next = prv_split(buffer + index, itemLen, &tokenStart, &tokenLen, &bnStart, &bnLen);\n                if (next < 0) goto error;\n                bnStart += index;\n                index += next - 1;\n            }\n            break;\n            default:\n                goto error;\n            }\n            break;\n\n        default:\n            goto error;\n        }\n\n        _GO_TO_NEXT_CHAR(index, buffer, bufferLen);\n    }\n    while (buffer[index] == ',');\n\n    if (buffer[index] != '}') goto error;\n\n    if (eFound == true)\n    {\n        lwm2m_uri_t baseURI;\n        lwm2m_uri_t *baseUriP;\n        lwm2m_data_t *resultP;\n        int size;\n\n        memset(&baseURI, 0, sizeof(lwm2m_uri_t));\n        if (bnFound == false)\n        {\n            baseUriP = uriP;\n        }\n        else\n        {\n            int res;\n\n            // we ignore the request URI and use the bn one.\n\n            // Check for \" around URI\n            if (bnLen < 3\n                    || buffer[bnStart] != '\"'\n                    || buffer[bnStart + bnLen - 1] != '\"')\n            {\n                goto error;\n            }\n            bnStart += 1;\n            bnLen -= 2;\n\n            if (bnLen == 1)\n            {\n                if (buffer[bnStart] != '/') goto error;\n                baseUriP = NULL;\n            }\n            else\n            {\n                res = lwm2m_stringToUri((char *)buffer + bnStart, bnLen, &baseURI);\n                if (res < 0 || res != bnLen) goto error;\n                baseUriP = &baseURI;\n            }\n        }\n\n        count = prv_convertRecord(baseUriP, recordArray, count, &parsedP);\n        lwm2m_free(recordArray);\n        recordArray = NULL;\n\n        if (count > 0 && uriP != NULL)\n        {\n            if (parsedP->type != LWM2M_TYPE_OBJECT || parsedP->id != uriP->objectId) goto error;\n            if (!LWM2M_URI_IS_SET_INSTANCE(uriP))\n            {\n                size = parsedP->value.asChildren.count;\n                resultP = parsedP->value.asChildren.array;\n            }\n            else\n            {\n                int i;\n\n                resultP = NULL;\n                // be permissive and allow full object JSON when requesting for a single instance\n                for (i = 0 ; i < (int)parsedP->value.asChildren.count && resultP == NULL; i++)\n                {\n                    lwm2m_data_t *targetP;\n\n                    targetP = parsedP->value.asChildren.array + i;\n                    if (targetP->id == uriP->instanceId)\n                    {\n                        resultP = targetP->value.asChildren.array;\n                        size = targetP->value.asChildren.count;\n                    }\n                }\n                if (resultP == NULL) goto error;\n                if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n                {\n                    lwm2m_data_t *resP;\n\n                    resP = NULL;\n                    for (i = 0 ; i < size && resP == NULL; i++)\n                    {\n                        lwm2m_data_t *targetP;\n\n                        targetP = resultP + i;\n                        if (targetP->id == uriP->resourceId)\n                        {\n                            if (targetP->type == LWM2M_TYPE_MULTIPLE_RESOURCE)\n                            {\n                                resP = targetP->value.asChildren.array;\n                                size = targetP->value.asChildren.count;\n                            }\n                            else\n                            {\n                                size = prv_dataStrip(1, targetP, &resP);\n                                if (size <= 0) goto error;\n                                lwm2m_data_free(count, parsedP);\n                                parsedP = NULL;\n                            }\n                        }\n                    }\n                    if (resP == NULL) goto error;\n                    resultP = resP;\n                }\n            }\n        }\n        else\n        {\n            resultP = parsedP;\n            size = count;\n        }\n\n        if (parsedP != NULL)\n        {\n            lwm2m_data_t *tempP;\n\n            size = prv_dataStrip(size, resultP, &tempP);\n            if (size <= 0) goto error;\n            lwm2m_data_free(count, parsedP);\n            resultP = tempP;\n        }\n        count = size;\n        *dataP = resultP;\n    }\n\n    LOG_ARG(\"Parsing successful. count: %d\", count);\n    return count;\n\nerror:\n    LOG(\"Parsing failed\");\n    if (parsedP != NULL)\n    {\n        lwm2m_data_free(count, parsedP);\n        parsedP = NULL;\n    }\n    if (recordArray != NULL)\n    {\n        lwm2m_free(recordArray);\n    }\n    return -1;\n}\n\nstatic int prv_serializeValue(lwm2m_data_t *tlvP,\n                              uint8_t *buffer,\n                              size_t bufferLen)\n{\n    int res;\n    int head;\n\n    switch (tlvP->type)\n    {\n    case LWM2M_TYPE_STRING:\n        if (bufferLen < JSON_ITEM_STRING_BEGIN_SIZE) return -1;\n        memcpy(buffer, JSON_ITEM_STRING_BEGIN, JSON_ITEM_STRING_BEGIN_SIZE);\n        head = JSON_ITEM_STRING_BEGIN_SIZE;\n\n        if (bufferLen - head < tlvP->value.asBuffer.length) return -1;\n        memcpy(buffer + head, tlvP->value.asBuffer.buffer, tlvP->value.asBuffer.length);\n        head += tlvP->value.asBuffer.length;\n\n        if (bufferLen - head < JSON_ITEM_STRING_END_SIZE) return -1;\n        memcpy(buffer + head, JSON_ITEM_STRING_END, JSON_ITEM_STRING_END_SIZE);\n        head += JSON_ITEM_STRING_END_SIZE;\n\n        break;\n\n    case LWM2M_TYPE_INTEGER:\n    {\n        int64_t value;\n\n        if (0 == lwm2m_data_decode_int(tlvP, &value)) return -1;\n\n        if (bufferLen < JSON_ITEM_NUM_SIZE) return -1;\n        memcpy(buffer, JSON_ITEM_NUM, JSON_ITEM_NUM_SIZE);\n        head = JSON_ITEM_NUM_SIZE;\n\n        res = utils_intToText(value, buffer + head, bufferLen - head);\n        if (res <= 0) return -1;\n        head += res;\n\n        if (bufferLen - head < JSON_ITEM_NUM_END_SIZE) return -1;\n        memcpy(buffer + head, JSON_ITEM_NUM_END, JSON_ITEM_NUM_END_SIZE);\n        head += JSON_ITEM_NUM_END_SIZE;\n    }\n    break;\n\n    case LWM2M_TYPE_FLOAT:\n    {\n        double value;\n\n        if (0 == lwm2m_data_decode_float(tlvP, &value)) return -1;\n\n        if (bufferLen < JSON_ITEM_NUM_SIZE) return -1;\n        memcpy(buffer, JSON_ITEM_NUM, JSON_ITEM_NUM_SIZE);\n        head = JSON_ITEM_NUM_SIZE;\n\n        res = utils_floatToText(value, buffer + head, bufferLen - head);\n        if (res <= 0) return -1;\n        head += res;\n\n        if (bufferLen - head < JSON_ITEM_NUM_END_SIZE) return -1;\n        memcpy(buffer + head, JSON_ITEM_NUM_END, JSON_ITEM_NUM_END_SIZE);\n        head += JSON_ITEM_NUM_END_SIZE;\n    }\n    break;\n\n    case LWM2M_TYPE_BOOLEAN:\n    {\n        bool value;\n\n        if (0 == lwm2m_data_decode_bool(tlvP, &value)) return -1;\n\n        if (value == true)\n        {\n            if (bufferLen < JSON_ITEM_BOOL_TRUE_SIZE) return -1;\n            memcpy(buffer, JSON_ITEM_BOOL_TRUE, JSON_ITEM_BOOL_TRUE_SIZE);\n            head = JSON_ITEM_BOOL_TRUE_SIZE;\n        }\n        else\n        {\n            if (bufferLen < JSON_ITEM_BOOL_FALSE_SIZE) return -1;\n            memcpy(buffer, JSON_ITEM_BOOL_FALSE, JSON_ITEM_BOOL_FALSE_SIZE);\n            head = JSON_ITEM_BOOL_FALSE_SIZE;\n        }\n    }\n    break;\n\n    case LWM2M_TYPE_OPAQUE:\n        if (bufferLen < JSON_ITEM_STRING_BEGIN_SIZE) return -1;\n        memcpy(buffer, JSON_ITEM_STRING_BEGIN, JSON_ITEM_STRING_BEGIN_SIZE);\n        head = JSON_ITEM_STRING_BEGIN_SIZE;\n\n        res = utils_base64Encode(tlvP->value.asBuffer.buffer, tlvP->value.asBuffer.length, buffer + head, bufferLen - head);\n        if (res == 0) return -1;\n        head += res;\n\n        if (bufferLen - head < JSON_ITEM_STRING_END_SIZE) return -1;\n        memcpy(buffer + head, JSON_ITEM_STRING_END, JSON_ITEM_STRING_END_SIZE);\n        head += JSON_ITEM_STRING_END_SIZE;\n        break;\n\n    case LWM2M_TYPE_OBJECT_LINK:\n        // TODO: implement\n        return -1;\n\n    default:\n        return -1;\n    }\n\n    return head;\n}\n\nint prv_serializeData(lwm2m_data_t *tlvP,\n                      uint8_t *parentUriStr,\n                      size_t parentUriLen,\n                      uint8_t *buffer,\n                      size_t bufferLen)\n{\n    int head;\n    int res;\n\n    head = 0;\n\n    switch (tlvP->type)\n    {\n    case LWM2M_TYPE_OBJECT:\n    case LWM2M_TYPE_OBJECT_INSTANCE:\n    case LWM2M_TYPE_MULTIPLE_RESOURCE:\n    {\n        uint8_t uriStr[URI_MAX_STRING_LEN];\n        size_t uriLen;\n        size_t index;\n\n        if (parentUriLen > 0)\n        {\n            if (URI_MAX_STRING_LEN < parentUriLen) return -1;\n            memcpy(uriStr, parentUriStr, parentUriLen);\n            uriLen = parentUriLen;\n        }\n        else\n        {\n            uriLen = 0;\n        }\n        res = utils_intToText(tlvP->id, uriStr + uriLen, URI_MAX_STRING_LEN - uriLen);\n        if (res <= 0) return -1;\n        uriLen += res;\n        uriStr[uriLen] = '/';\n        uriLen++;\n\n        head = 0;\n        for (index = 0 ; index < tlvP->value.asChildren.count; index++)\n        {\n            res = prv_serializeData(tlvP->value.asChildren.array + index, uriStr, uriLen, buffer + head, bufferLen - head);\n            if (res < 0) return -1;\n            head += res;\n        }\n    }\n    break;\n\n    default:\n        if (bufferLen < JSON_RES_ITEM_URI_SIZE) return -1;\n        memcpy(buffer, JSON_RES_ITEM_URI, JSON_RES_ITEM_URI_SIZE);\n        head = JSON_RES_ITEM_URI_SIZE;\n\n        if (parentUriLen > 0)\n        {\n            if (bufferLen - head < parentUriLen) return -1;\n            memcpy(buffer + head, parentUriStr, parentUriLen);\n            head += parentUriLen;\n        }\n\n        res = utils_intToText(tlvP->id, buffer + head, bufferLen - head);\n        if (res <= 0) return -1;\n        head += res;\n\n        res = prv_serializeValue(tlvP, buffer + head, bufferLen - head);\n        if (res < 0) return -1;\n        head += res;\n        break;\n    }\n\n    return head;\n}\n\nstatic int prv_findAndCheckData(lwm2m_uri_t *uriP,\n                                uri_depth_t level,\n                                size_t size,\n                                lwm2m_data_t *tlvP,\n                                lwm2m_data_t **targetP)\n{\n    size_t index;\n    int result;\n\n    if (size == 0) return 0;\n\n    if (size > 1)\n    {\n        if (tlvP[0].type == LWM2M_TYPE_OBJECT || tlvP[0].type == LWM2M_TYPE_OBJECT_INSTANCE)\n        {\n            for (index = 0; index < size; index++)\n            {\n                if (tlvP[index].type != tlvP[0].type)\n                {\n                    *targetP = NULL;\n                    return -1;\n                }\n            }\n        }\n        else\n        {\n            for (index = 0; index < size; index++)\n            {\n                if (tlvP[index].type == LWM2M_TYPE_OBJECT || tlvP[index].type == LWM2M_TYPE_OBJECT_INSTANCE)\n                {\n                    *targetP = NULL;\n                    return -1;\n                }\n            }\n        }\n    }\n\n    *targetP = NULL;\n    result = -1;\n    switch (level)\n    {\n    case URI_DEPTH_OBJECT:\n        if (tlvP[0].type == LWM2M_TYPE_OBJECT)\n        {\n            *targetP = tlvP;\n            result = (int)size;\n        }\n        break;\n\n    case URI_DEPTH_OBJECT_INSTANCE:\n        switch (tlvP[0].type)\n        {\n        case LWM2M_TYPE_OBJECT:\n            for (index = 0; index < size; index++)\n            {\n                if (tlvP[index].id == uriP->objectId)\n                {\n                    return prv_findAndCheckData(uriP, level, tlvP[index].value.asChildren.count, tlvP[index].value.asChildren.array, targetP);\n                }\n            }\n            break;\n        case LWM2M_TYPE_OBJECT_INSTANCE:\n            *targetP = tlvP;\n            result = (int)size;\n            break;\n        default:\n            break;\n        }\n        break;\n\n    case URI_DEPTH_RESOURCE:\n        switch (tlvP[0].type)\n        {\n        case LWM2M_TYPE_OBJECT:\n            for (index = 0; index < size; index++)\n            {\n                if (tlvP[index].id == uriP->objectId)\n                {\n                    return prv_findAndCheckData(uriP, level, tlvP[index].value.asChildren.count, tlvP[index].value.asChildren.array, targetP);\n                }\n            }\n            break;\n        case LWM2M_TYPE_OBJECT_INSTANCE:\n            for (index = 0; index < size; index++)\n            {\n                if (tlvP[index].id == uriP->instanceId)\n                {\n                    return prv_findAndCheckData(uriP, level, tlvP[index].value.asChildren.count, tlvP[index].value.asChildren.array, targetP);\n                }\n            }\n            break;\n        default:\n            *targetP = tlvP;\n            result = (int)size;\n            break;\n        }\n        break;\n\n    case URI_DEPTH_RESOURCE_INSTANCE:\n        switch (tlvP[0].type)\n        {\n        case LWM2M_TYPE_OBJECT:\n            for (index = 0; index < size; index++)\n            {\n                if (tlvP[index].id == uriP->objectId)\n                {\n                    return prv_findAndCheckData(uriP, level, tlvP[index].value.asChildren.count, tlvP[index].value.asChildren.array, targetP);\n                }\n            }\n            break;\n        case LWM2M_TYPE_OBJECT_INSTANCE:\n            for (index = 0; index < size; index++)\n            {\n                if (tlvP[index].id == uriP->instanceId)\n                {\n                    return prv_findAndCheckData(uriP, level, tlvP[index].value.asChildren.count, tlvP[index].value.asChildren.array, targetP);\n                }\n            }\n            break;\n        case LWM2M_TYPE_MULTIPLE_RESOURCE:\n            for (index = 0; index < size; index++)\n            {\n                if (tlvP[index].id == uriP->resourceId)\n                {\n                    return prv_findAndCheckData(uriP, level, tlvP[index].value.asChildren.count, tlvP[index].value.asChildren.array, targetP);\n                }\n            }\n            break;\n        default:\n            *targetP = tlvP;\n            result = (int)size;\n            break;\n        }\n        break;\n\n    default:\n        break;\n    }\n\n    return result;\n}\n\nint json_serialize(lwm2m_uri_t *uriP,\n                   int size,\n                   lwm2m_data_t *tlvP,\n                   uint8_t **bufferP)\n{\n    int index;\n    size_t head;\n    uint8_t bufferJSON[PRV_JSON_BUFFER_SIZE];\n    uint8_t baseUriStr[URI_MAX_STRING_LEN];\n    int baseUriLen;\n    uri_depth_t rootLevel;\n    int num;\n    lwm2m_data_t *targetP;\n\n    LOG_ARG(\"size: %d\", size);\n    LOG_URI(uriP);\n    if (size != 0 && tlvP == NULL) return -1;\n\n    baseUriLen = uri_toString(uriP, baseUriStr, URI_MAX_STRING_LEN, &rootLevel);\n    if (baseUriLen < 0) return -1;\n\n    num = prv_findAndCheckData(uriP, rootLevel, size, tlvP, &targetP);\n    if (num < 0) return -1;\n\n    while (num == 1\n            && (targetP->type == LWM2M_TYPE_OBJECT\n                || targetP->type == LWM2M_TYPE_OBJECT_INSTANCE\n                || targetP->type == LWM2M_TYPE_MULTIPLE_RESOURCE))\n    {\n        int res;\n\n        res = utils_intToText(targetP->id, baseUriStr + baseUriLen, URI_MAX_STRING_LEN - baseUriLen);\n        if (res <= 0) return 0;\n        baseUriLen += res;\n        if (baseUriLen >= URI_MAX_STRING_LEN - 1) return 0;\n        num = targetP->value.asChildren.count;\n        targetP = targetP->value.asChildren.array;\n        baseUriStr[baseUriLen] = '/';\n        baseUriLen++;\n    }\n\n    if (baseUriLen > 0)\n    {\n        memcpy(bufferJSON, JSON_BN_HEADER_1, JSON_BN_HEADER_1_SIZE);\n        head = JSON_BN_HEADER_1_SIZE;\n        memcpy(bufferJSON + head, baseUriStr, baseUriLen);\n        head += baseUriLen;\n        memcpy(bufferJSON + head, JSON_BN_HEADER_2, JSON_BN_HEADER_2_SIZE);\n        head += JSON_BN_HEADER_2_SIZE;\n    }\n    else\n    {\n        memcpy(bufferJSON, JSON_HEADER, JSON_HEADER_SIZE);\n        head = JSON_HEADER_SIZE;\n    }\n\n    for (index = 0 ; index < num && head < PRV_JSON_BUFFER_SIZE ; index++)\n    {\n        int res;\n\n        res = prv_serializeData(targetP + index, NULL, 0, bufferJSON + head, PRV_JSON_BUFFER_SIZE - head);\n        if (res < 0) return 0;\n        head += res;\n    }\n\n    if (head + JSON_FOOTER_SIZE - 1 > PRV_JSON_BUFFER_SIZE) return 0;\n\n    if (num > 0) head = head - 1;\n\n    memcpy(bufferJSON + head, JSON_FOOTER, JSON_FOOTER_SIZE);\n    head = head + JSON_FOOTER_SIZE;\n\n    *bufferP = (uint8_t *)lwm2m_malloc(head);\n    if (*bufferP == NULL) return 0;\n    memcpy(*bufferP, bufferJSON, head);\n\n    return head;\n}\n\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/liblwm2m.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Fabien Fleutot - Please refer to git log\n *    Simon Bernard - Please refer to git log\n *    Toby Jaffey - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n#include \"internals.h\"\n#include \"osdepends/atiny_osdep.h\"\n#include <stdlib.h>\n#include <string.h>\n\n#include <stdio.h>\n\n\nlwm2m_context_t *lwm2m_init(void *userData)\n{\n    lwm2m_context_t *contextP;\n\n    LOG(\"Entering\");\n    contextP = (lwm2m_context_t *)lwm2m_malloc(sizeof(lwm2m_context_t));\n    if (NULL != contextP)\n    {\n        memset(contextP, 0, sizeof(lwm2m_context_t));\n        contextP->userData = userData;\n        lwm2m_rand((void *)&contextP->nextMID, sizeof(contextP->nextMID));\n    }\n\n    return contextP;\n}\n\n#ifdef LWM2M_CLIENT_MODE\n\n\nstatic lwm2m_event_handler_t event_handler = NULL;\nvoid lwm2m_register_event_handler(lwm2m_event_handler_t callback)\n{\n    event_handler = callback;\n}\n\nvoid lwm2m_notify_even(module_type_t type, int code, const char *arg, int arg_len)\n{\n    if(event_handler != NULL)\n    {\n        event_handler(type, code, arg, arg_len);\n    }\n}\n\nvoid lwm2m_deregister(lwm2m_context_t *context)\n{\n    lwm2m_server_t *server = context->serverList;\n\n    LOG(\"Entering\");\n    while (NULL != server)\n    {\n        registration_deregister(context, server);\n        server = server->next;\n    }\n}\n\nstatic void prv_deleteServer(lwm2m_server_t *serverP, void *userData)\n{\n    // TODO parse transaction and observation to remove the ones related to this server\n    if (serverP->sessionH != NULL)\n    {\n        lwm2m_close_connection(serverP->sessionH, userData);\n    }\n    if (NULL != serverP->location)\n    {\n        lwm2m_free(serverP->location);\n    }\n    free_block1_buffer(serverP->block1Data);\n    lwm2m_free(serverP);\n}\n\nstatic void prv_deleteServerList(lwm2m_context_t *context)\n{\n    while (NULL != context->serverList)\n    {\n        lwm2m_server_t *server;\n        server = context->serverList;\n        context->serverList = server->next;\n        prv_deleteServer(server, context->userData);\n    }\n}\n\n#ifdef LWM2M_BOOTSTRAP\nstatic void prv_deleteBootstrapServer(lwm2m_server_t *serverP, void *userData)\n{\n    // TODO should we free location as in prv_deleteServer ?\n    // TODO should we parse transaction and observation to remove the ones related to this server ?\n    if (serverP->sessionH != NULL)\n    {\n        lwm2m_close_connection(serverP->sessionH, userData);\n    }\n    free_block1_buffer(serverP->block1Data);\n    lwm2m_free(serverP);\n}\n\nstatic void prv_deleteBootstrapServerList(lwm2m_context_t *context)\n{\n    while (NULL != context->bootstrapServerList)\n    {\n        lwm2m_server_t *server;\n        server = context->bootstrapServerList;\n        context->bootstrapServerList = server->next;\n        lwm2m_stop_striger_server_initiated_bs(server->sessionH);\n        prv_deleteBootstrapServer(server, context->userData);\n    }\n}\n#endif\n\nstatic void prv_deleteObservedList(lwm2m_context_t *contextP)\n{\n    atiny_mutex_lock(contextP->observe_mutex);\n    while (NULL != contextP->observedList)\n    {\n        lwm2m_observed_t *targetP;\n        lwm2m_watcher_t *watcherP;\n\n        targetP = contextP->observedList;\n        contextP->observedList = contextP->observedList->next;\n\n        lwm2m_notify_even(MODULE_URI, OBSERVE_UNSUBSCRIBE, (char *) & (targetP->uri), sizeof(targetP->uri));\n\n        for (watcherP = targetP->watcherList ; watcherP != NULL ; watcherP = watcherP->next)\n        {\n            if (watcherP->parameters != NULL) lwm2m_free(watcherP->parameters);\n        }\n        LWM2M_LIST_FREE(targetP->watcherList);\n\n        lwm2m_free(targetP);\n    }\n    atiny_mutex_unlock(contextP->observe_mutex);\n}\n#endif\n\nvoid prv_deleteTransactionList(lwm2m_context_t *context)\n{\n    while (NULL != context->transactionList)\n    {\n        lwm2m_transaction_t *transaction;\n\n        transaction = context->transactionList;\n        context->transactionList = context->transactionList->next;\n        if (transaction->callback != NULL)\n        {\n            transaction->callback(transaction, NULL);\n        }\n        transaction_free(transaction);\n    }\n}\n\nvoid lwm2m_close(lwm2m_context_t *contextP)\n{\n#ifdef LWM2M_CLIENT_MODE\n\n    LOG(\"Entering\");\n    lwm2m_deregister(contextP);\n    prv_deleteServerList(contextP);\n#ifdef LWM2M_BOOTSTRAP\n    prv_deleteBootstrapServerList(contextP);\n#endif\n    prv_deleteObservedList(contextP);\n    lwm2m_free(contextP->endpointName);\n    //lwm2m_free(contextP->bs_server_uri);\n    if (contextP->msisdn != NULL)\n    {\n        lwm2m_free(contextP->msisdn);\n    }\n    if (contextP->altPath != NULL)\n    {\n        lwm2m_free(contextP->altPath);\n    }\n\n#endif\n\n#ifdef LWM2M_SERVER_MODE\n    while (NULL != contextP->clientList)\n    {\n        lwm2m_client_t *clientP;\n\n        clientP = contextP->clientList;\n        contextP->clientList = contextP->clientList->next;\n\n        registration_freeClient(clientP);\n    }\n#endif\n\n    prv_deleteTransactionList(contextP);\n    lwm2m_free(contextP);\n}\n\n\nstatic bool prv_isBoostrpEnable(const lwm2m_context_t *contextP)\n{\n#ifdef LWM2M_BOOTSTRAP\n    return contextP->bsCtrl.bsType != BOOTSTRAP_FACTORY;\n#else\n    return false;\n#endif\n}\n\n/* BsCtrl bootstrap control is used to control the register(factory bootstrap(FBS)), client initiated bootstrap(CIBS),\nand server initiated bootstrap(CIBS).it try max time to register and the change to bootstrap(CIBS and SIBS) as the bs type.\nthe state is STATE_REGISTER_REQUIRED, STATE_BOOTSTRAP_REQUIRED and STATE_NON. CIBS is only state is STATE_BOOTSTRAP_REQUIRED,\n,cnt is 0 and bs type is BOOTSTRAP_SEQUENCE. cnt is used to calculte the delay for the next retry.\nDelay(cnt) = Base + Interval * cnt; Base and Interval are configured by different macros.\n*/\nbool lwm2m_isBsCtrlInServerInitiatedBs(const lwm2m_context_t *contextP)\n{\n    return (contextP->bsCtrl.bsType == BOOTSTRAP_SEQUENCE) && (contextP->bsCtrl.cnt == 0);\n}\n\nvoid lwm2m_initBsCtrlStat(lwm2m_context_t *contextP, lwm2m_bootstrap_type_e bs_type)\n{\n    memset(&contextP->bsCtrl, 0, sizeof(contextP->bsCtrl));\n    contextP->bsCtrl.bsType = bs_type;\n    contextP->bsCtrl.state = STATE_INITIAL;\n}\n\nstatic void lwm2m_setBsCtrlStatWithoutCheck(lwm2m_context_t *contextP, lwm2m_client_state_t state)\n{\n    if (contextP->bsCtrl.state != state)\n    {\n        contextP->bsCtrl.state = state;\n        contextP->bsCtrl.cnt = 0;\n        return;\n    }\n    {\n        uint32_t maxValue = ((STATE_REGISTER_REQUIRED == state)\n                            ? MAX_FACTORY_BS_RETRY_CNT : MAX_CLIENT_INITIATED_BS_RETRY_CNT);\n\n        if ((STATE_BOOTSTRAP_REQUIRED == state) && (BOOTSTRAP_SEQUENCE == contextP->bsCtrl.bsType))\n        {\n            maxValue++;\n        }\n        if(++(contextP->bsCtrl.cnt) >= maxValue)\n        {\n            contextP->bsCtrl.state = ((STATE_REGISTER_REQUIRED == contextP->bsCtrl.state)\n                                     ? STATE_BOOTSTRAP_REQUIRED :STATE_REGISTER_REQUIRED);\n            contextP->bsCtrl.cnt = 0;\n        }\n    }\n\n}\n\nvoid lwm2m_setBsCtrlStat(lwm2m_context_t *contextP, lwm2m_client_state_t state)\n{\n    lwm2m_client_state_t oldState = contextP->bsCtrl.state;\n    uint32_t oldCnt = contextP->bsCtrl.cnt;\n\n    lwm2m_setBsCtrlStatWithoutCheck(contextP, state);\n\n    if (STATE_REGISTER_REQUIRED == contextP->bsCtrl.state)\n    {\n        if (contextP->serverList == NULL)\n        {\n            contextP->bsCtrl.state = STATE_BOOTSTRAP_REQUIRED;\n            contextP->bsCtrl.cnt = 0;\n        }\n    }\n\n    if (STATE_BOOTSTRAP_REQUIRED == contextP->bsCtrl.state)\n    {\n        if ((!prv_isBoostrpEnable(contextP))\n            || (contextP->bootstrapServerList == NULL))\n        {\n            contextP->bsCtrl.state = STATE_REGISTER_REQUIRED;\n            contextP->bsCtrl.cnt = 0;\n            goto END;\n        }\n\n        // bootstrapServerList not empty, int CIBS but bs ip not valid.\n        if((!lwm2m_isBsCtrlInServerInitiatedBs(contextP))\n            #if defined(LWM2M_BOOTSTRAP)\n               && (!bootstrap_isBsServerIpValid(contextP))\n            #endif\n            )\n        {\n            //FBS\n            if (contextP->serverList)\n            {\n                contextP->bsCtrl.state = STATE_REGISTER_REQUIRED;\n                contextP->bsCtrl.cnt = 0;\n            }\n            // only in SIBS\n            else if ((contextP->serverList == NULL) && (contextP->bsCtrl.bsType == BOOTSTRAP_SEQUENCE))\n            {\n                contextP->bsCtrl.cnt = 0;\n            }\n            else\n            {\n            }\n        }\n    }\nEND:\n    if ((oldState != contextP->bsCtrl.state)\n        || (oldCnt != contextP->bsCtrl.cnt))\n    {\n        LOG_ARG(\"bsctrlstat (%d,%d) to (%d,%d)\", oldState, oldCnt,\n                    contextP->bsCtrl.state, contextP->bsCtrl.cnt);\n    }\n\n}\n\nstatic void lwm2m_delayBsRetry(lwm2m_context_t *contextP)\n{\n    uint32_t delayBase;\n    uint32_t delayInterval;\n    uint32_t cnt = contextP->bsCtrl.cnt;\n    uint32_t expireTime;\n\n    if (contextP->bsCtrl.state == STATE_REGISTER_REQUIRED)\n    {\n        delayBase = FACTORY_BS_DELAY_BASE;\n        delayInterval = FACTORY_BS_DELAY_INTERVAL;\n    }\n    else\n    {\n        delayBase = CLIENT_INITIATED_BS_DELAY_BASE;\n        delayInterval = CLIENT_INITIATED_BS_DELAY_INTERVAL;\n        if ((contextP->bsCtrl.bsType == BOOTSTRAP_SEQUENCE) && (cnt > 0))\n        {\n            cnt--;\n        }\n    }\n\n    expireTime = delayBase + delayInterval * cnt;\n    if (expireTime > 0)\n    {\n        lwm2m_delay(expireTime);\n    }\n}\n\nlwm2m_client_state_t lwm2m_getBsCtrlStat(const lwm2m_context_t *contextP)\n{\n    return contextP->bsCtrl.state;\n}\n\n\n#ifdef LWM2M_CLIENT_MODE\nstatic int prv_refreshServerList(lwm2m_context_t *contextP)\n{\n    lwm2m_server_t *targetP;\n    lwm2m_server_t *nextP;\n\n    // Remove all servers marked as dirty\n    targetP = contextP->bootstrapServerList;\n    contextP->bootstrapServerList = NULL;\n    while (targetP != NULL)\n    {\n        nextP = targetP->next;\n        targetP->next = NULL;\n        if (!targetP->dirty)\n        {\n            targetP->status = STATE_DEREGISTERED;\n            contextP->bootstrapServerList = (lwm2m_server_t *)LWM2M_LIST_ADD(contextP->bootstrapServerList, targetP);\n        }\n        else\n        {\n            prv_deleteServer(targetP, contextP->userData);\n        }\n        targetP = nextP;\n    }\n    targetP = contextP->serverList;\n    contextP->serverList = NULL;\n    while (targetP != NULL)\n    {\n        nextP = targetP->next;\n        targetP->next = NULL;\n        if (!targetP->dirty)\n        {\n            // TODO: Should we revert the status to STATE_DEREGISTERED ?\n            contextP->serverList = (lwm2m_server_t *)LWM2M_LIST_ADD(contextP->serverList, targetP);\n        }\n        else\n        {\n            prv_deleteServer(targetP, contextP->userData);\n        }\n        targetP = nextP;\n    }\n\n    return object_getServers(contextP, false);\n}\n//result = lwm2m_configure(lwm2mH, name, NULL, NULL, OBJ_COUNT, objArray)\nint lwm2m_configure(lwm2m_context_t *contextP,\n                    const char *endpointName,\n                    const char *msisdn,\n                    const char *altPath,\n                    uint16_t numObject,\n                    lwm2m_object_t *objectList[])\n{\n    int i;\n    uint8_t found;\n\n    //LOG_ARG(\"endpointName: \\\"%s\\\", msisdn: \\\"%s\\\", altPath: \\\"%s\\\", numObject: %d\", endpointName, msisdn, altPath, numObject);\n    // This API can be called only once for now\n    if (contextP->endpointName != NULL || contextP->objectList != NULL) return COAP_400_BAD_REQUEST;\n\n    if (endpointName == NULL) return COAP_400_BAD_REQUEST;\n    if (numObject < 3) return COAP_400_BAD_REQUEST;\n    // Check that mandatory objects are present\n    found = 0;\n    for (i = 0 ; i < numObject ; i++)\n    {\n        if(objectList[i] == NULL) // happens when undef CONFIG_FEATURE_FOTA\n            continue;\n        if (objectList[i]->objID == LWM2M_SECURITY_OBJECT_ID) found |= 0x01;\n        if (objectList[i]->objID == LWM2M_SERVER_OBJECT_ID) found |= 0x02;\n        if (objectList[i]->objID == LWM2M_DEVICE_OBJECT_ID) found |= 0x04;\n    }\n    if (found != 0x07) return COAP_400_BAD_REQUEST;\n    if (altPath != NULL)\n    {\n        if (0 == utils_isAltPathValid(altPath))\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n        if (altPath[1] == 0)\n        {\n            altPath = NULL;\n        }\n    }\n    contextP->endpointName = lwm2m_strdup(endpointName);\n    if (contextP->endpointName == NULL)\n    {\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    if (msisdn != NULL)\n    {\n        contextP->msisdn = lwm2m_strdup(msisdn);\n        if (contextP->msisdn == NULL)\n        {\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n    }\n\n    if (altPath != NULL)\n    {\n        contextP->altPath = lwm2m_strdup(altPath);\n        if (contextP->altPath == NULL)\n        {\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n    }\n\n    for (i = 0; i < numObject; i++)\n    {\n        if(objectList[i] == NULL) // happens when undef CONFIG_FEATURE_FOTA\n            continue;\n        objectList[i]->next = NULL;\n        contextP->objectList = (lwm2m_object_t *)LWM2M_LIST_ADD(contextP->objectList, objectList[i]);\n    }\n\n    return COAP_NO_ERROR;\n}\n\nint lwm2m_add_object(lwm2m_context_t *contextP,\n                     lwm2m_object_t *objectP)\n{\n    lwm2m_object_t *targetP;\n\n    LOG_ARG(\"ID: %d\", objectP->objID);\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, objectP->objID);\n    if (targetP != NULL) return COAP_406_NOT_ACCEPTABLE;\n    objectP->next = NULL;\n\n    contextP->objectList = (lwm2m_object_t *)LWM2M_LIST_ADD(contextP->objectList, objectP);\n\n    if (contextP->state == STATE_READY)\n    {\n        return lwm2m_update_registration(contextP, 0, true);\n    }\n\n    return COAP_NO_ERROR;\n}\n\nint lwm2m_remove_object(lwm2m_context_t *contextP,\n                        uint16_t id)\n{\n    lwm2m_object_t *targetP;\n\n    LOG_ARG(\"ID: %d\", id);\n    contextP->objectList = (lwm2m_object_t *)LWM2M_LIST_RM(contextP->objectList, id, &targetP);\n\n    if (targetP == NULL) return COAP_404_NOT_FOUND;\n\n    if (contextP->state == STATE_READY)\n    {\n        return lwm2m_update_registration(contextP, 0, true);\n    }\n\n    return 0;\n}\n\n\nstatic void lwm2m_reset_register(lwm2m_context_t *context)\n{\n    lwm2m_server_t *server = context->serverList;\n\n    LOG(\"Entering\");\n    while (NULL != server)\n    {\n        registration_reset(context, server);\n        server = server->next;\n    }\n}\n\nint lwm2m_reconnect(lwm2m_context_t *context)\n{\n    if(NULL == context)\n    {\n        LOG(\"context null point\");\n        return COAP_405_METHOD_NOT_ALLOWED;\n    }\n\n    lwm2m_reset_register(context);\n    prv_deleteObservedList(context);\n    prv_deleteTransactionList(context);\n    lwm2m_setBsCtrlStat(context, STATE_REGISTER_REQUIRED);\n    context->state = lwm2m_getBsCtrlStat(context);\n    lwm2m_notify_even(MODULE_LWM2M, STATE_REG_FAILED, NULL, 0);\n    return COAP_NO_ERROR;\n}\n\nint lwm2m_initBootStrap(lwm2m_context_t *contextP, lwm2m_bootstrap_type_e bsType)\n{\n    if (NULL == contextP)\n    {\n        LOG(\"context null point\");\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    contextP->regist_first_flag = ((bsType == BOOTSTRAP_CLIENT_INITIATED) ? false : true);\n    lwm2m_initBsCtrlStat(contextP, bsType);\n    return COAP_NO_ERROR;\n}\n\n#endif\n\n\n\n#define SET_BS_LATER(contextP, newState) \\\ndo{\\\n    lwm2m_setBsCtrlStat(contextP, newState);\\\n    contextP->state = lwm2m_getBsCtrlStat(contextP);\\\n    lwm2m_delayBsRetry(contextP);\\\n}while(0)\n\nint lwm2m_step(lwm2m_context_t *contextP,\n               time_t *timeoutP)\n{\n    time_t tv_sec;\n    int result;\n    lwm2m_client_state_t state;\n    int ret = 0;\n\n    LOG_ARG(\"timeoutP: %\" PRId64, *timeoutP);\n    tv_sec = lwm2m_gettime();\n    //if (tv_sec < 0) return COAP_500_INTERNAL_SERVER_ERROR;\n\n#ifdef LWM2M_CLIENT_MODE\n    LOG_ARG(\"State: %s\", STR_STATE(contextP->state));\n    // state can also be modified in bootstrap_handleCommand().\n\nnext_step:\n    switch (contextP->state)\n    {\n    case STATE_INITIAL:\n        if (0 != prv_refreshServerList(contextP))\n        {\n            LOG(\"prv_refreshServerList fail\");\n            return COAP_503_SERVICE_UNAVAILABLE;\n        }\n\n        state = ((!prv_isBoostrpEnable(contextP))\n                 || ((contextP->serverList != NULL) && contextP->regist_first_flag)\n                 ?  STATE_REGISTER_REQUIRED : STATE_BOOTSTRAP_REQUIRED);\n\n        contextP->regist_first_flag = true;\n\n        SET_BS_LATER(contextP, state);\n        goto next_step;\n    //break;\n\n    case STATE_BOOTSTRAP_REQUIRED:\n#ifdef LWM2M_BOOTSTRAP\n        if (contextP->bootstrapServerList != NULL)\n        {\n            bootstrap_start(contextP);\n            contextP->state = STATE_BOOTSTRAPPING;\n            bootstrap_step(contextP, tv_sec, timeoutP);\n            break;\n        }\n        else\n#endif\n        {\n            SET_BS_LATER(contextP, STATE_BOOTSTRAP_REQUIRED);\n            ret = COAP_503_SERVICE_UNAVAILABLE;\n            break;\n        }\n\n#ifdef LWM2M_BOOTSTRAP\n    case STATE_BOOTSTRAPPING:\n        switch (bootstrap_getStatus(contextP))\n        {\n        case STATE_BS_FINISHED:\n            contextP->state = STATE_INITIAL;\n            lwm2m_setBsCtrlStat(contextP, STATE_INITIAL);\n            goto next_step;\n            break;\n\n        case STATE_BS_FAILED:\n            SET_BS_LATER(contextP, STATE_BOOTSTRAP_REQUIRED);\n            ret = COAP_503_SERVICE_UNAVAILABLE;\n            break;\n\n        default:\n            // keep on waiting\n            bootstrap_step(contextP, tv_sec, timeoutP);\n            break;\n        }\n        break;\n#endif\n    case STATE_REGISTER_REQUIRED:\n        result = registration_start(contextP);\n        LOG_ARG(\"[bootstrap_tag]: ---the return value result = %d of registration_start-----\", result);\n        if (COAP_NO_ERROR != result)\n        {\n            SET_BS_LATER(contextP, STATE_REGISTER_REQUIRED);\n            ret = result;\n            break;\n        }\n        contextP->state = STATE_REGISTERING;\n        break;\n\n    case STATE_REGISTERING:\n    {\n        switch (registration_getStatus(contextP))\n        {\n        case STATE_REGISTERED:\n            contextP->state = STATE_READY;\n            lwm2m_notify_even(MODULE_LWM2M, STATE_REGISTERED, NULL, 0);\n            lwm2m_setBsCtrlStat(contextP, STATE_INITIAL);\n            break;\n\n        case STATE_REG_FAILED:\n            // TODO avoid infinite loop by checking the bootstrap info is different\n            //contextP->state = STATE_BOOTSTRAP_REQUIRED;\n\n            lwm2m_notify_even(MODULE_LWM2M,STATE_REG_FAILED, NULL, 0);\n            SET_BS_LATER(contextP, STATE_REGISTER_REQUIRED);\n\n            break;\n\n        case STATE_REG_PENDING:\n        default:\n            // keep on waiting\n            break;\n        }\n    }\n    break;\n\n    case STATE_READY:\n        if (registration_getStatus(contextP) == STATE_REG_FAILED)\n        {\n            // TODO avoid infinite loop by checking the bootstrap info is different\n            //contextP->state = STATE_BOOTSTRAP_REQUIRED;\n            contextP->state = STATE_REGISTER_REQUIRED;\n            lwm2m_setBsCtrlStat(contextP, STATE_REGISTER_REQUIRED);\n            goto next_step;\n            //            break;\n        }\n        break;\n\n    default:\n        // do nothing\n        break;\n    }\n\n    observe_step(contextP, tv_sec, timeoutP);\n#endif\n\n    registration_step(contextP, tv_sec, timeoutP);\n    transaction_step(contextP, tv_sec, timeoutP);\n\n    LOG_ARG(\"Final timeoutP: %\" PRId64, *timeoutP);\n#ifdef LWM2M_CLIENT_MODE\n    LOG_ARG(\"Final state: %s\", STR_STATE(contextP->state));\n#endif\n    return ret;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/liblwm2m.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Fabien Fleutot - Please refer to git log\n *    Simon Bernard - Please refer to git log\n *    Toby Jaffey - Please refer to git log\n *    Julien Vermillard - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *    Ville Skyttä - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n#ifndef _LWM2M_CLIENT_H_\n#define _LWM2M_CLIENT_H_\n\n#include \"liblwm2m_api.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stdint.h>\n#include <stddef.h>\n#include <stdbool.h>\n#include <time.h>\n\n#include \"er-coap-13/er-coap-13.h\"\n#include \"osdepends/atiny_osdep.h\"\n\n#ifdef LWM2M_SERVER_MODE\n#ifndef LWM2M_SUPPORT_JSON\n#define LWM2M_SUPPORT_JSON\n#endif\n#endif\n\n#if defined(LWM2M_BOOTSTRAP) && defined(LWM2M_BOOTSTRAP_SERVER_MODE)\n#error \"LWM2M_BOOTSTRAP and LWM2M_BOOTSTRAP_SERVER_MODE cannot be defined at the same time!\"\n#endif\n\n/*\n * Platform abstraction functions to be implemented by the user\n */\n\n#ifndef LWM2M_MEMORY_TRACE\n// Allocate a block of size bytes of memory, returning a pointer to the beginning of the block.\nvoid* lwm2m_malloc(size_t s);\n// Deallocate a block of memory previously allocated by lwm2m_malloc() or lwm2m_strdup()\nvoid lwm2m_free(void* p);\n// Allocate a memory block, duplicate the string str in it and return a pointer to this new block.\nchar* lwm2m_strdup(const char* str);\n#else\n// same functions as above with caller location for debugging purposes\nchar* lwm2m_trace_strdup(const char* str, const char* file, const char* function, int lineno);\nvoid* lwm2m_trace_malloc(size_t size, const char* file, const char* function, int lineno);\nvoid    lwm2m_trace_free(void* mem, const char* file, const char* function, int lineno);\n\n#define lwm2m_strdup(S) lwm2m_trace_strdup(S, __FILE__, __FUNCTION__, __LINE__)\n#define lwm2m_malloc(S) lwm2m_trace_malloc(S, __FILE__, __FUNCTION__, __LINE__)\n#define lwm2m_free(M)   lwm2m_trace_free(M, __FILE__, __FUNCTION__, __LINE__)\n#endif\n// Compare at most the n first bytes of s1 and s2, return 0 if they match\nint lwm2m_strncmp(const char* s1, const char* s2, size_t n);\n// This function must return the number of seconds elapsed since origin.\n// The origin (Epoch, system boot, etc...) does not matter as this\n// function is used only to determine the elapsed time since the last\n// call to it.\n// In case of error, this must return a negative value.\n// Per POSIX specifications, time_t is a signed integer.\ntime_t lwm2m_gettime(void);\n\n//get len of random bytes in output.\nint lwm2m_rand(void *output, size_t len);\n\n//delay sometime\nvoid lwm2m_delay(uint32_t second);\n\n//#define LWM2M_WITH_LOGS\n#ifdef LWM2M_WITH_LOGS\n// Same usage as C89 printf()\n#define lwm2m_printf atiny_printf\n#endif\n\n// communication layer\n#ifdef LWM2M_CLIENT_MODE\n// Returns a session handle that MUST uniquely identify a peer.\n// secObjInstID: ID of the Securty Object instance to open a connection to\n// userData: parameter to lwm2m_init()\n// bootstrap_flag: If BootstrapServer\nvoid *lwm2m_connect_server(uint16_t secObjInstID, void *userData, bool isServer);\n\n// Close a session created by lwm2m_connect_server()\n// sessionH: session handle identifying the peer (opaque to the core)\n// userData: parameter to lwm2m_init()\nvoid lwm2m_close_connection(void* sessionH, void* userData);\n\n#endif\n// Send data to a peer\n// Returns COAP_NO_ERROR or a COAP_NNN error code\n// sessionH: session handle identifying the peer (opaque to the core)\n// buffer, length: data to send\n// userData: parameter to lwm2m_init()\nuint8_t lwm2m_buffer_send(void* sessionH,\n                          uint8_t* buffer,\n                          size_t length,\n                          void* userdata);\n\n// Compare two session handles\n// Returns true if the two sessions identify the same peer. false otherwise.\n// userData: parameter to lwm2m_init()\nbool lwm2m_session_is_equal(void* session1, void* session2, void* userData);\n\n/*\n * Error code\n */\n\n#define COAP_NO_ERROR                   (uint8_t)0x00\n#define COAP_IGNORE                     (uint8_t)0x01\n\n#define COAP_201_CREATED                (uint8_t)0x41\n#define COAP_202_DELETED                (uint8_t)0x42\n#define COAP_204_CHANGED                (uint8_t)0x44\n#define COAP_205_CONTENT                (uint8_t)0x45\n#define COAP_231_CONTINUE               (uint8_t)0x5F\n#define COAP_400_BAD_REQUEST            (uint8_t)0x80\n#define COAP_401_UNAUTHORIZED           (uint8_t)0x81\n#define COAP_402_BAD_OPTION             (uint8_t)0x82\n#define COAP_404_NOT_FOUND              (uint8_t)0x84\n#define COAP_405_METHOD_NOT_ALLOWED     (uint8_t)0x85\n#define COAP_406_NOT_ACCEPTABLE         (uint8_t)0x86\n#define COAP_408_REQ_ENTITY_INCOMPLETE  (uint8_t)0x88\n#define COAP_412_PRECONDITION_FAILED    (uint8_t)0x8C\n#define COAP_413_ENTITY_TOO_LARGE       (uint8_t)0x8D\n#define COAP_500_INTERNAL_SERVER_ERROR  (uint8_t)0xA0\n#define COAP_501_NOT_IMPLEMENTED        (uint8_t)0xA1\n#define COAP_503_SERVICE_UNAVAILABLE    (uint8_t)0xA3\n\n/*\n * Standard Object IDs\n */\n#define LWM2M_SECURITY_OBJECT_ID            0\n#define LWM2M_SERVER_OBJECT_ID              1\n#define LWM2M_ACL_OBJECT_ID                 2\n#define LWM2M_DEVICE_OBJECT_ID              3\n#define LWM2M_CONN_MONITOR_OBJECT_ID        4\n#define LWM2M_FIRMWARE_UPDATE_OBJECT_ID     5\n#define LWM2M_LOCATION_OBJECT_ID            6\n#define LWM2M_CONN_STATS_OBJECT_ID          7\n\n/*\n * Resource IDs for the LWM2M Security Object\n */\n#define LWM2M_SECURITY_URI_ID                 0\n#define LWM2M_SECURITY_BOOTSTRAP_ID           1\n#define LWM2M_SECURITY_SECURITY_ID            2\n#define LWM2M_SECURITY_PUBLIC_KEY_ID          3\n#define LWM2M_SECURITY_SERVER_PUBLIC_KEY_ID   4\n#define LWM2M_SECURITY_SECRET_KEY_ID          5\n#define LWM2M_SECURITY_SMS_SECURITY_ID        6\n#define LWM2M_SECURITY_SMS_KEY_PARAM_ID       7\n#define LWM2M_SECURITY_SMS_SECRET_KEY_ID      8\n#define LWM2M_SECURITY_SMS_SERVER_NUMBER_ID   9\n#define LWM2M_SECURITY_SHORT_SERVER_ID        10\n#define LWM2M_SECURITY_HOLD_OFF_ID            11\n#define LWM2M_SECURITY_BOOTSTRAP_TIMEOUT_ID   12\n\n/*\n * Resource IDs for the LWM2M Server Object\n */\n#define LWM2M_SERVER_SHORT_ID_ID    0\n#define LWM2M_SERVER_LIFETIME_ID    1\n#define LWM2M_SERVER_MIN_PERIOD_ID  2\n#define LWM2M_SERVER_MAX_PERIOD_ID  3\n#define LWM2M_SERVER_DISABLE_ID     4\n#define LWM2M_SERVER_TIMEOUT_ID     5\n#define LWM2M_SERVER_STORING_ID     6\n#define LWM2M_SERVER_BINDING_ID     7\n#define LWM2M_SERVER_UPDATE_ID      8\n\n#define LWM2M_SECURITY_MODE_PRE_SHARED_KEY  0\n#define LWM2M_SECURITY_MODE_RAW_PUBLIC_KEY  1\n#define LWM2M_SECURITY_MODE_CERTIFICATE     2\n#define LWM2M_SECURITY_MODE_NONE            3\n\n#define LWM2M_TRIGER_SERVER_MODE_INITIATED_TIME 60\n\n\n#define MAX_FACTORY_BS_RETRY_CNT 3\n#define MAX_CLIENT_INITIATED_BS_RETRY_CNT 3\n#define FACTORY_BS_DELAY_BASE 0\n#define CLIENT_INITIATED_BS_DELAY_BASE 0\n#define FACTORY_BS_DELAY_INTERVAL 10\n#define CLIENT_INITIATED_BS_DELAY_INTERVAL 10\n\n\n\n/*\n * Utility functions for sorted linked list\n */\n\ntypedef struct _lwm2m_list_t\n{\n    struct _lwm2m_list_t* next;\n    uint16_t    id;\n} lwm2m_list_t;\n\n// defined in list.c\n// Add 'node' to the list 'head' and return the new list\nlwm2m_list_t* lwm2m_list_add(lwm2m_list_t* head, lwm2m_list_t* node);\n// Return the node with ID 'id' from the list 'head' or NULL if not found\nlwm2m_list_t* lwm2m_list_find(lwm2m_list_t* head, uint16_t id);\n// Remove the node with ID 'id' from the list 'head' and return the new list\nlwm2m_list_t* lwm2m_list_remove(lwm2m_list_t* head, uint16_t id, lwm2m_list_t** nodeP);\n// Return the lowest unused ID in the list 'head'\nuint16_t lwm2m_list_newId(lwm2m_list_t* head);\n// Free a list. Do not use if nodes contain allocated pointers as it calls lwm2m_free on nodes only.\n// If the nodes of the list need to do more than just \"free()\" their instances, don't use lwm2m_list_free().\nvoid lwm2m_list_free(lwm2m_list_t* head);\n\n#define LWM2M_LIST_ADD(H,N) lwm2m_list_add((lwm2m_list_t *)H, (lwm2m_list_t *)N);\n#define LWM2M_LIST_RM(H,I,N) lwm2m_list_remove((lwm2m_list_t *)H, I, (lwm2m_list_t **)N);\n#define LWM2M_LIST_FIND(H,I) lwm2m_list_find((lwm2m_list_t *)H, I)\n#define LWM2M_LIST_FREE(H) lwm2m_list_free((lwm2m_list_t *)H)\n\n/*\n * URI\n *\n * objectId is always set\n * instanceId or resourceId are set according to the flag bit-field\n *\n */\n\n#define LWM2M_MAX_ID   ((uint16_t)0xFFFF)\n\n#define LWM2M_URI_FLAG_OBJECT_ID    (uint8_t)0x04\n#define LWM2M_URI_FLAG_INSTANCE_ID  (uint8_t)0x02\n#define LWM2M_URI_FLAG_RESOURCE_ID  (uint8_t)0x01\n\n#define LWM2M_URI_IS_SET_INSTANCE(uri) (((uri)->flag & LWM2M_URI_FLAG_INSTANCE_ID) != 0)\n#define LWM2M_URI_IS_SET_RESOURCE(uri) (((uri)->flag & LWM2M_URI_FLAG_RESOURCE_ID) != 0)\n\ntypedef struct\n{\n    uint8_t     flag;           // indicates which segments are set\n    uint16_t    objectId;\n    uint16_t    instanceId;\n    uint16_t    resourceId;\n} lwm2m_uri_t;\n\n\n#define LWM2M_STRING_ID_MAX_LEN 6\n\n// Parse an URI in LWM2M format and fill the lwm2m_uri_t.\n// Return the number of characters read from buffer or 0 in case of error.\n// Valid URIs: /1, /1/, /1/2, /1/2/, /1/2/3\n// Invalid URIs: /, //, //2, /1//, /1//3, /1/2/3/, /1/2/3/4\nint lwm2m_stringToUri(const char* buffer, size_t buffer_len, lwm2m_uri_t* uriP);\n\n/*\n * The lwm2m_data_t is used to store LWM2M resource values in a hierarchical way.\n * Depending on the type the value is different:\n * - LWM2M_TYPE_OBJECT, LWM2M_TYPE_OBJECT_INSTANCE, LWM2M_TYPE_MULTIPLE_RESOURCE: value.asChildren\n * - LWM2M_TYPE_STRING, LWM2M_TYPE_OPAQUE: value.asBuffer\n * - LWM2M_TYPE_INTEGER, LWM2M_TYPE_TIME: value.asInteger\n * - LWM2M_TYPE_FLOAT: value.asFloat\n * - LWM2M_TYPE_BOOLEAN: value.asBoolean\n *\n * LWM2M_TYPE_STRING is also used when the data is in text format.\n */\n\ntypedef enum\n{\n    LWM2M_TYPE_UNDEFINED = 0,\n    LWM2M_TYPE_OBJECT,\n    LWM2M_TYPE_OBJECT_INSTANCE,\n    LWM2M_TYPE_MULTIPLE_RESOURCE,\n\n    LWM2M_TYPE_STRING,\n    LWM2M_TYPE_OPAQUE,\n    LWM2M_TYPE_INTEGER,\n    LWM2M_TYPE_FLOAT,\n    LWM2M_TYPE_BOOLEAN,\n\n    LWM2M_TYPE_OBJECT_LINK\n} lwm2m_data_type_t;\n\ntypedef struct _lwm2m_data_t lwm2m_data_t;\n\nstruct _lwm2m_data_t\n{\n    lwm2m_data_type_t type;\n    uint16_t    id;\n    union\n    {\n        bool        asBoolean;\n        int64_t     asInteger;\n        double      asFloat;\n        struct\n        {\n            size_t    length;\n            uint8_t* buffer;\n        } asBuffer;\n        struct\n        {\n            size_t         count;\n            lwm2m_data_t* array;\n        } asChildren;\n        struct\n        {\n            uint16_t objectId;\n            uint16_t objectInstanceId;\n        } asObjLink;\n    } value;\n};\n\ntypedef void (*lwm2m_data_process) (void*);\n\ntypedef struct _lwm2m_data_cfg_t\n{\n    int type;                     /*Êý¾ÝÉÏ±¨ÀàÐÍ*/\n    int cookie;                   /*Êý¾Ýcookie,ÓÃÒÔÔÚack»Øµ÷ÖÐ£¬Çø·Ö²»Í¬µÄÊý¾Ý*/\n    lwm2m_data_process callback;  /*ack»Øµ÷*/\n} lwm2m_data_cfg_t;\n\ntypedef enum\n{\n    LWM2M_CONTENT_TEXT      = 0,        // Also used as undefined\n    LWM2M_CONTENT_LINK      = 40,\n    LWM2M_CONTENT_OPAQUE    = 42,\n    LWM2M_CONTENT_TLV_OLD   = 1542,     // Keep old value for backward-compatibility\n    LWM2M_CONTENT_TLV       = 11542,\n    LWM2M_CONTENT_JSON_OLD  = 1543,     // Keep old value for backward-compatibility\n    LWM2M_CONTENT_JSON      = 11543\n} lwm2m_media_type_t;\n\nlwm2m_data_t* lwm2m_data_new(int size);\nint lwm2m_data_parse(lwm2m_uri_t* uriP, uint8_t* buffer, size_t bufferLen, lwm2m_media_type_t format, lwm2m_data_t** dataP);\nint lwm2m_data_serialize(lwm2m_uri_t* uriP, int size, lwm2m_data_t* dataP, lwm2m_media_type_t* formatP, uint8_t** bufferP);\nvoid lwm2m_data_free(int size, lwm2m_data_t* dataP);\n\nvoid lwm2m_data_decode_opaque(const lwm2m_data_t* dataP, int8_t* valueP);\nvoid lwm2m_data_encode_string(const char* string, lwm2m_data_t* dataP);\nvoid lwm2m_data_encode_nstring(const char* string, size_t length, lwm2m_data_t* dataP);\nvoid lwm2m_data_encode_opaque(uint8_t* buffer, size_t length, lwm2m_data_t* dataP);\nvoid lwm2m_data_encode_int(int64_t value, lwm2m_data_t* dataP);\nint lwm2m_data_decode_int(const lwm2m_data_t* dataP, int64_t* valueP);\nvoid lwm2m_data_encode_float(double value, lwm2m_data_t* dataP);\nint lwm2m_data_decode_float(const lwm2m_data_t* dataP, double* valueP);\nvoid lwm2m_data_encode_bool(bool value, lwm2m_data_t* dataP);\nint lwm2m_data_decode_bool(const lwm2m_data_t* dataP, bool* valueP);\nvoid lwm2m_data_encode_objlink(uint16_t objectId, uint16_t objectInstanceId, lwm2m_data_t* dataP);\nvoid lwm2m_data_encode_instances(lwm2m_data_t* subDataP, size_t count, lwm2m_data_t* dataP);\nvoid lwm2m_data_include(lwm2m_data_t* subDataP, size_t count, lwm2m_data_t* dataP);\n\n\n/*\n * Utility function to parse TLV buffers directly\n *\n * Returned value: number of bytes parsed\n * buffer: buffer to parse\n * buffer_len: length in bytes of buffer\n * oType: (OUT) type of the parsed TLV record. can be:\n *          - LWM2M_TYPE_OBJECT\n *          - LWM2M_TYPE_OBJECT_INSTANCE\n *          - LWM2M_TYPE_MULTIPLE_RESOURCE\n *          - LWM2M_TYPE_OPAQUE\n * oID: (OUT) ID of the parsed TLV record\n * oDataIndex: (OUT) index of the data of the parsed TLV record in the buffer\n * oDataLen: (OUT) length of the data of the parsed TLV record\n */\n\n#define LWM2M_TLV_HEADER_MAX_LENGTH 6\n\nint lwm2m_decode_TLV(const uint8_t* buffer, size_t buffer_len, lwm2m_data_type_t* oType, uint16_t* oID, size_t* oDataIndex, size_t* oDataLen);\n\n\n/*\n * LWM2M Objects\n *\n * For the read callback, if *numDataP is not zero, *dataArrayP is pre-allocated\n * and contains the list of resources to read.\n *\n */\n\ntypedef struct _lwm2m_object_t lwm2m_object_t;\n\ntypedef uint8_t (*lwm2m_read_callback_t) (uint16_t instanceId, int* numDataP, lwm2m_data_t** dataArrayP, lwm2m_data_cfg_t* dataCfg, lwm2m_object_t* objectP);\ntypedef uint8_t (*lwm2m_discover_callback_t) (uint16_t instanceId, int* numDataP, lwm2m_data_t** dataArrayP, lwm2m_object_t* objectP);\ntypedef uint8_t (*lwm2m_write_callback_t) (uint16_t instanceId, int numData, lwm2m_data_t* dataArray, lwm2m_object_t* objectP);\ntypedef uint8_t (*lwm2m_execute_callback_t) (uint16_t instanceId, uint16_t resourceId, uint8_t* buffer, int length, lwm2m_object_t* objectP);\ntypedef uint8_t (*lwm2m_create_callback_t) (uint16_t instanceId, int numData, lwm2m_data_t* dataArray, lwm2m_object_t* objectP);\ntypedef uint8_t (*lwm2m_delete_callback_t) (uint16_t instanceId, lwm2m_object_t* objectP);\ntypedef uint8_t (*lwm2m_change_callback_t) (uint16_t instanceId, uint8_t* buffer, int length, lwm2m_object_t* objectP);\n\nstruct _lwm2m_object_t\n{\n    struct _lwm2m_object_t* next;            // for internal use only.\n    uint16_t       objID;\n    lwm2m_list_t* instanceList;\n    lwm2m_read_callback_t     readFunc;\n    lwm2m_write_callback_t    writeFunc;\n    lwm2m_execute_callback_t  executeFunc;\n    lwm2m_change_callback_t   change;\n    lwm2m_create_callback_t   createFunc;\n    lwm2m_delete_callback_t   deleteFunc;\n    lwm2m_discover_callback_t discoverFunc;\n    void* userData;\n};\n\n/*\n * LWM2M Servers\n *\n * Since LWM2M Server Object instances are not accessible to LWM2M servers,\n * there is no need to store them as lwm2m_objects_t\n */\n\ntypedef enum\n{\n    STATE_DEREGISTERED = 0,        // not registered or boostrap not started\n    STATE_REG_PENDING,             // registration pending\n    STATE_REGISTERED,              // successfully registered\n    STATE_REG_FAILED,              // last registration failed\n    STATE_REG_UPDATE_PENDING,      // registration update pending\n    STATE_REG_UPDATE_NEEDED,       // registration update required\n    STATE_REG_FULL_UPDATE_NEEDED,  // registration update with objects required\n    STATE_DEREG_PENDING,           // deregistration pending\n    STATE_BS_HOLD_OFF,             // bootstrap hold off time\n    STATE_BS_INITIATED,            // bootstrap request sent\n    STATE_BS_PENDING,              // boostrap ongoing\n    STATE_BS_FINISHING,            // boostrap finish received\n    STATE_BS_FINISHED,             // bootstrap done\n    STATE_BS_FAILING,              // bootstrap error occurred\n    STATE_BS_FAILED,               // bootstrap failed\n} lwm2m_status_t;\n\ntypedef enum\n{\n    BINDING_UNKNOWN = 0,\n    BINDING_U,   // UDP\n    BINDING_UQ,  // UDP queue mode\n    BINDING_S,   // SMS\n    BINDING_SQ,  // SMS queue mode\n    BINDING_US,  // UDP plus SMS\n    BINDING_UQS  // UDP queue mode plus SMS\n} lwm2m_binding_t;\n\ntypedef enum\n{\n    MODULE_LWM2M,\n    MODULE_NET,\n    MODULE_URI,\n}module_type_t;\n\nenum\n{\n    OBSERVE_UNSUBSCRIBE,\n    OBSERVE_SUBSCRIBE,\n};\n\n/*\n * LWM2M block1 data\n *\n * Temporary data needed to handle block1 request.\n * Currently support only one block1 request by server.\n */\ntypedef struct _lwm2m_block1_data_ lwm2m_block1_data_t;\n\nstruct _lwm2m_block1_data_\n{\n    uint8_t*              block1buffer;     // data buffer\n    size_t                block1bufferSize; // buffer size\n    uint16_t              lastmid;          // mid of the last message received\n};\n\ntypedef struct _lwm2m_server_\n{\n    struct _lwm2m_server_* next;          // matches lwm2m_list_t::next\n    uint16_t                secObjInstID; // matches lwm2m_list_t::id\n    uint16_t                shortID;      // servers short ID, may be 0 for bootstrap server\n    time_t                  lifetime;     // lifetime of the registration in sec or 0 if default value (86400 sec), also used as hold off time for bootstrap servers\n    time_t                  registration; // date of the last registration in sec or end of client hold off time for bootstrap servers\n    lwm2m_binding_t         binding;      // client connection mode with this server\n    void*                   sessionH;\n    lwm2m_status_t          status;\n    char*                   location;\n    bool                    dirty;\n    lwm2m_block1_data_t*    block1Data;   // buffer to handle block1 data, should be replace by a list to support several block1 transfer by server.\n} lwm2m_server_t;\n\n\n/*\n * LWM2M result callback\n *\n * When used with an observe, if 'data' is not nil, 'status' holds the observe counter.\n */\ntypedef void (*lwm2m_result_callback_t) (uint16_t clientID, lwm2m_uri_t* uriP, int status, lwm2m_media_type_t format, uint8_t* data, int dataLength, void* userData);\n\n/*\n * LWM2M Observations\n *\n * Used to store observation of remote clients resources.\n * status STATE_REG_PENDING means the observe request was sent to the client but not yet answered.\n * status STATE_REGISTERED means the client acknowledged the observe request.\n * status STATE_DEREG_PENDING means the user canceled the request before the client answered it.\n */\n\ntypedef struct _lwm2m_observation_\n{\n    struct _lwm2m_observation_* next;   // matches lwm2m_list_t::next\n    uint16_t                     id;    // matches lwm2m_list_t::id\n    struct _lwm2m_client_* clientP;\n    lwm2m_uri_t             uri;\n    lwm2m_status_t          status;\n    lwm2m_result_callback_t callback;\n    void*                   userData;\n} lwm2m_observation_t;\n\n/*\n * LWM2M Link Attributes\n *\n * Used for observation parameters.\n *\n */\n\n#define LWM2M_ATTR_FLAG_MIN_PERIOD      (uint8_t)0x01\n#define LWM2M_ATTR_FLAG_MAX_PERIOD      (uint8_t)0x02\n#define LWM2M_ATTR_FLAG_GREATER_THAN    (uint8_t)0x04\n#define LWM2M_ATTR_FLAG_LESS_THAN       (uint8_t)0x08\n#define LWM2M_ATTR_FLAG_STEP            (uint8_t)0x10\n\ntypedef struct\n{\n    uint8_t     toSet;\n    uint8_t     toClear;\n    uint32_t    minPeriod;\n    uint32_t    maxPeriod;\n    double      greaterThan;\n    double      lessThan;\n    double      step;\n} lwm2m_attributes_t;\n\n/*\n * LWM2M Clients\n *\n * Be careful not to mix lwm2m_client_object_t used to store list of objects of remote clients\n * and lwm2m_object_t describing objects exposed to remote servers.\n *\n */\n\ntypedef struct _lwm2m_client_object_\n{\n    struct _lwm2m_client_object_* next;  // matches lwm2m_list_t::next\n    uint16_t                 id;         // matches lwm2m_list_t::id\n    lwm2m_list_t*            instanceList;\n} lwm2m_client_object_t;\n\ntypedef struct _lwm2m_client_\n{\n    struct _lwm2m_client_* next;        // matches lwm2m_list_t::next\n    uint16_t                internalID; // matches lwm2m_list_t::id\n    char*                   name;\n    lwm2m_binding_t         binding;\n    char*                   msisdn;\n    char*                   altPath;\n    bool                    supportJSON;\n    uint32_t                lifetime;\n    time_t                  endOfLife;\n    void*                   sessionH;\n    lwm2m_client_object_t* objectList;\n    lwm2m_observation_t*    observationList;\n} lwm2m_client_t;\n\n\n/*\n * LWM2M transaction\n *\n * Adaptation of Erbium's coap_transaction_t\n */\n\ntypedef struct _lwm2m_transaction_ lwm2m_transaction_t;\n\ntypedef void (*lwm2m_transaction_callback_t) (lwm2m_transaction_t* transacP, void* message);\n\nstruct _lwm2m_transaction_\n{\n    lwm2m_transaction_t* next;   // matches lwm2m_list_t::next\n    uint16_t              mID;   // matches lwm2m_list_t::id\n    void*                 peerH;\n    uint8_t               ack_received; // indicates, that the ACK was received\n    time_t                response_timeout; // timeout to wait for response, if token is used. When 0, use calculated acknowledge timeout.\n    uint8_t  retrans_counter;\n    time_t   retrans_time;\n    coap_packet_t* message;\n    uint16_t buffer_len;\n    uint8_t* buffer;\n    lwm2m_data_cfg_t   cfg;\n    lwm2m_transaction_callback_t callback;\n    void* userData;\n};\n\n/*\n * LWM2M observed resources\n */\ntypedef struct _lwm2m_watcher_\n{\n    struct _lwm2m_watcher_* next;\n\n    bool active;\n    bool update;\n    lwm2m_server_t* server;\n    lwm2m_attributes_t* parameters;\n    lwm2m_media_type_t format;\n    uint8_t token[8];\n    size_t tokenLen;\n    time_t lastTime;\n    uint32_t counter;\n    uint16_t lastMid;\n    union\n    {\n        int64_t asInteger;\n        double  asFloat;\n    } lastValue;\n} lwm2m_watcher_t;\n\ntypedef struct _lwm2m_observed_\n{\n    struct _lwm2m_observed_* next;\n\n    lwm2m_uri_t uri;\n    lwm2m_watcher_t* watcherList;\n} lwm2m_observed_t;\n\n#ifdef LWM2M_CLIENT_MODE\n\ntypedef enum\n{\n    STATE_INITIAL = 0,\n    STATE_BOOTSTRAP_REQUIRED,\n    STATE_BOOTSTRAPPING,\n    STATE_REGISTER_REQUIRED,\n    STATE_REGISTERING,\n    STATE_READY\n} lwm2m_client_state_t;\n\ntypedef enum\n{\n    BS_SEQUENCE_STATE_INITIAL = 0,\n    BS_SEQUENCE_STATE_FACTORY,\n    BS_SEQUENCE_STATE_SERVER_INITIATED,\n    BS_SEQUENCE_STATE_CLIENT_INITIATED,\n    NO_BS_SEQUENCE_STATE\n} lwm2m_bs_sequence_state_t;\n\n\n#endif\n/*\n * LWM2M Context\n */\n\n#ifdef LWM2M_BOOTSTRAP_SERVER_MODE\n// In all the following APIs, the session handle MUST uniquely identify a peer.\n\n// LWM2M bootstrap callback\n// When a LWM2M client requests bootstrap information, the callback is called with status COAP_NO_ERROR, uriP is nil and\n// name is set. The callback must return a COAP_* error code. COAP_204_CHANGED for success.\n// After a lwm2m_bootstrap_delete() or a lwm2m_bootstrap_write(), the callback is called with the status returned by the\n// client, the URI of the operation (may be nil) and name is nil. The callback return value is ignored.\ntypedef int (*lwm2m_bootstrap_callback_t) (void* sessionH, uint8_t status, lwm2m_uri_t* uriP, char* name, void* userData);\n#endif\n\n#ifdef LWM2M_CLIENT_MODE\n/* use to control the bootstrap, factory bootstrap, client initiated bootstrap, server initiated bootstrap.\nfactory bootstrap is used security object to register.\n*/\ntypedef struct\n{\n    lwm2m_bootstrap_type_e bsType;\n    lwm2m_client_state_t state;\n    uint32_t cnt;\n}lwm2m_bs_control_t;\n#endif\n\ntypedef struct _lwm2m_context_t\n{\n#ifdef LWM2M_CLIENT_MODE\n    lwm2m_client_state_t state;\n    //char*                bs_server_uri;   //    coaps://     coap://malloc memory\n    bool                 regist_first_flag;  //when serverlist and bootstrapServerList are all exist, we use regist or bootstrap.\n    char*                endpointName;\n    char*                msisdn;\n    char*                altPath;\n    lwm2m_server_t*      bootstrapServerList;\n    lwm2m_server_t*      serverList;\n    lwm2m_object_t*      objectList;\n    lwm2m_observed_t*    observedList;\n    void*                observe_mutex;\n    lwm2m_bs_control_t    bsCtrl;\n#endif\n#ifdef LWM2M_SERVER_MODE\n    lwm2m_client_t*         clientList;\n    lwm2m_result_callback_t monitorCallback;\n    void*                   monitorUserData;\n#endif\n#ifdef LWM2M_BOOTSTRAP_SERVER_MODE\n    lwm2m_bootstrap_callback_t bootstrapCallback;\n    void*                      bootstrapUserData;\n#endif\n    uint16_t                nextMID;\n    lwm2m_transaction_t*    transactionList;\n    void*                   userData;\n} lwm2m_context_t;\n\n\n\n// initialize a liblwm2m context.\nlwm2m_context_t* lwm2m_init(void* userData);\n// close a liblwm2m context.\nvoid lwm2m_close(lwm2m_context_t* contextP);\n\n// perform any required pending operation and adjust timeoutP to the maximal time interval to wait in seconds.\nint lwm2m_step(lwm2m_context_t* contextP, time_t* timeoutP);\n// dispatch received data to liblwm2m\nvoid lwm2m_handle_packet(lwm2m_context_t* contextP, uint8_t* buffer, int length, void* fromSessionH);\n\n#ifdef LWM2M_CLIENT_MODE\n// configure the client side with the Endpoint Name, binding, MSISDN (can be nil), alternative path\n// for objects (can be nil) and a list of objects.\n// LWM2M Security Object (ID 0) must be present with either a bootstrap server or a LWM2M server and\n// its matching LWM2M Server Object (ID 1) instance\nint lwm2m_configure(lwm2m_context_t* contextP, const char* endpointName, const char* msisdn, const char* altPath, uint16_t numObject, lwm2m_object_t* objectList[]);\nint lwm2m_add_object(lwm2m_context_t* contextP, lwm2m_object_t* objectP);\nint lwm2m_remove_object(lwm2m_context_t* contextP, uint16_t id);\n\n// send a registration update to the server specified by the server short identifier\n// or all if the ID is 0.\n// If withObjects is true, the registration update contains the object list.\nint lwm2m_update_registration(lwm2m_context_t* contextP, uint16_t shortServerID, bool withObjects);\n\n\nvoid lwm2m_resource_value_changed(lwm2m_context_t* contextP, lwm2m_uri_t* uriP);\nvoid lwm2m_register_observe_ack_call_back(lwm2m_transaction_callback_t callback);\ntypedef void(*lwm2m_event_handler_t)(module_type_t type, int code, const char* arg, int arg_len);\nvoid lwm2m_register_event_handler(lwm2m_event_handler_t callback);\nvoid lwm2m_notify_even(module_type_t type, int code, const char* arg, int arg_len);\nint lwm2m_reconnect(lwm2m_context_t * context);\n\n\ntypedef struct\n{\n    uint32_t format;\n    uint8_t token[8];\n    uint32_t tokenLen;\n    uint32_t counter;\n}lwm2m_observe_info_t;\n\nuint8_t lwm2m_get_observe_info(lwm2m_context_t * contextP, lwm2m_observe_info_t *observe_info);\nuint8_t lwm2m_send_notify(lwm2m_context_t * contextP, lwm2m_observe_info_t *observe_info, int firmware_update_state, lwm2m_data_cfg_t  *cfg);\n\nint lwm2m_initBootStrap(lwm2m_context_t *contextP, lwm2m_bootstrap_type_e bsType);\n\n\n#endif\n\n#ifdef LWM2M_SERVER_MODE\n// Clients registration/deregistration monitoring API.\n// When a LWM2M client registers, the callback is called with status COAP_201_CREATED.\n// When a LWM2M client deregisters, the callback is called with status COAP_202_DELETED.\n// clientID is the internal ID of the LWM2M Client.\n// The callback's parameters uri, data, dataLength are always NULL.\n// The lwm2m_client_t is present in the lwm2m_context_t's clientList when the callback is called. On a deregistration, it deleted when the callback returns.\nvoid lwm2m_set_monitoring_callback(lwm2m_context_t* contextP, lwm2m_result_callback_t callback, void* userData);\n\n// Device Management APIs\nint lwm2m_dm_read(lwm2m_context_t* contextP, uint16_t clientID, lwm2m_uri_t* uriP, lwm2m_result_callback_t callback, void* userData);\nint lwm2m_dm_discover(lwm2m_context_t* contextP, uint16_t clientID, lwm2m_uri_t* uriP, lwm2m_result_callback_t callback, void* userData);\nint lwm2m_dm_write(lwm2m_context_t* contextP, uint16_t clientID, lwm2m_uri_t* uriP, lwm2m_media_type_t format, uint8_t* buffer, int length, lwm2m_result_callback_t callback, void* userData);\nint lwm2m_dm_write_attributes(lwm2m_context_t* contextP, uint16_t clientID, lwm2m_uri_t* uriP, lwm2m_attributes_t* attrP, lwm2m_result_callback_t callback, void* userData);\nint lwm2m_dm_execute(lwm2m_context_t* contextP, uint16_t clientID, lwm2m_uri_t* uriP, lwm2m_media_type_t format, uint8_t* buffer, int length, lwm2m_result_callback_t callback, void* userData);\nint lwm2m_dm_create(lwm2m_context_t* contextP, uint16_t clientID, lwm2m_uri_t* uriP, lwm2m_media_type_t format, uint8_t* buffer, int length, lwm2m_result_callback_t callback, void* userData);\nint lwm2m_dm_delete(lwm2m_context_t* contextP, uint16_t clientID, lwm2m_uri_t* uriP, lwm2m_result_callback_t callback, void* userData);\n\n// Information Reporting APIs\nint lwm2m_observe(lwm2m_context_t* contextP, uint16_t clientID, lwm2m_uri_t* uriP, lwm2m_result_callback_t callback, void* userData);\nint lwm2m_observe_cancel(lwm2m_context_t* contextP, uint16_t clientID, lwm2m_uri_t* uriP, lwm2m_result_callback_t callback, void* userData);\n#endif\n\n#ifdef LWM2M_BOOTSTRAP_SERVER_MODE\n// Clients bootstrap request monitoring API.\n// When a LWM2M client sends a bootstrap request, the callback is called with the client's endpoint name.\nvoid lwm2m_set_bootstrap_callback(lwm2m_context_t* contextP, lwm2m_bootstrap_callback_t callback, void* userData);\n\n// Boostrap Interface APIs\n// if uriP is nil, a \"Delete /\" is sent to the client\nint lwm2m_bootstrap_delete(lwm2m_context_t* contextP, void* sessionH, lwm2m_uri_t* uriP);\nint lwm2m_bootstrap_write(lwm2m_context_t* contextP, void* sessionH, lwm2m_uri_t* uriP, lwm2m_media_type_t format, uint8_t* buffer, size_t length);\nint lwm2m_bootstrap_finish(lwm2m_context_t* contextP, void* sessionH);\n\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/liblwm2m_api.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/**@defgroup agent AgentTiny\n * @defgroup agenttiny Agenttiny Definition\n * @ingroup agent\n */\n#ifndef LIB_LWM2M_API_H\n#define LIB_LWM2M_API_H\n\n#include <stdbool.h>\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//bootstrap at least have one mode, we have three mode.\ntypedef enum\n{\n    BOOTSTRAP_FACTORY = 0,\n    BOOTSTRAP_CLIENT_INITIATED,\n    BOOTSTRAP_SEQUENCE\n} lwm2m_bootstrap_type_e;\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/list.c",
    "content": "/*******************************************************************************\n *\n * Copyright (c) 2013 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *\n *******************************************************************************/\n\n#include \"internals.h\"\n\n\nlwm2m_list_t *lwm2m_list_add(lwm2m_list_t *head,\n                             lwm2m_list_t *node)\n{\n    lwm2m_list_t *target;\n\n    if (NULL == head) return node;\n\n    if (head->id > node->id)\n    {\n        node->next = head;\n        return node;\n    }\n\n    target = head;\n    while (NULL != target->next && target->next->id < node->id)\n    {\n        target = target->next;\n    }\n\n    node->next = target->next;\n    target->next = node;\n\n    return head;\n}\n\n\nlwm2m_list_t *lwm2m_list_find(lwm2m_list_t *head,\n                              uint16_t id)\n{\n    while (NULL != head && head->id < id)\n    {\n        head = head->next;\n    }\n\n    if (NULL != head && head->id == id) return head;\n\n    return NULL;\n}\n\n\nlwm2m_list_t *lwm2m_list_remove(lwm2m_list_t *head,\n                                uint16_t id,\n                                lwm2m_list_t **nodeP)\n{\n    lwm2m_list_t *target;\n\n    if (head == NULL)\n    {\n        if (nodeP) *nodeP = NULL;\n        return NULL;\n    }\n\n    if (head->id == id)\n    {\n        if (nodeP) *nodeP = head;\n        return head->next;\n    }\n\n    target = head;\n    while (NULL != target->next && target->next->id < id)\n    {\n        target = target->next;\n    }\n\n    if (NULL != target->next && target->next->id == id)\n    {\n        if (nodeP) *nodeP = target->next;\n        target->next = target->next->next;\n    }\n    else\n    {\n        if (nodeP) *nodeP = NULL;\n    }\n\n    return head;\n}\n\nuint16_t lwm2m_list_newId(lwm2m_list_t *head)\n{\n    uint16_t id;\n    lwm2m_list_t *target;\n\n    id = 0;\n    target = head;\n\n    while (target != NULL && id == target->id)\n    {\n        id = target->id + 1;\n        target = target->next;\n    }\n\n    return id;\n}\n\nvoid lwm2m_list_free(lwm2m_list_t *head)\n{\n    if (head != NULL)\n    {\n        lwm2m_list_t *nextP;\n\n        nextP = head->next;\n        lwm2m_free(head);\n        lwm2m_list_free(nextP);\n    }\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/lwm2m_utils.c",
    "content": "/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Toby Jaffey - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n#include \"internals.h\"\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <float.h>\n\n\nint utils_textToInt(uint8_t *buffer,\n                    int length,\n                    int64_t *dataP)\n{\n    uint64_t result = 0;\n    int sign = 1;\n    int i = 0;\n\n    if (0 == length) return 0;\n\n    if (buffer[0] == '-')\n    {\n        sign = -1;\n        i = 1;\n    }\n\n    while (i < length)\n    {\n        if ('0' <= buffer[i] && buffer[i] <= '9')\n        {\n            if (result > (UINT64_MAX / 10)) return 0;\n            result *= 10;\n            result += buffer[i] - '0';\n        }\n        else\n        {\n            return 0;\n        }\n        i++;\n    }\n\n    if (result > INT64_MAX) return 0;\n\n    if (sign == -1)\n    {\n        *dataP = 0 - result;\n    }\n    else\n    {\n        *dataP = result;\n    }\n\n    return 1;\n}\n\nint utils_textToFloat(uint8_t *buffer,\n                      int length,\n                      double *dataP)\n{\n    double result;\n    int sign;\n    int i;\n\n    if (0 == length) return 0;\n\n    if (buffer[0] == '-')\n    {\n        sign = -1;\n        i = 1;\n    }\n    else\n    {\n        sign = 1;\n        i = 0;\n    }\n\n    result = 0;\n    while (i < length && buffer[i] != '.')\n    {\n        if ('0' <= buffer[i] && buffer[i] <= '9')\n        {\n            if (result > (DBL_MAX / 10)) return 0;\n            result *= 10;\n            result += (buffer[i] - '0');\n        }\n        else\n        {\n            return 0;\n        }\n        i++;\n    }\n    if (buffer[i] == '.')\n    {\n        double dec;\n\n        i++;\n        if (i == length) return 0;\n\n        dec = 0.1;\n        while (i < length)\n        {\n            if ('0' <= buffer[i] && buffer[i] <= '9')\n            {\n                if (result > (DBL_MAX - 1)) return 0;\n                result += (buffer[i] - '0') * dec;\n                dec /= 10;\n            }\n            else\n            {\n                return 0;\n            }\n            i++;\n        }\n    }\n\n    *dataP = result * sign;\n    return 1;\n}\n\nsize_t utils_intToText(int64_t data,\n                       uint8_t *string,\n                       size_t length)\n{\n    int index;\n    bool minus;\n    size_t result;\n\n    if (data < 0)\n    {\n        minus = true;\n        data = 0 - data;\n    }\n    else\n    {\n        minus = false;\n    }\n\n    index = length - 1;\n    do\n    {\n        string[index] = '0' + data % 10;\n        data /= 10;\n        index --;\n    }\n    while (index >= 0 && data > 0);\n\n    if (data > 0) return 0;\n\n    if (minus == true)\n    {\n        if (index == 0) return 0;\n        string[index] = '-';\n    }\n    else\n    {\n        index++;\n    }\n\n    result = length - index;\n\n    if (result < length)\n    {\n        memmove(string, string + index, result);\n    }\n\n    return result;\n}\n\nsize_t utils_floatToText(double data,\n                         uint8_t *string,\n                         size_t length)\n{\n    size_t intLength;\n    size_t decLength;\n    int64_t intPart;\n    double decPart;\n\n    if (data <= (double)INT64_MIN || data >= (double)INT64_MAX) return 0;\n\n    intPart = (int64_t)data;\n    decPart = data - intPart;\n    if (decPart < 0)\n    {\n        decPart = 1 - decPart;\n    }\n    else\n    {\n        decPart = 1 + decPart;\n    }\n\n    if (decPart <= 1 + FLT_EPSILON)\n    {\n        decPart = 0;\n    }\n\n    if (intPart == 0 && data < 0)\n    {\n        // deal with numbers between -1 and 0\n        if (length < 4) return 0;   // \"-0.n\"\n        string[0] = '-';\n        string[1] = '0';\n        intLength = 2;\n    }\n    else\n    {\n        intLength = utils_intToText(intPart, string, length);\n        if (intLength == 0) return 0;\n    }\n    decLength = 0;\n    if (decPart >= FLT_EPSILON)\n    {\n        double noiseFloor;\n\n        if (intLength >= length - 1) return 0;\n\n        noiseFloor = FLT_EPSILON;\n        do\n        {\n            decPart *= 10;\n            noiseFloor *= 10;\n        }\n        while (decPart - (int64_t)decPart > noiseFloor);\n\n        decLength = utils_intToText(decPart, string + intLength, length - intLength);\n        if (decLength <= 1) return 0;\n\n        // replace the leading 1 with a dot\n        string[intLength] = '.';\n    }\n\n    return intLength + decLength;\n}\n\nlwm2m_binding_t utils_stringToBinding(uint8_t *buffer,\n                                      size_t length)\n{\n    if (length == 0) return BINDING_UNKNOWN;\n\n    switch (buffer[0])\n    {\n    case 'U':\n        switch (length)\n        {\n        case 1:\n            return BINDING_U;\n        case 2:\n            switch (buffer[1])\n            {\n            case 'Q':\n                return BINDING_UQ;\n            case 'S':\n                return BINDING_US;\n            default:\n                break;\n            }\n            break;\n        case 3:\n            if (buffer[1] == 'Q' && buffer[2] == 'S')\n            {\n                return BINDING_UQS;\n            }\n            break;\n        default:\n            break;\n        }\n        break;\n\n    case 'S':\n        switch (length)\n        {\n        case 1:\n            return BINDING_S;\n        case 2:\n            if (buffer[1] == 'Q')\n            {\n                return BINDING_SQ;\n            }\n            break;\n        default:\n            break;\n        }\n        break;\n\n    default:\n        break;\n    }\n\n    return BINDING_UNKNOWN;\n}\n\nlwm2m_media_type_t utils_convertMediaType(coap_content_type_t type)\n{\n    // Here we just check the content type is a valid value for LWM2M\n    switch((uint16_t)type)\n    {\n    case TEXT_PLAIN:\n        return LWM2M_CONTENT_TEXT;\n    case APPLICATION_OCTET_STREAM:\n        return LWM2M_CONTENT_OPAQUE;\n    case LWM2M_CONTENT_TLV_OLD:\n        return LWM2M_CONTENT_TLV_OLD;\n    case LWM2M_CONTENT_TLV:\n        return LWM2M_CONTENT_TLV;\n    case LWM2M_CONTENT_JSON_OLD:\n        return LWM2M_CONTENT_JSON_OLD;\n    case LWM2M_CONTENT_JSON:\n        return LWM2M_CONTENT_JSON;\n    case APPLICATION_LINK_FORMAT:\n        return LWM2M_CONTENT_LINK;\n\n    default:\n        return LWM2M_CONTENT_TEXT;\n    }\n}\n\n#ifdef LWM2M_CLIENT_MODE\nlwm2m_server_t *utils_findServer(lwm2m_context_t *contextP,\n                                 void *fromSessionH)\n{\n    lwm2m_server_t *targetP;\n\n    targetP = contextP->serverList;\n    while (targetP != NULL\n            && false == lwm2m_session_is_equal(targetP->sessionH, fromSessionH, contextP->userData))\n    {\n        targetP = targetP->next;\n    }\n\n    return targetP;\n}\n#endif\n\n#ifdef LWM2M_BOOTSTRAP\nlwm2m_server_t *utils_findBootstrapServer(lwm2m_context_t *contextP,\n        void *fromSessionH)\n{\n#ifdef LWM2M_CLIENT_MODE\n\n    lwm2m_server_t *targetP;\n\n    targetP = contextP->bootstrapServerList;\n    while (targetP != NULL\n            && false == lwm2m_session_is_equal(targetP->sessionH, fromSessionH, contextP->userData))\n    {\n        targetP = targetP->next;\n    }\n\n    return targetP;\n\n#else\n\n    return NULL;\n\n#endif\n}\n#endif\n\nint utils_isAltPathValid(const char *altPath)\n{\n    int i;\n\n    if (altPath == NULL) return 0;\n\n    if (altPath[0] != '/') return 0;\n\n    for (i = 1 ; altPath[i] != 0 ; i++)\n    {\n        // TODO: Support multi-segment alternative path\n        if (altPath[i] == '/') return 0;\n        // TODO: Check needs for sub-delims, ':' and '@'\n        if ((altPath[i] < 'A' || altPath[i] > 'Z')      // ALPHA\n                && (altPath[i] < 'a' || altPath[i] > 'z')\n                && (altPath[i] < '0' || altPath[i] > '9')      // DIGIT\n                && (altPath[i] != '-')                         // Other unreserved\n                && (altPath[i] != '.')\n                && (altPath[i] != '_')\n                && (altPath[i] != '~')\n                && (altPath[i] != '%'))                        // pct_encoded\n        {\n            return 0;\n        }\n\n    }\n    return 1;\n}\n\n// copy a string in a buffer.\n// return the number of copied bytes or -1 if the buffer is not large enough\nint utils_stringCopy(char *buffer,\n                     size_t length,\n                     const char *str)\n{\n    size_t i;\n\n    for (i = 0 ; i < length && str[i] != 0 ; i++)\n    {\n        buffer[i] = str[i];\n    }\n\n    if (i == length) return -1;\n\n    buffer[i] = 0;\n\n    return (int)i;\n}\n\nvoid utils_copyValue(void *dst,\n                     const void *src,\n                     size_t len)\n{\n#ifdef LWM2M_BIG_ENDIAN\n    memcpy(dst, src, len);\n#else\n#ifdef LWM2M_LITTLE_ENDIAN\n    size_t i;\n\n    for (i = 0; i < len; i++)\n    {\n        ((uint8_t *)dst)[i] = ((uint8_t *)src)[len - 1 - i];\n    }\n#endif\n#endif\n}\n\n\n#define PRV_B64_PADDING '='\n\nstatic char b64Alphabet[64] =\n{\n    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',\n    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',\n    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',\n    'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'\n};\n\nstatic void prv_encodeBlock(uint8_t input[3],\n                            uint8_t output[4])\n{\n    output[0] = b64Alphabet[input[0] >> 2];\n    output[1] = b64Alphabet[((input[0] & 0x03) << 4) | (input[1] >> 4)];\n    output[2] = b64Alphabet[((input[1] & 0x0F) << 2) | (input[2] >> 6)];\n    output[3] = b64Alphabet[input[2] & 0x3F];\n}\n\nsize_t utils_base64GetSize(size_t dataLen)\n{\n    size_t result_len;\n\n    result_len = 4 * (dataLen / 3);\n    if (dataLen % 3) result_len += 4;\n\n    return result_len;\n}\n\nsize_t utils_base64Encode(uint8_t *dataP,\n                          size_t dataLen,\n                          uint8_t *bufferP,\n                          size_t bufferLen)\n{\n    unsigned int data_index;\n    unsigned int result_index;\n    size_t result_len;\n\n    result_len = utils_base64GetSize(dataLen);\n\n    if (result_len > bufferLen) return 0;\n\n    data_index = 0;\n    result_index = 0;\n    while (data_index < dataLen)\n    {\n        switch (dataLen - data_index)\n        {\n        case 0:\n            // should never happen\n            break;\n        case 1:\n            bufferP[result_index] = b64Alphabet[dataP[data_index] >> 2];\n            bufferP[result_index + 1] = b64Alphabet[(dataP[data_index] & 0x03) << 4];\n            bufferP[result_index + 2] = PRV_B64_PADDING;\n            bufferP[result_index + 3] = PRV_B64_PADDING;\n            break;\n        case 2:\n            bufferP[result_index] = b64Alphabet[dataP[data_index] >> 2];\n            bufferP[result_index + 1] = b64Alphabet[(dataP[data_index] & 0x03) << 4 | (dataP[data_index + 1] >> 4)];\n            bufferP[result_index + 2] = b64Alphabet[(dataP[data_index + 1] & 0x0F) << 2];\n            bufferP[result_index + 3] = PRV_B64_PADDING;\n            break;\n        default:\n            prv_encodeBlock(dataP + data_index, bufferP + result_index);\n            break;\n        }\n        data_index += 3;\n        result_index += 4;\n    }\n\n    return result_len;\n}\n\nlwm2m_data_type_t utils_depthToDatatype(uri_depth_t depth)\n{\n    switch (depth)\n    {\n    case URI_DEPTH_OBJECT:\n        return LWM2M_TYPE_OBJECT;\n    case URI_DEPTH_OBJECT_INSTANCE:\n        return LWM2M_TYPE_OBJECT_INSTANCE;\n    default:\n        break;\n    }\n\n    return LWM2M_TYPE_UNDEFINED;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/management.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    domedambrosio - Please refer to git log\n *    Toby Jaffey - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *\n *******************************************************************************/\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n#include \"internals.h\"\n#include \"object_comm.h\"\n#include <stdio.h>\n\n\n#ifdef LWM2M_CLIENT_MODE\nstatic int prv_readAttributes(multi_option_t *query,\n                              lwm2m_attributes_t *attrP)\n{\n    int64_t intValue;\n    double floatValue;\n\n    memset(attrP, 0, sizeof(lwm2m_attributes_t));\n\n    while (query != NULL)\n    {\n        if (lwm2m_strncmp((char *)query->data, ATTR_MIN_PERIOD_STR, ATTR_MIN_PERIOD_LEN) == 0)\n        {\n            if (0 != ((attrP->toSet | attrP->toClear) & LWM2M_ATTR_FLAG_MIN_PERIOD)) return -1;\n            if (query->len == ATTR_MIN_PERIOD_LEN) return -1;\n\n            if (1 != utils_textToInt(query->data + ATTR_MIN_PERIOD_LEN, query->len - ATTR_MIN_PERIOD_LEN, &intValue)) return -1;\n            if (intValue < 0) return -1;\n\n            attrP->toSet |= LWM2M_ATTR_FLAG_MIN_PERIOD;\n            attrP->minPeriod = intValue;\n        }\n        else if (lwm2m_strncmp((char *)query->data, ATTR_MIN_PERIOD_STR, ATTR_MIN_PERIOD_LEN - 1) == 0)\n        {\n            if (0 != ((attrP->toSet | attrP->toClear) & LWM2M_ATTR_FLAG_MIN_PERIOD)) return -1;\n            if (query->len != ATTR_MIN_PERIOD_LEN - 1) return -1;\n\n            attrP->toClear |= LWM2M_ATTR_FLAG_MIN_PERIOD;\n        }\n        else if (lwm2m_strncmp((char *)query->data, ATTR_MAX_PERIOD_STR, ATTR_MAX_PERIOD_LEN) == 0)\n        {\n            if (0 != ((attrP->toSet | attrP->toClear) & LWM2M_ATTR_FLAG_MAX_PERIOD)) return -1;\n            if (query->len == ATTR_MAX_PERIOD_LEN) return -1;\n\n            if (1 != utils_textToInt(query->data + ATTR_MAX_PERIOD_LEN, query->len - ATTR_MAX_PERIOD_LEN, &intValue)) return -1;\n            if (intValue < 0) return -1;\n\n            attrP->toSet |= LWM2M_ATTR_FLAG_MAX_PERIOD;\n            attrP->maxPeriod = intValue;\n        }\n        else if (lwm2m_strncmp((char *)query->data, ATTR_MAX_PERIOD_STR, ATTR_MAX_PERIOD_LEN - 1) == 0)\n        {\n            if (0 != ((attrP->toSet | attrP->toClear) & LWM2M_ATTR_FLAG_MAX_PERIOD)) return -1;\n            if (query->len != ATTR_MAX_PERIOD_LEN - 1) return -1;\n\n            attrP->toClear |= LWM2M_ATTR_FLAG_MAX_PERIOD;\n        }\n        else if (lwm2m_strncmp((char *)query->data, ATTR_GREATER_THAN_STR, ATTR_GREATER_THAN_LEN) == 0)\n        {\n            if (0 != ((attrP->toSet | attrP->toClear) & LWM2M_ATTR_FLAG_GREATER_THAN)) return -1;\n            if (query->len == ATTR_GREATER_THAN_LEN) return -1;\n\n            if (1 != utils_textToFloat(query->data + ATTR_GREATER_THAN_LEN, query->len - ATTR_GREATER_THAN_LEN, &floatValue)) return -1;\n\n            attrP->toSet |= LWM2M_ATTR_FLAG_GREATER_THAN;\n            attrP->greaterThan = floatValue;\n        }\n        else if (lwm2m_strncmp((char *)query->data, ATTR_GREATER_THAN_STR, ATTR_GREATER_THAN_LEN - 1) == 0)\n        {\n            if (0 != ((attrP->toSet | attrP->toClear) & LWM2M_ATTR_FLAG_GREATER_THAN)) return -1;\n            if (query->len != ATTR_GREATER_THAN_LEN - 1) return -1;\n\n            attrP->toClear |= LWM2M_ATTR_FLAG_GREATER_THAN;\n        }\n        else if (lwm2m_strncmp((char *)query->data, ATTR_LESS_THAN_STR, ATTR_LESS_THAN_LEN) == 0)\n        {\n            if (0 != ((attrP->toSet | attrP->toClear) & LWM2M_ATTR_FLAG_LESS_THAN)) return -1;\n            if (query->len == ATTR_LESS_THAN_LEN) return -1;\n\n            if (1 != utils_textToFloat(query->data + ATTR_LESS_THAN_LEN, query->len - ATTR_LESS_THAN_LEN, &floatValue)) return -1;\n\n            attrP->toSet |= LWM2M_ATTR_FLAG_LESS_THAN;\n            attrP->lessThan = floatValue;\n        }\n        else if (lwm2m_strncmp((char *)query->data, ATTR_LESS_THAN_STR, ATTR_LESS_THAN_LEN - 1) == 0)\n        {\n            if (0 != ((attrP->toSet | attrP->toClear) & LWM2M_ATTR_FLAG_LESS_THAN)) return -1;\n            if (query->len != ATTR_LESS_THAN_LEN - 1) return -1;\n\n            attrP->toClear |= LWM2M_ATTR_FLAG_LESS_THAN;\n        }\n        else if (lwm2m_strncmp((char *)query->data, ATTR_STEP_STR, ATTR_STEP_LEN) == 0)\n        {\n            if (0 != ((attrP->toSet | attrP->toClear) & LWM2M_ATTR_FLAG_STEP)) return -1;\n            if (query->len == ATTR_STEP_LEN) return -1;\n\n            if (1 != utils_textToFloat(query->data + ATTR_STEP_LEN, query->len - ATTR_STEP_LEN, &floatValue)) return -1;\n            if (floatValue < 0) return -1;\n\n            attrP->toSet |= LWM2M_ATTR_FLAG_STEP;\n            attrP->step = floatValue;\n        }\n        else if (lwm2m_strncmp((char *)query->data, ATTR_STEP_STR, ATTR_STEP_LEN - 1) == 0)\n        {\n            if (0 != ((attrP->toSet | attrP->toClear) & LWM2M_ATTR_FLAG_STEP)) return -1;\n            if (query->len != ATTR_STEP_LEN - 1) return -1;\n\n            attrP->toClear |= LWM2M_ATTR_FLAG_STEP;\n        }\n        else return -1;\n\n        query = query->next;\n    }\n\n    return 0;\n}\n\nuint8_t dm_handleRequest(lwm2m_context_t *contextP,\n                         lwm2m_uri_t *uriP,\n                         lwm2m_server_t *serverP,\n                         coap_packet_t *message,\n                         coap_packet_t *response)\n{\n    uint8_t result;\n    lwm2m_media_type_t format;\n\n    LOG_ARG(\"Code: %02X, server status: %s\", message->code, STR_STATUS(serverP->status));\n    LOG_URI(uriP);\n\n    if (IS_OPTION(message, COAP_OPTION_CONTENT_TYPE))\n    {\n        format = utils_convertMediaType(message->content_type);\n    }\n    else\n    {\n        format = (dm_isUriOpaqueHandle(uriP) ? LWM2M_CONTENT_OPAQUE : LWM2M_CONTENT_TLV);\n\n    }\n\n    if (uriP->objectId == LWM2M_SECURITY_OBJECT_ID)\n    {\n        return COAP_404_NOT_FOUND;\n    }\n\n    if (serverP->status != STATE_REGISTERED\n            && serverP->status != STATE_REG_UPDATE_NEEDED\n            && serverP->status != STATE_REG_FULL_UPDATE_NEEDED\n            && serverP->status != STATE_REG_UPDATE_PENDING)\n    {\n        return COAP_IGNORE;\n    }\n\n    switch (message->code)\n    {\n    case COAP_GET:\n    {\n        uint8_t *buffer = NULL;\n        size_t length = 0;\n        int res;\n\n        if (IS_OPTION(message, COAP_OPTION_OBSERVE))\n        {\n            lwm2m_data_t *dataP = NULL;\n            int size = 0;\n\n            if ((result = acc_auth_operate(contextP, uriP, OBJ_ACC_OBSERVE, serverP->shortID)) != COAP_NO_ERROR)\n            {\n                return result;\n            }\n\n            result = object_readData(contextP, uriP, &size, &dataP, NULL, serverP->shortID);\n            if (COAP_205_CONTENT == result)\n            {\n                result = observe_handleRequest(contextP, uriP, serverP, size, dataP, message, response);\n                if (COAP_205_CONTENT == result)\n                {\n                    if (IS_OPTION(message, COAP_OPTION_ACCEPT))\n                    {\n                        format = utils_convertMediaType((coap_content_type_t)message->accept[0]);\n                    }\n                    else\n                    {\n                        format = LWM2M_CONTENT_TLV;\n                    }\n\n                    if(dm_isUriOpaqueHandle(uriP))\n                    {\n                        buffer = NULL;\n                        length = 0;\n                        format = LWM2M_CONTENT_OPAQUE;\n                    }\n                    else\n                    {\n                        res = lwm2m_data_serialize(uriP, size, dataP, &format, &buffer);\n                        if (res < 0)\n                        {\n                            result = COAP_500_INTERNAL_SERVER_ERROR;\n                        }\n                        else\n                        {\n                            length = (size_t)res;\n                            LOG_ARG(\"Observe Request[/%d/%d/%d]: %.*s\\n\", uriP->objectId, uriP->instanceId, uriP->resourceId, length, buffer);\n                        }\n                    }\n                }\n                lwm2m_data_free(size, dataP);\n            }\n        }\n        else if (IS_OPTION(message, COAP_OPTION_ACCEPT)\n                 && message->accept_num == 1\n                 && message->accept[0] == APPLICATION_LINK_FORMAT)\n        {\n            if ((result = acc_auth_operate(contextP, uriP, OBJ_ACC_DISCOVER, serverP->shortID)) != COAP_NO_ERROR)\n            {\n                return result;\n            }\n            format = LWM2M_CONTENT_LINK;\n            result = object_discover(contextP, uriP, serverP, &buffer, &length);\n        }\n        else\n        {\n            if ((result = acc_auth_operate(contextP, uriP, OBJ_ACC_READ, serverP->shortID)) != COAP_NO_ERROR)\n            {\n                return result;\n            }\n            if (IS_OPTION(message, COAP_OPTION_ACCEPT))\n            {\n                format = utils_convertMediaType((coap_content_type_t)message->accept[0]);\n            }\n\n            result = object_read(contextP, uriP, &format, &buffer, &length, serverP->shortID);\n        }\n        if (COAP_205_CONTENT == result)\n        {\n            coap_set_header_content_type(response, format);\n            coap_set_payload(response, buffer, length);\n            // lwm2m_handle_packet will free buffer\n        }\n        else\n        {\n            lwm2m_free(buffer);\n        }\n    }\n    break;\n\n    case COAP_POST:\n    {\n        if (!LWM2M_URI_IS_SET_INSTANCE(uriP))\n        {\n            if ((result = acc_auth_operate(contextP, uriP, OBJ_ACC_CREATE, serverP->shortID)) != COAP_NO_ERROR)\n            {\n                return result;\n            }\n            result = object_create(contextP, uriP, format, message->payload, message->payload_len);\n            if (result == COAP_201_CREATED)\n            {\n                //longest uri is /65535/65535 = 12 + 1 (null) chars\n                char location_path[13] = \"\";\n                //instanceId expected\n                if ((uriP->flag & LWM2M_URI_FLAG_INSTANCE_ID) == 0)\n                {\n                    result = COAP_500_INTERNAL_SERVER_ERROR;\n                    break;\n                }\n\n                if (sprintf(location_path, \"/%d/%d\", uriP->objectId, uriP->instanceId) < 0)\n                {\n                    result = COAP_500_INTERNAL_SERVER_ERROR;\n                    break;\n                }\n                coap_set_header_location_path(response, location_path);\n\n                lwm2m_update_registration(contextP, 0, true);\n            }\n        }\n        else if (!LWM2M_URI_IS_SET_RESOURCE(uriP))\n        {\n            if ((result = acc_auth_operate(contextP, uriP, OBJ_ACC_WRITE, serverP->shortID)) != COAP_NO_ERROR)\n            {\n                return result;\n            }\n            result = object_write(contextP, uriP, format, message->payload, message->payload_len);\n        }\n        else\n        {\n            if ((result = acc_auth_operate(contextP, uriP, OBJ_ACC_EXCUTE, serverP->shortID)) != COAP_NO_ERROR)\n            {\n                return result;\n            }\n            result = object_execute(contextP, uriP, message->payload, message->payload_len);\n        }\n\n    }\n    break;\n\n    case COAP_PUT:\n    {\n        if (IS_OPTION(message, COAP_OPTION_URI_QUERY))\n        {\n            lwm2m_attributes_t attr;\n\n            if ((result = acc_auth_operate(contextP, uriP, OBJ_ACC_WRITE_ATTR, serverP->shortID)) != COAP_NO_ERROR)\n            {\n                return result;\n            }\n            if (0 != prv_readAttributes(message->uri_query, &attr))\n            {\n                result = COAP_400_BAD_REQUEST;\n            }\n            else\n            {\n                result = observe_setParameters(contextP, uriP, serverP, &attr);\n            }\n        }\n        else if (LWM2M_URI_IS_SET_INSTANCE(uriP))\n        {\n            if ((result = acc_auth_operate(contextP, uriP, OBJ_ACC_WRITE, serverP->shortID)) != COAP_NO_ERROR)\n            {\n                return result;\n            }\n            result = object_write(contextP, uriP, format, message->payload, message->payload_len);\n        }\n        else\n        {\n            result = COAP_400_BAD_REQUEST;\n        }\n    }\n    break;\n\n    case COAP_DELETE:\n    {\n        if (!LWM2M_URI_IS_SET_INSTANCE(uriP) || LWM2M_URI_IS_SET_RESOURCE(uriP))\n        {\n            result = COAP_400_BAD_REQUEST;\n        }\n        else\n        {\n            if ((result = acc_auth_operate(contextP, uriP, OBJ_ACC_DELETE, serverP->shortID)) != COAP_NO_ERROR)\n            {\n                return result;\n            }\n            result = object_delete(contextP, uriP);\n            if (result == COAP_202_DELETED)\n            {\n                lwm2m_update_registration(contextP, 0, true);\n            }\n        }\n    }\n    break;\n\n    default:\n        result = COAP_400_BAD_REQUEST;\n        break;\n    }\n\n    return result;\n}\n\n#endif\n\n#ifdef LWM2M_SERVER_MODE\n\n#define ID_AS_STRING_MAX_LEN 8\n\nstatic void prv_resultCallback(lwm2m_transaction_t *transacP,\n                               void *message)\n{\n    dm_data_t *dataP = (dm_data_t *)transacP->userData;\n\n    if (message == NULL)\n    {\n        dataP->callback(dataP->clientID,\n                        &dataP->uri,\n                        COAP_503_SERVICE_UNAVAILABLE,\n                        LWM2M_CONTENT_TEXT, NULL, 0,\n                        dataP->userData);\n    }\n    else\n    {\n        coap_packet_t *packet = (coap_packet_t *)message;\n\n        //if packet is a CREATE response and the instanceId was assigned by the client\n        if (packet->code == COAP_201_CREATED\n                && packet->location_path != NULL)\n        {\n            char *locationString = NULL;\n            int result = 0;\n            lwm2m_uri_t locationUri;\n\n            locationString = coap_get_multi_option_as_string(packet->location_path);\n            if (locationString == NULL)\n            {\n                LOG(\"Error: coap_get_multi_option_as_string() failed for Location_path option in prv_resultCallback()\");\n                return;\n            }\n\n            result = lwm2m_stringToUri(locationString, strlen(locationString), &locationUri);\n            if (result == 0)\n            {\n                LOG(\"Error: lwm2m_stringToUri() failed for Location_path option in prv_resultCallback()\");\n                lwm2m_free(locationString);\n                return;\n            }\n\n            ((dm_data_t *)transacP->userData)->uri.instanceId = locationUri.instanceId;\n            ((dm_data_t *)transacP->userData)->uri.flag = locationUri.flag;\n\n            lwm2m_free(locationString);\n        }\n\n        dataP->callback(dataP->clientID,\n                        &dataP->uri,\n                        packet->code,\n                        utils_convertMediaType(packet->content_type),\n                        packet->payload,\n                        packet->payload_len,\n                        dataP->userData);\n    }\n    lwm2m_free(dataP);\n}\n\nstatic int prv_makeOperation(lwm2m_context_t *contextP,\n                             uint16_t clientID,\n                             lwm2m_uri_t *uriP,\n                             coap_method_t method,\n                             lwm2m_media_type_t format,\n                             uint8_t *buffer,\n                             int length,\n                             lwm2m_result_callback_t callback,\n                             void *userData)\n{\n    lwm2m_client_t *clientP;\n    lwm2m_transaction_t *transaction;\n    dm_data_t *dataP;\n\n    clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID);\n    if (clientP == NULL) return COAP_404_NOT_FOUND;\n\n    transaction = transaction_new(clientP->sessionH, method, clientP->altPath, uriP, contextP->nextMID++, 4, NULL);\n    if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    if (method == COAP_GET)\n    {\n        coap_set_header_accept(transaction->message, format);\n    }\n    else if (buffer != NULL)\n    {\n        coap_set_header_content_type(transaction->message, format);\n        // TODO: Take care of fragmentation\n        coap_set_payload(transaction->message, buffer, length);\n    }\n\n    if (callback != NULL)\n    {\n        dataP = (dm_data_t *)lwm2m_malloc(sizeof(dm_data_t));\n        if (dataP == NULL)\n        {\n            transaction_free(transaction);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        memcpy(&dataP->uri, uriP, sizeof(lwm2m_uri_t));\n        dataP->clientID = clientP->internalID;\n        dataP->callback = callback;\n        dataP->userData = userData;\n\n        transaction->callback = prv_resultCallback;\n        transaction->userData = (void *)dataP;\n    }\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n\n    return transaction_send(contextP, transaction);\n}\n\nint lwm2m_dm_read(lwm2m_context_t *contextP,\n                  uint16_t clientID,\n                  lwm2m_uri_t *uriP,\n                  lwm2m_result_callback_t callback,\n                  void *userData)\n{\n    lwm2m_client_t *clientP;\n    lwm2m_media_type_t format;\n\n    LOG_ARG(\"clientID: %d\", clientID);\n    LOG_URI(uriP);\n\n    clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID);\n    if (clientP == NULL) return COAP_404_NOT_FOUND;\n\n    if (clientP->supportJSON == true)\n    {\n        format = LWM2M_CONTENT_JSON;\n    }\n    else\n    {\n        format = LWM2M_CONTENT_TLV;\n    }\n\n    return prv_makeOperation(contextP, clientID, uriP,\n                             COAP_GET,\n                             format,\n                             NULL, 0,\n                             callback, userData);\n}\n\nint lwm2m_dm_write(lwm2m_context_t *contextP,\n                   uint16_t clientID,\n                   lwm2m_uri_t *uriP,\n                   lwm2m_media_type_t format,\n                   uint8_t *buffer,\n                   int length,\n                   lwm2m_result_callback_t callback,\n                   void *userData)\n{\n    LOG_ARG(\"clientID: %d, format: %s, length: %d\", clientID, STR_MEDIA_TYPE(format), length);\n    LOG_URI(uriP);\n    if (!LWM2M_URI_IS_SET_INSTANCE(uriP)\n            || length == 0)\n    {\n        return COAP_400_BAD_REQUEST;\n    }\n\n    if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n    {\n        return prv_makeOperation(contextP, clientID, uriP,\n                                 COAP_PUT,\n                                 format, buffer, length,\n                                 callback, userData);\n    }\n    else\n    {\n        return prv_makeOperation(contextP, clientID, uriP,\n                                 COAP_POST,\n                                 format, buffer, length,\n                                 callback, userData);\n    }\n}\n\nint lwm2m_dm_execute(lwm2m_context_t *contextP,\n                     uint16_t clientID,\n                     lwm2m_uri_t *uriP,\n                     lwm2m_media_type_t format,\n                     uint8_t *buffer,\n                     int length,\n                     lwm2m_result_callback_t callback,\n                     void *userData)\n{\n    LOG_ARG(\"clientID: %d, format: %s, length: %d\", clientID, STR_MEDIA_TYPE(format), length);\n    LOG_URI(uriP);\n    if (!LWM2M_URI_IS_SET_RESOURCE(uriP))\n    {\n        return COAP_400_BAD_REQUEST;\n    }\n\n    return prv_makeOperation(contextP, clientID, uriP,\n                             COAP_POST,\n                             format, buffer, length,\n                             callback, userData);\n}\n\nint lwm2m_dm_create(lwm2m_context_t *contextP,\n                    uint16_t clientID,\n                    lwm2m_uri_t *uriP,\n                    lwm2m_media_type_t format,\n                    uint8_t *buffer,\n                    int length,\n                    lwm2m_result_callback_t callback,\n                    void *userData)\n{\n    LOG_ARG(\"clientID: %d, format: %s, length: %d\", clientID, STR_MEDIA_TYPE(format), length);\n    LOG_URI(uriP);\n\n    if (LWM2M_URI_IS_SET_INSTANCE(uriP)\n            || length == 0)\n    {\n        return COAP_400_BAD_REQUEST;\n    }\n\n    return prv_makeOperation(contextP, clientID, uriP,\n                             COAP_POST,\n                             format, buffer, length,\n                             callback, userData);\n}\n\nint lwm2m_dm_delete(lwm2m_context_t *contextP,\n                    uint16_t clientID,\n                    lwm2m_uri_t *uriP,\n                    lwm2m_result_callback_t callback,\n                    void *userData)\n{\n    LOG_ARG(\"clientID: %d\", clientID);\n    LOG_URI(uriP);\n    if (!LWM2M_URI_IS_SET_INSTANCE(uriP)\n            || LWM2M_URI_IS_SET_RESOURCE(uriP))\n    {\n        return COAP_400_BAD_REQUEST;\n    }\n\n    return prv_makeOperation(contextP, clientID, uriP,\n                             COAP_DELETE,\n                             LWM2M_CONTENT_TEXT, NULL, 0,\n                             callback, userData);\n}\n\nint lwm2m_dm_write_attributes(lwm2m_context_t *contextP,\n                              uint16_t clientID,\n                              lwm2m_uri_t *uriP,\n                              lwm2m_attributes_t *attrP,\n                              lwm2m_result_callback_t callback,\n                              void *userData)\n{\n#define _PRV_BUFFER_SIZE 32\n    lwm2m_client_t *clientP;\n    lwm2m_transaction_t *transaction;\n    coap_packet_t *coap_pkt;\n    uint8_t buffer[_PRV_BUFFER_SIZE];\n    size_t length;\n\n    LOG_ARG(\"clientID: %d\", clientID);\n    LOG_URI(uriP);\n    if (attrP == NULL) return COAP_400_BAD_REQUEST;\n\n    if (0 != (attrP->toSet & attrP->toClear)) return COAP_400_BAD_REQUEST;\n    if (0 != (attrP->toSet & ATTR_FLAG_NUMERIC) && !LWM2M_URI_IS_SET_RESOURCE(uriP)) return COAP_400_BAD_REQUEST;\n    if (ATTR_FLAG_NUMERIC == (attrP->toSet & ATTR_FLAG_NUMERIC)\n            && (attrP->lessThan + 2 * attrP->step >= attrP->greaterThan)) return COAP_400_BAD_REQUEST;\n\n    clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID);\n    if (clientP == NULL) return COAP_404_NOT_FOUND;\n\n    transaction = transaction_new(clientP->sessionH, COAP_PUT, clientP->altPath, uriP, contextP->nextMID++, 4, NULL);\n    if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    if (callback != NULL)\n    {\n        dm_data_t *dataP;\n\n        dataP = (dm_data_t *)lwm2m_malloc(sizeof(dm_data_t));\n        if (dataP == NULL)\n        {\n            transaction_free(transaction);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        memcpy(&dataP->uri, uriP, sizeof(lwm2m_uri_t));\n        dataP->clientID = clientP->internalID;\n        dataP->callback = callback;\n        dataP->userData = userData;\n\n        transaction->callback = prv_resultCallback;\n        transaction->userData = (void *)dataP;\n    }\n\n    coap_pkt = (coap_packet_t *)transaction->message;\n    free_multi_option(coap_pkt->uri_query);\n    if (attrP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD)\n    {\n        memcpy(buffer, ATTR_MIN_PERIOD_STR, ATTR_MIN_PERIOD_LEN);\n        length = utils_intToText(attrP->minPeriod, buffer + ATTR_MIN_PERIOD_LEN, _PRV_BUFFER_SIZE - ATTR_MIN_PERIOD_LEN);\n        if (length == 0)\n        {\n            transaction_free(transaction);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        coap_add_multi_option(&(coap_pkt->uri_query), buffer, ATTR_MIN_PERIOD_LEN + length, 0);\n        SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    }\n    if (attrP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD)\n    {\n        memcpy(buffer, ATTR_MAX_PERIOD_STR, ATTR_MAX_PERIOD_LEN);\n        length = utils_intToText(attrP->maxPeriod, buffer + ATTR_MAX_PERIOD_LEN, _PRV_BUFFER_SIZE - ATTR_MAX_PERIOD_LEN);\n        if (length == 0)\n        {\n            transaction_free(transaction);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        coap_add_multi_option(&(coap_pkt->uri_query), buffer, ATTR_MAX_PERIOD_LEN + length, 0);\n        SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    }\n    if (attrP->toSet & LWM2M_ATTR_FLAG_GREATER_THAN)\n    {\n        memcpy(buffer, ATTR_GREATER_THAN_STR, ATTR_GREATER_THAN_LEN);\n        length = utils_floatToText(attrP->greaterThan, buffer + ATTR_GREATER_THAN_LEN, _PRV_BUFFER_SIZE - ATTR_GREATER_THAN_LEN);\n        if (length == 0)\n        {\n            transaction_free(transaction);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        coap_add_multi_option(&(coap_pkt->uri_query), buffer, ATTR_GREATER_THAN_LEN + length, 0);\n        SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    }\n    if (attrP->toSet & LWM2M_ATTR_FLAG_LESS_THAN)\n    {\n        memcpy(buffer, ATTR_LESS_THAN_STR, ATTR_LESS_THAN_LEN);\n        length = utils_floatToText(attrP->lessThan, buffer + ATTR_LESS_THAN_LEN, _PRV_BUFFER_SIZE - ATTR_LESS_THAN_LEN);\n        if (length == 0)\n        {\n            transaction_free(transaction);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        coap_add_multi_option(&(coap_pkt->uri_query), buffer, ATTR_LESS_THAN_LEN + length, 0);\n        SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    }\n    if (attrP->toSet & LWM2M_ATTR_FLAG_STEP)\n    {\n        memcpy(buffer, ATTR_STEP_STR, ATTR_STEP_LEN);\n        length = utils_floatToText(attrP->step, buffer + ATTR_STEP_LEN, _PRV_BUFFER_SIZE - ATTR_STEP_LEN);\n        if (length == 0)\n        {\n            transaction_free(transaction);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        coap_add_multi_option(&(coap_pkt->uri_query), buffer, ATTR_STEP_LEN + length, 0);\n        SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    }\n    if (attrP->toClear & LWM2M_ATTR_FLAG_MIN_PERIOD)\n    {\n        coap_add_multi_option(&(coap_pkt->uri_query), (uint8_t *)ATTR_MIN_PERIOD_STR, ATTR_MIN_PERIOD_LEN - 1, 0);\n        SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    }\n    if (attrP->toClear & LWM2M_ATTR_FLAG_MAX_PERIOD)\n    {\n        coap_add_multi_option(&(coap_pkt->uri_query), (uint8_t *)ATTR_MAX_PERIOD_STR, ATTR_MAX_PERIOD_LEN - 1, 0);\n        SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    }\n    if (attrP->toClear & LWM2M_ATTR_FLAG_GREATER_THAN)\n    {\n        coap_add_multi_option(&(coap_pkt->uri_query), (uint8_t *)ATTR_GREATER_THAN_STR, ATTR_GREATER_THAN_LEN - 1, 0);\n        SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    }\n    if (attrP->toClear & LWM2M_ATTR_FLAG_LESS_THAN)\n    {\n        coap_add_multi_option(&(coap_pkt->uri_query), (uint8_t *)ATTR_LESS_THAN_STR, ATTR_LESS_THAN_LEN - 1, 0);\n        SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    }\n    if (attrP->toClear & LWM2M_ATTR_FLAG_STEP)\n    {\n        coap_add_multi_option(&(coap_pkt->uri_query), (uint8_t *)ATTR_STEP_STR, ATTR_STEP_LEN - 1, 0);\n        SET_OPTION(coap_pkt, COAP_OPTION_URI_QUERY);\n    }\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n\n    return transaction_send(contextP, transaction);\n}\n\nint lwm2m_dm_discover(lwm2m_context_t *contextP,\n                      uint16_t clientID,\n                      lwm2m_uri_t *uriP,\n                      lwm2m_result_callback_t callback,\n                      void *userData)\n{\n    lwm2m_client_t *clientP;\n    lwm2m_transaction_t *transaction;\n    dm_data_t *dataP;\n\n    LOG_ARG(\"clientID: %d\", clientID);\n    LOG_URI(uriP);\n    clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID);\n    if (clientP == NULL) return COAP_404_NOT_FOUND;\n\n    transaction = transaction_new(clientP->sessionH, COAP_GET, clientP->altPath, uriP, contextP->nextMID++, 4, NULL);\n    if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    coap_set_header_accept(transaction->message, LWM2M_CONTENT_LINK);\n\n    if (callback != NULL)\n    {\n        dataP = (dm_data_t *)lwm2m_malloc(sizeof(dm_data_t));\n        if (dataP == NULL)\n        {\n            transaction_free(transaction);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        memcpy(&dataP->uri, uriP, sizeof(lwm2m_uri_t));\n        dataP->clientID = clientP->internalID;\n        dataP->callback = callback;\n        dataP->userData = userData;\n\n        transaction->callback = prv_resultCallback;\n        transaction->userData = (void *)dataP;\n    }\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n\n    return transaction_send(contextP, transaction);\n}\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/objects.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Fabien Fleutot - Please refer to git log\n *    Toby Jaffey - Please refer to git log\n *    Benjamin Cabe? - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *    Scott Bertin - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n#include \"internals.h\"\n\n#ifdef LWM2M_CLIENT_MODE\n\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include \"object_comm.h\"\n\nuint8_t object_checkReadable(lwm2m_context_t *contextP,\n                             lwm2m_uri_t *uriP)\n{\n    uint8_t result;\n    lwm2m_object_t *targetP;\n    lwm2m_data_t *dataP = NULL;\n    int size;\n\n    LOG_URI(uriP);\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n    if (NULL == targetP->readFunc) return COAP_405_METHOD_NOT_ALLOWED;\n\n    if (!LWM2M_URI_IS_SET_INSTANCE(uriP)) return COAP_205_CONTENT;\n\n    if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND;\n\n    if (!LWM2M_URI_IS_SET_RESOURCE(uriP)) return COAP_205_CONTENT;\n\n    size = 1;\n    dataP = lwm2m_data_new(1);\n    if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    dataP->id = uriP->resourceId;\n\n    result = targetP->readFunc(uriP->instanceId, &size, &dataP, NULL, targetP);\n    lwm2m_data_free(1, dataP);\n\n    return result;\n}\n\nuint8_t object_checkNumeric(lwm2m_context_t *contextP,\n                            lwm2m_uri_t *uriP)\n{\n    uint8_t result;\n    lwm2m_object_t *targetP;\n    lwm2m_data_t *dataP = NULL;\n    int size;\n\n    LOG_URI(uriP);\n    if (!LWM2M_URI_IS_SET_RESOURCE(uriP)) return COAP_405_METHOD_NOT_ALLOWED;\n\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n    if (NULL == targetP->readFunc) return COAP_405_METHOD_NOT_ALLOWED;\n\n    size = 1;\n    dataP = lwm2m_data_new(1);\n    if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    dataP->id = uriP->resourceId;\n\n    result = targetP->readFunc(uriP->instanceId, &size, &dataP, NULL, targetP);\n    if (result == COAP_205_CONTENT)\n    {\n        switch (dataP->type)\n        {\n        case LWM2M_TYPE_INTEGER:\n        case LWM2M_TYPE_FLOAT:\n            break;\n        default:\n            result = COAP_405_METHOD_NOT_ALLOWED;\n        }\n    }\n\n    lwm2m_data_free(1, dataP);\n\n    return result;\n}\n\nstatic uint8_t prv_init_forbidden(lwm2m_context_t *contextP,\n                                  lwm2m_object_t *targetP,\n                                  uint16_t objId,\n                                  uint16_t serverId,\n                                  int *sizeP,\n                                  uint8_t **forbidden)\n{\n    lwm2m_list_t *instanceP;\n    lwm2m_uri_t uriP;\n    int i;\n\n    uriP.flag = LWM2M_URI_FLAG_INSTANCE_ID;\n    uriP.objectId = objId;\n\n    i = 0;\n    *forbidden = (uint8_t *)lwm2m_malloc(*sizeP);\n    if (*forbidden == NULL)\n    {\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n    memset(*forbidden, 0, *sizeP);\n    for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next)\n    {\n        uriP.instanceId = instanceP->id;\n        if (acc_auth_operate(contextP, &uriP, OBJ_ACC_READ, serverId) != COAP_NO_ERROR)\n        {\n            (*sizeP)--;\n            (*forbidden)[i] = 1;\n        }\n        ++i;\n    }\n\n    if (*sizeP == 0)\n    {\n        lwm2m_free(*forbidden);\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    return COAP_NO_ERROR;\n}\n\nuint8_t object_readData(lwm2m_context_t *contextP,\n                        lwm2m_uri_t *uriP,\n                        int *sizeP,\n                        lwm2m_data_t **dataP,\n                        lwm2m_data_cfg_t *cfg,\n                        uint16_t serverId)\n{\n    uint8_t result;\n    lwm2m_object_t *targetP;\n\n    LOG_URI(uriP);\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n    if (NULL == targetP->readFunc) return COAP_405_METHOD_NOT_ALLOWED;\n\n    if (LWM2M_URI_IS_SET_INSTANCE(uriP))\n    {\n        if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND;\n\n        // single instance read\n        if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n        {\n            *sizeP = 1;\n            *dataP = lwm2m_data_new(*sizeP);\n            if (*dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n            (*dataP)->id = uriP->resourceId;\n        }\n\n        result = targetP->readFunc(uriP->instanceId, sizeP, dataP, cfg, targetP);\n    }\n    else\n    {\n        // multiple object instances read\n        lwm2m_list_t *instanceP;\n        uint8_t *forbidden = NULL;\n        int i;\n        int j;\n\n        result = COAP_205_CONTENT;\n\n        *sizeP = 0;\n        for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next)\n        {\n            (*sizeP)++;\n        }\n\n        if (*sizeP == 0)\n        {\n            *dataP = NULL;\n        }\n        else\n        {\n            if ((result = prv_init_forbidden(contextP, targetP,\n                                             uriP->objectId, serverId, sizeP, &forbidden)) != COAP_NO_ERROR)\n            {\n                *dataP = NULL;\n                return result;\n            }\n\n            *dataP = lwm2m_data_new(*sizeP);\n            if (*dataP == NULL)\n            {\n                if (forbidden != NULL)\n                {\n                    lwm2m_free(forbidden);\n                }\n                return COAP_500_INTERNAL_SERVER_ERROR;\n            }\n\n            instanceP = targetP->instanceList;\n            i = 0;\n            j = 0;\n            while (instanceP != NULL && result == COAP_205_CONTENT)\n            {\n                if (forbidden[i] == 0)\n                {\n                    result = targetP->readFunc(instanceP->id, (int *) & ((*dataP)[j].value.asChildren.count), &((*dataP)[j].value.asChildren.array), cfg, targetP);\n                    (*dataP)[j].type = LWM2M_TYPE_OBJECT_INSTANCE;\n                    (*dataP)[j].id = instanceP->id;\n                    j++;\n                }\n                instanceP = instanceP->next;\n                i++;\n            }\n        }\n        if (forbidden != NULL)\n        {\n            lwm2m_free(forbidden);\n        }\n    }\n\n    LOG_ARG(\"result: %u.%2u, size: %d\", (result & 0xFF) >> 5, (result & 0x1F), *sizeP);\n    return result;\n}\n\n\nuint8_t object_read(lwm2m_context_t *contextP,\n                    lwm2m_uri_t *uriP,\n                    lwm2m_media_type_t *formatP,\n                    uint8_t **bufferP,\n                    size_t *lengthP,\n                    uint16_t serverId)\n{\n    uint8_t result;\n    lwm2m_data_t *dataP = NULL;\n    int size = 0;\n    int res;\n\n    LOG_URI(uriP);\n    result = object_readData(contextP, uriP, &size, &dataP, NULL, serverId);\n\n    if (result == COAP_205_CONTENT)\n    {\n        res = lwm2m_data_serialize(uriP, size, dataP, formatP, bufferP);\n        if (res < 0)\n        {\n            result = COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        else\n        {\n            *lengthP = (size_t)res;\n        }\n    }\n    lwm2m_data_free(size, dataP);\n\n    LOG_ARG(\"result: %u.%2u, length: %d\", (result & 0xFF) >> 5, (result & 0x1F), *lengthP);\n\n    return result;\n}\n\nuint8_t object_write(lwm2m_context_t *contextP,\n                     lwm2m_uri_t *uriP,\n                     lwm2m_media_type_t format,\n                     uint8_t *buffer,\n                     size_t length)\n{\n    uint8_t result = NO_ERROR;\n    lwm2m_object_t *targetP;\n    lwm2m_data_t *dataP = NULL;\n    int size = 0;\n\n    LOG_URI(uriP);\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId);\n    if (NULL == targetP)\n    {\n        result = COAP_404_NOT_FOUND;\n    }\n    else if (NULL == targetP->writeFunc)\n    {\n        result = COAP_405_METHOD_NOT_ALLOWED;\n    }\n    else\n    {\n        size = lwm2m_data_parse(uriP, buffer, length, format, &dataP);\n        if (size == 0)\n        {\n            result = COAP_406_NOT_ACCEPTABLE;\n        }\n    }\n    if (result == NO_ERROR)\n    {\n        result = targetP->writeFunc(uriP->instanceId, size, dataP, targetP);\n        lwm2m_data_free(size, dataP);\n    }\n\n    LOG_ARG(\"result: %u.%2u\", (result & 0xFF) >> 5, (result & 0x1F));\n\n    return result;\n}\n\nuint8_t object_execute(lwm2m_context_t *contextP,\n                       lwm2m_uri_t *uriP,\n                       uint8_t *buffer,\n                       size_t length)\n{\n    lwm2m_object_t *targetP;\n\n    LOG_URI(uriP);\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n    if (NULL == targetP->executeFunc) return COAP_405_METHOD_NOT_ALLOWED;\n    if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND;\n\n    return targetP->executeFunc(uriP->instanceId, uriP->resourceId, buffer, length, targetP);\n}\n\nuint8_t object_create(lwm2m_context_t *contextP,\n                      lwm2m_uri_t *uriP,\n                      lwm2m_media_type_t format,\n                      uint8_t *buffer,\n                      size_t length)\n{\n    lwm2m_object_t *targetP;\n    lwm2m_data_t *dataP = NULL;\n    int size = 0;\n    uint8_t result;\n\n    LOG_URI(uriP);\n\n    if (length == 0 || buffer == 0)\n    {\n        return COAP_400_BAD_REQUEST;\n    }\n\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n    if (NULL == targetP->createFunc) return COAP_405_METHOD_NOT_ALLOWED;\n\n    size = lwm2m_data_parse(uriP, buffer, length, format, &dataP);\n    if (size <= 0) return COAP_400_BAD_REQUEST;\n\n    switch (dataP[0].type)\n    {\n    case LWM2M_TYPE_OBJECT:\n        result = COAP_400_BAD_REQUEST;\n        goto exit;\n\n    case LWM2M_TYPE_OBJECT_INSTANCE:\n        if (size != 1)\n        {\n            result = COAP_400_BAD_REQUEST;\n            goto exit;\n        }\n        if (NULL != lwm2m_list_find(targetP->instanceList, dataP[0].id))\n        {\n            // Instance already exists\n            result = COAP_406_NOT_ACCEPTABLE;\n            goto exit;\n        }\n        result = targetP->createFunc(dataP[0].id, dataP[0].value.asChildren.count, dataP[0].value.asChildren.array, targetP);\n        uriP->instanceId = dataP[0].id;\n        uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID;\n        break;\n\n    default:\n        if (!LWM2M_URI_IS_SET_INSTANCE(uriP))\n        {\n            uriP->instanceId = lwm2m_list_newId(targetP->instanceList);\n            uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID;\n        }\n        result = targetP->createFunc(uriP->instanceId, size, dataP, targetP);\n        break;\n    }\n\nexit:\n    lwm2m_data_free(size, dataP);\n\n    LOG_ARG(\"result: %u.%2u\", (result & 0xFF) >> 5, (result & 0x1F));\n\n    return result;\n}\n\nuint8_t object_delete(lwm2m_context_t *contextP,\n                      lwm2m_uri_t *uriP)\n{\n    lwm2m_object_t *objectP;\n    uint8_t result;\n\n    LOG_URI(uriP);\n    objectP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId);\n    if (NULL == objectP) return COAP_404_NOT_FOUND;\n    if (NULL == objectP->deleteFunc) return COAP_405_METHOD_NOT_ALLOWED;\n\n    LOG(\"Entering\");\n\n    if (LWM2M_URI_IS_SET_INSTANCE(uriP))\n    {\n        result = objectP->deleteFunc(uriP->instanceId, objectP);\n        if (result == COAP_202_DELETED)\n        {\n            observe_clear(contextP, uriP);\n        }\n    }\n    else\n    {\n        lwm2m_list_t *instanceP;\n\n        result = COAP_202_DELETED;\n        instanceP = objectP->instanceList;\n        while (NULL != instanceP\n                && result == COAP_202_DELETED)\n        {\n            uriP->instanceId = instanceP->id;\n            result = objectP->deleteFunc(instanceP->id, objectP);\n            if (result == COAP_202_DELETED)\n            {\n                uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID;\n                observe_clear(contextP, uriP);\n                uriP->flag &= ~LWM2M_URI_FLAG_INSTANCE_ID;\n            }\n            instanceP = objectP->instanceList;\n        }\n    }\n\n    LOG_ARG(\"result: %u.%2u\", (result & 0xFF) >> 5, (result & 0x1F));\n\n    return result;\n}\n\nuint8_t object_discover(lwm2m_context_t *contextP,\n                        lwm2m_uri_t *uriP,\n                        lwm2m_server_t *serverP,\n                        uint8_t **bufferP,\n                        size_t *lengthP)\n{\n    uint8_t result;\n    lwm2m_object_t *targetP;\n    lwm2m_data_t *dataP = NULL;\n    int size = 0;\n\n    LOG_URI(uriP);\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n    if (NULL == targetP->discoverFunc) return COAP_501_NOT_IMPLEMENTED;\n\n    if (LWM2M_URI_IS_SET_INSTANCE(uriP))\n    {\n        if (NULL == lwm2m_list_find(targetP->instanceList, uriP->instanceId)) return COAP_404_NOT_FOUND;\n\n        // single instance read\n        if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n        {\n            size = 1;\n            dataP = lwm2m_data_new(size);\n            if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n            dataP->id = uriP->resourceId;\n        }\n\n        result = targetP->discoverFunc(uriP->instanceId, &size, &dataP, targetP);\n    }\n    else\n    {\n        // multiple object instances read\n        lwm2m_list_t *instanceP;\n        int i;\n\n        result = COAP_205_CONTENT;\n\n        size = 0;\n        for (instanceP = targetP->instanceList; instanceP != NULL ; instanceP = instanceP->next)\n        {\n            size++;\n        }\n\n        if (size != 0)\n        {\n            dataP = lwm2m_data_new(size);\n            if (dataP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n            instanceP = targetP->instanceList;\n            i = 0;\n            while (instanceP != NULL && result == COAP_205_CONTENT)\n            {\n                result = targetP->discoverFunc(instanceP->id, (int *) & (dataP[i].value.asChildren.count), &(dataP[i].value.asChildren.array), targetP);\n                dataP[i].type = LWM2M_TYPE_OBJECT_INSTANCE;\n                dataP[i].id = instanceP->id;\n                i++;\n                instanceP = instanceP->next;\n            }\n        }\n    }\n\n    if (result == COAP_205_CONTENT)\n    {\n        int len;\n\n        len = discover_serialize(contextP, uriP, serverP, size, dataP, bufferP);\n        if (len <= 0) result = COAP_500_INTERNAL_SERVER_ERROR;\n        else *lengthP = len;\n    }\n    lwm2m_data_free(size, dataP);\n\n    LOG_ARG(\"result: %u.%2u\", (result & 0xFF) >> 5, (result & 0x1F));\n\n    return result;\n}\n\nbool object_isInstanceNew(lwm2m_context_t *contextP,\n                          uint16_t objectId,\n                          uint16_t instanceId)\n{\n    lwm2m_object_t *targetP;\n\n    LOG(\"Entering\");\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, objectId);\n    if (targetP != NULL)\n    {\n        if (NULL != lwm2m_list_find(targetP->instanceList, instanceId))\n        {\n            return false;\n        }\n    }\n\n    return true;\n}\n\nstatic int prv_getObjectTemplate(uint8_t *buffer,\n                                 size_t length,\n                                 uint16_t id)\n{\n    int index;\n    int result;\n\n    if (length < REG_OBJECT_MIN_LEN) return -1;\n\n    buffer[0] = '<';\n    buffer[1] = '/';\n    index = 2;\n\n    result = utils_intToText(id, buffer + index, length - index);\n    if (result == 0) return -1;\n    index += result;\n\n    if (length - index < REG_OBJECT_MIN_LEN - 3) return -1;\n    buffer[index] = '/';\n    index++;\n\n    return index;\n}\n\nint object_getRegisterPayloadBufferLength(lwm2m_context_t *contextP)\n{\n    size_t index;\n    int result;\n    lwm2m_object_t *objectP;\n    char buffer[REG_OBJECT_MIN_LEN + 5];\n\n    LOG(\"Entering\");\n    index = strlen(REG_START);\n\n    if ((contextP->altPath != NULL)\n            && (contextP->altPath[0] != 0))\n    {\n        index += strlen(contextP->altPath);\n    }\n    else\n    {\n        index += strlen(REG_DEFAULT_PATH); // \"/\"\n    }\n\n    index += strlen(REG_LWM2M_RESOURCE_TYPE);//\">;rt=\\\"oma.lwm2m\\\";ct=11543,\"\n\n    for (objectP = contextP->objectList; objectP != NULL; objectP = objectP->next)\n    {\n        size_t start;\n        size_t length;\n\n        if (objectP->objID == LWM2M_SECURITY_OBJECT_ID) continue;\n\n        start = index;\n        result = prv_getObjectTemplate((uint8_t *)buffer, sizeof(buffer), objectP->objID);\n        if (result < 0) return 0;\n        length = result;\n        index += length;\n\n        if (objectP->instanceList == NULL)\n        {\n            index -= 1;\n            index += strlen(REG_PATH_END); //\">,\"\n        }\n        else\n        {\n            lwm2m_list_t *targetP;\n            for (targetP = objectP->instanceList ; targetP != NULL ; targetP = targetP->next)\n            {\n                if (index != start + length)\n                {\n                    index += length;\n                }\n\n                result = utils_intToText(targetP->id, (uint8_t *)buffer, sizeof(buffer));\n                if (result == 0) return 0;\n                index += result;\n\n                index += strlen(REG_PATH_END);\n            }\n        }\n    }\n\n    index += 1;  // account for trailing null\n\n    // Note that object_getRegisterPayload() has REG_PATH_END added after each\n    // object or instance, and then the trailing comma is replaced by null. The\n    // trailing nulls are not counted as part of the payload length, so this\n    // will return a size two bytes greater than what\n    // object_getRegisterPayload() returns.\n\n    return index;\n}\n\nint object_getRegisterPayload(lwm2m_context_t *contextP,\n                              uint8_t *buffer,\n                              size_t bufferLen)\n{\n    size_t index;\n    int result;\n    lwm2m_object_t *objectP;\n\n    LOG(\"Entering\");\n    // index can not be greater than bufferLen\n    index = 0;\n\n    result = utils_stringCopy((char *)buffer, bufferLen, REG_START);\n    if (result < 0) return 0;\n    index += result;\n\n    if ((contextP->altPath != NULL)\n            && (contextP->altPath[0] != 0))\n    {\n        result = utils_stringCopy((char *)buffer + index, bufferLen - index, contextP->altPath);\n    }\n    else\n    {\n        result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_DEFAULT_PATH);\n    }\n    if (result < 0) return 0;\n    index += result;\n\n    result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_LWM2M_RESOURCE_TYPE);\n    if (result < 0) return 0;\n    index += result;\n\n    for (objectP = contextP->objectList; objectP != NULL; objectP = objectP->next)\n    {\n        size_t start;\n        size_t length;\n\n        if (objectP->objID == LWM2M_SECURITY_OBJECT_ID) continue;\n\n        start = index;\n        result = prv_getObjectTemplate(buffer + index, bufferLen - index, objectP->objID);\n        if (result < 0) return 0;\n        length = result;\n        index += length;\n\n        if (objectP->instanceList == NULL)\n        {\n            index--;\n            result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_PATH_END);\n            if (result < 0) return 0;\n            index += result;\n        }\n        else\n        {\n            lwm2m_list_t *targetP;\n            for (targetP = objectP->instanceList ; targetP != NULL ; targetP = targetP->next)\n            {\n                if (index != start + length)\n                {\n                    if (bufferLen - index <= length) return 0;\n                    memcpy(buffer + index, buffer + start, length);\n                    index += length;\n                }\n\n                result = utils_intToText(targetP->id, buffer + index, bufferLen - index);\n                if (result == 0) return 0;\n                index += result;\n\n                result = utils_stringCopy((char *)buffer + index, bufferLen - index, REG_PATH_END);\n                if (result < 0) return 0;\n                index += result;\n            }\n        }\n    }\n\n    if (index > 0)\n    {\n        index = index - 1;  // remove trailing ','\n    }\n\n    buffer[index] = 0;\n\n    return index;\n}\n\nstatic lwm2m_list_t *prv_findServerInstance(lwm2m_object_t *objectP,\n        uint16_t shortID)\n{\n    lwm2m_list_t *instanceP;\n\n    instanceP = objectP->instanceList;\n    while (NULL != instanceP)\n    {\n        int64_t value;\n        lwm2m_data_t *dataP;\n        int size;\n\n        size = 1;\n        dataP = lwm2m_data_new(size);\n        if (dataP == NULL) return NULL;\n        dataP->id = LWM2M_SERVER_SHORT_ID_ID;\n\n        if (objectP->readFunc(instanceP->id, &size, &dataP, NULL, objectP) != COAP_205_CONTENT)\n        {\n            lwm2m_data_free(size, dataP);\n            return NULL;\n        }\n\n        if (1 == lwm2m_data_decode_int(dataP, &value))\n        {\n            if (value == shortID)\n            {\n                lwm2m_data_free(size, dataP);\n                break;\n            }\n        }\n        lwm2m_data_free(size, dataP);\n        instanceP = instanceP->next;\n    }\n\n    return instanceP;\n}\n\nstatic int prv_getMandatoryInfo(lwm2m_object_t *objectP,\n                                uint16_t instanceID,\n                                lwm2m_server_t *targetP)\n{\n    lwm2m_data_t *dataP;\n    int size;\n    int64_t value;\n\n    size = 2;\n    dataP = lwm2m_data_new(size);\n    if (dataP == NULL) return -1;\n    dataP[0].id = LWM2M_SERVER_LIFETIME_ID;\n    dataP[1].id = LWM2M_SERVER_BINDING_ID;\n\n    if (objectP->readFunc(instanceID, &size, &dataP, NULL, objectP) != COAP_205_CONTENT)\n    {\n        lwm2m_data_free(size, dataP);\n        return -1;\n    }\n\n    if (0 == lwm2m_data_decode_int(dataP, &value)\n            || value < 0 || value > 0xFFFFFFFF)            // This is an implementation limit\n    {\n        lwm2m_data_free(size, dataP);\n        return -1;\n    }\n    targetP->lifetime = value;\n\n    targetP->binding = utils_stringToBinding(dataP[1].value.asBuffer.buffer, dataP[1].value.asBuffer.length);\n\n    lwm2m_data_free(size, dataP);\n\n    if (targetP->binding == BINDING_UNKNOWN)\n    {\n        return -1;\n    }\n\n    return 0;\n}\n\nint object_getServers(lwm2m_context_t *contextP, bool checkOnly)\n{\n    lwm2m_object_t *objectP;\n    lwm2m_object_t *securityObjP = NULL;\n    lwm2m_object_t *serverObjP = NULL;\n    lwm2m_list_t *securityInstP;    // instanceID of the server in the LWM2M Security Object\n\n    LOG(\"Entering\");\n\n    for (objectP = contextP->objectList; objectP != NULL; objectP = objectP->next)\n    {\n        if (objectP->objID == LWM2M_SECURITY_OBJECT_ID)\n        {\n            securityObjP = objectP;\n        }\n        else if (objectP->objID == LWM2M_SERVER_OBJECT_ID)\n        {\n            serverObjP = objectP;\n        }\n    }\n\n    if (NULL == securityObjP) return -1;\n\n    securityInstP = securityObjP->instanceList;\n    while (securityInstP != NULL)\n    {\n        if (LWM2M_LIST_FIND(contextP->bootstrapServerList, securityInstP->id) == NULL\n                && LWM2M_LIST_FIND(contextP->serverList, securityInstP->id) == NULL)\n        {\n            // This server is new. eg created by last bootstrap\n\n            lwm2m_data_t *dataP;\n            int size;\n            lwm2m_server_t *targetP;\n            bool isBootstrap;\n            int64_t value = 0;\n\n            size = 3;\n            dataP = lwm2m_data_new(size);\n            if (dataP == NULL) return -1;\n            dataP[0].id = LWM2M_SECURITY_BOOTSTRAP_ID;\n            dataP[1].id = LWM2M_SECURITY_SHORT_SERVER_ID;\n            dataP[2].id = LWM2M_SECURITY_HOLD_OFF_ID;\n\n            if (securityObjP->readFunc(securityInstP->id, &size, &dataP, NULL, securityObjP) != COAP_205_CONTENT)\n            {\n                LOG_ARG(\"securityObjP->readFunc fail id %d\", securityInstP->id);\n                lwm2m_data_free(size, dataP);\n                return -1;\n            }\n\n            targetP = (lwm2m_server_t *)lwm2m_malloc(sizeof(lwm2m_server_t));\n            if (targetP == NULL)\n            {\n                LOG_ARG(\"lwm2m_malloc fail id %d\", securityInstP->id);\n                lwm2m_data_free(size, dataP);\n                return -1;\n            }\n            memset(targetP, 0, sizeof(lwm2m_server_t));\n            targetP->secObjInstID = securityInstP->id;\n\n            if (0 == lwm2m_data_decode_bool(dataP + 0, &isBootstrap))\n            {\n                LOG_ARG(\"lwm2m_data_decode_bool fail id %d\", securityInstP->id);\n                lwm2m_free(targetP);\n                lwm2m_data_free(size, dataP);\n                return -1;\n            }\n\n            if (0 == lwm2m_data_decode_int(dataP + 1, &value)\n                    || value < (isBootstrap ? 0 : 1) || value > 0xFFFF)                // 0 is forbidden as a Short Server ID\n            {\n                LOG_ARG(\"lwm2m_data_decode_int fail id %d\", securityInstP->id);\n                lwm2m_free(targetP);\n                lwm2m_data_free(size, dataP);\n                return -1;\n            }\n            targetP->shortID = value;\n\n            if (isBootstrap == true)\n            {\n                if (0 == lwm2m_data_decode_int(dataP + 2, &value)\n                        || value < 0 || value > 0xFFFFFFFF)             // This is an implementation limit\n                {\n                    LOG_ARG(\"lwm2m_data_decode_int fail id %d\", securityInstP->id);\n                    lwm2m_free(targetP);\n                    lwm2m_data_free(size, dataP);\n                    return -1;\n                }\n                // lifetime of a bootstrap server is set to ClientHoldOffTime\n                targetP->lifetime = value;\n\n                if (checkOnly)\n                {\n                    lwm2m_free(targetP);\n                }\n                else\n                {\n                    contextP->bootstrapServerList = (lwm2m_server_t *)LWM2M_LIST_ADD(contextP->bootstrapServerList, targetP);\n                }\n            }\n            else\n            {\n                lwm2m_list_t *serverInstP;      // instanceID of the server in the LWM2M Server Object\n\n                serverInstP = prv_findServerInstance(serverObjP, targetP->shortID);\n                if (serverInstP == NULL)\n                {\n                    lwm2m_free(targetP);\n                }\n                else\n                {\n                    if (0 != prv_getMandatoryInfo(serverObjP, serverInstP->id, targetP))\n                    {\n                        LOG_ARG(\"prv_getMandatoryInfo fail id %d\", securityInstP->id);\n                        lwm2m_free(targetP);\n                        lwm2m_data_free(size, dataP);\n                        return -1;\n                    }\n                    targetP->status = STATE_DEREGISTERED;\n                    if (checkOnly)\n                    {\n                        lwm2m_free(targetP);\n                    }\n                    else\n                    {\n                        contextP->serverList = (lwm2m_server_t *)LWM2M_LIST_ADD(contextP->serverList, targetP);\n                    }\n                }\n            }\n            lwm2m_data_free(size, dataP);\n        }\n        securityInstP = securityInstP->next;\n    }\n\n    return 0;\n}\n\n#ifdef LWM2M_BOOTSTRAP\nuint8_t object_createInstance(lwm2m_context_t *contextP,\n                              lwm2m_uri_t *uriP,\n                              lwm2m_data_t *dataP)\n{\n    lwm2m_object_t *targetP;\n\n    LOG_URI(uriP);\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n\n    if (NULL == targetP->createFunc)\n    {\n        return COAP_405_METHOD_NOT_ALLOWED;\n    }\n\n    return targetP->createFunc(lwm2m_list_newId(targetP->instanceList), dataP->value.asChildren.count, dataP->value.asChildren.array, targetP);\n}\n\nuint8_t object_writeInstance(lwm2m_context_t *contextP,\n                             lwm2m_uri_t *uriP,\n                             lwm2m_data_t *dataP)\n{\n    lwm2m_object_t *targetP;\n\n    LOG_URI(uriP);\n    targetP = (lwm2m_object_t *)LWM2M_LIST_FIND(contextP->objectList, uriP->objectId);\n    if (NULL == targetP) return COAP_404_NOT_FOUND;\n\n    if (NULL == targetP->writeFunc)\n    {\n        return COAP_405_METHOD_NOT_ALLOWED;\n    }\n\n    return targetP->writeFunc(dataP->id, dataP->value.asChildren.count, dataP->value.asChildren.array, targetP);\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/observe.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Toby Jaffey - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n#include \"internals.h\"\n#include \"osdepends/atiny_osdep.h\"\n#include <stdio.h>\n\n\n#ifdef LWM2M_CLIENT_MODE\n\n#define RES_M_STATE  3\n\nstatic lwm2m_transaction_callback_t  observe_call_back;\n\nvoid lwm2m_register_observe_ack_call_back(lwm2m_transaction_callback_t callback)\n{\n    observe_call_back = callback;\n}\n\n\nstatic lwm2m_observed_t *prv_findObserved(lwm2m_context_t *contextP,\n        lwm2m_uri_t *uriP)\n{\n    lwm2m_observed_t *targetP;\n\n    targetP = contextP->observedList;\n    while (targetP != NULL\n            && (targetP->uri.objectId != uriP->objectId\n                || targetP->uri.flag != uriP->flag\n                || (LWM2M_URI_IS_SET_INSTANCE(uriP) && targetP->uri.instanceId != uriP->instanceId)\n                || (LWM2M_URI_IS_SET_RESOURCE(uriP) && targetP->uri.resourceId != uriP->resourceId)))\n    {\n        targetP = targetP->next;\n    }\n\n    return targetP;\n}\n\nstatic void prv_unlinkObserved(lwm2m_context_t *contextP,\n                               lwm2m_observed_t *observedP)\n{\n    if (contextP->observedList == observedP)\n    {\n        contextP->observedList = contextP->observedList->next;\n    }\n    else\n    {\n        lwm2m_observed_t *parentP;\n\n        parentP = contextP->observedList;\n        while (parentP->next != NULL\n                && parentP->next != observedP)\n        {\n            parentP = parentP->next;\n        }\n        if (parentP->next != NULL)\n        {\n            parentP->next = parentP->next->next;\n        }\n    }\n}\n\nstatic lwm2m_watcher_t *prv_findWatcher(lwm2m_observed_t *observedP,\n                                        lwm2m_server_t *serverP)\n{\n    lwm2m_watcher_t *targetP;\n\n    targetP = observedP->watcherList;\n    while (targetP != NULL\n            && targetP->server != serverP)\n    {\n        targetP = targetP->next;\n    }\n\n    return targetP;\n}\n\nstatic lwm2m_watcher_t *prv_getWatcher(lwm2m_context_t *contextP,\n                                       lwm2m_uri_t *uriP,\n                                       lwm2m_server_t *serverP)\n{\n    lwm2m_observed_t *observedP;\n    bool allocatedObserver;\n    lwm2m_watcher_t *watcherP;\n\n    allocatedObserver = false;\n\n    observedP = prv_findObserved(contextP, uriP);\n    if (observedP == NULL)\n    {\n        observedP = (lwm2m_observed_t *)lwm2m_malloc(sizeof(lwm2m_observed_t));\n        if (observedP == NULL) return NULL;\n        allocatedObserver = true;\n        memset(observedP, 0, sizeof(lwm2m_observed_t));\n        memcpy(&(observedP->uri), uriP, sizeof(lwm2m_uri_t));\n        atiny_mutex_lock(contextP->observe_mutex);\n        observedP->next = contextP->observedList;\n        contextP->observedList = observedP;\n        atiny_mutex_unlock(contextP->observe_mutex);\n    }\n\n    watcherP = prv_findWatcher(observedP, serverP);\n    if (watcherP == NULL)\n    {\n        watcherP = (lwm2m_watcher_t *)lwm2m_malloc(sizeof(lwm2m_watcher_t));\n        if (watcherP == NULL)\n        {\n            if (allocatedObserver == true)\n            {\n                lwm2m_free(observedP);\n            }\n            return NULL;\n        }\n        memset(watcherP, 0, sizeof(lwm2m_watcher_t));\n        watcherP->active = false;\n        watcherP->server = serverP;\n        atiny_mutex_lock(contextP->observe_mutex);\n        watcherP->next = observedP->watcherList;\n        observedP->watcherList = watcherP;\n        atiny_mutex_unlock(contextP->observe_mutex);\n    }\n\n    return watcherP;\n}\n\nuint8_t observe_handleRequest(lwm2m_context_t *contextP,\n                              lwm2m_uri_t *uriP,\n                              lwm2m_server_t *serverP,\n                              int size,\n                              lwm2m_data_t *dataP,\n                              coap_packet_t *message,\n                              coap_packet_t *response)\n{\n    lwm2m_observed_t * observedP;\n    lwm2m_watcher_t *watcherP;\n    uint32_t count;\n\n    LOG_ARG(\"Code: %02X, server status: %s\", message->code, STR_STATUS(serverP->status));\n    LOG_URI(uriP);\n\n    coap_get_header_observe(message, &count);\n\n    switch (count)\n    {\n    case 0:\n        if (!LWM2M_URI_IS_SET_INSTANCE(uriP) && LWM2M_URI_IS_SET_RESOURCE(uriP)) return COAP_400_BAD_REQUEST;\n        if (message->token_len == 0) return COAP_400_BAD_REQUEST;\n\n        watcherP = prv_getWatcher(contextP, uriP, serverP);\n        if (watcherP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n        watcherP->tokenLen = message->token_len;\n        memcpy(watcherP->token, message->token, message->token_len);\n        watcherP->active = true;\n        watcherP->lastTime = lwm2m_gettime();\n        watcherP->lastMid = response->mid;\n        if (IS_OPTION(message, COAP_OPTION_ACCEPT))\n        {\n            watcherP->format = utils_convertMediaType((coap_content_type_t)message->accept[0]);\n        }\n        else\n        {\n            watcherP->format = LWM2M_CONTENT_TLV;\n        }\n\n        if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n        {\n            switch (dataP->type)\n            {\n            case LWM2M_TYPE_INTEGER:\n                if (1 != lwm2m_data_decode_int(dataP, &(watcherP->lastValue.asInteger))) return COAP_500_INTERNAL_SERVER_ERROR;\n                break;\n            case LWM2M_TYPE_FLOAT:\n                if (1 != lwm2m_data_decode_float(dataP, &(watcherP->lastValue.asFloat))) return COAP_500_INTERNAL_SERVER_ERROR;\n                break;\n            default:\n                break;\n            }\n        }\n\n        coap_set_header_observe(response, watcherP->counter++);\n\n        return COAP_205_CONTENT;\n\n    case 1:\n        // cancellation\n        observedP = prv_findObserved(contextP, uriP);\n        if (observedP)\n        {\n            watcherP = prv_findWatcher(observedP, serverP);\n            if (watcherP)\n            {\n                observe_cancel(contextP, watcherP->lastMid, serverP->sessionH);\n            }\n        }\n        return COAP_205_CONTENT;\n\n    default:\n        return COAP_400_BAD_REQUEST;\n    }\n}\n\nvoid observe_cancel(lwm2m_context_t *contextP,\n                    uint16_t mid,\n                    void *fromSessionH)\n{\n    lwm2m_observed_t *observedP;\n\n    LOG_ARG(\"mid: %d\", mid);\n\n    for (observedP = contextP->observedList;\n            observedP != NULL;\n            observedP = observedP->next)\n    {\n        lwm2m_watcher_t *targetP = NULL;\n\n        if (observedP->watcherList->lastMid == mid\n                && lwm2m_session_is_equal(observedP->watcherList->server->sessionH, fromSessionH, contextP->userData))\n        {\n            targetP = observedP->watcherList;\n            observedP->watcherList = observedP->watcherList->next;\n        }\n        else\n        {\n            lwm2m_watcher_t *parentP;\n\n            parentP = observedP->watcherList;\n            while (parentP->next != NULL\n                    && (parentP->next->lastMid != mid\n                 || !lwm2m_session_is_equal(parentP->next->server->sessionH, fromSessionH, contextP->userData)))\n            {\n                parentP = parentP->next;\n            }\n            if (parentP->next != NULL)\n            {\n                targetP = parentP->next;\n                parentP->next = parentP->next->next;\n            }\n        }\n        if (targetP != NULL)\n        {\n            atiny_mutex_lock(contextP->observe_mutex);\n            lwm2m_notify_even(MODULE_URI, OBSERVE_UNSUBSCRIBE, (char *) & (observedP->uri), sizeof(observedP->uri));\n            if (targetP->parameters != NULL) lwm2m_free(targetP->parameters);\n            lwm2m_free(targetP);\n            if (observedP->watcherList == NULL)\n            {\n                prv_unlinkObserved(contextP, observedP);\n                lwm2m_free(observedP);\n            }\n            atiny_mutex_unlock(contextP->observe_mutex);\n            return;\n        }\n    }\n}\n\nvoid observe_clear(lwm2m_context_t *contextP,\n                   lwm2m_uri_t *uriP)\n{\n    lwm2m_observed_t *observedP;\n\n    LOG_URI(uriP);\n\n    observedP = contextP->observedList;\n    while(observedP != NULL)\n    {\n        if (observedP->uri.objectId == uriP->objectId\n                && (LWM2M_URI_IS_SET_INSTANCE(uriP) == false\n                    || observedP->uri.instanceId == uriP->instanceId))\n        {\n            lwm2m_observed_t *nextP;\n            lwm2m_watcher_t *watcherP;\n\n            atiny_mutex_lock(contextP->observe_mutex);\n            nextP = observedP->next;\n\n            for (watcherP = observedP->watcherList; watcherP != NULL; watcherP = watcherP->next)\n            {\n                if (watcherP->parameters != NULL) lwm2m_free(watcherP->parameters);\n            }\n            LWM2M_LIST_FREE(observedP->watcherList);\n\n            prv_unlinkObserved(contextP, observedP);\n            lwm2m_free(observedP);\n\n            observedP = nextP;\n            atiny_mutex_unlock(contextP->observe_mutex);\n        }\n        else\n        {\n            observedP = observedP->next;\n        }\n    }\n}\n\nuint8_t observe_setParameters(lwm2m_context_t *contextP,\n                              lwm2m_uri_t *uriP,\n                              lwm2m_server_t *serverP,\n                              lwm2m_attributes_t *attrP)\n{\n    uint8_t result;\n    lwm2m_watcher_t *watcherP;\n\n    LOG_URI(uriP);\n    LOG_ARG(\"toSet: %08X, toClear: %08X, minPeriod: %d, maxPeriod: %d, greaterThan: %f, lessThan: %f, step: %f\",\n            attrP->toSet, attrP->toClear, attrP->minPeriod, attrP->maxPeriod, attrP->greaterThan, attrP->lessThan, attrP->step);\n\n    if (!LWM2M_URI_IS_SET_INSTANCE(uriP) && LWM2M_URI_IS_SET_RESOURCE(uriP)) return COAP_400_BAD_REQUEST;\n\n    result = object_checkReadable(contextP, uriP);\n    if (COAP_205_CONTENT != result) return result;\n\n    if (0 != (attrP->toSet & ATTR_FLAG_NUMERIC))\n    {\n        result = object_checkNumeric(contextP, uriP);\n        if (COAP_205_CONTENT != result) return result;\n    }\n\n    watcherP = prv_getWatcher(contextP, uriP, serverP);\n    if (watcherP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    // Check rule “lt?value + 2*”stp?values < “gt?value\n    if ((((attrP->toSet | (watcherP->parameters ? watcherP->parameters->toSet : 0)) & ~attrP->toClear) & ATTR_FLAG_NUMERIC) == ATTR_FLAG_NUMERIC)\n    {\n        float gt;\n        float lt;\n        float stp;\n\n        if (0 != (attrP->toSet & LWM2M_ATTR_FLAG_GREATER_THAN))\n        {\n            gt = attrP->greaterThan;\n        }\n        else\n        {\n            gt = watcherP->parameters->greaterThan;\n        }\n        if (0 != (attrP->toSet & LWM2M_ATTR_FLAG_LESS_THAN))\n        {\n            lt = attrP->lessThan;\n        }\n        else\n        {\n            lt = watcherP->parameters->lessThan;\n        }\n        if (0 != (attrP->toSet & LWM2M_ATTR_FLAG_STEP))\n        {\n            stp = attrP->step;\n        }\n        else\n        {\n            stp = watcherP->parameters->step;\n        }\n\n        if (lt + (2 * stp) >= gt) return COAP_400_BAD_REQUEST;\n    }\n\n    if (watcherP->parameters == NULL)\n    {\n        if (attrP->toSet != 0)\n        {\n            watcherP->parameters = (lwm2m_attributes_t *)lwm2m_malloc(sizeof(lwm2m_attributes_t));\n            if (watcherP->parameters == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n            memcpy(watcherP->parameters, attrP, sizeof(lwm2m_attributes_t));\n        }\n    }\n    else\n    {\n        watcherP->parameters->toSet &= ~attrP->toClear;\n        if (attrP->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD)\n        {\n            watcherP->parameters->minPeriod = attrP->minPeriod;\n        }\n        if (attrP->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD)\n        {\n            watcherP->parameters->maxPeriod = attrP->maxPeriod;\n        }\n        if (attrP->toSet & LWM2M_ATTR_FLAG_GREATER_THAN)\n        {\n            watcherP->parameters->greaterThan = attrP->greaterThan;\n        }\n        if (attrP->toSet & LWM2M_ATTR_FLAG_LESS_THAN)\n        {\n            watcherP->parameters->lessThan = attrP->lessThan;\n        }\n        if (attrP->toSet & LWM2M_ATTR_FLAG_STEP)\n        {\n            watcherP->parameters->step = attrP->step;\n        }\n    }\n\n    LOG_ARG(\"Final toSet: %08X, minPeriod: %d, maxPeriod: %d, greaterThan: %f, lessThan: %f, step: %f\",\n            watcherP->parameters->toSet, watcherP->parameters->minPeriod, watcherP->parameters->maxPeriod, watcherP->parameters->greaterThan, watcherP->parameters->lessThan, watcherP->parameters->step);\n\n    return COAP_204_CHANGED;\n}\n\nlwm2m_observed_t *observe_findByUri(lwm2m_context_t *contextP,\n                                    lwm2m_uri_t *uriP)\n{\n    lwm2m_observed_t *targetP;\n\n    LOG_URI(uriP);\n    targetP = contextP->observedList;\n    while (targetP != NULL)\n    {\n        if (targetP->uri.objectId == uriP->objectId)\n        {\n            if ((!LWM2M_URI_IS_SET_INSTANCE(uriP) && !LWM2M_URI_IS_SET_INSTANCE(&(targetP->uri)))\n                    || (LWM2M_URI_IS_SET_INSTANCE(uriP) && LWM2M_URI_IS_SET_INSTANCE(&(targetP->uri)) && (uriP->instanceId == targetP->uri.instanceId)))\n            {\n                if ((!LWM2M_URI_IS_SET_RESOURCE(uriP) && !LWM2M_URI_IS_SET_RESOURCE(&(targetP->uri)))\n                        || (LWM2M_URI_IS_SET_RESOURCE(uriP) && LWM2M_URI_IS_SET_RESOURCE(&(targetP->uri)) && (uriP->resourceId == targetP->uri.resourceId)))\n                {\n                    LOG_ARG(\"Found one with%s observers.\", targetP->watcherList ? \"\" : \" no\");\n                    LOG_URI(&(targetP->uri));\n                    return targetP;\n                }\n            }\n        }\n        targetP = targetP->next;\n    }\n\n    LOG(\"Found nothing\");\n    return NULL;\n}\n\nvoid lwm2m_resource_value_changed(lwm2m_context_t *contextP,\n                                  lwm2m_uri_t *uriP)\n{\n    lwm2m_observed_t *targetP;\n\n    LOG_URI(uriP);\n    targetP = contextP->observedList;\n    while (targetP != NULL)\n    {\n        if (targetP->uri.objectId == uriP->objectId)\n        {\n            if (!LWM2M_URI_IS_SET_INSTANCE(uriP)\n                    || (targetP->uri.flag & LWM2M_URI_FLAG_INSTANCE_ID) == 0\n                    || uriP->instanceId == targetP->uri.instanceId)\n            {\n                if (!LWM2M_URI_IS_SET_RESOURCE(uriP)\n                        || (targetP->uri.flag & LWM2M_URI_FLAG_RESOURCE_ID) == 0\n                        || uriP->resourceId == targetP->uri.resourceId)\n                {\n                    lwm2m_watcher_t *watcherP;\n\n                    LOG(\"Found an observation\");\n                    LOG_URI(&(targetP->uri));\n\n                    for (watcherP = targetP->watcherList ; watcherP != NULL ; watcherP = watcherP->next)\n                    {\n                        if (watcherP->active == true)\n                        {\n                            LOG(\"Tagging a watcher\");\n                            watcherP->update = true;\n                        }\n                    }\n                }\n            }\n        }\n        targetP = targetP->next;\n    }\n\n}\n\nint observe_send_transaction(lwm2m_context_t *contextP, lwm2m_data_cfg_t  *cfg, lwm2m_watcher_t *watcherP,\n                             uint8_t *buffer, size_t length)\n{\n    lwm2m_transaction_t *transaction;\n    int ret;\n\n    transaction = transaction_new(watcherP->server->sessionH, COAP_205_CONTENT, NULL, NULL, watcherP->lastMid, watcherP->tokenLen, watcherP->token);\n    if(NULL == transaction)\n    {\n        LOG(\"transaction_new null\");\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n    transaction->cfg.callback = cfg->callback;\n    transaction->cfg.cookie = cfg->cookie;\n    transaction->cfg.type = cfg->type;\n    transaction->callback = observe_call_back;\n    coap_set_header_content_type(transaction->message, watcherP->format);\n    coap_set_header_observe(transaction->message, watcherP->counter++);\n    coap_set_payload(transaction->message, buffer, length);\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n    ret = transaction_send(contextP, transaction);\n    LOG_ARG(\"notify con msg, cookie:%d type:%d,ret:%d\", transaction->cfg.cookie, transaction->cfg.type, ret);\n    return ret;\n}\n\nvoid observe_app_step(lwm2m_context_t *contextP,\n                      lwm2m_observed_t *targetP,\n                      time_t currentTime,\n                      time_t *timeoutP)\n{\n    LOG(\"Entering\");\n    lwm2m_watcher_t *watcherP;\n    uint8_t *buffer = NULL;\n    size_t length = 0;\n    lwm2m_data_t *dataP = NULL;\n    lwm2m_data_cfg_t  cfg = {0, 0, NULL};\n    int size = 0;\n\n    while (COAP_205_CONTENT == object_readData(contextP, &targetP->uri, &size, &dataP, &cfg, 0))\n    {\n\n        for (watcherP = targetP->watcherList ; watcherP != NULL ; watcherP = watcherP->next)\n        {\n            int res;\n            if (buffer == NULL)\n            {\n                res = lwm2m_data_serialize(&targetP->uri, size, dataP, &(watcherP->format), &buffer);\n                if (res < 0)\n                {\n                    if (dataP != NULL)\n                    {\n                        lwm2m_data_free(size, dataP);\n                        dataP = NULL;\n                    }\n                    if (buffer != NULL)\n                    {\n                        lwm2m_free(buffer);\n                    }\n                    break;\n                }\n                else\n                {\n                    length = (size_t)res;\n                }\n            }\n\n            if (watcherP->active == true)\n            {\n                watcherP->lastTime = currentTime;\n                watcherP->lastMid = contextP->nextMID++;\n\n                if (cfg.callback == NULL)\n                {\n                    coap_packet_t message[1];\n                    coap_init_message(message, COAP_TYPE_NON, COAP_205_CONTENT, 0);\n                    coap_set_header_content_type(message, watcherP->format);\n                    coap_set_payload(message, buffer, length);\n                    message->mid = watcherP->lastMid;\n                    coap_set_header_token(message, watcherP->token, watcherP->tokenLen);\n                    coap_set_header_observe(message, watcherP->counter++);\n                    (void)message_send(contextP, message, watcherP->server->sessionH);\n                    LOG_ARG(\"notify no con msg, msgid:\", message->mid);\n                }\n                else\n                {\n                    (void)observe_send_transaction(contextP, &cfg, watcherP, buffer, length);\n                }\n            }\n        }\n\n        if (dataP != NULL)\n        {\n            lwm2m_data_free(size, dataP);\n            dataP = NULL;\n        }\n        if (buffer != NULL)\n        {\n            lwm2m_free(buffer);\n            buffer = NULL;\n        }\n    }\n\n    if (dataP != NULL)\n    {\n        lwm2m_data_free(size, dataP);\n    }\n}\n\nvoid observe_step(lwm2m_context_t *contextP,\n                  time_t currentTime,\n                  time_t *timeoutP)\n{\n    lwm2m_observed_t *targetP;\n\n    LOG(\"Entering\");\n    for (targetP = contextP->observedList ; targetP != NULL ; targetP = targetP->next)\n    {\n        lwm2m_watcher_t *watcherP;\n        uint8_t *buffer = NULL;\n        size_t length = 0;\n        lwm2m_data_t *dataP = NULL;\n        lwm2m_data_cfg_t  cfg = {0, 0, NULL};\n        int size = 0;\n        double floatValue = 0;\n        int64_t integerValue = 0;\n        bool storeValue = false;\n        coap_packet_t message[1];\n        time_t interval;\n\n        LOG_URI(&(targetP->uri));\n\n\n        if (dm_isUriOpaqueHandle(&(targetP->uri)))\n        {\n            observe_app_step(contextP, targetP, currentTime, timeoutP);\n            continue;\n        }\n\n        cfg.callback = NULL;\n        if (LWM2M_URI_IS_SET_RESOURCE(&targetP->uri))\n        {\n            if (COAP_205_CONTENT != object_readData(contextP, &targetP->uri, &size, &dataP, &cfg, 0)) continue;\n            switch (dataP->type)\n            {\n            case LWM2M_TYPE_INTEGER:\n                if (1 != lwm2m_data_decode_int(dataP, &integerValue))\n                {\n                    lwm2m_data_free(size, dataP);\n                    continue;\n                }\n                storeValue = true;\n                break;\n            case LWM2M_TYPE_FLOAT:\n                if (1 != lwm2m_data_decode_float(dataP, &floatValue))\n                {\n                    lwm2m_data_free(size, dataP);\n                    continue;\n                }\n                storeValue = true;\n                break;\n            default:\n                break;\n            }\n        }\n        for (watcherP = targetP->watcherList ; watcherP != NULL ; watcherP = watcherP->next)\n        {\n            if (watcherP->active == true)\n            {\n                bool notify = false;\n\n                if (watcherP->update == true)\n                {\n                    // value changed, should we notify the server ?\n\n                    if (watcherP->parameters == NULL || watcherP->parameters->toSet == 0)\n                    {\n                        // no conditions\n                        notify = true;\n                        LOG(\"Notify with no conditions\");\n                        LOG_URI(&(targetP->uri));\n                    }\n\n                    if (notify == false\n                            && watcherP->parameters != NULL\n                            && (watcherP->parameters->toSet & ATTR_FLAG_NUMERIC) != 0)\n                    {\n                        if ((watcherP->parameters->toSet & LWM2M_ATTR_FLAG_LESS_THAN) != 0)\n                        {\n                            LOG(\"Checking lower threshold\");\n                            // Did we cross the lower threshold ?\n                            switch (dataP->type)\n                            {\n                            case LWM2M_TYPE_INTEGER:\n                                if ((integerValue <= watcherP->parameters->lessThan\n                                        && watcherP->lastValue.asInteger > watcherP->parameters->lessThan)\n                                        || (integerValue >= watcherP->parameters->lessThan\n                                            && watcherP->lastValue.asInteger < watcherP->parameters->lessThan))\n                                {\n                                    LOG(\"Notify on lower threshold crossing\");\n                                    notify = true;\n                                }\n                                break;\n                            case LWM2M_TYPE_FLOAT:\n                                if ((floatValue <= watcherP->parameters->lessThan\n                                        && watcherP->lastValue.asFloat > watcherP->parameters->lessThan)\n                                        || (floatValue >= watcherP->parameters->lessThan\n                                            && watcherP->lastValue.asFloat < watcherP->parameters->lessThan))\n                                {\n                                    LOG(\"Notify on lower threshold crossing\");\n                                    notify = true;\n                                }\n                                break;\n                            default:\n                                break;\n                            }\n                        }\n                        if ((watcherP->parameters->toSet & LWM2M_ATTR_FLAG_GREATER_THAN) != 0)\n                        {\n                            LOG(\"Checking upper threshold\");\n                            // Did we cross the upper threshold ?\n                            switch (dataP->type)\n                            {\n                            case LWM2M_TYPE_INTEGER:\n                                if ((integerValue <= watcherP->parameters->greaterThan\n                                        && watcherP->lastValue.asInteger > watcherP->parameters->greaterThan)\n                                        || (integerValue >= watcherP->parameters->greaterThan\n                                            && watcherP->lastValue.asInteger < watcherP->parameters->greaterThan))\n                                {\n                                    LOG(\"Notify on lower upper crossing\");\n                                    notify = true;\n                                }\n                                break;\n                            case LWM2M_TYPE_FLOAT:\n                                if ((floatValue <= watcherP->parameters->greaterThan\n                                        && watcherP->lastValue.asFloat > watcherP->parameters->greaterThan)\n                                        || (floatValue >= watcherP->parameters->greaterThan\n                                            && watcherP->lastValue.asFloat < watcherP->parameters->greaterThan))\n                                {\n                                    LOG(\"Notify on lower upper crossing\");\n                                    notify = true;\n                                }\n                                break;\n                            default:\n                                break;\n                            }\n                        }\n                        if ((watcherP->parameters->toSet & LWM2M_ATTR_FLAG_STEP) != 0)\n                        {\n                            LOG(\"Checking step\");\n\n                            switch (dataP->type)\n                            {\n                            case LWM2M_TYPE_INTEGER:\n                            {\n                                int64_t diff;\n\n                                diff = integerValue - watcherP->lastValue.asInteger;\n                                if ((diff < 0 && (0 - diff) >= watcherP->parameters->step)\n                                        || (diff >= 0 && diff >= watcherP->parameters->step))\n                                {\n                                    LOG(\"Notify on step condition\");\n                                    notify = true;\n                                }\n                            }\n                            break;\n                            case LWM2M_TYPE_FLOAT:\n                            {\n                                double diff;\n\n                                diff = floatValue - watcherP->lastValue.asFloat;\n                                if ((diff < 0 && (0 - diff) >= watcherP->parameters->step)\n                                        || (diff >= 0 && diff >= watcherP->parameters->step))\n                                {\n                                    LOG(\"Notify on step condition\");\n                                    notify = true;\n                                }\n                            }\n                            break;\n                            default:\n                                break;\n                            }\n                        }\n                    }\n\n                    if (watcherP->parameters != NULL\n                            && (watcherP->parameters->toSet & LWM2M_ATTR_FLAG_MIN_PERIOD) != 0)\n                    {\n                        LOG_ARG(\"Checking minimal period (%d s)\", watcherP->parameters->minPeriod);\n\n                        if (watcherP->lastTime + watcherP->parameters->minPeriod > currentTime)\n                        {\n                            // Minimum Period did not elapse yet\n                            interval = watcherP->lastTime + watcherP->parameters->minPeriod - currentTime;\n                            if (*timeoutP > interval) *timeoutP = interval;\n                            notify = false;\n                        }\n                        else\n                        {\n                            LOG(\"Notify on minimal period\");\n                            notify = true;\n                        }\n                    }\n                }\n\n                // Is the Maximum Period reached ?\n                if (notify == false\n                        && watcherP->parameters != NULL\n                        && (watcherP->parameters->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD) != 0)\n                {\n                    LOG_ARG(\"Checking maximal period (%d s)\", watcherP->parameters->maxPeriod);\n\n                    if (watcherP->lastTime + watcherP->parameters->maxPeriod <= currentTime)\n                    {\n                        LOG(\"Notify on maximal period\");\n                        notify = true;\n                    }\n                }\n\n                if (notify == true)\n                {\n                    if (buffer == NULL)\n                    {\n                        if (dataP != NULL)\n                        {\n                            int res;\n\n                            res = lwm2m_data_serialize(&targetP->uri, size, dataP, &(watcherP->format), &buffer);\n                            if (res < 0)\n                            {\n                                break;\n                            }\n                            else\n                            {\n                                length = (size_t)res;\n                            }\n\n                        }\n                        else\n                        {\n                            if (COAP_205_CONTENT != object_read(contextP, &targetP->uri, &(watcherP->format), &buffer, &length, 0))\n                            {\n                                buffer = NULL;\n                                break;\n                            }\n                        }\n\n                        if(NULL == cfg.callback)\n                        {\n                            coap_init_message(message, COAP_TYPE_NON, COAP_205_CONTENT, 0);\n                            coap_set_header_content_type(message, watcherP->format);\n                            coap_set_payload(message, buffer, length);\n                            LOG_ARG(\"non observe, msgid:\", message->mid);\n                        }\n                    }\n\n                    watcherP->lastTime = currentTime;\n                    watcherP->lastMid = contextP->nextMID++;\n                    if(NULL == cfg.callback)\n                    {\n\n                        message->mid = watcherP->lastMid;\n                        coap_set_header_token(message, watcherP->token, watcherP->tokenLen);\n                        coap_set_header_observe(message, watcherP->counter++);\n                        (void)message_send(contextP, message, watcherP->server->sessionH);\n\n                    }\n                    else\n                    {\n                        (void)observe_send_transaction(contextP, &cfg, watcherP, buffer, length);\n                    }\n                    atiny_mutex_lock(contextP->observe_mutex);\n                    watcherP->update = false;\n                    atiny_mutex_unlock(contextP->observe_mutex);\n                }\n\n                // Store this value\n                if (notify == true && storeValue == true)\n                {\n                    switch (dataP->type)\n                    {\n                    case LWM2M_TYPE_INTEGER:\n                        watcherP->lastValue.asInteger = integerValue;\n                        break;\n                    case LWM2M_TYPE_FLOAT:\n                        watcherP->lastValue.asFloat = floatValue;\n                        break;\n                    default:\n                        break;\n                    }\n                }\n\n                if (watcherP->parameters != NULL && (watcherP->parameters->toSet & LWM2M_ATTR_FLAG_MAX_PERIOD) != 0)\n                {\n                    // update timers\n                    interval = watcherP->lastTime + watcherP->parameters->maxPeriod - currentTime;\n                    if (*timeoutP > interval) *timeoutP = interval;\n                }\n            }\n        }\n        if (dataP != NULL) lwm2m_data_free(size, dataP);\n        if (buffer != NULL) lwm2m_free(buffer);\n    }\n}\n\n\n\nuint8_t lwm2m_get_observe_info(lwm2m_context_t *contextP, lwm2m_observe_info_t *observe_info)\n{\n    lwm2m_observed_t *targetP;\n    lwm2m_watcher_t *watcherP;\n\n    if((NULL == observe_info) || (NULL == contextP))\n    {\n        LOG(\"null pointer\\n\");\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    for (targetP = contextP->observedList ; targetP != NULL ; targetP = targetP->next)\n    {\n        if((!LWM2M_URI_IS_SET_RESOURCE(&targetP->uri))\n                || (targetP->uri.objectId != LWM2M_FIRMWARE_UPDATE_OBJECT_ID)\n                || (targetP->uri.instanceId != 0)\n                || (targetP->uri.resourceId != RES_M_STATE))\n        {\n            continue;\n        }\n        watcherP = targetP->watcherList;\n        observe_info->counter = watcherP->counter;\n        memcpy(observe_info->token, watcherP->token, sizeof(observe_info->token));\n        observe_info->tokenLen = watcherP->tokenLen;\n        observe_info->format = watcherP->format;\n        return COAP_NO_ERROR;\n    }\n    return COAP_500_INTERNAL_SERVER_ERROR;\n}\n\nuint8_t lwm2m_send_notify(lwm2m_context_t *contextP, lwm2m_observe_info_t *observe_info, int firmware_update_state,  lwm2m_data_cfg_t  *cfg)\n{\n    lwm2m_uri_t uri;\n    int res;\n    lwm2m_data_t data;\n    lwm2m_media_type_t format;\n    uint8_t *buffer = NULL;\n    lwm2m_server_t *server;\n    lwm2m_watcher_t watcherP;\n\n\n    if((NULL == observe_info) || (NULL == contextP) || (NULL == cfg))\n    {\n        LOG(\"null pointer\\n\");\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    server = registration_get_registered_server(contextP);\n    if(NULL == server)\n    {\n        LOG(\"registration_get_registered_server fail\\n\");\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    uri.objectId = LWM2M_FIRMWARE_UPDATE_OBJECT_ID;\n    uri.instanceId = 0;\n    uri.resourceId = RES_M_STATE;\n    uri.flag = (LWM2M_URI_FLAG_OBJECT_ID | LWM2M_URI_FLAG_INSTANCE_ID | LWM2M_URI_FLAG_RESOURCE_ID);\n\n    format = (lwm2m_media_type_t)observe_info->format;\n    memset(&data, 0, sizeof(data));\n    data.id = uri.resourceId;\n    lwm2m_data_encode_int(firmware_update_state, &data);\n    res = lwm2m_data_serialize(&uri, 1, &data, &format, &buffer);\n    if (res < 0)\n    {\n        LOG(\"lwm2m_data_serialize fail\\n\");\n        if (buffer != NULL)\n        {\n            lwm2m_free(buffer);\n        }\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    memset(&watcherP, 0, sizeof(watcherP));\n    watcherP.lastMid = contextP->nextMID++;\n    watcherP.tokenLen = observe_info->tokenLen;\n    memcpy(watcherP.token, observe_info->token, sizeof(watcherP.token));\n    watcherP.format = format;\n    watcherP.counter = observe_info->counter;\n    watcherP.server = server;\n\n    return (uint8_t)observe_send_transaction(contextP, cfg, &watcherP, buffer, res);\n}\n\n#endif\n\n#ifdef LWM2M_SERVER_MODE\n\ntypedef struct\n{\n    lwm2m_observation_t *observationP;\n    lwm2m_result_callback_t callbackP;\n    void *userDataP;\n} cancellation_data_t;\n\nstatic lwm2m_observation_t *prv_findObservationByURI(lwm2m_client_t *clientP,\n        lwm2m_uri_t *uriP)\n{\n    lwm2m_observation_t *targetP;\n\n    targetP = clientP->observationList;\n    while (targetP != NULL)\n    {\n        if (targetP->uri.objectId == uriP->objectId\n                && targetP->uri.flag == uriP->flag\n                && targetP->uri.instanceId == uriP->instanceId\n                && targetP->uri.resourceId == uriP->resourceId)\n        {\n            return targetP;\n        }\n\n        targetP = targetP->next;\n    }\n\n    return targetP;\n}\n\nvoid observe_remove(lwm2m_observation_t *observationP)\n{\n    LOG(\"Entering\");\n    observationP->clientP->observationList = (lwm2m_observation_t *) LWM2M_LIST_RM(observationP->clientP->observationList, observationP->id, NULL);\n    lwm2m_free(observationP);\n}\n\nstatic void prv_obsRequestCallback(lwm2m_transaction_t *transacP,\n                                   void *message)\n{\n    lwm2m_observation_t *observationP = (lwm2m_observation_t *)transacP->userData;\n    coap_packet_t *packet = (coap_packet_t *)message;\n    uint8_t code;\n\n    switch (observationP->status)\n    {\n    case STATE_DEREG_PENDING:\n        // Observation was canceled by the user.\n        observe_remove(observationP);\n        return;\n\n    case STATE_REG_PENDING:\n        observationP->status = STATE_REGISTERED;\n        break;\n\n    default:\n        break;\n    }\n\n    if (message == NULL)\n    {\n        code = COAP_503_SERVICE_UNAVAILABLE;\n    }\n    else if (packet->code == COAP_205_CONTENT\n             && !IS_OPTION(packet, COAP_OPTION_OBSERVE))\n    {\n        code = COAP_405_METHOD_NOT_ALLOWED;\n    }\n    else\n    {\n        code = packet->code;\n    }\n\n    if (code != COAP_205_CONTENT)\n    {\n        observationP->callback(observationP->clientP->internalID,\n                               &observationP->uri,\n                               code,\n                               LWM2M_CONTENT_TEXT, NULL, 0,\n                               observationP->userData);\n        observe_remove(observationP);\n    }\n    else\n    {\n        observationP->callback(observationP->clientP->internalID,\n                               &observationP->uri,\n                               0,\n                               packet->content_type, packet->payload, packet->payload_len,\n                               observationP->userData);\n    }\n}\n\n\nstatic void prv_obsCancelRequestCallback(lwm2m_transaction_t *transacP,\n        void *message)\n{\n    cancellation_data_t *cancelP = (cancellation_data_t *)transacP->userData;\n    coap_packet_t *packet = (coap_packet_t *)message;\n    uint8_t code;\n\n    if (message == NULL)\n    {\n        code = COAP_503_SERVICE_UNAVAILABLE;\n    }\n    else\n    {\n        code = packet->code;\n    }\n\n    if (code != COAP_205_CONTENT)\n    {\n        cancelP->callbackP(cancelP->observationP->clientP->internalID,\n                           &cancelP->observationP->uri,\n                           code,\n                           LWM2M_CONTENT_TEXT, NULL, 0,\n                           cancelP->userDataP);\n    }\n    else\n    {\n        cancelP->callbackP(cancelP->observationP->clientP->internalID,\n                           &cancelP->observationP->uri,\n                           0,\n                           packet->content_type, packet->payload, packet->payload_len,\n                           cancelP->userDataP);\n    }\n\n    observe_remove(cancelP->observationP);\n\n    lwm2m_free(cancelP);\n}\n\n\nint lwm2m_observe(lwm2m_context_t *contextP,\n                  uint16_t clientID,\n                  lwm2m_uri_t *uriP,\n                  lwm2m_result_callback_t callback,\n                  void *userData)\n{\n    lwm2m_client_t *clientP;\n    lwm2m_transaction_t *transactionP;\n    lwm2m_observation_t *observationP;\n    uint8_t token[4];\n\n    LOG_ARG(\"clientID: %d\", clientID);\n    LOG_URI(uriP);\n\n    if (!LWM2M_URI_IS_SET_INSTANCE(uriP) && LWM2M_URI_IS_SET_RESOURCE(uriP)) return COAP_400_BAD_REQUEST;\n\n    clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID);\n    if (clientP == NULL) return COAP_404_NOT_FOUND;\n\n    for (observationP = clientP->observationList; observationP != NULL; observationP = observationP->next)\n    {\n        if (uriP->objectId == observationP->uri.objectId\n                && (LWM2M_URI_IS_SET_INSTANCE(uriP) == false\n                    || observationP->uri.instanceId == uriP->instanceId)\n                && (LWM2M_URI_IS_SET_RESOURCE(uriP) == false\n                    || observationP->uri.resourceId == uriP->resourceId))\n        {\n            break;\n        }\n    }\n    if (observationP == NULL)\n    {\n        observationP = (lwm2m_observation_t *)lwm2m_malloc(sizeof(lwm2m_observation_t));\n        if (observationP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n        memset(observationP, 0, sizeof(lwm2m_observation_t));\n\n        observationP->id = lwm2m_list_newId((lwm2m_list_t *)clientP->observationList);\n        memcpy(&observationP->uri, uriP, sizeof(lwm2m_uri_t));\n        observationP->clientP = clientP;\n\n        observationP->clientP->observationList = (lwm2m_observation_t *)LWM2M_LIST_ADD(observationP->clientP->observationList, observationP);\n    }\n    observationP->status = STATE_REG_PENDING;\n    observationP->callback = callback;\n    observationP->userData = userData;\n\n    token[0] = clientP->internalID >> 8;\n    token[1] = clientP->internalID & 0xFF;\n    token[2] = observationP->id >> 8;\n    token[3] = observationP->id & 0xFF;\n\n    transactionP = transaction_new(clientP->sessionH, COAP_GET, clientP->altPath, uriP, contextP->nextMID++, 4, token);\n    if (transactionP == NULL)\n    {\n        observationP->clientP->observationList = (lwm2m_observation_t *)LWM2M_LIST_RM(observationP->clientP->observationList, observationP->id, NULL);\n        lwm2m_free(observationP);\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    coap_set_header_observe(transactionP->message, 0);\n    if (clientP->supportJSON == true)\n    {\n        coap_set_header_accept(transactionP->message, LWM2M_CONTENT_JSON);\n    }\n    else\n    {\n        coap_set_header_accept(transactionP->message, LWM2M_CONTENT_TLV);\n    }\n\n    transactionP->callback = prv_obsRequestCallback;\n    transactionP->userData = (void *)observationP;\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transactionP);\n\n    return transaction_send(contextP, transactionP);\n}\n\nint lwm2m_observe_cancel(lwm2m_context_t *contextP,\n                         uint16_t clientID,\n                         lwm2m_uri_t *uriP,\n                         lwm2m_result_callback_t callback,\n                         void *userData)\n{\n    lwm2m_client_t *clientP;\n    lwm2m_observation_t *observationP;\n\n    LOG_ARG(\"clientID: %d\", clientID);\n    LOG_URI(uriP);\n\n    clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID);\n    if (clientP == NULL) return COAP_404_NOT_FOUND;\n\n    observationP = prv_findObservationByURI(clientP, uriP);\n    if (observationP == NULL) return COAP_404_NOT_FOUND;\n\n    switch (observationP->status)\n    {\n    case STATE_REGISTERED:\n    {\n        lwm2m_transaction_t *transactionP;\n        cancellation_data_t *cancelP;\n        uint8_t token[4];\n\n        token[0] = clientP->internalID >> 8;\n        token[1] = clientP->internalID & 0xFF;\n        token[2] = observationP->id >> 8;\n        token[3] = observationP->id & 0xFF;\n\n        transactionP = transaction_new(clientP->sessionH, COAP_GET, clientP->altPath, uriP, contextP->nextMID++, 4, token);\n        if (transactionP == NULL)\n        {\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        cancelP = (cancellation_data_t *)lwm2m_malloc(sizeof(cancellation_data_t));\n        if (cancelP == NULL)\n        {\n            lwm2m_free(transactionP);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n\n        coap_set_header_observe(transactionP->message, 1);\n\n        cancelP->observationP = observationP;\n        cancelP->callbackP = callback;\n        cancelP->userDataP = userData;\n\n        transactionP->callback = prv_obsCancelRequestCallback;\n        transactionP->userData = (void *)cancelP;\n\n        contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transactionP);\n\n        return transaction_send(contextP, transactionP);\n    }\n\n    case STATE_REG_PENDING:\n        observationP->status = STATE_DEREG_PENDING;\n        break;\n\n    default:\n        // Should not happen\n        break;\n    }\n\n    return COAP_NO_ERROR;\n}\n\nbool observe_handleNotify(lwm2m_context_t *contextP,\n                          void *fromSessionH,\n                          coap_packet_t *message,\n                          coap_packet_t *response)\n{\n    uint8_t *tokenP;\n    int token_len;\n    uint16_t clientID;\n    uint16_t obsID;\n    lwm2m_client_t *clientP;\n    lwm2m_observation_t *observationP;\n    uint32_t count;\n\n    LOG(\"Entering\");\n    token_len = coap_get_header_token(message, (const uint8_t **)&tokenP);\n    if (token_len != sizeof(uint32_t)) return false;\n\n    if (1 != coap_get_header_observe(message, &count)) return false;\n\n    clientID = (tokenP[0] << 8) | tokenP[1];\n    obsID = (tokenP[2] << 8) | tokenP[3];\n\n    clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, clientID);\n    if (clientP == NULL) return false;\n\n    observationP = (lwm2m_observation_t *)lwm2m_list_find((lwm2m_list_t *)clientP->observationList, obsID);\n    if (observationP == NULL)\n    {\n        coap_init_message(response, COAP_TYPE_RST, 0, message->mid);\n        message_send(contextP, response, fromSessionH);\n    }\n    else\n    {\n        if (message->type == COAP_TYPE_CON )\n        {\n            coap_init_message(response, COAP_TYPE_ACK, 0, message->mid);\n            message_send(contextP, response, fromSessionH);\n        }\n        observationP->callback(clientID,\n                               &observationP->uri,\n                               (int)count,\n                               message->content_type, message->payload, message->payload_len,\n                               observationP->userData);\n    }\n    return true;\n}\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/packet.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    domedambrosio - Please refer to git log\n *    Fabien Fleutot - Please refer to git log\n *    Fabien Fleutot - Please refer to git log\n *    Simon Bernard - Please refer to git log\n *    Toby Jaffey - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n/*\nContains code snippets which are:\n\n * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the Institute nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n\n*/\n\n\n#include \"internals.h\"\n\n#include <stdlib.h>\n#include <string.h>\n\n#include <stdio.h>\n#include \"commandline.h\"\n\nstatic void handle_reset(lwm2m_context_t *contextP,\n                         void *fromSessionH,\n                         coap_packet_t *message)\n{\n#ifdef LWM2M_CLIENT_MODE\n    LOG(\"Entering\");\n    observe_cancel(contextP, message->mid, fromSessionH);\n#endif\n}\n\nstatic uint8_t handle_request(lwm2m_context_t *contextP,\n                              void *fromSessionH,\n                              coap_packet_t *message,\n                              coap_packet_t *response)\n{\n    lwm2m_uri_t *uriP;\n    uint8_t result = COAP_IGNORE;\n\n    LOG(\"Entering\");\n\n#ifdef LWM2M_CLIENT_MODE\n    uriP = uri_decode(contextP->altPath, message->uri_path);\n#else\n    uriP = uri_decode(NULL, message->uri_path);\n#endif\n\n    if (uriP == NULL) return COAP_400_BAD_REQUEST;\n\n    switch(uriP->flag & LWM2M_URI_MASK_TYPE)\n    {\n#ifdef LWM2M_CLIENT_MODE\n    case LWM2M_URI_FLAG_DM:\n    {\n        lwm2m_server_t *serverP;\n\n        serverP = utils_findServer(contextP, fromSessionH);\n        if (serverP != NULL)\n        {\n            result = dm_handleRequest(contextP, uriP, serverP, message, response);\n        }\n#ifdef LWM2M_BOOTSTRAP\n        else\n        {\n            serverP = utils_findBootstrapServer(contextP, fromSessionH);\n            if (serverP != NULL)\n            {\n                result = bootstrap_handleCommand(contextP, uriP, serverP, message, response);\n            }\n        }\n#endif\n    }\n    break;\n\n#ifdef LWM2M_BOOTSTRAP\n    case LWM2M_URI_FLAG_DELETE_ALL:\n        if (COAP_DELETE != message->code)\n        {\n            result = COAP_400_BAD_REQUEST;\n        }\n        else\n        {\n            result = bootstrap_handleDeleteAll(contextP, fromSessionH);\n        }\n        break;\n\n    case LWM2M_URI_FLAG_BOOTSTRAP:\n        if (message->code == COAP_POST)\n        {\n            result = bootstrap_handleFinish(contextP, fromSessionH);\n        }\n        break;\n#endif\n#endif\n\n#ifdef LWM2M_SERVER_MODE\n    case LWM2M_URI_FLAG_REGISTRATION:\n        result = registration_handleRequest(contextP, uriP, fromSessionH, message, response);\n        break;\n#endif\n#ifdef LWM2M_BOOTSTRAP_SERVER_MODE\n    case LWM2M_URI_FLAG_BOOTSTRAP:\n        result = bootstrap_handleRequest(contextP, uriP, fromSessionH, message, response);\n        break;\n#endif\n    default:\n        result = COAP_IGNORE;\n        break;\n    }\n\n    coap_set_status_code(response, result);\n\n    if (COAP_IGNORE < result && result < COAP_400_BAD_REQUEST)\n    {\n        result = NO_ERROR;\n    }\n\n    lwm2m_free(uriP);\n    return result;\n}\n\n/* This function is an adaptation of function coap_receive() from Erbium's er-coap-13-engine.c.\n * Erbium is Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich\n * All rights reserved.\n */\nvoid lwm2m_handle_packet(lwm2m_context_t *contextP,\n                         uint8_t *buffer,\n                         int length,\n                         void *fromSessionH)\n{\n    uint8_t coap_error_code = NO_ERROR;\n    static coap_packet_t message[1];\n    static coap_packet_t response[1];\n\n    LOG(\"Entering\");\n    coap_error_code = coap_parse_message(message, buffer, (uint16_t)length);\n    if (coap_error_code == NO_ERROR)\n    {\n        LOG_ARG(\"Parsed: ver %u, type %u, tkl %u, code %u.%.2u, mid %u, Content type: %d\",\n                message->version, message->type, message->token_len, message->code >> 5, message->code & 0x1F, message->mid, message->content_type);\n        //LOG_ARG(\"Payload: %.*s\", message->payload_len, message->payload);   //%s can not used for binary data.\n        if (message->code >= COAP_GET && message->code <= COAP_DELETE)\n        {\n            uint32_t block_num = 0;\n            uint16_t block_size = REST_MAX_CHUNK_SIZE;\n            uint32_t block_offset = 0;\n            int64_t new_offset = 0;\n\n            /* prepare response */\n            if (message->type == COAP_TYPE_CON)\n            {\n                /* Reliable CON requests are answered with an ACK. */\n                coap_init_message(response, COAP_TYPE_ACK, COAP_205_CONTENT, message->mid);\n            }\n            else\n            {\n                /* Unreliable NON requests are answered with a NON as well. */\n                coap_init_message(response, COAP_TYPE_NON, COAP_205_CONTENT, contextP->nextMID++);\n            }\n\n            /* mirror token */\n            if (message->token_len)\n            {\n                coap_set_header_token(response, message->token, message->token_len);\n            }\n\n            /* get offset for blockwise transfers */\n            if (coap_get_header_block2(message, &block_num, NULL, &block_size, &block_offset))\n            {\n                LOG_ARG(\"Blockwise: block request %u (%u/%u) @ %u bytes\", block_num, block_size, REST_MAX_CHUNK_SIZE, block_offset);\n                block_size = MIN(block_size, REST_MAX_CHUNK_SIZE);\n                new_offset = block_offset;\n            }\n\n            /* handle block1 option */\n            if (IS_OPTION(message, COAP_OPTION_BLOCK1))\n            {\n#ifdef LWM2M_CLIENT_MODE\n                // get server\n                lwm2m_server_t *serverP;\n                serverP = utils_findServer(contextP, fromSessionH);\n#ifdef LWM2M_BOOTSTRAP\n                if (serverP == NULL)\n                {\n                    serverP = utils_findBootstrapServer(contextP, fromSessionH);\n                }\n#endif\n                if (serverP == NULL)\n                {\n                    coap_error_code = COAP_500_INTERNAL_SERVER_ERROR;\n                }\n                else\n                {\n                    uint32_t block1_num;\n                    uint8_t  block1_more;\n                    uint16_t block1_size;\n                    uint8_t *complete_buffer = NULL;\n                    size_t complete_buffer_size;\n\n                    // parse block1 header\n                    coap_get_header_block1(message, &block1_num, &block1_more, &block1_size, NULL);\n                    LOG_ARG(\"Blockwise: block1 request NUM %u (SZX %u/ SZX Max%u) MORE %u\", block1_num, block1_size, REST_MAX_CHUNK_SIZE, block1_more);\n\n                    // handle block 1\n                    coap_error_code = coap_block1_handler(&serverP->block1Data, message->mid, message->payload, message->payload_len, block1_size, block1_num, block1_more, &complete_buffer, &complete_buffer_size);\n\n                    // if payload is complete, replace it in the coap message.\n                    if (coap_error_code == NO_ERROR)\n                    {\n                        message->payload = complete_buffer;\n                        message->payload_len = complete_buffer_size;\n                    }\n                    else if (coap_error_code == COAP_231_CONTINUE)\n                    {\n                        block1_size = MIN(block1_size, REST_MAX_CHUNK_SIZE);\n                        coap_set_header_block1(response, block1_num, block1_more, block1_size);\n                    }\n                }\n#else\n                coap_error_code = COAP_501_NOT_IMPLEMENTED;\n#endif\n            }\n            if (coap_error_code == NO_ERROR)\n            {\n                coap_error_code = handle_request(contextP, fromSessionH, message, response);\n            }\n            if (coap_error_code == NO_ERROR)\n            {\n                if ( IS_OPTION(message, COAP_OPTION_BLOCK2) )\n                {\n                    /* unchanged new_offset indicates that resource is unaware of blockwise transfer */\n                    if (new_offset == block_offset)\n                    {\n                        LOG_ARG(\"Blockwise: unaware resource with payload length %u/%u\", response->payload_len, block_size);\n                        if (block_offset >= message->payload_len)\n                        {\n                            LOG(\"handle_incoming_data(): block_offset >= response->payload_len\");\n\n                            response->code = COAP_402_BAD_OPTION;\n                            coap_set_payload(response, \"BlockOutOfScope\", 15); /* a const char str[] and sizeof(str) produces larger code size */\n                        }\n                        else\n                        {\n                            coap_set_header_block2(response, block_num, response->payload_len - block_offset > block_size, block_size);\n                            coap_set_payload(response, response->payload + block_offset, MIN(response->payload_len - block_offset, block_size));\n                        } /* if (valid offset) */\n                    }\n                    else\n                    {\n                        /* resource provides chunk-wise data */\n                        LOG_ARG(\"Blockwise: blockwise resource, new offset %d\", (int) new_offset);\n                        coap_set_header_block2(response, block_num, new_offset != -1 || response->payload_len > block_size, block_size);\n                        if (response->payload_len > block_size) coap_set_payload(response, response->payload, block_size);\n                    } /* if (resource aware of blockwise) */\n                }\n                else if (new_offset != 0)\n                {\n                    LOG_ARG(\"Blockwise: no block option for blockwise resource, using block size %u\", REST_MAX_CHUNK_SIZE);\n\n                    coap_set_header_block2(response, 0, new_offset != -1, REST_MAX_CHUNK_SIZE);\n                    coap_set_payload(response, response->payload, MIN(response->payload_len, REST_MAX_CHUNK_SIZE));\n                } /* if (blockwise request) */\n\n                coap_error_code = message_send(contextP, response, fromSessionH);\n\n                lwm2m_free(response->payload);\n                response->payload = NULL;\n                response->payload_len = 0;\n            }\n            else if (coap_error_code != COAP_IGNORE)\n            {\n                if (1 == coap_set_status_code(response, coap_error_code))\n                {\n                    coap_error_code = message_send(contextP, response, fromSessionH);\n                }\n            }\n        }\n        else\n        {\n            /* Responses */\n            switch (message->type)\n            {\n            case COAP_TYPE_NON:\n            case COAP_TYPE_CON:\n            {\n                bool done = transaction_handleResponse(contextP, fromSessionH, message, response);\n\n#ifdef LWM2M_SERVER_MODE\n                if (!done && IS_OPTION(message, COAP_OPTION_OBSERVE) &&\n                        ((message->code == COAP_204_CHANGED) || (message->code == COAP_205_CONTENT)))\n                {\n                    done = observe_handleNotify(contextP, fromSessionH, message, response);\n                }\n#endif\n                if (!done && message->type == COAP_TYPE_CON )\n                {\n                    coap_init_message(response, COAP_TYPE_ACK, 0, message->mid);\n                    coap_error_code = message_send(contextP, response, fromSessionH);\n                }\n            }\n            break;\n\n            case COAP_TYPE_RST:\n                /* Cancel possible subscriptions. */\n                handle_reset(contextP, fromSessionH, message);\n                transaction_handleResponse(contextP, fromSessionH, message, NULL);\n                break;\n\n            case COAP_TYPE_ACK:\n                transaction_handleResponse(contextP, fromSessionH, message, NULL);\n                break;\n\n            default:\n                break;\n            }\n        } /* Request or Response */\n        coap_free_header(message);\n    } /* if (parsed correctly) */\n    else\n    {\n        LOG_ARG(\"Message parsing failed %u.%2u\", coap_error_code >> 5, coap_error_code & 0x1F);\n    }\n\n    if (coap_error_code != NO_ERROR && coap_error_code != COAP_IGNORE)\n    {\n        LOG_ARG(\"ERROR %u: %s\", coap_error_code, coap_error_message);\n\n        /* Set to sendable error code. */\n        if (coap_error_code >= 192)\n        {\n            coap_error_code = COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        /* Reuse input buffer for error message. */\n        coap_init_message(message, COAP_TYPE_ACK, coap_error_code, message->mid);\n        coap_set_payload(message, coap_error_message, strlen(coap_error_message));\n        message_send(contextP, message, fromSessionH);\n    }\n}\n\n\nuint8_t message_send(lwm2m_context_t *contextP,\n                     coap_packet_t *message,\n                     void *sessionH)\n{\n    uint8_t result = COAP_500_INTERNAL_SERVER_ERROR;\n    uint8_t *pktBuffer;\n    size_t pktBufferLen = 0;\n    size_t allocLen;\n\n    LOG(\"Entering\");\n    allocLen = coap_serialize_get_size(message);\n    LOG_ARG(\"Size to allocate: %d\", allocLen);\n    if (allocLen == 0) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    pktBuffer = (uint8_t *)lwm2m_malloc(allocLen);\n    if (pktBuffer != NULL)\n    {\n        pktBufferLen = coap_serialize_message(message, pktBuffer);\n        LOG_ARG(\"coap_serialize_message() returned %d\", pktBufferLen);\n        if (0 != pktBufferLen)\n        {\n            result = lwm2m_buffer_send(sessionH, pktBuffer, pktBufferLen, contextP->userData);\n            output_buffer(stderr, (uint8_t *)pktBuffer, pktBufferLen, 0);\n        }\n        lwm2m_free(pktBuffer);\n    }\n\n    return result;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/registration.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    domedambrosio - Please refer to git log\n *    Fabien Fleutot - Please refer to git log\n *    Simon Bernard - Please refer to git log\n *    Toby Jaffey - Please refer to git log\n *    Manuel Sangoi - Please refer to git log\n *    Julien Vermillard - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *    Scott Bertin - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n#include \"internals.h\"\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n\n#define MAX_LOCATION_LENGTH 10      // strlen(\"/rd/65534\") + 1\n\n#ifdef LWM2M_CLIENT_MODE\n\nstatic int prv_getRegistrationQueryLength(lwm2m_context_t *contextP,\n        lwm2m_server_t *server)\n{\n    int index;\n    int res;\n    char buffer[21];\n\n    index = strlen(QUERY_STARTER QUERY_VERSION_FULL QUERY_DELIMITER QUERY_NAME);//?1.0&ep=\n    index += strlen(contextP->endpointName);\n\n    if (NULL != contextP->msisdn)\n    {\n        index += strlen(QUERY_DELIMITER QUERY_SMS);\n        index += strlen(contextP->msisdn);\n    }\n\n    switch (server->binding)\n    {\n    case BINDING_U:\n        index += strlen(\"&b=U\");\n        break;\n    case BINDING_UQ:\n        index += strlen(\"&b=UQ\");\n        break;\n    case BINDING_S:\n        index += strlen(\"&b=S\");\n        break;\n    case BINDING_SQ:\n        index += strlen(\"&b=SQ\");\n        break;\n    case BINDING_US:\n        index += strlen(\"&b=US\");\n        break;\n    case BINDING_UQS:\n        index += strlen(\"&b=UQS\");\n        break;\n    default:\n        return 0;\n    }\n\n    if (0 != server->lifetime)\n    {\n        index += strlen(QUERY_DELIMITER QUERY_LIFETIME);//&lt=\n        res = utils_intToText(server->lifetime, (uint8_t *)buffer, sizeof(buffer));\n        if (res == 0) return 0;\n        index += res;\n    }\n\n    return index + 1;\n}\n\nstatic int prv_getRegistrationQuery(lwm2m_context_t *contextP,\n                                    lwm2m_server_t *server,\n                                    char *buffer,\n                                    size_t length)\n{\n    int index;\n    int res;\n\n    index = utils_stringCopy(buffer, length, QUERY_STARTER QUERY_VERSION_FULL QUERY_DELIMITER QUERY_NAME);\n    if (index < 0) return 0;\n    res = utils_stringCopy(buffer + index, length - index, contextP->endpointName);\n    if (res < 0) return 0;\n    index += res;\n\n    if (NULL != contextP->msisdn)\n    {\n        res = utils_stringCopy(buffer + index, length - index, QUERY_DELIMITER QUERY_SMS);\n        if (res < 0) return 0;\n        index += res;\n        res = utils_stringCopy(buffer + index, length - index, contextP->msisdn);\n        if (res < 0) return 0;\n        index += res;\n    }\n\n    switch (server->binding)\n    {\n    case BINDING_U:\n        res = utils_stringCopy(buffer + index, length - index, \"&b=U\");\n        break;\n    case BINDING_UQ:\n        res = utils_stringCopy(buffer + index, length - index, \"&b=UQ\");\n        break;\n    case BINDING_S:\n        res = utils_stringCopy(buffer + index, length - index, \"&b=S\");\n        break;\n    case BINDING_SQ:\n        res = utils_stringCopy(buffer + index, length - index, \"&b=SQ\");\n        break;\n    case BINDING_US:\n        res = utils_stringCopy(buffer + index, length - index, \"&b=US\");\n        break;\n    case BINDING_UQS:\n        res = utils_stringCopy(buffer + index, length - index, \"&b=UQS\");\n        break;\n    default:\n        res = -1;\n    }\n    if (res < 0) return 0;\n    index += res;\n\n    if (0 != server->lifetime)\n    {\n        res = utils_stringCopy(buffer + index, length - index, QUERY_DELIMITER QUERY_LIFETIME);\n        if (res < 0) return 0;\n        index += res;\n        res = utils_intToText(server->lifetime, (uint8_t *)buffer + index, length - index);\n        if (res == 0) return 0;\n        index += res;\n    }\n\n    if(index < (int)length)\n    {\n        buffer[index++] = '\\0';\n    }\n    else\n    {\n        return 0;\n    }\n\n    return index;\n}\n\nstatic void prv_handleRegistrationReply(lwm2m_transaction_t *transacP,\n                                        void *message)\n{\n    coap_packet_t *packet = (coap_packet_t *)message;\n    lwm2m_server_t *targetP = (lwm2m_server_t *)(transacP->userData);\n\n    LOG(\"come into  prv_handleRegistrationReply!!\");\n    if (targetP->status == STATE_REG_PENDING)\n    {\n        time_t tv_sec = lwm2m_gettime();\n        if (tv_sec)\n        {\n            targetP->registration = tv_sec;\n        }\n        if (packet != NULL && packet->code == COAP_201_CREATED)\n        {\n            targetP->status = STATE_REGISTERED;\n            if (NULL != targetP->location)\n            {\n                lwm2m_free(targetP->location);\n            }\n            targetP->location = coap_get_multi_option_as_string(packet->location_path);\n\n            LOG(\"Registration successful\");\n        }\n        else\n        {\n            targetP->status = STATE_REG_FAILED;\n            LOG(\"Registration failed\");\n        }\n    }\n}\n\n// send the registration for a single server\nstatic uint8_t prv_register(lwm2m_context_t *contextP,\n                            lwm2m_server_t *server)\n{\n    char *query;\n    int query_length;\n    uint8_t *payload;\n    int payload_length;\n    lwm2m_transaction_t *transaction;\n\n    payload_length = object_getRegisterPayloadBufferLength(contextP);\n    if(payload_length == 0) return COAP_500_INTERNAL_SERVER_ERROR;\n    payload = lwm2m_malloc(payload_length);\n    if(!payload) return COAP_500_INTERNAL_SERVER_ERROR;\n    payload_length = object_getRegisterPayload(contextP, payload, payload_length);\n    if(payload_length == 0)\n    {\n        lwm2m_free(payload);\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    query_length = prv_getRegistrationQueryLength(contextP, server);\n    if(query_length == 0)\n    {\n        lwm2m_free(payload);\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n    query = lwm2m_malloc(query_length);\n    if(!query)\n    {\n        lwm2m_free(payload);\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n    if(prv_getRegistrationQuery(contextP, server, query, query_length) != query_length)\n    {\n        lwm2m_free(payload);\n        lwm2m_free(query);\n        return COAP_500_INTERNAL_SERVER_ERROR;\n    }\n\n    if (server->sessionH == NULL)\n    {\n        server->sessionH = lwm2m_connect_server(server->secObjInstID, contextP->userData, false);\n    }\n\n    if (NULL == server->sessionH)\n    {\n        lwm2m_free(payload);\n        lwm2m_free(query);\n        return COAP_503_SERVICE_UNAVAILABLE;\n    }\n\n    transaction = transaction_new(server->sessionH, COAP_POST, NULL, NULL, contextP->nextMID++, 4, NULL);\n    if (transaction == NULL)\n    {\n        lwm2m_free(payload);\n        lwm2m_free(query);\n        return COAP_503_SERVICE_UNAVAILABLE;\n    }\n    //    coap_pdu_t *pdu = (coap_pdu_t *)(transaction->message);\n\n    coap_set_header_uri_path(transaction->message, \"/\"URI_REGISTRATION_SEGMENT);\n    coap_set_header_uri_query(transaction->message, query);\n    coap_set_header_content_type(transaction->message, LWM2M_CONTENT_LINK);\n    coap_set_payload(transaction->message, payload, payload_length);\n\n    transaction->callback = prv_handleRegistrationReply;\n    transaction->userData = (void *) server;\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n    if (transaction_send(contextP, transaction) != 0)\n    {\n        lwm2m_free(payload);\n        lwm2m_free(query);\n        return COAP_503_SERVICE_UNAVAILABLE;\n    }\n\n    lwm2m_free(payload);\n    lwm2m_free(query);\n\n    server->status = STATE_REG_PENDING;\n\n    return COAP_NO_ERROR;\n}\n\nstatic void prv_handleRegistrationUpdateReply(lwm2m_transaction_t *transacP,\n        void *message)\n{\n    coap_packet_t *packet = (coap_packet_t *)message;\n    lwm2m_server_t *targetP = (lwm2m_server_t *)(transacP->userData);\n\n    if (targetP->status == STATE_REG_UPDATE_PENDING)\n    {\n        time_t tv_sec = lwm2m_gettime();\n        if (tv_sec )\n        {\n            targetP->registration = tv_sec;\n        }\n        if (packet != NULL && packet->code == COAP_204_CHANGED)\n        {\n            targetP->status = STATE_REGISTERED;\n            LOG(\"Registration update successful\");\n        }\n        else\n        {\n            targetP->status = STATE_REG_FAILED;\n            LOG(\"Registration update failed\");\n        }\n    }\n}\n\nstatic int prv_updateRegistration(lwm2m_context_t *contextP,\n                                  lwm2m_server_t *server,\n                                  bool withObjects)\n{\n    lwm2m_transaction_t *transaction;\n    uint8_t *payload = NULL;\n    int payload_length;\n\n    transaction = transaction_new(server->sessionH, COAP_POST, NULL, NULL, contextP->nextMID++, 4, NULL);\n    if (transaction == NULL) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    coap_set_header_uri_path(transaction->message, server->location);\n\n    if (withObjects == true)\n    {\n        payload_length = object_getRegisterPayloadBufferLength(contextP);\n        if(payload_length == 0)\n        {\n            transaction_free(transaction);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n\n        payload = lwm2m_malloc(payload_length);\n        if(!payload)\n        {\n            transaction_free(transaction);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n\n        payload_length = object_getRegisterPayload(contextP, payload, payload_length);\n        if(payload_length == 0)\n        {\n            transaction_free(transaction);\n            lwm2m_free(payload);\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n        coap_set_payload(transaction->message, payload, payload_length);\n    }\n\n    transaction->callback = prv_handleRegistrationUpdateReply;\n    transaction->userData = (void *) server;\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n\n    if (transaction_send(contextP, transaction) == 0)\n    {\n        server->status = STATE_REG_UPDATE_PENDING;\n    }\n\n    if (withObjects == true)\n    {\n        lwm2m_free(payload);\n    }\n\n    return COAP_NO_ERROR;\n}\n\n// update the registration of a given server\nint lwm2m_update_registration(lwm2m_context_t *contextP,\n                              uint16_t shortServerID,\n                              bool withObjects)\n{\n    lwm2m_server_t *targetP;\n    uint8_t result;\n\n    LOG_ARG(\"State: %s, shortServerID: %d\", STR_STATE(contextP->state), shortServerID);\n\n    result = COAP_NO_ERROR;\n\n    targetP = contextP->serverList;\n    if (targetP == NULL)\n    {\n        if (object_getServers(contextP, false) == -1)\n        {\n            LOG(\"No server found\");\n            return COAP_404_NOT_FOUND;\n        }\n    }\n    while (targetP != NULL && result == COAP_NO_ERROR)\n    {\n        if (shortServerID != 0)\n        {\n            if (targetP->shortID == shortServerID)\n            {\n                // found the server, trigger the update transaction\n                if (targetP->status == STATE_REGISTERED\n                        || targetP->status == STATE_REG_UPDATE_PENDING)\n                {\n                    if (withObjects == true)\n                    {\n                        targetP->status = STATE_REG_FULL_UPDATE_NEEDED;\n                    }\n                    else\n                    {\n                        targetP->status = STATE_REG_UPDATE_NEEDED;\n                    }\n                    return COAP_NO_ERROR;\n                }\n                else if ((targetP->status == STATE_REG_FULL_UPDATE_NEEDED)\n                         || (targetP->status == STATE_REG_UPDATE_NEEDED))\n                {\n                    // if REG (FULL) UPDATE is already set, returns COAP_NO_ERROR\n                    if (withObjects == true)\n                    {\n                        targetP->status = STATE_REG_FULL_UPDATE_NEEDED;\n                    }\n                    return COAP_NO_ERROR;\n                }\n                else\n                {\n                    return COAP_400_BAD_REQUEST;\n                }\n            }\n        }\n        else\n        {\n            if (targetP->status == STATE_REGISTERED\n                    || targetP->status == STATE_REG_UPDATE_PENDING)\n            {\n                if (withObjects == true)\n                {\n                    targetP->status = STATE_REG_FULL_UPDATE_NEEDED;\n                }\n                else\n                {\n                    targetP->status = STATE_REG_UPDATE_NEEDED;\n                }\n            }\n        }\n        targetP = targetP->next;\n    }\n\n    if (shortServerID != 0\n            && targetP == NULL)\n    {\n        // no server found\n        result = COAP_404_NOT_FOUND;\n    }\n\n    return result;\n}\n//serverlistobjectlistѾֵ\nuint8_t registration_start(lwm2m_context_t *contextP)\n{\n    lwm2m_server_t *targetP;\n    uint8_t result;\n\n    LOG_ARG(\"State: %s\", STR_STATE(contextP->state));\n\n    result = COAP_NO_ERROR;\n\n    targetP = contextP->serverList;\n    while (targetP != NULL && result == COAP_NO_ERROR)\n    {\n        if (targetP->status == STATE_DEREGISTERED\n                || targetP->status == STATE_REG_FAILED)\n        {\n            result = prv_register(contextP, targetP);\n        }\n        targetP = targetP->next;\n    }\n\n    return result;\n}\n\n\n/*\n * Returns STATE_REG_PENDING if at least one registration is still pending\n * Returns STATE_REGISTERED if no registration is pending and there is at least one server the client is registered to\n * Returns STATE_REG_FAILED if all registration failed.\n */\nlwm2m_status_t registration_getStatus(lwm2m_context_t *contextP)\n{\n    lwm2m_server_t *targetP;\n    lwm2m_status_t reg_status;\n\n    LOG_ARG(\"State: %s\", STR_STATE(contextP->state));\n\n    targetP = contextP->serverList;\n    reg_status = STATE_REG_FAILED;\n\n    while (targetP != NULL)\n    {\n        LOG_ARG(\"targetP->status: %s\", STR_STATUS(targetP->status));\n        switch (targetP->status)\n        {\n        case STATE_REGISTERED:\n        case STATE_REG_UPDATE_NEEDED:\n        case STATE_REG_FULL_UPDATE_NEEDED:\n        case STATE_REG_UPDATE_PENDING:\n            if (reg_status == STATE_REG_FAILED)\n            {\n                reg_status = STATE_REGISTERED;\n            }\n            break;\n\n        case STATE_REG_PENDING:\n            reg_status = STATE_REG_PENDING;\n            break;\n\n        case STATE_REG_FAILED:\n        case STATE_DEREG_PENDING:\n        case STATE_DEREGISTERED:\n        default:\n            break;\n        }\n        LOG_ARG(\"reg_status: %s\", STR_STATUS(reg_status));\n\n        targetP = targetP->next;\n    }\n\n    return reg_status;\n}\n\nstatic void prv_handleDeregistrationReply(lwm2m_transaction_t *transacP,\n        void *message)\n{\n    lwm2m_server_t *targetP;\n\n    targetP = (lwm2m_server_t *)(transacP->userData);\n    if (NULL != targetP)\n    {\n        if (targetP->status == STATE_DEREG_PENDING)\n        {\n            targetP->status = STATE_DEREGISTERED;\n        }\n    }\n}\n\nvoid registration_deregister(lwm2m_context_t *contextP,\n                             lwm2m_server_t *serverP)\n{\n    lwm2m_transaction_t *transaction;\n\n    LOG_ARG(\"State: %s, serverP->status: %s\", STR_STATE(contextP->state), STR_STATUS(serverP->status));\n\n    if (serverP->status == STATE_DEREGISTERED\n            || serverP->status == STATE_REG_PENDING\n            || serverP->status == STATE_DEREG_PENDING\n            || serverP->status == STATE_REG_FAILED\n            || serverP->location == NULL)\n    {\n        return;\n    }\n\n    transaction = transaction_new(serverP->sessionH, COAP_DELETE, NULL, NULL, contextP->nextMID++, 4, NULL);\n    if (transaction == NULL) return;\n\n    coap_set_header_uri_path(transaction->message, serverP->location);\n\n    transaction->callback = prv_handleDeregistrationReply;\n    transaction->userData = (void *) serverP;\n\n    contextP->transactionList = (lwm2m_transaction_t *)LWM2M_LIST_ADD(contextP->transactionList, transaction);\n    if (transaction_send(contextP, transaction) == 0)\n    {\n        serverP->status = STATE_DEREG_PENDING;\n    }\n}\n\nvoid registration_reset(lwm2m_context_t *contextP,\n                        lwm2m_server_t *serverP)\n{\n    //registration_deregister(contextP, serverP);\n    if (serverP->sessionH != NULL)\n    {\n        lwm2m_close_connection(serverP->sessionH, contextP->userData);\n        serverP->sessionH = NULL;\n    }\n    serverP->status = STATE_DEREGISTERED;\n}\n\nlwm2m_server_t *registration_get_registered_server(lwm2m_context_t *contextP)\n{\n    lwm2m_server_t *targetP;\n\n    if(NULL == contextP)\n    {\n        LOG(\"null pointer\");\n        return NULL;\n    }\n\n    targetP = contextP->serverList;\n    while (targetP != NULL)\n    {\n        if ((STATE_REGISTERED == targetP->status)\n                || (STATE_REG_UPDATE_PENDING == targetP->status)\n                || (STATE_REG_UPDATE_NEEDED == targetP->status)\n                || (STATE_REG_FULL_UPDATE_NEEDED == targetP->status))\n        {\n            return targetP;\n        }\n        targetP = targetP->next;\n    }\n\n    return NULL;\n}\n\n#endif\n\n#ifdef LWM2M_SERVER_MODE\nstatic void prv_freeClientObjectList(lwm2m_client_object_t *objects)\n{\n    while (objects != NULL)\n    {\n        lwm2m_client_object_t *objP;\n\n        while (objects->instanceList != NULL)\n        {\n            lwm2m_list_t *target;\n\n            target = objects->instanceList;\n            objects->instanceList = objects->instanceList->next;\n            lwm2m_free(target);\n        }\n\n        objP = objects;\n        objects = objects->next;\n        lwm2m_free(objP);\n    }\n}\n\nstatic int prv_getParameters(multi_option_t *query,\n                             char **nameP,\n                             uint32_t *lifetimeP,\n                             char **msisdnP,\n                             lwm2m_binding_t *bindingP,\n                             char **versionP)\n{\n    *nameP = NULL;\n    *lifetimeP = 0;\n    *msisdnP = NULL;\n    *bindingP = BINDING_UNKNOWN;\n    *versionP = NULL;\n\n    while (query != NULL)\n    {\n        if (lwm2m_strncmp((char *)query->data, QUERY_NAME, QUERY_NAME_LEN) == 0)\n        {\n            if (*nameP != NULL) goto error;\n            if (query->len == QUERY_NAME_LEN) goto error;\n\n            *nameP = (char *)lwm2m_malloc(query->len - QUERY_NAME_LEN + 1);\n            if (*nameP != NULL)\n            {\n                memcpy(*nameP, query->data + QUERY_NAME_LEN, query->len - QUERY_NAME_LEN);\n                (*nameP)[query->len - QUERY_NAME_LEN] = 0;\n            }\n        }\n        else if (lwm2m_strncmp((char *)query->data, QUERY_SMS, QUERY_SMS_LEN) == 0)\n        {\n            if (*msisdnP != NULL) goto error;\n            if (query->len == QUERY_SMS_LEN) goto error;\n\n            *msisdnP = (char *)lwm2m_malloc(query->len - QUERY_SMS_LEN + 1);\n            if (*msisdnP != NULL)\n            {\n                memcpy(*msisdnP, query->data + QUERY_SMS_LEN, query->len - QUERY_SMS_LEN);\n                (*msisdnP)[query->len - QUERY_SMS_LEN] = 0;\n            }\n        }\n        else if (lwm2m_strncmp((char *)query->data, QUERY_LIFETIME, QUERY_LIFETIME_LEN) == 0)\n        {\n            int i;\n\n            if (*lifetimeP != 0) goto error;\n            if (query->len == QUERY_LIFETIME_LEN) goto error;\n\n            for (i = QUERY_LIFETIME_LEN ; i < query->len ; i++)\n            {\n                if (query->data[i] < '0' || query->data[i] > '9') goto error;\n                *lifetimeP = (*lifetimeP * 10) + (query->data[i] - '0');\n            }\n        }\n        else if (lwm2m_strncmp((char *)query->data, QUERY_VERSION, QUERY_VERSION_LEN) == 0)\n        {\n            if (*versionP != NULL) goto error;\n            if (query->len == QUERY_VERSION_LEN) goto error;\n\n            *versionP = (char *)lwm2m_malloc(query->len - QUERY_VERSION_LEN + 1);\n            if (*versionP != NULL)\n            {\n                memcpy(*versionP, query->data + QUERY_VERSION_LEN, query->len - QUERY_VERSION_LEN);\n                (*versionP)[query->len - QUERY_VERSION_LEN] = 0;\n            }\n        }\n        else if (lwm2m_strncmp((char *)query->data, QUERY_BINDING, QUERY_BINDING_LEN) == 0)\n        {\n            if (*bindingP != BINDING_UNKNOWN) goto error;\n            if (query->len == QUERY_BINDING_LEN) goto error;\n\n            *bindingP = utils_stringToBinding(query->data + QUERY_BINDING_LEN, query->len - QUERY_BINDING_LEN);\n        }\n        query = query->next;\n    }\n\n    return 0;\n\nerror:\n    if (*nameP != NULL) lwm2m_free(*nameP);\n    if (*msisdnP != NULL) lwm2m_free(*msisdnP);\n    if (*versionP != NULL) lwm2m_free(*versionP);\n\n    return -1;\n}\n\nstatic uint16_t prv_splitLinkAttribute(uint8_t *data,\n                                       uint16_t length,\n                                       uint16_t *keyStart,\n                                       uint16_t *keyLength,\n                                       uint16_t *valueStart,\n                                       uint16_t *valueLength)\n{\n    uint16_t index;\n    uint16_t end;\n\n    index = 0;\n    while (index < length && data[index] == ' ') index++;\n    if (index == length) return 0;\n\n    if (data[index] == REG_ATTR_SEPARATOR)\n    {\n        index++;\n    }\n    if (index == length) return 0;\n\n    *keyStart = index;\n\n    while (index < length && data[index] != REG_ATTR_EQUALS) index++;\n    if (index == *keyStart || index == length) return 0;\n\n    *keyLength = index - *keyStart;\n\n    index++;\n    while (index < length && data[index] == ' ') index++;\n    if (index == length) return 0;\n\n    *valueStart = index;\n\n    while (index < length && data[index] != REG_ATTR_SEPARATOR) index++;\n    end = index;\n\n    index--;\n    while (index > *valueStart && data[index] == ' ') index--;\n    if (index == *valueStart) return 0;\n\n    *valueLength = index - *valueStart + 1;\n\n    return end;\n}\n\nstatic int prv_parseLinkAttributes(uint8_t *data,\n                                   uint16_t length,\n                                   bool *supportJSON,\n                                   char **altPath)\n{\n    uint16_t index;\n    uint16_t pathStart;\n    uint16_t pathLength;\n    bool isValid;\n\n    isValid = false;\n\n    // Expecting application/link-format (RFC6690)\n    // leading space were removed before. Remove trailing spaces.\n    while (length > 0 && data[length - 1] == ' ') length--;\n\n    // strip open tag\n    if (length >= 2 && data[0] == REG_URI_START)\n    {\n        data += 1;\n        length -= 1;\n    }\n    else\n    {\n        return 0;\n    }\n\n    pathStart = 0;\n    index = length - 1;\n    while (index > 0 && data[index] != REG_URI_END) index--;\n    // link attributes are required\n    if (index == 0 || index == length - 1) return 0;\n\n    // If there is a preceding /, remove it\n    if (data[pathStart] == '/')\n    {\n        pathStart += 1;\n    }\n    pathLength = index - pathStart;\n\n    index++;\n    if (index >= length || data[index] != REG_ATTR_SEPARATOR) return 0;\n    index++;\n\n    while (index < length)\n    {\n        uint16_t result;\n        uint16_t keyStart;\n        uint16_t keyLength;\n        uint16_t valueStart;\n        uint16_t valueLength;\n\n        result = prv_splitLinkAttribute(data + index, length - index, &keyStart, &keyLength, &valueStart, &valueLength);\n        if (result == 0) return 0;\n\n        if (keyLength == REG_ATTR_TYPE_KEY_LEN\n                && 0 == lwm2m_strncmp(REG_ATTR_TYPE_KEY, (char *)data + index + keyStart, keyLength))\n        {\n            if (isValid == true) return 0; // declared twice\n            if (valueLength != REG_ATTR_TYPE_VALUE_LEN\n                    || 0 != lwm2m_strncmp(REG_ATTR_TYPE_VALUE, (char *)data + index + valueStart, valueLength))\n            {\n                return 0;\n            }\n            isValid = true;\n        }\n        else if (keyLength == REG_ATTR_CONTENT_KEY_LEN\n                 && 0 == lwm2m_strncmp(REG_ATTR_CONTENT_KEY, (char *)data + index + keyStart, keyLength))\n        {\n            if (*supportJSON == true) return 0; // declared twice\n            if (valueLength == REG_ATTR_CONTENT_JSON_LEN\n                    && 0 == lwm2m_strncmp(REG_ATTR_CONTENT_JSON, (char *)data + index + valueStart, valueLength))\n            {\n                *supportJSON = true;\n            }\n            else\n            {\n                return 0;\n            }\n        }\n        // else ignore this one\n\n        index += result;\n    }\n\n    if (isValid == false) return 0;\n\n    if (pathLength != 0)\n    {\n        *altPath = (char *)lwm2m_malloc(pathLength + 1);\n        if (*altPath == NULL) return 0;\n        memcpy(*altPath, data + pathStart, pathLength);\n        (*altPath)[pathLength] = 0;\n    }\n\n    return 1;\n}\n\nstatic int prv_getId(uint8_t *data,\n                     uint16_t length,\n                     uint16_t *objId,\n                     uint16_t *instanceId)\n{\n    int value;\n    uint16_t limit;\n\n    // Expecting application/link-format (RFC6690)\n    // leading space were removed before. Remove trailing spaces.\n    while (length > 0 && data[length - 1] == ' ') length--;\n\n    // strip open and close tags\n    if (length >= 1 && data[0] == REG_URI_START && data[length - 1] == REG_URI_END)\n    {\n        data += 1;\n        length -= 2;\n    }\n    else\n    {\n        return 0;\n    }\n\n    // If there is a preceding /, remove it\n    if (length >= 1 && data[0] == '/')\n    {\n        data += 1;\n        length -= 1;\n    }\n\n    limit = 0;\n    while (limit < length && data[limit] != '/') limit++;\n    value = uri_getNumber(data, limit);\n    if (value < 0 || value >= LWM2M_MAX_ID) return 0;\n    *objId = value;\n\n    if (limit < length)\n    {\n        limit += 1;\n        data += limit;\n        length -= limit;\n\n        if (length > 0)\n        {\n            value = uri_getNumber(data, length);\n            if (value >= 0 && value < LWM2M_MAX_ID)\n            {\n                *instanceId = value;\n                return 2;\n            }\n            else\n            {\n                return 0;\n            }\n        }\n    }\n\n    return 1;\n}\n\nstatic lwm2m_client_object_t *prv_decodeRegisterPayload(uint8_t *payload,\n        uint16_t payloadLength,\n        bool *supportJSON,\n        char **altPath)\n{\n    uint16_t index;\n    lwm2m_client_object_t *objList;\n    bool linkAttrFound;\n\n    *altPath = NULL;\n    *supportJSON = false;\n    objList = NULL;\n    linkAttrFound = false;\n    index = 0;\n\n    while (index <= payloadLength)\n    {\n        uint16_t start;\n        uint16_t length;\n        int result;\n        uint16_t id;\n        uint16_t instance;\n\n        while (index < payloadLength && payload[index] == ' ') index++;\n        if (index == payloadLength) break;\n\n        start = index;\n        while (index < payloadLength && payload[index] != REG_DELIMITER) index++;\n        length = index - start;\n\n        result = prv_getId(payload + start, length, &id, &instance);\n        if (result != 0)\n        {\n            lwm2m_client_object_t *objectP;\n\n            objectP = (lwm2m_client_object_t *)lwm2m_list_find((lwm2m_list_t *)objList, id);\n            if (objectP == NULL)\n            {\n                objectP = (lwm2m_client_object_t *)lwm2m_malloc(sizeof(lwm2m_client_object_t));\n                if (objectP == NULL) goto error;\n                memset(objectP, 0, sizeof(lwm2m_client_object_t));\n                objectP->id = id;\n                objList = (lwm2m_client_object_t *)LWM2M_LIST_ADD(objList, objectP);\n            }\n            if (result == 2)\n            {\n                lwm2m_list_t *instanceP;\n\n                instanceP = lwm2m_list_find(objectP->instanceList, instance);\n                if (instanceP == NULL)\n                {\n                    instanceP = (lwm2m_list_t *)lwm2m_malloc(sizeof(lwm2m_list_t));\n                    if(instanceP == NULL) goto error;\n                    memset(instanceP, 0, sizeof(lwm2m_list_t));\n                    instanceP->id = instance;\n                    objectP->instanceList = LWM2M_LIST_ADD(objectP->instanceList, instanceP);\n                }\n            }\n        }\n        else if (linkAttrFound == false)\n        {\n            result = prv_parseLinkAttributes(payload + start, length, supportJSON, altPath);\n            if (result == 0) goto error;\n\n            linkAttrFound = true;\n        }\n        else goto error;\n\n        index++;\n    }\n\n    return objList;\n\nerror:\n    if (*altPath != NULL)\n    {\n        lwm2m_free(*altPath);\n        *altPath = NULL;\n    }\n    prv_freeClientObjectList(objList);\n\n    return NULL;\n}\n\nstatic lwm2m_client_t *prv_getClientByName(lwm2m_context_t *contextP,\n        char *name)\n{\n    lwm2m_client_t *targetP;\n\n    targetP = contextP->clientList;\n    while (targetP != NULL && strcmp(name, targetP->name) != 0)\n    {\n        targetP = targetP->next;\n    }\n\n    return targetP;\n}\n\nvoid registration_freeClient(lwm2m_client_t *clientP)\n{\n    LOG(\"Entering\");\n    if (clientP->name != NULL) lwm2m_free(clientP->name);\n    if (clientP->msisdn != NULL) lwm2m_free(clientP->msisdn);\n    if (clientP->altPath != NULL) lwm2m_free(clientP->altPath);\n    prv_freeClientObjectList(clientP->objectList);\n    while(clientP->observationList != NULL)\n    {\n        lwm2m_observation_t *targetP;\n\n        targetP = clientP->observationList;\n        clientP->observationList = clientP->observationList->next;\n        lwm2m_free(targetP);\n    }\n    lwm2m_free(clientP);\n}\n\nstatic int prv_getLocationString(uint16_t id,\n                                 char location[MAX_LOCATION_LENGTH])\n{\n    int index;\n    int result;\n\n    memset(location, 0, MAX_LOCATION_LENGTH);\n\n    result = utils_stringCopy(location, MAX_LOCATION_LENGTH, \"/\"URI_REGISTRATION_SEGMENT\"/\");\n    if (result < 0) return 0;\n    index = result;\n\n    result = utils_intToText(id, (uint8_t *)location + index, MAX_LOCATION_LENGTH - index);\n    if (result == 0) return 0;\n\n    return index + result;\n}\n\nuint8_t registration_handleRequest(lwm2m_context_t *contextP,\n                                   lwm2m_uri_t *uriP,\n                                   void *fromSessionH,\n                                   coap_packet_t *message,\n                                   coap_packet_t *response)\n{\n    uint8_t result;\n    time_t tv_sec;\n\n    LOG_URI(uriP);\n    tv_sec = lwm2m_gettime();\n    if (tv_sec < 0) return COAP_500_INTERNAL_SERVER_ERROR;\n\n    switch(message->code)\n    {\n    case COAP_POST:\n    {\n        char *name = NULL;\n        uint32_t lifetime;\n        char *msisdn;\n        char *altPath;\n        char *version;\n        lwm2m_binding_t binding;\n        lwm2m_client_object_t *objects;\n        bool supportJSON;\n        lwm2m_client_t *clientP;\n        char location[MAX_LOCATION_LENGTH];\n\n        if (0 != prv_getParameters(message->uri_query, &name, &lifetime, &msisdn, &binding, &version))\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n        if (message->content_type != (coap_content_type_t)LWM2M_CONTENT_LINK\n                && message->content_type != (coap_content_type_t)LWM2M_CONTENT_TEXT)\n        {\n            return COAP_400_BAD_REQUEST;\n        }\n\n        objects = prv_decodeRegisterPayload(message->payload, message->payload_len, &supportJSON, &altPath);\n\n        switch (uriP->flag & LWM2M_URI_MASK_ID)\n        {\n        case 0:\n            // Register operation\n            // Version is mandatory\n            if (version == NULL)\n            {\n                if (name != NULL) lwm2m_free(name);\n                if (msisdn != NULL) lwm2m_free(msisdn);\n                return COAP_400_BAD_REQUEST;\n            }\n            // Endpoint client name is mandatory\n            if (name == NULL)\n            {\n                lwm2m_free(version);\n                if (msisdn != NULL) lwm2m_free(msisdn);\n                return COAP_400_BAD_REQUEST;\n            }\n            // Object list is mandatory\n            if (objects == NULL)\n            {\n                lwm2m_free(version);\n                lwm2m_free(name);\n                if (msisdn != NULL) lwm2m_free(msisdn);\n                return COAP_400_BAD_REQUEST;\n            }\n            // version must be 1.0\n            if (strlen(version) != LWM2M_VERSION_LEN\n                    || lwm2m_strncmp(version, LWM2M_VERSION, LWM2M_VERSION_LEN))\n            {\n                lwm2m_free(version);\n                lwm2m_free(name);\n                if (msisdn != NULL) lwm2m_free(msisdn);\n                return COAP_412_PRECONDITION_FAILED;\n            }\n\n            if (lifetime == 0)\n            {\n                lifetime = LWM2M_DEFAULT_LIFETIME;\n            }\n\n            clientP = prv_getClientByName(contextP, name);\n            if (clientP != NULL)\n            {\n                // we reset this registration\n                lwm2m_free(clientP->name);\n                if (clientP->msisdn != NULL) lwm2m_free(clientP->msisdn);\n                if (clientP->altPath != NULL) lwm2m_free(clientP->altPath);\n                prv_freeClientObjectList(clientP->objectList);\n                clientP->objectList = NULL;\n            }\n            else\n            {\n                clientP = (lwm2m_client_t *)lwm2m_malloc(sizeof(lwm2m_client_t));\n                if (clientP == NULL)\n                {\n                    lwm2m_free(name);\n                    lwm2m_free(altPath);\n                    if (msisdn != NULL) lwm2m_free(msisdn);\n                    prv_freeClientObjectList(objects);\n                    return COAP_500_INTERNAL_SERVER_ERROR;\n                }\n                memset(clientP, 0, sizeof(lwm2m_client_t));\n                clientP->internalID = lwm2m_list_newId((lwm2m_list_t *)contextP->clientList);\n                contextP->clientList = (lwm2m_client_t *)LWM2M_LIST_ADD(contextP->clientList, clientP);\n            }\n            clientP->name = name;\n            clientP->binding = binding;\n            clientP->msisdn = msisdn;\n            clientP->altPath = altPath;\n            clientP->supportJSON = supportJSON;\n            clientP->lifetime = lifetime;\n            clientP->endOfLife = tv_sec + lifetime;\n            clientP->objectList = objects;\n            clientP->sessionH = fromSessionH;\n\n            if (prv_getLocationString(clientP->internalID, location) == 0)\n            {\n                registration_freeClient(clientP);\n                return COAP_500_INTERNAL_SERVER_ERROR;\n            }\n            if (coap_set_header_location_path(response, location) == 0)\n            {\n                registration_freeClient(clientP);\n                return COAP_500_INTERNAL_SERVER_ERROR;\n            }\n\n            if (contextP->monitorCallback != NULL)\n            {\n                contextP->monitorCallback(clientP->internalID, NULL, COAP_201_CREATED, LWM2M_CONTENT_TEXT, NULL, 0, contextP->monitorUserData);\n            }\n            result = COAP_201_CREATED;\n            break;\n\n        case LWM2M_URI_FLAG_OBJECT_ID:\n            clientP = (lwm2m_client_t *)lwm2m_list_find((lwm2m_list_t *)contextP->clientList, uriP->objectId);\n            if (clientP == NULL) return COAP_404_NOT_FOUND;\n\n            // Endpoint client name MUST NOT be present\n            if (name != NULL)\n            {\n                lwm2m_free(name);\n                if (msisdn != NULL) lwm2m_free(msisdn);\n                return COAP_400_BAD_REQUEST;\n            }\n\n            if (binding != BINDING_UNKNOWN)\n            {\n                clientP->binding = binding;\n            }\n            if (msisdn != NULL)\n            {\n                if (clientP->msisdn != NULL) lwm2m_free(clientP->msisdn);\n                clientP->msisdn = msisdn;\n            }\n            if (lifetime != 0)\n            {\n                clientP->lifetime = lifetime;\n            }\n            // client IP address, port or MSISDN may have changed\n            clientP->sessionH = fromSessionH;\n\n            if (objects != NULL)\n            {\n                lwm2m_observation_t *observationP;\n\n                // remove observations on object/instance no longer existing\n                observationP = clientP->observationList;\n                while (observationP != NULL)\n                {\n                    lwm2m_client_object_t *objP;\n                    lwm2m_observation_t *nextP;\n\n                    nextP = observationP->next;\n\n                    objP = (lwm2m_client_object_t *)lwm2m_list_find((lwm2m_list_t *)objects, observationP->uri.objectId);\n                    if (objP == NULL)\n                    {\n                        observationP->callback(clientP->internalID,\n                                               &observationP->uri,\n                                               COAP_202_DELETED,\n                                               LWM2M_CONTENT_TEXT, NULL, 0,\n                                               observationP->userData);\n                        observe_remove(observationP);\n                    }\n                    else\n                    {\n                        if ((observationP->uri.flag & LWM2M_URI_FLAG_INSTANCE_ID) != 0)\n                        {\n                            if (lwm2m_list_find((lwm2m_list_t *)objP->instanceList, observationP->uri.instanceId) == NULL)\n                            {\n                                observationP->callback(clientP->internalID,\n                                                       &observationP->uri,\n                                                       COAP_202_DELETED,\n                                                       LWM2M_CONTENT_TEXT, NULL, 0,\n                                                       observationP->userData);\n                                observe_remove(observationP);\n                            }\n                        }\n                    }\n\n                    observationP = nextP;\n                }\n\n                prv_freeClientObjectList(clientP->objectList);\n                clientP->objectList = objects;\n            }\n\n            clientP->endOfLife = tv_sec + clientP->lifetime;\n\n            if (contextP->monitorCallback != NULL)\n            {\n                contextP->monitorCallback(clientP->internalID, NULL, COAP_204_CHANGED, LWM2M_CONTENT_TEXT, NULL, 0, contextP->monitorUserData);\n            }\n            result = COAP_204_CHANGED;\n            break;\n\n        default:\n            return COAP_400_BAD_REQUEST;\n        }\n    }\n    break;\n\n    case COAP_DELETE:\n    {\n        lwm2m_client_t *clientP;\n\n        if ((uriP->flag & LWM2M_URI_MASK_ID) != LWM2M_URI_FLAG_OBJECT_ID) return COAP_400_BAD_REQUEST;\n\n        contextP->clientList = (lwm2m_client_t *)LWM2M_LIST_RM(contextP->clientList, uriP->objectId, &clientP);\n        if (clientP == NULL) return COAP_400_BAD_REQUEST;\n        if (contextP->monitorCallback != NULL)\n        {\n            contextP->monitorCallback(clientP->internalID, NULL, COAP_202_DELETED, LWM2M_CONTENT_TEXT, NULL, 0, contextP->monitorUserData);\n        }\n        registration_freeClient(clientP);\n        result = COAP_202_DELETED;\n    }\n    break;\n\n    default:\n        return COAP_400_BAD_REQUEST;\n    }\n\n    return result;\n}\n\nvoid lwm2m_set_monitoring_callback(lwm2m_context_t *contextP,\n                                   lwm2m_result_callback_t callback,\n                                   void *userData)\n{\n    LOG(\"Entering\");\n    contextP->monitorCallback = callback;\n    contextP->monitorUserData = userData;\n}\n#endif\n\n// for each server update the registration if needed\n// for each client check if the registration expired\nvoid registration_step(lwm2m_context_t *contextP,\n                       time_t currentTime,\n                       time_t *timeoutP)\n{\n#ifdef LWM2M_CLIENT_MODE\n    lwm2m_server_t *targetP = contextP->serverList;\n\n    LOG_ARG(\"contextP State: %s\", STR_STATE(contextP->state));\n\n    targetP = contextP->serverList;\n    while (targetP != NULL)\n    {\n        LOG_ARG(\"targetP Status: %s\", STR_STATUS(targetP->status));\n        switch (targetP->status)\n        {\n        case STATE_REGISTERED:\n        {\n            time_t nextUpdate;\n            int32_t  interval;\n\n            nextUpdate = targetP->lifetime;\n            if (COAP_MAX_TRANSMIT_WAIT < nextUpdate)\n            {\n                nextUpdate -= COAP_MAX_TRANSMIT_WAIT;\n            }\n            else\n            {\n                nextUpdate = nextUpdate >> 1;\n            }\n\n            interval = (int32_t)(targetP->registration + nextUpdate) - (int32_t)currentTime;\n            if (0 >= interval)\n            {\n                LOG(\"Updating registration\");\n                prv_updateRegistration(contextP, targetP, false);\n            }\n            else if (interval < *timeoutP)\n            {\n                *timeoutP = interval;\n            }\n        }\n        break;\n\n        case STATE_REG_UPDATE_NEEDED:\n            prv_updateRegistration(contextP, targetP, false);\n            break;\n\n        case STATE_REG_FULL_UPDATE_NEEDED:\n            prv_updateRegistration(contextP, targetP, true);\n            break;\n\n        case STATE_REG_FAILED:\n            if (targetP->sessionH != NULL)\n            {\n                lwm2m_close_connection(targetP->sessionH, contextP->userData);\n                targetP->sessionH = NULL;\n            }\n            break;\n\n        default:\n            break;\n        }\n        targetP = targetP->next;\n    }\n\n#endif\n#ifdef LWM2M_SERVER_MODE\n    lwm2m_client_t *clientP;\n\n    LOG(\"Entering\");\n    // monitor clients lifetime\n    clientP = contextP->clientList;\n    while (clientP != NULL)\n    {\n        lwm2m_client_t *nextP = clientP->next;\n\n        if (clientP->endOfLife <= currentTime)\n        {\n            contextP->clientList = (lwm2m_client_t *)LWM2M_LIST_RM(contextP->clientList, clientP->internalID, NULL);\n            if (contextP->monitorCallback != NULL)\n            {\n                contextP->monitorCallback(clientP->internalID, NULL, COAP_202_DELETED, LWM2M_CONTENT_TEXT, NULL, 0, contextP->monitorUserData);\n            }\n            registration_freeClient(clientP);\n        }\n        else\n        {\n            time_t interval;\n\n            interval = clientP->endOfLife - currentTime;\n\n            if (*timeoutP > interval)\n            {\n                *timeoutP = interval;\n            }\n        }\n        clientP = nextP;\n    }\n#endif\n\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/tlv.c",
    "content": "/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Fabien Fleutot - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *\n *******************************************************************************/\n\n#include \"internals.h\"\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <inttypes.h>\n#include <float.h>\n\n#ifndef LWM2M_BIG_ENDIAN\n#ifndef LWM2M_LITTLE_ENDIAN\n#error Please define LWM2M_BIG_ENDIAN or LWM2M_LITTLE_ENDIAN\n#endif\n#endif\n\n#define _PRV_TLV_TYPE_MASK 0xC0\n#define _PRV_TLV_HEADER_MAX_LENGTH 6\n\n#define _PRV_TLV_TYPE_UNKNOWN           (uint8_t)0xFF\n#define _PRV_TLV_TYPE_OBJECT            (uint8_t)0x10\n#define _PRV_TLV_TYPE_OBJECT_INSTANCE   (uint8_t)0x00\n#define _PRV_TLV_TYPE_RESOURCE          (uint8_t)0xC0\n#define _PRV_TLV_TYPE_MULTIPLE_RESOURCE (uint8_t)0x80\n#define _PRV_TLV_TYPE_RESOURCE_INSTANCE (uint8_t)0x40\n\nstatic size_t prv_encodeFloat(double data,\n                              uint8_t *data_buffer)\n{\n    size_t length = 0;\n\n    if ((data < 0.0 - (double)FLT_MAX) || (data > (double)FLT_MAX))\n    {\n        length = 8;\n        utils_copyValue(data_buffer, &data, 8);\n    }\n    else\n    {\n        float value;\n\n        length = 4;\n        value = (float)data;\n        utils_copyValue(data_buffer, &value, 4);\n    }\n\n    return length;\n}\n\nstatic size_t prv_encodeInt(int64_t data,\n                            uint8_t *data_buffer)\n{\n    size_t length = 0;\n\n    if (data >= INT8_MIN && data <= INT8_MAX)\n    {\n        length = 1;\n        data_buffer[0] = data;\n    }\n    else if (data >= INT16_MIN && data <= INT16_MAX)\n    {\n        int16_t value;\n\n        value = data;\n        length = 2;\n        data_buffer[0] = (value >> 8) & 0xFF;\n        data_buffer[1] = value & 0xFF;\n    }\n    else if (data >= INT32_MIN && data <= INT32_MAX)\n    {\n        int32_t value;\n\n        value = data;\n        length = 4;\n        utils_copyValue(data_buffer, &value, length);\n    }\n    else if (data >= INT64_MIN && data <= INT64_MAX)\n    {\n        length = 8;\n        utils_copyValue(data_buffer, &data, length);\n    }\n\n    return length;\n}\n\nstatic uint8_t prv_getHeaderType(lwm2m_data_type_t type)\n{\n    switch (type)\n    {\n    case LWM2M_TYPE_OBJECT:\n        return _PRV_TLV_TYPE_OBJECT;\n\n    case LWM2M_TYPE_OBJECT_INSTANCE:\n        return _PRV_TLV_TYPE_OBJECT_INSTANCE;\n\n    case LWM2M_TYPE_MULTIPLE_RESOURCE:\n        return _PRV_TLV_TYPE_MULTIPLE_RESOURCE;\n\n\n    case LWM2M_TYPE_STRING:\n    case LWM2M_TYPE_INTEGER:\n    case LWM2M_TYPE_FLOAT:\n    case LWM2M_TYPE_BOOLEAN:\n    case LWM2M_TYPE_OPAQUE:\n    case LWM2M_TYPE_OBJECT_LINK:\n        return _PRV_TLV_TYPE_RESOURCE;\n\n    case LWM2M_TYPE_UNDEFINED:\n    default:\n        return _PRV_TLV_TYPE_UNKNOWN;\n    }\n}\n\nstatic lwm2m_data_type_t prv_getDataType(uint8_t type)\n{\n    switch (type)\n    {\n    case _PRV_TLV_TYPE_OBJECT:\n        return LWM2M_TYPE_OBJECT;\n\n    case _PRV_TLV_TYPE_OBJECT_INSTANCE:\n        return LWM2M_TYPE_OBJECT_INSTANCE;\n\n    case _PRV_TLV_TYPE_MULTIPLE_RESOURCE:\n        return LWM2M_TYPE_MULTIPLE_RESOURCE;\n\n    case _PRV_TLV_TYPE_RESOURCE:\n    case _PRV_TLV_TYPE_RESOURCE_INSTANCE:\n        return LWM2M_TYPE_OPAQUE;\n\n    default:\n        return LWM2M_TYPE_UNDEFINED;\n    }\n}\n\nstatic int prv_getHeaderLength(uint16_t id,\n                               size_t dataLen)\n{\n    int length;\n\n    length = 2;\n\n    if (id > 0xFF)\n    {\n        length += 1;\n    }\n\n    if (dataLen > 0xFFFF)\n    {\n        length += 3;\n    }\n    else if (dataLen > 0xFF)\n    {\n        length += 2;\n    }\n    else if (dataLen > 7)\n    {\n        length += 1;\n    }\n\n    return length;\n}\n\nstatic int prv_createHeader(uint8_t *header,\n                            bool isInstance,\n                            lwm2m_data_type_t type,\n                            uint16_t id,\n                            size_t data_len)\n{\n    int header_len;\n    int offset;\n    uint8_t hdrType;\n\n    header_len = prv_getHeaderLength(id, data_len);\n    if (isInstance == true)\n    {\n        hdrType = _PRV_TLV_TYPE_RESOURCE_INSTANCE;\n    }\n    else\n    {\n        hdrType = prv_getHeaderType(type);\n    }\n\n    header[0] = 0;\n    header[0] |= hdrType & _PRV_TLV_TYPE_MASK;\n\n    if (id > 0xFF)\n    {\n        header[0] |= 0x20;\n        header[1] = (id >> 8) & 0XFF;\n        header[2] = id & 0XFF;\n        offset = 3;\n    }\n    else\n    {\n        header[1] = id;\n        offset = 2;\n    }\n    if (data_len <= 7)\n    {\n        header[0] += data_len;\n    }\n    else if (data_len <= 0xFF)\n    {\n        header[0] |= 0x08;\n        header[offset] = data_len;\n    }\n    else if (data_len <= 0xFFFF)\n    {\n        header[0] |= 0x10;\n        header[offset] = (data_len >> 8) & 0XFF;\n        header[offset + 1] = data_len & 0XFF;\n    }\n    else if (data_len <= 0xFFFFFF)\n    {\n        header[0] |= 0x18;\n        header[offset] = (data_len >> 16) & 0XFF;\n        header[offset + 1] = (data_len >> 8) & 0XFF;\n        header[offset + 2] = data_len & 0XFF;\n    }\n\n    return header_len;\n}\n\nint lwm2m_decode_TLV(const uint8_t *buffer,\n                     size_t buffer_len,\n                     lwm2m_data_type_t *oType,\n                     uint16_t *oID,\n                     size_t *oDataIndex,\n                     size_t *oDataLen)\n{\n\n    LOG_ARG(\"buffer_len: %d\", buffer_len);\n    ;\n    if (buffer_len < 2) return 0;\n\n    *oDataIndex = 2;\n\n    *oType = prv_getDataType(buffer[0] & _PRV_TLV_TYPE_MASK);\n\n    if ((buffer[0] & 0x20) == 0x20)\n    {\n        // id is 16 bits long\n        if (buffer_len < 3) return 0;\n        *oDataIndex += 1;\n        *oID = (buffer[1] << 8) + buffer[2];\n    }\n    else\n    {\n        // id is 8 bits long\n        *oID = buffer[1];\n    }\n\n    switch (buffer[0] & 0x18)\n    {\n    case 0x00:\n        // no length field\n        *oDataLen = buffer[0] & 0x07;\n        break;\n    case 0x08:\n        // length field is 8 bits long\n        if (buffer_len < *oDataIndex + 1) return 0;\n        *oDataLen = buffer[*oDataIndex];\n        *oDataIndex += 1;\n        break;\n    case 0x10:\n        // length field is 16 bits long\n        if (buffer_len < *oDataIndex + 2) return 0;\n        *oDataLen = (buffer[*oDataIndex] << 8) + buffer[*oDataIndex + 1];\n        *oDataIndex += 2;\n        break;\n    case 0x18:\n        // length field is 24 bits long\n        if (buffer_len < *oDataIndex + 3) return 0;\n        *oDataLen = (buffer[*oDataIndex] << 16) + (buffer[*oDataIndex + 1] << 8) + buffer[*oDataIndex + 2];\n        *oDataIndex += 3;\n        break;\n    default:\n        // can't happen\n        return 0;\n    }\n\n    if (*oDataIndex + *oDataLen > buffer_len) return 0;\n\n    return *oDataIndex + *oDataLen;\n}\n\n\nint tlv_parse(uint8_t *buffer,\n              size_t bufferLen,\n              lwm2m_data_t **dataP)\n{\n    lwm2m_data_type_t type;\n    uint16_t id;\n    size_t dataIndex;\n    size_t dataLen;\n    int index = 0;\n    int result;\n    int size = 0;\n\n    LOG_ARG(\"bufferLen: %d\", bufferLen);\n\n    *dataP = NULL;\n\n    while (0 != (result = lwm2m_decode_TLV((uint8_t *)buffer + index, bufferLen - index, &type, &id, &dataIndex, &dataLen)))\n    {\n        lwm2m_data_t *newTlvP;\n\n        newTlvP = lwm2m_data_new(size + 1);\n        if (size >= 1)\n        {\n            if (newTlvP == NULL)\n            {\n                lwm2m_data_free(size, *dataP);\n                return 0;\n            }\n            else\n            {\n                memcpy(newTlvP, *dataP, size * sizeof(lwm2m_data_t));\n                lwm2m_free(*dataP);\n            }\n        }\n        *dataP = newTlvP;\n\n        (*dataP)[size].type = type;\n        (*dataP)[size].id = id;\n        if (type == LWM2M_TYPE_OBJECT_INSTANCE || type == LWM2M_TYPE_MULTIPLE_RESOURCE)\n        {\n            (*dataP)[size].value.asChildren.count = tlv_parse(buffer + index + dataIndex,\n                                                    dataLen,\n                                                    &((*dataP)[size].value.asChildren.array));\n            if ((*dataP)[size].value.asChildren.count == 0)\n            {\n                lwm2m_data_free(size + 1, *dataP);\n                return 0;\n            }\n        }\n        else\n        {\n            lwm2m_data_encode_opaque(buffer + index + dataIndex, dataLen, (*dataP) + size);\n        }\n        size++;\n        index += result;\n    }\n\n    return size;\n}\n\n\nstatic int prv_getLength(int size,\n                         lwm2m_data_t *dataP)\n{\n    int length;\n    int i;\n\n    length = 0;\n\n    for (i = 0 ; i < size && length != -1 ; i++)\n    {\n        switch (dataP[i].type)\n        {\n        case LWM2M_TYPE_OBJECT_INSTANCE:\n        case LWM2M_TYPE_MULTIPLE_RESOURCE:\n        {\n            int subLength;\n\n            subLength = prv_getLength(dataP[i].value.asChildren.count, dataP[i].value.asChildren.array);\n            if (subLength == -1)\n            {\n                length = -1;\n            }\n            else\n            {\n                length += prv_getHeaderLength(dataP[i].id, subLength) + subLength;\n            }\n        }\n        break;\n\n        case LWM2M_TYPE_STRING:\n        case LWM2M_TYPE_OPAQUE:\n            length += prv_getHeaderLength(dataP[i].id, dataP[i].value.asBuffer.length) + dataP[i].value.asBuffer.length;\n            break;\n\n        case LWM2M_TYPE_INTEGER:\n        {\n            size_t data_len;\n            uint8_t unused_buffer[_PRV_64BIT_BUFFER_SIZE];\n\n            data_len = prv_encodeInt(dataP[i].value.asInteger, unused_buffer);\n            length += prv_getHeaderLength(dataP[i].id, data_len) + data_len;\n        }\n        break;\n\n        case LWM2M_TYPE_FLOAT:\n        {\n            size_t data_len;\n\n            if ((dataP[i].value.asFloat < 0.0 - (double)FLT_MAX)\n                    || (dataP[i].value.asFloat > (double)FLT_MAX))\n            {\n                data_len = 8;\n            }\n            else\n            {\n                data_len = 4;\n            }\n\n            length += prv_getHeaderLength(dataP[i].id, data_len) + data_len;\n        }\n        break;\n\n        case LWM2M_TYPE_BOOLEAN:\n            // Booleans are always encoded on one byte\n            length += prv_getHeaderLength(dataP[i].id, 1) + 1;\n            break;\n\n        case LWM2M_TYPE_OBJECT_LINK:\n            // Object Link are always encoded on four bytes\n            length += prv_getHeaderLength(dataP[i].id, 4) + 4;\n            break;\n\n        default:\n            length = -1;\n            break;\n        }\n    }\n\n    return length;\n}\n\n\nint tlv_serialize(bool isResourceInstance,\n                  int size,\n                  lwm2m_data_t *dataP,\n                  uint8_t **bufferP)\n{\n    int length;\n    int index;\n    int i;\n\n    LOG_ARG(\"isResourceInstance: %s, size: %d\", isResourceInstance ? \"true\" : \"false\", size);\n\n    *bufferP = NULL;\n    length = prv_getLength(size, dataP);\n    if (length <= 0) return length;\n\n    *bufferP = (uint8_t *)lwm2m_malloc(length);\n    if (*bufferP == NULL) return 0;\n\n    index = 0;\n    for (i = 0 ; i < size && length != 0 ; i++)\n    {\n        int headerLen;\n        bool isInstance;\n\n        isInstance = isResourceInstance;\n        switch (dataP[i].type)\n        {\n        case LWM2M_TYPE_MULTIPLE_RESOURCE:\n            isInstance = true;\n        // fall through\n        case LWM2M_TYPE_OBJECT_INSTANCE:\n        {\n            uint8_t *tmpBuffer;\n            int res;\n\n            res = tlv_serialize(isInstance, dataP[i].value.asChildren.count, dataP[i].value.asChildren.array, &tmpBuffer);\n            if (res < 0)\n            {\n                length = -1;\n            }\n            else\n            {\n                size_t tmpLength;\n\n                tmpLength = (size_t)res;\n                headerLen = prv_createHeader(*bufferP + index, false, dataP[i].type, dataP[i].id, tmpLength);\n                index += headerLen;\n                if (tmpLength > 0)\n                {\n                    memcpy(*bufferP + index, tmpBuffer, tmpLength);\n                    index += tmpLength;\n                    lwm2m_free(tmpBuffer);\n                }\n            }\n        }\n        break;\n\n        case LWM2M_TYPE_OBJECT_LINK:\n        {\n            int k;\n            uint8_t buf[4];\n            uint32_t v = dataP[i].value.asObjLink.objectId;\n            v <<= 16;\n            v |= dataP[i].value.asObjLink.objectInstanceId;\n            for (k = 3; k >= 0; --k)\n            {\n                buf[k] = (uint8_t)(v & 0xFF);\n                v >>= 8;\n            }\n            // keep encoding as buffer\n            headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, 4);\n            index += headerLen;\n            memcpy(*bufferP + index, buf, 4);\n            index += 4;\n        }\n        break;\n\n        case LWM2M_TYPE_STRING:\n        case LWM2M_TYPE_OPAQUE:\n            headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, dataP[i].value.asBuffer.length);\n            index += headerLen;\n            memcpy(*bufferP + index, dataP[i].value.asBuffer.buffer, dataP[i].value.asBuffer.length);\n            index += dataP[i].value.asBuffer.length;\n            break;\n\n        case LWM2M_TYPE_INTEGER:\n        {\n            size_t data_len;\n            uint8_t data_buffer[_PRV_64BIT_BUFFER_SIZE];\n\n            data_len = prv_encodeInt(dataP[i].value.asInteger, data_buffer);\n            headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, data_len);\n            index += headerLen;\n            memcpy(*bufferP + index, data_buffer, data_len);\n            index += data_len;\n        }\n        break;\n\n        case LWM2M_TYPE_FLOAT:\n        {\n            size_t data_len;\n            uint8_t data_buffer[_PRV_64BIT_BUFFER_SIZE];\n\n            data_len = prv_encodeFloat(dataP[i].value.asFloat, data_buffer);\n            headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, data_len);\n            index += headerLen;\n            memcpy(*bufferP + index, data_buffer, data_len);\n            index += data_len;\n        }\n        break;\n\n        case LWM2M_TYPE_BOOLEAN:\n            headerLen = prv_createHeader(*bufferP + index, isInstance, dataP[i].type, dataP[i].id, 1);\n            index += headerLen;\n            (*bufferP)[index] = dataP[i].value.asBoolean ? 1 : 0;\n            index += 1;\n            break;\n\n        default:\n            length = -1;\n            break;\n        }\n    }\n\n    if (length < 0)\n    {\n        lwm2m_free(*bufferP);\n        *bufferP = NULL;\n    }\n\n    LOG_ARG(\"returning %u\", length);\n\n    return length;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/transaction.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Simon Bernard - Please refer to git log\n *    Toby Jaffey - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n/*\nContains code snippets which are:\n\n * Copyright (c) 2013, Institute for Pervasive Computing, ETH Zurich\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the Institute nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n\n*/\n\n/************************************************************************\n *  Function for communications transactions.\n *\n *  Basic specification: rfc7252\n *\n *  Transaction implements processing of piggybacked and separate response communication\n *  dialogs specified in section 2.2 of the above specification.\n *  The caller registers a callback function, which is called, when either the result is\n *  received or a timeout occurs.\n *\n *  Supported dialogs:\n *  Requests (GET - DELETE):\n *  - CON with mid, without token => regular finished with corresponding ACK.MID\n *  - CON with mid, with token => regular finished with corresponding ACK.MID and response containing\n *                  the token. Supports both versions, with piggybacked ACK and separate ACK/response.\n *                  Though the ACK.MID may be lost in the separate version, a matching response may\n *                  finish the transaction even without the ACK.MID.\n *  - NON without token => no transaction, no result expected!\n *  - NON with token => regular finished with response containing the token.\n *  Responses (COAP_201_CREATED - ?):\n *  - CON with mid => regular finished with corresponding ACK.MID\n */\n\n#include \"internals.h\"\n//#include \"pdu.h\"\n#include \"commandline.h\"\n\n\n/*\n * Modulo mask (+1 and +0.5 for rounding) for a random number to get the tick number for the random\n * retransmission time between COAP_RESPONSE_TIMEOUT and COAP_RESPONSE_TIMEOUT*COAP_RESPONSE_RANDOM_FACTOR.\n */\n#define COAP_RESPONSE_TIMEOUT_TICKS         (CLOCK_SECOND * COAP_RESPONSE_TIMEOUT)\n#define COAP_RESPONSE_TIMEOUT_BACKOFF_MASK  ((CLOCK_SECOND * COAP_RESPONSE_TIMEOUT * (COAP_RESPONSE_RANDOM_FACTOR - 1)) + 1.5)\n\nstatic int prv_checkFinished(lwm2m_transaction_t *transacP,\n                             coap_packet_t *receivedMessage)\n{\n    int len;\n    const uint8_t *token;\n    coap_packet_t *transactionMessage = transacP->message;\n\n    if (COAP_DELETE < transactionMessage->code)\n    {\n        // response\n        return transacP->ack_received ? 1 : 0;\n    }\n    if (!IS_OPTION(transactionMessage, COAP_OPTION_TOKEN))\n    {\n        // request without token\n        return transacP->ack_received ? 1 : 0;\n    }\n\n    len = coap_get_header_token(receivedMessage, &token);\n    if (transactionMessage->token_len == len)\n    {\n        if (memcmp(transactionMessage->token, token, len) == 0) return 1;\n    }\n    LOG_ARG(\"transactionMessage->token_len is %d, len is %d\\n\", transactionMessage->token_len, len);\n    int i = 0;\n    for(i = 0; i < transactionMessage->token_len; i++ )\n        LOG_ARG(\"%d\\n\", transactionMessage->token[i]);\n    LOG(\"\\n\\n\");\n    for(i = 0; i < len; i++)\n        LOG_ARG(\"%d\\n\", token[i]);\n    LOG(\"prv_checkFinished not finish!!!\\n\");\n    return 0;\n}\n//transaction_new(server->sessionH, COAP_POST, NULL, NULL, contextP->nextMID++, 4, NULL)\nlwm2m_transaction_t *transaction_new(void *sessionH,\n                                     unsigned char method,\n                                     char *altPath,\n                                     lwm2m_uri_t *uriP,\n                                     uint16_t mID,\n                                     uint8_t token_len,\n                                     uint8_t *token)\n{\n    lwm2m_transaction_t *transacP;\n    int result;\n    if(altPath != NULL){\n        LOG_ARG(\"method: %d, altPath: \\\"%s\\\", mID: %d, token_len: %d\",\n            method, altPath, mID, token_len);\n    }\n    else\n    {\n        LOG_ARG(\"method: %d, altPath: NULL, mID: %d, token_len: %d\",\n            method, mID, token_len);  \n    }\n    LOG_URI(uriP);\n\n    // no transactions without peer\n    if (NULL == sessionH) return NULL;\n\n    transacP = (lwm2m_transaction_t *)lwm2m_malloc(sizeof(lwm2m_transaction_t));\n\n    if (NULL == transacP) return NULL;\n    memset(transacP, 0, sizeof(lwm2m_transaction_t));\n\n    transacP->message = lwm2m_malloc(sizeof(coap_packet_t));\n    if (NULL == transacP->message) goto error;\n\n    coap_init_message(transacP->message, COAP_TYPE_CON, method, mID);\n\n    transacP->peerH = sessionH;\n\n    transacP->mID = mID;\n\n    if (altPath != NULL)\n    {\n        // TODO: Support multi-segment alternative path\n        coap_set_header_uri_path_segment(transacP->message, altPath + 1);\n    }\n    if (NULL != uriP)\n    {\n        char stringID[LWM2M_STRING_ID_MAX_LEN];\n\n        result = utils_intToText(uriP->objectId, (uint8_t *)stringID, LWM2M_STRING_ID_MAX_LEN);\n        if (result == 0) goto error;\n        stringID[result] = 0;\n        coap_set_header_uri_path_segment(transacP->message, stringID);\n\n        if (LWM2M_URI_IS_SET_INSTANCE(uriP))\n        {\n            result = utils_intToText(uriP->instanceId, (uint8_t *)stringID, LWM2M_STRING_ID_MAX_LEN);\n            if (result == 0) goto error;\n            stringID[result] = 0;\n            coap_set_header_uri_path_segment(transacP->message, stringID);\n        }\n        else\n        {\n            if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n            {\n                coap_set_header_uri_path_segment(transacP->message, NULL);\n            }\n        }\n        if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n        {\n            result = utils_intToText(uriP->resourceId, (uint8_t *)stringID, LWM2M_STRING_ID_MAX_LEN);\n            if (result == 0) goto error;\n            stringID[result] = 0;\n            coap_set_header_uri_path_segment(transacP->message, stringID);\n        }\n    }\n    if (0 < token_len)\n    {\n        if (NULL != token)\n        {\n            coap_set_header_token(transacP->message, token, token_len);\n        }\n        else\n        {\n            // generate a token\n            uint8_t temp_token[COAP_TOKEN_LEN];\n            time_t tv_sec = lwm2m_gettime();\n\n            // initialize first 6 bytes, leave the last 2 random\n            temp_token[0] = mID;\n            temp_token[1] = mID >> 8;\n            temp_token[2] = tv_sec;\n            temp_token[3] = tv_sec >> 8;\n            temp_token[4] = tv_sec >> 16;\n            temp_token[5] = tv_sec >> 24;\n            // use just the provided amount of bytes\n            coap_set_header_token(transacP->message, temp_token, token_len);\n            int i;\n            for(i = 0; i < token_len; i++)\n                LOG_ARG(\"send token is %d\\n\", temp_token[i]);\n        }\n    }\n\n    LOG(\"Exiting on success\");\n    return transacP;\n\nerror:\n    LOG(\"Exiting on failure\");\n    lwm2m_free(transacP);\n    return NULL;\n}\n\nvoid transaction_free(lwm2m_transaction_t *transacP)\n{\n    LOG(\"Entering\");\n    if (transacP->message)\n    {\n        coap_free_header(transacP->message);\n        lwm2m_free(transacP->message);\n    }\n\n    if (transacP->buffer) lwm2m_free(transacP->buffer);\n    lwm2m_free(transacP);\n}\n\nvoid transaction_remove(lwm2m_context_t *contextP,\n                        lwm2m_transaction_t *transacP)\n{\n    LOG(\"Entering\");\n    contextP->transactionList = (lwm2m_transaction_t *) LWM2M_LIST_RM(contextP->transactionList, transacP->mID, NULL);\n    transaction_free(transacP);\n}\n\nbool transaction_handleResponse(lwm2m_context_t *contextP,\n                                void *fromSessionH,\n                                coap_packet_t *message,\n                                coap_packet_t *response)\n{\n    bool found = false;\n    bool reset = false;\n    lwm2m_transaction_t *transacP;\n\n    LOG_ARG(\"Entering,message->code: %d\", message->code);\n    transacP = contextP->transactionList;\n\n    while (NULL != transacP)\n    {\n        if (lwm2m_session_is_equal(fromSessionH, transacP->peerH, contextP->userData) == true)\n        {\n            if (!transacP->ack_received)\n            {\n                if ((COAP_TYPE_ACK == message->type) || (COAP_TYPE_RST == message->type))\n                {\n                    if (transacP->mID == message->mid)\n                    {\n                        found = true;\n                        transacP->ack_received = true;\n                        reset = COAP_TYPE_RST == message->type;\n                    }\n                }\n            }\n\n            if (reset || prv_checkFinished(transacP, message))\n            {\n                // HACK: If a message is sent from the monitor callback,\n                // it will arrive before the registration ACK.\n                // So we resend transaction that were denied for authentication reason.\n                if (!reset)\n                {\n                    if (COAP_TYPE_CON == message->type && NULL != response)\n                    {\n                        coap_init_message(response, COAP_TYPE_ACK, 0, message->mid);\n                        message_send(contextP, response, fromSessionH);\n                    }\n\n                    if ((COAP_401_UNAUTHORIZED == message->code) && (COAP_MAX_RETRANSMIT > transacP->retrans_counter))\n                    {\n                        transacP->ack_received = false;\n                        transacP->retrans_time += COAP_RESPONSE_TIMEOUT;\n                        LOG(\"timeout in transaction_handleResponse\\n\");\n                        return true;\n                    }\n                }\n                if (transacP->callback != NULL)\n                {\n                    transacP->callback(transacP, message);\n                }\n                transaction_remove(contextP, transacP);\n                return true;\n            }\n            // if we found our guy, exit\n            if (found)\n            {\n                time_t tv_sec = lwm2m_gettime();\n                if (tv_sec)\n                {\n                    transacP->retrans_time = tv_sec;\n                }\n                if (transacP->response_timeout)\n                {\n                    transacP->retrans_time += transacP->response_timeout;\n                }\n                else\n                {\n                    transacP->retrans_time += COAP_RESPONSE_TIMEOUT * transacP->retrans_counter;\n                }\n                LOG_ARG(\"only true25,fromSessionH is %p, transacP->peerH is %p\\n\", fromSessionH, transacP->peerH);\n                return true;\n            }\n        }\n        else\n        {\n            LOG_ARG(\"error25,fromSessionH is %p, transacP->peerH is %p\\n\", fromSessionH, transacP->peerH);\n        }\n        transacP = transacP->next;\n    }\n    LOG(\"error25,return false in transaction_handleResponse\\n\");\n    return false;\n}\n//transacPж󣬳bufferѾֵ\nint transaction_send(lwm2m_context_t *contextP,\n                     lwm2m_transaction_t *transacP)\n{\n    bool maxRetriesReached = false;\n    coap_packet_t *message = transacP->message;\n    int ret;\n\n    LOG(\"Entering\");\n\n    LOG_ARG(\"transaction_send: ver %u, type %u, tkl %u, code %u.%.2u, mid %u, Content type: %d\",\n            message->version, message->type, message->token_len, message->code >> 5, message->code & 0x1F, message->mid, message->content_type);\n    LOG_ARG(\"time:%llu\", atiny_gettime_ms());\n    if (transacP->buffer == NULL)\n    {\n        transacP->buffer_len = coap_serialize_get_size(message);\n        if (transacP->buffer_len == 0)\n        {\n            transaction_remove(contextP, transacP);\n            LOG(\"remove\");\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n\n        transacP->buffer = (uint8_t *)lwm2m_malloc(transacP->buffer_len);\n        if (transacP->buffer == NULL)\n        {\n            transaction_remove(contextP, transacP);\n            LOG(\"remove\");\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n\n        transacP->buffer_len = coap_serialize_message(message, transacP->buffer);\n        if (transacP->buffer_len == 0)\n        {\n            lwm2m_free(transacP->buffer);\n            transacP->buffer = NULL;\n            transaction_remove(contextP, transacP);\n            LOG(\"remove\");\n            return COAP_500_INTERNAL_SERVER_ERROR;\n        }\n    }\n\n    if (!transacP->ack_received)\n    {\n        long unsigned timeout = 0;\n\n        if (0 == transacP->retrans_counter)\n        {\n            time_t tv_sec = lwm2m_gettime();\n            if (tv_sec)\n            {\n                transacP->retrans_time = tv_sec + COAP_RESPONSE_TIMEOUT;\n                transacP->retrans_counter = 1;\n                timeout = 0;\n            }\n            else\n            {\n                maxRetriesReached = true;\n            }\n        }\n        else\n        {\n            if(transacP->retrans_counter <= 4 )\n                timeout = COAP_RESPONSE_TIMEOUT << (transacP->retrans_counter - 1);\n            else\n                timeout = COAP_RESPONSE_TIMEOUT << (4 - 1);\n        }\n\n        if (COAP_MAX_RETRANSMIT + 1 >= transacP->retrans_counter)\n        {\n            ret = lwm2m_buffer_send(transacP->peerH, transacP->buffer, transacP->buffer_len, contextP->userData);\n            output_buffer(stderr, (uint8_t *)(transacP->buffer), transacP->buffer_len, 0);\n            transacP->retrans_time += timeout;\n            LOG_ARG(\"send result is %d, retrans_counter:%d\", ret, transacP->retrans_counter);\n            transacP->retrans_counter += 1;\n\n            UNUSEX(ret);\n        }\n        else\n        {\n            maxRetriesReached = true;\n        }\n    }\n\n    if (transacP->ack_received || maxRetriesReached)\n    {\n        if (transacP->callback)\n        {\n            transacP->callback(transacP, NULL);\n        }\n        transaction_remove(contextP, transacP);\n        LOG_ARG(\"remove, ACK:%d, timeout: %d\", transacP->ack_received, maxRetriesReached);\n        return -1;\n    }\n\n    return 0;\n}\n\nvoid transaction_step(lwm2m_context_t *contextP,\n                      time_t currentTime,\n                      time_t *timeoutP)\n{\n    lwm2m_transaction_t *transacP;\n\n    LOG(\"Entering\");\n    transacP = contextP->transactionList;\n    while (transacP != NULL)\n    {\n        // transaction_send() may remove transaction from the linked list\n        lwm2m_transaction_t *nextP = transacP->next;\n        int removed = 0;\n\n        if (transacP->retrans_time <= currentTime)\n        {\n            removed = transaction_send(contextP, transacP);\n        }\n\n        if (0 == removed)\n        {\n            time_t interval;\n\n            if (transacP->retrans_time > currentTime)\n            {\n                interval = transacP->retrans_time - currentTime;\n            }\n            else\n            {\n                interval = 1;\n            }\n\n            if (*timeoutP > interval)\n            {\n                *timeoutP = interval;\n            }\n        }\n        else\n        {\n            *timeoutP = 1;\n        }\n\n        transacP = nextP;\n    }\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/uri.c",
    "content": "/*******************************************************************************\n *\n * Copyright (c) 2013, 2014 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Fabien Fleutot - Please refer to git log\n *    Toby Jaffey - Please refer to git log\n *    Bosch Software Innovations GmbH - Please refer to git log\n *    Pascal Rieux - Please refer to git log\n *\n *******************************************************************************/\n\n/*\n Copyright (c) 2013, 2014 Intel Corporation\n\n Redistribution and use in source and binary forms, with or without modification,\n are permitted provided that the following conditions are met:\n\n     * Redistributions of source code must retain the above copyright notice,\n       this list of conditions and the following disclaimer.\n     * Redistributions in binary form must reproduce the above copyright notice,\n       this list of conditions and the following disclaimer in the documentation\n       and/or other materials provided with the distribution.\n     * Neither the name of Intel Corporation nor the names of its contributors\n       may be used to endorse or promote products derived from this software\n       without specific prior written permission.\n\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF\n THE POSSIBILITY OF SUCH DAMAGE.\n\n David Navarro <david.navarro@intel.com>\n\n*/\n\n#include \"internals.h\"\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n\nstatic int prv_parseNumber(uint8_t *uriString,\n                           size_t uriLength,\n                           size_t *headP)\n{\n    int result = 0;\n\n    if (uriString[*headP] == '/')\n    {\n        // empty Object Instance ID with resource ID is not allowed\n        return -1;\n    }\n    while (*headP < uriLength && uriString[*headP] != '/')\n    {\n        if ('0' <= uriString[*headP] && uriString[*headP] <= '9')\n        {\n            result += uriString[*headP] - '0';\n            result *= 10;\n        }\n        else\n        {\n            return -1;\n        }\n        *headP += 1;\n    }\n\n    result /= 10;\n    return result;\n}\n\n\nint uri_getNumber(uint8_t *uriString,\n                  size_t uriLength)\n{\n    size_t index = 0;\n\n    return prv_parseNumber(uriString, uriLength, &index);\n}\n\n\nlwm2m_uri_t *uri_decode(char *altPath,\n                        multi_option_t *uriPath)\n{\n    lwm2m_uri_t *uriP;\n    int readNum;\n    if(altPath != NULL)\n    {\n        LOG_ARG(\"altPath: \\\"%s\\\"\", altPath);\n    }\n    else\n    {\n         LOG(\"altPath: NULL\");\n    }\n\n    uriP = (lwm2m_uri_t *)lwm2m_malloc(sizeof(lwm2m_uri_t));\n    if (NULL == uriP) return NULL;\n\n    memset(uriP, 0, sizeof(lwm2m_uri_t));\n\n    // Read object ID\n    if (NULL != uriPath\n            && URI_REGISTRATION_SEGMENT_LEN == uriPath->len\n            && 0 == strncmp(URI_REGISTRATION_SEGMENT, (char *)uriPath->data, uriPath->len))\n    {\n        uriP->flag |= LWM2M_URI_FLAG_REGISTRATION;\n        uriPath = uriPath->next;\n        if (uriPath == NULL) return uriP;\n    }\n    else if (NULL != uriPath\n             && URI_BOOTSTRAP_SEGMENT_LEN == uriPath->len\n             && 0 == strncmp(URI_BOOTSTRAP_SEGMENT, (char *)uriPath->data, uriPath->len))\n    {\n        uriP->flag |= LWM2M_URI_FLAG_BOOTSTRAP;\n        uriPath = uriPath->next;\n        if (uriPath != NULL) goto error;\n        return uriP;\n    }\n\n    if ((uriP->flag & LWM2M_URI_MASK_TYPE) != LWM2M_URI_FLAG_REGISTRATION)\n    {\n        // Read altPath if any\n        if (altPath != NULL)\n        {\n            int i;\n            if (NULL == uriPath)\n            {\n                lwm2m_free(uriP);\n                return NULL;\n            }\n            for (i = 0 ; i < uriPath->len ; i++)\n            {\n                if (uriPath->data[i] != altPath[i + 1])\n                {\n                    lwm2m_free(uriP);\n                    return NULL;\n                }\n            }\n            uriPath = uriPath->next;\n        }\n        if (NULL == uriPath || uriPath->len == 0)\n        {\n            uriP->flag |= LWM2M_URI_FLAG_DELETE_ALL;\n            return uriP;\n        }\n    }\n\n    readNum = uri_getNumber(uriPath->data, uriPath->len);\n    if (readNum < 0 || readNum > LWM2M_MAX_ID) goto error;\n    uriP->objectId = (uint16_t)readNum;\n    uriP->flag |= LWM2M_URI_FLAG_OBJECT_ID;\n    uriPath = uriPath->next;\n\n    if ((uriP->flag & LWM2M_URI_MASK_TYPE) == LWM2M_URI_FLAG_REGISTRATION)\n    {\n        if (uriPath != NULL) goto error;\n        return uriP;\n    }\n    uriP->flag |= LWM2M_URI_FLAG_DM;\n\n    if (uriPath == NULL) return uriP;\n\n    // Read object instance\n    if (uriPath->len != 0)\n    {\n        readNum = uri_getNumber(uriPath->data, uriPath->len);\n        if (readNum < 0 || readNum >= LWM2M_MAX_ID) goto error;\n        uriP->instanceId = (uint16_t)readNum;\n        uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID;\n    }\n    uriPath = uriPath->next;\n\n    if (uriPath == NULL) return uriP;\n\n    // Read resource ID\n    if (uriPath->len != 0)\n    {\n        // resource ID without an instance ID is not allowed\n        if ((uriP->flag & LWM2M_URI_FLAG_INSTANCE_ID) == 0) goto error;\n\n        readNum = uri_getNumber(uriPath->data, uriPath->len);\n        if (readNum < 0 || readNum > LWM2M_MAX_ID) goto error;\n        uriP->resourceId = (uint16_t)readNum;\n        uriP->flag |= LWM2M_URI_FLAG_RESOURCE_ID;\n    }\n\n    // must be the last segment\n    if (NULL == uriPath->next)\n    {\n        LOG_URI(uriP);\n        return uriP;\n    }\n\nerror:\n    LOG(\"Exiting on error\");\n    lwm2m_free(uriP);\n    return NULL;\n}\n\nint lwm2m_stringToUri(const char *buffer,\n                      size_t buffer_len,\n                      lwm2m_uri_t *uriP)\n{\n    size_t head;\n    int readNum;\n\n    LOG_ARG(\"buffer_len: %u, buffer: \\\"%.*s\\\"\", buffer_len, buffer_len, buffer);\n\n    if (buffer == NULL || buffer_len == 0 || uriP == NULL) return 0;\n\n    memset(uriP, 0, sizeof(lwm2m_uri_t));\n\n    // Skip any white space\n    head = 0;\n    while (head < buffer_len && isspace(buffer[head] & 0xFF))\n    {\n        head++;\n    }\n    if (head == buffer_len) return 0;\n\n    // Check the URI start with a '/'\n    if (buffer[head] != '/') return 0;\n    head++;\n    if (head == buffer_len) return 0;\n\n    // Read object ID\n    readNum = prv_parseNumber((uint8_t *)buffer, buffer_len, &head);\n    if (readNum < 0 || readNum > LWM2M_MAX_ID) return 0;\n    uriP->objectId = (uint16_t)readNum;\n    uriP->flag |= LWM2M_URI_FLAG_OBJECT_ID;\n\n    if (buffer[head] == '/') head += 1;\n    if (head >= buffer_len)\n    {\n        LOG_ARG(\"Parsed characters: %u\", head);\n        LOG_URI(uriP);\n        return head;\n    }\n\n    readNum = prv_parseNumber((uint8_t *)buffer, buffer_len, &head);\n    if (readNum < 0 || readNum >= LWM2M_MAX_ID) return 0;\n    uriP->instanceId = (uint16_t)readNum;\n    uriP->flag |= LWM2M_URI_FLAG_INSTANCE_ID;\n\n    if (buffer[head] == '/') head += 1;\n    if (head >= buffer_len)\n    {\n        LOG_ARG(\"Parsed characters: %u\", head);\n        LOG_URI(uriP);\n        return head;\n    }\n\n    readNum = prv_parseNumber((uint8_t *)buffer, buffer_len, &head);\n    if (readNum < 0 || readNum >= LWM2M_MAX_ID) return 0;\n    uriP->resourceId = (uint16_t)readNum;\n    uriP->flag |= LWM2M_URI_FLAG_RESOURCE_ID;\n\n    if (head != buffer_len) return 0;\n\n    LOG_ARG(\"Parsed characters: %u\", head);\n    LOG_URI(uriP);\n\n    return head;\n}\n\nint uri_toString(lwm2m_uri_t *uriP,\n                 uint8_t *buffer,\n                 size_t bufferLen,\n                 uri_depth_t *depthP)\n{\n    size_t head;\n    int res;\n\n    LOG_ARG(\"bufferLen: %u\", bufferLen);\n    LOG_URI(uriP);\n\n    buffer[0] = '/';\n\n    if (uriP == NULL)\n    {\n        if (depthP) *depthP = URI_DEPTH_OBJECT;\n        return 1;\n    }\n\n    head = 1;\n\n    res = utils_intToText(uriP->objectId, buffer + head, bufferLen - head);\n    if (res <= 0) return -1;\n    head += res;\n    if (head >= bufferLen - 1) return -1;\n    if (depthP) *depthP = URI_DEPTH_OBJECT_INSTANCE;\n\n    if (LWM2M_URI_IS_SET_INSTANCE(uriP))\n    {\n        buffer[head] = '/';\n        head++;\n        res = utils_intToText(uriP->instanceId, buffer + head, bufferLen - head);\n        if (res <= 0) return -1;\n        head += res;\n        if (head >= bufferLen - 1) return -1;\n        if (depthP) *depthP = URI_DEPTH_RESOURCE;\n        if (LWM2M_URI_IS_SET_RESOURCE(uriP))\n        {\n            buffer[head] = '/';\n            head++;\n            res = utils_intToText(uriP->resourceId, buffer + head, bufferLen - head);\n            if (res <= 0) return -1;\n            head += res;\n            if (head >= bufferLen - 1) return -1;\n            if (depthP) *depthP = URI_DEPTH_RESOURCE_INSTANCE;\n        }\n    }\n\n    buffer[head] = '/';\n    head++;\n\n    LOG_ARG(\"length: %u, buffer: \\\"%.*s\\\"\", head, head, buffer);\n\n    return head;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/core/wakaama.cmake",
    "content": "# Provides WAKAAMA_SOURCES_DIR and WAKAAMA_SOURCES and WAKAAMA_DEFINITIONS variables.\n# Add LWM2M_WITH_LOGS to compile definitions to enable logging.\n# Set LWM2M_LITTLE_ENDIAN to FALSE or TRUE according to your destination platform or leave\n# it unset to determine endianess automatically.\n\nset(WAKAAMA_SOURCES_DIR ${CMAKE_CURRENT_LIST_DIR})\n\nset(EXT_SOURCES \n    ${WAKAAMA_SOURCES_DIR}/er-coap-13/er-coap-13.c\n\t${WAKAAMA_SOURCES_DIR}/er-coap-13/er-coap-13.h)\n\nset(CORE_HEADERS\n    ${WAKAAMA_SOURCES_DIR}/liblwm2m.h)\n\nset(WAKAAMA_SOURCES\n    ${WAKAAMA_SOURCES_DIR}/liblwm2m.c\n    ${WAKAAMA_SOURCES_DIR}/uri.c\n    ${WAKAAMA_SOURCES_DIR}/utils.c\n    ${WAKAAMA_SOURCES_DIR}/objects.c\n    ${WAKAAMA_SOURCES_DIR}/tlv.c\n    ${WAKAAMA_SOURCES_DIR}/data.c\n    ${WAKAAMA_SOURCES_DIR}/list.c\n    ${WAKAAMA_SOURCES_DIR}/packet.c\n    ${WAKAAMA_SOURCES_DIR}/transaction.c\n    ${WAKAAMA_SOURCES_DIR}/registration.c\n    ${WAKAAMA_SOURCES_DIR}/bootstrap.c\n    ${WAKAAMA_SOURCES_DIR}/management.c\n    ${WAKAAMA_SOURCES_DIR}/observe.c\n    ${WAKAAMA_SOURCES_DIR}/json.c\n    ${WAKAAMA_SOURCES_DIR}/discover.c\n    ${WAKAAMA_SOURCES_DIR}/block1.c\n    ${WAKAAMA_SOURCES_DIR}/internals.h\n\t${CORE_HEADERS}\n    ${EXT_SOURCES})\n\n# This will not work for multi project cmake generators like the Visual Studio Generator\nif(CMAKE_BUILD_TYPE MATCHES Debug)\n   set(WAKAAMA_DEFINITIONS ${WAKAAMA_DEFINITIONS} -DLWM2M_WITH_LOGS)\nendif()\n\n# Automatically determine endianess. This can be overwritten by setting LWM2M_LITTLE_ENDIAN\n# accordingly in a cross compile toolchain file.\nif(NOT DEFINED LWM2M_LITTLE_ENDIAN)\n    include(TestBigEndian)\n    TEST_BIG_ENDIAN(LWM2M_BIG_ENDIAN)\n    if (LWM2M_BIG_ENDIAN)\n         set(LWM2M_LITTLE_ENDIAN FALSE)\n    else()\n         set(LWM2M_LITTLE_ENDIAN TRUE)\n    endif()\nendif()\nif (LWM2M_LITTLE_ENDIAN)\n    set(WAKAAMA_DEFINITIONS ${WAKAAMA_DEFINITIONS} -DLWM2M_LITTLE_ENDIAN)\nendif()\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/examples/shared/commandline.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013, 2014, 2015 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *    Fabien Fleutot - Please refer to git log\n *\n *******************************************************************************/\n\n#include <string.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <inttypes.h>\n#include \"liblwm2m.h\"\n#include \"internals.h\"\n#include \"commandline.h\"\n\n#define HELP_COMMAND \"help\"\n#define HELP_DESC    \"Type '\"HELP_COMMAND\" [COMMAND]' for more details on a command.\"\n#define UNKNOWN_CMD_MSG \"Unknown command. Type '\"HELP_COMMAND\"' for help.\"\n\nstatic command_desc_t *prv_find_command(command_desc_t *commandArray,\n                                        char *buffer,\n                                        size_t length)\n{\n    int i;\n\n    if (length == 0) return NULL;\n\n    i = 0;\n    while (commandArray[i].name != NULL\n            && (strlen(commandArray[i].name) != length || strncmp(buffer, commandArray[i].name, length)))\n    {\n        i++;\n    }\n\n    if (commandArray[i].name == NULL)\n    {\n        return NULL;\n    }\n    else\n    {\n        return &commandArray[i];\n    }\n}\n\nstatic void prv_displayHelp(command_desc_t *commandArray,\n                            char *buffer)\n{\n    command_desc_t *cmdP;\n    int length;\n\n    // find end of first argument\n    length = 0;\n    while (buffer[length] != 0 && !isspace(buffer[length] & 0xff))\n        length++;\n\n    cmdP = prv_find_command(commandArray, buffer, length);\n\n    if (cmdP == NULL)\n    {\n        int i;\n\n        fprintf(stdout, HELP_COMMAND\"\\t\"HELP_DESC\"\\r\\n\");\n\n        for (i = 0 ; commandArray[i].name != NULL ; i++)\n        {\n            fprintf(stdout, \"%s\\t%s\\r\\n\", commandArray[i].name, commandArray[i].shortDesc);\n        }\n    }\n    else\n    {\n        fprintf(stdout, \"%s\\r\\n\", cmdP->longDesc ? cmdP->longDesc : cmdP->shortDesc);\n    }\n}\n\n\nvoid handle_command(command_desc_t *commandArray,\n                    char *buffer)\n{\n    command_desc_t *cmdP;\n    int length;\n\n    // find end of command name\n    length = 0;\n    while (buffer[length] != 0 && !isspace(buffer[length] & 0xFF))\n        length++;\n\n    cmdP = prv_find_command(commandArray, buffer, length);\n    if (cmdP != NULL)\n    {\n        while (buffer[length] != 0 && isspace(buffer[length] & 0xFF))\n            length++;\n        cmdP->callback(buffer + length, cmdP->userData);\n    }\n    else\n    {\n        if (!strncmp(buffer, HELP_COMMAND, length))\n        {\n            while (buffer[length] != 0 && isspace(buffer[length] & 0xFF))\n                length++;\n            prv_displayHelp(commandArray, buffer + length);\n        }\n        else\n        {\n            fprintf(stdout, UNKNOWN_CMD_MSG\"\\r\\n\");\n        }\n    }\n}\n\nstatic char *prv_end_of_space(char *buffer)\n{\n    while (isspace(buffer[0] & 0xff))\n    {\n        buffer++;\n    }\n    return buffer;\n}\n\nchar *get_end_of_arg(char *buffer)\n{\n    while (buffer[0] != 0 && !isspace(buffer[0] & 0xFF))\n    {\n        buffer++;\n    }\n    return buffer;\n}\n\nchar *get_next_arg(char *buffer, char **end)\n{\n    // skip arg\n    buffer = get_end_of_arg(buffer);\n    // skip space\n    buffer = prv_end_of_space(buffer);\n    if (NULL != end)\n    {\n        *end = get_end_of_arg(buffer);\n    }\n\n    return buffer;\n}\n\nint check_end_of_args(char *buffer)\n{\n    buffer = prv_end_of_space(buffer);\n\n    return (0 == buffer[0]);\n}\n\n/**********************************************************\n * Display Functions\n */\n\nstatic void print_indent(FILE *stream,\n                         int num)\n{\n    int i;\n\n    for ( i = 0 ; i < num ; i++)\n        fprintf(stream, \"    \");\n}\n#ifdef ATING_DEBUG\nvoid output_buffer(FILE *stream,\n                   uint8_t *buffer,\n                   int length,\n                   int indent)\n{\n    int i;\n\n    if (length == 0) fprintf(stream, \"\\n\");\n\n    if (buffer == NULL) return;\n\n    i = 0;\n    while (i < length)\n    {\n        uint8_t array[16];\n        int j;\n\n        print_indent(stream, indent);\n        memcpy(array, buffer + i, 16);\n        for (j = 0 ; j < 16 && i + j < length; j++)\n        {\n            fprintf(stream, \"%02X \", array[j]);\n            if (j % 4 == 3) fprintf(stream, \" \");\n        }\n        if (length > 16)\n        {\n            while (j < 16)\n            {\n                fprintf(stream, \"   \");\n                if (j % 4 == 3) fprintf(stream, \" \");\n                j++;\n            }\n        }\n        fprintf(stream, \" \");\n        for (j = 0 ; j < 16 && i + j < length; j++)\n        {\n            if (isprint(array[j]))\n                fprintf(stream, \"%c\", array[j]);\n            else\n                fprintf(stream, \".\");\n        }\n        fprintf(stream, \"\\n\");\n        i += 16;\n    }\n}\n#else\nvoid output_buffer(FILE *stream,\n                   uint8_t *buffer,\n                   int length,\n                   int indent)\n{\n}\n#endif\nvoid output_tlv(FILE *stream,\n                uint8_t *buffer,\n                size_t buffer_len,\n                int indent)\n{\n    lwm2m_data_type_t type;\n    uint16_t id;\n    size_t dataIndex;\n    size_t dataLen;\n    int length = 0;\n    int result;\n\n    while (0 != (result = lwm2m_decode_TLV((uint8_t *)buffer + length, buffer_len - length, &type, &id, &dataIndex, &dataLen)))\n    {\n        print_indent(stream, indent);\n        fprintf(stream, \"{\\r\\n\");\n        print_indent(stream, indent + 1);\n        fprintf(stream, \"ID: %d\", id);\n\n        fprintf(stream, \" type: \");\n        switch (type)\n        {\n        case LWM2M_TYPE_OBJECT_INSTANCE:\n            fprintf(stream, \"Object Instance\");\n            break;\n        case LWM2M_TYPE_MULTIPLE_RESOURCE:\n            fprintf(stream, \"Multiple Instances\");\n            break;\n        case LWM2M_TYPE_OPAQUE:\n            fprintf(stream, \"Resource Value\");\n            break;\n        default:\n            printf(\"unknown (%d)\", (int)type);\n            break;\n        }\n        fprintf(stream, \"\\n\");\n\n        print_indent(stream, indent + 1);\n        fprintf(stream, \"{\\n\");\n        if (type == LWM2M_TYPE_OBJECT_INSTANCE || type == LWM2M_TYPE_MULTIPLE_RESOURCE)\n        {\n            output_tlv(stream, buffer + length + dataIndex, dataLen, indent + 1);\n        }\n        else\n        {\n            int64_t intValue;\n            double floatValue;\n            uint8_t tmp;\n\n            print_indent(stream, indent + 2);\n            fprintf(stream, \"data (%d bytes):\\r\\n\", dataLen);\n            output_buffer(stream, (uint8_t *)buffer + length + dataIndex, dataLen, indent + 2);\n\n            tmp = buffer[length + dataIndex + dataLen];\n            buffer[length + dataIndex + dataLen] = 0;\n            if (0 < sscanf((const char *)buffer + length + dataIndex, \"%\"PRId64, &intValue))\n            {\n                print_indent(stream, indent + 2);\n                fprintf(stream, \"data as Integer: %\" PRId64 \"\\r\\n\", intValue);\n            }\n            if (0 < sscanf((const char *)buffer + length + dataIndex, \"%lg\", &floatValue))\n            {\n                print_indent(stream, indent + 2);\n                fprintf(stream, \"data as Float: %.16g\\r\\n\", floatValue);\n            }\n            buffer[length + dataIndex + dataLen] = tmp;\n        }\n        print_indent(stream, indent + 1);\n        fprintf(stream, \"}\\r\\n\");\n        length += result;\n        print_indent(stream, indent);\n        fprintf(stream, \"}\\r\\n\");\n    }\n}\n\nvoid output_data(FILE *stream,\n                 lwm2m_media_type_t format,\n                 uint8_t *data,\n                 int dataLength,\n                 int indent)\n{\n    int i;\n\n    print_indent(stream, indent);\n    fprintf(stream, \"%d bytes received of type \", dataLength);\n\n    switch (format)\n    {\n    case LWM2M_CONTENT_TEXT:\n        fprintf(stream, \"text/plain:\\r\\n\");\n        output_buffer(stream, data, dataLength, indent);\n        break;\n\n    case LWM2M_CONTENT_OPAQUE:\n        fprintf(stream, \"application/octet-stream:\\r\\n\");\n        output_buffer(stream, data, dataLength, indent);\n        break;\n\n    case LWM2M_CONTENT_TLV:\n        fprintf(stream, \"application/vnd.oma.lwm2m+tlv:\\r\\n\");\n        output_tlv(stream, data, dataLength, indent);\n        break;\n\n    case LWM2M_CONTENT_JSON:\n        fprintf(stream, \"application/vnd.oma.lwm2m+json:\\r\\n\");\n        print_indent(stream, indent);\n        for (i = 0 ; i < dataLength ; i++)\n        {\n            fprintf(stream, \"%c\", data[i]);\n        }\n        fprintf(stream, \"\\n\");\n        break;\n\n    case LWM2M_CONTENT_LINK:\n        fprintf(stream, \"application/link-format:\\r\\n\");\n        print_indent(stream, indent);\n        for (i = 0 ; i < dataLength ; i++)\n        {\n            fprintf(stream, \"%c\", data[i]);\n        }\n        fprintf(stream, \"\\n\");\n        break;\n\n    default:\n        fprintf(stream, \"Unknown (%d):\\r\\n\", format);\n        output_buffer(stream, data, dataLength, indent);\n        break;\n    }\n}\n\nvoid dump_tlv(FILE *stream,\n              int size,\n              lwm2m_data_t *dataP,\n              int indent)\n{\n    int i;\n\n    for(i = 0 ; i < size ; i++)\n    {\n        print_indent(stream, indent);\n        fprintf(stream, \"{\\r\\n\");\n        print_indent(stream, indent + 1);\n        fprintf(stream, \"id: %d\\r\\n\", dataP[i].id);\n\n        print_indent(stream, indent + 1);\n        fprintf(stream, \"type: \");\n        switch (dataP[i].type)\n        {\n        case LWM2M_TYPE_OBJECT:\n            fprintf(stream, \"LWM2M_TYPE_OBJECT\\r\\n\");\n            dump_tlv(stream, dataP[i].value.asChildren.count, dataP[i].value.asChildren.array, indent + 1);\n            break;\n        case LWM2M_TYPE_OBJECT_INSTANCE:\n            fprintf(stream, \"LWM2M_TYPE_OBJECT_INSTANCE\\r\\n\");\n            dump_tlv(stream, dataP[i].value.asChildren.count, dataP[i].value.asChildren.array, indent + 1);\n            break;\n        case LWM2M_TYPE_MULTIPLE_RESOURCE:\n            fprintf(stream, \"LWM2M_TYPE_MULTIPLE_RESOURCE\\r\\n\");\n            dump_tlv(stream, dataP[i].value.asChildren.count, dataP[i].value.asChildren.array, indent + 1);\n            break;\n        case LWM2M_TYPE_UNDEFINED:\n            fprintf(stream, \"LWM2M_TYPE_UNDEFINED\\r\\n\");\n            break;\n        case LWM2M_TYPE_STRING:\n            fprintf(stream, \"LWM2M_TYPE_STRING\\r\\n\");\n            print_indent(stream, indent + 1);\n            fprintf(stream, \"\\\"%.*s\\\"\\r\\n\", (int)dataP[i].value.asBuffer.length, dataP[i].value.asBuffer.buffer);\n            break;\n        case LWM2M_TYPE_OPAQUE:\n            fprintf(stream, \"LWM2M_TYPE_OPAQUE\\r\\n\");\n            output_buffer(stream, dataP[i].value.asBuffer.buffer, dataP[i].value.asBuffer.length, indent + 1);\n            break;\n        case LWM2M_TYPE_INTEGER:\n            fprintf(stream, \"LWM2M_TYPE_INTEGER: \");\n            print_indent(stream, indent + 1);\n            fprintf(stream, \"%\" PRId64, dataP[i].value.asInteger);\n            fprintf(stream, \"\\r\\n\");\n            break;\n        case LWM2M_TYPE_FLOAT:\n            fprintf(stream, \"LWM2M_TYPE_FLOAT: \");\n            print_indent(stream, indent + 1);\n            fprintf(stream, \"%\" PRId64, dataP[i].value.asInteger);\n            fprintf(stream, \"\\r\\n\");\n            break;\n        case LWM2M_TYPE_BOOLEAN:\n            fprintf(stream, \"LWM2M_TYPE_BOOLEAN: \");\n            fprintf(stream, \"%s\", dataP[i].value.asBoolean ? \"true\" : \"false\");\n            fprintf(stream, \"\\r\\n\");\n            break;\n        case LWM2M_TYPE_OBJECT_LINK:\n            fprintf(stream, \"LWM2M_TYPE_OBJECT_LINK\\r\\n\");\n            break;\n        default:\n            fprintf(stream, \"unknown (%d)\\r\\n\", (int)dataP[i].type);\n            break;\n        }\n        print_indent(stream, indent);\n        fprintf(stream, \"}\\r\\n\");\n    }\n}\n\n#define CODE_TO_STRING(X)   case X : return #X\n\nstatic const char *prv_status_to_string(int status)\n{\n    switch(status)\n    {\n        CODE_TO_STRING(COAP_NO_ERROR);\n        CODE_TO_STRING(COAP_IGNORE);\n        CODE_TO_STRING(COAP_201_CREATED);\n        CODE_TO_STRING(COAP_202_DELETED);\n        CODE_TO_STRING(COAP_204_CHANGED);\n        CODE_TO_STRING(COAP_205_CONTENT);\n        CODE_TO_STRING(COAP_400_BAD_REQUEST);\n        CODE_TO_STRING(COAP_401_UNAUTHORIZED);\n        CODE_TO_STRING(COAP_404_NOT_FOUND);\n        CODE_TO_STRING(COAP_405_METHOD_NOT_ALLOWED);\n        CODE_TO_STRING(COAP_406_NOT_ACCEPTABLE);\n        CODE_TO_STRING(COAP_500_INTERNAL_SERVER_ERROR);\n        CODE_TO_STRING(COAP_501_NOT_IMPLEMENTED);\n        CODE_TO_STRING(COAP_503_SERVICE_UNAVAILABLE);\n    default:\n        return \"\";\n    }\n}\n\nvoid print_status(FILE *stream,\n                  uint8_t status)\n{\n    fprintf(stream, \"%d.%02d (%s)\", (status & 0xE0) >> 5, status & 0x1F, prv_status_to_string(status));\n}\n\n/**********************************************************\n* Base64 decoding function\n*\n* WARNING: Bugged for input strings with length < 4\n*\n*/\n\n#define PRV_B64_PADDING '='\n\nstatic uint8_t prv_b64Revert(uint8_t value)\n{\n    if (value >= 'A' && value <= 'Z')\n    {\n        return (value - 'A');\n    }\n    if (value >= 'a' && value <= 'z')\n    {\n        return (26 + value - 'a');\n    }\n    if (value >= '0' && value <= '9')\n    {\n        return (52 + value - '0');\n    }\n    switch (value)\n    {\n    case '+':\n        return 62;\n    case '/':\n        return 63;\n    default:\n        return 0;\n    }\n}\n\nstatic void prv_decodeBlock(uint8_t input[4],\n                            uint8_t output[3])\n{\n    uint8_t tmp[4];\n    int i;\n\n    memset(output, 0, 3);\n\n    for (i = 0; i < 4; i++)\n    {\n        tmp[i] = prv_b64Revert(input[i]);\n    }\n\n    output[0] = (tmp[0] << 2) | (tmp[1] >> 4);\n    output[1] = (tmp[1] << 4) | (tmp[2] >> 2);\n    output[2] = (tmp[2] << 6) | tmp[3];\n}\n\nsize_t base64_decode(uint8_t *dataP,\n                     size_t dataLen,\n                     uint8_t **bufferP)\n{\n    size_t data_index;\n    size_t result_index;\n    size_t result_len;\n\n    if (dataLen % 4) return 0;\n\n    result_len = (dataLen >> 2) * 3;\n    *bufferP = (uint8_t *)lwm2m_malloc(result_len);\n    if (NULL == *bufferP) return 0;\n    memset(*bufferP, 0, result_len);\n\n    // remove padding\n    while (dataP[dataLen - 1] == PRV_B64_PADDING)\n    {\n        dataLen--;\n    }\n\n    data_index = 0;\n    result_index = 0;\n    while (data_index < dataLen)\n    {\n        prv_decodeBlock(dataP + data_index, *bufferP + result_index);\n        data_index += 4;\n        result_index += 3;\n    }\n    switch (data_index - dataLen)\n    {\n    case 0:\n        break;\n    case 2:\n    {\n        uint8_t tmp[2];\n\n        tmp[0] = prv_b64Revert(dataP[dataLen - 2]);\n        tmp[1] = prv_b64Revert(dataP[dataLen - 1]);\n\n        *bufferP[result_index - 3] = (tmp[0] << 2) | (tmp[1] >> 4);\n        *bufferP[result_index - 2] = (tmp[1] << 4);\n        result_len -= 2;\n    }\n    break;\n    case 3:\n    {\n        uint8_t tmp[3];\n\n        tmp[0] = prv_b64Revert(dataP[dataLen - 3]);\n        tmp[1] = prv_b64Revert(dataP[dataLen - 2]);\n        tmp[2] = prv_b64Revert(dataP[dataLen - 1]);\n\n        *bufferP[result_index - 3] = (tmp[0] << 2) | (tmp[1] >> 4);\n        *bufferP[result_index - 2] = (tmp[1] << 4) | (tmp[2] >> 2);\n        *bufferP[result_index - 1] = (tmp[2] << 6);\n        result_len -= 1;\n    }\n    break;\n    default:\n        // error\n        lwm2m_free(*bufferP);\n        *bufferP = NULL;\n        result_len = 0;\n        break;\n    }\n\n    return result_len;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/lwm2m/examples/shared/commandline.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*******************************************************************************\n *\n * Copyright (c) 2013 Intel Corporation and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * The Eclipse Distribution License is available at\n *    http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    David Navarro, Intel Corporation - initial API and implementation\n *\n *******************************************************************************/\n\n#include <stdio.h>\n\n#define COMMAND_END_LIST {NULL, NULL, NULL, NULL, NULL}\n\ntypedef void (*command_handler_t) (char * args, void * user_data);\n\ntypedef struct\n{\n    char *            name;\n    char *            shortDesc;\n    char *            longDesc;\n    command_handler_t callback;\n    void *            userData;\n} command_desc_t;\n\n\nvoid handle_command(command_desc_t * commandArray, char * buffer);\nchar* get_end_of_arg(char* buffer);\nchar * get_next_arg(char * buffer, char **end);\nint check_end_of_args(char* buffer);\n\nvoid output_buffer(FILE * stream, uint8_t * buffer, int length, int indent);\nvoid output_tlv(FILE * stream, uint8_t * buffer, size_t buffer_len, int indent);\nvoid dump_tlv(FILE * stream, int size, lwm2m_data_t * dataP, int indent);\nvoid output_data(FILE * stream, lwm2m_media_type_t format, uint8_t * buffer, int length, int indent);\nvoid print_status(FILE * stream, uint8_t status);\n\nsize_t base64_decode(uint8_t * dataP, size_t dataLen, uint8_t ** bufferP);\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/.cproject",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><?fileVersion 4.0.0?><cproject storage_type_id=\"org.eclipse.cdt.core.XmlProjectDescriptionStorage\">\n\t<storageModule moduleId=\"org.eclipse.cdt.core.settings\">\n\t\t<cconfiguration id=\"cdt.managedbuild.config.gnu.so.debug.1049786922\">\n\t\t\t<storageModule buildSystemId=\"org.eclipse.cdt.managedbuilder.core.configurationDataProvider\" id=\"cdt.managedbuild.config.gnu.so.debug.1049786922\" moduleId=\"org.eclipse.cdt.core.settings\" name=\"Debug\">\n\t\t\t\t<externalSettings>\n\t\t\t\t\t<externalSetting>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH\" kind=\"includePath\" name=\"/embedded-C\"/>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH\" kind=\"libraryPath\" name=\"/embedded-C/Debug\"/>\n\t\t\t\t\t\t<entry flags=\"RESOLVED\" kind=\"libraryFile\" name=\"embedded-C\" srcPrefixMapping=\"\" srcRootPath=\"\"/>\n\t\t\t\t\t</externalSetting>\n\t\t\t\t</externalSettings>\n\t\t\t\t<extensions>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.ELF\" point=\"org.eclipse.cdt.core.BinaryParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GASErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GCCErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GmakeErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.CWDLocator\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GLDErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t</extensions>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"cdtBuildSystem\" version=\"4.0.0\">\n\t\t\t\t<configuration artifactExtension=\"so\" artifactName=\"${ProjName}\" buildArtefactType=\"org.eclipse.cdt.build.core.buildArtefactType.sharedLib\" buildProperties=\"org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.sharedLib,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug\" cleanCommand=\"rm -rf\" description=\"\" id=\"cdt.managedbuild.config.gnu.so.debug.1049786922\" name=\"Debug\" parent=\"cdt.managedbuild.config.gnu.so.debug\">\n\t\t\t\t\t<folderInfo id=\"cdt.managedbuild.config.gnu.so.debug.1049786922.\" name=\"/\" resourcePath=\"\">\n\t\t\t\t\t\t<toolChain id=\"cdt.managedbuild.toolchain.gnu.so.debug.1188656409\" name=\"Linux GCC\" superClass=\"cdt.managedbuild.toolchain.gnu.so.debug\">\n\t\t\t\t\t\t\t<targetPlatform id=\"cdt.managedbuild.target.gnu.platform.so.debug.84156419\" name=\"Debug Platform\" superClass=\"cdt.managedbuild.target.gnu.platform.so.debug\"/>\n\t\t\t\t\t\t\t<builder buildPath=\"${workspace_loc:/embedded-C}/Debug\" id=\"cdt.managedbuild.target.gnu.builder.so.debug.1027987368\" keepEnvironmentInBuildfile=\"false\" managedBuildOn=\"true\" name=\"Gnu Make Builder\" superClass=\"cdt.managedbuild.target.gnu.builder.so.debug\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.archiver.base.1945555299\" name=\"GCC Archiver\" superClass=\"cdt.managedbuild.tool.gnu.archiver.base\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.compiler.so.debug.531983260\" name=\"GCC C++ Compiler\" superClass=\"cdt.managedbuild.tool.gnu.cpp.compiler.so.debug\">\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.so.debug.option.optimization.level.2125064804\" name=\"Optimization Level\" superClass=\"gnu.cpp.compiler.so.debug.option.optimization.level\" value=\"gnu.cpp.compiler.optimization.level.none\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.so.debug.option.debugging.level.43422664\" name=\"Debug Level\" superClass=\"gnu.cpp.compiler.so.debug.option.debugging.level\" value=\"gnu.cpp.compiler.debugging.level.max\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.compiler.so.debug.908163257\" name=\"GCC C Compiler\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.so.debug\">\n\t\t\t\t\t\t\t\t<option defaultValue=\"gnu.c.optimization.level.none\" id=\"gnu.c.compiler.so.debug.option.optimization.level.1025282191\" name=\"Optimization Level\" superClass=\"gnu.c.compiler.so.debug.option.optimization.level\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.so.debug.option.debugging.level.1611217070\" name=\"Debug Level\" superClass=\"gnu.c.compiler.so.debug.option.debugging.level\" value=\"gnu.c.debugging.level.max\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.include.paths.1830522647\" name=\"Include paths (-I)\" superClass=\"gnu.c.compiler.option.include.paths\" valueType=\"includePath\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/embedded-C/MQTTPacket/src}&quot;\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.c.compiler.input.103641925\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.linker.so.debug.1517956238\" name=\"GCC C Linker\" superClass=\"cdt.managedbuild.tool.gnu.c.linker.so.debug\">\n\t\t\t\t\t\t\t\t<option defaultValue=\"true\" id=\"gnu.c.link.so.debug.option.shared.1823245824\" name=\"Shared (-shared)\" superClass=\"gnu.c.link.so.debug.option.shared\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.c.linker.input.936512212\" superClass=\"cdt.managedbuild.tool.gnu.c.linker.input\">\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinputdependency\" paths=\"$(USER_OBJS)\"/>\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinput\" paths=\"$(LIBS)\"/>\n\t\t\t\t\t\t\t\t</inputType>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.linker.so.debug.1821422645\" name=\"GCC C++ Linker\" superClass=\"cdt.managedbuild.tool.gnu.cpp.linker.so.debug\">\n\t\t\t\t\t\t\t\t<option defaultValue=\"true\" id=\"gnu.cpp.link.so.debug.option.shared.2029194272\" name=\"Shared (-shared)\" superClass=\"gnu.cpp.link.so.debug.option.shared\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.assembler.so.debug.65794919\" name=\"GCC Assembler\" superClass=\"cdt.managedbuild.tool.gnu.assembler.so.debug\">\n\t\t\t\t\t\t\t\t<option id=\"gnu.both.asm.option.include.paths.624151837\" name=\"Include paths (-I)\" superClass=\"gnu.both.asm.option.include.paths\" valueType=\"includePath\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.assembler.input.544886244\" superClass=\"cdt.managedbuild.tool.gnu.assembler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t</toolChain>\n\t\t\t\t\t</folderInfo>\n\t\t\t\t\t<folderInfo id=\"cdt.managedbuild.config.gnu.so.debug.1049786922.2012134380\" name=\"/\" resourcePath=\"MQTTPacket/src\">\n\t\t\t\t\t\t<toolChain id=\"cdt.managedbuild.toolchain.gnu.so.debug.373936532\" name=\"Linux GCC\" superClass=\"cdt.managedbuild.toolchain.gnu.so.debug\" unusedChildren=\"\">\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.archiver.base.826338972\" name=\"GCC Archiver\" superClass=\"cdt.managedbuild.tool.gnu.archiver.base.1945555299\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.compiler.so.debug.162520987\" name=\"GCC C++ Compiler\" superClass=\"cdt.managedbuild.tool.gnu.cpp.compiler.so.debug.531983260\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.compiler.so.debug.411531358\" name=\"GCC C Compiler\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.so.debug.908163257\">\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.c.compiler.input.1008566315\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.linker.so.debug.1559782853\" name=\"GCC C Linker\" superClass=\"cdt.managedbuild.tool.gnu.c.linker.so.debug.1517956238\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.linker.so.debug.550864828\" name=\"GCC C++ Linker\" superClass=\"cdt.managedbuild.tool.gnu.cpp.linker.so.debug.1821422645\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.assembler.so.debug.580263878\" name=\"GCC Assembler\" superClass=\"cdt.managedbuild.tool.gnu.assembler.so.debug.65794919\">\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.assembler.input.1150650244\" superClass=\"cdt.managedbuild.tool.gnu.assembler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t</toolChain>\n\t\t\t\t\t</folderInfo>\n\t\t\t\t\t<sourceEntries>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"MQTTClient/src\"/>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"MQTTPacket/samples\"/>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH\" kind=\"sourcePath\" name=\"MQTTPacket/src\"/>\n\t\t\t\t\t</sourceEntries>\n\t\t\t\t</configuration>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"org.eclipse.cdt.core.externalSettings\"/>\n\t\t</cconfiguration>\n\t\t<cconfiguration id=\"cdt.managedbuild.config.gnu.so.release.374902706\">\n\t\t\t<storageModule buildSystemId=\"org.eclipse.cdt.managedbuilder.core.configurationDataProvider\" id=\"cdt.managedbuild.config.gnu.so.release.374902706\" moduleId=\"org.eclipse.cdt.core.settings\" name=\"Release\">\n\t\t\t\t<externalSettings>\n\t\t\t\t\t<externalSetting>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH\" kind=\"includePath\" name=\"/embedded-C\"/>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH\" kind=\"libraryPath\" name=\"/embedded-C/Release\"/>\n\t\t\t\t\t\t<entry flags=\"RESOLVED\" kind=\"libraryFile\" name=\"embedded-C\" srcPrefixMapping=\"\" srcRootPath=\"\"/>\n\t\t\t\t\t</externalSetting>\n\t\t\t\t</externalSettings>\n\t\t\t\t<extensions>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.ELF\" point=\"org.eclipse.cdt.core.BinaryParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GASErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GCCErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GmakeErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.CWDLocator\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GLDErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t</extensions>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"cdtBuildSystem\" version=\"4.0.0\">\n\t\t\t\t<configuration artifactExtension=\"so\" artifactName=\"${ProjName}\" buildArtefactType=\"org.eclipse.cdt.build.core.buildArtefactType.sharedLib\" buildProperties=\"org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.sharedLib,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release\" cleanCommand=\"rm -rf\" description=\"\" id=\"cdt.managedbuild.config.gnu.so.release.374902706\" name=\"Release\" parent=\"cdt.managedbuild.config.gnu.so.release\">\n\t\t\t\t\t<folderInfo id=\"cdt.managedbuild.config.gnu.so.release.374902706.\" name=\"/\" resourcePath=\"\">\n\t\t\t\t\t\t<toolChain id=\"cdt.managedbuild.toolchain.gnu.so.release.212092660\" name=\"Linux GCC\" superClass=\"cdt.managedbuild.toolchain.gnu.so.release\">\n\t\t\t\t\t\t\t<targetPlatform id=\"cdt.managedbuild.target.gnu.platform.so.release.115420820\" name=\"Debug Platform\" superClass=\"cdt.managedbuild.target.gnu.platform.so.release\"/>\n\t\t\t\t\t\t\t<builder buildPath=\"${workspace_loc:/embedded-C}/Release\" id=\"cdt.managedbuild.target.gnu.builder.so.release.1607415402\" keepEnvironmentInBuildfile=\"false\" managedBuildOn=\"true\" name=\"Gnu Make Builder\" superClass=\"cdt.managedbuild.target.gnu.builder.so.release\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.archiver.base.1822133490\" name=\"GCC Archiver\" superClass=\"cdt.managedbuild.tool.gnu.archiver.base\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.compiler.so.release.482703733\" name=\"GCC C++ Compiler\" superClass=\"cdt.managedbuild.tool.gnu.cpp.compiler.so.release\">\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.so.release.option.optimization.level.1208586309\" name=\"Optimization Level\" superClass=\"gnu.cpp.compiler.so.release.option.optimization.level\" value=\"gnu.cpp.compiler.optimization.level.most\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.so.release.option.debugging.level.1769747565\" name=\"Debug Level\" superClass=\"gnu.cpp.compiler.so.release.option.debugging.level\" value=\"gnu.cpp.compiler.debugging.level.none\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.compiler.so.release.1838975818\" name=\"GCC C Compiler\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.so.release\">\n\t\t\t\t\t\t\t\t<option defaultValue=\"gnu.c.optimization.level.most\" id=\"gnu.c.compiler.so.release.option.optimization.level.589960637\" name=\"Optimization Level\" superClass=\"gnu.c.compiler.so.release.option.optimization.level\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.so.release.option.debugging.level.940644097\" name=\"Debug Level\" superClass=\"gnu.c.compiler.so.release.option.debugging.level\" value=\"gnu.c.debugging.level.none\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.include.paths.1739833982\" name=\"Include paths (-I)\" superClass=\"gnu.c.compiler.option.include.paths\" valueType=\"includePath\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/embedded-C/src}&quot;\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.c.compiler.input.1074589063\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.linker.so.release.1807144456\" name=\"GCC C Linker\" superClass=\"cdt.managedbuild.tool.gnu.c.linker.so.release\">\n\t\t\t\t\t\t\t\t<option defaultValue=\"true\" id=\"gnu.c.link.so.release.option.shared.11876845\" name=\"Shared (-shared)\" superClass=\"gnu.c.link.so.release.option.shared\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.c.linker.input.289563790\" superClass=\"cdt.managedbuild.tool.gnu.c.linker.input\">\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinputdependency\" paths=\"$(USER_OBJS)\"/>\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinput\" paths=\"$(LIBS)\"/>\n\t\t\t\t\t\t\t\t</inputType>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.linker.so.release.395214940\" name=\"GCC C++ Linker\" superClass=\"cdt.managedbuild.tool.gnu.cpp.linker.so.release\">\n\t\t\t\t\t\t\t\t<option defaultValue=\"true\" id=\"gnu.cpp.link.so.release.option.shared.594459767\" name=\"Shared (-shared)\" superClass=\"gnu.cpp.link.so.release.option.shared\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.assembler.so.release.2061779220\" name=\"GCC Assembler\" superClass=\"cdt.managedbuild.tool.gnu.assembler.so.release\">\n\t\t\t\t\t\t\t\t<option id=\"gnu.both.asm.option.include.paths.1657504482\" name=\"Include paths (-I)\" superClass=\"gnu.both.asm.option.include.paths\" valueType=\"includePath\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/embedded-C/src}&quot;\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.assembler.input.1949893916\" superClass=\"cdt.managedbuild.tool.gnu.assembler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t</toolChain>\n\t\t\t\t\t</folderInfo>\n\t\t\t\t\t<folderInfo id=\"cdt.managedbuild.config.gnu.so.release.374902706.734460083\" name=\"/\" resourcePath=\"MQTTPacket/src\">\n\t\t\t\t\t\t<toolChain id=\"cdt.managedbuild.toolchain.gnu.so.release.1128610593\" name=\"Linux GCC\" superClass=\"cdt.managedbuild.toolchain.gnu.so.release\" unusedChildren=\"\">\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.archiver.base.1066241773\" name=\"GCC Archiver\" superClass=\"cdt.managedbuild.tool.gnu.archiver.base.1822133490\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.compiler.so.release.771591369\" name=\"GCC C++ Compiler\" superClass=\"cdt.managedbuild.tool.gnu.cpp.compiler.so.release.482703733\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.compiler.so.release.1125066379\" name=\"GCC C Compiler\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.so.release.1838975818\">\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.include.paths.271775004\" superClass=\"gnu.c.compiler.option.include.paths\" valueType=\"includePath\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/embedded-C/MQTTPacket/src}&quot;\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.c.compiler.input.995178283\" superClass=\"cdt.managedbuild.tool.gnu.c.compiler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.c.linker.so.release.1173497209\" name=\"GCC C Linker\" superClass=\"cdt.managedbuild.tool.gnu.c.linker.so.release.1807144456\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.cpp.linker.so.release.2074144887\" name=\"GCC C++ Linker\" superClass=\"cdt.managedbuild.tool.gnu.cpp.linker.so.release.395214940\"/>\n\t\t\t\t\t\t\t<tool id=\"cdt.managedbuild.tool.gnu.assembler.so.release.239315112\" name=\"GCC Assembler\" superClass=\"cdt.managedbuild.tool.gnu.assembler.so.release.2061779220\">\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.assembler.input.2006922113\" superClass=\"cdt.managedbuild.tool.gnu.assembler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t</toolChain>\n\t\t\t\t\t</folderInfo>\n\t\t\t\t\t<sourceEntries>\n\t\t\t\t\t\t<entry excluding=\"src|MQTTClient|MQTTPacket/samples|samples\" flags=\"VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"\"/>\n\t\t\t\t\t\t<entry excluding=\"src\" flags=\"VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"MQTTClient\"/>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"MQTTClient/src\"/>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"MQTTPacket/samples\"/>\n\t\t\t\t\t</sourceEntries>\n\t\t\t\t</configuration>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"org.eclipse.cdt.core.externalSettings\"/>\n\t\t</cconfiguration>\n\t</storageModule>\n\t<storageModule moduleId=\"cdtBuildSystem\" version=\"4.0.0\">\n\t\t<project id=\"embedded-C.cdt.managedbuild.target.gnu.so.1829285851\" name=\"Shared Library\" projectType=\"cdt.managedbuild.target.gnu.so\"/>\n\t</storageModule>\n\t<storageModule moduleId=\"scannerConfiguration\">\n\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"\"/>\n\t\t<scannerConfigBuildInfo instanceId=\"cdt.managedbuild.config.gnu.so.release.374902706;cdt.managedbuild.config.gnu.so.release.374902706.;cdt.managedbuild.tool.gnu.c.compiler.so.release.1838975818;cdt.managedbuild.tool.gnu.c.compiler.input.1074589063\">\n\t\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"\"/>\n\t\t</scannerConfigBuildInfo>\n\t\t<scannerConfigBuildInfo instanceId=\"cdt.managedbuild.config.gnu.so.debug.1049786922;cdt.managedbuild.config.gnu.so.debug.1049786922.;cdt.managedbuild.tool.gnu.c.compiler.so.debug.908163257;cdt.managedbuild.tool.gnu.c.compiler.input.103641925\">\n\t\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"\"/>\n\t\t</scannerConfigBuildInfo>\n\t</storageModule>\n\t<storageModule moduleId=\"org.eclipse.cdt.core.LanguageSettingsProviders\"/>\n\t<storageModule moduleId=\"refreshScope\" versionNumber=\"2\">\n\t\t<configuration configurationName=\"Debug\">\n\t\t\t<resource resourceType=\"PROJECT\" workspacePath=\"/embedded-C\"/>\n\t\t</configuration>\n\t\t<configuration configurationName=\"Release\">\n\t\t\t<resource resourceType=\"PROJECT\" workspacePath=\"/embedded-C\"/>\n\t\t</configuration>\n\t</storageModule>\n\t<storageModule moduleId=\"org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings\"/>\n</cproject>"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/.gitignore",
    "content": "/dep/\n/build/\n/build.paho/\n*.swp\n*.pyc\n/doc/MQTTClient/\n/doc/MQTTPacket/\n/doc/MQTTClient-C/\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>embedded-C</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>\n\t\t\t<triggers>clean,full,incremental,</triggers>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>\n\t\t\t<triggers>full,incremental,</triggers>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>org.eclipse.cdt.core.cnature</nature>\n\t\t<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>\n\t\t<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/.settings/org.eclipse.cdt.core.prefs",
    "content": "eclipse.preferences.version=1\norg.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16\norg.eclipse.cdt.core.formatter.alignment_for_assignment=16\norg.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80\norg.eclipse.cdt.core.formatter.alignment_for_binary_expression=16\norg.eclipse.cdt.core.formatter.alignment_for_compact_if=16\norg.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34\norg.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18\norg.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=0\norg.eclipse.cdt.core.formatter.alignment_for_declarator_list=16\norg.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48\norg.eclipse.cdt.core.formatter.alignment_for_expression_list=0\norg.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16\norg.eclipse.cdt.core.formatter.alignment_for_member_access=0\norg.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=16\norg.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16\norg.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16\norg.eclipse.cdt.core.formatter.brace_position_for_array_initializer=next_line\norg.eclipse.cdt.core.formatter.brace_position_for_block=next_line\norg.eclipse.cdt.core.formatter.brace_position_for_block_in_case=next_line\norg.eclipse.cdt.core.formatter.brace_position_for_method_declaration=next_line\norg.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=next_line\norg.eclipse.cdt.core.formatter.brace_position_for_switch=next_line\norg.eclipse.cdt.core.formatter.brace_position_for_type_declaration=next_line\norg.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1\norg.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true\norg.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true\norg.eclipse.cdt.core.formatter.compact_else_if=true\norg.eclipse.cdt.core.formatter.continuation_indentation=2\norg.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2\norg.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false\norg.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false\norg.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0\norg.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true\norg.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false\norg.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true\norg.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false\norg.eclipse.cdt.core.formatter.indent_empty_lines=false\norg.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true\norg.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true\norg.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true\norg.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false\norg.eclipse.cdt.core.formatter.indentation.size=4\norg.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert\norg.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert\norg.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert\norg.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert\norg.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert\norg.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert\norg.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=insert\norg.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert\norg.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert\norg.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert\norg.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert\norg.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert\norg.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert\norg.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert\norg.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert\norg.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert\norg.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert\norg.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert\norg.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert\norg.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert\norg.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert\norg.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert\norg.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert\norg.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert\norg.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert\norg.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert\norg.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert\norg.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert\norg.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert\norg.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert\norg.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert\norg.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert\norg.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert\norg.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert\norg.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert\norg.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert\norg.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert\norg.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert\norg.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert\norg.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert\norg.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert\norg.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert\norg.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert\norg.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert\norg.eclipse.cdt.core.formatter.join_wrapped_lines=true\norg.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false\norg.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false\norg.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false\norg.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false\norg.eclipse.cdt.core.formatter.lineSplit=80\norg.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1\norg.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true\norg.eclipse.cdt.core.formatter.tabulation.char=tab\norg.eclipse.cdt.core.formatter.tabulation.size=4\norg.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/.settings/org.eclipse.cdt.ui.prefs",
    "content": "eclipse.preferences.version=1\nformatter_profile=org.eclipse.cdt.ui.default.allman_profile\nformatter_settings_version=1\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/.travis.yml",
    "content": "sudo: true\nlanguage: c\n\ncompiler:\n  - gcc\n\nos:\n  - linux\n\nsudo: required\n\nbefore_install:\n  - ./travis-install.sh\n\nscript:\n  - if [[ \"$COVERITY_SCAN_BRANCH\" != 1 ]]; then ./travis-build.sh; fi\n\naddons:\n  apt:\n    sources:\n      - george-edison55-precise-backports # cmake 3.2.3 / doxygen 1.8.3\n      - sourceline: 'ppa:mosquitto-dev/mosquitto-ppa'\n    packages:\n      - cmake\n      - cmake-data\n      - mosquitto\n      - doxygen\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/CMakeLists.txt",
    "content": "#*******************************************************************************\n#  Copyright (c) 2017 IBM Corp.\n#\n#  All rights reserved. This program and the accompanying materials\n#  are made available under the terms of the Eclipse Public License v1.0\n#  and Eclipse Distribution License v1.0 which accompany this distribution.\n#\n#  The Eclipse Public License is available at\n#     http://www.eclipse.org/legal/epl-v10.html\n#  and the Eclipse Distribution License is available at\n#    http://www.eclipse.org/org/documents/edl-v10.php.\n#\n#  Contributors:\n#     Ian Craggs - initial version\n#*******************************************************************************/\n\ncmake_minimum_required(VERSION 2.8)\nproject (embedded-mqtt)\nset(CMAKE_BUILD_TYPE Debug)\n\nmessage(STATUS \"CMake version: \" ${CMAKE_VERSION})\nmessage(STATUS \"CMake system name: \" ${CMAKE_SYSTEM_NAME})\n\nset(CMAKE_SCRIPTS \"${CMAKE_SOURCE_DIR}/cmake\")\nset(CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake/modules\")\n\n## build settings\nset(PAHO_VERSION_MAJOR 1)\nset(PAHO_VERSION_MINOR 0)\nset(PAHO_VERSION_PATCH 0)\nset(CLIENT_VERSION ${PAHO_VERSION_MAJOR}.${PAHO_VERSION_MINOR}.${PAHO_VERSION_PATCH})\n\nstring(TIMESTAMP BUILD_TIMESTAMP UTC)\nmessage(STATUS \"Timestamp is ${BUILD_TIMESTAMP}\")\n\nset(CPACK_PACKAGE_VERSION_MAJOR ${PAHO_VERSION_MAJOR})\nset(CPACK_PACKAGE_VERSION_MINOR ${PAHO_VERSION_MINOR})\nset(CPACK_PACKAGE_VERSION_PATCH ${PAHO_VERSION_PATCH})\ninclude(CPack)\n\ninclude_directories(MQTTPacket/src)\n\nenable_testing()\nADD_SUBDIRECTORY(MQTTPacket)\nADD_SUBDIRECTORY(MQTTClient)\nADD_SUBDIRECTORY(MQTTClient-C)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/CONTRIBUTING.md",
    "content": "# Contributing to Paho\n\nThanks for your interest in this project!\n\nYou can contribute bugfixes and new features by sending pull requests through GitHub.\n\n## Legal\n\nIn order for your contribution to be accepted, it must comply with the Eclipse Foundation IP policy.\n\nPlease read the [Eclipse Foundation policy on accepting contributions via Git](http://wiki.eclipse.org/Development_Resources/Contributing_via_Git).\n\n1. Sign the [Eclipse CLA](http://www.eclipse.org/legal/CLA.php)\n  1. Register for an Eclipse Foundation User ID. You can register [here](https://dev.eclipse.org/site_login/createaccount.php).\n  2. Log into the [Projects Portal](https://projects.eclipse.org/), and click on the '[Eclipse CLA](https://projects.eclipse.org/user/sign/cla)' link.\n2. Go to your [account settings](https://dev.eclipse.org/site_login/myaccount.php#open_tab_accountsettings) and add your GitHub username to your account.\n3. Make sure that you _sign-off_ your Git commits in the following format:\n  ``` Signed-off-by: John Smith <johnsmith@nowhere.com> ``` This is usually at the bottom of the commit message. You can automate this by adding the '-s' flag when you make the commits. e.g.   ```git commit -s -m \"Adding a cool feature\"```\n4. Ensure that the email address that you make your commits with is the same one you used to sign up to the Eclipse Foundation website with.\n\n## Contributing a change\n\n1. [Fork the repository on GitHub](https://github.com/eclipse/paho.mqtt.embedded-c/fork)\n2. Clone the forked repository onto your computer: ``` git clone https://github.com/<your username>/paho.mqtt.embedded-c.git ```\n3. Create a new branch from the latest ```develop``` branch with ```git checkout -b YOUR_BRANCH_NAME origin/develop```\n4. Make your changes\n5. If developing a new feature, make sure to include JUnit tests.\n6. Ensure that all new and existing tests pass.\n7. Commit the changes into the branch: ``` git commit -s ``` Make sure that your commit message is meaningful and describes your changes correctly.\n8. If you have a lot of commits for the change, squash them into a single / few commits.\n9. Push the changes in your branch to your forked repository.\n10. Finally, go to [https://github.com/eclipse/paho.mqtt.embedded-c](https://github.com/eclipse/paho.mqtt.embedded-c) and create a pull request from your \"YOUR_BRANCH_NAME\" branch to the ```develop``` one to request review and merge of the commits in your pushed branch.\n\n\nWhat happens next depends on the content of the patch. If it is 100% authored\nby the contributor and is less than 1000 lines (and meets the needs of the\nproject), then it can be pulled into the main repository. If not, more steps\nare required. These are detailed in the\n[legal process poster](http://www.eclipse.org/legal/EclipseLegalProcessPoster.pdf).\n\n\n\n## Developer resources:\n\n\nInformation regarding source code management, builds, coding standards, and more.\n\n- [https://projects.eclipse.org/projects/iot.paho/developer](https://projects.eclipse.org/projects/iot.paho/developer)\n\nContact:\n--------\n\nContact the project developers via the project's development\n[mailing list](https://dev.eclipse.org/mailman/listinfo/paho-dev).\n\nSearch for bugs:\n----------------\n\nThis project uses GitHub Issues here: [github.com/eclipse/paho.mqtt.embedded-c/issues](https://github.com/eclipse/paho.mqtt.embedded-c/issues) to track ongoing development and issues.\n\nCreate a new bug:\n-----------------\n\nBe sure to search for existing bugs before you create another one. Remember that contributions are always welcome!\n\n- [Create new Paho bug](https://github.com/eclipse/paho.mqtt.embedded-c/issues)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/CMakeLists.txt",
    "content": "#*******************************************************************************\n#  Copyright (c) 2017 IBM Corp.\n#\n#  All rights reserved. This program and the accompanying materials\n#  are made available under the terms of the Eclipse Public License v1.0\n#  and Eclipse Distribution License v1.0 which accompany this distribution.\n#\n#  The Eclipse Public License is available at\n#     http://www.eclipse.org/legal/epl-v10.html\n#  and the Eclipse Distribution License is available at\n#    http://www.eclipse.org/org/documents/edl-v10.php.\n#\n#  Contributors:\n#     Ian Craggs - initial version\n#*******************************************************************************/\n\nproject(\"paho-mqttclient\" C)\n\nADD_SUBDIRECTORY(src)\nADD_SUBDIRECTORY(samples)\nADD_SUBDIRECTORY(test)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/samples/CMakeLists.txt",
    "content": "#*******************************************************************************\n#  Copyright (c) 2017 IBM Corp.\n#\n#  All rights reserved. This program and the accompanying materials\n#  are made available under the terms of the Eclipse Public License v1.0\n#  and Eclipse Distribution License v1.0 which accompany this distribution.\n#\n#  The Eclipse Public License is available at\n#     http://www.eclipse.org/legal/epl-v10.html\n#  and the Eclipse Distribution License is available at\n#    http://www.eclipse.org/org/documents/edl-v10.php.\n#\n#  Contributors:\n#     Ian Craggs - initial version\n#*******************************************************************************/\n\nadd_subdirectory(linux)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/samples/FreeRTOS/MQTTEcho.c",
    "content": "/* Standard includes. */\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n/* FreeRTOS includes. */\n#include \"FreeRTOS.h\"\n#include \"task.h\"\n#include \"queue.h\"\n\n/* FreeRTOS+TCP includes. */\n#include \"FreeRTOS_IP.h\"\n#include \"FreeRTOS_Sockets.h\"\n\n#define MQTT_TASK 1\n#include \"MQTTClient.h\"\n\n\nvoid messageArrived(MessageData *data)\n{\n    printf(\"Message arrived on topic %.*s: %.*s\\n\", data->topicName->lenstring.len, data->topicName->lenstring.data,\n           data->message->payloadlen, data->message->payload);\n}\n\nstatic void prvMQTTEchoTask(void *pvParameters)\n{\n    /* connect to m2m.eclipse.org, subscribe to a topic, send and receive messages regularly every 1 sec */\n    MQTTClient client;\n    Network network;\n    unsigned char sendbuf[80], readbuf[80];\n    int rc = 0,\n        count = 0;\n    MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;\n\n    pvParameters = 0;\n    NetworkInit(&network);\n    MQTTClientInit(&client, &network, 30000, sendbuf, sizeof(sendbuf), readbuf, sizeof(readbuf));\n\n    char *address = \"iot.eclipse.org\";\n    if ((rc = NetworkConnect(&network, address, 1883)) != 0)\n        printf(\"Return code from network connect is %d\\n\", rc);\n\n#if defined(MQTT_TASK)\n    if ((rc = MQTTStartTask(&client)) != pdPASS)\n        printf(\"Return code from start tasks is %d\\n\", rc);\n#endif\n\n    connectData.MQTTVersion = 3;\n    connectData.clientID.cstring = \"FreeRTOS_sample\";\n\n    if ((rc = MQTTConnect(&client, &connectData)) != 0)\n        printf(\"Return code from MQTT connect is %d\\n\", rc);\n    else\n        printf(\"MQTT Connected\\n\");\n\n    if ((rc = MQTTSubscribe(&client, \"FreeRTOS/sample/#\", 2, messageArrived)) != 0)\n        printf(\"Return code from MQTT subscribe is %d\\n\", rc);\n\n    while (++count)\n    {\n        MQTTMessage message;\n        char payload[30];\n\n        message.qos = 1;\n        message.retained = 0;\n        message.payload = payload;\n        sprintf(payload, \"message number %d\", count);\n        message.payloadlen = strlen(payload);\n\n        if ((rc = MQTTPublish(&client, \"FreeRTOS/sample/a\", &message)) != 0)\n            printf(\"Return code from MQTT publish is %d\\n\", rc);\n#if !defined(MQTT_TASK)\n        if ((rc = MQTTYield(&client, 1000)) != 0)\n            printf(\"Return code from yield is %d\\n\", rc);\n#endif\n    }\n\n    /* do not return */\n}\n\n\nvoid vStartMQTTTasks(uint16_t usTaskStackSize, UBaseType_t uxTaskPriority)\n{\n    BaseType_t x = 0L;\n\n    xTaskCreate(prvMQTTEchoTask,\t/* The function that implements the task. */\n                \"MQTTEcho0\",\t\t\t/* Just a text name for the task to aid debugging. */\n                usTaskStackSize,\t/* The stack size is defined in FreeRTOSIPConfig.h. */\n                (void *)x,\t\t/* The task parameter, not used in this case. */\n                uxTaskPriority,\t\t/* The priority assigned to the task is defined in FreeRTOSConfig.h. */\n                NULL);\t\t\t\t/* The task handle is not used. */\n}\n/*-----------------------------------------------------------*/\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/samples/linux/CMakeLists.txt",
    "content": "#*******************************************************************************\n#  Copyright (c) 2017 IBM Corp.\n#\n#  All rights reserved. This program and the accompanying materials\n#  are made available under the terms of the Eclipse Public License v1.0\n#  and Eclipse Distribution License v1.0 which accompany this distribution.\n#\n#  The Eclipse Public License is available at\n#     http://www.eclipse.org/legal/epl-v10.html\n#  and the Eclipse Distribution License is available at\n#    http://www.eclipse.org/org/documents/edl-v10.php.\n#\n#  Contributors:\n#     Ian Craggs - initial version\n#*******************************************************************************/\n\n\nadd_executable(\n  stdoutsubc\n  stdoutsub.c\n)\ntarget_link_libraries(stdoutsubc paho-embed-mqtt3cc paho-embed-mqtt3c)\ntarget_include_directories(stdoutsubc PRIVATE \"../../src\" \"../../src/linux\")\ntarget_compile_definitions(stdoutsubc PRIVATE MQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/samples/linux/build.sh",
    "content": "cp ../../src/MQTTClient.c .\nsed -e 's/\"\"/\"MQTTLinux.h\"/g' ../../src/MQTTClient.h > MQTTClient.h\ngcc stdoutsub.c -I ../../src -I ../../src/linux -I ../../../MQTTPacket/src MQTTClient.c ../../src/linux/MQTTLinux.c ../../../MQTTPacket/src/MQTTFormat.c  ../../../MQTTPacket/src/MQTTPacket.c ../../../MQTTPacket/src/MQTTDeserializePublish.c ../../../MQTTPacket/src/MQTTConnectClient.c ../../../MQTTPacket/src/MQTTSubscribeClient.c ../../../MQTTPacket/src/MQTTSerializePublish.c -o stdoutsub ../../../MQTTPacket/src/MQTTConnectServer.c ../../../MQTTPacket/src/MQTTSubscribeServer.c ../../../MQTTPacket/src/MQTTUnsubscribeServer.c ../../../MQTTPacket/src/MQTTUnsubscribeClient.c -DMQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/samples/linux/stdoutsub.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2012, 2016 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *   http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial contribution\n *    Ian Craggs - change delimiter option from char to string\n *    Al Stockdill-Mander - Version using the embedded C client\n *    Ian Craggs - update MQTTClient function names\n *******************************************************************************/\n\n/*\n\n stdout subscriber\n\n compulsory parameters:\n\n  topic to subscribe to\n\n defaulted parameters:\n\n\t--host localhost\n\t--port 1883\n\t--qos 2\n\t--delimiter \\n\n\t--clientid stdout_subscriber\n\n\t--userid none\n\t--password none\n\n for example:\n\n    stdoutsub topic/of/interest --host iot.eclipse.org\n\n*/\n#include <stdio.h>\n#include <memory.h>\n#include \"MQTTClient.h\"\n\n#include <stdio.h>\n#include <signal.h>\n\n#include <sys/time.h>\n\n\nvolatile int toStop = 0;\n\n\nvoid usage()\n{\n    printf(\"MQTT stdout subscriber\\n\");\n    printf(\"Usage: stdoutsub topicname <options>, where options are:\\n\");\n    printf(\"  --host <hostname> (default is localhost)\\n\");\n    printf(\"  --port <port> (default is 1883)\\n\");\n    printf(\"  --qos <qos> (default is 2)\\n\");\n    printf(\"  --delimiter <delim> (default is \\\\n)\\n\");\n    printf(\"  --clientid <clientid> (default is hostname+timestamp)\\n\");\n    printf(\"  --username none\\n\");\n    printf(\"  --password none\\n\");\n    printf(\"  --showtopics <on or off> (default is on if the topic has a wildcard, else off)\\n\");\n    exit(-1);\n}\n\n\nvoid cfinish(int sig)\n{\n    signal(SIGINT, NULL);\n    toStop = 1;\n}\n\n\nstruct opts_struct\n{\n    char *clientid;\n    int nodelimiter;\n    char *delimiter;\n    enum QoS qos;\n    char *username;\n    char *password;\n    char *host;\n    int port;\n    int showtopics;\n} opts =\n{\n    (char *)\"stdout-subscriber\", 0, (char *)\"\\n\", QOS2, NULL, NULL, (char *)\"localhost\", 1883, 0\n};\n\n\nvoid getopts(int argc, char **argv)\n{\n    int count = 2;\n\n    while (count < argc)\n    {\n        if (strcmp(argv[count], \"--qos\") == 0)\n        {\n            if (++count < argc)\n            {\n                if (strcmp(argv[count], \"0\") == 0)\n                    opts.qos = QOS0;\n                else if (strcmp(argv[count], \"1\") == 0)\n                    opts.qos = QOS1;\n                else if (strcmp(argv[count], \"2\") == 0)\n                    opts.qos = QOS2;\n                else\n                    usage();\n            }\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--host\") == 0)\n        {\n            if (++count < argc)\n                opts.host = argv[count];\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--port\") == 0)\n        {\n            if (++count < argc)\n                opts.port = atoi(argv[count]);\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--clientid\") == 0)\n        {\n            if (++count < argc)\n                opts.clientid = argv[count];\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--username\") == 0)\n        {\n            if (++count < argc)\n                opts.username = argv[count];\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--password\") == 0)\n        {\n            if (++count < argc)\n                opts.password = argv[count];\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--delimiter\") == 0)\n        {\n            if (++count < argc)\n                opts.delimiter = argv[count];\n            else\n                opts.nodelimiter = 1;\n        }\n        else if (strcmp(argv[count], \"--showtopics\") == 0)\n        {\n            if (++count < argc)\n            {\n                if (strcmp(argv[count], \"on\") == 0)\n                    opts.showtopics = 1;\n                else if (strcmp(argv[count], \"off\") == 0)\n                    opts.showtopics = 0;\n                else\n                    usage();\n            }\n            else\n                usage();\n        }\n        count++;\n    }\n\n}\n\n\nvoid messageArrived(MessageData *md)\n{\n    MQTTMessage *message = md->message;\n\n    if (opts.showtopics)\n        printf(\"%.*s\\t\", md->topicName->lenstring.len, md->topicName->lenstring.data);\n    if (opts.nodelimiter)\n        printf(\"%.*s\", (int)message->payloadlen, (char *)message->payload);\n    else\n        printf(\"%.*s%s\", (int)message->payloadlen, (char *)message->payload, opts.delimiter);\n    //fflush(stdout);\n}\n\n\nint main(int argc, char **argv)\n{\n    int rc = 0;\n    unsigned char buf[100];\n    unsigned char readbuf[100];\n\n    if (argc < 2)\n        usage();\n\n    char *topic = argv[1];\n\n    if (strchr(topic, '#') || strchr(topic, '+'))\n        opts.showtopics = 1;\n    if (opts.showtopics)\n        printf(\"topic is %s\\n\", topic);\n\n    getopts(argc, argv);\n\n    Network n;\n    MQTTClient c;\n\n    signal(SIGINT, cfinish);\n    signal(SIGTERM, cfinish);\n\n    NetworkInit(&n);\n    NetworkConnect(&n, opts.host, opts.port);\n    MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100);\n\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    data.willFlag = 0;\n    data.MQTTVersion = 3;\n    data.clientID.cstring = opts.clientid;\n    data.username.cstring = opts.username;\n    data.password.cstring = opts.password;\n\n    data.keepAliveInterval = 10;\n    data.cleansession = 1;\n    printf(\"Connecting to %s %d\\n\", opts.host, opts.port);\n\n    rc = MQTTConnect(&c, &data);\n    printf(\"Connected %d\\n\", rc);\n\n    printf(\"Subscribing to %s\\n\", topic);\n    rc = MQTTSubscribe(&c, topic, opts.qos, messageArrived);\n    printf(\"Subscribed %d\\n\", rc);\n\n    while (!toStop)\n    {\n        MQTTYield(&c, 1000);\n    }\n\n    printf(\"Stopping\\n\");\n\n    MQTTDisconnect(&c);\n    NetworkDisconnect(&n);\n\n    return 0;\n}\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/CMakeLists.txt",
    "content": "#*******************************************************************************\n#  Copyright (c) 2017 IBM Corp.\n#\n#  All rights reserved. This program and the accompanying materials\n#  are made available under the terms of the Eclipse Public License v1.0\n#  and Eclipse Distribution License v1.0 which accompany this distribution.\n#\n#  The Eclipse Public License is available at\n#     http://www.eclipse.org/legal/epl-v10.html\n#  and the Eclipse Distribution License is available at\n#    http://www.eclipse.org/org/documents/edl-v10.php.\n#\n#  Contributors:\n#     Ian Craggs - initial version\n#*******************************************************************************/\n\n# MQTTClient Library - C\n\n\nfile(GLOB SOURCES \"*.c\" \"linux/*.c\")\n\nadd_library(\n  paho-embed-mqtt3cc SHARED\n  ${SOURCES}\n)\ninstall(TARGETS paho-embed-mqtt3cc DESTINATION /usr/lib)\ntarget_include_directories(paho-embed-mqtt3cc PRIVATE \"linux\")\ntarget_link_libraries(paho-embed-mqtt3cc paho-embed-mqtt3c)\ntarget_compile_definitions(paho-embed-mqtt3cc PRIVATE\n             MQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h MQTTCLIENT_QOS2=1)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/FreeRTOS/MQTTFreeRTOS.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014, 2015 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation\n *    Ian Craggs - convert to FreeRTOS\n *******************************************************************************/\n\n#include \"MQTTFreeRTOS.h\"\n\n\nint ThreadStart(Thread *thread, void (*fn)(void *), void *arg)\n{\n    int rc = 0;\n    uint16_t usTaskStackSize = (configMINIMAL_STACK_SIZE * 5);\n    UBaseType_t uxTaskPriority = uxTaskPriorityGet(NULL); /* set the priority as the same as the calling task*/\n\n    rc = xTaskCreate(fn,\t/* The function that implements the task. */\n                     \"MQTTTask\",\t\t\t/* Just a text name for the task to aid debugging. */\n                     usTaskStackSize,\t/* The stack size is defined in FreeRTOSIPConfig.h. */\n                     arg,\t\t\t\t/* The task parameter, not used in this case. */\n                     uxTaskPriority,\t\t/* The priority assigned to the task is defined in FreeRTOSConfig.h. */\n                     &thread->task);\t\t/* The task handle is not used. */\n\n    return rc;\n}\n\n\nvoid MutexInit(Mutex *mutex)\n{\n    mutex->sem = xSemaphoreCreateMutex();\n}\n\nint MutexLock(Mutex *mutex)\n{\n    return xSemaphoreTake(mutex->sem, portMAX_DELAY);\n}\n\nint MutexUnlock(Mutex *mutex)\n{\n    return xSemaphoreGive(mutex->sem);\n}\n\n\nvoid TimerCountdownMS(Timer *timer, unsigned int timeout_ms)\n{\n    timer->xTicksToWait = timeout_ms / portTICK_PERIOD_MS; /* convert milliseconds to ticks */\n    vTaskSetTimeOutState(&timer->xTimeOut); /* Record the time at which this function was entered. */\n}\n\n\nvoid TimerCountdown(Timer *timer, unsigned int timeout)\n{\n    TimerCountdownMS(timer, timeout * 1000);\n}\n\n\nint TimerLeftMS(Timer *timer)\n{\n    xTaskCheckForTimeOut(&timer->xTimeOut, &timer->xTicksToWait); /* updates xTicksToWait to the number left */\n    return (timer->xTicksToWait < 0) ? 0 : (timer->xTicksToWait * portTICK_PERIOD_MS);\n}\n\n\nchar TimerIsExpired(Timer *timer)\n{\n    return xTaskCheckForTimeOut(&timer->xTimeOut, &timer->xTicksToWait) == pdTRUE;\n}\n\n\nvoid TimerInit(Timer *timer)\n{\n    timer->xTicksToWait = 0;\n    memset(&timer->xTimeOut, '\\0', sizeof(timer->xTimeOut));\n}\n\n\nint FreeRTOS_read(Network *n, unsigned char *buffer, int len, int timeout_ms)\n{\n    TickType_t xTicksToWait = timeout_ms / portTICK_PERIOD_MS; /* convert milliseconds to ticks */\n    TimeOut_t xTimeOut;\n    int recvLen = 0;\n\n    vTaskSetTimeOutState(&xTimeOut); /* Record the time at which this function was entered. */\n    do\n    {\n        int rc = 0;\n\n        FreeRTOS_setsockopt(n->my_socket, 0, FREERTOS_SO_RCVTIMEO, &xTicksToWait, sizeof(xTicksToWait));\n        rc = FreeRTOS_recv(n->my_socket, buffer + recvLen, len - recvLen, 0);\n        if (rc > 0)\n            recvLen += rc;\n        else if (rc < 0)\n        {\n            recvLen = rc;\n            break;\n        }\n    }\n    while (recvLen < len && xTaskCheckForTimeOut(&xTimeOut, &xTicksToWait) == pdFALSE);\n\n    return recvLen;\n}\n\n\nint FreeRTOS_write(Network *n, unsigned char *buffer, int len, int timeout_ms)\n{\n    TickType_t xTicksToWait = timeout_ms / portTICK_PERIOD_MS; /* convert milliseconds to ticks */\n    TimeOut_t xTimeOut;\n    int sentLen = 0;\n\n    vTaskSetTimeOutState(&xTimeOut); /* Record the time at which this function was entered. */\n    do\n    {\n        int rc = 0;\n\n        FreeRTOS_setsockopt(n->my_socket, 0, FREERTOS_SO_RCVTIMEO, &xTicksToWait, sizeof(xTicksToWait));\n        rc = FreeRTOS_send(n->my_socket, buffer + sentLen, len - sentLen, 0);\n        if (rc > 0)\n            sentLen += rc;\n        else if (rc < 0)\n        {\n            sentLen = rc;\n            break;\n        }\n    }\n    while (sentLen < len && xTaskCheckForTimeOut(&xTimeOut, &xTicksToWait) == pdFALSE);\n\n    return sentLen;\n}\n\n\nvoid FreeRTOS_disconnect(Network *n)\n{\n    FreeRTOS_closesocket(n->my_socket);\n}\n\n\nvoid NetworkInit(Network *n)\n{\n    n->my_socket = 0;\n    n->mqttread = FreeRTOS_read;\n    n->mqttwrite = FreeRTOS_write;\n    n->disconnect = FreeRTOS_disconnect;\n}\n\n\nint NetworkConnect(Network *n, char *addr, int port)\n{\n    struct freertos_sockaddr sAddr;\n    int retVal = -1;\n    uint32_t ipAddress;\n\n    if ((ipAddress = FreeRTOS_gethostbyname(addr)) == 0)\n        goto exit;\n\n    sAddr.sin_port = FreeRTOS_htons(port);\n    sAddr.sin_addr = ipAddress;\n\n    if ((n->my_socket = FreeRTOS_socket(FREERTOS_AF_INET, FREERTOS_SOCK_STREAM, FREERTOS_IPPROTO_TCP)) < 0)\n        goto exit;\n\n    if ((retVal = FreeRTOS_connect(n->my_socket, &sAddr, sizeof(sAddr))) < 0)\n    {\n        FreeRTOS_closesocket(n->my_socket);\n        goto exit;\n    }\n\nexit:\n    return retVal;\n}\n\n\n#if 0\nint NetworkConnectTLS(Network *n, char *addr, int port, SlSockSecureFiles_t *certificates, unsigned char sec_method, unsigned int cipher, char server_verify)\n{\n    SlSockAddrIn_t sAddr;\n    int addrSize;\n    int retVal;\n    unsigned long ipAddress;\n\n    retVal = sl_NetAppDnsGetHostByName(addr, strlen(addr), &ipAddress, AF_INET);\n    if (retVal < 0)\n    {\n        return -1;\n    }\n\n    sAddr.sin_family = AF_INET;\n    sAddr.sin_port = sl_Htons((unsigned short)port);\n    sAddr.sin_addr.s_addr = sl_Htonl(ipAddress);\n\n    addrSize = sizeof(SlSockAddrIn_t);\n\n    n->my_socket = sl_Socket(SL_AF_INET, SL_SOCK_STREAM, SL_SEC_SOCKET);\n    if (n->my_socket < 0)\n    {\n        return -1;\n    }\n\n    SlSockSecureMethod method;\n    method.secureMethod = sec_method;\n    retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECMETHOD, &method, sizeof(method));\n    if (retVal < 0)\n    {\n        return retVal;\n    }\n\n    SlSockSecureMask mask;\n    mask.secureMask = cipher;\n    retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECURE_MASK, &mask, sizeof(mask));\n    if (retVal < 0)\n    {\n        return retVal;\n    }\n\n    if (certificates != NULL)\n    {\n        retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECURE_FILES, certificates->secureFiles, sizeof(SlSockSecureFiles_t));\n        if (retVal < 0)\n        {\n            return retVal;\n        }\n    }\n\n    retVal = sl_Connect(n->my_socket, (SlSockAddr_t *)&sAddr, addrSize);\n    if (retVal < 0)\n    {\n        if (server_verify || retVal != -453)\n        {\n            sl_Close(n->my_socket);\n            return retVal;\n        }\n    }\n\n    SysTickIntRegister(SysTickIntHandler);\n    SysTickPeriodSet(80000);\n    SysTickEnable();\n\n    return retVal;\n}\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/FreeRTOS/MQTTFreeRTOS.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014, 2015 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#if !defined(MQTTFreeRTOS_H)\n#define MQTTFreeRTOS_H\n\n#include \"FreeRTOS.h\"\n#include \"FreeRTOS_Sockets.h\"\n#include \"FreeRTOS_IP.h\"\n#include \"semphr.h\"\n#include \"task.h\"\n\ntypedef struct Timer \n{\n\tTickType_t xTicksToWait;\n\tTimeOut_t xTimeOut;\n} Timer;\n\ntypedef struct Network Network;\n\nstruct Network\n{\n\txSocket_t my_socket;\n\tint (*mqttread) (Network*, unsigned char*, int, int);\n\tint (*mqttwrite) (Network*, unsigned char*, int, int);\n\tvoid (*disconnect) (Network*);\n};\n\nvoid TimerInit(Timer*);\nchar TimerIsExpired(Timer*);\nvoid TimerCountdownMS(Timer*, unsigned int);\nvoid TimerCountdown(Timer*, unsigned int);\nint TimerLeftMS(Timer*);\n\ntypedef struct Mutex\n{\n\tSemaphoreHandle_t sem;\n} Mutex;\n\nvoid MutexInit(Mutex*);\nint MutexLock(Mutex*);\nint MutexUnlock(Mutex*);\n\ntypedef struct Thread\n{\n\tTaskHandle_t task;\n} Thread;\n\nint ThreadStart(Thread*, void (*fn)(void*), void* arg);\n\nint FreeRTOS_read(Network*, unsigned char*, int, int);\nint FreeRTOS_write(Network*, unsigned char*, int, int);\nvoid FreeRTOS_disconnect(Network*);\n\nvoid NetworkInit(Network*);\nint NetworkConnect(Network*, char*, int);\n/*int NetworkConnectTLS(Network*, char*, int, SlSockSecureFiles_t*, unsigned char, unsigned int, char);*/\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/MQTTClient.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014, 2017 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *   Allan Stockdill-Mander/Ian Craggs - initial API and implementation and/or initial documentation\n *   Ian Craggs - fix for #96 - check rem_len in readPacket\n *   Ian Craggs - add ability to set message handler separately #6\n *******************************************************************************/\n#include \"MQTTClient.h\"\n\nstatic void NewMessageData(MessageData *md, MQTTString *aTopicName, MQTTMessage *aMessage, const char *topic_sub)\n{\n    md->topicName = aTopicName;\n    md->message = aMessage;\n}\n\n\nstatic int getNextPacketId(MQTTClient *c)\n{\n    return c->next_packetid = (c->next_packetid == MAX_PACKET_ID) ? 1 : c->next_packetid + 1;\n}\n\n\nstatic int sendPacket(MQTTClient* c, int length, Timer* timer)\n{\n    int rc = FAILURE,\n        sent = 0;\n\n    while (sent < length && !TimerIsExpired(timer))\n    {\n        rc = c->ipstack->mqttwrite(c->ipstack, &c->buf[sent], length, TimerLeftMS(timer));\n        if (rc < 0)  // there was an error writing the data\n            break;\n        sent += rc;\n    }\n    if (sent == length)\n    {\n        TimerCountdown(&c->last_sent, c->keepAliveInterval); // record the fact that we have successfully sent the packet\n        rc = MQTT_SUCCESS;\n    }\n    else\n        rc = FAILURE;\n    return rc;\n}\n\n\nint MQTTClientInit(MQTTClient *c, Network *network, unsigned int command_timeout_ms,\n                    unsigned char *sendbuf, size_t sendbuf_size, unsigned char *readbuf, size_t readbuf_size)\n{\n    int i;\n    c->ipstack = network;\n\n    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)\n        c->messageHandlers[i].topicFilter = 0;\n    c->command_timeout_ms = command_timeout_ms;\n    c->buf = sendbuf;\n    c->buf_size = sendbuf_size;\n    c->readbuf = readbuf;\n    c->readbuf_size = readbuf_size;\n    c->isconnected = 0;\n    c->cleansession = 0;\n    c->ping_outstanding = 0;\n    c->defaultMessageHandler = NULL;\n\t  c->next_packetid = 1;\n    TimerInit(&c->last_sent);\n    TimerInit(&c->last_received);\n#if defined(MQTT_TASK)\n    if (MutexInit(&c->mutex) != 0)\n    {\n        return FAILURE;\n    }\n#endif\n    return MQTT_SUCCESS;\n}\n\n\nvoid MQTTClientDeInit(MQTTClient *c)\n{\n    if(!c)\n        return;\n#if defined(MQTT_TASK)\n    MutexDestory(&c->mutex);\n#endif\n    return;\n}\n\n\nstatic int decodePacket(MQTTClient* c, int* value, int timeout)\n{\n    unsigned char i;\n    int multiplier = 1;\n    int len = 0;\n    const int MAX_NO_OF_REMAINING_LENGTH_BYTES = 4;\n\n    *value = 0;\n    do\n    {\n        int rc = MQTTPACKET_READ_ERROR;\n\n        if (++len > MAX_NO_OF_REMAINING_LENGTH_BYTES)\n        {\n            rc = MQTTPACKET_READ_ERROR; /* bad data */\n            goto exit;\n        }\n        rc = c->ipstack->mqttread(c->ipstack, &i, 1, timeout);\n        if (rc != 1)\n            goto exit;\n        *value += (i & 127) * multiplier;\n        multiplier *= 128;\n    } while ((i & 128) != 0);\nexit:\n    return len;\n}\n\n\nstatic int readPacket(MQTTClient* c, Timer* timer)\n{\n    MQTTHeader header = {0};\n    int len = 0;\n    int rem_len = 0;\n\n    /* 1. read the header byte.  This has the packet type in it */\n    int rc = c->ipstack->mqttread(c->ipstack, c->readbuf, 1, TimerLeftMS(timer));\n    if (rc != 1)\n        goto exit;\n\n    len = 1;\n    /* 2. read the remaining length.  This is variable in itself */\n    decodePacket(c, &rem_len, TimerLeftMS(timer));\n    len += MQTTPacket_encode(c->readbuf + 1, rem_len); /* put the original remaining length back into the buffer */\n\n    if (rem_len > (c->readbuf_size - len))\n    {\n        rc = BUFFER_OVERFLOW;\n        goto exit;\n    }\n\n    /* 3. read the rest of the buffer using a callback to supply the rest of the data */\n    if (rem_len > 0 && (rc = c->ipstack->mqttread(c->ipstack, c->readbuf + len, rem_len, TimerLeftMS(timer)) != rem_len)) {\n        rc = 0;\n        goto exit;\n    }\n\n    header.byte = c->readbuf[0];\n    rc = header.bits.type;\n    if (c->keepAliveInterval > 0)\n        TimerCountdown(&c->last_received, c->keepAliveInterval); // record the fact that we have successfully received a packet\nexit:\n    return rc;\n}\n\n/**\n * Copyright (c) 2009-2018 Roger Light <roger@atchoo.org>\n * licensed under the Eclipse Public License 1.0 and the Eclipse Distribution License 1.0\n */\nstatic int MQTTTopicMatched(const char *sub, MQTTString *topic_name, char *result)\n{\n    int sublen, topiclen;\n    int spos, tpos;\n    char multilevel_wildcard = 0;\n    char *topic;\n\n    if(!result)\n        return -1;\n    *result = 0;\n\n    if(!sub || !topic_name)\n    {\n        return -1;\n    }\n\n    sublen = strlen(sub);\n\n    if(topic_name->cstring)\n    {\n        topic = topic_name->cstring;\n        topiclen = strlen(topic_name->cstring);\n    }\n    else\n    {\n        topic = topic_name->lenstring.data;\n        topiclen = topic_name->lenstring.len;\n    }\n\n    if(!sublen || !topiclen)\n    {\n        *result = 0;\n        return -1;\n    }\n\n    if(sublen && topiclen)\n    {\n        if((sub[0] == '$' && topic[0] != '$')\n                || (topic[0] == '$' && sub[0] != '$'))\n        {\n            return 0;\n        }\n    }\n\n    spos = 0;\n    tpos = 0;\n\n    while(spos < sublen && tpos <= topiclen)\n    {\n        if(sub[spos] == topic[tpos])\n        {\n            if(tpos == topiclen - 1)\n            {\n                /* Check for e.g. foo matching foo/# */\n                if(spos == sublen - 3 && sub[spos + 1] == '/' && sub[spos + 2] == '#')\n                {\n                    *result = 1;\n                    multilevel_wildcard = 1;\n                    return 0;\n                }\n            }\n            spos++;\n            tpos++;\n            if(spos == sublen && tpos == topiclen)\n            {\n                *result = 1;\n                return 0;\n            }\n            else if(tpos == topiclen && spos == sublen - 1 && sub[spos] == '+')\n            {\n                if(spos > 0 && sub[spos - 1] != '/')\n                {\n                    return -1;\n                }\n                spos++;\n                *result = 1;\n                return 0;\n            }\n        }\n        else\n        {\n            if(sub[spos] == '+')\n            {\n                /* Check for bad \"+foo\" or \"a/+foo\" subscription */\n                if(spos > 0 && sub[spos - 1] != '/')\n                {\n                    return -1;\n                }\n                /* Check for bad \"foo+\" or \"foo+/a\" subscription */\n                if(spos < sublen - 1 && sub[spos + 1] != '/')\n                {\n                    return -1;\n                }\n                spos++;\n                while(tpos < topiclen && topic[tpos] != '/')\n                {\n                    tpos++;\n                }\n                if(tpos == topiclen && spos == sublen)\n                {\n                    *result = 1;\n                    return 0;\n                }\n            }\n            else if(sub[spos] == '#')\n            {\n                if(spos > 0 && sub[spos - 1] != '/')\n                {\n                    return -1;\n                }\n                multilevel_wildcard = 1;\n                if(spos + 1 != sublen)\n                {\n                    return -1;\n                }\n                else\n                {\n                    *result = 1;\n                    return 0;\n                }\n            }\n            else\n            {\n                /* Check for e.g. foo/bar matching foo/+/# */\n                if(spos > 0 && spos + 2 == sublen && tpos == topiclen\n                        && sub[spos - 1] == '+' && sub[spos] == '/' && sub[spos + 1] == '#')\n                {\n                    *result = 1;\n                    multilevel_wildcard = 1;\n                    return 0;\n                }\n                return 0;\n            }\n        }\n    }\n    if(multilevel_wildcard == 0 && (tpos < topiclen || spos < sublen))\n    {\n        *result = 0;\n    }\n\n    return 0;\n}\n\n\nint deliverMessage(MQTTClient* c, MQTTString* topicName, MQTTMessage* message)\n{\n    int i;\n    int rc = FAILURE;\n    char match_rst = 0;\n\n    // we have to find the right message handler - indexed by topic\n    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)\n    {\n        if (c->messageHandlers[i].topicFilter != 0)\n        {\n            (void)MQTTTopicMatched((const char *)c->messageHandlers[i].topicFilter, topicName, &match_rst);\n            if (1 == match_rst && c->messageHandlers[i].fp != NULL)\n            {\n                MessageData md;\n                NewMessageData(&md, topicName, message, (const char *)c->messageHandlers[i].topicFilter);\n                c->messageHandlers[i].fp(&md);\n                rc = MQTT_SUCCESS;\n            }\n        }\n    }\n\n    if (rc == FAILURE && c->defaultMessageHandler != NULL)\n    {\n        MessageData md;\n        NewMessageData(&md, topicName, message, NULL);\n        c->defaultMessageHandler(&md);\n        rc = MQTT_SUCCESS;\n    }\n\n    return rc;\n}\n\n\nint keepalive(MQTTClient* c)\n{\n    int rc = MQTT_SUCCESS;\n\n    if (c->keepAliveInterval == 0)\n        goto exit;\n\n    if (TimerIsExpired(&c->last_sent) && TimerIsExpired(&c->last_received))\n    {\n        if (c->ping_outstanding)\n            rc = FAILURE; /* PINGRESP not received in keepalive interval */\n        else\n        {\n            Timer timer;\n            TimerInit(&timer);\n            TimerCountdownMS(&timer, 1000);\n            int len = MQTTSerialize_pingreq(c->buf, c->buf_size);\n            if (len > 0 && (rc = sendPacket(c, len, &timer)) == MQTT_SUCCESS) // send the ping packet\n                c->ping_outstanding = 1;\n        }\n    }\n\nexit:\n    return rc;\n}\n\n\nvoid MQTTCleanSession(MQTTClient* c)\n{\n    int i = 0;\n\n    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)\n        c->messageHandlers[i].topicFilter = NULL;\n}\n\n\nvoid MQTTCloseSession(MQTTClient* c)\n{\n    c->ping_outstanding = 0;\n    c->isconnected = 0;\n    if (c->cleansession)\n        MQTTCleanSession(c);\n}\n\n\nint cycle(MQTTClient* c, Timer* timer)\n{\n    int len = 0,\n        rc = MQTT_SUCCESS;\n    Timer send_timer;\n\n    int packet_type = readPacket(c, timer);     /* read the socket, see what work is due */\n\n    switch (packet_type)\n    {\n    default:\n        /* no more data to read, unrecoverable. Or read packet fails due to unexpected network error */\n        rc = packet_type;\n        goto exit;\n    case 0: /* timed out reading packet */\n        break;\n    case CONNACK:\n    case PUBACK:\n    case SUBACK:\n    case UNSUBACK:\n        break;\n    case PUBLISH:\n    {\n        MQTTString topicName;\n        MQTTMessage msg;\n        int intQoS;\n        msg.payloadlen = 0; /* this is a size_t, but deserialize publish sets this as int */\n        if (MQTTDeserialize_publish(&msg.dup, &intQoS, &msg.retained, &msg.id, &topicName,\n                                    (unsigned char **)&msg.payload, (int *)&msg.payloadlen, c->readbuf, c->readbuf_size) != 1)\n            goto exit;\n        msg.qos = (enum QoS)intQoS;\n        deliverMessage(c, &topicName, &msg);\n        if (msg.qos != QOS0)\n        {\n            if (msg.qos == QOS1)\n                len = MQTTSerialize_ack(c->buf, c->buf_size, PUBACK, 0, msg.id);\n            else if (msg.qos == QOS2)\n                len = MQTTSerialize_ack(c->buf, c->buf_size, PUBREC, 0, msg.id);\n            if (len <= 0)\n                rc = FAILURE;\n            else\n            {\n                TimerInit(&send_timer);\n                TimerCountdownMS(&send_timer, 1000);\n                rc = sendPacket(c, len, &send_timer);\n            }\n            if (rc == FAILURE)\n                goto exit; // there was a problem\n        }\n        break;\n    }\n    case PUBREC:\n    case PUBREL:\n    {\n        unsigned short mypacketid;\n        unsigned char dup, type;\n        if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)\n            rc = FAILURE;\n        else if ((len = MQTTSerialize_ack(c->buf, c->buf_size,\n                                          (packet_type == PUBREC) ? PUBREL : PUBCOMP, 0, mypacketid)) <= 0)\n            rc = FAILURE;\n        else\n        {\n            TimerInit(&send_timer);\n            TimerCountdownMS(&send_timer, 1000);\n            rc = sendPacket(c, len, &send_timer);\n            if(rc != MQTT_SUCCESS)\n                rc = FAILURE; // there was a problem\n        }\n        if (rc == FAILURE)\n            goto exit; // there was a problem\n        break;\n    }\n\n    case PUBCOMP:\n        break;\n    case PINGRESP:\n        c->ping_outstanding = 0;\n        break;\n    }\n\n    if (keepalive(c) != MQTT_SUCCESS)\n    {\n        //check only keepalive FAILURE status so that previous FAILURE status can be considered as FAULT\n        rc = FAILURE;\n    }\n\nexit:\n    if (rc == MQTT_SUCCESS)\n        rc = packet_type;\n    else if (c->isconnected)\n        MQTTCloseSession(c);\n    return rc;\n}\n\n\nint MQTTYield(MQTTClient* c, int timeout_ms)\n{\n    int rc = MQTT_SUCCESS;\n    Timer timer;\n\n    TimerInit(&timer);\n    TimerCountdownMS(&timer, timeout_ms);\n\n    do\n    {\n#if defined(MQTT_TASK)\n        (void)MutexLock(&c->mutex);\n#endif\n        if ( (rc = cycle(c, &timer) ) < 0)\n        {\n            rc = FAILURE;\n#if defined(MQTT_TASK)\n            (void)MutexUnlock(&c->mutex);\n#endif\n            break;\n        }\n#if defined(MQTT_TASK)\n        (void)MutexUnlock(&c->mutex);\n#endif\n    }\n    while (!TimerIsExpired(&timer));\n\n    return rc;\n}\n\n\nvoid MQTTRun(void* parm)\n{\n\tTimer timer;\n\tMQTTClient* c = (MQTTClient*)parm;\n\n\tTimerInit(&timer);\n\n\twhile (1)\n\t{\n#if defined(MQTT_TASK)\n\t\tMutexLock(&c->mutex);\n#endif\n\t\tTimerCountdownMS(&timer, 500); /* Don't wait too long if no traffic is incoming */\n\t\tcycle(c, &timer);\n#if defined(MQTT_TASK)\n\t\tMutexUnlock(&c->mutex);\n#endif\n\t}\n}\n\n\n#if defined(MQTT_TASK)\nint MQTTStartTask(MQTTClient* client)\n{\n\treturn ThreadStart(&client->thread, &MQTTRun, client);\n}\n#endif\n\n\nint waitfor(MQTTClient* c, int packet_type, Timer* timer)\n{\n    int rc = FAILURE;\n\n    do\n    {\n        if (TimerIsExpired(timer))\n            break; // we timed out\n        rc = cycle(c, timer);\n    }\n    while (rc != packet_type && rc >= 0);\n\n    return rc;\n}\n\n\n\n\nint MQTTConnectWithResults(MQTTClient* c, MQTTPacket_connectData* options, MQTTConnackData* data)\n{\n    Timer connect_timer;\n    int rc = FAILURE;\n    MQTTPacket_connectData default_options = MQTTPacket_connectData_initializer;\n    int len = 0;\n\n#if defined(MQTT_TASK)\n\t  MutexLock(&c->mutex);\n#endif\n\t  if (c->isconnected) /* don't send connect packet again if we are already connected */\n\t\t  goto exit;\n\n    TimerInit(&connect_timer);\n    TimerCountdownMS(&connect_timer, c->command_timeout_ms);\n\n    if (options == 0)\n        options = &default_options; /* set default options if none were supplied */\n\n    c->keepAliveInterval = options->keepAliveInterval;\n    c->cleansession = options->cleansession;\n    TimerCountdown(&c->last_received, c->keepAliveInterval);\n    if ((len = MQTTSerialize_connect(c->buf, c->buf_size, options)) <= 0)\n        goto exit;\n    if ((rc = sendPacket(c, len, &connect_timer)) != MQTT_SUCCESS)  // send the connect packet\n        goto exit; // there was a problem\n\n    // this will be a blocking call, wait for the connack\n    if (waitfor(c, CONNACK, &connect_timer) == CONNACK)\n    {\n        data->rc = 0;\n        data->sessionPresent = 0;\n        if (MQTTDeserialize_connack(&data->sessionPresent, &data->rc, c->readbuf, c->readbuf_size) == 1)\n            rc = data->rc;\n        else\n            rc = FAILURE;\n    }\n    else\n        rc = FAILURE;\n\nexit:\n    if (rc == MQTT_SUCCESS)\n    {\n        c->isconnected = 1;\n        c->ping_outstanding = 0;\n    }\n\n#if defined(MQTT_TASK)\n\t  MutexUnlock(&c->mutex);\n#endif\n\n    return rc;\n}\n\n\nint MQTTConnect(MQTTClient* c, MQTTPacket_connectData* options)\n{\n    MQTTConnackData data;\n    return MQTTConnectWithResults(c, options, &data);\n}\n\n\nint MQTTSetMessageHandler(MQTTClient* c, const char* topicFilter, messageHandler messageHandler)\n{\n    int rc = FAILURE;\n    int i = -1;\n\n    /* first check for an existing matching slot */\n    for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)\n    {\n        if (c->messageHandlers[i].topicFilter != NULL && strcmp(c->messageHandlers[i].topicFilter, topicFilter) == 0)\n        {\n            if (messageHandler == NULL) /* remove existing */\n            {\n                c->messageHandlers[i].topicFilter = NULL;\n                c->messageHandlers[i].fp = NULL;\n            }\n            rc = MQTT_SUCCESS; /* return i when adding new subscription */\n            break;\n        }\n    }\n    /* if no existing, look for empty slot (unless we are removing) */\n    if (messageHandler != NULL)\n    {\n        if (rc == FAILURE)\n        {\n            for (i = 0; i < MAX_MESSAGE_HANDLERS; ++i)\n            {\n                if (c->messageHandlers[i].topicFilter == NULL)\n                {\n                    rc = MQTT_SUCCESS;\n                    break;\n                }\n            }\n        }\n        if (i < MAX_MESSAGE_HANDLERS)\n        {\n            c->messageHandlers[i].topicFilter = topicFilter;\n            c->messageHandlers[i].fp = messageHandler;\n        }\n    }\n    return rc;\n}\n\n\nint MQTTSubscribeWithResults(MQTTClient *c, const char *topicFilter, enum QoS qos,\n                             messageHandler messageHandler, MQTTSubackData *data)\n{\n    int rc = FAILURE;\n    Timer timer;\n    int len = 0;\n    MQTTString topic = MQTTString_initializer;\n    topic.cstring = (char *)topicFilter;\n\n#if defined(MQTT_TASK)\n    MutexLock(&c->mutex);\n#endif\n    if (!c->isconnected)\n        goto exit;\n\n    TimerInit(&timer);\n    TimerCountdownMS(&timer, c->command_timeout_ms);\n\n    len = MQTTSerialize_subscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic, (int *)&qos);\n    if (len <= 0)\n        goto exit;\n    if ((rc = sendPacket(c, len, &timer)) != MQTT_SUCCESS) // send the subscribe packet\n        goto exit;             // there was a problem\n\n    if (waitfor(c, SUBACK, &timer) == SUBACK)      // wait for suback\n    {\n        int count = 0;\n        unsigned short mypacketid;\n        data->grantedQoS = QOS0;\n        if (MQTTDeserialize_suback(&mypacketid, 1, &count, (int *)&data->grantedQoS, c->readbuf, c->readbuf_size) == 1)\n        {\n            if (data->grantedQoS != 0x80)\n                rc = MQTTSetMessageHandler(c, topicFilter, messageHandler);\n        }\n    }\n    else\n        rc = FAILURE;\n\nexit:\n    if (rc == FAILURE)\n        MQTTCloseSession(c);\n#if defined(MQTT_TASK)\n\t  MutexUnlock(&c->mutex);\n#endif\n    return rc;\n}\n\n\nint MQTTSubscribe(MQTTClient* c, const char* topicFilter, enum QoS qos,\n       messageHandler messageHandler)\n{\n    MQTTSubackData data;\n    return MQTTSubscribeWithResults(c, topicFilter, qos, messageHandler, &data);\n}\n\n\nint MQTTUnsubscribe(MQTTClient* c, const char* topicFilter)\n{\n    int rc = FAILURE;\n    Timer timer;\n    MQTTString topic = MQTTString_initializer;\n    topic.cstring = (char *)topicFilter;\n    int len = 0;\n\n#if defined(MQTT_TASK)\n\t  MutexLock(&c->mutex);\n#endif\n\t  if (!c->isconnected)\n\t\t  goto exit;\n\n    TimerInit(&timer);\n    TimerCountdownMS(&timer, c->command_timeout_ms);\n\n    if ((len = MQTTSerialize_unsubscribe(c->buf, c->buf_size, 0, getNextPacketId(c), 1, &topic)) <= 0)\n        goto exit;\n    if ((rc = sendPacket(c, len, &timer)) != MQTT_SUCCESS) // send the subscribe packet\n        goto exit; // there was a problem\n\n    if (waitfor(c, UNSUBACK, &timer) == UNSUBACK)\n    {\n        unsigned short mypacketid;  // should be the same as the packetid above\n        if (MQTTDeserialize_unsuback(&mypacketid, c->readbuf, c->readbuf_size) == 1)\n        {\n            /* remove the subscription message handler associated with this topic, if there is one */\n            MQTTSetMessageHandler(c, topicFilter, NULL);\n        }\n    }\n    else\n        rc = FAILURE;\n\nexit:\n    if (rc == FAILURE)\n        MQTTCloseSession(c);\n#if defined(MQTT_TASK)\n\t  MutexUnlock(&c->mutex);\n#endif\n    return rc;\n}\n\n\nint MQTTPublish(MQTTClient* c, const char* topicName, MQTTMessage* message)\n{\n    int rc = FAILURE;\n    Timer timer;\n    MQTTString topic = MQTTString_initializer;\n    topic.cstring = (char *)topicName;\n    int len = 0;\n\n#if defined(MQTT_TASK)\n\t  MutexLock(&c->mutex);\n#endif\n\t  if (!c->isconnected)\n\t\t    goto exit;\n\n    TimerInit(&timer);\n    if(message->qos == QOS2)\n        TimerCountdownMS(&timer, c->command_timeout_ms * 2);\n    else\n        TimerCountdownMS(&timer, c->command_timeout_ms);\n\n    if (message->qos == QOS1 || message->qos == QOS2)\n        message->id = getNextPacketId(c);\n\n    len = MQTTSerialize_publish(c->buf, c->buf_size, 0, message->qos, message->retained, message->id,\n              topic, (unsigned char*)message->payload, message->payloadlen);\n    if (len <= 0)\n        goto exit;\n    if ((rc = sendPacket(c, len, &timer)) != MQTT_SUCCESS) // send the subscribe packet\n        goto exit; // there was a problem\n\n    if (message->qos == QOS1)\n    {\n        if (waitfor(c, PUBACK, &timer) == PUBACK)\n        {\n            unsigned short mypacketid;\n            unsigned char dup, type;\n            if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)\n                rc = FAILURE;\n        }\n        else\n            rc = FAILURE;\n    }\n    else if (message->qos == QOS2)\n    {\n        if (waitfor(c, PUBCOMP, &timer) == PUBCOMP)\n        {\n            unsigned short mypacketid;\n            unsigned char dup, type;\n            if (MQTTDeserialize_ack(&type, &dup, &mypacketid, c->readbuf, c->readbuf_size) != 1)\n                rc = FAILURE;\n        }\n        else\n            rc = FAILURE;\n    }\n\nexit:\n    if (rc == FAILURE)\n        MQTTCloseSession(c);\n#if defined(MQTT_TASK)\n\t  MutexUnlock(&c->mutex);\n#endif\n    return rc;\n}\n\n\nint MQTTDisconnect(MQTTClient* c)\n{\n    int rc = FAILURE;\n    Timer timer;     // we might wait for incomplete incoming publishes to complete\n    int len = 0;\n\n#if defined(MQTT_TASK)\n\tMutexLock(&c->mutex);\n#endif\n    TimerInit(&timer);\n    TimerCountdownMS(&timer, c->command_timeout_ms);\n\n\t  len = MQTTSerialize_disconnect(c->buf, c->buf_size);\n    if (len > 0)\n        rc = sendPacket(c, len, &timer);            // send the disconnect packet\n    MQTTCloseSession(c);\n\n#if defined(MQTT_TASK)\n\t  MutexUnlock(&c->mutex);\n#endif\n    return rc;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/MQTTClient.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014, 2017 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Allan Stockdill-Mander/Ian Craggs - initial API and implementation and/or initial documentation\n *    Ian Craggs - documentation and platform specific header\n *    Ian Craggs - add setMessageHandler function\n *******************************************************************************/\n\n#if !defined(MQTT_CLIENT_H)\n#define MQTT_CLIENT_H\n\n#if defined(__cplusplus)\n extern \"C\" {\n#endif\n\n#if defined(WIN32_DLL) || defined(WIN64_DLL)\n  #define DLLImport __declspec(dllimport)\n  #define DLLExport __declspec(dllexport)\n#elif defined(LINUX_SO)\n  #define DLLImport extern\n  #define DLLExport  __attribute__ ((visibility (\"default\")))\n#else\n  #define DLLImport\n  #define DLLExport\n#endif\n\n#include \"MQTTPacket.h\"\n#include \"stdio.h\"\n#define __MQTT_LITE_OS__\n#ifdef __MQTT_LITE_OS__\n#include \"MQTTliteos.h\"\n#endif\n\n\n#if defined(MQTTCLIENT_PLATFORM_HEADER)\n/* The following sequence of macros converts the MQTTCLIENT_PLATFORM_HEADER value\n * into a string constant suitable for use with include.\n */\n#define xstr(s) str(s)\n#define str(s) #s\n#include xstr(MQTTCLIENT_PLATFORM_HEADER)\n#endif\n\n#define MAX_PACKET_ID 65535 /* according to the MQTT specification - do not change! */\n\n#if !defined(MAX_MESSAGE_HANDLERS)\n#define MAX_MESSAGE_HANDLERS 5 /* redefinable - how many subscriptions do you want? */\n#endif\n\nenum QoS { QOS0, QOS1, QOS2, SUBFAIL=0x80 };\n\n/* all failure return codes must be negative */\nenum returnCode { BUFFER_OVERFLOW = -2, FAILURE = -1, MQTT_SUCCESS = 0 };\n\n/* The Platform specific header must define the Network and Timer structures and functions\n * which operate on them.\n *\ntypedef struct Network\n{\n\tint (*mqttread)(Network*, unsigned char* read_buffer, int, int);\n\tint (*mqttwrite)(Network*, unsigned char* send_buffer, int, int);\n} Network;*/\n\n/* The Timer structure must be defined in the platform specific header,\n * and have the following functions to operate on it.  */\nextern void TimerInit(Timer*);\nextern char TimerIsExpired(Timer*);\nextern void TimerCountdownMS(Timer*, unsigned int);\nextern void TimerCountdown(Timer*, unsigned int);\nextern int TimerLeftMS(Timer*);\n\ntypedef struct MQTTMessage\n{\n    enum QoS qos;\n    unsigned char retained;\n    unsigned char dup;\n    unsigned short id;\n    void *payload;\n    size_t payloadlen;\n} MQTTMessage;\n\ntypedef struct MessageData\n{\n    MQTTMessage* message;\n    MQTTString* topicName;\n} MessageData;\n\ntypedef struct MQTTConnackData\n{\n    unsigned char rc;\n    unsigned char sessionPresent;\n} MQTTConnackData;\n\ntypedef struct MQTTSubackData\n{\n    enum QoS grantedQoS;\n} MQTTSubackData;\n\ntypedef void (*messageHandler)(MessageData*);\n\ntypedef struct MQTTClient\n{\n    unsigned int next_packetid,\n      command_timeout_ms;\n    size_t buf_size,\n      readbuf_size;\n    unsigned char *buf,\n      *readbuf;\n    unsigned int keepAliveInterval;\n    char ping_outstanding;\n    int isconnected;\n    int cleansession;\n\n    struct MessageHandlers\n    {\n        const char* topicFilter;\n        void (*fp) (MessageData*);\n    } messageHandlers[MAX_MESSAGE_HANDLERS];      /* Message handlers are indexed by subscription topic */\n\n    void (*defaultMessageHandler) (MessageData*);\n\n    Network* ipstack;\n    Timer last_sent, last_received;\n#if defined(MQTT_TASK)\n    Mutex mutex;\n    Thread thread;\n#endif\n} MQTTClient;\n\n#define DefaultClient {0, 0, 0, 0, NULL, NULL, 0, 0, 0}\n\n\n/**\n * Create an MQTT client object\n * @param client\n * @param network\n * @param command_timeout_ms\n * @param\n */\nDLLExport int MQTTClientInit(MQTTClient* client, Network* network, unsigned int command_timeout_ms,\n\t\tunsigned char* sendbuf, size_t sendbuf_size, unsigned char* readbuf, size_t readbuf_size);\n\nDLLExport void MQTTClientDeInit(MQTTClient* c);\n\n/** MQTT Connect - send an MQTT connect packet down the network and wait for a Connack\n *  The nework object must be connected to the network endpoint before calling this\n *  @param options - connect options\n *  @return success code\n */\nDLLExport int MQTTConnectWithResults(MQTTClient* client, MQTTPacket_connectData* options,\n    MQTTConnackData* data);\n\n/** MQTT Connect - send an MQTT connect packet down the network and wait for a Connack\n *  The nework object must be connected to the network endpoint before calling this\n *  @param options - connect options\n *  @return success code\n */\nDLLExport int MQTTConnect(MQTTClient* client, MQTTPacket_connectData* options);\n\n/** MQTT Publish - send an MQTT publish packet and wait for all acks to complete for all QoSs\n *  @param client - the client object to use\n *  @param topic - the topic to publish to\n *  @param message - the message to send\n *  @return success code\n */\nDLLExport int MQTTPublish(MQTTClient* client, const char*, MQTTMessage*);\n\n/** MQTT SetMessageHandler - set or remove a per topic message handler\n *  @param client - the client object to use\n *  @param topicFilter - the topic filter set the message handler for\n *  @param messageHandler - pointer to the message handler function or NULL to remove\n *  @return success code\n */\nDLLExport int MQTTSetMessageHandler(MQTTClient* c, const char* topicFilter, messageHandler messageHandler);\n\n/** MQTT Subscribe - send an MQTT subscribe packet and wait for suback before returning.\n *  @param client - the client object to use\n *  @param topicFilter - the topic filter to subscribe to\n *  @param message - the message to send\n *  @return success code\n */\nDLLExport int MQTTSubscribe(MQTTClient* client, const char* topicFilter, enum QoS, messageHandler);\n\n/** MQTT Subscribe - send an MQTT subscribe packet and wait for suback before returning.\n *  @param client - the client object to use\n *  @param topicFilter - the topic filter to subscribe to\n *  @param message - the message to send\n *  @param data - suback granted QoS returned\n *  @return success code\n */\nDLLExport int MQTTSubscribeWithResults(MQTTClient* client, const char* topicFilter, enum QoS, messageHandler, MQTTSubackData* data);\n\n/** MQTT Subscribe - send an MQTT unsubscribe packet and wait for unsuback before returning.\n *  @param client - the client object to use\n *  @param topicFilter - the topic filter to unsubscribe from\n *  @return success code\n */\nDLLExport int MQTTUnsubscribe(MQTTClient* client, const char* topicFilter);\n\n/** MQTT Disconnect - send an MQTT disconnect packet and close the connection\n *  @param client - the client object to use\n *  @return success code\n */\nDLLExport int MQTTDisconnect(MQTTClient* client);\n\n/** MQTT Yield - MQTT background\n *  @param client - the client object to use\n *  @param time - the time, in milliseconds, to yield for\n *  @return success code\n */\nDLLExport int MQTTYield(MQTTClient* client, int time);\n\n/** MQTT isConnected\n *  @param client - the client object to use\n *  @return truth value indicating whether the client is connected to the server\n */\nstatic inline DLLExport int MQTTIsConnected(MQTTClient* client)\n{\n  return client->isconnected;\n}\n\n#if defined(MQTT_TASK)\n/** MQTT start background thread for a client.  After this, MQTTYield should not be called.\n*  @param client - the client object to use\n*  @return success code\n*/\nDLLExport int MQTTStartTask(MQTTClient* client);\n#endif\n\n#if defined(__cplusplus)\n     }\n#endif\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/cc3200/MQTTCC3200.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#include \"MQTTCC3200.h\"\n\nunsigned long MilliTimer;\n\nvoid SysTickIntHandler(void)\n{\n    MilliTimer++;\n}\n\nchar expired(Timer *timer)\n{\n    long left = timer->end_time - MilliTimer;\n    return (left < 0);\n}\n\n\nvoid countdown_ms(Timer *timer, unsigned int timeout)\n{\n    timer->end_time = MilliTimer + timeout;\n}\n\n\nvoid countdown(Timer *timer, unsigned int timeout)\n{\n    timer->end_time = MilliTimer + (timeout * 1000);\n}\n\n\nint left_ms(Timer *timer)\n{\n    long left = timer->end_time - MilliTimer;\n    return (left < 0) ? 0 : left;\n}\n\n\nvoid InitTimer(Timer *timer)\n{\n    timer->end_time = 0;\n}\n\n\nint cc3200_read(Network *n, unsigned char *buffer, int len, int timeout_ms)\n{\n    SlTimeval_t timeVal;\n    SlFdSet_t fdset;\n    int rc = 0;\n    int recvLen = 0;\n\n    SL_FD_ZERO(&fdset);\n    SL_FD_SET(n->my_socket, &fdset);\n\n    timeVal.tv_sec = 0;\n    timeVal.tv_usec = timeout_ms * 1000;\n    if (sl_Select(n->my_socket + 1, &fdset, NULL, NULL, &timeVal) == 1)\n    {\n        do\n        {\n            rc = sl_Recv(n->my_socket, buffer + recvLen, len - recvLen, 0);\n            recvLen += rc;\n        }\n        while(recvLen < len);\n    }\n    return recvLen;\n}\n\n\nint cc3200_write(Network *n, unsigned char *buffer, int len, int timeout_ms)\n{\n    SlTimeval_t timeVal;\n    SlFdSet_t fdset;\n    int rc = 0;\n    int readySock;\n\n    SL_FD_ZERO(&fdset);\n    SL_FD_SET(n->my_socket, &fdset);\n\n    timeVal.tv_sec = 0;\n    timeVal.tv_usec = timeout_ms * 1000;\n    do\n    {\n        readySock = sl_Select(n->my_socket + 1, NULL, &fdset, NULL, &timeVal);\n    }\n    while(readySock != 1);\n    rc = sl_Send(n->my_socket, buffer, len, 0);\n    return rc;\n}\n\n\nvoid cc3200_disconnect(Network *n)\n{\n    sl_Close(n->my_socket);\n}\n\n\nvoid NewNetwork(Network *n)\n{\n    n->my_socket = 0;\n    n->mqttread = cc3200_read;\n    n->mqttwrite = cc3200_write;\n    n->disconnect = cc3200_disconnect;\n}\n\nint TLSConnectNetwork(Network *n, char *addr, int port, SlSockSecureFiles_t *certificates, unsigned char sec_method, unsigned int cipher, char server_verify)\n{\n    SlSockAddrIn_t sAddr;\n    int addrSize;\n    int retVal;\n    unsigned long ipAddress;\n\n    retVal = sl_NetAppDnsGetHostByName(addr, strlen(addr), &ipAddress, AF_INET);\n    if (retVal < 0)\n    {\n        return -1;\n    }\n\n    sAddr.sin_family = AF_INET;\n    sAddr.sin_port = sl_Htons((unsigned short)port);\n    sAddr.sin_addr.s_addr = sl_Htonl(ipAddress);\n\n    addrSize = sizeof(SlSockAddrIn_t);\n\n    n->my_socket = sl_Socket(SL_AF_INET, SL_SOCK_STREAM, SL_SEC_SOCKET);\n    if (n->my_socket < 0)\n    {\n        return -1;\n    }\n\n    SlSockSecureMethod method;\n    method.secureMethod = sec_method;\n    retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECMETHOD, &method, sizeof(method));\n    if (retVal < 0)\n    {\n        return retVal;\n    }\n\n    SlSockSecureMask mask;\n    mask.secureMask = cipher;\n    retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECURE_MASK, &mask, sizeof(mask));\n    if (retVal < 0)\n    {\n        return retVal;\n    }\n\n    if (certificates != NULL)\n    {\n        retVal = sl_SetSockOpt(n->my_socket, SL_SOL_SOCKET, SL_SO_SECURE_FILES, certificates->secureFiles, sizeof(SlSockSecureFiles_t));\n        if(retVal < 0)\n        {\n            return retVal;\n        }\n    }\n\n    retVal = sl_Connect(n->my_socket, ( SlSockAddr_t *)&sAddr, addrSize);\n    if( retVal < 0 )\n    {\n        if (server_verify || retVal != -453)\n        {\n            sl_Close(n->my_socket);\n            return retVal;\n        }\n    }\n\n    SysTickIntRegister(SysTickIntHandler);\n    SysTickPeriodSet(80000);\n    SysTickEnable();\n\n    return retVal;\n}\n\nint ConnectNetwork(Network *n, char *addr, int port)\n{\n    SlSockAddrIn_t sAddr;\n    int addrSize;\n    int retVal;\n    unsigned long ipAddress;\n\n    sl_NetAppDnsGetHostByName(addr, strlen(addr), &ipAddress, AF_INET);\n\n    sAddr.sin_family = AF_INET;\n    sAddr.sin_port = sl_Htons((unsigned short)port);\n    sAddr.sin_addr.s_addr = sl_Htonl(ipAddress);\n\n    addrSize = sizeof(SlSockAddrIn_t);\n\n    n->my_socket = sl_Socket(SL_AF_INET, SL_SOCK_STREAM, 0);\n    if( n->my_socket < 0 )\n    {\n        // error\n        return -1;\n    }\n\n    retVal = sl_Connect(n->my_socket, ( SlSockAddr_t *)&sAddr, addrSize);\n    if( retVal < 0 )\n    {\n        // error\n        sl_Close(n->my_socket);\n        return retVal;\n    }\n\n    SysTickIntRegister(SysTickIntHandler);\n    SysTickPeriodSet(80000);\n    SysTickEnable();\n\n    return retVal;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/cc3200/MQTTCC3200.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#ifndef __MQTT_CC3200_\n#define __MQTT_CC3200_\n\n#include \"simplelink.h\"\n#include \"netapp.h\"\n#include \"socket.h\"\n#include \"hw_types.h\"\n#include \"systick.h\"\n\ntypedef struct Timer Timer;\n\nstruct Timer {\n\tunsigned long systick_period;\n\tunsigned long end_time;\n};\n\ntypedef struct Network Network;\n\nstruct Network\n{\n\tint my_socket;\n\tint (*mqttread) (Network*, unsigned char*, int, int);\n\tint (*mqttwrite) (Network*, unsigned char*, int, int);\n\tvoid (*disconnect) (Network*);\n};\n\nchar expired(Timer*);\nvoid countdown_ms(Timer*, unsigned int);\nvoid countdown(Timer*, unsigned int);\nint left_ms(Timer*);\n\nvoid InitTimer(Timer*);\n\nint cc3200_read(Network*, unsigned char*, int, int);\nint cc3200_write(Network*, unsigned char*, int, int);\nvoid cc3200_disconnect(Network*);\nvoid NewNetwork(Network*);\n\nint ConnectNetwork(Network*, char*, int);\nint TLSConnectNetwork(Network*, char*, int, SlSockSecureFiles_t*, unsigned char, unsigned int, char);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/linux/MQTTLinux.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014, 2017 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation\n *    Ian Craggs - return codes from linux_read\n *******************************************************************************/\n\n#include \"MQTTLinux.h\"\n\nvoid TimerInit(Timer *timer)\n{\n    timer->end_time = (struct timeval)\n    {\n        0, 0\n    };\n}\n\nchar TimerIsExpired(Timer *timer)\n{\n    struct timeval now, res;\n    gettimeofday(&now, NULL);\n    timersub(&timer->end_time, &now, &res);\n    return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);\n}\n\n\nvoid TimerCountdownMS(Timer *timer, unsigned int timeout)\n{\n    struct timeval now;\n    gettimeofday(&now, NULL);\n    struct timeval interval = {timeout / 1000, (timeout % 1000) * 1000};\n    timeradd(&now, &interval, &timer->end_time);\n}\n\n\nvoid TimerCountdown(Timer *timer, unsigned int timeout)\n{\n    struct timeval now;\n    gettimeofday(&now, NULL);\n    struct timeval interval = {timeout, 0};\n    timeradd(&now, &interval, &timer->end_time);\n}\n\n\nint TimerLeftMS(Timer *timer)\n{\n    struct timeval now, res;\n    gettimeofday(&now, NULL);\n    timersub(&timer->end_time, &now, &res);\n    //printf(\"left %d ms\\n\", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);\n    return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;\n}\n\n\nint linux_read(Network *n, unsigned char *buffer, int len, int timeout_ms)\n{\n    struct timeval interval = {timeout_ms / 1000, (timeout_ms % 1000) * 1000};\n    if (interval.tv_sec < 0 || (interval.tv_sec == 0 && interval.tv_usec <= 0))\n    {\n        interval.tv_sec = 0;\n        interval.tv_usec = 100;\n    }\n\n    setsockopt(n->my_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));\n\n    int bytes = 0;\n    while (bytes < len)\n    {\n        int rc = recv(n->my_socket, &buffer[bytes], (size_t)(len - bytes), 0);\n        if (rc == -1)\n        {\n            if (errno != EAGAIN && errno != EWOULDBLOCK)\n                bytes = -1;\n            break;\n        }\n        else if (rc == 0)\n        {\n            bytes = 0;\n            break;\n        }\n        else\n            bytes += rc;\n    }\n    return bytes;\n}\n\n\nint linux_write(Network *n, unsigned char *buffer, int len, int timeout_ms)\n{\n    struct timeval tv;\n\n    tv.tv_sec = 0;  /* 30 Secs Timeout */\n    tv.tv_usec = timeout_ms * 1000;  // Not init'ing this can cause strange errors\n\n    setsockopt(n->my_socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval));\n    int\trc = write(n->my_socket, buffer, len);\n    return rc;\n}\n\n\nvoid NetworkInit(Network *n)\n{\n    n->my_socket = 0;\n    n->mqttread = linux_read;\n    n->mqttwrite = linux_write;\n}\n\n\nint NetworkConnect(Network *n, char *addr, int port)\n{\n    int type = SOCK_STREAM;\n    struct sockaddr_in address;\n    int rc = -1;\n    sa_family_t family = AF_INET;\n    struct addrinfo *result = NULL;\n    struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};\n\n    if ((rc = getaddrinfo(addr, NULL, &hints, &result)) == 0)\n    {\n        struct addrinfo *res = result;\n\n        /* prefer ip4 addresses */\n        while (res)\n        {\n            if (res->ai_family == AF_INET)\n            {\n                result = res;\n                break;\n            }\n            res = res->ai_next;\n        }\n\n        if (result->ai_family == AF_INET)\n        {\n            address.sin_port = htons(port);\n            address.sin_family = family = AF_INET;\n            address.sin_addr = ((struct sockaddr_in *)(result->ai_addr))->sin_addr;\n        }\n        else\n            rc = -1;\n\n        freeaddrinfo(result);\n    }\n\n    if (rc == 0)\n    {\n        n->my_socket = socket(family, type, 0);\n        if (n->my_socket != -1)\n            rc = connect(n->my_socket, (struct sockaddr *)&address, sizeof(address));\n    }\n\n    return rc;\n}\n\n\nvoid NetworkDisconnect(Network *n)\n{\n    close(n->my_socket);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/linux/MQTTLinux.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Allan Stockdill-Mander - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#if !defined(__MQTT_LINUX_)\n#define __MQTT_LINUX_\n\n#if defined(WIN32_DLL) || defined(WIN64_DLL)\n  #define DLLImport __declspec(dllimport)\n  #define DLLExport __declspec(dllexport)\n#elif defined(LINUX_SO)\n  #define DLLImport extern\n  #define DLLExport  __attribute__ ((visibility (\"default\")))\n#else\n  #define DLLImport\n  #define DLLExport\n#endif\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <sys/select.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n#include <arpa/inet.h>\n#include <netdb.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <errno.h>\n#include <fcntl.h>\n\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n\ntypedef struct Timer\n{\n\tstruct timeval end_time;\n} Timer;\n\nvoid TimerInit(Timer*);\nchar TimerIsExpired(Timer*);\nvoid TimerCountdownMS(Timer*, unsigned int);\nvoid TimerCountdown(Timer*, unsigned int);\nint TimerLeftMS(Timer*);\n\ntypedef struct Network\n{\n\tint my_socket;\n\tint (*mqttread) (struct Network*, unsigned char*, int, int);\n\tint (*mqttwrite) (struct Network*, unsigned char*, int, int);\n} Network;\n\nint linux_read(Network*, unsigned char*, int, int);\nint linux_write(Network*, unsigned char*, int, int);\n\nDLLExport void NetworkInit(Network*);\nDLLExport int NetworkConnect(Network*, char*, int);\nDLLExport void NetworkDisconnect(Network*);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/liteOS/MQTTliteos.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#include \"MQTTliteos.h\"\n\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/platform.h\"\n#include \"dtls_interface.h\"\n\n#if defined(WITH_LINUX)\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <netdb.h>\n#include <errno.h>\n#elif defined(WITH_LWIP)\n//#include \"lwip/sockets.h\"\n#include \"lwip/netdb.h\"\n#include \"lwip/errno.h\"\n#endif\n#include \"osdepends/atiny_osdep.h\"\n\n\n#define get_time_ms atiny_gettime_ms\n\nvoid TimerInit(Timer *timer)\n{\n    timer->end_time = get_time_ms();\n}\n\nchar TimerIsExpired(Timer *timer)\n{\n    unsigned long long now = get_time_ms();\n    return now >= timer->end_time;\n}\n\nvoid TimerCountdownMS(Timer *timer, unsigned int timeout)\n{\n    unsigned long long now = get_time_ms();\n    timer->end_time = now + timeout;\n}\n\nvoid TimerCountdown(Timer *timer, unsigned int timeout)\n{\n    unsigned long long now = get_time_ms();\n    timer->end_time = now + timeout * 1000;\n}\n\nint TimerLeftMS(Timer *timer)\n{\n    UINT64 now = get_time_ms();\n    return timer->end_time <= now ? 0 : timer->end_time - now;\n}\n\nint MutexInit(Mutex* mutex)\n{\n    int ret = atiny_task_mutex_create(mutex);\n    if (ret != LOS_OK)\n    {\n        ATINY_LOG(LOG_ERR, \"create mutex fail, ret %d.\", ret);\n    }\n    return ret;\n}\nint MutexLock(Mutex* mutex)\n{\n    int ret = atiny_task_mutex_lock(mutex);\n    if (ret != LOS_OK)\n    {\n        ATINY_LOG(LOG_ERR, \"lock mutex fail,mutex %d,ret %d.\", mutex->mutex, ret);\n    }\n    return ret;\n}\n\nint MutexUnlock(Mutex* mutex)\n{\n    int ret = atiny_task_mutex_unlock(mutex);\n    if (ret != LOS_OK)\n    {\n        ATINY_LOG(LOG_ERR, \"unlock mutex fail,mutex %d,ret %d.\", mutex->mutex, ret);\n    }\n    return ret;\n}\n\nvoid MutexDestory(Mutex* mutex)\n{\n    int ret = atiny_task_mutex_delete(mutex);\n    if (ret != LOS_OK)\n    {\n        ATINY_LOG(LOG_ERR, \"delete mutex fail,mutex %d,ret %d.\", mutex->mutex, ret);\n    }\n}\n\nint ThreadStart(Thread *thread, void (*fn)(void *), void *arg)\n{\n    (void)thread;\n    (void)fn;\n    (void)arg;\n    return -1;\n}\n\nstatic int los_mqtt_read(void *ctx, unsigned char *buffer, int len, int timeout_ms)\n{\n    int ret = atiny_net_recv_timeout(ctx, buffer, len, timeout_ms);\n    /* 0 is timeout for mqtt for normal select */\n    if (ret == ATINY_NET_TIMEOUT)\n    {\n        ret = 0;\n    }\n    return ret;\n}\n\nstatic int los_mqtt_tls_read(mbedtls_ssl_context *ssl, unsigned char *buffer, int len, int timeout_ms)\n{\n    int ret;\n\n    if(NULL == ssl || NULL == buffer)\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid params.\");\n        return -1;\n    }\n\n    mbedtls_ssl_conf_read_timeout(ssl->conf, timeout_ms);\n\n    ret = mbedtls_ssl_read(ssl, buffer, len);\n    if(ret == MBEDTLS_ERR_SSL_WANT_READ\n            || ret == MBEDTLS_ERR_SSL_WANT_WRITE\n            || ret == MBEDTLS_ERR_SSL_TIMEOUT)\n        ret = 0;\n\n    return ret;\n}\n\n\nstatic int los_read(Network *n, unsigned char *buffer, int len, int timeout_ms)\n{\n    int ret = -1;\n    mqtt_security_info_s *info;\n\n    if(NULL == n || NULL == buffer)\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid params.\");\n        return -1;\n    }\n\n    info = n->get_security_info();\n\n    switch(info->security_type)\n    {\n        case MQTT_SECURITY_TYPE_NONE :\n            ret = los_mqtt_read(n->ctx, buffer, len, timeout_ms);\n            break;\n        case MQTT_SECURITY_TYPE_PSK:\n        case MQTT_SECURITY_TYPE_CA:\n            ret = los_mqtt_tls_read(n->ctx, buffer, len, timeout_ms);\n            break;\n        default :\n            ATINY_LOG(LOG_WARNING, \"unknow proto : %d\", info->security_type);\n            break;\n    }\n\n    return ret;\n}\n\n\nstatic int los_write(Network *n, unsigned char *buffer, int len, int timeout_ms)\n{\n    int ret = -1;\n    mqtt_security_info_s *info;\n\n    if(NULL == n || NULL == buffer)\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid params.\");\n        return -1;\n    }\n\n    info = n->get_security_info();\n\n    switch(info->security_type)\n    {\n    case MQTT_SECURITY_TYPE_NONE :\n        ret = atiny_net_send_timeout(n->ctx, buffer, len, timeout_ms);\n        break;\n    case MQTT_SECURITY_TYPE_PSK:\n    case MQTT_SECURITY_TYPE_CA:\n        ret = dtls_write(n->ctx, buffer, len);\n        break;\n    default :\n        ATINY_LOG(LOG_WARNING, \"unknow proto : %d\", info->security_type);\n        break;\n    }\n\n    return ret;\n}\n\nvoid NetworkInit(Network *n, mqtt_security_info_s *(*get_security_info)(void))\n{\n    if((NULL == n) ||\n       (NULL == get_security_info))\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid params.\");\n        return;\n    }\n    memset(n, 0x0, sizeof(Network));\n    n->mqttread = los_read;\n    n->mqttwrite = los_write;\n    n->get_security_info = get_security_info;\n\n    return;\n}\n\nstatic int los_mqtt_connect(Network *n, char *addr, int port)\n{\n    char port_str[16];\n\n    (void)snprintf(port_str, sizeof(port_str), \"%u\", port);\n    port_str[sizeof(port_str) - 1] = '\\0';\n    n->ctx = atiny_net_connect(addr, port_str, ATINY_PROTO_TCP);\n    if (n->ctx == NULL)\n    {\n        ATINY_LOG(LOG_FATAL, \"atiny_net_connect fail\");\n        return ATINY_NET_ERR;\n    }\n\n    return ATINY_OK;\n}\n\n#define PORT_BUF_LEN 16\nstatic int los_mqtt_tls_connect(Network *n, char *addr, int port)\n{\n    int ret;\n    mbedtls_ssl_context *ssl;\n    dtls_shakehand_info_s shakehand_info;\n    dtls_establish_info_s establish_info;\n    mqtt_security_info_s *security_info;\n    char port_buf[PORT_BUF_LEN];\n\n    security_info = n->get_security_info();\n\n    if (security_info->security_type == MQTT_SECURITY_TYPE_PSK)\n    {\n        establish_info.psk_or_cert = VERIFY_WITH_PSK;\n        establish_info.v.p.psk = (unsigned char *)security_info->u.psk.psk;\n        establish_info.v.p.psk_len = security_info->u.psk.psk_len;\n        establish_info.v.p.psk_identity = (unsigned char *)security_info->u.psk.psk_id;\n    }\n    else\n    {\n        establish_info.psk_or_cert = VERIFY_WITH_CERT;\n        establish_info.v.c.ca_cert = (const unsigned char *)security_info->u.ca.ca_crt;\n        establish_info.v.c.cert_len = security_info->u.ca.ca_len;\n    }\n    establish_info.udp_or_tcp = MBEDTLS_NET_PROTO_TCP;\n\n    ssl = (void *)dtls_ssl_new(&establish_info, MBEDTLS_SSL_IS_CLIENT);\n    if (NULL == ssl)\n    {\n        ATINY_LOG(LOG_ERR, \"create ssl context failed\");\n        goto exit;\n    }\n\n    memset(&shakehand_info, 0, sizeof(dtls_shakehand_info_s));\n\n    if (security_info->security_type == MQTT_SECURITY_TYPE_PSK)\n    {\n        shakehand_info.psk_or_cert = VERIFY_WITH_PSK;\n    }\n    else\n    {\n        shakehand_info.psk_or_cert = VERIFY_WITH_CERT;\n    }\n    shakehand_info.client_or_server = MBEDTLS_SSL_IS_CLIENT;\n    shakehand_info.udp_or_tcp = MBEDTLS_NET_PROTO_TCP;\n    shakehand_info.u.c.host = addr;\n    atiny_snprintf(port_buf, PORT_BUF_LEN, \"%d\", port);\n    shakehand_info.u.c.port = port_buf;\n\n    ret = dtls_shakehand(ssl, &shakehand_info);\n    if (ret != 0)\n    {\n        ATINY_LOG(LOG_ERR, \"ssl shake hand failed\");\n        goto exit;\n    }\n\n    n->ctx = ssl;\n    return 0;\nexit:\n    dtls_ssl_destroy(ssl);\n    return -1;\n}\n\nint NetworkConnect(Network *n, char *addr, int port)\n{\n    int ret = -1;\n    mqtt_security_info_s *info;\n\n    if(NULL == n || NULL == addr)\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid params.\\n\");\n        return -1;\n    }\n\n    info = n->get_security_info();\n    switch(info->security_type)\n    {\n    case MQTT_SECURITY_TYPE_NONE :\n        ret = los_mqtt_connect(n, addr, port);\n        break;\n    case MQTT_SECURITY_TYPE_PSK:\n    case MQTT_SECURITY_TYPE_CA:\n        ret = los_mqtt_tls_connect(n, addr, port);\n        break;\n    default :\n        ATINY_LOG(LOG_WARNING, \"unknow proto : %d\\n\", info->security_type);\n        break;\n    }\n\n    return ret;\n}\n\nstatic void los_mqtt_disconnect(void *ctx)\n{\n    if(NULL == ctx)\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid params.\\n\");\n        return;\n    }\n    atiny_net_close(ctx);\n\n    return;\n}\n\nvoid NetworkDisconnect(Network *n)\n{\n    mqtt_security_info_s *info;\n    if(NULL == n)\n    {\n        ATINY_LOG(LOG_FATAL, \"invalid params.\\n\");\n        return;\n    }\n\n    info = n->get_security_info();\n    switch(info->security_type)\n    {\n    case MQTT_SECURITY_TYPE_NONE :\n        los_mqtt_disconnect(n->ctx);\n        break;\n    case MQTT_SECURITY_TYPE_PSK:\n    case MQTT_SECURITY_TYPE_CA:\n        dtls_ssl_destroy(n->ctx);\n        break;\n    default :\n        ATINY_LOG(LOG_WARNING, \"unknow proto : %d\\n\", info->security_type);\n        break;\n    }\n\n    n->ctx = NULL;\n\n    return;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/src/liteOS/MQTTliteos.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef MQTT_LITE_OS_H\n#define MQTT_LITE_OS_H\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n#include <los_typedef.h>\n#include <los_sys.h>\n#include \"sal/atiny_socket.h\"\n#include \"log/atiny_log.h\"\n#include \"atiny_mqtt/mqtt_client.h\"\n\n#define MQTT_TASK 1\n\ntypedef struct Timer\n{\n\tunsigned long long end_time;\n} Timer;\n\nvoid TimerInit(Timer*);\nchar TimerIsExpired(Timer*);\nvoid TimerCountdownMS(Timer*, unsigned int);\nvoid TimerCountdown(Timer*, unsigned int);\nint TimerLeftMS(Timer*);\n\ntypedef struct atiny_task_mutex_tag_s Mutex;\nint MutexInit(Mutex* mutex);\nint MutexLock(Mutex* mutex);\nint MutexUnlock(Mutex* mutex);\nvoid MutexDestory(Mutex* mutex);\n\ntypedef struct\n{\n\tvoid * no_used;\n} Thread;\nint ThreadStart(Thread *thread, void (*fn)(void *), void *arg);\n\ntypedef struct mqtt_context\n{\n    int fd;\n}mqtt_context_t;\n\ntypedef struct Network\n{\n    void *ctx;\n    int (*mqttread) (struct Network*, unsigned char*, int, int);\n    int (*mqttwrite) (struct Network*, unsigned char*, int, int);\n\n    mqtt_security_info_s *(*get_security_info)(void);\n} Network;\n\nvoid NetworkInit(Network* n, mqtt_security_info_s *(*get_security_info)(void));\nint NetworkConnect(Network*, char*, int);\nvoid NetworkDisconnect(Network*);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/test/CMakeLists.txt",
    "content": "PROJECT(mqtt-tests)\n\nSET(MQTT_TEST_BROKER_HOST \"localhost\" CACHE STRING \"Hostname of a test MQTT broker to use\")\nSET(MQTT_TEST_PROXY_PORT \"1884\" CACHE STRING \"Port of the test proxy to use\")\nSET(MQTT_SSL_HOSTNAME \"localhost\" CACHE STRING \"Hostname of a test SSL MQTT broker to use\")\nSET(CERTDIR $ENV{TRAVIS_BUILD_DIR}/test/ssl)\n\nADD_EXECUTABLE(\n\ttestc1\n\ttest1.c\n)\n\ntarget_link_libraries(testc1 paho-embed-mqtt3cc paho-embed-mqtt3c)\ntarget_include_directories(testc1 PRIVATE \"../src\" \"../src/linux\")\ntarget_compile_definitions(testc1 PRIVATE MQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h)\n\nADD_TEST(\n\tNAME testc1\n\tCOMMAND \"testc1\" \"--host\" ${MQTT_TEST_BROKER_HOST}\n)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTClient-C/test/test1.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2009, 2017 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial implementation for embedded C client\n *******************************************************************************/\n\n\n/**\n * @file\n * Tests for the Paho embedded C \"high\" level client\n */\n\n\n#include \"MQTTClient.h\"\n#include <string.h>\n#include <stdlib.h>\n\n#if !defined(_WINDOWS)\n#include <sys/time.h>\n#include <sys/socket.h>\n#include <unistd.h>\n#include <errno.h>\n#else\n#include <windows.h>\n#define setenv(a, b, c) _putenv_s(a, b)\n#endif\n\n#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))\n\nvoid usage(void)\n{\n    printf(\"help!!\\n\");\n    exit(EXIT_FAILURE);\n}\n\nstruct Options\n{\n    char *host;         /**< connection to system under test. */\n    int port;\n    char *proxy_host;\n    int proxy_port;\n    int verbose;\n    int test_no;\n    int MQTTVersion;\n    int iterations;\n} options =\n{\n    \"localhost\",\n    1883,\n    \"localhost\",\n    1885,\n    0, //verbose\n    0, //test_no\n    4,\n    1,\n};\n\nvoid getopts(int argc, char **argv)\n{\n    int count = 1;\n\n    while (count < argc)\n    {\n        if (strcmp(argv[count], \"--test_no\") == 0)\n        {\n            if (++count < argc)\n                options.test_no = atoi(argv[count]);\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--host\") == 0)\n        {\n            if (++count < argc)\n            {\n                options.host = argv[count];\n                printf(\"\\nSetting host to %s\\n\", options.host);\n            }\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--port\") == 0)\n        {\n            if (++count < argc)\n            {\n                options.port = atoi(argv[count]);\n                printf(\"\\nSetting port to %d\\n\", options.port);\n            }\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--proxy_host\") == 0)\n        {\n            if (++count < argc)\n            {\n                options.proxy_host = argv[count];\n                printf(\"\\nSetting proxy_host to %s\\n\", options.proxy_host);\n            }\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--proxy_port\") == 0)\n        {\n            if (++count < argc)\n            {\n                options.proxy_port = atoi(argv[count]);\n                printf(\"\\nSetting proxy_port to %d\\n\", options.proxy_port);\n            }\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--MQTTversion\") == 0)\n        {\n            if (++count < argc)\n            {\n                options.MQTTVersion = atoi(argv[count]);\n                printf(\"setting MQTT version to %d\\n\", options.MQTTVersion);\n            }\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--iterations\") == 0)\n        {\n            if (++count < argc)\n                options.iterations = atoi(argv[count]);\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--verbose\") == 0)\n        {\n            options.verbose = 1;\n            printf(\"\\nSetting verbose on\\n\");\n        }\n        count++;\n    }\n}\n\n\n#define LOGA_DEBUG 0\n#define LOGA_INFO 1\n#include <stdarg.h>\n#include <time.h>\n#include <sys/timeb.h>\nvoid MyLog(int LOGA_level, char *format, ...)\n{\n    static char msg_buf[256];\n    va_list args;\n    struct timeb ts;\n\n    struct tm *timeinfo;\n\n    if (LOGA_level == LOGA_DEBUG && options.verbose == 0)\n        return;\n\n    ftime(&ts);\n    timeinfo = localtime(&ts.time);\n    strftime(msg_buf, 80, \"%Y%m%d %H%M%S\", timeinfo);\n\n    sprintf(&msg_buf[strlen(msg_buf)], \".%.3hu \", ts.millitm);\n\n    va_start(args, format);\n    vsnprintf(&msg_buf[strlen(msg_buf)], sizeof(msg_buf) - strlen(msg_buf), format, args);\n    va_end(args);\n\n    printf(\"%s\\n\", msg_buf);\n    fflush(stdout);\n}\n\n\n#if defined(WIN32) || defined(_WINDOWS)\n#define mqsleep(A) Sleep(1000*A)\n#define START_TIME_TYPE DWORD\nstatic DWORD start_time = 0;\nSTART_TIME_TYPE start_clock(void)\n{\n    return GetTickCount();\n}\n#elif defined(AIX)\n#define mqsleep sleep\n#define START_TIME_TYPE struct timespec\nSTART_TIME_TYPE start_clock(void)\n{\n    static struct timespec start;\n    clock_gettime(CLOCK_REALTIME, &start);\n    return start;\n}\n#else\n#define mqsleep sleep\n#define START_TIME_TYPE struct timeval\n/* TODO - unused - remove? static struct timeval start_time; */\nSTART_TIME_TYPE start_clock(void)\n{\n    struct timeval start_time;\n    gettimeofday(&start_time, NULL);\n    return start_time;\n}\n#endif\n\n\n#if defined(WIN32)\nlong elapsed(START_TIME_TYPE start_time)\n{\n    return GetTickCount() - start_time;\n}\n#elif defined(AIX)\n#define assert(a)\nlong elapsed(struct timespec start)\n{\n    struct timespec now, res;\n\n    clock_gettime(CLOCK_REALTIME, &now);\n    ntimersub(now, start, res);\n    return (res.tv_sec) * 1000L + (res.tv_nsec) / 1000000L;\n}\n#else\nlong elapsed(START_TIME_TYPE start_time)\n{\n    struct timeval now, res;\n\n    gettimeofday(&now, NULL);\n    timersub(&now, &start_time, &res);\n    return (res.tv_sec) * 1000 + (res.tv_usec) / 1000;\n}\n#endif\n\n\n#define assert(a, b, c, d) myassert(__FILE__, __LINE__, a, b, c, d)\n#define assert1(a, b, c, d, e) myassert(__FILE__, __LINE__, a, b, c, d, e)\n\nint tests = 0;\nint failures = 0;\nFILE *xml;\nSTART_TIME_TYPE global_start_time;\nchar output[3000];\nchar *cur_output = output;\n\n\nvoid write_test_result(void)\n{\n    long duration = elapsed(global_start_time);\n\n    fprintf(xml, \" time=\\\"%ld.%.3ld\\\" >\\n\", duration / 1000, duration % 1000);\n    if (cur_output != output)\n    {\n        fprintf(xml, \"%s\", output);\n        cur_output = output;\n    }\n    fprintf(xml, \"</testcase>\\n\");\n}\n\n\nvoid myassert(char *filename, int lineno, char *description, int value, char *format, ...)\n{\n    ++tests;\n    if (!value)\n    {\n        va_list args;\n\n        ++failures;\n        MyLog(LOGA_INFO, \"Assertion failed, file %s, line %d, description: %s\\n\", filename, lineno, description);\n\n        va_start(args, format);\n        vprintf(format, args);\n        va_end(args);\n\n        cur_output += sprintf(cur_output, \"<failure type=\\\"%s\\\">file %s, line %d </failure>\\n\",\n                              description, filename, lineno);\n    }\n    else\n        MyLog(LOGA_DEBUG, \"Assertion succeeded, file %s, line %d, description: %s\", filename, lineno, description);\n}\n\n\nstatic volatile MessageData *test1_message_data = NULL;\nstatic MQTTMessage pubmsg;\n\nvoid messageArrived(MessageData *md)\n{\n    test1_message_data = md;\n    MQTTMessage *m = md->message;\n\n    assert(\"Good message lengths\", pubmsg.payloadlen == m->payloadlen,\n           \"payloadlen was %d\", m->payloadlen);\n\n    if (pubmsg.payloadlen == m->payloadlen)\n        assert(\"Good message contents\", memcmp(m->payload, pubmsg.payload, m->payloadlen) == 0,\n               \"payload was %s\", m->payload);\n}\n\n\n/*********************************************************************\n\nTest1: single-threaded client\n\n*********************************************************************/\nvoid test1_sendAndReceive(MQTTClient *c, int qos, char *test_topic)\n{\n    char *topicName = NULL;\n    int topicLen;\n    int i = 0;\n    int iterations = 50;\n    int rc;\n    int wait_seconds;\n\n    MyLog(LOGA_DEBUG, \"%d messages at QoS %d\", iterations, qos);\n    memset(&pubmsg, '\\0', sizeof(pubmsg));\n    pubmsg.payload = \"a much longer message that we can shorten to the extent that we need to payload up to 11\";\n    pubmsg.payloadlen = 11;\n    pubmsg.qos = qos;\n    pubmsg.retained = 0;\n    pubmsg.dup = 0;\n\n    for (i = 0; i < iterations; ++i)\n    {\n        test1_message_data = NULL;\n        rc = MQTTPublish(c, test_topic, &pubmsg);\n        assert(\"Good rc from publish\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n        /* wait for the message to be received */\n        wait_seconds = 10;\n        while ((test1_message_data == NULL) && (wait_seconds-- > 0))\n        {\n            MQTTYield(c, 100);\n        }\n        assert(\"Message Arrived\", wait_seconds > 0, \"Time out waiting for message %d\\n\", i);\n\n        if (!test1_message_data)\n            printf(\"No message received within timeout period\\n\");\n    }\n\n    /* wait to receive any outstanding messages */\n    wait_seconds = 2;\n    while (wait_seconds-- > 0)\n    {\n        MQTTYield(c, 1000);\n    }\n}\n\n\nint test1(struct Options options)\n{\n    int subsqos = 2;\n    Network n;\n    MQTTClient c;\n    int rc = 0;\n    char *test_topic = \"C client test1\";\n    MQTTPacket_willOptions wopts;\n    unsigned char buf[100];\n    unsigned char readbuf[100];\n\n    printf(\"test1\\n\");\n    fprintf(xml, \"<testcase classname=\\\"test1\\\" name=\\\"single threaded client using receive\\\"\");\n    global_start_time = start_clock();\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 1 - single threaded client using receive\");\n\n    NetworkInit(&n);\n    NetworkConnect(&n, options.host, options.port);\n    MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100);\n\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    data.willFlag = 1;\n    data.MQTTVersion = options.MQTTVersion;\n    data.clientID.cstring = \"single-threaded-test\";\n    data.username.cstring = \"testuser\";\n    data.password.cstring = \"testpassword\";\n\n    data.keepAliveInterval = 20;\n    data.cleansession = 1;\n\n    data.will.message.cstring = \"will message\";\n    data.will.qos = 1;\n    data.will.retained = 0;\n    data.will.topicName.cstring = \"will topic\";\n\n    MyLog(LOGA_DEBUG, \"Connecting\");\n    rc = MQTTConnect(&c, &data);\n    assert(\"Good rc from connect\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    if (rc != MQTT_SUCCESS)\n        goto exit;\n\n    rc = MQTTSubscribe(&c, test_topic, subsqos, messageArrived);\n    assert(\"Good rc from subscribe\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    test1_sendAndReceive(&c, 0, test_topic);\n    test1_sendAndReceive(&c, 1, test_topic);\n    test1_sendAndReceive(&c, 2, test_topic);\n\n    MyLog(LOGA_DEBUG, \"Stopping\\n\");\n\n    rc = MQTTUnsubscribe(&c, test_topic);\n    assert(\"Unsubscribe successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    rc = MQTTDisconnect(&c);\n    assert(\"Disconnect successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    /* Just to make sure we can connect again */\n    NetworkConnect(&n, options.host, options.port);\n    rc = MQTTConnect(&c, &data);\n    assert(\"Connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    rc = MQTTDisconnect(&c);\n    assert(\"Disconnect successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\nexit:\n    MyLog(LOGA_INFO, \"TEST1: test %s. %d tests run, %d failures.\",\n          (failures == 0) ? \"passed\" : \"failed\", tests, failures);\n    write_test_result();\n    return failures;\n}\n\n\n/*********************************************************************\n\nTest 2: connack return data\n\nsessionPresent\n\n*********************************************************************/\nint test2(struct Options options)\n{\n    int subsqos = 2;\n    Network n;\n    MQTTClient c;\n    int rc = 0;\n    char *test_topic = \"C client test2\";\n    MQTTPacket_willOptions wopts;\n    unsigned char buf[100];\n    unsigned char readbuf[100];\n    MQTTConnackData connack;\n    MQTTSubackData suback;\n\n    fprintf(xml, \"<testcase classname=\\\"test2\\\" name=\\\"connack return data\\\"\");\n    global_start_time = start_clock();\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 2 - connack return data\");\n\n    NetworkInit(&n);\n    NetworkConnect(&n, options.host, options.port);\n    MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100);\n\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    data.willFlag = 1;\n    data.MQTTVersion = options.MQTTVersion;\n    data.clientID.cstring = \"connack-return-data\";\n    data.username.cstring = \"testuser\";\n    data.password.cstring = \"testpassword\";\n\n    data.keepAliveInterval = 20;\n    data.cleansession = 1;\n\n    data.will.message.cstring = \"will message\";\n    data.will.qos = 1;\n    data.will.retained = 0;\n    data.will.topicName.cstring = \"will topic\";\n\n    MyLog(LOGA_DEBUG, \"Connecting\");\n    rc = MQTTConnect(&c, &data);\n    assert(\"Good rc from connect\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    if (rc != MQTT_SUCCESS)\n        goto exit;\n\n    rc = MQTTDisconnect(&c);\n    assert(\"Disconnect successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    NetworkDisconnect(&n);\n\n    /* now connect cleansession false */\n    NetworkConnect(&n, options.host, options.port);\n    data.cleansession = 0;\n    rc = MQTTConnectWithResults(&c, &data, &connack);\n    assert(\"Good rc from connect\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    assert(\"Good rc in connack\", connack.rc == 0, \"rc was %d\", connack.rc);\n    assert(\"Session present is 0\", connack.sessionPresent == 0,\n           \"sessionPresent was %d\", connack.sessionPresent);\n\n    /* set up some state */\n    rc = MQTTSubscribeWithResults(&c, test_topic, subsqos, messageArrived, &suback);\n    assert(\"Good rc from subscribe\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    assert(\"Good granted QoS\", suback.grantedQoS == subsqos,\n           \"granted QoS was %d\", suback.grantedQoS);\n\n    rc = MQTTDisconnect(&c);\n    assert(\"Disconnect successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    NetworkDisconnect(&n);\n\n    /* Connect and check sessionPresent */\n    NetworkConnect(&n, options.host, options.port);\n    rc = MQTTConnectWithResults(&c, &data, &connack);\n    assert(\"Connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    assert(\"Good rc in connack\", connack.rc == 0, \"rc was %d\", connack.rc);\n    assert(\"Session present is 1\", connack.sessionPresent == 1,\n           \"sessionPresent was %d\", connack.sessionPresent);\n\n    rc = MQTTDisconnect(&c);\n    assert(\"Disconnect successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    NetworkDisconnect(&n);\n\n    /* Connect and check sessionPresent is cleared */\n    data.cleansession = 1;\n    NetworkConnect(&n, options.host, options.port);\n    rc = MQTTConnectWithResults(&c, &data, &connack);\n    assert(\"Connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    assert(\"Good rc in connack\", connack.rc == 0, \"rc was %d\", connack.rc);\n    assert(\"Session present is 0\", connack.sessionPresent == 0,\n           \"sessionPresent was %d\", connack.sessionPresent);\n\n    rc = MQTTDisconnect(&c);\n    assert(\"Disconnect successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    NetworkDisconnect(&n);\n\nexit:\n    MyLog(LOGA_INFO, \"TEST1: test %s. %d tests run, %d failures.\",\n          (failures == 0) ? \"passed\" : \"failed\", tests, failures);\n    write_test_result();\n    return failures;\n}\n\n/*********************************************************************\n\nTest 3: client session state\n\n*********************************************************************/\nstatic volatile MessageData *test2_message_data = NULL;\n\nvoid messageArrived2(MessageData *md)\n{\n    test2_message_data = md;\n    MQTTMessage *m = md->message;\n\n    assert(\"Good message lengths\", pubmsg.payloadlen == m->payloadlen,\n           \"payloadlen was %d\", m->payloadlen);\n\n    if (pubmsg.payloadlen == m->payloadlen)\n        assert(\"Good message contents\", memcmp(m->payload, pubmsg.payload, m->payloadlen) == 0,\n               \"payload was %s\", m->payload);\n}\n\n\nint check_subs_exist(MQTTClient *c, const char *test_topic, int which)\n{\n    int rc = FAILURE;\n    int wait_seconds = 0;\n\n    memset(&pubmsg, '\\0', sizeof(pubmsg));\n    pubmsg.payload = (void *)\"a much longer message that we can shorten to the extent that we need to payload up to 11\";\n    pubmsg.payloadlen = 11;\n    pubmsg.qos = QOS2;\n    pubmsg.retained = 0;\n    pubmsg.dup = 0;\n\n    test1_message_data = test2_message_data = NULL;\n    rc = MQTTPublish(c, test_topic, &pubmsg);\n    assert(\"Good rc from publish\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    /* wait for the message to be received */\n    wait_seconds = 10;\n    while (wait_seconds-- > 0)\n    {\n        MQTTYield(c, 100);\n    }\n\n    rc = (((which == 1 || which == 3) && test1_message_data) ||\n          (which == 2 && test1_message_data == NULL)) ? MQTT_SUCCESS : FAILURE;\n    assert(\"test1 subscription\", rc == MQTT_SUCCESS, \"test1_message_data %p\\n\",\n           test1_message_data);\n    rc = (((which == 2 || which == 3) && test2_message_data) ||\n          (which == 1 && test2_message_data == NULL)) ? MQTT_SUCCESS : FAILURE;\n    assert(\"test2 subscription\", rc == MQTT_SUCCESS, \"test2_message_data %p\\n\",\n           test2_message_data);\n    return rc;\n}\n\n\nint test3(struct Options options)\n{\n    enum QoS subsqos = QOS2;\n    Network n;\n    MQTTClient c;\n    int rc;\n    const char *test_topic = \"C client test3\";\n    int wait_seconds = 0;\n    unsigned char buf[100];\n    unsigned char readbuf[100];\n    MQTTConnackData connack;\n    MQTTSubackData suback;\n\n    fprintf(xml, \"<testcase classname=\\\"test3\\\" name=\\\"session state\\\"\");\n    global_start_time = start_clock();\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 3 - session state\");\n\n    NetworkInit(&n);\n    MQTTClientInit(&c, &n, 1000, buf, 100, readbuf, 100);\n\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    data.willFlag = 1;\n    data.MQTTVersion = options.MQTTVersion;\n    data.clientID.cstring = (char *)\"connack-session-state\";\n    data.username.cstring = (char *)\"testuser\";\n    data.password.cstring = (char *)\"testpassword\";\n\n    data.keepAliveInterval = 10;\n    data.cleansession = 1;\n\n    data.will.message.cstring = (char *)\"will message\";\n    data.will.qos = 1;\n    data.will.retained = 0;\n    data.will.topicName.cstring = (char *)\"will topic\";\n\n    assert(\"Not connected\", MQTTIsConnected(&c) == 0,\n           \"isconnected was %d\", MQTTIsConnected(&c));\n\n    MyLog(LOGA_DEBUG, \"Connecting\");\n    rc = NetworkConnect(&n, options.host, options.port);\n    assert(\"Good rc from TCP connect\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    if (rc != MQTT_SUCCESS)\n        goto exit;\n\n    rc = MQTTConnectWithResults(&c, &data, &connack);\n    assert(\"Good rc from connect\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    if (rc != MQTT_SUCCESS)\n        goto exit;\n\n    assert(\"Good rc in connack\", connack.rc == 0, \"rc was %d\", connack.rc);\n    assert(\"Session present is 0\", connack.sessionPresent == 0,\n           \"sessionPresent was %d\", connack.sessionPresent);\n\n    assert(\"Good rc in connack\", MQTTIsConnected(&c) == 1,\n           \"isconnected was %d\", MQTTIsConnected(&c));\n\n    rc = MQTTDisconnect(&c);\n    assert(\"Disconnect successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    NetworkDisconnect(&n);\n\n    /* reconnect with cleansession false */\n    data.cleansession = 0;\n    rc = NetworkConnect(&n, options.proxy_host, options.proxy_port);\n    assert(\"TCP connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    rc = MQTTConnectWithResults(&c, &data, &connack);\n    assert(\"Connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    assert(\"Good rc in connack\", connack.rc == 0, \"rc was %d\", connack.rc);\n    assert(\"Session present is 0\", connack.sessionPresent == 0,\n           \"sessionPresent was %d\", connack.sessionPresent);\n\n    rc = MQTTSubscribeWithResults(&c, test_topic, subsqos, messageArrived, &suback);\n    assert(\"Good rc from subscribe\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    assert(\"Granted QoS rc from subscribe\", suback.grantedQoS == QOS2,\n           \"rc was %d\", suback.grantedQoS);\n\n    check_subs_exist(&c, test_topic, 1);\n\n    rc = MQTTSubscribeWithResults(&c, test_topic, subsqos, messageArrived2, &suback);\n    assert(\"Good rc from subscribe\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    assert(\"Granted QoS rc from subscribe\", suback.grantedQoS == QOS2,\n           \"rc was %d\", suback.grantedQoS);\n\n    check_subs_exist(&c, test_topic, 2);\n\n    rc = MQTTDisconnect(&c);\n    assert(\"Disconnect successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    NetworkDisconnect(&n);\n\n    /* reconnect with cleansession false */\n    data.cleansession = 0;\n    rc = NetworkConnect(&n, options.proxy_host, options.proxy_port);\n    assert(\"TCP connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    rc = MQTTConnectWithResults(&c, &data, &connack);\n    assert(\"Connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    assert(\"Good rc in connack\", connack.rc == 0, \"rc was %d\", connack.rc);\n    assert(\"Session present is 1\", connack.sessionPresent == 1,\n           \"sessionPresent was %d\", connack.sessionPresent);\n\n    check_subs_exist(&c, test_topic, 2);\n\n    rc = MQTTSubscribeWithResults(&c, test_topic, subsqos, messageArrived, &suback);\n    assert(\"Good rc from subscribe\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    assert(\"Granted QoS rc from subscribe\", suback.grantedQoS == QOS2,\n           \"rc was %d\", suback.grantedQoS);\n\n    check_subs_exist(&c, test_topic, 1);\n\n    // cause a connection FAILURE\n    memset(&pubmsg, '\\0', sizeof(pubmsg));\n    pubmsg.payload = (void *)\"TERMINATE\";\n    pubmsg.payloadlen = strlen((char *)pubmsg.payload);\n    pubmsg.qos = QOS0;\n    pubmsg.retained = 0;\n    pubmsg.dup = 0;\n    rc = MQTTPublish(&c, \"MQTTSAS topic\", &pubmsg);\n    assert(\"Good rc from publish\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    // wait for failure to be noticed by keepalive\n    wait_seconds = 20;\n    while (MQTTIsConnected(&c) && (wait_seconds-- > 0))\n    {\n        MQTTYield(&c, 1000);\n    }\n    assert(\"Disconnected\", !MQTTIsConnected(&c), \"isConnected was %d\",\n           MQTTIsConnected(&c));\n    NetworkDisconnect(&n);\n\n    /* reconnect with cleansession false */\n    data.cleansession = 0;\n    rc = NetworkConnect(&n, options.host, options.port);\n    assert(\"TCP connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    rc = MQTTConnectWithResults(&c, &data, &connack);\n    assert(\"Connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    assert(\"Good rc in connack\", connack.rc == 0, \"rc was %d\", connack.rc);\n    assert(\"Session present is 1\", connack.sessionPresent == 1,\n           \"sessionPresent was %d\", connack.sessionPresent);\n\n    check_subs_exist(&c, test_topic, 1);\n\n    rc = MQTTSubscribeWithResults(&c, test_topic, subsqos, messageArrived2, &suback);\n    assert(\"Good rc from subscribe\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    assert(\"Granted QoS rc from subscribe\", suback.grantedQoS == QOS2,\n           \"rc was %d\", suback.grantedQoS);\n\n    check_subs_exist(&c, test_topic, 2);\n\n    rc = MQTTDisconnect(&c);\n    assert(\"Disconnect successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    NetworkDisconnect(&n);\n\n    /* reconnect with cleansession true to clean up both server and client state */\n    data.cleansession = 1;\n    rc = NetworkConnect(&n, options.host, options.port);\n    assert(\"TCP connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    rc = MQTTConnectWithResults(&c, &data, &connack);\n    assert(\"Connect successful\",  rc == MQTT_SUCCESS, \"rc was %d\", rc);\n\n    assert(\"Good rc in connack\", connack.rc == 0, \"rc was %d\", connack.rc);\n    assert(\"Session present is 0\", connack.sessionPresent == 0,\n           \"sessionPresent was %d\", connack.sessionPresent);\n\n    rc = MQTTSubscribeWithResults(&c, test_topic, subsqos, messageArrived2, &suback);\n    assert(\"Good rc from subscribe\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    assert(\"Granted QoS rc from subscribe\", suback.grantedQoS == QOS2,\n           \"rc was %d\", suback.grantedQoS);\n\n    check_subs_exist(&c, test_topic, 2);\n\n    rc = MQTTDisconnect(&c);\n    assert(\"Disconnect successful\", rc == MQTT_SUCCESS, \"rc was %d\", rc);\n    NetworkDisconnect(&n);\n\nexit:\n    MyLog(LOGA_INFO, \"TEST2: test %s. %d tests run, %d failures.\",\n          (failures == 0) ? \"passed\" : \"failed\", tests, failures);\n    write_test_result();\n    return failures;\n}\n\n#if 0\n/*********************************************************************\n\nTest 4: connectionLost and will message\n\n*********************************************************************/\nMQTTClient test6_c1, test6_c2;\nvolatile int test6_will_message_arrived = 0;\nvolatile int test6_connection_lost_called = 0;\n\nvoid test6_connectionLost(void *context, char *cause)\n{\n    MQTTClient c = (MQTTClient)context;\n    printf(\"%s -> Callback: connection lost\\n\", (c == test6_c1) ? \"Client-1\" : \"Client-2\");\n    test6_connection_lost_called = 1;\n}\n\nvoid test6_deliveryComplete(void *context, MQTTClient_deliveryToken token)\n{\n    printf(\"Client-2 -> Callback: publish complete for token %d\\n\", token);\n}\n\nchar *test6_will_topic = \"C Test 2: will topic\";\nchar *test6_will_message = \"will message from Client-1\";\n\nint test6_messageArrived(void *context, char *topicName, int topicLen, MQTTClient_message *m)\n{\n    MQTTClient c = (MQTTClient)context;\n    printf(\"%s -> Callback: message received on topic '%s' is '%.*s'.\\n\",\n           (c == test6_c1) ? \"Client-1\" : \"Client-2\", topicName, m->payloadlen, (char *)(m->payload));\n    if (c == test6_c2 && strcmp(topicName, test6_will_topic) == 0 && memcmp(m->payload, test6_will_message, m->payloadlen) == 0)\n        test6_will_message_arrived = 1;\n    MQTTClient_free(topicName);\n    MQTTClient_freeMessage(&m);\n    return 1;\n}\n\n\nint test6(struct Options options)\n{\n    char *testname = \"test6\";\n    MQTTClient_connectOptions opts = MQTTClient_connectOptions_initializer;\n    MQTTClient_willOptions wopts =  MQTTClient_willOptions_initializer;\n    MQTTClient_connectOptions opts2 = MQTTClient_connectOptions_initializer;\n    int rc, count;\n    char *mqttsas_topic = \"MQTTSAS topic\";\n\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 6 - connectionLost and will messages\");\n    fprintf(xml, \"<testcase classname=\\\"test1\\\" name=\\\"connectionLost and will messages\\\"\");\n    global_start_time = start_clock();\n\n    opts.keepAliveInterval = 2;\n    opts.cleansession = 1;\n    opts.MQTTVersion = MQTTVERSION_3_1_1;\n    opts.will = &wopts;\n    opts.will->message = test6_will_message;\n    opts.will->qos = 1;\n    opts.will->retained = 0;\n    opts.will->topicName = test6_will_topic;\n    if (options.haconnections != NULL)\n    {\n        opts.serverURIs = options.haconnections;\n        opts.serverURIcount = options.hacount;\n    }\n\n    /* Client-1 with Will options */\n    rc = MQTTClient_create(&test6_c1, options.proxy_connection, \"Client_1\", MQTTCLIENT_PERSISTENCE_DEFAULT, NULL);\n    assert(\"good rc from create\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n    if (rc != MQTTCLIENT_SUCCESS)\n        goto exit;\n\n    rc = MQTTClient_setCallbacks(test6_c1, (void *)test6_c1, test6_connectionLost, test6_messageArrived, test6_deliveryComplete);\n    assert(\"good rc from setCallbacks\",  rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n    if (rc != MQTTCLIENT_SUCCESS)\n        goto exit;\n\n    /* Connect to the broker */\n    rc = MQTTClient_connect(test6_c1, &opts);\n    assert(\"good rc from connect\",  rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n    if (rc != MQTTCLIENT_SUCCESS)\n        goto exit;\n\n    /* Client - 2 (multi-threaded) */\n    rc = MQTTClient_create(&test6_c2, options.connection, \"Client_2\", MQTTCLIENT_PERSISTENCE_DEFAULT, NULL);\n    assert(\"good rc from create\",  rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n\n    /* Set the callback functions for the client */\n    rc = MQTTClient_setCallbacks(test6_c2, (void *)test6_c2, test6_connectionLost, test6_messageArrived, test6_deliveryComplete);\n    assert(\"good rc from setCallbacks\",  rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n\n    /* Connect to the broker */\n    opts2.keepAliveInterval = 20;\n    opts2.cleansession = 1;\n    MyLog(LOGA_INFO, \"Connecting Client_2 ...\");\n    rc = MQTTClient_connect(test6_c2, &opts2);\n    assert(\"Good rc from connect\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n\n    rc = MQTTClient_subscribe(test6_c2, test6_will_topic, 2);\n    assert(\"Good rc from subscribe\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n\n    /* now send the command which will break the connection and cause the will message to be sent */\n    rc = MQTTClient_publish(test6_c1, mqttsas_topic, (int)strlen(\"TERMINATE\"), \"TERMINATE\", 0, 0, NULL);\n    assert(\"Good rc from publish\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n\n    MyLog(LOGA_INFO, \"Waiting to receive the will message\");\n    count = 0;\n    while (++count < 40)\n    {\n#if defined(WIN32)\n        Sleep(1000L);\n#else\n        sleep(1);\n#endif\n        if (test6_will_message_arrived == 1 && test6_connection_lost_called == 1)\n            break;\n    }\n    assert(\"will message arrived\", test6_will_message_arrived == 1,\n           \"will_message_arrived was %d\\n\", test6_will_message_arrived);\n    assert(\"connection lost called\", test6_connection_lost_called == 1,\n           \"connection_lost_called %d\\n\", test6_connection_lost_called);\n\n    rc = MQTTClient_unsubscribe(test6_c2, test6_will_topic);\n    assert(\"Good rc from unsubscribe\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\", rc);\n\n    rc = MQTTClient_isConnected(test6_c2);\n    assert(\"Client-2 still connected\", rc == 1, \"isconnected is %d\", rc);\n\n    rc = MQTTClient_isConnected(test6_c1);\n    assert(\"Client-1 not connected\", rc == 0, \"isconnected is %d\", rc);\n\n    rc = MQTTClient_disconnect(test6_c2, 100L);\n    assert(\"Good rc from disconnect\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\", rc);\n\n    MQTTClient_destroy(&test6_c1);\n    MQTTClient_destroy(&test6_c2);\n\nexit:\n    MyLog(LOGA_INFO, \"%s: test %s. %d tests run, %d failures.\\n\",\n          (failures == 0) ? \"passed\" : \"failed\", testname, tests, failures);\n    write_test_result();\n    return failures;\n}\n\n\nint test6a(struct Options options)\n{\n    char *testname = \"test6a\";\n    MQTTClient_connectOptions opts = MQTTClient_connectOptions_initializer;\n    MQTTClient_willOptions wopts =  MQTTClient_willOptions_initializer;\n    MQTTClient_connectOptions opts2 = MQTTClient_connectOptions_initializer;\n    int rc, count;\n    char *mqttsas_topic = \"MQTTSAS topic\";\n\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 6 - connectionLost and binary will messages\");\n    fprintf(xml, \"<testcase classname=\\\"test1\\\" name=\\\"connectionLost and binary will messages\\\"\");\n    global_start_time = start_clock();\n\n    opts.keepAliveInterval = 2;\n    opts.cleansession = 1;\n    opts.MQTTVersion = MQTTVERSION_3_1_1;\n    opts.will = &wopts;\n    opts.will->payload.data = test6_will_message;\n    opts.will->payload.len = strlen(test6_will_message) + 1;\n    opts.will->qos = 1;\n    opts.will->retained = 0;\n    opts.will->topicName = test6_will_topic;\n    if (options.haconnections != NULL)\n    {\n        opts.serverURIs = options.haconnections;\n        opts.serverURIcount = options.hacount;\n    }\n\n    /* Client-1 with Will options */\n    rc = MQTTClient_create(&test6_c1, options.proxy_connection, \"Client_1\", MQTTCLIENT_PERSISTENCE_DEFAULT, NULL);\n    assert(\"good rc from create\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n    if (rc != MQTTCLIENT_SUCCESS)\n        goto exit;\n\n    rc = MQTTClient_setCallbacks(test6_c1, (void *)test6_c1, test6_connectionLost, test6_messageArrived, test6_deliveryComplete);\n    assert(\"good rc from setCallbacks\",  rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n    if (rc != MQTTCLIENT_SUCCESS)\n        goto exit;\n\n    /* Connect to the broker */\n    rc = MQTTClient_connect(test6_c1, &opts);\n    assert(\"good rc from connect\",  rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n    if (rc != MQTTCLIENT_SUCCESS)\n        goto exit;\n\n    /* Client - 2 (multi-threaded) */\n    rc = MQTTClient_create(&test6_c2, options.connection, \"Client_2\", MQTTCLIENT_PERSISTENCE_DEFAULT, NULL);\n    assert(\"good rc from create\",  rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n\n    /* Set the callback functions for the client */\n    rc = MQTTClient_setCallbacks(test6_c2, (void *)test6_c2, test6_connectionLost, test6_messageArrived, test6_deliveryComplete);\n    assert(\"good rc from setCallbacks\",  rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n\n    /* Connect to the broker */\n    opts2.keepAliveInterval = 20;\n    opts2.cleansession = 1;\n    MyLog(LOGA_INFO, \"Connecting Client_2 ...\");\n    rc = MQTTClient_connect(test6_c2, &opts2);\n    assert(\"Good rc from connect\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n\n    rc = MQTTClient_subscribe(test6_c2, test6_will_topic, 2);\n    assert(\"Good rc from subscribe\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n\n    /* now send the command which will break the connection and cause the will message to be sent */\n    rc = MQTTClient_publish(test6_c1, mqttsas_topic, (int)strlen(\"TERMINATE\"), \"TERMINATE\", 0, 0, NULL);\n    assert(\"Good rc from publish\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\\n\", rc);\n\n    MyLog(LOGA_INFO, \"Waiting to receive the will message\");\n    count = 0;\n    while (++count < 40)\n    {\n#if defined(WIN32)\n        Sleep(1000L);\n#else\n        sleep(1);\n#endif\n        if (test6_will_message_arrived == 1 && test6_connection_lost_called == 1)\n            break;\n    }\n    assert(\"will message arrived\", test6_will_message_arrived == 1,\n           \"will_message_arrived was %d\\n\", test6_will_message_arrived);\n    assert(\"connection lost called\", test6_connection_lost_called == 1,\n           \"connection_lost_called %d\\n\", test6_connection_lost_called);\n\n    rc = MQTTClient_unsubscribe(test6_c2, test6_will_topic);\n    assert(\"Good rc from unsubscribe\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\", rc);\n\n    rc = MQTTClient_isConnected(test6_c2);\n    assert(\"Client-2 still connected\", rc == 1, \"isconnected is %d\", rc);\n\n    rc = MQTTClient_isConnected(test6_c1);\n    assert(\"Client-1 not connected\", rc == 0, \"isconnected is %d\", rc);\n\n    rc = MQTTClient_disconnect(test6_c2, 100L);\n    assert(\"Good rc from disconnect\", rc == MQTTCLIENT_SUCCESS, \"rc was %d\", rc);\n\n    MQTTClient_destroy(&test6_c1);\n    MQTTClient_destroy(&test6_c2);\n\nexit:\n    MyLog(LOGA_INFO, \"%s: test %s. %d tests run, %d failures.\\n\",\n          (failures == 0) ? \"passed\" : \"failed\", testname, tests, failures);\n    write_test_result();\n    return failures;\n}\n#endif\n\nint main(int argc, char **argv)\n{\n    int rc = 0;\n    int (*tests[])() = {NULL, test1, test2, test3};\n    int i;\n\n    xml = fopen(\"TEST-test1.xml\", \"w\");\n    fprintf(xml, \"<testsuite name=\\\"test1\\\" tests=\\\"%d\\\">\\n\", (int)(ARRAY_SIZE(tests) - 1));\n\n    getopts(argc, argv);\n\n    for (i = 0; i < options.iterations; ++i)\n    {\n        if (options.test_no == 0)\n        {\n            /* run all the tests */\n            for (options.test_no = 1; options.test_no < ARRAY_SIZE(tests); ++options.test_no)\n                rc += tests[options.test_no](options); /* return number of failures.  0 = test succeeded */\n        }\n        else\n            rc = tests[options.test_no](options); /* run just the selected test */\n    }\n\n    if (rc == 0)\n        MyLog(LOGA_INFO, \"verdict pass\");\n    else\n        MyLog(LOGA_INFO, \"verdict fail\");\n\n    fprintf(xml, \"</testsuite>\\n\");\n    fclose(xml);\n    return rc;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/CMakeLists.txt",
    "content": "#*******************************************************************************\n#  Copyright (c) 2017 IBM Corp.\n#\n#  All rights reserved. This program and the accompanying materials\n#  are made available under the terms of the Eclipse Public License v1.0\n#  and Eclipse Distribution License v1.0 which accompany this distribution.\n#\n#  The Eclipse Public License is available at\n#     http://www.eclipse.org/legal/epl-v10.html\n#  and the Eclipse Distribution License is available at\n#    http://www.eclipse.org/org/documents/edl-v10.php.\n#\n#  Contributors:\n#     Ian Craggs - initial version\n#*******************************************************************************/\n\nproject(\"paho-mqttpacket\" C)\n\nADD_SUBDIRECTORY(src)\nADD_SUBDIRECTORY(samples)\nADD_SUBDIRECTORY(test)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/CMakeLists.txt",
    "content": "#*******************************************************************************\n#  Copyright (c) 2017 IBM Corp.\n#\n#  All rights reserved. This program and the accompanying materials\n#  are made available under the terms of the Eclipse Public License v1.0\n#  and Eclipse Distribution License v1.0 which accompany this distribution.\n#\n#  The Eclipse Public License is available at\n#     http://www.eclipse.org/legal/epl-v10.html\n#  and the Eclipse Distribution License is available at\n#    http://www.eclipse.org/org/documents/edl-v10.php.\n#\n#  Contributors:\n#     Ian Craggs - initial version\n#*******************************************************************************/\n\n# Samples\n\ninclude_directories(../src)\n\nadd_executable(\n  pub0sub1\n  pub0sub1.c transport.c\n)\ntarget_link_libraries(pub0sub1 paho-embed-mqtt3c)\n\nadd_executable(\n  pub0sub1_nb\n  pub0sub1_nb.c transport.c\n)\ntarget_link_libraries(pub0sub1_nb paho-embed-mqtt3c)\n\nadd_executable(\n  qos0pub\n  qos0pub.c transport.c\n)\ntarget_link_libraries(qos0pub paho-embed-mqtt3c)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/baremetalserial/build",
    "content": "gcc -g -Wall pub0sub1_nb.c transport.c -I ../../src ../../src/MQTTConnectClient.c ../../src/MQTTSerializePublish.c ../../src/MQTTPacket.c ../../src/MQTTSubscribeClient.c -o pub0sub1_nb ../../src/MQTTDeserializePublish.c ../../src/MQTTConnectServer.c ../../src/MQTTSubscribeServer.c ../../src/MQTTUnsubscribeServer.c ../../src/MQTTUnsubscribeClient.c\ngcc -g -Wall ping_nb.c transport.c -I ../../src ../../src/MQTTConnectClient.c ../../src/MQTTPacket.c -o ping_nb\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/baremetalserial/ping_nb.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Sergio R. Caprile\n *******************************************************************************/\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"MQTTPacket.h\"\n#include \"transport.h\"\n\n#define KEEPALIVE_INTERVAL 20\n\n/* This is to get a timebase in seconds to test the sample */\n#include <time.h>\ntime_t old_t;\nvoid start_ping_timer(void)\n{\n    time(&old_t);\n    old_t += KEEPALIVE_INTERVAL / 2 + 1;\n}\n\nint time_to_ping(void)\n{\n    time_t t;\n\n    time(&t);\n    if(t >= old_t)\n        return 1;\n    return 0;\n}\n\n/* This is in order to get an asynchronous signal to stop the sample,\nas the code loops waiting for msgs on the subscribed topic.\nYour actual code will depend on your hw and approach, but this sample can be\nrun on Linux so debugging of the non-hardware specific bare metal code is easier.\nSee at bottom of file for details */\n#include <signal.h>\n\nint toStop = 0;\n\nvoid stop_init(void);\n/* */\n\n/* Same as above, we provide a set of functions to test/debug on a friendlier system;\nthe init() and  close() actions on the serial are just for this, you will probably\nhandle this on whatever handles your media in your application */\nvoid sampleserial_init(void);\nvoid sampleserial_close(void);\nint samplesend(unsigned char *address, unsigned int bytes);\nint samplerecv(unsigned char *address, unsigned int maxbytes);\n/* */\n\n/* You will use your hardware specifics here, see transport.h. */\nstatic transport_iofunctions_t iof = {samplesend, samplerecv};\n\nenum states { IDLE, SENDPING, GETPONG };\n\nint main(int argc, char *argv[])\n{\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    int rc = 0;\n    int mysock = 0;\n    unsigned char buf[200];\n    int buflen = sizeof(buf);\n    int len = 0;\n    MQTTTransport mytransport;\n    int state;\n\n    stop_init();\n    sampleserial_init();\n\n    mysock = transport_open(&iof);\n    if(mysock < 0)\n        return mysock;\n    /* You will (or already are) 'somehow' connect(ed) to host:port via your hardware specifics. E.g.:\n    \tyou have a serial (RS-232/UART) link\n    \tyou have a cell modem and you issue your AT+ magic\n    \tyou have some TCP/IP which is not lwIP (nor a full-fledged socket compliant one)\n    \t and you TCP connect\n    */\n\n    mytransport.sck = &mysock;\n    mytransport.getfn = transport_getdatanb;\n    mytransport.state = 0;\n    data.clientID.cstring = \"me\";\n    data.keepAliveInterval = KEEPALIVE_INTERVAL;\n    data.cleansession = 1;\n    data.username.cstring = \"testuser\";\n    data.password.cstring = \"testpassword\";\n\n    len = MQTTSerialize_connect(buf, buflen, &data);\n    /* This one blocks until it finishes sending, you will probably not want this in real life,\n    in such a case replace this call by a scheme similar to the one you'll see in the main loop */\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\n    printf(\"Sent MQTT connect\\n\");\n    /* wait for connack */\n    do\n    {\n        int frc;\n        if ((frc = MQTTPacket_readnb(buf, buflen, &mytransport)) == CONNACK)\n        {\n            unsigned char sessionPresent, connack_rc;\n            if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)\n            {\n                printf(\"Unable to connect, return code %d\\n\", connack_rc);\n                goto exit;\n            }\n            break;\n        }\n        else if (frc == -1)\n            goto exit;\n    }\n    while (1);   /* handle timeouts here */\n\n    printf(\"MQTT connected\\n\");\n    start_ping_timer();\n    state = IDLE;\n    while (!toStop)\n    {\n        switch(state)\n        {\n        case IDLE:\n            if(time_to_ping())\n            {\n                len = MQTTSerialize_pingreq(buf, buflen);\n                transport_sendPacketBuffernb_start(mysock, buf, len);\n                state = SENDPING;\n            }\n            break;\n        case SENDPING:\n            switch(transport_sendPacketBuffernb(mysock))\n            {\n            case TRANSPORT_DONE:\n                printf(\"Ping...\");\n                start_ping_timer();\n                state = GETPONG;\n                break;\n            case TRANSPORT_ERROR:\n                /* handle any I/O errors here */\n                goto exit;\n                break;\n            case TRANSPORT_AGAIN:\n            default:\n                /* handle timeouts here, not probable unless there is a hardware problem */\n                break;\n            }\n            break;\n        case GETPONG:\n            if((rc = MQTTPacket_readnb(buf, buflen, &mytransport)) == PINGRESP)\n            {\n                printf(\"Pong\\n\");\n                start_ping_timer();\n                state = IDLE;\n            }\n            else if(rc == -1)\n            {\n                /* handle I/O errors here */\n                printf(\"OOPS\\n\");\n                goto exit;\n            }\t/* handle timeouts here */\n            break;\n        }\n    }\n\n    printf(\"disconnecting\\n\");\n    len = MQTTSerialize_disconnect(buf, buflen);\n    /* Same blocking related stuff here */\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\nexit:\n    transport_close(mysock);\n\n    sampleserial_close();\n    return 0;\n}\n\n\n/* To stop the sample */\nvoid cfinish(int sig)\n{\n    signal(SIGINT, NULL);\n    toStop = 1;\n}\n\nvoid stop_init(void)\n{\n    signal(SIGINT, cfinish);\n    signal(SIGTERM, cfinish);\n}\n\n/* Serial hack:\nSimulate serial transfers on an established TCP connection\n */\n#include <unistd.h>\n#include <errno.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <fcntl.h>\n\nstatic int sockfd;\n\nvoid sampleserial_init(void)\n{\n    struct sockaddr_in serv_addr;\n\n\n    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)\n    {\n        perror(NULL);\n        exit(2);\n    }\n    serv_addr.sin_family = AF_INET;\n    serv_addr.sin_addr.s_addr = inet_addr(\"198.41.30.241\");\n    serv_addr.sin_port = htons(1883);\n    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)\n    {\n        printf(\"ERROR connecting\\n\");\n        exit(-1);\n    }\n    printf(\"- TCP Connected to Eclipse\\n\");\n    /* set to non-blocking */\n    fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL) | O_NONBLOCK);\n}\n\nvoid sampleserial_close(void)\n{\n    close(sockfd);\n}\n\nint samplesend(unsigned char *address, unsigned int bytes)\n{\n    int len;\n\n    if(rand() > (RAND_MAX / 2))\t// 50% probability of being busy\n        return 0;\n    if(rand() > (RAND_MAX / 2)) \t// 50% probability of sending half the requested data (no room in buffer)\n    {\n        if(bytes > 1)\n            bytes /= 2;\n    }\n    if((len = write(sockfd, address, bytes)) >= 0)\n        return len;\n    if(errno == EAGAIN)\n        return 0;\n    return -1;\n}\n\nint samplerecv(unsigned char *address, unsigned int maxbytes)\n{\n    int len;\n\n    if(rand() > (RAND_MAX / 2))\t// 50% probability of no data\n        return 0;\n    if(rand() > (RAND_MAX / 2)) \t// 50% probability of getting half the requested data (not arrived yet)\n    {\n        if(maxbytes > 1)\n        {\n            maxbytes /= 2;\n        }\n    }\n    if((len = read(sockfd, address, maxbytes)) >= 0)\n        return len;\n    if(errno == EAGAIN)\n        return 0;\n    return -1;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/baremetalserial/pub0sub1_nb.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - port to the bare metal environment\n *******************************************************************************/\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"MQTTPacket.h\"\n#include \"transport.h\"\n\n/* This is in order to get an asynchronous signal to stop the sample,\nas the code loops waiting for msgs on the subscribed topic.\nYour actual code will depend on your hw and approach, but this sample can be\nrun on Linux so debugging of the non-hardware specific bare metal code is easier.\nSee at bottom of file for details */\n#include <signal.h>\n\nint toStop = 0;\n\nvoid stop_init(void);\n/* */\n\n/* Same as above, we provide a set of functions to test/debug on a friendlier system;\nthe init() and  close() actions on the serial are just for this, you will probably\nhandle this on whatever handles your media in your application */\nvoid sampleserial_init(void);\nvoid sampleserial_close(void);\nint samplesend(unsigned char *address, unsigned int bytes);\nint samplerecv(unsigned char *address, unsigned int maxbytes);\n/* */\n\n/* You will use your hardware specifics here, see transport.h. */\nstatic transport_iofunctions_t iof = {samplesend, samplerecv};\n\nenum states { READING, PUBLISHING };\n\nint main(int argc, char *argv[])\n{\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    int rc = 0;\n    int mysock = 0;\n    unsigned char buf[200];\n    int buflen = sizeof(buf);\n    int msgid = 1;\n    MQTTString topicString = MQTTString_initializer;\n    int req_qos = 0;\n    char *payload = \"mypayload\";\n    int payloadlen = strlen(payload);\n    int len = 0;\n    MQTTTransport mytransport;\n    int state = READING;\n\n    stop_init();\n    sampleserial_init();\n\n    mysock = transport_open(&iof);\n    if(mysock < 0)\n        return mysock;\n    /* You will (or already are) 'somehow' connect(ed) to host:port via your hardware specifics. E.g.:\n    \tyou have a serial (RS-232/UART) link\n    \tyou have a cell modem and you issue your AT+ magic\n    \tyou have some TCP/IP which is not lwIP (nor a full-fledged socket compliant one)\n    \t and you TCP connect\n    */\n\n    mytransport.sck = &mysock;\n    mytransport.getfn = transport_getdatanb;\n    mytransport.state = 0;\n    data.clientID.cstring = \"me\";\n    data.keepAliveInterval = 20;\n    data.cleansession = 1;\n    data.username.cstring = \"testuser\";\n    data.password.cstring = \"testpassword\";\n\n    len = MQTTSerialize_connect(buf, buflen, &data);\n    /* This one blocks until it finishes sending, you will probably not want this in real life,\n    in such a case replace this call by a scheme similar to the one you'll see in the main loop */\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\n    printf(\"Sent MQTT connect\\n\");\n    /* wait for connack */\n    do\n    {\n        int frc;\n        if ((frc = MQTTPacket_readnb(buf, buflen, &mytransport)) == CONNACK)\n        {\n            unsigned char sessionPresent, connack_rc;\n            if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)\n            {\n                printf(\"Unable to connect, return code %d\\n\", connack_rc);\n                goto exit;\n            }\n            break;\n        }\n        else if (frc == -1)\n            goto exit;\n    }\n    while (1);   /* handle timeouts here */\n\n    printf(\"MQTT connected\\n\");\n    /* subscribe */\n    topicString.cstring = \"substopic\";\n    len = MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos);\n\n    /* This is equivalent to the one above, but using the non-blocking functions. You will probably not want this in real life,\n    in such a case replace this call by a scheme similar to the one you'll see in the main loop */\n    transport_sendPacketBuffernb_start(mysock, buf, len);\n    while((rc = transport_sendPacketBuffernb(mysock)) != TRANSPORT_DONE);\n    do\n    {\n        int frc;\n        if ((frc = MQTTPacket_readnb(buf, buflen, &mytransport)) == SUBACK) /* wait for suback */\n        {\n            unsigned short submsgid;\n            int subcount;\n            int granted_qos;\n\n            rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen);\n            if (granted_qos != 0)\n            {\n                printf(\"granted qos != 0, %d\\n\", granted_qos);\n                goto exit;\n            }\n            break;\n        }\n        else if (frc == -1)\n            goto exit;\n    }\n    while (1);   /* handle timeouts here */\n    printf(\"Subscribed\\n\");\n\n    /* loop getting msgs on subscribed topic */\n    topicString.cstring = \"pubtopic\";\n    state = READING;\n    while (!toStop)\n    {\n        /* do other stuff here */\n        switch(state)\n        {\n        case READING:\n            if((rc = MQTTPacket_readnb(buf, buflen, &mytransport)) == PUBLISH)\n            {\n                unsigned char dup;\n                int qos;\n                unsigned char retained;\n                unsigned short msgid;\n                int payloadlen_in;\n                unsigned char *payload_in;\n                int rc;\n                MQTTString receivedTopic;\n\n                rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic,\n                                             &payload_in, &payloadlen_in, buf, buflen);\n                printf(\"message arrived %.*s\\n\", payloadlen_in, payload_in);\n                printf(\"publishing reading\\n\");\n                state = PUBLISHING;\n                len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, (unsigned char *)payload, payloadlen);\n                transport_sendPacketBuffernb_start(mysock, buf, len);\n            }\n            else if(rc == -1)\n            {\n                /* handle I/O errors here */\n                goto exit;\n            }\t/* handle timeouts here */\n            break;\n        case PUBLISHING:\n            switch(transport_sendPacketBuffernb(mysock))\n            {\n            case TRANSPORT_DONE:\n                printf(\"Published\\n\");\n                state = READING;\n                break;\n            case TRANSPORT_ERROR:\n                /* handle any I/O errors here */\n                goto exit;\n                break;\n            case TRANSPORT_AGAIN:\n            default:\n                /* handle timeouts here, not probable unless there is a hardware problem */\n                break;\n            }\n            break;\n        }\n    }\n\n    printf(\"disconnecting\\n\");\n    len = MQTTSerialize_disconnect(buf, buflen);\n    /* Same blocking related stuff here */\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\nexit:\n    transport_close(mysock);\n\n    sampleserial_close();\n    return 0;\n}\n\n\n/* To stop the sample */\nvoid cfinish(int sig)\n{\n    signal(SIGINT, NULL);\n    toStop = 1;\n}\n\nvoid stop_init(void)\n{\n    signal(SIGINT, cfinish);\n    signal(SIGTERM, cfinish);\n}\n\n/* Serial hack:\nSimulate serial transfers on an established TCP connection\n */\n#include <unistd.h>\n#include <errno.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <fcntl.h>\n\nstatic int sockfd;\n\nvoid sampleserial_init(void)\n{\n    struct sockaddr_in serv_addr;\n\n\n    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)\n    {\n        perror(NULL);\n        exit(2);\n    }\n    serv_addr.sin_family = AF_INET;\n    serv_addr.sin_addr.s_addr = inet_addr(\"198.41.30.241\");\n    serv_addr.sin_port = htons(1883);\n    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)\n    {\n        printf(\"ERROR connecting\\n\");\n        exit(-1);\n    }\n    printf(\"- TCP Connected to Eclipse\\n\");\n    /* set to non-blocking */\n    fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFL) | O_NONBLOCK);\n}\n\nvoid sampleserial_close(void)\n{\n    close(sockfd);\n}\n\nint samplesend(unsigned char *address, unsigned int bytes)\n{\n    int len;\n\n    if(rand() > (RAND_MAX / 2))\t// 50% probability of being busy\n        return 0;\n    if(rand() > (RAND_MAX / 2)) \t// 50% probability of sending half the requested data (no room in buffer)\n    {\n        if(bytes > 1)\n            bytes /= 2;\n    }\n    if((len = write(sockfd, address, bytes)) >= 0)\n        return len;\n    if(errno == EAGAIN)\n        return 0;\n    return -1;\n}\n\nint samplerecv(unsigned char *address, unsigned int maxbytes)\n{\n    int len;\n\n    if(rand() > (RAND_MAX / 2))\t// 50% probability of no data\n        return 0;\n    if(rand() > (RAND_MAX / 2)) \t// 50% probability of getting half the requested data (not arrived yet)\n    {\n        if(maxbytes > 1)\n        {\n            maxbytes /= 2;\n        }\n    }\n    if((len = read(sockfd, address, maxbytes)) >= 0)\n        return len;\n    if(errno == EAGAIN)\n        return 0;\n    return -1;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/baremetalserial/transport.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - port to the bare metal environment and serial media specifics\n *******************************************************************************/\n\n/** By the way, this is a nice bare bones example, easier to expand to whatever non-OS\nmedia you might have */\n\n#include <stdint.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <assert.h>\n#include \"transport.h\"\n\n/**\nThis simple low-level implementation assumes a single connection for a single thread. Thus, single static\nvariables are used for that connection.\nOn other scenarios, you might want to put all these variables into a structure and index via the 'sock'\nparameter, as some functions show in the comments\nThe blocking rx function is not supported.\nIf you plan on writing one, take into account that the current implementation of\nMQTTPacket_read() has a function pointer for a function call to get the data to a buffer, but no provisions\nto know the caller or other indicator (the socket id): int (*getfn)(unsigned char*, int)\n*/\nstatic transport_iofunctions_t *io = NULL;\nstatic unsigned char *from = NULL;\t\t// to keep track of data sending\nstatic int howmany;\t\t\t\t// ditto\n\n\nvoid transport_sendPacketBuffernb_start(int sock, unsigned char *buf, int buflen)\n{\n    from = buf;\t\t\t// from[sock] or mystruct[sock].from\n    howmany = buflen;\t\t// myhowmany[sock] or mystruct[sock].howmany\n}\n\nint transport_sendPacketBuffernb(int sock)\n{\n    transport_iofunctions_t *myio = io;\t// io[sock] or mystruct[sock].io\n    int len;\n\n    /* you should have called open() with a valid pointer to a valid struct and\n    called sendPacketBuffernb_start with a valid buffer, before calling this */\n    assert((myio != NULL) && (myio->send != NULL) && (from != NULL));\n    if((len = myio->send(from, howmany)) > 0)\n    {\n        from += len;\n        if((howmany -= len) <= 0)\n        {\n            return TRANSPORT_DONE;\n        }\n    }\n    else if(len < 0)\n    {\n        return TRANSPORT_ERROR;\n    }\n    return TRANSPORT_AGAIN;\n}\n\nint transport_sendPacketBuffer(int sock, unsigned char *buf, int buflen)\n{\n    int rc;\n\n    transport_sendPacketBuffernb_start(sock, buf, buflen);\n    while((rc = transport_sendPacketBuffernb(sock)) == TRANSPORT_AGAIN)\n    {\n        /* this is unlikely to loop forever unless there is a hardware problem */\n    }\n    if(rc == TRANSPORT_DONE)\n    {\n        return buflen;\n    }\n    return TRANSPORT_ERROR;\n}\n\n\nint transport_getdata(unsigned char *buf, int count)\n{\n    assert(0);\t\t/* This function is NOT supported, it is just here to tease you */\n    return TRANSPORT_ERROR;\t/* nah, it is here for similarity with other transport examples */\n}\n\nint transport_getdatanb(void *sck, unsigned char *buf, int count)\n{\n    //int sock = *((int *)sck); \t\t/* sck: pointer to whatever the system may use to identify the transport */\n    transport_iofunctions_t *myio = io;\t// io[sock] or mystruct[sock].io\n    int len;\n\n    /* you should have called open() with a valid pointer to a valid struct before calling this */\n    assert((myio != NULL) && (myio->recv != NULL));\n    /* this call will return immediately if no bytes, or return whatever outstanding bytes we have,\n     upto count */\n    if((len = myio->recv(buf, count)) >= 0)\n        return len;\n    return TRANSPORT_ERROR;\n}\n\n/**\nreturn >=0 for a connection descriptor, <0 for an error code\n*/\nint transport_open(transport_iofunctions_t *thisio)\n{\n    int idx = 0;\t// for multiple connections, you might, basically turn myio into myio[MAX_CONNECTIONS],\n\n    //if((idx=assignidx()) >= MAX_CONNECTIONS)\t// somehow assign an index,\n    //\treturn TRANSPORT_ERROR;\n    io = thisio;\t\t\t\t\t// store myio[idx] = thisio, or mystruct[idx].io = thisio,\n    return idx;\t\t\t\t\t// and return the index used\n}\n\nint transport_close(int sock)\n{\n    int rc = TRANSPORT_DONE;\n\n    return rc;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/baremetalserial/transport.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - media specifics, nice api doc :^)\n *******************************************************************************/\n\ntypedef struct {\n\tint (*send)(unsigned char *address, unsigned int bytes); \t///< pointer to function to send 'bytes' bytes, returns the actual number of bytes sent\n\tint (*recv)(unsigned char *address, unsigned int maxbytes); \t///< pointer to function to receive upto 'maxbytes' bytes, returns the actual number of bytes copied\n} transport_iofunctions_t;\n\n#define TRANSPORT_DONE\t1\n#define TRANSPORT_AGAIN\t0\n#define TRANSPORT_ERROR\t-1\n/**\n@note Blocks until requested buflen is sent\n*/\nint transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen);\n/**\n@note Blocks until requested count is received, as MQTTPacket_read() expects\n@warning This function is not supported (not implemented)\n@warning unless you provide a timeout, this function can block forever. Socket based systems do have\na built in timeout, if your system can provide this, do modify this function, otherwise use getdatanb() instead\n@returns number of bytes read\n*/\nint transport_getdata(unsigned char* buf, int count);\n\n/**\nThis is a bare metal implementation, so we must have non-blocking functions,\nthe process of pumping to serial lines can result a bit slow and we don't want to busy wait.\nThis function starts the process, you will call sendPacketBuffernb() until it reports success (or error)\n*/\nvoid transport_sendPacketBuffernb_start(int sock, unsigned char* buf, int buflen);\n/**\nThis is a bare metal implementation, so we must have non-blocking functions,\nthe process of pumping to serial lines can result a bit slow and we don't want to busy wait\n@returns TRANSPORT_DONE if finished, TRANSPORT_AGAIN for call again, or TRANSPORT_ERROR on error\n@note you will call again until it finishes (this is stream)\n*/\nint transport_sendPacketBuffernb(int sock);\n\n/**\nThis is a bare metal implementation, so we must have non-blocking functions,\nthe process of sucking from serial lines can result a bit slow and we don't want to busy wait\n@return the actual number of bytes read, 0 for none, or TRANSPORT_ERROR on error\n@note you will call again until total number of expected bytes is read (this is stream)\n*/\nint transport_getdatanb(void *sck, unsigned char* buf, int count);\n\n/**\nWe assume whatever connection needs to be done, it is externally established by the specifics of the hardware\nE.g.:\nA cell modem: you will call AT+whatever and put the modem in transparent mode, OR, you will embed\nthe AT+xSENDx / AT+xRECVx commands into the former sendPacketBuffer() and getdatanb() functions\n@param\tthisio\tpointer to a structure containing all necessary stuff to handle direct serial I/O\n@returns\twhatever indicator the system assigns to this link, if any. (a.k.a. : 'sock'), or TRANSPORT_ERROR for error\n*/\nint transport_open(transport_iofunctions_t *thisio);\nint transport_close(int sock);\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/build",
    "content": "gcc -Wall -c transport.c -Os -s\ngcc qos0pub.c transport.o -I ../src ../src/MQTTConnectClient.c ../src/MQTTSerializePublish.c ../src/MQTTPacket.c -o qos0pub -Os -s\n\ngcc pub0sub1.c transport.o -I ../src ../src/MQTTConnectClient.c ../src/MQTTSerializePublish.c ../src/MQTTPacket.c ../src/MQTTSubscribeClient.c -o pub0sub1 ../src/MQTTDeserializePublish.c -Os -s ../src/MQTTConnectServer.c ../src/MQTTSubscribeServer.c ../src/MQTTUnsubscribeServer.c ../src/MQTTUnsubscribeClient.c -ggdb\ngcc pub0sub1_nb.c transport.o -I ../src ../src/MQTTConnectClient.c ../src/MQTTSerializePublish.c ../src/MQTTPacket.c ../src/MQTTSubscribeClient.c -o pub0sub1_nb ../src/MQTTDeserializePublish.c -Os -s ../src/MQTTConnectServer.c ../src/MQTTSubscribeServer.c ../src/MQTTUnsubscribeServer.c ../src/MQTTUnsubscribeClient.c -ggdb\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/null.c",
    "content": "int main(int argc, char **argv)\n{\n    return 0;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/ping.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - port\n *******************************************************************************/\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"MQTTPacket.h\"\n#include \"transport.h\"\n\n#define KEEPALIVE_INTERVAL 20\n\n/* This is to get a timebase in seconds to test the sample */\n#include <time.h>\ntime_t old_t;\nvoid start_ping_timer(void)\n{\n    time(&old_t);\n    old_t += KEEPALIVE_INTERVAL / 2 + 1;\n}\n\nint time_to_ping(void)\n{\n    time_t t;\n\n    time(&t);\n    if(t >= old_t)\n        return 1;\n    return 0;\n}\n\n/* This is in order to get an asynchronous signal to stop the sample,\nas the code loops waiting for msgs on the subscribed topic.\nYour actual code will depend on your hw and approach*/\n#include <signal.h>\n\nint toStop = 0;\n\nvoid cfinish(int sig)\n{\n    signal(SIGINT, NULL);\n    toStop = 1;\n}\n\nvoid stop_init(void)\n{\n    signal(SIGINT, cfinish);\n    signal(SIGTERM, cfinish);\n}\n/* */\n\nint main(int argc, char *argv[])\n{\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    int rc = 0;\n    int mysock = 0;\n    unsigned char buf[200];\n    int buflen = sizeof(buf);\n    int len = 0;\n    char *host = \"m2m.eclipse.org\";\n    int port = 1883;\n\n    stop_init();\n    if (argc > 1)\n        host = argv[1];\n\n    if (argc > 2)\n        port = atoi(argv[2]);\n\n    mysock = transport_open(host, port);\n    if(mysock < 0)\n        return mysock;\n\n    printf(\"Sending to hostname %s port %d\\n\", host, port);\n\n    data.clientID.cstring = \"me\";\n    data.keepAliveInterval = KEEPALIVE_INTERVAL;\n    data.cleansession = 1;\n    data.username.cstring = \"testuser\";\n    data.password.cstring = \"testpassword\";\n\n    len = MQTTSerialize_connect(buf, buflen, &data);\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\n    printf(\"Sent MQTT connect\\n\");\n    /* wait for connack */\n    if (MQTTPacket_read(buf, buflen, transport_getdata) == CONNACK)\n    {\n        unsigned char sessionPresent, connack_rc;\n\n        if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)\n        {\n            printf(\"Unable to connect, return code %d\\n\", connack_rc);\n            goto exit;\n        }\n    }\n    else\n        goto exit;\n\n    printf(\"MQTT connected\\n\");\n    start_ping_timer();\n\n    while (!toStop)\n    {\n        while(!time_to_ping());\n        len = MQTTSerialize_pingreq(buf, buflen);\n        transport_sendPacketBuffer(mysock, buf, len);\n        printf(\"Ping...\");\n        if (MQTTPacket_read(buf, buflen, transport_getdata) == PINGRESP)\n        {\n            printf(\"Pong\\n\");\n            start_ping_timer();\n        }\n        else\n        {\n            printf(\"OOPS\\n\");\n            goto exit;\n        }\n\n    }\n\n    printf(\"disconnecting\\n\");\n    len = MQTTSerialize_disconnect(buf, buflen);\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\nexit:\n    transport_close(mysock);\n\n    return 0;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/ping_nb.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - port and nonblocking\n *******************************************************************************/\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"MQTTPacket.h\"\n#include \"transport.h\"\n\n#define KEEPALIVE_INTERVAL 20\n\n/* This is to get a timebase in seconds to test the sample */\n#include <time.h>\ntime_t old_t;\nvoid start_ping_timer(void)\n{\n    time(&old_t);\n    old_t += KEEPALIVE_INTERVAL / 2 + 1;\n}\n\nint time_to_ping(void)\n{\n    time_t t;\n\n    time(&t);\n    if(t >= old_t)\n        return 1;\n    return 0;\n}\n\n/* This is in order to get an asynchronous signal to stop the sample,\nas the code loops waiting for msgs on the subscribed topic.\nYour actual code will depend on your hw and approach*/\n#include <signal.h>\n\nint toStop = 0;\n\nvoid cfinish(int sig)\n{\n    signal(SIGINT, NULL);\n    toStop = 1;\n}\n\nvoid stop_init(void)\n{\n    signal(SIGINT, cfinish);\n    signal(SIGTERM, cfinish);\n}\n/* */\n\nenum states { IDLE, GETPONG };\n\nint main(int argc, char *argv[])\n{\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    int rc = 0;\n    int mysock = 0;\n    unsigned char buf[200];\n    int buflen = sizeof(buf);\n    int len = 0;\n    char *host = \"m2m.eclipse.org\";\n    int port = 1883;\n    MQTTTransport mytransport;\n    int state;\n\n    stop_init();\n    if (argc > 1)\n        host = argv[1];\n\n    if (argc > 2)\n        port = atoi(argv[2]);\n\n    mysock = transport_open(host, port);\n    if(mysock < 0)\n        return mysock;\n\n    printf(\"Sending to hostname %s port %d\\n\", host, port);\n\n    mytransport.sck = &mysock;\n    mytransport.getfn = transport_getdatanb;\n    mytransport.state = 0;\n    data.clientID.cstring = \"me\";\n    data.keepAliveInterval = KEEPALIVE_INTERVAL;\n    data.cleansession = 1;\n    data.username.cstring = \"testuser\";\n    data.password.cstring = \"testpassword\";\n\n    len = MQTTSerialize_connect(buf, buflen, &data);\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\n    printf(\"Sent MQTT connect\\n\");\n    /* wait for connack */\n    do\n    {\n        int frc;\n        if ((frc = MQTTPacket_readnb(buf, buflen, &mytransport)) == CONNACK)\n        {\n            unsigned char sessionPresent, connack_rc;\n            if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)\n            {\n                printf(\"Unable to connect, return code %d\\n\", connack_rc);\n                goto exit;\n            }\n            break;\n        }\n        else if (frc == -1)\n            goto exit;\n    }\n    while (1);   /* handle timeouts here */\n\n    printf(\"MQTT connected\\n\");\n    start_ping_timer();\n\n    state = IDLE;\n    while (!toStop)\n    {\n        switch(state)\n        {\n        case IDLE:\n            if(time_to_ping())\n            {\n                len = MQTTSerialize_pingreq(buf, buflen);\n                transport_sendPacketBuffer(mysock, buf, len);\n                printf(\"Ping...\");\n                state = GETPONG;\n            }\n            break;\n        case GETPONG:\n            if((rc = MQTTPacket_readnb(buf, buflen, &mytransport)) == PINGRESP)\n            {\n                printf(\"Pong\\n\");\n                start_ping_timer();\n                state = IDLE;\n            }\n            else if(rc == -1)\n            {\n                printf(\"OOPS\\n\");\n                goto exit;\n            }\n            break;\n        }\n    }\n\n    printf(\"disconnecting\\n\");\n    len = MQTTSerialize_disconnect(buf, buflen);\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\nexit:\n    transport_close(mysock);\n\n    return 0;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/pub0sub1.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - clarifications and/or documentation extension\n *******************************************************************************/\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"MQTTPacket.h\"\n#include \"transport.h\"\n\n/* This is in order to get an asynchronous signal to stop the sample,\nas the code loops waiting for msgs on the subscribed topic.\nYour actual code will depend on your hw and approach*/\n#include <signal.h>\n\nint toStop = 0;\n\nvoid cfinish(int sig)\n{\n    signal(SIGINT, NULL);\n    toStop = 1;\n}\n\nvoid stop_init(void)\n{\n    signal(SIGINT, cfinish);\n    signal(SIGTERM, cfinish);\n}\n/* */\n\nint main(int argc, char *argv[])\n{\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    int rc = 0;\n    int mysock = 0;\n    unsigned char buf[200];\n    int buflen = sizeof(buf);\n    int msgid = 1;\n    MQTTString topicString = MQTTString_initializer;\n    int req_qos = 0;\n    char *payload = \"mypayload\";\n    int payloadlen = strlen(payload);\n    int len = 0;\n    char *host = \"m2m.eclipse.org\";\n    int port = 1883;\n\n    stop_init();\n    if (argc > 1)\n        host = argv[1];\n\n    if (argc > 2)\n        port = atoi(argv[2]);\n\n    mysock = transport_open(host, port);\n    if(mysock < 0)\n        return mysock;\n\n    printf(\"Sending to hostname %s port %d\\n\", host, port);\n\n    data.clientID.cstring = \"me\";\n    data.keepAliveInterval = 20;\n    data.cleansession = 1;\n    data.username.cstring = \"testuser\";\n    data.password.cstring = \"testpassword\";\n\n    len = MQTTSerialize_connect(buf, buflen, &data);\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\n    /* wait for connack */\n    if (MQTTPacket_read(buf, buflen, transport_getdata) == CONNACK)\n    {\n        unsigned char sessionPresent, connack_rc;\n\n        if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)\n        {\n            printf(\"Unable to connect, return code %d\\n\", connack_rc);\n            goto exit;\n        }\n    }\n    else\n        goto exit;\n\n    /* subscribe */\n    topicString.cstring = \"substopic\";\n    len = MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos);\n\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n    if (MQTTPacket_read(buf, buflen, transport_getdata) == SUBACK) \t/* wait for suback */\n    {\n        unsigned short submsgid;\n        int subcount;\n        int granted_qos;\n\n        rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen);\n        if (granted_qos != 0)\n        {\n            printf(\"granted qos != 0, %d\\n\", granted_qos);\n            goto exit;\n        }\n    }\n    else\n        goto exit;\n\n    /* loop getting msgs on subscribed topic */\n    topicString.cstring = \"pubtopic\";\n    while (!toStop)\n    {\n        /* transport_getdata() has a built-in 1 second timeout,\n        your mileage will vary */\n        if (MQTTPacket_read(buf, buflen, transport_getdata) == PUBLISH)\n        {\n            unsigned char dup;\n            int qos;\n            unsigned char retained;\n            unsigned short msgid;\n            int payloadlen_in;\n            unsigned char *payload_in;\n            int rc;\n            MQTTString receivedTopic;\n\n            rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic,\n                                         &payload_in, &payloadlen_in, buf, buflen);\n            printf(\"message arrived %.*s\\n\", payloadlen_in, payload_in);\n        }\n\n        printf(\"publishing reading\\n\");\n        len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, (unsigned char *)payload, payloadlen);\n        rc = transport_sendPacketBuffer(mysock, buf, len);\n    }\n\n    printf(\"disconnecting\\n\");\n    len = MQTTSerialize_disconnect(buf, buflen);\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\nexit:\n    transport_close(mysock);\n\n    return 0;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/pub0sub1_nb.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - clarifications and/or documentation extension\n *******************************************************************************/\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"MQTTPacket.h\"\n#include \"transport.h\"\n\n/* This is in order to get an asynchronous signal to stop the sample,\nas the code loops waiting for msgs on the subscribed topic.\nYour actual code will depend on your hw and approach*/\n#include <signal.h>\n\nint toStop = 0;\n\nvoid cfinish(int sig)\n{\n    signal(SIGINT, NULL);\n    toStop = 1;\n}\n\nvoid stop_init(void)\n{\n    signal(SIGINT, cfinish);\n    signal(SIGTERM, cfinish);\n}\n/* */\n\nint main(int argc, char *argv[])\n{\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    int rc = 0;\n    int mysock = 0;\n    unsigned char buf[200];\n    int buflen = sizeof(buf);\n    int msgid = 1;\n    MQTTString topicString = MQTTString_initializer;\n    int req_qos = 0;\n    char *payload = \"mypayload\";\n    int payloadlen = strlen(payload);\n    int len = 0;\n    char *host = \"m2m.eclipse.org\";\n    int port = 1883;\n    MQTTTransport mytransport;\n\n    stop_init();\n    if (argc > 1)\n        host = argv[1];\n\n    if (argc > 2)\n        port = atoi(argv[2]);\n\n    mysock = transport_open(host, port);\n    if(mysock < 0)\n        return mysock;\n\n    printf(\"Sending to hostname %s port %d\\n\", host, port);\n\n    mytransport.sck = &mysock;\n    mytransport.getfn = transport_getdatanb;\n    mytransport.state = 0;\n    data.clientID.cstring = \"me\";\n    data.keepAliveInterval = 20;\n    data.cleansession = 1;\n    data.username.cstring = \"testuser\";\n    data.password.cstring = \"testpassword\";\n\n    len = MQTTSerialize_connect(buf, buflen, &data);\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\n    /* wait for connack */\n    if (MQTTPacket_read(buf, buflen, transport_getdata) == CONNACK)\n    {\n        unsigned char sessionPresent, connack_rc;\n\n        if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)\n        {\n            printf(\"Unable to connect, return code %d\\n\", connack_rc);\n            goto exit;\n        }\n    }\n    else\n        goto exit;\n\n    /* subscribe */\n    topicString.cstring = \"substopic\";\n    len = MQTTSerialize_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos);\n\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n    do\n    {\n        int frc;\n        if ((frc = MQTTPacket_readnb(buf, buflen, &mytransport)) == SUBACK) /* wait for suback */\n        {\n            unsigned short submsgid;\n            int subcount;\n            int granted_qos;\n\n            rc = MQTTDeserialize_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen);\n            if (granted_qos != 0)\n            {\n                printf(\"granted qos != 0, %d\\n\", granted_qos);\n                goto exit;\n            }\n            break;\n        }\n        else if (frc == -1)\n            goto exit;\n    }\n    while (1);   /* handle timeouts here */\n    /* loop getting msgs on subscribed topic */\n    topicString.cstring = \"pubtopic\";\n    while (!toStop)\n    {\n        /* handle timeouts */\n        if (MQTTPacket_readnb(buf, buflen, &mytransport) == PUBLISH)\n        {\n            unsigned char dup;\n            int qos;\n            unsigned char retained;\n            unsigned short msgid;\n            int payloadlen_in;\n            unsigned char *payload_in;\n            int rc;\n            MQTTString receivedTopic;\n\n            rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic,\n                                         &payload_in, &payloadlen_in, buf, buflen);\n            printf(\"message arrived %.*s\\n\", payloadlen_in, payload_in);\n            printf(\"publishing reading\\n\");\n            len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, (unsigned char *)payload, payloadlen);\n            rc = transport_sendPacketBuffer(mysock, buf, len);\n        }\n    }\n\n    printf(\"disconnecting\\n\");\n    len = MQTTSerialize_disconnect(buf, buflen);\n    rc = transport_sendPacketBuffer(mysock, buf, len);\n\nexit:\n    transport_close(mysock);\n\n    return 0;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/qos0pub.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - clarifications and/or documentation extension\n *******************************************************************************/\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"MQTTPacket.h\"\n#include \"transport.h\"\n\n\nint main(int argc, char *argv[])\n{\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    int rc = 0;\n    char buf[200];\n    int buflen = sizeof(buf);\n    int mysock = 0;\n    MQTTString topicString = MQTTString_initializer;\n    char *payload = \"mypayload\";\n    int payloadlen = strlen(payload);\n    int len = 0;\n    char *host = \"m2m.eclipse.org\";\n    int port = 1883;\n\n    if (argc > 1)\n        host = argv[1];\n\n    if (argc > 2)\n        port = atoi(argv[2]);\n\n    mysock = transport_open(host, port);\n    if(mysock < 0)\n        return mysock;\n\n    printf(\"Sending to hostname %s port %d\\n\", host, port);\n\n    data.clientID.cstring = \"me\";\n    data.keepAliveInterval = 20;\n    data.cleansession = 1;\n    data.username.cstring = \"testuser\";\n    data.password.cstring = \"testpassword\";\n    data.MQTTVersion = 4;\n\n    len = MQTTSerialize_connect((unsigned char *)buf, buflen, &data);\n\n    topicString.cstring = \"mytopic\";\n    len += MQTTSerialize_publish((unsigned char *)(buf + len), buflen - len, 0, 0, 0, 0, topicString, (unsigned char *)payload, payloadlen);\n\n    len += MQTTSerialize_disconnect((unsigned char *)(buf + len), buflen - len);\n\n    rc = transport_sendPacketBuffer(mysock, (unsigned char *)buf, len);\n    if (rc == len)\n        printf(\"Successfully published\\n\");\n    else\n        printf(\"Publish failed\\n\");\n\nexit:\n    transport_close(mysock);\n\n    return 0;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/transport.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - \"commonalization\" from prior samples and/or documentation extension\n *******************************************************************************/\n\n#include <sys/types.h>\n\n#if !defined(SOCKET_ERROR)\n/** error in socket operation */\n#define SOCKET_ERROR -1\n#endif\n\n#if defined(WIN32)\n/* default on Windows is 64 - increase to make Linux and Windows the same */\n#define FD_SETSIZE 1024\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#define MAXHOSTNAMELEN 256\n#define EAGAIN WSAEWOULDBLOCK\n#define EINTR WSAEINTR\n#define EINVAL WSAEINVAL\n#define EINPROGRESS WSAEINPROGRESS\n#define EWOULDBLOCK WSAEWOULDBLOCK\n#define ENOTCONN WSAENOTCONN\n#define ECONNRESET WSAECONNRESET\n#define ioctl ioctlsocket\n#define socklen_t int\n#else\n#define INVALID_SOCKET SOCKET_ERROR\n#include <sys/socket.h>\n#include <sys/param.h>\n#include <sys/time.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n#include <arpa/inet.h>\n#include <netdb.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <string.h>\n#include <stdlib.h>\n#endif\n\n#if defined(WIN32)\n#include <Iphlpapi.h>\n#else\n#include <sys/ioctl.h>\n#include <net/if.h>\n#endif\n\n/**\nThis simple low-level implementation assumes a single connection for a single thread. Thus, a static\nvariable is used for that connection.\nOn other scenarios, the user must solve this by taking into account that the current implementation of\nMQTTPacket_read() has a function pointer for a function call to get the data to a buffer, but no provisions\nto know the caller or other indicator (the socket id): int (*getfn)(unsigned char*, int)\n*/\nstatic int mysock = INVALID_SOCKET;\n\n\nint transport_sendPacketBuffer(int sock, unsigned char *buf, int buflen)\n{\n    int rc = 0;\n    rc = write(sock, buf, buflen);\n    return rc;\n}\n\n\nint transport_getdata(unsigned char *buf, int count)\n{\n    int rc = recv(mysock, buf, count, 0);\n    //printf(\"received %d bytes count %d\\n\", rc, (int)count);\n    return rc;\n}\n\nint transport_getdatanb(void *sck, unsigned char *buf, int count)\n{\n    int sock = *((int *)sck); \t/* sck: pointer to whatever the system may use to identify the transport */\n    /* this call will return after the timeout set on initialization if no bytes;\n       in your system you will use whatever you use to get whichever outstanding\n       bytes your socket equivalent has ready to be extracted right now, if any,\n       or return immediately */\n    int rc = recv(sock, buf, count, 0);\n    if (rc == -1)\n    {\n        /* check error conditions from your system here, and return -1 */\n        return 0;\n    }\n    return rc;\n}\n\n/**\nreturn >=0 for a socket descriptor, <0 for an error code\n@todo Basically moved from the sample without changes, should accomodate same usage for 'sock' for clarity,\nremoving indirections\n*/\nint transport_open(char *addr, int port)\n{\n    int *sock = &mysock;\n    int type = SOCK_STREAM;\n    struct sockaddr_in address;\n#if defined(AF_INET6)\n    struct sockaddr_in6 address6;\n#endif\n    int rc = -1;\n#if defined(WIN32)\n    short family;\n#else\n    sa_family_t family = AF_INET;\n#endif\n    struct addrinfo *result = NULL;\n    struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};\n    static struct timeval tv;\n\n    *sock = -1;\n    if (addr[0] == '[')\n        ++addr;\n\n    if ((rc = getaddrinfo(addr, NULL, &hints, &result)) == 0)\n    {\n        struct addrinfo *res = result;\n\n        /* prefer ip4 addresses */\n        while (res)\n        {\n            if (res->ai_family == AF_INET)\n            {\n                result = res;\n                break;\n            }\n            res = res->ai_next;\n        }\n\n#if defined(AF_INET6)\n        if (result->ai_family == AF_INET6)\n        {\n            address6.sin6_port = htons(port);\n            address6.sin6_family = family = AF_INET6;\n            address6.sin6_addr = ((struct sockaddr_in6 *)(result->ai_addr))->sin6_addr;\n        }\n        else\n#endif\n            if (result->ai_family == AF_INET)\n            {\n                address.sin_port = htons(port);\n                address.sin_family = family = AF_INET;\n                address.sin_addr = ((struct sockaddr_in *)(result->ai_addr))->sin_addr;\n            }\n            else\n                rc = -1;\n\n        freeaddrinfo(result);\n    }\n\n    if (rc == 0)\n    {\n        *sock =\tsocket(family, type, 0);\n        if (*sock != -1)\n        {\n#if defined(NOSIGPIPE)\n            int opt = 1;\n\n            if (setsockopt(*sock, SOL_SOCKET, SO_NOSIGPIPE, (void *)&opt, sizeof(opt)) != 0)\n                Log(TRACE_MIN, -1, \"Could not set SO_NOSIGPIPE for socket %d\", *sock);\n#endif\n\n            if (family == AF_INET)\n                rc = connect(*sock, (struct sockaddr *)&address, sizeof(address));\n#if defined(AF_INET6)\n            else\n                rc = connect(*sock, (struct sockaddr *)&address6, sizeof(address6));\n#endif\n        }\n    }\n    if (mysock == INVALID_SOCKET)\n        return rc;\n\n    tv.tv_sec = 1;  /* 1 second Timeout */\n    tv.tv_usec = 0;\n    setsockopt(mysock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));\n    return mysock;\n}\n\nint transport_close(int sock)\n{\n    int rc;\n\n    rc = shutdown(sock, SHUT_WR);\n    rc = recv(sock, NULL, (size_t)0, 0);\n    rc = close(sock);\n\n    return rc;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/samples/transport.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - \"commonalization\" from prior samples and/or documentation extension\n *******************************************************************************/\n\nint transport_sendPacketBuffer(int sock, unsigned char* buf, int buflen);\nint transport_getdata(unsigned char* buf, int count);\nint transport_getdatanb(void *sck, unsigned char* buf, int count);\nint transport_open(char* host, int port);\nint transport_close(int sock);\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/CMakeLists.txt",
    "content": "#*******************************************************************************\n#  Copyright (c) 2017 IBM Corp.\n#\n#  All rights reserved. This program and the accompanying materials\n#  are made available under the terms of the Eclipse Public License v1.0\n#  and Eclipse Distribution License v1.0 which accompany this distribution.\n#\n#  The Eclipse Public License is available at\n#     http://www.eclipse.org/legal/epl-v10.html\n#  and the Eclipse Distribution License is available at\n#    http://www.eclipse.org/org/documents/edl-v10.php.\n#\n#  Contributors:\n#     Ian Craggs - initial version\n#*******************************************************************************/\n\n# MQTTPacket Library\nfile(GLOB SOURCES \"*.c\")\nadd_library(paho-embed-mqtt3c SHARED ${SOURCES})\ninstall(TARGETS paho-embed-mqtt3c DESTINATION /usr/lib)\ntarget_compile_definitions(paho-embed-mqtt3c PRIVATE MQTT_SERVER MQTT_CLIENT)\n\nadd_library(MQTTPacketClient SHARED MQTTFormat MQTTPacket\n            MQTTSerializePublish MQTTDeserializePublish\n            MQTTConnectClient MQTTSubscribeClient MQTTUnsubscribeClient)\ntarget_compile_definitions(MQTTPacketClient PRIVATE MQTT_CLIENT)\n\nadd_library(MQTTPacketServer SHARED MQTTFormat MQTTPacket\n            MQTTSerializePublish MQTTDeserializePublish\n            MQTTConnectServer MQTTSubscribeServer MQTTUnsubscribeServer)\ntarget_compile_definitions(MQTTPacketServer PRIVATE MQTT_SERVER)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTConnect.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014, 2017 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Xiang Rong - 442039 Add makefile to Embedded C client\n *    Ian Craggs - fix for issue #64, bit order in connack response\n *******************************************************************************/\n\n#ifndef MQTTCONNECT_H_\n#define MQTTCONNECT_H_\n\n#if !defined(DLLImport)\n  #define DLLImport\n#endif\n#if !defined(DLLExport)\n  #define DLLExport\n#endif\n\n\ntypedef union\n{\n\tunsigned char all;\t/**< all connect flags */\n#if defined(REVERSED)\n\tstruct\n\t{\n\t\tunsigned int username : 1;\t\t\t/**< 3.1 user name */\n\t\tunsigned int password : 1; \t\t\t/**< 3.1 password */\n\t\tunsigned int willRetain : 1;\t\t/**< will retain setting */\n\t\tunsigned int willQoS : 2;\t\t\t\t/**< will QoS value */\n\t\tunsigned int will : 1;\t\t\t    /**< will flag */\n\t\tunsigned int cleansession : 1;\t  /**< clean session flag */\n\t\tunsigned int : 1;\t  \t          /**< unused */\n\t} bits;\n#else\n\tstruct\n\t{\n\t\tunsigned int : 1;\t     \t\t\t\t\t/**< unused */\n\t\tunsigned int cleansession : 1;\t  /**< cleansession flag */\n\t\tunsigned int will : 1;\t\t\t    /**< will flag */\n\t\tunsigned int willQoS : 2;\t\t\t\t/**< will QoS value */\n\t\tunsigned int willRetain : 1;\t\t/**< will retain setting */\n\t\tunsigned int password : 1; \t\t\t/**< 3.1 password */\n\t\tunsigned int username : 1;\t\t\t/**< 3.1 user name */\n\t} bits;\n#endif\n} MQTTConnectFlags;\t/**< connect flags byte */\n\n\n\n/**\n * Defines the MQTT \"Last Will and Testament\" (LWT) settings for\n * the connect packet.\n */\ntypedef struct\n{\n\t/** The eyecatcher for this structure.  must be MQTW. */\n\tchar struct_id[4];\n\t/** The version number of this structure.  Must be 0 */\n\tint struct_version;\n\t/** The LWT topic to which the LWT message will be published. */\n\tMQTTString topicName;\n\t/** The LWT payload. */\n\tMQTTString message;\n\t/**\n      * The retained flag for the LWT message (see MQTTAsync_message.retained).\n      */\n\tunsigned char retained;\n\t/**\n      * The quality of service setting for the LWT message (see\n      * MQTTAsync_message.qos and @ref qos).\n      */\n\tchar qos;\n} MQTTPacket_willOptions;\n\n\n#define MQTTPacket_willOptions_initializer { {'M', 'Q', 'T', 'W'}, 0, {NULL, {0, NULL}}, {NULL, {0, NULL}}, 0, 0 }\n\n\ntypedef struct\n{\n\t/** The eyecatcher for this structure.  must be MQTC. */\n\tchar struct_id[4];\n\t/** The version number of this structure.  Must be 0 */\n\tint struct_version;\n\t/** Version of MQTT to be used.  3 = 3.1 4 = 3.1.1\n\t  */\n\tunsigned char MQTTVersion;\n\tMQTTString clientID;\n\tunsigned short keepAliveInterval;\n\tunsigned char cleansession;\n\tunsigned char willFlag;\n\tMQTTPacket_willOptions will;\n\tMQTTString username;\n\tMQTTString password;\n} MQTTPacket_connectData;\n\ntypedef union\n{\n\tunsigned char all;\t/**< all connack flags */\n#if defined(REVERSED)\n\tstruct\n\t{\n    unsigned int reserved : 7;\t  \t    /**< unused */\n\t\tunsigned int sessionpresent : 1;    /**< session present flag */\n\t} bits;\n#else\n\tstruct\n\t{\n\t\tunsigned int sessionpresent : 1;    /**< session present flag */\n    unsigned int reserved: 7;\t     \t\t\t/**< unused */\n\t} bits;\n#endif\n} MQTTConnackFlags;\t/**< connack flags byte */\n\n#define MQTTPacket_connectData_initializer { {'M', 'Q', 'T', 'C'}, 0, 4, {NULL, {0, NULL}}, 60, 1, 0, \\\n\t\tMQTTPacket_willOptions_initializer, {NULL, {0, NULL}}, {NULL, {0, NULL}} }\n\nDLLExport int MQTTSerialize_connect(unsigned char* buf, int buflen, MQTTPacket_connectData* options);\nDLLExport int MQTTDeserialize_connect(MQTTPacket_connectData* data, unsigned char* buf, int len);\n\nDLLExport int MQTTSerialize_connack(unsigned char* buf, int buflen, unsigned char connack_rc, unsigned char sessionPresent);\nDLLExport int MQTTDeserialize_connack(unsigned char* sessionPresent, unsigned char* connack_rc, unsigned char* buf, int buflen);\n\nDLLExport int MQTTSerialize_disconnect(unsigned char* buf, int buflen);\nDLLExport int MQTTSerialize_pingreq(unsigned char* buf, int buflen);\n\n#endif /* MQTTCONNECT_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTConnectClient.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#include \"MQTTPacket.h\"\n#include \"StackTrace.h\"\n\n#include <string.h>\n\n/**\n  * Determines the length of the MQTT connect packet that would be produced using the supplied connect options.\n  * @param options the options to be used to build the connect packet\n  * @return the length of buffer needed to contain the serialized version of the packet\n  */\nint MQTTSerialize_connectLength(MQTTPacket_connectData *options)\n{\n    int len = 0;\n\n    FUNC_ENTRY;\n\n    if (options->MQTTVersion == 3)\n        len = 12; /* variable depending on MQTT or MQIsdp */\n    else if (options->MQTTVersion == 4)\n        len = 10;\n\n    len += MQTTstrlen(options->clientID) + 2;\n    if (options->willFlag)\n        len += MQTTstrlen(options->will.topicName) + 2 + MQTTstrlen(options->will.message) + 2;\n    if (options->username.cstring || options->username.lenstring.data)\n        len += MQTTstrlen(options->username) + 2;\n    if (options->password.cstring || options->password.lenstring.data)\n        len += MQTTstrlen(options->password) + 2;\n\n    FUNC_EXIT_RC(len);\n    return len;\n}\n\n\n/**\n  * Serializes the connect options into the buffer.\n  * @param buf the buffer into which the packet will be serialized\n  * @param len the length in bytes of the supplied buffer\n  * @param options the options to be used to build the connect packet\n  * @return serialized length, or error if 0\n  */\nint MQTTSerialize_connect(unsigned char *buf, int buflen, MQTTPacket_connectData *options)\n{\n    unsigned char *ptr = buf;\n    MQTTHeader header = {0};\n    MQTTConnectFlags flags = {0};\n    int len = 0;\n    int rc = -1;\n\n    FUNC_ENTRY;\n    if (MQTTPacket_len(len = MQTTSerialize_connectLength(options)) > buflen)\n    {\n        rc = MQTTPACKET_BUFFER_TOO_SHORT;\n        goto exit;\n    }\n\n    header.byte = 0;\n    header.bits.type = CONNECT;\n    writeChar(&ptr, header.byte); /* write header */\n\n    ptr += MQTTPacket_encode(ptr, len); /* write remaining length */\n\n    if (options->MQTTVersion == 4)\n    {\n        writeCString(&ptr, \"MQTT\");\n        writeChar(&ptr, (char) 4);\n    }\n    else\n    {\n        writeCString(&ptr, \"MQIsdp\");\n        writeChar(&ptr, (char) 3);\n    }\n\n    flags.all = 0;\n    flags.bits.cleansession = options->cleansession;\n    flags.bits.will = (options->willFlag) ? 1 : 0;\n    if (flags.bits.will)\n    {\n        flags.bits.willQoS = options->will.qos;\n        flags.bits.willRetain = options->will.retained;\n    }\n\n    if (options->username.cstring || options->username.lenstring.data)\n        flags.bits.username = 1;\n    if (options->password.cstring || options->password.lenstring.data)\n        flags.bits.password = 1;\n\n    writeChar(&ptr, flags.all);\n    writeInt(&ptr, options->keepAliveInterval);\n    writeMQTTString(&ptr, options->clientID);\n    if (options->willFlag)\n    {\n        writeMQTTString(&ptr, options->will.topicName);\n        writeMQTTString(&ptr, options->will.message);\n    }\n    if (flags.bits.username)\n        writeMQTTString(&ptr, options->username);\n    if (flags.bits.password)\n        writeMQTTString(&ptr, options->password);\n\n    rc = ptr - buf;\n\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n/**\n  * Deserializes the supplied (wire) buffer into connack data - return code\n  * @param sessionPresent the session present flag returned (only for MQTT 3.1.1)\n  * @param connack_rc returned integer value of the connack return code\n  * @param buf the raw buffer data, of the correct length determined by the remaining length field\n  * @param len the length in bytes of the data in the supplied buffer\n  * @return error code.  1 is success, 0 is failure\n  */\nint MQTTDeserialize_connack(unsigned char *sessionPresent, unsigned char *connack_rc, unsigned char *buf, int buflen)\n{\n    MQTTHeader header = {0};\n    unsigned char *curdata = buf;\n    unsigned char *enddata = NULL;\n    int rc = 0;\n    int mylen;\n    MQTTConnackFlags flags = {0};\n\n    FUNC_ENTRY;\n    header.byte = readChar(&curdata);\n    if (header.bits.type != CONNACK)\n        goto exit;\n\n    curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */\n    enddata = curdata + mylen;\n    if (enddata - curdata < 2)\n        goto exit;\n\n    flags.all = readChar(&curdata);\n    *sessionPresent = flags.bits.sessionpresent;\n    *connack_rc = readChar(&curdata);\n\n    rc = 1;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n/**\n  * Serializes a 0-length packet into the supplied buffer, ready for writing to a socket\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer, to avoid overruns\n  * @param packettype the message type\n  * @return serialized length, or error if 0\n  */\nint MQTTSerialize_zero(unsigned char *buf, int buflen, unsigned char packettype)\n{\n    MQTTHeader header = {0};\n    int rc = -1;\n    unsigned char *ptr = buf;\n\n    FUNC_ENTRY;\n    if (buflen < 2)\n    {\n        rc = MQTTPACKET_BUFFER_TOO_SHORT;\n        goto exit;\n    }\n    header.byte = 0;\n    header.bits.type = packettype;\n    writeChar(&ptr, header.byte); /* write header */\n\n    ptr += MQTTPacket_encode(ptr, 0); /* write remaining length */\n    rc = ptr - buf;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n/**\n  * Serializes a disconnect packet into the supplied buffer, ready for writing to a socket\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer, to avoid overruns\n  * @return serialized length, or error if 0\n  */\nint MQTTSerialize_disconnect(unsigned char *buf, int buflen)\n{\n    return MQTTSerialize_zero(buf, buflen, DISCONNECT);\n}\n\n\n/**\n  * Serializes a disconnect packet into the supplied buffer, ready for writing to a socket\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer, to avoid overruns\n  * @return serialized length, or error if 0\n  */\nint MQTTSerialize_pingreq(unsigned char *buf, int buflen)\n{\n    return MQTTSerialize_zero(buf, buflen, PINGREQ);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTConnectServer.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#include \"StackTrace.h\"\n#include \"MQTTPacket.h\"\n#include <string.h>\n\n#define min(a, b) ((a < b) ? a : b)\n\n\n/**\n  * Validates MQTT protocol name and version combinations\n  * @param protocol the MQTT protocol name as an MQTTString\n  * @param version the MQTT protocol version number, as in the connect packet\n  * @return correct MQTT combination?  1 is true, 0 is false\n  */\nint MQTTPacket_checkVersion(MQTTString *protocol, int version)\n{\n    int rc = 0;\n\n    if (version == 3 && memcmp(protocol->lenstring.data, \"MQIsdp\",\n                               min(6, protocol->lenstring.len)) == 0)\n        rc = 1;\n    else if (version == 4 && memcmp(protocol->lenstring.data, \"MQTT\",\n                                    min(4, protocol->lenstring.len)) == 0)\n        rc = 1;\n    return rc;\n}\n\n\n/**\n  * Deserializes the supplied (wire) buffer into connect data structure\n  * @param data the connect data structure to be filled out\n  * @param buf the raw buffer data, of the correct length determined by the remaining length field\n  * @param len the length in bytes of the data in the supplied buffer\n  * @return error code.  1 is success, 0 is failure\n  */\nint MQTTDeserialize_connect(MQTTPacket_connectData *data, unsigned char *buf, int len)\n{\n    MQTTHeader header = {0};\n    MQTTConnectFlags flags = {0};\n    unsigned char *curdata = buf;\n    unsigned char *enddata = &buf[len];\n    int rc = 0;\n    MQTTString Protocol;\n    int version;\n    int mylen = 0;\n\n    FUNC_ENTRY;\n    header.byte = readChar(&curdata);\n    if (header.bits.type != CONNECT)\n        goto exit;\n\n    curdata += MQTTPacket_decodeBuf(curdata, &mylen); /* read remaining length */\n\n    if (!readMQTTLenString(&Protocol, &curdata, enddata) ||\n            enddata - curdata < 0) /* do we have enough data to read the protocol version byte? */\n        goto exit;\n\n    version = (int)readChar(&curdata); /* Protocol version */\n    /* If we don't recognize the protocol version, we don't parse the connect packet on the\n     * basis that we don't know what the format will be.\n     */\n    if (MQTTPacket_checkVersion(&Protocol, version))\n    {\n        flags.all = readChar(&curdata);\n        data->cleansession = flags.bits.cleansession;\n        data->keepAliveInterval = readInt(&curdata);\n        if (!readMQTTLenString(&data->clientID, &curdata, enddata))\n            goto exit;\n        data->willFlag = flags.bits.will;\n        if (flags.bits.will)\n        {\n            data->will.qos = flags.bits.willQoS;\n            data->will.retained = flags.bits.willRetain;\n            if (!readMQTTLenString(&data->will.topicName, &curdata, enddata) ||\n                    !readMQTTLenString(&data->will.message, &curdata, enddata))\n                goto exit;\n        }\n        if (flags.bits.username)\n        {\n            if (enddata - curdata < 3 || !readMQTTLenString(&data->username, &curdata, enddata))\n                goto exit; /* username flag set, but no username supplied - invalid */\n            if (flags.bits.password &&\n                    (enddata - curdata < 3 || !readMQTTLenString(&data->password, &curdata, enddata)))\n                goto exit; /* password flag set, but no password supplied - invalid */\n        }\n        else if (flags.bits.password)\n            goto exit; /* password flag set without username - invalid */\n        rc = 1;\n    }\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n/**\n  * Serializes the connack packet into the supplied buffer.\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer\n  * @param connack_rc the integer connack return code to be used\n  * @param sessionPresent the MQTT 3.1.1 sessionPresent flag\n  * @return serialized length, or error if 0\n  */\nint MQTTSerialize_connack(unsigned char *buf, int buflen, unsigned char connack_rc, unsigned char sessionPresent)\n{\n    MQTTHeader header = {0};\n    int rc = 0;\n    unsigned char *ptr = buf;\n    MQTTConnackFlags flags = {0};\n\n    FUNC_ENTRY;\n    if (buflen < 2)\n    {\n        rc = MQTTPACKET_BUFFER_TOO_SHORT;\n        goto exit;\n    }\n    header.byte = 0;\n    header.bits.type = CONNACK;\n    writeChar(&ptr, header.byte); /* write header */\n\n    ptr += MQTTPacket_encode(ptr, 2); /* write remaining length */\n\n    flags.all = 0;\n    flags.bits.sessionpresent = sessionPresent;\n    writeChar(&ptr, flags.all);\n    writeChar(&ptr, connack_rc);\n\n    rc = ptr - buf;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTDeserializePublish.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#include \"StackTrace.h\"\n#include \"MQTTPacket.h\"\n#include <string.h>\n\n#define min(a, b) ((a < b) ? 1 : 0)\n\n/**\n  * Deserializes the supplied (wire) buffer into publish data\n  * @param dup returned integer - the MQTT dup flag\n  * @param qos returned integer - the MQTT QoS value\n  * @param retained returned integer - the MQTT retained flag\n  * @param packetid returned integer - the MQTT packet identifier\n  * @param topicName returned MQTTString - the MQTT topic in the publish\n  * @param payload returned byte buffer - the MQTT publish payload\n  * @param payloadlen returned integer - the length of the MQTT payload\n  * @param buf the raw buffer data, of the correct length determined by the remaining length field\n  * @param buflen the length in bytes of the data in the supplied buffer\n  * @return error code.  1 is success\n  */\nint MQTTDeserialize_publish(unsigned char *dup, int *qos, unsigned char *retained, unsigned short *packetid, MQTTString *topicName,\n                            unsigned char **payload, int *payloadlen, unsigned char *buf, int buflen)\n{\n    MQTTHeader header = {0};\n    unsigned char *curdata = buf;\n    unsigned char *enddata = NULL;\n    int rc = 0;\n    int mylen = 0;\n\n    FUNC_ENTRY;\n    header.byte = readChar(&curdata);\n    if (header.bits.type != PUBLISH)\n        goto exit;\n    *dup = header.bits.dup;\n    *qos = header.bits.qos;\n    *retained = header.bits.retain;\n\n    curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */\n    enddata = curdata + mylen;\n\n    if (!readMQTTLenString(topicName, &curdata, enddata) ||\n            enddata - curdata < 0) /* do we have enough data to read the protocol version byte? */\n        goto exit;\n\n    if (*qos > 0)\n        *packetid = readInt(&curdata);\n\n    *payloadlen = enddata - curdata;\n    *payload = curdata;\n    rc = 1;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n\n/**\n  * Deserializes the supplied (wire) buffer into an ack\n  * @param packettype returned integer - the MQTT packet type\n  * @param dup returned integer - the MQTT dup flag\n  * @param packetid returned integer - the MQTT packet identifier\n  * @param buf the raw buffer data, of the correct length determined by the remaining length field\n  * @param buflen the length in bytes of the data in the supplied buffer\n  * @return error code.  1 is success, 0 is failure\n  */\nint MQTTDeserialize_ack(unsigned char *packettype, unsigned char *dup, unsigned short *packetid, unsigned char *buf, int buflen)\n{\n    MQTTHeader header = {0};\n    unsigned char *curdata = buf;\n    unsigned char *enddata = NULL;\n    int rc = 0;\n    int mylen;\n\n    FUNC_ENTRY;\n    header.byte = readChar(&curdata);\n    *dup = header.bits.dup;\n    *packettype = header.bits.type;\n\n    curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */\n    enddata = curdata + mylen;\n\n    if (enddata - curdata < 2)\n        goto exit;\n    *packetid = readInt(&curdata);\n\n    rc = 1;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTFormat.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#include \"StackTrace.h\"\n#include \"MQTTPacket.h\"\n\n#include <string.h>\n\n\nconst char *MQTTPacket_names[] =\n{\n    \"RESERVED\", \"CONNECT\", \"CONNACK\", \"PUBLISH\", \"PUBACK\", \"PUBREC\", \"PUBREL\",\n    \"PUBCOMP\", \"SUBSCRIBE\", \"SUBACK\", \"UNSUBSCRIBE\", \"UNSUBACK\",\n    \"PINGREQ\", \"PINGRESP\", \"DISCONNECT\"\n};\n\n\nconst char *MQTTPacket_getName(unsigned short packetid)\n{\n    return MQTTPacket_names[packetid];\n}\n\n\nint MQTTStringFormat_connect(char *strbuf, int strbuflen, MQTTPacket_connectData *data)\n{\n    int strindex = 0;\n\n    strindex = snprintf(strbuf, strbuflen,\n                        \"CONNECT MQTT version %d, client id %.*s, clean session %d, keep alive %d\",\n                        (int)data->MQTTVersion, data->clientID.lenstring.len, data->clientID.lenstring.data,\n                        (int)data->cleansession, data->keepAliveInterval);\n    if (data->willFlag)\n        strindex += snprintf(&strbuf[strindex], strbuflen - strindex,\n                             \", will QoS %d, will retain %d, will topic %.*s, will message %.*s\",\n                             data->will.qos, data->will.retained,\n                             data->will.topicName.lenstring.len, data->will.topicName.lenstring.data,\n                             data->will.message.lenstring.len, data->will.message.lenstring.data);\n    if (data->username.lenstring.data && data->username.lenstring.len > 0)\n        strindex += snprintf(&strbuf[strindex], strbuflen - strindex,\n                             \", user name %.*s\", data->username.lenstring.len, data->username.lenstring.data);\n    if (data->password.lenstring.data && data->password.lenstring.len > 0)\n        strindex += snprintf(&strbuf[strindex], strbuflen - strindex,\n                             \", password %.*s\", data->password.lenstring.len, data->password.lenstring.data);\n    return strindex;\n}\n\n\nint MQTTStringFormat_connack(char *strbuf, int strbuflen, unsigned char connack_rc, unsigned char sessionPresent)\n{\n    int strindex = snprintf(strbuf, strbuflen, \"CONNACK session present %d, rc %d\", sessionPresent, connack_rc);\n    return strindex;\n}\n\n\nint MQTTStringFormat_publish(char *strbuf, int strbuflen, unsigned char dup, int qos, unsigned char retained,\n                             unsigned short packetid, MQTTString topicName, unsigned char *payload, int payloadlen)\n{\n    int strindex = snprintf(strbuf, strbuflen,\n                            \"PUBLISH dup %d, QoS %d, retained %d, packet id %d, topic %.*s, payload length %d, payload %.*s\",\n                            dup, qos, retained, packetid,\n                            (topicName.lenstring.len < 20) ? topicName.lenstring.len : 20, topicName.lenstring.data,\n                            payloadlen, (payloadlen < 20) ? payloadlen : 20, payload);\n    return strindex;\n}\n\n\nint MQTTStringFormat_ack(char *strbuf, int strbuflen, unsigned char packettype, unsigned char dup, unsigned short packetid)\n{\n    int strindex = snprintf(strbuf, strbuflen, \"%s, packet id %d\", MQTTPacket_names[packettype], packetid);\n    if (dup)\n        strindex += snprintf(strbuf + strindex, strbuflen - strindex, \", dup %d\", dup);\n    return strindex;\n}\n\n\nint MQTTStringFormat_subscribe(char *strbuf, int strbuflen, unsigned char dup, unsigned short packetid, int count,\n                               MQTTString topicFilters[], int requestedQoSs[])\n{\n    return snprintf(strbuf, strbuflen,\n                    \"SUBSCRIBE dup %d, packet id %d count %d topic %.*s qos %d\",\n                    dup, packetid, count,\n                    topicFilters[0].lenstring.len, topicFilters[0].lenstring.data,\n                    requestedQoSs[0]);\n}\n\n\nint MQTTStringFormat_suback(char *strbuf, int strbuflen, unsigned short packetid, int count, int *grantedQoSs)\n{\n    return snprintf(strbuf, strbuflen,\n                    \"SUBACK packet id %d count %d granted qos %d\", packetid, count, grantedQoSs[0]);\n}\n\n\nint MQTTStringFormat_unsubscribe(char *strbuf, int strbuflen, unsigned char dup, unsigned short packetid,\n                                 int count, MQTTString topicFilters[])\n{\n    return snprintf(strbuf, strbuflen,\n                    \"UNSUBSCRIBE dup %d, packet id %d count %d topic %.*s\",\n                    dup, packetid, count,\n                    topicFilters[0].lenstring.len, topicFilters[0].lenstring.data);\n}\n\n\n#if defined(MQTT_CLIENT)\nchar *MQTTFormat_toClientString(char *strbuf, int strbuflen, unsigned char *buf, int buflen)\n{\n    int index = 0;\n    int rem_length = 0;\n    MQTTHeader header = {0};\n    int strindex = 0;\n\n    header.byte = buf[index++];\n    index += MQTTPacket_decodeBuf(&buf[index], &rem_length);\n\n    switch (header.bits.type)\n    {\n\n    case CONNACK:\n    {\n        unsigned char sessionPresent, connack_rc;\n        if (MQTTDeserialize_connack(&sessionPresent, &connack_rc, buf, buflen) == 1)\n            strindex = MQTTStringFormat_connack(strbuf, strbuflen, connack_rc, sessionPresent);\n    }\n    break;\n    case PUBLISH:\n    {\n        unsigned char dup, retained, *payload;\n        unsigned short packetid;\n        int qos, payloadlen;\n        MQTTString topicName = MQTTString_initializer;\n        if (MQTTDeserialize_publish(&dup, &qos, &retained, &packetid, &topicName,\n                                    &payload, &payloadlen, buf, buflen) == 1)\n            strindex = MQTTStringFormat_publish(strbuf, strbuflen, dup, qos, retained, packetid,\n                                                topicName, payload, payloadlen);\n    }\n    break;\n    case PUBACK:\n    case PUBREC:\n    case PUBREL:\n    case PUBCOMP:\n    {\n        unsigned char packettype, dup;\n        unsigned short packetid;\n        if (MQTTDeserialize_ack(&packettype, &dup, &packetid, buf, buflen) == 1)\n            strindex = MQTTStringFormat_ack(strbuf, strbuflen, packettype, dup, packetid);\n    }\n    break;\n    case SUBACK:\n    {\n        unsigned short packetid;\n        int maxcount = 1, count = 0;\n        int grantedQoSs[1];\n        if (MQTTDeserialize_suback(&packetid, maxcount, &count, grantedQoSs, buf, buflen) == 1)\n            strindex = MQTTStringFormat_suback(strbuf, strbuflen, packetid, count, grantedQoSs);\n    }\n    break;\n    case UNSUBACK:\n    {\n        unsigned short packetid;\n        if (MQTTDeserialize_unsuback(&packetid, buf, buflen) == 1)\n            strindex = MQTTStringFormat_ack(strbuf, strbuflen, UNSUBACK, 0, packetid);\n    }\n    break;\n    case PINGREQ:\n    case PINGRESP:\n    case DISCONNECT:\n        strindex = snprintf(strbuf, strbuflen, \"%s\", MQTTPacket_names[header.bits.type]);\n        break;\n    }\n    return strbuf;\n}\n#endif\n\n#if defined(MQTT_SERVER)\nchar *MQTTFormat_toServerString(char *strbuf, int strbuflen, unsigned char *buf, int buflen)\n{\n    int index = 0;\n    int rem_length = 0;\n    MQTTHeader header = {0};\n    int strindex = 0;\n\n    header.byte = buf[index++];\n    index += MQTTPacket_decodeBuf(&buf[index], &rem_length);\n\n    switch (header.bits.type)\n    {\n    case CONNECT:\n    {\n        MQTTPacket_connectData data;\n        int rc;\n        if ((rc = MQTTDeserialize_connect(&data, buf, buflen)) == 1)\n            strindex = MQTTStringFormat_connect(strbuf, strbuflen, &data);\n    }\n    break;\n    case PUBLISH:\n    {\n        unsigned char dup, retained, *payload;\n        unsigned short packetid;\n        int qos, payloadlen;\n        MQTTString topicName = MQTTString_initializer;\n        if (MQTTDeserialize_publish(&dup, &qos, &retained, &packetid, &topicName,\n                                    &payload, &payloadlen, buf, buflen) == 1)\n            strindex = MQTTStringFormat_publish(strbuf, strbuflen, dup, qos, retained, packetid,\n                                                topicName, payload, payloadlen);\n    }\n    break;\n    case PUBACK:\n    case PUBREC:\n    case PUBREL:\n    case PUBCOMP:\n    {\n        unsigned char packettype, dup;\n        unsigned short packetid;\n        if (MQTTDeserialize_ack(&packettype, &dup, &packetid, buf, buflen) == 1)\n            strindex = MQTTStringFormat_ack(strbuf, strbuflen, packettype, dup, packetid);\n    }\n    break;\n    case SUBSCRIBE:\n    {\n        unsigned char dup;\n        unsigned short packetid;\n        int maxcount = 1, count = 0;\n        MQTTString topicFilters[1];\n        int requestedQoSs[1];\n        if (MQTTDeserialize_subscribe(&dup, &packetid, maxcount, &count,\n                                      topicFilters, requestedQoSs, buf, buflen) == 1)\n            strindex = MQTTStringFormat_subscribe(strbuf, strbuflen, dup, packetid, count, topicFilters, requestedQoSs);;\n    }\n    break;\n    case UNSUBSCRIBE:\n    {\n        unsigned char dup;\n        unsigned short packetid;\n        int maxcount = 1, count = 0;\n        MQTTString topicFilters[1];\n        if (MQTTDeserialize_unsubscribe(&dup, &packetid, maxcount, &count, topicFilters, buf, buflen) == 1)\n            strindex =  MQTTStringFormat_unsubscribe(strbuf, strbuflen, dup, packetid, count, topicFilters);\n    }\n    break;\n    case PINGREQ:\n    case PINGRESP:\n    case DISCONNECT:\n        strindex = snprintf(strbuf, strbuflen, \"%s\", MQTTPacket_names[header.bits.type]);\n        break;\n    }\n    strbuf[strbuflen] = '\\0';\n    return strbuf;\n}\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTFormat.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#if !defined(MQTTFORMAT_H)\n#define MQTTFORMAT_H\n\n#include \"StackTrace.h\"\n#include \"MQTTPacket.h\"\n\nconst char* MQTTPacket_getName(unsigned short packetid);\nint MQTTStringFormat_connect(char* strbuf, int strbuflen, MQTTPacket_connectData* data);\nint MQTTStringFormat_connack(char* strbuf, int strbuflen, unsigned char connack_rc, unsigned char sessionPresent);\nint MQTTStringFormat_publish(char* strbuf, int strbuflen, unsigned char dup, int qos, unsigned char retained,\n\t\tunsigned short packetid, MQTTString topicName, unsigned char* payload, int payloadlen);\nint MQTTStringFormat_ack(char* strbuf, int strbuflen, unsigned char packettype, unsigned char dup, unsigned short packetid);\nint MQTTStringFormat_subscribe(char* strbuf, int strbuflen, unsigned char dup, unsigned short packetid, int count,\n\t\tMQTTString topicFilters[], int requestedQoSs[]);\nint MQTTStringFormat_suback(char* strbuf, int strbuflen, unsigned short packetid, int count, int* grantedQoSs);\nint MQTTStringFormat_unsubscribe(char* strbuf, int strbuflen, unsigned char dup, unsigned short packetid,\n\t\tint count, MQTTString topicFilters[]);\nchar* MQTTFormat_toClientString(char* strbuf, int strbuflen, unsigned char* buf, int buflen);\nchar* MQTTFormat_toServerString(char* strbuf, int strbuflen, unsigned char* buf, int buflen);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTPacket.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Sergio R. Caprile - non-blocking packet read functions for stream transport\n *******************************************************************************/\n\n#include \"StackTrace.h\"\n#include \"MQTTPacket.h\"\n\n#include <string.h>\n\n/**\n * Encodes the message length according to the MQTT algorithm\n * @param buf the buffer into which the encoded data is written\n * @param length the length to be encoded\n * @return the number of bytes written to buffer\n */\nint MQTTPacket_encode(unsigned char *buf, int length)\n{\n    int rc = 0;\n\n    FUNC_ENTRY;\n    do\n    {\n        char d = length % 128;\n        length /= 128;\n        /* if there are more digits to encode, set the top bit of this digit */\n        if (length > 0)\n            d |= 0x80;\n        buf[rc++] = d;\n    }\n    while (length > 0);\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n/**\n * Decodes the message length according to the MQTT algorithm\n * @param getcharfn pointer to function to read the next character from the data source\n * @param value the decoded length returned\n * @return the number of bytes read from the socket\n */\nint MQTTPacket_decode(int (*getcharfn)(unsigned char *, int), int *value)\n{\n    unsigned char c;\n    int multiplier = 1;\n    int len = 0;\n#define MAX_NO_OF_REMAINING_LENGTH_BYTES 4\n\n    FUNC_ENTRY;\n    *value = 0;\n    do\n    {\n        int rc = MQTTPACKET_READ_ERROR;\n\n        if (++len > MAX_NO_OF_REMAINING_LENGTH_BYTES)\n        {\n            rc = MQTTPACKET_READ_ERROR;\t/* bad data */\n            goto exit;\n        }\n        rc = (*getcharfn)(&c, 1);\n        if (rc != 1)\n            goto exit;\n        *value += (c & 127) * multiplier;\n        multiplier *= 128;\n    }\n    while ((c & 128) != 0);\nexit:\n    FUNC_EXIT_RC(len);\n    return len;\n}\n\n\nint MQTTPacket_len(int rem_len)\n{\n    rem_len += 1; /* header byte */\n\n    /* now remaining_length field */\n    if (rem_len < 128)\n        rem_len += 1;\n    else if (rem_len < 16384)\n        rem_len += 2;\n    else if (rem_len < 2097151)\n        rem_len += 3;\n    else\n        rem_len += 4;\n    return rem_len;\n}\n\n\nstatic unsigned char *bufptr;\n\nint bufchar(unsigned char *c, int count)\n{\n    int i;\n\n    for (i = 0; i < count; ++i)\n        *c = *bufptr++;\n    return count;\n}\n\n\nint MQTTPacket_decodeBuf(unsigned char *buf, int *value)\n{\n    bufptr = buf;\n    return MQTTPacket_decode(bufchar, value);\n}\n\n\n/**\n * Calculates an integer from two bytes read from the input buffer\n * @param pptr pointer to the input buffer - incremented by the number of bytes used & returned\n * @return the integer value calculated\n */\nint readInt(unsigned char **pptr)\n{\n    unsigned char *ptr = *pptr;\n    int len = 256 * (*ptr) + (*(ptr + 1));\n    *pptr += 2;\n    return len;\n}\n\n\n/**\n * Reads one character from the input buffer.\n * @param pptr pointer to the input buffer - incremented by the number of bytes used & returned\n * @return the character read\n */\nchar readChar(unsigned char **pptr)\n{\n    char c = **pptr;\n    (*pptr)++;\n    return c;\n}\n\n\n/**\n * Writes one character to an output buffer.\n * @param pptr pointer to the output buffer - incremented by the number of bytes used & returned\n * @param c the character to write\n */\nvoid writeChar(unsigned char **pptr, char c)\n{\n    **pptr = c;\n    (*pptr)++;\n}\n\n\n/**\n * Writes an integer as 2 bytes to an output buffer.\n * @param pptr pointer to the output buffer - incremented by the number of bytes used & returned\n * @param anInt the integer to write\n */\nvoid writeInt(unsigned char **pptr, int anInt)\n{\n    **pptr = (unsigned char)(anInt / 256);\n    (*pptr)++;\n    **pptr = (unsigned char)(anInt % 256);\n    (*pptr)++;\n}\n\n\n/**\n * Writes a \"UTF\" string to an output buffer.  Converts C string to length-delimited.\n * @param pptr pointer to the output buffer - incremented by the number of bytes used & returned\n * @param string the C string to write\n */\nvoid writeCString(unsigned char **pptr, const char *string)\n{\n    int len = strlen(string);\n    writeInt(pptr, len);\n    memcpy(*pptr, string, len);\n    *pptr += len;\n}\n\n\nint getLenStringLen(char *ptr)\n{\n    int len = 256 * ((unsigned char)(*ptr)) + (unsigned char)(*(ptr + 1));\n    return len;\n}\n\n\nvoid writeMQTTString(unsigned char **pptr, MQTTString mqttstring)\n{\n    if (mqttstring.lenstring.len > 0)\n    {\n        writeInt(pptr, mqttstring.lenstring.len);\n        memcpy(*pptr, mqttstring.lenstring.data, mqttstring.lenstring.len);\n        *pptr += mqttstring.lenstring.len;\n    }\n    else if (mqttstring.cstring)\n        writeCString(pptr, mqttstring.cstring);\n    else\n        writeInt(pptr, 0);\n}\n\n\n/**\n * @param mqttstring the MQTTString structure into which the data is to be read\n * @param pptr pointer to the output buffer - incremented by the number of bytes used & returned\n * @param enddata pointer to the end of the data: do not read beyond\n * @return 1 if successful, 0 if not\n */\nint readMQTTLenString(MQTTString *mqttstring, unsigned char **pptr, unsigned char *enddata)\n{\n    int rc = 0;\n\n    FUNC_ENTRY;\n    /* the first two bytes are the length of the string */\n    if (enddata - (*pptr) > 1) /* enough length to read the integer? */\n    {\n        mqttstring->lenstring.len = readInt(pptr); /* increments pptr to point past length */\n        if (&(*pptr)[mqttstring->lenstring.len] <= enddata)\n        {\n            mqttstring->lenstring.data = (char *)*pptr;\n            *pptr += mqttstring->lenstring.len;\n            rc = 1;\n        }\n    }\n    mqttstring->cstring = NULL;\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n/**\n * Return the length of the MQTTstring - C string if there is one, otherwise the length delimited string\n * @param mqttstring the string to return the length of\n * @return the length of the string\n */\nint MQTTstrlen(MQTTString mqttstring)\n{\n    int rc = 0;\n\n    if (mqttstring.cstring)\n        rc = strlen(mqttstring.cstring);\n    else\n        rc = mqttstring.lenstring.len;\n    return rc;\n}\n\n\n/**\n * Compares an MQTTString to a C string\n * @param a the MQTTString to compare\n * @param bptr the C string to compare\n * @return boolean - equal or not\n */\nint MQTTPacket_equals(MQTTString *a, char *bptr)\n{\n    int alen = 0,\n        blen = 0;\n    char *aptr;\n\n    if (a->cstring)\n    {\n        aptr = a->cstring;\n        alen = strlen(a->cstring);\n    }\n    else\n    {\n        aptr = a->lenstring.data;\n        alen = a->lenstring.len;\n    }\n    blen = strlen(bptr);\n\n    return (alen == blen) && (strncmp(aptr, bptr, alen) == 0);\n}\n\n\n/**\n * Helper function to read packet data from some source into a buffer\n * @param buf the buffer into which the packet will be serialized\n * @param buflen the length in bytes of the supplied buffer\n * @param getfn pointer to a function which will read any number of bytes from the needed source\n * @return integer MQTT packet type, or -1 on error\n * @note  the whole message must fit into the caller's buffer\n */\nint MQTTPacket_read(unsigned char *buf, int buflen, int (*getfn)(unsigned char *, int))\n{\n    int rc = -1;\n    MQTTHeader header = {0};\n    int len = 0;\n    int rem_len = 0;\n\n    /* 1. read the header byte.  This has the packet type in it */\n    if ((*getfn)(buf, 1) != 1)\n        goto exit;\n\n    len = 1;\n    /* 2. read the remaining length.  This is variable in itself */\n    MQTTPacket_decode(getfn, &rem_len);\n    len += MQTTPacket_encode(buf + 1, rem_len); /* put the original remaining length back into the buffer */\n\n    /* 3. read the rest of the buffer using a callback to supply the rest of the data */\n    if((rem_len + len) > buflen)\n        goto exit;\n    if (rem_len && ((*getfn)(buf + len, rem_len) != rem_len))\n        goto exit;\n\n    header.byte = buf[0];\n    rc = header.bits.type;\nexit:\n    return rc;\n}\n\n/**\n * Decodes the message length according to the MQTT algorithm, non-blocking\n * @param trp pointer to a transport structure holding what is needed to solve getting data from it\n * @param value the decoded length returned\n * @return integer the number of bytes read from the socket, 0 for call again, or -1 on error\n */\nstatic int MQTTPacket_decodenb(MQTTTransport *trp)\n{\n    unsigned char c;\n    int rc = MQTTPACKET_READ_ERROR;\n\n    FUNC_ENTRY;\n    if(trp->len == 0) \t\t/* initialize on first call */\n    {\n        trp->multiplier = 1;\n        trp->rem_len = 0;\n    }\n    do\n    {\n        int frc;\n        if (trp->len >= MAX_NO_OF_REMAINING_LENGTH_BYTES)\n            goto exit;\n        if ((frc = (*trp->getfn)(trp->sck, &c, 1)) == -1)\n            goto exit;\n        if (frc == 0)\n        {\n            rc = 0;\n            goto exit;\n        }\n        ++(trp->len);\n        trp->rem_len += (c & 127) * trp->multiplier;\n        trp->multiplier *= 128;\n    }\n    while ((c & 128) != 0);\n    rc = trp->len;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n/**\n * Helper function to read packet data from some source into a buffer, non-blocking\n * @param buf the buffer into which the packet will be serialized\n * @param buflen the length in bytes of the supplied buffer\n * @param trp pointer to a transport structure holding what is needed to solve getting data from it\n * @return integer MQTT packet type, 0 for call again, or -1 on error\n * @note  the whole message must fit into the caller's buffer\n */\nint MQTTPacket_readnb(unsigned char *buf, int buflen, MQTTTransport *trp)\n{\n    int rc = -1, frc;\n    MQTTHeader header = {0};\n\n    switch(trp->state)\n    {\n    default:\n        trp->state = 0;\n    /*FALLTHROUGH*/\n    case 0:\n        /* read the header byte.  This has the packet type in it */\n        if ((frc = (*trp->getfn)(trp->sck, buf, 1)) == -1)\n            goto exit;\n        if (frc == 0)\n            return 0;\n        trp->len = 0;\n        ++trp->state;\n    /*FALLTHROUGH*/\n    /* read the remaining length.  This is variable in itself */\n    case 1:\n        if((frc = MQTTPacket_decodenb(trp)) == MQTTPACKET_READ_ERROR)\n            goto exit;\n        if(frc == 0)\n            return 0;\n        trp->len = 1 + MQTTPacket_encode(buf + 1, trp->rem_len); /* put the original remaining length back into the buffer */\n        if((trp->rem_len + trp->len) > buflen)\n            goto exit;\n        ++trp->state;\n    /*FALLTHROUGH*/\n    case 2:\n        if(trp->rem_len)\n        {\n            /* read the rest of the buffer using a callback to supply the rest of the data */\n            if ((frc = (*trp->getfn)(trp->sck, buf + trp->len, trp->rem_len)) == -1)\n                goto exit;\n            if (frc == 0)\n                return 0;\n            trp->rem_len -= frc;\n            trp->len += frc;\n            if(trp->rem_len)\n                return 0;\n        }\n        header.byte = buf[0];\n        rc = header.bits.type;\n        break;\n    }\n\nexit:\n    trp->state = 0;\n    return rc;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTPacket.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Xiang Rong - 442039 Add makefile to Embedded C client\n *******************************************************************************/\n\n#ifndef MQTTPACKET_H_\n#define MQTTPACKET_H_\n\n#if defined(__cplusplus) /* If this is a C++ compiler, use C linkage */\nextern \"C\" {\n#endif\n\n#if defined(WIN32_DLL) || defined(WIN64_DLL)\n  #define DLLImport __declspec(dllimport)\n  #define DLLExport __declspec(dllexport)\n#elif defined(LINUX_SO)\n  #define DLLImport extern\n  #define DLLExport  __attribute__ ((visibility (\"default\")))\n#else\n  #define DLLImport\n  #define DLLExport  \n#endif\n\nenum errors\n{\n\tMQTTPACKET_BUFFER_TOO_SHORT = -2,\n\tMQTTPACKET_READ_ERROR = -1,\n\tMQTTPACKET_READ_COMPLETE\n};\n\nenum msgTypes\n{\n\tCONNECT = 1, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL,\n\tPUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK,\n\tPINGREQ, PINGRESP, DISCONNECT\n};\n\n/**\n * Bitfields for the MQTT header byte.\n */\ntypedef union\n{\n\tunsigned char byte;\t                /**< the whole byte */\n#if defined(REVERSED)\n\tstruct\n\t{\n\t\tunsigned int type : 4;\t\t\t/**< message type nibble */\n\t\tunsigned int dup : 1;\t\t\t\t/**< DUP flag bit */\n\t\tunsigned int qos : 2;\t\t\t\t/**< QoS value, 0, 1 or 2 */\n\t\tunsigned int retain : 1;\t\t/**< retained flag bit */\n\t} bits;\n#else\n\tstruct\n\t{\n\t\tunsigned int retain : 1;\t\t/**< retained flag bit */\n\t\tunsigned int qos : 2;\t\t\t\t/**< QoS value, 0, 1 or 2 */\n\t\tunsigned int dup : 1;\t\t\t\t/**< DUP flag bit */\n\t\tunsigned int type : 4;\t\t\t/**< message type nibble */\n\t} bits;\n#endif\n} MQTTHeader;\n\ntypedef struct\n{\n\tint len;\n\tchar* data;\n} MQTTLenString;\n\ntypedef struct\n{\n\tchar* cstring;\n\tMQTTLenString lenstring;\n} MQTTString;\n\n#define MQTTString_initializer {NULL, {0, NULL}}\n\nint MQTTstrlen(MQTTString mqttstring);\n\n#include \"MQTTConnect.h\"\n#include \"MQTTPublish.h\"\n#include \"MQTTSubscribe.h\"\n#include \"MQTTUnsubscribe.h\"\n#include \"MQTTFormat.h\"\n\nDLLExport int MQTTSerialize_ack(unsigned char* buf, int buflen, unsigned char type, unsigned char dup, unsigned short packetid);\nDLLExport int MQTTDeserialize_ack(unsigned char* packettype, unsigned char* dup, unsigned short* packetid, unsigned char* buf, int buflen);\n\nint MQTTPacket_len(int rem_len);\nDLLExport int MQTTPacket_equals(MQTTString* a, char* b);\n\nDLLExport int MQTTPacket_encode(unsigned char* buf, int length);\nint MQTTPacket_decode(int (*getcharfn)(unsigned char*, int), int* value);\nint MQTTPacket_decodeBuf(unsigned char* buf, int* value);\n\nint readInt(unsigned char** pptr);\nchar readChar(unsigned char** pptr);\nvoid writeChar(unsigned char** pptr, char c);\nvoid writeInt(unsigned char** pptr, int anInt);\nint readMQTTLenString(MQTTString* mqttstring, unsigned char** pptr, unsigned char* enddata);\nvoid writeCString(unsigned char** pptr, const char* string);\nvoid writeMQTTString(unsigned char** pptr, MQTTString mqttstring);\n\nDLLExport int MQTTPacket_read(unsigned char* buf, int buflen, int (*getfn)(unsigned char*, int));\n\ntypedef struct {\n\tint (*getfn)(void *, unsigned char*, int); /* must return -1 for error, 0 for call again, or the number of bytes read */\n\tvoid *sck;\t/* pointer to whatever the system may use to identify the transport */\n\tint multiplier;\n\tint rem_len;\n\tint len;\n\tchar state;\n}MQTTTransport;\n\nint MQTTPacket_readnb(unsigned char* buf, int buflen, MQTTTransport *trp);\n\n#ifdef __cplusplus /* If this is a C++ compiler, use C linkage */\n}\n#endif\n\n\n#endif /* MQTTPACKET_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTPublish.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Xiang Rong - 442039 Add makefile to Embedded C client\n *******************************************************************************/\n\n#ifndef MQTTPUBLISH_H_\n#define MQTTPUBLISH_H_\n\n#if !defined(DLLImport)\n  #define DLLImport \n#endif\n#if !defined(DLLExport)\n  #define DLLExport\n#endif\n\nDLLExport int MQTTSerialize_publish(unsigned char* buf, int buflen, unsigned char dup, int qos, unsigned char retained, unsigned short packetid,\n\t\tMQTTString topicName, unsigned char* payload, int payloadlen);\n\nDLLExport int MQTTDeserialize_publish(unsigned char* dup, int* qos, unsigned char* retained, unsigned short* packetid, MQTTString* topicName,\n\t\tunsigned char** payload, int* payloadlen, unsigned char* buf, int len);\n\nDLLExport int MQTTSerialize_puback(unsigned char* buf, int buflen, unsigned short packetid);\nDLLExport int MQTTSerialize_pubrel(unsigned char* buf, int buflen, unsigned char dup, unsigned short packetid);\nDLLExport int MQTTSerialize_pubcomp(unsigned char* buf, int buflen, unsigned short packetid);\n\n#endif /* MQTTPUBLISH_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTSerializePublish.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Ian Craggs - fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=453144\n *******************************************************************************/\n\n#include \"MQTTPacket.h\"\n#include \"StackTrace.h\"\n\n#include <string.h>\n\n\n/**\n  * Determines the length of the MQTT publish packet that would be produced using the supplied parameters\n  * @param qos the MQTT QoS of the publish (packetid is omitted for QoS 0)\n  * @param topicName the topic name to be used in the publish\n  * @param payloadlen the length of the payload to be sent\n  * @return the length of buffer needed to contain the serialized version of the packet\n  */\nint MQTTSerialize_publishLength(int qos, MQTTString topicName, int payloadlen)\n{\n    int len = 0;\n\n    len += 2 + MQTTstrlen(topicName) + payloadlen;\n    if (qos > 0)\n        len += 2; /* packetid */\n    return len;\n}\n\n\n/**\n  * Serializes the supplied publish data into the supplied buffer, ready for sending\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer\n  * @param dup integer - the MQTT dup flag\n  * @param qos integer - the MQTT QoS value\n  * @param retained integer - the MQTT retained flag\n  * @param packetid integer - the MQTT packet identifier\n  * @param topicName MQTTString - the MQTT topic in the publish\n  * @param payload byte buffer - the MQTT publish payload\n  * @param payloadlen integer - the length of the MQTT payload\n  * @return the length of the serialized data.  <= 0 indicates error\n  */\nint MQTTSerialize_publish(unsigned char *buf, int buflen, unsigned char dup, int qos, unsigned char retained, unsigned short packetid,\n                          MQTTString topicName, unsigned char *payload, int payloadlen)\n{\n    unsigned char *ptr = buf;\n    MQTTHeader header = {0};\n    int rem_len = 0;\n    int rc = 0;\n\n    FUNC_ENTRY;\n    if (MQTTPacket_len(rem_len = MQTTSerialize_publishLength(qos, topicName, payloadlen)) > buflen)\n    {\n        rc = MQTTPACKET_BUFFER_TOO_SHORT;\n        goto exit;\n    }\n\n    header.bits.type = PUBLISH;\n    header.bits.dup = dup;\n    header.bits.qos = qos;\n    header.bits.retain = retained;\n    writeChar(&ptr, header.byte); /* write header */\n\n    ptr += MQTTPacket_encode(ptr, rem_len); /* write remaining length */;\n\n    writeMQTTString(&ptr, topicName);\n\n    if (qos > 0)\n        writeInt(&ptr, packetid);\n\n    memcpy(ptr, payload, payloadlen);\n    ptr += payloadlen;\n\n    rc = ptr - buf;\n\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n\n/**\n  * Serializes the ack packet into the supplied buffer.\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer\n  * @param type the MQTT packet type\n  * @param dup the MQTT dup flag\n  * @param packetid the MQTT packet identifier\n  * @return serialized length, or error if 0\n  */\nint MQTTSerialize_ack(unsigned char *buf, int buflen, unsigned char packettype, unsigned char dup, unsigned short packetid)\n{\n    MQTTHeader header = {0};\n    int rc = 0;\n    unsigned char *ptr = buf;\n\n    FUNC_ENTRY;\n    if (buflen < 4)\n    {\n        rc = MQTTPACKET_BUFFER_TOO_SHORT;\n        goto exit;\n    }\n    header.bits.type = packettype;\n    header.bits.dup = dup;\n    header.bits.qos = (packettype == PUBREL) ? 1 : 0;\n    writeChar(&ptr, header.byte); /* write header */\n\n    ptr += MQTTPacket_encode(ptr, 2); /* write remaining length */\n    writeInt(&ptr, packetid);\n    rc = ptr - buf;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n/**\n  * Serializes a puback packet into the supplied buffer.\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer\n  * @param packetid integer - the MQTT packet identifier\n  * @return serialized length, or error if 0\n  */\nint MQTTSerialize_puback(unsigned char *buf, int buflen, unsigned short packetid)\n{\n    return MQTTSerialize_ack(buf, buflen, PUBACK, 0, packetid);\n}\n\n\n/**\n  * Serializes a pubrel packet into the supplied buffer.\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer\n  * @param dup integer - the MQTT dup flag\n  * @param packetid integer - the MQTT packet identifier\n  * @return serialized length, or error if 0\n  */\nint MQTTSerialize_pubrel(unsigned char *buf, int buflen, unsigned char dup, unsigned short packetid)\n{\n    return MQTTSerialize_ack(buf, buflen, PUBREL, dup, packetid);\n}\n\n\n/**\n  * Serializes a pubrel packet into the supplied buffer.\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer\n  * @param packetid integer - the MQTT packet identifier\n  * @return serialized length, or error if 0\n  */\nint MQTTSerialize_pubcomp(unsigned char *buf, int buflen, unsigned short packetid)\n{\n    return MQTTSerialize_ack(buf, buflen, PUBCOMP, 0, packetid);\n}\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTSubscribe.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Xiang Rong - 442039 Add makefile to Embedded C client\n *******************************************************************************/\n\n#ifndef MQTTSUBSCRIBE_H_\n#define MQTTSUBSCRIBE_H_\n\n#if !defined(DLLImport)\n  #define DLLImport \n#endif\n#if !defined(DLLExport)\n  #define DLLExport\n#endif\n\nDLLExport int MQTTSerialize_subscribe(unsigned char* buf, int buflen, unsigned char dup, unsigned short packetid,\n\t\tint count, MQTTString topicFilters[], int requestedQoSs[]);\n\nDLLExport int MQTTDeserialize_subscribe(unsigned char* dup, unsigned short* packetid,\n\t\tint maxcount, int* count, MQTTString topicFilters[], int requestedQoSs[], unsigned char* buf, int len);\n\nDLLExport int MQTTSerialize_suback(unsigned char* buf, int buflen, unsigned short packetid, int count, int* grantedQoSs);\n\nDLLExport int MQTTDeserialize_suback(unsigned short* packetid, int maxcount, int* count, int grantedQoSs[], unsigned char* buf, int len);\n\n\n#endif /* MQTTSUBSCRIBE_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTSubscribeClient.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#include \"MQTTPacket.h\"\n#include \"StackTrace.h\"\n\n#include <string.h>\n\n/**\n  * Determines the length of the MQTT subscribe packet that would be produced using the supplied parameters\n  * @param count the number of topic filter strings in topicFilters\n  * @param topicFilters the array of topic filter strings to be used in the publish\n  * @return the length of buffer needed to contain the serialized version of the packet\n  */\nint MQTTSerialize_subscribeLength(int count, MQTTString topicFilters[])\n{\n    int i;\n    int len = 2; /* packetid */\n\n    for (i = 0; i < count; ++i)\n        len += 2 + MQTTstrlen(topicFilters[i]) + 1; /* length + topic + req_qos */\n    return len;\n}\n\n\n/**\n  * Serializes the supplied subscribe data into the supplied buffer, ready for sending\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied bufferr\n  * @param dup integer - the MQTT dup flag\n  * @param packetid integer - the MQTT packet identifier\n  * @param count - number of members in the topicFilters and reqQos arrays\n  * @param topicFilters - array of topic filter names\n  * @param requestedQoSs - array of requested QoS\n  * @return the length of the serialized data.  <= 0 indicates error\n  */\nint MQTTSerialize_subscribe(unsigned char *buf, int buflen, unsigned char dup, unsigned short packetid, int count,\n                            MQTTString topicFilters[], int requestedQoSs[])\n{\n    unsigned char *ptr = buf;\n    MQTTHeader header = {0};\n    int rem_len = 0;\n    int rc = 0;\n    int i = 0;\n\n    FUNC_ENTRY;\n    if (MQTTPacket_len(rem_len = MQTTSerialize_subscribeLength(count, topicFilters)) > buflen)\n    {\n        rc = MQTTPACKET_BUFFER_TOO_SHORT;\n        goto exit;\n    }\n\n    header.byte = 0;\n    header.bits.type = SUBSCRIBE;\n    header.bits.dup = dup;\n    header.bits.qos = 1;\n    writeChar(&ptr, header.byte); /* write header */\n\n    ptr += MQTTPacket_encode(ptr, rem_len); /* write remaining length */;\n\n    writeInt(&ptr, packetid);\n\n    for (i = 0; i < count; ++i)\n    {\n        writeMQTTString(&ptr, topicFilters[i]);\n        writeChar(&ptr, requestedQoSs[i]);\n    }\n\n    rc = ptr - buf;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n\n/**\n  * Deserializes the supplied (wire) buffer into suback data\n  * @param packetid returned integer - the MQTT packet identifier\n  * @param maxcount - the maximum number of members allowed in the grantedQoSs array\n  * @param count returned integer - number of members in the grantedQoSs array\n  * @param grantedQoSs returned array of integers - the granted qualities of service\n  * @param buf the raw buffer data, of the correct length determined by the remaining length field\n  * @param buflen the length in bytes of the data in the supplied buffer\n  * @return error code.  1 is success, 0 is failure\n  */\nint MQTTDeserialize_suback(unsigned short *packetid, int maxcount, int *count, int grantedQoSs[], unsigned char *buf, int buflen)\n{\n    MQTTHeader header = {0};\n    unsigned char *curdata = buf;\n    unsigned char *enddata = NULL;\n    int rc = 0;\n    int mylen;\n\n    FUNC_ENTRY;\n    header.byte = readChar(&curdata);\n    if (header.bits.type != SUBACK)\n        goto exit;\n\n    curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */\n    enddata = curdata + mylen;\n    if (enddata - curdata < 2)\n        goto exit;\n\n    *packetid = readInt(&curdata);\n\n    *count = 0;\n    while (curdata < enddata)\n    {\n        if (*count > maxcount)\n        {\n            rc = -1;\n            goto exit;\n        }\n        grantedQoSs[(*count)++] = readChar(&curdata);\n    }\n\n    rc = 1;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTSubscribeServer.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#include \"MQTTPacket.h\"\n#include \"StackTrace.h\"\n\n#include <string.h>\n\n\n/**\n  * Deserializes the supplied (wire) buffer into subscribe data\n  * @param dup integer returned - the MQTT dup flag\n  * @param packetid integer returned - the MQTT packet identifier\n  * @param maxcount - the maximum number of members allowed in the topicFilters and requestedQoSs arrays\n  * @param count - number of members in the topicFilters and requestedQoSs arrays\n  * @param topicFilters - array of topic filter names\n  * @param requestedQoSs - array of requested QoS\n  * @param buf the raw buffer data, of the correct length determined by the remaining length field\n  * @param buflen the length in bytes of the data in the supplied buffer\n  * @return the length of the serialized data.  <= 0 indicates error\n  */\nint MQTTDeserialize_subscribe(unsigned char *dup, unsigned short *packetid, int maxcount, int *count, MQTTString topicFilters[],\n                              int requestedQoSs[], unsigned char *buf, int buflen)\n{\n    MQTTHeader header = {0};\n    unsigned char *curdata = buf;\n    unsigned char *enddata = NULL;\n    int rc = -1;\n    int mylen = 0;\n\n    FUNC_ENTRY;\n    header.byte = readChar(&curdata);\n    if (header.bits.type != SUBSCRIBE)\n        goto exit;\n    *dup = header.bits.dup;\n\n    curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */\n    enddata = curdata + mylen;\n\n    *packetid = readInt(&curdata);\n\n    *count = 0;\n    while (curdata < enddata)\n    {\n        if (!readMQTTLenString(&topicFilters[*count], &curdata, enddata))\n            goto exit;\n        if (curdata >= enddata) /* do we have enough data to read the req_qos version byte? */\n            goto exit;\n        requestedQoSs[*count] = readChar(&curdata);\n        (*count)++;\n    }\n\n    rc = 1;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n/**\n  * Serializes the supplied suback data into the supplied buffer, ready for sending\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer\n  * @param packetid integer - the MQTT packet identifier\n  * @param count - number of members in the grantedQoSs array\n  * @param grantedQoSs - array of granted QoS\n  * @return the length of the serialized data.  <= 0 indicates error\n  */\nint MQTTSerialize_suback(unsigned char *buf, int buflen, unsigned short packetid, int count, int *grantedQoSs)\n{\n    MQTTHeader header = {0};\n    int rc = -1;\n    unsigned char *ptr = buf;\n    int i;\n\n    FUNC_ENTRY;\n    if (buflen < 2 + count)\n    {\n        rc = MQTTPACKET_BUFFER_TOO_SHORT;\n        goto exit;\n    }\n    header.byte = 0;\n    header.bits.type = SUBACK;\n    writeChar(&ptr, header.byte); /* write header */\n\n    ptr += MQTTPacket_encode(ptr, 2 + count); /* write remaining length */\n\n    writeInt(&ptr, packetid);\n\n    for (i = 0; i < count; ++i)\n        writeChar(&ptr, grantedQoSs[i]);\n\n    rc = ptr - buf;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTUnsubscribe.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Xiang Rong - 442039 Add makefile to Embedded C client\n *******************************************************************************/\n\n#ifndef MQTTUNSUBSCRIBE_H_\n#define MQTTUNSUBSCRIBE_H_\n\n#if !defined(DLLImport)\n  #define DLLImport \n#endif\n#if !defined(DLLExport)\n  #define DLLExport\n#endif\n\nDLLExport int MQTTSerialize_unsubscribe(unsigned char* buf, int buflen, unsigned char dup, unsigned short packetid,\n\t\tint count, MQTTString topicFilters[]);\n\nDLLExport int MQTTDeserialize_unsubscribe(unsigned char* dup, unsigned short* packetid, int max_count, int* count, MQTTString topicFilters[],\n\t\tunsigned char* buf, int len);\n\nDLLExport int MQTTSerialize_unsuback(unsigned char* buf, int buflen, unsigned short packetid);\n\nDLLExport int MQTTDeserialize_unsuback(unsigned short* packetid, unsigned char* buf, int len);\n\n#endif /* MQTTUNSUBSCRIBE_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTUnsubscribeClient.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#include \"MQTTPacket.h\"\n#include \"StackTrace.h\"\n\n#include <string.h>\n\n/**\n  * Determines the length of the MQTT unsubscribe packet that would be produced using the supplied parameters\n  * @param count the number of topic filter strings in topicFilters\n  * @param topicFilters the array of topic filter strings to be used in the publish\n  * @return the length of buffer needed to contain the serialized version of the packet\n  */\nint MQTTSerialize_unsubscribeLength(int count, MQTTString topicFilters[])\n{\n    int i;\n    int len = 2; /* packetid */\n\n    for (i = 0; i < count; ++i)\n        len += 2 + MQTTstrlen(topicFilters[i]); /* length + topic*/\n    return len;\n}\n\n\n/**\n  * Serializes the supplied unsubscribe data into the supplied buffer, ready for sending\n  * @param buf the raw buffer data, of the correct length determined by the remaining length field\n  * @param buflen the length in bytes of the data in the supplied buffer\n  * @param dup integer - the MQTT dup flag\n  * @param packetid integer - the MQTT packet identifier\n  * @param count - number of members in the topicFilters array\n  * @param topicFilters - array of topic filter names\n  * @return the length of the serialized data.  <= 0 indicates error\n  */\nint MQTTSerialize_unsubscribe(unsigned char *buf, int buflen, unsigned char dup, unsigned short packetid,\n                              int count, MQTTString topicFilters[])\n{\n    unsigned char *ptr = buf;\n    MQTTHeader header = {0};\n    int rem_len = 0;\n    int rc = -1;\n    int i = 0;\n\n    FUNC_ENTRY;\n    if (MQTTPacket_len(rem_len = MQTTSerialize_unsubscribeLength(count, topicFilters)) > buflen)\n    {\n        rc = MQTTPACKET_BUFFER_TOO_SHORT;\n        goto exit;\n    }\n\n    header.byte = 0;\n    header.bits.type = UNSUBSCRIBE;\n    header.bits.dup = dup;\n    header.bits.qos = 1;\n    writeChar(&ptr, header.byte); /* write header */\n\n    ptr += MQTTPacket_encode(ptr, rem_len); /* write remaining length */;\n\n    writeInt(&ptr, packetid);\n\n    for (i = 0; i < count; ++i)\n        writeMQTTString(&ptr, topicFilters[i]);\n\n    rc = ptr - buf;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n/**\n  * Deserializes the supplied (wire) buffer into unsuback data\n  * @param packetid returned integer - the MQTT packet identifier\n  * @param buf the raw buffer data, of the correct length determined by the remaining length field\n  * @param buflen the length in bytes of the data in the supplied buffer\n  * @return error code.  1 is success, 0 is failure\n  */\nint MQTTDeserialize_unsuback(unsigned short *packetid, unsigned char *buf, int buflen)\n{\n    unsigned char type = 0;\n    unsigned char dup = 0;\n    int rc = 0;\n\n    FUNC_ENTRY;\n    rc = MQTTDeserialize_ack(&type, &dup, packetid, buf, buflen);\n    if (type == UNSUBACK)\n        rc = 1;\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/MQTTUnsubscribeServer.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n#include \"MQTTPacket.h\"\n#include \"StackTrace.h\"\n\n#include <string.h>\n\n\n/**\n  * Deserializes the supplied (wire) buffer into unsubscribe data\n  * @param dup integer returned - the MQTT dup flag\n  * @param packetid integer returned - the MQTT packet identifier\n  * @param maxcount - the maximum number of members allowed in the topicFilters and requestedQoSs arrays\n  * @param count - number of members in the topicFilters and requestedQoSs arrays\n  * @param topicFilters - array of topic filter names\n  * @param buf the raw buffer data, of the correct length determined by the remaining length field\n  * @param buflen the length in bytes of the data in the supplied buffer\n  * @return the length of the serialized data.  <= 0 indicates error\n  */\nint MQTTDeserialize_unsubscribe(unsigned char *dup, unsigned short *packetid, int maxcount, int *count, MQTTString topicFilters[],\n                                unsigned char *buf, int len)\n{\n    MQTTHeader header = {0};\n    unsigned char *curdata = buf;\n    unsigned char *enddata = NULL;\n    int rc = 0;\n    int mylen = 0;\n\n    FUNC_ENTRY;\n    header.byte = readChar(&curdata);\n    if (header.bits.type != UNSUBSCRIBE)\n        goto exit;\n    *dup = header.bits.dup;\n\n    curdata += (rc = MQTTPacket_decodeBuf(curdata, &mylen)); /* read remaining length */\n    enddata = curdata + mylen;\n\n    *packetid = readInt(&curdata);\n\n    *count = 0;\n    while (curdata < enddata)\n    {\n        if (!readMQTTLenString(&topicFilters[*count], &curdata, enddata))\n            goto exit;\n        (*count)++;\n    }\n\n    rc = 1;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n/**\n  * Serializes the supplied unsuback data into the supplied buffer, ready for sending\n  * @param buf the buffer into which the packet will be serialized\n  * @param buflen the length in bytes of the supplied buffer\n  * @param packetid integer - the MQTT packet identifier\n  * @return the length of the serialized data.  <= 0 indicates error\n  */\nint MQTTSerialize_unsuback(unsigned char *buf, int buflen, unsigned short packetid)\n{\n    MQTTHeader header = {0};\n    int rc = 0;\n    unsigned char *ptr = buf;\n\n    FUNC_ENTRY;\n    if (buflen < 2)\n    {\n        rc = MQTTPACKET_BUFFER_TOO_SHORT;\n        goto exit;\n    }\n    header.byte = 0;\n    header.bits.type = UNSUBACK;\n    writeChar(&ptr, header.byte); /* write header */\n\n    ptr += MQTTPacket_encode(ptr, 2); /* write remaining length */\n\n    writeInt(&ptr, packetid);\n\n    rc = ptr - buf;\nexit:\n    FUNC_EXIT_RC(rc);\n    return rc;\n}\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/src/StackTrace.h",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *    Ian Craggs - fix for bug #434081\n *******************************************************************************/\n\n#ifndef STACKTRACE_H_\n#define STACKTRACE_H_\n\n#include <stdio.h>\n#define NOSTACKTRACE 1\n\n#if defined(NOSTACKTRACE)\n#define FUNC_ENTRY\n#define FUNC_ENTRY_NOLOG\n#define FUNC_ENTRY_MED\n#define FUNC_ENTRY_MAX\n#define FUNC_EXIT\n#define FUNC_EXIT_NOLOG\n#define FUNC_EXIT_MED\n#define FUNC_EXIT_MAX\n#define FUNC_EXIT_RC(x)\n#define FUNC_EXIT_MED_RC(x)\n#define FUNC_EXIT_MAX_RC(x)\n\n#else\n\n#if defined(WIN32)\n#define inline __inline\n#define FUNC_ENTRY StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MINIMUM)\n#define FUNC_ENTRY_NOLOG StackTrace_entry(__FUNCTION__, __LINE__, -1)\n#define FUNC_ENTRY_MED StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MEDIUM)\n#define FUNC_ENTRY_MAX StackTrace_entry(__FUNCTION__, __LINE__, TRACE_MAXIMUM)\n#define FUNC_EXIT StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MINIMUM)\n#define FUNC_EXIT_NOLOG StackTrace_exit(__FUNCTION__, __LINE__, -1)\n#define FUNC_EXIT_MED StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MEDIUM)\n#define FUNC_EXIT_MAX StackTrace_exit(__FUNCTION__, __LINE__, NULL, TRACE_MAXIMUM)\n#define FUNC_EXIT_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MINIMUM)\n#define FUNC_EXIT_MED_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MEDIUM)\n#define FUNC_EXIT_MAX_RC(x) StackTrace_exit(__FUNCTION__, __LINE__, &x, TRACE_MAXIMUM)\n#else\n#define FUNC_ENTRY StackTrace_entry(__func__, __LINE__, TRACE_MINIMUM)\n#define FUNC_ENTRY_NOLOG StackTrace_entry(__func__, __LINE__, -1)\n#define FUNC_ENTRY_MED StackTrace_entry(__func__, __LINE__, TRACE_MEDIUM)\n#define FUNC_ENTRY_MAX StackTrace_entry(__func__, __LINE__, TRACE_MAXIMUM)\n#define FUNC_EXIT StackTrace_exit(__func__, __LINE__, NULL, TRACE_MINIMUM)\n#define FUNC_EXIT_NOLOG StackTrace_exit(__func__, __LINE__, NULL, -1)\n#define FUNC_EXIT_MED StackTrace_exit(__func__, __LINE__, NULL, TRACE_MEDIUM)\n#define FUNC_EXIT_MAX StackTrace_exit(__func__, __LINE__, NULL, TRACE_MAXIMUM)\n#define FUNC_EXIT_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MINIMUM)\n#define FUNC_EXIT_MED_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MEDIUM)\n#define FUNC_EXIT_MAX_RC(x) StackTrace_exit(__func__, __LINE__, &x, TRACE_MAXIMUM)\n\nvoid StackTrace_entry(const char* name, int line, int trace);\nvoid StackTrace_exit(const char* name, int line, void* return_value, int trace);\n\nvoid StackTrace_printStack(FILE* dest);\nchar* StackTrace_get(unsigned long);\n\n#endif\n\n#endif\n\n\n\n\n#endif /* STACKTRACE_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/test/CMakeLists.txt",
    "content": "PROJECT(mqttpacket-tests)\n\nIF (WIN32)\n  SET(MQTT_TEST_BROKER \"tcp://mqtt.iotree.co.uk:1883\" CACHE STRING \"Hostname of a test MQTT broker to use\")\n  SET(MQTT_TEST_PROXY \"tcp://localhost:1883\" CACHE STRING \"Hostname of the test proxy to use\")\n  SET(MQTT_SSL_HOSTNAME \"mqtt.iotree.co.uk\" CACHE STRING \"Hostname of a test SSL MQTT broker to use\")\n  SET(CERTDIR $ENV{APPVEYOR_BUILD_FOLDER}/test/ssl)\nELSE ()\n  SET(MQTT_TEST_BROKER \"tcp://localhost:1883\" CACHE STRING \"Hostname of a test MQTT broker to use\")\n  SET(MQTT_TEST_PROXY \"tcp://localhost:1884\" CACHE STRING \"Hostname of the test proxy to use\")\n  SET(MQTT_SSL_HOSTNAME \"localhost\" CACHE STRING \"Hostname of a test SSL MQTT broker to use\")\n  SET(CERTDIR $ENV{TRAVIS_BUILD_DIR}/test/ssl)\nENDIF ()\n\ninclude_directories(../src)\n\nADD_EXECUTABLE(\n\ttest1\n\ttest1.c\n)\n\nTARGET_LINK_LIBRARIES(\n\ttest1\n\tpaho-embed-mqtt3c\n)\n\nADD_TEST(\n\tNAME test1\n\tCOMMAND \"test1\" \"--connection\" ${MQTT_TEST_BROKER}\n)\n\nSET_TESTS_PROPERTIES(\n\ttest1\n\tPROPERTIES TIMEOUT 540\n)\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/test/build_test",
    "content": "gcc -Wall test1.c -o test1 -I../src ../src/MQTTConnectClient.c ../src/MQTTConnectServer.c ../src/MQTTPacket.c ../src/MQTTSerializePublish.c  ../src/MQTTDeserializePublish.c ../src/MQTTSubscribeServer.c ../src/MQTTSubscribeClient.c ../src/MQTTUnsubscribeServer.c ../src/MQTTUnsubscribeClient.c\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/MQTTPacket/test/test1.c",
    "content": "/*******************************************************************************\n * Copyright (c) 2014 IBM Corp.\n *\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * and Eclipse Distribution License v1.0 which accompany this distribution.\n *\n * The Eclipse Public License is available at\n *    http://www.eclipse.org/legal/epl-v10.html\n * and the Eclipse Distribution License is available at\n *   http://www.eclipse.org/org/documents/edl-v10.php.\n *\n * Contributors:\n *    Ian Craggs - initial API and implementation and/or initial documentation\n *******************************************************************************/\n\n\n#include \"MQTTPacket.h\"\n#include <string.h>\n#include <stdlib.h>\n#include <stdio.h>\n\n#if !defined(_WINDOWS)\n#include <sys/time.h>\n#include <sys/socket.h>\n#include <unistd.h>\n#include <errno.h>\n#else\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#define MAXHOSTNAMELEN 256\n#define EAGAIN WSAEWOULDBLOCK\n#define EINTR WSAEINTR\n#define EINPROGRESS WSAEINPROGRESS\n#define EWOULDBLOCK WSAEWOULDBLOCK\n#define ENOTCONN WSAENOTCONN\n#define ECONNRESET WSAECONNRESET\n#endif\n\n#define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))\n\nstruct Options\n{\n    char *connection;         /**< connection to system under test. */\n    char **haconnections;\n    int hacount;\n    int verbose;\n    int test_no;\n} options =\n{\n    \"tcp://m2m.eclipse.org:1883\",\n    NULL,\n    0,\n    0,\n    0,\n};\n\nvoid usage()\n{\n\n}\n\nvoid getopts(int argc, char **argv)\n{\n    int count = 1;\n\n    while (count < argc)\n    {\n        if (strcmp(argv[count], \"--test_no\") == 0)\n        {\n            if (++count < argc)\n                options.test_no = atoi(argv[count]);\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--connection\") == 0)\n        {\n            if (++count < argc)\n            {\n                options.connection = argv[count];\n                printf(\"\\nSetting connection to %s\\n\", options.connection);\n            }\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--haconnections\") == 0)\n        {\n            if (++count < argc)\n            {\n                char *tok = strtok(argv[count], \" \");\n                options.hacount = 0;\n                options.haconnections = malloc(sizeof(char *) * 5);\n                while (tok)\n                {\n                    options.haconnections[options.hacount] = malloc(strlen(tok) + 1);\n                    strcpy(options.haconnections[options.hacount], tok);\n                    options.hacount++;\n                    tok = strtok(NULL, \" \");\n                }\n            }\n            else\n                usage();\n        }\n        else if (strcmp(argv[count], \"--verbose\") == 0)\n        {\n            options.verbose = 1;\n            printf(\"\\nSetting verbose on\\n\");\n        }\n        count++;\n    }\n}\n\n\n#define LOGA_DEBUG 0\n#define LOGA_INFO 1\n#include <stdarg.h>\n#include <time.h>\n#include <sys/timeb.h>\nvoid MyLog(int LOGA_level, char *format, ...)\n{\n    static char msg_buf[256];\n    va_list args;\n    struct timeb ts;\n\n    struct tm *timeinfo;\n\n    if (LOGA_level == LOGA_DEBUG && options.verbose == 0)\n        return;\n\n    ftime(&ts);\n    timeinfo = localtime(&ts.time);\n    strftime(msg_buf, 80, \"%Y%m%d %H%M%S\", timeinfo);\n\n    sprintf(&msg_buf[strlen(msg_buf)], \".%.3hu \", ts.millitm);\n\n    va_start(args, format);\n    vsnprintf(&msg_buf[strlen(msg_buf)], sizeof(msg_buf) - strlen(msg_buf), format, args);\n    va_end(args);\n\n    printf(\"%s\\n\", msg_buf);\n    fflush(stdout);\n}\n\n\n#if defined(WIN32) || defined(_WINDOWS)\n#define mqsleep(A) Sleep(1000*A)\n#define START_TIME_TYPE DWORD\nstatic DWORD start_time = 0;\nSTART_TIME_TYPE start_clock(void)\n{\n    return GetTickCount();\n}\n#elif defined(AIX)\n#define mqsleep sleep\n#define START_TIME_TYPE struct timespec\nSTART_TIME_TYPE start_clock(void)\n{\n    static struct timespec start;\n    clock_gettime(CLOCK_REALTIME, &start);\n    return start;\n}\n#else\n#define mqsleep sleep\n#define START_TIME_TYPE struct timeval\n/* TODO - unused - remove? static struct timeval start_time; */\nSTART_TIME_TYPE start_clock(void)\n{\n    struct timeval start_time;\n    gettimeofday(&start_time, NULL);\n    return start_time;\n}\n#endif\n\n\n#if defined(WIN32)\nlong elapsed(START_TIME_TYPE start_time)\n{\n    return GetTickCount() - start_time;\n}\n#elif defined(AIX)\n#define assert(a)\nlong elapsed(struct timespec start)\n{\n    struct timespec now, res;\n\n    clock_gettime(CLOCK_REALTIME, &now);\n    ntimersub(now, start, res);\n    return (res.tv_sec) * 1000L + (res.tv_nsec) / 1000000L;\n}\n#else\nlong elapsed(START_TIME_TYPE start_time)\n{\n    struct timeval now, res;\n\n    gettimeofday(&now, NULL);\n    timersub(&now, &start_time, &res);\n    return (res.tv_sec) * 1000 + (res.tv_usec) / 1000;\n}\n#endif\n\n\n#define assert(a, b, c, d) myassert(__FILE__, __LINE__, a, b, c, d)\n#define assert1(a, b, c, d, e) myassert(__FILE__, __LINE__, a, b, c, d, e)\n\nint tests = 0;\nint failures = 0;\nFILE *xml;\nSTART_TIME_TYPE global_start_time;\nchar output[3000];\nchar *cur_output = output;\n\n\nvoid write_test_result()\n{\n    long duration = elapsed(global_start_time);\n\n    fprintf(xml, \" time=\\\"%ld.%.3ld\\\" >\\n\", duration / 1000, duration % 1000);\n    if (cur_output != output)\n    {\n        fprintf(xml, \"%s\", output);\n        cur_output = output;\n    }\n    fprintf(xml, \"</testcase>\\n\");\n}\n\n\nvoid myassert(char *filename, int lineno, char *description, int value, char *format, ...)\n{\n    ++tests;\n    if (!value)\n    {\n        va_list args;\n\n        ++failures;\n        printf(\"Assertion failed, file %s, line %d, description: %s\\n\", filename, lineno, description);\n\n        va_start(args, format);\n        vprintf(format, args);\n        va_end(args);\n\n        cur_output += sprintf(cur_output, \"<failure type=\\\"%s\\\">file %s, line %d </failure>\\n\",\n                              description, filename, lineno);\n    }\n    else\n        MyLog(LOGA_DEBUG, \"Assertion succeeded, file %s, line %d, description: %s\", filename, lineno, description);\n}\n\n#define min(a, b) ((a < b) ? a : b)\n\nint checkMQTTStrings(MQTTString a, MQTTString b)\n{\n    if (!a.lenstring.data)\n    {\n        a.lenstring.data = a.cstring;\n        if (a.cstring)\n            a.lenstring.len = strlen(a.cstring);\n    }\n    if (!b.lenstring.data)\n    {\n        b.lenstring.data = b.cstring;\n        if (b.cstring)\n            b.lenstring.len = strlen(b.cstring);\n    }\n    return memcmp(a.lenstring.data, b.lenstring.data, min(a.lenstring.len, b.lenstring.len)) == 0;\n}\n\n\nint checkConnectPackets(MQTTPacket_connectData *before, MQTTPacket_connectData *after)\n{\n    int rc = 0;\n    int start_failures = failures;\n\n    assert(\"struct_ids should be the same\",\n           memcmp(before->struct_id, after->struct_id, 4) == 0, \"struct_ids were different %.4s\\n\", after->struct_id);\n\n    assert(\"struct_versions should be the same\",\n           before->struct_version == after->struct_version, \"struct_versions were different\\n\", rc);\n\n    assert(\"MQTT versions should be the same\",\n           before->MQTTVersion == after->MQTTVersion, \"MQTT versions were different\\n\", rc);\n\n    assert(\"ClientIDs should be the same\",\n           checkMQTTStrings(before->clientID, after->clientID), \"ClientIDs were different\\n\", rc);\n\n    assert(\"keepAliveIntervals should be the same\",\n           before->keepAliveInterval == after->keepAliveInterval, \"keepAliveIntervals were different %d\\n\", after->keepAliveInterval);\n\n    assert(\"cleansessions should be the same\",\n           before->cleansession == after->cleansession, \"cleansessions were different\\n\", rc);\n\n    assert(\"willFlags should be the same\",\n           before->willFlag == after->willFlag, \"willFlags were different\\n\", rc);\n\n    if (before->willFlag)\n    {\n        assert(\"will struct_ids should be the same\",\n               memcmp(before->will.struct_id, after->will.struct_id, 4) == 0, \"will struct_ids were different %.4s\\n\", after->struct_id);\n\n        assert(\"will struct_versions should be the same\",\n               before->will.struct_version == after->will.struct_version, \"will struct_versions were different\\n\", rc);\n\n        assert(\"topic names should be the same\",\n               checkMQTTStrings(before->will.topicName, after->will.topicName), \"topic names were different\\n\", rc);\n\n        assert(\"messages should be the same\",\n               checkMQTTStrings(before->will.message, after->will.message), \"messages were different\\n\", rc);\n\n        assert(\"retained flags should be the same\",\n               before->will.retained == after->will.retained, \"retained flags were different\\n\", rc);\n\n        assert(\"will qos should be the same\",\n               before->will.qos == after->will.qos, \"will qos were different\\n\", rc);\n    }\n\n    assert(\"usernames should be the same\",\n           checkMQTTStrings(before->clientID, after->clientID), \"usernames were different\\n\", rc);\n    assert(\"passwords should be the same\",\n           checkMQTTStrings(before->password, after->password), \"passwords were different\\n\", rc);\n    return failures == start_failures;\n}\n\nint test1(struct Options options)\n{\n    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;\n    MQTTPacket_connectData data_after = MQTTPacket_connectData_initializer;\n    int rc = 0;\n    unsigned char buf[100];\n    int buflen = sizeof(buf);\n\n    fprintf(xml, \"<testcase classname=\\\"test1\\\" name=\\\"de/serialization\\\"\");\n    global_start_time = start_clock();\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 1 - serialization of connect and back\");\n\n    data.clientID.cstring = \"me\";\n\n    data.keepAliveInterval = 20;\n    data.cleansession = 1;\n    data.username.cstring = \"testuser\";\n    data.password.cstring = \"testpassword\";\n\n    data.willFlag = 1;\n    data.will.message.cstring = \"will message\";\n    data.will.qos = 1;\n    data.will.retained = 0;\n    data.will.topicName.cstring = \"will topic\";\n\n    rc = MQTTSerialize_connect(buf, buflen, &data);\n    assert(\"good rc from serialize connect\", rc > 0, \"rc was %d\\n\", rc);\n\n    rc = MQTTDeserialize_connect(&data_after, buf, buflen);\n    assert(\"good rc from deserialize connect\", rc == 1, \"rc was %d\\n\", rc);\n\n    /* data after should be the same as data before */\n    rc = checkConnectPackets(&data, &data_after);\n    assert(\"packets should be the same\",  rc == 1, \"packets were different\\n\", rc);\n\n    /* exit: */\n    MyLog(LOGA_INFO, \"TEST1: test %s. %d tests run, %d failures.\",\n          (failures == 0) ? \"passed\" : \"failed\", tests, failures);\n    write_test_result();\n    return failures;\n}\n\n\nint test2(struct Options options)\n{\n    int rc = 0;\n    unsigned char buf[100];\n    int buflen = sizeof(buf);\n\n    unsigned char dup = 0;\n    int qos = 2;\n    unsigned char retained = 0;\n    unsigned short msgid = 23;\n    MQTTString topicString = MQTTString_initializer;\n    unsigned char *payload = (unsigned char *)\"kkhkhkjkj jkjjk jk jk \";\n    int payloadlen = strlen((char *)payload);\n\n    unsigned char dup2 = 1;\n    int qos2 = 1;\n    unsigned char retained2 = 1;\n    unsigned short msgid2 = 3243;\n    MQTTString topicString2 = MQTTString_initializer;\n    unsigned char *payload2 = NULL;\n    int payloadlen2 = 0;\n\n    fprintf(xml, \"<testcase classname=\\\"test1\\\" name=\\\"de/serialization\\\"\");\n    global_start_time = start_clock();\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 2 - serialization of publish and back\");\n\n    topicString.cstring = \"mytopic\";\n    rc = MQTTSerialize_publish(buf, buflen, dup, qos, retained, msgid, topicString,\n                               payload, payloadlen);\n    assert(\"good rc from serialize publish\", rc > 0, \"rc was %d\\n\", rc);\n\n    rc = MQTTDeserialize_publish(&dup2, &qos2, &retained2, &msgid2, &topicString2,\n                                 &payload2, &payloadlen2, buf, buflen);\n    assert(\"good rc from deserialize publish\", rc == 1, \"rc was %d\\n\", rc);\n\n    /* data after should be the same as data before */\n    assert(\"dups should be the same\", dup == dup2, \"dups were different %d\\n\", dup2);\n    assert(\"qoss should be the same\", qos == qos2, \"qoss were different %d\\n\", qos2);\n    assert(\"retaineds should be the same\", retained == retained2, \"retaineds were different %d\\n\", retained2);\n    assert(\"msgids should be the same\", msgid == msgid2, \"msgids were different %d\\n\", msgid2);\n\n    assert(\"topics should be the same\",\n           checkMQTTStrings(topicString, topicString2), \"topics were different %s\\n\", \"\"); //topicString2);\n\n    assert(\"payload lengths should be the same\",\n           payloadlen == payloadlen2, \"payload lengths were different %d\\n\", payloadlen2);\n\n    assert(\"payloads should be the same\",\n           memcmp(payload, payload2, payloadlen) == 0, \"payloads were different %s\\n\", \"\");\n\n    /*exit:*/\n    MyLog(LOGA_INFO, \"TEST2: test %s. %d tests run, %d failures.\",\n          (failures == 0) ? \"passed\" : \"failed\", tests, failures);\n    write_test_result();\n    return failures;\n}\n\n\n\nint test3(struct Options options)\n{\n    int i = 0;\n    int rc = 0;\n    unsigned char buf[100];\n    int buflen = sizeof(buf);\n#define TOPIC_COUNT 2\n\n    unsigned char dup = 0;\n    unsigned short msgid = 23;\n    int count = TOPIC_COUNT;\n    MQTTString topicStrings[TOPIC_COUNT] = { MQTTString_initializer, MQTTString_initializer };\n    int req_qoss[TOPIC_COUNT] = {2, 1};\n\n    unsigned char dup2 = 1;\n    unsigned short msgid2 = 2223;\n    int count2 = 0;\n    MQTTString topicStrings2[TOPIC_COUNT] = { MQTTString_initializer, MQTTString_initializer };\n    int req_qoss2[TOPIC_COUNT] = {0, 0};\n\n    fprintf(xml, \"<testcase classname=\\\"test1\\\" name=\\\"de/serialization\\\"\");\n    global_start_time = start_clock();\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 2 - serialization of subscribe and back\");\n\n    topicStrings[0].cstring = \"mytopic\";\n    topicStrings[1].cstring = \"mytopic2\";\n    rc = MQTTSerialize_subscribe(buf, buflen, dup, msgid, count, topicStrings, req_qoss);\n    assert(\"good rc from serialize subscribe\", rc > 0, \"rc was %d\\n\", rc);\n\n    rc = MQTTDeserialize_subscribe(&dup2, &msgid2, 2, &count2, topicStrings2, req_qoss2, buf, buflen);\n    assert(\"good rc from deserialize subscribe\", rc == 1, \"rc was %d\\n\", rc);\n\n    /* data after should be the same as data before */\n    assert(\"dups should be the same\", dup == dup2, \"dups were different %d\\n\", dup2);\n    assert(\"msgids should be the same\", msgid == msgid2, \"msgids were different %d\\n\", msgid2);\n\n    assert(\"count should be the same\", count == count2, \"counts were different %d\\n\", count2);\n\n    for (i = 0; i < count2; ++i)\n    {\n        assert(\"topics should be the same\",\n               checkMQTTStrings(topicStrings[i], topicStrings2[i]), \"topics were different %s\\n\", \"\");\n\n        assert(\"qoss should be the same\", req_qoss[i] == req_qoss2[i], \"qoss were different %d\\n\", req_qoss2[i]);\n    }\n\n    /*exit:*/\n    MyLog(LOGA_INFO, \"TEST3: test %s. %d tests run, %d failures.\",\n          (failures == 0) ? \"passed\" : \"failed\", tests, failures);\n    write_test_result();\n    return failures;\n}\n\n\nint test4(struct Options options)\n{\n    int i = 0;\n    int rc = 0;\n    unsigned char buf[100];\n    int buflen = sizeof(buf);\n#define TOPIC_COUNT 2\n\n    int msgid = 23;\n    int count = TOPIC_COUNT;\n    int granted_qoss[TOPIC_COUNT] = {2, 1};\n\n    unsigned short msgid2 = 2223;\n    int count2 = 0;\n    int granted_qoss2[TOPIC_COUNT] = {0, 0};\n\n    fprintf(xml, \"<testcase classname=\\\"test1\\\" name=\\\"de/serialization\\\"\");\n    global_start_time = start_clock();\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 4 - serialization of suback and back\");\n\n    rc = MQTTSerialize_suback(buf, buflen, msgid, count, granted_qoss);\n    assert(\"good rc from serialize suback\", rc > 0, \"rc was %d\\n\", rc);\n\n    rc = MQTTDeserialize_suback(&msgid2, 2, &count2, granted_qoss2, buf, buflen);\n    assert(\"good rc from deserialize suback\", rc == 1, \"rc was %d\\n\", rc);\n\n    /* data after should be the same as data before */\n    assert(\"msgids should be the same\", msgid == msgid2, \"msgids were different %d\\n\", msgid2);\n\n    assert(\"count should be the same\", count == count2, \"counts were different %d\\n\", count2);\n\n    for (i = 0; i < count2; ++i)\n        assert(\"qoss should be the same\", granted_qoss[i] == granted_qoss2[i], \"qoss were different %d\\n\", granted_qoss2[i]);\n\n    /* exit: */\n    MyLog(LOGA_INFO, \"TEST4: test %s. %d tests run, %d failures.\",\n          (failures == 0) ? \"passed\" : \"failed\", tests, failures);\n    write_test_result();\n    return failures;\n}\n\n\nint test5(struct Options options)\n{\n    int i = 0;\n    int rc = 0;\n    unsigned char buf[100];\n    int buflen = sizeof(buf);\n#define TOPIC_COUNT 2\n\n    unsigned char dup = 0;\n    unsigned short msgid = 23;\n    int count = TOPIC_COUNT;\n    MQTTString topicStrings[TOPIC_COUNT] = { MQTTString_initializer, MQTTString_initializer };\n\n    unsigned char dup2 = 1;\n    unsigned short msgid2 = 2223;\n    int count2 = 0;\n    MQTTString topicStrings2[TOPIC_COUNT] = { MQTTString_initializer, MQTTString_initializer };\n\n    fprintf(xml, \"<testcase classname=\\\"test1\\\" name=\\\"de/serialization\\\"\");\n    global_start_time = start_clock();\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 2 - serialization of unsubscribe and back\");\n\n    topicStrings[0].cstring = \"mytopic\";\n    topicStrings[1].cstring = \"mytopic2\";\n    rc = MQTTSerialize_unsubscribe(buf, buflen, dup, msgid, count, topicStrings);\n    assert(\"good rc from serialize unsubscribe\", rc > 0, \"rc was %d\\n\", rc);\n\n    rc = MQTTDeserialize_unsubscribe(&dup2, &msgid2, 2, &count2, topicStrings2, buf, buflen);\n    assert(\"good rc from deserialize unsubscribe\", rc == 1, \"rc was %d\\n\", rc);\n\n    /* data after should be the same as data before */\n    assert(\"dups should be the same\", dup == dup2, \"dups were different %d\\n\", dup2);\n    assert(\"msgids should be the same\", msgid == msgid2, \"msgids were different %d\\n\", msgid2);\n\n    assert(\"count should be the same\", count == count2, \"counts were different %d\\n\", count2);\n\n    for (i = 0; i < count2; ++i)\n        assert(\"topics should be the same\",\n               checkMQTTStrings(topicStrings[i], topicStrings2[i]), \"topics were different %s\\n\", \"\");\n\n    /* exit: */\n    MyLog(LOGA_INFO, \"TEST5: test %s. %d tests run, %d failures.\",\n          (failures == 0) ? \"passed\" : \"failed\", tests, failures);\n    write_test_result();\n    return failures;\n}\n\n\nint test6(struct Options options)\n{\n    int rc = 0;\n    unsigned char buf[100];\n    int buflen = sizeof(buf);\n\n    unsigned char sessionPresent = 1;\n    unsigned char connack_rc = 77;\n\n    unsigned char sessionPresent2 = 0;\n    unsigned char connack_rc2 = 0;\n\n    fprintf(xml, \"<testcase classname=\\\"test1\\\" name=\\\"de/serialization\\\"\");\n    global_start_time = start_clock();\n    failures = 0;\n    MyLog(LOGA_INFO, \"Starting test 2 - serialization of connack and back\");\n\n    rc = MQTTSerialize_connack(buf, buflen, connack_rc, sessionPresent);\n    assert(\"good rc from serialize connack\", rc > 0, \"rc was %d\\n\", rc);\n\n    rc = MQTTDeserialize_connack(&sessionPresent2, &connack_rc2, buf, buflen);\n    assert(\"good rc from deserialize connack\", rc == 1, \"rc was %d\\n\", rc);\n\n    /* data after should be the same as data before */\n    assert(\"connack rcs should be the same\", connack_rc == connack_rc2, \"connack rcs were different %d\\n\", connack_rc2);\n    assert(\"session present flags should be the same\", sessionPresent == sessionPresent2,\n           \"session present flags were different %d\\n\", sessionPresent2);\n\n    /* exit: */\n    MyLog(LOGA_INFO, \"TEST6: test %s. %d tests run, %d failures.\",\n          (failures == 0) ? \"passed\" : \"failed\", tests, failures);\n    write_test_result();\n    return failures;\n}\n\n\nint main(int argc, char **argv)\n{\n    int rc = 0;\n    int (*tests[])() = {NULL, test1, test2, test3, test4, test5, test6};\n\n    xml = fopen(\"TEST-test1.xml\", \"w\");\n    fprintf(xml, \"<testsuite name=\\\"test1\\\" tests=\\\"%d\\\">\\n\", (int)(ARRAY_SIZE(tests) - 1));\n\n    getopts(argc, argv);\n\n    if (options.test_no == 0)\n    {\n        /* run all the tests */\n        for (options.test_no = 1; options.test_no < ARRAY_SIZE(tests); ++options.test_no)\n            rc += tests[options.test_no](options); /* return number of failures.  0 = test succeeded */\n    }\n    else\n        rc = tests[options.test_no](options); /* run just the selected test */\n\n    if (rc == 0)\n        MyLog(LOGA_INFO, \"verdict pass\");\n    else\n        MyLog(LOGA_INFO, \"verdict fail\");\n\n    fprintf(xml, \"</testsuite>\\n\");\n    fclose(xml);\n    return rc;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/Makefile",
    "content": "#*******************************************************************************\n#  Copyright (c) 2009, 2014 IBM Corp.\n# \n#  All rights reserved. This program and the accompanying materials\n#  are made available under the terms of the Eclipse Public License v1.0\n#  and Eclipse Distribution License v1.0 which accompany this distribution. \n# \n#  The Eclipse Public License is available at \n#     http://www.eclipse.org/legal/epl-v10.html\n#  and the Eclipse Distribution License is available at \n#    http://www.eclipse.org/org/documents/edl-v10.php.\n# \n#  Contributors:\n#     Xiang Rong - 442039 Add makefile to Embedded C client\n#*******************************************************************************/\n\n# Note: on OS X you should install XCode and the associated command-line tools\n\nSHELL = /bin/sh\n.PHONY: clean, mkdir, install, uninstall, html \n\n# assume this is normally run in the main Paho directory\nifndef srcdir\n  srcdir = MQTTPacket/src\nendif\n\nifndef blddir\n  blddir = build/output\nendif\n\nifndef prefix\n\tprefix = /usr/local\nendif\n\nifndef exec_prefix\n\texec_prefix = ${prefix}\nendif\n\nbindir = $(exec_prefix)/bin\nincludedir = $(prefix)/include\nlibdir = $(exec_prefix)/lib\n\nSOURCE_FILES_C = $(srcdir)/*.c\n\nHEADERS = $(srcdir)/*.h\n\n\nSAMPLE_FILES_C = pub0sub1 qos0pub\nSYNC_SAMPLES = ${addprefix ${blddir}/samples/,${SAMPLE_FILES_C}}\n\n\nTEST_FILES_C = test1\nSYNC_TESTS = ${addprefix ${blddir}/test/,${TEST_FILES_C}}\n\n\n# The names of libraries to be built\nMQTT_EMBED_LIB_C = paho-embed-mqtt3c\n\n\n# determine current platform\nifeq ($(OS),Windows_NT)\n\tOSTYPE = $(OS)\nelse\n\tOSTYPE = $(shell uname -s)\n\tMACHINETYPE = $(shell uname -m)\nendif\n\nifeq ($(OSTYPE),Linux)\n\nCC ?= gcc\n\nifndef INSTALL\nINSTALL = install\nendif\nINSTALL_PROGRAM = $(INSTALL)\nINSTALL_DATA =  $(INSTALL) -m 644\n\nMAJOR_VERSION = 1\nMINOR_VERSION = 0\nVERSION = ${MAJOR_VERSION}.${MINOR_VERSION}\n\nEMBED_MQTTLIB_C_TARGET = ${blddir}/lib${MQTT_EMBED_LIB_C}.so.${VERSION}\n\n\nCCFLAGS_SO = -g -fPIC -Os -Wall -fvisibility=hidden -DLINUX_SO\nFLAGS_EXE = -I ${srcdir}  -L ${blddir}\n\nLDFLAGS_C = -shared -Wl,-soname,lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION}\n\nall: build\n\t\nbuild: | mkdir ${EMBED_MQTTLIB_C_TARGET} ${SYNC_SAMPLES} ${SYNC_TESTS}\n\nclean:\n\trm -rf ${blddir}/*\n\t\nmkdir:\n\t-mkdir -p ${blddir}/samples\n\t-mkdir -p ${blddir}/test\n\n${SYNC_TESTS}: ${blddir}/test/%: ${srcdir}/../test/%.c\n\t${CC} -g -o ${blddir}/test/${basename ${+F}} $< -l${MQTT_EMBED_LIB_C} ${FLAGS_EXE}\n\n\n${SYNC_SAMPLES}: ${blddir}/samples/%: ${srcdir}/../samples/%.c ${srcdir}/../samples/transport.o\n\t${CC} -o $@ $^ -l${MQTT_EMBED_LIB_C} ${FLAGS_EXE}\n\n\n\n${EMBED_MQTTLIB_C_TARGET}: ${SOURCE_FILES_C} ${HEADERS_C}\n\t${CC} ${CCFLAGS_SO} -o $@ ${SOURCE_FILES_C} ${LDFLAGS_C}\n\t-ln -s lib$(MQTT_EMBED_LIB_C).so.${VERSION}  ${blddir}/lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION}\n\t-ln -s lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION} ${blddir}/lib$(MQTT_EMBED_LIB_C).so\n\n\nstrip_options:\n\t$(eval INSTALL_OPTS := -s)\n\ninstall-strip: build strip_options install\n\ninstall: build \n\t$(INSTALL_DATA) ${INSTALL_OPTS} ${EMBED_MQTTLIB_C_TARGET} $(DESTDIR)${libdir}\n\n\n\t/sbin/ldconfig $(DESTDIR)${libdir}\n\tln -s lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so\n\n\nuninstall:\n\trm $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so.${VERSION}\n\n\t/sbin/ldconfig $(DESTDIR)${libdir}\n\trm $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so\n\n\nhtml:\n\nARDUINO_LIB_FILES = MQTTClient/src/*.h MQTTClient/src/arduino/*.h $(srcdir)/*\nARDUINO_SAMPLES = MQTTClient/samples/arduino/*\nLEGAL_FILES = edl-v10 epl-v10 notice.html about.html CONTRIBUTING.md README.md library.properties\n\narduino: mkdir\n\t-mkdir -p ${blddir}/arduino/MQTTClient/examples\n\t-mkdir -p ${blddir}/arduino/MQTTClient/src\n\tcp $(ARDUINO_LIB_FILES) ${blddir}/arduino/MQTTClient/src\n\tcp $(LEGAL_FILES) ${blddir}/arduino/MQTTClient\n\tcp -R $(ARDUINO_SAMPLES) ${blddir}/arduino/MQTTClient/examples\n\tcd ${blddir}/arduino && zip -r arduino MQTTClient\n\nendif\n\n\n\nifeq ($(OSTYPE),Darwin)\n\nCC ?= gcc\n\nifndef INSTALL\nINSTALL = install\nendif\nINSTALL_PROGRAM = $(INSTALL)\nINSTALL_DATA =  $(INSTALL) -m 644\n\nMAJOR_VERSION = 1\nMINOR_VERSION = 0\nVERSION = ${MAJOR_VERSION}.${MINOR_VERSION}\n\nEMBED_MQTTLIB_C_TARGET = ${blddir}/lib${MQTT_EMBED_LIB_C}.so.${VERSION}\n\n\nCCFLAGS_SO = -g -fPIC -Os -Wall -fvisibility=hidden -Wno-deprecated-declarations -DUSE_NAMED_SEMAPHORES\nFLAGS_EXE = -I ${srcdir}  -L ${blddir}\n\nLDFLAGS_C = -shared -Wl,-install_name,lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION}\n\nall: build\n\t\nbuild: | mkdir ${EMBED_MQTTLIB_C_TARGET} ${SYNC_SAMPLES} ${SYNC_TESTS}\n\nclean:\n\trm -rf ${blddir}/*\n\t\nmkdir:\n\t-mkdir -p ${blddir}/samples\n\t-mkdir -p ${blddir}/test\n\n${SYNC_TESTS}: ${blddir}/test/%: ${srcdir}/../test/%.c\n\t${CC} -g -o ${blddir}/test/${basename ${+F}} $< -l${MQTT_EMBED_LIB_C} ${FLAGS_EXE}\n\n${SYNC_SAMPLES}: ${blddir}/samples/%: ${srcdir}/../samples/%.c\n\t${CC} -o ${blddir}/samples/${basename ${+F}} $< ${FLAGS_EXE} -l${MQTT_EMBED_LIB_C} \n\n${EMBED_MQTTLIB_C_TARGET}: ${SOURCE_FILES_C} ${HEADERS_C}\n\t${CC} ${CCFLAGS_SO} -o $@ ${SOURCE_FILES_C} ${LDFLAGS_C}\n\t-ln -s lib$(MQTT_EMBED_LIB_C).so.${VERSION}  ${blddir}/lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION}\n\t-ln -s lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION} ${blddir}/lib$(MQTT_EMBED_LIB_C).so\n\n\nstrip_options:\n\t$(eval INSTALL_OPTS := -s)\n\ninstall-strip: build strip_options install\n\ninstall: build \n\t$(INSTALL_DATA) ${INSTALL_OPTS} ${EMBED_MQTTLIB_C_TARGET} $(DESTDIR)${libdir}\n\n\t/sbin/ldconfig $(DESTDIR)${libdir}\n\tln -s lib$(MQTT_EMBED_LIB_C).so.${MAJOR_VERSION} $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so\n\n\nuninstall:\n\trm $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so.${VERSION}\n\t/sbin/ldconfig $(DESTDIR)${libdir}\n\trm $(DESTDIR)${libdir}/lib$(MQTT_EMBED_LIB_C).so\n\n\nhtml:\n\n\nendif\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/README.md",
    "content": "# Eclipse Paho MQTT C/C++ client for Embedded platforms\n\nThis repository contains the source code for the [Eclipse Paho](http://eclipse.org/paho) MQTT C/C++ client library for Embedded platorms.\n\nIt is dual licensed under the EPL and EDL (see about.html and notice.html for more details).  You can choose which of these licenses you want to use the code under.  The EDL allows you to embed the code into your application, and distribute your application in binary or source form without contributing any of your code, or any changes you make back to Paho.  See the EDL for the exact conditions.\n\nThere are three sub-projects:\n\n1. MQTTPacket - simple de/serialization of MQTT packets, plus helper functions\n2. MQTTClient - high(er) level C++ client, plus\n3. MQTTClient-C - high(er) level C client (pretty much a clone of the C++ client)\n\nThe *MQTTPacket* directory contains the lowest level C library with the smallest requirements.  This supplies simple serialization\nand deserialization routines.  They serve as a base for the higher level libraries, but can also be used on their own\nIt is mainly up to you to write and read to and from the network.\n\nThe *MQTTClient* directory contains the next level C++ library.  This networking code is contained in separate classes so that you can plugin the\nnetwork of your choice.  Currently there are implementations for Linux, Arduino and mbed.  ARM mbed was the first platform for which this was written,\nwhere the conventional language choice is C++, which explains the language choice.  I have written a starter [Porting Guide](http://modelbasedtesting.co.uk/2014/08/25/porting-a-paho-embedded-c-client/).\n\nThe *MQTTClient-C* directory contains a C equivalent of MQTTClient, for those platforms where C++ is not supported or the convention.  As far\nas possible it is a direct translation from *MQTTClient*.\n\n## Build requirements / compilation\n\nCMake builds for the various packages have been introduced, along with Travis-CI configuration for automated build & testing.  The basic\nmethod of building on Linux is:\n\n```\nmkdir build.paho\ncd build.paho\ncmake ..\nmake\n```\n\nThe travis-build.sh file has the full build and test sequence for Linux.\n\n\n## Usage and API\n\nSee the samples directories for examples of intended use.  Doxygen config files for each package are available in the doc directory.\n\n## Runtime tracing\n\nThe *MQTTClient* API has debug tracing for MQTT packets sent and received - turn this on by setting the MQTT_DEBUG preprocessor definition.\n\n\n## Reporting bugs\n\nThis project uses GitHub Issues here: [github.com/eclipse/paho.mqtt.embedded-c/issues](https://github.com/eclipse/paho.mqtt.embedded-c/issues) to track ongoing development and issues.\n\n## More information\n\nDiscussion of the Paho clients takes place on the [Eclipse Mattermost Paho channel](https://mattermost.eclipse.org/eclipse/channels/paho) and the [Eclipse paho-dev mailing list](https://dev.eclipse.org/mailman/listinfo/paho-dev).\n\nGeneral questions about the MQTT protocol are discussed in the [MQTT Google Group](https://groups.google.com/forum/?hl=en-US&fromgroups#!forum/mqtt).\n\nMore information is available via the [MQTT community](http://mqtt.org).\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/about.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\"><head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\n<title>About</title>\n</head>\n<body lang=\"EN-US\">\n<h2>About This Content</h2>\n \n<p><em>December 9, 2013</em></p>\t\n<h3>License</h3>\n\n<p>The Eclipse Foundation makes available all content in this plug-in (\"Content\").  Unless otherwise \nindicated below, the Content is provided to you under the terms and conditions of the\nEclipse Public License Version 1.0 (\"EPL\") and Eclipse Distribution License Version 1.0 (\"EDL\").\nA copy of the EPL is available at \n<a href=\"http://www.eclipse.org/legal/epl-v10.html\">http://www.eclipse.org/legal/epl-v10.html</a> \nand a copy of the EDL is available at \n<a href=\"http://www.eclipse.org/org/documents/edl-v10.php\">http://www.eclipse.org/org/documents/edl-v10.php</a>. \nFor purposes of the EPL, \"Program\" will mean the Content.</p>\n\n<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is \nbeing redistributed by another party (\"Redistributor\") and different terms and conditions may\napply to your use of any object code in the Content.  Check the Redistributor's license that was \nprovided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise\nindicated below, the terms and conditions of the EPL still apply to any source code in the Content\nand such source code may be obtained at <a href=\"http://www.eclipse.org/\">http://www.eclipse.org</a>.</p>\n\n</body></html>\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/edl-v10",
    "content": "\nEclipse Distribution License - v 1.0\n\nCopyright (c) 2007, Eclipse Foundation, Inc. and its licensors.\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n    Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n    Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n    Neither the name of the Eclipse Foundation, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/epl-v10",
    "content": "Eclipse Public License - v 1.0\n\nTHE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (\"AGREEMENT\"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\n1. DEFINITIONS\n\n\"Contribution\" means:\n\na) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and\nb) in the case of each subsequent Contributor:\ni) changes to the Program, and\nii) additions to the Program;\nwhere such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.\n\"Contributor\" means any person or entity that distributes the Program.\n\n\"Licensed Patents\" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.\n\n\"Program\" means the Contributions distributed in accordance with this Agreement.\n\n\"Recipient\" means anyone who receives the Program under this Agreement, including all Contributors.\n\n2. GRANT OF RIGHTS\n\na) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.\nb) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.\nc) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.\nd) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.\n3. REQUIREMENTS\n\nA Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:\n\na) it complies with the terms and conditions of this Agreement; and\nb) its license agreement:\ni) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;\nii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;\niii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and\niv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.\nWhen the Program is made available in source code form:\n\na) it must be made available under this Agreement; and\nb) a copy of this Agreement must be included with each copy of the Program.\nContributors may not remove or alter any copyright notices contained within the Program.\n\nEach Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.\n\n4. COMMERCIAL DISTRIBUTION\n\nCommercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor (\"Commercial Contributor\") hereby agrees to defend and indemnify every other Contributor (\"Indemnified Contributor\") against any losses, damages and costs (collectively \"Losses\") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.\n\nFor example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.\n\n5. NO WARRANTY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.\n\n6. DISCLAIMER OF LIABILITY\n\nEXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\n7. GENERAL\n\nIf any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.\n\nIf Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.\n\nAll Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.\n\nEveryone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.\n\nThis Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/library.properties",
    "content": "name=MQTTClient\nversion=1.0.0\nauthor=Ian Craggs\nmaintainer=Ian Craggs https://github.com/icraggs\nsentence=This is the lowest level library, the simplest and smallest, but hardest to use. It simply deals with serialization and deserialization of MQTT packets.\nparagraph=...\ncategory=Communication\nurl=https://github.com/eclipse/paho.mqtt.embedded-c\narchitectures=*\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/notice.html",
    "content": "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\" />\n<title>Eclipse Foundation Software User Agreement</title>\n</head>\n\n<body lang=\"EN-US\">\n<h2>Eclipse Foundation Software User Agreement</h2>\n<p>February 1, 2011</p>\n\n<h3>Usage Of Content</h3>\n\n<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS\n   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND\n   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE\n   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR\n   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND\n   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>\n\n<h3>Applicable Licenses</h3>\n\n<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0\n   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href=\"http://www.eclipse.org/legal/epl-v10.html\">http://www.eclipse.org/legal/epl-v10.html</a>.\n   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>\n\n<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code\n   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>\n\n<ul>\n       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>\n       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>\n       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins\n      and/or Fragments associated with that Feature.</li>\n       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>\n</ul>\n\n<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and\nIncluded Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module\nincluding, but not limited to the following locations:</p>\n\n<ul>\n       <li>The top-level (root) directory</li>\n       <li>Plug-in and Fragment directories</li>\n       <li>Inside Plug-ins and Fragments packaged as JARs</li>\n       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>\n       <li>Feature directories</li>\n</ul>\n\n<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the\ninstallation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or\ninform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.\nSuch Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in\nthat directory.</p>\n\n<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE\nOTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>\n\n<ul>\n       <li>Eclipse Distribution License Version 1.0 (available at <a href=\"http://www.eclipse.org/licenses/edl-v10.html\">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>\n       <li>Common Public License Version 1.0 (available at <a href=\"http://www.eclipse.org/legal/cpl-v10.html\">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>\n       <li>Apache Software License 1.1 (available at <a href=\"http://www.apache.org/licenses/LICENSE\">http://www.apache.org/licenses/LICENSE</a>)</li>\n       <li>Apache Software License 2.0 (available at <a href=\"http://www.apache.org/licenses/LICENSE-2.0\">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>\n       <li>Metro Link Public License 1.00 (available at <a href=\"http://www.opengroup.org/openmotif/supporters/metrolink/license.html\">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>\n       <li>Mozilla Public License Version 1.1 (available at <a href=\"http://www.mozilla.org/MPL/MPL-1.1.html\">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>\n</ul>\n\n<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please\ncontact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>\n\n\n<h3>Use of Provisioning Technology</h3>\n\n<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse\n   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or\n   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to\n   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a\n       href=\"http://eclipse.org/equinox/p2/repository_packaging.html\">http://eclipse.org/equinox/p2/repository_packaging.html</a>\n   (&quot;Specification&quot;).</p>\n\n<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the\n   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the\n   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>\n\n<ol>\n       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology\n       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based\n       product.</li>\n       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be\n       accessed and copied to the Target Machine.</li>\n       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable\n       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target\n       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern\n       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such\n       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>\n</ol>\n\n<h3>Cryptography</h3>\n\n<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to\n   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,\n   possession, or use, and re-export of encryption software, to see if this is permitted.</p>\n\n<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>\n</body>\n</html>\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/travis-build.sh",
    "content": "#!/bin/bash\n\nset -e\n\nrm -rf build.paho\nmkdir build.paho\ncd build.paho\necho \"travis build dir $TRAVIS_BUILD_DIR pwd $PWD\"\ncmake ..\nmake\npython ../test/mqttsas2.py localhost 1883 1885 &\nctest -VV --timeout 600\nkill %1\nkillall mosquitto\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/travis-env-vars",
    "content": "export TRAVIS_OS_NAME=linux\nexport TRAVIS_BUILD_DIR=/home/icraggs/git/paho.mqtt.embedded-c\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/mqtt/travis-install.sh",
    "content": "#!/bin/bash\n\nif [ \"$TRAVIS_OS_NAME\" == \"linux\" ]; then\n\tpwd\n\tsudo service mosquitto stop\n\t# Stop any mosquitto instance which may be still running from previous runs\n\tkillall mosquitto\n\tmosquitto -h\n\tmosquitto &\nfi\n\nif [ \"$TRAVIS_OS_NAME\" == \"osx\" ]; then\n\tpwd\n\tbrew update\n\tbrew install openssl mosquitto\n\tbrew services stop mosquitto\n\t/usr/local/sbin/mosquitto -h\n\t/usr/local/sbin/mosquitto &\nfi\n"
  },
  {
    "path": "Huawei_LiteOS/components/connectivity/nb_iot/los_nb_api.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#if defined(WITH_AT_FRAMEWORK)\n#include \"nb_iot/los_nb_api.h\"\n#include \"at_frame/at_api.h\"\n//#include \"atiny_socket.h\"\n#include \"at_device/bc95.h\"\n\nint los_nb_init(const int8_t* host, const int8_t* port, sec_param_s* psk)\n{\n    int ret;\n    int timecnt = 0;\n    //if(port == NULL)\n        //return -1;\n    /*when used nb with agenttiny*/\n    /*the following para is replaced by call nb_int()*/\n    at_config at_user_conf = {\n        .name = AT_MODU_NAME,\n        .usart_port = AT_USART_PORT,\n        .buardrate = AT_BUARDRATE,\n        .linkid_num = AT_MAX_LINK_NUM,\n        .user_buf_len = MAX_AT_USERDATA_LEN,\n        .cmd_begin = AT_CMD_BEGIN,\n        .line_end = AT_LINE_END,\n        .mux_mode = 1, //support multi connection mode\n        .timeout = AT_CMD_TIMEOUT,   //  ms\n    };\n    \n    at.init(&at_user_conf);\n\n    nb_reboot();\n    //LOS_TaskDelay(2000);\n    if(psk != NULL)//encryption v1.9\n    {\n        if(psk->setpsk)\n            nb_send_psk(psk->pskid, psk->psk);\n        else\n            nb_set_no_encrypt();\n    }\n\n    while(1)\n    {\n        ret = nb_hw_detect();\n        printf(\"call nb_hw_detect,ret is %d\\n\",ret);\n        if(ret == AT_OK)\n            break;\n        //LOS_TaskDelay(1000);\n    }\n    //nb_get_auto_connect();\n    //nb_connect(NULL, NULL, NULL);\n\n\twhile(timecnt < 120)\n\t{\n\t\tret = nb_get_netstat();\n\t\tnb_check_csq();\n\t\tif(ret != AT_FAILED)\n\t\t{\n\t\t\tret = nb_query_ip();\n\t\t\tbreak;\n\t\t}\n\t\t//LOS_TaskDelay(1000);\n\t\ttimecnt++;\n\t}\n\tif(ret != AT_FAILED)\n\t{\n\t\tnb_query_ip();\n\t}\n\tret = nb_set_cdpserver((char *)host, (char *)port);\n    return ret;\n}\n\nint los_nb_report(const char* buf, int len)\n{\n    if(buf == NULL || len <= 0)\n        return -1;\n    return nb_send_payload(buf, len);\n}\n\nint los_nb_notify(char* featurestr,int cmdlen, oob_callback callback, oob_cmd_match cmd_match)\n{\n    if(featurestr == NULL ||cmdlen <= 0 || cmdlen >= OOB_CMD_LEN - 1)\n        return -1;\n    return at.oob_register(featurestr,cmdlen, callback,cmd_match);\n}\n\nint los_nb_deinit(void)\n{\n    nb_reboot();\n\tat.deinit();\n\treturn 0;\n}\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/devfs/los_devfs.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include <los_config.h>\n#include <los_devfs.h>\n\n#if (LOSCFG_ENABLE_DEVFS == YES)\n\nstatic void *devfs_root = NULL;\n\nUINT32 los_devfs_init (void)\n{\n    if (devfs_root != NULL)\n    {\n        return LOS_OK;\n    }\n\n    if (los_kifs_init () != LOS_OK)\n    {\n        return LOS_NOK;\n    }\n\n    devfs_root = los_kifs_mount (\"/dev/\");\n\n    return (devfs_root == NULL) ? LOS_NOK : LOS_OK;\n}\n\nUINT32 los_devfs_create (const char *name, uint32_t flags,\n                         struct devfs_ops *devops, void *arg)\n{\n    int ret;\n\n    if (devfs_root == NULL)\n    {\n        return LOS_NOK;\n    }\n\n    ret = los_kifs_create (devfs_root, name, flags, &devops->kiops, arg);\n\n    return ret == 0 ? LOS_OK : LOS_NOK;\n}\n\nUINT32 los_devfs_link (const char *path_in_mp, uint32_t flags,\n                       void *buff, size_t size)\n{\n    int ret;\n\n    if (devfs_root == NULL)\n    {\n        return LOS_NOK;\n    }\n\n    ret = los_kifs_link (devfs_root, path_in_mp, flags, buff, size);\n\n    return ret == 0 ? LOS_OK : LOS_NOK;\n}\n\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/LICENSE.txt",
    "content": "FatFs License\n\nFatFs has being developped as a personal project of the author, ChaN. It is free from the code anyone else wrote at current release. Following code block shows a copy of the FatFs license document that heading the source files.\n\n/*----------------------------------------------------------------------------/\n/  FatFs - Generic FAT Filesystem Module  Rx.xx                               /\n/-----------------------------------------------------------------------------/\n/\n/ Copyright (C) 20xx, ChaN, all right reserved.\n/\n/ FatFs module is an open source software. Redistribution and use of FatFs in\n/ source and binary forms, with or without modification, are permitted provided\n/ that the following condition is met:\n/\n/ 1. Redistributions of source code must retain the above copyright notice,\n/    this condition and the following disclaimer.\n/\n/ This software is provided by the copyright holder and contributors \"AS IS\"\n/ and any warranties related to this software are DISCLAIMED.\n/ The copyright owner or contributors be NOT LIABLE for any damages caused\n/ by use of this software.\n/----------------------------------------------------------------------------*/\n\nTherefore FatFs license is one of the BSD-style licenses but there is a significant feature. FatFs is mainly intended for embedded systems. In order to extend the usability for commercial products, the redistributions of FatFs in binary form, such as embedded code, binary library and any forms without source code, does not need to include about FatFs in the documentations. This is equivalent to the 1-clause BSD license. Of course FatFs is compatible with the most of open source software licenses including GNU GPL. When you redistribute the FatFs source code with any changes or create a fork, the license can also be changed to GNU GPL, BSD-style license or any open source software license that not conflict with FatFs license.\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/source/00history.txt",
    "content": "----------------------------------------------------------------------------\n  Revision history of FatFs module\n----------------------------------------------------------------------------\n\nR0.00 (February 26, 2006)\n\n  Prototype.\n\n\n\nR0.01 (April 29, 2006)\n\n  The first release.\n\n\n\nR0.02 (June 01, 2006)\n\n  Added FAT12 support.\n  Removed unbuffered mode.\n  Fixed a problem on small (<32M) partition.\n\n\n\nR0.02a (June 10, 2006)\n\n  Added a configuration option (_FS_MINIMUM).\n\n\n\nR0.03 (September 22, 2006)\n\n  Added f_rename().\n  Changed option _FS_MINIMUM to _FS_MINIMIZE.\n\n\n\nR0.03a (December 11, 2006)\n\n  Improved cluster scan algorithm to write files fast.\n  Fixed f_mkdir() creates incorrect directory on FAT32.\n\n\n\nR0.04 (February 04, 2007)\n\n  Added f_mkfs().\n  Supported multiple drive system.\n  Changed some interfaces for multiple drive system.\n  Changed f_mountdrv() to f_mount().\n\n\n\nR0.04a (April 01, 2007)\n\n  Supported multiple partitions on a physical drive.\n  Added a capability of extending file size to f_lseek().\n  Added minimization level 3.\n  Fixed an endian sensitive code in f_mkfs().\n\n\n\nR0.04b (May 05, 2007)\n\n  Added a configuration option _USE_NTFLAG.\n  Added FSINFO support.\n  Fixed DBCS name can result FR_INVALID_NAME.\n  Fixed short seek (<= csize) collapses the file object.\n\n\n\nR0.05 (August 25, 2007)\n\n  Changed arguments of f_read(), f_write() and f_mkfs().\n  Fixed f_mkfs() on FAT32 creates incorrect FSINFO.\n  Fixed f_mkdir() on FAT32 creates incorrect directory.\n\n\n\nR0.05a (February 03, 2008)\n\n  Added f_truncate() and f_utime().\n  Fixed off by one error at FAT sub-type determination.\n  Fixed btr in f_read() can be mistruncated.\n  Fixed cached sector is not flushed when create and close without write.\n\n\n\nR0.06 (April 01, 2008)\n\n  Added fputc(), fputs(), fprintf() and fgets().\n  Improved performance of f_lseek() on moving to the same or following cluster.\n\n\n\nR0.07 (April 01, 2009)\n\n  Merged Tiny-FatFs as a configuration option. (_FS_TINY)\n  Added long file name feature. (_USE_LFN)\n  Added multiple code page feature. (_CODE_PAGE)\n  Added re-entrancy for multitask operation. (_FS_REENTRANT)\n  Added auto cluster size selection to f_mkfs().\n  Added rewind option to f_readdir().\n  Changed result code of critical errors.\n  Renamed string functions to avoid name collision.\n\n\n\nR0.07a (April 14, 2009)\n\n  Septemberarated out OS dependent code on reentrant cfg.\n  Added multiple sector size feature.\n\n\n\nR0.07c (June 21, 2009)\n\n  Fixed f_unlink() can return FR_OK on error.\n  Fixed wrong cache control in f_lseek().\n  Added relative path feature.\n  Added f_chdir() and f_chdrive().\n  Added proper case conversion to extended character.\n\n\n\nR0.07e (November 03, 2009)\n\n  Septemberarated out configuration options from ff.h to ffconf.h.\n  Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH.\n  Fixed name matching error on the 13 character boundary.\n  Added a configuration option, _LFN_UNICODE.\n  Changed f_readdir() to return the SFN with always upper case on non-LFN cfg.\n\n\n\nR0.08 (May 15, 2010)\n\n  Added a memory configuration option. (_USE_LFN = 3)\n  Added file lock feature. (_FS_SHARE)\n  Added fast seek feature. (_USE_FASTSEEK)\n  Changed some types on the API, XCHAR->TCHAR.\n  Changed .fname in the FILINFO structure on Unicode cfg.\n  String functions support UTF-8 encoding files on Unicode cfg.\n\n\n\nR0.08a (August 16, 2010)\n\n  Added f_getcwd(). (_FS_RPATH = 2)\n  Added sector erase feature. (_USE_ERASE)\n  Moved file lock semaphore table from fs object to the bss.\n  Fixed f_mkfs() creates wrong FAT32 volume.\n\n\n\nR0.08b (January 15, 2011)\n\n  Fast seek feature is also applied to f_read() and f_write().\n  f_lseek() reports required table size on creating CLMP.\n  Extended format syntax of f_printf().\n  Ignores duplicated directory separators in given path name.\n\n\n\nR0.09 (September 06, 2011)\n\n  f_mkfs() supports multiple partition to complete the multiple partition feature.\n  Added f_fdisk().\n\n\n\nR0.09a (August 27, 2012)\n\n  Changed f_open() and f_opendir() reject null object pointer to avoid crash.\n  Changed option name _FS_SHARE to _FS_LOCK.\n  Fixed assertion failure due to OS/2 EA on FAT12/16 volume.\n\n\n\nR0.09b (January 24, 2013)\n\n  Added f_setlabel() and f_getlabel().\n\n\n\nR0.10 (October 02, 2013)\n\n  Added selection of character encoding on the file. (_STRF_ENCODE)\n  Added f_closedir().\n  Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO)\n  Added forced mount feature with changes of f_mount().\n  Improved behavior of volume auto detection.\n  Improved write throughput of f_puts() and f_printf().\n  Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write().\n  Fixed f_write() can be truncated when the file size is close to 4GB.\n  Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error.\n\n\n\nR0.10a (January 15, 2014)\n\n  Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID)\n  Added a configuration option of minimum sector size. (_MIN_SS)\n  2nd argument of f_rename() can have a drive number and it will be ignored.\n  Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10)\n  Fixed f_close() invalidates the file object without volume lock.\n  Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10)\n  Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07)\n\n\n\nR0.10b (May 19, 2014)\n\n  Fixed a hard error in the disk I/O layer can collapse the directory entry.\n  Fixed LFN entry is not deleted when delete/rename an object with lossy converted SFN. (appeared at R0.07)\n\n\n\nR0.10c (November 09, 2014)\n\n  Added a configuration option for the platforms without RTC. (_FS_NORTC)\n  Changed option name _USE_ERASE to _USE_TRIM.\n  Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b)\n  Fixed a potential problem of FAT access that can appear on disk error.\n  Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08)\n\n\n\nR0.11 (February 09, 2015)\n\n  Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND)\n  Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c)\n  Fixed _FS_NORTC option does not work properly. (appeared at R0.10c)\n\n\n\nR0.11a (September 05, 2015)\n\n  Fixed wrong media change can lead a deadlock at thread-safe configuration.\n  Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE)\n  Removed some code pages actually not exist on the standard systems. (_CODE_PAGE)\n  Fixed errors in the case conversion teble of code page 437 and 850 (ff.c).\n  Fixed errors in the case conversion teble of Unicode (cc*.c).\n\n\n\nR0.12 (April 12, 2016)\n\n  Added support for exFAT file system. (_FS_EXFAT)\n  Added f_expand(). (_USE_EXPAND)\n  Changed some members in FINFO structure and behavior of f_readdir().\n  Added an option _USE_CHMOD.\n  Removed an option _WORD_ACCESS.\n  Fixed errors in the case conversion table of Unicode (cc*.c).\n\n\n\nR0.12a (July 10, 2016)\n\n  Added support for creating exFAT volume with some changes of f_mkfs().\n  Added a file open method FA_OPEN_APPEND. An f_lseek() following f_open() is no longer needed.\n  f_forward() is available regardless of _FS_TINY.\n  Fixed f_mkfs() creates wrong volume. (appeared at R0.12)\n  Fixed wrong memory read in create_name(). (appeared at R0.12)\n  Fixed compilation fails at some configurations, _USE_FASTSEEK and _USE_FORWARD.\n\n\n\nR0.12b (September 04, 2016)\n\n  Made f_rename() be able to rename objects with the same name but case.\n  Fixed an error in the case conversion teble of code page 866. (ff.c)\n  Fixed writing data is truncated at the file offset 4GiB on the exFAT volume. (appeared at R0.12)\n  Fixed creating a file in the root directory of exFAT volume can fail. (appeared at R0.12)\n  Fixed f_mkfs() creating exFAT volume with too small cluster size can collapse unallocated memory. (appeared at R0.12)\n  Fixed wrong object name can be returned when read directory at Unicode cfg. (appeared at R0.12)\n  Fixed large file allocation/removing on the exFAT volume collapses allocation bitmap. (appeared at R0.12)\n  Fixed some internal errors in f_expand() and f_lseek(). (appeared at R0.12)\n\n\n\nR0.12c (March 04, 2017)\n\n  Improved write throughput at the fragmented file on the exFAT volume.\n  Made memory usage for exFAT be able to be reduced as decreasing _MAX_LFN.\n  Fixed successive f_getfree() can return wrong count on the FAT12/16 volume. (appeared at R0.12)\n  Fixed configuration option _VOLUMES cannot be set 10. (appeared at R0.10c)\n\n\n\nR0.13 (May 21, 2017)\n\n  Changed heading character of configuration keywords \"_\" to \"FF_\".\n  Removed ASCII-only configuration, FF_CODE_PAGE = 1. Use FF_CODE_PAGE = 437 instead.\n  Added f_setcp(), run-time code page configuration. (FF_CODE_PAGE = 0)\n  Improved cluster allocation time on stretch a deep buried cluster chain.\n  Improved processing time of f_mkdir() with large cluster size by using FF_USE_LFN = 3.\n  Improved NoFatChain flag of the fragmented file to be set after it is truncated and got contiguous.\n  Fixed archive attribute is left not set when a file on the exFAT volume is renamed. (appeared at R0.12)\n  Fixed exFAT FAT entry can be collapsed when write or lseek operation to the existing file is done. (appeared at R0.12c)\n  Fixed creating a file can fail when a new cluster allocation to the exFAT directory occures. (appeared at R0.12c)\n\n\n\nR0.13a (October 14, 2017)\n\n  Added support for UTF-8 encoding on the API. (FF_LFN_UNICODE = 2)\n  Added options for file name output buffer. (FF_LFN_BUF, FF_SFN_BUF).\n  Added dynamic memory allocation option for working buffer of f_mkfs() and f_fdisk().\n  Fixed f_fdisk() and f_mkfs() create the partition table with wrong CHS parameters. (appeared at R0.09)\n  Fixed f_unlink() can cause lost clusters at fragmented file on the exFAT volume. (appeared at R0.12c)\n  Fixed f_setlabel() rejects some valid characters for exFAT volume. (appeared at R0.12)\n\n\n\nR0.13b (April 07, 2018)\n\n  Added support for UTF-32 encoding on the API. (FF_LFN_UNICODE = 3)\n  Added support for Unix style volume ID. (FF_STR_VOLUME_ID = 2)\n  Fixed accesing any object on the exFAT root directory beyond the cluster boundary can fail. (appeared at R0.12c)\n  Fixed f_setlabel() does not reject some invalid characters. (appeared at R0.09b)\n\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/source/00readme.txt",
    "content": "FatFs Module Source Files R0.13b\n\n\nFILES\n\n  00readme.txt   This file.\n  00history.txt  Revision history.\n  ff.c           FatFs module.\n  ffconf.h       Configuration file of FatFs module.\n  ff.h           Common include file for FatFs and application module.\n  diskio.h       Common include file for FatFs and disk I/O module.\n  diskio.c       An example of glue function to attach existing disk I/O module to FatFs.\n  integer.h      Integer type definitions for FatFs.\n  ffunicode.c    Optional Unicode utility functions.\n  ffsystem.c     An example of optional O/S related functions.\n\n\n  Low level disk I/O module is not included in this archive because the FatFs\n  module is only a generic file system layer and it does not depend on any specific\n  storage device. You need to provide a low level disk I/O module written to\n  control the storage device that attached to the target system.\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/source/default/ffconf.h",
    "content": "/*---------------------------------------------------------------------------/\n/  FatFs - Configuration file\n/---------------------------------------------------------------------------*/\n#include \"fs/los_vfs.h\"\n\n#define FFCONF_DEF 63463\t/* Revision ID */\n\n/*---------------------------------------------------------------------------/\n/ Function Configurations\n/---------------------------------------------------------------------------*/\n\n#define FF_FS_READONLY\t0\n/* This option switches read-only configuration. (0:Read/Write or 1:Read-only)\n/  Read-only configuration removes writing API functions, f_write(), f_sync(),\n/  f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()\n/  and optional writing functions as well. */\n\n\n#define FF_FS_MINIMIZE\t0\n/* This option defines minimization level to remove some basic API functions.\n/\n/   0: Basic functions are fully enabled.\n/   1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename()\n/      are removed.\n/   2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.\n/   3: f_lseek() function is removed in addition to 2. */\n\n\n#define FF_USE_STRFUNC\t2\n/* This option switches string functions, f_gets(), f_putc(), f_puts() and f_printf().\n/\n/  0: Disable string functions.\n/  1: Enable without LF-CRLF conversion.\n/  2: Enable with LF-CRLF conversion. */\n\n\n#define FF_USE_FIND\t\t0\n/* This option switches filtered directory read functions, f_findfirst() and\n/  f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */\n\n\n#define FF_USE_MKFS\t\t1\n/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */\n\n\n#define FF_USE_FASTSEEK\t1\n/* This option switches fast seek function. (0:Disable or 1:Enable) */\n\n\n#define FF_USE_EXPAND\t0\n/* This option switches f_expand function. (0:Disable or 1:Enable) */\n\n\n#define FF_USE_CHMOD\t0\n/* This option switches attribute manipulation functions, f_chmod() and f_utime().\n/  (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */\n\n\n#define FF_USE_LABEL\t0\n/* This option switches volume label functions, f_getlabel() and f_setlabel().\n/  (0:Disable or 1:Enable) */\n\n\n#define FF_USE_FORWARD\t0\n/* This option switches f_forward() function. (0:Disable or 1:Enable) */\n\n\n/*---------------------------------------------------------------------------/\n/ Locale and Namespace Configurations\n/---------------------------------------------------------------------------*/\n\n#define FF_CODE_PAGE\t936\n/* This option specifies the OEM code page to be used on the target system.\n/  Incorrect code page setting can cause a file open failure.\n/\n/   437 - U.S.\n/   720 - Arabic\n/   737 - Greek\n/   771 - KBL\n/   775 - Baltic\n/   850 - Latin 1\n/   852 - Latin 2\n/   855 - Cyrillic\n/   857 - Turkish\n/   860 - Portuguese\n/   861 - Icelandic\n/   862 - Hebrew\n/   863 - Canadian French\n/   864 - Arabic\n/   865 - Nordic\n/   866 - Russian\n/   869 - Greek 2\n/   932 - Japanese (DBCS)\n/   936 - Simplified Chinese (DBCS)\n/   949 - Korean (DBCS)\n/   950 - Traditional Chinese (DBCS)\n/     0 - Include all code pages above and configured by f_setcp()\n*/\n\n\n#define FF_USE_LFN\t\t2\n#define FF_MAX_LFN\t\tLOS_MAX_DIR_NAME_LEN\n/* The FF_USE_LFN switches the support for LFN (long file name).\n/\n/   0: Disable LFN. FF_MAX_LFN has no effect.\n/   1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe.\n/   2: Enable LFN with dynamic working buffer on the STACK.\n/   3: Enable LFN with dynamic working buffer on the HEAP.\n/\n/  To enable the LFN, ffunicode.c needs to be added to the project. The LFN function\n/  requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and\n/  additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled.\n/  The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can\n/  be in range of 12 to 255. It is recommended to be set 255 to fully support LFN\n/  specification.\n/  When use stack for the working buffer, take care on stack overflow. When use heap\n/  memory for the working buffer, memory management functions, ff_memalloc() and\n/  ff_memfree() in ffsystem.c, need to be added to the project. */\n\n\n#define FF_LFN_UNICODE\t0\n/* This option switches the character encoding on the API when LFN is enabled.\n/\n/   0: ANSI/OEM in current CP (TCHAR = char)\n/   1: Unicode in UTF-16 (TCHAR = WCHAR)\n/   2: Unicode in UTF-8 (TCHAR = char)\n/   3: Unicode in UTF-32 (TCHAR = DWORD)\n/\n/  Also behavior of string I/O functions will be affected by this option.\n/  When LFN is not enabled, this option has no effect. */\n\n\n#define FF_LFN_BUF\t\t255\n#define FF_SFN_BUF\t\t12\n/* This set of options defines size of file name members in the FILINFO structure\n/  which is used to read out directory items. These values should be suffcient for\n/  the file names to read. The maximum possible length of the read file name depends\n/  on character encoding. When LFN is not enabled, these options have no effect. */\n\n\n#define FF_STRF_ENCODE\t3\n/* When FF_LFN_UNICODE >= 1 with LFN enabled, string I/O functions, f_gets(),\n/  f_putc(), f_puts and f_printf() convert the character encoding in it.\n/  This option selects assumption of character encoding ON THE FILE to be\n/  read/written via those functions.\n/\n/   0: ANSI/OEM in current CP\n/   1: Unicode in UTF-16LE\n/   2: Unicode in UTF-16BE\n/   3: Unicode in UTF-8\n*/\n\n\n#define FF_FS_RPATH\t\t0\n/* This option configures support for relative path.\n/\n/   0: Disable relative path and remove related functions.\n/   1: Enable relative path. f_chdir() and f_chdrive() are available.\n/   2: f_getcwd() function is available in addition to 1.\n*/\n\n\n/*---------------------------------------------------------------------------/\n/ Drive/Volume Configurations\n/---------------------------------------------------------------------------*/\n\n#define FF_VOLUMES\t\t1\n/* Number of volumes (logical drives) to be used. (1-10) */\n\n\n#define FF_STR_VOLUME_ID\t0\n#define FF_VOLUME_STRS\t\t\"RAM\",\"NAND\",\"CF\",\"SD\",\"SD2\",\"USB\",\"USB2\",\"USB3\"\n/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings.\n/  When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive\n/  number in the path name. FF_VOLUME_STRS defines the volume ID strings for each\n/  logical drives. Number of items must not be less than FF_VOLUMES. Valid\n/  characters for the volume ID strings are A-Z, a-z and 0-9, however, they are\n/  compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and FF_VOLUME_STRS is\n/  not defined, a user defined volume string table needs to be defined as:\n/\n/  const char* VolumeStr[FF_VOLUMES] = {\"ram\",\"flash\",\"sd\",\"usb\",...\n*/\n\n\n#define FF_MULTI_PARTITION\t0\n/* This option switches support for multiple volumes on the physical drive.\n/  By default (0), each logical drive number is bound to the same physical drive\n/  number and only an FAT volume found on the physical drive will be mounted.\n/  When this function is enabled (1), each logical drive number can be bound to\n/  arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk()\n/  funciton will be available. */\n\n\n#define FF_MIN_SS\t\t512\n#define FF_MAX_SS\t\t4096\n/* This set of options configures the range of sector size to be supported. (512,\n/  1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and\n/  harddisk. But a larger value may be required for on-board flash memory and some\n/  type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured\n/  for variable sector size mode and disk_ioctl() function needs to implement\n/  GET_SECTOR_SIZE command. */\n\n\n#define FF_USE_TRIM\t\t0\n/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable)\n/  To enable Trim function, also CTRL_TRIM command should be implemented to the\n/  disk_ioctl() function. */\n\n\n#define FF_FS_NOFSINFO\t0\n/* If you need to know correct free space on the FAT32 volume, set bit 0 of this\n/  option, and f_getfree() function at first time after volume mount will force\n/  a full FAT scan. Bit 1 controls the use of last allocated cluster number.\n/\n/  bit0=0: Use free cluster count in the FSINFO if available.\n/  bit0=1: Do not trust free cluster count in the FSINFO.\n/  bit1=0: Use last allocated cluster number in the FSINFO if available.\n/  bit1=1: Do not trust last allocated cluster number in the FSINFO.\n*/\n\n\n\n/*---------------------------------------------------------------------------/\n/ System Configurations\n/---------------------------------------------------------------------------*/\n\n#define FF_FS_TINY\t\t0\n/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)\n/  At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.\n/  Instead of private sector buffer eliminated from the file object, common sector\n/  buffer in the filesystem object (FATFS) is used for the file data transfer. */\n\n\n#define FF_FS_EXFAT\t\t0\n/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable)\n/  To enable exFAT, also LFN needs to be enabled.\n/  Note that enabling exFAT discards ANSI C (C89) compatibility. */\n\n\n#define FF_FS_NORTC\t\t0\n#define FF_NORTC_MON\t1\n#define FF_NORTC_MDAY\t1\n#define FF_NORTC_YEAR\t2018\n/* The option FF_FS_NORTC switches timestamp functiton. If the system does not have\n/  any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable\n/  the timestamp function. Every object modified by FatFs will have a fixed timestamp\n/  defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time.\n/  To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be\n/  added to the project to read current time form real-time clock. FF_NORTC_MON,\n/  FF_NORTC_MDAY and FF_NORTC_YEAR have no effect.\n/  These options have no effect at read-only configuration (FF_FS_READONLY = 1). */\n\n\n#define FF_FS_LOCK\t LOS_MAX_FILES\n/* The option FF_FS_LOCK switches file lock function to control duplicated file open\n/  and illegal operation to open objects. This option must be 0 when FF_FS_READONLY\n/  is 1.\n/\n/  0:  Disable file lock function. To avoid volume corruption, application program\n/      should avoid illegal open, remove and rename to the open objects.\n/  >0: Enable file lock function. The value defines how many files/sub-directories\n/      can be opened simultaneously under file lock control. Note that the file\n/      lock control is independent of re-entrancy.\n/      This value should be no more than LOS_MAX_FILES in los_vfs.h */\n\n\n#define FF_FS_REENTRANT\t0\n#define FF_FS_TIMEOUT\t1000\n#define FF_SYNC_t\t\tHANDLE\n/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs\n/  module itself. Note that regardless of this option, file access to different\n/  volume is always re-entrant and volume control functions, f_mount(), f_mkfs()\n/  and f_fdisk() function, are always not re-entrant. Only file/directory access\n/  to the same volume is under control of this function.\n/\n/   0: Disable re-entrancy. FF_FS_TIMEOUT and FF_SYNC_t have no effect.\n/   1: Enable re-entrancy. Also user provided synchronization handlers,\n/      ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj()\n/      function, must be added to the project. Samples are available in\n/      option/syscall.c.\n/\n/  The FF_FS_TIMEOUT defines timeout period in unit of time tick.\n/  The FF_SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*,\n/  SemaphoreHandle_t and etc. A header file for O/S definitions needs to be\n/  included somewhere in the scope of ff.h. */\n\n\n#define FF_PHYS_ADDR    0\n/* Physical offset(in bytes) in spi flash used for FatFs\n/  Must be on 4k boundary */\n\n#define FF_PHYS_SIZE    0x100000\n/* Physical size(in bytes) of the spi flash used for FatFs\n/  Must be on 4k boundary */\n\n\n/*--- End of configuration options ---*/\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/source/diskio.c",
    "content": "/*-----------------------------------------------------------------------*/\n/* Low level disk I/O module skeleton for FatFs     (C)ChaN, 2016        */\n/*-----------------------------------------------------------------------*/\n/* If a working storage control module is available, it should be        */\n/* attached to the FatFs via a glue function rather than modifying it.   */\n/* This is an example of glue functions to attach various exsisting      */\n/* storage control modules to the FatFs module with a defined API.       */\n/*-----------------------------------------------------------------------*/\n\n#include \"diskio.h\"\t\t/* FatFs lower layer API */\n#include \"fs/los_fatfs.h\"\n\nextern struct disk_mnt disk;\n\n/**\n  * @brief  Gets Disk Status \n  * @param  pdrv: Physical drive number (0..)\n  * @retval DSTATUS: Operation status\n  */\nDSTATUS disk_status (\n\tBYTE pdrv\t\t/* Physical drive nmuber to identify the drive */\n)\n{\n\tDSTATUS stat;\n    struct disk_dev *pdev = &disk.dev[pdrv];\n\n    stat = pdev->drv->status(pdev->lun);\n    return stat;\n}\n\n/**\n  * @brief  Initializes a Drive\n  * @param  pdrv: Physical drive number (0..)\n  * @retval DSTATUS: Operation status\n  */\nDSTATUS disk_initialize (\n\tBYTE pdrv\t\t\t\t/* Physical drive nmuber to identify the drive */\n)\n{\n\tDSTATUS stat = RES_OK;\n    struct disk_dev *pdev = &disk.dev[pdrv];\n\n    if(pdev->state == 0)\n    {\n        pdev->state = 1;\n        stat = pdev->drv->initialize(pdev->lun);\n    }\n\treturn stat;\n}\n\n/**\n  * @brief  Reads Sector(s) \n  * @param  pdrv: Physical drive number (0..)\n  * @param  *buff: Data buffer to store read data\n  * @param  sector: Sector address (LBA)\n  * @param  count: Number of sectors to read (1..128)\n  * @retval DRESULT: Operation result\n  */\nDRESULT disk_read (\n\tBYTE pdrv,\t\t/* Physical drive nmuber to identify the drive */\n\tBYTE *buff,\t\t/* Data buffer to store read data */\n\tDWORD sector,\t/* Start sector in LBA */\n\tUINT count\t\t/* Number of sectors to read */\n)\n{\n\tDRESULT res;\n    struct disk_dev *pdev = &disk.dev[pdrv];\n\n    res = pdev->drv->read(pdev->lun, buff, sector, count);\n    return res;\n}\n\n/**\n  * @brief  Writes Sector(s)  \n  * @param  pdrv: Physical drive number (0..)\n  * @param  *buff: Data to be written\n  * @param  sector: Sector address (LBA)\n  * @param  count: Number of sectors to write (1..128)\n  * @retval DRESULT: Operation result\n  */\nDRESULT disk_write (\n\tBYTE pdrv,\t\t\t/* Physical drive nmuber to identify the drive */\n\tconst BYTE *buff,\t/* Data to be written */\n\tDWORD sector,\t\t/* Start sector in LBA */\n\tUINT count\t\t\t/* Number of sectors to write */\n)\n{\n\tDRESULT res;\n    struct disk_dev *pdev = &disk.dev[pdrv];\n\n    res = pdev->drv->write(pdev->lun, buff, sector, count);\n    return res;\n}\n\n/**\n  * @brief  I/O control operation  \n  * @param  pdrv: Physical drive number (0..)\n  * @param  cmd: Control code\n  * @param  *buff: Buffer to send/receive control data\n  * @retval DRESULT: Operation result\n  */\nDRESULT disk_ioctl (\n\tBYTE pdrv,\t\t/* Physical drive nmuber (0..) */\n\tBYTE cmd,\t\t/* Control code */\n\tvoid *buff\t\t/* Buffer to send/receive control data */\n)\n{\n\tDRESULT res;\n    struct disk_dev *pdev = &disk.dev[pdrv];\n\n    res = pdev->drv->ioctl(pdev->lun, cmd, buff);\n    return res;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/source/diskio.h",
    "content": "/*-----------------------------------------------------------------------/\n/  Low level disk interface modlue include file   (C)ChaN, 2014          /\n/-----------------------------------------------------------------------*/\n\n#ifndef _DISKIO_DEFINED\n#define _DISKIO_DEFINED\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"integer.h\"\n\n\n/* Status of Disk Functions */\ntypedef BYTE\tDSTATUS;\n\n/* Results of Disk Functions */\ntypedef enum {\n\tRES_OK = 0,\t\t/* 0: Successful */\n\tRES_ERROR,\t\t/* 1: R/W Error */\n\tRES_WRPRT,\t\t/* 2: Write Protected */\n\tRES_NOTRDY,\t\t/* 3: Not Ready */\n\tRES_PARERR\t\t/* 4: Invalid Parameter */\n} DRESULT;\n\n\n/*---------------------------------------*/\n/* Prototypes for disk control functions */\n\n\nDSTATUS disk_initialize (BYTE pdrv);\nDSTATUS disk_status (BYTE pdrv);\nDRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);\nDRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);\nDRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);\n\n\n/* Disk Status Bits (DSTATUS) */\n\n#define STA_NOINIT\t\t0x01\t/* Drive not initialized */\n#define STA_NODISK\t\t0x02\t/* No medium in the drive */\n#define STA_PROTECT\t\t0x04\t/* Write protected */\n\n\n/* Command code for disk_ioctrl fucntion */\n\n/* Generic command (Used by FatFs) */\n#define CTRL_SYNC\t\t\t0\t/* Complete pending write process (needed at FF_FS_READONLY == 0) */\n#define GET_SECTOR_COUNT\t1\t/* Get media size (needed at FF_USE_MKFS == 1) */\n#define GET_SECTOR_SIZE\t\t2\t/* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */\n#define GET_BLOCK_SIZE\t\t3\t/* Get erase block size (needed at FF_USE_MKFS == 1) */\n#define CTRL_TRIM\t\t\t4\t/* Inform device that the data on the block of sectors is no longer used (needed at FF_USE_TRIM == 1) */\n\n/* Generic command (Not used by FatFs) */\n#define CTRL_POWER\t\t\t5\t/* Get/Set power status */\n#define CTRL_LOCK\t\t\t6\t/* Lock/Unlock media removal */\n#define CTRL_EJECT\t\t\t7\t/* Eject media */\n#define CTRL_FORMAT\t\t\t8\t/* Create physical format on the media */\n\n/* MMC/SDC specific ioctl command */\n#define MMC_GET_TYPE\t\t10\t/* Get card type */\n#define MMC_GET_CSD\t\t\t11\t/* Get CSD */\n#define MMC_GET_CID\t\t\t12\t/* Get CID */\n#define MMC_GET_OCR\t\t\t13\t/* Get OCR */\n#define MMC_GET_SDSTAT\t\t14\t/* Get SD status */\n#define ISDIO_READ\t\t\t55\t/* Read data form SD iSDIO register */\n#define ISDIO_WRITE\t\t\t56\t/* Write data to SD iSDIO register */\n#define ISDIO_MRITE\t\t\t57\t/* Masked write data to SD iSDIO register */\n\n/* ATA/CF specific ioctl command */\n#define ATA_GET_REV\t\t\t20\t/* Get F/W revision */\n#define ATA_GET_MODEL\t\t21\t/* Get model name */\n#define ATA_GET_SN\t\t\t22\t/* Get serial number */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/source/ff.c",
    "content": "/*----------------------------------------------------------------------------/\n/  FatFs - Generic FAT Filesystem Module  R0.13b                              /\n/-----------------------------------------------------------------------------/\n/\n/ Copyright (C) 2018, ChaN, all right reserved.\n/\n/ FatFs module is an open source software. Redistribution and use of FatFs in\n/ source and binary forms, with or without modification, are permitted provided\n/ that the following condition is met:\n/\n/ 1. Redistributions of source code must retain the above copyright notice,\n/    this condition and the following disclaimer.\n/\n/ This software is provided by the copyright holder and contributors \"AS IS\"\n/ and any warranties related to this software are DISCLAIMED.\n/ The copyright owner or contributors be NOT LIABLE for any damages caused\n/ by use of this software.\n/\n/----------------------------------------------------------------------------*/\n\n\n#include \"ff.h\"\t\t\t/* Declarations of FatFs API */\n#include \"diskio.h\"\t\t/* Declarations of device I/O functions */\n\n\n/*--------------------------------------------------------------------------\n\n   Module Private Definitions\n\n---------------------------------------------------------------------------*/\n\n#if FF_DEFINED != 63463\t/* Revision ID */\n#error Wrong include file (ff.h).\n#endif\n\n\n/* Character code support macros */\n#define IsUpper(c)\t\t((c) >= 'A' && (c) <= 'Z')\n#define IsLower(c)\t\t((c) >= 'a' && (c) <= 'z')\n#define IsDigit(c)\t\t((c) >= '0' && (c) <= '9')\n#define IsSurrogate(c)\t((c) >= 0xD800 && (c) <= 0xDFFF)\n#define IsSurrogateH(c)\t((c) >= 0xD800 && (c) <= 0xDBFF)\n#define IsSurrogateL(c)\t((c) >= 0xDC00 && (c) <= 0xDFFF)\n\n\n/* Additional file attribute bits for internal use */\n#define AM_VOL\t\t0x08\t/* Volume label */\n#define AM_LFN\t\t0x0F\t/* LFN entry */\n#define AM_MASK\t\t0x3F\t/* Mask of defined bits */\n\n\n/* Additional file access control and file status flags for internal use */\n#define FA_SEEKEND\t0x20\t/* Seek to end of the file on file open */\n#define FA_MODIFIED\t0x40\t/* File has been modified */\n#define FA_DIRTY\t0x80\t/* FIL.buf[] needs to be written-back */\n\n\n/* Name status flags in fn[11] */\n#define NSFLAG\t\t11\t\t/* Index of the name status byte */\n#define NS_LOSS\t\t0x01\t/* Out of 8.3 format */\n#define NS_LFN\t\t0x02\t/* Force to create LFN entry */\n#define NS_LAST\t\t0x04\t/* Last segment */\n#define NS_BODY\t\t0x08\t/* Lower case flag (body) */\n#define NS_EXT\t\t0x10\t/* Lower case flag (ext) */\n#define NS_DOT\t\t0x20\t/* Dot entry */\n#define NS_NOLFN\t0x40\t/* Do not find LFN */\n#define NS_NONAME\t0x80\t/* Not followed */\n\n\n/* Limits and boundaries */\n#define MAX_DIR\t\t0x200000\t\t/* Max size of FAT directory */\n#define MAX_DIR_EX\t0x10000000\t\t/* Max size of exFAT directory */\n#define MAX_FAT12\t0xFF5\t\t\t/* Max FAT12 clusters (differs from specs, but right for real DOS/Windows behavior) */\n#define MAX_FAT16\t0xFFF5\t\t\t/* Max FAT16 clusters (differs from specs, but right for real DOS/Windows behavior) */\n#define MAX_FAT32\t0x0FFFFFF5\t\t/* Max FAT32 clusters (not specified, practical limit) */\n#define MAX_EXFAT\t0x7FFFFFFD\t\t/* Max exFAT clusters (differs from specs, implementation limit) */\n\n\n/* FatFs refers the FAT structure as simple byte array instead of structure member\n/ because the C structure is not binary compatible between different platforms */\n\n#define BS_JmpBoot\t\t\t0\t\t/* x86 jump instruction (3-byte) */\n#define BS_OEMName\t\t\t3\t\t/* OEM name (8-byte) */\n#define BPB_BytsPerSec\t\t11\t\t/* Sector size [byte] (WORD) */\n#define BPB_SecPerClus\t\t13\t\t/* Cluster size [sector] (BYTE) */\n#define BPB_RsvdSecCnt\t\t14\t\t/* Size of reserved area [sector] (WORD) */\n#define BPB_NumFATs\t\t\t16\t\t/* Number of FATs (BYTE) */\n#define BPB_RootEntCnt\t\t17\t\t/* Size of root directory area for FAT [entry] (WORD) */\n#define BPB_TotSec16\t\t19\t\t/* Volume size (16-bit) [sector] (WORD) */\n#define BPB_Media\t\t\t21\t\t/* Media descriptor byte (BYTE) */\n#define BPB_FATSz16\t\t\t22\t\t/* FAT size (16-bit) [sector] (WORD) */\n#define BPB_SecPerTrk\t\t24\t\t/* Number of sectors per track for int13h [sector] (WORD) */\n#define BPB_NumHeads\t\t26\t\t/* Number of heads for int13h (WORD) */\n#define BPB_HiddSec\t\t\t28\t\t/* Volume offset from top of the drive (DWORD) */\n#define BPB_TotSec32\t\t32\t\t/* Volume size (32-bit) [sector] (DWORD) */\n#define BS_DrvNum\t\t\t36\t\t/* Physical drive number for int13h (BYTE) */\n#define BS_NTres\t\t\t37\t\t/* WindowsNT error flag (BYTE) */\n#define BS_BootSig\t\t\t38\t\t/* Extended boot signature (BYTE) */\n#define BS_VolID\t\t\t39\t\t/* Volume serial number (DWORD) */\n#define BS_VolLab\t\t\t43\t\t/* Volume label string (8-byte) */\n#define BS_FilSysType\t\t54\t\t/* Filesystem type string (8-byte) */\n#define BS_BootCode\t\t\t62\t\t/* Boot code (448-byte) */\n#define BS_55AA\t\t\t\t510\t\t/* Signature word (WORD) */\n\n#define BPB_FATSz32\t\t\t36\t\t/* FAT32: FAT size [sector] (DWORD) */\n#define BPB_ExtFlags32\t\t40\t\t/* FAT32: Extended flags (WORD) */\n#define BPB_FSVer32\t\t\t42\t\t/* FAT32: Filesystem version (WORD) */\n#define BPB_RootClus32\t\t44\t\t/* FAT32: Root directory cluster (DWORD) */\n#define BPB_FSInfo32\t\t48\t\t/* FAT32: Offset of FSINFO sector (WORD) */\n#define BPB_BkBootSec32\t\t50\t\t/* FAT32: Offset of backup boot sector (WORD) */\n#define BS_DrvNum32\t\t\t64\t\t/* FAT32: Physical drive number for int13h (BYTE) */\n#define BS_NTres32\t\t\t65\t\t/* FAT32: Error flag (BYTE) */\n#define BS_BootSig32\t\t66\t\t/* FAT32: Extended boot signature (BYTE) */\n#define BS_VolID32\t\t\t67\t\t/* FAT32: Volume serial number (DWORD) */\n#define BS_VolLab32\t\t\t71\t\t/* FAT32: Volume label string (8-byte) */\n#define BS_FilSysType32\t\t82\t\t/* FAT32: Filesystem type string (8-byte) */\n#define BS_BootCode32\t\t90\t\t/* FAT32: Boot code (420-byte) */\n\n#define BPB_ZeroedEx\t\t11\t\t/* exFAT: MBZ field (53-byte) */\n#define BPB_VolOfsEx\t\t64\t\t/* exFAT: Volume offset from top of the drive [sector] (QWORD) */\n#define BPB_TotSecEx\t\t72\t\t/* exFAT: Volume size [sector] (QWORD) */\n#define BPB_FatOfsEx\t\t80\t\t/* exFAT: FAT offset from top of the volume [sector] (DWORD) */\n#define BPB_FatSzEx\t\t\t84\t\t/* exFAT: FAT size [sector] (DWORD) */\n#define BPB_DataOfsEx\t\t88\t\t/* exFAT: Data offset from top of the volume [sector] (DWORD) */\n#define BPB_NumClusEx\t\t92\t\t/* exFAT: Number of clusters (DWORD) */\n#define BPB_RootClusEx\t\t96\t\t/* exFAT: Root directory start cluster (DWORD) */\n#define BPB_VolIDEx\t\t\t100\t\t/* exFAT: Volume serial number (DWORD) */\n#define BPB_FSVerEx\t\t\t104\t\t/* exFAT: Filesystem version (WORD) */\n#define BPB_VolFlagEx\t\t106\t\t/* exFAT: Volume flags (WORD) */\n#define BPB_BytsPerSecEx\t108\t\t/* exFAT: Log2 of sector size in unit of byte (BYTE) */\n#define BPB_SecPerClusEx\t109\t\t/* exFAT: Log2 of cluster size in unit of sector (BYTE) */\n#define BPB_NumFATsEx\t\t110\t\t/* exFAT: Number of FATs (BYTE) */\n#define BPB_DrvNumEx\t\t111\t\t/* exFAT: Physical drive number for int13h (BYTE) */\n#define BPB_PercInUseEx\t\t112\t\t/* exFAT: Percent in use (BYTE) */\n#define BPB_RsvdEx\t\t\t113\t\t/* exFAT: Reserved (7-byte) */\n#define BS_BootCodeEx\t\t120\t\t/* exFAT: Boot code (390-byte) */\n\n#define DIR_Name\t\t\t0\t\t/* Short file name (11-byte) */\n#define DIR_Attr\t\t\t11\t\t/* Attribute (BYTE) */\n#define DIR_NTres\t\t\t12\t\t/* Lower case flag (BYTE) */\n#define DIR_CrtTime10\t\t13\t\t/* Created time sub-second (BYTE) */\n#define DIR_CrtTime\t\t\t14\t\t/* Created time (DWORD) */\n#define DIR_LstAccDate\t\t18\t\t/* Last accessed date (WORD) */\n#define DIR_FstClusHI\t\t20\t\t/* Higher 16-bit of first cluster (WORD) */\n#define DIR_ModTime\t\t\t22\t\t/* Modified time (DWORD) */\n#define DIR_FstClusLO\t\t26\t\t/* Lower 16-bit of first cluster (WORD) */\n#define DIR_FileSize\t\t28\t\t/* File size (DWORD) */\n#define LDIR_Ord\t\t\t0\t\t/* LFN: LFN order and LLE flag (BYTE) */\n#define LDIR_Attr\t\t\t11\t\t/* LFN: LFN attribute (BYTE) */\n#define LDIR_Type\t\t\t12\t\t/* LFN: Entry type (BYTE) */\n#define LDIR_Chksum\t\t\t13\t\t/* LFN: Checksum of the SFN (BYTE) */\n#define LDIR_FstClusLO\t\t26\t\t/* LFN: MBZ field (WORD) */\n#define XDIR_Type\t\t\t0\t\t/* exFAT: Type of exFAT directory entry (BYTE) */\n#define XDIR_NumLabel\t\t1\t\t/* exFAT: Number of volume label characters (BYTE) */\n#define XDIR_Label\t\t\t2\t\t/* exFAT: Volume label (11-WORD) */\n#define XDIR_CaseSum\t\t4\t\t/* exFAT: Sum of case conversion table (DWORD) */\n#define XDIR_NumSec\t\t\t1\t\t/* exFAT: Number of secondary entries (BYTE) */\n#define XDIR_SetSum\t\t\t2\t\t/* exFAT: Sum of the set of directory entries (WORD) */\n#define XDIR_Attr\t\t\t4\t\t/* exFAT: File attribute (WORD) */\n#define XDIR_CrtTime\t\t8\t\t/* exFAT: Created time (DWORD) */\n#define XDIR_ModTime\t\t12\t\t/* exFAT: Modified time (DWORD) */\n#define XDIR_AccTime\t\t16\t\t/* exFAT: Last accessed time (DWORD) */\n#define XDIR_CrtTime10\t\t20\t\t/* exFAT: Created time subsecond (BYTE) */\n#define XDIR_ModTime10\t\t21\t\t/* exFAT: Modified time subsecond (BYTE) */\n#define XDIR_CrtTZ\t\t\t22\t\t/* exFAT: Created timezone (BYTE) */\n#define XDIR_ModTZ\t\t\t23\t\t/* exFAT: Modified timezone (BYTE) */\n#define XDIR_AccTZ\t\t\t24\t\t/* exFAT: Last accessed timezone (BYTE) */\n#define XDIR_GenFlags\t\t33\t\t/* exFAT: General secondary flags (BYTE) */\n#define XDIR_NumName\t\t35\t\t/* exFAT: Number of file name characters (BYTE) */\n#define XDIR_NameHash\t\t36\t\t/* exFAT: Hash of file name (WORD) */\n#define XDIR_ValidFileSize\t40\t\t/* exFAT: Valid file size (QWORD) */\n#define XDIR_FstClus\t\t52\t\t/* exFAT: First cluster of the file data (DWORD) */\n#define XDIR_FileSize\t\t56\t\t/* exFAT: File/Directory size (QWORD) */\n\n#define SZDIRE\t\t\t\t32\t\t/* Size of a directory entry */\n#define DDEM\t\t\t\t0xE5\t/* Deleted directory entry mark set to DIR_Name[0] */\n#define RDDEM\t\t\t\t0x05\t/* Replacement of the character collides with DDEM */\n#define LLEF\t\t\t\t0x40\t/* Last long entry flag in LDIR_Ord */\n\n#define FSI_LeadSig\t\t\t0\t\t/* FAT32 FSI: Leading signature (DWORD) */\n#define FSI_StrucSig\t\t484\t\t/* FAT32 FSI: Structure signature (DWORD) */\n#define FSI_Free_Count\t\t488\t\t/* FAT32 FSI: Number of free clusters (DWORD) */\n#define FSI_Nxt_Free\t\t492\t\t/* FAT32 FSI: Last allocated cluster (DWORD) */\n\n#define MBR_Table\t\t\t446\t\t/* MBR: Offset of partition table in the MBR */\n#define SZ_PTE\t\t\t\t16\t\t/* MBR: Size of a partition table entry */\n#define PTE_Boot\t\t\t0\t\t/* MBR PTE: Boot indicator */\n#define PTE_StHead\t\t\t1\t\t/* MBR PTE: Start head */\n#define PTE_StSec\t\t\t2\t\t/* MBR PTE: Start sector */\n#define PTE_StCyl\t\t\t3\t\t/* MBR PTE: Start cylinder */\n#define PTE_System\t\t\t4\t\t/* MBR PTE: System ID */\n#define PTE_EdHead\t\t\t5\t\t/* MBR PTE: End head */\n#define PTE_EdSec\t\t\t6\t\t/* MBR PTE: End sector */\n#define PTE_EdCyl\t\t\t7\t\t/* MBR PTE: End cylinder */\n#define PTE_StLba\t\t\t8\t\t/* MBR PTE: Start in LBA */\n#define PTE_SizLba\t\t\t12\t\t/* MBR PTE: Size in LBA */\n\n\n/* Post process on fatal error in the file operations */\n#define ABORT(fs, res)\t\t{ fp->err = (BYTE)(res); LEAVE_FF(fs, res); }\n\n\n/* Re-entrancy related */\n#if FF_FS_REENTRANT\n#if FF_USE_LFN == 1\n#error Static LFN work area cannot be used at thread-safe configuration\n#endif\n#define LEAVE_FF(fs, res)\t{ unlock_fs(fs, res); return res; }\n#else\n#define LEAVE_FF(fs, res)\treturn res\n#endif\n\n\n/* Definitions of volume - physical location conversion */\n#if FF_MULTI_PARTITION\n#define LD2PD(vol) VolToPart[vol].pd\t/* Get physical drive number */\n#define LD2PT(vol) VolToPart[vol].pt\t/* Get partition index */\n#else\n#define LD2PD(vol) (BYTE)(vol)\t/* Each logical drive is bound to the same physical drive number */\n#define LD2PT(vol) 0\t\t\t/* Find first valid partition or in SFD */\n#endif\n\n\n/* Definitions of sector size */\n#if (FF_MAX_SS < FF_MIN_SS) || (FF_MAX_SS != 512 && FF_MAX_SS != 1024 && FF_MAX_SS != 2048 && FF_MAX_SS != 4096) || (FF_MIN_SS != 512 && FF_MIN_SS != 1024 && FF_MIN_SS != 2048 && FF_MIN_SS != 4096)\n#error Wrong sector size configuration\n#endif\n#if FF_MAX_SS == FF_MIN_SS\n#define SS(fs)\t((UINT)FF_MAX_SS)\t/* Fixed sector size */\n#else\n#define SS(fs)\t((fs)->ssize)\t/* Variable sector size */\n#endif\n\n\n/* Timestamp */\n#if FF_FS_NORTC == 1\n#if FF_NORTC_YEAR < 1980 || FF_NORTC_YEAR > 2107 || FF_NORTC_MON < 1 || FF_NORTC_MON > 12 || FF_NORTC_MDAY < 1 || FF_NORTC_MDAY > 31\n#error Invalid FF_FS_NORTC settings\n#endif\n#define GET_FATTIME()\t((DWORD)(FF_NORTC_YEAR - 1980) << 25 | (DWORD)FF_NORTC_MON << 21 | (DWORD)FF_NORTC_MDAY << 16)\n#else\n#define GET_FATTIME()\tget_fattime()\n#endif\n\n\n/* File lock controls */\n#if FF_FS_LOCK != 0\n#if FF_FS_READONLY\n#error FF_FS_LOCK must be 0 at read-only configuration\n#endif\ntypedef struct {\n\tFATFS *fs;\t\t/* Object ID 1, volume (NULL:blank entry) */\n\tDWORD clu;\t\t/* Object ID 2, containing directory (0:root) */\n\tDWORD ofs;\t\t/* Object ID 3, offset in the directory */\n\tWORD ctr;\t\t/* Object open counter, 0:none, 0x01..0xFF:read mode open count, 0x100:write mode */\n} FILESEM;\n#endif\n\n\n/* SBCS up-case tables (\\x80-\\xFF) */\n#define TBL_CT437  {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT720  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT737  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \\\n\t\t\t\t\t0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT771  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF}\n#define TBL_CT775  {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT850  {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \\\n\t\t\t\t\t0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \\\n\t\t\t\t\t0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \\\n\t\t\t\t\t0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT852  {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \\\n\t\t\t\t\t0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF}\n#define TBL_CT855  {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \\\n\t\t\t\t\t0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \\\n\t\t\t\t\t0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \\\n\t\t\t\t\t0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT857  {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \\\n\t\t\t\t\t0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT860  {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT861  {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT862  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT863  {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \\\n\t\t\t\t\t0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \\\n\t\t\t\t\t0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT864  {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT865  {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT866  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT869  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \\\n\t\t\t\t\t0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \\\n\t\t\t\t\t0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF}\n\n\n/* DBCS code range |----- 1st byte -----|  |----------- 2nd byte -----------| */\n#define TBL_DC932 {0x81, 0x9F, 0xE0, 0xFC, 0x40, 0x7E, 0x80, 0xFC, 0x00, 0x00}\n#define TBL_DC936 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0x80, 0xFE, 0x00, 0x00}\n#define TBL_DC949 {0x81, 0xFE, 0x00, 0x00, 0x41, 0x5A, 0x61, 0x7A, 0x81, 0xFE}\n#define TBL_DC950 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0xA1, 0xFE, 0x00, 0x00}\n\n\n/* Macros for table definitions */\n#define MERGE_2STR(a, b) a ## b\n#define MKCVTBL(hd, cp) MERGE_2STR(hd, cp)\n\n\n\n\n/*--------------------------------------------------------------------------\n\n   Module Private Work Area\n\n---------------------------------------------------------------------------*/\n/* Remark: Variables defined here without initial value shall be guaranteed\n/  zero/null at start-up. If not, the linker option or start-up routine is\n/  not compliance with C standard. */\n\n/*--------------------------------*/\n/* File/Volume controls           */\n/*--------------------------------*/\n\n#if FF_VOLUMES < 1 || FF_VOLUMES > 10\n#error Wrong FF_VOLUMES setting\n#endif\nstatic FATFS* FatFs[FF_VOLUMES];\t/* Pointer to the filesystem objects (logical drives) */\nstatic WORD Fsid;\t\t\t\t\t/* Filesystem mount ID */\n\n#if FF_FS_RPATH != 0\nstatic BYTE CurrVol;\t\t\t\t/* Current drive */\n#endif\n\n#if FF_FS_LOCK != 0\nstatic FILESEM Files[FF_FS_LOCK];\t/* Open object lock semaphores */\n#endif\n\n#if FF_STR_VOLUME_ID\n#ifdef FF_VOLUME_STRS\nstatic const char* const VolumeStr[FF_VOLUMES] = {FF_VOLUME_STRS};\t/* Pre-defined volume ID */\n#endif\n#endif\n\n\n/*--------------------------------*/\n/* LFN/Directory working buffer   */\n/*--------------------------------*/\n\n#if FF_USE_LFN == 0\t\t/* Non-LFN configuration */\n#if FF_FS_EXFAT\n#error LFN must be enabled when enable exFAT\n#endif\n#define DEF_NAMBUF\n#define INIT_NAMBUF(fs)\n#define FREE_NAMBUF()\n#define LEAVE_MKFS(res)\treturn res\n\n#else\t\t\t\t\t/* LFN configurations */\n#if FF_MAX_LFN < 12 || FF_MAX_LFN > 255\n#error Wrong setting of FF_MAX_LFN\n#endif\n#if FF_LFN_BUF < FF_SFN_BUF || FF_SFN_BUF < 12\n#error Wrong setting of FF_LFN_BUF or FF_SFN_BUF\n#endif\n#if FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3\n#error Wrong setting of FF_LFN_UNICODE\n#endif\nstatic const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30};\t/* FAT: Offset of LFN characters in the directory entry */\n#define MAXDIRB(nc)\t((nc + 44U) / 15 * SZDIRE)\t/* exFAT: Size of directory entry block scratchpad buffer needed for the name length */\n\n#if FF_USE_LFN == 1\t\t/* LFN enabled with static working buffer */\n#if FF_FS_EXFAT\nstatic BYTE\tDirBuf[MAXDIRB(FF_MAX_LFN)];\t/* Directory entry block scratchpad buffer */\n#endif\nstatic WCHAR LfnBuf[FF_MAX_LFN + 1];\t\t/* LFN working buffer */\n#define DEF_NAMBUF\n#define INIT_NAMBUF(fs)\n#define FREE_NAMBUF()\n#define LEAVE_MKFS(res)\treturn res\n\n#elif FF_USE_LFN == 2 \t/* LFN enabled with dynamic working buffer on the stack */\n#if FF_FS_EXFAT\n#define DEF_NAMBUF\t\tWCHAR lbuf[FF_MAX_LFN+1]; BYTE dbuf[MAXDIRB(FF_MAX_LFN)];\t/* LFN working buffer and directory entry block scratchpad buffer */\n#define INIT_NAMBUF(fs)\t{ (fs)->lfnbuf = lbuf; (fs)->dirbuf = dbuf; }\n#define FREE_NAMBUF()\n#else\n#define DEF_NAMBUF\t\tWCHAR lbuf[FF_MAX_LFN+1];\t/* LFN working buffer */\n#define INIT_NAMBUF(fs)\t{ (fs)->lfnbuf = lbuf; }\n#define FREE_NAMBUF()\n#endif\n#define LEAVE_MKFS(res)\treturn res\n\n#elif FF_USE_LFN == 3 \t/* LFN enabled with dynamic working buffer on the heap */\n#if FF_FS_EXFAT\n#define DEF_NAMBUF\t\tWCHAR *lfn;\t/* Pointer to LFN working buffer and directory entry block scratchpad buffer */\n#define INIT_NAMBUF(fs)\t{ lfn = ff_memalloc((FF_MAX_LFN+1)*2 + MAXDIRB(FF_MAX_LFN)); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; (fs)->dirbuf = (BYTE*)(lfn+FF_MAX_LFN+1); }\n#define FREE_NAMBUF()\tff_memfree(lfn)\n#else\n#define DEF_NAMBUF\t\tWCHAR *lfn;\t/* Pointer to LFN working buffer */\n#define INIT_NAMBUF(fs)\t{ lfn = ff_memalloc((FF_MAX_LFN+1)*2); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; }\n#define FREE_NAMBUF()\tff_memfree(lfn)\n#endif\n#define LEAVE_MKFS(res)\t{ if (!work) ff_memfree(buf); return res; }\n#define MAX_MALLOC\t0x8000\t/* Must be >=FF_MAX_SS */\n\n#else\n#error Wrong setting of FF_USE_LFN\n\n#endif\t/* FF_USE_LFN == 1 */\n#endif\t/* FF_USE_LFN == 0 */\n\n\n\n/*--------------------------------*/\n/* Code conversion tables         */\n/*--------------------------------*/\n\n#if FF_CODE_PAGE == 0\t\t/* Run-time code page configuration */\n#define CODEPAGE CodePage\nstatic WORD CodePage;\t/* Current code page */\nstatic const BYTE *ExCvt, *DbcTbl;\t/* Pointer to current SBCS up-case table and DBCS code range table below */\nstatic const BYTE Ct437[] = TBL_CT437;\nstatic const BYTE Ct720[] = TBL_CT720;\nstatic const BYTE Ct737[] = TBL_CT737;\nstatic const BYTE Ct771[] = TBL_CT771;\nstatic const BYTE Ct775[] = TBL_CT775;\nstatic const BYTE Ct850[] = TBL_CT850;\nstatic const BYTE Ct852[] = TBL_CT852;\nstatic const BYTE Ct855[] = TBL_CT855;\nstatic const BYTE Ct857[] = TBL_CT857;\nstatic const BYTE Ct860[] = TBL_CT860;\nstatic const BYTE Ct861[] = TBL_CT861;\nstatic const BYTE Ct862[] = TBL_CT862;\nstatic const BYTE Ct863[] = TBL_CT863;\nstatic const BYTE Ct864[] = TBL_CT864;\nstatic const BYTE Ct865[] = TBL_CT865;\nstatic const BYTE Ct866[] = TBL_CT866;\nstatic const BYTE Ct869[] = TBL_CT869;\nstatic const BYTE Dc932[] = TBL_DC932;\nstatic const BYTE Dc936[] = TBL_DC936;\nstatic const BYTE Dc949[] = TBL_DC949;\nstatic const BYTE Dc950[] = TBL_DC950;\n\n#elif FF_CODE_PAGE < 900\t/* Static code page configuration (SBCS) */\n#define CODEPAGE FF_CODE_PAGE\nstatic const BYTE ExCvt[] = MKCVTBL(TBL_CT, FF_CODE_PAGE);\n\n#else\t\t\t\t\t/* Static code page configuration (DBCS) */\n#define CODEPAGE FF_CODE_PAGE\nstatic const BYTE DbcTbl[] = MKCVTBL(TBL_DC, FF_CODE_PAGE);\n\n#endif\n\n\n\n\n/*--------------------------------------------------------------------------\n\n   Module Private Functions\n\n---------------------------------------------------------------------------*/\n\n\n/*-----------------------------------------------------------------------*/\n/* Load/Store multi-byte word in the FAT structure                       */\n/*-----------------------------------------------------------------------*/\n\nstatic WORD ld_word (const BYTE* ptr)\t/*\t Load a 2-byte little-endian word */\n{\n\tWORD rv;\n\n\trv = ptr[1];\n\trv = rv << 8 | ptr[0];\n\treturn rv;\n}\n\nstatic DWORD ld_dword (const BYTE* ptr)\t/* Load a 4-byte little-endian word */\n{\n\tDWORD rv;\n\n\trv = ptr[3];\n\trv = rv << 8 | ptr[2];\n\trv = rv << 8 | ptr[1];\n\trv = rv << 8 | ptr[0];\n\treturn rv;\n}\n\n#if FF_FS_EXFAT\nstatic QWORD ld_qword (const BYTE* ptr)\t/* Load an 8-byte little-endian word */\n{\n\tQWORD rv;\n\n\trv = ptr[7];\n\trv = rv << 8 | ptr[6];\n\trv = rv << 8 | ptr[5];\n\trv = rv << 8 | ptr[4];\n\trv = rv << 8 | ptr[3];\n\trv = rv << 8 | ptr[2];\n\trv = rv << 8 | ptr[1];\n\trv = rv << 8 | ptr[0];\n\treturn rv;\n}\n#endif\n\n#if !FF_FS_READONLY\nstatic void st_word (BYTE* ptr, WORD val)\t/* Store a 2-byte word in little-endian */\n{\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val;\n}\n\nstatic void st_dword (BYTE* ptr, DWORD val)\t/* Store a 4-byte word in little-endian */\n{\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val;\n}\n\n#if FF_FS_EXFAT\nstatic void st_qword (BYTE* ptr, QWORD val)\t/* Store an 8-byte word in little-endian */\n{\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val;\n}\n#endif\n#endif\t/* !FF_FS_READONLY */\n\n\n\n/*-----------------------------------------------------------------------*/\n/* String functions                                                      */\n/*-----------------------------------------------------------------------*/\n\n/* Copy memory to memory */\nstatic void mem_cpy (void* dst, const void* src, UINT cnt)\n{\n\tBYTE *d = (BYTE*)dst;\n\tconst BYTE *s = (const BYTE*)src;\n\n\tif (cnt != 0) {\n\t\tdo {\n\t\t\t*d++ = *s++;\n\t\t} while (--cnt);\n\t}\n}\n\n\n/* Fill memory block */\nstatic void mem_set (void* dst, int val, UINT cnt)\n{\n\tBYTE *d = (BYTE*)dst;\n\n\tdo {\n\t\t*d++ = (BYTE)val;\n\t} while (--cnt);\n}\n\n\n/* Compare memory block */\nstatic int mem_cmp (const void* dst, const void* src, UINT cnt)\t/* ZR:same, NZ:different */\n{\n\tconst BYTE *d = (const BYTE *)dst, *s = (const BYTE *)src;\n\tint r = 0;\n\n\tdo {\n\t\tr = *d++ - *s++;\n\t} while (--cnt && r == 0);\n\n\treturn r;\n}\n\n\n/* Check if chr is contained in the string */\nstatic int chk_chr (const char* str, int chr)\t/* NZ:contained, ZR:not contained */\n{\n\twhile (*str && *str != chr) str++;\n\treturn *str;\n}\n\n\n/* Test if the character is DBC 1st byte */\nstatic int dbc_1st (BYTE c)\n{\n#if FF_CODE_PAGE == 0\t\t/* Variable code page */\n\tif (DbcTbl && c >= DbcTbl[0]) {\n\t\tif (c <= DbcTbl[1]) return 1;\t\t\t\t\t/* 1st byte range 1 */\n\t\tif (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1;\t/* 1st byte range 2 */\n\t}\n#elif FF_CODE_PAGE >= 900\t/* DBCS fixed code page */\n\tif (c >= DbcTbl[0]) {\n\t\tif (c <= DbcTbl[1]) return 1;\n\t\tif (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1;\n\t}\n#else\t\t\t\t\t\t/* SBCS fixed code page */\n\tif (c != 0) return 0;\t/* Always false */\n#endif\n\treturn 0;\n}\n\n\n/* Test if the character is DBC 2nd byte */\nstatic int dbc_2nd (BYTE c)\n{\n#if FF_CODE_PAGE == 0\t\t/* Variable code page */\n\tif (DbcTbl && c >= DbcTbl[4]) {\n\t\tif (c <= DbcTbl[5]) return 1;\t\t\t\t\t/* 2nd byte range 1 */\n\t\tif (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1;\t/* 2nd byte range 2 */\n\t\tif (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1;\t/* 2nd byte range 3 */\n\t}\n#elif FF_CODE_PAGE >= 900\t/* DBCS fixed code page */\n\tif (c >= DbcTbl[4]) {\n\t\tif (c <= DbcTbl[5]) return 1;\n\t\tif (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1;\n\t\tif (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1;\n\t}\n#else\t\t\t\t\t\t/* SBCS fixed code page */\n\tif (c != 0) return 0;\t/* Always false */\n#endif\n\treturn 0;\n}\n\n\n#if FF_USE_LFN\n\n/* Get a character from TCHAR string in defined API encodeing */\nstatic DWORD tchar2uni (\t/* Returns character in UTF-16 encoding (>=0x10000 on double encoding unit, 0xFFFFFFFF on decode error) */\n\tconst TCHAR** str\t\t/* Pointer to pointer to TCHAR string in configured encoding */\n)\n{\n\tDWORD uc;\n\tconst TCHAR *p = *str;\n\n#if FF_LFN_UNICODE == 1\t\t/* UTF-16 input */\n\tWCHAR wc;\n\n\tuc = *p++;\t/* Get a unit */\n\tif (IsSurrogate(uc)) {\t/* Surrogate? */\n\t\twc = *p++;\t\t/* Get low surrogate */\n\t\tif (!IsSurrogateH(uc) || !IsSurrogateL(wc)) return 0xFFFFFFFF;\t/* Wrong surrogate? */\n\t\tuc = uc << 16 | wc;\n\t}\n\n#elif FF_LFN_UNICODE == 2\t/* UTF-8 input */\n\tBYTE b;\n\tint nf;\n\n\tuc = (BYTE)*p++;\t/* Get a unit */\n\tif (uc & 0x80) {\t/* Multiple byte code? */\n\t\tif ((uc & 0xE0) == 0xC0) {\t/* 2-byte sequence? */\n\t\t\tuc &= 0x1F; nf = 1;\n\t\t} else {\n\t\t\tif ((uc & 0xF0) == 0xE0) {\t/* 3-byte sequence? */\n\t\t\t\tuc &= 0x0F; nf = 2;\n\t\t\t} else {\n\t\t\t\tif ((uc & 0xF8) == 0xF0) {\t/* 4-byte sequence? */\n\t\t\t\t\tuc &= 0x07; nf = 3;\n\t\t\t\t} else {\t\t\t\t\t/* Wrong sequence */\n\t\t\t\t\treturn 0xFFFFFFFF;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdo {\t/* Get trailing bytes */\n\t\t\tb = (BYTE)*p++;\n\t\t\tif ((b & 0xC0) != 0x80) return 0xFFFFFFFF;\t/* Wrong sequence? */\n\t\t\tuc = uc << 6 | (b & 0x3F);\n\t\t} while (--nf != 0);\n\t\tif (uc < 0x80 || IsSurrogate(uc) || uc >= 0x110000) return 0xFFFFFFFF;\t/* Wrong code? */\n\t\tif (uc >= 0x010000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF);\t/* Make a surrogate pair if needed */\n\t}\n\n#elif FF_LFN_UNICODE == 3\t/* UTF-32 input */\n\tuc = (TCHAR)*p++;\t/* Get a unit */\n\tif (uc >= 0x110000) return 0xFFFFFFFF;\t/* Wrong code? */\n\tif (uc >= 0x010000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF);\t/* Make a surrogate pair if needed */\n\n#else\t\t/* ANSI/OEM input */\n\tBYTE b;\n\tWCHAR wc;\n\n\twc = (BYTE)*p++;\t\t\t/* Get a byte */\n\tif (dbc_1st((BYTE)wc)) {\t/* Is it a DBC 1st byte? */\n\t\tb = (BYTE)*p++;\t\t\t/* Get 2nd byte */\n\t\tif (!dbc_2nd(b)) return 0xFFFFFFFF;\t/* Invalid code? */\n\t\twc = (wc << 8) + b;\t\t/* Make a DBC */\n\t}\n\tif (wc != 0) {\n\t\twc = ff_oem2uni(wc, CODEPAGE);\t/* ANSI/OEM ==> Unicode */\n\t\tif (wc == 0) return 0xFFFFFFFF;\t/* Invalid code? */\n\t}\n\tuc = wc;\n\n#endif\n\t*str = p;\t/* Next read pointer */\n\treturn uc;\n}\n\n\n/* Output a TCHAR string in defined API encoding */\nstatic BYTE put_utf (\t/* Returns number of encoding units written (0:buffer overflow or wrong encoding) */\n\tDWORD chr,\t/* UTF-16 encoded character (Double encoding unit char if >=0x10000) */\n\tTCHAR* buf,\t/* Output buffer */\n\tUINT szb\t/* Size of the buffer */\n)\n{\n#if FF_LFN_UNICODE == 1\t/* UTF-16 output */\n\tWCHAR hs, wc;\n\n\ths = (WCHAR)(chr >> 16);\n\twc = (WCHAR)chr;\n\tif (hs == 0) {\t/* Single encoding unit? */\n\t\tif (szb < 1 || IsSurrogate(wc)) return 0;\t/* Buffer overflow or wrong code? */\n\t\t*buf = wc;\n\t\treturn 1;\n\t}\n\tif (szb < 2 || !IsSurrogateH(hs) || !IsSurrogateL(wc)) return 0;\t/* Buffer overflow or wrong surrogate? */\n\t*buf++ = hs;\n\t*buf++ = wc;\n\treturn 2;\n\n#elif FF_LFN_UNICODE == 2\t/* UTF-8 output */\n\tDWORD hc;\n\n\tif (chr < 0x80) {\t/* Single byte code? */\n\t\tif (szb < 1) return 0;\t/* Buffer overflow? */\n\t\t*buf = (TCHAR)chr;\n\t\treturn 1;\n\t}\n\tif (chr < 0x800) {\t/* 2-byte sequence? */\n\t\tif (szb < 2) return 0;\t/* Buffer overflow? */\n\t\t*buf++ = (TCHAR)(0xC0 | (chr >> 6 & 0x1F));\n\t\t*buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F));\n\t\treturn 2;\n\t}\n\tif (chr < 0x10000) {\t/* 3-byte sequence? */\n\t\tif (szb < 3 || IsSurrogate(chr)) return 0;\t/* Buffer overflow or wrong code? */\n\t\t*buf++ = (TCHAR)(0xE0 | (chr >> 12 & 0x0F));\n\t\t*buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F));\n\t\t*buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F));\n\t\treturn 3;\n\t}\n\t/* 4-byte sequence */\n\tif (szb < 4) return 0;\t/* Buffer overflow? */\n\thc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6;\t/* Get high 10 bits */\n\tchr = (chr & 0xFFFF) - 0xDC00;\t\t\t\t\t/* Get low 10 bits */\n\tif (hc >= 0x100000 || chr >= 0x400) return 0;\t/* Wrong surrogate? */\n\tchr = (hc | chr) + 0x10000;\n\t*buf++ = (TCHAR)(0xF0 | (chr >> 18 & 0x07));\n\t*buf++ = (TCHAR)(0x80 | (chr >> 12 & 0x3F));\n\t*buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F));\n\t*buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F));\n\treturn 4;\n\n#elif FF_LFN_UNICODE == 3\t/* UTF-32 output */\n\tDWORD hc;\n\n\tif (szb < 1) return 0;\t/* Buffer overflow? */\n\tif (chr >= 0x10000) {\t/* Out of BMP? */\n\t\thc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6;\t/* Get high 10 bits */\n\t\tchr = (chr & 0xFFFF) - 0xDC00;\t\t\t\t\t/* Get low 10 bits */\n\t\tif (hc >= 0x100000 || chr >= 0x400) return 0;\t/* Wrong surrogate? */\n\t\tchr = (hc | chr) + 0x10000;\n\t}\n\t*buf++ = (TCHAR)chr;\n\treturn 1;\n\n#else\t\t\t\t\t\t/* ANSI/OEM output */\n\tWCHAR wc;\n\n\twc = ff_uni2oem(chr, CODEPAGE);\n\tif (wc >= 0x100) {\t/* Is this a DBC? */\n\t\tif (szb < 2) return 0;\n\t\t*buf++ = (char)(wc >> 8);\t/* Store DBC 1st byte */\n\t\t*buf++ = (TCHAR)wc;\t\t\t/* Store DBC 2nd byte */\n\t\treturn 2;\n\t}\n\tif (wc == 0 || szb < 1) return 0;\t/* Invalid char or buffer overflow? */\n\t*buf++ = (TCHAR)wc;\t\t\t\t\t/* Store the character */\n\treturn 1;\n#endif\n}\n#endif\t/* FF_USE_LFN */\n\n\n#if FF_FS_REENTRANT\n/*-----------------------------------------------------------------------*/\n/* Request/Release grant to access the volume                            */\n/*-----------------------------------------------------------------------*/\nstatic int lock_fs (\t\t/* 1:Ok, 0:timeout */\n\tFATFS* fs\t\t/* Filesystem object */\n)\n{\n\treturn ff_req_grant(fs->sobj);\n}\n\n\nstatic void unlock_fs (\n\tFATFS* fs,\t\t/* Filesystem object */\n\tFRESULT res\t\t/* Result code to be returned */\n)\n{\n\tif (fs && res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE && res != FR_TIMEOUT) {\n\t\tff_rel_grant(fs->sobj);\n\t}\n}\n\n#endif\n\n\n\n#if FF_FS_LOCK != 0\n/*-----------------------------------------------------------------------*/\n/* File lock control functions                                           */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT chk_lock (\t/* Check if the file can be accessed */\n\tDIR* dp,\t\t/* Directory object pointing the file to be checked */\n\tint acc\t\t\t/* Desired access type (0:Read mode open, 1:Write mode open, 2:Delete or rename) */\n)\n{\n\tUINT i, be;\n\n\t/* Search open object table for the object */\n\tbe = 0;\n\tfor (i = 0; i < FF_FS_LOCK; i++) {\n\t\tif (Files[i].fs) {\t/* Existing entry */\n\t\t\tif (Files[i].fs == dp->obj.fs &&\t \t/* Check if the object matches with an open object */\n\t\t\t\tFiles[i].clu == dp->obj.sclust &&\n\t\t\t\tFiles[i].ofs == dp->dptr) break;\n\t\t} else {\t\t\t/* Blank entry */\n\t\t\tbe = 1;\n\t\t}\n\t}\n\tif (i == FF_FS_LOCK) {\t/* The object has not been opened */\n\t\treturn (!be && acc != 2) ? FR_TOO_MANY_OPEN_FILES : FR_OK;\t/* Is there a blank entry for new object? */\n\t}\n\n\t/* The object was opened. Reject any open against writing file and all write mode open */\n\treturn (acc != 0 || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK;\n}\n\n\nstatic int enq_lock (void)\t/* Check if an entry is available for a new object */\n{\n\tUINT i;\n\n\tfor (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ;\n\treturn (i == FF_FS_LOCK) ? 0 : 1;\n}\n\n\nstatic UINT inc_lock (\t/* Increment object open counter and returns its index (0:Internal error) */\n\tDIR* dp,\t/* Directory object pointing the file to register or increment */\n\tint acc\t\t/* Desired access (0:Read, 1:Write, 2:Delete/Rename) */\n)\n{\n\tUINT i;\n\n\n\tfor (i = 0; i < FF_FS_LOCK; i++) {\t/* Find the object */\n\t\tif (Files[i].fs == dp->obj.fs &&\n\t\t\tFiles[i].clu == dp->obj.sclust &&\n\t\t\tFiles[i].ofs == dp->dptr) break;\n\t}\n\n\tif (i == FF_FS_LOCK) {\t\t\t\t/* Not opened. Register it as new. */\n\t\tfor (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ;\n\t\tif (i == FF_FS_LOCK) return 0;\t/* No free entry to register (int err) */\n\t\tFiles[i].fs = dp->obj.fs;\n\t\tFiles[i].clu = dp->obj.sclust;\n\t\tFiles[i].ofs = dp->dptr;\n\t\tFiles[i].ctr = 0;\n\t}\n\n\tif (acc >= 1 && Files[i].ctr) return 0;\t/* Access violation (int err) */\n\n\tFiles[i].ctr = acc ? 0x100 : Files[i].ctr + 1;\t/* Set semaphore value */\n\n\treturn i + 1;\t/* Index number origin from 1 */\n}\n\n\nstatic FRESULT dec_lock (\t/* Decrement object open counter */\n\tUINT i\t\t\t/* Semaphore index (1..) */\n)\n{\n\tWORD n;\n\tFRESULT res;\n\n\n\tif (--i < FF_FS_LOCK) {\t/* Index number origin from 0 */\n\t\tn = Files[i].ctr;\n\t\tif (n == 0x100) n = 0;\t\t/* If write mode open, delete the entry */\n\t\tif (n > 0) n--;\t\t\t\t/* Decrement read mode open count */\n\t\tFiles[i].ctr = n;\n\t\tif (n == 0) Files[i].fs = 0;\t/* Delete the entry if open count gets zero */\n\t\tres = FR_OK;\n\t} else {\n\t\tres = FR_INT_ERR;\t\t\t/* Invalid index nunber */\n\t}\n\treturn res;\n}\n\n\nstatic void clear_lock (\t/* Clear lock entries of the volume */\n\tFATFS *fs\n)\n{\n\tUINT i;\n\n\tfor (i = 0; i < FF_FS_LOCK; i++) {\n\t\tif (Files[i].fs == fs) Files[i].fs = 0;\n\t}\n}\n\n#endif\t/* FF_FS_LOCK != 0 */\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Move/Flush disk access window in the filesystem object                */\n/*-----------------------------------------------------------------------*/\n#if !FF_FS_READONLY\nstatic FRESULT sync_window (\t/* Returns FR_OK or FR_DISK_ERR */\n\tFATFS* fs\t\t\t/* Filesystem object */\n)\n{\n\tFRESULT res = FR_OK;\n\n\n\tif (fs->wflag) {\t/* Is the disk access window dirty */\n\t\tif (disk_write(fs->pdrv, fs->win, fs->winsect, 1) == RES_OK) {\t/* Write back the window */\n\t\t\tfs->wflag = 0;\t/* Clear window dirty flag */\n\t\t\tif (fs->winsect - fs->fatbase < fs->fsize) {\t/* Is it in the 1st FAT? */\n\t\t\t\tif (fs->n_fats == 2) disk_write(fs->pdrv, fs->win, fs->winsect + fs->fsize, 1);\t/* Reflect it to 2nd FAT if needed */\n\t\t\t}\n\t\t} else {\n\t\t\tres = FR_DISK_ERR;\n\t\t}\n\t}\n\treturn res;\n}\n#endif\n\n\nstatic FRESULT move_window (\t/* Returns FR_OK or FR_DISK_ERR */\n\tFATFS* fs,\t\t\t/* Filesystem object */\n\tDWORD sector\t\t/* Sector number to make appearance in the fs->win[] */\n)\n{\n\tFRESULT res = FR_OK;\n\n\n\tif (sector != fs->winsect) {\t/* Window offset changed? */\n#if !FF_FS_READONLY\n\t\tres = sync_window(fs);\t\t/* Write-back changes */\n#endif\n\t\tif (res == FR_OK) {\t\t\t/* Fill sector window with new data */\n\t\t\tif (disk_read(fs->pdrv, fs->win, sector, 1) != RES_OK) {\n\t\t\t\tsector = 0xFFFFFFFF;\t/* Invalidate window if read data is not valid */\n\t\t\t\tres = FR_DISK_ERR;\n\t\t\t}\n\t\t\tfs->winsect = sector;\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Synchronize filesystem and data on the storage                        */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT sync_fs (\t/* Returns FR_OK or FR_DISK_ERR */\n\tFATFS* fs\t\t/* Filesystem object */\n)\n{\n\tFRESULT res;\n\n\n\tres = sync_window(fs);\n\tif (res == FR_OK) {\n\t\tif (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) {\t/* FAT32: Update FSInfo sector if needed */\n\t\t\t/* Create FSInfo structure */\n\t\t\tmem_set(fs->win, 0, SS(fs));\n\t\t\tst_word(fs->win + BS_55AA, 0xAA55);\n\t\t\tst_dword(fs->win + FSI_LeadSig, 0x41615252);\n\t\t\tst_dword(fs->win + FSI_StrucSig, 0x61417272);\n\t\t\tst_dword(fs->win + FSI_Free_Count, fs->free_clst);\n\t\t\tst_dword(fs->win + FSI_Nxt_Free, fs->last_clst);\n\t\t\t/* Write it into the FSInfo sector */\n\t\t\tfs->winsect = fs->volbase + 1;\n\t\t\tdisk_write(fs->pdrv, fs->win, fs->winsect, 1);\n\t\t\tfs->fsi_flag = 0;\n\t\t}\n\t\t/* Make sure that no pending write process in the lower layer */\n\t\tif (disk_ioctl(fs->pdrv, CTRL_SYNC, 0) != RES_OK) res = FR_DISK_ERR;\n\t}\n\n\treturn res;\n}\n\n#endif\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Get physical sector number from cluster number                        */\n/*-----------------------------------------------------------------------*/\n\nstatic DWORD clst2sect (\t/* !=0:Sector number, 0:Failed (invalid cluster#) */\n\tFATFS* fs,\t\t/* Filesystem object */\n\tDWORD clst\t\t/* Cluster# to be converted */\n)\n{\n\tclst -= 2;\t\t/* Cluster number is origin from 2 */\n\tif (clst >= fs->n_fatent - 2) return 0;\t\t/* Is it invalid cluster number? */\n\treturn fs->database + fs->csize * clst;\t\t/* Start sector number of the cluster */\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* FAT access - Read value of a FAT entry                                */\n/*-----------------------------------------------------------------------*/\n\nstatic DWORD get_fat (\t\t/* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status */\n\tFFOBJID* obj,\t/* Corresponding object */\n\tDWORD clst\t\t/* Cluster number to get the value */\n)\n{\n\tUINT wc, bc;\n\tDWORD val;\n\tFATFS *fs = obj->fs;\n\n\n\tif (clst < 2 || clst >= fs->n_fatent) {\t/* Check if in valid range */\n\t\tval = 1;\t/* Internal error */\n\n\t} else {\n\t\tval = 0xFFFFFFFF;\t/* Default value falls on disk error */\n\n\t\tswitch (fs->fs_type) {\n\t\tcase FS_FAT12 :\n\t\t\tbc = (UINT)clst; bc += bc / 2;\n\t\t\tif (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break;\n\t\t\twc = fs->win[bc++ % SS(fs)];\t\t/* Get 1st byte of the entry */\n\t\t\tif (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break;\n\t\t\twc |= fs->win[bc % SS(fs)] << 8;\t/* Merge 2nd byte of the entry */\n\t\t\tval = (clst & 1) ? (wc >> 4) : (wc & 0xFFF);\t/* Adjust bit position */\n\t\t\tbreak;\n\n\t\tcase FS_FAT16 :\n\t\t\tif (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break;\n\t\t\tval = ld_word(fs->win + clst * 2 % SS(fs));\t\t/* Simple WORD array */\n\t\t\tbreak;\n\n\t\tcase FS_FAT32 :\n\t\t\tif (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break;\n\t\t\tval = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x0FFFFFFF;\t/* Simple DWORD array but mask out upper 4 bits */\n\t\t\tbreak;\n#if FF_FS_EXFAT\n\t\tcase FS_EXFAT :\n\t\t\tif ((obj->objsize != 0 && obj->sclust != 0) || obj->stat == 0) {\t/* Object except root dir must have valid data length */\n\t\t\t\tDWORD cofs = clst - obj->sclust;\t/* Offset from start cluster */\n\t\t\t\tDWORD clen = (DWORD)((obj->objsize - 1) / SS(fs)) / fs->csize;\t/* Number of clusters - 1 */\n\n\t\t\t\tif (obj->stat == 2 && cofs <= clen) {\t/* Is it a contiguous chain? */\n\t\t\t\t\tval = (cofs == clen) ? 0x7FFFFFFF : clst + 1;\t/* No data on the FAT, generate the value */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (obj->stat == 3 && cofs < obj->n_cont) {\t/* Is it in the 1st fragment? */\n\t\t\t\t\tval = clst + 1; \t/* Generate the value */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (obj->stat != 2) {\t/* Get value from FAT if FAT chain is valid */\n\t\t\t\t\tif (obj->n_frag != 0) {\t/* Is it on the growing edge? */\n\t\t\t\t\t\tval = 0x7FFFFFFF;\t/* Generate EOC */\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break;\n\t\t\t\t\t\tval = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x7FFFFFFF;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* go to default */\n#endif\n\t\tdefault:\n\t\t\tval = 1;\t/* Internal error */\n\t\t}\n\t}\n\n\treturn val;\n}\n\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* FAT access - Change value of a FAT entry                              */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT put_fat (\t/* FR_OK(0):succeeded, !=0:error */\n\tFATFS* fs,\t\t/* Corresponding filesystem object */\n\tDWORD clst,\t\t/* FAT index number (cluster number) to be changed */\n\tDWORD val\t\t/* New value to be set to the entry */\n)\n{\n\tUINT bc;\n\tBYTE *p;\n\tFRESULT res = FR_INT_ERR;\n\n\n\tif (clst >= 2 && clst < fs->n_fatent) {\t/* Check if in valid range */\n\t\tswitch (fs->fs_type) {\n\t\tcase FS_FAT12 :\n\t\t\tbc = (UINT)clst; bc += bc / 2;\t/* bc: byte offset of the entry */\n\t\t\tres = move_window(fs, fs->fatbase + (bc / SS(fs)));\n\t\t\tif (res != FR_OK) break;\n\t\t\tp = fs->win + bc++ % SS(fs);\n\t\t\t*p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val;\t\t/* Put 1st byte */\n\t\t\tfs->wflag = 1;\n\t\t\tres = move_window(fs, fs->fatbase + (bc / SS(fs)));\n\t\t\tif (res != FR_OK) break;\n\t\t\tp = fs->win + bc % SS(fs);\n\t\t\t*p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F));\t/* Put 2nd byte */\n\t\t\tfs->wflag = 1;\n\t\t\tbreak;\n\n\t\tcase FS_FAT16 :\n\t\t\tres = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2)));\n\t\t\tif (res != FR_OK) break;\n\t\t\tst_word(fs->win + clst * 2 % SS(fs), (WORD)val);\t/* Simple WORD array */\n\t\t\tfs->wflag = 1;\n\t\t\tbreak;\n\n\t\tcase FS_FAT32 :\n#if FF_FS_EXFAT\n\t\tcase FS_EXFAT :\n#endif\n\t\t\tres = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4)));\n\t\t\tif (res != FR_OK) break;\n\t\t\tif (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) {\n\t\t\t\tval = (val & 0x0FFFFFFF) | (ld_dword(fs->win + clst * 4 % SS(fs)) & 0xF0000000);\n\t\t\t}\n\t\t\tst_dword(fs->win + clst * 4 % SS(fs), val);\n\t\t\tfs->wflag = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn res;\n}\n\n#endif /* !FF_FS_READONLY */\n\n\n\n\n#if FF_FS_EXFAT && !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* exFAT: Accessing FAT and Allocation Bitmap                            */\n/*-----------------------------------------------------------------------*/\n\n/*--------------------------------------*/\n/* Find a contiguous free cluster block */\n/*--------------------------------------*/\n\nstatic DWORD find_bitmap (\t/* 0:Not found, 2..:Cluster block found, 0xFFFFFFFF:Disk error */\n\tFATFS* fs,\t/* Filesystem object */\n\tDWORD clst,\t/* Cluster number to scan from */\n\tDWORD ncl\t/* Number of contiguous clusters to find (1..) */\n)\n{\n\tBYTE bm, bv;\n\tUINT i;\n\tDWORD val, scl, ctr;\n\n\n\tclst -= 2;\t/* The first bit in the bitmap corresponds to cluster #2 */\n\tif (clst >= fs->n_fatent - 2) clst = 0;\n\tscl = val = clst; ctr = 0;\n\tfor (;;) {\n\t\tif (move_window(fs, fs->database + val / 8 / SS(fs)) != FR_OK) return 0xFFFFFFFF;\t/* (assuming bitmap is located top of the cluster heap) */\n\t\ti = val / 8 % SS(fs); bm = 1 << (val % 8);\n\t\tdo {\n\t\t\tdo {\n\t\t\t\tbv = fs->win[i] & bm; bm <<= 1;\t\t/* Get bit value */\n\t\t\t\tif (++val >= fs->n_fatent - 2) {\t/* Next cluster (with wrap-around) */\n\t\t\t\t\tval = 0; bm = 0; i = SS(fs);\n\t\t\t\t}\n\t\t\t\tif (bv == 0) {\t/* Is it a free cluster? */\n\t\t\t\t\tif (++ctr == ncl) return scl + 2;\t/* Check if run length is sufficient for required */\n\t\t\t\t} else {\n\t\t\t\t\tscl = val; ctr = 0;\t\t/* Encountered a cluster in-use, restart to scan */\n\t\t\t\t}\n\t\t\t\tif (val == clst) return 0;\t/* All cluster scanned? */\n\t\t\t} while (bm != 0);\n\t\t\tbm = 1;\n\t\t} while (++i < SS(fs));\n\t}\n}\n\n\n/*----------------------------------------*/\n/* Set/Clear a block of allocation bitmap */\n/*----------------------------------------*/\n\nstatic FRESULT change_bitmap (\n\tFATFS* fs,\t/* Filesystem object */\n\tDWORD clst,\t/* Cluster number to change from */\n\tDWORD ncl,\t/* Number of clusters to be changed */\n\tint bv\t\t/* bit value to be set (0 or 1) */\n)\n{\n\tBYTE bm;\n\tUINT i;\n\tDWORD sect;\n\n\n\tclst -= 2;\t/* The first bit corresponds to cluster #2 */\n\tsect = fs->database + clst / 8 / SS(fs);\t/* Sector address (assuming bitmap is located top of the cluster heap) */\n\ti = clst / 8 % SS(fs);\t\t\t\t\t\t/* Byte offset in the sector */\n\tbm = 1 << (clst % 8);\t\t\t\t\t\t/* Bit mask in the byte */\n\tfor (;;) {\n\t\tif (move_window(fs, sect++) != FR_OK) return FR_DISK_ERR;\n\t\tdo {\n\t\t\tdo {\n\t\t\t\tif (bv == (int)((fs->win[i] & bm) != 0)) return FR_INT_ERR;\t/* Is the bit expected value? */\n\t\t\t\tfs->win[i] ^= bm;\t/* Flip the bit */\n\t\t\t\tfs->wflag = 1;\n\t\t\t\tif (--ncl == 0) return FR_OK;\t/* All bits processed? */\n\t\t\t} while (bm <<= 1);\t\t/* Next bit */\n\t\t\tbm = 1;\n\t\t} while (++i < SS(fs));\t\t/* Next byte */\n\t\ti = 0;\n\t}\n}\n\n\n/*---------------------------------------------*/\n/* Fill the first fragment of the FAT chain    */\n/*---------------------------------------------*/\n\nstatic FRESULT fill_first_frag (\n\tFFOBJID* obj\t/* Pointer to the corresponding object */\n)\n{\n\tFRESULT res;\n\tDWORD cl, n;\n\n\n\tif (obj->stat == 3) {\t/* Has the object been changed 'fragmented' in this session? */\n\t\tfor (cl = obj->sclust, n = obj->n_cont; n; cl++, n--) {\t/* Create cluster chain on the FAT */\n\t\t\tres = put_fat(obj->fs, cl, cl + 1);\n\t\t\tif (res != FR_OK) return res;\n\t\t}\n\t\tobj->stat = 0;\t/* Change status 'FAT chain is valid' */\n\t}\n\treturn FR_OK;\n}\n\n\n/*---------------------------------------------*/\n/* Fill the last fragment of the FAT chain     */\n/*---------------------------------------------*/\n\nstatic FRESULT fill_last_frag (\n\tFFOBJID* obj,\t/* Pointer to the corresponding object */\n\tDWORD lcl,\t\t/* Last cluster of the fragment */\n\tDWORD term\t\t/* Value to set the last FAT entry */\n)\n{\n\tFRESULT res;\n\n\n\twhile (obj->n_frag > 0) {\t/* Create the chain of last fragment */\n\t\tres = put_fat(obj->fs, lcl - obj->n_frag + 1, (obj->n_frag > 1) ? lcl - obj->n_frag + 2 : term);\n\t\tif (res != FR_OK) return res;\n\t\tobj->n_frag--;\n\t}\n\treturn FR_OK;\n}\n\n#endif\t/* FF_FS_EXFAT && !FF_FS_READONLY */\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* FAT handling - Remove a cluster chain                                 */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT remove_chain (\t/* FR_OK(0):succeeded, !=0:error */\n\tFFOBJID* obj,\t\t/* Corresponding object */\n\tDWORD clst,\t\t\t/* Cluster to remove a chain from */\n\tDWORD pclst\t\t\t/* Previous cluster of clst (0:entire chain) */\n)\n{\n\tFRESULT res = FR_OK;\n\tDWORD nxt;\n\tFATFS *fs = obj->fs;\n#if FF_FS_EXFAT || FF_USE_TRIM\n\tDWORD scl = clst, ecl = clst;\n#endif\n#if FF_USE_TRIM\n\tDWORD rt[2];\n#endif\n\n\tif (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR;\t/* Check if in valid range */\n\n\t/* Mark the previous cluster 'EOC' on the FAT if it exists */\n\tif (pclst != 0 && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) {\n\t\tres = put_fat(fs, pclst, 0xFFFFFFFF);\n\t\tif (res != FR_OK) return res;\n\t}\n\n\t/* Remove the chain */\n\tdo {\n\t\tnxt = get_fat(obj, clst);\t\t\t/* Get cluster status */\n\t\tif (nxt == 0) break;\t\t\t\t/* Empty cluster? */\n\t\tif (nxt == 1) return FR_INT_ERR;\t/* Internal error? */\n\t\tif (nxt == 0xFFFFFFFF) return FR_DISK_ERR;\t/* Disk error? */\n\t\tif (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) {\n\t\t\tres = put_fat(fs, clst, 0);\t\t/* Mark the cluster 'free' on the FAT */\n\t\t\tif (res != FR_OK) return res;\n\t\t}\n\t\tif (fs->free_clst < fs->n_fatent - 2) {\t/* Update FSINFO */\n\t\t\tfs->free_clst++;\n\t\t\tfs->fsi_flag |= 1;\n\t\t}\n#if FF_FS_EXFAT || FF_USE_TRIM\n\t\tif (ecl + 1 == nxt) {\t/* Is next cluster contiguous? */\n\t\t\tecl = nxt;\n\t\t} else {\t\t\t\t/* End of contiguous cluster block */\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\tres = change_bitmap(fs, scl, ecl - scl + 1, 0);\t/* Mark the cluster block 'free' on the bitmap */\n\t\t\t\tif (res != FR_OK) return res;\n\t\t\t}\n#endif\n#if FF_USE_TRIM\n\t\t\trt[0] = clst2sect(fs, scl);\t\t\t\t\t/* Start of data area freed */\n\t\t\trt[1] = clst2sect(fs, ecl) + fs->csize - 1;\t/* End of data area freed */\n\t\t\tdisk_ioctl(fs->pdrv, CTRL_TRIM, rt);\t\t/* Inform device the data in the block is no longer needed */\n#endif\n\t\t\tscl = ecl = nxt;\n\t\t}\n#endif\n\t\tclst = nxt;\t\t\t\t\t/* Next cluster */\n\t} while (clst < fs->n_fatent);\t/* Repeat while not the last link */\n\n#if FF_FS_EXFAT\n\t/* Some post processes for chain status */\n\tif (fs->fs_type == FS_EXFAT) {\n\t\tif (pclst == 0) {\t/* Has the entire chain been removed? */\n\t\t\tobj->stat = 0;\t\t/* Change the chain status 'initial' */\n\t\t} else {\n\t\t\tif (obj->stat == 0) {\t/* Is it a fragmented chain from the beginning of this session? */\n\t\t\t\tclst = obj->sclust;\t\t/* Follow the chain to check if it gets contiguous */\n\t\t\t\twhile (clst != pclst) {\n\t\t\t\t\tnxt = get_fat(obj, clst);\n\t\t\t\t\tif (nxt < 2) return FR_INT_ERR;\n\t\t\t\t\tif (nxt == 0xFFFFFFFF) return FR_DISK_ERR;\n\t\t\t\t\tif (nxt != clst + 1) break;\t/* Not contiguous? */\n\t\t\t\t\tclst++;\n\t\t\t\t}\n\t\t\t\tif (clst == pclst) {\t/* Has the chain got contiguous again? */\n\t\t\t\t\tobj->stat = 2;\t\t/* Change the chain status 'contiguous' */\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (obj->stat == 3 && pclst >= obj->sclust && pclst <= obj->sclust + obj->n_cont) {\t/* Was the chain fragmented in this session and got contiguous again? */\n\t\t\t\t\tobj->stat = 2;\t/* Change the chain status 'contiguous' */\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif\n\treturn FR_OK;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* FAT handling - Stretch a chain or Create a new chain                  */\n/*-----------------------------------------------------------------------*/\n\nstatic DWORD create_chain (\t/* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */\n\tFFOBJID* obj,\t\t/* Corresponding object */\n\tDWORD clst\t\t\t/* Cluster# to stretch, 0:Create a new chain */\n)\n{\n\tDWORD cs, ncl, scl;\n\tFRESULT res;\n\tFATFS *fs = obj->fs;\n\n\n\tif (clst == 0) {\t/* Create a new chain */\n\t\tscl = fs->last_clst;\t\t\t\t/* Suggested cluster to start to find */\n\t\tif (scl == 0 || scl >= fs->n_fatent) scl = 1;\n\t}\n\telse {\t\t\t\t/* Stretch a chain */\n\t\tcs = get_fat(obj, clst);\t\t\t/* Check the cluster status */\n\t\tif (cs < 2) return 1;\t\t\t\t/* Test for insanity */\n\t\tif (cs == 0xFFFFFFFF) return cs;\t/* Test for disk error */\n\t\tif (cs < fs->n_fatent) return cs;\t/* It is already followed by next cluster */\n\t\tscl = clst;\t\t\t\t\t\t\t/* Cluster to start to find */\n\t}\n\tif (fs->free_clst == 0) return 0;\t\t/* No free cluster */\n\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\tncl = find_bitmap(fs, scl, 1);\t\t\t\t/* Find a free cluster */\n\t\tif (ncl == 0 || ncl == 0xFFFFFFFF) return ncl;\t/* No free cluster or hard error? */\n\t\tres = change_bitmap(fs, ncl, 1, 1);\t\t\t/* Mark the cluster 'in use' */\n\t\tif (res == FR_INT_ERR) return 1;\n\t\tif (res == FR_DISK_ERR) return 0xFFFFFFFF;\n\t\tif (clst == 0) {\t\t\t\t\t\t\t/* Is it a new chain? */\n\t\t\tobj->stat = 2;\t\t\t\t\t\t\t/* Set status 'contiguous' */\n\t\t} else {\t\t\t\t\t\t\t\t\t/* It is a stretched chain */\n\t\t\tif (obj->stat == 2 && ncl != scl + 1) {\t/* Is the chain got fragmented? */\n\t\t\t\tobj->n_cont = scl - obj->sclust;\t/* Set size of the contiguous part */\n\t\t\t\tobj->stat = 3;\t\t\t\t\t\t/* Change status 'just fragmented' */\n\t\t\t}\n\t\t}\n\t\tif (obj->stat != 2) {\t/* Is the file non-contiguous? */\n\t\t\tif (ncl == clst + 1) {\t/* Is the cluster next to previous one? */\n\t\t\t\tobj->n_frag = obj->n_frag ? obj->n_frag + 1 : 2;\t/* Increment size of last framgent */\n\t\t\t} else {\t\t\t\t/* New fragment */\n\t\t\t\tif (obj->n_frag == 0) obj->n_frag = 1;\n\t\t\t\tres = fill_last_frag(obj, clst, ncl);\t/* Fill last fragment on the FAT and link it to new one */\n\t\t\t\tif (res == FR_OK) obj->n_frag = 1;\n\t\t\t}\n\t\t}\n\t} else\n#endif\n\t{\t/* On the FAT/FAT32 volume */\n\t\tncl = 0;\n\t\tif (scl == clst) {\t\t\t\t\t\t/* Stretching an existing chain? */\n\t\t\tncl = scl + 1;\t\t\t\t\t\t/* Test if next cluster is free */\n\t\t\tif (ncl >= fs->n_fatent) ncl = 2;\n\t\t\tcs = get_fat(obj, ncl);\t\t\t\t/* Get next cluster status */\n\t\t\tif (cs == 1 || cs == 0xFFFFFFFF) return cs;\t/* Test for error */\n\t\t\tif (cs != 0) {\t\t\t\t\t\t/* Not free? */\n\t\t\t\tcs = fs->last_clst;\t\t\t\t/* Start at suggested cluster if it is valid */\n\t\t\t\tif (cs >= 2 && cs < fs->n_fatent) scl = cs;\n\t\t\t\tncl = 0;\n\t\t\t}\n\t\t}\n\t\tif (ncl == 0) {\t/* The new cluster cannot be contiguous and find another fragment */\n\t\t\tncl = scl;\t/* Start cluster */\n\t\t\tfor (;;) {\n\t\t\t\tncl++;\t\t\t\t\t\t\t/* Next cluster */\n\t\t\t\tif (ncl >= fs->n_fatent) {\t\t/* Check wrap-around */\n\t\t\t\t\tncl = 2;\n\t\t\t\t\tif (ncl > scl) return 0;\t/* No free cluster found? */\n\t\t\t\t}\n\t\t\t\tcs = get_fat(obj, ncl);\t\t\t/* Get the cluster status */\n\t\t\t\tif (cs == 0) break;\t\t\t\t/* Found a free cluster? */\n\t\t\t\tif (cs == 1 || cs == 0xFFFFFFFF) return cs;\t/* Test for error */\n\t\t\t\tif (ncl == scl) return 0;\t\t/* No free cluster found? */\n\t\t\t}\n\t\t}\n\t\tres = put_fat(fs, ncl, 0xFFFFFFFF);\t\t/* Mark the new cluster 'EOC' */\n\t\tif (res == FR_OK && clst != 0) {\n\t\t\tres = put_fat(fs, clst, ncl);\t\t/* Link it from the previous one if needed */\n\t\t}\n\t}\n\n\tif (res == FR_OK) {\t\t\t/* Update FSINFO if function succeeded. */\n\t\tfs->last_clst = ncl;\n\t\tif (fs->free_clst <= fs->n_fatent - 2) fs->free_clst--;\n\t\tfs->fsi_flag |= 1;\n\t} else {\n\t\tncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1;\t/* Failed. Generate error status */\n\t}\n\n\treturn ncl;\t\t/* Return new cluster number or error status */\n}\n\n#endif /* !FF_FS_READONLY */\n\n\n\n\n#if FF_USE_FASTSEEK\n/*-----------------------------------------------------------------------*/\n/* FAT handling - Convert offset into cluster with link map table        */\n/*-----------------------------------------------------------------------*/\n\nstatic DWORD clmt_clust (\t/* <2:Error, >=2:Cluster number */\n\tFIL* fp,\t\t/* Pointer to the file object */\n\tFSIZE_t ofs\t\t/* File offset to be converted to cluster# */\n)\n{\n\tDWORD cl, ncl, *tbl;\n\tFATFS *fs = fp->obj.fs;\n\n\n\ttbl = fp->cltbl + 1;\t/* Top of CLMT */\n\tcl = (DWORD)(ofs / SS(fs) / fs->csize);\t/* Cluster order from top of the file */\n\tfor (;;) {\n\t\tncl = *tbl++;\t\t\t/* Number of cluters in the fragment */\n\t\tif (ncl == 0) return 0;\t/* End of table? (error) */\n\t\tif (cl < ncl) break;\t/* In this fragment? */\n\t\tcl -= ncl; tbl++;\t\t/* Next fragment */\n\t}\n\treturn cl + *tbl;\t/* Return the cluster number */\n}\n\n#endif\t/* FF_USE_FASTSEEK */\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Directory handling - Fill a cluster with zeros                        */\n/*-----------------------------------------------------------------------*/\n\n#if !FF_FS_READONLY\nstatic FRESULT dir_clear (\t/* Returns FR_OK or FR_DISK_ERR */\n\tFATFS *fs,\t\t/* Filesystem object */\n\tDWORD clst\t\t/* Directory table to clear */\n)\n{\n\tDWORD sect;\n\tUINT n, szb;\n\tBYTE *ibuf;\n\n\n\tif (sync_window(fs) != FR_OK) return FR_DISK_ERR;\t/* Flush disk access window */\n\tsect = clst2sect(fs, clst);\t\t/* Top of the cluster */\n\tfs->winsect = sect;\t\t\t\t/* Set window to top of the cluster */\n\tmem_set(fs->win, 0, SS(fs));\t/* Clear window buffer */\n#if FF_USE_LFN == 3\t\t/* Quick table clear by using multi-secter write */\n\t/* Allocate a temporary buffer */\n\tfor (szb = ((DWORD)fs->csize * SS(fs) >= MAX_MALLOC) ? MAX_MALLOC : fs->csize * SS(fs), ibuf = 0; szb > SS(fs) && (ibuf = ff_memalloc(szb)) == 0; szb /= 2) ;\n\tif (szb > SS(fs)) {\t\t/* Buffer allocated? */\n\t\tmem_set(ibuf, 0, szb);\n\t\tszb /= SS(fs);\t\t/* Bytes -> Sectors */\n\t\tfor (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ;\t/* Fill the cluster with 0 */\n\t\tff_memfree(ibuf);\n\t} else\n#endif\n\t{\n\t\tibuf = fs->win; szb = 1;\t/* Use window buffer (many single-sector writes may take a time) */\n\t\tfor (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ;\t/* Fill the cluster with 0 */\n\t}\n\treturn (n == fs->csize) ? FR_OK : FR_DISK_ERR;\n}\n#endif\t/* !FF_FS_READONLY */\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Directory handling - Set directory index                              */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_sdi (\t/* FR_OK(0):succeeded, !=0:error */\n\tDIR* dp,\t\t/* Pointer to directory object */\n\tDWORD ofs\t\t/* Offset of directory table */\n)\n{\n\tDWORD csz, clst;\n\tFATFS *fs = dp->obj.fs;\n\n\n\tif (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) {\t/* Check range of offset and alignment */\n\t\treturn FR_INT_ERR;\n\t}\n\tdp->dptr = ofs;\t\t\t\t/* Set current offset */\n\tclst = dp->obj.sclust;\t\t/* Table start cluster (0:root) */\n\tif (clst == 0 && fs->fs_type >= FS_FAT32) {\t/* Replace cluster# 0 with root cluster# */\n\t\tclst = fs->dirbase;\n\t\tif (FF_FS_EXFAT) dp->obj.stat = 0;\t/* exFAT: Root dir has an FAT chain */\n\t}\n\n\tif (clst == 0) {\t/* Static table (root-directory on the FAT volume) */\n\t\tif (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR;\t/* Is index out of range? */\n\t\tdp->sect = fs->dirbase;\n\n\t} else {\t\t\t/* Dynamic table (sub-directory or root-directory on the FAT32/exFAT volume) */\n\t\tcsz = (DWORD)fs->csize * SS(fs);\t/* Bytes per cluster */\n\t\twhile (ofs >= csz) {\t\t\t\t/* Follow cluster chain */\n\t\t\tclst = get_fat(&dp->obj, clst);\t\t\t\t/* Get next cluster */\n\t\t\tif (clst == 0xFFFFFFFF) return FR_DISK_ERR;\t/* Disk error */\n\t\t\tif (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR;\t/* Reached to end of table or internal error */\n\t\t\tofs -= csz;\n\t\t}\n\t\tdp->sect = clst2sect(fs, clst);\n\t}\n\tdp->clust = clst;\t\t\t\t\t/* Current cluster# */\n\tif (dp->sect == 0) return FR_INT_ERR;\n\tdp->sect += ofs / SS(fs);\t\t\t/* Sector# of the directory entry */\n\tdp->dir = fs->win + (ofs % SS(fs));\t/* Pointer to the entry in the win[] */\n\n\treturn FR_OK;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Directory handling - Move directory table index next                  */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_next (\t/* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */\n\tDIR* dp,\t\t\t\t/* Pointer to the directory object */\n\tint stretch\t\t\t\t/* 0: Do not stretch table, 1: Stretch table if needed */\n)\n{\n\tDWORD ofs, clst;\n\tFATFS *fs = dp->obj.fs;\n\n\n\tofs = dp->dptr + SZDIRE;\t/* Next entry */\n\tif (dp->sect == 0 || ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) return FR_NO_FILE;\t/* Report EOT when offset has reached max value */\n\n\tif (ofs % SS(fs) == 0) {\t/* Sector changed? */\n\t\tdp->sect++;\t\t\t\t/* Next sector */\n\n\t\tif (dp->clust == 0) {\t/* Static table */\n\t\t\tif (ofs / SZDIRE >= fs->n_rootdir) {\t/* Report EOT if it reached end of static table */\n\t\t\t\tdp->sect = 0; return FR_NO_FILE;\n\t\t\t}\n\t\t}\n\t\telse {\t\t\t\t\t/* Dynamic table */\n\t\t\tif ((ofs / SS(fs) & (fs->csize - 1)) == 0) {\t/* Cluster changed? */\n\t\t\t\tclst = get_fat(&dp->obj, dp->clust);\t\t/* Get next cluster */\n\t\t\t\tif (clst <= 1) return FR_INT_ERR;\t\t\t/* Internal error */\n\t\t\t\tif (clst == 0xFFFFFFFF) return FR_DISK_ERR;\t/* Disk error */\n\t\t\t\tif (clst >= fs->n_fatent) {\t\t\t\t\t/* It reached end of dynamic table */\n#if !FF_FS_READONLY\n\t\t\t\t\tif (!stretch) {\t\t\t\t\t\t\t\t/* If no stretch, report EOT */\n\t\t\t\t\t\tdp->sect = 0; return FR_NO_FILE;\n\t\t\t\t\t}\n\t\t\t\t\tclst = create_chain(&dp->obj, dp->clust);\t/* Allocate a cluster */\n\t\t\t\t\tif (clst == 0) return FR_DENIED;\t\t\t/* No free cluster */\n\t\t\t\t\tif (clst == 1) return FR_INT_ERR;\t\t\t/* Internal error */\n\t\t\t\t\tif (clst == 0xFFFFFFFF) return FR_DISK_ERR;\t/* Disk error */\n\t\t\t\t\tif (dir_clear(fs, clst) != FR_OK) return FR_DISK_ERR;\t/* Clean up the stretched table */\n\t\t\t\t\tif (FF_FS_EXFAT) dp->obj.stat |= 4;\t\t\t/* exFAT: The directory has been stretched */\n#else\n\t\t\t\t\tif (!stretch) dp->sect = 0;\t\t\t\t\t/* (this line is to suppress compiler warning) */\n\t\t\t\t\tdp->sect = 0; return FR_NO_FILE;\t\t\t/* Report EOT */\n#endif\n\t\t\t\t}\n\t\t\t\tdp->clust = clst;\t\t/* Initialize data for new cluster */\n\t\t\t\tdp->sect = clst2sect(fs, clst);\n\t\t\t}\n\t\t}\n\t}\n\tdp->dptr = ofs;\t\t\t\t\t\t/* Current entry */\n\tdp->dir = fs->win + ofs % SS(fs);\t/* Pointer to the entry in the win[] */\n\n\treturn FR_OK;\n}\n\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Directory handling - Reserve a block of directory entries             */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_alloc (\t/* FR_OK(0):succeeded, !=0:error */\n\tDIR* dp,\t\t\t\t/* Pointer to the directory object */\n\tUINT nent\t\t\t\t/* Number of contiguous entries to allocate */\n)\n{\n\tFRESULT res;\n\tUINT n;\n\tFATFS *fs = dp->obj.fs;\n\n\n\tres = dir_sdi(dp, 0);\n\tif (res == FR_OK) {\n\t\tn = 0;\n\t\tdo {\n\t\t\tres = move_window(fs, dp->sect);\n\t\t\tif (res != FR_OK) break;\n#if FF_FS_EXFAT\n\t\t\tif ((fs->fs_type == FS_EXFAT) ? (int)((dp->dir[XDIR_Type] & 0x80) == 0) : (int)(dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0)) {\n#else\n\t\t\tif (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) {\n#endif\n\t\t\t\tif (++n == nent) break;\t/* A block of contiguous free entries is found */\n\t\t\t} else {\n\t\t\t\tn = 0;\t\t\t\t\t/* Not a blank entry. Restart to search */\n\t\t\t}\n\t\t\tres = dir_next(dp, 1);\n\t\t} while (res == FR_OK);\t/* Next entry with table stretch enabled */\n\t}\n\n\tif (res == FR_NO_FILE) res = FR_DENIED;\t/* No directory entry to allocate */\n\treturn res;\n}\n\n#endif\t/* !FF_FS_READONLY */\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* FAT: Directory handling - Load/Store start cluster number             */\n/*-----------------------------------------------------------------------*/\n\nstatic DWORD ld_clust (\t/* Returns the top cluster value of the SFN entry */\n\tFATFS* fs,\t\t\t/* Pointer to the fs object */\n\tconst BYTE* dir\t\t/* Pointer to the key entry */\n)\n{\n\tDWORD cl;\n\n\tcl = ld_word(dir + DIR_FstClusLO);\n\tif (fs->fs_type == FS_FAT32) {\n\t\tcl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16;\n\t}\n\n\treturn cl;\n}\n\n\n#if !FF_FS_READONLY\nstatic void st_clust (\n\tFATFS* fs,\t/* Pointer to the fs object */\n\tBYTE* dir,\t/* Pointer to the key entry */\n\tDWORD cl\t/* Value to be set */\n)\n{\n\tst_word(dir + DIR_FstClusLO, (WORD)cl);\n\tif (fs->fs_type == FS_FAT32) {\n\t\tst_word(dir + DIR_FstClusHI, (WORD)(cl >> 16));\n\t}\n}\n#endif\n\n\n\n#if FF_USE_LFN\n/*--------------------------------------------------------*/\n/* FAT-LFN: Compare a part of file name with an LFN entry */\n/*--------------------------------------------------------*/\n\nstatic int cmp_lfn (\t\t/* 1:matched, 0:not matched */\n\tconst WCHAR* lfnbuf,\t/* Pointer to the LFN working buffer to be compared */\n\tBYTE* dir\t\t\t\t/* Pointer to the directory entry containing the part of LFN */\n)\n{\n\tUINT i, s;\n\tWCHAR wc, uc;\n\n\n\tif (ld_word(dir + LDIR_FstClusLO) != 0) return 0;\t/* Check LDIR_FstClusLO */\n\n\ti = ((dir[LDIR_Ord] & 0x3F) - 1) * 13;\t/* Offset in the LFN buffer */\n\n\tfor (wc = 1, s = 0; s < 13; s++) {\t\t/* Process all characters in the entry */\n\t\tuc = ld_word(dir + LfnOfs[s]);\t\t/* Pick an LFN character */\n\t\tif (wc != 0) {\n\t\t\tif (i >= FF_MAX_LFN || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) {\t/* Compare it */\n\t\t\t\treturn 0;\t\t\t\t\t/* Not matched */\n\t\t\t}\n\t\t\twc = uc;\n\t\t} else {\n\t\t\tif (uc != 0xFFFF) return 0;\t\t/* Check filler */\n\t\t}\n\t}\n\n\tif ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) return 0;\t/* Last segment matched but different length */\n\n\treturn 1;\t\t/* The part of LFN matched */\n}\n\n\n#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT\n/*-----------------------------------------------------*/\n/* FAT-LFN: Pick a part of file name from an LFN entry */\n/*-----------------------------------------------------*/\n\nstatic int pick_lfn (\t/* 1:succeeded, 0:buffer overflow or invalid LFN entry */\n\tWCHAR* lfnbuf,\t\t/* Pointer to the LFN working buffer */\n\tBYTE* dir\t\t\t/* Pointer to the LFN entry */\n)\n{\n\tUINT i, s;\n\tWCHAR wc, uc;\n\n\n\tif (ld_word(dir + LDIR_FstClusLO) != 0) return 0;\t/* Check LDIR_FstClusLO is 0 */\n\n\ti = ((dir[LDIR_Ord] & ~LLEF) - 1) * 13;\t/* Offset in the LFN buffer */\n\n\tfor (wc = 1, s = 0; s < 13; s++) {\t\t/* Process all characters in the entry */\n\t\tuc = ld_word(dir + LfnOfs[s]);\t\t/* Pick an LFN character */\n\t\tif (wc != 0) {\n\t\t\tif (i >= FF_MAX_LFN) return 0;\t/* Buffer overflow? */\n\t\t\tlfnbuf[i++] = wc = uc;\t\t\t/* Store it */\n\t\t} else {\n\t\t\tif (uc != 0xFFFF) return 0;\t\t/* Check filler */\n\t\t}\n\t}\n\n\tif (dir[LDIR_Ord] & LLEF) {\t\t\t\t/* Put terminator if it is the last LFN part */\n\t\tif (i >= FF_MAX_LFN) return 0;\t\t/* Buffer overflow? */\n\t\tlfnbuf[i] = 0;\n\t}\n\n\treturn 1;\t\t/* The part of LFN is valid */\n}\n#endif\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------*/\n/* FAT-LFN: Create an entry of LFN entries */\n/*-----------------------------------------*/\n\nstatic void put_lfn (\n\tconst WCHAR* lfn,\t/* Pointer to the LFN */\n\tBYTE* dir,\t\t\t/* Pointer to the LFN entry to be created */\n\tBYTE ord,\t\t\t/* LFN order (1-20) */\n\tBYTE sum\t\t\t/* Checksum of the corresponding SFN */\n)\n{\n\tUINT i, s;\n\tWCHAR wc;\n\n\n\tdir[LDIR_Chksum] = sum;\t\t\t/* Set checksum */\n\tdir[LDIR_Attr] = AM_LFN;\t\t/* Set attribute. LFN entry */\n\tdir[LDIR_Type] = 0;\n\tst_word(dir + LDIR_FstClusLO, 0);\n\n\ti = (ord - 1) * 13;\t\t\t\t/* Get offset in the LFN working buffer */\n\ts = wc = 0;\n\tdo {\n\t\tif (wc != 0xFFFF) wc = lfn[i++];\t/* Get an effective character */\n\t\tst_word(dir + LfnOfs[s], wc);\t\t/* Put it */\n\t\tif (wc == 0) wc = 0xFFFF;\t\t/* Padding characters for left locations */\n\t} while (++s < 13);\n\tif (wc == 0xFFFF || !lfn[i]) ord |= LLEF;\t/* Last LFN part is the start of LFN sequence */\n\tdir[LDIR_Ord] = ord;\t\t\t/* Set the LFN order */\n}\n\n#endif\t/* !FF_FS_READONLY */\n#endif\t/* FF_USE_LFN */\n\n\n\n#if FF_USE_LFN && !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* FAT-LFN: Create a Numbered SFN                                        */\n/*-----------------------------------------------------------------------*/\n\nstatic void gen_numname (\n\tBYTE* dst,\t\t\t/* Pointer to the buffer to store numbered SFN */\n\tconst BYTE* src,\t/* Pointer to SFN */\n\tconst WCHAR* lfn,\t/* Pointer to LFN */\n\tUINT seq\t\t\t/* Sequence number */\n)\n{\n\tBYTE ns[8], c;\n\tUINT i, j;\n\tWCHAR wc;\n\tDWORD sr;\n\n\n\tmem_cpy(dst, src, 11);\n\n\tif (seq > 5) {\t/* In case of many collisions, generate a hash number instead of sequential number */\n\t\tsr = seq;\n\t\twhile (*lfn) {\t/* Create a CRC as hash value */\n\t\t\twc = *lfn++;\n\t\t\tfor (i = 0; i < 16; i++) {\n\t\t\t\tsr = (sr << 1) + (wc & 1);\n\t\t\t\twc >>= 1;\n\t\t\t\tif (sr & 0x10000) sr ^= 0x11021;\n\t\t\t}\n\t\t}\n\t\tseq = (UINT)sr;\n\t}\n\n\t/* itoa (hexdecimal) */\n\ti = 7;\n\tdo {\n\t\tc = (BYTE)((seq % 16) + '0');\n\t\tif (c > '9') c += 7;\n\t\tns[i--] = c;\n\t\tseq /= 16;\n\t} while (seq);\n\tns[i] = '~';\n\n\t/* Append the number to the SFN body */\n\tfor (j = 0; j < i && dst[j] != ' '; j++) {\n\t\tif (dbc_1st(dst[j])) {\n\t\t\tif (j == i - 1) break;\n\t\t\tj++;\n\t\t}\n\t}\n\tdo {\n\t\tdst[j++] = (i < 8) ? ns[i++] : ' ';\n\t} while (j < 8);\n}\n#endif\t/* FF_USE_LFN && !FF_FS_READONLY */\n\n\n\n#if FF_USE_LFN\n/*-----------------------------------------------------------------------*/\n/* FAT-LFN: Calculate checksum of an SFN entry                           */\n/*-----------------------------------------------------------------------*/\n\nstatic BYTE sum_sfn (\n\tconst BYTE* dir\t\t/* Pointer to the SFN entry */\n)\n{\n\tBYTE sum = 0;\n\tUINT n = 11;\n\n\tdo {\n\t\tsum = (sum >> 1) + (sum << 7) + *dir++;\n\t} while (--n);\n\treturn sum;\n}\n\n#endif\t/* FF_USE_LFN */\n\n\n\n#if FF_FS_EXFAT\n/*-----------------------------------------------------------------------*/\n/* exFAT: Checksum                                                       */\n/*-----------------------------------------------------------------------*/\n\nstatic WORD xdir_sum (\t/* Get checksum of the directoly entry block */\n\tconst BYTE* dir\t\t/* Directory entry block to be calculated */\n)\n{\n\tUINT i, szblk;\n\tWORD sum;\n\n\n\tszblk = (dir[XDIR_NumSec] + 1) * SZDIRE;\t/* Number of bytes of the entry block */\n\tfor (i = sum = 0; i < szblk; i++) {\n\t\tif (i == XDIR_SetSum) {\t/* Skip 2-byte sum field */\n\t\t\ti++;\n\t\t} else {\n\t\t\tsum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + dir[i];\n\t\t}\n\t}\n\treturn sum;\n}\n\n\n\nstatic WORD xname_sum (\t/* Get check sum (to be used as hash) of the file name */\n\tconst WCHAR* name\t/* File name to be calculated */\n)\n{\n\tWCHAR chr;\n\tWORD sum = 0;\n\n\n\twhile ((chr = *name++) != 0) {\n\t\tchr = (WCHAR)ff_wtoupper(chr);\t\t/* File name needs to be up-case converted */\n\t\tsum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr & 0xFF);\n\t\tsum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr >> 8);\n\t}\n\treturn sum;\n}\n\n\n#if !FF_FS_READONLY && FF_USE_MKFS\nstatic DWORD xsum32 (\t/* Returns 32-bit checksum */\n\tBYTE  dat,\t\t\t/* Byte to be calculated (byte-by-byte processing) */\n\tDWORD sum\t\t\t/* Previous sum value */\n)\n{\n\tsum = ((sum & 1) ? 0x80000000 : 0) + (sum >> 1) + dat;\n\treturn sum;\n}\n#endif\n\n\n#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2\n/*------------------------------------------------------*/\n/* exFAT: Get object information from a directory block */\n/*------------------------------------------------------*/\n\nstatic void get_xfileinfo (\n\tBYTE* dirb,\t\t\t/* Pointer to the direcotry entry block 85+C0+C1s */\n\tFILINFO* fno\t\t/* Buffer to store the extracted file information */\n)\n{\n\tWCHAR wc, hs;\n\tUINT di, si, nc;\n\n\t/* Get file name from the entry block */\n\tsi = SZDIRE * 2;\t/* 1st C1 entry */\n\tnc = 0; hs = 0; di = 0;\n\twhile (nc < dirb[XDIR_NumName]) {\n\t\tif (si >= MAXDIRB(FF_MAX_LFN)) { di = 0; break; }\t/* Truncated directory block? */\n\t\tif ((si % SZDIRE) == 0) si += 2;\t\t/* Skip entry type field */\n\t\twc = ld_word(dirb + si); si += 2; nc++;\t/* Get a character */\n\t\tif (hs == 0 && IsSurrogate(wc)) {\t/* Is it a surrogate? */\n\t\t\ths = wc; continue;\t/* Get low surrogate */\n\t\t}\n\t\twc = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di);\t/* Store it in API encoding */\n\t\tif (wc == 0) { di = 0; break; }\t/* Buffer overflow or wrong encoding? */\n\t\tdi += wc;\n\t\ths = 0;\n\t}\n\tif (hs != 0) di = 0;\t\t\t\t\t/* Broken surrogate pair? */\n\tif (di == 0) fno->fname[di++] = '?';\t/* Inaccessible object name? */\n\tfno->fname[di] = 0;\t\t\t\t\t\t/* Terminate the name */\n\tfno->altname[0] = 0;\t\t\t\t\t/* exFAT does not support SFN */\n\n\tfno->fattrib = dirb[XDIR_Attr];\t\t\t/* Attribute */\n\tfno->fsize = (fno->fattrib & AM_DIR) ? 0 : ld_qword(dirb + XDIR_FileSize);\t/* Size */\n\tfno->ftime = ld_word(dirb + XDIR_ModTime + 0);\t/* Time */\n\tfno->fdate = ld_word(dirb + XDIR_ModTime + 2);\t/* Date */\n}\n\n#endif\t/* FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 */\n\n\n/*-----------------------------------*/\n/* exFAT: Get a directry entry block */\n/*-----------------------------------*/\n\nstatic FRESULT load_xdir (\t/* FR_INT_ERR: invalid entry block */\n\tDIR* dp\t\t\t\t\t/* Reading direcotry object pointing top of the entry block to load */\n)\n{\n\tFRESULT res;\n\tUINT i, sz_ent;\n\tBYTE* dirb = dp->obj.fs->dirbuf;\t/* Pointer to the on-memory direcotry entry block 85+C0+C1s */\n\n\n\t/* Load 85 entry */\n\tres = move_window(dp->obj.fs, dp->sect);\n\tif (res != FR_OK) return res;\n\tif (dp->dir[XDIR_Type] != 0x85) return FR_INT_ERR;\t/* Invalid order */\n\tmem_cpy(dirb + 0 * SZDIRE, dp->dir, SZDIRE);\n\tsz_ent = (dirb[XDIR_NumSec] + 1) * SZDIRE;\n\tif (sz_ent < 3 * SZDIRE || sz_ent > 19 * SZDIRE) return FR_INT_ERR;\n\n\t/* Load C0 entry */\n\tres = dir_next(dp, 0);\n\tif (res == FR_NO_FILE) res = FR_INT_ERR;\t/* It cannot be */\n\tif (res != FR_OK) return res;\n\tres = move_window(dp->obj.fs, dp->sect);\n\tif (res != FR_OK) return res;\n\tif (dp->dir[XDIR_Type] != 0xC0) return FR_INT_ERR;\t/* Invalid order */\n\tmem_cpy(dirb + 1 * SZDIRE, dp->dir, SZDIRE);\n\tif (MAXDIRB(dirb[XDIR_NumName]) > sz_ent) return FR_INT_ERR;\n\n\t/* Load C1 entries */\n\ti = 2 * SZDIRE;\t/* C1 offset to load */\n\tdo {\n\t\tres = dir_next(dp, 0);\n\t\tif (res == FR_NO_FILE) res = FR_INT_ERR;\t/* It cannot be */\n\t\tif (res != FR_OK) return res;\n\t\tres = move_window(dp->obj.fs, dp->sect);\n\t\tif (res != FR_OK) return res;\n\t\tif (dp->dir[XDIR_Type] != 0xC1) return FR_INT_ERR;\t/* Invalid order */\n\t\tif (i < MAXDIRB(FF_MAX_LFN)) mem_cpy(dirb + i, dp->dir, SZDIRE);\n\t} while ((i += SZDIRE) < sz_ent);\n\n\t/* Sanity check (do it for only accessible object) */\n\tif (i <= MAXDIRB(FF_MAX_LFN)) {\n\t\tif (xdir_sum(dirb) != ld_word(dirb + XDIR_SetSum)) return FR_INT_ERR;\n\t}\n\treturn FR_OK;\n}\n\n\n/*------------------------------------------------------------------*/\n/* exFAT: Initialize object allocation info with loaded entry block */\n/*------------------------------------------------------------------*/\n\nstatic void init_alloc_info (\n\tFATFS* fs,\t\t/* Filesystem object */\n\tFFOBJID* obj\t/* Object allocation information to be initialized */\n)\n{\n\tobj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus);\t\t/* Start cluster */\n\tobj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize);\t/* Size */\n\tobj->stat = fs->dirbuf[XDIR_GenFlags] & 2;\t\t\t\t/* Allocation status */\n\tobj->n_frag = 0;\t\t\t\t\t\t\t\t\t\t/* No last fragment info */\n}\n\n\n\n#if !FF_FS_READONLY || FF_FS_RPATH != 0\n/*------------------------------------------------*/\n/* exFAT: Load the object's directory entry block */\n/*------------------------------------------------*/\n\nstatic FRESULT load_obj_xdir (\n\tDIR* dp,\t\t\t/* Blank directory object to be used to access containing direcotry */\n\tconst FFOBJID* obj\t/* Object with its containing directory information */\n)\n{\n\tFRESULT res;\n\n\t/* Open object containing directory */\n\tdp->obj.fs = obj->fs;\n\tdp->obj.sclust = obj->c_scl;\n\tdp->obj.stat = (BYTE)obj->c_size;\n\tdp->obj.objsize = obj->c_size & 0xFFFFFF00;\n\tdp->obj.n_frag = 0;\n\tdp->blk_ofs = obj->c_ofs;\n\n\tres = dir_sdi(dp, dp->blk_ofs);\t/* Goto object's entry block */\n\tif (res == FR_OK) {\n\t\tres = load_xdir(dp);\t\t/* Load the object's entry block */\n\t}\n\treturn res;\n}\n#endif\n\n\n#if !FF_FS_READONLY\n/*----------------------------------------*/\n/* exFAT: Store the directory entry block */\n/*----------------------------------------*/\n\nstatic FRESULT store_xdir (\n\tDIR* dp\t\t\t\t/* Pointer to the direcotry object */\n)\n{\n\tFRESULT res;\n\tUINT nent;\n\tBYTE* dirb = dp->obj.fs->dirbuf;\t/* Pointer to the direcotry entry block 85+C0+C1s */\n\n\t/* Create set sum */\n\tst_word(dirb + XDIR_SetSum, xdir_sum(dirb));\n\tnent = dirb[XDIR_NumSec] + 1;\n\n\t/* Store the direcotry entry block to the directory */\n\tres = dir_sdi(dp, dp->blk_ofs);\n\twhile (res == FR_OK) {\n\t\tres = move_window(dp->obj.fs, dp->sect);\n\t\tif (res != FR_OK) break;\n\t\tmem_cpy(dp->dir, dirb, SZDIRE);\n\t\tdp->obj.fs->wflag = 1;\n\t\tif (--nent == 0) break;\n\t\tdirb += SZDIRE;\n\t\tres = dir_next(dp, 0);\n\t}\n\treturn (res == FR_OK || res == FR_DISK_ERR) ? res : FR_INT_ERR;\n}\n\n\n\n/*-------------------------------------------*/\n/* exFAT: Create a new directory enrty block */\n/*-------------------------------------------*/\n\nstatic void create_xdir (\n\tBYTE* dirb,\t\t\t/* Pointer to the direcotry entry block buffer */\n\tconst WCHAR* lfn\t/* Pointer to the object name */\n)\n{\n\tUINT i;\n\tBYTE nc1, nlen;\n\tWCHAR wc;\n\n\n\t/* Create 85,C0 entry */\n\tmem_set(dirb, 0, 2 * SZDIRE);\n\tdirb[0 * SZDIRE + XDIR_Type] = 0x85;\t/* 85 entry */\n\tdirb[1 * SZDIRE + XDIR_Type] = 0xC0;\t/* C0 entry */\n\n\t/* Create C1 entries */\n\ti = SZDIRE * 2;\t/* Top of C1 entries */\n\tnlen = nc1 = 0; wc = 1;\n\tdo {\n\t\tdirb[i++] = 0xC1; dirb[i++] = 0;\t/* Entry type C1 */\n\t\tdo {\t/* Fill name field */\n\t\t\tif (wc != 0 && (wc = lfn[nlen]) != 0) nlen++;\t/* Get a character if exist */\n\t\t\tst_word(dirb + i, wc); \t\t/* Store it */\n\t\t\ti += 2;\n\t\t} while (i % SZDIRE != 0);\n\t\tnc1++;\n\t} while (lfn[nlen]);\t/* Fill next entry if any char follows */\n\n\tdirb[XDIR_NumName] = nlen;\t\t/* Set name length */\n\tdirb[XDIR_NumSec] = 1 + nc1;\t/* Set secondary count (C0 + C1s) */\n\tst_word(dirb + XDIR_NameHash, xname_sum(lfn));\t/* Set name hash */\n}\n\n#endif\t/* !FF_FS_READONLY */\n#endif\t/* FF_FS_EXFAT */\n\n\n\n#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT\n/*-----------------------------------------------------------------------*/\n/* Read an object from the directory                                     */\n/*-----------------------------------------------------------------------*/\n\n#define dir_read_file(dp) dir_read(dp, 0)\n#define dir_read_label(dp) dir_read(dp, 1)\n\nstatic FRESULT dir_read (\n\tDIR* dp,\t\t/* Pointer to the directory object */\n\tint vol\t\t\t/* Filtered by 0:file/directory or 1:volume label */\n)\n{\n\tFRESULT res = FR_NO_FILE;\n\tFATFS *fs = dp->obj.fs;\n\tBYTE a, c;\n#if FF_USE_LFN\n\tBYTE ord = 0xFF, sum = 0xFF;\n#endif\n\n\twhile (dp->sect) {\n\t\tres = move_window(fs, dp->sect);\n\t\tif (res != FR_OK) break;\n\t\tc = dp->dir[DIR_Name];\t/* Test for the entry type */\n\t\tif (c == 0) {\n\t\t\tres = FR_NO_FILE; break; /* Reached to end of the directory */\n\t\t}\n#if FF_FS_EXFAT\n\t\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\t\tif (FF_USE_LABEL && vol) {\n\t\t\t\tif (c == 0x83) break;\t/* Volume label entry? */\n\t\t\t} else {\n\t\t\t\tif (c == 0x85) {\t\t/* Start of the file entry block? */\n\t\t\t\t\tdp->blk_ofs = dp->dptr;\t/* Get location of the block */\n\t\t\t\t\tres = load_xdir(dp);\t/* Load the entry block */\n\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\tdp->obj.attr = fs->dirbuf[XDIR_Attr] & AM_MASK;\t/* Get attribute */\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else\n#endif\n\t\t{\t/* On the FAT/FAT32 volume */\n\t\t\tdp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK;\t/* Get attribute */\n#if FF_USE_LFN\t\t/* LFN configuration */\n\t\t\tif (c == DDEM || c == '.' || (int)((a & ~AM_ARC) == AM_VOL) != vol) {\t/* An entry without valid data */\n\t\t\t\tord = 0xFF;\n\t\t\t} else {\n\t\t\t\tif (a == AM_LFN) {\t\t\t/* An LFN entry is found */\n\t\t\t\t\tif (c & LLEF) {\t\t\t/* Is it start of an LFN sequence? */\n\t\t\t\t\t\tsum = dp->dir[LDIR_Chksum];\n\t\t\t\t\t\tc &= (BYTE)~LLEF; ord = c;\n\t\t\t\t\t\tdp->blk_ofs = dp->dptr;\n\t\t\t\t\t}\n\t\t\t\t\t/* Check LFN validity and capture it */\n\t\t\t\t\tord = (c == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF;\n\t\t\t\t} else {\t\t\t\t\t/* An SFN entry is found */\n\t\t\t\t\tif (ord != 0 || sum != sum_sfn(dp->dir)) {\t/* Is there a valid LFN? */\n\t\t\t\t\t\tdp->blk_ofs = 0xFFFFFFFF;\t\t\t/* It has no LFN. */\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n#else\t\t/* Non LFN configuration */\n\t\t\tif (c != DDEM && c != '.' && a != AM_LFN && (int)((a & ~AM_ARC) == AM_VOL) == vol) {\t/* Is it a valid entry? */\n\t\t\t\tbreak;\n\t\t\t}\n#endif\n\t\t}\n\t\tres = dir_next(dp, 0);\t\t/* Next entry */\n\t\tif (res != FR_OK) break;\n\t}\n\n\tif (res != FR_OK) dp->sect = 0;\t\t/* Terminate the read operation on error or EOT */\n\treturn res;\n}\n\n#endif\t/* FF_FS_MINIMIZE <= 1 || FF_USE_LABEL || FF_FS_RPATH >= 2 */\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Directory handling - Find an object in the directory                  */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_find (\t/* FR_OK(0):succeeded, !=0:error */\n\tDIR* dp\t\t\t\t\t/* Pointer to the directory object with the file name */\n)\n{\n\tFRESULT res;\n\tFATFS *fs = dp->obj.fs;\n\tBYTE c;\n#if FF_USE_LFN\n\tBYTE a, ord, sum;\n#endif\n\n\tres = dir_sdi(dp, 0);\t\t\t/* Rewind directory object */\n\tif (res != FR_OK) return res;\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\tBYTE nc;\n\t\tUINT di, ni;\n\t\tWORD hash = xname_sum(fs->lfnbuf);\t\t/* Hash value of the name to find */\n\n\t\twhile ((res = dir_read_file(dp)) == FR_OK) {\t/* Read an item */\n#if FF_MAX_LFN < 255\n\t\t\tif (fs->dirbuf[XDIR_NumName] > FF_MAX_LFN) continue;\t\t\t/* Skip comparison if inaccessible object name */\n#endif\n\t\t\tif (ld_word(fs->dirbuf + XDIR_NameHash) != hash) continue;\t/* Skip comparison if hash mismatched */\n\t\t\tfor (nc = fs->dirbuf[XDIR_NumName], di = SZDIRE * 2, ni = 0; nc; nc--, di += 2, ni++) {\t/* Compare the name */\n\t\t\t\tif ((di % SZDIRE) == 0) di += 2;\n\t\t\t\tif (ff_wtoupper(ld_word(fs->dirbuf + di)) != ff_wtoupper(fs->lfnbuf[ni])) break;\n\t\t\t}\n\t\t\tif (nc == 0 && !fs->lfnbuf[ni]) break;\t/* Name matched? */\n\t\t}\n\t\treturn res;\n\t}\n#endif\n\t/* On the FAT/FAT32 volume */\n#if FF_USE_LFN\n\tord = sum = 0xFF; dp->blk_ofs = 0xFFFFFFFF;\t/* Reset LFN sequence */\n#endif\n\tdo {\n\t\tres = move_window(fs, dp->sect);\n\t\tif (res != FR_OK) break;\n\t\tc = dp->dir[DIR_Name];\n\t\tif (c == 0) { res = FR_NO_FILE; break; }\t/* Reached to end of table */\n#if FF_USE_LFN\t\t/* LFN configuration */\n\t\tdp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK;\n\t\tif (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) {\t/* An entry without valid data */\n\t\t\tord = 0xFF; dp->blk_ofs = 0xFFFFFFFF;\t/* Reset LFN sequence */\n\t\t} else {\n\t\t\tif (a == AM_LFN) {\t\t\t/* An LFN entry is found */\n\t\t\t\tif (!(dp->fn[NSFLAG] & NS_NOLFN)) {\n\t\t\t\t\tif (c & LLEF) {\t\t/* Is it start of LFN sequence? */\n\t\t\t\t\t\tsum = dp->dir[LDIR_Chksum];\n\t\t\t\t\t\tc &= (BYTE)~LLEF; ord = c;\t/* LFN start order */\n\t\t\t\t\t\tdp->blk_ofs = dp->dptr;\t/* Start offset of LFN */\n\t\t\t\t\t}\n\t\t\t\t\t/* Check validity of the LFN entry and compare it with given name */\n\t\t\t\t\tord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF;\n\t\t\t\t}\n\t\t\t} else {\t\t\t\t\t/* An SFN entry is found */\n\t\t\t\tif (ord == 0 && sum == sum_sfn(dp->dir)) break;\t/* LFN matched? */\n\t\t\t\tif (!(dp->fn[NSFLAG] & NS_LOSS) && !mem_cmp(dp->dir, dp->fn, 11)) break;\t/* SFN matched? */\n\t\t\t\tord = 0xFF; dp->blk_ofs = 0xFFFFFFFF;\t/* Reset LFN sequence */\n\t\t\t}\n\t\t}\n#else\t\t/* Non LFN configuration */\n\t\tdp->obj.attr = dp->dir[DIR_Attr] & AM_MASK;\n\t\tif (!(dp->dir[DIR_Attr] & AM_VOL) && !mem_cmp(dp->dir, dp->fn, 11)) break;\t/* Is it a valid entry? */\n#endif\n\t\tres = dir_next(dp, 0);\t/* Next entry */\n\t} while (res == FR_OK);\n\n\treturn res;\n}\n\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Register an object to the directory                                   */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_register (\t/* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */\n\tDIR* dp\t\t\t\t\t\t/* Target directory with object name to be created */\n)\n{\n\tFRESULT res;\n\tFATFS *fs = dp->obj.fs;\n#if FF_USE_LFN\t\t/* LFN configuration */\n\tUINT n, nlen, nent;\n\tBYTE sn[12], sum;\n\n\n\tif (dp->fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME;\t/* Check name validity */\n\tfor (nlen = 0; fs->lfnbuf[nlen]; nlen++) ;\t/* Get lfn length */\n\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\tnent = (nlen + 14) / 15 + 2;\t/* Number of entries to allocate (85+C0+C1s) */\n\t\tres = dir_alloc(dp, nent);\t\t/* Allocate entries */\n\t\tif (res != FR_OK) return res;\n\t\tdp->blk_ofs = dp->dptr - SZDIRE * (nent - 1);\t/* Set the allocated entry block offset */\n\n\t\tif (dp->obj.stat & 4) {\t\t\t/* Has the directory been stretched? */\n\t\t\tdp->obj.stat &= ~4;\n\t\t\tres = fill_first_frag(&dp->obj);\t/* Fill the first fragment on the FAT if needed */\n\t\t\tif (res != FR_OK) return res;\n\t\t\tres = fill_last_frag(&dp->obj, dp->clust, 0xFFFFFFFF);\t/* Fill the last fragment on the FAT if needed */\n\t\t\tif (res != FR_OK) return res;\n\t\t\tif (dp->obj.sclust != 0) {\t\t/* Is it a sub directory? */\n\t\t\t\tDIR dj;\n\n\t\t\t\tres = load_obj_xdir(&dj, &dp->obj);\t/* Load the object status */\n\t\t\t\tif (res != FR_OK) return res;\n\t\t\t\tdp->obj.objsize += (DWORD)fs->csize * SS(fs);\t\t\t/* Increase the directory size by cluster size */\n\t\t\t\tst_qword(fs->dirbuf + XDIR_FileSize, dp->obj.objsize);\t/* Update the allocation status */\n\t\t\t\tst_qword(fs->dirbuf + XDIR_ValidFileSize, dp->obj.objsize);\n\t\t\t\tfs->dirbuf[XDIR_GenFlags] = dp->obj.stat | 1;\n\t\t\t\tres = store_xdir(&dj);\t\t\t\t/* Store the object status */\n\t\t\t\tif (res != FR_OK) return res;\n\t\t\t}\n\t\t}\n\n\t\tcreate_xdir(fs->dirbuf, fs->lfnbuf);\t/* Create on-memory directory block to be written later */\n\t\treturn FR_OK;\n\t}\n#endif\n\t/* On the FAT/FAT32 volume */\n\tmem_cpy(sn, dp->fn, 12);\n\tif (sn[NSFLAG] & NS_LOSS) {\t\t\t/* When LFN is out of 8.3 format, generate a numbered name */\n\t\tdp->fn[NSFLAG] = NS_NOLFN;\t\t/* Find only SFN */\n\t\tfor (n = 1; n < 100; n++) {\n\t\t\tgen_numname(dp->fn, sn, fs->lfnbuf, n);\t/* Generate a numbered name */\n\t\t\tres = dir_find(dp);\t\t\t\t/* Check if the name collides with existing SFN */\n\t\t\tif (res != FR_OK) break;\n\t\t}\n\t\tif (n == 100) return FR_DENIED;\t\t/* Abort if too many collisions */\n\t\tif (res != FR_NO_FILE) return res;\t/* Abort if the result is other than 'not collided' */\n\t\tdp->fn[NSFLAG] = sn[NSFLAG];\n\t}\n\n\t/* Create an SFN with/without LFNs. */\n\tnent = (sn[NSFLAG] & NS_LFN) ? (nlen + 12) / 13 + 1 : 1;\t/* Number of entries to allocate */\n\tres = dir_alloc(dp, nent);\t\t/* Allocate entries */\n\tif (res == FR_OK && --nent) {\t/* Set LFN entry if needed */\n\t\tres = dir_sdi(dp, dp->dptr - nent * SZDIRE);\n\t\tif (res == FR_OK) {\n\t\t\tsum = sum_sfn(dp->fn);\t/* Checksum value of the SFN tied to the LFN */\n\t\t\tdo {\t\t\t\t\t/* Store LFN entries in bottom first */\n\t\t\t\tres = move_window(fs, dp->sect);\n\t\t\t\tif (res != FR_OK) break;\n\t\t\t\tput_lfn(fs->lfnbuf, dp->dir, (BYTE)nent, sum);\n\t\t\t\tfs->wflag = 1;\n\t\t\t\tres = dir_next(dp, 0);\t/* Next entry */\n\t\t\t} while (res == FR_OK && --nent);\n\t\t}\n\t}\n\n#else\t/* Non LFN configuration */\n\tres = dir_alloc(dp, 1);\t\t/* Allocate an entry for SFN */\n\n#endif\n\n\t/* Set SFN entry */\n\tif (res == FR_OK) {\n\t\tres = move_window(fs, dp->sect);\n\t\tif (res == FR_OK) {\n\t\t\tmem_set(dp->dir, 0, SZDIRE);\t/* Clean the entry */\n\t\t\tmem_cpy(dp->dir + DIR_Name, dp->fn, 11);\t/* Put SFN */\n#if FF_USE_LFN\n\t\t\tdp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT);\t/* Put NT flag */\n#endif\n\t\t\tfs->wflag = 1;\n\t\t}\n\t}\n\n\treturn res;\n}\n\n#endif /* !FF_FS_READONLY */\n\n\n\n#if !FF_FS_READONLY && FF_FS_MINIMIZE == 0\n/*-----------------------------------------------------------------------*/\n/* Remove an object from the directory                                   */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_remove (\t/* FR_OK:Succeeded, FR_DISK_ERR:A disk error */\n\tDIR* dp\t\t\t\t\t/* Directory object pointing the entry to be removed */\n)\n{\n\tFRESULT res;\n\tFATFS *fs = dp->obj.fs;\n#if FF_USE_LFN\t\t/* LFN configuration */\n\tDWORD last = dp->dptr;\n\n\tres = (dp->blk_ofs == 0xFFFFFFFF) ? FR_OK : dir_sdi(dp, dp->blk_ofs);\t/* Goto top of the entry block if LFN is exist */\n\tif (res == FR_OK) {\n\t\tdo {\n\t\t\tres = move_window(fs, dp->sect);\n\t\t\tif (res != FR_OK) break;\n\t\t\tif (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\t\t\tdp->dir[XDIR_Type] &= 0x7F;\t/* Clear the entry InUse flag. */\n\t\t\t} else {\t\t\t\t\t\t\t\t\t/* On the FAT/FAT32 volume */\n\t\t\t\tdp->dir[DIR_Name] = DDEM;\t/* Mark the entry 'deleted'. */\n\t\t\t}\n\t\t\tfs->wflag = 1;\n\t\t\tif (dp->dptr >= last) break;\t/* If reached last entry then all entries of the object has been deleted. */\n\t\t\tres = dir_next(dp, 0);\t/* Next entry */\n\t\t} while (res == FR_OK);\n\t\tif (res == FR_NO_FILE) res = FR_INT_ERR;\n\t}\n#else\t\t\t/* Non LFN configuration */\n\n\tres = move_window(fs, dp->sect);\n\tif (res == FR_OK) {\n\t\tdp->dir[DIR_Name] = DDEM;\t/* Mark the entry 'deleted'.*/\n\t\tfs->wflag = 1;\n\t}\n#endif\n\n\treturn res;\n}\n\n#endif /* !FF_FS_READONLY && FF_FS_MINIMIZE == 0 */\n\n\n\n#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2\n/*-----------------------------------------------------------------------*/\n/* Get file information from directory entry                             */\n/*-----------------------------------------------------------------------*/\n\nstatic void get_fileinfo (\n\tDIR* dp,\t\t\t/* Pointer to the directory object */\n\tFILINFO* fno\t\t/* Pointer to the file information to be filled */\n)\n{\n\tUINT si, di;\n#if FF_USE_LFN\n\tWCHAR wc, hs;\n\tFATFS *fs = dp->obj.fs;\n#else\n\tTCHAR c;\n#endif\n\n\n\tfno->fname[0] = 0;\t\t\t/* Invaidate file info */\n\tif (dp->sect == 0) return;\t/* Exit if read pointer has reached end of directory */\n\n#if FF_USE_LFN\t\t/* LFN configuration */\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\tget_xfileinfo(fs->dirbuf, fno);\n\t\treturn;\n\t} else\n#endif\n\t{\t/* On the FAT/FAT32 volume */\n\t\tif (dp->blk_ofs != 0xFFFFFFFF) {\t/* Get LFN if available */\n\t\t\tsi = di = hs = 0;\n\t\t\twhile (fs->lfnbuf[si] != 0) {\n\t\t\t\twc = fs->lfnbuf[si++];\t\t/* Get an LFN character (UTF-16) */\n\t\t\t\tif (hs == 0 && IsSurrogate(wc)) {\t/* Is it a surrogate? */\n\t\t\t\t\ths = wc; continue;\t\t/* Get low surrogate */\n\t\t\t\t}\n\t\t\t\twc = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di);\t/* Store it in UTF-16 or UTF-8 encoding */\n\t\t\t\tif (wc == 0) { di = 0; break; }\t/* Invalid char or buffer overflow? */\n\t\t\t\tdi += wc;\n\t\t\t\ths = 0;\n\t\t\t}\n\t\t\tif (hs != 0) di = 0;\t/* Broken surrogate pair? */\n\t\t\tfno->fname[di] = 0;\t\t/* Terminate the LFN (null string means LFN is invalid) */\n\t\t}\n\t}\n\n\tsi = di = 0;\n\twhile (si < 11) {\t\t/* Get SFN from SFN entry */\n\t\twc = dp->dir[si++];\t\t\t/* Get a char */\n\t\tif (wc == ' ') continue;\t/* Skip padding spaces */\n\t\tif (wc == RDDEM) wc = DDEM;\t/* Restore replaced DDEM character */\n\t\tif (si == 9 && di < FF_SFN_BUF) fno->altname[di++] = '.';\t/* Insert a . if extension is exist */\n#if FF_LFN_UNICODE >= 1\t/* Unicode output */\n\t\tif (dbc_1st((BYTE)wc) && si != 8 && si != 11 && dbc_2nd(dp->dir[si])) {\t/* Make a DBC if needed */\n\t\t\twc = wc << 8 | dp->dir[si++];\n\t\t}\n\t\twc = ff_oem2uni(wc, CODEPAGE);\t\t/* ANSI/OEM -> Unicode */\n\t\tif (wc == 0) { di = 0; break; }\t\t/* Wrong char in the current code page? */\n\t\twc = put_utf(wc, &fno->altname[di], FF_SFN_BUF - di);\t/* Store it in Unicode */\n\t\tif (wc == 0) { di = 0; break; }\t\t/* Buffer overflow? */\n\t\tdi += wc;\n#else\t\t\t\t\t/* ANSI/OEM output */\n\t\tfno->altname[di++] = (TCHAR)wc;\t/* Store it without any conversion */\n#endif\n\t}\n\tfno->altname[di] = 0;\t/* Terminate the SFN  (null string means SFN is invalid) */\n\n\tif (fno->fname[0] == 0) {\t/* If LFN is invalid, altname[] needs to be copied to fname[] */\n\t\tif (di == 0) {\t/* If LFN and SFN both are invalid, this object is inaccesible */\n\t\t\tfno->fname[di++] = '?';\n\t\t} else {\n\t\t\tfor (si = di = 0; fno->altname[si]; si++, di++) {\t/* Copy altname[] to fname[] with case information */\n\t\t\t\twc = (WCHAR)fno->altname[si];\n\t\t\t\tif (IsUpper(wc) && (dp->dir[DIR_NTres] & ((si >= 9) ? NS_EXT : NS_BODY))) wc += 0x20;\n\t\t\t\tfno->fname[di] = (TCHAR)wc;\n\t\t\t}\n\t\t}\n\t\tfno->fname[di] = 0;\t/* Terminate the LFN */\n\t\tif (!dp->dir[DIR_NTres]) fno->altname[0] = 0;\t/* Altname is not needed if neither LFN nor case info is exist. */\n\t}\n\n#else\t/* Non-LFN configuration */\n\tsi = di = 0;\n\twhile (si < 11) {\t\t/* Copy name body and extension */\n\t\tc = (TCHAR)dp->dir[si++];\n\t\tif (c == ' ') continue;\t\t/* Skip padding spaces */\n\t\tif (c == RDDEM) c = DDEM;\t/* Restore replaced DDEM character */\n\t\tif (si == 9) fno->fname[di++] = '.';/* Insert a . if extension is exist */\n\t\tfno->fname[di++] = c;\n\t}\n\tfno->fname[di] = 0;\n#endif\n\n\tfno->fattrib = dp->dir[DIR_Attr];\t\t\t\t\t/* Attribute */\n\tfno->fsize = ld_dword(dp->dir + DIR_FileSize);\t\t/* Size */\n\tfno->ftime = ld_word(dp->dir + DIR_ModTime + 0);\t/* Time */\n\tfno->fdate = ld_word(dp->dir + DIR_ModTime + 2);\t/* Date */\n}\n\n#endif /* FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 */\n\n\n\n#if FF_USE_FIND && FF_FS_MINIMIZE <= 1\n/*-----------------------------------------------------------------------*/\n/* Pattern matching                                                      */\n/*-----------------------------------------------------------------------*/\n\nstatic DWORD get_achar (\t/* Get a character and advances ptr */\n\tconst TCHAR** ptr\t\t/* Pointer to pointer to the ANSI/OEM or Unicode string */\n)\n{\n\tDWORD chr;\n\n\n#if FF_USE_LFN && FF_LFN_UNICODE >= 1\t/* Unicode input */\n\tchr = tchar2uni(ptr);\n\tif (chr == 0xFFFFFFFF) chr = 0;\t\t/* Wrong UTF encoding is recognized as end of the string */\n\tchr = ff_wtoupper(chr);\n\n#else\t\t\t\t\t\t\t\t\t/* ANSI/OEM input */\n\tchr = (BYTE)*(*ptr)++;\t\t\t\t/* Get a byte */\n\tif (IsLower(chr)) chr -= 0x20;\t\t/* To upper ASCII char */\n#if FF_CODE_PAGE == 0\n\tif (ExCvt && chr >= 0x80) chr = ExCvt[chr - 0x80];\t/* To upper SBCS extended char */\n#elif FF_CODE_PAGE < 900\n\tif (chr >= 0x80) chr = ExCvt[chr - 0x80];\t/* To upper SBCS extended char */\n#endif\n#if FF_CODE_PAGE == 0 || FF_CODE_PAGE >= 900\n\tif (dbc_1st((BYTE)chr)) {\t/* Get DBC 2nd byte if needed */\n\t\tchr = dbc_2nd((BYTE)**ptr) ? chr << 8 | (BYTE)*(*ptr)++ : 0;\n\t}\n#endif\n\n#endif\n\treturn chr;\n}\n\n\nstatic int pattern_matching (\t/* 0:not matched, 1:matched */\n\tconst TCHAR* pat,\t/* Matching pattern */\n\tconst TCHAR* nam,\t/* String to be tested */\n\tint skip,\t\t\t/* Number of pre-skip chars (number of ?s) */\n\tint inf\t\t\t\t/* Infinite search (* specified) */\n)\n{\n\tconst TCHAR *pp, *np;\n\tDWORD pc, nc;\n\tint nm, nx;\n\n\n\twhile (skip--) {\t\t\t\t/* Pre-skip name chars */\n\t\tif (!get_achar(&nam)) return 0;\t/* Branch mismatched if less name chars */\n\t}\n\tif (*pat == 0 && inf) return 1;\t/* (short circuit) */\n\n\tdo {\n\t\tpp = pat; np = nam;\t\t\t/* Top of pattern and name to match */\n\t\tfor (;;) {\n\t\t\tif (*pp == '?' || *pp == '*') {\t/* Wildcard? */\n\t\t\t\tnm = nx = 0;\n\t\t\t\tdo {\t\t\t\t/* Analyze the wildcard block */\n\t\t\t\t\tif (*pp++ == '?') nm++; else nx = 1;\n\t\t\t\t} while (*pp == '?' || *pp == '*');\n\t\t\t\tif (pattern_matching(pp, np, nm, nx)) return 1;\t/* Test new branch (recurs upto number of wildcard blocks in the pattern) */\n\t\t\t\tnc = *np; break;\t/* Branch mismatched */\n\t\t\t}\n\t\t\tpc = get_achar(&pp);\t/* Get a pattern char */\n\t\t\tnc = get_achar(&np);\t/* Get a name char */\n\t\t\tif (pc != nc) break;\t/* Branch mismatched? */\n\t\t\tif (pc == 0) return 1;\t/* Branch matched? (matched at end of both strings) */\n\t\t}\n\t\tget_achar(&nam);\t\t\t/* nam++ */\n\t} while (inf && nc);\t\t\t/* Retry until end of name if infinite search is specified */\n\n\treturn 0;\n}\n\n#endif /* FF_USE_FIND && FF_FS_MINIMIZE <= 1 */\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Pick a top segment and create the object name in directory form       */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT create_name (\t/* FR_OK: successful, FR_INVALID_NAME: could not create */\n\tDIR* dp,\t\t\t\t\t/* Pointer to the directory object */\n\tconst TCHAR** path\t\t\t/* Pointer to pointer to the segment in the path string */\n)\n{\n#if FF_USE_LFN\t\t/* LFN configuration */\n\tBYTE b, cf;\n\tWCHAR wc, *lfn;\n\tDWORD uc;\n\tUINT i, ni, si, di;\n\tconst TCHAR *p;\n\n\n\t/* Create LFN into LFN working buffer */\n\tp = *path; lfn = dp->obj.fs->lfnbuf; di = 0;\n\tfor (;;) {\n\t\tuc = tchar2uni(&p);\t\t\t/* Get a character */\n\t\tif (uc == 0xFFFFFFFF) return FR_INVALID_NAME;\t\t/* Invalid code or UTF decode error */\n\t\tif (uc >= 0x10000) lfn[di++] = (WCHAR)(uc >> 16);\t/* Store high surrogate if needed */\n\t\twc = (WCHAR)uc;\n\t\tif (wc < ' ' || wc == '/' || wc == '\\\\') break;\t/* Break if end of the path or a separator is found */\n\t\tif (wc < 0x80 && chk_chr(\"\\\"*:<>\\?|\\x7F\", wc)) return FR_INVALID_NAME;\t/* Reject illegal characters for LFN */\n\t\tif (di >= FF_MAX_LFN) return FR_INVALID_NAME;\t/* Reject too long name */\n\t\tlfn[di++] = wc;\t\t\t\t\t/* Store the Unicode character */\n\t}\n\twhile (*p == '/' || *p == '\\\\') p++;\t/* Skip duplicated separators if exist */\n\t*path = p;\t\t\t\t\t\t\t/* Return pointer to the next segment */\n\tcf = (wc < ' ') ? NS_LAST : 0;\t\t/* Set last segment flag if end of the path */\n\n#if FF_FS_RPATH != 0\n\tif ((di == 1 && lfn[di - 1] == '.') ||\n\t\t(di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) {\t/* Is this segment a dot name? */\n\t\tlfn[di] = 0;\n\t\tfor (i = 0; i < 11; i++) {\t\t/* Create dot name for SFN entry */\n\t\t\tdp->fn[i] = (i < di) ? '.' : ' ';\n\t\t}\n\t\tdp->fn[i] = cf | NS_DOT;\t\t/* This is a dot entry */\n\t\treturn FR_OK;\n\t}\n#endif\n\twhile (di) {\t\t\t\t\t\t/* Snip off trailing spaces and dots if exist */\n\t\twc = lfn[di - 1];\n\t\tif (wc != ' ' && wc != '.') break;\n\t\tdi--;\n\t}\n\tlfn[di] = 0;\t\t\t\t\t\t\t/* LFN is created into the working buffer */\n\tif (di == 0) return FR_INVALID_NAME;\t/* Reject null name */\n\n\t/* Create SFN in directory form */\n\tfor (si = 0; lfn[si] == ' '; si++) ;\t/* Remove leading spaces */\n\tif (si > 0 || lfn[si] == '.') cf |= NS_LOSS | NS_LFN;\t/* Is there any leading space or dot? */\n\twhile (di > 0 && lfn[di - 1] != '.') di--;\t/* Find last dot (di<=si: no extension) */\n\n\tmem_set(dp->fn, ' ', 11);\n\ti = b = 0; ni = 8;\n\tfor (;;) {\n\t\twc = lfn[si++];\t\t\t\t\t/* Get an LFN character */\n\t\tif (wc == 0) break;\t\t\t\t/* Break on end of the LFN */\n\t\tif (wc == ' ' || (wc == '.' && si != di)) {\t/* Remove embedded spaces and dots */\n\t\t\tcf |= NS_LOSS | NS_LFN;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (i >= ni || si == di) {\t\t/* End of field? */\n\t\t\tif (ni == 11) {\t\t\t\t/* Name extension overflow? */\n\t\t\t\tcf |= NS_LOSS | NS_LFN;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (si != di) cf |= NS_LOSS | NS_LFN;\t/* Name body overflow? */\n\t\t\tif (si > di) break;\t\t\t\t\t\t/* No name extension? */\n\t\t\tsi = di; i = 8; ni = 11; b <<= 2;\t\t/* Enter name extension */\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (wc >= 0x80) {\t/* Is this a non-ASCII character? */\n\t\t\tcf |= NS_LFN;\t/* LFN entry needs to be created */\n#if FF_CODE_PAGE == 0\n\t\t\tif (ExCvt) {\t/* At SBCS */\n\t\t\t\twc = ff_uni2oem(wc, CODEPAGE);\t\t\t/* Unicode ==> ANSI/OEM code */\n\t\t\t\tif (wc & 0x80) wc = ExCvt[wc & 0x7F];\t/* Convert extended character to upper (SBCS) */\n\t\t\t} else {\t\t/* At DBCS */\n\t\t\t\twc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE);\t/* Unicode ==> Upper convert ==> ANSI/OEM code */\n\t\t\t}\n#elif FF_CODE_PAGE < 900\t/* SBCS cfg */\n\t\t\twc = ff_uni2oem(wc, CODEPAGE);\t\t\t/* Unicode ==> ANSI/OEM code */\n\t\t\tif (wc & 0x80) wc = ExCvt[wc & 0x7F];\t/* Convert extended character to upper (SBCS) */\n#else\t\t\t\t\t\t/* DBCS cfg */\n\t\t\twc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE);\t/* Unicode ==> Upper convert ==> ANSI/OEM code */\n#endif\n\t\t}\n\n\t\tif (wc >= 0x100) {\t\t\t\t/* Is this a DBC? */\n\t\t\tif (i >= ni - 1) {\t\t\t/* Field overflow? */\n\t\t\t\tcf |= NS_LOSS | NS_LFN;\n\t\t\t\ti = ni; continue;\t\t/* Next field */\n\t\t\t}\n\t\t\tdp->fn[i++] = (BYTE)(wc >> 8);\t/* Put 1st byte */\n\t\t} else {\t\t\t\t\t\t/* SBC */\n\t\t\tif (wc == 0 || chk_chr(\"+,;=[]\", wc)) {\t/* Replace illegal characters for SFN if needed */\n\t\t\t\twc = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */\n\t\t\t} else {\n\t\t\t\tif (IsUpper(wc)) {\t\t/* ASCII upper case? */\n\t\t\t\t\tb |= 2;\n\t\t\t\t}\n\t\t\t\tif (IsLower(wc)) {\t\t/* ASCII lower case? */\n\t\t\t\t\tb |= 1; wc -= 0x20;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdp->fn[i++] = (BYTE)wc;\n\t}\n\n\tif (dp->fn[0] == DDEM) dp->fn[0] = RDDEM;\t/* If the first character collides with DDEM, replace it with RDDEM */\n\n\tif (ni == 8) b <<= 2;\t\t\t\t/* Shift capital flags if no extension */\n\tif ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) cf |= NS_LFN;\t/* LFN entry needs to be created if composite capitals */\n\tif (!(cf & NS_LFN)) {\t\t\t\t/* When LFN is in 8.3 format without extended character, NT flags are created */\n\t\tif (b & 0x01) cf |= NS_EXT;\t\t/* NT flag (Extension has small capital letters only) */\n\t\tif (b & 0x04) cf |= NS_BODY;\t/* NT flag (Body has small capital letters only) */\n\t}\n\n\tdp->fn[NSFLAG] = cf;\t/* SFN is created into dp->fn[] */\n\n\treturn FR_OK;\n\n\n#else\t/* FF_USE_LFN : Non-LFN configuration */\n\tBYTE c, d, *sfn;\n\tUINT ni, si, i;\n\tconst char *p;\n\n\t/* Create file name in directory form */\n\tp = *path; sfn = dp->fn;\n\tmem_set(sfn, ' ', 11);\n\tsi = i = 0; ni = 8;\n#if FF_FS_RPATH != 0\n\tif (p[si] == '.') { /* Is this a dot entry? */\n\t\tfor (;;) {\n\t\t\tc = (BYTE)p[si++];\n\t\t\tif (c != '.' || si >= 3) break;\n\t\t\tsfn[i++] = c;\n\t\t}\n\t\tif (c != '/' && c != '\\\\' && c > ' ') return FR_INVALID_NAME;\n\t\t*path = p + si;\t\t\t\t\t\t\t\t/* Return pointer to the next segment */\n\t\tsfn[NSFLAG] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT;\t/* Set last segment flag if end of the path */\n\t\treturn FR_OK;\n\t}\n#endif\n\tfor (;;) {\n\t\tc = (BYTE)p[si++];\t\t\t\t/* Get a byte */\n\t\tif (c <= ' ') break; \t\t\t/* Break if end of the path name */\n\t\tif (c == '/' || c == '\\\\') {\t/* Break if a separator is found */\n\t\t\twhile (p[si] == '/' || p[si] == '\\\\') si++;\t/* Skip duplicated separator if exist */\n\t\t\tbreak;\n\t\t}\n\t\tif (c == '.' || i >= ni) {\t\t/* End of body or field overflow? */\n\t\t\tif (ni == 11 || c != '.') return FR_INVALID_NAME;\t/* Field overflow or invalid dot? */\n\t\t\ti = 8; ni = 11;\t\t\t\t/* Enter file extension field */\n\t\t\tcontinue;\n\t\t}\n#if FF_CODE_PAGE == 0\n\t\tif (ExCvt && c >= 0x80) {\t\t/* Is SBC extended character? */\n\t\t\tc = ExCvt[c & 0x7F];\t\t/* To upper SBC extended character */\n\t\t}\n#elif FF_CODE_PAGE < 900\n\t\tif (c >= 0x80) {\t\t\t\t/* Is SBC extended character? */\n\t\t\tc = ExCvt[c & 0x7F];\t\t/* To upper SBC extended character */\n\t\t}\n#endif\n\t\tif (dbc_1st(c)) {\t\t\t\t/* Check if it is a DBC 1st byte */\n\t\t\td = (BYTE)p[si++];\t\t\t/* Get 2nd byte */\n\t\t\tif (!dbc_2nd(d) || i >= ni - 1) return FR_INVALID_NAME;\t/* Reject invalid DBC */\n\t\t\tsfn[i++] = c;\n\t\t\tsfn[i++] = d;\n\t\t} else {\t\t\t\t\t\t/* SBC */\n\t\t\tif (chk_chr(\"\\\"*+,:;<=>\\?[]|\\x7F\", c)) return FR_INVALID_NAME;\t/* Reject illegal chrs for SFN */\n\t\t\tif (IsLower(c)) c -= 0x20;\t/* To upper */\n\t\t\tsfn[i++] = c;\n\t\t}\n\t}\n\t*path = p + si;\t\t\t\t\t\t/* Return pointer to the next segment */\n\tif (i == 0) return FR_INVALID_NAME;\t/* Reject nul string */\n\n\tif (sfn[0] == DDEM) sfn[0] = RDDEM;\t/* If the first character collides with DDEM, replace it with RDDEM */\n\tsfn[NSFLAG] = (c <= ' ') ? NS_LAST : 0;\t\t/* Set last segment flag if end of the path */\n\n\treturn FR_OK;\n#endif /* FF_USE_LFN */\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Follow a file path                                                    */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT follow_path (\t/* FR_OK(0): successful, !=0: error code */\n\tDIR* dp,\t\t\t\t\t/* Directory object to return last directory and found object */\n\tconst TCHAR* path\t\t\t/* Full-path string to find a file or directory */\n)\n{\n\tFRESULT res;\n\tBYTE ns;\n\tFATFS *fs = dp->obj.fs;\n\n\n#if FF_FS_RPATH != 0\n\tif (*path != '/' && *path != '\\\\') {\t/* Without heading separator */\n\t\tdp->obj.sclust = fs->cdir;\t\t\t\t/* Start from current directory */\n\t} else\n#endif\n\t{\t\t\t\t\t\t\t\t\t\t/* With heading separator */\n\t\twhile (*path == '/' || *path == '\\\\') path++;\t/* Strip heading separator */\n\t\tdp->obj.sclust = 0;\t\t\t\t\t/* Start from root directory */\n\t}\n#if FF_FS_EXFAT\n\tdp->obj.n_frag = 0;\t/* Invalidate last fragment counter of the object */\n#if FF_FS_RPATH != 0\n\tif (fs->fs_type == FS_EXFAT && dp->obj.sclust) {\t/* exFAT: Retrieve the sub-directory's status */\n\t\tDIR dj;\n\n\t\tdp->obj.c_scl = fs->cdc_scl;\n\t\tdp->obj.c_size = fs->cdc_size;\n\t\tdp->obj.c_ofs = fs->cdc_ofs;\n\t\tres = load_obj_xdir(&dj, &dp->obj);\n\t\tif (res != FR_OK) return res;\n\t\tdp->obj.objsize = ld_dword(fs->dirbuf + XDIR_FileSize);\n\t\tdp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2;\n\t}\n#endif\n#endif\n\n\tif ((UINT)*path < ' ') {\t\t\t\t/* Null path name is the origin directory itself */\n\t\tdp->fn[NSFLAG] = NS_NONAME;\n\t\tres = dir_sdi(dp, 0);\n\n\t} else {\t\t\t\t\t\t\t\t/* Follow path */\n\t\tfor (;;) {\n\t\t\tres = create_name(dp, &path);\t/* Get a segment name of the path */\n\t\t\tif (res != FR_OK) break;\n\t\t\tres = dir_find(dp);\t\t\t\t/* Find an object with the segment name */\n\t\t\tns = dp->fn[NSFLAG];\n\t\t\tif (res != FR_OK) {\t\t\t\t/* Failed to find the object */\n\t\t\t\tif (res == FR_NO_FILE) {\t/* Object is not found */\n\t\t\t\t\tif (FF_FS_RPATH && (ns & NS_DOT)) {\t/* If dot entry is not exist, stay there */\n\t\t\t\t\t\tif (!(ns & NS_LAST)) continue;\t/* Continue to follow if not last segment */\n\t\t\t\t\t\tdp->fn[NSFLAG] = NS_NONAME;\n\t\t\t\t\t\tres = FR_OK;\n\t\t\t\t\t} else {\t\t\t\t\t\t\t/* Could not find the object */\n\t\t\t\t\t\tif (!(ns & NS_LAST)) res = FR_NO_PATH;\t/* Adjust error code if not last segment */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (ns & NS_LAST) break;\t\t\t/* Last segment matched. Function completed. */\n\t\t\t/* Get into the sub-directory */\n\t\t\tif (!(dp->obj.attr & AM_DIR)) {\t\t/* It is not a sub-directory and cannot follow */\n\t\t\t\tres = FR_NO_PATH; break;\n\t\t\t}\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\t\t/* Save containing directory information for next dir */\n\t\t\t\tdp->obj.c_scl = dp->obj.sclust;\n\t\t\t\tdp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat;\n\t\t\t\tdp->obj.c_ofs = dp->blk_ofs;\n\t\t\t\tinit_alloc_info(fs, &dp->obj);\t/* Open next directory */\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tdp->obj.sclust = ld_clust(fs, fs->win + dp->dptr % SS(fs));\t/* Open next directory */\n\t\t\t}\n\t\t}\n\t}\n\n\treturn res;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Get logical drive number from path name                               */\n/*-----------------------------------------------------------------------*/\n\nstatic int get_ldnumber (\t/* Returns logical drive number (-1:invalid drive number or null pointer) */\n\tconst TCHAR** path\t\t/* Pointer to pointer to the path name */\n)\n{\n\tconst TCHAR *tp, *tt;\n\tTCHAR tc;\n\tint i, vol = -1;\n#if FF_STR_VOLUME_ID\t\t/* Find string volume ID */\n\tconst char *sp;\n\tchar c;\n#endif\n\n\ttt = tp = *path;\n\tif (!tp) return vol;\t/* Invalid path name? */\n\tdo tc = *tt++; while ((UINT)tc >= (FF_USE_LFN ? ' ' : '!') && tc != ':');\t/* Find a colon in the path */\n\n\tif (tc == ':') {\t/* DOS/Windows style volume ID? */\n\t\ti = FF_VOLUMES;\n\t\tif (IsDigit(*tp) && tp + 2 == tt) {\t/* Is there a numeric volume ID + colon? */\n\t\t\ti = (int)*tp - '0';\t/* Get the LD number */\n\t\t}\n#if FF_STR_VOLUME_ID == 1\t/* Arbitrary string is enabled */\n\t\telse {\n\t\t\ti = 0;\n\t\t\tdo {\n\t\t\t\tsp = VolumeStr[i]; tp = *path;\t/* This string volume ID and path name */\n\t\t\t\tdo {\t/* Compare the volume ID with path name */\n\t\t\t\t\tc = *sp++; tc = *tp++;\n\t\t\t\t\tif (IsLower(c)) c -= 0x20;\n\t\t\t\t\tif (IsLower(tc)) tc -= 0x20;\n\t\t\t\t} while (c && (TCHAR)c == tc);\n\t\t\t} while ((c || tp != tt) && ++i < FF_VOLUMES);\t/* Repeat for each id until pattern match */\n\t\t}\n#endif\n\t\tif (i < FF_VOLUMES) {\t/* If a volume ID is found, get the drive number and strip it */\n\t\t\tvol = i;\t\t/* Drive number */\n\t\t\t*path = tt;\t\t/* Snip the drive prefix off */\n\t\t}\n\t\treturn vol;\n\t}\n#if FF_STR_VOLUME_ID == 2\t\t/* Unix style volume ID is enabled */\n\tif (*tp == '/') {\n\t\ti = 0;\n\t\tdo {\n\t\t\tsp = VolumeStr[i]; tp = *path;\t/* This string volume ID and path name */\n\t\t\tdo {\t/* Compare the volume ID with path name */\n\t\t\t\tc = *sp++; tc = *(++tp);\n\t\t\t\tif (IsLower(c)) c -= 0x20;\n\t\t\t\tif (IsLower(tc)) tc -= 0x20;\n\t\t\t} while (c && (TCHAR)c == tc);\n\t\t} while ((c || (tc != '/' && (UINT)tc >= (FF_USE_LFN ? ' ' : '!'))) && ++i < FF_VOLUMES);\t/* Repeat for each ID until pattern match */\n\t\tif (i < FF_VOLUMES) {\t/* If a volume ID is found, get the drive number and strip it */\n\t\t\tvol = i;\t\t/* Drive number */\n\t\t\t*path = tp;\t\t/* Snip the drive prefix off */\n\t\t\treturn vol;\n\t\t}\n\t}\n#endif\n\t/* No drive prefix is found */\n#if FF_FS_RPATH != 0\n\tvol = CurrVol;\t/* Default drive is current drive */\n#else\n\tvol = 0;\t\t/* Default drive is 0 */\n#endif\n\treturn vol;\t\t/* Return the default drive */\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Load a sector and check if it is an FAT VBR                           */\n/*-----------------------------------------------------------------------*/\n\nstatic BYTE check_fs (\t/* 0:FAT, 1:exFAT, 2:Valid BS but not FAT, 3:Not a BS, 4:Disk error */\n\tFATFS* fs,\t\t\t/* Filesystem object */\n\tDWORD sect\t\t\t/* Sector# (lba) to load and check if it is an FAT-VBR or not */\n)\n{\n\tfs->wflag = 0; fs->winsect = 0xFFFFFFFF;\t\t/* Invaidate window */\n\tif (move_window(fs, sect) != FR_OK) return 4;\t/* Load boot record */\n\n\tif (ld_word(fs->win + BS_55AA) != 0xAA55) return 3;\t/* Check boot record signature (always here regardless of the sector size) */\n\n#if FF_FS_EXFAT\n\tif (!mem_cmp(fs->win + BS_JmpBoot, \"\\xEB\\x76\\x90\" \"EXFAT   \", 11)) return 1;\t/* Check if exFAT VBR */\n#endif\n\tif (fs->win[BS_JmpBoot] == 0xE9 || fs->win[BS_JmpBoot] == 0xEB || fs->win[BS_JmpBoot] == 0xE8) {\t/* Valid JumpBoot code? */\n\t\tif (!mem_cmp(fs->win + BS_FilSysType, \"FAT\", 3)) return 0;\t\t/* Is it an FAT VBR? */\n\t\tif (!mem_cmp(fs->win + BS_FilSysType32, \"FAT32\", 5)) return 0;\t/* Is it an FAT32 VBR? */\n\t}\n\treturn 2;\t/* Valid BS but not FAT */\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Determine logical drive number and mount the volume if needed         */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT find_volume (\t/* FR_OK(0): successful, !=0: an error occurred */\n\tconst TCHAR** path,\t\t\t/* Pointer to pointer to the path name (drive number) */\n\tFATFS** rfs,\t\t\t\t/* Pointer to pointer to the found filesystem object */\n\tBYTE mode\t\t\t\t\t/* !=0: Check write protection for write access */\n)\n{\n\tBYTE fmt, *pt;\n\tint vol;\n\tDSTATUS stat;\n\tDWORD bsect, fasize, tsect, sysect, nclst, szbfat, br[4];\n\tWORD nrsv;\n\tFATFS *fs;\n\tUINT i;\n\n\n\t/* Get logical drive number */\n\t*rfs = 0;\n\tvol = get_ldnumber(path);\n\tif (vol < 0) return FR_INVALID_DRIVE;\n\n\t/* Check if the filesystem object is valid or not */\n\tfs = FatFs[vol];\t\t\t\t\t/* Get pointer to the filesystem object */\n\tif (!fs) return FR_NOT_ENABLED;\t\t/* Is the filesystem object available? */\n#if FF_FS_REENTRANT\n\tif (!lock_fs(fs)) return FR_TIMEOUT;\t/* Lock the volume */\n#endif\n\t*rfs = fs;\t\t\t\t\t\t\t/* Return pointer to the filesystem object */\n\n\tmode &= (BYTE)~FA_READ;\t\t\t\t/* Desired access mode, write access or not */\n\tif (fs->fs_type != 0) {\t\t\t\t/* If the volume has been mounted */\n\t\tstat = disk_status(fs->pdrv);\n\t\tif (!(stat & STA_NOINIT)) {\t\t/* and the physical drive is kept initialized */\n\t\t\tif (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) {\t/* Check write protection if needed */\n\t\t\t\treturn FR_WRITE_PROTECTED;\n\t\t\t}\n\t\t\treturn FR_OK;\t\t\t\t/* The filesystem object is valid */\n\t\t}\n\t}\n\n\t/* The filesystem object is not valid. */\n\t/* Following code attempts to mount the volume. (analyze BPB and initialize the filesystem object) */\n\n\tfs->fs_type = 0;\t\t\t\t\t/* Clear the filesystem object */\n\tfs->pdrv = LD2PD(vol);\t\t\t\t/* Bind the logical drive and a physical drive */\n\tstat = disk_initialize(fs->pdrv);\t/* Initialize the physical drive */\n\tif (stat & STA_NOINIT) { \t\t\t/* Check if the initialization succeeded */\n\t\treturn FR_NOT_READY;\t\t\t/* Failed to initialize due to no medium or hard error */\n\t}\n\tif (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */\n\t\treturn FR_WRITE_PROTECTED;\n\t}\n#if FF_MAX_SS != FF_MIN_SS\t\t\t\t/* Get sector size (multiple sector size cfg only) */\n\tif (disk_ioctl(fs->pdrv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK) return FR_DISK_ERR;\n\tif (SS(fs) > FF_MAX_SS || SS(fs) < FF_MIN_SS || (SS(fs) & (SS(fs) - 1))) return FR_DISK_ERR;\n#endif\n\n\t/* Find an FAT partition on the drive. Supports only generic partitioning rules, FDISK and SFD. */\n\tbsect = 0;\n\tfmt = check_fs(fs, bsect);\t\t\t/* Load sector 0 and check if it is an FAT-VBR as SFD */\n\tif (fmt == 2 || (fmt < 2 && LD2PT(vol) != 0)) {\t/* Not an FAT-VBR or forced partition number */\n\t\tfor (i = 0; i < 4; i++) {\t\t/* Get partition offset */\n\t\t\tpt = fs->win + (MBR_Table + i * SZ_PTE);\n\t\t\tbr[i] = pt[PTE_System] ? ld_dword(pt + PTE_StLba) : 0;\n\t\t}\n\t\ti = LD2PT(vol);\t\t\t\t\t/* Partition number: 0:auto, 1-4:forced */\n\t\tif (i != 0) i--;\n\t\tdo {\t\t\t\t\t\t\t/* Find an FAT volume */\n\t\t\tbsect = br[i];\n\t\t\tfmt = bsect ? check_fs(fs, bsect) : 3;\t/* Check the partition */\n\t\t} while (LD2PT(vol) == 0 && fmt >= 2 && ++i < 4);\n\t}\n\tif (fmt == 4) return FR_DISK_ERR;\t\t/* An error occured in the disk I/O layer */\n\tif (fmt >= 2) return FR_NO_FILESYSTEM;\t/* No FAT volume is found */\n\n\t/* An FAT volume is found (bsect). Following code initializes the filesystem object */\n\n#if FF_FS_EXFAT\n\tif (fmt == 1) {\n\t\tQWORD maxlba;\n\n\t\tfor (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && fs->win[i] == 0; i++) ;\t/* Check zero filler */\n\t\tif (i < BPB_ZeroedEx + 53) return FR_NO_FILESYSTEM;\n\n\t\tif (ld_word(fs->win + BPB_FSVerEx) != 0x100) return FR_NO_FILESYSTEM;\t/* Check exFAT version (must be version 1.0) */\n\n\t\tif (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) {\t/* (BPB_BytsPerSecEx must be equal to the physical sector size) */\n\t\t\treturn FR_NO_FILESYSTEM;\n\t\t}\n\n\t\tmaxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect;\t/* Last LBA + 1 of the volume */\n\t\tif (maxlba >= 0x100000000) return FR_NO_FILESYSTEM;\t/* (It cannot be handled in 32-bit LBA) */\n\n\t\tfs->fsize = ld_dword(fs->win + BPB_FatSzEx);\t/* Number of sectors per FAT */\n\n\t\tfs->n_fats = fs->win[BPB_NumFATsEx];\t\t\t/* Number of FATs */\n\t\tif (fs->n_fats != 1) return FR_NO_FILESYSTEM;\t/* (Supports only 1 FAT) */\n\n\t\tfs->csize = 1 << fs->win[BPB_SecPerClusEx];\t\t/* Cluster size */\n\t\tif (fs->csize == 0)\treturn FR_NO_FILESYSTEM;\t/* (Must be 1..32768) */\n\n\t\tnclst = ld_dword(fs->win + BPB_NumClusEx);\t\t/* Number of clusters */\n\t\tif (nclst > MAX_EXFAT) return FR_NO_FILESYSTEM;\t/* (Too many clusters) */\n\t\tfs->n_fatent = nclst + 2;\n\n\t\t/* Boundaries and Limits */\n\t\tfs->volbase = bsect;\n\t\tfs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx);\n\t\tfs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx);\n\t\tif (maxlba < (QWORD)fs->database + nclst * fs->csize) return FR_NO_FILESYSTEM;\t/* (Volume size must not be smaller than the size requiered) */\n\t\tfs->dirbase = ld_dword(fs->win + BPB_RootClusEx);\n\n\t\t/* Check if bitmap location is in assumption (at the first cluster) */\n\t\tif (move_window(fs, clst2sect(fs, fs->dirbase)) != FR_OK) return FR_DISK_ERR;\n\t\tfor (i = 0; i < SS(fs); i += SZDIRE) {\n\t\t\tif (fs->win[i] == 0x81 && ld_dword(fs->win + i + 20) == 2) break;\t/* 81 entry with cluster #2? */\n\t\t}\n\t\tif (i == SS(fs)) return FR_NO_FILESYSTEM;\n#if !FF_FS_READONLY\n\t\tfs->last_clst = fs->free_clst = 0xFFFFFFFF;\t\t/* Initialize cluster allocation information */\n#endif\n\t\tfmt = FS_EXFAT;\t\t\t/* FAT sub-type */\n\t} else\n#endif\t/* FF_FS_EXFAT */\n\t{\n\t\tif (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM;\t/* (BPB_BytsPerSec must be equal to the physical sector size) */\n\n\t\tfasize = ld_word(fs->win + BPB_FATSz16);\t\t/* Number of sectors per FAT */\n\t\tif (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32);\n\t\tfs->fsize = fasize;\n\n\t\tfs->n_fats = fs->win[BPB_NumFATs];\t\t\t\t/* Number of FATs */\n\t\tif (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM;\t/* (Must be 1 or 2) */\n\t\tfasize *= fs->n_fats;\t\t\t\t\t\t\t/* Number of sectors for FAT area */\n\n\t\tfs->csize = fs->win[BPB_SecPerClus];\t\t\t/* Cluster size */\n\t\tif (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM;\t/* (Must be power of 2) */\n\n\t\tfs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt);\t/* Number of root directory entries */\n\t\tif (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM;\t/* (Must be sector aligned) */\n\n\t\ttsect = ld_word(fs->win + BPB_TotSec16);\t\t/* Number of sectors on the volume */\n\t\tif (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32);\n\n\t\tnrsv = ld_word(fs->win + BPB_RsvdSecCnt);\t\t/* Number of reserved sectors */\n\t\tif (nrsv == 0) return FR_NO_FILESYSTEM;\t\t\t/* (Must not be 0) */\n\n\t\t/* Determine the FAT sub type */\n\t\tsysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE);\t/* RSV + FAT + DIR */\n\t\tif (tsect < sysect) return FR_NO_FILESYSTEM;\t/* (Invalid volume size) */\n\t\tnclst = (tsect - sysect) / fs->csize;\t\t\t/* Number of clusters */\n\t\tif (nclst == 0) return FR_NO_FILESYSTEM;\t\t/* (Invalid volume size) */\n\t\tfmt = 0;\n\t\tif (nclst <= MAX_FAT32) fmt = FS_FAT32;\n\t\tif (nclst <= MAX_FAT16) fmt = FS_FAT16;\n\t\tif (nclst <= MAX_FAT12) fmt = FS_FAT12;\n\t\tif (fmt == 0) return FR_NO_FILESYSTEM;\n\n\t\t/* Boundaries and Limits */\n\t\tfs->n_fatent = nclst + 2;\t\t\t\t\t\t/* Number of FAT entries */\n\t\tfs->volbase = bsect;\t\t\t\t\t\t\t/* Volume start sector */\n\t\tfs->fatbase = bsect + nrsv; \t\t\t\t\t/* FAT start sector */\n\t\tfs->database = bsect + sysect;\t\t\t\t\t/* Data start sector */\n\t\tif (fmt == FS_FAT32) {\n\t\t\tif (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM;\t/* (Must be FAT32 revision 0.0) */\n\t\t\tif (fs->n_rootdir != 0) return FR_NO_FILESYSTEM;\t/* (BPB_RootEntCnt must be 0) */\n\t\t\tfs->dirbase = ld_dword(fs->win + BPB_RootClus32);\t/* Root directory start cluster */\n\t\t\tszbfat = fs->n_fatent * 4;\t\t\t\t\t/* (Needed FAT size) */\n\t\t} else {\n\t\t\tif (fs->n_rootdir == 0)\treturn FR_NO_FILESYSTEM;\t/* (BPB_RootEntCnt must not be 0) */\n\t\t\tfs->dirbase = fs->fatbase + fasize;\t\t\t/* Root directory start sector */\n\t\t\tszbfat = (fmt == FS_FAT16) ?\t\t\t\t/* (Needed FAT size) */\n\t\t\t\tfs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1);\n\t\t}\n\t\tif (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM;\t/* (BPB_FATSz must not be less than the size needed) */\n\n#if !FF_FS_READONLY\n\t\t/* Get FSInfo if available */\n\t\tfs->last_clst = fs->free_clst = 0xFFFFFFFF;\t\t/* Initialize cluster allocation information */\n\t\tfs->fsi_flag = 0x80;\n#if (FF_FS_NOFSINFO & 3) != 3\n\t\tif (fmt == FS_FAT32\t\t\t\t/* Allow to update FSInfo only if BPB_FSInfo32 == 1 */\n\t\t\t&& ld_word(fs->win + BPB_FSInfo32) == 1\n\t\t\t&& move_window(fs, bsect + 1) == FR_OK)\n\t\t{\n\t\t\tfs->fsi_flag = 0;\n\t\t\tif (ld_word(fs->win + BS_55AA) == 0xAA55\t/* Load FSInfo data if available */\n\t\t\t\t&& ld_dword(fs->win + FSI_LeadSig) == 0x41615252\n\t\t\t\t&& ld_dword(fs->win + FSI_StrucSig) == 0x61417272)\n\t\t\t{\n#if (FF_FS_NOFSINFO & 1) == 0\n\t\t\t\tfs->free_clst = ld_dword(fs->win + FSI_Free_Count);\n#endif\n#if (FF_FS_NOFSINFO & 2) == 0\n\t\t\t\tfs->last_clst = ld_dword(fs->win + FSI_Nxt_Free);\n#endif\n\t\t\t}\n\t\t}\n#endif\t/* (FF_FS_NOFSINFO & 3) != 3 */\n#endif\t/* !FF_FS_READONLY */\n\t}\n\n\tfs->fs_type = fmt;\t\t/* FAT sub-type */\n\tfs->id = ++Fsid;\t\t/* Volume mount ID */\n#if FF_USE_LFN == 1\n\tfs->lfnbuf = LfnBuf;\t/* Static LFN working buffer */\n#if FF_FS_EXFAT\n\tfs->dirbuf = DirBuf;\t/* Static directory block scratchpad buuffer */\n#endif\n#endif\n#if FF_FS_RPATH != 0\n\tfs->cdir = 0;\t\t\t/* Initialize current directory */\n#endif\n#if FF_FS_LOCK != 0\t\t\t/* Clear file lock semaphores */\n\tclear_lock(fs);\n#endif\n\treturn FR_OK;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Check if the file/directory object is valid or not                    */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT validate (\t/* Returns FR_OK or FR_INVALID_OBJECT */\n\tFFOBJID* obj,\t\t\t/* Pointer to the FFOBJID, the 1st member in the FIL/DIR object, to check validity */\n\tFATFS** rfs\t\t\t\t/* Pointer to pointer to the owner filesystem object to return */\n)\n{\n\tFRESULT res = FR_INVALID_OBJECT;\n\n\n\tif (obj && obj->fs && obj->fs->fs_type && obj->id == obj->fs->id) {\t/* Test if the object is valid */\n#if FF_FS_REENTRANT\n\t\tif (lock_fs(obj->fs)) {\t/* Obtain the filesystem object */\n\t\t\tif (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */\n\t\t\t\tres = FR_OK;\n\t\t\t} else {\n\t\t\t\tunlock_fs(obj->fs, FR_OK);\n\t\t\t}\n\t\t} else {\n\t\t\tres = FR_TIMEOUT;\n\t\t}\n#else\n\t\tif (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the phsical drive is kept initialized */\n\t\t\tres = FR_OK;\n\t\t}\n#endif\n\t}\n\t*rfs = (res == FR_OK) ? obj->fs : 0;\t/* Corresponding filesystem object */\n\treturn res;\n}\n\n\n\n\n/*---------------------------------------------------------------------------\n\n   Public Functions (FatFs API)\n\n----------------------------------------------------------------------------*/\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Mount/Unmount a Logical Drive                                         */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_mount (\n\tFATFS* fs,\t\t\t/* Pointer to the filesystem object (NULL:unmount)*/\n\tconst TCHAR* path,\t/* Logical drive number to be mounted/unmounted */\n\tBYTE opt\t\t\t/* Mode option 0:Do not mount (delayed mount), 1:Mount immediately */\n)\n{\n\tFATFS *cfs;\n\tint vol;\n\tFRESULT res;\n\tconst TCHAR *rp = path;\n\n\n\t/* Get logical drive number */\n\tvol = get_ldnumber(&rp);\n\tif (vol < 0) return FR_INVALID_DRIVE;\n\tcfs = FatFs[vol];\t\t\t\t\t/* Pointer to fs object */\n\n\tif (cfs) {\n#if FF_FS_LOCK != 0\n\t\tclear_lock(cfs);\n#endif\n#if FF_FS_REENTRANT\t\t\t\t\t\t/* Discard sync object of the current volume */\n\t\tif (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR;\n#endif\n\t\tcfs->fs_type = 0;\t\t\t\t/* Clear old fs object */\n\t}\n\n\tif (fs) {\n\t\tfs->fs_type = 0;\t\t\t\t/* Clear new fs object */\n#if FF_FS_REENTRANT\t\t\t\t\t\t/* Create sync object for the new volume */\n\t\tif (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR;\n#endif\n\t}\n\tFatFs[vol] = fs;\t\t\t\t\t/* Register new fs object */\n\n\tif (opt == 0) return FR_OK;\t\t\t/* Do not mount now, it will be mounted later */\n\n\tres = find_volume(&path, &fs, 0);\t/* Force mounted the volume */\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Open or Create a File                                                 */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_open (\n\tFIL* fp,\t\t\t/* Pointer to the blank file object */\n\tconst TCHAR* path,\t/* Pointer to the file name */\n\tBYTE mode\t\t\t/* Access mode and file open mode flags */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n#if !FF_FS_READONLY\n\tDWORD dw, cl, bcs, clst, sc;\n\tFSIZE_t ofs;\n#endif\n\tDEF_NAMBUF\n\n\n\tif (!fp) return FR_INVALID_OBJECT;\n\n\t/* Get logical drive number */\n\tmode &= FF_FS_READONLY ? FA_READ : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_CREATE_NEW | FA_OPEN_ALWAYS | FA_OPEN_APPEND;\n\tres = find_volume(&path, &fs, mode);\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t/* Follow the file path */\n#if !FF_FS_READONLY\t/* Read/Write configuration */\n\t\tif (res == FR_OK) {\n\t\t\tif (dj.fn[NSFLAG] & NS_NONAME) {\t/* Origin directory itself? */\n\t\t\t\tres = FR_INVALID_NAME;\n\t\t\t}\n#if FF_FS_LOCK != 0\n\t\t\telse {\n\t\t\t\tres = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0);\t\t/* Check if the file can be used */\n\t\t\t}\n#endif\n\t\t}\n\t\t/* Create or Open a file */\n\t\tif (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) {\n\t\t\tif (res != FR_OK) {\t\t\t\t\t/* No file, create new */\n\t\t\t\tif (res == FR_NO_FILE) {\t\t/* There is no file to open, create a new entry */\n#if FF_FS_LOCK != 0\n\t\t\t\t\tres = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES;\n#else\n\t\t\t\t\tres = dir_register(&dj);\n#endif\n\t\t\t\t}\n\t\t\t\tmode |= FA_CREATE_ALWAYS;\t\t/* File is created */\n\t\t\t}\n\t\t\telse {\t\t\t\t\t\t\t\t/* Any object with the same name is already existing */\n\t\t\t\tif (dj.obj.attr & (AM_RDO | AM_DIR)) {\t/* Cannot overwrite it (R/O or DIR) */\n\t\t\t\t\tres = FR_DENIED;\n\t\t\t\t} else {\n\t\t\t\t\tif (mode & FA_CREATE_NEW) res = FR_EXIST;\t/* Cannot create as new file */\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK && (mode & FA_CREATE_ALWAYS)) {\t/* Truncate the file if overwrite mode */\n#if FF_FS_EXFAT\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\t/* Get current allocation info */\n\t\t\t\t\tfp->obj.fs = fs;\n\t\t\t\t\tinit_alloc_info(fs, &fp->obj);\n\t\t\t\t\t/* Set directory entry block initial state */\n\t\t\t\t\tmem_set(fs->dirbuf + 2, 0, 30);\t\t/* Clear 85 entry except for NumSec */\n\t\t\t\t\tmem_set(fs->dirbuf + 38, 0, 26);\t/* Clear C0 entry except for NumName and NameHash */\n\t\t\t\t\tfs->dirbuf[XDIR_Attr] = AM_ARC;\n\t\t\t\t\tst_dword(fs->dirbuf + XDIR_CrtTime, GET_FATTIME());\n\t\t\t\t\tfs->dirbuf[XDIR_GenFlags] = 1;\n\t\t\t\t\tres = store_xdir(&dj);\n\t\t\t\t\tif (res == FR_OK && fp->obj.sclust != 0) {\t/* Remove the cluster chain if exist */\n\t\t\t\t\t\tres = remove_chain(&fp->obj, fp->obj.sclust, 0);\n\t\t\t\t\t\tfs->last_clst = fp->obj.sclust - 1;\t\t/* Reuse the cluster hole */\n\t\t\t\t\t}\n\t\t\t\t} else\n#endif\n\t\t\t\t{\n\t\t\t\t\t/* Set directory entry initial state */\n\t\t\t\t\tcl = ld_clust(fs, dj.dir);\t\t\t/* Get current cluster chain */\n\t\t\t\t\tst_dword(dj.dir + DIR_CrtTime, GET_FATTIME());\t/* Set created time */\n\t\t\t\t\tdj.dir[DIR_Attr] = AM_ARC;\t\t\t/* Reset attribute */\n\t\t\t\t\tst_clust(fs, dj.dir, 0);\t\t\t/* Reset file allocation info */\n\t\t\t\t\tst_dword(dj.dir + DIR_FileSize, 0);\n\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\tif (cl != 0) {\t\t\t\t\t\t/* Remove the cluster chain if exist */\n\t\t\t\t\t\tdw = fs->winsect;\n\t\t\t\t\t\tres = remove_chain(&dj.obj, cl, 0);\n\t\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\t\tres = move_window(fs, dw);\n\t\t\t\t\t\t\tfs->last_clst = cl - 1;\t\t/* Reuse the cluster hole */\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\t/* Open an existing file */\n\t\t\tif (res == FR_OK) {\t\t\t\t\t/* Is the object exsiting? */\n\t\t\t\tif (dj.obj.attr & AM_DIR) {\t\t/* File open against a directory */\n\t\t\t\t\tres = FR_NO_FILE;\n\t\t\t\t} else {\n\t\t\t\t\tif ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { /* Write mode open against R/O file */\n\t\t\t\t\t\tres = FR_DENIED;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (res == FR_OK) {\n\t\t\tif (mode & FA_CREATE_ALWAYS) mode |= FA_MODIFIED;\t/* Set file change flag if created or overwritten */\n\t\t\tfp->dir_sect = fs->winsect;\t\t\t/* Pointer to the directory entry */\n\t\t\tfp->dir_ptr = dj.dir;\n#if FF_FS_LOCK != 0\n\t\t\tfp->obj.lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0);\t/* Lock the file for this session */\n\t\t\tif (fp->obj.lockid == 0) res = FR_INT_ERR;\n#endif\n\t\t}\n#else\t\t/* R/O configuration */\n\t\tif (res == FR_OK) {\n\t\t\tif (dj.fn[NSFLAG] & NS_NONAME) {\t/* Is it origin directory itself? */\n\t\t\t\tres = FR_INVALID_NAME;\n\t\t\t} else {\n\t\t\t\tif (dj.obj.attr & AM_DIR) {\t\t/* Is it a directory? */\n\t\t\t\t\tres = FR_NO_FILE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif\n\n\t\tif (res == FR_OK) {\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\tfp->obj.c_scl = dj.obj.sclust;\t\t\t\t\t\t\t/* Get containing directory info */\n\t\t\t\tfp->obj.c_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat;\n\t\t\t\tfp->obj.c_ofs = dj.blk_ofs;\n\t\t\t\tinit_alloc_info(fs, &fp->obj);\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tfp->obj.sclust = ld_clust(fs, dj.dir);\t\t\t\t\t/* Get object allocation info */\n\t\t\t\tfp->obj.objsize = ld_dword(dj.dir + DIR_FileSize);\n\t\t\t}\n#if FF_USE_FASTSEEK\n\t\t\tfp->cltbl = 0;\t\t\t/* Disable fast seek mode */\n#endif\n\t\t\tfp->obj.fs = fs;\t \t/* Validate the file object */\n\t\t\tfp->obj.id = fs->id;\n\t\t\tfp->flag = mode;\t\t/* Set file access mode */\n\t\t\tfp->err = 0;\t\t\t/* Clear error flag */\n\t\t\tfp->sect = 0;\t\t\t/* Invalidate current data sector */\n\t\t\tfp->fptr = 0;\t\t\t/* Set file pointer top of the file */\n#if !FF_FS_READONLY\n#if !FF_FS_TINY\n\t\t\tmem_set(fp->buf, 0, FF_MAX_SS);\t/* Clear sector buffer */\n#endif\n\t\t\tif ((mode & FA_SEEKEND) && fp->obj.objsize > 0) {\t/* Seek to end of file if FA_OPEN_APPEND is specified */\n\t\t\t\tfp->fptr = fp->obj.objsize;\t\t\t/* Offset to seek */\n\t\t\t\tbcs = (DWORD)fs->csize * SS(fs);\t/* Cluster size in byte */\n\t\t\t\tclst = fp->obj.sclust;\t\t\t\t/* Follow the cluster chain */\n\t\t\t\tfor (ofs = fp->obj.objsize; res == FR_OK && ofs > bcs; ofs -= bcs) {\n\t\t\t\t\tclst = get_fat(&fp->obj, clst);\n\t\t\t\t\tif (clst <= 1) res = FR_INT_ERR;\n\t\t\t\t\tif (clst == 0xFFFFFFFF) res = FR_DISK_ERR;\n\t\t\t\t}\n\t\t\t\tfp->clust = clst;\n\t\t\t\tif (res == FR_OK && ofs % SS(fs)) {\t/* Fill sector buffer if not on the sector boundary */\n\t\t\t\t\tif ((sc = clst2sect(fs, clst)) == 0) {\n\t\t\t\t\t\tres = FR_INT_ERR;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfp->sect = sc + (DWORD)(ofs / SS(fs));\n#if !FF_FS_TINY\n\t\t\t\t\t\tif (disk_read(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) res = FR_DISK_ERR;\n#endif\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t}\n\n\t\tFREE_NAMBUF();\n\t}\n\n\tif (res != FR_OK) fp->obj.fs = 0;\t/* Invalidate file object on error */\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Read File                                                             */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_read (\n\tFIL* fp, \t/* Pointer to the file object */\n\tvoid* buff,\t/* Pointer to data buffer */\n\tUINT btr,\t/* Number of bytes to read */\n\tUINT* br\t/* Pointer to number of bytes read */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD clst, sect;\n\tFSIZE_t remain;\n\tUINT rcnt, cc, csect;\n\tBYTE *rbuff = (BYTE*)buff;\n\n\n\t*br = 0;\t/* Clear read byte counter */\n\tres = validate(&fp->obj, &fs);\t\t\t\t/* Check validity of the file object */\n\tif (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);\t/* Check validity */\n\tif (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */\n\tremain = fp->obj.objsize - fp->fptr;\n\tif (btr > remain) btr = (UINT)remain;\t\t/* Truncate btr by remaining bytes */\n\n\tfor ( ;  btr;\t\t\t\t\t\t\t\t/* Repeat until btr bytes read */\n\t\tbtr -= rcnt, *br += rcnt, rbuff += rcnt, fp->fptr += rcnt) {\n\t\tif (fp->fptr % SS(fs) == 0) {\t\t\t/* On the sector boundary? */\n\t\t\tcsect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1));\t/* Sector offset in the cluster */\n\t\t\tif (csect == 0) {\t\t\t\t\t/* On the cluster boundary? */\n\t\t\t\tif (fp->fptr == 0) {\t\t\t/* On the top of the file? */\n\t\t\t\t\tclst = fp->obj.sclust;\t\t/* Follow cluster chain from the origin */\n\t\t\t\t} else {\t\t\t\t\t\t/* Middle or end of the file */\n#if FF_USE_FASTSEEK\n\t\t\t\t\tif (fp->cltbl) {\n\t\t\t\t\t\tclst = clmt_clust(fp, fp->fptr);\t/* Get cluster# from the CLMT */\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tclst = get_fat(&fp->obj, fp->clust);\t/* Follow cluster chain on the FAT */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (clst < 2) ABORT(fs, FR_INT_ERR);\n\t\t\t\tif (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->clust = clst;\t\t\t\t/* Update current cluster */\n\t\t\t}\n\t\t\tsect = clst2sect(fs, fp->clust);\t/* Get current sector */\n\t\t\tif (sect == 0) ABORT(fs, FR_INT_ERR);\n\t\t\tsect += csect;\n\t\t\tcc = btr / SS(fs);\t\t\t\t\t/* When remaining bytes >= sector size, */\n\t\t\tif (cc > 0) {\t\t\t\t\t\t/* Read maximum contiguous sectors directly */\n\t\t\t\tif (csect + cc > fs->csize) {\t/* Clip at cluster boundary */\n\t\t\t\t\tcc = fs->csize - csect;\n\t\t\t\t}\n\t\t\t\tif (disk_read(fs->pdrv, rbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR);\n#if !FF_FS_READONLY && FF_FS_MINIMIZE <= 2\t\t/* Replace one of the read sectors with cached data if it contains a dirty sector */\n#if FF_FS_TINY\n\t\t\t\tif (fs->wflag && fs->winsect - sect < cc) {\n\t\t\t\t\tmem_cpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, SS(fs));\n\t\t\t\t}\n#else\n\t\t\t\tif ((fp->flag & FA_DIRTY) && fp->sect - sect < cc) {\n\t\t\t\t\tmem_cpy(rbuff + ((fp->sect - sect) * SS(fs)), fp->buf, SS(fs));\n\t\t\t\t}\n#endif\n#endif\n\t\t\t\trcnt = SS(fs) * cc;\t\t\t\t/* Number of bytes transferred */\n\t\t\t\tcontinue;\n\t\t\t}\n#if !FF_FS_TINY\n\t\t\tif (fp->sect != sect) {\t\t\t/* Load data sector if not in cache */\n#if !FF_FS_READONLY\n\t\t\t\tif (fp->flag & FA_DIRTY) {\t\t/* Write-back dirty sector cache */\n\t\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t\t}\n#endif\n\t\t\t\tif (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK)\tABORT(fs, FR_DISK_ERR);\t/* Fill sector cache */\n\t\t\t}\n#endif\n\t\t\tfp->sect = sect;\n\t\t}\n\t\trcnt = SS(fs) - (UINT)fp->fptr % SS(fs);\t/* Number of bytes left in the sector */\n\t\tif (rcnt > btr) rcnt = btr;\t\t\t\t\t/* Clip it by btr if needed */\n#if FF_FS_TINY\n\t\tif (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR);\t/* Move sector window */\n\t\tmem_cpy(rbuff, fs->win + fp->fptr % SS(fs), rcnt);\t/* Extract partial sector */\n#else\n\t\tmem_cpy(rbuff, fp->buf + fp->fptr % SS(fs), rcnt);\t/* Extract partial sector */\n#endif\n\t}\n\n\tLEAVE_FF(fs, FR_OK);\n}\n\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Write File                                                            */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_write (\n\tFIL* fp,\t\t\t/* Pointer to the file object */\n\tconst void* buff,\t/* Pointer to the data to be written */\n\tUINT btw,\t\t\t/* Number of bytes to write */\n\tUINT* bw\t\t\t/* Pointer to number of bytes written */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD clst, sect;\n\tUINT wcnt, cc, csect;\n\tconst BYTE *wbuff = (const BYTE*)buff;\n\n\n\t*bw = 0;\t/* Clear write byte counter */\n\tres = validate(&fp->obj, &fs);\t\t\t/* Check validity of the file object */\n\tif (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);\t/* Check validity */\n\tif (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED);\t/* Check access mode */\n\n\t/* Check fptr wrap-around (file size cannot reach 4 GiB at FAT volume) */\n\tif ((!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) && (DWORD)(fp->fptr + btw) < (DWORD)fp->fptr) {\n\t\tbtw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr);\n\t}\n\n\tfor ( ;  btw;\t\t\t\t\t\t\t/* Repeat until all data written */\n\t\tbtw -= wcnt, *bw += wcnt, wbuff += wcnt, fp->fptr += wcnt, fp->obj.objsize = (fp->fptr > fp->obj.objsize) ? fp->fptr : fp->obj.objsize) {\n\t\tif (fp->fptr % SS(fs) == 0) {\t\t/* On the sector boundary? */\n\t\t\tcsect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1);\t/* Sector offset in the cluster */\n\t\t\tif (csect == 0) {\t\t\t\t/* On the cluster boundary? */\n\t\t\t\tif (fp->fptr == 0) {\t\t/* On the top of the file? */\n\t\t\t\t\tclst = fp->obj.sclust;\t/* Follow from the origin */\n\t\t\t\t\tif (clst == 0) {\t\t/* If no cluster is allocated, */\n\t\t\t\t\t\tclst = create_chain(&fp->obj, 0);\t/* create a new cluster chain */\n\t\t\t\t\t}\n\t\t\t\t} else {\t\t\t\t\t/* On the middle or end of the file */\n#if FF_USE_FASTSEEK\n\t\t\t\t\tif (fp->cltbl) {\n\t\t\t\t\t\tclst = clmt_clust(fp, fp->fptr);\t/* Get cluster# from the CLMT */\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tclst = create_chain(&fp->obj, fp->clust);\t/* Follow or stretch cluster chain on the FAT */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (clst == 0) break;\t\t/* Could not allocate a new cluster (disk full) */\n\t\t\t\tif (clst == 1) ABORT(fs, FR_INT_ERR);\n\t\t\t\tif (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->clust = clst;\t\t\t/* Update current cluster */\n\t\t\t\tif (fp->obj.sclust == 0) fp->obj.sclust = clst;\t/* Set start cluster if the first write */\n\t\t\t}\n#if FF_FS_TINY\n\t\t\tif (fs->winsect == fp->sect && sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR);\t/* Write-back sector cache */\n#else\n\t\t\tif (fp->flag & FA_DIRTY) {\t\t/* Write-back sector cache */\n\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t}\n#endif\n\t\t\tsect = clst2sect(fs, fp->clust);\t/* Get current sector */\n\t\t\tif (sect == 0) ABORT(fs, FR_INT_ERR);\n\t\t\tsect += csect;\n\t\t\tcc = btw / SS(fs);\t\t\t\t/* When remaining bytes >= sector size, */\n\t\t\tif (cc > 0) {\t\t\t\t\t/* Write maximum contiguous sectors directly */\n\t\t\t\tif (csect + cc > fs->csize) {\t/* Clip at cluster boundary */\n\t\t\t\t\tcc = fs->csize - csect;\n\t\t\t\t}\n\t\t\t\tif (disk_write(fs->pdrv, wbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR);\n#if FF_FS_MINIMIZE <= 2\n#if FF_FS_TINY\n\t\t\t\tif (fs->winsect - sect < cc) {\t/* Refill sector cache if it gets invalidated by the direct write */\n\t\t\t\t\tmem_cpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), SS(fs));\n\t\t\t\t\tfs->wflag = 0;\n\t\t\t\t}\n#else\n\t\t\t\tif (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */\n\t\t\t\t\tmem_cpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs));\n\t\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t\t}\n#endif\n#endif\n\t\t\t\twcnt = SS(fs) * cc;\t\t/* Number of bytes transferred */\n\t\t\t\tcontinue;\n\t\t\t}\n#if FF_FS_TINY\n\t\t\tif (fp->fptr >= fp->obj.objsize) {\t/* Avoid silly cache filling on the growing edge */\n\t\t\t\tif (sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfs->winsect = sect;\n\t\t\t}\n#else\n\t\t\tif (fp->sect != sect && \t\t/* Fill sector cache with file data */\n\t\t\t\tfp->fptr < fp->obj.objsize &&\n\t\t\t\tdisk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) {\n\t\t\t\t\tABORT(fs, FR_DISK_ERR);\n\t\t\t}\n#endif\n\t\t\tfp->sect = sect;\n\t\t}\n\t\twcnt = SS(fs) - (UINT)fp->fptr % SS(fs);\t/* Number of bytes left in the sector */\n\t\tif (wcnt > btw) wcnt = btw;\t\t\t\t\t/* Clip it by btw if needed */\n#if FF_FS_TINY\n\t\tif (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR);\t/* Move sector window */\n\t\tmem_cpy(fs->win + fp->fptr % SS(fs), wbuff, wcnt);\t/* Fit data to the sector */\n\t\tfs->wflag = 1;\n#else\n\t\tmem_cpy(fp->buf + fp->fptr % SS(fs), wbuff, wcnt);\t/* Fit data to the sector */\n\t\tfp->flag |= FA_DIRTY;\n#endif\n\t}\n\n\tfp->flag |= FA_MODIFIED;\t\t\t\t/* Set file change flag */\n\n\tLEAVE_FF(fs, FR_OK);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Synchronize the File                                                  */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_sync (\n\tFIL* fp\t\t/* Pointer to the file object */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD tm;\n\tBYTE *dir;\n\n\n\tres = validate(&fp->obj, &fs);\t/* Check validity of the file object */\n\tif (res == FR_OK) {\n\t\tif (fp->flag & FA_MODIFIED) {\t/* Is there any change to the file? */\n#if !FF_FS_TINY\n\t\t\tif (fp->flag & FA_DIRTY) {\t/* Write-back cached data if needed */\n\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) LEAVE_FF(fs, FR_DISK_ERR);\n\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t}\n#endif\n\t\t\t/* Update the directory entry */\n\t\t\ttm = GET_FATTIME();\t\t\t\t/* Modified time */\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\tres = fill_first_frag(&fp->obj);\t/* Fill first fragment on the FAT if needed */\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tres = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF);\t/* Fill last fragment on the FAT if needed */\n\t\t\t\t}\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tDIR dj;\n\t\t\t\t\tDEF_NAMBUF\n\n\t\t\t\t\tINIT_NAMBUF(fs);\n\t\t\t\t\tres = load_obj_xdir(&dj, &fp->obj);\t/* Load directory entry block */\n\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\tfs->dirbuf[XDIR_Attr] |= AM_ARC;\t\t\t\t/* Set archive attribute to indicate that the file has been changed */\n\t\t\t\t\t\tfs->dirbuf[XDIR_GenFlags] = fp->obj.stat | 1;\t/* Update file allocation information */\n\t\t\t\t\t\tst_dword(fs->dirbuf + XDIR_FstClus, fp->obj.sclust);\n\t\t\t\t\t\tst_qword(fs->dirbuf + XDIR_FileSize, fp->obj.objsize);\n\t\t\t\t\t\tst_qword(fs->dirbuf + XDIR_ValidFileSize, fp->obj.objsize);\n\t\t\t\t\t\tst_dword(fs->dirbuf + XDIR_ModTime, tm);\t\t/* Update modified time */\n\t\t\t\t\t\tfs->dirbuf[XDIR_ModTime10] = 0;\n\t\t\t\t\t\tst_dword(fs->dirbuf + XDIR_AccTime, 0);\n\t\t\t\t\t\tres = store_xdir(&dj);\t/* Restore it to the directory */\n\t\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\t\tres = sync_fs(fs);\n\t\t\t\t\t\t\tfp->flag &= (BYTE)~FA_MODIFIED;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tFREE_NAMBUF();\n\t\t\t\t}\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tres = move_window(fs, fp->dir_sect);\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tdir = fp->dir_ptr;\n\t\t\t\t\tdir[DIR_Attr] |= AM_ARC;\t\t\t\t\t\t/* Set archive attribute to indicate that the file has been changed */\n\t\t\t\t\tst_clust(fp->obj.fs, dir, fp->obj.sclust);\t\t/* Update file allocation information  */\n\t\t\t\t\tst_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize);\t/* Update file size */\n\t\t\t\t\tst_dword(dir + DIR_ModTime, tm);\t\t\t\t/* Update modified time */\n\t\t\t\t\tst_word(dir + DIR_LstAccDate, 0);\n\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\tres = sync_fs(fs);\t\t\t\t\t/* Restore it to the directory */\n\t\t\t\t\tfp->flag &= (BYTE)~FA_MODIFIED;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n#endif /* !FF_FS_READONLY */\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Close File                                                            */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_close (\n\tFIL* fp\t\t/* Pointer to the file object to be closed */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\n#if !FF_FS_READONLY\n\tres = f_sync(fp);\t\t\t\t\t/* Flush cached data */\n\tif (res == FR_OK)\n#endif\n\t{\n\t\tres = validate(&fp->obj, &fs);\t/* Lock volume */\n\t\tif (res == FR_OK) {\n#if FF_FS_LOCK != 0\n\t\t\tres = dec_lock(fp->obj.lockid);\t\t/* Decrement file open counter */\n\t\t\tif (res == FR_OK) fp->obj.fs = 0;\t/* Invalidate file object */\n#else\n\t\t\tfp->obj.fs = 0;\t/* Invalidate file object */\n#endif\n#if FF_FS_REENTRANT\n\t\t\tunlock_fs(fs, FR_OK);\t\t/* Unlock volume */\n#endif\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n#if FF_FS_RPATH >= 1\n/*-----------------------------------------------------------------------*/\n/* Change Current Directory or Current Drive, Get Current Directory      */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_chdrive (\n\tconst TCHAR* path\t\t/* Drive number to set */\n)\n{\n\tint vol;\n\n\n\t/* Get logical drive number */\n\tvol = get_ldnumber(&path);\n\tif (vol < 0) return FR_INVALID_DRIVE;\n\tCurrVol = (BYTE)vol;\t/* Set it as current volume */\n\n\treturn FR_OK;\n}\n\n\n\nFRESULT f_chdir (\n\tconst TCHAR* path\t/* Pointer to the directory path */\n)\n{\n#if FF_STR_VOLUME_ID == 2\n\tUINT i;\n#endif\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n\tDEF_NAMBUF\n\n\n\t/* Get logical drive */\n\tres = find_volume(&path, &fs, 0);\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t\t/* Follow the path */\n\t\tif (res == FR_OK) {\t\t\t\t\t/* Follow completed */\n\t\t\tif (dj.fn[NSFLAG] & NS_NONAME) {\t/* Is it the start directory itself? */\n\t\t\t\tfs->cdir = dj.obj.sclust;\n#if FF_FS_EXFAT\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\tfs->cdc_scl = dj.obj.c_scl;\n\t\t\t\t\tfs->cdc_size = dj.obj.c_size;\n\t\t\t\t\tfs->cdc_ofs = dj.obj.c_ofs;\n\t\t\t\t}\n#endif\n\t\t\t} else {\n\t\t\t\tif (dj.obj.attr & AM_DIR) {\t/* It is a sub-directory */\n#if FF_FS_EXFAT\n\t\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\t\tfs->cdir = ld_dword(fs->dirbuf + XDIR_FstClus);\t\t/* Sub-directory cluster */\n\t\t\t\t\t\tfs->cdc_scl = dj.obj.sclust;\t\t\t\t\t\t/* Save containing directory information */\n\t\t\t\t\t\tfs->cdc_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat;\n\t\t\t\t\t\tfs->cdc_ofs = dj.blk_ofs;\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tfs->cdir = ld_clust(fs, dj.dir);\t\t\t\t\t/* Sub-directory cluster */\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tres = FR_NO_PATH;\t\t/* Reached but a file */\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t\tif (res == FR_NO_FILE) res = FR_NO_PATH;\n#if FF_STR_VOLUME_ID == 2\t/* Also current drive is changed at Unix style volume ID */\n\t\tif (res == FR_OK) {\n\t\t\tfor (i = FF_VOLUMES - 1; i && fs != FatFs[i]; i--) ;\t/* Set current drive */\n\t\t\tCurrVol = (BYTE)i;\n\t\t}\n#endif\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n#if FF_FS_RPATH >= 2\nFRESULT f_getcwd (\n\tTCHAR* buff,\t/* Pointer to the directory path */\n\tUINT len\t\t/* Size of buff in unit of TCHAR */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n\tUINT i, n;\n\tDWORD ccl;\n\tTCHAR *tp = buff;\n#if FF_VOLUMES >= 2\n\tUINT vl;\n#endif\n#if FF_STR_VOLUME_ID\n\tconst char *vp;\n#endif\n\tFILINFO fno;\n\tDEF_NAMBUF\n\n\n\t/* Get logical drive */\n\tres = find_volume((const TCHAR**)&buff, &fs, 0);\t/* Get current volume */\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\n\t\t/* Follow parent directories and create the path */\n\t\ti = len;\t\t\t/* Bottom of buffer (directory stack base) */\n\t\tif (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) {\t/* (Cannot do getcwd on exFAT and returns root path) */\n\t\t\tdj.obj.sclust = fs->cdir;\t\t\t\t/* Start to follow upper directory from current directory */\n\t\t\twhile ((ccl = dj.obj.sclust) != 0) {\t/* Repeat while current directory is a sub-directory */\n\t\t\t\tres = dir_sdi(&dj, 1 * SZDIRE);\t/* Get parent directory */\n\t\t\t\tif (res != FR_OK) break;\n\t\t\t\tres = move_window(fs, dj.sect);\n\t\t\t\tif (res != FR_OK) break;\n\t\t\t\tdj.obj.sclust = ld_clust(fs, dj.dir);\t/* Goto parent directory */\n\t\t\t\tres = dir_sdi(&dj, 0);\n\t\t\t\tif (res != FR_OK) break;\n\t\t\t\tdo {\t\t\t\t\t\t\t/* Find the entry links to the child directory */\n\t\t\t\t\tres = dir_read_file(&dj);\n\t\t\t\t\tif (res != FR_OK) break;\n\t\t\t\t\tif (ccl == ld_clust(fs, dj.dir)) break;\t/* Found the entry */\n\t\t\t\t\tres = dir_next(&dj, 0);\n\t\t\t\t} while (res == FR_OK);\n\t\t\t\tif (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */\n\t\t\t\tif (res != FR_OK) break;\n\t\t\t\tget_fileinfo(&dj, &fno);\t\t/* Get the directory name and push it to the buffer */\n\t\t\t\tfor (n = 0; fno.fname[n]; n++) ;\t/* Name length */\n\t\t\t\tif (i < n + 1) {\t/* Insufficient space to store the path name? */\n\t\t\t\t\tres = FR_NOT_ENOUGH_CORE; break;\n\t\t\t\t}\n\t\t\t\twhile (n) buff[--i] = fno.fname[--n];\t/* Stack the name */\n\t\t\t\tbuff[--i] = '/';\n\t\t\t}\n\t\t}\n\t\tif (res == FR_OK) {\n\t\t\tif (i == len) buff[--i] = '/';\t/* Is it the root-directory? */\n#if FF_VOLUMES >= 2\t\t\t/* Put drive prefix */\n\t\t\tvl = 0;\n#if FF_STR_VOLUME_ID >= 1\t/* String volume ID */\n\t\t\tfor (n = 0, vp = (const char*)VolumeStr[CurrVol]; vp[n]; n++) ;\n\t\t\tif (i >= n + 2) {\n\t\t\t\tif (FF_STR_VOLUME_ID == 2) *tp++ = (TCHAR)'/';\n\t\t\t\tfor (vl = 0; vl < n; *tp++ = (TCHAR)vp[vl], vl++) ;\n\t\t\t\tif (FF_STR_VOLUME_ID == 1) *tp++ = (TCHAR)':';\n\t\t\t\tvl++;\n\t\t\t}\n#else\t\t\t\t\t\t/* Numeric volume ID */\n\t\t\tif (i >= 3) {\n\t\t\t\t*tp++ = (TCHAR)'0' + CurrVol;\n\t\t\t\t*tp++ = (TCHAR)':';\n\t\t\t\tvl = 2;\n\t\t\t}\n#endif\n\t\t\tif (vl == 0) res = FR_NOT_ENOUGH_CORE;\n#endif\n\t\t\t/* Add current directory path */\n\t\t\tif (res == FR_OK) {\n\t\t\t\tdo *tp++ = buff[i++]; while (i < len);\t/* Copy stacked path string */\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\t*tp = 0;\n\tLEAVE_FF(fs, res);\n}\n\n#endif /* FF_FS_RPATH >= 2 */\n#endif /* FF_FS_RPATH >= 1 */\n\n\n\n#if FF_FS_MINIMIZE <= 2\n/*-----------------------------------------------------------------------*/\n/* Seek File Read/Write Pointer                                          */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_lseek (\n\tFIL* fp,\t\t/* Pointer to the file object */\n\tFSIZE_t ofs\t\t/* File pointer from top of file */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD clst, bcs, nsect;\n\tFSIZE_t ifptr;\n#if FF_USE_FASTSEEK\n\tDWORD cl, pcl, ncl, tcl, dsc, tlen, ulen, *tbl;\n#endif\n\n\tres = validate(&fp->obj, &fs);\t\t/* Check validity of the file object */\n\tif (res == FR_OK) res = (FRESULT)fp->err;\n#if FF_FS_EXFAT && !FF_FS_READONLY\n\tif (res == FR_OK && fs->fs_type == FS_EXFAT) {\n\t\tres = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF);\t/* Fill last fragment on the FAT if needed */\n\t}\n#endif\n\tif (res != FR_OK) LEAVE_FF(fs, res);\n\n#if FF_USE_FASTSEEK\n\tif (fp->cltbl) {\t/* Fast seek */\n\t\tif (ofs == CREATE_LINKMAP) {\t/* Create CLMT */\n\t\t\ttbl = fp->cltbl;\n\t\t\ttlen = *tbl++; ulen = 2;\t/* Given table size and required table size */\n\t\t\tcl = fp->obj.sclust;\t\t/* Origin of the chain */\n\t\t\tif (cl != 0) {\n\t\t\t\tdo {\n\t\t\t\t\t/* Get a fragment */\n\t\t\t\t\ttcl = cl; ncl = 0; ulen += 2;\t/* Top, length and used items */\n\t\t\t\t\tdo {\n\t\t\t\t\t\tpcl = cl; ncl++;\n\t\t\t\t\t\tcl = get_fat(&fp->obj, cl);\n\t\t\t\t\t\tif (cl <= 1) ABORT(fs, FR_INT_ERR);\n\t\t\t\t\t\tif (cl == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\t\t} while (cl == pcl + 1);\n\t\t\t\t\tif (ulen <= tlen) {\t\t/* Store the length and top of the fragment */\n\t\t\t\t\t\t*tbl++ = ncl; *tbl++ = tcl;\n\t\t\t\t\t}\n\t\t\t\t} while (cl < fs->n_fatent);\t/* Repeat until end of chain */\n\t\t\t}\n\t\t\t*fp->cltbl = ulen;\t/* Number of items used */\n\t\t\tif (ulen <= tlen) {\n\t\t\t\t*tbl = 0;\t\t/* Terminate table */\n\t\t\t} else {\n\t\t\t\tres = FR_NOT_ENOUGH_CORE;\t/* Given table size is smaller than required */\n\t\t\t}\n\t\t} else {\t\t\t\t\t\t/* Fast seek */\n\t\t\tif (ofs > fp->obj.objsize) ofs = fp->obj.objsize;\t/* Clip offset at the file size */\n\t\t\tfp->fptr = ofs;\t\t\t\t/* Set file pointer */\n\t\t\tif (ofs > 0) {\n\t\t\t\tfp->clust = clmt_clust(fp, ofs - 1);\n\t\t\t\tdsc = clst2sect(fs, fp->clust);\n\t\t\t\tif (dsc == 0) ABORT(fs, FR_INT_ERR);\n\t\t\t\tdsc += (DWORD)((ofs - 1) / SS(fs)) & (fs->csize - 1);\n\t\t\t\tif (fp->fptr % SS(fs) && dsc != fp->sect) {\t/* Refill sector cache if needed */\n#if !FF_FS_TINY\n#if !FF_FS_READONLY\n\t\t\t\t\tif (fp->flag & FA_DIRTY) {\t\t/* Write-back dirty sector cache */\n\t\t\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t\t\t}\n#endif\n\t\t\t\t\tif (disk_read(fs->pdrv, fp->buf, dsc, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\t/* Load current sector */\n#endif\n\t\t\t\t\tfp->sect = dsc;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else\n#endif\n\n\t/* Normal Seek */\n\t{\n#if FF_FS_EXFAT\n\t\tif (fs->fs_type != FS_EXFAT && ofs >= 0x100000000) ofs = 0xFFFFFFFF;\t/* Clip at 4 GiB - 1 if at FATxx */\n#endif\n\t\tif (ofs > fp->obj.objsize && (FF_FS_READONLY || !(fp->flag & FA_WRITE))) {\t/* In read-only mode, clip offset with the file size */\n\t\t\tofs = fp->obj.objsize;\n\t\t}\n\t\tifptr = fp->fptr;\n\t\tfp->fptr = nsect = 0;\n\t\tif (ofs > 0) {\n\t\t\tbcs = (DWORD)fs->csize * SS(fs);\t/* Cluster size (byte) */\n\t\t\tif (ifptr > 0 &&\n\t\t\t\t(ofs - 1) / bcs >= (ifptr - 1) / bcs) {\t/* When seek to same or following cluster, */\n\t\t\t\tfp->fptr = (ifptr - 1) & ~(FSIZE_t)(bcs - 1);\t/* start from the current cluster */\n\t\t\t\tofs -= fp->fptr;\n\t\t\t\tclst = fp->clust;\n\t\t\t} else {\t\t\t\t\t\t\t\t\t/* When seek to back cluster, */\n\t\t\t\tclst = fp->obj.sclust;\t\t\t\t\t/* start from the first cluster */\n#if !FF_FS_READONLY\n\t\t\t\tif (clst == 0) {\t\t\t\t\t\t/* If no cluster chain, create a new chain */\n\t\t\t\t\tclst = create_chain(&fp->obj, 0);\n\t\t\t\t\tif (clst == 1) ABORT(fs, FR_INT_ERR);\n\t\t\t\t\tif (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\t\tfp->obj.sclust = clst;\n\t\t\t\t}\n#endif\n\t\t\t\tfp->clust = clst;\n\t\t\t}\n\t\t\tif (clst != 0) {\n\t\t\t\twhile (ofs > bcs) {\t\t\t\t\t\t/* Cluster following loop */\n\t\t\t\t\tofs -= bcs; fp->fptr += bcs;\n#if !FF_FS_READONLY\n\t\t\t\t\tif (fp->flag & FA_WRITE) {\t\t\t/* Check if in write mode or not */\n\t\t\t\t\t\tif (FF_FS_EXFAT && fp->fptr > fp->obj.objsize) {\t/* No FAT chain object needs correct objsize to generate FAT value */\n\t\t\t\t\t\t\tfp->obj.objsize = fp->fptr;\n\t\t\t\t\t\t\tfp->flag |= FA_MODIFIED;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclst = create_chain(&fp->obj, clst);\t/* Follow chain with forceed stretch */\n\t\t\t\t\t\tif (clst == 0) {\t\t\t\t/* Clip file size in case of disk full */\n\t\t\t\t\t\t\tofs = 0; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tclst = get_fat(&fp->obj, clst);\t/* Follow cluster chain if not in write mode */\n\t\t\t\t\t}\n\t\t\t\t\tif (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\t\tif (clst <= 1 || clst >= fs->n_fatent) ABORT(fs, FR_INT_ERR);\n\t\t\t\t\tfp->clust = clst;\n\t\t\t\t}\n\t\t\t\tfp->fptr += ofs;\n\t\t\t\tif (ofs % SS(fs)) {\n\t\t\t\t\tnsect = clst2sect(fs, clst);\t/* Current sector */\n\t\t\t\t\tif (nsect == 0) ABORT(fs, FR_INT_ERR);\n\t\t\t\t\tnsect += (DWORD)(ofs / SS(fs));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!FF_FS_READONLY && fp->fptr > fp->obj.objsize) {\t/* Set file change flag if the file size is extended */\n\t\t\tfp->obj.objsize = fp->fptr;\n\t\t\tfp->flag |= FA_MODIFIED;\n\t\t}\n\t\tif (fp->fptr % SS(fs) && nsect != fp->sect) {\t/* Fill sector cache if needed */\n#if !FF_FS_TINY\n#if !FF_FS_READONLY\n\t\t\tif (fp->flag & FA_DIRTY) {\t\t\t/* Write-back dirty sector cache */\n\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t}\n#endif\n\t\t\tif (disk_read(fs->pdrv, fp->buf, nsect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\t/* Fill sector cache */\n#endif\n\t\t\tfp->sect = nsect;\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n#if FF_FS_MINIMIZE <= 1\n/*-----------------------------------------------------------------------*/\n/* Create a Directory Object                                             */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_opendir (\n\tDIR* dp,\t\t\t/* Pointer to directory object to create */\n\tconst TCHAR* path\t/* Pointer to the directory path */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDEF_NAMBUF\n\n\n\tif (!dp) return FR_INVALID_OBJECT;\n\n\t/* Get logical drive */\n\tres = find_volume(&path, &fs, 0);\n\tif (res == FR_OK) {\n\t\tdp->obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(dp, path);\t\t\t/* Follow the path to the directory */\n\t\tif (res == FR_OK) {\t\t\t\t\t\t/* Follow completed */\n\t\t\tif (!(dp->fn[NSFLAG] & NS_NONAME)) {\t/* It is not the origin directory itself */\n\t\t\t\tif (dp->obj.attr & AM_DIR) {\t\t/* This object is a sub-directory */\n#if FF_FS_EXFAT\n\t\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\t\tdp->obj.c_scl = dp->obj.sclust;\t\t\t\t\t\t\t/* Get containing directory inforamation */\n\t\t\t\t\t\tdp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat;\n\t\t\t\t\t\tdp->obj.c_ofs = dp->blk_ofs;\n\t\t\t\t\t\tinit_alloc_info(fs, &dp->obj);\t/* Get object allocation info */\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tdp->obj.sclust = ld_clust(fs, dp->dir);\t/* Get object allocation info */\n\t\t\t\t\t}\n\t\t\t\t} else {\t\t\t\t\t\t/* This object is a file */\n\t\t\t\t\tres = FR_NO_PATH;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tdp->obj.id = fs->id;\n\t\t\t\tres = dir_sdi(dp, 0);\t\t\t/* Rewind directory */\n#if FF_FS_LOCK != 0\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tif (dp->obj.sclust != 0) {\n\t\t\t\t\t\tdp->obj.lockid = inc_lock(dp, 0);\t/* Lock the sub directory */\n\t\t\t\t\t\tif (!dp->obj.lockid) res = FR_TOO_MANY_OPEN_FILES;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdp->obj.lockid = 0;\t/* Root directory need not to be locked */\n\t\t\t\t\t}\n\t\t\t\t}\n#endif\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t\tif (res == FR_NO_FILE) res = FR_NO_PATH;\n\t}\n\tif (res != FR_OK) dp->obj.fs = 0;\t\t/* Invalidate the directory object if function faild */\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Close Directory                                                       */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_closedir (\n\tDIR *dp\t\t/* Pointer to the directory object to be closed */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\n\n\tres = validate(&dp->obj, &fs);\t/* Check validity of the file object */\n\tif (res == FR_OK) {\n#if FF_FS_LOCK != 0\n\t\tif (dp->obj.lockid) res = dec_lock(dp->obj.lockid);\t/* Decrement sub-directory open counter */\n\t\tif (res == FR_OK) dp->obj.fs = 0;\t/* Invalidate directory object */\n#else\n\t\tdp->obj.fs = 0;\t/* Invalidate directory object */\n#endif\n#if FF_FS_REENTRANT\n\t\tunlock_fs(fs, FR_OK);\t\t/* Unlock volume */\n#endif\n\t}\n\treturn res;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Read Directory Entries in Sequence                                    */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_readdir (\n\tDIR* dp,\t\t\t/* Pointer to the open directory object */\n\tFILINFO* fno\t\t/* Pointer to file information to return */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDEF_NAMBUF\n\n\n\tres = validate(&dp->obj, &fs);\t/* Check validity of the directory object */\n\tif (res == FR_OK) {\n\t\tif (!fno) {\n\t\t\tres = dir_sdi(dp, 0);\t\t\t/* Rewind the directory object */\n\t\t} else {\n\t\t\tINIT_NAMBUF(fs);\n\t\t\tres = dir_read_file(dp);\t\t/* Read an item */\n\t\t\tif (res == FR_NO_FILE) res = FR_OK;\t/* Ignore end of directory */\n\t\t\tif (res == FR_OK) {\t\t\t\t/* A valid entry is found */\n\t\t\t\tget_fileinfo(dp, fno);\t\t/* Get the object information */\n\t\t\t\tres = dir_next(dp, 0);\t\t/* Increment index for next */\n\t\t\t\tif (res == FR_NO_FILE) res = FR_OK;\t/* Ignore end of directory now */\n\t\t\t}\n\t\t\tFREE_NAMBUF();\n\t\t}\n\t}\n\tLEAVE_FF(fs, res);\n}\n\n\n\n#if FF_USE_FIND\n/*-----------------------------------------------------------------------*/\n/* Find Next File                                                        */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_findnext (\n\tDIR* dp,\t\t/* Pointer to the open directory object */\n\tFILINFO* fno\t/* Pointer to the file information structure */\n)\n{\n\tFRESULT res;\n\n\n\tfor (;;) {\n\t\tres = f_readdir(dp, fno);\t\t/* Get a directory item */\n\t\tif (res != FR_OK || !fno || !fno->fname[0]) break;\t/* Terminate if any error or end of directory */\n\t\tif (pattern_matching(dp->pat, fno->fname, 0, 0)) break;\t\t/* Test for the file name */\n#if FF_USE_LFN && FF_USE_FIND == 2\n\t\tif (pattern_matching(dp->pat, fno->altname, 0, 0)) break;\t/* Test for alternative name if exist */\n#endif\n\t}\n\treturn res;\n}\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Find First File                                                       */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_findfirst (\n\tDIR* dp,\t\t\t\t/* Pointer to the blank directory object */\n\tFILINFO* fno,\t\t\t/* Pointer to the file information structure */\n\tconst TCHAR* path,\t\t/* Pointer to the directory to open */\n\tconst TCHAR* pattern\t/* Pointer to the matching pattern */\n)\n{\n\tFRESULT res;\n\n\n\tdp->pat = pattern;\t\t/* Save pointer to pattern string */\n\tres = f_opendir(dp, path);\t\t/* Open the target directory */\n\tif (res == FR_OK) {\n\t\tres = f_findnext(dp, fno);\t/* Find the first item */\n\t}\n\treturn res;\n}\n\n#endif\t/* FF_USE_FIND */\n\n\n\n#if FF_FS_MINIMIZE == 0\n/*-----------------------------------------------------------------------*/\n/* Get File Status                                                       */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_stat (\n\tconst TCHAR* path,\t/* Pointer to the file path */\n\tFILINFO* fno\t\t/* Pointer to file information to return */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tDEF_NAMBUF\n\n\n\t/* Get logical drive */\n\tres = find_volume(&path, &dj.obj.fs, 0);\n\tif (res == FR_OK) {\n\t\tINIT_NAMBUF(dj.obj.fs);\n\t\tres = follow_path(&dj, path);\t/* Follow the file path */\n\t\tif (res == FR_OK) {\t\t\t\t/* Follow completed */\n\t\t\tif (dj.fn[NSFLAG] & NS_NONAME) {\t/* It is origin directory */\n\t\t\t\tres = FR_INVALID_NAME;\n\t\t\t} else {\t\t\t\t\t\t\t/* Found an object */\n\t\t\t\tif (fno) get_fileinfo(&dj, fno);\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(dj.obj.fs, res);\n}\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Get Number of Free Clusters                                           */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_getfree (\n\tconst TCHAR* path,\t/* Logical drive number */\n\tDWORD* nclst,\t\t/* Pointer to a variable to return number of free clusters */\n\tFATFS** fatfs\t\t/* Pointer to return pointer to corresponding filesystem object */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD nfree, clst, sect, stat;\n\tUINT i;\n\tFFOBJID obj;\n\n\n\t/* Get logical drive */\n\tres = find_volume(&path, &fs, 0);\n\tif (res == FR_OK) {\n\t\t*fatfs = fs;\t\t\t\t/* Return ptr to the fs object */\n\t\t/* If free_clst is valid, return it without full FAT scan */\n\t\tif (fs->free_clst <= fs->n_fatent - 2) {\n\t\t\t*nclst = fs->free_clst;\n\t\t} else {\n\t\t\t/* Scan FAT to obtain number of free clusters */\n\t\t\tnfree = 0;\n\t\t\tif (fs->fs_type == FS_FAT12) {\t/* FAT12: Scan bit field FAT entries */\n\t\t\t\tclst = 2; obj.fs = fs;\n\t\t\t\tdo {\n\t\t\t\t\tstat = get_fat(&obj, clst);\n\t\t\t\t\tif (stat == 0xFFFFFFFF) { res = FR_DISK_ERR; break; }\n\t\t\t\t\tif (stat == 1) { res = FR_INT_ERR; break; }\n\t\t\t\t\tif (stat == 0) nfree++;\n\t\t\t\t} while (++clst < fs->n_fatent);\n\t\t\t} else {\n#if FF_FS_EXFAT\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\t/* exFAT: Scan allocation bitmap */\n\t\t\t\t\tBYTE bm;\n\t\t\t\t\tUINT b;\n\n\t\t\t\t\tclst = fs->n_fatent - 2;\t/* Number of clusters */\n\t\t\t\t\tsect = fs->database;\t\t/* Assuming bitmap starts at cluster 2 */\n\t\t\t\t\ti = 0;\t\t\t\t\t\t/* Offset in the sector */\n\t\t\t\t\tdo {\t/* Counts numbuer of bits with zero in the bitmap */\n\t\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\t\tres = move_window(fs, sect++);\n\t\t\t\t\t\t\tif (res != FR_OK) break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (b = 8, bm = fs->win[i]; b && clst; b--, clst--) {\n\t\t\t\t\t\t\tif (!(bm & 1)) nfree++;\n\t\t\t\t\t\t\tbm >>= 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti = (i + 1) % SS(fs);\n\t\t\t\t\t} while (clst);\n\t\t\t\t} else\n#endif\n\t\t\t\t{\t/* FAT16/32: Scan WORD/DWORD FAT entries */\n\t\t\t\t\tclst = fs->n_fatent;\t/* Number of entries */\n\t\t\t\t\tsect = fs->fatbase;\t\t/* Top of the FAT */\n\t\t\t\t\ti = 0;\t\t\t\t\t/* Offset in the sector */\n\t\t\t\t\tdo {\t/* Counts numbuer of entries with zero in the FAT */\n\t\t\t\t\t\tif (i == 0) {\n\t\t\t\t\t\t\tres = move_window(fs, sect++);\n\t\t\t\t\t\t\tif (res != FR_OK) break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fs->fs_type == FS_FAT16) {\n\t\t\t\t\t\t\tif (ld_word(fs->win + i) == 0) nfree++;\n\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif ((ld_dword(fs->win + i) & 0x0FFFFFFF) == 0) nfree++;\n\t\t\t\t\t\t\ti += 4;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti %= SS(fs);\n\t\t\t\t\t} while (--clst);\n\t\t\t\t}\n\t\t\t}\n\t\t\t*nclst = nfree;\t\t\t/* Return the free clusters */\n\t\t\tfs->free_clst = nfree;\t/* Now free_clst is valid */\n\t\t\tfs->fsi_flag |= 1;\t\t/* FAT32: FSInfo is to be updated */\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Truncate File                                                         */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_truncate (\n\tFIL* fp\t\t/* Pointer to the file object */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD ncl;\n\n\n\tres = validate(&fp->obj, &fs);\t/* Check validity of the file object */\n\tif (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);\n\tif (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED);\t/* Check access mode */\n\n\tif (fp->fptr < fp->obj.objsize) {\t/* Process when fptr is not on the eof */\n\t\tif (fp->fptr == 0) {\t/* When set file size to zero, remove entire cluster chain */\n\t\t\tres = remove_chain(&fp->obj, fp->obj.sclust, 0);\n\t\t\tfp->obj.sclust = 0;\n\t\t} else {\t\t\t\t/* When truncate a part of the file, remove remaining clusters */\n\t\t\tncl = get_fat(&fp->obj, fp->clust);\n\t\t\tres = FR_OK;\n\t\t\tif (ncl == 0xFFFFFFFF) res = FR_DISK_ERR;\n\t\t\tif (ncl == 1) res = FR_INT_ERR;\n\t\t\tif (res == FR_OK && ncl < fs->n_fatent) {\n\t\t\t\tres = remove_chain(&fp->obj, ncl, fp->clust);\n\t\t\t}\n\t\t}\n\t\tfp->obj.objsize = fp->fptr;\t/* Set file size to current read/write point */\n\t\tfp->flag |= FA_MODIFIED;\n#if !FF_FS_TINY\n\t\tif (res == FR_OK && (fp->flag & FA_DIRTY)) {\n\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) {\n\t\t\t\tres = FR_DISK_ERR;\n\t\t\t} else {\n\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t}\n\t\t}\n#endif\n\t\tif (res != FR_OK) ABORT(fs, res);\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Delete a File/Directory                                               */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_unlink (\n\tconst TCHAR* path\t\t/* Pointer to the file or directory path */\n)\n{\n\tFRESULT res;\n\tDIR dj, sdj;\n\tDWORD dclst = 0;\n\tFATFS *fs;\n#if FF_FS_EXFAT\n\tFFOBJID obj;\n#endif\n\tDEF_NAMBUF\n\n\n\t/* Get logical drive */\n\tres = find_volume(&path, &fs, FA_WRITE);\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t\t/* Follow the file path */\n\t\tif (FF_FS_RPATH && res == FR_OK && (dj.fn[NSFLAG] & NS_DOT)) {\n\t\t\tres = FR_INVALID_NAME;\t\t\t/* Cannot remove dot entry */\n\t\t}\n#if FF_FS_LOCK != 0\n\t\tif (res == FR_OK) res = chk_lock(&dj, 2);\t/* Check if it is an open object */\n#endif\n\t\tif (res == FR_OK) {\t\t\t\t\t/* The object is accessible */\n\t\t\tif (dj.fn[NSFLAG] & NS_NONAME) {\n\t\t\t\tres = FR_INVALID_NAME;\t\t/* Cannot remove the origin directory */\n\t\t\t} else {\n\t\t\t\tif (dj.obj.attr & AM_RDO) {\n\t\t\t\t\tres = FR_DENIED;\t\t/* Cannot remove R/O object */\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n#if FF_FS_EXFAT\n\t\t\t\tobj.fs = fs;\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\tinit_alloc_info(fs, &obj);\n\t\t\t\t\tdclst = obj.sclust;\n\t\t\t\t} else\n#endif\n\t\t\t\t{\n\t\t\t\t\tdclst = ld_clust(fs, dj.dir);\n\t\t\t\t}\n\t\t\t\tif (dj.obj.attr & AM_DIR) {\t\t\t/* Is it a sub-directory? */\n#if FF_FS_RPATH != 0\n\t\t\t\t\tif (dclst == fs->cdir) {\t\t \t/* Is it the current directory? */\n\t\t\t\t\t\tres = FR_DENIED;\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tsdj.obj.fs = fs;\t\t\t\t/* Open the sub-directory */\n\t\t\t\t\t\tsdj.obj.sclust = dclst;\n#if FF_FS_EXFAT\n\t\t\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\t\t\tsdj.obj.objsize = obj.objsize;\n\t\t\t\t\t\t\tsdj.obj.stat = obj.stat;\n\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t\tres = dir_sdi(&sdj, 0);\n\t\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\t\tres = dir_read_file(&sdj);\t\t\t/* Test if the directory is empty */\n\t\t\t\t\t\t\tif (res == FR_OK) res = FR_DENIED;\t/* Not empty? */\n\t\t\t\t\t\t\tif (res == FR_NO_FILE) res = FR_OK;\t/* Empty? */\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tres = dir_remove(&dj);\t\t\t/* Remove the directory entry */\n\t\t\t\tif (res == FR_OK && dclst != 0) {\t/* Remove the cluster chain if exist */\n#if FF_FS_EXFAT\n\t\t\t\t\tres = remove_chain(&obj, dclst, 0);\n#else\n\t\t\t\t\tres = remove_chain(&dj.obj, dclst, 0);\n#endif\n\t\t\t\t}\n\t\t\t\tif (res == FR_OK) res = sync_fs(fs);\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Create a Directory                                                    */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_mkdir (\n\tconst TCHAR* path\t\t/* Pointer to the directory path */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n\tBYTE *dir;\n\tDWORD dcl, pcl, tm;\n\tDEF_NAMBUF\n\n\n\t/* Get logical drive */\n\tres = find_volume(&path, &fs, FA_WRITE);\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t\t\t/* Follow the file path */\n\t\tif (res == FR_OK) res = FR_EXIST;\t\t/* Any object with same name is already existing */\n\t\tif (FF_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) {\n\t\t\tres = FR_INVALID_NAME;\n\t\t}\n\t\tif (res == FR_NO_FILE) {\t\t\t\t/* Can create a new directory */\n\t\t\tdcl = create_chain(&dj.obj, 0);\t\t/* Allocate a cluster for the new directory table */\n\t\t\tdj.obj.objsize = (DWORD)fs->csize * SS(fs);\n\t\t\tres = FR_OK;\n\t\t\tif (dcl == 0) res = FR_DENIED;\t\t/* No space to allocate a new cluster */\n\t\t\tif (dcl == 1) res = FR_INT_ERR;\n\t\t\tif (dcl == 0xFFFFFFFF) res = FR_DISK_ERR;\n\t\t\tif (res == FR_OK) res = sync_window(fs);\t/* Flush FAT */\n\t\t\ttm = GET_FATTIME();\n\t\t\tif (res == FR_OK) {\t\t\t\t\t/* Initialize the new directory table */\n\t\t\t\tres = dir_clear(fs, dcl);\t\t/* Clean up the new table */\n\t\t\t\tif (res == FR_OK && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT)) {\t/* Create dot entries (FAT only) */\n\t\t\t\t\tdir = fs->win;\n\t\t\t\t\tmem_set(dir + DIR_Name, ' ', 11);\t/* Create \".\" entry */\n\t\t\t\t\tdir[DIR_Name] = '.';\n\t\t\t\t\tdir[DIR_Attr] = AM_DIR;\n\t\t\t\t\tst_dword(dir + DIR_ModTime, tm);\n\t\t\t\t\tst_clust(fs, dir, dcl);\n\t\t\t\t\tmem_cpy(dir + SZDIRE, dir, SZDIRE); /* Create \"..\" entry */\n\t\t\t\t\tdir[SZDIRE + 1] = '.'; pcl = dj.obj.sclust;\n\t\t\t\t\tst_clust(fs, dir + SZDIRE, pcl);\n\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tres = dir_register(&dj);\t/* Register the object to the directoy */\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n#if FF_FS_EXFAT\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\t/* Initialize directory entry block */\n\t\t\t\t\tst_dword(fs->dirbuf + XDIR_ModTime, tm);\t/* Created time */\n\t\t\t\t\tst_dword(fs->dirbuf + XDIR_FstClus, dcl);\t/* Table start cluster */\n\t\t\t\t\tst_dword(fs->dirbuf + XDIR_FileSize, (DWORD)dj.obj.objsize);\t/* File size needs to be valid */\n\t\t\t\t\tst_dword(fs->dirbuf + XDIR_ValidFileSize, (DWORD)dj.obj.objsize);\n\t\t\t\t\tfs->dirbuf[XDIR_GenFlags] = 3;\t\t\t\t/* Initialize the object flag */\n\t\t\t\t\tfs->dirbuf[XDIR_Attr] = AM_DIR;\t\t\t\t/* Attribute */\n\t\t\t\t\tres = store_xdir(&dj);\n\t\t\t\t} else\n#endif\n\t\t\t\t{\n\t\t\t\t\tdir = dj.dir;\n\t\t\t\t\tst_dword(dir + DIR_ModTime, tm);\t/* Created time */\n\t\t\t\t\tst_clust(fs, dir, dcl);\t\t\t\t/* Table start cluster */\n\t\t\t\t\tdir[DIR_Attr] = AM_DIR;\t\t\t\t/* Attribute */\n\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t}\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tres = sync_fs(fs);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremove_chain(&dj.obj, dcl, 0);\t\t/* Could not register, remove cluster chain */\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Rename a File/Directory                                               */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_rename (\n\tconst TCHAR* path_old,\t/* Pointer to the object name to be renamed */\n\tconst TCHAR* path_new\t/* Pointer to the new name */\n)\n{\n\tFRESULT res;\n\tDIR djo, djn;\n\tFATFS *fs;\n\tBYTE buf[FF_FS_EXFAT ? SZDIRE * 2 : SZDIRE], *dir;\n\tDWORD dw;\n\tDEF_NAMBUF\n\n\n\tget_ldnumber(&path_new);\t\t\t\t\t\t/* Snip the drive number of new name off */\n\tres = find_volume(&path_old, &fs, FA_WRITE);\t/* Get logical drive of the old object */\n\tif (res == FR_OK) {\n\t\tdjo.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&djo, path_old);\t\t/* Check old object */\n\t\tif (res == FR_OK && (djo.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME;\t/* Check validity of name */\n#if FF_FS_LOCK != 0\n\t\tif (res == FR_OK) {\n\t\t\tres = chk_lock(&djo, 2);\n\t\t}\n#endif\n\t\tif (res == FR_OK) {\t\t\t\t\t\t/* Object to be renamed is found */\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\t/* At exFAT volume */\n\t\t\t\tBYTE nf, nn;\n\t\t\t\tWORD nh;\n\n\t\t\t\tmem_cpy(buf, fs->dirbuf, SZDIRE * 2);\t/* Save 85+C0 entry of old object */\n\t\t\t\tmem_cpy(&djn, &djo, sizeof djo);\n\t\t\t\tres = follow_path(&djn, path_new);\t\t/* Make sure if new object name is not in use */\n\t\t\t\tif (res == FR_OK) {\t\t\t\t\t\t/* Is new name already in use by any other object? */\n\t\t\t\t\tres = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST;\n\t\t\t\t}\n\t\t\t\tif (res == FR_NO_FILE) { \t\t\t\t/* It is a valid path and no name collision */\n\t\t\t\t\tres = dir_register(&djn);\t\t\t/* Register the new entry */\n\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\tnf = fs->dirbuf[XDIR_NumSec]; nn = fs->dirbuf[XDIR_NumName];\n\t\t\t\t\t\tnh = ld_word(fs->dirbuf + XDIR_NameHash);\n\t\t\t\t\t\tmem_cpy(fs->dirbuf, buf, SZDIRE * 2);\t/* Restore 85+C0 entry */\n\t\t\t\t\t\tfs->dirbuf[XDIR_NumSec] = nf; fs->dirbuf[XDIR_NumName] = nn;\n\t\t\t\t\t\tst_word(fs->dirbuf + XDIR_NameHash, nh);\n\t\t\t\t\t\tif (!(fs->dirbuf[XDIR_Attr] & AM_DIR)) fs->dirbuf[XDIR_Attr] |= AM_ARC;\t/* Set archive attribute if it is a file */\n/* Start of critical section where an interruption can cause a cross-link */\n\t\t\t\t\t\tres = store_xdir(&djn);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else\n#endif\n\t\t\t{\t/* At FAT/FAT32 volume */\n\t\t\t\tmem_cpy(buf, djo.dir, SZDIRE);\t\t\t/* Save directory entry of the object */\n\t\t\t\tmem_cpy(&djn, &djo, sizeof (DIR));\t\t/* Duplicate the directory object */\n\t\t\t\tres = follow_path(&djn, path_new);\t\t/* Make sure if new object name is not in use */\n\t\t\t\tif (res == FR_OK) {\t\t\t\t\t\t/* Is new name already in use by any other object? */\n\t\t\t\t\tres = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST;\n\t\t\t\t}\n\t\t\t\tif (res == FR_NO_FILE) { \t\t\t\t/* It is a valid path and no name collision */\n\t\t\t\t\tres = dir_register(&djn);\t\t\t/* Register the new entry */\n\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\tdir = djn.dir;\t\t\t\t\t/* Copy directory entry of the object except name */\n\t\t\t\t\t\tmem_cpy(dir + 13, buf + 13, SZDIRE - 13);\n\t\t\t\t\t\tdir[DIR_Attr] = buf[DIR_Attr];\n\t\t\t\t\t\tif (!(dir[DIR_Attr] & AM_DIR)) dir[DIR_Attr] |= AM_ARC;\t/* Set archive attribute if it is a file */\n\t\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\t\tif ((dir[DIR_Attr] & AM_DIR) && djo.obj.sclust != djn.obj.sclust) {\t/* Update .. entry in the sub-directory if needed */\n\t\t\t\t\t\t\tdw = clst2sect(fs, ld_clust(fs, dir));\n\t\t\t\t\t\t\tif (dw == 0) {\n\t\t\t\t\t\t\t\tres = FR_INT_ERR;\n\t\t\t\t\t\t\t} else {\n/* Start of critical section where an interruption can cause a cross-link */\n\t\t\t\t\t\t\t\tres = move_window(fs, dw);\n\t\t\t\t\t\t\t\tdir = fs->win + SZDIRE * 1;\t/* Ptr to .. entry */\n\t\t\t\t\t\t\t\tif (res == FR_OK && dir[1] == '.') {\n\t\t\t\t\t\t\t\t\tst_clust(fs, dir, djn.obj.sclust);\n\t\t\t\t\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tres = dir_remove(&djo);\t\t/* Remove old entry */\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tres = sync_fs(fs);\n\t\t\t\t}\n\t\t\t}\n/* End of the critical section */\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n#endif /* !FF_FS_READONLY */\n#endif /* FF_FS_MINIMIZE == 0 */\n#endif /* FF_FS_MINIMIZE <= 1 */\n#endif /* FF_FS_MINIMIZE <= 2 */\n\n\n\n#if FF_USE_CHMOD && !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Change Attribute                                                      */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_chmod (\n\tconst TCHAR* path,\t/* Pointer to the file path */\n\tBYTE attr,\t\t\t/* Attribute bits */\n\tBYTE mask\t\t\t/* Attribute mask to change */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n\tDEF_NAMBUF\n\n\n\tres = find_volume(&path, &fs, FA_WRITE);\t/* Get logical drive */\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t/* Follow the file path */\n\t\tif (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME;\t/* Check object validity */\n\t\tif (res == FR_OK) {\n\t\t\tmask &= AM_RDO|AM_HID|AM_SYS|AM_ARC;\t/* Valid attribute mask */\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\tfs->dirbuf[XDIR_Attr] = (attr & mask) | (fs->dirbuf[XDIR_Attr] & (BYTE)~mask);\t/* Apply attribute change */\n\t\t\t\tres = store_xdir(&dj);\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tdj.dir[DIR_Attr] = (attr & mask) | (dj.dir[DIR_Attr] & (BYTE)~mask);\t/* Apply attribute change */\n\t\t\t\tfs->wflag = 1;\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tres = sync_fs(fs);\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Change Timestamp                                                      */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_utime (\n\tconst TCHAR* path,\t/* Pointer to the file/directory name */\n\tconst FILINFO* fno\t/* Pointer to the timestamp to be set */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n\tDEF_NAMBUF\n\n\n\tres = find_volume(&path, &fs, FA_WRITE);\t/* Get logical drive */\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t/* Follow the file path */\n\t\tif (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME;\t/* Check object validity */\n\t\tif (res == FR_OK) {\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\tst_dword(fs->dirbuf + XDIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime);\n\t\t\t\tres = store_xdir(&dj);\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tst_dword(dj.dir + DIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime);\n\t\t\t\tfs->wflag = 1;\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tres = sync_fs(fs);\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n#endif\t/* FF_USE_CHMOD && !FF_FS_READONLY */\n\n\n\n#if FF_USE_LABEL\n/*-----------------------------------------------------------------------*/\n/* Get Volume Label                                                      */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_getlabel (\n\tconst TCHAR* path,\t/* Logical drive number */\n\tTCHAR* label,\t\t/* Buffer to store the volume label */\n\tDWORD* vsn\t\t\t/* Variable to store the volume serial number */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n\tUINT si, di;\n\tWCHAR wc;\n\n\t/* Get logical drive */\n\tres = find_volume(&path, &fs, 0);\n\n\t/* Get volume label */\n\tif (res == FR_OK && label) {\n\t\tdj.obj.fs = fs; dj.obj.sclust = 0;\t/* Open root directory */\n\t\tres = dir_sdi(&dj, 0);\n\t\tif (res == FR_OK) {\n\t\t \tres = dir_read_label(&dj);\t\t/* Find a volume label entry */\n\t\t \tif (res == FR_OK) {\n#if FF_FS_EXFAT\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\tWCHAR hs;\n\n\t\t\t\t\tfor (si = di = hs = 0; si < dj.dir[XDIR_NumLabel]; si++) {\t/* Extract volume label from 83 entry */\n\t\t\t\t\t\twc = ld_word(dj.dir + XDIR_Label + si * 2);\n\t\t\t\t\t\tif (hs == 0 && IsSurrogate(wc)) {\t/* Is the code a surrogate? */\n\t\t\t\t\t\t\ths = wc; continue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\twc = put_utf((DWORD)hs << 16 | wc, &label[di], 4);\n\t\t\t\t\t\tif (wc == 0) { di = 0; break; }\n\t\t\t\t\t\tdi += wc;\n\t\t\t\t\t\ths = 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (hs != 0) di = 0;\t/* Broken surrogate pair? */\n\t\t\t\t\tlabel[di] = 0;\n\t\t\t\t} else\n#endif\n\t\t\t\t{\n\t\t\t\t\tsi = di = 0;\t\t/* Extract volume label from AM_VOL entry */\n\t\t\t\t\twhile (si < 11) {\n\t\t\t\t\t\twc = dj.dir[si++];\n#if FF_USE_LFN && FF_LFN_UNICODE >= 1 \t/* Unicode output */\n\t\t\t\t\t\tif (dbc_1st((BYTE)wc) && si < 11) wc = wc << 8 | dj.dir[si++];\t/* Is it a DBC? */\n\t\t\t\t\t\twc = ff_oem2uni(wc, CODEPAGE);\t\t\t\t\t/* Convert it into Unicode */\n\t\t\t\t\t\tif (wc != 0) wc = put_utf(wc, &label[di], 4);\t/* Put it in Unicode */\n\t\t\t\t\t\tif (wc == 0) { di = 0; break; }\n\t\t\t\t\t\tdi += wc;\n#else\t\t\t\t\t\t\t\t\t/* ANSI/OEM output */\n\t\t\t\t\t\tlabel[di++] = (TCHAR)wc;\n#endif\n\t\t\t\t\t}\n\t\t\t\t\tdo {\t\t\t\t/* Truncate trailing spaces */\n\t\t\t\t\t\tlabel[di] = 0;\n\t\t\t\t\t\tif (di == 0) break;\n\t\t\t\t\t} while (label[--di] == ' ');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (res == FR_NO_FILE) {\t/* No label entry and return nul string */\n\t\t\tlabel[0] = 0;\n\t\t\tres = FR_OK;\n\t\t}\n\t}\n\n\t/* Get volume serial number */\n\tif (res == FR_OK && vsn) {\n\t\tres = move_window(fs, fs->volbase);\n\t\tif (res == FR_OK) {\n\t\t\tswitch (fs->fs_type) {\n\t\t\tcase FS_EXFAT:\n\t\t\t\tdi = BPB_VolIDEx; break;\n\n\t\t\tcase FS_FAT32:\n\t\t\t\tdi = BS_VolID32; break;\n\n\t\t\tdefault:\n\t\t\t\tdi = BS_VolID;\n\t\t\t}\n\t\t\t*vsn = ld_dword(fs->win + di);\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Set Volume Label                                                      */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_setlabel (\n\tconst TCHAR* label\t/* Volume label to set with heading logical drive number */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n\tBYTE dirvn[22];\n\tUINT di;\n\tWCHAR wc;\n\tstatic const char badchr[] = \"+.,;=[]/\\\\\\\"*:<>\\?|\\x7F\";\t/* [0..] for FAT, [7..] for exFAT */\n#if FF_USE_LFN\n\tDWORD dc;\n#endif\n\n\t/* Get logical drive */\n\tres = find_volume(&label, &fs, FA_WRITE);\n\tif (res != FR_OK) LEAVE_FF(fs, res);\n\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\tmem_set(dirvn, 0, 22);\n\t\tdi = 0;\n\t\twhile ((UINT)*label >= ' ') {\t/* Create volume label */\n\t\t\tdc = tchar2uni(&label);\t/* Get a Unicode character */\n\t\t\tif (dc >= 0x10000) {\n\t\t\t\tif (dc == 0xFFFFFFFF || di >= 10) {\t/* Wrong surrogate or buffer overflow */\n\t\t\t\t\tdc = 0;\n\t\t\t\t} else {\n\t\t\t\t\tst_word(dirvn + di * 2, (WCHAR)(dc >> 16)); di++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (dc == 0 || chk_chr(badchr + 7, (int)dc) || di >= 11) {\t/* Check validity of the volume label */\n\t\t\t\tLEAVE_FF(fs, FR_INVALID_NAME);\n\t\t\t}\n\t\t\tst_word(dirvn + di * 2, (WCHAR)dc); di++;\n\t\t}\n\t} else\n#endif\n\t{\t/* On the FAT/FAT32 volume */\n\t\tmem_set(dirvn, ' ', 11);\n\t\tdi = 0;\n\t\twhile ((UINT)*label >= ' ') {\t/* Create volume label */\n#if FF_USE_LFN\n\t\t\tdc = tchar2uni(&label);\n\t\t\twc = (dc < 0x10000) ? ff_uni2oem(ff_wtoupper(dc), CODEPAGE) : 0;\n#else\t\t\t\t\t\t\t\t\t/* ANSI/OEM input */\n\t\t\twc = (BYTE)*label++;\n\t\t\tif (dbc_1st((BYTE)wc)) wc = dbc_2nd((BYTE)*label) ? wc << 8 | (BYTE)*label++ : 0;\n\t\t\tif (IsLower(wc)) wc -= 0x20;\t\t/* To upper ASCII characters */\n#if FF_CODE_PAGE == 0\n\t\t\tif (ExCvt && wc >= 0x80) wc = ExCvt[wc - 0x80];\t/* To upper extended characters (SBCS cfg) */\n#elif FF_CODE_PAGE < 900\n\t\t\tif (wc >= 0x80) wc = ExCvt[wc - 0x80];\t/* To upper extended characters (SBCS cfg) */\n#endif\n#endif\n\t\t\tif (wc == 0 || chk_chr(badchr + 0, (int)wc) || di >= (UINT)((wc >= 0x100) ? 10 : 11)) {\t/* Reject invalid characters for volume label */\n\t\t\t\tLEAVE_FF(fs, FR_INVALID_NAME);\n\t\t\t}\n\t\t\tif (wc >= 0x100) dirvn[di++] = (BYTE)(wc >> 8);\n\t\t\tdirvn[di++] = (BYTE)wc;\n\t\t}\n\t\tif (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME);\t/* Reject illegal name (heading DDEM) */\n\t\twhile (di && dirvn[di - 1] == ' ') di--;\t\t\t\t/* Snip trailing spaces */\n\t}\n\n\t/* Set volume label */\n\tdj.obj.fs = fs; dj.obj.sclust = 0;\t/* Open root directory */\n\tres = dir_sdi(&dj, 0);\n\tif (res == FR_OK) {\n\t\tres = dir_read_label(&dj);\t/* Get volume label entry */\n\t\tif (res == FR_OK) {\n\t\t\tif (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) {\n\t\t\t\tdj.dir[XDIR_NumLabel] = (BYTE)di;\t/* Change the volume label */\n\t\t\t\tmem_cpy(dj.dir + XDIR_Label, dirvn, 22);\n\t\t\t} else {\n\t\t\t\tif (di != 0) {\n\t\t\t\t\tmem_cpy(dj.dir, dirvn, 11);\t/* Change the volume label */\n\t\t\t\t} else {\n\t\t\t\t\tdj.dir[DIR_Name] = DDEM;\t/* Remove the volume label */\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs->wflag = 1;\n\t\t\tres = sync_fs(fs);\n\t\t} else {\t\t\t/* No volume label entry or an error */\n\t\t\tif (res == FR_NO_FILE) {\n\t\t\t\tres = FR_OK;\n\t\t\t\tif (di != 0) {\t/* Create a volume label entry */\n\t\t\t\t\tres = dir_alloc(&dj, 1);\t/* Allocate an entry */\n\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\tmem_set(dj.dir, 0, SZDIRE);\t/* Clean the entry */\n\t\t\t\t\t\tif (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) {\n\t\t\t\t\t\t\tdj.dir[XDIR_Type] = 0x83;\t\t/* Create 83 entry */\n\t\t\t\t\t\t\tdj.dir[XDIR_NumLabel] = (BYTE)di;\n\t\t\t\t\t\t\tmem_cpy(dj.dir + XDIR_Label, dirvn, 22);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdj.dir[DIR_Attr] = AM_VOL;\t\t/* Create volume label entry */\n\t\t\t\t\t\t\tmem_cpy(dj.dir, dirvn, 11);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\t\tres = sync_fs(fs);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n#endif /* !FF_FS_READONLY */\n#endif /* FF_USE_LABEL */\n\n\n\n#if FF_USE_EXPAND && !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Allocate a Contiguous Blocks to the File                              */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_expand (\n\tFIL* fp,\t\t/* Pointer to the file object */\n\tFSIZE_t fsz,\t/* File size to be expanded to */\n\tBYTE opt\t\t/* Operation mode 0:Find and prepare or 1:Find and allocate */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD n, clst, stcl, scl, ncl, tcl, lclst;\n\n\n\tres = validate(&fp->obj, &fs);\t\t/* Check validity of the file object */\n\tif (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);\n\tif (fsz == 0 || fp->obj.objsize != 0 || !(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED);\n#if FF_FS_EXFAT\n\tif (fs->fs_type != FS_EXFAT && fsz >= 0x100000000) LEAVE_FF(fs, FR_DENIED);\t/* Check if in size limit */\n#endif\n\tn = (DWORD)fs->csize * SS(fs);\t/* Cluster size */\n\ttcl = (DWORD)(fsz / n) + ((fsz & (n - 1)) ? 1 : 0);\t/* Number of clusters required */\n\tstcl = fs->last_clst; lclst = 0;\n\tif (stcl < 2 || stcl >= fs->n_fatent) stcl = 2;\n\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\n\t\tscl = find_bitmap(fs, stcl, tcl);\t\t\t/* Find a contiguous cluster block */\n\t\tif (scl == 0) res = FR_DENIED;\t\t\t\t/* No contiguous cluster block was found */\n\t\tif (scl == 0xFFFFFFFF) res = FR_DISK_ERR;\n\t\tif (res == FR_OK) {\t/* A contiguous free area is found */\n\t\t\tif (opt) {\t\t/* Allocate it now */\n\t\t\t\tres = change_bitmap(fs, scl, tcl, 1);\t/* Mark the cluster block 'in use' */\n\t\t\t\tlclst = scl + tcl - 1;\n\t\t\t} else {\t\t/* Set it as suggested point for next allocation */\n\t\t\t\tlclst = scl - 1;\n\t\t\t}\n\t\t}\n\t} else\n#endif\n\t{\n\t\tscl = clst = stcl; ncl = 0;\n\t\tfor (;;) {\t/* Find a contiguous cluster block */\n\t\t\tn = get_fat(&fp->obj, clst);\n\t\t\tif (++clst >= fs->n_fatent) clst = 2;\n\t\t\tif (n == 1) { res = FR_INT_ERR; break; }\n\t\t\tif (n == 0xFFFFFFFF) { res = FR_DISK_ERR; break; }\n\t\t\tif (n == 0) {\t/* Is it a free cluster? */\n\t\t\t\tif (++ncl == tcl) break;\t/* Break if a contiguous cluster block is found */\n\t\t\t} else {\n\t\t\t\tscl = clst; ncl = 0;\t\t/* Not a free cluster */\n\t\t\t}\n\t\t\tif (clst == stcl) { res = FR_DENIED; break; }\t/* No contiguous cluster? */\n\t\t}\n\t\tif (res == FR_OK) {\t/* A contiguous free area is found */\n\t\t\tif (opt) {\t\t/* Allocate it now */\n\t\t\t\tfor (clst = scl, n = tcl; n; clst++, n--) {\t/* Create a cluster chain on the FAT */\n\t\t\t\t\tres = put_fat(fs, clst, (n == 1) ? 0xFFFFFFFF : clst + 1);\n\t\t\t\t\tif (res != FR_OK) break;\n\t\t\t\t\tlclst = clst;\n\t\t\t\t}\n\t\t\t} else {\t\t/* Set it as suggested point for next allocation */\n\t\t\t\tlclst = scl - 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (res == FR_OK) {\n\t\tfs->last_clst = lclst;\t\t/* Set suggested start cluster to start next */\n\t\tif (opt) {\t/* Is it allocated now? */\n\t\t\tfp->obj.sclust = scl;\t\t/* Update object allocation information */\n\t\t\tfp->obj.objsize = fsz;\n\t\t\tif (FF_FS_EXFAT) fp->obj.stat = 2;\t/* Set status 'contiguous chain' */\n\t\t\tfp->flag |= FA_MODIFIED;\n\t\t\tif (fs->free_clst <= fs->n_fatent - 2) {\t/* Update FSINFO */\n\t\t\t\tfs->free_clst -= tcl;\n\t\t\t\tfs->fsi_flag |= 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n#endif /* FF_USE_EXPAND && !FF_FS_READONLY */\n\n\n\n#if FF_USE_FORWARD\n/*-----------------------------------------------------------------------*/\n/* Forward Data to the Stream Directly                                   */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_forward (\n\tFIL* fp, \t\t\t\t\t\t/* Pointer to the file object */\n\tUINT (*func)(const BYTE*,UINT),\t/* Pointer to the streaming function */\n\tUINT btf,\t\t\t\t\t\t/* Number of bytes to forward */\n\tUINT* bf\t\t\t\t\t\t/* Pointer to number of bytes forwarded */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD clst, sect;\n\tFSIZE_t remain;\n\tUINT rcnt, csect;\n\tBYTE *dbuf;\n\n\n\t*bf = 0;\t/* Clear transfer byte counter */\n\tres = validate(&fp->obj, &fs);\t\t/* Check validity of the file object */\n\tif (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);\n\tif (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED);\t/* Check access mode */\n\n\tremain = fp->obj.objsize - fp->fptr;\n\tif (btf > remain) btf = (UINT)remain;\t\t\t/* Truncate btf by remaining bytes */\n\n\tfor ( ;  btf && (*func)(0, 0);\t\t\t\t\t/* Repeat until all data transferred or stream goes busy */\n\t\tfp->fptr += rcnt, *bf += rcnt, btf -= rcnt) {\n\t\tcsect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1));\t/* Sector offset in the cluster */\n\t\tif (fp->fptr % SS(fs) == 0) {\t\t\t\t/* On the sector boundary? */\n\t\t\tif (csect == 0) {\t\t\t\t\t\t/* On the cluster boundary? */\n\t\t\t\tclst = (fp->fptr == 0) ?\t\t\t/* On the top of the file? */\n\t\t\t\t\tfp->obj.sclust : get_fat(&fp->obj, fp->clust);\n\t\t\t\tif (clst <= 1) ABORT(fs, FR_INT_ERR);\n\t\t\t\tif (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->clust = clst;\t\t\t\t\t/* Update current cluster */\n\t\t\t}\n\t\t}\n\t\tsect = clst2sect(fs, fp->clust);\t\t\t/* Get current data sector */\n\t\tif (sect == 0) ABORT(fs, FR_INT_ERR);\n\t\tsect += csect;\n#if FF_FS_TINY\n\t\tif (move_window(fs, sect) != FR_OK) ABORT(fs, FR_DISK_ERR);\t/* Move sector window to the file data */\n\t\tdbuf = fs->win;\n#else\n\t\tif (fp->sect != sect) {\t\t/* Fill sector cache with file data */\n#if !FF_FS_READONLY\n\t\t\tif (fp->flag & FA_DIRTY) {\t\t/* Write-back dirty sector cache */\n\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t}\n#endif\n\t\t\tif (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t}\n\t\tdbuf = fp->buf;\n#endif\n\t\tfp->sect = sect;\n\t\trcnt = SS(fs) - (UINT)fp->fptr % SS(fs);\t/* Number of bytes left in the sector */\n\t\tif (rcnt > btf) rcnt = btf;\t\t\t\t\t/* Clip it by btr if needed */\n\t\trcnt = (*func)(dbuf + ((UINT)fp->fptr % SS(fs)), rcnt);\t/* Forward the file data */\n\t\tif (rcnt == 0) ABORT(fs, FR_INT_ERR);\n\t}\n\n\tLEAVE_FF(fs, FR_OK);\n}\n#endif /* FF_USE_FORWARD */\n\n\n\n#if FF_USE_MKFS && !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Create an FAT/exFAT volume                                            */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_mkfs (\n\tconst TCHAR* path,\t/* Logical drive number */\n\tBYTE opt,\t\t\t/* Format option */\n\tDWORD au,\t\t\t/* Size of allocation unit (cluster) [byte] */\n\tvoid* work,\t\t\t/* Pointer to working buffer (null: use heap memory) */\n\tUINT len\t\t\t/* Size of working buffer [byte] */\n)\n{\n\tconst UINT n_fats = 1;\t\t/* Number of FATs for FAT/FAT32 volume (1 or 2) */\n\tconst UINT n_rootdir = 512;\t/* Number of root directory entries for FAT volume */\n\tstatic const WORD cst[] = {1, 4, 16, 64, 256, 512, 0};\t/* Cluster size boundary for FAT volume (4Ks unit) */\n\tstatic const WORD cst32[] = {1, 2, 4, 8, 16, 32, 0};\t/* Cluster size boundary for FAT32 volume (128Ks unit) */\n\tBYTE fmt, sys, *buf, *pte, pdrv, part;\n\tWORD ss;\t/* Sector size */\n\tDWORD szb_buf, sz_buf, sz_blk, n_clst, pau, sect, nsect, n;\n\tDWORD b_vol, b_fat, b_data;\t\t\t\t/* Base LBA for volume, fat, data */\n\tDWORD sz_vol, sz_rsv, sz_fat, sz_dir;\t/* Size for volume, fat, dir, data */\n\tUINT i;\n\tint vol;\n\tDSTATUS stat;\n#if FF_USE_TRIM || FF_FS_EXFAT\n\tDWORD tbl[3];\n#endif\n\n\n\t/* Check mounted drive and clear work area */\n\tvol = get_ldnumber(&path);\t\t\t\t\t/* Get target logical drive */\n\tif (vol < 0) return FR_INVALID_DRIVE;\n\tif (FatFs[vol]) FatFs[vol]->fs_type = 0;\t/* Clear the volume if mounted */\n\tpdrv = LD2PD(vol);\t/* Physical drive */\n\tpart = LD2PT(vol);\t/* Partition (0:create as new, 1-4:get from partition table) */\n\n\t/* Check physical drive status */\n\tstat = disk_initialize(pdrv);\n\tif (stat & STA_NOINIT) return FR_NOT_READY;\n\tif (stat & STA_PROTECT) return FR_WRITE_PROTECTED;\n\tif (disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_blk) != RES_OK || !sz_blk || sz_blk > 32768 || (sz_blk & (sz_blk - 1))) sz_blk = 1;\t/* Erase block to align data area */\n#if FF_MAX_SS != FF_MIN_SS\t\t/* Get sector size of the medium if variable sector size cfg. */\n\tif (disk_ioctl(pdrv, GET_SECTOR_SIZE, &ss) != RES_OK) return FR_DISK_ERR;\n\tif (ss > FF_MAX_SS || ss < FF_MIN_SS || (ss & (ss - 1))) return FR_DISK_ERR;\n#else\n\tss = FF_MAX_SS;\n#endif\n\tif ((au != 0 && au < ss) || au > 0x1000000 || (au & (au - 1))) return FR_INVALID_PARAMETER;\t/* Check if au is valid */\n\tau /= ss;\t/* Cluster size in unit of sector */\n\n\t/* Get working buffer */\n#if FF_USE_LFN == 3\n\tif (!work) {\t/* Use heap memory for working buffer */\n\t\tfor (szb_buf = MAX_MALLOC, buf = 0; szb_buf >= ss && (buf = ff_memalloc(szb_buf)) == 0; szb_buf /= 2) ;\n\t\tsz_buf = szb_buf / ss;\t\t/* Size of working buffer (sector) */\n\t} else\n#endif\n\t{\n\t\tbuf = (BYTE*)work;\t\t/* Working buffer */\n\t\tsz_buf = len / ss;\t\t/* Size of working buffer (sector) */\n\t\tszb_buf = sz_buf * ss;\t/* Size of working buffer (byte) */\n\t}\n\tif (!buf || sz_buf == 0) return FR_NOT_ENOUGH_CORE;\n\n\t/* Determine where the volume to be located (b_vol, sz_vol) */\n\tif (FF_MULTI_PARTITION && part != 0) {\n\t\t/* Get partition information from partition table in the MBR */\n\t\tif (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Load MBR */\n\t\tif (ld_word(buf + BS_55AA) != 0xAA55) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Check if MBR is valid */\n\t\tpte = buf + (MBR_Table + (part - 1) * SZ_PTE);\n\t\tif (pte[PTE_System] == 0) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* No partition? */\n\t\tb_vol = ld_dword(pte + PTE_StLba);\t\t/* Get volume start sector */\n\t\tsz_vol = ld_dword(pte + PTE_SizLba);\t/* Get volume size */\n\t} else {\n\t\t/* Create a single-partition in this function */\n\t\tif (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_vol) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\tb_vol = (opt & FM_SFD) ? 0 : 63;\t\t/* Volume start sector */\n\t\tif (sz_vol < b_vol) LEAVE_MKFS(FR_MKFS_ABORTED);\n\t\tsz_vol -= b_vol;\t\t\t\t\t\t/* Volume size */\n\t}\n\tif (sz_vol < 128) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Check if volume size is >=128s */\n\n\t/* Pre-determine the FAT type */\n\tdo {\n\t\tif (FF_FS_EXFAT && (opt & FM_EXFAT)) {\t/* exFAT possible? */\n\t\t\tif ((opt & FM_ANY) == FM_EXFAT || sz_vol >= 0x4000000 || au > 128) {\t/* exFAT only, vol >= 64Ms or au > 128s ? */\n\t\t\t\tfmt = FS_EXFAT; break;\n\t\t\t}\n\t\t}\n\t\tif (au > 128) LEAVE_MKFS(FR_INVALID_PARAMETER);\t/* Too large au for FAT/FAT32 */\n\t\tif (opt & FM_FAT32) {\t/* FAT32 possible? */\n\t\t\tif ((opt & FM_ANY) == FM_FAT32 || !(opt & FM_FAT)) {\t/* FAT32 only or no-FAT? */\n\t\t\t\tfmt = FS_FAT32; break;\n\t\t\t}\n\t\t}\n\t\tif (!(opt & FM_FAT)) LEAVE_MKFS(FR_INVALID_PARAMETER);\t/* no-FAT? */\n\t\tfmt = FS_FAT16;\n\t} while (0);\n\n#if FF_FS_EXFAT\n\tif (fmt == FS_EXFAT) {\t/* Create an exFAT volume */\n\t\tDWORD szb_bit, szb_case, sum, nb, cl;\n\t\tWCHAR ch, si;\n\t\tUINT j, st;\n\t\tBYTE b;\n\n\t\tif (sz_vol < 0x1000) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too small volume? */\n#if FF_USE_TRIM\n\t\ttbl[0] = b_vol; tbl[1] = b_vol + sz_vol - 1;\t/* Inform the device the volume area may be erased */\n\t\tdisk_ioctl(pdrv, CTRL_TRIM, tbl);\n#endif\n\t\t/* Determine FAT location, data location and number of clusters */\n\t\tif (au == 0) {\t/* au auto-selection */\n\t\t\tau = 8;\n\t\t\tif (sz_vol >= 0x80000) au = 64;\t\t/* >= 512Ks */\n\t\t\tif (sz_vol >= 0x4000000) au = 256;\t/* >= 64Ms */\n\t\t}\n\t\tb_fat = b_vol + 32;\t\t\t\t\t\t\t\t\t\t/* FAT start at offset 32 */\n\t\tsz_fat = ((sz_vol / au + 2) * 4 + ss - 1) / ss;\t\t\t/* Number of FAT sectors */\n\t\tb_data = (b_fat + sz_fat + sz_blk - 1) & ~(sz_blk - 1);\t/* Align data area to the erase block boundary */\n\t\tif (b_data >= sz_vol / 2) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too small volume? */\n\t\tn_clst = (sz_vol - (b_data - b_vol)) / au;\t\t\t\t/* Number of clusters */\n\t\tif (n_clst <16) LEAVE_MKFS(FR_MKFS_ABORTED);\t\t\t/* Too few clusters? */\n\t\tif (n_clst > MAX_EXFAT) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too many clusters? */\n\n\t\tszb_bit = (n_clst + 7) / 8;\t\t\t\t\t\t/* Size of allocation bitmap */\n\t\ttbl[0] = (szb_bit + au * ss - 1) / (au * ss);\t/* Number of allocation bitmap clusters */\n\n\t\t/* Create a compressed up-case table */\n\t\tsect = b_data + au * tbl[0];\t/* Table start sector */\n\t\tsum = 0;\t\t\t\t\t\t/* Table checksum to be stored in the 82 entry */\n\t\tst = 0; si = 0; i = 0; j = 0; szb_case = 0;\n\t\tdo {\n\t\t\tswitch (st) {\n\t\t\tcase 0:\n\t\t\t\tch = (WCHAR)ff_wtoupper(si);\t/* Get an up-case char */\n\t\t\t\tif (ch != si) {\n\t\t\t\t\tsi++; break;\t\t/* Store the up-case char if exist */\n\t\t\t\t}\n\t\t\t\tfor (j = 1; (WCHAR)(si + j) && (WCHAR)(si + j) == ff_wtoupper((WCHAR)(si + j)); j++) ;\t/* Get run length of no-case block */\n\t\t\t\tif (j >= 128) {\n\t\t\t\t\tch = 0xFFFF; st = 2; break;\t/* Compress the no-case block if run is >= 128 */\n\t\t\t\t}\n\t\t\t\tst = 1;\t\t\t/* Do not compress short run */\n\t\t\t\t/* go to next case */\n\t\t\tcase 1:\n\t\t\t\tch = si++;\t\t/* Fill the short run */\n\t\t\t\tif (--j == 0) st = 0;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tch = (WCHAR)j; si += (WCHAR)j;\t/* Number of chars to skip */\n\t\t\t\tst = 0;\n\t\t\t}\n\t\t\tsum = xsum32(buf[i + 0] = (BYTE)ch, sum);\t\t/* Put it into the write buffer */\n\t\t\tsum = xsum32(buf[i + 1] = (BYTE)(ch >> 8), sum);\n\t\t\ti += 2; szb_case += 2;\n\t\t\tif (si == 0 || i == szb_buf) {\t\t/* Write buffered data when buffer full or end of process */\n\t\t\t\tn = (i + ss - 1) / ss;\n\t\t\t\tif (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\t\tsect += n; i = 0;\n\t\t\t}\n\t\t} while (si);\n\t\ttbl[1] = (szb_case + au * ss - 1) / (au * ss);\t/* Number of up-case table clusters */\n\t\ttbl[2] = 1;\t\t\t\t\t\t\t\t\t\t/* Number of root dir clusters */\n\n\t\t/* Initialize the allocation bitmap */\n\t\tsect = b_data; nsect = (szb_bit + ss - 1) / ss;\t/* Start of bitmap and number of sectors */\n\t\tnb = tbl[0] + tbl[1] + tbl[2];\t\t\t\t\t/* Number of clusters in-use by system */\n\t\tdo {\n\t\t\tmem_set(buf, 0, szb_buf);\n\t\t\tfor (i = 0; nb >= 8 && i < szb_buf; buf[i++] = 0xFF, nb -= 8) ;\n\t\t\tfor (b = 1; nb != 0 && i < szb_buf; buf[i] |= b, b <<= 1, nb--) ;\n\t\t\tn = (nsect > sz_buf) ? sz_buf : nsect;\t\t/* Write the buffered data */\n\t\t\tif (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\tsect += n; nsect -= n;\n\t\t} while (nsect);\n\n\t\t/* Initialize the FAT */\n\t\tsect = b_fat; nsect = sz_fat;\t/* Start of FAT and number of FAT sectors */\n\t\tj = nb = cl = 0;\n\t\tdo {\n\t\t\tmem_set(buf, 0, szb_buf); i = 0;\t/* Clear work area and reset write index */\n\t\t\tif (cl == 0) {\t/* Set entry 0 and 1 */\n\t\t\t\tst_dword(buf + i, 0xFFFFFFF8); i += 4; cl++;\n\t\t\t\tst_dword(buf + i, 0xFFFFFFFF); i += 4; cl++;\n\t\t\t}\n\t\t\tdo {\t\t\t/* Create chains of bitmap, up-case and root dir */\n\t\t\t\twhile (nb != 0 && i < szb_buf) {\t\t\t/* Create a chain */\n\t\t\t\t\tst_dword(buf + i, (nb > 1) ? cl + 1 : 0xFFFFFFFF);\n\t\t\t\t\ti += 4; cl++; nb--;\n\t\t\t\t}\n\t\t\t\tif (nb == 0 && j < 3) nb = tbl[j++];\t/* Next chain */\n\t\t\t} while (nb != 0 && i < szb_buf);\n\t\t\tn = (nsect > sz_buf) ? sz_buf : nsect;\t/* Write the buffered data */\n\t\t\tif (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\tsect += n; nsect -= n;\n\t\t} while (nsect);\n\n\t\t/* Initialize the root directory */\n\t\tmem_set(buf, 0, szb_buf);\n\t\tbuf[SZDIRE * 0 + 0] = 0x83;\t\t/* 83 entry (volume label) */\n\t\tbuf[SZDIRE * 1 + 0] = 0x81;\t\t/* 81 entry (allocation bitmap) */\n\t\tst_dword(buf + SZDIRE * 1 + 20, 2);\t\t\t\t/* cluster */\n\t\tst_dword(buf + SZDIRE * 1 + 24, szb_bit);\t\t/* size */\n\t\tbuf[SZDIRE * 2 + 0] = 0x82;\t\t/* 82 entry (up-case table) */\n\t\tst_dword(buf + SZDIRE * 2 + 4, sum);\t\t\t/* sum */\n\t\tst_dword(buf + SZDIRE * 2 + 20, 2 + tbl[0]);\t/* cluster */\n\t\tst_dword(buf + SZDIRE * 2 + 24, szb_case);\t\t/* size */\n\t\tsect = b_data + au * (tbl[0] + tbl[1]);\tnsect = au;\t/* Start of the root directory and number of sectors */\n\t\tdo {\t/* Fill root directory sectors */\n\t\t\tn = (nsect > sz_buf) ? sz_buf : nsect;\n\t\t\tif (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\tmem_set(buf, 0, ss);\n\t\t\tsect += n; nsect -= n;\n\t\t} while (nsect);\n\n\t\t/* Create two set of the exFAT VBR blocks */\n\t\tsect = b_vol;\n\t\tfor (n = 0; n < 2; n++) {\n\t\t\t/* Main record (+0) */\n\t\t\tmem_set(buf, 0, ss);\n\t\t\tmem_cpy(buf + BS_JmpBoot, \"\\xEB\\x76\\x90\" \"EXFAT   \", 11);\t/* Boot jump code (x86), OEM name */\n\t\t\tst_dword(buf + BPB_VolOfsEx, b_vol);\t\t\t\t\t/* Volume offset in the physical drive [sector] */\n\t\t\tst_dword(buf + BPB_TotSecEx, sz_vol);\t\t\t\t\t/* Volume size [sector] */\n\t\t\tst_dword(buf + BPB_FatOfsEx, b_fat - b_vol);\t\t\t/* FAT offset [sector] */\n\t\t\tst_dword(buf + BPB_FatSzEx, sz_fat);\t\t\t\t\t/* FAT size [sector] */\n\t\t\tst_dword(buf + BPB_DataOfsEx, b_data - b_vol);\t\t\t/* Data offset [sector] */\n\t\t\tst_dword(buf + BPB_NumClusEx, n_clst);\t\t\t\t\t/* Number of clusters */\n\t\t\tst_dword(buf + BPB_RootClusEx, 2 + tbl[0] + tbl[1]);\t/* Root dir cluster # */\n\t\t\tst_dword(buf + BPB_VolIDEx, GET_FATTIME());\t\t\t\t/* VSN */\n\t\t\tst_word(buf + BPB_FSVerEx, 0x100);\t\t\t\t\t\t/* Filesystem version (1.00) */\n\t\t\tfor (buf[BPB_BytsPerSecEx] = 0, i = ss; i >>= 1; buf[BPB_BytsPerSecEx]++) ;\t/* Log2 of sector size [byte] */\n\t\t\tfor (buf[BPB_SecPerClusEx] = 0, i = au; i >>= 1; buf[BPB_SecPerClusEx]++) ;\t/* Log2 of cluster size [sector] */\n\t\t\tbuf[BPB_NumFATsEx] = 1;\t\t\t\t\t/* Number of FATs */\n\t\t\tbuf[BPB_DrvNumEx] = 0x80;\t\t\t\t/* Drive number (for int13) */\n\t\t\tst_word(buf + BS_BootCodeEx, 0xFEEB);\t/* Boot code (x86) */\n\t\t\tst_word(buf + BS_55AA, 0xAA55);\t\t\t/* Signature (placed here regardless of sector size) */\n\t\t\tfor (i = sum = 0; i < ss; i++) {\t\t/* VBR checksum */\n\t\t\t\tif (i != BPB_VolFlagEx && i != BPB_VolFlagEx + 1 && i != BPB_PercInUseEx) sum = xsum32(buf[i], sum);\n\t\t\t}\n\t\t\tif (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\t/* Extended bootstrap record (+1..+8) */\n\t\t\tmem_set(buf, 0, ss);\n\t\t\tst_word(buf + ss - 2, 0xAA55);\t/* Signature (placed at end of sector) */\n\t\t\tfor (j = 1; j < 9; j++) {\n\t\t\t\tfor (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ;\t/* VBR checksum */\n\t\t\t\tif (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\t}\n\t\t\t/* OEM/Reserved record (+9..+10) */\n\t\t\tmem_set(buf, 0, ss);\n\t\t\tfor ( ; j < 11; j++) {\n\t\t\t\tfor (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ;\t/* VBR checksum */\n\t\t\t\tif (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\t}\n\t\t\t/* Sum record (+11) */\n\t\t\tfor (i = 0; i < ss; i += 4) st_dword(buf + i, sum);\t\t/* Fill with checksum value */\n\t\t\tif (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t}\n\n\t} else\n#endif\t/* FF_FS_EXFAT */\n\t{\t/* Create an FAT/FAT32 volume */\n\t\tdo {\n\t\t\tpau = au;\n\t\t\t/* Pre-determine number of clusters and FAT sub-type */\n\t\t\tif (fmt == FS_FAT32) {\t/* FAT32 volume */\n\t\t\t\tif (pau == 0) {\t/* au auto-selection */\n\t\t\t\t\tn = sz_vol / 0x20000;\t/* Volume size in unit of 128KS */\n\t\t\t\t\tfor (i = 0, pau = 1; cst32[i] && cst32[i] <= n; i++, pau <<= 1) ;\t/* Get from table */\n\t\t\t\t}\n\t\t\t\tn_clst = sz_vol / pau;\t/* Number of clusters */\n\t\t\t\tsz_fat = (n_clst * 4 + 8 + ss - 1) / ss;\t/* FAT size [sector] */\n\t\t\t\tsz_rsv = 32;\t/* Number of reserved sectors */\n\t\t\t\tsz_dir = 0;\t\t/* No static directory */\n\t\t\t\tif (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) LEAVE_MKFS(FR_MKFS_ABORTED);\n\t\t\t} else {\t\t\t\t/* FAT volume */\n\t\t\t\tif (pau == 0) {\t/* au auto-selection */\n\t\t\t\t\tn = sz_vol / 0x1000;\t/* Volume size in unit of 4KS */\n\t\t\t\t\tfor (i = 0, pau = 1; cst[i] && cst[i] <= n; i++, pau <<= 1) ;\t/* Get from table */\n\t\t\t\t}\n\t\t\t\tn_clst = sz_vol / pau;\n\t\t\t\tif (n_clst > MAX_FAT12) {\n\t\t\t\t\tn = n_clst * 2 + 4;\t\t/* FAT size [byte] */\n\t\t\t\t} else {\n\t\t\t\t\tfmt = FS_FAT12;\n\t\t\t\t\tn = (n_clst * 3 + 1) / 2 + 3;\t/* FAT size [byte] */\n\t\t\t\t}\n\t\t\t\tsz_fat = (n + ss - 1) / ss;\t\t/* FAT size [sector] */\n\t\t\t\tsz_rsv = 1;\t\t\t\t\t\t/* Number of reserved sectors */\n\t\t\t\tsz_dir = (DWORD)n_rootdir * SZDIRE / ss;\t/* Rootdir size [sector] */\n\t\t\t}\n\t\t\tb_fat = b_vol + sz_rsv;\t\t\t\t\t\t/* FAT base */\n\t\t\tb_data = b_fat + sz_fat * n_fats + sz_dir;\t/* Data base */\n\n\t\t\t/* Align data base to erase block boundary (for flash memory media) */\n\t\t\tn = ((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data;\t/* Next nearest erase block from current data base */\n\t\t\tif (fmt == FS_FAT32) {\t\t/* FAT32: Move FAT base */\n\t\t\t\tsz_rsv += n; b_fat += n;\n\t\t\t} else {\t\t\t\t\t/* FAT: Expand FAT size */\n\t\t\t\tsz_fat += n / n_fats;\n\t\t\t}\n\n\t\t\t/* Determine number of clusters and final check of validity of the FAT sub-type */\n\t\t\tif (sz_vol < b_data + pau * 16 - b_vol) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too small volume */\n\t\t\tn_clst = (sz_vol - sz_rsv - sz_fat * n_fats - sz_dir) / pau;\n\t\t\tif (fmt == FS_FAT32) {\n\t\t\t\tif (n_clst <= MAX_FAT16) {\t/* Too few clusters for FAT32 */\n\t\t\t\t\tif (au == 0 && (au = pau / 2) != 0) continue;\t/* Adjust cluster size and retry */\n\t\t\t\t\tLEAVE_MKFS(FR_MKFS_ABORTED);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (fmt == FS_FAT16) {\n\t\t\t\tif (n_clst > MAX_FAT16) {\t/* Too many clusters for FAT16 */\n\t\t\t\t\tif (au == 0 && (pau * 2) <= 64) {\n\t\t\t\t\t\tau = pau * 2; continue;\t\t/* Adjust cluster size and retry */\n\t\t\t\t\t}\n\t\t\t\t\tif ((opt & FM_FAT32)) {\n\t\t\t\t\t\tfmt = FS_FAT32; continue;\t/* Switch type to FAT32 and retry */\n\t\t\t\t\t}\n\t\t\t\t\tif (au == 0 && (au = pau * 2) <= 128) continue;\t/* Adjust cluster size and retry */\n\t\t\t\t\tLEAVE_MKFS(FR_MKFS_ABORTED);\n\t\t\t\t}\n\t\t\t\tif  (n_clst <= MAX_FAT12) {\t/* Too few clusters for FAT16 */\n\t\t\t\t\tif (au == 0 && (au = pau * 2) <= 128) continue;\t/* Adjust cluster size and retry */\n\t\t\t\t\tLEAVE_MKFS(FR_MKFS_ABORTED);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (fmt == FS_FAT12 && n_clst > MAX_FAT12) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too many clusters for FAT12 */\n\n\t\t\t/* Ok, it is the valid cluster configuration */\n\t\t\tbreak;\n\t\t} while (1);\n\n#if FF_USE_TRIM\n\t\ttbl[0] = b_vol; tbl[1] = b_vol + sz_vol - 1;\t/* Inform the device the volume area can be erased */\n\t\tdisk_ioctl(pdrv, CTRL_TRIM, tbl);\n#endif\n\t\t/* Create FAT VBR */\n\t\tmem_set(buf, 0, ss);\n\t\tmem_cpy(buf + BS_JmpBoot, \"\\xEB\\xFE\\x90\" \"MSDOS5.0\", 11);/* Boot jump code (x86), OEM name */\n\t\tst_word(buf + BPB_BytsPerSec, ss);\t\t\t\t/* Sector size [byte] */\n\t\tbuf[BPB_SecPerClus] = (BYTE)pau;\t\t\t\t/* Cluster size [sector] */\n\t\tst_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv);\t/* Size of reserved area */\n\t\tbuf[BPB_NumFATs] = (BYTE)n_fats;\t\t\t\t/* Number of FATs */\n\t\tst_word(buf + BPB_RootEntCnt, (WORD)((fmt == FS_FAT32) ? 0 : n_rootdir));\t/* Number of root directory entries */\n\t\tif (sz_vol < 0x10000) {\n\t\t\tst_word(buf + BPB_TotSec16, (WORD)sz_vol);\t/* Volume size in 16-bit LBA */\n\t\t} else {\n\t\t\tst_dword(buf + BPB_TotSec32, sz_vol);\t\t/* Volume size in 32-bit LBA */\n\t\t}\n\t\tbuf[BPB_Media] = 0xF8;\t\t\t\t\t\t\t/* Media descriptor byte */\n\t\tst_word(buf + BPB_SecPerTrk, 63);\t\t\t\t/* Number of sectors per track (for int13) */\n\t\tst_word(buf + BPB_NumHeads, 255);\t\t\t\t/* Number of heads (for int13) */\n\t\tst_dword(buf + BPB_HiddSec, b_vol);\t\t\t\t/* Volume offset in the physical drive [sector] */\n\t\tif (fmt == FS_FAT32) {\n\t\t\tst_dword(buf + BS_VolID32, GET_FATTIME());\t/* VSN */\n\t\t\tst_dword(buf + BPB_FATSz32, sz_fat);\t\t/* FAT size [sector] */\n\t\t\tst_dword(buf + BPB_RootClus32, 2);\t\t\t/* Root directory cluster # (2) */\n\t\t\tst_word(buf + BPB_FSInfo32, 1);\t\t\t\t/* Offset of FSINFO sector (VBR + 1) */\n\t\t\tst_word(buf + BPB_BkBootSec32, 6);\t\t\t/* Offset of backup VBR (VBR + 6) */\n\t\t\tbuf[BS_DrvNum32] = 0x80;\t\t\t\t\t/* Drive number (for int13) */\n\t\t\tbuf[BS_BootSig32] = 0x29;\t\t\t\t\t/* Extended boot signature */\n\t\t\tmem_cpy(buf + BS_VolLab32, \"NO NAME    \" \"FAT32   \", 19);\t/* Volume label, FAT signature */\n\t\t} else {\n\t\t\tst_dword(buf + BS_VolID, GET_FATTIME());\t/* VSN */\n\t\t\tst_word(buf + BPB_FATSz16, (WORD)sz_fat);\t/* FAT size [sector] */\n\t\t\tbuf[BS_DrvNum] = 0x80;\t\t\t\t\t\t/* Drive number (for int13) */\n\t\t\tbuf[BS_BootSig] = 0x29;\t\t\t\t\t\t/* Extended boot signature */\n\t\t\tmem_cpy(buf + BS_VolLab, \"NO NAME    \" \"FAT     \", 19);\t/* Volume label, FAT signature */\n\t\t}\n\t\tst_word(buf + BS_55AA, 0xAA55);\t\t\t\t\t/* Signature (offset is fixed here regardless of sector size) */\n\t\tif (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Write it to the VBR sector */\n\n\t\t/* Create FSINFO record if needed */\n\t\tif (fmt == FS_FAT32) {\n\t\t\tdisk_write(pdrv, buf, b_vol + 6, 1);\t\t/* Write backup VBR (VBR + 6) */\n\t\t\tmem_set(buf, 0, ss);\n\t\t\tst_dword(buf + FSI_LeadSig, 0x41615252);\n\t\t\tst_dword(buf + FSI_StrucSig, 0x61417272);\n\t\t\tst_dword(buf + FSI_Free_Count, n_clst - 1);\t/* Number of free clusters */\n\t\t\tst_dword(buf + FSI_Nxt_Free, 2);\t\t\t/* Last allocated cluster# */\n\t\t\tst_word(buf + BS_55AA, 0xAA55);\n\t\t\tdisk_write(pdrv, buf, b_vol + 7, 1);\t\t/* Write backup FSINFO (VBR + 7) */\n\t\t\tdisk_write(pdrv, buf, b_vol + 1, 1);\t\t/* Write original FSINFO (VBR + 1) */\n\t\t}\n\n\t\t/* Initialize FAT area */\n\t\tmem_set(buf, 0, (UINT)szb_buf);\n\t\tsect = b_fat;\t\t/* FAT start sector */\n\t\tfor (i = 0; i < n_fats; i++) {\t\t\t/* Initialize FATs each */\n\t\t\tif (fmt == FS_FAT32) {\n\t\t\t\tst_dword(buf + 0, 0xFFFFFFF8);\t/* Entry 0 */\n\t\t\t\tst_dword(buf + 4, 0xFFFFFFFF);\t/* Entry 1 */\n\t\t\t\tst_dword(buf + 8, 0x0FFFFFFF);\t/* Entry 2 (root directory) */\n\t\t\t} else {\n\t\t\t\tst_dword(buf + 0, (fmt == FS_FAT12) ? 0xFFFFF8 : 0xFFFFFFF8);\t/* Entry 0 and 1 */\n\t\t\t}\n\t\t\tnsect = sz_fat;\t\t/* Number of FAT sectors */\n\t\t\tdo {\t/* Fill FAT sectors */\n\t\t\t\tn = (nsect > sz_buf) ? sz_buf : nsect;\n\t\t\t\tif (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\t\tmem_set(buf, 0, ss);\n\t\t\t\tsect += n; nsect -= n;\n\t\t\t} while (nsect);\n\t\t}\n\n\t\t/* Initialize root directory (fill with zero) */\n\t\tnsect = (fmt == FS_FAT32) ? pau : sz_dir;\t/* Number of root directory sectors */\n\t\tdo {\n\t\t\tn = (nsect > sz_buf) ? sz_buf : nsect;\n\t\t\tif (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\tsect += n; nsect -= n;\n\t\t} while (nsect);\n\t}\n\n\t/* Determine system ID in the partition table */\n\tif (FF_FS_EXFAT && fmt == FS_EXFAT) {\n\t\tsys = 0x07;\t\t\t/* HPFS/NTFS/exFAT */\n\t} else {\n\t\tif (fmt == FS_FAT32) {\n\t\t\tsys = 0x0C;\t\t/* FAT32X */\n\t\t} else {\n\t\t\tif (sz_vol >= 0x10000) {\n\t\t\t\tsys = 0x06;\t/* FAT12/16 (large) */\n\t\t\t} else {\n\t\t\t\tsys = (fmt == FS_FAT16) ? 0x04 : 0x01;\t/* FAT16 : FAT12 */\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Update partition information */\n\tif (FF_MULTI_PARTITION && part != 0) {\t/* Created in the existing partition */\n\t\t/* Update system ID in the partition table */\n\t\tif (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Read the MBR */\n\t\tbuf[MBR_Table + (part - 1) * SZ_PTE + PTE_System] = sys;\t\t/* Set system ID */\n\t\tif (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Write it back to the MBR */\n\t} else {\t\t\t\t\t\t\t\t/* Created as a new single partition */\n\t\tif (!(opt & FM_SFD)) {\t/* Create partition table if in FDISK format */\n\t\t\tmem_set(buf, 0, ss);\n\t\t\tst_word(buf + BS_55AA, 0xAA55);\t\t/* MBR signature */\n\t\t\tpte = buf + MBR_Table;\t\t\t\t/* Create partition table for single partition in the drive */\n\t\t\tpte[PTE_Boot] = 0;\t\t\t\t\t/* Boot indicator */\n\t\t\tpte[PTE_StHead] = 1;\t\t\t\t/* Start head */\n\t\t\tpte[PTE_StSec] = 1;\t\t\t\t\t/* Start sector */\n\t\t\tpte[PTE_StCyl] = 0;\t\t\t\t\t/* Start cylinder */\n\t\t\tpte[PTE_System] = sys;\t\t\t\t/* System type */\n\t\t\tn = (b_vol + sz_vol) / (63 * 255);\t/* (End CHS may be invalid) */\n\t\t\tpte[PTE_EdHead] = 254;\t\t\t\t/* End head */\n\t\t\tpte[PTE_EdSec] = (BYTE)(((n >> 2) & 0xC0) | 63);\t/* End sector */\n\t\t\tpte[PTE_EdCyl] = (BYTE)n;\t\t\t/* End cylinder */\n\t\t\tst_dword(pte + PTE_StLba, b_vol);\t/* Start offset in LBA */\n\t\t\tst_dword(pte + PTE_SizLba, sz_vol);\t/* Size in sectors */\n\t\t\tif (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Write it to the MBR */\n\t\t}\n\t}\n\n\tif (disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\n\tLEAVE_MKFS(FR_OK);\n}\n\n\n\n#if FF_MULTI_PARTITION\n/*-----------------------------------------------------------------------*/\n/* Create Partition Table on the Physical Drive                          */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_fdisk (\n\tBYTE pdrv,\t\t\t/* Physical drive number */\n\tconst DWORD* szt,\t/* Pointer to the size table for each partitions */\n\tvoid* work\t\t\t/* Pointer to the working buffer (null: use heap memory) */\n)\n{\n\tUINT i, n, sz_cyl, tot_cyl, b_cyl, e_cyl, p_cyl;\n\tBYTE s_hd, e_hd, *p, *buf = (BYTE*)work;\n\tDSTATUS stat;\n\tDWORD sz_disk, sz_part, s_part;\n\tFRESULT res;\n\n\n\tstat = disk_initialize(pdrv);\n\tif (stat & STA_NOINIT) return FR_NOT_READY;\n\tif (stat & STA_PROTECT) return FR_WRITE_PROTECTED;\n\tif (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_disk)) return FR_DISK_ERR;\n\n\tbuf = (BYTE*)work;\n#if FF_USE_LFN == 3\n\tif (!buf) buf = ff_memalloc(FF_MAX_SS);\t/* Use heap memory for working buffer */\n#endif\n\tif (!buf) return FR_NOT_ENOUGH_CORE;\n\n\t/* Determine the CHS without any consideration of the drive geometry */\n\tfor (n = 16; n < 256 && sz_disk / n / 63 > 1024; n *= 2) ;\n\tif (n == 256) n--;\n\te_hd = (BYTE)(n - 1);\n\tsz_cyl = 63 * n;\n\ttot_cyl = sz_disk / sz_cyl;\n\n\t/* Create partition table */\n\tmem_set(buf, 0, FF_MAX_SS);\n\tp = buf + MBR_Table; b_cyl = 0;\n\tfor (i = 0; i < 4; i++, p += SZ_PTE) {\n\t\tp_cyl = (szt[i] <= 100U) ? (DWORD)tot_cyl * szt[i] / 100 : szt[i] / sz_cyl;\t/* Number of cylinders */\n\t\tif (p_cyl == 0) continue;\n\t\ts_part = (DWORD)sz_cyl * b_cyl;\n\t\tsz_part = (DWORD)sz_cyl * p_cyl;\n\t\tif (i == 0) {\t/* Exclude first track of cylinder 0 */\n\t\t\ts_hd = 1;\n\t\t\ts_part += 63; sz_part -= 63;\n\t\t} else {\n\t\t\ts_hd = 0;\n\t\t}\n\t\te_cyl = b_cyl + p_cyl - 1;\t/* End cylinder */\n\t\tif (e_cyl >= tot_cyl) LEAVE_MKFS(FR_INVALID_PARAMETER);\n\n\t\t/* Set partition table */\n\t\tp[1] = s_hd;\t\t\t\t\t\t/* Start head */\n\t\tp[2] = (BYTE)(((b_cyl >> 2) & 0xC0) | 1);\t/* Start sector */\n\t\tp[3] = (BYTE)b_cyl;\t\t\t\t\t/* Start cylinder */\n\t\tp[4] = 0x07;\t\t\t\t\t\t/* System type (temporary setting) */\n\t\tp[5] = e_hd;\t\t\t\t\t\t/* End head */\n\t\tp[6] = (BYTE)(((e_cyl >> 2) & 0xC0) | 63);\t/* End sector */\n\t\tp[7] = (BYTE)e_cyl;\t\t\t\t\t/* End cylinder */\n\t\tst_dword(p + 8, s_part);\t\t\t/* Start sector in LBA */\n\t\tst_dword(p + 12, sz_part);\t\t\t/* Number of sectors */\n\n\t\t/* Next partition */\n\t\tb_cyl += p_cyl;\n\t}\n\tst_word(p, 0xAA55);\t\t/* MBR signature (always at offset 510) */\n\n\t/* Write it to the MBR */\n\tres = (disk_write(pdrv, buf, 0, 1) == RES_OK && disk_ioctl(pdrv, CTRL_SYNC, 0) == RES_OK) ? FR_OK : FR_DISK_ERR;\n\tLEAVE_MKFS(res);\n}\n\n#endif /* FF_MULTI_PARTITION */\n#endif /* FF_USE_MKFS && !FF_FS_READONLY */\n\n\n\n\n#if FF_USE_STRFUNC\n#if FF_USE_LFN && FF_LFN_UNICODE && (FF_STRF_ENCODE < 0 || FF_STRF_ENCODE > 3)\n#error Wrong FF_STRF_ENCODE setting\n#endif\n/*-----------------------------------------------------------------------*/\n/* Get a String from the File                                            */\n/*-----------------------------------------------------------------------*/\n\nTCHAR* f_gets (\n\tTCHAR* buff,\t/* Pointer to the string buffer to read */\n\tint len,\t\t/* Size of string buffer (items) */\n\tFIL* fp\t\t\t/* Pointer to the file object */\n)\n{\n\tint nc = 0;\n\tTCHAR *p = buff;\n\tBYTE s[4];\n\tUINT rc;\n\tDWORD dc;\n#if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE <= 2\n\tWCHAR wc;\n#endif\n#if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE == 3\n\tUINT ct;\n#endif\n\n#if FF_USE_LFN && FF_LFN_UNICODE\t\t\t/* With code conversion (Unicode API) */\n\t/* Make a room for the character and terminator  */\n\tif (FF_LFN_UNICODE == 1) len -= (FF_STRF_ENCODE == 0) ? 1 : 2;\n\tif (FF_LFN_UNICODE == 2) len -= (FF_STRF_ENCODE == 0) ? 3 : 4;\n\tif (FF_LFN_UNICODE == 3) len -= 1;\n\twhile (nc < len) {\n#if FF_STRF_ENCODE == 0\t\t/* Read a character in ANSI/OEM */\n\t\tf_read(fp, s, 1, &rc);\n\t\tif (rc != 1) break;\n\t\twc = s[0];\n\t\tif (dbc_1st((BYTE)wc)) {\n\t\t\tf_read(fp, s, 1, &rc);\n\t\t\tif (rc != 1 || !dbc_2nd(s[0])) continue;\n\t\t\twc = wc << 8 | s[0];\n\t\t}\n\t\tdc = ff_oem2uni(wc, CODEPAGE);\n\t\tif (dc == 0) continue;\n#elif FF_STRF_ENCODE == 1 || FF_STRF_ENCODE == 2 \t/* Read a character in UTF-16LE/BE */\n\t\tf_read(fp, s, 2, &rc);\n\t\tif (rc != 2) break;\n\t\tdc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1];\n\t\tif (IsSurrogateL(dc)) continue;\n\t\tif (IsSurrogateH(dc)) {\n\t\t\tf_read(fp, s, 2, &rc);\n\t\t\tif (rc != 2) break;\n\t\t\twc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1];\n\t\t\tif (!IsSurrogateL(wc)) continue;\n\t\t\tdc = ((dc & 0x3FF) + 0x40) << 10 | (wc & 0x3FF);\n\t\t}\n#else\t/* Read a character in UTF-8 */\n\t\tf_read(fp, s, 1, &rc);\n\t\tif (rc != 1) break;\n\t\tdc = s[0];\n\t\tif (dc >= 0x80) {\t/* Multi-byte character? */\n\t\t\tct = 0;\n\t\t\tif ((dc & 0xE0) == 0xC0) { dc &= 0x1F; ct = 1; }\t/* 2-byte? */\n\t\t\tif ((dc & 0xF0) == 0xE0) { dc &= 0x0F; ct = 2; }\t/* 3-byte? */\n\t\t\tif ((dc & 0xF8) == 0xF0) { dc &= 0x07; ct = 3; }\t/* 4-byte? */\n\t\t\tif (ct == 0) continue;\n\t\t\tf_read(fp, s, ct, &rc);\t\t/* Get trailing bytes */\n\t\t\tif (rc != ct) break;\n\t\t\trc = 0;\n\t\t\tdo {\t/* Merge trailing bytes */\n\t\t\t\tif ((s[rc] & 0xC0) != 0x80) break;\n\t\t\t\tdc = dc << 6 | (s[rc] & 0x3F);\n\t\t\t} while (++rc < ct);\n\t\t\tif (rc != ct || dc < 0x80 || IsSurrogate(dc) || dc >= 0x110000) continue;\t/* Wrong encoding? */\n\t\t}\n#endif\n\t\tif (FF_USE_STRFUNC == 2 && dc == '\\r') continue;\t/* Strip \\r off if needed */\n#if FF_LFN_UNICODE == 1\t|| FF_LFN_UNICODE == 3\t/* Output it in UTF-16/32 encoding */\n\t\tif (FF_LFN_UNICODE == 1 && dc >= 0x10000) {\t/* Out of BMP at UTF-16? */\n\t\t\t*p++ = (TCHAR)(0xD800 | ((dc >> 10) - 0x40)); nc++;\t/* Make and output high surrogate */\n\t\t\tdc = 0xDC00 | (dc & 0x3FF);\t\t/* Make low surrogate */\n\t\t}\n\t\t*p++ = (TCHAR)dc; nc++;\n\t\tif (dc == '\\n') break;\t/* End of line? */\n#elif FF_LFN_UNICODE == 2\t\t/* Output it in UTF-8 encoding */\n\t\tif (dc < 0x80) {\t/* 1-byte */\n\t\t\t*p++ = (TCHAR)dc;\n\t\t\tnc++;\n\t\t\tif (dc == '\\n') break;\t/* End of line? */\n\t\t} else {\n\t\t\tif (dc < 0x800) {\t\t/* 2-byte */\n\t\t\t\t*p++ = (TCHAR)(0xC0 | (dc >> 6 & 0x1F));\n\t\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F));\n\t\t\t\tnc += 2;\n\t\t\t} else {\n\t\t\t\tif (dc < 0x10000) {\t/* 3-byte */\n\t\t\t\t\t*p++ = (TCHAR)(0xE0 | (dc >> 12 & 0x0F));\n\t\t\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F));\n\t\t\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F));\n\t\t\t\t\tnc += 3;\n\t\t\t\t} else {\t\t\t/* 4-byte */\n\t\t\t\t\t*p++ = (TCHAR)(0xF0 | (dc >> 18 & 0x07));\n\t\t\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 12 & 0x3F));\n\t\t\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F));\n\t\t\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F));\n\t\t\t\t\tnc += 4;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif\n\t}\n\n#else\t\t\t/* Byte-by-byte without any conversion (ANSI/OEM API) */\n\tlen -= 1;\t/* Make a room for the terminator */\n\twhile (nc < len) {\n\t\tf_read(fp, s, 1, &rc);\n\t\tif (rc != 1) break;\n\t\tdc = s[0];\n\t\tif (FF_USE_STRFUNC == 2 && dc == '\\r') continue;\n\t\t*p++ = (TCHAR)dc; nc++;\n\t\tif (dc == '\\n') break;\n\t}\n#endif\n\n\t*p = 0;\t\t/* Terminate the string */\n\treturn nc ? buff : 0;\t/* When no data read due to EOF or error, return with error. */\n}\n\n\n\n\n#if !FF_FS_READONLY\n#include <stdarg.h>\n/*-----------------------------------------------------------------------*/\n/* Put a Character to the File                                           */\n/*-----------------------------------------------------------------------*/\n\ntypedef struct {\t/* Putchar output buffer and work area */\n\tFIL *fp;\t\t/* Ptr to the writing file */\n\tint idx, nchr;\t/* Write index of buf[] (-1:error), number of encoding units written */\n#if FF_USE_LFN && FF_LFN_UNICODE == 1\n\tWCHAR hs;\n#elif FF_USE_LFN && FF_LFN_UNICODE == 2\n\tBYTE bs[4];\n\tUINT wi, ct;\n#endif\n\tBYTE buf[64];\t/* Write buffer */\n} putbuff;\n\n\nstatic\nvoid putc_bfd (\t\t/* Buffered write with code conversion */\n\tputbuff* pb,\n\tTCHAR c\n)\n{\n\tUINT n;\n\tint i, nc;\n#if FF_USE_LFN && FF_LFN_UNICODE\n\tWCHAR hs, wc;\n#if FF_LFN_UNICODE == 2\n\tDWORD dc;\n\tTCHAR *tp;\n#endif\n#endif\n\n\tif (FF_USE_STRFUNC == 2 && c == '\\n') {\t /* LF -> CRLF conversion */\n\t\tputc_bfd(pb, '\\r');\n\t}\n\n\ti = pb->idx;\t\t\t/* Write index of pb->buf[] */\n\tif (i < 0) return;\n\tnc = pb->nchr;\t\t\t/* Write unit counter */\n\n#if FF_USE_LFN && FF_LFN_UNICODE\n#if FF_LFN_UNICODE == 1\t\t/* UTF-16 input */\n\tif (IsSurrogateH(c)) {\n\t\tpb->hs = c; return;\n\t}\n\ths = pb->hs; pb->hs = 0;\n\tif (hs != 0) {\n\t\tif (!IsSurrogateL(c)) hs = 0;\n\t} else {\n\t\tif (IsSurrogateL(c)) return;\n\t}\n\twc = c;\n#elif FF_LFN_UNICODE == 2\t/* UTF-8 input */\n\tfor (;;) {\n\t\tif (pb->ct == 0) {\t/* Out of multi-byte sequence? */\n\t\t\tpb->bs[pb->wi = 0] = (BYTE)c;\t/* Save 1st byte */\n\t\t\tif ((BYTE)c < 0x80) break;\t\t\t\t\t/* 1-byte? */\n\t\t\tif (((BYTE)c & 0xE0) == 0xC0) pb->ct = 1;\t/* 2-byte? */\n\t\t\tif (((BYTE)c & 0xF0) == 0xE0) pb->ct = 2;\t/* 3-byte? */\n\t\t\tif (((BYTE)c & 0xF1) == 0xF0) pb->ct = 3;\t/* 4-byte? */\n\t\t\treturn;\n\t\t} else {\t\t\t\t/* In the multi-byte sequence */\n\t\t\tif (((BYTE)c & 0xC0) != 0x80) {\t/* Broken sequence? */\n\t\t\t\tpb->ct = 0; continue;\n\t\t\t}\n\t\t\tpb->bs[++pb->wi] = (BYTE)c;\t/* Save the trailing byte */\n\t\t\tif (--pb->ct == 0) break;\t/* End of multi-byte sequence? */\n\t\t\treturn;\n\t\t}\n\t}\n\ttp = (TCHAR*)pb->bs;\n\tdc = tchar2uni(&tp);\t/* UTF-8 ==> UTF-16 */\n\tif (dc == 0xFFFFFFFF) return;\n\twc = (WCHAR)dc;\n\ths = (WCHAR)(dc >> 16);\n#elif FF_LFN_UNICODE == 3\t/* UTF-32 input */\n\tif (IsSurrogate(c) || c >= 0x110000) return;\n\tif (c >= 0x10000) {\n\t\ths = (WCHAR)(0xD800 | ((c >> 10) - 0x40)); \t/* Make high surrogate */\n\t\twc = 0xDC00 | (c & 0x3FF);\t\t\t\t\t/* Make low surrogate */\n\t} else {\n\t\ths = 0;\n\t\twc = (WCHAR)c;\n\t}\n#endif\n\n#if FF_STRF_ENCODE == 1\t\t/* Write a character in UTF-16LE */\n\tif (hs != 0) {\n\t\tst_word(&pb->buf[i], hs);\n\t\ti += 2;\n\t\tnc++;\n\t}\n\tst_word(&pb->buf[i], wc);\n\ti += 2;\n#elif FF_STRF_ENCODE == 2\t/* Write a character in UTF-16BE */\n\tif (hs != 0) {\n\t\tpb->buf[i++] = (BYTE)(hs >> 8);\n\t\tpb->buf[i++] = (BYTE)hs;\n\t\tnc++;\n\t}\n\tpb->buf[i++] = (BYTE)(wc >> 8);\n\tpb->buf[i++] = (BYTE)wc;\n#elif FF_STRF_ENCODE == 3\t/* Write it in UTF-8 */\n\tif (hs != 0) {\t\t\t\t/* 4-byte */\n\t\tnc += 3;\n\t\ths = (hs & 0x3FF) + 0x40;\n\t\tpb->buf[i++] = (BYTE)(0xF0 | hs >> 8);\n\t\tpb->buf[i++] = (BYTE)(0x80 | (hs >> 2 & 0x3F));\n\t\tpb->buf[i++] = (BYTE)(0x80 | (hs & 3) << 4 | (wc >> 6 & 0x0F));\n\t\tpb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F));\n\t} else {\n\t\tif (wc < 0x80) {\t\t/* 1-byte */\n\t\t\tpb->buf[i++] = (BYTE)wc;\n\t\t} else {\n\t\t\tif (wc < 0x800) {\t/* 2-byte */\n\t\t\t\tnc += 1;\n\t\t\t\tpb->buf[i++] = (BYTE)(0xC0 | wc >> 6);\n\t\t\t} else {\t\t\t/* 3-byte */\n\t\t\t\tnc += 2;\n\t\t\t\tpb->buf[i++] = (BYTE)(0xE0 | wc >> 12);\n\t\t\t\tpb->buf[i++] = (BYTE)(0x80 | (wc >> 6 & 0x3F));\n\t\t\t}\n\t\t\tpb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F));\n\t\t}\n\t}\n#else\t\t\t\t\t\t/* Write it in ANSI/OEM */\n\tif (hs != 0) return;\n\twc = ff_uni2oem(wc, CODEPAGE);\t/* UTF-16 ==> ANSI/OEM */\n\tif (wc == 0) return;;\n\tif (wc >= 0x100) {\n\t\tpb->buf[i++] = (BYTE)(wc >> 8); nc++;\n\t}\n\tpb->buf[i++] = (BYTE)wc;\n#endif\n\n#else\t\t\t\t\t\t\t\t\t/* ANSI/OEM input (without re-encode) */\n\tpb->buf[i++] = (BYTE)c;\n#endif\n\n\tif (i >= (int)(sizeof pb->buf) - 4) {\t/* Write buffered characters to the file */\n\t\tf_write(pb->fp, pb->buf, (UINT)i, &n);\n\t\ti = (n == (UINT)i) ? 0 : -1;\n\t}\n\tpb->idx = i;\n\tpb->nchr = nc + 1;\n}\n\n\nstatic\nint putc_flush (\t\t/* Flush left characters in the buffer */\n\tputbuff* pb\n)\n{\n\tUINT nw;\n\n\tif (   pb->idx >= 0\t/* Flush buffered characters to the file */\n\t\t&& f_write(pb->fp, pb->buf, (UINT)pb->idx, &nw) == FR_OK\n\t\t&& (UINT)pb->idx == nw) return pb->nchr;\n\treturn EOF;\n}\n\n\nstatic\nvoid putc_init (\t\t/* Initialize write buffer */\n\tputbuff* pb,\n\tFIL* fp\n)\n{\n\tmem_set(pb, 0, sizeof (putbuff));\n\tpb->fp = fp;\n}\n\n\n\nint f_putc (\n\tTCHAR c,\t/* A character to be output */\n\tFIL* fp\t\t/* Pointer to the file object */\n)\n{\n\tputbuff pb;\n\n\n\tputc_init(&pb, fp);\n\tputc_bfd(&pb, c);\t/* Put the character */\n\treturn putc_flush(&pb);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Put a String to the File                                              */\n/*-----------------------------------------------------------------------*/\n\nint f_puts (\n\tconst TCHAR* str,\t/* Pointer to the string to be output */\n\tFIL* fp\t\t\t\t/* Pointer to the file object */\n)\n{\n\tputbuff pb;\n\n\n\tputc_init(&pb, fp);\n\twhile (*str) putc_bfd(&pb, *str++);\t\t/* Put the string */\n\treturn putc_flush(&pb);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Put a Formatted String to the File                                    */\n/*-----------------------------------------------------------------------*/\n\nint f_printf (\n\tFIL* fp,\t\t\t/* Pointer to the file object */\n\tconst TCHAR* fmt,\t/* Pointer to the format string */\n\t...\t\t\t\t\t/* Optional arguments... */\n)\n{\n\tva_list arp;\n\tputbuff pb;\n\tBYTE f, r;\n\tUINT i, j, w;\n\tDWORD v;\n\tTCHAR c, d, str[32], *p;\n\n\n\tputc_init(&pb, fp);\n\n\tva_start(arp, fmt);\n\n\tfor (;;) {\n\t\tc = *fmt++;\n\t\tif (c == 0) break;\t\t\t/* End of string */\n\t\tif (c != '%') {\t\t\t\t/* Non escape character */\n\t\t\tputc_bfd(&pb, c);\n\t\t\tcontinue;\n\t\t}\n\t\tw = f = 0;\n\t\tc = *fmt++;\n\t\tif (c == '0') {\t\t\t\t/* Flag: '0' padding */\n\t\t\tf = 1; c = *fmt++;\n\t\t} else {\n\t\t\tif (c == '-') {\t\t\t/* Flag: left justified */\n\t\t\t\tf = 2; c = *fmt++;\n\t\t\t}\n\t\t}\n\t\tif (c == '*') {\t\t\t\t/* Minimum width by argument */\n\t\t\tw = va_arg(arp, int);\n\t\t\tc = *fmt++;\n\t\t} else {\n\t\t\twhile (IsDigit(c)) {\t/* Minimum width */\n\t\t\t\tw = w * 10 + c - '0';\n\t\t\t\tc = *fmt++;\n\t\t\t}\n\t\t}\n\t\tif (c == 'l' || c == 'L') {\t/* Type prefix: Size is long int */\n\t\t\tf |= 4; c = *fmt++;\n\t\t}\n\t\tif (c == 0) break;\n\t\td = c;\n\t\tif (IsLower(d)) d -= 0x20;\n\t\tswitch (d) {\t\t\t\t/* Atgument type is... */\n\t\tcase 'S' :\t\t\t\t\t/* String */\n\t\t\tp = va_arg(arp, TCHAR*);\n\t\t\tfor (j = 0; p[j]; j++) ;\n\t\t\tif (!(f & 2)) {\t\t\t\t\t\t/* Right padded */\n\t\t\t\twhile (j++ < w) putc_bfd(&pb, ' ') ;\n\t\t\t}\n\t\t\twhile (*p) putc_bfd(&pb, *p++) ;\t\t/* String body */\n\t\t\twhile (j++ < w) putc_bfd(&pb, ' ') ;\t/* Left padded */\n\t\t\tcontinue;\n\n\t\tcase 'C' :\t\t\t\t\t/* Character */\n\t\t\tputc_bfd(&pb, (TCHAR)va_arg(arp, int)); continue;\n\n\t\tcase 'B' :\t\t\t\t\t/* Unsigned binary */\n\t\t\tr = 2; break;\n\n\t\tcase 'O' :\t\t\t\t\t/* Unsigned octal */\n\t\t\tr = 8; break;\n\n\t\tcase 'D' :\t\t\t\t\t/* Signed decimal */\n\t\tcase 'U' :\t\t\t\t\t/* Unsigned decimal */\n\t\t\tr = 10; break;\n\n\t\tcase 'X' :\t\t\t\t\t/* Unsigned hexdecimal */\n\t\t\tr = 16; break;\n\n\t\tdefault:\t\t\t\t\t/* Unknown type (pass-through) */\n\t\t\tputc_bfd(&pb, c); continue;\n\t\t}\n\n\t\t/* Get an argument and put it in numeral */\n\t\tv = (f & 4) ? (DWORD)va_arg(arp, long) : ((d == 'D') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int));\n\t\tif (d == 'D' && (v & 0x80000000)) {\n\t\t\tv = 0 - v;\n\t\t\tf |= 8;\n\t\t}\n\t\ti = 0;\n\t\tdo {\n\t\t\td = (TCHAR)(v % r); v /= r;\n\t\t\tif (d > 9) d += (c == 'x') ? 0x27 : 0x07;\n\t\t\tstr[i++] = d + '0';\n\t\t} while (v && i < sizeof str / sizeof *str);\n\t\tif (f & 8) str[i++] = '-';\n\t\tj = i; d = (f & 1) ? '0' : ' ';\n\t\tif (!(f & 2)) {\n\t\t\twhile (j++ < w) putc_bfd(&pb, d);\t/* Right pad */\n\t\t}\n\t\tdo {\n\t\t\tputc_bfd(&pb, str[--i]);\t\t\t/* Number body */\n\t\t} while (i);\n\t\twhile (j++ < w) putc_bfd(&pb, d);\t\t/* Left pad */\n\t}\n\n\tva_end(arp);\n\n\treturn putc_flush(&pb);\n}\n\n#endif /* !FF_FS_READONLY */\n#endif /* FF_USE_STRFUNC */\n\n\n\n#if FF_CODE_PAGE == 0\n/*-----------------------------------------------------------------------*/\n/* Set Active Codepage for the Path Name                                 */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_setcp (\n\tWORD cp\t\t/* Value to be set as active code page */\n)\n{\n\tstatic const WORD       validcp[] = {  437,   720,   737,   771,   775,   850,   852,   857,   860,   861,   862,   863,   864,   865,   866,   869,   932,   936,   949,   950, 0};\n\tstatic const BYTE* const tables[] = {Ct437, Ct720, Ct737, Ct771, Ct775, Ct850, Ct852, Ct857, Ct860, Ct861, Ct862, Ct863, Ct864, Ct865, Ct866, Ct869, Dc932, Dc936, Dc949, Dc950, 0};\n\tUINT i;\n\n\n\tfor (i = 0; validcp[i] != 0 && validcp[i] != cp; i++) ;\t/* Find the code page */\n\tif (validcp[i] != cp) return FR_INVALID_PARAMETER;\t/* Not found? */\n\n\tCodePage = cp;\n\tif (cp >= 900) {\t/* DBCS */\n\t\tExCvt = 0;\n\t\tDbcTbl = tables[i];\n\t} else {\t\t\t/* SBCS */\n\t\tExCvt = tables[i];\n\t\tDbcTbl = 0;\n\t}\n\treturn FR_OK;\n}\n#endif\t/* FF_CODE_PAGE == 0 */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/source/ff.h",
    "content": "/*----------------------------------------------------------------------------/\n/  FatFs - Generic FAT Filesystem module  R0.13b                              /\n/-----------------------------------------------------------------------------/\n/\n/ Copyright (C) 2018, ChaN, all right reserved.\n/\n/ FatFs module is an open source software. Redistribution and use of FatFs in\n/ source and binary forms, with or without modification, are permitted provided\n/ that the following condition is met:\n\n/ 1. Redistributions of source code must retain the above copyright notice,\n/    this condition and the following disclaimer.\n/\n/ This software is provided by the copyright holder and contributors \"AS IS\"\n/ and any warranties related to this software are DISCLAIMED.\n/ The copyright owner or contributors be NOT LIABLE for any damages caused\n/ by use of this software.\n/\n/----------------------------------------------------------------------------*/\n\n\n#ifndef FF_DEFINED\n#define FF_DEFINED\t63463\t/* Revision ID */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"integer.h\"\t/* Basic integer types */\n#include \"ffconf.h\"\t\t/* FatFs configuration options */\n\n#if FF_DEFINED != FFCONF_DEF\n#error Wrong configuration file (ffconf.h).\n#endif\n\n\n\n/* Definitions of volume management */\n\n#if FF_MULTI_PARTITION\t\t/* Multiple partition configuration */\ntypedef struct {\n\tBYTE pd;\t/* Physical drive number */\n\tBYTE pt;\t/* Partition: 0:Auto detect, 1-4:Forced partition) */\n} PARTITION;\nextern PARTITION VolToPart[];\t/* Volume - Partition resolution table */\n#endif\n\n#if FF_STR_VOLUME_ID\n#ifndef FF_VOLUME_STRS\nextern const char* VolumeStr[FF_VOLUMES];\t/* User defied volume ID */\n#endif\n#endif\n\n\n\n/* Type of path name strings on FatFs API */\n\n#ifndef _INC_TCHAR\n#define _INC_TCHAR\n\n#if FF_USE_LFN && FF_LFN_UNICODE == 1 \t/* Unicode in UTF-16 encoding */\ntypedef WCHAR TCHAR;\n#define _T(x) L ## x\n#define _TEXT(x) L ## x\n#elif FF_USE_LFN && FF_LFN_UNICODE == 2\t/* Unicode in UTF-8 encoding */\ntypedef char TCHAR;\n#define _T(x) u8 ## x\n#define _TEXT(x) u8 ## x\n#elif FF_USE_LFN && FF_LFN_UNICODE == 3\t/* Unicode in UTF-32 encoding */\ntypedef DWORD TCHAR;\n#define _T(x) U ## x\n#define _TEXT(x) U ## x\n#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3)\n#error Wrong FF_LFN_UNICODE setting\n#else\t\t\t\t\t\t\t\t\t/* ANSI/OEM code in SBCS/DBCS */\ntypedef char TCHAR;\n#define _T(x) x\n#define _TEXT(x) x\n#endif\n\n#endif\n\n\n\n/* Type of file size variables */\n\n#if FF_FS_EXFAT\ntypedef QWORD FSIZE_t;\n#else\ntypedef DWORD FSIZE_t;\n#endif\n\n\n\n/* Filesystem object structure (FATFS) */\n\ntypedef struct {\n\tBYTE\tfs_type;\t\t/* Filesystem type (0:N/A) */\n\tBYTE\tpdrv;\t\t\t/* Physical drive number */\n\tBYTE\tn_fats;\t\t\t/* Number of FATs (1 or 2) */\n\tBYTE\twflag;\t\t\t/* win[] flag (b0:dirty) */\n\tBYTE\tfsi_flag;\t\t/* FSINFO flags (b7:disabled, b0:dirty) */\n\tWORD\tid;\t\t\t\t/* Volume mount ID */\n\tWORD\tn_rootdir;\t\t/* Number of root directory entries (FAT12/16) */\n\tWORD\tcsize;\t\t\t/* Cluster size [sectors] */\n#if FF_MAX_SS != FF_MIN_SS\n\tWORD\tssize;\t\t\t/* Sector size (512, 1024, 2048 or 4096) */\n#endif\n#if FF_USE_LFN\n\tWCHAR*\tlfnbuf;\t\t\t/* LFN working buffer */\n#endif\n#if FF_FS_EXFAT\n\tBYTE*\tdirbuf;\t\t\t/* Directory entry block scratchpad buffer for exFAT */\n#endif\n#if FF_FS_REENTRANT\n\tFF_SYNC_t\tsobj;\t\t/* Identifier of sync object */\n#endif\n#if !FF_FS_READONLY\n\tDWORD\tlast_clst;\t\t/* Last allocated cluster */\n\tDWORD\tfree_clst;\t\t/* Number of free clusters */\n#endif\n#if FF_FS_RPATH\n\tDWORD\tcdir;\t\t\t/* Current directory start cluster (0:root) */\n#if FF_FS_EXFAT\n\tDWORD\tcdc_scl;\t\t/* Containing directory start cluster (invalid when cdir is 0) */\n\tDWORD\tcdc_size;\t\t/* b31-b8:Size of containing directory, b7-b0: Chain status */\n\tDWORD\tcdc_ofs;\t\t/* Offset in the containing directory (invalid when cdir is 0) */\n#endif\n#endif\n\tDWORD\tn_fatent;\t\t/* Number of FAT entries (number of clusters + 2) */\n\tDWORD\tfsize;\t\t\t/* Size of an FAT [sectors] */\n\tDWORD\tvolbase;\t\t/* Volume base sector */\n\tDWORD\tfatbase;\t\t/* FAT base sector */\n\tDWORD\tdirbase;\t\t/* Root directory base sector/cluster */\n\tDWORD\tdatabase;\t\t/* Data base sector */\n\tDWORD\twinsect;\t\t/* Current sector appearing in the win[] */\n\tBYTE\twin[FF_MAX_SS];\t/* Disk access window for Directory, FAT (and file data at tiny cfg) */\n} FATFS;\n\n\n\n/* Object ID and allocation information (FFOBJID) */\n\ntypedef struct {\n\tFATFS*\tfs;\t\t\t\t/* Pointer to the hosting volume of this object */\n\tWORD\tid;\t\t\t\t/* Hosting volume mount ID */\n\tBYTE\tattr;\t\t\t/* Object attribute */\n\tBYTE\tstat;\t\t\t/* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:flagmented in this session, b2:sub-directory stretched) */\n\tDWORD\tsclust;\t\t\t/* Object data start cluster (0:no cluster or root directory) */\n\tFSIZE_t\tobjsize;\t\t/* Object size (valid when sclust != 0) */\n#if FF_FS_EXFAT\n\tDWORD\tn_cont;\t\t\t/* Size of first fragment - 1 (valid when stat == 3) */\n\tDWORD\tn_frag;\t\t\t/* Size of last fragment needs to be written to FAT (valid when not zero) */\n\tDWORD\tc_scl;\t\t\t/* Containing directory start cluster (valid when sclust != 0) */\n\tDWORD\tc_size;\t\t\t/* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */\n\tDWORD\tc_ofs;\t\t\t/* Offset in the containing directory (valid when file object and sclust != 0) */\n#endif\n#if FF_FS_LOCK\n\tUINT\tlockid;\t\t\t/* File lock ID origin from 1 (index of file semaphore table Files[]) */\n#endif\n} FFOBJID;\n\n\n\n/* File object structure (FIL) */\n\ntypedef struct {\n\tFFOBJID\tobj;\t\t\t/* Object identifier (must be the 1st member to detect invalid object pointer) */\n\tBYTE\tflag;\t\t\t/* File status flags */\n\tBYTE\terr;\t\t\t/* Abort flag (error code) */\n\tFSIZE_t\tfptr;\t\t\t/* File read/write pointer (Zeroed on file open) */\n\tDWORD\tclust;\t\t\t/* Current cluster of fpter (invalid when fptr is 0) */\n\tDWORD\tsect;\t\t\t/* Sector number appearing in buf[] (0:invalid) */\n#if !FF_FS_READONLY\n\tDWORD\tdir_sect;\t\t/* Sector number containing the directory entry (not used at exFAT) */\n\tBYTE*\tdir_ptr;\t\t/* Pointer to the directory entry in the win[] (not used at exFAT) */\n#endif\n#if FF_USE_FASTSEEK\n\tDWORD*\tcltbl;\t\t\t/* Pointer to the cluster link map table (nulled on open, set by application) */\n#endif\n#if !FF_FS_TINY\n\tBYTE\tbuf[FF_MAX_SS];\t/* File private data read/write window */\n#endif\n} FIL;\n\n\n\n/* Directory object structure (DIR) */\n\ntypedef struct {\n\tFFOBJID\tobj;\t\t\t/* Object identifier */\n\tDWORD\tdptr;\t\t\t/* Current read/write offset */\n\tDWORD\tclust;\t\t\t/* Current cluster */\n\tDWORD\tsect;\t\t\t/* Current sector (0:Read operation has terminated) */\n\tBYTE*\tdir;\t\t\t/* Pointer to the directory item in the win[] */\n\tBYTE\tfn[12];\t\t\t/* SFN (in/out) {body[8],ext[3],status[1]} */\n#if FF_USE_LFN\n\tDWORD\tblk_ofs;\t\t/* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */\n#endif\n#if FF_USE_FIND\n\tconst TCHAR* pat;\t\t/* Pointer to the name matching pattern */\n#endif\n} DIR;\n\n\n\n/* File information structure (FILINFO) */\n\ntypedef struct {\n\tFSIZE_t\tfsize;\t\t\t/* File size */\n\tWORD\tfdate;\t\t\t/* Modified date */\n\tWORD\tftime;\t\t\t/* Modified time */\n\tBYTE\tfattrib;\t\t/* File attribute */\n#if FF_USE_LFN\n\tTCHAR\taltname[FF_SFN_BUF + 1];/* Altenative file name */\n\tTCHAR\tfname[FF_LFN_BUF + 1];\t/* Primary file name */\n#else\n\tTCHAR\tfname[12 + 1];\t/* File name */\n#endif\n} FILINFO;\n\n\n\n/* File function return code (FRESULT) */\n\ntypedef enum {\n\tFR_OK = 0,\t\t\t\t/* (0) Succeeded */\n\tFR_DISK_ERR,\t\t\t/* (1) A hard error occurred in the low level disk I/O layer */\n\tFR_INT_ERR,\t\t\t\t/* (2) Assertion failed */\n\tFR_NOT_READY,\t\t\t/* (3) The physical drive cannot work */\n\tFR_NO_FILE,\t\t\t\t/* (4) Could not find the file */\n\tFR_NO_PATH,\t\t\t\t/* (5) Could not find the path */\n\tFR_INVALID_NAME,\t\t/* (6) The path name format is invalid */\n\tFR_DENIED,\t\t\t\t/* (7) Access denied due to prohibited access or directory full */\n\tFR_EXIST,\t\t\t\t/* (8) Access denied due to prohibited access */\n\tFR_INVALID_OBJECT,\t\t/* (9) The file/directory object is invalid */\n\tFR_WRITE_PROTECTED,\t\t/* (10) The physical drive is write protected */\n\tFR_INVALID_DRIVE,\t\t/* (11) The logical drive number is invalid */\n\tFR_NOT_ENABLED,\t\t\t/* (12) The volume has no work area */\n\tFR_NO_FILESYSTEM,\t\t/* (13) There is no valid FAT volume */\n\tFR_MKFS_ABORTED,\t\t/* (14) The f_mkfs() aborted due to any problem */\n\tFR_TIMEOUT,\t\t\t\t/* (15) Could not get a grant to access the volume within defined period */\n\tFR_LOCKED,\t\t\t\t/* (16) The operation is rejected according to the file sharing policy */\n\tFR_NOT_ENOUGH_CORE,\t\t/* (17) LFN working buffer could not be allocated */\n\tFR_TOO_MANY_OPEN_FILES,\t/* (18) Number of open files > FF_FS_LOCK */\n\tFR_INVALID_PARAMETER\t/* (19) Given parameter is invalid */\n} FRESULT;\n\n\n\n/*--------------------------------------------------------------*/\n/* FatFs module application interface                           */\n\nFRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode);\t\t\t\t/* Open or create a file */\nFRESULT f_close (FIL* fp);\t\t\t\t\t\t\t\t\t\t\t/* Close an open file object */\nFRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br);\t\t\t/* Read data from the file */\nFRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw);\t/* Write data to the file */\nFRESULT f_lseek (FIL* fp, FSIZE_t ofs);\t\t\t\t\t\t\t\t/* Move file pointer of the file object */\nFRESULT f_truncate (FIL* fp);\t\t\t\t\t\t\t\t\t\t/* Truncate the file */\nFRESULT f_sync (FIL* fp);\t\t\t\t\t\t\t\t\t\t\t/* Flush cached data of the writing file */\nFRESULT f_opendir (DIR* dp, const TCHAR* path);\t\t\t\t\t\t/* Open a directory */\nFRESULT f_closedir (DIR* dp);\t\t\t\t\t\t\t\t\t\t/* Close an open directory */\nFRESULT f_readdir (DIR* dp, FILINFO* fno);\t\t\t\t\t\t\t/* Read a directory item */\nFRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern);\t/* Find first file */\nFRESULT f_findnext (DIR* dp, FILINFO* fno);\t\t\t\t\t\t\t/* Find next file */\nFRESULT f_mkdir (const TCHAR* path);\t\t\t\t\t\t\t\t/* Create a sub directory */\nFRESULT f_unlink (const TCHAR* path);\t\t\t\t\t\t\t\t/* Delete an existing file or directory */\nFRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new);\t/* Rename/Move a file or directory */\nFRESULT f_stat (const TCHAR* path, FILINFO* fno);\t\t\t\t\t/* Get file status */\nFRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask);\t\t\t/* Change attribute of a file/dir */\nFRESULT f_utime (const TCHAR* path, const FILINFO* fno);\t\t\t/* Change timestamp of a file/dir */\nFRESULT f_chdir (const TCHAR* path);\t\t\t\t\t\t\t\t/* Change current directory */\nFRESULT f_chdrive (const TCHAR* path);\t\t\t\t\t\t\t\t/* Change current drive */\nFRESULT f_getcwd (TCHAR* buff, UINT len);\t\t\t\t\t\t\t/* Get current directory */\nFRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs);\t/* Get number of free clusters on the drive */\nFRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn);\t/* Get volume label */\nFRESULT f_setlabel (const TCHAR* label);\t\t\t\t\t\t\t/* Set volume label */\nFRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf);\t/* Forward data to the stream */\nFRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt);\t\t\t\t\t/* Allocate a contiguous block to the file */\nFRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt);\t\t\t/* Mount/Unmount a logical drive */\nFRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len);\t/* Create a FAT volume */\nFRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work);\t\t\t/* Divide a physical drive into some partitions */\nFRESULT f_setcp (WORD cp);\t\t\t\t\t\t\t\t\t\t\t/* Set current code page */\nint f_putc (TCHAR c, FIL* fp);\t\t\t\t\t\t\t\t\t\t/* Put a character to the file */\nint f_puts (const TCHAR* str, FIL* cp);\t\t\t\t\t\t\t\t/* Put a string to the file */\nint f_printf (FIL* fp, const TCHAR* str, ...);\t\t\t\t\t\t/* Put a formatted string to the file */\nTCHAR* f_gets (TCHAR* buff, int len, FIL* fp);\t\t\t\t\t\t/* Get a string from the file */\n\n#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize))\n#define f_error(fp) ((fp)->err)\n#define f_tell(fp) ((fp)->fptr)\n#define f_size(fp) ((fp)->obj.objsize)\n#define f_rewind(fp) f_lseek((fp), 0)\n#define f_rewinddir(dp) f_readdir((dp), 0)\n#define f_rmdir(path) f_unlink(path)\n#define f_unmount(path) f_mount(0, path, 0)\n\n#ifndef EOF\n#define EOF (-1)\n#endif\n\n\n\n\n/*--------------------------------------------------------------*/\n/* Additional user defined functions                            */\n\n/* RTC function */\n#if !FF_FS_READONLY && !FF_FS_NORTC\nDWORD get_fattime (void);\n#endif\n\n/* LFN support functions */\n#if FF_USE_LFN >= 1\t\t\t\t\t\t/* Code conversion (defined in unicode.c) */\nWCHAR ff_oem2uni (WCHAR oem, WORD cp);\t/* OEM code to Unicode conversion */\nWCHAR ff_uni2oem (DWORD uni, WORD cp);\t/* Unicode to OEM code conversion */\nDWORD ff_wtoupper (DWORD uni);\t\t\t/* Unicode upper-case conversion */\n#endif\n#if FF_USE_LFN == 3\t\t\t\t\t\t/* Dynamic memory allocation */\nvoid* ff_memalloc (UINT msize);\t\t\t/* Allocate memory block */\nvoid ff_memfree (void* mblock);\t\t\t/* Free memory block */\n#endif\n\n/* Sync functions */\n#if FF_FS_REENTRANT\nint ff_cre_syncobj (BYTE vol, FF_SYNC_t* sobj);\t/* Create a sync object */\nint ff_req_grant (FF_SYNC_t sobj);\t\t/* Lock sync object */\nvoid ff_rel_grant (FF_SYNC_t sobj);\t\t/* Unlock sync object */\nint ff_del_syncobj (FF_SYNC_t sobj);\t/* Delete a sync object */\n#endif\n\n\n\n\n/*--------------------------------------------------------------*/\n/* Flags and offset address                                     */\n\n\n/* File access mode and open method flags (3rd argument of f_open) */\n#define\tFA_READ\t\t\t\t0x01\n#define\tFA_WRITE\t\t\t0x02\n#define\tFA_OPEN_EXISTING\t0x00\n#define\tFA_CREATE_NEW\t\t0x04\n#define\tFA_CREATE_ALWAYS\t0x08\n#define\tFA_OPEN_ALWAYS\t\t0x10\n#define\tFA_OPEN_APPEND\t\t0x30\n\n/* Fast seek controls (2nd argument of f_lseek) */\n#define CREATE_LINKMAP\t((FSIZE_t)0 - 1)\n\n/* Format options (2nd argument of f_mkfs) */\n#define FM_FAT\t\t0x01\n#define FM_FAT32\t0x02\n#define FM_EXFAT\t0x04\n#define FM_ANY\t\t0x07\n#define FM_SFD\t\t0x08\n\n/* Filesystem type (FATFS.fs_type) */\n#define FS_FAT12\t1\n#define FS_FAT16\t2\n#define FS_FAT32\t3\n#define FS_EXFAT\t4\n\n/* File attribute bits for directory entry (FILINFO.fattrib) */\n#define\tAM_RDO\t0x01\t/* Read only */\n#define\tAM_HID\t0x02\t/* Hidden */\n#define\tAM_SYS\t0x04\t/* System */\n#define AM_DIR\t0x10\t/* Directory */\n#define AM_ARC\t0x20\t/* Archive */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* FF_DEFINED */\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/source/ffsystem.c",
    "content": "/*------------------------------------------------------------------------*/\n/* Sample Code of OS Dependent Functions for FatFs                        */\n/* (C)ChaN, 2017                                                          */\n/*------------------------------------------------------------------------*/\n\n\n#include \"ff.h\"\n\n\n\n#if FF_USE_LFN == 3\t/* Dynamic memory allocation */\n\n/*------------------------------------------------------------------------*/\n/* Allocate a memory block                                                */\n/*------------------------------------------------------------------------*/\n\nvoid* ff_memalloc (\t/* Returns pointer to the allocated memory block (null on not enough core) */\n\tUINT msize\t\t/* Number of bytes to allocate */\n)\n{\n\treturn malloc(msize);\t/* Allocate a new memory block with POSIX API */\n}\n\n\n/*------------------------------------------------------------------------*/\n/* Free a memory block                                                    */\n/*------------------------------------------------------------------------*/\n\nvoid ff_memfree (\n\tvoid* mblock\t/* Pointer to the memory block to free (nothing to do for null) */\n)\n{\n\tfree(mblock);\t/* Free the memory block with POSIX API */\n}\n\n#endif\n\n\n\n#if FF_FS_REENTRANT\t/* Mutal exclusion */\n\n/*------------------------------------------------------------------------*/\n/* Create a Synchronization Object                                        */\n/*------------------------------------------------------------------------*/\n/* This function is called in f_mount() function to create a new\n/  synchronization object for the volume, such as semaphore and mutex.\n/  When a 0 is returned, the f_mount() function fails with FR_INT_ERR.\n*/\n\n//const osMutexDef_t Mutex[FF_VOLUMES];\t/* CMSIS-RTOS */\n\n\nint ff_cre_syncobj (\t/* 1:Function succeeded, 0:Could not create the sync object */\n\tBYTE vol,\t\t\t/* Corresponding volume (logical drive number) */\n\tFF_SYNC_t* sobj\t\t/* Pointer to return the created sync object */\n)\n{\n\t/* Win32 */\n\t*sobj = CreateMutex(NULL, FALSE, NULL);\n\treturn (int)(*sobj != INVALID_HANDLE_VALUE);\n\n\t/* uITRON */\n//\tT_CSEM csem = {TA_TPRI,1,1};\n//\t*sobj = acre_sem(&csem);\n//\treturn (int)(*sobj > 0);\n\n\t/* uC/OS-II */\n//\tOS_ERR err;\n//\t*sobj = OSMutexCreate(0, &err);\n//\treturn (int)(err == OS_NO_ERR);\n\n\t/* FreeRTOS */\n//\t*sobj = xSemaphoreCreateMutex();\n//\treturn (int)(*sobj != NULL);\n\n\t/* CMSIS-RTOS */\n//\t*sobj = osMutexCreate(Mutex + vol);\n//\treturn (int)(*sobj != NULL);\n}\n\n\n/*------------------------------------------------------------------------*/\n/* Delete a Synchronization Object                                        */\n/*------------------------------------------------------------------------*/\n/* This function is called in f_mount() function to delete a synchronization\n/  object that created with ff_cre_syncobj() function. When a 0 is returned,\n/  the f_mount() function fails with FR_INT_ERR.\n*/\n\nint ff_del_syncobj (\t/* 1:Function succeeded, 0:Could not delete due to an error */\n\tFF_SYNC_t sobj\t\t/* Sync object tied to the logical drive to be deleted */\n)\n{\n\t/* Win32 */\n\treturn (int)CloseHandle(sobj);\n\n\t/* uITRON */\n//\treturn (int)(del_sem(sobj) == E_OK);\n\n\t/* uC/OS-II */\n//\tOS_ERR err;\n//\tOSMutexDel(sobj, OS_DEL_ALWAYS, &err);\n//\treturn (int)(err == OS_NO_ERR);\n\n\t/* FreeRTOS */\n//  vSemaphoreDelete(sobj);\n//\treturn 1;\n\n\t/* CMSIS-RTOS */\n//\treturn (int)(osMutexDelete(sobj) == osOK);\n}\n\n\n/*------------------------------------------------------------------------*/\n/* Request Grant to Access the Volume                                     */\n/*------------------------------------------------------------------------*/\n/* This function is called on entering file functions to lock the volume.\n/  When a 0 is returned, the file function fails with FR_TIMEOUT.\n*/\n\nint ff_req_grant (\t/* 1:Got a grant to access the volume, 0:Could not get a grant */\n\tFF_SYNC_t sobj\t/* Sync object to wait */\n)\n{\n\t/* Win32 */\n\treturn (int)(WaitForSingleObject(sobj, FF_FS_TIMEOUT) == WAIT_OBJECT_0);\n\n\t/* uITRON */\n//\treturn (int)(wai_sem(sobj) == E_OK);\n\n\t/* uC/OS-II */\n//\tOS_ERR err;\n//\tOSMutexPend(sobj, FF_FS_TIMEOUT, &err));\n//\treturn (int)(err == OS_NO_ERR);\n\n\t/* FreeRTOS */\n//\treturn (int)(xSemaphoreTake(sobj, FF_FS_TIMEOUT) == pdTRUE);\n\n\t/* CMSIS-RTOS */\n//\treturn (int)(osMutexWait(sobj, FF_FS_TIMEOUT) == osOK);\n}\n\n\n/*------------------------------------------------------------------------*/\n/* Release Grant to Access the Volume                                     */\n/*------------------------------------------------------------------------*/\n/* This function is called on leaving file functions to unlock the volume.\n*/\n\nvoid ff_rel_grant (\n\tFF_SYNC_t sobj\t/* Sync object to be signaled */\n)\n{\n\t/* Win32 */\n\tReleaseMutex(sobj);\n\n\t/* uITRON */\n//\tsig_sem(sobj);\n\n\t/* uC/OS-II */\n//\tOSMutexPost(sobj);\n\n\t/* FreeRTOS */\n//\txSemaphoreGive(sobj);\n\n\t/* CMSIS-RTOS */\n//\tosMutexRelease(sobj);\n}\n\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/source/ffunicode.c",
    "content": "/*------------------------------------------------------------------------*/\n/* Unicode handling functions for FatFs R0.13b                            */\n/*------------------------------------------------------------------------*/\n/* This module will occupy a huge memory in the .const section when the    /\n/  FatFs is configured for LFN with DBCS. If the system has any Unicode    /\n/  utilitiy for the code conversion, this module should be modified to use /\n/  that function to avoid silly memory consumption.                        /\n/-------------------------------------------------------------------------*/\n/*\n/ Copyright (C) 2018, ChaN, all right reserved.\n/\n/ FatFs module is an open source software. Redistribution and use of FatFs in\n/ source and binary forms, with or without modification, are permitted provided\n/ that the following condition is met:\n/\n/ 1. Redistributions of source code must retain the above copyright notice,\n/    this condition and the following disclaimer.\n/\n/ This software is provided by the copyright holder and contributors \"AS IS\"\n/ and any warranties related to this software are DISCLAIMED.\n/ The copyright owner or contributors be NOT LIABLE for any damages caused\n/ by use of this software.\n*/\n\n\n#include \"ff.h\"\n\n#if FF_USE_LFN\t/* This module is blanked when non-LFN configuration */\n\n#if FF_DEFINED != 63463\t/* Revision ID */\n#error Wrong include file (ff.h).\n#endif\n\n#define MERGE2(a, b) a ## b\n#define CVTBL(tbl, cp) MERGE2(tbl, cp)\n\n\n/*------------------------------------------------------------------------*/\n/* Code Conversion Tables                                                 */\n/*------------------------------------------------------------------------*/\n\n#if FF_CODE_PAGE == 932 || FF_CODE_PAGE == 0\t/* Japanese */\nstatic const WCHAR uni2oem932[] = {\t/* Unicode --> Shift_JIS pairs */\n\t0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D,\t0x00B4, 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180,\n\t0x0391, 0x839F, 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2,\t0x0395, 0x83A3, 0x0396, 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6,\n\t0x0399, 0x83A7, 0x039A, 0x83A8, 0x039B, 0x83A9, 0x039C, 0x83AA,\t0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, 0x83AD, 0x03A0, 0x83AE,\n\t0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, 0x03A5, 0x83B2,\t0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, 0x83B6,\n\t0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2,\t0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6,\n\t0x03B9, 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA,\t0x03BD, 0x83CB, 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE,\n\t0x03C1, 0x83CF, 0x03C3, 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2,\t0x03C6, 0x83D3, 0x03C7, 0x83D4, 0x03C8, 0x83D5, 0x03C9, 0x83D6,\n\t0x0401, 0x8446, 0x0410, 0x8440, 0x0411, 0x8441, 0x0412, 0x8442,\t0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, 0x0416, 0x8447,\n\t0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, 0x844B,\t0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F,\n\t0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453,\t0x0423, 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457,\n\t0x0427, 0x8458, 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B,\t0x042B, 0x845C, 0x042C, 0x845D, 0x042D, 0x845E, 0x042E, 0x845F,\n\t0x042F, 0x8460, 0x0430, 0x8470, 0x0431, 0x8471, 0x0432, 0x8472,\t0x0433, 0x8473, 0x0434, 0x8474, 0x0435, 0x8475, 0x0436, 0x8477,\n\t0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, 0x043A, 0x847B,\t0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, 0x8480,\n\t0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484,\t0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488,\n\t0x0447, 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C,\t0x044B, 0x848D, 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490,\n\t0x044F, 0x8491, 0x0451, 0x8476, 0x2010, 0x815D, 0x2015, 0x815C,\t0x2018, 0x8165, 0x2019, 0x8166, 0x201C, 0x8167, 0x201D, 0x8168,\n\t0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, 0x8164, 0x2026, 0x8163,\t0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, 0x203B, 0x81A6,\n\t0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, 0x81F0,\t0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757,\n\t0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B,\t0x2168, 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41,\n\t0x2172, 0xFA42, 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45,\t0x2176, 0xFA46, 0x2177, 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49,\n\t0x2190, 0x81A9, 0x2191, 0x81AA, 0x2192, 0x81A8, 0x2193, 0x81AB,\t0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, 0x81CD, 0x2202, 0x81DD,\n\t0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, 0x220B, 0x81B9,\t0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, 0x8187,\n\t0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8,\t0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7,\n\t0x222C, 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6,\t0x223D, 0x81E4, 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF,\n\t0x2266, 0x8185, 0x2267, 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2,\t0x2282, 0x81BC, 0x2283, 0x81BD, 0x2286, 0x81BA, 0x2287, 0x81BB,\n\t0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, 0x81DC, 0x2460, 0x8740,\t0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, 0x2464, 0x8744,\n\t0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, 0x8748,\t0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C,\n\t0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750,\t0x2471, 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F,\n\t0x2501, 0x84AA, 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1,\t0x250F, 0x84AC, 0x2510, 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4,\n\t0x2517, 0x84AF, 0x2518, 0x84A3, 0x251B, 0x84AE, 0x251C, 0x84A5,\t0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, 0x84B0, 0x2524, 0x84A7,\n\t0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, 0x252C, 0x84A6,\t0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, 0x84A8,\n\t0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9,\t0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1,\n\t0x25A1, 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5,\t0x25BD, 0x81A4, 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B,\n\t0x25CE, 0x819D, 0x25CF, 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A,\t0x2606, 0x8199, 0x2640, 0x818A, 0x2642, 0x8189, 0x266A, 0x81F4,\n\t0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, 0x8140, 0x3001, 0x8141,\t0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, 0x3006, 0x8159,\n\t0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, 0x8173,\t0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177,\n\t0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7,\t0x3013, 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780,\n\t0x301F, 0x8781, 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1,\t0x3044, 0x82A2, 0x3045, 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5,\n\t0x3048, 0x82A6, 0x3049, 0x82A7, 0x304A, 0x82A8, 0x304B, 0x82A9,\t0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, 0x82AC, 0x304F, 0x82AD,\n\t0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, 0x3053, 0x82B1,\t0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, 0x82B5,\n\t0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9,\t0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD,\n\t0x3060, 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1,\t0x3064, 0x82C2, 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5,\n\t0x3068, 0x82C6, 0x3069, 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9,\t0x306C, 0x82CA, 0x306D, 0x82CB, 0x306E, 0x82CC, 0x306F, 0x82CD,\n\t0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, 0x82D0, 0x3073, 0x82D1,\t0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, 0x3077, 0x82D5,\n\t0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, 0x82D9,\t0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD,\n\t0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1,\t0x3084, 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5,\n\t0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9,\t0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED,\n\t0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1,\t0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, 0x309E, 0x8155,\n\t0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, 0x30A4, 0x8343,\t0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, 0x30A8, 0x8347,\n\t0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, 0x30AC, 0x834B,\t0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, 0x30B0, 0x834F,\n\t0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, 0x30B4, 0x8353,\t0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, 0x30B8, 0x8357,\n\t0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, 0x30BC, 0x835B,\t0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, 0x30C0, 0x835F,\n\t0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, 0x30C4, 0x8363,\t0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, 0x30C8, 0x8367,\n\t0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, 0x30CC, 0x836B,\t0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, 0x30D0, 0x836F,\n\t0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, 0x30D4, 0x8373,\t0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, 0x30D8, 0x8377,\n\t0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, 0x30DC, 0x837B,\t0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, 0x30E0, 0x8380,\n\t0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, 0x30E4, 0x8384,\t0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, 0x30E8, 0x8388,\n\t0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, 0x30EC, 0x838C,\t0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, 0x30F0, 0x8390,\n\t0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, 0x30F4, 0x8394,\t0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, 0x30FC, 0x815B,\n\t0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, 0x3232, 0x878B,\t0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, 0x32A6, 0x8787,\n\t0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, 0x330D, 0x8769,\t0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, 0x3323, 0x876B,\n\t0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, 0x3336, 0x8766,\t0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, 0x334D, 0x8762,\n\t0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, 0x337C, 0x878F,\t0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, 0x338F, 0x8773,\n\t0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, 0x33A1, 0x8775,\t0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, 0x4E01, 0x929A,\n\t0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, 0x4E09, 0x8E4F,\t0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, 0x4E0E, 0x975E,\n\t0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, 0x4E15, 0x98A1,\t0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, 0x4E19, 0x95B8,\n\t0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, 0x4E28, 0xFA68,\t0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, 0x4E32, 0x8BF8,\n\t0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, 0x4E3B, 0x8EE5,\t0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, 0x4E43, 0x9454,\n\t0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, 0x4E4E, 0x8CC1,\t0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, 0x4E57, 0x8FE6,\n\t0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, 0x4E5E, 0x8CEE,\t0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, 0x4E73, 0x93FB,\n\t0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, 0x4E85, 0x98AB,\t0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, 0x4E8A, 0x98AD,\n\t0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, 0x4E91, 0x895D,\t0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, 0x4E98, 0x986A,\n\t0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, 0x4E9E, 0x98B1,\t0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, 0x4EA2, 0x98B4,\n\t0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, 0x4EA8, 0x8B9C,\t0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, 0x4EAE, 0x97BA,\n\t0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, 0x4EBA, 0x906C,\t0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, 0x4EC4, 0x98BA,\n\t0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, 0x4ECB, 0x89EE,\t0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, 0x4ED4, 0x8E65,\n\t0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, 0x4ED8, 0x9574,\t0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, 0x4EDF, 0x98C0,\n\t0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, 0x4EE5, 0x88C8,\t0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, 0x4EF2, 0x9287,\n\t0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, 0x4EFC, 0xFA6A,\t0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, 0x4F09, 0x98C2,\n\t0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, 0x4F0F, 0x959A,\t0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, 0x4F1C, 0x98E5,\n\t0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, 0x4F34, 0x94BA,\t0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, 0x4F3A, 0x8E66,\n\t0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, 0x4F46, 0x9241,\t0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, 0x4F4F, 0x8F5A,\n\t0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, 0x4F55, 0x89BD,\t0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, 0x4F5A, 0x98C3,\n\t0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, 0x4F5E, 0x9B43,\t0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, 0x4F73, 0x89C0,\n\t0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, 0x4F7C, 0x8CF1,\t0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, 0x4F88, 0x98CA,\n\t0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, 0x4F8F, 0x98CB,\t0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, 0x4F96, 0x98D3,\n\t0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, 0x4F9D, 0x88CB,\t0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, 0x4FAD, 0x9699,\n\t0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, 0x4FB6, 0x97B5,\t0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, 0x4FC4, 0x89E2,\n\t0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, 0x4FCE, 0x98D7,\t0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, 0x4FD7, 0x91AD,\n\t0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, 0x4FDD, 0x95DB,\t0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, 0x4FE4, 0x98DD,\n\t0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, 0x4FF3, 0x946F,\t0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, 0x4FFA, 0x89B4,\n\t0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, 0x5006, 0x98ED,\t0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, 0x500F, 0xE0C5,\n\t0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, 0x5016, 0x8CF4,\t0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, 0x501F, 0x8ED8,\n\t0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, 0x5024, 0x926C,\t0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, 0x5029, 0x98E8,\n\t0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, 0x502D, 0x9860,\t0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, 0x5042, 0xFA7A,\n\t0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, 0x5048, 0x98F3,\t0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, 0x5055, 0x98F1,\n\t0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, 0x5065, 0x8C92,\t0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, 0x5074, 0x91A4,\n\t0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, 0x507D, 0x8B55,\t0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, 0x5091, 0x8C86,\n\t0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, 0x509A, 0x98F9,\t0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, 0x50B3, 0x9942,\n\t0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, 0x50BE, 0x8C58,\t0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, 0x50CA, 0x9941,\n\t0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, 0x50D5, 0x966C,\t0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, 0x50DE, 0x9945,\n\t0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, 0x50ED, 0x9947,\t0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, 0x50F9, 0x994A,\n\t0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, 0x5102, 0x994E,\t0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, 0x5114, 0x9951,\n\t0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, 0x511A, 0x9952,\t0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, 0x5132, 0x96D7,\n\t0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, 0x513C, 0x9956,\t0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, 0x5143, 0x8CB3,\n\t0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, 0x5147, 0x8BA2,\t0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, 0x514B, 0x8D8E,\n\t0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, 0x5150, 0x8E99,\t0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, 0x515C, 0x8A95,\n\t0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, 0x5168, 0x9153,\t0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, 0x516C, 0x8CF6,\n\t0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, 0x5175, 0x95BA,\t0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, 0x517C, 0x8C93,\n\t0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, 0x5186, 0x897E,\t0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, 0x518D, 0x8DC4,\n\t0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, 0x5192, 0x9660,\t0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, 0x5197, 0x8FE7,\n\t0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, 0x51A2, 0x996E,\t0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, 0x51A8, 0x9579,\n\t0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, 0x51AC, 0x937E,\t0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, 0x51B3, 0x9972,\n\t0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, 0x51B7, 0x97E2,\t0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, 0x51C5, 0x9978,\n\t0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, 0x51CC, 0x97BD,\t0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, 0x51DC, 0xEAA3,\n\t0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, 0x51E6, 0x8F88,\t0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, 0x51EC, 0xFA83,\n\t0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, 0x51F5, 0x9981,\t0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, 0x51FA, 0x8F6F,\n\t0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, 0x5203, 0x906E,\t0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, 0x5208, 0x8AA0,\n\t0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, 0x5211, 0x8C59,\t0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, 0x521D, 0x8F89,\n\t0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, 0x5229, 0x9798,\t0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, 0x5233, 0x998A,\n\t0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, 0x5239, 0x998B,\t0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, 0x5244, 0x998D,\n\t0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, 0x524C, 0x998F,\t0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, 0x5256, 0x9655,\n\t0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, 0x5264, 0x8DDC,\t0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, 0x526F, 0x959B,\n\t0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, 0x5273, 0x9995,\t0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, 0x527F, 0x9996,\n\t0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, 0x5289, 0x97AB,\t0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, 0x5294, 0x9999,\n\t0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, 0x52A0, 0x89C1,\t0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, 0x52AA, 0x9377,\n\t0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, 0x52AF, 0xFB77,\t0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, 0x52B9, 0x8CF8,\n\t0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, 0x52C1, 0x99A4,\t0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, 0x52C9, 0x95D7,\n\t0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, 0x52D7, 0x99A6,\t0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, 0x52DD, 0x8F9F,\n\t0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, 0x52E2, 0x90A8,\t0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, 0x52E7, 0x8AA9,\n\t0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, 0x52F8, 0x99AE,\t0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, 0x52FF, 0x96DC,\n\t0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, 0x5305, 0x95EF,\t0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, 0x530D, 0x99B3,\n\t0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, 0x5316, 0x89BB,\t0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, 0x531D, 0x9178,\n\t0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, 0x5324, 0xFA8B,\t0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, 0x5333, 0x99BB,\n\t0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, 0x533B, 0x88E3,\t0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, 0x5343, 0x90E7,\n\t0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, 0x5348, 0x8CDF,\t0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, 0x5351, 0x94DA,\n\t0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, 0x5357, 0x93EC,\t0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, 0x535E, 0x99C4,\n\t0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, 0x536E, 0x99C6,\t0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, 0x5372, 0xFA8C,\n\t0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, 0x5377, 0x99C9,\t0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, 0x5382, 0x99CA,\n\t0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, 0x5398, 0x97D0,\t0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, 0x53A5, 0x99CE,\n\t0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, 0x53AD, 0x897D,\t0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, 0x53B3, 0x8CB5,\n\t0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, 0x53C3, 0x99D2,\t0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, 0x53CB, 0x9746,\n\t0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, 0x53D4, 0x8F66,\t0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, 0x53DB, 0x94BE,\n\t0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, 0x53E2, 0x9170,\t0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, 0x53E8, 0x99D9,\n\t0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, 0x53EC, 0x8FA2,\t0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, 0x53F0, 0x91E4,\n\t0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, 0x53F6, 0x8A90,\t0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, 0x5401, 0x99DC,\n\t0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, 0x5409, 0x8B67,\t0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, 0x540D, 0x96BC,\n\t0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, 0x5411, 0x8CFC,\t0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, 0x5420, 0x9669,\n\t0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, 0x542C, 0x99DF,\t0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, 0x5438, 0x8B7A,\n\t0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, 0x543D, 0x99DD,\t0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, 0x5446, 0x95F0,\n\t0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, 0x544E, 0x99E6,\t0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, 0x546A, 0x8EF4,\n\t0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, 0x5475, 0x99E8,\t0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, 0x547C, 0x8CC4,\n\t0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, 0x5486, 0x99F4,\t0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, 0x548E, 0x99E9,\n\t0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, 0x549C, 0xFA91,\t0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, 0x54A8, 0x99FC,\n\t0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, 0x54AF, 0x9A5D,\t0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, 0x54BC, 0x9A44,\n\t0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, 0x54C1, 0x9569,\t0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, 0x54C8, 0x99FB,\n\t0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, 0x54E2, 0x9A4E,\t0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, 0x54E9, 0x9689,\n\t0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, 0x54FA, 0x9A4D,\t0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, 0x5506, 0x8DB4,\n\t0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, 0x5514, 0x9A49,\t0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, 0x5531, 0x8FA5,\n\t0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, 0x553E, 0x91C1,\t0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, 0x5546, 0x8FA4,\n\t0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, 0x5556, 0x9A56,\t0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, 0x5563, 0x9A51,\n\t0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, 0x5580, 0x9A5C,\t0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, 0x5587, 0x9A68,\n\t0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, 0x5598, 0x9A62,\t0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, 0x559D, 0x8A85,\n\t0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, 0x55A8, 0x9A69,\t0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, 0x55AC, 0x8BAA,\n\t0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, 0x55C4, 0x9A6D,\t0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, 0x55DA, 0x9A6A,\n\t0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, 0x55E4, 0x9A6F,\t0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, 0x55FE, 0x9A74,\n\t0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, 0x5616, 0x9A73,\t0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, 0x5629, 0x89DC,\n\t0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, 0x5634, 0x9A7B,\t0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, 0x564C, 0x9158,\n\t0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, 0x5664, 0x9A81,\t0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, 0x566C, 0x9A83,\n\t0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, 0x5680, 0x9A86,\t0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, 0x568F, 0x9A8A,\n\t0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, 0x56A5, 0x9A8B,\t0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, 0x56BC, 0x9A90,\n\t0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, 0x56C3, 0x9A92,\t0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, 0x56D3, 0x9A97,\n\t0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, 0x56DB, 0x8E6C,\t0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, 0x56EE, 0x9A99,\n\t0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, 0x56F9, 0x9A9A,\t0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, 0x5700, 0x9A9B,\n\t0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, 0x5709, 0x9A9E,\t0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, 0x5712, 0x8980,\n\t0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, 0x571C, 0x9AA6,\t0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, 0x5728, 0x8DDD,\n\t0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, 0x5738, 0x9AA9,\t0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, 0x5747, 0x8BCF,\n\t0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, 0x5750, 0x8DBF,\t0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, 0x5764, 0x8DA3,\n\t0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, 0x576A, 0x92D8,\t0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, 0x5789, 0x9AB3,\n\t0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, 0x57A2, 0x8D43,\t0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, 0x57AC, 0xFA98,\n\t0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, 0x57C3, 0x9ABA,\t0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, 0x57CB, 0x9684,\n\t0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, 0x57D4, 0x9ABC,\t0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, 0x57E0, 0x9575,\n\t0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, 0x57F9, 0x947C,\t0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, 0x5802, 0x93B0,\n\t0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, 0x580B, 0x9AC2,\t0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, 0x5821, 0x9AC6,\n\t0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, 0x5830, 0x8981,\t0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, 0x583A, 0x8DE4,\n\t0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, 0x584A, 0x89F2,\t0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, 0x5854, 0x9383,\n\t0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, 0x585A, 0x92CB,\t0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, 0x586B, 0x9355,\n\t0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, 0x5879, 0x9ACD,\t0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, 0x5893, 0x95E6,\n\t0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, 0x589F, 0x9AD0,\t0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, 0x58B2, 0xFA9E,\n\t0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, 0x58BA, 0x9AD2,\t0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, 0x58C5, 0x9AD7,\n\t0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, 0x58D1, 0x9AD9,\t0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, 0x58D8, 0x9ADC,\n\t0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, 0x58DF, 0x9AE0,\t0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, 0x58EC, 0x9070,\n\t0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, 0x58F1, 0x88EB,\t0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, 0x58FA, 0x9AE2,\n\t0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, 0x5902, 0x9AE7,\t0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, 0x590F, 0x89C4,\n\t0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, 0x5918, 0x99C7,\t0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, 0x591C, 0x96E9,\n\t0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, 0x5929, 0x9356,\t0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, 0x592D, 0x9AEE,\n\t0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, 0x5937, 0x88CE,\t0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, 0x5947, 0x8AEF,\n\t0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, 0x594F, 0x9174,\t0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, 0x5954, 0x967A,\n\t0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, 0x595A, 0x9AF6,\t0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, 0x5962, 0x9AF8,\n\t0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, 0x5968, 0x8FA7,\t0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, 0x596E, 0x95B1,\n\t0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, 0x597D, 0x8D44,\t0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, 0x5984, 0x96CF,\n\t0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, 0x5996, 0x9764,\t0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, 0x59A3, 0x9B45,\n\t0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, 0x59AC, 0x9369,\t0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, 0x59BB, 0x8DC8,\n\t0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, 0x59CB, 0x8E6E,\t0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, 0x59D4, 0x88CF,\n\t0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, 0x59E5, 0x8957,\t0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, 0x59EB, 0x9550,\n\t0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, 0x5A01, 0x88D0,\t0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, 0x5A18, 0x96BA,\n\t0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, 0x5A20, 0x9050,\t0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, 0x5A35, 0x9B56,\n\t0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, 0x5A41, 0x984B,\t0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, 0x5A62, 0x9B58,\n\t0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, 0x5A7F, 0x96B9,\t0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, 0x5ABC, 0x9B5B,\n\t0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, 0x5AC2, 0x9B5E,\t0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, 0x5AD0, 0x9B6B,\n\t0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, 0x5AE3, 0x9B60,\t0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, 0x5AFB, 0x9B66,\n\t0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, 0x5B16, 0x9B69,\t0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, 0x5B30, 0x8964,\n\t0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, 0x5B40, 0x9B71,\t0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, 0x5B51, 0x9B72,\n\t0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, 0x5B57, 0x8E9A,\t0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, 0x5B5C, 0x8E79,\n\t0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, 0x5B64, 0x8CC7,\t0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, 0x5B6B, 0x91B7,\n\t0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, 0x5B75, 0x9B7A,\t0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, 0x5B83, 0x9B80,\n\t0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, 0x5B89, 0x88C0,\t0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, 0x5B8F, 0x8D47,\n\t0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, 0x5B99, 0x9288,\t0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, 0x5B9D, 0x95F3,\n\t0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, 0x5BA4, 0x8EBA,\t0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, 0x5BB0, 0x8DC9,\n\t0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, 0x5BB6, 0x89C6,\t0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, 0x5BC0, 0xFAA7,\n\t0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, 0x5BC5, 0x93D0,\t0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, 0x5BCC, 0x9578,\n\t0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, 0x5BD4, 0x9B86,\t0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, 0x5BDE, 0x9B8B,\n\t0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, 0x5BE4, 0x9B88,\t0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, 0x5BE8, 0x9ECB,\n\t0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, 0x5BEE, 0x97BE,\t0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, 0x5BF6, 0x9B8F,\n\t0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, 0x5BFF, 0x8EF5,\t0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, 0x5C05, 0x9B91,\n\t0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, 0x5C09, 0x88D1,\t0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, 0x5C0E, 0x93B1,\n\t0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, 0x5C16, 0x90EB,\t0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, 0x5C22, 0x9B97,\n\t0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, 0x5C31, 0x8F41,\t0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, 0x5C3B, 0x904B,\n\t0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, 0x5C3F, 0x9441,\t0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, 0x5C46, 0x9B9C,\n\t0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, 0x5C4D, 0x8E72,\t0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, 0x5C51, 0x8BFB,\n\t0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, 0x5C60, 0x936A,\t0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, 0x5C6C, 0x9BA2,\n\t0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, 0x5C76, 0x9BA5,\t0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, 0x5C91, 0x9BA8,\n\t0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, 0x5CA8, 0x915A,\t0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, 0x5CB1, 0x91D0,\n\t0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, 0x5CB8, 0x8ADD,\t0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, 0x5CBE, 0x9BB1,\n\t0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, 0x5CE0, 0x93BB,\t0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, 0x5CEA, 0x9BB9,\n\t0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, 0x5CF5, 0xFAAE,\t0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, 0x5CFD, 0x9BB5,\n\t0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, 0x5D11, 0x9BC0,\t0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, 0x5D17, 0x9BBC,\n\t0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, 0x5D1B, 0x9BBF,\t0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, 0x5D29, 0x95F6,\n\t0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, 0x5D4E, 0x9BC8,\t0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, 0x5D5C, 0x9BBD,\n\t0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, 0x5D6F, 0x8DB5,\t0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, 0x5D84, 0x9BCE,\n\t0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, 0x5D90, 0x9BD5,\t0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, 0x5DAE, 0x9BD3,\n\t0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, 0x5DBA, 0x97E4,\t0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, 0x5DCC, 0x8ADE,\n\t0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, 0x5DD3, 0x9BDA,\t0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, 0x5DDE, 0x8F42,\n\t0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, 0x5DE6, 0x8DB6,\t0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, 0x5DEE, 0x8DB7,\n\t0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, 0x5DF4, 0x9462,\t0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, 0x5DFD, 0x9246,\n\t0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, 0x5E06, 0x94BF,\t0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, 0x5E16, 0x929F,\n\t0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, 0x5E1D, 0x92E9,\t0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, 0x5E2F, 0x91D1,\n\t0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, 0x5E37, 0x9BE7,\t0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, 0x5E43, 0x9BE9,\n\t0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, 0x5E4C, 0x9679,\t0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, 0x5E57, 0x9BEC,\n\t0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, 0x5E63, 0x95BC,\t0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, 0x5E74, 0x944E,\n\t0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, 0x5E79, 0x8AB2,\t0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, 0x5E7D, 0x9748,\n\t0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, 0x5E83, 0x8D4C,\t0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, 0x5E8F, 0x8F98,\n\t0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, 0x5E9A, 0x8D4D,\t0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, 0x5EA7, 0x8DC0,\n\t0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, 0x5EB6, 0x8F8E,\t0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, 0x5EC2, 0x9BF9,\n\t0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, 0x5ECA, 0x984C,\t0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, 0x5ED6, 0x9C40,\n\t0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, 0x5EDF, 0x955F,\t0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, 0x5EE3, 0x9C41,\n\t0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, 0x5EF0, 0x9C4C,\t0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, 0x5EF6, 0x8984,\n\t0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, 0x5EFB, 0x89F4,\t0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, 0x5F01, 0x95D9,\n\t0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, 0x5F0A, 0x95BE,\t0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, 0x5F0F, 0x8EAE,\n\t0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, 0x5F14, 0x92A2,\t0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, 0x5F18, 0x8D4F,\n\t0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, 0x5F25, 0x96ED,\t0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, 0x5F2D, 0x9C58,\n\t0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, 0x5F35, 0x92A3,\t0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, 0x5F3E, 0x9265,\n\t0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, 0x5F4A, 0x8BAE,\t0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, 0x5F53, 0x9396,\n\t0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, 0x5F5C, 0x9C53,\t0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, 0x5F66, 0x9546,\n\t0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, 0x5F6B, 0x92A4,\t0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, 0x5F71, 0x8965,\n\t0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, 0x5F7C, 0x94DE,\t0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, 0x5F82, 0x9C68,\n\t0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, 0x5F87, 0x9C6D,\t0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, 0x5F8C, 0x8CE3,\n\t0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, 0x5F93, 0x8F5D,\t0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, 0x5F9E, 0x9C6E,\n\t0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, 0x5FA9, 0x959C,\t0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, 0x5FB3, 0x93BF,\n\t0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, 0x5FBC, 0x9C74,\t0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, 0x5FCC, 0x8AF5,\n\t0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, 0x5FD8, 0x9659,\t0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, 0x5FDE, 0xFABB,\n\t0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, 0x5FF0, 0x9CAB,\t0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, 0x5FFB, 0x9C76,\n\t0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, 0x600F, 0x9C89,\t0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, 0x6016, 0x957C,\n\t0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, 0x601D, 0x8E76,\t0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, 0x6026, 0x9C88,\n\t0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, 0x602A, 0x89F6,\t0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, 0x603A, 0x9C8A,\n\t0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, 0x6046, 0x9C91,\t0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, 0x6050, 0x8BB0,\n\t0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, 0x605A, 0x9C8B,\t0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, 0x6062, 0x89F8,\n\t0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, 0x6068, 0x8DA6,\t0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, 0x606C, 0x9C97,\n\t0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, 0x6075, 0x8C62,\t0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, 0x6084, 0x9C9F,\n\t0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, 0x608B, 0x9CA5,\t0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, 0x6094, 0x89F7,\n\t0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, 0x609B, 0x9CA0,\t0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, 0x60A6, 0x8978,\n\t0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, 0x60B2, 0x94DF,\t0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, 0x60B6, 0x96E3,\n\t0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, 0x60C5, 0x8FEE,\t0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, 0x60D3, 0x9CA9,\n\t0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, 0x60DC, 0x90C9,\t0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, 0x60E1, 0x9CA6,\n\t0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, 0x60F0, 0x91C4,\t0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, 0x60F4, 0x9CB6,\n\t0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, 0x60FA, 0x9CB7,\t0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, 0x6103, 0x9CB8,\n\t0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, 0x610D, 0x9CBC,\t0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, 0x6115, 0x9CB1,\n\t0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, 0x6120, 0xFAC1,\t0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, 0x612C, 0x9CC5,\n\t0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, 0x613C, 0x9CC4,\t0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, 0x6142, 0x9CC8,\n\t0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, 0x614A, 0x9CC2,\t0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, 0x614E, 0x9054,\n\t0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, 0x6159, 0x9CCD,\t0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, 0x6162, 0x969D,\n\t0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, 0x6168, 0x8A53,\t0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, 0x6170, 0x88D4,\n\t0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, 0x6175, 0x9CD7,\t0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, 0x6182, 0x974A,\n\t0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, 0x6190, 0x97F7,\t0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, 0x6198, 0xFAC6,\n\t0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, 0x61A7, 0x93B2,\t0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, 0x61AE, 0x9CE1,\n\t0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, 0x61BE, 0x8AB6,\t0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, 0x61C8, 0x9CE6,\n\t0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, 0x61CC, 0x9CE2,\t0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, 0x61E6, 0x9CED,\n\t0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, 0x61F7, 0x9CE5,\t0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, 0x61FD, 0x9CF3,\n\t0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, 0x6208, 0x9CF7,\t0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, 0x620D, 0x9CF9,\n\t0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, 0x6212, 0x89FA,\t0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, 0x621A, 0x90CA,\n\t0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, 0x621F, 0x8C81,\t0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, 0x622E, 0x9D43,\n\t0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, 0x6233, 0x9D46,\t0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, 0x623F, 0x965B,\n\t0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, 0x6248, 0xE7BB,\t0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, 0x624E, 0x9D48,\n\t0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, 0x625B, 0x9D4B,\t0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, 0x6268, 0x9D4D,\n\t0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, 0x6279, 0x94E1,\t0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, 0x6280, 0x8B5A,\n\t0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, 0x6289, 0x9D50,\t0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, 0x6293, 0x9D53,\n\t0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, 0x6297, 0x8D52,\t0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, 0x629E, 0x91F0,\n\t0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, 0x62B1, 0x95F8,\t0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, 0x62BC, 0x899F,\n\t0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, 0x62C6, 0x9D5D,\t0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, 0x62CA, 0x9D62,\n\t0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, 0x62D0, 0x89FB,\t0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, 0x62D4, 0x9D55,\n\t0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, 0x62DB, 0x8FB5,\t0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, 0x62E1, 0x8A67,\n\t0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, 0x62EF, 0x9D6D,\t0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, 0x62F6, 0x8E41,\n\t0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, 0x6301, 0x8E9D,\t0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, 0x6309, 0x88C2,\n\t0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, 0x631F, 0x8BB2,\t0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, 0x632F, 0x9055,\n\t0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, 0x633F, 0x917D,\t0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, 0x634F, 0x9D73,\n\t0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, 0x635C, 0x917B,\t0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, 0x636B, 0x9D7E,\n\t0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, 0x6377, 0x8FB7,\t0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, 0x6383, 0x917C,\n\t0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, 0x638E, 0x9D75,\t0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, 0x6398, 0x8C40,\n\t0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, 0x63A1, 0x8DCC,\t0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, 0x63A7, 0x8D54,\n\t0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, 0x63AB, 0x9D77,\t0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, 0x63B5, 0x9D7D,\n\t0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, 0x63C3, 0x91B5,\t0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, 0x63CF, 0x9560,\n\t0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, 0x63DA, 0x9767,\t0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, 0x63E9, 0x9D82,\n\t0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, 0x63F6, 0x9D88,\t0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, 0x640F, 0x9D93,\n\t0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, 0x641C, 0x9D72,\t0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, 0x642D, 0x938B,\n\t0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, 0x643E, 0x8DEF,\t0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, 0x6460, 0xFACA,\n\t0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, 0x6476, 0x9D96,\t0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, 0x6488, 0x9D9D,\n\t0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, 0x649A, 0x9451,\t0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, 0x64A5, 0x9D9B,\n\t0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, 0x64AE, 0x8E42,\t0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, 0x64BB, 0x9DA3,\n\t0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, 0x64C5, 0x9DA1,\t0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, 0x64D2, 0x9DA0,\n\t0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, 0x64E0, 0x9DA9,\t0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, 0x64E6, 0x8E43,\n\t0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, 0x64F1, 0x9DA6,\t0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, 0x64FA, 0x9DB2,\n\t0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, 0x6505, 0x9DB7,\t0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, 0x6523, 0x9DB9,\n\t0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, 0x652C, 0x9DAE,\t0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, 0x6536, 0x9DBE,\n\t0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, 0x653B, 0x8D55,\t0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, 0x6548, 0x9DC1,\n\t0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, 0x6551, 0x8B7E,\t0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, 0x6558, 0x9DC5,\n\t0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, 0x6562, 0x8AB8,\t0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, 0x6570, 0x9094,\n\t0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, 0x6577, 0x957E,\t0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, 0x6587, 0x95B6,\n\t0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, 0x658E, 0x8DD6,\t0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, 0x6599, 0x97BF,\n\t0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, 0x65A1, 0x88B4,\t0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, 0x65AB, 0x9DCF,\n\t0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, 0x65B0, 0x9056,\t0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, 0x65BD, 0x8E7B,\n\t0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, 0x65C5, 0x97B7,\t0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, 0x65CF, 0x91B0,\n\t0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, 0x65DB, 0x9DD7,\t0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, 0x65E5, 0x93FA,\n\t0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, 0x65E9, 0x9181,\t0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, 0x65FA, 0x89A0,\n\t0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, 0x6603, 0x9DDE,\t0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, 0x660A, 0x9DDD,\n\t0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, 0x6613, 0x88D5,\t0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, 0x661E, 0xFAD3,\n\t0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, 0x6625, 0x8F74,\t0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, 0x662E, 0xFAD2,\n\t0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, 0x6635, 0x9DE1,\t0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, 0x663F, 0x9E45,\n\t0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, 0x6644, 0x9DE6,\t0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, 0x6652, 0x8E4E,\n\t0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, 0x665E, 0x9DE9,\t0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, 0x6665, 0xFAD5,\n\t0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, 0x6669, 0x94D3,\t0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, 0x6673, 0xFAD9,\n\t0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, 0x6681, 0x8BC5,\t0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, 0x6688, 0x9DF2,\n\t0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, 0x6696, 0x9267,\t0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, 0x669D, 0x9DF7,\n\t0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, 0x66AB, 0x8E62,\t0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, 0x66B8, 0x9E41,\n\t0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, 0x66BF, 0xFADD,\t0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, 0x66C9, 0x9DFA,\n\t0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, 0x66DC, 0x976A,\t0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, 0x66E9, 0x9E47,\n\t0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, 0x66F4, 0x8D58,\t0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, 0x66F9, 0x9182,\n\t0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, 0x66FD, 0x915D,\t0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, 0x6703, 0x98F0,\n\t0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, 0x670D, 0x959E,\t0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, 0x6715, 0x92BD,\n\t0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, 0x671D, 0x92A9,\t0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, 0x6727, 0x9E4F,\n\t0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, 0x672C, 0x967B,\t0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, 0x6734, 0x9670,\n\t0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, 0x673A, 0x8AF7,\t0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, 0x6746, 0x9E57,\n\t0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, 0x6750, 0x8DDE,\t0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, 0x6759, 0x9E5A,\n\t0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, 0x6760, 0x9E59,\t0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, 0x6764, 0x9E5C,\n\t0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, 0x676D, 0x8D59,\t0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, 0x6772, 0x9DDC,\n\t0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, 0x677C, 0x9E60,\t0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, 0x6787, 0x94F8,\n\t0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, 0x6790, 0x90CD,\t0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, 0x679C, 0x89CA,\n\t0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, 0x67A2, 0x9095,\t0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, 0x67B3, 0x9E6B,\n\t0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, 0x67B8, 0x9E6D,\t0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, 0x67C1, 0x91C6,\n\t0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, 0x67CE, 0x9E74,\t0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, 0x67D3, 0x90F5,\n\t0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, 0x67DD, 0x9E70,\t0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, 0x67E7, 0x9E76,\n\t0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, 0x67EF, 0x9E68,\t0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, 0x67F5, 0x8DF2,\n\t0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, 0x6801, 0xFAE5,\t0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, 0x6813, 0x90F0,\n\t0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, 0x6821, 0x8D5A,\t0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, 0x682B, 0x9E81,\n\t0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, 0x6839, 0x8DAA,\t0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, 0x6841, 0x8C85,\n\t0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, 0x6846, 0x9E79,\t0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, 0x6850, 0x8BCB,\n\t0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, 0x6854, 0x8B6A,\t0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, 0x685F, 0x8E56,\n\t0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, 0x6876, 0x89B1,\t0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, 0x6881, 0x97C0,\n\t0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, 0x688F, 0x9E87,\t0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, 0x689B, 0x9E8B,\n\t0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, 0x68A2, 0x8FBD,\t0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, 0x68AD, 0x9E88,\n\t0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, 0x68B3, 0x9E80,\t0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, 0x68BA, 0x9E92,\n\t0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, 0x68C8, 0xFA64,\t0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, 0x68CD, 0x9E9E,\n\t0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, 0x68D5, 0x9EA1,\t0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, 0x68DF, 0x938F,\n\t0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, 0x68E7, 0x9EA0,\t0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, 0x68F9, 0x9EA8,\n\t0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, 0x6904, 0x9EA4,\t0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, 0x690C, 0x9E9D,\n\t0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, 0x6912, 0x9EA3,\t0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, 0x691C, 0x8C9F,\n\t0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, 0x6925, 0x9EA7,\t0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, 0x6930, 0x9EBD,\n\t0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, 0x693D, 0x9EBB,\t0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, 0x6954, 0x9EB6,\n\t0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, 0x695C, 0x9EB3,\t0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, 0x6961, 0x9EBE,\n\t0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, 0x696B, 0x9EB5,\t0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, 0x6973, 0x9480,\n\t0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, 0x6978, 0x9EB4,\t0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, 0x697E, 0x9EB7,\n\t0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, 0x698E, 0x897C,\t0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, 0x6998, 0xFAEB,\n\t0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, 0x69A7, 0x9ED0,\t0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, 0x69B4, 0x9ED6,\n\t0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, 0x69C1, 0x9EC7,\t0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, 0x69CB, 0x8D5C,\n\t0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, 0x69D0, 0x9EC5,\t0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, 0x69DD, 0x9ECD,\n\t0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, 0x69E8, 0x9ED8,\t0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, 0x69F9, 0x9EDD,\n\t0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, 0x6A02, 0x9ED9,\t0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, 0x6A0C, 0x9EEC,\n\t0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, 0x6A17, 0x9294,\t0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, 0x6A1F, 0x8FBE,\n\t0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, 0x6A29, 0x8CA0,\t0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, 0x6A30, 0xFAED,\n\t0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, 0x6A39, 0x8EF7,\t0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, 0x6A46, 0xFAEF,\n\t0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, 0x6A58, 0x8B6B,\t0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, 0x6A62, 0x9EF1,\n\t0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, 0x6A73, 0xFAF0,\t0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, 0x6A80, 0x9268,\n\t0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, 0x6A90, 0x9EF7,\t0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, 0x6AA2, 0x9EFB,\n\t0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, 0x6AAE, 0x9E8D,\t0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, 0x6AC1, 0x9EE8,\n\t0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, 0x6AD3, 0x9845,\t0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, 0x6ADF, 0x9F4A,\n\t0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, 0x6AEA, 0x9F4D,\t0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, 0x6B05, 0x9F4F,\n\t0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, 0x6B1D, 0x8954,\t0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, 0x6B23, 0x8BD3,\n\t0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, 0x6B38, 0x9F56,\t0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, 0x6B3E, 0x8ABC,\n\t0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, 0x6B4C, 0x89CC,\t0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, 0x6B54, 0x9F60,\n\t0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, 0x6B61, 0x9F63,\t0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, 0x6B66, 0x9590,\n\t0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, 0x6B73, 0x8DCE,\t0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, 0x6B7B, 0x8E80,\n\t0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, 0x6B84, 0x9F68,\t0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, 0x6B8B, 0x8E63,\n\t0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, 0x6B98, 0x9F6B,\t0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, 0x6BAB, 0x9F70,\n\t0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, 0x6BB3, 0x9F74,\t0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, 0x6BBA, 0x8E45,\n\t0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, 0x6BC0, 0x9ACA,\t0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, 0x6BCD, 0x95EA,\n\t0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, 0x6BD4, 0x94E4,\t0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, 0x6BDF, 0x9F7A,\n\t0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, 0x6BF3, 0x9F7D,\t0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, 0x6C13, 0x9F82,\n\t0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, 0x6C23, 0x9F86,\t0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, 0x6C38, 0x8969,\n\t0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, 0x6C41, 0x8F60,\t0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, 0x6C55, 0x9F88,\n\t0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, 0x6C5D, 0x93F0,\t0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, 0x6C62, 0x9F89,\n\t0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, 0x6C70, 0x91BF,\t0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, 0x6C7D, 0x8B44,\n\t0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, 0x6C83, 0x9780,\t0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, 0x6C8D, 0x9F8C,\n\t0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, 0x6C96, 0x89AB,\t0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, 0x6CA1, 0x9676,\n\t0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, 0x6CB1, 0x9F9D,\t0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, 0x6CBA, 0x9F9F,\n\t0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, 0x6CBE, 0x9F9E,\t0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, 0x6CC5, 0x9F9A,\n\t0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, 0x6CD3, 0x9F97,\t0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, 0x6CDA, 0xFAF9,\n\t0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, 0x6CE2, 0x9467,\t0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, 0x6CEA, 0x9FA3,\n\t0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, 0x6CF3, 0x896A,\t0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, 0x6D12, 0x9FAD,\n\t0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, 0x6D1E, 0x93B4,\t0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, 0x6D2A, 0x8D5E,\n\t0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, 0x6D35, 0x9FAB,\t0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, 0x6D3D, 0x9FA8,\n\t0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, 0x6D45, 0x90F3,\t0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, 0x6D63, 0x9FAF,\n\t0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, 0x6D6A, 0x9851,\t0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, 0x6D74, 0x9781,\n\t0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, 0x6D85, 0x9FB8,\t0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, 0x6D8E, 0x9FB5,\n\t0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, 0x6D99, 0x97DC,\t0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, 0x6DAF, 0x8A55,\n\t0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, 0x6DBC, 0x97C1,\t0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, 0x6DC7, 0x9FBD,\n\t0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, 0x6DD1, 0x8F69,\t0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, 0x6DD9, 0x9FC8,\n\t0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, 0x6DE6, 0x9FBE,\t0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, 0x6DEC, 0x9FC1,\n\t0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, 0x6DF3, 0x8F7E,\t0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, 0x6DF9, 0x9FB9,\n\t0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, 0x6E05, 0x90B4,\t0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, 0x6E0A, 0x9FBB,\n\t0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, 0x6E19, 0x9FD0,\t0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, 0x6E1F, 0x9FD9,\n\t0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, 0x6E24, 0x9FDD,\t0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, 0x6E29, 0x89B7,\n\t0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, 0x6E2E, 0x9FCF,\t0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, 0x6E3A, 0x9FDB,\n\t0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, 0x6E4A, 0x96A9,\t0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, 0x6E58, 0x8FC3,\n\t0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, 0x6E67, 0x974E,\t0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, 0x6E72, 0x9FD1,\n\t0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, 0x6E80, 0x969E,\t0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, 0x6E90, 0x8CB9,\n\t0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, 0x6E9D, 0x8D61,\t0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, 0x6EAA, 0x9FE2,\n\t0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, 0x6EB7, 0x9FE5,\t0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, 0x6EC2, 0x9FEF,\n\t0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, 0x6ECB, 0x8EA0,\t0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, 0x6ED4, 0x9FEB,\n\t0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, 0x6EEC, 0x9FF4,\t0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, 0x6EF7, 0xE042,\n\t0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, 0x6F01, 0x8B99,\t0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, 0x6F0F, 0x9852,\n\t0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, 0x6F15, 0x9186,\t0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, 0x6F2B, 0x969F,\n\t0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, 0x6F38, 0x9151,\t0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, 0x6F45, 0x8AC1,\n\t0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, 0x6F5C, 0x90F6,\t0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, 0x6F6D, 0xE04B,\n\t0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, 0x6F74, 0xE06B,\t0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, 0x6F80, 0xE047,\n\t0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, 0x6F86, 0xE043,\t0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, 0x6F97, 0x8AC0,\n\t0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, 0x6FAA, 0xE059,\t0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, 0x6FB9, 0xE057,\n\t0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, 0x6FC3, 0x945A,\t0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, 0x6FD8, 0xE05E,\n\t0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, 0x6FE1, 0x9447,\t0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, 0x6FEE, 0xE060,\n\t0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, 0x6FF5, 0xFB4D,\t0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, 0x7001, 0xE066,\n\t0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, 0x700B, 0xE063,\t0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, 0x7018, 0xE06D,\n\t0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, 0x701E, 0x93D2,\t0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, 0x7028, 0xFB50,\n\t0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, 0x703E, 0xE070,\t0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, 0x7063, 0xE073,\n\t0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, 0x7078, 0x8B84,\t0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, 0x7089, 0x9846,\n\t0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, 0x7099, 0xE074,\t0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, 0x70AE, 0xE07B,\n\t0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, 0x70B9, 0x935F,\t0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, 0x70CB, 0xE07D,\n\t0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, 0x70DF, 0xE07C,\t0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, 0x7104, 0xFB54,\n\t0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, 0x7119, 0xE084,\t0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, 0x7126, 0x8FC5,\n\t0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, 0x7147, 0xFB57,\t0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, 0x7155, 0xE086,\n\t0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, 0x7162, 0xE089,\t0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, 0x7167, 0x8FC6,\n\t0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, 0x717D, 0x90F8,\t0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, 0x718F, 0xE08D,\n\t0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, 0x719F, 0x8F6E,\t0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, 0x71B9, 0xE094,\n\t0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, 0x71C8, 0x9395,\t0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, 0x71D2, 0xE096,\n\t0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, 0x71DF, 0x9A7A,\t0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, 0x71E7, 0xE09C,\n\t0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, 0x71F5, 0xE09D,\t0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, 0x71FE, 0xFB5A,\n\t0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, 0x7210, 0xE0A2,\t0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, 0x722C, 0xE0A6,\n\t0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, 0x7235, 0x8EDD,\t0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, 0x723C, 0xE0AA,\n\t0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, 0x7240, 0xE0AC,\t0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, 0x724B, 0xE0AE,\n\t0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, 0x7259, 0x89E5,\t0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, 0x7261, 0x89B2,\n\t0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, 0x7272, 0x90B5,\t0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, 0x727E, 0xE0B1,\n\t0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, 0x7287, 0xE0B4,\t0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, 0x72A2, 0xE0B7,\n\t0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, 0x72B1, 0xFB5B,\t0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, 0x72BE, 0xFB5C,\n\t0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, 0x72C6, 0xE0BC,\t0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, 0x72D7, 0x8BE7,\n\t0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, 0x72E1, 0xE0C2,\t0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, 0x72ED, 0x8BB7,\n\t0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, 0x72FC, 0x9854,\t0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, 0x7317, 0xE0C6,\n\t0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, 0x731F, 0x97C2,\t0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, 0x732A, 0x9296,\n\t0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, 0x7334, 0xE0CB,\t0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, 0x733F, 0x898E,\n\t0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, 0x734F, 0xE0D1,\t0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, 0x736A, 0xE0D4,\n\t0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, 0x7377, 0xFB5F,\t0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, 0x7384, 0x8CBA,\n\t0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, 0x7396, 0x8BE8,\t0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, 0x73BB, 0xE0DE,\n\t0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, 0x73C8, 0xE0DB,\t0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, 0x73CE, 0xE0DD,\n\t0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, 0x73E0, 0x8EEC,\t0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, 0x73ED, 0x94C7,\n\t0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, 0x73F8, 0xE0E7,\t0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, 0x7406, 0x979D,\n\t0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, 0x7425, 0xE0E6,\t0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, 0x742E, 0xFB6A,\n\t0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, 0x7435, 0x94FA,\t0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, 0x7441, 0xE0EE,\n\t0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, 0x745B, 0x896C,\t0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, 0x7460, 0x97DA,\n\t0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, 0x7469, 0xE0F0,\t0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, 0x7473, 0x8DBA,\n\t0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, 0x7489, 0xFB6C,\t0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, 0x74A2, 0xE0E3,\n\t0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, 0x74CA, 0xE0F9,\t0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, 0x74E0, 0xE140,\n\t0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, 0x74E7, 0xE142,\t0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, 0x74F1, 0xE147,\n\t0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, 0x74F8, 0xE148,\t0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, 0x7505, 0xE14C,\n\t0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, 0x7511, 0x8D99,\t0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, 0x751A, 0x9072,\n\t0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, 0x7523, 0x8E59,\t0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, 0x752B, 0x95E1,\n\t0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, 0x7531, 0x9752,\t0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, 0x7538, 0x99B2,\n\t0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, 0x7544, 0xE156,\t0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, 0x754B, 0x9DC0,\n\t0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, 0x7551, 0x94A8,\t0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, 0x755B, 0xE15A,\n\t0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, 0x7562, 0x954C,\t0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, 0x7567, 0xE15F,\n\t0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, 0x756D, 0xE161,\t0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, 0x7574, 0xE166,\n\t0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, 0x757F, 0x8B45,\t0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, 0x7589, 0xE168,\n\t0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, 0x758F, 0x9160,\t0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, 0x759D, 0xE16C,\n\t0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, 0x75B1, 0xE176,\t0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, 0x75B8, 0xE174,\n\t0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, 0x75BE, 0x8EBE,\t0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, 0x75C7, 0x8FC7,\n\t0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, 0x75D4, 0x8EA4,\t0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, 0x75DB, 0x92C9,\n\t0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, 0x75E9, 0x9189,\t0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, 0x75F4, 0x9273,\n\t0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, 0x75FF, 0xE17E,\t0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, 0x760D, 0xE187,\n\t0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, 0x7622, 0xE18D,\t0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, 0x7634, 0xE18F,\n\t0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, 0x7647, 0xE192,\t0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, 0x7656, 0x95C8,\n\t0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, 0x7662, 0xE198,\t0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, 0x766A, 0xE19B,\n\t0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, 0x7676, 0xE1A0,\t0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, 0x767C, 0xE1A2,\n\t0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, 0x7682, 0xFB70,\t0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, 0x7687, 0x8D63,\n\t0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, 0x7690, 0x8E48,\t0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, 0x769A, 0xE1AB,\n\t0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, 0x76A6, 0xFB74,\t0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, 0x76B7, 0xEA89,\n\t0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, 0x76BF, 0x8E4D,\t0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, 0x76C8, 0x896D,\n\t0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, 0x76D6, 0xE1B3,\t0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, 0x76DE, 0xE1B5,\n\t0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, 0x76E4, 0x94D5,\t0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, 0x76EE, 0x96DA,\n\t0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, 0x76FB, 0xE1BB,\t0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, 0x7707, 0xE1BD,\n\t0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, 0x770C, 0x8CA7,\t0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, 0x7720, 0x96B0,\n\t0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, 0x7729, 0xE1BF,\t0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, 0x773C, 0x8AE1,\n\t0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, 0x775A, 0xE1C8,\t0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, 0x7765, 0xE1CC,\n\t0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, 0x7779, 0xE1CF,\t0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, 0x778E, 0xE1D0,\n\t0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, 0x77A5, 0x95CB,\t0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, 0x77B3, 0x93B5,\n\t0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, 0x77BC, 0xE1D9,\t0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, 0x77CD, 0xE1DD,\n\t0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, 0x77DC, 0xE1E0,\t0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, 0x77E7, 0x948A,\n\t0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, 0x77EF, 0x8BB8,\t0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, 0x780C, 0xE1E4,\n\t0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, 0x7820, 0xE1E7,\t0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, 0x7827, 0x8B6D,\n\t0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, 0x783F, 0x8D7B,\t0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, 0x7864, 0xFB7A,\n\t0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, 0x7872, 0x94A1,\t0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, 0x7881, 0x8CE9,\n\t0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, 0x788D, 0x8A56,\t0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, 0x7895, 0x8DEA,\n\t0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, 0x78A7, 0x95C9,\t0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, 0x78B5, 0xE1F1,\n\t0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, 0x78C1, 0x8EA5,\t0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, 0x78CB, 0xE1F6,\n\t0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, 0x78DA, 0xE241,\t0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, 0x78EF, 0x88E9,\n\t0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, 0x7907, 0xE244,\t0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, 0x7919, 0xE247,\n\t0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, 0x792C, 0xE248,\t0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, 0x793E, 0x8ED0,\n\t0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, 0x7948, 0x8B46,\t0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, 0x7955, 0xE24F,\n\t0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, 0x795D, 0x8F6A,\t0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, 0x7962, 0x9449,\n\t0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, 0x7977, 0x9398,\t0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, 0x7981, 0x8BD6,\n\t0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, 0x798D, 0x89D0,\t0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, 0x799B, 0xFB83,\n\t0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, 0x79AA, 0xE257,\t0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, 0x79B9, 0xE25A,\n\t0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, 0x79BF, 0x93C3,\t0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, 0x79CB, 0x8F48,\n\t0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, 0x79D8, 0x94E9,\t0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, 0x79E4, 0x9489,\n\t0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, 0x79EC, 0xE25F,\t0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, 0x7A08, 0xE262,\n\t0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, 0x7A14, 0x96AB,\t0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, 0x7A1A, 0x9274,\n\t0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, 0x7A2E, 0x8EED,\t0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, 0x7A3B, 0xE26A,\n\t0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, 0x7A3F, 0x8D65,\t0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, 0x7A46, 0x9673,\n\t0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, 0x7A4F, 0x89B8,\t0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, 0x7A62, 0xE271,\n\t0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, 0x7A70, 0xE274,\t0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, 0x7A7A, 0x8BF3,\n\t0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, 0x7A83, 0x90DE,\t0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, 0x7A93, 0x918B,\n\t0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, 0x7A98, 0xE27A,\t0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, 0x7AAE, 0x8B87,\n\t0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, 0x7ABA, 0x894D,\t0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, 0x7AC5, 0xE281,\n\t0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, 0x7ACB, 0x97A7,\t0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, 0x7AD2, 0x9AF2,\n\t0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, 0x7ADA, 0xE28C,\t0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, 0x7AE0, 0x8FCD,\n\t0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, 0x7AE5, 0x93B6,\t0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, 0x7AEB, 0xFB87,\n\t0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, 0x7AF6, 0x8BA3,\t0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, 0x7AFF, 0x8AC6,\n\t0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, 0x7B08, 0x8B88,\t0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, 0x7B11, 0x8FCE,\n\t0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, 0x7B1E, 0xE29A,\t0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, 0x7B28, 0xE29C,\n\t0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, 0x7B36, 0xE29D,\t0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, 0x7B48, 0x94A4,\n\t0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, 0x7B4D, 0xE2A1,\t0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, 0x7B52, 0x939B,\n\t0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, 0x7B65, 0xE2A6,\t0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, 0x7B70, 0xE2A9,\n\t0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, 0x7B7A, 0xE29F,\t0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, 0x7B8D, 0xE2B0,\n\t0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, 0x7B95, 0x96A5,\t0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, 0x7B9A, 0xE2B2,\n\t0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, 0x7B9F, 0xE2AF,\t0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, 0x7BB1, 0x94A0,\n\t0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, 0x7BC1, 0xE2B9,\t0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, 0x7BC9, 0x927A,\n\t0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, 0x7BDD, 0xE2BE,\t0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, 0x7BE6, 0xE2C2,\n\t0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, 0x7BF6, 0xE2CC,\t0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, 0x7C0D, 0xE2CB,\n\t0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, 0x7C14, 0xE2C1,\t0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, 0x7C23, 0xE2CD,\n\t0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, 0x7C37, 0xE2D1,\t0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, 0x7C3F, 0x95EB,\n\t0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, 0x7C4D, 0x90D0,\t0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, 0x7C56, 0xE2DD,\n\t0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, 0x7C64, 0xE2DC,\t0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, 0x7C75, 0xE2E0,\n\t0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, 0x7C83, 0xE2E1,\t0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, 0x7C90, 0xE2E2,\n\t0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, 0x7C98, 0x9453,\t0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, 0x7CA2, 0xE2E5,\n\t0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, 0x7CA8, 0xE2E8,\t0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, 0x7CB1, 0xE2EB,\n\t0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, 0x7CBD, 0xE2EE,\t0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, 0x7CC5, 0xE2F0,\n\t0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, 0x7CD6, 0x939C,\t0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, 0x7CDF, 0x918C,\n\t0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, 0x7CEF, 0xE2F7,\t0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, 0x7CF8, 0x8E85,\n\t0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, 0x7D00, 0x8B49,\t0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, 0x7D06, 0xE2FC,\n\t0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, 0x7D10, 0x9552,\t0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, 0x7D18, 0x8D68,\n\t0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, 0x7D1C, 0xE341,\t0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, 0x7D2B, 0x8E87,\n\t0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, 0x7D30, 0x8DD7,\t0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, 0x7D39, 0x8FD0,\n\t0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, 0x7D43, 0x8CBC,\t0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, 0x7D48, 0xFB8A,\n\t0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, 0x7D4F, 0xE351,\t0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, 0x7D5C, 0xFB8B,\n\t0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, 0x7D63, 0xE352,\t0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, 0x7D71, 0x939D,\n\t0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, 0x7D76, 0x90E2,\t0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, 0x7D8F, 0xE356,\n\t0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, 0x7D9B, 0xE358,\t0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, 0x7DA2, 0xE361,\n\t0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, 0x7DAD, 0x88DB,\t0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, 0x7DB1, 0x8D6A,\n\t0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, 0x7DB7, 0xFB8C,\t0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, 0x7DBD, 0xE35E,\n\t0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, 0x7DCA, 0x8BD9,\t0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, 0x7DD2, 0x8F8F,\n\t0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, 0x7DDA, 0x90FC,\t0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, 0x7DE0, 0x92F7,\n\t0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, 0x7DE9, 0x8AC9,\t0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, 0x7DF4, 0x97FB,\n\t0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, 0x7E05, 0xE36E,\t0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, 0x7E12, 0xE372,\n\t0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, 0x7E21, 0xE371,\t0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, 0x7E2B, 0x9644,\n\t0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, 0x7E35, 0xE37B,\t0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, 0x7E3B, 0xE37A,\n\t0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, 0x7E43, 0xE37D,\t0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, 0x7E4D, 0x8F4A,\n\t0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, 0x7E56, 0xE384,\t0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, 0x7E5E, 0xE385,\n\t0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, 0x7E6A, 0xE389,\t0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, 0x7E7B, 0xE38C,\n\t0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, 0x7E82, 0x8E5B,\t0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, 0x7E8A, 0xFA5C,\n\t0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, 0x7E90, 0xE396,\t0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, 0x7E96, 0xE399,\n\t0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, 0x7F38, 0xE39D,\t0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, 0x7F4C, 0xE3A0,\n\t0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, 0x7F51, 0xE3A4,\t0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, 0x7F5F, 0xE3A8,\n\t0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, 0x7F69, 0xE3AB,\t0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, 0x7F70, 0x94B1,\n\t0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, 0x7F78, 0xE3AD,\t0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, 0x7F85, 0x9785,\n\t0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, 0x7F8A, 0x9772,\t0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, 0x7F9A, 0xE3B7,\n\t0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, 0x7FA3, 0xE3B8,\t0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, 0x7FAE, 0xE3BC,\n\t0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, 0x7FB8, 0xE3BE,\t0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, 0x7FC5, 0xE3C0,\n\t0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, 0x7FD2, 0x8F4B,\t0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, 0x7FE1, 0xE3C5,\n\t0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, 0x7FF0, 0x8ACB,\t0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, 0x7FFC, 0x9783,\n\t0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, 0x8004, 0xE3CC,\t0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, 0x800C, 0x8EA7,\n\t0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, 0x8017, 0x96D5,\t0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, 0x8021, 0xE3D2,\n\t0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, 0x803B, 0xE3D5,\t0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, 0x804A, 0xE3D6,\n\t0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, 0x805A, 0xE3DA,\t0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, 0x8062, 0xE3DC,\n\t0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, 0x8072, 0xE3DF,\t0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, 0x8077, 0x9045,\n\t0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, 0x807F, 0xE3E4,\t0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, 0x8087, 0x94A3,\n\t0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, 0x8093, 0xE3E9,\t0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, 0x809B, 0xE3E8,\n\t0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, 0x80A5, 0x94EC,\t0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, 0x80AD, 0xE3EB,\n\t0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, 0x80B4, 0x8DE6,\t0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, 0x80C6, 0x925F,\n\t0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, 0x80D9, 0xE3F0,\t0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, 0x80DE, 0x9645,\n\t0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, 0x80EF, 0xE3F6,\t0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, 0x80FC, 0xE445,\n\t0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, 0x8106, 0x90C6,\t0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, 0x810A, 0x90D2,\n\t0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, 0x8129, 0xE3F9,\t0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, 0x8139, 0x92AF,\n\t0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, 0x814E, 0x9074,\t0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, 0x8154, 0x8D6F,\n\t0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, 0x8166, 0xE449,\t0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, 0x8171, 0xE446,\n\t0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, 0x817A, 0x9142,\t0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, 0x8183, 0xE44B,\n\t0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, 0x8193, 0xE455,\t0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, 0x819D, 0x9547,\n\t0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, 0x81A8, 0x9663,\t0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, 0x81B5, 0xE458,\n\t0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, 0x81BE, 0xE459,\t0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, 0x81C6, 0x89B0,\n\t0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, 0x81D1, 0xE461,\t0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, 0x81DA, 0xE465,\n\t0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, 0x81E5, 0x89E7,\t0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, 0x81ED, 0x8F4C,\n\t0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, 0x81FB, 0xE46A,\t0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, 0x8202, 0xE46D,\n\t0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, 0x8209, 0x9DA8,\t0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, 0x820E, 0x8EC9,\n\t0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, 0x8217, 0x95DC,\t0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, 0x821E, 0x9591,\n\t0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, 0x822B, 0xE475,\t0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, 0x8235, 0x91C7,\n\t0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, 0x8239, 0x9144,\t0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, 0x8259, 0xE479,\n\t0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, 0x8262, 0xE480,\t0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, 0x826A, 0xE482,\n\t0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, 0x8271, 0xE485,\t0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, 0x8278, 0xE487,\n\t0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, 0x8292, 0xE48A,\t0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, 0x82A5, 0x8A48,\n\t0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, 0x82AD, 0x946D,\t0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, 0x82B8, 0x8C7C,\n\t0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, 0x82C5, 0x8AA1,\t0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, 0x82D4, 0x91DB,\n\t0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, 0x82DC, 0xE49C,\t0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, 0x82E3, 0xE490,\n\t0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, 0x82EB, 0x93CF,\t0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, 0x82F9, 0xE499,\n\t0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, 0x8302, 0x96CE,\t0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, 0x8306, 0xE49B,\n\t0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, 0x8317, 0xE4AA,\t0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, 0x8328, 0x88EF,\n\t0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, 0x8332, 0xE4A2,\t0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, 0x8338, 0x91F9,\n\t0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, 0x8349, 0x9190,\t0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, 0x8352, 0x8D72,\n\t0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, 0x8375, 0xE4B9,\t0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, 0x837F, 0xFB95,\n\t0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, 0x838A, 0xE4B5,\t0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, 0x839A, 0xE4AD,\n\t0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, 0x83A2, 0xE4B0,\t0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, 0x83B1, 0x9789,\n\t0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, 0x83C5, 0x909B,\t0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, 0x83CE, 0xE4C0,\n\t0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, 0x83DC, 0x8DD8,\t0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, 0x83EB, 0xE4BF,\n\t0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, 0x83F2, 0xE4C9,\t0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, 0x83FB, 0xE4D0,\n\t0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, 0x8407, 0xE4C7,\t0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, 0x840E, 0x88DE,\n\t0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, 0x8429, 0x948B,\t0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, 0x8435, 0xE4E0,\n\t0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, 0x8446, 0xE4DC,\t0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, 0x8457, 0x9298,\n\t0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, 0x8463, 0x939F,\t0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, 0x846C, 0x9192,\n\t0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, 0x8471, 0x944B,\t0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, 0x847A, 0x9598,\n\t0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, 0x8490, 0x8F4E,\t0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, 0x849F, 0xE4E5,\n\t0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, 0x84B4, 0xFB99,\t0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, 0x84BC, 0x9193,\n\t0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, 0x84C6, 0xE4EC,\t0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, 0x84CD, 0xE4E7,\n\t0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, 0x84D9, 0xE4E6,\t0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, 0x84EE, 0x9840,\n\t0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, 0x8500, 0x8EC1,\t0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, 0x8514, 0xE4F7,\n\t0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, 0x851A, 0x8955,\t0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, 0x852C, 0xE4F4,\n\t0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, 0x8540, 0xE4F9,\t0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, 0x8549, 0x8FD4,\n\t0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, 0x8553, 0xFB9A,\t0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, 0x8559, 0xFB9B,\n\t0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, 0x8569, 0x93A0,\t0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, 0x8577, 0xE550,\n\t0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, 0x8587, 0xE54E,\t0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, 0x8591, 0xE547,\n\t0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, 0x859B, 0xE54C,\t0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, 0x85A8, 0xE549,\n\t0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, 0x85AC, 0x96F2,\t0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, 0x85B9, 0xE556,\n\t0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, 0x85CD, 0x9795,\t0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, 0x85DC, 0xE55B,\n\t0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, 0x85E9, 0x94CB,\t0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, 0x85FA, 0xE561,\n\t0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, 0x8606, 0xE562,\t0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, 0x8613, 0xE55E,\n\t0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, 0x8622, 0xE563,\t0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, 0x863F, 0xE566,\n\t0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, 0x8654, 0xE569,\t0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, 0x865E, 0x8BF1,\n\t0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, 0x8671, 0xE56C,\t0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, 0x868B, 0xE571,\n\t0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, 0x86A3, 0xE56E,\t0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, 0x86AB, 0xE57A,\n\t0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, 0x86C4, 0xE575,\t0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, 0x86CB, 0x9260,\n\t0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, 0x86D9, 0x8A5E,\t0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, 0x86E4, 0x94B8,\n\t0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, 0x86EE, 0x94D8,\t0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, 0x86FB, 0xE588,\n\t0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, 0x8703, 0xE587,\t0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, 0x870A, 0xE58D,\n\t0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, 0x8718, 0x9277,\t0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, 0x8729, 0xE593,\n\t0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, 0x873F, 0xE58F,\t0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, 0x874E, 0xE599,\n\t0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, 0x8759, 0xE59E,\t0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, 0x8766, 0x89DA,\n\t0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, 0x8774, 0xE59A,\t0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, 0x8782, 0xE5A5,\n\t0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, 0x87AB, 0xE5AC,\t0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, 0x87BB, 0xE5B1,\n\t0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, 0x87C6, 0xE5B0,\t0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, 0x87D2, 0xE5BB,\n\t0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, 0x87F6, 0xE5B8,\t0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, 0x87FE, 0xE5B7,\n\t0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, 0x880E, 0xE5BA,\t0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, 0x8816, 0xE5BD,\n\t0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, 0x8827, 0xE5C4,\t0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, 0x883B, 0xE5C5,\n\t0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, 0x8846, 0x8F4F,\t0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, 0x8853, 0x8F70,\n\t0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, 0x885D, 0x8FD5,\t0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, 0x8863, 0x88DF,\n\t0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, 0x8872, 0xE5D3,\t0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, 0x887E, 0xE5CE,\n\t0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, 0x8888, 0x8C55,\t0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, 0x8896, 0x91B3,\n\t0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, 0x88A2, 0xE5D9,\t0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, 0x88B0, 0xE5DC,\n\t0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, 0x88B7, 0x88BF,\t0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, 0x88C3, 0xE5DF,\n\t0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, 0x88D4, 0xE5E1,\t0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, 0x88DC, 0x95E2,\n\t0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, 0x88E8, 0xE5E9,\t0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, 0x88F5, 0xFBA2,\n\t0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, 0x88FD, 0x90BB,\t0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, 0x8907, 0x95A1,\n\t0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, 0x8912, 0x964A,\t0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, 0x891E, 0xE5F0,\n\t0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, 0x8936, 0xE5F7,\t0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, 0x8943, 0xE5EF,\n\t0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, 0x8956, 0x89A6,\t0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, 0x8964, 0xE641,\n\t0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, 0x896F, 0xE644,\t0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, 0x897E, 0xE647,\n\t0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, 0x8986, 0x95A2,\t0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, 0x898B, 0x8CA9,\n\t0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, 0x8997, 0x9460,\t0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, 0x89A6, 0xE64F,\n\t0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, 0x89AC, 0xE650,\t0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, 0x89BA, 0xE653,\n\t0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, 0x89D2, 0x8A70,\t0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, 0x89E3, 0x89F0,\n\t0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, 0x89F8, 0xE65C,\t0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, 0x8A08, 0x8C76,\n\t0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, 0x8A10, 0xE65F,\t0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, 0x8A17, 0x91F5,\n\t0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, 0x8A1F, 0x8FD7,\t0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, 0x8A2D, 0x90DD,\n\t0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, 0x8A36, 0xE664,\t0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, 0x8A3C, 0x8FD8,\n\t0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, 0x8A50, 0x8DBC,\t0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, 0x8A55, 0x955D,\n\t0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, 0x8A62, 0xE66D,\t0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, 0x8A6B, 0x986C,\n\t0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, 0x8A70, 0x8B6C,\t0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, 0x8A79, 0xFBA5,\n\t0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, 0x8A85, 0xE66E,\t0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, 0x8A8D, 0x9446,\n\t0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, 0x8A98, 0x9755,\t0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, 0x8AA1, 0xE672,\n\t0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, 0x8AA6, 0xE675,\t0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, 0x8AAD, 0x93C7,\n\t0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, 0x8ABC, 0x8B62,\t0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, 0x8AC4, 0xE678,\n\t0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, 0x8ACD, 0xE679,\t0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, 0x8ADA, 0xE67B,\n\t0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, 0x8ADF, 0xFBA8,\t0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, 0x8AE4, 0xE680,\n\t0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, 0x8AED, 0x9740,\t0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, 0x8AF6, 0xFBAA,\n\t0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, 0x8AFE, 0x91F8,\t0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, 0x8B04, 0x93A3,\n\t0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, 0x8B10, 0xE68D,\t0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, 0x8B19, 0x8CAA,\n\t0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, 0x8B20, 0xE68F,\t0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, 0x8B2B, 0xE693,\n\t0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, 0x8B3E, 0xE694,\t0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, 0x8B4E, 0xE699,\n\t0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, 0x8B58, 0x8EAF,\t0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, 0x8B5F, 0xE69F,\n\t0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, 0x8B6F, 0xE6A1,\t0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, 0x8B74, 0xE6A2,\n\t0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, 0x8B80, 0xE6A4,\t0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, 0x8B8E, 0xE6A6,\n\t0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, 0x8B96, 0xE6A9,\t0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, 0x8C3A, 0xE6AC,\n\t0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, 0x8C48, 0xE6AF,\t0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, 0x8C50, 0xE6B2,\n\t0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, 0x8C62, 0xE6B4,\t0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, 0x8C78, 0xE6B6,\n\t0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, 0x8C82, 0xE6B8,\t0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, 0x8C8C, 0x9665,\n\t0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, 0x8C98, 0xE6C0,\t0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, 0x8CA1, 0x8DE0,\n\t0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, 0x8CA9, 0x94CC,\t0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, 0x8CAD, 0xE6C2,\n\t0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, 0x8CB2, 0xE6C5,\t0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, 0x8CB7, 0x9483,\n\t0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, 0x8CBD, 0xE6C4,\t0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, 0x8CC2, 0x9847,\n\t0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, 0x8CC8, 0xE6C9,\t0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, 0x8CD1, 0x93F6,\n\t0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, 0x8CDC, 0x8E92,\t0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, 0x8CE3, 0xE6CC,\n\t0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, 0x8CED, 0x9371,\t0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, 0x8CFB, 0xE6D0,\n\t0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, 0x8D05, 0xE6D2,\t0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, 0x8D0B, 0x8AE4,\n\t0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, 0x8D12, 0xFBAF,\t0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, 0x8D64, 0x90D4,\n\t0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, 0x8D6D, 0xE6DE,\t0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, 0x8D74, 0x958B,\n\t0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, 0x8D85, 0x92B4,\t0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, 0x8DA8, 0x9096,\n\t0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, 0x8DC2, 0xE6E3,\t0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, 0x8DD6, 0xE6E8,\n\t0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, 0x8DDF, 0xE6EE,\t0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, 0x8DEA, 0xE6EC,\n\t0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, 0x8DF5, 0x9148,\t0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, 0x8E09, 0xE6F2,\n\t0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, 0x8E1D, 0xE6F4,\t0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, 0x8E30, 0xE6FA,\n\t0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, 0x8E44, 0x92FB,\t0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, 0x8E4A, 0xE6FC,\n\t0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, 0x8E59, 0xE745,\t0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, 0x8E64, 0xE746,\n\t0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, 0x8E7C, 0xE74D,\t0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, 0x8E87, 0xE74F,\n\t0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, 0x8E91, 0xE755,\t0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, 0x8EA1, 0xE759,\n\t0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, 0x8EAF, 0x8BEB,\t0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, 0x8EC5, 0xE75F,\n\t0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, 0x8ECB, 0xE761,\t0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, 0x8ED2, 0x8CAC,\n\t0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, 0x8EE3, 0xE763,\t0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, 0x8EFC, 0xE764,\n\t0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, 0x8F05, 0xE769,\t0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, 0x8F12, 0xE76B,\n\t0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, 0x8F19, 0xE76C,\t0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, 0x8F1F, 0xE76F,\n\t0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, 0x8F2F, 0x8F53,\t0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, 0x8F3B, 0xE774,\n\t0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, 0x8F44, 0x8A8D,\t0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, 0x8F4C, 0xE779,\n\t0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, 0x8F5C, 0xE77E,\t0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, 0x8F63, 0xE781,\n\t0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, 0x8F9E, 0x8EAB,\t0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, 0x8FA8, 0x999E,\n\t0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, 0x8FB0, 0x9243,\t0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, 0x8FBA, 0x95D3,\n\t0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, 0x8FC2, 0x8949,\t0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, 0x8FD1, 0x8BDF,\n\t0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, 0x8FE5, 0xE78A,\t0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, 0x8FEB, 0x9497,\n\t0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, 0x8FF4, 0xE78F,\t0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, 0x8FFA, 0xE792,\n\t0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, 0x9003, 0x93A6,\t0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, 0x900D, 0xE796,\n\t0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, 0x9011, 0xE793,\t0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, 0x9016, 0xE798,\n\t0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, 0x901D, 0x90C0,\t0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, 0x9021, 0xE795,\n\t0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, 0x902E, 0x91DF,\t0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, 0x9036, 0xE79B,\n\t0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, 0x903E, 0xE7A5,\t0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, 0x9047, 0x8BF6,\n\t0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, 0x904D, 0x95D5,\t0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, 0x9051, 0xE7A1,\n\t0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, 0x9055, 0x88E1,\t0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, 0x905C, 0x91BB,\n\t0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, 0x9063, 0x8CAD,\t0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, 0x9069, 0x934B,\n\t0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, 0x9072, 0xE7AD,\t0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, 0x9078, 0x9149,\n\t0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, 0x907F, 0x94F0,\t0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, 0x9083, 0xE284,\n\t0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, 0x908A, 0xE7B2,\t0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, 0x90A6, 0x964D,\n\t0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, 0x90B1, 0xE7B7,\t0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, 0x90CA, 0x8D78,\n\t0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, 0x90E1, 0x8C53,\t0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, 0x90ED, 0x8A73,\n\t0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, 0x9102, 0xE7BD,\t0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, 0x9127, 0xFBB9,\n\t0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, 0x9149, 0x93D1,\t0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, 0x914D, 0x947A,\n\t0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, 0x9156, 0xE7C3,\t0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, 0x9165, 0xE7C6,\n\t0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, 0x9172, 0xE7C9,\t0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, 0x9178, 0x8E5F,\n\t0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, 0x918B, 0xE7CA,\t0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, 0x9197, 0x94AE,\n\t0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, 0x91AA, 0xE7D0,\t0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, 0x91B5, 0xE7D1,\n\t0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, 0x91C1, 0xE7D5,\t0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, 0x91C9, 0xE7D6,\n\t0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, 0x91CE, 0x96EC,\t0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, 0x91D6, 0xE7D9,\n\t0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, 0x91DB, 0xE7DC,\t0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, 0x91DF, 0xE7DA,\n\t0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, 0x91E5, 0xFBC0,\t0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, 0x91EE, 0xFBBE,\n\t0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, 0x91FF, 0xE7E1,\t0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, 0x920E, 0x8A62,\n\t0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, 0x9215, 0xE7E4,\t0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, 0x9234, 0x97E9,\n\t0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, 0x923C, 0xFBC6,\t0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, 0x9245, 0xE7E8,\n\t0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, 0x924E, 0xFBC7,\t0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, 0x9259, 0xFBC8,\n\t0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, 0x9262, 0x94AB,\t0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, 0x9271, 0x8D7A,\n\t0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, 0x9280, 0x8BE2,\t0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, 0x9291, 0x914C,\n\t0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, 0x9298, 0x96C1,\t0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, 0x92A7, 0xFBCC,\n\t0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, 0x92CF, 0xE7F5,\t0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, 0x92D5, 0xFBD4,\n\t0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, 0x92E4, 0x8F9B,\t0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, 0x92ED, 0x8973,\n\t0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, 0x92F9, 0xFA65,\t0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, 0x92FF, 0xFBDC,\n\t0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, 0x9310, 0x908D,\t0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, 0x931D, 0xFBDD,\n\t0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, 0x9322, 0xE841,\t0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, 0x9328, 0x9564,\n\t0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, 0x932F, 0x8DF6,\t0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, 0x933B, 0xE846,\n\t0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, 0x934D, 0x9374,\t0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, 0x935B, 0x9262,\n\t0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, 0x936E, 0xE84A,\t0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, 0x937E, 0x8FDF,\n\t0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, 0x9397, 0x9199,\t0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, 0x93AC, 0xE84D,\n\t0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, 0x93B9, 0xE850,\t0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, 0x93D0, 0xE858,\n\t0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, 0x93D8, 0xE855,\t0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, 0x93E4, 0xE85A,\n\t0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, 0x9403, 0xE85E,\t0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, 0x9414, 0xE85C,\n\t0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, 0x9421, 0xE864,\t0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, 0x9436, 0xE861,\n\t0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, 0x9444, 0xE868,\t0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, 0x9452, 0xE867,\n\t0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, 0x945E, 0xE86C,\t0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, 0x9470, 0xE86F,\n\t0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, 0x947D, 0xE872,\t0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, 0x9577, 0x92B7,\n\t0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, 0x9587, 0xE879,\t0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, 0x958F, 0x895B,\n\t0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, 0x9594, 0xE87B,\t0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, 0x95A0, 0xE880,\n\t0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, 0x95A5, 0x94B4,\t0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, 0x95B2, 0x897B,\n\t0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, 0x95BE, 0xE887,\t0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, 0x95CC, 0xE88C,\n\t0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, 0x95D6, 0xE88F,\t0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, 0x95E2, 0xE893,\n\t0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, 0x9628, 0xE895,\t0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, 0x9632, 0x9668,\n\t0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, 0x9642, 0xE898,\t0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, 0x964D, 0x8D7E,\n\t0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, 0x965C, 0xE89D,\t0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, 0x9662, 0x8940,\n\t0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, 0x9666, 0xE8A1,\t0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, 0x9672, 0xE8A2,\n\t0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, 0x9677, 0xE89C,\t0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, 0x9685, 0x8BF7,\n\t0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, 0x968B, 0xE440,\t0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, 0x9694, 0x8A75,\n\t0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, 0x9699, 0x8C84,\t0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, 0x96A0, 0x8942,\n\t0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, 0x96AA, 0xE8A8,\t0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, 0x96B2, 0xE8AB,\n\t0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, 0x96B8, 0xE8AF,\t0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, 0x96C0, 0x909D,\n\t0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, 0x96C6, 0x8F57,\t0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, 0x96CC, 0x8E93,\n\t0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, 0x96D5, 0xE8B8,\t0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, 0x96DC, 0xE8B6,\n\t0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, 0x96EA, 0x90E1,\t0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, 0x96F6, 0x97EB,\n\t0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, 0x9700, 0x8EF9,\t0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, 0x9708, 0xE8BC,\n\t0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, 0x970F, 0xE8C0,\t0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, 0x9719, 0xE8C2,\n\t0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, 0x9727, 0x96B6,\t0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, 0x9733, 0xFBED,\n\t0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, 0x973D, 0xE8C7,\t0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, 0x9744, 0xE8C9,\n\t0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, 0x974D, 0xFBF0,\t0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, 0x9755, 0xFBF3,\n\t0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, 0x975E, 0x94F1,\t0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, 0x9764, 0xE8D0,\n\t0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, 0x976B, 0xE8D4,\t0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, 0x9779, 0xE8D6,\n\t0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, 0x9784, 0x8A93,\t0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, 0x978D, 0x88C6,\n\t0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, 0x979C, 0xE8DF,\t0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, 0x97A8, 0xE8E0,\n\t0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, 0x97B4, 0xE8E4,\t0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, 0x97CB, 0xE8E8,\n\t0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, 0x97EE, 0x9442,\t0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, 0x97F6, 0xE8EE,\n\t0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, 0x9802, 0x92B8,\t0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, 0x9808, 0x907B,\n\t0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, 0x9811, 0x8AE6,\t0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, 0x9818, 0x97CC,\n\t0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, 0x982C, 0x966A,\t0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, 0x9838, 0xE8F2,\n\t0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, 0x9846, 0xE8F7,\t0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, 0x984E, 0x8A7B,\n\t0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, 0x9857, 0xFBF4,\t0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, 0x9865, 0xFBF5,\n\t0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, 0x9870, 0xE8FC,\t0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, 0x98A8, 0x9597,\n\t0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, 0x98B6, 0xE946,\t0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, 0x98DB, 0x94F2,\n\t0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, 0x98E9, 0xE94A,\t0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, 0x98EF, 0x94D1,\n\t0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, 0x98FD, 0x964F,\t0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, 0x9909, 0xE94D,\n\t0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, 0x9912, 0xE94E,\t0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, 0x991D, 0xE952,\n\t0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, 0x9924, 0xE954,\t0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, 0x992E, 0xE957,\n\t0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, 0x9945, 0xE95C,\t0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, 0x9950, 0xE95D,\n\t0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, 0x9957, 0x8BC0,\t0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, 0x9999, 0x8D81,\n\t0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, 0x99AC, 0x946E,\t0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, 0x99B4, 0x93E9,\n\t0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, 0x99C5, 0x8977,\t0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, 0x99D1, 0xE96D,\n\t0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, 0x99DB, 0xE96A,\t0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, 0x99ED, 0xE96E,\n\t0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, 0x99F8, 0xE973,\t0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, 0x9A05, 0xE976,\n\t0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, 0x9A13, 0x8CB1,\t0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, 0x9A30, 0x93AB,\n\t0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, 0x9A42, 0xE97C,\t0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, 0x9A4E, 0xFBFB,\n\t0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, 0x9A5B, 0xE983,\t0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, 0x9A65, 0xE987,\n\t0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, 0x9AA8, 0x8D9C,\t0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, 0x9ABC, 0xE98E,\n\t0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, 0x9AD1, 0xE991,\t0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, 0x9AD9, 0xFBFC,\n\t0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, 0x9AE2, 0xE996,\t0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, 0x9AEB, 0xE99A,\n\t0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, 0x9AF1, 0xE99D,\t0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, 0x9B06, 0xE9A0,\n\t0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, 0x9B22, 0xE9A4,\t0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, 0x9B28, 0xE9A8,\n\t0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, 0x9B2F, 0xE9AC,\t0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, 0x9B3C, 0x8B53,\n\t0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, 0x9B44, 0xE9AE,\t0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, 0x9B4F, 0xE9B0,\n\t0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, 0x9B5A, 0x8B9B,\t0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, 0x9B75, 0xFC41,\n\t0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, 0x9B91, 0xE9B8,\t0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, 0x9B97, 0xE9BA,\n\t0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, 0x9BAA, 0x968E,\t0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, 0x9BB1, 0xFC44,\n\t0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, 0x9BC0, 0xE9BF,\t0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, 0x9BCF, 0xE9C3,\n\t0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, 0x9BD6, 0x8E49,\t0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, 0x9BE3, 0xE9C6,\n\t0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, 0x9BF1, 0xE9CD,\t0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, 0x9C04, 0xE9D8,\n\t0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, 0x9C0A, 0xE9D7,\t0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, 0x9C12, 0xE9D6,\n\t0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, 0x9C1B, 0xE9DA,\t0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, 0x9C2D, 0x9568,\n\t0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, 0x9C32, 0xE9E0,\t0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, 0x9C3E, 0xE9E2,\n\t0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, 0x9C52, 0x9690,\t0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, 0x9C67, 0xE9E5,\n\t0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, 0x9CE7, 0xE9E8,\t0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, 0x9CF0, 0xE9EA,\n\t0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, 0x9D03, 0xE9EE,\t0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, 0x9D09, 0xE9EB,\n\t0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, 0x9D1B, 0x8995,\t0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, 0x9D28, 0x8A9B,\n\t0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, 0x9D3B, 0x8D83,\t0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, 0x9D44, 0xE9F5,\n\t0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, 0x9D51, 0xEA43,\t0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, 0x9D5E, 0xEA41,\n\t0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, 0x9D6B, 0xFC48,\t0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, 0x9D72, 0xEA46,\n\t0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, 0x9D8F, 0x8C7B,\t0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, 0x9DAB, 0xEA49,\n\t0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, 0x9DB8, 0xEA53,\t0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, 0x9DC2, 0xEA57,\n\t0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, 0x9DD3, 0xEA59,\t0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, 0x9DEF, 0xEA5D,\n\t0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, 0x9DFA, 0x8DEB,\t0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, 0x9E1B, 0xEA60,\n\t0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, 0x9E79, 0xEA63,\t0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, 0x9E88, 0xEA66,\n\t0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, 0x9E92, 0xEA69,\t0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, 0x9E9D, 0xEA6C,\n\t0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, 0x9EA9, 0xEA6E,\t0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, 0x9EB9, 0x8D8D,\n\t0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, 0x9EBE, 0x9F80,\t0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, 0x9ECD, 0x8B6F,\n\t0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, 0x9ED1, 0xFC4B,\t0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, 0x9ED9, 0x96D9,\n\t0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, 0x9EDE, 0xEA79,\t0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, 0x9EEF, 0xEA7E,\n\t0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, 0x9EF9, 0xEA83,\t0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, 0x9F07, 0xEA87,\n\t0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, 0x9F15, 0xEA8A,\t0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, 0x9F3B, 0x9540,\n\t0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, 0x9F4E, 0xE6D8,\t0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, 0x9F5F, 0xEA92,\n\t0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, 0x9F63, 0xEA91,\t0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, 0x9F6C, 0xEA97,\n\t0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, 0x9F8D, 0x97B4,\t0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, 0x9FA0, 0xEA9E,\n\t0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, 0xFA0F, 0xFA9B,\t0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, 0xFA13, 0xFAE8,\n\t0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, 0xFA17, 0xFB75,\t0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, 0xFA1B, 0xFB82,\n\t0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, 0xFA1F, 0xFB9D,\t0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, 0xFA23, 0xFBB1,\n\t0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, 0xFA27, 0xFBD3,\t0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, 0xFA2B, 0xFBF7,\n\t0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, 0xFF02, 0xFA57,\t0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, 0xFF06, 0x8195,\n\t0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, 0xFF0A, 0x8196,\t0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, 0xFF0E, 0x8144,\n\t0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, 0xFF12, 0x8251,\t0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, 0xFF16, 0x8255,\n\t0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, 0xFF1A, 0x8146,\t0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, 0xFF1E, 0x8184,\n\t0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, 0xFF22, 0x8261,\t0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, 0xFF26, 0x8265,\n\t0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, 0xFF2A, 0x8269,\t0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, 0xFF2E, 0x826D,\n\t0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, 0xFF32, 0x8271,\t0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, 0xFF36, 0x8275,\n\t0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, 0xFF3A, 0x8279,\t0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, 0xFF3E, 0x814F,\n\t0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, 0xFF42, 0x8282,\t0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, 0xFF46, 0x8286,\n\t0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, 0xFF4A, 0x828A,\t0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, 0xFF4E, 0x828E,\n\t0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, 0xFF52, 0x8292,\t0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, 0xFF56, 0x8296,\n\t0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, 0xFF5A, 0x829A,\t0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, 0xFF5E, 0x8160,\n\t0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, 0xFF64, 0x00A4,\t0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, 0xFF68, 0x00A8,\n\t0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, 0xFF6C, 0x00AC,\t0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, 0xFF70, 0x00B0,\n\t0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, 0xFF74, 0x00B4,\t0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, 0xFF78, 0x00B8,\n\t0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, 0xFF7C, 0x00BC,\t0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, 0xFF80, 0x00C0,\n\t0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, 0xFF84, 0x00C4,\t0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, 0xFF88, 0x00C8,\n\t0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, 0xFF8C, 0x00CC,\t0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, 0xFF90, 0x00D0,\n\t0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, 0xFF94, 0x00D4,\t0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, 0xFF98, 0x00D8,\n\t0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, 0xFF9C, 0x00DC,\t0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, 0xFFE0, 0x8191,\n\t0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, 0xFFE4, 0xFA55,\t0xFFE5, 0x818F, 0, 0\n};\n\nstatic const WCHAR oem2uni932[] = {\t/* Shift_JIS --> Unicode pairs */\n\t0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64,\t0x00A5, 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68,\n\t0x00A9, 0xFF69, 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C,\t0x00AD, 0xFF6D, 0x00AE, 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70,\n\t0x00B1, 0xFF71, 0x00B2, 0xFF72, 0x00B3, 0xFF73, 0x00B4, 0xFF74,\t0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, 0xFF77, 0x00B8, 0xFF78,\n\t0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, 0x00BC, 0xFF7C,\t0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, 0xFF80,\n\t0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84,\t0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88,\n\t0x00C9, 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C,\t0x00CD, 0xFF8D, 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90,\n\t0x00D1, 0xFF91, 0x00D2, 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94,\t0x00D5, 0xFF95, 0x00D6, 0xFF96, 0x00D7, 0xFF97, 0x00D8, 0xFF98,\n\t0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, 0xFF9B, 0x00DC, 0xFF9C,\t0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, 0x8140, 0x3000,\n\t0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, 0xFF0E,\t0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F,\n\t0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4,\t0x814D, 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3,\n\t0x8151, 0xFF3F, 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D,\t0x8155, 0x309E, 0x8156, 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005,\n\t0x8159, 0x3006, 0x815A, 0x3007, 0x815B, 0x30FC, 0x815C, 0x2015,\t0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, 0xFF3C, 0x8160, 0xFF5E,\n\t0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, 0x8164, 0x2025,\t0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, 0x201D,\n\t0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015,\t0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D,\n\t0x8171, 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B,\t0x8175, 0x300C, 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F,\n\t0x8179, 0x3010, 0x817A, 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D,\t0x817D, 0x00B1, 0x817E, 0x00D7, 0x8180, 0x00F7, 0x8181, 0xFF1D,\n\t0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, 0xFF1E, 0x8185, 0x2266,\t0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, 0x8189, 0x2642,\n\t0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, 0x2033,\t0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0,\n\t0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06,\t0x8196, 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606,\n\t0x819A, 0x2605, 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE,\t0x819E, 0x25C7, 0x819F, 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0,\n\t0x81A2, 0x25B3, 0x81A3, 0x25B2, 0x81A4, 0x25BD, 0x81A5, 0x25BC,\t0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, 0x2192, 0x81A9, 0x2190,\n\t0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, 0x81B8, 0x2208,\t0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, 0x2282,\n\t0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227,\t0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4,\n\t0x81CD, 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5,\t0x81DC, 0x2312, 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261,\n\t0x81E0, 0x2252, 0x81E1, 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A,\t0x81E4, 0x223D, 0x81E5, 0x221D, 0x81E6, 0x2235, 0x81E7, 0x222B,\n\t0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, 0x2030, 0x81F2, 0x266F,\t0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, 0x81F6, 0x2021,\n\t0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, 0xFF11,\t0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15,\n\t0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19,\t0x8260, 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24,\n\t0x8264, 0xFF25, 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28,\t0x8268, 0xFF29, 0x8269, 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C,\n\t0x826C, 0xFF2D, 0x826D, 0xFF2E, 0x826E, 0xFF2F, 0x826F, 0xFF30,\t0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, 0xFF33, 0x8273, 0xFF34,\n\t0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, 0x8277, 0xFF38,\t0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, 0xFF42,\n\t0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46,\t0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A,\n\t0x828B, 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E,\t0x828F, 0xFF4F, 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52,\n\t0x8293, 0xFF53, 0x8294, 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56,\t0x8297, 0xFF57, 0x8298, 0xFF58, 0x8299, 0xFF59, 0x829A, 0xFF5A,\n\t0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, 0x3043, 0x82A2, 0x3044,\t0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, 0x82A6, 0x3048,\n\t0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, 0x304C,\t0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050,\n\t0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054,\t0x82B3, 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058,\n\t0x82B7, 0x3059, 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C,\t0x82BB, 0x305D, 0x82BC, 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060,\n\t0x82BF, 0x3061, 0x82C0, 0x3062, 0x82C1, 0x3063, 0x82C2, 0x3064,\t0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, 0x3067, 0x82C6, 0x3068,\n\t0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, 0x82CA, 0x306C,\t0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, 0x3070,\n\t0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074,\t0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078,\n\t0x82D7, 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C,\t0x82DB, 0x307D, 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080,\n\t0x82DF, 0x3081, 0x82E0, 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084,\t0x82E3, 0x3085, 0x82E4, 0x3086, 0x82E5, 0x3087, 0x82E6, 0x3088,\n\t0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, 0x308B, 0x82EA, 0x308C,\t0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, 0x82EE, 0x3090,\n\t0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, 0x30A1,\t0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5,\n\t0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9,\t0x8349, 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD,\n\t0x834D, 0x30AE, 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1,\t0x8351, 0x30B2, 0x8352, 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5,\n\t0x8355, 0x30B6, 0x8356, 0x30B7, 0x8357, 0x30B8, 0x8358, 0x30B9,\t0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, 0x30BC, 0x835C, 0x30BD,\n\t0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, 0x8360, 0x30C1,\t0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, 0x30C5,\n\t0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9,\t0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD,\n\t0x836D, 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1,\t0x8371, 0x30D2, 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5,\n\t0x8375, 0x30D6, 0x8376, 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9,\t0x8379, 0x30DA, 0x837A, 0x30DB, 0x837B, 0x30DC, 0x837C, 0x30DD,\n\t0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, 0x30E0, 0x8381, 0x30E1,\t0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, 0x8385, 0x30E5,\n\t0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9,\t0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED,\n\t0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1,\t0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, 0x8395, 0x30F5,\n\t0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, 0x83A1, 0x0393,\t0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, 0x83A5, 0x0397,\n\t0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, 0x83A9, 0x039B,\t0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, 0x83AD, 0x039F,\n\t0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, 0x83B1, 0x03A4,\t0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, 0x83B5, 0x03A8,\n\t0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, 0x83C1, 0x03B3,\t0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, 0x83C5, 0x03B7,\n\t0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, 0x83C9, 0x03BB,\t0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, 0x83CD, 0x03BF,\n\t0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, 0x83D1, 0x03C4,\t0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, 0x83D5, 0x03C8,\n\t0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, 0x8442, 0x0412,\t0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, 0x8446, 0x0401,\n\t0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, 0x844A, 0x0419,\t0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, 0x844E, 0x041D,\n\t0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, 0x8452, 0x0421,\t0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, 0x8456, 0x0425,\n\t0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, 0x845A, 0x0429,\t0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, 0x845E, 0x042D,\n\t0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, 0x8471, 0x0431,\t0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, 0x8475, 0x0435,\n\t0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, 0x8479, 0x0438,\t0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, 0x847D, 0x043C,\n\t0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, 0x8482, 0x0440,\t0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, 0x8486, 0x0444,\n\t0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, 0x848A, 0x0448,\t0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, 0x848E, 0x044C,\n\t0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, 0x849F, 0x2500,\t0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, 0x84A3, 0x2518,\n\t0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, 0x84A7, 0x2524,\t0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, 0x84AB, 0x2503,\n\t0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, 0x84AF, 0x2517,\t0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, 0x84B3, 0x253B,\n\t0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, 0x84B7, 0x2528,\t0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, 0x84BB, 0x2530,\n\t0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, 0x8740, 0x2460,\t0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, 0x8744, 0x2464,\n\t0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, 0x8748, 0x2468,\t0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, 0x874C, 0x246C,\n\t0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, 0x8750, 0x2470,\t0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, 0x8754, 0x2160,\n\t0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, 0x8758, 0x2164,\t0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, 0x875C, 0x2168,\n\t0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, 0x8761, 0x3322,\t0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, 0x8765, 0x3303,\n\t0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, 0x8769, 0x330D,\t0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, 0x876D, 0x334A,\n\t0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, 0x8771, 0x339E,\t0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, 0x8775, 0x33A1,\n\t0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, 0x8782, 0x2116,\t0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, 0x8786, 0x32A5,\n\t0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, 0x878A, 0x3231,\t0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, 0x878E, 0x337D,\n\t0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, 0x8798, 0x221F,\t0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, 0x88A1, 0x5A03,\n\t0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, 0x88A5, 0x6328,\t0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, 0x88A9, 0x831C,\n\t0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, 0x88AD, 0x6E25,\t0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, 0x88B1, 0x9BF5,\n\t0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, 0x88B5, 0x6271,\t0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, 0x88B9, 0x98F4,\n\t0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, 0x88BD, 0x6216,\t0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, 0x88C1, 0x5EB5,\n\t0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, 0x88C5, 0x95C7,\t0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, 0x88C9, 0x4F0A,\n\t0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, 0x88CD, 0x56F2,\t0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, 0x88D1, 0x5C09,\n\t0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, 0x88D5, 0x6613,\t0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, 0x88D9, 0x7570,\n\t0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, 0x88DD, 0x80C3,\t0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, 0x88E1, 0x9055,\n\t0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, 0x88E5, 0x4EA5,\t0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, 0x88E9, 0x78EF,\n\t0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, 0x88ED, 0x9038,\t0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, 0x88F1, 0x9C2F,\n\t0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, 0x88F5, 0x54E1,\t0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, 0x88F9, 0x98F2,\n\t0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, 0x8940, 0x9662,\t0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, 0x8944, 0x540B,\n\t0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, 0x8948, 0x7FBD,\t0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, 0x894C, 0x9D5C,\n\t0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, 0x8950, 0x81FC,\t0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, 0x8954, 0x6B1D,\n\t0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, 0x8958, 0x53A9,\t0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, 0x895C, 0x5642,\n\t0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, 0x8960, 0x834F,\t0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, 0x8964, 0x5B30,\n\t0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, 0x8968, 0x6804,\t0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, 0x896C, 0x745B,\n\t0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, 0x8970, 0x82F1,\t0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, 0x8974, 0x6DB2,\n\t0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, 0x8978, 0x60A6,\t0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, 0x897C, 0x698E,\n\t0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, 0x8981, 0x5830,\t0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, 0x8985, 0x6028,\n\t0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, 0x8989, 0x6F14,\t0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, 0x898D, 0x71D5,\n\t0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, 0x8991, 0x82D1,\t0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, 0x8995, 0x9D1B,\n\t0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, 0x8999, 0x7525,\t0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, 0x899D, 0x5F80,\n\t0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, 0x89A1, 0x6A2A,\t0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, 0x89A5, 0x7FC1,\n\t0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, 0x89A9, 0x9EC4,\t0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, 0x89AD, 0x5104,\n\t0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, 0x89B1, 0x6876,\t0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, 0x89B5, 0x5378,\n\t0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, 0x89B9, 0x97F3,\t0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, 0x89BD, 0x4F55,\n\t0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, 0x89C1, 0x52A0,\t0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, 0x89C5, 0x5AC1,\n\t0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, 0x89C9, 0x6687,\t0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, 0x89CD, 0x6CB3,\n\t0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, 0x89D1, 0x79BE,\t0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, 0x89D5, 0x82DB,\n\t0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, 0x89D9, 0x83D3,\t0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, 0x89DD, 0x8CA8,\n\t0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, 0x89E1, 0x868A,\t0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, 0x89E5, 0x7259,\n\t0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, 0x89E9, 0x86FE,\t0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, 0x89ED, 0x99D5,\n\t0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, 0x89F1, 0x56DE,\t0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, 0x89F5, 0x5FEB,\n\t0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, 0x89F9, 0x61D0,\t0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, 0x8A40, 0x9B41,\n\t0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, 0x8A44, 0x7070,\t0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, 0x8A48, 0x82A5,\n\t0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, 0x8A4C, 0x8C9D,\t0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, 0x8A50, 0x54B3,\n\t0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, 0x8A54, 0x6982,\t0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, 0x8A58, 0x8857,\n\t0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, 0x8A5C, 0x6D6C,\t0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, 0x8A60, 0x67FF,\n\t0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, 0x8A64, 0x5687,\t0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, 0x8A68, 0x64B9,\n\t0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, 0x8A6C, 0x7372,\t0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, 0x8A70, 0x89D2,\n\t0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, 0x8A74, 0x95A3,\t0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, 0x8A78, 0x5CB3,\n\t0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, 0x8A7C, 0x639B,\t0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, 0x8A81, 0x68B6,\n\t0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, 0x8A85, 0x559D,\t0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, 0x8A89, 0x6E07,\n\t0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, 0x8A8D, 0x8F44,\t0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, 0x8A91, 0x691B,\n\t0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, 0x8A95, 0x515C,\t0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, 0x8A99, 0x938C,\n\t0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, 0x8A9D, 0x8305,\t0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, 0x8AA1, 0x82C5,\n\t0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, 0x8AA5, 0x51A0,\t0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, 0x8AA9, 0x52E7,\n\t0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, 0x8AAD, 0x59E6,\t0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, 0x8AB1, 0x5E72,\n\t0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, 0x8AB5, 0x6163,\t0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, 0x8AB9, 0x67D1,\n\t0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, 0x8ABD, 0x6B53,\t0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, 0x8AC1, 0x6F45,\n\t0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, 0x8AC5, 0x770B,\t0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, 0x8AC9, 0x7DE9,\n\t0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, 0x8ACD, 0x8266,\t0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, 0x8AD1, 0x8CAB,\n\t0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, 0x8AD5, 0x9591,\t0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, 0x8AD9, 0x9928,\n\t0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, 0x8ADD, 0x5CB8,\t0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, 0x8AE1, 0x773C,\n\t0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, 0x8AE5, 0x96C1,\t0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, 0x8AE9, 0x4F01,\n\t0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, 0x8AED, 0x5668,\t0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, 0x8AF1, 0x5BC4,\n\t0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, 0x8AF5, 0x5FCC,\t0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, 0x8AF9, 0x65E2,\n\t0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, 0x8B40, 0x6A5F,\t0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, 0x8B44, 0x6C7D,\n\t0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, 0x8B48, 0x7A00,\t0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, 0x8B4C, 0x8A18,\n\t0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, 0x8B50, 0x8F1D,\t0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, 0x8B54, 0x4E80,\n\t0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, 0x8B58, 0x5B9C,\t0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, 0x8B5C, 0x6B3A,\n\t0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, 0x8B60, 0x7FA9,\t0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, 0x8B64, 0x63AC,\n\t0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, 0x8B68, 0x5403,\t0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, 0x8B6C, 0x8A70,\n\t0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, 0x8B70, 0x5374,\t0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, 0x8B74, 0x9006,\n\t0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, 0x8B78, 0x4F11,\t0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, 0x8B7C, 0x5F13,\n\t0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, 0x8B81, 0x6C42,\t0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, 0x8B85, 0x7403,\n\t0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, 0x8B89, 0x7D1A,\t0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, 0x8B8D, 0x725B,\n\t0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, 0x8B91, 0x62D2,\t0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, 0x8B95, 0x865A,\n\t0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, 0x8B99, 0x6F01,\t0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, 0x8B9D, 0x4EAB,\n\t0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, 0x8BA1, 0x50D1,\t0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, 0x8BA5, 0x51F6,\n\t0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, 0x8BA9, 0x53EB,\t0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, 0x8BAD, 0x5F37,\n\t0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, 0x8BB1, 0x606D,\t0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, 0x8BB5, 0x6CC1,\n\t0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, 0x8BB9, 0x80F8,\t0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, 0x8BBD, 0x90F7,\n\t0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, 0x8BC1, 0x9A5A,\t0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, 0x8BC5, 0x6681,\n\t0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, 0x8BC9, 0x6975,\t0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, 0x8BCD, 0x50C5,\n\t0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, 0x8BD1, 0x9326,\t0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, 0x8BD5, 0x7434,\n\t0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, 0x8BD9, 0x7DCA,\t0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, 0x8BDD, 0x895F,\n\t0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, 0x8BE1, 0x541F,\t0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, 0x8BE5, 0x53E5,\n\t0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, 0x8BE9, 0x77E9,\t0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, 0x8BED, 0x99C8,\n\t0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, 0x8BF1, 0x865E,\t0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, 0x8BF5, 0x5BD3,\n\t0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, 0x8BF9, 0x6ADB,\t0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, 0x8C40, 0x6398,\n\t0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, 0x8C44, 0x8F61,\t0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, 0x8C48, 0x7C82,\n\t0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, 0x8C4C, 0x936C,\t0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, 0x8C50, 0x8A13,\n\t0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, 0x8C54, 0x5366,\t0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, 0x8C58, 0x50BE,\n\t0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, 0x8C5C, 0x572D,\t0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, 0x8C60, 0x5F62,\n\t0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, 0x8C64, 0x6167,\t0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, 0x8C68, 0x656C,\n\t0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, 0x8C6C, 0x7566,\t0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, 0x8C70, 0x7D99,\n\t0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, 0x8C74, 0x834A,\t0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, 0x8C78, 0x8B66,\n\t0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, 0x8C7C, 0x82B8,\t0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, 0x8C81, 0x621F,\n\t0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, 0x8C85, 0x6841,\t0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, 0x8C89, 0x6F54,\n\t0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, 0x8C8D, 0x8A23,\t0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, 0x8C91, 0x5026,\n\t0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, 0x8C95, 0x5263,\t0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, 0x8C99, 0x5ACC,\n\t0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, 0x8C9D, 0x62F3,\t0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, 0x8CA1, 0x727D,\n\t0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, 0x8CA5, 0x786F,\t0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, 0x8CA9, 0x898B,\n\t0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, 0x8CAD, 0x9063,\t0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, 0x8CB1, 0x9A13,\n\t0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, 0x8CB5, 0x53B3,\t0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, 0x8CB9, 0x6E90,\n\t0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, 0x8CBD, 0x8237,\t0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, 0x8CC1, 0x4E4E,\n\t0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, 0x8CC5, 0x56FA,\t0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, 0x8CC9, 0x5EAB,\n\t0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, 0x8CCD, 0x67AF,\t0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, 0x8CD1, 0x88B4,\n\t0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, 0x8CD5, 0x864E,\t0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, 0x8CD9, 0x96C7,\n\t0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, 0x8CDD, 0x4E92,\t0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, 0x8CE1, 0x543E,\n\t0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, 0x8CE5, 0x609F,\t0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, 0x8CE9, 0x7881,\n\t0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, 0x8CED, 0x9190,\t0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, 0x8CF1, 0x4F7C,\n\t0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, 0x8CF5, 0x5149,\t0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, 0x8CF9, 0x52FE,\n\t0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, 0x8D40, 0x540E,\t0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, 0x8D44, 0x597D,\n\t0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, 0x8D48, 0x5DE5,\t0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, 0x8D4C, 0x5E83,\n\t0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, 0x8D50, 0x6052,\t0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, 0x8D54, 0x63A7,\n\t0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, 0x8D58, 0x66F4,\t0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, 0x8D5C, 0x69CB,\n\t0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, 0x8D60, 0x6E2F,\t0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, 0x8D64, 0x786C,\n\t0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, 0x8D68, 0x7D18,\t0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, 0x8D6C, 0x8003,\n\t0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, 0x8D70, 0x818F,\t0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, 0x8D74, 0x8861,\n\t0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, 0x8D78, 0x90CA,\t0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, 0x8D7C, 0x92FC,\n\t0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, 0x8D81, 0x9999,\t0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, 0x8D85, 0x52AB,\n\t0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, 0x8D89, 0x62F7,\t0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, 0x8D8D, 0x9EB9,\n\t0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, 0x8D91, 0x56FD,\t0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, 0x8D95, 0x9ED2,\n\t0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, 0x8D99, 0x7511,\t0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, 0x8D9D, 0x72DB,\n\t0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, 0x8DA1, 0x4ECA,\t0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, 0x8DA5, 0x5A5A,\n\t0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, 0x8DA9, 0x6606,\t0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, 0x8DAD, 0x75D5,\n\t0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, 0x8DB1, 0x4E9B,\t0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, 0x8DB5, 0x5D6F,\n\t0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, 0x8DB9, 0x6C99,\t0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, 0x8DBD, 0x9396,\n\t0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, 0x8DC1, 0x632B,\t0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, 0x8DC5, 0x6700,\n\t0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, 0x8DC9, 0x5BB0,\t0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, 0x8DCD, 0x683D,\n\t0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, 0x8DD1, 0x91C7,\t0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, 0x8DD5, 0x796D,\n\t0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, 0x8DD9, 0x88C1,\t0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, 0x8DDD, 0x5728,\n\t0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, 0x8DE1, 0x51B4,\t0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, 0x8DE5, 0x698A,\n\t0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, 0x8DE9, 0x57FC,\t0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, 0x8DED, 0x524A,\n\t0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, 0x8DF1, 0x6714,\t0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, 0x8DF5, 0x7D22,\n\t0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, 0x8DF9, 0x7B39,\t0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, 0x8E40, 0x5BDF,\n\t0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, 0x8E44, 0x672D,\t0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, 0x8E48, 0x7690,\n\t0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, 0x8E4C, 0x9BAB,\t0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, 0x8E50, 0x5098,\n\t0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, 0x8E54, 0x6492,\t0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, 0x8E58, 0x73CA,\n\t0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, 0x8E5C, 0x8695,\t0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, 0x8E60, 0x9910,\n\t0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, 0x8E64, 0x4ED5,\t0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, 0x8E68, 0x523A,\n\t0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, 0x8E6C, 0x56DB,\t0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, 0x8E70, 0x59FF,\n\t0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, 0x8E74, 0x5E2B,\t0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, 0x8E78, 0x652F,\n\t0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, 0x8E7C, 0x65E8,\t0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, 0x8E81, 0x6C0F,\n\t0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, 0x8E85, 0x7CF8,\t0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, 0x8E89, 0x8102,\n\t0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, 0x8E8D, 0x8A69,\t0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, 0x8E91, 0x8CC7,\n\t0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, 0x8E95, 0x6B6F,\t0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, 0x8E99, 0x5150,\n\t0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, 0x8E9D, 0x6301,\t0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, 0x8EA1, 0x6CBB,\n\t0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, 0x8EA5, 0x78C1,\t0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, 0x8EA9, 0x81EA,\n\t0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, 0x8EAD, 0x9E7F,\t0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, 0x8EB1, 0x7AFA,\n\t0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, 0x8EB5, 0x4E03,\t0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, 0x8EB9, 0x5AC9,\n\t0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, 0x8EBD, 0x6F06,\t0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, 0x8EC1, 0x8500,\n\t0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, 0x8EC5, 0x829D,\t0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, 0x8EC9, 0x820E,\n\t0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, 0x8ECD, 0x8D66,\t0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, 0x8ED1, 0x7D17,\n\t0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, 0x8ED5, 0x906E,\t0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, 0x8ED9, 0x52FA,\n\t0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, 0x8EDD, 0x7235,\t0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, 0x8EE1, 0x82E5,\n\t0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, 0x8EE5, 0x4E3B,\t0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, 0x8EE9, 0x6731,\n\t0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, 0x8EED, 0x7A2E,\t0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, 0x8EF1, 0x9996,\n\t0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, 0x8EF5, 0x5BFF,\t0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, 0x8EF9, 0x9700,\n\t0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, 0x8F40, 0x5B97,\t0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, 0x8F44, 0x6101,\n\t0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, 0x8F48, 0x79CB,\t0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, 0x8F4C, 0x81ED,\n\t0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, 0x8F50, 0x8972,\t0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, 0x8F54, 0x9031,\n\t0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, 0x8F58, 0x919C,\t0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, 0x8F5C, 0x5341,\n\t0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, 0x8F60, 0x6C41,\t0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, 0x8F64, 0x91CD,\n\t0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, 0x8F68, 0x5BBF,\t0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, 0x8F6C, 0x7C9B,\n\t0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, 0x8F70, 0x8853,\t0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, 0x8F74, 0x6625,\n\t0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, 0x8F78, 0x99FF,\t0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, 0x8F7C, 0x696F,\n\t0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, 0x8F81, 0x6F64,\t0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, 0x8F85, 0x9075,\n\t0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, 0x8F89, 0x521D,\t0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, 0x8F8D, 0x6E1A,\n\t0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, 0x8F91, 0x66F8,\t0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, 0x8F95, 0x52A9,\n\t0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, 0x8F99, 0x5F90,\t0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, 0x8F9D, 0x50B7,\n\t0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, 0x8FA1, 0x5347,\t0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, 0x8FA5, 0x5531,\n\t0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, 0x8FA9, 0x5A3C,\t0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, 0x8FAD, 0x5C11,\n\t0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, 0x8FB1, 0x5EE0,\t0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, 0x8FB5, 0x62DB,\n\t0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, 0x8FB9, 0x660C,\t0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, 0x8FBD, 0x68A2,\n\t0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, 0x8FC1, 0x6D88,\t0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, 0x8FC5, 0x7126,\n\t0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, 0x8FC9, 0x785D,\t0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, 0x8FCD, 0x7AE0,\n\t0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, 0x8FD1, 0x8096,\t0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, 0x8FD5, 0x885D,\n\t0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, 0x8FD9, 0x8A54,\t0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, 0x8FDD, 0x91A4,\n\t0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, 0x8FE1, 0x969C,\t0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, 0x8FE5, 0x4E1E,\n\t0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, 0x8FE9, 0x57CE,\t0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, 0x8FED, 0x5E38,\n\t0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, 0x8FF1, 0x6756,\t0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, 0x8FF5, 0x7A63,\n\t0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, 0x8FF9, 0x9320,\t0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, 0x9040, 0x62ED,\n\t0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, 0x9044, 0x7E54,\t0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, 0x9048, 0x98DF,\n\t0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, 0x904C, 0x4F38,\t0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, 0x9050, 0x5A20,\n\t0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, 0x9054, 0x614E,\t0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, 0x9058, 0x68EE,\n\t0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, 0x905C, 0x7533,\t0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, 0x9060, 0x79E6,\n\t0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, 0x9064, 0x85AA,\t0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, 0x9068, 0x8F9B,\n\t0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, 0x906C, 0x4EBA,\t0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, 0x9070, 0x58EC,\n\t0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, 0x9074, 0x814E,\t0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, 0x9078, 0x976D,\n\t0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, 0x907C, 0x9162,\t0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, 0x9081, 0x5439,\n\t0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, 0x9085, 0x6C34,\t0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, 0x9089, 0x7FE0,\n\t0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, 0x908D, 0x9310,\t0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, 0x9091, 0x9AC4,\n\t0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, 0x9095, 0x67A2,\t0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, 0x9099, 0x6749,\n\t0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, 0x909D, 0x96C0,\t0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, 0x90A1, 0x5BF8,\n\t0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, 0x90A5, 0x662F,\t0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, 0x90A9, 0x59D3,\n\t0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, 0x90AD, 0x653F,\t0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, 0x90B1, 0x68F2,\n\t0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, 0x90B5, 0x7272,\t0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, 0x90B9, 0x8056,\n\t0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, 0x90BD, 0x8AA0,\t0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, 0x90C1, 0x9192,\n\t0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, 0x90C5, 0x7A0E,\t0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, 0x90C9, 0x60DC,\n\t0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, 0x90CD, 0x6790,\t0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, 0x90D1, 0x7E3E,\n\t0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, 0x90D5, 0x8DE1,\t0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, 0x90D9, 0x62D9,\n\t0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, 0x90DD, 0x8A2D,\t0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, 0x90E1, 0x96EA,\n\t0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, 0x90E5, 0x4ED9,\t0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, 0x90E9, 0x5BA3,\n\t0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, 0x90ED, 0x6226,\t0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, 0x90F1, 0x6834,\n\t0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, 0x90F5, 0x67D3,\t0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, 0x90F9, 0x65CB,\n\t0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, 0x9140, 0x7E4A,\t0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, 0x9144, 0x8239,\n\t0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, 0x9148, 0x8DF5,\t0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, 0x914C, 0x9291,\n\t0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, 0x9150, 0x5584,\t0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, 0x9154, 0x7985,\n\t0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, 0x9158, 0x564C,\t0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, 0x915C, 0x66FE,\n\t0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, 0x9160, 0x758F,\t0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, 0x9164, 0x79DF,\n\t0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, 0x9168, 0x8607,\t0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, 0x916C, 0x9F20,\n\t0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, 0x9170, 0x53E2,\t0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, 0x9174, 0x594F,\n\t0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, 0x9178, 0x531D,\t0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, 0x917C, 0x6383,\n\t0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, 0x9181, 0x65E9,\t0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, 0x9185, 0x69FD,\n\t0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, 0x9189, 0x75E9,\t0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, 0x918D, 0x7DCF,\n\t0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, 0x9191, 0x8358,\t0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, 0x9195, 0x88C5,\n\t0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, 0x9199, 0x9397,\t0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, 0x919D, 0x5897,\n\t0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, 0x91A1, 0x8D08,\t0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, 0x91A5, 0x5247,\n\t0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, 0x91A9, 0x675F,\t0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, 0x91AD, 0x4FD7,\n\t0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, 0x91B1, 0x7D9A,\t0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, 0x91B5, 0x63C3,\n\t0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, 0x91B9, 0x640D,\t0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, 0x91BD, 0x591A,\n\t0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, 0x91C1, 0x553E,\t0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, 0x91C5, 0x6253,\n\t0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, 0x91C9, 0x9640,\t0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, 0x91CD, 0x5806,\n\t0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, 0x91D1, 0x5E2F,\t0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, 0x91D5, 0x6234,\n\t0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, 0x91D9, 0x80CE,\t0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, 0x91DD, 0x8CB8,\n\t0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, 0x91E1, 0x9EDB,\t0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, 0x91E5, 0x5927,\n\t0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, 0x91E9, 0x9DF9,\t0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, 0x91ED, 0x5544,\n\t0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, 0x91F1, 0x62D3,\t0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, 0x91F5, 0x8A17,\n\t0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, 0x91F9, 0x8338,\t0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, 0x9240, 0x53E9,\n\t0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, 0x9244, 0x596A,\t0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, 0x9248, 0x8FBF,\n\t0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, 0x924C, 0x9C48,\t0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, 0x9250, 0x5358,\n\t0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, 0x9254, 0x63A2,\t0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, 0x9258, 0x6E5B,\n\t0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, 0x925C, 0x7BAA,\t0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, 0x9260, 0x86CB,\n\t0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, 0x9264, 0x58C7,\t0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, 0x9268, 0x6A80,\n\t0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, 0x926C, 0x5024,\t0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, 0x9270, 0x6065,\n\t0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, 0x9274, 0x7A1A,\t0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, 0x9278, 0x9045,\n\t0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, 0x927C, 0x7AF9,\t0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, 0x9281, 0x79E9,\n\t0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, 0x9285, 0x7740,\t0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, 0x9289, 0x5FE0,\n\t0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, 0x928D, 0x6CE8,\t0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, 0x9291, 0x914E,\n\t0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, 0x9295, 0x7026,\t0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, 0x9299, 0x8CAF,\n\t0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, 0x929D, 0x558B,\t0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, 0x92A1, 0x5E81,\n\t0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, 0x92A5, 0x5FB4,\t0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, 0x92A9, 0x671D,\n\t0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, 0x92AD, 0x773A,\t0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, 0x92B1, 0x8776,\n\t0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, 0x92B5, 0x8DF3,\t0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, 0x92B9, 0x9CE5,\n\t0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, 0x92BD, 0x6715,\t0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, 0x92C1, 0x93AE,\n\t0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, 0x92C5, 0x690E,\t0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, 0x92C9, 0x75DB,\n\t0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, 0x92CD, 0x63B4,\t0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, 0x92D1, 0x67D8,\n\t0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, 0x92D5, 0x9354,\t0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, 0x92D9, 0x58F7,\n\t0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, 0x92DD, 0x540A,\t0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, 0x92E1, 0x4F4E,\n\t0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, 0x92E5, 0x8C9E,\t0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, 0x92E9, 0x5E1D,\n\t0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, 0x92ED, 0x5F1F,\t0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, 0x92F1, 0x63D0,\n\t0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, 0x92F5, 0x798E,\t0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, 0x92F9, 0x8A02,\n\t0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, 0x9340, 0x90B8,\t0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, 0x9344, 0x6CE5,\n\t0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, 0x9348, 0x6EF4,\t0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, 0x934C, 0x93D1,\n\t0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, 0x9350, 0x64A4,\t0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, 0x9354, 0x5178,\n\t0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, 0x9358, 0x5E97,\t0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, 0x935C, 0x8CBC,\n\t0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, 0x9360, 0x4F1D,\t0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, 0x9364, 0x96FB,\n\t0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, 0x9368, 0x5857,\t0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, 0x936C, 0x6597,\n\t0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, 0x9370, 0x83DF,\t0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, 0x9374, 0x934D,\n\t0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, 0x9378, 0x5EA6,\t0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, 0x937C, 0x5012,\n\t0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, 0x9381, 0x5200,\t0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, 0x9385, 0x5957,\n\t0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, 0x9389, 0x60BC,\t0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, 0x938D, 0x6843,\n\t0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, 0x9391, 0x6DD8,\t0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, 0x9395, 0x71C8,\n\t0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, 0x9399, 0x7B49,\t0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, 0x939D, 0x7D71,\n\t0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, 0x93A1, 0x85E4,\t0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, 0x93A5, 0x8E0F,\n\t0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, 0x93A9, 0x9676,\t0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, 0x93AD, 0x50CD,\n\t0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, 0x93B1, 0x5C0E,\t0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, 0x93B5, 0x77B3,\n\t0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, 0x93B9, 0x9053,\t0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, 0x93BD, 0x533F,\n\t0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, 0x93C1, 0x7279,\t0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, 0x93C5, 0x6BD2,\n\t0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, 0x93C9, 0x6A61,\t0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, 0x93CD, 0x5C4A,\n\t0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, 0x93D1, 0x9149,\t0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, 0x93D5, 0x60C7,\n\t0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, 0x93D9, 0x9041,\t0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, 0x93DD, 0x920D,\n\t0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, 0x93E1, 0x4E4D,\t0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, 0x93E5, 0x7058,\n\t0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, 0x93E9, 0x99B4,\t0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, 0x93ED, 0x6960,\n\t0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, 0x93F1, 0x4E8C,\t0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, 0x93F5, 0x5302,\n\t0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, 0x93F9, 0x5EFF,\t0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, 0x9440, 0x5982,\n\t0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, 0x9444, 0x598A,\t0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, 0x9448, 0x79B0,\n\t0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, 0x944C, 0x732B,\t0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, 0x9450, 0x637B,\n\t0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, 0x9454, 0x4E43,\t0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, 0x9458, 0x56A2,\n\t0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, 0x945C, 0x80FD,\t0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, 0x9460, 0x8997,\n\t0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, 0x9464, 0x64AD,\t0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, 0x9468, 0x6D3E,\n\t0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, 0x946C, 0x7F75,\t0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, 0x9470, 0x5EC3,\n\t0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, 0x9474, 0x676F,\t0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, 0x9478, 0x80BA,\n\t0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, 0x947C, 0x57F9,\t0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, 0x9481, 0x7164,\n\t0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, 0x9485, 0x8CE0,\t0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, 0x9489, 0x79E4,\n\t0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, 0x948D, 0x5265,\t0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, 0x9491, 0x6CCA,\n\t0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, 0x9495, 0x8236,\t0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, 0x9499, 0x6F20,\n\t0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, 0x949D, 0x99C1,\t0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, 0x94A1, 0x7872,\n\t0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, 0x94A5, 0x6AE8,\t0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, 0x94A9, 0x7560,\n\t0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, 0x94AD, 0x767A,\t0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, 0x94B1, 0x7F70,\n\t0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, 0x94B5, 0x9CE9,\t0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, 0x94B9, 0x96BC,\n\t0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, 0x94BD, 0x53CD,\t0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, 0x94C1, 0x6591,\n\t0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, 0x94C5, 0x7248,\t0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, 0x94C9, 0x7E41,\n\t0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, 0x94CD, 0x7BC4,\t0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, 0x94D1, 0x98EF,\n\t0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, 0x94D5, 0x76E4,\t0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, 0x94D9, 0x532A,\n\t0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, 0x94DD, 0x5E87,\t0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, 0x94E1, 0x6279,\n\t0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, 0x94E5, 0x6CCC,\t0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, 0x94E9, 0x79D8,\n\t0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, 0x94ED, 0x88AB,\t0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, 0x94F1, 0x975E,\n\t0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, 0x94F5, 0x5099,\t0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, 0x94F9, 0x6BD8,\n\t0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, 0x9540, 0x9F3B,\t0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, 0x9544, 0x758B,\n\t0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, 0x9548, 0x83F1,\t0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, 0x954C, 0x7562,\n\t0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, 0x9550, 0x59EB,\t0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, 0x9554, 0x8B2C,\n\t0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, 0x9558, 0x6C37,\t0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, 0x955C, 0x8868,\n\t0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, 0x9560, 0x63CF,\t0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, 0x9564, 0x9328,\n\t0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, 0x9568, 0x9C2D,\t0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, 0x956C, 0x6D5C,\n\t0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, 0x9570, 0x983B,\t0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, 0x9574, 0x4ED8,\n\t0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, 0x9578, 0x5BCC,\t0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, 0x957C, 0x6016,\n\t0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, 0x9581, 0x666E,\t0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, 0x9585, 0x8150,\n\t0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, 0x9589, 0x8CA0,\t0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, 0x958D, 0x9644,\n\t0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, 0x9591, 0x821E,\t0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, 0x9595, 0x5C01,\n\t0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, 0x9599, 0x8557,\t0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, 0x959D, 0x5E45,\n\t0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, 0x95A1, 0x8907,\t0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, 0x95A5, 0x6255,\n\t0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, 0x95A9, 0x9B92,\t0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, 0x95AD, 0x58B3,\n\t0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, 0x95B1, 0x596E,\t0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, 0x95B5, 0x96F0,\n\t0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, 0x95B9, 0x4F75,\t0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, 0x95BD, 0x5E73,\n\t0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, 0x95C1, 0x853D,\t0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, 0x95C5, 0x9801,\n\t0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, 0x95C9, 0x78A7,\t0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, 0x95CD, 0x7B86,\n\t0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, 0x95D1, 0x7BC7,\t0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, 0x95D5, 0x904D,\n\t0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, 0x95D9, 0x5F01,\t0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, 0x95DD, 0x92EA,\n\t0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, 0x95E1, 0x752B,\t0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, 0x95E5, 0x52DF,\n\t0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, 0x95E9, 0x66AE,\t0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, 0x95ED, 0x5023,\n\t0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, 0x95F1, 0x5831,\t0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, 0x95F5, 0x5CEF,\n\t0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, 0x95F9, 0x6367,\t0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, 0x9640, 0x6CD5,\n\t0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, 0x9644, 0x7E2B,\t0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, 0x9648, 0x84EC,\n\t0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, 0x964C, 0x8C4A,\t0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, 0x9650, 0x9CF3,\n\t0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, 0x9654, 0x508D,\t0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, 0x9658, 0x5E3D,\n\t0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, 0x965C, 0x66B4,\t0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, 0x9660, 0x5192,\n\t0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, 0x9664, 0x8B00,\t0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, 0x9668, 0x9632,\n\t0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, 0x966C, 0x50D5,\t0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, 0x9670, 0x6734,\n\t0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, 0x9674, 0x91E6,\t0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, 0x9678, 0x5800,\n\t0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, 0x967C, 0x7FFB,\t0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, 0x9681, 0x78E8,\n\t0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, 0x9685, 0x59B9,\t0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, 0x9689, 0x54E9,\n\t0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, 0x968D, 0x6795,\t0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, 0x9691, 0x685D,\n\t0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, 0x9695, 0x62B9,\t0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, 0x9699, 0x4FAD,\n\t0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, 0x969D, 0x6162,\t0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, 0x96A1, 0x5473,\n\t0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, 0x96A5, 0x7B95,\t0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, 0x96A9, 0x6E4A,\n\t0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, 0x96AD, 0x5999,\t0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, 0x96B1, 0x52D9,\n\t0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, 0x96B5, 0x77DB,\t0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, 0x96B9, 0x5A7F,\n\t0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, 0x96BD, 0x547D,\t0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, 0x96C1, 0x9298,\n\t0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, 0x96C5, 0x6EC5,\t0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, 0x96C9, 0x7DEC,\n\t0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, 0x96CD, 0x6A21,\t0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, 0x96D1, 0x6BDB,\n\t0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, 0x96D5, 0x8017,\t0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, 0x96D9, 0x9ED9,\n\t0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, 0x96DD, 0x9905,\t0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, 0x96E1, 0x8CB0,\n\t0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, 0x96E5, 0x9580,\t0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, 0x96E9, 0x591C,\n\t0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, 0x96ED, 0x5F25,\t0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, 0x96F1, 0x7D04,\n\t0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, 0x96F5, 0x9756,\t0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, 0x96F9, 0x6109,\n\t0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, 0x9740, 0x8AED,\t0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, 0x9744, 0x512A,\n\t0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, 0x9748, 0x5E7D,\t0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, 0x974C, 0x6709,\n\t0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, 0x9750, 0x7336,\t0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, 0x9754, 0x88D5,\n\t0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, 0x9758, 0x90F5,\t0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, 0x975C, 0x4E88,\n\t0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, 0x9760, 0x8F3F,\t0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, 0x9764, 0x5996,\n\t0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, 0x9768, 0x63FA,\t0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, 0x976C, 0x69D8,\n\t0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, 0x9770, 0x7528,\t0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, 0x9774, 0x8449,\n\t0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, 0x9778, 0x8E0A,\t0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, 0x977C, 0x617E,\n\t0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, 0x9781, 0x6D74,\t0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, 0x9785, 0x7F85,\n\t0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, 0x9789, 0x83B1,\t0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, 0x978D, 0x7D61,\n\t0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, 0x9791, 0x5375,\t0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, 0x9795, 0x85CD,\n\t0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, 0x9799, 0x540F,\t0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, 0x979D, 0x7406,\n\t0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, 0x97A1, 0x88E1,\t0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, 0x97A5, 0x5F8B,\n\t0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, 0x97A9, 0x63A0,\t0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, 0x97AD, 0x6E9C,\n\t0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, 0x97B1, 0x7C92,\t0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, 0x97B5, 0x4FB6,\n\t0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, 0x97B9, 0x4E86,\t0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, 0x97BD, 0x51CC,\n\t0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, 0x97C1, 0x6DBC,\t0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, 0x97C5, 0x7A1C,\n\t0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, 0x97C9, 0x907C,\t0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, 0x97CD, 0x529B,\n\t0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, 0x97D1, 0x6797,\t0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, 0x97D5, 0x81E8,\n\t0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, 0x97D9, 0x9E9F,\t0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, 0x97DD, 0x7D2F,\n\t0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, 0x97E1, 0x4F8B,\t0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, 0x97E5, 0x601C,\n\t0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, 0x97E9, 0x9234,\t0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, 0x97ED, 0x9E97,\n\t0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, 0x97F1, 0x5217,\t0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, 0x97F5, 0x5EC9,\n\t0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, 0x97F9, 0x7149,\t0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, 0x9840, 0x84EE,\n\t0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, 0x9844, 0x9B6F,\t0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, 0x9848, 0x8DEF,\n\t0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, 0x984C, 0x5ECA,\t0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, 0x9850, 0x6994,\n\t0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, 0x9854, 0x72FC,\t0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, 0x9858, 0x874B,\n\t0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, 0x985C, 0x7984,\t0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, 0x9860, 0x502D,\n\t0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, 0x9864, 0x8CC4,\t0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, 0x9868, 0x9DF2,\n\t0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, 0x986C, 0x8A6B,\t0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, 0x9870, 0x6E7E,\n\t0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, 0x98A0, 0x4E10,\t0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, 0x98A4, 0x4E36,\n\t0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, 0x98A8, 0x4E56,\t0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, 0x98AC, 0x8C6B,\n\t0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, 0x98B0, 0x4E8E,\t0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, 0x98B4, 0x4EA2,\n\t0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, 0x98B8, 0x4ECE,\t0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, 0x98BC, 0x4EC2,\n\t0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, 0x98C0, 0x4EDF,\t0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, 0x98C4, 0x4F30,\n\t0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, 0x98C8, 0x4F47,\t0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, 0x98CC, 0x4F98,\n\t0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, 0x98D0, 0x4F91,\t0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, 0x98D4, 0x5118,\n\t0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, 0x98D8, 0x4FD8,\t0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, 0x98DC, 0x4FD0,\n\t0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, 0x98E0, 0x5028,\t0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, 0x98E4, 0x5005,\n\t0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, 0x98E8, 0x5029,\t0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, 0x98EC, 0x5011,\n\t0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, 0x98F0, 0x6703,\t0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, 0x98F4, 0x505A,\n\t0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, 0x98F8, 0x5080,\t0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, 0x98FC, 0x50B2,\n\t0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, 0x9943, 0x50C2,\t0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, 0x9947, 0x50ED,\n\t0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, 0x994B, 0x50F5,\t0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, 0x994F, 0x5116,\n\t0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, 0x9953, 0x5121,\t0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, 0x9957, 0x513B,\n\t0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, 0x995B, 0x514C,\t0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, 0x995F, 0x5169,\n\t0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, 0x9963, 0x5182,\t0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, 0x9967, 0x518F,\n\t0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, 0x996B, 0x5196,\t0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, 0x996F, 0x51A9,\n\t0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, 0x9973, 0x51B1,\t0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, 0x9977, 0x51BD,\n\t0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, 0x997B, 0x51E0,\t0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, 0x9980, 0x51F0,\n\t0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, 0x9984, 0x520B,\t0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, 0x9988, 0x522A,\n\t0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, 0x998C, 0x524F,\t0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, 0x9990, 0x525E,\n\t0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, 0x9994, 0x5269,\t0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, 0x9998, 0x528D,\n\t0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, 0x999C, 0x5288,\t0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, 0x99A0, 0x52AC,\n\t0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, 0x99A4, 0x52C1,\t0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, 0x99A8, 0x52E3,\n\t0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, 0x99AC, 0x52F3,\t0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, 0x99B0, 0x5306,\n\t0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, 0x99B4, 0x5310,\t0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, 0x99B8, 0x5323,\n\t0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, 0x99BC, 0x5338,\t0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, 0x99C0, 0x4E17,\n\t0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, 0x99C4, 0x535E,\t0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, 0x99C8, 0x537B,\n\t0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, 0x99CC, 0x53A0,\t0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, 0x99D0, 0x53B0,\n\t0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, 0x99D4, 0x96D9,\t0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, 0x99D8, 0x53EE,\n\t0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, 0x99DC, 0x5401,\t0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, 0x99E0, 0x542D,\n\t0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, 0x99E4, 0x5429,\t0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, 0x99E8, 0x5475,\n\t0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, 0x99EC, 0x5477,\t0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, 0x99F0, 0x5480,\n\t0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, 0x99F4, 0x5486,\t0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, 0x99F8, 0x54A5,\n\t0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, 0x99FC, 0x54A8,\t0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, 0x9A43, 0x54BE,\n\t0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, 0x9A47, 0x54E6,\t0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, 0x9A4B, 0x54EE,\n\t0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, 0x9A4F, 0x5539,\t0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, 0x9A53, 0x552E,\n\t0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, 0x9A57, 0x5557,\t0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, 0x9A5B, 0x5599,\n\t0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, 0x9A5F, 0x559F,\t0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, 0x9A63, 0x559E,\n\t0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, 0x9A67, 0x55A9,\t0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, 0x9A6B, 0x55C5,\n\t0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, 0x9A6F, 0x55E4,\t0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, 0x9A73, 0x5616,\n\t0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, 0x9A77, 0x55F9,\t0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, 0x9A7B, 0x5634,\n\t0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, 0x9A80, 0x566B,\t0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, 0x9A84, 0x566A,\n\t0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, 0x9A88, 0x56A0,\t0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, 0x9A8C, 0x56AE,\n\t0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, 0x9A90, 0x56BC,\t0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, 0x9A94, 0x56C8,\n\t0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, 0x9A98, 0x56D7,\t0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, 0x9A9C, 0x56FF,\n\t0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, 0x9AA0, 0x570B,\t0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, 0x9AA4, 0x5716,\n\t0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, 0x9AA8, 0x5737,\t0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, 0x9AAC, 0x5740,\n\t0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, 0x9AB0, 0x5788,\t0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, 0x9AB4, 0x5793,\n\t0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, 0x9AB8, 0x57AA,\t0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, 0x9ABC, 0x57D4,\n\t0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, 0x9AC0, 0x57D6,\t0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, 0x9AC4, 0x581D,\n\t0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, 0x9AC8, 0x584B,\t0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, 0x9ACC, 0x583D,\n\t0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, 0x9AD0, 0x589F,\t0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, 0x9AD4, 0x58BB,\n\t0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, 0x9AD8, 0x58D3,\t0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, 0x9ADC, 0x58D8,\n\t0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, 0x9AE0, 0x58DF,\t0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, 0x9AE4, 0x58FB,\n\t0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, 0x9AE8, 0x590A,\t0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, 0x9AEC, 0x5925,\n\t0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, 0x9AF0, 0x5938,\t0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, 0x9AF4, 0x5950,\n\t0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, 0x9AF8, 0x5962,\t0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, 0x9AFC, 0x5969,\n\t0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, 0x9B43, 0x4F5E,\t0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, 0x9B47, 0x59C6,\n\t0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, 0x9B4B, 0x59D9,\t0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, 0x9B4F, 0x5A11,\n\t0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, 0x9B53, 0x5A40,\t0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, 0x9B57, 0x5A36,\n\t0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, 0x9B5B, 0x5ABC,\t0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, 0x9B5F, 0x5ABD,\n\t0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, 0x9B63, 0x5AE9,\t0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, 0x9B67, 0x5B0C,\n\t0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, 0x9B6B, 0x5AD0,\t0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, 0x9B6F, 0x5B43,\n\t0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, 0x9B73, 0x5B55,\t0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, 0x9B77, 0x5B69,\n\t0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, 0x9B7B, 0x5B78,\t0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, 0x9B80, 0x5B83,\n\t0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, 0x9B84, 0x5BC7,\t0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, 0x9B88, 0x5BE4,\n\t0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, 0x9B8C, 0x5BE5,\t0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, 0x9B90, 0x5BF3,\n\t0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, 0x9B94, 0x5C0D,\t0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, 0x9B98, 0x5C28,\n\t0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, 0x9B9C, 0x5C46,\t0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, 0x9BA0, 0x5C4F,\n\t0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, 0x9BA4, 0x4E62,\t0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, 0x9BA8, 0x5C91,\n\t0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, 0x9BAC, 0x5CBB,\t0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, 0x9BB0, 0x5CC5,\n\t0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, 0x9BB4, 0x5CE9,\t0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, 0x9BB8, 0x5D8C,\n\t0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, 0x9BBC, 0x5D17,\t0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, 0x9BC0, 0x5D11,\n\t0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, 0x9BC4, 0x5D19,\t0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, 0x9BC8, 0x5D4E,\n\t0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, 0x9BCC, 0x5D76,\t0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, 0x9BD0, 0x5DA2,\n\t0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, 0x9BD4, 0x5DBD,\t0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, 0x9BD8, 0x5DC9,\n\t0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, 0x9BDC, 0x5DD6,\t0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, 0x9BE0, 0x5DF5,\n\t0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, 0x9BE4, 0x5E11,\t0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, 0x9BE8, 0x5E44,\n\t0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, 0x9BEC, 0x5E57,\t0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, 0x9BF0, 0x5E64,\n\t0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, 0x9BF4, 0x5E7A,\t0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, 0x9BF8, 0x5EC1,\n\t0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, 0x9BFC, 0x5ECF,\t0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, 0x9C43, 0x5EDA,\n\t0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, 0x9C47, 0x5EE8,\t0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, 0x9C4B, 0x5EF3,\n\t0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, 0x9C4F, 0x5EFE,\t0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, 0x9C53, 0x5F5C,\n\t0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, 0x9C57, 0x5F29,\t0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, 0x9C5B, 0x5F48,\n\t0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, 0x9C5F, 0x5F51,\t0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, 0x9C63, 0x5F61,\n\t0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, 0x9C67, 0x5F83,\t0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, 0x9C6B, 0x5F88,\n\t0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, 0x9C6F, 0x5F99,\t0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, 0x9C73, 0x5FAD,\n\t0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, 0x9C77, 0x5FE4,\t0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, 0x9C7B, 0x60B3,\n\t0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, 0x9C80, 0x6019,\t0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, 0x9C84, 0x6031,\n\t0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, 0x9C88, 0x6026,\t0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, 0x9C8C, 0x6041,\n\t0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, 0x9C90, 0x604A,\t0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, 0x9C94, 0x6043,\n\t0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, 0x9C98, 0x606B,\t0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, 0x9C9C, 0x60E7,\n\t0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, 0x9CA0, 0x609B,\t0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, 0x9CA4, 0x60A7,\n\t0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, 0x9CA8, 0x60E0,\t0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, 0x9CAC, 0x60BD,\n\t0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, 0x9CB0, 0x614D,\t0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, 0x9CB4, 0x60F7,\n\t0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, 0x9CB8, 0x6103,\t0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, 0x9CBC, 0x610D,\n\t0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, 0x9CC0, 0x6128,\t0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, 0x9CC4, 0x613C,\n\t0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, 0x9CC8, 0x6142,\t0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, 0x9CCC, 0x6158,\n\t0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, 0x9CD0, 0x6174,\t0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, 0x9CD4, 0x615F,\n\t0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, 0x9CD8, 0x6199,\t0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, 0x9CDC, 0x6194,\n\t0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, 0x9CE0, 0x61AB,\t0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, 0x9CE4, 0x61C9,\n\t0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, 0x9CE8, 0x61C6,\t0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, 0x9CEC, 0x61CD,\n\t0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, 0x9CF0, 0x61FA,\t0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, 0x9CF4, 0x61FC,\n\t0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, 0x9CF8, 0x6209,\t0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, 0x9CFC, 0x621B,\n\t0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, 0x9D43, 0x622E,\t0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, 0x9D47, 0x6241,\n\t0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, 0x9D4B, 0x625B,\t0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, 0x9D4F, 0x6282,\n\t0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, 0x9D53, 0x6293,\t0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, 0x9D57, 0x6294,\n\t0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, 0x9D5B, 0x62CF,\t0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, 0x9D5F, 0x62C8,\n\t0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, 0x9D63, 0x62C2,\t0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, 0x9D67, 0x630C,\n\t0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, 0x9D6B, 0x6302,\t0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, 0x9D6F, 0x6350,\n\t0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, 0x9D73, 0x634F,\t0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, 0x9D77, 0x63AB,\n\t0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, 0x9D7B, 0x6389,\t0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, 0x9D80, 0x6369,\n\t0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, 0x9D84, 0x63C6,\t0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, 0x9D88, 0x63F6,\n\t0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, 0x9D8C, 0x6406,\t0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, 0x9D90, 0x651D,\n\t0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, 0x9D94, 0x6467,\t0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, 0x9D98, 0x652A,\n\t0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, 0x9D9C, 0x64A9,\t0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, 0x9DA0, 0x64D2,\n\t0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, 0x9DA4, 0x64D8,\t0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, 0x9DA8, 0x8209,\n\t0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, 0x9DAC, 0x64E3,\t0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, 0x9DB0, 0x64F4,\n\t0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, 0x9DB4, 0x64FD,\t0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, 0x9DB8, 0x6524,\n\t0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, 0x9DBC, 0x6535,\t0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, 0x9DC0, 0x754B,\n\t0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, 0x9DC4, 0x654D,\t0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, 0x9DC8, 0x6572,\n\t0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, 0x9DCC, 0x8B8A,\t0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, 0x9DD0, 0x65B7,\n\t0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, 0x9DD4, 0x65C4,\t0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, 0x9DD8, 0x65D9,\n\t0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, 0x9DDC, 0x6772,\t0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, 0x9DE0, 0x6773,\n\t0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, 0x9DE4, 0x661C,\t0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, 0x9DE8, 0x6641,\n\t0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, 0x9DEC, 0x6667,\t0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, 0x9DF0, 0x6670,\n\t0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, 0x9DF4, 0x6689,\t0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, 0x9DF8, 0x66C1,\n\t0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, 0x9DFC, 0x66BC,\t0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, 0x9E43, 0x66DA,\n\t0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, 0x9E47, 0x66E9,\t0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, 0x9E4B, 0x670F,\n\t0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, 0x9E4F, 0x6727,\t0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, 0x9E53, 0x6736,\n\t0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, 0x9E57, 0x6746,\t0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, 0x9E5B, 0x6763,\n\t0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, 0x9E5F, 0x67A9,\t0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, 0x9E63, 0x678B,\n\t0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, 0x9E67, 0x67B7,\t0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, 0x9E6B, 0x67B3,\n\t0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, 0x9E6F, 0x67DE,\t0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, 0x9E73, 0x67B9,\n\t0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, 0x9E77, 0x6A9C,\t0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, 0x9E7B, 0x6840,\n\t0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, 0x9E80, 0x68B3,\t0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, 0x9E84, 0x6877,\n\t0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, 0x9E88, 0x68AD,\t0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, 0x9E8C, 0x6883,\n\t0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, 0x9E90, 0x68B5,\t0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, 0x9E94, 0x688D,\n\t0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, 0x9E98, 0x6908,\t0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, 0x9E9C, 0x68E1,\n\t0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, 0x9EA0, 0x68E7,\t0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, 0x9EA4, 0x6904,\n\t0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, 0x9EA8, 0x68F9,\t0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, 0x9EAC, 0x692A,\n\t0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, 0x9EB0, 0x68C6,\t0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, 0x9EB4, 0x6978,\n\t0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, 0x9EB8, 0x696E,\t0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, 0x9EBC, 0x6959,\n\t0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, 0x9EC0, 0x695D,\t0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, 0x9EC4, 0x69AE,\n\t0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, 0x9EC8, 0x69D3,\t0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, 0x9ECC, 0x69CA,\n\t0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, 0x9ED0, 0x69A7,\t0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, 0x9ED4, 0x699C,\n\t0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, 0x9ED8, 0x69E8,\t0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, 0x9EDC, 0x6B0A,\n\t0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, 0x9EE0, 0x6A05,\t0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, 0x9EE4, 0x6A14,\n\t0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, 0x9EE8, 0x6AC1,\t0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, 0x9EEC, 0x6A0C,\n\t0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, 0x9EF0, 0x6A47,\t0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, 0x9EF4, 0x6A48,\n\t0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, 0x9EF8, 0x6A8D,\t0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, 0x9EFC, 0x6AA3,\n\t0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, 0x9F43, 0x6AC3,\t0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, 0x9F47, 0x6AAC,\n\t0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, 0x9F4B, 0x6AAA,\t0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, 0x9F4F, 0x6B05,\n\t0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, 0x9F53, 0x6B16,\t0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, 0x9F57, 0x6B37,\n\t0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, 0x9F5B, 0x6B47,\t0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, 0x9F5F, 0x6B59,\n\t0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, 0x9F63, 0x6B61,\t0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, 0x9F67, 0x6B80,\n\t0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, 0x9F6B, 0x6B98,\t0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, 0x9F6F, 0x6BAA,\n\t0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, 0x9F73, 0x6BB1,\t0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, 0x9F77, 0x6BC6,\n\t0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, 0x9F7B, 0x6BEC,\t0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, 0x9F80, 0x9EBE,\n\t0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, 0x9F84, 0x6C1B,\t0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, 0x9F88, 0x6C55,\n\t0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, 0x9F8C, 0x6C8D,\t0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, 0x9F90, 0x6C7E,\n\t0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, 0x9F94, 0x6C90,\t0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, 0x9F98, 0x6CBD,\n\t0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, 0x9F9C, 0x6CAE,\t0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, 0x9FA0, 0x6CDB,\n\t0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, 0x9FA4, 0x6D1F,\t0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, 0x9FA8, 0x6D3D,\n\t0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, 0x9FAC, 0x6D33,\t0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, 0x9FB0, 0x6D93,\n\t0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, 0x9FB4, 0x6D59,\t0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, 0x9FB8, 0x6D85,\n\t0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, 0x9FBC, 0x6DB5,\t0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, 0x9FC0, 0x6DC6,\n\t0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, 0x9FC4, 0x6DE8,\t0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, 0x9FC8, 0x6DD9,\n\t0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, 0x9FCC, 0x6DEE,\t0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, 0x9FD0, 0x6E19,\n\t0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, 0x9FD4, 0x6E23,\t0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, 0x9FD8, 0x6E4D,\n\t0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, 0x9FDC, 0x6E4E,\t0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, 0x9FE0, 0x6E38,\n\t0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, 0x9FE4, 0x6EC9,\t0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, 0x9FE8, 0x6EAF,\n\t0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, 0x9FEC, 0x6ED5,\t0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, 0x9FF0, 0x6E9F,\n\t0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, 0x9FF4, 0x6EEC,\t0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, 0x9FF8, 0x6EF2,\n\t0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, 0x9FFC, 0x6ECC,\t0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, 0xE043, 0x6F86,\n\t0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, 0xE047, 0x6F80,\t0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, 0xE04B, 0x6F6D,\n\t0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, 0xE04F, 0x6F8E,\t0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, 0xE053, 0x6FB3,\n\t0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, 0xE057, 0x6FB9,\t0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, 0xE05B, 0x6FD5,\n\t0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, 0xE05F, 0x6FF1,\t0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, 0xE063, 0x700B,\n\t0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, 0xE067, 0x700F,\t0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, 0xE06B, 0x6F74,\n\t0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, 0xE06F, 0x7030,\t0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, 0xE073, 0x7063,\n\t0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, 0xE077, 0x70F1,\t0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, 0xE07B, 0x70AE,\n\t0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, 0xE080, 0x70D9,\t0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, 0xE084, 0x7119,\n\t0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, 0xE088, 0x7166,\t0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, 0xE08C, 0x716C,\n\t0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, 0xE090, 0x7195,\t0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, 0xE094, 0x71B9,\n\t0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, 0xE098, 0x71D4,\t0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, 0xE09C, 0x71E7,\n\t0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, 0xE0A0, 0x71FF,\t0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, 0xE0A4, 0x7228,\n\t0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, 0xE0A8, 0x7232,\t0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, 0xE0AC, 0x7240,\n\t0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, 0xE0B0, 0x7274,\t0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, 0xE0B4, 0x7287,\n\t0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, 0xE0B8, 0x72A7,\t0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, 0xE0BC, 0x72C6,\n\t0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, 0xE0C0, 0x72E2,\t0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, 0xE0C4, 0x72F7,\n\t0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, 0xE0C8, 0x731C,\t0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, 0xE0CC, 0x732F,\n\t0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, 0xE0D0, 0x734E,\t0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, 0xE0D4, 0x736A,\n\t0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, 0xE0D8, 0x7375,\t0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, 0xE0DC, 0x73B3,\n\t0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, 0xE0E0, 0x73E5,\t0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, 0xE0E4, 0x7405,\n\t0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, 0xE0E8, 0x7432,\t0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, 0xE0EC, 0x745F,\n\t0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, 0xE0F0, 0x7469,\t0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, 0xE0F4, 0x7476,\n\t0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, 0xE0F8, 0x74A7,\t0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, 0xE0FC, 0x73F1,\n\t0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, 0xE143, 0x74E9,\t0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, 0xE147, 0x74F1,\n\t0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, 0xE14B, 0x7503,\t0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, 0xE14F, 0x750D,\n\t0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, 0xE153, 0x7526,\t0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, 0xE157, 0x754D,\n\t0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, 0xE15B, 0x7546,\t0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, 0xE15F, 0x7567,\n\t0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, 0xE163, 0x7576,\t0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, 0xE167, 0x758A,\n\t0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, 0xE16B, 0x759A,\t0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, 0xE16F, 0x75C2,\n\t0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, 0xE173, 0x75BD,\t0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, 0xE177, 0x75CD,\n\t0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, 0xE17B, 0x75E3,\t0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, 0xE180, 0x75FC,\n\t0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, 0xE184, 0x75F2,\t0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, 0xE188, 0x7609,\n\t0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, 0xE18C, 0x7621,\t0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, 0xE190, 0x7630,\n\t0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, 0xE194, 0x7646,\t0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, 0xE198, 0x7662,\n\t0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, 0xE19C, 0x7667,\t0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, 0xE1A0, 0x7676,\n\t0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, 0xE1A4, 0x7683,\t0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, 0xE1A8, 0x7696,\n\t0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, 0xE1AC, 0x76B0,\t0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, 0xE1B0, 0x76BA,\n\t0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, 0xE1B4, 0x76D2,\t0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, 0xE1B8, 0x76E7,\n\t0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, 0xE1BC, 0x7708,\t0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, 0xE1C0, 0x7724,\n\t0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, 0xE1C4, 0x771B,\t0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, 0xE1C8, 0x775A,\n\t0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, 0xE1CC, 0x7765,\t0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, 0xE1D0, 0x778E,\n\t0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, 0xE1D4, 0x779E,\t0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, 0xE1D8, 0x77BF,\n\t0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, 0xE1DC, 0x77C7,\t0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, 0xE1E0, 0x77DC,\n\t0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, 0xE1E4, 0x780C,\t0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, 0xE1E8, 0x792A,\n\t0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, 0xE1EC, 0x7886,\t0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, 0xE1F0, 0x78A3,\n\t0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, 0xE1F4, 0x78D1,\t0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, 0xE1F8, 0x78BE,\n\t0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, 0xE1FC, 0x78EC,\t0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, 0xE243, 0x78F4,\n\t0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, 0xE247, 0x7919,\t0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, 0xE24B, 0x7960,\n\t0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, 0xE24F, 0x7955,\t0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, 0xE253, 0x798A,\n\t0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, 0xE257, 0x79AA,\t0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, 0xE25B, 0x79BA,\n\t0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, 0xE25F, 0x79EC,\t0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, 0xE263, 0x7A0D,\n\t0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, 0xE267, 0x7A1F,\t0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, 0xE26B, 0x7A3E,\n\t0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, 0xE26F, 0x7A49,\t0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, 0xE273, 0x9F9D,\n\t0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, 0xE277, 0x7A88,\t0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, 0xE27B, 0x7A96,\n\t0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, 0xE280, 0x7AB6,\t0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, 0xE284, 0x9083,\n\t0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, 0xE288, 0x7ACF,\t0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, 0xE28C, 0x7ADA,\n\t0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, 0xE290, 0x7AE6,\t0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, 0xE294, 0x7B0F,\n\t0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, 0xE298, 0x7B18,\t0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, 0xE29C, 0x7B28,\n\t0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, 0xE2A0, 0x7B04,\t0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, 0xE2A4, 0x7B45,\n\t0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, 0xE2A8, 0x7B67,\t0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, 0xE2AC, 0x7B6E,\n\t0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, 0xE2B0, 0x7B8D,\t0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, 0xE2B4, 0x7B92,\n\t0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, 0xE2B8, 0x7BCB,\t0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, 0xE2BC, 0x7BB4,\n\t0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, 0xE2C0, 0x7C11,\t0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, 0xE2C4, 0x7C60,\n\t0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, 0xE2C8, 0x7BF3,\t0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, 0xE2CC, 0x7BF6,\n\t0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, 0xE2D0, 0x7C1F,\t0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, 0xE2D4, 0x7C4C,\n\t0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, 0xE2D8, 0x7C40,\t0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, 0xE2DC, 0x7C64,\n\t0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, 0xE2E0, 0x7C75,\t0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, 0xE2E4, 0x7CAD,\n\t0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, 0xE2E8, 0x7CA8,\t0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, 0xE2EC, 0x7CAE,\n\t0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, 0xE2F0, 0x7CC5,\t0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, 0xE2F4, 0x7CDC,\n\t0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, 0xE2F8, 0x7CF2,\t0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, 0xE2FC, 0x7D06,\n\t0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, 0xE343, 0x7D0A,\t0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, 0xE347, 0x7D32,\n\t0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, 0xE34B, 0x7D73,\t0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, 0xE34F, 0x7D68,\n\t0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, 0xE353, 0x7D93,\t0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, 0xE357, 0x7D7D,\n\t0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, 0xE35B, 0x7DA3,\t0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, 0xE35F, 0x7DAB,\n\t0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, 0xE363, 0x7DDC,\t0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, 0xE367, 0x7DD8,\n\t0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, 0xE36B, 0x7DFB,\t0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, 0xE36F, 0x7E0A,\n\t0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, 0xE373, 0x7E31,\t0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, 0xE377, 0x7E22,\n\t0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, 0xE37B, 0x7E35,\t0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, 0xE380, 0x7E32,\n\t0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, 0xE384, 0x7E56,\t0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, 0xE388, 0x7E79,\n\t0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, 0xE38C, 0x7E7B,\t0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, 0xE390, 0x8FAE,\n\t0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, 0xE394, 0x7E8C,\t0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, 0xE398, 0x7E94,\n\t0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, 0xE39C, 0x7E9C,\t0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, 0xE3A0, 0x7F4C,\n\t0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, 0xE3A4, 0x7F51,\t0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, 0xE3A8, 0x7F5F,\n\t0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, 0xE3AC, 0x7F67,\t0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, 0xE3B0, 0x7F83,\n\t0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, 0xE3B4, 0x7F94,\t0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, 0xE3B8, 0x7FA3,\n\t0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, 0xE3BC, 0x7FAE,\t0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, 0xE3C0, 0x7FC5,\n\t0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, 0xE3C4, 0x7FD4,\t0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, 0xE3C8, 0x7FF3,\n\t0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, 0xE3CC, 0x8004,\t0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, 0xE3D0, 0x8019,\n\t0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, 0xE3D4, 0x803F,\t0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, 0xE3D8, 0x8052,\n\t0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, 0xE3DC, 0x8062,\t0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, 0xE3E0, 0x8070,\n\t0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, 0xE3E4, 0x807F,\t0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, 0xE3E8, 0x809B,\n\t0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, 0xE3EC, 0x5190,\t0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, 0xE3F0, 0x80D9,\n\t0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, 0xE3F4, 0x80D6,\t0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, 0xE3F8, 0x811B,\n\t0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, 0xE3FC, 0x814B,\t0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, 0xE443, 0x8153,\n\t0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, 0xE447, 0x816E,\t0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, 0xE44B, 0x8183,\n\t0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, 0xE44F, 0x8182,\t0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, 0xE453, 0x81A3,\n\t0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, 0xE457, 0x81B0,\t0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, 0xE45B, 0x81BD,\n\t0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, 0xE45F, 0x81C9,\t0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, 0xE463, 0x81D8,\n\t0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, 0xE467, 0x81E0,\t0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, 0xE46B, 0x81FE,\n\t0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, 0xE46F, 0x8207,\t0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, 0xE473, 0x8216,\n\t0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, 0xE477, 0x8233,\t0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, 0xE47B, 0x825D,\n\t0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, 0xE480, 0x8262,\t0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, 0xE484, 0x822E,\n\t0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, 0xE488, 0x827E,\t0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, 0xE48C, 0x829F,\n\t0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, 0xE490, 0x82E3,\t0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, 0xE494, 0x82F3,\n\t0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, 0xE498, 0x82FB,\t0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, 0xE49C, 0x82DC,\n\t0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, 0xE4A0, 0x8334,\t0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, 0xE4A4, 0x8340,\n\t0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, 0xE4A8, 0x832F,\t0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, 0xE4AC, 0x8385,\n\t0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, 0xE4B0, 0x83A2,\t0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, 0xE4B4, 0x8387,\n\t0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, 0xE4B8, 0x8373,\t0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, 0xE4BC, 0x83A8,\n\t0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, 0xE4C0, 0x83CE,\t0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, 0xE4C4, 0x840B,\n\t0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, 0xE4C8, 0x83E0,\t0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, 0xE4CC, 0x8420,\n\t0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, 0xE4D0, 0x83FB,\t0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, 0xE4D4, 0x855A,\n\t0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, 0xE4D8, 0x84AD,\t0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, 0xE4DC, 0x8446,\n\t0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, 0xE4E0, 0x8435,\t0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, 0xE4E4, 0x84BF,\n\t0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, 0xE4E8, 0x84BB,\t0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, 0xE4EC, 0x84C6,\n\t0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, 0xE4F0, 0x84FF,\t0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, 0xE4F4, 0x852C,\n\t0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, 0xE4F8, 0x84FC,\t0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, 0xE4FC, 0x8548,\n\t0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, 0xE543, 0x8555,\t0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, 0xE547, 0x8591,\n\t0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, 0xE54B, 0x8594,\t0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, 0xE54F, 0x859C,\n\t0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, 0xE553, 0x85C9,\t0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, 0xE557, 0x85D0,\n\t0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, 0xE55B, 0x85DC,\t0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, 0xE55F, 0x860B,\n\t0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, 0xE563, 0x8622,\t0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, 0xE567, 0x864D,\n\t0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, 0xE56B, 0x8667,\t0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, 0xE56F, 0x86A9,\n\t0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, 0xE573, 0x86B6,\t0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, 0xE577, 0x86B0,\n\t0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, 0xE57B, 0x86D4,\t0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, 0xE580, 0x86DF,\n\t0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, 0xE584, 0x8706,\t0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, 0xE588, 0x86FB,\n\t0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, 0xE58C, 0x86F9,\t0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, 0xE590, 0x8737,\n\t0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, 0xE594, 0x871A,\t0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, 0xE598, 0x874C,\n\t0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, 0xE59C, 0x8768,\t0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, 0xE5A0, 0x8763,\n\t0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, 0xE5A4, 0x879F,\t0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, 0xE5A8, 0x87BD,\n\t0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, 0xE5AC, 0x87AB,\t0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, 0xE5B0, 0x87C6,\n\t0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, 0xE5B4, 0x87E0,\t0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, 0xE5B8, 0x87F6,\n\t0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, 0xE5BC, 0x8811,\t0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, 0xE5C0, 0x8821,\n\t0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, 0xE5C4, 0x8827,\t0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, 0xE5C8, 0x8852,\n\t0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, 0xE5CC, 0x886B,\t0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, 0xE5D0, 0x8875,\n\t0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, 0xE5D4, 0x8882,\t0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, 0xE5D8, 0x8899,\n\t0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, 0xE5DC, 0x88B0,\t0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, 0xE5E0, 0x88C4,\n\t0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, 0xE5E4, 0x88DD,\t0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, 0xE5E8, 0x88F4,\n\t0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, 0xE5EC, 0x890C,\t0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, 0xE5F0, 0x891E,\n\t0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, 0xE5F4, 0x8941,\t0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, 0xE5F8, 0x8938,\n\t0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, 0xE5FC, 0x895E,\t0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, 0xE643, 0x896A,\n\t0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, 0xE647, 0x897E,\t0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, 0xE64B, 0x8993,\n\t0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, 0xE64F, 0x89A6,\t0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, 0xE653, 0x89BA,\n\t0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, 0xE657, 0x89DA,\t0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, 0xE65B, 0x89F4,\n\t0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, 0xE65F, 0x8A10,\t0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, 0xE663, 0x8A25,\n\t0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, 0xE667, 0x8A52,\t0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, 0xE66B, 0x8A6D,\n\t0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, 0xE66F, 0x8A82,\t0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, 0xE673, 0x8A91,\n\t0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, 0xE677, 0x8AA3,\t0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, 0xE67B, 0x8ADA,\n\t0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, 0xE680, 0x8AE4,\t0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, 0xE684, 0x8AE2,\n\t0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, 0xE688, 0x8B0C,\t0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, 0xE68C, 0x8B16,\n\t0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, 0xE690, 0x8B33,\t0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, 0xE694, 0x8B3E,\n\t0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, 0xE698, 0x8B4F,\t0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, 0xE69C, 0x8B5B,\n\t0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, 0xE6A0, 0x8B6C,\t0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, 0xE6A4, 0x8B80,\n\t0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, 0xE6A8, 0x8B93,\t0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, 0xE6AC, 0x8C3A,\n\t0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, 0xE6B0, 0x8C4C,\t0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, 0xE6B4, 0x8C62,\n\t0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, 0xE6B8, 0x8C82,\t0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, 0xE6BC, 0x8C8D,\n\t0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, 0xE6C0, 0x8C98,\t0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, 0xE6C4, 0x8CBD,\n\t0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, 0xE6C8, 0x8CB6,\t0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, 0xE6CC, 0x8CE3,\n\t0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, 0xE6D0, 0x8CFB,\t0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, 0xE6D4, 0x8D07,\n\t0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, 0xE6D8, 0x9F4E,\t0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, 0xE6DC, 0x8D16,\n\t0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, 0xE6E0, 0x8D73,\t0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, 0xE6E4, 0x8DBE,\n\t0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, 0xE6E8, 0x8DD6,\t0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, 0xE6EC, 0x8DEA,\n\t0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, 0xE6F0, 0x8DFC,\t0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, 0xE6F4, 0x8E1D,\n\t0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, 0xE6F8, 0x8E42,\t0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, 0xE6FC, 0x8E4A,\n\t0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, 0xE743, 0x8E50,\t0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, 0xE747, 0x8E60,\n\t0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, 0xE74B, 0x8E76,\t0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, 0xE74F, 0x8E87,\n\t0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, 0xE753, 0x8E8A,\t0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, 0xE757, 0x8E99,\n\t0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, 0xE75B, 0x8EB0,\t0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, 0xE75F, 0x8EC5,\n\t0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, 0xE763, 0x8EE3,\t0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, 0xE767, 0x8EFE,\n\t0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, 0xE76B, 0x8F12,\t0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, 0xE76F, 0x8F1F,\n\t0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, 0xE773, 0x8F33,\t0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, 0xE777, 0x8F42,\n\t0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, 0xE77B, 0x8F46,\t0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, 0xE780, 0x8F62,\n\t0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, 0xE784, 0x8F9F,\t0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, 0xE788, 0x8FB7,\n\t0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, 0xE78C, 0x8FEA,\t0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, 0xE790, 0x9005,\n\t0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, 0xE794, 0x9015,\t0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, 0xE798, 0x9016,\n\t0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, 0xE79C, 0x9035,\t0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, 0xE7A0, 0x9050,\n\t0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, 0xE7A4, 0x9049,\t0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, 0xE7A8, 0x905E,\n\t0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, 0xE7AC, 0x96A8,\t0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, 0xE7B0, 0x9081,\n\t0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, 0xE7B4, 0x908F,\t0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, 0xE7B8, 0x90B5,\n\t0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, 0xE7BC, 0x90DB,\t0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, 0xE7C0, 0x9132,\n\t0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, 0xE7C4, 0x9158,\t0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, 0xE7C8, 0x9173,\n\t0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, 0xE7CC, 0x9182,\t0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, 0xE7D0, 0x91AA,\n\t0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, 0xE7D4, 0x91C0,\t0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, 0xE7D8, 0x91D0,\n\t0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, 0xE7DC, 0x91DB,\t0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, 0xE7E0, 0x921E,\n\t0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, 0xE7E4, 0x9215,\t0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, 0xE7E8, 0x9245,\n\t0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, 0xE7EC, 0x9295,\t0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, 0xE7F0, 0x929C,\n\t0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, 0xE7F4, 0x925A,\t0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, 0xE7F8, 0x92E9,\n\t0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, 0xE7FC, 0x932E,\t0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, 0xE843, 0x9323,\n\t0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, 0xE847, 0x935C,\t0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, 0xE84B, 0x9356,\n\t0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, 0xE84F, 0x9394,\t0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, 0xE853, 0x93E8,\n\t0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, 0xE857, 0x93DD,\t0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, 0xE85B, 0x941A,\n\t0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, 0xE85F, 0x9407,\t0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, 0xE863, 0x9435,\n\t0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, 0xE867, 0x9452,\t0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, 0xE86B, 0x9462,\n\t0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, 0xE86F, 0x9470,\t0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, 0xE873, 0x945A,\n\t0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, 0xE877, 0x947F,\t0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, 0xE87B, 0x9594,\n\t0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, 0xE880, 0x95A0,\t0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, 0xE884, 0x95BC,\n\t0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, 0xE888, 0x95CA,\t0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, 0xE88C, 0x95CC,\n\t0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, 0xE890, 0x95DC,\t0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, 0xE894, 0x9621,\n\t0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, 0xE898, 0x9642,\t0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, 0xE89C, 0x9677,\n\t0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, 0xE8A0, 0x965F,\t0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, 0xE8A4, 0x968D,\n\t0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, 0xE8A8, 0x96AA,\t0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, 0xE8AC, 0x96B0,\n\t0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, 0xE8B0, 0x96B9,\t0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, 0xE8B4, 0x96CD,\n\t0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, 0xE8B8, 0x96D5,\t0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, 0xE8BC, 0x9708,\n\t0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, 0xE8C0, 0x970F,\t0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, 0xE8C4, 0x972A,\n\t0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, 0xE8C8, 0x973E,\t0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, 0xE8CC, 0x9742,\n\t0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, 0xE8D0, 0x9764,\t0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, 0xE8D4, 0x976B,\n\t0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, 0xE8D8, 0x977C,\t0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, 0xE8DC, 0x978B,\n\t0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, 0xE8E0, 0x97A8,\t0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, 0xE8E4, 0x97B4,\n\t0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, 0xE8E8, 0x97CB,\t0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, 0xE8EC, 0x97F2,\n\t0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, 0xE8F0, 0x980F,\t0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, 0xE8F4, 0x9821,\n\t0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, 0xE8F8, 0x984F,\t0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, 0xE8FC, 0x9870,\n\t0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, 0xE943, 0x98AA,\t0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, 0xE947, 0x98C4,\n\t0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, 0xE94B, 0x98EB,\t0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, 0xE94F, 0x9914,\n\t0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, 0xE953, 0x991E,\t0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, 0xE957, 0x992E,\n\t0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, 0xE95B, 0x9949,\t0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, 0xE95F, 0x9951,\n\t0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, 0xE963, 0x9997,\t0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, 0xE967, 0x99AE,\n\t0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, 0xE96B, 0x99DD,\t0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, 0xE96F, 0x99EE,\n\t0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, 0xE973, 0x99F8,\t0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, 0xE977, 0x99E2,\n\t0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, 0xE97B, 0x9A45,\t0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, 0xE980, 0x9A3E,\n\t0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, 0xE984, 0x9A57,\t0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, 0xE988, 0x9A64,\n\t0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, 0xE98C, 0x9AAD,\t0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, 0xE990, 0x9ACF,\n\t0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, 0xE994, 0x9ADE,\t0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, 0xE998, 0x9AE6,\n\t0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, 0xE99C, 0x9AF4,\t0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, 0xE9A0, 0x9B06,\n\t0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, 0xE9A4, 0x9B22,\t0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, 0xE9A8, 0x9B28,\n\t0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, 0xE9AC, 0x9B2F,\t0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, 0xE9B0, 0x9B4F,\n\t0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, 0xE9B4, 0x9B58,\t0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, 0xE9B8, 0x9B91,\n\t0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, 0xE9BC, 0x9BA0,\t0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, 0xE9C0, 0x9BCA,\n\t0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, 0xE9C4, 0x9BD1,\t0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, 0xE9C8, 0x9BE4,\n\t0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, 0xE9CC, 0x9BF2,\t0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, 0xE9D0, 0x9C14,\n\t0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, 0xE9D4, 0x9C06,\t0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, 0xE9D8, 0x9C04,\n\t0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, 0xE9DC, 0x9C24,\t0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, 0xE9E0, 0x9C32,\n\t0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, 0xE9E4, 0x9C60,\t0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, 0xE9E8, 0x9CE7,\n\t0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, 0xE9EC, 0x9D08,\t0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, 0xE9F0, 0x9D2A,\n\t0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, 0xE9F4, 0x9D1F,\t0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, 0xE9F8, 0x9D41,\n\t0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, 0xE9FC, 0x9D48,\t0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, 0xEA43, 0x9D51,\n\t0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, 0xEA47, 0x9D89,\t0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, 0xEA4B, 0x9D7A,\n\t0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, 0xEA4F, 0x9DB2,\t0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, 0xEA53, 0x9DB8,\n\t0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, 0xEA57, 0x9DC2,\t0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, 0xEA5B, 0x9DE6,\n\t0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, 0xEA5F, 0x9E1A,\t0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, 0xEA63, 0x9E79,\n\t0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, 0xEA67, 0x9E8B,\t0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, 0xEA6B, 0x9E91,\n\t0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, 0xEA6F, 0x9EB8,\t0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, 0xEA73, 0x9ECC,\n\t0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, 0xEA77, 0x9ED4,\t0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, 0xEA7B, 0x9EE0,\n\t0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, 0xEA80, 0x9EF4,\t0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, 0xEA84, 0x9EFB,\n\t0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, 0xEA88, 0x9F08,\t0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, 0xEA8C, 0x9F2C,\n\t0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, 0xEA90, 0x9F54,\t0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, 0xEA94, 0x9F61,\n\t0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, 0xEA98, 0x9F6A,\t0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, 0xEA9C, 0x9F95,\n\t0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, 0xEAA0, 0x69C7,\t0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, 0xEAA4, 0x7199,\n\t0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, 0xFA43, 0x2173,\t0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, 0xFA47, 0x2177,\n\t0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, 0xFA56, 0xFF07,\t0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, 0xFA5E, 0x9348,\n\t0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, 0xFA62, 0x70BB,\t0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, 0xFA66, 0x66FB,\n\t0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, 0xFA6A, 0x4EFC,\t0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, 0xFA6E, 0x4F56,\n\t0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, 0xFA72, 0x4F94,\t0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, 0xFA76, 0x4FFF,\n\t0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, 0xFA7A, 0x5042,\t0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, 0xFA7E, 0x514A,\n\t0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, 0xFA83, 0x51EC,\t0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, 0xFA87, 0x52C0,\n\t0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, 0xFA8B, 0x5324,\t0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, 0xFA8F, 0x53DD,\n\t0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, 0xFA93, 0x54A9,\t0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, 0xFA97, 0x5765,\n\t0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, 0xFA9B, 0xFA0F,\t0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, 0xFA9F, 0x590B,\n\t0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, 0xFAA3, 0x5963,\t0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, 0xFAA7, 0x5BC0,\n\t0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, 0xFAAB, 0x5C1E,\t0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, 0xFAAF, 0x5D27,\n\t0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, 0xFAB3, 0x5D6D,\t0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, 0xFAB7, 0x5F21,\n\t0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, 0xFABB, 0x5FDE,\t0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, 0xFABF, 0x60DE,\n\t0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, 0xFAC3, 0x6111,\t0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, 0xFAC7, 0x6213,\n\t0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, 0xFACB, 0x649D,\t0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, 0xFACF, 0x6615,\n\t0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, 0xFAD3, 0x661E,\t0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, 0xFAD7, 0x6659,\n\t0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, 0xFADB, 0x66A0,\t0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, 0xFADF, 0x670E,\n\t0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, 0xFAE3, 0x6852,\t0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, 0xFAE7, 0x68CF,\n\t0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, 0xFAEB, 0x6998,\t0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, 0xFAEF, 0x6A46,\n\t0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, 0xFAF3, 0x6AE4,\t0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, 0xFAF7, 0x6C86,\n\t0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, 0xFAFB, 0x6D87,\t0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, 0xFB42, 0x6DCF,\n\t0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, 0xFB46, 0x6E39,\t0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, 0xFB4A, 0x6EBF,\n\t0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, 0xFB4E, 0x7005,\t0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, 0xFB52, 0x70AB,\n\t0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, 0xFB56, 0x7146,\t0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, 0xFB5A, 0x71FE,\n\t0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, 0xFB5E, 0xFA16,\t0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, 0xFB62, 0x73D6,\n\t0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, 0xFB66, 0x73F5,\t0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, 0xFB6A, 0x742E,\n\t0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, 0xFB6E, 0x7501,\t0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, 0xFB72, 0x769E,\n\t0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, 0xFB76, 0x7746,\t0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, 0xFB7A, 0x7864,\n\t0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, 0xFB7E, 0xFA19,\t0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, 0xFB83, 0x799B,\n\t0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, 0xFB87, 0x7AEB,\t0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, 0xFB8B, 0x7D5C,\n\t0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, 0xFB8F, 0x7E52,\t0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, 0xFB93, 0x8301,\n\t0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, 0xFB97, 0x83F6,\t0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, 0xFB9B, 0x8559,\n\t0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, 0xFB9F, 0xFA20,\t0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, 0xFBA3, 0x8A12,\n\t0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, 0xFBA7, 0x8ABE,\t0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, 0xFBAB, 0x8B53,\n\t0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, 0xFBAF, 0x8D12,\t0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, 0xFBB3, 0xFA24,\n\t0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, 0xFBB7, 0xFA26,\t0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, 0xFBBB, 0x91D7,\n\t0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, 0xFBBF, 0x91E4,\t0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, 0xFBC3, 0x920A,\n\t0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, 0xFBC7, 0x924E,\t0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, 0xFBCB, 0x9267,\n\t0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, 0xFBCF, 0x92E7,\t0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, 0xFBD3, 0xFA27,\n\t0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, 0xFBD7, 0x9325,\t0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, 0xFBDB, 0x931E,\n\t0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, 0xFBDF, 0x9370,\t0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, 0xFBE3, 0x93DE,\n\t0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, 0xFBE7, 0x9448,\t0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, 0xFBEB, 0x969D,\n\t0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, 0xFBEF, 0x9743,\t0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, 0xFBF3, 0x9755,\n\t0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, 0xFBF7, 0xFA2B,\t0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, 0xFBFB, 0x9A4E,\n\t0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, 0xFC42, 0x9B72,\t0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, 0xFC46, 0x9C00,\n\t0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, 0xFC4A, 0x9E19,\t0xFC4B, 0x9ED1, 0, 0\n};\n#endif\n\n#if FF_CODE_PAGE == 936 || FF_CODE_PAGE == 0\t/* Simplified Chinese */\nstatic const WCHAR uni2oem936[] = {\t/* Unicode --> GBK pairs */\n\t0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3,\t0x00B1, 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4,\n\t0x00E1, 0xA8A2, 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA,\t0x00EC, 0xA8AC, 0x00ED, 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE,\n\t0x00F7, 0xA1C2, 0x00F9, 0xA8B4, 0x00FA, 0xA8B2, 0x00FC, 0xA8B9,\t0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, 0xA8A7, 0x012B, 0xA8A9,\n\t0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, 0x016B, 0xA8B1,\t0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, 0xA8B3,\n\t0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8,\t0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5,\n\t0x02CA, 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1,\t0x0392, 0xA6A2, 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5,\n\t0x0396, 0xA6A6, 0x0397, 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9,\t0x039A, 0xA6AA, 0x039B, 0xA6AB, 0x039C, 0xA6AC, 0x039D, 0xA6AD,\n\t0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, 0xA6B0, 0x03A1, 0xA6B1,\t0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, 0x03A6, 0xA6B5,\n\t0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, 0xA6C1,\t0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5,\n\t0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9,\t0x03BA, 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD,\n\t0x03BE, 0xA6CE, 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1,\t0x03C3, 0xA6D2, 0x03C4, 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5,\n\t0x03C7, 0xA6D6, 0x03C8, 0xA6D7, 0x03C9, 0xA6D8, 0x0401, 0xA7A7,\t0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, 0xA7A3, 0x0413, 0xA7A4,\n\t0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, 0x0417, 0xA7A9,\t0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, 0xA7AD,\n\t0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1,\t0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5,\n\t0x0424, 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9,\t0x0428, 0xA7BA, 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD,\n\t0x042C, 0xA7BE, 0x042D, 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1,\t0x0430, 0xA7D1, 0x0431, 0xA7D2, 0x0432, 0xA7D3, 0x0433, 0xA7D4,\n\t0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, 0xA7D8, 0x0437, 0xA7D9,\t0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, 0x043B, 0xA7DD,\n\t0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, 0xA7E1,\t0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5,\n\t0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9,\t0x0448, 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED,\n\t0x044C, 0xA7EE, 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1,\t0x0451, 0xA7D7, 0x2010, 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA,\n\t0x2015, 0xA844, 0x2016, 0xA1AC, 0x2018, 0xA1AE, 0x2019, 0xA1AF,\t0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, 0xA845, 0x2026, 0xA1AD,\n\t0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, 0x2035, 0xA846,\t0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, 0xA847,\n\t0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1,\t0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5,\n\t0x2165, 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9,\t0x2169, 0xA2FA, 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1,\n\t0x2171, 0xA2A2, 0x2172, 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5,\t0x2175, 0xA2A6, 0x2176, 0xA2A7, 0x2177, 0xA2A8, 0x2178, 0xA2A9,\n\t0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, 0xA1FC, 0x2192, 0xA1FA,\t0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, 0x2198, 0xA84B,\n\t0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, 0xA1C6,\t0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE,\n\t0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE,\t0x2227, 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8,\n\t0x222B, 0xA1D2, 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF,\t0x2236, 0xA1C3, 0x2237, 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6,\n\t0x224C, 0xA1D5, 0x2252, 0xA850, 0x2260, 0xA1D9, 0x2261, 0xA1D4,\t0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, 0xA851, 0x2267, 0xA852,\n\t0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, 0x2299, 0xA1D1,\t0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, 0xA2D9,\n\t0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD,\t0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1,\n\t0x2469, 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7,\t0x2477, 0xA2C8, 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB,\n\t0x247B, 0xA2CC, 0x247C, 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF,\t0x247F, 0xA2D0, 0x2480, 0xA2D1, 0x2481, 0xA2D2, 0x2482, 0xA2D3,\n\t0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, 0xA2D6, 0x2486, 0xA2D7,\t0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, 0x248A, 0xA2B3,\n\t0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, 0xA2B7,\t0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB,\n\t0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF,\t0x2497, 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3,\n\t0x249B, 0xA2C4, 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6,\t0x2503, 0xA9A7, 0x2504, 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA,\n\t0x2507, 0xA9AB, 0x2508, 0xA9AC, 0x2509, 0xA9AD, 0x250A, 0xA9AE,\t0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, 0xA9B1, 0x250E, 0xA9B2,\n\t0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, 0x2512, 0xA9B6,\t0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, 0xA9BA,\n\t0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE,\t0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2,\n\t0x251F, 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6,\t0x2523, 0xA9C7, 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA,\n\t0x2527, 0xA9CB, 0x2528, 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE,\t0x252B, 0xA9CF, 0x252C, 0xA9D0, 0x252D, 0xA9D1, 0x252E, 0xA9D2,\n\t0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, 0xA9D5, 0x2532, 0xA9D6,\t0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, 0x2536, 0xA9DA,\n\t0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, 0xA9DE,\t0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2,\n\t0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6,\t0x2543, 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA,\n\t0x2547, 0xA9EB, 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE,\t0x254B, 0xA9EF, 0x2550, 0xA854, 0x2551, 0xA855, 0x2552, 0xA856,\n\t0x2553, 0xA857, 0x2554, 0xA858, 0x2555, 0xA859, 0x2556, 0xA85A,\t0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, 0xA85D, 0x255A, 0xA85E,\n\t0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, 0x255E, 0xA862,\t0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, 0xA866,\n\t0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A,\t0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E,\n\t0x256B, 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872,\t0x256F, 0xA873, 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876,\n\t0x2573, 0xA877, 0x2581, 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A,\t0x2584, 0xA87B, 0x2585, 0xA87C, 0x2586, 0xA87D, 0x2587, 0xA87E,\n\t0x2588, 0xA880, 0x2589, 0xA881, 0x258A, 0xA882, 0x258B, 0xA883,\t0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, 0x258F, 0xA887,\n\t0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, 0xA1F6,\t0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B,\n\t0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0,\t0x25CE, 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E,\n\t0x25E4, 0xA88F, 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE,\t0x2609, 0xA891, 0x2640, 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1,\n\t0x3001, 0xA1A2, 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3005, 0xA1A9,\t0x3006, 0xA965, 0x3007, 0xA996, 0x3008, 0xA1B4, 0x3009, 0xA1B5,\n\t0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9,\t0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, 0xA1BF,\n\t0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3,\t0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895,\n\t0x3021, 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943,\t0x3025, 0xA944, 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947,\n\t0x3029, 0xA948, 0x3041, 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3,\t0x3044, 0xA4A4, 0x3045, 0xA4A5, 0x3046, 0xA4A6, 0x3047, 0xA4A7,\n\t0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, 0xA4AA, 0x304B, 0xA4AB,\t0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, 0x304F, 0xA4AF,\n\t0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, 0xA4B3,\t0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7,\n\t0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB,\t0x305C, 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF,\n\t0x3060, 0xA4C0, 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3,\t0x3064, 0xA4C4, 0x3065, 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7,\n\t0x3068, 0xA4C8, 0x3069, 0xA4C9, 0x306A, 0xA4CA, 0x306B, 0xA4CB,\t0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, 0xA4CE, 0x306F, 0xA4CF,\n\t0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, 0x3073, 0xA4D3,\t0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, 0xA4D7,\n\t0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB,\t0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF,\n\t0x3080, 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3,\t0x3084, 0xA4E4, 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7,\n\t0x3088, 0xA4E8, 0x3089, 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB,\t0x308C, 0xA4EC, 0x308D, 0xA4ED, 0x308E, 0xA4EE, 0x308F, 0xA4EF,\n\t0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, 0xA4F2, 0x3093, 0xA4F3,\t0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, 0x309E, 0xA967,\n\t0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, 0xA5A4,\t0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8,\n\t0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC,\t0x30AD, 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0,\n\t0x30B1, 0xA5B1, 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4,\t0x30B5, 0xA5B5, 0x30B6, 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8,\n\t0x30B9, 0xA5B9, 0x30BA, 0xA5BA, 0x30BB, 0xA5BB, 0x30BC, 0xA5BC,\t0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, 0xA5BF, 0x30C0, 0xA5C0,\n\t0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, 0x30C4, 0xA5C4,\t0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, 0xA5C8,\n\t0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC,\t0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0,\n\t0x30D1, 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4,\t0x30D5, 0xA5D5, 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8,\n\t0x30D9, 0xA5D9, 0x30DA, 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC,\t0x30DD, 0xA5DD, 0x30DE, 0xA5DE, 0x30DF, 0xA5DF, 0x30E0, 0xA5E0,\n\t0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, 0xA5E3, 0x30E4, 0xA5E4,\t0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, 0x30E8, 0xA5E8,\n\t0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, 0xA5EC,\t0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0,\n\t0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4,\t0x30F5, 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963,\n\t0x30FE, 0xA964, 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7,\t0x3108, 0xA8C8, 0x3109, 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB,\n\t0x310C, 0xA8CC, 0x310D, 0xA8CD, 0x310E, 0xA8CE, 0x310F, 0xA8CF,\t0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, 0xA8D2, 0x3113, 0xA8D3,\n\t0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, 0x3117, 0xA8D7,\t0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, 0xA8DB,\n\t0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF,\t0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3,\n\t0x3124, 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7,\t0x3128, 0xA8E8, 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6,\n\t0x3222, 0xA2E7, 0x3223, 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA,\t0x3226, 0xA2EB, 0x3227, 0xA2EC, 0x3228, 0xA2ED, 0x3229, 0xA2EE,\n\t0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, 0xA94A, 0x338F, 0xA94B,\t0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, 0x33A1, 0xA94F,\n\t0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, 0xA953,\t0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140,\n\t0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143,\t0x4E07, 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF,\n\t0x4E0B, 0xCFC2, 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB,\t0x4E0F, 0x8144, 0x4E10, 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145,\n\t0x4E13, 0xD7A8, 0x4E14, 0xC7D2, 0x4E15, 0xD8A7, 0x4E16, 0xCAC0,\t0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, 0xB1FB, 0x4E1A, 0xD2B5,\n\t0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, 0x4E1E, 0xD8A9,\t0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, 0xB6AA,\n\t0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B,\t0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6,\n\t0x4E2B, 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D,\t0x4E2F, 0x814E, 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE,\n\t0x4E33, 0x8150, 0x4E34, 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC,\t0x4E37, 0x8152, 0x4E38, 0xCDE8, 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA,\n\t0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, 0xC0F6, 0x4E3E, 0xBED9,\t0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, 0x4E42, 0x8156,\n\t0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, 0x8158,\t0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159,\n\t0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5,\t0x4E4F, 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9,\n\t0x4E53, 0xC5D2, 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4,\t0x4E57, 0x815C, 0x4E58, 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D,\n\t0x4E5B, 0x815E, 0x4E5C, 0xD8BF, 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2,\t0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, 0xCFE7, 0x4E62, 0x815F,\n\t0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, 0x4E66, 0xCAE9,\t0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, 0x8165,\n\t0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169,\t0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B,\n\t0x4E73, 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E,\t0x4E77, 0x816F, 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172,\n\t0x4E7B, 0x8173, 0x4E7C, 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC,\t0x4E7F, 0x8176, 0x4E80, 0x8177, 0x4E81, 0x8178, 0x4E82, 0x8179,\n\t0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, 0x817C, 0x4E86, 0xC1CB,\t0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, 0x4E8A, 0x817E,\n\t0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, 0xD3DA,\t0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5,\n\t0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181,\t0x4E97, 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7,\n\t0x4E9B, 0xD0A9, 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186,\t0x4E9F, 0xD8BD, 0x4EA0, 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA,\n\t0x4EA3, 0x8187, 0x4EA4, 0xBDBB, 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0,\t0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, 0xC4B6, 0x4EAA, 0x8188,\n\t0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, 0x4EAE, 0xC1C1,\t0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, 0xC7D7,\n\t0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D,\t0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB,\n\t0x4EBB, 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193,\t0x4EBF, 0xD2DA, 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC,\n\t0x4EC3, 0xD8EA, 0x4EC4, 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD,\t0x4EC7, 0xB3F0, 0x4EC8, 0x8194, 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1,\n\t0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, 0xC8D4, 0x4ECE, 0xB4D3,\t0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, 0x4ED2, 0x8198,\n\t0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, 0xCBFB,\t0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199,\n\t0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0,\t0x4EDF, 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D,\n\t0x4EE3, 0xB4FA, 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E,\t0x4EE7, 0x819F, 0x4EE8, 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7,\n\t0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, 0x4EED, 0x81A1, 0x4EEE, 0x81A2,\t0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, 0x81A4, 0x4EF2, 0xD6D9,\n\t0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, 0x4EF6, 0xBCFE,\t0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, 0x81A8,\n\t0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA,\t0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC,\n\t0x4F03, 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0,\t0x4F07, 0x81B1, 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1,\n\t0x4F0B, 0x81B3, 0x4F0C, 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF,\t0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, 0x4F11, 0xD0DD, 0x4F12, 0x81B5,\n\t0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, 0x81B8, 0x4F16, 0x81B9,\t0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, 0x4F1A, 0xBBE1,\n\t0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, 0xC9A1,\t0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3,\n\t0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7,\t0x4F27, 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1,\n\t0x4F2B, 0xD8F9, 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2,\t0x4F2F, 0xB2AE, 0x4F30, 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3,\n\t0x4F33, 0x81C4, 0x4F34, 0xB0E9, 0x4F35, 0x81C5, 0x4F36, 0xC1E6,\t0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, 0x81C7, 0x4F3A, 0xCBC5,\n\t0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, 0x4F3E, 0x81C9,\t0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, 0x81CD,\n\t0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB,\t0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3,\n\t0x4F4B, 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD,\t0x4F4F, 0xD7A1, 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6,\n\t0x4F53, 0xCCE5, 0x4F54, 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8,\t0x4F57, 0xD9A2, 0x4F58, 0xD9DC, 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD,\n\t0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, 0xD8FE, 0x4F5E, 0xD8FA,\t0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, 0x4F62, 0x81DA,\n\t0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, 0x81DB,\t0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD,\n\t0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0,\t0x4F6F, 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2,\n\t0x4F73, 0xBCD1, 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5,\t0x4F77, 0x81E4, 0x4F78, 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7,\n\t0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB,\t0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, 0x81EA, 0x4F82, 0x81EB,\n\t0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, 0x4F86, 0x81ED,\t0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, 0x81EF,\n\t0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1,\t0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3,\n\t0x4F93, 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6,\t0x4F97, 0xB6B1, 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9,\n\t0x4F9B, 0xB9A9, 0x4F9C, 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB,\t0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, 0x4FA1, 0x81FD, 0x4FA2, 0x81FE,\n\t0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, 0xBDC4, 0x4FA6, 0xD5EC,\t0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, 0x4FAA, 0xD9AD,\n\t0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, 0xCEEA,\t0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245,\n\t0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248,\t0x4FB7, 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C,\n\t0x4FBB, 0x824D, 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250,\t0x4FBF, 0xB1E3, 0x4FC0, 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253,\n\t0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, 0x4FC5, 0xD9B4, 0x4FC6, 0x8254,\t0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, 0x8257, 0x4FCA, 0xBFA1,\n\t0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, 0x4FCE, 0xD9DE,\t0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, 0x825B,\n\t0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F,\t0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5,\n\t0x4FDB, 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1,\t0x4FDF, 0xD9B9, 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263,\n\t0x4FE3, 0xD9B6, 0x4FE4, 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1,\t0x4FE7, 0x8266, 0x4FE8, 0xD9B2, 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3,\n\t0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, 0xBCF3, 0x4FEE, 0xD0DE,\t0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, 0x4FF2, 0x826A,\n\t0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, 0x826D,\t0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3,\n\t0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2,\t0x4FFF, 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276,\n\t0x5003, 0x8277, 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A,\t0x5007, 0x827B, 0x5008, 0x827C, 0x5009, 0x827D, 0x500A, 0x827E,\n\t0x500B, 0x8280, 0x500C, 0xD9C4, 0x500D, 0xB1B6, 0x500E, 0x8281,\t0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, 0x8283, 0x5012, 0xB5B9,\n\t0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, 0x5016, 0x8286,\t0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, 0xD2D0,\n\t0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A,\t0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C,\n\t0x5023, 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB,\t0x5027, 0x828F, 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF,\n\t0x502B, 0x8290, 0x502C, 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0,\t0x502F, 0x8291, 0x5030, 0x8292, 0x5031, 0x8293, 0x5032, 0x8294,\n\t0x5033, 0x8295, 0x5034, 0x8296, 0x5035, 0x8297, 0x5036, 0x8298,\t0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, 0x503A, 0xD5AE,\n\t0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, 0xC7E3,\t0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1,\n\t0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4,\t0x5047, 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6,\n\t0x504B, 0x82A7, 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB,\t0x504F, 0xC6AB, 0x5050, 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB,\n\t0x5053, 0x82AC, 0x5054, 0x82AD, 0x5055, 0xD9C9, 0x5056, 0x82AE,\t0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, 0x82B1, 0x505A, 0xD7F6,\n\t0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, 0x505E, 0x82B4,\t0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, 0x82B8,\n\t0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB,\t0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF,\n\t0x506B, 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2,\t0x506F, 0x82C3, 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6,\n\t0x5073, 0x82C7, 0x5074, 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC,\t0x5077, 0xCDB5, 0x5078, 0x82CA, 0x5079, 0x82CB, 0x507A, 0x82CC,\n\t0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, 0x82CE, 0x507E, 0xD9C7,\t0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, 0x5082, 0x82D0,\n\t0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, 0x82D3,\t0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6,\n\t0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9,\t0x508F, 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD,\n\t0x5093, 0x82DE, 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1,\t0x5097, 0x82E2, 0x5098, 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5,\n\t0x509B, 0x82E6, 0x509C, 0x82E7, 0x509D, 0x82E8, 0x509E, 0x82E9,\t0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, 0x82EC, 0x50A2, 0x82ED,\n\t0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, 0x50A6, 0x82EF,\t0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, 0x82F0,\n\t0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3,\t0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1,\n\t0x50B3, 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA,\t0x50B7, 0x82FB, 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1,\n\t0x50BB, 0xC9B5, 0x50BC, 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341,\t0x50BF, 0x8342, 0x50C0, 0x8343, 0x50C1, 0x8344, 0x50C2, 0x8345,\n\t0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, 0x8348, 0x50C6, 0x8349,\t0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, 0x50CA, 0x834D,\n\t0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, 0x8351,\t0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354,\n\t0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2,\t0x50D7, 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5,\n\t0x50DB, 0x835B, 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E,\t0x50DF, 0x835F, 0x50E0, 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362,\n\t0x50E3, 0x8363, 0x50E4, 0x8364, 0x50E5, 0x8365, 0x50E6, 0xD9D6,\t0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, 0x8367, 0x50EA, 0x8368,\n\t0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, 0x50EE, 0xD9D7,\t0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, 0x836D,\n\t0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F,\t0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373,\n\t0x50FB, 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376,\t0x50FF, 0x8377, 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A,\n\t0x5103, 0x837B, 0x5104, 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3,\t0x5107, 0xD9D8, 0x5108, 0x837E, 0x5109, 0x8380, 0x510A, 0x8381,\n\t0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, 0x8383, 0x510E, 0x8384,\t0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, 0x5112, 0xC8E5,\n\t0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, 0x838B,\t0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F,\n\t0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393,\t0x511F, 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396,\n\t0x5123, 0x8397, 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A,\t0x5127, 0x839B, 0x5128, 0x839C, 0x5129, 0x839D, 0x512A, 0x839E,\n\t0x512B, 0x839F, 0x512C, 0x83A0, 0x512D, 0x83A1, 0x512E, 0x83A2,\t0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, 0x83A5, 0x5132, 0x83A6,\n\t0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, 0x5136, 0x83AA,\t0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, 0x83AE,\n\t0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2,\t0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3,\n\t0x5143, 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7,\t0x5147, 0x83B4, 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5,\n\t0x514B, 0xBFCB, 0x514C, 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7,\t0x514F, 0x83B8, 0x5150, 0x83B9, 0x5151, 0xB6D2, 0x5152, 0x83BA,\n\t0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, 0xD9EE, 0x5156, 0xD9F0,\t0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, 0x515A, 0xB5B3,\n\t0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, 0x83C1,\t0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4,\n\t0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7,\t0x5167, 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA,\n\t0x516B, 0xB0CB, 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2,\t0x516F, 0x83CB, 0x5170, 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC,\n\t0x5173, 0xB9D8, 0x5174, 0xD0CB, 0x5175, 0xB1F8, 0x5176, 0xC6E4,\t0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, 0xD7C8, 0x517A, 0x83CD,\n\t0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, 0x517E, 0x83CE,\t0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, 0xD8E7,\n\t0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2,\t0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4,\n\t0x518B, 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6,\t0x518F, 0x83D7, 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0,\n\t0x5193, 0x83DA, 0x5194, 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2,\t0x5197, 0xC8DF, 0x5198, 0x83DC, 0x5199, 0xD0B4, 0x519A, 0x83DD,\n\t0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, 0x83DE, 0x519E, 0x83DF,\t0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, 0x51A2, 0xDAA3,\n\t0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, 0x83E3,\t0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7,\n\t0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9,\t0x51AF, 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5,\n\t0x51B3, 0xBEF6, 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1,\t0x51B7, 0xC0E4, 0x51B8, 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED,\n\t0x51BB, 0xB6B3, 0x51BC, 0xD9FE, 0x51BD, 0xD9FD, 0x51BE, 0x83EE,\t0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, 0x83F0, 0x51C2, 0x83F1,\n\t0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, 0x51C6, 0xD7BC,\t0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, 0x83F5,\n\t0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7,\t0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9,\n\t0x51D3, 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD,\t0x51D7, 0x83FE, 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442,\n\t0x51DB, 0xC1DD, 0x51DC, 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444,\t0x51DF, 0x8445, 0x51E0, 0xBCB8, 0x51E1, 0xB7B2, 0x51E2, 0x8446,\n\t0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, 0x8448, 0x51E6, 0x8449,\t0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, 0x51EA, 0x844D,\n\t0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, 0x844F,\t0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451,\n\t0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7,\t0x51F7, 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6,\n\t0x51FB, 0xBBF7, 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454,\t0x51FF, 0xD4E4, 0x5200, 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6,\n\t0x5203, 0xC8D0, 0x5204, 0x8455, 0x5205, 0x8456, 0x5206, 0xB7D6,\t0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, 0x8457, 0x520A, 0xBFAF,\n\t0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, 0x520E, 0xD8D8,\t0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, 0xBBAE,\n\t0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE,\t0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5,\n\t0x521B, 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460,\t0x521F, 0x8461, 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463,\n\t0x5223, 0x8464, 0x5224, 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466,\t0x5227, 0x8467, 0x5228, 0xC5D9, 0x5229, 0xC0FB, 0x522A, 0x8468,\n\t0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, 0xD8D9, 0x522E, 0xB9CE,\t0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, 0x5232, 0x846C,\n\t0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, 0xD6C6,\t0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC,\n\t0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470,\t0x523F, 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1,\n\t0x5243, 0xCCEA, 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473,\t0x5247, 0x8474, 0x5248, 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7,\n\t0x524B, 0x8477, 0x524C, 0xD8DD, 0x524D, 0xC7B0, 0x524E, 0x8478,\t0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, 0xBDA3, 0x5252, 0x847A,\n\t0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, 0x5256, 0xC6CA,\t0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, 0x8481,\n\t0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE,\t0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486,\n\t0x5263, 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489,\t0x5267, 0xBEE7, 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4,\n\t0x526B, 0x848B, 0x526C, 0x848C, 0x526D, 0x848D, 0x526E, 0x848E,\t0x526F, 0xB8B1, 0x5270, 0x848F, 0x5271, 0x8490, 0x5272, 0xB8EE,\n\t0x5273, 0x8491, 0x5274, 0x8492, 0x5275, 0x8493, 0x5276, 0x8494,\t0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, 0x527A, 0x8498,\n\t0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, 0x849B,\t0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3,\n\t0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0,\t0x5287, 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3,\n\t0x528B, 0x84A4, 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7,\t0x528F, 0x84A8, 0x5290, 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA,\n\t0x5293, 0xD8E6, 0x5294, 0x84AB, 0x5295, 0x84AC, 0x5296, 0x84AD,\t0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, 0x84B0, 0x529A, 0x84B1,\n\t0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, 0x529E, 0xB0EC,\t0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, 0xDBBD,\n\t0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5,\t0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC,\n\t0x52AB, 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7,\t0x52AF, 0x84B8, 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2,\n\t0x52B3, 0xC0CD, 0x52B4, 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC,\t0x52B7, 0x84BD, 0x52B8, 0x84BE, 0x52B9, 0x84BF, 0x52BA, 0x84C0,\n\t0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, 0x84C3, 0x52BE, 0xDBC0,\t0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, 0x52C2, 0x84C6,\n\t0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, 0x84C9,\t0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB,\n\t0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE,\t0x52CF, 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5,\n\t0x52D3, 0x84D1, 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3,\t0x52D7, 0x84D4, 0x52D8, 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6,\n\t0x52DB, 0x84D7, 0x52DC, 0x84D8, 0x52DD, 0x84D9, 0x52DE, 0x84DA,\t0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, 0x84DC, 0x52E2, 0x84DD,\n\t0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, 0x52E6, 0x84E0,\t0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, 0x84E4,\n\t0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8,\t0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB,\n\t0x52F3, 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF,\t0x52F7, 0x84F0, 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7,\n\t0x52FB, 0x84F2, 0x52FC, 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4,\t0x52FF, 0xCEF0, 0x5300, 0xD4C8, 0x5301, 0x84F5, 0x5302, 0x84F6,\n\t0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, 0xB0FC, 0x5306, 0xB4D2,\t0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, 0x530A, 0x84FB,\n\t0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, 0x84FE,\t0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541,\n\t0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF,\t0x5317, 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE,\n\t0x531B, 0x8545, 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547,\t0x531F, 0x8548, 0x5320, 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549,\n\t0x5323, 0xCFBB, 0x5324, 0x854A, 0x5325, 0x854B, 0x5326, 0xD8D0,\t0x5327, 0x854C, 0x5328, 0x854D, 0x5329, 0x854E, 0x532A, 0xB7CB,\n\t0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, 0x532E, 0xD8D1,\t0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, 0x8555,\n\t0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559,\t0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8,\n\t0x533B, 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2,\t0x533F, 0xC4E4, 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F,\n\t0x5343, 0xC7A7, 0x5344, 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561,\t0x5347, 0xC9FD, 0x5348, 0xCEE7, 0x5349, 0xBBDC, 0x534A, 0xB0EB,\n\t0x534B, 0x8562, 0x534C, 0x8563, 0x534D, 0x8564, 0x534E, 0xBBAA,\t0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, 0x5352, 0xD7E4,\n\t0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, 0xC2F4,\t0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9,\n\t0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5,\t0x535F, 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC,\n\t0x5363, 0xD8D5, 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4,\t0x5367, 0xCED4, 0x5368, 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D,\n\t0x536B, 0xCEC0, 0x536C, 0x856E, 0x536D, 0x856F, 0x536E, 0xD8B4,\t0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, 0xCEA3, 0x5372, 0x8570,\n\t0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, 0x5376, 0x8571,\t0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, 0xDAE1,\n\t0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576,\t0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7,\n\t0x5383, 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA,\t0x5387, 0x857A, 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C,\n\t0x538B, 0xD1B9, 0x538C, 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D,\t0x538F, 0x857E, 0x5390, 0x8580, 0x5391, 0x8581, 0x5392, 0x8582,\n\t0x5393, 0x8583, 0x5394, 0x8584, 0x5395, 0xB2DE, 0x5396, 0x8585,\t0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, 0x539A, 0xBAF1,\n\t0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, 0x858A,\t0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1,\n\t0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3,\t0x53A7, 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F,\n\t0x53AB, 0x8590, 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB,\t0x53AF, 0x8593, 0x53B0, 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596,\n\t0x53B3, 0x8597, 0x53B4, 0x8598, 0x53B5, 0x8599, 0x53B6, 0xDBCC,\t0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, 0x859C, 0x53BA, 0x859D,\n\t0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, 0x53BE, 0x85A0,\t0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, 0xB2CE,\n\t0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5,\t0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0,\n\t0x53CB, 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7,\t0x53CF, 0x85A8, 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA,\n\t0x53D3, 0x85AB, 0x53D4, 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1,\t0x53D7, 0xCADC, 0x53D8, 0xB1E4, 0x53D9, 0xD0F0, 0x53DA, 0x85AD,\n\t0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, 0x85AF, 0x53DE, 0x85B0,\t0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, 0x53E2, 0x85B2,\n\t0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, 0xC1ED,\t0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB,\n\t0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3,\t0x53EF, 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7,\n\t0x53F3, 0xD3D2, 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6,\t0x53F7, 0xBAC5, 0x53F8, 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5,\n\t0x53FB, 0xDFB7, 0x53FC, 0xB5F0, 0x53FD, 0xDFB4, 0x53FE, 0x85B6,\t0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, 0xD3F5, 0x5402, 0x85B9,\n\t0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, 0x5406, 0xDFBA,\t0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, 0xB5F5,\n\t0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3,\t0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8,\n\t0x5413, 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9,\t0x5417, 0xC2F0, 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0,\n\t0x541B, 0xBEFD, 0x541C, 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC,\t0x541F, 0xD2F7, 0x5420, 0xB7CD, 0x5421, 0xDFC1, 0x5422, 0x85C2,\n\t0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, 0x85C4, 0x5426, 0xB7F1,\t0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, 0x542A, 0x85C5,\n\t0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, 0xCBB1,\t0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5,\n\t0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8,\t0x5437, 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA,\n\t0x543B, 0xCEC7, 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1,\t0x543F, 0x85CC, 0x5440, 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE,\n\t0x5443, 0xDFC0, 0x5444, 0x85CF, 0x5445, 0x85D0, 0x5446, 0xB4F4,\t0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, 0x85D2, 0x544A, 0xB8E6,\n\t0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, 0x544E, 0x85D5,\t0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, 0xDFBC,\n\t0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF,\t0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8,\n\t0x545B, 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA,\t0x545F, 0x85DB, 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8,\n\t0x5463, 0x85DE, 0x5464, 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF,\t0x5467, 0x85E0, 0x5468, 0xD6DC, 0x5469, 0x85E1, 0x546A, 0x85E2,\n\t0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, 0x85E5, 0x546E, 0x85E6,\t0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, 0x5472, 0xDFDA,\n\t0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, 0xDFCE,\t0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB,\n\t0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC,\t0x547F, 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6,\n\t0x5483, 0x85EF, 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8,\t0x5487, 0x85F1, 0x5488, 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4,\n\t0x548B, 0xD5A6, 0x548C, 0xBACD, 0x548D, 0x85F5, 0x548E, 0xBECC,\t0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, 0x85F6, 0x5492, 0xD6E4,\n\t0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, 0x5496, 0xBFA7,\t0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, 0xDFCB,\n\t0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB,\t0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640,\n\t0x54A3, 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7,\t0x54A7, 0xDFD6, 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4,\n\t0x54AB, 0xE5EB, 0x54AC, 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642,\t0x54AF, 0xBFA9, 0x54B0, 0x8643, 0x54B1, 0xD4DB, 0x54B2, 0x8644,\n\t0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, 0x8645, 0x54B6, 0x8646,\t0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, 0x54BA, 0x8649,\n\t0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, 0x864B,\t0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3,\n\t0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF,\t0x54C7, 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E,\n\t0x54CB, 0x864F, 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5,\t0x54CF, 0xDFE7, 0x54D0, 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5,\n\t0x54D3, 0xDFD8, 0x54D4, 0xDFD9, 0x54D5, 0xDFDC, 0x54D6, 0x8650,\t0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, 0xDFE0, 0x54DA, 0xDFE1,\n\t0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, 0x54DE, 0xDFE8,\t0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, 0x8655,\n\t0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6,\t0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4,\n\t0x54EB, 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8,\t0x54EF, 0x865A, 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC,\n\t0x54F3, 0xDFEE, 0x54F4, 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F,\t0x54F7, 0x8660, 0x54F8, 0x8661, 0x54F9, 0x8662, 0x54FA, 0xB2B8,\n\t0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, 0xDFEC, 0x54FE, 0x8664,\t0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, 0x5502, 0x8666,\n\t0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, 0xCBF4,\t0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B,\n\t0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F,\t0x550F, 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670,\n\t0x5513, 0x8671, 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673,\t0x5517, 0x8674, 0x5518, 0x8675, 0x5519, 0x8676, 0x551A, 0x8677,\n\t0x551B, 0xDFE9, 0x551C, 0x8678, 0x551D, 0x8679, 0x551E, 0x867A,\t0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, 0x867C, 0x5522, 0xDFEF,\n\t0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, 0x5526, 0x867E,\t0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, 0xDFF4,\n\t0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB,\t0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684,\n\t0x5533, 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687,\t0x5537, 0xE0A1, 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A,\n\t0x553B, 0x868B, 0x553C, 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9,\t0x553F, 0xDFFC, 0x5540, 0x868D, 0x5541, 0xDFFA, 0x5542, 0x868E,\n\t0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, 0x868F, 0x5546, 0xC9CC,\t0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, 0x554A, 0xB0A1,\n\t0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, 0x8695,\t0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698,\n\t0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2,\t0x5557, 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E,\n\t0x555B, 0x869F, 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1,\t0x555F, 0x86A2, 0x5560, 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4,\n\t0x5563, 0x86A5, 0x5564, 0xC6A1, 0x5565, 0xC9B6, 0x5566, 0xC0B2,\t0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, 0x86A7, 0x556A, 0xC5BE,\n\t0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, 0x556E, 0xC4F6,\t0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, 0x86AC,\n\t0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4,\t0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0,\n\t0x557B, 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1,\t0x557F, 0x86B2, 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9,\n\t0x5583, 0xE0AB, 0x5584, 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4,\t0x5587, 0xC0AE, 0x5588, 0xE0AE, 0x5589, 0xBAED, 0x558A, 0xBAB0,\n\t0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, 0x86B6, 0x558E, 0x86B7,\t0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, 0x5592, 0x86B9,\n\t0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, 0x86BC,\t0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE,\n\t0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0,\t0x559F, 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3,\n\t0x55A3, 0x86C4, 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7,\t0x55A7, 0xD0FA, 0x55A8, 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA,\n\t0x55AB, 0x86CB, 0x55AC, 0x86CC, 0x55AD, 0x86CD, 0x55AE, 0x86CE,\t0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, 0xE0AC, 0x55B2, 0x86D1,\n\t0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, 0x55B6, 0x86D3,\t0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, 0x86D5,\n\t0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7,\t0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA,\n\t0x55C3, 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC,\t0x55C7, 0x86DD, 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF,\n\t0x55CB, 0x86E0, 0x55CC, 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1,\t0x55CF, 0x86E2, 0x55D0, 0x86E3, 0x55D1, 0xE0BE, 0x55D2, 0xE0AA,\n\t0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, 0x86E4, 0x55D6, 0xE0B2,\t0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, 0x55DA, 0x86E8,\n\t0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, 0x86EA,\t0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC,\n\t0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2,\t0x55E7, 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA,\n\t0x55EB, 0xE0BF, 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0,\t0x55EF, 0xE0C5, 0x55F0, 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7,\n\t0x55F3, 0xE0C8, 0x55F4, 0x86F3, 0x55F5, 0xE0CC, 0x55F6, 0x86F4,\t0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, 0x86F6, 0x55FA, 0x86F7,\n\t0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, 0x55FE, 0xE0D5,\t0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, 0x86FB,\n\t0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740,\t0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742,\n\t0x560B, 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2,\t0x560F, 0xD8C5, 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747,\n\t0x5613, 0x8748, 0x5614, 0x8749, 0x5615, 0x874A, 0x5616, 0x874B,\t0x5617, 0x874C, 0x5618, 0xD0EA, 0x5619, 0x874D, 0x561A, 0x874E,\n\t0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, 0x8750, 0x561E, 0xE0CF,\t0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, 0x5622, 0x8753,\n\t0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, 0x8755,\t0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758,\n\t0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A,\t0x562F, 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0,\n\t0x5633, 0x875D, 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB,\t0x5637, 0x875F, 0x5638, 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761,\n\t0x563B, 0xCEFB, 0x563C, 0x8762, 0x563D, 0x8763, 0x563E, 0x8764,\t0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, 0x8766, 0x5642, 0x8767,\n\t0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, 0x5646, 0x876B,\t0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, 0x876F,\n\t0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD,\t0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774,\n\t0x5653, 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777,\t0x5657, 0xE0DB, 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778,\n\t0x565B, 0x8779, 0x565C, 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B,\t0x565F, 0x877C, 0x5660, 0x877D, 0x5661, 0x877E, 0x5662, 0xE0DE,\n\t0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, 0x8781, 0x5666, 0x8782,\t0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, 0x566A, 0xD4EB,\n\t0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, 0x8785,\t0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788,\n\t0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1,\t0x5677, 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F,\n\t0x567B, 0xE0E7, 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791,\t0x567F, 0x8792, 0x5680, 0x8793, 0x5681, 0x8794, 0x5682, 0x8795,\n\t0x5683, 0x8796, 0x5684, 0x8797, 0x5685, 0xE0E9, 0x5686, 0xE0E3,\t0x5687, 0x8798, 0x5688, 0x8799, 0x5689, 0x879A, 0x568A, 0x879B,\n\t0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, 0x568E, 0xBABF,\t0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, 0x87A1,\n\t0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4,\t0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8,\n\t0x569B, 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC,\t0x569F, 0x87AD, 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0,\n\t0x56A3, 0xCFF9, 0x56A4, 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3,\t0x56A7, 0x87B4, 0x56A8, 0x87B5, 0x56A9, 0x87B6, 0x56AA, 0x87B7,\n\t0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, 0x87BA, 0x56AE, 0x87BB,\t0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, 0x56B2, 0x87BE,\n\t0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, 0x87C2,\t0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5,\n\t0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8,\t0x56BF, 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC,\n\t0x56C3, 0x87CD, 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0,\t0x56C7, 0x87D1, 0x56C8, 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2,\n\t0x56CB, 0x87D4, 0x56CC, 0x87D5, 0x56CD, 0x87D6, 0x56CE, 0x87D7,\t0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, 0x87DA, 0x56D2, 0x87DB,\n\t0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, 0x56D6, 0x87DE,\t0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, 0xC7F4,\n\t0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8,\t0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5,\n\t0x56E3, 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4,\t0x56E7, 0x87E5, 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8,\n\t0x56EB, 0xE0F1, 0x56EC, 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA,\t0x56EF, 0x87EB, 0x56F0, 0xC0A7, 0x56F1, 0xB4D1, 0x56F2, 0x87EC,\n\t0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, 0xE0F0, 0x56F6, 0x87EE,\t0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, 0x56FA, 0xB9CC,\n\t0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, 0xCDBC,\t0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5,\n\t0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2,\t0x5707, 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5,\n\t0x570B, 0x87F8, 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB,\t0x570F, 0x87FC, 0x5710, 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840,\n\t0x5713, 0x8841, 0x5714, 0x8842, 0x5715, 0x8843, 0x5716, 0x8844,\t0x5717, 0x8845, 0x5718, 0x8846, 0x5719, 0x8847, 0x571A, 0x8848,\n\t0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, 0x571E, 0x884B,\t0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, 0x884E,\n\t0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851,\t0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9,\n\t0x572B, 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC,\t0x572F, 0xDBDD, 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855,\n\t0x5733, 0xDBDA, 0x5734, 0x8856, 0x5735, 0x8857, 0x5736, 0x8858,\t0x5737, 0x8859, 0x5738, 0x885A, 0x5739, 0xDBDB, 0x573A, 0xB3A1,\n\t0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, 0x885C, 0x573E, 0xBBF8,\t0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, 0x5742, 0xDBE0,\n\t0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, 0x8862,\t0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB,\n\t0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2,\t0x574F, 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866,\n\t0x5753, 0x8867, 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A,\t0x5757, 0xBFE9, 0x5758, 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1,\n\t0x575B, 0xCCB3, 0x575C, 0xDBDE, 0x575D, 0xB0D3, 0x575E, 0xCEEB,\t0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, 0xC6C2, 0x5762, 0x886D,\n\t0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, 0x5766, 0xCCB9,\t0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, 0xC6BA,\n\t0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872,\t0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875,\n\t0x5773, 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9,\t0x5777, 0xBFC0, 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A,\n\t0x577B, 0xDBE6, 0x577C, 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C,\t0x577F, 0x887D, 0x5780, 0x887E, 0x5781, 0x8880, 0x5782, 0xB4B9,\n\t0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, 0xDBE2, 0x5786, 0xDBE4,\t0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, 0x578A, 0x8884,\n\t0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, 0x8886,\t0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD,\n\t0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C,\t0x5797, 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890,\n\t0x579B, 0xB6E2, 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893,\t0x579F, 0x8894, 0x57A0, 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8,\n\t0x57A3, 0xD4AB, 0x57A4, 0xDBEC, 0x57A5, 0x8895, 0x57A6, 0xBFD1,\t0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, 0xDBD1, 0x57AA, 0x8897,\n\t0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, 0x57AE, 0xBFE5,\t0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, 0xDBEE,\n\t0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E,\t0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1,\n\t0x57BB, 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5,\t0x57BF, 0x88A6, 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1,\n\t0x57C3, 0xB0A3, 0x57C4, 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB,\t0x57C7, 0x88AC, 0x57C8, 0x88AD, 0x57C9, 0x88AE, 0x57CA, 0x88AF,\n\t0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, 0x88B1, 0x57CE, 0xB3C7,\t0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, 0x57D2, 0xDBF8,\n\t0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, 0x88B5,\t0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6,\n\t0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9,\t0x57DF, 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB,\n\t0x57E3, 0x88BC, 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE,\t0x57E7, 0x88BF, 0x57E8, 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2,\n\t0x57EB, 0x88C3, 0x57EC, 0x88C4, 0x57ED, 0xDCA4, 0x57EE, 0x88C5,\t0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, 0x88C7, 0x57F2, 0x88C8,\n\t0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, 0x57F6, 0x88CB,\t0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, 0xBBF9,\n\t0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF,\t0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3,\n\t0x5803, 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1,\t0x5807, 0xDDC0, 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7,\n\t0x580B, 0xDCA1, 0x580C, 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9,\t0x580F, 0x88DA, 0x5810, 0x88DB, 0x5811, 0xC7B5, 0x5812, 0x88DC,\n\t0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, 0xB6E9, 0x5816, 0x88DF,\t0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, 0x581A, 0x88E2,\n\t0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, 0xDCA6,\t0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7,\n\t0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA,\t0x5827, 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0,\n\t0x582B, 0x88EE, 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1,\t0x582F, 0x88F2, 0x5830, 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4,\n\t0x5833, 0x88F5, 0x5834, 0x88F6, 0x5835, 0xB6C2, 0x5836, 0x88F7,\t0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, 0x88FA, 0x583A, 0x88FB,\n\t0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, 0x583E, 0x8940,\t0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, 0x8944,\n\t0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947,\t0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B,\n\t0x584B, 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D,\t0x584F, 0x894E, 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950,\n\t0x5853, 0x8951, 0x5854, 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953,\t0x5857, 0x8954, 0x5858, 0xCCC1, 0x5859, 0x8955, 0x585A, 0x8956,\n\t0x585B, 0x8957, 0x585C, 0x8958, 0x585D, 0x8959, 0x585E, 0xC8FB,\t0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, 0x5862, 0x895D,\n\t0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, 0x8960,\t0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964,\n\t0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966,\t0x586F, 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A,\n\t0x5873, 0x896B, 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E,\t0x5877, 0x896F, 0x5878, 0x8970, 0x5879, 0x8971, 0x587A, 0x8972,\n\t0x587B, 0x8973, 0x587C, 0x8974, 0x587D, 0x8975, 0x587E, 0xDBD3,\t0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, 0xDCAC, 0x5882, 0x8977,\n\t0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, 0x5886, 0x8979,\t0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, 0x897C,\n\t0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981,\t0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA,\n\t0x5893, 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987,\t0x5897, 0x8988, 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE,\n\t0x589B, 0x898A, 0x589C, 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6,\t0x589F, 0xD0E6, 0x58A0, 0x898D, 0x58A1, 0x898E, 0x58A2, 0x898F,\n\t0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, 0x8992, 0x58A6, 0x8993,\t0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, 0x58AA, 0x8995,\n\t0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, 0x8999,\t0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D,\n\t0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1,\t0x58B7, 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5,\n\t0x58BB, 0x89A6, 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8,\t0x58BF, 0x89A9, 0x58C0, 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB,\n\t0x58C3, 0x89AC, 0x58C4, 0x89AD, 0x58C5, 0xDBD5, 0x58C6, 0x89AE,\t0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, 0x89B1, 0x58CA, 0x89B2,\n\t0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, 0x58CE, 0x89B6,\t0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, 0x89B9,\n\t0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC,\t0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0,\n\t0x58DB, 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4,\t0x58DF, 0x89C5, 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8,\n\t0x58E3, 0x89C9, 0x58E4, 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB,\t0x58E7, 0x89CC, 0x58E8, 0x89CD, 0x58E9, 0x89CE, 0x58EA, 0x89CF,\n\t0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, 0x89D0, 0x58EE, 0xD7B3,\t0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, 0x58F2, 0x89D3,\n\t0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, 0xBAF8,\t0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8,\n\t0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC,\t0x58FF, 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA,\n\t0x5903, 0x89E0, 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2,\t0x5907, 0xB1B8, 0x5908, 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5,\n\t0x590B, 0x89E6, 0x590C, 0x89E7, 0x590D, 0xB8B4, 0x590E, 0x89E8,\t0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, 0x89EA, 0x5912, 0x89EB,\n\t0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, 0x5916, 0xCDE2,\t0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, 0xB6E0,\n\t0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1,\t0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4,\n\t0x5923, 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6,\t0x5927, 0xB4F3, 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB,\n\t0x592B, 0xB7F2, 0x592C, 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB,\t0x592F, 0xBABB, 0x5930, 0x89F9, 0x5931, 0xCAA7, 0x5932, 0x89FA,\n\t0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, 0x89FC, 0x5936, 0x89FD,\t0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, 0x593A, 0xB6E1,\n\t0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, 0x8A41,\t0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC,\n\t0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46,\t0x5947, 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47,\n\t0x594B, 0xB7DC, 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC,\t0x594F, 0xD7E0, 0x5950, 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B,\n\t0x5953, 0x8A4C, 0x5954, 0xB1BC, 0x5955, 0xDEC8, 0x5956, 0xBDB1,\t0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, 0x8A4D, 0x595A, 0xDEC9,\n\t0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, 0x595E, 0x8A51,\t0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, 0xC9DD,\n\t0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56,\t0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A,\n\t0x596B, 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E,\t0x596F, 0x8A5F, 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62,\n\t0x5973, 0xC5AE, 0x5974, 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC,\t0x5977, 0x8A64, 0x5978, 0xBCE9, 0x5979, 0xCBFD, 0x597A, 0x8A65,\n\t0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, 0xBAC3, 0x597E, 0x8A68,\t0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, 0x5982, 0xC8E7,\n\t0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, 0xD7B1,\t0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1,\n\t0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F,\t0x598F, 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA,\n\t0x5993, 0xBCCB, 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD,\t0x5997, 0xE6A1, 0x5998, 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76,\n\t0x599B, 0x8A77, 0x599C, 0x8A78, 0x599D, 0x8A79, 0x599E, 0xE6A4,\t0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, 0x8A7C, 0x59A2, 0x8A7D,\n\t0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, 0x59A6, 0x8A7E,\t0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, 0xE5FD,\n\t0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD,\t0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7,\n\t0x59B3, 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88,\t0x59B7, 0x8A89, 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B,\n\t0x59BB, 0xC6DE, 0x59BC, 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA,\t0x59BF, 0x8A8E, 0x59C0, 0x8A8F, 0x59C1, 0x8A90, 0x59C2, 0x8A91,\n\t0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, 0x8A94, 0x59C6, 0xC4B7,\t0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, 0x59CA, 0xE6A2,\n\t0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, 0x8A9A,\t0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6,\n\t0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D,\t0x59D7, 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6,\n\t0x59DB, 0x8A9F, 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0,\t0x59DF, 0x8AA1, 0x59E0, 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4,\n\t0x59E3, 0xE6AF, 0x59E4, 0x8AA5, 0x59E5, 0xC0D1, 0x59E6, 0x8AA6,\t0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, 0x8AA8, 0x59EA, 0x8AA9,\n\t0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, 0x59EE, 0x8AAC,\t0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, 0x8AB0,\n\t0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4,\t0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7,\n\t0x59FB, 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA,\t0x59FF, 0xD7CB, 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC,\n\t0x5A03, 0xCDDE, 0x5A04, 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC,\t0x5A07, 0xBDBF, 0x5A08, 0xE6AE, 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD,\n\t0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, 0x8ABF, 0x5A0E, 0x8AC0,\t0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, 0x5A12, 0x8AC3,\n\t0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, 0x8AC6,\t0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9,\n\t0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC,\t0x5A1F, 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE,\n\t0x5A23, 0xE6B7, 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0,\t0x5A27, 0x8AD1, 0x5A28, 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3,\n\t0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7,\t0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, 0xD3E9, 0x5A32, 0xE6B4,\n\t0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, 0x5A36, 0xC8A2,\t0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, 0x8ADF,\n\t0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2,\t0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5,\n\t0x5A43, 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5,\t0x5A47, 0x8AE9, 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB,\n\t0x5A4B, 0x8AEB, 0x5A4C, 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE,\t0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, 0x5A51, 0x8AF1, 0x5A52, 0x8AF2,\n\t0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, 0xE6BC, 0x5A56, 0x8AF5,\t0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, 0x5A5A, 0xBBE9,\n\t0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, 0x8AFC,\t0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE,\n\t0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44,\t0x5A67, 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7,\n\t0x5A6B, 0x8B47, 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A,\t0x5A6F, 0x8B4B, 0x5A70, 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E,\n\t0x5A73, 0x8B4F, 0x5A74, 0xD3A4, 0x5A75, 0xE6BF, 0x5A76, 0xC9F4,\t0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, 0x8B51, 0x5A7A, 0xE6C4,\n\t0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, 0x5A7E, 0x8B55,\t0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, 0x8B58,\n\t0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C,\t0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60,\n\t0x5A8B, 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64,\t0x5A8F, 0x8B65, 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD,\n\t0x5A93, 0x8B68, 0x5A94, 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B,\t0x5A97, 0x8B6C, 0x5A98, 0x8B6D, 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4,\n\t0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, 0x8B70, 0x5A9E, 0x8B71,\t0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, 0x5AA2, 0x8B75,\n\t0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, 0x8B79,\t0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1,\n\t0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81,\t0x5AAF, 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7,\n\t0x5AB3, 0xCFB1, 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86,\t0x5AB7, 0x8B87, 0x5AB8, 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89,\n\t0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5,\t0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, 0xBCDE, 0x5AC2, 0xC9A9,\n\t0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, 0x5AC6, 0x8B92,\t0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, 0x8B95,\n\t0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98,\t0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8,\n\t0x5AD3, 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE,\t0x5AD7, 0x8B9E, 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0,\n\t0x5ADB, 0x8BA1, 0x5ADC, 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3,\t0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5,\n\t0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, 0x8BA7, 0x5AE6, 0xE6CF,\t0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, 0x5AEA, 0x8BAA,\n\t0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, 0x8BAD,\t0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0,\n\t0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4,\t0x5AF7, 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8,\n\t0x5AFB, 0x8BB9, 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC,\t0x5AFF, 0x8BBD, 0x5B00, 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0,\n\t0x5B03, 0x8BC1, 0x5B04, 0x8BC2, 0x5B05, 0x8BC3, 0x5B06, 0x8BC4,\t0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, 0xE6D2, 0x5B0A, 0x8BC7,\n\t0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, 0x5B0E, 0x8BCB,\t0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, 0x8BCF,\n\t0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4,\t0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5,\n\t0x5B1B, 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9,\t0x5B1F, 0x8BDA, 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD,\n\t0x5B23, 0x8BDE, 0x5B24, 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1,\t0x5B27, 0x8BE2, 0x5B28, 0x8BE3, 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5,\n\t0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, 0x8BE8, 0x5B2E, 0x8BE9,\t0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, 0x5B32, 0xE6D5,\n\t0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, 0x8BEF,\t0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2,\n\t0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6,\t0x5B3F, 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9,\n\t0x5B43, 0x8BFA, 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD,\t0x5B47, 0x8BFE, 0x5B48, 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42,\n\t0x5B4B, 0x8C43, 0x5B4C, 0x8C44, 0x5B4D, 0x8C45, 0x5B4E, 0x8C46,\t0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, 0xE6DD, 0x5B52, 0x8C48,\n\t0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, 0x5B56, 0x8C49,\t0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, 0xE6DA,\n\t0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A,\t0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF,\n\t0x5B63, 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7,\t0x5B67, 0x8C4D, 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF,\n\t0x5B6B, 0x8C4F, 0x5B6C, 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51,\t0x5B6F, 0x8C52, 0x5B70, 0xCAEB, 0x5B71, 0xE5EE, 0x5B72, 0x8C53,\n\t0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, 0xB7F5, 0x5B76, 0x8C55,\t0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, 0x5B7A, 0xC8E6,\n\t0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, 0x8C5B,\t0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D,\n\t0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E,\t0x5B87, 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F,\n\t0x5B8B, 0xCBCE, 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61,\t0x5B8F, 0xBAEA, 0x5B90, 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64,\n\t0x5B93, 0xE5B5, 0x5B94, 0x8C65, 0x5B95, 0xE5B4, 0x5B96, 0x8C66,\t0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, 0xD6E6, 0x5B9A, 0xB6A8,\n\t0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, 0x5B9E, 0xCAB5,\t0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, 0xBFCD,\n\t0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2,\t0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC,\n\t0x5BAB, 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D,\t0x5BAF, 0x8C6E, 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70,\n\t0x5BB3, 0xBAA6, 0x5BB4, 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2,\t0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72,\n\t0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, 0xBFED, 0x5BBE, 0xB1F6,\t0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, 0x5BC2, 0xBCC5,\n\t0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, 0xC3DC,\t0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A,\n\t0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D,\t0x5BCF, 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE,\n\t0x5BD3, 0xD4A2, 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83,\t0x5BD7, 0x8C84, 0x5BD8, 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87,\n\t0x5BDB, 0x8C88, 0x5BDC, 0x8C89, 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF,\t0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, 0xB9D1, 0x5BE2, 0x8C8B,\n\t0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, 0x5BE6, 0x8C8D,\t0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, 0x8C90,\n\t0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC,\t0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96,\n\t0x5BF3, 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A,\t0x5BF7, 0x8C9B, 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2,\n\t0x5BFB, 0xD1B0, 0x5BFC, 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D,\t0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, 0x5C01, 0xB7E2, 0x5C02, 0x8C9F,\n\t0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, 0x8CA1, 0x5C06, 0xBDAB,\t0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, 0x5C0A, 0xD7F0,\n\t0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, 0x8CA7,\t0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9,\n\t0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2,\t0x5C17, 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0,\n\t0x5C1B, 0x8CAD, 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE,\t0x5C1F, 0x8CAF, 0x5C20, 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC,\n\t0x5C23, 0x8CB2, 0x5C24, 0xD3C8, 0x5C25, 0xDECD, 0x5C26, 0x8CB3,\t0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, 0x8CB5, 0x5C2A, 0x8CB6,\n\t0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, 0x5C2E, 0x8CB9,\t0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, 0x8CBC,\n\t0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF,\t0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF,\n\t0x5C3B, 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2,\t0x5C3F, 0xC4F2, 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3,\n\t0x5C43, 0x8CC1, 0x5C44, 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3,\t0x5C47, 0x8CC4, 0x5C48, 0xC7FC, 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC,\n\t0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, 0x8CC6, 0x5C4E, 0xCABA,\t0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, 0x5C52, 0x8CC7,\n\t0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, 0x8CCA,\t0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD,\n\t0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4,\t0x5C5F, 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2,\n\t0x5C63, 0xE5EF, 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0,\t0x5C67, 0x8CD4, 0x5C68, 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7,\n\t0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8,\t0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, 0xC9BD, 0x5C72, 0x8CDC,\n\t0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, 0x5C76, 0x8CE0,\t0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, 0xE1A8,\n\t0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6,\t0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1,\n\t0x5C83, 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB,\t0x5C87, 0x8CEC, 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE,\n\t0x5C8B, 0x8CEF, 0x5C8C, 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0,\t0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, 0x5C91, 0xE1AF, 0x5C92, 0x8CF2,\n\t0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, 0x8CF4, 0x5C96, 0xE1AB,\t0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, 0x5C9A, 0xE1B0,\n\t0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, 0x8CF6,\t0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3,\n\t0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC,\t0x5CA7, 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40,\n\t0x5CAB, 0xE1B6, 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41,\t0x5CAF, 0x8D42, 0x5CB0, 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44,\n\t0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46,\t0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, 0x8D47, 0x5CBA, 0x8D48,\n\t0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, 0x5CBE, 0x8D4B,\t0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, 0x8D4D,\n\t0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50,\t0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54,\n\t0x5CCB, 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57,\t0x5CCF, 0x8D58, 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC,\n\t0x5CD3, 0x8D5B, 0x5CD4, 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E,\t0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61,\n\t0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, 0x8D64, 0x5CDE, 0x8D65,\t0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, 0x5CE2, 0x8D68,\n\t0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, 0xC2CD,\t0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8,\n\t0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E,\t0x5CEF, 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71,\n\t0x5CF3, 0x8D72, 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75,\t0x5CF7, 0x8D76, 0x5CF8, 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79,\n\t0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C,\t0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, 0x8D80, 0x5D02, 0xE1C0,\n\t0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, 0x5D06, 0xE1C7,\t0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, 0x8D85,\n\t0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9,\t0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C,\n\t0x5D13, 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2,\t0x5D17, 0x8D8F, 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92,\n\t0x5D1B, 0xE1C8, 0x5D1C, 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6,\t0x5D1F, 0x8D95, 0x5D20, 0x8D96, 0x5D21, 0x8D97, 0x5D22, 0x8D98,\n\t0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, 0x8D9A, 0x5D26, 0xE1C3,\t0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, 0x5D2A, 0x8D9C,\n\t0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, 0xE1C4,\t0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2,\n\t0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5,\t0x5D37, 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9,\n\t0x5D3B, 0x8DAA, 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA,\t0x5D3F, 0x8DAC, 0x5D40, 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF,\n\t0x5D43, 0x8DB0, 0x5D44, 0x8DB1, 0x5D45, 0x8DB2, 0x5D46, 0x8DB3,\t0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, 0x8DB5, 0x5D4A, 0xE1D3,\n\t0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, 0x5D4E, 0x8DB7,\t0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, 0x8DBB,\n\t0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF,\t0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2,\n\t0x5D5B, 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4,\t0x5D5F, 0x8DC5, 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8,\n\t0x5D63, 0x8DC9, 0x5D64, 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC,\t0x5D67, 0x8DCD, 0x5D68, 0x8DCE, 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF,\n\t0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, 0x8DD0, 0x5D6E, 0x8DD1,\t0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, 0x5D72, 0x8DD4,\n\t0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, 0x8DD7,\t0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB,\n\t0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF,\t0x5D7F, 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6,\n\t0x5D83, 0x8DE3, 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6,\t0x5D87, 0x8DE7, 0x5D88, 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA,\n\t0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE,\t0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, 0x8DF1, 0x5D92, 0x8DF2,\n\t0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, 0x5D96, 0x8DF6,\t0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, 0x8DF9,\n\t0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC,\t0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41,\n\t0x5DA3, 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45,\t0x5DA7, 0x8E46, 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49,\n\t0x5DAB, 0x8E4A, 0x5DAC, 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D,\t0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, 0x5DB1, 0x8E50, 0x5DB2, 0x8E51,\n\t0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, 0x8E54, 0x5DB6, 0x8E55,\t0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, 0x5DBA, 0x8E58,\n\t0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, 0x8E5C,\t0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60,\n\t0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63,\t0x5DC7, 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67,\n\t0x5DCB, 0x8E68, 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A,\t0x5DCF, 0x8E6B, 0x5DD0, 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E,\n\t0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, 0x5DD5, 0x8E71, 0x5DD6, 0x8E72,\t0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, 0x8E75, 0x5DDA, 0x8E76,\n\t0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, 0x5DDE, 0xD6DD,\t0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, 0xB3B2,\n\t0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3,\t0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C,\n\t0x5DEB, 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE,\t0x5DEF, 0xDBCF, 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1,\n\t0x5DF3, 0xCBC8, 0x5DF4, 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82,\t0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, 0x5DF9, 0x8E84, 0x5DFA, 0x8E85,\n\t0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, 0xD9E3, 0x5DFE, 0xBDED,\t0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, 0x5E02, 0xCAD0,\n\t0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, 0xB7AB,\t0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D,\n\t0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90,\t0x5E0F, 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91,\n\t0x5E13, 0x8E92, 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB,\t0x5E17, 0x8E93, 0x5E18, 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3,\n\t0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94,\t0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, 0x8E97, 0x5E22, 0x8E98,\n\t0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, 0x5E26, 0xB4F8,\t0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, 0x8E9E,\n\t0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF,\t0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3,\n\t0x5E33, 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7,\t0x5E37, 0xE1A1, 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9,\n\t0x5E3B, 0xE0FD, 0x5E3C, 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA,\t0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, 0x5E41, 0x8EAD, 0x5E42, 0xC3DD,\n\t0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, 0xB7F9, 0x5E46, 0x8EAF,\t0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, 0x5E4A, 0x8EB3,\n\t0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, 0x8EB6,\t0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA,\n\t0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC,\t0x5E57, 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0,\n\t0x5E5B, 0xE1A4, 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5,\t0x5E5F, 0x8EC3, 0x5E60, 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1,\n\t0x5E63, 0x8EC5, 0x5E64, 0x8EC6, 0x5E65, 0x8EC7, 0x5E66, 0x8EC8,\t0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, 0x8ECB, 0x5E6A, 0x8ECC,\n\t0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, 0x5E6E, 0x8ED0,\t0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, 0xB8C9,\n\t0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2,\t0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB,\n\t0x5E7B, 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7,\t0x5E7F, 0xB9E3, 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9,\n\t0x5E83, 0x8EDA, 0x5E84, 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC,\t0x5E87, 0xB1D3, 0x5E88, 0x8EDC, 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2,\n\t0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, 0x8EDF, 0x5E8E, 0x8EE0,\t0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, 0x5E92, 0x8EE1,\n\t0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, 0xE2D2,\t0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD,\n\t0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3,\t0x5E9F, 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6,\n\t0x5EA3, 0x8EE7, 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8,\t0x5EA7, 0xD7F9, 0x5EA8, 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB,\n\t0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE,\t0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, 0x8EF1, 0x5EB2, 0x8EF2,\n\t0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, 0x5EB6, 0xCAFC,\t0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, 0x8EF4,\n\t0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7,\t0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB,\n\t0x5EC3, 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40,\t0x5EC7, 0x8F41, 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8,\n\t0x5ECB, 0x8F43, 0x5ECC, 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46,\t0x5ECF, 0x8F47, 0x5ED0, 0x8F48, 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA,\n\t0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, 0x8F4A, 0x5ED6, 0xC1CE,\t0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, 0x5EDA, 0x8F4E,\n\t0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, 0x8F51,\t0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55,\n\t0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59,\t0x5EE7, 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE,\n\t0x5EEB, 0x8F5C, 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F,\t0x5EEF, 0x8F60, 0x5EF0, 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63,\n\t0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3,\t0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, 0x8F67, 0x5EFA, 0xBDA8,\n\t0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, 0x5EFE, 0xDEC3,\t0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, 0xD2EC,\n\t0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C,\t0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7,\n\t0x5F0B, 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71,\t0x5F0F, 0xCABD, 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73,\n\t0x5F13, 0xB9AD, 0x5F14, 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75,\t0x5F17, 0xB8A5, 0x5F18, 0xBAEB, 0x5F19, 0x8F76, 0x5F1A, 0x8F77,\n\t0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, 0x8F79, 0x5F1E, 0x8F7A,\t0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, 0x5F22, 0x8F7C,\n\t0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, 0xCFD2,\t0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2,\n\t0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83,\t0x5F2F, 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85,\n\t0x5F33, 0x8F86, 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89,\t0x5F37, 0x8F8A, 0x5F38, 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF,\n\t0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E,\t0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, 0x8F90, 0x5F42, 0x8F91,\n\t0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, 0x5F46, 0x8F95,\t0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, 0x8F99,\n\t0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D,\t0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9,\n\t0x5F53, 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8,\t0x5F57, 0xE5E7, 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2,\n\t0x5F5B, 0x8FA3, 0x5F5C, 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5,\t0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, 0x5F61, 0xE1EA, 0x5F62, 0xD0CE,\n\t0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, 0x8FA9, 0x5F66, 0xD1E5,\t0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, 0x5F6A, 0xB1EB,\n\t0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, 0x8FAD,\t0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF,\n\t0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2,\t0x5F77, 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4,\n\t0x5F7B, 0xB3B9, 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6,\t0x5F7F, 0x8FB7, 0x5F80, 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE,\n\t0x5F83, 0x8FB8, 0x5F84, 0xBEB6, 0x5F85, 0xB4FD, 0x5F86, 0x8FB9,\t0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, 0xE1E0, 0x5F8A, 0xBBB2,\n\t0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, 0x5F8E, 0x8FBB,\t0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, 0xCDBD,\n\t0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0,\t0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1,\n\t0x5F9B, 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4,\t0x5F9F, 0x8FC5, 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7,\n\t0x5FA3, 0x8FC8, 0x5FA4, 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB,\t0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD,\n\t0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, 0xE1E6, 0x5FAE, 0xCEA2,\t0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, 0x5FB2, 0x8FD3,\n\t0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, 0x8FD6,\t0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9,\n\t0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB,\t0x5FBF, 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF,\n\t0x5FC3, 0xD0C4, 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4,\t0x5FC7, 0x8FE0, 0x5FC8, 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2,\n\t0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4,\t0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, 0xECFD, 0x5FD2, 0xDFAF,\n\t0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, 0x5FD6, 0xE2E2,\t0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, 0x8FE8,\n\t0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB,\t0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED,\n\t0x5FE3, 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0,\t0x5FE7, 0xD3C7, 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC,\n\t0x5FEB, 0xBFEC, 0x5FEC, 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5,\t0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6,\n\t0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, 0xC4EE, 0x5FF6, 0x8FF9,\t0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, 0x5FFA, 0x8FFC,\n\t0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, 0xE2E9,\t0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB,\n\t0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB,\t0x6007, 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7,\n\t0x600B, 0x9042, 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5,\t0x600F, 0xE2F3, 0x6010, 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD,\n\t0x6013, 0x9046, 0x6014, 0xD5FA, 0x6015, 0xC5C2, 0x6016, 0xB2C0,\t0x6017, 0x9047, 0x6018, 0x9048, 0x6019, 0xE2EF, 0x601A, 0x9049,\n\t0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, 0x601E, 0x904A,\t0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, 0x904C,\n\t0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1,\t0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6,\n\t0x602B, 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051,\t0x602F, 0xC7D3, 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054,\n\t0x6033, 0x9055, 0x6034, 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057,\t0x6037, 0x9058, 0x6038, 0x9059, 0x6039, 0x905A, 0x603A, 0x905B,\n\t0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, 0x905C, 0x603E, 0x905D,\t0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, 0x6042, 0xE2FE,\n\t0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, 0x9061,\t0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065,\n\t0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067,\t0x604F, 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3,\n\t0x6053, 0x906A, 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C,\t0x6057, 0x906D, 0x6058, 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3,\n\t0x605B, 0x906F, 0x605C, 0x9070, 0x605D, 0xEDA2, 0x605E, 0x9071,\t0x605F, 0x9072, 0x6060, 0x9073, 0x6061, 0x9074, 0x6062, 0xBBD6,\n\t0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, 0x6066, 0x9076,\t0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, 0xE3A1,\n\t0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077,\t0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079,\n\t0x6073, 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1,\t0x6077, 0x907C, 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD,\n\t0x607B, 0xE2FC, 0x607C, 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D,\t0x607F, 0xD3C1, 0x6080, 0x907E, 0x6081, 0x9080, 0x6082, 0x9081,\n\t0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, 0x9082, 0x6086, 0x9083,\t0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, 0x608A, 0x9086,\n\t0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, 0x9088,\t0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8,\n\t0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3,\t0x6097, 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4,\n\t0x609B, 0xE3AA, 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092,\t0x609F, 0xCEF2, 0x60A0, 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094,\n\t0x60A3, 0xBBBC, 0x60A4, 0x9095, 0x60A5, 0x9096, 0x60A6, 0xD4C3,\t0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, 0x9098, 0x60AA, 0x9099,\n\t0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, 0x60AE, 0x909A,\t0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, 0xB1AF,\n\t0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E,\t0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1,\n\t0x60BB, 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3,\t0x60BF, 0x90A4, 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7,\n\t0x60C3, 0x90A8, 0x60C4, 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0,\t0x60C7, 0x90AA, 0x60C8, 0x90AB, 0x60C9, 0x90AC, 0x60CA, 0xBEAA,\n\t0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, 0x90AE, 0x60CE, 0x90AF,\t0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, 0x60D2, 0x90B2,\n\t0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, 0x90B5,\t0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1,\n\t0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9,\t0x60DF, 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB,\n\t0x60E3, 0x90BC, 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB,\t0x60E7, 0xBEE5, 0x60E8, 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF,\n\t0x60EB, 0xB1B9, 0x60EC, 0xE3AB, 0x60ED, 0xB2D1, 0x60EE, 0xB5AC,\t0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, 0x90C0, 0x60F2, 0x90C1,\n\t0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, 0x60F6, 0xBBCC,\t0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, 0xD0CA,\n\t0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8,\t0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA,\n\t0x6103, 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9,\t0x6107, 0x90CE, 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF,\n\t0x610B, 0x90D0, 0x610C, 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9,\t0x610F, 0xD2E2, 0x6110, 0x90D2, 0x6111, 0x90D3, 0x6112, 0x90D4,\n\t0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, 0xE3B5, 0x6116, 0x90D7,\t0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, 0x611A, 0xD3DE,\n\t0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, 0x90DE,\t0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0,\n\t0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4,\t0x6127, 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4,\n\t0x612B, 0xE3BA, 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7,\t0x612F, 0x90E8, 0x6130, 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB,\n\t0x6133, 0x90EC, 0x6134, 0x90ED, 0x6135, 0x90EE, 0x6136, 0x90EF,\t0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, 0x90F2, 0x613A, 0x90F3,\n\t0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, 0x613E, 0x90F7,\t0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, 0x90FA,\n\t0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE,\t0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB,\n\t0x614B, 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7,\t0x614F, 0x9144, 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146,\n\t0x6153, 0x9147, 0x6154, 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149,\t0x6157, 0x914A, 0x6158, 0x914B, 0x6159, 0x914C, 0x615A, 0x914D,\n\t0x615B, 0x914E, 0x615C, 0x914F, 0x615D, 0xEDAB, 0x615E, 0x9150,\t0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, 0x6162, 0xC2FD,\n\t0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, 0x9157,\t0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159,\n\t0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D,\t0x616F, 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160,\n\t0x6173, 0x9161, 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163,\t0x6177, 0xBFB6, 0x6178, 0x9164, 0x6179, 0x9165, 0x617A, 0x9166,\n\t0x617B, 0x9167, 0x617C, 0x9168, 0x617D, 0x9169, 0x617E, 0x916A,\t0x617F, 0x916B, 0x6180, 0x916C, 0x6181, 0x916D, 0x6182, 0x916E,\n\t0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, 0x6186, 0x9172,\t0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, 0x9176,\n\t0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7,\t0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C,\n\t0x6193, 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180,\t0x6197, 0x9181, 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184,\n\t0x619B, 0x9185, 0x619C, 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187,\t0x619F, 0x9188, 0x61A0, 0x9189, 0x61A1, 0x918A, 0x61A2, 0x918B,\n\t0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, 0x918E, 0x61A6, 0x918F,\t0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, 0x61AA, 0x9190,\n\t0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, 0x9193,\t0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197,\n\t0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B,\t0x61B7, 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E,\n\t0x61BB, 0x919F, 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6,\t0x61BF, 0x91A2, 0x61C0, 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE,\n\t0x61C3, 0x91A5, 0x61C4, 0x91A6, 0x61C5, 0x91A7, 0x61C6, 0x91A8,\t0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, 0x91AA, 0x61CA, 0xB0C3,\n\t0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, 0x61CE, 0x91AD,\t0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, 0xC0C1,\n\t0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2,\t0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6,\n\t0x61DB, 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA,\t0x61DF, 0x91BB, 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE,\n\t0x61E3, 0x91BF, 0x61E4, 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3,\t0x61E7, 0x91C2, 0x61E8, 0x91C3, 0x61E9, 0x91C4, 0x61EA, 0x91C5,\n\t0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, 0x91C8, 0x61EE, 0x91C9,\t0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, 0x61F2, 0x91CD,\n\t0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, 0x91D0,\t0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4,\n\t0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8,\t0x61FF, 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB,\n\t0x6203, 0x91DC, 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0,\t0x6207, 0x91DF, 0x6208, 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC,\n\t0x620B, 0xEAA7, 0x620C, 0xD0E7, 0x620D, 0xCAF9, 0x620E, 0xC8D6,\t0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, 0xCED2, 0x6212, 0xBDE4,\n\t0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, 0x6216, 0xBBF2,\t0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, 0xC6DD,\n\t0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6,\t0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB,\n\t0x6223, 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9,\t0x6227, 0x91EA, 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8,\n\t0x622B, 0x91ED, 0x622C, 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE,\t0x622F, 0x91EF, 0x6230, 0x91F0, 0x6231, 0x91F1, 0x6232, 0x91F2,\n\t0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, 0x91F3, 0x6236, 0x91F4,\t0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, 0x623A, 0x91F7,\n\t0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, 0xECE5,\t0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA,\n\t0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD,\t0x6247, 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE,\n\t0x624B, 0xCAD6, 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA,\t0x624F, 0x9240, 0x6250, 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7,\n\t0x6253, 0xB4F2, 0x6254, 0xC8D3, 0x6255, 0x9242, 0x6256, 0x9243,\t0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, 0x9245, 0x625A, 0x9246,\n\t0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, 0x625E, 0x9249,\t0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, 0x924D,\n\t0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4,\t0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1,\n\t0x626B, 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7,\t0x626F, 0xB3B6, 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252,\n\t0x6273, 0xB0E2, 0x6274, 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6,\t0x6277, 0x9255, 0x6278, 0x9256, 0x6279, 0xC5FA, 0x627A, 0x9257,\n\t0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, 0x9259, 0x627E, 0xD5D2,\t0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, 0x6282, 0x925B,\n\t0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, 0x925E,\t0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1,\n\t0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264,\t0x628F, 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3,\n\t0x6293, 0xD7A5, 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6,\t0x6297, 0xBFB9, 0x6298, 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7,\n\t0x629B, 0xC5D7, 0x629C, 0x9269, 0x629D, 0x926A, 0x629E, 0x926B,\t0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, 0xC2D5, 0x62A2, 0xC7C0,\n\t0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, 0x62A6, 0x926D,\t0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, 0x9270,\n\t0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272,\t0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275,\n\t0x62B3, 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278,\t0x62B7, 0x9279, 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B,\n\t0x62BB, 0xDED3, 0x62BC, 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C,\t0x62BF, 0xC3F2, 0x62C0, 0x927D, 0x62C1, 0x927E, 0x62C2, 0xB7F7,\n\t0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, 0xB5A3, 0x62C6, 0xB2F0,\t0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, 0x62CA, 0xDED4,\n\t0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, 0xC1E0,\t0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC,\n\t0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF,\t0x62D7, 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5,\n\t0x62DB, 0xD5D0, 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286,\t0x62DF, 0xC4E2, 0x62E0, 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3,\n\t0x62E3, 0xBCF0, 0x62E4, 0x9289, 0x62E5, 0xD3B5, 0x62E6, 0xC0B9,\t0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, 0xD4F1, 0x62EA, 0x928A,\n\t0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, 0x62EE, 0xDED7,\t0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, 0x928D,\n\t0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9,\t0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291,\n\t0x62FB, 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0,\t0x62FF, 0xC4C3, 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2,\n\t0x6303, 0x9294, 0x6304, 0x9295, 0x6305, 0x9296, 0x6306, 0x9297,\t0x6307, 0xD6B8, 0x6308, 0xEAFC, 0x6309, 0xB0B4, 0x630A, 0x9298,\n\t0x630B, 0x9299, 0x630C, 0x929A, 0x630D, 0x929B, 0x630E, 0xBFE6,\t0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, 0x6312, 0x929E,\n\t0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, 0xCDDA,\t0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF,\n\t0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2,\t0x631F, 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8,\n\t0x6323, 0xD5F5, 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6,\t0x6327, 0x92A7, 0x6328, 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2,\n\t0x632B, 0xB4EC, 0x632C, 0x92A9, 0x632D, 0x92AA, 0x632E, 0x92AB,\t0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, 0x92AD, 0x6332, 0xEAFD,\n\t0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, 0x6336, 0x92B1,\t0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, 0xCDA6,\n\t0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6,\t0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6,\n\t0x6343, 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6,\t0x6347, 0x92BB, 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD,\n\t0x634B, 0xDEDB, 0x634C, 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3,\t0x634F, 0xC4F3, 0x6350, 0xBEE8, 0x6351, 0x92BE, 0x6352, 0x92BF,\n\t0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, 0xB2B6, 0x6356, 0x92C2,\t0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, 0x635A, 0x92C6,\n\t0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, 0xC0CC,\t0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB,\n\t0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD,\t0x6367, 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF,\n\t0x636B, 0x92D0, 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD,\t0x636F, 0x92D2, 0x6370, 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4,\n\t0x6373, 0x92D5, 0x6374, 0x92D6, 0x6375, 0x92D7, 0x6376, 0xB4B7,\t0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, 0x92D9, 0x637A, 0xDEE0,\n\t0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, 0x637E, 0x92DC,\t0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, 0xB5E0,\n\t0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2,\t0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5,\n\t0x638B, 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1,\t0x638F, 0xCCCD, 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5,\n\t0x6393, 0x92E6, 0x6394, 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4,\t0x6397, 0x92E9, 0x6398, 0xBEF2, 0x6399, 0x92EA, 0x639A, 0x92EB,\n\t0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, 0x92EE, 0x639E, 0x92EF,\t0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, 0x63A2, 0xCCBD,\n\t0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, 0x92F3,\t0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB,\n\t0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7,\t0x63AF, 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7,\n\t0x63B3, 0xC2B0, 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9,\t0x63B7, 0xD6C0, 0x63B8, 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4,\n\t0x63BB, 0x92FB, 0x63BC, 0xDEE8, 0x63BD, 0x92FC, 0x63BE, 0xDEF2,\t0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, 0x9340, 0x63C2, 0x9341,\n\t0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, 0x63C6, 0xDEF1,\t0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, 0x9346,\n\t0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF,\t0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5,\n\t0x63D3, 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE,\t0x63D7, 0x934D, 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350,\n\t0x63DB, 0x9351, 0x63DC, 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE,\t0x63DF, 0x9354, 0x63E0, 0xDEEB, 0x63E1, 0xCED5, 0x63E2, 0x9355,\n\t0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, 0x9357, 0x63E6, 0x9358,\t0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, 0x63EA, 0xBEBE,\n\t0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, 0x935D,\t0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9,\n\t0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE,\t0x63F7, 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365,\n\t0x63FB, 0x9366, 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368,\t0x63FF, 0xDEEC, 0x6400, 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7,\n\t0x6403, 0x9369, 0x6404, 0x936A, 0x6405, 0xBDC1, 0x6406, 0x936B,\t0x6407, 0x936C, 0x6408, 0x936D, 0x6409, 0x936E, 0x640A, 0x936F,\n\t0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, 0x640E, 0x9371,\t0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, 0x9373,\n\t0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375,\t0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379,\n\t0x641B, 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3,\t0x641F, 0x937B, 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C,\n\t0x6423, 0x937D, 0x6424, 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9,\t0x6427, 0x9381, 0x6428, 0x9382, 0x6429, 0x9383, 0x642A, 0xCCC2,\n\t0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, 0xB4EE, 0x642E, 0x9385,\t0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, 0x6432, 0x9389,\n\t0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, 0x938C,\t0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF,\n\t0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392,\t0x643F, 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394,\n\t0x6443, 0x9395, 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA,\t0x6447, 0xD2A1, 0x6448, 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF,\n\t0x644B, 0x9397, 0x644C, 0x9398, 0x644D, 0x9399, 0x644E, 0x939A,\t0x644F, 0x939B, 0x6450, 0x939C, 0x6451, 0x939D, 0x6452, 0xDEF0,\n\t0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, 0x6456, 0x93A0,\t0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, 0x93A3,\n\t0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB,\t0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA,\n\t0x6463, 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE,\t0x6467, 0xB4DD, 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0,\n\t0x646B, 0x93B1, 0x646C, 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3,\t0x646F, 0x93B4, 0x6470, 0x93B5, 0x6471, 0x93B6, 0x6472, 0x93B7,\n\t0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, 0x93BA, 0x6476, 0x93BB,\t0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, 0x647A, 0xDFA1,\n\t0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, 0x93C0,\t0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC,\n\t0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5,\t0x6487, 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8,\n\t0x648B, 0x93C9, 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC,\t0x648F, 0x93CD, 0x6490, 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6,\n\t0x6493, 0x93CF, 0x6494, 0x93D0, 0x6495, 0xCBBA, 0x6496, 0xDEFE,\t0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, 0xDFA4, 0x649A, 0x93D3,\n\t0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, 0x649E, 0xD7B2,\t0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, 0x93DA,\n\t0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD,\t0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0,\n\t0x64AB, 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9,\t0x64AF, 0x93E2, 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4,\n\t0x64B3, 0x93E5, 0x64B4, 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7,\t0x64B7, 0xDFA2, 0x64B8, 0xDFA3, 0x64B9, 0x93E8, 0x64BA, 0xDFA5,\n\t0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, 0x93EA, 0x64BE, 0x93EB,\t0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, 0x64C2, 0xC0DE,\n\t0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, 0x93F0,\t0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4,\n\t0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6,\t0x64CF, 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC,\n\t0x64D3, 0x93F9, 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC,\t0x64D7, 0xDFA8, 0x64D8, 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE,\n\t0x64DB, 0x9440, 0x64DC, 0x9441, 0x64DD, 0x9442, 0x64DE, 0xCBD3,\t0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, 0x9445, 0x64E2, 0xDFAA,\n\t0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, 0x64E6, 0xB2C1,\t0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, 0x944B,\n\t0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F,\t0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453,\n\t0x64F3, 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457,\t0x64F7, 0x9458, 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B,\n\t0x64FB, 0x945C, 0x64FC, 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F,\t0x64FF, 0x9460, 0x6500, 0xC5CA, 0x6501, 0x9461, 0x6502, 0x9462,\n\t0x6503, 0x9463, 0x6504, 0x9464, 0x6505, 0x9465, 0x6506, 0x9466,\t0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, 0x650A, 0x9469,\n\t0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, 0x946D,\t0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC,\n\t0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474,\t0x6517, 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477,\n\t0x651B, 0x9478, 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B,\t0x651F, 0x947C, 0x6520, 0x947D, 0x6521, 0x947E, 0x6522, 0x9480,\n\t0x6523, 0x9481, 0x6524, 0x9482, 0x6525, 0xDFAC, 0x6526, 0x9483,\t0x6527, 0x9484, 0x6528, 0x9485, 0x6529, 0x9486, 0x652A, 0x9487,\n\t0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, 0x652E, 0xDFAD,\t0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, 0x948C,\n\t0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5,\t0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F,\n\t0x653B, 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5,\t0x653F, 0xD5FE, 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494,\n\t0x6543, 0x9495, 0x6544, 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497,\t0x6547, 0x9498, 0x6548, 0xD0A7, 0x6549, 0xF4CD, 0x654A, 0x9499,\n\t0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, 0x949B, 0x654E, 0x949C,\t0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, 0x6552, 0x949E,\n\t0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, 0xB0BD,\t0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3,\n\t0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8,\t0x655F, 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2,\n\t0x6563, 0xC9A2, 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8,\t0x6567, 0x94AA, 0x6568, 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD,\n\t0x656B, 0xEBB8, 0x656C, 0xBEB4, 0x656D, 0x94AE, 0x656E, 0x94AF,\t0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, 0x94B1, 0x6572, 0xC7C3,\n\t0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, 0x6576, 0x94B4,\t0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, 0x94B7,\n\t0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB,\t0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF,\n\t0x6583, 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3,\t0x6587, 0xCEC4, 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6,\n\t0x658B, 0xD5AB, 0x658C, 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8,\t0x658F, 0x94C9, 0x6590, 0xECB3, 0x6591, 0xB0DF, 0x6592, 0x94CA,\n\t0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, 0x94CC, 0x6596, 0x94CD,\t0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, 0x659A, 0x94CF,\n\t0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, 0x94D1,\t0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3,\n\t0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5,\t0x65A7, 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7,\n\t0x65AB, 0xEDBD, 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9,\t0x65AF, 0xCBB9, 0x65B0, 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB,\n\t0x65B3, 0x94DC, 0x65B4, 0x94DD, 0x65B5, 0x94DE, 0x65B6, 0x94DF,\t0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, 0xB7BD, 0x65BA, 0x94E2,\n\t0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, 0x65BE, 0x94E4,\t0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, 0x94E7,\n\t0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7,\t0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB,\n\t0x65CB, 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB,\t0x65CF, 0xD7E5, 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC,\n\t0x65D3, 0x94EF, 0x65D4, 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD,\t0x65D7, 0xC6EC, 0x65D8, 0x94F2, 0x65D9, 0x94F3, 0x65DA, 0x94F4,\n\t0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, 0x94F7, 0x65DE, 0x94F8,\t0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, 0x65E2, 0xBCC8,\n\t0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, 0xB5A9,\t0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD,\n\t0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8,\t0x65EF, 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540,\n\t0x65F3, 0x9541, 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1,\t0x65F7, 0xBFF5, 0x65F8, 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA,\n\t0x65FB, 0x9546, 0x65FC, 0x9547, 0x65FD, 0x9548, 0x65FE, 0x9549,\t0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, 0x954B, 0x6602, 0xB0BA,\n\t0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, 0x6606, 0xC0A5,\t0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, 0xEABB,\n\t0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7,\t0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555,\n\t0x6613, 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556,\t0x6617, 0x9557, 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559,\n\t0x661B, 0x955A, 0x661C, 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C,\t0x661F, 0xD0C7, 0x6620, 0xD3B3, 0x6621, 0x955D, 0x6622, 0x955E,\n\t0x6623, 0x955F, 0x6624, 0x9560, 0x6625, 0xB4BA, 0x6626, 0x9561,\t0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, 0x662A, 0x9563,\n\t0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, 0x9566,\t0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568,\n\t0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6,\t0x6637, 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D,\n\t0x663B, 0x956E, 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4,\t0x663F, 0x9570, 0x6640, 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572,\n\t0x6643, 0xBBCE, 0x6644, 0x9573, 0x6645, 0x9574, 0x6646, 0x9575,\t0x6647, 0x9576, 0x6648, 0x9577, 0x6649, 0x9578, 0x664A, 0x9579,\n\t0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, 0x664E, 0x957B,\t0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, 0xC9B9,\n\t0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD,\t0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED,\n\t0x665B, 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584,\t0x665F, 0xEAC9, 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586,\n\t0x6663, 0x9587, 0x6664, 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE,\t0x6667, 0x9589, 0x6668, 0xB3BF, 0x6669, 0x958A, 0x666A, 0x958B,\n\t0x666B, 0x958C, 0x666C, 0x958D, 0x666D, 0x958E, 0x666E, 0xC6D5,\t0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, 0x6672, 0x9590,\n\t0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, 0xBEA7,\t0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7,\n\t0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0,\t0x667F, 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD,\n\t0x6683, 0x959B, 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D,\t0x6687, 0xCFBE, 0x6688, 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0,\n\t0x668B, 0x95A1, 0x668C, 0xEAD2, 0x668D, 0x95A2, 0x668E, 0x95A3,\t0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, 0xCAEE, 0x6692, 0x95A6,\n\t0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, 0x6696, 0xC5AF,\t0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, 0x95AC,\n\t0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF,\t0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3,\n\t0x66A3, 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7,\t0x66A7, 0xEAD3, 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9,\n\t0x66AB, 0x95BA, 0x66AC, 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA,\t0x66AF, 0x95BD, 0x66B0, 0x95BE, 0x66B1, 0x95BF, 0x66B2, 0x95C0,\n\t0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, 0x95C2, 0x66B6, 0x95C3,\t0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, 0x66BA, 0x95C6,\n\t0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, 0xEAD5,\t0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD,\n\t0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1,\t0x66C7, 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5,\n\t0x66CB, 0x95D6, 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9,\t0x66CF, 0x95DA, 0x66D0, 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD,\n\t0x66D3, 0x95DE, 0x66D4, 0x95DF, 0x66D5, 0x95E0, 0x66D6, 0x95E1,\t0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, 0xCAEF, 0x66DA, 0x95E4,\n\t0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, 0x66DE, 0x95E5,\t0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, 0x95E9,\n\t0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8,\t0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF,\n\t0x66EB, 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3,\t0x66EF, 0x95F4, 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA,\n\t0x66F3, 0xD2B7, 0x66F4, 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7,\t0x66F7, 0xEAC2, 0x66F8, 0x95F8, 0x66F9, 0xB2DC, 0x66FA, 0x95F9,\n\t0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, 0x95FB, 0x66FE, 0xD4F8,\t0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, 0x6702, 0x95FD,\n\t0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, 0x9642,\t0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3,\n\t0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645,\t0x670F, 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648,\n\t0x6713, 0x9649, 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A,\t0x6717, 0xC0CA, 0x6718, 0x964B, 0x6719, 0x964C, 0x671A, 0x964D,\n\t0x671B, 0xCDFB, 0x671C, 0x964E, 0x671D, 0xB3AF, 0x671E, 0x964F,\t0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, 0x9651, 0x6722, 0x9652,\n\t0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, 0x6726, 0xEBFC,\t0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, 0xCEB4,\n\t0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658,\t0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A,\n\t0x6733, 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C,\t0x6737, 0x965D, 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA,\n\t0x673B, 0x9660, 0x673C, 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662,\t0x673F, 0x9663, 0x6740, 0xC9B1, 0x6741, 0x9664, 0x6742, 0xD4D3,\n\t0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, 0x9666, 0x6746, 0xB8CB,\t0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, 0x674A, 0x9668,\n\t0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, 0xC0EE,\t0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B,\n\t0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8,\t0x6757, 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671,\n\t0x675B, 0x9672, 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD,\t0x675F, 0xCAF8, 0x6760, 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674,\n\t0x6763, 0x9675, 0x6764, 0x9676, 0x6765, 0xC0B4, 0x6766, 0x9677,\t0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, 0xE8BF, 0x676A, 0xE8C2,\n\t0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, 0x676E, 0x967B,\t0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, 0xEABD,\n\t0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E,\t0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682,\n\t0x677B, 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9,\t0x677F, 0xB0E5, 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686,\n\t0x6783, 0x9687, 0x6784, 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689,\t0x6787, 0xE8C1, 0x6788, 0x968A, 0x6789, 0xCDF7, 0x678A, 0x968B,\n\t0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, 0x968D, 0x678E, 0x968E,\t0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, 0x6792, 0x9691,\n\t0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, 0x9694,\t0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6,\n\t0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8,\t0x679F, 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0,\n\t0x67A3, 0xD4E6, 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B,\t0x67A7, 0xE8C5, 0x67A8, 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9,\n\t0x67AB, 0xB7E3, 0x67AC, 0x969D, 0x67AD, 0xE8C9, 0x67AE, 0x969E,\t0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, 0x969F, 0x67B2, 0x96A0,\n\t0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, 0x67B6, 0xBCDC,\t0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, 0x96A3,\n\t0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7,\t0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA,\n\t0x67C3, 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC,\t0x67C7, 0x96AD, 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0,\n\t0x67CB, 0x96B1, 0x67CC, 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4,\t0x67CF, 0xB0D8, 0x67D0, 0xC4B3, 0x67D1, 0xB8CC, 0x67D2, 0xC6E2,\n\t0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, 0x96B5, 0x67D6, 0x96B6,\t0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, 0x67DA, 0xE8D6,\n\t0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, 0xD7F5,\t0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC,\n\t0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD,\t0x67E7, 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0,\n\t0x67EB, 0x96C1, 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3,\t0x67EF, 0xBFC2, 0x67F0, 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4,\n\t0x67F3, 0xC1F8, 0x67F4, 0xB2F1, 0x67F5, 0x96C5, 0x67F6, 0x96C6,\t0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, 0x96C9, 0x67FA, 0x96CA,\n\t0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, 0x67FE, 0x96CD,\t0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, 0x96CF,\n\t0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2,\t0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0,\n\t0x680B, 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD,\t0x680F, 0xC0B8, 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5,\n\t0x6813, 0xCBA8, 0x6814, 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC,\t0x6817, 0xC0F5, 0x6818, 0x96D8, 0x6819, 0x96D9, 0x681A, 0x96DA,\n\t0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, 0xE8E9, 0x681E, 0x96DD,\t0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, 0x6822, 0x96E0,\n\t0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, 0x96E4,\t0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA,\n\t0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA,\t0x682F, 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0,\n\t0x6833, 0xE8E1, 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0,\t0x6837, 0xD1F9, 0x6838, 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1,\n\t0x683B, 0x96F2, 0x683C, 0xB8F1, 0x683D, 0xD4D4, 0x683E, 0xE8EF,\t0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, 0xE8EC, 0x6842, 0xB9F0,\n\t0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, 0x6846, 0xBFF2,\t0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, 0xE8F0,\n\t0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4,\t0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8,\n\t0x6853, 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9,\t0x6857, 0x96FA, 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD,\n\t0x685B, 0x96FE, 0x685C, 0x9740, 0x685D, 0x9741, 0x685E, 0x9742,\t0x685F, 0x9743, 0x6860, 0xE8E2, 0x6861, 0xE8E3, 0x6862, 0xE8E5,\n\t0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, 0xC7C5, 0x6866, 0xE8EB,\t0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, 0x686A, 0x9744,\n\t0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, 0x9747,\t0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B,\n\t0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0,\t0x6877, 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750,\n\t0x687B, 0x9751, 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754,\t0x687F, 0x9755, 0x6880, 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757,\n\t0x6883, 0xE8E8, 0x6884, 0x9758, 0x6885, 0xC3B7, 0x6886, 0xB0F0,\t0x6887, 0x9759, 0x6888, 0x975A, 0x6889, 0x975B, 0x688A, 0x975C,\n\t0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, 0x688E, 0x9760,\t0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, 0x9763,\n\t0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766,\t0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769,\n\t0x689B, 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D,\t0x689F, 0x976E, 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2,\n\t0x68A3, 0x9771, 0x68A4, 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE,\t0x68A7, 0xCEE0, 0x68A8, 0xC0E6, 0x68A9, 0x9774, 0x68AA, 0x9775,\n\t0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, 0xCBF3, 0x68AE, 0x9778,\t0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, 0x68B2, 0x977A,\n\t0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, 0x977C,\t0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781,\n\t0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785,\t0x68BF, 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9,\n\t0x68C3, 0x9788, 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B,\t0x68C7, 0x978C, 0x68C8, 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E,\n\t0x68CB, 0xC6E5, 0x68CC, 0x978F, 0x68CD, 0xB9F7, 0x68CE, 0x9790,\t0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, 0x9793, 0x68D2, 0xB0F4,\n\t0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, 0x68D6, 0x9796,\t0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, 0xC5EF,\n\t0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C,\t0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F,\n\t0x68E3, 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2,\t0x68E7, 0x97A3, 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6,\n\t0x68EB, 0x97A7, 0x68EC, 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD,\t0x68EF, 0x97AA, 0x68F0, 0xE9A2, 0x68F1, 0xC0E2, 0x68F2, 0x97AB,\n\t0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, 0xBFC3, 0x68F6, 0x97AE,\t0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, 0x68FA, 0xB9D7,\n\t0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, 0x97B3,\t0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6,\n\t0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9,\t0x6907, 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD,\n\t0x690B, 0xE9A3, 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5,\t0x690F, 0x97BF, 0x6910, 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7,\n\t0x6913, 0x97C1, 0x6914, 0x97C2, 0x6915, 0x97C3, 0x6916, 0x97C4,\t0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, 0x97C7, 0x691A, 0x97C8,\n\t0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, 0x691E, 0x97CC,\t0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, 0x97CE,\n\t0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1,\t0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5,\n\t0x692B, 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8,\t0x692F, 0x97D9, 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB,\n\t0x6933, 0x97DC, 0x6934, 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE,\t0x6937, 0x97DF, 0x6938, 0x97E0, 0x6939, 0xE9A9, 0x693A, 0x97E1,\n\t0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, 0xB4AA, 0x693E, 0x97E4,\t0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, 0x6942, 0xE9AB,\n\t0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, 0x97EA,\t0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE,\n\t0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2,\t0x694F, 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6,\n\t0x6953, 0x97F7, 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9,\t0x6957, 0xE9A5, 0x6958, 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE,\n\t0x695B, 0x97FC, 0x695C, 0x97FD, 0x695D, 0xE9AC, 0x695E, 0xC0E3,\t0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, 0x9840, 0x6962, 0x9841,\n\t0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, 0x6966, 0xE9B8,\t0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, 0x9847,\n\t0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA,\t0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C,\n\t0x6973, 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850,\t0x6977, 0xBFAC, 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851,\n\t0x697B, 0x9852, 0x697C, 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854,\t0x697F, 0x9855, 0x6980, 0xE9AF, 0x6981, 0x9856, 0x6982, 0xB8C5,\n\t0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, 0x9858, 0x6986, 0xD3DC,\t0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, 0x698A, 0x9859,\n\t0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, 0x985C,\t0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860,\n\t0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862,\t0x6997, 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865,\n\t0x699B, 0xE9BB, 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867,\t0x699F, 0x9868, 0x69A0, 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B,\n\t0x69A3, 0x986C, 0x69A4, 0x986D, 0x69A5, 0x986E, 0x69A6, 0x986F,\t0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, 0x9870, 0x69AA, 0x9871,\n\t0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, 0x69AE, 0x9873,\t0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, 0x9876,\n\t0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879,\t0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C,\n\t0x69BB, 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880,\t0x69BF, 0x9881, 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883,\n\t0x69C3, 0x9884, 0x69C4, 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887,\t0x69C7, 0x9888, 0x69C8, 0x9889, 0x69C9, 0x988A, 0x69CA, 0xE9C3,\n\t0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, 0x988C, 0x69CE, 0xE9B6,\t0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, 0x69D2, 0x988F,\n\t0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, 0x9892,\t0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896,\n\t0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899,\t0x69DF, 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B,\n\t0x69E3, 0x989C, 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F,\t0x69E7, 0x98A0, 0x69E8, 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3,\n\t0x69EB, 0x98A4, 0x69EC, 0x98A5, 0x69ED, 0xE9CA, 0x69EE, 0x98A6,\t0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, 0x98A9, 0x69F2, 0xE9CE,\n\t0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, 0x69F6, 0x98AD,\t0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, 0x98B1,\n\t0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4,\t0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7,\n\t0x6A03, 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB,\t0x6A07, 0x98BC, 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE,\n\t0x6A0B, 0x98BF, 0x6A0C, 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2,\t0x6A0F, 0x98C3, 0x6A10, 0x98C4, 0x6A11, 0x98C5, 0x6A12, 0x98C6,\n\t0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, 0x98C9, 0x6A16, 0x98CA,\t0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, 0x6A1A, 0x98CC,\n\t0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, 0x98D0,\t0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2,\n\t0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6,\t0x6A27, 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1,\n\t0x6A2B, 0x98D9, 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC,\t0x6A2F, 0xE9C9, 0x6A30, 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE,\n\t0x6A33, 0x98DF, 0x6A34, 0x98E0, 0x6A35, 0xE9D4, 0x6A36, 0x98E1,\t0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, 0x98E4, 0x6A3A, 0x98E5,\n\t0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, 0x6A3E, 0xE9D0,\t0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, 0x98EB,\n\t0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE,\t0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1,\n\t0x6A4B, 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5,\t0x6A4F, 0x98F6, 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8,\n\t0x6A53, 0x98F9, 0x6A54, 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC,\t0x6A57, 0x98FD, 0x6A58, 0xE9D9, 0x6A59, 0xB3C8, 0x6A5A, 0x98FE,\n\t0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, 0x9941, 0x6A5E, 0x9942,\t0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, 0x6A62, 0x9945,\n\t0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, 0x9948,\t0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C,\n\t0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950,\t0x6A6F, 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953,\n\t0x6A73, 0x9954, 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957,\t0x6A77, 0x9958, 0x6A78, 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A,\n\t0x6A7B, 0x995B, 0x6A7C, 0xE9DA, 0x6A7D, 0x995C, 0x6A7E, 0x995D,\t0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, 0x995F, 0x6A82, 0x9960,\n\t0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, 0x6A86, 0x9963,\t0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, 0x9967,\n\t0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5,\t0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C,\n\t0x6A93, 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970,\t0x6A97, 0xE9DE, 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973,\n\t0x6A9B, 0x9974, 0x6A9C, 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977,\t0x6A9F, 0x9978, 0x6AA0, 0xE9D1, 0x6AA1, 0x9979, 0x6AA2, 0x997A,\n\t0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, 0x997D, 0x6AA6, 0x997E,\t0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, 0x6AAA, 0x9982,\n\t0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, 0x9984,\t0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988,\n\t0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C,\t0x6AB7, 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990,\n\t0x6ABB, 0x9991, 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994,\t0x6ABF, 0x9995, 0x6AC0, 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998,\n\t0x6AC3, 0x9999, 0x6AC4, 0x999A, 0x6AC5, 0x999B, 0x6AC6, 0x999C,\t0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, 0x999F, 0x6ACA, 0x99A0,\n\t0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, 0x6ACE, 0x99A4,\t0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, 0x99A8,\n\t0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC,\t0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0,\n\t0x6ADB, 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4,\t0x6ADF, 0x99B5, 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8,\n\t0x6AE3, 0x99B9, 0x6AE4, 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC,\t0x6AE7, 0x99BD, 0x6AE8, 0x99BE, 0x6AE9, 0x99BF, 0x6AEA, 0x99C0,\n\t0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, 0x99C3, 0x6AEE, 0x99C4,\t0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, 0x6AF2, 0x99C8,\n\t0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, 0x99CC,\t0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0,\n\t0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4,\t0x6AFF, 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8,\n\t0x6B03, 0x99D9, 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC,\t0x6B07, 0x99DD, 0x6B08, 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0,\n\t0x6B0B, 0x99E1, 0x6B0C, 0x99E2, 0x6B0D, 0x99E3, 0x6B0E, 0x99E4,\t0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, 0x99E7, 0x6B12, 0x99E8,\n\t0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, 0x6B16, 0x99EC,\t0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, 0x99F0,\n\t0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4,\t0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6,\n\t0x6B23, 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7,\t0x6B27, 0xC5B7, 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA,\n\t0x6B2B, 0x99FB, 0x6B2C, 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE,\t0x6B2F, 0x9A40, 0x6B30, 0x9A41, 0x6B31, 0x9A42, 0x6B32, 0xD3FB,\n\t0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, 0x9A45, 0x6B36, 0x9A46,\t0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, 0x6B3A, 0xC6DB,\n\t0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, 0xBFEE,\t0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E,\n\t0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7,\t0x6B47, 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52,\n\t0x6B4B, 0x9A53, 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55,\t0x6B4F, 0x9A56, 0x6B50, 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59,\n\t0x6B53, 0x9A5A, 0x6B54, 0x9A5B, 0x6B55, 0x9A5C, 0x6B56, 0x9A5D,\t0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, 0xECA8, 0x6B5A, 0x9A60,\n\t0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, 0x6B5E, 0x9A64,\t0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, 0xD6B9,\n\t0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4,\t0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1,\n\t0x6B6B, 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D,\t0x6B6F, 0x9A6E, 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71,\n\t0x6B73, 0x9A72, 0x6B74, 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75,\t0x6B77, 0x9A76, 0x6B78, 0x9A77, 0x6B79, 0xB4F5, 0x6B7A, 0x9A78,\n\t0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, 0x9A79, 0x6B7E, 0x9A7A,\t0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, 0x6B82, 0xE9E3,\n\t0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, 0xB4F9,\t0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2,\n\t0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81,\t0x6B8F, 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6,\n\t0x6B93, 0xE9E7, 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3,\t0x6B97, 0x9A87, 0x6B98, 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9,\n\t0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C,\t0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, 0xE9EB, 0x6BA2, 0x9A8F,\n\t0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, 0x6BA6, 0x9A93,\t0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, 0xE9EC,\n\t0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A,\t0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E,\n\t0x6BB3, 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F,\t0x6BB7, 0xD2F3, 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2,\n\t0x6BBB, 0x9AA3, 0x6BBC, 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6,\t0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1,\n\t0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, 0xD2E3, 0x6BC6, 0x9AAA,\t0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, 0x6BCA, 0x9AAE,\n\t0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, 0x9AB0,\t0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE,\n\t0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1,\t0x6BD7, 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4,\n\t0x6BDB, 0xC3AB, 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7,\t0x6BDF, 0x9AB8, 0x6BE0, 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA,\n\t0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE,\t0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, 0x9AC1, 0x6BEA, 0xEBA4,\n\t0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, 0x6BEE, 0x9AC4,\t0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, 0x9AC7,\n\t0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9,\t0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC,\n\t0x6BFB, 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF,\t0x6BFF, 0x9AD0, 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3,\n\t0x6C03, 0x9AD4, 0x6C04, 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB,\t0x6C07, 0xEBAA, 0x6C08, 0x9AD6, 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8,\n\t0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, 0xEBAC, 0x6C0E, 0x9ADB,\t0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, 0x6C12, 0x9ADC,\n\t0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, 0xC4CA,\t0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0,\n\t0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0,\t0x6C1F, 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2,\n\t0x6C23, 0x9AE2, 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4,\t0x6C27, 0xD1F5, 0x6C28, 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4,\n\t0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA,\t0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, 0x9AE7, 0x6C32, 0xEBB5,\n\t0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, 0x6C36, 0x9AE9,\t0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, 0x9AEC,\n\t0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF,\t0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3,\n\t0x6C43, 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0,\t0x6C47, 0xBBE3, 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2,\n\t0x6C4B, 0x9AF5, 0x6C4C, 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8,\t0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, 0x6C51, 0x9AFA, 0x6C52, 0x9AFB,\n\t0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, 0xC9C7, 0x6C56, 0x9AFD,\t0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, 0x6C5A, 0x9B41,\n\t0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, 0xB9AF,\t0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42,\n\t0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45,\t0x6C67, 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4,\n\t0x6C6B, 0x9B47, 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A,\t0x6C6F, 0x9B4B, 0x6C70, 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3,\n\t0x6C73, 0x9B4D, 0x6C74, 0xE3EA, 0x6C75, 0x9B4E, 0x6C76, 0xE3EB,\t0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, 0xD0DA, 0x6C7A, 0x9B51,\n\t0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, 0x6C7E, 0xB7DA,\t0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, 0xD2CA,\n\t0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC,\t0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58,\n\t0x6C8B, 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B,\t0x6C8F, 0xC6E3, 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D,\n\t0x6C93, 0xEDB3, 0x6C94, 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F,\t0x6C97, 0x9B60, 0x6C98, 0x9B61, 0x6C99, 0xC9B3, 0x6C9A, 0x9B62,\n\t0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, 0x9B64, 0x6C9E, 0x9B65,\t0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, 0x6CA2, 0x9B67,\n\t0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, 0xC2D9,\t0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6,\n\t0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA,\t0x6CAF, 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5,\n\t0x6CB3, 0xBAD3, 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E,\t0x6CB7, 0x9B6F, 0x6CB8, 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70,\n\t0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4,\t0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, 0x9B72, 0x6CC2, 0x9B73,\n\t0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, 0x6CC6, 0x9B75,\t0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, 0xB2B4,\n\t0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A,\t0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D,\n\t0x6CD3, 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7,\t0x6CD7, 0xE3F4, 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81,\n\t0x6CDB, 0xB7BA, 0x6CDC, 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2,\t0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8,\n\t0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, 0xC4E0, 0x6CE6, 0x9B86,\t0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, 0x6CEA, 0xC0E1,\n\t0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, 0xE3FA,\t0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B,\n\t0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4,\t0x6CF7, 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8,\n\t0x6CFB, 0xD0BA, 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE,\t0x6CFF, 0x9B8E, 0x6D00, 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90,\n\t0x6D03, 0x9B91, 0x6D04, 0xE4A7, 0x6D05, 0x9B92, 0x6D06, 0x9B93,\t0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, 0x9B95, 0x6D0A, 0x9B96,\n\t0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, 0x6D0E, 0xE4A9,\t0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, 0xC8F7,\n\t0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E,\t0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE,\n\t0x6D1B, 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4,\t0x6D1F, 0x9BA2, 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5,\n\t0x6D23, 0x9BA6, 0x6D24, 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8,\t0x6D27, 0xE4A2, 0x6D28, 0x9BA9, 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9,\n\t0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, 0x9BAC, 0x6D2E, 0xE4AC,\t0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, 0x6D32, 0xD6DE,\n\t0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, 0x9BB0,\t0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3,\n\t0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9,\t0x6D3F, 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6,\n\t0x6D43, 0xE4A4, 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC,\t0x6D47, 0xBDBD, 0x6D48, 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7,\n\t0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3,\t0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, 0xBBEB, 0x6D52, 0xE4B0,\n\t0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, 0x6D56, 0x9BBC,\t0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, 0xBFA3,\n\t0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7,\t0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3,\n\t0x6D63, 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6,\t0x6D67, 0x9BC6, 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB,\n\t0x6D6B, 0x9BC8, 0x6D6C, 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1,\t0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, 0x6D71, 0x9BCC, 0x6D72, 0x9BCD,\n\t0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, 0x9BCF, 0x6D76, 0x9BD0,\t0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, 0x6D7A, 0x9BD2,\n\t0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, 0x9BD5,\t0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF,\n\t0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB,\t0x6D87, 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD,\n\t0x6D8B, 0x9BDE, 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1,\t0x6D8F, 0x9BE0, 0x6D90, 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2,\n\t0x6D93, 0xE4B8, 0x6D94, 0xE4B9, 0x6D95, 0xCCE9, 0x6D96, 0x9BE3,\t0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, 0x9BE6, 0x6D9A, 0x9BE7,\n\t0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, 0x6D9E, 0xE4B5,\t0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, 0x9BE9,\n\t0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3,\t0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2,\n\t0x6DAB, 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC,\t0x6DAF, 0xD1C4, 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA,\n\t0x6DB3, 0x9BEF, 0x6DB4, 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1,\t0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4,\n\t0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, 0x9BF7, 0x6DBE, 0x9BF8,\t0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, 0x6DC2, 0x9BFA,\n\t0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, 0xCFFD,\t0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE,\n\t0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41,\t0x6DCF, 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44,\n\t0x6DD3, 0x9C45, 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7,\t0x6DD7, 0x9C48, 0x6DD8, 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49,\n\t0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1,\t0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, 0xB5AD, 0x6DE2, 0x9C4D,\n\t0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, 0x6DE6, 0xE4C6,\t0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, 0x9C53,\n\t0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4,\t0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57,\n\t0x6DF3, 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A,\t0x6DF7, 0xBBEC, 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C,\n\t0x6DFB, 0xCCED, 0x6DFC, 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E,\t0x6DFF, 0x9C5F, 0x6E00, 0x9C60, 0x6E01, 0x9C61, 0x6E02, 0x9C62,\n\t0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, 0xC7E5, 0x6E06, 0x9C65,\t0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, 0x6E0A, 0xD4A8,\n\t0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, 0xE4C2,\t0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B,\n\t0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9,\t0x6E17, 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE,\n\t0x6E1B, 0x9C70, 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72,\t0x6E1F, 0x9C73, 0x6E20, 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74,\n\t0x6E23, 0xD4FC, 0x6E24, 0xB2B3, 0x6E25, 0xE4D7, 0x6E26, 0x9C75,\t0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, 0xCEC2, 0x6E2A, 0x9C78,\n\t0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, 0x6E2E, 0x9C7A,\t0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, 0xE4D6,\n\t0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80,\t0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC,\n\t0x6E3B, 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86,\t0x6E3F, 0x9C87, 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A,\n\t0x6E43, 0xC5C8, 0x6E44, 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C,\t0x6E47, 0x9C8D, 0x6E48, 0x9C8E, 0x6E49, 0x9C8F, 0x6E4A, 0x9C90,\n\t0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, 0xCDC4, 0x6E4E, 0xE4CF,\t0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, 0x6E52, 0x9C96,\n\t0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, 0xBAFE,\t0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A,\n\t0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D,\t0x6E5F, 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0,\n\t0x6E63, 0x9CA1, 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4,\t0x6E67, 0x9CA5, 0x6E68, 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8,\n\t0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE,\t0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, 0x9CAD, 0x6E72, 0x9CAE,\n\t0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, 0x6E76, 0x9CB2,\t0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, 0x9CB6,\n\t0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5,\t0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC,\n\t0x6E83, 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3,\t0x6E87, 0x9CBE, 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0,\n\t0x6E8B, 0x9CC1, 0x6E8C, 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4,\t0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, 0x6E91, 0x9CC5, 0x6E92, 0x9CC6,\n\t0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, 0x9CC9, 0x6E96, 0x9CCA,\t0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, 0x6E9A, 0x9CCD,\n\t0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, 0x9CD0,\t0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7,\n\t0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5,\t0x6EA7, 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA,\n\t0x6EAB, 0x9CD8, 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB,\t0x6EAF, 0xCBDD, 0x6EB0, 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1,\n\t0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC,\t0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, 0x9CE0, 0x6EBA, 0xC4E7,\n\t0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, 0x6EBE, 0x9CE2,\t0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, 0xE4E8,\n\t0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8,\t0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB,\n\t0x6ECB, 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE,\t0x6ECF, 0xE4E6, 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0,\n\t0x6ED3, 0xD7D2, 0x6ED4, 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1,\t0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6,\n\t0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, 0x9CF6, 0x6EDE, 0xD6CD,\t0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, 0x6EE2, 0xE4DE,\n\t0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, 0xC2D0,\t0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9,\n\t0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD,\t0x6EEF, 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42,\n\t0x6EF3, 0x9D43, 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45,\t0x6EF7, 0x9D46, 0x6EF8, 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48,\n\t0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C,\t0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, 0x9D4F, 0x6F02, 0xC6AF,\n\t0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, 0x6F06, 0xC6E1,\t0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, 0x9D55,\n\t0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59,\t0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C,\n\t0x6F13, 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D,\t0x6F17, 0x9D5E, 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61,\n\t0x6F1B, 0x9D62, 0x6F1C, 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65,\t0x6F1F, 0x9D66, 0x6F20, 0xC4AE, 0x6F21, 0x9D67, 0x6F22, 0x9D68,\n\t0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, 0x9D6A, 0x6F26, 0x9D6B,\t0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, 0x6F2A, 0xE4F4,\n\t0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, 0x9D6F,\t0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71,\n\t0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1,\t0x6F37, 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77,\n\t0x6F3B, 0x9D78, 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA,\t0x6F3F, 0x9D7B, 0x6F40, 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E,\n\t0x6F43, 0x9D80, 0x6F44, 0x9D81, 0x6F45, 0x9D82, 0x6F46, 0xE4EB,\t0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, 0x9D84, 0x6F4A, 0x9D85,\n\t0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, 0x6F4E, 0x9D87,\t0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, 0x9D8B,\n\t0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F,\t0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92,\n\t0x6F5B, 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA,\t0x6F5F, 0x9D95, 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA,\n\t0x6F63, 0x9D98, 0x6F64, 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA,\t0x6F67, 0x9D9B, 0x6F68, 0x9D9C, 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E,\n\t0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, 0xCCB6, 0x6F6E, 0xB3B1,\t0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, 0x6F72, 0xE4FB,\n\t0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, 0x9DA6,\t0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD,\n\t0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB,\t0x6F7F, 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF,\n\t0x6F83, 0x9DB0, 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2,\t0x6F87, 0x9DB3, 0x6F88, 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4,\n\t0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC,\t0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, 0x9DB8, 0x6F92, 0x9DB9,\n\t0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, 0x6F96, 0x9DBD,\t0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, 0x9DC1,\n\t0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4,\t0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7,\n\t0x6FA3, 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB,\t0x6FA7, 0xE5A2, 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE,\n\t0x6FAB, 0x9DCF, 0x6FAC, 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2,\t0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6,\n\t0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, 0x9DD8, 0x6FB6, 0xE5A4,\t0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, 0x6FBA, 0x9DDB,\n\t0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, 0x9DDF,\t0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5,\n\t0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5,\t0x6FC7, 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8,\n\t0x6FCB, 0x9DE9, 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC,\t0x6FCF, 0x9DED, 0x6FD0, 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4,\n\t0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2,\t0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, 0x9DF5, 0x6FDA, 0x9DF6,\n\t0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, 0x6FDE, 0xE5A8,\t0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, 0x9DFB,\n\t0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40,\t0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44,\n\t0x6FEB, 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7,\t0x6FEF, 0xE5AA, 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A,\n\t0x6FF3, 0x9E4B, 0x6FF4, 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E,\t0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, 0x6FF9, 0x9E51, 0x6FFA, 0x9E52,\n\t0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, 0x9E55, 0x6FFE, 0x9E56,\t0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, 0x7002, 0x9E5A,\n\t0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, 0x9E5E,\t0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62,\n\t0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66,\t0x700F, 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69,\n\t0x7013, 0x9E6A, 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D,\t0x7017, 0x9E6E, 0x7018, 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB,\n\t0x701B, 0xE5AD, 0x701C, 0x9E71, 0x701D, 0x9E72, 0x701E, 0x9E73,\t0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, 0x9E76, 0x7022, 0x9E77,\n\t0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, 0x7026, 0x9E7A,\t0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, 0x9E7E,\n\t0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83,\t0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87,\n\t0x7033, 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A,\t0x7037, 0x9E8B, 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D,\n\t0x703B, 0x9E8E, 0x703C, 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91,\t0x703F, 0x9E92, 0x7040, 0x9E93, 0x7041, 0x9E94, 0x7042, 0x9E95,\n\t0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, 0x9E98, 0x7046, 0x9E99,\t0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, 0x704A, 0x9E9D,\n\t0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, 0x9EA0,\t0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3,\n\t0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7,\t0x7057, 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB,\n\t0x705B, 0x9EAC, 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1,\t0x705F, 0x9EAF, 0x7060, 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2,\n\t0x7063, 0x9EB3, 0x7064, 0x9EB4, 0x7065, 0x9EB5, 0x7066, 0x9EB6,\t0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, 0x9EB9, 0x706A, 0x9EBA,\n\t0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, 0x706E, 0x9EBB,\t0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, 0x9EBD,\n\t0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE,\t0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2,\n\t0x707B, 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6,\t0x707F, 0xB2D3, 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6,\n\t0x7083, 0x9EC7, 0x7084, 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9,\t0x7087, 0x9ECA, 0x7088, 0x9ECB, 0x7089, 0xC2AF, 0x708A, 0xB4B6,\n\t0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, 0x9ECE, 0x708E, 0xD1D7,\t0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, 0x7092, 0xB3B4,\n\t0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, 0xECC0,\t0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5,\n\t0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7,\t0x709F, 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB,\n\t0x70A3, 0x9EDC, 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF,\t0x70A7, 0x9EE0, 0x70A8, 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3,\n\t0x70AB, 0xECC5, 0x70AC, 0xBEE6, 0x70AD, 0xCCBF, 0x70AE, 0xC5DA,\t0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, 0xECC6, 0x70B2, 0x9EE5,\n\t0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, 0x70B6, 0x9EE8,\t0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, 0x9EE9,\n\t0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA,\t0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3,\n\t0x70C3, 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE,\t0x70C7, 0x9EEF, 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8,\n\t0x70CB, 0x9EF1, 0x70CC, 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4,\t0x70CF, 0x9EF5, 0x70D0, 0x9EF6, 0x70D1, 0x9EF7, 0x70D2, 0x9EF8,\n\t0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, 0x9EFB, 0x70D6, 0x9EFC,\t0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, 0x70DA, 0x9EFE,\n\t0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, 0x9F42,\t0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45,\n\t0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3,\t0x70E7, 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48,\n\t0x70EB, 0xCCCC, 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49,\t0x70EF, 0xCFA9, 0x70F0, 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C,\n\t0x70F3, 0x9F4D, 0x70F4, 0x9F4E, 0x70F5, 0x9F4F, 0x70F6, 0x9F50,\t0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, 0xC5EB, 0x70FA, 0x9F52,\n\t0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, 0x70FE, 0x9F55,\t0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, 0x9F59,\n\t0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D,\t0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8,\n\t0x710B, 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63,\t0x710F, 0x9F64, 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66,\n\t0x7113, 0xECCA, 0x7114, 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB,\t0x7117, 0x9F68, 0x7118, 0xECE2, 0x7119, 0xB1BA, 0x711A, 0xB7D9,\n\t0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, 0x9F6B, 0x711E, 0x9F6C,\t0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, 0x7122, 0x9F70,\n\t0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, 0xBDB9,\t0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77,\n\t0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B,\t0x712F, 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C,\n\t0x7133, 0x9F7D, 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB,\t0x7137, 0x9F81, 0x7138, 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84,\n\t0x713B, 0x9F85, 0x713C, 0x9F86, 0x713D, 0x9F87, 0x713E, 0x9F88,\t0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, 0x9F8B, 0x7142, 0x9F8C,\n\t0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, 0x7146, 0x9F8F,\t0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, 0xECD3,\n\t0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5,\t0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98,\n\t0x7153, 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C,\t0x7157, 0x9F9D, 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0,\n\t0x715B, 0x9FA1, 0x715C, 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7,\t0x715F, 0x9FA3, 0x7160, 0x9FA4, 0x7161, 0x9FA5, 0x7162, 0x9FA6,\n\t0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, 0x9FA8, 0x7166, 0xECE3,\t0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, 0x716A, 0x9FAA,\n\t0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, 0xD6F3,\t0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2,\n\t0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3,\t0x7177, 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5,\n\t0x717B, 0x9FB6, 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8,\t0x717F, 0x9FB9, 0x7180, 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC,\n\t0x7183, 0x9FBD, 0x7184, 0xCFA8, 0x7185, 0x9FBE, 0x7186, 0x9FBF,\t0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, 0x9FC2, 0x718A, 0xD0DC,\n\t0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, 0x718E, 0x9FC6,\t0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, 0x9FC9,\n\t0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC,\t0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE,\n\t0x719B, 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2,\t0x719F, 0xCAEC, 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4,\n\t0x71A3, 0x9FD5, 0x71A4, 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8,\t0x71A7, 0x9FD9, 0x71A8, 0xECD9, 0x71A9, 0x9FDA, 0x71AA, 0x9FDB,\n\t0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, 0x9FDD, 0x71AE, 0x9FDE,\t0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, 0x71B2, 0x9FE2,\n\t0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, 0x9FE4,\t0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7,\n\t0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB,\t0x71BF, 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF,\n\t0x71C3, 0xC8BC, 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2,\t0x71C7, 0x9FF3, 0x71C8, 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6,\n\t0x71CB, 0x9FF7, 0x71CC, 0x9FF8, 0x71CD, 0x9FF9, 0x71CE, 0xC1C7,\t0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, 0x9FFC, 0x71D2, 0x9FFD,\n\t0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, 0x71D6, 0xA040,\t0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, 0xA044,\n\t0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048,\t0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B,\n\t0x71E3, 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E,\t0x71E7, 0xECDD, 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051,\n\t0x71EB, 0xA052, 0x71EC, 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6,\t0x71EF, 0xA055, 0x71F0, 0xA056, 0x71F1, 0xA057, 0x71F2, 0xA058,\n\t0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, 0xA05B, 0x71F6, 0xA05C,\t0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, 0x71FA, 0xA05F,\n\t0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, 0xA063,\t0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067,\n\t0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC,\t0x7207, 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E,\n\t0x720B, 0xA06F, 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072,\t0x720F, 0xA073, 0x7210, 0xA074, 0x7211, 0xA075, 0x7212, 0xA076,\n\t0x7213, 0xA077, 0x7214, 0xA078, 0x7215, 0xA079, 0x7216, 0xA07A,\t0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, 0xA07D, 0x721A, 0xA07E,\n\t0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, 0x721E, 0xA082,\t0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, 0xA086,\n\t0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A,\t0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6,\n\t0x722B, 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F,\t0x722F, 0xA090, 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091,\n\t0x7233, 0xA092, 0x7234, 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8,\t0x7237, 0xD2AF, 0x7238, 0xB0D6, 0x7239, 0xB5F9, 0x723A, 0xA094,\n\t0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, 0xCBAC, 0x723E, 0xA096,\t0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, 0x7242, 0xA099,\n\t0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, 0xA09D,\t0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F,\n\t0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1,\t0x724F, 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA,\n\t0x7253, 0xA0A5, 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB,\t0x7257, 0xA0A8, 0x7258, 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA,\n\t0x725B, 0xC5A3, 0x725C, 0xA0AB, 0x725D, 0xEAF2, 0x725E, 0xA0AC,\t0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, 0xC4B5, 0x7262, 0xC0CE,\n\t0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, 0x7266, 0xEAF3,\t0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, 0xA0B2,\n\t0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0,\t0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC,\n\t0x7273, 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA,\t0x7277, 0xA0BB, 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE,\n\t0x727B, 0xA0BD, 0x727C, 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5,\t0x727F, 0xEAF6, 0x7280, 0xCFAC, 0x7281, 0xC0E7, 0x7282, 0xA0C0,\n\t0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, 0xA0C2, 0x7286, 0xA0C3,\t0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, 0x728A, 0xB6BF,\n\t0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, 0xA0C8,\t0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB,\n\t0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE,\t0x7297, 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2,\n\t0x729B, 0xA0D3, 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6,\t0x729F, 0xEAF1, 0x72A0, 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9,\n\t0x72A3, 0xA0DA, 0x72A4, 0xA0DB, 0x72A5, 0xA0DC, 0x72A6, 0xA0DD,\t0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, 0xA0E0, 0x72AA, 0xA0E1,\n\t0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, 0x72AE, 0xA0E3,\t0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, 0xA0E5,\n\t0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4,\t0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8,\n\t0x72BB, 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC,\t0x72BF, 0xA0ED, 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1,\n\t0x72C3, 0xE1F0, 0x72C4, 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0,\t0x72C7, 0xA0F1, 0x72C8, 0xB1B7, 0x72C9, 0xA0F2, 0x72CA, 0xA0F3,\n\t0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, 0xE1F3, 0x72CE, 0xE1F2,\t0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, 0x72D2, 0xE1F4,\n\t0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, 0xA0FB,\t0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD,\n\t0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC,\t0x72DF, 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43,\n\t0x72E3, 0xAA44, 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47,\t0x72E7, 0xAA48, 0x72E8, 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49,\n\t0x72EB, 0xAA4A, 0x72EC, 0xB6C0, 0x72ED, 0xCFC1, 0x72EE, 0xCAA8,\t0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, 0xD3FC, 0x72F2, 0xE1F8,\n\t0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, 0x72F6, 0xAA4C,\t0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, 0xE1FE,\n\t0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F,\t0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52,\n\t0x7303, 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55,\t0x7307, 0xAA56, 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5,\n\t0x730B, 0xAA59, 0x730C, 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4,\t0x730F, 0xAA5C, 0x7310, 0xAA5D, 0x7311, 0xAA5E, 0x7312, 0xAA5F,\n\t0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, 0xE2A8, 0x7316, 0xB2FE,\t0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, 0x731A, 0xAA63,\n\t0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, 0xE2A6,\t0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9,\n\t0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68,\t0x7327, 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED,\n\t0x732B, 0xC3A8, 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7,\t0x732F, 0xAA6C, 0x7330, 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E,\n\t0x7333, 0xAA6F, 0x7334, 0xBAEF, 0x7335, 0xAA70, 0x7336, 0xAA71,\t0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, 0xE2AA, 0x733A, 0xAA72,\n\t0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, 0x733E, 0xBBAB,\t0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, 0xAA78,\n\t0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C,\t0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81,\n\t0x734B, 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84,\t0x734F, 0xAA85, 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1,\n\t0x7353, 0xAA87, 0x7354, 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A,\t0x7357, 0xE2B1, 0x7358, 0xAA8B, 0x7359, 0xAA8C, 0x735A, 0xAA8D,\n\t0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, 0xAA90, 0x735E, 0xAA91,\t0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, 0x7362, 0xAA94,\n\t0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, 0xAA98,\t0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C,\n\t0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E,\t0x736F, 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40,\n\t0x7373, 0xAB41, 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44,\t0x7377, 0xAB45, 0x7378, 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48,\n\t0x737B, 0xAB49, 0x737C, 0xAB4A, 0x737D, 0xAB4B, 0x737E, 0xE2B5,\t0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, 0xAB4E, 0x7382, 0xAB4F,\n\t0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, 0x7386, 0xAB52,\t0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, 0xAB54,\n\t0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0,\t0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59,\n\t0x7393, 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1,\t0x7397, 0xAB5D, 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60,\n\t0x739B, 0xC2EA, 0x739C, 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63,\t0x739F, 0xE7E4, 0x73A0, 0xAB64, 0x73A1, 0xAB65, 0x73A2, 0xE7E3,\n\t0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, 0xAB68, 0x73A6, 0xAB69,\t0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, 0x73AA, 0xAB6C,\n\t0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, 0xE7E2,\t0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1,\n\t0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72,\t0x73B7, 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4,\n\t0x73BB, 0xB2A3, 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77,\t0x73BF, 0xAB78, 0x73C0, 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6,\n\t0x73C3, 0xAB7A, 0x73C4, 0xAB7B, 0x73C5, 0xAB7C, 0x73C6, 0xAB7D,\t0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, 0xE7EB, 0x73CA, 0xC9BA,\n\t0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, 0x73CE, 0xAB82,\t0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, 0xAB83,\n\t0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87,\t0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A,\n\t0x73DB, 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3,\t0x73DF, 0xAB8E, 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90,\n\t0x73E3, 0xAB91, 0x73E4, 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93,\t0x73E7, 0xE7F2, 0x73E8, 0xAB94, 0x73E9, 0xE7F1, 0x73EA, 0xAB95,\n\t0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, 0xB0E0, 0x73EE, 0xAB98,\t0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, 0x73F2, 0xE7F5,\n\t0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, 0xAB9F,\t0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42,\n\t0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46,\t0x73FF, 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A,\n\t0x7403, 0xC7F2, 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED,\t0x7407, 0xAC4C, 0x7408, 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0,\n\t0x740B, 0xAC4E, 0x740C, 0xAC4F, 0x740D, 0xAC50, 0x740E, 0xAC51,\t0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, 0xAC52, 0x7412, 0xAC53,\n\t0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, 0x7416, 0xAC57,\t0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, 0xE8A2,\n\t0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D,\t0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1,\n\t0x7423, 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9,\t0x7427, 0xAC63, 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7,\n\t0x742B, 0xAC65, 0x742C, 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD,\t0x742F, 0xAC67, 0x7430, 0xE7FC, 0x7431, 0xAC68, 0x7432, 0xAC69,\n\t0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, 0xC5FD, 0x7436, 0xC5C3,\t0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, 0x743A, 0xAC6D,\n\t0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, 0xAC70,\t0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73,\n\t0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77,\t0x7447, 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B,\n\t0x744B, 0xAC7C, 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80,\t0x744F, 0xAC81, 0x7450, 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84,\n\t0x7453, 0xAC85, 0x7454, 0xAC86, 0x7455, 0xE8A6, 0x7456, 0xAC87,\t0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, 0xE8A7, 0x745A, 0xBAF7,\n\t0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, 0x745E, 0xC8F0,\t0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, 0xAC8C,\n\t0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90,\t0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94,\n\t0x746B, 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97,\t0x746F, 0xAC98, 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A,\n\t0x7473, 0xAC9B, 0x7474, 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE,\t0x7477, 0xE8A8, 0x7478, 0xAC9E, 0x7479, 0xAC9F, 0x747A, 0xACA0,\n\t0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, 0xAD42, 0x747E, 0xE8AA,\t0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, 0x7482, 0xAD44,\n\t0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, 0xAD47,\t0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A,\n\t0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC,\t0x748F, 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F,\n\t0x7493, 0xAD50, 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53,\t0x7497, 0xAD54, 0x7498, 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57,\n\t0x749B, 0xAD58, 0x749C, 0xE8AB, 0x749D, 0xAD59, 0x749E, 0xE8B1,\t0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, 0xAD5C, 0x74A2, 0xAD5D,\n\t0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, 0x74A6, 0xAD61,\t0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, 0xAD62,\n\t0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66,\t0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A,\n\t0x74B3, 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E,\t0x74B7, 0xAD6F, 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7,\n\t0x74BB, 0xAD72, 0x74BC, 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75,\t0x74BF, 0xAD76, 0x74C0, 0xAD77, 0x74C1, 0xAD78, 0x74C2, 0xAD79,\n\t0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, 0xAD7C, 0x74C6, 0xAD7D,\t0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, 0x74CA, 0xAD82,\n\t0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, 0xAD86,\t0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6,\n\t0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D,\t0x74D7, 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91,\n\t0x74DB, 0xAD92, 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC,\t0x74DF, 0xAD94, 0x74E0, 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0,\n\t0x74E3, 0xB0EA, 0x74E4, 0xC8BF, 0x74E5, 0xAD96, 0x74E6, 0xCDDF,\t0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, 0xAD99, 0x74EA, 0xAD9A,\n\t0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, 0x74EE, 0xCECD,\t0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, 0xADA0,\n\t0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF,\t0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44,\n\t0x74FB, 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48,\t0x74FF, 0xEAB3, 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B,\n\t0x7503, 0xAE4C, 0x7504, 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E,\t0x7507, 0xAE4F, 0x7508, 0xAE50, 0x7509, 0xAE51, 0x750A, 0xAE52,\n\t0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, 0xDDF9, 0x750E, 0xAE55,\t0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, 0x7512, 0xAE57,\n\t0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, 0xAE5A,\t0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5,\n\t0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E,\t0x751F, 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61,\n\t0x7523, 0xAE62, 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64,\t0x7527, 0xAE65, 0x7528, 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66,\n\t0x752B, 0xB8A6, 0x752C, 0xF0AE, 0x752D, 0xB1C2, 0x752E, 0xAE67,\t0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, 0xD3C9, 0x7532, 0xBCD7,\n\t0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, 0x7536, 0xAE69,\t0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, 0xEEAE,\n\t0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE,\t0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F,\n\t0x7543, 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72,\t0x7547, 0xAE73, 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75,\n\t0x754B, 0xEEB1, 0x754C, 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0,\t0x754F, 0xCEB7, 0x7550, 0xAE77, 0x7551, 0xAE78, 0x7552, 0xAE79,\n\t0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, 0xAE7B, 0x7556, 0xAE7C,\t0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, 0x755A, 0xDBCE,\n\t0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, 0xAE81,\t0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85,\n\t0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8,\t0x7567, 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC,\n\t0x756B, 0xAE8B, 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E,\t0x756F, 0xAE8F, 0x7570, 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4,\n\t0x7573, 0xAE92, 0x7574, 0xB3EB, 0x7575, 0xAE93, 0x7576, 0xAE94,\t0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, 0xEEB5, 0x757A, 0xAE96,\n\t0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, 0x757E, 0xAE9A,\t0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, 0xAE9D,\n\t0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE,\t0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42,\n\t0x758B, 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45,\t0x758F, 0xCAE8, 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA,\n\t0x7593, 0xAF47, 0x7594, 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC,\t0x7597, 0xC1C6, 0x7598, 0xAF49, 0x7599, 0xB8ED, 0x759A, 0xBECE,\n\t0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, 0xF0DE, 0x759E, 0xAF4C,\t0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, 0x75A2, 0xAF4D,\n\t0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, 0xAF4E,\t0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52,\n\t0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF,\t0x75AF, 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3,\n\t0x75B3, 0xF0E1, 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54,\t0x75B7, 0xAF55, 0x75B8, 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56,\n\t0x75BB, 0xAF57, 0x75BC, 0xCCDB, 0x75BD, 0xBED2, 0x75BE, 0xBCB2,\t0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, 0xAF5A, 0x75C2, 0xF0E8,\n\t0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, 0x75C6, 0xAF5B,\t0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, 0xC8AC,\n\t0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E,\t0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7,\n\t0x75D3, 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9,\t0x75D7, 0xAF63, 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65,\n\t0x75DB, 0xCDB4, 0x75DC, 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6,\t0x75DF, 0xAF68, 0x75E0, 0xAF69, 0x75E1, 0xAF6A, 0x75E2, 0xC1A1,\n\t0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, 0xAF6B, 0x75E6, 0xF0ED,\t0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, 0x75EA, 0xBBBE,\n\t0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, 0xAF6F,\t0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71,\n\t0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74,\t0x75F7, 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77,\n\t0x75FB, 0xAF78, 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A,\t0x75FF, 0xF0F4, 0x7600, 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B,\n\t0x7603, 0xF0F1, 0x7604, 0xAF7C, 0x7605, 0xF0F7, 0x7606, 0xAF7D,\t0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, 0xAF81, 0x760A, 0xF0FA,\n\t0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, 0x760E, 0xAF84,\t0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, 0xAF87,\n\t0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A,\t0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B,\n\t0x761B, 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E,\t0x761F, 0xCEC1, 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3,\n\t0x7623, 0xAF90, 0x7624, 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD,\t0x7627, 0xAF91, 0x7628, 0xAF92, 0x7629, 0xB4F1, 0x762A, 0xB1F1,\n\t0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, 0xF1A6, 0x762E, 0xAF94,\t0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, 0x7632, 0xAF97,\n\t0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, 0xAF98,\t0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B,\n\t0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB,\t0x763F, 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F,\n\t0x7643, 0xF1AA, 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041,\t0x7647, 0xB042, 0x7648, 0xB043, 0x7649, 0xB044, 0x764A, 0xB045,\n\t0x764B, 0xB046, 0x764C, 0xB0A9, 0x764D, 0xF1AD, 0x764E, 0xB047,\t0x764F, 0xB048, 0x7650, 0xB049, 0x7651, 0xB04A, 0x7652, 0xB04B,\n\t0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, 0x7656, 0xF1B1,\t0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, 0xB051,\n\t0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE,\t0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057,\n\t0x7663, 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A,\t0x7667, 0xB05B, 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E,\n\t0x766B, 0xF1B2, 0x766C, 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061,\t0x766F, 0xF1B3, 0x7670, 0xB062, 0x7671, 0xB063, 0x7672, 0xB064,\n\t0x7673, 0xB065, 0x7674, 0xB066, 0x7675, 0xB067, 0x7676, 0xB068,\t0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, 0x767A, 0xB06B,\n\t0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, 0xB0D9,\t0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED,\n\t0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4,\t0x7687, 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073,\n\t0x768B, 0xB8DE, 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8,\t0x768F, 0xB076, 0x7690, 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078,\n\t0x7693, 0xF0A9, 0x7694, 0xB079, 0x7695, 0xB07A, 0x7696, 0xCDEE,\t0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, 0xF0AA, 0x769A, 0xB07D,\n\t0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, 0x769E, 0xB082,\t0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, 0xB086,\n\t0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089,\t0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D,\n\t0x76AB, 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4,\t0x76AF, 0xB091, 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4,\n\t0x76B3, 0xB093, 0x76B4, 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095,\t0x76B7, 0xB096, 0x76B8, 0xB097, 0x76B9, 0xB098, 0x76BA, 0xB099,\n\t0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, 0xB09C, 0x76BE, 0xB09D,\t0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, 0x76C2, 0xD3DB,\n\t0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, 0xC5E8,\t0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6,\n\t0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB,\t0x76CF, 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0,\n\t0x76D3, 0xB145, 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7,\t0x76D7, 0xB5C1, 0x76D8, 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148,\n\t0x76DB, 0xCAA2, 0x76DC, 0xB149, 0x76DD, 0xB14A, 0x76DE, 0xB14B,\t0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, 0xB14D, 0x76E2, 0xB14E,\n\t0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, 0x76E6, 0xB151,\t0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, 0xB155,\n\t0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF,\t0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4,\n\t0x76F3, 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C,\t0x76F7, 0xB15D, 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E,\n\t0x76FB, 0xB15F, 0x76FC, 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC,\t0x76FF, 0xB161, 0x7700, 0xB162, 0x7701, 0xCAA1, 0x7702, 0xB163,\n\t0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, 0xB165, 0x7706, 0xB166,\t0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, 0x770A, 0xB167,\n\t0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, 0xB169,\t0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D,\n\t0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171,\t0x7717, 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2,\n\t0x771B, 0xB174, 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177,\t0x771F, 0xD5E6, 0x7720, 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3,\n\t0x7723, 0xB179, 0x7724, 0xB17A, 0x7725, 0xB17B, 0x7726, 0xEDF6,\t0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, 0xD1A3, 0x772A, 0xB17D,\n\t0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, 0x772E, 0xB181,\t0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, 0xB184,\n\t0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4,\t0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7,\n\t0x773B, 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A,\t0x773F, 0xB18B, 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C,\n\t0x7743, 0xEDFC, 0x7744, 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F,\t0x7747, 0xEDFB, 0x7748, 0xB190, 0x7749, 0xB191, 0x774A, 0xB192,\n\t0x774B, 0xB193, 0x774C, 0xB194, 0x774D, 0xB195, 0x774E, 0xB196,\t0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, 0x7752, 0xB198,\n\t0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, 0xB19C,\t0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD,\n\t0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241,\t0x775F, 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1,\n\t0x7763, 0xB6BD, 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0,\t0x7767, 0xB245, 0x7768, 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247,\n\t0x776B, 0xBDDE, 0x776C, 0xB2C7, 0x776D, 0xB248, 0x776E, 0xB249,\t0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, 0xB24C, 0x7772, 0xB24D,\n\t0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, 0x7776, 0xB251,\t0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, 0xB254,\n\t0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA,\t0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258,\n\t0x7783, 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A,\t0x7787, 0xB25B, 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E,\n\t0x778B, 0xB25F, 0x778C, 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9,\t0x778F, 0xB260, 0x7790, 0xB261, 0x7791, 0xEEA8, 0x7792, 0xC2F7,\n\t0x7793, 0xB262, 0x7794, 0xB263, 0x7795, 0xB264, 0x7796, 0xB265,\t0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, 0x779A, 0xB269,\n\t0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, 0xB26D,\t0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB,\n\t0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271,\t0x77A7, 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9,\n\t0x77AB, 0xB273, 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275,\t0x77AF, 0xB276, 0x77B0, 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278,\n\t0x77B3, 0xCDAB, 0x77B4, 0xB279, 0x77B5, 0xEEAC, 0x77B6, 0xB27A,\t0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, 0xB27D, 0x77BA, 0xB27E,\n\t0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, 0x77BE, 0xB281,\t0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, 0xB284,\n\t0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288,\t0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C,\n\t0x77CB, 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F,\t0x77CF, 0xB290, 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293,\n\t0x77D3, 0xB294, 0x77D4, 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297,\t0x77D7, 0xB4A3, 0x77D8, 0xB298, 0x77D9, 0xB299, 0x77DA, 0xB29A,\n\t0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, 0xB29B, 0x77DE, 0xB29C,\t0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, 0x77E2, 0xCAB8,\n\t0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, 0xB340,\t0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342,\n\t0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB,\t0x77EF, 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346,\n\t0x77F3, 0xCAAF, 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6,\t0x77F7, 0xB349, 0x77F8, 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B,\n\t0x77FB, 0xB34C, 0x77FC, 0xB34D, 0x77FD, 0xCEF9, 0x77FE, 0xB7AF,\t0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, 0xC2EB, 0x7802, 0xC9B0,\n\t0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, 0x7806, 0xB351,\t0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, 0xB354,\n\t0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356,\t0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8,\n\t0x7813, 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9,\t0x7817, 0xEDBA, 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2,\n\t0x781B, 0xB35C, 0x781C, 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D,\t0x781F, 0xEDC4, 0x7820, 0xB35E, 0x7821, 0xB35F, 0x7822, 0xB360,\n\t0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, 0xEDC6, 0x7826, 0xEDCE,\t0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, 0x782A, 0xB363,\n\t0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, 0xB365,\t0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368,\n\t0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B,\t0x7837, 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2,\n\t0x783B, 0xEDC3, 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9,\t0x783F, 0xB36D, 0x7840, 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F,\n\t0x7843, 0xB370, 0x7844, 0xB371, 0x7845, 0xB9E8, 0x7846, 0xB372,\t0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, 0xB374, 0x784A, 0xB375,\n\t0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, 0x784E, 0xEDCA,\t0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, 0xCEF8,\n\t0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC,\t0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E,\n\t0x785B, 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382,\t0x785F, 0xB383, 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386,\n\t0x7863, 0xB387, 0x7864, 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A,\t0x7867, 0xB38B, 0x7868, 0xB38C, 0x7869, 0xB38D, 0x786A, 0xEDD2,\n\t0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, 0xEDCB, 0x786E, 0xC8B7,\t0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, 0x7872, 0xB391,\n\t0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, 0xB395,\t0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398,\n\t0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B,\t0x787F, 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F,\n\t0x7883, 0xB3A0, 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442,\t0x7887, 0xEDD6, 0x7888, 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444,\n\t0x788B, 0xB445, 0x788C, 0xC2B5, 0x788D, 0xB0AD, 0x788E, 0xCBE9,\t0x788F, 0xB446, 0x7890, 0xB447, 0x7891, 0xB1AE, 0x7892, 0xB448,\n\t0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, 0x7896, 0xB44B,\t0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, 0xEDD5,\n\t0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E,\t0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450,\n\t0x78A3, 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452,\t0x78A7, 0xB1CC, 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455,\n\t0x78AB, 0xB456, 0x78AC, 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459,\t0x78AF, 0xB45A, 0x78B0, 0xC5F6, 0x78B1, 0xBCEE, 0x78B2, 0xEDDA,\n\t0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, 0xB45B, 0x78B6, 0xB45C,\t0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, 0x78BA, 0xB45F,\n\t0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, 0xC4EB,\t0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465,\n\t0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468,\t0x78C7, 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA,\n\t0x78CB, 0xB4E8, 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D,\t0x78CF, 0xB46E, 0x78D0, 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470,\n\t0x78D3, 0xB471, 0x78D4, 0xEDDD, 0x78D5, 0xBFC4, 0x78D6, 0xB472,\t0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, 0xEDDE, 0x78DA, 0xB475,\n\t0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, 0x78DE, 0xB479,\t0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, 0xB47D,\n\t0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482,\t0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485,\n\t0x78EB, 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488,\t0x78EF, 0xB489, 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1,\n\t0x78F3, 0xB48C, 0x78F4, 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E,\t0x78F7, 0xC1D7, 0x78F8, 0xB48F, 0x78F9, 0xB490, 0x78FA, 0xBBC7,\n\t0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, 0xB493, 0x78FE, 0xB494,\t0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, 0x7902, 0xB497,\n\t0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, 0xB49A,\t0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E,\n\t0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541,\t0x790F, 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545,\n\t0x7913, 0xEDE4, 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548,\t0x7917, 0xB549, 0x7918, 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C,\n\t0x791B, 0xB54D, 0x791C, 0xB54E, 0x791D, 0xB54F, 0x791E, 0xEDE6,\t0x791F, 0xB550, 0x7920, 0xB551, 0x7921, 0xB552, 0x7922, 0xB553,\n\t0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, 0x7926, 0xB556,\t0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, 0xB55A,\n\t0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E,\t0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562,\n\t0x7933, 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565,\t0x7937, 0xB566, 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE,\n\t0x793B, 0xECEA, 0x793C, 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7,\t0x793F, 0xB56A, 0x7940, 0xECEB, 0x7941, 0xC6EE, 0x7942, 0xB56B,\n\t0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, 0xB56E, 0x7946, 0xECEC,\t0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, 0x794A, 0xB570,\n\t0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, 0xB574,\t0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578,\n\t0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6,\t0x7957, 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1,\n\t0x795B, 0xECEE, 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1,\t0x795F, 0xCBEE, 0x7960, 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2,\n\t0x7963, 0xB57E, 0x7964, 0xB580, 0x7965, 0xCFE9, 0x7966, 0xB581,\t0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, 0xB582, 0x796A, 0xB583,\n\t0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, 0x796E, 0xB586,\t0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, 0xB589,\n\t0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D,\t0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7,\n\t0x797B, 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592,\t0x797F, 0xB593, 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594,\n\t0x7983, 0xB595, 0x7984, 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596,\t0x7987, 0xB597, 0x7988, 0xB598, 0x7989, 0xB599, 0x798A, 0xECF9,\n\t0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, 0xB59C, 0x798E, 0xB59D,\t0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, 0x7992, 0xB5A0,\n\t0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, 0xB643,\t0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA,\n\t0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A,\t0x799F, 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E,\n\t0x79A3, 0xB64F, 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652,\t0x79A7, 0xECFB, 0x79A8, 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655,\n\t0x79AB, 0xB656, 0x79AC, 0xB657, 0x79AD, 0xB658, 0x79AE, 0xB659,\t0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, 0xB65C, 0x79B2, 0xB65D,\n\t0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, 0x79B6, 0xB660,\t0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, 0xD8AE,\n\t0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC,\t0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665,\n\t0x79C3, 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1,\t0x79C7, 0xB668, 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A,\n\t0x79CB, 0xC7EF, 0x79CC, 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C,\t0x79CF, 0xB66D, 0x79D0, 0xB66E, 0x79D1, 0xBFC6, 0x79D2, 0xC3EB,\n\t0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, 0xEFF5, 0x79D6, 0xB671,\t0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, 0x79DA, 0xB674,\n\t0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, 0xB678,\t0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B,\n\t0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8,\t0x79E7, 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E,\n\t0x79EB, 0xEFF8, 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681,\t0x79EF, 0xBBFD, 0x79F0, 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683,\n\t0x79F3, 0xB684, 0x79F4, 0xB685, 0x79F5, 0xB686, 0x79F6, 0xB687,\t0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, 0xB689, 0x79FA, 0xB68A,\n\t0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, 0x79FE, 0xB68C,\t0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, 0xEFFC,\n\t0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9,\t0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694,\n\t0x7A0B, 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0,\t0x7A0F, 0xB696, 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699,\n\t0x7A13, 0xB69A, 0x7A14, 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C,\t0x7A17, 0xB0DE, 0x7A18, 0xB69D, 0x7A19, 0xB69E, 0x7A1A, 0xD6C9,\n\t0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, 0xB740, 0x7A1E, 0xEFFD,\t0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, 0x7A22, 0xB743,\n\t0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, 0xB746,\t0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A,\n\t0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E,\t0x7A2F, 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752,\n\t0x7A33, 0xCEC8, 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755,\t0x7A37, 0xF0A2, 0x7A38, 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757,\n\t0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, 0x7A3D, 0xBBFC, 0x7A3E, 0xB758,\t0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, 0xB75A, 0x7A42, 0xB75B,\n\t0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, 0x7A46, 0xC4C2,\t0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, 0xB762,\n\t0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766,\t0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769,\n\t0x7A53, 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D,\t0x7A57, 0xCBEB, 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770,\n\t0x7A5B, 0xB771, 0x7A5C, 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774,\t0x7A5F, 0xB775, 0x7A60, 0xB776, 0x7A61, 0xB777, 0x7A62, 0xB778,\n\t0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, 0xB77B, 0x7A66, 0xB77C,\t0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, 0x7A6A, 0xB781,\n\t0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, 0xB785,\t0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788,\n\t0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF,\t0x7A77, 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5,\n\t0x7A7B, 0xB78B, 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E,\t0x7A7F, 0xB4A9, 0x7A80, 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F,\n\t0x7A83, 0xC7D4, 0x7A84, 0xD5AD, 0x7A85, 0xB790, 0x7A86, 0xF1B9,\t0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, 0xB792, 0x7A8A, 0xB793,\n\t0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, 0x7A8E, 0xB796,\t0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, 0xD6CF,\n\t0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1,\t0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C,\n\t0x7A9B, 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E,\t0x7A9F, 0xBFDF, 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0,\n\t0x7AA3, 0xB840, 0x7AA4, 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC,\t0x7AA7, 0xB842, 0x7AA8, 0xF1BF, 0x7AA9, 0xB843, 0x7AAA, 0xB844,\n\t0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, 0xF1C0, 0x7AAE, 0xB846,\t0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, 0x7AB2, 0xB84A,\n\t0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, 0xB84D,\t0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851,\n\t0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855,\t0x7ABF, 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858,\n\t0x7AC3, 0xB859, 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C,\t0x7AC7, 0xB85D, 0x7AC8, 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860,\n\t0x7ACB, 0xC1A2, 0x7ACC, 0xB861, 0x7ACD, 0xB862, 0x7ACE, 0xB863,\t0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, 0xB866, 0x7AD2, 0xB867,\n\t0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, 0x7AD6, 0xCAFA,\t0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, 0xB86D,\n\t0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA,\t0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872,\n\t0x7AE3, 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5,\t0x7AE7, 0xB874, 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877,\n\t0x7AEB, 0xB878, 0x7AEC, 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A,\t0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, 0x7AF1, 0xB87C, 0x7AF2, 0xB87D,\n\t0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, 0xB881, 0x7AF6, 0xB882,\t0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, 0x7AFA, 0xF3C3,\n\t0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, 0xB887,\t0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A,\n\t0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA,\t0x7B07, 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9,\n\t0x7B0B, 0xCBF1, 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890,\t0x7B0F, 0xF3CB, 0x7B10, 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892,\n\t0x7B13, 0xB893, 0x7B14, 0xB1CA, 0x7B15, 0xF3C8, 0x7B16, 0xB894,\t0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, 0xF3CF, 0x7B1A, 0xB897,\n\t0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, 0x7B1E, 0xF3D7,\t0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, 0xB89C,\n\t0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB,\t0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE,\n\t0x7B2B, 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0,\t0x7B2F, 0xB940, 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942,\n\t0x7B33, 0xF3D5, 0x7B34, 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945,\t0x7B37, 0xB946, 0x7B38, 0xF3CD, 0x7B39, 0xB947, 0x7B3A, 0xBCE3,\n\t0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, 0xB949, 0x7B3E, 0xF3D6,\t0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, 0x7B42, 0xB94D,\n\t0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, 0xB950,\t0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952,\n\t0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954,\t0x7B4F, 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2,\n\t0x7B53, 0xB955, 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF,\t0x7B57, 0xB957, 0x7B58, 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9,\n\t0x7B5B, 0xC9B8, 0x7B5C, 0xB959, 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A,\t0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, 0xB95C, 0x7B62, 0xF3E1,\n\t0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, 0x7B66, 0xB960,\t0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, 0xB964,\n\t0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF,\t0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2,\n\t0x7B73, 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C,\t0x7B77, 0xBFEA, 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E,\n\t0x7B7B, 0xF3E0, 0x7B7C, 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9,\t0x7B7F, 0xB971, 0x7B80, 0xBCF2, 0x7B81, 0xB972, 0x7B82, 0xB973,\n\t0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, 0xF3EB, 0x7B86, 0xB976,\t0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, 0x7B8A, 0xB97A,\n\t0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, 0xB97D,\t0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981,\n\t0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983,\t0x7B97, 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986,\n\t0x7B9B, 0xB987, 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988,\t0x7B9F, 0xB989, 0x7BA0, 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE,\n\t0x7BA3, 0xB98B, 0x7BA4, 0xB98C, 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5,\t0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, 0xC2E1, 0x7BAA, 0xF3EC,\n\t0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, 0x7BAE, 0xB98E,\t0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, 0xB991,\n\t0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994,\t0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997,\n\t0x7BBB, 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B,\t0x7BBF, 0xB99C, 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E,\n\t0x7BC3, 0xB99F, 0x7BC4, 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD,\t0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, 0x7BC9, 0xBA42, 0x7BCA, 0xBA43,\n\t0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, 0xBA45, 0x7BCE, 0xBA46,\t0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, 0x7BD2, 0xBA49,\n\t0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, 0xBA4C,\t0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5,\n\t0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51,\t0x7BDF, 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54,\n\t0x7BE3, 0xBA55, 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7,\t0x7BE7, 0xBA57, 0x7BE8, 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8,\n\t0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA,\t0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, 0xC0E9, 0x7BF2, 0xBA5F,\n\t0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, 0x7BF6, 0xBA63,\t0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, 0xBA66,\n\t0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA,\t0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C,\n\t0x7C03, 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70,\t0x7C07, 0xB4D8, 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73,\n\t0x7C0B, 0xF3FE, 0x7C0C, 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75,\t0x7C0F, 0xF3FC, 0x7C10, 0xBA76, 0x7C11, 0xBA77, 0x7C12, 0xBA78,\n\t0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, 0xBA7B, 0x7C16, 0xF3FD,\t0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, 0x7C1A, 0xBA80,\n\t0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, 0xBA84,\t0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87,\n\t0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3,\t0x7C27, 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2,\n\t0x7C2B, 0xBA8D, 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90,\t0x7C2F, 0xBA91, 0x7C30, 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94,\n\t0x7C33, 0xBA95, 0x7C34, 0xBA96, 0x7C35, 0xBA97, 0x7C36, 0xBA98,\t0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, 0xBA9A, 0x7C3A, 0xBA9B,\n\t0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, 0x7C3E, 0xBA9F,\t0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, 0xBAA0,\n\t0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43,\t0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47,\n\t0x7C4B, 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A,\t0x7C4F, 0xBB4B, 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E,\n\t0x7C53, 0xBB4F, 0x7C54, 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52,\t0x7C57, 0xBB53, 0x7C58, 0xBB54, 0x7C59, 0xBB55, 0x7C5A, 0xBB56,\n\t0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, 0xBB59, 0x7C5E, 0xBB5A,\t0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, 0x7C62, 0xBB5E,\n\t0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, 0xBB62,\t0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66,\n\t0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A,\t0x7C6F, 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E,\n\t0x7C73, 0xC3D7, 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70,\t0x7C77, 0xBB71, 0x7C78, 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74,\n\t0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75,\t0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, 0xBB78, 0x7C82, 0xBB79,\n\t0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, 0x7C86, 0xBB7D,\t0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, 0xBB81,\n\t0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85,\t0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3,\n\t0x7C93, 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A,\t0x7C97, 0xB4D6, 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C,\n\t0x7C9B, 0xBB8D, 0x7C9C, 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1,\t0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2,\n\t0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, 0xD6E0, 0x7CA6, 0xBB91,\t0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, 0x7CAA, 0xB7E0,\n\t0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, 0xC1B8,\t0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3,\n\t0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C,\t0x7CB7, 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F,\n\t0x7CBB, 0xBBA0, 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB,\t0x7CBF, 0xBC40, 0x7CC0, 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42,\n\t0x7CC3, 0xBC43, 0x7CC4, 0xBC44, 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45,\t0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, 0xBC46, 0x7CCA, 0xBAFD,\n\t0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, 0x7CCE, 0xBC48,\t0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, 0xBC4C,\n\t0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7,\t0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50,\n\t0x7CDB, 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53,\t0x7CDF, 0xD4E3, 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55,\n\t0x7CE3, 0xBC56, 0x7CE4, 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59,\t0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C,\n\t0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, 0xBC5F, 0x7CEE, 0xBC60,\t0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, 0x7CF2, 0xBC63,\n\t0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, 0xBC67,\t0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A,\n\t0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D,\t0x7CFF, 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71,\n\t0x7D03, 0xBC72, 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75,\t0x7D07, 0xBC76, 0x7D08, 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9,\n\t0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C,\t0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, 0xBC80, 0x7D12, 0xBC81,\n\t0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, 0x7D16, 0xBC85,\t0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, 0xBC89,\n\t0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D,\t0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7,\n\t0x7D23, 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93,\t0x7D27, 0xBDF4, 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96,\n\t0x7D2B, 0xD7CF, 0x7D2C, 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99,\t0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, 0x7D31, 0xBC9B, 0x7D32, 0xBC9C,\n\t0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, 0xBC9F, 0x7D36, 0xBCA0,\t0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, 0x7D3A, 0xBD43,\n\t0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, 0xBD47,\t0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B,\n\t0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F,\t0x7D47, 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53,\n\t0x7D4B, 0xBD54, 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57,\t0x7D4F, 0xBD58, 0x7D50, 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B,\n\t0x7D53, 0xBD5C, 0x7D54, 0xBD5D, 0x7D55, 0xBD5E, 0x7D56, 0xBD5F,\t0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, 0xBD62, 0x7D5A, 0xBD63,\n\t0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, 0x7D5E, 0xBD67,\t0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, 0xBD6B,\n\t0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F,\t0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73,\n\t0x7D6B, 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5,\t0x7D6F, 0xBD77, 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A,\n\t0x7D73, 0xBD7B, 0x7D74, 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E,\t0x7D77, 0xF4EA, 0x7D78, 0xBD80, 0x7D79, 0xBD81, 0x7D7A, 0xBD82,\n\t0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, 0xBD85, 0x7D7E, 0xBD86,\t0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, 0x7D82, 0xBD8A,\n\t0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, 0xBD8E,\t0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92,\n\t0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96,\t0x7D8F, 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A,\n\t0x7D93, 0xBD9B, 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E,\t0x7D97, 0xBD9F, 0x7D98, 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41,\n\t0x7D9B, 0xBE42, 0x7D9C, 0xBE43, 0x7D9D, 0xBE44, 0x7D9E, 0xBE45,\t0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, 0xBE48, 0x7DA2, 0xBE49,\n\t0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, 0x7DA6, 0xF4EB,\t0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, 0xBE50,\n\t0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC,\t0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57,\n\t0x7DB3, 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B,\t0x7DB7, 0xBE5C, 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F,\n\t0x7DBB, 0xBE60, 0x7DBC, 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63,\t0x7DBF, 0xBE64, 0x7DC0, 0xBE65, 0x7DC1, 0xBE66, 0x7DC2, 0xBE67,\n\t0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, 0xBE6A, 0x7DC6, 0xBE6B,\t0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, 0x7DCA, 0xBE6F,\n\t0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, 0xBE73,\t0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77,\n\t0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B,\t0x7DD7, 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80,\n\t0x7DDB, 0xBE81, 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84,\t0x7DDF, 0xBE85, 0x7DE0, 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88,\n\t0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C,\t0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, 0xBE8F, 0x7DEA, 0xBE90,\n\t0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, 0x7DEE, 0xBE94,\t0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, 0xBE98,\n\t0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C,\t0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0,\n\t0x7DFB, 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43,\t0x7DFF, 0xBF44, 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47,\n\t0x7E03, 0xBF48, 0x7E04, 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B,\t0x7E07, 0xBF4C, 0x7E08, 0xBF4D, 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F,\n\t0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, 0xBF52, 0x7E0E, 0xBF53,\t0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, 0x7E12, 0xBF57,\n\t0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, 0xBF5B,\t0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F,\n\t0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63,\t0x7E1F, 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67,\n\t0x7E23, 0xBF68, 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B,\t0x7E27, 0xBF6C, 0x7E28, 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F,\n\t0x7E2B, 0xBF70, 0x7E2C, 0xBF71, 0x7E2D, 0xBF72, 0x7E2E, 0xBF73,\t0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, 0xBF76, 0x7E32, 0xBF77,\n\t0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, 0x7E36, 0xBF7B,\t0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, 0xBF80,\n\t0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83,\t0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86,\n\t0x7E43, 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A,\t0x7E47, 0xF4ED, 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D,\n\t0x7E4B, 0xBF8E, 0x7E4C, 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91,\t0x7E4F, 0xBF92, 0x7E50, 0xBF93, 0x7E51, 0xBF94, 0x7E52, 0xBF95,\n\t0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, 0xBF98, 0x7E56, 0xBF99,\t0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, 0x7E5A, 0xBF9D,\n\t0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, 0xC040,\t0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044,\n\t0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048,\t0x7E67, 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C,\n\t0x7E6B, 0xC04D, 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050,\t0x7E6F, 0xC051, 0x7E70, 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054,\n\t0x7E73, 0xC055, 0x7E74, 0xC056, 0x7E75, 0xC057, 0x7E76, 0xC058,\t0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, 0xC05B, 0x7E7A, 0xC05C,\n\t0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, 0x7E7E, 0xC060,\t0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, 0xD7EB,\n\t0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067,\t0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B,\n\t0x7E8B, 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F,\t0x7E8F, 0xC070, 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073,\n\t0x7E93, 0xC074, 0x7E94, 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077,\t0x7E97, 0xC078, 0x7E98, 0xC079, 0x7E99, 0xC07A, 0x7E9A, 0xC07B,\n\t0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, 0xC07D, 0x7E9E, 0xC07E,\t0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, 0x7EA2, 0xBAEC,\n\t0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, 0xD4BC,\t0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD,\n\t0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080,\t0x7EAF, 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9,\n\t0x7EB3, 0xC4C9, 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA,\t0x7EB7, 0xB7D7, 0x7EB8, 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4,\n\t0x7EBB, 0xC082, 0x7EBC, 0xC083, 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3,\t0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, 0xE7A5, 0x7EC2, 0xE7A6,\n\t0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, 0x7EC6, 0xCFB8,\t0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, 0xB0ED,\n\t0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF,\t0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE,\n\t0x7ED3, 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084,\t0x7ED7, 0xE7AC, 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4,\n\t0x7EDB, 0xE7AD, 0x7EDC, 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA,\t0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE,\n\t0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, 0xCBE7, 0x7EE6, 0xCCD0,\t0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, 0x7EEA, 0xD0F7,\n\t0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, 0xE7B2,\t0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5,\n\t0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7,\t0x7EF7, 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8,\n\t0x7EFB, 0xE7B9, 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA,\t0x7EFF, 0xC2CC, 0x7F00, 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC,\n\t0x7F03, 0xE7BD, 0x7F04, 0xBCEA, 0x7F05, 0xC3E5, 0x7F06, 0xC0C2,\t0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, 0xBCA9, 0x7F0A, 0xC088,\n\t0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, 0x7F0E, 0xB6D0,\t0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, 0xE7C4,\n\t0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0,\t0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF,\n\t0x7F1B, 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A,\t0x7F1F, 0xE7C9, 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB,\n\t0x7F23, 0xE7CC, 0x7F24, 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF,\t0x7F27, 0xE7D0, 0x7F28, 0xD3A7, 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1,\n\t0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, 0xE7D4, 0x7F2E, 0xC9C9,\t0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, 0x7F32, 0xE7D8,\n\t0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, 0xF3BE,\t0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1,\n\t0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090,\t0x7F3F, 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF,\n\t0x7F43, 0xC094, 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095,\t0x7F47, 0xC096, 0x7F48, 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099,\n\t0x7F4B, 0xC09A, 0x7F4C, 0xC09B, 0x7F4D, 0xC09C, 0x7F4E, 0xC09D,\t0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, 0xCDF8, 0x7F52, 0xC09F,\n\t0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, 0x7F56, 0xC140,\t0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, 0xB7A3,\n\t0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145,\t0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5,\n\t0x7F63, 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A,\t0x7F67, 0xC14B, 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF,\n\t0x7F6B, 0xC14C, 0x7F6C, 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3,\t0x7F6F, 0xC14F, 0x7F70, 0xC150, 0x7F71, 0xEEBD, 0x7F72, 0xCAF0,\n\t0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, 0xC152, 0x7F76, 0xC153,\t0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, 0x7F7A, 0xC156,\n\t0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, 0xEEC0,\t0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C,\n\t0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160,\t0x7F87, 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2,\n\t0x7F8B, 0xC164, 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0,\t0x7F8F, 0xC166, 0x7F90, 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169,\n\t0x7F93, 0xC16A, 0x7F94, 0xB8E1, 0x7F95, 0xC16B, 0x7F96, 0xC16C,\t0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, 0xC16F, 0x7F9A, 0xC1E7,\n\t0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, 0x7F9E, 0xD0DF,\t0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, 0xC173,\n\t0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176,\t0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179,\n\t0x7FAB, 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D,\t0x7FAF, 0xF4C9, 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB,\n\t0x7FB3, 0xC180, 0x7FB4, 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183,\t0x7FB7, 0xC184, 0x7FB8, 0xD9FA, 0x7FB9, 0xB8FE, 0x7FBA, 0xC185,\n\t0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, 0xD3F0, 0x7FBE, 0xC187,\t0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, 0x7FC2, 0xC189,\n\t0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, 0xC18C,\t0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4,\n\t0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1,\t0x7FCF, 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195,\n\t0x7FD3, 0xC196, 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197,\t0x7FD7, 0xC198, 0x7FD8, 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A,\n\t0x7FDB, 0xC19B, 0x7FDC, 0xC19C, 0x7FDD, 0xC19D, 0x7FDE, 0xC19E,\t0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, 0xF4E4, 0x7FE2, 0xC19F,\n\t0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, 0x7FE6, 0xF4E5,\t0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, 0xC243,\n\t0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7,\t0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248,\n\t0x7FF3, 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B,\t0x7FF7, 0xC24C, 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F,\n\t0x7FFB, 0xB7AD, 0x7FFC, 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251,\t0x7FFF, 0xC252, 0x8000, 0xD2AB, 0x8001, 0xC0CF, 0x8002, 0xC253,\n\t0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, 0xD5DF, 0x8006, 0xEAC8,\t0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, 0x800A, 0xC257,\n\t0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, 0xC258,\t0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7,\n\t0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9,\t0x8017, 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C,\n\t0x801B, 0xC25D, 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F,\t0x801F, 0xC260, 0x8020, 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC,\n\t0x8023, 0xC262, 0x8024, 0xC263, 0x8025, 0xF1ED, 0x8026, 0xF1EE,\t0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, 0xF1F0, 0x802A, 0xC5D5,\n\t0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, 0x802E, 0xC267,\t0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, 0xC26A,\n\t0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE,\t0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D,\n\t0x803B, 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F,\t0x803F, 0xB9A2, 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4,\n\t0x8043, 0xF1F5, 0x8044, 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6,\t0x8047, 0xC274, 0x8048, 0xC275, 0x8049, 0xC276, 0x804A, 0xC1C4,\n\t0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, 0xF1F7, 0x804E, 0xC277,\t0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, 0x8052, 0xF1F8,\n\t0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, 0xC27D,\t0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB,\n\t0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284,\t0x805F, 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288,\n\t0x8063, 0xC289, 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C,\t0x8067, 0xC28D, 0x8068, 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF,\n\t0x806B, 0xC28F, 0x806C, 0xC290, 0x806D, 0xC291, 0x806E, 0xC292,\t0x806F, 0xC293, 0x8070, 0xC294, 0x8071, 0xF1FA, 0x8072, 0xC295,\n\t0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, 0x8076, 0xC299,\t0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, 0xC29D,\n\t0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340,\t0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342,\n\t0x8083, 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1,\t0x8087, 0xD5D8, 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345,\n\t0x808B, 0xC0DF, 0x808C, 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347,\t0x808F, 0xC348, 0x8090, 0xC349, 0x8091, 0xC34A, 0x8092, 0xC34B,\n\t0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, 0xC34D, 0x8096, 0xD0A4,\t0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, 0x809A, 0xB6C7,\n\t0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, 0xC350,\t0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB,\n\t0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352,\t0x80A7, 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE,\n\t0x80AB, 0xEBC6, 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9,\t0x80AF, 0xBFCF, 0x80B0, 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD,\n\t0x80B3, 0xC357, 0x80B4, 0xEBC8, 0x80B5, 0xC358, 0x80B6, 0xC359,\t0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, 0xC35B, 0x80BA, 0xB7CE,\n\t0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, 0x80BE, 0xC9F6,\t0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, 0xEBCF,\n\t0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8,\t0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361,\n\t0x80CB, 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5,\t0x80CF, 0xC363, 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366,\n\t0x80D3, 0xC367, 0x80D4, 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6,\t0x80D7, 0xEBD3, 0x80D8, 0xC36A, 0x80D9, 0xEBD1, 0x80DA, 0xC5DF,\n\t0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, 0xEBD5, 0x80DE, 0xB0FB,\t0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, 0x80E2, 0xC36D,\n\t0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, 0xC36F,\t0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD,\n\t0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370,\t0x80EF, 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC,\n\t0x80F3, 0xB8EC, 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA,\t0x80F7, 0xC372, 0x80F8, 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7,\n\t0x80FB, 0xC374, 0x80FC, 0xEBDD, 0x80FD, 0xC4DC, 0x80FE, 0xC375,\t0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, 0xC378, 0x8102, 0xD6AC,\n\t0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, 0x8106, 0xB4E0,\t0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, 0xBCB9,\n\t0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB,\t0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF,\n\t0x8113, 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1,\t0x8117, 0xC382, 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5,\n\t0x811B, 0xC384, 0x811C, 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2,\t0x811F, 0xC387, 0x8120, 0xC388, 0x8121, 0xC389, 0x8122, 0xC38A,\n\t0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, 0xC38D, 0x8126, 0xC38E,\t0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, 0x812A, 0xC392,\n\t0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, 0xC395,\t0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5,\n\t0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1,\t0x8137, 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C,\n\t0x813B, 0xC39D, 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2,\t0x813F, 0xC3A0, 0x8140, 0xC440, 0x8141, 0xC441, 0x8142, 0xC442,\n\t0x8143, 0xC443, 0x8144, 0xC444, 0x8145, 0xC445, 0x8146, 0xCCF3,\t0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, 0xC447, 0x814A, 0xC0B0,\n\t0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, 0x814E, 0xC449,\t0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, 0xC44B,\n\t0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C,\t0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB,\n\t0x815B, 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452,\t0x815F, 0xC453, 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455,\n\t0x8163, 0xC456, 0x8164, 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458,\t0x8167, 0xEBF2, 0x8168, 0xC459, 0x8169, 0xEBEE, 0x816A, 0xC45A,\n\t0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, 0xEBF1, 0x816E, 0xC8F9,\t0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, 0x8172, 0xC45E,\n\t0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, 0xC461,\t0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9,\n\t0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA,\t0x817F, 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6,\n\t0x8183, 0xC465, 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468,\t0x8187, 0xC469, 0x8188, 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2,\n\t0x818B, 0xC46B, 0x818C, 0xC46C, 0x818D, 0xC46D, 0x818E, 0xC46E,\t0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, 0xEBF7, 0x8192, 0xC470,\n\t0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, 0x8196, 0xC474,\t0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, 0xC477,\n\t0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478,\t0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C,\n\t0x81A3, 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2,\t0x81A7, 0xC480, 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA,\n\t0x81AB, 0xC482, 0x81AC, 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485,\t0x81AF, 0xC486, 0x81B0, 0xC487, 0x81B1, 0xC488, 0x81B2, 0xC489,\n\t0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, 0xC48B, 0x81B6, 0xC48C,\t0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, 0x81BA, 0xE2DF,\n\t0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, 0xC492,\t0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB,\n\t0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC,\t0x81C7, 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD,\n\t0x81CB, 0xC499, 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B,\t0x81CF, 0xC49C, 0x81D0, 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F,\n\t0x81D3, 0xC4A0, 0x81D4, 0xC540, 0x81D5, 0xC541, 0x81D6, 0xC542,\t0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, 0xC545, 0x81DA, 0xC546,\n\t0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, 0x81DE, 0xC54A,\t0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, 0xC54E,\n\t0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551,\t0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4,\n\t0x81EB, 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555,\t0x81EF, 0xC556, 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559,\n\t0x81F3, 0xD6C1, 0x81F4, 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B,\t0x81F7, 0xC55C, 0x81F8, 0xC55D, 0x81F9, 0xC55E, 0x81FA, 0xC55F,\n\t0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, 0xC560, 0x81FE, 0xF4A7,\t0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, 0x8202, 0xF4A9,\n\t0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, 0xD3DF,\t0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566,\n\t0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568,\t0x820F, 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6,\n\t0x8213, 0xC56B, 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D,\t0x8217, 0xC56E, 0x8218, 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571,\n\t0x821B, 0xE2B6, 0x821C, 0xCBB4, 0x821D, 0xC572, 0x821E, 0xCEE8,\t0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, 0xF4AD, 0x8222, 0xF4AE,\n\t0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, 0x8226, 0xC576,\t0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, 0xBABD,\n\t0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579,\t0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A,\n\t0x8233, 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0,\t0x8237, 0xCFCF, 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B,\n\t0x823B, 0xF4B5, 0x823C, 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8,\t0x823F, 0xC57E, 0x8240, 0xC580, 0x8241, 0xC581, 0x8242, 0xC582,\n\t0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, 0xC584, 0x8246, 0xC585,\t0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, 0x824A, 0xC587,\n\t0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, 0xC58A,\t0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D,\n\t0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591,\t0x8257, 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD,\n\t0x825B, 0xC594, 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597,\t0x825F, 0xF4BE, 0x8260, 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A,\n\t0x8263, 0xC59B, 0x8264, 0xC59C, 0x8265, 0xC59D, 0x8266, 0xC59E,\t0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, 0xC5A0, 0x826A, 0xC640,\n\t0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, 0x826E, 0xF4DE,\t0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, 0xC9AB,\n\t0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646,\t0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5,\n\t0x827B, 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC,\t0x827F, 0xDCB5, 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA,\n\t0x8283, 0xC64D, 0x8284, 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F,\t0x8287, 0xC650, 0x8288, 0xD8C2, 0x8289, 0xC651, 0x828A, 0xDCB7,\n\t0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, 0xC9D6, 0x828E, 0xDCBA,\t0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, 0x8292, 0xC3A2,\n\t0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, 0xC657,\t0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658,\n\t0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A,\t0x829F, 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C,\n\t0x82A3, 0xC65D, 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB,\t0x82A7, 0xC65E, 0x82A8, 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE,\n\t0x82AB, 0xDCBE, 0x82AC, 0xB7D2, 0x82AD, 0xB0C5, 0x82AE, 0xDCC7,\t0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, 0xBBA8, 0x82B2, 0xC65F,\n\t0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, 0x82B6, 0xC661,\t0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, 0xC662,\n\t0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0,\t0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667,\n\t0x82C3, 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A,\t0x82C7, 0xCEAD, 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3,\n\t0x82CB, 0xDCC8, 0x82CC, 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1,\t0x82CF, 0xCBD5, 0x82D0, 0xC66C, 0x82D1, 0xD4B7, 0x82D2, 0xDCDB,\n\t0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, 0xDCE6, 0x82D6, 0xC66D,\t0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, 0x82DA, 0xC66F,\n\t0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, 0xB0FA,\t0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671,\n\t0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0,\t0x82E7, 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675,\n\t0x82EB, 0xC9BB, 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678,\t0x82EF, 0xB1BD, 0x82F0, 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A,\n\t0x82F3, 0xC67B, 0x82F4, 0xDCDA, 0x82F5, 0xC67C, 0x82F6, 0xC67D,\t0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, 0xC6BB, 0x82FA, 0xC680,\n\t0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, 0x82FE, 0xC683,\t0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, 0xC3AF,\n\t0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2,\t0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686,\n\t0x830B, 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5,\t0x830F, 0xDCD7, 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A,\n\t0x8313, 0xC68B, 0x8314, 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C,\t0x8317, 0xDCF8, 0x8318, 0xC68D, 0x8319, 0xC68E, 0x831A, 0xDCE1,\n\t0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, 0xC68F, 0x831E, 0xC690,\t0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, 0x8322, 0xC694,\n\t0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, 0xC698,\t0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A,\n\t0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B,\t0x832F, 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D,\n\t0x8333, 0xDCFC, 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8,\t0x8337, 0xC69E, 0x8338, 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB,\n\t0x833B, 0xC69F, 0x833C, 0xDCED, 0x833D, 0xC6A0, 0x833E, 0xC740,\t0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, 0xC742, 0x8342, 0xC743,\n\t0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, 0x8346, 0xBEA3,\t0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, 0xC747,\n\t0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B,\t0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4,\n\t0x8353, 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E,\t0x8357, 0xC74F, 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4,\n\t0x835B, 0xDCE9, 0x835C, 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1,\t0x835F, 0xDCF6, 0x8360, 0xDCF9, 0x8361, 0xB5B4, 0x8362, 0xC753,\n\t0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, 0xDCFE, 0x8366, 0xDCFD,\t0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, 0x836A, 0xDDA5,\n\t0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, 0xDDA7,\t0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756,\n\t0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A,\t0x8377, 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C,\n\t0x837B, 0xDDB6, 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D,\t0x837F, 0xC75E, 0x8380, 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761,\n\t0x8383, 0xC762, 0x8384, 0xC763, 0x8385, 0xDDB0, 0x8386, 0xC6CE,\t0x8387, 0xC764, 0x8388, 0xC765, 0x8389, 0xC0F2, 0x838A, 0xC766,\n\t0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, 0x838E, 0xC9AF,\t0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, 0xDCEC,\n\t0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F,\t0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772,\n\t0x839B, 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8,\t0x839F, 0xC774, 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776,\n\t0x83A3, 0xC777, 0x83A4, 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A,\t0x83A7, 0xC77B, 0x83A8, 0xDDB9, 0x83A9, 0xDDB3, 0x83AA, 0xDDAD,\n\t0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, 0xC77D, 0x83AE, 0xC77E,\t0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, 0x83B2, 0xC1AB,\n\t0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, 0xDDB2,\t0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA,\n\t0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783,\t0x83BF, 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785,\n\t0x83C3, 0xC786, 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788,\t0x83C7, 0xB9BD, 0x83C8, 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5,\n\t0x83CB, 0xC78B, 0x83CC, 0xBEFA, 0x83CD, 0xC78C, 0x83CE, 0xC78D,\t0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, 0xC78F, 0x83D2, 0xC790,\n\t0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, 0x83D6, 0xDDC5,\t0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, 0xC795,\n\t0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797,\t0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798,\n\t0x83E3, 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B,\t0x83E7, 0xC79C, 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0,\n\t0x83EB, 0xC79E, 0x83EC, 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840,\t0x83EF, 0xC841, 0x83F0, 0xDDD4, 0x83F1, 0xC1E2, 0x83F2, 0xB7C6,\n\t0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, 0xC844, 0x83F6, 0xC845,\t0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, 0x83FA, 0xC847,\n\t0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, 0xC84A,\t0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D,\n\t0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9,\t0x8407, 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852,\n\t0x840B, 0xDDC2, 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE,\t0x840F, 0xDDCC, 0x8410, 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854,\n\t0x8413, 0xC855, 0x8414, 0xC856, 0x8415, 0xC857, 0x8416, 0xC858,\t0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, 0xC85A, 0x841A, 0xC85B,\n\t0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, 0x841E, 0xC85D,\t0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, 0xC861,\n\t0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3,\t0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864,\n\t0x842B, 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868,\t0x842F, 0xC869, 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B,\n\t0x8433, 0xC86C, 0x8434, 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F,\t0x8437, 0xC870, 0x8438, 0xDDC7, 0x8439, 0xC871, 0x843A, 0xC872,\n\t0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, 0xC2E4, 0x843E, 0xC874,\t0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, 0x8442, 0xC878,\n\t0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, 0xDDE1,\t0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880,\n\t0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884,\t0x844F, 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887,\n\t0x8453, 0xC888, 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B,\t0x8457, 0xD6F8, 0x8458, 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8,\n\t0x845B, 0xB8F0, 0x845C, 0xDDD6, 0x845D, 0xC88D, 0x845E, 0xC88E,\t0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, 0xC6CF, 0x8462, 0xC891,\n\t0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, 0x8466, 0xC894,\t0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, 0xC897,\n\t0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898,\t0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B,\n\t0x8473, 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3,\t0x8477, 0xC89D, 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD,\n\t0x847B, 0xC89F, 0x847C, 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941,\t0x847F, 0xC942, 0x8480, 0xC943, 0x8481, 0xC944, 0x8482, 0xB5D9,\n\t0x8483, 0xC945, 0x8484, 0xC946, 0x8485, 0xC947, 0x8486, 0xC948,\t0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, 0x848A, 0xC949,\n\t0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, 0xDDE5,\t0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E,\n\t0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952,\t0x8497, 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954,\n\t0x849B, 0xC955, 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957,\t0x849F, 0xC958, 0x84A0, 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A,\n\t0x84A3, 0xC95B, 0x84A4, 0xC95C, 0x84A5, 0xC95D, 0x84A6, 0xC95E,\t0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, 0xC961, 0x84AA, 0xC962,\n\t0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, 0x84AE, 0xC966,\t0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, 0xC6D1,\n\t0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B,\t0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0,\n\t0x84BB, 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F,\t0x84BF, 0xDDEF, 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971,\n\t0x84C3, 0xC972, 0x84C4, 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974,\t0x84C7, 0xC975, 0x84C8, 0xC976, 0x84C9, 0xC8D8, 0x84CA, 0xDDEE,\n\t0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, 0xDDE9, 0x84CE, 0xC979,\t0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, 0x84D2, 0xC97B,\n\t0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, 0xB1CD,\t0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982,\n\t0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985,\t0x84DF, 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987,\n\t0x84E3, 0xDDF7, 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB,\t0x84E7, 0xC989, 0x84E8, 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C,\n\t0x84EB, 0xC98D, 0x84EC, 0xC5EE, 0x84ED, 0xC98E, 0x84EE, 0xC98F,\t0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, 0xC991, 0x84F2, 0xC992,\n\t0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, 0x84F6, 0xC996,\t0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, 0xC99A,\n\t0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D,\t0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0,\n\t0x8503, 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43,\t0x8507, 0xCA44, 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47,\n\t0x850B, 0xCA48, 0x850C, 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A,\t0x850F, 0xCA4B, 0x8510, 0xCA4C, 0x8511, 0xC3EF, 0x8512, 0xCA4D,\n\t0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, 0xCA4F, 0x8516, 0xCA50,\t0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, 0x851A, 0xCEB5,\n\t0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, 0xCA56,\t0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58,\n\t0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C,\t0x8527, 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60,\n\t0x852B, 0xC4E8, 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62,\t0x852F, 0xCA63, 0x8530, 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66,\n\t0x8533, 0xCA67, 0x8534, 0xCA68, 0x8535, 0xCA69, 0x8536, 0xCA6A,\t0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, 0xDDFC, 0x853A, 0xDDFE,\n\t0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, 0x853E, 0xCA6B,\t0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, 0xCA6F,\n\t0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72,\t0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF,\n\t0x854B, 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77,\t0x854F, 0xCA78, 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B,\n\t0x8553, 0xCA7C, 0x8554, 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1,\t0x8557, 0xCA80, 0x8558, 0xCA81, 0x8559, 0xDEA5, 0x855A, 0xCA82,\n\t0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, 0xCA85, 0x855E, 0xDEA9,\t0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, 0x8562, 0xCA89,\n\t0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, 0xCA8C,\t0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F,\n\t0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93,\t0x856F, 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD,\n\t0x8573, 0xCA97, 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99,\t0x8577, 0xCA9A, 0x8578, 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA,\n\t0x857B, 0xDEAE, 0x857C, 0xCA9C, 0x857D, 0xCA9D, 0x857E, 0xC0D9,\t0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, 0xCAA0, 0x8582, 0xCB40,\n\t0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, 0x8586, 0xCB42,\t0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, 0xCB45,\n\t0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49,\t0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C,\n\t0x8593, 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50,\t0x8597, 0xCB51, 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54,\n\t0x859B, 0xD1A6, 0x859C, 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56,\t0x859F, 0xCB57, 0x85A0, 0xCB58, 0x85A1, 0xCB59, 0x85A2, 0xCB5A,\n\t0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, 0xCB5C, 0x85A6, 0xCB5D,\t0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, 0x85AA, 0xD0BD,\n\t0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, 0xDEB4,\t0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64,\n\t0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68,\t0x85B7, 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A,\n\t0x85BB, 0xCB6B, 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E,\t0x85BF, 0xCB6F, 0x85C0, 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71,\n\t0x85C3, 0xCB72, 0x85C4, 0xCB73, 0x85C5, 0xCB74, 0x85C6, 0xCB75,\t0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, 0xBDE5, 0x85CA, 0xCB78,\n\t0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, 0x85CE, 0xCB7C,\t0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, 0xCB7E,\n\t0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81,\t0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85,\n\t0x85DB, 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88,\t0x85DF, 0xCB89, 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C,\n\t0x85E3, 0xCB8D, 0x85E4, 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F,\t0x85E7, 0xCB90, 0x85E8, 0xCB91, 0x85E9, 0xB7AA, 0x85EA, 0xCB92,\n\t0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, 0xCB95, 0x85EE, 0xCB96,\t0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, 0x85F2, 0xCB9A,\n\t0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, 0xCB9E,\t0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41,\n\t0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44,\t0x85FF, 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47,\n\t0x8603, 0xCC48, 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A,\t0x8607, 0xCC4B, 0x8608, 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E,\n\t0x860B, 0xCC4F, 0x860C, 0xCC50, 0x860D, 0xCC51, 0x860E, 0xCC52,\t0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, 0xC4A2, 0x8612, 0xCC55,\n\t0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, 0x8616, 0xDEC1,\t0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, 0xCC5C,\n\t0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60,\t0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64,\n\t0x8623, 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68,\t0x8627, 0xDEBE, 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A,\n\t0x862B, 0xCC6B, 0x862C, 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E,\t0x862F, 0xCC6F, 0x8630, 0xCC70, 0x8631, 0xCC71, 0x8632, 0xCC72,\n\t0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, 0xCC75, 0x8636, 0xCC76,\t0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, 0x863A, 0xCC79,\n\t0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, 0xCC7C,\t0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81,\n\t0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85,\t0x8647, 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89,\n\t0x864B, 0xCC8A, 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2,\t0x864F, 0xC2B2, 0x8650, 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C,\n\t0x8653, 0xCC8D, 0x8654, 0xF2AF, 0x8655, 0xCC8E, 0x8656, 0xCC8F,\t0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, 0xCC92, 0x865A, 0xD0E9,\n\t0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, 0x865E, 0xD3DD,\t0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, 0xEBBD,\n\t0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C,\t0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0,\n\t0x866B, 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1,\t0x866F, 0xCD41, 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43,\n\t0x8673, 0xCD44, 0x8674, 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47,\t0x8677, 0xCD48, 0x8678, 0xCD49, 0x8679, 0xBAE7, 0x867A, 0xF2B3,\n\t0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, 0xCBE4, 0x867E, 0xCFBA,\t0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, 0x8682, 0xC2EC,\n\t0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, 0xCD4D,\t0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3,\n\t0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51,\t0x868F, 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55,\n\t0x8693, 0xF2BE, 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57,\t0x8697, 0xCD58, 0x8698, 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B,\n\t0x869B, 0xCD5C, 0x869C, 0xD1C1, 0x869D, 0xF2BA, 0x869E, 0xCD5D,\t0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, 0xCD60, 0x86A2, 0xCD61,\n\t0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, 0x86A6, 0xCD63,\t0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, 0xF2BD,\n\t0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66,\t0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67,\n\t0x86B3, 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0,\t0x86B7, 0xCD69, 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5,\n\t0x86BB, 0xCD6C, 0x86BC, 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F,\t0x86BF, 0xCD70, 0x86C0, 0xD6FB, 0x86C1, 0xCD71, 0x86C2, 0xCD72,\n\t0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, 0xCD74, 0x86C6, 0xC7F9,\t0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, 0x86CA, 0xB9C6,\n\t0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, 0xF2C3,\t0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78,\n\t0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B,\t0x86D7, 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D,\n\t0x86DB, 0xD6EB, 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2,\t0x86DF, 0xF2D4, 0x86E0, 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83,\n\t0x86E3, 0xCD84, 0x86E4, 0xB8F2, 0x86E5, 0xCD85, 0x86E6, 0xCD86,\t0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, 0xF2CB, 0x86EA, 0xCD89,\n\t0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, 0x86EE, 0xC2F9,\t0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, 0xF2CD,\n\t0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E,\t0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90,\n\t0x86FB, 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA,\t0x86FF, 0xCD94, 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4,\n\t0x8703, 0xF2D7, 0x8704, 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98,\t0x8707, 0xF2D8, 0x8708, 0xF2DA, 0x8709, 0xF2DD, 0x870A, 0xF2DB,\n\t0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, 0xF2DC, 0x870E, 0xCD9B,\t0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, 0x8712, 0xD1D1,\n\t0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, 0xCDA0,\t0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3,\n\t0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0,\t0x871F, 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC,\n\t0x8723, 0xF2DE, 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46,\t0x8727, 0xCE47, 0x8728, 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49,\n\t0x872B, 0xCE4A, 0x872C, 0xCE4B, 0x872D, 0xCE4C, 0x872E, 0xF2E2,\t0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, 0xF2E7, 0x8732, 0xCE4F,\n\t0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, 0x8736, 0xCE52,\t0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, 0xCE55,\n\t0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4,\t0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A,\n\t0x8743, 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E,\t0x8747, 0xD3AC, 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F,\n\t0x874B, 0xCE60, 0x874C, 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB,\t0x874F, 0xCE62, 0x8750, 0xCE63, 0x8751, 0xCE64, 0x8752, 0xCE65,\n\t0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, 0xCE67, 0x8756, 0xCE68,\t0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, 0x875A, 0xCE6A,\n\t0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, 0xCE6E,\t0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71,\n\t0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72,\t0x8767, 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76,\n\t0x876B, 0xCE77, 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3,\t0x876F, 0xCE7A, 0x8770, 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C,\n\t0x8773, 0xCE7D, 0x8774, 0xBAFB, 0x8775, 0xCE7E, 0x8776, 0xB5FB,\t0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, 0xCE82, 0x877A, 0xCE83,\n\t0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, 0x877E, 0xF2EE,\t0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, 0xF2EB,\n\t0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88,\t0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B,\n\t0x878B, 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D,\t0x878F, 0xCE8E, 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91,\n\t0x8793, 0xF2FB, 0x8794, 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94,\t0x8797, 0xF3A5, 0x8798, 0xCE95, 0x8799, 0xCE96, 0x879A, 0xCE97,\n\t0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, 0xCE9A, 0x879E, 0xCE9B,\t0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, 0x87A2, 0xCE9E,\n\t0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, 0xCF41,\t0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44,\n\t0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45,\t0x87AF, 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48,\n\t0x87B3, 0xF3AB, 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A,\t0x87B7, 0xCF4B, 0x87B8, 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD,\n\t0x87BB, 0xCF4E, 0x87BC, 0xCF4F, 0x87BD, 0xF3AE, 0x87BE, 0xCF50,\t0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, 0xCF52, 0x87C2, 0xCF53,\n\t0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, 0x87C6, 0xF3A1,\t0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, 0xF3B1,\n\t0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C,\t0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE,\n\t0x87D3, 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61,\t0x87D7, 0xCF62, 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65,\n\t0x87DB, 0xF3B2, 0x87DC, 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68,\t0x87DF, 0xCF69, 0x87E0, 0xF3B4, 0x87E1, 0xCF6A, 0x87E2, 0xCF6B,\n\t0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, 0xF3A8, 0x87E6, 0xCF6E,\t0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, 0x87EA, 0xF3B3,\n\t0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, 0xF3B5,\t0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78,\n\t0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C,\t0x87F7, 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80,\n\t0x87FB, 0xCF81, 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8,\t0x87FF, 0xCF84, 0x8800, 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87,\n\t0x8803, 0xD9F9, 0x8804, 0xCF88, 0x8805, 0xCF89, 0x8806, 0xCF8A,\t0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, 0xCF8D, 0x880A, 0xF3B9,\n\t0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, 0x880E, 0xCF91,\t0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, 0xCF95,\n\t0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6,\t0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A,\n\t0x881B, 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D,\t0x881F, 0xCF9E, 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0,\n\t0x8823, 0xCFA0, 0x8824, 0xD040, 0x8825, 0xD041, 0x8826, 0xD042,\t0x8827, 0xD043, 0x8828, 0xD044, 0x8829, 0xD045, 0x882A, 0xD046,\n\t0x882B, 0xD047, 0x882C, 0xD048, 0x882D, 0xD049, 0x882E, 0xD04A,\t0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, 0x8832, 0xEEC3,\n\t0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, 0xD051,\t0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054,\n\t0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057,\t0x883F, 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A,\n\t0x8843, 0xD05B, 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C,\t0x8847, 0xD05D, 0x8848, 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060,\n\t0x884B, 0xD061, 0x884C, 0xD0D0, 0x884D, 0xD1DC, 0x884E, 0xD062,\t0x884F, 0xD063, 0x8850, 0xD064, 0x8851, 0xD065, 0x8852, 0xD066,\n\t0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, 0x8856, 0xD069,\t0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, 0xD06B,\n\t0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F,\t0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9,\n\t0x8863, 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072,\t0x8867, 0xD073, 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074,\n\t0x886B, 0xC9C0, 0x886C, 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2,\t0x886F, 0xD076, 0x8870, 0xCBA5, 0x8871, 0xD077, 0x8872, 0xF1C4,\n\t0x8873, 0xD078, 0x8874, 0xD079, 0x8875, 0xD07A, 0x8876, 0xD07B,\t0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, 0x887A, 0xD07E,\n\t0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, 0xF4C0,\t0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7,\n\t0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084,\t0x8887, 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087,\n\t0x888B, 0xB4FC, 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089,\t0x888F, 0xD08A, 0x8890, 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB,\n\t0x8893, 0xD08D, 0x8894, 0xD08E, 0x8895, 0xD08F, 0x8896, 0xD0E4,\t0x8897, 0xD090, 0x8898, 0xD091, 0x8899, 0xD092, 0x889A, 0xD093,\n\t0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, 0x889E, 0xD096,\t0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, 0xF1C8,\n\t0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C,\t0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0,\n\t0x88AB, 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141,\t0x88AF, 0xD142, 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144,\n\t0x88B3, 0xD145, 0x88B4, 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148,\t0x88B7, 0xF1CA, 0x88B8, 0xD149, 0x88B9, 0xD14A, 0x88BA, 0xD14B,\n\t0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, 0xD14D, 0x88BE, 0xD14E,\t0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, 0x88C2, 0xC1D1,\n\t0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, 0xF1C9,\t0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155,\n\t0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE,\t0x88CF, 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6,\n\t0x88D3, 0xD15C, 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D,\t0x88D7, 0xD15E, 0x88D8, 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F,\n\t0x88DB, 0xD160, 0x88DC, 0xD161, 0x88DD, 0xD162, 0x88DE, 0xD163,\t0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, 0xD165, 0x88E2, 0xF1CD,\n\t0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, 0x88E6, 0xD166,\t0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, 0xD169,\n\t0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D,\t0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F,\n\t0x88F3, 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171,\t0x88F7, 0xD172, 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173,\n\t0x88FB, 0xD174, 0x88FC, 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5,\t0x88FF, 0xD176, 0x8900, 0xD177, 0x8901, 0xD178, 0x8902, 0xB9D3,\n\t0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, 0xD17B, 0x8906, 0xD17C,\t0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, 0x890A, 0xF1DB,\n\t0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, 0xD184,\t0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD,\n\t0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189,\t0x8917, 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2,\n\t0x891B, 0xF1DA, 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E,\t0x891F, 0xD18F, 0x8920, 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191,\n\t0x8923, 0xD192, 0x8924, 0xD193, 0x8925, 0xC8EC, 0x8926, 0xD194,\t0x8927, 0xD195, 0x8928, 0xD196, 0x8929, 0xD197, 0x892A, 0xCDCA,\n\t0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, 0x892E, 0xD19A,\t0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, 0xD19D,\n\t0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE,\t0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242,\n\t0x893B, 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246,\t0x893F, 0xD247, 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249,\n\t0x8943, 0xD24A, 0x8944, 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C,\t0x8947, 0xD24D, 0x8948, 0xD24E, 0x8949, 0xD24F, 0x894A, 0xD250,\n\t0x894B, 0xD251, 0x894C, 0xD252, 0x894D, 0xD253, 0x894E, 0xD254,\t0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, 0x8952, 0xD258,\n\t0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, 0xD25C,\t0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260,\n\t0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5,\t0x895F, 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266,\n\t0x8963, 0xD267, 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0,\t0x8967, 0xD26A, 0x8968, 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D,\n\t0x896B, 0xD26E, 0x896C, 0xD26F, 0x896D, 0xD270, 0x896E, 0xD271,\t0x896F, 0xD272, 0x8970, 0xD273, 0x8971, 0xD274, 0x8972, 0xD275,\n\t0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, 0x8976, 0xD279,\t0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, 0xD27D,\n\t0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281,\t0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283,\n\t0x8983, 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2,\t0x8987, 0xD286, 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289,\n\t0x898B, 0xD28A, 0x898C, 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D,\t0x898F, 0xD28E, 0x8990, 0xD28F, 0x8991, 0xD290, 0x8992, 0xD291,\n\t0x8993, 0xD292, 0x8994, 0xD293, 0x8995, 0xD294, 0x8996, 0xD295,\t0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, 0x899A, 0xD299,\n\t0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, 0xD29D,\t0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340,\n\t0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344,\t0x89A7, 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348,\n\t0x89AB, 0xD349, 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C,\t0x89AF, 0xD34D, 0x89B0, 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350,\n\t0x89B3, 0xD351, 0x89B4, 0xD352, 0x89B5, 0xD353, 0x89B6, 0xD354,\t0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, 0xD357, 0x89BA, 0xD358,\n\t0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, 0x89BE, 0xD35C,\t0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, 0xB9DB,\n\t0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3,\t0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9,\n\t0x89CB, 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC,\t0x89CF, 0xEAED, 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7,\n\t0x89D3, 0xD361, 0x89D4, 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB,\t0x89D7, 0xD364, 0x89D8, 0xD365, 0x89D9, 0xD366, 0x89DA, 0xF5FD,\n\t0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, 0xD368, 0x89DE, 0xF5FC,\t0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, 0x89E2, 0xD36C,\n\t0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, 0xB4A5,\t0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371,\n\t0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374,\t0x89EF, 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377,\n\t0x89F3, 0xECB2, 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A,\t0x89F7, 0xD37B, 0x89F8, 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E,\n\t0x89FB, 0xD380, 0x89FC, 0xD381, 0x89FD, 0xD382, 0x89FE, 0xD383,\t0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, 0xD385, 0x8A02, 0xD386,\n\t0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, 0x8A06, 0xD38A,\t0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, 0xD38D,\n\t0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391,\t0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395,\n\t0x8A13, 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399,\t0x8A17, 0xD39A, 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D,\n\t0x8A1B, 0xD39E, 0x8A1C, 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440,\t0x8A1F, 0xD441, 0x8A20, 0xD442, 0x8A21, 0xD443, 0x8A22, 0xD444,\n\t0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, 0xD447, 0x8A26, 0xD448,\t0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, 0x8A2A, 0xD44C,\n\t0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, 0xD450,\t0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454,\n\t0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458,\t0x8A37, 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C,\n\t0x8A3B, 0xD45D, 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4,\t0x8A3F, 0xD460, 0x8A40, 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463,\n\t0x8A43, 0xD464, 0x8A44, 0xD465, 0x8A45, 0xD466, 0x8A46, 0xD467,\t0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, 0xD469, 0x8A4A, 0xD46A,\n\t0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, 0x8A4E, 0xD46E,\t0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, 0xD472,\n\t0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476,\t0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A,\n\t0x8A5B, 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E,\t0x8A5F, 0xD480, 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483,\n\t0x8A63, 0xD484, 0x8A64, 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487,\t0x8A67, 0xD488, 0x8A68, 0xD489, 0x8A69, 0xD48A, 0x8A6A, 0xD48B,\n\t0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, 0xD48E, 0x8A6E, 0xD48F,\t0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, 0x8A72, 0xD493,\n\t0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, 0xD497,\t0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A,\n\t0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E,\t0x8A7F, 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541,\n\t0x8A83, 0xD542, 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545,\t0x8A87, 0xD546, 0x8A88, 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC,\n\t0x8A8B, 0xD548, 0x8A8C, 0xD549, 0x8A8D, 0xD54A, 0x8A8E, 0xD54B,\t0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, 0xD54E, 0x8A92, 0xD54F,\n\t0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, 0x8A96, 0xD552,\t0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, 0xD556,\n\t0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A,\t0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E,\n\t0x8AA3, 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562,\t0x8AA7, 0xD563, 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566,\n\t0x8AAB, 0xD567, 0x8AAC, 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A,\t0x8AAF, 0xD56B, 0x8AB0, 0xD56C, 0x8AB1, 0xD56D, 0x8AB2, 0xD56E,\n\t0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, 0xD571, 0x8AB6, 0xD572,\t0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, 0x8ABA, 0xD576,\n\t0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, 0xD57A,\t0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E,\n\t0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583,\t0x8AC7, 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587,\n\t0x8ACB, 0xD588, 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B,\t0x8ACF, 0xD58C, 0x8AD0, 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F,\n\t0x8AD3, 0xD590, 0x8AD4, 0xD591, 0x8AD5, 0xD592, 0x8AD6, 0xD593,\t0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, 0xD596, 0x8ADA, 0xD597,\n\t0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, 0x8ADE, 0xD59B,\t0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, 0xD59F,\n\t0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642,\t0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646,\n\t0x8AEB, 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A,\t0x8AEF, 0xD64B, 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E,\n\t0x8AF3, 0xD64F, 0x8AF4, 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652,\t0x8AF7, 0xD653, 0x8AF8, 0xD654, 0x8AF9, 0xD655, 0x8AFA, 0xD656,\n\t0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, 0xD659, 0x8AFE, 0xD65A,\t0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, 0x8B02, 0xD65E,\n\t0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, 0xD662,\t0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665,\n\t0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669,\t0x8B0F, 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D,\n\t0x8B13, 0xD66E, 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671,\t0x8B17, 0xD672, 0x8B18, 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675,\n\t0x8B1B, 0xD676, 0x8B1C, 0xD677, 0x8B1D, 0xD678, 0x8B1E, 0xD679,\t0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, 0xD67C, 0x8B22, 0xD67D,\n\t0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, 0x8B26, 0xF6A5,\t0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, 0xD685,\n\t0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689,\t0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D,\n\t0x8B33, 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691,\t0x8B37, 0xD692, 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695,\n\t0x8B3B, 0xD696, 0x8B3C, 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699,\t0x8B3F, 0xD69A, 0x8B40, 0xD69B, 0x8B41, 0xD69C, 0x8B42, 0xD69D,\n\t0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, 0xD6A0, 0x8B46, 0xD740,\t0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, 0x8B4A, 0xD744,\n\t0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, 0xD748,\t0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C,\n\t0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750,\t0x8B57, 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754,\n\t0x8B5B, 0xD755, 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758,\t0x8B5F, 0xD759, 0x8B60, 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C,\n\t0x8B63, 0xD75D, 0x8B64, 0xD75E, 0x8B65, 0xD75F, 0x8B66, 0xBEAF,\t0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, 0xD762, 0x8B6A, 0xD763,\n\t0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, 0x8B6E, 0xD766,\t0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, 0xD76A,\n\t0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E,\t0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772,\n\t0x8B7B, 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776,\t0x8B7F, 0xD777, 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A,\n\t0x8B83, 0xD77B, 0x8B84, 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E,\t0x8B87, 0xD780, 0x8B88, 0xD781, 0x8B89, 0xD782, 0x8B8A, 0xD783,\n\t0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, 0xD786, 0x8B8E, 0xD787,\t0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, 0x8B92, 0xD78B,\n\t0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, 0xD78F,\t0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793,\n\t0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797,\t0x8B9F, 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9,\n\t0x8BA3, 0xB8BC, 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6,\t0x8BA7, 0xDAA7, 0x8BA8, 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8,\n\t0x8BAB, 0xC6FD, 0x8BAC, 0xD799, 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9,\t0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, 0xD79A, 0x8BB2, 0xBDB2,\n\t0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, 0x8BB6, 0xD1C8,\t0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, 0xC2DB,\n\t0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8,\t0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC,\n\t0x8BC3, 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6,\t0x8BC7, 0xD79C, 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF,\n\t0x8BCB, 0xDAAE, 0x8BCC, 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0,\t0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1,\n\t0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, 0xCAD4, 0x8BD6, 0xDAB4,\t0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, 0x8BDA, 0xB3CF,\n\t0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, 0xB5AE,\t0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF,\n\t0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA,\t0x8BE7, 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E,\n\t0x8BEB, 0xBDEB, 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD,\t0x8BEF, 0xCEF3, 0x8BF0, 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5,\n\t0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0,\t0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, 0xDAC1, 0x8BFA, 0xC5B5,\n\t0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, 0x8BFE, 0xBFCE,\t0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, 0xDAC5,\n\t0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB,\t0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA,\n\t0x8C0B, 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1,\t0x8C0F, 0xDAC9, 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB,\n\t0x8C13, 0xCEBD, 0x8C14, 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE,\t0x8C17, 0xB2F7, 0x8C18, 0xDAD1, 0x8C19, 0xDACF, 0x8C1A, 0xD1E8,\n\t0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, 0xDAD2, 0x8C1E, 0xD7A0,\t0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, 0x8C22, 0xD0BB,\n\t0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, 0xC7AB,\t0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8,\n\t0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA,\t0x8C2F, 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC,\n\t0x8C33, 0xDADD, 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF,\t0x8C37, 0xB9C8, 0x8C38, 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842,\n\t0x8C3B, 0xD843, 0x8C3C, 0xD844, 0x8C3D, 0xD845, 0x8C3E, 0xD846,\t0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, 0xBBED, 0x8C42, 0xD849,\n\t0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, 0x8C46, 0xB6B9,\t0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, 0xD84E,\n\t0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851,\t0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855,\n\t0x8C53, 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858,\t0x8C57, 0xD859, 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0,\n\t0x8C5B, 0xD85C, 0x8C5C, 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F,\t0x8C5F, 0xD860, 0x8C60, 0xD861, 0x8C61, 0xCFF3, 0x8C62, 0xBBBF,\n\t0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, 0xD864, 0x8C66, 0xD865,\t0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, 0x8C6A, 0xBAC0,\n\t0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, 0xD86B,\t0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F,\n\t0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872,\t0x8C77, 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2,\n\t0x8C7B, 0xD874, 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877,\t0x8C7F, 0xD878, 0x8C80, 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5,\n\t0x8C83, 0xD87B, 0x8C84, 0xD87C, 0x8C85, 0xF5F7, 0x8C86, 0xD87D,\t0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, 0xBAD1, 0x8C8A, 0xF5F6,\n\t0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, 0x8C8E, 0xD883,\t0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, 0xD887,\n\t0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A,\t0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D,\n\t0x8C9B, 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891,\t0x8C9F, 0xD892, 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895,\n\t0x8CA3, 0xD896, 0x8CA4, 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899,\t0x8CA7, 0xD89A, 0x8CA8, 0xD89B, 0x8CA9, 0xD89C, 0x8CAA, 0xD89D,\n\t0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, 0xD8A0, 0x8CAE, 0xD940,\t0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, 0x8CB2, 0xD944,\n\t0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, 0xD948,\t0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C,\n\t0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950,\t0x8CBF, 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954,\n\t0x8CC3, 0xD955, 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958,\t0x8CC7, 0xD959, 0x8CC8, 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C,\n\t0x8CCB, 0xD95D, 0x8CCC, 0xD95E, 0x8CCD, 0xD95F, 0x8CCE, 0xD960,\t0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, 0xD963, 0x8CD2, 0xD964,\n\t0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, 0x8CD6, 0xD968,\t0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, 0xD96C,\n\t0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970,\t0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974,\n\t0x8CE3, 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978,\t0x8CE7, 0xD979, 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C,\n\t0x8CEB, 0xD97D, 0x8CEC, 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981,\t0x8CEF, 0xD982, 0x8CF0, 0xD983, 0x8CF1, 0xD984, 0x8CF2, 0xD985,\n\t0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, 0xD988, 0x8CF6, 0xD989,\t0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, 0x8CFA, 0xD98D,\n\t0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, 0xD991,\t0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995,\n\t0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999,\t0x8D07, 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D,\n\t0x8D0B, 0xD99E, 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40,\t0x8D0F, 0xDA41, 0x8D10, 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44,\n\t0x8D13, 0xDA45, 0x8D14, 0xDA46, 0x8D15, 0xDA47, 0x8D16, 0xDA48,\t0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, 0xDA4B, 0x8D1A, 0xDA4C,\n\t0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, 0x8D1E, 0xD5EA,\t0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, 0xB2C6,\n\t0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB,\t0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0,\n\t0x8D2B, 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC,\t0x8D2F, 0xB9E1, 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA,\n\t0x8D33, 0xEADB, 0x8D34, 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC,\t0x8D37, 0xB4FB, 0x8D38, 0xC3B3, 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8,\n\t0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, 0xEADE, 0x8D3E, 0xBCD6,\t0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, 0x8D42, 0xC2B8,\n\t0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, 0xEAE1,\t0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE,\n\t0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA,\t0x8D4F, 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51,\n\t0x8D53, 0xE2D9, 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5,\t0x8D57, 0xDA52, 0x8D58, 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC,\n\t0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE,\t0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, 0xC9C4, 0x8D62, 0xD3AE,\n\t0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, 0x8D66, 0xC9E2,\t0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, 0xDA57,\n\t0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59,\t0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C,\n\t0x8D73, 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF,\t0x8D77, 0xC6F0, 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F,\n\t0x8D7B, 0xDA60, 0x8D7C, 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63,\t0x8D7F, 0xDA64, 0x8D80, 0xDA65, 0x8D81, 0xB3C3, 0x8D82, 0xDA66,\n\t0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, 0xB3AC, 0x8D86, 0xDA68,\t0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, 0x8D8A, 0xD4BD,\n\t0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, 0xDA6E,\t0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71,\n\t0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74,\t0x8D97, 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78,\n\t0x8D9B, 0xDA79, 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C,\t0x8D9F, 0xCCCB, 0x8DA0, 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80,\n\t0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, 0x8DA5, 0xDA82, 0x8DA6, 0xDA83,\t0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, 0xDA86, 0x8DAA, 0xDA87,\n\t0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, 0x8DAE, 0xDA8B,\t0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, 0xDA8E,\n\t0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F,\t0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3,\n\t0x8DBB, 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA,\t0x8DBF, 0xF5C1, 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96,\n\t0x8DC3, 0xD4BE, 0x8DC4, 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC,\t0x8DC7, 0xDA98, 0x8DC8, 0xDA99, 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B,\n\t0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, 0xDA9C, 0x8DCE, 0xF5C9,\t0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, 0x8DD2, 0xDA9E,\n\t0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, 0xF5C5,\t0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7,\n\t0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8,\t0x8DDF, 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46,\n\t0x8DE3, 0xF5D0, 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48,\t0x8DE7, 0xDB49, 0x8DE8, 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2,\n\t0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C,\t0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, 0xDB4E, 0x8DF2, 0xDB4F,\n\t0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, 0x8DF6, 0xDB51,\t0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, 0xB6E5,\n\t0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53,\t0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57,\n\t0x8E03, 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A,\t0x8E07, 0xDB5B, 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB,\n\t0x8E0B, 0xDB5D, 0x8E0C, 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F,\t0x8E0F, 0xCCA4, 0x8E10, 0xDB60, 0x8E11, 0xDB61, 0x8E12, 0xDB62,\n\t0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, 0xDB64, 0x8E16, 0xDB65,\t0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, 0x8E1A, 0xDB69,\n\t0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, 0xBEE1,\t0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF,\n\t0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70,\t0x8E27, 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9,\n\t0x8E2B, 0xDB73, 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA,\t0x8E2F, 0xF5DC, 0x8E30, 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76,\n\t0x8E33, 0xDB77, 0x8E34, 0xDB78, 0x8E35, 0xF5E0, 0x8E36, 0xDB79,\t0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, 0xF5DF, 0x8E3A, 0xF5DD,\n\t0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, 0x8E3E, 0xDB7E,\t0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, 0xF5E5,\n\t0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83,\t0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8,\n\t0x8E4B, 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86,\t0x8E4F, 0xDB87, 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7,\n\t0x8E53, 0xDB89, 0x8E54, 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C,\t0x8E57, 0xDB8D, 0x8E58, 0xDB8E, 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F,\n\t0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, 0xDB92, 0x8E5E, 0xDB93,\t0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, 0x8E62, 0xDB97,\n\t0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, 0xB1C4,\t0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D,\n\t0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F,\t0x8E6F, 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7,\n\t0x8E73, 0xDC40, 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA,\t0x8E77, 0xDC42, 0x8E78, 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45,\n\t0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, 0x8E7D, 0xDC47, 0x8E7E, 0xDC48,\t0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, 0xD4EA, 0x8E82, 0xDC4A,\n\t0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, 0x8E86, 0xDC4D,\t0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, 0xDC50,\n\t0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54,\t0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56,\n\t0x8E93, 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59,\t0x8E97, 0xDC5A, 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D,\n\t0x8E9B, 0xDC5E, 0x8E9C, 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3,\t0x8E9F, 0xDC60, 0x8EA0, 0xDC61, 0x8EA1, 0xDC62, 0x8EA2, 0xDC63,\n\t0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, 0xDC66, 0x8EA6, 0xDC67,\t0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, 0x8EAA, 0xDC6B,\n\t0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, 0xDC6D,\t0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3,\n\t0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73,\t0x8EB7, 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9,\n\t0x8EBB, 0xDC77, 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A,\t0x8EBF, 0xDC7B, 0x8EC0, 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E,\n\t0x8EC3, 0xDC80, 0x8EC4, 0xDC81, 0x8EC5, 0xDC82, 0x8EC6, 0xDC83,\t0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, 0xDC86, 0x8ECA, 0xDC87,\n\t0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, 0x8ECE, 0xEAA6,\t0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, 0xDC8E,\n\t0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92,\t0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96,\n\t0x8EDB, 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A,\t0x8EDF, 0xDC9B, 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E,\n\t0x8EE3, 0xDC9F, 0x8EE4, 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41,\t0x8EE7, 0xDD42, 0x8EE8, 0xDD43, 0x8EE9, 0xDD44, 0x8EEA, 0xDD45,\n\t0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, 0xDD48, 0x8EEE, 0xDD49,\t0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, 0x8EF2, 0xDD4D,\n\t0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, 0xDD51,\t0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55,\n\t0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59,\t0x8EFF, 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D,\n\t0x8F03, 0xDD5E, 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61,\t0x8F07, 0xDD62, 0x8F08, 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65,\n\t0x8F0B, 0xDD66, 0x8F0C, 0xDD67, 0x8F0D, 0xDD68, 0x8F0E, 0xDD69,\t0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, 0xDD6C, 0x8F12, 0xDD6D,\n\t0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, 0x8F16, 0xDD71,\t0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, 0xDD75,\n\t0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79,\t0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D,\n\t0x8F23, 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82,\t0x8F27, 0xDD83, 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86,\n\t0x8F2B, 0xDD87, 0x8F2C, 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A,\t0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, 0x8F31, 0xDD8D, 0x8F32, 0xDD8E,\n\t0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, 0xDD91, 0x8F36, 0xDD92,\t0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, 0x8F3A, 0xDD96,\n\t0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, 0xDD9A,\t0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E,\n\t0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41,\t0x8F47, 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45,\n\t0x8F4B, 0xDE46, 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49,\t0x8F4F, 0xDE4A, 0x8F50, 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D,\n\t0x8F53, 0xDE4E, 0x8F54, 0xDE4F, 0x8F55, 0xDE50, 0x8F56, 0xDE51,\t0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, 0xDE54, 0x8F5A, 0xDE55,\n\t0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, 0x8F5E, 0xDE59,\t0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, 0xDE5D,\n\t0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5,\t0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61,\n\t0x8F6B, 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6,\t0x8F6F, 0xC8ED, 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0,\n\t0x8F73, 0xE9F1, 0x8F74, 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3,\t0x8F77, 0xE9F5, 0x8F78, 0xE9F4, 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7,\n\t0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, 0xD4D8, 0x8F7E, 0xE9F9,\t0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, 0x8F82, 0xE9FB,\n\t0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, 0xC1BE,\t0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5,\n\t0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2,\t0x8F8F, 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64,\n\t0x8F93, 0xCAE4, 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD,\t0x8F97, 0xD5B7, 0x8F98, 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5,\n\t0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7,\t0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, 0xDE67, 0x8FA2, 0xDE68,\n\t0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, 0x8FA6, 0xDE6B,\t0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, 0xDE6D,\n\t0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70,\t0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72,\n\t0x8FB3, 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1,\t0x8FB7, 0xDE76, 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78,\n\t0x8FBB, 0xDE79, 0x8FBC, 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF,\t0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8,\n\t0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, 0xD1B8, 0x8FC6, 0xDE7E,\t0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, 0x8FCA, 0xDE81,\n\t0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, 0xD3AD,\t0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86,\n\t0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87,\t0x8FD7, 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89,\n\t0x8FDB, 0xBDF8, 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC,\t0x8FDF, 0xB3D9, 0x8FE0, 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6,\n\t0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8,\t0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, 0xE5C7, 0x8FEA, 0xB5CF,\n\t0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, 0x8FEE, 0xE5C5,\t0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, 0xDE91,\n\t0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94,\t0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95,\n\t0x8FFB, 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98,\t0x8FFF, 0xDE99, 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA,\n\t0x9003, 0xCCD3, 0x9004, 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6,\t0x9007, 0xDE9A, 0x9008, 0xDE9B, 0x9009, 0xD1A1, 0x900A, 0xD1B7,\n\t0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, 0xE5D0, 0x900E, 0xDE9D,\t0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, 0x9012, 0xB5DD,\n\t0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, 0xE5D1,\t0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8,\n\t0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1,\t0x901F, 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA,\n\t0x9023, 0xDF42, 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE,\t0x9027, 0xDF45, 0x9028, 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48,\n\t0x902B, 0xDF49, 0x902C, 0xDF4A, 0x902D, 0xE5D5, 0x902E, 0xB4FE,\t0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, 0xDF4C, 0x9032, 0xDF4D,\n\t0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, 0x9036, 0xE5D4,\t0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, 0xDF52,\n\t0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2,\t0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC,\n\t0x9043, 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58,\t0x9047, 0xD3F6, 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B,\n\t0x904B, 0xDF5C, 0x904C, 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E,\t0x904F, 0xB6F4, 0x9050, 0xE5DA, 0x9051, 0xE5D8, 0x9052, 0xE5D9,\n\t0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, 0xDF60, 0x9056, 0xDF61,\t0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, 0x905A, 0xDF63,\n\t0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, 0xDF66,\t0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD,\n\t0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B,\t0x9067, 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E,\n\t0x906B, 0xDF6F, 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA,\t0x906F, 0xDF71, 0x9070, 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74,\n\t0x9073, 0xDF75, 0x9074, 0xE5E0, 0x9075, 0xD7F1, 0x9076, 0xDF76,\t0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, 0xDF79, 0x907A, 0xDF7A,\n\t0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, 0x907E, 0xDF7D,\t0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, 0xE5E2,\n\t0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82,\t0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85,\n\t0x908B, 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88,\t0x908F, 0xDF89, 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B,\n\t0x9093, 0xB5CB, 0x9094, 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D,\t0x9097, 0xDAF5, 0x9098, 0xDF8E, 0x9099, 0xDAF8, 0x909A, 0xDF8F,\n\t0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, 0xDAF7, 0x909E, 0xDF91,\t0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, 0x90A2, 0xD0CF,\n\t0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, 0xB0EE,\t0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0,\n\t0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA,\t0x90AF, 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B,\n\t0x90B3, 0xDAFC, 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD,\t0x90B7, 0xDF9C, 0x90B8, 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE,\n\t0x90BB, 0xC1DA, 0x90BC, 0xDF9D, 0x90BD, 0xDF9E, 0x90BE, 0xDBA5,\t0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, 0xD3F4, 0x90C2, 0xE040,\n\t0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, 0x90C6, 0xE042,\t0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, 0xBDBC,\n\t0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9,\t0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048,\n\t0x90D3, 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B,\t0x90D7, 0xDBAD, 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E,\n\t0x90DB, 0xDBAE, 0x90DC, 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F,\t0x90DF, 0xE050, 0x90E0, 0xE051, 0x90E1, 0xBFA4, 0x90E2, 0xDBAB,\n\t0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, 0xE054, 0x90E6, 0xDBAA,\t0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, 0x90EA, 0xE056,\n\t0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, 0xE058,\t0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B,\n\t0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E,\t0x90F7, 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061,\n\t0x90FB, 0xE062, 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1,\t0x90FF, 0xE064, 0x9100, 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5,\n\t0x9103, 0xE067, 0x9104, 0xDBB2, 0x9105, 0xE068, 0x9106, 0xE069,\t0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, 0xE06C, 0x910A, 0xE06D,\n\t0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, 0x910E, 0xE071,\t0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, 0xE075,\n\t0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079,\t0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C,\n\t0x911B, 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4,\t0x911F, 0xE081, 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3,\n\t0x9123, 0xDBB5, 0x9124, 0xE084, 0x9125, 0xE085, 0x9126, 0xE086,\t0x9127, 0xE087, 0x9128, 0xE088, 0x9129, 0xE089, 0x912A, 0xE08A,\n\t0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, 0xE08D, 0x912E, 0xE08E,\t0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, 0x9132, 0xE090,\n\t0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, 0xE094,\t0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097,\n\t0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B,\t0x913F, 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F,\n\t0x9143, 0xDBB9, 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA,\t0x9147, 0xE141, 0x9148, 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA,\n\t0x914B, 0xC7F5, 0x914C, 0xD7C3, 0x914D, 0xC5E4, 0x914E, 0xF4FC,\t0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, 0xE143, 0x9152, 0xBEC6,\n\t0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, 0x9156, 0xE147,\t0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, 0xB7D3,\n\t0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA,\t0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1,\n\t0x9163, 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E,\t0x9167, 0xE14F, 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2,\n\t0x916B, 0xE151, 0x916C, 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA,\t0x916F, 0xF5A5, 0x9170, 0xF5A3, 0x9171, 0xBDB4, 0x9172, 0xF5A8,\n\t0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, 0xBDCD, 0x9176, 0xC3B8,\t0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, 0x917A, 0xE154,\n\t0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, 0xF5A7,\t0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159,\n\t0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C,\t0x9187, 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E,\n\t0x918B, 0xB4D7, 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F,\t0x918F, 0xE160, 0x9190, 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1,\n\t0x9193, 0xE161, 0x9194, 0xE162, 0x9195, 0xE163, 0x9196, 0xE164,\t0x9197, 0xE165, 0x9198, 0xE166, 0x9199, 0xE167, 0x919A, 0xC3D1,\n\t0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, 0x919E, 0xE16A,\t0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, 0xF5B0,\n\t0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170,\t0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2,\n\t0x91AB, 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4,\t0x91AF, 0xF5B5, 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178,\n\t0x91B3, 0xE179, 0x91B4, 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A,\t0x91B7, 0xE17B, 0x91B8, 0xE17C, 0x91B9, 0xE17D, 0x91BA, 0xF5B8,\n\t0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, 0xE181, 0x91BE, 0xE182,\t0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, 0x91C2, 0xE186,\n\t0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, 0xE18A,\t0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD,\n\t0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0,\t0x91CF, 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E,\n\t0x91D3, 0xE18F, 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192,\t0x91D7, 0xE193, 0x91D8, 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196,\n\t0x91DB, 0xE197, 0x91DC, 0xB8AA, 0x91DD, 0xE198, 0x91DE, 0xE199,\t0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, 0xE19C, 0x91E2, 0xE19D,\n\t0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, 0x91E6, 0xE240,\t0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, 0xE244,\n\t0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248,\t0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C,\n\t0x91F3, 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250,\t0x91F7, 0xE251, 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254,\n\t0x91FB, 0xE255, 0x91FC, 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258,\t0x91FF, 0xE259, 0x9200, 0xE25A, 0x9201, 0xE25B, 0x9202, 0xE25C,\n\t0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, 0xE25F, 0x9206, 0xE260,\t0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, 0x920A, 0xE264,\n\t0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, 0xE268,\t0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C,\n\t0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270,\t0x9217, 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274,\n\t0x921B, 0xE275, 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278,\t0x921F, 0xE279, 0x9220, 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C,\n\t0x9223, 0xE27D, 0x9224, 0xE27E, 0x9225, 0xE280, 0x9226, 0xE281,\t0x9227, 0xE282, 0x9228, 0xE283, 0x9229, 0xE284, 0x922A, 0xE285,\n\t0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, 0x922E, 0xE289,\t0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, 0xE28D,\n\t0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291,\t0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295,\n\t0x923B, 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299,\t0x923F, 0xE29A, 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D,\n\t0x9243, 0xE29E, 0x9244, 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340,\t0x9247, 0xE341, 0x9248, 0xE342, 0x9249, 0xE343, 0x924A, 0xE344,\n\t0x924B, 0xE345, 0x924C, 0xE346, 0x924D, 0xE347, 0x924E, 0xE348,\t0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, 0x9252, 0xE34C,\n\t0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, 0xE350,\t0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354,\n\t0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358,\t0x925F, 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C,\n\t0x9263, 0xE35D, 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360,\t0x9267, 0xE361, 0x9268, 0xE362, 0x9269, 0xE363, 0x926A, 0xE364,\n\t0x926B, 0xE365, 0x926C, 0xE366, 0x926D, 0xE367, 0x926E, 0xE368,\t0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, 0xE36B, 0x9272, 0xE36C,\n\t0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, 0x9276, 0xE36F,\t0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, 0xE373,\n\t0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377,\t0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B,\n\t0x9283, 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380,\t0x9287, 0xE381, 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384,\n\t0x928B, 0xE385, 0x928C, 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6,\t0x928F, 0xE388, 0x9290, 0xE389, 0x9291, 0xE38A, 0x9292, 0xE38B,\n\t0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, 0xE38E, 0x9296, 0xE38F,\t0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, 0x929A, 0xE393,\n\t0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, 0xE397,\t0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B,\n\t0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F,\t0x92A7, 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442,\n\t0x92AB, 0xE443, 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7,\t0x92AF, 0xE446, 0x92B0, 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449,\n\t0x92B3, 0xE44A, 0x92B4, 0xE44B, 0x92B5, 0xE44C, 0x92B6, 0xE44D,\t0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, 0xE450, 0x92BA, 0xE451,\n\t0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, 0x92BE, 0xE455,\t0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, 0xE459,\n\t0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D,\t0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460,\n\t0x92CB, 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464,\t0x92CF, 0xE465, 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468,\n\t0x92D3, 0xE469, 0x92D4, 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C,\t0x92D7, 0xE46D, 0x92D8, 0xE46E, 0x92D9, 0xE46F, 0x92DA, 0xE470,\n\t0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, 0xE473, 0x92DE, 0xE474,\t0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, 0x92E2, 0xE478,\n\t0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, 0xE47C,\t0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481,\n\t0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485,\t0x92EF, 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489,\n\t0x92F3, 0xE48A, 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D,\t0x92F7, 0xE48E, 0x92F8, 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491,\n\t0x92FB, 0xE492, 0x92FC, 0xE493, 0x92FD, 0xE494, 0x92FE, 0xE495,\t0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, 0xE498, 0x9302, 0xE499,\n\t0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, 0x9306, 0xE49D,\t0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, 0xE540,\n\t0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544,\t0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548,\n\t0x9313, 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C,\t0x9317, 0xE54D, 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550,\n\t0x931B, 0xE551, 0x931C, 0xE552, 0x931D, 0xE553, 0x931E, 0xE554,\t0x931F, 0xE555, 0x9320, 0xE556, 0x9321, 0xE557, 0x9322, 0xE558,\n\t0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, 0xE55B, 0x9326, 0xE55C,\t0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, 0x932A, 0xE560,\n\t0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, 0xE564,\t0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568,\n\t0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C,\t0x9337, 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570,\n\t0x933B, 0xE571, 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9,\t0x933F, 0xE574, 0x9340, 0xE575, 0x9341, 0xE576, 0x9342, 0xE577,\n\t0x9343, 0xE578, 0x9344, 0xE579, 0x9345, 0xE57A, 0x9346, 0xE57B,\t0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, 0xE57E, 0x934A, 0xE580,\n\t0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, 0x934E, 0xE584,\t0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, 0xE588,\n\t0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C,\t0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590,\n\t0x935B, 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594,\t0x935F, 0xE595, 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598,\n\t0x9363, 0xE599, 0x9364, 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C,\t0x9367, 0xE59D, 0x9368, 0xE59E, 0x9369, 0xE59F, 0x936A, 0xF6CA,\n\t0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, 0xE641, 0x936E, 0xE642,\t0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, 0x9372, 0xE646,\n\t0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, 0xE64A,\t0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E,\n\t0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652,\t0x937F, 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656,\n\t0x9383, 0xE657, 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A,\t0x9387, 0xE65B, 0x9388, 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E,\n\t0x938B, 0xE65F, 0x938C, 0xE660, 0x938D, 0xE661, 0x938E, 0xE662,\t0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, 0xE664, 0x9392, 0xE665,\n\t0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, 0x9396, 0xE669,\t0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, 0xE66D,\n\t0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671,\t0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675,\n\t0x93A3, 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679,\t0x93A7, 0xE67A, 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D,\n\t0x93AB, 0xE67E, 0x93AC, 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682,\t0x93AF, 0xE683, 0x93B0, 0xE684, 0x93B1, 0xE685, 0x93B2, 0xE686,\n\t0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, 0xE689, 0x93B6, 0xE68A,\t0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, 0x93BA, 0xE68E,\n\t0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, 0xE692,\t0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696,\n\t0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A,\t0x93C7, 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB,\n\t0x93CB, 0xE69E, 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740,\t0x93CF, 0xE741, 0x93D0, 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744,\n\t0x93D3, 0xE745, 0x93D4, 0xE746, 0x93D5, 0xE747, 0x93D6, 0xF7E9,\t0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, 0xE74A, 0x93DA, 0xE74B,\n\t0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, 0x93DE, 0xE74F,\t0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, 0xE753,\n\t0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757,\t0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B,\n\t0x93EB, 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F,\t0x93EF, 0xE760, 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763,\n\t0x93F3, 0xE764, 0x93F4, 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767,\t0x93F7, 0xE768, 0x93F8, 0xE769, 0x93F9, 0xE76A, 0x93FA, 0xE76B,\n\t0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, 0xE76E, 0x93FE, 0xE76F,\t0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, 0x9402, 0xE773,\n\t0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, 0xE777,\t0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B,\n\t0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780,\t0x940F, 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784,\n\t0x9413, 0xE785, 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788,\t0x9417, 0xE789, 0x9418, 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C,\n\t0x941B, 0xE78D, 0x941C, 0xE78E, 0x941D, 0xE78F, 0x941E, 0xE790,\t0x941F, 0xE791, 0x9420, 0xE792, 0x9421, 0xE793, 0x9422, 0xE794,\n\t0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, 0x9426, 0xE798,\t0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, 0xE79C,\n\t0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0,\t0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843,\n\t0x9433, 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847,\t0x9437, 0xE848, 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B,\n\t0x943B, 0xE84C, 0x943C, 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD,\t0x943F, 0xE84F, 0x9440, 0xE850, 0x9441, 0xE851, 0x9442, 0xE852,\n\t0x9443, 0xE853, 0x9444, 0xE854, 0x9445, 0xE855, 0x9446, 0xE856,\t0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, 0x944A, 0xE85A,\n\t0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, 0xE85E,\t0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862,\n\t0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866,\t0x9457, 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A,\n\t0x945B, 0xE86B, 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E,\t0x945F, 0xE86F, 0x9460, 0xE870, 0x9461, 0xE871, 0x9462, 0xE872,\n\t0x9463, 0xE873, 0x9464, 0xE874, 0x9465, 0xE875, 0x9466, 0xE876,\t0x9467, 0xE877, 0x9468, 0xE878, 0x9469, 0xE879, 0x946A, 0xE87A,\n\t0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, 0x946E, 0xE87D,\t0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, 0xE882,\n\t0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886,\t0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A,\n\t0x947B, 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E,\t0x947F, 0xE88F, 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892,\n\t0x9483, 0xE893, 0x9484, 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5,\t0x9487, 0xEEC6, 0x9488, 0xD5EB, 0x9489, 0xB6A4, 0x948A, 0xEEC8,\n\t0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, 0xEECA, 0x948E, 0xC7A5,\t0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, 0x9492, 0xB7B0,\n\t0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, 0xE896,\t0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0,\n\t0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE,\t0x949F, 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6,\n\t0x94A3, 0xEED3, 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5,\t0x94A7, 0xBEFB, 0x94A8, 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6,\n\t0x94AB, 0xEED5, 0x94AC, 0xEED8, 0x94AD, 0xEED7, 0x94AE, 0xC5A5,\t0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, 0xC7AE, 0x94B2, 0xEEDB,\n\t0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, 0x94B6, 0xEEDD,\t0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, 0xEEE1,\n\t0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8,\t0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC,\n\t0x94C3, 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD,\t0x94C7, 0xE898, 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8,\n\t0x94CB, 0xEEE9, 0x94CC, 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC,\t0x94CF, 0xE899, 0x94D0, 0xEEED, 0x94D1, 0xEEEE, 0x94D2, 0xEEEF,\n\t0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, 0xEEF0, 0x94D6, 0xEEF1,\t0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, 0x94DA, 0xE89C,\n\t0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, 0xEEF6,\t0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9,\n\t0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D,\t0x94E7, 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE,\n\t0x94EB, 0xEFA2, 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3,\t0x94EF, 0xEFA4, 0x94F0, 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9,\n\t0x94F3, 0xEFA5, 0x94F4, 0xEFA6, 0x94F5, 0xEFA7, 0x94F6, 0xD2F8,\t0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, 0xEFA9, 0x94FA, 0xC6CC,\n\t0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, 0x94FE, 0xC1B4,\t0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, 0xEFAE,\n\t0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF,\t0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2,\n\t0x950B, 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4,\t0x950F, 0xEFB5, 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6,\n\t0x9513, 0xEFB7, 0x9514, 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA,\t0x9517, 0xD5E0, 0x9518, 0xEFBB, 0x9519, 0xB4ED, 0x951A, 0xC3AA,\n\t0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, 0xEFBD, 0x951E, 0xEFBE,\t0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, 0x9522, 0xEFC0,\n\t0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, 0xBDF5,\t0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1,\n\t0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC,\t0x952F, 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6,\n\t0x9533, 0xE941, 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8,\t0x9537, 0xEFC9, 0x9538, 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1,\n\t0x953B, 0xB6CD, 0x953C, 0xEFCB, 0x953D, 0xE942, 0x953E, 0xEFCC,\t0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, 0xC3BE, 0x9542, 0xEFCE,\n\t0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, 0x9546, 0xEFD2,\t0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, 0xC4F7,\n\t0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5,\t0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7,\n\t0x9553, 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA,\t0x9557, 0xEFDB, 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947,\n\t0x955B, 0xEFDE, 0x955C, 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF,\t0x955F, 0xEFE0, 0x9560, 0xE948, 0x9561, 0xEFE2, 0x9562, 0xEFE3,\n\t0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, 0xEFE5, 0x9566, 0xEFE6,\t0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, 0x956A, 0xEFEA,\n\t0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, 0xE949,\t0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF,\n\t0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2,\t0x9577, 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F,\n\t0x957B, 0xE950, 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953,\t0x957F, 0xB3A4, 0x9580, 0xE954, 0x9581, 0xE955, 0x9582, 0xE956,\n\t0x9583, 0xE957, 0x9584, 0xE958, 0x9585, 0xE959, 0x9586, 0xE95A,\t0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, 0xE95D, 0x958A, 0xE95E,\n\t0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, 0x958E, 0xE962,\t0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, 0xE966,\n\t0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A,\t0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E,\n\t0x959B, 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972,\t0x959F, 0xE973, 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976,\n\t0x95A3, 0xE977, 0x95A4, 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A,\t0x95A7, 0xE97B, 0x95A8, 0xE97C, 0x95A9, 0xE97D, 0x95AA, 0xE97E,\n\t0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, 0xE982, 0x95AE, 0xE983,\t0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, 0x95B2, 0xE987,\n\t0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, 0xE98B,\t0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F,\n\t0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993,\t0x95BF, 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997,\n\t0x95C3, 0xE998, 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B,\t0x95C7, 0xE99C, 0x95C8, 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F,\n\t0x95CB, 0xE9A0, 0x95CC, 0xEA40, 0x95CD, 0xEA41, 0x95CE, 0xEA42,\t0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, 0xEA45, 0x95D2, 0xEA46,\n\t0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, 0x95D6, 0xEA4A,\t0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, 0xEA4E,\n\t0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52,\t0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56,\n\t0x95E3, 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A,\t0x95E7, 0xEA5B, 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1,\n\t0x95EB, 0xE3C6, 0x95EC, 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA,\t0x95EF, 0xB4B3, 0x95F0, 0xC8F2, 0x95F1, 0xE3C7, 0x95F2, 0xCFD0,\n\t0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, 0xE3C9, 0x95F6, 0xE3CA,\t0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, 0x95FA, 0xB9EB,\n\t0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, 0xE3CC,\t0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2,\n\t0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF,\t0x9607, 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1,\n\t0x960B, 0xE3D2, 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6,\t0x960F, 0xE3D5, 0x9610, 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6,\n\t0x9613, 0xEA5F, 0x9614, 0xC0AB, 0x9615, 0xE3D7, 0x9616, 0xE3D8,\t0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, 0xE3DA, 0x961A, 0xE3DB,\n\t0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, 0x961E, 0xEA62,\t0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, 0xDAE3,\n\t0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67,\t0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6,\n\t0x962B, 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE,\t0x962F, 0xEA6E, 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0,\n\t0x9633, 0xD1F4, 0x9634, 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7,\t0x9637, 0xEA70, 0x9638, 0xEA71, 0x9639, 0xEA72, 0x963A, 0xEA73,\n\t0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, 0xDAE7, 0x963E, 0xEA74,\t0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, 0x9642, 0xDAE9,\n\t0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, 0xC2BD,\t0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77,\n\t0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78,\t0x964F, 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B,\n\t0x9653, 0xEA7C, 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D,\t0x9657, 0xEA7E, 0x9658, 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82,\n\t0x965B, 0xB1DD, 0x965C, 0xEA83, 0x965D, 0xEA84, 0x965E, 0xEA85,\t0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, 0xB6B8, 0x9662, 0xD4BA,\n\t0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, 0x9666, 0xEA89,\t0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, 0xC5E3,\n\t0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C,\t0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF,\n\t0x9673, 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5,\t0x9677, 0xCFDD, 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93,\n\t0x967B, 0xEA94, 0x967C, 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97,\t0x967F, 0xEA98, 0x9680, 0xEA99, 0x9681, 0xEA9A, 0x9682, 0xEA9B,\n\t0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, 0xD3E7, 0x9686, 0xC2A1,\t0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, 0x968A, 0xEAA0,\n\t0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, 0xEB41,\t0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43,\n\t0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46,\t0x9697, 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47,\n\t0x969B, 0xEB48, 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A,\t0x969F, 0xEB4B, 0x96A0, 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E,\n\t0x96A3, 0xEB4F, 0x96A4, 0xEB50, 0x96A5, 0xEB51, 0x96A6, 0xEB52,\t0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, 0xEB54, 0x96AA, 0xEB55,\n\t0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, 0x96AE, 0xEB59,\t0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, 0xEB5C,\n\t0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5,\t0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61,\n\t0x96BB, 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1,\t0x96BF, 0xEB63, 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64,\n\t0x96C3, 0xEB65, 0x96C4, 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF,\t0x96C7, 0xB9CD, 0x96C8, 0xEB66, 0x96C9, 0xEFF4, 0x96CA, 0xEB67,\n\t0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, 0xD3BA, 0x96CE, 0xF6C2,\t0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, 0x96D2, 0xF6C3,\n\t0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, 0xEB6D,\t0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71,\n\t0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75,\t0x96DF, 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78,\n\t0x96E3, 0xEB79, 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C,\t0x96E7, 0xEB7D, 0x96E8, 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9,\n\t0x96EB, 0xEB7E, 0x96EC, 0xEB80, 0x96ED, 0xEB81, 0x96EE, 0xEB82,\t0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, 0xEB84, 0x96F2, 0xEB85,\n\t0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, 0x96F6, 0xC1E3,\t0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, 0xEB89,\n\t0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED,\t0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E,\n\t0x9703, 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA,\t0x9707, 0xD5F0, 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91,\n\t0x970B, 0xEB92, 0x970C, 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE,\t0x970F, 0xF6AD, 0x9710, 0xEB94, 0x9711, 0xEB95, 0x9712, 0xEB96,\n\t0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, 0xEB98, 0x9716, 0xC1D8,\t0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, 0x971A, 0xEB9C,\n\t0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, 0xCFBC,\t0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41,\n\t0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45,\t0x9727, 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF,\n\t0x972B, 0xEC49, 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B,\t0x972F, 0xEC4C, 0x9730, 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6,\n\t0x9733, 0xEC4E, 0x9734, 0xEC4F, 0x9735, 0xEC50, 0x9736, 0xEC51,\t0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, 0xC5F9, 0x973A, 0xEC53,\n\t0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, 0x973E, 0xF6B2,\t0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, 0xEC5A,\n\t0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E,\t0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62,\n\t0x974B, 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66,\t0x974F, 0xEC67, 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0,\n\t0x9753, 0xF6A6, 0x9754, 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8,\t0x9757, 0xEC6C, 0x9758, 0xEC6D, 0x9759, 0xBEB2, 0x975A, 0xEC6E,\n\t0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, 0xEC70, 0x975E, 0xB7C7,\t0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, 0x9762, 0xC3E6,\n\t0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, 0xEC74,\t0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77,\n\t0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B,\t0x976F, 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80,\n\t0x9773, 0xBDF9, 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0,\t0x9777, 0xEC82, 0x9778, 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85,\n\t0x977B, 0xEC86, 0x977C, 0xF7B0, 0x977D, 0xEC87, 0x977E, 0xEC88,\t0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, 0xEC8B, 0x9782, 0xEC8C,\n\t0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, 0x9786, 0xEC8F,\t0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, 0xEC93,\n\t0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95,\t0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3,\n\t0x9793, 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A,\t0x9797, 0xEC9B, 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D,\n\t0x979B, 0xEC9E, 0x979C, 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40,\t0x979F, 0xED41, 0x97A0, 0xBECF, 0x97A1, 0xED42, 0x97A2, 0xED43,\n\t0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, 0xED45, 0x97A6, 0xED46,\t0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, 0x97AA, 0xED4A,\n\t0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, 0xED4C,\t0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8,\n\t0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51,\t0x97B7, 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55,\n\t0x97BB, 0xED56, 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59,\t0x97BF, 0xED5A, 0x97C0, 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D,\n\t0x97C3, 0xED5E, 0x97C4, 0xED5F, 0x97C5, 0xED60, 0x97C6, 0xED61,\t0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, 0xED64, 0x97CA, 0xED65,\n\t0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, 0x97CE, 0xED69,\t0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, 0xED6D,\n\t0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71,\t0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75,\n\t0x97DB, 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79,\t0x97DF, 0xED7A, 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D,\n\t0x97E3, 0xED7E, 0x97E4, 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4,\t0x97E7, 0xC8CD, 0x97E8, 0xED82, 0x97E9, 0xBAAB, 0x97EA, 0xE8B8,\n\t0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, 0xBEC2, 0x97EE, 0xED83,\t0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, 0x97F2, 0xED87,\n\t0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, 0xC9D8,\t0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C,\n\t0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90,\t0x97FF, 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94,\n\t0x9803, 0xED95, 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98,\t0x9807, 0xED99, 0x9808, 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C,\n\t0x980B, 0xED9D, 0x980C, 0xED9E, 0x980D, 0xED9F, 0x980E, 0xEDA0,\t0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, 0xEE42, 0x9812, 0xEE43,\n\t0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, 0x9816, 0xEE47,\t0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, 0xEE4B,\n\t0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F,\t0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53,\n\t0x9823, 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57,\t0x9827, 0xEE58, 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B,\n\t0x982B, 0xEE5C, 0x982C, 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F,\t0x982F, 0xEE60, 0x9830, 0xEE61, 0x9831, 0xEE62, 0x9832, 0xEE63,\n\t0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, 0xEE66, 0x9836, 0xEE67,\t0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, 0x983A, 0xEE6B,\n\t0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, 0xEE6F,\t0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73,\n\t0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77,\t0x9847, 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B,\n\t0x984B, 0xEE7C, 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80,\t0x984F, 0xEE81, 0x9850, 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84,\n\t0x9853, 0xEE85, 0x9854, 0xEE86, 0x9855, 0xEE87, 0x9856, 0xEE88,\t0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, 0xEE8B, 0x985A, 0xEE8C,\n\t0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, 0x985E, 0xEE90,\t0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, 0xEE94,\n\t0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98,\t0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C,\n\t0x986B, 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0,\t0x986F, 0xEF40, 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43,\n\t0x9873, 0xEF44, 0x9874, 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5,\t0x9877, 0xC7EA, 0x9878, 0xF1FC, 0x9879, 0xCFEE, 0x987A, 0xCBB3,\n\t0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, 0xCDE7, 0x987E, 0xB9CB,\t0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, 0x9882, 0xCBCC,\n\t0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, 0xC1EC,\t0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5,\n\t0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47,\t0x988F, 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48,\n\t0x9893, 0xCDC7, 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1,\t0x9897, 0xBFC5, 0x9898, 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6,\n\t0x989B, 0xF2A7, 0x989C, 0xD1D5, 0x989D, 0xB6EE, 0x989E, 0xF2A8,\t0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, 0xF2AA, 0x98A2, 0xF2AB,\n\t0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, 0x98A6, 0xF2AD,\t0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, 0xEF4E,\n\t0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52,\t0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56,\n\t0x98B3, 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A,\t0x98B7, 0xEF5B, 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E,\n\t0x98BB, 0xEF5F, 0x98BC, 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62,\t0x98BF, 0xEF63, 0x98C0, 0xEF64, 0x98C1, 0xEF65, 0x98C2, 0xEF66,\n\t0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, 0xEF69, 0x98C6, 0xEF6A,\t0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, 0x98CA, 0xEF6E,\n\t0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, 0xB7E7,\t0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA,\n\t0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75,\t0x98D7, 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE,\n\t0x98DB, 0xEF77, 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9,\t0x98DF, 0xCAB3, 0x98E0, 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C,\n\t0x98E3, 0xEF7D, 0x98E4, 0xEF7E, 0x98E5, 0xEF80, 0x98E6, 0xEF81,\t0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, 0xEF82, 0x98EA, 0xEF83,\n\t0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, 0x98EE, 0xEF87,\t0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, 0xEF8B,\n\t0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F,\t0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93,\n\t0x98FB, 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97,\t0x98FF, 0xEF98, 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B,\n\t0x9903, 0xEF9C, 0x9904, 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F,\t0x9907, 0xEFA0, 0x9908, 0xF040, 0x9909, 0xF041, 0x990A, 0xF042,\n\t0x990B, 0xF043, 0x990C, 0xF044, 0x990D, 0xF7D0, 0x990E, 0xF045,\t0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, 0x9912, 0xF048,\n\t0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, 0xF04C,\t0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050,\n\t0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054,\t0x991F, 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058,\n\t0x9923, 0xF059, 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C,\t0x9927, 0xF05D, 0x9928, 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060,\n\t0x992B, 0xF061, 0x992C, 0xF062, 0x992D, 0xF063, 0x992E, 0xF7D1,\t0x992F, 0xF064, 0x9930, 0xF065, 0x9931, 0xF066, 0x9932, 0xF067,\n\t0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, 0x9936, 0xF06B,\t0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, 0xF06F,\n\t0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073,\t0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077,\n\t0x9943, 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B,\t0x9947, 0xF07C, 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080,\n\t0x994B, 0xF081, 0x994C, 0xF082, 0x994D, 0xF083, 0x994E, 0xF084,\t0x994F, 0xF085, 0x9950, 0xF086, 0x9951, 0xF087, 0x9952, 0xF088,\n\t0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, 0xF7D2, 0x9956, 0xF08A,\t0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, 0x995A, 0xF08E,\n\t0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, 0xF092,\t0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096,\n\t0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098,\t0x9967, 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF,\n\t0x996B, 0xE2C0, 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB,\t0x996F, 0xBDA4, 0x9970, 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7,\n\t0x9973, 0xF099, 0x9974, 0xE2C2, 0x9975, 0xB6FC, 0x9976, 0xC8C4,\t0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, 0xF09B, 0x997A, 0xBDC8,\n\t0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, 0x997E, 0xF09D,\t0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, 0xF09E,\n\t0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD,\t0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8,\n\t0x998B, 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141,\t0x998F, 0xC1F3, 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8,\n\t0x9993, 0xE2CC, 0x9994, 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7,\t0x9997, 0xD8B8, 0x9998, 0xD9E5, 0x9999, 0xCFE3, 0x999A, 0xF142,\n\t0x999B, 0xF143, 0x999C, 0xF144, 0x999D, 0xF145, 0x999E, 0xF146,\t0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, 0x99A2, 0xF14A,\n\t0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, 0xF14D,\t0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150,\n\t0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154,\t0x99AF, 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158,\n\t0x99B3, 0xF159, 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C,\t0x99B7, 0xF15D, 0x99B8, 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160,\n\t0x99BB, 0xF161, 0x99BC, 0xF162, 0x99BD, 0xF163, 0x99BE, 0xF164,\t0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, 0xF167, 0x99C2, 0xF168,\n\t0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, 0x99C6, 0xF16C,\t0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, 0xF170,\n\t0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174,\t0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178,\n\t0x99D3, 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C,\t0x99D7, 0xF17D, 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181,\n\t0x99DB, 0xF182, 0x99DC, 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185,\t0x99DF, 0xF186, 0x99E0, 0xF187, 0x99E1, 0xF188, 0x99E2, 0xF189,\n\t0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, 0xF18C, 0x99E6, 0xF18D,\t0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, 0x99EA, 0xF191,\n\t0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, 0xF195,\t0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199,\n\t0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D,\t0x99F7, 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240,\n\t0x99FB, 0xF241, 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244,\t0x99FF, 0xF245, 0x9A00, 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248,\n\t0x9A03, 0xF249, 0x9A04, 0xF24A, 0x9A05, 0xF24B, 0x9A06, 0xF24C,\t0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, 0xF24F, 0x9A0A, 0xF250,\n\t0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, 0x9A0E, 0xF254,\t0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, 0xF258,\n\t0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C,\t0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260,\n\t0x9A1B, 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264,\t0x9A1F, 0xF265, 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268,\n\t0x9A23, 0xF269, 0x9A24, 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C,\t0x9A27, 0xF26D, 0x9A28, 0xF26E, 0x9A29, 0xF26F, 0x9A2A, 0xF270,\n\t0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, 0xF273, 0x9A2E, 0xF274,\t0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, 0x9A32, 0xF278,\n\t0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, 0xF27C,\t0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281,\n\t0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285,\t0x9A3F, 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289,\n\t0x9A43, 0xF28A, 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D,\t0x9A47, 0xF28E, 0x9A48, 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291,\n\t0x9A4B, 0xF292, 0x9A4C, 0xF293, 0x9A4D, 0xF294, 0x9A4E, 0xF295,\t0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, 0xF298, 0x9A52, 0xF299,\n\t0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, 0x9A56, 0xF29D,\t0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, 0xF340,\n\t0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344,\t0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348,\n\t0x9A63, 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C,\t0x9A67, 0xF34D, 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350,\n\t0x9A6B, 0xF351, 0x9A6C, 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4,\t0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, 0x9A71, 0xC7FD, 0x9A72, 0xF352,\n\t0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, 0xE6E0, 0x9A76, 0xCABB,\t0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, 0x9A7A, 0xE6E3,\n\t0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, 0xBCDD,\t0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE,\n\t0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6,\t0x9A87, 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA,\n\t0x9A8B, 0xB3D2, 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356,\t0x9A8F, 0xBFA5, 0x9A90, 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC,\n\t0x9A93, 0xE6ED, 0x9A94, 0xF357, 0x9A95, 0xF358, 0x9A96, 0xE6EE,\t0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, 0xF359, 0x9A9A, 0xC9A7,\n\t0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, 0x9A9E, 0xE5B9,\t0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, 0xE6F5,\n\t0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A,\t0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C,\n\t0x9AAB, 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360,\t0x9AAF, 0xF361, 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362,\n\t0x9AB3, 0xF363, 0x9AB4, 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE,\t0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, 0x9AB9, 0xF366, 0x9ABA, 0xF7BF,\n\t0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, 0xF368, 0x9ABE, 0xF369,\t0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, 0x9AC2, 0xF7C4,\n\t0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, 0xF36D,\t0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371,\n\t0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373,\t0x9ACF, 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376,\n\t0x9AD3, 0xCBE8, 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379,\t0x9AD7, 0xF37A, 0x9AD8, 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C,\n\t0x9ADB, 0xF37D, 0x9ADC, 0xF37E, 0x9ADD, 0xF380, 0x9ADE, 0xF381,\t0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, 0xF7D5, 0x9AE2, 0xF383,\n\t0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, 0x9AE6, 0xF7D6,\t0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, 0xF38A,\n\t0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C,\t0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F,\n\t0x9AF3, 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393,\t0x9AF7, 0xF394, 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396,\n\t0x9AFB, 0xF7D9, 0x9AFC, 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399,\t0x9AFF, 0xF39A, 0x9B00, 0xF39B, 0x9B01, 0xF39C, 0x9B02, 0xF39D,\n\t0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, 0xF39F, 0x9B06, 0xF3A0,\t0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, 0x9B0A, 0xF442,\n\t0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, 0xF446,\t0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449,\n\t0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C,\t0x9B17, 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450,\n\t0x9B1B, 0xF451, 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454,\t0x9B1F, 0xF7DF, 0x9B20, 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457,\n\t0x9B23, 0xF7E0, 0x9B24, 0xF458, 0x9B25, 0xF459, 0x9B26, 0xF45A,\t0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, 0xF45D, 0x9B2A, 0xF45E,\n\t0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, 0x9B2E, 0xF462,\t0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, 0xD8AA,\n\t0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468,\t0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C,\n\t0x9B3B, 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E,\t0x9B3F, 0xF46F, 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA,\n\t0x9B43, 0xF7C9, 0x9B44, 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471,\t0x9B47, 0xF7CA, 0x9B48, 0xF7CC, 0x9B49, 0xF7CB, 0x9B4A, 0xF472,\n\t0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, 0xF7CD, 0x9B4E, 0xF475,\t0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, 0x9B52, 0xF477,\n\t0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, 0xF47A,\t0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E,\n\t0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483,\t0x9B5F, 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487,\n\t0x9B63, 0xF488, 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B,\t0x9B67, 0xF48C, 0x9B68, 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F,\n\t0x9B6B, 0xF490, 0x9B6C, 0xF491, 0x9B6D, 0xF492, 0x9B6E, 0xF493,\t0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, 0xF496, 0x9B72, 0xF497,\n\t0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, 0x9B76, 0xF49B,\t0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, 0xF49F,\n\t0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542,\t0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546,\n\t0x9B83, 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A,\t0x9B87, 0xF54B, 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E,\n\t0x9B8B, 0xF54F, 0x9B8C, 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552,\t0x9B8F, 0xF553, 0x9B90, 0xF554, 0x9B91, 0xF555, 0x9B92, 0xF556,\n\t0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, 0xF559, 0x9B96, 0xF55A,\t0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, 0x9B9A, 0xF55E,\n\t0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, 0xF562,\t0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566,\n\t0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A,\t0x9BA7, 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E,\n\t0x9BAB, 0xF56F, 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572,\t0x9BAF, 0xF573, 0x9BB0, 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576,\n\t0x9BB3, 0xF577, 0x9BB4, 0xF578, 0x9BB5, 0xF579, 0x9BB6, 0xF57A,\t0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, 0xF57D, 0x9BBA, 0xF57E,\n\t0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, 0x9BBE, 0xF583,\t0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, 0xF587,\n\t0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B,\t0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F,\n\t0x9BCB, 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593,\t0x9BCF, 0xF594, 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597,\n\t0x9BD3, 0xF598, 0x9BD4, 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B,\t0x9BD7, 0xF59C, 0x9BD8, 0xF59D, 0x9BD9, 0xF59E, 0x9BDA, 0xF59F,\n\t0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, 0xF641, 0x9BDE, 0xF642,\t0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, 0x9BE2, 0xF646,\n\t0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, 0xF64A,\t0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E,\n\t0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652,\t0x9BEF, 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656,\n\t0x9BF3, 0xF657, 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A,\t0x9BF7, 0xF65B, 0x9BF8, 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E,\n\t0x9BFB, 0xF65F, 0x9BFC, 0xF660, 0x9BFD, 0xF661, 0x9BFE, 0xF662,\t0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, 0xF665, 0x9C02, 0xF666,\n\t0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, 0x9C06, 0xF66A,\t0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, 0xF66E,\n\t0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672,\t0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676,\n\t0x9C13, 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A,\t0x9C17, 0xF67B, 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E,\n\t0x9C1B, 0xF680, 0x9C1C, 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683,\t0x9C1F, 0xF684, 0x9C20, 0xF685, 0x9C21, 0xF686, 0x9C22, 0xF687,\n\t0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, 0xF68A, 0x9C26, 0xF68B,\t0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, 0x9C2A, 0xF68F,\n\t0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, 0xF693,\t0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697,\n\t0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B,\t0x9C37, 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F,\n\t0x9C3B, 0xF6A0, 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742,\t0x9C3F, 0xF743, 0x9C40, 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746,\n\t0x9C43, 0xF747, 0x9C44, 0xF748, 0x9C45, 0xF749, 0x9C46, 0xF74A,\t0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, 0xF74D, 0x9C4A, 0xF74E,\n\t0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, 0x9C4E, 0xF752,\t0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, 0xF756,\n\t0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A,\t0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E,\n\t0x9C5B, 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762,\t0x9C5F, 0xF763, 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766,\n\t0x9C63, 0xF767, 0x9C64, 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A,\t0x9C67, 0xF76B, 0x9C68, 0xF76C, 0x9C69, 0xF76D, 0x9C6A, 0xF76E,\n\t0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, 0xF771, 0x9C6E, 0xF772,\t0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, 0x9C72, 0xF776,\n\t0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, 0xF77A,\t0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E,\n\t0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782,\t0x9C7F, 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0,\n\t0x9C83, 0xF784, 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2,\t0x9C87, 0xF6D3, 0x9C88, 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787,\n\t0x9C8B, 0xF6D6, 0x9C8C, 0xF788, 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7,\t0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, 0xF6D9, 0x9C92, 0xF6DA,\n\t0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, 0x9C96, 0xF78B,\t0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, 0xF6DD,\n\t0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF,\t0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3,\n\t0x9CA3, 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6,\t0x9CA7, 0xF6E7, 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790,\n\t0x9CAB, 0xF6EA, 0x9CAC, 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC,\t0x9CAF, 0xF792, 0x9CB0, 0xF6ED, 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF,\n\t0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, 0xF6F2, 0x9CB6, 0xF6F3,\t0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, 0x9CBA, 0xF6F5,\n\t0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, 0xF794,\t0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798,\n\t0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB,\t0x9CC7, 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD,\n\t0x9CCB, 0xF6FE, 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3,\t0x9CCF, 0xF7A4, 0x9CD0, 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C,\n\t0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE,\t0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, 0xF7AB, 0x9CDA, 0xF79D,\n\t0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, 0x9CDE, 0xC1DB,\t0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, 0xF7AF,\n\t0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843,\t0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847,\n\t0x9CEB, 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B,\t0x9CEF, 0xF84C, 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F,\n\t0x9CF3, 0xF850, 0x9CF4, 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853,\t0x9CF7, 0xF854, 0x9CF8, 0xF855, 0x9CF9, 0xF856, 0x9CFA, 0xF857,\n\t0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, 0xF85A, 0x9CFE, 0xF85B,\t0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, 0x9D02, 0xF85F,\n\t0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, 0xF863,\t0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867,\n\t0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B,\t0x9D0F, 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F,\n\t0x9D13, 0xF870, 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873,\t0x9D17, 0xF874, 0x9D18, 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877,\n\t0x9D1B, 0xF878, 0x9D1C, 0xF879, 0x9D1D, 0xF87A, 0x9D1E, 0xF87B,\t0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, 0xF87E, 0x9D22, 0xF880,\n\t0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, 0x9D26, 0xF884,\t0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, 0xF888,\n\t0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C,\t0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890,\n\t0x9D33, 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894,\t0x9D37, 0xF895, 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898,\n\t0x9D3B, 0xF899, 0x9D3C, 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C,\t0x9D3F, 0xF89D, 0x9D40, 0xF89E, 0x9D41, 0xF89F, 0x9D42, 0xF8A0,\n\t0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, 0xF942, 0x9D46, 0xF943,\t0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, 0x9D4A, 0xF947,\n\t0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, 0xF94B,\t0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F,\n\t0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953,\t0x9D57, 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957,\n\t0x9D5B, 0xF958, 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B,\t0x9D5F, 0xF95C, 0x9D60, 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F,\n\t0x9D63, 0xF960, 0x9D64, 0xF961, 0x9D65, 0xF962, 0x9D66, 0xF963,\t0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, 0xF966, 0x9D6A, 0xF967,\n\t0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, 0x9D6E, 0xF96B,\t0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, 0xF96F,\n\t0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973,\t0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977,\n\t0x9D7B, 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B,\t0x9D7F, 0xF97C, 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980,\n\t0x9D83, 0xF981, 0x9D84, 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984,\t0x9D87, 0xF985, 0x9D88, 0xF986, 0x9D89, 0xF987, 0x9D8A, 0xF988,\n\t0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, 0xF98B, 0x9D8E, 0xF98C,\t0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, 0x9D92, 0xF990,\n\t0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, 0xF994,\t0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998,\n\t0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C,\t0x9D9F, 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0,\n\t0x9DA3, 0xFA40, 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43,\t0x9DA7, 0xFA44, 0x9DA8, 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47,\n\t0x9DAB, 0xFA48, 0x9DAC, 0xFA49, 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B,\t0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, 0xFA4E, 0x9DB2, 0xFA4F,\n\t0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, 0x9DB6, 0xFA53,\t0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, 0xFA57,\n\t0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B,\t0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F,\n\t0x9DC3, 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63,\t0x9DC7, 0xFA64, 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67,\n\t0x9DCB, 0xFA68, 0x9DCC, 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B,\t0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F,\n\t0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, 0xFA72, 0x9DD6, 0xFA73,\t0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, 0x9DDA, 0xFA77,\n\t0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, 0xFA7B,\t0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80,\n\t0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84,\t0x9DE7, 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88,\n\t0x9DEB, 0xFA89, 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C,\t0x9DEF, 0xFA8D, 0x9DF0, 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90,\n\t0x9DF3, 0xFA91, 0x9DF4, 0xFA92, 0x9DF5, 0xFA93, 0x9DF6, 0xFA94,\t0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, 0xFA97, 0x9DFA, 0xFA98,\n\t0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, 0x9DFE, 0xFA9C,\t0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, 0xFAA0,\n\t0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43,\t0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47,\n\t0x9E0B, 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B,\t0x9E0F, 0xFB4C, 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F,\n\t0x9E13, 0xFB50, 0x9E14, 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53,\t0x9E17, 0xFB54, 0x9E18, 0xFB55, 0x9E19, 0xFB56, 0x9E1A, 0xFB57,\n\t0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, 0xFB5A, 0x9E1E, 0xFB5B,\t0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, 0x9E22, 0xF0B0,\n\t0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, 0xD1BB,\t0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3,\n\t0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E,\t0x9E2F, 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6,\n\t0x9E33, 0xD4A7, 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8,\t0x9E37, 0xF0BA, 0x9E38, 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC,\n\t0x9E3B, 0xFB61, 0x9E3C, 0xFB62, 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD,\t0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, 0xF0BE, 0x9E42, 0xF0BF,\n\t0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, 0x9E46, 0xF0C1,\t0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, 0xC8B5,\n\t0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7,\t0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66,\n\t0x9E53, 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69,\t0x9E57, 0xF0CA, 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB,\n\t0x9E5B, 0xF0CC, 0x9E5C, 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE,\t0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, 0x9E61, 0xFB6E, 0x9E62, 0xFB6F,\n\t0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, 0xFB70, 0x9E66, 0xF0D0,\t0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, 0x9E6A, 0xF0D4,\n\t0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, 0xFB71,\t0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73,\n\t0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76,\t0x9E77, 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A,\n\t0x9E7B, 0xFB7B, 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA,\t0x9E7F, 0xC2B9, 0x9E80, 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4,\n\t0x9E83, 0xFB81, 0x9E84, 0xFB82, 0x9E85, 0xFB83, 0x9E86, 0xFB84,\t0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, 0xFB85, 0x9E8A, 0xFB86,\n\t0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, 0x9E8E, 0xFB89,\t0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, 0xF7E8,\n\t0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F,\t0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93,\n\t0x9E9B, 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96,\t0x9E9F, 0xF7EB, 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99,\n\t0x9EA3, 0xFB9A, 0x9EA4, 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3,\t0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0,\n\t0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, 0xFC42, 0x9EAE, 0xFC43,\t0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, 0x9EB2, 0xFC47,\n\t0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, 0xFC4A,\t0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D,\n\t0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2,\t0x9EBF, 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52,\n\t0x9EC3, 0xFC53, 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55,\t0x9EC7, 0xFC56, 0x9EC8, 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58,\n\t0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8,\t0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, 0xBADA, 0x9ED2, 0xFC5C,\n\t0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, 0x9ED6, 0xFC5F,\t0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, 0xFC62,\n\t0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63,\t0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1,\n\t0x9EE3, 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67,\t0x9EE7, 0xF7F3, 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5,\n\t0x9EEB, 0xFC69, 0x9EEC, 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C,\t0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F,\n\t0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, 0xFC72, 0x9EF6, 0xFC73,\t0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, 0x9EFA, 0xFC76,\n\t0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, 0xF6BC,\t0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B,\n\t0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80,\t0x9F07, 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84,\n\t0x9F0B, 0xF6BD, 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6,\t0x9F0F, 0xFC86, 0x9F10, 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88,\n\t0x9F13, 0xB9C4, 0x9F14, 0xFC89, 0x9F15, 0xFC8A, 0x9F16, 0xFC8B,\t0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, 0xDCB1, 0x9F1A, 0xFC8D,\n\t0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, 0x9F1E, 0xFC91,\t0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, 0xF7F7,\n\t0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97,\t0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B,\n\t0x9F2B, 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E,\t0x9F2F, 0xF7F9, 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40,\n\t0x9F33, 0xFD41, 0x9F34, 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44,\t0x9F37, 0xF7FB, 0x9F38, 0xFD45, 0x9F39, 0xF7FA, 0x9F3A, 0xFD46,\n\t0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, 0xF7FC, 0x9F3E, 0xF7FD,\t0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, 0x9F42, 0xFD4B,\n\t0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, 0xFD4E,\t0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52,\n\t0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56,\t0x9F4F, 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58,\n\t0x9F53, 0xFD59, 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C,\t0x9F57, 0xFD5D, 0x9F58, 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60,\n\t0x9F5B, 0xFD61, 0x9F5C, 0xFD62, 0x9F5D, 0xFD63, 0x9F5E, 0xFD64,\t0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, 0xFD67, 0x9F62, 0xFD68,\n\t0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, 0x9F66, 0xFD6C,\t0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, 0xFD70,\n\t0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74,\t0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78,\n\t0x9F73, 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C,\t0x9F77, 0xFD7D, 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81,\n\t0x9F7B, 0xFD82, 0x9F7C, 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85,\t0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, 0x9F81, 0xFD86, 0x9F82, 0xFD87,\n\t0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, 0xF6B5, 0x9F86, 0xF6B6,\t0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, 0x9F8A, 0xF6BA,\n\t0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, 0xFD89,\t0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D,\n\t0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91,\t0x9F97, 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8,\n\t0x9F9B, 0xEDE8, 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96,\t0x9F9F, 0xB9EA, 0x9FA0, 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98,\n\t0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C,\t0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, 0xFD9F, 0xF9F1, 0xFDA0,\n\t0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, 0xFA0F, 0xFE43,\t0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, 0xFE47,\n\t0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B,\t0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F,\n\t0xFE30, 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5,\t0xFE35, 0xA6E0, 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1,\n\t0xFE39, 0xA6E2, 0xFE3A, 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF,\t0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5,\n\t0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, 0xA6EA, 0xFE44, 0xA6EB,\t0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, 0xFE4C, 0xA96B,\n\t0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, 0xA96F,\t0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973,\n\t0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977,\t0xFE5B, 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B,\n\t0xFE5F, 0xA97C, 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980,\t0xFE63, 0xA981, 0xFE64, 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984,\n\t0xFE68, 0xA985, 0xFE69, 0xA986, 0xFE6A, 0xA987, 0xFE6B, 0xA988,\t0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA1E7,\n\t0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8,\t0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC,\n\t0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0,\t0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4,\n\t0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8,\t0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC,\n\t0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0,\t0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4,\n\t0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8,\t0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC,\n\t0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0,\t0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4,\n\t0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8,\t0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC,\n\t0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0,\t0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4,\n\t0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8,\t0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC,\n\t0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0,\t0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4,\n\t0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8,\t0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC,\n\t0xFF5D, 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA,\t0xFFE2, 0xA956, 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4,\n\t0, 0\n};\n\nstatic const WCHAR oem2uni936[] = {\t/* GBK --> Unicode pairs */\n\t0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05,\t0x8143, 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17,\n\t0x8147, 0x4E1F, 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23,\t0x814B, 0x4E26, 0x814C, 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F,\n\t0x814F, 0x4E31, 0x8150, 0x4E33, 0x8151, 0x4E35, 0x8152, 0x4E37,\t0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, 0x4E41, 0x8156, 0x4E42,\n\t0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, 0x815A, 0x4E51,\t0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, 0x4E5B,\n\t0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65,\t0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B,\n\t0x8167, 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F,\t0x816B, 0x4E72, 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76,\n\t0x816F, 0x4E77, 0x8170, 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A,\t0x8173, 0x4E7B, 0x8174, 0x4E7C, 0x8175, 0x4E7D, 0x8176, 0x4E7F,\n\t0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, 0x4E82, 0x817A, 0x4E83,\t0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, 0x817E, 0x4E8A,\n\t0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, 0x4E99,\t0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3,\n\t0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1,\t0x818C, 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8,\n\t0x8190, 0x4EB9, 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE,\t0x8194, 0x4EC8, 0x8195, 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0,\n\t0x8198, 0x4ED2, 0x8199, 0x4EDA, 0x819A, 0x4EDB, 0x819B, 0x4EDC,\t0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, 0x4EE6, 0x819F, 0x4EE7,\n\t0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, 0x81A3, 0x4EEF,\t0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, 0x4EF9,\n\t0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00,\t0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05,\n\t0x81B0, 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B,\t0x81B4, 0x4F0C, 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14,\n\t0x81B8, 0x4F15, 0x81B9, 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D,\t0x81BC, 0x4F21, 0x81BD, 0x4F23, 0x81BE, 0x4F28, 0x81BF, 0x4F29,\n\t0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, 0x4F2E, 0x81C3, 0x4F31,\t0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, 0x81C7, 0x4F39,\n\t0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, 0x4F40,\t0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45,\n\t0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A,\t0x81D4, 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54,\n\t0x81D8, 0x4F56, 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66,\t0x81DC, 0x4F68, 0x81DD, 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D,\n\t0x81E0, 0x4F6E, 0x81E1, 0x4F71, 0x81E2, 0x4F72, 0x81E3, 0x4F75,\t0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, 0x4F79, 0x81E7, 0x4F7A,\n\t0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, 0x81EB, 0x4F82,\t0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, 0x4F8A,\n\t0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92,\t0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98,\n\t0x81F8, 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E,\t0x81FC, 0x4F9F, 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4,\n\t0x8241, 0x4FAB, 0x8242, 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1,\t0x8245, 0x4FB2, 0x8246, 0x4FB3, 0x8247, 0x4FB4, 0x8248, 0x4FB6,\n\t0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, 0x4FB9, 0x824C, 0x4FBA,\t0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, 0x8250, 0x4FBE,\n\t0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, 0x4FC6,\t0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB,\n\t0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3,\t0x825D, 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9,\n\t0x8261, 0x4FDB, 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4,\t0x8265, 0x4FE5, 0x8266, 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC,\n\t0x8269, 0x4FF0, 0x826A, 0x4FF2, 0x826B, 0x4FF4, 0x826C, 0x4FF5,\t0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, 0x4FF9, 0x8270, 0x4FFB,\n\t0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, 0x8274, 0x5000,\t0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, 0x5004,\n\t0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008,\t0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E,\n\t0x8282, 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015,\t0x8286, 0x5016, 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D,\n\t0x828A, 0x501E, 0x828B, 0x5020, 0x828C, 0x5022, 0x828D, 0x5023,\t0x828E, 0x5024, 0x828F, 0x5027, 0x8290, 0x502B, 0x8291, 0x502F,\n\t0x8292, 0x5030, 0x8293, 0x5031, 0x8294, 0x5032, 0x8295, 0x5033,\t0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, 0x8299, 0x5037,\n\t0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, 0x503D,\t0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042,\n\t0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049,\t0x82A6, 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050,\n\t0x82AA, 0x5051, 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054,\t0x82AE, 0x5056, 0x82AF, 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059,\n\t0x82B2, 0x505B, 0x82B3, 0x505D, 0x82B4, 0x505E, 0x82B5, 0x505F,\t0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, 0x5062, 0x82B9, 0x5063,\n\t0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, 0x82BD, 0x5068,\t0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, 0x506D,\n\t0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071,\t0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075,\n\t0x82CA, 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C,\t0x82CE, 0x507D, 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083,\n\t0x82D2, 0x5084, 0x82D3, 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089,\t0x82D6, 0x508A, 0x82D7, 0x508B, 0x82D8, 0x508C, 0x82D9, 0x508E,\n\t0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, 0x5091, 0x82DD, 0x5092,\t0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, 0x82E1, 0x5096,\n\t0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, 0x509A,\t0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E,\n\t0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2,\t0x82EE, 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB,\n\t0x82F2, 0x50AD, 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0,\t0x82F6, 0x50B1, 0x82F7, 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5,\n\t0x82FA, 0x50B6, 0x82FB, 0x50B7, 0x82FC, 0x50B8, 0x82FD, 0x50B9,\t0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, 0x50BE, 0x8342, 0x50BF,\n\t0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, 0x8346, 0x50C3,\t0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, 0x50C7,\n\t0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB,\t0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0,\n\t0x8353, 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4,\t0x8357, 0x50D5, 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9,\n\t0x835B, 0x50DB, 0x835C, 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE,\t0x835F, 0x50DF, 0x8360, 0x50E0, 0x8361, 0x50E1, 0x8362, 0x50E2,\n\t0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, 0x50E5, 0x8366, 0x50E8,\t0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, 0x836A, 0x50EF,\n\t0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, 0x50F4,\t0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9,\n\t0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE,\t0x8377, 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102,\n\t0x837B, 0x5103, 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108,\t0x8380, 0x5109, 0x8381, 0x510A, 0x8382, 0x510C, 0x8383, 0x510D,\n\t0x8384, 0x510E, 0x8385, 0x510F, 0x8386, 0x5110, 0x8387, 0x5111,\t0x8388, 0x5113, 0x8389, 0x5114, 0x838A, 0x5115, 0x838B, 0x5116,\n\t0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, 0x838F, 0x511A,\t0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, 0x511E,\n\t0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123,\t0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127,\n\t0x839C, 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B,\t0x83A0, 0x512C, 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F,\n\t0x83A4, 0x5130, 0x83A5, 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133,\t0x83A8, 0x5134, 0x83A9, 0x5135, 0x83AA, 0x5136, 0x83AB, 0x5137,\n\t0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, 0x513A, 0x83AF, 0x513B,\t0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, 0x83B3, 0x5142,\n\t0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, 0x514E,\t0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153,\n\t0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B,\t0x83C0, 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160,\n\t0x83C4, 0x5161, 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166,\t0x83C8, 0x5167, 0x83C9, 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F,\n\t0x83CC, 0x5172, 0x83CD, 0x517A, 0x83CE, 0x517E, 0x83CF, 0x517F,\t0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, 0x5186, 0x83D3, 0x5187,\n\t0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, 0x83D7, 0x518F,\t0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, 0x5194,\n\t0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E,\t0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6,\n\t0x83E4, 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA,\t0x83E8, 0x51AD, 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8,\n\t0x83EC, 0x51B9, 0x83ED, 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF,\t0x83F0, 0x51C1, 0x83F1, 0x51C2, 0x83F2, 0x51C3, 0x83F3, 0x51C5,\n\t0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, 0x51CD, 0x83F7, 0x51CE,\t0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, 0x83FB, 0x51D4,\n\t0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, 0x51D8,\t0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE,\n\t0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5,\t0x8449, 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9,\n\t0x844D, 0x51EA, 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1,\t0x8451, 0x51F2, 0x8452, 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE,\n\t0x8455, 0x5204, 0x8456, 0x5205, 0x8457, 0x5209, 0x8458, 0x520B,\t0x8459, 0x520C, 0x845A, 0x520F, 0x845B, 0x5210, 0x845C, 0x5213,\n\t0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, 0x8460, 0x521E,\t0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, 0x5223,\n\t0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A,\t0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232,\n\t0x846D, 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E,\t0x8471, 0x5244, 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247,\n\t0x8475, 0x5248, 0x8476, 0x5249, 0x8477, 0x524B, 0x8478, 0x524E,\t0x8479, 0x524F, 0x847A, 0x5252, 0x847B, 0x5253, 0x847C, 0x5255,\n\t0x847D, 0x5257, 0x847E, 0x5258, 0x8480, 0x5259, 0x8481, 0x525A,\t0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, 0x8485, 0x5260,\n\t0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, 0x5266,\t0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D,\n\t0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273,\t0x8492, 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277,\n\t0x8496, 0x5278, 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B,\t0x849A, 0x527C, 0x849B, 0x527E, 0x849C, 0x5280, 0x849D, 0x5283,\n\t0x849E, 0x5284, 0x849F, 0x5285, 0x84A0, 0x5286, 0x84A1, 0x5287,\t0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, 0x528B, 0x84A5, 0x528C,\n\t0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, 0x84A9, 0x5291,\t0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, 0x5296,\n\t0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A,\t0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6,\n\t0x84B6, 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0,\t0x84BA, 0x52B4, 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7,\n\t0x84BE, 0x52B8, 0x84BF, 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB,\t0x84C2, 0x52BC, 0x84C3, 0x52BD, 0x84C4, 0x52C0, 0x84C5, 0x52C1,\n\t0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, 0x52C5, 0x84C9, 0x52C6,\t0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, 0x84CD, 0x52CD,\n\t0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, 0x52D3,\t0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9,\n\t0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD,\t0x84DA, 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2,\n\t0x84DE, 0x52E3, 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7,\t0x84E2, 0x52E8, 0x84E3, 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB,\n\t0x84E6, 0x52EC, 0x84E7, 0x52ED, 0x84E8, 0x52EE, 0x84E9, 0x52EF,\t0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, 0x52F3, 0x84ED, 0x52F4,\n\t0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, 0x84F1, 0x52F8,\t0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, 0x5301,\n\t0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307,\t0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C,\n\t0x84FE, 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313,\t0x8543, 0x5314, 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C,\n\t0x8547, 0x531E, 0x8548, 0x531F, 0x8549, 0x5322, 0x854A, 0x5324,\t0x854B, 0x5325, 0x854C, 0x5327, 0x854D, 0x5328, 0x854E, 0x5329,\n\t0x854F, 0x532B, 0x8550, 0x532C, 0x8551, 0x532D, 0x8552, 0x532F,\t0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, 0x8556, 0x5333,\n\t0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, 0x5337,\t0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340,\n\t0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B,\t0x8563, 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354,\n\t0x8567, 0x5358, 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D,\t0x856B, 0x5365, 0x856C, 0x5368, 0x856D, 0x536A, 0x856E, 0x536C,\n\t0x856F, 0x536D, 0x8570, 0x5372, 0x8571, 0x5376, 0x8572, 0x5379,\t0x8573, 0x537B, 0x8574, 0x537C, 0x8575, 0x537D, 0x8576, 0x537E,\n\t0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, 0x857A, 0x5387,\t0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, 0x538F,\n\t0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393,\t0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399,\n\t0x8588, 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0,\t0x858C, 0x53A1, 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA,\n\t0x8590, 0x53AB, 0x8591, 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF,\t0x8594, 0x53B0, 0x8595, 0x53B1, 0x8596, 0x53B2, 0x8597, 0x53B3,\n\t0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, 0x53B7, 0x859B, 0x53B8,\t0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, 0x859F, 0x53BD,\n\t0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, 0x53C4,\t0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE,\n\t0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3,\t0x85AC, 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD,\n\t0x85B0, 0x53DE, 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7,\t0x85B4, 0x53F4, 0x85B5, 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF,\n\t0x85B8, 0x5400, 0x85B9, 0x5402, 0x85BA, 0x5405, 0x85BB, 0x5407,\t0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, 0x5418, 0x85BF, 0x5419,\n\t0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, 0x85C3, 0x5424,\t0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, 0x5433,\n\t0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D,\t0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444,\n\t0x85D0, 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C,\t0x85D4, 0x544D, 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451,\n\t0x85D8, 0x545A, 0x85D9, 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F,\t0x85DC, 0x5460, 0x85DD, 0x5461, 0x85DE, 0x5463, 0x85DF, 0x5465,\n\t0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, 0x546A, 0x85E3, 0x546B,\t0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, 0x85E7, 0x546F,\n\t0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, 0x547A,\t0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483,\n\t0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489,\t0x85F4, 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493,\n\t0x85F8, 0x5497, 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E,\t0x85FC, 0x549F, 0x85FD, 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2,\n\t0x8641, 0x54A5, 0x8642, 0x54AE, 0x8643, 0x54B0, 0x8644, 0x54B2,\t0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, 0x54B7, 0x8648, 0x54B9,\n\t0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, 0x864C, 0x54C3,\t0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, 0x54D6,\n\t0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1,\t0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB,\n\t0x8659, 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1,\t0x865D, 0x54F4, 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7,\n\t0x8661, 0x54F8, 0x8662, 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE,\t0x8665, 0x5500, 0x8666, 0x5502, 0x8667, 0x5503, 0x8668, 0x5504,\n\t0x8669, 0x5505, 0x866A, 0x5508, 0x866B, 0x550A, 0x866C, 0x550B,\t0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, 0x8670, 0x5512,\n\t0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, 0x5517,\t0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C,\n\t0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521,\t0x867D, 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529,\n\t0x8682, 0x552B, 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534,\t0x8686, 0x5535, 0x8687, 0x5536, 0x8688, 0x5538, 0x8689, 0x5539,\n\t0x868A, 0x553A, 0x868B, 0x553B, 0x868C, 0x553D, 0x868D, 0x5540,\t0x868E, 0x5542, 0x868F, 0x5545, 0x8690, 0x5547, 0x8691, 0x5548,\n\t0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, 0x8695, 0x554E,\t0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, 0x5553,\n\t0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559,\t0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E,\n\t0x86A2, 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563,\t0x86A6, 0x5568, 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F,\n\t0x86AA, 0x5570, 0x86AB, 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573,\t0x86AE, 0x5574, 0x86AF, 0x5579, 0x86B0, 0x557A, 0x86B1, 0x557D,\n\t0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, 0x5586, 0x86B5, 0x558C,\t0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, 0x86B9, 0x5592,\n\t0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, 0x5597,\t0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0,\n\t0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4,\t0x86C6, 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9,\n\t0x86CA, 0x55AA, 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD,\t0x86CE, 0x55AE, 0x86CF, 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2,\n\t0x86D2, 0x55B4, 0x86D3, 0x55B6, 0x86D4, 0x55B8, 0x86D5, 0x55BA,\t0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, 0x55C0, 0x86D9, 0x55C1,\n\t0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, 0x86DD, 0x55C7,\t0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, 0x55CE,\n\t0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7,\t0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB,\n\t0x86EA, 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7,\t0x86EE, 0x55E9, 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0,\n\t0x86F2, 0x55F1, 0x86F3, 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8,\t0x86F6, 0x55F9, 0x86F7, 0x55FA, 0x86F8, 0x55FB, 0x86F9, 0x55FC,\n\t0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, 0x5603, 0x86FD, 0x5604,\t0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, 0x8742, 0x560A,\n\t0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, 0x5611,\t0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615,\n\t0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A,\t0x874F, 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621,\n\t0x8753, 0x5622, 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628,\t0x8757, 0x5629, 0x8758, 0x562A, 0x8759, 0x562B, 0x875A, 0x562E,\n\t0x875B, 0x562F, 0x875C, 0x5630, 0x875D, 0x5633, 0x875E, 0x5635,\t0x875F, 0x5637, 0x8760, 0x5638, 0x8761, 0x563A, 0x8762, 0x563C,\n\t0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, 0x8766, 0x5641,\t0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, 0x5645,\n\t0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649,\t0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650,\n\t0x8773, 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655,\t0x8777, 0x5656, 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D,\n\t0x877B, 0x565E, 0x877C, 0x565F, 0x877D, 0x5660, 0x877E, 0x5661,\t0x8780, 0x5663, 0x8781, 0x5665, 0x8782, 0x5666, 0x8783, 0x5667,\n\t0x8784, 0x566D, 0x8785, 0x566E, 0x8786, 0x566F, 0x8787, 0x5670,\t0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, 0x878B, 0x5675,\n\t0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, 0x567A,\t0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680,\n\t0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684,\t0x8798, 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A,\n\t0x879C, 0x568B, 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690,\t0x87A0, 0x5691, 0x87A1, 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695,\n\t0x87A4, 0x5696, 0x87A5, 0x5697, 0x87A6, 0x5698, 0x87A7, 0x5699,\t0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, 0x569C, 0x87AB, 0x569D,\n\t0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, 0x87AF, 0x56A1,\t0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, 0x56A6,\n\t0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA,\t0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE,\n\t0x87BC, 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3,\t0x87C0, 0x56B4, 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8,\n\t0x87C4, 0x56B9, 0x87C5, 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD,\t0x87C8, 0x56BE, 0x87C9, 0x56BF, 0x87CA, 0x56C0, 0x87CB, 0x56C1,\n\t0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, 0x56C4, 0x87CF, 0x56C5,\t0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, 0x87D3, 0x56C9,\n\t0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, 0x56CE,\t0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2,\n\t0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8,\t0x87E0, 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5,\n\t0x87E4, 0x56E6, 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9,\t0x87E8, 0x56EA, 0x87E9, 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF,\n\t0x87EC, 0x56F2, 0x87ED, 0x56F3, 0x87EE, 0x56F6, 0x87EF, 0x56F7,\t0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, 0x56FC, 0x87F3, 0x5700,\n\t0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, 0x87F7, 0x5707,\t0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, 0x570E,\n\t0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712,\t0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716,\n\t0x8845, 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A,\t0x8849, 0x571B, 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720,\n\t0x884D, 0x5721, 0x884E, 0x5722, 0x884F, 0x5724, 0x8850, 0x5725,\t0x8851, 0x5726, 0x8852, 0x5727, 0x8853, 0x572B, 0x8854, 0x5731,\n\t0x8855, 0x5732, 0x8856, 0x5734, 0x8857, 0x5735, 0x8858, 0x5736,\t0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, 0x885C, 0x573D,\n\t0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, 0x5744,\t0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749,\n\t0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754,\t0x8869, 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759,\n\t0x886D, 0x5762, 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767,\t0x8871, 0x576C, 0x8872, 0x576E, 0x8873, 0x5770, 0x8874, 0x5771,\n\t0x8875, 0x5772, 0x8876, 0x5774, 0x8877, 0x5775, 0x8878, 0x5778,\t0x8879, 0x5779, 0x887A, 0x577A, 0x887B, 0x577D, 0x887C, 0x577E,\n\t0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, 0x8881, 0x5787,\t0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, 0x578D,\n\t0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791,\t0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797,\n\t0x888E, 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C,\t0x8892, 0x579D, 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5,\n\t0x8896, 0x57A8, 0x8897, 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF,\t0x889A, 0x57B0, 0x889B, 0x57B1, 0x889C, 0x57B3, 0x889D, 0x57B5,\n\t0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, 0x57B9, 0x88A1, 0x57BA,\t0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, 0x88A5, 0x57BE,\n\t0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, 0x57C4,\t0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8,\n\t0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD,\t0x88B2, 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6,\n\t0x88B6, 0x57D7, 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE,\t0x88BA, 0x57E1, 0x88BB, 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5,\n\t0x88BE, 0x57E6, 0x88BF, 0x57E7, 0x88C0, 0x57E8, 0x88C1, 0x57E9,\t0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, 0x57EC, 0x88C5, 0x57EE,\n\t0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, 0x88C9, 0x57F3,\t0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, 0x57FB,\n\t0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801,\t0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808,\n\t0x88D6, 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E,\t0x88DA, 0x580F, 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813,\n\t0x88DE, 0x5814, 0x88DF, 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818,\t0x88E2, 0x581A, 0x88E3, 0x581B, 0x88E4, 0x581C, 0x88E5, 0x581D,\n\t0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, 0x5823, 0x88E9, 0x5825,\t0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, 0x88ED, 0x5829,\n\t0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, 0x582E,\t0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833,\n\t0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838,\t0x88FA, 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C,\n\t0x88FE, 0x583D, 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840,\t0x8943, 0x5841, 0x8944, 0x5842, 0x8945, 0x5843, 0x8946, 0x5845,\n\t0x8947, 0x5846, 0x8948, 0x5847, 0x8949, 0x5848, 0x894A, 0x5849,\t0x894B, 0x584A, 0x894C, 0x584B, 0x894D, 0x584E, 0x894E, 0x584F,\n\t0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, 0x8952, 0x5855,\t0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, 0x585A,\n\t0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F,\t0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863,\n\t0x895F, 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868,\t0x8963, 0x5869, 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E,\n\t0x8967, 0x586F, 0x8968, 0x5870, 0x8969, 0x5871, 0x896A, 0x5872,\t0x896B, 0x5873, 0x896C, 0x5874, 0x896D, 0x5875, 0x896E, 0x5876,\n\t0x896F, 0x5877, 0x8970, 0x5878, 0x8971, 0x5879, 0x8972, 0x587A,\t0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, 0x8976, 0x587F,\n\t0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, 0x5887,\t0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C,\n\t0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890,\t0x8984, 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896,\n\t0x8988, 0x5897, 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C,\t0x898C, 0x589D, 0x898D, 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2,\n\t0x8990, 0x58A3, 0x8991, 0x58A4, 0x8992, 0x58A5, 0x8993, 0x58A6,\t0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, 0x58AB, 0x8997, 0x58AC,\n\t0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, 0x899B, 0x58B0,\t0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, 0x58B4,\n\t0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8,\t0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD,\n\t0x89A8, 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2,\t0x89AC, 0x58C3, 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7,\n\t0x89B0, 0x58C8, 0x89B1, 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB,\t0x89B4, 0x58CC, 0x89B5, 0x58CD, 0x89B6, 0x58CE, 0x89B7, 0x58CF,\n\t0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, 0x58D3, 0x89BB, 0x58D4,\t0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, 0x89BF, 0x58D9,\n\t0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, 0x58DD,\t0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1,\n\t0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6,\t0x89CC, 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA,\n\t0x89D0, 0x58ED, 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2,\t0x89D4, 0x58F4, 0x89D5, 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8,\n\t0x89D8, 0x58FA, 0x89D9, 0x58FB, 0x89DA, 0x58FC, 0x89DB, 0x58FD,\t0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, 0x5900, 0x89DF, 0x5901,\n\t0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, 0x89E3, 0x5908,\t0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, 0x590C,\n\t0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912,\t0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B,\n\t0x89F0, 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921,\t0x89F4, 0x5922, 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928,\n\t0x89F8, 0x592C, 0x89F9, 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933,\t0x89FC, 0x5935, 0x89FD, 0x5936, 0x89FE, 0x593B, 0x8A40, 0x593D,\n\t0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, 0x5940, 0x8A44, 0x5943,\t0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, 0x8A48, 0x594C,\n\t0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, 0x5953,\t0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D,\n\t0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963,\t0x8A55, 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968,\n\t0x8A59, 0x5969, 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C,\t0x8A5D, 0x596D, 0x8A5E, 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970,\n\t0x8A61, 0x5971, 0x8A62, 0x5972, 0x8A63, 0x5975, 0x8A64, 0x5977,\t0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, 0x597C, 0x8A68, 0x597E,\n\t0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, 0x8A6C, 0x5989,\t0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, 0x598F,\n\t0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995,\t0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C,\n\t0x8A79, 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1,\t0x8A7D, 0x59A2, 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC,\n\t0x8A82, 0x59AD, 0x8A83, 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3,\t0x8A86, 0x59B4, 0x8A87, 0x59B5, 0x8A88, 0x59B6, 0x8A89, 0x59B7,\n\t0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, 0x59BC, 0x8A8D, 0x59BD,\t0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, 0x8A91, 0x59C2,\n\t0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, 0x59C7,\t0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD,\n\t0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6,\t0x8A9E, 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF,\n\t0x8AA2, 0x59E0, 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4,\t0x8AA6, 0x59E6, 0x8AA7, 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA,\n\t0x8AAA, 0x59EB, 0x8AAB, 0x59ED, 0x8AAC, 0x59EE, 0x8AAD, 0x59EF,\t0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, 0x59F2, 0x8AB1, 0x59F3,\n\t0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, 0x8AB5, 0x59F7,\t0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, 0x59FD,\n\t0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A,\t0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F,\n\t0x8AC2, 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15,\t0x8AC6, 0x5A16, 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A,\n\t0x8ACA, 0x5A1B, 0x8ACB, 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21,\t0x8ACE, 0x5A22, 0x8ACF, 0x5A24, 0x8AD0, 0x5A26, 0x8AD1, 0x5A27,\n\t0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, 0x5A2B, 0x8AD5, 0x5A2C,\t0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, 0x8AD9, 0x5A30,\n\t0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, 0x5A38,\t0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D,\n\t0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42,\t0x8AE6, 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47,\n\t0x8AEA, 0x5A48, 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D,\t0x8AEE, 0x5A4E, 0x8AEF, 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51,\n\t0x8AF2, 0x5A52, 0x8AF3, 0x5A53, 0x8AF4, 0x5A54, 0x8AF5, 0x5A56,\t0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, 0x5A59, 0x8AF9, 0x5A5B,\n\t0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, 0x8AFD, 0x5A5F,\t0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, 0x5A64,\n\t0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69,\t0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E,\n\t0x8B4B, 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72,\t0x8B4F, 0x5A73, 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B,\n\t0x8B53, 0x5A7C, 0x8B54, 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80,\t0x8B57, 0x5A81, 0x8B58, 0x5A82, 0x8B59, 0x5A83, 0x8B5A, 0x5A84,\n\t0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, 0x5A87, 0x8B5E, 0x5A88,\t0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, 0x8B62, 0x5A8C,\n\t0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, 0x5A90,\t0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95,\n\t0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99,\t0x8B6F, 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F,\n\t0x8B73, 0x5AA0, 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3,\t0x8B77, 0x5AA4, 0x8B78, 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7,\n\t0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC,\t0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, 0x5AAF, 0x8B83, 0x5AB0,\n\t0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, 0x8B87, 0x5AB7,\t0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, 0x5ABC,\n\t0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3,\t0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7,\n\t0x8B94, 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD,\t0x8B98, 0x5ACE, 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1,\n\t0x8B9C, 0x5AD3, 0x8B9D, 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9,\t0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE,\n\t0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, 0x5AE4, 0x8BA7, 0x5AE5,\t0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, 0x8BAB, 0x5AEC,\n\t0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, 0x5AF0,\t0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5,\n\t0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9,\t0x8BB8, 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD,\n\t0x8BBC, 0x5AFE, 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01,\t0x8BC0, 0x5B02, 0x8BC1, 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05,\n\t0x8BC4, 0x5B06, 0x8BC5, 0x5B07, 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A,\t0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, 0x5B0D, 0x8BCB, 0x5B0E,\n\t0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, 0x8BCF, 0x5B12,\t0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, 0x5B18,\n\t0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C,\t0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20,\n\t0x8BDC, 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24,\t0x8BE0, 0x5B25, 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28,\n\t0x8BE4, 0x5B29, 0x8BE5, 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C,\t0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30,\n\t0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, 0x5B35, 0x8BEF, 0x5B36,\t0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, 0x8BF3, 0x5B3B,\n\t0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, 0x5B3F,\t0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44,\n\t0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48,\t0x8C41, 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C,\n\t0x8C45, 0x5B4D, 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52,\t0x8C49, 0x5B56, 0x8C4A, 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61,\n\t0x8C4D, 0x5B67, 0x8C4E, 0x5B68, 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D,\t0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, 0x5B72, 0x8C54, 0x5B74,\n\t0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, 0x8C58, 0x5B79,\t0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, 0x5B7F,\n\t0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D,\t0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92,\n\t0x8C65, 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7,\t0x8C69, 0x5BA8, 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD,\n\t0x8C6D, 0x5BAE, 0x8C6E, 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2,\t0x8C71, 0x5BB7, 0x8C72, 0x5BBA, 0x8C73, 0x5BBB, 0x8C74, 0x5BBC,\n\t0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, 0x5BC3, 0x8C78, 0x5BC8,\t0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, 0x8C7C, 0x5BCD,\n\t0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, 0x5BD4,\t0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8,\n\t0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC,\t0x8C8A, 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6,\n\t0x8C8E, 0x5BE7, 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB,\t0x8C92, 0x5BEC, 0x8C93, 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1,\n\t0x8C96, 0x5BF2, 0x8C97, 0x5BF3, 0x8C98, 0x5BF4, 0x8C99, 0x5BF5,\t0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, 0x5BFD, 0x8C9D, 0x5BFE,\n\t0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, 0x8CA1, 0x5C05,\t0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, 0x5C0C,\n\t0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12,\t0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B,\n\t0x8CAE, 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21,\t0x8CB2, 0x5C23, 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29,\n\t0x8CB6, 0x5C2A, 0x8CB7, 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E,\t0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, 0x8CBC, 0x5C32, 0x8CBD, 0x5C33,\n\t0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, 0x5C37, 0x8CC1, 0x5C43,\t0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, 0x8CC5, 0x5C4C,\n\t0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, 0x5C54,\t0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A,\n\t0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F,\t0x8CD2, 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68,\n\t0x8CD6, 0x5C69, 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C,\t0x8CDA, 0x5C6D, 0x8CDB, 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73,\n\t0x8CDE, 0x5C74, 0x8CDF, 0x5C75, 0x8CE0, 0x5C76, 0x8CE1, 0x5C77,\t0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, 0x5C7C, 0x8CE5, 0x5C7D,\n\t0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, 0x8CE9, 0x5C84,\t0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, 0x5C89,\n\t0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F,\t0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D,\n\t0x8CF6, 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1,\t0x8CFA, 0x5CA4, 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7,\n\t0x8CFE, 0x5CA8, 0x8D40, 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF,\t0x8D43, 0x5CB0, 0x8D44, 0x5CB2, 0x8D45, 0x5CB4, 0x8D46, 0x5CB6,\n\t0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, 0x5CBB, 0x8D4A, 0x5CBC,\t0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, 0x8D4E, 0x5CC3,\n\t0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, 0x5CC8,\t0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD,\n\t0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1,\t0x8D5B, 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6,\n\t0x8D5F, 0x5CD7, 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB,\t0x8D63, 0x5CDC, 0x8D64, 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF,\n\t0x8D67, 0x5CE0, 0x8D68, 0x5CE2, 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7,\t0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, 0x5CEC, 0x8D6E, 0x5CEE,\n\t0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, 0x8D72, 0x5CF3,\t0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, 0x5CF7,\n\t0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC,\t0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00,\n\t0x8D80, 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08,\t0x8D84, 0x5D09, 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C,\n\t0x8D88, 0x5D0D, 0x8D89, 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11,\t0x8D8C, 0x5D12, 0x8D8D, 0x5D13, 0x8D8E, 0x5D15, 0x8D8F, 0x5D17,\n\t0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, 0x5D1A, 0x8D93, 0x5D1C,\t0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, 0x8D97, 0x5D21,\n\t0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, 0x5D28,\t0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F,\n\t0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33,\t0x8DA4, 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38,\n\t0x8DA8, 0x5D39, 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C,\t0x8DAC, 0x5D3F, 0x8DAD, 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42,\n\t0x8DB0, 0x5D43, 0x8DB1, 0x5D44, 0x8DB2, 0x5D45, 0x8DB3, 0x5D46,\t0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, 0x5D4D, 0x8DB7, 0x5D4E,\n\t0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, 0x8DBB, 0x5D52,\t0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, 0x5D56,\n\t0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C,\t0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61,\n\t0x8DC8, 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65,\t0x8DCC, 0x5D66, 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A,\n\t0x8DD0, 0x5D6D, 0x8DD1, 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71,\t0x8DD4, 0x5D72, 0x8DD5, 0x5D73, 0x8DD6, 0x5D75, 0x8DD7, 0x5D76,\n\t0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, 0x5D79, 0x8DDB, 0x5D7A,\t0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, 0x8DDF, 0x5D7E,\n\t0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, 0x5D83,\t0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87,\n\t0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B,\t0x8DEC, 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F,\n\t0x8DF0, 0x5D90, 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93,\t0x8DF4, 0x5D94, 0x8DF5, 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97,\n\t0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C,\t0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, 0x5DA0, 0x8E40, 0x5DA1,\n\t0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, 0x8E44, 0x5DA5,\t0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, 0x5DA9,\n\t0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD,\t0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1,\n\t0x8E51, 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5,\t0x8E55, 0x5DB6, 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA,\n\t0x8E59, 0x5DBB, 0x8E5A, 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE,\t0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2,\n\t0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, 0x5DC6, 0x8E64, 0x5DC7,\t0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, 0x8E68, 0x5DCB,\n\t0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, 0x5DD0,\t0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4,\n\t0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8,\t0x8E75, 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF,\n\t0x8E79, 0x5DE0, 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA,\t0x8E7D, 0x5DEC, 0x8E7E, 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5,\n\t0x8E82, 0x5DF6, 0x8E83, 0x5DF8, 0x8E84, 0x5DF9, 0x8E85, 0x5DFA,\t0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, 0x5DFF, 0x8E89, 0x5E00,\n\t0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, 0x8E8D, 0x5E0A,\t0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, 0x5E12,\n\t0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F,\t0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23,\n\t0x8E9A, 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29,\t0x8E9E, 0x5E2A, 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F,\n\t0x8EA2, 0x5E30, 0x8EA3, 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34,\t0x8EA6, 0x5E35, 0x8EA7, 0x5E36, 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A,\n\t0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, 0x5E40, 0x8EAD, 0x5E41,\t0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, 0x8EB1, 0x5E48,\n\t0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, 0x5E4D,\t0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51,\n\t0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57,\t0x8EBE, 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C,\n\t0x8EC2, 0x5E5D, 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63,\t0x8EC6, 0x5E64, 0x8EC7, 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67,\n\t0x8ECA, 0x5E68, 0x8ECB, 0x5E69, 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B,\t0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, 0x5E6E, 0x8ED1, 0x5E6F,\n\t0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, 0x8ED5, 0x5E77,\t0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, 0x5E82,\n\t0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89,\t0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92,\n\t0x8EE2, 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1,\t0x8EE6, 0x5EA2, 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8,\n\t0x8EEA, 0x5EA9, 0x8EEB, 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC,\t0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1,\n\t0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, 0x5EBA, 0x8EF5, 0x5EBB,\t0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, 0x8EF9, 0x5EC0,\n\t0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, 0x5EC4,\t0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8,\n\t0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE,\t0x8F47, 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5,\n\t0x8F4B, 0x5ED7, 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA,\t0x8F4F, 0x5EDC, 0x8F50, 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF,\n\t0x8F53, 0x5EE0, 0x8F54, 0x5EE1, 0x8F55, 0x5EE2, 0x8F56, 0x5EE3,\t0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, 0x5EE6, 0x8F5A, 0x5EE7,\n\t0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, 0x8F5E, 0x5EED,\t0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, 0x5EF1,\n\t0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8,\t0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD,\n\t0x8F6B, 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09,\t0x8F6F, 0x5F0C, 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10,\n\t0x8F73, 0x5F12, 0x8F74, 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19,\t0x8F77, 0x5F1A, 0x8F78, 0x5F1C, 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E,\n\t0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, 0x5F23, 0x8F7E, 0x5F24,\t0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, 0x8F83, 0x5F2E,\n\t0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, 0x5F34,\t0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38,\n\t0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F,\t0x8F90, 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44,\n\t0x8F94, 0x5F45, 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48,\t0x8F98, 0x5F49, 0x8F99, 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C,\n\t0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51,\t0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, 0x5F5A, 0x8FA3, 0x5F5B,\n\t0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, 0x8FA7, 0x5F60,\t0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, 0x5F68,\n\t0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72,\t0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78,\n\t0x8FB4, 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F,\t0x8FB8, 0x5F83, 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E,\n\t0x8FBC, 0x5F8F, 0x8FBD, 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94,\t0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D,\n\t0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, 0x5FA0, 0x8FC7, 0x5FA2,\t0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, 0x8FCB, 0x5FA6,\n\t0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, 0x5FAC,\t0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2,\n\t0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8,\t0x8FD8, 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE,\n\t0x8FDC, 0x5FBF, 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2,\t0x8FE0, 0x5FC7, 0x8FE1, 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB,\n\t0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5,\t0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, 0x5FDC, 0x8FEB, 0x5FDE,\n\t0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, 0x8FEF, 0x5FE5,\t0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, 0x5FEC,\n\t0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3,\t0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9,\n\t0x8FFC, 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008,\t0x9041, 0x6009, 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010,\n\t0x9045, 0x6011, 0x9046, 0x6013, 0x9047, 0x6017, 0x9048, 0x6018,\t0x9049, 0x601A, 0x904A, 0x601E, 0x904B, 0x601F, 0x904C, 0x6022,\n\t0x904D, 0x6023, 0x904E, 0x6024, 0x904F, 0x602C, 0x9050, 0x602D,\t0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, 0x9054, 0x6032,\n\t0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, 0x6037,\t0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D,\n\t0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045,\t0x9061, 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049,\n\t0x9065, 0x604A, 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F,\t0x9069, 0x6051, 0x906A, 0x6053, 0x906B, 0x6054, 0x906C, 0x6056,\n\t0x906D, 0x6057, 0x906E, 0x6058, 0x906F, 0x605B, 0x9070, 0x605C,\t0x9071, 0x605E, 0x9072, 0x605F, 0x9073, 0x6060, 0x9074, 0x6061,\n\t0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, 0x9078, 0x6071,\t0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, 0x6077,\n\t0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082,\t0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088,\n\t0x9086, 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F,\t0x908A, 0x6090, 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095,\n\t0x908E, 0x6097, 0x908F, 0x6098, 0x9090, 0x6099, 0x9091, 0x609C,\t0x9092, 0x609E, 0x9093, 0x60A1, 0x9094, 0x60A2, 0x9095, 0x60A4,\n\t0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, 0x60A9, 0x9099, 0x60AA,\t0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, 0x909D, 0x60B5,\n\t0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, 0x60BA,\t0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0,\n\t0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4,\t0x90AA, 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC,\n\t0x90AE, 0x60CD, 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0,\t0x90B2, 0x60D2, 0x90B3, 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6,\n\t0x90B6, 0x60D7, 0x90B7, 0x60D9, 0x90B8, 0x60DB, 0x90B9, 0x60DE,\t0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, 0x60E3, 0x90BD, 0x60E4,\n\t0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, 0x90C1, 0x60F2,\t0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, 0x60FB,\n\t0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF,\t0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105,\n\t0x90CE, 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C,\t0x90D2, 0x6110, 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113,\n\t0x90D6, 0x6114, 0x90D7, 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118,\t0x90DA, 0x6119, 0x90DB, 0x611B, 0x90DC, 0x611C, 0x90DD, 0x611D,\n\t0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, 0x6122, 0x90E1, 0x6125,\t0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, 0x90E5, 0x612C,\n\t0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, 0x6130,\t0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134,\n\t0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138,\t0x90F2, 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C,\n\t0x90F6, 0x613D, 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141,\t0x90FA, 0x6142, 0x90FB, 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145,\n\t0x90FE, 0x6146, 0x9140, 0x6147, 0x9141, 0x6149, 0x9142, 0x614B,\t0x9143, 0x614D, 0x9144, 0x614F, 0x9145, 0x6150, 0x9146, 0x6152,\n\t0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, 0x914A, 0x6157,\t0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, 0x615B,\n\t0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160,\t0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165,\n\t0x9157, 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B,\t0x915B, 0x616C, 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F,\n\t0x915F, 0x6171, 0x9160, 0x6172, 0x9161, 0x6173, 0x9162, 0x6174,\t0x9163, 0x6176, 0x9164, 0x6178, 0x9165, 0x6179, 0x9166, 0x617A,\n\t0x9167, 0x617B, 0x9168, 0x617C, 0x9169, 0x617D, 0x916A, 0x617E,\t0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, 0x916E, 0x6182,\n\t0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, 0x6186,\t0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A,\n\t0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190,\t0x917B, 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195,\n\t0x9180, 0x6196, 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199,\t0x9184, 0x619A, 0x9185, 0x619B, 0x9186, 0x619C, 0x9187, 0x619E,\n\t0x9188, 0x619F, 0x9189, 0x61A0, 0x918A, 0x61A1, 0x918B, 0x61A2,\t0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, 0x61A5, 0x918F, 0x61A6,\n\t0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, 0x9193, 0x61AE,\t0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, 0x61B2,\n\t0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6,\t0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB,\n\t0x91A0, 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0,\t0x91A4, 0x61C1, 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5,\n\t0x91A8, 0x61C6, 0x91A9, 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC,\t0x91AC, 0x61CD, 0x91AD, 0x61CE, 0x91AE, 0x61CF, 0x91AF, 0x61D0,\n\t0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, 0x61D6, 0x91B3, 0x61D7,\t0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, 0x91B7, 0x61DB,\n\t0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, 0x61DF,\t0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3,\n\t0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8,\t0x91C4, 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC,\n\t0x91C8, 0x61ED, 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0,\t0x91CC, 0x61F1, 0x91CD, 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4,\n\t0x91D0, 0x61F6, 0x91D1, 0x61F7, 0x91D2, 0x61F8, 0x91D3, 0x61F9,\t0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, 0x61FC, 0x91D7, 0x61FD,\n\t0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, 0x91DB, 0x6202,\t0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, 0x6207,\n\t0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219,\t0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220,\n\t0x91E8, 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228,\t0x91EC, 0x6229, 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F,\n\t0x91F0, 0x6230, 0x91F1, 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235,\t0x91F4, 0x6236, 0x91F5, 0x6238, 0x91F6, 0x6239, 0x91F7, 0x623A,\n\t0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, 0x6242, 0x91FB, 0x6244,\t0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, 0x9240, 0x624F,\n\t0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, 0x6257,\t0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D,\n\t0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261,\t0x924D, 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268,\n\t0x9251, 0x6271, 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275,\t0x9255, 0x6277, 0x9256, 0x6278, 0x9257, 0x627A, 0x9258, 0x627B,\n\t0x9259, 0x627D, 0x925A, 0x6281, 0x925B, 0x6282, 0x925C, 0x6283,\t0x925D, 0x6285, 0x925E, 0x6286, 0x925F, 0x6287, 0x9260, 0x6288,\n\t0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, 0x9264, 0x628E,\t0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, 0x6299,\n\t0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3,\t0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA,\n\t0x9271, 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0,\t0x9275, 0x62B2, 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6,\n\t0x9279, 0x62B7, 0x927A, 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE,\t0x927D, 0x62C0, 0x927E, 0x62C1, 0x9280, 0x62C3, 0x9281, 0x62CB,\n\t0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, 0x62D5, 0x9285, 0x62DD,\t0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, 0x9289, 0x62E4,\n\t0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, 0x62F2,\t0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA,\n\t0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304,\t0x9296, 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B,\n\t0x929A, 0x630C, 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310,\t0x929E, 0x6312, 0x929F, 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315,\n\t0x92A2, 0x6317, 0x92A3, 0x6318, 0x92A4, 0x6319, 0x92A5, 0x631C,\t0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, 0x6329, 0x92A9, 0x632C,\n\t0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, 0x92AD, 0x6331,\t0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, 0x6336,\n\t0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C,\t0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341,\n\t0x92BA, 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A,\t0x92BE, 0x6351, 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354,\n\t0x92C2, 0x6356, 0x92C3, 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359,\t0x92C6, 0x635A, 0x92C7, 0x635B, 0x92C8, 0x635C, 0x92C9, 0x635D,\n\t0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, 0x6365, 0x92CD, 0x6366,\t0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, 0x92D1, 0x636C,\n\t0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, 0x6373,\t0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379,\n\t0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F,\t0x92DE, 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385,\n\t0x92E2, 0x6386, 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391,\t0x92E6, 0x6393, 0x92E7, 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397,\n\t0x92EA, 0x6399, 0x92EB, 0x639A, 0x92EC, 0x639B, 0x92ED, 0x639C,\t0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, 0x639F, 0x92F1, 0x63A1,\n\t0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, 0x92F5, 0x63AF,\t0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, 0x63B6,\n\t0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF,\t0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3,\n\t0x9343, 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA,\t0x9347, 0x63CB, 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3,\n\t0x934B, 0x63D4, 0x934C, 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8,\t0x934F, 0x63D9, 0x9350, 0x63DA, 0x9351, 0x63DB, 0x9352, 0x63DC,\n\t0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, 0x63E2, 0x9356, 0x63E4,\t0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, 0x935A, 0x63E8,\n\t0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, 0x63EF,\t0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5,\n\t0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB,\t0x9367, 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404,\n\t0x936B, 0x6406, 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409,\t0x936F, 0x640A, 0x9370, 0x640D, 0x9371, 0x640E, 0x9372, 0x6411,\n\t0x9373, 0x6412, 0x9374, 0x6415, 0x9375, 0x6416, 0x9376, 0x6417,\t0x9377, 0x6418, 0x9378, 0x6419, 0x9379, 0x641A, 0x937A, 0x641D,\n\t0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, 0x937E, 0x6424,\t0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, 0x6429,\n\t0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430,\t0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435,\n\t0x938C, 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439,\t0x9390, 0x643B, 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440,\n\t0x9394, 0x6442, 0x9395, 0x6443, 0x9396, 0x6449, 0x9397, 0x644B,\t0x9398, 0x644C, 0x9399, 0x644D, 0x939A, 0x644E, 0x939B, 0x644F,\n\t0x939C, 0x6450, 0x939D, 0x6451, 0x939E, 0x6453, 0x939F, 0x6455,\t0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, 0x93A3, 0x645A,\n\t0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, 0x645F,\t0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463,\n\t0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468,\t0x93B0, 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E,\n\t0x93B4, 0x646F, 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472,\t0x93B8, 0x6473, 0x93B9, 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476,\n\t0x93BC, 0x6477, 0x93BD, 0x647B, 0x93BE, 0x647C, 0x93BF, 0x647D,\t0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, 0x6480, 0x93C3, 0x6481,\n\t0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, 0x93C7, 0x6489,\t0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, 0x648D,\n\t0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493,\t0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A,\n\t0x93D4, 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F,\t0x93D8, 0x64A0, 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3,\n\t0x93DC, 0x64A5, 0x93DD, 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8,\t0x93E0, 0x64AA, 0x93E1, 0x64AB, 0x93E2, 0x64AF, 0x93E3, 0x64B1,\n\t0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, 0x64B4, 0x93E7, 0x64B6,\t0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, 0x93EB, 0x64BE,\n\t0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, 0x64C4,\t0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9,\n\t0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF,\t0x93F8, 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5,\n\t0x93FC, 0x64D6, 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB,\t0x9441, 0x64DC, 0x9442, 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0,\n\t0x9445, 0x64E1, 0x9446, 0x64E3, 0x9447, 0x64E5, 0x9448, 0x64E7,\t0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, 0x64EA, 0x944C, 0x64EB,\n\t0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, 0x9450, 0x64EF,\t0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, 0x64F3,\n\t0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7,\t0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB,\n\t0x945D, 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF,\t0x9461, 0x6501, 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504,\n\t0x9465, 0x6505, 0x9466, 0x6506, 0x9467, 0x6507, 0x9468, 0x6508,\t0x9469, 0x650A, 0x946A, 0x650B, 0x946B, 0x650C, 0x946C, 0x650D,\n\t0x946D, 0x650E, 0x946E, 0x650F, 0x946F, 0x6510, 0x9470, 0x6511,\t0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, 0x9474, 0x6516,\n\t0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, 0x651B,\t0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F,\n\t0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523,\t0x9482, 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528,\n\t0x9486, 0x6529, 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D,\t0x948A, 0x6530, 0x948B, 0x6531, 0x948C, 0x6532, 0x948D, 0x6533,\n\t0x948E, 0x6537, 0x948F, 0x653A, 0x9490, 0x653C, 0x9491, 0x653D,\t0x9492, 0x6540, 0x9493, 0x6541, 0x9494, 0x6542, 0x9495, 0x6543,\n\t0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, 0x9499, 0x654A,\t0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, 0x6550,\n\t0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557,\t0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F,\n\t0x94A6, 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565,\t0x94AA, 0x6567, 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A,\n\t0x94AE, 0x656D, 0x94AF, 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571,\t0x94B2, 0x6573, 0x94B3, 0x6575, 0x94B4, 0x6576, 0x94B5, 0x6578,\n\t0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, 0x657B, 0x94B9, 0x657C,\t0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, 0x94BD, 0x6580,\n\t0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, 0x6584,\t0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589,\n\t0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F,\t0x94CA, 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596,\n\t0x94CE, 0x6598, 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E,\t0x94D2, 0x65A0, 0x94D3, 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6,\n\t0x94D6, 0x65A8, 0x94D7, 0x65AA, 0x94D8, 0x65AC, 0x94D9, 0x65AE,\t0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, 0x65B3, 0x94DD, 0x65B4,\n\t0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, 0x94E1, 0x65B8,\t0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, 0x65BF,\n\t0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8,\t0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0,\n\t0x94EE, 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5,\t0x94F2, 0x65D8, 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB,\n\t0x94F6, 0x65DC, 0x94F7, 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF,\t0x94FA, 0x65E1, 0x94FB, 0x65E3, 0x94FC, 0x65E4, 0x94FD, 0x65EA,\n\t0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, 0x65F3, 0x9542, 0x65F4,\t0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, 0x9546, 0x65FB,\n\t0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, 0x65FF,\t0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607,\n\t0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D,\t0x9553, 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616,\n\t0x9557, 0x6617, 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B,\t0x955B, 0x661C, 0x955C, 0x661E, 0x955D, 0x6621, 0x955E, 0x6622,\n\t0x955F, 0x6623, 0x9560, 0x6624, 0x9561, 0x6626, 0x9562, 0x6629,\t0x9563, 0x662A, 0x9564, 0x662B, 0x9565, 0x662C, 0x9566, 0x662E,\n\t0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, 0x956A, 0x6637,\t0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, 0x663B,\n\t0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642,\t0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647,\n\t0x9577, 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D,\t0x957B, 0x664E, 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658,\n\t0x9580, 0x6659, 0x9581, 0x665B, 0x9582, 0x665C, 0x9583, 0x665D,\t0x9584, 0x665E, 0x9585, 0x6660, 0x9586, 0x6662, 0x9587, 0x6663,\n\t0x9588, 0x6665, 0x9589, 0x6667, 0x958A, 0x6669, 0x958B, 0x666A,\t0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, 0x958F, 0x6671,\n\t0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, 0x6678,\t0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D,\n\t0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683,\t0x959C, 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689,\n\t0x95A0, 0x668A, 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E,\t0x95A4, 0x668F, 0x95A5, 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693,\n\t0x95A8, 0x6694, 0x95A9, 0x6695, 0x95AA, 0x6698, 0x95AB, 0x6699,\t0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, 0x669C, 0x95AF, 0x669E,\n\t0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, 0x95B3, 0x66A2,\t0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, 0x66A6,\n\t0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC,\t0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1,\n\t0x95C0, 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6,\t0x95C4, 0x66B7, 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB,\n\t0x95C8, 0x66BC, 0x95C9, 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0,\t0x95CC, 0x66C1, 0x95CD, 0x66C2, 0x95CE, 0x66C3, 0x95CF, 0x66C4,\n\t0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, 0x66C7, 0x95D3, 0x66C8,\t0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, 0x95D7, 0x66CC,\n\t0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, 0x66D0,\t0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4,\n\t0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8,\t0x95E4, 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0,\n\t0x95E8, 0x66E1, 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4,\t0x95EC, 0x66E5, 0x95ED, 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA,\n\t0x95F0, 0x66EB, 0x95F1, 0x66EC, 0x95F2, 0x66ED, 0x95F3, 0x66EE,\t0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, 0x66F5, 0x95F7, 0x66F6,\n\t0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, 0x95FB, 0x66FD,\t0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, 0x6704,\n\t0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C,\t0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712,\n\t0x9649, 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719,\t0x964D, 0x671A, 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720,\n\t0x9651, 0x6721, 0x9652, 0x6722, 0x9653, 0x6723, 0x9654, 0x6724,\t0x9655, 0x6725, 0x9656, 0x6727, 0x9657, 0x6729, 0x9658, 0x672E,\n\t0x9659, 0x6730, 0x965A, 0x6732, 0x965B, 0x6733, 0x965C, 0x6736,\t0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, 0x9660, 0x673B,\n\t0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, 0x6741,\t0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A,\n\t0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754,\t0x966D, 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759,\n\t0x9671, 0x675A, 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762,\t0x9675, 0x6763, 0x9676, 0x6764, 0x9677, 0x6766, 0x9678, 0x6767,\n\t0x9679, 0x676B, 0x967A, 0x676C, 0x967B, 0x676E, 0x967C, 0x6771,\t0x967D, 0x6774, 0x967E, 0x6776, 0x9680, 0x6778, 0x9681, 0x6779,\n\t0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, 0x9685, 0x6780,\t0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, 0x6786,\n\t0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D,\t0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792,\n\t0x9692, 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799,\t0x9696, 0x679B, 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1,\n\t0x969A, 0x67A4, 0x969B, 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC,\t0x969E, 0x67AE, 0x969F, 0x67B1, 0x96A0, 0x67B2, 0x96A1, 0x67B4,\n\t0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, 0x67BB, 0x96A5, 0x67BC,\t0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, 0x96A9, 0x67C0,\n\t0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, 0x67C7,\t0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB,\n\t0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5,\t0x96B6, 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF,\n\t0x96BA, 0x67E1, 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6,\t0x96BE, 0x67E7, 0x96BF, 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB,\n\t0x96C2, 0x67ED, 0x96C3, 0x67EE, 0x96C4, 0x67F2, 0x96C5, 0x67F5,\t0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, 0x67F8, 0x96C9, 0x67F9,\n\t0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, 0x96CD, 0x67FE,\t0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, 0x6804,\n\t0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812,\t0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819,\n\t0x96DA, 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E,\t0x96DE, 0x681F, 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823,\n\t0x96E2, 0x6824, 0x96E3, 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827,\t0x96E6, 0x6828, 0x96E7, 0x682B, 0x96E8, 0x682C, 0x96E9, 0x682D,\n\t0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, 0x6830, 0x96ED, 0x6831,\t0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, 0x96F1, 0x683A,\n\t0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, 0x684B,\t0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856,\n\t0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A,\t0x96FE, 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E,\n\t0x9743, 0x685F, 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D,\t0x9747, 0x686E, 0x9748, 0x686F, 0x9749, 0x6870, 0x974A, 0x6871,\n\t0x974B, 0x6872, 0x974C, 0x6873, 0x974D, 0x6875, 0x974E, 0x6878,\t0x974F, 0x6879, 0x9750, 0x687A, 0x9751, 0x687B, 0x9752, 0x687C,\n\t0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, 0x9756, 0x6880,\t0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, 0x6888,\n\t0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C,\t0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891,\n\t0x9763, 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896,\t0x9767, 0x6898, 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B,\n\t0x976B, 0x689C, 0x976C, 0x689D, 0x976D, 0x689E, 0x976E, 0x689F,\t0x976F, 0x68A0, 0x9770, 0x68A1, 0x9771, 0x68A3, 0x9772, 0x68A4,\n\t0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, 0x68AA, 0x9776, 0x68AB,\t0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, 0x977A, 0x68B2,\n\t0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, 0x68B8,\t0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC,\n\t0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1,\t0x9788, 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6,\n\t0x978C, 0x68C7, 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC,\t0x9790, 0x68CE, 0x9791, 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1,\n\t0x9794, 0x68D3, 0x9795, 0x68D4, 0x9796, 0x68D6, 0x9797, 0x68D7,\t0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, 0x68DC, 0x979B, 0x68DD,\n\t0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, 0x979F, 0x68E2,\t0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, 0x68E7,\n\t0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB,\t0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2,\n\t0x97AC, 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7,\t0x97B0, 0x68F8, 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE,\n\t0x97B4, 0x68FF, 0x97B5, 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903,\t0x97B8, 0x6904, 0x97B9, 0x6906, 0x97BA, 0x6907, 0x97BB, 0x6908,\n\t0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, 0x690C, 0x97BF, 0x690F,\t0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, 0x97C3, 0x6915,\n\t0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, 0x6919,\t0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D,\n\t0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923,\t0x97D0, 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928,\n\t0x97D4, 0x6929, 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C,\t0x97D8, 0x692E, 0x97D9, 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932,\n\t0x97DC, 0x6933, 0x97DD, 0x6935, 0x97DE, 0x6936, 0x97DF, 0x6937,\t0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, 0x693B, 0x97E3, 0x693C,\n\t0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, 0x97E7, 0x6943,\t0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, 0x6947,\n\t0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B,\t0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F,\n\t0x97F4, 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953,\t0x97F8, 0x6955, 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959,\n\t0x97FC, 0x695B, 0x97FD, 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961,\t0x9841, 0x6962, 0x9842, 0x6964, 0x9843, 0x6965, 0x9844, 0x6967,\n\t0x9845, 0x6968, 0x9846, 0x6969, 0x9847, 0x696A, 0x9848, 0x696C,\t0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, 0x984C, 0x6972,\n\t0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, 0x6976,\t0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E,\n\t0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985,\t0x9859, 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E,\n\t0x985D, 0x698F, 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992,\t0x9861, 0x6993, 0x9862, 0x6996, 0x9863, 0x6997, 0x9864, 0x6999,\n\t0x9865, 0x699A, 0x9866, 0x699D, 0x9867, 0x699E, 0x9868, 0x699F,\t0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, 0x69A2, 0x986C, 0x69A3,\n\t0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, 0x9870, 0x69A9,\t0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, 0x69AF,\n\t0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5,\t0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA,\n\t0x987D, 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF,\t0x9882, 0x69C0, 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4,\n\t0x9886, 0x69C5, 0x9887, 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8,\t0x988A, 0x69C9, 0x988B, 0x69CB, 0x988C, 0x69CD, 0x988D, 0x69CF,\n\t0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, 0x69D3, 0x9891, 0x69D5,\t0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, 0x9895, 0x69D9,\n\t0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, 0x69DE,\t0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4,\n\t0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8,\t0x98A2, 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC,\n\t0x98A6, 0x69EE, 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1,\t0x98AA, 0x69F3, 0x98AB, 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6,\n\t0x98AE, 0x69F7, 0x98AF, 0x69F8, 0x98B0, 0x69F9, 0x98B1, 0x69FA,\t0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, 0x69FE, 0x98B5, 0x6A00,\n\t0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, 0x98B9, 0x6A04,\t0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, 0x6A08,\n\t0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D,\t0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11,\n\t0x98C6, 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15,\t0x98CA, 0x6A16, 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B,\n\t0x98CE, 0x6A1C, 0x98CF, 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20,\t0x98D2, 0x6A22, 0x98D3, 0x6A23, 0x98D4, 0x6A24, 0x98D5, 0x6A25,\n\t0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, 0x6A29, 0x98D9, 0x6A2B,\t0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, 0x98DD, 0x6A30,\n\t0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, 0x6A36,\t0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A,\n\t0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40,\t0x98EA, 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45,\n\t0x98EE, 0x6A46, 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A,\t0x98F2, 0x6A4B, 0x98F3, 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E,\n\t0x98F6, 0x6A4F, 0x98F7, 0x6A51, 0x98F8, 0x6A52, 0x98F9, 0x6A53,\t0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, 0x6A56, 0x98FD, 0x6A57,\n\t0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, 0x9942, 0x6A5E,\t0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, 0x6A63,\n\t0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68,\t0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C,\n\t0x994F, 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70,\t0x9953, 0x6A72, 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75,\n\t0x9957, 0x6A76, 0x9958, 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A,\t0x995B, 0x6A7B, 0x995C, 0x6A7D, 0x995D, 0x6A7E, 0x995E, 0x6A7F,\n\t0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, 0x6A83, 0x9962, 0x6A85,\t0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, 0x9966, 0x6A89,\n\t0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, 0x6A8D,\t0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94,\n\t0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99,\t0x9973, 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D,\n\t0x9977, 0x6A9E, 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2,\t0x997B, 0x6AA3, 0x997C, 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6,\n\t0x9980, 0x6AA7, 0x9981, 0x6AA8, 0x9982, 0x6AAA, 0x9983, 0x6AAD,\t0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, 0x6AB0, 0x9987, 0x6AB1,\n\t0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, 0x998B, 0x6AB5,\t0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, 0x6AB9,\n\t0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD,\t0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1,\n\t0x9998, 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5,\t0x999C, 0x6AC6, 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9,\n\t0x99A0, 0x6ACA, 0x99A1, 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD,\t0x99A4, 0x6ACE, 0x99A5, 0x6ACF, 0x99A6, 0x6AD0, 0x99A7, 0x6AD1,\n\t0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, 0x6AD4, 0x99AB, 0x6AD5,\t0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, 0x99AF, 0x6AD9,\n\t0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, 0x6ADD,\t0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1,\n\t0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5,\t0x99BC, 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9,\n\t0x99C0, 0x6AEA, 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED,\t0x99C4, 0x6AEE, 0x99C5, 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1,\n\t0x99C8, 0x6AF2, 0x99C9, 0x6AF3, 0x99CA, 0x6AF4, 0x99CB, 0x6AF5,\t0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, 0x6AF8, 0x99CF, 0x6AF9,\n\t0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, 0x99D3, 0x6AFD,\t0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, 0x6B01,\n\t0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05,\t0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09,\n\t0x99E0, 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D,\t0x99E4, 0x6B0E, 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11,\n\t0x99E8, 0x6B12, 0x99E9, 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15,\t0x99EC, 0x6B16, 0x99ED, 0x6B17, 0x99EE, 0x6B18, 0x99EF, 0x6B19,\n\t0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, 0x6B1C, 0x99F3, 0x6B1D,\t0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, 0x99F7, 0x6B26,\n\t0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, 0x6B2B,\t0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F,\n\t0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34,\t0x9A45, 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B,\n\t0x9A49, 0x6B3C, 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40,\t0x9A4D, 0x6B41, 0x9A4E, 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45,\n\t0x9A51, 0x6B48, 0x9A52, 0x6B4A, 0x9A53, 0x6B4B, 0x9A54, 0x6B4D,\t0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, 0x6B50, 0x9A58, 0x6B51,\n\t0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, 0x9A5C, 0x6B55,\t0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, 0x6B5A,\n\t0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E,\t0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68,\n\t0x9A69, 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D,\t0x9A6D, 0x6B6E, 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71,\n\t0x9A71, 0x6B72, 0x9A72, 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75,\t0x9A75, 0x6B76, 0x9A76, 0x6B77, 0x9A77, 0x6B78, 0x9A78, 0x6B7A,\n\t0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, 0x6B7F, 0x9A7C, 0x6B80,\t0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, 0x9A81, 0x6B8E,\n\t0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, 0x6B94,\t0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99,\n\t0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F,\t0x9A8E, 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4,\n\t0x9A92, 0x6BA5, 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8,\t0x9A96, 0x6BA9, 0x9A97, 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD,\n\t0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1,\t0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, 0x6BB8, 0x9AA1, 0x6BB9,\n\t0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, 0x9AA5, 0x6BBD,\t0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, 0x6BC4,\n\t0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9,\t0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0,\n\t0x9AB2, 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC,\t0x9AB6, 0x6BDD, 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0,\n\t0x9ABA, 0x6BE2, 0x9ABB, 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5,\t0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9,\n\t0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, 0x6BEE, 0x9AC5, 0x6BF0,\t0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, 0x9AC9, 0x6BF6,\n\t0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, 0x6BFB,\t0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00,\n\t0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04,\t0x9AD6, 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B,\n\t0x9ADA, 0x6C0C, 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17,\t0x9ADE, 0x6C1C, 0x9ADF, 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20,\n\t0x9AE2, 0x6C23, 0x9AE3, 0x6C25, 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C,\t0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, 0x6C33, 0x9AE9, 0x6C36,\n\t0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, 0x9AED, 0x6C3B,\t0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, 0x6C43,\n\t0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B,\t0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F,\n\t0x9AFA, 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56,\t0x9AFE, 0x6C58, 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62,\n\t0x9B43, 0x6C63, 0x9B44, 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67,\t0x9B47, 0x6C6B, 0x9B48, 0x6C6C, 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E,\n\t0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, 0x6C73, 0x9B4E, 0x6C75,\t0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, 0x9B52, 0x6C7B,\n\t0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, 0x6C84,\t0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D,\n\t0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95,\t0x9B5F, 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A,\n\t0x9B63, 0x6C9C, 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0,\t0x9B67, 0x6CA2, 0x9B68, 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF,\n\t0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6,\t0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, 0x6CC0, 0x9B72, 0x6CC1,\n\t0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, 0x9B76, 0x6CC7,\t0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, 0x6CCE,\n\t0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8,\t0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD,\n\t0x9B84, 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7,\t0x9B88, 0x6CE9, 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2,\n\t0x9B8C, 0x6CF4, 0x9B8D, 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00,\t0x9B90, 0x6D02, 0x9B91, 0x6D03, 0x9B92, 0x6D05, 0x9B93, 0x6D06,\n\t0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, 0x6D0A, 0x9B97, 0x6D0D,\t0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, 0x9B9B, 0x6D13,\n\t0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, 0x6D18,\t0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20,\n\t0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24,\t0x9BA8, 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C,\n\t0x9BAC, 0x6D2D, 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34,\t0x9BB0, 0x6D36, 0x9BB1, 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A,\n\t0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, 0x9BB6, 0x6D42, 0x9BB7, 0x6D44,\t0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, 0x6D50, 0x9BBB, 0x6D55,\n\t0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, 0x9BBF, 0x6D5B,\t0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, 0x6D62,\n\t0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68,\t0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70,\n\t0x9BCC, 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75,\t0x9BD0, 0x6D76, 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B,\n\t0x9BD4, 0x6D7D, 0x9BD5, 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80,\t0x9BD8, 0x6D81, 0x9BD9, 0x6D83, 0x9BDA, 0x6D84, 0x9BDB, 0x6D86,\n\t0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, 0x6D8B, 0x9BDF, 0x6D8D,\t0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, 0x9BE3, 0x6D96,\n\t0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, 0x6D9A,\t0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC,\n\t0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3,\t0x9BF0, 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9,\n\t0x9BF4, 0x6DBA, 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD,\t0x9BF8, 0x6DBE, 0x9BF9, 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3,\n\t0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD,\t0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, 0x6DD0, 0x9C44, 0x6DD2,\n\t0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, 0x9C48, 0x6DD7,\t0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, 0x6DDF,\n\t0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7,\t0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED,\n\t0x9C55, 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4,\t0x9C59, 0x6DF5, 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA,\n\t0x9C5D, 0x6DFD, 0x9C5E, 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00,\t0x9C61, 0x6E01, 0x9C62, 0x6E02, 0x9C63, 0x6E03, 0x9C64, 0x6E04,\n\t0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, 0x6E08, 0x9C68, 0x6E09,\t0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, 0x9C6C, 0x6E13,\n\t0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, 0x6E1B,\t0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22,\n\t0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A,\t0x9C79, 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31,\n\t0x9C7D, 0x6E33, 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37,\t0x9C82, 0x6E39, 0x9C83, 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D,\n\t0x9C86, 0x6E3E, 0x9C87, 0x6E3F, 0x9C88, 0x6E40, 0x9C89, 0x6E41,\t0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, 0x6E46, 0x9C8D, 0x6E47,\n\t0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, 0x9C91, 0x6E4B,\t0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, 0x6E51,\n\t0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59,\t0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E,\n\t0x9C9E, 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63,\t0x9CA2, 0x6E64, 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67,\n\t0x9CA6, 0x6E68, 0x9CA7, 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C,\t0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, 0x9CAC, 0x6E70, 0x9CAD, 0x6E71,\n\t0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, 0x6E74, 0x9CB1, 0x6E75,\t0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, 0x9CB5, 0x6E79,\n\t0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, 0x6E7D,\t0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84,\n\t0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B,\t0x9CC2, 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91,\n\t0x9CC6, 0x6E92, 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95,\t0x9CCA, 0x6E96, 0x9CCB, 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A,\n\t0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0,\t0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, 0x6EA4, 0x9CD5, 0x6EA6,\n\t0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, 0x9CD9, 0x6EAC,\t0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, 0x6EB3,\n\t0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC,\t0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3,\n\t0x9CE6, 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8,\t0x9CEA, 0x6EC9, 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD,\n\t0x9CEE, 0x6ECE, 0x9CEF, 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6,\t0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC,\n\t0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, 0x6EE7, 0x9CF9, 0x6EEA,\t0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, 0x9CFD, 0x6EEE,\n\t0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, 0x6EF2,\t0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7,\n\t0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC,\t0x9D4B, 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00,\n\t0x9D4F, 0x6F01, 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05,\t0x9D53, 0x6F07, 0x9D54, 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B,\n\t0x9D57, 0x6F0C, 0x9D58, 0x6F0D, 0x9D59, 0x6F0E, 0x9D5A, 0x6F10,\t0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, 0x6F16, 0x9D5E, 0x6F17,\n\t0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, 0x9D62, 0x6F1B,\t0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, 0x6F1F,\n\t0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25,\t0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C,\n\t0x9D6F, 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34,\t0x9D73, 0x6F35, 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39,\n\t0x9D77, 0x6F3A, 0x9D78, 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D,\t0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, 0x9D7D, 0x6F41, 0x9D7E, 0x6F42,\n\t0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, 0x6F45, 0x9D83, 0x6F48,\t0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, 0x9D87, 0x6F4E,\n\t0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, 0x6F52,\t0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56,\n\t0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B,\t0x9D94, 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61,\n\t0x9D98, 0x6F63, 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67,\t0x9D9C, 0x6F68, 0x9D9D, 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B,\n\t0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, 0x9DA2, 0x6F70, 0x9DA3, 0x6F71,\t0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, 0x6F76, 0x9DA7, 0x6F77,\n\t0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, 0x9DAB, 0x6F7E,\t0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, 0x6F82,\n\t0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87,\t0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90,\n\t0x9DB8, 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94,\t0x9DBC, 0x6F95, 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98,\n\t0x9DC0, 0x6F99, 0x9DC1, 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D,\t0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2,\n\t0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, 0x6FA5, 0x9DCB, 0x6FA6,\t0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, 0x9DCF, 0x6FAB,\n\t0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, 0x6FAF,\t0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4,\n\t0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA,\t0x9DDC, 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE,\n\t0x9DE0, 0x6FBF, 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4,\t0x9DE4, 0x6FC5, 0x9DE5, 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8,\n\t0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD,\t0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, 0x6FD0, 0x9DEF, 0x6FD3,\n\t0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, 0x9DF3, 0x6FD7,\t0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, 0x6FDB,\n\t0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2,\t0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6,\n\t0x9E41, 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA,\t0x9E45, 0x6FEB, 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0,\n\t0x9E49, 0x6FF1, 0x9E4A, 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4,\t0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8,\n\t0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, 0x6FFB, 0x9E54, 0x6FFC,\t0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, 0x9E58, 0x7000,\n\t0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, 0x7004,\t0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008,\n\t0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C,\t0x9E65, 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010,\n\t0x9E69, 0x7012, 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015,\t0x9E6D, 0x7016, 0x9E6E, 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019,\n\t0x9E71, 0x701C, 0x9E72, 0x701D, 0x9E73, 0x701E, 0x9E74, 0x701F,\t0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, 0x7022, 0x9E78, 0x7024,\n\t0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, 0x9E7C, 0x7028,\t0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, 0x702C,\n\t0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030,\t0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034,\n\t0x9E8A, 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A,\t0x9E8E, 0x703B, 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E,\n\t0x9E92, 0x703F, 0x9E93, 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042,\t0x9E96, 0x7043, 0x9E97, 0x7044, 0x9E98, 0x7045, 0x9E99, 0x7046,\n\t0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, 0x7049, 0x9E9D, 0x704A,\t0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, 0x9EA1, 0x7050,\n\t0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, 0x7054,\t0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058,\n\t0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C,\t0x9EAE, 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061,\n\t0x9EB2, 0x7062, 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065,\t0x9EB6, 0x7066, 0x9EB7, 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069,\n\t0x9EBA, 0x706A, 0x9EBB, 0x706E, 0x9EBC, 0x7071, 0x9EBD, 0x7072,\t0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, 0x7077, 0x9EC1, 0x7079,\n\t0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, 0x9EC5, 0x7081,\t0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, 0x7086,\n\t0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C,\t0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091,\n\t0x9ED2, 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A,\t0x9ED6, 0x709B, 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0,\n\t0x9EDA, 0x70A1, 0x9EDB, 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4,\t0x9EDE, 0x70A5, 0x9EDF, 0x70A6, 0x9EE0, 0x70A7, 0x9EE1, 0x70A8,\n\t0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, 0x70B0, 0x9EE5, 0x70B2,\t0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, 0x9EE9, 0x70BA,\n\t0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, 0x70C5,\t0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB,\n\t0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF,\t0x9EF6, 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3,\n\t0x9EFA, 0x70D4, 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7,\t0x9EFE, 0x70DA, 0x9F40, 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE,\n\t0x9F43, 0x70E0, 0x9F44, 0x70E1, 0x9F45, 0x70E2, 0x9F46, 0x70E3,\t0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, 0x70EE, 0x9F4A, 0x70F0,\n\t0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, 0x9F4E, 0x70F4,\t0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, 0x70FA,\n\t0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF,\t0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103,\n\t0x9F5B, 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107,\t0x9F5F, 0x7108, 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D,\n\t0x9F63, 0x710E, 0x9F64, 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112,\t0x9F67, 0x7114, 0x9F68, 0x7117, 0x9F69, 0x711B, 0x9F6A, 0x711C,\n\t0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, 0x711F, 0x9F6E, 0x7120,\t0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, 0x9F72, 0x7124,\n\t0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, 0x7129,\t0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D,\n\t0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134,\t0x9F80, 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139,\n\t0x9F84, 0x713A, 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D,\t0x9F88, 0x713E, 0x9F89, 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141,\n\t0x9F8C, 0x7142, 0x9F8D, 0x7143, 0x9F8E, 0x7144, 0x9F8F, 0x7146,\t0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, 0x7149, 0x9F93, 0x714B,\n\t0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, 0x9F97, 0x7151,\t0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, 0x7155,\n\t0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159,\t0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F,\n\t0x9FA4, 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163,\t0x9FA8, 0x7165, 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B,\n\t0x9FAC, 0x716C, 0x9FAD, 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170,\t0x9FB0, 0x7171, 0x9FB1, 0x7174, 0x9FB2, 0x7175, 0x9FB3, 0x7176,\n\t0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, 0x717B, 0x9FB7, 0x717C,\t0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, 0x9FBB, 0x7181,\n\t0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, 0x7186,\t0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B,\n\t0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190,\t0x9FC8, 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195,\n\t0x9FCC, 0x7196, 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B,\t0x9FD0, 0x719C, 0x9FD1, 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1,\n\t0x9FD4, 0x71A2, 0x9FD5, 0x71A3, 0x9FD6, 0x71A4, 0x9FD7, 0x71A5,\t0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, 0x71A9, 0x9FDB, 0x71AA,\n\t0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, 0x9FDF, 0x71AF,\t0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, 0x71B4,\n\t0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA,\t0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE,\n\t0x9FEC, 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2,\t0x9FF0, 0x71C4, 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7,\n\t0x9FF4, 0x71C8, 0x9FF5, 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB,\t0x9FF8, 0x71CC, 0x9FF9, 0x71CD, 0x9FFA, 0x71CF, 0x9FFB, 0x71D0,\n\t0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, 0x71D3, 0xA040, 0x71D6,\t0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, 0xA044, 0x71DA,\n\t0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, 0x71DE,\t0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3,\n\t0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9,\t0xA051, 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED,\n\t0xA055, 0x71EF, 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2,\t0xA059, 0x71F3, 0xA05A, 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6,\n\t0xA05D, 0x71F7, 0xA05E, 0x71F8, 0xA05F, 0x71FA, 0xA060, 0x71FB,\t0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, 0x71FE, 0xA064, 0x71FF,\n\t0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, 0xA068, 0x7203,\t0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, 0x7208,\n\t0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C,\t0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210,\n\t0xA075, 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214,\t0xA079, 0x7215, 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218,\n\t0xA07D, 0x7219, 0xA07E, 0x721A, 0xA080, 0x721B, 0xA081, 0x721C,\t0xA082, 0x721E, 0xA083, 0x721F, 0xA084, 0x7220, 0xA085, 0x7221,\n\t0xA086, 0x7222, 0xA087, 0x7223, 0xA088, 0x7224, 0xA089, 0x7225,\t0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, 0xA08D, 0x722B,\n\t0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, 0x7232,\t0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C,\n\t0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242,\t0xA09A, 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246,\n\t0xA09E, 0x7249, 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E,\t0xA0A2, 0x724F, 0xA0A3, 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253,\n\t0xA0A6, 0x7254, 0xA0A7, 0x7255, 0xA0A8, 0x7257, 0xA0A9, 0x7258,\t0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, 0x725E, 0xA0AD, 0x7260,\n\t0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, 0xA0B1, 0x7268,\t0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, 0x726D,\n\t0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274,\t0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B,\n\t0xA0BE, 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283,\t0xA0C2, 0x7285, 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288,\n\t0xA0C6, 0x7289, 0xA0C7, 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290,\t0xA0CA, 0x7291, 0xA0CB, 0x7293, 0xA0CC, 0x7294, 0xA0CD, 0x7295,\n\t0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, 0x7298, 0xA0D1, 0x7299,\t0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, 0xA0D5, 0x729D,\n\t0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, 0x72A2,\t0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6,\n\t0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA,\t0xA0E2, 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2,\n\t0xA0E6, 0x72B3, 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB,\t0xA0EA, 0x72BC, 0xA0EB, 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF,\n\t0xA0EE, 0x72C0, 0xA0EF, 0x72C5, 0xA0F0, 0x72C6, 0xA0F1, 0x72C7,\t0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, 0x72CB, 0xA0F5, 0x72CC,\n\t0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, 0xA0F9, 0x72D4,\t0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, 0x72DA,\n\t0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002,\t0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8,\n\t0xA1A8, 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E,\t0xA1AC, 0x2016, 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019,\n\t0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015,\t0xA1B4, 0x3008, 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B,\n\t0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F,\t0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, 0xA1BF, 0x3011,\n\t0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, 0x2236,\t0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F,\n\t0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237,\t0xA1CC, 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220,\n\t0xA1D0, 0x2312, 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E,\t0xA1D4, 0x2261, 0xA1D5, 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D,\n\t0xA1D8, 0x221D, 0xA1D9, 0x2260, 0xA1DA, 0x226E, 0xA1DB, 0x226F,\t0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, 0x221E, 0xA1DF, 0x2235,\n\t0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, 0xA1E3, 0x00B0,\t0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, 0xFF04,\n\t0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030,\t0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605,\n\t0xA1F0, 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7,\t0xA1F4, 0x25C6, 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3,\n\t0xA1F8, 0x25B2, 0xA1F9, 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190,\t0xA1FC, 0x2191, 0xA1FD, 0x2193, 0xA1FE, 0x3013, 0xA2A1, 0x2170,\n\t0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, 0x2173, 0xA2A5, 0x2174,\t0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, 0xA2A9, 0x2178,\n\t0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, 0x248A,\t0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E,\n\t0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492,\t0xA2BC, 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496,\n\t0xA2C0, 0x2497, 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A,\t0xA2C4, 0x249B, 0xA2C5, 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476,\n\t0xA2C8, 0x2477, 0xA2C9, 0x2478, 0xA2CA, 0x2479, 0xA2CB, 0x247A,\t0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, 0x247D, 0xA2CF, 0x247E,\n\t0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, 0xA2D3, 0x2482,\t0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, 0x2486,\n\t0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462,\t0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466,\n\t0xA2E0, 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220,\t0xA2E6, 0x3221, 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224,\n\t0xA2EA, 0x3225, 0xA2EB, 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228,\t0xA2EE, 0x3229, 0xA2F1, 0x2160, 0xA2F2, 0x2161, 0xA2F3, 0x2162,\n\t0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, 0x2165, 0xA2F7, 0x2166,\t0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, 0xA2FB, 0x216A,\n\t0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03,\t0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07,\n\t0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B,\t0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F,\n\t0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13,\t0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17,\n\t0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B,\t0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F,\n\t0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23,\t0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27,\n\t0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B,\t0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F,\n\t0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33,\t0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37,\n\t0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B,\t0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F,\n\t0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43,\t0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47,\n\t0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B,\t0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F,\n\t0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53,\t0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57,\n\t0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B,\t0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041,\n\t0xA4A2, 0x3042, 0xA4A3, 0x3043, 0xA4A4, 0x3044, 0xA4A5, 0x3045,\t0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, 0x3048, 0xA4A9, 0x3049,\n\t0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, 0xA4AD, 0x304D,\t0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, 0x3051,\n\t0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055,\t0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059,\n\t0xA4BA, 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D,\t0xA4BE, 0x305E, 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061,\n\t0xA4C2, 0x3062, 0xA4C3, 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065,\t0xA4C6, 0x3066, 0xA4C7, 0x3067, 0xA4C8, 0x3068, 0xA4C9, 0x3069,\n\t0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, 0x306C, 0xA4CD, 0x306D,\t0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, 0xA4D1, 0x3071,\n\t0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, 0x3075,\t0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079,\n\t0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D,\t0xA4DE, 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081,\n\t0xA4E2, 0x3082, 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085,\t0xA4E6, 0x3086, 0xA4E7, 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089,\n\t0xA4EA, 0x308A, 0xA4EB, 0x308B, 0xA4EC, 0x308C, 0xA4ED, 0x308D,\t0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, 0x3090, 0xA4F1, 0x3091,\n\t0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, 0xA5A2, 0x30A2,\t0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, 0x30A6,\n\t0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA,\t0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE,\n\t0xA5AF, 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2,\t0xA5B3, 0x30B3, 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6,\n\t0xA5B7, 0x30B7, 0xA5B8, 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA,\t0xA5BB, 0x30BB, 0xA5BC, 0x30BC, 0xA5BD, 0x30BD, 0xA5BE, 0x30BE,\n\t0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, 0x30C1, 0xA5C2, 0x30C2,\t0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, 0xA5C6, 0x30C6,\n\t0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, 0x30CA,\t0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE,\n\t0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2,\t0xA5D3, 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6,\n\t0xA5D7, 0x30D7, 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA,\t0xA5DB, 0x30DB, 0xA5DC, 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE,\n\t0xA5DF, 0x30DF, 0xA5E0, 0x30E0, 0xA5E1, 0x30E1, 0xA5E2, 0x30E2,\t0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, 0x30E5, 0xA5E6, 0x30E6,\n\t0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, 0xA5EA, 0x30EA,\t0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, 0x30EE,\n\t0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2,\t0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6,\n\t0xA6A1, 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394,\t0xA6A5, 0x0395, 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398,\n\t0xA6A9, 0x0399, 0xA6AA, 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C,\t0xA6AD, 0x039D, 0xA6AE, 0x039E, 0xA6AF, 0x039F, 0xA6B0, 0x03A0,\n\t0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, 0x03A4, 0xA6B4, 0x03A5,\t0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, 0xA6B8, 0x03A9,\n\t0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, 0x03B4,\t0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8,\n\t0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC,\t0xA6CD, 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0,\n\t0xA6D1, 0x03C1, 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5,\t0xA6D5, 0x03C6, 0xA6D6, 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9,\n\t0xA6E0, 0xFE35, 0xA6E1, 0xFE36, 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A,\t0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, 0xFE3D, 0xA6E7, 0xFE3E,\n\t0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, 0xA6EB, 0xFE44,\t0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, 0xFE38,\n\t0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410,\t0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414,\n\t0xA7A6, 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417,\t0xA7AA, 0x0418, 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B,\n\t0xA7AE, 0x041C, 0xA7AF, 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F,\t0xA7B2, 0x0420, 0xA7B3, 0x0421, 0xA7B4, 0x0422, 0xA7B5, 0x0423,\n\t0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, 0x0426, 0xA7B9, 0x0427,\t0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, 0xA7BD, 0x042B,\n\t0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, 0x042F,\t0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433,\n\t0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436,\t0xA7D9, 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A,\n\t0xA7DD, 0x043B, 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E,\t0xA7E1, 0x043F, 0xA7E2, 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442,\n\t0xA7E5, 0x0443, 0xA7E6, 0x0444, 0xA7E7, 0x0445, 0xA7E8, 0x0446,\t0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, 0x0449, 0xA7EC, 0x044A,\n\t0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, 0xA7F0, 0x044E,\t0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, 0x02D9,\n\t0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035,\t0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197,\n\t0xA84B, 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F,\t0xA84F, 0x2223, 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267,\n\t0xA853, 0x22BF, 0xA854, 0x2550, 0xA855, 0x2551, 0xA856, 0x2552,\t0xA857, 0x2553, 0xA858, 0x2554, 0xA859, 0x2555, 0xA85A, 0x2556,\n\t0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, 0x2559, 0xA85E, 0x255A,\t0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, 0xA862, 0x255E,\n\t0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, 0x2562,\t0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566,\n\t0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A,\t0xA86F, 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E,\n\t0xA873, 0x256F, 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572,\t0xA877, 0x2573, 0xA878, 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583,\n\t0xA87B, 0x2584, 0xA87C, 0x2585, 0xA87D, 0x2586, 0xA87E, 0x2587,\t0xA880, 0x2588, 0xA881, 0x2589, 0xA882, 0x258A, 0xA883, 0x258B,\n\t0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, 0xA887, 0x258F,\t0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, 0x25BC,\n\t0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4,\t0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012,\n\t0xA894, 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1,\t0xA8A3, 0x01CE, 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9,\n\t0xA8A7, 0x011B, 0xA8A8, 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED,\t0xA8AB, 0x01D0, 0xA8AC, 0x00EC, 0xA8AD, 0x014D, 0xA8AE, 0x00F3,\n\t0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, 0x016B, 0xA8B2, 0x00FA,\t0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, 0xA8B6, 0x01D8,\n\t0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, 0x00EA,\t0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261,\n\t0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108,\t0xA8C9, 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C,\n\t0xA8CD, 0x310D, 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110,\t0xA8D1, 0x3111, 0xA8D2, 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114,\n\t0xA8D5, 0x3115, 0xA8D6, 0x3116, 0xA8D7, 0x3117, 0xA8D8, 0x3118,\t0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, 0x311B, 0xA8DC, 0x311C,\n\t0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, 0xA8E0, 0x3120,\t0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, 0x3124,\n\t0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128,\t0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023,\n\t0xA943, 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027,\t0xA947, 0x3028, 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E,\n\t0xA94B, 0x338F, 0xA94C, 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E,\t0xA94F, 0x33A1, 0xA950, 0x33C4, 0xA951, 0x33CE, 0xA952, 0x33D1,\n\t0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, 0xFE30, 0xA956, 0xFFE2,\t0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, 0xA95C, 0x2010,\n\t0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, 0x30FD,\t0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E,\n\t0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C,\t0xA96C, 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50,\n\t0xA970, 0xFE51, 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55,\t0xA974, 0xFE56, 0xA975, 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A,\n\t0xA978, 0xFE5B, 0xA979, 0xFE5C, 0xA97A, 0xFE5D, 0xA97B, 0xFE5E,\t0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, 0xFE61, 0xA980, 0xFE62,\n\t0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, 0xA984, 0xFE66,\t0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, 0xFE6B,\n\t0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502,\t0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506,\n\t0xA9AB, 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A,\t0xA9AF, 0x250B, 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E,\n\t0xA9B3, 0x250F, 0xA9B4, 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512,\t0xA9B7, 0x2513, 0xA9B8, 0x2514, 0xA9B9, 0x2515, 0xA9BA, 0x2516,\n\t0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, 0x2519, 0xA9BE, 0x251A,\t0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, 0xA9C2, 0x251E,\n\t0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, 0x2522,\t0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526,\n\t0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A,\t0xA9CF, 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E,\n\t0xA9D3, 0x252F, 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532,\t0xA9D7, 0x2533, 0xA9D8, 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536,\n\t0xA9DB, 0x2537, 0xA9DC, 0x2538, 0xA9DD, 0x2539, 0xA9DE, 0x253A,\t0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, 0x253D, 0xA9E2, 0x253E,\n\t0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, 0xA9E6, 0x2542,\t0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, 0x2546,\n\t0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A,\t0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF,\n\t0xAA43, 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5,\t0xAA47, 0x72E6, 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB,\n\t0xAA4B, 0x72F5, 0xAA4C, 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD,\t0xAA4F, 0x72FE, 0xAA50, 0x72FF, 0xAA51, 0x7300, 0xAA52, 0x7302,\n\t0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, 0x7306, 0xAA56, 0x7307,\t0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, 0xAA5A, 0x730C,\n\t0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, 0x7311,\t0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319,\n\t0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323,\t0xAA67, 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328,\n\t0xAA6B, 0x732D, 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332,\t0xAA6F, 0x7333, 0xAA70, 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A,\n\t0xAA73, 0x733B, 0xAA74, 0x733C, 0xAA75, 0x733D, 0xAA76, 0x7340,\t0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, 0x7343, 0xAA7A, 0x7344,\n\t0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, 0xAA7E, 0x7348,\t0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, 0x734C,\n\t0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353,\t0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358,\n\t0xAA8C, 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C,\t0xAA90, 0x735D, 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361,\n\t0xAA94, 0x7362, 0xAA95, 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365,\t0xAA98, 0x7366, 0xAA99, 0x7367, 0xAA9A, 0x7368, 0xAA9B, 0x7369,\n\t0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, 0x736E, 0xAA9F, 0x7370,\t0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, 0xAB42, 0x7374,\n\t0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, 0x7378,\t0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C,\n\t0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381,\t0xAB4F, 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386,\n\t0xAB53, 0x7388, 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D,\t0xAB57, 0x738F, 0xAB58, 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393,\n\t0xAB5B, 0x7394, 0xAB5C, 0x7395, 0xAB5D, 0x7397, 0xAB5E, 0x7398,\t0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, 0x739C, 0xAB62, 0x739D,\n\t0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, 0xAB66, 0x73A3,\t0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, 0x73A7,\n\t0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD,\t0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6,\n\t0xAB73, 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD,\t0xAB77, 0x73BE, 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3,\n\t0xAB7B, 0x73C4, 0xAB7C, 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7,\t0xAB80, 0x73CB, 0xAB81, 0x73CC, 0xAB82, 0x73CE, 0xAB83, 0x73D2,\n\t0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, 0x73D5, 0xAB87, 0x73D6,\t0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, 0xAB8B, 0x73DB,\n\t0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, 0x73E1,\t0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6,\n\t0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC,\t0xAB98, 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1,\n\t0xAB9C, 0x73F3, 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6,\t0xABA0, 0x73F7, 0xAC40, 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA,\n\t0xAC43, 0x73FB, 0xAC44, 0x73FC, 0xAC45, 0x73FD, 0xAC46, 0x73FE,\t0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, 0x7401, 0xAC4A, 0x7402,\n\t0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, 0xAC4E, 0x740B,\t0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, 0x7411,\n\t0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415,\t0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419,\n\t0xAC5B, 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F,\t0xAC5F, 0x7420, 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424,\n\t0xAC63, 0x7427, 0xAC64, 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D,\t0xAC67, 0x742F, 0xAC68, 0x7431, 0xAC69, 0x7432, 0xAC6A, 0x7437,\n\t0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, 0x743A, 0xAC6E, 0x743B,\t0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, 0xAC72, 0x7440,\n\t0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, 0x7445,\t0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449,\n\t0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D,\t0xAC80, 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451,\n\t0xAC84, 0x7452, 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456,\t0xAC88, 0x7458, 0xAC89, 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461,\n\t0xAC8C, 0x7462, 0xAC8D, 0x7463, 0xAC8E, 0x7464, 0xAC8F, 0x7465,\t0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, 0x7468, 0xAC93, 0x7469,\n\t0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, 0xAC97, 0x746E,\t0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, 0x7473,\n\t0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479,\t0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D,\n\t0xAD43, 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485,\t0xAD47, 0x7486, 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A,\n\t0xAD4B, 0x748C, 0xAD4C, 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491,\t0xAD4F, 0x7492, 0xAD50, 0x7493, 0xAD51, 0x7494, 0xAD52, 0x7495,\n\t0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, 0x7498, 0xAD56, 0x7499,\t0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, 0xAD5A, 0x749F,\n\t0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, 0x74A3,\t0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA,\n\t0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE,\t0xAD67, 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2,\n\t0xAD6B, 0x74B3, 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6,\t0xAD6F, 0x74B7, 0xAD70, 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB,\n\t0xAD73, 0x74BC, 0xAD74, 0x74BD, 0xAD75, 0x74BE, 0xAD76, 0x74BF,\t0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, 0x74C2, 0xAD7A, 0x74C3,\n\t0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, 0xAD7E, 0x74C7,\t0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, 0x74CB,\n\t0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF,\t0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4,\n\t0xAD8C, 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8,\t0xAD90, 0x74D9, 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD,\n\t0xAD94, 0x74DF, 0xAD95, 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7,\t0xAD98, 0x74E8, 0xAD99, 0x74E9, 0xAD9A, 0x74EA, 0xAD9B, 0x74EB,\n\t0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, 0x74F0, 0xAD9F, 0x74F1,\t0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, 0xAE42, 0x74F8,\n\t0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, 0x74FC,\t0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501,\n\t0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506,\t0xAE4F, 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A,\n\t0xAE53, 0x750B, 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510,\t0xAE57, 0x7512, 0xAE58, 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516,\n\t0xAE5B, 0x7517, 0xAE5C, 0x751B, 0xAE5D, 0x751D, 0xAE5E, 0x751E,\t0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, 0x7522, 0xAE62, 0x7523,\n\t0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, 0xAE66, 0x752A,\t0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, 0x7539,\n\t0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541,\t0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546,\n\t0xAE73, 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D,\t0xAE77, 0x7550, 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553,\n\t0xAE7B, 0x7555, 0xAE7C, 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558,\t0xAE80, 0x755D, 0xAE81, 0x755E, 0xAE82, 0x755F, 0xAE83, 0x7560,\n\t0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, 0x7563, 0xAE87, 0x7564,\t0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, 0xAE8B, 0x756B,\n\t0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, 0x756F,\t0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575,\n\t0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B,\t0xAE98, 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580,\n\t0xAE9C, 0x7581, 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585,\t0xAEA0, 0x7587, 0xAF40, 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A,\n\t0xAF43, 0x758C, 0xAF44, 0x758D, 0xAF45, 0x758E, 0xAF46, 0x7590,\t0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, 0x7598, 0xAF4A, 0x759B,\n\t0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, 0xAF4E, 0x75A6,\t0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, 0x75AA,\n\t0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA,\t0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1,\n\t0xAF5B, 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE,\t0xAF5F, 0x75CF, 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3,\n\t0xAF63, 0x75D7, 0xAF64, 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC,\t0xAF67, 0x75DD, 0xAF68, 0x75DF, 0xAF69, 0x75E0, 0xAF6A, 0x75E1,\n\t0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, 0x75EC, 0xAF6E, 0x75ED,\t0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, 0xAF72, 0x75F3,\n\t0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, 0x75F8,\t0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE,\n\t0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607,\t0xAF80, 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D,\n\t0xAF84, 0x760E, 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612,\t0xAF88, 0x7613, 0xAF89, 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A,\n\t0xAF8C, 0x761C, 0xAF8D, 0x761D, 0xAF8E, 0x761E, 0xAF8F, 0x7621,\t0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, 0x7628, 0xAF93, 0x762C,\n\t0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, 0xAF97, 0x7632,\t0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, 0x763A,\n\t0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642,\t0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647,\n\t0xB043, 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B,\t0xB047, 0x764E, 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651,\n\t0xB04B, 0x7652, 0xB04C, 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657,\t0xB04F, 0x7658, 0xB050, 0x7659, 0xB051, 0x765A, 0xB052, 0x765B,\n\t0xB053, 0x765D, 0xB054, 0x765F, 0xB055, 0x7660, 0xB056, 0x7661,\t0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, 0xB05A, 0x7666,\n\t0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, 0x766A,\t0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670,\n\t0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674,\t0xB067, 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679,\n\t0xB06B, 0x767A, 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680,\t0xB06F, 0x7681, 0xB070, 0x7683, 0xB071, 0x7685, 0xB072, 0x7689,\n\t0xB073, 0x768A, 0xB074, 0x768C, 0xB075, 0x768D, 0xB076, 0x768F,\t0xB077, 0x7690, 0xB078, 0x7692, 0xB079, 0x7694, 0xB07A, 0x7695,\n\t0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, 0xB07E, 0x769B,\t0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, 0x769F,\n\t0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3,\t0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8,\n\t0xB08C, 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC,\t0xB090, 0x76AD, 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3,\n\t0xB094, 0x76B5, 0xB095, 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8,\t0xB098, 0x76B9, 0xB099, 0x76BA, 0xB09A, 0x76BB, 0xB09B, 0x76BC,\n\t0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, 0x76C0, 0xB09F, 0x76C1,\t0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, 0xB0A3, 0x57C3,\n\t0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, 0x54C0,\t0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE,\n\t0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698,\t0xB0B0, 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA,\n\t0xB0B4, 0x6309, 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA,\t0xB0B8, 0x6848, 0xB0B9, 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE,\n\t0xB0BC, 0x51F9, 0xB0BD, 0x6556, 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1,\t0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, 0x5965, 0xB0C3, 0x61CA,\n\t0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, 0xB0C7, 0x6252,\t0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, 0x516B,\n\t0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB,\t0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D,\n\t0xB0D4, 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D,\t0xB0D8, 0x67CF, 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70,\n\t0xB0DC, 0x8D25, 0xB0DD, 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591,\t0xB0E0, 0x73ED, 0xB0E1, 0x642C, 0xB0E2, 0x6273, 0xB0E3, 0x822C,\n\t0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, 0x7248, 0xB0E7, 0x626E,\t0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, 0xB0EB, 0x534A,\n\t0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, 0x5E2E,\t0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1,\n\t0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551,\t0xB0F8, 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE,\n\t0xB0FC, 0x5305, 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4,\t0xB141, 0x76C7, 0xB142, 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC,\n\t0xB145, 0x76D3, 0xB146, 0x76D5, 0xB147, 0x76D9, 0xB148, 0x76DA,\t0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, 0x76DE, 0xB14C, 0x76E0,\n\t0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, 0xB150, 0x76E4,\t0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, 0x76E9,\n\t0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED,\t0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6,\n\t0xB15D, 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD,\t0xB161, 0x76FF, 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703,\n\t0xB165, 0x7705, 0xB166, 0x7706, 0xB167, 0x770A, 0xB168, 0x770C,\t0xB169, 0x770E, 0xB16A, 0x770F, 0xB16B, 0x7710, 0xB16C, 0x7711,\n\t0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, 0x7714, 0xB170, 0x7715,\t0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, 0xB174, 0x771B,\n\t0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, 0x7721,\t0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727,\n\t0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E,\t0xB182, 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733,\n\t0xB186, 0x7734, 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D,\t0xB18A, 0x773E, 0xB18B, 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744,\n\t0xB18E, 0x7745, 0xB18F, 0x7746, 0xB190, 0x7748, 0xB191, 0x7749,\t0xB192, 0x774A, 0xB193, 0x774B, 0xB194, 0x774C, 0xB195, 0x774D,\n\t0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, 0xB199, 0x7753,\t0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, 0x7757,\n\t0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584,\t0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971,\n\t0xB1A6, 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4,\t0xB1AA, 0x8C79, 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F,\n\t0xB1AE, 0x7891, 0xB1AF, 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317,\t0xB1B2, 0x8F88, 0xB1B3, 0x80CC, 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1,\n\t0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, 0x5907, 0xB1B9, 0x60EB,\t0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, 0xB1BD, 0x82EF,\n\t0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, 0x7EF7,\t0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8,\n\t0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119,\t0xB1CA, 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6,\n\t0xB1CE, 0x853D, 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6,\t0xB1D2, 0x5E01, 0xB1D3, 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED,\n\t0xB1D6, 0x655D, 0xB1D7, 0x5F0A, 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F,\t0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, 0x907F, 0xB1DD, 0x965B,\n\t0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, 0xB1E1, 0x8D2C,\t0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, 0x535E,\n\t0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D,\t0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868,\n\t0xB1EE, 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A,\t0xB1F2, 0x5F6C, 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8,\n\t0xB1F6, 0x5BBE, 0xB1F7, 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0,\t0xB1FA, 0x67C4, 0xB1FB, 0x4E19, 0xB1FC, 0x79C9, 0xB1FD, 0x997C,\n\t0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, 0x775E, 0xB242, 0x775F,\t0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, 0xB246, 0x7769,\n\t0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, 0x776F,\t0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773,\n\t0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777,\t0xB253, 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C,\n\t0xB257, 0x7781, 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786,\t0xB25B, 0x7787, 0xB25C, 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A,\n\t0xB25F, 0x778B, 0xB260, 0x778F, 0xB261, 0x7790, 0xB262, 0x7793,\t0xB263, 0x7794, 0xB264, 0x7795, 0xB265, 0x7796, 0xB266, 0x7797,\n\t0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, 0xB26A, 0x779B,\t0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, 0x77A1,\n\t0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8,\t0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF,\n\t0xB277, 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6,\t0xB27B, 0x77B7, 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA,\n\t0xB280, 0x77BC, 0xB281, 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1,\t0xB284, 0x77C2, 0xB285, 0x77C3, 0xB286, 0x77C4, 0xB287, 0x77C5,\n\t0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, 0x77C8, 0xB28B, 0x77C9,\t0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, 0xB28F, 0x77CE,\n\t0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, 0x77D2,\t0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6,\n\t0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD,\t0xB29C, 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1,\n\t0xB2A0, 0x77E4, 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB,\t0xB2A4, 0x83E0, 0xB2A5, 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5,\n\t0xB2A8, 0x6CE2, 0xB2A9, 0x535A, 0xB2AA, 0x52C3, 0xB2AB, 0x640F,\t0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, 0x4F2F, 0xB2AF, 0x5E1B,\n\t0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, 0xB2B3, 0x6E24,\t0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, 0x535C,\n\t0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D,\t0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8,\n\t0xB2C0, 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1,\t0xB2C4, 0x6750, 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C,\n\t0xB2C8, 0x8E29, 0xB2C9, 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC,\t0xB2CC, 0x8521, 0xB2CD, 0x9910, 0xB2CE, 0x53C2, 0xB2CF, 0x8695,\n\t0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, 0x60E8, 0xB2D3, 0x707F,\t0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, 0xB2D7, 0x6CA7,\n\t0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, 0x69FD,\t0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56,\n\t0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42,\t0xB2E4, 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C,\n\t0xB2E8, 0x8336, 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D,\t0xB2EC, 0x5BDF, 0xB2ED, 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7,\n\t0xB2F0, 0x62C6, 0xB2F1, 0x67F4, 0xB2F2, 0x8C7A, 0xB2F3, 0x6400,\t0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, 0x998B, 0xB2F7, 0x8C17,\n\t0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, 0xB2FB, 0x9610,\t0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, 0x77E6,\n\t0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0,\t0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5,\n\t0xB349, 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB,\t0xB34D, 0x77FC, 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805,\n\t0xB351, 0x7806, 0xB352, 0x7807, 0xB353, 0x7808, 0xB354, 0x780A,\t0xB355, 0x780B, 0xB356, 0x780E, 0xB357, 0x780F, 0xB358, 0x7810,\n\t0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, 0x7819, 0xB35C, 0x781B,\t0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, 0xB360, 0x7822,\n\t0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, 0x782B,\t0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832,\n\t0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D,\t0xB36D, 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843,\n\t0xB371, 0x7844, 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849,\t0xB375, 0x784A, 0xB376, 0x784B, 0xB377, 0x784D, 0xB378, 0x784F,\n\t0xB379, 0x7851, 0xB37A, 0x7853, 0xB37B, 0x7854, 0xB37C, 0x7858,\t0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, 0x785B, 0xB381, 0x785C,\n\t0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, 0xB385, 0x7861,\t0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, 0x7865,\n\t0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869,\t0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872,\n\t0xB392, 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876,\t0xB396, 0x7878, 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B,\n\t0xB39A, 0x787D, 0xB39B, 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880,\t0xB39E, 0x7881, 0xB39F, 0x7882, 0xB3A0, 0x7883, 0xB3A1, 0x573A,\n\t0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, 0x957F, 0xB3A5, 0x507F,\t0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, 0xB3A9, 0x7545,\n\t0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, 0x6284,\t0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E,\n\t0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66,\t0xB3B6, 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B,\n\t0xB3BA, 0x6F88, 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0,\t0xB3BE, 0x5C18, 0xB3BF, 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89,\n\t0xB3C2, 0x9648, 0xB3C3, 0x8D81, 0xB3C4, 0x886C, 0xB3C5, 0x6491,\t0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, 0x6A59, 0xB3C9, 0x6210,\n\t0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, 0xB3CD, 0x60E9,\t0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, 0x901E,\n\t0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4,\t0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF,\n\t0xB3DA, 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F,\t0xB3DE, 0x4F88, 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5,\n\t0xB3E2, 0x65A5, 0xB3E3, 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2,\t0xB3E6, 0x866B, 0xB3E7, 0x5D07, 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD,\n\t0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, 0x8E0C, 0xB3ED, 0x7A20,\t0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, 0xB3F1, 0x7EF8,\n\t0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, 0x521D,\t0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87,\n\t0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664,\t0xB3FE, 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886,\n\t0xB443, 0x7888, 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F,\t0xB447, 0x7890, 0xB448, 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895,\n\t0xB44B, 0x7896, 0xB44C, 0x7899, 0xB44D, 0x789D, 0xB44E, 0x789E,\t0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, 0x78A4, 0xB452, 0x78A6,\n\t0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, 0xB456, 0x78AB,\t0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, 0x78AF,\n\t0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8,\t0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD,\n\t0xB463, 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3,\t0xB467, 0x78C4, 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8,\n\t0xB46B, 0x78CC, 0xB46C, 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF,\t0xB46F, 0x78D1, 0xB470, 0x78D2, 0xB471, 0x78D3, 0xB472, 0x78D6,\n\t0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, 0x78DA, 0xB476, 0x78DB,\t0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, 0xB47A, 0x78DF,\n\t0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, 0x78E3,\t0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7,\n\t0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED,\t0xB488, 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1,\n\t0xB48C, 0x78F3, 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8,\t0xB490, 0x78F9, 0xB491, 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD,\n\t0xB494, 0x78FE, 0xB495, 0x78FF, 0xB496, 0x7900, 0xB497, 0x7902,\t0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, 0x7906, 0xB49B, 0x7907,\n\t0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, 0xB49F, 0x790B,\t0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, 0x77D7,\n\t0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3,\t0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20,\n\t0xB4AC, 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE,\t0xB4B0, 0x7A97, 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF,\n\t0xB4B4, 0x521B, 0xB4B5, 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376,\t0xB4B8, 0x9524, 0xB4B9, 0x5782, 0xB4BA, 0x6625, 0xB4BB, 0x693F,\n\t0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, 0x6DF3, 0xB4BF, 0x7EAF,\t0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, 0xB4C3, 0x75B5,\n\t0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, 0x8F9E,\t0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64,\n\t0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A,\t0xB4D0, 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE,\n\t0xB4D4, 0x4E1B, 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B,\t0xB4D8, 0x7C07, 0xB4D9, 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1,\n\t0xB4DC, 0x7A9C, 0xB4DD, 0x6467, 0xB4DE, 0x5D14, 0xB4DF, 0x50AC,\t0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, 0x7CB9, 0xB4E3, 0x6DEC,\n\t0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, 0xB4E7, 0x5BF8,\t0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, 0x63AA,\n\t0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE,\t0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927,\n\t0xB4F4, 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234,\t0xB4F8, 0x5E26, 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37,\n\t0xB4FC, 0x888B, 0xB4FD, 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D,\t0xB541, 0x790E, 0xB542, 0x790F, 0xB543, 0x7910, 0xB544, 0x7911,\n\t0xB545, 0x7912, 0xB546, 0x7914, 0xB547, 0x7915, 0xB548, 0x7916,\t0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, 0xB54C, 0x791A,\n\t0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, 0x791F,\t0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923,\n\t0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928,\t0xB559, 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C,\n\t0xB55D, 0x792D, 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930,\t0xB561, 0x7931, 0xB562, 0x7932, 0xB563, 0x7933, 0xB564, 0x7935,\n\t0xB565, 0x7936, 0xB566, 0x7937, 0xB567, 0x7938, 0xB568, 0x7939,\t0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, 0x7942, 0xB56C, 0x7943,\n\t0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, 0xB570, 0x794A,\t0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, 0x794E,\n\t0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952,\t0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959,\n\t0xB57D, 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966,\t0xB582, 0x7969, 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C,\n\t0xB586, 0x796E, 0xB587, 0x7970, 0xB588, 0x7971, 0xB589, 0x7972,\t0xB58A, 0x7973, 0xB58B, 0x7974, 0xB58C, 0x7975, 0xB58D, 0x7976,\n\t0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, 0x797C, 0xB591, 0x797D,\t0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, 0xB595, 0x7983,\n\t0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, 0x7989,\t0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E,\n\t0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020,\t0xB5A2, 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355,\n\t0xB5A6, 0x90F8, 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6,\t0xB5AA, 0x6C2E, 0xB5AB, 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1,\n\t0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, 0xB5B0, 0x86CB, 0xB5B1, 0x5F53,\t0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, 0x8361, 0xB5B5, 0x6863,\n\t0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, 0xB5B9, 0x5012,\t0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, 0x5230,\n\t0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7,\t0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C,\n\t0xB5C6, 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA,\t0xB5CA, 0x51F3, 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E,\n\t0xB5CE, 0x6EF4, 0xB5CF, 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B,\t0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1,\n\t0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, 0x5730, 0xB5D9, 0x8482,\t0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, 0xB5DD, 0x9012,\n\t0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, 0x6EC7,\t0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B,\n\t0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538,\t0xB5EA, 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0,\n\t0xB5EE, 0x6BBF, 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5,\t0xB5F2, 0x51CB, 0xB5F3, 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A,\n\t0xB5F6, 0x9493, 0xB5F7, 0x8C03, 0xB5F8, 0x8DCC, 0xB5F9, 0x7239,\t0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, 0x8FED, 0xB5FD, 0x8C0D,\n\t0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, 0xB642, 0x7995,\t0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, 0x7999,\n\t0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E,\t0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2,\n\t0xB64F, 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6,\t0xB653, 0x79A8, 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB,\n\t0xB657, 0x79AC, 0xB658, 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF,\t0xB65B, 0x79B0, 0xB65C, 0x79B1, 0xB65D, 0x79B2, 0xB65E, 0x79B4,\n\t0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, 0x79B7, 0xB662, 0x79B8,\t0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, 0xB666, 0x79C4,\n\t0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, 0x79CA,\t0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0,\n\t0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7,\t0xB673, 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC,\n\t0xB677, 0x79DD, 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1,\t0xB67B, 0x79E2, 0xB67C, 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA,\n\t0xB680, 0x79EC, 0xB681, 0x79EE, 0xB682, 0x79F1, 0xB683, 0x79F2,\t0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, 0x79F5, 0xB687, 0x79F6,\n\t0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, 0xB68B, 0x79FC,\t0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, 0x7A04,\n\t0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09,\t0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10,\n\t0xB698, 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15,\t0xB69C, 0x7A16, 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B,\n\t0xB6A0, 0x7A1C, 0xB6A1, 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE,\t0xB6A4, 0x9489, 0xB6A5, 0x9876, 0xB6A6, 0x9F0E, 0xB6A7, 0x952D,\n\t0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, 0x4E22, 0xB6AB, 0x4E1C,\t0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, 0xB6AF, 0x52A8,\n\t0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, 0x51BB,\t0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597,\n\t0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8,\t0xB6BC, 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A,\n\t0xB6C0, 0x72EC, 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779,\t0xB6C4, 0x8D4C, 0xB6C5, 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A,\n\t0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, 0xB6CA, 0x5992, 0xB6CB, 0x7AEF,\t0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, 0x6BB5, 0xB6CF, 0x65AD,\n\t0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, 0xB6D3, 0x961F,\t0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, 0x8E72,\n\t0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D,\t0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6,\n\t0xB6E0, 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2,\t0xB6E4, 0x6735, 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241,\n\t0xB6E8, 0x60F0, 0xB6E9, 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8,\t0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, 0xB6EE, 0x989D, 0xB6EF, 0x8BB9,\n\t0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, 0x5384, 0xB6F3, 0x627C,\t0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, 0xB6F7, 0x6069,\n\t0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, 0x5C14,\t0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D,\n\t0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24,\t0xB745, 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28,\n\t0xB749, 0x7A29, 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C,\t0xB74D, 0x7A2D, 0xB74E, 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30,\n\t0xB751, 0x7A31, 0xB752, 0x7A32, 0xB753, 0x7A34, 0xB754, 0x7A35,\t0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, 0x7A3A, 0xB758, 0x7A3E,\n\t0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, 0xB75C, 0x7A43,\t0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, 0x7A48,\n\t0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C,\t0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50,\n\t0xB769, 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55,\t0xB76D, 0x7A56, 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A,\n\t0xB771, 0x7A5B, 0xB772, 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E,\t0xB775, 0x7A5F, 0xB776, 0x7A60, 0xB777, 0x7A61, 0xB778, 0x7A62,\n\t0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, 0x7A65, 0xB77C, 0x7A66,\t0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, 0xB781, 0x7A6A,\n\t0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, 0x7A6E,\t0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73,\n\t0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D,\t0xB78E, 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87,\n\t0xB792, 0x7A89, 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C,\t0xB796, 0x7A8E, 0xB797, 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93,\n\t0xB79A, 0x7A94, 0xB79B, 0x7A99, 0xB79C, 0x7A9A, 0xB79D, 0x7A9B,\t0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, 0x7AA2, 0xB7A1, 0x8D30,\n\t0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, 0xB7A5, 0x4F10,\t0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, 0x73D0,\n\t0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB,\t0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41,\n\t0xB7B2, 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4,\t0xB7B6, 0x8303, 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D,\n\t0xB7BA, 0x6CDB, 0xB7BB, 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9,\t0xB7BE, 0x80AA, 0xB7BF, 0x623F, 0xB7C0, 0x9632, 0xB7C1, 0x59A8,\n\t0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, 0x7EBA, 0xB7C5, 0x653E,\t0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, 0xB7C9, 0x98DE,\n\t0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, 0x5420,\t0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39,\n\t0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B,\t0xB7D6, 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A,\n\t0xB7DA, 0x6C7E, 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD,\t0xB7DE, 0x5FFF, 0xB7DF, 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30,\n\t0xB7E2, 0x5C01, 0xB7E3, 0x67AB, 0xB7E4, 0x8702, 0xB7E5, 0x5CF0,\t0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, 0x75AF, 0xB7E9, 0x70FD,\n\t0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, 0xB7ED, 0x8BBD,\t0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, 0x5426,\n\t0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75,\t0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45,\n\t0xB7FA, 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8,\t0xB7FE, 0x670D, 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7,\n\t0xB843, 0x7AA9, 0xB844, 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE,\t0xB847, 0x7AAF, 0xB848, 0x7AB0, 0xB849, 0x7AB1, 0xB84A, 0x7AB2,\n\t0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, 0x7AB6, 0xB84E, 0x7AB7,\t0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, 0xB852, 0x7ABB,\n\t0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, 0x7AC0,\t0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4,\n\t0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8,\t0xB85F, 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD,\n\t0xB863, 0x7ACE, 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1,\t0xB867, 0x7AD2, 0xB868, 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5,\n\t0xB86B, 0x7AD7, 0xB86C, 0x7AD8, 0xB86D, 0x7ADA, 0xB86E, 0x7ADB,\t0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, 0x7AE1, 0xB872, 0x7AE2,\n\t0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, 0xB876, 0x7AE9,\t0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, 0x7AEE,\n\t0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3,\t0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7,\n\t0xB884, 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE,\t0xB888, 0x7B00, 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05,\n\t0xB88C, 0x7B07, 0xB88D, 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D,\t0xB890, 0x7B0E, 0xB891, 0x7B10, 0xB892, 0x7B12, 0xB893, 0x7B13,\n\t0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, 0x7B18, 0xB897, 0x7B1A,\t0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, 0xB89B, 0x7B21,\n\t0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, 0x7B29,\t0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F,\n\t0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A,\t0xB8A8, 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7,\n\t0xB8AC, 0x812F, 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150,\t0xB8B0, 0x8D74, 0xB8B1, 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B,\n\t0xB8B4, 0x590D, 0xB8B5, 0x5085, 0xB8B6, 0x4ED8, 0xB8B7, 0x961C,\t0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, 0x8D1F, 0xB8BB, 0x5BCC,\n\t0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, 0xB8BF, 0x7F1A,\t0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, 0x8BE5,\n\t0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6,\t0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746,\n\t0xB8CC, 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76,\t0xB8D0, 0x611F, 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63,\n\t0xB8D4, 0x5188, 0xB8D5, 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38,\t0xB8D8, 0x809B, 0xB8D9, 0x7EB2, 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F,\n\t0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, 0x768B, 0xB8DF, 0x9AD8,\t0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, 0xB8E3, 0x641E,\n\t0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, 0x54E5,\t0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D,\n\t0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769,\t0xB8F0, 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601,\n\t0xB8F4, 0x9694, 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404,\t0xB8F8, 0x7ED9, 0xB8F9, 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015,\n\t0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, 0xB8FE, 0x7FB9, 0xB940, 0x7B2F,\t0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, 0x7B34, 0xB944, 0x7B35,\n\t0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, 0xB948, 0x7B3B,\t0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, 0x7B41,\n\t0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46,\t0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E,\n\t0xB955, 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59,\t0xB959, 0x7B5C, 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61,\n\t0xB95D, 0x7B63, 0xB95E, 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66,\t0xB961, 0x7B67, 0xB962, 0x7B68, 0xB963, 0x7B69, 0xB964, 0x7B6A,\n\t0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, 0x7B6D, 0xB968, 0x7B6F,\t0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, 0xB96C, 0x7B76,\n\t0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, 0x7B7D,\t0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83,\n\t0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88,\t0xB979, 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C,\n\t0xB97D, 0x7B8E, 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92,\t0xB982, 0x7B93, 0xB983, 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99,\n\t0xB986, 0x7B9A, 0xB987, 0x7B9B, 0xB988, 0x7B9E, 0xB989, 0x7B9F,\t0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, 0x7BA4, 0xB98D, 0x7BA5,\n\t0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, 0xB991, 0x7BB2,\t0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, 0x7BB7,\n\t0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC,\t0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0,\n\t0xB99E, 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2,\t0xB9A2, 0x803F, 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B,\n\t0xB9A6, 0x529F, 0xB9A7, 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B,\t0xB9AA, 0x8EAC, 0xB9AB, 0x516C, 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13,\n\t0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, 0x62F1, 0xB9B1, 0x8D21,\t0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, 0xB9B5, 0x6C9F,\n\t0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, 0x6784,\t0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7,\n\t0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD,\t0xB9C2, 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4,\n\t0xB9C6, 0x86CA, 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1,\t0xB9CA, 0x6545, 0xB9CB, 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7,\n\t0xB9CE, 0x522E, 0xB9CF, 0x74DC, 0xB9D0, 0x5250, 0xB9D1, 0x5BE1,\t0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, 0x4E56, 0xB9D5, 0x62D0,\n\t0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, 0xB9D9, 0x5B98,\t0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, 0x9986,\n\t0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F,\t0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470,\n\t0xB9E6, 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52,\t0xB9EA, 0x9F9F, 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C,\n\t0xB9EE, 0x8BE1, 0xB9EF, 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC,\t0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, 0xB9F4, 0x523D, 0xB9F5, 0x8F8A,\n\t0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, 0x9505, 0xB9F9, 0x90ED,\t0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, 0xB9FD, 0x8FC7,\n\t0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, 0x7BC9,\t0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE,\n\t0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4,\t0xBA4B, 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8,\n\t0xBA4F, 0x7BDB, 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF,\t0xBA53, 0x7BE0, 0xBA54, 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4,\n\t0xBA57, 0x7BE7, 0xBA58, 0x7BE8, 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB,\t0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, 0x7BEF, 0xBA5E, 0x7BF0,\n\t0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, 0xBA62, 0x7BF5,\t0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, 0x7BFA,\n\t0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00,\t0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04,\n\t0xBA6F, 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09,\t0xBA73, 0x7C0A, 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10,\n\t0xBA77, 0x7C11, 0xBA78, 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14,\t0xBA7B, 0x7C15, 0xBA7C, 0x7C17, 0xBA7D, 0x7C18, 0xBA7E, 0x7C19,\n\t0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, 0x7C1C, 0xBA83, 0x7C1D,\t0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, 0xBA87, 0x7C22,\n\t0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, 0x7C28,\t0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D,\n\t0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31,\t0xBA94, 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35,\n\t0xBA98, 0x7C36, 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A,\t0xBA9C, 0x7C3B, 0xBA9D, 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E,\n\t0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, 0xBAA2, 0x5B69, 0xBAA3, 0x6D77,\t0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, 0x5BB3, 0xBAA7, 0x9A87,\n\t0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, 0xBAAB, 0x97E9,\t0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, 0x51FD,\n\t0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC,\t0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D,\n\t0xBAB8, 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F,\t0xBABC, 0x676D, 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E,\n\t0xBAC0, 0x8C6A, 0xBAC1, 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D,\t0xBAC4, 0x8017, 0xBAC5, 0x53F7, 0xBAC6, 0x6D69, 0xBAC7, 0x5475,\n\t0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, 0x83CF, 0xBACB, 0x6838,\t0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, 0xBACF, 0x5408,\n\t0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, 0x6CB3,\t0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64,\n\t0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5,\t0xBADC, 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC,\n\t0xBAE0, 0x4EA8, 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052,\t0xBAE4, 0x8F70, 0xBAE5, 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679,\n\t0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18,\t0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, 0x4FAF, 0xBAEF, 0x7334,\n\t0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, 0xBAF3, 0x540E,\t0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, 0x745A,\n\t0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774,\t0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43,\n\t0xBB41, 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47,\t0xBB45, 0x7C48, 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B,\n\t0xBB49, 0x7C4C, 0xBB4A, 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50,\t0xBB4D, 0x7C51, 0xBB4E, 0x7C52, 0xBB4F, 0x7C53, 0xBB50, 0x7C54,\n\t0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, 0x7C57, 0xBB54, 0x7C58,\t0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, 0xBB58, 0x7C5C,\n\t0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, 0x7C60,\t0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64,\n\t0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68,\t0xBB65, 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C,\n\t0xBB69, 0x7C6D, 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70,\t0xBB6D, 0x7C71, 0xBB6E, 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76,\n\t0xBB71, 0x7C77, 0xBB72, 0x7C78, 0xBB73, 0x7C79, 0xBB74, 0x7C7A,\t0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, 0x7C80, 0xBB78, 0x7C81,\n\t0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, 0xBB7C, 0x7C85,\t0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, 0x7C8A,\n\t0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E,\t0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94,\n\t0xBB8A, 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B,\t0xBB8E, 0x7CA0, 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6,\n\t0xBB92, 0x7CA7, 0xBB93, 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB,\t0xBB96, 0x7CAC, 0xBB97, 0x7CAD, 0xBB98, 0x7CAF, 0xBB99, 0x7CB0,\n\t0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, 0x7CB6, 0xBB9D, 0x7CB7,\t0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, 0xBBA1, 0x5F27,\n\t0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, 0x4E92,\t0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7,\n\t0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B,\t0xBBAE, 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0,\n\t0xBBB2, 0x5F8A, 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F,\t0xBBB6, 0x6B22, 0xBBB7, 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8,\n\t0xBBBA, 0x7F13, 0xBBBB, 0x6362, 0xBBBC, 0x60A3, 0xBBBD, 0x5524,\t0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, 0x7115, 0xBBC1, 0x6DA3,\n\t0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, 0xBBC5, 0x614C,\t0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, 0x7C27,\n\t0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C,\t0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E,\n\t0xBBD2, 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD,\t0xBBD6, 0x6062, 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1,\n\t0xBBDA, 0x6094, 0xBBDB, 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0,\t0xBBDE, 0x6666, 0xBBDF, 0x8D3F, 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A,\n\t0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, 0x8BB3, 0xBBE5, 0x8BF2,\t0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, 0xBBE9, 0x5A5A,\n\t0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, 0x8C41,\t0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7,\n\t0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27,\t0xBBF6, 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA,\n\t0xBBFA, 0x673A, 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF,\t0xBBFE, 0x7B95, 0xBC40, 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2,\n\t0xBC43, 0x7CC3, 0xBC44, 0x7CC4, 0xBC45, 0x7CC6, 0xBC46, 0x7CC9,\t0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, 0x7CCF, 0xBC4A, 0x7CD0,\n\t0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, 0xBC4E, 0x7CD4,\t0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, 0x7CDD,\n\t0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3,\t0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7,\n\t0xBC5B, 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC,\t0xBC5F, 0x7CED, 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1,\n\t0xBC63, 0x7CF2, 0xBC64, 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5,\t0xBC67, 0x7CF6, 0xBC68, 0x7CF7, 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA,\n\t0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, 0x7CFE, 0xBC6E, 0x7CFF,\t0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, 0xBC72, 0x7D03,\n\t0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, 0x7D07,\t0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C,\n\t0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10,\t0xBC80, 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14,\n\t0xBC84, 0x7D15, 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18,\t0xBC88, 0x7D19, 0xBC89, 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C,\n\t0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21,\t0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, 0x7D25, 0xBC93, 0x7D26,\n\t0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, 0xBC97, 0x7D2C,\t0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, 0x7D31,\n\t0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35,\t0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9,\n\t0xBCA4, 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC,\t0xBCA8, 0x7EE9, 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781,\n\t0xBCAC, 0x68D8, 0xBCAD, 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6,\t0xBCB0, 0x53CA, 0xBCB1, 0x6025, 0xBCB2, 0x75BE, 0xBCB3, 0x6C72,\n\t0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, 0x7EA7, 0xBCB7, 0x6324,\t0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, 0xBCBB, 0x84DF,\n\t0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, 0x4F0E,\t0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E,\n\t0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0,\t0xBCC8, 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993,\n\t0xBCCC, 0x7EE7, 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7,\t0xBCD0, 0x5939, 0xBCD1, 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0,\n\t0xBCD4, 0x835A, 0xBCD5, 0x988A, 0xBCD6, 0x8D3E, 0xBCD7, 0x7532,\t0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, 0x7A3C, 0xBCDB, 0x4EF7,\n\t0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, 0xBCDF, 0x6B7C,\t0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, 0x7B3A,\n\t0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9,\t0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327,\n\t0xBCEC, 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877,\t0xBCF0, 0x62E3, 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED,\n\t0xBCF4, 0x526A, 0xBCF5, 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB,\t0xBCF8, 0x9274, 0xBCF9, 0x8DF5, 0xBCFA, 0x8D31, 0xBCFB, 0x89C1,\n\t0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, 0x4EF6, 0xBD40, 0x7D37,\t0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, 0xBD44, 0x7D3B,\n\t0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, 0x7D3F,\t0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43,\n\t0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47,\t0xBD51, 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B,\n\t0xBD55, 0x7D4C, 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F,\t0xBD59, 0x7D50, 0xBD5A, 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53,\n\t0xBD5D, 0x7D54, 0xBD5E, 0x7D55, 0xBD5F, 0x7D56, 0xBD60, 0x7D57,\t0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, 0x7D5A, 0xBD64, 0x7D5B,\n\t0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, 0xBD68, 0x7D5F,\t0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, 0x7D63,\n\t0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67,\t0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B,\n\t0xBD75, 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70,\t0xBD79, 0x7D71, 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74,\n\t0xBD7D, 0x7D75, 0xBD7E, 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79,\t0xBD82, 0x7D7A, 0xBD83, 0x7D7B, 0xBD84, 0x7D7C, 0xBD85, 0x7D7D,\n\t0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, 0x7D80, 0xBD89, 0x7D81,\t0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, 0xBD8D, 0x7D85,\n\t0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, 0x7D89,\t0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D,\n\t0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91,\t0xBD9A, 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95,\n\t0xBD9E, 0x7D96, 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065,\t0xBDA2, 0x8230, 0xBDA3, 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10,\n\t0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5,\t0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, 0x6D46, 0xBDAD, 0x6C5F,\n\t0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, 0xBDB1, 0x5956,\t0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, 0x964D,\n\t0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126,\t0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47,\n\t0xBDBE, 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405,\t0xBDC2, 0x94F0, 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A,\n\t0xBDC6, 0x72E1, 0xBDC7, 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34,\t0xBDCA, 0x7EDE, 0xBDCB, 0x527F, 0xBDCC, 0x6559, 0xBDCD, 0x9175,\n\t0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, 0x53EB, 0xBDD1, 0x7A96,\t0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, 0xBDD5, 0x79F8,\n\t0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, 0x52AB,\t0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377,\n\t0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3,\t0xBDE2, 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9,\n\t0xBDE6, 0x82A5, 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB,\t0xBDEA, 0x75A5, 0xBDEB, 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE,\n\t0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA,\t0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, 0x7D27, 0xBDF5, 0x9526,\n\t0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, 0xBDF9, 0x9773,\t0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, 0x70EC,\n\t0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B,\t0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F,\n\t0xBE47, 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3,\t0xBE4B, 0x7DA4, 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8,\n\t0xBE4F, 0x7DA9, 0xBE50, 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC,\t0xBE53, 0x7DAD, 0xBE54, 0x7DAF, 0xBE55, 0x7DB0, 0xBE56, 0x7DB1,\n\t0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, 0x7DB4, 0xBE5A, 0x7DB5,\t0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, 0xBE5E, 0x7DB9,\n\t0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, 0x7DBD,\t0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1,\n\t0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5,\t0xBE6B, 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9,\n\t0xBE6F, 0x7DCA, 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD,\t0xBE73, 0x7DCE, 0xBE74, 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1,\n\t0xBE77, 0x7DD2, 0xBE78, 0x7DD3, 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5,\t0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, 0x7DD8, 0xBE7E, 0x7DD9,\n\t0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, 0xBE83, 0x7DDD,\t0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, 0x7DE1,\n\t0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5,\t0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9,\n\t0xBE90, 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED,\t0xBE94, 0x7DEE, 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1,\n\t0xBE98, 0x7DF2, 0xBE99, 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5,\t0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9,\n\t0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, 0x52B2, 0xBEA3, 0x8346,\t0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, 0xBEA7, 0x6676,\n\t0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, 0x7CBE,\t0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66,\n\t0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883,\t0xBEB4, 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9,\n\t0xBEB8, 0x9756, 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0,\t0xBEBC, 0x70AF, 0xBEBD, 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76,\n\t0xBEC0, 0x7EA0, 0xBEC1, 0x7396, 0xBEC2, 0x97ED, 0xBEC3, 0x4E45,\t0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, 0x9152, 0xBEC7, 0x53A9,\n\t0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, 0xBECB, 0x8205,\t0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, 0x97A0,\n\t0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45,\t0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480,\n\t0xBED8, 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A,\t0xBEDC, 0x62D2, 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177,\n\t0xBEE0, 0x8DDD, 0xBEE1, 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1,\t0xBEE4, 0x53E5, 0xBEE5, 0x60E7, 0xBEE6, 0x70AC, 0xBEE7, 0x5267,\n\t0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, 0x5A1F, 0xBEEB, 0x5026,\t0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, 0xBEEF, 0x6485,\n\t0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, 0x5014,\t0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0,\n\t0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7,\t0xBEFC, 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB,\n\t0xBF41, 0x7DFC, 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF,\t0xBF45, 0x7E00, 0xBF46, 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03,\n\t0xBF49, 0x7E04, 0xBF4A, 0x7E05, 0xBF4B, 0x7E06, 0xBF4C, 0x7E07,\t0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, 0x7E0A, 0xBF50, 0x7E0B,\n\t0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, 0xBF54, 0x7E0F,\t0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, 0x7E13,\n\t0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17,\t0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B,\n\t0xBF61, 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F,\t0xBF65, 0x7E20, 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23,\n\t0xBF69, 0x7E24, 0xBF6A, 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27,\t0xBF6D, 0x7E28, 0xBF6E, 0x7E29, 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B,\n\t0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, 0x7E2E, 0xBF74, 0x7E2F,\t0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, 0xBF78, 0x7E33,\n\t0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, 0x7E37,\t0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C,\n\t0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40,\t0xBF86, 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45,\n\t0xBF8A, 0x7E46, 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A,\t0xBF8E, 0x7E4B, 0xBF8F, 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E,\n\t0xBF92, 0x7E4F, 0xBF93, 0x7E50, 0xBF94, 0x7E51, 0xBF95, 0x7E52,\t0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, 0x7E55, 0xBF99, 0x7E56,\n\t0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, 0xBF9D, 0x7E5A,\t0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, 0x4FCA,\n\t0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F,\t0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF,\n\t0xBFAA, 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF,\t0xBFAE, 0x6168, 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8,\n\t0xBFB2, 0x574E, 0xBFB3, 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7,\t0xBFB6, 0x6177, 0xBFB7, 0x7CE0, 0xBFB8, 0x625B, 0xBFB9, 0x6297,\n\t0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, 0x8003, 0xBFBD, 0x62F7,\t0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, 0xBFC1, 0x82DB,\n\t0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, 0x9897,\t0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF,\n\t0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2,\t0xBFCE, 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6,\n\t0xBFD2, 0x6073, 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A,\t0xBFD6, 0x6050, 0xBFD7, 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0,\n\t0xBFDA, 0x53E3, 0xBFDB, 0x6263, 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF,\t0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, 0x82E6, 0xBFE1, 0x9177,\n\t0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, 0xBFE5, 0x57AE,\t0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, 0x5757,\n\t0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD,\t0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2,\n\t0xBFF2, 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7,\t0xBFF6, 0x51B5, 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF,\n\t0xBFFA, 0x7AA5, 0xBFFB, 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41,\t0xBFFE, 0x5080, 0xC040, 0x7E5E, 0xC041, 0x7E5F, 0xC042, 0x7E60,\n\t0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, 0x7E63, 0xC046, 0x7E64,\t0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, 0xC04A, 0x7E68,\n\t0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, 0x7E6C,\t0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70,\n\t0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74,\t0xC057, 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78,\n\t0xC05B, 0x7E79, 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C,\t0xC05F, 0x7E7D, 0xC060, 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80,\n\t0xC063, 0x7E81, 0xC064, 0x7E83, 0xC065, 0x7E84, 0xC066, 0x7E85,\t0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, 0x7E88, 0xC06A, 0x7E89,\n\t0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, 0xC06E, 0x7E8D,\t0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, 0x7E91,\n\t0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95,\t0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99,\n\t0xC07B, 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E,\t0xC080, 0x7EAE, 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC,\n\t0xC084, 0x7ED6, 0xC085, 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9,\t0xC088, 0x7F0A, 0xC089, 0x7F10, 0xC08A, 0x7F1E, 0xC08B, 0x7F37,\n\t0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, 0x7F3C, 0xC08F, 0x7F3D,\t0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, 0xC093, 0x7F41,\n\t0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, 0x7F48,\t0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C,\n\t0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52,\t0xC0A0, 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83,\n\t0xC0A4, 0x5764, 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0,\t0xC0A8, 0x62EC, 0xC0A9, 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614,\n\t0xC0AC, 0x5783, 0xC0AD, 0x62C9, 0xC0AE, 0x5587, 0xC0AF, 0x8721,\t0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, 0x5566, 0xC0B3, 0x83B1,\n\t0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, 0xC0B7, 0x5A6A,\t0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, 0x9611,\n\t0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD,\t0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2,\n\t0xC0C4, 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC,\t0xC0C8, 0x5ECA, 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A,\n\t0xC0CC, 0x635E, 0xC0CD, 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001,\t0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, 0xC0D2, 0x916A, 0xC0D3, 0x70D9,\n\t0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, 0x4E50, 0xC0D7, 0x96F7,\t0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, 0xC0DB, 0x7D2F,\n\t0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, 0x808B,\t0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E,\n\t0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281,\t0xC0E8, 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB,\n\t0xC0EC, 0x6F13, 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC,\t0xC0F0, 0x9CA4, 0xC0F1, 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354,\n\t0xC0F4, 0x540F, 0xC0F5, 0x6817, 0xC0F6, 0x4E3D, 0xC0F7, 0x5389,\t0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, 0x5386, 0xC0FB, 0x5229,\n\t0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, 0xC140, 0x7F56,\t0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, 0x7F5D,\n\t0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64,\t0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B,\n\t0xC14D, 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70,\t0xC151, 0x7F73, 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77,\n\t0xC155, 0x7F78, 0xC156, 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C,\t0xC159, 0x7F7D, 0xC15A, 0x7F7F, 0xC15B, 0x7F80, 0xC15C, 0x7F82,\n\t0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, 0x7F85, 0xC160, 0x7F86,\t0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, 0xC164, 0x7F8B,\n\t0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, 0x7F91,\t0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96,\n\t0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B,\t0xC171, 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3,\n\t0xC175, 0x7FA5, 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9,\t0xC179, 0x7FAA, 0xC17A, 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD,\n\t0xC17D, 0x7FAE, 0xC17E, 0x7FB1, 0xC180, 0x7FB3, 0xC181, 0x7FB4,\t0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, 0x7FB7, 0xC185, 0x7FBA,\n\t0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, 0xC189, 0x7FC2,\t0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, 0x7FC7,\n\t0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD,\t0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2,\n\t0xC196, 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9,\t0xC19A, 0x7FDA, 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD,\n\t0xC19E, 0x7FDE, 0xC19F, 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2,\t0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6,\n\t0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, 0x54E9, 0xC1A9, 0x4FE9,\t0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, 0xC1AD, 0x9570,\n\t0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, 0x5E18,\t0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B,\n\t0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9,\t0xC1BA, 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24,\n\t0xC1BE, 0x8F86, 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE,\t0xC1C2, 0x8C05, 0xC1C3, 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA,\n\t0xC1C6, 0x7597, 0xC1C7, 0x71CE, 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD,\t0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, 0x6482, 0xC1CD, 0x9563,\n\t0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, 0xC1D1, 0x88C2,\t0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, 0x7433,\n\t0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34,\t0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB,\n\t0xC1DE, 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2,\t0xC1E2, 0x83F1, 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3,\n\t0xC1E6, 0x4F36, 0xC1E7, 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075,\t0xC1EA, 0x9675, 0xC1EB, 0x5CAD, 0xC1EC, 0x9886, 0xC1ED, 0x53E6,\n\t0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, 0x7409, 0xC1F1, 0x69B4,\t0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, 0xC1F5, 0x5218,\n\t0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, 0x516D,\t0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C,\n\t0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8,\t0xC243, 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED,\n\t0xC247, 0x7FEF, 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5,\t0xC24B, 0x7FF6, 0xC24C, 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9,\n\t0xC24F, 0x7FFA, 0xC250, 0x7FFD, 0xC251, 0x7FFE, 0xC252, 0x7FFF,\t0xC253, 0x8002, 0xC254, 0x8007, 0xC255, 0x8008, 0xC256, 0x8009,\n\t0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, 0xC25A, 0x8011,\t0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, 0x801D,\n\t0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023,\t0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D,\n\t0xC267, 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032,\t0xC26B, 0x8034, 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C,\n\t0xC26F, 0x803E, 0xC270, 0x8040, 0xC271, 0x8041, 0xC272, 0x8044,\t0xC273, 0x8045, 0xC274, 0x8047, 0xC275, 0x8048, 0xC276, 0x8049,\n\t0xC277, 0x804E, 0xC278, 0x804F, 0xC279, 0x8050, 0xC27A, 0x8051,\t0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, 0xC27E, 0x8057,\n\t0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, 0x805D,\t0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061,\n\t0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065,\t0xC28C, 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B,\n\t0xC290, 0x806C, 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F,\t0xC294, 0x8070, 0xC295, 0x8072, 0xC296, 0x8073, 0xC297, 0x8074,\n\t0xC298, 0x8075, 0xC299, 0x8076, 0xC29A, 0x8077, 0xC29B, 0x8078,\t0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, 0x807B, 0xC29F, 0x807C,\n\t0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, 0xC2A3, 0x62E2,\t0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, 0x6402,\n\t0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6,\t0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089,\n\t0xC2B0, 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81,\t0xC2B4, 0x9E93, 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF,\n\t0xC2B8, 0x8D42, 0xC2B9, 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984,\t0xC2BC, 0x5F55, 0xC2BD, 0x9646, 0xC2BE, 0x622E, 0xC2BF, 0x9A74,\n\t0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, 0x4FA3, 0xC2C3, 0x65C5,\t0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, 0xC2C7, 0x8651,\n\t0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, 0x6EE4,\t0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A,\n\t0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0,\t0xC2D4, 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26,\n\t0xC2D8, 0x4ED1, 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA,\t0xC2DC, 0x841D, 0xC2DD, 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B,\n\t0xC2E0, 0x9523, 0xC2E1, 0x7BA9, 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8,\t0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, 0x9A86, 0xC2E7, 0x7EDC,\n\t0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, 0xC2EB, 0x7801,\t0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, 0x561B,\n\t0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6,\t0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792,\n\t0xC2F8, 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513,\t0xC2FC, 0x66FC, 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E,\n\t0xC341, 0x8081, 0xC342, 0x8082, 0xC343, 0x8085, 0xC344, 0x8088,\t0xC345, 0x808A, 0xC346, 0x808D, 0xC347, 0x808E, 0xC348, 0x808F,\n\t0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, 0x8092, 0xC34C, 0x8094,\t0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, 0xC350, 0x809E,\n\t0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, 0x80A8,\t0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5,\n\t0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB,\t0xC35D, 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9,\n\t0xC361, 0x80CA, 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0,\t0xC365, 0x80D1, 0xC366, 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4,\n\t0xC369, 0x80D5, 0xC36A, 0x80D8, 0xC36B, 0x80DF, 0xC36C, 0x80E0,\t0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, 0x80E6, 0xC370, 0x80EE,\n\t0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, 0xC374, 0x80FB,\t0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, 0x8101,\n\t0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107,\t0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115,\n\t0xC382, 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C,\t0xC386, 0x811D, 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121,\n\t0xC38A, 0x8122, 0xC38B, 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125,\t0xC38E, 0x8126, 0xC38F, 0x8127, 0xC390, 0x8128, 0xC391, 0x8129,\n\t0xC392, 0x812A, 0xC393, 0x812B, 0xC394, 0x812D, 0xC395, 0x812E,\t0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, 0xC399, 0x8135,\n\t0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, 0x813B,\t0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29,\n\t0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13,\t0xC3A6, 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305,\n\t0xC3AA, 0x951A, 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6,\t0xC3AE, 0x536F, 0xC3AF, 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D,\n\t0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, 0xC3B4, 0x4E48, 0xC3B5, 0x73AB,\t0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, 0x9176, 0xC3B9, 0x9709,\n\t0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, 0xC3BD, 0x5A92,\t0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, 0x6627,\n\t0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8,\t0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499,\n\t0xC3CA, 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B,\t0xC3CE, 0x68A6, 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A,\n\t0xC3D2, 0x9761, 0xC3D3, 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C,\t0xC3D6, 0x5F25, 0xC3D7, 0x7C73, 0xC3D8, 0x79D8, 0xC3D9, 0x89C5,\n\t0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, 0x5BC6, 0xC3DD, 0x5E42,\t0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, 0xC3E1, 0x5195,\n\t0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, 0x7F05,\t0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784,\n\t0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99,\t0xC3EE, 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11,\n\t0xC3F2, 0x62BF, 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF,\t0xC3F6, 0x95FD, 0xC3F7, 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23,\n\t0xC3FA, 0x94ED, 0xC3FB, 0x540D, 0xC3FC, 0x547D, 0xC3FD, 0x8C2C,\t0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, 0x8141, 0xC442, 0x8142,\n\t0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, 0xC446, 0x8147,\t0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, 0x814F,\n\t0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158,\t0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E,\n\t0xC453, 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163,\t0xC457, 0x8164, 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A,\n\t0xC45B, 0x816B, 0xC45C, 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172,\t0xC45F, 0x8173, 0xC460, 0x8175, 0xC461, 0x8176, 0xC462, 0x8177,\n\t0xC463, 0x8178, 0xC464, 0x8181, 0xC465, 0x8183, 0xC466, 0x8184,\t0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, 0xC46A, 0x8189,\n\t0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, 0x818E,\t0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194,\n\t0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199,\t0xC477, 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0,\n\t0xC47B, 0x81A1, 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5,\t0xC480, 0x81A7, 0xC481, 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC,\n\t0xC484, 0x81AD, 0xC485, 0x81AE, 0xC486, 0x81AF, 0xC487, 0x81B0,\t0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, 0x81B4, 0xC48B, 0x81B5,\n\t0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, 0xC48F, 0x81B9,\t0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, 0x81BF,\n\t0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8,\t0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE,\n\t0xC49C, 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2,\t0xC4A0, 0x81D3, 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21,\n\t0xC4A4, 0x819C, 0xC4A5, 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54,\t0xC4A8, 0x62B9, 0xC4A9, 0x672B, 0xC4AA, 0x83AB, 0xC4AB, 0x58A8,\n\t0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, 0x6F20, 0xC4AF, 0x5BDE,\t0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, 0xC4B3, 0x67D0,\n\t0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, 0x59C6,\t0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55,\n\t0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE,\t0xC4C0, 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF,\n\t0xC4C4, 0x54EA, 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3,\t0xC4C8, 0x5A1C, 0xC4C9, 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43,\n\t0xC4CC, 0x5976, 0xC4CD, 0x8010, 0xC4CE, 0x5948, 0xC4CF, 0x5357,\t0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, 0x56CA, 0xC4D3, 0x6320,\n\t0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, 0xC4D7, 0x6DD6,\t0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, 0x5AE9,\n\t0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A,\t0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60,\n\t0xC4E4, 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA,\t0xC4E8, 0x852B, 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE,\n\t0xC4EC, 0x64B5, 0xC4ED, 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18,\t0xC4F0, 0x917F, 0xC4F1, 0x9E1F, 0xC4F2, 0x5C3F, 0xC4F3, 0x634F,\n\t0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, 0x556E, 0xC4F7, 0x954A,\t0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, 0xC4FB, 0x67E0,\n\t0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, 0x81D4,\t0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8,\n\t0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC,\t0xC549, 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0,\n\t0xC54D, 0x81E1, 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5,\t0xC551, 0x81E6, 0xC552, 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB,\n\t0xC555, 0x81EE, 0xC556, 0x81EF, 0xC557, 0x81F0, 0xC558, 0x81F1,\t0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, 0x81F6, 0xC55C, 0x81F7,\n\t0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, 0xC560, 0x81FD,\t0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, 0x8208,\n\t0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E,\t0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215,\n\t0xC56D, 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219,\t0xC571, 0x821A, 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224,\n\t0xC575, 0x8225, 0xC576, 0x8226, 0xC577, 0x8227, 0xC578, 0x8229,\t0xC579, 0x822E, 0xC57A, 0x8232, 0xC57B, 0x823A, 0xC57C, 0x823C,\n\t0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, 0x8240, 0xC581, 0x8241,\t0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, 0xC585, 0x8246,\n\t0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, 0x824D,\t0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252,\n\t0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256,\t0xC592, 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C,\n\t0xC596, 0x825D, 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261,\t0xC59A, 0x8262, 0xC59B, 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265,\n\t0xC59E, 0x8266, 0xC59F, 0x8267, 0xC5A0, 0x8269, 0xC5A1, 0x62E7,\t0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, 0x626D, 0xC5A5, 0x94AE,\n\t0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, 0xC5A9, 0x519C,\t0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, 0x6012,\n\t0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F,\t0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA,\n\t0xC5B6, 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4,\t0xC5BA, 0x85D5, 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4,\n\t0xC5BE, 0x556A, 0xC5BF, 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15,\t0xC5C2, 0x6015, 0xC5C3, 0x7436, 0xC5C4, 0x62CD, 0xC5C5, 0x6392,\n\t0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, 0x6E43, 0xC5C9, 0x6D3E,\t0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, 0xC5CD, 0x78D0,\n\t0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, 0x53DB,\t0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A,\n\t0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228,\t0xC5DA, 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1,\n\t0xC5DE, 0x5478, 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4,\t0xC5E2, 0x8D54, 0xC5E3, 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69,\n\t0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, 0xC5E8, 0x76C6, 0xC5E9, 0x7830,\t0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, 0x6F8E, 0xC5ED, 0x5F6D,\n\t0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, 0xC5F1, 0x7BF7,\t0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, 0x6367,\n\t0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739,\t0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435,\n\t0xC5FE, 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C,\t0xC643, 0x826D, 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276,\n\t0xC647, 0x8277, 0xC648, 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C,\t0xC64B, 0x8280, 0xC64C, 0x8281, 0xC64D, 0x8283, 0xC64E, 0x8285,\n\t0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, 0x8289, 0xC652, 0x828C,\t0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, 0xC656, 0x8295,\n\t0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, 0x829E,\t0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7,\n\t0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA,\t0xC663, 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0,\n\t0xC667, 0x82C2, 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6,\t0xC66B, 0x82C9, 0xC66C, 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9,\n\t0xC66F, 0x82DA, 0xC670, 0x82DD, 0xC671, 0x82E2, 0xC672, 0x82E7,\t0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, 0x82EA, 0xC676, 0x82EC,\n\t0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, 0xC67A, 0x82F2,\t0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, 0x82F8,\n\t0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE,\t0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B,\n\t0xC688, 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313,\t0xC68C, 0x8316, 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D,\n\t0xC690, 0x831E, 0xC691, 0x831F, 0xC692, 0x8320, 0xC693, 0x8321,\t0xC694, 0x8322, 0xC695, 0x8323, 0xC696, 0x8324, 0xC697, 0x8325,\n\t0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, 0x832A, 0xC69B, 0x832E,\t0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, 0xC69F, 0x833B,\n\t0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, 0x75B2,\t0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB,\n\t0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F,\t0xC6AC, 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02,\n\t0xC6B0, 0x74E2, 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5,\t0xC6B4, 0x62FC, 0xC6B5, 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1,\n\t0xC6B8, 0x8058, 0xC6B9, 0x4E52, 0xC6BA, 0x576A, 0xC6BB, 0x82F9,\t0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, 0x51ED, 0xC6BF, 0x74F6,\n\t0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, 0xC6C3, 0x6CFC,\t0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, 0x9B44,\n\t0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251,\t0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461,\n\t0xC6D0, 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734,\t0xC6D4, 0x5703, 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31,\n\t0xC6D8, 0x66DD, 0xC6D9, 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A,\t0xC6DC, 0x6816, 0xC6DD, 0x621A, 0xC6DE, 0x59BB, 0xC6DF, 0x4E03,\n\t0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, 0x67D2, 0xC6E3, 0x6C8F,\t0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, 0xC6E7, 0x6B67,\n\t0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, 0x9F50,\t0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91,\n\t0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01,\t0xC6F4, 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668,\n\t0xC6F8, 0x6C14, 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D,\t0xC6FC, 0x6CE3, 0xC6FD, 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E,\n\t0xC741, 0x833F, 0xC742, 0x8341, 0xC743, 0x8342, 0xC744, 0x8344,\t0xC745, 0x8345, 0xC746, 0x8348, 0xC747, 0x834A, 0xC748, 0x834B,\n\t0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, 0xC74C, 0x8353,\t0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, 0x8358,\n\t0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370,\t0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374,\n\t0xC759, 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A,\t0xC75D, 0x837E, 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381,\n\t0xC761, 0x8382, 0xC762, 0x8383, 0xC763, 0x8384, 0xC764, 0x8387,\t0xC765, 0x8388, 0xC766, 0x838A, 0xC767, 0x838B, 0xC768, 0x838C,\n\t0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, 0x8390, 0xC76C, 0x8391,\t0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, 0xC770, 0x8397,\n\t0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, 0x839F,\t0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4,\n\t0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC,\t0xC77D, 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5,\n\t0xC782, 0x83BB, 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2,\t0xC786, 0x83C3, 0xC787, 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8,\n\t0xC78A, 0x83C9, 0xC78B, 0x83CB, 0xC78C, 0x83CD, 0xC78D, 0x83CE,\t0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, 0x83D2, 0xC791, 0x83D3,\n\t0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, 0xC795, 0x83DA,\t0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, 0x83E3,\n\t0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8,\t0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070,\n\t0xC7A2, 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E,\t0xC7A6, 0x94C5, 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E,\n\t0xC7AA, 0x4EDF, 0xC7AB, 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4,\t0xC7AE, 0x94B1, 0xC7AF, 0x94B3, 0xC7B0, 0x524D, 0xC7B1, 0x6F5C,\n\t0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, 0x8C34, 0xC7B5, 0x5811,\t0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, 0xC7B9, 0x67AA,\n\t0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, 0x5899,\t0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47,\n\t0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865,\t0xC7C6, 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7,\n\t0xC7CA, 0x9798, 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED,\t0xC7CE, 0x4FCF, 0xC7CF, 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304,\n\t0xC7D2, 0x4E14, 0xC7D3, 0x602F, 0xC7D4, 0x7A83, 0xC7D5, 0x94A6,\t0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, 0x79E6, 0xC7D9, 0x7434,\n\t0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, 0xC7DD, 0x79BD,\t0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, 0x8F7B,\n\t0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05,\t0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5,\n\t0xC7EA, 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C,\t0xC7EE, 0x7A77, 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1,\n\t0xC7F2, 0x7403, 0xC7F3, 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B,\t0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, 0xC7F8, 0x533A, 0xC7F9, 0x86C6,\n\t0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, 0x5C48, 0xC7FD, 0x9A71,\t0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, 0xC842, 0x83F3,\n\t0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, 0x83F7,\t0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE,\n\t0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405,\t0xC84F, 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A,\n\t0xC853, 0x8410, 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414,\t0xC857, 0x8415, 0xC858, 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419,\n\t0xC85B, 0x841A, 0xC85C, 0x841B, 0xC85D, 0x841E, 0xC85E, 0x841F,\t0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, 0x8422, 0xC862, 0x8423,\n\t0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, 0xC866, 0x842C,\t0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, 0x8430,\n\t0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435,\t0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A,\n\t0xC873, 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440,\t0xC877, 0x8441, 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444,\n\t0xC87B, 0x8445, 0xC87C, 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449,\t0xC880, 0x844A, 0xC881, 0x844B, 0xC882, 0x844C, 0xC883, 0x844D,\n\t0xC884, 0x844E, 0xC885, 0x844F, 0xC886, 0x8450, 0xC887, 0x8452,\t0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, 0xC88B, 0x8456,\n\t0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, 0x845F,\t0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465,\n\t0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A,\t0xC898, 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472,\n\t0xC89C, 0x8474, 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B,\t0xC8A0, 0x847C, 0xC8A1, 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B,\n\t0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, 0xC8A6, 0x5708, 0xC8A7, 0x98A7,\t0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, 0x6CC9, 0xC8AB, 0x5168,\n\t0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, 0xC8AF, 0x5238,\t0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, 0x7638,\n\t0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E,\t0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136,\n\t0xC8BC, 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4,\t0xC8C0, 0x58E4, 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9,\n\t0xC8C4, 0x9976, 0xC8C5, 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9,\t0xC8C8, 0x70ED, 0xC8C9, 0x58EC, 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA,\n\t0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, 0x4EFB, 0xC8CF, 0x8BA4,\t0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, 0xC8D3, 0x6254,\n\t0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, 0x8338,\t0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194,\n\t0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197,\t0xC8E0, 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339,\n\t0xC8E4, 0x8815, 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982,\t0xC8E8, 0x8FB1, 0xC8E9, 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165,\n\t0xC8EC, 0x8925, 0xC8ED, 0x8F6F, 0xC8EE, 0x962E, 0xC8EF, 0x854A,\t0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, 0x95F0, 0xC8F3, 0x6DA6,\n\t0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, 0xC8F7, 0x6D12,\t0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, 0x585E,\n\t0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D,\t0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481,\n\t0xC945, 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486,\t0xC949, 0x848A, 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490,\n\t0xC94D, 0x8491, 0xC94E, 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494,\t0xC951, 0x8495, 0xC952, 0x8496, 0xC953, 0x8498, 0xC954, 0x849A,\n\t0xC955, 0x849B, 0xC956, 0x849D, 0xC957, 0x849E, 0xC958, 0x849F,\t0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, 0xC95C, 0x84A4,\n\t0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, 0x84A8,\t0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC,\n\t0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1,\t0xC969, 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7,\n\t0xC96D, 0x84BB, 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0,\t0xC971, 0x84C2, 0xC972, 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6,\n\t0xC975, 0x84C7, 0xC976, 0x84C8, 0xC977, 0x84CB, 0xC978, 0x84CC,\t0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, 0x84D2, 0xC97C, 0x84D4,\n\t0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, 0xC981, 0x84D9,\t0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, 0x84DE,\n\t0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7,\t0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB,\n\t0xC98E, 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1,\t0xC992, 0x84F2, 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5,\n\t0xC996, 0x84F6, 0xC997, 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9,\t0xC99A, 0x84FA, 0xC99B, 0x84FB, 0xC99C, 0x84FD, 0xC99D, 0x84FE,\n\t0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, 0x8502, 0xC9A1, 0x4F1E,\t0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, 0xC9A5, 0x4E27,\n\t0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, 0x5AC2,\t0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE,\n\t0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740,\t0xC9B2, 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB,\n\t0xC9B6, 0x5565, 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652,\t0xC9BA, 0x73CA, 0xC9BB, 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71,\n\t0xC9BE, 0x5220, 0xC9BF, 0x717D, 0xC9C0, 0x886B, 0xC9C1, 0x95EA,\t0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, 0x8D61, 0xC9C5, 0x81B3,\n\t0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, 0xC9C9, 0x7F2E,\t0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, 0x8D4F,\n\t0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3,\t0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7,\n\t0xC9D6, 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11,\t0xC9DA, 0x54E8, 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962,\n\t0xC9DE, 0x8D4A, 0xC9DF, 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D,\t0xC9E2, 0x8D66, 0xC9E3, 0x6444, 0xC9E4, 0x5C04, 0xC9E5, 0x6151,\n\t0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, 0x8BBE, 0xC9E9, 0x7837,\t0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, 0xC9ED, 0x8EAB,\n\t0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, 0x795E,\t0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A,\n\t0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0,\t0xC9FA, 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347,\n\t0xC9FE, 0x7EF3, 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505,\t0xCA43, 0x8506, 0xCA44, 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509,\n\t0xCA47, 0x850A, 0xCA48, 0x850B, 0xCA49, 0x850D, 0xCA4A, 0x850E,\t0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, 0x8512, 0xCA4E, 0x8514,\n\t0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, 0xCA52, 0x8519,\t0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, 0x851E,\n\t0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524,\t0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528,\n\t0xCA5F, 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E,\t0xCA63, 0x852F, 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532,\n\t0xCA67, 0x8533, 0xCA68, 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536,\t0xCA6B, 0x853E, 0xCA6C, 0x853F, 0xCA6D, 0x8540, 0xCA6E, 0x8541,\n\t0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, 0x8545, 0xCA72, 0x8546,\t0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, 0xCA76, 0x854D,\n\t0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, 0x8551,\t0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555,\n\t0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B,\t0xCA84, 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560,\n\t0xCA88, 0x8561, 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565,\t0xCA8C, 0x8566, 0xCA8D, 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A,\n\t0xCA90, 0x856B, 0xCA91, 0x856C, 0xCA92, 0x856D, 0xCA93, 0x856E,\t0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, 0x8571, 0xCA97, 0x8573,\n\t0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, 0xCA9B, 0x8578,\t0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, 0x8580,\n\t0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269,\t0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931,\n\t0xCAA8, 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7,\t0xCAAC, 0x5C38, 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3,\n\t0xCAB0, 0x62FE, 0xCAB1, 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF,\t0xCAB4, 0x8680, 0xCAB5, 0x5B9E, 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2,\n\t0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, 0x5C4E, 0xCABB, 0x9A76,\t0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, 0xCABF, 0x58EB,\n\t0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, 0x62ED,\t0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F,\n\t0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5,\t0xCACC, 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F,\n\t0xCAD0, 0x5E02, 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6,\t0xCAD4, 0x8BD5, 0xCAD5, 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996,\n\t0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, 0xCADA, 0x6388, 0xCADB, 0x552E,\t0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, 0x517D, 0xCADF, 0x852C,\n\t0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, 0xCAE3, 0x6292,\t0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, 0x6DD1,\n\t0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70,\t0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9,\n\t0xCAF0, 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20,\t0xCAF4, 0x5C5E, 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811,\n\t0xCAF8, 0x675F, 0xCAF9, 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885,\t0xCAFC, 0x5EB6, 0xCAFD, 0x6570, 0xCAFE, 0x6F31, 0xCB40, 0x8582,\n\t0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, 0x8588, 0xCB44, 0x8589,\t0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, 0xCB48, 0x858D,\n\t0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, 0x8592,\t0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596,\n\t0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A,\t0xCB55, 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0,\n\t0xCB59, 0x85A1, 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5,\t0xCB5D, 0x85A6, 0xCB5E, 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB,\n\t0xCB61, 0x85AC, 0xCB62, 0x85AD, 0xCB63, 0x85B1, 0xCB64, 0x85B2,\t0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, 0x85B5, 0xCB68, 0x85B6,\n\t0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, 0xCB6C, 0x85BC,\t0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, 0x85C0,\n\t0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5,\t0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA,\n\t0xCB79, 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE,\t0xCB7D, 0x85D1, 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6,\n\t0xCB82, 0x85D7, 0xCB83, 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA,\t0xCB86, 0x85DB, 0xCB87, 0x85DD, 0xCB88, 0x85DE, 0xCB89, 0x85DF,\n\t0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, 0x85E2, 0xCB8D, 0x85E3,\t0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, 0xCB91, 0x85E8,\n\t0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, 0x85ED,\t0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1,\n\t0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5,\t0xCB9E, 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055,\n\t0xCBA2, 0x5237, 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870,\t0xCBA6, 0x7529, 0xCBA7, 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4,\n\t0xCBAA, 0x971C, 0xCBAB, 0x53CC, 0xCBAC, 0x723D, 0xCBAD, 0x8C01,\t0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, 0x7A0E, 0xCBB1, 0x542E,\n\t0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, 0xCBB5, 0x8BF4,\t0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, 0x65AF,\n\t0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1,\t0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086,\n\t0xCBC2, 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A,\t0xCBC6, 0x4F3C, 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E,\n\t0xCBCA, 0x8038, 0xCBCB, 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001,\t0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, 0xCBD0, 0x8BF5, 0xCBD1, 0x641C,\n\t0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, 0x55FD, 0xCBD5, 0x82CF,\t0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, 0xCBD9, 0x901F,\n\t0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, 0x6EAF,\t0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178,\n\t0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B,\t0xCBE6, 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E,\n\t0xCBEA, 0x5C81, 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7,\t0xCBEE, 0x795F, 0xCBEF, 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B,\n\t0xCBF2, 0x84D1, 0xCBF3, 0x68AD, 0xCBF4, 0x5506, 0xCBF5, 0x7F29,\t0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, 0x9501, 0xCBF9, 0x6240,\n\t0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, 0xCBFD, 0x5979,\t0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, 0x85FC,\n\t0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601,\t0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606,\n\t0xCC4B, 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A,\t0xCC4F, 0x860B, 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E,\n\t0xCC53, 0x860F, 0xCC54, 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613,\t0xCC57, 0x8614, 0xCC58, 0x8615, 0xCC59, 0x8617, 0xCC5A, 0x8618,\n\t0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, 0x861B, 0xCC5E, 0x861C,\t0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, 0xCC62, 0x8620,\n\t0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, 0x8624,\t0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A,\n\t0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E,\t0xCC6F, 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632,\n\t0xCC73, 0x8633, 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636,\t0xCC77, 0x8637, 0xCC78, 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B,\n\t0xCC7B, 0x863D, 0xCC7C, 0x863E, 0xCC7D, 0x863F, 0xCC7E, 0x8640,\t0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, 0x8643, 0xCC83, 0x8644,\n\t0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, 0xCC87, 0x8648,\t0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, 0x864C,\n\t0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656,\t0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B,\n\t0xCC94, 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660,\t0xCC98, 0x8661, 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665,\n\t0xCC9C, 0x8666, 0xCC9D, 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669,\t0xCCA0, 0x866A, 0xCCA1, 0x736D, 0xCCA2, 0x631E, 0xCCA3, 0x8E4B,\n\t0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, 0x82D4, 0xCCA7, 0x62AC,\t0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, 0xCCAB, 0x592A,\n\t0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, 0x644A,\t0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B,\n\t0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D,\t0xCCB8, 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892,\n\t0xCCBC, 0x78B3, 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD,\t0xCCC0, 0x6C64, 0xCCC1, 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802,\n\t0xCCC4, 0x68E0, 0xCCC5, 0x819B, 0xCCC6, 0x5510, 0xCCC7, 0x7CD6,\t0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, 0x6DCC, 0xCCCB, 0x8D9F,\n\t0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, 0xCCCF, 0x6ED4,\t0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, 0x9003,\n\t0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957,\t0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC,\n\t0xCCDC, 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22,\t0xCCE0, 0x9511, 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44,\n\t0xCCE4, 0x557C, 0xCCE5, 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F,\t0xCCE8, 0x60D5, 0xCCE9, 0x6D95, 0xCCEA, 0x5243, 0xCCEB, 0x5C49,\n\t0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, 0x586B, 0xCCEF, 0x7530,\t0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, 0xCCF3, 0x8146,\n\t0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, 0x773A,\t0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16,\n\t0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D,\t0xCD41, 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673,\n\t0xCD45, 0x8674, 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677,\t0xCD49, 0x8678, 0xCD4A, 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685,\n\t0xCD4D, 0x8686, 0xCD4E, 0x8687, 0xCD4F, 0x8688, 0xCD50, 0x8689,\t0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, 0x8690, 0xCD54, 0x8691,\n\t0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, 0xCD58, 0x8697,\t0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, 0x869B,\n\t0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1,\t0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB,\n\t0xCD65, 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3,\t0xCD69, 0x86B7, 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB,\n\t0xCD6D, 0x86BC, 0xCD6E, 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF,\t0xCD71, 0x86C1, 0xCD72, 0x86C2, 0xCD73, 0x86C3, 0xCD74, 0x86C5,\n\t0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, 0x86CD, 0xCD78, 0x86D2,\t0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, 0xCD7C, 0x86D7,\n\t0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, 0x86E0,\t0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5,\n\t0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA,\t0xCD8A, 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5,\n\t0xCD8E, 0x86F6, 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB,\t0xCD92, 0x86FC, 0xCD93, 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701,\n\t0xCD96, 0x8704, 0xCD97, 0x8705, 0xCD98, 0x8706, 0xCD99, 0x870B,\t0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, 0x870F, 0xCD9D, 0x8710,\n\t0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, 0xCDA1, 0x6C40,\t0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, 0x5EAD,\n\t0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850,\t0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC,\n\t0xCDAE, 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345,\t0xCDB2, 0x7B52, 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077,\n\t0xCDB6, 0x6295, 0xCDB7, 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8,\t0xCDBA, 0x79C3, 0xCDBB, 0x7A81, 0xCDBC, 0x56FE, 0xCDBD, 0x5F92,\n\t0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, 0x5C60, 0xCDC1, 0x571F,\t0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, 0xCDC5, 0x56E2,\n\t0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, 0x8715,\t0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F,\n\t0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131,\t0xCDD2, 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C,\n\t0xCDD6, 0x692D, 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E,\t0xCDDA, 0x6316, 0xCDDB, 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C,\n\t0xCDDE, 0x5A03, 0xCDDF, 0x74E6, 0xCDE0, 0x889C, 0xCDE1, 0x6B6A,\t0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, 0x5F2F, 0xCDE5, 0x6E7E,\n\t0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, 0xCDE9, 0x70F7,\t0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, 0x665A,\n\t0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49,\t0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B,\n\t0xCDF6, 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80,\t0xCDFA, 0x65FA, 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984,\n\t0xCDFE, 0x5A01, 0xCE40, 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D,\t0xCE43, 0x871F, 0xCE44, 0x8720, 0xCE45, 0x8724, 0xCE46, 0x8726,\n\t0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, 0x872A, 0xCE4A, 0x872B,\t0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, 0xCE4E, 0x8730,\n\t0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, 0x8736,\t0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C,\n\t0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742,\t0xCE5B, 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746,\n\t0xCE5F, 0x874A, 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F,\t0xCE63, 0x8750, 0xCE64, 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754,\n\t0xCE67, 0x8755, 0xCE68, 0x8756, 0xCE69, 0x8758, 0xCE6A, 0x875A,\t0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, 0x875D, 0xCE6E, 0x875E,\n\t0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, 0xCE72, 0x8766,\t0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, 0x876A,\n\t0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F,\t0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775,\n\t0xCE80, 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A,\t0xCE84, 0x877F, 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784,\n\t0xCE88, 0x8786, 0xCE89, 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A,\t0xCE8C, 0x878C, 0xCE8D, 0x878E, 0xCE8E, 0x878F, 0xCE8F, 0x8790,\n\t0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, 0x8794, 0xCE93, 0x8795,\t0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, 0xCE97, 0x879A,\n\t0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, 0x879E,\t0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3,\n\t0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371,\t0xCEA4, 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4,\n\t0xCEA8, 0x552F, 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D,\t0xCEAC, 0x7EF4, 0xCEAD, 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4,\n\t0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC,\t0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, 0x5473, 0xCEB7, 0x754F,\n\t0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, 0xCEBB, 0x4F4D,\t0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, 0x6170,\n\t0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A,\t0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B,\n\t0xCEC8, 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1,\t0xCECC, 0x7FC1, 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717,\n\t0xCED0, 0x6DA1, 0xCED1, 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1,\t0xCED4, 0x5367, 0xCED5, 0x63E1, 0xCED6, 0x6C83, 0xCED7, 0x5DEB,\n\t0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, 0x4E4C, 0xCEDB, 0x6C61,\t0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, 0xCEDF, 0x829C,\n\t0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, 0x6BCB,\t0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348,\n\t0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E,\t0xCEEC, 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269,\n\t0xCEF0, 0x52FF, 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF,\t0xCEF4, 0x6614, 0xCEF5, 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F,\n\t0xCEF8, 0x7852, 0xCEF9, 0x77FD, 0xCEFA, 0x6670, 0xCEFB, 0x563B,\t0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, 0x727A, 0xCF40, 0x87A5,\n\t0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, 0xCF44, 0x87AA,\t0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, 0x87B2,\n\t0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8,\t0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE,\n\t0xCF51, 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3,\t0xCF55, 0x87C4, 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8,\n\t0xCF59, 0x87C9, 0xCF5A, 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE,\t0xCF5D, 0x87CF, 0xCF5E, 0x87D0, 0xCF5F, 0x87D4, 0xCF60, 0x87D5,\n\t0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, 0x87D8, 0xCF64, 0x87D9,\t0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, 0xCF68, 0x87DE,\n\t0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, 0x87E3,\t0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8,\n\t0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED,\t0xCF75, 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2,\n\t0xCF79, 0x87F3, 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6,\t0xCF7D, 0x87F7, 0xCF7E, 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB,\n\t0xCF82, 0x87FC, 0xCF83, 0x87FD, 0xCF84, 0x87FF, 0xCF85, 0x8800,\t0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, 0x8804, 0xCF89, 0x8805,\n\t0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, 0xCF8D, 0x8809,\t0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, 0x880E,\n\t0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812,\t0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819,\n\t0xCF9A, 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E,\t0xCF9E, 0x881F, 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00,\n\t0xCFA2, 0x606F, 0xCFA3, 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D,\t0xCFA6, 0x5915, 0xCFA7, 0x60DC, 0xCFA8, 0x7184, 0xCFA9, 0x70EF,\n\t0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, 0x7280, 0xCFAD, 0x6A84,\t0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, 0xCFB1, 0x5AB3,\n\t0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, 0x7CFB,\t0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E,\n\t0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96,\t0xCFBE, 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED,\n\t0xCFC2, 0x4E0B, 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413,\t0xCFC6, 0x6380, 0xCFC7, 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9,\n\t0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, 0xCFCC, 0x54B8, 0xCFCD, 0x8D24,\t0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, 0x95F2, 0xCFD1, 0x6D8E,\n\t0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, 0xCFD5, 0x9669,\t0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, 0x817A,\n\t0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677,\t0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2,\n\t0xCFE2, 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944,\t0xCFE6, 0x6E58, 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965,\n\t0xCFEA, 0x8BE6, 0xCFEB, 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB,\t0xCFEE, 0x9879, 0xCFEF, 0x5DF7, 0xCFF0, 0x6A61, 0xCFF1, 0x50CF,\n\t0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, 0x8427, 0xCFF5, 0x785D,\t0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, 0xCFF9, 0x56A3,\n\t0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, 0x6DC6,\t0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826,\n\t0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A,\t0xD047, 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E,\n\t0xD04B, 0x882F, 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833,\t0xD04F, 0x8834, 0xD050, 0x8835, 0xD051, 0x8836, 0xD052, 0x8837,\n\t0xD053, 0x8838, 0xD054, 0x883A, 0xD055, 0x883B, 0xD056, 0x883D,\t0xD057, 0x883E, 0xD058, 0x883F, 0xD059, 0x8841, 0xD05A, 0x8842,\n\t0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, 0xD05E, 0x8848,\t0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, 0x884E,\n\t0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852,\t0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858,\n\t0xD06B, 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D,\t0xD06F, 0x885E, 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866,\n\t0xD073, 0x8867, 0xD074, 0x886A, 0xD075, 0x886D, 0xD076, 0x886F,\t0xD077, 0x8871, 0xD078, 0x8873, 0xD079, 0x8874, 0xD07A, 0x8875,\n\t0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, 0x8879, 0xD07E, 0x887A,\t0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, 0xD083, 0x8883,\n\t0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, 0x888A,\t0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890,\n\t0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895,\t0xD090, 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A,\n\t0xD094, 0x889B, 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F,\t0xD098, 0x88A0, 0xD099, 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5,\n\t0xD09C, 0x88A6, 0xD09D, 0x88A7, 0xD09E, 0x88A8, 0xD09F, 0x88A9,\t0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, 0x5B5D, 0xD0A3, 0x6821,\n\t0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, 0xD0A7, 0x6548,\t0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, 0x874E,\n\t0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A,\t0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10,\n\t0xD0B4, 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9,\t0xD0B8, 0x61C8, 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22,\n\t0xD0BC, 0x5C51, 0xD0BD, 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C,\t0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB,\n\t0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, 0x8845, 0xD0C7, 0x661F,\t0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, 0xD0CB, 0x5174,\n\t0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, 0x90A2,\t0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F,\n\t0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6,\t0xD0D8, 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4,\n\t0xD0DC, 0x718A, 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E,\t0xD0E0, 0x673D, 0xD0E1, 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0,\n\t0xD0E4, 0x8896, 0xD0E5, 0x7EE3, 0xD0E6, 0x589F, 0xD0E7, 0x620C,\t0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, 0x5618, 0xD0EB, 0x987B,\n\t0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, 0xD0EF, 0x9157,\t0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, 0x755C,\n\t0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA,\t0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3,\n\t0xD0FC, 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC,\t0xD141, 0x88AE, 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2,\n\t0xD145, 0x88B3, 0xD146, 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6,\t0xD149, 0x88B8, 0xD14A, 0x88B9, 0xD14B, 0x88BA, 0xD14C, 0x88BB,\n\t0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, 0x88BF, 0xD150, 0x88C0,\t0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, 0xD154, 0x88C8,\n\t0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, 0x88CD,\t0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3,\n\t0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB,\t0xD161, 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0,\n\t0xD165, 0x88E1, 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9,\t0xD169, 0x88EA, 0xD16A, 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED,\n\t0xD16D, 0x88EE, 0xD16E, 0x88EF, 0xD16F, 0x88F2, 0xD170, 0x88F5,\t0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, 0x88FA, 0xD174, 0x88FB,\n\t0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, 0xD178, 0x8901,\t0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, 0x8906,\n\t0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B,\t0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F,\n\t0xD186, 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916,\t0xD18A, 0x8917, 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D,\n\t0xD18E, 0x891E, 0xD18F, 0x891F, 0xD190, 0x8920, 0xD191, 0x8922,\t0xD192, 0x8923, 0xD193, 0x8924, 0xD194, 0x8926, 0xD195, 0x8927,\n\t0xD196, 0x8928, 0xD197, 0x8929, 0xD198, 0x892C, 0xD199, 0x892D,\t0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, 0xD19D, 0x8932,\n\t0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, 0x9009,\t0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774,\n\t0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA,\t0xD1AA, 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA,\n\t0xD1AE, 0x65EC, 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F,\t0xD1B2, 0x5DE1, 0xD1B3, 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD,\n\t0xD1B6, 0x8BAF, 0xD1B7, 0x900A, 0xD1B8, 0x8FC5, 0xD1B9, 0x538B,\t0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, 0x9E2D, 0xD1BD, 0x5440,\n\t0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, 0xD1C1, 0x869C,\t0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, 0x96C5,\n\t0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109,\t0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9,\n\t0xD1CE, 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712,\t0xD1D2, 0x5CA9, 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C,\n\t0xD1D6, 0x960E, 0xD1D7, 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944,\t0xD1DA, 0x63A9, 0xD1DB, 0x773C, 0xD1DC, 0x884D, 0xD1DD, 0x6F14,\n\t0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, 0x71D5, 0xD1E1, 0x538C,\t0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, 0xD1E5, 0x5F66,\n\t0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, 0x9A8C,\t0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7,\n\t0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1,\t0xD1F2, 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27,\n\t0xD1F6, 0x4EF0, 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837,\t0xD1FA, 0x6F3E, 0xD1FB, 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996,\n\t0xD1FE, 0x7476, 0xD240, 0x8938, 0xD241, 0x8939, 0xD242, 0x893A,\t0xD243, 0x893B, 0xD244, 0x893C, 0xD245, 0x893D, 0xD246, 0x893E,\n\t0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, 0xD24A, 0x8943,\t0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, 0x8948,\n\t0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C,\t0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950,\n\t0xD257, 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954,\t0xD25B, 0x8955, 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958,\n\t0xD25F, 0x8959, 0xD260, 0x895A, 0xD261, 0x895B, 0xD262, 0x895C,\t0xD263, 0x895D, 0xD264, 0x8960, 0xD265, 0x8961, 0xD266, 0x8962,\n\t0xD267, 0x8963, 0xD268, 0x8964, 0xD269, 0x8965, 0xD26A, 0x8967,\t0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, 0xD26E, 0x896B,\n\t0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, 0x896F,\t0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973,\n\t0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977,\t0xD27B, 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C,\n\t0xD280, 0x897D, 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982,\t0xD284, 0x8984, 0xD285, 0x8985, 0xD286, 0x8987, 0xD287, 0x8988,\n\t0xD288, 0x8989, 0xD289, 0x898A, 0xD28A, 0x898B, 0xD28B, 0x898C,\t0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, 0x898F, 0xD28F, 0x8990,\n\t0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, 0xD293, 0x8994,\t0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, 0x8998,\n\t0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C,\t0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0,\n\t0xD2A0, 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065,\t0xD2A4, 0x7A91, 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC,\n\t0xD2A8, 0x8200, 0xD2A9, 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000,\t0xD2AC, 0x6930, 0xD2AD, 0x564E, 0xD2AE, 0x8036, 0xD2AF, 0x7237,\n\t0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, 0x4E5F, 0xD2B3, 0x9875,\t0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, 0xD2B7, 0x66F3,\n\t0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, 0x4E00,\t0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1,\n\t0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890,\t0xD2C4, 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA,\n\t0xD2C8, 0x80F0, 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C,\t0xD2CC, 0x59E8, 0xD2CD, 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681,\n\t0xD2D0, 0x501A, 0xD2D1, 0x5DF2, 0xD2D2, 0x4E59, 0xD2D3, 0x77E3,\t0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, 0x6291, 0xD2D7, 0x6613,\n\t0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, 0xD2DB, 0x5F79,\t0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, 0x75AB,\n\t0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5,\t0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2,\n\t0xD2E8, 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1,\t0xD2EC, 0x5F02, 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE,\n\t0xD2F0, 0x8335, 0xD2F1, 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7,\t0xD2F4, 0x97F3, 0xD2F5, 0x9634, 0xD2F6, 0x59FB, 0xD2F7, 0x541F,\n\t0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, 0x5BC5, 0xD2FB, 0x996E,\t0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, 0xD340, 0x89A2,\n\t0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, 0x89A6,\t0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA,\n\t0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE,\t0xD34D, 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2,\n\t0xD351, 0x89B3, 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6,\t0xD355, 0x89B7, 0xD356, 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA,\n\t0xD359, 0x89BB, 0xD35A, 0x89BC, 0xD35B, 0x89BD, 0xD35C, 0x89BE,\t0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, 0x89C3, 0xD360, 0x89CD,\n\t0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, 0xD364, 0x89D7,\t0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, 0x89DD,\n\t0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2,\t0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9,\n\t0xD371, 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE,\t0xD375, 0x89F0, 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4,\n\t0xD379, 0x89F5, 0xD37A, 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8,\t0xD37D, 0x89F9, 0xD37E, 0x89FA, 0xD380, 0x89FB, 0xD381, 0x89FC,\n\t0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, 0x89FF, 0xD385, 0x8A01,\t0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, 0xD389, 0x8A05,\n\t0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, 0x8A0A,\t0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E,\n\t0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12,\t0xD396, 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16,\n\t0xD39A, 0x8A17, 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A,\t0xD39E, 0x8A1B, 0xD39F, 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370,\n\t0xD3A2, 0x82F1, 0xD3A3, 0x6A31, 0xD3A4, 0x5A74, 0xD3A5, 0x9E70,\t0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, 0x83B9, 0xD3A9, 0x8424,\n\t0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, 0xD3AD, 0x8FCE,\t0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, 0x9896,\n\t0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5,\t0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8,\n\t0xD3BA, 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F,\t0xD3BE, 0x6CF3, 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F,\n\t0xD3C2, 0x52C7, 0xD3C3, 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18,\t0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, 0xD3C8, 0x5C24, 0xD3C9, 0x7531,\n\t0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, 0x72B9, 0xD3CD, 0x6CB9,\t0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, 0xD3D1, 0x53CB,\n\t0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, 0x8BF1,\t0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4,\n\t0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E,\t0xD3DE, 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE,\n\t0xD3E2, 0x903E, 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D,\t0xD3E6, 0x6E14, 0xD3E7, 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31,\n\t0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9,\t0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, 0x7FBD, 0xD3F1, 0x7389,\n\t0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, 0xD3F5, 0x5401,\t0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, 0x5FA1,\n\t0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2,\t0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20,\n\t0xD443, 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24,\t0xD447, 0x8A25, 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28,\n\t0xD44B, 0x8A29, 0xD44C, 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C,\t0xD44F, 0x8A2D, 0xD450, 0x8A2E, 0xD451, 0x8A2F, 0xD452, 0x8A30,\n\t0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, 0x8A33, 0xD456, 0x8A34,\t0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, 0xD45A, 0x8A38,\n\t0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, 0x8A3C,\t0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41,\n\t0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45,\t0xD467, 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A,\n\t0xD46B, 0x8A4B, 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E,\t0xD46F, 0x8A4F, 0xD470, 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52,\n\t0xD473, 0x8A53, 0xD474, 0x8A54, 0xD475, 0x8A55, 0xD476, 0x8A56,\t0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, 0x8A59, 0xD47A, 0x8A5A,\n\t0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, 0xD47E, 0x8A5E,\t0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, 0x8A62,\n\t0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66,\t0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A,\n\t0xD48C, 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E,\t0xD490, 0x8A6F, 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72,\n\t0xD494, 0x8A73, 0xD495, 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76,\t0xD498, 0x8A77, 0xD499, 0x8A78, 0xD49A, 0x8A7A, 0xD49B, 0x8A7B,\n\t0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, 0x8A7E, 0xD49F, 0x8A7F,\t0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, 0xD4A3, 0x88D5,\n\t0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, 0x9E33,\t0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3,\n\t0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95,\t0xD4B0, 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F,\n\t0xD4B4, 0x6E90, 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1,\t0xD4B8, 0x613F, 0xD4B9, 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0,\n\t0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5,\t0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, 0x6708, 0xD4C3, 0x60A6,\n\t0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, 0xD4C7, 0x90E7,\t0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, 0x8FD0,\n\t0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5,\t0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742,\n\t0xD4D4, 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0,\t0xD4D8, 0x8F7D, 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1,\n\t0xD4DC, 0x6512, 0xD4DD, 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43,\t0xD4E0, 0x810F, 0xD4E1, 0x846C, 0xD4E2, 0x906D, 0xD4E3, 0x7CDF,\n\t0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, 0x67A3, 0xD4E7, 0x65E9,\t0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, 0xD4EB, 0x566A,\n\t0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, 0x71E5,\t0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD,\n\t0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E,\t0xD4F8, 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3,\n\t0xD4FC, 0x6E23, 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81,\t0xD541, 0x8A82, 0xD542, 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85,\n\t0xD545, 0x8A86, 0xD546, 0x8A87, 0xD547, 0x8A88, 0xD548, 0x8A8B,\t0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, 0x8A8E, 0xD54C, 0x8A8F,\n\t0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, 0xD550, 0x8A94,\t0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, 0x8A98,\n\t0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C,\t0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0,\n\t0xD55D, 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4,\t0xD561, 0x8AA5, 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8,\n\t0xD565, 0x8AA9, 0xD566, 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC,\t0xD569, 0x8AAD, 0xD56A, 0x8AAE, 0xD56B, 0x8AAF, 0xD56C, 0x8AB0,\n\t0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, 0x8AB3, 0xD570, 0x8AB4,\t0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, 0xD574, 0x8AB8,\n\t0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, 0x8ABC,\t0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0,\n\t0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4,\t0xD582, 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8,\n\t0xD586, 0x8AC9, 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC,\t0xD58A, 0x8ACD, 0xD58B, 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0,\n\t0xD58E, 0x8AD1, 0xD58F, 0x8AD2, 0xD590, 0x8AD3, 0xD591, 0x8AD4,\t0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, 0x8AD7, 0xD595, 0x8AD8,\n\t0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, 0xD599, 0x8ADC,\t0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, 0x8AE0,\n\t0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1,\t0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8,\n\t0xD5A6, 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8,\t0xD5AA, 0x6458, 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84,\n\t0xD5AE, 0x503A, 0xD5AF, 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1,\t0xD5B2, 0x8A79, 0xD5B3, 0x7C98, 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF,\n\t0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, 0x5D2D, 0xD5B9, 0x5C55,\t0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, 0xD5BD, 0x6218,\n\t0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, 0x6A1F,\t0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20,\n\t0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08,\t0xD5CA, 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0,\n\t0xD5CE, 0x7634, 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D,\t0xD5D2, 0x627E, 0xD5D3, 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167,\n\t0xD5D6, 0x7F69, 0xD5D7, 0x5146, 0xD5D8, 0x8087, 0xD5D9, 0x53EC,\t0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, 0x54F2, 0xD5DD, 0x86F0,\n\t0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, 0xD5E1, 0x8517,\t0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, 0x659F,\n\t0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB,\t0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795,\n\t0xD5EE, 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F,\t0xD5F2, 0x9547, 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323,\n\t0xD5F6, 0x7741, 0xD5F7, 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89,\t0xD5FA, 0x6014, 0xD5FB, 0x6574, 0xD5FC, 0x62EF, 0xD5FD, 0x6B63,\n\t0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, 0x8AE5, 0xD642, 0x8AE6,\t0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, 0xD646, 0x8AEA,\n\t0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, 0x8AEE,\t0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2,\n\t0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6,\t0xD653, 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA,\n\t0xD657, 0x8AFB, 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE,\t0xD65B, 0x8AFF, 0xD65C, 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02,\n\t0xD65F, 0x8B03, 0xD660, 0x8B04, 0xD661, 0x8B05, 0xD662, 0x8B06,\t0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, 0x8B0A, 0xD666, 0x8B0B,\n\t0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, 0xD66A, 0x8B0F,\t0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, 0x8B13,\n\t0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17,\t0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B,\n\t0xD677, 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F,\t0xD67B, 0x8B20, 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23,\n\t0xD680, 0x8B24, 0xD681, 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28,\t0xD684, 0x8B29, 0xD685, 0x8B2A, 0xD686, 0x8B2B, 0xD687, 0x8B2C,\n\t0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, 0x8B2F, 0xD68B, 0x8B30,\t0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, 0xD68F, 0x8B34,\n\t0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, 0x8B38,\t0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C,\n\t0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40,\t0xD69C, 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44,\n\t0xD6A0, 0x8B45, 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1,\t0xD6A4, 0x8BC1, 0xD6A5, 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F,\n\t0xD6A8, 0x5431, 0xD6A9, 0x8718, 0xD6AA, 0x77E5, 0xD6AB, 0x80A2,\t0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, 0x4E4B, 0xD6AF, 0x7EC7,\n\t0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, 0xD6B3, 0x6B96,\t0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, 0x5740,\n\t0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA,\t0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A,\n\t0xD6C0, 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E,\t0xD6C4, 0x5E1C, 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A,\n\t0xD6C8, 0x79E9, 0xD6C9, 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099,\t0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92,\n\t0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, 0x5FE0, 0xD6D3, 0x949F,\t0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, 0xD6D7, 0x80BF,\n\t0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, 0x821F,\t0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC,\n\t0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A,\t0xD6E4, 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C,\n\t0xD6E8, 0x9AA4, 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB,\t0xD6EC, 0x6731, 0xD6ED, 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB,\n\t0xD6F0, 0x9010, 0xD6F1, 0x7AF9, 0xD6F2, 0x70DB, 0xD6F3, 0x716E,\t0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, 0x5631, 0xD6F7, 0x4E3B,\n\t0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, 0xD6FB, 0x86C0,\t0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, 0x8B46,\n\t0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A,\t0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E,\n\t0xD749, 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52,\t0xD74D, 0x8B53, 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56,\n\t0xD751, 0x8B57, 0xD752, 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A,\t0xD755, 0x8B5B, 0xD756, 0x8B5C, 0xD757, 0x8B5D, 0xD758, 0x8B5E,\n\t0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, 0x8B61, 0xD75C, 0x8B62,\t0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, 0xD760, 0x8B67,\n\t0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, 0x8B6B,\t0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70,\n\t0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74,\t0xD76D, 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78,\n\t0xD771, 0x8B79, 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C,\t0xD775, 0x8B7D, 0xD776, 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80,\n\t0xD779, 0x8B81, 0xD77A, 0x8B82, 0xD77B, 0x8B83, 0xD77C, 0x8B84,\t0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, 0x8B87, 0xD781, 0x8B88,\n\t0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, 0xD785, 0x8B8C,\t0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, 0x8B90,\n\t0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94,\t0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98,\n\t0xD792, 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C,\t0xD796, 0x8B9D, 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC,\n\t0xD79A, 0x8BB1, 0xD79B, 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0,\t0xD79E, 0x8BEA, 0xD79F, 0x8C09, 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F,\n\t0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, 0x9A7B, 0xD7A5, 0x6293,\t0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, 0xD7A9, 0x7816,\n\t0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, 0x7BC6,\t0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986,\n\t0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E,\t0xD7B6, 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760,\n\t0xD7BA, 0x7F00, 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349,\t0xD7BE, 0x62D9, 0xD7BF, 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422,\n\t0xD7C2, 0x8301, 0xD7C3, 0x914C, 0xD7C4, 0x5544, 0xD7C5, 0x7740,\t0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, 0x5179, 0xD7C9, 0x54A8,\n\t0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, 0xD7CD, 0x6DC4,\t0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, 0x7C7D,\n\t0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D,\t0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A,\n\t0xD7DA, 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5,\t0xD7DE, 0x90B9, 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD,\n\t0xD7E2, 0x79DF, 0xD7E3, 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF,\t0xD7E6, 0x7956, 0xD7E7, 0x8BC5, 0xD7E8, 0x963B, 0xD7E9, 0x7EC4,\n\t0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, 0x5634, 0xD7ED, 0x9189,\t0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, 0xD7F1, 0x9075,\n\t0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, 0x67DE,\t0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7,\n\t0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B,\t0xD844, 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F,\n\t0xD848, 0x8C40, 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44,\t0xD84C, 0x8C45, 0xD84D, 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B,\n\t0xD850, 0x8C4D, 0xD851, 0x8C4E, 0xD852, 0x8C4F, 0xD853, 0x8C50,\t0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, 0x8C53, 0xD857, 0x8C54,\n\t0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, 0xD85B, 0x8C59,\t0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, 0x8C5E,\n\t0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64,\t0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68,\n\t0xD868, 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E,\t0xD86C, 0x8C6F, 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72,\n\t0xD870, 0x8C74, 0xD871, 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77,\t0xD874, 0x8C7B, 0xD875, 0x8C7C, 0xD876, 0x8C7D, 0xD877, 0x8C7E,\n\t0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, 0x8C81, 0xD87B, 0x8C83,\t0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, 0xD880, 0x8C88,\n\t0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, 0x8C8F,\t0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93,\n\t0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99,\t0xD88D, 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D,\n\t0xD891, 0x8C9E, 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1,\t0xD895, 0x8CA2, 0xD896, 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5,\n\t0xD899, 0x8CA6, 0xD89A, 0x8CA7, 0xD89B, 0x8CA8, 0xD89C, 0x8CA9,\t0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, 0x8CAC, 0xD8A0, 0x8CAD,\n\t0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, 0xD8A4, 0x4E10,\t0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, 0x4E98,\n\t0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669,\t0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315,\n\t0xD8B1, 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E,\t0xD8B5, 0x6C10, 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997,\n\t0xD8B9, 0x6BD3, 0xD8BA, 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36,\t0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69,\n\t0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, 0x5B5B, 0xD8C4, 0x556C,\t0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, 0xD8C8, 0x539D,\n\t0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, 0x9765,\t0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326,\n\t0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366,\t0xD8D5, 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E,\n\t0xD8D9, 0x522D, 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240,\t0xD8DD, 0x524C, 0xD8DE, 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C,\n\t0xD8E1, 0x84AF, 0xD8E2, 0x527D, 0xD8E3, 0x5282, 0xD8E4, 0x5281,\t0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, 0x5182, 0xD8E8, 0x7F54,\n\t0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, 0xD8EC, 0x4EC2,\t0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, 0x4EDE,\n\t0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64,\t0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09,\n\t0xD8F9, 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538,\t0xD8FD, 0x4F5A, 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF,\n\t0xD942, 0x8CB0, 0xD943, 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3,\t0xD946, 0x8CB4, 0xD947, 0x8CB5, 0xD948, 0x8CB6, 0xD949, 0x8CB7,\n\t0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, 0x8CBA, 0xD94D, 0x8CBB,\t0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, 0xD951, 0x8CBF,\n\t0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, 0x8CC3,\t0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7,\n\t0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB,\t0xD95E, 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF,\n\t0xD962, 0x8CD0, 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3,\t0xD966, 0x8CD4, 0xD967, 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7,\n\t0xD96A, 0x8CD8, 0xD96B, 0x8CD9, 0xD96C, 0x8CDA, 0xD96D, 0x8CDB,\t0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, 0x8CDE, 0xD971, 0x8CDF,\n\t0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, 0xD975, 0x8CE3,\t0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, 0x8CE7,\n\t0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB,\t0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF,\n\t0xD983, 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3,\t0xD987, 0x8CF4, 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7,\n\t0xD98B, 0x8CF8, 0xD98C, 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB,\t0xD98F, 0x8CFC, 0xD990, 0x8CFD, 0xD991, 0x8CFE, 0xD992, 0x8CFF,\n\t0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, 0x8D02, 0xD996, 0x8D03,\t0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, 0xD99A, 0x8D07,\n\t0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, 0x8D0B,\t0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57,\n\t0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74,\t0xD9A7, 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F,\n\t0xD9AB, 0x4F7E, 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C,\t0xD9AF, 0x4FAC, 0xD9B0, 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8,\n\t0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3,\t0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, 0x4FDF, 0xD9BA, 0x4FF8,\n\t0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, 0xD9BE, 0x502C,\t0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, 0x4FFE,\n\t0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028,\t0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048,\n\t0xD9CB, 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5,\t0xD9CF, 0x50A7, 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6,\n\t0xD9D3, 0x5106, 0xD9D4, 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6,\t0xD9D7, 0x50EE, 0xD9D8, 0x5107, 0xD9D9, 0x510B, 0xD9DA, 0x4EDD,\n\t0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, 0x4F65, 0xD9DE, 0x4FCE,\t0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, 0xD9E2, 0x516E,\n\t0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, 0x5181,\t0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07,\n\t0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155,\t0xD9EF, 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E,\n\t0xD9F3, 0x88A4, 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2,\t0xD9F7, 0x7980, 0xD9F8, 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8,\n\t0xD9FB, 0x51AB, 0xD9FC, 0x51B1, 0xD9FD, 0x51BD, 0xD9FE, 0x51BC,\t0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, 0x8D10, 0xDA43, 0x8D11,\n\t0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, 0xDA47, 0x8D15,\t0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, 0x8D19,\n\t0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20,\t0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F,\n\t0xDA54, 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A,\t0xDA58, 0x8D6C, 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71,\n\t0xDA5C, 0x8D72, 0xDA5D, 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A,\t0xDA60, 0x8D7B, 0xDA61, 0x8D7C, 0xDA62, 0x8D7D, 0xDA63, 0x8D7E,\n\t0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, 0x8D82, 0xDA67, 0x8D83,\t0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, 0xDA6B, 0x8D89,\n\t0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, 0x8D8F,\t0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95,\n\t0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99,\t0xDA78, 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D,\n\t0xDA7C, 0x8D9E, 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2,\t0xDA81, 0x8DA4, 0xDA82, 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7,\n\t0xDA85, 0x8DA8, 0xDA86, 0x8DA9, 0xDA87, 0x8DAA, 0xDA88, 0x8DAB,\t0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, 0x8DAE, 0xDA8C, 0x8DAF,\n\t0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, 0xDA90, 0x8DB7,\t0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, 0x8DC0,\n\t0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7,\t0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD,\n\t0xDA9D, 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4,\t0xDAA1, 0x51C7, 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5,\n\t0xDAA5, 0x8BA0, 0xDAA6, 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA,\t0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2,\n\t0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, 0x8BCF, 0xDAB0, 0x8BCE,\t0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, 0xDAB4, 0x8BD6,\n\t0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, 0x8BDF,\t0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9,\n\t0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6,\t0xDAC1, 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00,\n\t0xDAC5, 0x8C02, 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C,\t0xDAC9, 0x8C0F, 0xDACA, 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14,\n\t0xDACD, 0x8C15, 0xDACE, 0x8C16, 0xDACF, 0x8C19, 0xDAD0, 0x8C1B,\t0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, 0x8C1F, 0xDAD4, 0x8C20,\n\t0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, 0xDAD8, 0x8C2A,\t0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, 0x8C32,\n\t0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369,\t0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621,\n\t0xDAE5, 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C,\t0xDAE9, 0x9642, 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F,\n\t0xDAED, 0x9667, 0xDAEE, 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674,\t0xDAF1, 0x9688, 0xDAF2, 0x968D, 0xDAF3, 0x9697, 0xDAF4, 0x96B0,\n\t0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, 0x909D, 0xDAF8, 0x9099,\t0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, 0xDAFC, 0x90B3,\n\t0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, 0x8DD8,\t0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1,\n\t0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7,\t0xDB4A, 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0,\n\t0xDB4E, 0x8DF1, 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6,\t0xDB52, 0x8DFC, 0xDB53, 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00,\n\t0xDB56, 0x8E01, 0xDB57, 0x8E02, 0xDB58, 0x8E03, 0xDB59, 0x8E04,\t0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, 0x8E08, 0xDB5D, 0x8E0B,\n\t0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, 0xDB61, 0x8E11,\t0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, 0x8E16,\n\t0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A,\t0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21,\n\t0xDB6E, 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27,\t0xDB72, 0x8E28, 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30,\n\t0xDB76, 0x8E32, 0xDB77, 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36,\t0xDB7A, 0x8E37, 0xDB7B, 0x8E38, 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C,\n\t0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, 0x8E43, 0xDB82, 0x8E45,\t0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, 0xDB86, 0x8E4E,\n\t0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, 0x8E54,\t0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58,\n\t0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D,\t0xDB93, 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61,\n\t0xDB97, 0x8E62, 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65,\t0xDB9B, 0x8E67, 0xDB9C, 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B,\n\t0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, 0xDBA1, 0x90B8, 0xDBA2, 0x90B0,\t0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, 0x90BE, 0xDBA6, 0x90D0,\n\t0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, 0xDBAA, 0x90E6,\t0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, 0x90DB,\n\t0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104,\t0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131,\n\t0xDBB7, 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146,\t0xDBBB, 0x520D, 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC,\n\t0xDBBF, 0x52AD, 0xDBC0, 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0,\t0xDBC3, 0x52D6, 0xDBC4, 0x52F0, 0xDBC5, 0x53DF, 0xDBC6, 0x71EE,\n\t0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, 0x51F5, 0xDBCA, 0x51FC,\t0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, 0xDBCE, 0x755A,\n\t0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, 0x57A1,\t0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1,\n\t0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733,\t0xDBDB, 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C,\n\t0xDBDF, 0x573B, 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785,\t0xDBE3, 0x576B, 0xDBE4, 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B,\n\t0xDBE7, 0x5768, 0xDBE8, 0x576D, 0xDBE9, 0x5776, 0xDBEA, 0x5773,\t0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, 0x578C, 0xDBEE, 0x57B2,\n\t0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, 0xDBF2, 0x5793,\t0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, 0x57DA,\n\t0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4,\t0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD,\n\t0xDC40, 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78,\t0xDC44, 0x8E79, 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D,\n\t0xDC48, 0x8E7E, 0xDC49, 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83,\t0xDC4C, 0x8E84, 0xDC4D, 0x8E86, 0xDC4E, 0x8E88, 0xDC4F, 0x8E89,\n\t0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, 0x8E8C, 0xDC53, 0x8E8D,\t0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, 0xDC57, 0x8E93,\n\t0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, 0x8E98,\t0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D,\n\t0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2,\t0xDC64, 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6,\n\t0xDC68, 0x8EA7, 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA,\t0xDC6C, 0x8EAD, 0xDC6D, 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1,\n\t0xDC70, 0x8EB3, 0xDC71, 0x8EB4, 0xDC72, 0x8EB5, 0xDC73, 0x8EB6,\t0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, 0x8EB9, 0xDC77, 0x8EBB,\n\t0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, 0xDC7B, 0x8EBF,\t0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, 0x8EC3,\n\t0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7,\t0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB,\n\t0xDC89, 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0,\t0xDC8D, 0x8ED1, 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4,\n\t0xDC91, 0x8ED5, 0xDC92, 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8,\t0xDC95, 0x8ED9, 0xDC96, 0x8EDA, 0xDC97, 0x8EDB, 0xDC98, 0x8EDC,\n\t0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, 0x8EDF, 0xDC9C, 0x8EE0,\t0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, 0xDCA0, 0x8EE4,\n\t0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, 0x57ED,\t0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844,\n\t0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881,\t0xDCAD, 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8,\n\t0xDCB1, 0x9F19, 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D,\t0xDCB5, 0x827F, 0xDCB6, 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8,\n\t0xDCB9, 0x8284, 0xDCBA, 0x828E, 0xDCBB, 0x8291, 0xDCBC, 0x8297,\t0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, 0x82B8, 0xDCC0, 0x82BE,\n\t0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, 0xDCC4, 0x82E3,\t0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, 0x82CB,\n\t0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4,\t0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4,\n\t0xDCD1, 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309,\t0xDCD5, 0x82F7, 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307,\n\t0xDCD9, 0x82DC, 0xDCDA, 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8,\t0xDCDD, 0x830C, 0xDCDE, 0x82FB, 0xDCDF, 0x82D3, 0xDCE0, 0x8311,\n\t0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, 0x8314, 0xDCE4, 0x8315,\t0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, 0xDCE8, 0x8351,\n\t0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, 0x8392,\t0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B,\n\t0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347,\t0xDCF5, 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317,\n\t0xDCF9, 0x8360, 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333,\t0xDCFD, 0x8366, 0xDCFE, 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6,\n\t0xDD42, 0x8EE7, 0xDD43, 0x8EE8, 0xDD44, 0x8EE9, 0xDD45, 0x8EEA,\t0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, 0x8EED, 0xDD49, 0x8EEE,\n\t0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, 0xDD4D, 0x8EF2,\t0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, 0x8EF6,\n\t0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA,\t0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE,\n\t0xDD5A, 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02,\t0xDD5E, 0x8F03, 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06,\n\t0xDD62, 0x8F07, 0xDD63, 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A,\t0xDD66, 0x8F0B, 0xDD67, 0x8F0C, 0xDD68, 0x8F0D, 0xDD69, 0x8F0E,\n\t0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, 0x8F11, 0xDD6D, 0x8F12,\t0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, 0xDD71, 0x8F16,\n\t0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, 0x8F1A,\t0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E,\n\t0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22,\t0xDD7E, 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26,\n\t0xDD83, 0x8F27, 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A,\t0xDD87, 0x8F2B, 0xDD88, 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E,\n\t0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, 0xDD8D, 0x8F31, 0xDD8E, 0x8F32,\t0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, 0x8F35, 0xDD92, 0x8F36,\n\t0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, 0xDD96, 0x8F3A,\t0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, 0x8F3E,\n\t0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42,\t0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B,\n\t0xDDA3, 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D,\t0xDDA7, 0x836E, 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3,\n\t0xDDAB, 0x83B4, 0xDDAC, 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393,\t0xDDAF, 0x839C, 0xDDB0, 0x8385, 0xDDB1, 0x837C, 0xDDB2, 0x83B6,\n\t0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, 0x83B8, 0xDDB6, 0x837B,\t0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, 0xDDBA, 0x83BA,\n\t0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, 0x83E5,\t0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B,\n\t0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C,\t0xDDC7, 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4,\n\t0xDDCB, 0x83DF, 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8,\t0xDDCF, 0x83F9, 0xDDD0, 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0,\n\t0xDDD3, 0x8426, 0xDDD4, 0x83F0, 0xDDD5, 0x83E1, 0xDDD6, 0x845C,\t0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, 0x8459, 0xDDDA, 0x8473,\n\t0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, 0xDDDE, 0x8489,\t0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, 0x8469,\n\t0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431,\t0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0,\n\t0xDDEB, 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA,\t0xDDEF, 0x84BF, 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1,\n\t0xDDF3, 0x84B9, 0xDDF4, 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5,\t0xDDF7, 0x84E3, 0xDDF8, 0x850C, 0xDDF9, 0x750D, 0xDDFA, 0x8538,\n\t0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, 0x851F, 0xDDFE, 0x853A,\t0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, 0xDE43, 0x8F48,\n\t0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, 0x8F4C,\t0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50,\n\t0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54,\t0xDE50, 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58,\n\t0xDE54, 0x8F59, 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C,\t0xDE58, 0x8F5D, 0xDE59, 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60,\n\t0xDE5C, 0x8F61, 0xDE5D, 0x8F62, 0xDE5E, 0x8F63, 0xDE5F, 0x8F64,\t0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, 0x8F80, 0xDE63, 0x8F8C,\n\t0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, 0xDE67, 0x8FA1,\t0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, 0x8FA6,\n\t0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD,\t0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3,\n\t0xDE74, 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8,\t0xDE78, 0x8FBA, 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF,\n\t0xDE7C, 0x8FC0, 0xDE7D, 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9,\t0xDE81, 0x8FCA, 0xDE82, 0x8FCB, 0xDE83, 0x8FCC, 0xDE84, 0x8FCD,\n\t0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, 0x8FD6, 0xDE88, 0x8FD7,\t0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, 0xDE8C, 0x8FE3,\n\t0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, 0x8FF1,\t0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6,\n\t0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE,\t0xDE99, 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C,\n\t0xDE9D, 0x900E, 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018,\t0xDEA1, 0x8556, 0xDEA2, 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC,\n\t0xDEA5, 0x8559, 0xDEA6, 0x8548, 0xDEA7, 0x8568, 0xDEA8, 0x8564,\t0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, 0x77A2, 0xDEAC, 0x8543,\n\t0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, 0xDEB0, 0x85A8,\t0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, 0x85AE,\n\t0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7,\t0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC,\n\t0xDEBD, 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629,\t0xDEC1, 0x8616, 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08,\n\t0xDEC5, 0x593C, 0xDEC6, 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955,\t0xDEC9, 0x595A, 0xDECA, 0x5958, 0xDECB, 0x530F, 0xDECC, 0x5C22,\n\t0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, 0x5C34, 0xDED0, 0x624C,\t0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, 0xDED4, 0x62CA,\n\t0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, 0x6322,\t0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343,\n\t0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A,\t0xDEE1, 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC,\n\t0xDEE5, 0x638A, 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC,\t0xDEE9, 0x63F2, 0xDEEA, 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF,\n\t0xDEED, 0x63C4, 0xDEEE, 0x63DE, 0xDEEF, 0x63CE, 0xDEF0, 0x6452,\t0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, 0x6445, 0xDEF4, 0x6441,\n\t0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, 0xDEF8, 0x640C,\t0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, 0x6484,\n\t0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C,\t0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027,\n\t0xDF46, 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B,\t0xDF4A, 0x902C, 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032,\n\t0xDF4E, 0x9033, 0xDF4F, 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039,\t0xDF52, 0x903A, 0xDF53, 0x903D, 0xDF54, 0x903F, 0xDF55, 0x9040,\n\t0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, 0x9046, 0xDF59, 0x9048,\t0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, 0xDF5D, 0x904C,\n\t0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, 0x9056,\t0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D,\n\t0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061,\t0xDF6A, 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069,\n\t0xDF6E, 0x906A, 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F,\t0xDF72, 0x9070, 0xDF73, 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073,\n\t0xDF76, 0x9076, 0xDF77, 0x9077, 0xDF78, 0x9078, 0xDF79, 0x9079,\t0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, 0x907C, 0xDF7D, 0x907E,\n\t0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, 0xDF82, 0x9086,\t0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, 0x908C,\n\t0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090,\t0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098,\n\t0xDF8F, 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F,\t0xDF93, 0x90A0, 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7,\n\t0xDF97, 0x90A8, 0xDF98, 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD,\t0xDF9B, 0x90B2, 0xDF9C, 0x90B7, 0xDF9D, 0x90BC, 0xDF9E, 0x90BD,\n\t0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, 0x647A, 0xDFA2, 0x64B7,\t0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, 0xDFA6, 0x64C0,\n\t0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, 0x64E2,\t0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B,\n\t0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F,\t0xDFB3, 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8,\n\t0xDFB7, 0x53FB, 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406,\t0xDFBB, 0x544B, 0xDFBC, 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454,\n\t0xDFBF, 0x5456, 0xDFC0, 0x5443, 0xDFC1, 0x5421, 0xDFC2, 0x5457,\t0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, 0x5432, 0xDFC6, 0x5482,\n\t0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, 0xDFCA, 0x5464,\t0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, 0x5476,\n\t0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD,\t0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7,\n\t0xDFD7, 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472,\t0xDFDB, 0x54A3, 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF,\n\t0xDFDF, 0x54CC, 0xDFE0, 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC,\t0xDFE3, 0x54A9, 0xDFE4, 0x54AA, 0xDFE5, 0x54A4, 0xDFE6, 0x54DD,\n\t0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, 0x551B, 0xDFEA, 0x54E7,\t0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, 0xDFEE, 0x54F3,\n\t0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, 0x5511,\t0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F,\n\t0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541,\t0xDFFB, 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C,\n\t0xE040, 0x90C2, 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8,\t0xE044, 0x90C9, 0xE045, 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD,\n\t0xE048, 0x90D2, 0xE049, 0x90D4, 0xE04A, 0x90D5, 0xE04B, 0x90D6,\t0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, 0x90DA, 0xE04F, 0x90DE,\n\t0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, 0xE053, 0x90E4,\t0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, 0x90EC,\n\t0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2,\t0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7,\n\t0xE060, 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC,\t0xE064, 0x90FF, 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103,\n\t0xE068, 0x9105, 0xE069, 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108,\t0xE06C, 0x9109, 0xE06D, 0x910A, 0xE06E, 0x910B, 0xE06F, 0x910C,\n\t0xE070, 0x910D, 0xE071, 0x910E, 0xE072, 0x910F, 0xE073, 0x9110,\t0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, 0xE077, 0x9114,\n\t0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, 0x9118,\t0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D,\n\t0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124,\t0xE085, 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128,\n\t0xE089, 0x9129, 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C,\t0xE08D, 0x912D, 0xE08E, 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132,\n\t0xE091, 0x9133, 0xE092, 0x9134, 0xE093, 0x9135, 0xE094, 0x9136,\t0xE095, 0x9137, 0xE096, 0x9138, 0xE097, 0x913A, 0xE098, 0x913B,\n\t0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, 0xE09C, 0x913F,\t0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, 0x9144,\n\t0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576,\t0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C,\n\t0xE0A9, 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1,\t0xE0AD, 0x55B9, 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F,\n\t0xE0B1, 0x557E, 0xE0B2, 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B,\t0xE0B5, 0x55DF, 0xE0B6, 0x55BD, 0xE0B7, 0x55BE, 0xE0B8, 0x5594,\n\t0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, 0x55F7, 0xE0BC, 0x55C9,\t0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, 0xE0C0, 0x55EC,\n\t0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, 0x55C4,\t0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3,\n\t0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5,\t0xE0CD, 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608,\n\t0xE0D1, 0x560C, 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623,\t0xE0D5, 0x55FE, 0xE0D6, 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D,\n\t0xE0D9, 0x5658, 0xE0DA, 0x5639, 0xE0DB, 0x5657, 0xE0DC, 0x562C,\t0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, 0x5659, 0xE0E0, 0x565C,\n\t0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, 0xE0E4, 0x5664,\t0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, 0x567C,\n\t0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4,\t0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5,\n\t0xE0F1, 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704,\t0xE0F5, 0x570A, 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F,\n\t0xE0F9, 0x5E19, 0xE0FA, 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31,\t0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, 0xE140, 0x9145, 0xE141, 0x9147,\n\t0xE142, 0x9148, 0xE143, 0x9151, 0xE144, 0x9153, 0xE145, 0x9154,\t0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, 0xE149, 0x9159,\n\t0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, 0x9160,\t0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B,\n\t0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B,\t0xE156, 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182,\n\t0xE15A, 0x9183, 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188,\t0xE15E, 0x918A, 0xE15F, 0x918E, 0xE160, 0x918F, 0xE161, 0x9193,\n\t0xE162, 0x9194, 0xE163, 0x9195, 0xE164, 0x9196, 0xE165, 0x9197,\t0xE166, 0x9198, 0xE167, 0x9199, 0xE168, 0x919C, 0xE169, 0x919D,\n\t0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, 0xE16D, 0x91A1,\t0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, 0x91A7,\n\t0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC,\t0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3,\n\t0xE17A, 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9,\t0xE17E, 0x91BB, 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE,\n\t0xE183, 0x91BF, 0xE184, 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2,\t0xE187, 0x91C3, 0xE188, 0x91C4, 0xE189, 0x91C5, 0xE18A, 0x91C6,\n\t0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, 0x91D0, 0xE18E, 0x91D2,\t0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, 0xE192, 0x91D6,\n\t0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, 0x91DA,\t0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF,\n\t0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3,\t0xE19F, 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44,\n\t0xE1A3, 0x5E54, 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61,\t0xE1A7, 0x5C8C, 0xE1A8, 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90,\n\t0xE1AB, 0x5C96, 0xE1AC, 0x5C88, 0xE1AD, 0x5C98, 0xE1AE, 0x5C99,\t0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, 0x5C9C, 0xE1B2, 0x5CB5,\n\t0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, 0xE1B6, 0x5CAB,\t0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, 0x5CB7,\n\t0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB,\t0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27,\n\t0xE1C3, 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E,\t0xE1C7, 0x5D06, 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E,\n\t0xE1CB, 0x5D34, 0xE1CC, 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B,\t0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B,\n\t0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, 0x5D74, 0xE1D6, 0x5D82,\t0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, 0xE1DA, 0x5DB7,\n\t0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, 0x5F82,\t0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95,\n\t0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD,\t0xE1E7, 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61,\n\t0xE1EB, 0x72AD, 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7,\t0xE1EF, 0x72B8, 0xE1F0, 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE,\n\t0xE1F3, 0x72CD, 0xE1F4, 0x72D2, 0xE1F5, 0x72E8, 0xE1F6, 0x72EF,\t0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, 0x72F4, 0xE1FA, 0x72F7,\n\t0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, 0xE1FE, 0x72FA,\t0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, 0x91E9,\n\t0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED,\t0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1,\n\t0xE24C, 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5,\t0xE250, 0x91F6, 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9,\n\t0xE254, 0x91FA, 0xE255, 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD,\t0xE258, 0x91FE, 0xE259, 0x91FF, 0xE25A, 0x9200, 0xE25B, 0x9201,\n\t0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, 0x9204, 0xE25F, 0x9205,\t0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, 0xE263, 0x9209,\n\t0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, 0x920D,\t0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211,\n\t0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215,\t0xE270, 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219,\n\t0xE274, 0x921A, 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D,\t0xE278, 0x921E, 0xE279, 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221,\n\t0xE27C, 0x9222, 0xE27D, 0x9223, 0xE27E, 0x9224, 0xE280, 0x9225,\t0xE281, 0x9226, 0xE282, 0x9227, 0xE283, 0x9228, 0xE284, 0x9229,\n\t0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, 0xE288, 0x922D,\t0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, 0x9231,\n\t0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235,\t0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239,\n\t0xE295, 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D,\t0xE299, 0x923E, 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241,\n\t0xE29D, 0x9242, 0xE29E, 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245,\t0xE2A1, 0x72FB, 0xE2A2, 0x7317, 0xE2A3, 0x7313, 0xE2A4, 0x7321,\n\t0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, 0x731D, 0xE2A8, 0x7315,\t0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, 0xE2AC, 0x732C,\n\t0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, 0x734D,\t0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F,\n\t0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7,\t0xE2B9, 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967,\n\t0xE2BD, 0x9968, 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B,\t0xE2C1, 0x996C, 0xE2C2, 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D,\n\t0xE2C5, 0x9980, 0xE2C6, 0x9984, 0xE2C7, 0x9987, 0xE2C8, 0x998A,\t0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, 0x9991, 0xE2CC, 0x9993,\n\t0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, 0xE2D0, 0x5E91,\t0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, 0x5EA0,\n\t0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3,\t0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB,\n\t0xE2DD, 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4,\t0xE2E1, 0x5FC9, 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003,\n\t0xE2E5, 0x5FEE, 0xE2E6, 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4,\t0xE2E9, 0x5FFE, 0xE2EA, 0x6005, 0xE2EB, 0x6006, 0xE2EC, 0x5FEA,\n\t0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, 0x6019, 0xE2F0, 0x6035,\t0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, 0xE2F4, 0x600D,\n\t0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, 0x603F,\t0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B,\n\t0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247,\t0xE342, 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B,\n\t0xE346, 0x924C, 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F,\t0xE34A, 0x9250, 0xE34B, 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253,\n\t0xE34E, 0x9254, 0xE34F, 0x9255, 0xE350, 0x9256, 0xE351, 0x9257,\t0xE352, 0x9258, 0xE353, 0x9259, 0xE354, 0x925A, 0xE355, 0x925B,\n\t0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, 0xE359, 0x925F,\t0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, 0x9263,\n\t0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267,\t0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B,\n\t0xE366, 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F,\t0xE36A, 0x9270, 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273,\n\t0xE36E, 0x9275, 0xE36F, 0x9276, 0xE370, 0x9277, 0xE371, 0x9278,\t0xE372, 0x9279, 0xE373, 0x927A, 0xE374, 0x927B, 0xE375, 0x927C,\n\t0xE376, 0x927D, 0xE377, 0x927E, 0xE378, 0x927F, 0xE379, 0x9280,\t0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, 0xE37D, 0x9284,\n\t0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, 0x9288,\t0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C,\n\t0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291,\t0xE38B, 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295,\n\t0xE38F, 0x9296, 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299,\t0xE393, 0x929A, 0xE394, 0x929B, 0xE395, 0x929C, 0xE396, 0x929D,\n\t0xE397, 0x929E, 0xE398, 0x929F, 0xE399, 0x92A0, 0xE39A, 0x92A1,\t0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, 0x92A4, 0xE39E, 0x92A5,\n\t0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, 0xE3A2, 0x607D,\t0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, 0x609D,\n\t0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B,\t0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD,\n\t0xE3AF, 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4,\t0xE3B3, 0x6120, 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123,\n\t0xE3B7, 0x60F4, 0xE3B8, 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B,\t0xE3BB, 0x614A, 0xE3BC, 0x6175, 0xE3BD, 0x61AC, 0xE3BE, 0x6194,\n\t0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, 0x61D4, 0xE3C2, 0x61F5,\t0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, 0xE3C6, 0x95EB,\n\t0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, 0x95F6,\t0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604,\n\t0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B,\t0xE3D3, 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612,\n\t0xE3D7, 0x9615, 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619,\t0xE3DB, 0x961A, 0xE3DC, 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215,\n\t0xE3DF, 0x6C35, 0xE3E0, 0x6C54, 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A,\t0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, 0x6C90, 0xE3E6, 0x6C94,\n\t0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, 0xE3EA, 0x6C74,\t0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, 0x6CD0,\n\t0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8,\t0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0,\n\t0xE3F7, 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE,\t0xE3FB, 0x6CB1, 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE,\n\t0xE440, 0x92A8, 0xE441, 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB,\t0xE444, 0x92AC, 0xE445, 0x92AD, 0xE446, 0x92AF, 0xE447, 0x92B0,\n\t0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, 0x92B3, 0xE44B, 0x92B4,\t0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, 0xE44F, 0x92B8,\n\t0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, 0x92BC,\t0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0,\n\t0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4,\t0xE45C, 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9,\n\t0xE460, 0x92CA, 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD,\t0xE464, 0x92CE, 0xE465, 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1,\n\t0xE468, 0x92D2, 0xE469, 0x92D3, 0xE46A, 0x92D4, 0xE46B, 0x92D5,\t0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, 0x92D8, 0xE46F, 0x92D9,\n\t0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, 0xE473, 0x92DD,\t0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, 0x92E1,\n\t0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5,\t0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9,\n\t0xE481, 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED,\t0xE485, 0x92EE, 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1,\n\t0xE489, 0x92F2, 0xE48A, 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5,\t0xE48D, 0x92F6, 0xE48E, 0x92F7, 0xE48F, 0x92F8, 0xE490, 0x92F9,\n\t0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, 0x92FC, 0xE494, 0x92FD,\t0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, 0xE498, 0x9301,\n\t0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, 0x9305,\t0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309,\n\t0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43,\t0xE4A5, 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19,\n\t0xE4A9, 0x6D0E, 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E,\t0xE4AD, 0x6D35, 0xE4AE, 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52,\n\t0xE4B1, 0x6D54, 0xE4B2, 0x6D33, 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F,\t0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, 0x6D5E, 0xE4B8, 0x6D93,\n\t0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, 0xE4BC, 0x6D7C,\t0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, 0x6DC5,\n\t0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0,\t0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9,\n\t0xE4C9, 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE,\t0xE4CD, 0x6E2B, 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B,\n\t0xE4D1, 0x6EB2, 0xE4D2, 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53,\t0xE4D5, 0x6E54, 0xE4D6, 0x6E32, 0xE4D7, 0x6E25, 0xE4D8, 0x6E44,\n\t0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, 0x6E98, 0xE4DC, 0x6EE0,\t0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, 0xE4E0, 0x6EA7,\n\t0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, 0x6ED7,\t0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2,\n\t0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47,\t0xE4ED, 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F,\n\t0xE4F1, 0x6F36, 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A,\t0xE4F5, 0x6F09, 0xE4F6, 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D,\n\t0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C,\t0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, 0x930A, 0xE541, 0x930B,\n\t0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, 0xE545, 0x930F,\t0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, 0x9313,\n\t0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317,\t0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B,\n\t0xE552, 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F,\t0xE556, 0x9320, 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323,\n\t0xE55A, 0x9324, 0xE55B, 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327,\t0xE55E, 0x9328, 0xE55F, 0x9329, 0xE560, 0x932A, 0xE561, 0x932B,\n\t0xE562, 0x932C, 0xE563, 0x932D, 0xE564, 0x932E, 0xE565, 0x932F,\t0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, 0xE569, 0x9333,\n\t0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, 0x9337,\t0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B,\n\t0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340,\t0xE576, 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344,\n\t0xE57A, 0x9345, 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348,\t0xE57E, 0x9349, 0xE580, 0x934A, 0xE581, 0x934B, 0xE582, 0x934C,\n\t0xE583, 0x934D, 0xE584, 0x934E, 0xE585, 0x934F, 0xE586, 0x9350,\t0xE587, 0x9351, 0xE588, 0x9352, 0xE589, 0x9353, 0xE58A, 0x9354,\n\t0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, 0xE58E, 0x9358,\t0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, 0x935C,\n\t0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360,\t0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364,\n\t0xE59B, 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368,\t0xE59F, 0x9369, 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7,\n\t0xE5A3, 0x6FB9, 0xE5A4, 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1,\t0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF,\n\t0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, 0x701B, 0xE5AE, 0x7039,\t0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, 0xE5B2, 0x5B80,\n\t0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, 0x5BA5,\t0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434,\n\t0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0,\t0xE5BF, 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3,\n\t0xE5C3, 0x8FD5, 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4,\t0xE5C7, 0x8FE9, 0xE5C8, 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8,\n\t0xE5CB, 0x9005, 0xE5CC, 0x9004, 0xE5CD, 0x900B, 0xE5CE, 0x9026,\t0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, 0x9016, 0xE5D2, 0x9021,\n\t0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, 0xE5D6, 0x902F,\t0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, 0x9050,\n\t0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B,\t0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082,\n\t0xE5E3, 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50,\t0xE5E7, 0x5F57, 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B,\n\t0xE5EB, 0x54AB, 0xE5EC, 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71,\t0xE5EF, 0x5C63, 0xE5F0, 0x5C66, 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A,\n\t0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, 0x8274, 0xE5F6, 0x5F3C,\t0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, 0xE5FA, 0x5983,\n\t0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, 0x59A3,\t0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F,\n\t0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373,\t0xE648, 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377,\n\t0xE64C, 0x9378, 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B,\t0xE650, 0x937C, 0xE651, 0x937D, 0xE652, 0x937E, 0xE653, 0x937F,\n\t0xE654, 0x9380, 0xE655, 0x9381, 0xE656, 0x9382, 0xE657, 0x9383,\t0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, 0x9386, 0xE65B, 0x9387,\n\t0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, 0xE65F, 0x938B,\t0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, 0x9390,\n\t0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394,\t0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398,\n\t0xE66C, 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C,\t0xE670, 0x939D, 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0,\n\t0xE674, 0x93A1, 0xE675, 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4,\t0xE678, 0x93A5, 0xE679, 0x93A6, 0xE67A, 0x93A7, 0xE67B, 0x93A8,\n\t0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, 0x93AB, 0xE680, 0x93AC,\t0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, 0xE684, 0x93B0,\n\t0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, 0x93B4,\t0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8,\n\t0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC,\t0xE691, 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0,\n\t0xE695, 0x93C1, 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4,\t0xE699, 0x93C5, 0xE69A, 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8,\n\t0xE69D, 0x93C9, 0xE69E, 0x93CB, 0xE69F, 0x93CC, 0xE6A0, 0x93CD,\t0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, 0x59AB, 0xE6A4, 0x599E,\n\t0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, 0xE6A8, 0x59AF,\t0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, 0x5A06,\n\t0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8,\t0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32,\n\t0xE6B5, 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13,\t0xE6B9, 0x5A40, 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55,\n\t0xE6BD, 0x5A3C, 0xE6BE, 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC,\t0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A,\n\t0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, 0x5AB2, 0xE6C8, 0x5AD2,\t0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, 0xE6CC, 0x5AE3,\n\t0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, 0x5AD8,\t0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16,\n\t0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15,\t0xE6D9, 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73,\n\t0xE6DD, 0x5B51, 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75,\t0xE6E1, 0x9A77, 0xE6E2, 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F,\n\t0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, 0xE6E7, 0x9A81, 0xE6E8, 0x9A85,\t0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, 0x9A90, 0xE6EC, 0x9A92,\n\t0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, 0xE6F0, 0x9A9B,\t0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, 0x9AA0,\n\t0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7,\t0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5,\n\t0xE6FD, 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF,\t0xE742, 0x93D0, 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3,\n\t0xE746, 0x93D4, 0xE747, 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8,\t0xE74A, 0x93D9, 0xE74B, 0x93DA, 0xE74C, 0x93DB, 0xE74D, 0x93DC,\n\t0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, 0x93DF, 0xE751, 0x93E0,\t0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, 0xE755, 0x93E4,\n\t0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, 0x93E8,\t0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC,\n\t0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0,\t0xE762, 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4,\n\t0xE766, 0x93F5, 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8,\t0xE76A, 0x93F9, 0xE76B, 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC,\n\t0xE76E, 0x93FD, 0xE76F, 0x93FE, 0xE770, 0x93FF, 0xE771, 0x9400,\t0xE772, 0x9401, 0xE773, 0x9402, 0xE774, 0x9403, 0xE775, 0x9404,\n\t0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, 0xE779, 0x9408,\t0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, 0x940C,\n\t0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410,\t0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414,\n\t0xE787, 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418,\t0xE78B, 0x9419, 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C,\n\t0xE78F, 0x941D, 0xE790, 0x941E, 0xE791, 0x941F, 0xE792, 0x9420,\t0xE793, 0x9421, 0xE794, 0x9422, 0xE795, 0x9423, 0xE796, 0x9424,\n\t0xE797, 0x9425, 0xE798, 0x9426, 0xE799, 0x9427, 0xE79A, 0x9428,\t0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, 0xE79E, 0x942C,\n\t0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, 0x7EB0,\t0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2,\n\t0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0,\t0xE7AB, 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0,\n\t0xE7AF, 0x7EE1, 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE,\t0xE7B3, 0x7EEF, 0xE7B4, 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D,\n\t0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE,\t0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, 0x7F03, 0xE7BE, 0x7F07,\n\t0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, 0xE7C2, 0x7F0F,\t0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, 0x7F19,\n\t0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21,\t0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25,\n\t0xE7CF, 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B,\t0xE7D3, 0x7F2C, 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30,\n\t0xE7D7, 0x7F31, 0xE7D8, 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35,\t0xE7DB, 0x5E7A, 0xE7DC, 0x757F, 0xE7DD, 0x5DDB, 0xE7DE, 0x753E,\n\t0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, 0x7391, 0xE7E2, 0x73AE,\t0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, 0xE7E6, 0x73C2,\n\t0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, 0x73C0,\t0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9,\n\t0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7,\t0xE7F3, 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F,\n\t0xE7F7, 0x742A, 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425,\t0xE7FB, 0x7428, 0xE7FC, 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C,\n\t0xE840, 0x942F, 0xE841, 0x9430, 0xE842, 0x9431, 0xE843, 0x9432,\t0xE844, 0x9433, 0xE845, 0x9434, 0xE846, 0x9435, 0xE847, 0x9436,\n\t0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, 0xE84B, 0x943A,\t0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, 0x943F,\n\t0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443,\t0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447,\n\t0xE858, 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B,\t0xE85C, 0x944C, 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F,\n\t0xE860, 0x9450, 0xE861, 0x9451, 0xE862, 0x9452, 0xE863, 0x9453,\t0xE864, 0x9454, 0xE865, 0x9455, 0xE866, 0x9456, 0xE867, 0x9457,\n\t0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, 0x945A, 0xE86B, 0x945B,\t0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, 0xE86F, 0x945F,\n\t0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, 0x9463,\t0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467,\n\t0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C,\t0xE87C, 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470,\n\t0xE881, 0x9471, 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474,\t0xE885, 0x9475, 0xE886, 0x9476, 0xE887, 0x9477, 0xE888, 0x9478,\n\t0xE889, 0x9479, 0xE88A, 0x947A, 0xE88B, 0x947B, 0xE88C, 0x947C,\t0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, 0x947F, 0xE890, 0x9480,\n\t0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, 0xE894, 0x9484,\t0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, 0x94C7,\n\t0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA,\t0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520,\n\t0xE8A1, 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C,\t0xE8A5, 0x7457, 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477,\n\t0xE8A9, 0x746D, 0xE8AA, 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E,\t0xE8AD, 0x7480, 0xE8AE, 0x7481, 0xE8AF, 0x7487, 0xE8B0, 0x748B,\n\t0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, 0x74A9, 0xE8B4, 0x7490,\t0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, 0xE8B8, 0x97EA,\n\t0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, 0x6753,\t0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5,\n\t0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798,\t0xE8C5, 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E,\n\t0xE8C9, 0x67AD, 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C,\t0xE8CD, 0x67F0, 0xE8CE, 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A,\n\t0xE8D1, 0x67E9, 0xE8D2, 0x67B0, 0xE8D3, 0x680C, 0xE8D4, 0x67D9,\t0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, 0x67B3, 0xE8D8, 0x67DD,\n\t0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, 0xE8DC, 0x67E2,\t0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, 0x6832,\n\t0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E,\t0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883,\n\t0xE8E9, 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841,\t0xE8ED, 0x6867, 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A,\n\t0xE8F1, 0x6849, 0xE8F2, 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F,\t0xE8F5, 0x6874, 0xE8F6, 0x6877, 0xE8F7, 0x6893, 0xE8F8, 0x686B,\n\t0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, 0x68FC, 0xE8FC, 0x691F,\t0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, 0xE941, 0x9533,\n\t0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, 0x954B,\t0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E,\n\t0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578,\t0xE94E, 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C,\n\t0xE952, 0x957D, 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581,\t0xE956, 0x9582, 0xE957, 0x9583, 0xE958, 0x9584, 0xE959, 0x9585,\n\t0xE95A, 0x9586, 0xE95B, 0x9587, 0xE95C, 0x9588, 0xE95D, 0x9589,\t0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, 0x958C, 0xE961, 0x958D,\n\t0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, 0xE965, 0x9591,\t0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, 0x9595,\n\t0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599,\t0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D,\n\t0xE972, 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1,\t0xE976, 0x95A2, 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5,\n\t0xE97A, 0x95A6, 0xE97B, 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9,\t0xE97E, 0x95AA, 0xE980, 0x95AB, 0xE981, 0x95AC, 0xE982, 0x95AD,\n\t0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, 0x95B0, 0xE986, 0x95B1,\t0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, 0xE98A, 0x95B5,\n\t0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, 0x95B9,\t0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD,\n\t0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1,\t0xE997, 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5,\n\t0xE99B, 0x95C6, 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9,\t0xE99F, 0x95CA, 0xE9A0, 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0,\n\t0xE9A3, 0x690B, 0xE9A4, 0x6901, 0xE9A5, 0x6957, 0xE9A6, 0x68E3,\t0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, 0x6939, 0xE9AA, 0x6960,\n\t0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, 0xE9AE, 0x696B,\t0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, 0x6934,\n\t0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE,\t0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979,\n\t0xE9BB, 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB,\t0xE9BF, 0x69AD, 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1,\n\t0xE9C3, 0x69CA, 0xE9C4, 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0,\t0xE9C7, 0x698D, 0xE9C8, 0x69FF, 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED,\n\t0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, 0x6A65, 0xE9CE, 0x69F2,\t0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, 0xE9D2, 0x6A50,\n\t0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, 0x6A79,\t0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C,\n\t0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97,\t0xE9DF, 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81,\n\t0xE9E3, 0x6B82, 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92,\t0xE9E7, 0x6B93, 0xE9E8, 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B,\n\t0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D,\t0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, 0x8F73, 0xE9F2, 0x8F75,\n\t0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, 0xE9F6, 0x8F79,\t0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, 0x8F81,\n\t0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B,\t0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF,\n\t0xEA44, 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3,\t0xEA48, 0x95D4, 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7,\n\t0xEA4C, 0x95D8, 0xEA4D, 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB,\t0xEA50, 0x95DC, 0xEA51, 0x95DD, 0xEA52, 0x95DE, 0xEA53, 0x95DF,\n\t0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, 0x95E2, 0xEA57, 0x95E3,\t0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, 0xEA5B, 0x95E7,\n\t0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, 0x9613,\t0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620,\n\t0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626,\t0xEA68, 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B,\n\t0xEA6C, 0x962C, 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630,\t0xEA70, 0x9637, 0xEA71, 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A,\n\t0xEA74, 0x963E, 0xEA75, 0x9641, 0xEA76, 0x9643, 0xEA77, 0x964A,\t0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, 0x9651, 0xEA7B, 0x9652,\n\t0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, 0xEA80, 0x9658,\t0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, 0x965D,\n\t0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665,\t0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E,\n\t0xEA8D, 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673,\t0xEA91, 0x9678, 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B,\n\t0xEA95, 0x967C, 0xEA96, 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F,\t0xEA99, 0x9680, 0xEA9A, 0x9681, 0xEA9B, 0x9682, 0xEA9C, 0x9683,\n\t0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, 0x9689, 0xEAA0, 0x968A,\t0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, 0xEAA4, 0x8F98,\n\t0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, 0x6217,\t0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221,\n\t0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7,\t0xEAB1, 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F,\n\t0xEAB5, 0x7511, 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE,\t0xEAB9, 0x65EF, 0xEABA, 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619,\n\t0xEABD, 0x6772, 0xEABE, 0x6603, 0xEABF, 0x6615, 0xEAC0, 0x6600,\t0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, 0x661D, 0xEAC4, 0x6634,\n\t0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, 0xEAC8, 0x8006,\t0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, 0x664F,\n\t0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677,\t0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D,\n\t0xEAD5, 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6,\t0xEAD9, 0x66E9, 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36,\n\t0xEADD, 0x8D3B, 0xEADE, 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45,\t0xEAE1, 0x8D46, 0xEAE2, 0x8D48, 0xEAE3, 0x8D49, 0xEAE4, 0x8D47,\n\t0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, 0x8D59, 0xEAE8, 0x89C7,\t0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, 0xEAEC, 0x89CE,\n\t0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, 0x726E,\t0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F,\n\t0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B,\t0xEAF9, 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308,\n\t0xEAFD, 0x6332, 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E,\t0xEB42, 0x9691, 0xEB43, 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695,\n\t0xEB46, 0x9696, 0xEB47, 0x969A, 0xEB48, 0x969B, 0xEB49, 0x969D,\t0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, 0x96A0, 0xEB4D, 0x96A1,\n\t0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, 0xEB51, 0x96A5,\t0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, 0x96AA,\n\t0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE,\t0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4,\n\t0xEB5E, 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA,\t0xEB62, 0x96BB, 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3,\n\t0xEB66, 0x96C8, 0xEB67, 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0,\t0xEB6A, 0x96D1, 0xEB6B, 0x96D3, 0xEB6C, 0x96D4, 0xEB6D, 0x96D6,\n\t0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, 0x96D9, 0xEB71, 0x96DA,\t0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, 0xEB75, 0x96DE,\n\t0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, 0x96E3,\t0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7,\n\t0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE,\t0xEB83, 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4,\n\t0xEB87, 0x96F5, 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB,\t0xEB8B, 0x96FC, 0xEB8C, 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702,\n\t0xEB8F, 0x9703, 0xEB90, 0x9705, 0xEB91, 0x970A, 0xEB92, 0x970B,\t0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, 0x9711, 0xEB96, 0x9712,\n\t0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, 0xEB9A, 0x9718,\t0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, 0x971D,\n\t0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8,\t0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD,\n\t0xEBA7, 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07,\t0xEBAB, 0x6C06, 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18,\n\t0xEBAF, 0x6C19, 0xEBB0, 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29,\t0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, 0xEBB5, 0x6C32, 0xEBB6, 0x6535,\n\t0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, 0x724D, 0xEBBA, 0x7252,\t0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, 0xEBBE, 0x5216,\n\t0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, 0x80BC,\t0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB,\n\t0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7,\t0xEBCB, 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB,\n\t0xEBCF, 0x80C2, 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD,\t0xEBD3, 0x80D7, 0xEBD4, 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB,\n\t0xEBD7, 0x80F1, 0xEBD8, 0x80F4, 0xEBD9, 0x80ED, 0xEBDA, 0x810D,\t0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, 0x80FC, 0xEBDE, 0x6715,\n\t0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, 0xEBE2, 0x811E,\t0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, 0x8148,\n\t0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159,\t0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169,\n\t0xEBEF, 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167,\t0xEBF3, 0x584D, 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182,\n\t0xEBF7, 0x8191, 0xEBF8, 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA,\t0xEBFB, 0x81CC, 0xEBFC, 0x6726, 0xEBFD, 0x81CA, 0xEBFE, 0x81BB,\n\t0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, 0x9723, 0xEC43, 0x9724,\t0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, 0xEC47, 0x9728,\n\t0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, 0x972E,\t0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734,\n\t0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A,\t0xEC54, 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F,\n\t0xEC58, 0x9740, 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743,\t0xEC5C, 0x9744, 0xEC5D, 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747,\n\t0xEC60, 0x9748, 0xEC61, 0x9749, 0xEC62, 0x974A, 0xEC63, 0x974B,\t0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, 0x974E, 0xEC67, 0x974F,\n\t0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, 0xEC6B, 0x9755,\t0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, 0x975C,\n\t0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764,\t0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A,\n\t0xEC78, 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E,\t0xEC7C, 0x976F, 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772,\n\t0xEC81, 0x9775, 0xEC82, 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779,\t0xEC85, 0x977A, 0xEC86, 0x977B, 0xEC87, 0x977D, 0xEC88, 0x977E,\n\t0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, 0x9781, 0xEC8C, 0x9782,\t0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, 0xEC90, 0x9787,\n\t0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, 0x978C,\t0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793,\n\t0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799,\t0xEC9D, 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D,\n\t0xECA1, 0x81C1, 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37,\t0xECA5, 0x6B39, 0xECA6, 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59,\n\t0xECA9, 0x98D1, 0xECAA, 0x98D2, 0xECAB, 0x98D3, 0xECAC, 0x98D5,\t0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, 0x6BB3, 0xECB0, 0x5F40,\n\t0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, 0xECB4, 0x9F51,\t0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, 0x65C4,\n\t0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2,\t0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096,\n\t0xECC1, 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7,\t0xECC5, 0x70AB, 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA,\n\t0xECC9, 0x7110, 0xECCA, 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F,\t0xECCD, 0x7131, 0xECCE, 0x7173, 0xECCF, 0x715C, 0xECD0, 0x7168,\n\t0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, 0x714A, 0xECD4, 0x7178,\t0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, 0xECD8, 0x71B5,\n\t0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, 0x71D4,\t0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228,\n\t0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9,\t0xECE5, 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248,\n\t0xECE9, 0x6249, 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946,\t0xECED, 0x7949, 0xECEE, 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953,\n\t0xECF1, 0x795A, 0xECF2, 0x7962, 0xECF3, 0x7957, 0xECF4, 0x7960,\t0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, 0x797A, 0xECF8, 0x7985,\n\t0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, 0xECFC, 0x79B3,\t0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, 0x979F,\n\t0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5,\t0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9,\n\t0xED4A, 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0,\t0xED4E, 0x97B1, 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6,\n\t0xED52, 0x97B7, 0xED53, 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA,\t0xED56, 0x97BB, 0xED57, 0x97BC, 0xED58, 0x97BD, 0xED59, 0x97BE,\n\t0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, 0x97C1, 0xED5D, 0x97C2,\t0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, 0xED61, 0x97C6,\n\t0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, 0x97CA,\t0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE,\n\t0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2,\t0xED6E, 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6,\n\t0xED72, 0x97D7, 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA,\t0xED76, 0x97DB, 0xED77, 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE,\n\t0xED7A, 0x97DF, 0xED7B, 0x97E0, 0xED7C, 0x97E1, 0xED7D, 0x97E2,\t0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, 0x97E5, 0xED82, 0x97E8,\n\t0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, 0xED86, 0x97F1,\t0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, 0x97F8,\n\t0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC,\t0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800,\n\t0xED93, 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804,\t0xED97, 0x9805, 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808,\n\t0xED9B, 0x9809, 0xED9C, 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C,\t0xED9F, 0x980D, 0xEDA0, 0x980E, 0xEDA1, 0x603C, 0xEDA2, 0x605D,\n\t0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, 0x6041, 0xEDA6, 0x6059,\t0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, 0xEDAA, 0x610D,\n\t0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, 0x61CB,\t0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F,\n\t0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6,\t0xEDB7, 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817,\n\t0xEDBB, 0x7818, 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D,\t0xEDBF, 0x781C, 0xEDC0, 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A,\n\t0xEDC3, 0x783B, 0xEDC4, 0x781F, 0xEDC5, 0x783C, 0xEDC6, 0x7825,\t0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, 0x7829, 0xEDCA, 0x784E,\n\t0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, 0xEDCE, 0x7826,\t0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, 0x786A,\n\t0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887,\t0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2,\n\t0xEDDB, 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9,\t0xEDDF, 0x78C9, 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905,\n\t0xEDE3, 0x78F4, 0xEDE4, 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E,\t0xEDE7, 0x7934, 0xEDE8, 0x9F9B, 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB,\n\t0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, 0x7704, 0xEDEE, 0x770D,\t0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, 0xEDF2, 0x771A,\n\t0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, 0x7726,\t0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751,\n\t0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768,\t0xEE40, 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812,\n\t0xEE44, 0x9813, 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816,\t0xEE48, 0x9817, 0xEE49, 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A,\n\t0xEE4C, 0x981B, 0xEE4D, 0x981C, 0xEE4E, 0x981D, 0xEE4F, 0x981E,\t0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, 0x9821, 0xEE53, 0x9822,\n\t0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, 0xEE57, 0x9826,\t0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, 0x982A,\n\t0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E,\t0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832,\n\t0xEE64, 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836,\t0xEE68, 0x9837, 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A,\n\t0xEE6C, 0x983B, 0xEE6D, 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E,\t0xEE70, 0x983F, 0xEE71, 0x9840, 0xEE72, 0x9841, 0xEE73, 0x9842,\n\t0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, 0x9845, 0xEE77, 0x9846,\t0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, 0xEE7B, 0x984A,\n\t0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, 0x984E,\t0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852,\n\t0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856,\t0xEE89, 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A,\n\t0xEE8D, 0x985B, 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E,\t0xEE91, 0x985F, 0xEE92, 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862,\n\t0xEE95, 0x9863, 0xEE96, 0x9864, 0xEE97, 0x9865, 0xEE98, 0x9866,\t0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, 0x9869, 0xEE9C, 0x986A,\n\t0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, 0xEEA0, 0x986E,\t0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, 0x778D,\n\t0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791,\t0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5,\n\t0xEEAD, 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E,\t0xEEB1, 0x754B, 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572,\n\t0xEEB5, 0x7579, 0xEEB6, 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61,\t0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, 0xEEBB, 0x7F68, 0xEEBC, 0x7F74,\n\t0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, 0x7F81, 0xEEC0, 0x7F7E,\t0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, 0xEEC4, 0x9485,\n\t0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, 0x948A,\t0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490,\n\t0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A,\t0xEED1, 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4,\n\t0xEED5, 0x94AB, 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC,\t0xEED9, 0x94AF, 0xEEDA, 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4,\n\t0xEEDD, 0x94B6, 0xEEDE, 0x94B7, 0xEEDF, 0x94B8, 0xEEE0, 0x94B9,\t0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, 0x94BD, 0xEEE4, 0x94BF,\n\t0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, 0xEEE8, 0x94CA,\t0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, 0x94CE,\n\t0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5,\t0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8,\n\t0xEEF5, 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0,\t0xEEF9, 0x94E2, 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7,\n\t0xEEFD, 0x94E8, 0xEEFE, 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870,\t0xEF42, 0x9871, 0xEF43, 0x9872, 0xEF44, 0x9873, 0xEF45, 0x9874,\n\t0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, 0x9892, 0xEF49, 0x9895,\t0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, 0xEF4D, 0x98A9,\n\t0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, 0x98AD,\t0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1,\n\t0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5,\t0xEF5A, 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9,\n\t0xEF5E, 0x98BA, 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD,\t0xEF62, 0x98BE, 0xEF63, 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1,\n\t0xEF66, 0x98C2, 0xEF67, 0x98C3, 0xEF68, 0x98C4, 0xEF69, 0x98C5,\t0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, 0x98C8, 0xEF6D, 0x98C9,\n\t0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, 0xEF71, 0x98CD,\t0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, 0x98D6,\n\t0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD,\t0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3,\n\t0xEF7E, 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9,\t0xEF83, 0x98EA, 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED,\n\t0xEF87, 0x98EE, 0xEF88, 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1,\t0xEF8B, 0x98F2, 0xEF8C, 0x98F3, 0xEF8D, 0x98F4, 0xEF8E, 0x98F5,\n\t0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, 0x98F8, 0xEF92, 0x98F9,\t0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, 0xEF96, 0x98FD,\n\t0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, 0x9901,\t0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905,\n\t0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB,\t0xEFA3, 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4,\n\t0xEFA7, 0x94F5, 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC,\t0xEFAB, 0x94FD, 0xEFAC, 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502,\n\t0xEFAF, 0x9506, 0xEFB0, 0x9507, 0xEFB1, 0x9509, 0xEFB2, 0x950A,\t0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, 0x950F, 0xEFB6, 0x9512,\n\t0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, 0xEFBA, 0x9516,\t0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, 0x951E,\n\t0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B,\t0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532,\n\t0xEFC7, 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538,\t0xEFCB, 0x953C, 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542,\n\t0xEFCF, 0x9535, 0xEFD0, 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546,\t0xEFD3, 0x9549, 0xEFD4, 0x954C, 0xEFD5, 0x954E, 0xEFD6, 0x954F,\n\t0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, 0x9554, 0xEFDA, 0x9556,\t0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, 0xEFDE, 0x955B,\n\t0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, 0x9561,\t0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566,\n\t0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A,\t0xEFEB, 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571,\n\t0xEFEF, 0x9572, 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7,\t0xEFF3, 0x77EC, 0xEFF4, 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED,\n\t0xEFF7, 0x79E3, 0xEFF8, 0x79EB, 0xEFF9, 0x7A06, 0xEFFA, 0x5D47,\t0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, 0x7A1E, 0xEFFE, 0x7A14,\n\t0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, 0xF043, 0x990B,\t0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, 0x9911,\n\t0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915,\t0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919,\n\t0xF050, 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D,\t0xF054, 0x991E, 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921,\n\t0xF058, 0x9922, 0xF059, 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925,\t0xF05C, 0x9926, 0xF05D, 0x9927, 0xF05E, 0x9928, 0xF05F, 0x9929,\n\t0xF060, 0x992A, 0xF061, 0x992B, 0xF062, 0x992C, 0xF063, 0x992D,\t0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, 0xF067, 0x9932,\n\t0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, 0x9936,\t0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A,\n\t0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E,\t0xF074, 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942,\n\t0xF078, 0x9943, 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946,\t0xF07C, 0x9947, 0xF07D, 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A,\n\t0xF081, 0x994B, 0xF082, 0x994C, 0xF083, 0x994D, 0xF084, 0x994E,\t0xF085, 0x994F, 0xF086, 0x9950, 0xF087, 0x9951, 0xF088, 0x9952,\n\t0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, 0xF08C, 0x9958,\t0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, 0x995C,\n\t0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960,\t0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966,\n\t0xF099, 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B,\t0xF09D, 0x997E, 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989,\n\t0xF0A1, 0x7A39, 0xF0A2, 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF,\t0xF0A5, 0x99A5, 0xF0A6, 0x7A70, 0xF0A7, 0x7688, 0xF0A8, 0x768E,\n\t0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, 0x76A4, 0xF0AC, 0x74DE,\t0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, 0xF0B0, 0x9E22,\n\t0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, 0x9E2B,\t0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36,\n\t0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A,\t0xF0BD, 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44,\n\t0xF0C1, 0x9E46, 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49,\t0xF0C5, 0x9E4B, 0xF0C6, 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51,\n\t0xF0C9, 0x9E55, 0xF0CA, 0x9E57, 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B,\t0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, 0x9E63, 0xF0D0, 0x9E66,\n\t0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, 0xF0D4, 0x9E6A,\t0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, 0x9E6D,\n\t0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596,\t0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3,\n\t0xF0E1, 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4,\t0xF0E5, 0x75B1, 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2,\n\t0xF0E9, 0x75D6, 0xF0EA, 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8,\t0xF0ED, 0x75E6, 0xF0EE, 0x75E4, 0xF0EF, 0x75EB, 0xF0F0, 0x75E7,\n\t0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, 0x75FC, 0xF0F4, 0x75FF,\t0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, 0xF0F8, 0x760C,\n\t0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, 0x7618,\t0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E,\n\t0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D,\t0xF146, 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1,\n\t0xF14A, 0x99A2, 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6,\t0xF14E, 0x99A7, 0xF14F, 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB,\n\t0xF152, 0x99AC, 0xF153, 0x99AD, 0xF154, 0x99AE, 0xF155, 0x99AF,\t0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, 0x99B2, 0xF159, 0x99B3,\n\t0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, 0xF15D, 0x99B7,\t0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, 0x99BB,\n\t0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF,\t0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3,\n\t0xF16A, 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7,\t0xF16E, 0x99C8, 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB,\n\t0xF172, 0x99CC, 0xF173, 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF,\t0xF176, 0x99D0, 0xF177, 0x99D1, 0xF178, 0x99D2, 0xF179, 0x99D3,\n\t0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, 0x99D6, 0xF17D, 0x99D7,\t0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, 0xF182, 0x99DB,\n\t0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, 0x99DF,\t0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3,\n\t0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7,\t0xF18F, 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB,\n\t0xF193, 0x99EC, 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF,\t0xF197, 0x99F0, 0xF198, 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3,\n\t0xF19B, 0x99F4, 0xF19C, 0x99F5, 0xF19D, 0x99F6, 0xF19E, 0x99F7,\t0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, 0x761B, 0xF1A2, 0x763C,\n\t0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, 0xF1A6, 0x762D,\t0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, 0x7643,\n\t0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E,\t0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B,\n\t0xF1B3, 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78,\t0xF1B7, 0x7A79, 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88,\n\t0xF1BB, 0x7A95, 0xF1BC, 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC,\t0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, 0xF1C1, 0x7AB3, 0xF1C2, 0x8864,\n\t0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, 0x887D, 0xF1C6, 0x887F,\t0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, 0xF1CA, 0x88B7,\n\t0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, 0x88CE,\t0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A,\n\t0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0,\t0xF1D7, 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B,\n\t0xF1DB, 0x890A, 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936,\t0xF1DF, 0x8941, 0xF1E0, 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B,\n\t0xF1E3, 0x80E5, 0xF1E4, 0x76B2, 0xF1E5, 0x76B4, 0xF1E6, 0x77DC,\t0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, 0x8016, 0xF1EA, 0x801C,\n\t0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, 0xF1EE, 0x8026,\t0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, 0x8031,\n\t0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046,\t0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071,\n\t0xF1FB, 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883,\t0xF240, 0x99FA, 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD,\n\t0xF244, 0x99FE, 0xF245, 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01,\t0xF248, 0x9A02, 0xF249, 0x9A03, 0xF24A, 0x9A04, 0xF24B, 0x9A05,\n\t0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, 0x9A08, 0xF24F, 0x9A09,\t0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, 0xF253, 0x9A0D,\n\t0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, 0x9A11,\t0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15,\n\t0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19,\t0xF260, 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D,\n\t0xF264, 0x9A1E, 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21,\t0xF268, 0x9A22, 0xF269, 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25,\n\t0xF26C, 0x9A26, 0xF26D, 0x9A27, 0xF26E, 0x9A28, 0xF26F, 0x9A29,\t0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, 0x9A2C, 0xF273, 0x9A2D,\n\t0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, 0xF277, 0x9A31,\t0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, 0x9A35,\n\t0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39,\t0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D,\n\t0xF285, 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41,\t0xF289, 0x9A42, 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45,\n\t0xF28D, 0x9A46, 0xF28E, 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49,\t0xF291, 0x9A4A, 0xF292, 0x9A4B, 0xF293, 0x9A4C, 0xF294, 0x9A4D,\n\t0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, 0x9A50, 0xF298, 0x9A51,\t0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, 0xF29C, 0x9A55,\n\t0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, 0x9A59,\t0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F,\n\t0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E,\t0xF2A9, 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5,\n\t0xF2AD, 0x98A6, 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C,\t0xF2B1, 0x866E, 0xF2B2, 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C,\n\t0xF2B5, 0x867B, 0xF2B6, 0x86A8, 0xF2B7, 0x868D, 0xF2B8, 0x868B,\t0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, 0x86A7, 0xF2BC, 0x86A3,\n\t0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, 0xF2C0, 0x86B6,\t0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, 0x86B0,\n\t0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9,\t0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1,\n\t0xF2CD, 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0,\t0xF2D1, 0x8713, 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF,\n\t0xF2D5, 0x86D8, 0xF2D6, 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707,\t0xF2D9, 0x86F8, 0xF2DA, 0x8708, 0xF2DB, 0x870A, 0xF2DC, 0x870D,\n\t0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, 0x873B, 0xF2E0, 0x871E,\t0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, 0xF2E4, 0x873E,\n\t0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, 0x8729,\t0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722,\n\t0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760,\t0xF2F1, 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B,\n\t0xF2F5, 0x8753, 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764,\t0xF2F9, 0x8759, 0xF2FA, 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF,\n\t0xF2FD, 0x87A8, 0xF2FE, 0x87D2, 0xF340, 0x9A5A, 0xF341, 0x9A5B,\t0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, 0x9A5E, 0xF345, 0x9A5F,\n\t0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, 0xF349, 0x9A63,\t0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, 0x9A67,\n\t0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B,\t0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D,\n\t0xF356, 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99,\t0xF35A, 0x9AA6, 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB,\n\t0xF35E, 0x9AAC, 0xF35F, 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF,\t0xF362, 0x9AB2, 0xF363, 0x9AB3, 0xF364, 0x9AB4, 0xF365, 0x9AB5,\n\t0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, 0x9ABD, 0xF369, 0x9ABE,\t0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, 0xF36D, 0x9AC6,\n\t0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, 0x9ACA,\t0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0,\n\t0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6,\t0xF37A, 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB,\n\t0xF37E, 0x9ADC, 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0,\t0xF383, 0x9AE2, 0xF384, 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5,\n\t0xF387, 0x9AE7, 0xF388, 0x9AE8, 0xF389, 0x9AE9, 0xF38A, 0x9AEA,\t0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, 0x9AF0, 0xF38E, 0x9AF1,\n\t0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, 0xF392, 0x9AF5,\t0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, 0x9AFA,\n\t0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF,\t0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04,\n\t0xF39F, 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788,\t0xF3A3, 0x8785, 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783,\n\t0xF3A7, 0x87AB, 0xF3A8, 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5,\t0xF3AB, 0x87B3, 0xF3AC, 0x87CB, 0xF3AD, 0x87D3, 0xF3AE, 0x87BD,\n\t0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, 0x87CA, 0xF3B2, 0x87DB,\t0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, 0xF3B6, 0x8816,\n\t0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, 0x881B,\t0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36,\n\t0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210,\t0xF3C3, 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03,\n\t0xF3C7, 0x7B04, 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B,\t0xF3CB, 0x7B0F, 0xF3CC, 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A,\n\t0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, 0xF3D1, 0x7B31, 0xF3D2, 0x7B20,\t0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, 0x7B33, 0xF3D6, 0x7B3E,\n\t0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, 0xF3DA, 0x7B45,\t0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, 0x7B60,\n\t0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72,\t0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7,\n\t0xF3E7, 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8,\t0xF3EB, 0x7B85, 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2,\n\t0xF3EF, 0x7BAB, 0xF3F0, 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1,\t0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5,\n\t0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, 0x7C0C, 0xF3FA, 0x7BFE,\t0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, 0xF3FE, 0x7C0B,\n\t0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, 0x9B0B,\t0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10,\n\t0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15,\t0xF44C, 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19,\n\t0xF450, 0x9B1A, 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D,\t0xF454, 0x9B1E, 0xF455, 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22,\n\t0xF458, 0x9B24, 0xF459, 0x9B25, 0xF45A, 0x9B26, 0xF45B, 0x9B27,\t0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, 0x9B2A, 0xF45F, 0x9B2B,\n\t0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, 0xF463, 0x9B30,\t0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, 0x9B35,\n\t0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39,\t0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F,\n\t0xF470, 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B,\t0xF474, 0x9B4C, 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52,\n\t0xF478, 0x9B53, 0xF479, 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57,\t0xF47C, 0x9B58, 0xF47D, 0x9B59, 0xF47E, 0x9B5A, 0xF480, 0x9B5B,\n\t0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, 0x9B5E, 0xF484, 0x9B5F,\t0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, 0xF488, 0x9B63,\n\t0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, 0x9B67,\t0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B,\n\t0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F,\t0xF495, 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73,\n\t0xF499, 0x9B74, 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77,\t0xF49D, 0x9B78, 0xF49E, 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B,\n\t0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, 0xF4A3, 0x7C26, 0xF4A4, 0x7C38,\t0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, 0x81FE, 0xF4A8, 0x8201,\n\t0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, 0xF4AC, 0x8844,\t0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, 0x822D,\n\t0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238,\t0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E,\n\t0xF4B9, 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F,\t0xF4BD, 0x825A, 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E,\n\t0xF4C1, 0x8885, 0xF4C2, 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF,\t0xF4C5, 0x895E, 0xF4C6, 0x7F9D, 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7,\n\t0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, 0x7FB2, 0xF4CC, 0x7C7C,\t0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, 0xF4D0, 0x7C9C,\n\t0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, 0x7CBC,\t0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC,\n\t0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7,\t0xF4DD, 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF,\n\t0xF4E1, 0x7FCE, 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1,\t0xF4E5, 0x7FE6, 0xF4E6, 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3,\n\t0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE,\t0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, 0x9EB8, 0xF4F0, 0x9EB4,\n\t0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, 0xF4F4, 0x8D91,\t0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, 0x8C47,\n\t0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E,\t0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D,\n\t0xF542, 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81,\t0xF546, 0x9B82, 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85,\n\t0xF54A, 0x9B86, 0xF54B, 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89,\t0xF54E, 0x9B8A, 0xF54F, 0x9B8B, 0xF550, 0x9B8C, 0xF551, 0x9B8D,\n\t0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, 0x9B90, 0xF555, 0x9B91,\t0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, 0xF559, 0x9B95,\n\t0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, 0x9B99,\t0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D,\n\t0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1,\t0xF566, 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5,\n\t0xF56A, 0x9BA6, 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9,\t0xF56E, 0x9BAA, 0xF56F, 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD,\n\t0xF572, 0x9BAE, 0xF573, 0x9BAF, 0xF574, 0x9BB0, 0xF575, 0x9BB1,\t0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, 0x9BB4, 0xF579, 0x9BB5,\n\t0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, 0xF57D, 0x9BB9,\t0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, 0x9BBD,\n\t0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1,\t0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5,\n\t0xF58B, 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9,\t0xF58F, 0x9BCA, 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD,\n\t0xF593, 0x9BCE, 0xF594, 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1,\t0xF597, 0x9BD2, 0xF598, 0x9BD3, 0xF599, 0x9BD4, 0xF59A, 0x9BD5,\n\t0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, 0x9BD8, 0xF59E, 0x9BD9,\t0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, 0xF5A2, 0x9161,\n\t0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, 0x917D,\t0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179,\n\t0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D,\t0xF5AF, 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA,\n\t0xF5B3, 0x91AD, 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5,\t0xF5B7, 0x91B4, 0xF5B8, 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E,\n\t0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, 0xF5BD, 0x8E05, 0xF5BE, 0x8E59,\t0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, 0x8DBF, 0xF5C2, 0x8DBC,\n\t0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, 0xF5C6, 0x8DD7,\t0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, 0x8DCF,\n\t0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7,\t0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB,\n\t0xF5D3, 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14,\t0xF5D7, 0x8E1D, 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E,\n\t0xF5DB, 0x8E23, 0xF5DC, 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40,\t0xF5DF, 0x8E39, 0xF5E0, 0x8E35, 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31,\n\t0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, 0x8E42, 0xF5E6, 0x8E51,\t0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, 0xF5EA, 0x8E76,\n\t0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, 0x8E85,\t0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C,\n\t0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A,\t0xF5F7, 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B,\n\t0xF5FB, 0x89D6, 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC,\t0xF640, 0x9BDC, 0xF641, 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF,\n\t0xF644, 0x9BE0, 0xF645, 0x9BE1, 0xF646, 0x9BE2, 0xF647, 0x9BE3,\t0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, 0x9BE6, 0xF64B, 0x9BE7,\n\t0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, 0xF64F, 0x9BEB,\t0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, 0x9BEF,\n\t0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3,\t0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7,\n\t0xF65C, 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB,\t0xF660, 0x9BFC, 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF,\n\t0xF664, 0x9C00, 0xF665, 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03,\t0xF668, 0x9C04, 0xF669, 0x9C05, 0xF66A, 0x9C06, 0xF66B, 0x9C07,\n\t0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, 0x9C0A, 0xF66F, 0x9C0B,\t0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, 0xF673, 0x9C0F,\n\t0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, 0x9C13,\t0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17,\n\t0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B,\t0xF681, 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F,\n\t0xF685, 0x9C20, 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23,\t0xF689, 0x9C24, 0xF68A, 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27,\n\t0xF68D, 0x9C28, 0xF68E, 0x9C29, 0xF68F, 0x9C2A, 0xF690, 0x9C2B,\t0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, 0x9C2E, 0xF694, 0x9C2F,\n\t0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, 0xF698, 0x9C33,\t0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, 0x9C37,\n\t0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B,\t0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E,\n\t0xF6A5, 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3,\t0xF6A9, 0x96EF, 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708,\n\t0xF6AD, 0x970F, 0xF6AE, 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D,\t0xF6B1, 0x9730, 0xF6B2, 0x973E, 0xF6B3, 0x9F80, 0xF6B4, 0x9F83,\n\t0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, 0x9F87, 0xF6B8, 0x9F88,\t0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, 0xF6BC, 0x9EFE,\n\t0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, 0x96BC,\t0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF,\n\t0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8,\t0xF6C9, 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F,\n\t0xF6CD, 0x943E, 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82,\t0xF6D1, 0x9C85, 0xF6D2, 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88,\n\t0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90,\t0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, 0x9C94, 0xF6DC, 0x9C95,\n\t0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, 0xF6E0, 0x9C9F,\t0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, 0x9CA3,\n\t0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8,\t0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE,\n\t0xF6ED, 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3,\t0xF6F1, 0x9CB4, 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7,\n\t0xF6F5, 0x9CBA, 0xF6F6, 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD,\t0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7,\n\t0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, 0x9C3C, 0xF741, 0x9C3D,\t0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, 0xF745, 0x9C41,\n\t0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, 0x9C45,\t0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49,\n\t0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D,\t0xF752, 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51,\n\t0xF756, 0x9C52, 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55,\t0xF75A, 0x9C56, 0xF75B, 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59,\n\t0xF75E, 0x9C5A, 0xF75F, 0x9C5B, 0xF760, 0x9C5C, 0xF761, 0x9C5D,\t0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, 0x9C60, 0xF765, 0x9C61,\n\t0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, 0xF769, 0x9C65,\t0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, 0x9C69,\n\t0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D,\t0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71,\n\t0xF776, 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75,\t0xF77A, 0x9C76, 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79,\n\t0xF77E, 0x9C7A, 0xF780, 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E,\t0xF783, 0x9C80, 0xF784, 0x9C83, 0xF785, 0x9C84, 0xF786, 0x9C89,\n\t0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, 0x9C8F, 0xF78A, 0x9C93,\t0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, 0xF78E, 0x9C99,\n\t0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, 0x9CAF,\t0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0,\n\t0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9,\t0xF79B, 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB,\n\t0xF79F, 0x9CE0, 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD,\t0xF7A3, 0x9CCE, 0xF7A4, 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3,\n\t0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8,\t0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, 0x9CDD, 0xF7AE, 0x9CDF,\n\t0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, 0xF7B2, 0x9791,\t0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, 0x97AB,\n\t0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1,\t0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6,\n\t0xF7BF, 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0,\t0xF7C3, 0x9AC5, 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC,\n\t0xF7C7, 0x9AD1, 0xF7C8, 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47,\t0xF7CB, 0x9B49, 0xF7CC, 0x9B48, 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51,\n\t0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, 0x992E, 0xF7D2, 0x9955,\t0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, 0xF7D6, 0x9AE6,\n\t0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, 0x9AED,\t0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13,\n\t0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE,\t0xF7E3, 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88,\n\t0xF7E7, 0x9E8B, 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D,\t0xF7EB, 0x9E9F, 0xF7EC, 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD,\n\t0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9,\t0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, 0x9EEA, 0xF7F6, 0x9EEF,\n\t0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, 0xF7FA, 0x9F39,\t0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, 0x9F44,\n\t0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6,\t0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA,\n\t0xF848, 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE,\t0xF84C, 0x9CEF, 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2,\n\t0xF850, 0x9CF3, 0xF851, 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6,\t0xF854, 0x9CF7, 0xF855, 0x9CF8, 0xF856, 0x9CF9, 0xF857, 0x9CFA,\n\t0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, 0x9CFD, 0xF85B, 0x9CFE,\t0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, 0xF85F, 0x9D02,\n\t0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, 0x9D06,\t0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A,\n\t0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E,\t0xF86C, 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12,\n\t0xF870, 0x9D13, 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16,\t0xF874, 0x9D17, 0xF875, 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A,\n\t0xF878, 0x9D1B, 0xF879, 0x9D1C, 0xF87A, 0x9D1D, 0xF87B, 0x9D1E,\t0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, 0x9D21, 0xF880, 0x9D22,\n\t0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, 0xF884, 0x9D26,\t0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, 0x9D2A,\n\t0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E,\t0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32,\n\t0xF891, 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36,\t0xF895, 0x9D37, 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A,\n\t0xF899, 0x9D3B, 0xF89A, 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E,\t0xF89D, 0x9D3F, 0xF89E, 0x9D40, 0xF89F, 0x9D41, 0xF8A0, 0x9D42,\n\t0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, 0x9D45, 0xF943, 0x9D46,\t0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, 0xF947, 0x9D4A,\n\t0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, 0x9D4E,\t0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52,\n\t0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56,\t0xF954, 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A,\n\t0xF958, 0x9D5B, 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E,\t0xF95C, 0x9D5F, 0xF95D, 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62,\n\t0xF960, 0x9D63, 0xF961, 0x9D64, 0xF962, 0x9D65, 0xF963, 0x9D66,\t0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, 0x9D69, 0xF967, 0x9D6A,\n\t0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, 0xF96B, 0x9D6E,\t0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, 0x9D72,\n\t0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76,\t0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A,\n\t0xF978, 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E,\t0xF97C, 0x9D7F, 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82,\n\t0xF981, 0x9D83, 0xF982, 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86,\t0xF985, 0x9D87, 0xF986, 0x9D88, 0xF987, 0x9D89, 0xF988, 0x9D8A,\n\t0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, 0x9D8D, 0xF98C, 0x9D8E,\t0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, 0xF990, 0x9D92,\n\t0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, 0x9D96,\t0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A,\n\t0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E,\t0xF99D, 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2,\n\t0xFA40, 0x9DA3, 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6,\t0xFA44, 0x9DA7, 0xFA45, 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA,\n\t0xFA48, 0x9DAB, 0xFA49, 0x9DAC, 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE,\t0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, 0x9DB1, 0xFA4F, 0x9DB2,\n\t0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, 0xFA53, 0x9DB6,\t0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, 0x9DBA,\n\t0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE,\t0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2,\n\t0xFA60, 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6,\t0xFA64, 0x9DC7, 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA,\n\t0xFA68, 0x9DCB, 0xFA69, 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE,\t0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2,\n\t0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, 0x9DD5, 0xFA73, 0x9DD6,\t0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, 0xFA77, 0x9DDA,\n\t0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, 0x9DDE,\t0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2,\n\t0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6,\t0xFA85, 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA,\n\t0xFA89, 0x9DEB, 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE,\t0xFA8D, 0x9DEF, 0xFA8E, 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2,\n\t0xFA91, 0x9DF3, 0xFA92, 0x9DF4, 0xFA93, 0x9DF5, 0xFA94, 0x9DF6,\t0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, 0x9DF9, 0xFA98, 0x9DFA,\n\t0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, 0xFA9C, 0x9DFE,\t0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, 0x9E02,\n\t0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06,\t0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A,\n\t0xFB48, 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E,\t0xFB4C, 0x9E0F, 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12,\n\t0xFB50, 0x9E13, 0xFB51, 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16,\t0xFB54, 0x9E17, 0xFB55, 0x9E18, 0xFB56, 0x9E19, 0xFB57, 0x9E1A,\n\t0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, 0x9E1D, 0xFB5B, 0x9E1E,\t0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, 0xFB5F, 0x9E30,\n\t0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, 0x9E40,\t0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53,\n\t0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D,\t0xFB6C, 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62,\n\t0xFB70, 0x9E65, 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72,\t0xFB74, 0x9E74, 0xFB75, 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77,\n\t0xFB78, 0x9E78, 0xFB79, 0x9E79, 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B,\t0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, 0x9E80, 0xFB80, 0x9E81,\n\t0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, 0xFB84, 0x9E86,\t0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, 0x9E8D,\n\t0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91,\t0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97,\n\t0xFB91, 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B,\t0xFB95, 0x9E9C, 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1,\n\t0xFB99, 0x9EA2, 0xFB9A, 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5,\t0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA,\n\t0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, 0x9EAD, 0xFC43, 0x9EAE,\t0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, 0xFC47, 0x9EB2,\n\t0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, 0x9EB7,\t0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF,\n\t0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3,\t0xFC54, 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8,\n\t0xFC58, 0x9ECA, 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0,\t0xFC5C, 0x9ED2, 0xFC5D, 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6,\n\t0xFC60, 0x9ED7, 0xFC61, 0x9ED9, 0xFC62, 0x9EDA, 0xFC63, 0x9EDE,\t0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, 0x9EE4, 0xFC67, 0x9EE6,\n\t0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, 0xFC6B, 0x9EED,\t0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, 0x9EF2,\n\t0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6,\t0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD,\n\t0xFC78, 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02,\t0xFC7C, 0x9F03, 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06,\n\t0xFC81, 0x9F07, 0xFC82, 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A,\t0xFC85, 0x9F0C, 0xFC86, 0x9F0F, 0xFC87, 0x9F11, 0xFC88, 0x9F12,\n\t0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, 0x9F16, 0xFC8C, 0x9F18,\t0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, 0xFC90, 0x9F1D,\n\t0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, 0x9F23,\t0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27,\n\t0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B,\t0xFC9D, 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31,\n\t0xFD40, 0x9F32, 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35,\t0xFD44, 0x9F36, 0xFD45, 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C,\n\t0xFD48, 0x9F3F, 0xFD49, 0x9F40, 0xFD4A, 0x9F41, 0xFD4B, 0x9F42,\t0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, 0x9F46, 0xFD4F, 0x9F47,\n\t0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, 0xFD53, 0x9F4B,\t0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, 0x9F4F,\n\t0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55,\t0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59,\n\t0xFD60, 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D,\t0xFD64, 0x9F5E, 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61,\n\t0xFD68, 0x9F62, 0xFD69, 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65,\t0xFD6C, 0x9F66, 0xFD6D, 0x9F67, 0xFD6E, 0x9F68, 0xFD6F, 0x9F69,\n\t0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, 0x9F6C, 0xFD73, 0x9F6D,\t0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, 0xFD77, 0x9F71,\n\t0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, 0x9F75,\t0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79,\n\t0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D,\t0xFD85, 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D,\n\t0xFD89, 0x9F8E, 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91,\t0xFD8D, 0x9F92, 0xFD8E, 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95,\n\t0xFD91, 0x9F96, 0xFD92, 0x9F97, 0xFD93, 0x9F98, 0xFD94, 0x9F9C,\t0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, 0x9FA1, 0xFD98, 0x9FA2,\n\t0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, 0xFD9C, 0xF92C,\t0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, 0xF9F1,\n\t0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F,\t0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18,\n\t0xFE48, 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23,\t0xFE4C, 0xFA24, 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29,\n\t0, 0\n};\n#endif\n\n#if FF_CODE_PAGE == 949 || FF_CODE_PAGE == 0\t/* Korean */\nstatic const WCHAR uni2oem949[] = {\t/* Unicode --> Korean pairs */\n\t0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7,\t0x00AA, 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6,\n\t0x00B1, 0xA1BE, 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5,\t0x00B6, 0xA2D2, 0x00B7, 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6,\n\t0x00BA, 0xA8AC, 0x00BC, 0xA8F9, 0x00BD, 0xA8F6, 0x00BE, 0xA8FA,\t0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, 0xA8A2, 0x00D7, 0xA1BF,\n\t0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, 0x00E6, 0xA9A1,\t0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, 0xA9AD,\n\t0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5,\t0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8,\n\t0x0140, 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0,\t0x014A, 0xA8AF, 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB,\n\t0x0166, 0xA8AE, 0x0167, 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0,\t0x02D8, 0xA2A8, 0x02D9, 0xA2AB, 0x02DA, 0xA2AA, 0x02DB, 0xA2AD,\n\t0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, 0xA5C2, 0x0393, 0xA5C3,\t0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, 0x0397, 0xA5C7,\n\t0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, 0xA5CB,\t0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF,\n\t0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3,\t0x03A5, 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7,\n\t0x03A9, 0xA5D8, 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3,\t0x03B4, 0xA5E4, 0x03B5, 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7,\n\t0x03B8, 0xA5E8, 0x03B9, 0xA5E9, 0x03BA, 0xA5EA, 0x03BB, 0xA5EB,\t0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, 0xA5EE, 0x03BF, 0xA5EF,\n\t0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, 0x03C4, 0xA5F3,\t0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, 0xA5F7,\n\t0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2,\t0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6,\n\t0x0416, 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB,\t0x041A, 0xACAC, 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF,\n\t0x041E, 0xACB0, 0x041F, 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3,\t0x0422, 0xACB4, 0x0423, 0xACB5, 0x0424, 0xACB6, 0x0425, 0xACB7,\n\t0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, 0xACBA, 0x0429, 0xACBB,\t0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, 0x042D, 0xACBF,\n\t0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, 0xACD2,\t0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6,\n\t0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB,\t0x043A, 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF,\n\t0x043E, 0xACE0, 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3,\t0x0442, 0xACE4, 0x0443, 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7,\n\t0x0446, 0xACE8, 0x0447, 0xACE9, 0x0448, 0xACEA, 0x0449, 0xACEB,\t0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, 0xACEE, 0x044D, 0xACEF,\n\t0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, 0x2015, 0xA1AA,\t0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1,\n\t0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6,\t0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8,\n\t0x2074, 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC,\t0x2083, 0xA9FD, 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9,\n\t0x2109, 0xA2B5, 0x2113, 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5,\t0x2122, 0xA2E2, 0x2126, 0xA7D9, 0x212B, 0xA1CA, 0x2153, 0xA8F7,\n\t0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, 0xA8FC, 0x215D, 0xA8FD,\t0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, 0x2162, 0xA5B2,\n\t0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, 0xA5B6,\t0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1,\n\t0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5,\t0x2175, 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9,\n\t0x2179, 0xA5AA, 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6,\t0x2193, 0xA1E9, 0x2194, 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8,\n\t0x2197, 0xA2D6, 0x2198, 0xA2D9, 0x2199, 0xA2D7, 0x21D2, 0xA2A1,\t0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, 0xA1D3, 0x2203, 0xA2A4,\n\t0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, 0x220F, 0xA2B3,\t0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, 0xA1C4,\n\t0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD,\t0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3,\n\t0x222E, 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD,\t0x223D, 0xA1EF, 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5,\n\t0x2264, 0xA1C2, 0x2265, 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED,\t0x2282, 0xA1F8, 0x2283, 0xA1F9, 0x2286, 0xA1F6, 0x2287, 0xA1F7,\n\t0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, 0xA1D2, 0x2460, 0xA8E7,\t0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, 0x2464, 0xA8EB,\n\t0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, 0xA8EF,\t0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3,\n\t0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8,\t0x2476, 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC,\n\t0x247A, 0xA9ED, 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0,\t0x247E, 0xA9F1, 0x247F, 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4,\n\t0x2482, 0xA9F5, 0x249C, 0xA9CD, 0x249D, 0xA9CE, 0x249E, 0xA9CF,\t0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, 0xA9D2, 0x24A2, 0xA9D3,\n\t0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, 0x24A6, 0xA9D7,\t0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, 0xA9DB,\n\t0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF,\t0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3,\n\t0x24B3, 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD,\t0x24D1, 0xA8CE, 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1,\n\t0x24D5, 0xA8D2, 0x24D6, 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5,\t0x24D9, 0xA8D6, 0x24DA, 0xA8D7, 0x24DB, 0xA8D8, 0x24DC, 0xA8D9,\n\t0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, 0xA8DC, 0x24E0, 0xA8DD,\t0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, 0x24E4, 0xA8E1,\n\t0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, 0xA8E5,\t0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2,\n\t0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7,\t0x250F, 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1,\n\t0x2513, 0xA6AF, 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5,\t0x2517, 0xA6B1, 0x2518, 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3,\n\t0x251B, 0xA6B0, 0x251C, 0xA6A7, 0x251D, 0xA6BC, 0x251E, 0xA6C9,\t0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, 0xA6CB, 0x2522, 0xA6CC,\n\t0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, 0x2526, 0xA6CD,\t0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, 0xA6D0,\n\t0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2,\t0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4,\n\t0x2533, 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6,\t0x2537, 0xA6BA, 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8,\n\t0x253B, 0xA6B5, 0x253C, 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA,\t0x253F, 0xA6BB, 0x2540, 0xA6DB, 0x2541, 0xA6DC, 0x2542, 0xA6C0,\n\t0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, 0xA6DF, 0x2546, 0xA6E0,\t0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, 0x254A, 0xA6E4,\n\t0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, 0xA1E0,\t0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB,\n\t0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3,\t0x25B3, 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5,\n\t0x25BD, 0xA1E4, 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF,\t0x25C7, 0xA1DE, 0x25C8, 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD,\n\t0x25CF, 0xA1DC, 0x25D0, 0xA2C4, 0x25D1, 0xA2C5, 0x2605, 0xA1DA,\t0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, 0xA2CE, 0x261C, 0xA2D0,\n\t0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, 0x2660, 0xA2BC,\t0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, 0xA2BE,\n\t0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC,\t0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2,\n\t0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5,\t0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9,\n\t0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD,\t0x3013, 0xA1EB, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3041, 0xAAA1,\n\t0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, 0xAAA4, 0x3045, 0xAAA5,\t0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, 0x3049, 0xAAA9,\n\t0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, 0xAAAD,\t0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1,\n\t0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5,\t0x3056, 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9,\n\t0x305A, 0xAABA, 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD,\t0x305E, 0xAABE, 0x305F, 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1,\n\t0x3062, 0xAAC2, 0x3063, 0xAAC3, 0x3064, 0xAAC4, 0x3065, 0xAAC5,\t0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, 0xAAC8, 0x3069, 0xAAC9,\n\t0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, 0x306D, 0xAACD,\t0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, 0xAAD1,\n\t0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5,\t0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9,\n\t0x307A, 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD,\t0x307E, 0xAADE, 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1,\n\t0x3082, 0xAAE2, 0x3083, 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5,\t0x3086, 0xAAE6, 0x3087, 0xAAE7, 0x3088, 0xAAE8, 0x3089, 0xAAE9,\n\t0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, 0xAAEC, 0x308D, 0xAAED,\t0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, 0x3091, 0xAAF1,\n\t0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, 0xABA2,\t0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6,\n\t0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA,\t0x30AB, 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE,\n\t0x30AF, 0xABAF, 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2,\t0x30B3, 0xABB3, 0x30B4, 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6,\n\t0x30B7, 0xABB7, 0x30B8, 0xABB8, 0x30B9, 0xABB9, 0x30BA, 0xABBA,\t0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, 0xABBD, 0x30BE, 0xABBE,\n\t0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, 0x30C2, 0xABC2,\t0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, 0xABC6,\n\t0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA,\t0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE,\n\t0x30CF, 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2,\t0x30D3, 0xABD3, 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6,\n\t0x30D7, 0xABD7, 0x30D8, 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA,\t0x30DB, 0xABDB, 0x30DC, 0xABDC, 0x30DD, 0xABDD, 0x30DE, 0xABDE,\n\t0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, 0xABE1, 0x30E2, 0xABE2,\t0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, 0x30E6, 0xABE6,\n\t0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, 0xABEA,\t0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE,\n\t0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2,\t0x30F3, 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6,\n\t0x3131, 0xA4A1, 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4,\t0x3135, 0xA4A5, 0x3136, 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8,\n\t0x3139, 0xA4A9, 0x313A, 0xA4AA, 0x313B, 0xA4AB, 0x313C, 0xA4AC,\t0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, 0xA4AF, 0x3140, 0xA4B0,\n\t0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, 0x3144, 0xA4B4,\t0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, 0xA4B8,\n\t0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC,\t0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0,\n\t0x3151, 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4,\t0x3155, 0xA4C5, 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8,\n\t0x3159, 0xA4C9, 0x315A, 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC,\t0x315D, 0xA4CD, 0x315E, 0xA4CE, 0x315F, 0xA4CF, 0x3160, 0xA4D0,\n\t0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, 0xA4D3, 0x3164, 0xA4D4,\t0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, 0x3168, 0xA4D8,\n\t0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, 0xA4DC,\t0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0,\n\t0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4,\t0x3175, 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8,\n\t0x3179, 0xA4E9, 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC,\t0x317D, 0xA4ED, 0x317E, 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0,\n\t0x3181, 0xA4F1, 0x3182, 0xA4F2, 0x3183, 0xA4F3, 0x3184, 0xA4F4,\t0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, 0xA4F7, 0x3188, 0xA4F8,\n\t0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, 0x318C, 0xA4FC,\t0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, 0xA9B2,\n\t0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6,\t0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA,\n\t0x320A, 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE,\t0x320E, 0xA9BF, 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2,\n\t0x3212, 0xA9C3, 0x3213, 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6,\t0x3216, 0xA9C7, 0x3217, 0xA9C8, 0x3218, 0xA9C9, 0x3219, 0xA9CA,\n\t0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, 0xA2DF, 0x3260, 0xA8B1,\t0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, 0x3264, 0xA8B5,\n\t0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, 0xA8B9,\t0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD,\n\t0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1,\t0x3271, 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5,\n\t0x3275, 0xA8C6, 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9,\t0x3279, 0xA8CA, 0x327A, 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE,\n\t0x3380, 0xA7C9, 0x3381, 0xA7CA, 0x3382, 0xA7CB, 0x3383, 0xA7CC,\t0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, 0xA7BB, 0x338A, 0xA7DC,\n\t0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, 0x338E, 0xA7B7,\t0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, 0xA7D6,\n\t0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2,\t0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC,\n\t0x339B, 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0,\t0x339F, 0xA7B1, 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4,\n\t0x33A3, 0xA7A7, 0x33A4, 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA,\t0x33A7, 0xA7BD, 0x33A8, 0xA7BE, 0x33A9, 0xA7E5, 0x33AA, 0xA7E6,\n\t0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, 0xA7E1, 0x33AE, 0xA7E2,\t0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, 0x33B2, 0xA7C1,\n\t0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, 0xA7C5,\t0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE,\n\t0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2,\t0x33BF, 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3,\n\t0x33C3, 0xA7EC, 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF,\t0x33C7, 0xA2E1, 0x33C8, 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5,\n\t0x33CF, 0xA7B9, 0x33D0, 0xA7EA, 0x33D3, 0xA7EB, 0x33D6, 0xA7DF,\t0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, 0xA7EE, 0x33DD, 0xA7E9,\n\t0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, 0x4E07, 0xD8B2,\t0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, 0xF9BB,\n\t0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0,\t0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA,\n\t0x4E2D, 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1,\t0x4E3B, 0xF1AB, 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9,\n\t0x4E4B, 0xF1FD, 0x4E4D, 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9,\t0x4E56, 0xCED2, 0x4E58, 0xE3AB, 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA,\n\t0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, 0xCAE1, 0x4E6D, 0xD4CC,\t0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, 0x4E7E, 0xCBEB,\n\t0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, 0xDEC0,\t0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6,\n\t0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6,\t0x4E9B, 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1,\n\t0x4EA4, 0xCEDF, 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB,\t0x4EAB, 0xFABD, 0x4EAC, 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5,\n\t0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2,\t0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, 0xD0D1, 0x4ECB, 0xCBBF,\n\t0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, 0x4ED6, 0xF6E2,\t0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, 0xD4CE,\n\t0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4,\t0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0,\n\t0x4EFB, 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5,\t0x4F0B, 0xD0DF, 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1,\n\t0x4F10, 0xDBE9, 0x4F11, 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1,\t0x4F36, 0xD6B6, 0x4F38, 0xE3DF, 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4,\n\t0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, 0xD3A3, 0x4F47, 0xEEB7,\t0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, 0x4F4F, 0xF1AC,\n\t0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, 0xE5F9,\t0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5,\n\t0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD,\t0x4F7A, 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0,\n\t0x4F83, 0xCAC9, 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6,\t0x4F8A, 0xCEC2, 0x4F8B, 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD,\n\t0x4F91, 0xEAE2, 0x4F96, 0xD7C2, 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA,\t0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, 0xFDA5, 0x4FB5, 0xF6D5,\n\t0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, 0x4FC3, 0xF5B5,\t0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, 0xF0BB,\n\t0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4,\t0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF,\n\t0x4FE1, 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC,\t0x4FF3, 0xDBC4, 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF,\n\t0x5002, 0xDCB1, 0x5006, 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1,\t0x500D, 0xDBC3, 0x5011, 0xD9FA, 0x5012, 0xD3EE, 0x5016, 0xFAB8,\n\t0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, 0xF4A6, 0x501E, 0xCCCA,\t0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, 0x5024, 0xF6B7,\n\t0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, 0xE7D2,\t0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6,\n\t0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9,\t0x504F, 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE,\n\t0x5065, 0xCBED, 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF,\t0x5078, 0xF7DE, 0x5080, 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8,\n\t0x5091, 0xCBF8, 0x5098, 0xDFA1, 0x5099, 0xDDE1, 0x50AC, 0xF5CA,\t0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, 0xEEEE, 0x50B5, 0xF3F0,\n\t0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, 0x50C9, 0xF4D2,\t0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, 0xDCD2,\n\t0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9,\t0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8,\n\t0x50FF, 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2,\t0x5106, 0xCCCC, 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1,\n\t0x5121, 0xD6ED, 0x512A, 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3,\t0x513A, 0xD1D3, 0x513C, 0xE5F0, 0x5140, 0xE8B4, 0x5141, 0xEBC3,\n\t0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, 0xF5F6, 0x5146, 0xF0BC,\t0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, 0x514B, 0xD0BA,\n\t0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, 0xE4AE,\t0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE,\n\t0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2,\t0x516C, 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC,\n\t0x5175, 0xDCB2, 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0,\t0x517C, 0xCCC2, 0x5180, 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC,\n\t0x518D, 0xEEA2, 0x5192, 0xD9B3, 0x5195, 0xD8F4, 0x5197, 0xE9B7,\t0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, 0xD8F1, 0x51AC, 0xD4CF,\n\t0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, 0x51C4, 0xF4A2,\t0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, 0xD7D0,\n\t0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB,\t0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5,\n\t0x51F8, 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE,\t0x5200, 0xD3EF, 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7,\n\t0x5208, 0xE7D4, 0x520A, 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD,\t0x5217, 0xD6AA, 0x521D, 0xF4F8, 0x5224, 0xF7F7, 0x5225, 0xDCAC,\n\t0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, 0xCEBE, 0x5230, 0xD3F0,\t0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, 0x5239, 0xF3CB,\n\t0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, 0xF6CE,\t0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1,\n\t0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE,\t0x5261, 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9,\n\t0x5272, 0xF9DC, 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9,\t0x5283, 0xFCF1, 0x5287, 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1,\n\t0x528D, 0xCBFC, 0x5291, 0xF0A5, 0x5292, 0xCBFD, 0x529B, 0xD5F4,\t0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, 0xD6AB, 0x52A4, 0xD0C2,\n\t0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, 0x52BE, 0xFAB6,\t0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, 0xE9B8,\n\t0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1,\t0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2,\n\t0x52DD, 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7,\t0x52E3, 0xEED3, 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4,\n\t0x52F8, 0xCFE8, 0x52FA, 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE,\t0x52FF, 0xDAA8, 0x5305, 0xF8D0, 0x5308, 0xFDD6, 0x530D, 0xF8D1,\n\t0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, 0xDDE2, 0x5316, 0xFBF9,\t0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, 0x5321, 0xCEC4,\n\t0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, 0xF9AF,\t0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6,\n\t0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1,\t0x534A, 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF,\n\t0x5353, 0xF6F1, 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF,\t0x535C, 0xDCD4, 0x535E, 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF,\n\t0x5368, 0xE0D9, 0x536F, 0xD9D6, 0x5370, 0xECD4, 0x5371, 0xEACB,\t0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, 0xCFE9, 0x537D, 0xF1ED,\n\t0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, 0x5398, 0xD7D8,\t0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, 0xCFF0,\n\t0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1,\t0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2,\n\t0x53CD, 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4,\t0x53DB, 0xDAE4, 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2,\n\t0x53E4, 0xCDAF, 0x53E5, 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE,\t0x53EB, 0xD0A3, 0x53EC, 0xE1AF, 0x53ED, 0xF8A3, 0x53EF, 0xCAA6,\n\t0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, 0xDEC8, 0x53F3, 0xE9D3,\t0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, 0x5408, 0xF9EA,\n\t0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, 0xD9A3,\t0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE,\n\t0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5,\t0x5426, 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF,\n\t0x5438, 0xFDE5, 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9,\t0x543E, 0xE7EE, 0x5442, 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1,\n\t0x5451, 0xF7A2, 0x5468, 0xF1B2, 0x546A, 0xF1B1, 0x5471, 0xCDB2,\t0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, 0xE3E2, 0x547C, 0xFBBC,\n\t0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, 0x548C, 0xFBFA,\t0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, 0xEDAA,\n\t0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0,\t0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF,\n\t0x54C8, 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8,\t0x54E8, 0xF4FA, 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9,\n\t0x54FA, 0xF8D4, 0x5504, 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6,\t0x550E, 0xD7DA, 0x5510, 0xD3D0, 0x551C, 0xD8C5, 0x552F, 0xEAE6,\n\t0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, 0xF6E4, 0x5544, 0xF6F2,\t0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, 0x5556, 0xD3BA,\n\t0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, 0xCBD3,\t0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA,\n\t0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0,\t0x559C, 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7,\n\t0x55AA, 0xDFC3, 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4,\t0x55C5, 0xFDAB, 0x55C7, 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0,\n\t0x55DC, 0xD0EE, 0x55DF, 0xF3AA, 0x55E3, 0xDECB, 0x55E4, 0xF6B8,\t0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, 0xF7A3, 0x5609, 0xCAA9,\n\t0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, 0x5632, 0xF0BF,\t0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, 0xD0EF,\n\t0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF,\t0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4,\n\t0x56CA, 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6,\t0x56DB, 0xDECC, 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD,\n\t0x56F9, 0xD6B7, 0x56FA, 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8,\t0x5708, 0xCFEA, 0x570B, 0xCFD0, 0x570D, 0xEACC, 0x5712, 0xEAAE,\n\t0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, 0xD3A5, 0x571F, 0xF7CF,\t0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, 0x573B, 0xD0F0,\n\t0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, 0xDBA9,\t0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5,\n\t0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0,\t0x576E, 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3,\n\t0x5782, 0xE1F7, 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7,\t0x57A0, 0xEBD9, 0x57A2, 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF,\n\t0x57C7, 0xE9B9, 0x57C8, 0xF1D8, 0x57CB, 0xD8D8, 0x57CE, 0xE0F2,\t0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, 0xF3F1, 0x57F4, 0xE3D0,\n\t0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, 0x57FC, 0xD0F2,\t0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, 0xF7D8,\n\t0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC,\t0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED,\n\t0x582F, 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE,\t0x5835, 0xD3F2, 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB,\n\t0x584F, 0xCBC3, 0x5851, 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3,\t0x5858, 0xD3D2, 0x585A, 0xF5C0, 0x585E, 0xDFDD, 0x5861, 0xEEF3,\n\t0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, 0xF2C8, 0x5879, 0xF3D2,\t0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, 0x5885, 0xDFEA,\n\t0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, 0xF1F2,\t0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5,\n\t0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB,\t0x58C1, 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5,\n\t0x58D1, 0xF9C9, 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4,\t0x58D9, 0xCEC5, 0x58DE, 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD,\n\t0x58EB, 0xDECD, 0x58EC, 0xECF3, 0x58EF, 0xEDE0, 0x58F9, 0xECEC,\t0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, 0xE1F8, 0x590F, 0xF9BE,\n\t0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, 0x5919, 0xE2D4,\t0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, 0xD3DE,\n\t0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC,\t0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1,\n\t0x5944, 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5,\t0x594E, 0xD0A5, 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8,\n\t0x5954, 0xDDC6, 0x5955, 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8,\t0x5960, 0xEEF5, 0x5962, 0xDECE, 0x5967, 0xE7F3, 0x596A, 0xF7AC,\n\t0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, 0xE0AB, 0x596E, 0xDDC7,\t0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, 0x597D, 0xFBBF,\n\t0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, 0xECF4,\t0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8,\n\t0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9,\t0x59BB, 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5,\n\t0x59C9, 0xEDAB, 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4,\t0x59D3, 0xE0F3, 0x59D4, 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE,\n\t0x59DC, 0xCBA9, 0x59DD, 0xF1AF, 0x59E6, 0xCACD, 0x59E8, 0xECA9,\t0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, 0xF9F3, 0x59F8, 0xE6C1,\n\t0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, 0x5A03, 0xE8DF,\t0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, 0xD1D6,\n\t0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4,\t0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8,\n\t0x5A49, 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE,\t0x5A92, 0xD8DA, 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8,\n\t0x5AC1, 0xCAAA, 0x5AC2, 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC,\t0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC,\n\t0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, 0xE0BD, 0x5B0C, 0xCEE3,\t0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, 0x5B43, 0xE5BE,\n\t0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, 0xEDA6,\t0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF,\n\t0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5,\t0x5B69, 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF,\n\t0x5B75, 0xDDA2, 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED,\t0x5B85, 0xD3EB, 0x5B87, 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC,\n\t0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5,\t0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, 0xF0F3, 0x5B98, 0xCEAF,\n\t0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, 0x5B9C, 0xEBF1,\t0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, 0xEAE9,\n\t0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5,\t0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB,\n\t0x5BB8, 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2,\t0x5BC2, 0xEED6, 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9,\n\t0x5BC6, 0xDACB, 0x5BC7, 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB,\t0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC,\n\t0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, 0xCDFB, 0x5BE2, 0xF6D6,\t0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, 0x5BE7, 0xD2BB,\n\t0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, 0xCEB0,\t0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4,\n\t0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2,\t0x5C07, 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE,\n\t0x5C0B, 0xE3FC, 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3,\t0x5C11, 0xE1B4, 0x5C16, 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6,\n\t0x5C28, 0xDBAB, 0x5C31, 0xF6A6, 0x5C38, 0xE3B9, 0x5C39, 0xEBC5,\t0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, 0xD2F9, 0x5C3E, 0xDAAD,\n\t0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, 0x5C46, 0xCCFA,\t0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, 0xE3BA,\n\t0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5,\t0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5,\n\t0x5C6F, 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7,\t0x5C91, 0xEDD4, 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB,\n\t0x5CAC, 0xCBA2, 0x5CB1, 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0,\t0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0,\n\t0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, 0xDFC7, 0x5CE8, 0xE4B1,\t0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, 0x5CF6, 0xD3F6,\n\t0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, 0xD5CF,\t0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0,\n\t0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA,\t0x5D4B, 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1,\n\t0x5D6C, 0xE8E3, 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7,\t0x5D9D, 0xD4F1, 0x5DA0, 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5,\n\t0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0,\t0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, 0xE4DC, 0x5DDD, 0xF4B9,\n\t0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, 0x5DE5, 0xCDEF,\t0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, 0xD9E3,\n\t0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3,\t0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE,\n\t0x5E02, 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1,\t0x5E11, 0xF7B6, 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9,\n\t0x5E1D, 0xF0A8, 0x5E25, 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC,\t0x5E33, 0xEDE3, 0x5E36, 0xD3E1, 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6,\n\t0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, 0xE4C1, 0x5E45, 0xF8EB,\t0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, 0x5E5F, 0xF6BA,\n\t0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, 0xCACE,\t0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9,\n\t0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB,\t0x5E7E, 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9,\n\t0x5E8F, 0xDFED, 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2,\t0x5E9C, 0xDDA4, 0x5EA0, 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8,\n\t0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE,\t0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, 0xEAEC, 0x5EC2, 0xDFCB,\n\t0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, 0x5ED0, 0xCFAA,\t0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, 0xEEF8,\n\t0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6,\t0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5,\n\t0x5EFA, 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7,\t0x5F0A, 0xF8C9, 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1,\n\t0x5F14, 0xF0C0, 0x5F15, 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0,\t0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, 0x5F26, 0xFAD7, 0x5F27, 0xFBC1,\n\t0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, 0xEDE5, 0x5F3A, 0xCBAD,\t0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, 0x5F4C, 0xDAAF,\n\t0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, 0xFDC4,\t0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE,\n\t0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF,\t0x5F6D, 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD,\n\t0x5F79, 0xE6B5, 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9,\t0x5F81, 0xEFD6, 0x5F85, 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0,\n\t0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, 0x5F90, 0xDFEF, 0x5F91, 0xCCD3,\t0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, 0xDBC7, 0x5F99, 0xDED5,\n\t0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, 0x5FA8, 0xFCC7,\t0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, 0xF3A3,\n\t0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD,\t0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC,\n\t0x5FD7, 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7,\t0x5FEB, 0xF6E1, 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8,\n\t0x600F, 0xE4E8, 0x6012, 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB,\t0x601D, 0xDED6, 0x6020, 0xF7BD, 0x6021, 0xECAE, 0x6025, 0xD0E1,\n\t0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, 0xCED6, 0x602F, 0xCCA5,\t0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, 0x604D, 0xFCC8,\n\t0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, 0xE5BF,\t0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1,\n\t0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1,\t0x606C, 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6,\n\t0x6085, 0xE6ED, 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0,\t0x6094, 0xFCE2, 0x6096, 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9,\n\t0x609F, 0xE7F6, 0x60A0, 0xEAED, 0x60A3, 0xFCB4, 0x60A4, 0xF5C2,\t0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, 0xDDE8, 0x60B3, 0xD3ED,\n\t0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, 0x60BC, 0xD3FA,\t0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, 0xFBE3,\n\t0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3,\t0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC,\n\t0x60F6, 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3,\t0x6101, 0xE1FE, 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0,\n\t0x610D, 0xDAC0, 0x610E, 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3,\t0x611A, 0xE9D7, 0x611B, 0xE4F1, 0x611F, 0xCAEF, 0x6127, 0xCED7,\n\t0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, 0xCBC4, 0x613C, 0xE3E5,\t0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, 0x6144, 0xD7C9,\n\t0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, 0xF7BE,\t0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3,\n\t0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7,\t0x6163, 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6,\n\t0x616B, 0xF0F6, 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4,\t0x6177, 0xCBAF, 0x617D, 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3,\n\t0x6182, 0xE9D8, 0x618A, 0xDDE9, 0x618E, 0xF1F3, 0x6190, 0xD5FB,\t0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, 0xFDF3, 0x6199, 0xFDF2,\n\t0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, 0x61A9, 0xCCA8,\t0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, 0xFACA,\n\t0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4,\t0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8,\n\t0x61CB, 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB,\t0x61F7, 0xFCE3, 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB,\n\t0x61FF, 0xEBF3, 0x6200, 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC,\t0x620A, 0xD9E6, 0x620C, 0xE2F9, 0x620D, 0xE2A1, 0x620E, 0xEBD4,\n\t0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, 0xCCFC, 0x6216, 0xFBE4,\t0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, 0x622A, 0xEFB8,\n\t0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, 0xD3E3,\t0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6,\n\t0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA,\t0x624B, 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5,\n\t0x626E, 0xDDCA, 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB,\t0x627C, 0xE4F9, 0x627F, 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC,\n\t0x6289, 0xCCBC, 0x628A, 0xF7EA, 0x6291, 0xE5E4, 0x6292, 0xDFF1,\t0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, 0xEFB9, 0x629B, 0xF8D8,\n\t0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, 0x62B9, 0xD8C6,\t0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, 0xD9E7,\n\t0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0,\t0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC,\n\t0x62D4, 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC,\t0x62D9, 0xF0F0, 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0,\n\t0x62ED, 0xE3D4, 0x62EE, 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2,\t0x62F3, 0xCFEB, 0x62F7, 0xCDB8, 0x62FE, 0xE3A6, 0x62FF, 0xD1DA,\n\t0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, 0xE4CE, 0x6311, 0xD3FB,\t0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, 0x633B, 0xE6C9,\n\t0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, 0xF8A4,\t0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9,\n\t0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF,\t0x637A, 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7,\n\t0x6388, 0xE2A3, 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9,\t0x6396, 0xE4FA, 0x6398, 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3,\n\t0x63A1, 0xF3F5, 0x63A2, 0xF7AE, 0x63A5, 0xEFC8, 0x63A7, 0xCDF3,\t0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, 0xF0C2, 0x63C0, 0xCAD1,\n\t0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, 0x63D0, 0xF0AB,\t0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, 0xE4C4,\n\t0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA,\t0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8,\n\t0x6416, 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA,\t0x642C, 0xDAE6, 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6,\n\t0x6458, 0xEED7, 0x6460, 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7,\t0x6478, 0xD9B8, 0x6479, 0xD9B9, 0x647A, 0xEFC9, 0x6488, 0xD6CE,\n\t0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, 0xE8F5, 0x649A, 0xD2B5,\t0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, 0x64AB, 0xD9E8,\n\t0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, 0xDAD2,\t0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA,\n\t0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6,\t0x64D2, 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0,\n\t0x64E1, 0xD3E4, 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD,\t0x64E7, 0xCBE1, 0x64EC, 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA,\n\t0x64FA, 0xF7EC, 0x64FE, 0xE8F6, 0x6500, 0xDAE7, 0x6504, 0xF7CC,\t0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, 0xD5FD, 0x652A, 0xCEE6,\n\t0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, 0x6536, 0xE2A5,\t0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, 0xCDF4,\n\t0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9,\t0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD,\n\t0x6556, 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2,\t0x6563, 0xDFA4, 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2,\n\t0x6572, 0xCDBB, 0x6574, 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7,\t0x6578, 0xE2A6, 0x657E, 0xE0C0, 0x6582, 0xD6B0, 0x6583, 0xF8CA,\n\t0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, 0xDEB0, 0x6590, 0xDDEC,\t0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, 0x659B, 0xCDD7,\n\t0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, 0xD0C5,\t0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6,\n\t0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0,\t0x65BC, 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9,\n\t0x65CB, 0xE0C1, 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2,\t0x65D7, 0xD0FD, 0x65E0, 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED,\n\t0x65E6, 0xD3A9, 0x65E8, 0xF2A9, 0x65E9, 0xF0C4, 0x65EC, 0xE2E2,\t0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, 0xE9D9, 0x65FA, 0xE8DA,\n\t0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, 0x65FF, 0xE7FA,\t0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, 0xFBC4,\n\t0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB,\t0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA,\n\t0x661E, 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0,\t0x6627, 0xD8DC, 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0,\n\t0x6630, 0xF9C0, 0x6631, 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4,\t0x663A, 0xDCB6, 0x663B, 0xE4E9, 0x6641, 0xF0C5, 0x6642, 0xE3C1,\n\t0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, 0xF2CB, 0x664B, 0xF2CC,\t0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, 0x665D, 0xF1B8,\n\t0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, 0xFCB7,\t0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9,\n\t0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF,\t0x6674, 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD,\n\t0x667A, 0xF2AA, 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB,\t0x6689, 0xFDC7, 0x668E, 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4,\n\t0x6696, 0xD1EC, 0x6697, 0xE4DE, 0x6698, 0xE5C3, 0x669D, 0xD9A6,\t0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, 0xEDD5, 0x66AE, 0xD9BA,\n\t0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, 0x66B9, 0xE0E7,\t0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, 0xD5F5,\n\t0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5,\t0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6,\n\t0x66F0, 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA,\t0x66F7, 0xCAE3, 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6,\n\t0x66FC, 0xD8BA, 0x66FE, 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC,\t0x6703, 0xFCE5, 0x6708, 0xEAC5, 0x6709, 0xEAF3, 0x670B, 0xDDDB,\n\t0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, 0xF2F9, 0x6717, 0xD5C7,\t0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, 0x671F, 0xD1A2,\n\t0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, 0xDAB1,\t0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4,\n\t0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5,\t0x673D, 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD,\n\t0x674F, 0xFABA, 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5,\t0x6756, 0xEDE8, 0x675C, 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6,\n\t0x676D, 0xF9F8, 0x676F, 0xDBCA, 0x6770, 0xCBF9, 0x6771, 0xD4D4,\t0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, 0xF7ED, 0x677B, 0xD2EE,\n\t0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, 0x6789, 0xE8DB,\t0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, 0xD4E2,\n\t0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD,\t0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC,\n\t0x67B6, 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2,\t0x67C4, 0xDCB7, 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3,\n\t0x67D2, 0xF6D3, 0x67D3, 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6,\t0x67DD, 0xF6F9, 0x67E9, 0xCFAF, 0x67EC, 0xCAD3, 0x67EF, 0xCAAF,\n\t0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, 0xD7B3, 0x67F4, 0xE3C3,\t0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, 0x67FE, 0xEFDE,\n\t0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, 0xD7CA,\t0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1,\n\t0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8,\t0x6840, 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE,\n\t0x6848, 0xE4D0, 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD,\t0x6853, 0xFCB8, 0x6854, 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2,\n\t0x687F, 0xCAD4, 0x6881, 0xD5D9, 0x6885, 0xD8DE, 0x688F, 0xCDD9,\t0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, 0xCCDB, 0x689D, 0xF0C9,\n\t0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, 0x68A7, 0xE7FC,\t0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, 0xCCFE,\n\t0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2,\t0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4,\n\t0x68CD, 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA,\t0x68D8, 0xD0BE, 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6,\n\t0x68E7, 0xEDD0, 0x68E8, 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8,\t0x68F9, 0xD4A1, 0x68FA, 0xCEB2, 0x6900, 0xE8CA, 0x6905, 0xEBF5,\n\t0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, 0xF5A1, 0x6927, 0xD9A7,\t0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, 0x694A, 0xE5C5,\n\t0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, 0xCBF1,\t0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8,\n\t0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF,\t0x696B, 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4,\n\t0x6975, 0xD0BF, 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3,\t0x6995, 0xE9BE, 0x699B, 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE,\n\t0x69A7, 0xDDEE, 0x69AE, 0xE7B4, 0x69B4, 0xD7B4, 0x69BB, 0xF7B4,\t0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, 0xCFB0, 0x69CC, 0xF7D9,\n\t0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, 0x69EA, 0xCBC8,\t0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, 0xE4C5,\n\t0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0,\t0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC,\n\t0x6A23, 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7,\t0x6A3A, 0xFBFC, 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA,\n\t0x6A4B, 0xCEE9, 0x6A52, 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9,\t0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4,\n\t0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, 0xEFE0, 0x6A8D, 0xE5E5,\t0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, 0x6AA2, 0xCBFE,\n\t0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, 0xD4A2,\t0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE,\n\t0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED,\t0x6B0C, 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2,\n\t0x6B21, 0xF3AD, 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7,\t0x6B3D, 0xFDE3, 0x6B3E, 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE,\n\t0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2,\t0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, 0xEFE1, 0x6B64, 0xF3AE,\n\t0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, 0x6B72, 0xE1A8,\t0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, 0xD9D1,\n\t0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6,\t0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9,\n\t0x6BAE, 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB,\t0x6BB7, 0xEBDC, 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC,\n\t0x6BC1, 0xFDC3, 0x6BC5, 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC,\t0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE,\n\t0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, 0xDDF1, 0x6BD8, 0xDDF2,\t0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, 0x6C08, 0xEEFD,\n\t0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, 0xD1A8,\t0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0,\n\t0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1,\t0x6C50, 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD,\n\t0x6C5D, 0xE6A3, 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE,\t0x6C68, 0xCDE7, 0x6C6A, 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0,\n\t0x6C72, 0xD0E3, 0x6C76, 0xDAA1, 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9,\t0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, 0xD1AA, 0x6C83, 0xE8AA,\n\t0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, 0x6C88, 0xF6D8,\t0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, 0xD3CB,\n\t0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE,\t0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1,\n\t0x6CB3, 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD,\t0x6CBC, 0xE1BB, 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD,\n\t0x6CC1, 0xFCCF, 0x6CC2, 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB,\t0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6,\n\t0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, 0xF8DC, 0x6CE2, 0xF7EE,\t0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, 0x6CEB, 0xFADA,\n\t0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, 0xE7B6,\t0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9,\n\t0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0,\t0x6D27, 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD,\n\t0x6D35, 0xE2E7, 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7,\t0x6D3B, 0xFCC0, 0x6D3D, 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5,\n\t0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB,\t0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, 0xD5C8, 0x6D6C, 0xD7DF,\n\t0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, 0x6D78, 0xF6D9,\t0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, 0xCCDC,\n\t0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD,\t0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1,\n\t0x6DAF, 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3,\t0x6DC3, 0xCFEE, 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE,\n\t0x6DC7, 0xD1AB, 0x6DCB, 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7,\t0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7,\n\t0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, 0xD7C5, 0x6DEB, 0xEBE2,\t0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, 0x6DF5, 0xE6D0,\n\t0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, 0xF4BC,\t0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2,\n\t0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4,\t0x6E23, 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE,\n\t0x6E2B, 0xE0DE, 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB,\t0x6E32, 0xE0C2, 0x6E34, 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD,\n\t0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9,\t0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, 0xF1BE, 0x6E4D, 0xD3AC,\n\t0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, 0x6E5C, 0xE3D7,\t0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, 0xF5D3,\n\t0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9,\t0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6,\n\t0x6E9D, 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA,\t0x6EAA, 0xCDA2, 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1,\n\t0x6EB6, 0xE9C1, 0x6EBA, 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7,\t0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF,\n\t0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, 0xEEAB, 0x6ED4, 0xD4A5,\t0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, 0x6EFE, 0xCDE3,\n\t0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, 0xF6D4,\t0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC,\n\t0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC,\t0x6F2C, 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2,\n\t0x6F3F, 0xEDEC, 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE,\t0x6F57, 0xF2FC, 0x6F58, 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6,\n\t0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, 0x6F62, 0xFCD2, 0x6F64, 0xEBC8,\t0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, 0xCFF7, 0x6F7A, 0xEDD2,\n\t0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, 0x6F81, 0xDFBB,\t0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, 0xF8B1,\n\t0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4,\t0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD,\n\t0x6FB1, 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6,\t0x6FC0, 0xCCAD, 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8,\n\t0x6FCA, 0xE7D8, 0x6FD5, 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD,\t0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD,\n\t0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, 0xF6FB, 0x6FF1, 0xDEB4,\t0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, 0x7006, 0xD4B9,\n\t0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, 0xF8EE,\t0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA,\n\t0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE,\t0x7023, 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB,\n\t0x7037, 0xECCB, 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5,\t0x7051, 0xE1EE, 0x7058, 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD,\n\t0x706B, 0xFBFD, 0x7070, 0xFCE9, 0x7078, 0xCFB6, 0x707C, 0xEDC7,\t0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, 0xF6A7, 0x708E, 0xE6FA,\n\t0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, 0x709A, 0xCEC9,\t0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, 0xCBE3,\n\t0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0,\t0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE,\n\t0x70CF, 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6,\t0x70DF, 0xE6D3, 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB,\n\t0x7104, 0xFDB6, 0x7109, 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC,\t0x711A, 0xDDCD, 0x711E, 0xD4C8, 0x7121, 0xD9ED, 0x7126, 0xF5A5,\n\t0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, 0xFDC8, 0x7149, 0xD6A1,\t0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, 0x7150, 0xE7BC,\n\t0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, 0xDFB0,\t0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE,\n\t0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3,\t0x7184, 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7,\n\t0x7192, 0xFBA7, 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9,\t0x71A2, 0xDCEC, 0x71AC, 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8,\n\t0x71BA, 0xFDF9, 0x71BE, 0xF6BF, 0x71C1, 0xE7A7, 0x71C3, 0xE6D7,\t0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, 0xD6FA, 0x71D0, 0xD7F2,\n\t0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, 0x71DF, 0xE7BD,\t0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, 0xF5B7,\n\t0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7,\t0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3,\n\t0x721B, 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3,\t0x7230, 0xEABA, 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB,\n\t0x723A, 0xE5AC, 0x723B, 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3,\t0x7240, 0xDFD1, 0x7246, 0xEDED, 0x7247, 0xF8B8, 0x7248, 0xF7FA,\n\t0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, 0xD4BA, 0x7259, 0xE4B3,\t0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, 0x7261, 0xD9C0,\n\t0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, 0xDFE5,\t0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0,\n\t0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3,\t0x72C0, 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4,\n\t0x72D0, 0xFBCF, 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA,\t0x72E9, 0xE2AD, 0x72F8, 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9,\n\t0x72FD, 0xF8AC, 0x730A, 0xE7D9, 0x7316, 0xF3E9, 0x731B, 0xD8ED,\t0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, 0xE8E5, 0x7329, 0xE0FA,\n\t0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, 0x7337, 0xEBA3,\t0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, 0xDEE2,\n\t0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC,\t0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4,\n\t0x7378, 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC,\t0x7386, 0xEDB5, 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD,\n\t0x738E, 0xEFE9, 0x7394, 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB,\t0x7398, 0xD1AC, 0x739F, 0xDAC7, 0x73A7, 0xEBC9, 0x73A9, 0xE8CC,\n\t0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, 0xD3E5, 0x73B9, 0xFADD,\t0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, 0x73CA, 0xDFA6,\n\t0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, 0xCECB,\t0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1,\n\t0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0,\t0x73E9, 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE,\n\t0x73F9, 0xE0FB, 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4,\t0x7403, 0xCFB9, 0x7405, 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF,\n\t0x7409, 0xD7B8, 0x7413, 0xE8CD, 0x741B, 0xF6DA, 0x7420, 0xEFA2,\t0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, 0xFBD0, 0x7426, 0xD1AD,\n\t0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, 0x742C, 0xE8CE,\t0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, 0xD7FB,\n\t0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD,\t0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1,\n\t0x7443, 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2,\t0x7457, 0xEABC, 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0,\n\t0x745C, 0xEBA5, 0x745E, 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9,\t0x7462, 0xE9C3, 0x7464, 0xE8FD, 0x7465, 0xE8AF, 0x7468, 0xF2D3,\n\t0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, 0xD5CB, 0x747E, 0xD0C8,\t0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, 0x7489, 0xD6A2,\n\t0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, 0xDAD7,\t0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0,\n\t0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB,\t0x74B2, 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE,\n\t0x74BF, 0xE0C7, 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA,\t0x74D4, 0xE7C2, 0x74D8, 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE,\n\t0x74E0, 0xFBD2, 0x74E2, 0xF8F8, 0x74E3, 0xF7FB, 0x74E6, 0xE8BF,\t0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, 0xDCBA, 0x7504, 0xCCB4,\n\t0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, 0x751A, 0xE4A4,\t0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, 0xDFE7,\n\t0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5,\t0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9,\n\t0x7537, 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4,\t0x754C, 0xCDA3, 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC,\n\t0x7554, 0xDAED, 0x7559, 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5,\t0x755D, 0xD9EF, 0x7562, 0xF9B4, 0x7565, 0xD5D4, 0x7566, 0xFDCF,\n\t0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, 0xECB6, 0x7575, 0xFBFE,\t0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, 0x757F, 0xD1B2,\n\t0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, 0xF9B5,\t0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8,\n\t0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA,\t0x75B3, 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6,\n\t0x75BC, 0xD4D9, 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2,\t0x75C5, 0xDCBB, 0x75C7, 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA,\n\t0x75D4, 0xF6C0, 0x75D5, 0xFDDD, 0x75D8, 0xD4E3, 0x75D9, 0xCCE2,\t0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, 0xD3C3, 0x75F2, 0xD8A6,\n\t0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, 0x7600, 0xE5DC,\t0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, 0xF4B0,\n\t0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1,\t0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6,\n\t0x7652, 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB,\t0x7669, 0xD4FD, 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6,\n\t0x7678, 0xCDA4, 0x767B, 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC,\t0x767E, 0xDBDD, 0x7684, 0xEEDC, 0x7686, 0xCBCB, 0x7687, 0xFCD5,\n\t0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, 0xFBD3, 0x76AE, 0xF9AB,\t0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, 0x76C3, 0xDBCD,\n\t0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, 0xF9EC,\t0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3,\n\t0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF,\t0x76E7, 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1,\n\t0x76F8, 0xDFD3, 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD,\t0x7704, 0xD8F8, 0x7708, 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7,\n\t0x771E, 0xF2D8, 0x7720, 0xD8F9, 0x7729, 0xFADF, 0x7737, 0xCFEF,\t0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, 0xE4D1, 0x7740, 0xF3B7,\n\t0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, 0x7763, 0xD4BD,\t0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, 0xCDC2,\n\t0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE,\t0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9,\n\t0x77B3, 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA,\t0x77D7, 0xF5B8, 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5,\n\t0x77E3, 0xEBF8, 0x77E5, 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD,\t0x77EE, 0xE8E1, 0x77EF, 0xCEEC, 0x77F3, 0xE0B4, 0x7802, 0xDEE3,\n\t0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, 0xF3F6, 0x7827, 0xF6DB,\t0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, 0x7845, 0xD0A9,\n\t0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, 0xCCE3,\t0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED,\n\t0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8,\t0x7897, 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5,\n\t0x78BA, 0xFCAC, 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8,\t0x78C5, 0xDBB6, 0x78CA, 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5,\n\t0x78D0, 0xDAF1, 0x78E8, 0xD8A8, 0x78EC, 0xCCE4, 0x78EF, 0xD1B4,\t0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, 0xF5A7, 0x790E, 0xF5A8,\n\t0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, 0x792C, 0xDAF3,\t0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, 0xD1B5,\n\t0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE,\t0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4,\n\t0x795C, 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6,\t0x7965, 0xDFD4, 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8,\n\t0x797F, 0xD6DF, 0x7981, 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE,\t0x798F, 0xDCD8, 0x7991, 0xE9DF, 0x79A6, 0xE5DD, 0x79A7, 0xFDFB,\n\t0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, 0xD4AA, 0x79B3, 0xE5CC,\t0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, 0x79BF, 0xD4BE,\n\t0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, 0xD2B6,\t0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9,\n\t0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA,\t0x79E7, 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC,\n\t0x7A05, 0xE1AA, 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA,\t0x7A14, 0xECF9, 0x7A17, 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3,\n\t0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA,\t0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, 0xF2C3, 0x7A3B, 0xD4AB,\n\t0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, 0x7A40, 0xCDDA,\t0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, 0xE7C4,\n\t0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1,\t0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC,\n\t0x7A79, 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE,\t0x7A81, 0xD4CD, 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2,\n\t0x7A93, 0xF3EB, 0x7A95, 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF,\t0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2,\n\t0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, 0xD0AB, 0x7AC7, 0xD4E4,\t0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, 0x7AD9, 0xF3D7,\n\t0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, 0xF1E2,\t0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE,\n\t0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA,\t0x7B0F, 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE,\n\t0x7B1E, 0xF7C2, 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF,\t0x7B2D, 0xD6BD, 0x7B39, 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5,\n\t0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA,\t0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, 0xF7D5, 0x7B54, 0xD3CD,\n\t0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, 0x7B6E, 0xDFFB,\t0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, 0xEFA8,\n\t0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9,\t0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9,\n\t0x7BB1, 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD,\t0x7BC1, 0xFCD6, 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9,\n\t0x7BC9, 0xF5E9, 0x7BD2, 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF,\t0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF,\n\t0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, 0xEDD8, 0x7C2B, 0xE1C7,\t0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, 0x7C43, 0xD5BE,\n\t0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, 0xF4D9,\t0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF,\n\t0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4,\t0x7C9F, 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB,\n\t0x7CB1, 0xD5DC, 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6,\t0x7CBE, 0xEFF1, 0x7CCA, 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0,\n\t0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7,\t0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, 0xF1C4, 0x7D04, 0xE5B3,\n\t0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, 0x7D08, 0xFCBC,\t0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, 0xD2EF,\n\t0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5,\t0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7,\n\t0x7D22, 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF,\t0x7D2F, 0xD7AB, 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7,\n\t0x7D39, 0xE1C9, 0x7D3A, 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1,\t0x7D44, 0xF0DA, 0x7D45, 0xCCE7, 0x7D46, 0xDAF4, 0x7D50, 0xCCBF,\n\t0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, 0xFAE2, 0x7D66, 0xD0E5,\t0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, 0x7D71, 0xF7D6,\n\t0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, 0xCCB5,\t0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8,\n\t0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8,\t0x7DAD, 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE,\n\t0x7DB5, 0xF3F7, 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA,\t0x7DBD, 0xEDCA, 0x7DBE, 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5,\n\t0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5,\t0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, 0xD3B0, 0x7DE0, 0xF4F3,\n\t0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, 0x7DE9, 0xE8D0,\t0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, 0xF6C6,\n\t0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA,\t0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD,\n\t0x7E23, 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0,\t0x7E31, 0xF0FD, 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0,\n\t0x7E41, 0xDBE5, 0x7E43, 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3,\t0x7E52, 0xF1F9, 0x7E54, 0xF2C4, 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4,\n\t0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, 0xFCEB, 0x7E6B, 0xCDA8,\t0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, 0x7E7C, 0xCDA9,\n\t0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, 0xE7C5,\t0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF,\n\t0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2,\t0x7F50, 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA,\n\t0x7F6B, 0xCED1, 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE,\t0x7F75, 0xD8E1, 0x7F77, 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE,\n\t0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8,\t0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, 0xE2BA, 0x7FA4, 0xCFD8,\n\t0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, 0x7FB8, 0xD7E8,\t0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, 0xE3C7,\n\t0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7,\t0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8,\n\t0x7FE1, 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7,\t0x7FF9, 0xCEEE, 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5,\n\t0x8003, 0xCDC5, 0x8005, 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE,\t0x800C, 0xECBB, 0x8010, 0xD2B1, 0x8015, 0xCCE9, 0x8017, 0xD9C4,\n\t0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, 0xECBC, 0x8036, 0xE5AD,\t0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, 0x8046, 0xD6C0,\n\t0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, 0xF6A9,\t0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2,\n\t0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC,\t0x807F, 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB,\n\t0x8087, 0xF0DC, 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF,\t0x8096, 0xF5AB, 0x809B, 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6,\n\t0x80A2, 0xF2B6, 0x80A5, 0xDDFE, 0x80A9, 0xCCB7, 0x80AA, 0xDBB8,\t0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, 0xEBC0, 0x80B4, 0xFDA2,\n\t0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, 0x80CC, 0xDBCE,\t0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, 0xF8E0,\n\t0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD,\t0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7,\n\t0x8105, 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6,\t0x810A, 0xF4B1, 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB,\n\t0x8123, 0xE2EE, 0x8129, 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1,\t0x8139, 0xF3EC, 0x813E, 0xDEA1, 0x814B, 0xE4FD, 0x814E, 0xE3EC,\n\t0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, 0xCBB7, 0x8155, 0xE8D3,\t0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, 0x8170, 0xE9A6,\n\t0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, 0xE0CD,\t0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB,\n\t0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3,\t0x81A0, 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE,\n\t0x81B5, 0xF5FD, 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC,\t0x81BF, 0xD2DB, 0x81C0, 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6,\n\t0x81CD, 0xF0B0, 0x81D8, 0xD5C4, 0x81DF, 0xEDF4, 0x81E3, 0xE3ED,\t0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, 0xD7FC, 0x81EA, 0xEDBB,\n\t0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, 0x81FA, 0xD3E6,\t0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, 0xCFC0,\n\t0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF,\t0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF,\n\t0x821E, 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE,\t0x822B, 0xDBBA, 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC,\n\t0x8237, 0xFAE4, 0x8239, 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9,\t0x8247, 0xEFF3, 0x8259, 0xF3ED, 0x8264, 0xEBFA, 0x8266, 0xF9E6,\n\t0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, 0xCADE, 0x8272, 0xDFE4,\t0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, 0x828B, 0xE9E3,\n\t0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, 0xDDB3,\t0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE,\n\t0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4,\t0x82AE, 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB,\n\t0x82B7, 0xF2BA, 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6,\t0x82BC, 0xD9C5, 0x82BD, 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD,\n\t0x82D2, 0xE6FE, 0x82D4, 0xF7C4, 0x82D5, 0xF5AD, 0x82D7, 0xD9E0,\t0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, 0xCFC2, 0x82E1, 0xECBE,\n\t0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, 0x82F1, 0xE7C8,\t0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, 0xD9F2,\n\t0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9,\t0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA,\n\t0x8331, 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE,\t0x8338, 0xE9C7, 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB,\n\t0x8349, 0xF5AE, 0x834A, 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF,\t0x8352, 0xFCD8, 0x8373, 0xD4E5, 0x8377, 0xF9C3, 0x837B, 0xEEE2,\n\t0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, 0xDEED, 0x8396, 0xCCEC,\t0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, 0x83A9, 0xDDB4,\n\t0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, 0xF4EA,\t0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6,\n\t0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC,\t0x83EB, 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4,\n\t0x83F2, 0xDEA3, 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD,\t0x8403, 0xF5FE, 0x8404, 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0,\n\t0x840D, 0xF8C3, 0x840E, 0xEAD7, 0x8429, 0xF5D7, 0x842C, 0xD8BF,\t0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, 0xD5AA, 0x8449, 0xE7A8,\n\t0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, 0x8463, 0xD4DD,\t0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, 0xE5B5,\n\t0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8,\t0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4,\n\t0x84B8, 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA,\t0x84C0, 0xE1E0, 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6,\n\t0x84C9, 0xE9C8, 0x84CB, 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE,\t0x84DA, 0xE2BE, 0x84EC, 0xDCEF, 0x84EE, 0xD6A5, 0x84F4, 0xE2F1,\n\t0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, 0xD8C0, 0x8514, 0xDCDB,\t0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, 0x851E, 0xD7AD,\n\t0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, 0xE1CA,\t0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9,\n\t0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0,\t0x8553, 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2,\n\t0x8569, 0xF7B9, 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD,\t0x8587, 0xDAB9, 0x858F, 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9,\n\t0x859B, 0xE0E0, 0x85A6, 0xF4C0, 0x85A8, 0xFDBC, 0x85A9, 0xDFB1,\t0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, 0xFDB9, 0x85BA, 0xF0B1,\n\t0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, 0x85CE, 0xE3F0,\t0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, 0xE7DD,\n\t0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF,\t0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB,\n\t0x8602, 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3,\t0x8616, 0xE5EE, 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5,\n\t0x863F, 0xD5A1, 0x864E, 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3,\t0x8655, 0xF4A5, 0x865B, 0xFAC8, 0x865C, 0xD6D7, 0x865E, 0xE9E5,\n\t0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, 0xFBF6, 0x868A, 0xDAA5,\t0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, 0x86A4, 0xF0DE,\n\t0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, 0xFCEE,\t0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED,\n\t0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0,\t0x8703, 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4,\n\t0x871C, 0xDACC, 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9,\t0x875F, 0xEADA, 0x8766, 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD,\n\t0x8776, 0xEFCA, 0x8778, 0xE8C4, 0x8782, 0xD5CC, 0x878D, 0xEBD7,\t0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, 0xD3D9, 0x87BA, 0xD5A2,\n\t0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, 0x87EF, 0xE9A8,\t0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, 0xE0EA,\n\t0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE,\t0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC,\n\t0x8846, 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5,\t0x8853, 0xE2FA, 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB,\n\t0x885D, 0xF5FA, 0x8861, 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD,\t0x8868, 0xF8FA, 0x886B, 0xDFB9, 0x8870, 0xE1F1, 0x8872, 0xD2A4,\n\t0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, 0xD0DB, 0x8881, 0xEABE,\t0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, 0x888D, 0xF8E5,\n\t0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, 0xCDE5,\t0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE,\n\t0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9,\t0x88DC, 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB,\n\t0x88E8, 0xDEA5, 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1,\t0x88F8, 0xD5A3, 0x88FD, 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8,\n\t0x8912, 0xF8E6, 0x8913, 0xDCCE, 0x8918, 0xEADC, 0x8919, 0xDBD2,\t0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, 0xE3A8, 0x8938, 0xD7AE,\n\t0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, 0x895F, 0xD0DC,\t0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, 0xE0A4,\n\t0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE,\t0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA,\n\t0x89A1, 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC,\t0x89BA, 0xCAC6, 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7,\n\t0x89E3, 0xFAB0, 0x89F4, 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB,\t0x8A02, 0xEFF4, 0x8A03, 0xDDB5, 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2,\n\t0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, 0xFDBA, 0x8A16, 0xFDE1,\t0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, 0x8A1D, 0xE4B8,\n\t0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, 0xDBBE,\t0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8,\n\t0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF,\t0x8A55, 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9,\n\t0x8A62, 0xE2F3, 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC,\t0x8A6D, 0xCFF8, 0x8A6E, 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5,\n\t0x8A72, 0xFAB1, 0x8A73, 0xDFD9, 0x8A75, 0xE0D2, 0x8A79, 0xF4DA,\t0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, 0xF2BC, 0x8A8D, 0xECE3,\n\t0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, 0x8A9E, 0xE5DE,\t0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, 0xE8A6,\n\t0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3,\t0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE,\n\t0x8ABE, 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4,\t0x8AC7, 0xD3C8, 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8,\n\t0x8AD2, 0xD5DF, 0x8AD6, 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3,\t0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5,\n\t0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, 0xEDBF, 0x8AF1, 0xFDC9,\t0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, 0x8AFA, 0xE5EC,\n\t0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, 0xEADD,\t0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC,\n\t0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0,\t0x8B1B, 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8,\n\t0x8B2B, 0xEEE3, 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD,\t0x8B41, 0xFCA6, 0x8B49, 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1,\n\t0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, 0x8B5C, 0xDCCF, 0x8B66, 0xCCED,\t0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, 0xECA1, 0x8B74, 0xCCB9,\n\t0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, 0x8B8A, 0xDCA8,\t0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, 0xF3D9,\n\t0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3,\t0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5,\n\t0x8C55, 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF,\t0x8C6B, 0xE7E3, 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0,\n\t0x8C8A, 0xD8E7, 0x8C8C, 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6,\t0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8,\n\t0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, 0xF7B1, 0x8CAB, 0xCEBB,\t0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, 0x8CB3, 0xECC3,\n\t0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, 0xD3E8,\t0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5,\n\t0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC,\t0x8CC4, 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4,\n\t0x8CD1, 0xF2E1, 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4,\t0x8CDE, 0xDFDB, 0x8CE0, 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3,\n\t0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE,\t0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, 0xCFC5, 0x8CFD, 0xDFDF,\n\t0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, 0x8D08, 0xF1FC,\t0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, 0xE1DB,\n\t0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB,\t0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1,\n\t0x8D8A, 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9,\t0x8DB3, 0xF0EB, 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5,\n\t0x8DCB, 0xDBA2, 0x8DCC, 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5,\t0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5,\n\t0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, 0xE9C9, 0x8E0F, 0xD3CE,\t0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, 0x8E30, 0xEBB2,\n\t0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, 0xCBF4,\t0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC,\n\t0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3,\t0x8E81, 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8,\n\t0x8EAA, 0xD7F5, 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6,\t0x8ECA, 0xF3B3, 0x8ECB, 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA,\n\t0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE,\t0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, 0xCEF2, 0x8F05, 0xD6D9,\n\t0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, 0x8F14, 0xDCD0,\t0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, 0xFDCA,\n\t0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE,\t0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD,\n\t0x8F38, 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD,\t0x8F3F, 0xE6AB, 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE,\n\t0x8F4D, 0xF4D0, 0x8F4E, 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE,\t0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8,\n\t0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, 0xDEF6, 0x8FAF, 0xDCAA,\t0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, 0x8FC2, 0xE9E6,\n\t0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, 0xDAF7,\t0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7,\n\t0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9,\t0x8FFD, 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1,\n\t0x9003, 0xD4B1, 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD,\t0x900B, 0xF8E7, 0x900D, 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF,\n\t0x9011, 0xCFC7, 0x9014, 0xD4B2, 0x9015, 0xCCEF, 0x9017, 0xD4E8,\t0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, 0xE0A6, 0x901E, 0xD6C1,\n\t0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, 0x9022, 0xDCF1,\t0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, 0xF2E4,\n\t0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5,\t0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4,\n\t0x904B, 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6,\t0x9051, 0xFCDA, 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE,\n\t0x9059, 0xE9AB, 0x905C, 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6,\t0x9060, 0xEAC0, 0x9061, 0xE1CF, 0x9063, 0xCCBA, 0x9069, 0xEEEA,\n\t0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, 0xD4EE, 0x9072, 0xF2C0,\t0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, 0x907A, 0xEBB6,\n\t0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, 0xE9AD,\t0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD,\n\t0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4,\t0x9091, 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE,\n\t0x90A3, 0xD1E1, 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7,\t0x90AF, 0xCAFB, 0x90B0, 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0,\n\t0x90B8, 0xEED0, 0x90C1, 0xE9F4, 0x90CA, 0xCEF4, 0x90DE, 0xD5CD,\t0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, 0xCEAC, 0x90F5, 0xE9E8,\n\t0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, 0x9115, 0xFAC1,\t0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, 0xD3B3,\n\t0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC,\t0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2,\n\t0x9169, 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3,\t0x9177, 0xFBE5, 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD,\n\t0x918B, 0xF5B3, 0x918D, 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD,\t0x91AB, 0xECA2, 0x91AC, 0xEDFD, 0x91AE, 0xF5B4, 0x91AF, 0xFBB8,\n\t0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, 0xCBD9, 0x91C0, 0xE5D4,\t0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, 0x91CC, 0xD7EC,\n\t0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, 0xD7ED,\t0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC,\n\t0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9,\t0x91F5, 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE,\n\t0x9212, 0xDFBC, 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2,\t0x923A, 0xE8AD, 0x923F, 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9,\n\t0x9249, 0xFAE8, 0x9257, 0xCCC6, 0x925B, 0xE6E7, 0x925E, 0xEAC7,\t0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, 0xE2FC, 0x9266, 0xEFFA,\n\t0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, 0x9291, 0xE0D5,\t0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, 0xF9E7,\n\t0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8,\t0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7,\n\t0x92EA, 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2,\t0x9310, 0xF5DE, 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6,\n\t0x931F, 0xD3CA, 0x9320, 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1,\t0x9324, 0xD1C5, 0x9326, 0xD0DE, 0x9328, 0xD9E1, 0x932B, 0xE0B8,\n\t0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, 0xE7CC, 0x934A, 0xD6A8,\t0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, 0x935B, 0xD3B4,\n\t0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, 0xF1A3,\t0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0,\n\t0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5,\t0x93B0, 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB,\n\t0x93E1, 0xCCF0, 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5,\t0x9418, 0xF1A4, 0x9425, 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1,\n\t0x9438, 0xF7A1, 0x9444, 0xF1D1, 0x9451, 0xCAFC, 0x9452, 0xCAFD,\t0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, 0xF3BA, 0x9577, 0xEDFE,\n\t0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, 0x958B, 0xCBD2,\t0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, 0xCAE0,\n\t0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE,\t0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3,\n\t0x95BB, 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4,\t0x95D4, 0xF9EF, 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC,\n\t0x95E1, 0xF4C5, 0x95E2, 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6,\t0x962A, 0xF8A1, 0x962E, 0xE8D6, 0x9632, 0xDBC1, 0x963B, 0xF0E6,\n\t0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, 0xF9AE, 0x9644, 0xDDBE,\t0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, 0x9650, 0xF9DA,\n\t0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, 0xE3B3,\t0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6,\n\t0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5,\t0x9676, 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5,\n\t0x9685, 0xE9EA, 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9,\t0x968D, 0xFCDB, 0x968E, 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2,\n\t0x9698, 0xE4F6, 0x9699, 0xD0C0, 0x969B, 0xF0B7, 0x969C, 0xEEA1,\t0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, 0xE2CB, 0x96AA, 0xFACF,\n\t0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, 0x96C0, 0xEDCD,\t0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, 0xF3A2,\n\t0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1,\t0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC,\n\t0x96D9, 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE,\t0x96E3, 0xD1F1, 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4,\n\t0x96EF, 0xDAA7, 0x96F0, 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3,\t0x96F7, 0xD6F4, 0x96F9, 0xDADF, 0x96FB, 0xEFB3, 0x9700, 0xE2CD,\n\t0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, 0xEFC5, 0x9713, 0xE7E7,\t0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, 0x971E, 0xF9C7,\n\t0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, 0xDCA4,\t0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4,\n\t0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA,\t0x9761, 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5,\n\t0x9774, 0xFCA8, 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9,\t0x978D, 0xE4D3, 0x978F, 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA,\n\t0x97AB, 0xCFD4, 0x97AD, 0xF8BD, 0x97C6, 0xF4C7, 0x97CB, 0xEADF,\t0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, 0xEBE5, 0x97F6, 0xE1D2,\n\t0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, 0x9801, 0xFAED,\t0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, 0xE2F7,\n\t0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8,\t0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6,\n\t0x9818, 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2,\t0x9839, 0xF7DD, 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9,\n\t0x984D, 0xE4FE, 0x984E, 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3,\t0x985A, 0xEFB4, 0x985E, 0xD7BE, 0x9865, 0xFBE2, 0x9867, 0xCDD3,\n\t0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, 0xF9A6, 0x98AF, 0xDFBD,\t0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, 0x98DB, 0xDEAB,\n\t0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, 0xD1C6,\t0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7,\n\t0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5,\t0x9909, 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9,\n\t0x9913, 0xE4BB, 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF,\t0x9928, 0xCEBD, 0x9945, 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA,\n\t0x994C, 0xF3CA, 0x994D, 0xE0D7, 0x9951, 0xD1C7, 0x9952, 0xE9AE,\t0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, 0xE2CF, 0x9999, 0xFAC5,\n\t0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, 0x99AC, 0xD8A9,\t0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, 0xF6CC,\n\t0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2,\t0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF,\n\t0x99DD, 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD,\t0x99FF, 0xF1E7, 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8,\n\t0x9A0F, 0xD1C9, 0x9A19, 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9,\t0x9A36, 0xF5E2, 0x9A37, 0xE1D3, 0x9A40, 0xD8E9, 0x9A43, 0xF8FE,\n\t0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, 0xCEF6, 0x9A57, 0xFAD0,\t0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, 0x9A62, 0xD5F0,\n\t0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, 0xCDE9,\t0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4,\n\t0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2,\t0x9B2A, 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA,\n\t0x9B42, 0xFBEB, 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5,\t0x9B4F, 0xEAE0, 0x9B54, 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB,\n\t0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7,\t0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, 0xF4ED, 0x9BE4, 0xCDE6,\n\t0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, 0x9C12, 0xDCE1,\t0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, 0xD8C4,\n\t0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8,\t0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0,\n\t0x9CF6, 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC,\t0x9D28, 0xE4E5, 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD,\n\t0x9D60, 0xCDDC, 0x9D61, 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE,\t0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE,\n\t0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, 0xFDD3, 0x9DF9, 0xEBED,\t0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, 0x9E75, 0xD6DD,\n\t0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, 0xD1CB,\t0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8,\n\t0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB,\t0x9EBE, 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3,\n\t0x9ED1, 0xFDD9, 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA,\t0x9EDC, 0xF5F5, 0x9EDE, 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD,\n\t0x9F07, 0xE8A8, 0x9F08, 0xDCAF, 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5,\t0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, 0xF0BA, 0x9F4B, 0xEEB1,\n\t0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, 0x9F61, 0xD6C6,\t0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, 0xE4CB,\n\t0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF,\t0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142,\n\t0xAC04, 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4,\t0xAC08, 0xB0A5, 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145,\n\t0xAC0C, 0x8146, 0xAC0D, 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149,\t0xAC10, 0xB0A8, 0xAC11, 0xB0A9, 0xAC12, 0xB0AA, 0xAC13, 0xB0AB,\n\t0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, 0xB0AE, 0xAC17, 0xB0AF,\t0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, 0xAC1B, 0xB0B2,\n\t0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, 0x814C,\t0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F,\n\t0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152,\t0xAC28, 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156,\n\t0xAC2C, 0xB0B7, 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9,\t0xAC30, 0xB0BA, 0xAC31, 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159,\n\t0xAC34, 0x815A, 0xAC35, 0x8161, 0xAC36, 0x8162, 0xAC37, 0x8163,\t0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, 0x8164, 0xAC3B, 0x8165,\n\t0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, 0xAC3F, 0x8168,\t0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, 0x816B,\n\t0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F,\t0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0,\n\t0xAC4C, 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175,\t0xAC50, 0x8176, 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179,\n\t0xAC54, 0xB0C2, 0xAC55, 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182,\t0xAC58, 0xB0C3, 0xAC59, 0x8183, 0xAC5A, 0x8184, 0xAC5B, 0x8185,\n\t0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, 0x8187, 0xAC5F, 0x8188,\t0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, 0xAC63, 0x818C,\n\t0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, 0x8190,\t0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194,\n\t0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198,\t0xAC70, 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A,\n\t0xAC74, 0xB0C7, 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8,\t0xAC78, 0xB0C9, 0xAC79, 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E,\n\t0xAC7C, 0x819F, 0xAC7D, 0x81A0, 0xAC7E, 0x81A1, 0xAC7F, 0x81A2,\t0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, 0x81A3, 0xAC83, 0xB0CD,\n\t0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, 0xAC87, 0x81A4,\t0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, 0xB0D3,\n\t0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8,\t0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB,\n\t0xAC94, 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE,\t0xAC98, 0x81AF, 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2,\n\t0xAC9C, 0xB0D7, 0xAC9D, 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9,\t0xACA0, 0xB0DA, 0xACA1, 0xB0DB, 0xACA2, 0x81B4, 0xACA3, 0x81B5,\n\t0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, 0x81B8, 0xACA7, 0x81B9,\t0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, 0xACAB, 0x81BA,\n\t0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, 0xB0E0,\t0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF,\n\t0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3,\t0xACB8, 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4,\n\t0xACBC, 0xB0E5, 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6,\t0xACC0, 0x81C7, 0xACC1, 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9,\n\t0xACC4, 0xB0E8, 0xACC5, 0x81CA, 0xACC6, 0x81CB, 0xACC7, 0x81CC,\t0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, 0x81CE, 0xACCB, 0x81CF,\n\t0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, 0xACCF, 0x81D2,\t0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, 0x81D6,\n\t0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC,\t0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC,\n\t0xACDC, 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0,\t0xACE0, 0xB0ED, 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2,\n\t0xACE4, 0xB0EF, 0xACE5, 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0,\t0xACE8, 0xB0F1, 0xACE9, 0x81E5, 0xACEA, 0xB0F2, 0xACEB, 0x81E6,\n\t0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, 0x81E8, 0xACEF, 0xB0F4,\t0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, 0xACF3, 0xB0F7,\n\t0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, 0x81EB,\t0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF,\n\t0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1,\t0xAD00, 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4,\n\t0xAD04, 0xB0FD, 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6,\t0xAD08, 0x81F7, 0xAD09, 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA,\n\t0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3,\t0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, 0x81FD, 0xAD13, 0x81FE,\n\t0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, 0xAD17, 0x8244,\t0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, 0x8247,\n\t0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A,\t0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D,\n\t0xAD24, 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251,\t0xAD28, 0x8252, 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254,\n\t0xAD2C, 0xB1A9, 0xAD2D, 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256,\t0xAD30, 0x8257, 0xAD31, 0x8258, 0xAD32, 0x8259, 0xAD33, 0x825A,\n\t0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, 0x8261, 0xAD37, 0x8262,\t0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, 0xAD3B, 0x8265,\n\t0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, 0x8268,\t0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C,\n\t0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1,\t0xAD48, 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270,\n\t0xAD4C, 0x8271, 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274,\t0xAD50, 0xB1B3, 0xAD51, 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277,\n\t0xAD54, 0xB1B4, 0xAD55, 0x8278, 0xAD56, 0x8279, 0xAD57, 0x827A,\t0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, 0x8282, 0xAD5B, 0x8283,\n\t0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, 0xAD5F, 0x8287,\t0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, 0xB1B7,\n\t0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D,\t0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291,\n\t0xAD6C, 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293,\t0xAD70, 0xB1BA, 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB,\n\t0xAD74, 0xB1BC, 0xAD75, 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296,\t0xAD78, 0x8297, 0xAD79, 0x8298, 0xAD7A, 0x8299, 0xAD7B, 0xB1BF,\n\t0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, 0x829A, 0xAD7F, 0xB1C2,\t0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, 0xAD83, 0x829C,\n\t0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, 0x82A0,\t0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2,\n\t0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5,\t0xAD90, 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8,\n\t0xAD94, 0x82A9, 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC,\t0xAD98, 0x82AD, 0xAD99, 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0,\n\t0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, 0xAD9E, 0x82B1, 0xAD9F, 0x82B2,\t0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, 0x82B5, 0xADA3, 0x82B6,\n\t0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, 0xADA7, 0x82B9,\t0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, 0x82BD,\n\t0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1,\t0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5,\n\t0xADB4, 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC,\t0xADB8, 0x82C9, 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC,\n\t0xADBC, 0x82CD, 0xADBD, 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0,\t0xADC0, 0xB1CD, 0xADC1, 0xB1CE, 0xADC2, 0x82D1, 0xADC3, 0x82D2,\n\t0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, 0x82D4, 0xADC7, 0x82D5,\t0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, 0xADCB, 0x82D8,\n\t0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, 0x82DC,\t0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3,\n\t0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1,\t0xADD8, 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5,\n\t0xADDC, 0xB1D4, 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8,\t0xADE0, 0xB1D5, 0xADE1, 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB,\n\t0xADE4, 0xB1D6, 0xADE5, 0x82EC, 0xADE6, 0x82ED, 0xADE7, 0x82EE,\t0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, 0x82F1, 0xADEB, 0x82F2,\n\t0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, 0xADEF, 0x82F6,\t0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, 0x82FA,\n\t0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE,\t0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342,\n\t0xADFC, 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA,\t0xAE00, 0xB1DB, 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346,\n\t0xAE04, 0x8347, 0xAE05, 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A,\t0xAE08, 0xB1DD, 0xAE09, 0xB1DE, 0xAE0A, 0x834B, 0xAE0B, 0xB1DF,\n\t0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, 0x834D, 0xAE0F, 0x834E,\t0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, 0xAE13, 0x8352,\n\t0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, 0x8355,\t0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359,\n\t0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363,\t0xAE20, 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367,\n\t0xAE24, 0x8368, 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B,\t0xAE28, 0x836C, 0xAE29, 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F,\n\t0xAE2C, 0x8370, 0xAE2D, 0x8371, 0xAE2E, 0x8372, 0xAE2F, 0x8373,\t0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, 0x8374, 0xAE33, 0x8375,\n\t0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, 0xAE37, 0xB1E5,\t0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, 0x8379,\n\t0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383,\t0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA,\n\t0xAE44, 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386,\t0xAE48, 0x8387, 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389,\n\t0xAE4C, 0xB1EE, 0xAE4D, 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A,\t0xAE50, 0xB1F1, 0xAE51, 0x838B, 0xAE52, 0x838C, 0xAE53, 0x838D,\n\t0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, 0xB1F3, 0xAE57, 0x838F,\t0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, 0xAE5B, 0x8393,\n\t0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, 0xB1F6,\t0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396,\n\t0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399,\t0xAE68, 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B,\n\t0xAE6C, 0xB1FC, 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E,\t0xAE70, 0xB1FD, 0xAE71, 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1,\n\t0xAE74, 0x83A2, 0xAE75, 0x83A3, 0xAE76, 0x83A4, 0xAE77, 0x83A5,\t0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, 0x83A6, 0xAE7B, 0xB2A2,\n\t0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, 0xAE7F, 0x83A8,\t0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, 0x83AC,\n\t0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE,\t0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2,\n\t0xAE8C, 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5,\t0xAE90, 0x83B6, 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9,\n\t0xAE94, 0x83BA, 0xAE95, 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD,\t0xAE98, 0x83BE, 0xAE99, 0x83BF, 0xAE9A, 0x83C0, 0xAE9B, 0x83C1,\n\t0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, 0x83C4, 0xAE9F, 0x83C5,\t0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, 0xAEA3, 0x83C9,\n\t0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, 0x83CD,\t0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1,\n\t0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5,\t0xAEB0, 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9,\n\t0xAEB4, 0x83DA, 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD,\t0xAEB8, 0x83DE, 0xAEB9, 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1,\n\t0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2,\t0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, 0x83E4, 0xAEC3, 0x83E5,\n\t0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, 0xAEC7, 0x83E8,\t0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, 0x83EC,\n\t0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF,\t0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF,\n\t0xAED4, 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3,\t0xAED8, 0xB2B2, 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5,\n\t0xAEDC, 0xB2B4, 0xAEDD, 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8,\t0xAEE0, 0x83F9, 0xAEE1, 0x83FA, 0xAEE2, 0x83FB, 0xAEE3, 0x83FC,\n\t0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, 0x8441, 0xAEE7, 0x8442,\t0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, 0xAEEB, 0xB2B6,\n\t0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, 0x8447,\t0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B,\n\t0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E,\t0xAEF8, 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451,\n\t0xAEFC, 0xB2BA, 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454,\t0xAF00, 0x8455, 0xAF01, 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458,\n\t0xAF04, 0x8459, 0xAF05, 0x845A, 0xAF06, 0x8461, 0xAF07, 0xB2BB,\t0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, 0x8463, 0xAF0B, 0x8464,\n\t0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, 0xAF0F, 0x8467,\t0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, 0x846A,\n\t0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E,\t0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472,\n\t0xAF1C, 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476,\t0xAF20, 0x8477, 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A,\n\t0xAF24, 0x8481, 0xAF25, 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484,\t0xAF28, 0x8485, 0xAF29, 0x8486, 0xAF2A, 0x8487, 0xAF2B, 0x8488,\n\t0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, 0x8489, 0xAF2F, 0x848A,\t0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, 0xAF33, 0x848C,\n\t0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, 0x848F,\t0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493,\n\t0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6,\t0xAF40, 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9,\n\t0xAF44, 0x8496, 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499,\t0xAF48, 0xB2CA, 0xAF49, 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B,\n\t0xAF4C, 0x849C, 0xAF4D, 0x849D, 0xAF4E, 0x849E, 0xAF4F, 0x849F,\t0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, 0x84A1, 0xAF53, 0x84A2,\n\t0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, 0xAF57, 0x84A6,\t0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, 0x84AA,\n\t0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC,\t0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0,\n\t0xAF64, 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2,\t0xAF68, 0x84B3, 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6,\n\t0xAF6C, 0x84B7, 0xAF6D, 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA,\t0xAF70, 0x84BB, 0xAF71, 0x84BC, 0xAF72, 0x84BD, 0xAF73, 0x84BE,\n\t0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, 0x84C1, 0xAF77, 0x84C2,\t0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, 0xAF7B, 0x84C5,\n\t0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, 0x84C9,\t0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC,\n\t0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF,\t0xAF88, 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2,\n\t0xAF8C, 0x84D3, 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6,\t0xAF90, 0xB2D5, 0xAF91, 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8,\n\t0xAF94, 0x84D9, 0xAF95, 0xB2D7, 0xAF96, 0x84DA, 0xAF97, 0x84DB,\t0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, 0x84DE, 0xAF9B, 0x84DF,\n\t0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, 0xAF9F, 0x84E2,\t0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, 0x84E6,\n\t0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA,\t0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE,\n\t0xAFAC, 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2,\t0xAFB0, 0x84F3, 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6,\n\t0xAFB4, 0x84F7, 0xAFB5, 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA,\t0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, 0xAFBA, 0x84FB, 0xAFBB, 0x84FC,\n\t0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, 0x84FE, 0xAFBF, 0x8541,\t0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, 0xAFC3, 0x8544,\n\t0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, 0xB2DD,\t0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0,\n\t0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A,\t0xAFD0, 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E,\n\t0xAFD4, 0xB2E3, 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551,\t0xAFD8, 0x8552, 0xAFD9, 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555,\n\t0xAFDC, 0xB2E4, 0xAFDD, 0x8556, 0xAFDE, 0x8557, 0xAFDF, 0x8558,\t0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, 0x8561, 0xAFE3, 0x8562,\n\t0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, 0xAFE7, 0x8566,\t0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, 0x8568,\n\t0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C,\t0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E,\n\t0xAFF4, 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571,\t0xAFF8, 0xB2EA, 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574,\n\t0xAFFC, 0x8575, 0xAFFD, 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578,\t0xB000, 0xB2EB, 0xB001, 0xB2EC, 0xB002, 0x8579, 0xB003, 0x857A,\n\t0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, 0x8582, 0xB007, 0x8583,\t0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, 0xB00B, 0x8587,\n\t0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, 0x858A,\t0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D,\n\t0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590,\t0xB018, 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594,\n\t0xB01C, 0xB2F1, 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596,\t0xB020, 0x8597, 0xB021, 0x8598, 0xB022, 0x8599, 0xB023, 0x859A,\n\t0xB024, 0x859B, 0xB025, 0x859C, 0xB026, 0x859D, 0xB027, 0x859E,\t0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, 0x85A0, 0xB02B, 0x85A1,\n\t0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, 0xB02F, 0x85A5,\t0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, 0x85A9,\n\t0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD,\t0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1,\n\t0xB03C, 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5,\t0xB040, 0x85B6, 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9,\n\t0xB044, 0xB2F4, 0xB045, 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB,\t0xB048, 0xB2F6, 0xB049, 0x85BC, 0xB04A, 0xB2F7, 0xB04B, 0x85BD,\n\t0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, 0xB2F9, 0xB04F, 0x85BF,\t0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, 0xB053, 0xB2FA,\n\t0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, 0xB2FD,\t0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6,\n\t0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9,\t0xB060, 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD,\n\t0xB064, 0x85CE, 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1,\t0xB068, 0x85D2, 0xB069, 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5,\n\t0xB06C, 0x85D6, 0xB06D, 0x85D7, 0xB06E, 0x85D8, 0xB06F, 0x85D9,\t0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, 0x85DC, 0xB073, 0x85DD,\n\t0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, 0xB077, 0x85E1,\t0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, 0x85E5,\n\t0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7,\t0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA,\n\t0xB084, 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED,\t0xB088, 0x85EE, 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1,\n\t0xB08C, 0xB3A6, 0xB08D, 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8,\t0xB090, 0x85F3, 0xB091, 0xB3A9, 0xB092, 0x85F4, 0xB093, 0x85F5,\n\t0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, 0x85F8, 0xB097, 0x85F9,\t0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, 0xB09B, 0x85FA,\n\t0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, 0xB3AE,\t0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD,\n\t0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643,\t0xB0A8, 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4,\n\t0xB0AC, 0xB3B5, 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8,\t0xB0B0, 0x8645, 0xB0B1, 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA,\n\t0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, 0xB0B6, 0x8647, 0xB0B7, 0x8648,\t0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, 0x864A, 0xB0BB, 0x864B,\n\t0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, 0xB0BF, 0x864E,\t0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, 0x8652,\n\t0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1,\t0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655,\n\t0xB0CC, 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659,\t0xB0D0, 0xB3C4, 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661,\n\t0xB0D4, 0xB3C6, 0xB0D5, 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664,\t0xB0D8, 0xB3C7, 0xB0D9, 0x8665, 0xB0DA, 0x8666, 0xB0DB, 0x8667,\n\t0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, 0x866A, 0xB0DF, 0x866B,\t0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, 0xB0E3, 0x866E,\n\t0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, 0x8671,\t0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675,\n\t0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679,\t0xB0F0, 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683,\n\t0xB0F4, 0x8684, 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687,\t0xB0F8, 0x8688, 0xB0F9, 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B,\n\t0xB0FC, 0x868C, 0xB0FD, 0x868D, 0xB0FE, 0x868E, 0xB0FF, 0x868F,\t0xB100, 0x8690, 0xB101, 0x8691, 0xB102, 0x8692, 0xB103, 0x8693,\n\t0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, 0xB107, 0x8697,\t0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, 0xB3CC,\n\t0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B,\t0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0,\n\t0xB114, 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0,\t0xB118, 0xB3D1, 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3,\n\t0xB11C, 0xB3D4, 0xB11D, 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3,\t0xB120, 0x86A4, 0xB121, 0x86A5, 0xB122, 0x86A6, 0xB123, 0xB3D6,\n\t0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, 0x86A7, 0xB127, 0x86A8,\t0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, 0xB12B, 0x86AB,\n\t0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, 0x86AE,\t0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2,\n\t0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD,\t0xB138, 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5,\n\t0xB13C, 0x86B6, 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9,\t0xB140, 0xB3E0, 0xB141, 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB,\n\t0xB144, 0xB3E2, 0xB145, 0x86BC, 0xB146, 0x86BD, 0xB147, 0x86BE,\t0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, 0x86C0, 0xB14B, 0x86C1,\n\t0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, 0xB14F, 0x86C5,\t0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, 0x86C7,\n\t0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9,\t0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC,\n\t0xB15C, 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF,\t0xB160, 0xB3EA, 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2,\n\t0xB164, 0x86D3, 0xB165, 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6,\t0xB168, 0x86D7, 0xB169, 0x86D8, 0xB16A, 0x86D9, 0xB16B, 0x86DA,\n\t0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, 0x86DD, 0xB16F, 0x86DE,\t0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, 0xB173, 0x86E2,\n\t0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, 0x86E6,\t0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8,\n\t0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB,\t0xB180, 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED,\n\t0xB184, 0x86EE, 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1,\t0xB188, 0xB3F0, 0xB189, 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2,\n\t0xB18C, 0x86F3, 0xB18D, 0xB3F3, 0xB18E, 0x86F4, 0xB18F, 0x86F5,\t0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, 0xB3F4, 0xB193, 0xB3F5,\n\t0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, 0xB197, 0x86FA,\t0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, 0x86FD,\n\t0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742,\t0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746,\n\t0xB1A4, 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A,\t0xB1A8, 0xB3F9, 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D,\n\t0xB1AC, 0x874E, 0xB1AD, 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751,\t0xB1B0, 0x8752, 0xB1B1, 0x8753, 0xB1B2, 0x8754, 0xB1B3, 0x8755,\n\t0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, 0x8758, 0xB1B7, 0x8759,\t0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, 0xB1BB, 0x8763,\n\t0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, 0x8767,\t0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B,\n\t0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F,\t0xB1C8, 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773,\n\t0xB1CC, 0xB3FA, 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776,\t0xB1D0, 0xB3FB, 0xB1D1, 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779,\n\t0xB1D4, 0xB3FC, 0xB1D5, 0x877A, 0xB1D6, 0x8781, 0xB1D7, 0x8782,\t0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, 0x8785, 0xB1DB, 0x8786,\n\t0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, 0xB1DF, 0xB4A1,\t0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, 0x878B,\n\t0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F,\t0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791,\n\t0xB1EC, 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794,\t0xB1F0, 0xB4A5, 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797,\n\t0xB1F4, 0x8798, 0xB1F5, 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B,\t0xB1F8, 0x879C, 0xB1F9, 0xB4A6, 0xB1FA, 0x879D, 0xB1FB, 0xB4A7,\n\t0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, 0x879F, 0xB1FF, 0x87A0,\t0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, 0xB203, 0x87A4,\n\t0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, 0x87A6,\t0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC,\n\t0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB,\t0xB210, 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF,\n\t0xB214, 0xB4AE, 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0,\t0xB218, 0x87B1, 0xB219, 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3,\n\t0xB21C, 0x87B4, 0xB21D, 0x87B5, 0xB21E, 0x87B6, 0xB21F, 0x87B7,\t0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, 0x87B9, 0xB223, 0x87BA,\n\t0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, 0xB227, 0x87BE,\t0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, 0x87C2,\n\t0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6,\t0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA,\n\t0xB234, 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD,\t0xB238, 0x87CE, 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1,\n\t0xB23C, 0xB4B4, 0xB23D, 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4,\t0xB240, 0x87D5, 0xB241, 0x87D6, 0xB242, 0x87D7, 0xB243, 0x87D8,\n\t0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, 0x87DB, 0xB247, 0x87DC,\t0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, 0xB24B, 0x87E0,\n\t0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, 0x87E4,\t0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8,\n\t0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC,\t0xB258, 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF,\n\t0xB25C, 0xB4B6, 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2,\t0xB260, 0xB4B7, 0xB261, 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5,\n\t0xB264, 0x87F6, 0xB265, 0x87F7, 0xB266, 0x87F8, 0xB267, 0x87F9,\t0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, 0x87FA, 0xB26B, 0x87FB,\n\t0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, 0xB26F, 0x8841,\t0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, 0x8845,\n\t0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847,\t0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B,\n\t0xB27C, 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E,\t0xB280, 0x884F, 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852,\n\t0xB284, 0xB4BD, 0xB285, 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854,\t0xB288, 0x8855, 0xB289, 0xB4BF, 0xB28A, 0x8856, 0xB28B, 0x8857,\n\t0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, 0x885A, 0xB28F, 0x8861,\t0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, 0xB293, 0x8863,\n\t0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, 0x8866,\t0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867,\n\t0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B,\t0xB2A0, 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8,\n\t0xB2A4, 0x886D, 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E,\t0xB2A8, 0x886F, 0xB2A9, 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871,\n\t0xB2AC, 0xB4CC, 0xB2AD, 0x8872, 0xB2AE, 0x8873, 0xB2AF, 0x8874,\t0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, 0x8876, 0xB2B3, 0x8877,\n\t0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, 0xB2B7, 0x887A,\t0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, 0x8884,\n\t0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888,\t0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C,\n\t0xB2C4, 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890,\t0xB2C8, 0xB4CF, 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892,\n\t0xB2CC, 0xB4D1, 0xB2CD, 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895,\t0xB2D0, 0xB4D2, 0xB2D1, 0x8896, 0xB2D2, 0xB4D3, 0xB2D3, 0x8897,\n\t0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, 0x889A, 0xB2D7, 0x889B,\t0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, 0xB2DB, 0xB4D6,\n\t0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, 0x889F,\t0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2,\n\t0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3,\t0xB2E8, 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD,\n\t0xB2EC, 0xB4DE, 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1,\t0xB2F0, 0x88A6, 0xB2F1, 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2,\n\t0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5,\t0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, 0xB4E8, 0xB2FB, 0xB4E9,\n\t0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, 0xB2FF, 0xB4EA,\t0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, 0x88AE,\n\t0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1,\t0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4,\n\t0xB30C, 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8,\t0xB310, 0xB4EF, 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1,\n\t0xB314, 0xB4F2, 0xB315, 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB,\t0xB318, 0x88BC, 0xB319, 0x88BD, 0xB31A, 0x88BE, 0xB31B, 0x88BF,\n\t0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, 0x88C1, 0xB31F, 0x88C2,\t0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, 0xB323, 0x88C6,\n\t0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, 0x88CA,\t0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE,\n\t0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2,\t0xB330, 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6,\n\t0xB334, 0x88D7, 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA,\t0xB338, 0x88DB, 0xB339, 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE,\n\t0xB33C, 0x88DF, 0xB33D, 0x88E0, 0xB33E, 0x88E1, 0xB33F, 0x88E2,\t0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, 0x88E5, 0xB343, 0x88E6,\n\t0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, 0xB347, 0x88EA,\t0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, 0x88EE,\n\t0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2,\t0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6,\n\t0xB354, 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7,\t0xB358, 0xB4F8, 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9,\n\t0xB35C, 0xB4FA, 0xB35D, 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC,\t0xB360, 0x88FB, 0xB361, 0x88FC, 0xB362, 0x88FD, 0xB363, 0x88FE,\n\t0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, 0x8941, 0xB367, 0xB5A1,\t0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, 0xB36B, 0xB5A3,\n\t0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, 0x8946,\t0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948,\n\t0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B,\t0xB378, 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E,\n\t0xB37C, 0x894F, 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952,\t0xB380, 0xB5A9, 0xB381, 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB,\n\t0xB384, 0xB5AC, 0xB385, 0xB5AD, 0xB386, 0x8954, 0xB387, 0x8955,\t0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, 0x8958, 0xB38B, 0x8959,\n\t0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, 0xB38F, 0x8962,\t0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, 0x8965,\n\t0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968,\t0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C,\n\t0xB39C, 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970,\t0xB3A0, 0xB5B1, 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972,\n\t0xB3A4, 0x8973, 0xB3A5, 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976,\t0xB3A8, 0xB5B3, 0xB3A9, 0x8977, 0xB3AA, 0x8978, 0xB3AB, 0x8979,\n\t0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, 0x8981, 0xB3AF, 0x8982,\t0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, 0xB3B3, 0x8986,\n\t0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, 0x898A,\t0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E,\n\t0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992,\t0xB3C0, 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996,\n\t0xB3C4, 0xB5B5, 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998,\t0xB3C8, 0xB5B7, 0xB3C9, 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8,\n\t0xB3CC, 0xB5B9, 0xB3CD, 0x899B, 0xB3CE, 0xB5BA, 0xB3CF, 0x899C,\t0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, 0x899E, 0xB3D3, 0x899F,\n\t0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, 0xB3D7, 0xB5BE,\t0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, 0xB5C0,\n\t0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5,\t0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8,\n\t0xB3E4, 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB,\t0xB3E8, 0xB5C4, 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE,\n\t0xB3EC, 0x89AF, 0xB3ED, 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2,\t0xB3F0, 0x89B3, 0xB3F1, 0x89B4, 0xB3F2, 0x89B5, 0xB3F3, 0x89B6,\n\t0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, 0x89B9, 0xB3F7, 0x89BA,\t0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, 0xB3FB, 0x89BE,\n\t0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, 0x89C1,\t0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5,\n\t0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9,\t0xB408, 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD,\n\t0xB40C, 0x89CE, 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1,\t0xB410, 0xB5C6, 0xB411, 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4,\n\t0xB414, 0x89D5, 0xB415, 0x89D6, 0xB416, 0x89D7, 0xB417, 0x89D8,\t0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, 0x89DA, 0xB41B, 0x89DB,\n\t0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, 0xB41F, 0x89DE,\t0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, 0x89E1,\n\t0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5,\t0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC,\n\t0xB42C, 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA,\t0xB430, 0x89EB, 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE,\n\t0xB434, 0xB5CD, 0xB435, 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1,\t0xB438, 0x89F2, 0xB439, 0x89F3, 0xB43A, 0x89F4, 0xB43B, 0x89F5,\n\t0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, 0x89F8, 0xB43F, 0x89F9,\t0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, 0xB443, 0x89FD,\n\t0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, 0x8A43,\t0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47,\n\t0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B,\t0xB450, 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D,\n\t0xB454, 0xB5D0, 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50,\t0xB458, 0xB5D1, 0xB459, 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53,\n\t0xB45C, 0x8A54, 0xB45D, 0x8A55, 0xB45E, 0x8A56, 0xB45F, 0x8A57,\t0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, 0x8A58, 0xB463, 0xB5D4,\n\t0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, 0xB467, 0x8A61,\t0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, 0x8A65,\n\t0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68,\t0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C,\n\t0xB474, 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70,\t0xB478, 0x8A71, 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74,\n\t0xB47C, 0x8A75, 0xB47D, 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78,\t0xB480, 0xB5D7, 0xB481, 0x8A79, 0xB482, 0x8A7A, 0xB483, 0x8A81,\n\t0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, 0x8A84, 0xB487, 0x8A85,\t0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, 0xB48B, 0x8A88,\n\t0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, 0x8A8C,\t0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90,\n\t0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94,\t0xB498, 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98,\n\t0xB49C, 0x8A99, 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B,\t0xB4A0, 0x8A9C, 0xB4A1, 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F,\n\t0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2,\t0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, 0x8AA4, 0xB4AB, 0x8AA5,\n\t0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, 0xB4AF, 0x8AA8,\t0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, 0x8AAC,\n\t0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE,\t0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1,\n\t0xB4BC, 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5,\t0xB4C0, 0xB5E0, 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8,\n\t0xB4C4, 0xB5E1, 0xB4C5, 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB,\t0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE,\n\t0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, 0x8AC1, 0xB4CF, 0x8AC2,\t0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, 0xB4D3, 0x8AC5,\n\t0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, 0x8AC8,\t0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC,\n\t0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE,\t0xB4E0, 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8,\n\t0xB4E4, 0xB5E9, 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2,\t0xB4E8, 0x8AD3, 0xB4E9, 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6,\n\t0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED,\t0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, 0x8AD9, 0xB4F3, 0x8ADA,\n\t0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, 0xB4F7, 0x8ADE,\t0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, 0x8AE1,\n\t0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5,\t0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9,\n\t0xB504, 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED,\t0xB508, 0x8AEE, 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1,\n\t0xB50C, 0x8AF2, 0xB50D, 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5,\t0xB510, 0x8AF6, 0xB511, 0x8AF7, 0xB512, 0x8AF8, 0xB513, 0x8AF9,\n\t0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, 0x8AFA, 0xB517, 0x8AFB,\t0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, 0xB51B, 0xB5F3,\n\t0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, 0x8B42,\t0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46,\n\t0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7,\t0xB528, 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48,\n\t0xB52C, 0x8B49, 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C,\t0xB530, 0xB5FB, 0xB531, 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E,\n\t0xB534, 0xB5FD, 0xB535, 0x8B4F, 0xB536, 0x8B50, 0xB537, 0x8B51,\t0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, 0x8B53, 0xB53B, 0x8B54,\n\t0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, 0xB53F, 0x8B58,\t0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, 0xB6A3,\n\t0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61,\t0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6,\n\t0xB54C, 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66,\t0xB550, 0xB6A9, 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69,\n\t0xB554, 0xB6AA, 0xB555, 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C,\t0xB558, 0x8B6D, 0xB559, 0x8B6E, 0xB55A, 0x8B6F, 0xB55B, 0x8B70,\n\t0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, 0x8B71, 0xB55F, 0xB6AD,\t0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, 0xB563, 0x8B73,\n\t0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, 0x8B77,\t0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81,\n\t0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85,\t0xB570, 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89,\n\t0xB574, 0x8B8A, 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D,\t0xB578, 0x8B8E, 0xB579, 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91,\n\t0xB57C, 0x8B92, 0xB57D, 0x8B93, 0xB57E, 0x8B94, 0xB57F, 0x8B95,\t0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, 0x8B98, 0xB583, 0x8B99,\n\t0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, 0xB587, 0x8B9D,\t0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, 0x8BA1,\n\t0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5,\t0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9,\n\t0xB594, 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD,\t0xB598, 0x8BAE, 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1,\n\t0xB59C, 0x8BB2, 0xB59D, 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5,\t0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7,\n\t0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, 0x8BB9, 0xB5A7, 0x8BBA,\t0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, 0xB5AB, 0xB6B5,\n\t0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, 0x8BBF,\t0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8,\n\t0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2,\t0xB5B8, 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB,\n\t0xB5BC, 0xB6BC, 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7,\t0xB5C0, 0xB6BE, 0xB5C1, 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA,\n\t0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD,\t0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, 0x8BD0, 0xB5CB, 0x8BD1,\n\t0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, 0xB5CF, 0xB6C2,\t0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, 0x8BD4,\n\t0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8,\t0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB,\n\t0xB5DC, 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF,\t0xB5E0, 0x8BE0, 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3,\n\t0xB5E4, 0x8BE4, 0xB5E5, 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7,\t0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB,\n\t0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, 0x8BED, 0xB5EF, 0x8BEE,\t0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, 0xB5F3, 0x8BF2,\n\t0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, 0x8BF6,\t0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA,\n\t0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE,\t0xB600, 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44,\n\t0xB604, 0x8C45, 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48,\t0xB608, 0x8C49, 0xB609, 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C,\n\t0xB60C, 0x8C4D, 0xB60D, 0x8C4E, 0xB60E, 0x8C4F, 0xB60F, 0x8C50,\t0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, 0x8C51, 0xB613, 0x8C52,\n\t0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, 0xB617, 0x8C55,\t0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, 0x8C58,\n\t0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62,\t0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66,\n\t0xB624, 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69,\t0xB628, 0x8C6A, 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D,\n\t0xB62C, 0xB6CC, 0xB62D, 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70,\t0xB630, 0x8C71, 0xB631, 0x8C72, 0xB632, 0x8C73, 0xB633, 0x8C74,\n\t0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, 0x8C76, 0xB637, 0x8C77,\t0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, 0xB63B, 0x8C81,\n\t0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, 0x8C85,\t0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89,\n\t0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D,\t0xB648, 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90,\n\t0xB64C, 0x8C91, 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94,\t0xB650, 0x8C95, 0xB651, 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98,\n\t0xB654, 0x8C99, 0xB655, 0x8C9A, 0xB656, 0x8C9B, 0xB657, 0x8C9C,\t0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, 0x8C9F, 0xB65B, 0x8CA0,\n\t0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, 0xB65F, 0x8CA4,\t0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, 0x8CA8,\n\t0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB,\t0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE,\n\t0xB66C, 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2,\t0xB670, 0x8CB3, 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6,\n\t0xB674, 0x8CB7, 0xB675, 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA,\t0xB678, 0x8CBB, 0xB679, 0x8CBC, 0xB67A, 0x8CBD, 0xB67B, 0x8CBE,\n\t0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, 0x8CC1, 0xB67F, 0x8CC2,\t0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, 0xB683, 0x8CC6,\n\t0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, 0x8CCA,\t0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE,\n\t0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2,\t0xB690, 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6,\n\t0xB694, 0x8CD7, 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA,\t0xB698, 0x8CDB, 0xB699, 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE,\n\t0xB69C, 0xB6D1, 0xB69D, 0xB6D2, 0xB69E, 0x8CDF, 0xB69F, 0x8CE0,\t0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, 0x8CE2, 0xB6A3, 0x8CE3,\n\t0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, 0xB6A7, 0x8CE6,\t0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, 0xB6D5,\n\t0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC,\t0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF,\n\t0xB6B4, 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3,\t0xB6B8, 0x8CF4, 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7,\n\t0xB6BC, 0x8CF8, 0xB6BD, 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB,\t0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41,\n\t0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, 0x8D44, 0xB6C7, 0x8D45,\t0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, 0xB6CB, 0x8D49,\n\t0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, 0x8D4D,\t0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51,\n\t0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54,\t0xB6D8, 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58,\n\t0xB6DC, 0x8D59, 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62,\t0xB6E0, 0x8D63, 0xB6E1, 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66,\n\t0xB6E4, 0x8D67, 0xB6E5, 0x8D68, 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A,\t0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, 0x8D6D, 0xB6EB, 0x8D6E,\n\t0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, 0xB6EF, 0x8D72,\t0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, 0x8D75,\n\t0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78,\t0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81,\n\t0xB6FC, 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85,\t0xB700, 0xB6DC, 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87,\n\t0xB704, 0x8D88, 0xB705, 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A,\t0xB708, 0x8D8B, 0xB709, 0x8D8C, 0xB70A, 0x8D8D, 0xB70B, 0x8D8E,\n\t0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, 0x8D91, 0xB70F, 0x8D92,\t0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, 0xB713, 0x8D96,\n\t0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, 0x8D9A,\t0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E,\n\t0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2,\t0xB720, 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6,\n\t0xB724, 0x8DA7, 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA,\t0xB728, 0xB6DF, 0xB729, 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC,\n\t0xB72C, 0xB6E1, 0xB72D, 0x8DAD, 0xB72E, 0x8DAE, 0xB72F, 0xB6E2,\t0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, 0x8DB0, 0xB733, 0x8DB1,\n\t0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, 0xB737, 0x8DB5,\t0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, 0xB6E6,\n\t0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA,\t0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE,\n\t0xB744, 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1,\t0xB748, 0xB6E8, 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4,\n\t0xB74C, 0xB6E9, 0xB74D, 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7,\t0xB750, 0x8DC8, 0xB751, 0x8DC9, 0xB752, 0x8DCA, 0xB753, 0x8DCB,\n\t0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, 0x8DCC, 0xB757, 0x8DCD,\t0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, 0xB75B, 0x8DD1,\n\t0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, 0x8DD5,\t0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8,\n\t0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB,\t0xB768, 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE,\n\t0xB76C, 0x8DDF, 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2,\t0xB770, 0xB6EF, 0xB771, 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1,\n\t0xB774, 0x8DE4, 0xB775, 0xB6F2, 0xB776, 0x8DE5, 0xB777, 0x8DE6,\t0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, 0x8DE9, 0xB77B, 0x8DEA,\n\t0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, 0xB77F, 0x8DEC,\t0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, 0x8DEF,\n\t0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2,\t0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6,\n\t0xB78C, 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9,\t0xB790, 0xB6FA, 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8,\n\t0xB794, 0x8DF9, 0xB795, 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE,\t0xB798, 0xB7A1, 0xB799, 0xB7A2, 0xB79A, 0x8DFB, 0xB79B, 0x8DFC,\n\t0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, 0x8DFE, 0xB79F, 0x8E41,\t0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, 0xB7A3, 0x8E44,\n\t0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, 0x8E48,\t0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7,\n\t0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B,\t0xB7B0, 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F,\n\t0xB7B4, 0xB7AA, 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51,\t0xB7B8, 0xB7AC, 0xB7B9, 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54,\n\t0xB7BC, 0x8E55, 0xB7BD, 0x8E56, 0xB7BE, 0x8E57, 0xB7BF, 0x8E58,\t0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, 0x8E61, 0xB7C3, 0x8E62,\n\t0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, 0xB7C7, 0xB7AD,\t0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, 0x8E68,\n\t0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C,\t0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70,\n\t0xB7D4, 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74,\t0xB7D8, 0x8E75, 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78,\n\t0xB7DC, 0x8E79, 0xB7DD, 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82,\t0xB7E0, 0x8E83, 0xB7E1, 0x8E84, 0xB7E2, 0x8E85, 0xB7E3, 0x8E86,\n\t0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, 0x8E89, 0xB7E7, 0x8E8A,\t0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, 0xB7EB, 0x8E8E,\n\t0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, 0x8E90,\t0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93,\n\t0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96,\t0xB7F8, 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A,\n\t0xB7FC, 0xB7B3, 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5,\t0xB800, 0xB7B6, 0xB801, 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D,\n\t0xB804, 0x8E9E, 0xB805, 0x8E9F, 0xB806, 0x8EA0, 0xB807, 0xB7B8,\t0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, 0x8EA1, 0xB80B, 0x8EA2,\n\t0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, 0xB80F, 0x8EA5,\t0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, 0x8EA8,\n\t0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC,\t0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF,\n\t0xB81C, 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0,\t0xB820, 0x8EB1, 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4,\n\t0xB824, 0xB7C1, 0xB825, 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6,\t0xB828, 0xB7C3, 0xB829, 0x8EB7, 0xB82A, 0x8EB8, 0xB82B, 0x8EB9,\n\t0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, 0x8EBB, 0xB82F, 0x8EBC,\t0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, 0xB833, 0x8EC0,\n\t0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, 0xB7C7,\t0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3,\n\t0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7,\t0xB840, 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA,\n\t0xB844, 0xB7CB, 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD,\t0xB848, 0x8ECE, 0xB849, 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1,\n\t0xB84C, 0x8ED2, 0xB84D, 0x8ED3, 0xB84E, 0x8ED4, 0xB84F, 0x8ED5,\t0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, 0x8ED7, 0xB853, 0xB7CD,\n\t0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, 0xB857, 0x8EDB,\t0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, 0x8EDF,\n\t0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1,\t0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4,\n\t0xB864, 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7,\t0xB868, 0x8EE8, 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB,\n\t0xB86C, 0xB7D2, 0xB86D, 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4,\t0xB870, 0x8EED, 0xB871, 0xB7D5, 0xB872, 0x8EEE, 0xB873, 0x8EEF,\n\t0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, 0x8EF2, 0xB877, 0x8EF3,\t0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, 0xB87B, 0x8EF6,\n\t0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, 0x8EF9,\t0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD,\n\t0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43,\t0xB888, 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47,\n\t0xB88C, 0x8F48, 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A,\t0xB890, 0x8F4B, 0xB891, 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E,\n\t0xB894, 0x8F4F, 0xB895, 0x8F50, 0xB896, 0x8F51, 0xB897, 0x8F52,\t0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, 0x8F55, 0xB89B, 0x8F56,\n\t0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, 0xB89F, 0x8F5A,\t0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, 0x8F64,\n\t0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68,\t0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B,\n\t0xB8AC, 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F,\t0xB8B0, 0xB7DA, 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72,\n\t0xB8B4, 0xB7DB, 0xB8B5, 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75,\t0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, 0xB8BA, 0x8F77, 0xB8BB, 0x8F78,\n\t0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, 0x8F81, 0xB8BF, 0x8F82,\t0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, 0xB8C3, 0xB7DF,\n\t0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, 0x8F86,\t0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A,\n\t0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D,\t0xB8D0, 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90,\n\t0xB8D4, 0xB7E3, 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93,\t0xB8D8, 0x8F94, 0xB8D9, 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97,\n\t0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5,\t0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, 0x8F9B, 0xB8E3, 0x8F9C,\n\t0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, 0xB8E7, 0x8FA0,\t0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, 0x8FA2,\n\t0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5,\t0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8,\n\t0xB8F4, 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC,\t0xB8F8, 0xB7EB, 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED,\n\t0xB8FC, 0x8FAE, 0xB8FD, 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0,\t0xB900, 0x8FB1, 0xB901, 0x8FB2, 0xB902, 0x8FB3, 0xB903, 0x8FB4,\n\t0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, 0x8FB6, 0xB907, 0x8FB7,\t0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, 0xB90B, 0x8FBB,\n\t0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, 0x8FBF,\t0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3,\n\t0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7,\t0xB918, 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA,\n\t0xB91C, 0x8FCB, 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE,\t0xB920, 0xB7F1, 0xB921, 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1,\n\t0xB924, 0x8FD2, 0xB925, 0x8FD3, 0xB926, 0x8FD4, 0xB927, 0x8FD5,\t0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, 0x8FD8, 0xB92B, 0x8FD9,\n\t0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, 0xB92F, 0x8FDD,\t0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, 0x8FE1,\n\t0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5,\t0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9,\n\t0xB93C, 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB,\t0xB940, 0xB7F4, 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE,\n\t0xB944, 0xB7F5, 0xB945, 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1,\t0xB948, 0x8FF2, 0xB949, 0x8FF3, 0xB94A, 0x8FF4, 0xB94B, 0x8FF5,\n\t0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, 0x8FF7, 0xB94F, 0xB7F7,\t0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, 0xB953, 0x8FFA,\n\t0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, 0x8FFE,\t0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042,\n\t0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045,\t0xB960, 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048,\n\t0xB964, 0x9049, 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C,\t0xB968, 0xB7FD, 0xB969, 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1,\n\t0xB96C, 0x904E, 0xB96D, 0xB8A2, 0xB96E, 0x904F, 0xB96F, 0x9050,\t0xB970, 0x9051, 0xB971, 0x9052, 0xB972, 0x9053, 0xB973, 0x9054,\n\t0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, 0xB977, 0x9056,\t0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, 0x9059,\n\t0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062,\t0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066,\n\t0xB984, 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9,\t0xB988, 0x9068, 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069,\n\t0xB98C, 0x906A, 0xB98D, 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B,\t0xB990, 0x906C, 0xB991, 0x906D, 0xB992, 0x906E, 0xB993, 0x906F,\n\t0xB994, 0x9070, 0xB995, 0x9071, 0xB996, 0x9072, 0xB997, 0x9073,\t0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, 0xB99B, 0x9077,\n\t0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, 0x9081,\t0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085,\n\t0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089,\t0xB9A8, 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D,\n\t0xB9AC, 0xB8AE, 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F,\t0xB9B0, 0xB8B0, 0xB9B1, 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092,\n\t0xB9B4, 0xB8B1, 0xB9B5, 0x9093, 0xB9B6, 0x9094, 0xB9B7, 0x9095,\t0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, 0x9098, 0xB9BB, 0x9099,\n\t0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, 0xB9BF, 0xB8B4,\t0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, 0x909D,\n\t0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1,\t0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3,\n\t0xB9CC, 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA,\t0xB9D0, 0xB8BB, 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5,\n\t0xB9D4, 0x90A6, 0xB9D5, 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9,\t0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0,\n\t0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, 0xB8C2, 0xB9DF, 0x90AC,\t0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, 0xB9E3, 0xB8C4,\n\t0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, 0x90B0,\t0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3,\n\t0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6,\t0xB9F0, 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA,\n\t0xB9F4, 0xB8C9, 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB,\t0xB9F8, 0xB8CC, 0xB9F9, 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC,\n\t0xB9FC, 0x90BD, 0xB9FD, 0x90BE, 0xB9FE, 0x90BF, 0xB9FF, 0x90C0,\t0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, 0x90C1, 0xBA03, 0x90C2,\n\t0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, 0xBA07, 0x90C6,\t0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, 0x90C9,\n\t0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD,\t0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1,\n\t0xBA14, 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4,\t0xBA18, 0x90D5, 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8,\n\t0xBA1C, 0x90D9, 0xBA1D, 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC,\t0xBA20, 0x90DD, 0xBA21, 0x90DE, 0xBA22, 0x90DF, 0xBA23, 0x90E0,\n\t0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, 0x90E3, 0xBA27, 0x90E4,\t0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, 0xBA2B, 0x90E8,\n\t0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, 0x90EC,\t0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0,\n\t0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4,\t0xBA38, 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6,\n\t0xBA3C, 0xB8D5, 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9,\t0xBA40, 0xB8D6, 0xBA41, 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB,\n\t0xBA44, 0x90FC, 0xBA45, 0x90FD, 0xBA46, 0x90FE, 0xBA47, 0x9141,\t0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, 0x9142, 0xBA4B, 0xB8DA,\n\t0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, 0xBA4F, 0x9144,\t0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, 0xB8DD,\n\t0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149,\t0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C,\n\t0xBA5C, 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F,\t0xBA60, 0x9150, 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153,\n\t0xBA64, 0xB8E2, 0xBA65, 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4,\t0xBA68, 0xB8E5, 0xBA69, 0xB8E6, 0xBA6A, 0x9155, 0xBA6B, 0x9156,\n\t0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, 0x9159, 0xBA6F, 0x915A,\t0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, 0xBA73, 0x9162,\n\t0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, 0x9165,\t0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168,\n\t0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C,\t0xBA80, 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB,\n\t0xBA84, 0xB8EC, 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE,\t0xBA88, 0x9171, 0xBA89, 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174,\n\t0xBA8C, 0xB8EF, 0xBA8D, 0x9175, 0xBA8E, 0x9176, 0xBA8F, 0x9177,\t0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, 0x917A, 0xBA93, 0x9181,\n\t0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, 0xBA97, 0x9185,\t0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, 0x9189,\n\t0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D,\t0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191,\n\t0xBAA4, 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195,\t0xBAA8, 0xB8F0, 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2,\n\t0xBAAC, 0xB8F3, 0xBAAD, 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199,\t0xBAB0, 0xB8F4, 0xBAB1, 0x919A, 0xBAB2, 0xB8F5, 0xBAB3, 0x919B,\n\t0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, 0x919E, 0xBAB7, 0x919F,\t0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, 0xBABB, 0xB8F8,\n\t0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, 0x91A3,\t0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7,\n\t0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA,\t0xBAC8, 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD,\n\t0xBACC, 0x91AE, 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1,\t0xBAD0, 0x91B2, 0xBAD1, 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5,\n\t0xBAD4, 0x91B6, 0xBAD5, 0x91B7, 0xBAD6, 0x91B8, 0xBAD7, 0x91B9,\t0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, 0x91BA, 0xBADB, 0x91BB,\n\t0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, 0xBADF, 0x91BF,\t0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, 0x91C3,\n\t0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7,\t0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB,\n\t0xBAEC, 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF,\t0xBAF0, 0x91D0, 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3,\n\t0xBAF4, 0x91D4, 0xBAF5, 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7,\t0xBAF8, 0x91D8, 0xBAF9, 0x91D9, 0xBAFA, 0x91DA, 0xBAFB, 0x91DB,\n\t0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, 0x91DD, 0xBAFF, 0x91DE,\t0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, 0xBB03, 0x91E1,\n\t0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, 0x91E4,\t0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8,\n\t0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4,\t0xBB10, 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED,\n\t0xBB14, 0x91EE, 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1,\t0xBB18, 0xB9A6, 0xBB19, 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4,\n\t0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, 0xBB1E, 0x91F6, 0xBB1F, 0x91F7,\t0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, 0x91F9, 0xBB23, 0x91FA,\n\t0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, 0xBB27, 0x91FE,\t0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, 0xB9AA,\n\t0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246,\t0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A,\n\t0xBB34, 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B,\t0xBB38, 0xB9AE, 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF,\n\t0xBB3C, 0xB9B0, 0xBB3D, 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E,\t0xBB40, 0x924F, 0xBB41, 0x9250, 0xBB42, 0x9251, 0xBB43, 0x9252,\n\t0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, 0x9253, 0xBB47, 0xB9B5,\t0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, 0xBB4B, 0x9256,\n\t0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, 0xB9B8,\t0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261,\n\t0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264,\t0xBB58, 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267,\n\t0xBB5C, 0x9268, 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B,\t0xBB60, 0x926C, 0xBB61, 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD,\n\t0xBB64, 0x926E, 0xBB65, 0x926F, 0xBB66, 0x9270, 0xBB67, 0x9271,\t0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, 0x9274, 0xBB6B, 0x9275,\n\t0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, 0xBB6F, 0x9278,\t0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, 0x9282,\n\t0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286,\t0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A,\n\t0xBB7C, 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E,\t0xBB80, 0x928F, 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292,\n\t0xBB84, 0x9293, 0xBB85, 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296,\t0xBB88, 0xB9BF, 0xBB89, 0x9297, 0xBB8A, 0x9298, 0xBB8B, 0x9299,\n\t0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, 0x929B, 0xBB8F, 0x929C,\t0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, 0xBB93, 0x929F,\n\t0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, 0x92A3,\t0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7,\n\t0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB,\t0xBBA0, 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF,\n\t0xBBA4, 0xB9C2, 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2,\t0xBBA8, 0xB9C3, 0xBBA9, 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5,\n\t0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, 0xBBAE, 0x92B7, 0xBBAF, 0x92B8,\t0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, 0x92BB, 0xBBB3, 0x92BC,\n\t0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, 0xBBB7, 0xB9C6,\t0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, 0x92C2,\n\t0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6,\t0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9,\n\t0xBBC4, 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC,\t0xBBC8, 0xB9C9, 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF,\n\t0xBBCC, 0x92D0, 0xBBCD, 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3,\t0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB,\n\t0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, 0x92D8, 0xBBD7, 0x92D9,\t0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, 0xBBDB, 0x92DD,\n\t0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, 0x92E1,\t0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5,\n\t0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9,\t0xBBE8, 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED,\n\t0xBBEC, 0x92EE, 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1,\t0xBBF0, 0x92F2, 0xBBF1, 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5,\n\t0xBBF4, 0x92F6, 0xBBF5, 0x92F7, 0xBBF6, 0x92F8, 0xBBF7, 0x92F9,\t0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, 0x92FA, 0xBBFB, 0x92FB,\n\t0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, 0xBBFF, 0xB9CF,\t0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, 0x9341,\n\t0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345,\t0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4,\n\t0xBC0C, 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7,\t0xBC10, 0x9348, 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A,\n\t0xBC14, 0xB9D9, 0xBC15, 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC,\t0xBC18, 0xB9DD, 0xBC19, 0x934B, 0xBC1A, 0x934C, 0xBC1B, 0xB9DE,\n\t0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, 0xB9E1, 0xBC1F, 0xB9E2,\t0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, 0xBC23, 0x9350,\n\t0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, 0xB9E5,\t0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354,\n\t0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357,\t0xBC30, 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359,\n\t0xBC34, 0xB9EA, 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362,\t0xBC38, 0xB9EB, 0xBC39, 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365,\n\t0xBC3C, 0x9366, 0xBC3D, 0x9367, 0xBC3E, 0x9368, 0xBC3F, 0x9369,\t0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, 0x936A, 0xBC43, 0xB9EE,\n\t0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, 0xBC47, 0x936C,\t0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, 0x936F,\n\t0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371,\t0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374,\n\t0xBC54, 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378,\t0xBC58, 0x9379, 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382,\n\t0xBC5C, 0x9383, 0xBC5D, 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385,\t0xBC60, 0x9386, 0xBC61, 0x9387, 0xBC62, 0x9388, 0xBC63, 0x9389,\n\t0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, 0x938C, 0xBC67, 0x938D,\t0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, 0xBC6B, 0x9391,\n\t0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, 0x9395,\t0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399,\n\t0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D,\t0xBC78, 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1,\n\t0xBC7C, 0x93A2, 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5,\t0xBC80, 0x93A6, 0xBC81, 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9,\n\t0xBC84, 0xB9F6, 0xBC85, 0xB9F7, 0xBC86, 0x93AA, 0xBC87, 0x93AB,\t0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, 0x93AD, 0xBC8B, 0xB9F9,\n\t0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, 0xBC8F, 0x93AF,\t0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, 0x93B3,\n\t0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE,\t0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6,\n\t0xBC9C, 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA,\t0xBCA0, 0xBAA3, 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC,\n\t0xBCA4, 0xBAA5, 0xBCA5, 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6,\t0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, 0xBCAA, 0x93C0, 0xBCAB, 0x93C1,\n\t0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, 0x93C4, 0xBCAF, 0x93C5,\t0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, 0xBCB3, 0xBAAA,\n\t0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, 0x93C8,\t0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC,\n\t0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE,\t0xBCC0, 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1,\n\t0xBCC4, 0xBAB0, 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4,\t0xBCC8, 0x93D5, 0xBCC9, 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8,\n\t0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2,\t0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, 0x93DB, 0xBCD3, 0x93DC,\n\t0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, 0xBCD7, 0x93DF,\t0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, 0x93E2,\n\t0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5,\t0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9,\n\t0xBCE4, 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED,\t0xBCE8, 0x93EE, 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1,\n\t0xBCEC, 0x93F2, 0xBCED, 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5,\t0xBCF0, 0x93F6, 0xBCF1, 0x93F7, 0xBCF2, 0x93F8, 0xBCF3, 0x93F9,\n\t0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, 0xBABA, 0xBCF7, 0x93FA,\t0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, 0xBCFB, 0x93FD,\n\t0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, 0x9442,\t0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446,\n\t0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF,\t0xBD08, 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A,\n\t0xBD0C, 0x944B, 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E,\t0xBD10, 0xBAC1, 0xBD11, 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451,\n\t0xBD14, 0xBAC2, 0xBD15, 0x9452, 0xBD16, 0x9453, 0xBD17, 0x9454,\t0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, 0x9457, 0xBD1B, 0x9458,\n\t0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, 0xBD1F, 0x9462,\t0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, 0x9466,\n\t0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469,\t0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D,\n\t0xBD2C, 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470,\t0xBD30, 0x9471, 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474,\n\t0xBD34, 0x9475, 0xBD35, 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478,\t0xBD38, 0x9479, 0xBD39, 0x947A, 0xBD3A, 0x9481, 0xBD3B, 0x9482,\n\t0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, 0x9485, 0xBD3F, 0x9486,\t0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, 0xBD43, 0x9489,\n\t0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, 0x948D,\t0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F,\n\t0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492,\t0xBD50, 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495,\n\t0xBD54, 0x9496, 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499,\t0xBD58, 0xBACA, 0xBD59, 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B,\n\t0xBD5C, 0x949C, 0xBD5D, 0x949D, 0xBD5E, 0x949E, 0xBD5F, 0x949F,\t0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, 0x94A2, 0xBD63, 0x94A3,\n\t0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, 0xBD67, 0x94A6,\t0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, 0x94A9,\n\t0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD,\t0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1,\n\t0xBD74, 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5,\t0xBD78, 0x94B6, 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9,\n\t0xBD7C, 0x94BA, 0xBD7D, 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD,\t0xBD80, 0xBACE, 0xBD81, 0xBACF, 0xBD82, 0x94BE, 0xBD83, 0x94BF,\n\t0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, 0x94C1, 0xBD87, 0xBAD1,\t0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, 0xBD8B, 0x94C2,\n\t0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, 0x94C6,\t0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7,\n\t0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA,\t0xBD98, 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC,\n\t0xBD9C, 0xBADB, 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF,\t0xBDA0, 0x94D0, 0xBDA1, 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3,\n\t0xBDA4, 0xBADC, 0xBDA5, 0x94D4, 0xBDA6, 0x94D5, 0xBDA7, 0x94D6,\t0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, 0x94D9, 0xBDAB, 0x94DA,\n\t0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, 0xBDAF, 0x94DE,\t0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, 0x94E1,\n\t0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5,\t0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8,\n\t0xBDBC, 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC,\t0xBDC0, 0x94ED, 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0,\n\t0xBDC4, 0x94F1, 0xBDC5, 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4,\t0xBDC8, 0x94F5, 0xBDC9, 0x94F6, 0xBDCA, 0x94F7, 0xBDCB, 0x94F8,\n\t0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, 0x94FB, 0xBDCF, 0x94FC,\t0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, 0xBDD3, 0x9542,\n\t0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, 0x9544,\t0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547,\n\t0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A,\t0xBDE0, 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E,\n\t0xBDE4, 0x954F, 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552,\t0xBDE8, 0x9553, 0xBDE9, 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555,\n\t0xBDEC, 0x9556, 0xBDED, 0x9557, 0xBDEE, 0x9558, 0xBDEF, 0x9559,\t0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, 0x9561, 0xBDF3, 0x9562,\n\t0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, 0xBDF7, 0x9565,\t0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, 0x9568,\n\t0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C,\t0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8,\n\t0xBE04, 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571,\t0xBE08, 0x9572, 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575,\n\t0xBE0C, 0xBAEA, 0xBE0D, 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577,\t0xBE10, 0xBAEC, 0xBE11, 0x9578, 0xBE12, 0x9579, 0xBE13, 0x957A,\n\t0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, 0x9582, 0xBE17, 0x9583,\t0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, 0xBE1B, 0x9587,\n\t0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, 0xBAF0,\t0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C,\n\t0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590,\t0xBE28, 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594,\n\t0xBE2C, 0x9595, 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598,\t0xBE30, 0x9599, 0xBE31, 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C,\n\t0xBE34, 0x959D, 0xBE35, 0x959E, 0xBE36, 0x959F, 0xBE37, 0x95A0,\t0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, 0x95A3, 0xBE3B, 0x95A4,\n\t0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, 0xBE3F, 0x95A8,\t0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, 0x95AC,\n\t0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE,\t0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1,\n\t0xBE4C, 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3,\t0xBE50, 0x95B4, 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7,\n\t0xBE54, 0xBAF6, 0xBE55, 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8,\t0xBE58, 0x95B9, 0xBE59, 0xBAF9, 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB,\n\t0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, 0x95BC, 0xBE5F, 0x95BD,\t0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, 0xBE63, 0x95BF,\n\t0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, 0x95C2,\t0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4,\n\t0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8,\t0xBE70, 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5,\n\t0xBE74, 0xBBA6, 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB,\t0xBE78, 0x95CC, 0xBE79, 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8,\n\t0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, 0xBE7E, 0x95CF, 0xBE7F, 0x95D0,\t0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, 0x95D2, 0xBE83, 0x95D3,\n\t0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, 0xBE87, 0x95D6,\t0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, 0x95DA,\n\t0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF,\t0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD,\n\t0xBE94, 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1,\t0xBE98, 0xBBB2, 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3,\n\t0xBE9C, 0x95E4, 0xBE9D, 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7,\t0xBEA0, 0x95E8, 0xBEA1, 0x95E9, 0xBEA2, 0x95EA, 0xBEA3, 0x95EB,\n\t0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, 0x95EE, 0xBEA7, 0x95EF,\t0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, 0xBEAB, 0x95F2,\n\t0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, 0x95F6,\t0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA,\n\t0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE,\t0xBEB8, 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644,\n\t0xBEBC, 0x9645, 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648,\t0xBEC0, 0x9649, 0xBEC1, 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C,\n\t0xBEC4, 0x964D, 0xBEC5, 0x964E, 0xBEC6, 0x964F, 0xBEC7, 0x9650,\t0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, 0x9653, 0xBECB, 0x9654,\n\t0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, 0xBECF, 0x9658,\t0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, 0x965A,\n\t0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8,\t0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665,\n\t0xBEDC, 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669,\t0xBEE0, 0xBBBA, 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB,\n\t0xBEE4, 0xBBBC, 0xBEE5, 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D,\t0xBEE8, 0x966E, 0xBEE9, 0x966F, 0xBEEA, 0x9670, 0xBEEB, 0x9671,\n\t0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, 0x9673, 0xBEEF, 0x9674,\t0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, 0xBEF3, 0x9678,\n\t0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, 0x9682,\t0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686,\n\t0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A,\t0xBF00, 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D,\n\t0xBF04, 0x968E, 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691,\t0xBF08, 0xBBC0, 0xBF09, 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693,\n\t0xBF0C, 0x9694, 0xBF0D, 0x9695, 0xBF0E, 0x9696, 0xBF0F, 0x9697,\t0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, 0x969A, 0xBF13, 0x969B,\n\t0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, 0xBF17, 0x969F,\t0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, 0xBBC4,\n\t0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2,\t0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6,\n\t0xBF24, 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA,\t0xBF28, 0x96AB, 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE,\n\t0xBF2C, 0x96AF, 0xBF2D, 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2,\t0xBF30, 0x96B3, 0xBF31, 0x96B4, 0xBF32, 0x96B5, 0xBF33, 0x96B6,\n\t0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, 0x96B9, 0xBF37, 0x96BA,\t0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, 0xBF3B, 0x96BE,\n\t0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, 0x96C2,\t0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4,\n\t0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7,\t0xBF48, 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA,\n\t0xBF4C, 0x96CB, 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE,\t0xBF50, 0xBBCB, 0xBF51, 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0,\n\t0xBF54, 0x96D1, 0xBF55, 0xBBCD, 0xBF56, 0x96D2, 0xBF57, 0x96D3,\t0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, 0x96D6, 0xBF5B, 0x96D7,\n\t0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, 0xBF5F, 0x96DB,\t0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, 0x96DF,\n\t0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3,\t0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7,\n\t0xBF6C, 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB,\t0xBF70, 0x96EC, 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF,\n\t0xBF74, 0x96F0, 0xBF75, 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3,\t0xBF78, 0x96F4, 0xBF79, 0x96F5, 0xBF7A, 0x96F6, 0xBF7B, 0x96F7,\n\t0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, 0x96FA, 0xBF7F, 0x96FB,\t0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, 0xBF83, 0x9741,\n\t0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, 0x9745,\t0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749,\n\t0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D,\t0xBF90, 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751,\n\t0xBF94, 0xBBCE, 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754,\t0xBF98, 0x9755, 0xBF99, 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758,\n\t0xBF9C, 0x9759, 0xBF9D, 0x975A, 0xBF9E, 0x9761, 0xBF9F, 0x9762,\t0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, 0x9765, 0xBFA3, 0x9766,\n\t0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, 0xBFA7, 0x976A,\t0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, 0x976E,\n\t0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772,\t0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775,\n\t0xBFB4, 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779,\t0xBFB8, 0x977A, 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783,\n\t0xBFBC, 0x9784, 0xBFBD, 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787,\t0xBFC0, 0x9788, 0xBFC1, 0x9789, 0xBFC2, 0x978A, 0xBFC3, 0x978B,\n\t0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, 0x978D, 0xBFC7, 0x978E,\t0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, 0xBFCB, 0x9792,\n\t0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, 0x9794,\t0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797,\n\t0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A,\t0xBFD8, 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E,\n\t0xBFDC, 0xBBD5, 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6,\t0xBFE0, 0x97A1, 0xBFE1, 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3,\n\t0xBFE4, 0x97A4, 0xBFE5, 0x97A5, 0xBFE6, 0x97A6, 0xBFE7, 0x97A7,\t0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, 0x97AA, 0xBFEB, 0x97AB,\n\t0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, 0xBFEF, 0x97AF,\t0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, 0x97B3,\n\t0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7,\t0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB,\n\t0xBFFC, 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF,\t0xC000, 0x97C0, 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3,\n\t0xC004, 0x97C4, 0xC005, 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7,\t0xC008, 0x97C8, 0xC009, 0x97C9, 0xC00A, 0x97CA, 0xC00B, 0x97CB,\n\t0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, 0x97CE, 0xC00F, 0x97CF,\t0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, 0xC013, 0x97D3,\n\t0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, 0x97D7,\t0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB,\n\t0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF,\t0xC020, 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3,\n\t0xC024, 0x97E4, 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7,\t0xC028, 0x97E8, 0xC029, 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB,\n\t0xC02C, 0x97EC, 0xC02D, 0x97ED, 0xC02E, 0x97EE, 0xC02F, 0x97EF,\t0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, 0x97F2, 0xC033, 0x97F3,\n\t0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, 0xC037, 0x97F7,\t0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, 0x97FB,\n\t0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE,\t0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844,\n\t0xC044, 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848,\t0xC048, 0x9849, 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C,\n\t0xC04C, 0x984D, 0xC04D, 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850,\t0xC050, 0x9851, 0xC051, 0xBBD9, 0xC052, 0x9852, 0xC053, 0x9853,\n\t0xC054, 0x9854, 0xC055, 0x9855, 0xC056, 0x9856, 0xC057, 0x9857,\t0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, 0xC05B, 0x985A,\n\t0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, 0x9863,\t0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866,\n\t0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A,\t0xC068, 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C,\n\t0xC06C, 0x986D, 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870,\t0xC070, 0x9871, 0xC071, 0x9872, 0xC072, 0x9873, 0xC073, 0x9874,\n\t0xC074, 0x9875, 0xC075, 0x9876, 0xC076, 0x9877, 0xC077, 0x9878,\t0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, 0x9881, 0xC07B, 0x9882,\n\t0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, 0xC07F, 0x9886,\t0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, 0x988A,\n\t0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E,\t0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892,\n\t0xC08C, 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896,\t0xC090, 0xBBDF, 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898,\n\t0xC094, 0xBBE1, 0xC095, 0x9899, 0xC096, 0x989A, 0xC097, 0x989B,\t0xC098, 0xBBE2, 0xC099, 0x989C, 0xC09A, 0x989D, 0xC09B, 0x989E,\n\t0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, 0x98A1, 0xC09F, 0x98A2,\t0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, 0xC0A3, 0xBBE5,\n\t0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, 0x98A6,\t0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA,\n\t0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9,\t0xC0B0, 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB,\n\t0xC0B4, 0xBBEC, 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE,\t0xC0B8, 0x98AF, 0xC0B9, 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2,\n\t0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1,\t0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, 0x98B4, 0xC0C3, 0x98B5,\n\t0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, 0xC0C7, 0x98B8,\t0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, 0x98BA,\n\t0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD,\t0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0,\n\t0xC0D4, 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4,\t0xC0D8, 0xBBF9, 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB,\n\t0xC0DC, 0xBBFC, 0xC0DD, 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7,\t0xC0E0, 0x98C8, 0xC0E1, 0x98C9, 0xC0E2, 0x98CA, 0xC0E3, 0x98CB,\n\t0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, 0x98CC, 0xC0E7, 0x98CD,\t0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, 0xC0EB, 0x98D0,\n\t0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, 0x98D3,\t0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7,\n\t0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6,\t0xC0F8, 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB,\n\t0xC0FC, 0x98DC, 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF,\t0xC100, 0xBCA8, 0xC101, 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2,\n\t0xC104, 0xBCA9, 0xC105, 0x98E3, 0xC106, 0x98E4, 0xC107, 0x98E5,\t0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, 0x98E7, 0xC10B, 0x98E8,\n\t0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, 0xC10F, 0x98EC,\t0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, 0x98EF,\n\t0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2,\t0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6,\n\t0xC11C, 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0,\t0xC120, 0xBCB1, 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2,\n\t0xC124, 0xBCB3, 0xC125, 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5,\t0xC128, 0x98FA, 0xC129, 0x98FB, 0xC12A, 0x98FC, 0xC12B, 0x98FD,\n\t0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, 0x98FE, 0xC12F, 0xBCB8,\t0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, 0xC133, 0x9942,\n\t0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, 0x9945,\t0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947,\n\t0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A,\t0xC140, 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D,\n\t0xC144, 0x994E, 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951,\t0xC148, 0xBCC0, 0xC149, 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2,\n\t0xC14C, 0xBCC3, 0xC14D, 0xBCC4, 0xC14E, 0x9953, 0xC14F, 0x9954,\t0xC150, 0x9955, 0xC151, 0x9956, 0xC152, 0x9957, 0xC153, 0x9958,\n\t0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, 0xC157, 0x995A,\t0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, 0x9963,\n\t0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966,\t0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A,\n\t0xC164, 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB,\t0xC168, 0xBCCC, 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D,\n\t0xC16C, 0x996E, 0xC16D, 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971,\t0xC170, 0xBCCE, 0xC171, 0x9972, 0xC172, 0x9973, 0xC173, 0x9974,\n\t0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, 0x9976, 0xC177, 0x9977,\t0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, 0xC17B, 0x997A,\n\t0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, 0x9984,\t0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988,\n\t0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B,\t0xC188, 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F,\n\t0xC18C, 0xBCD2, 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990,\t0xC190, 0xBCD5, 0xC191, 0x9991, 0xC192, 0x9992, 0xC193, 0x9993,\n\t0xC194, 0xBCD6, 0xC195, 0x9994, 0xC196, 0xBCD7, 0xC197, 0x9995,\t0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, 0x9998, 0xC19B, 0x9999,\n\t0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, 0xC19F, 0xBCDA,\t0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, 0x999D,\n\t0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0,\t0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2,\n\t0xC1AC, 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5,\t0xC1B0, 0xBCE0, 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8,\n\t0xC1B4, 0x99A9, 0xC1B5, 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC,\t0xC1B8, 0x99AD, 0xC1B9, 0x99AE, 0xC1BA, 0x99AF, 0xC1BB, 0x99B0,\n\t0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, 0x99B2, 0xC1BF, 0x99B3,\t0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, 0xC1C3, 0x99B7,\n\t0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, 0x99BA,\t0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD,\n\t0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0,\t0xC1D0, 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4,\n\t0xC1D4, 0xBCE5, 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6,\t0xC1D8, 0xBCE7, 0xC1D9, 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9,\n\t0xC1DC, 0x99CA, 0xC1DD, 0x99CB, 0xC1DE, 0x99CC, 0xC1DF, 0x99CD,\t0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, 0x99CF, 0xC1E3, 0x99D0,\n\t0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, 0xC1E7, 0x99D3,\t0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, 0x99D6,\n\t0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA,\t0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED,\n\t0xC1F4, 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF,\t0xC1F8, 0x99E0, 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3,\n\t0xC1FC, 0xBCEE, 0xC1FD, 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5,\t0xC200, 0xBCF0, 0xC201, 0x99E6, 0xC202, 0x99E7, 0xC203, 0x99E8,\n\t0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, 0x99EA, 0xC207, 0x99EB,\t0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, 0xC20B, 0x99EF,\n\t0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, 0xBCF4,\t0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3,\n\t0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7,\t0xC218, 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9,\n\t0xC21C, 0xBCF8, 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9,\t0xC220, 0xBCFA, 0xC221, 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE,\n\t0xC224, 0x9A41, 0xC225, 0x9A42, 0xC226, 0x9A43, 0xC227, 0x9A44,\t0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, 0x9A45, 0xC22B, 0xBCFD,\n\t0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, 0xC22F, 0xBDA1,\t0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, 0x9A49,\n\t0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C,\t0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50,\n\t0xC23C, 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54,\t0xC240, 0x9A55, 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58,\n\t0xC244, 0x9A59, 0xC245, 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62,\t0xC248, 0xBDA5, 0xC249, 0x9A63, 0xC24A, 0x9A64, 0xC24B, 0x9A65,\n\t0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, 0x9A68, 0xC24F, 0x9A69,\t0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, 0xC253, 0x9A6B,\n\t0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, 0x9A6E,\t0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71,\n\t0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75,\t0xC260, 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78,\n\t0xC264, 0x9A79, 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81,\t0xC268, 0x9A82, 0xC269, 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85,\n\t0xC26C, 0xBDAC, 0xC26D, 0xBDAD, 0xC26E, 0x9A86, 0xC26F, 0x9A87,\t0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, 0x9A89, 0xC273, 0x9A8A,\n\t0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, 0xC277, 0x9A8D,\t0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, 0x9A91,\n\t0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2,\t0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95,\n\t0xC284, 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99,\t0xC288, 0xBDB4, 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B,\n\t0xC28C, 0x9A9C, 0xC28D, 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F,\t0xC290, 0xBDB6, 0xC291, 0x9AA0, 0xC292, 0x9AA1, 0xC293, 0x9AA2,\n\t0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, 0x9AA5, 0xC297, 0x9AA6,\t0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, 0xC29B, 0xBDB8,\n\t0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, 0x9AAB,\t0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF,\n\t0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1,\t0xC2A8, 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4,\n\t0xC2AC, 0xBDBD, 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6,\t0xC2B0, 0x9AB7, 0xC2B1, 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA,\n\t0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1,\t0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, 0x9ABD, 0xC2BB, 0x9ABE,\n\t0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, 0xC2BF, 0x9AC2,\t0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, 0x9AC6,\n\t0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA,\t0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE,\n\t0xC2CC, 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2,\t0xC2D0, 0x9AD3, 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6,\n\t0xC2D4, 0x9AD7, 0xC2D5, 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA,\t0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE,\n\t0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, 0x9ADF, 0xC2DF, 0x9AE0,\t0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, 0xC2E3, 0xBDC6,\n\t0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, 0x9AE5,\t0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8,\n\t0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB,\t0xC2F0, 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC,\n\t0xC2F4, 0x9AED, 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF,\t0xC2F8, 0xBDCE, 0xC2F9, 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0,\n\t0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3,\t0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, 0x9AF5, 0xC303, 0x9AF6,\n\t0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, 0xC307, 0x9AFA,\t0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, 0x9AFC,\n\t0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE,\t0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7,\n\t0xC314, 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45,\t0xC318, 0xBDDA, 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48,\n\t0xC31C, 0xBDDB, 0xC31D, 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B,\t0xC320, 0x9B4C, 0xC321, 0x9B4D, 0xC322, 0x9B4E, 0xC323, 0x9B4F,\n\t0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, 0x9B50, 0xC327, 0x9B51,\t0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, 0xC32B, 0x9B53,\n\t0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, 0x9B57,\t0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61,\n\t0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65,\t0xC338, 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69,\n\t0xC33C, 0x9B6A, 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D,\t0xC340, 0x9B6E, 0xC341, 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71,\n\t0xC344, 0x9B72, 0xC345, 0xBDE0, 0xC346, 0x9B73, 0xC347, 0x9B74,\t0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, 0x9B77, 0xC34B, 0x9B78,\n\t0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, 0xC34F, 0x9B82,\t0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, 0x9B86,\n\t0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A,\t0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E,\n\t0xC35C, 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92,\t0xC360, 0x9B93, 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96,\n\t0xC364, 0x9B97, 0xC365, 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A,\t0xC368, 0xBDE1, 0xC369, 0xBDE2, 0xC36A, 0x9B9B, 0xC36B, 0x9B9C,\n\t0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, 0x9B9E, 0xC36F, 0x9B9F,\t0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, 0xC373, 0x9BA1,\n\t0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, 0x9BA5,\t0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7,\n\t0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9,\t0xC380, 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD,\n\t0xC384, 0xBDEA, 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0,\t0xC388, 0xBDEB, 0xC389, 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3,\n\t0xC38C, 0xBDEC, 0xC38D, 0x9BB4, 0xC38E, 0x9BB5, 0xC38F, 0x9BB6,\t0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, 0x9BB9, 0xC393, 0x9BBA,\n\t0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, 0xC397, 0x9BBE,\t0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, 0x9BC2,\n\t0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6,\t0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA,\n\t0xC3A4, 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE,\t0xC3A8, 0x9BCF, 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2,\n\t0xC3AC, 0x9BD3, 0xC3AD, 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6,\t0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA,\n\t0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, 0x9BDD, 0xC3B7, 0x9BDE,\t0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, 0xC3BB, 0x9BE2,\n\t0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, 0x9BE6,\t0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9,\n\t0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED,\t0xC3C8, 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1,\n\t0xC3CC, 0x9BF2, 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5,\t0xC3D0, 0x9BF6, 0xC3D1, 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9,\n\t0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD,\t0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, 0x9BFE, 0xC3DB, 0x9C41,\n\t0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, 0xC3DF, 0xBDF1,\t0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, 0x9C45,\n\t0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49,\t0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B,\n\t0xC3EC, 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E,\t0xC3F0, 0x9C4F, 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52,\n\t0xC3F4, 0xBDF7, 0xC3F5, 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54,\t0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, 0xC3FA, 0x9C56, 0xC3FB, 0x9C57,\n\t0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, 0x9C5A, 0xC3FF, 0x9C61,\t0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, 0xC403, 0x9C65,\n\t0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, 0x9C69,\t0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C,\n\t0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70,\t0xC410, 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73,\n\t0xC414, 0x9C74, 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77,\t0xC418, 0x9C78, 0xC419, 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81,\n\t0xC41C, 0x9C82, 0xC41D, 0x9C83, 0xC41E, 0x9C84, 0xC41F, 0x9C85,\t0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, 0x9C88, 0xC423, 0x9C89,\n\t0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, 0xC427, 0x9C8C,\t0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, 0x9C90,\n\t0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93,\t0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96,\n\t0xC434, 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99,\t0xC438, 0x9C9A, 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D,\n\t0xC43C, 0xBEA2, 0xC43D, 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F,\t0xC440, 0x9CA0, 0xC441, 0x9CA1, 0xC442, 0x9CA2, 0xC443, 0x9CA3,\n\t0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, 0x9CA6, 0xC447, 0x9CA7,\t0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, 0xC44B, 0x9CAA,\n\t0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, 0x9CAE,\t0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2,\n\t0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6,\t0xC458, 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA,\n\t0xC45C, 0x9CBB, 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE,\t0xC460, 0x9CBF, 0xC461, 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2,\n\t0xC464, 0xBEA5, 0xC465, 0xBEA6, 0xC466, 0x9CC3, 0xC467, 0x9CC4,\t0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, 0x9CC6, 0xC46B, 0x9CC7,\n\t0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, 0xC46F, 0x9CCA,\t0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, 0x9CCE,\n\t0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0,\t0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3,\n\t0xC47C, 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7,\t0xC480, 0xBEAC, 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA,\n\t0xC484, 0x9CDB, 0xC485, 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE,\t0xC488, 0x9CDF, 0xC489, 0x9CE0, 0xC48A, 0x9CE1, 0xC48B, 0x9CE2,\n\t0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, 0x9CE5, 0xC48F, 0x9CE6,\t0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, 0xC493, 0x9CEA,\n\t0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, 0x9CED,\t0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1,\n\t0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4,\t0xC4A0, 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8,\n\t0xC4A4, 0x9CF9, 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC,\t0xC4A8, 0x9CFD, 0xC4A9, 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42,\n\t0xC4AC, 0x9D43, 0xC4AD, 0x9D44, 0xC4AE, 0x9D45, 0xC4AF, 0x9D46,\t0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, 0x9D49, 0xC4B3, 0x9D4A,\n\t0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, 0xC4B7, 0x9D4E,\t0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, 0x9D51,\n\t0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54,\t0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58,\n\t0xC4C4, 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62,\t0xC4C8, 0x9D63, 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66,\n\t0xC4CC, 0x9D67, 0xC4CD, 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A,\t0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E,\n\t0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, 0x9D71, 0xC4D7, 0x9D72,\t0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, 0xC4DB, 0x9D76,\n\t0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, 0x9D7A,\t0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84,\n\t0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88,\t0xC4E8, 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B,\n\t0xC4EC, 0x9D8C, 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F,\t0xC4F0, 0xBEB2, 0xC4F1, 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91,\n\t0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, 0xC4F6, 0x9D93, 0xC4F7, 0x9D94,\t0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, 0xBEB6, 0xC4FB, 0x9D96,\n\t0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, 0xC4FF, 0xBEB7,\t0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, 0x9D9B,\n\t0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F,\t0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3,\n\t0xC50C, 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6,\t0xC510, 0xBEBB, 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9,\n\t0xC514, 0xBEBC, 0xC515, 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC,\t0xC518, 0x9DAD, 0xC519, 0x9DAE, 0xC51A, 0x9DAF, 0xC51B, 0x9DB0,\n\t0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, 0x9DB2, 0xC51F, 0x9DB3,\t0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, 0xC523, 0x9DB7,\n\t0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, 0x9DBB,\t0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD,\n\t0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0,\t0xC530, 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3,\n\t0xC534, 0x9DC4, 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7,\t0xC538, 0xBEC2, 0xC539, 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4,\n\t0xC53C, 0x9DC9, 0xC53D, 0xBEC5, 0xC53E, 0x9DCA, 0xC53F, 0x9DCB,\t0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, 0x9DCE, 0xC543, 0x9DCF,\n\t0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, 0xC547, 0x9DD1,\t0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, 0x9DD2,\n\t0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3,\t0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE,\n\t0xC554, 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1,\t0xC558, 0xBED2, 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9,\n\t0xC55C, 0x9DDA, 0xC55D, 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB,\t0xC560, 0xBED6, 0xC561, 0xBED7, 0xC562, 0x9DDC, 0xC563, 0x9DDD,\n\t0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, 0x9DDF, 0xC567, 0x9DE0,\t0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, 0xC56B, 0x9DE3,\n\t0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, 0x9DE7,\t0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC,\n\t0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA,\t0xC578, 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE,\n\t0xC57C, 0xBEDF, 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0,\t0xC580, 0xBEE1, 0xC581, 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3,\n\t0xC584, 0xBEE2, 0xC585, 0x9DF4, 0xC586, 0x9DF5, 0xC587, 0xBEE3,\t0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, 0x9DF8, 0xC58B, 0x9DF9,\n\t0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, 0xC58F, 0xBEE6,\t0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, 0x9DFD,\n\t0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9,\t0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44,\n\t0xC59C, 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47,\t0xC5A0, 0xBEEC, 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A,\n\t0xC5A4, 0x9E4B, 0xC5A5, 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E,\t0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, 0xC5AA, 0x9E50, 0xC5AB, 0x9E51,\n\t0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, 0x9E54, 0xC5AF, 0x9E55,\t0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, 0xC5B3, 0x9E59,\n\t0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, 0x9E61,\t0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2,\n\t0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63,\t0xC5C0, 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67,\n\t0xC5C4, 0xBEF6, 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9,\t0xC5C8, 0xBEFA, 0xC5C9, 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68,\n\t0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A,\t0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, 0x9E6B, 0xC5D3, 0x9E6C,\n\t0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, 0xC5D7, 0x9E6F,\t0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, 0x9E72,\n\t0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76,\t0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7,\n\t0xC5E4, 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A,\t0xC5E8, 0x9E81, 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84,\n\t0xC5EC, 0xBFA9, 0xC5ED, 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85,\t0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, 0xC5F2, 0x9E87, 0xC5F3, 0x9E88,\n\t0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, 0xBFAE, 0xC5F7, 0xBFAF,\t0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, 0xC5FB, 0x9E8D,\n\t0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, 0xBFB3,\t0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F,\n\t0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8,\t0xC608, 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93,\n\t0xC60C, 0xBFBA, 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96,\t0xC610, 0xBFBB, 0xC611, 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99,\n\t0xC614, 0x9E9A, 0xC615, 0x9E9B, 0xC616, 0x9E9C, 0xC617, 0x9E9D,\t0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, 0x9E9E, 0xC61B, 0xBFBE,\n\t0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, 0xC61F, 0x9EA1,\t0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, 0x9EA5,\n\t0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7,\t0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA,\n\t0xC62C, 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB,\t0xC630, 0xBFC6, 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7,\n\t0xC634, 0xBFC8, 0xC635, 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA,\t0xC638, 0x9EAF, 0xC639, 0xBFCB, 0xC63A, 0x9EB0, 0xC63B, 0xBFCC,\n\t0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, 0x9EB3, 0xC63F, 0x9EB4,\t0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, 0xC643, 0x9EB6,\n\t0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, 0x9EB9,\t0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC,\n\t0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0,\t0xC650, 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3,\n\t0xC654, 0xBFD4, 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3,\t0xC658, 0x9EC4, 0xC659, 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7,\n\t0xC65C, 0xBFD6, 0xC65D, 0xBFD7, 0xC65E, 0x9EC8, 0xC65F, 0x9EC9,\t0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, 0x9ECB, 0xC663, 0x9ECC,\n\t0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, 0xC667, 0x9ED0,\t0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, 0x9ED4,\n\t0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA,\t0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9,\n\t0xC674, 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD,\t0xC678, 0xBFDC, 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF,\n\t0xC67C, 0xBFDE, 0xC67D, 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2,\t0xC680, 0xBFDF, 0xC681, 0x9EE3, 0xC682, 0x9EE4, 0xC683, 0x9EE5,\n\t0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, 0x9EE8, 0xC687, 0x9EE9,\t0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, 0xC68B, 0xBFE2,\n\t0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, 0x9EED,\t0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1,\n\t0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3,\t0xC698, 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6,\n\t0xC69C, 0xBFE7, 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9,\t0xC6A0, 0x9EFA, 0xC6A1, 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD,\n\t0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA,\t0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, 0x9F42, 0xC6AB, 0x9F43,\n\t0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, 0xC6AF, 0x9F47,\t0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, 0x9F49,\n\t0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C,\t0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D,\n\t0xC6BC, 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51,\t0xC6C0, 0xBFF2, 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4,\n\t0xC6C4, 0x9F53, 0xC6C5, 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55,\t0xC6C8, 0x9F56, 0xC6C9, 0x9F57, 0xC6CA, 0x9F58, 0xC6CB, 0x9F59,\n\t0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, 0x9F5A, 0xC6CF, 0x9F61,\t0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, 0xC6D3, 0x9F64,\n\t0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, 0x9F67,\t0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B,\n\t0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D,\t0xC6E0, 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F,\n\t0xC6E4, 0x9F70, 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73,\t0xC6E8, 0xBFFE, 0xC6E9, 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75,\n\t0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, 0xC6EE, 0x9F77, 0xC6EF, 0x9F78,\t0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, 0x9F7A, 0xC6F3, 0x9F81,\n\t0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, 0xC6F7, 0x9F85,\t0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, 0x9F87,\n\t0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A,\t0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E,\n\t0xC704, 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90,\t0xC708, 0xC0A9, 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93,\n\t0xC70C, 0xC0AA, 0xC70D, 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96,\t0xC710, 0x9F97, 0xC711, 0x9F98, 0xC712, 0x9F99, 0xC713, 0x9F9A,\n\t0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, 0x9F9B, 0xC717, 0xC0AD,\t0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, 0xC71B, 0x9F9E,\n\t0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, 0x9FA2,\t0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4,\n\t0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7,\t0xC728, 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA,\n\t0xC72C, 0x9FAB, 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE,\t0xC730, 0xC0B3, 0xC731, 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5,\n\t0xC734, 0x9FB0, 0xC735, 0xC0B6, 0xC736, 0x9FB1, 0xC737, 0xC0B7,\t0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, 0x9FB4, 0xC73B, 0x9FB5,\n\t0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, 0xC73F, 0x9FB7,\t0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, 0x9FBA,\n\t0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD,\t0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0,\n\t0xC74C, 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF,\t0xC750, 0x9FC2, 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2,\n\t0xC754, 0xC0C3, 0xC755, 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6,\t0xC758, 0xC0C7, 0xC759, 0x9FC3, 0xC75A, 0x9FC4, 0xC75B, 0x9FC5,\n\t0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, 0x9FC7, 0xC75F, 0x9FC8,\t0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, 0xC763, 0x9FCB,\n\t0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, 0x9FCF,\t0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB,\n\t0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5,\t0xC770, 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9,\n\t0xC774, 0xC0CC, 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB,\t0xC778, 0xC0CE, 0xC779, 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE,\n\t0xC77C, 0xC0CF, 0xC77D, 0xC0D0, 0xC77E, 0xC0D1, 0xC77F, 0x9FDF,\t0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, 0x9FE2, 0xC783, 0xC0D2,\n\t0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, 0xC787, 0xC0D5,\t0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, 0x9FE4,\n\t0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7,\t0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9,\n\t0xC794, 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE,\t0xC798, 0xC0DF, 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC,\n\t0xC79C, 0x9FED, 0xC79D, 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0,\t0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3,\n\t0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, 0xC0E6, 0xC7A7, 0x9FF2,\t0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, 0xC7AB, 0x9FF6,\n\t0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, 0x9FF8,\t0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB,\n\t0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE,\t0xC7B8, 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044,\n\t0xC7BC, 0xC0EB, 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED,\t0xC7C0, 0xC0EE, 0xC7C1, 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047,\n\t0xC7C4, 0xA048, 0xC7C5, 0xA049, 0xC7C6, 0xA04A, 0xC7C7, 0xA04B,\t0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, 0xA04C, 0xC7CB, 0xA04D,\n\t0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, 0xC7CF, 0xA04F,\t0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, 0xA052,\n\t0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056,\t0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059,\n\t0xC7DC, 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062,\t0xC7E0, 0xA063, 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066,\n\t0xC7E4, 0xC0F7, 0xC7E5, 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069,\t0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, 0xC7EA, 0xA06B, 0xC7EB, 0xA06C,\n\t0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, 0xA06E, 0xC7EF, 0xA06F,\t0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, 0xC7F3, 0xA073,\n\t0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, 0xA077,\t0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081,\n\t0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085,\t0xC800, 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087,\n\t0xC804, 0xC0FC, 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A,\t0xC808, 0xC0FD, 0xC809, 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C,\n\t0xC80C, 0xA08D, 0xC80D, 0xA08E, 0xC80E, 0xA08F, 0xC80F, 0xA090,\t0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, 0xA091, 0xC813, 0xC1A3,\n\t0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, 0xC817, 0xA093,\t0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, 0xA097,\n\t0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099,\t0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C,\n\t0xC824, 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F,\t0xC828, 0xA0A0, 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3,\n\t0xC82C, 0xC1AA, 0xC82D, 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC,\t0xC830, 0xA0A5, 0xC831, 0xC1AD, 0xC832, 0xA0A6, 0xC833, 0xA0A7,\n\t0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, 0xA0AA, 0xC837, 0xA0AB,\t0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, 0xC83B, 0xA0AE,\n\t0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, 0xA0B1,\t0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4,\n\t0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8,\t0xC848, 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA,\n\t0xC84C, 0xC1B3, 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC,\t0xC850, 0xA0BD, 0xC851, 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0,\n\t0xC854, 0xC1B5, 0xC855, 0xA0C1, 0xC856, 0xA0C2, 0xC857, 0xA0C3,\t0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, 0xA0C6, 0xC85B, 0xA0C7,\n\t0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, 0xC85F, 0xA0CB,\t0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, 0xA0CF,\n\t0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3,\t0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7,\n\t0xC86C, 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB,\t0xC870, 0xC1B6, 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD,\n\t0xC874, 0xC1B8, 0xC875, 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0,\t0xC878, 0xC1B9, 0xC879, 0xA0E1, 0xC87A, 0xC1BA, 0xC87B, 0xA0E2,\n\t0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, 0xA0E5, 0xC87F, 0xA0E6,\t0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, 0xC883, 0xC1BD,\n\t0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, 0xC1C0,\t0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1,\n\t0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED,\t0xC890, 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1,\n\t0xC894, 0xC1C4, 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4,\t0xC898, 0xA0F5, 0xC899, 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8,\n\t0xC89C, 0xA0F9, 0xC89D, 0xC1C5, 0xC89E, 0xA0FA, 0xC89F, 0xC1C6,\t0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, 0xA0FC, 0xC8A3, 0xA0FD,\n\t0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, 0xC8A7, 0xA143,\t0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, 0xA146,\n\t0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A,\t0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E,\n\t0xC8B4, 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152,\t0xC8B8, 0xA153, 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156,\n\t0xC8BC, 0xC1C9, 0xC8BD, 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158,\t0xC8C0, 0xA159, 0xC8C1, 0xA15A, 0xC8C2, 0xA161, 0xC8C3, 0xA162,\n\t0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, 0xA164, 0xC8C7, 0xA165,\t0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, 0xC8CB, 0xA168,\n\t0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, 0xA16B,\t0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F,\n\t0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0,\t0xC8D8, 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173,\n\t0xC8DC, 0xA174, 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177,\t0xC8E0, 0xC1D2, 0xC8E1, 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179,\n\t0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, 0xC8E6, 0xA181, 0xC8E7, 0xA182,\t0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, 0xA185, 0xC8EB, 0xA186,\n\t0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, 0xC8EF, 0xA18A,\t0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, 0xA18E,\n\t0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191,\t0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195,\n\t0xC8FC, 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197,\t0xC900, 0xC1D8, 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A,\n\t0xC904, 0xC1D9, 0xC905, 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B,\t0xC908, 0xA19C, 0xC909, 0xA19D, 0xC90A, 0xA19E, 0xC90B, 0xA19F,\n\t0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, 0xA1A0, 0xC90F, 0xC1DE,\t0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, 0xC913, 0xA243,\n\t0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, 0xA247,\t0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A,\n\t0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E,\t0xC920, 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252,\n\t0xC924, 0xA253, 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256,\t0xC928, 0xA257, 0xC929, 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A,\n\t0xC92C, 0xC1E1, 0xC92D, 0xA261, 0xC92E, 0xA262, 0xC92F, 0xA263,\t0xC930, 0xA264, 0xC931, 0xA265, 0xC932, 0xA266, 0xC933, 0xA267,\n\t0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, 0xC937, 0xA26A,\t0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, 0xA26E,\n\t0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272,\t0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276,\n\t0xC944, 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A,\t0xC948, 0xA281, 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284,\n\t0xC94C, 0xA285, 0xC94D, 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288,\t0xC950, 0xC1E3, 0xC951, 0xC1E4, 0xC952, 0xA289, 0xC953, 0xA28A,\n\t0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, 0xA28C, 0xC957, 0xA28D,\t0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, 0xC95B, 0xA290,\n\t0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, 0xA294,\t0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9,\n\t0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299,\t0xC968, 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D,\n\t0xC96C, 0xC1EA, 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0,\t0xC970, 0xC1EB, 0xC971, 0xA341, 0xC972, 0xA342, 0xC973, 0xA343,\n\t0xC974, 0xC1EC, 0xC975, 0xA344, 0xC976, 0xA345, 0xC977, 0xA346,\t0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, 0xA349, 0xC97B, 0xA34A,\n\t0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, 0xC97F, 0xA34D,\t0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, 0xA351,\n\t0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355,\t0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357,\n\t0xC98C, 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A,\t0xC990, 0xC1F1, 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363,\n\t0xC994, 0xA364, 0xC995, 0xA365, 0xC996, 0xA366, 0xC997, 0xA367,\t0xC998, 0xC1F2, 0xC999, 0xC1F3, 0xC99A, 0xA368, 0xC99B, 0xC1F4,\n\t0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, 0xA36A, 0xC99F, 0xA36B,\t0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, 0xC9A3, 0xA36F,\n\t0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, 0xA373,\t0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377,\n\t0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381,\t0xC9B0, 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385,\n\t0xC9B4, 0xA386, 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389,\t0xC9B8, 0xA38A, 0xC9B9, 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D,\n\t0xC9BC, 0xA38E, 0xC9BD, 0xA38F, 0xC9BE, 0xA390, 0xC9BF, 0xA391,\t0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, 0xA392, 0xC9C3, 0xA393,\n\t0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, 0xC9C7, 0xC1F9,\t0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, 0xA397,\n\t0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B,\t0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE,\n\t0xC9D4, 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E,\t0xC9D8, 0xA39F, 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0,\n\t0xC9DC, 0xC2A5, 0xC9DD, 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442,\t0xC9E0, 0xC2A7, 0xC9E1, 0xA443, 0xC9E2, 0xC2A8, 0xC9E3, 0xA444,\n\t0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, 0xA446, 0xC9E7, 0xC2AA,\t0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, 0xC9EB, 0xA44A,\n\t0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, 0xC2AD,\t0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D,\n\t0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451,\t0xC9F8, 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453,\n\t0xC9FC, 0xC2B2, 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456,\t0xCA00, 0xC2B3, 0xCA01, 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459,\n\t0xCA04, 0xA45A, 0xCA05, 0xA461, 0xCA06, 0xA462, 0xCA07, 0xA463,\t0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, 0xA464, 0xCA0B, 0xC2B6,\n\t0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, 0xCA0F, 0xA466,\t0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, 0xA46A,\n\t0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D,\t0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470,\n\t0xCA1C, 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474,\t0xCA20, 0xA475, 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478,\n\t0xCA24, 0xA479, 0xCA25, 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482,\t0xCA28, 0xA483, 0xCA29, 0xC2BB, 0xCA2A, 0xA484, 0xCA2B, 0xA485,\n\t0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, 0xA488, 0xCA2F, 0xA489,\t0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, 0xCA33, 0xA48D,\n\t0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, 0xA491,\t0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495,\n\t0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499,\t0xCA40, 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D,\n\t0xCA44, 0xA49E, 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541,\t0xCA48, 0xA542, 0xCA49, 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545,\n\t0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, 0xCA4E, 0xA546, 0xCA4F, 0xA547,\t0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, 0xA549, 0xCA53, 0xA54A,\n\t0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, 0xCA57, 0xA54D,\t0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, 0xA551,\n\t0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2,\t0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554,\n\t0xCA64, 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558,\t0xCA68, 0xC2C5, 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561,\n\t0xCA6C, 0xA562, 0xCA6D, 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565,\t0xCA70, 0xA566, 0xCA71, 0xA567, 0xCA72, 0xA568, 0xCA73, 0xA569,\n\t0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, 0xA56C, 0xCA77, 0xA56D,\t0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, 0xCA7B, 0xA571,\n\t0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, 0xA574,\t0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578,\n\t0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581,\t0xCA88, 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585,\n\t0xCA8C, 0xA586, 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589,\t0xCA90, 0xA58A, 0xCA91, 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D,\n\t0xCA94, 0xA58E, 0xCA95, 0xA58F, 0xCA96, 0xA590, 0xCA97, 0xA591,\t0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, 0xA593, 0xCA9B, 0xA594,\n\t0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, 0xCA9F, 0xA598,\t0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, 0xA59C,\n\t0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0,\t0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644,\n\t0xCAAC, 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648,\t0xCAB0, 0xA649, 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C,\n\t0xCAB4, 0xA64D, 0xCAB5, 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650,\t0xCAB8, 0xA651, 0xCAB9, 0xA652, 0xCABA, 0xA653, 0xCABB, 0xA654,\n\t0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, 0xA655, 0xCABF, 0xA656,\t0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, 0xCAC3, 0xA659,\n\t0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, 0xA662,\t0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666,\n\t0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF,\t0xCAD0, 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1,\n\t0xCAD4, 0xA66A, 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D,\t0xCAD8, 0xC2D2, 0xCAD9, 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F,\n\t0xCADC, 0xA670, 0xCADD, 0xA671, 0xCADE, 0xA672, 0xCADF, 0xA673,\t0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, 0xA675, 0xCAE3, 0xA676,\n\t0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, 0xCAE7, 0xA67A,\t0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, 0xA684,\n\t0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687,\t0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B,\n\t0xCAF4, 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E,\t0xCAF8, 0xA68F, 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692,\n\t0xCAFC, 0xA693, 0xCAFD, 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696,\t0xCB00, 0xA697, 0xCB01, 0xA698, 0xCB02, 0xA699, 0xCB03, 0xA69A,\n\t0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, 0xA69D, 0xCB07, 0xA69E,\t0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, 0xCB0B, 0xA741,\n\t0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, 0xA745,\t0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748,\n\t0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B,\t0xCB18, 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E,\n\t0xCB1C, 0xA74F, 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752,\t0xCB20, 0xC2DB, 0xCB21, 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754,\n\t0xCB24, 0xA755, 0xCB25, 0xA756, 0xCB26, 0xA757, 0xCB27, 0xA758,\t0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, 0xA761, 0xCB2B, 0xA762,\n\t0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, 0xCB2F, 0xA766,\t0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, 0xA76A,\n\t0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E,\t0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772,\n\t0xCB3C, 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776,\t0xCB40, 0xA777, 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779,\n\t0xCB44, 0xA77A, 0xCB45, 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783,\t0xCB48, 0xC2DE, 0xCB49, 0xC2DF, 0xCB4A, 0xA784, 0xCB4B, 0xA785,\n\t0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, 0xA787, 0xCB4F, 0xA788,\t0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, 0xCB53, 0xA78B,\n\t0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, 0xA78F,\t0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791,\n\t0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794,\t0xCB60, 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798,\n\t0xCB64, 0xC2E5, 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B,\t0xCB68, 0xA79C, 0xCB69, 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F,\n\t0xCB6C, 0xA7A0, 0xCB6D, 0xA841, 0xCB6E, 0xA842, 0xCB6F, 0xA843,\t0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, 0xA846, 0xCB73, 0xA847,\n\t0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, 0xCB77, 0xA84B,\t0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, 0xA84D,\n\t0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851,\t0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855,\n\t0xCB84, 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859,\t0xCB88, 0xA85A, 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863,\n\t0xCB8C, 0xA864, 0xCB8D, 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867,\t0xCB90, 0xA868, 0xCB91, 0xA869, 0xCB92, 0xA86A, 0xCB93, 0xA86B,\n\t0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, 0xA86E, 0xCB97, 0xA86F,\t0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, 0xCB9B, 0xA873,\n\t0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, 0xA876,\t0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A,\n\t0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884,\t0xCBA8, 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888,\n\t0xCBAC, 0xA889, 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C,\t0xCBB0, 0xA88D, 0xCBB1, 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890,\n\t0xCBB4, 0xA891, 0xCBB5, 0xA892, 0xCBB6, 0xA893, 0xCBB7, 0xA894,\t0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, 0xA896, 0xCBBB, 0xA897,\n\t0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, 0xCBBF, 0xA89B,\t0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, 0xA89F,\n\t0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943,\t0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947,\n\t0xCBCC, 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B,\t0xCBD0, 0xA94C, 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F,\n\t0xCBD4, 0xC2EA, 0xCBD5, 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952,\t0xCBD8, 0xA953, 0xCBD9, 0xA954, 0xCBDA, 0xA955, 0xCBDB, 0xA956,\n\t0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, 0xA959, 0xCBDF, 0xA95A,\t0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, 0xCBE3, 0xA964,\n\t0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, 0xC2EC,\t0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969,\n\t0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D,\t0xCBF0, 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971,\n\t0xCBF4, 0xA972, 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975,\t0xCBF8, 0xA976, 0xCBF9, 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979,\n\t0xCBFC, 0xA97A, 0xCBFD, 0xA981, 0xCBFE, 0xA982, 0xCBFF, 0xA983,\t0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, 0xA986, 0xCC03, 0xA987,\n\t0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, 0xCC07, 0xA98B,\t0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, 0xA98F,\n\t0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991,\t0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994,\n\t0xCC14, 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997,\t0xCC18, 0xA998, 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B,\n\t0xCC1C, 0xC2F2, 0xCC1D, 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D,\t0xCC20, 0xA99E, 0xCC21, 0xC2F4, 0xCC22, 0xC2F5, 0xCC23, 0xA99F,\n\t0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, 0xAA42, 0xCC27, 0xC2F6,\t0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, 0xCC2B, 0xAA44,\n\t0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, 0xAA46,\t0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49,\n\t0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D,\t0xCC38, 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE,\n\t0xCC3C, 0xC3A1, 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F,\t0xCC40, 0xAA50, 0xCC41, 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53,\n\t0xCC44, 0xC3A4, 0xCC45, 0xC3A5, 0xCC46, 0xAA54, 0xCC47, 0xAA55,\t0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, 0xAA57, 0xCC4B, 0xAA58,\n\t0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, 0xCC4F, 0xAA61,\t0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, 0xAA65,\n\t0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA,\t0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68,\n\t0xCC5C, 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C,\t0xCC60, 0xC3AD, 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F,\n\t0xCC64, 0xC3AE, 0xCC65, 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71,\t0xCC68, 0xC3B0, 0xCC69, 0xAA72, 0xCC6A, 0xAA73, 0xCC6B, 0xAA74,\n\t0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, 0xAA77, 0xCC6F, 0xAA78,\t0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, 0xCC73, 0xAA81,\n\t0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, 0xAA84,\t0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88,\n\t0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C,\t0xCC80, 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90,\n\t0xCC84, 0xAA91, 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94,\t0xCC88, 0xAA95, 0xCC89, 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98,\n\t0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C,\t0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, 0xAA9F, 0xCC93, 0xAAA0,\n\t0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, 0xCC97, 0xAB44,\t0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, 0xAB46,\n\t0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49,\t0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C,\n\t0xCCA4, 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50,\t0xCCA8, 0xC3B7, 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9,\n\t0xCCAC, 0xC3BA, 0xCCAD, 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53,\t0xCCB0, 0xAB54, 0xCCB1, 0xAB55, 0xCCB2, 0xAB56, 0xCCB3, 0xAB57,\n\t0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, 0xAB58, 0xCCB7, 0xAB59,\t0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, 0xCCBB, 0xAB62,\n\t0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, 0xAB65,\t0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69,\n\t0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2,\t0xCCC8, 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D,\n\t0xCCCC, 0xAB6E, 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71,\t0xCCD0, 0xC3C4, 0xCCD1, 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74,\n\t0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, 0xCCD6, 0xAB76, 0xCCD7, 0xAB77,\t0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, 0xAB7A, 0xCCDB, 0xAB81,\n\t0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, 0xCCDF, 0xAB85,\t0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, 0xAB89,\n\t0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C,\t0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90,\n\t0xCCEC, 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93,\t0xCCF0, 0xC3C8, 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96,\n\t0xCCF4, 0xAB97, 0xCCF5, 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A,\t0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E,\n\t0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, 0xAC41, 0xCCFF, 0xAC42,\t0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, 0xCD03, 0xAC45,\n\t0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, 0xAC49,\t0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B,\n\t0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E,\t0xCD10, 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51,\n\t0xCD14, 0xAC52, 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55,\t0xCD18, 0xC3CE, 0xCD19, 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0,\n\t0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, 0xCD1E, 0xAC58, 0xCD1F, 0xAC59,\t0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, 0xAC62, 0xCD23, 0xAC63,\n\t0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, 0xCD27, 0xAC66,\t0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, 0xAC69,\n\t0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C,\t0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70,\n\t0xCD34, 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74,\t0xCD38, 0xAC75, 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77,\n\t0xCD3C, 0xAC78, 0xCD3D, 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81,\t0xCD40, 0xAC82, 0xCD41, 0xAC83, 0xCD42, 0xAC84, 0xCD43, 0xAC85,\n\t0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, 0xAC88, 0xCD47, 0xAC89,\t0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, 0xCD4B, 0xAC8D,\n\t0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, 0xAC91,\t0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95,\n\t0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99,\t0xCD58, 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D,\n\t0xCD5C, 0xC3D6, 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0,\t0xCD60, 0xC3D7, 0xCD61, 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43,\n\t0xCD64, 0xC3D8, 0xCD65, 0xAD44, 0xCD66, 0xAD45, 0xCD67, 0xAD46,\t0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, 0xAD49, 0xCD6B, 0xAD4A,\n\t0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, 0xCD6F, 0xC3DB,\t0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, 0xAD4E,\n\t0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52,\t0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55,\n\t0xCD7C, 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59,\t0xCD80, 0xAD5A, 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63,\n\t0xCD84, 0xAD64, 0xCD85, 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67,\t0xCD88, 0xC3DE, 0xCD89, 0xAD68, 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A,\n\t0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, 0xAD6D, 0xCD8F, 0xAD6E,\t0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, 0xCD93, 0xAD72,\n\t0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, 0xAD74,\t0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77,\n\t0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A,\t0xCDA0, 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84,\n\t0xCDA4, 0xC3E3, 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5,\t0xCDA8, 0xAD86, 0xCDA9, 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88,\n\t0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C,\t0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, 0xAD8E, 0xCDB3, 0xAD8F,\n\t0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, 0xCDB7, 0xAD93,\t0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, 0xAD97,\n\t0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B,\t0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F,\n\t0xCDC4, 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42,\t0xCDC8, 0xAE43, 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46,\n\t0xCDCC, 0xC3E9, 0xCDCD, 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49,\t0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C,\n\t0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, 0xAE4F, 0xCDD7, 0xAE50,\t0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, 0xCDDB, 0xAE54,\n\t0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, 0xAE58,\t0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62,\n\t0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66,\t0xCDE8, 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69,\n\t0xCDEC, 0xC3EC, 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C,\t0xCDF0, 0xC3ED, 0xCDF1, 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F,\n\t0xCDF4, 0xAE70, 0xCDF5, 0xAE71, 0xCDF6, 0xAE72, 0xCDF7, 0xAE73,\t0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, 0xAE74, 0xCDFB, 0xC3F0,\n\t0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, 0xCDFF, 0xAE77,\t0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, 0xAE81,\n\t0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84,\t0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87,\n\t0xCE0C, 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A,\t0xCE10, 0xAE8B, 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E,\n\t0xCE14, 0xC3F5, 0xCE15, 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91,\t0xCE18, 0xAE92, 0xCE19, 0xC3F6, 0xCE1A, 0xAE93, 0xCE1B, 0xAE94,\n\t0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, 0xAE97, 0xCE1F, 0xAE98,\t0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, 0xCE23, 0xAE9A,\n\t0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, 0xAE9D,\t0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0,\n\t0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44,\t0xCE30, 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD,\n\t0xCE34, 0xAF46, 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48,\t0xCE38, 0xAF49, 0xCE39, 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C,\n\t0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50,\t0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, 0xAF53, 0xCE43, 0xAF54,\n\t0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, 0xCE47, 0xAF58,\t0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, 0xAF62,\n\t0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66,\t0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A,\n\t0xCE54, 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E,\t0xCE58, 0xC4A1, 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70,\n\t0xCE5C, 0xC4A3, 0xCE5D, 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4,\t0xCE60, 0xC4A5, 0xCE61, 0xC4A6, 0xCE62, 0xAF73, 0xCE63, 0xAF74,\n\t0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, 0xAF77, 0xCE67, 0xAF78,\t0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, 0xCE6B, 0xC4A9,\n\t0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, 0xAF82,\t0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86,\n\t0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88,\t0xCE78, 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B,\n\t0xCE7C, 0xC4AE, 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E,\t0xCE80, 0xAF8F, 0xCE81, 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92,\n\t0xCE84, 0xC4AF, 0xCE85, 0xC4B0, 0xCE86, 0xAF93, 0xCE87, 0xC4B1,\t0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, 0xAF95, 0xCE8B, 0xAF96,\n\t0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, 0xCE8F, 0xAF9A,\t0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, 0xAF9C,\n\t0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F,\t0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042,\n\t0xCE9C, 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046,\t0xCEA0, 0xC4B7, 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9,\n\t0xCEA4, 0xC4BA, 0xCEA5, 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049,\t0xCEA8, 0xB04A, 0xCEA9, 0xB04B, 0xCEAA, 0xB04C, 0xCEAB, 0xB04D,\n\t0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, 0xB04E, 0xCEAF, 0xB04F,\t0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, 0xCEB3, 0xB053,\n\t0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, 0xB057,\t0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061,\n\t0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065,\t0xCEC0, 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068,\n\t0xCEC4, 0xB069, 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C,\t0xCEC8, 0xB06D, 0xCEC9, 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070,\n\t0xCECC, 0xB071, 0xCECD, 0xB072, 0xCECE, 0xB073, 0xCECF, 0xB074,\t0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, 0xB077, 0xCED3, 0xB078,\n\t0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, 0xCED7, 0xB082,\t0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, 0xB086,\n\t0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A,\t0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E,\n\t0xCEE4, 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090,\t0xCEE8, 0xC4C1, 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2,\n\t0xCEEC, 0xC4C3, 0xCEED, 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095,\t0xCEF0, 0xB096, 0xCEF1, 0xB097, 0xCEF2, 0xB098, 0xCEF3, 0xB099,\n\t0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, 0xB09A, 0xCEF7, 0xC4C6,\t0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, 0xCEFB, 0xB09C,\n\t0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, 0xB0A0,\t0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142,\n\t0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145,\t0xCF08, 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148,\n\t0xCF0C, 0xB149, 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C,\t0xCF10, 0xC4CD, 0xCF11, 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF,\n\t0xCF14, 0xB14E, 0xCF15, 0xC4D0, 0xCF16, 0xB14F, 0xCF17, 0xB150,\t0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, 0xB153, 0xCF1B, 0xB154,\n\t0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, 0xCF1F, 0xB157,\t0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, 0xB15A,\n\t0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163,\t0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167,\n\t0xCF2C, 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6,\t0xCF30, 0xC4D7, 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A,\n\t0xCF34, 0xB16B, 0xCF35, 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E,\t0xCF38, 0xC4D9, 0xCF39, 0xB16F, 0xCF3A, 0xB170, 0xCF3B, 0xB171,\n\t0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, 0xB174, 0xCF3F, 0xB175,\t0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, 0xCF43, 0xB179,\n\t0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, 0xB183,\t0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187,\n\t0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B,\t0xCF50, 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F,\n\t0xCF54, 0xC4DA, 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191,\t0xCF58, 0xC4DC, 0xCF59, 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194,\n\t0xCF5C, 0xC4DD, 0xCF5D, 0xB195, 0xCF5E, 0xB196, 0xCF5F, 0xB197,\t0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, 0xB19A, 0xCF63, 0xB19B,\n\t0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, 0xCF67, 0xC4E0,\t0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, 0xB19F,\n\t0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243,\t0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245,\n\t0xCF74, 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248,\t0xCF78, 0xC4E5, 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B,\n\t0xCF7C, 0xB24C, 0xCF7D, 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F,\t0xCF80, 0xC4E6, 0xCF81, 0xB250, 0xCF82, 0xB251, 0xCF83, 0xB252,\n\t0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, 0xB254, 0xCF87, 0xB255,\t0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, 0xCF8B, 0xB259,\n\t0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, 0xB262,\t0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266,\n\t0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A,\t0xCF98, 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E,\n\t0xCF9C, 0xB26F, 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272,\t0xCFA0, 0xB273, 0xCFA1, 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275,\n\t0xCFA4, 0xB276, 0xCFA5, 0xB277, 0xCFA6, 0xB278, 0xCFA7, 0xB279,\t0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, 0xB281, 0xCFAB, 0xB282,\n\t0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, 0xCFAF, 0xB286,\t0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, 0xB289,\n\t0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D,\t0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291,\n\t0xCFBC, 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295,\t0xCFC0, 0xB296, 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299,\n\t0xCFC4, 0xC4EC, 0xCFC5, 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C,\t0xCFC8, 0xB29D, 0xCFC9, 0xB29E, 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0,\n\t0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, 0xB343, 0xCFCF, 0xB344,\t0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, 0xCFD3, 0xB348,\n\t0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, 0xB34C,\t0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350,\n\t0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354,\t0xCFE0, 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356,\n\t0xCFE4, 0xC4EF, 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359,\t0xCFE8, 0xC4F0, 0xCFE9, 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362,\n\t0xCFEC, 0xB363, 0xCFED, 0xB364, 0xCFEE, 0xB365, 0xCFEF, 0xB366,\t0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, 0xB367, 0xCFF3, 0xC4F3,\n\t0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, 0xCFF7, 0xB36A,\t0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, 0xB36E,\n\t0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371,\t0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374,\n\t0xD004, 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377,\t0xD008, 0xB378, 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381,\n\t0xD00C, 0xB382, 0xD00D, 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385,\t0xD010, 0xB386, 0xD011, 0xC4F8, 0xD012, 0xB387, 0xD013, 0xB388,\n\t0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, 0xB38B, 0xD017, 0xB38C,\t0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, 0xD01B, 0xB38F,\n\t0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, 0xB393,\t0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397,\n\t0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B,\t0xD028, 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F,\n\t0xD02C, 0xB3A0, 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442,\t0xD030, 0xB443, 0xD031, 0xB444, 0xD032, 0xB445, 0xD033, 0xB446,\n\t0xD034, 0xC4FB, 0xD035, 0xC4FC, 0xD036, 0xB447, 0xD037, 0xB448,\t0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, 0xB44A, 0xD03B, 0xB44B,\n\t0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, 0xD03F, 0xB44E,\t0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, 0xB452,\n\t0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3,\t0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456,\n\t0xD04C, 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A,\t0xD050, 0xC5A5, 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463,\n\t0xD054, 0xC5A6, 0xD055, 0xB464, 0xD056, 0xB465, 0xD057, 0xB466,\t0xD058, 0xC5A7, 0xD059, 0xB467, 0xD05A, 0xB468, 0xD05B, 0xB469,\n\t0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, 0xB46C, 0xD05F, 0xB46D,\t0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, 0xD063, 0xB470,\n\t0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, 0xB474,\t0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478,\n\t0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A,\t0xD070, 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483,\n\t0xD074, 0xC5AC, 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486,\t0xD078, 0xB487, 0xD079, 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A,\n\t0xD07C, 0xC5AD, 0xD07D, 0xC5AE, 0xD07E, 0xB48B, 0xD07F, 0xB48C,\t0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, 0xB48E, 0xD083, 0xB48F,\n\t0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, 0xD087, 0xB493,\t0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, 0xB497,\n\t0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B,\t0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F,\n\t0xD094, 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543,\t0xD098, 0xB544, 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547,\n\t0xD09C, 0xB548, 0xD09D, 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B,\t0xD0A0, 0xB54C, 0xD0A1, 0xB54D, 0xD0A2, 0xB54E, 0xD0A3, 0xB54F,\n\t0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, 0xB550, 0xD0A7, 0xB551,\t0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, 0xD0AB, 0xB554,\n\t0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, 0xB557,\t0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561,\n\t0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6,\t0xD0B8, 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565,\n\t0xD0BC, 0xB566, 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569,\t0xD0C0, 0xC5B8, 0xD0C1, 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B,\n\t0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, 0xD0C6, 0xB56D, 0xD0C7, 0xB56E,\t0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, 0xB56F, 0xD0CB, 0xB570,\n\t0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, 0xD0CF, 0xB574,\t0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, 0xC5BF,\n\t0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577,\t0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581,\n\t0xD0DC, 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583,\t0xD0E0, 0xC5C4, 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586,\n\t0xD0E4, 0xC5C5, 0xD0E5, 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589,\t0xD0E8, 0xB58A, 0xD0E9, 0xB58B, 0xD0EA, 0xB58C, 0xD0EB, 0xB58D,\n\t0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, 0xB58E, 0xD0EF, 0xC5C8,\t0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, 0xD0F3, 0xB590,\n\t0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, 0xB594,\t0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597,\n\t0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B,\t0xD100, 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F,\n\t0xD104, 0xB5A0, 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643,\t0xD108, 0xB644, 0xD109, 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647,\n\t0xD10C, 0xB648, 0xD10D, 0xC5CC, 0xD10E, 0xB649, 0xD10F, 0xB64A,\t0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, 0xB64D, 0xD113, 0xB64E,\n\t0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, 0xD117, 0xB652,\t0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, 0xB656,\n\t0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A,\t0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664,\n\t0xD124, 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668,\t0xD128, 0xB669, 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C,\n\t0xD12C, 0xB66D, 0xD12D, 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670,\t0xD130, 0xC5CD, 0xD131, 0xC5CE, 0xD132, 0xB671, 0xD133, 0xB672,\n\t0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, 0xB674, 0xD137, 0xB675,\t0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, 0xD13B, 0xB677,\n\t0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, 0xB681,\t0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4,\n\t0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684,\t0xD148, 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688,\n\t0xD14C, 0xC5D7, 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A,\t0xD150, 0xC5D9, 0xD151, 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D,\n\t0xD154, 0xC5DA, 0xD155, 0xB68E, 0xD156, 0xB68F, 0xD157, 0xB690,\t0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, 0xB693, 0xD15B, 0xB694,\n\t0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, 0xD15F, 0xC5DD,\t0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, 0xB698,\n\t0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C,\t0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F,\n\t0xD16C, 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742,\t0xD170, 0xB743, 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746,\n\t0xD174, 0xB747, 0xD175, 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A,\t0xD178, 0xB74B, 0xD179, 0xB74C, 0xD17A, 0xB74D, 0xD17B, 0xB74E,\n\t0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, 0xB750, 0xD17F, 0xB751,\t0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, 0xD183, 0xB755,\n\t0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, 0xB758,\t0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761,\n\t0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765,\t0xD190, 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769,\n\t0xD194, 0xB76A, 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D,\t0xD198, 0xB76E, 0xD199, 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771,\n\t0xD19C, 0xB772, 0xD19D, 0xB773, 0xD19E, 0xB774, 0xD19F, 0xB775,\t0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, 0xB776, 0xD1A3, 0xB777,\n\t0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, 0xD1A7, 0xB77A,\t0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, 0xB783,\n\t0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787,\t0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA,\n\t0xD1B4, 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B,\t0xD1B8, 0xB78C, 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E,\n\t0xD1BC, 0xC5ED, 0xD1BD, 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791,\t0xD1C0, 0xC5EE, 0xD1C1, 0xB792, 0xD1C2, 0xB793, 0xD1C3, 0xB794,\n\t0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, 0xB797, 0xD1C7, 0xB798,\t0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, 0xD1CB, 0xB79C,\n\t0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, 0xB7A0,\t0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844,\n\t0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848,\t0xD1D8, 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B,\n\t0xD1DC, 0xB84C, 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F,\t0xD1E0, 0xB850, 0xD1E1, 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853,\n\t0xD1E4, 0xB854, 0xD1E5, 0xB855, 0xD1E6, 0xB856, 0xD1E7, 0xB857,\t0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, 0xB85A, 0xD1EB, 0xB861,\n\t0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, 0xD1EF, 0xB865,\t0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, 0xB869,\n\t0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C,\t0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F,\n\t0xD1FC, 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873,\t0xD200, 0xB874, 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877,\n\t0xD204, 0xB878, 0xD205, 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2,\t0xD208, 0xB881, 0xD209, 0xC5F3, 0xD20A, 0xB882, 0xD20B, 0xB883,\n\t0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, 0xB886, 0xD20F, 0xB887,\t0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, 0xD213, 0xB88A,\n\t0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, 0xB88E,\t0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892,\n\t0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896,\t0xD220, 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A,\n\t0xD224, 0xB89B, 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E,\t0xD228, 0xB89F, 0xD229, 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942,\n\t0xD22C, 0xC5F5, 0xD22D, 0xC5F6, 0xD22E, 0xB943, 0xD22F, 0xB944,\t0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, 0xB946, 0xD233, 0xB947,\n\t0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, 0xD237, 0xB94A,\t0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, 0xB94E,\n\t0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB,\t0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952,\n\t0xD244, 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956,\t0xD248, 0xC5FD, 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959,\n\t0xD24C, 0xB95A, 0xD24D, 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963,\t0xD250, 0xB964, 0xD251, 0xB965, 0xD252, 0xB966, 0xD253, 0xB967,\n\t0xD254, 0xB968, 0xD255, 0xB969, 0xD256, 0xB96A, 0xD257, 0xB96B,\t0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, 0xD25B, 0xB96F,\n\t0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, 0xB972,\t0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976,\n\t0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979,\t0xD268, 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983,\n\t0xD26C, 0xB984, 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987,\t0xD270, 0xB988, 0xD271, 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B,\n\t0xD274, 0xB98C, 0xD275, 0xB98D, 0xD276, 0xB98E, 0xD277, 0xB98F,\t0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, 0xB992, 0xD27B, 0xB993,\n\t0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, 0xD27F, 0xB997,\t0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, 0xB999,\n\t0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C,\t0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F,\n\t0xD28C, 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43,\t0xD290, 0xC6A6, 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45,\n\t0xD294, 0xBA46, 0xD295, 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48,\t0xD298, 0xBA49, 0xD299, 0xBA4A, 0xD29A, 0xBA4B, 0xD29B, 0xBA4C,\n\t0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, 0xBA4E, 0xD29F, 0xBA4F,\t0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, 0xD2A3, 0xBA52,\n\t0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, 0xBA55,\t0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59,\n\t0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62,\t0xD2B0, 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65,\n\t0xD2B4, 0xBA66, 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69,\t0xD2B8, 0xC6AE, 0xD2B9, 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B,\n\t0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1,\t0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, 0xC6B3, 0xD2C3, 0xBA6F,\n\t0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, 0xD2C7, 0xBA73,\t0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, 0xC6B6,\n\t0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78,\t0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82,\n\t0xD2D4, 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85,\t0xD2D8, 0xC6B8, 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88,\n\t0xD2DC, 0xC6B9, 0xD2DD, 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B,\t0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F,\n\t0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, 0xBA90, 0xD2E7, 0xBA91,\t0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, 0xD2EB, 0xBA95,\n\t0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, 0xBA99,\t0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B,\n\t0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E,\t0xD2F8, 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41,\n\t0xD2FC, 0xBB42, 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45,\t0xD300, 0xC6C0, 0xD301, 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2,\n\t0xD304, 0xBB47, 0xD305, 0xC6C3, 0xD306, 0xBB48, 0xD307, 0xBB49,\t0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, 0xBB4C, 0xD30B, 0xBB4D,\n\t0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, 0xD30F, 0xBB4E,\t0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, 0xBB51,\n\t0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53,\t0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57,\n\t0xD31C, 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC,\t0xD320, 0xC6CD, 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A,\n\t0xD324, 0xBB61, 0xD325, 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63,\t0xD328, 0xC6D0, 0xD329, 0xC6D1, 0xD32A, 0xBB64, 0xD32B, 0xBB65,\n\t0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, 0xBB67, 0xD32F, 0xBB68,\t0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, 0xD333, 0xBB6B,\n\t0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, 0xBB6F,\t0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6,\n\t0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72,\t0xD340, 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76,\n\t0xD344, 0xC6D9, 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78,\t0xD348, 0xBB79, 0xD349, 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82,\n\t0xD34C, 0xBB83, 0xD34D, 0xBB84, 0xD34E, 0xBB85, 0xD34F, 0xBB86,\t0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, 0xBB89, 0xD353, 0xBB8A,\n\t0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, 0xD357, 0xBB8E,\t0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, 0xBB92,\n\t0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96,\t0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A,\n\t0xD364, 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E,\t0xD368, 0xBB9F, 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42,\n\t0xD36C, 0xBC43, 0xD36D, 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46,\t0xD370, 0xBC47, 0xD371, 0xBC48, 0xD372, 0xBC49, 0xD373, 0xBC4A,\n\t0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, 0xBC4D, 0xD377, 0xBC4E,\t0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, 0xD37B, 0xBC52,\n\t0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, 0xBC54,\t0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57,\n\t0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A,\t0xD388, 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64,\n\t0xD38C, 0xC6DF, 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1,\t0xD390, 0xC6E2, 0xD391, 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67,\n\t0xD394, 0xBC68, 0xD395, 0xBC69, 0xD396, 0xBC6A, 0xD397, 0xBC6B,\t0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, 0xBC6C, 0xD39B, 0xBC6D,\n\t0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, 0xD39F, 0xBC70,\t0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, 0xBC73,\n\t0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77,\t0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA,\n\t0xD3AC, 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81,\t0xD3B0, 0xBC82, 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85,\n\t0xD3B4, 0xC6EC, 0xD3B5, 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88,\t0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B,\n\t0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, 0xBC8D, 0xD3BF, 0xBC8E,\t0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, 0xD3C3, 0xBC92,\n\t0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, 0xBC94,\t0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96,\n\t0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A,\t0xD3D0, 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D,\n\t0xD3D4, 0xBC9E, 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41,\t0xD3D8, 0xC6F4, 0xD3D9, 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44,\n\t0xD3DC, 0xBD45, 0xD3DD, 0xBD46, 0xD3DE, 0xBD47, 0xD3DF, 0xBD48,\t0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, 0xBD4A, 0xD3E3, 0xC6F6,\n\t0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, 0xD3E7, 0xBD4E,\t0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, 0xBD52,\n\t0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54,\t0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57,\n\t0xD3F4, 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A,\t0xD3F8, 0xBD61, 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64,\n\t0xD3FC, 0xC6FB, 0xD3FD, 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD,\t0xD400, 0xBD66, 0xD401, 0xC6FE, 0xD402, 0xBD67, 0xD403, 0xBD68,\n\t0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, 0xBD6B, 0xD407, 0xBD6C,\t0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, 0xD40B, 0xBD6F,\n\t0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, 0xBD73,\t0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77,\n\t0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81,\t0xD418, 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85,\n\t0xD41C, 0xBD86, 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88,\t0xD420, 0xBD89, 0xD421, 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C,\n\t0xD424, 0xBD8D, 0xD425, 0xBD8E, 0xD426, 0xBD8F, 0xD427, 0xBD90,\t0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, 0xBD93, 0xD42B, 0xBD94,\n\t0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, 0xD42F, 0xBD98,\t0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, 0xBD9C,\n\t0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0,\t0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44,\n\t0xD43C, 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48,\t0xD440, 0xC7A3, 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B,\n\t0xD444, 0xC7A4, 0xD445, 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E,\t0xD448, 0xBE4F, 0xD449, 0xBE50, 0xD44A, 0xBE51, 0xD44B, 0xBE52,\n\t0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, 0xBE55, 0xD44F, 0xBE56,\t0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, 0xD453, 0xBE5A,\n\t0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, 0xBE64,\t0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68,\n\t0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B,\t0xD460, 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E,\n\t0xD464, 0xC7A7, 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71,\t0xD468, 0xBE72, 0xD469, 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75,\n\t0xD46C, 0xBE76, 0xD46D, 0xC7A8, 0xD46E, 0xBE77, 0xD46F, 0xC7A9,\t0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, 0xBE7A, 0xD473, 0xBE81,\n\t0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, 0xD477, 0xBE85,\t0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, 0xBE87,\n\t0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD,\t0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B,\n\t0xD484, 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F,\t0xD488, 0xC7B0, 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2,\n\t0xD48C, 0xBE91, 0xD48D, 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93,\t0xD490, 0xBE94, 0xD491, 0xBE95, 0xD492, 0xBE96, 0xD493, 0xBE97,\n\t0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, 0xBE99, 0xD497, 0xBE9A,\t0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, 0xD49B, 0xBE9E,\n\t0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, 0xBF42,\t0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46,\n\t0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A,\t0xD4A8, 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D,\n\t0xD4AC, 0xBF4E, 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51,\t0xD4B0, 0xBF52, 0xD4B1, 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55,\n\t0xD4B4, 0xBF56, 0xD4B5, 0xBF57, 0xD4B6, 0xBF58, 0xD4B7, 0xBF59,\t0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, 0xBF62, 0xD4BB, 0xBF63,\n\t0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, 0xD4BF, 0xBF67,\t0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, 0xBF6B,\n\t0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F,\t0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73,\n\t0xD4CC, 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76,\t0xD4D0, 0xC7B7, 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79,\n\t0xD4D4, 0xC7B8, 0xD4D5, 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82,\t0xD4D8, 0xBF83, 0xD4D9, 0xBF84, 0xD4DA, 0xBF85, 0xD4DB, 0xBF86,\n\t0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, 0xBF88, 0xD4DF, 0xC7BA,\t0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, 0xD4E3, 0xBF8C,\n\t0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, 0xBF90,\t0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93,\n\t0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96,\t0xD4F0, 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99,\n\t0xD4F4, 0xBF9A, 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D,\t0xD4F8, 0xC7BE, 0xD4F9, 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF,\n\t0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, 0xD4FE, 0xC041, 0xD4FF, 0xC042,\t0xD500, 0xC043, 0xD501, 0xC044, 0xD502, 0xC045, 0xD503, 0xC046,\n\t0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, 0xD507, 0xC049,\t0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, 0xC04C,\n\t0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F,\t0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053,\n\t0xD514, 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6,\t0xD518, 0xC055, 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058,\n\t0xD51C, 0xC059, 0xD51D, 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062,\t0xD520, 0xC063, 0xD521, 0xC064, 0xD522, 0xC065, 0xD523, 0xC066,\n\t0xD524, 0xC067, 0xD525, 0xC068, 0xD526, 0xC069, 0xD527, 0xC06A,\t0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, 0xD52B, 0xC06E,\n\t0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, 0xC072,\t0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076,\n\t0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A,\t0xD538, 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084,\n\t0xD53C, 0xC7C7, 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086,\t0xD540, 0xC7C9, 0xD541, 0xC087, 0xD542, 0xC088, 0xD543, 0xC089,\n\t0xD544, 0xC7CA, 0xD545, 0xC08A, 0xD546, 0xC08B, 0xD547, 0xC08C,\t0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, 0xC08F, 0xD54B, 0xC090,\n\t0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, 0xD54F, 0xC7CD,\t0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, 0xC094,\n\t0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098,\t0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A,\n\t0xD55C, 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D,\t0xD560, 0xC7D2, 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0,\n\t0xD564, 0xC141, 0xD565, 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143,\t0xD568, 0xC7D4, 0xD569, 0xC7D5, 0xD56A, 0xC144, 0xD56B, 0xC7D6,\n\t0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, 0xC146, 0xD56F, 0xC147,\t0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, 0xD573, 0xC14B,\n\t0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, 0xC14D,\t0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150,\n\t0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153,\t0xD580, 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157,\n\t0xD584, 0xC7DC, 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE,\t0xD588, 0xC7DF, 0xD589, 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A,\n\t0xD58C, 0xC161, 0xD58D, 0xC162, 0xD58E, 0xC163, 0xD58F, 0xC164,\t0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, 0xC166, 0xD593, 0xC167,\n\t0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, 0xD597, 0xC16B,\t0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, 0xC16F,\n\t0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173,\t0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177,\n\t0xD5A4, 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A,\t0xD5A8, 0xC181, 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184,\n\t0xD5AC, 0xC185, 0xD5AD, 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188,\t0xD5B0, 0xC189, 0xD5B1, 0xC18A, 0xD5B2, 0xC18B, 0xD5B3, 0xC18C,\n\t0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, 0xC18F, 0xD5B7, 0xC190,\t0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, 0xD5BB, 0xC194,\n\t0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, 0xC198,\t0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C,\n\t0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0,\t0xD5C8, 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242,\n\t0xD5CC, 0xC7E5, 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245,\t0xD5D0, 0xC7E6, 0xD5D1, 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247,\n\t0xD5D4, 0xC248, 0xD5D5, 0xC249, 0xD5D6, 0xC24A, 0xD5D7, 0xC24B,\t0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, 0xC24C, 0xD5DB, 0xC7EA,\n\t0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, 0xD5DF, 0xC24F,\t0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, 0xC253,\n\t0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255,\t0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258,\n\t0xD5EC, 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261,\t0xD5F0, 0xC262, 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265,\n\t0xD5F4, 0xC7F0, 0xD5F5, 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2,\t0xD5F8, 0xC267, 0xD5F9, 0xC7F3, 0xD5FA, 0xC268, 0xD5FB, 0xC269,\n\t0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, 0xC26C, 0xD5FF, 0xC26D,\t0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, 0xD603, 0xC26F,\n\t0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, 0xC272,\t0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275,\n\t0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279,\t0xD610, 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA,\n\t0xD614, 0xC7FB, 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282,\t0xD618, 0xC283, 0xD619, 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286,\n\t0xD61C, 0xC7FD, 0xD61D, 0xC287, 0xD61E, 0xC288, 0xD61F, 0xC289,\t0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, 0xC28B, 0xD623, 0xC28C,\n\t0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, 0xD627, 0xC28F,\t0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, 0xC293,\n\t0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296,\t0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A,\n\t0xD634, 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E,\t0xD638, 0xC8A3, 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0,\n\t0xD63C, 0xC8A5, 0xD63D, 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343,\t0xD640, 0xC8A6, 0xD641, 0xC344, 0xD642, 0xC345, 0xD643, 0xC346,\n\t0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, 0xC348, 0xD647, 0xC349,\t0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, 0xD64B, 0xC8AA,\n\t0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, 0xC34D,\t0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350,\n\t0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352,\t0xD658, 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355,\n\t0xD65C, 0xC8B0, 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358,\t0xD660, 0xC359, 0xD661, 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362,\n\t0xD664, 0xC363, 0xD665, 0xC364, 0xD666, 0xC365, 0xD667, 0xC8B1,\t0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, 0xC367, 0xD66B, 0xC368,\n\t0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, 0xD66F, 0xC36C,\t0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, 0xC36E,\n\t0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371,\t0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375,\n\t0xD67C, 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379,\t0xD680, 0xC37A, 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6,\n\t0xD684, 0xC383, 0xD685, 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385,\t0xD688, 0xC386, 0xD689, 0xC387, 0xD68A, 0xC388, 0xD68B, 0xC389,\n\t0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, 0xC38A, 0xD68F, 0xC38B,\t0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, 0xD693, 0xC38E,\n\t0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, 0xC391,\t0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395,\n\t0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD,\t0xD6A0, 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A,\n\t0xD6A4, 0xC39B, 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E,\t0xD6A8, 0xC8BF, 0xD6A9, 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441,\n\t0xD6AC, 0xC8C0, 0xD6AD, 0xC442, 0xD6AE, 0xC443, 0xD6AF, 0xC444,\t0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, 0xC446, 0xD6B3, 0xC447,\n\t0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, 0xD6B7, 0xC44B,\t0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, 0xC8C3,\n\t0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451,\t0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455,\n\t0xD6C4, 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457,\t0xD6C8, 0xC8C6, 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A,\n\t0xD6CC, 0xC8C7, 0xD6CD, 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463,\t0xD6D0, 0xC464, 0xD6D1, 0xC8C8, 0xD6D2, 0xC465, 0xD6D3, 0xC466,\n\t0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, 0xC468, 0xD6D7, 0xC8CA,\t0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, 0xD6DB, 0xC46B,\n\t0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, 0xC46F,\t0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472,\n\t0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475,\t0xD6E8, 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478,\n\t0xD6EC, 0xC479, 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482,\t0xD6F0, 0xC8CF, 0xD6F1, 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485,\n\t0xD6F4, 0xC486, 0xD6F5, 0xC8D0, 0xD6F6, 0xC487, 0xD6F7, 0xC488,\t0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, 0xC48B, 0xD6FB, 0xC48C,\n\t0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, 0xD6FF, 0xC48E,\t0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, 0xC491,\n\t0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494,\t0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498,\n\t0xD70C, 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C,\t0xD710, 0xC49D, 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F,\n\t0xD714, 0xC4A0, 0xD715, 0xC541, 0xD716, 0xC542, 0xD717, 0xC543,\t0xD718, 0xC8D6, 0xD719, 0xC8D7, 0xD71A, 0xC544, 0xD71B, 0xC545,\n\t0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, 0xC547, 0xD71F, 0xC548,\t0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, 0xD723, 0xC54B,\n\t0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, 0xC54F,\t0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC,\n\t0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553,\t0xD730, 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557,\n\t0xD734, 0xC8DE, 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559,\t0xD738, 0xC8E0, 0xD739, 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562,\n\t0xD73C, 0xC8E1, 0xD73D, 0xC563, 0xD73E, 0xC564, 0xD73F, 0xC565,\t0xD740, 0xC566, 0xD741, 0xC567, 0xD742, 0xC568, 0xD743, 0xC569,\n\t0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, 0xD747, 0xC8E3,\t0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, 0xC56E,\n\t0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572,\t0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574,\n\t0xD754, 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9,\t0xD758, 0xC8EA, 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577,\n\t0xD75C, 0xC578, 0xD75D, 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581,\t0xD760, 0xC8EC, 0xD761, 0xC8ED, 0xD762, 0xC582, 0xD763, 0xC8EE,\n\t0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, 0xC584, 0xD767, 0xC585,\t0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, 0xD76B, 0xC588,\n\t0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, 0xC58B,\t0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E,\n\t0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591,\t0xD778, 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595,\n\t0xD77C, 0xC8F4, 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597,\t0xD780, 0xC598, 0xD781, 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A,\n\t0xD784, 0xC59B, 0xD785, 0xC59C, 0xD786, 0xC59D, 0xD787, 0xC59E,\t0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, 0xC59F, 0xD78B, 0xC5A0,\n\t0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, 0xD78F, 0xC643,\t0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, 0xC646,\n\t0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A,\t0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD,\n\t0xD79C, 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E,\t0xD7A0, 0xC64F, 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652,\n\t0xF900, 0xCBD0, 0xF901, 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF,\t0xF904, 0xCDE8, 0xF905, 0xCEAD, 0xF906, 0xCFFB, 0xF907, 0xD0A2,\n\t0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, 0xD0DD, 0xF90B, 0xD1D4,\t0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, 0xF90F, 0xD1DC,\n\t0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, 0xD1E0,\t0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5,\n\t0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA,\t0xF91C, 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0,\n\t0xF920, 0xD1F2, 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC,\t0xF924, 0xD1FD, 0xF925, 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3,\n\t0xF928, 0xD2A7, 0xF929, 0xD2A8, 0xF92A, 0xD2A9, 0xF92B, 0xD2AA,\t0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, 0xD2B2, 0xF92F, 0xD2BE,\n\t0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, 0xF933, 0xD2C6,\t0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, 0xD2CA,\n\t0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF,\t0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3,\n\t0xF940, 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7,\t0xF944, 0xD2D9, 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF,\n\t0xF948, 0xD2E1, 0xF949, 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5,\t0xF94C, 0xD2E6, 0xF94D, 0xD2E7, 0xF94E, 0xD2E8, 0xF94F, 0xD2E9,\n\t0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, 0xD2F0, 0xF953, 0xD2F1,\t0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, 0xF957, 0xD2F5,\n\t0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, 0xD4FC,\t0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8,\n\t0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5,\t0xF964, 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5,\n\t0xF968, 0xDDF4, 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3,\t0xF96C, 0xDFE1, 0xF96D, 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD,\n\t0xF970, 0xE1ED, 0xF971, 0xE3F5, 0xF972, 0xE4A1, 0xF973, 0xE4A9,\t0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, 0xE5B2, 0xF977, 0xE5B9,\n\t0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, 0xF97B, 0xE5CE,\t0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, 0xE5FA,\n\t0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1,\t0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF,\n\t0xF988, 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7,\t0xF98C, 0xE6B8, 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6,\n\t0xF990, 0xE6C7, 0xF991, 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6,\t0xF994, 0xE6D9, 0xF995, 0xE6DC, 0xF996, 0xE6DF, 0xF997, 0xE6E1,\n\t0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, 0xE6E6, 0xF99B, 0xE6E8,\t0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, 0xF99F, 0xE6EF,\n\t0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, 0xE6F6,\t0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6,\n\t0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD,\t0xF9AC, 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6,\n\t0xF9B0, 0xE7C7, 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF,\t0xF9B4, 0xE7D0, 0xF9B5, 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4,\n\t0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8,\t0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, 0xE8F7, 0xF9BF, 0xE8F9,\n\t0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, 0xF9C3, 0xE9AC,\t0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, 0xEAE5,\n\t0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE,\t0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA,\n\t0xF9D0, 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1,\t0xF9D4, 0xEBC2, 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC,\n\t0xF9D8, 0xEBCF, 0xF9D9, 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2,\t0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, 0xF9DE, 0xECA7, 0xF9DF, 0xECAA,\n\t0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, 0xECB1, 0xF9E3, 0xECB2,\t0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, 0xF9E7, 0xECC0,\n\t0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, 0xECC9,\t0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE,\n\t0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8,\t0xF9F4, 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1,\n\t0xF9F8, 0xEDA2, 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB,\t0xF9FC, 0xF2BD, 0xF9FD, 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7,\n\t0xFA00, 0xF4EE, 0xFA01, 0xF6F4, 0xFA02, 0xF6F6, 0xFA03, 0xF7B8,\t0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, 0xF8DB, 0xFA07, 0xF8F0,\n\t0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, 0xFA0B, 0xFCA9,\t0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA3A4,\n\t0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8,\t0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC,\n\t0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0,\t0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4,\n\t0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8,\t0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC,\n\t0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0,\t0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4,\n\t0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8,\t0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC,\n\t0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0,\t0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4,\n\t0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8,\t0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC,\n\t0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0,\t0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4,\n\t0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8,\t0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC,\n\t0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0,\t0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4,\n\t0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8,\t0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC,\n\t0xFF5D, 0xA3FD, 0xFF5E, 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC,\t0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC,\n\t0, 0\n};\n\nstatic const WCHAR oem2uni949[] = {\t/* Korean --> Unicode pairs */\n\t0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06,\t0x8145, 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E,\n\t0x8149, 0xAC0F, 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F,\t0x814D, 0xAC21, 0x814E, 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25,\n\t0x8151, 0xAC26, 0x8152, 0xAC27, 0x8153, 0xAC28, 0x8154, 0xAC29,\t0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, 0xAC2E, 0x8158, 0xAC32,\n\t0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, 0x8162, 0xAC36,\t0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, 0xAC3D,\n\t0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42,\t0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46,\n\t0x816F, 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A,\t0x8173, 0xAC4C, 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50,\n\t0x8177, 0xAC51, 0x8178, 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55,\t0x8181, 0xAC56, 0x8182, 0xAC57, 0x8183, 0xAC59, 0x8184, 0xAC5A,\n\t0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, 0xAC5E, 0x8188, 0xAC5F,\t0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, 0x818C, 0xAC63,\n\t0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, 0xAC67,\t0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B,\n\t0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F,\t0x8199, 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76,\n\t0x819D, 0xAC79, 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D,\t0x81A1, 0xAC7E, 0x81A2, 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87,\n\t0x81A5, 0xAC88, 0x81A6, 0xAC8D, 0x81A7, 0xAC8E, 0x81A8, 0xAC8F,\t0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, 0xAC93, 0x81AC, 0xAC95,\n\t0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, 0x81B0, 0xAC99,\t0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, 0xACA2,\n\t0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6,\t0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE,\n\t0x81BD, 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4,\t0x81C1, 0xACB5, 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA,\n\t0x81C5, 0xACBE, 0x81C6, 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2,\t0x81C9, 0xACC3, 0x81CA, 0xACC5, 0x81CB, 0xACC6, 0x81CC, 0xACC7,\n\t0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, 0xACCB, 0x81D0, 0xACCD,\t0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, 0x81D4, 0xACD1,\n\t0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, 0xACD6,\t0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB,\n\t0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF,\t0x81E1, 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6,\n\t0x81E5, 0xACE9, 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE,\t0x81E9, 0xACF2, 0x81EA, 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8,\n\t0x81ED, 0xACF9, 0x81EE, 0xACFA, 0x81EF, 0xACFB, 0x81F0, 0xACFE,\t0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, 0xAD02, 0x81F4, 0xAD03,\n\t0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, 0x81F8, 0xAD09,\t0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, 0xAD10,\n\t0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15,\t0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A,\n\t0x8247, 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F,\t0x824B, 0xAD21, 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24,\n\t0x824F, 0xAD25, 0x8250, 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28,\t0x8253, 0xAD2A, 0x8254, 0xAD2B, 0x8255, 0xAD2E, 0x8256, 0xAD2F,\n\t0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, 0xAD32, 0x825A, 0xAD33,\t0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, 0x8264, 0xAD3A,\n\t0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, 0xAD3F,\t0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43,\n\t0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B,\t0x8271, 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F,\n\t0x8275, 0xAD51, 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55,\t0x8279, 0xAD56, 0x827A, 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A,\n\t0x8283, 0xAD5B, 0x8284, 0xAD5C, 0x8285, 0xAD5D, 0x8286, 0xAD5E,\t0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, 0xAD62, 0x828A, 0xAD64,\n\t0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, 0x828E, 0xAD68,\t0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, 0xAD6E,\n\t0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77,\t0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E,\n\t0x829B, 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85,\t0x829F, 0xAD86, 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B,\n\t0x82A3, 0xAD8D, 0x82A4, 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91,\t0x82A7, 0xAD92, 0x82A8, 0xAD93, 0x82A9, 0xAD94, 0x82AA, 0xAD95,\n\t0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, 0xAD98, 0x82AE, 0xAD99,\t0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, 0x82B2, 0xAD9F,\n\t0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, 0xADA3,\t0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8,\n\t0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC,\t0x82BF, 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0,\n\t0x82C3, 0xADB1, 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4,\t0x82C7, 0xADB5, 0x82C8, 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9,\n\t0x82CB, 0xADBA, 0x82CC, 0xADBB, 0x82CD, 0xADBC, 0x82CE, 0xADBD,\t0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, 0xADC2, 0x82D2, 0xADC3,\n\t0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, 0x82D6, 0xADC9,\t0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, 0xADCD,\n\t0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4,\t0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8,\n\t0x82E3, 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD,\t0x82E7, 0xADDE, 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2,\n\t0x82EB, 0xADE3, 0x82EC, 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7,\t0x82EF, 0xADE8, 0x82F0, 0xADE9, 0x82F1, 0xADEA, 0x82F2, 0xADEB,\n\t0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, 0xADEE, 0x82F6, 0xADEF,\t0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, 0x82FA, 0xADF3,\n\t0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, 0xADF7,\t0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE,\n\t0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05,\t0x8349, 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C,\n\t0x834D, 0xAE0E, 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11,\t0x8351, 0xAE12, 0x8352, 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16,\n\t0x8355, 0xAE17, 0x8356, 0xAE18, 0x8357, 0xAE19, 0x8358, 0xAE1A,\t0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, 0xAE1D, 0x8362, 0xAE1E,\n\t0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, 0x8366, 0xAE22,\t0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, 0xAE26,\n\t0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A,\t0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E,\n\t0x8373, 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35,\t0x8377, 0xAE36, 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C,\n\t0x8381, 0xAE3D, 0x8382, 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42,\t0x8385, 0xAE44, 0x8386, 0xAE47, 0x8387, 0xAE48, 0x8388, 0xAE49,\n\t0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, 0xAE51, 0x838C, 0xAE52,\t0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, 0x8390, 0xAE58,\n\t0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, 0xAE5E,\t0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66,\n\t0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D,\t0x839D, 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72,\n\t0x83A1, 0xAE73, 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76,\t0x83A5, 0xAE77, 0x83A6, 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F,\n\t0x83A9, 0xAE80, 0x83AA, 0xAE81, 0x83AB, 0xAE82, 0x83AC, 0xAE83,\t0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, 0xAE88, 0x83B0, 0xAE89,\n\t0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, 0x83B4, 0xAE8E,\t0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, 0xAE92,\n\t0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96,\t0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A,\n\t0x83C1, 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E,\t0x83C5, 0xAE9F, 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2,\n\t0x83C9, 0xAEA3, 0x83CA, 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6,\t0x83CD, 0xAEA7, 0x83CE, 0xAEA8, 0x83CF, 0xAEA9, 0x83D0, 0xAEAA,\n\t0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, 0xAEAD, 0x83D4, 0xAEAE,\t0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, 0x83D8, 0xAEB2,\n\t0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, 0xAEB6,\t0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA,\n\t0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2,\t0x83E5, 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7,\n\t0x83E9, 0xAEC8, 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB,\t0x83ED, 0xAECE, 0x83EE, 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4,\n\t0x83F1, 0xAED5, 0x83F2, 0xAED6, 0x83F3, 0xAED7, 0x83F4, 0xAEDA,\t0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, 0xAEDE, 0x83F8, 0xAEDF,\n\t0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, 0x83FC, 0xAEE3,\t0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, 0xAEE7,\n\t0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE,\t0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2,\n\t0x844B, 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7,\t0x844F, 0xAEF9, 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD,\n\t0x8453, 0xAEFE, 0x8454, 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01,\t0x8457, 0xAF02, 0x8458, 0xAF03, 0x8459, 0xAF04, 0x845A, 0xAF05,\n\t0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, 0xAF0A, 0x8464, 0xAF0B,\t0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, 0x8468, 0xAF11,\n\t0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, 0xAF15,\t0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19,\n\t0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D,\t0x8475, 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21,\n\t0x8479, 0xAF22, 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25,\t0x8483, 0xAF26, 0x8484, 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29,\n\t0x8487, 0xAF2A, 0x8488, 0xAF2B, 0x8489, 0xAF2E, 0x848A, 0xAF2F,\t0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, 0xAF35, 0x848E, 0xAF36,\n\t0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, 0x8492, 0xAF3A,\t0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, 0xAF44,\n\t0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A,\t0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E,\n\t0x849F, 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53,\t0x84A3, 0xAF54, 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57,\n\t0x84A7, 0xAF58, 0x84A8, 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B,\t0x84AB, 0xAF5E, 0x84AC, 0xAF5F, 0x84AD, 0xAF60, 0x84AE, 0xAF61,\n\t0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, 0xAF66, 0x84B2, 0xAF67,\t0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, 0x84B6, 0xAF6B,\n\t0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, 0xAF6F,\t0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73,\n\t0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77,\t0x84C3, 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C,\n\t0x84C7, 0xAF7D, 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81,\t0x84CB, 0xAF82, 0x84CC, 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86,\n\t0x84CF, 0xAF87, 0x84D0, 0xAF89, 0x84D1, 0xAF8A, 0x84D2, 0xAF8B,\t0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, 0xAF8E, 0x84D6, 0xAF8F,\n\t0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, 0x84DA, 0xAF96,\t0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, 0xAF9A,\n\t0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F,\t0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3,\n\t0x84E7, 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7,\t0x84EB, 0xAFA8, 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB,\n\t0x84EF, 0xAFAC, 0x84F0, 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF,\t0x84F3, 0xAFB0, 0x84F4, 0xAFB1, 0x84F5, 0xAFB2, 0x84F6, 0xAFB3,\n\t0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, 0xAFB6, 0x84FA, 0xAFB7,\t0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, 0x84FE, 0xAFBE,\n\t0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, 0xAFC3,\t0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA,\n\t0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1,\t0x854D, 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6,\n\t0x8551, 0xAFD7, 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA,\t0x8555, 0xAFDB, 0x8556, 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF,\n\t0x8559, 0xAFE0, 0x855A, 0xAFE1, 0x8561, 0xAFE2, 0x8562, 0xAFE3,\t0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, 0xAFE6, 0x8566, 0xAFE7,\n\t0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, 0x856A, 0xAFED,\t0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, 0xAFF3,\n\t0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9,\t0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD,\n\t0x8577, 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003,\t0x8581, 0xB005, 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008,\n\t0x8585, 0xB009, 0x8586, 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D,\t0x8589, 0xB00E, 0x858A, 0xB00F, 0x858B, 0xB011, 0x858C, 0xB012,\n\t0x858D, 0xB013, 0x858E, 0xB015, 0x858F, 0xB016, 0x8590, 0xB017,\t0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, 0x8594, 0xB01B,\n\t0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, 0xB021,\t0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025,\n\t0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A,\t0x85A1, 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E,\n\t0x85A5, 0xB02F, 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032,\t0x85A9, 0xB033, 0x85AA, 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036,\n\t0x85AD, 0xB037, 0x85AE, 0xB038, 0x85AF, 0xB039, 0x85B0, 0xB03A,\t0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, 0xB03D, 0x85B4, 0xB03E,\n\t0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, 0x85B8, 0xB042,\t0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, 0xB049,\n\t0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050,\t0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058,\n\t0x85C5, 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E,\t0x85C9, 0xB05F, 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062,\n\t0x85CD, 0xB063, 0x85CE, 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066,\t0x85D1, 0xB067, 0x85D2, 0xB068, 0x85D3, 0xB069, 0x85D4, 0xB06A,\n\t0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, 0xB06D, 0x85D8, 0xB06E,\t0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, 0x85DC, 0xB072,\n\t0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, 0xB076,\t0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A,\n\t0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081,\t0x85E9, 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086,\n\t0x85ED, 0xB087, 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A,\t0x85F1, 0xB08B, 0x85F2, 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092,\n\t0x85F5, 0xB093, 0x85F6, 0xB094, 0x85F7, 0xB095, 0x85F8, 0xB096,\t0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, 0xB09D, 0x85FC, 0xB09E,\n\t0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, 0x8642, 0xB0A6,\t0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, 0xB0B2,\n\t0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA,\t0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF,\n\t0x864F, 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3,\t0x8653, 0xB0C6, 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC,\n\t0x8657, 0xB0CD, 0x8658, 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2,\t0x8661, 0xB0D3, 0x8662, 0xB0D5, 0x8663, 0xB0D6, 0x8664, 0xB0D7,\n\t0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, 0xB0DB, 0x8668, 0xB0DC,\t0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, 0x866C, 0xB0E1,\n\t0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, 0xB0E6,\t0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA,\n\t0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE,\t0x8679, 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2,\n\t0x8683, 0xB0F3, 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6,\t0x8687, 0xB0F7, 0x8688, 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA,\n\t0x868B, 0xB0FB, 0x868C, 0xB0FC, 0x868D, 0xB0FD, 0x868E, 0xB0FE,\t0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, 0xB101, 0x8692, 0xB102,\n\t0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, 0x8696, 0xB106,\t0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, 0xB10E,\n\t0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115,\t0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E,\n\t0x86A3, 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122,\t0x86A7, 0xB126, 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A,\n\t0x86AB, 0xB12B, 0x86AC, 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F,\t0x86AF, 0xB130, 0x86B0, 0xB131, 0x86B1, 0xB132, 0x86B2, 0xB133,\n\t0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, 0xB13B, 0x86B6, 0xB13C,\t0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, 0x86BA, 0xB142,\n\t0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, 0xB147,\t0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C,\n\t0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152,\t0x86C7, 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159,\n\t0x86CB, 0xB15A, 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E,\t0x86CF, 0xB15F, 0x86D0, 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163,\n\t0x86D3, 0xB164, 0x86D4, 0xB165, 0x86D5, 0xB166, 0x86D6, 0xB167,\t0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, 0xB16A, 0x86DA, 0xB16B,\n\t0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, 0x86DE, 0xB16F,\t0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, 0xB173,\n\t0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177,\t0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E,\n\t0x86EB, 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184,\t0x86EF, 0xB185, 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A,\n\t0x86F3, 0xB18C, 0x86F4, 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190,\t0x86F7, 0xB191, 0x86F8, 0xB195, 0x86F9, 0xB196, 0x86FA, 0xB197,\n\t0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, 0xB19B, 0x86FE, 0xB19D,\t0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, 0x8744, 0xB1A1,\n\t0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, 0xB1A5,\t0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA,\n\t0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE,\t0x8751, 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2,\n\t0x8755, 0xB1B3, 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6,\t0x8759, 0xB1B7, 0x875A, 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA,\n\t0x8763, 0xB1BB, 0x8764, 0xB1BC, 0x8765, 0xB1BD, 0x8766, 0xB1BE,\t0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, 0xB1C1, 0x876A, 0xB1C2,\n\t0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, 0x876E, 0xB1C6,\t0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, 0xB1CA,\n\t0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF,\t0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5,\n\t0x8781, 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9,\t0x8785, 0xB1DA, 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0,\n\t0x8789, 0xB1E1, 0x878A, 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4,\t0x878D, 0xB1E5, 0x878E, 0xB1E6, 0x878F, 0xB1E7, 0x8790, 0xB1EA,\n\t0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, 0xB1EE, 0x8794, 0xB1EF,\t0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, 0x8798, 0xB1F4,\n\t0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, 0xB1F8,\t0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF,\n\t0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203,\t0x87A5, 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A,\n\t0x87A9, 0xB20D, 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210,\t0x87AD, 0xB211, 0x87AE, 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216,\n\t0x87B1, 0xB218, 0x87B2, 0xB21A, 0x87B3, 0xB21B, 0x87B4, 0xB21C,\t0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, 0xB21F, 0x87B8, 0xB221,\n\t0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, 0x87BC, 0xB225,\t0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, 0xB229,\n\t0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D,\t0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231,\n\t0x87C9, 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236,\t0x87CD, 0xB237, 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A,\n\t0x87D1, 0xB23B, 0x87D2, 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F,\t0x87D5, 0xB240, 0x87D6, 0xB241, 0x87D7, 0xB242, 0x87D8, 0xB243,\n\t0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, 0xB246, 0x87DC, 0xB247,\t0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, 0x87E0, 0xB24B,\n\t0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, 0xB24F,\t0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253,\n\t0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257,\t0x87ED, 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D,\n\t0x87F1, 0xB25E, 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262,\t0x87F5, 0xB263, 0x87F6, 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266,\n\t0x87F9, 0xB267, 0x87FA, 0xB26A, 0x87FB, 0xB26B, 0x87FC, 0xB26C,\t0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, 0xB26F, 0x8842, 0xB270,\n\t0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, 0x8846, 0xB276,\t0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, 0xB27A,\n\t0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F,\t0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283,\n\t0x8853, 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A,\t0x8857, 0xB28B, 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E,\n\t0x8861, 0xB28F, 0x8862, 0xB292, 0x8863, 0xB293, 0x8864, 0xB295,\t0x8865, 0xB296, 0x8866, 0xB297, 0x8867, 0xB29B, 0x8868, 0xB29C,\n\t0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, 0xB29F, 0x886C, 0xB2A2,\t0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, 0x8870, 0xB2A9,\n\t0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, 0xB2AF,\t0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5,\n\t0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9,\t0x8883, 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD,\n\t0x8887, 0xB2BE, 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1,\t0x888B, 0xB2C2, 0x888C, 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5,\n\t0x888F, 0xB2C6, 0x8890, 0xB2C7, 0x8891, 0xB2CA, 0x8892, 0xB2CB,\t0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, 0xB2CF, 0x8896, 0xB2D1,\n\t0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, 0x889A, 0xB2D6,\t0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, 0xB2DE,\n\t0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3,\t0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0,\n\t0x88A7, 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC,\t0x88AB, 0xB2FD, 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303,\n\t0x88AF, 0xB305, 0x88B0, 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309,\t0x88B3, 0xB30A, 0x88B4, 0xB30B, 0x88B5, 0xB30C, 0x88B6, 0xB30D,\n\t0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, 0xB312, 0x88BA, 0xB316,\t0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, 0x88BE, 0xB31A,\n\t0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, 0xB31F,\t0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323,\n\t0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327,\t0x88CB, 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B,\n\t0x88CF, 0xB32C, 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F,\t0x88D3, 0xB330, 0x88D4, 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333,\n\t0x88D7, 0xB334, 0x88D8, 0xB335, 0x88D9, 0xB336, 0x88DA, 0xB337,\t0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, 0xB33A, 0x88DE, 0xB33B,\n\t0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, 0x88E2, 0xB33F,\t0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, 0xB343,\n\t0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347,\t0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B,\n\t0x88EF, 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F,\t0x88F3, 0xB350, 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353,\n\t0x88F7, 0xB357, 0x88F8, 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D,\t0x88FB, 0xB360, 0x88FC, 0xB361, 0x88FD, 0xB362, 0x88FE, 0xB363,\n\t0x8941, 0xB366, 0x8942, 0xB368, 0x8943, 0xB36A, 0x8944, 0xB36C,\t0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, 0x8948, 0xB373,\n\t0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, 0xB379,\t0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D,\n\t0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386,\t0x8955, 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A,\n\t0x8959, 0xB38B, 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F,\t0x8963, 0xB391, 0x8964, 0xB392, 0x8965, 0xB393, 0x8966, 0xB395,\n\t0x8967, 0xB396, 0x8968, 0xB397, 0x8969, 0xB398, 0x896A, 0xB399,\t0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, 0xB39C, 0x896E, 0xB39D,\n\t0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, 0x8972, 0xB3A3,\t0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, 0xB3A7,\n\t0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD,\t0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1,\n\t0x8985, 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5,\t0x8989, 0xB3B6, 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9,\n\t0x898D, 0xB3BA, 0x898E, 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD,\t0x8991, 0xB3BE, 0x8992, 0xB3BF, 0x8993, 0xB3C0, 0x8994, 0xB3C1,\n\t0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, 0xB3C6, 0x8998, 0xB3C7,\t0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, 0x899C, 0xB3CF,\n\t0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, 0xB3D6,\t0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE,\n\t0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3,\t0x89A9, 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9,\n\t0x89AD, 0xB3EA, 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED,\t0x89B1, 0xB3EE, 0x89B2, 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1,\n\t0x89B5, 0xB3F2, 0x89B6, 0xB3F3, 0x89B7, 0xB3F4, 0x89B8, 0xB3F5,\t0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, 0xB3F8, 0x89BC, 0xB3F9,\n\t0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, 0x89C0, 0xB3FE,\t0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, 0xB402,\n\t0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406,\t0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A,\n\t0x89CD, 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E,\t0x89D1, 0xB40F, 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413,\n\t0x89D5, 0xB414, 0x89D6, 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417,\t0x89D9, 0xB419, 0x89DA, 0xB41A, 0x89DB, 0xB41B, 0x89DC, 0xB41D,\n\t0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, 0xB421, 0x89E0, 0xB422,\t0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, 0x89E4, 0xB426,\n\t0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, 0xB42D,\t0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431,\n\t0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436,\t0x89F1, 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A,\n\t0x89F5, 0xB43B, 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E,\t0x89F9, 0xB43F, 0x89FA, 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442,\n\t0x89FD, 0xB443, 0x89FE, 0xB444, 0x8A41, 0xB445, 0x8A42, 0xB446,\t0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, 0xB449, 0x8A46, 0xB44A,\n\t0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, 0x8A4A, 0xB44E,\t0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, 0xB455,\n\t0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A,\t0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E,\n\t0x8A57, 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466,\t0x8A61, 0xB467, 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A,\n\t0x8A65, 0xB46B, 0x8A66, 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F,\t0x8A69, 0xB470, 0x8A6A, 0xB471, 0x8A6B, 0xB472, 0x8A6C, 0xB473,\n\t0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, 0xB476, 0x8A70, 0xB477,\t0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, 0x8A74, 0xB47B,\n\t0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, 0xB47F,\t0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484,\n\t0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489,\t0x8A87, 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D,\n\t0x8A8B, 0xB48E, 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491,\t0x8A8F, 0xB492, 0x8A90, 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495,\n\t0x8A93, 0xB496, 0x8A94, 0xB497, 0x8A95, 0xB498, 0x8A96, 0xB499,\t0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, 0xB49C, 0x8A9A, 0xB49E,\n\t0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, 0x8A9E, 0xB4A2,\t0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, 0xB4A7,\n\t0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD,\t0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1,\n\t0x8AAB, 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6,\t0x8AAF, 0xB4B8, 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC,\n\t0x8AB3, 0xB4BD, 0x8AB4, 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1,\t0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6,\n\t0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, 0xB4CA, 0x8ABE, 0xB4CB,\t0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, 0x8AC2, 0xB4CF,\n\t0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, 0xB4D4,\t0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9,\n\t0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF,\t0x8ACF, 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7,\n\t0x8AD3, 0xB4E8, 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB,\t0x8AD7, 0xB4EE, 0x8AD8, 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3,\n\t0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7,\t0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, 0xB4FB, 0x8AE2, 0xB4FC,\n\t0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, 0x8AE6, 0xB500,\t0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, 0xB504,\n\t0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508,\t0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C,\n\t0x8AF3, 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510,\t0x8AF7, 0xB511, 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516,\n\t0x8AFB, 0xB517, 0x8AFC, 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D,\t0x8B41, 0xB51E, 0x8B42, 0xB51F, 0x8B43, 0xB520, 0x8B44, 0xB521,\n\t0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, 0xB526, 0x8B48, 0xB52B,\t0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, 0x8B4C, 0xB52F,\n\t0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, 0xB536,\t0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B,\n\t0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F,\t0x8B59, 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548,\n\t0x8B63, 0xB549, 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F,\t0x8B67, 0xB551, 0x8B68, 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555,\n\t0x8B6B, 0xB556, 0x8B6C, 0xB557, 0x8B6D, 0xB558, 0x8B6E, 0xB559,\t0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, 0xB55E, 0x8B72, 0xB562,\n\t0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, 0x8B76, 0xB566,\t0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, 0xB56A,\n\t0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E,\t0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572,\n\t0x8B89, 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576,\t0x8B8D, 0xB577, 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A,\n\t0x8B91, 0xB57B, 0x8B92, 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E,\t0x8B95, 0xB57F, 0x8B96, 0xB580, 0x8B97, 0xB581, 0x8B98, 0xB582,\n\t0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, 0xB585, 0x8B9C, 0xB586,\t0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, 0x8BA0, 0xB58A,\n\t0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, 0xB58E,\t0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592,\n\t0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596,\t0x8BAD, 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A,\n\t0x8BB1, 0xB59B, 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E,\t0x8BB5, 0xB59F, 0x8BB6, 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5,\n\t0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC,\t0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, 0xB5AF, 0x8BC0, 0xB5B2,\n\t0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, 0x8BC4, 0xB5B9,\t0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, 0xB5C1,\n\t0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6,\t0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA,\n\t0x8BD1, 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3,\t0x8BD5, 0xB5D4, 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7,\n\t0x8BD9, 0xB5D9, 0x8BDA, 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC,\t0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0,\n\t0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, 0xB5E3, 0x8BE4, 0xB5E4,\t0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, 0x8BE8, 0xB5E8,\n\t0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, 0xB5ED,\t0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1,\n\t0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5,\t0x8BF5, 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9,\n\t0x8BF9, 0xB5FA, 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD,\t0x8BFD, 0xB5FE, 0x8BFE, 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601,\n\t0x8C43, 0xB602, 0x8C44, 0xB603, 0x8C45, 0xB604, 0x8C46, 0xB605,\t0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, 0xB608, 0x8C4A, 0xB609,\n\t0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, 0x8C4E, 0xB60D,\t0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, 0xB613,\n\t0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619,\t0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D,\n\t0x8C61, 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621,\t0x8C65, 0xB622, 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626,\n\t0x8C69, 0xB627, 0x8C6A, 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A,\t0x8C6D, 0xB62B, 0x8C6E, 0xB62D, 0x8C6F, 0xB62E, 0x8C70, 0xB62F,\n\t0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, 0xB632, 0x8C74, 0xB633,\t0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, 0x8C78, 0xB638,\n\t0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, 0xB63C,\t0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640,\n\t0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644,\t0x8C8B, 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649,\n\t0x8C8F, 0xB64A, 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D,\t0x8C93, 0xB64E, 0x8C94, 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651,\n\t0x8C97, 0xB652, 0x8C98, 0xB653, 0x8C99, 0xB654, 0x8C9A, 0xB655,\t0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, 0xB658, 0x8C9E, 0xB659,\n\t0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, 0x8CA2, 0xB65D,\t0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, 0xB661,\n\t0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666,\t0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B,\n\t0x8CAF, 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F,\t0x8CB3, 0xB670, 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673,\n\t0x8CB7, 0xB674, 0x8CB8, 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677,\t0x8CBB, 0xB678, 0x8CBC, 0xB679, 0x8CBD, 0xB67A, 0x8CBE, 0xB67B,\n\t0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, 0xB67E, 0x8CC2, 0xB67F,\t0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, 0x8CC6, 0xB683,\n\t0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, 0xB687,\t0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B,\n\t0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F,\t0x8CD3, 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693,\n\t0x8CD7, 0xB694, 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697,\t0x8CDB, 0xB698, 0x8CDC, 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B,\n\t0x8CDF, 0xB69E, 0x8CE0, 0xB69F, 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2,\t0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, 0xB6A6, 0x8CE6, 0xB6A7,\n\t0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, 0x8CEA, 0xB6AD,\t0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, 0xB6B2,\n\t0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6,\t0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA,\n\t0x8CF7, 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE,\t0x8CFB, 0xB6BF, 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2,\n\t0x8D41, 0xB6C3, 0x8D42, 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6,\t0x8D45, 0xB6C7, 0x8D46, 0xB6C8, 0x8D47, 0xB6C9, 0x8D48, 0xB6CA,\n\t0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, 0xB6CD, 0x8D4C, 0xB6CE,\t0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, 0x8D50, 0xB6D2,\n\t0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, 0xB6D7,\t0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB,\n\t0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF,\t0x8D63, 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3,\n\t0x8D67, 0xB6E4, 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7,\t0x8D6B, 0xB6E8, 0x8D6C, 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB,\n\t0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, 0x8D71, 0xB6EE, 0x8D72, 0xB6EF,\t0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, 0xB6F3, 0x8D76, 0xB6F5,\n\t0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, 0x8D7A, 0xB6FA,\t0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, 0xB6FE,\n\t0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704,\t0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709,\n\t0x8D8D, 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D,\t0x8D91, 0xB70E, 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711,\n\t0x8D95, 0xB712, 0x8D96, 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715,\t0x8D99, 0xB716, 0x8D9A, 0xB717, 0x8D9B, 0xB718, 0x8D9C, 0xB719,\n\t0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, 0xB71C, 0x8DA0, 0xB71D,\t0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, 0x8DA4, 0xB721,\n\t0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, 0xB725,\t0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B,\n\t0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732,\t0x8DB1, 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736,\n\t0x8DB5, 0xB737, 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D,\t0x8DB9, 0xB73E, 0x8DBA, 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741,\n\t0x8DBD, 0xB742, 0x8DBE, 0xB743, 0x8DBF, 0xB745, 0x8DC0, 0xB746,\t0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, 0xB74A, 0x8DC4, 0xB74B,\n\t0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, 0x8DC8, 0xB750,\t0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, 0xB756,\n\t0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A,\t0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E,\n\t0x8DD5, 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763,\t0x8DD9, 0xB765, 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769,\n\t0x8DDD, 0xB76A, 0x8DDE, 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D,\t0x8DE1, 0xB76E, 0x8DE2, 0xB76F, 0x8DE3, 0xB772, 0x8DE4, 0xB774,\n\t0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, 0xB778, 0x8DE8, 0xB779,\t0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, 0x8DEC, 0xB77F,\n\t0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, 0xB785,\t0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789,\n\t0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793,\t0x8DF9, 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B,\n\t0x8DFD, 0xB79D, 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1,\t0x8E43, 0xB7A2, 0x8E44, 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5,\n\t0x8E47, 0xB7A6, 0x8E48, 0xB7A7, 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE,\t0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, 0xB7B1, 0x8E4E, 0xB7B2,\n\t0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, 0x8E52, 0xB7B9,\t0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, 0xB7BD,\n\t0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1,\t0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5,\n\t0x8E65, 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB,\t0x8E69, 0xB7CC, 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF,\n\t0x8E6D, 0xB7D0, 0x8E6E, 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3,\t0x8E71, 0xB7D4, 0x8E72, 0xB7D5, 0x8E73, 0xB7D6, 0x8E74, 0xB7D7,\n\t0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, 0xB7DA, 0x8E78, 0xB7DB,\t0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, 0x8E82, 0xB7DF,\n\t0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, 0xB7E3,\t0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7,\n\t0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB,\t0x8E8F, 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2,\n\t0x8E93, 0xB7F3, 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7,\t0x8E97, 0xB7F8, 0x8E98, 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB,\n\t0x8E9B, 0xB7FE, 0x8E9C, 0xB802, 0x8E9D, 0xB803, 0x8E9E, 0xB804,\t0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, 0xB80A, 0x8EA2, 0xB80B,\n\t0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, 0x8EA6, 0xB811,\t0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, 0xB815,\n\t0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C,\t0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821,\n\t0x8EB3, 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827,\t0x8EB7, 0xB829, 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D,\n\t0x8EBB, 0xB82E, 0x8EBC, 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831,\t0x8EBF, 0xB832, 0x8EC0, 0xB833, 0x8EC1, 0xB836, 0x8EC2, 0xB83A,\n\t0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, 0xB83D, 0x8EC6, 0xB83E,\t0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, 0x8ECA, 0xB843,\n\t0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, 0xB848,\t0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C,\n\t0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850,\t0x8ED7, 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856,\n\t0x8EDB, 0xB857, 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A,\t0x8EDF, 0xB85B, 0x8EE0, 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861,\n\t0x8EE3, 0xB862, 0x8EE4, 0xB863, 0x8EE5, 0xB865, 0x8EE6, 0xB866,\t0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, 0xB869, 0x8EEA, 0xB86A,\n\t0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, 0x8EEE, 0xB872,\t0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, 0xB876,\n\t0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B,\t0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880,\n\t0x8EFB, 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884,\t0x8F41, 0xB885, 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888,\n\t0x8F45, 0xB889, 0x8F46, 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C,\t0x8F49, 0xB88E, 0x8F4A, 0xB88F, 0x8F4B, 0xB890, 0x8F4C, 0xB891,\n\t0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, 0xB894, 0x8F50, 0xB895,\t0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, 0x8F54, 0xB899,\n\t0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, 0xB89D,\t0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1,\n\t0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5,\t0x8F67, 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA,\n\t0x8F6B, 0xB8AB, 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE,\t0x8F6F, 0xB8AF, 0x8F70, 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3,\n\t0x8F73, 0xB8B5, 0x8F74, 0xB8B6, 0x8F75, 0xB8B7, 0x8F76, 0xB8B9,\t0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, 0xB8BC, 0x8F7A, 0xB8BD,\n\t0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, 0x8F84, 0xB8C4,\t0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, 0xB8C9,\n\t0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE,\t0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3,\n\t0x8F91, 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8,\t0x8F95, 0xB8D9, 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC,\n\t0x8F99, 0xB8DE, 0x8F9A, 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3,\t0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7,\n\t0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, 0xB8ED, 0x8FA4, 0xB8EE,\t0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, 0x8FA8, 0xB8F3,\n\t0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, 0xB8F7,\t0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF,\n\t0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903,\t0x8FB5, 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908,\n\t0x8FB9, 0xB909, 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C,\t0x8FBD, 0xB90D, 0x8FBE, 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910,\n\t0x8FC1, 0xB911, 0x8FC2, 0xB912, 0x8FC3, 0xB913, 0x8FC4, 0xB914,\t0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, 0xB917, 0x8FC8, 0xB919,\n\t0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, 0x8FCC, 0xB91D,\t0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, 0xB922,\n\t0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926,\t0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A,\n\t0x8FD9, 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E,\t0x8FDD, 0xB92F, 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932,\n\t0x8FE1, 0xB933, 0x8FE2, 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936,\t0x8FE5, 0xB937, 0x8FE6, 0xB938, 0x8FE7, 0xB939, 0x8FE8, 0xB93A,\n\t0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, 0xB93F, 0x8FEC, 0xB941,\t0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, 0x8FF0, 0xB946,\n\t0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, 0xB94A,\t0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950,\n\t0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955,\t0x8FFD, 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B,\n\t0x9043, 0xB95D, 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961,\t0x9047, 0xB962, 0x9048, 0xB963, 0x9049, 0xB964, 0x904A, 0xB965,\n\t0x904B, 0xB966, 0x904C, 0xB967, 0x904D, 0xB96A, 0x904E, 0xB96C,\t0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, 0xB970, 0x9052, 0xB971,\n\t0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, 0x9056, 0xB977,\t0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, 0xB97D,\n\t0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981,\t0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988,\n\t0x9069, 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990,\t0x906D, 0xB991, 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994,\n\t0x9071, 0xB995, 0x9072, 0xB996, 0x9073, 0xB997, 0x9074, 0xB998,\t0x9075, 0xB999, 0x9076, 0xB99A, 0x9077, 0xB99B, 0x9078, 0xB99C,\n\t0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, 0xB99F, 0x9082, 0xB9A0,\t0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, 0x9086, 0xB9A4,\n\t0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, 0xB9A8,\t0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE,\n\t0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3,\t0x9093, 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8,\n\t0x9097, 0xB9B9, 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE,\t0x909B, 0xB9C0, 0x909C, 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4,\n\t0x909F, 0xB9C5, 0x90A0, 0xB9C6, 0x90A1, 0xB9C7, 0x90A2, 0xB9CA,\t0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, 0xB9D3, 0x90A6, 0xB9D4,\n\t0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, 0x90AA, 0xB9DA,\t0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, 0xB9E2,\n\t0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA,\t0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF,\n\t0x90B7, 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3,\t0x90BB, 0xB9F6, 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD,\n\t0x90BF, 0xB9FE, 0x90C0, 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03,\t0x90C3, 0xBA04, 0x90C4, 0xBA05, 0x90C5, 0xBA06, 0x90C6, 0xBA07,\n\t0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, 0xBA0B, 0x90CA, 0xBA0C,\t0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, 0x90CE, 0xBA10,\n\t0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, 0xBA14,\t0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19,\n\t0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D,\t0x90DB, 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21,\n\t0x90DF, 0xBA22, 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25,\t0x90E3, 0xBA26, 0x90E4, 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29,\n\t0x90E7, 0xBA2A, 0x90E8, 0xBA2B, 0x90E9, 0xBA2C, 0x90EA, 0xBA2D,\t0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, 0xBA30, 0x90EE, 0xBA31,\n\t0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, 0x90F2, 0xBA35,\t0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, 0xBA3B,\n\t0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41,\t0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46,\n\t0x9141, 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F,\t0x9145, 0xBA50, 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56,\n\t0x9149, 0xBA57, 0x914A, 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B,\t0x914D, 0xBA5D, 0x914E, 0xBA5E, 0x914F, 0xBA5F, 0x9150, 0xBA60,\n\t0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, 0xBA63, 0x9154, 0xBA66,\t0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, 0x9158, 0xBA6D,\n\t0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, 0xBA73,\t0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79,\n\t0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D,\t0x916B, 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81,\n\t0x916F, 0xBA82, 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89,\t0x9173, 0xBA8A, 0x9174, 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E,\n\t0x9177, 0xBA8F, 0x9178, 0xBA90, 0x9179, 0xBA91, 0x917A, 0xBA92,\t0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, 0xBA95, 0x9184, 0xBA96,\n\t0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, 0x9188, 0xBA9A,\t0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, 0xBA9E,\n\t0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2,\t0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6,\n\t0x9195, 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE,\t0x9199, 0xBAAF, 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4,\n\t0x919D, 0xBAB5, 0x919E, 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA,\t0x91A1, 0xBABC, 0x91A2, 0xBABE, 0x91A3, 0xBABF, 0x91A4, 0xBAC0,\n\t0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, 0xBAC3, 0x91A8, 0xBAC5,\t0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, 0x91AC, 0xBACA,\n\t0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, 0xBACE,\t0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2,\n\t0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6,\t0x91B9, 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC,\n\t0x91BD, 0xBADD, 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0,\t0x91C1, 0xBAE1, 0x91C2, 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4,\n\t0x91C5, 0xBAE5, 0x91C6, 0xBAE6, 0x91C7, 0xBAE7, 0x91C8, 0xBAE8,\t0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, 0xBAEB, 0x91CC, 0xBAEC,\n\t0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, 0x91D0, 0xBAF0,\t0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, 0xBAF4,\n\t0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8,\t0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD,\n\t0x91DD, 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02,\t0x91E1, 0xBB03, 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07,\n\t0x91E5, 0xBB08, 0x91E6, 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B,\t0x91E9, 0xBB0C, 0x91EA, 0xBB0E, 0x91EB, 0xBB10, 0x91EC, 0xBB12,\n\t0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, 0xBB15, 0x91F0, 0xBB16,\t0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, 0x91F4, 0xBB1B,\n\t0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, 0xBB21,\t0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25,\n\t0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A,\t0x9243, 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F,\n\t0x9247, 0xBB30, 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33,\t0x924B, 0xBB37, 0x924C, 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F,\n\t0x924F, 0xBB40, 0x9250, 0xBB41, 0x9251, 0xBB42, 0x9252, 0xBB43,\t0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, 0xBB4A, 0x9256, 0xBB4B,\n\t0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, 0x925A, 0xBB52,\t0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, 0xBB57,\n\t0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C,\t0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60,\n\t0x926D, 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66,\t0x9271, 0xBB67, 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A,\n\t0x9275, 0xBB6B, 0x9276, 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F,\t0x9279, 0xBB70, 0x927A, 0xBB71, 0x9281, 0xBB72, 0x9282, 0xBB73,\n\t0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, 0xBB76, 0x9286, 0xBB77,\t0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, 0x928A, 0xBB7B,\n\t0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, 0xBB7F,\t0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83,\n\t0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87,\t0x9297, 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D,\n\t0x929B, 0xBB8E, 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92,\t0x929F, 0xBB93, 0x92A0, 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96,\n\t0x92A3, 0xBB97, 0x92A4, 0xBB98, 0x92A5, 0xBB99, 0x92A6, 0xBB9A,\t0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, 0xBB9D, 0x92AA, 0xBB9E,\n\t0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, 0x92AE, 0xBBA2,\t0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, 0xBBA7,\n\t0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD,\t0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1,\n\t0x92BB, 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6,\t0x92BF, 0xBBB8, 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB,\n\t0x92C3, 0xBBBC, 0x92C4, 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF,\t0x92C7, 0xBBC1, 0x92C8, 0xBBC2, 0x92C9, 0xBBC3, 0x92CA, 0xBBC5,\n\t0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, 0xBBC9, 0x92CE, 0xBBCA,\t0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, 0x92D2, 0xBBCE,\n\t0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, 0xBBD4,\t0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8,\n\t0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC,\t0x92DF, 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0,\n\t0x92E3, 0xBBE1, 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4,\t0x92E7, 0xBBE5, 0x92E8, 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8,\n\t0x92EB, 0xBBE9, 0x92EC, 0xBBEA, 0x92ED, 0xBBEB, 0x92EE, 0xBBEC,\t0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, 0xBBEF, 0x92F2, 0xBBF0,\n\t0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, 0x92F6, 0xBBF4,\t0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, 0xBBFA,\n\t0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01,\t0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06,\n\t0x9345, 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10,\t0x9349, 0xBC12, 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A,\n\t0x934D, 0xBC20, 0x934E, 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23,\t0x9351, 0xBC26, 0x9352, 0xBC28, 0x9353, 0xBC2A, 0x9354, 0xBC2B,\n\t0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, 0xBC2F, 0x9358, 0xBC32,\t0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, 0x9362, 0xBC37,\n\t0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, 0xBC3C,\t0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42,\n\t0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A,\t0x936F, 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51,\n\t0x9373, 0xBC52, 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55,\t0x9377, 0xBC56, 0x9378, 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59,\n\t0x9381, 0xBC5A, 0x9382, 0xBC5B, 0x9383, 0xBC5C, 0x9384, 0xBC5E,\t0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, 0xBC61, 0x9388, 0xBC62,\n\t0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, 0x938C, 0xBC66,\t0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, 0xBC6A,\n\t0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E,\t0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72,\n\t0x9399, 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76,\t0x939D, 0xBC77, 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A,\n\t0x93A1, 0xBC7B, 0x93A2, 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E,\t0x93A5, 0xBC7F, 0x93A6, 0xBC80, 0x93A7, 0xBC81, 0x93A8, 0xBC82,\n\t0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, 0xBC87, 0x93AC, 0xBC89,\t0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, 0x93B0, 0xBC90,\n\t0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, 0xBC96,\t0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D,\n\t0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3,\t0x93BD, 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA,\n\t0x93C1, 0xBCAB, 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE,\t0x93C5, 0xBCAF, 0x93C6, 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7,\n\t0x93C9, 0xBCB8, 0x93CA, 0xBCB9, 0x93CB, 0xBCBA, 0x93CC, 0xBCBB,\t0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, 0xBCC1, 0x93D0, 0xBCC2,\n\t0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, 0x93D4, 0xBCC7,\t0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, 0xBCCB,\n\t0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3,\t0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9,\n\t0x93E1, 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE,\t0x93E5, 0xBCDF, 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2,\n\t0x93E9, 0xBCE3, 0x93EA, 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6,\t0x93ED, 0xBCE7, 0x93EE, 0xBCE8, 0x93EF, 0xBCE9, 0x93F0, 0xBCEA,\n\t0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, 0xBCED, 0x93F4, 0xBCEE,\t0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, 0x93F8, 0xBCF2,\n\t0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, 0xBCFA,\t0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF,\n\t0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03,\t0x9447, 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B,\n\t0x944B, 0xBD0C, 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F,\t0x944F, 0xBD11, 0x9450, 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15,\n\t0x9453, 0xBD16, 0x9454, 0xBD17, 0x9455, 0xBD18, 0x9456, 0xBD19,\t0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, 0xBD1C, 0x945A, 0xBD1D,\n\t0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, 0x9464, 0xBD21,\t0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, 0xBD26,\n\t0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A,\t0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F,\n\t0x9471, 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33,\t0x9475, 0xBD34, 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37,\n\t0x9479, 0xBD38, 0x947A, 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B,\t0x9483, 0xBD3C, 0x9484, 0xBD3D, 0x9485, 0xBD3E, 0x9486, 0xBD3F,\n\t0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, 0xBD43, 0x948A, 0xBD44,\t0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, 0x948E, 0xBD4A,\n\t0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, 0xBD4F,\t0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54,\n\t0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A,\t0x949B, 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E,\n\t0x949F, 0xBD5F, 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62,\t0x94A3, 0xBD63, 0x94A4, 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67,\n\t0x94A7, 0xBD69, 0x94A8, 0xBD6A, 0x94A9, 0xBD6B, 0x94AA, 0xBD6C,\t0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, 0xBD6F, 0x94AE, 0xBD70,\n\t0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, 0x94B2, 0xBD74,\t0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, 0xBD78,\n\t0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C,\t0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82,\n\t0x94BF, 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B,\t0x94C3, 0xBD8C, 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F,\n\t0x94C7, 0xBD92, 0x94C8, 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97,\t0x94CB, 0xBD98, 0x94CC, 0xBD9B, 0x94CD, 0xBD9D, 0x94CE, 0xBD9E,\n\t0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, 0xBDA1, 0x94D2, 0xBDA2,\t0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, 0x94D6, 0xBDA7,\n\t0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, 0xBDAB,\t0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF,\n\t0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4,\t0x94E3, 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9,\n\t0x94E7, 0xBDBA, 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD,\t0x94EB, 0xBDBE, 0x94EC, 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1,\n\t0x94EF, 0xBDC2, 0x94F0, 0xBDC3, 0x94F1, 0xBDC4, 0x94F2, 0xBDC5,\t0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, 0xBDC8, 0x94F6, 0xBDC9,\n\t0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, 0x94FA, 0xBDCD,\t0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, 0xBDD1,\n\t0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7,\t0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD,\n\t0x9549, 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1,\t0x954D, 0xBDE2, 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5,\n\t0x9551, 0xBDE6, 0x9552, 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA,\t0x9555, 0xBDEB, 0x9556, 0xBDEC, 0x9557, 0xBDED, 0x9558, 0xBDEE,\n\t0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, 0xBDF2, 0x9562, 0xBDF3,\t0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, 0x9566, 0xBDF9,\n\t0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, 0xBDFD,\t0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02,\n\t0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08,\t0x9573, 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E,\n\t0x9577, 0xBE0F, 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13,\t0x9581, 0xBE15, 0x9582, 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18,\n\t0x9585, 0xBE19, 0x9586, 0xBE1A, 0x9587, 0xBE1B, 0x9588, 0xBE1E,\t0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, 0xBE22, 0x958C, 0xBE23,\n\t0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, 0x9590, 0xBE27,\t0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, 0xBE2B,\n\t0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F,\t0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33,\n\t0x959D, 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37,\t0x95A1, 0xBE38, 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B,\n\t0x95A5, 0xBE3C, 0x95A6, 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F,\t0x95A9, 0xBE40, 0x95AA, 0xBE41, 0x95AB, 0xBE42, 0x95AC, 0xBE43,\n\t0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, 0xBE49, 0x95B0, 0xBE4A,\t0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, 0x95B4, 0xBE50,\n\t0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, 0xBE56,\t0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E,\n\t0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65,\t0x95C1, 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B,\n\t0x95C5, 0xBE6C, 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F,\t0x95C9, 0xBE72, 0x95CA, 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78,\n\t0x95CD, 0xBE79, 0x95CE, 0xBE7A, 0x95CF, 0xBE7E, 0x95D0, 0xBE7F,\t0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, 0xBE83, 0x95D4, 0xBE85,\n\t0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, 0x95D8, 0xBE89,\t0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, 0xBE92,\n\t0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96,\t0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C,\n\t0x95E5, 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0,\t0x95E9, 0xBEA1, 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4,\n\t0x95ED, 0xBEA5, 0x95EE, 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9,\t0x95F1, 0xBEAA, 0x95F2, 0xBEAB, 0x95F3, 0xBEAC, 0x95F4, 0xBEAD,\n\t0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, 0xBEB0, 0x95F8, 0xBEB1,\t0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, 0x95FC, 0xBEB5,\n\t0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, 0xBEB9,\t0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD,\n\t0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1,\t0x964B, 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5,\n\t0x964F, 0xBEC6, 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9,\t0x9653, 0xBECA, 0x9654, 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD,\n\t0x9657, 0xBECE, 0x9658, 0xBECF, 0x9659, 0xBED2, 0x965A, 0xBED3,\t0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, 0xBED9, 0x9664, 0xBEDA,\n\t0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, 0x9668, 0xBEDE,\t0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, 0xBEE6,\n\t0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA,\t0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF,\n\t0x9675, 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3,\t0x9679, 0xBEF4, 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7,\n\t0x9683, 0xBEF8, 0x9684, 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB,\t0x9687, 0xBEFC, 0x9688, 0xBEFD, 0x9689, 0xBEFE, 0x968A, 0xBEFF,\n\t0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, 0xBF03, 0x968E, 0xBF04,\t0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, 0x9692, 0xBF0A,\n\t0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, 0xBF0E,\t0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12,\n\t0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16,\t0x969F, 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F,\n\t0x96A3, 0xBF20, 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23,\t0x96A7, 0xBF24, 0x96A8, 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27,\n\t0x96AB, 0xBF28, 0x96AC, 0xBF29, 0x96AD, 0xBF2A, 0x96AE, 0xBF2B,\t0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, 0xBF2E, 0x96B2, 0xBF2F,\n\t0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, 0x96B6, 0xBF33,\t0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, 0xBF37,\n\t0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B,\t0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F,\n\t0x96C3, 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46,\t0x96C7, 0xBF47, 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B,\n\t0x96CB, 0xBF4C, 0x96CC, 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F,\t0x96CF, 0xBF52, 0x96D0, 0xBF53, 0x96D1, 0xBF54, 0x96D2, 0xBF56,\n\t0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, 0xBF59, 0x96D6, 0xBF5A,\t0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, 0x96DA, 0xBF5E,\n\t0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, 0xBF62,\t0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66,\n\t0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A,\t0x96E7, 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E,\n\t0x96EB, 0xBF6F, 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72,\t0x96EF, 0xBF73, 0x96F0, 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76,\n\t0x96F3, 0xBF77, 0x96F4, 0xBF78, 0x96F5, 0xBF79, 0x96F6, 0xBF7A,\t0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, 0xBF7D, 0x96FA, 0xBF7E,\n\t0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, 0x96FE, 0xBF82,\t0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, 0xBF86,\n\t0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A,\t0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E,\n\t0x974D, 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92,\t0x9751, 0xBF93, 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97,\n\t0x9755, 0xBF98, 0x9756, 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B,\t0x9759, 0xBF9C, 0x975A, 0xBF9D, 0x9761, 0xBF9E, 0x9762, 0xBF9F,\n\t0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, 0xBFA2, 0x9766, 0xBFA3,\t0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, 0x976A, 0xBFA7,\n\t0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, 0xBFAB,\t0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF,\n\t0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4,\t0x9777, 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8,\n\t0x9781, 0xBFB9, 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC,\t0x9785, 0xBFBD, 0x9786, 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0,\n\t0x9789, 0xBFC1, 0x978A, 0xBFC2, 0x978B, 0xBFC3, 0x978C, 0xBFC4,\t0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, 0xBFC8, 0x9790, 0xBFC9,\n\t0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, 0x9794, 0xBFCF,\t0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, 0xBFD5,\n\t0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9,\t0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE,\n\t0x97A1, 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4,\t0x97A5, 0xBFE5, 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8,\n\t0x97A9, 0xBFE9, 0x97AA, 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC,\t0x97AD, 0xBFED, 0x97AE, 0xBFEE, 0x97AF, 0xBFEF, 0x97B0, 0xBFF0,\n\t0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, 0xBFF3, 0x97B4, 0xBFF4,\t0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, 0x97B8, 0xBFF8,\n\t0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, 0xBFFC,\t0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000,\n\t0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004,\t0x97C5, 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008,\n\t0x97C9, 0xC009, 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C,\t0x97CD, 0xC00D, 0x97CE, 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010,\n\t0x97D1, 0xC011, 0x97D2, 0xC012, 0x97D3, 0xC013, 0x97D4, 0xC014,\t0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, 0xC017, 0x97D8, 0xC018,\n\t0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, 0x97DC, 0xC01C,\t0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, 0xC020,\n\t0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024,\t0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028,\n\t0x97E9, 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C,\t0x97ED, 0xC02D, 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030,\n\t0x97F1, 0xC031, 0x97F2, 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034,\t0x97F5, 0xC035, 0x97F6, 0xC036, 0x97F7, 0xC037, 0x97F8, 0xC038,\n\t0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, 0xC03B, 0x97FC, 0xC03D,\t0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, 0x9842, 0xC041,\n\t0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, 0xC045,\t0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049,\n\t0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D,\t0x984F, 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052,\n\t0x9853, 0xC053, 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056,\t0x9857, 0xC057, 0x9858, 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B,\n\t0x9861, 0xC05D, 0x9862, 0xC05E, 0x9863, 0xC05F, 0x9864, 0xC061,\t0x9865, 0xC062, 0x9866, 0xC063, 0x9867, 0xC064, 0x9868, 0xC065,\n\t0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, 0x986C, 0xC06B,\t0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, 0xC06F,\n\t0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073,\t0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077,\n\t0x9879, 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B,\t0x9883, 0xC07C, 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F,\n\t0x9887, 0xC080, 0x9888, 0xC081, 0x9889, 0xC082, 0x988A, 0xC083,\t0x988B, 0xC084, 0x988C, 0xC085, 0x988D, 0xC086, 0x988E, 0xC087,\n\t0x988F, 0xC088, 0x9890, 0xC089, 0x9891, 0xC08A, 0x9892, 0xC08B,\t0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, 0x9896, 0xC08F,\n\t0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, 0xC096,\t0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B,\n\t0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F,\t0x98A3, 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7,\n\t0x98A7, 0xC0A8, 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB,\t0x98AB, 0xC0AE, 0x98AC, 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7,\n\t0x98AF, 0xC0B8, 0x98B0, 0xC0B9, 0x98B1, 0xC0BA, 0x98B2, 0xC0BB,\t0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, 0xC0C3, 0x98B6, 0xC0C4,\n\t0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, 0x98BA, 0xC0CB,\t0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, 0xC0D1,\n\t0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5,\t0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE,\n\t0x98C7, 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2,\t0x98CB, 0xC0E3, 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9,\n\t0x98CF, 0xC0EA, 0x98D0, 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE,\t0x98D3, 0xC0EF, 0x98D4, 0xC0F0, 0x98D5, 0xC0F1, 0x98D6, 0xC0F2,\n\t0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, 0xC0F8, 0x98DA, 0xC0FA,\t0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, 0x98DE, 0xC0FE,\n\t0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, 0xC103,\t0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109,\n\t0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D,\t0x98EB, 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112,\n\t0x98EF, 0xC113, 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117,\t0x98F3, 0xC118, 0x98F4, 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B,\n\t0x98F7, 0xC121, 0x98F8, 0xC122, 0x98F9, 0xC125, 0x98FA, 0xC128,\t0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, 0xC12B, 0x98FE, 0xC12E,\n\t0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, 0x9944, 0xC135,\t0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, 0xC13D,\n\t0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142,\t0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146,\n\t0x9951, 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F,\t0x9955, 0xC150, 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153,\n\t0x9959, 0xC156, 0x995A, 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A,\t0x9963, 0xC15B, 0x9964, 0xC15D, 0x9965, 0xC15E, 0x9966, 0xC15F,\n\t0x9967, 0xC160, 0x9968, 0xC161, 0x9969, 0xC162, 0x996A, 0xC163,\t0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, 0x996E, 0xC16C,\n\t0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, 0xC171,\t0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176,\n\t0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B,\t0x9981, 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F,\n\t0x9985, 0xC180, 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183,\t0x9989, 0xC184, 0x998A, 0xC186, 0x998B, 0xC187, 0x998C, 0xC188,\n\t0x998D, 0xC189, 0x998E, 0xC18A, 0x998F, 0xC18B, 0x9990, 0xC18F,\t0x9991, 0xC191, 0x9992, 0xC192, 0x9993, 0xC193, 0x9994, 0xC195,\n\t0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, 0x9998, 0xC19A,\t0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, 0xC1A2,\n\t0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7,\t0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE,\n\t0x99A5, 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3,\t0x99A9, 0xC1B4, 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7,\n\t0x99AD, 0xC1B8, 0x99AE, 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB,\t0x99B1, 0xC1BC, 0x99B2, 0xC1BE, 0x99B3, 0xC1BF, 0x99B4, 0xC1C0,\n\t0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, 0xC1C3, 0x99B8, 0xC1C5,\t0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, 0x99BC, 0xC1CA,\n\t0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, 0xC1CF,\t0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3,\n\t0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA,\t0x99C9, 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE,\n\t0x99CD, 0xC1DF, 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3,\t0x99D1, 0xC1E5, 0x99D2, 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9,\n\t0x99D5, 0xC1EA, 0x99D6, 0xC1EB, 0x99D7, 0xC1EC, 0x99D8, 0xC1ED,\t0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, 0xC1F2, 0x99DC, 0xC1F4,\n\t0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, 0x99E0, 0xC1F8,\t0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, 0xC1FE,\n\t0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203,\t0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208,\n\t0x99ED, 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E,\t0x99F1, 0xC210, 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214,\n\t0x99F5, 0xC215, 0x99F6, 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A,\t0x99F9, 0xC21B, 0x99FA, 0xC21D, 0x99FB, 0xC21E, 0x99FC, 0xC221,\n\t0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, 0xC224, 0x9A42, 0xC225,\t0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, 0x9A46, 0xC22C,\n\t0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, 0xC235,\t0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239,\n\t0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D,\t0x9A53, 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241,\n\t0x9A57, 0xC242, 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245,\t0x9A61, 0xC246, 0x9A62, 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A,\n\t0x9A65, 0xC24B, 0x9A66, 0xC24C, 0x9A67, 0xC24D, 0x9A68, 0xC24E,\t0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, 0xC253, 0x9A6C, 0xC255,\n\t0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, 0x9A70, 0xC25A,\t0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, 0xC25E,\n\t0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263,\t0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268,\n\t0x9A83, 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E,\t0x9A87, 0xC26F, 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273,\n\t0x9A8B, 0xC275, 0x9A8C, 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278,\t0x9A8F, 0xC279, 0x9A90, 0xC27A, 0x9A91, 0xC27B, 0x9A92, 0xC27E,\n\t0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, 0xC283, 0x9A96, 0xC284,\t0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, 0x9A9A, 0xC28A,\n\t0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, 0xC28E,\t0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293,\n\t0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297,\t0x9AA7, 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E,\n\t0x9AAB, 0xC29F, 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2,\t0x9AAF, 0xC2A3, 0x9AB0, 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9,\n\t0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF,\t0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, 0xC2B2, 0x9ABA, 0xC2B3,\n\t0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, 0x9ABE, 0xC2BB,\t0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, 0xC2BF,\n\t0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3,\t0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7,\n\t0x9ACB, 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB,\t0x9ACF, 0xC2CC, 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF,\n\t0x9AD3, 0xC2D0, 0x9AD4, 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3,\t0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7,\n\t0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, 0xC2DA, 0x9ADE, 0xC2DB,\t0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, 0x9AE2, 0xC2E2,\n\t0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, 0xC2E8,\t0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0,\n\t0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5,\t0x9AEF, 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE,\n\t0x9AF3, 0xC2FF, 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303,\t0x9AF7, 0xC304, 0x9AF8, 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307,\n\t0x9AFB, 0xC30A, 0x9AFC, 0xC30B, 0x9AFD, 0xC30E, 0x9AFE, 0xC30F,\t0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, 0xC312, 0x9B44, 0xC316,\n\t0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, 0x9B48, 0xC31B,\t0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, 0xC320,\n\t0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326,\t0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C,\n\t0x9B55, 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330,\t0x9B59, 0xC331, 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334,\n\t0x9B63, 0xC335, 0x9B64, 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338,\t0x9B67, 0xC339, 0x9B68, 0xC33A, 0x9B69, 0xC33B, 0x9B6A, 0xC33C,\n\t0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, 0xC33F, 0x9B6E, 0xC340,\t0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, 0x9B72, 0xC344,\n\t0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, 0xC349,\t0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D,\n\t0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351,\t0x9B85, 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355,\n\t0x9B89, 0xC356, 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359,\t0x9B8D, 0xC35A, 0x9B8E, 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D,\n\t0x9B91, 0xC35E, 0x9B92, 0xC35F, 0x9B93, 0xC360, 0x9B94, 0xC361,\t0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, 0xC364, 0x9B98, 0xC365,\n\t0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, 0x9B9C, 0xC36B,\t0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, 0xC371,\n\t0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376,\t0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E,\n\t0x9BA9, 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382,\t0x9BAD, 0xC383, 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387,\n\t0x9BB1, 0xC389, 0x9BB2, 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D,\t0x9BB5, 0xC38E, 0x9BB6, 0xC38F, 0x9BB7, 0xC390, 0x9BB8, 0xC391,\n\t0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, 0xC394, 0x9BBC, 0xC395,\t0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, 0x9BC0, 0xC399,\n\t0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, 0xC39D,\t0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1,\n\t0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5,\t0x9BCD, 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9,\n\t0x9BD1, 0xC3AA, 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD,\t0x9BD5, 0xC3AE, 0x9BD6, 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1,\n\t0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5,\t0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, 0xC3B8, 0x9BE0, 0xC3B9,\n\t0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, 0x9BE4, 0xC3BD,\t0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, 0xC3C2,\n\t0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6,\t0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA,\n\t0x9BF1, 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE,\t0x9BF5, 0xC3CF, 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2,\n\t0x9BF9, 0xC3D3, 0x9BFA, 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6,\t0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, 0x9C41, 0xC3DB, 0x9C42, 0xC3DD,\n\t0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, 0xC3E3, 0x9C46, 0xC3E4,\t0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, 0x9C4A, 0xC3EA,\n\t0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, 0xC3EF,\t0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3,\n\t0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA,\t0x9C57, 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE,\n\t0x9C61, 0xC3FF, 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402,\t0x9C65, 0xC403, 0x9C66, 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406,\n\t0x9C69, 0xC407, 0x9C6A, 0xC409, 0x9C6B, 0xC40A, 0x9C6C, 0xC40B,\t0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, 0xC40E, 0x9C70, 0xC40F,\n\t0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, 0x9C74, 0xC414,\t0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, 0xC418,\n\t0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C,\t0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420,\n\t0x9C87, 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425,\t0x9C8B, 0xC426, 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429,\n\t0x9C8F, 0xC42A, 0x9C90, 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E,\t0x9C93, 0xC42F, 0x9C94, 0xC431, 0x9C95, 0xC432, 0x9C96, 0xC433,\n\t0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, 0xC437, 0x9C9A, 0xC438,\t0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, 0x9C9E, 0xC43E,\n\t0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, 0xC442,\t0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446,\n\t0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B,\t0x9CAB, 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F,\n\t0x9CAF, 0xC450, 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453,\t0x9CB3, 0xC454, 0x9CB4, 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457,\n\t0x9CB7, 0xC458, 0x9CB8, 0xC459, 0x9CB9, 0xC45A, 0x9CBA, 0xC45B,\t0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, 0xC45E, 0x9CBE, 0xC45F,\n\t0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, 0x9CC2, 0xC463,\t0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, 0xC46A,\n\t0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F,\t0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473,\n\t0x9CCF, 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A,\t0x9CD3, 0xC47B, 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E,\n\t0x9CD7, 0xC47F, 0x9CD8, 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483,\t0x9CDB, 0xC484, 0x9CDC, 0xC485, 0x9CDD, 0xC486, 0x9CDE, 0xC487,\n\t0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, 0xC48A, 0x9CE2, 0xC48B,\t0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, 0x9CE6, 0xC48F,\n\t0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, 0xC493,\t0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498,\n\t0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D,\t0x9CF3, 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1,\n\t0x9CF7, 0xC4A2, 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5,\t0x9CFB, 0xC4A6, 0x9CFC, 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9,\n\t0x9D41, 0xC4AA, 0x9D42, 0xC4AB, 0x9D43, 0xC4AC, 0x9D44, 0xC4AD,\t0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, 0xC4B0, 0x9D48, 0xC4B1,\n\t0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, 0x9D4C, 0xC4B5,\t0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, 0xC4BA,\n\t0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF,\t0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3,\n\t0x9D59, 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7,\t0x9D63, 0xC4C8, 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB,\n\t0x9D67, 0xC4CC, 0x9D68, 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF,\t0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3,\n\t0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, 0xC4D6, 0x9D72, 0xC4D7,\t0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, 0x9D76, 0xC4DB,\n\t0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, 0xC4DF,\t0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3,\n\t0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7,\t0x9D89, 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC,\n\t0x9D8D, 0xC4ED, 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2,\t0x9D91, 0xC4F3, 0x9D92, 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7,\n\t0x9D95, 0xC4F9, 0x9D96, 0xC4FB, 0x9D97, 0xC4FC, 0x9D98, 0xC4FD,\t0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, 0xC503, 0x9D9C, 0xC504,\n\t0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, 0x9DA0, 0xC508,\t0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, 0xC50D,\n\t0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512,\t0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517,\n\t0x9DAD, 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B,\t0x9DB1, 0xC51D, 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520,\n\t0x9DB5, 0xC521, 0x9DB6, 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524,\t0x9DB9, 0xC525, 0x9DBA, 0xC526, 0x9DBB, 0xC527, 0x9DBC, 0xC52A,\n\t0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, 0xC52E, 0x9DC0, 0xC52F,\t0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, 0x9DC4, 0xC534,\n\t0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, 0xC53A,\t0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540,\n\t0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546,\t0x9DD1, 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550,\n\t0x9DD5, 0xC551, 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A,\t0x9DD9, 0xC55B, 0x9DDA, 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562,\n\t0x9DDD, 0xC563, 0x9DDE, 0xC565, 0x9DDF, 0xC566, 0x9DE0, 0xC567,\t0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, 0xC56B, 0x9DE4, 0xC56C,\n\t0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, 0x9DE8, 0xC572,\t0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, 0xC579,\n\t0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F,\t0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585,\n\t0x9DF5, 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A,\t0x9DF9, 0xC58B, 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592,\n\t0x9DFD, 0xC593, 0x9DFE, 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599,\t0x9E43, 0xC59A, 0x9E44, 0xC59B, 0x9E45, 0xC59D, 0x9E46, 0xC59E,\n\t0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, 0xC5A2, 0x9E4A, 0xC5A3,\t0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, 0x9E4E, 0xC5A7,\n\t0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, 0xC5AC,\t0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0,\n\t0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6,\t0x9E61, 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0,\n\t0x9E65, 0xC5C1, 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB,\t0x9E69, 0xC5CD, 0x9E6A, 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3,\n\t0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9,\t0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, 0xC5DC, 0x9E74, 0xC5DD,\n\t0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, 0x9E78, 0xC5E4,\t0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, 0xC5E9,\n\t0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1,\t0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8,\n\t0x9E8B, 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602,\t0x9E8F, 0xC603, 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A,\n\t0x9E93, 0xC60B, 0x9E94, 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F,\t0x9E97, 0xC611, 0x9E98, 0xC612, 0x9E99, 0xC613, 0x9E9A, 0xC614,\n\t0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, 0xC617, 0x9E9E, 0xC61A,\t0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, 0x9EA2, 0xC620,\n\t0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, 0xC626,\t0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B,\n\t0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636,\t0x9EAF, 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D,\n\t0x9EB3, 0xC63E, 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643,\t0x9EB7, 0xC645, 0x9EB8, 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649,\n\t0x9EBB, 0xC64A, 0x9EBC, 0xC64B, 0x9EBD, 0xC64C, 0x9EBE, 0xC64D,\t0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, 0xC652, 0x9EC2, 0xC656,\n\t0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, 0x9EC6, 0xC65A,\t0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, 0xC661,\n\t0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665,\t0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669,\n\t0x9ED3, 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E,\t0x9ED7, 0xC670, 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674,\n\t0x9EDB, 0xC675, 0x9EDC, 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A,\t0x9EDF, 0xC67B, 0x9EE0, 0xC67D, 0x9EE1, 0xC67E, 0x9EE2, 0xC67F,\n\t0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, 0xC683, 0x9EE6, 0xC684,\t0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, 0x9EEA, 0xC68A,\n\t0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, 0xC690,\t0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696,\n\t0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B,\t0x9EF7, 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0,\n\t0x9EFB, 0xC6A1, 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6,\t0x9F41, 0xC6A8, 0x9F42, 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC,\n\t0x9F45, 0xC6AD, 0x9F46, 0xC6AE, 0x9F47, 0xC6AF, 0x9F48, 0xC6B2,\t0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, 0xC6B6, 0x9F4C, 0xC6B7,\n\t0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, 0x9F50, 0xC6BE,\t0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, 0xC6C6,\n\t0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA,\t0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1,\n\t0x9F63, 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6,\t0x9F67, 0xC6D7, 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA,\n\t0x9F6B, 0xC6DB, 0x9F6C, 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2,\t0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, 0x9F71, 0xC6E5, 0x9F72, 0xC6E6,\n\t0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, 0xC6EB, 0x9F76, 0xC6ED,\t0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, 0x9F7A, 0xC6F2,\n\t0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, 0xC6F6,\t0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC,\n\t0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701,\t0x9F8D, 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707,\n\t0x9F91, 0xC709, 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D,\t0x9F95, 0xC70E, 0x9F96, 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711,\n\t0x9F99, 0xC712, 0x9F9A, 0xC713, 0x9F9B, 0xC716, 0x9F9C, 0xC718,\t0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, 0xC71C, 0x9FA0, 0xC71D,\n\t0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, 0x9FA4, 0xC723,\t0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, 0xC729,\n\t0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D,\t0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734,\n\t0x9FB1, 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A,\t0x9FB5, 0xC73B, 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741,\n\t0x9FB9, 0xC742, 0x9FBA, 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746,\t0x9FBD, 0xC747, 0x9FBE, 0xC748, 0x9FBF, 0xC749, 0x9FC0, 0xC74B,\n\t0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, 0xC759, 0x9FC4, 0xC75A,\t0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, 0x9FC8, 0xC75F,\n\t0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, 0xC764,\t0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769,\n\t0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E,\t0x9FD5, 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772,\n\t0x9FD9, 0xC773, 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779,\t0x9FDD, 0xC77A, 0x9FDE, 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780,\n\t0x9FE1, 0xC781, 0x9FE2, 0xC782, 0x9FE3, 0xC786, 0x9FE4, 0xC78B,\t0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, 0xC78F, 0x9FE8, 0xC792,\n\t0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, 0x9FEC, 0xC79B,\t0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, 0xC79F,\n\t0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9,\t0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF,\n\t0x9FF9, 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5,\t0x9FFD, 0xC7B6, 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9,\n\t0xA043, 0xC7BA, 0xA044, 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2,\t0xA047, 0xC7C3, 0xA048, 0xC7C4, 0xA049, 0xC7C5, 0xA04A, 0xC7C6,\n\t0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, 0xC7CB, 0xA04E, 0xC7CD,\t0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, 0xA052, 0xC7D3,\n\t0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, 0xC7D7,\t0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC,\n\t0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1,\t0xA065, 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6,\n\t0xA069, 0xC7E7, 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB,\t0xA06D, 0xC7ED, 0xA06E, 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0,\n\t0xA071, 0xC7F1, 0xA072, 0xC7F2, 0xA073, 0xC7F3, 0xA074, 0xC7F4,\t0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, 0xC7F7, 0xA078, 0xC7F8,\n\t0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, 0xA082, 0xC7FC,\t0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, 0xC802,\n\t0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807,\t0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D,\n\t0xA08F, 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814,\t0xA093, 0xC817, 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A,\n\t0xA097, 0xC81B, 0xA098, 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821,\t0xA09B, 0xC822, 0xA09C, 0xC823, 0xA09D, 0xC825, 0xA09E, 0xC826,\n\t0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, 0xC829, 0xA0A2, 0xC82A,\t0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, 0xA0A6, 0xC832,\n\t0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, 0xC836,\t0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B,\n\t0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841,\t0xA0B3, 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845,\n\t0xA0B7, 0xC846, 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B,\t0xA0BB, 0xC84E, 0xA0BC, 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851,\n\t0xA0BF, 0xC852, 0xA0C0, 0xC853, 0xA0C1, 0xC855, 0xA0C2, 0xC856,\t0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, 0xC859, 0xA0C6, 0xC85A,\n\t0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, 0xA0CA, 0xC85E,\t0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, 0xC862,\n\t0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866,\t0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A,\n\t0xA0D7, 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E,\t0xA0DB, 0xC86F, 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875,\n\t0xA0DF, 0xC876, 0xA0E0, 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B,\t0xA0E3, 0xC87C, 0xA0E4, 0xC87D, 0xA0E5, 0xC87E, 0xA0E6, 0xC87F,\n\t0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, 0xC888, 0xA0EA, 0xC889,\t0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, 0xA0EE, 0xC890,\n\t0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, 0xC895,\t0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899,\n\t0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E,\t0xA0FB, 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4,\n\t0xA141, 0xC8A5, 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9,\t0xA145, 0xC8AA, 0xA146, 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD,\n\t0xA149, 0xC8AE, 0xA14A, 0xC8AF, 0xA14B, 0xC8B0, 0xA14C, 0xC8B1,\t0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, 0xC8B4, 0xA150, 0xC8B5,\n\t0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, 0xA154, 0xC8B9,\t0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, 0xC8BF,\n\t0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3,\t0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9,\n\t0xA167, 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE,\t0xA16B, 0xC8CF, 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2,\n\t0xA16F, 0xC8D3, 0xA170, 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA,\t0xA173, 0xC8DB, 0xA174, 0xC8DC, 0xA175, 0xC8DD, 0xA176, 0xC8DE,\n\t0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, 0xC8E3, 0xA17A, 0xC8E5,\t0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, 0xA184, 0xC8E9,\n\t0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, 0xC8ED,\t0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1,\n\t0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6,\t0xA191, 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA,\n\t0xA195, 0xC8FB, 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901,\t0xA199, 0xC902, 0xA19A, 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908,\n\t0xA19D, 0xC909, 0xA19E, 0xC90A, 0xA19F, 0xC90B, 0xA1A0, 0xC90E,\t0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7,\n\t0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, 0xA1A8, 0x3003,\t0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, 0xFF3C,\n\t0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C,\t0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008,\n\t0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C,\t0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010,\n\t0xA1BD, 0x3011, 0xA1BE, 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7,\t0xA1C1, 0x2260, 0xA1C2, 0x2264, 0xA1C3, 0x2265, 0xA1C4, 0x221E,\n\t0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, 0x2032, 0xA1C8, 0x2033,\t0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, 0xA1CC, 0xFFE1,\n\t0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, 0x2220,\t0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207,\n\t0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B,\t0xA1D9, 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF,\n\t0xA1DD, 0x25CE, 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1,\t0xA1E1, 0x25A0, 0xA1E2, 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD,\n\t0xA1E5, 0x25BC, 0xA1E6, 0x2192, 0xA1E7, 0x2190, 0xA1E8, 0x2191,\t0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, 0x3013, 0xA1EC, 0x226A,\n\t0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, 0xA1F0, 0x221D,\t0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, 0x2208,\n\t0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282,\t0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227,\n\t0xA1FD, 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912,\t0xA243, 0xC913, 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916,\n\t0xA247, 0xC917, 0xA248, 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B,\t0xA24B, 0xC91C, 0xA24C, 0xC91D, 0xA24D, 0xC91E, 0xA24E, 0xC91F,\n\t0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, 0xC922, 0xA252, 0xC923,\t0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, 0xA256, 0xC927,\n\t0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, 0xC92B,\t0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930,\n\t0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935,\t0xA269, 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939,\n\t0xA26D, 0xC93A, 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D,\t0xA271, 0xC93E, 0xA272, 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941,\n\t0xA275, 0xC942, 0xA276, 0xC943, 0xA277, 0xC944, 0xA278, 0xC945,\t0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, 0xC948, 0xA282, 0xC949,\n\t0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, 0xA286, 0xC94D,\t0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, 0xC953,\n\t0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959,\t0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D,\n\t0xA293, 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964,\t0xA297, 0xC965, 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968,\n\t0xA29B, 0xC969, 0xA29C, 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D,\t0xA29F, 0xC96E, 0xA2A0, 0xC96F, 0xA2A1, 0x21D2, 0xA2A2, 0x21D4,\n\t0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, 0x00B4, 0xA2A6, 0xFF5E,\t0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, 0xA2AA, 0x02DA,\n\t0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, 0x00A1,\t0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211,\n\t0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030,\t0xA2B7, 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6,\n\t0xA2BB, 0x2664, 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665,\t0xA2BF, 0x2667, 0xA2C0, 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8,\n\t0xA2C3, 0x25A3, 0xA2C4, 0x25D0, 0xA2C5, 0x25D1, 0xA2C6, 0x2592,\t0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, 0x25A8, 0xA2CA, 0x25A7,\n\t0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, 0xA2CE, 0x260F,\t0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, 0x00B6,\n\t0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197,\t0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D,\n\t0xA2DB, 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F,\t0xA2DF, 0x321C, 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122,\n\t0xA2E3, 0x33C2, 0xA2E4, 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC,\t0xA2E7, 0x00AE, 0xA341, 0xC971, 0xA342, 0xC972, 0xA343, 0xC973,\n\t0xA344, 0xC975, 0xA345, 0xC976, 0xA346, 0xC977, 0xA347, 0xC978,\t0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, 0xA34B, 0xC97D,\n\t0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, 0xC981,\t0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985,\n\t0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B,\t0xA358, 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991,\n\t0xA362, 0xC992, 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995,\t0xA366, 0xC996, 0xA367, 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C,\n\t0xA36A, 0xC99E, 0xA36B, 0xC99F, 0xA36C, 0xC9A0, 0xA36D, 0xC9A1,\t0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, 0xC9A4, 0xA371, 0xC9A5,\n\t0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, 0xA375, 0xC9A9,\t0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, 0xC9AD,\n\t0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1,\t0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5,\n\t0xA388, 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9,\t0xA38C, 0xC9BA, 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD,\n\t0xA390, 0xC9BE, 0xA391, 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3,\t0xA394, 0xC9C5, 0xA395, 0xC9C6, 0xA396, 0xC9C9, 0xA397, 0xC9CB,\n\t0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, 0xC9CE, 0xA39B, 0xC9CF,\t0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, 0xA39F, 0xC9D8,\n\t0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03,\t0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07,\n\t0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B,\t0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F,\n\t0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13,\t0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17,\n\t0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B,\t0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F,\n\t0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23,\t0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27,\n\t0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B,\t0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F,\n\t0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33,\t0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37,\n\t0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B,\t0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F,\n\t0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43,\t0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47,\n\t0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B,\t0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F,\n\t0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53,\t0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57,\n\t0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B,\t0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE,\n\t0xA442, 0xC9DF, 0xA443, 0xC9E1, 0xA444, 0xC9E3, 0xA445, 0xC9E5,\t0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, 0xC9E9, 0xA449, 0xC9EA,\n\t0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, 0xA44D, 0xC9F3,\t0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, 0xC9F7,\n\t0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE,\t0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03,\n\t0xA45A, 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07,\t0xA464, 0xCA0A, 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10,\n\t0xA468, 0xCA11, 0xA469, 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15,\t0xA46C, 0xCA16, 0xA46D, 0xCA17, 0xA46E, 0xCA19, 0xA46F, 0xCA1A,\n\t0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, 0xCA1D, 0xA473, 0xCA1E,\t0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, 0xA477, 0xCA22,\n\t0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, 0xCA26,\t0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B,\n\t0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F,\t0xA48A, 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33,\n\t0xA48E, 0xCA34, 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37,\t0xA492, 0xCA38, 0xA493, 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B,\n\t0xA496, 0xCA3C, 0xA497, 0xCA3D, 0xA498, 0xCA3E, 0xA499, 0xCA3F,\t0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, 0xCA42, 0xA49D, 0xCA43,\n\t0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, 0xA4A1, 0x3131,\t0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, 0x3135,\n\t0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139,\t0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D,\n\t0xA4AE, 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141,\t0xA4B2, 0x3142, 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145,\n\t0xA4B6, 0x3146, 0xA4B7, 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149,\t0xA4BA, 0x314A, 0xA4BB, 0x314B, 0xA4BC, 0x314C, 0xA4BD, 0x314D,\n\t0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, 0x3150, 0xA4C1, 0x3151,\t0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, 0xA4C5, 0x3155,\n\t0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, 0x3159,\t0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D,\n\t0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161,\t0xA4D2, 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165,\n\t0xA4D6, 0x3166, 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169,\t0xA4DA, 0x316A, 0xA4DB, 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D,\n\t0xA4DE, 0x316E, 0xA4DF, 0x316F, 0xA4E0, 0x3170, 0xA4E1, 0x3171,\t0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, 0x3174, 0xA4E5, 0x3175,\n\t0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, 0xA4E9, 0x3179,\t0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, 0x317D,\n\t0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181,\t0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185,\n\t0xA4F6, 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189,\t0xA4FA, 0x318A, 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D,\n\t0xA4FE, 0x318E, 0xA541, 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49,\t0xA544, 0xCA4A, 0xA545, 0xCA4B, 0xA546, 0xCA4E, 0xA547, 0xCA4F,\n\t0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, 0xCA53, 0xA54B, 0xCA55,\t0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, 0xA54F, 0xCA59,\n\t0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, 0xCA62,\t0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66,\n\t0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B,\t0xA562, 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F,\n\t0xA566, 0xCA70, 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73,\t0xA56A, 0xCA74, 0xA56B, 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77,\n\t0xA56E, 0xCA78, 0xA56F, 0xCA79, 0xA570, 0xCA7A, 0xA571, 0xCA7B,\t0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, 0xCA7F, 0xA575, 0xCA80,\n\t0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, 0xA579, 0xCA85,\t0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, 0xCA89,\n\t0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D,\t0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91,\n\t0xA58C, 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95,\t0xA590, 0xCA96, 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A,\n\t0xA594, 0xCA9B, 0xA595, 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E,\t0xA598, 0xCA9F, 0xA599, 0xCAA0, 0xA59A, 0xCAA1, 0xA59B, 0xCAA2,\n\t0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, 0xCAA5, 0xA59F, 0xCAA6,\t0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, 0xA5A3, 0x2172,\n\t0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, 0x2176,\t0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160,\n\t0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164,\t0xA5B5, 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168,\n\t0xA5B9, 0x2169, 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393,\t0xA5C4, 0x0394, 0xA5C5, 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397,\n\t0xA5C8, 0x0398, 0xA5C9, 0x0399, 0xA5CA, 0x039A, 0xA5CB, 0x039B,\t0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, 0x039E, 0xA5CF, 0x039F,\n\t0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, 0xA5D3, 0x03A4,\t0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, 0x03A8,\n\t0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3,\t0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7,\n\t0xA5E8, 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB,\t0xA5EC, 0x03BC, 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF,\n\t0xA5F0, 0x03C0, 0xA5F1, 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4,\t0xA5F4, 0x03C5, 0xA5F5, 0x03C6, 0xA5F6, 0x03C7, 0xA5F7, 0x03C8,\n\t0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, 0xCAA9, 0xA643, 0xCAAA,\t0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, 0xA647, 0xCAAE,\n\t0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, 0xCAB2,\t0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6,\n\t0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA,\t0xA654, 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1,\n\t0xA658, 0xCAC2, 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6,\t0xA662, 0xCAC7, 0xA663, 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA,\n\t0xA666, 0xCACB, 0xA667, 0xCACE, 0xA668, 0xCAD0, 0xA669, 0xCAD2,\t0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, 0xCAD6, 0xA66D, 0xCAD7,\n\t0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, 0xA671, 0xCADD,\t0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, 0xCAE2,\n\t0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6,\t0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA,\n\t0xA684, 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF,\t0xA688, 0xCAF0, 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3,\n\t0xA68C, 0xCAF5, 0xA68D, 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8,\t0xA690, 0xCAF9, 0xA691, 0xCAFA, 0xA692, 0xCAFB, 0xA693, 0xCAFC,\n\t0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, 0xCAFF, 0xA697, 0xCB00,\t0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, 0xA69B, 0xCB04,\n\t0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, 0xCB09,\t0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C,\n\t0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C,\t0xA6A8, 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C,\n\t0xA6AC, 0x2501, 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513,\t0xA6B0, 0x251B, 0xA6B1, 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533,\n\t0xA6B4, 0x252B, 0xA6B5, 0x253B, 0xA6B6, 0x254B, 0xA6B7, 0x2520,\t0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, 0x2537, 0xA6BB, 0x253F,\n\t0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, 0xA6BF, 0x2538,\t0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, 0x251A,\n\t0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E,\t0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521,\n\t0xA6CC, 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529,\t0xA6D0, 0x252A, 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531,\n\t0xA6D4, 0x2532, 0xA6D5, 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539,\t0xA6D8, 0x253A, 0xA6D9, 0x253D, 0xA6DA, 0x253E, 0xA6DB, 0x2540,\n\t0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, 0x2544, 0xA6DF, 0x2545,\t0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, 0xA6E3, 0x2549,\n\t0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, 0xCB0D,\t0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12,\n\t0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17,\t0xA74C, 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C,\n\t0xA750, 0xCB1D, 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22,\t0xA754, 0xCB23, 0xA755, 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26,\n\t0xA758, 0xCB27, 0xA759, 0xCB28, 0xA75A, 0xCB29, 0xA761, 0xCB2A,\t0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, 0xCB2D, 0xA765, 0xCB2E,\n\t0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, 0xA769, 0xCB32,\t0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, 0xCB36,\n\t0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A,\t0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E,\n\t0xA776, 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43,\t0xA77A, 0xCB44, 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47,\n\t0xA784, 0xCB4A, 0xA785, 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E,\t0xA788, 0xCB4F, 0xA789, 0xCB51, 0xA78A, 0xCB52, 0xA78B, 0xCB53,\n\t0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, 0xCB56, 0xA78F, 0xCB57,\t0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, 0xA793, 0xCB5E,\n\t0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, 0xCB62,\t0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67,\n\t0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B,\t0xA7A0, 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397,\n\t0xA7A4, 0x2113, 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3,\t0xA7A8, 0x33A4, 0xA7A9, 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399,\n\t0xA7AC, 0x339A, 0xA7AD, 0x339B, 0xA7AE, 0x339C, 0xA7AF, 0x339D,\t0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, 0x33A0, 0xA7B3, 0x33A1,\n\t0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, 0xA7B7, 0x338E,\t0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, 0x3389,\n\t0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0,\t0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4,\n\t0xA7C4, 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8,\t0xA7C8, 0x33B9, 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382,\n\t0xA7CC, 0x3383, 0xA7CD, 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB,\t0xA7D0, 0x33BC, 0xA7D1, 0x33BD, 0xA7D2, 0x33BE, 0xA7D3, 0x33BF,\n\t0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, 0x3392, 0xA7D7, 0x3393,\t0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, 0xA7DB, 0x33C1,\n\t0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, 0x33D6,\t0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF,\n\t0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB,\t0xA7E8, 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3,\n\t0xA7EC, 0x33C3, 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6,\t0xA841, 0xCB6D, 0xA842, 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70,\n\t0xA845, 0xCB71, 0xA846, 0xCB72, 0xA847, 0xCB73, 0xA848, 0xCB74,\t0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, 0xCB77, 0xA84C, 0xCB7A,\n\t0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, 0xA850, 0xCB7E,\t0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, 0xCB82,\n\t0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86,\t0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A,\n\t0xA863, 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E,\t0xA867, 0xCB8F, 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92,\n\t0xA86B, 0xCB93, 0xA86C, 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96,\t0xA86F, 0xCB97, 0xA870, 0xCB98, 0xA871, 0xCB99, 0xA872, 0xCB9A,\n\t0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, 0xCB9E, 0xA876, 0xCB9F,\t0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, 0xA87A, 0xCBA3,\n\t0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, 0xCBA7,\t0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB,\n\t0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF,\t0xA88D, 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3,\n\t0xA891, 0xCBB4, 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7,\t0xA895, 0xCBB9, 0xA896, 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC,\n\t0xA899, 0xCBBD, 0xA89A, 0xCBBE, 0xA89B, 0xCBBF, 0xA89C, 0xCBC0,\t0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, 0xCBC3, 0xA8A0, 0xCBC4,\n\t0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, 0xA8A4, 0x0126,\t0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, 0x00D8,\n\t0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166,\t0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262,\n\t0xA8B4, 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266,\t0xA8B8, 0x3267, 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A,\n\t0xA8BC, 0x326B, 0xA8BD, 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E,\t0xA8C0, 0x326F, 0xA8C1, 0x3270, 0xA8C2, 0x3271, 0xA8C3, 0x3272,\n\t0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, 0x3275, 0xA8C7, 0x3276,\t0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, 0xA8CB, 0x327A,\n\t0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, 0x24D2,\t0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6,\n\t0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA,\t0xA8D8, 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE,\n\t0xA8DC, 0x24DF, 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2,\t0xA8E0, 0x24E3, 0xA8E1, 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6,\n\t0xA8E4, 0x24E7, 0xA8E5, 0x24E8, 0xA8E6, 0x24E9, 0xA8E7, 0x2460,\t0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, 0x2463, 0xA8EB, 0x2464,\n\t0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, 0xA8EF, 0x2468,\t0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, 0x246C,\n\t0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153,\t0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B,\n\t0xA8FC, 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5,\t0xA942, 0xCBC6, 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9,\n\t0xA946, 0xCBCA, 0xA947, 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD,\t0xA94A, 0xCBCE, 0xA94B, 0xCBCF, 0xA94C, 0xCBD0, 0xA94D, 0xCBD1,\n\t0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, 0xCBD5, 0xA951, 0xCBD6,\t0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, 0xA955, 0xCBDA,\n\t0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, 0xCBDE,\t0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2,\n\t0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8,\t0xA968, 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED,\n\t0xA96C, 0xCBEE, 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1,\t0xA970, 0xCBF2, 0xA971, 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5,\n\t0xA974, 0xCBF6, 0xA975, 0xCBF7, 0xA976, 0xCBF8, 0xA977, 0xCBF9,\t0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, 0xCBFC, 0xA981, 0xCBFD,\n\t0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, 0xA985, 0xCC01,\t0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, 0xCC05,\n\t0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09,\t0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F,\n\t0xA992, 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15,\t0xA996, 0xCC16, 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19,\n\t0xA99A, 0xCC1A, 0xA99B, 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F,\t0xA99E, 0xCC20, 0xA99F, 0xCC23, 0xA9A0, 0xCC24, 0xA9A1, 0x00E6,\n\t0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, 0x0127, 0xA9A5, 0x0131,\t0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, 0xA9A9, 0x0142,\n\t0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, 0x00FE,\t0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200,\n\t0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204,\t0xA9B6, 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208,\n\t0xA9BA, 0x3209, 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C,\t0xA9BE, 0x320D, 0xA9BF, 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210,\n\t0xA9C2, 0x3211, 0xA9C3, 0x3212, 0xA9C4, 0x3213, 0xA9C5, 0x3214,\t0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, 0x3217, 0xA9C9, 0x3218,\n\t0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, 0xA9CD, 0x249C,\t0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, 0x24A0,\n\t0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4,\t0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8,\n\t0xA9DA, 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC,\t0xA9DE, 0x24AD, 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0,\n\t0xA9E2, 0x24B1, 0xA9E3, 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4,\t0xA9E6, 0x24B5, 0xA9E7, 0x2474, 0xA9E8, 0x2475, 0xA9E9, 0x2476,\n\t0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, 0x2479, 0xA9ED, 0x247A,\t0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, 0xA9F1, 0x247E,\n\t0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, 0x2482,\t0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074,\n\t0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083,\t0xA9FE, 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A,\n\t0xAA44, 0xCC2B, 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31,\t0xAA48, 0xCC32, 0xAA49, 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35,\n\t0xAA4C, 0xCC36, 0xAA4D, 0xCC37, 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F,\t0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, 0xCC42, 0xAA53, 0xCC43,\n\t0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, 0xAA57, 0xCC4A,\t0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, 0xCC4F,\n\t0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53,\t0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C,\n\t0xAA6A, 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61,\t0xAA6E, 0xCC62, 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67,\n\t0xAA72, 0xCC69, 0xAA73, 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C,\t0xAA76, 0xCC6D, 0xAA77, 0xCC6E, 0xAA78, 0xCC6F, 0xAA79, 0xCC71,\n\t0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, 0xCC74, 0xAA83, 0xCC76,\t0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, 0xAA87, 0xCC7A,\n\t0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, 0xCC7E,\t0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82,\n\t0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86,\t0xAA94, 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A,\n\t0xAA98, 0xCC8B, 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E,\t0xAA9C, 0xCC8F, 0xAA9D, 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92,\n\t0xAAA0, 0xCC93, 0xAAA1, 0x3041, 0xAAA2, 0x3042, 0xAAA3, 0x3043,\t0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, 0x3046, 0xAAA7, 0x3047,\n\t0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, 0xAAAB, 0x304B,\t0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, 0x304F,\n\t0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053,\t0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057,\n\t0xAAB8, 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B,\t0xAABC, 0x305C, 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F,\n\t0xAAC0, 0x3060, 0xAAC1, 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063,\t0xAAC4, 0x3064, 0xAAC5, 0x3065, 0xAAC6, 0x3066, 0xAAC7, 0x3067,\n\t0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, 0x306A, 0xAACB, 0x306B,\t0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, 0xAACF, 0x306F,\n\t0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, 0x3073,\t0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077,\n\t0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B,\t0xAADC, 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F,\n\t0xAAE0, 0x3080, 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083,\t0xAAE4, 0x3084, 0xAAE5, 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087,\n\t0xAAE8, 0x3088, 0xAAE9, 0x3089, 0xAAEA, 0x308A, 0xAAEB, 0x308B,\t0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, 0x308E, 0xAAEF, 0x308F,\n\t0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, 0xAAF3, 0x3093,\t0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, 0xCC97,\n\t0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E,\t0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3,\n\t0xAB4D, 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7,\t0xAB51, 0xCCAA, 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0,\n\t0xAB55, 0xCCB1, 0xAB56, 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6,\t0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, 0xAB61, 0xCCBA, 0xAB62, 0xCCBB,\n\t0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, 0xCCBF, 0xAB66, 0xCCC0,\t0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, 0xAB6A, 0xCCC6,\n\t0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, 0xCCCC,\t0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1,\n\t0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6,\t0xAB77, 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA,\n\t0xAB81, 0xCCDB, 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE,\t0xAB85, 0xCCDF, 0xAB86, 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2,\n\t0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7,\t0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, 0xCCEA, 0xAB90, 0xCCEB,\n\t0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, 0xAB94, 0xCCF1,\t0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, 0xCCF5,\n\t0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9,\t0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD,\n\t0xABA1, 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4,\t0xABA5, 0x30A5, 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8,\n\t0xABA9, 0x30A9, 0xABAA, 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC,\t0xABAD, 0x30AD, 0xABAE, 0x30AE, 0xABAF, 0x30AF, 0xABB0, 0x30B0,\n\t0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, 0x30B3, 0xABB4, 0x30B4,\t0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, 0xABB8, 0x30B8,\n\t0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, 0x30BC,\t0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0,\n\t0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4,\t0xABC5, 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8,\n\t0xABC9, 0x30C9, 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC,\t0xABCD, 0x30CD, 0xABCE, 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0,\n\t0xABD1, 0x30D1, 0xABD2, 0x30D2, 0xABD3, 0x30D3, 0xABD4, 0x30D4,\t0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, 0x30D7, 0xABD8, 0x30D8,\n\t0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, 0xABDC, 0x30DC,\t0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, 0x30E0,\n\t0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4,\t0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8,\n\t0xABE9, 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC,\t0xABED, 0x30ED, 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0,\n\t0xABF1, 0x30F1, 0xABF2, 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4,\t0xABF5, 0x30F5, 0xABF6, 0x30F6, 0xAC41, 0xCCFE, 0xAC42, 0xCCFF,\n\t0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, 0xCD03, 0xAC46, 0xCD04,\t0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, 0xAC4A, 0xCD0A,\n\t0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, 0xCD0F,\t0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14,\n\t0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A,\t0xAC57, 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20,\n\t0xAC61, 0xCD21, 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25,\t0xAC65, 0xCD26, 0xAC66, 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A,\n\t0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F,\t0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, 0xCD32, 0xAC70, 0xCD33,\n\t0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, 0xAC74, 0xCD37,\t0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, 0xCD3C,\n\t0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40,\t0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44,\n\t0xAC87, 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48,\t0xAC8B, 0xCD49, 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C,\n\t0xAC8F, 0xCD4D, 0xAC90, 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50,\t0xAC93, 0xCD51, 0xAC94, 0xCD52, 0xAC95, 0xCD53, 0xAC96, 0xCD54,\n\t0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, 0xCD57, 0xAC9A, 0xCD58,\t0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, 0xAC9E, 0xCD5D,\n\t0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, 0x0411,\t0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415,\n\t0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418,\t0xACAB, 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C,\n\t0xACAF, 0x041D, 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420,\t0xACB3, 0x0421, 0xACB4, 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424,\n\t0xACB7, 0x0425, 0xACB8, 0x0426, 0xACB9, 0x0427, 0xACBA, 0x0428,\t0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, 0x042B, 0xACBE, 0x042C,\n\t0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, 0xACD1, 0x0430,\t0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, 0x0434,\n\t0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437,\t0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B,\n\t0xACDE, 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F,\t0xACE2, 0x0440, 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443,\n\t0xACE6, 0x0444, 0xACE7, 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447,\t0xACEA, 0x0448, 0xACEB, 0x0449, 0xACEC, 0x044A, 0xACED, 0x044B,\n\t0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, 0x044E, 0xACF1, 0x044F,\t0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, 0xAD44, 0xCD65,\n\t0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, 0xCD69,\t0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70,\n\t0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75,\t0xAD51, 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A,\n\t0xAD55, 0xCD7B, 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E,\t0xAD59, 0xCD7F, 0xAD5A, 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82,\n\t0xAD63, 0xCD83, 0xAD64, 0xCD84, 0xAD65, 0xCD85, 0xAD66, 0xCD86,\t0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, 0xCD8A, 0xAD6A, 0xCD8B,\n\t0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, 0xAD6E, 0xCD8F,\t0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, 0xCD93,\n\t0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A,\t0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F,\n\t0xAD81, 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3,\t0xAD85, 0xCDA6, 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB,\n\t0xAD89, 0xCDAC, 0xAD8A, 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF,\t0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4,\n\t0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, 0xCDB7, 0xAD94, 0xCDB8,\t0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, 0xAD98, 0xCDBC,\n\t0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, 0xCDC0,\t0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5,\n\t0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9,\t0xAE45, 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE,\n\t0xAE49, 0xCDCF, 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3,\t0xAE4D, 0xCDD4, 0xAE4E, 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7,\n\t0xAE51, 0xCDD8, 0xAE52, 0xCDD9, 0xAE53, 0xCDDA, 0xAE54, 0xCDDB,\t0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, 0xCDDE, 0xAE58, 0xCDDF,\n\t0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, 0xAE62, 0xCDE3,\t0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, 0xCDE7,\n\t0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED,\t0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2,\n\t0xAE6F, 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6,\t0xAE73, 0xCDF7, 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE,\n\t0xAE77, 0xCDFF, 0xAE78, 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02,\t0xAE81, 0xCE03, 0xAE82, 0xCE05, 0xAE83, 0xCE06, 0xAE84, 0xCE07,\n\t0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, 0xCE0B, 0xAE88, 0xCE0D,\t0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, 0xAE8C, 0xCE11,\n\t0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, 0xCE16,\t0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B,\n\t0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F,\t0xAE99, 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26,\n\t0xAE9D, 0xCE27, 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B,\t0xAF41, 0xCE2C, 0xAF42, 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F,\n\t0xAF45, 0xCE32, 0xAF46, 0xCE34, 0xAF47, 0xCE36, 0xAF48, 0xCE37,\t0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, 0xCE3A, 0xAF4C, 0xCE3B,\n\t0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, 0xAF50, 0xCE3F,\t0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, 0xCE43,\n\t0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47,\t0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B,\n\t0xAF63, 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F,\t0xAF67, 0xCE50, 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53,\n\t0xAF6B, 0xCE54, 0xAF6C, 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57,\t0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, 0xAF71, 0xCE5D, 0xAF72, 0xCE5E,\n\t0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, 0xCE64, 0xAF76, 0xCE65,\t0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, 0xAF7A, 0xCE6C,\n\t0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, 0xCE71,\t0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77,\n\t0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D,\t0xAF8D, 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81,\n\t0xAF91, 0xCE82, 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88,\t0xAF95, 0xCE8A, 0xAF96, 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D,\n\t0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, 0xAF9B, 0xCE92, 0xAF9C, 0xCE93,\t0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, 0xCE97, 0xAFA0, 0xCE99,\n\t0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, 0xB044, 0xCE9D,\t0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, 0xCEA6,\n\t0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA,\t0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0,\n\t0xB051, 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4,\t0xB055, 0xCEB5, 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8,\n\t0xB059, 0xCEB9, 0xB05A, 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC,\t0xB063, 0xCEBD, 0xB064, 0xCEBE, 0xB065, 0xCEBF, 0xB066, 0xCEC0,\n\t0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, 0xCEC4, 0xB06A, 0xCEC5,\t0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, 0xB06E, 0xCEC9,\n\t0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, 0xCECD,\t0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1,\n\t0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5,\t0xB081, 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9,\n\t0xB085, 0xCEDA, 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD,\t0xB089, 0xCEDE, 0xB08A, 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1,\n\t0xB08D, 0xCEE2, 0xB08E, 0xCEE3, 0xB08F, 0xCEE6, 0xB090, 0xCEE7,\t0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, 0xCEED, 0xB094, 0xCEEE,\n\t0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, 0xB098, 0xCEF2,\t0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, 0xCEFB,\n\t0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF,\t0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07,\n\t0xB0A5, 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10,\t0xB0A9, 0xAC11, 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14,\n\t0xB0AD, 0xAC15, 0xB0AE, 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19,\t0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D,\n\t0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, 0xAC2C, 0xB0B8, 0xAC2D,\t0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, 0xB0BC, 0xAC38,\n\t0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, 0xAC4B,\t0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C,\n\t0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77,\t0xB0C9, 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81,\n\t0xB0CD, 0xAC83, 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86,\t0xB0D1, 0xAC89, 0xB0D2, 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C,\n\t0xB0D5, 0xAC90, 0xB0D6, 0xAC94, 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D,\t0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, 0xACA1, 0xB0DC, 0xACA8,\n\t0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, 0xB0E0, 0xACAF,\t0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, 0xACBB,\n\t0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4,\t0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7,\n\t0xB0ED, 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7,\t0xB0F1, 0xACE8, 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF,\n\t0xB0F5, 0xACF0, 0xB0F6, 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5,\t0xB0F9, 0xACF6, 0xB0FA, 0xACFC, 0xB0FB, 0xACFD, 0xB0FC, 0xAD00,\n\t0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, 0xCF02, 0xB142, 0xCF03,\t0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, 0xB146, 0xCF09,\n\t0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, 0xCF0D,\t0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14,\n\t0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19,\t0xB153, 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E,\n\t0xB157, 0xCF1F, 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23,\t0xB161, 0xCF25, 0xB162, 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28,\n\t0xB165, 0xCF29, 0xB166, 0xCF2A, 0xB167, 0xCF2B, 0xB168, 0xCF2E,\t0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, 0xCF34, 0xB16C, 0xCF35,\n\t0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, 0xB170, 0xCF3A,\t0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, 0xCF3E,\n\t0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42,\t0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46,\n\t0xB183, 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A,\t0xB187, 0xCF4B, 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E,\n\t0xB18B, 0xCF4F, 0xB18C, 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52,\t0xB18F, 0xCF53, 0xB190, 0xCF56, 0xB191, 0xCF57, 0xB192, 0xCF59,\n\t0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, 0xCF5D, 0xB196, 0xCF5E,\t0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, 0xB19A, 0xCF62,\n\t0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, 0xCF6A,\t0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D,\n\t0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C,\t0xB1A7, 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D,\n\t0xB1AB, 0xAD34, 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C,\t0xB1AF, 0xAD44, 0xB1B0, 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49,\n\t0xB1B3, 0xAD50, 0xB1B4, 0xAD54, 0xB1B5, 0xAD58, 0xB1B6, 0xAD61,\t0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, 0xAD6D, 0xB1BA, 0xAD70,\n\t0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, 0xB1BE, 0xAD76,\t0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, 0xAD7F,\n\t0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89,\t0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D,\n\t0xB1CB, 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1,\t0xB1CF, 0xADC4, 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1,\n\t0xB1D3, 0xADD3, 0xB1D4, 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4,\t0xB1D7, 0xADF8, 0xB1D8, 0xADF9, 0xB1D9, 0xADFC, 0xB1DA, 0xADFF,\n\t0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, 0xAE08, 0xB1DE, 0xAE09,\t0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, 0xB1E2, 0xAE30,\n\t0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, 0xAE38,\t0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43,\n\t0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C,\t0xB1EF, 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54,\n\t0xB1F3, 0xAE56, 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F,\t0xB1F7, 0xAE60, 0xB1F8, 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68,\n\t0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, 0xB1FD, 0xAE70, 0xB1FE, 0xAE78,\t0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, 0xCF6F, 0xB244, 0xCF72,\n\t0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, 0xB248, 0xCF77,\t0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, 0xCF7C,\n\t0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81,\t0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86,\n\t0xB255, 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A,\t0xB259, 0xCF8B, 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F,\n\t0xB263, 0xCF90, 0xB264, 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93,\t0xB267, 0xCF94, 0xB268, 0xCF95, 0xB269, 0xCF96, 0xB26A, 0xCF97,\n\t0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, 0xCF9A, 0xB26E, 0xCF9B,\t0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, 0xB272, 0xCF9F,\n\t0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, 0xCFA4,\t0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9,\n\t0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD,\t0xB285, 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2,\n\t0xB289, 0xCFB3, 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6,\t0xB28D, 0xCFB7, 0xB28E, 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA,\n\t0xB291, 0xCFBB, 0xB292, 0xCFBC, 0xB293, 0xCFBD, 0xB294, 0xCFBE,\t0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, 0xCFC1, 0xB298, 0xCFC2,\n\t0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, 0xB29C, 0xCFC7,\t0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, 0xCFCB,\n\t0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D,\t0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC,\n\t0xB2A9, 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4,\t0xB2AD, 0xAECC, 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0,\n\t0xB2B1, 0xAED1, 0xB2B2, 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC,\t0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4,\n\t0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, 0xAF07, 0xB2BC, 0xAF08,\t0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, 0xB2C0, 0xAF2D,\n\t0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, 0xAF3C,\t0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42,\n\t0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50,\t0xB2CD, 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65,\n\t0xB2D1, 0xAF79, 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88,\t0xB2D5, 0xAF90, 0xB2D6, 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C,\n\t0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0,\t0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, 0xAFC9, 0xB2E0, 0xAFCB,\n\t0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, 0xB2E4, 0xAFDC,\t0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, 0xAFF1,\n\t0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001,\t0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014,\n\t0xB2F1, 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044,\t0xB2F5, 0xB045, 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C,\n\t0xB2F9, 0xB04E, 0xB2FA, 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055,\t0xB2FD, 0xB057, 0xB2FE, 0xB059, 0xB341, 0xCFCC, 0xB342, 0xCFCD,\n\t0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, 0xCFD0, 0xB346, 0xCFD1,\t0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, 0xB34A, 0xCFD5,\n\t0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, 0xCFD9,\t0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD,\n\t0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3,\t0xB357, 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9,\n\t0xB361, 0xCFEA, 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED,\t0xB365, 0xCFEE, 0xB366, 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4,\n\t0xB369, 0xCFF6, 0xB36A, 0xCFF7, 0xB36B, 0xCFF8, 0xB36C, 0xCFF9,\t0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, 0xCFFD, 0xB370, 0xCFFE,\n\t0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, 0xB374, 0xD003,\t0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, 0xD008,\n\t0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C,\t0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010,\n\t0xB387, 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015,\t0xB38B, 0xD016, 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A,\n\t0xB38F, 0xD01B, 0xB390, 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E,\t0xB393, 0xD01F, 0xB394, 0xD020, 0xB395, 0xD021, 0xB396, 0xD022,\n\t0xB397, 0xD023, 0xB398, 0xD024, 0xB399, 0xD025, 0xB39A, 0xD026,\t0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, 0xB39E, 0xD02A,\n\t0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, 0xB07C,\t0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C,\n\t0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098,\t0xB3AB, 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F,\n\t0xB3AF, 0xB0A0, 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8,\t0xB3B3, 0xB0A9, 0xB3B4, 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD,\n\t0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3,\t0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, 0xB0B8, 0xB3BE, 0xB0BC,\n\t0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, 0xB3C2, 0xB0C8,\t0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, 0xB0D4,\n\t0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108,\t0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110,\n\t0xB3CF, 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119,\t0xB3D3, 0xB11B, 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123,\n\t0xB3D7, 0xB124, 0xB3D8, 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C,\t0xB3DB, 0xB134, 0xB3DC, 0xB135, 0xB3DD, 0xB137, 0xB3DE, 0xB138,\n\t0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, 0xB141, 0xB3E2, 0xB144,\t0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, 0xB3E6, 0xB154,\n\t0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, 0xB160,\t0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180,\n\t0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B,\t0xB3F3, 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194,\n\t0xB3F7, 0xB198, 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC,\t0xB3FB, 0xB1D0, 0xB3FC, 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD,\n\t0xB441, 0xD02E, 0xB442, 0xD02F, 0xB443, 0xD030, 0xB444, 0xD031,\t0xB445, 0xD032, 0xB446, 0xD033, 0xB447, 0xD036, 0xB448, 0xD037,\n\t0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, 0xB44C, 0xD03D,\t0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, 0xD041,\n\t0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048,\t0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D,\n\t0xB459, 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052,\t0xB463, 0xD053, 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057,\n\t0xB467, 0xD059, 0xB468, 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C,\t0xB46B, 0xD05D, 0xB46C, 0xD05E, 0xB46D, 0xD05F, 0xB46E, 0xD061,\n\t0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, 0xD064, 0xB472, 0xD065,\t0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, 0xB476, 0xD069,\n\t0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, 0xD06F,\t0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075,\n\t0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079,\t0xB489, 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F,\n\t0xB48D, 0xD080, 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084,\t0xB491, 0xD085, 0xB492, 0xD086, 0xB493, 0xD087, 0xB494, 0xD088,\n\t0xB495, 0xD089, 0xB496, 0xD08A, 0xB497, 0xD08B, 0xB498, 0xD08C,\t0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, 0xD08F, 0xB49C, 0xD090,\n\t0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, 0xB4A0, 0xD094,\t0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, 0xB1EC,\n\t0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD,\t0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B,\n\t0xB4AD, 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217,\t0xB4B1, 0xB219, 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C,\n\t0xB4B5, 0xB258, 0xB4B6, 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268,\t0xB4B9, 0xB269, 0xB4BA, 0xB274, 0xB4BB, 0xB275, 0xB4BC, 0xB27C,\n\t0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, 0xB289, 0xB4C0, 0xB290,\t0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, 0xB4C4, 0xB299,\n\t0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, 0xB2A3,\t0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC,\n\t0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9,\t0xB4D1, 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8,\n\t0xB4D5, 0xB2D9, 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2,\t0xB4D9, 0xB2E4, 0xB4DA, 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8,\n\t0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE,\t0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, 0xB2F4, 0xB4E4, 0xB2F5,\n\t0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, 0xB4E8, 0xB2FA,\t0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, 0xB301,\n\t0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311,\t0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C,\n\t0xB4F5, 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358,\t0xB4F9, 0xB35B, 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F,\n\t0xB4FD, 0xB364, 0xB4FE, 0xB365, 0xB541, 0xD095, 0xB542, 0xD096,\t0xB543, 0xD097, 0xB544, 0xD098, 0xB545, 0xD099, 0xB546, 0xD09A,\n\t0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, 0xD09D, 0xB54A, 0xD09E,\t0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, 0xB54E, 0xD0A2,\n\t0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, 0xD0A9,\t0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE,\n\t0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2,\t0xB561, 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA,\n\t0xB565, 0xD0BB, 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE,\t0xB569, 0xD0BF, 0xB56A, 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5,\n\t0xB56D, 0xD0C6, 0xB56E, 0xD0C7, 0xB56F, 0xD0CA, 0xB570, 0xD0CB,\t0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, 0xD0CE, 0xB574, 0xD0CF,\n\t0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, 0xB578, 0xD0D8,\t0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, 0xD0DE,\n\t0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3,\t0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8,\n\t0xB58B, 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE,\t0xB58F, 0xD0F2, 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5,\n\t0xB593, 0xD0F6, 0xB594, 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA,\t0xB597, 0xD0FB, 0xB598, 0xD0FC, 0xB599, 0xD0FD, 0xB59A, 0xD0FE,\n\t0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, 0xD101, 0xB59E, 0xD102,\t0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, 0xB5A2, 0xB369,\n\t0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, 0xB371,\t0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381,\n\t0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C,\t0xB5AF, 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1,\n\t0xB5B3, 0xB3A8, 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5,\t0xB5B7, 0xB3C8, 0xB5B8, 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE,\n\t0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7,\t0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, 0xB3DD, 0xB5C2, 0xB3E0,\n\t0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, 0xB5C6, 0xB410,\t0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, 0xB428,\n\t0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450,\t0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460,\n\t0xB5D3, 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C,\t0xB5D7, 0xB480, 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4,\n\t0xB5DB, 0xB4A8, 0xB5DC, 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7,\t0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8,\n\t0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, 0xB4DC, 0xB5E6, 0xB4DD,\t0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, 0xB5EA, 0xB4E6,\n\t0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, 0xB4F1,\t0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518,\n\t0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525,\t0xB5F7, 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A,\n\t0xB5FB, 0xB530, 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538,\t0xB641, 0xD105, 0xB642, 0xD106, 0xB643, 0xD107, 0xB644, 0xD108,\n\t0xB645, 0xD109, 0xB646, 0xD10A, 0xB647, 0xD10B, 0xB648, 0xD10C,\t0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, 0xD110, 0xB64C, 0xD111,\n\t0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, 0xB650, 0xD115,\t0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, 0xD119,\n\t0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D,\t0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121,\n\t0xB663, 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125,\t0xB667, 0xD126, 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129,\n\t0xB66B, 0xD12A, 0xB66C, 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D,\t0xB66F, 0xD12E, 0xB670, 0xD12F, 0xB671, 0xD132, 0xB672, 0xD133,\n\t0xB673, 0xD135, 0xB674, 0xD136, 0xB675, 0xD137, 0xB676, 0xD139,\t0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, 0xB67A, 0xD13E,\n\t0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, 0xD147,\t0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B,\n\t0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152,\t0xB68D, 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157,\n\t0xB691, 0xD158, 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B,\t0xB695, 0xD15E, 0xB696, 0xD160, 0xB697, 0xD162, 0xB698, 0xD163,\n\t0xB699, 0xD164, 0xB69A, 0xD165, 0xB69B, 0xD166, 0xB69C, 0xD167,\t0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, 0xD16B, 0xB6A0, 0xD16D,\n\t0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, 0xB6A4, 0xB544,\t0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, 0xB54D,\n\t0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D,\t0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0,\n\t0xB6B1, 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA,\t0xB6B5, 0xB5AB, 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3,\n\t0xB6B9, 0xB5B4, 0xB6BA, 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC,\t0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC,\n\t0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, 0xB5D0, 0xB6C4, 0xB5D1,\t0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, 0xB6C8, 0xB611,\n\t0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, 0xB62C,\t0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668,\n\t0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4,\t0xB6D5, 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4,\n\t0xB6D9, 0xB6F0, 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700,\t0xB6DD, 0xB701, 0xB6DE, 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729,\n\t0xB6E1, 0xB72C, 0xB6E2, 0xB72F, 0xB6E3, 0xB730, 0xB6E4, 0xB738,\t0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, 0xB744, 0xB6E8, 0xB748,\n\t0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, 0xB6EC, 0xB760,\t0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, 0xB771,\n\t0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D,\t0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D,\n\t0xB6F9, 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792,\t0xB6FD, 0xB796, 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F,\n\t0xB743, 0xD170, 0xB744, 0xD171, 0xB745, 0xD172, 0xB746, 0xD173,\t0xB747, 0xD174, 0xB748, 0xD175, 0xB749, 0xD176, 0xB74A, 0xD177,\n\t0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, 0xD17A, 0xB74E, 0xD17B,\t0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, 0xB752, 0xD180,\n\t0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, 0xD185,\t0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A,\n\t0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E,\t0xB765, 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192,\n\t0xB769, 0xD193, 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196,\t0xB76D, 0xD197, 0xB76E, 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A,\n\t0xB771, 0xD19B, 0xB772, 0xD19C, 0xB773, 0xD19D, 0xB774, 0xD19E,\t0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, 0xD1A3, 0xB778, 0xD1A5,\n\t0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, 0xB782, 0xD1AA,\t0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, 0xD1AE,\n\t0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6,\t0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB,\n\t0xB78F, 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1,\t0xB793, 0xD1C2, 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5,\n\t0xB797, 0xD1C6, 0xB798, 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9,\t0xB79B, 0xD1CA, 0xB79C, 0xD1CB, 0xB79D, 0xD1CC, 0xB79E, 0xD1CD,\n\t0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, 0xB798, 0xB7A2, 0xB799,\t0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, 0xB7A6, 0xB7A9,\n\t0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, 0xB7B4,\t0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9,\n\t0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4,\t0xB7B3, 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800,\n\t0xB7B7, 0xB801, 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809,\t0xB7BB, 0xB80C, 0xB7BC, 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819,\n\t0xB7BF, 0xB81B, 0xB7C0, 0xB81D, 0xB7C1, 0xB824, 0xB7C2, 0xB825,\t0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, 0xB834, 0xB7C6, 0xB835,\n\t0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, 0xB7CA, 0xB840,\t0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, 0xB85C,\n\t0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C,\t0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878,\n\t0xB7D7, 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0,\t0xB7DB, 0xB8B4, 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1,\n\t0xB7DF, 0xB8C3, 0xB7E0, 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0,\t0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1,\n\t0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, 0xB8EC, 0xB7EA, 0xB8F0,\t0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, 0xB7EE, 0xB8FD,\n\t0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, 0xB93C,\t0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C,\n\t0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959,\t0xB7FB, 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969,\n\t0xB841, 0xD1D0, 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3,\t0xB845, 0xD1D4, 0xB846, 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7,\n\t0xB849, 0xD1D9, 0xB84A, 0xD1DA, 0xB84B, 0xD1DB, 0xB84C, 0xD1DC,\t0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, 0xD1DF, 0xB850, 0xD1E0,\n\t0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, 0xB854, 0xD1E4,\t0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, 0xD1E8,\n\t0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC,\t0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0,\n\t0xB867, 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5,\t0xB86B, 0xD1F6, 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA,\n\t0xB86F, 0xD1FB, 0xB870, 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE,\t0xB873, 0xD1FF, 0xB874, 0xD200, 0xB875, 0xD201, 0xB876, 0xD202,\n\t0xB877, 0xD203, 0xB878, 0xD204, 0xB879, 0xD205, 0xB87A, 0xD206,\t0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, 0xB884, 0xD20C,\n\t0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, 0xD211,\t0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215,\n\t0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219,\t0xB891, 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D,\n\t0xB895, 0xD21E, 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221,\t0xB899, 0xD222, 0xB89A, 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225,\n\t0xB89D, 0xD226, 0xB89E, 0xD227, 0xB89F, 0xD228, 0xB8A0, 0xD229,\t0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, 0xB974, 0xB8A4, 0xB975,\n\t0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, 0xB8A8, 0xB985,\t0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, 0xB98D,\n\t0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0,\t0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF,\n\t0xB8B5, 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC,\t0xB8B9, 0xB9CE, 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1,\n\t0xB8BD, 0xB9D2, 0xB8BE, 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB,\t0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3,\n\t0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, 0xB9E8, 0xB8C8, 0xB9EC,\t0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, 0xB8CC, 0xB9F8,\n\t0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, 0xBA01,\t0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39,\n\t0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48,\t0xB8D9, 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E,\n\t0xB8DD, 0xBA53, 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58,\t0xB8E1, 0xBA5C, 0xB8E2, 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67,\n\t0xB8E5, 0xBA68, 0xB8E6, 0xBA69, 0xB8E7, 0xBA70, 0xB8E8, 0xBA71,\t0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, 0xBA83, 0xB8EC, 0xBA84,\n\t0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, 0xB8F0, 0xBAA8,\t0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, 0xBAB0,\n\t0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB,\t0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8,\n\t0xB8FD, 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B,\t0xB943, 0xD22E, 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232,\n\t0xB947, 0xD233, 0xB948, 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237,\t0xB94B, 0xD238, 0xB94C, 0xD239, 0xB94D, 0xD23A, 0xB94E, 0xD23B,\n\t0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, 0xD242, 0xB952, 0xD243,\t0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, 0xB956, 0xD247,\n\t0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, 0xD24C,\t0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250,\n\t0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254,\t0xB969, 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258,\n\t0xB96D, 0xD259, 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D,\t0xB971, 0xD25E, 0xB972, 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261,\n\t0xB975, 0xD262, 0xB976, 0xD263, 0xB977, 0xD265, 0xB978, 0xD266,\t0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, 0xD269, 0xB982, 0xD26A,\n\t0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, 0xB986, 0xD26E,\t0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, 0xD272,\n\t0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276,\t0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A,\n\t0xB993, 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E,\t0xB997, 0xD27F, 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285,\n\t0xB99B, 0xD286, 0xB99C, 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A,\t0xB99F, 0xD28B, 0xB9A0, 0xD28C, 0xB9A1, 0xBB00, 0xB9A2, 0xBB04,\n\t0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, 0xBB11, 0xB9A6, 0xBB18,\t0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, 0xB9AA, 0xBB2B,\n\t0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, 0xBB38,\t0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E,\n\t0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49,\t0xB9B7, 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54,\n\t0xB9BB, 0xBB58, 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C,\t0xB9BF, 0xBB88, 0xB9C0, 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4,\n\t0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7,\t0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, 0xBBC8, 0xB9CA, 0xBBD0,\n\t0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, 0xB9CE, 0xBBFC,\t0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, 0xBC08,\n\t0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D,\t0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15,\n\t0xB9DB, 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B,\t0xB9DF, 0xBC1C, 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F,\n\t0xB9E3, 0xBC24, 0xB9E4, 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29,\t0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, 0xB9E9, 0xBC31, 0xB9EA, 0xBC34,\n\t0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, 0xBC41, 0xB9EE, 0xBC43,\t0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, 0xB9F2, 0xBC4C,\n\t0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, 0xBC84,\t0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C,\n\t0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97,\t0xBA41, 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292,\n\t0xBA45, 0xD293, 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297,\t0xBA49, 0xD298, 0xBA4A, 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B,\n\t0xBA4D, 0xD29D, 0xBA4E, 0xD29E, 0xBA4F, 0xD29F, 0xBA50, 0xD2A1,\t0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, 0xD2A5, 0xBA54, 0xD2A6,\n\t0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, 0xBA58, 0xD2AA,\t0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, 0xD2AF,\n\t0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4,\t0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA,\n\t0xBA6B, 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1,\t0xBA6F, 0xD2C3, 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6,\n\t0xBA73, 0xD2C7, 0xBA74, 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD,\t0xBA77, 0xD2CE, 0xBA78, 0xD2CF, 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1,\n\t0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, 0xD2D5, 0xBA84, 0xD2D6,\t0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, 0xBA88, 0xD2DB,\n\t0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, 0xD2E0,\t0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6,\n\t0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA,\t0xBA95, 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE,\n\t0xBA99, 0xD2EF, 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5,\t0xBA9D, 0xD2F6, 0xBA9E, 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA,\n\t0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1,\t0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, 0xBCA8, 0xBAA8, 0xBCB0,\n\t0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, 0xBAAC, 0xBCB5,\t0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, 0xBCC4,\n\t0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1,\t0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4,\n\t0xBAB9, 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC,\t0xBABD, 0xBD04, 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09,\n\t0xBAC1, 0xBD10, 0xBAC2, 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C,\t0xBAC5, 0xBD40, 0xBAC6, 0xBD48, 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C,\n\t0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, 0xBD59, 0xBACC, 0xBD64,\t0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, 0xBAD0, 0xBD84,\n\t0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, 0xBD8A,\t0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95,\n\t0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4,\t0xBADD, 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5,\n\t0xBAE1, 0xBDD8, 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0,\t0xBAE5, 0xBDF4, 0xBAE6, 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03,\n\t0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10,\t0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, 0xBE1D, 0xBAF0, 0xBE1F,\n\t0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, 0xBAF4, 0xBE4C,\t0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, 0xBE57,\n\t0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60,\t0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC,\n\t0xBB43, 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302,\t0xBB47, 0xD304, 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308,\n\t0xBB4B, 0xD309, 0xBB4C, 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F,\t0xBB4F, 0xD311, 0xBB50, 0xD312, 0xBB51, 0xD313, 0xBB52, 0xD315,\n\t0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, 0xD319, 0xBB56, 0xD31A,\t0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, 0xBB5A, 0xD323,\n\t0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, 0xD32A,\t0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F,\n\t0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334,\t0xBB6D, 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A,\n\t0xBB71, 0xD33E, 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341,\t0xBB75, 0xD342, 0xBB76, 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347,\n\t0xBB79, 0xD348, 0xBB7A, 0xD349, 0xBB81, 0xD34A, 0xBB82, 0xD34B,\t0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, 0xD34E, 0xBB86, 0xD34F,\n\t0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, 0xBB8A, 0xD353,\t0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, 0xD357,\n\t0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B,\t0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F,\n\t0xBB97, 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363,\t0xBB9B, 0xD364, 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367,\n\t0xBB9F, 0xD368, 0xBBA0, 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A,\t0xBBA3, 0xBE70, 0xBBA4, 0xBE71, 0xBBA5, 0xBE73, 0xBBA6, 0xBE74,\n\t0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, 0xBE7C, 0xBBAA, 0xBE7D,\t0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, 0xBBAE, 0xBE8D,\n\t0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, 0xBE98,\t0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1,\n\t0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0,\t0xBBBB, 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC,\n\t0xBBBF, 0xBF01, 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18,\t0xBBC3, 0xBF19, 0xBBC4, 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D,\n\t0xBBC7, 0xBF40, 0xBBC8, 0xBF41, 0xBBC9, 0xBF44, 0xBBCA, 0xBF48,\t0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, 0xBF55, 0xBBCE, 0xBF94,\n\t0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, 0xBBD2, 0xBFCD,\t0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, 0xBFDF,\n\t0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058,\t0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069,\n\t0xBBDF, 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098,\t0xBBE3, 0xC0A0, 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5,\n\t0xBBE7, 0xC0AC, 0xBBE8, 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0,\t0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6,\n\t0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, 0xC0BF, 0xBBF2, 0xC0C0,\t0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, 0xBBF6, 0xC0C9,\n\t0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, 0xC0D9,\t0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4,\n\t0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D,\t0xBC45, 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371,\n\t0xBC49, 0xD372, 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375,\t0xBC4D, 0xD376, 0xBC4E, 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379,\n\t0xBC51, 0xD37A, 0xBC52, 0xD37B, 0xBC53, 0xD37E, 0xBC54, 0xD37F,\t0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, 0xD383, 0xBC58, 0xD385,\n\t0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, 0xBC62, 0xD389,\t0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, 0xD392,\n\t0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396,\t0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D,\n\t0xBC6F, 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2,\t0xBC73, 0xD3A3, 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6,\n\t0xBC77, 0xD3A7, 0xBC78, 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE,\t0xBC81, 0xD3AF, 0xBC82, 0xD3B0, 0xBC83, 0xD3B1, 0xBC84, 0xD3B2,\n\t0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, 0xD3B6, 0xBC88, 0xD3B7,\t0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, 0xBC8C, 0xD3BD,\n\t0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, 0xD3C1,\t0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7,\n\t0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD,\t0xBC99, 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2,\n\t0xBC9D, 0xD3D3, 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6,\t0xBCA1, 0xC0E5, 0xBCA2, 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4,\n\t0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, 0xBCA7, 0xC0F9, 0xBCA8, 0xC100,\t0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, 0xC110, 0xBCAC, 0xC115,\n\t0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, 0xBCB0, 0xC11F,\t0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, 0xC126,\n\t0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F,\t0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138,\n\t0xBCBD, 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148,\t0xBCC1, 0xC149, 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D,\n\t0xBCC5, 0xC154, 0xBCC6, 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C,\t0xBCC9, 0xC164, 0xBCCA, 0xC165, 0xBCCB, 0xC167, 0xBCCC, 0xC168,\n\t0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, 0xC174, 0xBCD0, 0xC178,\t0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, 0xBCD4, 0xC18E,\n\t0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, 0xC19C,\t0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5,\n\t0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0,\t0xBCE1, 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC,\n\t0xBCE5, 0xC1D4, 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0,\t0xBCE9, 0xC1E4, 0xBCEA, 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1,\n\t0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, 0xBCEF, 0xC1FD, 0xBCF0, 0xC200,\t0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, 0xC20D, 0xBCF4, 0xC20F,\n\t0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, 0xBCF8, 0xC21C,\t0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, 0xC229,\n\t0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9,\t0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD,\n\t0xBD47, 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2,\t0xBD4B, 0xD3E4, 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7,\n\t0xBD4F, 0xD3E8, 0xBD50, 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB,\t0xBD53, 0xD3EE, 0xBD54, 0xD3EF, 0xBD55, 0xD3F1, 0xBD56, 0xD3F2,\n\t0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, 0xD3F6, 0xBD5A, 0xD3F7,\t0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, 0xBD64, 0xD3FB,\n\t0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, 0xD403,\t0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407,\n\t0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C,\t0xBD71, 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410,\n\t0xBD75, 0xD411, 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414,\t0xBD79, 0xD415, 0xBD7A, 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418,\n\t0xBD83, 0xD419, 0xBD84, 0xD41A, 0xBD85, 0xD41B, 0xBD86, 0xD41C,\t0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, 0xD420, 0xBD8A, 0xD421,\n\t0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, 0xBD8E, 0xD425,\t0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, 0xD429,\n\t0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D,\t0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431,\n\t0xBD9B, 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435,\t0xBD9F, 0xD436, 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231,\n\t0xBDA3, 0xC232, 0xBDA4, 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250,\t0xBDA7, 0xC251, 0xBDA8, 0xC254, 0xBDA9, 0xC258, 0xBDAA, 0xC260,\n\t0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, 0xC26D, 0xBDAE, 0xC270,\t0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, 0xBDB2, 0xC27F,\n\t0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, 0xC290,\t0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4,\n\t0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD,\t0xBDBF, 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9,\n\t0xBDC3, 0xC2DC, 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3,\t0xBDC7, 0xC2E4, 0xBDC8, 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED,\n\t0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8,\t0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, 0xC2FC, 0xBDD2, 0xC300,\n\t0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, 0xBDD6, 0xC30D,\t0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, 0xC318,\n\t0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328,\t0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369,\n\t0xBDE3, 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378,\t0xBDE7, 0xC379, 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384,\n\t0xBDEB, 0xC388, 0xBDEC, 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8,\t0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0,\n\t0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, 0xC3E9, 0xBDF6, 0xC3ED,\t0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, 0xBDFA, 0xC408,\n\t0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, 0xC430,\t0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B,\n\t0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F,\t0xBE49, 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445,\n\t0xBE4D, 0xD446, 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449,\t0xBE51, 0xD44A, 0xBE52, 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D,\n\t0xBE55, 0xD44E, 0xBE56, 0xD44F, 0xBE57, 0xD450, 0xBE58, 0xD451,\t0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, 0xD454, 0xBE62, 0xD455,\n\t0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, 0xBE66, 0xD459,\t0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, 0xD45E,\n\t0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463,\t0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468,\n\t0xBE73, 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C,\t0xBE77, 0xD46E, 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472,\n\t0xBE81, 0xD473, 0xBE82, 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476,\t0xBE85, 0xD477, 0xBE86, 0xD47A, 0xBE87, 0xD47B, 0xBE88, 0xD47D,\n\t0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, 0xD483, 0xBE8C, 0xD484,\t0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, 0xBE90, 0xD48A,\n\t0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, 0xD490,\t0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495,\n\t0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499,\t0xBE9D, 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D,\n\t0xBEA1, 0xC434, 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448,\t0xBEA5, 0xC464, 0xBEA6, 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C,\n\t0xBEA9, 0xC474, 0xBEAA, 0xC475, 0xBEAB, 0xC479, 0xBEAC, 0xC480,\t0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, 0xC4B8, 0xBEB0, 0xC4BC,\n\t0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, 0xBEB4, 0xC4F4,\t0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, 0xC500,\n\t0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514,\t0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C,\n\t0xBEC1, 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B,\t0xBEC5, 0xC53D, 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548,\n\t0xBEC9, 0xC549, 0xBECA, 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D,\t0xBECD, 0xC54E, 0xBECE, 0xC553, 0xBECF, 0xC554, 0xBED0, 0xC555,\n\t0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, 0xC559, 0xBED4, 0xC55D,\t0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, 0xBED8, 0xC564,\n\t0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, 0xC573,\t0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D,\n\t0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C,\t0xBEE5, 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595,\n\t0xBEE9, 0xC597, 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0,\t0xBEED, 0xC5A9, 0xBEEE, 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8,\n\t0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD,\t0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, 0xC5C5, 0xBEF8, 0xC5C6,\n\t0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, 0xBEFC, 0xC5CA,\t0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, 0xD49F,\n\t0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3,\t0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7,\n\t0xBF4B, 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC,\t0xBF4F, 0xD4AD, 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0,\n\t0xBF53, 0xD4B1, 0xBF54, 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4,\t0xBF57, 0xD4B5, 0xBF58, 0xD4B6, 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8,\n\t0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, 0xD4BB, 0xBF64, 0xD4BC,\t0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, 0xBF68, 0xD4C0,\n\t0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, 0xD4C4,\t0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8,\n\t0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD,\t0xBF75, 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2,\n\t0xBF79, 0xD4D3, 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7,\t0xBF83, 0xD4D8, 0xBF84, 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB,\n\t0xBF87, 0xD4DD, 0xBF88, 0xD4DE, 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1,\t0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, 0xD4E4, 0xBF8E, 0xD4E5,\n\t0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, 0xBF92, 0xD4EA,\t0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, 0xD4EF,\n\t0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4,\t0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9,\n\t0xBF9F, 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1,\t0xBFA3, 0xC5D4, 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1,\n\t0xBFA7, 0xC5E3, 0xBFA8, 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED,\t0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6,\n\t0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, 0xC5FD, 0xBFB2, 0xC5FE,\t0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, 0xBFB6, 0xC605,\n\t0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, 0xC60C,\t0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B,\n\t0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628,\t0xBFC3, 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630,\n\t0xBFC7, 0xC633, 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637,\t0xBFCB, 0xC639, 0xBFCC, 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641,\n\t0xBFCF, 0xC644, 0xBFD0, 0xC648, 0xBFD1, 0xC650, 0xBFD2, 0xC651,\t0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, 0xC655, 0xBFD6, 0xC65C,\n\t0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, 0xBFDA, 0xC66F,\t0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, 0xC67C,\n\t0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B,\t0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698,\n\t0xBFE7, 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7,\t0xBFEB, 0xC6A9, 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4,\n\t0xBFEF, 0xC6B8, 0xBFF0, 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0,\t0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC,\n\t0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, 0xC6D4, 0xBFFA, 0xC6DC,\t0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, 0xBFFE, 0xC6E8,\n\t0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, 0xD501,\t0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506,\n\t0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B,\t0xC04D, 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510,\n\t0xC051, 0xD511, 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516,\t0xC055, 0xD518, 0xC056, 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B,\n\t0xC059, 0xD51C, 0xC05A, 0xD51D, 0xC061, 0xD51E, 0xC062, 0xD51F,\t0xC063, 0xD520, 0xC064, 0xD521, 0xC065, 0xD522, 0xC066, 0xD523,\n\t0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, 0xC06A, 0xD527,\t0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, 0xD52B,\n\t0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F,\t0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533,\n\t0xC077, 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537,\t0xC081, 0xD538, 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B,\n\t0xC085, 0xD53E, 0xC086, 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542,\t0xC089, 0xD543, 0xC08A, 0xD545, 0xC08B, 0xD546, 0xC08C, 0xD547,\n\t0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, 0xD54A, 0xC090, 0xD54B,\t0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, 0xC094, 0xD553,\n\t0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, 0xD557,\t0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E,\n\t0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563,\t0xC0A1, 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8,\n\t0xC0A5, 0xC6F9, 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705,\t0xC0A9, 0xC708, 0xC0AA, 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715,\n\t0xC0AD, 0xC717, 0xC0AE, 0xC719, 0xC0AF, 0xC720, 0xC0B0, 0xC721,\t0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, 0xC730, 0xC0B4, 0xC731,\n\t0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, 0xC0B8, 0xC73C,\t0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, 0xC74A,\n\t0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751,\t0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755,\n\t0xC0C5, 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C,\t0xC0C9, 0xC760, 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774,\n\t0xC0CD, 0xC775, 0xC0CE, 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D,\t0xC0D1, 0xC77E, 0xC0D2, 0xC783, 0xC0D3, 0xC784, 0xC0D4, 0xC785,\n\t0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, 0xC789, 0xC0D8, 0xC78A,\t0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, 0xC0DC, 0xC794,\n\t0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, 0xC79A,\t0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4,\n\t0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD,\t0xC0E9, 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD,\n\t0xC0ED, 0xC7BF, 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8,\t0xC0F1, 0xC7C9, 0xC0F2, 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0,\n\t0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8,\t0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, 0xC801, 0xC0FC, 0xC804,\n\t0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, 0xC142, 0xD566,\t0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, 0xD56E,\n\t0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572,\t0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579,\n\t0xC14F, 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E,\t0xC153, 0xD57F, 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582,\n\t0xC157, 0xD583, 0xC158, 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B,\t0xC161, 0xD58C, 0xC162, 0xD58D, 0xC163, 0xD58E, 0xC164, 0xD58F,\n\t0xC165, 0xD591, 0xC166, 0xD592, 0xC167, 0xD593, 0xC168, 0xD594,\t0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, 0xC16C, 0xD598,\n\t0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, 0xD59C,\t0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0,\n\t0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4,\t0xC179, 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9,\n\t0xC183, 0xD5AA, 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD,\t0xC187, 0xD5AE, 0xC188, 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1,\n\t0xC18B, 0xD5B2, 0xC18C, 0xD5B3, 0xC18D, 0xD5B4, 0xC18E, 0xD5B5,\t0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, 0xD5B8, 0xC192, 0xD5B9,\n\t0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, 0xC196, 0xD5BD,\t0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, 0xD5C1,\n\t0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5,\t0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811,\n\t0xC1A3, 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C,\t0xC1A7, 0xC81D, 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C,\n\t0xC1AB, 0xC82D, 0xC1AC, 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838,\t0xC1AF, 0xC83C, 0xC1B0, 0xC840, 0xC1B1, 0xC848, 0xC1B2, 0xC849,\n\t0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, 0xC854, 0xC1B6, 0xC870,\t0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, 0xC1BA, 0xC87A,\n\t0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, 0xC885,\t0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C,\n\t0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F,\t0xC1C7, 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD,\n\t0xC1CB, 0xC8C4, 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4,\t0xC1CF, 0xC8D5, 0xC1D0, 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0,\n\t0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC,\t0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, 0xC904, 0xC1DA, 0xC905,\n\t0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, 0xC1DE, 0xC90F,\t0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, 0xC934,\n\t0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958,\t0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C,\n\t0xC1EB, 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988,\t0xC1EF, 0xC989, 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998,\n\t0xC1F3, 0xC999, 0xC1F4, 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0,\t0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8,\n\t0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, 0xC9D1, 0xC1FE, 0xC9D3,\t0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, 0xC244, 0xD5CE,\n\t0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, 0xD5D4,\t0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA,\n\t0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0,\t0xC251, 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6,\n\t0xC255, 0xD5E7, 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB,\t0xC259, 0xD5ED, 0xC25A, 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0,\n\t0xC263, 0xD5F1, 0xC264, 0xD5F2, 0xC265, 0xD5F3, 0xC266, 0xD5F6,\t0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, 0xD5FB, 0xC26A, 0xD5FC,\n\t0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, 0xC26E, 0xD602,\t0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, 0xD607,\n\t0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C,\t0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612,\n\t0xC281, 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619,\t0xC285, 0xD61A, 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E,\n\t0xC289, 0xD61F, 0xC28A, 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623,\t0xC28D, 0xD625, 0xC28E, 0xD626, 0xC28F, 0xD627, 0xC290, 0xD628,\n\t0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, 0xD62B, 0xC294, 0xD62C,\t0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, 0xC298, 0xD631,\n\t0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, 0xD635,\t0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B,\n\t0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA,\t0xC2A5, 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2,\n\t0xC2A9, 0xC9E4, 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED,\t0xC2AD, 0xC9EF, 0xC2AE, 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8,\n\t0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, 0xC2B3, 0xCA00, 0xC2B4, 0xCA08,\t0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, 0xCA0C, 0xC2B8, 0xCA0D,\n\t0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, 0xC2BC, 0xCA4C,\t0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, 0xCA5C,\n\t0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61,\t0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98,\n\t0xC2C9, 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4,\t0xC2CD, 0xCACC, 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1,\n\t0xC2D1, 0xCAD3, 0xC2D2, 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0,\t0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, 0xC2D7, 0xCB08, 0xC2D8, 0xCB10,\n\t0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, 0xCB20, 0xC2DC, 0xCB21,\t0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, 0xC2E0, 0xCB4C,\n\t0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, 0xCB5D,\t0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C,\n\t0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7,\t0xC2ED, 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10,\n\t0xC2F1, 0xCC14, 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21,\t0xC2F5, 0xCC22, 0xC2F6, 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29,\n\t0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, 0xC2FB, 0xCC30, 0xC2FC, 0xCC38,\t0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, 0xD63D, 0xC342, 0xD63E,\n\t0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, 0xC346, 0xD643,\t0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, 0xD64A,\n\t0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650,\t0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657,\n\t0xC353, 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D,\t0xC357, 0xD65E, 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661,\n\t0xC361, 0xD662, 0xC362, 0xD663, 0xC363, 0xD664, 0xC364, 0xD665,\t0xC365, 0xD666, 0xC366, 0xD668, 0xC367, 0xD66A, 0xC368, 0xD66B,\n\t0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, 0xD66E, 0xC36C, 0xD66F,\t0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, 0xC370, 0xD676,\n\t0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, 0xD67A,\t0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E,\n\t0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682,\t0xC383, 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688,\n\t0xC387, 0xD689, 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E,\t0xC38B, 0xD68F, 0xC38C, 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693,\n\t0xC38F, 0xD695, 0xC390, 0xD696, 0xC391, 0xD697, 0xC392, 0xD698,\t0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, 0xD69B, 0xC396, 0xD69C,\n\t0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, 0xC39A, 0xD6A3,\t0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, 0xD6A7,\n\t0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D,\t0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48,\n\t0xC3A7, 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57,\t0xC3AB, 0xCC58, 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64,\n\t0xC3AF, 0xCC66, 0xC3B0, 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75,\t0xC3B3, 0xCC98, 0xC3B4, 0xCC99, 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0,\n\t0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, 0xCCAB, 0xC3BA, 0xCCAC,\t0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, 0xC3BE, 0xCCB8,\n\t0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, 0xCCC7,\t0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4,\n\t0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08,\t0xC3CB, 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18,\n\t0xC3CF, 0xCD19, 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24,\t0xC3D3, 0xCD28, 0xC3D4, 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C,\n\t0xC3D7, 0xCD60, 0xC3D8, 0xCD64, 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D,\t0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, 0xCD78, 0xC3DE, 0xCD88,\n\t0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, 0xC3E2, 0xCD9C,\t0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, 0xCDA9,\n\t0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0,\t0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8,\n\t0xC3EF, 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04,\t0xC3F3, 0xCE08, 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19,\n\t0xC3F7, 0xCE20, 0xC3F8, 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28,\t0xC3FB, 0xCE30, 0xC3FC, 0xCE31, 0xC3FD, 0xCE33, 0xC3FE, 0xCE35,\n\t0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, 0xD6AE, 0xC444, 0xD6AF,\t0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, 0xC448, 0xD6B4,\n\t0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, 0xD6B8,\t0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE,\n\t0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2,\t0xC455, 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9,\n\t0xC459, 0xD6CA, 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE,\t0xC463, 0xD6CF, 0xC464, 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3,\n\t0xC467, 0xD6D5, 0xC468, 0xD6D6, 0xC469, 0xD6D8, 0xC46A, 0xD6DA,\t0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, 0xD6DD, 0xC46E, 0xD6DE,\n\t0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, 0xC472, 0xD6E3,\t0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, 0xD6E9,\n\t0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED,\t0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2,\n\t0xC485, 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7,\t0xC489, 0xD6F8, 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB,\n\t0xC48D, 0xD6FE, 0xC48E, 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702,\t0xC491, 0xD703, 0xC492, 0xD705, 0xC493, 0xD706, 0xC494, 0xD707,\n\t0xC495, 0xD708, 0xC496, 0xD709, 0xC497, 0xD70A, 0xC498, 0xD70B,\t0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, 0xC49C, 0xD70F,\n\t0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, 0xD714,\t0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F,\n\t0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69,\t0xC4A9, 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75,\n\t0xC4AD, 0xCE78, 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85,\t0xC4B1, 0xCE87, 0xC4B2, 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91,\n\t0xC4B5, 0xCE94, 0xC4B6, 0xCE98, 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1,\t0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, 0xCEA5, 0xC4BC, 0xCEAC,\n\t0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, 0xC4C0, 0xCEE5,\t0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, 0xCEF4,\n\t0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9,\t0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08,\n\t0xC4CD, 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15,\t0xC4D1, 0xCF1C, 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C,\n\t0xC4D5, 0xCF2D, 0xC4D6, 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31,\t0xC4D9, 0xCF38, 0xC4DA, 0xCF54, 0xC4DB, 0xCF55, 0xC4DC, 0xCF58,\n\t0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, 0xCF65, 0xC4E0, 0xCF67,\t0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, 0xC4E4, 0xCF74,\n\t0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, 0xCF8C,\t0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4,\n\t0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8,\t0xC4F1, 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5,\n\t0xC4F5, 0xCFFC, 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011,\t0xC4F9, 0xD018, 0xC4FA, 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035,\n\t0xC4FD, 0xD038, 0xC4FE, 0xD03C, 0xC541, 0xD715, 0xC542, 0xD716,\t0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, 0xD71B, 0xC546, 0xD71D,\n\t0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, 0xC54A, 0xD722,\t0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, 0xD726,\n\t0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E,\t0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732,\n\t0xC557, 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739,\t0xC561, 0xD73A, 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E,\n\t0xC565, 0xD73F, 0xC566, 0xD740, 0xC567, 0xD741, 0xC568, 0xD742,\t0xC569, 0xD743, 0xC56A, 0xD745, 0xC56B, 0xD746, 0xC56C, 0xD748,\n\t0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, 0xD74C, 0xC570, 0xD74D,\t0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, 0xC574, 0xD753,\n\t0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, 0xD75C,\t0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762,\n\t0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768,\t0xC587, 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E,\n\t0xC58B, 0xD76F, 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773,\t0xC58F, 0xD775, 0xC590, 0xD776, 0xC591, 0xD777, 0xC592, 0xD778,\n\t0xC593, 0xD779, 0xC594, 0xD77A, 0xC595, 0xD77B, 0xC596, 0xD77E,\t0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, 0xD782, 0xC59A, 0xD783,\n\t0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, 0xC59E, 0xD787,\t0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, 0xD045,\n\t0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054,\t0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D,\n\t0xC5AB, 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D,\t0xC5AF, 0xD081, 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8,\n\t0xC5B3, 0xD0AC, 0xC5B4, 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7,\t0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4,\n\t0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, 0xD0D0, 0xC5BE, 0xD0D1,\t0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, 0xC5C2, 0xD0DC,\n\t0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, 0xD0EC,\t0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1,\n\t0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131,\t0xC5CF, 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140,\n\t0xC5D3, 0xD141, 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145,\t0xC5D7, 0xD14C, 0xC5D8, 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154,\n\t0xC5DB, 0xD15C, 0xC5DC, 0xD15D, 0xC5DD, 0xD15F, 0xC5DE, 0xD161,\t0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, 0xD17C, 0xC5E2, 0xD184,\n\t0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, 0xC5E6, 0xD1A4,\t0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, 0xD1B3,\n\t0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0,\t0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207,\n\t0xC5F3, 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D,\t0xC5F7, 0xD230, 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D,\n\t0xC5FB, 0xD23F, 0xC5FC, 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C,\t0xC641, 0xD78D, 0xC642, 0xD78E, 0xC643, 0xD78F, 0xC644, 0xD791,\n\t0xC645, 0xD792, 0xC646, 0xD793, 0xC647, 0xD794, 0xC648, 0xD795,\t0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, 0xC64C, 0xD79C,\n\t0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, 0xD7A1,\t0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280,\n\t0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290,\t0xC6A7, 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0,\n\t0xC6AB, 0xD2A4, 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8,\t0xC6AF, 0xD2B9, 0xC6B0, 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0,\n\t0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB,\t0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, 0xD2DC, 0xC6BA, 0xD2E4,\n\t0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, 0xC6BE, 0xD2F4,\t0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, 0xD303,\n\t0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E,\t0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C,\n\t0xC6CB, 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321,\t0xC6CF, 0xD325, 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C,\n\t0xC6D3, 0xD330, 0xC6D4, 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B,\t0xC6D7, 0xD33C, 0xC6D8, 0xD33D, 0xC6D9, 0xD344, 0xC6DA, 0xD345,\n\t0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, 0xD380, 0xC6DE, 0xD384,\t0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, 0xC6E2, 0xD390,\n\t0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, 0xD39C,\t0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB,\n\t0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC,\t0xC6EF, 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9,\n\t0xC6F3, 0xD3D0, 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3,\t0xC6F7, 0xD3EC, 0xC6F8, 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4,\n\t0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, 0xC6FD, 0xD3FF, 0xC6FE, 0xD401,\t0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, 0xD440, 0xC7A4, 0xD444,\n\t0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, 0xC7A8, 0xD46D,\t0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, 0xD47C,\n\t0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488,\t0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494,\n\t0xC7B5, 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4,\t0xC7B9, 0xD4DC, 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC,\n\t0xC7BD, 0xD4F0, 0xC7BE, 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD,\t0xC7C1, 0xD504, 0xC7C2, 0xD508, 0xC7C3, 0xD50C, 0xC7C4, 0xD514,\n\t0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, 0xD53C, 0xC7C8, 0xD53D,\t0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, 0xC7CC, 0xD54D,\n\t0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, 0xD559,\t0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568,\n\t0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574,\t0xC7D9, 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584,\n\t0xC7DD, 0xD585, 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589,\t0xC7E1, 0xD590, 0xC7E2, 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9,\n\t0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8,\t0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, 0xD5DD, 0xC7EC, 0xD5E4,\n\t0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, 0xC7F0, 0xD5F4,\t0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, 0xD600,\n\t0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610,\t0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615,\n\t0xC7FD, 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D,\t0xC8A3, 0xD638, 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640,\n\t0xC8A7, 0xD645, 0xC8A8, 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B,\t0xC8AB, 0xD64D, 0xC8AC, 0xD651, 0xC8AD, 0xD654, 0xC8AE, 0xD655,\n\t0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, 0xD667, 0xC8B2, 0xD669,\t0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, 0xC8B6, 0xD683,\n\t0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, 0xD690,\t0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1,\n\t0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9,\t0xC8C3, 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8,\n\t0xC8C7, 0xD6CC, 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7,\t0xC8CB, 0xD6D9, 0xC8CC, 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8,\n\t0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD,\t0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, 0xD711, 0xC8D6, 0xD718,\n\t0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, 0xC8DA, 0xD728,\t0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, 0xD734,\n\t0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744,\t0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751,\n\t0xC8E7, 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758,\t0xC8EB, 0xD759, 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763,\n\t0xC8EF, 0xD765, 0xC8F0, 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770,\t0xC8F3, 0xD774, 0xC8F4, 0xD77C, 0xC8F5, 0xD77D, 0xC8F6, 0xD781,\n\t0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, 0xD78C, 0xC8FA, 0xD790,\t0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, 0xC8FE, 0xD79D,\n\t0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, 0x50F9,\t0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5,\n\t0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687,\t0xCAAD, 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C,\n\t0xCAB1, 0x73C2, 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB,\t0xCAB5, 0x8304, 0xCAB6, 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36,\n\t0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, 0xCABB, 0x8EFB, 0xCABC, 0x8FE6,\t0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, 0x5374, 0xCAC0, 0x5404,\n\t0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, 0xCAC4, 0x73CF,\t0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, 0x95A3,\n\t0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978,\t0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7,\n\t0xCAD1, 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F,\t0xCAD5, 0x6F97, 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5,\n\t0xCAD9, 0x7A08, 0xCADA, 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D,\t0xCADD, 0x826E, 0xCADE, 0x8271, 0xCADF, 0x8AEB, 0xCAE0, 0x9593,\n\t0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, 0x66F7, 0xCAE4, 0x6E34,\t0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, 0xCAE8, 0x8910,\n\t0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, 0x574E,\t0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE,\n\t0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44,\t0xCAF5, 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3,\n\t0xCAF9, 0x77B0, 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451,\t0xCAFD, 0x9452, 0xCAFE, 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC,\n\t0xCBA3, 0x7532, 0xCBA4, 0x80DB, 0xCBA5, 0x9240, 0xCBA6, 0x9598,\t0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, 0x59DC, 0xCBAA, 0x5CA1,\n\t0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, 0xCBAE, 0x5F4A,\t0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, 0x7586,\n\t0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C,\t0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941,\n\t0xCBBB, 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47,\t0xCBBF, 0x4ECB, 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1,\n\t0xCBC3, 0x584F, 0xCBC4, 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168,\t0xCBC7, 0x6539, 0xCBC8, 0x69EA, 0xCBC9, 0x6F11, 0xCBCA, 0x75A5,\n\t0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, 0x7B87, 0xCBCE, 0x82A5,\t0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, 0xCBD2, 0x958B,\n\t0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, 0xF901,\t0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028,\n\t0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2,\t0xCBDF, 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20,\n\t0xCBE3, 0x70AC, 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E,\t0xCBE7, 0xF902, 0xCBE8, 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8,\n\t0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, 0xCBED, 0x5065, 0xCBEE, 0x5DFE,\t0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, 0x6957, 0xCBF2, 0x8171,\n\t0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, 0xCBF6, 0x9A2B,\t0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, 0x6840,\n\t0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2,\t0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB,\n\t0xCCA5, 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9,\t0xCCA9, 0x63ED, 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84,\n\t0xCCAD, 0x6FC0, 0xCCAE, 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694,\t0xCCB1, 0x5805, 0xCCB2, 0x727D, 0xCCB3, 0x72AC, 0xCCB4, 0x7504,\n\t0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, 0x80A9, 0xCCB8, 0x898B,\t0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, 0xCCBC, 0x6289,\n\t0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, 0x7F3A,\t0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D,\n\t0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC,\t0xCCC9, 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106,\n\t0xCCCD, 0x52C1, 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770,\t0xCCD1, 0x5883, 0xCCD2, 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176,\n\t0xCCD5, 0x61AC, 0xCCD6, 0x64CE, 0xCCD7, 0x656C, 0xCCD8, 0x666F,\t0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, 0x6897, 0xCCDC, 0x6D87,\n\t0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, 0xCCE0, 0x74A5,\t0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, 0x78EC,\n\t0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93,\t0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396,\n\t0xCCED, 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1,\t0xCCF1, 0x9803, 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8,\n\t0xCCF5, 0x4FC2, 0xCCF6, 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951,\t0xCCF9, 0x5B63, 0xCCFA, 0x5C46, 0xCCFB, 0x60B8, 0xCCFC, 0x6212,\n\t0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, 0x68E8, 0xCDA2, 0x6EAA,\t0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, 0xCDA6, 0x7A3D,\n\t0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, 0x8A08,\t0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4,\n\t0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471,\t0xCDB3, 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B,\n\t0xCDB7, 0x5EAB, 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545,\t0xCDBB, 0x6572, 0xCDBC, 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1,\n\t0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, 0xCDC1, 0x7690, 0xCDC2, 0x777E,\t0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, 0x8003, 0xCDC6, 0x80A1,\n\t0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, 0xCDCA, 0x83F0,\t0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, 0x8AA5,\n\t0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7,\t0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED,\n\t0xCDD7, 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40,\t0xCDDB, 0x8C37, 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764,\n\t0xCDDF, 0x5D11, 0xCDE0, 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD,\t0xCDE3, 0x6EFE, 0xCDE4, 0x7428, 0xCDE5, 0x889E, 0xCDE6, 0x9BE4,\n\t0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, 0x9AA8, 0xCDEA, 0x4F9B,\t0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, 0xCDEE, 0x5B54,\n\t0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, 0x62F1,\t0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A,\n\t0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32,\t0xCDFB, 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC,\n\t0xCEA1, 0x79D1, 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2,\t0xCEA5, 0x8DE8, 0xCEA6, 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846,\n\t0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, 0xCEAB, 0x85FF, 0xCEAC, 0x90ED,\t0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, 0x5B98, 0xCEB0, 0x5BEC,\n\t0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, 0xCEB4, 0x704C,\t0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, 0x7F50,\n\t0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC,\t0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC,\n\t0xCEC1, 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321,\t0xCEC5, 0x58D9, 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38,\n\t0xCEC9, 0x709A, 0xCECA, 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50,\t0xCECD, 0x80F1, 0xCECE, 0x945B, 0xCECF, 0x5366, 0xCED0, 0x639B,\n\t0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, 0x5080, 0xCED4, 0x584A,\t0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, 0xCED8, 0x62D0,\n\t0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, 0x7D18,\t0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1,\n\t0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0,\t0xCEE5, 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821,\n\t0xCEE9, 0x6A4B, 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF,\t0xCEED, 0x7D5E, 0xCEEE, 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E,\n\t0xCEF1, 0x86DF, 0xCEF2, 0x8F03, 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA,\t0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, 0x9BAB, 0xCEF8, 0x4E18,\n\t0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, 0xCEFC, 0x4FF1,\t0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, 0x53E3,\n\t0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775,\t0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0,\n\t0xCFAB, 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8,\t0xCFAF, 0x67E9, 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6,\n\t0xCFB3, 0x6BEC, 0xCFB4, 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078,\t0xCFB7, 0x72D7, 0xCFB8, 0x7396, 0xCFB9, 0x7403, 0xCFBA, 0x77BF,\n\t0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, 0x7D7F, 0xCFBE, 0x8009,\t0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, 0xCFC2, 0x82DF,\n\t0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, 0x8EC0,\t0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6,\n\t0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7,\t0xCFCF, 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA,\n\t0xCFD3, 0x97A0, 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B,\t0xCFD7, 0x7A98, 0xCFD8, 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD,\n\t0xCFDB, 0x90E1, 0xCFDC, 0x5800, 0xCFDD, 0x5C48, 0xCFDE, 0x6398,\t0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, 0x5F13, 0xCFE2, 0x7A79,\n\t0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, 0xCFE6, 0x5026,\t0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, 0x5708,\n\t0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3,\t0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568,\n\t0xCFF3, 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3,\t0xCFF7, 0x6F70, 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B,\n\t0xCFFB, 0xF906, 0xCFFC, 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4,\t0xD0A1, 0x9B3C, 0xD0A2, 0xF907, 0xD0A3, 0x53EB, 0xD0A4, 0x572D,\n\t0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, 0x69FB, 0xD0A8, 0x73EA,\t0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, 0xD0AC, 0x7CFE,\n\t0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, 0x9035,\t0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547,\n\t0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908,\t0xD0B9, 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287,\n\t0xD0BD, 0x621F, 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699,\t0xD0C1, 0x50C5, 0xD0C2, 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3,\n\t0xD0C5, 0x65A4, 0xD0C6, 0x6839, 0xD0C7, 0x69FF, 0xD0C8, 0x747E,\t0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, 0x83EB, 0xD0CC, 0x89B2,\n\t0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, 0xD0D0, 0xF909,\t0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, 0x6611,\n\t0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD,\t0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F,\n\t0xD0DD, 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA,\t0xD0E1, 0x6025, 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A,\n\t0xD0E5, 0x7D66, 0xD0E6, 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC,\t0xD0E9, 0x80AF, 0xD0EA, 0x4F01, 0xD0EB, 0x4F0E, 0xD0EC, 0x5176,\n\t0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, 0x5668, 0xD0F0, 0x573B,\t0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, 0xD0F4, 0x5947,\n\t0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, 0x5D0E,\t0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280,\n\t0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F,\t0xD1A3, 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F,\n\t0xD1A7, 0x6B3A, 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82,\t0xD1AB, 0x6DC7, 0xD1AC, 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A,\n\t0xD1AF, 0x7482, 0xD1B0, 0x74A3, 0xD1B1, 0x7578, 0xD1B2, 0x757F,\t0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, 0x7941, 0xD1B6, 0x7947,\n\t0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, 0xD1BA, 0x7D00,\t0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, 0x802D,\n\t0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48,\t0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2,\n\t0xD1C7, 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65,\t0xD1CB, 0x9E92, 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409,\n\t0xD1CF, 0x62EE, 0xD1D0, 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB,\t0xD1D3, 0x513A, 0xD1D4, 0xF90B, 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C,\n\t0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, 0x62CF, 0xD1DA, 0x62FF,\t0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, 0xD1DE, 0xF911,\n\t0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, 0xF914,\t0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918,\n\t0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B,\t0xD1EB, 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156,\n\t0xD1EF, 0xF91E, 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920,\t0xD1F3, 0x634F, 0xD1F4, 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921,\n\t0xD1F7, 0x678F, 0xD1F8, 0x6960, 0xD1F9, 0x6E73, 0xD1FA, 0xF922,\t0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, 0xF924, 0xD1FE, 0xF925,\n\t0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, 0xD2A4, 0x8872,\t0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, 0xF929,\n\t0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43,\t0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0,\n\t0xD2B1, 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74,\t0xD2B5, 0x649A, 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C,\n\t0xD2B9, 0x62C8, 0xD2BA, 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7,\t0xD2BD, 0x52AA, 0xD2BE, 0xF92F, 0xD2BF, 0x5974, 0xD2C0, 0x5F29,\n\t0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, 0xF931, 0xD2C4, 0xF932,\t0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, 0xD2C8, 0xF935,\n\t0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, 0x99D1,\t0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C,\n\t0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940,\t0xD2D5, 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3,\n\t0xD2D9, 0xF944, 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2,\t0xD2DD, 0x60F1, 0xD2DE, 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166,\n\t0xD2E1, 0xF948, 0xD2E2, 0xF949, 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A,\t0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, 0xF94D, 0xD2E8, 0xF94E,\n\t0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, 0xD2EC, 0x5AE9,\t0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, 0xF952,\n\t0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956,\t0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959,\n\t0xD2F9, 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA,\t0xD2FD, 0x591A, 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6,\n\t0xD3A3, 0x4F46, 0xD3A4, 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7,\t0xD3A7, 0x5F56, 0xD3A8, 0x65B7, 0xD3A9, 0x65E6, 0xD3AA, 0x6A80,\n\t0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, 0x77ED, 0xD3AE, 0x7AEF,\t0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, 0xD3B2, 0x8892,\n\t0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, 0x6FBE,\t0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556,\n\t0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7,\t0xD3BF, 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9,\n\t0xD3C3, 0x75F0, 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541,\t0xD3C7, 0x8983, 0xD3C8, 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F,\n\t0xD3CB, 0x6C93, 0xD3CC, 0x7553, 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F,\t0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, 0x5802, 0xD3D2, 0x5858,\n\t0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, 0xD3D6, 0x68E0,\t0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, 0x9EE8,\n\t0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927,\t0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85,\n\t0xD3E3, 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA,\t0xD3E7, 0x888B, 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB,\n\t0xD3EB, 0x5B85, 0xD3EC, 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012,\t0xD3EF, 0x5200, 0xD3F0, 0x5230, 0xD3F1, 0x5716, 0xD3F2, 0x5835,\n\t0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, 0x5C60, 0xD3F6, 0x5CF6,\t0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, 0xD3FA, 0x60BC,\n\t0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, 0x6843,\t0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21,\n\t0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC,\t0xD4A9, 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404,\n\t0xD4AD, 0x89A9, 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48,\t0xD4B1, 0x9003, 0xD4B2, 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD,\n\t0xD4B5, 0x934D, 0xD4B6, 0x9676, 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2,\t0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, 0x72A2, 0xD4BC, 0x7368,\n\t0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, 0xD4C0, 0x7E9B,\t0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, 0x6566,\n\t0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E,\t0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D,\n\t0xD4CD, 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD,\t0xD4D1, 0x52D5, 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771,\n\t0xD4D5, 0x6850, 0xD4D6, 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C,\t0xD4D9, 0x75BC, 0xD4DA, 0x77B3, 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4,\n\t0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, 0x515C, 0xD4E0, 0x6597,\t0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, 0xD4E4, 0x7AC7,\n\t0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, 0x9017,\t0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A,\n\t0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97,\t0xD4F1, 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B,\n\t0xD4F5, 0x7B49, 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127,\t0xD4F9, 0x9A30, 0xD4FA, 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B,\n\t0xD4FD, 0x7669, 0xD4FE, 0x7F85, 0xD5A1, 0x863F, 0xD5A2, 0x87BA,\t0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, 0xF95C, 0xD5A6, 0x6D1B,\n\t0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, 0xD5AA, 0x843D,\t0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, 0xF95E,\n\t0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12,\t0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E,\n\t0xD5B7, 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5,\t0xD5BB, 0x652C, 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43,\n\t0xD5BF, 0x7E9C, 0xD5C0, 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD,\t0xD5C3, 0x62C9, 0xD5C4, 0x81D8, 0xD5C5, 0x881F, 0xD5C6, 0x5ECA,\n\t0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, 0x72FC, 0xD5CA, 0x7405,\t0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, 0xD5CE, 0x4F86,\n\t0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, 0x51B7,\t0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006,\n\t0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11,\t0xD5DB, 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F,\n\t0xD5DF, 0x8AD2, 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6,\t0xD5E3, 0x5137, 0xD5E4, 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC,\n\t0xD5E7, 0x616E, 0xD5E8, 0x623E, 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA,\t0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, 0x85DC, 0xD5EE, 0x8823,\n\t0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, 0xD5F2, 0x9E97,\t0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, 0x6B77,\n\t0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742,\t0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23,\n\t0xD6A1, 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F,\t0xD6A5, 0x84EE, 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A,\n\t0xD6A9, 0x51BD, 0xD6AA, 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C,\t0xD6AD, 0x70C8, 0xD6AE, 0x88C2, 0xD6AF, 0x5EC9, 0xD6B0, 0x6582,\n\t0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, 0x7C3E, 0xD6B4, 0x7375,\t0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, 0xD6B8, 0xF95F,\n\t0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, 0x73B2,\t0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046,\n\t0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748,\t0xD6C5, 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7,\n\t0xD6C9, 0x79AE, 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE,\t0xD6CD, 0xF960, 0xD6CE, 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3,\n\t0xD6D1, 0x6F5E, 0xD6D2, 0x7018, 0xD6D3, 0x7210, 0xD6D4, 0x76E7,\t0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, 0x865C, 0xD6D8, 0x8DEF,\n\t0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, 0xD6DC, 0x9DFA,\t0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, 0x7DA0,\n\t0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93,\t0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727,\n\t0xD6E9, 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E,\t0xD6ED, 0x5121, 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA,\n\t0xD6F1, 0x8CC2, 0xD6F2, 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7,\t0xD6F5, 0x4E86, 0xD6F6, 0x50DA, 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6,\n\t0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, 0x7642, 0xD6FC, 0x77AD,\t0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, 0xD7A2, 0x9B27,\n\t0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, 0x5C62,\t0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B,\n\t0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938,\t0xD7AF, 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2,\n\t0xD7B3, 0x67F3, 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C,\t0xD7B7, 0x700F, 0xD7B8, 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559,\n\t0xD7BB, 0x7624, 0xD7BC, 0x786B, 0xD7BD, 0x8B2C, 0xD7BE, 0x985E,\t0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, 0x9678, 0xD7C2, 0x4F96,\n\t0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, 0xD7C6, 0x7DB8,\t0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, 0x6817,\n\t0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B,\t0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C,\n\t0xD7D3, 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA,\t0xD7D7, 0x5229, 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E,\n\t0xD7DB, 0x5C65, 0xD7DC, 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8,\t0xD7DF, 0x6D6C, 0xD7E0, 0x7281, 0xD7E1, 0x72F8, 0xD7E2, 0x7406,\n\t0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, 0x75E2, 0xD7E6, 0x7C6C,\t0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, 0xD7EA, 0x88CF,\n\t0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, 0x96E2,\t0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0,\n\t0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3,\t0xD7F7, 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB,\n\t0xD7FB, 0x7433, 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C,\t0xD8A1, 0x7ACB, 0xD8A2, 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469,\n\t0xD8A5, 0x746A, 0xD8A6, 0x75F2, 0xD8A7, 0x78BC, 0xD8A8, 0x78E8,\t0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, 0x9EBB, 0xD8AC, 0x5BDE,\n\t0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, 0xD8B0, 0x83AB,\t0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, 0x5A29,\n\t0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D,\t0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B,\n\t0xD8BD, 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513,\t0xD8C1, 0x883B, 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B,\n\t0xD8C5, 0x551C, 0xD8C6, 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB,\t0xD8C9, 0x8309, 0xD8CA, 0x896A, 0xD8CB, 0x977A, 0xD8CC, 0x4EA1,\n\t0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, 0x5FD9, 0xD8D0, 0x671B,\t0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, 0xD8D4, 0x832B,\n\t0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, 0x57CB,\t0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627,\n\t0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164,\t0xD8E1, 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081,\n\t0xD8E5, 0x9B45, 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C,\t0xD8E9, 0x9A40, 0xD8EA, 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13,\n\t0xD8ED, 0x731B, 0xD8EE, 0x76F2, 0xD8EF, 0x76DF, 0xD8F0, 0x840C,\t0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, 0x514D, 0xD8F4, 0x5195,\n\t0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, 0xD8F8, 0x7704,\t0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, 0x9762,\n\t0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5,\t0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D,\n\t0xD9A7, 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791,\t0xD9AB, 0x8317, 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169,\n\t0xD9AF, 0x9298, 0xD9B0, 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE,\t0xD9B3, 0x5192, 0xD9B4, 0x52DF, 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D,\n\t0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, 0x6479, 0xD9BA, 0x66AE,\t0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, 0xD9BE, 0x6BDB,\n\t0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, 0x7738,\t0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305,\n\t0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728,\t0xD9CB, 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766,\n\t0xD9CF, 0x7A46, 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92,\t0xD9D3, 0x5922, 0xD9D4, 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F,\n\t0xD9D7, 0x5893, 0xD9D8, 0x5999, 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF,\t0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, 0x6E3A, 0xD9DE, 0x732B,\n\t0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, 0xD9E2, 0x52D9,\t0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, 0x620A,\n\t0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959,\t0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7,\n\t0xD9EF, 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302,\t0xD9F3, 0x856A, 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727,\n\t0xD9F7, 0x9D61, 0xD9F8, 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011,\t0xD9FB, 0x520E, 0xD9FC, 0x543B, 0xD9FD, 0x554F, 0xD9FE, 0x6587,\n\t0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, 0x7D0B, 0xDAA4, 0x805E,\t0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, 0xDAA8, 0x52FF,\n\t0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, 0x5A9A,\t0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE,\n\t0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C,\t0xDAB5, 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E,\n\t0xDAB9, 0x8587, 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761,\t0xDABD, 0x9EF4, 0xDABE, 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D,\n\t0xDAC1, 0x61AB, 0xDAC2, 0x654F, 0xDAC3, 0x65FB, 0xDAC4, 0x65FC,\t0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, 0x739F, 0xDAC8, 0x73C9,\n\t0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, 0xDACC, 0x871C,\t0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, 0x62CD,\n\t0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38,\t0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94,\n\t0xDAD9, 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236,\t0xDADD, 0x8584, 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1,\n\t0xDAE1, 0x4F34, 0xDAE2, 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB,\t0xDAE5, 0x62CC, 0xDAE6, 0x642C, 0xDAE7, 0x6500, 0xDAE8, 0x6591,\n\t0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, 0x6F58, 0xDAEC, 0x73ED,\t0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, 0xDAF0, 0x76FC,\n\t0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, 0x7D46,\t0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812,\n\t0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5,\t0xDAFD, 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB,\n\t0xDBA3, 0x91B1, 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43,\t0xDBA7, 0x5023, 0xDBA8, 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8,\n\t0xDBAB, 0x5C28, 0xDBAC, 0x5E47, 0xDBAD, 0x5F77, 0xDBAE, 0x623F,\t0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, 0x65C1, 0xDBB2, 0x6609,\n\t0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, 0xDBB6, 0x78C5,\t0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, 0x822B,\n\t0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A,\t0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90,\n\t0xDBC3, 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9,\t0xDBC7, 0x5F98, 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F,\n\t0xDBCB, 0x6E43, 0xDBCC, 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC,\t0xDBCF, 0x80DA, 0xDBD0, 0x88F4, 0xDBD1, 0x88F5, 0xDBD2, 0x8919,\n\t0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, 0x914D, 0xDBD6, 0x966A,\t0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, 0xDBDA, 0x67CF,\n\t0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, 0x9B44,\t0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4,\n\t0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543,\t0xDBE7, 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F,\n\t0xDBEB, 0x7F70, 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06,\t0xDBEF, 0x68B5, 0xDBF0, 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB,\n\t0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, 0xDBF5, 0x8303, 0xDBF6, 0x6CD5,\t0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, 0x5288, 0xDBFA, 0x58C1,\n\t0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, 0xDBFE, 0x7656,\t0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, 0x9739,\n\t0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A,\t0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225,\n\t0xDCAD, 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19,\t0xDCB1, 0x5002, 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77,\n\t0xDCB5, 0x661E, 0xDCB6, 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5,\t0xDCB9, 0x70B3, 0xDCBA, 0x7501, 0xDCBB, 0x75C5, 0xDCBC, 0x79C9,\n\t0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, 0x9920, 0xDCC0, 0x9A08,\t0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, 0xDCC4, 0x5BF6,\n\t0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, 0x6E7A,\t0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9,\n\t0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14,\t0xDCD1, 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C,\n\t0xDCD5, 0x5B93, 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F,\t0xDCD9, 0x8179, 0xDCDA, 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907,\n\t0xDCDD, 0x8986, 0xDCDE, 0x8F39, 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5,\t0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, 0x4E76, 0xDCE4, 0x4FF8,\n\t0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, 0xDCE8, 0x5CF0,\t0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, 0x71A2,\n\t0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702,\t0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D,\n\t0xDCF5, 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256,\t0xDCF9, 0x526F, 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0,\n\t0xDCFD, 0x592B, 0xDCFE, 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75,\t0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, 0xDDA5, 0xF966, 0xDDA6, 0x6276,\n\t0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, 0x6D6E, 0xDDAA, 0x6EA5,\t0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, 0xDDAE, 0x7F36,\n\t0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, 0x8240,\t0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0,\n\t0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA,\t0xDDBB, 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644,\n\t0xDDBF, 0x99D9, 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206,\t0xDDC3, 0x5429, 0xDDC4, 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954,\n\t0xDDC7, 0x596E, 0xDDC8, 0x5FFF, 0xDDC9, 0x61A4, 0xDDCA, 0x626E,\t0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, 0x711A, 0xDDCE, 0x76C6,\n\t0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, 0xDDD2, 0x82AC,\t0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, 0x4F5B,\n\t0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29,\t0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43,\n\t0xDDDF, 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315,\t0xDDE3, 0x532A, 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62,\n\t0xDDE7, 0x5E87, 0xDDE8, 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249,\t0xDDEB, 0x6279, 0xDDEC, 0x6590, 0xDDED, 0x6787, 0xDDEE, 0x69A7,\n\t0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, 0x6BD7, 0xDDF2, 0x6BD8,\t0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, 0xDDF6, 0x75FA,\n\t0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, 0x79D8,\t0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5,\n\t0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A,\t0xDEA5, 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB,\n\t0xDEA9, 0x9119, 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B,\t0xDEAD, 0x56AC, 0xDEAE, 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C,\n\t0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1,\t0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, 0x73AD, 0xDEB8, 0x8CA7,\n\t0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, 0xDEBC, 0x6C37,\t0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, 0x4E8B,\n\t0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C,\t0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2,\n\t0xDEC9, 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB,\t0xDECD, 0x58EB, 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB,\n\t0xDED1, 0x5BFA, 0xDED2, 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B,\t0xDED5, 0x5F99, 0xDED6, 0x601D, 0xDED7, 0x6368, 0xDED8, 0x659C,\n\t0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, 0x67FB, 0xDEDC, 0x68AD,\t0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, 0xDEE0, 0x6E23,\n\t0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, 0x793E,\t0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9,\n\t0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D,\t0xDEED, 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF,\n\t0xDEF1, 0x8A50, 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC,\t0xDEF5, 0x8D66, 0xDEF6, 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC,\n\t0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, 0xDEFB, 0x524A, 0xDEFC, 0xF969,\t0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, 0x5098, 0xDFA2, 0x522A,\n\t0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, 0xDFA6, 0x73CA,\t0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, 0x849C,\n\t0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492,\t0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09,\n\t0xDFB3, 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17,\t0xDFB7, 0x829F, 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7,\n\t0xDFBB, 0x6F81, 0xDFBC, 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A,\t0xDFBF, 0x50B7, 0xDFC0, 0x50CF, 0xDFC1, 0x511F, 0xDFC2, 0x5546,\n\t0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, 0x5B40, 0xDFC6, 0x5C19,\t0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, 0xDFCA, 0x5EA0,\n\t0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, 0x6A61,\t0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0,\n\t0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4,\t0xDFD7, 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61,\n\t0xDFDB, 0x8CDE, 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD,\t0xDFDF, 0x8CFD, 0xDFE0, 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61,\n\t0xDFE3, 0x7D22, 0xDFE4, 0x8272, 0xDFE5, 0x7272, 0xDFE6, 0x751F,\t0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, 0x7B19, 0xDFEA, 0x5885,\n\t0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, 0xDFEE, 0x5EB6,\t0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, 0x637F,\n\t0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8,\t0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E,\n\t0xDFFB, 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72,\t0xE0A1, 0x80E5, 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F,\n\t0xE0A5, 0x8A93, 0xE0A6, 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD,\t0xE0A9, 0x9F20, 0xE0AA, 0x5915, 0xE0AB, 0x596D, 0xE0AC, 0x5E2D,\n\t0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, 0x6673, 0xE0B0, 0x6790,\t0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, 0xE0B4, 0x77F3,\n\t0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, 0x932B,\t0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584,\n\t0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E,\t0xE0C1, 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401,\n\t0xE0C5, 0x7444, 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C,\t0xE0C9, 0x79AA, 0xE0CA, 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8,\n\t0xE0CD, 0x817A, 0xE0CE, 0x81B3, 0xE0CF, 0x8239, 0xE0D0, 0x861A,\t0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, 0x8DE3, 0xE0D4, 0x9078,\n\t0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, 0xE0D8, 0x9BAE,\t0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, 0x6CC4,\n\t0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B,\t0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA,\n\t0xE0E5, 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2,\t0xE0E9, 0x7E96, 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583,\n\t0xE0ED, 0x965D, 0xE0EE, 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE,\t0xE0F1, 0xF96E, 0xE0F2, 0x57CE, 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC,\n\t0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, 0x6210, 0xE0F8, 0x661F,\t0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, 0xE0FC, 0x76DB,\n\t0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, 0x8072,\t0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16,\n\t0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05,\t0xE1AB, 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0,\n\t0xE1AF, 0x53EC, 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5,\t0xE1B3, 0x5C0F, 0xE1B4, 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240,\n\t0xE1B7, 0x6383, 0xE1B8, 0x6414, 0xE1B9, 0x662D, 0xE1BA, 0x68B3,\t0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, 0x6EAF, 0xE1BE, 0x701F,\n\t0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, 0xE1C2, 0x758F,\t0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, 0x7BE0,\n\t0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C,\t0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D,\n\t0xE1CF, 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6,\t0xE1D3, 0x9A37, 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F,\n\t0xE1D7, 0x6D91, 0xE1D8, 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16,\t0xE1DB, 0x8D16, 0xE1DC, 0x901F, 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD,\n\t0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, 0x905C, 0xE1E2, 0x98E1,\t0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, 0xE1E6, 0x677E,\n\t0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, 0x9001,\t0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051,\n\t0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7,\t0xE1F3, 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA,\n\t0xE1F7, 0x5782, 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88,\t0xE1FB, 0x5CAB, 0xE1FC, 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101,\n\t0xE2A1, 0x620D, 0xE2A2, 0x624B, 0xE2A3, 0x6388, 0xE2A4, 0x641C,\t0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, 0x6A39, 0xE2A8, 0x6B8A,\n\t0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, 0xE2AC, 0x71E7,\t0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, 0x74B2,\n\t0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57,\t0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC,\n\t0xE2B9, 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331,\t0xE2BD, 0x8490, 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896,\n\t0xE2C1, 0x8AB0, 0xE2C2, 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042,\t0xE2C5, 0x9083, 0xE2C6, 0x916C, 0xE2C7, 0x9296, 0xE2C8, 0x92B9,\n\t0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, 0x96A8, 0xE2CC, 0x96D6,\t0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, 0xE2D0, 0x9AD3,\n\t0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, 0x5919,\t0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A,\n\t0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085,\t0xE2DD, 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA,\n\t0xE2E1, 0x6042, 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F,\t0xE2E5, 0x6A53, 0xE2E6, 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3,\n\t0xE2E9, 0x73E3, 0xE2EA, 0x76FE, 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D,\t0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, 0x821C, 0xE2F0, 0x8340,\n\t0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, 0xE2F4, 0x8AC4,\t0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, 0x99B4,\n\t0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265,\t0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F,\n\t0xE3A3, 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE,\t0xE3A7, 0x7FD2, 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E,\n\t0xE3AB, 0x4E58, 0xE3AC, 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347,\t0xE3AF, 0x627F, 0xE3B0, 0x6607, 0xE3B1, 0x7E69, 0xE3B2, 0x8805,\n\t0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, 0x5319, 0xE3B6, 0x5636,\t0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, 0xE3BA, 0x5C4E,\n\t0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, 0x6043,\t0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE,\n\t0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A,\t0xE3C7, 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996,\n\t0xE3CB, 0x8A66, 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55,\t0xE3CF, 0x8C7A, 0xE3D0, 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F,\n\t0xE3D3, 0x606F, 0xE3D4, 0x62ED, 0xE3D5, 0x690D, 0xE3D6, 0x6B96,\t0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, 0x7BD2, 0xE3DA, 0x8755,\n\t0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, 0xE3DE, 0x98FE,\t0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, 0x547B,\n\t0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0,\t0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E,\n\t0xE3EB, 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398,\t0xE3EF, 0x85AA, 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A,\n\t0xE3F3, 0x8EAB, 0xE3F4, 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5,\t0xE3F7, 0x5931, 0xE3F8, 0x5BA4, 0xE3F9, 0x5BE6, 0xE3FA, 0x6089,\n\t0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, 0x5FC3, 0xE3FE, 0x6C81,\t0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, 0xE4A4, 0x751A,\n\t0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, 0x5341,\t0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E,\n\t0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25,\t0xE4B1, 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD,\n\t0xE4B5, 0x83AA, 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D,\t0xE4B9, 0x963F, 0xE4BA, 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09,\n\t0xE4BD, 0x9D5D, 0xE4BE, 0x580A, 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD,\t0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, 0x6115, 0xE4C4, 0x63E1,\n\t0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, 0xE4C8, 0x9354,\t0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, 0x5B89,\n\t0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848,\t0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854,\n\t0xE4D5, 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB,\t0xE4D9, 0x95BC, 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6,\n\t0xE4DD, 0x5EB5, 0xE4DE, 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4,\t0xE4E1, 0x95C7, 0xE4E2, 0x58D3, 0xE4E3, 0x62BC, 0xE4E4, 0x72CE,\n\t0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, 0x592E, 0xE4E8, 0x600F,\t0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, 0xE4EC, 0x9D26,\n\t0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, 0x5D16,\t0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D,\n\t0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384,\t0xE4F9, 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A,\n\t0xE4FD, 0x814B, 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C,\t0xE5A3, 0x9DAF, 0xE5A4, 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B,\n\t0xE5A7, 0x51B6, 0xE5A8, 0x591C, 0xE5A9, 0x60F9, 0xE5AA, 0x63F6,\t0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, 0x8036, 0xE5AE, 0xF974,\n\t0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, 0xE5B2, 0xF976,\t0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, 0x84BB,\n\t0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F,\t0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43,\n\t0xE5BF, 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D,\t0xE5C3, 0x6698, 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23,\n\t0xE5C7, 0x6D0B, 0xE5C8, 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2,\t0xE5CB, 0x760D, 0xE5CC, 0x79B3, 0xE5CD, 0x7A70, 0xE5CE, 0xF97B,\n\t0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, 0x8944, 0xE5D2, 0xF97D,\t0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, 0xE5D6, 0xF97E,\n\t0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, 0x65BC,\t0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E,\n\t0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104,\t0xE5E3, 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6,\n\t0xE5E7, 0x5043, 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109,\t0xE5EB, 0x8A00, 0xE5EC, 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616,\n\t0xE5EF, 0x4FFA, 0xE5F0, 0x513C, 0xE5F1, 0x56B4, 0xE5F2, 0x5944,\t0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, 0x5DAA, 0xE5F6, 0x696D,\n\t0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, 0xE5FA, 0xF97F,\t0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, 0xF982,\n\t0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984,\t0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207,\n\t0xE6A9, 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D,\t0xE6AD, 0xF986, 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988,\n\t0xE6B1, 0xF989, 0xE6B2, 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF,\t0xE6B5, 0x5F79, 0xE6B6, 0x6613, 0xE6B7, 0xF98B, 0xE6B8, 0xF98C,\n\t0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, 0x8B6F, 0xE6BC, 0xF98D,\t0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, 0xE6C0, 0x5827,\n\t0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, 0xF98E,\t0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350,\n\t0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87,\t0xE6CD, 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5,\n\t0xE6D1, 0x6F14, 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136,\t0xE6D5, 0x7159, 0xE6D6, 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5,\n\t0xE6D9, 0xF994, 0xE6DA, 0x784F, 0xE6DB, 0x786F, 0xE6DC, 0xF995,\t0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, 0xF996, 0xE6E0, 0x7E2F,\n\t0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, 0xE6E4, 0xF998,\t0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, 0xF99B,\n\t0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E,\t0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1,\n\t0xE6F1, 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD,\t0xE6F5, 0xF9A2, 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3,\n\t0xE6F9, 0xF9A5, 0xE6FA, 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430,\t0xE6FD, 0x8276, 0xE6FE, 0x82D2, 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB,\n\t0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, 0x66C4, 0xE7A6, 0xF9A7,\t0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, 0xE7AA, 0xF9A9,\n\t0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, 0x5DB8,\t0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E,\n\t0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3,\t0xE7B7, 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B,\n\t0xE7BB, 0x702F, 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370,\t0xE7BF, 0xF9AD, 0xE7C0, 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4,\n\t0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF,\t0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, 0x8A60, 0xE7CA, 0x8FCE,\n\t0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, 0xE7CE, 0x9719,\t0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, 0x502A,\n\t0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3,\t0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F,\n\t0xE7DB, 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602,\t0xE7DF, 0xF9B6, 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D,\n\t0xE7E3, 0x8C6B, 0xE7E4, 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8,\t0xE7E7, 0x9713, 0xE7E8, 0x9810, 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D,\n\t0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, 0x5348, 0xE7EE, 0x543E,\t0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, 0xE7F2, 0x58BA,\n\t0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, 0x609F,\t0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF,\n\t0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3,\t0xE8A1, 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D,\n\t0xE8A5, 0x8708, 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07,\t0xE8A9, 0x5C4B, 0xE8AA, 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389,\n\t0xE8AD, 0x923A, 0xE8AE, 0x6EAB, 0xE8AF, 0x7465, 0xE8B0, 0x761F,\t0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, 0x860A, 0xE8B4, 0x5140,\n\t0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, 0xE8B8, 0x7515,\t0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, 0x96CD,\n\t0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9,\t0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778,\n\t0xE8C5, 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B,\t0xE8C9, 0x68A1, 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9,\n\t0xE8CD, 0x7413, 0xE8CE, 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9,\t0xE8D1, 0x7FEB, 0xE8D2, 0x8118, 0xE8D3, 0x8155, 0xE8D4, 0x839E,\n\t0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, 0x9811, 0xE8D8, 0x66F0,\t0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, 0xE8DC, 0x6C6A,\n\t0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, 0x6B6A,\t0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD,\n\t0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB,\t0xE8E9, 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D,\n\t0xE8ED, 0x5996, 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC,\t0xE8F1, 0xF9BD, 0xE8F2, 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416,\n\t0xE8F5, 0x6493, 0xE8F6, 0x64FE, 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC,\t0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, 0xF9C0, 0xE8FC, 0x71FF,\n\t0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, 0xE9A2, 0x7AAF,\t0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, 0x8170,\n\t0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20,\t0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952,\n\t0xE9AF, 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F,\t0xE9B3, 0x8925, 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD,\n\t0xE9B7, 0x5197, 0xE9B8, 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889,\t0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, 0xE9BD, 0x6142, 0xE9BE, 0x6995,\n\t0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, 0x6EB6, 0xE9C2, 0x7194,\t0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, 0xE9C6, 0x8073,\n\t0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, 0x9394,\t0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51,\n\t0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB,\t0xE9D3, 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24,\n\t0xE9D7, 0x611A, 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B,\t0xE9DB, 0x7397, 0xE9DC, 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950,\n\t0xE9DF, 0x7991, 0xE9E0, 0x79B9, 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD,\t0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, 0x865E, 0xE9E6, 0x8FC2,\n\t0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, 0xE9EA, 0x9685,\t0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, 0x5F67,\n\t0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C,\t0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91,\n\t0xE9F7, 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90,\t0xE9FB, 0x7189, 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553,\n\t0xEAA1, 0x904B, 0xEAA2, 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB,\t0xEAA5, 0x851A, 0xEAA6, 0x9B31, 0xEAA7, 0x4E90, 0xEAA8, 0x718A,\n\t0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, 0x539F, 0xEAAC, 0x54E1,\t0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, 0xEAB0, 0x5A9B,\n\t0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, 0x613F,\t0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72,\n\t0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457,\t0xEABD, 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060,\n\t0xEAC1, 0xF9C6, 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B,\t0xEAC5, 0x6708, 0xEAC6, 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D,\n\t0xEAC9, 0x5049, 0xEACA, 0x50DE, 0xEACB, 0x5371, 0xEACC, 0x570D,\t0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, 0x5C09, 0xEAD0, 0x6170,\n\t0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, 0xEAD4, 0x744B,\t0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, 0x8466,\n\t0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918,\t0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F,\n\t0xEAE1, 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A,\t0xEAE5, 0xF9C7, 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A,\n\t0xEAE9, 0x5BA5, 0xEAEA, 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE,\t0xEAED, 0x60A0, 0xEAEE, 0x60DF, 0xEAEF, 0x6108, 0xEAF0, 0x6109,\n\t0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, 0x6709, 0xEAF4, 0xF9C8,\t0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, 0xEAF8, 0x6961,\n\t0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, 0xF9CA,\t0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336,\n\t0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531,\t0xEBA7, 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF,\n\t0xEBAB, 0x7DAD, 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5,\t0xEBAF, 0x8A98, 0xEBB0, 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30,\n\t0xEBB3, 0x8E42, 0xEBB4, 0x904A, 0xEBB5, 0x903E, 0xEBB6, 0x907A,\t0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, 0x936E, 0xEBBA, 0xF9D0,\n\t0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, 0xEBBE, 0x6BD3,\t0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, 0xF9D4,\n\t0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5,\t0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4,\n\t0xEBCB, 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F,\t0xEBCF, 0xF9D8, 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB,\n\t0xEBD3, 0x807F, 0xEBD4, 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68,\t0xEBD7, 0x878D, 0xEBD8, 0xF9DC, 0xEBD9, 0x57A0, 0xEBDA, 0x6069,\n\t0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, 0x8ABE, 0xEBDE, 0x9280,\t0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, 0xEBE2, 0x6DEB,\n\t0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, 0x98EE,\t0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD,\n\t0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D,\t0xEBEF, 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F,\n\t0xEBF3, 0x61FF, 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5,\t0xEBF7, 0x7591, 0xEBF8, 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264,\n\t0xEBFB, 0x858F, 0xEBFC, 0x87FB, 0xEBFD, 0x8863, 0xEBFE, 0x8ABC,\t0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, 0x4E8C, 0xECA4, 0x4EE5,\n\t0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, 0xECA8, 0x5937,\t0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, 0x5F1B,\n\t0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1,\t0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5,\n\t0xECB5, 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5,\t0xECB9, 0x79FB, 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033,\n\t0xECBD, 0x8084, 0xECBE, 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7,\t0xECC1, 0xF9E8, 0xECC2, 0x8CBD, 0xECC3, 0x8CB3, 0xECC4, 0x9087,\n\t0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, 0x98F4, 0xECC8, 0x990C,\t0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, 0xECCC, 0x76CA,\n\t0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, 0x8B1A,\t0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370,\n\t0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB,\t0xECD9, 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E,\n\t0xECDD, 0xF9EE, 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335,\t0xECE1, 0xF9F0, 0xECE2, 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1,\n\t0xECE5, 0x976D, 0xECE6, 0x9777, 0xECE7, 0xF9F2, 0xECE8, 0xF9F3,\t0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, 0x4F7E, 0xECEC, 0x58F9,\n\t0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, 0xECF0, 0x93B0,\t0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, 0x598A,\n\t0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5,\t0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3,\n\t0xECFD, 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8,\t0xEDA3, 0xF9F9, 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55,\n\t0xEDA7, 0x82BF, 0xEDA8, 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8,\t0xEDAB, 0x59C9, 0xEDAC, 0x59FF, 0xEDAD, 0x5B50, 0xEDAE, 0x5B57,\n\t0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, 0x6148, 0xEDB2, 0x6ECB,\t0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, 0xEDB6, 0x74F7,\n\t0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, 0x8005,\t0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9,\n\t0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C,\t0xEDC3, 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628,\n\t0xEDC7, 0x707C, 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD,\t0xEDCB, 0x828D, 0xEDCC, 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72,\n\t0xEDCF, 0x5B71, 0xEDD0, 0x68E7, 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A,\t0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, 0x66AB, 0xEDD6, 0x6F5B,\n\t0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, 0xEDDA, 0x96DC,\t0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, 0x5834,\n\t0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07,\t0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C,\n\t0xEDE7, 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3,\t0xEDEB, 0x6B0C, 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA,\n\t0xEDEF, 0x7350, 0xEDF0, 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7,\t0xEDF3, 0x8178, 0xEDF4, 0x81DF, 0xEDF5, 0x81E7, 0xEDF6, 0x838A,\n\t0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, 0x8594, 0xEDFA, 0x85CF,\t0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, 0xEDFE, 0x9577,\n\t0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, 0x5728,\t0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D,\n\t0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D,\t0xEEAD, 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09,\n\t0xEEB1, 0x9F4B, 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F,\t0xEEB5, 0x8ACD, 0xEEB6, 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E,\n\t0xEEB9, 0x5132, 0xEEBA, 0x5480, 0xEEBB, 0x59D0, 0xEEBC, 0x5E95,\t0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, 0x696E, 0xEEC0, 0x6A17,\n\t0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, 0xEEC4, 0x732A,\t0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, 0x82E7,\n\t0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B,\t0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8,\n\t0xEED1, 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A,\t0xEED5, 0x5AE1, 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575,\n\t0xEED9, 0x6EF4, 0xEEDA, 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684,\t0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E,\n\t0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, 0x8B2B, 0xEEE4, 0x8CCA,\t0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, 0xEEE8, 0x8FEA,\n\t0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, 0x4F43,\t0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178,\n\t0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C,\t0xEEF5, 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB,\n\t0xEEF9, 0x609B, 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF,\t0xEEFD, 0x6C08, 0xEEFE, 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420,\n\t0xEFA3, 0x7530, 0xEFA4, 0x7538, 0xEFA5, 0x7551, 0xEFA6, 0x7672,\t0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, 0x7BAD, 0xEFAA, 0x7BC6,\n\t0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, 0xEFAE, 0x8F49,\t0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, 0x942B,\n\t0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E,\t0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59,\n\t0xEFBB, 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76,\t0xEFBF, 0x5360, 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38,\n\t0xEFC3, 0x70B9, 0xEFC4, 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E,\t0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, 0xEFC9, 0x647A, 0xEFCA, 0x8776,\n\t0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, 0x4EAD, 0xEFCE, 0x505C,\t0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, 0xEFD2, 0x5B9A,\n\t0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, 0x5F81,\t0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574,\n\t0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE,\t0xEFDF, 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40,\n\t0xEFE3, 0x6DC0, 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E,\t0xEFE7, 0x701E, 0xEFE8, 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD,\n\t0xEFEB, 0x753A, 0xEFEC, 0x775B, 0xEFED, 0x7887, 0xEFEE, 0x798E,\t0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, 0x7CBE, 0xEFF2, 0x7D8E,\n\t0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, 0xEFF6, 0x8C9E,\t0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, 0x9266,\n\t0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756,\t0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236,\n\t0xF0A5, 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D,\t0xF0A9, 0x5F1F, 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF,\n\t0xF0AD, 0x6FDF, 0xF0AE, 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD,\t0xF0B1, 0x85BA, 0xF0B2, 0x88FD, 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44,\n\t0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, 0x969B, 0xF0B8, 0x973D,\t0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, 0xF0BC, 0x5146,\n\t0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, 0x5F14,\t0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9,\n\t0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D,\t0xF0C9, 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15,\n\t0xF0CD, 0x6F6E, 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A,\t0xF0D1, 0x74AA, 0xF0D2, 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A,\n\t0xF0D5, 0x79DF, 0xF0D6, 0x7A20, 0xF0D7, 0x7A95, 0xF0D8, 0x7C97,\t0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, 0x7E70, 0xF0DC, 0x8087,\n\t0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, 0xF0E0, 0x8ABF,\t0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, 0x906D,\n\t0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5,\t0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3,\n\t0xF0ED, 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9,\t0xF0F1, 0x731D, 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E,\n\t0xF0F5, 0x60B0, 0xF0F6, 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9,\t0xF0F9, 0x742E, 0xF0FA, 0x7A2E, 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C,\n\t0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, 0x8E2A, 0xF1A2, 0x8E35,\t0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, 0xF1A6, 0x5750,\n\t0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, 0x7F6A,\t0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A,\n\t0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468,\t0xF1B3, 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE,\n\t0xF1B7, 0x5EDA, 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1,\t0xF1BB, 0x682A, 0xF1BC, 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A,\n\t0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, 0xF1C1, 0x73E0, 0xF1C2, 0x7587,\t0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, 0x7D2C, 0xF1C6, 0x7DA2,\n\t0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, 0xF1CA, 0x8A85,\t0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, 0x9031,\n\t0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0,\t0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101,\n\t0xF1D7, 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB,\t0xF1DB, 0x6659, 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96,\n\t0xF1DF, 0x6FEC, 0xF1E0, 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3,\t0xF1E3, 0x8822, 0xF1E4, 0x9021, 0xF1E5, 0x9075, 0xF1E6, 0x96CB,\n\t0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, 0x4E2D, 0xF1EA, 0x4EF2,\t0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, 0xF1EE, 0x6ADB,\n\t0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, 0x589E,\t0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD,\n\t0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8,\t0xF1FB, 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA,\n\t0xF2A1, 0x54AB, 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7,\t0xF2A5, 0x6301, 0xF2A6, 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F,\n\t0xF2A9, 0x65E8, 0xF2AA, 0x667A, 0xF2AB, 0x679D, 0xF2AC, 0x67B3,\t0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, 0x6C9A, 0xF2B0, 0x6F2C,\n\t0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, 0xF2B4, 0x7957,\t0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, 0x81F3,\n\t0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C,\t0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072,\n\t0xF2C1, 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54,\t0xF2C5, 0x8077, 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875,\n\t0xF2C9, 0x632F, 0xF2CA, 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B,\t0xF2CD, 0x686D, 0xF2CE, 0x699B, 0xF2CF, 0x6B84, 0xF2D0, 0x6D25,\n\t0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, 0x7468, 0xF2D4, 0x74A1,\t0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, 0xF2D8, 0x771E,\n\t0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, 0x7E1D,\t0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A,\n\t0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032,\t0xF2E5, 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707,\n\t0xF2E9, 0x4F84, 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9,\t0xF2ED, 0x5E19, 0xF2EE, 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE,\n\t0xF2F1, 0x79E9, 0xF2F2, 0x7A92, 0xF2F3, 0x81A3, 0xF2F4, 0x86ED,\t0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, 0x8FED, 0xF2F8, 0x659F,\n\t0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, 0xF2FC, 0x6F57,\t0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, 0x96C6,\n\t0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14,\t0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF,\n\t0xF3AB, 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64,\t0xF3AF, 0x78CB, 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49,\n\t0xF3B3, 0x8ECA, 0xF3B4, 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E,\t0xF3B7, 0x7740, 0xF3B8, 0x7A84, 0xF3B9, 0x932F, 0xF3BA, 0x947F,\n\t0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, 0x6FAF, 0xF3BE, 0x71E6,\t0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, 0xF3C2, 0x7C12,\n\t0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, 0x8B9A,\t0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C,\n\t0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D,\t0xF3CF, 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879,\n\t0xF3D3, 0x6158, 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC,\t0xF3D7, 0x7AD9, 0xF3D8, 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009,\n\t0xF3DB, 0x5021, 0xF3DC, 0x5275, 0xF3DD, 0x5531, 0xF3DE, 0x5A3C,\t0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, 0x6134, 0xF3E2, 0x655E,\n\t0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, 0xF3E6, 0x69CD,\t0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, 0x7621,\n\t0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6,\t0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0,\n\t0xF3F3, 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826,\t0xF3F7, 0x7DB5, 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7,\n\t0xF3FB, 0x91F5, 0xF3FC, 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56,\t0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, 0xF4A3, 0x59BB, 0xF4A4, 0x60BD,\n\t0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, 0xF9FF, 0xF4A8, 0x5254,\t0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, 0xF4AC, 0x62D3,\n\t0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, 0x7620,\t0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB,\n\t0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929,\t0xF4B9, 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA,\n\t0xF4BD, 0x7394, 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6,\t0xF4C1, 0x8CE4, 0xF4C2, 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7,\n\t0xF4C5, 0x95E1, 0xF4C6, 0x9621, 0xF4C7, 0x97C6, 0xF4C8, 0x51F8,\t0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, 0x5FB9, 0xF4CC, 0x64A4,\n\t0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, 0xF4D0, 0x8F4D,\t0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, 0x6CBE,\n\t0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D,\t0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E,\n\t0xF4DD, 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252,\t0xF4E1, 0x758A, 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC,\n\t0xF4E5, 0x8F12, 0xF4E6, 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8,\t0xF4E9, 0x807D, 0xF4EA, 0x83C1, 0xF4EB, 0x8ACB, 0xF4EC, 0x9751,\n\t0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, 0x5243, 0xF4F0, 0x66FF,\t0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, 0xF4F4, 0x8AE6,\n\t0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, 0x521D,\t0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284,\n\t0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A,\t0xF5A3, 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D,\n\t0xF5A7, 0x7901, 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D,\t0xF5AB, 0x8096, 0xF5AC, 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349,\n\t0xF5AF, 0x8549, 0xF5B0, 0x8C82, 0xF5B1, 0x8D85, 0xF5B2, 0x9162,\t0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, 0x4FC3, 0xF5B6, 0x56D1,\n\t0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, 0xF5BA, 0x89F8,\t0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, 0x90A8,\n\t0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4,\t0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070,\n\t0xF5C7, 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC,\t0xF5CB, 0x5D14, 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD,\n\t0xF5CF, 0x63A8, 0xF5D0, 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E,\t0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, 0xF5D5, 0x79CB, 0xF5D6, 0x82BB,\n\t0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, 0x8DA8, 0xF5DA, 0x8FFD,\t0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, 0xF5DE, 0x9310,\n\t0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, 0x9A36,\t0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D,\n\t0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E,\t0xF5EB, 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8,\n\t0xF5EF, 0x9010, 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443,\t0xF5F3, 0x51FA, 0xF5F4, 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145,\n\t0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, 0xF5F9, 0x87F2, 0xF5FA, 0x885D,\t0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, 0x81B5, 0xF5FE, 0x8403,\n\t0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, 0xF6A4, 0x5634,\t0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, 0x7FE0,\n\t0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3,\t0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074,\n\t0xF6B1, 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C,\t0xF6B5, 0x5C64, 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4,\n\t0xF6B9, 0x5CD9, 0xF6BA, 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894,\t0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, 0xF6BF, 0x71BE, 0xF6C0, 0x75D4,\n\t0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, 0x7A1A, 0xF6C4, 0x7A49,\t0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, 0xF6C8, 0x81F4,\n\t0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, 0x99B3,\t0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED,\n\t0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06,\t0xF6D5, 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88,\n\t0xF6D9, 0x6D78, 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD,\t0xF6DD, 0x937C, 0xF6DE, 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31,\n\t0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, 0xF6E3, 0x54A4, 0xF6E4, 0x553E,\t0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, 0x60F0, 0xF6E8, 0x6253,\n\t0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, 0xF6EC, 0x8235,\t0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, 0x502C,\n\t0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01,\t0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B,\n\t0xF6F9, 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422,\t0xF6FD, 0x7438, 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451,\n\t0xF7A3, 0x5606, 0xF7A4, 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A,\t0xF7A7, 0x6B4E, 0xF7A8, 0x7058, 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB,\n\t0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, 0x812B, 0xF7AE, 0x63A2,\t0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, 0xF7B2, 0x5854,\n\t0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, 0x5E11,\t0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C,\n\t0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B,\t0xF7BF, 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E,\n\t0xF7C3, 0x80CE, 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0,\t0xF7C7, 0x98B1, 0xF7C8, 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4,\n\t0xF7CB, 0x6491, 0xF7CC, 0x6504, 0xF7CD, 0x514E, 0xF7CE, 0x5410,\t0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, 0x615F, 0xF7D2, 0x6876,\n\t0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, 0xF7D6, 0x7D71,\t0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, 0x817F,\n\t0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078,\t0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F,\n\t0xF7E3, 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6,\t0xF7E7, 0x5761, 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A,\n\t0xF7EB, 0x64AD, 0xF7EC, 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2,\t0xF7EF, 0x6D3E, 0xF7F0, 0x722C, 0xF7F1, 0x7436, 0xF7F2, 0x7834,\n\t0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, 0x8DDB, 0xF7F6, 0x9817,\t0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, 0xF7FA, 0x7248,\n\t0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, 0x9211,\t0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C,\n\t0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557,\t0xF8A9, 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD,\n\t0xF8AD, 0x7A17, 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D,\t0xF8B1, 0x6F8E, 0xF8B2, 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E,\n\t0xF8B5, 0x4FBF, 0xF8B6, 0x504F, 0xF8B7, 0x6241, 0xF8B8, 0x7247,\t0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, 0x7FE9, 0xF8BC, 0x904D,\n\t0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, 0xF8C0, 0x576A,\t0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, 0x8A55,\n\t0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2,\t0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D,\n\t0xF8CD, 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305,\t0xF8D1, 0x530D, 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA,\n\t0xF8D5, 0x5703, 0xF8D6, 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B,\t0xF8D9, 0x62B1, 0xF8DA, 0x6355, 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1,\n\t0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, 0x7832, 0xF8E0, 0x80DE,\t0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, 0xF8E4, 0x84B2,\n\t0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, 0x92EA,\t0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4,\n\t0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07,\t0xF8F1, 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153,\n\t0xF8F5, 0x6753, 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2,\t0xF8F9, 0x7968, 0xF8FA, 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7,\n\t0xF8FD, 0x98C4, 0xF8FE, 0x9A43, 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F,\t0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, 0x8C4A, 0xF9A6, 0x98A8,\n\t0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, 0xF9AA, 0x75B2,\t0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, 0x9642,\n\t0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC,\t0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46,\n\t0xF9B7, 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C,\t0xF9BB, 0x4E0B, 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F,\n\t0xF9BF, 0x5EC8, 0xF9C0, 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455,\t0xF9C3, 0x8377, 0xF9C4, 0x8766, 0xF9C5, 0x8CC0, 0xF9C6, 0x9050,\n\t0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, 0x58D1, 0xF9CA, 0x5B78,\t0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, 0xF9CE, 0x5BD2,\n\t0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, 0x6C57,\t0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55,\n\t0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650,\t0xF9DB, 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD,\n\t0xF9DF, 0x542B, 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A,\t0xF9E3, 0x6ABB, 0xF9E4, 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266,\n\t0xF9E7, 0x929C, 0xF9E8, 0x9677, 0xF9E9, 0x9E79, 0xF9EA, 0x5408,\t0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, 0x86E4, 0xF9EE, 0x95A4,\n\t0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, 0xF9F2, 0x4F09,\t0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, 0x6052,\n\t0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86,\t0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A,\n\t0xFAA1, 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5,\t0xFAA5, 0x5055, 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A,\n\t0xFAA9, 0x5B69, 0xFAAA, 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977,\t0xFAAD, 0x6D77, 0xFAAE, 0x7023, 0xFAAF, 0x87F9, 0xFAB0, 0x89E3,\n\t0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, 0x9082, 0xFAB4, 0x99ED,\t0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, 0xFAB8, 0x5016,\n\t0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, 0x884C,\t0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6,\n\t0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957,\t0xFAC5, 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B,\n\t0xFAC9, 0x8A31, 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B,\t0xFACD, 0x8ED2, 0xFACE, 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57,\n\t0xFAD1, 0x5955, 0xFAD2, 0x7200, 0xFAD3, 0x8D6B, 0xFAD4, 0x9769,\t0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, 0x5F26, 0xFAD8, 0x61F8,\n\t0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, 0xFADC, 0x7384,\t0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, 0x774D,\n\t0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237,\t0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249,\n\t0xFAE9, 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840,\t0xFAED, 0x9801, 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354,\n\t0xFAF1, 0x593E, 0xFAF2, 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79,\t0xFAF5, 0x72F9, 0xFAF6, 0x8105, 0xFAF7, 0x8107, 0xFAF8, 0x83A2,\n\t0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, 0x4EA8, 0xFAFC, 0x5144,\t0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, 0xFBA2, 0x6CC2,\n\t0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, 0x70AF,\t0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A,\n\t0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2,\t0xFBAF, 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57,\n\t0xFBB3, 0x60E0, 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559,\t0xFBB7, 0x8E4A, 0xFBB8, 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E,\n\t0xFBBB, 0x4E92, 0xFBBC, 0x547C, 0xFBBD, 0x58D5, 0xFBBE, 0x58FA,\t0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, 0x5F27, 0xFBC2, 0x6236,\n\t0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, 0xFBC6, 0x6BEB,\t0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, 0x6EF8,\n\t0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D,\t0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0,\n\t0xFBD3, 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E,\t0xFBD7, 0x80E1, 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF,\n\t0xFBDB, 0x864E, 0xFBDC, 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77,\t0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, 0xFBE1, 0x9800, 0xFBE2, 0x9865,\n\t0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, 0x9177, 0xFBE6, 0x5A5A,\t0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, 0xFBEA, 0x743F,\n\t0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, 0x7B0F,\t0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3,\n\t0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679,\t0xFBF7, 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C,\n\t0xFBFB, 0x5B05, 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575,\t0xFCA1, 0x798D, 0xFCA2, 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF,\n\t0xFCA5, 0x8A71, 0xFCA6, 0x8B41, 0xFCA7, 0x8CA8, 0xFCA8, 0x9774,\t0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, 0x652B, 0xFCAC, 0x78BA,\n\t0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, 0xFCB0, 0x559A,\t0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, 0x60A3,\n\t0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853,\t0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08,\n\t0xFCBD, 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B,\t0xFCC1, 0x6ED1, 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA,\n\t0xFCC5, 0x51F0, 0xFCC6, 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D,\t0xFCC9, 0x60F6, 0xFCCA, 0x6130, 0xFCCB, 0x614C, 0xFCCC, 0x6643,\n\t0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, 0x6CC1, 0xFCD0, 0x6E5F,\t0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, 0xFCD4, 0x749C,\n\t0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, 0x8352,\t0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3,\n\t0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A,\t0xFCE1, 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666,\n\t0xFCE5, 0x6703, 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE,\t0xFCE9, 0x7070, 0xFCEA, 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE,\n\t0xFCED, 0x8334, 0xFCEE, 0x86D4, 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4,\t0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, 0x5B96, 0xFCF4, 0x6A6B,\n\t0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, 0xFCF8, 0x5B5D,\t0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, 0x689F,\n\t0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4,\t0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019,\n\t0xFDA7, 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589,\t0xFDAB, 0x55C5, 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D,\n\t0xFDAF, 0x7166, 0xFDB0, 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB,\t0xFDB3, 0x52F3, 0xFDB4, 0x5864, 0xFDB5, 0x58CE, 0xFDB6, 0x7104,\n\t0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, 0x85B0, 0xFDBA, 0x8A13,\t0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, 0xFDBE, 0x6684,\n\t0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, 0x5599,\t0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE,\n\t0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D,\t0xFDCB, 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB,\n\t0xFDCF, 0x7566, 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E,\t0xFDD3, 0x9DF8, 0xFDD4, 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308,\n\t0xFDD7, 0x6D36, 0xFDD8, 0x80F8, 0xFDD9, 0x9ED1, 0xFDDA, 0x6615,\t0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, 0x75D5, 0xFDDE, 0x5403,\n\t0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, 0xFDE2, 0x6B20,\t0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, 0x6070,\n\t0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6,\t0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD,\n\t0xFDEF, 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199,\t0xFDF3, 0x6198, 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6,\n\t0xFDF7, 0x7199, 0xFDF8, 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7,\t0xFDFB, 0x79A7, 0xFDFC, 0x7A00, 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70,\n\t0, 0\n};\n#endif\n\n#if FF_CODE_PAGE == 950 || FF_CODE_PAGE == 0\t/* Traditional Chinese */\nstatic const WCHAR uni2oem950[] = {\t/* Unicode --> Big5 pairs */\n\t0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3,\t0x00B7, 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE,\n\t0x02C9, 0xA3BC, 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5,\t0x02D9, 0xA3BB, 0x0391, 0xA344, 0x0392, 0xA345, 0x0393, 0xA346,\n\t0x0394, 0xA347, 0x0395, 0xA348, 0x0396, 0xA349, 0x0397, 0xA34A,\t0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, 0xA34D, 0x039B, 0xA34E,\n\t0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, 0x039F, 0xA352,\t0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, 0xA356,\n\t0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A,\t0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E,\n\t0x03B4, 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362,\t0x03B8, 0xA363, 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366,\n\t0x03BC, 0xA367, 0x03BD, 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A,\t0x03C0, 0xA36B, 0x03C1, 0xA36C, 0x03C3, 0xA36D, 0x03C4, 0xA36E,\n\t0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, 0xA371, 0x03C8, 0xA372,\t0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, 0x2018, 0xA1A5,\n\t0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, 0xA14C,\t0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB,\n\t0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1,\t0x2109, 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB,\n\t0x2163, 0xA2BC, 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF,\t0x2167, 0xA2C0, 0x2168, 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6,\n\t0x2191, 0xA1F4, 0x2192, 0xA1F7, 0x2193, 0xA1F5, 0x2196, 0xA1F8,\t0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, 0xA1FA, 0x2215, 0xA241,\n\t0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, 0x2220, 0xA1E7,\t0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, 0xA1E5,\n\t0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE,\t0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8,\n\t0x2267, 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6,\t0x22BF, 0xA1E9, 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A,\n\t0x2510, 0xA27B, 0x2514, 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275,\t0x2524, 0xA274, 0x252C, 0xA273, 0x2534, 0xA272, 0x253C, 0xA271,\n\t0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, 0xF9F8, 0x2552, 0xF9E6,\t0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, 0x2556, 0xF9F1,\n\t0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, 0xF9E3,\t0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5,\n\t0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7,\t0x2561, 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7,\n\t0x2565, 0xF9F0, 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6,\t0x2569, 0xF9E4, 0x256A, 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3,\n\t0x256C, 0xF9E1, 0x256D, 0xA27E, 0x256D, 0xF9FA, 0x256E, 0xA2A1,\t0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, 0xF9FD, 0x2570, 0xA2A2,\n\t0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, 0x2573, 0xA2AE,\t0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, 0xA264,\n\t0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268,\t0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E,\n\t0x258C, 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A,\t0x2593, 0xF9FE, 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD,\n\t0x25A1, 0xA1BC, 0x25B2, 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF,\t0x25BD, 0xA1BE, 0x25C6, 0xA1BB, 0x25C7, 0xA1BA, 0x25CB, 0xA1B3,\n\t0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, 0xA2A8, 0x25E3, 0xA2A9,\t0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, 0x2606, 0xA1B8,\n\t0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, 0xA142,\t0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172,\n\t0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176,\t0x300E, 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A,\n\t0x3012, 0xA245, 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9,\t0x301E, 0xA1AA, 0x3021, 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5,\n\t0x3024, 0xA2C6, 0x3025, 0xA2C7, 0x3026, 0xA2C8, 0x3027, 0xA2C9,\t0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, 0xA374, 0x3106, 0xA375,\n\t0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, 0x310A, 0xA379,\t0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, 0xA37D,\n\t0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3,\t0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7,\n\t0x3117, 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB,\t0x311B, 0xA3AC, 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF,\n\t0x311F, 0xA3B0, 0x3120, 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3,\t0x3123, 0xA3B4, 0x3124, 0xA3B5, 0x3125, 0xA3B6, 0x3126, 0xA3B7,\n\t0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, 0xA3BA, 0x32A3, 0xA1C0,\t0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, 0x339D, 0xA251,\n\t0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, 0xA253,\t0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440,\n\t0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456,\t0x4E09, 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946,\n\t0x4E0D, 0xA4A3, 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2,\t0x4E11, 0xA4A1, 0x4E14, 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540,\n\t0x4E18, 0xA543, 0x4E19, 0xA4FE, 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1,\t0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, 0xA4A4, 0x4E2E, 0xC950,\n\t0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, 0x4E33, 0xCBB1,\t0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, 0xC964,\n\t0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947,\t0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547,\n\t0x4E4F, 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4,\t0x4E58, 0xADBC, 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445,\n\t0x4E5E, 0xA45E, 0x4E5F, 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5,\t0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, 0x4E82, 0xB6C3, 0x4E83, 0xDCB1,\n\t0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, 0xA4A9, 0x4E8B, 0xA8C6,\t0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, 0x4E91, 0xA4AA,\n\t0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, 0xA4AB,\t0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45,\n\t0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8,\t0x4EA6, 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA,\n\t0x4EAD, 0xAB46, 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3,\t0x4EB9, 0xF6D6, 0x4EBA, 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF,\n\t0x4EC2, 0xC952, 0x4EC3, 0xA4B1, 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2,\t0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, 0xC953, 0x4ECA, 0xA4B5,\n\t0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, 0x4ED5, 0xA54B,\t0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, 0xA550,\n\t0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551,\t0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F,\n\t0x4EE5, 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5,\t0x4EF1, 0xC9B0, 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA,\n\t0x4EF5, 0xC9AE, 0x4EF6, 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4,\t0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, 0x4F00, 0xC9B1, 0x4F01, 0xA5F8,\n\t0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, 0xC9B6, 0x4F08, 0xC9B3,\t0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, 0x4F0D, 0xA5EE,\n\t0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, 0xA5F0,\t0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED,\n\t0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7,\t0x4F2C, 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4,\n\t0x4F33, 0xCA67, 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9,\t0x4F3A, 0xA6F8, 0x4F3B, 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7,\n\t0x4F3E, 0xCA60, 0x4F3F, 0xCA68, 0x4F41, 0xCA64, 0x4F43, 0xA6FA,\t0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, 0xA747, 0x4F49, 0xCA5D,\n\t0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, 0x4F4F, 0xA6ED,\t0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, 0xCA5E,\n\t0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF,\t0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2,\n\t0x4F5C, 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63,\t0x4F60, 0xA741, 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE,\n\t0x4F64, 0xCA5F, 0x4F67, 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF,\t0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB,\n\t0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, 0xCBB9, 0x4F75, 0xA8D6,\t0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, 0x4F79, 0xCBC1,\n\t0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, 0xCBB5,\t0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2,\n\t0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4,\t0x4F86, 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA,\n\t0x4F8B, 0xA8D2, 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4,\t0x4F91, 0xA8DD, 0x4F92, 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA,\n\t0x4F96, 0xA8DA, 0x4F97, 0xCBBE, 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0,\t0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, 0xA8CC, 0x4F9E, 0xCBC7,\n\t0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, 0x4FB3, 0xCDE8,\t0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, 0xCDEE,\n\t0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED,\t0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58,\n\t0x4FC5, 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54,\t0x4FCB, 0xCDE2, 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E,\n\t0x4FD0, 0xAB57, 0x4FD1, 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4,\t0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6,\n\t0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, 0xCDE5, 0x4FDD, 0xAB4F,\t0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, 0x4FE1, 0xAB48,\n\t0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, 0xADD1,\t0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4,\n\t0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA,\t0x5000, 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA,\n\t0x5009, 0xADDC, 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF,\t0x500E, 0xD0DD, 0x500F, 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB,\n\t0x5013, 0xD0CB, 0x5014, 0xADCF, 0x5015, 0xD45B, 0x5016, 0xADC6,\t0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, 0xADD4, 0x501A, 0xADCA,\n\t0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, 0x501F, 0xADC9,\t0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, 0xADC0,\n\t0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0,\t0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3,\n\t0x502D, 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC,\t0x5033, 0xD0D1, 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8,\n\t0x5040, 0xD463, 0x5041, 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C,\t0x5046, 0xD462, 0x5047, 0xB0B2, 0x5048, 0xD455, 0x5049, 0xB0B6,\n\t0x504A, 0xD459, 0x504B, 0xD452, 0x504C, 0xB0B4, 0x504D, 0xD456,\t0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, 0x5053, 0xD451,\n\t0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, 0xD458,\t0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D,\n\t0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460,\t0x5064, 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E,\n\t0x506A, 0xD44D, 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464,\t0x506F, 0xB0C0, 0x5070, 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465,\n\t0x5074, 0xB0BC, 0x5075, 0xB0BB, 0x5076, 0xB0B8, 0x5077, 0xB0BD,\t0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, 0xB3C8, 0x5082, 0xD85E,\n\t0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, 0x508B, 0xD855,\t0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, 0xB3C7,\n\t0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9,\t0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851,\n\t0x509C, 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3,\t0x50A3, 0xD856, 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7,\n\t0x50AF, 0xB6CD, 0x50B0, 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6,\t0x50B3, 0xB6C7, 0x50B4, 0xDCBA, 0x50B5, 0xB6C5, 0x50B6, 0xDCC3,\n\t0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, 0xDCBF, 0x50BB, 0xB6CC,\t0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, 0x50C1, 0xDCBE,\n\t0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, 0xDCB6,\t0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9,\n\t0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4,\t0x50D3, 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF,\n\t0x50D7, 0xE0F2, 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7,\t0x50E0, 0xE0FE, 0x50E3, 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE,\n\t0x50E6, 0xE0F0, 0x50E7, 0xB9AC, 0x50E8, 0xE0F3, 0x50E9, 0xB9B7,\t0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, 0xB9B0, 0x50EE, 0xB9AD,\n\t0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, 0x50F3, 0xE0F4,\t0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, 0xBBF9,\n\t0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6,\t0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5,\n\t0x5105, 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB,\t0x5109, 0xBBFC, 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF,\n\t0x5110, 0xBEAA, 0x5111, 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5,\t0x5114, 0xBEA9, 0x5115, 0xBEAB, 0x5117, 0xE8F6, 0x5118, 0xBEA8,\n\t0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, 0xC076, 0x5120, 0xECBD,\t0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, 0x5125, 0xECBA,\n\t0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, 0xEFB8,\t0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078,\n\t0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7,\t0x5138, 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C,\n\t0x513C, 0xC56B, 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461,\t0x5141, 0xA4B9, 0x5143, 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552,\n\t0x5146, 0xA5FC, 0x5147, 0xA5FB, 0x5148, 0xA5FD, 0x5149, 0xA5FA,\t0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, 0xA74B, 0x5152, 0xA8E0,\n\t0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, 0x5159, 0xA259,\t0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, 0xA25C,\n\t0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8,\t0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE,\n\t0x5169, 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB,\t0x516E, 0xA4BC, 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4,\n\t0x5177, 0xA8E3, 0x5178, 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC,\t0x5187, 0xC94E, 0x5189, 0xA554, 0x518A, 0xA555, 0x518D, 0xA641,\n\t0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, 0xAB5F, 0x5193, 0xD0E0,\t0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, 0x5198, 0xC955,\n\t0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, 0xADDE,\t0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642,\n\t0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B,\t0x51BC, 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2,\n\t0x51C5, 0xD0E3, 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1,\t0x51CB, 0xADE4, 0x51CC, 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5,\n\t0x51D0, 0xD468, 0x51D4, 0xD861, 0x51D7, 0xDCC5, 0x51D8, 0xE140,\t0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, 0xE8F9, 0x51E0, 0xA44C,\n\t0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, 0x51F3, 0xB9B9,\t0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, 0xA557,\n\t0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E,\t0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2,\n\t0x5209, 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646,\t0x5210, 0xC9BF, 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD,\n\t0x5216, 0xA647, 0x5217, 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC,\t0x521E, 0xCA6D, 0x5221, 0xCA6E, 0x5224, 0xA750, 0x5225, 0xA74F,\n\t0x5228, 0xA753, 0x5229, 0xA751, 0x522A, 0xA752, 0x522E, 0xA8ED,\t0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, 0x5233, 0xCBD2,\n\t0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, 0xA8E9,\t0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63,\n\t0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1,\t0x524A, 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65,\n\t0x524E, 0xAB62, 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB,\t0x5256, 0xADE5, 0x525A, 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6,\n\t0x525D, 0xADE9, 0x525E, 0xD0E9, 0x525F, 0xD0EA, 0x5261, 0xD0E6,\t0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, 0xB0C5, 0x526B, 0xD469,\n\t0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, 0x526F, 0xB0C6,\t0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, 0xB6D0,\n\t0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9,\t0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142,\n\t0x5282, 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40,\t0x5288, 0xBC41, 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2,\n\t0x528C, 0xE4F3, 0x528D, 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0,\t0x5296, 0xF1ED, 0x5297, 0xF5C3, 0x5298, 0xF5C2, 0x5299, 0xF7D1,\n\t0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, 0xA55B, 0x52A3, 0xA648,\t0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, 0x52AB, 0xA754,\n\t0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, 0xA8F1,\t0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C,\n\t0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A,\t0x52CD, 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA,\n\t0x52D6, 0xD46D, 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8,\t0x52DB, 0xB3D4, 0x52DD, 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2,\n\t0x52E2, 0xB6D5, 0x52E3, 0xB6D6, 0x52E4, 0xB6D4, 0x52E6, 0xB6D3,\t0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, 0xE4F5, 0x52F0, 0xBC45,\n\t0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, 0x52F5, 0xC079,\t0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, 0xA4C3,\n\t0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D,\t0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6,\n\t0x530B, 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC,\t0x5310, 0xB0CB, 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450,\n\t0x5316, 0xA4C6, 0x5317, 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943,\t0x531C, 0xC96C, 0x531D, 0xA560, 0x531F, 0xC9C2, 0x5320, 0xA64B,\n\t0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, 0xA758, 0x532A, 0xADEA,\t0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, 0x5331, 0xB9BC,\n\t0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, 0xCBD8,\t0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF,\n\t0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD,\t0x5345, 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8,\n\t0x5349, 0xA563, 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3,\t0x5351, 0xA8F5, 0x5352, 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3,\n\t0x5357, 0xAB6E, 0x535A, 0xB3D5, 0x535C, 0xA452, 0x535E, 0xA4CB,\t0x5360, 0xA565, 0x5361, 0xA564, 0x5363, 0xCA72, 0x5366, 0xA8F6,\n\t0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, 0x5370, 0xA64C,\t0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, 0xA75A,\n\t0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F,\t0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC,\n\t0x538A, 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9,\t0x5394, 0xCBDA, 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9,\n\t0x5399, 0xCDF8, 0x539A, 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED,\t0x539E, 0xD0EF, 0x539F, 0xADEC, 0x53A4, 0xD864, 0x53A5, 0xB3D6,\n\t0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, 0xB9BD, 0x53B2, 0xBC46,\t0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, 0x53C3, 0xB0D1,\n\t0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, 0xA4CD,\t0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC,\n\t0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F,\t0x53E3, 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574,\n\t0x53E8, 0xA56F, 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573,\t0x53EC, 0xA56C, 0x53ED, 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569,\n\t0x53F0, 0xA578, 0x53F1, 0xA577, 0x53F2, 0xA576, 0x53F3, 0xA56B,\t0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, 0xA57B, 0x53FC, 0xA570,\n\t0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, 0x5406, 0xA65B,\t0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, 0xA651,\n\t0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A,\t0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C,\n\t0x5418, 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C,\t0x541D, 0xA75B, 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770,\n\t0x5424, 0xCAA5, 0x5425, 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761,\t0x5428, 0xCAA4, 0x5429, 0xA768, 0x542A, 0xCA78, 0x542B, 0xA774,\n\t0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, 0xA76D, 0x5430, 0xCA76,\t0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, 0x5436, 0xA76F,\n\t0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, 0xA76B,\t0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772,\n\t0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A,\t0x5446, 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769,\n\t0x544E, 0xA760, 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB,\t0x5461, 0xCBEA, 0x5462, 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF,\n\t0x5465, 0xCBE4, 0x5466, 0xCBE7, 0x5467, 0xCBEE, 0x5468, 0xA950,\t0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, 0xCBE9, 0x5470, 0xCE49,\n\t0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, 0x5474, 0xCBE6,\t0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, 0xA941,\n\t0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952,\t0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD,\n\t0x5482, 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB,\t0x5488, 0xCBE0, 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8,\n\t0x548E, 0xA953, 0x5490, 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947,\t0x5495, 0xA942, 0x5496, 0xA940, 0x5498, 0xCBEC, 0x549A, 0xA94E,\n\t0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, 0xCE4B, 0x54A5, 0xCDFD,\t0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, 0x54A9, 0xABA7,\n\t0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, 0xCDFC,\t0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5,\n\t0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77,\t0x54BA, 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C,\n\t0x54BE, 0xCE4C, 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E,\t0x54C2, 0xAB7B, 0x54C3, 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46,\n\t0x54C6, 0xCE47, 0x54C7, 0xAB7A, 0x54C8, 0xABA2, 0x54C9, 0xAB76,\t0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, 0xCE44, 0x54DE, 0xCE4E,\n\t0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, 0x54E4, 0xD0F6,\t0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, 0xADEF,\n\t0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA,\t0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5,\n\t0x54F7, 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141,\t0x54FC, 0xADF3, 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1,\n\t0x5503, 0xD146, 0x5504, 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6,\t0x5507, 0xAE42, 0x5508, 0xD0FA, 0x5509, 0xADFC, 0x550A, 0xD140,\n\t0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, 0xD145, 0x550F, 0xAE44,\t0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, 0x5514, 0xADF8,\n\t0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, 0xAE41,\t0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2,\n\t0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2,\t0x5533, 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A,\n\t0x5537, 0xADF2, 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8,\t0x553C, 0xD473, 0x553E, 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7,\n\t0x5543, 0xB0D9, 0x5544, 0xB0D6, 0x5545, 0xD47E, 0x5546, 0xB0D3,\t0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, 0xD4AA, 0x554D, 0xD474,\n\t0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, 0x5551, 0xD478,\t0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, 0xB0E8,\n\t0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8,\t0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3,\n\t0x5566, 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472,\t0x5577, 0xD86A, 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875,\n\t0x557E, 0xB3EE, 0x557F, 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871,\t0x5582, 0xB3DE, 0x5583, 0xB3E4, 0x5584, 0xB5BD, 0x5587, 0xB3E2,\n\t0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, 0xB3DB, 0x558B, 0xB3E3,\t0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, 0x558F, 0xD86F,\n\t0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, 0xB3E1,\t0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA,\n\t0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A,\t0x55A2, 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868,\n\t0x55A6, 0xD877, 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0,\t0x55AB, 0xB3F0, 0x55AC, 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6,\n\t0x55B1, 0xB3ED, 0x55B2, 0xB3E9, 0x55B3, 0xB3E5, 0x55B5, 0xD870,\t0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, 0xDCD1, 0x55C2, 0xDCE0,\n\t0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, 0x55C6, 0xB6E6,\t0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, 0xDCCF,\n\t0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC,\t0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6,\n\t0x55D3, 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB,\t0x55D9, 0xDCDF, 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD,\n\t0x55DD, 0xDCD0, 0x55DF, 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA,\t0x55E3, 0xB6E0, 0x55E4, 0xB6E1, 0x55E5, 0xB6E7, 0x55E6, 0xB6DB,\n\t0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, 0xDCD4, 0x55EF, 0xB6E2,\t0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, 0x55F9, 0xE155,\n\t0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, 0xB9BE,\t0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150,\n\t0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5,\t0x560C, 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C,\n\t0x5610, 0xB9CC, 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3,\t0x5615, 0xE148, 0x5616, 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0,\n\t0x561C, 0xE14D, 0x561D, 0xE152, 0x561F, 0xB9CA, 0x5627, 0xE147,\t0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, 0xE544, 0x562E, 0xBC47,\n\t0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, 0x5633, 0xE542,\t0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, 0xE546,\n\t0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543,\t0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA,\n\t0x5642, 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6,\t0x5649, 0xE4FC, 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F,\n\t0x5653, 0xBC4E, 0x5657, 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2,\t0x565A, 0xE540, 0x565E, 0xE945, 0x5660, 0xE8FD, 0x5662, 0xBEBE,\n\t0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, 0xBEBA, 0x5666, 0xE941,\t0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, 0x566B, 0xBEB3,\n\t0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, 0xBEBC,\t0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940,\n\t0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7,\t0x5679, 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B,\n\t0x5681, 0xECC9, 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4,\t0x5685, 0xC07D, 0x5686, 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1,\n\t0x568D, 0xECC2, 0x568E, 0xC07A, 0x568F, 0xC0A1, 0x5690, 0xC07C,\t0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, 0xEFBC, 0x5698, 0xEFBA,\n\t0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, 0x569D, 0xEFBE,\t0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, 0xC456,\n\t0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1,\t0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459,\n\t0x56B5, 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A,\t0x56BD, 0xF5C5, 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9,\n\t0x56C2, 0xC4DB, 0x56C3, 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7,\t0x56C8, 0xC56D, 0x56C9, 0xC56F, 0x56CA, 0xC56E, 0x56CB, 0xF6D9,\n\t0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, 0xC5F1, 0x56D3, 0xF8A5,\t0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, 0x56DB, 0xA57C,\n\t0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, 0xA65D,\t0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8,\n\t0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778,\t0x56F7, 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA,\n\t0x5701, 0xD148, 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46,\t0x5707, 0xD4AC, 0x5708, 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB,\n\t0x570B, 0xB0EA, 0x570C, 0xD87C, 0x570D, 0xB3F2, 0x5712, 0xB6E9,\t0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, 0xB9CF, 0x5718, 0xB9CE,\n\t0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, 0x571E, 0xF96B,\t0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, 0xC96F,\n\t0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664,\t0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661,\n\t0x5733, 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3,\t0x5740, 0xA77D, 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1,\n\t0x5749, 0xCAAD, 0x574A, 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC,\t0x574D, 0xA77E, 0x574E, 0xA7A2, 0x574F, 0xA7A5, 0x5750, 0xA7A4,\n\t0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, 0xA959, 0x5762, 0xCBFE,\t0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, 0x5769, 0xA958,\n\t0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, 0xCBF2,\t0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC,\n\t0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956,\t0x577B, 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9,\n\t0x5782, 0xABAB, 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54,\t0x578F, 0xCE5A, 0x5793, 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E,\n\t0x5797, 0xCE55, 0x5798, 0xCE59, 0x5799, 0xCE5B, 0x579A, 0xCE5D,\t0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, 0xCE51, 0x579F, 0xCE52,\n\t0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, 0x57A4, 0xCE53,\t0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, 0xD153,\n\t0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151,\t0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47,\n\t0x57C3, 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49,\t0x57CC, 0xD14A, 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156,\n\t0x57D2, 0xD14D, 0x57D4, 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1,\t0x57DF, 0xB0EC, 0x57E0, 0xB0F0, 0x57E1, 0xD4C1, 0x57E2, 0xD4AF,\n\t0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, 0xD4BF, 0x57E7, 0xD4C5,\t0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, 0x57EE, 0xD4BC,\n\t0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, 0xD4B9,\t0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5,\n\t0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD,\t0x57FC, 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6,\n\t0x5802, 0xB0F3, 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF,\t0x5807, 0xD4BB, 0x5808, 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE,\n\t0x580B, 0xD4B8, 0x580C, 0xD4C7, 0x580D, 0xD4CB, 0x580E, 0xD4C2,\t0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, 0xD8A1, 0x581B, 0xD8AA,\n\t0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, 0x5820, 0xB3FB,\t0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, 0xD8A8,\n\t0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4,\t0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3,\n\t0x5830, 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB,\t0x5834, 0xB3F5, 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E,\n\t0x5838, 0xD8B0, 0x5839, 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF,\t0x583F, 0xD8AC, 0x5848, 0xD8A7, 0x5849, 0xDCE7, 0x584A, 0xB6F4,\n\t0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, 0xDCE6, 0x584E, 0xDCEA,\t0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, 0x5853, 0xDCE2,\n\t0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, 0xB6ED,\t0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB,\n\t0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4,\t0x5865, 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3,\n\t0x586F, 0xDCE8, 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0,\t0x5876, 0xE163, 0x5879, 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166,\n\t0x587C, 0xE157, 0x587D, 0xB9D7, 0x587E, 0xB9D1, 0x587F, 0xE15C,\t0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, 0xE164, 0x5883, 0xB9D2,\n\t0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, 0x5888, 0xE165,\t0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, 0xE162,\n\t0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3,\t0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B,\n\t0x589E, 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552,\t0x58A3, 0xE54E, 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5,\n\t0x58A9, 0xBC5B, 0x58AB, 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A,\t0x58AF, 0xE54F, 0x58B1, 0xE54C, 0x58B3, 0xBC58, 0x58BA, 0xE94D,\n\t0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, 0xE94A, 0x58BE, 0xBEC1,\t0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, 0x58C5, 0xBEC3,\n\t0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, 0xE94B,\t0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD,\n\t0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA,\t0x58D8, 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8,\n\t0x58DD, 0xF1F7, 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363,\t0x58E3, 0xF442, 0x58E4, 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2,\n\t0x58E9, 0xC5F2, 0x58EB, 0xA468, 0x58EC, 0xA4D0, 0x58EF, 0xA7A7,\t0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, 0xB3FD, 0x58FC, 0xDCF2,\n\t0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, 0x5903, 0xC95A,\t0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, 0xD159,\n\t0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469,\t0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668,\n\t0x591C, 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB,\t0x5925, 0xB9D9, 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3,\n\t0x592B, 0xA4D2, 0x592C, 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1,\t0x592F, 0xC971, 0x5931, 0xA5A2, 0x5937, 0xA669, 0x5938, 0xA66A,\n\t0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, 0xCAB1, 0x5944, 0xA961,\t0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, 0x5949, 0xA95E,\n\t0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, 0xABB7,\t0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3,\n\t0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD,\t0x5960, 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8,\n\t0x5969, 0xB9DD, 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D,\t0x596E, 0xBEC4, 0x5970, 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4,\n\t0x5973, 0xA46B, 0x5974, 0xA5A3, 0x5976, 0xA5A4, 0x5977, 0xC9D1,\t0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, 0xC9CF, 0x597C, 0xC9CD,\n\t0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, 0x5980, 0xC9CC,\t0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, 0xA66B,\n\t0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6,\t0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2,\n\t0x5996, 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE,\t0x599D, 0xA7A9, 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB,\n\t0x59A2, 0xCAB7, 0x59A3, 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4,\t0x59A6, 0xCAB2, 0x59A7, 0xCABA, 0x59A8, 0xA7AB, 0x59AE, 0xA967,\n\t0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, 0xCC48, 0x59B3, 0xA970,\t0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, 0x59B9, 0xA966,\n\t0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, 0xCC50,\t0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D,\n\t0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52,\t0x59CA, 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B,\n\t0x59CE, 0xCC47, 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968,\t0x59D2, 0xA971, 0x59D3, 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E,\n\t0x59D8, 0xABB9, 0x59DA, 0xABC0, 0x59DB, 0xCE6F, 0x59DC, 0xABB8,\t0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, 0xCE73, 0x59E1, 0xCE62,\n\t0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, 0x59E6, 0xABC1,\t0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, 0xAE56,\n\t0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D,\t0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B,\n\t0x59F7, 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A,\t0x59FD, 0xCE69, 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65,\n\t0x5A01, 0xABC2, 0x5A03, 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162,\t0x5A0C, 0xAE5B, 0x5A0F, 0xD160, 0x5A11, 0xAE50, 0x5A13, 0xAE55,\n\t0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, 0xD161, 0x5A18, 0xAE51,\t0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, 0x5A1E, 0xD163,\n\t0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, 0xAE5A,\t0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164,\n\t0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3,\t0x5A39, 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE,\n\t0x5A41, 0xB0FA, 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0,\t0x5A46, 0xB143, 0x5A47, 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB,\n\t0x5A4A, 0xB144, 0x5A4C, 0xD4E7, 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6,\t0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, 0xD4DA, 0x5A55, 0xD4D0,\n\t0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, 0x5A5A, 0xB142,\t0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, 0xD4D2,\n\t0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB,\t0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9,\n\t0x5A6A, 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8,\t0x5A77, 0xB440, 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9,\n\t0x5A7C, 0xD8BD, 0x5A7D, 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6,\t0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB,\n\t0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, 0xDD47, 0x5A92, 0xB443,\t0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, 0x5A97, 0xD8C5,\n\t0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, 0xD8CF,\t0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE,\n\t0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF,\t0x5AAE, 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8,\n\t0x5AB2, 0xB742, 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9,\t0x5AB6, 0xDD44, 0x5AB7, 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46,\n\t0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD,\t0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, 0xDD41, 0x5AC1, 0xB6F9,\n\t0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, 0x5AC7, 0xDCF3,\t0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, 0xDCF5,\n\t0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2,\t0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170,\n\t0x5ADB, 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178,\t0x5ADF, 0xE17C, 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174,\n\t0x5AE3, 0xB9E4, 0x5AE5, 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B,\t0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, 0x5AEB, 0xE172, 0x5AEC, 0xE177,\n\t0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, 0xE173, 0x5AF4, 0xE555,\t0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, 0x5AF8, 0xE55A,\n\t0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, 0xE556,\t0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559,\n\t0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E,\t0x5B0B, 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957,\n\t0x5B13, 0xE956, 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951,\t0x5B19, 0xE952, 0x5B1A, 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5,\n\t0x5B1E, 0xE95C, 0x5B20, 0xE95B, 0x5B21, 0xE954, 0x5B23, 0xECD1,\t0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, 0xECD4, 0x5B27, 0xECD3,\n\t0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, 0x5B2D, 0xECCE,\t0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, 0xECD0,\n\t0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA,\t0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D,\n\t0x5B45, 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB,\t0x5B4C, 0xF6DC, 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C,\n\t0x5B51, 0xA46D, 0x5B53, 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5,\t0x5B56, 0xC9D3, 0x5B57, 0xA672, 0x5B58, 0xA673, 0x5B5A, 0xA7B7,\n\t0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, 0xA7B5, 0x5B5F, 0xA973,\t0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, 0x5B65, 0xCC56,\n\t0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, 0xD4F0,\t0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446,\n\t0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9,\t0x5B7B, 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972,\n\t0x5B83, 0xA5A6, 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674,\t0x5B88, 0xA675, 0x5B89, 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9,\n\t0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, 0x5B92, 0xCABD, 0x5B93, 0xCC57,\t0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, 0xA978, 0x5B99, 0xA97A,\n\t0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, 0x5BA2, 0xABC8,\t0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, 0xABC6,\n\t0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167,\t0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62,\n\t0x5BB5, 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65,\t0x5BBF, 0xB14A, 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149,\n\t0x5BC4, 0xB148, 0x5BC5, 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146,\t0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, 0x5BCC, 0xB449, 0x5BCD, 0xD8D1,\n\t0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, 0xD8D4, 0x5BD2, 0xB448,\t0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, 0x5BD8, 0xDD49,\n\t0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, 0xE17E,\t0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED,\n\t0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB,\t0x5BE9, 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65,\n\t0x5BEE, 0xBC64, 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8,\t0x5BF2, 0xECD9, 0x5BF5, 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F,\n\t0x5BFA, 0xA678, 0x5C01, 0xABCA, 0x5C03, 0xD169, 0x5C04, 0xAE67,\t0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, 0xB14C, 0x5C0A, 0xB44C,\n\t0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, 0x5C0E, 0xBEC9,\t0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, 0xC974,\n\t0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B,\t0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE,\n\t0x5C2A, 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E,\t0x5C33, 0xDD4C, 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8,\n\t0x5C3A, 0xA4D8, 0x5C3B, 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0,\t0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, 0x5C41, 0xA7BE, 0x5C44, 0xCC59,\n\t0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, 0xCC5A, 0x5C48, 0xA97D,\t0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, 0x5C4E, 0xABCB,\n\t0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, 0xD16B,\t0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3,\n\t0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0,\t0x5C63, 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561,\n\t0x5C68, 0xC0AB, 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD,\t0x5C6D, 0xF8A8, 0x5C6E, 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473,\n\t0x5C73, 0xC977, 0x5C74, 0xC976, 0x5C79, 0xA67A, 0x5C7A, 0xC9D7,\t0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, 0xC9D9, 0x5C86, 0xCAC7,\n\t0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, 0x5C8B, 0xCAC3,\t0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, 0xA7C1,\n\t0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3,\t0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D,\n\t0x5CA1, 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C,\t0x5CA5, 0xCC69, 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60,\n\t0x5CA9, 0xA9A5, 0x5CAA, 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61,\t0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B,\n\t0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, 0xCC5E, 0x5CB6, 0xCC6A,\t0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, 0x5CC7, 0xCEA4,\n\t0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, 0xCE7D,\t0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79,\n\t0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6,\t0x5CD7, 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2,\n\t0x5CDB, 0xCE7E, 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F,\t0x5CEA, 0xAE6E, 0x5CEC, 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E,\n\t0x5CF0, 0xAE70, 0x5CF1, 0xD16F, 0x5CF4, 0xAE73, 0x5CF6, 0xAE71,\t0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, 0xD172, 0x5CFB, 0xAE6D,\n\t0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, 0x5D01, 0xAE72,\t0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, 0xD4F9,\n\t0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158,\t0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E,\n\t0x5D19, 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6,\t0x5D1E, 0xD4F4, 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157,\n\t0x5D23, 0xD542, 0x5D24, 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC,\t0x5D27, 0xB15D, 0x5D28, 0xD4FA, 0x5D29, 0xB159, 0x5D2E, 0xD544,\n\t0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, 0xD8EE, 0x5D33, 0xD8E3,\t0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, 0x5D37, 0xD8D9,\n\t0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, 0xD8ED,\t0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC,\n\t0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452,\t0x5D49, 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F,\n\t0x5D4E, 0xD8E1, 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5,\t0x5D55, 0xD8E2, 0x5D59, 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56,\n\t0x5D63, 0xDD4E, 0x5D65, 0xDD50, 0x5D67, 0xDD55, 0x5D68, 0xDD54,\t0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, 0xDD52, 0x5D6F, 0xB744,\n\t0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, 0x5D79, 0xE1B0,\t0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, 0xE1AD,\n\t0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3,\t0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC,\n\t0x5D89, 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565,\t0x5D93, 0xE567, 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563,\n\t0x5D99, 0xE562, 0x5D9A, 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A,\t0x5D9E, 0xE56D, 0x5D9F, 0xE564, 0x5DA0, 0xE569, 0x5DA1, 0xE56B,\n\t0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, 0xE966, 0x5DA9, 0xE960,\t0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, 0x5DAE, 0xE964,\n\t0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, 0xE967,\t0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF,\n\t0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4,\t0x5DC2, 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445,\n\t0x5DC9, 0xC460, 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA,\t0x5DD1, 0xF6DE, 0x5DD2, 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD,\n\t0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, 0x5DDD, 0xA474, 0x5DDE, 0xA67B,\t0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, 0xA8B5, 0x5DE2, 0xB15F,\n\t0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, 0x5DE8, 0xA5A8,\t0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, 0xA476,\n\t0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1,\t0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D,\n\t0x5E02, 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C,\t0x5E0A, 0xCACB, 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE,\n\t0x5E14, 0xCC6E, 0x5E15, 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D,\t0x5E18, 0xA9A9, 0x5E19, 0xCC6F, 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD,\n\t0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, 0xCEB3, 0x5E21, 0xCEB0,\t0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, 0x5E25, 0xABD3,\n\t0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, 0xAE75,\t0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163,\n\t0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456,\t0x5E41, 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454,\n\t0x5E4A, 0xDD5A, 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B,\t0x5E4E, 0xDD59, 0x5E4F, 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7,\n\t0x5E55, 0xB9F5, 0x5E57, 0xB9F6, 0x5E58, 0xE1B2, 0x5E59, 0xE1B3,\t0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, 0xE56F, 0x5E5F, 0xBC6D,\n\t0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, 0x5E63, 0xB9F4,\t0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, 0xE56E,\n\t0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5,\t0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A,\n\t0x5E73, 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D,\t0x5E78, 0xA9AF, 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE,\n\t0x5E7D, 0xABD5, 0x5E7E, 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A,\t0x5E84, 0xC9DC, 0x5E87, 0xA7C8, 0x5E88, 0xCAD0, 0x5E89, 0xCACE,\n\t0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, 0xCACF, 0x5E8D, 0xCAD1,\t0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, 0x5E97, 0xA9B1,\n\t0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, 0xABD6,\t0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA,\n\t0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177,\t0x5EAB, 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176,\n\t0x5EB0, 0xCEB5, 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B,\t0x5EB4, 0xD548, 0x5EB5, 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164,\n\t0x5EB8, 0xB165, 0x5EB9, 0xD549, 0x5EBE, 0xB168, 0x5EC1, 0xB45A,\t0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, 0xDD5D, 0x5EC6, 0xDD5F,\n\t0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, 0x5ECA, 0xB459,\t0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, 0xE1B6,\n\t0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA,\t0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB,\n\t0x5EDA, 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72,\t0x5EDE, 0xE574, 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575,\n\t0x5EE2, 0xBC6F, 0x5EE3, 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971,\t0x5EE7, 0xE970, 0x5EE8, 0xE972, 0x5EE9, 0xE96F, 0x5EEC, 0xC366,\n\t0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, 0xF5CB, 0x5EF2, 0xF6DF,\t0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, 0x5EFA, 0xABD8,\n\t0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, 0xC9DD,\t0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9,\n\t0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749,\t0x5F13, 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1,\n\t0x5F18, 0xA5B0, 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3,\t0x5F1F, 0xA7CC, 0x5F22, 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73,\n\t0x5F26, 0xA9B6, 0x5F27, 0xA9B7, 0x5F28, 0xCC70, 0x5F29, 0xA9B8,\t0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, 0xD17A, 0x5F31, 0xAE7A,\n\t0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, 0x5F37, 0xB16A,\t0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, 0xE1BF,\n\t0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576,\t0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573,\n\t0x5F4F, 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B,\t0x5F58, 0xD8F4, 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE,\n\t0x5F64, 0xA7CD, 0x5F65, 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D,\t0x5F6A, 0xB343, 0x5F6B, 0xB16E, 0x5F6C, 0xB16C, 0x5F6D, 0xB45E,\n\t0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, 0xBC76, 0x5F73, 0xC94C,\t0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, 0x5F78, 0xCAD4,\n\t0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, 0xCC76,\t0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75,\n\t0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC,\t0x5F89, 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1,\n\t0x5F90, 0xAE7D, 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F,\t0x5F97, 0xB16F, 0x5F98, 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E,\n\t0x5F9C, 0xB175, 0x5F9E, 0xB171, 0x5F9F, 0xD550, 0x5FA0, 0xB174,\t0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, 0xD8F5, 0x5FA8, 0xB461,\n\t0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, 0x5FAC, 0xB74B,\t0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, 0xE577,\n\t0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD,\t0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD,\n\t0x5FBF, 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF,\t0x5FC5, 0xA5B2, 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4,\n\t0x5FCF, 0xC9E2, 0x5FD0, 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6,\t0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3,\n\t0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, 0xA9BD, 0x5FDE, 0xCC78,\t0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, 0x5FE4, 0xCADE,\n\t0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, 0xA7D6,\t0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5,\n\t0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2,\t0x5FF8, 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF,\n\t0x5FFF, 0xA9C1, 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2,\t0x600B, 0xCC7E, 0x600C, 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7,\n\t0x600F, 0xA9C2, 0x6010, 0xCCAA, 0x6011, 0xCCAD, 0x6012, 0xABE3,\t0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, 0xA9C8, 0x6016, 0xA9C6,\n\t0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, 0x601B, 0xA9CD,\t0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, 0xABE5,\n\t0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6,\t0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB,\n\t0x602A, 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A,\t0x602E, 0xCCAB, 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4,\n\t0x6034, 0xCCA1, 0x6035, 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0,\t0x6040, 0xCECA, 0x6041, 0xD1A1, 0x6042, 0xCECB, 0x6043, 0xABEE,\n\t0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, 0xABED, 0x6047, 0xCEC6,\t0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, 0x6050, 0xAEA3,\n\t0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, 0xAEA4,\t0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8,\n\t0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC,\t0x6063, 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0,\n\t0x6067, 0xD17E, 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1,\t0x606B, 0xABF0, 0x606C, 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1,\n\t0x606F, 0xAEA7, 0x6070, 0xABEA, 0x6072, 0xCEC2, 0x607F, 0xB176,\t0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, 0xD1A8, 0x6084, 0xAEA8,\n\t0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, 0x6088, 0xD1A3,\t0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, 0xAEAB,\n\t0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC,\t0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA,\n\t0x609B, 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9,\t0x60A0, 0xB179, 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A,\n\t0x60B0, 0xD555, 0x60B1, 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C,\t0x60B5, 0xB1A3, 0x60B6, 0xB465, 0x60B7, 0xD560, 0x60B8, 0xB1AA,\n\t0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, 0xB1A2, 0x60BC, 0xB1A5,\t0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, 0x60C0, 0xD565,\n\t0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, 0xB1A1,\t0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8,\n\t0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564,\t0x60CE, 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557,\n\t0x60D4, 0xD558, 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B,\t0x60DA, 0xB1AB, 0x60DB, 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C,\n\t0x60DF, 0xB1A9, 0x60E0, 0xB466, 0x60E1, 0xB463, 0x60E2, 0xD8FB,\t0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, 0xB46B, 0x60F1, 0xB46F,\n\t0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, 0x60F5, 0xD944,\t0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, 0xB753,\n\t0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948,\t0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A,\n\t0x6104, 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755,\t0x6109, 0xB472, 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D,\n\t0x610E, 0xB470, 0x610F, 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474,\t0x6113, 0xD945, 0x6114, 0xD8FE, 0x6115, 0xB46A, 0x6116, 0xD942,\n\t0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, 0xB752, 0x611C, 0xB467,\t0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, 0x6127, 0xB75C,\n\t0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, 0xE1C2,\t0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B,\n\t0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A,\t0x613F, 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758,\n\t0x6145, 0xDD69, 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F,\t0x6149, 0xDD66, 0x614A, 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757,\n\t0x614D, 0xB759, 0x614E, 0xB756, 0x614F, 0xDD6F, 0x6152, 0xE1C8,\t0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, 0xBC7D, 0x6156, 0xE1D5,\n\t0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, 0x615D, 0xBC7C,\t0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, 0xBA43,\n\t0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A,\t0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB,\n\t0x616E, 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA,\t0x6173, 0xE1C7, 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79,\n\t0x6177, 0xBA42, 0x6179, 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1,\t0x617E, 0xBCA4, 0x6180, 0xE1CC, 0x6182, 0xBC7E, 0x6183, 0xE579,\n\t0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, 0xE578, 0x618C, 0xE9A3,\t0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, 0x6191, 0xBECC,\n\t0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, 0xE978,\t0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5,\n\t0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5,\t0x61A8, 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7,\n\t0x61AC, 0xBCA9, 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3,\t0x61B0, 0xE57C, 0x61B1, 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB,\n\t0x61B4, 0xE97A, 0x61B5, 0xECE0, 0x61B6, 0xBED0, 0x61B8, 0xE9A2,\t0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, 0xBED1, 0x61BF, 0xE9A1,\n\t0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, 0x61C5, 0xE979,\t0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, 0xC0B3,\n\t0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF,\t0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8,\n\t0x61E0, 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4,\t0x61E6, 0xC0B6, 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0,\n\t0x61EA, 0xEFCC, 0x61EB, 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA,\t0x61F0, 0xEFCD, 0x61F1, 0xEFCB, 0x61F2, 0xC367, 0x61F5, 0xC36A,\n\t0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, 0xC461, 0x61F9, 0xF44A,\t0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, 0x61FD, 0xF5CC,\n\t0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, 0xF7D9,\t0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0,\n\t0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7,\t0x620E, 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9,\n\t0x6214, 0xCCB1, 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF,\t0x621A, 0xB1AD, 0x621B, 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72,\n\t0x6221, 0xB760, 0x6222, 0xB761, 0x6223, 0xDD74, 0x6224, 0xDD76,\t0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, 0xE1D6, 0x622A, 0xBA49,\n\t0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, 0x6230, 0xBED4,\t0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, 0xA4E1,\n\t0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0,\t0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3,\n\t0x6246, 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476,\t0x624A, 0xD951, 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3,\n\t0x6250, 0xC97D, 0x6251, 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4,\t0x6254, 0xA5B5, 0x6258, 0xA6AB, 0x6259, 0xC9E9, 0x625A, 0xC9EB,\n\t0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, 0xC9E4, 0x6260, 0xC9EA,\t0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, 0x6264, 0xC9E5,\n\t0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, 0xA7EA,\t0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5,\n\t0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3,\t0x6279, 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3,\n\t0x627D, 0xCAF4, 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE,\t0x6281, 0xCAF1, 0x6283, 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE,\n\t0x6287, 0xCAEC, 0x6288, 0xCAF2, 0x6289, 0xA7E0, 0x628A, 0xA7E2,\t0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, 0xCAEA, 0x6291, 0xA7ED,\n\t0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, 0x6295, 0xA7EB,\t0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, 0xA9E1,\n\t0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF,\t0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF,\n\t0x62B1, 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8,\t0x62B6, 0xCCB8, 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD,\n\t0x62BC, 0xA9E3, 0x62BD, 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7,\t0x62C2, 0xA9D8, 0x62C4, 0xA9D6, 0x62C6, 0xA9EE, 0x62C7, 0xA9E6,\n\t0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, 0xCCB9, 0x62CB, 0xA9DF,\t0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, 0x62CF, 0xCED4,\n\t0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, 0xA9DD,\t0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB,\n\t0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4,\t0x62EB, 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA,\n\t0x62EF, 0xAC40, 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1,\t0x62F3, 0xAEB1, 0x62F4, 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF,\n\t0x62F7, 0xABFE, 0x62F8, 0xCEDE, 0x62F9, 0xCEDB, 0x62FA, 0xCEE3,\t0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, 0xABFB, 0x62FE, 0xAC42,\n\t0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, 0x6302, 0xAC45,\t0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, 0xABF6,\n\t0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8,\t0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1,\n\t0x6314, 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1,\t0x6329, 0xD1BE, 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4,\n\t0x632D, 0xD1C4, 0x632F, 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6,\t0x6334, 0xD1C0, 0x6336, 0xD1B7, 0x6338, 0xD1C9, 0x6339, 0xD1BA,\n\t0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, 0xD1BD, 0x633D, 0xAEBE,\t0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, 0x6342, 0xAEB8,\n\t0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, 0xAEB9,\t0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC,\n\t0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4,\t0x634F, 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2,\n\t0x6355, 0xAEB7, 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1,\t0x6359, 0xD1C3, 0x635A, 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7,\n\t0x6368, 0xB1CB, 0x6369, 0xB1CA, 0x636B, 0xB1BF, 0x636D, 0xD579,\t0x636E, 0xD575, 0x636F, 0xD572, 0x6370, 0xD5A6, 0x6371, 0xB1BA,\n\t0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, 0x6377, 0xB1B6,\t0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, 0xD57B,\n\t0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569,\t0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573,\n\t0x6388, 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478,\t0x638D, 0xD5A5, 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574,\n\t0x6391, 0xD5A4, 0x6392, 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3,\t0x6397, 0xD56F, 0x6398, 0xB1B8, 0x6399, 0xB1C3, 0x639B, 0xB1BE,\n\t0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, 0xD56C, 0x639F, 0xD57E,\t0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, 0x63A3, 0xB477,\n\t0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, 0xB1C0,\t0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5,\n\t0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954,\t0x63B1, 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A,\n\t0x63C2, 0xD96A, 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77,\t0x63C6, 0xB47D, 0x63C7, 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C,\n\t0x63CA, 0xD95C, 0x63CB, 0xD96D, 0x63CC, 0xD96C, 0x63CD, 0xB47E,\t0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, 0xB4A3, 0x63D2, 0xB4A1,\n\t0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, 0x63D7, 0xD970,\t0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, 0xB4AB,\n\t0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D,\t0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956,\n\t0x63E7, 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA,\t0x63EB, 0xDD79, 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958,\n\t0x63F0, 0xD96F, 0x63F1, 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B,\t0x63F4, 0xB4A9, 0x63F5, 0xD961, 0x63F6, 0xD95E, 0x63F9, 0xB4AE,\n\t0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, 0xDDB1, 0x640B, 0xDDB6,\t0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, 0x640F, 0xB769,\n\t0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, 0xB76B,\t0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5,\n\t0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764,\t0x641F, 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8,\n\t0x6423, 0xDDA9, 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB,\t0x6427, 0xDDB5, 0x6428, 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9,\n\t0x642C, 0xB768, 0x642D, 0xB766, 0x642E, 0xDDB9, 0x642F, 0xDDB0,\t0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, 0xBA53, 0x6435, 0xDDAF,\n\t0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, 0x643D, 0xB767,\t0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, 0xDDAE,\n\t0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5,\t0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA,\n\t0x6454, 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB,\t0x645C, 0xE1E8, 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F,\n\t0x6460, 0xE1EB, 0x6461, 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3,\t0x6467, 0xBA52, 0x6468, 0xE5BA, 0x6469, 0xBCAF, 0x646B, 0xE1F0,\n\t0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, 0xE5AD, 0x646F, 0xBCB0,\t0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, 0x6474, 0xE1DD,\n\t0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, 0xBA4E,\t0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1,\n\t0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A,\t0x6488, 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5,\n\t0x648C, 0xE5B7, 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB,\t0x6493, 0xBCB8, 0x6495, 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2,\n\t0x6498, 0xE5BC, 0x6499, 0xBCC1, 0x649A, 0xBCBF, 0x649C, 0xE5B3,\t0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, 0xE5B9, 0x64A0, 0xE5B0,\n\t0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, 0x64A5, 0xBCB7,\t0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, 0xBCC0,\n\t0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB,\t0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9,\n\t0x64BD, 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6,\t0x64C2, 0xBEDD, 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5,\n\t0x64C7, 0xBEDC, 0x64C9, 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7,\t0x64CD, 0xBEDE, 0x64CE, 0xC0BA, 0x64CF, 0xE9A7, 0x64D0, 0xE9A6,\n\t0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, 0xE9A5, 0x64D7, 0xE9A4,\t0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, 0x64DB, 0xE9AC,\n\t0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, 0xECEC,\t0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB,\n\t0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE,\t0x64F1, 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258,\n\t0x64F7, 0xC25E, 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D,\t0x64FC, 0xEFD7, 0x64FD, 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1,\n\t0x6500, 0xC36B, 0x6501, 0xEFD5, 0x6503, 0xEFD6, 0x6504, 0xEFD2,\t0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, 0xF245, 0x650C, 0xF246,\n\t0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, 0x6510, 0xF243,\t0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, 0xF44C,\n\t0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD,\t0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0,\n\t0x6522, 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD,\t0x6526, 0xF6E2, 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC,\n\t0x652C, 0xC5F3, 0x652D, 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4,\t0x6532, 0xD972, 0x6533, 0xE9AF, 0x6536, 0xA6AC, 0x6537, 0xCAF7,\n\t0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, 0xA7F0, 0x653D, 0xCCC1,\t0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, 0x6543, 0xCEE8,\n\t0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, 0xAEC5,\t0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7,\n\t0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1,\t0x6558, 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD,\n\t0x655E, 0xB4AF, 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975,\t0x6565, 0xD978, 0x6566, 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977,\n\t0x656A, 0xD974, 0x656C, 0xB771, 0x656F, 0xDDBC, 0x6572, 0xBA56,\t0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, 0xBCC4, 0x6576, 0xE5BD,\n\t0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, 0x657A, 0xE5BE,\t0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, 0xECEF,\n\t0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248,\t0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3,\n\t0x6592, 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE,\t0x6597, 0xA4E6, 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7,\n\t0x659D, 0xD97A, 0x659E, 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5,\t0x65A1, 0xBA57, 0x65A2, 0xE9B2, 0x65A4, 0xA4E7, 0x65A5, 0xA5B8,\n\t0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, 0xCEE9, 0x65AB, 0xAC48,\t0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, 0x65B0, 0xB773,\n\t0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, 0xC25F,\t0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3,\n\t0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2,\t0x65C3, 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF,\n\t0x65CB, 0xB1DB, 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD,\t0x65CF, 0xB1DA, 0x65D0, 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE,\n\t0x65D6, 0xBA59, 0x65D7, 0xBA58, 0x65DA, 0xECF1, 0x65DB, 0xEFD9,\t0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, 0xF44F, 0x65E1, 0xC95E,\n\t0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, 0x65E8, 0xA6AE,\t0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, 0xC9EE,\n\t0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB,\t0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4,\n\t0x65FB, 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB,\t0x6602, 0xA9F9, 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD,\n\t0x6606, 0xA9F8, 0x6607, 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4,\t0x660A, 0xA9FE, 0x660B, 0xCCCB, 0x660C, 0xA9F7, 0x660D, 0xCCCC,\n\t0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, 0xCCD0, 0x6611, 0xCCCF,\t0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, 0x6615, 0xA9FD,\n\t0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, 0xAC4D,\t0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B,\n\t0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3,\t0x662D, 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52,\n\t0x6632, 0xCEED, 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE,\t0x6636, 0xCEEB, 0x6639, 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0,\n\t0x6642, 0xAEC9, 0x6643, 0xAECC, 0x6645, 0xAECF, 0x6647, 0xD1D5,\t0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, 0xAECE, 0x664F, 0xAECB,\n\t0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, 0x665A, 0xB1DF,\t0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, 0xB1E3,\n\t0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0,\t0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7,\n\t0x666C, 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7,\t0x6671, 0xD9A5, 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9,\n\t0x6677, 0xB4BE, 0x6678, 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC,\t0x667B, 0xD9A3, 0x667C, 0xD9A1, 0x667E, 0xB4BD, 0x6680, 0xD9A4,\n\t0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, 0xB776, 0x6688, 0xB777,\t0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, 0x668C, 0xDDC0,\n\t0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, 0xDDC6,\t0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A,\n\t0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7,\t0x66A1, 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5,\n\t0x66AA, 0xE5C8, 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9,\t0x66B0, 0xE5C4, 0x66B1, 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9,\n\t0x66B5, 0xE5C3, 0x66B7, 0xE5C7, 0x66B8, 0xBEE9, 0x66B9, 0xBEE6,\t0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, 0xE9B9, 0x66BE, 0xE9B4,\n\t0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, 0x66C7, 0xBEE8,\t0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, 0xE9B7,\n\t0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7,\t0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB,\n\t0x66DC, 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D,\t0x66E3, 0xF451, 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450,\n\t0x66E9, 0xC4E4, 0x66EB, 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA,\t0x66EE, 0xF8AB, 0x66F0, 0xA4EA, 0x66F2, 0xA6B1, 0x66F3, 0xA6B2,\n\t0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, 0xAC54, 0x66F8, 0xAED1,\t0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, 0x66FF, 0xB4C0,\n\t0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, 0xE1FA,\t0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2,\n\t0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA,\t0x6712, 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3,\n\t0x6717, 0xAED4, 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2,\t0x671F, 0xB4C1, 0x6720, 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB,\n\t0x6723, 0xE9BD, 0x6726, 0xC261, 0x6727, 0xC467, 0x6728, 0xA4EC,\t0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, 0xA5BB, 0x672D, 0xA5BE,\n\t0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, 0x6734, 0xA6B5,\t0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, 0xC9F3,\n\t0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF,\t0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE,\n\t0x6748, 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42,\t0x674D, 0xCB45, 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7,\n\t0x6751, 0xA7F8, 0x6753, 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA,\t0x6757, 0xA841, 0x6759, 0xCB40, 0x675A, 0xCB46, 0x675C, 0xA7F9,\n\t0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, 0xA7F4, 0x6760, 0xA7FE,\t0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, 0x676F, 0xAA4D,\n\t0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, 0xAA48,\t0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49,\n\t0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8,\t0x677C, 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F,\n\t0x6781, 0xCCE5, 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3,\t0x6786, 0xCCDA, 0x6787, 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44,\n\t0x678C, 0xCCDE, 0x678D, 0xCCDD, 0x678E, 0xCCD5, 0x6790, 0xAA52,\t0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, 0xAA55, 0x6794, 0xCCE8,\n\t0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, 0x6799, 0xCCE2,\t0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, 0xCCE0,\n\t0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56,\t0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B,\n\t0x67B7, 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE,\t0x67BB, 0xCF41, 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51,\n\t0x67C3, 0xCF61, 0x67C4, 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58,\t0x67C8, 0xCEFD, 0x67C9, 0xCF5F, 0x67CA, 0xCF60, 0x67CB, 0xCF63,\n\t0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, 0xCF53, 0x67CF, 0xAC66,\t0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, 0x67D3, 0xAC56,\n\t0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, 0xAC63,\t0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67,\n\t0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48,\t0x67E5, 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E,\n\t0x67EA, 0xCF62, 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59,\t0x67EE, 0xCF4F, 0x67EF, 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57,\n\t0x67F2, 0xCEFC, 0x67F3, 0xAC68, 0x67F4, 0xAEE3, 0x67F5, 0xAC5D,\t0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, 0xCF42, 0x67FA, 0xCF5E,\n\t0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, 0x6813, 0xAEEA,\t0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, 0xAEEB,\n\t0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9,\t0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE,\n\t0x6828, 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5,\t0x682D, 0xD1E6, 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2,\n\t0x6832, 0xD1DC, 0x6833, 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4,\t0x6838, 0xAED6, 0x6839, 0xAEDA, 0x683A, 0xD1F2, 0x683B, 0xD1DE,\n\t0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, 0xAEE5, 0x6841, 0xAEEC,\t0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, 0x6845, 0xAEE9,\n\t0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, 0xD1DF,\t0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0,\n\t0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC,\t0x686B, 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9,\n\t0x6871, 0xD5C8, 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD,\t0x6876, 0xB1ED, 0x6877, 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0,\n\t0x687B, 0xD5D1, 0x687C, 0xD5C3, 0x687D, 0xD5D5, 0x687E, 0xD5C9,\t0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, 0xB1E7, 0x6882, 0xB1FC,\n\t0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, 0x6887, 0xD5B1,\t0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, 0xD5D3,\n\t0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2,\t0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0,\n\t0x689B, 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA,\t0x68A0, 0xD5CD, 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA,\n\t0x68A4, 0xD5CF, 0x68A7, 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC,\t0x68AA, 0xD5C6, 0x68AB, 0xD5B7, 0x68AC, 0xD5BB, 0x68AD, 0xB1F4,\n\t0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, 0xB1F1, 0x68B1, 0xB1EE,\t0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, 0x68B5, 0xB1EB,\n\t0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, 0xD9CE,\t0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2,\n\t0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE,\t0x68D3, 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3,\n\t0x68D7, 0xB4C7, 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD,\t0x68DD, 0xD9CF, 0x68DE, 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5,\n\t0x68E1, 0xD9BB, 0x68E3, 0xB4D0, 0x68E4, 0xD9B6, 0x68E6, 0xD9D1,\t0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, 0xD9D6, 0x68EA, 0xD9B0,\n\t0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, 0x68EF, 0xD9C2,\t0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, 0xD9BA,\n\t0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4,\t0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9,\n\t0x68FC, 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8,\t0x6906, 0xD9D4, 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB,\n\t0x690B, 0xD9CA, 0x690C, 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5,\t0x690F, 0xD9B2, 0x6910, 0xD9B9, 0x6911, 0xD9C1, 0x6912, 0xB4D4,\n\t0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, 0xD9D7, 0x6917, 0xD9CC,\t0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, 0x6930, 0xB7A6,\n\t0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, 0xDDD9,\t0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA,\n\t0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2,\t0x6941, 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0,\n\t0x6948, 0xDDD7, 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB,\t0x694C, 0xDDE9, 0x694E, 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF,\n\t0x6952, 0xDDF1, 0x6953, 0xB7AC, 0x6954, 0xB7A4, 0x6956, 0xD5B8,\t0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, 0xDDD5, 0x695A, 0xB7A1,\n\t0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, 0x695E, 0xB7AB,\t0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, 0xB7B0,\n\t0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1,\t0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E,\n\t0x696E, 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE,\t0x6974, 0xDDE8, 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2,\n\t0x6978, 0xDDDF, 0x6979, 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3,\t0x6982, 0xB7A7, 0x6983, 0xDEC6, 0x6986, 0xB7AE, 0x698D, 0xE24A,\n\t0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, 0xE246, 0x6993, 0xE258,\t0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, 0x6997, 0xE25D,\n\t0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, 0xBA5D,\t0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F,\n\t0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249,\t0x69A8, 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67,\n\t0x69AC, 0xE244, 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D,\t0x69B0, 0xE243, 0x69B1, 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68,\n\t0x69B5, 0xE260, 0x69B6, 0xE1FD, 0x69B7, 0xBA65, 0x69B9, 0xE253,\t0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, 0xE250, 0x69BE, 0xE24C,\n\t0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, 0x69C3, 0xBA6E,\t0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, 0xE254,\n\t0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241,\t0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252,\n\t0x69D9, 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD,\t0x69E6, 0xE5E1, 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5,\n\t0x69EC, 0xE5D4, 0x69ED, 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0,\t0x69F2, 0xE5DA, 0x69F3, 0xBCD5, 0x69F4, 0xE5EE, 0x69F6, 0xE5EB,\n\t0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, 0xE5E2, 0x69FC, 0xE5E4,\t0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, 0x6A00, 0xE5CA,\n\t0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, 0xBCD7,\t0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6,\n\t0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9,\t0x6A13, 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF,\n\t0x6A17, 0xE5CC, 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6,\t0x6A1D, 0xE5D7, 0x6A1E, 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2,\n\t0x6A21, 0xBCD2, 0x6A23, 0xBCCB, 0x6A25, 0xE5E9, 0x6A26, 0xE5EC,\t0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, 0xE9C2, 0x6A34, 0xE9BE,\n\t0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, 0x6A3A, 0xBEEC,\t0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, 0xE9C4,\n\t0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1,\t0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0,\n\t0x6A4B, 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2,\t0x6A50, 0xE9D1, 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA,\n\t0x6A56, 0xE9D9, 0x6A58, 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB,\t0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7,\n\t0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, 0xBEF2, 0x6A64, 0xE9D0,\t0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, 0x6A69, 0xE9D5,\n\t0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, 0xE9D4,\t0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8,\n\t0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48,\t0x6A87, 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3,\n\t0x6A8E, 0xECFE, 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A,\t0x6A93, 0xECFD, 0x6A94, 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4,\n\t0x6A97, 0xC0D0, 0x6A9A, 0xED47, 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC,\t0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, 0xC0D2, 0x6AA1, 0xECFA,\n\t0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, 0x6AA5, 0xECF6,\t0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, 0xEFE7,\n\t0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6,\t0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE,\n\t0x6ABA, 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267,\t0x6AC3, 0xC264, 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5,\n\t0x6ACB, 0xF251, 0x6ACC, 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256,\t0x6AD0, 0xF254, 0x6AD1, 0xF24F, 0x6AD3, 0xC372, 0x6AD9, 0xF250,\n\t0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, 0xF253, 0x6ADD, 0xC370,\t0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, 0x6AE1, 0xEFE0,\n\t0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, 0xF455,\t0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A,\n\t0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1,\t0x6AF9, 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF,\n\t0x6B00, 0xF5D2, 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6,\t0x6B08, 0xF6E5, 0x6B09, 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4,\n\t0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, 0x6B11, 0xF7E0, 0x6B12, 0xF7E1,\t0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, 0xF8F3, 0x6B18, 0xF8F1,\n\t0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, 0x6B20, 0xA4ED,\t0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, 0xCF64,\n\t0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8,\t0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6,\n\t0x6B37, 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB,\t0x6B3B, 0xD9DB, 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA,\n\t0x6B3F, 0xD9DC, 0x6B41, 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7,\t0x6B45, 0xDDF6, 0x6B46, 0xDDF5, 0x6B47, 0xB7B2, 0x6B48, 0xDDF9,\n\t0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, 0xE265, 0x6B4C, 0xBA71,\t0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, 0x6B51, 0xE5F0,\n\t0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, 0xBEF9,\t0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A,\n\t0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF,\t0x6B64, 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B,\n\t0x6B6A, 0xAC6E, 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1,\t0x6B77, 0xBEFA, 0x6B78, 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA,\n\t0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, 0x6B80, 0xCCEA, 0x6B82, 0xCF65,\t0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, 0xAC70, 0x6B88, 0xD1FC,\n\t0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, 0x6B8D, 0xD5DC,\t0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, 0xD9DE,\n\t0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD,\t0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267,\n\t0x6BA0, 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC,\t0x6BA5, 0xE5F1, 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2,\n\t0x6BAB, 0xE9E3, 0x6BAD, 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C,\t0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, 0x6BB3, 0xC95F, 0x6BB5, 0xAC71,\n\t0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, 0xB1FE, 0x6BBC, 0xB4DF,\t0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, 0x6BC3, 0xE269,\n\t0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, 0xE9E5,\t0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0,\n\t0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48,\t0x6BD2, 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68,\n\t0x6BD7, 0xAC73, 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2,\t0x6BDE, 0xCCEC, 0x6BE0, 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241,\n\t0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, 0x6BE7, 0xD243, 0x6BE8, 0xD240,\t0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, 0xB4E0, 0x6BF0, 0xD9E3,\n\t0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, 0x6BF8, 0xDE42,\t0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, 0xB7B7,\n\t0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5,\t0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB,\n\t0x6C06, 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA,\t0x6C0C, 0xF25B, 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2,\n\t0x6C11, 0xA5C1, 0x6C13, 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E,\t0x6C16, 0xA6BB, 0x6C18, 0xC9F7, 0x6C19, 0xCB49, 0x6C1A, 0xCB4A,\n\t0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, 0xAC74, 0x6C20, 0xCF6B,\t0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, 0x6C25, 0xD244,\n\t0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, 0xD5DF,\t0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2,\n\t0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1,\t0x6C38, 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3,\n\t0x6C40, 0xA5C5, 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2,\t0x6C46, 0xC9F8, 0x6C4A, 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40,\n\t0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1,\t0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, 0xA6C2, 0x6C57, 0xA6BD,\n\t0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, 0x6C5D, 0xA6BC,\t0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, 0xA6C3,\n\t0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851,\t0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55,\n\t0x6C6F, 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856,\t0x6C73, 0xCB5A, 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B,\n\t0x6C7A, 0xA84D, 0x6C7B, 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857,\t0x6C80, 0xCD45, 0x6C81, 0xA847, 0x6C82, 0xA85E, 0x6C83, 0xA855,\n\t0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, 0xA859, 0x6C87, 0xCB56,\t0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, 0x6C8B, 0xCB4F,\n\t0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, 0xCB50,\t0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C,\n\t0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846,\t0x6C9A, 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44,\n\t0x6CAB, 0xAA6A, 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71,\t0x6CB0, 0xCD4B, 0x6CB1, 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42,\n\t0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F,\t0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, 0xAA68, 0x6CBD, 0xAA66,\n\t0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, 0x6CC1, 0xAA70,\t0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, 0xAA73,\n\t0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79,\t0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8,\n\t0x6CD1, 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4,\t0x6CD5, 0xAA6B, 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2,\n\t0x6CDA, 0xCF75, 0x6CDB, 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41,\t0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, 0x6CE1, 0xAA77, 0x6CE2, 0xAA69,\n\t0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, 0xCCF6, 0x6CE8, 0xAA60,\t0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, 0x6CED, 0xCCFD,\n\t0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, 0xAA74,\t0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C,\n\t0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77,\t0x6D07, 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74,\n\t0x6D0B, 0xAC76, 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD,\t0x6D0F, 0xCFA5, 0x6D10, 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73,\n\t0x6D16, 0xD264, 0x6D17, 0xAC7E, 0x6D18, 0xCFA2, 0x6D19, 0xCF78,\t0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, 0xCF7D, 0x6D1E, 0xAC7D,\n\t0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, 0x6D25, 0xAC7A,\t0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, 0xAC78,\n\t0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB,\t0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77,\n\t0x6D33, 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4,\t0x6D37, 0xCFA3, 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79,\n\t0x6D3B, 0xACA1, 0x6D3C, 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3,\t0x6D3F, 0xCF72, 0x6D40, 0xCFA6, 0x6D41, 0xAC79, 0x6D42, 0xCF7E,\n\t0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, 0xAF43, 0x6D5E, 0xD255,\t0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, 0x6D62, 0xD24D,\n\t0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, 0xAEFA,\t0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6,\n\t0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F,\t0x6D70, 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248,\n\t0x6D77, 0xAEFC, 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245,\t0x6D7B, 0xD266, 0x6D7C, 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261,\n\t0x6D7F, 0xD253, 0x6D80, 0xD262, 0x6D82, 0xD25C, 0x6D83, 0xD265,\t0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, 0xD254, 0x6D87, 0xAEF9,\n\t0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, 0x6D8B, 0xD260,\t0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, 0xD269,\n\t0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B,\t0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265,\n\t0x6DAB, 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250,\t0x6DB2, 0xB247, 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B,\n\t0x6DB7, 0xD5E8, 0x6DB8, 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647,\t0x6DBC, 0xB244, 0x6DBD, 0xD5F7, 0x6DBE, 0xD5F0, 0x6DBF, 0xB267,\n\t0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, 0xB264, 0x6DC5, 0xB258,\t0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, 0x6DC9, 0xD5FE,\n\t0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, 0xD645,\t0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259,\n\t0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF,\t0x6DD7, 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C,\n\t0x6DDB, 0xD5F4, 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253,\t0x6DDF, 0xD5EE, 0x6DE0, 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7,\n\t0x6DE3, 0xD646, 0x6DE4, 0xB24A, 0x6DE5, 0xD5F1, 0x6DE6, 0xB268,\t0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, 0xB25F, 0x6DEB, 0xB25D,\n\t0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, 0x6DEF, 0xD252,\t0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, 0xB245,\n\t0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256,\t0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7,\n\t0x6DFD, 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D,\t0x6E19, 0xB541, 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6,\n\t0x6E1D, 0xB4FC, 0x6E1F, 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7,\t0x6E22, 0xDA49, 0x6E23, 0xB4ED, 0x6E24, 0xB4F1, 0x6E25, 0xB4EC,\n\t0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, 0xDA44, 0x6E2B, 0xD9F1,\t0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, 0x6E2F, 0xB4E4,\n\t0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, 0xD9F7,\t0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5,\n\t0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED,\t0x6E3D, 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9,\n\t0x6E41, 0xD9F3, 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF,\t0x6E46, 0xD9E8, 0x6E47, 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA,\n\t0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, 0x6E4E, 0xB542, 0x6E51, 0xD9FA,\t0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, 0xB4E6, 0x6E55, 0xDA51,\n\t0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, 0x6E5B, 0xB4EF,\t0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, 0xB547,\n\t0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543,\t0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9,\n\t0x6E68, 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3,\t0x6E6F, 0xB4F6, 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5,\n\t0x6E74, 0xD5E4, 0x6E77, 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52,\t0x6E88, 0xD9EC, 0x6E89, 0xB540, 0x6E8D, 0xDE61, 0x6E8E, 0xDE60,\n\t0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, 0xDE5F, 0x6E93, 0xDE49,\t0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, 0x6E98, 0xB7C2,\n\t0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, 0xB7BE,\t0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63,\n\t0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1,\t0x6EA6, 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5,\n\t0x6EAE, 0xDE69, 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C,\t0x6EB2, 0xDE59, 0x6EB3, 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB,\n\t0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3,\t0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, 0xDE64, 0x6EC0, 0xDE47,\n\t0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, 0x6EC4, 0xB7C9,\t0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, 0xDE45,\n\t0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0,\t0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66,\n\t0x6ED1, 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA,\t0x6ED5, 0xBCF0, 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C,\n\t0x6EEB, 0xE2AA, 0x6EEC, 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4,\t0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77,\n\t0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, 0xBAB1, 0x6EF8, 0xE271,\t0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, 0x6EFD, 0xE2AF,\n\t0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, 0xBAAE,\t0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3,\n\t0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E,\t0x6F0D, 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C,\n\t0x6F13, 0xBA76, 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A,\t0x6F19, 0xE277, 0x6F1A, 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7,\n\t0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, 0x6F21, 0xE2B9, 0x6F22, 0xBA7E,\t0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, 0xE5FA, 0x6F27, 0xE279,\n\t0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, 0x6F2C, 0xBA7B,\t0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, 0xE2A7,\n\t0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9,\t0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1,\n\t0x6F3A, 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79,\t0x6F3F, 0xBCDF, 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD,\n\t0x6F4E, 0xE276, 0x6F4F, 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2,\t0x6F52, 0xE64D, 0x6F53, 0xE659, 0x6F54, 0xBCE4, 0x6F55, 0xE64B,\n\t0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, 0xE646, 0x6F5B, 0xBCE7,\t0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, 0x6F60, 0xBCF2,\n\t0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, 0xBCED,\t0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660,\n\t0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9,\t0x6F6F, 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2,\n\t0x6F76, 0xE648, 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB,\t0x6F7B, 0xE661, 0x6F7C, 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB,\n\t0x6F7F, 0xE65C, 0x6F80, 0xC0DF, 0x6F82, 0xE64A, 0x6F84, 0xBCE1,\t0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, 0xE5FC, 0x6F88, 0xBAAB,\n\t0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, 0x6F8D, 0xE640,\t0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, 0xE651,\n\t0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE,\t0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40,\n\t0x6FA3, 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48,\t0x6FA7, 0xBF43, 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB,\n\t0x6FAB, 0xEA42, 0x6FAC, 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8,\t0x6FAF, 0xEA44, 0x6FB0, 0xEA46, 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45,\n\t0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, 0xBF47, 0x6FB8, 0xE9FE,\t0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, 0x6FBD, 0xE9F2,\n\t0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, 0xBEFC,\t0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC,\n\t0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA,\t0x6FCC, 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC,\n\t0x6FD4, 0xED51, 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB,\t0x6FDC, 0xED53, 0x6FDD, 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9,\n\t0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, 0x6FE2, 0xED5A, 0x6FE3, 0xED52,\t0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, 0xED55, 0x6FE8, 0xED5B,\n\t0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, 0x6FED, 0xED54,\t0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, 0xC0D8,\n\t0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271,\t0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2,\n\t0x7000, 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF,\t0x7006, 0xC270, 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8,\n\t0x700B, 0xC26E, 0x700C, 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1,\t0x700F, 0xC273, 0x7011, 0xC272, 0x7014, 0xEFF0, 0x7015, 0xC378,\n\t0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, 0xC379, 0x7019, 0xF25C,\t0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, 0x701D, 0xC377,\n\t0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, 0xF262,\t0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D,\n\t0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260,\t0x702F, 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B,\n\t0x7033, 0xF468, 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E,\t0x7038, 0xF462, 0x7039, 0xF465, 0x703A, 0xF464, 0x703B, 0xF467,\n\t0x703C, 0xF45B, 0x703E, 0xC469, 0x703F, 0xF463, 0x7040, 0xF466,\t0x7041, 0xF469, 0x7042, 0xF461, 0x7043, 0xF5D3, 0x7044, 0xF5D4,\n\t0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, 0x7049, 0xF5D7,\t0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, 0xF6EB,\n\t0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579,\t0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4,\n\t0x705F, 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5,\t0x7063, 0xC657, 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C,\n\t0x7068, 0xF9A2, 0x7069, 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5,\t0x7070, 0xA6C7, 0x7071, 0xCA41, 0x7074, 0xCB5E, 0x7076, 0xA85F,\n\t0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, 0xA860, 0x707D, 0xA861,\t0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, 0x7085, 0xCD52,\n\t0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, 0xCD56,\t0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1,\n\t0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59,\t0x709F, 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6,\n\t0x70AB, 0xACAF, 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6,\t0x70AF, 0xACB3, 0x70B0, 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1,\n\t0x70B4, 0xCFB4, 0x70B5, 0xCFB5, 0x70B7, 0xCFAE, 0x70B8, 0xACB5,\t0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, 0xD277, 0x70C6, 0xD278,\n\t0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, 0x70CB, 0xD26E,\t0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, 0xD26C,\n\t0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271,\t0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A,\n\t0x70DD, 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C,\t0x70E2, 0xD270, 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E,\n\t0x70F3, 0xD650, 0x70F4, 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A,\t0x70F8, 0xD657, 0x70F9, 0xB269, 0x70FA, 0xD648, 0x70FB, 0xDA5B,\n\t0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, 0xD653, 0x7100, 0xD656,\t0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, 0x7109, 0xB26A,\n\t0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, 0xD649,\t0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B,\n\t0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F,\t0x711E, 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C,\n\t0x7122, 0xDA60, 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A,\t0x7128, 0xDA63, 0x712E, 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B,\n\t0x7131, 0xDA5D, 0x7132, 0xDA61, 0x7136, 0xB54D, 0x713A, 0xDA64,\t0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, 0xDE79, 0x7144, 0xDEA1,\n\t0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, 0x714B, 0xDE7A,\t0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, 0xDE7D,\n\t0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC,\t0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4,\n\t0x715D, 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F,\t0x7161, 0xDE76, 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1,\n\t0x7165, 0xB7D8, 0x7166, 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB,\t0x7169, 0xB7D0, 0x716A, 0xDE75, 0x716C, 0xB7D5, 0x716E, 0xB54E,\n\t0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, 0xDE74, 0x717B, 0xE2C1,\t0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, 0x7182, 0xE2BF,\n\t0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, 0xE2BA,\t0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB,\n\t0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3,\t0x719A, 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A,\n\t0x719E, 0xE66C, 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E,\t0x71A4, 0xE66D, 0x71A5, 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7,\n\t0x71A9, 0xE668, 0x71AA, 0xE66F, 0x71AC, 0xBCF5, 0x71AF, 0xE663,\t0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, 0xE662, 0x71B3, 0xE672,\n\t0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, 0x71BC, 0xEA55,\t0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, 0xEA4C,\n\t0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56,\t0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F,\n\t0x71C9, 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52,\t0x71CF, 0xEA52, 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F,\n\t0x71D5, 0xBF50, 0x71D6, 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53,\t0x71DA, 0xEA57, 0x71DB, 0xEA58, 0x71DC, 0xBF54, 0x71DF, 0xC0E7,\n\t0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, 0xED62, 0x71E4, 0xED60,\t0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, 0x71E8, 0xED5E,\n\t0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, 0xED61,\t0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277,\n\t0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD,\t0x71FE, 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C,\n\t0x7203, 0xEFFC, 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B,\t0x720A, 0xF26A, 0x720C, 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C,\n\t0x7213, 0xF46A, 0x7214, 0xF46B, 0x7219, 0xF5DC, 0x721A, 0xF5DB,\t0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, 0xF6EC, 0x721F, 0xF6ED,\n\t0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, 0x7227, 0xF9BC,\t0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, 0xAAA6,\n\t0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7,\t0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8,\n\t0x723D, 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7,\t0x7242, 0xD27D, 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9,\n\t0x7248, 0xAAA9, 0x7249, 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66,\t0x724C, 0xB550, 0x724F, 0xDEA4, 0x7252, 0xB7DE, 0x7253, 0xE2C6,\n\t0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, 0xA4FA, 0x725A, 0xDA67,\t0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, 0x725F, 0xA6C8,\n\t0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, 0xCB60,\t0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA,\n\t0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9,\t0x7273, 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1,\n\t0x7278, 0xD27E, 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E,\t0x727D, 0xB26F, 0x727E, 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552,\n\t0x7281, 0xB270, 0x7284, 0xB551, 0x7285, 0xDA6B, 0x7286, 0xDA6A,\t0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, 0xDA6C, 0x728C, 0xDEA6,\n\t0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, 0x7291, 0xDEA7,\t0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, 0xBABA,\n\t0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9,\t0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D,\n\t0x72A3, 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F,\t0x72A7, 0xC4EB, 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7,\n\t0x72AC, 0xA4FC, 0x72AE, 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6,\t0x72B4, 0xCA43, 0x72B5, 0xCA44, 0x72BA, 0xCB66, 0x72BD, 0xCB62,\n\t0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, 0xCB65, 0x72C2, 0xA867,\t0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, 0x72C6, 0xCB64,\n\t0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, 0xCD64,\t0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61,\n\t0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E,\t0x72D9, 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2,\n\t0x72E0, 0xACBD, 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF,\t0x72E6, 0xCFC4, 0x72E8, 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3,\n\t0x72EB, 0xCFC1, 0x72F3, 0xD2A8, 0x72F4, 0xD2A5, 0x72F6, 0xD2A7,\t0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, 0xAF55, 0x72FA, 0xD2A4,\n\t0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, 0x72FE, 0xD2A6,\t0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, 0xD662,\n\t0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79,\t0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274,\n\t0x7316, 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275,\t0x731B, 0xB272, 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669,\n\t0x7322, 0xDA70, 0x7323, 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76,\t0x7327, 0xDA73, 0x7329, 0xB556, 0x732D, 0xDA75, 0x7330, 0xDA6F,\n\t0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, 0xDA72, 0x7334, 0xB555,\t0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, 0x733A, 0xDEAD,\n\t0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, 0xB7E1,\t0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB,\n\t0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD,\t0x734D, 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC,\n\t0x7352, 0xE676, 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E,\t0x735A, 0xE67D, 0x735B, 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677,\n\t0x735F, 0xE678, 0x7360, 0xE679, 0x7361, 0xE67C, 0x7362, 0xE6A1,\t0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, 0xEA5D, 0x7368, 0xBF57,\n\t0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, 0x736C, 0xEA5E,\t0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, 0xC0F2,\n\t0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278,\t0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E,\n\t0x737D, 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A,\t0x7381, 0xF7E8, 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8,\n\t0x7385, 0xCFC6, 0x7386, 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A,\t0x7389, 0xA5C9, 0x738A, 0xC9A7, 0x738B, 0xA4FD, 0x738E, 0xCA45,\n\t0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, 0xCB6B, 0x7395, 0xCB68,\t0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, 0x739F, 0xAAB3,\n\t0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, 0xCD66,\t0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1,\n\t0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2,\t0x73B3, 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC,\n\t0x73B7, 0xACBF, 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1,\t0x73BC, 0xD2AF, 0x73BE, 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4,\n\t0x73C2, 0xCFC8, 0x73C3, 0xCFD3, 0x73C5, 0xCFCA, 0x73C6, 0xCFD4,\t0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, 0xACC0, 0x73CB, 0xCFD6,\n\t0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, 0x73D3, 0xD2AB,\t0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, 0xD2BA,\n\t0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3,\t0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1,\n\t0x73E5, 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2,\t0x73EA, 0xAF5E, 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C,\n\t0x73F4, 0xD678, 0x73F5, 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C,\t0x73FA, 0xD673, 0x73FC, 0xD674, 0x73FD, 0xD670, 0x73FE, 0xB27B,\n\t0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, 0xD66F, 0x7403, 0xB279,\t0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, 0x7407, 0xD671,\n\t0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, 0xD677,\t0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1,\n\t0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2,\t0x7422, 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B,\n\t0x7426, 0xB561, 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558,\t0x742B, 0xDA7D, 0x742C, 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A,\n\t0x742F, 0xB55F, 0x7430, 0xDA7C, 0x7431, 0xDAA4, 0x7432, 0xDAAA,\t0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, 0xB55C, 0x7436, 0xB55D,\n\t0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, 0x7441, 0xB7E8,\t0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, 0xDEB2,\n\t0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8,\t0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE,\n\t0x7455, 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4,\t0x745B, 0xB7EB, 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6,\n\t0x7462, 0xE2CE, 0x7463, 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3,\t0x7469, 0xBCFC, 0x746A, 0xBABF, 0x746D, 0xBAC1, 0x746E, 0xE2D4,\n\t0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, 0xE2D0, 0x7472, 0xE2D2,\t0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, 0x747C, 0xE6AA,\n\t0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, 0xBD41,\t0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5,\n\t0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4,\t0x748B, 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65,\n\t0x7495, 0xEA67, 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63,\t0x749C, 0xBF58, 0x749E, 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64,\n\t0x74A1, 0xEA68, 0x74A3, 0xBF59, 0x74A5, 0xED6D, 0x74A6, 0xC0F5,\t0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, 0xC0F3, 0x74AA, 0xED6A,\n\t0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, 0x74B0, 0xC0F4,\t0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, 0xF045,\n\t0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046,\t0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041,\n\t0x74C1, 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274,\t0x74CA, 0xC3A3, 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED,\n\t0x74D5, 0xF6F1, 0x74D6, 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0,\t0x74D9, 0xF6F2, 0x74DA, 0xC5D0, 0x74DB, 0xF8B2, 0x74DC, 0xA5CA,\n\t0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, 0xD2BD, 0x74E0, 0xB27D,\t0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, 0x74E4, 0xC57B,\n\t0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, 0xA260,\t0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF,\n\t0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2,\t0x74FE, 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6,\n\t0x7503, 0xE2D7, 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC,\t0x750B, 0xEA69, 0x750C, 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72,\n\t0x7510, 0xED6F, 0x7511, 0xED70, 0x7512, 0xED71, 0x7513, 0xF049,\t0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, 0xF277, 0x7517, 0xF5DE,\n\t0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, 0x751D, 0xDEC3,\t0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, 0xB563,\n\t0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46,\t0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9,\n\t0x752F, 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2,\t0x7533, 0xA5D3, 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E,\n\t0x753A, 0xCB6D, 0x753D, 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70,\t0x7540, 0xCD71, 0x7547, 0xCFDA, 0x7548, 0xCFDB, 0x754B, 0xACCB,\n\t0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, 0xACC8, 0x7554, 0xAF60,\t0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, 0x755C, 0xAF62,\n\t0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, 0xD67B,\t0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566,\n\t0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7,\t0x7576, 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4,\n\t0x757D, 0xE2D8, 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A,\t0x7584, 0xED73, 0x7586, 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C,\n\t0x758B, 0xA5D4, 0x758C, 0xCD73, 0x758F, 0xB2A8, 0x7590, 0xE2D9,\t0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, 0xCB70, 0x7598, 0xCD74,\n\t0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, 0x75A2, 0xACCF,\t0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, 0xCFDC,\n\t0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68,\t0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E,\n\t0x75B9, 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B,\t0x75BD, 0xAF6A, 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7,\n\t0x75C1, 0xD2C4, 0x75C2, 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66,\t0x75C7, 0xAF67, 0x75CA, 0xB2AC, 0x75CB, 0xD6A1, 0x75CC, 0xD6A2,\n\t0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, 0xD67E, 0x75D0, 0xD6A4,\t0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, 0x75D5, 0xB2AA,\n\t0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, 0xDAB0,\t0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4,\n\t0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569,\t0x75E4, 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2,\n\t0x75EF, 0xDEC7, 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2,\t0x75F3, 0xB7F7, 0x75F4, 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1,\n\t0x75F7, 0xDECA, 0x75F8, 0xDECE, 0x75F9, 0xDECD, 0x75FA, 0xB7F4,\t0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, 0xDED4, 0x75FE, 0xDECB,\n\t0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, 0x7603, 0xDEC9,\t0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, 0xBAC6,\n\t0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF,\t0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD,\n\t0x7616, 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7,\t0x761C, 0xE6B3, 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45,\n\t0x7620, 0xBD43, 0x7621, 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4,\t0x7624, 0xBD46, 0x7625, 0xE6AF, 0x7626, 0xBD47, 0x7627, 0xBAC4,\n\t0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, 0xEA6C, 0x762F, 0xEA6B,\t0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, 0x7633, 0xEA6F,\n\t0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, 0xBF62,\t0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74,\n\t0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76,\t0x764C, 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E,\n\t0x7656, 0xC27D, 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C,\t0x765A, 0xF050, 0x765C, 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278,\n\t0x7661, 0xC3A8, 0x7662, 0xC46F, 0x7664, 0xF04B, 0x7665, 0xC470,\t0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, 0xC57E, 0x766D, 0xF6F4,\n\t0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, 0x7672, 0xC5F6,\t0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, 0xB56E,\n\t0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47,\t0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2,\n\t0x7687, 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB,\t0x768B, 0xAF6F, 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8,\n\t0x7693, 0xB571, 0x7695, 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5,\t0x769A, 0xBD4A, 0x769B, 0xE6BB, 0x769C, 0xE6B8, 0x769D, 0xE6B9,\n\t0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, 0xF051, 0x76AA, 0xF471,\t0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, 0x76AF, 0xCD75,\n\t0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, 0xE2E1,\t0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472,\n\t0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF,\t0x76C5, 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC,\n\t0x76CA, 0xAF71, 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0,\t0x76D3, 0xD6A7, 0x76D4, 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1,\n\t0x76DC, 0xB573, 0x76DD, 0xDED7, 0x76DE, 0xB7F8, 0x76DF, 0xB7F9,\t0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, 0xBD4C, 0x76E5, 0xBF64,\n\t0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, 0x76EA, 0xC0FA,\t0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, 0xA86E,\n\t0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76,\t0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB,\n\t0x76F9, 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF,\t0x76FE, 0xACDE, 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2,\n\t0x7705, 0xCFE3, 0x7707, 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC,\t0x770A, 0xCFE4, 0x770B, 0xACDD, 0x7710, 0xD2CF, 0x7711, 0xD2D3,\n\t0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, 0xD2D4, 0x7719, 0xD2D5,\t0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, 0x771F, 0xAF75,\n\t0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, 0xD6B0,\t0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA,\n\t0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE,\t0x7734, 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2,\n\t0x7738, 0xB2B6, 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1,\t0x773C, 0xB2B4, 0x773D, 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC,\n\t0x7745, 0xDABE, 0x7746, 0xDABA, 0x7747, 0xDABB, 0x774A, 0xDABF,\t0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, 0xDABD, 0x774E, 0xDAC0,\n\t0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, 0x7755, 0xDED8,\t0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, 0xB7FA,\n\t0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA,\t0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844,\n\t0x7766, 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE,\t0x776A, 0xB841, 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2,\n\t0x776E, 0xE2E6, 0x776F, 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3,\t0x777D, 0xBACC, 0x777E, 0xE2E9, 0x777F, 0xBACD, 0x7780, 0xE2E7,\n\t0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, 0xE2EA, 0x7784, 0xBACB,\t0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, 0x7789, 0xE6BE,\n\t0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, 0xBD4D,\t0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1,\n\t0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79,\t0x779D, 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65,\n\t0x77A1, 0xEA78, 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68,\t0x77A7, 0xC140, 0x77A8, 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B,\n\t0x77AC, 0xC0FE, 0x77AD, 0xC141, 0x77B0, 0xC0FD, 0x77B1, 0xEDA2,\t0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, 0xEDA1, 0x77B5, 0xED7A,\n\t0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, 0x77BB, 0xC2A4,\t0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, 0xF054,\n\t0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A,\t0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476,\n\t0x77D0, 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4,\t0x77D7, 0xC5F7, 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666,\n\t0x77DB, 0xA5D9, 0x77DC, 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3,\t0x77E2, 0xA5DA, 0x77E3, 0xA86F, 0x77E5, 0xAABE, 0x77E7, 0xCFE8,\n\t0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, 0xDAC4, 0x77ED, 0xB575,\t0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, 0x77F1, 0xF27C,\n\t0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, 0xCD7A,\t0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B,\n\t0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED,\t0x7806, 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5,\n\t0x780E, 0xCFF0, 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB,\t0x7812, 0xCFEC, 0x7813, 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C,\n\t0x781F, 0xAFA4, 0x7820, 0xAFA3, 0x7821, 0xD2E1, 0x7822, 0xD2DB,\t0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, 0xD6B9, 0x7827, 0xAF7A,\n\t0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, 0x782B, 0xD2E0,\t0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, 0xD2DD,\n\t0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3,\t0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B,\n\t0x7843, 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5,\t0x784A, 0xD6B7, 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA,\n\t0x7850, 0xD6BB, 0x7852, 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576,\t0x785E, 0xDAD0, 0x7860, 0xDAC5, 0x7862, 0xDAD1, 0x7864, 0xDAC6,\n\t0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, 0xDACE, 0x786A, 0xDACB,\t0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, 0x786E, 0xDACC,\n\t0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, 0xDEEE,\t0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851,\n\t0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8,\t0x7885, 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D,\n\t0x788C, 0xB84C, 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F,\t0x7893, 0xB850, 0x7894, 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1,\n\t0x7897, 0xB84A, 0x7898, 0xB84B, 0x7899, 0xDEEF, 0x789A, 0xDEE5,\t0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, 0xE2F4, 0x78A1, 0xDEEC,\n\t0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, 0x78A5, 0xE2F3,\t0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, 0xE2EC,\n\t0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849,\t0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54,\n\t0x78BB, 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF,\t0x78C3, 0xE6C8, 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7,\n\t0x78C9, 0xE6CA, 0x78CA, 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3,\t0x78CD, 0xE6C0, 0x78CE, 0xE6C5, 0x78CF, 0xE6C2, 0x78D0, 0xBD59,\n\t0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, 0xBD57, 0x78DA, 0xBF6A,\t0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, 0x78DF, 0xEAAC,\n\t0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, 0xEAA7,\t0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3,\n\t0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146,\t0x78F2, 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143,\n\t0x78F9, 0xEDAC, 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9,\t0x78FD, 0xEDA6, 0x78FE, 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147,\n\t0x7902, 0xEDA7, 0x7904, 0xEDAE, 0x7905, 0xEDAB, 0x7909, 0xF05A,\t0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, 0xF05B, 0x7911, 0xF05D,\n\t0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, 0x7917, 0xF2A3,\t0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, 0xF27D,\n\t0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D,\t0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C,\n\t0x7929, 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473,\t0x792D, 0xF5E1, 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6,\n\t0x7938, 0xF8B5, 0x7939, 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72,\t0x793E, 0xAAC0, 0x793F, 0xCDA3, 0x7940, 0xAAC1, 0x7941, 0xAAC2,\n\t0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, 0xCFF7, 0x7946, 0xACE6,\t0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, 0x794A, 0xCFF4,\n\t0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, 0xAFA7,\t0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6,\n\t0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE,\t0x795B, 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB,\n\t0x795F, 0xAFA9, 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0,\t0x7964, 0xD6BC, 0x7965, 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC,\n\t0x7969, 0xD6BE, 0x796A, 0xD6BF, 0x796B, 0xD6C1, 0x796D, 0xB2BD,\t0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, 0xDAD3, 0x7974, 0xDAD2,\n\t0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, 0x797D, 0xDEF5,\t0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, 0xE341,\n\t0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5,\t0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE,\n\t0x7994, 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340,\t0x7998, 0xE2F8, 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE,\n\t0x79A0, 0xE6CD, 0x79A1, 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE,\t0x79A6, 0xBF6D, 0x79A7, 0xC148, 0x79A8, 0xEDB0, 0x79AA, 0xC149,\n\t0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, 0xF05E, 0x79AE, 0xC2A7,\t0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, 0x79B3, 0xC5A1,\n\t0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, 0xC9A8,\t0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856,\n\t0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870,\t0x79C5, 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE,\n\t0x79CD, 0xCFFA, 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC,\t0x79D2, 0xACED, 0x79D5, 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5,\n\t0x79DC, 0xD2F3, 0x79DD, 0xD2F5, 0x79DE, 0xD2F4, 0x79DF, 0xAFB2,\t0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, 0xAFAF, 0x79E6, 0xAFB3,\n\t0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, 0x79EB, 0xD2ED,\t0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, 0xD6C6,\n\t0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE,\t0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA,\n\t0x7A05, 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B,\t0x7A0C, 0xDAD9, 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7,\n\t0x7A12, 0xDEFA, 0x7A13, 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC,\t0x7A17, 0xDEFB, 0x7A18, 0xDEF8, 0x7A19, 0xDEF9, 0x7A1A, 0xB858,\n\t0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, 0xB85C, 0x7A1F, 0xB85B,\t0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, 0x7A28, 0xE348,\n\t0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, 0xE346,\t0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F,\n\t0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C,\t0x7A44, 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0,\n\t0x7A4A, 0xE345, 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E,\t0x7A4E, 0xBF6F, 0x7A54, 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A,\n\t0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1,\t0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, 0xC2A8, 0x7A62, 0xC2A9,\n\t0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, 0x7A6B, 0xC3AC,\t0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, 0xF6F8,\n\t0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873,\t0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6,\n\t0x7A7E, 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0,\t0x7A84, 0xAFB6, 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC,\n\t0x7A88, 0xAFB7, 0x7A89, 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9,\t0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, 0x7A90, 0xD6CA, 0x7A92, 0xB2BF,\n\t0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, 0xB5A2, 0x7A97, 0xB5A1,\t0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, 0x7A9F, 0xB85D,\n\t0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, 0xE34A,\t0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C,\n\t0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3,\t0x7AB3, 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2,\n\t0x7AB7, 0xEAB6, 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7,\t0x7ABF, 0xC14B, 0x7AC0, 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB,\n\t0x7AC5, 0xC2AC, 0x7AC7, 0xC475, 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF,\t0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, 0xAFB8, 0x7ADF, 0xB3BA,\n\t0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, 0x7AE5, 0xB5A3,\t0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, 0xE34D,\n\t0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB,\t0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1,\n\t0x7B00, 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342,\t0x7B06, 0xAFB9, 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345,\n\t0x7B0E, 0xD346, 0x7B0F, 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA,\t0x7B12, 0xD348, 0x7B13, 0xD341, 0x7B18, 0xD6D3, 0x7B19, 0xB2C6,\n\t0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, 0xD6D5, 0x7B1E, 0xB2C7,\t0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, 0x7B24, 0xD6D1,\n\t0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, 0xD6D4,\t0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8,\n\t0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA,\t0x7B33, 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB,\n\t0x7B3B, 0xDADF, 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6,\t0x7B46, 0xB5A7, 0x7B47, 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5,\n\t0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB,\t0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, 0xB5A8, 0x7B51, 0xB5AE,\n\t0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, 0x7B58, 0xDAE5,\t0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, 0xDF47,\n\t0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A,\t0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E,\n\t0x7B72, 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1,\t0x7B76, 0xDF52, 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D,\n\t0x7B84, 0xBAE8, 0x7B85, 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E,\t0x7B8A, 0xE350, 0x7B8B, 0xBAE0, 0x7B8C, 0xE355, 0x7B8D, 0xE354,\n\t0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, 0xE352, 0x7B91, 0xE351,\t0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, 0x7B97, 0xBAE2,\n\t0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, 0xE34F,\t0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C,\n\t0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63,\t0x7BB4, 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6,\n\t0x7BB9, 0xE6DC, 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68,\t0x7BC4, 0xBD64, 0x7BC6, 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76,\n\t0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA,\t0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, 0xEAC5, 0x7BD9, 0xBF74,\n\t0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, 0x7BDD, 0xEABA,\t0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, 0xBF79,\n\t0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC,\t0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A,\n\t0x7BEA, 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC,\t0x7BF2, 0xEDBC, 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F,\n\t0x7BF8, 0xEDC8, 0x7BF9, 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9,\t0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, 0x7C00, 0xEDBD, 0x7C01, 0xEDC7,\n\t0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, 0xEDBA, 0x7C06, 0xEDCA,\t0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, 0x7C0B, 0xEDC2,\n\t0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, 0xEDBB,\t0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061,\n\t0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064,\t0x7C21, 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B,\n\t0x7C26, 0xF068, 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062,\t0x7C2A, 0xC2AF, 0x7C2B, 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066,\n\t0x7C30, 0xF06C, 0x7C33, 0xF2A8, 0x7C37, 0xC3B2, 0x7C38, 0xC3B0,\t0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, 0xF2A9, 0x7C3D, 0xC3B1,\n\t0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, 0x7C43, 0xC478,\t0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, 0xF4A6,\n\t0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0,\t0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC,\n\t0x7C5A, 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3,\t0x7C60, 0xC5A2, 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4,\n\t0x7C66, 0xF7ED, 0x7C67, 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8,\t0x7C6B, 0xF8FC, 0x7C6C, 0xC658, 0x7C6E, 0xC659, 0x7C6F, 0xF96D,\n\t0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, 0xCDA8, 0x7C78, 0xD045,\t0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, 0x7C7F, 0xD047,\n\t0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, 0xD34F,\t0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C,\n\t0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE,\t0x7C95, 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF,\n\t0x7C9E, 0xDAE8, 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7,\t0x7CA3, 0xD6E1, 0x7CA5, 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9,\n\t0x7CAF, 0xDF56, 0x7CB1, 0xB864, 0x7CB2, 0xDF54, 0x7CB3, 0xB865,\t0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, 0xBAE9, 0x7CBA, 0xE361,\n\t0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, 0x7CBE, 0xBAEB,\t0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, 0xBD6B,\n\t0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA,\t0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C,\n\t0x7CD6, 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153,\t0x7CDD, 0xC158, 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152,\n\t0x7CE2, 0xC155, 0x7CE7, 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE,\t0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, 0x7CEF, 0xC47A, 0x7CF0, 0xC47B,\n\t0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, 0xF740, 0x7CF6, 0xF8FD,\t0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, 0x7CFD, 0xCDA9,\n\t0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, 0xACF4,\t0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA,\n\t0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF,\t0x7D0B, 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353,\n\t0x7D0F, 0xD359, 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358,\t0x7D13, 0xD356, 0x7D14, 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355,\n\t0x7D17, 0xAFBD, 0x7D18, 0xD354, 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5,\t0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, 0xD351, 0x7D1E, 0xD350,\n\t0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, 0x7D22, 0xAFC1,\t0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, 0xD6E8,\n\t0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9,\t0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5,\n\t0x7D38, 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF,\t0x7D3C, 0xB2D1, 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED,\n\t0x7D40, 0xB2D2, 0x7D41, 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD,\t0x7D44, 0xB2D5, 0x7D45, 0xD6E7, 0x7D46, 0xB2CC, 0x7D47, 0xD6EB,\n\t0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, 0xDAF2, 0x7D50, 0xB5B2,\t0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, 0x7D54, 0xDAF7,\n\t0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, 0xB86C,\t0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8,\n\t0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0,\t0x7D68, 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5,\n\t0x7D6D, 0xDAF3, 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB,\t0x7D71, 0xB2CE, 0x7D72, 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868,\n\t0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, 0x7D7C, 0xDF61, 0x7D7D, 0xDF65,\t0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, 0xB86A, 0x7D83, 0xDF60,\n\t0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, 0x7D88, 0xDF57,\t0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, 0xB86B,\n\t0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63,\t0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78,\n\t0x7D9F, 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7,\t0x7DA3, 0xE365, 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377,\n\t0x7DAA, 0xE366, 0x7DAC, 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376,\t0x7DAF, 0xE370, 0x7DB0, 0xBAED, 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4,\n\t0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, 0xE363, 0x7DB8, 0xBAFA,\t0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, 0x7DBC, 0xE373,\n\t0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, 0xE368,\t0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369,\n\t0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2,\t0x7DCB, 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC,\n\t0x7DD7, 0xE6E7, 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75,\t0x7DDB, 0xE6E4, 0x7DDD, 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0,\n\t0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB,\t0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, 0xBD77, 0x7DEA, 0xE6E5,\n\t0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, 0x7DF0, 0xE6EE,\t0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, 0xBD6D,\n\t0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA,\t0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7,\n\t0x7E0A, 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB,\t0x7E0E, 0xEAD3, 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1,\n\t0x7E12, 0xEACC, 0x7E13, 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5,\t0x7E16, 0xEADA, 0x7E17, 0xEACE, 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3,\n\t0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, 0xBFA5, 0x7E1F, 0xEAD0,\t0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, 0x7E23, 0xBFA4,\n\t0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, 0xEDD6,\t0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169,\n\t0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3,\t0x7E34, 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C,\n\t0x7E38, 0xEDD5, 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD,\t0x7E3C, 0xEDD1, 0x7E3D, 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168,\n\t0x7E40, 0xEDD8, 0x7E41, 0xC163, 0x7E42, 0xEDD2, 0x7E43, 0xC15E,\t0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, 0xC15B, 0x7E47, 0xEDD9,\n\t0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, 0x7E50, 0xF06E,\t0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, 0xC2B4,\n\t0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071,\t0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6,\n\t0x7E5F, 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072,\t0x7E63, 0xF070, 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8,\n\t0x7E6B, 0xC3B4, 0x7E6D, 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2,\t0x7E72, 0xF2B6, 0x7E73, 0xC3BA, 0x7E74, 0xF2B7, 0x7E75, 0xF2B0,\n\t0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, 0xF2B1, 0x7E79, 0xC3B6,\t0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, 0x7E7D, 0xC47D,\n\t0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, 0xC4A1,\t0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7,\n\t0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1,\t0x7E91, 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE,\n\t0x7E96, 0xC5D6, 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942,\t0x7E9A, 0xF8FE, 0x7E9B, 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE,\n\t0x7F38, 0xACFB, 0x7F39, 0xD26F, 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA,\t0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, 0xEADF, 0x7F44, 0xC16A,\n\t0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, 0x7F4B, 0xF2B9,\t0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, 0xC5F8,\n\t0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D,\t0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D,\n\t0x7F5F, 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1,\t0x7F65, 0xDAFE, 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A,\n\t0x7F69, 0xB86E, 0x7F6A, 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B,\t0x7F6D, 0xDF67, 0x7F6E, 0xB86D, 0x7F70, 0xBB40, 0x7F72, 0xB870,\n\t0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, 0xE6F1, 0x7F77, 0xBD7D,\t0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, 0x7F7C, 0xEAE1,\n\t0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, 0xF2BB,\t0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9,\n\t0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA,\t0x7F8D, 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362,\n\t0x7F94, 0xAFCC, 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC,\t0x7F9B, 0xD6F5, 0x7F9C, 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB,\n\t0x7FA0, 0xDB42, 0x7FA1, 0xDB43, 0x7FA2, 0xDB41, 0x7FA4, 0xB873,\t0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, 0xDF6E, 0x7FA8, 0xB872,\n\t0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, 0x7FAF, 0xBD7E,\t0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, 0xF079,\n\t0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD,\t0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3,\n\t0x7FBD, 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365,\t0x7FC1, 0xAFCE, 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD,\n\t0x7FC7, 0xD6FB, 0x7FC9, 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7,\t0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC,\n\t0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, 0xB2DF, 0x7FD4, 0xB5BE,\t0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, 0x7FDC, 0xDF70,\n\t0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, 0xBB42,\t0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9,\n\t0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6,\t0x7FEC, 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4,\n\t0x7FF0, 0xBFAB, 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B,\t0x7FF4, 0xEDE5, 0x7FF5, 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B,\n\t0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE,\t0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, 0xC4A3, 0x8001, 0xA6D1,\n\t0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, 0x8006, 0xAFCF,\t0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, 0xAD41,\n\t0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42,\t0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366,\n\t0x8017, 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741,\t0x801C, 0xB2E0, 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71,\n\t0x8024, 0xE3A1, 0x8026, 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6,\t0x802A, 0xEAE5, 0x802C, 0xEDE7, 0x8030, 0xF5EF, 0x8033, 0xA6D5,\n\t0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, 0xAD43, 0x8037, 0xD055,\t0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, 0x803F, 0xAFD5,\n\t0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, 0xD744,\t0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45,\n\t0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45,\t0x805C, 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB,\n\t0x8067, 0xE6FC, 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F,\t0x8071, 0xC16D, 0x8072, 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C,\n\t0x8076, 0xC2BF, 0x8077, 0xC2BE, 0x8078, 0xF2C0, 0x8079, 0xF4B2,\t0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, 0xA6D6, 0x8082, 0xD1FB,\n\t0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, 0x8087, 0xBB46,\t0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, 0xA6D9,\n\t0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877,\t0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75,\n\t0x809A, 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878,\t0x80A1, 0xAAD1, 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE,\n\t0x80A9, 0xAAD3, 0x80AA, 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0,\t0x80AE, 0xCDAC, 0x80AF, 0xAAD6, 0x80B1, 0xAAD0, 0x80B2, 0xA87C,\n\t0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, 0xCDAE, 0x80BA, 0xAACD,\t0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, 0x80C5, 0xD05D,\n\t0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, 0xD061,\t0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064,\n\t0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062,\t0x80D6, 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F,\n\t0x80DA, 0xAD46, 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F,\t0x80DE, 0xAD4D, 0x80E0, 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E,\n\t0x80E4, 0xAD4E, 0x80E5, 0xAD45, 0x80E6, 0xD066, 0x80ED, 0xAFDA,\t0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, 0xAFD6, 0x80F2, 0xD36A,\n\t0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, 0x80F8, 0xAFDD,\t0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, 0xAFE2,\n\t0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D,\t0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF,\n\t0x810A, 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745,\t0x8119, 0xD747, 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C,\n\t0x811F, 0xD74A, 0x8121, 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5,\t0x8124, 0xB2E9, 0x8125, 0xD746, 0x8127, 0xD74F, 0x8129, 0xB2E7,\n\t0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, 0xD749, 0x812F, 0xB2E3,\t0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, 0x813D, 0xDB4F,\n\t0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, 0xB5C9,\t0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB,\n\t0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47,\t0x8151, 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4,\n\t0x8155, 0xB5C3, 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B,\t0x8160, 0xDF73, 0x8161, 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72,\n\t0x8165, 0xB87B, 0x8166, 0xB8A3, 0x8167, 0xDF7D, 0x8169, 0xDF76,\t0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, 0xDF7E, 0x8170, 0xB879,\n\t0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, 0x8174, 0xB5CD,\t0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, 0xB8A1,\n\t0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D,\t0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A,\n\t0x8189, 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9,\t0x818D, 0xE3A8, 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744,\n\t0x8198, 0xBDA8, 0x8199, 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3,\t0x819C, 0xBDA4, 0x819D, 0xBDA5, 0x819E, 0xE740, 0x819F, 0xE6FE,\n\t0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, 0xE6FD, 0x81A6, 0xEAE9,\t0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, 0x81AB, 0xEAED,\n\t0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, 0xEAE8,\t0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC,\n\t0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8,\t0x81BC, 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177,\n\t0x81C0, 0xC176, 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9,\t0x81C5, 0xEDEC, 0x81C6, 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179,\n\t0x81CA, 0xEDEB, 0x81CC, 0xEDEA, 0x81CD, 0xC2C0, 0x81CF, 0xC2C1,\t0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, 0xF07E, 0x81D5, 0xF2C2,\n\t0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, 0x81DA, 0xC4A4,\t0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, 0xC5A6,\n\t0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA,\t0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B,\n\t0x81E9, 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4,\t0x81EE, 0xDB53, 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50,\n\t0x81F7, 0xDB54, 0x81F8, 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F,\t0x81FB, 0xBFB2, 0x81FC, 0xA6DD, 0x81FE, 0xAAD8, 0x81FF, 0xD068,\n\t0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, 0xB2EA, 0x8204, 0xDB57,\t0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, 0x8209, 0xC17C,\n\t0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, 0xAAD9,\t0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51,\n\t0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF,\t0x821D, 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1,\n\t0x8221, 0xD069, 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA,\t0x822A, 0xAFE8, 0x822B, 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371,\n\t0x8232, 0xD757, 0x8233, 0xD754, 0x8234, 0xD756, 0x8235, 0xB2EB,\t0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, 0xD753, 0x8239, 0xB2EE,\n\t0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, 0x823F, 0xDB5A,\t0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, 0xDFA8,\n\t0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A,\t0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748,\n\t0x8253, 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7,\t0x8258, 0xBFB4, 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0,\n\t0x825C, 0xEDF2, 0x825E, 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4,\t0x8263, 0xF2C5, 0x8264, 0xF2C3, 0x8266, 0xC4A5, 0x8268, 0xF4B6,\n\t0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, 0xF7EF, 0x826D, 0xF8BB,\t0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, 0x8272, 0xA6E2,\n\t0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, 0xCA4A,\t0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E,\n\t0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B,\t0x828A, 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C,\n\t0x828F, 0xCB7A, 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E,\t0x8293, 0xCB7E, 0x8294, 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC,\n\t0x829A, 0xCDB5, 0x829B, 0xCDB7, 0x829D, 0xAADB, 0x829E, 0xCDBC,\t0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, 0xCDC0, 0x82A2, 0xCDC6,\n\t0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, 0x82A7, 0xCDB9,\t0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, 0xAAE2,\n\t0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7,\t0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8,\n\t0x82B6, 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0,\t0x82BA, 0xCDBD, 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE,\n\t0x82BE, 0xAAE8, 0x82C0, 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4,\t0x82D1, 0xAD62, 0x82D2, 0xAD5C, 0x82D3, 0xAD64, 0x82D4, 0xAD61,\n\t0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, 0xAD5D, 0x82D9, 0xD06B,\t0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, 0x82DF, 0xAD65,\n\t0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, 0xD0A1,\t0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F,\n\t0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5,\t0x82EF, 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078,\n\t0x82F3, 0xD0A4, 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C,\t0x82F9, 0xD06D, 0x82FA, 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C,\n\t0x8300, 0xD070, 0x8301, 0xAD5F, 0x8302, 0xAD5A, 0x8303, 0xAD53,\t0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, 0xAD67, 0x8307, 0xD06E,\n\t0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, 0x830D, 0xCE41,\t0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, 0xD3A3,\n\t0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E,\t0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5,\n\t0x8328, 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED,\t0x832C, 0xD3B3, 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC,\n\t0x8332, 0xAFF7, 0x8333, 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4,\t0x8336, 0xAFF9, 0x8337, 0xD3AB, 0x8338, 0xAFF1, 0x8339, 0xAFF8,\n\t0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, 0xD3A6, 0x833F, 0xD37A,\t0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, 0x8343, 0xAFFE,\n\t0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, 0xD3B6,\t0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0,\n\t0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2,\t0x8351, 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF,\n\t0x8356, 0xD379, 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765,\t0x8376, 0xD779, 0x8377, 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D,\n\t0x837B, 0xB2FD, 0x837C, 0xB2FE, 0x837D, 0xD768, 0x837E, 0xD76F,\t0x837F, 0xD775, 0x8381, 0xD762, 0x8383, 0xD769, 0x8386, 0xB340,\n\t0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, 0x838A, 0xB2F8,\t0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, 0xB2EF,\n\t0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9,\t0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773,\n\t0x8398, 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C,\t0x839D, 0xD76B, 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3,\n\t0x83A3, 0xD75A, 0x83A4, 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776,\t0x83A7, 0xB341, 0x83A8, 0xD75B, 0x83A9, 0xD767, 0x83AA, 0xD76D,\n\t0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, 0xD771, 0x83B0, 0xD774,\t0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, 0x83C1, 0xB5D7,\n\t0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, 0xB5D5,\t0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77,\n\t0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74,\t0x83CF, 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1,\n\t0x83D6, 0xDB75, 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8,\t0x83DB, 0xDBAF, 0x83DC, 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A,\n\t0x83DF, 0xB5E9, 0x83E0, 0xB5D4, 0x83E1, 0xDB72, 0x83E2, 0xDBAD,\t0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, 0xDB6F, 0x83E7, 0xDB63,\n\t0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, 0x83EB, 0xDB6A,\t0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, 0xB5DD,\n\t0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA,\t0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E,\n\t0x83FA, 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0,\t0x83FE, 0xDBB0, 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1,\n\t0x8404, 0xB5E5, 0x8406, 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78,\t0x840A, 0xB5DC, 0x840B, 0xB5D6, 0x840C, 0xB5DE, 0x840D, 0xB5D3,\n\t0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, 0xDB67, 0x8411, 0xDB7B,\t0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, 0x8423, 0xDB5F,\n\t0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, 0xDFCC,\t0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5,\n\t0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8,\t0x8437, 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0,\n\t0x843B, 0xDFD6, 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA,\t0x8440, 0xDFB2, 0x8442, 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC,\n\t0x8445, 0xDFC6, 0x8446, 0xB8B6, 0x8447, 0xDFD7, 0x8449, 0xB8AD,\t0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, 0xDFB6, 0x844E, 0xDFD0,\n\t0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, 0x8454, 0xDFDF,\t0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, 0xDFB8,\n\t0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD,\t0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0,\n\t0x8466, 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4,\t0x846B, 0xB8AC, 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0,\n\t0x846F, 0xDFD3, 0x8470, 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA,\t0x8475, 0xB8AA, 0x8476, 0xDFAC, 0x8477, 0xB8A7, 0x8478, 0xDFC4,\n\t0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, 0xDFB7, 0x847E, 0xDFDB,\t0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, 0x848E, 0xDFD5,\n\t0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, 0xE3C2,\t0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB,\n\t0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59,\t0x849F, 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1,\n\t0x84A4, 0xE3AD, 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6,\t0x84AA, 0xE3BA, 0x84AB, 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4,\n\t0x84AF, 0xE3C7, 0x84B0, 0xE3D2, 0x84B1, 0xE3BC, 0x84B2, 0xBB5A,\t0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, 0xBB5D, 0x84B9, 0xE3B6,\n\t0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, 0x84BF, 0xBB55,\t0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, 0xBB57,\n\t0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54,\t0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9,\n\t0x84CE, 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62,\t0x84D2, 0xE3D0, 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9,\n\t0x84D7, 0xE3CE, 0x84DB, 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774,\t0x84E9, 0xE767, 0x84EA, 0xE766, 0x84EB, 0xE762, 0x84EC, 0xBDB4,\n\t0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, 0xE775, 0x84F1, 0xDFA9,\t0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, 0x84F6, 0xE770,\n\t0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, 0xE758,\t0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6,\n\t0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD,\t0x8508, 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B,\n\t0x850C, 0xE75C, 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E,\t0x8511, 0xBDB0, 0x8512, 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3,\n\t0x8515, 0xE760, 0x8516, 0xE768, 0x8517, 0xBDA9, 0x8518, 0xE778,\t0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, 0xE757, 0x851D, 0xE76B,\n\t0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, 0x8521, 0xBDB2,\t0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, 0xE772,\n\t0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E,\t0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C,\n\t0x852F, 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D,\t0x853D, 0xBDAA, 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43,\n\t0x8543, 0xBFBB, 0x8544, 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41,\t0x8547, 0xEB47, 0x8548, 0xBFB8, 0x8549, 0xBFBC, 0x854A, 0xBFB6,\n\t0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, 0xEB46, 0x8553, 0xEAFC,\t0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, 0x8557, 0xEE46,\n\t0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, 0xEB54,\t0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44,\n\t0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53,\t0x8567, 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE,\n\t0x856B, 0xEAFA, 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D,\t0x8571, 0xEB4B, 0x8575, 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40,\n\t0x8578, 0xEE45, 0x8579, 0xEE52, 0x857A, 0xEE44, 0x857B, 0xEDFB,\t0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, 0xEDF4, 0x8581, 0xEE4D,\n\t0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, 0x8585, 0xEE51,\t0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, 0xEE42,\n\t0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A,\t0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4,\n\t0x8594, 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54,\t0x8599, 0xEE4B, 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3,\n\t0x859D, 0xEE4C, 0x859E, 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8,\t0x85A1, 0xEE43, 0x85A2, 0xEE4E, 0x85A3, 0xEDFA, 0x85A4, 0xEDFC,\n\t0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, 0xC1A9, 0x85A9, 0xC2C4,\t0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, 0x85B1, 0xF0B3,\n\t0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, 0xF0B4,\t0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9,\n\t0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6,\t0x85C2, 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2,\n\t0x85C6, 0xF0A5, 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7,\t0x85CB, 0xF0AF, 0x85CD, 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3,\n\t0x85D0, 0xC2C6, 0x85D1, 0xF2D5, 0x85D2, 0xF0B5, 0x85D5, 0xC3C2,\t0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, 0xF2C9, 0x85DA, 0xF2CC,\n\t0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, 0x85DF, 0xF2D2,\t0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, 0xC3C3,\n\t0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF,\t0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8,\n\t0x85EF, 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF,\t0x85F6, 0xF4BE, 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7,\n\t0x85FA, 0xC4A9, 0x85FB, 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB,\t0x85FF, 0xF4B9, 0x8600, 0xF4BD, 0x8601, 0xF4BA, 0x8604, 0xF4BF,\n\t0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, 0xC4AC, 0x8609, 0xF4C0,\t0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, 0x8611, 0xC4A8,\n\t0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, 0xC4F6,\t0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4,\n\t0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5,\t0x8624, 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8,\n\t0x8629, 0xF5FC, 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5,\t0x862E, 0xF5F9, 0x8631, 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749,\n\t0x8634, 0xF747, 0x8635, 0xF748, 0x8636, 0xF74C, 0x8638, 0xC5D9,\t0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, 0xF7F5, 0x863C, 0xF7F3,\n\t0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, 0x8643, 0xF8BC,\t0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, 0xF9C7,\n\t0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68,\t0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342,\n\t0x8656, 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8,\t0x865E, 0xB8B7, 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E,\n\t0x8663, 0xEB58, 0x8664, 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB,\t0x8668, 0xEE57, 0x8669, 0xF0BA, 0x866A, 0xF9A5, 0x866B, 0xA6E4,\n\t0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, 0xCDC8, 0x8670, 0xCDC7,\t0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, 0x8677, 0xD0A6,\n\t0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, 0xD0A8,\t0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041,\n\t0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB,\t0x8690, 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE,\n\t0x8695, 0xD3C9, 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA,\t0x8699, 0xD3C6, 0x869A, 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC,\n\t0x869E, 0xD3BE, 0x86A1, 0xD3C7, 0x86A2, 0xD3B9, 0x86A3, 0xB047,\t0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, 0xD3C8, 0x86A8, 0xD3BA,\n\t0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, 0x86B0, 0xD7A5,\t0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, 0xB348,\n\t0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7,\t0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF,\n\t0x86BE, 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2,\t0x86C2, 0xD7A1, 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3,\n\t0x86C6, 0xB349, 0x86C7, 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D,\t0x86CB, 0xB34A, 0x86CC, 0xD7AA, 0x86D0, 0xB5F1, 0x86D1, 0xDBBF,\n\t0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, 0xDFE7, 0x86D7, 0xDBBD,\t0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, 0x86DB, 0xB5EF,\n\t0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, 0xB5EB,\t0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3,\n\t0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9,\t0x86EC, 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE,\n\t0x86F7, 0xDFE4, 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6,\t0x86FB, 0xB8C0, 0x86FE, 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED,\n\t0x8702, 0xB8C1, 0x8703, 0xB8C2, 0x8704, 0xDFE3, 0x8705, 0xDFF0,\t0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, 0xB8BC, 0x8709, 0xDFEC,\n\t0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, 0x870D, 0xDFEF,\t0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, 0xB8BB,\n\t0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE,\t0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC,\n\t0x8722, 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68,\t0x8726, 0xE3EE, 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D,\n\t0x872A, 0xE3E6, 0x872C, 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA,\t0x8730, 0xE3F3, 0x8731, 0xE3EB, 0x8732, 0xE3E5, 0x8733, 0xE3D5,\n\t0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, 0xBB6C, 0x8738, 0xE3F0,\t0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, 0x873E, 0xE3E2,\n\t0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, 0xE3ED,\t0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9,\n\t0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD,\t0x8752, 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B,\n\t0x8756, 0xE7A1, 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF,\t0x875A, 0xE7AC, 0x875B, 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4,\n\t0x875E, 0xE7AE, 0x875F, 0xE7B3, 0x8760, 0xBDBB, 0x8761, 0xE7AB,\t0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, 0xE7A3, 0x8765, 0xE7BA,\n\t0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, 0x8769, 0xE7C0,\t0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, 0xE7AF,\n\t0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9,\t0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD,\n\t0x8779, 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61,\t0x8782, 0xBDB8, 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67,\n\t0x8787, 0xEB65, 0x8788, 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4,\t0x878F, 0xEB5C, 0x8790, 0xEB68, 0x8791, 0xEB69, 0x8792, 0xEB5F,\n\t0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, 0xEB62, 0x8797, 0xEB5D,\t0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, 0x879C, 0xEB6D,\n\t0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, 0xBFC3,\t0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1,\n\t0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67,\t0x87B0, 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A,\n\t0x87B5, 0xEE5F, 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D,\t0x87B9, 0xEE5E, 0x87BA, 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60,\n\t0x87BD, 0xEE6E, 0x87BE, 0xEE58, 0x87BF, 0xEE6C, 0x87C0, 0xC1AC,\t0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, 0xEE68, 0x87C5, 0xEE5B,\n\t0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, 0x87CA, 0xEE69,\t0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, 0xC1AF,\n\t0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9,\t0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1,\n\t0x87DE, 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5,\t0x87E2, 0xF0BD, 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1,\n\t0x87E6, 0xF0BC, 0x87E7, 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0,\t0x87EB, 0xF0BF, 0x87EC, 0xC2CD, 0x87ED, 0xF0C8, 0x87EF, 0xC2CC,\n\t0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, 0xF0CF, 0x87F6, 0xF2DE,\t0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, 0x87FB, 0xC3C6,\n\t0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, 0xF2DB,\t0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7,\n\t0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7,\t0x880B, 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5,\n\t0x8811, 0xF4C6, 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF,\t0x8816, 0xF4C9, 0x8817, 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642,\n\t0x881C, 0xF645, 0x881D, 0xF641, 0x881F, 0xC4FA, 0x8820, 0xF643,\t0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, 0xC4F7, 0x8824, 0xF644,\n\t0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, 0x8829, 0xF640,\t0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, 0xF7F9,\n\t0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8,\t0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE,\n\t0x8838, 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E,\t0x883D, 0xF9A7, 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5,\n\t0x8841, 0xD0AA, 0x8843, 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0,\t0x884A, 0xF647, 0x884B, 0xF8C0, 0x884C, 0xA6E6, 0x884D, 0xAD6C,\n\t0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, 0xB34E, 0x8855, 0xDBC2,\t0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, 0x885A, 0xE7C1,\n\t0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, 0xC5FC,\t0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE,\n\t0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8,\t0x8870, 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB,\n\t0x8875, 0xD3D2, 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E,\t0x887C, 0xD3DC, 0x887D, 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7,\n\t0x8880, 0xD3D5, 0x8881, 0xB04B, 0x8882, 0xB04C, 0x8883, 0xD3D9,\t0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, 0xB355, 0x888C, 0xD7C2,\n\t0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, 0x8892, 0xB352,\t0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, 0xD7BF,\n\t0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE,\t0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5,\n\t0x88A4, 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6,\t0x88AB, 0xB351, 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD,\n\t0x88B6, 0xDBC9, 0x88B7, 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5,\t0x88BA, 0xDBC3, 0x88BC, 0xDBCA, 0x88BD, 0xDBCC, 0x88BE, 0xDBC8,\n\t0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, 0xB5F5, 0x88C9, 0xDBCF,\t0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, 0x88CD, 0xDFF3,\n\t0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, 0xB8CF,\t0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4,\n\t0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6,\t0x88DC, 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6,\n\t0x88E1, 0xB8CC, 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442,\t0x88EC, 0xE441, 0x88EE, 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440,\n\t0x88F1, 0xE3F7, 0x88F2, 0xE3F8, 0x88F3, 0xBB6E, 0x88F4, 0xBB70,\t0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, 0xBB72, 0x88F9, 0xBB71,\n\t0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, 0x88FD, 0xBB73,\t0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, 0xE7C2,\n\t0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA,\t0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5,\n\t0x8911, 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4,\t0x8915, 0xBDC9, 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7,\n\t0x8919, 0xE7C8, 0x891A, 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C,\t0x8921, 0xBFCA, 0x8922, 0xEB77, 0x8923, 0xEB79, 0x8925, 0xBFC8,\n\t0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, 0xEB78, 0x892A, 0xBFC6,\t0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, 0x892E, 0xEB74,\n\t0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, 0xBFC7,\t0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77,\n\t0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA,\t0x893E, 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8,\n\t0x8946, 0xF0D6, 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5,\t0x894F, 0xF0D4, 0x8950, 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76,\n\t0x8953, 0xF0D2, 0x8956, 0xC3CD, 0x8957, 0xF2EC, 0x8958, 0xF2EF,\t0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, 0xF2EB, 0x895C, 0xF2EE,\n\t0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, 0x8960, 0xC3CB,\t0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, 0xC4B0,\n\t0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B,\t0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8,\n\t0x8971, 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC,\t0x8976, 0xF7FB, 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B,\n\t0x897C, 0xF94A, 0x897E, 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E,\t0x8982, 0xD7C5, 0x8983, 0xB5F7, 0x8985, 0xDFFA, 0x8986, 0xC2D0,\n\t0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, 0xB357, 0x8993, 0xB356,\t0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, 0x8998, 0xDBD1,\n\t0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, 0xE446,\t0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0,\n\t0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB,\t0x89AD, 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1,\n\t0x89B6, 0xF2F4, 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1,\t0x89BD, 0xC4FD, 0x89BE, 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B,\n\t0x89D2, 0xA8A4, 0x89D3, 0xD0AF, 0x89D4, 0xAD6F, 0x89D5, 0xD7C8,\t0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, 0xDBD4, 0x89DB, 0xDBD5,\n\t0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, 0x89E0, 0xE041,\t0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, 0xDFFE,\n\t0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447,\t0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2,\n\t0x89F1, 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2,\t0x89F6, 0xF2F5, 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C,\n\t0x89FB, 0xF755, 0x89FC, 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C,\t0x8A00, 0xA8A5, 0x8A02, 0xAD71, 0x8A03, 0xAD72, 0x8A04, 0xD0B0,\n\t0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, 0xB054, 0x8A0C, 0xB052,\t0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, 0x8A11, 0xB059,\n\t0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, 0xB057,\t0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359,\n\t0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A,\t0x8A25, 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB,\n\t0x8A2D, 0xB35D, 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644,\t0x8A36, 0xB646, 0x8A39, 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9,\n\t0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, 0x8A3F, 0xE049, 0x8A40, 0xDBDA,\t0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, 0xDBDE, 0x8A46, 0xB643,\n\t0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, 0x8A4D, 0xDBD7,\t0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, 0xDBE1,\n\t0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647,\t0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641,\n\t0x8A5E, 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF,\t0x8A63, 0xB8DA, 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6,\n\t0x8A6B, 0xB8D2, 0x8A6C, 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0,\t0x8A70, 0xB8D7, 0x8A71, 0xB8DC, 0x8A72, 0xB8D3, 0x8A73, 0xB8D4,\n\t0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, 0xE045, 0x8A77, 0xE04A,\t0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, 0x8A7C, 0xB8D9,\n\t0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, 0xE04E,\t0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8,\n\t0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E,\t0x8A91, 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF,\n\t0x8A96, 0xE44F, 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6,\t0x8A9E, 0xBB79, 0x8AA0, 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A,\n\t0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7,\t0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, 0xE44A, 0x8AB0, 0xBDD6,\n\t0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, 0x8AB9, 0xBDDA,\t0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, 0xE7E3,\n\t0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4,\t0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5,\n\t0x8AC7, 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0,\t0x8ACD, 0xBDD8, 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC,\n\t0x8AD3, 0xE7D7, 0x8AD4, 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7,\t0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB,\n\t0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, 0xEBAB, 0x8ADF, 0xEBA8,\t0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, 0x8AE4, 0xEBA7,\n\t0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, 0xBFCF,\t0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9,\n\t0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3,\t0x8AF5, 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1,\n\t0x8AFA, 0xBFCE, 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5,\t0x8AFF, 0xEBAE, 0x8B00, 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7,\n\t0x8B04, 0xC1C3, 0x8B05, 0xEEA4, 0x8B06, 0xEEAD, 0x8B07, 0xEEAA,\t0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, 0xEEA5, 0x8B0D, 0xEEAB,\n\t0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, 0x8B11, 0xEEA3,\t0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, 0xEEA9,\n\t0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE,\t0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2,\n\t0x8B1E, 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC,\t0x8B24, 0xF0EA, 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB,\n\t0x8B28, 0xC2D3, 0x8B2A, 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5,\t0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, 0x8B30, 0xF0DE, 0x8B31, 0xF0E4,\n\t0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, 0xF0E8, 0x8B37, 0xF0E6,\t0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, 0x8B3C, 0xF0E2,\n\t0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, 0xC3CF,\t0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0,\n\t0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD,\t0x8B4E, 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340,\n\t0x8B52, 0xF342, 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE,\t0x8B56, 0xF2FB, 0x8B57, 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7,\n\t0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7,\t0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, 0xF4D3, 0x8B66, 0xC4B5,\n\t0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, 0x8B6B, 0xC4B8,\t0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, 0xC4B3,\n\t0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D,\t0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756,\n\t0x8B7F, 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757,\t0x8B85, 0xF75A, 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC,\n\t0x8B8B, 0xF842, 0x8B8C, 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE,\t0x8B93, 0xC5FD, 0x8B94, 0xF8C1, 0x8B95, 0xF8C2, 0x8B96, 0xC640,\n\t0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, 0xC667, 0x8B9C, 0xC66D,\t0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, 0x8C39, 0xD7CD,\n\t0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, 0xE7E5,\t0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344,\n\t0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A,\t0x8C49, 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC,\n\t0x8C4D, 0xE7E6, 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7,\t0x8C54, 0xC676, 0x8C55, 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF,\n\t0x8C5A, 0xB362, 0x8C5C, 0xD7CF, 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5,\t0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, 0xE056, 0x8C65, 0xE055,\n\t0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, 0x8C6A, 0xBBA8,\t0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, 0xEEB5,\n\t0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7,\t0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4,\n\t0x8C79, 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1,\t0x8C80, 0xDBE7, 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059,\n\t0x8C85, 0xE05A, 0x8C86, 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7,\t0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3,\n\t0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, 0xBFDF, 0x8C94, 0xEEB7,\t0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, 0x8C99, 0xF0F0,\n\t0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, 0xAD73,\t0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2,\n\t0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366,\t0x8CA9, 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364,\n\t0x8CAF, 0xB64A, 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C,\t0x8CB4, 0xB651, 0x8CB5, 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652,\n\t0x8CB8, 0xB655, 0x8CB9, 0xDBEB, 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F,\t0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, 0xDBE9, 0x8CBF, 0xB654,\n\t0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, 0x8CC3, 0xB8EE,\t0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, 0xB8EB,\n\t0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC,\t0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455,\n\t0x8CD9, 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED,\t0x8CDE, 0xBDE0, 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9,\n\t0x8CE2, 0xBDE5, 0x8CE3, 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8,\t0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8,\n\t0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, 0xEBB5, 0x8CF0, 0xEBB7,\t0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, 0x8CF5, 0xEBB4,\n\t0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, 0xC1CC,\t0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6,\n\t0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348,\t0x8D07, 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9,\n\t0x8D0D, 0xC4BA, 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542,\t0x8D14, 0xF653, 0x8D15, 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC,\n\t0x8D19, 0xF845, 0x8D1B, 0xC642, 0x8D64, 0xA8AA, 0x8D66, 0xB36A,\t0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, 0xE05D, 0x8D6B, 0xBBAE,\n\t0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, 0x8D6F, 0xEEB9,\t0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, 0xAD75,\n\t0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5,\t0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658,\n\t0x8D84, 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656,\t0x8D8C, 0xE05F, 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061,\n\t0x8D90, 0xE065, 0x8D91, 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063,\t0x8D94, 0xE064, 0x8D95, 0xBBB0, 0x8D96, 0xE456, 0x8D99, 0xBBAF,\n\t0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, 0xBDEB, 0x8DA0, 0xE7EF,\t0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, 0x8DA7, 0xEBBC,\n\t0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, 0xF34B,\t0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F,\n\t0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7,\t0x8DB7, 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6,\n\t0x8DBE, 0xB36B, 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7,\t0x8DC5, 0xDBFB, 0x8DC6, 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9,\n\t0x8DCB, 0xB65B, 0x8DCC, 0xB65E, 0x8DCD, 0xDBF2, 0x8DCE, 0xB659,\t0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, 0xB65D, 0x8DD3, 0xDBF1,\n\t0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, 0x8DD8, 0xDBF0,\t0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, 0xDBF5,\n\t0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1,\t0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9,\n\t0x8DE7, 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7,\t0x8DEB, 0xE072, 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4,\n\t0x8DF0, 0xE067, 0x8DF1, 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5,\t0x8DF4, 0xE073, 0x8DFA, 0xB8F6, 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B,\n\t0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, 0xE462, 0x8E02, 0xE458,\t0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, 0x8E06, 0xE45F,\n\t0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, 0xE45A,\t0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841,\n\t0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA,\t0x8E17, 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846,\n\t0x8E1B, 0xE7F9, 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5,\t0x8E1F, 0xBDF3, 0x8E20, 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0,\n\t0x8E23, 0xE7F4, 0x8E24, 0xE7F6, 0x8E25, 0xE7F5, 0x8E26, 0xE7FD,\t0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, 0xBDED, 0x8E2E, 0xE7F7,\n\t0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, 0x8E34, 0xBFE3,\t0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, 0xBFE5,\n\t0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7,\t0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1,\n\t0x8E45, 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE,\t0x8E4A, 0xC1D1, 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB,\n\t0x8E4E, 0xEEBA, 0x8E50, 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145,\t0x8E55, 0xC2DE, 0x8E56, 0xF0FB, 0x8E57, 0xF0FA, 0x8E59, 0xC2D9,\n\t0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, 0xF0F7, 0x8E5D, 0xF143,\t0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, 0x8E61, 0xF142,\n\t0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, 0xF0FD,\t0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352,\n\t0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB,\t0x8E73, 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350,\n\t0x8E7A, 0xC3DF, 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC,\t0x8E82, 0xC4BE, 0x8E84, 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7,\n\t0x8E87, 0xC3DC, 0x8E88, 0xF4D8, 0x8E89, 0xC4BB, 0x8E8A, 0xC543,\t0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, 0xC544, 0x8E8E, 0xF655,\n\t0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, 0x8E93, 0xC5AE,\t0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, 0xF763,\n\t0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3,\t0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951,\n\t0x8EA4, 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE,\t0x8EA9, 0xF9AB, 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060,\n\t0x8EB2, 0xB8FA, 0x8EBA, 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF,\t0x8EC2, 0xF355, 0x8EC9, 0xF9AC, 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE,\n\t0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, 0xB063, 0x8ED1, 0xD3E8,\t0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, 0x8ED7, 0xD7DF,\n\t0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, 0xD7DD,\t0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1,\n\t0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46,\t0x8EE9, 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42,\n\t0x8EEF, 0xDBFC, 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44,\t0x8EF6, 0xDC47, 0x8EF7, 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40,\n\t0x8EFA, 0xDBFE, 0x8EFB, 0xB661, 0x8EFC, 0xB663, 0x8EFE, 0xB8FD,\t0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, 0xE076, 0x8F02, 0xE07B,\n\t0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, 0x8F07, 0xE079,\t0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, 0xE07C,\n\t0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465,\t0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4,\n\t0x8F16, 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A,\t0x8F1B, 0xBDF8, 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE,\n\t0x8F1F, 0xBDF9, 0x8F20, 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848,\t0x8F25, 0xBE40, 0x8F26, 0xBDFB, 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC,\n\t0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, 0xBFE8, 0x8F32, 0xEBCC,\t0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, 0x8F36, 0xEBC9,\n\t0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, 0xBFE7,\t0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4,\n\t0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146,\t0x8F47, 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149,\n\t0x8F4D, 0xC2E1, 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359,\t0x8F51, 0xF357, 0x8F52, 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1,\n\t0x8F55, 0xF4DD, 0x8F56, 0xF4DB, 0x8F57, 0xF4DC, 0x8F58, 0xF4DE,\t0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, 0xF658, 0x8F5D, 0xF659,\n\t0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, 0x8F61, 0xC5AF,\t0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, 0xA8AF,\n\t0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC,\t0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547,\n\t0x8FB0, 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B,\t0x8FBF, 0xCBA6, 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3,\n\t0x8FC6, 0xA8B2, 0x8FC9, 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF,\t0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE,\n\t0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, 0xCDD0, 0x8FD7, 0xCDD2,\t0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, 0x8FE3, 0xD0B3,\n\t0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, 0xADA4,\t0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5,\n\t0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1,\t0x8FF7, 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE,\n\t0x8FFC, 0xD3F0, 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED,\t0x9000, 0xB068, 0x9001, 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B,\n\t0x9004, 0xD3EF, 0x9005, 0xB06D, 0x9006, 0xB066, 0x900B, 0xD7E3,\t0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, 0xB37A, 0x9010, 0xB376,\n\t0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, 0x9016, 0xB37C,\t0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, 0xB37D,\n\t0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374,\t0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373,\n\t0x9024, 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F,\t0x9031, 0xB667, 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666,\n\t0x9036, 0xB66A, 0x9038, 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3,\t0x903E, 0xB94F, 0x903F, 0xE07E, 0x9041, 0xB950, 0x9042, 0xB945,\n\t0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, 0xE0A2, 0x904A, 0xB943,\t0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, 0x904F, 0xB94B,\n\t0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, 0xB944,\t0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB,\n\t0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC,\t0x9060, 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852,\n\t0x9068, 0xBE43, 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44,\t0x906E, 0xBE42, 0x906F, 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0,\n\t0x9073, 0xE84F, 0x9074, 0xBFEE, 0x9075, 0xBFED, 0x9076, 0xEBD0,\t0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, 0xEBD1, 0x907A, 0xBFF2,\n\t0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, 0x907E, 0xEEC3,\t0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, 0xC1DB,\n\t0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3,\t0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5,\n\t0x908D, 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6,\t0x9094, 0xCA55, 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53,\n\t0x9099, 0xCA51, 0x909B, 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7,\t0x90A0, 0xCBAC, 0x90A1, 0xCBA8, 0x90A2, 0xA8B7, 0x90A3, 0xA8BA,\n\t0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, 0xCBAB, 0x90AA, 0xA8B8,\t0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, 0x90B2, 0xCDD3,\n\t0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, 0xAAF5,\t0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9,\n\t0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD,\t0x90C8, 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6,\n\t0x90D4, 0xD7EE, 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB,\t0x90D8, 0xD3F9, 0x90D9, 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA,\n\t0x90DC, 0xD3FC, 0x90DD, 0xB071, 0x90DF, 0xD3F7, 0x90E0, 0xD3F3,\t0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, 0xD3F6, 0x90E4, 0xD3FD,\n\t0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, 0x90EA, 0xD7E9,\t0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, 0xD7E8,\n\t0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED,\t0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4,\n\t0x90FB, 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E,\t0x90FF, 0xDC53, 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B,\n\t0x9103, 0xDC5C, 0x9104, 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50,\t0x9107, 0xDC5A, 0x9108, 0xDC55, 0x9109, 0xB66D, 0x910B, 0xE0AA,\n\t0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, 0xE0A6, 0x9110, 0xE0A4,\t0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, 0x9116, 0xE0A8,\n\t0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, 0xE46E,\t0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2,\n\t0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B,\t0x9123, 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48,\n\t0x9128, 0xF14A, 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855,\t0x912C, 0xDC51, 0x912D, 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854,\n\t0x9130, 0xBE46, 0x9131, 0xBE49, 0x9132, 0xE858, 0x9133, 0xEBD5,\t0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, 0xEBD7, 0x9138, 0xEEC4,\n\t0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, 0x913E, 0xF14D,\t0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, 0xF4E1,\n\t0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766,\t0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9,\n\t0x914C, 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441,\t0x9150, 0xD3FE, 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6,\n\t0x9156, 0xD7F2, 0x9157, 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4,\t0x915F, 0xDC5F, 0x9160, 0xDC61, 0x9161, 0xDC5D, 0x9162, 0xDC60,\n\t0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, 0xB670, 0x9168, 0xDD73,\t0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, 0x916E, 0xE0AC,\n\t0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, 0xBBC6,\t0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474,\n\t0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F,\t0x9183, 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C,\n\t0x9187, 0xBE4A, 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C,\t0x918D, 0xEBDB, 0x918F, 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA,\n\t0x9192, 0xBFF4, 0x9193, 0xEBD8, 0x9199, 0xEEC8, 0x919A, 0xEEC5,\t0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, 0xEECB, 0x919E, 0xC1DF,\n\t0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, 0x91A2, 0xEEC6,\t0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, 0xF14E,\n\t0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F,\t0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6,\n\t0x91B2, 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4,\t0x91B7, 0xF4E3, 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849,\n\t0x91BD, 0xF8C8, 0x91BE, 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D,\t0x91C2, 0xF8C9, 0x91C3, 0xF971, 0x91C5, 0xC66F, 0x91C6, 0xA8BC,\n\t0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, 0xC4C0, 0x91CC, 0xA8BD,\t0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, 0x91D0, 0xC2E7,\n\t0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, 0xD442,\t0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444,\n\t0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8,\t0x91E4, 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842,\n\t0x91E9, 0xB3AB, 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7,\t0x91ED, 0xB3AA, 0x91EE, 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA,\n\t0x91F4, 0xD7F8, 0x91F5, 0xB3A6, 0x91F7, 0xD841, 0x91F8, 0xD7FB,\t0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, 0xDC6C, 0x9200, 0xDC6A,\n\t0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, 0x9204, 0xDC6F,\t0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, 0xB675,\n\t0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68,\t0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672,\n\t0x9215, 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74,\t0x921A, 0xDC66, 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674,\n\t0x9224, 0xDC73, 0x9225, 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70,\t0x922D, 0xE4BA, 0x922E, 0xE0B7, 0x9230, 0xE0B0, 0x9231, 0xE0C3,\n\t0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, 0xB961, 0x9236, 0xE0C0,\t0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, 0x923A, 0xE0B1,\n\t0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, 0xB95B,\t0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962,\n\t0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963,\t0x924E, 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960,\n\t0x9252, 0xE0AF, 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB,\t0x9257, 0xB958, 0x925A, 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5,\n\t0x9260, 0xE0BD, 0x9261, 0xE0C1, 0x9263, 0xE0C5, 0x9264, 0xB95F,\t0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, 0xE0BE, 0x926C, 0xE0BB,\n\t0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, 0x9272, 0xE0C7,\t0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, 0xE47A,\n\t0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5,\t0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6,\n\t0x9285, 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE,\t0x928A, 0xE4B0, 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E,\n\t0x928E, 0xE4A9, 0x9291, 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C,\t0x9295, 0xE4AB, 0x9296, 0xBBCB, 0x9297, 0xE4A5, 0x9298, 0xBBCA,\n\t0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, 0xE479, 0x929C, 0xBBCE,\t0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, 0x92A2, 0xE4AC,\n\t0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, 0xE4A1,\t0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D,\n\t0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55,\t0x92B4, 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50,\n\t0x92B9, 0xF9D7, 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865,\t0x92C1, 0xBE54, 0x92C2, 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864,\n\t0x92C5, 0xBE4E, 0x92C6, 0xE8A3, 0x92C7, 0xBE58, 0x92C8, 0xE874,\t0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, 0xEBEE, 0x92CC, 0xE86F,\n\t0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, 0x92D0, 0xE862,\t0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, 0xE878,\n\t0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E,\t0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2,\n\t0x92E4, 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872,\t0x92E9, 0xE86C, 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870,\n\t0x92F0, 0xBE59, 0x92F1, 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7,\t0x92F9, 0xEBF3, 0x92FA, 0xEBF0, 0x92FB, 0xEC44, 0x92FC, 0xBFFB,\n\t0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, 0xEC43, 0x9301, 0xEBE9,\t0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, 0x9308, 0xEBDF,\n\t0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, 0xEBED,\t0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8,\n\t0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45,\t0x9318, 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6,\n\t0x931D, 0xEBEF, 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5,\t0x9321, 0xC042, 0x9322, 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7,\n\t0x9325, 0xEBF1, 0x9326, 0xC041, 0x9327, 0xEBDD, 0x9328, 0xC1E3,\t0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, 0xBFFC, 0x932D, 0xEBEB,\n\t0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, 0x9334, 0xEBF5,\t0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, 0xEBFA,\n\t0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7,\t0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1,\n\t0x934E, 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9,\t0x9352, 0xEEE2, 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1,\n\t0x9357, 0xEEE0, 0x9358, 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED,\t0x935B, 0xC1EB, 0x935C, 0xEED5, 0x935E, 0xEEE8, 0x9360, 0xEEDA,\n\t0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, 0xEED0, 0x9365, 0xC1E6,\t0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, 0x936D, 0xEEDB,\n\t0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, 0xEED6,\t0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6,\n\t0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2,\t0x9383, 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9,\n\t0x938C, 0xF154, 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC,\t0x9391, 0xF165, 0x9392, 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F,\n\t0x9396, 0xC2EA, 0x9397, 0xC2F2, 0x9398, 0xC2F0, 0x9399, 0xF161,\t0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, 0xF158, 0x939E, 0xF15D,\n\t0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, 0x93A3, 0xF16A,\t0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, 0xF15A,\n\t0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE,\t0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164,\n\t0x93B2, 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153,\t0x93B7, 0xF156, 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB,\n\t0x93C4, 0xF371, 0x93C7, 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C,\t0x93CC, 0xF368, 0x93CD, 0xC3F1, 0x93CE, 0xF372, 0x93CF, 0xF362,\n\t0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, 0xF374, 0x93D4, 0xF36D,\t0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, 0x93D8, 0xC3F2,\n\t0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, 0xC3EE,\t0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0,\n\t0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375,\t0x93E8, 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3,\n\t0x93F6, 0xF542, 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366,\t0x93FA, 0xF4FA, 0x93FB, 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3,\n\t0x93FE, 0xF4ED, 0x93FF, 0xF4FE, 0x9400, 0xF4F4, 0x9403, 0xC4C2,\t0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, 0xF4FB, 0x940A, 0xF4FD,\n\t0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, 0x940E, 0xF4F7,\t0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, 0xF4F9,\n\t0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8,\t0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0,\n\t0x9429, 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668,\t0x942E, 0xC549, 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E,\n\t0x9433, 0xC54A, 0x9435, 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667,\t0x9438, 0xC54D, 0x9439, 0xF665, 0x943A, 0xC54C, 0x943B, 0xF65F,\n\t0x943C, 0xF663, 0x943D, 0xF662, 0x943F, 0xF65E, 0x9440, 0xF669,\t0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, 0x9447, 0xF76C,\n\t0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, 0xF76A,\t0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2,\n\t0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C,\t0x945E, 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF,\n\t0x9464, 0xC5E1, 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644,\t0x946B, 0xF8CA, 0x946D, 0xF953, 0x946E, 0xF952, 0x946F, 0xF954,\n\t0x9470, 0xC65F, 0x9471, 0xF955, 0x9472, 0xC65E, 0x9473, 0xF956,\t0x9474, 0xF972, 0x9475, 0xF975, 0x9476, 0xF974, 0x9477, 0xC668,\n\t0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, 0x947E, 0xC671,\t0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, 0xF9BF,\n\t0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78,\t0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC,\n\t0x9583, 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC,\t0x958B, 0xB67D, 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3,\n\t0x958F, 0xB67C, 0x9590, 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2,\t0x9593, 0xB6A1, 0x9594, 0xB67B, 0x9598, 0xB968, 0x959B, 0xE0D0,\n\t0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, 0xE0CD, 0x95A1, 0xBBD2,\t0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, 0x95A8, 0xBBD3,\n\t0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, 0xBE5B,\t0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D,\n\t0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A,\t0x95BB, 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48,\n\t0x95BF, 0xEC4C, 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2,\t0x95C6, 0xC1F3, 0x95C7, 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0,\n\t0x95CA, 0xC1EF, 0x95CB, 0xC1F0, 0x95CC, 0xC1F1, 0x95CD, 0xEC47,\t0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, 0xF16C, 0x95D3, 0xF16D,\n\t0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, 0x95DA, 0xF377,\t0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, 0xF547,\n\t0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D,\t0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA,\n\t0x9620, 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59,\t0x9624, 0xCA57, 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2,\n\t0x962D, 0xCBB0, 0x962E, 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD,\t0x9631, 0xA8C0, 0x9632, 0xA8BE, 0x9639, 0xCDD8, 0x963A, 0xCDDB,\n\t0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, 0xCDD9, 0x963F, 0xAAFC,\t0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, 0x9644, 0xAAFE,\n\t0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, 0xADB0,\t0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4,\n\t0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1,\t0x965C, 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446,\n\t0x9661, 0xB07E, 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3,\t0x966A, 0xB3AD, 0x966B, 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848,\n\t0x966F, 0xD84B, 0x9670, 0xB3B1, 0x9671, 0xD84A, 0x9672, 0xB6AB,\t0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, 0xB3AE, 0x9676, 0xB3B3,\n\t0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, 0x967D, 0xB6A7,\t0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, 0xB6AC,\n\t0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E,\t0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA,\n\t0x968E, 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2,\t0x9694, 0xB96A, 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969,\n\t0x9699, 0xBBD8, 0x969B, 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB,\t0x96A1, 0xE4BC, 0x96A2, 0xE8AB, 0x96A4, 0xE8AA, 0x96A7, 0xC047,\n\t0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, 0xC049, 0x96AC, 0xEEF6,\t0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, 0x96B3, 0xF16F,\n\t0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, 0xB0A6,\t0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD,\n\t0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE,\t0x96C6, 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E,\n\t0x96CA, 0xB96F, 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C,\t0x96CE, 0xE0D5, 0x96D2, 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50,\n\t0x96D5, 0xC04A, 0x96D6, 0xC1F6, 0x96D7, 0xF170, 0x96D8, 0xF174,\t0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, 0xC2FA, 0x96DC, 0xC2F8,\n\t0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, 0x96E1, 0xF379,\t0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, 0xAB42,\n\t0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8,\t0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973,\n\t0x96F7, 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6,\t0x96FB, 0xB971, 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD,\n\t0x9702, 0xE8AF, 0x9704, 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E,\t0x9707, 0xBE5F, 0x9708, 0xE8AE, 0x9709, 0xBE60, 0x970B, 0xEC51,\n\t0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, 0xC050, 0x9710, 0xEC53,\t0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, 0x9716, 0xC04D,\n\t0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, 0xEEFA,\t0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177,\n\t0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E,\t0x9727, 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9,\n\t0x972B, 0xF37B, 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549,\t0x9730, 0xC4C5, 0x9732, 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551,\n\t0x9739, 0xC552, 0x973A, 0xF66F, 0x973D, 0xC5B4, 0x973E, 0xC5B5,\t0x973F, 0xF771, 0x9742, 0xC645, 0x9743, 0xF8CF, 0x9744, 0xC647,\n\t0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, 0x9749, 0xF957,\t0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, 0xE4BE,\n\t0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44,\t0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053,\n\t0x9768, 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9,\t0x976E, 0xDCAB, 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA,\n\t0x9774, 0xB975, 0x9776, 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC,\t0x977A, 0xE4C0, 0x977B, 0xE4C5, 0x977C, 0xBBDE, 0x977D, 0xE4BF,\n\t0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, 0xE4C3, 0x9781, 0xE4C7,\t0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, 0x9785, 0xBBDF,\n\t0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, 0xBE62,\t0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55,\n\t0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE,\t0x979D, 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD,\n\t0x97A2, 0xF1A1, 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2,\t0x97A6, 0xC2FE, 0x97A8, 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C,\n\t0x97AC, 0xF179, 0x97AD, 0xC340, 0x97AE, 0xF17A, 0x97B3, 0xF3A1,\t0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, 0xF54A, 0x97BB, 0xF54B,\n\t0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, 0x97C4, 0xF84F,\t0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, 0xC669,\n\t0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9,\t0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43,\n\t0x97D5, 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6,\t0x97D9, 0xF1A4, 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5,\n\t0x97DF, 0xF3A6, 0x97E1, 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2,\t0x97ED, 0xADB4, 0x97F0, 0xEC57, 0x97F1, 0xEF44, 0x97F3, 0xADB5,\n\t0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, 0xC341, 0x97FA, 0xF1A7,\t0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, 0x97FF, 0xC554,\n\t0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, 0xB3BC,\t0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC,\n\t0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF,\t0x980E, 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978,\n\t0x9812, 0xB97B, 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1,\t0x9818, 0xBBE2, 0x981B, 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7,\n\t0x981E, 0xE8B6, 0x9820, 0xE8BB, 0x9821, 0xBE65, 0x9824, 0xC05B,\t0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, 0xE8BA, 0x9829, 0xE8B9,\n\t0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, 0x9830, 0xC055,\t0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, 0xC056,\n\t0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A,\t0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4,\n\t0x9849, 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342,\t0x984E, 0xC345, 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9,\n\t0x9852, 0xF1AA, 0x9853, 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440,\t0x9859, 0xF3A8, 0x985B, 0xC441, 0x985C, 0xF3A7, 0x985D, 0xF3A9,\n\t0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, 0xF54E, 0x9862, 0xF54F,\t0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, 0x9867, 0xC555,\n\t0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, 0xC5E3,\t0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE,\n\t0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1,\t0x98AD, 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4,\n\t0x98B2, 0xE8BE, 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB,\t0x98BA, 0xC347, 0x98BB, 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC,\n\t0x98BE, 0xF3AE, 0x98BF, 0xF3AB, 0x98C0, 0xF675, 0x98C1, 0xF552,\t0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, 0xF674, 0x98C9, 0xF673,\n\t0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, 0x98DF, 0xADB9,\t0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, 0xB6B8,\n\t0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD,\t0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2,\n\t0x98F9, 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1,\t0x98FE, 0xB9A2, 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5,\n\t0x9905, 0xBBE6, 0x9907, 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8,\t0x990A, 0xBE69, 0x990C, 0xBBE7, 0x9910, 0xC05C, 0x9911, 0xE8C1,\n\t0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, 0xE8C2, 0x9915, 0xE8C5,\t0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, 0x991A, 0xC061,\n\t0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, 0xC060,\t0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D,\n\t0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D,\t0x992D, 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54,\n\t0x9931, 0xEF53, 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD,\t0x993A, 0xF1AE, 0x993C, 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348,\n\t0x993F, 0xC349, 0x9941, 0xF1AC, 0x9943, 0xF3B1, 0x9945, 0xC443,\t0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, 0xC444, 0x994B, 0xF558,\n\t0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, 0x9951, 0xC4C8,\t0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, 0xC5B9,\n\t0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556,\t0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959,\n\t0x9961, 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55,\t0x9999, 0xADBB, 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60,\n\t0x99A1, 0xEF57, 0x99A3, 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2,\t0x99A7, 0xF3B3, 0x99A8, 0xC4C9, 0x99AB, 0xF9B2, 0x99AC, 0xB0A8,\n\t0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, 0xE0E4, 0x99B0, 0xE0E6,\t0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, 0x99B4, 0xB9A5,\n\t0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, 0xE4D5,\t0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3,\n\t0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1,\t0x99CD, 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E,\n\t0x99D1, 0xBE71, 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA,\t0x99D5, 0xBE72, 0x99D6, 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE,\n\t0x99D9, 0xBE74, 0x99DB, 0xBE70, 0x99DC, 0xE8C6, 0x99DD, 0xBE6D,\t0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, 0xEC66, 0x99E4, 0xEC64,\n\t0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, 0x99EA, 0xEC67,\t0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, 0xEC65,\n\t0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B,\t0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F,\n\t0x99FC, 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240,\t0x9A01, 0xC1FE, 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3,\n\t0x9A05, 0xF1B6, 0x9A06, 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1,\t0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D,\n\t0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, 0xF3C0, 0x9A15, 0xF3B5,\t0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, 0x9A1B, 0xF3B9,\n\t0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, 0xF3BB,\t0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6,\n\t0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA,\t0x9A2C, 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB,\n\t0x9A31, 0xF55C, 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD,\t0x9A36, 0xF55F, 0x9A37, 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678,\n\t0x9A3A, 0xF67E, 0x9A3D, 0xF679, 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1,\t0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, 0xF67C, 0x9A43, 0xC559,\n\t0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, 0x9A48, 0xF77D,\t0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, 0xC5BB,\n\t0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2,\t0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852,\n\t0x9A57, 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6,\t0x9A5E, 0xF8D3, 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A,\n\t0x9A64, 0xF9B3, 0x9A65, 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5,\t0x9A68, 0xF9C3, 0x9A69, 0xF9C2, 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD,\n\t0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, 0xE0E8, 0x9AAF, 0xBBEA,\t0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, 0x9AB4, 0xEC6C,\n\t0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, 0xEC6D,\t0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9,\n\t0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564,\t0x9ACA, 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4,\n\t0x9AD1, 0xC5EA, 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9,\t0x9AD5, 0xF8D4, 0x9AD6, 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA,\n\t0x9ADF, 0xD449, 0x9AE1, 0xB9A6, 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC,\t0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, 0xE8D3, 0x9AED, 0xC068,\n\t0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, 0x9AF2, 0xE8D6,\t0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, 0xEC70,\n\t0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66,\t0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC,\n\t0x9B05, 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3,\t0x9B0B, 0xF3C2, 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4,\n\t0x9B10, 0xF567, 0x9B11, 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3,\t0x9B16, 0xF6A6, 0x9B17, 0xF6A4, 0x9B18, 0xF6A5, 0x9B19, 0xF7A5,\n\t0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, 0xF855, 0x9B20, 0xF856,\t0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, 0x9B25, 0xB0AB,\n\t0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, 0xF7A6,\t0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC,\n\t0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7,\t0x9B3B, 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE,\n\t0x9B41, 0xBBED, 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A,\t0x9B45, 0xBE79, 0x9B46, 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0,\n\t0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, 0x9B4D, 0xC353, 0x9B4E, 0xC352,\t0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, 0xF6A8, 0x9B54, 0xC55D,\n\t0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, 0x9B59, 0xF8D5,\t0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, 0xE4DF,\n\t0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA,\t0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0,\n\t0x9B71, 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE,\t0x9B77, 0xBE7B, 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76,\n\t0x9B7D, 0xECA1, 0x9B7E, 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79,\t0x9B85, 0xEC74, 0x9B86, 0xEF72, 0x9B87, 0xEC75, 0x9B88, 0xECA2,\n\t0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, 0xEC7B, 0x9B93, 0xEC7A,\t0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, 0x9B9E, 0xEF6C,\n\t0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, 0xEF71,\t0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243,\n\t0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75,\t0x9BB5, 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD,\n\t0x9BBD, 0xF1CE, 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7,\t0x9BC3, 0xF1C5, 0x9BC4, 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3,\n\t0x9BC8, 0xC357, 0x9BC9, 0xC355, 0x9BCA, 0xC354, 0x9BD3, 0xF1CA,\t0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, 0xC44A, 0x9BD7, 0xF3D0,\n\t0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, 0x9BDC, 0xF3D2,\t0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, 0xF3CD,\n\t0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449,\t0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1,\n\t0x9BF0, 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356,\t0x9C05, 0xF56D, 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B,\n\t0x9C09, 0xF576, 0x9C0B, 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572,\t0x9C12, 0xF56E, 0x9C13, 0xC4CE, 0x9C14, 0xF575, 0x9C17, 0xF574,\n\t0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, 0xF6B1, 0x9C23, 0xF6AD,\t0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, 0x9C29, 0xF6AF,\n\t0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, 0xC5BF,\t0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6,\n\t0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1,\t0x9C3D, 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570,\n\t0x9C41, 0xF7B0, 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB,\t0x9C49, 0xC5BE, 0x9C4A, 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F,\n\t0x9C4D, 0xF85B, 0x9C4E, 0xF860, 0x9C50, 0xF859, 0x9C52, 0xF857,\t0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, 0xC5ED, 0x9C57, 0xC5EC,\n\t0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, 0x9C5F, 0xC64D,\t0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, 0xF8D8,\n\t0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B,\t0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A,\n\t0x9C77, 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE,\t0x9CE5, 0xB3BE, 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7,\n\t0x9CEA, 0xE0EB, 0x9CED, 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3,\t0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0,\n\t0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, 0xE8E5, 0x9CFB, 0xE8EC,\t0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, 0x9D00, 0xE8EA,\n\t0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, 0xBE7D,\t0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC,\n\t0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4,\t0x9D18, 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9,\n\t0x9D1E, 0xECA6, 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB,\t0x9D23, 0xC06C, 0x9D25, 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E,\n\t0x9D29, 0xECA8, 0x9D2D, 0xEFA9, 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B,\t0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, 0xEF76, 0x9D36, 0xEF79,\n\t0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, 0x9D3D, 0xEFA7,\t0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, 0xEF77,\n\t0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2,\t0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359,\n\t0x9D52, 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6,\t0x9D57, 0xF1D8, 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD,\n\t0x9D5B, 0xF1D3, 0x9D5C, 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB,\t0x9D60, 0xC35B, 0x9D61, 0xC44D, 0x9D67, 0xEF78, 0x9D68, 0xF3F1,\n\t0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, 0xF3E4, 0x9D6C, 0xC450,\t0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, 0x9D72, 0xC44E,\n\t0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, 0xF3D8,\t0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3,\n\t0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC,\t0x9D84, 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0,\n\t0x9D88, 0xF3DC, 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1,\t0x9D8C, 0xF3E2, 0x9D90, 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2,\n\t0x9D96, 0xF5AE, 0x9D97, 0xF5A5, 0x9D98, 0xF57C, 0x9D99, 0xF578,\t0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, 0xF5A3, 0x9D9D, 0xF57A,\n\t0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, 0x9DA1, 0xF5A6,\t0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, 0xF5AF,\n\t0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4,\t0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3,\n\t0x9DB2, 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD,\t0x9DB6, 0xF6B3, 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF,\n\t0x9DBA, 0xF6C0, 0x9DBB, 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9,\t0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, 0x9DC2, 0xC563, 0x9DC3, 0xF6BB,\n\t0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, 0xF6C2, 0x9DCA, 0xF6B7,\t0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, 0x9DCE, 0xF6BE,\n\t0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, 0xF7B8,\t0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3,\n\t0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7,\t0x9DDC, 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF,\n\t0x9DE1, 0xF869, 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867,\t0x9DE5, 0xC5EE, 0x9DE6, 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0,\n\t0x9DEB, 0xF865, 0x9DEC, 0xF86F, 0x9DED, 0xF873, 0x9DEE, 0xF86A,\t0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, 0xF86C, 0x9DF3, 0xF871,\n\t0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, 0x9DF7, 0xF862,\t0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, 0xF861,\n\t0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2,\t0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7,\n\t0x9E05, 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4,\t0x9E0B, 0xF95D, 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F,\n\t0x9E11, 0xF962, 0x9E12, 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B,\t0x9E15, 0xF9B7, 0x9E17, 0xF9B8, 0x9E19, 0xF9C5, 0x9E1A, 0xC678,\n\t0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, 0xC67D, 0x9E75, 0xB3BF,\t0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, 0x9E7D, 0xC651,\n\t0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, 0xE8F0,\t0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB,\n\t0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC,\t0x9E8E, 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453,\n\t0x9E94, 0xF3F2, 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3,\t0x9E9B, 0xF5B2, 0x9E9C, 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF,\n\t0x9EA0, 0xF8E8, 0x9EA1, 0xF963, 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1,\t0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, 0xECB3, 0x9EAE, 0xECB2,\n\t0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, 0x9EB6, 0xF7C7,\t0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, 0xBEA3,\n\t0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE,\t0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248,\n\t0x9ED0, 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072,\t0x9ED5, 0xECB4, 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF,\n\t0x9EDB, 0xC24C, 0x9EDC, 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249,\t0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4,\n\t0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, 0xC4D2, 0x9EEB, 0xF6CB,\t0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, 0x9EF0, 0xF7C8,\n\t0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, 0xF964,\t0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6,\n\t0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1,\t0x9F00, 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652,\n\t0x9F09, 0xF965, 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2,\t0x9F10, 0xE8F3, 0x9F12, 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D,\n\t0x9F16, 0xF1E3, 0x9F18, 0xF6CF, 0x9F19, 0xC567, 0x9F1A, 0xF6D0,\t0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, 0xF8E9, 0x9F20, 0xB9AB,\n\t0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, 0x9F25, 0xF1E4,\t0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, 0xF1E5,\n\t0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3,\t0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA,\n\t0x9F34, 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B,\t0x9F38, 0xF87A, 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D,\n\t0x9F40, 0xF3F7, 0x9F41, 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D,\t0x9F46, 0xF8EA, 0x9F47, 0xF966, 0x9F48, 0xF9B9, 0x9F49, 0xF9D4,\n\t0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, 0xF1E9, 0x9F4D, 0xF3F9,\t0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, 0x9F54, 0xEFB5,\n\t0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, 0xF3FC,\t0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD,\n\t0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6,\t0x9F63, 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569,\n\t0x9F67, 0xC56A, 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5,\t0x9F6E, 0xF8A3, 0x9F6F, 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1,\n\t0x9F72, 0xC654, 0x9F74, 0xF8EB, 0x9F75, 0xF8EC, 0x9F76, 0xF8ED,\t0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, 0xF96A, 0x9F7A, 0xF969,\n\t0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, 0x9F90, 0xC365,\t0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, 0xF7CE,\n\t0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF,\t0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A,\n\t0xFE31, 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F,\t0xFE36, 0xA160, 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167,\n\t0xFE3A, 0xA168, 0xFE3B, 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F,\t0xFE3E, 0xA170, 0xFE3F, 0xA173, 0xFE40, 0xA174, 0xFE41, 0xA177,\n\t0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, 0xA17C, 0xFE49, 0xA1C6,\t0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, 0xFE4D, 0xA1C8,\n\t0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, 0xA14E,\t0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153,\n\t0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1,\t0xFE5C, 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC,\n\t0xFE60, 0xA1CD, 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF,\t0xFE64, 0xA1E0, 0xFE65, 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242,\n\t0xFE69, 0xA24C, 0xFE6A, 0xA24D, 0xFE6B, 0xA24E, 0xFF01, 0xA149,\t0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, 0xA248, 0xFF06, 0xA1AE,\n\t0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, 0xFF0B, 0xA1CF,\t0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, 0xA1FE,\n\t0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2,\t0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6,\n\t0xFF18, 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146,\t0xFF1C, 0xA1D5, 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148,\n\t0xFF20, 0xA249, 0xFF21, 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1,\t0xFF24, 0xA2D2, 0xFF25, 0xA2D3, 0xFF26, 0xA2D4, 0xFF27, 0xA2D5,\n\t0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, 0xA2D8, 0xFF2B, 0xA2D9,\t0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, 0xFF2F, 0xA2DD,\n\t0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, 0xA2E1,\t0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5,\n\t0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240,\t0xFF3F, 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB,\n\t0xFF44, 0xA2EC, 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF,\t0xFF48, 0xA2F0, 0xFF49, 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3,\n\t0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7,\t0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, 0xA2FA, 0xFF53, 0xA2FB,\n\t0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, 0xFF57, 0xA340,\t0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, 0xA161,\n\t0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246,\t0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0\n};\n\nstatic const WCHAR oem2uni950[] = {\t/* Big5 --> Unicode pairs */\n\t0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002,\t0xA144, 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A,\n\t0xA148, 0xFF1F, 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026,\t0xA14C, 0x2025, 0xA14D, 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52,\n\t0xA150, 0x00B7, 0xA151, 0xFE54, 0xA152, 0xFE55, 0xA153, 0xFE56,\t0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, 0x2013, 0xA157, 0xFE31,\n\t0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, 0xA15B, 0xFE34,\t0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, 0xFE35,\n\t0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37,\t0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39,\n\t0xA168, 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B,\t0xA16C, 0xFE3C, 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D,\n\t0xA170, 0xFE3E, 0xA171, 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F,\t0xA174, 0xFE40, 0xA175, 0x300C, 0xA176, 0x300D, 0xA177, 0xFE41,\n\t0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, 0x300F, 0xA17B, 0xFE43,\t0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, 0xA1A1, 0xFE5B,\n\t0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, 0x2018,\t0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D,\n\t0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03,\t0xA1AE, 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7,\n\t0xA1B2, 0x3003, 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3,\t0xA1B6, 0x25B2, 0xA1B7, 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605,\n\t0xA1BA, 0x25C7, 0xA1BB, 0x25C6, 0xA1BC, 0x25A1, 0xA1BD, 0x25A0,\t0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, 0x32A3, 0xA1C1, 0x2105,\n\t0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, 0xA1C5, 0x02CD,\t0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, 0xFE4E,\n\t0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60,\t0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7,\n\t0xA1D2, 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C,\t0xA1D6, 0xFF1E, 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267,\n\t0xA1DA, 0x2260, 0xA1DB, 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261,\t0xA1DE, 0xFE62, 0xA1DF, 0xFE63, 0xA1E0, 0xFE64, 0xA1E1, 0xFE65,\n\t0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, 0x2229, 0xA1E5, 0x222A,\t0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, 0xA1E9, 0x22BF,\n\t0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, 0x222E,\t0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642,\n\t0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193,\t0xA1F6, 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197,\n\t0xA1FA, 0x2199, 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223,\t0xA1FE, 0xFF0F, 0xA240, 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68,\n\t0xA243, 0xFF04, 0xA244, 0xFFE5, 0xA245, 0x3012, 0xA246, 0xFFE0,\t0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, 0xFF20, 0xA24A, 0x2103,\n\t0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, 0xA24E, 0xFE6B,\t0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, 0x339E,\n\t0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F,\t0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B,\n\t0xA25B, 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163,\t0xA25F, 0x55E7, 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581,\n\t0xA263, 0x2582, 0xA264, 0x2583, 0xA265, 0x2584, 0xA266, 0x2585,\t0xA267, 0x2586, 0xA268, 0x2587, 0xA269, 0x2588, 0xA26A, 0x258F,\n\t0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, 0x258C, 0xA26E, 0x258B,\t0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, 0xA272, 0x2534,\n\t0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, 0x2594,\t0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C,\n\t0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D,\t0xA2A1, 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550,\n\t0xA2A5, 0x255E, 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2,\t0xA2A9, 0x25E3, 0xA2AA, 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571,\n\t0xA2AD, 0x2572, 0xA2AE, 0x2573, 0xA2AF, 0xFF10, 0xA2B0, 0xFF11,\t0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, 0xFF14, 0xA2B4, 0xFF15,\n\t0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, 0xA2B8, 0xFF19,\t0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, 0x2163,\n\t0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167,\t0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022,\n\t0xA2C5, 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026,\t0xA2C9, 0x3027, 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341,\n\t0xA2CD, 0x5344, 0xA2CE, 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22,\t0xA2D1, 0xFF23, 0xA2D2, 0xFF24, 0xA2D3, 0xFF25, 0xA2D4, 0xFF26,\n\t0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, 0xFF29, 0xA2D8, 0xFF2A,\t0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, 0xA2DC, 0xFF2E,\n\t0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, 0xFF32,\t0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36,\n\t0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A,\t0xA2E9, 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44,\n\t0xA2ED, 0xFF45, 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48,\t0xA2F1, 0xFF49, 0xA2F2, 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C,\n\t0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50,\t0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, 0xFF53, 0xA2FC, 0xFF54,\n\t0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, 0xA341, 0xFF58,\t0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, 0x0392,\n\t0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396,\t0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A,\n\t0xA34E, 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E,\t0xA352, 0x039F, 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3,\n\t0xA356, 0x03A4, 0xA357, 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7,\t0xA35A, 0x03A8, 0xA35B, 0x03A9, 0xA35C, 0x03B1, 0xA35D, 0x03B2,\n\t0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, 0x03B5, 0xA361, 0x03B6,\t0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, 0xA365, 0x03BA,\n\t0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, 0x03BE,\t0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3,\n\t0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7,\t0xA372, 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106,\n\t0xA376, 0x3107, 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A,\t0xA37A, 0x310B, 0xA37B, 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E,\n\t0xA37E, 0x310F, 0xA3A1, 0x3110, 0xA3A2, 0x3111, 0xA3A3, 0x3112,\t0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, 0x3115, 0xA3A7, 0x3116,\n\t0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, 0xA3AB, 0x311A,\t0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, 0x311E,\n\t0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122,\t0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126,\n\t0xA3B8, 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9,\t0xA3BC, 0x02C9, 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB,\n\t0xA3E1, 0x20AC, 0xA440, 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01,\t0xA443, 0x4E03, 0xA444, 0x4E43, 0xA445, 0x4E5D, 0xA446, 0x4E86,\n\t0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, 0x513F, 0xA44A, 0x5165,\t0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, 0xA44E, 0x5201,\n\t0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, 0x535C,\t0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08,\n\t0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1,\t0xA45B, 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E,\n\t0xA45F, 0x4E8E, 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203,\t0xA463, 0x52FA, 0xA464, 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3,\n\t0xA467, 0x571F, 0xA468, 0x58EB, 0xA469, 0x5915, 0xA46A, 0x5927,\t0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, 0x5B51, 0xA46E, 0x5B53,\n\t0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, 0xA472, 0x5C38,\t0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, 0x5DF1,\n\t0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72,\t0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D,\n\t0xA4A1, 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D,\t0xA4A5, 0x4E30, 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39,\n\t0xA4A9, 0x4E88, 0xA4AA, 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92,\t0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0,\n\t0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, 0x4EC7, 0xA4B4, 0x4ECD,\t0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, 0xA4B8, 0x5143,\n\t0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, 0x516E,\t0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206,\n\t0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE,\t0xA4C5, 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348,\n\t0xA4C9, 0x5347, 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384,\t0xA4CD, 0x53CB, 0xA4CE, 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC,\n\t0xA4D1, 0x5929, 0xA4D2, 0x592B, 0xA4D3, 0x592A, 0xA4D4, 0x592D,\t0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, 0x5C24, 0xA4D8, 0x5C3A,\n\t0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, 0xA4DC, 0x5EFF,\t0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, 0x6208,\n\t0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F,\t0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9,\n\t0xA4E9, 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728,\t0xA4ED, 0x6B20, 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB,\n\t0xA4F1, 0x6BD4, 0xA4F2, 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34,\t0xA4F5, 0x706B, 0xA4F6, 0x722A, 0xA4F7, 0x7236, 0xA4F8, 0x723B,\n\t0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, 0x725B, 0xA4FC, 0x72AC,\t0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, 0xA541, 0x4E15,\n\t0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, 0x4E4D,\t0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8,\n\t0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7,\t0xA54E, 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE,\n\t0xA552, 0x5145, 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A,\t0xA556, 0x51AC, 0xA557, 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8,\n\t0xA55A, 0x520A, 0xA55B, 0x52A0, 0xA55C, 0x529F, 0xA55D, 0x5305,\t0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, 0x531D, 0xA561, 0x4EDF,\n\t0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, 0xA565, 0x5360,\t0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, 0x53EF,\n\t0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE,\t0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8,\n\t0xA572, 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA,\t0xA576, 0x53F2, 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5,\n\t0xA57A, 0x53ED, 0xA57B, 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA,\t0xA57E, 0x5916, 0xA5A1, 0x592E, 0xA5A2, 0x5931, 0xA5A3, 0x5974,\n\t0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, 0x5B83, 0xA5A7, 0x5C3C,\t0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, 0xA5AB, 0x5E02,\n\t0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, 0x5F01,\t0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A,\n\t0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251,\t0xA5B8, 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C,\n\t0xA5BC, 0x672A, 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63,\t0xA5C0, 0x6BCD, 0xA5C1, 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38,\n\t0xA5C4, 0x6C41, 0xA5C5, 0x6C40, 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF,\t0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, 0x74DC, 0xA5CB, 0x74E6,\n\t0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, 0xA5CF, 0x7529,\t0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, 0x7533,\n\t0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF,\t0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3,\n\t0xA5DC, 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB,\t0xA5E0, 0x4E1E, 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53,\n\t0xA5E4, 0x4E69, 0xA5E5, 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6,\t0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, 0xA5EA, 0x4F09, 0xA5EB, 0x4F19,\n\t0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, 0x4F0D, 0xA5EF, 0x4F10,\t0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, 0xA5F3, 0x4EF6,\n\t0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, 0x4EFD,\t0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147,\n\t0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171,\t0xA641, 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211,\n\t0xA645, 0x5212, 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3,\t0xA649, 0x5308, 0xA64A, 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370,\n\t0xA64D, 0x5371, 0xA64E, 0x5409, 0xA64F, 0x540F, 0xA650, 0x540C,\t0xA651, 0x540A, 0xA652, 0x5410, 0xA653, 0x5401, 0xA654, 0x540B,\n\t0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, 0xA658, 0x5408,\t0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, 0x5412,\n\t0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733,\t0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C,\n\t0xA665, 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A,\t0xA669, 0x5937, 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978,\n\t0xA66D, 0x5983, 0xA66E, 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982,\t0xA671, 0x5981, 0xA672, 0x5B57, 0xA673, 0x5B58, 0xA674, 0x5B87,\n\t0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, 0x5B89, 0xA678, 0x5BFA,\t0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, 0xA67C, 0x5E06,\n\t0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, 0x5F1B,\t0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C,\n\t0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B,\t0xA6AB, 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8,\n\t0xA6AF, 0x65EC, 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3,\t0xA6B3, 0x6709, 0xA6B4, 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731,\n\t0xA6B7, 0x6735, 0xA6B8, 0x6B21, 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B,\t0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, 0x6C57, 0xA6BE, 0x6C59,\n\t0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, 0xA6C2, 0x6C55,\t0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, 0x6C4E,\n\t0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E,\t0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36,\n\t0xA6CF, 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003,\t0xA6D3, 0x800C, 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F,\n\t0xA6D7, 0x8089, 0xA6D8, 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3,\t0xA6DB, 0x81EA, 0xA6DC, 0x81F3, 0xA6DD, 0x81FC, 0xA6DE, 0x820C,\n\t0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, 0x826E, 0xA6E2, 0x8272,\t0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, 0xA6E6, 0x884C,\n\t0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, 0x4E32,\t0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47,\n\t0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B,\t0xA6F3, 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51,\n\t0xA6F7, 0x4F3D, 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43,\t0xA6FB, 0x4F54, 0xA6FC, 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63,\n\t0xA740, 0x4F5C, 0xA741, 0x4F60, 0xA742, 0x4F2F, 0xA743, 0x4F4E,\t0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, 0x4F5D, 0xA747, 0x4F48,\n\t0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, 0xA74B, 0x514D,\t0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, 0x5225,\n\t0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228,\t0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC,\n\t0xA758, 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D,\t0xA75C, 0x542D, 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426,\n\t0xA760, 0x544E, 0xA761, 0x5427, 0xA762, 0x5446, 0xA763, 0x5443,\t0xA764, 0x5433, 0xA765, 0x5448, 0xA766, 0x5442, 0xA767, 0x541B,\n\t0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, 0x5439, 0xA76B, 0x543B,\t0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, 0xA76F, 0x5436,\n\t0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, 0x5431,\t0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA,\n\t0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A,\t0xA77C, 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747,\n\t0xA7A2, 0x574E, 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F,\t0xA7A6, 0x573B, 0xA7A7, 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D,\n\t0xA7AA, 0x5992, 0xA7AB, 0x59A8, 0xA7AC, 0x599E, 0xA7AD, 0x59A3,\t0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, 0x598D, 0xA7B1, 0x59A4,\n\t0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, 0xA7B5, 0x5B5D,\t0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, 0x5B8C,\n\t0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40,\t0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90,\n\t0xA7C2, 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB,\t0xA7C6, 0x5E0C, 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A,\n\t0xA7CA, 0x5EF7, 0xA7CB, 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64,\t0xA7CE, 0x5F62, 0xA7CF, 0x5F77, 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8,\n\t0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, 0x5FCD, 0xA7D5, 0x5FF1,\t0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, 0xA7D9, 0x6212,\n\t0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, 0x6296,\t0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D,\n\t0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279,\t0xA7E6, 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298,\n\t0xA7EA, 0x626E, 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291,\t0xA7EE, 0x6286, 0xA7EF, 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538,\n\t0xA7F2, 0x65F1, 0xA7F3, 0x66F4, 0xA7F4, 0x675F, 0xA7F5, 0x674E,\t0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, 0x6751, 0xA7F9, 0x675C,\n\t0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, 0xA7FD, 0x6746,\t0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, 0x6B65,\n\t0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99,\t0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85,\n\t0xA84B, 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90,\t0xA84F, 0x6C70, 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96,\n\t0xA853, 0x6C92, 0xA854, 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72,\t0xA857, 0x6C7E, 0xA858, 0x6C74, 0xA859, 0x6C86, 0xA85A, 0x6C76,\n\t0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, 0x6C98, 0xA85E, 0x6C82,\t0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, 0xA862, 0x7078,\n\t0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, 0x72C4,\t0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B,\n\t0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF,\t0xA86F, 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF,\n\t0xA873, 0x7A76, 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096,\t0xA877, 0x8093, 0xA878, 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B,\n\t0xA87B, 0x809A, 0xA87C, 0x80B2, 0xA87D, 0x826F, 0xA87E, 0x8292,\t0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, 0x898B, 0xA8A4, 0x89D2,\n\t0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, 0xA8A8, 0x8C55,\t0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, 0x8DB3,\n\t0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0,\t0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4,\n\t0xA8B5, 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA,\t0xA8B9, 0x90A6, 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6,\n\t0xA8BD, 0x91CC, 0xA8BE, 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631,\t0xA8C1, 0x962A, 0xA8C2, 0x962C, 0xA8C3, 0x4E26, 0xA8C4, 0x4E56,\n\t0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, 0x4E9B, 0xA8C8, 0x4E9E,\t0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, 0xA8CC, 0x4F9D,\n\t0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, 0x4F6C,\t0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83,\n\t0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69,\t0xA8D9, 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F,\n\t0xA8DD, 0x4F91, 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152,\t0xA8E1, 0x5155, 0xA8E2, 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176,\n\t0xA8E5, 0x5178, 0xA8E6, 0x51BD, 0xA8E7, 0x51FD, 0xA8E8, 0x523B,\t0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, 0x523A, 0xA8EC, 0x5230,\n\t0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, 0xA8F0, 0x52BE,\t0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, 0x5353,\n\t0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378,\t0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7,\n\t0xA8FD, 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478,\t0xA942, 0x5495, 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477,\n\t0xA946, 0x5484, 0xA947, 0x5492, 0xA948, 0x5486, 0xA949, 0x547C,\t0xA94A, 0x5490, 0xA94B, 0x5471, 0xA94C, 0x5476, 0xA94D, 0x548C,\n\t0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, 0x5468, 0xA951, 0x548B,\t0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, 0xA955, 0x5783,\n\t0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, 0x5761,\t0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C,\n\t0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944,\t0xA962, 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4,\n\t0xA966, 0x59B9, 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6,\t0xA96A, 0x59D0, 0xA96B, 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3,\n\t0xA96E, 0x59CA, 0xA96F, 0x59AF, 0xA970, 0x59B3, 0xA971, 0x59D2,\t0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, 0x5B64, 0xA975, 0x5B63,\n\t0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, 0xA979, 0x5B9C,\t0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, 0x5C48,\n\t0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1,\t0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1,\n\t0xA9A8, 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16,\t0xA9AC, 0x5E15, 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78,\n\t0xA9B0, 0x5E9A, 0xA9B1, 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95,\t0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, 0xA9B6, 0x5F26, 0xA9B7, 0x5F27,\n\t0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, 0x5F81, 0xA9BB, 0x5F7F,\t0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, 0xA9BF, 0x5FFD,\n\t0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, 0x6014,\t0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A,\n\t0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029,\t0xA9CC, 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215,\n\t0xA9D0, 0x623F, 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F,\t0xA9D4, 0x62C9, 0xA9D5, 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF,\n\t0xA9D8, 0x62C2, 0xA9D9, 0x62B9, 0xA9DA, 0x62D2, 0xA9DB, 0x62DB,\t0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, 0x62D4, 0xA9DF, 0x62CB,\n\t0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, 0xA9E3, 0x62BC,\t0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, 0x62CD,\n\t0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8,\t0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC,\n\t0xA9F0, 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC,\t0xA9F4, 0x65FA, 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C,\n\t0xA9F8, 0x6606, 0xA9F9, 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600,\t0xA9FC, 0x660F, 0xA9FD, 0x6615, 0xA9FE, 0x660A, 0xAA40, 0x6607,\n\t0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, 0x676D, 0xAA44, 0x678B,\t0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, 0xAA48, 0x6773,\n\t0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, 0x6797,\t0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789,\n\t0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A,\t0xAA55, 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772,\n\t0xAA59, 0x6B23, 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F,\t0xAA5D, 0x6C13, 0xAA5E, 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8,\n\t0xAA61, 0x6CF3, 0xAA62, 0x6CB1, 0xAA63, 0x6CCC, 0xAA64, 0x6CE5,\t0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, 0x6CBE, 0xAA68, 0x6CBC,\n\t0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, 0xAA6C, 0x6CD3,\t0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, 0x6CC1,\n\t0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1,\t0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB,\n\t0xAA79, 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC,\t0xAA7D, 0x6CD6, 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E,\n\t0xAAA3, 0x7092, 0xAAA4, 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C,\t0xAAA7, 0x722D, 0xAAA8, 0x7238, 0xAAA9, 0x7248, 0xAAAA, 0x7267,\n\t0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, 0x72CE, 0xAAAE, 0x72D9,\t0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, 0xAAB2, 0x73A8,\n\t0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, 0x753D,\t0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684,\n\t0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5,\t0xAABF, 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941,\n\t0xAAC3, 0x79C9, 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79,\t0xAAC7, 0x7AFA, 0xAAC8, 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C,\n\t0xAACB, 0x7F8B, 0xAACC, 0x8005, 0xAACD, 0x80BA, 0xAACE, 0x80A5,\t0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, 0x80A1, 0xAAD2, 0x80AB,\n\t0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, 0xAAD6, 0x80AF,\t0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, 0x82B3,\n\t0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD,\t0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC,\n\t0xAAE3, 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3,\t0xAAE7, 0x82B0, 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E,\n\t0xAAEB, 0x8671, 0xAAEC, 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB,\t0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5,\n\t0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, 0x90B6, 0xAAF6, 0x91C7,\t0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, 0xAAFA, 0x961C,\n\t0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, 0x9644,\t0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752,\n\t0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE,\t0xAB48, 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF,\n\t0xAB4C, 0x4FE0, 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD,\t0xAB50, 0x4FC3, 0xAB51, 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF,\n\t0xAB54, 0x4FCA, 0xAB55, 0x4FD7, 0xAB56, 0x4FAE, 0xAB57, 0x4FD0,\t0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, 0x4FDA, 0xAB5B, 0x4FCE,\n\t0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, 0xAB5F, 0x5192,\t0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, 0x5243,\n\t0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B,\t0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3,\n\t0xAB6C, 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B,\t0xAB70, 0x539A, 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0,\n\t0xAB74, 0x54A8, 0xAB75, 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8,\t0xAB78, 0x54A6, 0xAB79, 0x54B3, 0xAB7A, 0x54C7, 0xAB7B, 0x54C2,\n\t0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, 0x54C1, 0xABA1, 0x54C4,\t0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, 0xABA5, 0x54B1,\n\t0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, 0x54BF,\t0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0,\n\t0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE,\t0xABB2, 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F,\n\t0xABB6, 0x594E, 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8,\t0xABBA, 0x59FF, 0xABBB, 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03,\n\t0xABBE, 0x59E5, 0xABBF, 0x59EA, 0xABC0, 0x59DA, 0xABC1, 0x59E6,\t0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, 0x5B69, 0xABC5, 0x5BA3,\n\t0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, 0xABC9, 0x5BA5,\t0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, 0x5C4D,\n\t0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7,\t0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D,\n\t0xABD6, 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08,\t0xABDA, 0x5F2D, 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85,\n\t0xABDE, 0x5F8A, 0xABDF, 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C,\t0xABE2, 0x5F89, 0xABE3, 0x6012, 0xABE4, 0x601D, 0xABE5, 0x6020,\n\t0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, 0x6028, 0xABE9, 0x604D,\t0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, 0xABED, 0x6046,\n\t0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, 0x606A,\t0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316,\n\t0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301,\t0xABFA, 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1,\n\t0xABFE, 0x62F7, 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE,\t0xAC43, 0x62F4, 0xAC44, 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F,\n\t0xAC47, 0x6545, 0xAC48, 0x65AB, 0xAC49, 0x65BD, 0xAC4A, 0x65E2,\t0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, 0x6620, 0xAC4E, 0x6627,\n\t0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, 0xAC52, 0x6631,\t0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, 0x67D3,\n\t0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC,\t0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9,\n\t0xAC5F, 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4,\t0xAC63, 0x67DA, 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF,\n\t0xAC67, 0x67DE, 0xAC68, 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9,\t0xAC6B, 0x67E2, 0xAC6C, 0x67DD, 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A,\n\t0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, 0x6BB5, 0xAC72, 0x6BD2,\t0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, 0xAC76, 0x6D0B,\n\t0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, 0x6D25,\t0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17,\n\t0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36,\t0xACA5, 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27,\n\t0xACA9, 0x6D38, 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35,\t0xACAD, 0x6D0E, 0xACAE, 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA,\n\t0xACB1, 0x70B3, 0xACB2, 0x70AC, 0xACB3, 0x70AF, 0xACB4, 0x70AD,\t0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, 0x70A4, 0xACB8, 0x7230,\n\t0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, 0xACBC, 0x72E9,\t0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, 0x73CA,\n\t0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0,\t0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F,\n\t0xACC9, 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB,\t0xACCD, 0x75A4, 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3,\n\t0xACD1, 0x7678, 0xACD2, 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688,\t0xACD5, 0x76C8, 0xACD6, 0x76C6, 0xACD7, 0x76C3, 0xACD8, 0x76C5,\n\t0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, 0x76F8, 0xACDC, 0x7709,\t0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, 0xACE0, 0x7707,\n\t0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, 0x780C,\t0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948,\n\t0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1,\t0xACED, 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81,\n\t0xACF1, 0x7AFF, 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02,\t0xACF5, 0x7D05, 0xACF6, 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07,\n\t0xACF9, 0x7D04, 0xACFA, 0x7D06, 0xACFB, 0x7F38, 0xACFC, 0x7F8E,\t0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, 0x8010, 0xAD41, 0x800D,\n\t0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, 0xAD45, 0x80E5,\t0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, 0x80CC,\n\t0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE,\t0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222,\n\t0xAD52, 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3,\t0xAD56, 0x82DB, 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5,\n\t0xAD5A, 0x8302, 0xAD5B, 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7,\t0xAD5E, 0x82F1, 0xAD5F, 0x8301, 0xAD60, 0x82DC, 0xAD61, 0x82D4,\n\t0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, 0x82D3, 0xAD65, 0x82DF,\t0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, 0xAD69, 0x8679,\n\t0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, 0x886B,\t0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02,\n\t0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74,\t0xAD76, 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC,\n\t0xAD7A, 0x8FF0, 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA,\t0xAD7E, 0x8FE5, 0xADA1, 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4,\n\t0xADA4, 0x8FE8, 0xADA5, 0x90CA, 0xADA6, 0x90CE, 0xADA7, 0x90C1,\t0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, 0x914A, 0xADAB, 0x91CD,\n\t0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, 0xADAF, 0x964C,\t0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, 0x97CB,\n\t0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8,\t0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999,\n\t0xADBC, 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D,\t0xADC0, 0x5023, 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025,\n\t0xADC4, 0x4FF8, 0xADC5, 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006,\t0xADC8, 0x503C, 0xADC9, 0x501F, 0xADCA, 0x501A, 0xADCB, 0x5012,\n\t0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, 0x5000, 0xADCF, 0x5014,\t0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, 0xADD3, 0x500B,\n\t0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, 0x4FEE,\t0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B,\n\t0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5,\t0xADE0, 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6,\n\t0xADE4, 0x51CB, 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254,\t0xADE8, 0x525B, 0xADE9, 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F,\n\t0xADEC, 0x539F, 0xADED, 0x539D, 0xADEE, 0x53DF, 0xADEF, 0x54E8,\t0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, 0x5537, 0xADF3, 0x54FC,\n\t0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, 0xADF7, 0x54FA,\t0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, 0x54E1,\n\t0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6,\t0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F,\n\t0xAE45, 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4,\t0xAE49, 0x57CB, 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F,\n\t0xAE4D, 0x5957, 0xAE4E, 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11,\t0xAE51, 0x5A18, 0xAE52, 0x5A1C, 0xAE53, 0x5A1F, 0xAE54, 0x5A1B,\n\t0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, 0x5A20, 0xAE58, 0x5A23,\t0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, 0xAE5C, 0x5A09,\n\t0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, 0x5BB3,\t0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5,\n\t0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51,\t0xAE69, 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD,\n\t0xAE6D, 0x5CFB, 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0,\t0xAE71, 0x5CF6, 0xAE72, 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE,\n\t0xAE75, 0x5E2D, 0xAE76, 0x5E2B, 0xAE77, 0x5EAB, 0xAE78, 0x5EAD,\t0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, 0x5F92, 0xAE7C, 0x5F91,\n\t0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, 0xAEA2, 0x6065,\t0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, 0x6069,\n\t0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A,\t0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085,\n\t0xAEAF, 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308,\t0xAEB3, 0x62FF, 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F,\n\t0xAEB7, 0x6355, 0xAEB8, 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F,\t0xAEBB, 0x6349, 0xAEBC, 0x633A, 0xAEBD, 0x6350, 0xAEBE, 0x633D,\n\t0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, 0x6328, 0xAEC2, 0x634D,\t0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, 0xAEC6, 0x6599,\n\t0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, 0x6649,\t0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C,\n\t0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714,\t0xAED3, 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838,\n\t0xAED7, 0x6848, 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839,\t0xAEDB, 0x6842, 0xAEDC, 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3,\n\t0xAEDF, 0x6817, 0xAEE0, 0x684C, 0xAEE1, 0x6851, 0xAEE2, 0x683D,\t0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, 0x6840, 0xAEE6, 0x683C,\n\t0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, 0xAEEA, 0x6813,\t0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, 0x6B89,\n\t0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28,\t0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A,\n\t0xAEF7, 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66,\t0xAEFB, 0x6D78, 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93,\n\t0xAF40, 0x6D6C, 0xAF41, 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A,\t0xAF44, 0x6D74, 0xAF45, 0x6D69, 0xAF46, 0x6D8C, 0xAF47, 0x6D8A,\n\t0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, 0x6D65, 0xAF4B, 0x6D94,\t0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, 0xAF4F, 0x70D9,\n\t0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, 0x7279,\t0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8,\n\t0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409,\t0xAF5C, 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE,\n\t0xAF60, 0x7554, 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A,\t0xAF64, 0x7559, 0xAF65, 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7,\n\t0xAF68, 0x75B2, 0xAF69, 0x75B3, 0xAF6A, 0x75BD, 0xAF6B, 0x75BC,\t0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, 0x75B8, 0xAF6F, 0x768B,\n\t0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, 0xAF73, 0x76CE,\t0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, 0x7728,\n\t0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838,\t0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825,\n\t0xAFA2, 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832,\t0xAFA6, 0x7955, 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F,\n\t0xAFAA, 0x7956, 0xAFAB, 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957,\t0xAFAE, 0x795A, 0xAFAF, 0x79E4, 0xAFB0, 0x79E3, 0xAFB1, 0x79E7,\n\t0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, 0x79E9, 0xAFB5, 0x79D8,\t0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, 0xAFB9, 0x7B06,\n\t0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, 0x7D17,\t0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22,\n\t0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A,\t0xAFC6, 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B,\n\t0xAFCA, 0x7F3A, 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5,\t0xAFCE, 0x7FC1, 0xAFCF, 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015,\n\t0xAFD2, 0x8019, 0xAFD3, 0x8017, 0xAFD4, 0x803D, 0xAFD5, 0x803F,\t0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, 0x80F0, 0xAFD9, 0x8105,\n\t0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, 0xAFDD, 0x80F8,\t0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, 0x810A,\n\t0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC,\t0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B,\n\t0xAFEA, 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B,\t0xAFEE, 0x8352, 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338,\n\t0xAFF2, 0x8350, 0xAFF3, 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334,\t0xAFF6, 0x834F, 0xAFF7, 0x8332, 0xAFF8, 0x8339, 0xAFF9, 0x8336,\n\t0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, 0x8331, 0xAFFD, 0x8328,\t0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, 0xB042, 0x86AA,\n\t0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, 0x868C,\t0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877,\n\t0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879,\t0xB04F, 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C,\n\t0xB053, 0x8A15, 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13,\t0xB057, 0x8A16, 0xB058, 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48,\n\t0xB05B, 0x8C7A, 0xB05C, 0x8C79, 0xB05D, 0x8CA1, 0xB05E, 0x8CA2,\t0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, 0x8ED2, 0xB062, 0x8ED4,\n\t0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, 0xB066, 0x9006,\t0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, 0x8FF4,\n\t0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8,\t0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2,\n\t0xB073, 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8,\t0xB077, 0x91DD, 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9,\n\t0xB07B, 0x9583, 0xB07C, 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661,\t0xB0A1, 0x965B, 0xB0A2, 0x965D, 0xB0A3, 0x9664, 0xB0A4, 0x9658,\n\t0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, 0x98E2, 0xB0A8, 0x99AC,\t0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, 0xB0AC, 0x9B32,\n\t0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, 0x507D,\t0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C,\n\t0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076,\t0xB0B9, 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074,\n\t0xB0BD, 0x5077, 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F,\t0xB0C1, 0x506D, 0xB0C2, 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0,\n\t0xB0C5, 0x526A, 0xB0C6, 0x526F, 0xB0C7, 0x52D2, 0xB0C8, 0x52D9,\t0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, 0x5310, 0xB0CC, 0x530F,\n\t0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, 0xB0D0, 0x533E,\t0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, 0x556A,\n\t0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561,\t0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556,\n\t0xB0DD, 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564,\t0xB0E1, 0x5538, 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C,\n\t0xB0E5, 0x5563, 0xB0E6, 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557,\t0xB0E9, 0x5708, 0xB0EA, 0x570B, 0xB0EB, 0x5709, 0xB0EC, 0x57DF,\n\t0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, 0x5806, 0xB0F0, 0x57E0,\t0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, 0xB0F4, 0x5835,\n\t0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, 0x5962,\t0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66,\n\t0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62,\t0xB142, 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70,\n\t0xB146, 0x5BC7, 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2,\t0xB14A, 0x5BBF, 0xB14B, 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08,\n\t0xB14E, 0x5C07, 0xB14F, 0x5C60, 0xB150, 0x5C5C, 0xB151, 0x5C5D,\t0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, 0x5D0E, 0xB155, 0x5D1B,\n\t0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, 0xB159, 0x5D29,\t0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, 0x5D27,\n\t0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36,\t0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8,\n\t0xB166, 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35,\t0xB16A, 0x5F37, 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69,\n\t0xB16E, 0x5F6B, 0xB16F, 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E,\t0xB172, 0x5F98, 0xB173, 0x5FA1, 0xB174, 0x5FA0, 0xB175, 0x5F9C,\n\t0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, 0x6089, 0xB179, 0x60A0,\t0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, 0xB17D, 0x60E6,\n\t0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, 0x60B5,\t0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5,\n\t0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA,\t0xB1AC, 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248,\n\t0xB1B0, 0x63A0, 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396,\t0xB1B4, 0x63A2, 0xB1B5, 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367,\n\t0xB1B8, 0x6398, 0xB1B9, 0x63AA, 0xB1BA, 0x6371, 0xB1BB, 0x63A9,\t0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, 0x639B, 0xB1BF, 0x636B,\n\t0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, 0xB1C3, 0x6399,\t0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, 0x638F,\n\t0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368,\t0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551,\n\t0xB1D0, 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F,\t0xB1D4, 0x6558, 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C,\n\t0xB1D8, 0x659B, 0xB1D9, 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB,\t0xB1DC, 0x65CC, 0xB1DD, 0x65CE, 0xB1DE, 0x665D, 0xB1DF, 0x665A,\n\t0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, 0x6666, 0xB1E3, 0x665E,\t0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, 0xB1E7, 0x6881,\n\t0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, 0x68B5,\t0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7,\n\t0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4,\t0xB1F4, 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894,\n\t0xB1F8, 0x689D, 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1,\t0xB1FC, 0x6882, 0xB1FD, 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB,\n\t0xB241, 0x6BEC, 0xB242, 0x6C2B, 0xB243, 0x6D8E, 0xB244, 0x6DBC,\t0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, 0x6DB2, 0xB248, 0x6DE1,\n\t0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, 0xB24C, 0x6DFA,\t0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, 0x6DAF,\n\t0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9,\t0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5,\n\t0xB259, 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA,\t0xB25D, 0x6DEB, 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1,\n\t0xB261, 0x6DEE, 0xB262, 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4,\t0xB265, 0x6DAA, 0xB266, 0x6DEC, 0xB267, 0x6DBF, 0xB268, 0x6DE6,\n\t0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, 0x710A, 0xB26C, 0x70FD,\t0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, 0xB270, 0x7281,\n\t0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, 0x7313,\t0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A,\n\t0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D,\t0xB27D, 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C,\n\t0xB2A3, 0x7522, 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562,\t0xB2A7, 0x7570, 0xB2A8, 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5,\n\t0xB2AB, 0x75B5, 0xB2AC, 0x75CA, 0xB2AD, 0x75CD, 0xB2AE, 0x768E,\t0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, 0x76DB, 0xB2B2, 0x7737,\n\t0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, 0xB2B6, 0x7738,\t0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, 0x784E,\n\t0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB,\t0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28,\n\t0xB2C3, 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19,\t0xB2C7, 0x7B1E, 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97,\n\t0xB2CB, 0x7C95, 0xB2CC, 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71,\t0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40,\n\t0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, 0x7D44, 0xB2D6, 0x7D2F,\t0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, 0xB2DA, 0x7F3D,\n\t0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, 0x7FCE,\t0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046,\n\t0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B,\t0xB2E7, 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202,\n\t0xB2EB, 0x8235, 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239,\t0xB2EF, 0x838E, 0xB2F0, 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378,\n\t0xB2F3, 0x83A2, 0xB2F4, 0x8396, 0xB2F5, 0x83BD, 0xB2F6, 0x83AB,\t0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, 0x8393, 0xB2FA, 0x8389,\n\t0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, 0xB2FE, 0x837C,\t0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, 0x5F6A,\n\t0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4,\t0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1,\n\t0xB34C, 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E,\t0xB350, 0x8888, 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896,\n\t0xB354, 0x888D, 0xB355, 0x888B, 0xB356, 0x8993, 0xB357, 0x898F,\t0xB358, 0x8A2A, 0xB359, 0x8A1D, 0xB35A, 0x8A23, 0xB35B, 0x8A25,\n\t0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, 0x8A1F, 0xB35F, 0x8A1B,\t0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, 0xB363, 0x8CA9,\n\t0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, 0x8CAA,\t0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE,\n\t0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019,\t0xB370, 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023,\n\t0xB374, 0x901F, 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015,\t0xB378, 0x901E, 0xB379, 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022,\n\t0xB37C, 0x9016, 0xB37D, 0x901B, 0xB37E, 0x9014, 0xB3A1, 0x90E8,\t0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, 0x9157, 0xB3A5, 0x91CE,\n\t0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, 0xB3A9, 0x91E7,\t0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, 0x966A,\n\t0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670,\t0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C,\n\t0xB3B6, 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0,\t0xB3BA, 0x7ADF, 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A,\n\t0xB3BE, 0x9CE5, 0xB3BF, 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5,\t0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, 0xB3C4, 0x508D, 0xB3C5, 0x5085,\n\t0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, 0x5080, 0xB3C9, 0x5096,\t0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, 0xB3CD, 0x51F1,\n\t0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, 0x5269,\t0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A,\n\t0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7,\t0xB3DA, 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598,\n\t0xB3DE, 0x5582, 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594,\t0xB3E2, 0x5587, 0xB3E3, 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3,\n\t0xB3E6, 0x55AE, 0xB3E7, 0x559F, 0xB3E8, 0x553E, 0xB3E9, 0x55B2,\t0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, 0x55AC, 0xB3ED, 0x55B1,\n\t0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, 0xB3F1, 0x5599,\t0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, 0x5834,\n\t0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821,\t0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA,\n\t0xB3FE, 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F,\t0xB443, 0x5A92, 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73,\n\t0xB447, 0x5B71, 0xB448, 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3,\t0xB44B, 0x5BD0, 0xB44C, 0x5C0A, 0xB44D, 0x5C0B, 0xB44E, 0x5C31,\n\t0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, 0x5D34, 0xB452, 0x5D47,\t0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, 0xB456, 0x5E40,\n\t0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, 0x5EC1,\t0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D,\n\t0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1,\t0xB463, 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0,\n\t0xB467, 0x611C, 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115,\t0xB46B, 0x60F0, 0xB46C, 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168,\n\t0xB46F, 0x60F1, 0xB470, 0x610E, 0xB471, 0x60F6, 0xB472, 0x6109,\t0xB473, 0x6100, 0xB474, 0x6112, 0xB475, 0x621F, 0xB476, 0x6249,\n\t0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, 0xB47A, 0x63C0,\t0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, 0x63CD,\n\t0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1,\t0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376,\n\t0xB4A9, 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452,\t0xB4AD, 0x63DA, 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566,\n\t0xB4B1, 0x6562, 0xB4B2, 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590,\t0xB4B5, 0x65AF, 0xB4B6, 0x666E, 0xB4B7, 0x6670, 0xB4B8, 0x6674,\n\t0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, 0x6691, 0xB4BC, 0x667A,\t0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, 0xB4C0, 0x66FF,\n\t0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, 0x68D5,\t0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905,\n\t0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7,\t0xB4CD, 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3,\n\t0xB4D1, 0x68CB, 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912,\t0xB4D5, 0x690E, 0xB4D6, 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E,\n\t0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D,\t0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, 0x6BBC, 0xB4E0, 0x6BEF,\n\t0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, 0xB4E4, 0x6E2F,\t0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, 0x6E32,\n\t0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25,\t0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58,\n\t0xB4F1, 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D,\t0xB4F5, 0x6E26, 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D,\n\t0xB4F9, 0x6E3A, 0xB4FA, 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D,\t0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, 0xB540, 0x6E89, 0xB541, 0x6E19,\n\t0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, 0x6E44, 0xB545, 0x6E72,\t0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, 0xB549, 0x711A,\n\t0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, 0x7136,\t0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284,\n\t0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334,\t0xB556, 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433,\n\t0xB55A, 0x7422, 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436,\t0xB55E, 0x7434, 0xB55F, 0x742F, 0xB560, 0x741B, 0xB561, 0x7426,\n\t0xB562, 0x7428, 0xB563, 0x7525, 0xB564, 0x7526, 0xB565, 0x756B,\t0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, 0x75DB, 0xB569, 0x75E3,\n\t0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, 0xB56D, 0x75E0,\t0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, 0x7693,\n\t0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED,\t0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D,\n\t0xB57A, 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00,\t0xB57E, 0x7A98, 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5,\n\t0xB5A4, 0x7AE3, 0xB5A5, 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46,\t0xB5A8, 0x7B50, 0xB5A9, 0x7B52, 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D,\n\t0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, 0x7B51, 0xB5AF, 0x7C9F,\t0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, 0xB5B3, 0x7D68,\n\t0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, 0x7D72,\t0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70,\n\t0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5,\t0xB5C0, 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155,\n\t0xB5C4, 0x8154, 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E,\t0xB5C8, 0x8139, 0xB5C9, 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C,\n\t0xB5CC, 0x8153, 0xB5CD, 0x8174, 0xB5CE, 0x8212, 0xB5CF, 0x821C,\t0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, 0x83F8, 0xB5D3, 0x840D,\n\t0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, 0xB5D7, 0x83C1,\t0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, 0x8457,\n\t0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC,\t0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438,\n\t0xB5E4, 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407,\t0xB5E8, 0x83D4, 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF,\n\t0xB5EC, 0x86D9, 0xB5ED, 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB,\t0xB5F0, 0x86E4, 0xB5F1, 0x86D0, 0xB5F2, 0x86DE, 0xB5F3, 0x8857,\n\t0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, 0x88B1, 0xB5F7, 0x8983,\t0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, 0xB5FB, 0x8A55,\n\t0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, 0x8A54,\t0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34,\n\t0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61,\t0xB649, 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3,\n\t0xB64D, 0x8CBD, 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0,\t0xB651, 0x8CB4, 0xB652, 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF,\n\t0xB655, 0x8CB8, 0xB656, 0x8D8A, 0xB657, 0x8D85, 0xB658, 0x8D81,\t0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, 0x8DCB, 0xB65C, 0x8DDA,\n\t0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, 0xB660, 0x8DC6,\t0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, 0x8F9C,\n\t0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038,\t0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5,\n\t0xB66D, 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165,\t0xB671, 0x91CF, 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223,\n\t0xB675, 0x9209, 0xB676, 0x921E, 0xB677, 0x920D, 0xB678, 0x9210,\t0xB679, 0x9207, 0xB67A, 0x9211, 0xB67B, 0x9594, 0xB67C, 0x958F,\n\t0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, 0x9593, 0xB6A2, 0x9592,\t0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, 0xB6A6, 0x968B,\n\t0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, 0x968D,\t0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5,\n\t0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF,\t0xB6B3, 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806,\n\t0xB6B7, 0x9808, 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF,\t0xB6BB, 0x98E9, 0xB6BC, 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE,\n\t0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1,\t0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, 0x50B5, 0xB6C6, 0x50B2,\n\t0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, 0xB6CA, 0x50AC,\t0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, 0x50C7,\n\t0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF,\t0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3,\n\t0xB6D7, 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3,\t0xB6DB, 0x55E6, 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7,\n\t0xB6DF, 0x55D1, 0xB6E0, 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF,\t0xB6E3, 0x55DA, 0xB6E4, 0x55E1, 0xB6E5, 0x55C5, 0xB6E6, 0x55C6,\n\t0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, 0x5712, 0xB6EA, 0x5713,\t0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, 0xB6EE, 0x5857,\n\t0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, 0x584C,\t0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852,\n\t0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9,\t0xB6FB, 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC,\n\t0xB740, 0x5AB3, 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69,\t0xB744, 0x5D6F, 0xB745, 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9,\n\t0xB748, 0x5EC8, 0xB749, 0x5F12, 0xB74A, 0x5F59, 0xB74B, 0x5FAC,\t0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, 0x610F, 0xB74F, 0x6148,\n\t0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, 0xB753, 0x60F9,\t0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, 0x614C,\n\t0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134,\t0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137,\n\t0xB760, 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E,\t0xB764, 0x641E, 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D,\n\t0xB768, 0x642C, 0xB769, 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414,\t0xB76C, 0x640D, 0xB76D, 0x6436, 0xB76E, 0x6416, 0xB76F, 0x6417,\n\t0xB770, 0x6406, 0xB771, 0x656C, 0xB772, 0x659F, 0xB773, 0x65B0,\t0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, 0xB777, 0x6688,\n\t0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, 0x668D,\t0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A,\n\t0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975,\t0xB7A6, 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968,\n\t0xB7AA, 0x696B, 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979,\t0xB7AE, 0x6986, 0xB7AF, 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B,\n\t0xB7B2, 0x6B47, 0xB7B3, 0x6B72, 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF,\t0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, 0x6EA2, 0xB7B9, 0x6EAF,\n\t0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, 0xB7BD, 0x6E90,\t0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, 0x6EA5,\n\t0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB,\t0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4,\n\t0xB7CA, 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4,\t0xB7CE, 0x714E, 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164,\n\t0xB7D2, 0x7149, 0xB7D3, 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C,\t0xB7D6, 0x7166, 0xB7D7, 0x714C, 0xB7D8, 0x7165, 0xB7D9, 0x715E,\n\t0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, 0x7156, 0xB7DD, 0x723A,\t0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, 0xB7E1, 0x733F,\n\t0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, 0x7455,\t0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F,\n\t0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576,\t0xB7EE, 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601,\n\t0xB7F2, 0x75F2, 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF,\t0xB7F6, 0x75F4, 0xB7F7, 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF,\n\t0xB7FA, 0x775B, 0xB7FB, 0x776B, 0xB7FC, 0x7766, 0xB7FD, 0x775E,\t0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, 0x776A, 0xB842, 0x776C,\n\t0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, 0xB846, 0x7762,\t0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, 0x7897,\n\t0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C,\t0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A,\n\t0xB853, 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD,\t0xB857, 0x7A1C, 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14,\n\t0xB85B, 0x7A1F, 0xB85C, 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0,\t0xB85F, 0x7B77, 0xB860, 0x7BC0, 0xB861, 0x7B60, 0xB862, 0x7B6E,\n\t0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, 0x7CB3, 0xB866, 0x7CB5,\t0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, 0xB86A, 0x7D81,\n\t0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, 0x7F69,\t0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8,\n\t0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086,\t0xB877, 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178,\n\t0xB87B, 0x8165, 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B,\t0xB8A1, 0x8179, 0xB8A2, 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205,\n\t0xB8A5, 0x8247, 0xB8A6, 0x8482, 0xB8A7, 0x8477, 0xB8A8, 0x843D,\t0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, 0x8466, 0xB8AC, 0x846B,\n\t0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, 0xB8B0, 0x843C,\t0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, 0x8469,\n\t0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C,\t0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708,\n\t0xB8BD, 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB,\t0xB8C1, 0x8702, 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A,\n\t0xB8C5, 0x8859, 0xB8C6, 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9,\t0xB8C9, 0x88DC, 0xB8CA, 0x88D8, 0xB8CB, 0x88DD, 0xB8CC, 0x88E1,\n\t0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, 0x88D2, 0xB8D0, 0x899C,\t0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, 0xB8D4, 0x8A73,\n\t0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, 0x8A87,\t0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71,\n\t0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E,\t0xB8E1, 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E,\n\t0xB8E5, 0x8A68, 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89,\t0xB8E9, 0x8CCA, 0xB8EA, 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4,\n\t0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5,\t0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, 0x8DE8, 0xB8F4, 0x8DEF,\n\t0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, 0xB8F8, 0x8DE4,\t0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, 0x8F09,\n\t0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2,\t0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042,\n\t0xB946, 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050,\t0xB94A, 0x9047, 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D,\n\t0xB94E, 0x9051, 0xB94F, 0x903E, 0xB950, 0x9041, 0xB951, 0x9112,\t0xB952, 0x9117, 0xB953, 0x916C, 0xB954, 0x916A, 0xB955, 0x9169,\n\t0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, 0x9257, 0xB959, 0x9238,\t0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, 0xB95D, 0x925B,\n\t0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, 0x9234,\t0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239,\n\t0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698,\t0xB96A, 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB,\n\t0xB96E, 0x96C9, 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB,\t0xB972, 0x96F9, 0xB973, 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774,\n\t0xB976, 0x9776, 0xB977, 0x9810, 0xB978, 0x9811, 0xB979, 0x9813,\t0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, 0x980C, 0xB97D, 0x98FC,\n\t0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, 0xB9A3, 0x99B3,\t0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, 0x9CE9,\n\t0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20,\t0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6,\n\t0xB9B0, 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF,\t0xB9B4, 0x50D1, 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9,\n\t0xB9B8, 0x5162, 0xB9B9, 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282,\t0xB9BC, 0x5331, 0xB9BD, 0x53AD, 0xB9BE, 0x55FE, 0xB9BF, 0x5600,\n\t0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, 0x55FD, 0xB9C3, 0x5614,\t0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, 0xB9C7, 0x560E,\n\t0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, 0x5608,\t0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716,\n\t0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893,\t0xB9D4, 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D,\n\t0xB9D8, 0x58FD, 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924,\t0xB9DC, 0x596A, 0xB9DD, 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6,\n\t0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8,\t0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, 0x5BDE, 0xB9E7, 0x5BE7,\n\t0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, 0xB9EB, 0x5BE8,\t0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, 0x5C0D,\n\t0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B,\t0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54,\n\t0xB9F8, 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46,\t0xB9FC, 0x5F70, 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F,\n\t0xBA41, 0x614B, 0xBA42, 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163,\t0xBA45, 0x615F, 0xBA46, 0x615A, 0xBA47, 0x6158, 0xBA48, 0x6175,\n\t0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, 0x6458, 0xBA4C, 0x6454,\t0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, 0xBA50, 0x647A,\n\t0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, 0x646D,\t0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7,\n\t0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D,\t0xBA5D, 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1,\n\t0xBA61, 0x69AE, 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B,\t0xBA65, 0x69B7, 0xBA66, 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4,\n\t0xBA69, 0x69D0, 0xBA6A, 0x69CD, 0xBA6B, 0x69AD, 0xBA6C, 0x69CC,\t0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, 0x69A3, 0xBA70, 0x6B49,\n\t0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, 0xBA74, 0x6F14,\t0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, 0x6F29,\n\t0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F,\t0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF,\n\t0xBAA3, 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32,\t0xBAA7, 0x6F23, 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F,\n\t0xBAAB, 0x6F88, 0xBAAC, 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01,\t0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, 0xBAB1, 0x6EF7, 0xBAB2, 0x7194,\n\t0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, 0x718A, 0xBAB6, 0x7184,\t0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, 0xBABA, 0x7296,\n\t0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, 0x7463,\t0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504,\n\t0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B,\t0xBAC7, 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3,\n\t0xBACB, 0x7784, 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761,\t0xBACF, 0x78C1, 0xBAD0, 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3,\n\t0xBAD3, 0x78A9, 0xBAD4, 0x78A3, 0xBAD5, 0x798E, 0xBAD6, 0x798F,\t0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, 0x7A31, 0xBADA, 0x7AAA,\n\t0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, 0xBADE, 0x7BA1,\t0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, 0x7B97,\n\t0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8,\t0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD,\n\t0xBAEB, 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C,\t0xBAEF, 0x7DBD, 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA,\n\t0xBAF3, 0x7DB4, 0xBAF4, 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA,\t0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8,\n\t0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, 0x7DC7, 0xBAFE, 0x7DAC,\t0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, 0xBB43, 0x7FDF,\n\t0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, 0x8150,\t0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A,\n\t0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA,\t0xBB50, 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B,\n\t0xBB54, 0x84C9, 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4,\t0xBB58, 0x8499, 0xBB59, 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C,\n\t0xBB5C, 0x84CB, 0xBB5D, 0x84B8, 0xBB5E, 0x84C0, 0xBB5F, 0x84D3,\t0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, 0x84D1, 0xBB63, 0x84CA,\n\t0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, 0xBB67, 0x8722,\t0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, 0x8755,\n\t0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902,\t0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD,\n\t0xBB74, 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6,\t0xBB78, 0x8A8C, 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D,\n\t0xBB7C, 0x8AA1, 0xBB7D, 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA,\t0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, 0xBBA4, 0x8A98, 0xBBA5, 0x8A91,\n\t0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, 0x8C6A, 0xBBA9, 0x8C8D,\t0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, 0xBBAD, 0x8CD2,\n\t0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, 0x8DFC,\t0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13,\n\t0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C,\t0xBBBA, 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062,\n\t0xBBBE, 0x905D, 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118,\t0xBBC2, 0x911E, 0xBBC3, 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177,\n\t0xBBC6, 0x9174, 0xBBC7, 0x9278, 0xBBC8, 0x9280, 0xBBC9, 0x9285,\t0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, 0x927B, 0xBBCD, 0x9293,\n\t0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, 0xBBD1, 0x9291,\t0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, 0x95A3,\n\t0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C,\t0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700,\n\t0xBBDE, 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817,\t0xBBE2, 0x9818, 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903,\n\t0xBBE6, 0x9905, 0xBBE7, 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1,\t0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, 0xBBEC, 0x9AE6, 0xBBED, 0x9B41,\n\t0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, 0x9CF6, 0xBBF1, 0x9CF3,\t0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, 0xBBF5, 0x5104,\n\t0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, 0x50F9,\t0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105,\n\t0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289,\t0xBC43, 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2,\n\t0xBC47, 0x562E, 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632,\t0xBC4B, 0x563F, 0xBC4C, 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653,\n\t0xBC4F, 0x564E, 0xBC50, 0x5657, 0xBC51, 0x5674, 0xBC52, 0x5636,\t0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, 0x5880, 0xBC56, 0x589F,\n\t0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, 0xBC5A, 0x58AE,\t0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, 0x5B09,\n\t0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C,\t0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9,\n\t0xBC67, 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D,\t0xBC6B, 0x5D94, 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61,\n\t0xBC6F, 0x5EE2, 0xBC70, 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD,\t0xBC73, 0x5EE3, 0xBC74, 0x5EE0, 0xBC75, 0x5F48, 0xBC76, 0x5F71,\n\t0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, 0x6176, 0xBC7A, 0x6167,\t0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, 0xBC7E, 0x6182,\n\t0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, 0x617E,\t0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E,\n\t0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194,\t0xBCAD, 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F,\n\t0xBCB1, 0x6479, 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488,\t0xBCB5, 0x6490, 0xBCB6, 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493,\n\t0xBCB9, 0x6495, 0xBCBA, 0x64A9, 0xBCBB, 0x6492, 0xBCBC, 0x64AE,\t0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, 0x649A, 0xBCC0, 0x64AC,\n\t0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, 0xBCC4, 0x6575,\t0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, 0x66AB,\n\t0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F,\t0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19,\n\t0xBCD1, 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A,\t0xBCD5, 0x69F3, 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED,\n\t0xBCD9, 0x6A11, 0xBCDA, 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4,\t0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C,\n\t0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, 0x6F66, 0xBCE4, 0x6F54,\t0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, 0xBCE8, 0x6F78,\n\t0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, 0x6F70,\t0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5,\n\t0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F,\t0xBCF5, 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256,\n\t0xBCF9, 0x729B, 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469,\t0xBCFD, 0x748B, 0xBCFE, 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480,\n\t0xBD42, 0x757F, 0xBD43, 0x7620, 0xBD44, 0x7629, 0xBD45, 0x761F,\t0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, 0x7621, 0xBD49, 0x7622,\n\t0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, 0xBD4D, 0x778E,\t0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, 0x778B,\n\t0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA,\t0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0,\n\t0xBD5A, 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D,\t0xBD5E, 0x7A37, 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE,\n\t0xBD62, 0x7BAD, 0xBD63, 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4,\t0xBD66, 0x7BC6, 0xBD67, 0x7BC7, 0xBD68, 0x7BC1, 0xBD69, 0x7BA0,\n\t0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, 0x7DE0, 0xBD6D, 0x7DF4,\t0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, 0xBD71, 0x7DEC,\n\t0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, 0x7DDA,\t0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9,\n\t0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77,\t0xBD7E, 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B,\n\t0xBDA4, 0x819C, 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A,\t0xBDA8, 0x8198, 0xBDA9, 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A,\n\t0xBDAC, 0x84EE, 0xBDAD, 0x852C, 0xBDAE, 0x852D, 0xBDAF, 0x8513,\t0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, 0x8521, 0xBDB3, 0x8514,\n\t0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, 0xBDB7, 0x8506,\t0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, 0x8760,\n\t0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759,\t0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B,\n\t0xBDC4, 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912,\t0xBDC8, 0x8913, 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC,\n\t0xBDCC, 0x8AD2, 0xBDCD, 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95,\t0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9,\n\t0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, 0x8AB0, 0xBDD7, 0x8AD6,\t0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, 0xBDDB, 0x8ADB,\n\t0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, 0x8CE0,\t0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC,\n\t0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC,\t0xBDE8, 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F,\n\t0xBDEC, 0x8DA3, 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D,\t0xBDF0, 0x8E22, 0xBDF1, 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F,\n\t0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D,\t0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, 0x8F29, 0xBDFB, 0x8F26,\n\t0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, 0xBE40, 0x8F25,\t0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, 0x906D,\n\t0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127,\t0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B,\n\t0xBE4D, 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7,\t0xBE51, 0x92EA, 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1,\n\t0xBE55, 0x92B3, 0xBE56, 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7,\t0xBE59, 0x92F0, 0xBE5A, 0x92B2, 0xBE5B, 0x95AD, 0xBE5C, 0x95B1,\n\t0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, 0x9707, 0xBE60, 0x9709,\t0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, 0xBE64, 0x978F,\n\t0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, 0x98B3,\t0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918,\n\t0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB,\t0xBE71, 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9,\n\t0xBE75, 0x9AB7, 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27,\t0xBE79, 0x9B45, 0xBE7A, 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F,\n\t0xBE7D, 0x9D06, 0xBE7E, 0x9D09, 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9,\t0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, 0x58A8, 0xBEA6, 0x9F52,\n\t0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, 0xBEAA, 0x5110,\t0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, 0x51DD,\n\t0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659,\t0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664,\n\t0xBEB7, 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665,\t0xBEBB, 0x5671, 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662,\n\t0xBEBF, 0x5676, 0xBEC0, 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7,\t0xBEC3, 0x58C5, 0xBEC4, 0x596E, 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34,\n\t0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, 0x5C0E, 0xBECA, 0x5F4A,\t0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, 0xBECE, 0x618A,\n\t0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, 0x61CA,\t0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1,\n\t0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA,\t0xBEDB, 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD,\n\t0xBEDF, 0x64BF, 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE,\t0xBEE3, 0x6574, 0xBEE4, 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9,\n\t0xBEE7, 0x66C4, 0xBEE8, 0x66C7, 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D,\t0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, 0x6A59, 0xBEEE, 0x6A6B,\n\t0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, 0xBEF2, 0x6A62,\t0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, 0x6A35,\n\t0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77,\t0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1,\n\t0xBF40, 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7,\t0xBF44, 0x6FB3, 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6,\n\t0xBF48, 0x6FA6, 0xBF49, 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE,\t0xBF4C, 0x71C9, 0xBF4D, 0x71D0, 0xBF4E, 0x71D2, 0xBF4F, 0x71C8,\n\t0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, 0x71CE, 0xBF53, 0x71D9,\t0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, 0xBF57, 0x7368,\n\t0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, 0x749F,\t0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D,\n\t0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7,\t0xBF64, 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F,\n\t0xBF68, 0x77A5, 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC,\t0xBF6C, 0x78E7, 0xBF6D, 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E,\n\t0xBF70, 0x7A46, 0xBF71, 0x7A4C, 0xBF72, 0x7A4B, 0xBF73, 0x7ABA,\t0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, 0x7BC9, 0xBF77, 0x7BE4,\n\t0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, 0xBF7B, 0x7BE6,\t0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, 0x7E11,\n\t0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E,\t0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79,\n\t0xBFAA, 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE,\t0xBFAE, 0x8028, 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8,\n\t0xBFB2, 0x81FB, 0xBFB3, 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259,\t0xBFB6, 0x854A, 0xBFB7, 0x8559, 0xBFB8, 0x8548, 0xBFB9, 0x8568,\n\t0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, 0x8549, 0xBFBD, 0x856D,\t0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, 0xBFC1, 0x879F,\n\t0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, 0x8861,\t0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B,\n\t0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6,\t0xBFCE, 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00,\n\t0xBFD2, 0x8ADC, 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE,\t0xBFD6, 0x8B01, 0xBFD7, 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED,\n\t0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B,\t0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, 0x8CF4, 0xBFE1, 0x8E44,\n\t0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, 0xBFE5, 0x8E39,\t0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, 0x8F38,\n\t0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075,\t0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C,\n\t0xBFF2, 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320,\t0xBFF6, 0x9336, 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F,\n\t0xBFFA, 0x9322, 0xBFFB, 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304,\t0xBFFE, 0x931A, 0xC040, 0x9310, 0xC041, 0x9326, 0xC042, 0x9321,\n\t0xC043, 0x9315, 0xC044, 0x932E, 0xC045, 0x9319, 0xC046, 0x95BB,\t0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, 0xC04A, 0x96D5,\n\t0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, 0x970D,\t0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C,\n\t0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838,\t0xC057, 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839,\n\t0xC05B, 0x9824, 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E,\t0xC05F, 0x991B, 0xC060, 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED,\n\t0xC063, 0x99E2, 0xC064, 0x99F1, 0xC065, 0x9AB8, 0xC066, 0x9ABC,\t0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, 0x9B28, 0xC06A, 0x9B91,\n\t0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, 0xC06E, 0x9D28,\t0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, 0x9ED4,\n\t0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F,\t0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E,\n\t0xC07B, 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687,\t0xC0A1, 0x568F, 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1,\n\t0xC0A5, 0x58CE, 0xC0A6, 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24,\t0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC,\n\t0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, 0x5DB8, 0xC0B0, 0x5E6B,\t0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, 0xC0B4, 0x61C2,\n\t0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, 0x6232,\t0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8,\n\t0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC,\t0xC0C1, 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582,\n\t0xC0C5, 0x6583, 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80,\t0xC0C9, 0x6A94, 0xC0CA, 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C,\n\t0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97,\t0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, 0x6B5C, 0xC0D4, 0x6BAE,\n\t0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, 0xC0D8, 0x6FF1,\t0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, 0x6FE4,\n\t0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC,\t0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE,\n\t0xC0E5, 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE,\t0xC0E9, 0x71E6, 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC,\n\t0xC0ED, 0x71F4, 0xC0EE, 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246,\t0xC0F1, 0x7370, 0xC0F2, 0x7372, 0xC0F3, 0x74A9, 0xC0F4, 0x74B0,\n\t0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, 0x7646, 0xC0F8, 0x7642,\t0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, 0xC0FC, 0x77AA,\n\t0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, 0x77AD,\t0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4,\n\t0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA,\t0xC14A, 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D,\n\t0xC14E, 0x7BFE, 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0,\t0xC152, 0x7CE0, 0xC153, 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2,\n\t0xC156, 0x7CDF, 0xC157, 0x7CD9, 0xC158, 0x7CDD, 0xC159, 0x7E2E,\t0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, 0x7E37, 0xC15D, 0x7E32,\n\t0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, 0xC161, 0x7E31,\t0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, 0x7E39,\n\t0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F,\t0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071,\n\t0xC16E, 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073,\t0xC172, 0x81C6, 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2,\n\t0xC176, 0x81C0, 0xC177, 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9,\t0xC17A, 0x81BE, 0xC17B, 0x81E8, 0xC17C, 0x8209, 0xC17D, 0x8271,\n\t0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, 0x857E, 0xC1A3, 0x859C,\t0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, 0xC1A7, 0x859B,\n\t0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, 0x8667,\t0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2,\n\t0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA,\t0xC1B4, 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936,\n\t0xC1B8, 0x8944, 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC,\t0xC1BC, 0x8B0E, 0xC1BD, 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B,\n\t0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04,\t0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, 0x8C3F, 0xC1C7, 0x8C73,\n\t0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, 0xC1CB, 0x8CF8,\t0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, 0x8E4B,\n\t0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E,\t0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F,\n\t0xC1D8, 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082,\t0xC1DC, 0x9080, 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E,\n\t0xC1E0, 0x919C, 0xC1E1, 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328,\t0xC1E4, 0x9375, 0xC1E5, 0x934A, 0xC1E6, 0x9365, 0xC1E7, 0x934B,\n\t0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, 0x936C, 0xC1EB, 0x935B,\t0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, 0xC1EF, 0x95CA,\n\t0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, 0x95C6,\t0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C,\n\t0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846,\t0xC1FC, 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF,\n\t0xC241, 0x9BAE, 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD,\t0xC245, 0x9D3B, 0xC246, 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF,\n\t0xC249, 0x9EDE, 0xC24A, 0x9EDC, 0xC24B, 0x9EDD, 0xC24C, 0x9EDB,\t0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, 0x53E2, 0xC250, 0x5695,\n\t0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, 0xC254, 0x5B38,\t0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, 0x64F4,\n\t0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA,\t0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC,\n\t0xC261, 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3,\t0xC265, 0x6ABB, 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE,\n\t0xC269, 0x6AAF, 0xC26A, 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF,\t0xC26D, 0x7009, 0xC26E, 0x700B, 0xC26F, 0x6FFE, 0xC270, 0x7006,\n\t0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, 0x700F, 0xC274, 0x71FB,\t0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, 0xC278, 0x7377,\n\t0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, 0x7515,\t0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD,\n\t0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E,\t0xC2A7, 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60,\n\t0xC2AB, 0x7AC4, 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27,\t0xC2AF, 0x7C2A, 0xC2B0, 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21,\n\t0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E,\t0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, 0x7E52, 0xC2BA, 0x7E59,\n\t0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, 0xC2BE, 0x8077,\t0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, 0x820A,\n\t0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0,\t0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9,\n\t0xC2CB, 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2,\t0xC2CF, 0x87E0, 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4,\n\t0xC2D3, 0x8B28, 0xC2D4, 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B,\t0xC2D7, 0x8C50, 0xC2D8, 0x8D05, 0xC2D9, 0x8E59, 0xC2DA, 0x8E63,\n\t0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, 0x8E5F, 0xC2DE, 0x8E55,\t0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, 0xC2E2, 0x9087,\n\t0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, 0x91AC,\t0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396,\n\t0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC,\t0xC2EF, 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397,\n\t0xC2F3, 0x95D4, 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5,\t0xC2F7, 0x96E2, 0xC2F8, 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB,\n\t0xC2FB, 0x96DE, 0xC2FC, 0x9724, 0xC2FD, 0x97A3, 0xC2FE, 0x97A6,\t0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, 0x984D, 0xC343, 0x984F,\n\t0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, 0xC347, 0x98BA,\t0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, 0x992E,\n\t0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03,\t0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D,\n\t0xC354, 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8,\t0xC358, 0x9BC0, 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60,\n\t0xC35C, 0x9EE0, 0xC35D, 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133,\t0xC360, 0x56A5, 0xC361, 0x58DE, 0xC362, 0x58DF, 0xC363, 0x58E2,\n\t0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, 0x5EEC, 0xC367, 0x61F2,\t0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, 0xC36B, 0x6500,\n\t0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, 0x6AE5,\t0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B,\n\t0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D,\t0xC378, 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D,\n\t0xC37C, 0x7258, 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A,\t0xC3A2, 0x74BD, 0xC3A3, 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587,\n\t0xC3A6, 0x7586, 0xC3A7, 0x765F, 0xC3A8, 0x7661, 0xC3A9, 0x77C7,\t0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, 0x7A6B, 0xC3AD, 0x7A69,\n\t0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, 0xC3B1, 0x7C3D,\t0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, 0x7E6D,\n\t0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85,\t0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8,\n\t0xC3BE, 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA,\t0xC3C2, 0x85D5, 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7,\n\t0xC3C6, 0x87FB, 0xC3C7, 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9,\t0xC3CA, 0x87FE, 0xC3CB, 0x8960, 0xC3CC, 0x895F, 0xC3CD, 0x8956,\n\t0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, 0x8B5C, 0xC3D1, 0x8B58,\t0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, 0xC3D5, 0x8B4F,\n\t0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, 0x8D0A,\t0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76,\n\t0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54,\t0xC3E2, 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B,\n\t0xC3E6, 0x91B1, 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1,\t0xC3EA, 0x93DF, 0xC3EB, 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC,\n\t0xC3EE, 0x93DD, 0xC3EF, 0x93D6, 0xC3F0, 0x93E2, 0xC3F1, 0x93CD,\t0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, 0x93D7, 0xC3F5, 0x93E8,\n\t0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, 0xC3F9, 0x972A,\t0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, 0x97FB,\n\t0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC,\t0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19,\n\t0xC447, 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6,\t0xC44B, 0x9BDB, 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72,\n\t0xC44F, 0x9D6A, 0xC450, 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97,\t0xC453, 0x9E93, 0xC454, 0x9EB4, 0xC455, 0x52F8, 0xC456, 0x56A8,\n\t0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, 0x56B4, 0xC45A, 0x56BC,\t0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, 0xC45E, 0x5B7D,\n\t0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, 0x61FA,\t0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6,\n\t0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030,\t0xC46B, 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF,\n\t0xC46F, 0x7662, 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A,\t0xC473, 0x792C, 0xC474, 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6,\n\t0xC477, 0x7C4C, 0xC478, 0x7C43, 0xC479, 0x7C4D, 0xC47A, 0x7CEF,\t0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, 0x7E7D, 0xC47E, 0x7E7C,\n\t0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, 0xC4A4, 0x81DA,\t0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, 0x8611,\n\t0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607,\t0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964,\n\t0xC4B1, 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C,\t0xC4B5, 0x8B66, 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B,\n\t0xC4B9, 0x8D0F, 0xC4BA, 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81,\t0xC4BD, 0x8E85, 0xC4BE, 0x8E82, 0xC4BF, 0x91B4, 0xC4C0, 0x91CB,\n\t0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, 0x93FD, 0xC4C4, 0x95E1,\t0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, 0xC4C8, 0x9951,\n\t0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, 0x9A37,\t0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79,\n\t0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F,\t0xC4D5, 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138,\n\t0xC4D9, 0x56C1, 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914,\t0xC4DD, 0x5C6C, 0xC4DE, 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE,\n\t0xC4E1, 0x651D, 0xC4E2, 0x651C, 0xC4E3, 0x6595, 0xC4E4, 0x66E9,\t0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, 0x6AFA, 0xC4E8, 0x6BB2,\n\t0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, 0xC4EC, 0x74D6,\t0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, 0x7C50,\n\t0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617,\t0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822,\n\t0xC4F9, 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C,\t0xC4FD, 0x89BD, 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D,\n\t0xC542, 0x8D13, 0xC543, 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B,\t0xC546, 0x8F5F, 0xC547, 0x8FAF, 0xC548, 0x91BA, 0xC549, 0x942E,\n\t0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, 0x943A, 0xC54D, 0x9438,\t0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, 0xC551, 0x9738,\n\t0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, 0x9867,\t0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43,\n\t0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54,\t0xC55E, 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF,\n\t0xC562, 0x9DB4, 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D,\t0xC566, 0x9EEF, 0xC567, 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66,\n\t0xC56A, 0x9F67, 0xC56B, 0x513C, 0xC56C, 0x513B, 0xC56D, 0x56C8,\t0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, 0x5B7F, 0xC571, 0x5DD4,\n\t0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, 0xC575, 0x6524,\t0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, 0x7058,\n\t0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E,\t0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F,\n\t0xC5A4, 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972,\t0xC5A8, 0x896F, 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16,\n\t0xC5AC, 0x8D17, 0xC5AD, 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61,\t0xC5B0, 0x9148, 0xC5B1, 0x9444, 0xC5B2, 0x9451, 0xC5B3, 0x9452,\n\t0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, 0x97C3, 0xC5B7, 0x97C1,\t0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, 0xC5BB, 0x9A4D,\n\t0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, 0x9C31,\t0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7,\n\t0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94,\t0xC5C8, 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523,\n\t0xC5CC, 0x652B, 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10,\t0xC5D0, 0x74DA, 0xC5D1, 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63,\n\t0xC5D4, 0x7C65, 0xC5D5, 0x7E93, 0xC5D6, 0x7E96, 0xC5D7, 0x7E94,\t0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, 0x863F, 0xC5DB, 0x8831,\n\t0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, 0xC5DF, 0x9463,\t0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, 0x986F,\n\t0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57,\t0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54,\n\t0xC5EC, 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F,\t0xC5F0, 0x9EF4, 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C,\n\t0xC5F4, 0x705E, 0xC5F5, 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7,\t0xC5F8, 0x7F50, 0xC5F9, 0x7F88, 0xC5FA, 0x8836, 0xC5FB, 0x8839,\n\t0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, 0x8B92, 0xC640, 0x8B96,\t0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, 0xC644, 0x946A,\n\t0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, 0x97C6,\t0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58,\n\t0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C,\t0xC651, 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72,\n\t0xC655, 0x5EF3, 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C,\t0xC659, 0x7C6E, 0xC65A, 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1,\n\t0xC65D, 0x91C1, 0xC65E, 0x9472, 0xC65F, 0x9470, 0xC660, 0x9871,\t0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, 0x9B23, 0xC664, 0x9ECC,\n\t0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, 0xC668, 0x9477,\t0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, 0x7E9C,\n\t0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D,\t0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78,\n\t0xC675, 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A,\t0xC679, 0x7228, 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B,\n\t0xC67D, 0x9E1E, 0xC67E, 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C,\t0xC942, 0x51F5, 0xC943, 0x531A, 0xC944, 0x5382, 0xC945, 0x4E07,\n\t0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, 0x4E8D, 0xC949, 0x56D7,\t0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, 0xC94D, 0x4E0F,\n\t0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, 0x4E93,\t0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198,\n\t0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720,\t0xC95A, 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF,\n\t0xC95E, 0x65E1, 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14,\t0xC962, 0x723F, 0xC963, 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8,\n\t0xC966, 0x4EDC, 0xC967, 0x4EE9, 0xC968, 0x4EE1, 0xC969, 0x4EDD,\t0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, 0x531C, 0xC96D, 0x534C,\n\t0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, 0xC971, 0x592F,\t0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, 0x5C3B,\n\t0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80,\t0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250,\n\t0xC97E, 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F,\t0xC9A4, 0x6C3B, 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A,\n\t0xC9A8, 0x79B8, 0xC9A9, 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E,\t0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14,\n\t0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, 0x4EF7, 0xC9B3, 0x4F08,\t0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, 0xC9B7, 0x4F22,\n\t0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, 0x4F12,\t0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210,\n\t0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D,\t0xC9C4, 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF,\n\t0xC9C8, 0x572E, 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C,\t0xC9CC, 0x5980, 0xC9CD, 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B,\n\t0xC9D0, 0x597E, 0xC9D1, 0x5977, 0xC9D2, 0x597F, 0xC9D3, 0x5B56,\t0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, 0x5C7C, 0xC9D7, 0x5C7A,\n\t0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, 0xC9DB, 0x5E75,\t0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, 0x5F74,\n\t0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C,\t0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266,\n\t0xC9E8, 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A,\t0xC9EC, 0x6265, 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E,\n\t0xC9F0, 0x6739, 0xC9F1, 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A,\t0xC9F4, 0x673F, 0xC9F5, 0x673C, 0xC9F6, 0x6733, 0xC9F7, 0x6C18,\n\t0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, 0x6C5C, 0xC9FB, 0x6C4F,\t0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, 0xCA40, 0x6C4C,\n\t0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, 0x72B5,\t0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75,\n\t0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280,\t0xCA4D, 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E,\n\t0xCA51, 0x9099, 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B,\t0xCA55, 0x9094, 0xCA56, 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620,\n\t0xCA59, 0x9623, 0xCA5A, 0x4F56, 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62,\t0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, 0x4F64, 0xCA60, 0x4F3E,\n\t0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, 0xCA64, 0x4F41,\t0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, 0x4F3F,\n\t0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C,\t0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE,\n\t0xCA71, 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E,\t0xCA75, 0x538F, 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A,\n\t0xCA79, 0x5454, 0xCA7A, 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C,\t0xCA7D, 0x5425, 0xCA7E, 0x5418, 0xCAA1, 0x543D, 0xCAA2, 0x544F,\n\t0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, 0x5424, 0xCAA6, 0x5447,\t0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, 0xCAAA, 0x5741,\n\t0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, 0x574B,\t0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6,\n\t0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E,\t0xCAB7, 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7,\n\t0xCABB, 0x59A1, 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28,\t0xCABF, 0x5C2A, 0xCAC0, 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88,\n\t0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A,\t0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, 0x5C95, 0xCACA, 0x5DE0,\n\t0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, 0xCACE, 0x5E89,\t0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, 0x5F05,\n\t0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2,\t0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8,\n\t0xCADB, 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4,\t0xCADF, 0x5FE3, 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7,\n\t0xCAE3, 0x5FFB, 0xCAE4, 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A,\t0xCAE7, 0x6283, 0xCAE8, 0x628C, 0xCAE9, 0x628E, 0xCAEA, 0x628F,\n\t0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, 0x6271, 0xCAEE, 0x627B,\t0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, 0xCAF2, 0x6288,\n\t0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, 0x6274,\t0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3,\n\t0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747,\t0xCB40, 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748,\n\t0xCB44, 0x675D, 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B,\t0xCB48, 0x6BD0, 0xCB49, 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78,\n\t0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B,\t0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, 0x6C6F, 0xCB53, 0x6C69,\n\t0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, 0xCB57, 0x6C95,\t0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, 0x6C65,\n\t0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A,\t0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3,\n\t0xCB64, 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5,\t0xCB68, 0x7395, 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394,\n\t0xCB6C, 0x7392, 0xCB6D, 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594,\t0xCB70, 0x7595, 0xCB71, 0x7681, 0xCB72, 0x793D, 0xCB73, 0x8034,\n\t0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, 0x8090, 0xCB77, 0x8092,\t0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, 0xCB7B, 0x8285,\n\t0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, 0x828A,\t0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9,\n\t0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5,\t0xCBAA, 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630,\n\t0xCBAE, 0x9628, 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33,\t0xCBB2, 0x4F98, 0xCBB3, 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D,\n\t0xCBB6, 0x4F80, 0xCBB7, 0x4F87, 0xCBB8, 0x4F76, 0xCBB9, 0x4F74,\t0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, 0x4F77, 0xCBBD, 0x4F4C,\n\t0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, 0xCBC1, 0x4F79,\t0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, 0x4F9C,\n\t0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82,\t0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E,\n\t0xCBCE, 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232,\t0xCBD2, 0x5233, 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC,\n\t0xCBD6, 0x530A, 0xCBD7, 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392,\t0xCBDA, 0x5394, 0xCBDB, 0x5487, 0xCBDC, 0x547F, 0xCBDD, 0x5481,\n\t0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, 0x5488, 0xCBE1, 0x546B,\t0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, 0xCBE5, 0x546C,\n\t0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, 0x546F,\t0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463,\n\t0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9,\t0xCBF2, 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B,\n\t0xCBF6, 0x5771, 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780,\t0xCBFA, 0x5775, 0xCBFB, 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774,\n\t0xCBFE, 0x5762, 0xCC40, 0x5768, 0xCC41, 0x577D, 0xCC42, 0x590C,\t0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, 0x59BA, 0xCC46, 0x59CF,\n\t0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, 0xCC4A, 0x59C1,\t0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, 0x59D6,\n\t0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8,\t0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65,\n\t0xCC57, 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47,\t0xCC5B, 0x5CAE, 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5,\n\t0xCC5F, 0x5CAF, 0xCC60, 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F,\t0xCC63, 0x5CA3, 0xCC64, 0x5CAD, 0xCC65, 0x5CA2, 0xCC66, 0x5CAA,\n\t0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, 0x5CA5, 0xCC6A, 0x5CB6,\t0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, 0xCC6E, 0x5E14,\n\t0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, 0x5F23,\t0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E,\n\t0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D,\t0xCC7B, 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B,\n\t0xCCA1, 0x6034, 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033,\t0xCCA5, 0x601A, 0xCCA6, 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022,\n\t0xCCA9, 0x600D, 0xCCAA, 0x6010, 0xCCAB, 0x602E, 0xCCAC, 0x6013,\t0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, 0x6009, 0xCCB0, 0x601C,\n\t0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, 0xCCB4, 0x62B4,\t0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, 0x62B6,\n\t0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF,\t0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8,\n\t0xCCC1, 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609,\t0xCCC5, 0x65FC, 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608,\n\t0xCCC9, 0x65FB, 0xCCCA, 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D,\t0xCCCD, 0x6605, 0xCCCE, 0x65FD, 0xCCCF, 0x6611, 0xCCD0, 0x6610,\n\t0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, 0x6785, 0xCCD4, 0x676C,\t0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, 0xCCD8, 0x677B,\n\t0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, 0x6774,\t0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F,\n\t0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D,\t0xCCE5, 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794,\n\t0xCCE9, 0x6B25, 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE,\t0xCCED, 0x6C1D, 0xCCEE, 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB,\n\t0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4,\t0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, 0x6CB7, 0xCCF8, 0x6CD0,\n\t0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, 0xCCFC, 0x6CC6,\t0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, 0x6CDD,\n\t0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80,\t0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD,\n\t0xCD4A, 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF,\t0xCD4E, 0x6CE9, 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098,\n\t0xCD52, 0x7085, 0xCD53, 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084,\t0xCD56, 0x7091, 0xCD57, 0x7096, 0xCD58, 0x7082, 0xCD59, 0x709A,\n\t0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, 0x72D6, 0xCD5D, 0x72CB,\t0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, 0xCD61, 0x72D2,\n\t0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, 0x72D1,\t0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6,\n\t0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D,\t0xCD6E, 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540,\n\t0xCD72, 0x753E, 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF,\t0xCD76, 0x76F3, 0xCD77, 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5,\n\t0xCD7A, 0x77F8, 0xCD7B, 0x77FC, 0xCD7C, 0x77F9, 0xCD7D, 0x77FB,\t0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, 0x7942, 0xCDA3, 0x793F,\n\t0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, 0xCDA7, 0x7AFB,\t0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, 0x808F,\n\t0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5,\t0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0,\n\t0xCDB4, 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B,\t0xCDB8, 0x82B5, 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC,\n\t0xCDBC, 0x829E, 0xCDBD, 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8,\t0xCDC0, 0x82A1, 0xCDC1, 0x82A9, 0xCDC2, 0x82C2, 0xCDC3, 0x82A4,\n\t0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, 0x82A2, 0xCDC7, 0x8670,\t0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, 0xCDCB, 0x8C56,\n\t0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, 0x8FCD,\t0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2,\n\t0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0,\t0xCDD8, 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A,\n\t0xCDDC, 0x9643, 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3,\t0xCDE0, 0x4FB2, 0xCDE1, 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1,\n\t0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB,\t0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, 0x4FC7, 0xCDEB, 0x4FD6,\n\t0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, 0xCDEF, 0x4FEC,\t0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, 0x52C2,\n\t0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396,\t0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1,\n\t0xCDFC, 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3,\t0xCE41, 0x830D, 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6,\n\t0xCE45, 0x54B6, 0xCE46, 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0,\t0xCE49, 0x5470, 0xCE4A, 0x54BC, 0xCE4B, 0x54A2, 0xCE4C, 0x54BE,\n\t0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, 0x54B0, 0xCE50, 0x57B5,\t0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, 0xCE54, 0x578C,\n\t0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, 0x5794,\t0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5,\n\t0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D,\t0xCE61, 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE,\n\t0xCE65, 0x5A00, 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA,\t0xCE69, 0x59FD, 0xCE6A, 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4,\n\t0xCE6D, 0x59F2, 0xCE6E, 0x59F7, 0xCE6F, 0x59DB, 0xCE70, 0x59E9,\t0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, 0x59E0, 0xCE74, 0x59FE,\n\t0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, 0xCE78, 0x5C4C,\t0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, 0x5CD7,\n\t0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA,\t0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6,\n\t0xCEA7, 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8,\t0xCEAB, 0x5CC6, 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8,\n\t0xCEAF, 0x5DF9, 0xCEB0, 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23,\t0xCEB3, 0x5E20, 0xCEB4, 0x5E24, 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4,\n\t0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, 0x5EA3, 0xCEBA, 0x5EA5,\t0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, 0xCEBE, 0x5F86,\n\t0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, 0x6072,\t0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047,\n\t0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040,\t0xCECB, 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044,\n\t0xCECF, 0x6058, 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242,\t0xCED3, 0x6243, 0xCED4, 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B,\n\t0xCED7, 0x62F5, 0xCED8, 0x630E, 0xCED9, 0x6303, 0xCEDA, 0x62EB,\t0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, 0x630C, 0xCEDE, 0x62F8,\n\t0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, 0xCEE2, 0x6314,\t0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, 0x62F0,\n\t0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF,\t0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635,\n\t0xCEEF, 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633,\t0xCEF3, 0x662B, 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634,\n\t0xCEF7, 0x6639, 0xCEF8, 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710,\t0xCEFB, 0x67C1, 0xCEFC, 0x67F2, 0xCEFD, 0x67C8, 0xCEFE, 0x67BA,\n\t0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, 0x67F8, 0xCF43, 0x67D8,\t0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, 0xCF47, 0x67EB,\n\t0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, 0x67CD,\t0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE,\n\t0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE,\t0xCF54, 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC,\n\t0xCF58, 0x67C6, 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE,\t0xCF5C, 0x67E6, 0xCF5D, 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9,\n\t0xCF60, 0x67CA, 0xCF61, 0x67C3, 0xCF62, 0x67EA, 0xCF63, 0x67CB,\t0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, 0x6B84, 0xCF67, 0x6BB6,\n\t0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, 0xCF6B, 0x6C20,\t0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, 0x6D2D,\n\t0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12,\t0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04,\n\t0xCF78, 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11,\t0xCF7C, 0x6D00, 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01,\n\t0xCFA2, 0x6D18, 0xCFA3, 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F,\t0xCFA6, 0x6D40, 0xCFA7, 0x6D07, 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C,\n\t0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, 0x6D09, 0xCFAD, 0x6D10,\t0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, 0xCFB1, 0x70B1,\n\t0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, 0x70B5,\t0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A,\n\t0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E,\t0xCFBE, 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB,\n\t0xCFC2, 0x72DF, 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3,\t0xCFC6, 0x7385, 0xCFC7, 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8,\n\t0xCFCA, 0x73C5, 0xCFCB, 0x73B9, 0xCFCC, 0x73B6, 0xCFCD, 0x73B5,\t0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, 0x73BF, 0xCFD1, 0x73C7,\n\t0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, 0xCFD5, 0x73B8,\t0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, 0x752E,\n\t0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA,\t0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703,\n\t0xCFE2, 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7,\t0xCFE6, 0x76FB, 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8,\n\t0xCFEA, 0x7806, 0xCFEB, 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805,\t0xCFEE, 0x7810, 0xCFEF, 0x780F, 0xCFF0, 0x780E, 0xCFF1, 0x7809,\n\t0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, 0x794A, 0xCFF5, 0x794C,\t0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, 0xCFF9, 0x79D5,\n\t0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, 0x79CE,\t0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00,\n\t0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79,\t0xD047, 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03,\n\t0xD04B, 0x7D08, 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91,\t0xD04F, 0x7F8D, 0xD050, 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E,\n\t0xD053, 0x800F, 0xD054, 0x8014, 0xD055, 0x8037, 0xD056, 0x80D8,\t0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, 0x80D1, 0xD05A, 0x80C8,\n\t0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, 0xD05E, 0x80E3,\t0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, 0x80D5,\n\t0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6,\t0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294,\n\t0xD06B, 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307,\t0xD06F, 0x82E8, 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A,\n\t0xD073, 0x82EB, 0xD074, 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC,\t0xD077, 0x82E1, 0xD078, 0x82F2, 0xD079, 0x82F5, 0xD07A, 0x830C,\n\t0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, 0x82F0, 0xD07E, 0x82EA,\t0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, 0xD0A4, 0x82F3,\n\t0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, 0x867C,\t0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867,\n\t0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04,\t0xD0B1, 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1,\n\t0xD0B5, 0x8FEE, 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD,\t0xD0B9, 0x90BF, 0xD0BA, 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE,\n\t0xD0BD, 0x90C7, 0xD0BE, 0x90CB, 0xD0BF, 0x90C8, 0xD0C0, 0x91D4,\t0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, 0x964F, 0xD0C4, 0x9651,\n\t0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, 0xD0C8, 0x501E,\t0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, 0x5022,\n\t0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4,\t0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6,\n\t0xD0D5, 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020,\t0xD0D9, 0x5027, 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031,\n\t0xD0DD, 0x500E, 0xD0DE, 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193,\t0xD0E1, 0x51CA, 0xD0E2, 0x51C4, 0xD0E3, 0x51C5, 0xD0E4, 0x51C8,\n\t0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, 0x525A, 0xD0E8, 0x5252,\t0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, 0xD0EC, 0x5262,\n\t0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, 0x5526,\t0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7,\n\t0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF,\t0xD0F9, 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511,\n\t0xD0FD, 0x5505, 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB,\t0xD142, 0x54F7, 0xD143, 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E,\n\t0xD146, 0x5503, 0xD147, 0x550B, 0xD148, 0x5701, 0xD149, 0x5702,\t0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, 0x57D5, 0xD14D, 0x57D2,\n\t0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, 0xD151, 0x57BC,\t0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, 0x57C7,\n\t0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E,\t0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D,\n\t0xD15E, 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17,\t0xD162, 0x5A0A, 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C,\n\t0xD166, 0x5BA7, 0xD167, 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03,\t0xD16A, 0x5C56, 0xD16B, 0x5C54, 0xD16C, 0x5CEC, 0xD16D, 0x5CFF,\n\t0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, 0x5CF7, 0xD171, 0x5D00,\t0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, 0xD175, 0x5EA8,\n\t0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, 0x5F33,\t0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A,\n\t0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088,\t0xD1A4, 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D,\n\t0xD1A8, 0x6083, 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097,\t0xD1AC, 0x6087, 0xD1AD, 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219,\n\t0xD1B0, 0x6246, 0xD1B1, 0x62F2, 0xD1B2, 0x6310, 0xD1B3, 0x6356,\t0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, 0x6345, 0xD1B7, 0x6336,\n\t0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, 0xD1BB, 0x634B,\t0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, 0x6341,\n\t0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359,\t0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A,\n\t0xD1C8, 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340,\t0xD1CC, 0x6348, 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6,\n\t0xD1D0, 0x65C3, 0xD1D1, 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A,\t0xD1D4, 0x665F, 0xD1D5, 0x6647, 0xD1D6, 0x6651, 0xD1D7, 0x6712,\n\t0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, 0x681A, 0xD1DB, 0x6849,\t0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, 0xD1DF, 0x684B,\n\t0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, 0x681C,\t0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F,\n\t0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D,\t0xD1EC, 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828,\n\t0xD1F0, 0x682E, 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825,\t0xD1F4, 0x6820, 0xD1F5, 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D,\n\t0xD1F8, 0x6B31, 0xD1F9, 0x6B34, 0xD1FA, 0x6B6D, 0xD1FB, 0x8082,\t0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, 0x6BE4, 0xD240, 0x6BE8,\n\t0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, 0xD244, 0x6C25,\t0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, 0x6D76,\n\t0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58,\t0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91,\n\t0xD251, 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86,\t0xD255, 0x6D5E, 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97,\n\t0xD259, 0x6D70, 0xD25A, 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82,\t0xD25D, 0x6D98, 0xD25E, 0x6D2F, 0xD25F, 0x6D68, 0xD260, 0x6D8B,\n\t0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, 0x6D84, 0xD264, 0x6D16,\t0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, 0xD268, 0x6D75,\n\t0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, 0x70D1,\t0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2,\n\t0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0,\t0xD275, 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6,\n\t0xD279, 0x70C7, 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1,\t0xD27D, 0x7242, 0xD27E, 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276,\n\t0xD2A3, 0x7300, 0xD2A4, 0x72FA, 0xD2A5, 0x72F4, 0xD2A6, 0x72FE,\t0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, 0x72FB, 0xD2AA, 0x7301,\n\t0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, 0xD2AE, 0x73D6,\t0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, 0x73E9,\n\t0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4,\t0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8,\n\t0xD2BB, 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4,\t0xD2BF, 0x74F5, 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F,\n\t0xD2C3, 0x75B0, 0xD2C4, 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4,\t0xD2C7, 0x75C0, 0xD2C8, 0x75BF, 0xD2C9, 0x75B6, 0xD2CA, 0x75BA,\n\t0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, 0x771D, 0xD2CE, 0x771B,\t0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, 0xD2D2, 0x7723,\n\t0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, 0x771A,\t0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C,\n\t0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828,\t0xD2DF, 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829,\n\t0xD2E3, 0x7833, 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954,\t0xD2E7, 0x795B, 0xD2E8, 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953,\n\t0xD2EB, 0x7952, 0xD2EC, 0x7951, 0xD2ED, 0x79EB, 0xD2EE, 0x79EC,\t0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, 0x79ED, 0xD2F2, 0x79EA,\n\t0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, 0xD2F6, 0x7A86,\t0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, 0x7A8C,\n\t0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10,\t0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F,\n\t0xD344, 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09,\t0xD348, 0x7B12, 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A,\n\t0xD34C, 0x7C8C, 0xD34D, 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85,\t0xD350, 0x7D1E, 0xD351, 0x7D1D, 0xD352, 0x7D11, 0xD353, 0x7D0E,\n\t0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, 0x7D13, 0xD357, 0x7D1F,\t0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, 0xD35B, 0x7F5C,\n\t0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, 0x7F5D,\t0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3,\n\t0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E,\t0xD368, 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9,\n\t0xD36C, 0x80F5, 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100,\t0xD370, 0x8201, 0xD371, 0x822F, 0xD372, 0x8225, 0xD373, 0x8333,\n\t0xD374, 0x832D, 0xD375, 0x8344, 0xD376, 0x8319, 0xD377, 0x8351,\t0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, 0x833F, 0xD37B, 0x8341,\n\t0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, 0xD3A1, 0x8342,\t0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, 0x8308,\n\t0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324,\t0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329,\n\t0xD3AE, 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353,\t0xD3B2, 0x831E, 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327,\n\t0xD3B6, 0x8348, 0xD3B7, 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2,\t0xD3BA, 0x86A8, 0xD3BB, 0x8696, 0xD3BC, 0x868D, 0xD3BD, 0x8691,\n\t0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, 0x8697, 0xD3C1, 0x8686,\t0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, 0xD3C5, 0x86A5,\n\t0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, 0x8695,\t0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690,\n\t0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D,\t0xD3D2, 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880,\n\t0xD3D6, 0x8871, 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883,\t0xD3DA, 0x887E, 0xD3DB, 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12,\n\t0xD3DE, 0x8C47, 0xD3DF, 0x8C57, 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4,\t0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, 0x8D78, 0xD3E5, 0x8DB5,\n\t0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, 0xD3E9, 0x8ED3,\t0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, 0x8FFF,\n\t0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6,\t0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA,\n\t0xD3F6, 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8,\t0xD3FA, 0x90DB, 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4,\n\t0xD3FE, 0x9150, 0xD440, 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5,\t0xD443, 0x91E2, 0xD444, 0x91DA, 0xD445, 0x965C, 0xD446, 0x965F,\n\t0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, 0x9ADF, 0xD44A, 0x9B2F,\t0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, 0xD44E, 0x5061,\n\t0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, 0x504B,\t0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D,\n\t0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062,\t0xD45B, 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069,\n\t0xD45F, 0x506B, 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046,\t0xD463, 0x5040, 0xD464, 0x506E, 0xD465, 0x5073, 0xD466, 0x5057,\n\t0xD467, 0x5051, 0xD468, 0x51D0, 0xD469, 0x526B, 0xD46A, 0x526D,\t0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, 0x52D6, 0xD46E, 0x52D3,\n\t0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, 0xD472, 0x5576,\t0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, 0x5534,\n\t0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536,\t0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545,\n\t0xD4A1, 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E,\t0xD4A5, 0x5539, 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B,\n\t0xD4A9, 0x5540, 0xD4AA, 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707,\t0xD4AD, 0x57FB, 0xD4AE, 0x5814, 0xD4AF, 0x57E2, 0xD4B0, 0x57F6,\n\t0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, 0x5800, 0xD4B4, 0x57ED,\t0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, 0xD4B8, 0x580B,\n\t0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, 0x57EE,\t0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC,\n\t0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810,\t0xD4C5, 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1,\n\t0xD4C9, 0x57E9, 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804,\t0xD4CD, 0x595C, 0xD4CE, 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55,\n\t0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, 0xD4D3, 0x5A38, 0xD4D4, 0x5A35,\t0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, 0x5A5F, 0xD4D8, 0x5A65,\n\t0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, 0xD4DC, 0x5A57,\t0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, 0x5A44,\n\t0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E,\t0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70,\n\t0xD4E9, 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56,\t0xD4ED, 0x5A42, 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E,\n\t0xD4F1, 0x5BC1, 0xD4F2, 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E,\t0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20,\n\t0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, 0x5D0D, 0xD4FC, 0x5D26,\t0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, 0xD541, 0x5D12,\n\t0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, 0x5E3E,\t0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9,\n\t0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38,\t0xD54E, 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A,\n\t0xD552, 0x6090, 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0,\t0xD556, 0x60BA, 0xD557, 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF,\n\t0xD55A, 0x60E4, 0xD55B, 0x60D9, 0xD55C, 0x60DD, 0xD55D, 0x60C8,\t0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, 0x60B7, 0xD561, 0x60CA,\n\t0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, 0xD565, 0x60C0,\t0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, 0x6382,\n\t0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD,\t0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E,\n\t0xD572, 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E,\t0xD576, 0x63AF, 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D,\n\t0xD57A, 0x63AE, 0xD57B, 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B,\t0xD57E, 0x639F, 0xD5A1, 0x6378, 0xD5A2, 0x6385, 0xD5A3, 0x6381,\n\t0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, 0x6370, 0xD5A7, 0x6553,\t0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, 0xD5AB, 0x665B,\n\t0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, 0x6718,\t0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C,\n\t0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB,\t0xD5B8, 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC,\n\t0xD5BC, 0x68A9, 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2,\t0xD5C0, 0x688F, 0xD5C1, 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C,\n\t0xD5C4, 0x686B, 0xD5C5, 0x6872, 0xD5C6, 0x68AA, 0xD5C7, 0x6880,\t0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, 0x689B, 0xD5CB, 0x6896,\n\t0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, 0xD5CF, 0x68A4,\t0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, 0x688C,\n\t0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33,\t0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F,\n\t0xD5DC, 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A,\t0xD5E0, 0x6DC0, 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3,\n\t0xD5E4, 0x6E74, 0xD5E5, 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2,\t0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00,\n\t0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, 0x6DDF, 0xD5EF, 0x6DD6,\t0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, 0xD5F3, 0x6DDD,\n\t0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, 0x6DBD,\t0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5,\n\t0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0,\t0xD641, 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7,\n\t0xD645, 0x6DCD, 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA,\t0xD649, 0x710D, 0xD64A, 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4,\n\t0xD64D, 0x710C, 0xD64E, 0x70F0, 0xD64F, 0x7104, 0xD650, 0x70F3,\t0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, 0x70FF, 0xD654, 0x7106,\n\t0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, 0xD658, 0x70F6,\t0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, 0x727E,\n\t0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D,\t0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318,\n\t0xD665, 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F,\t0xD669, 0x731E, 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8,\n\t0xD66D, 0x73F5, 0xD66E, 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD,\t0xD671, 0x7407, 0xD672, 0x7400, 0xD673, 0x73FA, 0xD674, 0x73FC,\n\t0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, 0x740B, 0xD678, 0x73F4,\t0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, 0xD67C, 0x75CE,\n\t0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, 0x75CC,\t0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689,\n\t0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D,\t0xD6AB, 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733,\n\t0xD6AF, 0x773D, 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735,\t0xD6B3, 0x7848, 0xD6B4, 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D,\n\t0xD6B7, 0x784A, 0xD6B8, 0x784C, 0xD6B9, 0x7826, 0xD6BA, 0x7845,\t0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, 0x7967, 0xD6BE, 0x7969,\n\t0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, 0xD6C2, 0x7961,\t0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, 0x79F6,\n\t0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90,\t0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25,\n\t0xD6CF, 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33,\t0xD6D3, 0x7B18, 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31,\n\t0xD6D7, 0x7B2B, 0xD6D8, 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32,\t0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, 0xD6DD, 0x7B23, 0xD6DE, 0x7C94,\n\t0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, 0x7CA3, 0xD6E2, 0x7D35,\t0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, 0xD6E6, 0x7D3A,\n\t0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, 0x7D41,\t0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A,\n\t0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95,\t0xD6F3, 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA,\n\t0xD6F7, 0x7FCB, 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1,\t0xD6FB, 0x7FC7, 0xD6FC, 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F,\n\t0xD740, 0x801E, 0xD741, 0x801B, 0xD742, 0x8047, 0xD743, 0x8043,\t0xD744, 0x8048, 0xD745, 0x8118, 0xD746, 0x8125, 0xD747, 0x8119,\n\t0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, 0xD74B, 0x812C,\t0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, 0x8127,\n\t0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238,\t0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232,\n\t0xD758, 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8,\t0xD75C, 0x838D, 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4,\n\t0xD760, 0x8374, 0xD761, 0x838F, 0xD762, 0x8381, 0xD763, 0x8395,\t0xD764, 0x8399, 0xD765, 0x8375, 0xD766, 0x8394, 0xD767, 0x83A9,\n\t0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, 0x838C, 0xD76B, 0x839D,\t0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, 0xD76F, 0x837E,\n\t0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, 0x8397,\t0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387,\n\t0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659,\t0xD77C, 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2,\n\t0xD7A2, 0x86C1, 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0,\t0xD7A6, 0x86C8, 0xD7A7, 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8,\n\t0xD7AA, 0x86CC, 0xD7AB, 0x86B4, 0xD7AC, 0x86BB, 0xD7AD, 0x86BC,\t0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, 0x86BE, 0xD7B1, 0x8852,\n\t0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, 0xD7B5, 0x88A2,\t0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, 0x88A1,\n\t0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899,\t0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC,\n\t0xD7C2, 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982,\t0xD7C6, 0x89D6, 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30,\n\t0xD7CA, 0x8A27, 0xD7CB, 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39,\t0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D,\n\t0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, 0x8D7B, 0xD7D5, 0x8D79,\t0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, 0xD7D9, 0x8DBF,\n\t0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, 0x8EDD,\t0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1,\n\t0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C,\t0xD7E6, 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA,\n\t0xD7EA, 0x90F0, 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3,\t0xD7EE, 0x90D4, 0xD7EF, 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9,\n\t0xD7F2, 0x9156, 0xD7F3, 0x9158, 0xD7F4, 0x915A, 0xD7F5, 0x9153,\t0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, 0x91F4, 0xD7F9, 0x91F1,\n\t0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, 0xD7FD, 0x91F9,\t0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, 0x91E8,\n\t0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588,\t0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671,\n\t0xD84B, 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804,\t0xD84F, 0x98E5, 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095,\n\t0xD853, 0x5094, 0xD854, 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3,\t0xD857, 0x5083, 0xD858, 0x508C, 0xD859, 0x508E, 0xD85A, 0x509D,\n\t0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, 0x5092, 0xD85E, 0x5082,\t0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, 0xD862, 0x5312,\n\t0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, 0x5591,\t0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577,\n\t0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588,\t0xD86F, 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3,\n\t0xD873, 0x5592, 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C,\t0xD877, 0x55A6, 0xD878, 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1,\n\t0xD87B, 0x558E, 0xD87C, 0x570C, 0xD87D, 0x5829, 0xD87E, 0x5837,\t0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, 0x5827, 0xD8A4, 0x5823,\n\t0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, 0xD8A8, 0x5825,\t0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, 0x583F,\n\t0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838,\t0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961,\n\t0xD8B5, 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A,\t0xD8B9, 0x5AA2, 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6,\n\t0xD8BD, 0x5A7C, 0xD8BE, 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95,\t0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A,\n\t0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, 0x5A8B, 0xD8C8, 0x5AA9,\t0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, 0xD8CC, 0x5A9C,\n\t0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, 0x5BEA,\t0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1,\n\t0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30,\t0xD8D9, 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41,\n\t0xD8DD, 0x5D4B, 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51,\t0xD8E1, 0x5D4E, 0xD8E2, 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A,\n\t0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, 0xD8E7, 0x5D31, 0xD8E8, 0x5D59,\t0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, 0x5D49, 0xD8EC, 0x5D38,\n\t0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, 0xD8F0, 0x5D40,\t0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, 0x5F58,\n\t0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9,\t0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE,\n\t0xD8FD, 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A,\t0xD942, 0x6116, 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113,\n\t0xD946, 0x60F8, 0xD947, 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1,\t0xD94A, 0x6103, 0xD94B, 0x6118, 0xD94C, 0x611D, 0xD94D, 0x6110,\n\t0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, 0x610B, 0xD951, 0x624A,\t0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, 0xD955, 0x63CE,\n\t0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, 0x63C3,\t0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0,\n\t0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5,\t0xD962, 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD,\n\t0xD966, 0x63DC, 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3,\t0xD96A, 0x63C2, 0xD96B, 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB,\n\t0xD96E, 0x63C8, 0xD96F, 0x63F0, 0xD970, 0x63D7, 0xD971, 0x63D9,\t0xD972, 0x6532, 0xD973, 0x6567, 0xD974, 0x656A, 0xD975, 0x6564,\n\t0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, 0xD979, 0x658C,\t0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, 0x65D0,\n\t0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B,\t0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A,\n\t0xD9A8, 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3,\t0xD9AC, 0x6904, 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC,\n\t0xD9B0, 0x68EA, 0xD9B1, 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6,\t0xD9B4, 0x68F7, 0xD9B5, 0x68EB, 0xD9B6, 0x68E4, 0xD9B7, 0x68F6,\n\t0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, 0x68F3, 0xD9BB, 0x68E1,\t0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, 0xD9BF, 0x6970,\n\t0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, 0x68C6,\t0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD,\n\t0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A,\t0xD9CC, 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD,\n\t0xD9D0, 0x68DE, 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1,\t0xD9D4, 0x6906, 0xD9D5, 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915,\n\t0xD9D8, 0x6925, 0xD9D9, 0x68C7, 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B,\t0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, 0x6B94, 0xD9DF, 0x6B97,\n\t0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, 0xD9E3, 0x6BF0,\t0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, 0x6DFC,\n\t0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49,\t0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45,\n\t0xD9F0, 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41,\t0xD9F4, 0x6E5D, 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33,\n\t0xD9F8, 0x6E4B, 0xD9F9, 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B,\t0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, 0xD9FE, 0x6E5E, 0xDA40, 0x6E68,\n\t0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, 0x6E31, 0xDA44, 0x6E28,\t0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, 0xDA48, 0x6E39,\n\t0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, 0x6E65,\t0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77,\n\t0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66,\t0xDA55, 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120,\n\t0xDA59, 0x711E, 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E,\t0xDA5D, 0x7131, 0xDA5E, 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122,\n\t0xDA61, 0x7132, 0xDA62, 0x711F, 0xDA63, 0x7128, 0xDA64, 0x713A,\t0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, 0x725A, 0xDA68, 0x7288,\n\t0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, 0xDA6C, 0x728B,\t0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, 0x7322,\n\t0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332,\t0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335,\n\t0xDA79, 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430,\t0xDA7D, 0x742B, 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421,\n\t0xDAA3, 0x742D, 0xDAA4, 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423,\t0xDAA7, 0x741D, 0xDAA8, 0x7429, 0xDAA9, 0x7420, 0xDAAA, 0x7432,\n\t0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, 0x756F, 0xDAAE, 0x756C,\t0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, 0xDAB2, 0x75E6,\n\t0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, 0x75D7,\t0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746,\n\t0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745,\t0xDABF, 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C,\n\t0xDAC3, 0x77DE, 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864,\t0xDAC7, 0x7865, 0xDAC8, 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871,\n\t0xDACB, 0x786A, 0xDACC, 0x786E, 0xDACD, 0x7870, 0xDACE, 0x7869,\t0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, 0x7862, 0xDAD2, 0x7974,\n\t0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, 0xDAD6, 0x7A02,\t0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, 0x7A04,\n\t0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A,\t0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C,\n\t0xDAE3, 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45,\t0xDAE7, 0x7CA2, 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1,\n\t0xDAEB, 0x7D58, 0xDAEC, 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53,\t0xDAEF, 0x7D56, 0xDAF0, 0x7D67, 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F,\n\t0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, 0x7D6B, 0xDAF6, 0x7D52,\t0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, 0xDAFA, 0x7D5F,\n\t0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, 0x7F65,\t0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1,\n\t0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050,\t0xDB48, 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A,\n\t0xDB4C, 0x8152, 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D,\t0xDB50, 0x814D, 0xDB51, 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE,\n\t0xDB54, 0x81F7, 0xDB55, 0x81F8, 0xDB56, 0x81F9, 0xDB57, 0x8204,\t0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, 0x823F, 0xDB5B, 0x8275,\n\t0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, 0xDB5F, 0x8423,\t0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, 0x83E7,\n\t0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410,\t0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3,\n\t0xDB6C, 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5,\t0xDB70, 0x83D8, 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB,\n\t0xDB74, 0x83CE, 0xDB75, 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9,\t0xDB78, 0x8409, 0xDB79, 0x840F, 0xDB7A, 0x83DE, 0xDB7B, 0x8411,\n\t0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, 0x83F3, 0xDBA1, 0x83D5,\t0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, 0xDBA5, 0x83EA,\n\t0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, 0x83EE,\t0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2,\n\t0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8,\t0xDBB2, 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3,\n\t0xDBB6, 0x86DA, 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB,\t0xDBBA, 0x86DC, 0xDBBB, 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7,\n\t0xDBBE, 0x86E8, 0xDBBF, 0x86D1, 0xDBC0, 0x8848, 0xDBC1, 0x8856,\t0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, 0x88D7, 0xDBC5, 0x88B9,\n\t0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, 0xDBC9, 0x88B6,\t0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, 0x88B2,\n\t0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998,\t0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB,\n\t0xDBD6, 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59,\t0xDBDA, 0x8A40, 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44,\n\t0xDBDE, 0x8A45, 0xDBDF, 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51,\t0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F,\n\t0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, 0x8CBA, 0xDBE9, 0x8CBE,\t0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, 0xDBED, 0x8D84,\n\t0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, 0x8DD3,\t0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC,\n\t0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8,\t0xDBFA, 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7,\n\t0xDBFE, 0x8EFA, 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE,\t0xDC43, 0x8EE5, 0xDC44, 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8,\n\t0xDC47, 0x8EF6, 0xDC48, 0x8EEB, 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC,\t0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, 0x902D, 0xDC4E, 0x9034,\n\t0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, 0xDC52, 0x9104,\t0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, 0x90F9,\n\t0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107,\t0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164,\n\t0xDC5F, 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201,\t0xDC63, 0x920A, 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A,\n\t0xDC67, 0x9226, 0xDC68, 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200,\t0xDC6B, 0x9212, 0xDC6C, 0x91FF, 0xDC6D, 0x91FD, 0xDC6E, 0x9206,\n\t0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, 0x9202, 0xDC72, 0x921C,\t0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, 0xDC76, 0x9205,\n\t0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, 0x958C,\t0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688,\n\t0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2,\t0xDCA5, 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0,\n\t0xDCA9, 0x976C, 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807,\t0xDCAD, 0x98A9, 0xDCAE, 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9,\n\t0xDCB1, 0x4E83, 0xDCB2, 0x4E84, 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD,\t0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, 0x50AE, 0xDCB8, 0x50C4,\n\t0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, 0xDCBC, 0x50C2,\t0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, 0x50B1,\n\t0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8,\t0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B,\n\t0xDCC9, 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC,\t0xDCCD, 0x55D0, 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD,\n\t0xDCD1, 0x55C0, 0xDCD2, 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9,\t0xDCD5, 0x55BF, 0xDCD6, 0x55D2, 0xDCD7, 0x558D, 0xDCD8, 0x55CF,\n\t0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, 0x55D6, 0xDCDC, 0x55C8,\t0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, 0xDCE0, 0x55C2,\n\t0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, 0x5864,\t0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F,\n\t0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859,\t0xDCED, 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863,\n\t0xDCF1, 0x5871, 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4,\t0xDCF5, 0x5ACB, 0xDCF6, 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1,\n\t0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8,\t0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, 0x5AB7, 0xDD41, 0x5AC0,\n\t0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, 0xDD45, 0x5ACD,\t0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, 0x5BD8,\n\t0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71,\t0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72,\n\t0xDD52, 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67,\t0xDD56, 0x5D62, 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E,\n\t0xDD5A, 0x5E4A, 0xDD5B, 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5,\t0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, 0xDD60, 0x5ECB, 0xDD61, 0x5EC7,\n\t0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, 0x5FAD, 0xDD65, 0x60F7,\t0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, 0xDD69, 0x6145,\n\t0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, 0x6146,\t0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140,\n\t0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225,\t0xDD76, 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB,\n\t0xDD7A, 0x6410, 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420,\t0xDD7E, 0x6424, 0xDDA1, 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F,\n\t0xDDA4, 0x6415, 0xDDA5, 0x6418, 0xDDA6, 0x6439, 0xDDA7, 0x6437,\t0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, 0x640C, 0xDDAB, 0x6426,\n\t0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, 0xDDAF, 0x6435,\t0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, 0x6440,\n\t0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7,\t0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E,\n\t0xDDBC, 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686,\t0xDDC0, 0x668C, 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B,\n\t0xDDC4, 0x668A, 0xDDC5, 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678,\t0xDDC8, 0x6720, 0xDDC9, 0x6966, 0xDDCA, 0x695F, 0xDDCB, 0x6938,\n\t0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, 0x6971, 0xDDCF, 0x693F,\t0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, 0xDDD3, 0x6942,\n\t0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, 0x6948,\t0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933,\n\t0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978,\t0xDDE0, 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F,\n\t0xDDE4, 0x6944, 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941,\t0xDDE8, 0x6974, 0xDDE9, 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B,\n\t0xDDEC, 0x6937, 0xDDED, 0x695C, 0xDDEE, 0x694F, 0xDDEF, 0x6951,\t0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, 0x692F, 0xDDF3, 0x697B,\n\t0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, 0xDDF7, 0x6B43,\t0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, 0x6B9B,\n\t0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9,\t0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6,\n\t0xDE45, 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F,\t0xDE49, 0x6E93, 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1,\n\t0xDE4D, 0x6EB9, 0xDE4E, 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD,\t0xDE51, 0x6EC1, 0xDE52, 0x6E9E, 0xDE53, 0x6EC9, 0xDE54, 0x6EB7,\n\t0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, 0x6EA6, 0xDE58, 0x6ECF,\t0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, 0xDE5C, 0x6EDC,\n\t0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, 0x6E8E,\t0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF,\n\t0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97,\t0xDE69, 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154,\n\t0xDE6D, 0x7152, 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141,\t0xDE71, 0x715D, 0xDE72, 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178,\n\t0xDE75, 0x716A, 0xDE76, 0x7161, 0xDE77, 0x7142, 0xDE78, 0x7158,\t0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, 0x7170, 0xDE7C, 0x715F,\n\t0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, 0xDEA2, 0x714D,\t0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, 0x728C,\n\t0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C,\t0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340,\n\t0xDEAF, 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A,\t0xDEB3, 0x744B, 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457,\n\t0xDEB7, 0x7440, 0xDEB8, 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E,\t0xDEBB, 0x7442, 0xDEBC, 0x7446, 0xDEBD, 0x744D, 0xDEBE, 0x7454,\n\t0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, 0x74FE, 0xDEC2, 0x74FD,\t0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, 0xDEC6, 0x6983,\n\t0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, 0x75F7,\t0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8,\n\t0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED,\t0xDED3, 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5,\n\t0xDED7, 0x76DD, 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760,\t0xDEDB, 0x7752, 0xDEDC, 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769,\n\t0xDEDF, 0x7767, 0xDEE0, 0x7754, 0xDEE1, 0x7759, 0xDEE2, 0x776D,\t0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, 0x789A, 0xDEE6, 0x7894,\n\t0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, 0xDEEA, 0x7885,\t0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, 0x7879,\n\t0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B,\t0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979,\n\t0xDEF7, 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12,\t0xDEFB, 0x7A17, 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13,\n\t0xDF40, 0x7A1B, 0xDF41, 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2,\t0xDF44, 0x7A9E, 0xDF45, 0x7AEB, 0xDF46, 0x7B66, 0xDF47, 0x7B64,\n\t0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, 0x7B69, 0xDF4B, 0x7B72,\t0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, 0xDF4F, 0x7B70,\n\t0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, 0x7B63,\t0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88,\n\t0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F,\t0xDF5C, 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B,\n\t0xDF60, 0x7D83, 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94,\t0xDF64, 0x7D84, 0xDF65, 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D,\n\t0xDF68, 0x7F6B, 0xDF69, 0x7F67, 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C,\t0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, 0x7FA7, 0xDF6F, 0x7FDB,\n\t0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, 0xDF73, 0x8160,\t0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, 0x815B,\n\t0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E,\t0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144,\n\t0xDFA2, 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244,\t0xDFA6, 0x8240, 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1,\n\t0xDFAA, 0x843F, 0xDFAB, 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479,\t0xDFAE, 0x848F, 0xDFAF, 0x848D, 0xDFB0, 0x8465, 0xDFB1, 0x8451,\n\t0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, 0x8467, 0xDFB5, 0x8430,\t0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, 0xDFB9, 0x8459,\n\t0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, 0x8507,\t0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434,\n\t0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432,\t0xDFC6, 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B,\n\t0xDFCA, 0x842F, 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F,\t0xDFCE, 0x8470, 0xDFCF, 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C,\n\t0xDFD2, 0x8452, 0xDFD3, 0x846F, 0xDFD4, 0x84C5, 0xDFD5, 0x848E,\t0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, 0x8436, 0xDFD9, 0x8433,\n\t0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, 0xDFDD, 0x842B,\t0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, 0x8450,\n\t0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C,\t0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D,\n\t0xDFEA, 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701,\t0xDFEE, 0x86F6, 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6,\n\t0xDFF2, 0x88CB, 0xDFF3, 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE,\t0xDFF6, 0x88DB, 0xDFF7, 0x88DA, 0xDFF8, 0x88CC, 0xDFF9, 0x88D0,\n\t0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, 0x89DF, 0xDFFD, 0x89E5,\t0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, 0xE042, 0x89E2,\n\t0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, 0x8A86,\t0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77,\n\t0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83,\t0xE04F, 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C,\n\t0xE053, 0x8C4B, 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64,\t0xE057, 0x8C66, 0xE058, 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85,\n\t0xE05B, 0x8CCC, 0xE05C, 0x8D68, 0xE05D, 0x8D69, 0xE05E, 0x8D91,\t0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, 0x8D8F, 0xE062, 0x8D8D,\n\t0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, 0xE066, 0x8D92,\t0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, 0x8DF1,\n\t0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3,\t0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB,\n\t0xE073, 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01,\t0xE077, 0x8F00, 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08,\n\t0xE07B, 0x8F02, 0xE07C, 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F,\t0xE0A1, 0x9044, 0xE0A2, 0x9049, 0xE0A3, 0x903D, 0xE0A4, 0x9110,\n\t0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, 0x9111, 0xE0A8, 0x9116,\t0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, 0xE0AC, 0x916E,\n\t0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, 0x9230,\t0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265,\n\t0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A,\t0xE0B9, 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F,\n\t0xE0BD, 0x9260, 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236,\t0xE0C1, 0x9261, 0xE0C2, 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254,\n\t0xE0C5, 0x9263, 0xE0C6, 0x9250, 0xE0C7, 0x9272, 0xE0C8, 0x924E,\t0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, 0x9256, 0xE0CC, 0x9232,\n\t0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, 0xE0D0, 0x959B,\t0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, 0x9697,\n\t0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8,\t0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778,\n\t0xE0DD, 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E,\t0xE0E1, 0x98AC, 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF,\n\t0xE0E5, 0x99B2, 0xE0E6, 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD,\t0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED,\n\t0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, 0x9EFD, 0xE0F0, 0x50E6,\t0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, 0xE0F4, 0x50F3,\n\t0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, 0x50E4,\t0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF,\n\t0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280,\t0xE142, 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330,\n\t0xE146, 0x53AC, 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C,\t0xE14A, 0x5612, 0xE14B, 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C,\n\t0xE14E, 0x5601, 0xE14F, 0x5613, 0xE150, 0x5602, 0xE151, 0x55FA,\t0xE152, 0x561D, 0xE153, 0x5604, 0xE154, 0x55FF, 0xE155, 0x55F9,\n\t0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, 0xE159, 0x5898,\t0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, 0x5874,\n\t0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891,\t0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888,\n\t0xE166, 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE,\t0xE16A, 0x596B, 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5,\n\t0xE16E, 0x5AD5, 0xE16F, 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED,\t0xE172, 0x5AEB, 0xE173, 0x5AF3, 0xE174, 0x5AE2, 0xE175, 0x5AE0,\n\t0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, 0x5ADE, 0xE179, 0x5ADD,\t0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, 0xE17D, 0x5B77,\n\t0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, 0x5D82,\t0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A,\n\t0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89,\t0xE1AC, 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D,\n\t0xE1B0, 0x5D79, 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59,\t0xE1B4, 0x5E53, 0xE1B5, 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7,\n\t0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9,\t0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, 0x5F44, 0xE1BF, 0x5F43,\n\t0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, 0xE1C3, 0x6128,\t0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, 0x6173,\n\t0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C,\t0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A,\n\t0xE1D0, 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A,\t0xE1D4, 0x6161, 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227,\n\t0xE1D8, 0x622B, 0xE1D9, 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B,\t0xE1DC, 0x645D, 0xE1DD, 0x6474, 0xE1DE, 0x6476, 0xE1DF, 0x6472,\n\t0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, 0x6475, 0xE1E3, 0x6466,\t0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, 0xE1E7, 0x645E,\n\t0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, 0x6460,\t0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C,\n\t0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477,\t0xE1F4, 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0,\n\t0xE1F8, 0x669F, 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722,\t0xE1FC, 0x69B1, 0xE1FD, 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0,\n\t0xE241, 0x69CE, 0xE242, 0x6996, 0xE243, 0x69B0, 0xE244, 0x69AC,\t0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, 0x6999, 0xE248, 0x698E,\n\t0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, 0xE24C, 0x69BE,\t0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, 0x69BD,\n\t0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA,\t0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993,\n\t0xE259, 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9,\t0xE25D, 0x6997, 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5,\n\t0xE261, 0x69A5, 0xE262, 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D,\t0xE265, 0x6B4B, 0xE266, 0x6B9E, 0xE267, 0x6B9F, 0xE268, 0x6BA0,\n\t0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, 0x6BFE, 0xE26C, 0x6ECE,\t0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, 0xE270, 0x6F25,\n\t0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, 0x6F2E,\t0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A,\n\t0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12,\t0xE27D, 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73,\n\t0xE2A3, 0x6EF9, 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40,\t0xE2A7, 0x6F30, 0xE2A8, 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB,\n\t0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, 0xE2AD, 0x6F43, 0xE2AE, 0x6F05,\t0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, 0x6F39, 0xE2B2, 0x6F1C,\n\t0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, 0xE2B6, 0x6F0D,\t0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, 0x7187,\n\t0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185,\t0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186,\n\t0xE2C3, 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253,\t0xE2C7, 0x7297, 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343,\n\t0xE2CB, 0x734D, 0xE2CC, 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462,\t0xE2CF, 0x7473, 0xE2D0, 0x7471, 0xE2D1, 0x7475, 0xE2D2, 0x7472,\n\t0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, 0x7500, 0xE2D6, 0x7502,\t0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, 0xE2DA, 0x7616,\n\t0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, 0x7611,\t0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781,\n\t0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E,\t0xE2E7, 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783,\n\t0xE2EB, 0x78B2, 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD,\t0xE2EF, 0x78A8, 0xE2F0, 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E,\n\t0xE2F3, 0x78A5, 0xE2F4, 0x78A0, 0xE2F5, 0x78AC, 0xE2F6, 0x78A2,\t0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, 0x798A, 0xE2FA, 0x798B,\n\t0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, 0xE2FE, 0x7993,\t0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, 0x7990,\n\t0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F,\t0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB,\n\t0xE34C, 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C,\t0xE350, 0x7B8A, 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96,\n\t0xE354, 0x7B8D, 0xE355, 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E,\t0xE358, 0x7B85, 0xE359, 0x7B98, 0xE35A, 0x5284, 0xE35B, 0x7B99,\n\t0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, 0x7CBB, 0xE35F, 0x7CBF,\t0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, 0xE363, 0x7DB7,\n\t0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, 0x7DC1,\t0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE,\n\t0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC,\t0xE370, 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC,\n\t0xE374, 0x7D9F, 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9,\t0xE378, 0x7DA1, 0xE379, 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2,\n\t0xE37C, 0x7FE3, 0xE37D, 0x7FE5, 0xE37E, 0x7FDE, 0xE3A1, 0x8024,\t0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, 0x8189, 0xE3A5, 0x8186,\n\t0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, 0xE3A9, 0x818C,\t0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, 0x84A4,\n\t0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE,\t0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB,\n\t0xE3B6, 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD,\t0xE3BA, 0x84AA, 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0,\n\t0xE3BE, 0x849D, 0xE3BF, 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2,\t0xE3C2, 0x8494, 0xE3C3, 0x84C7, 0xE3C4, 0x84CC, 0xE3C5, 0x849B,\n\t0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, 0x84A8, 0xE3C9, 0x84D6,\t0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, 0xE3CD, 0x84A0,\n\t0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, 0x84DB,\t0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733,\n\t0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740,\t0xE3DA, 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719,\n\t0xE3DE, 0x871B, 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741,\t0xE3E2, 0x873E, 0xE3E3, 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732,\n\t0xE3E6, 0x872A, 0xE3E7, 0x872D, 0xE3E8, 0x873C, 0xE3E9, 0x8712,\t0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, 0x8735, 0xE3ED, 0x8742,\n\t0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, 0xE3F1, 0x8724,\t0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, 0x88F7,\n\t0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA,\t0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6,\n\t0xE3FE, 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB,\t0xE443, 0x899D, 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E,\n\t0xE447, 0x89E9, 0xE448, 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB,\t0xE44B, 0x8A99, 0xE44C, 0x8A8B, 0xE44D, 0x8A92, 0xE44E, 0x8A8F,\n\t0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, 0x8C68, 0xE452, 0x8C69,\t0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, 0xE456, 0x8D96,\n\t0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, 0x8E0D,\t0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07,\n\t0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00,\t0xE463, 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E,\n\t0xE467, 0x8F0D, 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120,\t0xE46B, 0x9122, 0xE46C, 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A,\n\t0xE46F, 0x9124, 0xE470, 0x9121, 0xE471, 0x911B, 0xE472, 0x917A,\t0xE473, 0x9172, 0xE474, 0x9179, 0xE475, 0x9173, 0xE476, 0x92A5,\n\t0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, 0xE47A, 0x927A,\t0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, 0x928D,\n\t0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279,\t0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE,\n\t0xE4A9, 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2,\t0xE4AD, 0x927D, 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A,\n\t0xE4B1, 0x9286, 0xE4B2, 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7,\t0xE4B5, 0x927E, 0xE4B6, 0x9287, 0xE4B7, 0x92A9, 0xE4B8, 0x929D,\n\t0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, 0x969E, 0xE4BC, 0x96A1,\t0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, 0xE4C0, 0x977A,\n\t0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, 0x9782,\t0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F,\n\t0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD,\t0xE4CD, 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907,\n\t0xE4D1, 0x999D, 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9,\t0xE4D5, 0x99BB, 0xE4D6, 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD,\n\t0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7,\t0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, 0x9B60, 0xE4E0, 0x9B61,\n\t0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, 0xE4E4, 0x9CF5,\t0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, 0x5130,\n\t0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6,\t0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD,\n\t0xE4F1, 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1,\t0xE4F5, 0x52EF, 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C,\n\t0xE4F9, 0x5635, 0xE4FA, 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649,\t0xE4FD, 0x5646, 0xE4FE, 0x5658, 0xE540, 0x565A, 0xE541, 0x5640,\n\t0xE542, 0x5633, 0xE543, 0x563D, 0xE544, 0x562C, 0xE545, 0x563E,\t0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, 0xE549, 0x571A,\n\t0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, 0x58A0,\t0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5,\n\t0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4,\t0xE556, 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03,\n\t0xE55A, 0x5AF8, 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01,\t0xE55E, 0x5B07, 0xE55F, 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67,\n\t0xE562, 0x5D99, 0xE563, 0x5D97, 0xE564, 0x5D9F, 0xE565, 0x5D92,\t0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, 0x5D95, 0xE569, 0x5DA0,\n\t0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, 0xE56D, 0x5D9E,\t0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, 0x5E5C,\n\t0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1,\t0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183,\n\t0xE57A, 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2,\t0xE57E, 0x6189, 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF,\n\t0xE5A4, 0x61AD, 0xE5A5, 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA,\t0xE5A8, 0x61A1, 0xE5A9, 0x618D, 0xE5AA, 0x6166, 0xE5AB, 0x61B3,\n\t0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, 0x6470, 0xE5AF, 0x6496,\t0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, 0xE5B3, 0x649C,\n\t0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, 0x648C,\t0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1,\n\t0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579,\t0xE5C0, 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5,\n\t0xE5C4, 0x66B0, 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7,\t0xE5C8, 0x66AA, 0xE5C9, 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06,\n\t0xE5CC, 0x6A17, 0xE5CD, 0x69E5, 0xE5CE, 0x69F8, 0xE5CF, 0x6A15,\t0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, 0x6A20, 0xE5D3, 0x69FF,\n\t0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, 0xE5D7, 0x6A1D,\t0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, 0x69EE,\n\t0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40,\t0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D,\n\t0xE5E4, 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04,\t0xE5E8, 0x6A18, 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6,\n\t0xE5EC, 0x6A26, 0xE5ED, 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16,\t0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2,\n\t0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, 0x6C00, 0xE5F7, 0x6BFF,\t0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, 0xE5FB, 0x6F7E,\n\t0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, 0x6F8D,\t0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F,\n\t0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76,\t0xE649, 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72,\n\t0xE64D, 0x6F52, 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94,\t0xE651, 0x6F93, 0xE652, 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61,\n\t0xE655, 0x6F6B, 0xE656, 0x6F7D, 0xE657, 0x6F67, 0xE658, 0x6F90,\t0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, 0x6F69, 0xE65C, 0x6F7F,\n\t0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, 0xE660, 0x6F6A,\t0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, 0x719B,\n\t0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9,\t0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E,\n\t0xE66D, 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C,\t0xE671, 0x71A7, 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A,\n\t0xE675, 0x7358, 0xE676, 0x7352, 0xE677, 0x735E, 0xE678, 0x735F,\t0xE679, 0x7360, 0xE67A, 0x735D, 0xE67B, 0x735B, 0xE67C, 0x7361,\n\t0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, 0x7362, 0xE6A2, 0x7487,\t0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, 0xE6A6, 0x7481,\n\t0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, 0x747C,\t0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E,\n\t0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D,\t0xE6B3, 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628,\n\t0xE6B7, 0x761B, 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E,\t0xE6BB, 0x769B, 0xE6BC, 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789,\n\t0xE6BF, 0x7788, 0xE6C0, 0x78CD, 0xE6C1, 0x78BB, 0xE6C2, 0x78CF,\t0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, 0x78CE, 0xE6C6, 0x78D4,\n\t0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, 0xE6CA, 0x78C9,\t0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, 0x799C,\n\t0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39,\t0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7,\n\t0xE6D7, 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE,\t0xE6DB, 0x7BAF, 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5,\n\t0xE6DF, 0x7CC5, 0xE6E0, 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB,\t0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7,\n\t0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, 0x7E03, 0xE6EA, 0x7DFA,\t0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, 0xE6EE, 0x7DF0,\n\t0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, 0x7FAC,\t0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB,\n\t0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8,\t0xE6FB, 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F,\n\t0xE740, 0x819E, 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199,\t0xE744, 0x8197, 0xE745, 0x8216, 0xE746, 0x824F, 0xE747, 0x8253,\n\t0xE748, 0x8252, 0xE749, 0x8250, 0xE74A, 0x824E, 0xE74B, 0x8251,\t0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, 0x850F, 0xE74F, 0x8500,\n\t0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, 0xE753, 0x850D,\t0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, 0x851C,\n\t0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508,\t0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2,\n\t0xE760, 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3,\t0xE764, 0x84FC, 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9,\n\t0xE768, 0x8516, 0xE769, 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D,\t0xE76C, 0x852E, 0xE76D, 0x8502, 0xE76E, 0x84FD, 0xE76F, 0x851E,\n\t0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, 0x8526, 0xE773, 0x84E7,\t0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, 0xE777, 0x84F9,\n\t0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, 0x850B,\t0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756,\n\t0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1,\t0xE7A6, 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B,\n\t0xE7AA, 0x8752, 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751,\t0xE7AE, 0x875E, 0xE7AF, 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750,\n\t0xE7B2, 0x874E, 0xE7B3, 0x875F, 0xE7B4, 0x875D, 0xE7B5, 0x876F,\t0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, 0x876E, 0xE7B9, 0x875C,\n\t0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, 0xE7BD, 0x8775,\t0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, 0x885A,\n\t0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B,\t0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906,\n\t0xE7CA, 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909,\t0xE7CE, 0x89A2, 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED,\n\t0xE7D2, 0x89F0, 0xE7D3, 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6,\t0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4,\n\t0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, 0x8AD7, 0xE7DD, 0x8ABE,\t0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, 0xE7E1, 0x8AC3,\n\t0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, 0x8C3E,\t0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF,\n\t0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD,\t0xE7EE, 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1,\n\t0xE7F2, 0x8D9B, 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25,\t0xE7F6, 0x8E24, 0xE7F7, 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B,\n\t0xE7FA, 0x8E16, 0xE7FB, 0x8E11, 0xE7FC, 0x8E19, 0xE7FD, 0x8E26,\t0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, 0x8E12, 0xE842, 0x8E18,\n\t0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, 0xE846, 0x8E1A,\t0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, 0x8F1A,\n\t0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17,\t0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067,\n\t0xE853, 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129,\t0xE857, 0x912A, 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E,\n\t0xE85B, 0x9185, 0xE85C, 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181,\t0xE85F, 0x9182, 0xE860, 0x9184, 0xE861, 0x9180, 0xE862, 0x92D0,\n\t0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, 0x92C0, 0xE866, 0x92D9,\t0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, 0xE86A, 0x92DF,\n\t0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, 0x92DD,\t0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8,\n\t0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6,\t0xE877, 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0,\n\t0xE87B, 0x92DE, 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3,\t0xE8A1, 0x92B5, 0xE8A2, 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4,\n\t0xE8A5, 0x957C, 0xE8A6, 0x95AC, 0xE8A7, 0x95AB, 0xE8A8, 0x95AE,\t0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, 0x96A2, 0xE8AC, 0x96D3,\n\t0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, 0xE8B0, 0x975A,\t0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, 0x97D0,\n\t0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826,\t0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B,\n\t0xE8BD, 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA,\t0xE8C1, 0x9911, 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917,\n\t0xE8C5, 0x9915, 0xE8C6, 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF,\t0xE8C9, 0x99D3, 0xE8CA, 0x99D4, 0xE8CB, 0x99CE, 0xE8CC, 0x99C9,\n\t0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, 0x99CB, 0xE8D0, 0x99D7,\t0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, 0xE8D4, 0x9AEB,\n\t0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, 0x9B46,\t0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71,\n\t0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70,\t0xE8E1, 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC,\n\t0xE8E5, 0x9CFA, 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7,\t0xE8E9, 0x9D07, 0xE8EA, 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB,\n\t0xE8ED, 0x9D08, 0xE8EE, 0x9D05, 0xE8EF, 0x9D04, 0xE8F0, 0x9E83,\t0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, 0x9F10, 0xE8F4, 0x511C,\n\t0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, 0xE8F8, 0x5111,\t0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, 0x5670,\n\t0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666,\t0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E,\n\t0xE946, 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8,\t0xE94A, 0x58BD, 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA,\n\t0xE94E, 0x58C2, 0xE94F, 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17,\t0xE952, 0x5B19, 0xE953, 0x5B1B, 0xE954, 0x5B21, 0xE955, 0x5B14,\n\t0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, 0x5B16, 0xE959, 0x5B28,\t0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, 0xE95D, 0x5BEF,\n\t0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, 0x5DA7,\t0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA,\n\t0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF,\t0xE96A, 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66,\n\t0xE96E, 0x5E6F, 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6,\t0xE972, 0x5EE8, 0xE973, 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC,\n\t0xE976, 0x619D, 0xE977, 0x61A8, 0xE978, 0x6196, 0xE979, 0x61C5,\t0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, 0x61C1, 0xE97D, 0x61CC,\n\t0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, 0xE9A3, 0x618C,\t0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, 0x64CF,\n\t0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3,\t0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533,\n\t0xE9B0, 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8,\t0xE9B4, 0x66BE, 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB,\n\t0xE9B8, 0x66CF, 0xE9B9, 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA,\t0xE9BC, 0x66CC, 0xE9BD, 0x6723, 0xE9BE, 0x6A34, 0xE9BF, 0x6A66,\n\t0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, 0x6A32, 0xE9C3, 0x6A68,\t0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, 0xE9C7, 0x6A76,\n\t0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, 0x6A5A,\t0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A,\n\t0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54,\t0xE9D4, 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C,\n\t0xE9D8, 0x6A5E, 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D,\t0xE9DC, 0x6A4E, 0xE9DD, 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54,\n\t0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB,\t0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, 0x6C04, 0xE9E7, 0x6C03,\n\t0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, 0xE9EB, 0x6FA3,\t0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, 0x6FC8,\n\t0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E,\t0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5,\n\t0xE9F8, 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA,\t0xE9FC, 0x6FCF, 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2,\n\t0xEA41, 0x6FC9, 0xEA42, 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF,\t0xEA45, 0x6FB2, 0xEA46, 0x6FB0, 0xEA47, 0x71C5, 0xEA48, 0x71C2,\n\t0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, 0x71D6, 0xEA4C, 0x71C0,\t0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, 0xEA50, 0x71CA,\n\t0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, 0x71D8,\t0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB,\n\t0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366,\t0xEA5D, 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B,\n\t0xEA61, 0x736A, 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0,\t0xEA65, 0x7494, 0xEA66, 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1,\n\t0xEA69, 0x750B, 0xEA6A, 0x7580, 0xEA6B, 0x762F, 0xEA6C, 0x762D,\t0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, 0x7633, 0xEA70, 0x763C,\n\t0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, 0xEA74, 0x76BB,\t0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, 0x77A1,\n\t0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3,\t0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD,\n\t0xEAA3, 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE,\t0xEAA7, 0x78E3, 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2,\n\t0xEAAB, 0x78ED, 0xEAAC, 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4,\t0xEAAF, 0x7A44, 0xEAB0, 0x7A48, 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6,\n\t0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, 0x7AB1, 0xEAB6, 0x7AB7,\t0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, 0xEABA, 0x7BDD,\n\t0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, 0x7BE8,\t0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2,\n\t0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF,\t0xEAC7, 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0,\n\t0xEACB, 0x7CD1, 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17,\t0xEACF, 0x7E0C, 0xEAD0, 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13,\n\t0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A,\t0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, 0x7E0F, 0xEADA, 0x7E16,\n\t0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, 0xEADE, 0x7E24,\t0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, 0x7F7A,\n\t0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029,\t0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE,\n\t0xEAEB, 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0,\t0xEAEF, 0x81AC, 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7,\n\t0xEAF3, 0x81A7, 0xEAF4, 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256,\t0xEAF7, 0x8257, 0xEAF8, 0x8556, 0xEAF9, 0x8545, 0xEAFA, 0x856B,\n\t0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, 0x8561, 0xEAFE, 0x8558,\t0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, 0xEB43, 0x8541,\n\t0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, 0x8547,\t0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571,\n\t0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555,\t0xEB50, 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566,\n\t0xEB54, 0x855D, 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C,\t0xEB58, 0x8663, 0xEB59, 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B,\n\t0xEB5C, 0x878F, 0xEB5D, 0x8797, 0xEB5E, 0x8793, 0xEB5F, 0x8792,\t0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, 0x8796, 0xEB63, 0x8798,\n\t0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, 0xEB67, 0x8785,\t0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, 0x8784,\n\t0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789,\t0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D,\n\t0xEB74, 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922,\t0xEB78, 0x8929, 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C,\n\t0xEB7C, 0x891F, 0xEB7D, 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2,\t0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD,\n\t0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, 0x8ADF, 0xEBA9, 0x8AF0,\t0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, 0xEBAD, 0x8AE8,\n\t0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, 0x8C91,\t0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE,\n\t0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C,\t0xEBBA, 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33,\n\t0xEBBE, 0x8E3E, 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45,\t0xEBC2, 0x8E36, 0xEBC3, 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41,\n\t0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36,\t0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, 0x8F32, 0xEBCD, 0x8F39,\n\t0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, 0xEBD1, 0x9079,\t0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, 0x9133,\n\t0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190,\t0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327,\n\t0xEBDE, 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306,\t0xEBE2, 0x930F, 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C,\n\t0xEBE6, 0x931B, 0xEBE7, 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301,\t0xEBEA, 0x9346, 0xEBEB, 0x932D, 0xEBEC, 0x930E, 0xEBED, 0x930D,\n\t0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, 0x92FA, 0xEBF1, 0x9325,\t0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, 0xEBF5, 0x9334,\n\t0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, 0x9329,\t0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314,\n\t0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309,\t0xEC43, 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC,\n\t0xEC47, 0x95CD, 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA,\t0xEC4B, 0x95B6, 0xEC4C, 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD,\n\t0xEC4F, 0x96A9, 0xEC50, 0x96D4, 0xEC51, 0x970B, 0xEC52, 0x9712,\t0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, 0x9797, 0xEC56, 0x9794,\n\t0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, 0xEC5A, 0x982F,\t0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, 0x9927,\n\t0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC,\t0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3,\n\t0xEC67, 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9,\t0xEC6B, 0x9ABF, 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6,\n\t0xEC6F, 0x9AFA, 0xEC70, 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33,\t0xEC73, 0x9B80, 0xEC74, 0x9B85, 0xEC75, 0x9B87, 0xEC76, 0x9B7C,\n\t0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, 0x9B82, 0xEC7A, 0x9B93,\t0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, 0xEC7E, 0x9B95,\n\t0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, 0x9D17,\t0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29,\n\t0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10,\t0xECAD, 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86,\n\t0xECB1, 0x9E87, 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5,\t0xECB5, 0x9ED6, 0xECB6, 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D,\n\t0xECB9, 0x5126, 0xECBA, 0x5125, 0xECBB, 0x5122, 0xECBC, 0x5124,\t0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, 0x52F4, 0xECC0, 0x5693,\n\t0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, 0xECC4, 0x5684,\t0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, 0x567F,\n\t0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF,\t0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32,\n\t0xECD1, 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26,\t0xECD5, 0x5B2F, 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1,\n\t0xECD9, 0x5BF2, 0xECDA, 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A,\t0xECDD, 0x5FBE, 0xECDE, 0x5FBB, 0xECDF, 0x61C3, 0xECE0, 0x61B5,\n\t0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, 0x61E0, 0xECE4, 0x61E5,\t0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, 0xECE8, 0x64EF,\n\t0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, 0x64E4,\t0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6,\n\t0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96,\t0xECF5, 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F,\n\t0xECF9, 0x6A9B, 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87,\t0xECFD, 0x6A93, 0xECFE, 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83,\n\t0xED42, 0x6AA8, 0xED43, 0x6AA4, 0xED44, 0x6A91, 0xED45, 0x6A7F,\t0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, 0x6A85, 0xED49, 0x6A8C,\n\t0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, 0xED4D, 0x6C09,\t0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, 0x6FD4,\n\t0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7,\t0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD,\n\t0xED5A, 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1,\t0xED5E, 0x71E8, 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0,\n\t0xED62, 0x71E2, 0xED63, 0x7373, 0xED64, 0x736E, 0xED65, 0x736F,\t0xED66, 0x7497, 0xED67, 0x74B2, 0xED68, 0x74AB, 0xED69, 0x7490,\n\t0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, 0x74B1, 0xED6D, 0x74A5,\t0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, 0xED71, 0x7512,\n\t0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, 0x7648,\t0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9,\n\t0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7,\t0xED7E, 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8,\n\t0xEDA4, 0x77F0, 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902,\t0xEDA8, 0x78FB, 0xEDA9, 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905,\n\t0xEDAC, 0x78F9, 0xEDAD, 0x78FE, 0xEDAE, 0x7904, 0xEDAF, 0x79AB,\t0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, 0x7A5B, 0xEDB3, 0x7A56,\n\t0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, 0xEDB7, 0x7ABE,\t0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, 0x7C0F,\n\t0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB,\t0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3,\n\t0xEDC4, 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01,\t0xEDC8, 0x7BF8, 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0,\n\t0xEDCC, 0x7BF1, 0xEDCD, 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8,\t0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, 0xEDD2, 0x7E42, 0xEDD3, 0x7E33,\n\t0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, 0x7E2A, 0xEDD7, 0x7E49,\t0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, 0xEDDB, 0x7E4C,\n\t0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, 0x7E44,\t0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E,\n\t0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C,\t0xEDE8, 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA,\n\t0xEDEC, 0x81C5, 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9,\t0xEDF0, 0x825B, 0xEDF1, 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583,\n\t0xEDF4, 0x8580, 0xEDF5, 0x858F, 0xEDF6, 0x85A7, 0xEDF7, 0x8595,\t0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, 0x85A3, 0xEDFB, 0x857B,\n\t0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, 0xEE40, 0x8577,\t0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, 0x857A,\n\t0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596,\t0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D,\n\t0xEE4D, 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588,\t0xEE51, 0x8585, 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598,\n\t0xEE55, 0x8590, 0xEE56, 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE,\t0xEE59, 0x87AA, 0xEE5A, 0x87AD, 0xEE5B, 0x87C5, 0xEE5C, 0x87B0,\n\t0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, 0x87B5, 0xEE60, 0x87BC,\t0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, 0xEE64, 0x87C2,\n\t0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, 0x87C4,\t0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF,\n\t0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2,\t0xEE71, 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E,\n\t0xEE75, 0x8941, 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942,\t0xEE79, 0x89AD, 0xEE7A, 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2,\n\t0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, 0xEEA1, 0x8B18, 0xEEA2, 0x8B16,\t0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, 0x8B0B, 0xEEA6, 0x8B22,\n\t0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, 0xEEAA, 0x8B07,\t0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, 0x8B1C,\n\t0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70,\t0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95,\n\t0xEEB7, 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E,\t0xEEBB, 0x8E4D, 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C,\n\t0xEEBF, 0x8E47, 0xEEC0, 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085,\t0xEEC3, 0x907E, 0xEEC4, 0x9138, 0xEEC5, 0x919A, 0xEEC6, 0x91A2,\n\t0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, 0x919F, 0xEECA, 0x91A1,\t0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, 0xEECE, 0x9383,\n\t0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, 0x9347,\t0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376,\n\t0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360,\t0xEEDB, 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A,\n\t0xEEDF, 0x9379, 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352,\t0xEEE3, 0x934F, 0xEEE4, 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B,\n\t0xEEE7, 0x9361, 0xEEE8, 0x935E, 0xEEE9, 0x9363, 0xEEEA, 0x9367,\t0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, 0x9359, 0xEEEE, 0x95C7,\n\t0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, 0xEEF2, 0x95C5,\t0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, 0x96AC,\n\t0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D,\t0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C,\n\t0xEF40, 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4,\t0xEF44, 0x97F1, 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A,\n\t0xEF48, 0x9849, 0xEF49, 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925,\t0xEF4C, 0x992B, 0xEF4D, 0x992C, 0xEF4E, 0x992A, 0xEF4F, 0x9933,\n\t0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, 0x992D, 0xEF53, 0x9931,\t0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, 0xEF57, 0x99A1,\n\t0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, 0x99F7,\t0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB,\n\t0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03,\t0xEF64, 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01,\n\t0xEF68, 0x9AFC, 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8,\t0xEF6C, 0x9B9E, 0xEF6D, 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1,\n\t0xEF70, 0x9BA5, 0xEF71, 0x9BA4, 0xEF72, 0x9B86, 0xEF73, 0x9BA2,\t0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, 0x9D33, 0xEF77, 0x9D41,\n\t0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, 0xEF7B, 0x9D2F,\t0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, 0x9D45,\n\t0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37,\t0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D,\n\t0xEFAA, 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0,\t0xEFAE, 0x9EC8, 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF,\n\t0xEFB2, 0x9F24, 0xEFB3, 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54,\t0xEFB6, 0x9FA0, 0xEFB7, 0x5131, 0xEFB8, 0x512D, 0xEFB9, 0x512E,\n\t0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, 0x5697, 0xEFBD, 0x569A,\t0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, 0xEFC1, 0x5B3C,\n\t0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, 0x5E6D,\t0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED,\n\t0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0,\t0xEFCE, 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF,\n\t0xEFD2, 0x6504, 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501,\t0xEFD6, 0x6503, 0xEFD7, 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB,\n\t0xEFDA, 0x66DA, 0xEFDB, 0x66DB, 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5,\t0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, 0x6AE1, 0xEFE1, 0x6AC6,\n\t0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, 0xEFE5, 0x6AC7,\t0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, 0x6BC9,\n\t0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D,\t0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E,\n\t0xEFF2, 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026,\t0xEFF6, 0x6FFC, 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201,\n\t0xEFFA, 0x71FF, 0xEFFB, 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD,\t0xEFFE, 0x7376, 0xF040, 0x74B8, 0xF041, 0x74C0, 0xF042, 0x74B5,\n\t0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, 0x74B6, 0xF046, 0x74BB,\t0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, 0xF04A, 0x765C,\n\t0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, 0x7653,\t0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD,\n\t0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF,\t0xF057, 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909,\n\t0xF05B, 0x7910, 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD,\t0xF05F, 0x79AC, 0xF060, 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29,\n\t0xF063, 0x7C19, 0xF064, 0x7C20, 0xF065, 0x7C1F, 0xF066, 0x7C2D,\t0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, 0x7C28, 0xF06A, 0x7C22,\n\t0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, 0xF06E, 0x7E50,\t0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, 0x7E62,\n\t0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57,\t0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7,\n\t0xF07B, 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2,\t0xF0A1, 0x81D0, 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4,\n\t0xF0A5, 0x85C6, 0xF0A6, 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2,\t0xF0A9, 0x85B3, 0xF0AA, 0x85B5, 0xF0AB, 0x85BD, 0xF0AC, 0x85C7,\n\t0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, 0x85CB, 0xF0B0, 0x85CE,\t0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, 0xF0B4, 0x85B6,\n\t0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, 0x85B7,\t0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6,\n\t0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA,\t0xF0C1, 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4,\n\t0xF0C5, 0x87D4, 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED,\t0xF0C9, 0x87D8, 0xF0CA, 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7,\n\t0xF0CD, 0x87D9, 0xF0CE, 0x8801, 0xF0CF, 0x87F4, 0xF0D0, 0x87E8,\t0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, 0x894B, 0xF0D4, 0x894F,\n\t0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, 0xF0D8, 0x8951,\t0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, 0x8B23,\n\t0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47,\t0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31,\n\t0xF0E5, 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36,\t0xF0E9, 0x8B2E, 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D,\n\t0xF0ED, 0x8B3A, 0xF0EE, 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99,\t0xF0F1, 0x8C98, 0xF0F2, 0x8C97, 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04,\n\t0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, 0x8E5C, 0xF0F8, 0x8E62,\t0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, 0xF0FC, 0x8E5E,\n\t0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, 0x8E5A,\t0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54,\n\t0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B,\t0xF14A, 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E,\n\t0xF14E, 0x91A8, 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF,\t0xF152, 0x91AA, 0xF153, 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392,\n\t0xF156, 0x93B7, 0xF157, 0x939B, 0xF158, 0x939D, 0xF159, 0x9389,\t0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, 0x93AA, 0xF15D, 0x939E,\n\t0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, 0xF161, 0x9399,\t0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, 0x9391,\n\t0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4,\t0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3,\n\t0xF16E, 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA,\t0xF172, 0x5DC2, 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD,\n\t0xF176, 0x9723, 0xF177, 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC,\t0xF17A, 0x97AE, 0xF17B, 0x97A8, 0xF17C, 0x97AB, 0xF17D, 0x97A4,\n\t0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, 0x97A5, 0xF1A3, 0x97D7,\t0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, 0xF1A7, 0x97FA,\n\t0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, 0x98B8,\t0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F,\n\t0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04,\t0xF1B4, 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07,\n\t0xF1B8, 0x9A06, 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08,\t0xF1BC, 0x9B04, 0xF1BD, 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35,\n\t0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7,\t0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, 0x9BBF, 0xF1C7, 0x9BC1,\n\t0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, 0xF1CB, 0x9BB6,\t0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, 0x9D5C,\n\t0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B,\t0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C,\n\t0xF1D8, 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F,\t0xF1DC, 0x9D58, 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C,\n\t0xF1E0, 0x9EDF, 0xF1E1, 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16,\t0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29,\n\t0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, 0x9F55, 0xF1EB, 0x5134,\t0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, 0xF1EF, 0x53B4,\n\t0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, 0x56A7,\t0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD,\n\t0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E,\t0xF1FC, 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF,\n\t0xF241, 0x61FB, 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D,\t0xF245, 0x6509, 0xF246, 0x650C, 0xF247, 0x650E, 0xF248, 0x6584,\n\t0xF249, 0x65DE, 0xF24A, 0x65DD, 0xF24B, 0x66DE, 0xF24C, 0x6AE7,\t0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, 0x6AD1, 0xF250, 0x6AD9,\n\t0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, 0xF254, 0x6AD0,\t0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, 0x6ADE,\n\t0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019,\t0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B,\n\t0xF261, 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029,\t0xF265, 0x7017, 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A,\n\t0xF269, 0x720C, 0xF26A, 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202,\t0xF26D, 0x7205, 0xF26E, 0x72A5, 0xF26F, 0x72A6, 0xF270, 0x72A4,\n\t0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, 0x74CB, 0xF274, 0x74C5,\t0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, 0xF278, 0x7660,\n\t0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, 0x77F1,\t0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C,\n\t0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67,\t0xF2A7, 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39,\n\t0xF2AB, 0x7C2C, 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA,\t0xF2AF, 0x7E76, 0xF2B0, 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70,\n\t0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72,\t0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, 0x7F4B, 0xF2BA, 0x7F4A,\n\t0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, 0xF2BE, 0x7FFD,\t0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, 0x81D5,\n\t0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB,\t0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1,\n\t0xF2CB, 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC,\t0xF2CF, 0x85F2, 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF,\n\t0xF2D3, 0x85E3, 0xF2D4, 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0,\t0xF2D7, 0x85E6, 0xF2D8, 0x85EF, 0xF2D9, 0x85DE, 0xF2DA, 0x85E2,\n\t0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, 0x8803, 0xF2DE, 0x87F6,\t0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, 0xF2E2, 0x880B,\n\t0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, 0x87FF,\t0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A,\n\t0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C,\t0xF2EF, 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988,\n\t0xF2F3, 0x89B7, 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50,\t0xF2F7, 0x8B48, 0xF2F8, 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53,\n\t0xF2FB, 0x8B56, 0xF2FC, 0x8B54, 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55,\t0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, 0x8B52, 0xF343, 0x8B57,\n\t0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, 0xF347, 0x8C9A,\t0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, 0x8DAC,\n\t0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D,\t0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F,\n\t0xF354, 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51,\t0xF358, 0x8F4F, 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4,\n\t0xF35C, 0x9140, 0xF35D, 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD,\t0xF360, 0x93DE, 0xF361, 0x93C7, 0xF362, 0x93CF, 0xF363, 0x93C2,\n\t0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, 0x93F9, 0xF367, 0x93EC,\t0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, 0xF36B, 0x93E6,\n\t0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, 0x93E3,\t0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0,\n\t0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA,\t0xF378, 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B,\n\t0xF37C, 0x972C, 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3,\t0xF3A2, 0x97B7, 0xF3A3, 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE,\n\t0xF3A6, 0x97DF, 0xF3A7, 0x985C, 0xF3A8, 0x9859, 0xF3A9, 0x985D,\t0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, 0x98BD, 0xF3AD, 0x98BB,\n\t0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, 0xF3B1, 0x9943,\t0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, 0x9A15,\n\t0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B,\t0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23,\n\t0xF3BE, 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2,\t0xF3C2, 0x9B0B, 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C,\n\t0xF3C6, 0x9B37, 0xF3C7, 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0,\t0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2,\n\t0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, 0x9BD7, 0xF3D1, 0x9BEC,\t0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, 0xF3D5, 0x9BD5,\n\t0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, 0x9D81,\t0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71,\n\t0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B,\t0xF3E2, 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74,\n\t0xF3E6, 0x9D75, 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85,\t0xF3EA, 0x9D73, 0xF3EB, 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F,\n\t0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, 0xF3F0, 0x9D87, 0xF3F1, 0x9D68,\t0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, 0x9EC0, 0xF3F5, 0x9EFC,\n\t0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, 0xF3F9, 0x9F4D,\t0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, 0x5337,\n\t0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3,\t0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE,\n\t0xF447, 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9,\t0xF44B, 0x6517, 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513,\n\t0xF44F, 0x65DF, 0xF450, 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4,\t0xF453, 0x6AF3, 0xF454, 0x6AF0, 0xF455, 0x6AEA, 0xF456, 0x6AE8,\n\t0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, 0x6AEE, 0xF45A, 0x6AEF,\t0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, 0xF45E, 0x7037,\n\t0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, 0x7038,\t0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040,\n\t0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213,\t0xF46B, 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C,\n\t0xF46F, 0x74BA, 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE,\t0xF473, 0x76ED, 0xF474, 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF,\n\t0xF477, 0x77CD, 0xF478, 0x77F2, 0xF479, 0x7925, 0xF47A, 0x7923,\t0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, 0x7924, 0xF47E, 0x7929,\n\t0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, 0xF4A4, 0x7A6D,\t0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, 0x7C4A,\n\t0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B,\t0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA,\n\t0xF4B1, 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9,\t0xF4B5, 0x820B, 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622,\n\t0xF4B9, 0x85FF, 0xF4BA, 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B,\t0xF4BD, 0x8600, 0xF4BE, 0x85F6, 0xF4BF, 0x8604, 0xF4C0, 0x8609,\n\t0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, 0x85FD, 0xF4C4, 0x8819,\t0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, 0xF4C8, 0x8813,\n\t0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, 0x89B9,\t0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D,\n\t0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67,\t0xF4D5, 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88,\n\t0xF4D9, 0x8E84, 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57,\t0xF4DD, 0x8F55, 0xF4DE, 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D,\n\t0xF4E1, 0x9143, 0xF4E2, 0x9141, 0xF4E3, 0x91B7, 0xF4E4, 0x91B5,\t0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, 0x940B, 0xF4E8, 0x9413,\n\t0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, 0xF4EC, 0x9414,\t0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, 0x9428,\n\t0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400,\t0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416,\n\t0xF4F9, 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8,\t0xF4FD, 0x940A, 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C,\n\t0xF542, 0x93F6, 0xF543, 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE,\t0xF546, 0x95E0, 0xF547, 0x95DF, 0xF548, 0x972E, 0xF549, 0x972F,\n\t0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, 0x97FD, 0xF54D, 0x97FE,\t0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, 0xF551, 0x985F,\n\t0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, 0x994E,\t0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953,\n\t0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C,\t0xF55E, 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E,\n\t0xF562, 0x9A38, 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA,\t0xF566, 0x9AC6, 0xF567, 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11,\n\t0xF56A, 0x9C0B, 0xF56B, 0x9C08, 0xF56C, 0x9BF7, 0xF56D, 0x9C05,\t0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, 0x9C40, 0xF571, 0x9C07,\n\t0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, 0xF575, 0x9C14,\t0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, 0x9DA4,\n\t0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90,\t0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C,\n\t0xF5A4, 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A,\t0xF5A8, 0x9DA2, 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3,\n\t0xF5AC, 0x9DBF, 0xF5AD, 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6,\t0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A,\n\t0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, 0x9EE7, 0xF5B7, 0x9EE6,\t0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, 0xF5BB, 0x9F60,\n\t0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, 0x9F91,\t0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297,\n\t0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48,\t0xF5C8, 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1,\n\t0xF5CC, 0x61FD, 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC,\t0xF5D0, 0x6B03, 0xF5D1, 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043,\n\t0xF5D4, 0x7044, 0xF5D5, 0x704A, 0xF5D6, 0x7048, 0xF5D7, 0x7049,\t0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, 0x721D, 0xF5DB, 0x721A,\n\t0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, 0xF5DF, 0x766A,\t0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, 0x792F,\n\t0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A,\t0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86,\n\t0xF5EC, 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030,\t0xF5F0, 0x81DD, 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626,\n\t0xF5F4, 0x861F, 0xF5F5, 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619,\t0xF5F8, 0x8627, 0xF5F9, 0x862E, 0xF5FA, 0x8621, 0xF5FB, 0x8620,\n\t0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, 0x8625, 0xF640, 0x8829,\t0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, 0xF644, 0x8824,\n\t0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, 0x896D,\t0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA,\n\t0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A,\t0xF651, 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF,\n\t0xF655, 0x8E8E, 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B,\t0xF659, 0x8F5D, 0xF65A, 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145,\n\t0xF65D, 0x91B9, 0xF65E, 0x943F, 0xF65F, 0x943B, 0xF660, 0x9436,\t0xF661, 0x9429, 0xF662, 0x943D, 0xF663, 0x943C, 0xF664, 0x9430,\n\t0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, 0xF668, 0x942C,\t0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, 0x95E4,\n\t0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF,\t0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6,\n\t0xF675, 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39,\t0xF679, 0x9A3D, 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42,\n\t0xF67D, 0x9A41, 0xF67E, 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD,\t0xF6A3, 0x9B15, 0xF6A4, 0x9B17, 0xF6A5, 0x9B18, 0xF6A6, 0x9B16,\n\t0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, 0x9C2B, 0xF6AA, 0x9C1D,\t0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, 0xF6AE, 0x9C28,\n\t0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, 0x9DB7,\t0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7,\n\t0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5,\t0xF6BB, 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE,\n\t0xF6BF, 0x9DB9, 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8,\t0xF6C3, 0x9DB1, 0xF6C4, 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3,\n\t0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C,\t0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, 0x9EED, 0xF6CE, 0x9F1B,\n\t0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, 0xF6D2, 0x9F4E,\t0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, 0x4EB9,\n\t0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971,\t0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1,\n\t0xF6DF, 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526,\t0xF6E3, 0x6522, 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09,\n\t0xF6E7, 0x6C0D, 0xF6E8, 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057,\t0xF6EB, 0x7052, 0xF6EC, 0x721E, 0xF6ED, 0x721F, 0xF6EE, 0x72A9,\n\t0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, 0x74D5, 0xF6F2, 0x74D9,\t0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, 0xF6F6, 0x7935,\n\t0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, 0x7C57,\t0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A,\n\t0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F,\t0xF744, 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634,\n\t0xF748, 0x8635, 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632,\t0xF74C, 0x8636, 0xF74D, 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826,\n\t0xF750, 0x882A, 0xF751, 0x8825, 0xF752, 0x8971, 0xF753, 0x89BF,\t0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, 0x8B7E, 0xF757, 0x8B84,\n\t0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, 0xF75B, 0x8B7F,\t0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, 0x8E9A,\n\t0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97,\t0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C,\n\t0xF768, 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F,\t0xF76C, 0x9447, 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449,\n\t0xF770, 0x9446, 0xF771, 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A,\t0xF774, 0x9869, 0xF775, 0x98CB, 0xF776, 0x9954, 0xF777, 0x995B,\n\t0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, 0x9A54, 0xF77B, 0x9A4C,\t0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, 0xF7A1, 0x9A49,\n\t0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, 0x9B19,\t0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55,\n\t0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44,\t0xF7AE, 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C,\n\t0xF7B2, 0x9C37, 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D,\t0xF7B6, 0x9C36, 0xF7B7, 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE,\n\t0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC,\t0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, 0x9DE9, 0xF7C1, 0x9DD9,\n\t0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, 0xF7C5, 0x9DD5,\t0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, 0x9F35,\n\t0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B,\t0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299,\n\t0xF7D2, 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D,\t0xF7D6, 0x5DD8, 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201,\n\t0xF7DA, 0x6203, 0xF7DB, 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525,\t0xF7DE, 0x6596, 0xF7DF, 0x66EB, 0xF7E0, 0x6B11, 0xF7E1, 0x6B12,\n\t0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, 0x705B, 0xF7E5, 0x705A,\t0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, 0xF7E9, 0x7383,\n\t0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, 0x7C66,\t0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640,\n\t0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B,\t0xF7F6, 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E,\n\t0xF7FA, 0x8833, 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973,\t0xF7FE, 0x89FE, 0xF840, 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B,\n\t0xF843, 0x8B88, 0xF844, 0x8C45, 0xF845, 0x8D19, 0xF846, 0x8E98,\t0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, 0x91BC, 0xF84A, 0x9462,\n\t0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, 0xF84E, 0x945E,\t0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, 0x9A56,\n\t0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20,\t0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A,\n\t0xF85B, 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59,\t0xF85F, 0x9C4C, 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7,\n\t0xF863, 0x9DEF, 0xF864, 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8,\t0xF867, 0x9DE4, 0xF868, 0x9DF6, 0xF869, 0x9DE1, 0xF86A, 0x9DEE,\n\t0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, 0x9DF0, 0xF86E, 0x9DE2,\t0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, 0xF872, 0x9DE8,\n\t0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, 0x9EF2,\t0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38,\n\t0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F,\t0xF8A1, 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F,\n\t0xF8A5, 0x56D3, 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D,\t0xF8A9, 0x652D, 0xF8AA, 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13,\n\t0xF8AD, 0x705F, 0xF8AE, 0x7061, 0xF8AF, 0x705D, 0xF8B0, 0x7060,\t0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, 0x74E5, 0xF8B4, 0x77D5,\n\t0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, 0xF8B8, 0x7C6A,\t0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, 0x8643,\n\t0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B,\t0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F,\n\t0xF8C5, 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD,\t0xF8C9, 0x91C2, 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469,\n\t0xF8CD, 0x96E5, 0xF8CE, 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747,\t0xF8D1, 0x97C7, 0xF8D2, 0x97E5, 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5,\n\t0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, 0x9C67, 0xF8D8, 0x9C66,\t0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, 0xF8DC, 0x9E02,\n\t0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, 0x9E06,\t0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09,\n\t0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0,\t0xF8E9, 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75,\n\t0xF8ED, 0x9F76, 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8,\t0xF8F1, 0x6B18, 0xF8F2, 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A,\n\t0xF8F5, 0x7062, 0xF8F6, 0x7226, 0xF8F7, 0x72AA, 0xF8F8, 0x77D8,\t0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, 0x7C69, 0xF8FC, 0x7C6B,\n\t0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, 0xF941, 0x7E9B,\t0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, 0x8646,\n\t0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A,\t0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98,\n\t0xF94E, 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3,\t0xF952, 0x946E, 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471,\n\t0xF956, 0x9473, 0xF957, 0x9749, 0xF958, 0x9872, 0xF959, 0x995F,\t0xF95A, 0x9C68, 0xF95B, 0x9C6E, 0xF95C, 0x9C6D, 0xF95D, 0x9E0B,\n\t0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, 0x9E0F, 0xF961, 0x9E12,\t0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, 0xF965, 0x9F09,\n\t0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, 0x9F7A,\t0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F,\n\t0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3,\t0xF972, 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475,\n\t0xF976, 0x9A60, 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71,\t0xF97A, 0x9C75, 0xF97B, 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6,\n\t0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, 0xF9A2, 0x7068, 0xF9A3, 0x7065,\t0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, 0x883E, 0xF9A7, 0x883D,\n\t0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, 0xF9AB, 0x8EA9,\t0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, 0x9874,\n\t0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64,\t0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15,\n\t0xF9B8, 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E,\t0xF9BC, 0x7227, 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482,\n\t0xF9C0, 0x9480, 0xF9C1, 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68,\t0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, 0xF9C6, 0x7229, 0xF9C7, 0x864B,\n\t0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, 0x9C79, 0xF9CB, 0x9EB7,\t0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, 0xF9CF, 0x9E1D,\n\t0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, 0x9F7E,\t0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9,\n\t0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7,\t0xF9DC, 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557,\n\t0xF9E0, 0x2560, 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A,\t0xF9E4, 0x2569, 0xF9E5, 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564,\n\t0xF9E8, 0x2555, 0xF9E9, 0x255E, 0xF9EA, 0x256A, 0xF9EB, 0x2561,\t0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, 0x255B, 0xF9EF, 0x2553,\n\t0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, 0xF9F3, 0x256B,\t0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, 0x255C,\n\t0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E,\t0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0\n};\n#endif\n\n#if FF_CODE_PAGE == 437 || FF_CODE_PAGE == 0\nstatic const WCHAR uc437[] = {\t/*  CP437(U.S.) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,\n\t0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 720 || FF_CODE_PAGE == 0\nstatic const WCHAR uc720[] = {\t/*  CP720(Arabic) to Unicode conversion table */\n\t0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000,\n\t0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627,\n\t0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A,\n\t0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 737 || FF_CODE_PAGE == 0\nstatic const WCHAR uc737[] = {\t/*  CP737(Greek) to Unicode conversion table */\n\t0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0,\n\t0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8,\n\t0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E,\n\t0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 771 || FF_CODE_PAGE == 0\nstatic const WCHAR uc771[] = {\t/*  CP771(KBL) to Unicode conversion table */\n\t0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,\n\t0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,\n\t0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D,\n\t0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,\n\t0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 775 || FF_CODE_PAGE == 0\nstatic const WCHAR uc775[] = {\t/*  CP775(Baltic) to Unicode conversion table */\n\t0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5,\n\t0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4,\n\t0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D,\n\t0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019,\n\t0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 850 || FF_CODE_PAGE == 0\nstatic const WCHAR uc850[] = {\t/*  CP850(Latin 1) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,\n\t0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4,\n\t0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580,\n\t0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4,\n\t0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 852 || FF_CODE_PAGE == 0\nstatic const WCHAR uc852[] = {\t/*  CP852(Latin 2) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106,\n\t0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4,\n\t0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580,\n\t0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4,\n\t0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 855 || FF_CODE_PAGE == 0\nstatic const WCHAR uc855[] = {\t/*  CP855(Cyrillic) to Unicode conversion table */\n\t0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408,\n\t0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A,\n\t0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4,\n\t0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580,\n\t0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116,\n\t0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 857 || FF_CODE_PAGE == 0\nstatic const WCHAR uc857[] = {\t/*  CP857(Turkish) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5,\n\t0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4,\n\t0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580,\n\t0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4,\n\t0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 860 || FF_CODE_PAGE == 0\nstatic const WCHAR uc860[] = {\t/*  CP860(Portuguese) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2,\n\t0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 861 || FF_CODE_PAGE == 0\nstatic const WCHAR uc861[] = {\t/*  CP861(Icelandic) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5,\n\t0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 862 || FF_CODE_PAGE == 0\nstatic const WCHAR uc862[] = {\t/*  CP862(Hebrew) to Unicode conversion table */\n\t0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,\n\t0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 863 || FF_CODE_PAGE == 0\nstatic const WCHAR uc863[] = {\t/*  CP863(Canadian French) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0,\n\t0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192,\n\t0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 864 || FF_CODE_PAGE == 0\nstatic const WCHAR uc864[] = {\t/*  CP864(Arabic) to Unicode conversion table */\n\t0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518,\n\t0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000,\n\t0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5,\n\t0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F,\n\t0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9,\n\t0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9,\n\t0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1,\n\t0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000\n};\n#endif\n#if FF_CODE_PAGE == 865 || FF_CODE_PAGE == 0\nstatic const WCHAR uc865[] = {\t/*  CP865(Nordic) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,\n\t0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 866 || FF_CODE_PAGE == 0\nstatic const WCHAR uc866[] = {\t/*  CP866(Russian) to Unicode conversion table */\n\t0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,\n\t0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,\n\t0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,\n\t0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 869 || FF_CODE_PAGE == 0\nstatic const WCHAR uc869[] = {\t/*  CP869(Greek 2) to Unicode conversion table */\n\t0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389,\n\t0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF,\n\t0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3,\n\t0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580,\n\t0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384,\n\t0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0\n};\n#endif\n\n\n\n\n/*------------------------------------------------------------------------*/\n/* OEM <==> Unicode conversions for static code page configuration        */\n/* SBCS fixed code page                                                   */\n/*------------------------------------------------------------------------*/\n\n#if FF_CODE_PAGE != 0 && FF_CODE_PAGE < 900\nWCHAR ff_uni2oem (\t/* Returns OEM code character, zero on error */\n\tDWORD\tuni,\t/* UTF-16 encoded character to be converted */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tWCHAR c = 0;\n\tconst WCHAR *p = CVTBL(uc, FF_CODE_PAGE);\n\n\n\tif (uni < 0x80) {\t/* ASCII? */\n\t\tc = (WCHAR)uni;\n\n\t} else {\t\t\t/* Non-ASCII */\n\t\tif (uni < 0x10000 && cp == FF_CODE_PAGE) {\t/* Is it in BMP and valid code page? */\n\t\t\tfor (c = 0; c < 0x80 && uni != p[c]; c++) ;\n\t\t\tc = (c + 0x80) & 0xFF;\n\t\t}\n\t}\n\n\treturn c;\n}\n\nWCHAR ff_oem2uni (\t/* Returns Unicode character, zero on error */\n\tWCHAR\toem,\t/* OEM code to be converted */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tWCHAR c = 0;\n\tconst WCHAR *p = CVTBL(uc, FF_CODE_PAGE);\n\n\n\tif (oem < 0x80) {\t/* ASCII? */\n\t\tc = oem;\n\n\t} else {\t\t\t/* Extended char */\n\t\tif (cp == FF_CODE_PAGE) {\t/* Is it a valid code page? */\n\t\t\tif (oem < 0x100) c = p[oem - 0x80];\n\t\t}\n\t}\n\n\treturn c;\n}\n\n#endif\n\n\n\n/*------------------------------------------------------------------------*/\n/* OEM <==> Unicode conversions for static code page configuration        */\n/* DBCS fixed code page                                                   */\n/*------------------------------------------------------------------------*/\n\n#if FF_CODE_PAGE >= 900\nWCHAR ff_uni2oem (\t/* Returns OEM code character, zero on error */\n\tDWORD\tuni,\t/* UTF-16 encoded character to be converted */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tconst WCHAR *p;\n\tWCHAR c = 0, uc;\n\tUINT i = 0, n, li, hi;\n\n\n\tif (uni < 0x80) {\t/* ASCII? */\n\t\tc = (WCHAR)uni;\n\n\t} else {\t\t\t/* Non-ASCII */\n\t\tif (uni < 0x10000 && cp == FF_CODE_PAGE) {\t/* Is it in BMP and valid code page? */\n\t\t\tuc = (WCHAR)uni;\n\t\t\tp = CVTBL(uni2oem, FF_CODE_PAGE);\n\t\t\thi = sizeof CVTBL(uni2oem, FF_CODE_PAGE) / 4 - 1;\n\t\t\tli = 0;\n\t\t\tfor (n = 16; n; n--) {\n\t\t\t\ti = li + (hi - li) / 2;\n\t\t\t\tif (uc == p[i * 2]) break;\n\t\t\t\tif (uc > p[i * 2]) {\n\t\t\t\t\tli = i;\n\t\t\t\t} else {\n\t\t\t\t\thi = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (n != 0) c = p[i * 2 + 1];\n\t\t}\n\t}\n\n\treturn c;\n}\n\n\nWCHAR ff_oem2uni (\t/* Returns Unicode character, zero on error */\n\tWCHAR\toem,\t/* OEM code to be converted */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tconst WCHAR *p;\n\tWCHAR c = 0;\n\tUINT i = 0, n, li, hi;\n\n\n\tif (oem < 0x80) {\t/* ASCII? */\n\t\tc = oem;\n\n\t} else {\t\t\t/* Extended char */\n\t\tif (cp == FF_CODE_PAGE) {\t/* Is it valid code page? */\n\t\t\tp = CVTBL(oem2uni, FF_CODE_PAGE);\n\t\t\thi = sizeof CVTBL(oem2uni, FF_CODE_PAGE) / 4 - 1;\n\t\t\tli = 0;\n\t\t\tfor (n = 16; n; n--) {\n\t\t\t\ti = li + (hi - li) / 2;\n\t\t\t\tif (oem == p[i * 2]) break;\n\t\t\t\tif (oem > p[i * 2]) {\n\t\t\t\t\tli = i;\n\t\t\t\t} else {\n\t\t\t\t\thi = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (n != 0) c = p[i * 2 + 1];\n\t\t}\n\t}\n\n\treturn c;\n}\n#endif\n\n\n\n/*------------------------------------------------------------------------*/\n/* OEM <==> Unicode conversions for dynamic code page configuration       */\n/*------------------------------------------------------------------------*/\n\n#if FF_CODE_PAGE == 0\n\nstatic const WORD cp_code[]          = {  437,   720,   737,   771,   775,   850,   852,   855,   857,   860,   861,   862,   863,   864,   865,   866,   869, 0};\nstatic const WCHAR* const cp_table[] = {uc437, uc720, uc737, uc771, uc775, uc850, uc852, uc855, uc857, uc860, uc861, uc862, uc863, uc864, uc865, uc866, uc869, 0};\n\n\nWCHAR ff_uni2oem (\t/* Returns OEM code character, zero on error */\n\tDWORD\tuni,\t/* UTF-16 encoded character to be converted */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tconst WCHAR *p;\n\tWCHAR c = 0, uc;\n\tUINT i, n, li, hi;\n\n\n\tif (uni < 0x80) {\t/* ASCII? */\n\t\tc = (WCHAR)uni;\n\n\t} else {\t\t\t/* Non-ASCII */\n\t\tif (uni < 0x10000) { /* Is it in BMP? */\n\t\t\tuc = (WCHAR)uni;\n\t\t\tp = 0;\n\t\t\tif (cp < 900) {\t/* SBCS */\n\t\t\t\tfor (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ;\t\t/* Get conversion table */\n\t\t\t\tp = cp_table[i];\n\t\t\t\tif (p) {\t/* Is it valid code page ? */\n\t\t\t\t\tfor (c = 0; c < 0x80 && uc != p[c]; c++) ;\t/* Find OEM code in the table */\n\t\t\t\t\tc = (c + 0x80) & 0xFF;\n\t\t\t\t}\n\t\t\t} else {\t/* DBCS */\n\t\t\t\tswitch (cp) {\t/* Get conversion table */\n\t\t\t\tcase 932 : p = uni2oem932; hi = sizeof uni2oem932 / 4 - 1; break;\n\t\t\t\tcase 936 : p = uni2oem936; hi = sizeof uni2oem936 / 4 - 1; break;\n\t\t\t\tcase 949 : p = uni2oem949; hi = sizeof uni2oem949 / 4 - 1; break;\n\t\t\t\tcase 950 : p = uni2oem950; hi = sizeof uni2oem950 / 4 - 1; break;\n\t\t\t\t}\n\t\t\t\tif (p) {\t/* Is it valid code page? */\n\t\t\t\t\tli = 0;\n\t\t\t\t\tfor (n = 16; n; n--) {\t/* Find OEM code */\n\t\t\t\t\t\ti = li + (hi - li) / 2;\n\t\t\t\t\t\tif (uc == p[i * 2]) break;\n\t\t\t\t\t\tif (uc > p[i * 2]) {\n\t\t\t\t\t\t\tli = i;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thi = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (n != 0) c = p[i * 2 + 1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn c;\n}\n\n\nWCHAR ff_oem2uni (\t/* Returns Unicode character, zero on error */\n\tWCHAR\toem,\t/* OEM code to be converted (DBC if >=0x100) */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tconst WCHAR *p;\n\tWCHAR c = 0;\n\tUINT i, n, li, hi;\n\n\n\tif (oem < 0x80) {\t/* ASCII? */\n\t\tc = oem;\n\n\t} else {\t\t\t/* Extended char */\n\t\tp = 0;\n\t\tif (cp < 900) {\t/* SBCS */\n\t\t\tfor (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ;\t\t/* Get table */\n\t\t\tp = cp_table[i];\n\t\t\tif (p) {\t/* Is it a valid CP ? */\n\t\t\t\tif (oem < 0x100) c = p[oem - 0x80];\n\t\t\t}\n\t\t} else {\t/* DBCS */\n\t\t\tswitch (cp) {\n\t\t\tcase 932 : p = oem2uni932; hi = sizeof oem2uni932 / 4 - 1; break;\n\t\t\tcase 936 : p = oem2uni936; hi = sizeof oem2uni936 / 4 - 1; break;\n\t\t\tcase 949 : p = oem2uni949; hi = sizeof oem2uni949 / 4 - 1; break;\n\t\t\tcase 950 : p = oem2uni950; hi = sizeof oem2uni950 / 4 - 1; break;\n\t\t\t}\n\t\t\tif (p) {\n\t\t\t\tli = 0;\n\t\t\t\tfor (n = 16; n; n--) {\n\t\t\t\t\ti = li + (hi - li) / 2;\n\t\t\t\t\tif (oem == p[i * 2]) break;\n\t\t\t\t\tif (oem > p[i * 2]) {\n\t\t\t\t\t\tli = i;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thi = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (n != 0) c = p[i * 2 + 1];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn c;\n}\n#endif\n\n\n\n/*------------------------------------------------------------------------*/\n/* Unicode up-case conversion                                             */\n/*------------------------------------------------------------------------*/\n\nDWORD ff_wtoupper (\t/* Returns up-converted code point */\n\tDWORD uni\t\t/* Unicode code point to be up-converted */\n)\n{\n\tconst WORD *p;\n\tWORD uc, bc, nc, cmd;\n\tstatic const WORD cvt1[] = {\t/* Compressed up conversion table for U+0000 - U+0FFF */\n\t\t/* Basic Latin */\n\t\t0x0061,0x031A,\n\t\t/* Latin-1 Supplement */\n\t\t0x00E0,0x0317,\n\t\t0x00F8,0x0307,\n\t\t0x00FF,0x0001,0x0178,\n\t\t/* Latin Extended-A */\n\t\t0x0100,0x0130,\n\t\t0x0132,0x0106,\n\t\t0x0139,0x0110,\n\t\t0x014A,0x012E,\n\t\t0x0179,0x0106,\n\t\t/* Latin Extended-B */\n\t\t0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA,\n\t\t0x01CD,0x0110,\n\t\t0x01DD,0x0001,0x018E,\n\t\t0x01DE,0x0112,\n\t\t0x01F3,0x0003,0x01F1,0x01F4,0x01F4,\n\t\t0x01F8,0x0128,\n\t\t0x0222,0x0112,\n\t\t0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241,\n\t\t0x0246,0x010A,\n\t\t/* IPA Extensions */\n\t\t0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7,\n\t\t/* Greek, Coptic */\n\t\t0x037B,0x0003,0x03FD,0x03FE,0x03FF,\n\t\t0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A,\n\t\t0x03B1,0x0311,\n\t\t0x03C2,0x0002,0x03A3,0x03A3,\n\t\t0x03C4,0x0308,\n\t\t0x03CC,0x0003,0x038C,0x038E,0x038F,\n\t\t0x03D8,0x0118,\n\t\t0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA,\n\t\t/* Cyrillic */\n\t\t0x0430,0x0320,\n\t\t0x0450,0x0710,\n\t\t0x0460,0x0122,\n\t\t0x048A,0x0136,\n\t\t0x04C1,0x010E,\n\t\t0x04CF,0x0001,0x04C0,\n\t\t0x04D0,0x0144,\n\t\t/* Armenian */\n\t\t0x0561,0x0426,\n\n\t\t0x0000\t/* EOT */\n\t};\n\tstatic const WORD cvt2[] = {\t/* Compressed up conversion table for U+1000 - U+FFFF */\n\t\t/* Phonetic Extensions */\n\t\t0x1D7D,0x0001,0x2C63,\n\t\t/* Latin Extended Additional */\n\t\t0x1E00,0x0196,\n\t\t0x1EA0,0x015A,\n\t\t/* Greek Extended */\n\t\t0x1F00,0x0608,\n\t\t0x1F10,0x0606,\n\t\t0x1F20,0x0608,\n\t\t0x1F30,0x0608,\n\t\t0x1F40,0x0606,\n\t\t0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F,\n\t\t0x1F60,0x0608,\n\t\t0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB,\n\t\t0x1F80,0x0608,\n\t\t0x1F90,0x0608,\n\t\t0x1FA0,0x0608,\n\t\t0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC,\n\t\t0x1FCC,0x0001,0x1FC3,\n\t\t0x1FD0,0x0602,\n\t\t0x1FE0,0x0602,\n\t\t0x1FE5,0x0001,0x1FEC,\n\t\t0x1FF3,0x0001,0x1FFC,\n\t\t/* Letterlike Symbols */\n\t\t0x214E,0x0001,0x2132,\n\t\t/* Number forms */\n\t\t0x2170,0x0210,\n\t\t0x2184,0x0001,0x2183,\n\t\t/* Enclosed Alphanumerics */\n\t\t0x24D0,0x051A,\n\t\t0x2C30,0x042F,\n\t\t/* Latin Extended-C */\n\t\t0x2C60,0x0102,\n\t\t0x2C67,0x0106, 0x2C75,0x0102,\n\t\t/* Coptic */\n\t\t0x2C80,0x0164,\n\t\t/* Georgian Supplement */\n\t\t0x2D00,0x0826,\n\t\t/* Full-width */\n\t\t0xFF41,0x031A,\n\n\t\t0x0000\t/* EOT */\n\t};\n\n\n\tif (uni < 0x10000) {\t/* Is it in BMP? */\n\t\tuc = (WORD)uni;\n\t\tp = uc < 0x1000 ? cvt1 : cvt2;\n\t\tfor (;;) {\n\t\t\tbc = *p++;\t\t\t\t\t\t\t\t/* Get the block base */\n\t\t\tif (bc == 0 || uc < bc) break;\t\t\t/* Not matched? */\n\t\t\tnc = *p++; cmd = nc >> 8; nc &= 0xFF;\t/* Get processing command and block size */\n\t\t\tif (uc < bc + nc) {\t/* In the block? */\n\t\t\t\tswitch (cmd) {\n\t\t\t\tcase 0:\tuc = p[uc - bc]; break;\t\t/* Table conversion */\n\t\t\t\tcase 1:\tuc -= (uc - bc) & 1; break;\t/* Case pairs */\n\t\t\t\tcase 2: uc -= 16; break;\t\t\t/* Shift -16 */\n\t\t\t\tcase 3:\tuc -= 32; break;\t\t\t/* Shift -32 */\n\t\t\t\tcase 4:\tuc -= 48; break;\t\t\t/* Shift -48 */\n\t\t\t\tcase 5:\tuc -= 26; break;\t\t\t/* Shift -26 */\n\t\t\t\tcase 6:\tuc += 8; break;\t\t\t\t/* Shift +8 */\n\t\t\t\tcase 7: uc -= 80; break;\t\t\t/* Shift -80 */\n\t\t\t\tcase 8:\tuc -= 0x1C60; break;\t\t/* Shift -0x1C60 */\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (cmd == 0) p += nc;\t/* Skip table if needed */\n\t\t}\n\t\tuni = uc;\n\t}\n\n\treturn uni;\n}\n\n\n#endif /* #if FF_USE_LFN */\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/ff13b/source/integer.h",
    "content": "/*-------------------------------------------*/\n/* Integer type definitions for FatFs module */\n/*-------------------------------------------*/\n\n#ifndef FF_INTEGER\n#define FF_INTEGER\n\n#ifdef _WIN32\t/* FatFs development platform */\n\n#include <windows.h>\ntypedef unsigned __int64 QWORD;\n\n#else\t\t\t/* Embedded platform */\n\n/* These types MUST be 16-bit or 32-bit */\ntypedef int\t\t\t\tINT;\ntypedef unsigned int\tUINT;\n\n/* This type MUST be 8-bit */\ntypedef unsigned char\tBYTE;\n\n/* These types MUST be 16-bit */\ntypedef short\t\t\tSHORT;\ntypedef unsigned short\tWORD;\ntypedef unsigned short\tWCHAR;\n\n/* These types MUST be 32-bit */\ntypedef long\t\t\tLONG;\ntypedef unsigned long\tDWORD;\n\n/* This type MUST be 64-bit (Remove this for ANSI C (C89) compatibility) */\ntypedef unsigned long long QWORD;\n\n#endif\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/fatfs/los_fatfs.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/* Includes -----------------------------------------------------------------*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include \"fs/sys/errno.h\"\n#include \"fs/sys/fcntl.h\"\n#include \"fs/sys/stat.h\"\n#include \"fs/los_vfs.h\"\n#include \"fs/los_fatfs.h\"\n#include \"los_printf.h\"\n\n\n/* Defines ------------------------------------------------------------------*/\n/* Typedefs -----------------------------------------------------------------*/\n\n/* Macros -------------------------------------------------------------------*/\n#ifndef MIN\n#define MIN(a,b) ((a) < (b) ? (a) : (b))\n#endif\n\n#ifndef POINTER_ASSERT\n#define POINTER_ASSERT(p) \\\n    if(p == NULL) \\\n    { \\\n        return -EINVAL; \\\n    }\n#endif\n/* Local variables ----------------------------------------------------------*/\nstruct disk_mnt disk;\n\n/* Extern variables ---------------------------------------------------------*/\n/* Global variables ---------------------------------------------------------*/\n/* Private function prototypes ----------------------------------------------*/\n/* Public functions ---------------------------------------------------------*/\n\nstatic int ret_to_errno(FRESULT result)\n{\n    int err = 0;\n\n    switch (result)\n    {\n    case FR_OK:\n        return 0;\n\n    case FR_NO_PATH:\n        err = ENOTDIR;\n        break;\n\n    case FR_NO_FILE:\n        err = ENOENT;\n        break;\n\n    case FR_NO_FILESYSTEM:\n        err = ENODEV;\n        break;\n\n    case FR_TOO_MANY_OPEN_FILES:\n        err = ENFILE;\n        break;\n\n    case FR_INVALID_NAME:\n        err = ENAMETOOLONG;\n        break;\n\n    case FR_INVALID_PARAMETER:\n    case FR_INVALID_OBJECT:\n    case FR_INT_ERR:\n        err = EINVAL;\n        break;\n\n    case FR_INVALID_DRIVE:\n    case FR_NOT_ENABLED:\n        err = ENXIO;\n        break;\n\n    case FR_EXIST:\n        err = EEXIST;\n        break;\n\n    case FR_DISK_ERR:\n    case FR_NOT_READY:\n        err = EIO;\n        break;\n\n    case FR_WRITE_PROTECTED:\n        err = EROFS;\n        break;\n\n    case FR_LOCKED:\n    \terr = EBUSY;\n    \tbreak;\n\n    case FR_DENIED:\n        err = EISDIR;\n        break;\n\n    case FR_MKFS_ABORTED:\n        err = EBUSY;\n        break;\n\n    case FR_NOT_ENOUGH_CORE:\n        err = ENOMEM;\n        break;\n\n    case FR_TIMEOUT:\n        err = ETIMEDOUT;\n        break;\n\n    default:\n        err = EIO;\n        break;\n    }\n\n    VFS_ERRNO_SET (err);\n    return -err;\n}\n\n/**\n  * @brief  Links a compatible diskio driver/lun id and increments the number of active\n  *         linked drivers.\n  * @note   The number of linked drivers (volumes) is up to 10 due to FatFs limits.\n  * @param  drv: pointer to the disk IO Driver structure\n  * @param  lun : only used for USB Key Disk to add multi-lun management\n            else the parameter must be equal to 0\n  * @retval Returns -1 in case of failure, otherwise return the drive (0 to volumes).\n  */\nstatic int fatfs_link_driver(const struct diskio_drv *drv, uint8_t lun)\n{\n    int ret = -1;\n    int i;\n\n    if(disk.num >= FF_VOLUMES)\n        return ret;\n\n    for(i = 0; i < FF_VOLUMES; i++)\n    {\n        if(disk.dev[i].drv != 0)\n            continue;\n\n        disk.dev[disk.num].state = 0;\n        disk.dev[disk.num].drv = drv;\n        disk.dev[disk.num].lun = lun;\n        disk.num++;\n        return i;\n    }\n    return ret;\n}\n\n/**\n  * @brief  Unlinks a diskio driver and decrements the number of active linked\n  *         drivers.\n  * @param  drive: the disk drive (0 to volumes)\n  * @param  lun : not used\n  * @retval Returns -1 in case of failure, otherwise return the drive (0 to volumes).\n  */\nstatic int fatfs_unlink_driver(uint8_t drive, uint8_t lun)\n{\n    int ret = -1;\n\n    if(disk.num >= 1 && drive < FF_VOLUMES)\n    {\n        if(disk.dev[drive].drv != 0)\n        {\n            disk.dev[drive].state= 0;\n            disk.dev[drive].drv = 0;\n            disk.dev[drive].lun = 0;\n            disk.num--;\n            return drive;\n        }\n    }\n\n    return ret;\n}\n\nint fatfs_register(const struct diskio_drv *drv)\n{\n    return fatfs_link_driver(drv, 0);\n}\n\nint fatfs_unregister(uint8_t drive)\n{\n    return fatfs_unlink_driver(drive, 0);\n}\n\nstatic int fatfs_flags_get (int oflags)\n{\n    int flags = 0;\n\n    switch (oflags & O_ACCMODE)\n    {\n    case O_RDONLY:\n        flags |= FA_READ;\n        break;\n    case O_WRONLY:\n        flags |= FA_WRITE;\n        break;\n    case O_RDWR:\n        flags |= FA_READ | FA_WRITE;\n        break;\n    default:\n        break;\n    }\n\n    if (oflags & O_CREAT)\n    {\n        flags |= FA_OPEN_ALWAYS;\n    }\n\n    if ((oflags & O_CREAT) && (oflags & O_EXCL))\n    {\n        flags |= FA_CREATE_NEW;\n    }\n\n    if (oflags & O_TRUNC)\n    {\n        flags |= FA_CREATE_ALWAYS;\n    }\n\n    if (oflags & O_APPEND)\n    {\n        flags |= FA_READ | FA_WRITE | FA_OPEN_APPEND;\n    }\n\n    return flags;\n}\n\nstatic int fatfs_op_open (struct file *file, const char *path_in_mp, int flags)\n{\n    FRESULT res;\n    FIL     *fp;\n    FILINFO info = {0};\n\n    fp = (FIL *) malloc (sizeof(FIL));\n    if (fp == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in FATFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        return -EINVAL;\n    }\n\n    if (!(flags & O_CREAT) && (flags & O_TRUNC))\n    {\n        res = f_stat(path_in_mp, &info);\n        if(res != FR_OK)\n        {\n            free(fp);\n            return res;\n        }\n    }\n\n    res = f_open (fp, path_in_mp, fatfs_flags_get (flags));\n    if(res == FR_OK)\n    {\n        file->f_data = (void *) fp;\n    }\n    else\n    {\n        free(fp);\n    }\n    if (FR_LOCKED == res)\n    {\n        int err = 0;\n        VFS_ERRNO_SET (EACCES);\n        err = EACCES;\n        return -err;\n    }\n    else\n    {\n        return ret_to_errno(res);\n    }\n}\n\nstatic int fatfs_op_close (struct file *file)\n{\n    FRESULT res;\n    FIL     *fp = (FIL *)file->f_data;\n\n    POINTER_ASSERT(fp);\n\n    res = f_close(fp);\n    if(res == FR_OK)\n    {\n        free(fp);\n        file->f_data = NULL;\n    }\n\n    return ret_to_errno(res);\n}\n\nstatic ssize_t fatfs_op_read (struct file *file, char *buff, size_t bytes)\n{\n    ssize_t size = 0;\n    FRESULT res;\n    FIL     *fp = (FIL *)file->f_data;\n\n    if (buff == NULL || bytes == 0)\n        return -EINVAL;\n\n    POINTER_ASSERT(fp);\n    res = f_read (fp, buff, bytes, (UINT *)&size);\n    if(res != FR_OK)\n    {\n        PRINT_ERR (\"failed to read, res=%d\\n\", res);\n        return ret_to_errno(res);\n    }\n    return size;\n}\n\nstatic ssize_t fatfs_op_write (struct file *file, const char *buff, size_t bytes)\n{\n    ssize_t  size = 0;\n    FRESULT  res;\n    FIL     *fp = (FIL *)file->f_data;\n\n    if (buff == NULL || bytes == 0)\n        return -EINVAL;\n\n    POINTER_ASSERT(fp);\n    res = f_write (fp, buff, bytes, (UINT *)&size);\n    if(res != FR_OK || size == 0)\n    {\n        PRINT_ERR (\"failed to write, res=%d\\n\", res);\n        return ret_to_errno(res);\n    }\n    return size;\n}\n\nstatic off_t fatfs_op_lseek (struct file *file, off_t off, int whence)\n{\n    FIL *fp = (FIL *)file->f_data;\n\n    POINTER_ASSERT(fp);\n    switch (whence)\n    {\n    case 0: // SEEK_SET\n        break;\n    case 1: // SEEK_CUR\n        off += f_tell(fp);\n        break;\n    case 2: // SEEK_END\n        off += f_size(fp);\n        break;\n    default:\n    \tret_to_errno(FR_INVALID_PARAMETER);\n        return -1;\n    }\n    \n    if (off < 0)\n    {\n        return ret_to_errno(FR_INVALID_PARAMETER);\n    }\n    \n    FRESULT res = f_lseek(fp, off);\n    if (res == FR_OK)\n    {\n\n    \treturn off;\n    }\n    else\n        return ret_to_errno(res);\n}\n\nint fatfs_op_stat (struct mount_point *mp, const char *path_in_mp, struct stat *stat)\n{\n    FRESULT res;\n    FILINFO info = {0};\n\n    memset(stat, 0, sizeof(*stat));\n    res = f_stat(path_in_mp, &info);\n    if (res == FR_OK)\n    {\n        stat->st_size = info.fsize;\n        if (info.fattrib & AM_DIR)\n        {\n            stat->st_mode = S_IFDIR;\n        }\n        else\n        {\n            stat->st_mode = S_IFREG;\n        }\n    }\n\n    return ret_to_errno(res);\n}\n\nstatic int fatfs_op_unlink (struct mount_point *mp, const char *path_in_mp)\n{\n    FRESULT res = f_unlink(path_in_mp);\n    if (FR_NO_PATH == res)\n    {\n        int err = 0;\n        VFS_ERRNO_SET (ENOENT);\n        err = ENOENT;\n        return -err;\n    }\n    else\n    {\n    \treturn ret_to_errno(res);\n    }\n\n}\n\nstatic int fatfs_op_rename (struct mount_point *mp, const char *path_in_mp_old,\n                             const char *path_in_mp_new)\n{\n    FRESULT res = f_rename(path_in_mp_old, path_in_mp_new);\n    return ret_to_errno(res);\n}\n\nstatic int fatfs_op_sync (struct file *file)\n{\n    FIL *fp = (FIL *)file->f_data;\n    FRESULT res;\n\n    POINTER_ASSERT(fp);\n\n    res = f_sync(fp);\n    return ret_to_errno(res);\n}\n\nstatic int fatfs_op_opendir (struct dir *dir, const char *path)\n{\n    FRESULT  res;\n    DIR     *dp;\n\n    dp = (DIR *) malloc (sizeof (DIR));\n\n    if (dp == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in SPIFFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        return -ENOMEM;\n    }\n\n    res = f_opendir(dp, path);\n    if(res != FR_OK)\n    {\n        free(dp);\n        return ret_to_errno(res);\n    }\n\n    dir->d_data   = dp;\n    dir->d_offset = 0;\n\n    return FR_OK;\n}\n\nstatic int fatfs_op_readdir (struct dir *dir, struct dirent *dent)\n{\n    FRESULT  res;\n    DIR     *dp = (DIR *) dir->d_data;\n    FILINFO  e;\n    int     len;\n\n    POINTER_ASSERT(dp);\n\n    res = f_readdir(dp, &e);\n    if (res != FR_OK)\n    {\n        return ret_to_errno(res);\n    }\n\n    len = MIN(sizeof(e.fname), LOS_MAX_DIR_NAME_LEN+1) - 1;\n    strncpy ((char *)dent->name, (const char *) e.fname, len);\n    dent->name [len] = '\\0';\n    dent->size = e.fsize;\n\n    if (e.fattrib == AM_DIR)\n    {\n        dent->type = VFS_TYPE_DIR;\n    }\n    else\n    {\n        dent->type = VFS_TYPE_FILE;\n    }\n\n    return FR_OK;\n}\n\nstatic int fatfs_op_closedir (struct dir *dir)\n{\n    FRESULT  res;\n    DIR     *dp = (DIR *) dir->d_data;\n\n    POINTER_ASSERT(dp);\n\n    res = f_closedir (dp);\n    if(res == FR_OK)\n    {\n        free (dp);\n        dir->d_data = NULL;\n    }\n\n    return ret_to_errno(res);\n}\n\nstatic int fatfs_op_mkdir(struct mount_point *mp, const char *path)\n{\n    FRESULT res = f_mkdir(path);\n    if (FR_NO_PATH == res)\n    {\n        int err = 0;\n        VFS_ERRNO_SET (ENOENT);\n        err = ENOENT;\n        return -err;\n    }\n    else\n    {\n    \treturn ret_to_errno(res);\n    }\n}\n\nstatic struct file_ops fatfs_ops =\n{\n    fatfs_op_open,\n    fatfs_op_close,\n    fatfs_op_read,\n    fatfs_op_write,\n    fatfs_op_lseek,\n    fatfs_op_stat,\n    fatfs_op_unlink,\n    fatfs_op_rename,\n    NULL,               /* ioctl not supported for now */\n    fatfs_op_sync,\n    fatfs_op_opendir,\n    fatfs_op_readdir,\n    fatfs_op_closedir,\n    fatfs_op_mkdir\n};\n\nstatic struct file_system fatfs_fs =\n{\n    \"fatfs\",\n    &fatfs_ops,\n    NULL,\n    0\n};\n\nint fatfs_init (void)\n{\n    static int fatfs_inited = FALSE;\n\n    if (fatfs_inited)\n    {\n        return LOS_OK;\n    }\n\n    if (los_vfs_init () != LOS_OK)\n    {\n        return LOS_NOK;\n    }\n\n    if (los_fs_register (&fatfs_fs) != LOS_OK)\n    {\n        PRINT_ERR (\"failed to register fs!\\n\");\n        return LOS_NOK;\n    }\n\n    fatfs_inited = TRUE;\n\n    PRINT_INFO (\"register fatfs done!\\n\");\n\n    return LOS_OK;\n}\n\nstatic FATFS *fatfs_ptr = NULL;\n\nint fatfs_mount(const char *path, struct diskio_drv *drv, uint8_t *drive)\n{\n    int s_drive;\n    char dpath[10] = {0};\n    int ret = -1;\n    BYTE *work_buff = NULL;\n    FRESULT res;\n    FATFS   *fs = NULL;\n\n    s_drive = fatfs_register(drv);\n    if(s_drive < 0)\n    {\n        PRINT_ERR(\"failed to register diskio!\\n\");\n        return s_drive;\n    }\n    fs = (FATFS *) malloc (sizeof (FATFS));\n    if (fs == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in FATFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        goto err;\n    }\n    memset(fs, 0, sizeof(FATFS));\n    sprintf(dpath, \"%d:/\", s_drive);\n    res = f_mount(fs, (const TCHAR *)dpath, 1);\n    if(res == FR_NO_FILESYSTEM)\n    {\n        work_buff = (BYTE *)malloc(FF_MAX_SS);\n        if(work_buff == NULL)\n            goto err_free;\n        memset(work_buff, 0, FF_MAX_SS);\n        res = f_mkfs((const TCHAR *)dpath, FM_ANY, 0, work_buff, FF_MAX_SS);\n        if(res == FR_OK)\n        {\n            res = f_mount(NULL, (const TCHAR *)dpath, 1);\n            res = f_mount(fs, (const TCHAR *)dpath, 1);\n        }\n        free(work_buff);\n    }\n    if(res != FR_OK)\n    {\n        PRINT_ERR(\"failed to mount fatfs, res=%d!\\n\", res);\n        goto err_free;\n    }\n\n    ret = los_fs_mount (\"fatfs\", path, fs);\n\n    if (ret == LOS_OK)\n    {\n        PRINT_INFO (\"fatfs mount at %s done!\\n\", path);\n        *drive = s_drive;\n        fatfs_ptr = fs;\n        return LOS_OK;\n    }\n\n    PRINT_ERR (\"failed to mount!\\n\");\n\nerr_free:\n    if(fs != NULL)\n        free(fs);\nerr:\n    fatfs_unregister(s_drive);\n    return ret;\n}\n\nint fatfs_unmount(const char *path, uint8_t drive)\n{\n    char dpath[10] = {0};\n\n    sprintf(dpath, \"%d:/\", drive);\n    fatfs_unregister(drive);\n    f_mount(NULL, (const TCHAR *)dpath, 1);\n    los_fs_unmount(path);\n    if (fatfs_ptr)\n    {\n        free(fatfs_ptr);\n        fatfs_ptr = NULL;\n    }\n\n    return 0;\n}\n\n/* Private functions --------------------------------------------------------*/\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/kifs/los_kifs.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include <stdint.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#ifdef __GNUC__\n#include <sys/errno.h>\n#endif\n\n#include <los_printf.h>\n\n#include <los_vfs.h>\n#include <los_kifs.h>\n\nstruct kifs_node\n{\n    char                        name [LOS_MAX_FILE_NAME_LEN];\n    uint32_t                    attr;       /* R(readable)/W(writable)/E(exclusive)/D(dir)/B(buffer) */\n    struct kifs_node           *sabling;\n    struct kifs_node           *parent;\n    union\n    {\n        struct kifs_ops        *kiops;      /* kiops if is file with ops */\n        void                   *buff;       /* buff addr, if file is linked to buffer */\n        struct kifs_node       *child;      /* child if is dir */\n    };\n    union\n    {\n        void                   *arg;        /* arg for ops if is file with ops */\n        size_t                  size;       /* buff size, if file is linked to buffer */\n    };\n};\n\nstatic struct kifs_node *kifs_file_find (struct kifs_node *root,\n        const char   *path_in_mp,\n        const char **path_unresolved)\n{\n    struct kifs_node *dir = root;\n\n    while (1)\n    {\n        const char        *c;\n        struct kifs_node *t;\n        int                l;\n\n        if ((dir->attr & KIFS_ATTR_D) == 0)\n        {\n            VFS_ERRNO_SET (ENOTDIR);\n\n            return NULL;\n        }\n\n        while (*path_in_mp == '/') path_in_mp++;\n\n        c = strchr (path_in_mp, '/');\n\n        if (c == NULL)\n        {\n            l = strlen (path_in_mp);\n        }\n        else\n        {\n            l = c - path_in_mp;\n        }\n\n        if (l >= LOS_MAX_FILE_NAME_LEN)\n        {\n            VFS_ERRNO_SET (ENAMETOOLONG);\n\n            return NULL;\n        }\n\n        for (t = dir->child; t != NULL; t = t->sabling)\n        {\n            if ((strncmp (t->name, path_in_mp, l) == 0) &&\n                    (t->name [l] == '\\0'))\n            {\n                break;\n            }\n        }\n\n        if (t == NULL)\n        {\n            break;  /* no match */\n        }\n\n        path_in_mp += l;\n        dir        = t;\n\n        if (c == NULL)\n        {\n            break;\n        }\n    }\n\n    *path_unresolved = path_in_mp;\n\n    return dir;\n}\n\nstatic int kifs_open (struct file *file, const char *path_in_mp, int flags)\n{\n    struct kifs_node *node;\n\n    node = kifs_file_find ((struct kifs_node *) file->f_mp->m_data, path_in_mp,\n                           &path_in_mp);\n\n    if (node == NULL)\n    {\n        return -1;\n    }\n\n    if (*path_in_mp != '\\0')\n    {\n        VFS_ERRNO_SET (ENOENT);\n        return -1;\n    }\n\n    if (node->attr & KIFS_ATTR_D)\n    {\n        VFS_ERRNO_SET (EISDIR);\n        return -1;\n    }\n\n    file->f_data = (void *) node;\n\n    if ((node->attr & KIFS_ATTR_B) != 0)\n    {\n        /* linked buffer do not have kiops */\n        return 0;\n    }\n\n    if (node->kiops->open == NULL)\n    {\n        return 0;   /* if open is NULL, means the file do not need it! */\n    }\n\n    return node->kiops->open (node->arg, flags);\n}\n\nstatic int kifs_close (struct file *file)\n{\n    struct kifs_node *node = (struct kifs_node *) file->f_data;\n\n    if (node == NULL)\n    {\n        return -1;\n    }\n\n    if (node->attr & KIFS_ATTR_B)\n    {\n        return 0;\n    }\n\n    if (node->kiops->close == NULL)\n    {\n        return 0;   /* if close is NULL, means the file do not need it! */\n    }\n\n    return node->kiops->close (node->arg);\n}\n\nstatic ssize_t kifs_read (struct file *file, char *buff, size_t bytes)\n{\n    struct kifs_node *node = (struct kifs_node *) file->f_data;\n\n    if ((node->attr & KIFS_ATTR_R) == 0)\n    {\n        VFS_ERRNO_SET (EACCES);\n        return (ssize_t) - 1;\n    }\n\n    if (node->attr & KIFS_ATTR_B)\n    {\n        bytes = bytes > node->size ? node->size : bytes;\n\n        memcpy (buff, node->buff, bytes);\n\n        return bytes;\n    }\n\n    if (node->kiops->read == NULL)\n    {\n        VFS_ERRNO_SET (EACCES);\n        return (ssize_t) - 1;\n    }\n\n    return node->kiops->read (node->arg, buff, bytes);\n}\n\nstatic ssize_t kifs_write (struct file *file, const char *buff, size_t bytes)\n{\n    struct kifs_node *node = (struct kifs_node *) file->f_data;\n\n    if ((node->attr & KIFS_ATTR_W) == 0)\n    {\n        VFS_ERRNO_SET (EACCES);\n        return (ssize_t) - 1;\n    }\n\n    if (node->attr & KIFS_ATTR_B)\n    {\n        bytes = bytes > node->size ? node->size : bytes;\n\n        memcpy (node->buff, buff, bytes);\n\n        return bytes;\n    }\n\n    if (node->kiops->write == NULL)\n    {\n        VFS_ERRNO_SET (EACCES);\n        return (ssize_t) - 1;\n    }\n\n    return node->kiops->write (node->arg, buff, bytes);\n}\n\nstatic int kifs_ioctl (struct file *file, int func, unsigned long arg)\n{\n    struct kifs_node *node = (struct kifs_node *) file->f_data;\n\n    if (node->attr & KIFS_ATTR_B)\n    {\n        return -1;\n    }\n\n    if (node->kiops->ioctl == NULL)\n    {\n        return -1;\n    }\n\n    /* <node->arg> is the private data for this kifile, the <arg> is the one\n     * of ioctl */\n\n    return node->kiops->ioctl (node->arg, func, arg);\n}\n\nstatic int kifs_opendir (struct dir *dir, const char *path_in_mp)\n{\n    struct kifs_node *node;\n\n    node = kifs_file_find ((struct kifs_node *) dir->d_mp->m_data, path_in_mp,\n                           &path_in_mp);\n\n    if ((node == NULL) || (*path_in_mp != '\\0'))\n    {\n        VFS_ERRNO_SET (ENOENT);\n        return -1;\n    }\n\n    if ((node->attr & KIFS_ATTR_D) == 0)\n    {\n        VFS_ERRNO_SET (ENOTDIR);\n        return -1;\n    }\n\n    dir->d_data   = (void *) node;\n    dir->d_offset = 0;\n\n    return 0;\n}\n\nstatic int kifs_readdir (struct dir *dir, struct dirent *dent)\n{\n    struct kifs_node *node = (struct kifs_node *) dir->d_data;\n    struct kifs_node *child;\n    off_t              i;\n\n    if (node == NULL)\n    {\n        return -1;\n    }\n\n    for (i = 0, child = node->child;\n            i < dir->d_offset && child != NULL;\n            i++, child = child->sabling)\n    {\n        /* nop */\n    }\n\n    if (child == NULL)\n    {\n        VFS_ERRNO_SET (ENOENT);\n        return -1;\n    }\n\n    strncpy (dent->name, child->name, LOS_MAX_FILE_NAME_LEN - 1);\n    dent->name [LOS_MAX_FILE_NAME_LEN - 1] = '\\0';\n    dent->size = 0;\n\n    if ((child->attr & KIFS_ATTR_D) != 0)\n    {\n        dent->type = VFS_TYPE_DIR;\n    }\n    else\n    {\n        dent->type = VFS_TYPE_FILE;\n        dent->size = child->size;\n    }\n\n    dir->d_offset++;\n\n    return 0;\n}\n\nstatic int kifs_closedir (struct dir *dir)\n{\n    return 0;\n}\n\nstatic struct file_ops kifs_ops =\n{\n    kifs_open,\n    kifs_close,\n    kifs_read,\n    kifs_write,\n    NULL,           /* lseek not suported */\n    NULL,           /* stat not supported */\n    NULL,           /* unlink not supported */\n    NULL,           /* rename not supported */\n    kifs_ioctl,     /* ioctl not supported */\n    NULL,           /* sync not supported */\n    kifs_opendir,\n    kifs_readdir,\n    kifs_closedir,\n    NULL            /* mkdir not supported */\n};\n\nstatic struct file_system kifs_fs =\n{\n    \"kifs\",\n    &kifs_ops,\n    NULL,\n    0\n};\n\nstatic struct kifs_node *kifs_file_creat (void *root,\n        const char *path_in_mp,\n        uint32_t flags)\n{\n    struct kifs_node *dir;\n    struct kifs_node *node;\n    const char        *t;\n\n    if (path_in_mp [strlen (path_in_mp) - 1] == '/')\n    {\n        return NULL;\n    }\n\n    dir = kifs_file_find ((struct kifs_node *) root, path_in_mp, &path_in_mp);\n\n    if (dir == NULL)   /* impossible */\n    {\n        return NULL;\n    }\n\n    if (*path_in_mp == '\\0')\n    {\n        return NULL;\n    }\n\n    if ((dir->attr & KIFS_ATTR_D) == 0)\n    {\n        return NULL;\n    }\n\n    while ((t = strchr (path_in_mp, '/')) != NULL)\n    {\n        if ((t - path_in_mp) >= LOS_MAX_FILE_NAME_LEN)\n        {\n            return NULL;\n        }\n\n        node = (struct kifs_node *) malloc (sizeof (struct kifs_node));\n\n        if (node == NULL)\n        {\n            PRINT_ERR (\"fail to malloc memory in KIFS, <malloc.c> is needed,\"\n                       \"make sure it is added\\n\");\n            return NULL;\n        }\n\n        memset (node, 0, sizeof (struct kifs_node));\n        strncpy (node->name, path_in_mp, t - path_in_mp);\n\n        node->parent  = dir;\n        node->sabling = dir->child;\n        dir->child    = node;\n        node->attr    = KIFS_ATTR_D;\n\n        dir           = node;\n        path_in_mp    = t + 1;\n\n        while (*path_in_mp == '/') path_in_mp++;\n    }\n\n    if (*path_in_mp == '\\0')\n    {\n        return NULL;\n    }\n\n    node = (struct kifs_node *) malloc (sizeof (struct kifs_node));\n\n    if (node == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in KIFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        return NULL;\n    }\n\n    memset (node, 0, sizeof (struct kifs_node));\n    strcpy (node->name, path_in_mp);\n\n    node->parent  = dir;\n    node->sabling = dir->child;\n    dir->child    = node;\n    node->attr    = flags;\n\n    return node;\n}\n\nint los_kifs_create (void *root, const char *path_in_mp, uint32_t flags,\n                     struct kifs_ops *kiops, void *arg)\n{\n    struct kifs_node *node;\n\n    if ((kiops == NULL) || ((flags & (KIFS_ATTR_R | KIFS_ATTR_W)) == 0))\n    {\n        return -1;\n    }\n\n    node = kifs_file_creat (root, path_in_mp, flags);\n\n    if (node == NULL)\n    {\n        return -1;\n    }\n\n    node->kiops = kiops;\n    node->arg   = arg;\n\n    return 0;\n}\n\nint los_kifs_link (void *root, const char *path_in_mp, uint32_t flags,\n                   void *buff, size_t size)\n{\n    struct kifs_node *node;\n\n    if ((buff == NULL) || ((flags & (KIFS_ATTR_R | KIFS_ATTR_W)) == 0))\n    {\n        return -1;\n    }\n\n    node = kifs_file_creat (root, path_in_mp, flags);\n\n    if (node == NULL)\n    {\n        return -1;\n    }\n\n    node->buff  = buff;\n    node->size  = size;\n    node->attr |= KIFS_ATTR_B;\n\n    return 0;\n}\n\nvoid *los_kifs_mount (const char *path)\n{\n    struct kifs_node *root;\n\n    if (los_vfs_init () != LOS_OK)\n    {\n        PRINT_ERR (\"vfs init fail!\\n\");\n        return NULL;\n    }\n\n    if (strlen (path) >= LOS_MAX_FILE_NAME_LEN)\n    {\n        return NULL;\n    }\n\n    root = (struct kifs_node *) malloc (sizeof (struct kifs_node));\n\n    if (root == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in KIFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        return NULL;\n    }\n\n    memset (root, 0, sizeof (struct kifs_node));\n\n    strcpy (root->name, path);\n\n    root->attr = KIFS_ATTR_D;\n\n    if (los_fs_mount (\"kifs\", path, root) == LOS_OK)\n    {\n        return (void *) root;\n    }\n\n    free (root);\n\n    return NULL;\n}\n\nint los_kifs_init (void)\n{\n    static int kifs_inited = FALSE;\n\n    if (kifs_inited)\n    {\n        return LOS_OK;\n    }\n\n    if (los_fs_register (&kifs_fs) != LOS_OK)\n    {\n        PRINT_ERR (\"kifs fs register fail!\\n\");\n        return LOS_NOK;\n    }\n\n    kifs_inited = TRUE;\n\n    return LOS_OK;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/ramfs/los_ramfs.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include <stdint.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#ifdef __GNUC__\n#include <sys/errno.h>\n#endif\n\n#if defined (__GNUC__) || defined (__CC_ARM)\n#include <sys/fcntl.h>\n#include <los_memory.h>\n#endif\n\n#include \"los_vfs.h\"\n\n#define RAMFS_TYPE_DIR          VFS_TYPE_DIR\n#define RAMFS_TYPE_FILE         VFS_TYPE_FILE\n\nstruct ramfs_element\n{\n    char                           name [LOS_MAX_FILE_NAME_LEN];\n    uint32_t                       type;\n    struct ramfs_element          *sabling;\n    struct ramfs_element          *parent;\n    volatile uint32_t              refs;\n    union\n    {\n        struct\n        {\n            size_t                 size;\n            char                  *content;\n        } f;\n        struct\n        {\n            struct ramfs_element *child;\n        } d;\n    };\n};\n\nstruct ramfs_mount_point\n{\n    struct ramfs_element       root;\n    void                      *memory;\n};\n\nstatic struct ramfs_element *ramfs_file_find (struct mount_point *mp,\n        const char   *path_in_mp,\n        const char **path_unresolved)\n{\n    struct ramfs_element *walk;\n\n    /* walk every dir */\n\n    walk = &((struct ramfs_mount_point *) mp->m_data)->root;\n\n    while (1)\n    {\n        const char            *c;\n        struct ramfs_element *t;\n        int                    l;\n\n        if (walk->type != RAMFS_TYPE_DIR)\n        {\n            VFS_ERRNO_SET (ENOTDIR);\n\n            return NULL;\n        }\n\n        while (*path_in_mp == '/') path_in_mp++;\n\n        c = strchr (path_in_mp, '/');\n\n        if (c == NULL)\n        {\n            l = strlen (path_in_mp);\n        }\n        else\n        {\n            l = c - path_in_mp;\n        }\n\n        if (l >= LOS_MAX_FILE_NAME_LEN)\n        {\n            VFS_ERRNO_SET (ENAMETOOLONG);\n\n            return NULL;\n        }\n\n        for (t = walk->d.child; t != NULL; t = t->sabling)\n        {\n            if ((strncmp (t->name, path_in_mp, l) == 0) &&\n                    (t->name [l] == '\\0'))\n            {\n                break;\n            }\n        }\n\n        if (t == NULL)\n        {\n            break;  /* no match */\n        }\n\n        path_in_mp += l;\n        walk        = t;\n\n        if (c == NULL)\n        {\n            break;\n        }\n    }\n\n    *path_unresolved = path_in_mp;\n\n    return walk;\n}\n\nstatic int ramfs_open (struct file *file, const char *path_in_mp, int flags)\n{\n    struct ramfs_element *ramfs_file;\n    struct ramfs_element *walk;\n    int                    ret = -1;\n\n    /* openning dir like \"/romfs/ not support \" */\n\n    if (*path_in_mp == '\\0')\n    {\n        VFS_ERRNO_SET (EISDIR);\n        return ret;\n    }\n\n    walk = ramfs_file_find (file->f_mp, path_in_mp, &path_in_mp);\n\n    if (walk == NULL)\n    {\n        /* errno set by ramfs_file_find */\n        return ret;\n    }\n\n    if ((walk->type == RAMFS_TYPE_DIR) && (*path_in_mp == '\\0'))\n    {\n        VFS_ERRNO_SET (EISDIR);\n        return -1;\n    }\n\n    if (*path_in_mp == '\\0')    /* file already exist, we found it */\n    {\n        ramfs_file = walk;\n\n        if (ramfs_file->type != RAMFS_TYPE_FILE)\n        {\n            VFS_ERRNO_SET (EISDIR);\n            return -1;\n        }\n\n        if ((flags & O_CREAT) && (flags & O_EXCL))\n        {\n            VFS_ERRNO_SET (EEXIST);\n            return -1;\n        }\n\n        if (flags & O_APPEND)\n        {\n            file->f_offset = ramfs_file->f.size;\n        }\n\n        ramfs_file->refs++;\n\n        file->f_data = (void *) ramfs_file;\n\n        return 0;\n    }\n\n    /*\n     * file not found, ramfs_file holds the most dir matched, path_in_mp holds\n     * the left path not resolved\n     */\n\n    if ((flags & O_CREAT) == 0)\n    {\n        VFS_ERRNO_SET (ENOENT);\n        return -1;\n    }\n\n    if (walk->type != RAMFS_TYPE_DIR)\n    {\n        /* if here, BUG! */\n        VFS_ERRNO_SET (ENOTDIR);\n        return -1;\n    }\n\n    if (strchr (path_in_mp, '/') != NULL)\n    {\n        VFS_ERRNO_SET (ENOENT);             /* parent dir not exist */\n        return -1;\n    }\n\n    if (strlen (path_in_mp) >= LOS_MAX_FILE_NAME_LEN)\n    {\n        VFS_ERRNO_SET (ENAMETOOLONG);\n        return -1;\n    }\n\n    ramfs_file = malloc (sizeof (struct ramfs_element));\n    if (ramfs_file == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in RAMFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        VFS_ERRNO_SET (ENOMEM);\n        return -1;\n    }\n\n    strcpy (ramfs_file->name, path_in_mp);  /* length of path_in_mp is already verified */\n\n    ramfs_file->refs = 1;\n\n    ramfs_file->type = RAMFS_TYPE_FILE;\n    ramfs_file->sabling = walk->d.child;\n    walk->d.child = ramfs_file;\n    ramfs_file->f.content = NULL;\n    ramfs_file->f.size = 0;\n    ramfs_file->parent = walk;\n\n    file->f_data = (void *) ramfs_file;\n\n    return 0;\n}\n\nstatic int ramfs_close (struct file *file)\n{\n    struct ramfs_element *ramfs_file = (struct ramfs_element *) file->f_data;\n\n    ramfs_file->refs--;\n\n    return 0;           /* not file delete, do not free the content */\n}\n\nstatic ssize_t ramfs_read (struct file *file, char *buff, size_t bytes)\n{\n    struct ramfs_element *ramfs_file = (struct ramfs_element *) file->f_data;\n\n    if (file->f_offset < 0)\n    {\n        file->f_offset = 0;\n    }\n\n    if (ramfs_file->f.size <= (size_t) file->f_offset)  /* nothing to read */\n    {\n        return 0;\n    }\n\n    if (ramfs_file->f.size - file->f_offset < bytes)\n    {\n        bytes = ramfs_file->f.size - file->f_offset;\n    }\n\n    memcpy (buff, ramfs_file->f.content + file->f_offset, bytes);\n\n    file->f_offset += bytes;\n\n    return bytes;\n}\n\nstatic ssize_t ramfs_write (struct file *file, const char *buff, size_t bytes)\n{\n    struct mount_point    *mp = file->f_mp;\n    struct ramfs_element *ramfs_file = (struct ramfs_element *) file->f_data;\n\n    if (file->f_offset < 0)\n    {\n        file->f_offset = 0;\n    }\n\n    if (file->f_offset + bytes > ramfs_file->f.size)\n    {\n        char *p;\n\n        p = LOS_MemRealloc (((struct ramfs_mount_point *) mp->m_data)->memory,\n                            ramfs_file->f.content, file->f_offset + bytes);\n\n        if (p != NULL)\n        {\n            ramfs_file->f.content = p;\n            ramfs_file->f.size = file->f_offset + bytes;\n        }\n        else\n        {\n            if (ramfs_file->f.size <= (size_t) file->f_offset)\n            {\n                VFS_ERRNO_SET (ENOMEM);\n                return (ssize_t) - 1;\n            }\n\n            bytes = ramfs_file->f.size - file->f_offset;\n        }\n    }\n\n    memcpy (ramfs_file->f.content + file->f_offset, buff, bytes);\n\n    file->f_offset += bytes;\n\n    return bytes;\n}\n\nstatic off_t ramfs_lseek (struct file *file, off_t off, int whence)\n{\n    struct ramfs_element *ramfs_file = (struct ramfs_element *) file->f_data;\n\n    switch (whence)\n    {\n    case SEEK_SET:\n        file->f_offset  = off;\n        break;\n    case SEEK_CUR:\n        file->f_offset += off;\n        break;\n    case SEEK_END:\n        file->f_offset  = ramfs_file->f.size;\n        break;\n    default:\n        VFS_ERRNO_SET (EINVAL);\n        return -1;\n    }\n\n    if (file->f_offset < 0)\n    {\n        file->f_offset = 0;\n    }\n\n    if ((size_t) file->f_offset > ramfs_file->f.size)\n    {\n        file->f_offset = ramfs_file->f.size;\n    }\n\n    return file->f_offset;\n}\n\nstatic void ramfs_del (struct ramfs_element *e)\n{\n    struct ramfs_element *dir;\n    struct ramfs_element *t;\n\n    if (e->parent == NULL)          /* root element, do not delete */\n    {\n        return;\n    }\n\n    dir = e->parent;\n\n    t = dir->d.child;\n\n    if (t == e)\n    {\n        dir->d.child = e->sabling;\n    }\n    else\n    {\n        while (t->sabling != e)\n        {\n            t = t->sabling;\n        }\n\n        t->sabling = e->sabling;\n    }\n\n    free (e);\n}\n\nstatic int ramfs_unlink (struct mount_point *mp, const char *path_in_mp)\n{\n    struct ramfs_element *ramfs_file;\n\n    ramfs_file = ramfs_file_find (mp, path_in_mp, &path_in_mp);\n\n    if ((ramfs_file == NULL) || (*path_in_mp != '\\0'))\n    {\n        VFS_ERRNO_SET (ENOENT);\n        return -1;\n    }\n\n    if (ramfs_file->refs != 0)\n    {\n        VFS_ERRNO_SET (EBUSY);\n        return -1;\n    }\n\n    if (ramfs_file->type == RAMFS_TYPE_DIR)\n    {\n        if (ramfs_file->d.child != NULL)\n        {\n            VFS_ERRNO_SET (EBUSY);      /* have file under it busy */\n            return -1;\n        }\n    }\n    else\n    {\n        if (ramfs_file->f.content != NULL)\n        {\n            LOS_MemFree (((struct ramfs_mount_point *) mp->m_data)->memory,\n                         ramfs_file->f.content);\n            ramfs_file->f.content = NULL;\n        }\n    }\n\n    ramfs_del (ramfs_file);\n\n    return 0;\n}\n\nstatic int ramfs_rename (struct mount_point *mp, const char *path_in_mp_old,\n                         const char *path_in_mp_new)\n{\n    struct ramfs_element *ramfs_file_old;\n    struct ramfs_element *ramfs_file_new;\n\n    ramfs_file_old = ramfs_file_find (mp, path_in_mp_old, &path_in_mp_old);\n\n    if ((ramfs_file_old == NULL) || (*path_in_mp_old != '\\0'))\n    {\n        VFS_ERRNO_SET (ENOENT);\n        return -1;\n    }\n\n    ramfs_file_new = ramfs_file_find (mp, path_in_mp_new, &path_in_mp_new);\n\n    /*\n     * ramfs_file_new == NULL means at least parent dir not found\n     * *path_in_mp_new == '\\0' means file already exist\n     */\n\n    if ((ramfs_file_new == NULL) || (*path_in_mp_new == '\\0'))\n    {\n        VFS_ERRNO_SET (ENOENT);\n        return -1;\n    }\n\n    /* must in the same dir */\n\n    if (strchr (path_in_mp_new, '/') != NULL)\n    {\n        VFS_ERRNO_SET (EISDIR);\n        return -1;\n    }\n\n    /* must in the same dir */\n\n    if (ramfs_file_new != ramfs_file_old->parent)\n    {\n        VFS_ERRNO_SET (EISDIR);\n        return -1;\n    }\n\n    if (strlen (path_in_mp_new) >= LOS_MAX_FILE_NAME_LEN)\n    {\n        VFS_ERRNO_SET (ENAMETOOLONG);\n        return -1;\n    }\n\n    strcpy (ramfs_file_old->name, path_in_mp_new);\n\n    return 0;\n}\n\nstatic int ramfs_opendir (struct dir *dir, const char *path_in_mp)\n{\n    struct ramfs_element *ramfs_dir;\n    struct mount_point    *mp = dir->d_mp;\n\n    ramfs_dir = ramfs_file_find (mp, path_in_mp, &path_in_mp);\n\n    if ((ramfs_dir == NULL) || (*path_in_mp != '\\0'))\n    {\n        VFS_ERRNO_SET (ENOENT);\n        return -1;\n    }\n\n    if (ramfs_dir->type != RAMFS_TYPE_DIR)\n    {\n        VFS_ERRNO_SET (ENOTDIR);\n        return -1;\n    }\n\n    ramfs_dir->refs++;\n\n    dir->d_data   = (void *) ramfs_dir;\n    dir->d_offset = 0;\n\n    return 0;\n}\n\nstatic int ramfs_readdir (struct dir *dir, struct dirent *dent)\n{\n    struct ramfs_element *ramfs_dir = (struct ramfs_element *) dir->d_data;\n    struct ramfs_element *child;\n    off_t                  i;\n\n    for (i = 0, child = ramfs_dir->d.child;\n            i < dir->d_offset && child != NULL;\n            i++, child = child->sabling)\n    {\n        /* nop */\n    }\n\n    if (NULL == child)\n    {\n        VFS_ERRNO_SET (ENOENT);\n        return -1;\n    }\n\n    strncpy (dent->name, child->name, LOS_MAX_FILE_NAME_LEN - 1);\n    dent->name [LOS_MAX_FILE_NAME_LEN - 1] = '\\0';\n    dent->size = 0;\n\n    if (child->type == RAMFS_TYPE_DIR)\n    {\n        dent->type = VFS_TYPE_DIR;\n    }\n    else\n    {\n        dent->type = VFS_TYPE_FILE;\n        dent->size = child->f.size;\n    }\n\n    dir->d_offset++;\n\n    return 0;\n}\n\nstatic int ramfs_closedir (struct dir *dir)\n{\n    struct ramfs_element *ramfs_dir = (struct ramfs_element *) dir->d_data;\n\n    ramfs_dir->refs--;\n\n    return 0;\n}\n\nstatic int ramfs_mkdir (struct mount_point *mp, const char *path_in_mp)\n{\n    struct ramfs_element *ramfs_parent;\n    struct ramfs_element *ramfs_dir;\n    const char            *t;\n    int                    len;\n\n    ramfs_parent = ramfs_file_find (mp, path_in_mp, &path_in_mp);\n\n    if ((ramfs_parent == NULL) || (*path_in_mp == '\\0'))\n    {\n        return -1;      /* dir already exist */\n    }\n\n    t = strchr (path_in_mp, '/');\n\n    if (t != NULL)\n    {\n        len = t - path_in_mp;\n\n        while (*t == '/') t++;\n\n        if (*t != '\\0')\n        {\n            return -1;  /* creating dir under non-existed dir */\n        }\n    }\n    else\n    {\n        len = strlen (path_in_mp);\n    }\n\n    if (len >= LOS_MAX_FILE_NAME_LEN)\n    {\n        return -1;\n    }\n\n    ramfs_dir = (struct ramfs_element *) malloc (sizeof (struct ramfs_element));\n\n    if (ramfs_dir == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in RAMFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        return -1;\n    }\n\n    memset (ramfs_dir, 0, sizeof (struct ramfs_element));\n\n    strncpy (ramfs_dir->name, path_in_mp, len);\n    ramfs_dir->type       = RAMFS_TYPE_DIR;\n    ramfs_dir->sabling    = ramfs_parent->d.child;\n    ramfs_parent->d.child = ramfs_dir;\n    ramfs_dir->parent     = ramfs_parent;\n\n    return 0;\n}\n\nstatic struct file_ops ramfs_ops =\n{\n    ramfs_open,\n    ramfs_close,\n    ramfs_read,\n    ramfs_write,\n    ramfs_lseek,\n    NULL,           /* stat not supported */\n    ramfs_unlink,\n    ramfs_rename,\n    NULL,           /* ioctl not supported */\n    NULL,           /* sync not supported */\n    ramfs_opendir,\n    ramfs_readdir,\n    ramfs_closedir,\n    ramfs_mkdir\n};\n\nstatic struct file_system ramfs_fs =\n{\n    \"ramfs\",\n    &ramfs_ops,\n    NULL,\n    0\n};\n\nint ramfs_mount (const char *path, size_t block_size)\n{\n    struct ramfs_mount_point *rmp;\n\n    if (strlen (path) >= LOS_MAX_FILE_NAME_LEN)\n    {\n        return LOS_NOK;\n    }\n\n    rmp = (struct ramfs_mount_point *) malloc (sizeof (struct ramfs_mount_point));\n\n    if (rmp == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in RAMFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        return LOS_NOK;\n    }\n\n    memset (rmp, 0, sizeof (struct ramfs_mount_point));\n    rmp->root.type = RAMFS_TYPE_DIR;\n    strncpy (rmp->root.name, path, LOS_MAX_FILE_NAME_LEN);\n    rmp->memory = malloc (block_size);\n\n    if (rmp->memory == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in RAMFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        PRINT_ERR (\"failed to allocate memory\\n\");\n        return LOS_NOK;\n    }\n\n    if (LOS_MemInit (rmp->memory, block_size) != LOS_OK)\n    {\n        PRINT_ERR (\"failed to init pool\\n\");\n        free (rmp->memory);\n        return LOS_NOK;\n    }\n\n    if (los_fs_mount (\"ramfs\", path, rmp) == LOS_OK)\n    {\n        PRINT_INFO (\"ramfs mount at %s done!\\n\", path);\n        return LOS_OK;\n    }\n\n    PRINT_ERR (\"failed to register fs!\\n\");\n\n    free (rmp->memory);\n    free (rmp);\n\n    return LOS_NOK;\n}\n\nint ramfs_init (void)\n{\n    static int ramfs_inited = FALSE;\n\n    if (ramfs_inited)\n    {\n        return LOS_OK;\n    }\n\n    if (los_vfs_init () != LOS_OK)\n    {\n        PRINT_ERR (\"vfs init fail!\\n\");\n        return LOS_NOK;\n    }\n\n    if (los_fs_register (&ramfs_fs) != LOS_OK)\n    {\n        PRINT_ERR (\"failed to register fs!\\n\");\n        return LOS_NOK;\n    }\n\n    /* alloc 16KB memory as \"disk\" */\n\n    if (ramfs_mount (\"/ramfs/\", 16 * 1024) != LOS_OK)\n    {\n        PRINT_ERR (\"failed to mount ramfs!\\n\");\n        return LOS_NOK;\n    }\n\n    PRINT_INFO (\"register fs done!\\n\");\n\n    ramfs_inited = TRUE;\n\n    return LOS_OK;\n}\n\n#ifdef DEBUG\nvoid ramfs_ls (struct ramfs_element *dir, int level)\n{\n    struct ramfs_element *itr;\n    int                    i;\n\n    if (dir->type != RAMFS_TYPE_DIR)\n    {\n        return;\n    }\n\n    for (itr = dir->d.child; itr != NULL; itr = itr->sabling)\n    {\n        for (i = 0; i < level; i++)\n            PRINTK (\"  \");\n\n        PRINTK (\"%s%c\\n\", itr->name, itr->type == RAMFS_TYPE_DIR ? '/' : '\\0');\n\n        if (itr->type == RAMFS_TYPE_DIR)\n        {\n            ramfs_ls (itr, level + 1);\n        }\n    }\n}\n\nextern struct mount_point *los_mp_find (const char *, const char **);\n\nvoid ramfs_tree (const char *mount_path)\n{\n    struct mount_point    *mp = los_mp_find (mount_path, NULL);\n    struct ramfs_element *walk;\n\n    if (mp == NULL)\n    {\n        PRINT_ERR (\"can not find mount point info for %s\\n\", mount_path);\n        return;\n    }\n\n    walk = (struct ramfs_element *) mp->m_data;\n\n    ramfs_ls (walk, 0);\n}\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/README",
    "content": "spiffs适配参考代码：targets/Cloud_STM32F429IGTx_FIRE/Src/spiffs_stm32f4xx.c"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/los_spiffs.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/* NOTE: this is a demo for adapting the SPIFFS */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include \"fs/sys/errno.h\"\n#include \"fs/sys/fcntl.h\"\n#include \"fs/sys/stat.h\"\n#include \"fs/los_vfs.h\"\n#include \"los_printf.h\"\n\n#include \"spiffs.h\"\n#include \"spiffs_nucleus.h\"\n\n\nstatic int ret_to_errno(int ret)\n{\n    int err = 0;\n\n    switch (ret)\n    {\n    case SPIFFS_OK:\n        return 0;\n\n    case SPIFFS_ERR_DATA_SPAN_MISMATCH:\n    case SPIFFS_ERR_IS_INDEX:\n    case SPIFFS_ERR_INDEX_REF_FREE:\n    case SPIFFS_ERR_INDEX_REF_LU:\n    case SPIFFS_ERR_INDEX_REF_INVALID:\n    case SPIFFS_ERR_INDEX_FREE:\n    case SPIFFS_ERR_INDEX_LU:\n    case SPIFFS_ERR_INDEX_INVALID:\n    case SPIFFS_ERR_CONFLICTING_NAME:\n    case SPIFFS_ERR_INVALID_PARA:\n        err = EINVAL;\n        break;\n\n    case SPIFFS_ERR_NOT_WRITABLE:\n    case SPIFFS_ERR_NOT_READABLE:\n    case SPIFFS_ERR_NOT_CONFIGURED:\n        err = EACCES;\n        break;\n\n    case SPIFFS_ERR_NOT_MOUNTED:\n    case SPIFFS_ERR_NOT_A_FS:\n    case SPIFFS_ERR_PROBE_NOT_A_FS:\n    case SPIFFS_ERR_MAGIC_NOT_POSSIBLE:\n        err = ENODEV;\n        break;\n\n    case SPIFFS_ERR_FULL:\n    case SPIFFS_ERR_PROBE_TOO_FEW_BLOCKS:\n        err = ENOSPC;\n        break;\n\n    case SPIFFS_ERR_BAD_DESCRIPTOR:\n    case SPIFFS_ERR_OUT_OF_FILE_DESCS:\n        err = EBADF;\n        break;\n\n    case SPIFFS_ERR_MOUNTED:\n    case SPIFFS_ERR_FILE_EXISTS:\n        err = EEXIST;\n        break;\n\n    case SPIFFS_ERR_NOT_FOUND:\n    case SPIFFS_ERR_NOT_A_FILE:\n    case SPIFFS_ERR_DELETED:\n    case SPIFFS_ERR_FILE_DELETED:\n    case SPIFFS_ERR_NOT_FINALIZED:\n    case SPIFFS_ERR_NOT_INDEX:\n    case SPIFFS_ERR_IS_FREE:\n    case SPIFFS_ERR_INDEX_SPAN_MISMATCH:\n    case SPIFFS_ERR_FILE_CLOSED:\n        err = ENOENT;\n        break;\n\n    case SPIFFS_ERR_NAME_TOO_LONG:\n        err = ENAMETOOLONG;\n        break;\n\n    case SPIFFS_ERR_RO_NOT_IMPL:\n    case SPIFFS_ERR_RO_ABORTED_OPERATION:\n        err = EROFS;\n        break;\n\n    case SPIFFS_ERR_SEEK_BOUNDS:\n        err = EOVERFLOW;\n        break;\n\n    case SPIFFS_ERR_END_OF_OBJECT:\n    case SPIFFS_ERR_NO_DELETED_BLOCKS:\n        err = ENODATA;\n        break;\n\n    case SPIFFS_ERR_ERASE_FAIL:\n        err = EIO;\n        break;\n\n    default:\n        err = EIO;\n        break;\n    }\n\n    VFS_ERRNO_SET (err);\n    return -err;\n}\n\nstatic int spiffs_flags_get (int oflags)\n{\n    int flags = 0;\n\n    switch (oflags & O_ACCMODE)\n    {\n    case O_RDONLY:\n        flags |= SPIFFS_O_RDONLY;\n        break;\n    case O_WRONLY:\n        flags |= SPIFFS_O_WRONLY;\n        break;\n    case O_RDWR:\n        flags |= SPIFFS_O_RDWR;\n        break;\n    default:\n        break;\n    }\n\n    if (oflags & O_CREAT)\n    {\n        flags |= SPIFFS_O_CREAT;\n    }\n\n    if (oflags & O_EXCL)\n    {\n        flags |= SPIFFS_O_EXCL;\n    }\n\n    if (oflags & O_TRUNC)\n    {\n        flags |= SPIFFS_O_TRUNC;\n    }\n\n    if (oflags & O_APPEND)\n    {\n        flags |= SPIFFS_O_CREAT | SPIFFS_O_APPEND;\n    }\n\n    return flags;\n}\n\nstatic int spiffs_op_open (struct file *file, const char *path_in_mp, int flags)\n{\n    spiffs              *fs = (spiffs *) file->f_mp->m_data;\n    spiffs_file          s_file;\n\n    s_file = SPIFFS_open (fs, path_in_mp, spiffs_flags_get (flags), 0);\n\n    if (s_file < SPIFFS_OK)\n    {\n        return ret_to_errno(s_file);\n    }\n\n    file->f_data = (void *) (uintptr_t) s_file;\n\n    return 0;\n}\n\nstatic spiffs_file spifd_from_file (struct file *file)\n{\n    return (spiffs_file) (uintptr_t) file->f_data;\n}\n\nstatic int spiffs_op_close (struct file *file)\n{\n    spiffs_file  s_file = spifd_from_file (file);\n    spiffs      *fs     = (spiffs *) file->f_mp->m_data;\n    s32_t res = SPIFFS_close (fs, s_file);\n\n    return ret_to_errno(res);\n}\n\nstatic ssize_t spiffs_op_read (struct file *file, char *buff, size_t bytes)\n{\n    if (buff == NULL || bytes == 0)\n        return -EINVAL;\n\n    spiffs_file  s_file = spifd_from_file (file);\n    spiffs      *fs     = (spiffs *) file->f_mp->m_data;\n    s32_t res = SPIFFS_read (fs, s_file, buff, bytes);\n\n    return res < 0 ? ret_to_errno(res) : res;\n}\n\nstatic ssize_t spiffs_op_write (struct file *file, const char *buff, size_t bytes)\n{\n    if (buff == NULL || bytes == 0)\n        return -EINVAL;\n\n    spiffs_file  s_file = spifd_from_file (file);\n    spiffs      *fs     = (spiffs *) file->f_mp->m_data;\n    s32_t res = SPIFFS_write (fs, s_file, (void *) buff, bytes);\n\n    return res < 0 ? ret_to_errno(res) : res;\n}\n\nstatic off_t spiffs_op_lseek (struct file *file, off_t off, int whence)\n{\n    spiffs_file  s_file = spifd_from_file (file);\n    spiffs      *fs     = (spiffs *) file->f_mp->m_data;\n    s32_t res = SPIFFS_lseek (fs, s_file, off, whence);\n\n    return res < 0 ? ret_to_errno(res) : res;\n}\n\nint spiffs_op_stat (struct mount_point *mp, const char *path_in_mp, struct stat *stat)\n{\n    spiffs_stat s = {0};\n\n    memset(stat, 0, sizeof(*stat));\n    s32_t res = SPIFFS_stat((spiffs *)mp->m_data, path_in_mp, &s);\n    if (res == SPIFFS_OK)\n    {\n        stat->st_size = s.size;\n        if (s.type == SPIFFS_TYPE_DIR)\n        {\n            stat->st_mode = S_IFDIR;\n        }\n        else\n        {\n            stat->st_mode = S_IFREG;\n        }\n    }\n\n    return ret_to_errno(res);\n}\n\nstatic int spiffs_op_unlink (struct mount_point *mp, const char *path_in_mp)\n{\n    s32_t res = SPIFFS_remove ((spiffs *) mp->m_data, path_in_mp);\n    return ret_to_errno(res);\n}\n\nstatic int spiffs_op_rename (struct mount_point *mp, const char *path_in_mp_old,\n                             const char *path_in_mp_new)\n{\n    s32_t res = SPIFFS_rename ((spiffs *) mp->m_data, path_in_mp_old, path_in_mp_new);\n    return ret_to_errno(res);\n}\n\nstatic int spiffs_op_sync (struct file *file)\n{\n    spiffs_file  s_file = spifd_from_file (file);\n    spiffs      *fs     = (spiffs *) file->f_mp->m_data;\n    s32_t res = SPIFFS_fflush (fs, s_file);\n\n    return res < 0 ? ret_to_errno(res) : res;\n}\n\nstatic int spiffs_op_opendir (struct dir *dir, const char *path)\n{\n    spiffs      *fs     = (spiffs *) dir->d_mp->m_data;\n    spiffs_DIR *sdir;\n\n    sdir = (spiffs_DIR *) malloc (sizeof (spiffs_DIR));\n\n    if (sdir == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in SPIFFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        return -ENOMEM;\n    }\n\n    dir->d_data   = (void *) SPIFFS_opendir (fs, path, sdir);\n    dir->d_offset = 0;\n\n    if (dir->d_data == 0)\n    {\n        free (sdir);\n        return -ENOENT;\n    }\n\n    return LOS_OK;\n}\n\nint spiffs_op_readdir (struct dir *dir, struct dirent *dent)\n{\n    struct spiffs_dirent e;\n\n    if (NULL == SPIFFS_readdir ((spiffs_DIR *) dir->d_data, &e))\n    {\n        return -ENOENT;\n    }\n\n    strncpy (dent->name, (const char *) e.name, LOS_MAX_FILE_NAME_LEN - 1);\n    dent->name [LOS_MAX_FILE_NAME_LEN - 1] = '\\0';\n    dent->size = e.size;\n\n    if (e.type == SPIFFS_TYPE_DIR)\n    {\n        dent->type = VFS_TYPE_DIR;\n    }\n    else\n    {\n        dent->type = VFS_TYPE_FILE;\n    }\n\n    return LOS_OK;\n}\n\nstatic int spiffs_op_closedir (struct dir *dir)\n{\n    spiffs_DIR *sdir = (spiffs_DIR *) dir->d_data;\n\n    s32_t res = SPIFFS_closedir (sdir);\n\n    free (sdir);\n\n    return ret_to_errno(res);\n}\n\nstatic struct file_ops spiffs_ops =\n{\n    spiffs_op_open,\n    spiffs_op_close,\n    spiffs_op_read,\n    spiffs_op_write,\n    spiffs_op_lseek,\n    spiffs_op_stat,\n    spiffs_op_unlink,\n    spiffs_op_rename,\n    NULL,               /* ioctl not supported for now */\n    spiffs_op_sync,\n    spiffs_op_opendir,\n    spiffs_op_readdir,\n    spiffs_op_closedir,\n    NULL                /* spiffs do not support mkdir */\n};\n\nstatic struct file_system spiffs_fs =\n{\n    \"spiffs\",\n    &spiffs_ops,\n    NULL,\n    0\n};\n\nstatic spiffs *fs_ptr = NULL;\nstatic u8_t *wbuf_ptr = NULL;\nstatic u8_t *fds_ptr = NULL;\nstatic u8_t *cache_ptr = NULL;\n\nint spiffs_mount (const char *path, u32_t phys_addr, u32_t phys_size,\n                  u32_t phys_erase_block, u32_t log_block_size,\n                  u32_t log_page_size,\n                  s32_t (*spi_rd) (struct spiffs_t *, u32_t, u32_t, u8_t *),\n                  s32_t (*spi_wr) (struct spiffs_t *, u32_t, u32_t, u8_t *),\n                  s32_t (*spi_er) (struct spiffs_t *, u32_t, u32_t))\n{\n    spiffs         *fs;\n    spiffs_config   c;\n    u8_t           *wbuf;\n    u8_t           *fds;\n    u8_t           *cache;\n    int             ret = -1;\n\n#define LOS_SPIFFS_FD_SIZE      (sizeof (spiffs_fd) * 8)\n#define LOS_SPIFFS_CACHE_SIZE   (((log_page_size + 32) * 4) + 40)\n\n    fs    = (spiffs *) malloc (sizeof (spiffs));\n    wbuf  = (u8_t *)   malloc (log_page_size * 2);\n    fds   = (u8_t *)   malloc (LOS_SPIFFS_FD_SIZE);\n    cache = (u8_t *)   malloc (LOS_SPIFFS_CACHE_SIZE);\n\n    if ((fs == NULL) || (wbuf == NULL) || (fds == NULL) || (cache == NULL))\n    {\n        PRINT_ERR (\"fail to malloc memory in SPIFFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        goto err_free;\n    }\n\n    memset (fs, 0, sizeof (spiffs));\n\n    c.hal_read_f       = spi_rd;\n    c.hal_write_f      = spi_wr;\n    c.hal_erase_f      = spi_er;\n    c.log_block_size   = log_block_size;\n    c.log_page_size    = log_page_size;\n    c.phys_addr        = phys_addr;\n    c.phys_erase_block = phys_erase_block;\n    c.phys_size        = phys_size;\n    c.fh_ix_offset     = TEST_SPIFFS_FILEHDL_OFFSET;\n\n    ret = SPIFFS_mount (fs, &c, wbuf, fds, LOS_SPIFFS_FD_SIZE, cache,\n                        LOS_SPIFFS_CACHE_SIZE, NULL);\n\n    if (ret == SPIFFS_ERR_NOT_A_FS)\n    {\n        PRINT_INFO (\"formating fs...\\n\");\n\n        SPIFFS_format (fs);\n\n        ret = SPIFFS_mount (fs, &c, wbuf, fds, LOS_SPIFFS_FD_SIZE, cache,\n                            LOS_SPIFFS_CACHE_SIZE, NULL);\n    }\n\n    if (ret != SPIFFS_OK)\n    {\n        PRINT_ERR (\"format fail!\\n\");\n        goto err_unmount;\n    }\n\n    ret = los_fs_mount (\"spiffs\", path, fs);\n\n    if (ret == LOS_OK)\n    {\n        fs_ptr = fs;\n        wbuf_ptr = wbuf;\n        fds_ptr = fds;\n        cache_ptr = cache;\n        PRINT_INFO (\"spiffs mount at %s done!\\n\", path);\n        return LOS_OK;\n    }\n\n    PRINT_ERR (\"failed to mount!\\n\");\n\nerr_unmount:\n    SPIFFS_unmount (fs);\nerr_free:\n    if (fs != NULL)\n        free (fs);\n    if (wbuf != NULL)\n        free (wbuf);\n    if (fds != NULL)\n        free (fds);\n    if (cache != NULL)\n        free (cache);\n\n    return ret;\n}\n\nint spiffs_unmount(const char *path)\n{\n    if (fs_ptr)\n    {\n        SPIFFS_unmount(fs_ptr);\n        free(fs_ptr);\n        fs_ptr = NULL;\n    }\n    if (wbuf_ptr)\n    {\n        free(wbuf_ptr);\n        wbuf_ptr = NULL;\n    }\n    if (fds_ptr)\n    {\n        free(fds_ptr);\n        fds_ptr = NULL;\n    }\n    if (cache_ptr)\n    {\n        free(cache_ptr);\n        cache_ptr = NULL;\n    }\n\n    los_fs_unmount(path);\n\n    return 0;\n}\n\nint spiffs_init (void)\n{\n    static int spiffs_inited = FALSE;\n\n    if (spiffs_inited)\n    {\n        return LOS_OK;\n    }\n\n    if (los_vfs_init () != LOS_OK)\n    {\n        return LOS_NOK;\n    }\n\n    if (los_fs_register (&spiffs_fs) != LOS_OK)\n    {\n        PRINT_ERR (\"failed to register fs!\\n\");\n        return LOS_NOK;\n    }\n\n    spiffs_inited = TRUE;\n\n    PRINT_INFO (\"register spiffs done!\\n\");\n\n    return LOS_OK;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/FUZZING.md",
    "content": "# Fuzzing SPIFFS\n\nThe SPIFFS test suite includes a test program designed for fuzzing with\n[AFL](http://lcamtuf.coredump.cx/afl/). This automatically exercises the \nSPIFFS API and verifies that the file system does not crash or interact incorrectly\nwith the flash chip. \n\nThere are two steps to fuzzing. The first is to build the test suite with\nthe AFL version of gcc. The CC variable should point to your copy of afl-gcc.\n\n```\nmake clean test CC=/usr/local/bin/afl-gcc\n```\n\nThere is a new test `afl_test` that reads from stdin a list of commands\nand arguments. These are interpreted and executed on the API. The `afltests`\ndirectory contains a number of test cases that can be fed to the `afl_test` test.\n\n\nThe second is to run this test suite under afl as follows (where findings is \nthe output directory):\n\n```\nafl-fuzz -i afltests -o findings ./build/linux_spiffs_test -f afl_test\n```\n\nThis run will take hours (or days) and will (hopefully) not find any crashes.\nIf a crash (or hang) is found, then the input file that caused the crash is \nsaved. This allows the specific test case to be debugged.\n\n## Reducing the size of the file\n\nAFL comes with `afl-tmin` which can reduce the size of the test input file to\nmake it easier to debug.\n\n```\nafl-tmin -i findings/crashes/<somefile> -o smalltest -- build/linux_spiffs_test -f afl_test\n```\n\nThis will write a short version of the testcase file to `smalltest`. This can then be\nfed into the test program for debugging:\n\n```\nbuild/linux_spiffs_test -f afl_test < smalltest\n```\n\nThis should still crash, but allows it to be run under a debugger. \n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2013-2017 Peter Andersson (pelleplutt1976<at>gmail.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/README.md",
    "content": "# SPIFFS (SPI Flash File System) \n**V0.3.7**\n\n[![Build Status](https://travis-ci.org/pellepl/spiffs.svg?branch=master)](https://travis-ci.org/pellepl/spiffs)\n\nCopyright (c) 2013-2017 Peter Andersson (pelleplutt1976 at gmail.com)\n\nFor legal stuff, see [LICENSE](https://github.com/pellepl/spiffs/blob/master/LICENSE). Basically, you may do whatever you want with the source. Use, modify, sell, print it out, roll it and smoke it - as long as I won't be held responsible.\n\nLove to hear feedback though!\n\n\n## INTRODUCTION\n\nSpiffs is a file system intended for SPI NOR flash devices on embedded targets.\n\nSpiffs is designed with following characteristics in mind:\n - Small (embedded) targets, sparse RAM without heap\n - Only big areas of data (blocks) can be erased\n - An erase will reset all bits in block to ones\n - Writing pulls one to zeroes\n - Zeroes can only be pulled to ones by erase\n - Wear leveling\n\n\n## BUILDING\n\n`mkdir build; make`\n\nOtherwise, configure the `builddir` variable towards the top of `makefile` as something opposed to the default `build`. Sanity check on the host via `make test` and refer to `.travis.yml` for the official in-depth testing procedure. See the wiki for [integrating](https://github.com/pellepl/spiffs/wiki/Integrate-spiffs) spiffs into projects and [spiffsimg](https://github.com/nodemcu/nodemcu-firmware/tree/master/tools/spiffsimg) from [nodemcu](https://github.com/nodemcu) is a good example on the subject.\n\n\n## FEATURES\n\nWhat spiffs does:\n - Specifically designed for low ram usage\n - Uses statically sized ram buffers, independent of number of files\n - Posix-like api: open, close, read, write, seek, stat, etc\n - It can run on any NOR flash, not only SPI flash - theoretically also on embedded flash of a microprocessor\n - Multiple spiffs configurations can run on same target - and even on same SPI flash device\n - Implements static wear leveling \n - Built in file system consistency checks\n - Highly configurable\n \nWhat spiffs does not:\n - Presently, spiffs does not support directories. It produces a flat structure. Creating a file with path *tmp/myfile.txt* will create a file called *tmp/myfile.txt* instead of a *myfile.txt* under directory *tmp*. \n - It is not a realtime stack. One write operation might last much longer than another.\n - Poor scalability. Spiffs is intended for small memory devices - the normal sizes for SPI flashes. Going beyond ~128Mbyte is probably a bad idea. This is a side effect of the design goal to use as little ram as possible.\n - Presently, it does not detect or handle bad blocks.\n - One configuration, one binary. There's no generic spiffs binary that handles all types of configurations.\n\n## NOTICE\n\n0.4.0 is under construction. This is a full rewrite and will change the underlying structure. Hence, it will not be compatible with earlier versions of the filesystem. The API is the same, with minor modifications. Some config flags will be removed (as they are mandatory in 0.4.0) and some features might fall away until 0.4.1. If you have any worries or questions, it can be discussed in issue [#179](https://github.com/pellepl/spiffs/issues/179)\n \n## MORE INFO \n \nSee the [wiki](https://github.com/pellepl/spiffs/wiki) for [configuring](https://github.com/pellepl/spiffs/wiki/Configure-spiffs), [integrating](https://github.com/pellepl/spiffs/wiki/Integrate-spiffs), [using](https://github.com/pellepl/spiffs/wiki/Using-spiffs), and [optimizing](https://github.com/pellepl/spiffs/wiki/Performance-and-Optimizing) spiffs.\n \nFor design, see [docs/TECH_SPEC](https://github.com/pellepl/spiffs/blob/master/docs/TECH_SPEC).\n\nFor a generic spi flash driver, see [this](https://github.com/pellepl/spiflash_driver).\n\n## HISTORY\n\n### 0.3.7\n- fixed prevent seeking to negative offsets #158\n- fixed file descriptor offsets not updated for multiple fds on same file #157\n- fixed cache page not closed for removed files #156\n- fixed a lseek bug when seeking exactly to end of a fully indexed first level LUT #148\n- fixed wear leveling issue #145\n- fixed attempt to write out of bounds in flash #130, \n- set file offset when seeking over end #121 (thanks @sensslen)\n- fixed seeking in virgin files #120 (thanks @sensslen)\n- Optional file metadata #128 (thanks @cesanta)\n- AFL testing framework #100 #143 (thanks @pjsg)\n- Testframe updates\n\nNew API functions:\n- `SPIFFS_update_meta, SPIFFS_fupdate_meta` - updates metadata for a file\n\nNew config defines:\n- `SPIFFS_OBJ_META_LEN` - enable possibility to add extra metadata to files\n\n### 0.3.6\n- Fix range bug in index memory mapping #98\n- Add index memory mapping #97\n- Optimize SPIFFS_read for large files #96\n- Add temporal cache for opening files #95\n- More robust gc #93 (thanks @dismirlian)\n- Fixed a double write of same data in certain cache situations\n- Fixed an open bug in READ_ONLY builds\n- File not visible in SPIFFS_readdir #90 (thanks @benpicco-tmp)\n- Cache load code cleanup #92 (thanks @niclash)\n- Fixed lock/unlock asymmetry #88 #87 (thanks @JackJefferson, @dpruessner)\n- Testframe updates\n\nNew API functions:\n- `SPIFFS_ix_map` - map index meta data to memory for a file\n- `SPIFFS_ix_unmap` - unmaps index meta data for a file\n- `SPIFFS_ix_remap` - changes file offset for index metadata map\n- `SPIFFS_bytes_to_ix_map_entries` - utility, get length of needed vector for given amount of bytes\n- `SPIFFS_ix_map_entries_to_bytes` - utility, get number of bytes a vector can represent given length\n \nNew config defines:\n- `SPIFFS_IX_MAP` - enable possibility to map index meta data to memory for reading faster \n- `SPIFFS_TEMPORAL_FD_CACHE` - enable temporal cache for opening files faster\n- `SPIFFS_TEMPORAL_CACHE_HIT_SCORE` - for tuning the temporal cache\n\n### 0.3.5\n- Fixed a bug in fs check\n- API returns actual error codes #84) (thanks @Nails)\n- Fix compiler warnings for non-gcc #83 #81 (thanks @Nails)\n- Unable to recover from full fs #82 (thanks @rojer)\n- Define SPIFFS_O_* flags #80\n- Problem with long filenames #79 (thanks @psjg)\n- Duplicate file name bug fix #74 (thanks @igrr)\n- SPIFFS_eof and SPIFFS_tell return wrong value #72 (thanks @ArtemPisarenko)\n- Bunch of testframe updates #77 #78 #86 (thanks @dpreussner, @psjg a.o)  \n\n### 0.3.4\n- Added user callback file func.\n- Fixed a stat bug with obj id.\n- SPIFFS_probe_fs added\n- Add possibility to compile a read-only version of spiffs\n- Make magic dependent on fs length, if needed (see #59 & #66) (thanks @hreintke)\n- Exposed SPIFFS_open_by_page_function\n- Zero-size file cannot be seek #57 (thanks @lishen2)\n- Add tell and eof functions #54 (thanks @raburton)\n- Make api string params const #53 (thanks @raburton)\n- Preserve user_data during mount() #51 (thanks @rojer)\n\nNew API functions:\n- `SPIFFS_set_file_callback_func` - register a callback informing about file events\n- `SPIFFS_probe_fs` - probe a spi flash trying to figure out size of fs\n- `SPIFFS_open_by_page` - open a file by page index\n- `SPIFFS_eof` - checks if end of file is reached\n- `SPIFFS_tell` - returns current file offset\n\nNew config defines:\n- `SPIFFS_READ_ONLY`\n- `SPIFFS_USE_MAGIC_LENGTH`\n\n### 0.3.3\n**Might not be compatible with 0.3.2 structures. See issue #40**\n- Possibility to add integer offset to file handles\n- Truncate function presumes too few free pages #49\n- Bug in truncate function #48 (thanks @PawelDefee)\n- Update spiffs_gc.c - remove unnecessary parameter (thanks @PawelDefee)\n- Update INTEGRATION docs (thanks @PawelDefee)\n- Fix pointer truncation in 64-bit platforms (thanks @igrr)\n- Zero-sized files cannot be read #44 (thanks @rojer)\n- (More) correct calculation of max_id in obj_lu_find #42 #41 (thanks @lishen2)\n- Check correct error code in obj_lu_find_free #41 (thanks @lishen2)\n- Moar comments for SPIFFS_lseek (thanks @igrr)\n- Fixed padding in spiffs_page_object_ix #40 (thanks @jmattsson @lishen2)\n- Fixed gc_quick test (thanks @jmattsson)\n- Add SPIFFS_EXCL flag #36 \n- SPIFFS_close may fail silently if cache is enabled #37 \n- User data in callbacks #34\n- Ignoring SINGLETON build in cache setup (thanks Luca)\n- Compilation error fixed #32 (thanks @chotasanjiv)\n- Align cand_scores (thanks @hefloryd)\n- Fix build warnings when SPIFFS_CACHE is 0 (thanks @ajaybhargav)\n\nNew config defines:\n- `SPIFFS_FILEHDL_OFFSET`\n\n### 0.3.2\n- Limit cache size if too much cache is given (thanks pgeiem)\n- New feature - Controlled erase. #23\n- SPIFFS_rename leaks file descriptors #28 (thanks benpicco)\n- moved dbg print defines in test framework to params_test.h\n- lseek should return the resulting offset (thanks hefloryd)\n- fixed type on dbg ifdefs\n- silence warning about signed/unsigned comparison when spiffs_obj_id is 32 bit (thanks benpicco)\n- Possible error in test_spiffs.c #21 (thanks yihcdaso-yeskela)\n- Cache might writethrough too often #16\n- even moar testrunner updates\n- Test framework update and some added tests\n- Some thoughts for next gen\n- Test sigsevs when having too many sectors #13  (thanks alonewolfx2)\n- GC might be suboptimal #11\n- Fix eternal readdir when objheader at last block, last entry\n  \nNew API functions:\n- `SPIFFS_gc_quick` - call a nonintrusive gc\n- `SPIFFS_gc` - call a full-scale intrusive gc\n\n### 0.3.1\n- Removed two return warnings, was too triggerhappy on release\n\n### 0.3.0\n- Added existing namecheck when creating files\n- Lots of static analysis bugs #6\n- Added rename func\n- Fix SPIFFS_read length when reading beyond file size\n- Added reading beyond file length testcase\n- Made build a bit more configurable\n- Changed name in spiffs from \"errno\" to \"err_code\" due to conflicts compiling in mingw\n- Improved GC checks, fixed an append bug, more robust truncate for very special case\n- GC checks preempts GC, truncate even less picky\n- Struct alignment needed for some targets, define in spiffs config #10\n- Spiffs filesystem magic, definable in config\n\nNew config defines:\n- `SPIFFS_USE_MAGIC` - enable or disable magic check upon mount\n- `SPIFFS_ALIGNED_OBJECT_INDEX_TABLES` - alignment for certain targets\n\nNew API functions:\n- `SPIFFS_rename` - rename files\n- `SPIFFS_clearerr` - clears last errno\n- `SPIFFS_info` - returns info on used and total bytes in fs\n- `SPIFFS_format` - formats the filesystem\n- `SPIFFS_mounted` - checks if filesystem is mounted\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/docs/TECH_SPEC",
    "content": "* USING SPIFFS\n\nTODO\n\n\n* SPIFFS DESIGN\n\nSpiffs is inspired by YAFFS. However, YAFFS is designed for NAND flashes, and\nfor bigger targets with much more ram. Nevertheless, many wise thoughts have\nbeen borrowed from YAFFS when writing spiffs. Kudos!\n\nThe main complication writing spiffs was that it cannot be assumed the target\nhas a heap. Spiffs must go along only with the work ram buffer given to it. \nThis forces extra implementation on many areas of spiffs.\n\n\n** SPI flash devices using NOR technology\n\nBelow is a small description of how SPI flashes work internally. This is to\ngive an understanding of the design choices made in spiffs.\n\nSPI flash devices are physically divided in blocks. On some SPI flash devices,\nblocks are further divided into sectors. Datasheets sometimes name blocks as \nsectors and vice versa.\n\nCommon memory capacaties for SPI flashes are 512kB up to 8MB of data, where\nblocks may be 64kB. Sectors can be e.g. 4kB, if supported. Many SPI flashes \nhave uniform block sizes, whereas others have non-uniform - the latter meaning \nthat e.g. the first 16 blocks are 4kB big, and the rest are 64kB.\n\nThe entire memory is linear and can be read and written in random access. \nErasing can only be done block- or sectorwise; or by mass erase.\n\nSPI flashes can normally be erased from 100.000 up to 1.000.000 cycles before\nthey fail.\n\nA clean SPI flash from factory have all bits in entire memory set to one. A\nmass erase will reset the device to this state. Block or sector erasing will\nput the all bits in the area given by the sector or block to ones. Writing to a\nNOR flash pulls ones to zeroes. Writing 0xFF to an address is simply a no-op. \n\nWriting 0b10101010 to a flash address holding 0b00001111 will yield 0b00001010.\n\nThis way of \"write by nand\" is used considerably in spiffs.\n\nCommon characteristics of NOR flashes are quick reads, but slow writes.\n\nAnd finally, unlike NAND flashes, NOR flashes seem to not need any error \ncorrection. They always write correctly I gather.\n\n\n** Spiffs logical structure\n\nSome terminology before proceeding. Physical blocks/sectors means sizes stated\nin the datasheet. Logical blocks and pages is something the integrator choose.\n\n\n** Blocks and pages\n\nSpiffs is allocated to a part or all of the memory of the SPI flash device. \nThis area is divided into logical blocks, which in turn are divided into \nlogical pages. The boundary of a logical block must coincide with one or more \nphysical blocks. The sizes for logical blocks and logical pages always remain\nthe same, they are uniform.\n\nExample: non-uniform flash mapped to spiffs with 128kB logical blocks\n\nPHYSICAL FLASH BLOCKS               SPIFFS LOGICAL BLOCKS: 128kB\n\n+-----------------------+   - - -   +-----------------------+\n| Block 1 : 16kB        |           | Block 1 : 128kB       |\n+-----------------------+           |                       |\n| Block 2 : 16kB        |           |                       |\n+-----------------------+           |                       |\n| Block 3 : 16kB        |           |                       |\n+-----------------------+           |                       |\n| Block 4 : 16kB        |           |                       |\n+-----------------------+           |                       |\n| Block 5 : 64kB        |           |                       |\n+-----------------------+   - - -   +-----------------------+\n| Block 6 : 64kB        |           | Block 2 : 128kB       |\n+-----------------------+           |                       |\n| Block 7 : 64kB        |           |                       |\n+-----------------------+   - - -   +-----------------------+\n| Block 8 : 64kB        |           | Block 3 : 128kB       |\n+-----------------------+           |                       |\n| Block 9 : 64kB        |           |                       |\n+-----------------------+   - - -   +-----------------------+\n| ...                   |           | ...                   |\n\nA logical block is divided further into a number of logical pages. A page \ndefines the smallest data holding element known to spiffs. Hence, if a file\nis created being one byte big, it will occupy one page for index and one page\nfor data - it will occupy 2 x size of a logical page on flash.\nSo it seems it is good to select a small page size.\n\nEach page has a metadata header being normally 5 to 9 bytes. This said, a very\nsmall page size will make metadata occupy a lot of the memory on the flash. A\npage size of 64 bytes will waste 8-14% on metadata, while 256 bytes 2-4%.\nSo it seems it is good to select a big page size.\n\nAlso, spiffs uses a ram buffer being two times the page size. This ram buffer\nis used for loading and manipulating pages, but it is also used for algorithms \nto find free file ids, scanning the file system, etc. Having too small a page\nsize means less work buffer for spiffs, ending up in more reads operations and\neventually gives a slower file system.\n\nChoosing the page size for the system involves many factors:\n - How big is the logical block size\n - What is the normal size of most files\n - How much ram can be spent\n - How much data (vs metadata) must be crammed into the file system\n - How fast must spiffs be\n - Other things impossible to find out\n \nSo, chosing the Optimal Page Size (tm) seems tricky, to say the least. Don't \nfret - there is no optimal page size. This varies from how the target will use\nspiffs. Use the golden rule:\n\n        ~~~   Logical Page Size = Logical Block Size / 256   ~~~\n\nThis is a good starting point. The final page size can then be derived through \nheuristical experimenting for us non-analytical minds.\n\n\n** Objects, indices and look-ups\n\nA file, or an object as called in spiffs, is identified by an object id. \nAnother YAFFS rip-off. This object id is a part of the page header. So, all \npages know to which object/file they belong - not counting the free pages.\n\nAn object is made up of two types of pages: object index pages and data pages.\nData pages contain the data written by user. Index pages contain metadata about\nthe object, more specifically what data pages are part of the object.\n\nThe page header also includes something called a span index. Let's say a file\nis written covering three data pages. The first data page will then have span \nindex 0, the second span index 1, and the last data page will have span index\n2. Simple as that. \n\nFinally, each page header contain flags, telling if the page is used, \ndeleted, finalized, holds index or data, and more.\n\nObject indices also have span indices, where an object index with span index 0\nis referred to as the object index header. This page does not only contain \nreferences to data pages, but also extra info such as object name, object size\nin bytes, flags for file or directory, etc.\n\nIf one were to create a file covering three data pages, named e.g. \n\"spandex-joke.txt\", given object id 12, it could look like this:\n\nPAGE 0  <things to be unveiled soon>\n\nPAGE 1  page header:   [obj_id:12  span_ix:0  flags:USED|DATA]\n        <first data page of joke>\n\nPAGE 2  page header:   [obj_id:12  span_ix:1  flags:USED|DATA]\n        <second data page of joke>\n\nPAGE 3  page header:   [obj_id:545 span_ix:13 flags:USED|DATA]\n        <some data belonging to object 545, probably not very amusing>\n\nPAGE 4  page header:   [obj_id:12  span_ix:2  flags:USED|DATA]\n        <third data page of joke>\n\nPAGE 5  page header:   [obj_id:12  span_ix:0  flags:USED|INDEX]\n        obj ix header: [name:spandex-joke.txt  size:600 bytes  flags:FILE] \n        obj ix:        [1 2 4]\n        \nLooking in detail at page 5, the object index header page, the object index\narray refers to each data page in order, as mentioned before. The index of the\nobject index array correlates with the data page span index.\n\n                            entry ix:  0 1 2\n                              obj ix: [1 2 4]\n                                       | | |\n    PAGE 1, DATA, SPAN_IX 0    --------/ | |\n      PAGE 2, DATA, SPAN_IX 1    --------/ |\n        PAGE 4, DATA, SPAN_IX 2    --------/\n        \nThings to be unveiled in page 0 - well.. Spiffs is designed for systems low on \nram. We cannot keep a dynamic list on the whereabouts of each object index \nheader so we can find a file fast. There might not even be a heap! But, we do \nnot want to scan all page headers on the flash to find the object index header.\n\nThe first page(s) of each block contains the so called object look-up. These \nare not normal pages, they do not have a header. Instead, they are arrays \npointing out what object-id the rest of all pages in the block belongs to.\n\nBy this look-up, only the first page(s) in each block must to scanned to find \nthe actual page which contains the object index header of the desired object.\n\nThe object lookup is redundant metadata. The assumption is that it presents \nless overhead reading a full page of data to memory from each block and search\nthat, instead of reading a small amount of data from each page (i.e. the page \nheader) in all blocks. Each read operation from SPI flash normally contains \nextra data as the read command itself and the flash address. Also, depending on\nthe underlying implementation, other criterions may need to be passed for each \nread transaction, like mutexes and such.\n\nThe veiled example unveiled would look like this, with some extra pages:\n\nPAGE 0  [  12   12  545   12   12   34   34    4    0    0    0    0 ...]\nPAGE 1  page header:   [obj_id:12  span_ix:0  flags:USED|DATA] ...\nPAGE 2  page header:   [obj_id:12  span_ix:1  flags:USED|DATA] ...\nPAGE 3  page header:   [obj_id:545 span_ix:13 flags:USED|DATA] ...\nPAGE 4  page header:   [obj_id:12  span_ix:2  flags:USED|DATA] ...\nPAGE 5  page header:   [obj_id:12  span_ix:0  flags:USED|INDEX] ...\nPAGE 6  page header:   [obj_id:34  span_ix:0  flags:USED|DATA] ...\nPAGE 7  page header:   [obj_id:34  span_ix:1  flags:USED|DATA] ...\nPAGE 8  page header:   [obj_id:4   span_ix:1  flags:USED|INDEX] ...\nPAGE 9  page header:   [obj_id:23  span_ix:0  flags:DELETED|INDEX] ...\nPAGE 10 page header:   [obj_id:23  span_ix:0  flags:DELETED|DATA] ...\nPAGE 11 page header:   [obj_id:23  span_ix:1  flags:DELETED|DATA] ...\nPAGE 12 page header:   [obj_id:23  span_ix:2  flags:DELETED|DATA] ...\n...\n\nOk, so why are page 9 to 12 marked as 0 when they belong to object id 23? These\npages are deleted, so this is marked both in page header flags and in the look\nup. This is an example where spiffs uses NOR flashes \"nand-way\" of writing.\n\nAs a matter of fact, there are two object id's which are special:\n\nobj id 0 (all bits zeroes) - indicates a deleted page in object look up  \nobj id 0xff.. (all bits ones) - indicates a free page in object look up \n\nActually, the object id's have another quirk: if the most significant bit is\nset, this indicates an object index page. If the most significant bit is zero,\nthis indicates a data page. So to be fully correct, page 0 in above example \nwould look like this:\n\nPAGE 0  [  12   12  545   12  *12   34   34   *4    0    0    0    0 ...]\n\nwhere the asterisk means the msb of the object id is set.\n\nThis is another way to speed up the searches when looking for object indices.\nBy looking on the object id's msb in the object lookup, it is also possible \nto find out whether the page is an object index page or a data page.\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/docs/TODO",
    "content": "* When mending lost pages, also see if they fit into length specified in object index header\n\nSPIFFS2 thoughts\n\n* Instead of exact object id:s in the object lookup tables, use a hash of span index and object id.\n  Eg. object id xor:ed with bit-reversed span index.\n  This should decrease number of actual pages that needs to be visited when looking thru the obj lut.\n\n* Logical number of each block. When moving stuff in a garbage collected page, the free\n  page is assigned the same number as the garbage collected. Thus, object index pages do not have to\n  be rewritten.\n\n* Steal one page, use as a bit parity page. When starting an fs modification operation, write one bit\n  as zero. When ending, write another bit as zero. On mount, if number of zeroes in page is uneven, a\n  check is automatically run."
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/src/default/spiffs_config.h",
    "content": "/*\n * spiffs_config.h\n *\n *  Created on: Jul 3, 2013\n *      Author: petera\n */\n\n#ifndef SPIFFS_CONFIG_H_\n#define SPIFFS_CONFIG_H_\n\n#include <stddef.h>\n#include \"fs/los_vfs.h\"\n\n\n// Physical offset(in bytes) in spi flash used for spiffs\n// Must be on 64k boundary\n#define SPIFFS_PHYS_ADDR    0\n\n// Physical size(in bytes) of the spi flash used for spiffs\n// Must be on 64k boundary\n#define SPIFFS_PHYS_SIZE    0x100000\n\n\n// compile time switches\n#define SPIFFS_USE_MAGIC            1\n#define SPIFFS_USE_MAGIC_LENGTH     1\n#define SPIFFS_HAL_CALLBACK_EXTRA   1\n#define SPIFFS_FILEHDL_OFFSET       1\n#define TEST_SPIFFS_FILEHDL_OFFSET  0x1000\n#define SPIFFS_OBJ_NAME_LEN         LOS_MAX_FILE_NAME_LEN\n\n// Set generic spiffs debug output call.\n#ifndef SPIFFS_DBG\n#define SPIFFS_DBG(_f, ...) //printf(_f, ## __VA_ARGS__)\n#endif\n// Set spiffs debug output call for garbage collecting.\n#ifndef SPIFFS_GC_DBG\n#define SPIFFS_GC_DBG(_f, ...) //printf(_f, ## __VA_ARGS__)\n#endif\n// Set spiffs debug output call for caching.\n#ifndef SPIFFS_CACHE_DBG\n#define SPIFFS_CACHE_DBG(_f, ...) //printf(_f, ## __VA_ARGS__)\n#endif\n// Set spiffs debug output call for system consistency checks.\n#ifndef SPIFFS_CHECK_DBG\n#define SPIFFS_CHECK_DBG(_f, ...) //printf(_f, ## __VA_ARGS__)\n#endif\n// Set spiffs debug output call for all api invocations.\n#ifndef SPIFFS_API_DBG\n#define SPIFFS_API_DBG(_f, ...) //printf(_f, ## __VA_ARGS__)\n#endif\n\n\n// Defines spiffs debug print formatters\n// some general signed number\n#ifndef _SPIPRIi\n#define _SPIPRIi   \"%ld\"\n#endif\n// address\n#ifndef _SPIPRIad\n#define _SPIPRIad  \"%08x\"\n#endif\n// block\n#ifndef _SPIPRIbl\n#define _SPIPRIbl  \"%04x\"\n#endif\n// page\n#ifndef _SPIPRIpg\n#define _SPIPRIpg  \"%04x\"\n#endif\n// span index\n#ifndef _SPIPRIsp\n#define _SPIPRIsp  \"%04x\"\n#endif\n// file descriptor\n#ifndef _SPIPRIfd\n#define _SPIPRIfd  \"%d\"\n#endif\n// file object id\n#ifndef _SPIPRIid\n#define _SPIPRIid  \"%04x\"\n#endif\n// file flags\n#ifndef _SPIPRIfl\n#define _SPIPRIfl  \"%02x\"\n#endif\n\n\n// Enable/disable API functions to determine exact number of bytes\n// for filedescriptor and cache buffers. Once decided for a configuration,\n// this can be disabled to reduce flash.\n#ifndef SPIFFS_BUFFER_HELP\n#define SPIFFS_BUFFER_HELP              0\n#endif\n\n// Enables/disable memory read caching of nucleus file system operations.\n// If enabled, memory area must be provided for cache in SPIFFS_mount.\n#ifndef  SPIFFS_CACHE\n#define SPIFFS_CACHE                    1\n#endif\n#if SPIFFS_CACHE\n// Enables memory write caching for file descriptors in hydrogen\n#ifndef  SPIFFS_CACHE_WR\n#define SPIFFS_CACHE_WR                 1\n#endif\n\n// Enable/disable statistics on caching. Debug/test purpose only.\n#ifndef  SPIFFS_CACHE_STATS\n#define SPIFFS_CACHE_STATS              1\n#endif\n#endif\n\n// Always check header of each accessed page to ensure consistent state.\n// If enabled it will increase number of reads, will increase flash.\n#ifndef SPIFFS_PAGE_CHECK\n#define SPIFFS_PAGE_CHECK               1\n#endif\n\n// Define maximum number of gc runs to perform to reach desired free pages.\n#ifndef SPIFFS_GC_MAX_RUNS\n#define SPIFFS_GC_MAX_RUNS              5\n#endif\n\n// Enable/disable statistics on gc. Debug/test purpose only.\n#ifndef SPIFFS_GC_STATS\n#define SPIFFS_GC_STATS                 1\n#endif\n\n// Garbage collecting examines all pages in a block which and sums up\n// to a block score. Deleted pages normally gives positive score and\n// used pages normally gives a negative score (as these must be moved).\n// To have a fair wear-leveling, the erase age is also included in score,\n// whose factor normally is the most positive.\n// The larger the score, the more likely it is that the block will\n// picked for garbage collection.\n\n// Garbage collecting heuristics - weight used for deleted pages.\n#ifndef SPIFFS_GC_HEUR_W_DELET\n#define SPIFFS_GC_HEUR_W_DELET          (5)\n#endif\n// Garbage collecting heuristics - weight used for used pages.\n#ifndef SPIFFS_GC_HEUR_W_USED\n#define SPIFFS_GC_HEUR_W_USED           (-1)\n#endif\n// Garbage collecting heuristics - weight used for time between\n// last erased and erase of this block.\n#ifndef SPIFFS_GC_HEUR_W_ERASE_AGE\n#define SPIFFS_GC_HEUR_W_ERASE_AGE      (50)\n#endif\n\n// Object name maximum length. Note that this length include the\n// zero-termination character, meaning maximum string of characters\n// can at most be SPIFFS_OBJ_NAME_LEN - 1.\n#ifndef SPIFFS_OBJ_NAME_LEN\n#define SPIFFS_OBJ_NAME_LEN             (32)\n#endif\n\n// Maximum length of the metadata associated with an object.\n// Setting to non-zero value enables metadata-related API but also\n// changes the on-disk format, so the change is not backward-compatible.\n//\n// Do note: the meta length must never exceed\n// logical_page_size - (SPIFFS_OBJ_NAME_LEN + 64)\n//\n// This is derived from following:\n// logical_page_size - (SPIFFS_OBJ_NAME_LEN + sizeof(spiffs_page_header) +\n// spiffs_object_ix_header fields + at least some LUT entries)\n#ifndef SPIFFS_OBJ_META_LEN\n#define SPIFFS_OBJ_META_LEN             (0)\n#endif\n\n// Size of buffer allocated on stack used when copying data.\n// Lower value generates more read/writes. No meaning having it bigger\n// than logical page size.\n#ifndef SPIFFS_COPY_BUFFER_STACK\n#define SPIFFS_COPY_BUFFER_STACK        (64)\n#endif\n\n// Enable this to have an identifiable spiffs filesystem. This will look for\n// a magic in all sectors to determine if this is a valid spiffs system or\n// not on mount point. If not, SPIFFS_format must be called prior to mounting\n// again.\n#ifndef SPIFFS_USE_MAGIC\n#define SPIFFS_USE_MAGIC                (0)\n#endif\n\n#if SPIFFS_USE_MAGIC\n// Only valid when SPIFFS_USE_MAGIC is enabled. If SPIFFS_USE_MAGIC_LENGTH is\n// enabled, the magic will also be dependent on the length of the filesystem.\n// For example, a filesystem configured and formatted for 4 megabytes will not\n// be accepted for mounting with a configuration defining the filesystem as 2\n// megabytes.\n#ifndef SPIFFS_USE_MAGIC_LENGTH\n#define SPIFFS_USE_MAGIC_LENGTH         (0)\n#endif\n#endif\n\n// SPIFFS_LOCK and SPIFFS_UNLOCK protects spiffs from reentrancy on api level\n// These should be defined on a multithreaded system\n\n// define this to enter a mutex if you're running on a multithreaded system\n#ifndef SPIFFS_LOCK\n#define SPIFFS_LOCK(fs)\n#endif\n// define this to exit a mutex if you're running on a multithreaded system\n#ifndef SPIFFS_UNLOCK\n#define SPIFFS_UNLOCK(fs)\n#endif\n\n// Enable if only one spiffs instance with constant configuration will exist\n// on the target. This will reduce calculations, flash and memory accesses.\n// Parts of configuration must be defined below instead of at time of mount.\n#ifndef SPIFFS_SINGLETON\n#define SPIFFS_SINGLETON 0\n#endif\n\n#if SPIFFS_SINGLETON\n// Instead of giving parameters in config struct, singleton build must\n// give parameters in defines below.\n#ifndef SPIFFS_CFG_PHYS_SZ\n#define SPIFFS_CFG_PHYS_SZ(ignore)        (1024*1024*2)\n#endif\n#ifndef SPIFFS_CFG_PHYS_ERASE_SZ\n#define SPIFFS_CFG_PHYS_ERASE_SZ(ignore)  (65536)\n#endif\n#ifndef SPIFFS_CFG_PHYS_ADDR\n#define SPIFFS_CFG_PHYS_ADDR(ignore)      (0)\n#endif\n#ifndef SPIFFS_CFG_LOG_PAGE_SZ\n#define SPIFFS_CFG_LOG_PAGE_SZ(ignore)    (256)\n#endif\n#ifndef SPIFFS_CFG_LOG_BLOCK_SZ\n#define SPIFFS_CFG_LOG_BLOCK_SZ(ignore)   (65536)\n#endif\n#endif\n\n// Enable this if your target needs aligned data for index tables\n#ifndef SPIFFS_ALIGNED_OBJECT_INDEX_TABLES\n#define SPIFFS_ALIGNED_OBJECT_INDEX_TABLES       0\n#endif\n\n// Enable this if you want the HAL callbacks to be called with the spiffs struct\n#ifndef SPIFFS_HAL_CALLBACK_EXTRA\n#define SPIFFS_HAL_CALLBACK_EXTRA         0\n#endif\n\n// Enable this if you want to add an integer offset to all file handles\n// (spiffs_file). This is useful if running multiple instances of spiffs on\n// same target, in order to recognise to what spiffs instance a file handle\n// belongs.\n// NB: This adds config field fh_ix_offset in the configuration struct when\n// mounting, which must be defined.\n#ifndef SPIFFS_FILEHDL_OFFSET\n#define SPIFFS_FILEHDL_OFFSET                 0\n#endif\n\n// Enable this to compile a read only version of spiffs.\n// This will reduce binary size of spiffs. All code comprising modification\n// of the file system will not be compiled. Some config will be ignored.\n// HAL functions for erasing and writing to spi-flash may be null. Cache\n// can be disabled for even further binary size reduction (and ram savings).\n// Functions modifying the fs will return SPIFFS_ERR_RO_NOT_IMPL.\n// If the file system cannot be mounted due to aborted erase operation and\n// SPIFFS_USE_MAGIC is enabled, SPIFFS_ERR_RO_ABORTED_OPERATION will be\n// returned.\n// Might be useful for e.g. bootloaders and such.\n#ifndef SPIFFS_READ_ONLY\n#define SPIFFS_READ_ONLY                      0\n#endif\n\n// Enable this to add a temporal file cache using the fd buffer.\n// The effects of the cache is that SPIFFS_open will find the file faster in\n// certain cases. It will make it a lot easier for spiffs to find files\n// opened frequently, reducing number of readings from the spi flash for\n// finding those files.\n// This will grow each fd by 6 bytes. If your files are opened in patterns\n// with a degree of temporal locality, the system is optimized.\n// Examples can be letting spiffs serve web content, where one file is the css.\n// The css is accessed for each html file that is opened, meaning it is\n// accessed almost every second time a file is opened. Another example could be\n// a log file that is often opened, written, and closed.\n// The size of the cache is number of given file descriptors, as it piggybacks\n// on the fd update mechanism. The cache lives in the closed file descriptors.\n// When closed, the fd know the whereabouts of the file. Instead of forgetting\n// this, the temporal cache will keep handling updates to that file even if the\n// fd is closed. If the file is opened again, the location of the file is found\n// directly. If all available descriptors become opened, all cache memory is\n// lost.\n#ifndef SPIFFS_TEMPORAL_FD_CACHE\n#define SPIFFS_TEMPORAL_FD_CACHE              1\n#endif\n\n// Temporal file cache hit score. Each time a file is opened, all cached files\n// will lose one point. If the opened file is found in cache, that entry will\n// gain SPIFFS_TEMPORAL_CACHE_HIT_SCORE points. One can experiment with this\n// value for the specific access patterns of the application. However, it must\n// be between 1 (no gain for hitting a cached entry often) and 255.\n#ifndef SPIFFS_TEMPORAL_CACHE_HIT_SCORE\n#define SPIFFS_TEMPORAL_CACHE_HIT_SCORE       4\n#endif\n\n// Enable to be able to map object indices to memory.\n// This allows for faster and more deterministic reading if cases of reading\n// large files and when changing file offset by seeking around a lot.\n// When mapping a file's index, the file system will be scanned for index pages\n// and the info will be put in memory provided by user. When reading, the\n// memory map can be looked up instead of searching for index pages on the\n// medium. This way, user can trade memory against performance.\n// Whole, parts of, or future parts not being written yet can be mapped. The\n// memory array will be owned by spiffs and updated accordingly during garbage\n// collecting or when modifying the indices. The latter is invoked by when the\n// file is modified in some way. The index buffer is tied to the file\n// descriptor.\n#ifndef SPIFFS_IX_MAP\n#define SPIFFS_IX_MAP                         1\n#endif\n\n// By default SPIFFS in some cases relies on the property of NOR flash that bits\n// cannot be set from 0 to 1 by writing and that controllers will ignore such\n// bit changes. This results in fewer reads as SPIFFS can in some cases perform\n// blind writes, with all bits set to 1 and only those it needs reset set to 0.\n// Most of the chips and controllers allow this behavior, so the default is to\n// use this technique. If your controller is one of the rare ones that don't,\n// turn this option on and SPIFFS will perform a read-modify-write instead.\n#ifndef SPIFFS_NO_BLIND_WRITES\n#define SPIFFS_NO_BLIND_WRITES                0\n#endif\n\n// Set SPIFFS_TEST_VISUALISATION to non-zero to enable SPIFFS_vis function\n// in the api. This function will visualize all filesystem using given printf\n// function.\n#ifndef SPIFFS_TEST_VISUALISATION\n#define SPIFFS_TEST_VISUALISATION         1\n#endif\n#if SPIFFS_TEST_VISUALISATION\n#ifndef spiffs_printf\n#define spiffs_printf(...)                printf(__VA_ARGS__)\n#endif\n// spiffs_printf argument for a free page\n#ifndef SPIFFS_TEST_VIS_FREE_STR\n#define SPIFFS_TEST_VIS_FREE_STR          \"_\"\n#endif\n// spiffs_printf argument for a deleted page\n#ifndef SPIFFS_TEST_VIS_DELE_STR\n#define SPIFFS_TEST_VIS_DELE_STR          \"/\"\n#endif\n// spiffs_printf argument for an index page for given object id\n#ifndef SPIFFS_TEST_VIS_INDX_STR\n#define SPIFFS_TEST_VIS_INDX_STR(id)      \"i\"\n#endif\n// spiffs_printf argument for a data page for given object id\n#ifndef SPIFFS_TEST_VIS_DATA_STR\n#define SPIFFS_TEST_VIS_DATA_STR(id)      \"d\"\n#endif\n#endif\n\n\ntypedef signed long s32_t;\ntypedef unsigned long u32_t;\ntypedef signed short s16_t;\ntypedef unsigned short u16_t;\ntypedef signed char s8_t;\ntypedef unsigned char u8_t;\n\n\n// Types depending on configuration such as the amount of flash bytes\n// given to spiffs file system in total (spiffs_file_system_size),\n// the logical block size (log_block_size), and the logical page size\n// (log_page_size)\n\n// Block index type. Make sure the size of this type can hold\n// the highest number of all blocks - i.e. spiffs_file_system_size / log_block_size\ntypedef u16_t spiffs_block_ix;\n// Page index type. Make sure the size of this type can hold\n// the highest page number of all pages - i.e. spiffs_file_system_size / log_page_size\ntypedef u16_t spiffs_page_ix;\n// Object id type - most significant bit is reserved for index flag. Make sure the\n// size of this type can hold the highest object id on a full system,\n// i.e. 2 + (spiffs_file_system_size / (2*log_page_size))*2\ntypedef u16_t spiffs_obj_id;\n// Object span index type. Make sure the size of this type can\n// hold the largest possible span index on the system -\n// i.e. (spiffs_file_system_size / log_page_size) - 1\ntypedef u16_t spiffs_span_ix;\n\n#endif /* SPIFFS_CONFIG_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/src/spiffs.h",
    "content": "/*\n * spiffs.h\n *\n *  Created on: May 26, 2013\n *      Author: petera\n */\n\n#ifndef SPIFFS_H_\n#define SPIFFS_H_\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n#include \"spiffs_config.h\"\n\n#define SPIFFS_OK                       0\n#define SPIFFS_ERR_NOT_MOUNTED          -10000\n#define SPIFFS_ERR_FULL                 -10001\n#define SPIFFS_ERR_NOT_FOUND            -10002\n#define SPIFFS_ERR_END_OF_OBJECT        -10003\n#define SPIFFS_ERR_DELETED              -10004\n#define SPIFFS_ERR_NOT_FINALIZED        -10005\n#define SPIFFS_ERR_NOT_INDEX            -10006\n#define SPIFFS_ERR_OUT_OF_FILE_DESCS    -10007\n#define SPIFFS_ERR_FILE_CLOSED          -10008\n#define SPIFFS_ERR_FILE_DELETED         -10009\n#define SPIFFS_ERR_BAD_DESCRIPTOR       -10010\n#define SPIFFS_ERR_IS_INDEX             -10011\n#define SPIFFS_ERR_IS_FREE              -10012\n#define SPIFFS_ERR_INDEX_SPAN_MISMATCH  -10013\n#define SPIFFS_ERR_DATA_SPAN_MISMATCH   -10014\n#define SPIFFS_ERR_INDEX_REF_FREE       -10015\n#define SPIFFS_ERR_INDEX_REF_LU         -10016\n#define SPIFFS_ERR_INDEX_REF_INVALID    -10017\n#define SPIFFS_ERR_INDEX_FREE           -10018\n#define SPIFFS_ERR_INDEX_LU             -10019\n#define SPIFFS_ERR_INDEX_INVALID        -10020\n#define SPIFFS_ERR_NOT_WRITABLE         -10021\n#define SPIFFS_ERR_NOT_READABLE         -10022\n#define SPIFFS_ERR_CONFLICTING_NAME     -10023\n#define SPIFFS_ERR_NOT_CONFIGURED       -10024\n\n#define SPIFFS_ERR_NOT_A_FS             -10025\n#define SPIFFS_ERR_MOUNTED              -10026\n#define SPIFFS_ERR_ERASE_FAIL           -10027\n#define SPIFFS_ERR_MAGIC_NOT_POSSIBLE   -10028\n\n#define SPIFFS_ERR_NO_DELETED_BLOCKS    -10029\n\n#define SPIFFS_ERR_FILE_EXISTS          -10030\n\n#define SPIFFS_ERR_NOT_A_FILE           -10031\n#define SPIFFS_ERR_RO_NOT_IMPL          -10032\n#define SPIFFS_ERR_RO_ABORTED_OPERATION -10033\n#define SPIFFS_ERR_PROBE_TOO_FEW_BLOCKS -10034\n#define SPIFFS_ERR_PROBE_NOT_A_FS       -10035\n#define SPIFFS_ERR_NAME_TOO_LONG        -10036\n\n#define SPIFFS_ERR_IX_MAP_UNMAPPED      -10037\n#define SPIFFS_ERR_IX_MAP_MAPPED        -10038\n#define SPIFFS_ERR_IX_MAP_BAD_RANGE     -10039\n\n#define SPIFFS_ERR_SEEK_BOUNDS          -10040\n#define SPIFFS_ERR_INVALID_PARA         -10041\n\n#define SPIFFS_ERR_INTERNAL             -10050\n\n#define SPIFFS_ERR_TEST                 -10100\n\n\n// spiffs file descriptor index type. must be signed\ntypedef s16_t spiffs_file;\n// spiffs file descriptor flags\ntypedef u16_t spiffs_flags;\n// spiffs file mode\ntypedef u16_t spiffs_mode;\n// object type\ntypedef u8_t spiffs_obj_type;\n\nstruct spiffs_t;\n\n#if SPIFFS_HAL_CALLBACK_EXTRA\n\n/* spi read call function type */\ntypedef s32_t (*spiffs_read)(struct spiffs_t *fs, u32_t addr, u32_t size, u8_t *dst);\n/* spi write call function type */\ntypedef s32_t (*spiffs_write)(struct spiffs_t *fs, u32_t addr, u32_t size, u8_t *src);\n/* spi erase call function type */\ntypedef s32_t (*spiffs_erase)(struct spiffs_t *fs, u32_t addr, u32_t size);\n\n#else // SPIFFS_HAL_CALLBACK_EXTRA\n\n/* spi read call function type */\ntypedef s32_t (*spiffs_read)(u32_t addr, u32_t size, u8_t *dst);\n/* spi write call function type */\ntypedef s32_t (*spiffs_write)(u32_t addr, u32_t size, u8_t *src);\n/* spi erase call function type */\ntypedef s32_t (*spiffs_erase)(u32_t addr, u32_t size);\n#endif // SPIFFS_HAL_CALLBACK_EXTRA\n\n/* file system check callback report operation */\ntypedef enum {\n  SPIFFS_CHECK_LOOKUP = 0,\n  SPIFFS_CHECK_INDEX,\n  SPIFFS_CHECK_PAGE\n} spiffs_check_type;\n\n/* file system check callback report type */\ntypedef enum {\n  SPIFFS_CHECK_PROGRESS = 0,\n  SPIFFS_CHECK_ERROR,\n  SPIFFS_CHECK_FIX_INDEX,\n  SPIFFS_CHECK_FIX_LOOKUP,\n  SPIFFS_CHECK_DELETE_ORPHANED_INDEX,\n  SPIFFS_CHECK_DELETE_PAGE,\n  SPIFFS_CHECK_DELETE_BAD_FILE\n} spiffs_check_report;\n\n/* file system check callback function */\n#if SPIFFS_HAL_CALLBACK_EXTRA\ntypedef void (*spiffs_check_callback)(struct spiffs_t *fs, spiffs_check_type type, spiffs_check_report report,\n    u32_t arg1, u32_t arg2);\n#else // SPIFFS_HAL_CALLBACK_EXTRA\ntypedef void (*spiffs_check_callback)(spiffs_check_type type, spiffs_check_report report,\n    u32_t arg1, u32_t arg2);\n#endif // SPIFFS_HAL_CALLBACK_EXTRA\n\n/* file system listener callback operation */\ntypedef enum {\n  /* the file has been created */\n  SPIFFS_CB_CREATED = 0,\n  /* the file has been updated or moved to another page */\n  SPIFFS_CB_UPDATED,\n  /* the file has been deleted */\n  SPIFFS_CB_DELETED\n} spiffs_fileop_type;\n\n/* file system listener callback function */\ntypedef void (*spiffs_file_callback)(struct spiffs_t *fs, spiffs_fileop_type op, spiffs_obj_id obj_id, spiffs_page_ix pix);\n\n#ifndef SPIFFS_DBG\n#define SPIFFS_DBG(...) \\\n    printf(__VA_ARGS__)\n#endif\n#ifndef SPIFFS_GC_DBG\n#define SPIFFS_GC_DBG(...) printf(__VA_ARGS__)\n#endif\n#ifndef SPIFFS_CACHE_DBG\n#define SPIFFS_CACHE_DBG(...) printf(__VA_ARGS__)\n#endif\n#ifndef SPIFFS_CHECK_DBG\n#define SPIFFS_CHECK_DBG(...) printf(__VA_ARGS__)\n#endif\n\n/* Any write to the filehandle is appended to end of the file */\n#define SPIFFS_APPEND                   (1<<0)\n#define SPIFFS_O_APPEND                 SPIFFS_APPEND\n/* If the opened file exists, it will be truncated to zero length before opened */\n#define SPIFFS_TRUNC                    (1<<1)\n#define SPIFFS_O_TRUNC                  SPIFFS_TRUNC\n/* If the opened file does not exist, it will be created before opened */\n#define SPIFFS_CREAT                    (1<<2)\n#define SPIFFS_O_CREAT                  SPIFFS_CREAT\n/* The opened file may only be read */\n#define SPIFFS_RDONLY                   (1<<3)\n#define SPIFFS_O_RDONLY                 SPIFFS_RDONLY\n/* The opened file may only be written */\n#define SPIFFS_WRONLY                   (1<<4)\n#define SPIFFS_O_WRONLY                 SPIFFS_WRONLY\n/* The opened file may be both read and written */\n#define SPIFFS_RDWR                     (SPIFFS_RDONLY | SPIFFS_WRONLY)\n#define SPIFFS_O_RDWR                   SPIFFS_RDWR\n/* Any writes to the filehandle will never be cached but flushed directly */\n#define SPIFFS_DIRECT                   (1<<5)\n#define SPIFFS_O_DIRECT                 SPIFFS_DIRECT\n/* If SPIFFS_O_CREAT and SPIFFS_O_EXCL are set, SPIFFS_open() shall fail if the file exists */\n#define SPIFFS_EXCL                     (1<<6)\n#define SPIFFS_O_EXCL                   SPIFFS_EXCL\n\n#define SPIFFS_SEEK_SET                 (0)\n#define SPIFFS_SEEK_CUR                 (1)\n#define SPIFFS_SEEK_END                 (2)\n\n#define SPIFFS_TYPE_FILE                (1)\n#define SPIFFS_TYPE_DIR                 (2)\n#define SPIFFS_TYPE_HARD_LINK           (3)\n#define SPIFFS_TYPE_SOFT_LINK           (4)\n\n#ifndef SPIFFS_LOCK\n#define SPIFFS_LOCK(fs)\n#endif\n\n#ifndef SPIFFS_UNLOCK\n#define SPIFFS_UNLOCK(fs)\n#endif\n\n// phys structs\n\n// spiffs spi configuration struct\ntypedef struct {\n  // physical read function\n  spiffs_read hal_read_f;\n  // physical write function\n  spiffs_write hal_write_f;\n  // physical erase function\n  spiffs_erase hal_erase_f;\n#if SPIFFS_SINGLETON == 0\n  // physical size of the spi flash\n  u32_t phys_size;\n  // physical offset in spi flash used for spiffs,\n  // must be on block boundary\n  u32_t phys_addr;\n  // physical size when erasing a block\n  u32_t phys_erase_block;\n\n  // logical size of a block, must be on physical\n  // block size boundary and must never be less than\n  // a physical block\n  u32_t log_block_size;\n  // logical size of a page, must be at least\n  // log_block_size / 8\n  u32_t log_page_size;\n\n#endif\n#if SPIFFS_FILEHDL_OFFSET\n  // an integer offset added to each file handle\n  u16_t fh_ix_offset;\n#endif\n} spiffs_config;\n\ntypedef struct spiffs_t {\n  // file system configuration\n  spiffs_config cfg;\n  // number of logical blocks\n  u32_t block_count;\n\n  // cursor for free blocks, block index\n  spiffs_block_ix free_cursor_block_ix;\n  // cursor for free blocks, entry index\n  int free_cursor_obj_lu_entry;\n  // cursor when searching, block index\n  spiffs_block_ix cursor_block_ix;\n  // cursor when searching, entry index\n  int cursor_obj_lu_entry;\n\n  // primary work buffer, size of a logical page\n  u8_t *lu_work;\n  // secondary work buffer, size of a logical page\n  u8_t *work;\n  // file descriptor memory area\n  u8_t *fd_space;\n  // available file descriptors\n  u32_t fd_count;\n\n  // last error\n  s32_t err_code;\n\n  // current number of free blocks\n  u32_t free_blocks;\n  // current number of busy pages\n  u32_t stats_p_allocated;\n  // current number of deleted pages\n  u32_t stats_p_deleted;\n  // flag indicating that garbage collector is cleaning\n  u8_t cleaning;\n  // max erase count amongst all blocks\n  spiffs_obj_id max_erase_count;\n\n#if SPIFFS_GC_STATS\n  u32_t stats_gc_runs;\n#endif\n\n#if SPIFFS_CACHE\n  // cache memory\n  void *cache;\n  // cache size\n  u32_t cache_size;\n#if SPIFFS_CACHE_STATS\n  u32_t cache_hits;\n  u32_t cache_misses;\n#endif\n#endif\n\n  // check callback function\n  spiffs_check_callback check_cb_f;\n  // file callback function\n  spiffs_file_callback file_cb_f;\n  // mounted flag\n  u8_t mounted;\n  // user data\n  void *user_data;\n  // config magic\n  u32_t config_magic;\n} spiffs;\n\n/* spiffs file status struct */\ntypedef struct {\n  spiffs_obj_id obj_id;\n  u32_t size;\n  spiffs_obj_type type;\n  spiffs_page_ix pix;\n  u8_t name[SPIFFS_OBJ_NAME_LEN];\n#if SPIFFS_OBJ_META_LEN\n  u8_t meta[SPIFFS_OBJ_META_LEN];\n#endif\n} spiffs_stat;\n\nstruct spiffs_dirent {\n  spiffs_obj_id obj_id;\n  u8_t name[SPIFFS_OBJ_NAME_LEN];\n  spiffs_obj_type type;\n  u32_t size;\n  spiffs_page_ix pix;\n#if SPIFFS_OBJ_META_LEN\n  u8_t meta[SPIFFS_OBJ_META_LEN];\n#endif\n};\n\ntypedef struct {\n  spiffs *fs;\n  spiffs_block_ix block;\n  int entry;\n} spiffs_DIR;\n\n#if SPIFFS_IX_MAP\n\ntypedef struct {\n  // buffer with looked up data pixes\n  spiffs_page_ix *map_buf;\n  // precise file byte offset\n  u32_t offset;\n  // start data span index of lookup buffer\n  spiffs_span_ix start_spix;\n  // end data span index of lookup buffer\n  spiffs_span_ix end_spix;\n} spiffs_ix_map;\n\n#endif\n\n// functions\n\n#if SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0\n/**\n * Special function. This takes a spiffs config struct and returns the number\n * of blocks this file system was formatted with. This function relies on\n * that following info is set correctly in given config struct:\n *\n * phys_addr, log_page_size, and log_block_size.\n *\n * Also, hal_read_f must be set in the config struct.\n *\n * One must be sure of the correct page size and that the physical address is\n * correct in the probed file system when calling this function. It is not\n * checked if the phys_addr actually points to the start of the file system,\n * so one might get a false positive if entering a phys_addr somewhere in the\n * middle of the file system at block boundary. In addition, it is not checked\n * if the page size is actually correct. If it is not, weird file system sizes\n * will be returned.\n *\n * If this function detects a file system it returns the assumed file system\n * size, which can be used to set the phys_size.\n *\n * Otherwise, it returns an error indicating why it is not regarded as a file\n * system.\n *\n * Note: this function is not protected with SPIFFS_LOCK and SPIFFS_UNLOCK\n * macros. It returns the error code directly, instead of as read by\n * SPIFFS_errno.\n *\n * @param config        essential parts of the physical and logical\n *                      configuration of the file system.\n */\ns32_t SPIFFS_probe_fs(spiffs_config *config);\n#endif // SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0\n\n/**\n * Initializes the file system dynamic parameters and mounts the filesystem.\n * If SPIFFS_USE_MAGIC is enabled the mounting may fail with SPIFFS_ERR_NOT_A_FS\n * if the flash does not contain a recognizable file system.\n * In this case, SPIFFS_format must be called prior to remounting.\n * @param fs            the file system struct\n * @param config        the physical and logical configuration of the file system\n * @param work          a memory work buffer comprising 2*config->log_page_size\n *                      bytes used throughout all file system operations\n * @param fd_space      memory for file descriptors\n * @param fd_space_size memory size of file descriptors\n * @param cache         memory for cache, may be null\n * @param cache_size    memory size of cache\n * @param check_cb_f    callback function for reporting during consistency checks\n */\ns32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,\n    u8_t *fd_space, u32_t fd_space_size,\n    void *cache, u32_t cache_size,\n    spiffs_check_callback check_cb_f);\n\n/**\n * Unmounts the file system. All file handles will be flushed of any\n * cached writes and closed.\n * @param fs            the file system struct\n */\nvoid SPIFFS_unmount(spiffs *fs);\n\n/**\n * Creates a new file.\n * @param fs            the file system struct\n * @param path          the path of the new file\n * @param mode          ignored, for posix compliance\n */\ns32_t SPIFFS_creat(spiffs *fs, const char *path, spiffs_mode mode);\n\n/**\n * Opens/creates a file.\n * @param fs            the file system struct\n * @param path          the path of the new file\n * @param flags         the flags for the open command, can be combinations of\n *                      SPIFFS_O_APPEND, SPIFFS_O_TRUNC, SPIFFS_O_CREAT, SPIFFS_O_RDONLY,\n *                      SPIFFS_O_WRONLY, SPIFFS_O_RDWR, SPIFFS_O_DIRECT, SPIFFS_O_EXCL\n * @param mode          ignored, for posix compliance\n */\nspiffs_file SPIFFS_open(spiffs *fs, const char *path, spiffs_flags flags, spiffs_mode mode);\n\n/**\n * Opens a file by given dir entry.\n * Optimization purposes, when traversing a file system with SPIFFS_readdir\n * a normal SPIFFS_open would need to traverse the filesystem again to find\n * the file, whilst SPIFFS_open_by_dirent already knows where the file resides.\n * @param fs            the file system struct\n * @param e             the dir entry to the file\n * @param flags         the flags for the open command, can be combinations of\n *                      SPIFFS_APPEND, SPIFFS_TRUNC, SPIFFS_CREAT, SPIFFS_RD_ONLY,\n *                      SPIFFS_WR_ONLY, SPIFFS_RDWR, SPIFFS_DIRECT.\n *                      SPIFFS_CREAT will have no effect in this case.\n * @param mode          ignored, for posix compliance\n */\nspiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_flags flags, spiffs_mode mode);\n\n/**\n * Opens a file by given page index.\n * Optimization purposes, opens a file by directly pointing to the page\n * index in the spi flash.\n * If the page index does not point to a file header SPIFFS_ERR_NOT_A_FILE\n * is returned.\n * @param fs            the file system struct\n * @param page_ix       the page index\n * @param flags         the flags for the open command, can be combinations of\n *                      SPIFFS_APPEND, SPIFFS_TRUNC, SPIFFS_CREAT, SPIFFS_RD_ONLY,\n *                      SPIFFS_WR_ONLY, SPIFFS_RDWR, SPIFFS_DIRECT.\n *                      SPIFFS_CREAT will have no effect in this case.\n * @param mode          ignored, for posix compliance\n */\nspiffs_file SPIFFS_open_by_page(spiffs *fs, spiffs_page_ix page_ix, spiffs_flags flags, spiffs_mode mode);\n\n/**\n * Reads from given filehandle.\n * @param fs            the file system struct\n * @param fh            the filehandle\n * @param buf           where to put read data\n * @param len           how much to read\n * @returns number of bytes read, or -1 if error\n */\ns32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len);\n\n/**\n * Writes to given filehandle.\n * @param fs            the file system struct\n * @param fh            the filehandle\n * @param buf           the data to write\n * @param len           how much to write\n * @returns number of bytes written, or -1 if error\n */\ns32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len);\n\n/**\n * Moves the read/write file offset. Resulting offset is returned or negative if error.\n * lseek(fs, fd, 0, SPIFFS_SEEK_CUR) will thus return current offset.\n * @param fs            the file system struct\n * @param fh            the filehandle\n * @param offs          how much/where to move the offset\n * @param whence        if SPIFFS_SEEK_SET, the file offset shall be set to offset bytes\n *                      if SPIFFS_SEEK_CUR, the file offset shall be set to its current location plus offset\n *                      if SPIFFS_SEEK_END, the file offset shall be set to the size of the file plus offse, which should be negative\n */\ns32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence);\n\n/**\n * Removes a file by path\n * @param fs            the file system struct\n * @param path          the path of the file to remove\n */\ns32_t SPIFFS_remove(spiffs *fs, const char *path);\n\n/**\n * Removes a file by filehandle\n * @param fs            the file system struct\n * @param fh            the filehandle of the file to remove\n */\ns32_t SPIFFS_fremove(spiffs *fs, spiffs_file fh);\n\n/**\n * Gets file status by path\n * @param fs            the file system struct\n * @param path          the path of the file to stat\n * @param s             the stat struct to populate\n */\ns32_t SPIFFS_stat(spiffs *fs, const char *path, spiffs_stat *s);\n\n/**\n * Gets file status by filehandle\n * @param fs            the file system struct\n * @param fh            the filehandle of the file to stat\n * @param s             the stat struct to populate\n */\ns32_t SPIFFS_fstat(spiffs *fs, spiffs_file fh, spiffs_stat *s);\n\n/**\n * Flushes all pending write operations from cache for given file\n * @param fs            the file system struct\n * @param fh            the filehandle of the file to flush\n */\ns32_t SPIFFS_fflush(spiffs *fs, spiffs_file fh);\n\n/**\n * Closes a filehandle. If there are pending write operations, these are finalized before closing.\n * @param fs            the file system struct\n * @param fh            the filehandle of the file to close\n */\ns32_t SPIFFS_close(spiffs *fs, spiffs_file fh);\n\n/**\n * Renames a file\n * @param fs            the file system struct\n * @param old           path of file to rename\n * @param newPath       new path of file\n */\ns32_t SPIFFS_rename(spiffs *fs, const char *old, const char *newPath);\n\n#if SPIFFS_OBJ_META_LEN\n/**\n * Updates file's metadata\n * @param fs            the file system struct\n * @param path          path to the file\n * @param meta          new metadata. must be SPIFFS_OBJ_META_LEN bytes long.\n */\ns32_t SPIFFS_update_meta(spiffs *fs, const char *name, const void *meta);\n\n/**\n * Updates file's metadata\n * @param fs            the file system struct\n * @param fh            file handle of the file\n * @param meta          new metadata. must be SPIFFS_OBJ_META_LEN bytes long.\n */\ns32_t SPIFFS_fupdate_meta(spiffs *fs, spiffs_file fh, const void *meta);\n#endif\n\n/**\n * Returns last error of last file operation.\n * @param fs            the file system struct\n */\ns32_t SPIFFS_errno(spiffs *fs);\n\n/**\n * Clears last error.\n * @param fs            the file system struct\n */\nvoid SPIFFS_clearerr(spiffs *fs);\n\n/**\n * Opens a directory stream corresponding to the given name.\n * The stream is positioned at the first entry in the directory.\n * On hydrogen builds the name argument is ignored as hydrogen builds always correspond\n * to a flat file structure - no directories.\n * @param fs            the file system struct\n * @param name          the name of the directory\n * @param d             pointer the directory stream to be populated\n */\nspiffs_DIR *SPIFFS_opendir(spiffs *fs, const char *name, spiffs_DIR *d);\n\n/**\n * Closes a directory stream\n * @param d             the directory stream to close\n */\ns32_t SPIFFS_closedir(spiffs_DIR *d);\n\n/**\n * Reads a directory into given spifs_dirent struct.\n * @param d             pointer to the directory stream\n * @param e             the dirent struct to be populated\n * @returns null if error or end of stream, else given dirent is returned\n */\nstruct spiffs_dirent *SPIFFS_readdir(spiffs_DIR *d, struct spiffs_dirent *e);\n\n/**\n * Runs a consistency check on given filesystem.\n * @param fs            the file system struct\n */\ns32_t SPIFFS_check(spiffs *fs);\n\n/**\n * Returns number of total bytes available and number of used bytes.\n * This is an estimation, and depends on if there a many files with little\n * data or few files with much data.\n * NB: If used number of bytes exceeds total bytes, a SPIFFS_check should\n * run. This indicates a power loss in midst of things. In worst case\n * (repeated powerlosses in mending or gc) you might have to delete some files.\n *\n * @param fs            the file system struct\n * @param total         total number of bytes in filesystem\n * @param used          used number of bytes in filesystem\n */\ns32_t SPIFFS_info(spiffs *fs, u32_t *total, u32_t *used);\n\n/**\n * Formats the entire file system. All data will be lost.\n * The filesystem must not be mounted when calling this.\n *\n * NB: formatting is awkward. Due to backwards compatibility, SPIFFS_mount\n * MUST be called prior to formatting in order to configure the filesystem.\n * If SPIFFS_mount succeeds, SPIFFS_unmount must be called before calling\n * SPIFFS_format.\n * If SPIFFS_mount fails, SPIFFS_format can be called directly without calling\n * SPIFFS_unmount first.\n *\n * @param fs            the file system struct\n */\ns32_t SPIFFS_format(spiffs *fs);\n\n/**\n * Returns nonzero if spiffs is mounted, or zero if unmounted.\n * @param fs            the file system struct\n */\nu8_t SPIFFS_mounted(spiffs *fs);\n\n/**\n * Tries to find a block where most or all pages are deleted, and erase that\n * block if found. Does not care for wear levelling. Will not move pages\n * around.\n * If parameter max_free_pages are set to 0, only blocks with only deleted\n * pages will be selected.\n *\n * NB: the garbage collector is automatically called when spiffs needs free\n * pages. The reason for this function is to give possibility to do background\n * tidying when user knows the system is idle.\n *\n * Use with care.\n *\n * Setting max_free_pages to anything larger than zero will eventually wear\n * flash more as a block containing free pages can be erased.\n *\n * Will set err_no to SPIFFS_OK if a block was found and erased,\n * SPIFFS_ERR_NO_DELETED_BLOCK if no matching block was found,\n * or other error.\n *\n * @param fs             the file system struct\n * @param max_free_pages maximum number allowed free pages in block\n */\ns32_t SPIFFS_gc_quick(spiffs *fs, u16_t max_free_pages);\n\n/**\n * Will try to make room for given amount of bytes in the filesystem by moving\n * pages and erasing blocks.\n * If it is physically impossible, err_no will be set to SPIFFS_ERR_FULL. If\n * there already is this amount (or more) of free space, SPIFFS_gc will\n * silently return. It is recommended to call SPIFFS_info before invoking\n * this method in order to determine what amount of bytes to give.\n *\n * NB: the garbage collector is automatically called when spiffs needs free\n * pages. The reason for this function is to give possibility to do background\n * tidying when user knows the system is idle.\n *\n * Use with care.\n *\n * @param fs            the file system struct\n * @param size          amount of bytes that should be freed\n */\ns32_t SPIFFS_gc(spiffs *fs, u32_t size);\n\n/**\n * Check if EOF reached.\n * @param fs            the file system struct\n * @param fh            the filehandle of the file to check\n */\ns32_t SPIFFS_eof(spiffs *fs, spiffs_file fh);\n\n/**\n * Get position in file.\n * @param fs            the file system struct\n * @param fh            the filehandle of the file to check\n */\ns32_t SPIFFS_tell(spiffs *fs, spiffs_file fh);\n\n/**\n * Registers a callback function that keeps track on operations on file\n * headers. Do note, that this callback is called from within internal spiffs\n * mechanisms. Any operations on the actual file system being callbacked from\n * in this callback will mess things up for sure - do not do this.\n * This can be used to track where files are and move around during garbage\n * collection, which in turn can be used to build location tables in ram.\n * Used in conjuction with SPIFFS_open_by_page this may improve performance\n * when opening a lot of files.\n * Must be invoked after mount.\n *\n * @param fs            the file system struct\n * @param cb_func       the callback on file operations\n */\ns32_t SPIFFS_set_file_callback_func(spiffs *fs, spiffs_file_callback cb_func);\n\n#if SPIFFS_IX_MAP\n\n/**\n * Maps the first level index lookup to a given memory map.\n * This will make reading big files faster, as the memory map will be used for\n * looking up data pages instead of searching for the indices on the physical\n * medium. When mapping, all affected indicies are found and the information is\n * copied to the array.\n * Whole file or only parts of it may be mapped. The index map will cover file\n * contents from argument offset until and including arguments (offset+len).\n * It is valid to map a longer range than the current file size. The map will\n * then be populated when the file grows.\n * On garbage collections and file data page movements, the map array will be\n * automatically updated. Do not tamper with the map array, as this contains\n * the references to the data pages. Modifying it from outside will corrupt any\n * future readings using this file descriptor.\n * The map will no longer be used when the file descriptor closed or the file\n * is unmapped.\n * This can be useful to get faster and more deterministic timing when reading\n * large files, or when seeking and reading a lot within a file.\n * @param fs      the file system struct\n * @param fh      the file handle of the file to map\n * @param map     a spiffs_ix_map struct, describing the index map\n * @param offset  absolute file offset where to start the index map\n * @param len     length of the mapping in actual file bytes\n * @param map_buf the array buffer for the look up data - number of required\n *                elements in the array can be derived from function\n *                SPIFFS_bytes_to_ix_map_entries given the length\n */\ns32_t SPIFFS_ix_map(spiffs *fs, spiffs_file fh, spiffs_ix_map *map,\n    u32_t offset, u32_t len, spiffs_page_ix *map_buf);\n\n/**\n * Unmaps the index lookup from this filehandle. All future readings will\n * proceed as normal, requiring reading of the first level indices from\n * physical media.\n * The map and map buffer given in function SPIFFS_ix_map will no longer be\n * referenced by spiffs.\n * It is not strictly necessary to unmap a file before closing it, as closing\n * a file will automatically unmap it.\n * @param fs      the file system struct\n * @param fh      the file handle of the file to unmap\n */\ns32_t SPIFFS_ix_unmap(spiffs *fs, spiffs_file fh);\n\n/**\n * Moves the offset for the index map given in function SPIFFS_ix_map. Parts or\n * all of the map buffer will repopulated.\n * @param fs      the file system struct\n * @param fh      the mapped file handle of the file to remap\n * @param offset  new absolute file offset where to start the index map\n */\ns32_t SPIFFS_ix_remap(spiffs *fs, spiffs_file fh, u32_t offs);\n\n/**\n * Utility function to get number of spiffs_page_ix entries a map buffer must\n * contain on order to map given amount of file data in bytes.\n * See function SPIFFS_ix_map and SPIFFS_ix_map_entries_to_bytes.\n * @param fs      the file system struct\n * @param bytes   number of file data bytes to map\n * @return        needed number of elements in a spiffs_page_ix array needed to\n *                map given amount of bytes in a file\n */\ns32_t SPIFFS_bytes_to_ix_map_entries(spiffs *fs, u32_t bytes);\n\n/**\n * Utility function to amount of file data bytes that can be mapped when\n * mapping a file with buffer having given number of spiffs_page_ix entries.\n * See function SPIFFS_ix_map and SPIFFS_bytes_to_ix_map_entries.\n * @param fs      the file system struct\n * @param map_page_ix_entries   number of entries in a spiffs_page_ix array\n * @return        amount of file data in bytes that can be mapped given a map\n *                buffer having given amount of spiffs_page_ix entries\n */\ns32_t SPIFFS_ix_map_entries_to_bytes(spiffs *fs, u32_t map_page_ix_entries);\n\n#endif // SPIFFS_IX_MAP\n\n\n#if SPIFFS_TEST_VISUALISATION\n/**\n * Prints out a visualization of the filesystem.\n * @param fs            the file system struct\n */\ns32_t SPIFFS_vis(spiffs *fs);\n#endif\n\n#if SPIFFS_BUFFER_HELP\n/**\n * Returns number of bytes needed for the filedescriptor buffer given\n * amount of file descriptors.\n */\nu32_t SPIFFS_buffer_bytes_for_filedescs(spiffs *fs, u32_t num_descs);\n\n#if SPIFFS_CACHE\n/**\n * Returns number of bytes needed for the cache buffer given\n * amount of cache pages.\n */\nu32_t SPIFFS_buffer_bytes_for_cache(spiffs *fs, u32_t num_pages);\n#endif\n#endif\n\n#if SPIFFS_CACHE\n#endif\n#if defined(__cplusplus)\n}\n#endif\n\n#endif /* SPIFFS_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/src/spiffs_cache.c",
    "content": "/*\n * spiffs_cache.c\n *\n *  Created on: Jun 23, 2013\n *      Author: petera\n */\n\n#include \"spiffs.h\"\n#include \"spiffs_nucleus.h\"\n\n#if SPIFFS_CACHE\n\n// returns cached page for give page index, or null if no such cached page\nstatic spiffs_cache_page *spiffs_cache_page_get(spiffs *fs, spiffs_page_ix pix)\n{\n    spiffs_cache *cache = spiffs_get_cache(fs);\n    if ((cache->cpage_use_map & cache->cpage_use_mask) == 0) return 0;\n    int i;\n    for (i = 0; i < cache->cpage_count; i++)\n    {\n        spiffs_cache_page *cp = spiffs_get_cache_page_hdr(fs, cache, i);\n        if ((cache->cpage_use_map & (1 << i)) &&\n                (cp->flags & SPIFFS_CACHE_FLAG_TYPE_WR) == 0 &&\n                cp->pix == pix )\n        {\n            //SPIFFS_CACHE_DBG(\"CACHE_GET: have cache page \"_SPIPRIi\" for \"_SPIPRIpg\"\\n\", i, pix);\n            cp->last_access = cache->last_access;\n            return cp;\n        }\n    }\n    //SPIFFS_CACHE_DBG(\"CACHE_GET: no cache for \"_SPIPRIpg\"\\n\", pix);\n    return 0;\n}\n\n// frees cached page\nstatic s32_t spiffs_cache_page_free(spiffs *fs, int ix, u8_t write_back)\n{\n    s32_t res = SPIFFS_OK;\n    spiffs_cache *cache = spiffs_get_cache(fs);\n    spiffs_cache_page *cp = spiffs_get_cache_page_hdr(fs, cache, ix);\n    if (cache->cpage_use_map & (1 << ix))\n    {\n        if (write_back &&\n                (cp->flags & SPIFFS_CACHE_FLAG_TYPE_WR) == 0 &&\n                (cp->flags & SPIFFS_CACHE_FLAG_DIRTY))\n        {\n            u8_t *mem =  spiffs_get_cache_page(fs, cache, ix);\n            SPIFFS_CACHE_DBG(\"CACHE_FREE: write cache page \"_SPIPRIi\" pix \"_SPIPRIpg\"\\n\", ix, cp->pix);\n            res = SPIFFS_HAL_WRITE(fs, SPIFFS_PAGE_TO_PADDR(fs, cp->pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), mem);\n        }\n\n#if SPIFFS_CACHE_WR\n        if (cp->flags & SPIFFS_CACHE_FLAG_TYPE_WR)\n        {\n            SPIFFS_CACHE_DBG(\"CACHE_FREE: free cache page \"_SPIPRIi\" objid \"_SPIPRIid\"\\n\", ix, cp->obj_id);\n        }\n        else\n#endif\n        {\n            SPIFFS_CACHE_DBG(\"CACHE_FREE: free cache page \"_SPIPRIi\" pix \"_SPIPRIpg\"\\n\", ix, cp->pix);\n        }\n        cache->cpage_use_map &= ~(1 << ix);\n        cp->flags = 0;\n    }\n\n    return res;\n}\n\n// removes the oldest accessed cached page\nstatic s32_t spiffs_cache_page_remove_oldest(spiffs *fs, u8_t flag_mask, u8_t flags)\n{\n    s32_t res = SPIFFS_OK;\n    spiffs_cache *cache = spiffs_get_cache(fs);\n\n    if ((cache->cpage_use_map & cache->cpage_use_mask) != cache->cpage_use_mask)\n    {\n        // at least one free cpage\n        return SPIFFS_OK;\n    }\n\n    // all busy, scan thru all to find the cpage which has oldest access\n    int i;\n    int cand_ix = -1;\n    u32_t oldest_val = 0;\n    for (i = 0; i < cache->cpage_count; i++)\n    {\n        spiffs_cache_page *cp = spiffs_get_cache_page_hdr(fs, cache, i);\n        if ((cache->last_access - cp->last_access) > oldest_val &&\n                (cp->flags & flag_mask) == flags)\n        {\n            oldest_val = cache->last_access - cp->last_access;\n            cand_ix = i;\n        }\n    }\n\n    if (cand_ix >= 0)\n    {\n        res = spiffs_cache_page_free(fs, cand_ix, 1);\n    }\n\n    return res;\n}\n\n// allocates a new cached page and returns it, or null if all cache pages are busy\nstatic spiffs_cache_page *spiffs_cache_page_allocate(spiffs *fs)\n{\n    spiffs_cache *cache = spiffs_get_cache(fs);\n    if (cache->cpage_use_map == 0xffffffff)\n    {\n        // out of cache memory\n        return 0;\n    }\n    int i;\n    for (i = 0; i < cache->cpage_count; i++)\n    {\n        if ((cache->cpage_use_map & (1 << i)) == 0)\n        {\n            spiffs_cache_page *cp = spiffs_get_cache_page_hdr(fs, cache, i);\n            cache->cpage_use_map |= (1 << i);\n            cp->last_access = cache->last_access;\n            //SPIFFS_CACHE_DBG(\"CACHE_ALLO: allocated cache page \"_SPIPRIi\"\\n\", i);\n            return cp;\n        }\n    }\n    // out of cache entries\n    return 0;\n}\n\n// drops the cache page for give page index\nvoid spiffs_cache_drop_page(spiffs *fs, spiffs_page_ix pix)\n{\n    spiffs_cache_page *cp =  spiffs_cache_page_get(fs, pix);\n    if (cp)\n    {\n        spiffs_cache_page_free(fs, cp->ix, 0);\n    }\n}\n\n// ------------------------------\n\n// reads from spi flash or the cache\ns32_t spiffs_phys_rd(\n    spiffs *fs,\n    u8_t op,\n    spiffs_file fh,\n    u32_t addr,\n    u32_t len,\n    u8_t *dst)\n{\n    (void)fh;\n    s32_t res = SPIFFS_OK;\n    spiffs_cache *cache = spiffs_get_cache(fs);\n    spiffs_cache_page *cp =  spiffs_cache_page_get(fs, SPIFFS_PADDR_TO_PAGE(fs, addr));\n    cache->last_access++;\n    if (cp)\n    {\n        // we've already got one, you see\n#if SPIFFS_CACHE_STATS\n        fs->cache_hits++;\n#endif\n        cp->last_access = cache->last_access;\n        u8_t *mem =  spiffs_get_cache_page(fs, cache, cp->ix);\n        _SPIFFS_MEMCPY(dst, &mem[SPIFFS_PADDR_TO_PAGE_OFFSET(fs, addr)], len);\n    }\n    else\n    {\n        if ((op & SPIFFS_OP_TYPE_MASK) == SPIFFS_OP_T_OBJ_LU2)\n        {\n            // for second layer lookup functions, we do not cache in order to prevent shredding\n            return SPIFFS_HAL_READ(fs, addr, len, dst);\n        }\n#if SPIFFS_CACHE_STATS\n        fs->cache_misses++;\n#endif\n        // this operation will always free one cache page (unless all already free),\n        // the result code stems from the write operation of the possibly freed cache page\n        res = spiffs_cache_page_remove_oldest(fs, SPIFFS_CACHE_FLAG_TYPE_WR, 0);\n\n        cp = spiffs_cache_page_allocate(fs);\n        if (cp)\n        {\n            cp->flags = SPIFFS_CACHE_FLAG_WRTHRU;\n            cp->pix = SPIFFS_PADDR_TO_PAGE(fs, addr);\n            SPIFFS_CACHE_DBG(\"CACHE_ALLO: allocated cache page \"_SPIPRIi\" for pix \"_SPIPRIpg \"\\n\", cp->ix, cp->pix);\n\n            s32_t res2 = SPIFFS_HAL_READ(fs,\n                                         addr - SPIFFS_PADDR_TO_PAGE_OFFSET(fs, addr),\n                                         SPIFFS_CFG_LOG_PAGE_SZ(fs),\n                                         spiffs_get_cache_page(fs, cache, cp->ix));\n            if (res2 != SPIFFS_OK)\n            {\n                // honor read failure before possible write failure (bad idea?)\n                res = res2;\n            }\n            u8_t *mem =  spiffs_get_cache_page(fs, cache, cp->ix);\n            _SPIFFS_MEMCPY(dst, &mem[SPIFFS_PADDR_TO_PAGE_OFFSET(fs, addr)], len);\n        }\n        else\n        {\n            // this will never happen, last resort for sake of symmetry\n            s32_t res2 = SPIFFS_HAL_READ(fs, addr, len, dst);\n            if (res2 != SPIFFS_OK)\n            {\n                // honor read failure before possible write failure (bad idea?)\n                res = res2;\n            }\n        }\n    }\n    return res;\n}\n\n// writes to spi flash and/or the cache\ns32_t spiffs_phys_wr(\n    spiffs *fs,\n    u8_t op,\n    spiffs_file fh,\n    u32_t addr,\n    u32_t len,\n    u8_t *src)\n{\n    (void)fh;\n    spiffs_page_ix pix = SPIFFS_PADDR_TO_PAGE(fs, addr);\n    spiffs_cache *cache = spiffs_get_cache(fs);\n    spiffs_cache_page *cp =  spiffs_cache_page_get(fs, pix);\n\n    if (cp && (op & SPIFFS_OP_COM_MASK) != SPIFFS_OP_C_WRTHRU)\n    {\n        // have a cache page\n        // copy in data to cache page\n\n        if ((op & SPIFFS_OP_COM_MASK) == SPIFFS_OP_C_DELE &&\n                (op & SPIFFS_OP_TYPE_MASK) != SPIFFS_OP_T_OBJ_LU)\n        {\n            // page is being deleted, wipe from cache - unless it is a lookup page\n            spiffs_cache_page_free(fs, cp->ix, 0);\n            return SPIFFS_HAL_WRITE(fs, addr, len, src);\n        }\n\n        u8_t *mem =  spiffs_get_cache_page(fs, cache, cp->ix);\n        _SPIFFS_MEMCPY(&mem[SPIFFS_PADDR_TO_PAGE_OFFSET(fs, addr)], src, len);\n\n        cache->last_access++;\n        cp->last_access = cache->last_access;\n\n        if (cp->flags & SPIFFS_CACHE_FLAG_WRTHRU)\n        {\n            // page is being updated, no write-cache, just pass thru\n            return SPIFFS_HAL_WRITE(fs, addr, len, src);\n        }\n        else\n        {\n            return SPIFFS_OK;\n        }\n    }\n    else\n    {\n        // no cache page, no write cache - just write thru\n        return SPIFFS_HAL_WRITE(fs, addr, len, src);\n    }\n}\n\n#if SPIFFS_CACHE_WR\n// returns the cache page that this fd refers, or null if no cache page\nspiffs_cache_page *spiffs_cache_page_get_by_fd(spiffs *fs, spiffs_fd *fd)\n{\n    spiffs_cache *cache = spiffs_get_cache(fs);\n\n    if ((cache->cpage_use_map & cache->cpage_use_mask) == 0)\n    {\n        // all cpages free, no cpage cannot be assigned to obj_id\n        return 0;\n    }\n\n    int i;\n    for (i = 0; i < cache->cpage_count; i++)\n    {\n        spiffs_cache_page *cp = spiffs_get_cache_page_hdr(fs, cache, i);\n        if ((cache->cpage_use_map & (1 << i)) &&\n                (cp->flags & SPIFFS_CACHE_FLAG_TYPE_WR) &&\n                cp->obj_id == fd->obj_id)\n        {\n            return cp;\n        }\n    }\n\n    return 0;\n}\n\n// allocates a new cache page and refers this to given fd - flushes an old cache\n// page if all cache is busy\nspiffs_cache_page *spiffs_cache_page_allocate_by_fd(spiffs *fs, spiffs_fd *fd)\n{\n    // before this function is called, it is ensured that there is no already existing\n    // cache page with same object id\n    spiffs_cache_page_remove_oldest(fs, SPIFFS_CACHE_FLAG_TYPE_WR, 0);\n    spiffs_cache_page *cp = spiffs_cache_page_allocate(fs);\n    if (cp == 0)\n    {\n        // could not get cache page\n        return 0;\n    }\n\n    cp->flags = SPIFFS_CACHE_FLAG_TYPE_WR;\n    cp->obj_id = fd->obj_id;\n    fd->cache_page = cp;\n    SPIFFS_CACHE_DBG(\"CACHE_ALLO: allocated cache page \"_SPIPRIi\" for fd \"_SPIPRIfd \":\"_SPIPRIid \"\\n\", cp->ix, fd->file_nbr, fd->obj_id);\n    return cp;\n}\n\n// unrefers all fds that this cache page refers to and releases the cache page\nvoid spiffs_cache_fd_release(spiffs *fs, spiffs_cache_page *cp)\n{\n    if (cp == 0) return;\n    u32_t i;\n    spiffs_fd *fds = (spiffs_fd *)fs->fd_space;\n    for (i = 0; i < fs->fd_count; i++)\n    {\n        spiffs_fd *cur_fd = &fds[i];\n        if (cur_fd->file_nbr != 0 && cur_fd->cache_page == cp)\n        {\n            cur_fd->cache_page = 0;\n        }\n    }\n    spiffs_cache_page_free(fs, cp->ix, 0);\n\n    cp->obj_id = 0;\n}\n\n#endif\n\n// initializes the cache\nvoid spiffs_cache_init(spiffs *fs)\n{\n    if (fs->cache == 0) return;\n    u32_t sz = fs->cache_size;\n    u32_t cache_mask = 0;\n    int i;\n    int cache_entries =\n        (sz - sizeof(spiffs_cache)) / (SPIFFS_CACHE_PAGE_SIZE(fs));\n    if (cache_entries <= 0) return;\n\n    for (i = 0; i < cache_entries; i++)\n    {\n        cache_mask <<= 1;\n        cache_mask |= 1;\n    }\n\n    spiffs_cache cache;\n    memset(&cache, 0, sizeof(spiffs_cache));\n    cache.cpage_count = cache_entries;\n    cache.cpages = (u8_t *)((u8_t *)fs->cache + sizeof(spiffs_cache));\n\n    cache.cpage_use_map = 0xffffffff;\n    cache.cpage_use_mask = cache_mask;\n    _SPIFFS_MEMCPY(fs->cache, &cache, sizeof(spiffs_cache));\n\n    spiffs_cache *c = spiffs_get_cache(fs);\n\n    memset(c->cpages, 0, c->cpage_count * SPIFFS_CACHE_PAGE_SIZE(fs));\n\n    c->cpage_use_map &= ~(c->cpage_use_mask);\n    for (i = 0; i < cache.cpage_count; i++)\n    {\n        spiffs_get_cache_page_hdr(fs, c, i)->ix = i;\n    }\n}\n\n#endif // SPIFFS_CACHE\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/src/spiffs_check.c",
    "content": "/*\n * spiffs_check.c\n *\n * Contains functionality for checking file system consistency\n * and mending problems.\n * Three levels of consistency checks are implemented:\n *\n * Look up consistency\n *   Checks if indices in lookup pages are coherent with page headers\n * Object index consistency\n *   Checks if there are any orphaned object indices (missing object index headers).\n *   If an object index is found but not its header, the object index is deleted.\n *   This is critical for the following page consistency check.\n * Page consistency\n *   Checks for pages that ought to be indexed, ought not to be indexed, are multiple indexed\n *\n *\n *  Created on: Jul 7, 2013\n *      Author: petera\n */\n\n\n#include \"spiffs.h\"\n#include \"spiffs_nucleus.h\"\n\n#if !SPIFFS_READ_ONLY\n\n#if SPIFFS_HAL_CALLBACK_EXTRA\n#define CHECK_CB(_fs, _type, _rep, _arg1, _arg2) \\\n  do { \\\n    if ((_fs)->check_cb_f) (_fs)->check_cb_f((_fs), (_type), (_rep), (_arg1), (_arg2)); \\\n  } while (0)\n#else\n#define CHECK_CB(_fs, _type, _rep, _arg1, _arg2) \\\n  do { \\\n    if ((_fs)->check_cb_f) (_fs)->check_cb_f((_type), (_rep), (_arg1), (_arg2)); \\\n  } while (0)\n#endif\n\n//---------------------------------------\n// Look up consistency\n\n// searches in the object indices and returns the referenced page index given\n// the object id and the data span index\n// destroys fs->lu_work\nstatic s32_t spiffs_object_get_data_page_index_reference(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_span_ix data_spix,\n    spiffs_page_ix *pix,\n    spiffs_page_ix *objix_pix)\n{\n    s32_t res;\n\n    // calculate object index span index for given data page span index\n    spiffs_span_ix objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix);\n\n    // find obj index for obj id and span index\n    res = spiffs_obj_lu_find_id_and_span(fs, obj_id | SPIFFS_OBJ_ID_IX_FLAG, objix_spix, 0, objix_pix);\n    SPIFFS_CHECK_RES(res);\n\n    // load obj index entry\n    u32_t addr = SPIFFS_PAGE_TO_PADDR(fs, *objix_pix);\n    if (objix_spix == 0)\n    {\n        // get referenced page from object index header\n        addr += sizeof(spiffs_page_object_ix_header) + data_spix * sizeof(spiffs_page_ix);\n    }\n    else\n    {\n        // get referenced page from object index\n        addr += sizeof(spiffs_page_object_ix) + SPIFFS_OBJ_IX_ENTRY(fs, data_spix) * sizeof(spiffs_page_ix);\n    }\n\n    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ, 0, addr, sizeof(spiffs_page_ix), (u8_t *)pix);\n\n    return res;\n}\n\n// copies page contents to a new page\nstatic s32_t spiffs_rewrite_page(spiffs *fs, spiffs_page_ix cur_pix, spiffs_page_header *p_hdr, spiffs_page_ix *new_pix)\n{\n    s32_t res;\n    res = spiffs_page_allocate_data(fs, p_hdr->obj_id, p_hdr, 0, 0, 0, 0, new_pix);\n    SPIFFS_CHECK_RES(res);\n    res = spiffs_phys_cpy(fs, 0,\n                          SPIFFS_PAGE_TO_PADDR(fs, *new_pix) + sizeof(spiffs_page_header),\n                          SPIFFS_PAGE_TO_PADDR(fs, cur_pix) + sizeof(spiffs_page_header),\n                          SPIFFS_DATA_PAGE_SIZE(fs));\n    SPIFFS_CHECK_RES(res);\n    return res;\n}\n\n// rewrites the object index for given object id and replaces the\n// data page index to a new page index\nstatic s32_t spiffs_rewrite_index(spiffs *fs, spiffs_obj_id obj_id, spiffs_span_ix data_spix, spiffs_page_ix new_data_pix, spiffs_page_ix objix_pix)\n{\n    s32_t res;\n    spiffs_block_ix bix;\n    int entry;\n    spiffs_page_ix free_pix;\n    obj_id |= SPIFFS_OBJ_ID_IX_FLAG;\n\n    // find free entry\n    res = spiffs_obj_lu_find_free(fs, fs->free_cursor_block_ix, fs->free_cursor_obj_lu_entry, &bix, &entry);\n    SPIFFS_CHECK_RES(res);\n    free_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry);\n\n    // calculate object index span index for given data page span index\n    spiffs_span_ix objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix);\n    if (objix_spix == 0)\n    {\n        // calc index in index header\n        entry = data_spix;\n    }\n    else\n    {\n        // calc entry in index\n        entry = SPIFFS_OBJ_IX_ENTRY(fs, data_spix);\n\n    }\n    // load index\n    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                     0, SPIFFS_PAGE_TO_PADDR(fs, objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n    SPIFFS_CHECK_RES(res);\n    spiffs_page_header *objix_p_hdr = (spiffs_page_header *)fs->lu_work;\n\n    // be ultra safe, double check header against provided data\n    if (objix_p_hdr->obj_id != obj_id)\n    {\n        spiffs_page_delete(fs, free_pix);\n        return SPIFFS_ERR_CHECK_OBJ_ID_MISM;\n    }\n    if (objix_p_hdr->span_ix != objix_spix)\n    {\n        spiffs_page_delete(fs, free_pix);\n        return SPIFFS_ERR_CHECK_SPIX_MISM;\n    }\n    if ((objix_p_hdr->flags & (SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_IXDELE | SPIFFS_PH_FLAG_INDEX |\n                               SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET)) !=\n            (SPIFFS_PH_FLAG_IXDELE | SPIFFS_PH_FLAG_DELET))\n    {\n        spiffs_page_delete(fs, free_pix);\n        return SPIFFS_ERR_CHECK_FLAGS_BAD;\n    }\n\n    // rewrite in mem\n    if (objix_spix == 0)\n    {\n        ((spiffs_page_ix *)((u8_t *)fs->lu_work + sizeof(spiffs_page_object_ix_header)))[data_spix] = new_data_pix;\n    }\n    else\n    {\n        ((spiffs_page_ix *)((u8_t *)fs->lu_work + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)] = new_data_pix;\n    }\n\n    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                     0, SPIFFS_PAGE_TO_PADDR(fs, free_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n    SPIFFS_CHECK_RES(res);\n    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT,\n                     0, SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs, free_pix)) + SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, free_pix) * sizeof(spiffs_page_ix),\n                     sizeof(spiffs_obj_id),\n                     (u8_t *)&obj_id);\n    SPIFFS_CHECK_RES(res);\n    res = spiffs_page_delete(fs, objix_pix);\n\n    return res;\n}\n\n// deletes an object just by marking object index header as deleted\nstatic s32_t spiffs_delete_obj_lazy(spiffs *fs, spiffs_obj_id obj_id)\n{\n    spiffs_page_ix objix_hdr_pix;\n    s32_t res;\n    res = spiffs_obj_lu_find_id_and_span(fs, obj_id, 0, 0, &objix_hdr_pix);\n    if (res == SPIFFS_ERR_NOT_FOUND)\n    {\n        return SPIFFS_OK;\n    }\n    SPIFFS_CHECK_RES(res);\n    u8_t flags = 0xff;\n#if SPIFFS_NO_BLIND_WRITES\n    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                     0, SPIFFS_PAGE_TO_PADDR(fs, objix_hdr_pix) + offsetof(spiffs_page_header, flags),\n                     sizeof(flags), &flags);\n    SPIFFS_CHECK_RES(res);\n#endif\n    flags &= ~SPIFFS_PH_FLAG_IXDELE;\n    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT,\n                     0, SPIFFS_PAGE_TO_PADDR(fs, objix_hdr_pix) + offsetof(spiffs_page_header, flags),\n                     sizeof(flags), &flags);\n    return res;\n}\n\n// validates the given look up entry\nstatic s32_t spiffs_lookup_check_validate(spiffs *fs, spiffs_obj_id lu_obj_id, spiffs_page_header *p_hdr,\n        spiffs_page_ix cur_pix, spiffs_block_ix cur_block, int cur_entry, int *reload_lu)\n{\n    (void)cur_block;\n    (void)cur_entry;\n    u8_t delete_page = 0;\n    s32_t res = SPIFFS_OK;\n    spiffs_page_ix objix_pix;\n    spiffs_page_ix ref_pix;\n    // check validity, take actions\n    if (((lu_obj_id == SPIFFS_OBJ_ID_DELETED) && (p_hdr->flags & SPIFFS_PH_FLAG_DELET)) ||\n            ((lu_obj_id == SPIFFS_OBJ_ID_FREE) && (p_hdr->flags & SPIFFS_PH_FLAG_USED) == 0))\n    {\n        // look up entry deleted / free but used in page header\n        SPIFFS_CHECK_DBG(\"LU: pix \"_SPIPRIpg\" deleted/free in lu but not on page\\n\", cur_pix);\n        *reload_lu = 1;\n        delete_page = 1;\n        if (p_hdr->flags & SPIFFS_PH_FLAG_INDEX)\n        {\n            // header says data page\n            // data page can be removed if not referenced by some object index\n            res = spiffs_object_get_data_page_index_reference(fs, p_hdr->obj_id, p_hdr->span_ix, &ref_pix, &objix_pix);\n            if (res == SPIFFS_ERR_NOT_FOUND)\n            {\n                // no object with this id, so remove page safely\n                res = SPIFFS_OK;\n            }\n            else\n            {\n                SPIFFS_CHECK_RES(res);\n                if (ref_pix == cur_pix)\n                {\n                    // data page referenced by object index but deleted in lu\n                    // copy page to new place and re-write the object index to new place\n                    spiffs_page_ix new_pix;\n                    res = spiffs_rewrite_page(fs, cur_pix, p_hdr, &new_pix);\n                    SPIFFS_CHECK_DBG(\"LU: FIXUP: data page not found elsewhere, rewriting \"_SPIPRIpg\" to new page \"_SPIPRIpg\"\\n\", cur_pix, new_pix);\n                    SPIFFS_CHECK_RES(res);\n                    *reload_lu = 1;\n                    SPIFFS_CHECK_DBG(\"LU: FIXUP: \"_SPIPRIpg\" rewritten to \"_SPIPRIpg\", affected objix_pix \"_SPIPRIpg\"\\n\", cur_pix, new_pix, objix_pix);\n                    res = spiffs_rewrite_index(fs, p_hdr->obj_id, p_hdr->span_ix, new_pix, objix_pix);\n                    if (res <= _SPIFFS_ERR_CHECK_FIRST && res > _SPIFFS_ERR_CHECK_LAST)\n                    {\n                        // index bad also, cannot mend this file\n                        SPIFFS_CHECK_DBG(\"LU: FIXUP: index bad \"_SPIPRIi\", cannot mend!\\n\", res);\n                        res = spiffs_page_delete(fs, new_pix);\n                        SPIFFS_CHECK_RES(res);\n                        res = spiffs_delete_obj_lazy(fs, p_hdr->obj_id);\n                        CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_DELETE_BAD_FILE, p_hdr->obj_id, 0);\n                    }\n                    else\n                    {\n                        CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_FIX_INDEX, p_hdr->obj_id, p_hdr->span_ix);\n                    }\n                    SPIFFS_CHECK_RES(res);\n                }\n            }\n        }\n        else\n        {\n            // header says index page\n            // index page can be removed if other index with same obj_id and spanix is found\n            res = spiffs_obj_lu_find_id_and_span(fs, p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG, p_hdr->span_ix, cur_pix, 0);\n            if (res == SPIFFS_ERR_NOT_FOUND)\n            {\n                // no such index page found, check for a data page amongst page headers\n                // lu cannot be trusted\n                res = spiffs_obj_lu_find_id_and_span_by_phdr(fs, p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG, 0, 0, 0);\n                if (res == SPIFFS_OK)   // ignore other errors\n                {\n                    // got a data page also, assume lu corruption only, rewrite to new page\n                    spiffs_page_ix new_pix;\n                    res = spiffs_rewrite_page(fs, cur_pix, p_hdr, &new_pix);\n                    SPIFFS_CHECK_DBG(\"LU: FIXUP: ix page with data not found elsewhere, rewriting \"_SPIPRIpg\" to new page \"_SPIPRIpg\"\\n\", cur_pix, new_pix);\n                    SPIFFS_CHECK_RES(res);\n                    *reload_lu = 1;\n                    CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_FIX_LOOKUP, p_hdr->obj_id, p_hdr->span_ix);\n                }\n            }\n            else\n            {\n                SPIFFS_CHECK_RES(res);\n            }\n        }\n    }\n    if (lu_obj_id != SPIFFS_OBJ_ID_FREE && lu_obj_id != SPIFFS_OBJ_ID_DELETED)\n    {\n        // look up entry used\n        if ((p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG) != (lu_obj_id | SPIFFS_OBJ_ID_IX_FLAG))\n        {\n            SPIFFS_CHECK_DBG(\"LU: pix \"_SPIPRIpg\" differ in obj_id lu:\"_SPIPRIid\" ph:\"_SPIPRIid\"\\n\", cur_pix, lu_obj_id, p_hdr->obj_id);\n            delete_page = 1;\n            if ((p_hdr->flags & SPIFFS_PH_FLAG_DELET) == 0 ||\n                    (p_hdr->flags & SPIFFS_PH_FLAG_FINAL) ||\n                    (p_hdr->flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_IXDELE)) == 0)\n            {\n                // page deleted or not finalized, just remove it\n            }\n            else\n            {\n                if (p_hdr->flags & SPIFFS_PH_FLAG_INDEX)\n                {\n                    // if data page, check for reference to this page\n                    res = spiffs_object_get_data_page_index_reference(fs, p_hdr->obj_id, p_hdr->span_ix, &ref_pix, &objix_pix);\n                    if (res == SPIFFS_ERR_NOT_FOUND)\n                    {\n                        // no object with this id, so remove page safely\n                        res = SPIFFS_OK;\n                    }\n                    else\n                    {\n                        SPIFFS_CHECK_RES(res);\n                        //   if found, rewrite page with object id, update index, and delete current\n                        if (ref_pix == cur_pix)\n                        {\n                            spiffs_page_ix new_pix;\n                            res = spiffs_rewrite_page(fs, cur_pix, p_hdr, &new_pix);\n                            SPIFFS_CHECK_RES(res);\n                            res = spiffs_rewrite_index(fs, p_hdr->obj_id, p_hdr->span_ix, new_pix, objix_pix);\n                            if (res <= _SPIFFS_ERR_CHECK_FIRST && res > _SPIFFS_ERR_CHECK_LAST)\n                            {\n                                // index bad also, cannot mend this file\n                                SPIFFS_CHECK_DBG(\"LU: FIXUP: index bad \"_SPIPRIi\", cannot mend!\\n\", res);\n                                res = spiffs_page_delete(fs, new_pix);\n                                SPIFFS_CHECK_RES(res);\n                                res = spiffs_delete_obj_lazy(fs, p_hdr->obj_id);\n                                *reload_lu = 1;\n                                CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_DELETE_BAD_FILE, p_hdr->obj_id, 0);\n                            }\n                            SPIFFS_CHECK_RES(res);\n                        }\n                    }\n                }\n                else\n                {\n                    // else if index, check for other pages with both obj_id's and spanix\n                    spiffs_page_ix objix_pix_lu, objix_pix_ph;\n                    // see if other object index page exists for lookup obj id and span index\n                    res = spiffs_obj_lu_find_id_and_span(fs, lu_obj_id | SPIFFS_OBJ_ID_IX_FLAG, p_hdr->span_ix, 0, &objix_pix_lu);\n                    if (res == SPIFFS_ERR_NOT_FOUND)\n                    {\n                        res = SPIFFS_OK;\n                        objix_pix_lu = 0;\n                    }\n                    SPIFFS_CHECK_RES(res);\n                    // see if other object index exists for page header obj id and span index\n                    res = spiffs_obj_lu_find_id_and_span(fs, p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG, p_hdr->span_ix, 0, &objix_pix_ph);\n                    if (res == SPIFFS_ERR_NOT_FOUND)\n                    {\n                        res = SPIFFS_OK;\n                        objix_pix_ph = 0;\n                    }\n                    SPIFFS_CHECK_RES(res);\n                    //   if both obj_id's found, just delete current\n                    if (objix_pix_ph == 0 || objix_pix_lu == 0)\n                    {\n                        // otherwise try finding first corresponding data pages\n                        spiffs_page_ix data_pix_lu, data_pix_ph;\n                        // see if other data page exists for look up obj id and span index\n                        res = spiffs_obj_lu_find_id_and_span(fs, lu_obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, 0, 0, &data_pix_lu);\n                        if (res == SPIFFS_ERR_NOT_FOUND)\n                        {\n                            res = SPIFFS_OK;\n                            objix_pix_lu = 0;\n                        }\n                        SPIFFS_CHECK_RES(res);\n                        // see if other data page exists for page header obj id and span index\n                        res = spiffs_obj_lu_find_id_and_span(fs, p_hdr->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, 0, 0, &data_pix_ph);\n                        if (res == SPIFFS_ERR_NOT_FOUND)\n                        {\n                            res = SPIFFS_OK;\n                            objix_pix_ph = 0;\n                        }\n                        SPIFFS_CHECK_RES(res);\n\n                        spiffs_page_header new_ph;\n                        new_ph.flags = 0xff & ~(SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL);\n                        new_ph.span_ix = p_hdr->span_ix;\n                        spiffs_page_ix new_pix;\n                        if ((objix_pix_lu && data_pix_lu && data_pix_ph && objix_pix_ph == 0) ||\n                                (objix_pix_lu == 0 && data_pix_ph && objix_pix_ph == 0))\n                        {\n                            //   got a data page for page header obj id\n                            //   rewrite as obj_id_ph\n                            new_ph.obj_id = p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG;\n                            res = spiffs_rewrite_page(fs, cur_pix, &new_ph, &new_pix);\n                            SPIFFS_CHECK_DBG(\"LU: FIXUP: rewrite page \"_SPIPRIpg\" as \"_SPIPRIid\" to pix \"_SPIPRIpg\"\\n\", cur_pix, new_ph.obj_id, new_pix);\n                            CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_FIX_LOOKUP, p_hdr->obj_id, p_hdr->span_ix);\n                            SPIFFS_CHECK_RES(res);\n                            *reload_lu = 1;\n                        }\n                        else if ((objix_pix_ph && data_pix_ph && data_pix_lu && objix_pix_lu == 0) ||\n                                 (objix_pix_ph == 0 && data_pix_lu && objix_pix_lu == 0))\n                        {\n                            //   got a data page for look up obj id\n                            //   rewrite as obj_id_lu\n                            new_ph.obj_id =  lu_obj_id | SPIFFS_OBJ_ID_IX_FLAG;\n                            SPIFFS_CHECK_DBG(\"LU: FIXUP: rewrite page \"_SPIPRIpg\" as \"_SPIPRIid\"\\n\", cur_pix, new_ph.obj_id);\n                            CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_FIX_LOOKUP, p_hdr->obj_id, p_hdr->span_ix);\n                            res = spiffs_rewrite_page(fs, cur_pix, &new_ph, &new_pix);\n                            SPIFFS_CHECK_RES(res);\n                            *reload_lu = 1;\n                        }\n                        else\n                        {\n                            // cannot safely do anything\n                            SPIFFS_CHECK_DBG(\"LU: FIXUP: nothing to do, just delete\\n\");\n                        }\n                    }\n                }\n            }\n        }\n        else if (((lu_obj_id & SPIFFS_OBJ_ID_IX_FLAG) && (p_hdr->flags & SPIFFS_PH_FLAG_INDEX)) ||\n                 ((lu_obj_id & SPIFFS_OBJ_ID_IX_FLAG) == 0 && (p_hdr->flags & SPIFFS_PH_FLAG_INDEX) == 0))\n        {\n            SPIFFS_CHECK_DBG(\"LU: \"_SPIPRIpg\" lu/page index marking differ\\n\", cur_pix);\n            spiffs_page_ix data_pix, objix_pix_d;\n            // see if other data page exists for given obj id and span index\n            res = spiffs_obj_lu_find_id_and_span(fs, lu_obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, p_hdr->span_ix, cur_pix, &data_pix);\n            if (res == SPIFFS_ERR_NOT_FOUND)\n            {\n                res = SPIFFS_OK;\n                data_pix = 0;\n            }\n            SPIFFS_CHECK_RES(res);\n            // see if other object index exists for given obj id and span index\n            res = spiffs_obj_lu_find_id_and_span(fs, lu_obj_id | SPIFFS_OBJ_ID_IX_FLAG, p_hdr->span_ix, cur_pix, &objix_pix_d);\n            if (res == SPIFFS_ERR_NOT_FOUND)\n            {\n                res = SPIFFS_OK;\n                objix_pix_d = 0;\n            }\n            SPIFFS_CHECK_RES(res);\n\n            delete_page = 1;\n            // if other data page exists and object index exists, just delete page\n            if (data_pix && objix_pix_d)\n            {\n                SPIFFS_CHECK_DBG(\"LU: FIXUP: other index and data page exists, simply remove\\n\");\n            }\n            else\n                // if only data page exists, make this page index\n                if (data_pix && objix_pix_d == 0)\n                {\n                    SPIFFS_CHECK_DBG(\"LU: FIXUP: other data page exists, make this index\\n\");\n                    CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_FIX_INDEX, lu_obj_id, p_hdr->span_ix);\n                    spiffs_page_header new_ph;\n                    spiffs_page_ix new_pix;\n                    new_ph.flags = 0xff & ~(SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX);\n                    new_ph.obj_id = lu_obj_id | SPIFFS_OBJ_ID_IX_FLAG;\n                    new_ph.span_ix = p_hdr->span_ix;\n                    res = spiffs_page_allocate_data(fs, new_ph.obj_id, &new_ph, 0, 0, 0, 1, &new_pix);\n                    SPIFFS_CHECK_RES(res);\n                    res = spiffs_phys_cpy(fs, 0, SPIFFS_PAGE_TO_PADDR(fs, new_pix) + sizeof(spiffs_page_header),\n                                          SPIFFS_PAGE_TO_PADDR(fs, cur_pix) + sizeof(spiffs_page_header),\n                                          SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_header));\n                    SPIFFS_CHECK_RES(res);\n                }\n                else\n                    // if only index exists, make data page\n                    if (data_pix == 0 && objix_pix_d)\n                    {\n                        SPIFFS_CHECK_DBG(\"LU: FIXUP: other index page exists, make this data\\n\");\n                        CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_FIX_LOOKUP, lu_obj_id, p_hdr->span_ix);\n                        spiffs_page_header new_ph;\n                        spiffs_page_ix new_pix;\n                        new_ph.flags = 0xff & ~(SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_FINAL);\n                        new_ph.obj_id = lu_obj_id & ~SPIFFS_OBJ_ID_IX_FLAG;\n                        new_ph.span_ix = p_hdr->span_ix;\n                        res = spiffs_page_allocate_data(fs, new_ph.obj_id, &new_ph, 0, 0, 0, 1, &new_pix);\n                        SPIFFS_CHECK_RES(res);\n                        res = spiffs_phys_cpy(fs, 0, SPIFFS_PAGE_TO_PADDR(fs, new_pix) + sizeof(spiffs_page_header),\n                                              SPIFFS_PAGE_TO_PADDR(fs, cur_pix) + sizeof(spiffs_page_header),\n                                              SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_header));\n                        SPIFFS_CHECK_RES(res);\n                    }\n                    else\n                    {\n                        // if nothing exists, we cannot safely make a decision - delete\n                    }\n        }\n        else if ((p_hdr->flags & SPIFFS_PH_FLAG_DELET) == 0)\n        {\n            SPIFFS_CHECK_DBG(\"LU: pix \"_SPIPRIpg\" busy in lu but deleted on page\\n\", cur_pix);\n            delete_page = 1;\n        }\n        else if ((p_hdr->flags & SPIFFS_PH_FLAG_FINAL))\n        {\n            SPIFFS_CHECK_DBG(\"LU: pix \"_SPIPRIpg\" busy but not final\\n\", cur_pix);\n            // page can be removed if not referenced by object index\n            *reload_lu = 1;\n            res = spiffs_object_get_data_page_index_reference(fs, lu_obj_id, p_hdr->span_ix, &ref_pix, &objix_pix);\n            if (res == SPIFFS_ERR_NOT_FOUND)\n            {\n                // no object with this id, so remove page safely\n                res = SPIFFS_OK;\n                delete_page = 1;\n            }\n            else\n            {\n                SPIFFS_CHECK_RES(res);\n                if (ref_pix != cur_pix)\n                {\n                    SPIFFS_CHECK_DBG(\"LU: FIXUP: other finalized page is referred, just delete\\n\");\n                    delete_page = 1;\n                }\n                else\n                {\n                    // page referenced by object index but not final\n                    // just finalize\n                    SPIFFS_CHECK_DBG(\"LU: FIXUP: unfinalized page is referred, finalizing\\n\");\n                    CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_FIX_LOOKUP, p_hdr->obj_id, p_hdr->span_ix);\n                    u8_t flags = 0xff;\n#if SPIFFS_NO_BLIND_WRITES\n                    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_READ,\n                                     0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix) + offsetof(spiffs_page_header, flags),\n                                     sizeof(flags), &flags);\n                    SPIFFS_CHECK_RES(res);\n#endif\n                    flags &= ~SPIFFS_PH_FLAG_FINAL;\n                    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                                     0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix) + offsetof(spiffs_page_header, flags),\n                                     sizeof(flags), &flags);\n                }\n            }\n        }\n    }\n\n    if (delete_page)\n    {\n        SPIFFS_CHECK_DBG(\"LU: FIXUP: deleting page \"_SPIPRIpg\"\\n\", cur_pix);\n        CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_DELETE_PAGE, cur_pix, 0);\n        res = spiffs_page_delete(fs, cur_pix);\n        SPIFFS_CHECK_RES(res);\n    }\n\n    return res;\n}\n\nstatic s32_t spiffs_lookup_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ix cur_block, int cur_entry,\n                                   const void *user_const_p, void *user_var_p)\n{\n    (void)user_const_p;\n    (void)user_var_p;\n    s32_t res = SPIFFS_OK;\n    spiffs_page_header p_hdr;\n    spiffs_page_ix cur_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, cur_block, cur_entry);\n\n    CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_PROGRESS,\n             (cur_block * 256) / fs->block_count, 0);\n\n    // load header\n    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                     0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t *)&p_hdr);\n    SPIFFS_CHECK_RES(res);\n\n    int reload_lu = 0;\n\n    res = spiffs_lookup_check_validate(fs, obj_id, &p_hdr, cur_pix, cur_block, cur_entry, &reload_lu);\n    SPIFFS_CHECK_RES(res);\n\n    if (res == SPIFFS_OK)\n    {\n        return reload_lu ? SPIFFS_VIS_COUNTINUE_RELOAD : SPIFFS_VIS_COUNTINUE;\n    }\n    return res;\n}\n\n\n// Scans all object look up. For each entry, corresponding page header is checked for validity.\n// If an object index header page is found, this is also checked\ns32_t spiffs_lookup_consistency_check(spiffs *fs, u8_t check_all_objects)\n{\n    (void)check_all_objects;\n    s32_t res = SPIFFS_OK;\n\n    CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_PROGRESS, 0, 0);\n\n    res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_lookup_check_v, 0, 0, 0, 0);\n\n    if (res == SPIFFS_VIS_END)\n    {\n        res = SPIFFS_OK;\n    }\n\n    if (res != SPIFFS_OK)\n    {\n        CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_ERROR, res, 0);\n    }\n\n    CHECK_CB(fs, SPIFFS_CHECK_LOOKUP, SPIFFS_CHECK_PROGRESS, 256, 0);\n\n    return res;\n}\n\n//---------------------------------------\n// Page consistency\n\n// Scans all pages (except lu pages), reserves 4 bits in working memory for each page\n// bit 0: 0 == FREE|DELETED, 1 == USED\n// bit 1: 0 == UNREFERENCED, 1 == REFERENCED\n// bit 2: 0 == NOT_INDEX,    1 == INDEX\n// bit 3: unused\n// A consistent file system will have only pages being\n//  * x000 free, unreferenced, not index\n//  * x011 used, referenced only once, not index\n//  * x101 used, unreferenced, index\n// The working memory might not fit all pages so several scans might be needed\nstatic s32_t spiffs_page_consistency_check_i(spiffs *fs)\n{\n    const u32_t bits = 4;\n    const spiffs_page_ix pages_per_scan = SPIFFS_CFG_LOG_PAGE_SZ(fs) * 8 / bits;\n\n    s32_t res = SPIFFS_OK;\n    spiffs_page_ix pix_offset = 0;\n\n    // for each range of pages fitting into work memory\n    while (pix_offset < SPIFFS_PAGES_PER_BLOCK(fs) * fs->block_count)\n    {\n        // set this flag to abort all checks and rescan the page range\n        u8_t restart = 0;\n        memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs));\n\n        spiffs_block_ix cur_block = 0;\n        // build consistency bitmap for id range traversing all blocks\n        while (!restart && cur_block < fs->block_count)\n        {\n            CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_PROGRESS,\n                     (pix_offset * 256) / (SPIFFS_PAGES_PER_BLOCK(fs) * fs->block_count) +\n                     ((((cur_block * pages_per_scan * 256) / (SPIFFS_PAGES_PER_BLOCK(fs) * fs->block_count))) / fs->block_count),\n                     0);\n            // traverse each page except for lookup pages\n            spiffs_page_ix cur_pix = SPIFFS_OBJ_LOOKUP_PAGES(fs) + SPIFFS_PAGES_PER_BLOCK(fs) * cur_block;\n            while (!restart && cur_pix < SPIFFS_PAGES_PER_BLOCK(fs) * (cur_block + 1))\n            {\n                //if ((cur_pix & 0xff) == 0)\n                //  SPIFFS_CHECK_DBG(\"PA: processing pix \"_SPIPRIpg\", block \"_SPIPRIbl\" of pix \"_SPIPRIpg\", block \"_SPIPRIbl\"\\n\",\n                //      cur_pix, cur_block, SPIFFS_PAGES_PER_BLOCK(fs) * fs->block_count, fs->block_count);\n\n                // read header\n                spiffs_page_header p_hdr;\n                res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                                 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t *)&p_hdr);\n                SPIFFS_CHECK_RES(res);\n\n                u8_t within_range = (cur_pix >= pix_offset && cur_pix < pix_offset + pages_per_scan);\n                const u32_t pix_byte_ix = (cur_pix - pix_offset) / (8 / bits);\n                const u8_t pix_bit_ix = (cur_pix & ((8 / bits) - 1)) * bits;\n\n                if (within_range &&\n                        (p_hdr.flags & SPIFFS_PH_FLAG_DELET) && (p_hdr.flags & SPIFFS_PH_FLAG_USED) == 0)\n                {\n                    // used\n                    fs->work[pix_byte_ix] |= (1 << (pix_bit_ix + 0));\n                }\n                if ((p_hdr.flags & SPIFFS_PH_FLAG_DELET) &&\n                        (p_hdr.flags & SPIFFS_PH_FLAG_IXDELE) &&\n                        (p_hdr.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_USED)) == 0)\n                {\n                    // found non-deleted index\n                    if (within_range)\n                    {\n                        fs->work[pix_byte_ix] |= (1 << (pix_bit_ix + 2));\n                    }\n\n                    // load non-deleted index\n                    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                                     0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n                    SPIFFS_CHECK_RES(res);\n\n                    // traverse index for referenced pages\n                    spiffs_page_ix *object_page_index;\n                    spiffs_page_header *objix_p_hdr = (spiffs_page_header *)fs->lu_work;\n\n                    int entries;\n                    int i;\n                    spiffs_span_ix data_spix_offset;\n                    if (p_hdr.span_ix == 0)\n                    {\n                        // object header page index\n                        entries = SPIFFS_OBJ_HDR_IX_LEN(fs);\n                        data_spix_offset = 0;\n                        object_page_index = (spiffs_page_ix *)((u8_t *)fs->lu_work + sizeof(spiffs_page_object_ix_header));\n                    }\n                    else\n                    {\n                        // object page index\n                        entries = SPIFFS_OBJ_IX_LEN(fs);\n                        data_spix_offset = SPIFFS_OBJ_HDR_IX_LEN(fs) + SPIFFS_OBJ_IX_LEN(fs) * (p_hdr.span_ix - 1);\n                        object_page_index = (spiffs_page_ix *)((u8_t *)fs->lu_work + sizeof(spiffs_page_object_ix));\n                    }\n\n                    // for all entries in index\n                    for (i = 0; !restart && i < entries; i++)\n                    {\n                        spiffs_page_ix rpix = object_page_index[i];\n                        u8_t rpix_within_range = rpix >= pix_offset && rpix < pix_offset + pages_per_scan;\n\n                        if ((rpix != (spiffs_page_ix) - 1 && rpix > SPIFFS_MAX_PAGES(fs))\n                                || (rpix_within_range && SPIFFS_IS_LOOKUP_PAGE(fs, rpix)))\n                        {\n\n                            // bad reference\n                            SPIFFS_CHECK_DBG(\"PA: pix \"_SPIPRIpg\"x bad pix / LU referenced from page \"_SPIPRIpg\"\\n\",\n                                             rpix, cur_pix);\n                            // check for data page elsewhere\n                            spiffs_page_ix data_pix;\n                            res = spiffs_obj_lu_find_id_and_span(fs, objix_p_hdr->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG,\n                                                                 data_spix_offset + i, 0, &data_pix);\n                            if (res == SPIFFS_ERR_NOT_FOUND)\n                            {\n                                res = SPIFFS_OK;\n                                data_pix = 0;\n                            }\n                            SPIFFS_CHECK_RES(res);\n                            if (data_pix == 0)\n                            {\n                                // if not, allocate free page\n                                spiffs_page_header new_ph;\n                                new_ph.flags = 0xff & ~(SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_FINAL);\n                                new_ph.obj_id = objix_p_hdr->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG;\n                                new_ph.span_ix = data_spix_offset + i;\n                                res = spiffs_page_allocate_data(fs, new_ph.obj_id, &new_ph, 0, 0, 0, 1, &data_pix);\n                                SPIFFS_CHECK_RES(res);\n                                SPIFFS_CHECK_DBG(\"PA: FIXUP: found no existing data page, created new @ \"_SPIPRIpg\"\\n\", data_pix);\n                            }\n                            // remap index\n                            SPIFFS_CHECK_DBG(\"PA: FIXUP: rewriting index pix \"_SPIPRIpg\"\\n\", cur_pix);\n                            res = spiffs_rewrite_index(fs, objix_p_hdr->obj_id | SPIFFS_OBJ_ID_IX_FLAG,\n                                                       data_spix_offset + i, data_pix, cur_pix);\n                            if (res <= _SPIFFS_ERR_CHECK_FIRST && res > _SPIFFS_ERR_CHECK_LAST)\n                            {\n                                // index bad also, cannot mend this file\n                                SPIFFS_CHECK_DBG(\"PA: FIXUP: index bad \"_SPIPRIi\", cannot mend - delete object\\n\", res);\n                                CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_DELETE_BAD_FILE, objix_p_hdr->obj_id, 0);\n                                // delete file\n                                res = spiffs_page_delete(fs, cur_pix);\n                            }\n                            else\n                            {\n                                CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_FIX_INDEX, objix_p_hdr->obj_id, objix_p_hdr->span_ix);\n                            }\n                            SPIFFS_CHECK_RES(res);\n                            restart = 1;\n\n                        }\n                        else if (rpix_within_range)\n                        {\n\n                            // valid reference\n                            // read referenced page header\n                            spiffs_page_header rp_hdr;\n                            res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                                             0, SPIFFS_PAGE_TO_PADDR(fs, rpix), sizeof(spiffs_page_header), (u8_t *)&rp_hdr);\n                            SPIFFS_CHECK_RES(res);\n\n                            // cross reference page header check\n                            if (rp_hdr.obj_id != (p_hdr.obj_id & ~SPIFFS_OBJ_ID_IX_FLAG) ||\n                                    rp_hdr.span_ix != data_spix_offset + i ||\n                                    (rp_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_USED)) !=\n                                    (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_INDEX))\n                            {\n                                SPIFFS_CHECK_DBG(\"PA: pix \"_SPIPRIpg\" has inconsistent page header ix id/span:\"_SPIPRIid\"/\"_SPIPRIsp\", ref id/span:\"_SPIPRIid\"/\"_SPIPRIsp\" flags:\"_SPIPRIfl\"\\n\",\n                                                 rpix, p_hdr.obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, data_spix_offset + i,\n                                                 rp_hdr.obj_id, rp_hdr.span_ix, rp_hdr.flags);\n                                // try finding correct page\n                                spiffs_page_ix data_pix;\n                                res = spiffs_obj_lu_find_id_and_span(fs, p_hdr.obj_id & ~SPIFFS_OBJ_ID_IX_FLAG,\n                                                                     data_spix_offset + i, rpix, &data_pix);\n                                if (res == SPIFFS_ERR_NOT_FOUND)\n                                {\n                                    res = SPIFFS_OK;\n                                    data_pix = 0;\n                                }\n                                SPIFFS_CHECK_RES(res);\n                                if (data_pix == 0)\n                                {\n                                    // not found, this index is badly borked\n                                    SPIFFS_CHECK_DBG(\"PA: FIXUP: index bad, delete object id \"_SPIPRIid\"\\n\", p_hdr.obj_id);\n                                    CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_DELETE_BAD_FILE, p_hdr.obj_id, 0);\n                                    res = spiffs_delete_obj_lazy(fs, p_hdr.obj_id);\n                                    SPIFFS_CHECK_RES(res);\n                                    break;\n                                }\n                                else\n                                {\n                                    // found it, so rewrite index\n                                    SPIFFS_CHECK_DBG(\"PA: FIXUP: found correct data pix \"_SPIPRIpg\", rewrite ix pix \"_SPIPRIpg\" id \"_SPIPRIid\"\\n\",\n                                                     data_pix, cur_pix, p_hdr.obj_id);\n                                    res = spiffs_rewrite_index(fs, p_hdr.obj_id, data_spix_offset + i, data_pix, cur_pix);\n                                    if (res <= _SPIFFS_ERR_CHECK_FIRST && res > _SPIFFS_ERR_CHECK_LAST)\n                                    {\n                                        // index bad also, cannot mend this file\n                                        SPIFFS_CHECK_DBG(\"PA: FIXUP: index bad \"_SPIPRIi\", cannot mend!\\n\", res);\n                                        CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_DELETE_BAD_FILE, p_hdr.obj_id, 0);\n                                        res = spiffs_delete_obj_lazy(fs, p_hdr.obj_id);\n                                    }\n                                    else\n                                    {\n                                        CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_FIX_INDEX, p_hdr.obj_id, p_hdr.span_ix);\n                                    }\n                                    SPIFFS_CHECK_RES(res);\n                                    restart = 1;\n                                }\n                            }\n                            else\n                            {\n                                // mark rpix as referenced\n                                const u32_t rpix_byte_ix = (rpix - pix_offset) / (8 / bits);\n                                const u8_t rpix_bit_ix = (rpix & ((8 / bits) - 1)) * bits;\n                                if (fs->work[rpix_byte_ix] & (1 << (rpix_bit_ix + 1)))\n                                {\n                                    SPIFFS_CHECK_DBG(\"PA: pix \"_SPIPRIpg\" multiple referenced from page \"_SPIPRIpg\"\\n\",\n                                                     rpix, cur_pix);\n                                    // Here, we should have fixed all broken references - getting this means there\n                                    // must be multiple files with same object id. Only solution is to delete\n                                    // the object which is referring to this page\n                                    SPIFFS_CHECK_DBG(\"PA: FIXUP: removing object \"_SPIPRIid\" and page \"_SPIPRIpg\"\\n\",\n                                                     p_hdr.obj_id, cur_pix);\n                                    CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_DELETE_BAD_FILE, p_hdr.obj_id, 0);\n                                    res = spiffs_delete_obj_lazy(fs, p_hdr.obj_id);\n                                    SPIFFS_CHECK_RES(res);\n                                    // extra precaution, delete this page also\n                                    res = spiffs_page_delete(fs, cur_pix);\n                                    SPIFFS_CHECK_RES(res);\n                                    restart = 1;\n                                }\n                                fs->work[rpix_byte_ix] |= (1 << (rpix_bit_ix + 1));\n                            }\n                        }\n                    } // for all index entries\n                } // found index\n\n                // next page\n                cur_pix++;\n            }\n            // next block\n            cur_block++;\n        }\n        // check consistency bitmap\n        if (!restart)\n        {\n            spiffs_page_ix objix_pix;\n            spiffs_page_ix rpix;\n\n            u32_t byte_ix;\n            u8_t bit_ix;\n            for (byte_ix = 0; !restart && byte_ix < SPIFFS_CFG_LOG_PAGE_SZ(fs); byte_ix++)\n            {\n                for (bit_ix = 0; !restart && bit_ix < 8 / bits; bit_ix ++)\n                {\n                    u8_t bitmask = (fs->work[byte_ix] >> (bit_ix * bits)) & 0x7;\n                    spiffs_page_ix cur_pix = pix_offset + byte_ix * (8 / bits) + bit_ix;\n\n                    // 000 ok - free, unreferenced, not index\n\n                    if (bitmask == 0x1)\n                    {\n\n                        // 001\n                        SPIFFS_CHECK_DBG(\"PA: pix \"_SPIPRIpg\" USED, UNREFERENCED, not index\\n\", cur_pix);\n\n                        u8_t rewrite_ix_to_this = 0;\n                        u8_t delete_page = 0;\n                        // check corresponding object index entry\n                        spiffs_page_header p_hdr;\n                        res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                                         0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t *)&p_hdr);\n                        SPIFFS_CHECK_RES(res);\n\n                        res = spiffs_object_get_data_page_index_reference(fs, p_hdr.obj_id, p_hdr.span_ix,\n                                &rpix, &objix_pix);\n                        if (res == SPIFFS_OK)\n                        {\n                            if (((rpix == (spiffs_page_ix) - 1 || rpix > SPIFFS_MAX_PAGES(fs)) || (SPIFFS_IS_LOOKUP_PAGE(fs, rpix))))\n                            {\n                                // pointing to a bad page altogether, rewrite index to this\n                                rewrite_ix_to_this = 1;\n                                SPIFFS_CHECK_DBG(\"PA: corresponding ref is bad: \"_SPIPRIpg\", rewrite to this \"_SPIPRIpg\"\\n\", rpix, cur_pix);\n                            }\n                            else\n                            {\n                                // pointing to something else, check what\n                                spiffs_page_header rp_hdr;\n                                res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                                                 0, SPIFFS_PAGE_TO_PADDR(fs, rpix), sizeof(spiffs_page_header), (u8_t *)&rp_hdr);\n                                SPIFFS_CHECK_RES(res);\n                                if (((p_hdr.obj_id & ~SPIFFS_OBJ_ID_IX_FLAG) == rp_hdr.obj_id) &&\n                                        ((rp_hdr.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_FINAL)) ==\n                                         (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_DELET)))\n                                {\n                                    // pointing to something else valid, just delete this page then\n                                    SPIFFS_CHECK_DBG(\"PA: corresponding ref is good but different: \"_SPIPRIpg\", delete this \"_SPIPRIpg\"\\n\", rpix, cur_pix);\n                                    delete_page = 1;\n                                }\n                                else\n                                {\n                                    // pointing to something weird, update index to point to this page instead\n                                    if (rpix != cur_pix)\n                                    {\n                                        SPIFFS_CHECK_DBG(\"PA: corresponding ref is weird: \"_SPIPRIpg\" %s%s%s%s, rewrite this \"_SPIPRIpg\"\\n\", rpix,\n                                                         (rp_hdr.flags & SPIFFS_PH_FLAG_INDEX) ? \"\" : \"INDEX \",\n                                                         (rp_hdr.flags & SPIFFS_PH_FLAG_DELET) ? \"\" : \"DELETED \",\n                                                         (rp_hdr.flags & SPIFFS_PH_FLAG_USED) ? \"NOTUSED \" : \"\",\n                                                         (rp_hdr.flags & SPIFFS_PH_FLAG_FINAL) ? \"NOTFINAL \" : \"\",\n                                                         cur_pix);\n                                        rewrite_ix_to_this = 1;\n                                    }\n                                    else\n                                    {\n                                        // should not happen, destined for fubar\n                                    }\n                                }\n                            }\n                        }\n                        else if (res == SPIFFS_ERR_NOT_FOUND)\n                        {\n                            SPIFFS_CHECK_DBG(\"PA: corresponding ref not found, delete \"_SPIPRIpg\"\\n\", cur_pix);\n                            delete_page = 1;\n                            res = SPIFFS_OK;\n                        }\n\n                        if (rewrite_ix_to_this)\n                        {\n                            // if pointing to invalid page, redirect index to this page\n                            SPIFFS_CHECK_DBG(\"PA: FIXUP: rewrite index id \"_SPIPRIid\" data spix \"_SPIPRIsp\" to point to this pix: \"_SPIPRIpg\"\\n\",\n                                             p_hdr.obj_id, p_hdr.span_ix, cur_pix);\n                            res = spiffs_rewrite_index(fs, p_hdr.obj_id, p_hdr.span_ix, cur_pix, objix_pix);\n                            if (res <= _SPIFFS_ERR_CHECK_FIRST && res > _SPIFFS_ERR_CHECK_LAST)\n                            {\n                                // index bad also, cannot mend this file\n                                SPIFFS_CHECK_DBG(\"PA: FIXUP: index bad \"_SPIPRIi\", cannot mend!\\n\", res);\n                                CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_DELETE_BAD_FILE, p_hdr.obj_id, 0);\n                                res = spiffs_page_delete(fs, cur_pix);\n                                SPIFFS_CHECK_RES(res);\n                                res = spiffs_delete_obj_lazy(fs, p_hdr.obj_id);\n                            }\n                            else\n                            {\n                                CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_FIX_INDEX, p_hdr.obj_id, p_hdr.span_ix);\n                            }\n                            SPIFFS_CHECK_RES(res);\n                            restart = 1;\n                            continue;\n                        }\n                        else if (delete_page)\n                        {\n                            SPIFFS_CHECK_DBG(\"PA: FIXUP: deleting page \"_SPIPRIpg\"\\n\", cur_pix);\n                            CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_DELETE_PAGE, cur_pix, 0);\n                            res = spiffs_page_delete(fs, cur_pix);\n                        }\n                        SPIFFS_CHECK_RES(res);\n                    }\n                    if (bitmask == 0x2)\n                    {\n\n                        // 010\n                        SPIFFS_CHECK_DBG(\"PA: pix \"_SPIPRIpg\" FREE, REFERENCED, not index\\n\", cur_pix);\n\n                        // no op, this should be taken care of when checking valid references\n                    }\n\n                    // 011 ok - busy, referenced, not index\n\n                    if (bitmask == 0x4)\n                    {\n\n                        // 100\n                        SPIFFS_CHECK_DBG(\"PA: pix \"_SPIPRIpg\" FREE, unreferenced, INDEX\\n\", cur_pix);\n\n                        // this should never happen, major fubar\n                    }\n\n                    // 101 ok - busy, unreferenced, index\n\n                    if (bitmask == 0x6)\n                    {\n\n                        // 110\n                        SPIFFS_CHECK_DBG(\"PA: pix \"_SPIPRIpg\" FREE, REFERENCED, INDEX\\n\", cur_pix);\n\n                        // no op, this should be taken care of when checking valid references\n                    }\n                    if (bitmask == 0x7)\n                    {\n\n                        // 111\n                        SPIFFS_CHECK_DBG(\"PA: pix \"_SPIPRIpg\" USED, REFERENCED, INDEX\\n\", cur_pix);\n\n                        // no op, this should be taken care of when checking valid references\n                    }\n                }\n            }\n        }\n\n        SPIFFS_CHECK_DBG(\"PA: processed \"_SPIPRIpg\", restart \"_SPIPRIi\"\\n\", pix_offset, restart);\n        // next page range\n        if (!restart)\n        {\n            pix_offset += pages_per_scan;\n        }\n    } // while page range not reached end\n    return res;\n}\n\n// Checks consistency amongst all pages and fixes irregularities\ns32_t spiffs_page_consistency_check(spiffs *fs)\n{\n    CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_PROGRESS, 0, 0);\n    s32_t res = spiffs_page_consistency_check_i(fs);\n    if (res != SPIFFS_OK)\n    {\n        CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_ERROR, res, 0);\n    }\n    CHECK_CB(fs, SPIFFS_CHECK_PAGE, SPIFFS_CHECK_PROGRESS, 256, 0);\n    return res;\n}\n\n//---------------------------------------\n// Object index consistency\n\n// searches for given object id in temporary object id index,\n// returns the index or -1\nstatic int spiffs_object_index_search(spiffs *fs, spiffs_obj_id obj_id)\n{\n    u32_t i;\n    spiffs_obj_id *obj_table = (spiffs_obj_id *)fs->work;\n    obj_id &= ~SPIFFS_OBJ_ID_IX_FLAG;\n    for (i = 0; i < SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id); i++)\n    {\n        if ((obj_table[i] & ~SPIFFS_OBJ_ID_IX_FLAG) == obj_id)\n        {\n            return i;\n        }\n    }\n    return -1;\n}\n\nstatic s32_t spiffs_object_index_consistency_check_v(spiffs *fs, spiffs_obj_id obj_id, spiffs_block_ix cur_block,\n        int cur_entry, const void *user_const_p, void *user_var_p)\n{\n    (void)user_const_p;\n    s32_t res_c = SPIFFS_VIS_COUNTINUE;\n    s32_t res = SPIFFS_OK;\n    u32_t *log_ix = (u32_t *)user_var_p;\n    spiffs_obj_id *obj_table = (spiffs_obj_id *)fs->work;\n\n    CHECK_CB(fs, SPIFFS_CHECK_INDEX, SPIFFS_CHECK_PROGRESS,\n             (cur_block * 256) / fs->block_count, 0);\n\n    if (obj_id != SPIFFS_OBJ_ID_FREE && obj_id != SPIFFS_OBJ_ID_DELETED && (obj_id & SPIFFS_OBJ_ID_IX_FLAG))\n    {\n        spiffs_page_header p_hdr;\n        spiffs_page_ix cur_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, cur_block, cur_entry);\n\n        // load header\n        res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                         0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t *)&p_hdr);\n        SPIFFS_CHECK_RES(res);\n\n        if (p_hdr.span_ix == 0 &&\n                (p_hdr.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) ==\n                (SPIFFS_PH_FLAG_DELET))\n        {\n            SPIFFS_CHECK_DBG(\"IX: pix \"_SPIPRIpg\", obj id:\"_SPIPRIid\" spix:\"_SPIPRIsp\" header not fully deleted - deleting\\n\",\n                             cur_pix, obj_id, p_hdr.span_ix);\n            CHECK_CB(fs, SPIFFS_CHECK_INDEX, SPIFFS_CHECK_DELETE_PAGE, cur_pix, obj_id);\n            res = spiffs_page_delete(fs, cur_pix);\n            SPIFFS_CHECK_RES(res);\n            return res_c;\n        }\n\n        if ((p_hdr.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE)) ==\n                (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE))\n        {\n            return res_c;\n        }\n\n        if (p_hdr.span_ix == 0)\n        {\n            // objix header page, register objid as reachable\n            int r = spiffs_object_index_search(fs, obj_id);\n            if (r == -1)\n            {\n                // not registered, do it\n                obj_table[*log_ix] = obj_id & ~SPIFFS_OBJ_ID_IX_FLAG;\n                (*log_ix)++;\n                if (*log_ix >= SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id))\n                {\n                    *log_ix = 0;\n                }\n            }\n        }\n        else     // span index\n        {\n            // objix page, see if header can be found\n            int r = spiffs_object_index_search(fs, obj_id);\n            u8_t delete = 0;\n            if (r == -1)\n            {\n                // not in temporary index, try finding it\n                spiffs_page_ix objix_hdr_pix;\n                res = spiffs_obj_lu_find_id_and_span(fs, obj_id | SPIFFS_OBJ_ID_IX_FLAG, 0, 0, &objix_hdr_pix);\n                res_c = SPIFFS_VIS_COUNTINUE_RELOAD;\n                if (res == SPIFFS_OK)\n                {\n                    // found, register as reachable\n                    obj_table[*log_ix] = obj_id & ~SPIFFS_OBJ_ID_IX_FLAG;\n                }\n                else if (res == SPIFFS_ERR_NOT_FOUND)\n                {\n                    // not found, register as unreachable\n                    delete = 1;\n                    obj_table[*log_ix] = obj_id | SPIFFS_OBJ_ID_IX_FLAG;\n                }\n                else\n                {\n                    SPIFFS_CHECK_RES(res);\n                }\n                (*log_ix)++;\n                if (*log_ix >= SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id))\n                {\n                    *log_ix = 0;\n                }\n            }\n            else\n            {\n                // in temporary index, check reachable flag\n                if ((obj_table[r] & SPIFFS_OBJ_ID_IX_FLAG))\n                {\n                    // registered as unreachable\n                    delete = 1;\n                }\n            }\n\n            if (delete)\n            {\n                SPIFFS_CHECK_DBG(\"IX: FIXUP: pix \"_SPIPRIpg\", obj id:\"_SPIPRIid\" spix:\"_SPIPRIsp\" is orphan index - deleting\\n\",\n                                 cur_pix, obj_id, p_hdr.span_ix);\n                CHECK_CB(fs, SPIFFS_CHECK_INDEX, SPIFFS_CHECK_DELETE_ORPHANED_INDEX, cur_pix, obj_id);\n                res = spiffs_page_delete(fs, cur_pix);\n                SPIFFS_CHECK_RES(res);\n            }\n        } // span index\n    } // valid object index id\n\n    return res_c;\n}\n\n// Removes orphaned and partially deleted index pages.\n// Scans for index pages. When an index page is found, corresponding index header is searched for.\n// If no such page exists, the index page cannot be reached as no index header exists and must be\n// deleted.\ns32_t spiffs_object_index_consistency_check(spiffs *fs)\n{\n    s32_t res = SPIFFS_OK;\n    // impl note:\n    // fs->work is used for a temporary object index memory, listing found object ids and\n    // indicating whether they can be reached or not. Acting as a fifo if object ids cannot fit.\n    // In the temporary object index memory, SPIFFS_OBJ_ID_IX_FLAG bit is used to indicate\n    // a reachable/unreachable object id.\n    memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs));\n    u32_t obj_id_log_ix = 0;\n    CHECK_CB(fs, SPIFFS_CHECK_INDEX, SPIFFS_CHECK_PROGRESS, 0, 0);\n    res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_object_index_consistency_check_v, 0, &obj_id_log_ix,\n                                           0, 0);\n    if (res == SPIFFS_VIS_END)\n    {\n        res = SPIFFS_OK;\n    }\n    if (res != SPIFFS_OK)\n    {\n        CHECK_CB(fs, SPIFFS_CHECK_INDEX, SPIFFS_CHECK_ERROR, res, 0);\n    }\n    CHECK_CB(fs, SPIFFS_CHECK_INDEX, SPIFFS_CHECK_PROGRESS, 256, 0);\n    return res;\n}\n\n#endif // !SPIFFS_READ_ONLY\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/src/spiffs_gc.c",
    "content": "#include \"spiffs.h\"\n#include \"spiffs_nucleus.h\"\n\n#if !SPIFFS_READ_ONLY\n\n// Erases a logical block and updates the erase counter.\n// If cache is enabled, all pages that might be cached in this block\n// is dropped.\nstatic s32_t spiffs_gc_erase_block(\n    spiffs *fs,\n    spiffs_block_ix bix)\n{\n    s32_t res;\n\n    SPIFFS_GC_DBG(\"gc: erase block \"_SPIPRIbl\"\\n\", bix);\n    res = spiffs_erase_block(fs, bix);\n    SPIFFS_CHECK_RES(res);\n\n#if SPIFFS_CACHE\n    {\n        u32_t i;\n        for (i = 0; i < SPIFFS_PAGES_PER_BLOCK(fs); i++)\n        {\n            spiffs_cache_drop_page(fs, SPIFFS_PAGE_FOR_BLOCK(fs, bix) + i);\n        }\n    }\n#endif\n    return res;\n}\n\n// Searches for blocks where all entries are deleted - if one is found,\n// the block is erased. Compared to the non-quick gc, the quick one ensures\n// that no updates are needed on existing objects on pages that are erased.\ns32_t spiffs_gc_quick(\n    spiffs *fs, u16_t max_free_pages)\n{\n    s32_t res = SPIFFS_OK;\n    u32_t blocks = fs->block_count;\n    spiffs_block_ix cur_block = 0;\n    u32_t cur_block_addr = 0;\n    int cur_entry = 0;\n    spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work;\n\n    SPIFFS_GC_DBG(\"gc_quick: running\\n\");\n#if SPIFFS_GC_STATS\n    fs->stats_gc_runs++;\n#endif\n\n    int entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id));\n\n    // find fully deleted blocks\n    // check each block\n    while (res == SPIFFS_OK && blocks--)\n    {\n        u16_t deleted_pages_in_block = 0;\n        u16_t free_pages_in_block = 0;\n\n        int obj_lookup_page = 0;\n        // check each object lookup page\n        while (res == SPIFFS_OK && obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))\n        {\n            int entry_offset = obj_lookup_page * entries_per_page;\n            res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                             0, cur_block_addr + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n            // check each entry\n            while (res == SPIFFS_OK &&\n                    cur_entry - entry_offset < entries_per_page &&\n                    cur_entry < (int)(SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)))\n            {\n                spiffs_obj_id obj_id = obj_lu_buf[cur_entry - entry_offset];\n                if (obj_id == SPIFFS_OBJ_ID_DELETED)\n                {\n                    deleted_pages_in_block++;\n                }\n                else if (obj_id == SPIFFS_OBJ_ID_FREE)\n                {\n                    // kill scan, go for next block\n                    free_pages_in_block++;\n                    if (free_pages_in_block > max_free_pages)\n                    {\n                        obj_lookup_page = SPIFFS_OBJ_LOOKUP_PAGES(fs);\n                        res = 1; // kill object lu loop\n                        break;\n                    }\n                }\n                else\n                {\n                    // kill scan, go for next block\n                    obj_lookup_page = SPIFFS_OBJ_LOOKUP_PAGES(fs);\n                    res = 1; // kill object lu loop\n                    break;\n                }\n                cur_entry++;\n            } // per entry\n            obj_lookup_page++;\n        } // per object lookup page\n        if (res == 1) res = SPIFFS_OK;\n\n        if (res == SPIFFS_OK &&\n                deleted_pages_in_block + free_pages_in_block == SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs) &&\n                free_pages_in_block <= max_free_pages)\n        {\n            // found a fully deleted block\n            fs->stats_p_deleted -= deleted_pages_in_block;\n            res = spiffs_gc_erase_block(fs, cur_block);\n            return res;\n        }\n\n        cur_entry = 0;\n        cur_block++;\n        cur_block_addr += SPIFFS_CFG_LOG_BLOCK_SZ(fs);\n    } // per block\n\n    if (res == SPIFFS_OK)\n    {\n        res = SPIFFS_ERR_NO_DELETED_BLOCKS;\n    }\n    return res;\n}\n\n// Checks if garbage collecting is necessary. If so a candidate block is found,\n// cleansed and erased\ns32_t spiffs_gc_check(\n    spiffs *fs,\n    u32_t len)\n{\n    s32_t res;\n    s32_t free_pages =\n        (SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)) * (fs->block_count - 2)\n        - fs->stats_p_allocated - fs->stats_p_deleted;\n    int tries = 0;\n\n    if (fs->free_blocks > 3 &&\n            (s32_t)len < free_pages * (s32_t)SPIFFS_DATA_PAGE_SIZE(fs))\n    {\n        return SPIFFS_OK;\n    }\n\n    u32_t needed_pages = (len + SPIFFS_DATA_PAGE_SIZE(fs) - 1) / SPIFFS_DATA_PAGE_SIZE(fs);\n    //  if (fs->free_blocks <= 2 && (s32_t)needed_pages > free_pages) {\n    //    SPIFFS_GC_DBG(\"gc: full freeblk:\"_SPIPRIi\" needed:\"_SPIPRIi\" free:\"_SPIPRIi\" dele:\"_SPIPRIi\"\\n\", fs->free_blocks, needed_pages, free_pages, fs->stats_p_deleted);\n    //    return SPIFFS_ERR_FULL;\n    //  }\n    if ((s32_t)needed_pages > (s32_t)(free_pages + fs->stats_p_deleted))\n    {\n        SPIFFS_GC_DBG(\"gc_check: full freeblk:\"_SPIPRIi\" needed:\"_SPIPRIi\" free:\"_SPIPRIi\" dele:\"_SPIPRIi\"\\n\", fs->free_blocks, needed_pages, free_pages, fs->stats_p_deleted);\n        return SPIFFS_ERR_FULL;\n    }\n\n    do\n    {\n        SPIFFS_GC_DBG(\"\\ngc_check #\"_SPIPRIi\": run gc free_blocks:\"_SPIPRIi\" pfree:\"_SPIPRIi\" pallo:\"_SPIPRIi\" pdele:\"_SPIPRIi\" [\"_SPIPRIi\"] len:\"_SPIPRIi\" of \"_SPIPRIi\"\\n\",\n                      tries,\n                      fs->free_blocks, free_pages, fs->stats_p_allocated, fs->stats_p_deleted, (free_pages + fs->stats_p_allocated + fs->stats_p_deleted),\n                      len, (u32_t)(free_pages * SPIFFS_DATA_PAGE_SIZE(fs)));\n\n        spiffs_block_ix *cands;\n        int count;\n        spiffs_block_ix cand;\n        s32_t prev_free_pages = free_pages;\n        // if the fs is crammed, ignore block age when selecting candidate - kind of a bad state\n        res = spiffs_gc_find_candidate(fs, &cands, &count, free_pages <= 0);\n        SPIFFS_CHECK_RES(res);\n        if (count == 0)\n        {\n            SPIFFS_GC_DBG(\"gc_check: no candidates, return\\n\");\n            return (s32_t)needed_pages < free_pages ? SPIFFS_OK : SPIFFS_ERR_FULL;\n        }\n#if SPIFFS_GC_STATS\n        fs->stats_gc_runs++;\n#endif\n        cand = cands[0];\n        fs->cleaning = 1;\n        //SPIFFS_GC_DBG(\"gcing: cleaning block \"_SPIPRIi\"\\n\", cand);\n        res = spiffs_gc_clean(fs, cand);\n        fs->cleaning = 0;\n        if (res < 0)\n        {\n            SPIFFS_GC_DBG(\"gc_check: cleaning block \"_SPIPRIi\", result \"_SPIPRIi\"\\n\", cand, res);\n        }\n        else\n        {\n            SPIFFS_GC_DBG(\"gc_check: cleaning block \"_SPIPRIi\", result \"_SPIPRIi\"\\n\", cand, res);\n        }\n        SPIFFS_CHECK_RES(res);\n\n        res = spiffs_gc_erase_page_stats(fs, cand);\n        SPIFFS_CHECK_RES(res);\n\n        res = spiffs_gc_erase_block(fs, cand);\n        SPIFFS_CHECK_RES(res);\n\n        free_pages =\n            (SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)) * (fs->block_count - 2)\n            - fs->stats_p_allocated - fs->stats_p_deleted;\n\n        if (prev_free_pages <= 0 && prev_free_pages == free_pages)\n        {\n            // abort early to reduce wear, at least tried once\n            SPIFFS_GC_DBG(\"gc_check: early abort, no result on gc when fs crammed\\n\");\n            break;\n        }\n\n    }\n    while (++tries < SPIFFS_GC_MAX_RUNS && (fs->free_blocks <= 2 ||\n                                            (s32_t)len > free_pages * (s32_t)SPIFFS_DATA_PAGE_SIZE(fs)));\n\n    free_pages =\n        (SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)) * (fs->block_count - 2)\n        - fs->stats_p_allocated - fs->stats_p_deleted;\n    if ((s32_t)len > free_pages * (s32_t)SPIFFS_DATA_PAGE_SIZE(fs))\n    {\n        res = SPIFFS_ERR_FULL;\n    }\n\n    SPIFFS_GC_DBG(\"gc_check: finished, \"_SPIPRIi\" dirty, blocks \"_SPIPRIi\" free, \"_SPIPRIi\" pages free, \"_SPIPRIi\" tries, res \"_SPIPRIi\"\\n\",\n                  fs->stats_p_allocated + fs->stats_p_deleted,\n                  fs->free_blocks, free_pages, tries, res);\n\n    return res;\n}\n\n// Updates page statistics for a block that is about to be erased\ns32_t spiffs_gc_erase_page_stats(\n    spiffs *fs,\n    spiffs_block_ix bix)\n{\n    s32_t res = SPIFFS_OK;\n    int obj_lookup_page = 0;\n    int entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id));\n    spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work;\n    int cur_entry = 0;\n    u32_t dele = 0;\n    u32_t allo = 0;\n\n    // check each object lookup page\n    while (res == SPIFFS_OK && obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))\n    {\n        int entry_offset = obj_lookup_page * entries_per_page;\n        res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                         0, bix * SPIFFS_CFG_LOG_BLOCK_SZ(fs) + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n        // check each entry\n        while (res == SPIFFS_OK &&\n                cur_entry - entry_offset < entries_per_page && cur_entry < (int)(SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)))\n        {\n            spiffs_obj_id obj_id = obj_lu_buf[cur_entry - entry_offset];\n            if (obj_id == SPIFFS_OBJ_ID_FREE)\n            {\n            }\n            else if (obj_id == SPIFFS_OBJ_ID_DELETED)\n            {\n                dele++;\n            }\n            else\n            {\n                allo++;\n            }\n            cur_entry++;\n        } // per entry\n        obj_lookup_page++;\n    } // per object lookup page\n    SPIFFS_GC_DBG(\"gc_check: wipe pallo:\"_SPIPRIi\" pdele:\"_SPIPRIi\"\\n\", allo, dele);\n    fs->stats_p_allocated -= allo;\n    fs->stats_p_deleted -= dele;\n    return res;\n}\n\n// Finds block candidates to erase\ns32_t spiffs_gc_find_candidate(\n    spiffs *fs,\n    spiffs_block_ix **block_candidates,\n    int *candidate_count,\n    char fs_crammed)\n{\n    s32_t res = SPIFFS_OK;\n    u32_t blocks = fs->block_count;\n    spiffs_block_ix cur_block = 0;\n    u32_t cur_block_addr = 0;\n    spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work;\n    int cur_entry = 0;\n\n    // using fs->work area as sorted candidate memory, (spiffs_block_ix)cand_bix/(s32_t)score\n    int max_candidates = MIN(fs->block_count, (SPIFFS_CFG_LOG_PAGE_SZ(fs) - 8) / (sizeof(spiffs_block_ix) + sizeof(s32_t)));\n    *candidate_count = 0;\n    memset(fs->work, 0xff, SPIFFS_CFG_LOG_PAGE_SZ(fs));\n\n    // divide up work area into block indices and scores\n    spiffs_block_ix *cand_blocks = (spiffs_block_ix *)fs->work;\n    s32_t *cand_scores = (s32_t *)(fs->work + max_candidates * sizeof(spiffs_block_ix));\n\n    // align cand_scores on s32_t boundary\n    cand_scores = (s32_t *)(((intptr_t)cand_scores + sizeof(intptr_t) - 1) & ~(sizeof(intptr_t) - 1));\n\n    *block_candidates = cand_blocks;\n\n    int entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id));\n\n    // check each block\n    while (res == SPIFFS_OK && blocks--)\n    {\n        u16_t deleted_pages_in_block = 0;\n        u16_t used_pages_in_block = 0;\n\n        int obj_lookup_page = 0;\n        // check each object lookup page\n        while (res == SPIFFS_OK && obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))\n        {\n            int entry_offset = obj_lookup_page * entries_per_page;\n            res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                             0, cur_block_addr + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n            // check each entry\n            while (res == SPIFFS_OK &&\n                    cur_entry - entry_offset < entries_per_page &&\n                    cur_entry < (int)(SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)))\n            {\n                spiffs_obj_id obj_id = obj_lu_buf[cur_entry - entry_offset];\n                if (obj_id == SPIFFS_OBJ_ID_FREE)\n                {\n                    // when a free entry is encountered, scan logic ensures that all following entries are free also\n                    res = 1; // kill object lu loop\n                    break;\n                }\n                else  if (obj_id == SPIFFS_OBJ_ID_DELETED)\n                {\n                    deleted_pages_in_block++;\n                }\n                else\n                {\n                    used_pages_in_block++;\n                }\n                cur_entry++;\n            } // per entry\n            obj_lookup_page++;\n        } // per object lookup page\n        if (res == 1) res = SPIFFS_OK;\n\n        // calculate score and insert into candidate table\n        // stoneage sort, but probably not so many blocks\n        if (res == SPIFFS_OK /*&& deleted_pages_in_block > 0*/)\n        {\n            // read erase count\n            spiffs_obj_id erase_count;\n            res = _spiffs_rd(fs, SPIFFS_OP_C_READ | SPIFFS_OP_T_OBJ_LU2, 0,\n                             SPIFFS_ERASE_COUNT_PADDR(fs, cur_block),\n                             sizeof(spiffs_obj_id), (u8_t *)&erase_count);\n            SPIFFS_CHECK_RES(res);\n\n            spiffs_obj_id erase_age;\n            if (fs->max_erase_count > erase_count)\n            {\n                erase_age = fs->max_erase_count - erase_count;\n            }\n            else\n            {\n                erase_age = SPIFFS_OBJ_ID_FREE - (erase_count - fs->max_erase_count);\n            }\n\n            s32_t score =\n                deleted_pages_in_block * SPIFFS_GC_HEUR_W_DELET +\n                used_pages_in_block * SPIFFS_GC_HEUR_W_USED +\n                erase_age * (fs_crammed ? 0 : SPIFFS_GC_HEUR_W_ERASE_AGE);\n            int cand_ix = 0;\n            SPIFFS_GC_DBG(\"gc_check: bix:\"_SPIPRIbl\" del:\"_SPIPRIi\" use:\"_SPIPRIi\" score:\"_SPIPRIi\"\\n\", cur_block, deleted_pages_in_block, used_pages_in_block, score);\n            while (cand_ix < max_candidates)\n            {\n                if (cand_blocks[cand_ix] == (spiffs_block_ix) - 1)\n                {\n                    cand_blocks[cand_ix] = cur_block;\n                    cand_scores[cand_ix] = score;\n                    break;\n                }\n                else if (cand_scores[cand_ix] < score)\n                {\n                    int reorder_cand_ix = max_candidates - 2;\n                    while (reorder_cand_ix >= cand_ix)\n                    {\n                        cand_blocks[reorder_cand_ix + 1] = cand_blocks[reorder_cand_ix];\n                        cand_scores[reorder_cand_ix + 1] = cand_scores[reorder_cand_ix];\n                        reorder_cand_ix--;\n                    }\n                    cand_blocks[cand_ix] = cur_block;\n                    cand_scores[cand_ix] = score;\n                    break;\n                }\n                cand_ix++;\n            }\n            (*candidate_count)++;\n        }\n\n        cur_entry = 0;\n        cur_block++;\n        cur_block_addr += SPIFFS_CFG_LOG_BLOCK_SZ(fs);\n    } // per block\n\n    return res;\n}\n\ntypedef enum\n{\n    FIND_OBJ_DATA,\n    MOVE_OBJ_DATA,\n    MOVE_OBJ_IX,\n    FINISHED\n} spiffs_gc_clean_state;\n\ntypedef struct\n{\n    spiffs_gc_clean_state state;\n    spiffs_obj_id cur_obj_id;\n    spiffs_span_ix cur_objix_spix;\n    spiffs_page_ix cur_objix_pix;\n    spiffs_page_ix cur_data_pix;\n    int stored_scan_entry_index;\n    u8_t obj_id_found;\n} spiffs_gc;\n\n// Empties given block by moving all data into free pages of another block\n// Strategy:\n//   loop:\n//   scan object lookup for object data pages\n//   for first found id, check spix and load corresponding object index page to memory\n//   push object scan lookup entry index\n//     rescan object lookup, find data pages with same id and referenced by same object index\n//     move data page, update object index in memory\n//     when reached end of lookup, store updated object index\n//   pop object scan lookup entry index\n//   repeat loop until end of object lookup\n//   scan object lookup again for remaining object index pages, move to new page in other block\n//\ns32_t spiffs_gc_clean(spiffs *fs, spiffs_block_ix bix)\n{\n    s32_t res = SPIFFS_OK;\n    const int entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id));\n    // this is the global localizer being pushed and popped\n    int cur_entry = 0;\n    spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work;\n    spiffs_gc gc; // our stack frame/state\n    spiffs_page_ix cur_pix = 0;\n    spiffs_page_object_ix_header *objix_hdr = (spiffs_page_object_ix_header *)fs->work;\n    spiffs_page_object_ix *objix = (spiffs_page_object_ix *)fs->work;\n\n    SPIFFS_GC_DBG(\"gc_clean: cleaning block \"_SPIPRIbl\"\\n\", bix);\n\n    memset(&gc, 0, sizeof(spiffs_gc));\n    gc.state = FIND_OBJ_DATA;\n\n    if (fs->free_cursor_block_ix == bix)\n    {\n        // move free cursor to next block, cannot use free pages from the block we want to clean\n        fs->free_cursor_block_ix = (bix + 1) % fs->block_count;\n        fs->free_cursor_obj_lu_entry = 0;\n        SPIFFS_GC_DBG(\"gc_clean: move free cursor to block \"_SPIPRIbl\"\\n\", fs->free_cursor_block_ix);\n    }\n\n    while (res == SPIFFS_OK && gc.state != FINISHED)\n    {\n        SPIFFS_GC_DBG(\"gc_clean: state = \"_SPIPRIi\" entry:\"_SPIPRIi\"\\n\", gc.state, cur_entry);\n        gc.obj_id_found = 0; // reset (to no found data page)\n\n        // scan through lookup pages\n        int obj_lookup_page = cur_entry / entries_per_page;\n        u8_t scan = 1;\n        // check each object lookup page\n        while (scan && res == SPIFFS_OK && obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))\n        {\n            int entry_offset = obj_lookup_page * entries_per_page;\n            res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                             0, bix * SPIFFS_CFG_LOG_BLOCK_SZ(fs) + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page),\n                             SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n            // check each object lookup entry\n            while (scan && res == SPIFFS_OK &&\n                    cur_entry - entry_offset < entries_per_page && cur_entry < (int)(SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)))\n            {\n                spiffs_obj_id obj_id = obj_lu_buf[cur_entry - entry_offset];\n                cur_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, cur_entry);\n\n                // act upon object id depending on gc state\n                switch (gc.state)\n                {\n                case FIND_OBJ_DATA:\n                    // find a data page\n                    if (obj_id != SPIFFS_OBJ_ID_DELETED && obj_id != SPIFFS_OBJ_ID_FREE &&\n                            ((obj_id & SPIFFS_OBJ_ID_IX_FLAG) == 0))\n                    {\n                        // found a data page, stop scanning and handle in switch case below\n                        SPIFFS_GC_DBG(\"gc_clean: FIND_DATA state:\"_SPIPRIi\" - found obj id \"_SPIPRIid\"\\n\", gc.state, obj_id);\n                        gc.obj_id_found = 1;\n                        gc.cur_obj_id = obj_id;\n                        gc.cur_data_pix = cur_pix;\n                        scan = 0;\n                    }\n                    break;\n                case MOVE_OBJ_DATA:\n                    // evacuate found data pages for corresponding object index we have in memory,\n                    // update memory representation\n                    if (obj_id == gc.cur_obj_id)\n                    {\n                        spiffs_page_header p_hdr;\n                        res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                                         0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t *)&p_hdr);\n                        SPIFFS_CHECK_RES(res);\n                        SPIFFS_GC_DBG(\"gc_clean: MOVE_DATA found data page \"_SPIPRIid\":\"_SPIPRIsp\" @ \"_SPIPRIpg\"\\n\", gc.cur_obj_id, p_hdr.span_ix, cur_pix);\n                        if (SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, p_hdr.span_ix) != gc.cur_objix_spix)\n                        {\n                            SPIFFS_GC_DBG(\"gc_clean: MOVE_DATA no objix spix match, take in another run\\n\");\n                        }\n                        else\n                        {\n                            spiffs_page_ix new_data_pix;\n                            if (p_hdr.flags & SPIFFS_PH_FLAG_DELET)\n                            {\n                                // move page\n                                res = spiffs_page_move(fs, 0, 0, obj_id, &p_hdr, cur_pix, &new_data_pix);\n                                SPIFFS_GC_DBG(\"gc_clean: MOVE_DATA move objix \"_SPIPRIid\":\"_SPIPRIsp\" page \"_SPIPRIpg\" to \"_SPIPRIpg\"\\n\", gc.cur_obj_id, p_hdr.span_ix, cur_pix, new_data_pix);\n                                SPIFFS_CHECK_RES(res);\n                                // move wipes obj_lu, reload it\n                                res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                                                 0, bix * SPIFFS_CFG_LOG_BLOCK_SZ(fs) + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page),\n                                                 SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n                                SPIFFS_CHECK_RES(res);\n                            }\n                            else\n                            {\n                                // page is deleted but not deleted in lookup, scrap it -\n                                // might seem unnecessary as we will erase this block, but\n                                // we might get aborted\n                                SPIFFS_GC_DBG(\"gc_clean: MOVE_DATA wipe objix \"_SPIPRIid\":\"_SPIPRIsp\" page \"_SPIPRIpg\"\\n\", obj_id, p_hdr.span_ix, cur_pix);\n                                res = spiffs_page_delete(fs, cur_pix);\n                                SPIFFS_CHECK_RES(res);\n                                new_data_pix = SPIFFS_OBJ_ID_FREE;\n                            }\n                            // update memory representation of object index page with new data page\n                            if (gc.cur_objix_spix == 0)\n                            {\n                                // update object index header page\n                                ((spiffs_page_ix *)((u8_t *)objix_hdr + sizeof(spiffs_page_object_ix_header)))[p_hdr.span_ix] = new_data_pix;\n                                SPIFFS_GC_DBG(\"gc_clean: MOVE_DATA wrote page \"_SPIPRIpg\" to objix_hdr entry \"_SPIPRIsp\" in mem\\n\", new_data_pix, (spiffs_span_ix)SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.span_ix));\n                            }\n                            else\n                            {\n                                // update object index page\n                                ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.span_ix)] = new_data_pix;\n                                SPIFFS_GC_DBG(\"gc_clean: MOVE_DATA wrote page \"_SPIPRIpg\" to objix entry \"_SPIPRIsp\" in mem\\n\", new_data_pix, (spiffs_span_ix)SPIFFS_OBJ_IX_ENTRY(fs, p_hdr.span_ix));\n                            }\n                        }\n                    }\n                    break;\n                case MOVE_OBJ_IX:\n                    // find and evacuate object index pages\n                    if (obj_id != SPIFFS_OBJ_ID_DELETED && obj_id != SPIFFS_OBJ_ID_FREE &&\n                            (obj_id & SPIFFS_OBJ_ID_IX_FLAG))\n                    {\n                        // found an index object id\n                        spiffs_page_header p_hdr;\n                        spiffs_page_ix new_pix;\n                        // load header\n                        res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                                         0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t *)&p_hdr);\n                        SPIFFS_CHECK_RES(res);\n                        if (p_hdr.flags & SPIFFS_PH_FLAG_DELET)\n                        {\n                            // move page\n                            res = spiffs_page_move(fs, 0, 0, obj_id, &p_hdr, cur_pix, &new_pix);\n                            SPIFFS_GC_DBG(\"gc_clean: MOVE_OBJIX move objix \"_SPIPRIid\":\"_SPIPRIsp\" page \"_SPIPRIpg\" to \"_SPIPRIpg\"\\n\", obj_id, p_hdr.span_ix, cur_pix, new_pix);\n                            SPIFFS_CHECK_RES(res);\n                            spiffs_cb_object_event(fs, (spiffs_page_object_ix *)&p_hdr,\n                                                   SPIFFS_EV_IX_MOV, obj_id, p_hdr.span_ix, new_pix, 0);\n                            // move wipes obj_lu, reload it\n                            res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                                             0, bix * SPIFFS_CFG_LOG_BLOCK_SZ(fs) + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page),\n                                             SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n                            SPIFFS_CHECK_RES(res);\n                        }\n                        else\n                        {\n                            // page is deleted but not deleted in lookup, scrap it -\n                            // might seem unnecessary as we will erase this block, but\n                            // we might get aborted\n                            SPIFFS_GC_DBG(\"gc_clean: MOVE_OBJIX wipe objix \"_SPIPRIid\":\"_SPIPRIsp\" page \"_SPIPRIpg\"\\n\", obj_id, p_hdr.span_ix, cur_pix);\n                            res = spiffs_page_delete(fs, cur_pix);\n                            if (res == SPIFFS_OK)\n                            {\n                                spiffs_cb_object_event(fs, (spiffs_page_object_ix *)0,\n                                                       SPIFFS_EV_IX_DEL, obj_id, p_hdr.span_ix, cur_pix, 0);\n                            }\n                        }\n                        SPIFFS_CHECK_RES(res);\n                    }\n                    break;\n                default:\n                    scan = 0;\n                    break;\n                } // switch gc state\n                cur_entry++;\n            } // per entry\n            obj_lookup_page++; // no need to check scan variable here, obj_lookup_page is set in start of loop\n        } // per object lookup page\n        if (res != SPIFFS_OK) break;\n\n        // state finalization and switch\n        switch (gc.state)\n        {\n        case FIND_OBJ_DATA:\n            if (gc.obj_id_found)\n            {\n                // handle found data page -\n                // find out corresponding obj ix page and load it to memory\n                spiffs_page_header p_hdr;\n                spiffs_page_ix objix_pix;\n                gc.stored_scan_entry_index = cur_entry; // push cursor\n                cur_entry = 0; // restart scan from start\n                gc.state = MOVE_OBJ_DATA;\n                res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                                 0, SPIFFS_PAGE_TO_PADDR(fs, cur_pix), sizeof(spiffs_page_header), (u8_t *)&p_hdr);\n                SPIFFS_CHECK_RES(res);\n                gc.cur_objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, p_hdr.span_ix);\n                SPIFFS_GC_DBG(\"gc_clean: FIND_DATA find objix span_ix:\"_SPIPRIsp\"\\n\", gc.cur_objix_spix);\n                res = spiffs_obj_lu_find_id_and_span(fs, gc.cur_obj_id | SPIFFS_OBJ_ID_IX_FLAG, gc.cur_objix_spix, 0, &objix_pix);\n                if (res == SPIFFS_ERR_NOT_FOUND)\n                {\n                    // on borked systems we might get an ERR_NOT_FOUND here -\n                    // this is handled by simply deleting the page as it is not referenced\n                    // from anywhere\n                    SPIFFS_GC_DBG(\"gc_clean: FIND_OBJ_DATA objix not found! Wipe page \"_SPIPRIpg\"\\n\", gc.cur_data_pix);\n                    res = spiffs_page_delete(fs, gc.cur_data_pix);\n                    SPIFFS_CHECK_RES(res);\n                    // then we restore states and continue scanning for data pages\n                    cur_entry = gc.stored_scan_entry_index; // pop cursor\n                    gc.state = FIND_OBJ_DATA;\n                    break; // done\n                }\n                SPIFFS_CHECK_RES(res);\n                SPIFFS_GC_DBG(\"gc_clean: FIND_DATA found object index at page \"_SPIPRIpg\"\\n\", objix_pix);\n                res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                                 0, SPIFFS_PAGE_TO_PADDR(fs, objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n                SPIFFS_CHECK_RES(res);\n                // cannot allow a gc if the presumed index in fact is no index, a\n                // check must run or lot of data may be lost\n                SPIFFS_VALIDATE_OBJIX(objix->p_hdr, gc.cur_obj_id | SPIFFS_OBJ_ID_IX_FLAG, gc.cur_objix_spix);\n                gc.cur_objix_pix = objix_pix;\n            }\n            else\n            {\n                // no more data pages found, passed thru all block, start evacuating object indices\n                gc.state = MOVE_OBJ_IX;\n                cur_entry = 0; // restart entry scan index\n            }\n            break;\n        case MOVE_OBJ_DATA:\n        {\n            // store modified objix (hdr) page residing in memory now that all\n            // data pages belonging to this object index and residing in the block\n            // we want to evacuate\n            spiffs_page_ix new_objix_pix;\n            gc.state = FIND_OBJ_DATA;\n            cur_entry = gc.stored_scan_entry_index; // pop cursor\n            if (gc.cur_objix_spix == 0)\n            {\n                // store object index header page\n                res = spiffs_object_update_index_hdr(fs, 0, gc.cur_obj_id | SPIFFS_OBJ_ID_IX_FLAG, gc.cur_objix_pix, fs->work, 0, 0, 0, &new_objix_pix);\n                SPIFFS_GC_DBG(\"gc_clean: MOVE_DATA store modified objix_hdr page, \"_SPIPRIpg\":\"_SPIPRIsp\"\\n\", new_objix_pix, 0);\n                SPIFFS_CHECK_RES(res);\n            }\n            else\n            {\n                // store object index page\n                res = spiffs_page_move(fs, 0, fs->work, gc.cur_obj_id | SPIFFS_OBJ_ID_IX_FLAG, 0, gc.cur_objix_pix, &new_objix_pix);\n                SPIFFS_GC_DBG(\"gc_clean: MOVE_DATA store modified objix page, \"_SPIPRIpg\":\"_SPIPRIsp\"\\n\", new_objix_pix, objix->p_hdr.span_ix);\n                SPIFFS_CHECK_RES(res);\n                spiffs_cb_object_event(fs, (spiffs_page_object_ix *)fs->work,\n                                       SPIFFS_EV_IX_UPD, gc.cur_obj_id, objix->p_hdr.span_ix, new_objix_pix, 0);\n            }\n        }\n        break;\n        case MOVE_OBJ_IX:\n            // scanned thru all block, no more object indices found - our work here is done\n            gc.state = FINISHED;\n            break;\n        default:\n            cur_entry = 0;\n            break;\n        } // switch gc.state\n        SPIFFS_GC_DBG(\"gc_clean: state-> \"_SPIPRIi\"\\n\", gc.state);\n    } // while state != FINISHED\n\n\n    return res;\n}\n\n#endif // !SPIFFS_READ_ONLY\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/src/spiffs_hydrogen.c",
    "content": "/*\n * spiffs_hydrogen.c\n *\n *  Created on: Jun 16, 2013\n *      Author: petera\n */\n\n#include \"spiffs.h\"\n#include \"spiffs_nucleus.h\"\n\n#if SPIFFS_CACHE == 1\nstatic s32_t spiffs_fflush_cache(spiffs *fs, spiffs_file fh);\n#endif\n\n#if SPIFFS_BUFFER_HELP\nu32_t SPIFFS_buffer_bytes_for_filedescs(spiffs *fs, u32_t num_descs)\n{\n    return num_descs * sizeof(spiffs_fd);\n}\n#if SPIFFS_CACHE\nu32_t SPIFFS_buffer_bytes_for_cache(spiffs *fs, u32_t num_pages)\n{\n    return sizeof(spiffs_cache) + num_pages * (sizeof(spiffs_cache_page) + SPIFFS_CFG_LOG_PAGE_SZ(fs));\n}\n#endif\n#endif\n\nu8_t SPIFFS_mounted(spiffs *fs)\n{\n    return SPIFFS_CHECK_MOUNT(fs);\n}\n\ns32_t SPIFFS_format(spiffs *fs)\n{\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    SPIFFS_API_CHECK_CFG(fs);\n    if (SPIFFS_CHECK_MOUNT(fs))\n    {\n        fs->err_code = SPIFFS_ERR_MOUNTED;\n        return -1;\n    }\n\n    s32_t res;\n    SPIFFS_LOCK(fs);\n\n    spiffs_block_ix bix = 0;\n    while (bix < fs->block_count)\n    {\n        fs->max_erase_count = 0;\n        res = spiffs_erase_block(fs, bix);\n        if (res != SPIFFS_OK)\n        {\n            res = SPIFFS_ERR_ERASE_FAIL;\n        }\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n        bix++;\n    }\n\n    SPIFFS_UNLOCK(fs);\n\n    return 0;\n#endif // SPIFFS_READ_ONLY\n}\n\n#if SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0\n\ns32_t SPIFFS_probe_fs(spiffs_config *config)\n{\n    SPIFFS_API_DBG(\"%s\\n\", __func__);\n    s32_t res = spiffs_probe(config);\n    return res;\n}\n\n#endif // SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0\n\ns32_t SPIFFS_mount(spiffs *fs, spiffs_config *config, u8_t *work,\n                   u8_t *fd_space, u32_t fd_space_size,\n                   void *cache, u32_t cache_size,\n                   spiffs_check_callback check_cb_f)\n{\n    SPIFFS_API_DBG(\"%s \"\n                   \" sz:\"_SPIPRIi \" logpgsz:\"_SPIPRIi \" logblksz:\"_SPIPRIi \" perasz:\"_SPIPRIi\n                   \" addr:\"_SPIPRIad\n                   \" fdsz:\"_SPIPRIi \" cachesz:\"_SPIPRIi\n                   \"\\n\",\n                   __func__,\n                   SPIFFS_CFG_PHYS_SZ(fs),\n                   SPIFFS_CFG_LOG_PAGE_SZ(fs),\n                   SPIFFS_CFG_LOG_BLOCK_SZ(fs),\n                   SPIFFS_CFG_PHYS_ERASE_SZ(fs),\n                   SPIFFS_CFG_PHYS_ADDR(fs),\n                   fd_space_size, cache_size);\n    void *user_data;\n    SPIFFS_LOCK(fs);\n    user_data = fs->user_data;\n    memset(fs, 0, sizeof(spiffs));\n    _SPIFFS_MEMCPY(&fs->cfg, config, sizeof(spiffs_config));\n    fs->user_data = user_data;\n    fs->block_count = SPIFFS_CFG_PHYS_SZ(fs) / SPIFFS_CFG_LOG_BLOCK_SZ(fs);\n    fs->work = &work[0];\n    fs->lu_work = &work[SPIFFS_CFG_LOG_PAGE_SZ(fs)];\n    memset(fd_space, 0, fd_space_size);\n    // align fd_space pointer to pointer size byte boundary\n    u8_t ptr_size = sizeof(void *);\n    u8_t addr_lsb = ((u8_t)(intptr_t)fd_space) & (ptr_size - 1);\n    if (addr_lsb)\n    {\n        fd_space += (ptr_size - addr_lsb);\n        fd_space_size -= (ptr_size - addr_lsb);\n    }\n    fs->fd_space = fd_space;\n    fs->fd_count = (fd_space_size / sizeof(spiffs_fd));\n\n    // align cache pointer to 4 byte boundary\n    addr_lsb = ((u8_t)(intptr_t)cache) & (ptr_size - 1);\n    if (addr_lsb)\n    {\n        u8_t *cache_8 = (u8_t *)cache;\n        cache_8 += (ptr_size - addr_lsb);\n        cache = cache_8;\n        cache_size -= (ptr_size - addr_lsb);\n    }\n    if (cache_size & (ptr_size - 1))\n    {\n        cache_size -= (cache_size & (ptr_size - 1));\n    }\n\n#if SPIFFS_CACHE\n    fs->cache = cache;\n    fs->cache_size = (cache_size > (SPIFFS_CFG_LOG_PAGE_SZ(fs) * 32)) ? SPIFFS_CFG_LOG_PAGE_SZ(fs) * 32 : cache_size;\n    spiffs_cache_init(fs);\n#endif\n\n    s32_t res;\n\n#if SPIFFS_USE_MAGIC\n    res = SPIFFS_CHECK_MAGIC_POSSIBLE(fs) ? SPIFFS_OK : SPIFFS_ERR_MAGIC_NOT_POSSIBLE;\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n#endif\n\n    fs->config_magic = SPIFFS_CONFIG_MAGIC;\n\n    res = spiffs_obj_lu_scan(fs);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    SPIFFS_DBG(\"page index byte len:         \"_SPIPRIi\"\\n\", (u32_t)SPIFFS_CFG_LOG_PAGE_SZ(fs));\n    SPIFFS_DBG(\"object lookup pages:         \"_SPIPRIi\"\\n\", (u32_t)SPIFFS_OBJ_LOOKUP_PAGES(fs));\n    SPIFFS_DBG(\"page pages per block:        \"_SPIPRIi\"\\n\", (u32_t)SPIFFS_PAGES_PER_BLOCK(fs));\n    SPIFFS_DBG(\"page header length:          \"_SPIPRIi\"\\n\", (u32_t)sizeof(spiffs_page_header));\n    SPIFFS_DBG(\"object header index entries: \"_SPIPRIi\"\\n\", (u32_t)SPIFFS_OBJ_HDR_IX_LEN(fs));\n    SPIFFS_DBG(\"object index entries:        \"_SPIPRIi\"\\n\", (u32_t)SPIFFS_OBJ_IX_LEN(fs));\n    SPIFFS_DBG(\"available file descriptors:  \"_SPIPRIi\"\\n\", (u32_t)fs->fd_count);\n    SPIFFS_DBG(\"free blocks:                 \"_SPIPRIi\"\\n\", (u32_t)fs->free_blocks);\n\n    fs->check_cb_f = check_cb_f;\n\n    fs->mounted = 1;\n\n    SPIFFS_UNLOCK(fs);\n\n    return 0;\n}\n\nvoid SPIFFS_unmount(spiffs *fs)\n{\n    SPIFFS_API_DBG(\"%s\\n\", __func__);\n    if (!SPIFFS_CHECK_CFG(fs) || !SPIFFS_CHECK_MOUNT(fs)) return;\n    SPIFFS_LOCK(fs);\n    u32_t i;\n    spiffs_fd *fds = (spiffs_fd *)fs->fd_space;\n    for (i = 0; i < fs->fd_count; i++)\n    {\n        spiffs_fd *cur_fd = &fds[i];\n        if (cur_fd->file_nbr != 0)\n        {\n#if SPIFFS_CACHE\n            (void)spiffs_fflush_cache(fs, cur_fd->file_nbr);\n#endif\n            spiffs_fd_return(fs, cur_fd->file_nbr);\n        }\n    }\n    fs->mounted = 0;\n\n    SPIFFS_UNLOCK(fs);\n}\n\ns32_t SPIFFS_errno(spiffs *fs)\n{\n    return fs->err_code;\n}\n\nvoid SPIFFS_clearerr(spiffs *fs)\n{\n    SPIFFS_API_DBG(\"%s\\n\", __func__);\n    fs->err_code = SPIFFS_OK;\n}\n\ns32_t SPIFFS_creat(spiffs *fs, const char *path, spiffs_mode mode)\n{\n    SPIFFS_API_DBG(\"%s '%s'\\n\", __func__, path);\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    (void)path;\n    (void)mode;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    (void)mode;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    if (strlen(path) > SPIFFS_OBJ_NAME_LEN - 1)\n    {\n        SPIFFS_API_CHECK_RES(fs, SPIFFS_ERR_NAME_TOO_LONG);\n    }\n    SPIFFS_LOCK(fs);\n    spiffs_obj_id obj_id;\n    s32_t res;\n\n    res = spiffs_obj_lu_find_free_obj_id(fs, &obj_id, (const u8_t *)path);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    res = spiffs_object_create(fs, obj_id, (const u8_t *)path, 0, SPIFFS_TYPE_FILE, 0);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    SPIFFS_UNLOCK(fs);\n    return 0;\n#endif // SPIFFS_READ_ONLY\n}\n\nspiffs_file SPIFFS_open(spiffs *fs, const char *path, spiffs_flags flags, spiffs_mode mode)\n{\n    SPIFFS_API_DBG(\"%s '%s' \"_SPIPRIfl \"\\n\", __func__, path, flags);\n    (void)mode;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    if (strlen(path) > SPIFFS_OBJ_NAME_LEN - 1)\n    {\n        SPIFFS_API_CHECK_RES(fs, SPIFFS_ERR_NAME_TOO_LONG);\n    }\n    SPIFFS_LOCK(fs);\n\n    spiffs_fd *fd;\n    spiffs_page_ix pix;\n\n#if SPIFFS_READ_ONLY\n    // not valid flags in read only mode\n    flags &= ~(SPIFFS_WRONLY | SPIFFS_CREAT | SPIFFS_TRUNC);\n#endif // SPIFFS_READ_ONLY\n\n    s32_t res = spiffs_fd_find_new(fs, &fd, path);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t *)path, &pix);\n    if ((flags & SPIFFS_O_CREAT) == 0)\n    {\n        if (res < SPIFFS_OK)\n        {\n            spiffs_fd_return(fs, fd->file_nbr);\n        }\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n\n    if (res == SPIFFS_OK &&\n            (flags & (SPIFFS_O_CREAT | SPIFFS_O_EXCL)) == (SPIFFS_O_CREAT | SPIFFS_O_EXCL))\n    {\n        // creat and excl and file exists - fail\n        res = SPIFFS_ERR_FILE_EXISTS;\n        spiffs_fd_return(fs, fd->file_nbr);\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n\n    if ((flags & SPIFFS_O_CREAT) && res == SPIFFS_ERR_NOT_FOUND)\n    {\n#if !SPIFFS_READ_ONLY\n        spiffs_obj_id obj_id;\n        // no need to enter conflicting name here, already looked for it above\n        res = spiffs_obj_lu_find_free_obj_id(fs, &obj_id, 0);\n        if (res < SPIFFS_OK)\n        {\n            spiffs_fd_return(fs, fd->file_nbr);\n        }\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n        res = spiffs_object_create(fs, obj_id, (const u8_t *)path, 0, SPIFFS_TYPE_FILE, &pix);\n        if (res < SPIFFS_OK)\n        {\n            spiffs_fd_return(fs, fd->file_nbr);\n        }\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n        flags &= ~SPIFFS_O_TRUNC;\n#endif // !SPIFFS_READ_ONLY\n    }\n    else\n    {\n        if (res < SPIFFS_OK)\n        {\n            spiffs_fd_return(fs, fd->file_nbr);\n        }\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n    res = spiffs_object_open_by_page(fs, pix, fd, flags, mode);\n    if (res < SPIFFS_OK)\n    {\n        spiffs_fd_return(fs, fd->file_nbr);\n    }\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n#if !SPIFFS_READ_ONLY\n    if (flags & SPIFFS_O_TRUNC)\n    {\n        res = spiffs_object_truncate(fd, 0, 0);\n        if (res < SPIFFS_OK)\n        {\n            spiffs_fd_return(fs, fd->file_nbr);\n        }\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n#endif // !SPIFFS_READ_ONLY\n\n    fd->fdoffset = 0;\n\n    SPIFFS_UNLOCK(fs);\n\n    return SPIFFS_FH_OFFS(fs, fd->file_nbr);\n}\n\nspiffs_file SPIFFS_open_by_dirent(spiffs *fs, struct spiffs_dirent *e, spiffs_flags flags, spiffs_mode mode)\n{\n    SPIFFS_API_DBG(\"%s '%s':\"_SPIPRIid \" \"_SPIPRIfl \"\\n\", __func__, e->name, e->obj_id, flags);\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    spiffs_fd *fd;\n\n    s32_t res = spiffs_fd_find_new(fs, &fd, 0);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_object_open_by_page(fs, e->pix, fd, flags, mode);\n    if (res < SPIFFS_OK)\n    {\n        spiffs_fd_return(fs, fd->file_nbr);\n    }\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n#if !SPIFFS_READ_ONLY\n    if (flags & SPIFFS_O_TRUNC)\n    {\n        res = spiffs_object_truncate(fd, 0, 0);\n        if (res < SPIFFS_OK)\n        {\n            spiffs_fd_return(fs, fd->file_nbr);\n        }\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n#endif // !SPIFFS_READ_ONLY\n\n    fd->fdoffset = 0;\n\n    SPIFFS_UNLOCK(fs);\n\n    return SPIFFS_FH_OFFS(fs, fd->file_nbr);\n}\n\nspiffs_file SPIFFS_open_by_page(spiffs *fs, spiffs_page_ix page_ix, spiffs_flags flags, spiffs_mode mode)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIpg \" \"_SPIPRIfl \"\\n\", __func__, page_ix, flags);\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    spiffs_fd *fd;\n\n    s32_t res = spiffs_fd_find_new(fs, &fd, 0);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    if (SPIFFS_IS_LOOKUP_PAGE(fs, page_ix))\n    {\n        res = SPIFFS_ERR_NOT_A_FILE;\n        spiffs_fd_return(fs, fd->file_nbr);\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n\n    res = spiffs_object_open_by_page(fs, page_ix, fd, flags, mode);\n    if (res == SPIFFS_ERR_IS_FREE ||\n            res == SPIFFS_ERR_DELETED ||\n            res == SPIFFS_ERR_NOT_FINALIZED ||\n            res == SPIFFS_ERR_NOT_INDEX ||\n            res == SPIFFS_ERR_INDEX_SPAN_MISMATCH)\n    {\n        res = SPIFFS_ERR_NOT_A_FILE;\n    }\n    if (res < SPIFFS_OK)\n    {\n        spiffs_fd_return(fs, fd->file_nbr);\n    }\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n#if !SPIFFS_READ_ONLY\n    if (flags & SPIFFS_O_TRUNC)\n    {\n        res = spiffs_object_truncate(fd, 0, 0);\n        if (res < SPIFFS_OK)\n        {\n            spiffs_fd_return(fs, fd->file_nbr);\n        }\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n#endif // !SPIFFS_READ_ONLY\n\n    fd->fdoffset = 0;\n\n    SPIFFS_UNLOCK(fs);\n\n    return SPIFFS_FH_OFFS(fs, fd->file_nbr);\n}\n\nstatic s32_t spiffs_hydro_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len)\n{\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    spiffs_fd *fd;\n    s32_t res;\n\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    if ((fd->flags & SPIFFS_O_RDONLY) == 0)\n    {\n        res = SPIFFS_ERR_NOT_READABLE;\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n\n    if (fd->size == SPIFFS_UNDEFINED_LEN && len > 0)\n    {\n        // special case for zero sized files\n        res = SPIFFS_ERR_END_OF_OBJECT;\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n\n#if SPIFFS_CACHE_WR\n    spiffs_fflush_cache(fs, fh);\n#endif\n\n    if (fd->fdoffset + len >= fd->size)\n    {\n        // reading beyond file size\n        s32_t avail = fd->size - fd->fdoffset;\n        if (avail <= 0)\n        {\n            SPIFFS_API_CHECK_RES_UNLOCK(fs, SPIFFS_ERR_END_OF_OBJECT);\n        }\n        res = spiffs_object_read(fd, fd->fdoffset, avail, (u8_t *)buf);\n        if (res == SPIFFS_ERR_END_OF_OBJECT)\n        {\n            fd->fdoffset += avail;\n            SPIFFS_UNLOCK(fs);\n            return avail;\n        }\n        else\n        {\n            SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n            len = avail;\n        }\n    }\n    else\n    {\n        // reading within file size\n        res = spiffs_object_read(fd, fd->fdoffset, len, (u8_t *)buf);\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n    fd->fdoffset += len;\n\n    SPIFFS_UNLOCK(fs);\n\n    return len;\n}\n\ns32_t SPIFFS_read(spiffs *fs, spiffs_file fh, void *buf, s32_t len)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \" \"_SPIPRIi \"\\n\", __func__, fh, len);\n    s32_t res = spiffs_hydro_read(fs, fh, buf, len);\n    if (res == SPIFFS_ERR_END_OF_OBJECT)\n    {\n        res = 0;\n    }\n    return res;\n}\n\n\n#if !SPIFFS_READ_ONLY\nstatic s32_t spiffs_hydro_write(spiffs *fs, spiffs_fd *fd, void *buf, u32_t offset, s32_t len)\n{\n    (void)fs;\n    s32_t res = SPIFFS_OK;\n    s32_t remaining = len;\n    if (fd->size != SPIFFS_UNDEFINED_LEN && offset < fd->size)\n    {\n        s32_t m_len = MIN((s32_t)(fd->size - offset), len);\n        res = spiffs_object_modify(fd, offset, (u8_t *)buf, m_len);\n        SPIFFS_CHECK_RES(res);\n        remaining -= m_len;\n        u8_t *buf_8 = (u8_t *)buf;\n        buf_8 += m_len;\n        buf = buf_8;\n        offset += m_len;\n    }\n    if (remaining > 0)\n    {\n        res = spiffs_object_append(fd, offset, (u8_t *)buf, remaining);\n        SPIFFS_CHECK_RES(res);\n    }\n    return len;\n\n}\n#endif // !SPIFFS_READ_ONLY\n\ns32_t SPIFFS_write(spiffs *fs, spiffs_file fh, void *buf, s32_t len)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \" \"_SPIPRIi \"\\n\", __func__, fh, len);\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    (void)fh;\n    (void)buf;\n    (void)len;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    spiffs_fd *fd;\n    s32_t res;\n    u32_t offset;\n\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    if ((fd->flags & SPIFFS_O_WRONLY) == 0)\n    {\n        res = SPIFFS_ERR_NOT_WRITABLE;\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n\n    if ((fd->flags & SPIFFS_O_APPEND))\n    {\n        fd->fdoffset = fd->size == SPIFFS_UNDEFINED_LEN ? 0 : fd->size;\n    }\n    offset = fd->fdoffset;\n\n#if SPIFFS_CACHE_WR\n    if (fd->cache_page == 0)\n    {\n        // see if object id is associated with cache already\n        fd->cache_page = spiffs_cache_page_get_by_fd(fs, fd);\n    }\n#endif\n    if (fd->flags & SPIFFS_O_APPEND)\n    {\n        if (fd->size == SPIFFS_UNDEFINED_LEN)\n        {\n            offset = 0;\n        }\n        else\n        {\n            offset = fd->size;\n        }\n#if SPIFFS_CACHE_WR\n        if (fd->cache_page)\n        {\n            offset = MAX(offset, fd->cache_page->offset + fd->cache_page->size);\n        }\n#endif\n    }\n\n#if SPIFFS_CACHE_WR\n    if ((fd->flags & SPIFFS_O_DIRECT) == 0)\n    {\n        if (len < (s32_t)SPIFFS_CFG_LOG_PAGE_SZ(fs))\n        {\n            // small write, try to cache it\n            u8_t alloc_cpage = 1;\n            if (fd->cache_page)\n            {\n                // have a cached page for this fd already, check cache page boundaries\n                if (offset < fd->cache_page->offset || // writing before cache\n                        offset > fd->cache_page->offset + fd->cache_page->size || // writing after cache\n                        offset + len > fd->cache_page->offset + SPIFFS_CFG_LOG_PAGE_SZ(fs)) // writing beyond cache page\n                {\n                    // boundary violation, write back cache first and allocate new\n                    SPIFFS_CACHE_DBG(\"CACHE_WR_DUMP: dumping cache page \"_SPIPRIi\" for fd \"_SPIPRIfd\":\"_SPIPRIid\", boundary viol, offs:\"_SPIPRIi\" size:\"_SPIPRIi\"\\n\",\n                                     fd->cache_page->ix, fd->file_nbr, fd->obj_id, fd->cache_page->offset, fd->cache_page->size);\n                    res = spiffs_hydro_write(fs, fd,\n                                             spiffs_get_cache_page(fs, spiffs_get_cache(fs), fd->cache_page->ix),\n                                             fd->cache_page->offset, fd->cache_page->size);\n                    spiffs_cache_fd_release(fs, fd->cache_page);\n                    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n                }\n                else\n                {\n                    // writing within cache\n                    alloc_cpage = 0;\n                }\n            }\n\n            if (alloc_cpage)\n            {\n                fd->cache_page = spiffs_cache_page_allocate_by_fd(fs, fd);\n                if (fd->cache_page)\n                {\n                    fd->cache_page->offset = offset;\n                    fd->cache_page->size = 0;\n                    SPIFFS_CACHE_DBG(\"CACHE_WR_ALLO: allocating cache page \"_SPIPRIi\" for fd \"_SPIPRIfd\":\"_SPIPRIid\"\\n\",\n                                     fd->cache_page->ix, fd->file_nbr, fd->obj_id);\n                }\n            }\n\n            if (fd->cache_page)\n            {\n                u32_t offset_in_cpage = offset - fd->cache_page->offset;\n                SPIFFS_CACHE_DBG(\"CACHE_WR_WRITE: storing to cache page \"_SPIPRIi\" for fd \"_SPIPRIfd\":\"_SPIPRIid\", offs \"_SPIPRIi\":\"_SPIPRIi\" len \"_SPIPRIi\"\\n\",\n                                 fd->cache_page->ix, fd->file_nbr, fd->obj_id,\n                                 offset, offset_in_cpage, len);\n                spiffs_cache *cache = spiffs_get_cache(fs);\n                u8_t *cpage_data = spiffs_get_cache_page(fs, cache, fd->cache_page->ix);\n#ifdef _SPIFFS_TEST\n                {\n                    intptr_t __a1 = (u8_t *)&cpage_data[offset_in_cpage] - (u8_t *)cache;\n                    intptr_t __a2 = (u8_t *)&cpage_data[offset_in_cpage] + len - (u8_t *)cache;\n                    intptr_t __b = sizeof(spiffs_cache) + cache->cpage_count * (sizeof(spiffs_cache_page) + SPIFFS_CFG_LOG_PAGE_SZ(fs));\n                    if (__a1 > __b || __a2 > __b)\n                    {\n                        printf(\"FATAL OOB: CACHE_WR: memcpy to cache buffer ixs:%4ld..%4ld of %4ld\\n\", __a1, __a2, __b);\n                        ERREXIT();\n                    }\n                }\n#endif\n                _SPIFFS_MEMCPY(&cpage_data[offset_in_cpage], buf, len);\n                fd->cache_page->size = MAX(fd->cache_page->size, offset_in_cpage + len);\n                fd->fdoffset += len;\n                SPIFFS_UNLOCK(fs);\n                return len;\n            }\n            else\n            {\n                res = spiffs_hydro_write(fs, fd, buf, offset, len);\n                SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n                fd->fdoffset += len;\n                SPIFFS_UNLOCK(fs);\n                return res;\n            }\n        }\n        else\n        {\n            // big write, no need to cache it - but first check if there is a cached write already\n            if (fd->cache_page)\n            {\n                // write back cache first\n                SPIFFS_CACHE_DBG(\"CACHE_WR_DUMP: dumping cache page \"_SPIPRIi\" for fd \"_SPIPRIfd\":\"_SPIPRIid\", big write, offs:\"_SPIPRIi\" size:\"_SPIPRIi\"\\n\",\n                                 fd->cache_page->ix, fd->file_nbr, fd->obj_id, fd->cache_page->offset, fd->cache_page->size);\n                res = spiffs_hydro_write(fs, fd,\n                                         spiffs_get_cache_page(fs, spiffs_get_cache(fs), fd->cache_page->ix),\n                                         fd->cache_page->offset, fd->cache_page->size);\n                spiffs_cache_fd_release(fs, fd->cache_page);\n                SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n                // data written below\n            }\n        }\n    }\n#endif\n\n    res = spiffs_hydro_write(fs, fd, buf, offset, len);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    fd->fdoffset += len;\n\n    SPIFFS_UNLOCK(fs);\n\n    return res;\n#endif // SPIFFS_READ_ONLY\n}\n\ns32_t SPIFFS_lseek(spiffs *fs, spiffs_file fh, s32_t offs, int whence)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \" \"_SPIPRIi \" %s\\n\", __func__, fh, offs, (const char *[])\n    {\"SET\", \"CUR\", \"END\", \"???\"\n    }[MIN(whence, 3)]);\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    spiffs_fd *fd;\n    s32_t res;\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n#if SPIFFS_CACHE_WR\n    spiffs_fflush_cache(fs, fh);\n#endif\n\n    s32_t file_size = fd->size == SPIFFS_UNDEFINED_LEN ? 0 : fd->size;\n\n    switch (whence)\n    {\n    case SPIFFS_SEEK_SET:\n        break;\n    case SPIFFS_SEEK_CUR:\n        offs = fd->fdoffset + offs;\n        break;\n    case SPIFFS_SEEK_END:\n        offs = file_size + offs;\n        break;\n    default:\n        res = SPIFFS_ERR_INVALID_PARA;\n        break;\n    }\n    if (offs < 0)\n    {\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, SPIFFS_ERR_INVALID_PARA);\n    }\n    if (offs > file_size)\n    {\n        fd->fdoffset = file_size;\n        res = SPIFFS_ERR_SEEK_BOUNDS;\n    }\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    spiffs_span_ix data_spix = (offs > 0 ? (offs - 1) : 0) / SPIFFS_DATA_PAGE_SIZE(fs);\n    spiffs_span_ix objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix);\n    if (fd->cursor_objix_spix != objix_spix)\n    {\n        spiffs_page_ix pix;\n        res = spiffs_obj_lu_find_id_and_span(\n                  fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, objix_spix, 0, &pix);\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n        fd->cursor_objix_spix = objix_spix;\n        fd->cursor_objix_pix = pix;\n    }\n    fd->fdoffset = offs;\n\n    SPIFFS_UNLOCK(fs);\n\n    return offs;\n}\n\ns32_t SPIFFS_remove(spiffs *fs, const char *path)\n{\n    SPIFFS_API_DBG(\"%s '%s'\\n\", __func__, path);\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    (void)path;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    if (strlen(path) > SPIFFS_OBJ_NAME_LEN - 1)\n    {\n        SPIFFS_API_CHECK_RES(fs, SPIFFS_ERR_NAME_TOO_LONG);\n    }\n    SPIFFS_LOCK(fs);\n\n    spiffs_fd *fd;\n    spiffs_page_ix pix;\n    s32_t res;\n\n    res = spiffs_fd_find_new(fs, &fd, 0);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t *)path, &pix);\n    if (res != SPIFFS_OK)\n    {\n        spiffs_fd_return(fs, fd->file_nbr);\n    }\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_object_open_by_page(fs, pix, fd, 0, 0);\n    if (res != SPIFFS_OK)\n    {\n        spiffs_fd_return(fs, fd->file_nbr);\n    }\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_object_truncate(fd, 0, 1);\n    if (res != SPIFFS_OK)\n    {\n        spiffs_fd_return(fs, fd->file_nbr);\n    }\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    SPIFFS_UNLOCK(fs);\n    return 0;\n#endif // SPIFFS_READ_ONLY\n}\n\ns32_t SPIFFS_fremove(spiffs *fs, spiffs_file fh)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \"\\n\", __func__, fh);\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    (void)fh;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    spiffs_fd *fd;\n    s32_t res;\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    if ((fd->flags & SPIFFS_O_WRONLY) == 0)\n    {\n        res = SPIFFS_ERR_NOT_WRITABLE;\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n\n#if SPIFFS_CACHE_WR\n    spiffs_cache_fd_release(fs, fd->cache_page);\n#endif\n\n    res = spiffs_object_truncate(fd, 0, 1);\n\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    SPIFFS_UNLOCK(fs);\n\n    return 0;\n#endif // SPIFFS_READ_ONLY\n}\n\nstatic s32_t spiffs_stat_pix(spiffs *fs, spiffs_page_ix pix, spiffs_file fh, spiffs_stat *s)\n{\n    (void)fh;\n    spiffs_page_object_ix_header objix_hdr;\n    spiffs_obj_id obj_id;\n    s32_t res = _spiffs_rd(fs,  SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ, fh,\n                           SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix_header), (u8_t *)&objix_hdr);\n    SPIFFS_API_CHECK_RES(fs, res);\n\n    u32_t obj_id_addr = SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs , pix)) +\n                        SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, pix) * sizeof(spiffs_obj_id);\n    res = _spiffs_rd(fs,  SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ, fh,\n                     obj_id_addr, sizeof(spiffs_obj_id), (u8_t *)&obj_id);\n    SPIFFS_API_CHECK_RES(fs, res);\n\n    s->obj_id = obj_id & ~SPIFFS_OBJ_ID_IX_FLAG;\n    s->type = objix_hdr.type;\n    s->size = objix_hdr.size == SPIFFS_UNDEFINED_LEN ? 0 : objix_hdr.size;\n    s->pix = pix;\n    strncpy((char *)s->name, (char *)objix_hdr.name, SPIFFS_OBJ_NAME_LEN);\n#if SPIFFS_OBJ_META_LEN\n    _SPIFFS_MEMCPY(s->meta, objix_hdr.meta, SPIFFS_OBJ_META_LEN);\n#endif\n\n    return res;\n}\n\ns32_t SPIFFS_stat(spiffs *fs, const char *path, spiffs_stat *s)\n{\n    SPIFFS_API_DBG(\"%s '%s'\\n\", __func__, path);\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    if (strlen(path) > SPIFFS_OBJ_NAME_LEN - 1)\n    {\n        SPIFFS_API_CHECK_RES(fs, SPIFFS_ERR_NAME_TOO_LONG);\n    }\n    SPIFFS_LOCK(fs);\n\n    s32_t res;\n    spiffs_page_ix pix;\n\n    res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t *)path, &pix);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_stat_pix(fs, pix, 0, s);\n\n    SPIFFS_UNLOCK(fs);\n\n    return res;\n}\n\ns32_t SPIFFS_fstat(spiffs *fs, spiffs_file fh, spiffs_stat *s)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \"\\n\", __func__, fh);\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    spiffs_fd *fd;\n    s32_t res;\n\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n#if SPIFFS_CACHE_WR\n    spiffs_fflush_cache(fs, fh);\n#endif\n\n    res = spiffs_stat_pix(fs, fd->objix_hdr_pix, fh, s);\n\n    SPIFFS_UNLOCK(fs);\n\n    return res;\n}\n\n// Checks if there are any cached writes for the object id associated with\n// given filehandle. If so, these writes are flushed.\n#if SPIFFS_CACHE == 1\nstatic s32_t spiffs_fflush_cache(spiffs *fs, spiffs_file fh)\n{\n    (void)fs;\n    (void)fh;\n    s32_t res = SPIFFS_OK;\n#if !SPIFFS_READ_ONLY && SPIFFS_CACHE_WR\n\n    spiffs_fd *fd;\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES(fs, res);\n\n    if ((fd->flags & SPIFFS_O_DIRECT) == 0)\n    {\n        if (fd->cache_page == 0)\n        {\n            // see if object id is associated with cache already\n            fd->cache_page = spiffs_cache_page_get_by_fd(fs, fd);\n        }\n        if (fd->cache_page)\n        {\n            SPIFFS_CACHE_DBG(\"CACHE_WR_DUMP: dumping cache page \"_SPIPRIi\" for fd \"_SPIPRIfd\":\"_SPIPRIid\", flush, offs:\"_SPIPRIi\" size:\"_SPIPRIi\"\\n\",\n                             fd->cache_page->ix, fd->file_nbr,  fd->obj_id, fd->cache_page->offset, fd->cache_page->size);\n            res = spiffs_hydro_write(fs, fd,\n                                     spiffs_get_cache_page(fs, spiffs_get_cache(fs), fd->cache_page->ix),\n                                     fd->cache_page->offset, fd->cache_page->size);\n            if (res < SPIFFS_OK)\n            {\n                fs->err_code = res;\n            }\n            spiffs_cache_fd_release(fs, fd->cache_page);\n        }\n    }\n#endif\n\n    return res;\n}\n#endif\n\ns32_t SPIFFS_fflush(spiffs *fs, spiffs_file fh)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \"\\n\", __func__, fh);\n    (void)fh;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    s32_t res = SPIFFS_OK;\n#if !SPIFFS_READ_ONLY && SPIFFS_CACHE_WR\n    SPIFFS_LOCK(fs);\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n    res = spiffs_fflush_cache(fs, fh);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    SPIFFS_UNLOCK(fs);\n#endif\n\n    return res;\n}\n\ns32_t SPIFFS_close(spiffs *fs, spiffs_file fh)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \"\\n\", __func__, fh);\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n\n    s32_t res = SPIFFS_OK;\n    SPIFFS_LOCK(fs);\n\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n#if SPIFFS_CACHE\n    res = spiffs_fflush_cache(fs, fh);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n#endif\n    res = spiffs_fd_return(fs, fh);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    SPIFFS_UNLOCK(fs);\n\n    return res;\n}\n\ns32_t SPIFFS_rename(spiffs *fs, const char *old_path, const char *new_path)\n{\n    SPIFFS_API_DBG(\"%s %s %s\\n\", __func__, old_path, new_path);\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    (void)old_path;\n    (void)new_path;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    if (strlen(new_path) > SPIFFS_OBJ_NAME_LEN - 1 ||\n            strlen(old_path) > SPIFFS_OBJ_NAME_LEN - 1)\n    {\n        SPIFFS_API_CHECK_RES(fs, SPIFFS_ERR_NAME_TOO_LONG);\n    }\n    SPIFFS_LOCK(fs);\n\n    spiffs_page_ix pix_old, pix_dummy;\n    spiffs_fd *fd;\n\n    s32_t res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t *)old_path, &pix_old);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t *)new_path, &pix_dummy);\n    if (res == SPIFFS_ERR_NOT_FOUND)\n    {\n        res = SPIFFS_OK;\n    }\n    else if (res == SPIFFS_OK)\n    {\n        res = SPIFFS_ERR_CONFLICTING_NAME;\n    }\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_fd_find_new(fs, &fd, 0);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_object_open_by_page(fs, pix_old, fd, 0, 0);\n    if (res != SPIFFS_OK)\n    {\n        spiffs_fd_return(fs, fd->file_nbr);\n    }\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, fd->objix_hdr_pix, 0, (const u8_t *)new_path,\n                                         0, 0, &pix_dummy);\n#if SPIFFS_TEMPORAL_FD_CACHE\n    if (res == SPIFFS_OK)\n    {\n        spiffs_fd_temporal_cache_rehash(fs, old_path, new_path);\n    }\n#endif\n\n    spiffs_fd_return(fs, fd->file_nbr);\n\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    SPIFFS_UNLOCK(fs);\n\n    return res;\n#endif // SPIFFS_READ_ONLY\n}\n\n#if SPIFFS_OBJ_META_LEN\ns32_t SPIFFS_update_meta(spiffs *fs, const char *name, const void *meta)\n{\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    (void)name;\n    (void)meta;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    spiffs_page_ix pix, pix_dummy;\n    spiffs_fd *fd;\n\n    s32_t res = spiffs_object_find_object_index_header_by_name(fs, (const u8_t *)name, &pix);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_fd_find_new(fs, &fd, 0);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_object_open_by_page(fs, pix, fd, 0, 0);\n    if (res != SPIFFS_OK)\n    {\n        spiffs_fd_return(fs, fd->file_nbr);\n    }\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, fd->objix_hdr_pix, 0, 0, meta,\n                                         0, &pix_dummy);\n\n    spiffs_fd_return(fs, fd->file_nbr);\n\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    SPIFFS_UNLOCK(fs);\n\n    return res;\n#endif // SPIFFS_READ_ONLY\n}\n\ns32_t SPIFFS_fupdate_meta(spiffs *fs, spiffs_file fh, const void *meta)\n{\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    (void)fh;\n    (void)meta;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    s32_t res;\n    spiffs_fd *fd;\n    spiffs_page_ix pix_dummy;\n\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    if ((fd->flags & SPIFFS_O_WRONLY) == 0)\n    {\n        res = SPIFFS_ERR_NOT_WRITABLE;\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    }\n\n    res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id, fd->objix_hdr_pix, 0, 0, meta,\n                                         0, &pix_dummy);\n\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    SPIFFS_UNLOCK(fs);\n\n    return res;\n#endif // SPIFFS_READ_ONLY\n}\n#endif // SPIFFS_OBJ_META_LEN\n\nspiffs_DIR *SPIFFS_opendir(spiffs *fs, const char *name, spiffs_DIR *d)\n{\n    SPIFFS_API_DBG(\"%s\\n\", __func__);\n    (void)name;\n\n    if (!SPIFFS_CHECK_CFG((fs)))\n    {\n        (fs)->err_code = SPIFFS_ERR_NOT_CONFIGURED;\n        return 0;\n    }\n\n    if (!SPIFFS_CHECK_MOUNT(fs))\n    {\n        fs->err_code = SPIFFS_ERR_NOT_MOUNTED;\n        return 0;\n    }\n\n    d->fs = fs;\n    d->block = 0;\n    d->entry = 0;\n    return d;\n}\n\nstatic s32_t spiffs_read_dir_v(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_block_ix bix,\n    int ix_entry,\n    const void *user_const_p,\n    void *user_var_p)\n{\n    (void)user_const_p;\n    s32_t res;\n    spiffs_page_object_ix_header objix_hdr;\n    if (obj_id == SPIFFS_OBJ_ID_FREE || obj_id == SPIFFS_OBJ_ID_DELETED ||\n            (obj_id & SPIFFS_OBJ_ID_IX_FLAG) == 0)\n    {\n        return SPIFFS_VIS_COUNTINUE;\n    }\n\n    spiffs_page_ix pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, ix_entry);\n    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                     0, SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix_header), (u8_t *)&objix_hdr);\n    if (res != SPIFFS_OK) return res;\n    if ((obj_id & SPIFFS_OBJ_ID_IX_FLAG) &&\n            objix_hdr.p_hdr.span_ix == 0 &&\n            (objix_hdr.p_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) ==\n            (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE))\n    {\n        struct spiffs_dirent *e = (struct spiffs_dirent *)user_var_p;\n        e->obj_id = obj_id;\n        strcpy((char *)e->name, (char *)objix_hdr.name);\n        e->type = objix_hdr.type;\n        e->size = objix_hdr.size == SPIFFS_UNDEFINED_LEN ? 0 : objix_hdr.size;\n        e->pix = pix;\n#if SPIFFS_OBJ_META_LEN\n        _SPIFFS_MEMCPY(e->meta, objix_hdr.meta, SPIFFS_OBJ_META_LEN);\n#endif\n        return SPIFFS_OK;\n    }\n    return SPIFFS_VIS_COUNTINUE;\n}\n\nstruct spiffs_dirent *SPIFFS_readdir(spiffs_DIR *d, struct spiffs_dirent *e)\n{\n    SPIFFS_API_DBG(\"%s\\n\", __func__);\n    if (!SPIFFS_CHECK_MOUNT(d->fs))\n    {\n        d->fs->err_code = SPIFFS_ERR_NOT_MOUNTED;\n        return 0;\n    }\n    SPIFFS_LOCK(d->fs);\n\n    spiffs_block_ix bix;\n    int entry;\n    s32_t res;\n    struct spiffs_dirent *ret = 0;\n\n    res = spiffs_obj_lu_find_entry_visitor(d->fs,\n                                           d->block,\n                                           d->entry,\n                                           SPIFFS_VIS_NO_WRAP,\n                                           0,\n                                           spiffs_read_dir_v,\n                                           0,\n                                           e,\n                                           &bix,\n                                           &entry);\n    if (res == SPIFFS_OK)\n    {\n        d->block = bix;\n        d->entry = entry + 1;\n        e->obj_id &= ~SPIFFS_OBJ_ID_IX_FLAG;\n        ret = e;\n    }\n    else\n    {\n        d->fs->err_code = res;\n    }\n    SPIFFS_UNLOCK(d->fs);\n    return ret;\n}\n\ns32_t SPIFFS_closedir(spiffs_DIR *d)\n{\n    SPIFFS_API_DBG(\"%s\\n\", __func__);\n    SPIFFS_API_CHECK_CFG(d->fs);\n    SPIFFS_API_CHECK_MOUNT(d->fs);\n    return 0;\n}\n\ns32_t SPIFFS_check(spiffs *fs)\n{\n    SPIFFS_API_DBG(\"%s\\n\", __func__);\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    s32_t res;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    res = spiffs_lookup_consistency_check(fs, 0);\n\n    res = spiffs_object_index_consistency_check(fs);\n\n    res = spiffs_page_consistency_check(fs);\n\n    res = spiffs_obj_lu_scan(fs);\n\n    SPIFFS_UNLOCK(fs);\n    return res;\n#endif // SPIFFS_READ_ONLY\n}\n\ns32_t SPIFFS_info(spiffs *fs, u32_t *total, u32_t *used)\n{\n    SPIFFS_API_DBG(\"%s\\n\", __func__);\n    s32_t res = SPIFFS_OK;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    u32_t pages_per_block = SPIFFS_PAGES_PER_BLOCK(fs);\n    u32_t blocks = fs->block_count;\n    u32_t obj_lu_pages = SPIFFS_OBJ_LOOKUP_PAGES(fs);\n    u32_t data_page_size = SPIFFS_DATA_PAGE_SIZE(fs);\n    u32_t total_data_pages = (blocks - 2) * (pages_per_block - obj_lu_pages) + 1; // -2 for spare blocks, +1 for emergency page\n\n    if (total)\n    {\n        *total = total_data_pages * data_page_size;\n    }\n\n    if (used)\n    {\n        *used = fs->stats_p_allocated * data_page_size;\n    }\n\n    SPIFFS_UNLOCK(fs);\n    return res;\n}\n\ns32_t SPIFFS_gc_quick(spiffs *fs, u16_t max_free_pages)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIi \"\\n\", __func__, max_free_pages);\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    (void)max_free_pages;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    s32_t res;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    res = spiffs_gc_quick(fs, max_free_pages);\n\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    SPIFFS_UNLOCK(fs);\n    return 0;\n#endif // SPIFFS_READ_ONLY\n}\n\n\ns32_t SPIFFS_gc(spiffs *fs, u32_t size)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIi \"\\n\", __func__, size);\n#if SPIFFS_READ_ONLY\n    (void)fs;\n    (void)size;\n    return SPIFFS_ERR_RO_NOT_IMPL;\n#else\n    s32_t res;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    res = spiffs_gc_check(fs, size);\n\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n    SPIFFS_UNLOCK(fs);\n    return 0;\n#endif // SPIFFS_READ_ONLY\n}\n\ns32_t SPIFFS_eof(spiffs *fs, spiffs_file fh)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \"\\n\", __func__, fh);\n    s32_t res;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n\n    spiffs_fd *fd;\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n#if SPIFFS_CACHE_WR\n    res = spiffs_fflush_cache(fs, fh);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n#endif\n\n    res = (fd->fdoffset >= (fd->size == SPIFFS_UNDEFINED_LEN ? 0 : fd->size));\n\n    SPIFFS_UNLOCK(fs);\n    return res;\n}\n\ns32_t SPIFFS_tell(spiffs *fs, spiffs_file fh)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \"\\n\", __func__, fh);\n    s32_t res;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n\n    spiffs_fd *fd;\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n#if SPIFFS_CACHE_WR\n    res = spiffs_fflush_cache(fs, fh);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n#endif\n\n    res = fd->fdoffset;\n\n    SPIFFS_UNLOCK(fs);\n    return res;\n}\n\ns32_t SPIFFS_set_file_callback_func(spiffs *fs, spiffs_file_callback cb_func)\n{\n    SPIFFS_API_DBG(\"%s\\n\", __func__);\n    SPIFFS_LOCK(fs);\n    fs->file_cb_f = cb_func;\n    SPIFFS_UNLOCK(fs);\n    return 0;\n}\n\n#if SPIFFS_IX_MAP\n\ns32_t SPIFFS_ix_map(spiffs *fs,  spiffs_file fh, spiffs_ix_map *map,\n                    u32_t offset, u32_t len, spiffs_page_ix *map_buf)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \" \"_SPIPRIi \" \"_SPIPRIi \"\\n\", __func__, fh, offset, len);\n    s32_t res;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n\n    spiffs_fd *fd;\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    if (fd->ix_map)\n    {\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, SPIFFS_ERR_IX_MAP_MAPPED);\n    }\n\n    map->map_buf = map_buf;\n    map->offset = offset;\n    // nb: spix range includes last\n    map->start_spix = offset / SPIFFS_DATA_PAGE_SIZE(fs);\n    map->end_spix = (offset + len) / SPIFFS_DATA_PAGE_SIZE(fs);\n    memset(map_buf, 0, sizeof(spiffs_page_ix) * (map->end_spix - map->start_spix + 1));\n    fd->ix_map = map;\n\n    // scan for pixes\n    res = spiffs_populate_ix_map(fs, fd, 0, map->end_spix - map->start_spix + 1);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    SPIFFS_UNLOCK(fs);\n    return res;\n}\n\ns32_t SPIFFS_ix_unmap(spiffs *fs,  spiffs_file fh)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \"\\n\", __func__, fh);\n    s32_t res;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n\n    spiffs_fd *fd;\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    if (fd->ix_map == 0)\n    {\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, SPIFFS_ERR_IX_MAP_UNMAPPED);\n    }\n\n    fd->ix_map = 0;\n\n    SPIFFS_UNLOCK(fs);\n    return res;\n}\n\ns32_t SPIFFS_ix_remap(spiffs *fs, spiffs_file fh, u32_t offset)\n{\n    SPIFFS_API_DBG(\"%s \"_SPIPRIfd \" \"_SPIPRIi \"\\n\", __func__, fh, offset);\n    s32_t res = SPIFFS_OK;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    fh = SPIFFS_FH_UNOFFS(fs, fh);\n\n    spiffs_fd *fd;\n    res = spiffs_fd_get(fs, fh, &fd);\n    SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n\n    if (fd->ix_map == 0)\n    {\n        SPIFFS_API_CHECK_RES_UNLOCK(fs, SPIFFS_ERR_IX_MAP_UNMAPPED);\n    }\n\n    spiffs_ix_map *map = fd->ix_map;\n\n    s32_t spix_diff = offset / SPIFFS_DATA_PAGE_SIZE(fs) - map->start_spix;\n    map->offset = offset;\n\n    // move existing pixes if within map offs\n    if (spix_diff != 0)\n    {\n        // move vector\n        int i;\n        const s32_t vec_len = map->end_spix - map->start_spix + 1; // spix range includes last\n        map->start_spix += spix_diff;\n        map->end_spix += spix_diff;\n        if (spix_diff >= vec_len)\n        {\n            // moving beyond range\n            memset(&map->map_buf, 0, vec_len * sizeof(spiffs_page_ix));\n            // populate_ix_map is inclusive\n            res = spiffs_populate_ix_map(fs, fd, 0, vec_len - 1);\n            SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n        }\n        else if (spix_diff > 0)\n        {\n            // diff positive\n            for (i = 0; i < vec_len - spix_diff; i++)\n            {\n                map->map_buf[i] = map->map_buf[i + spix_diff];\n            }\n            // memset is non-inclusive\n            memset(&map->map_buf[vec_len - spix_diff], 0, spix_diff * sizeof(spiffs_page_ix));\n            // populate_ix_map is inclusive\n            res = spiffs_populate_ix_map(fs, fd, vec_len - spix_diff, vec_len - 1);\n            SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n        }\n        else\n        {\n            // diff negative\n            for (i = vec_len - 1; i >= -spix_diff; i--)\n            {\n                map->map_buf[i] = map->map_buf[i + spix_diff];\n            }\n            // memset is non-inclusive\n            memset(&map->map_buf[0], 0, -spix_diff * sizeof(spiffs_page_ix));\n            // populate_ix_map is inclusive\n            res = spiffs_populate_ix_map(fs, fd, 0, -spix_diff - 1);\n            SPIFFS_API_CHECK_RES_UNLOCK(fs, res);\n        }\n\n    }\n\n    SPIFFS_UNLOCK(fs);\n    return res;\n}\n\ns32_t SPIFFS_bytes_to_ix_map_entries(spiffs *fs, u32_t bytes)\n{\n    SPIFFS_API_CHECK_CFG(fs);\n    // always add one extra page, the offset might change to the middle of a page\n    return (bytes + SPIFFS_DATA_PAGE_SIZE(fs) ) / SPIFFS_DATA_PAGE_SIZE(fs);\n}\n\ns32_t SPIFFS_ix_map_entries_to_bytes(spiffs *fs, u32_t map_page_ix_entries)\n{\n    SPIFFS_API_CHECK_CFG(fs);\n    return map_page_ix_entries * SPIFFS_DATA_PAGE_SIZE(fs);\n}\n\n#endif // SPIFFS_IX_MAP\n\n#if SPIFFS_TEST_VISUALISATION\ns32_t SPIFFS_vis(spiffs *fs)\n{\n    s32_t res = SPIFFS_OK;\n    SPIFFS_API_CHECK_CFG(fs);\n    SPIFFS_API_CHECK_MOUNT(fs);\n    SPIFFS_LOCK(fs);\n\n    int entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id));\n    spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work;\n    spiffs_block_ix bix = 0;\n\n    while (bix < fs->block_count)\n    {\n        // check each object lookup page\n        int obj_lookup_page = 0;\n        int cur_entry = 0;\n\n        while (res == SPIFFS_OK && obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))\n        {\n            int entry_offset = obj_lookup_page * entries_per_page;\n            res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                             0, bix * SPIFFS_CFG_LOG_BLOCK_SZ(fs) + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n            // check each entry\n            while (res == SPIFFS_OK &&\n                    cur_entry - entry_offset < entries_per_page && cur_entry < (int)(SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs)))\n            {\n                spiffs_obj_id obj_id = obj_lu_buf[cur_entry - entry_offset];\n                if (cur_entry == 0)\n                {\n                    spiffs_printf(_SPIPRIbl\" \", bix);\n                }\n                else if ((cur_entry & 0x3f) == 0)\n                {\n                    spiffs_printf(\"     \");\n                }\n                if (obj_id == SPIFFS_OBJ_ID_FREE)\n                {\n                    spiffs_printf(SPIFFS_TEST_VIS_FREE_STR);\n                }\n                else if (obj_id == SPIFFS_OBJ_ID_DELETED)\n                {\n                    spiffs_printf(SPIFFS_TEST_VIS_DELE_STR);\n                }\n                else if (obj_id & SPIFFS_OBJ_ID_IX_FLAG)\n                {\n                    spiffs_printf(SPIFFS_TEST_VIS_INDX_STR(obj_id));\n                }\n                else\n                {\n                    spiffs_printf(SPIFFS_TEST_VIS_DATA_STR(obj_id));\n                }\n                cur_entry++;\n                if ((cur_entry & 0x3f) == 0)\n                {\n                    spiffs_printf(\"\\n\");\n                }\n            } // per entry\n            obj_lookup_page++;\n        } // per object lookup page\n\n        spiffs_obj_id erase_count;\n        res = _spiffs_rd(fs, SPIFFS_OP_C_READ | SPIFFS_OP_T_OBJ_LU2, 0,\n                         SPIFFS_ERASE_COUNT_PADDR(fs, bix),\n                         sizeof(spiffs_obj_id), (u8_t *)&erase_count);\n        SPIFFS_CHECK_RES(res);\n\n        if (erase_count != (spiffs_obj_id) - 1)\n        {\n            spiffs_printf(\"\\tera_cnt: %d\\n\", erase_count);\n        }\n        else\n        {\n            spiffs_printf(\"\\tera_cnt: N/A\\n\");\n        }\n\n        bix++;\n    } // per block\n\n    spiffs_printf(\"era_cnt_max: %d\\n\", fs->max_erase_count);\n    spiffs_printf(\"last_errno:  \"_SPIPRIi\"\\n\", fs->err_code);\n    spiffs_printf(\"blocks:      \"_SPIPRIi\"\\n\", fs->block_count);\n    spiffs_printf(\"free_blocks: \"_SPIPRIi\"\\n\", fs->free_blocks);\n    spiffs_printf(\"page_alloc:  \"_SPIPRIi\"\\n\", fs->stats_p_allocated);\n    spiffs_printf(\"page_delet:  \"_SPIPRIi\"\\n\", fs->stats_p_deleted);\n    SPIFFS_UNLOCK(fs);\n    u32_t total, used;\n    SPIFFS_info(fs, &total, &used);\n    spiffs_printf(\"used:        \"_SPIPRIi\" of \"_SPIPRIi\"\\n\", used, total);\n    return res;\n}\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/src/spiffs_nucleus.c",
    "content": "#include \"spiffs.h\"\n#include \"spiffs_nucleus.h\"\n\nstatic s32_t spiffs_page_data_check(spiffs *fs, spiffs_fd *fd, spiffs_page_ix pix, spiffs_span_ix spix)\n{\n    s32_t res = SPIFFS_OK;\n    if (pix == (spiffs_page_ix) - 1)\n    {\n        // referring to page 0xffff...., bad object index\n        return SPIFFS_ERR_INDEX_REF_FREE;\n    }\n    if (pix % SPIFFS_PAGES_PER_BLOCK(fs) < SPIFFS_OBJ_LOOKUP_PAGES(fs))\n    {\n        // referring to an object lookup page, bad object index\n        return SPIFFS_ERR_INDEX_REF_LU;\n    }\n    if (pix > SPIFFS_MAX_PAGES(fs))\n    {\n        // referring to a bad page\n        return SPIFFS_ERR_INDEX_REF_INVALID;\n    }\n#if SPIFFS_PAGE_CHECK\n    spiffs_page_header ph;\n    res = _spiffs_rd(\n              fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_READ,\n              fd->file_nbr,\n              SPIFFS_PAGE_TO_PADDR(fs, pix),\n              sizeof(spiffs_page_header),\n              (u8_t *)&ph);\n    SPIFFS_CHECK_RES(res);\n    SPIFFS_VALIDATE_DATA(ph, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG, spix);\n#endif\n    return res;\n}\n\n#if !SPIFFS_READ_ONLY\nstatic s32_t spiffs_page_index_check(spiffs *fs, spiffs_fd *fd, spiffs_page_ix pix, spiffs_span_ix spix)\n{\n    s32_t res = SPIFFS_OK;\n    if (pix == (spiffs_page_ix) - 1)\n    {\n        // referring to page 0xffff...., bad object index\n        return SPIFFS_ERR_INDEX_FREE;\n    }\n    if (pix % SPIFFS_PAGES_PER_BLOCK(fs) < SPIFFS_OBJ_LOOKUP_PAGES(fs))\n    {\n        // referring to an object lookup page, bad object index\n        return SPIFFS_ERR_INDEX_LU;\n    }\n    if (pix > SPIFFS_MAX_PAGES(fs))\n    {\n        // referring to a bad page\n        return SPIFFS_ERR_INDEX_INVALID;\n    }\n#if SPIFFS_PAGE_CHECK\n    spiffs_page_header ph;\n    res = _spiffs_rd(\n              fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ,\n              fd->file_nbr,\n              SPIFFS_PAGE_TO_PADDR(fs, pix),\n              sizeof(spiffs_page_header),\n              (u8_t *)&ph);\n    SPIFFS_CHECK_RES(res);\n    SPIFFS_VALIDATE_OBJIX(ph, fd->obj_id, spix);\n#endif\n    return res;\n}\n#endif // !SPIFFS_READ_ONLY\n\n#if !SPIFFS_CACHE\n\ns32_t spiffs_phys_rd(\n    spiffs *fs,\n    u32_t addr,\n    u32_t len,\n    u8_t *dst)\n{\n    return SPIFFS_HAL_READ(fs, addr, len, dst);\n}\n\ns32_t spiffs_phys_wr(\n    spiffs *fs,\n    u32_t addr,\n    u32_t len,\n    u8_t *src)\n{\n    return SPIFFS_HAL_WRITE(fs, addr, len, src);\n}\n\n#endif\n\n#if !SPIFFS_READ_ONLY\ns32_t spiffs_phys_cpy(\n    spiffs *fs,\n    spiffs_file fh,\n    u32_t dst,\n    u32_t src,\n    u32_t len)\n{\n    (void)fh;\n    s32_t res;\n    u8_t b[SPIFFS_COPY_BUFFER_STACK];\n    while (len > 0)\n    {\n        u32_t chunk_size = MIN(SPIFFS_COPY_BUFFER_STACK, len);\n        res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_MOVS, fh, src, chunk_size, b);\n        SPIFFS_CHECK_RES(res);\n        res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_MOVD,  fh, dst, chunk_size, b);\n        SPIFFS_CHECK_RES(res);\n        len -= chunk_size;\n        src += chunk_size;\n        dst += chunk_size;\n    }\n    return SPIFFS_OK;\n}\n#endif // !SPIFFS_READ_ONLY\n\n// Find object lookup entry containing given id with visitor.\n// Iterate over object lookup pages in each block until a given object id entry is found.\n// When found, the visitor function is called with block index, entry index and user data.\n// If visitor returns SPIFFS_VIS_CONTINUE, the search goes on. Otherwise, the search will be\n// ended and visitor's return code is returned to caller.\n// If no visitor is given (0) the search returns on first entry with matching object id.\n// If no match is found in all look up, SPIFFS_VIS_END is returned.\n// @param fs                    the file system\n// @param starting_block        the starting block to start search in\n// @param starting_lu_entry     the look up index entry to start search in\n// @param flags                 ored combination of SPIFFS_VIS_CHECK_ID, SPIFFS_VIS_CHECK_PH,\n//                              SPIFFS_VIS_NO_WRAP\n// @param obj_id                argument object id\n// @param v                     visitor callback function\n// @param user_const_p          any const pointer, passed to the callback visitor function\n// @param user_var_p            any pointer, passed to the callback visitor function\n// @param block_ix              reported block index where match was found\n// @param lu_entry              reported look up index where match was found\ns32_t spiffs_obj_lu_find_entry_visitor(\n    spiffs *fs,\n    spiffs_block_ix starting_block,\n    int starting_lu_entry,\n    u8_t flags,\n    spiffs_obj_id obj_id,\n    spiffs_visitor_f v,\n    const void *user_const_p,\n    void *user_var_p,\n    spiffs_block_ix *block_ix,\n    int *lu_entry)\n{\n    s32_t res = SPIFFS_OK;\n    s32_t entry_count = fs->block_count * SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs);\n    spiffs_block_ix cur_block = starting_block;\n    u32_t cur_block_addr = starting_block * SPIFFS_CFG_LOG_BLOCK_SZ(fs);\n\n    spiffs_obj_id *obj_lu_buf = (spiffs_obj_id *)fs->lu_work;\n    int cur_entry = starting_lu_entry;\n    int entries_per_page = (SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(spiffs_obj_id));\n\n    // wrap initial\n    if (cur_entry > (int)SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs) - 1)\n    {\n        cur_entry = 0;\n        cur_block++;\n        cur_block_addr = cur_block * SPIFFS_CFG_LOG_BLOCK_SZ(fs);\n        if (cur_block >= fs->block_count)\n        {\n            if (flags & SPIFFS_VIS_NO_WRAP)\n            {\n                return SPIFFS_VIS_END;\n            }\n            else\n            {\n                // block wrap\n                cur_block = 0;\n                cur_block_addr = 0;\n            }\n        }\n    }\n\n    // check each block\n    while (res == SPIFFS_OK && entry_count > 0)\n    {\n        int obj_lookup_page = cur_entry / entries_per_page;\n        // check each object lookup page\n        while (res == SPIFFS_OK && obj_lookup_page < (int)SPIFFS_OBJ_LOOKUP_PAGES(fs))\n        {\n            int entry_offset = obj_lookup_page * entries_per_page;\n            res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                             0, cur_block_addr + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n            // check each entry\n            while (res == SPIFFS_OK &&\n                    cur_entry - entry_offset < entries_per_page && // for non-last obj lookup pages\n                    cur_entry < (int)SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs)) // for last obj lookup page\n            {\n                if ((flags & SPIFFS_VIS_CHECK_ID) == 0 || obj_lu_buf[cur_entry - entry_offset] == obj_id)\n                {\n                    if (block_ix) *block_ix = cur_block;\n                    if (lu_entry) *lu_entry = cur_entry;\n                    if (v)\n                    {\n                        res = v(\n                                  fs,\n                                  (flags & SPIFFS_VIS_CHECK_PH) ? obj_id : obj_lu_buf[cur_entry - entry_offset],\n                                  cur_block,\n                                  cur_entry,\n                                  user_const_p,\n                                  user_var_p);\n                        if (res == SPIFFS_VIS_COUNTINUE || res == SPIFFS_VIS_COUNTINUE_RELOAD)\n                        {\n                            if (res == SPIFFS_VIS_COUNTINUE_RELOAD)\n                            {\n                                res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                                                 0, cur_block_addr + SPIFFS_PAGE_TO_PADDR(fs, obj_lookup_page), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->lu_work);\n                                SPIFFS_CHECK_RES(res);\n                            }\n                            res = SPIFFS_OK;\n                            cur_entry++;\n                            entry_count--;\n                            continue;\n                        }\n                        else\n                        {\n                            return res;\n                        }\n                    }\n                    else\n                    {\n                        return SPIFFS_OK;\n                    }\n                }\n                entry_count--;\n                cur_entry++;\n            } // per entry\n            obj_lookup_page++;\n        } // per object lookup page\n        cur_entry = 0;\n        cur_block++;\n        cur_block_addr += SPIFFS_CFG_LOG_BLOCK_SZ(fs);\n        if (cur_block >= fs->block_count)\n        {\n            if (flags & SPIFFS_VIS_NO_WRAP)\n            {\n                return SPIFFS_VIS_END;\n            }\n            else\n            {\n                // block wrap\n                cur_block = 0;\n                cur_block_addr = 0;\n            }\n        }\n    } // per block\n\n    SPIFFS_CHECK_RES(res);\n\n    return SPIFFS_VIS_END;\n}\n\n#if !SPIFFS_READ_ONLY\ns32_t spiffs_erase_block(\n    spiffs *fs,\n    spiffs_block_ix bix)\n{\n    s32_t res;\n    u32_t addr = SPIFFS_BLOCK_TO_PADDR(fs, bix);\n    s32_t size = SPIFFS_CFG_LOG_BLOCK_SZ(fs);\n\n    // here we ignore res, just try erasing the block\n    while (size > 0)\n    {\n        SPIFFS_DBG(\"erase \"_SPIPRIad\":\"_SPIPRIi\"\\n\", addr,  SPIFFS_CFG_PHYS_ERASE_SZ(fs));\n        SPIFFS_HAL_ERASE(fs, addr, SPIFFS_CFG_PHYS_ERASE_SZ(fs));\n\n        addr += SPIFFS_CFG_PHYS_ERASE_SZ(fs);\n        size -= SPIFFS_CFG_PHYS_ERASE_SZ(fs);\n    }\n    fs->free_blocks++;\n\n    // register erase count for this block\n    res = _spiffs_wr(fs, SPIFFS_OP_C_WRTHRU | SPIFFS_OP_T_OBJ_LU2, 0,\n                     SPIFFS_ERASE_COUNT_PADDR(fs, bix),\n                     sizeof(spiffs_obj_id), (u8_t *)&fs->max_erase_count);\n    SPIFFS_CHECK_RES(res);\n\n#if SPIFFS_USE_MAGIC\n    // finally, write magic\n    spiffs_obj_id magic = SPIFFS_MAGIC(fs, bix);\n    res = _spiffs_wr(fs, SPIFFS_OP_C_WRTHRU | SPIFFS_OP_T_OBJ_LU2, 0,\n                     SPIFFS_MAGIC_PADDR(fs, bix),\n                     sizeof(spiffs_obj_id), (u8_t *)&magic);\n    SPIFFS_CHECK_RES(res);\n#endif\n\n    fs->max_erase_count++;\n    if (fs->max_erase_count == SPIFFS_OBJ_ID_IX_FLAG)\n    {\n        fs->max_erase_count = 0;\n    }\n\n    return res;\n}\n#endif // !SPIFFS_READ_ONLY\n\n#if SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0\ns32_t spiffs_probe(\n    spiffs_config *cfg)\n{\n    s32_t res;\n    u32_t paddr;\n    spiffs dummy_fs; // create a dummy fs struct just to be able to use macros\n    _SPIFFS_MEMCPY(&dummy_fs.cfg, cfg, sizeof(spiffs_config));\n    dummy_fs.block_count = 0;\n\n    // Read three magics, as one block may be in an aborted erase state.\n    // At least two of these must contain magic and be in decreasing order.\n    spiffs_obj_id magic[3];\n    spiffs_obj_id bix_count[3];\n\n    spiffs_block_ix bix;\n    for (bix = 0; bix < 3; bix++)\n    {\n        paddr = SPIFFS_MAGIC_PADDR(&dummy_fs, bix);\n#if SPIFFS_HAL_CALLBACK_EXTRA\n        // not any proper fs to report here, so callback with null\n        // (cross fingers that no-one gets angry)\n        res = cfg->hal_read_f((void *)0, paddr, sizeof(spiffs_obj_id), (u8_t *)&magic[bix]);\n#else\n        res = cfg->hal_read_f(paddr, sizeof(spiffs_obj_id), (u8_t *)&magic[bix]);\n#endif\n        bix_count[bix] = magic[bix] ^ SPIFFS_MAGIC(&dummy_fs, 0);\n        SPIFFS_CHECK_RES(res);\n    }\n\n    // check that we have sane number of blocks\n    if (bix_count[0] < 3) return SPIFFS_ERR_PROBE_TOO_FEW_BLOCKS;\n    // check that the order is correct, take aborted erases in calculation\n    // first block aborted erase\n    if (magic[0] == (spiffs_obj_id)(-1) && bix_count[1] - bix_count[2] == 1)\n    {\n        return (bix_count[1] + 1) * cfg->log_block_size;\n    }\n    // second block aborted erase\n    if (magic[1] == (spiffs_obj_id)(-1) && bix_count[0] - bix_count[2] == 2)\n    {\n        return bix_count[0] * cfg->log_block_size;\n    }\n    // third block aborted erase\n    if (magic[2] == (spiffs_obj_id)(-1) && bix_count[0] - bix_count[1] == 1)\n    {\n        return bix_count[0] * cfg->log_block_size;\n    }\n    // no block has aborted erase\n    if (bix_count[0] - bix_count[1] == 1 && bix_count[1] - bix_count[2] == 1)\n    {\n        return bix_count[0] * cfg->log_block_size;\n    }\n\n    return SPIFFS_ERR_PROBE_NOT_A_FS;\n}\n#endif // SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH && SPIFFS_SINGLETON==0\n\n\nstatic s32_t spiffs_obj_lu_scan_v(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_block_ix bix,\n    int ix_entry,\n    const void *user_const_p,\n    void *user_var_p)\n{\n    (void)bix;\n    (void)user_const_p;\n    (void)user_var_p;\n    if (obj_id == SPIFFS_OBJ_ID_FREE)\n    {\n        if (ix_entry == 0)\n        {\n            fs->free_blocks++;\n            // todo optimize further, return SPIFFS_NEXT_BLOCK\n        }\n    }\n    else if (obj_id == SPIFFS_OBJ_ID_DELETED)\n    {\n        fs->stats_p_deleted++;\n    }\n    else\n    {\n        fs->stats_p_allocated++;\n    }\n\n    return SPIFFS_VIS_COUNTINUE;\n}\n\n\n// Scans thru all obj lu and counts free, deleted and used pages\n// Find the maximum block erase count\n// Checks magic if enabled\ns32_t spiffs_obj_lu_scan(\n    spiffs *fs)\n{\n    s32_t res;\n    spiffs_block_ix bix;\n    int entry;\n#if SPIFFS_USE_MAGIC\n    spiffs_block_ix unerased_bix = (spiffs_block_ix) - 1;\n#endif\n\n    // find out erase count\n    // if enabled, check magic\n    bix = 0;\n    spiffs_obj_id erase_count_final;\n    spiffs_obj_id erase_count_min = SPIFFS_OBJ_ID_FREE;\n    spiffs_obj_id erase_count_max = 0;\n    while (bix < fs->block_count)\n    {\n#if SPIFFS_USE_MAGIC\n        spiffs_obj_id magic;\n        res = _spiffs_rd(fs,\n                         SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                         0, SPIFFS_MAGIC_PADDR(fs, bix) ,\n                         sizeof(spiffs_obj_id), (u8_t *)&magic);\n\n        SPIFFS_CHECK_RES(res);\n        if (magic != SPIFFS_MAGIC(fs, bix))\n        {\n            if (unerased_bix == (spiffs_block_ix) - 1)\n            {\n                // allow one unerased block as it might be powered down during an erase\n                unerased_bix = bix;\n            }\n            else\n            {\n                // more than one unerased block, bail out\n                SPIFFS_CHECK_RES(SPIFFS_ERR_NOT_A_FS);\n            }\n        }\n#endif\n        spiffs_obj_id erase_count;\n        res = _spiffs_rd(fs,\n                         SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                         0, SPIFFS_ERASE_COUNT_PADDR(fs, bix) ,\n                         sizeof(spiffs_obj_id), (u8_t *)&erase_count);\n        SPIFFS_CHECK_RES(res);\n        if (erase_count != SPIFFS_OBJ_ID_FREE)\n        {\n            erase_count_min = MIN(erase_count_min, erase_count);\n            erase_count_max = MAX(erase_count_max, erase_count);\n        }\n        bix++;\n    }\n\n    if (erase_count_min == 0 && erase_count_max == SPIFFS_OBJ_ID_FREE)\n    {\n        // clean system, set counter to zero\n        erase_count_final = 0;\n    }\n    else if (erase_count_max - erase_count_min > (SPIFFS_OBJ_ID_FREE) / 2)\n    {\n        // wrap, take min\n        erase_count_final = erase_count_min + 1;\n    }\n    else\n    {\n        erase_count_final = erase_count_max + 1;\n    }\n\n    fs->max_erase_count = erase_count_final;\n\n#if SPIFFS_USE_MAGIC\n    if (unerased_bix != (spiffs_block_ix) - 1)\n    {\n        // found one unerased block, remedy\n        SPIFFS_DBG(\"mount: erase block \"_SPIPRIbl\"\\n\", bix);\n#if SPIFFS_READ_ONLY\n        res = SPIFFS_ERR_RO_ABORTED_OPERATION;\n#else\n        res = spiffs_erase_block(fs, unerased_bix);\n#endif // SPIFFS_READ_ONLY\n        SPIFFS_CHECK_RES(res);\n    }\n#endif\n\n    // count blocks\n\n    fs->free_blocks = 0;\n    fs->stats_p_allocated = 0;\n    fs->stats_p_deleted = 0;\n\n    res = spiffs_obj_lu_find_entry_visitor(fs,\n                                           0,\n                                           0,\n                                           0,\n                                           0,\n                                           spiffs_obj_lu_scan_v,\n                                           0,\n                                           0,\n                                           &bix,\n                                           &entry);\n\n    if (res == SPIFFS_VIS_END)\n    {\n        res = SPIFFS_OK;\n    }\n\n    SPIFFS_CHECK_RES(res);\n\n    return res;\n}\n\n#if !SPIFFS_READ_ONLY\n// Find free object lookup entry\n// Iterate over object lookup pages in each block until a free object id entry is found\ns32_t spiffs_obj_lu_find_free(\n    spiffs *fs,\n    spiffs_block_ix starting_block,\n    int starting_lu_entry,\n    spiffs_block_ix *block_ix,\n    int *lu_entry)\n{\n    s32_t res;\n    if (!fs->cleaning && fs->free_blocks < 2)\n    {\n        res = spiffs_gc_quick(fs, 0);\n        if (res == SPIFFS_ERR_NO_DELETED_BLOCKS)\n        {\n            res = SPIFFS_OK;\n        }\n        SPIFFS_CHECK_RES(res);\n        if (fs->free_blocks < 2)\n        {\n            return SPIFFS_ERR_FULL;\n        }\n    }\n    res = spiffs_obj_lu_find_id(fs, starting_block, starting_lu_entry,\n                                SPIFFS_OBJ_ID_FREE, block_ix, lu_entry);\n    if (res == SPIFFS_OK)\n    {\n        fs->free_cursor_block_ix = *block_ix;\n        fs->free_cursor_obj_lu_entry = (*lu_entry) + 1;\n        if (*lu_entry == 0)\n        {\n            fs->free_blocks--;\n        }\n    }\n    if (res == SPIFFS_ERR_FULL)\n    {\n        SPIFFS_DBG(\"fs full\\n\");\n    }\n\n    return res;\n}\n#endif // !SPIFFS_READ_ONLY\n\n// Find object lookup entry containing given id\n// Iterate over object lookup pages in each block until a given object id entry is found\ns32_t spiffs_obj_lu_find_id(\n    spiffs *fs,\n    spiffs_block_ix starting_block,\n    int starting_lu_entry,\n    spiffs_obj_id obj_id,\n    spiffs_block_ix *block_ix,\n    int *lu_entry)\n{\n    s32_t res = spiffs_obj_lu_find_entry_visitor(\n                    fs, starting_block, starting_lu_entry, SPIFFS_VIS_CHECK_ID, obj_id, 0, 0, 0, block_ix, lu_entry);\n    if (res == SPIFFS_VIS_END)\n    {\n        res = SPIFFS_ERR_NOT_FOUND;\n    }\n    return res;\n}\n\n\nstatic s32_t spiffs_obj_lu_find_id_and_span_v(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_block_ix bix,\n    int ix_entry,\n    const void *user_const_p,\n    void *user_var_p)\n{\n    s32_t res;\n    spiffs_page_header ph;\n    spiffs_page_ix pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, ix_entry);\n    res = _spiffs_rd(fs, 0, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                     SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_header), (u8_t *)&ph);\n    SPIFFS_CHECK_RES(res);\n    if (ph.obj_id == obj_id &&\n            ph.span_ix == *((spiffs_span_ix *)user_var_p) &&\n            (ph.flags & (SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_USED)) == SPIFFS_PH_FLAG_DELET &&\n            !((obj_id & SPIFFS_OBJ_ID_IX_FLAG) && (ph.flags & SPIFFS_PH_FLAG_IXDELE) == 0 && ph.span_ix == 0) &&\n            (user_const_p == 0 || *((const spiffs_page_ix *)user_const_p) != pix))\n    {\n        return SPIFFS_OK;\n    }\n    else\n    {\n        return SPIFFS_VIS_COUNTINUE;\n    }\n}\n\n// Find object lookup entry containing given id and span index\n// Iterate over object lookup pages in each block until a given object id entry is found\ns32_t spiffs_obj_lu_find_id_and_span(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_span_ix spix,\n    spiffs_page_ix exclusion_pix,\n    spiffs_page_ix *pix)\n{\n    s32_t res;\n    spiffs_block_ix bix;\n    int entry;\n\n    res = spiffs_obj_lu_find_entry_visitor(fs,\n                                           fs->cursor_block_ix,\n                                           fs->cursor_obj_lu_entry,\n                                           SPIFFS_VIS_CHECK_ID,\n                                           obj_id,\n                                           spiffs_obj_lu_find_id_and_span_v,\n                                           exclusion_pix ? &exclusion_pix : 0,\n                                           &spix,\n                                           &bix,\n                                           &entry);\n\n    if (res == SPIFFS_VIS_END)\n    {\n        res = SPIFFS_ERR_NOT_FOUND;\n    }\n\n    SPIFFS_CHECK_RES(res);\n\n    if (pix)\n    {\n        *pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry);\n    }\n\n    fs->cursor_block_ix = bix;\n    fs->cursor_obj_lu_entry = entry;\n\n    return res;\n}\n\n// Find object lookup entry containing given id and span index in page headers only\n// Iterate over object lookup pages in each block until a given object id entry is found\ns32_t spiffs_obj_lu_find_id_and_span_by_phdr(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_span_ix spix,\n    spiffs_page_ix exclusion_pix,\n    spiffs_page_ix *pix)\n{\n    s32_t res;\n    spiffs_block_ix bix;\n    int entry;\n\n    res = spiffs_obj_lu_find_entry_visitor(fs,\n                                           fs->cursor_block_ix,\n                                           fs->cursor_obj_lu_entry,\n                                           SPIFFS_VIS_CHECK_PH,\n                                           obj_id,\n                                           spiffs_obj_lu_find_id_and_span_v,\n                                           exclusion_pix ? &exclusion_pix : 0,\n                                           &spix,\n                                           &bix,\n                                           &entry);\n\n    if (res == SPIFFS_VIS_END)\n    {\n        res = SPIFFS_ERR_NOT_FOUND;\n    }\n\n    SPIFFS_CHECK_RES(res);\n\n    if (pix)\n    {\n        *pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry);\n    }\n\n    fs->cursor_block_ix = bix;\n    fs->cursor_obj_lu_entry = entry;\n\n    return res;\n}\n\n#if SPIFFS_IX_MAP\n\n// update index map of given fd with given object index data\nstatic void spiffs_update_ix_map(spiffs *fs,\n                                 spiffs_fd *fd, spiffs_span_ix objix_spix, spiffs_page_object_ix *objix)\n{\n#if SPIFFS_SINGLETON\n    (void)fs;\n#endif\n    spiffs_ix_map *map = fd->ix_map;\n    spiffs_span_ix map_objix_start_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, map->start_spix);\n    spiffs_span_ix map_objix_end_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, map->end_spix);\n\n    // check if updated ix is within map range\n    if (objix_spix < map_objix_start_spix || objix_spix > map_objix_end_spix)\n    {\n        return;\n    }\n\n    // update memory mapped page index buffer to new pages\n\n    // get range of updated object index map data span indices\n    spiffs_span_ix objix_data_spix_start =\n        SPIFFS_DATA_SPAN_IX_FOR_OBJ_IX_SPAN_IX(fs, objix_spix);\n    spiffs_span_ix objix_data_spix_end = objix_data_spix_start +\n                                         (objix_spix == 0 ? SPIFFS_OBJ_HDR_IX_LEN(fs) : SPIFFS_OBJ_IX_LEN(fs));\n\n    // calc union of object index range and index map range array\n    spiffs_span_ix map_spix = MAX(map->start_spix, objix_data_spix_start);\n    spiffs_span_ix map_spix_end = MIN(map->end_spix + 1, objix_data_spix_end);\n\n    while (map_spix < map_spix_end)\n    {\n        spiffs_page_ix objix_data_pix;\n        if (objix_spix == 0)\n        {\n            // get data page from object index header page\n            objix_data_pix = ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix_header)))[map_spix];\n        }\n        else\n        {\n            // get data page from object index page\n            objix_data_pix = ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, map_spix)];\n        }\n\n        if (objix_data_pix == (spiffs_page_ix) - 1)\n        {\n            // reached end of object, abort\n            break;\n        }\n\n        map->map_buf[map_spix - map->start_spix] = objix_data_pix;\n        SPIFFS_DBG(\"map \"_SPIPRIid\":\"_SPIPRIsp\" (\"_SPIPRIsp\"--\"_SPIPRIsp\") objix.spix:\"_SPIPRIsp\" to pix \"_SPIPRIpg\"\\n\",\n                   fd->obj_id, map_spix - map->start_spix,\n                   map->start_spix, map->end_spix,\n                   objix->p_hdr.span_ix,\n                   objix_data_pix);\n\n        map_spix++;\n    }\n}\n\ntypedef struct\n{\n    spiffs_fd *fd;\n    u32_t remaining_objix_pages_to_visit;\n    spiffs_span_ix map_objix_start_spix;\n    spiffs_span_ix map_objix_end_spix;\n} spiffs_ix_map_populate_state;\n\nstatic s32_t spiffs_populate_ix_map_v(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_block_ix bix,\n    int ix_entry,\n    const void *user_const_p,\n    void *user_var_p)\n{\n    (void)user_const_p;\n    s32_t res;\n    spiffs_ix_map_populate_state *state = (spiffs_ix_map_populate_state *)user_var_p;\n    spiffs_page_ix pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, ix_entry);\n\n    // load header to check it\n    spiffs_page_object_ix *objix = (spiffs_page_object_ix *)fs->work;\n    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                     0, SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix), (u8_t *)objix);\n    SPIFFS_CHECK_RES(res);\n    SPIFFS_VALIDATE_OBJIX(objix->p_hdr, obj_id, objix->p_hdr.span_ix);\n\n    // check if hdr is ok, and if objix range overlap with ix map range\n    if ((objix->p_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) ==\n            (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE) &&\n            objix->p_hdr.span_ix >= state->map_objix_start_spix &&\n            objix->p_hdr.span_ix <= state->map_objix_end_spix)\n    {\n        // ok, load rest of object index\n        res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                         0, SPIFFS_PAGE_TO_PADDR(fs, pix) + sizeof(spiffs_page_object_ix),\n                         SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_object_ix),\n                         (u8_t *)objix + sizeof(spiffs_page_object_ix));\n        SPIFFS_CHECK_RES(res);\n\n        spiffs_update_ix_map(fs, state->fd, objix->p_hdr.span_ix, objix);\n\n        state->remaining_objix_pages_to_visit--;\n        SPIFFS_DBG(\"map \"_SPIPRIid\" (\"_SPIPRIsp\"--\"_SPIPRIsp\") remaining objix pages \"_SPIPRIi\"\\n\",\n                   state->fd->obj_id,\n                   state->fd->ix_map->start_spix, state->fd->ix_map->end_spix,\n                   state->remaining_objix_pages_to_visit);\n    }\n\n    if (res == SPIFFS_OK)\n    {\n        res = state->remaining_objix_pages_to_visit ? SPIFFS_VIS_COUNTINUE : SPIFFS_VIS_END;\n    }\n    return res;\n}\n\n// populates index map, from vector entry start to vector entry end, inclusive\ns32_t spiffs_populate_ix_map(spiffs *fs, spiffs_fd *fd, u32_t vec_entry_start, u32_t vec_entry_end)\n{\n    s32_t res;\n    spiffs_ix_map *map = fd->ix_map;\n    spiffs_ix_map_populate_state state;\n    vec_entry_start = MIN((u32_t)(map->end_spix - map->start_spix), vec_entry_start);\n    vec_entry_end = MAX((u32_t)(map->end_spix - map->start_spix), vec_entry_end);\n    if (vec_entry_start > vec_entry_end)\n    {\n        return SPIFFS_ERR_IX_MAP_BAD_RANGE;\n    }\n    state.map_objix_start_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, map->start_spix + vec_entry_start);\n    state.map_objix_end_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, map->start_spix + vec_entry_end);\n    state.remaining_objix_pages_to_visit =\n        state.map_objix_end_spix - state.map_objix_start_spix + 1;\n    state.fd = fd;\n\n    res = spiffs_obj_lu_find_entry_visitor(\n              fs,\n              SPIFFS_BLOCK_FOR_PAGE(fs, fd->objix_hdr_pix),\n              SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, fd->objix_hdr_pix),\n              SPIFFS_VIS_CHECK_ID,\n              fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG,\n              spiffs_populate_ix_map_v,\n              0,\n              &state,\n              0,\n              0);\n\n    if (res == SPIFFS_VIS_END)\n    {\n        res = SPIFFS_OK;\n    }\n\n    return res;\n}\n\n#endif\n\n\n#if !SPIFFS_READ_ONLY\n// Allocates a free defined page with given obj_id\n// Occupies object lookup entry and page\n// data may be NULL; where only page header is stored, len and page_offs is ignored\ns32_t spiffs_page_allocate_data(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_page_header *ph,\n    u8_t *data,\n    u32_t len,\n    u32_t page_offs,\n    u8_t finalize,\n    spiffs_page_ix *pix)\n{\n    s32_t res = SPIFFS_OK;\n    spiffs_block_ix bix;\n    int entry;\n\n    // find free entry\n    res = spiffs_obj_lu_find_free(fs, fs->free_cursor_block_ix, fs->free_cursor_obj_lu_entry, &bix, &entry);\n    SPIFFS_CHECK_RES(res);\n\n    // occupy page in object lookup\n    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT,\n                     0, SPIFFS_BLOCK_TO_PADDR(fs, bix) + entry * sizeof(spiffs_obj_id), sizeof(spiffs_obj_id), (u8_t *)&obj_id);\n    SPIFFS_CHECK_RES(res);\n\n    fs->stats_p_allocated++;\n\n    // write page header\n    ph->flags &= ~SPIFFS_PH_FLAG_USED;\n    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                     0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, bix, entry), sizeof(spiffs_page_header), (u8_t *)ph);\n    SPIFFS_CHECK_RES(res);\n\n    // write page data\n    if (data)\n    {\n        res = _spiffs_wr(fs,  SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                         0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, bix, entry) + sizeof(spiffs_page_header) + page_offs, len, data);\n        SPIFFS_CHECK_RES(res);\n    }\n\n    // finalize header if necessary\n    if (finalize && (ph->flags & SPIFFS_PH_FLAG_FINAL))\n    {\n        ph->flags &= ~SPIFFS_PH_FLAG_FINAL;\n        res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                         0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, bix, entry) + offsetof(spiffs_page_header, flags),\n                         sizeof(u8_t),\n                         (u8_t *)&ph->flags);\n        SPIFFS_CHECK_RES(res);\n    }\n\n    // return written page\n    if (pix)\n    {\n        *pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry);\n    }\n\n    return res;\n}\n#endif // !SPIFFS_READ_ONLY\n\n#if !SPIFFS_READ_ONLY\n// Moves a page from src to a free page and finalizes it. Updates page index. Page data is given in param page.\n// If page data is null, provided header is used for metainfo and page data is physically copied.\ns32_t spiffs_page_move(\n    spiffs *fs,\n    spiffs_file fh,\n    u8_t *page_data,\n    spiffs_obj_id obj_id,\n    spiffs_page_header *page_hdr,\n    spiffs_page_ix src_pix,\n    spiffs_page_ix *dst_pix)\n{\n    s32_t res;\n    u8_t was_final = 0;\n    spiffs_page_header *p_hdr;\n    spiffs_block_ix bix;\n    int entry;\n    spiffs_page_ix free_pix;\n\n    // find free entry\n    res = spiffs_obj_lu_find_free(fs, fs->free_cursor_block_ix, fs->free_cursor_obj_lu_entry, &bix, &entry);\n    SPIFFS_CHECK_RES(res);\n    free_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry);\n\n    if (dst_pix) *dst_pix = free_pix;\n\n    p_hdr = page_data ? (spiffs_page_header *)page_data : page_hdr;\n    if (page_data)\n    {\n        // got page data\n        was_final = (p_hdr->flags & SPIFFS_PH_FLAG_FINAL) == 0;\n        // write unfinalized page\n        p_hdr->flags |= SPIFFS_PH_FLAG_FINAL;\n        p_hdr->flags &= ~SPIFFS_PH_FLAG_USED;\n        res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                         0, SPIFFS_PAGE_TO_PADDR(fs, free_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), page_data);\n    }\n    else\n    {\n        // copy page data\n        res = spiffs_phys_cpy(fs, fh, SPIFFS_PAGE_TO_PADDR(fs, free_pix), SPIFFS_PAGE_TO_PADDR(fs, src_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs));\n    }\n    SPIFFS_CHECK_RES(res);\n\n    // mark entry in destination object lookup\n    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT,\n                     0, SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs, free_pix)) + SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, free_pix) * sizeof(spiffs_page_ix),\n                     sizeof(spiffs_obj_id),\n                     (u8_t *)&obj_id);\n    SPIFFS_CHECK_RES(res);\n\n    fs->stats_p_allocated++;\n\n    if (was_final)\n    {\n        // mark finalized in destination page\n        p_hdr->flags &= ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_USED);\n        res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                         fh,\n                         SPIFFS_PAGE_TO_PADDR(fs, free_pix) + offsetof(spiffs_page_header, flags),\n                         sizeof(u8_t),\n                         (u8_t *)&p_hdr->flags);\n        SPIFFS_CHECK_RES(res);\n    }\n    // mark source deleted\n    res = spiffs_page_delete(fs, src_pix);\n    return res;\n}\n#endif // !SPIFFS_READ_ONLY\n\n#if !SPIFFS_READ_ONLY\n// Deletes a page and removes it from object lookup.\ns32_t spiffs_page_delete(\n    spiffs *fs,\n    spiffs_page_ix pix)\n{\n    s32_t res;\n    // mark deleted entry in source object lookup\n    spiffs_obj_id d_obj_id = SPIFFS_OBJ_ID_DELETED;\n    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_DELE,\n                     0,\n                     SPIFFS_BLOCK_TO_PADDR(fs, SPIFFS_BLOCK_FOR_PAGE(fs, pix)) + SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, pix) * sizeof(spiffs_page_ix),\n                     sizeof(spiffs_obj_id),\n                     (u8_t *)&d_obj_id);\n    SPIFFS_CHECK_RES(res);\n\n    fs->stats_p_deleted++;\n    fs->stats_p_allocated--;\n\n    // mark deleted in source page\n    u8_t flags = 0xff;\n#if SPIFFS_NO_BLIND_WRITES\n    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_READ,\n                     0, SPIFFS_PAGE_TO_PADDR(fs, pix) + offsetof(spiffs_page_header, flags),\n                     sizeof(flags), &flags);\n    SPIFFS_CHECK_RES(res);\n#endif\n    flags &= ~(SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_USED);\n    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_DELE,\n                     0,\n                     SPIFFS_PAGE_TO_PADDR(fs, pix) + offsetof(spiffs_page_header, flags),\n                     sizeof(flags), &flags);\n\n    return res;\n}\n#endif // !SPIFFS_READ_ONLY\n\n#if !SPIFFS_READ_ONLY\n// Create an object index header page with empty index and undefined length\ns32_t spiffs_object_create(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    const u8_t name[],\n    const u8_t meta[],\n    spiffs_obj_type type,\n    spiffs_page_ix *objix_hdr_pix)\n{\n    s32_t res = SPIFFS_OK;\n    spiffs_block_ix bix;\n    spiffs_page_object_ix_header oix_hdr;\n    int entry;\n\n    res = spiffs_gc_check(fs, SPIFFS_DATA_PAGE_SIZE(fs));\n    SPIFFS_CHECK_RES(res);\n\n    obj_id |= SPIFFS_OBJ_ID_IX_FLAG;\n\n    // find free entry\n    res = spiffs_obj_lu_find_free(fs, fs->free_cursor_block_ix, fs->free_cursor_obj_lu_entry, &bix, &entry);\n    SPIFFS_CHECK_RES(res);\n    SPIFFS_DBG(\"create: found free page @ \"_SPIPRIpg\" bix:\"_SPIPRIbl\" entry:\"_SPIPRIsp\"\\n\", (spiffs_page_ix)SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry), bix, entry);\n\n    // occupy page in object lookup\n    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_UPDT,\n                     0, SPIFFS_BLOCK_TO_PADDR(fs, bix) + entry * sizeof(spiffs_obj_id), sizeof(spiffs_obj_id), (u8_t *)&obj_id);\n    SPIFFS_CHECK_RES(res);\n\n    fs->stats_p_allocated++;\n\n    // write empty object index page\n    oix_hdr.p_hdr.obj_id = obj_id;\n    oix_hdr.p_hdr.span_ix = 0;\n    oix_hdr.p_hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_USED);\n    oix_hdr.type = type;\n    oix_hdr.size = SPIFFS_UNDEFINED_LEN; // keep ones so we can update later without wasting this page\n    strncpy((char *)oix_hdr.name, (const char *)name, SPIFFS_OBJ_NAME_LEN);\n#if SPIFFS_OBJ_META_LEN\n    if (meta)\n    {\n        _SPIFFS_MEMCPY(oix_hdr.meta, meta, SPIFFS_OBJ_META_LEN);\n    }\n    else\n    {\n        memset(oix_hdr.meta, 0xff, SPIFFS_OBJ_META_LEN);\n    }\n#else\n    (void) meta;\n#endif\n\n    // update page\n    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                     0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, bix, entry), sizeof(spiffs_page_object_ix_header), (u8_t *)&oix_hdr);\n\n    SPIFFS_CHECK_RES(res);\n    spiffs_cb_object_event(fs, (spiffs_page_object_ix *)&oix_hdr,\n                           SPIFFS_EV_IX_NEW, obj_id, 0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry), SPIFFS_UNDEFINED_LEN);\n\n    if (objix_hdr_pix)\n    {\n        *objix_hdr_pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry);\n    }\n\n    return res;\n}\n#endif // !SPIFFS_READ_ONLY\n\n#if !SPIFFS_READ_ONLY\n// update object index header with any combination of name/size/index\n// new_objix_hdr_data may be null, if so the object index header page is loaded\n// name may be null, if so name is not changed\n// size may be null, if so size is not changed\ns32_t spiffs_object_update_index_hdr(\n    spiffs *fs,\n    spiffs_fd *fd,\n    spiffs_obj_id obj_id,\n    spiffs_page_ix objix_hdr_pix,\n    u8_t *new_objix_hdr_data,\n    const u8_t name[],\n    const u8_t meta[],\n    u32_t size,\n    spiffs_page_ix *new_pix)\n{\n    s32_t res = SPIFFS_OK;\n    spiffs_page_object_ix_header *objix_hdr;\n    spiffs_page_ix new_objix_hdr_pix;\n\n    obj_id |=  SPIFFS_OBJ_ID_IX_FLAG;\n\n    if (new_objix_hdr_data)\n    {\n        // object index header page already given to us, no need to load it\n        objix_hdr = (spiffs_page_object_ix_header *)new_objix_hdr_data;\n    }\n    else\n    {\n        // read object index header page\n        res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ,\n                         fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, objix_hdr_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n        SPIFFS_CHECK_RES(res);\n        objix_hdr = (spiffs_page_object_ix_header *)fs->work;\n    }\n\n    SPIFFS_VALIDATE_OBJIX(objix_hdr->p_hdr, obj_id, 0);\n\n    // change name\n    if (name)\n    {\n        strncpy((char *)objix_hdr->name, (const char *)name, SPIFFS_OBJ_NAME_LEN);\n    }\n#if SPIFFS_OBJ_META_LEN\n    if (meta)\n    {\n        _SPIFFS_MEMCPY(objix_hdr->meta, meta, SPIFFS_OBJ_META_LEN);\n    }\n#else\n    (void) meta;\n#endif\n    if (size)\n    {\n        objix_hdr->size = size;\n    }\n\n    // move and update page\n    res = spiffs_page_move(fs, fd == 0 ? 0 : fd->file_nbr, (u8_t *)objix_hdr, obj_id, 0, objix_hdr_pix, &new_objix_hdr_pix);\n\n    if (res == SPIFFS_OK)\n    {\n        if (new_pix)\n        {\n            *new_pix = new_objix_hdr_pix;\n        }\n        // callback on object index update\n        spiffs_cb_object_event(fs, (spiffs_page_object_ix *)objix_hdr,\n                               new_objix_hdr_data ? SPIFFS_EV_IX_UPD : SPIFFS_EV_IX_UPD_HDR,\n                               obj_id, objix_hdr->p_hdr.span_ix, new_objix_hdr_pix, objix_hdr->size);\n        if (fd) fd->objix_hdr_pix = new_objix_hdr_pix; // if this is not in the registered cluster\n    }\n\n    return res;\n}\n#endif // !SPIFFS_READ_ONLY\n\nvoid spiffs_cb_object_event(\n    spiffs *fs,\n    spiffs_page_object_ix *objix,\n    int ev,\n    spiffs_obj_id obj_id_raw,\n    spiffs_span_ix spix,\n    spiffs_page_ix new_pix,\n    u32_t new_size)\n{\n#if SPIFFS_IX_MAP == 0\n    (void)objix;\n#endif\n    // update index caches in all file descriptors\n    spiffs_obj_id obj_id = obj_id_raw & ~SPIFFS_OBJ_ID_IX_FLAG;\n    u32_t i;\n    spiffs_fd *fds = (spiffs_fd *)fs->fd_space;\n    SPIFFS_DBG(\"       CALLBACK  %s obj_id:\"_SPIPRIid\" spix:\"_SPIPRIsp\" npix:\"_SPIPRIpg\" nsz:\"_SPIPRIi\"\\n\", (const char *[])\n    {\"UPD\", \"NEW\", \"DEL\", \"MOV\", \"HUP\", \"???\"\n    }[MIN(ev, 5)],\n    obj_id_raw, spix, new_pix, new_size);\n    for (i = 0; i < fs->fd_count; i++)\n    {\n        spiffs_fd *cur_fd = &fds[i];\n        if ((cur_fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG) != obj_id) continue; // fd not related to updated file\n#if !SPIFFS_TEMPORAL_FD_CACHE\n        if (cur_fd->file_nbr == 0) continue; // fd closed\n#endif\n        if (spix == 0)   // object index header update\n        {\n            if (ev != SPIFFS_EV_IX_DEL)\n            {\n#if SPIFFS_TEMPORAL_FD_CACHE\n                if (cur_fd->score == 0) continue; // never used fd\n#endif\n                SPIFFS_DBG(\"       callback: setting fd \"_SPIPRIfd\":\"_SPIPRIid\"(fdoffs:\"_SPIPRIi\" offs:\"_SPIPRIi\") objix_hdr_pix to \"_SPIPRIpg\", size:\"_SPIPRIi\"\\n\",\n                           SPIFFS_FH_OFFS(fs, cur_fd->file_nbr), cur_fd->obj_id, cur_fd->fdoffset, cur_fd->offset, new_pix, new_size);\n                cur_fd->objix_hdr_pix = new_pix;\n                if (new_size != 0)\n                {\n                    // update size and offsets for fds to this file\n                    cur_fd->size = new_size;\n                    u32_t act_new_size = new_size == SPIFFS_UNDEFINED_LEN ? 0 : new_size;\n#if SPIFFS_CACHE_WR\n                    if (act_new_size > 0 && cur_fd->cache_page)\n                    {\n                        act_new_size = MAX(act_new_size, cur_fd->cache_page->offset + cur_fd->cache_page->size);\n                    }\n#endif\n                    if (cur_fd->offset > act_new_size)\n                    {\n                        cur_fd->offset = act_new_size;\n                    }\n                    if (cur_fd->fdoffset > act_new_size)\n                    {\n                        cur_fd->fdoffset = act_new_size;\n                    }\n#if SPIFFS_CACHE_WR\n                    if (cur_fd->cache_page && cur_fd->cache_page->offset > act_new_size + 1)\n                    {\n                        SPIFFS_CACHE_DBG(\"CACHE_DROP: file trunced, dropping cache page \"_SPIPRIi\", no writeback\\n\", cur_fd->cache_page->ix);\n                        spiffs_cache_fd_release(fs, cur_fd->cache_page);\n                    }\n#endif\n                }\n            }\n            else\n            {\n                // removing file\n#if SPIFFS_CACHE_WR\n                if (cur_fd->file_nbr && cur_fd->cache_page)\n                {\n                    SPIFFS_CACHE_DBG(\"CACHE_DROP: file deleted, dropping cache page \"_SPIPRIi\", no writeback\\n\", cur_fd->cache_page->ix);\n                    spiffs_cache_fd_release(fs, cur_fd->cache_page);\n                }\n#endif\n                SPIFFS_DBG(\"       callback: release fd \"_SPIPRIfd\":\"_SPIPRIid\" span:\"_SPIPRIsp\" objix_pix to \"_SPIPRIpg\"\\n\", SPIFFS_FH_OFFS(fs, cur_fd->file_nbr), cur_fd->obj_id, spix, new_pix);\n                cur_fd->file_nbr = 0;\n                cur_fd->obj_id = SPIFFS_OBJ_ID_DELETED;\n            }\n        } // object index header update\n        if (cur_fd->cursor_objix_spix == spix)\n        {\n            if (ev != SPIFFS_EV_IX_DEL)\n            {\n                SPIFFS_DBG(\"       callback: setting fd \"_SPIPRIfd\":\"_SPIPRIid\" span:\"_SPIPRIsp\" objix_pix to \"_SPIPRIpg\"\\n\", SPIFFS_FH_OFFS(fs, cur_fd->file_nbr), cur_fd->obj_id, spix, new_pix);\n                cur_fd->cursor_objix_pix = new_pix;\n            }\n            else\n            {\n                cur_fd->cursor_objix_pix = 0;\n            }\n        }\n    } // fd update loop\n\n#if SPIFFS_IX_MAP\n\n    // update index maps\n    if (ev == SPIFFS_EV_IX_UPD || ev == SPIFFS_EV_IX_NEW)\n    {\n        for (i = 0; i < fs->fd_count; i++)\n        {\n            spiffs_fd *cur_fd = &fds[i];\n            // check fd opened, having ix map, match obj id\n            if (cur_fd->file_nbr == 0 ||\n                    cur_fd->ix_map == 0 ||\n                    (cur_fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG) != obj_id) continue;\n            SPIFFS_DBG(\"       callback: map ix update fd \"_SPIPRIfd\":\"_SPIPRIid\" span:\"_SPIPRIsp\"\\n\", SPIFFS_FH_OFFS(fs, cur_fd->file_nbr), cur_fd->obj_id, spix);\n            spiffs_update_ix_map(fs, cur_fd, spix, objix);\n        }\n    }\n\n#endif\n\n    // callback to user if object index header\n    if (fs->file_cb_f && spix == 0 && (obj_id_raw & SPIFFS_OBJ_ID_IX_FLAG))\n    {\n        spiffs_fileop_type op;\n        if (ev == SPIFFS_EV_IX_NEW)\n        {\n            op = SPIFFS_CB_CREATED;\n        }\n        else if (ev == SPIFFS_EV_IX_UPD ||\n                 ev == SPIFFS_EV_IX_MOV ||\n                 ev == SPIFFS_EV_IX_UPD_HDR)\n        {\n            op = SPIFFS_CB_UPDATED;\n        }\n        else if (ev == SPIFFS_EV_IX_DEL)\n        {\n            op = SPIFFS_CB_DELETED;\n        }\n        else\n        {\n            SPIFFS_DBG(\"       callback: WARNING unknown callback event \"_SPIPRIi\"\\n\", ev);\n            return; // bail out\n        }\n        fs->file_cb_f(fs, op, obj_id, new_pix);\n    }\n}\n\n// Open object by id\ns32_t spiffs_object_open_by_id(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_fd *fd,\n    spiffs_flags flags,\n    spiffs_mode mode)\n{\n    s32_t res = SPIFFS_OK;\n    spiffs_page_ix pix;\n\n    res = spiffs_obj_lu_find_id_and_span(fs, obj_id | SPIFFS_OBJ_ID_IX_FLAG, 0, 0, &pix);\n    SPIFFS_CHECK_RES(res);\n\n    res = spiffs_object_open_by_page(fs, pix, fd, flags, mode);\n\n    return res;\n}\n\n// Open object by page index\ns32_t spiffs_object_open_by_page(\n    spiffs *fs,\n    spiffs_page_ix pix,\n    spiffs_fd *fd,\n    spiffs_flags flags,\n    spiffs_mode mode)\n{\n    (void)mode;\n    s32_t res = SPIFFS_OK;\n    spiffs_page_object_ix_header oix_hdr;\n    spiffs_obj_id obj_id;\n\n    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ,\n                     fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix_header), (u8_t *)&oix_hdr);\n    SPIFFS_CHECK_RES(res);\n\n    spiffs_block_ix bix = SPIFFS_BLOCK_FOR_PAGE(fs, pix);\n    int entry = SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, pix);\n\n    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU | SPIFFS_OP_C_READ,\n                     0,  SPIFFS_BLOCK_TO_PADDR(fs, bix) + entry * sizeof(spiffs_obj_id), sizeof(spiffs_obj_id), (u8_t *)&obj_id);\n\n    fd->fs = fs;\n    fd->objix_hdr_pix = pix;\n    fd->size = oix_hdr.size;\n    fd->offset = 0;\n    fd->cursor_objix_pix = pix;\n    fd->cursor_objix_spix = 0;\n    fd->obj_id = obj_id;\n    fd->flags = flags;\n\n    SPIFFS_VALIDATE_OBJIX(oix_hdr.p_hdr, fd->obj_id, 0);\n\n    SPIFFS_DBG(\"open: fd \"_SPIPRIfd\" is obj id \"_SPIPRIid\"\\n\", SPIFFS_FH_OFFS(fs, fd->file_nbr), fd->obj_id);\n\n    return res;\n}\n\n#if !SPIFFS_READ_ONLY\n// Append to object\n// keep current object index (header) page in fs->work buffer\ns32_t spiffs_object_append(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len)\n{\n    spiffs *fs = fd->fs;\n    s32_t res = SPIFFS_OK;\n    u32_t written = 0;\n\n    SPIFFS_DBG(\"append: \"_SPIPRIi\" bytes @ offs \"_SPIPRIi\" of size \"_SPIPRIi\"\\n\", len, offset, fd->size);\n\n    if (offset > fd->size)\n    {\n        SPIFFS_DBG(\"append: offset reversed to size\\n\");\n        offset = fd->size;\n    }\n\n    res = spiffs_gc_check(fs, len + SPIFFS_DATA_PAGE_SIZE(fs)); // add an extra page of data worth for meta\n    if (res != SPIFFS_OK)\n    {\n        SPIFFS_DBG(\"append: gc check fail \"_SPIPRIi\"\\n\", res);\n    }\n    SPIFFS_CHECK_RES(res);\n\n    spiffs_page_object_ix_header *objix_hdr = (spiffs_page_object_ix_header *)fs->work;\n    spiffs_page_object_ix *objix = (spiffs_page_object_ix *)fs->work;\n    spiffs_page_header p_hdr;\n\n    spiffs_span_ix cur_objix_spix = 0;\n    spiffs_span_ix prev_objix_spix = (spiffs_span_ix) - 1;\n    spiffs_page_ix cur_objix_pix = fd->objix_hdr_pix;\n    spiffs_page_ix new_objix_hdr_page;\n\n    spiffs_span_ix data_spix = offset / SPIFFS_DATA_PAGE_SIZE(fs);\n    spiffs_page_ix data_page;\n    u32_t page_offs = offset % SPIFFS_DATA_PAGE_SIZE(fs);\n\n    // write all data\n    while (res == SPIFFS_OK && written < len)\n    {\n        // calculate object index page span index\n        cur_objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix);\n\n        // handle storing and loading of object indices\n        if (cur_objix_spix != prev_objix_spix)\n        {\n            // new object index page\n            // within this clause we return directly if something fails, object index mess-up\n            if (written > 0)\n            {\n                // store previous object index page, unless first pass\n                SPIFFS_DBG(\"append: \"_SPIPRIid\" store objix \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", fd->obj_id,\n                           cur_objix_pix, prev_objix_spix, written);\n                if (prev_objix_spix == 0)\n                {\n                    // this is an update to object index header page\n                    objix_hdr->size = offset + written;\n                    if (offset == 0)\n                    {\n                        // was an empty object, update same page (size was 0xffffffff)\n                        res = spiffs_page_index_check(fs, fd, cur_objix_pix, 0);\n                        SPIFFS_CHECK_RES(res);\n                        res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT,\n                                         fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, cur_objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n                        SPIFFS_CHECK_RES(res);\n                    }\n                    else\n                    {\n                        // was a nonempty object, update to new page\n                        res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id,\n                                                             fd->objix_hdr_pix, fs->work, 0, 0, offset + written, &new_objix_hdr_page);\n                        SPIFFS_CHECK_RES(res);\n                        SPIFFS_DBG(\"append: \"_SPIPRIid\" store new objix_hdr, \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", fd->obj_id,\n                                   new_objix_hdr_page, 0, written);\n                    }\n                }\n                else\n                {\n                    // this is an update to an object index page\n                    res = spiffs_page_index_check(fs, fd, cur_objix_pix, prev_objix_spix);\n                    SPIFFS_CHECK_RES(res);\n\n                    res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT,\n                                     fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, cur_objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n                    SPIFFS_CHECK_RES(res);\n                    spiffs_cb_object_event(fs, (spiffs_page_object_ix *)fs->work,\n                                           SPIFFS_EV_IX_UPD, fd->obj_id, objix->p_hdr.span_ix, cur_objix_pix, 0);\n                    // update length in object index header page\n                    res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id,\n                                                         fd->objix_hdr_pix, 0, 0, 0, offset + written, &new_objix_hdr_page);\n                    SPIFFS_CHECK_RES(res);\n                    SPIFFS_DBG(\"append: \"_SPIPRIid\" store new size I \"_SPIPRIi\" in objix_hdr, \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", fd->obj_id,\n                               offset + written, new_objix_hdr_page, 0, written);\n                }\n                fd->size = offset + written;\n                fd->offset = offset + written;\n            }\n\n            // create or load new object index page\n            if (cur_objix_spix == 0)\n            {\n                // load object index header page, must always exist\n                SPIFFS_DBG(\"append: \"_SPIPRIid\" load objixhdr page \"_SPIPRIpg\":\"_SPIPRIsp\"\\n\", fd->obj_id, cur_objix_pix, cur_objix_spix);\n                res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ,\n                                 fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, cur_objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n                SPIFFS_CHECK_RES(res);\n                SPIFFS_VALIDATE_OBJIX(objix_hdr->p_hdr, fd->obj_id, cur_objix_spix);\n            }\n            else\n            {\n                spiffs_span_ix len_objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, (fd->size - 1) / SPIFFS_DATA_PAGE_SIZE(fs));\n                // on subsequent passes, create a new object index page\n                if (written > 0 || cur_objix_spix > len_objix_spix)\n                {\n                    p_hdr.obj_id = fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG;\n                    p_hdr.span_ix = cur_objix_spix;\n                    p_hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_INDEX);\n                    res = spiffs_page_allocate_data(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG,\n                                                    &p_hdr, 0, 0, 0, 1, &cur_objix_pix);\n                    SPIFFS_CHECK_RES(res);\n                    // quick \"load\" of new object index page\n                    memset(fs->work, 0xff, SPIFFS_CFG_LOG_PAGE_SZ(fs));\n                    _SPIFFS_MEMCPY(fs->work, &p_hdr, sizeof(spiffs_page_header));\n                    spiffs_cb_object_event(fs, (spiffs_page_object_ix *)fs->work,\n                                           SPIFFS_EV_IX_NEW, fd->obj_id, cur_objix_spix, cur_objix_pix, 0);\n                    SPIFFS_DBG(\"append: \"_SPIPRIid\" create objix page, \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", fd->obj_id\n                               , cur_objix_pix, cur_objix_spix, written);\n                }\n                else\n                {\n                    // on first pass, we load existing object index page\n                    spiffs_page_ix pix;\n                    SPIFFS_DBG(\"append: \"_SPIPRIid\" find objix span_ix:\"_SPIPRIsp\"\\n\", fd->obj_id, cur_objix_spix);\n                    if (fd->cursor_objix_spix == cur_objix_spix)\n                    {\n                        pix = fd->cursor_objix_pix;\n                    }\n                    else\n                    {\n                        res = spiffs_obj_lu_find_id_and_span(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, 0, &pix);\n                        SPIFFS_CHECK_RES(res);\n                    }\n                    SPIFFS_DBG(\"append: \"_SPIPRIid\" found object index at page \"_SPIPRIpg\" [fd size \"_SPIPRIi\"]\\n\", fd->obj_id, pix, fd->size);\n                    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ,\n                                     fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n                    SPIFFS_CHECK_RES(res);\n                    SPIFFS_VALIDATE_OBJIX(objix_hdr->p_hdr, fd->obj_id, cur_objix_spix);\n                    cur_objix_pix = pix;\n                }\n                fd->cursor_objix_pix = cur_objix_pix;\n                fd->cursor_objix_spix = cur_objix_spix;\n                fd->offset = offset + written;\n                fd->size = offset + written;\n            }\n            prev_objix_spix = cur_objix_spix;\n        }\n\n        // write data\n        u32_t to_write = MIN(len - written, SPIFFS_DATA_PAGE_SIZE(fs) - page_offs);\n        if (page_offs == 0)\n        {\n            // at beginning of a page, allocate and write a new page of data\n            p_hdr.obj_id = fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG;\n            p_hdr.span_ix = data_spix;\n            p_hdr.flags = 0xff & ~(SPIFFS_PH_FLAG_FINAL);  // finalize immediately\n            res = spiffs_page_allocate_data(fs, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG,\n                                            &p_hdr, &data[written], to_write, page_offs, 1, &data_page);\n            SPIFFS_DBG(\"append: \"_SPIPRIid\" store new data page, \"_SPIPRIpg\":\"_SPIPRIsp\" offset:\"_SPIPRIi\", len \"_SPIPRIi\", written \"_SPIPRIi\"\\n\", fd->obj_id,\n                       data_page, data_spix, page_offs, to_write, written);\n        }\n        else\n        {\n            // append to existing page, fill out free data in existing page\n            if (cur_objix_spix == 0)\n            {\n                // get data page from object index header page\n                data_page = ((spiffs_page_ix *)((u8_t *)objix_hdr + sizeof(spiffs_page_object_ix_header)))[data_spix];\n            }\n            else\n            {\n                // get data page from object index page\n                data_page = ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)];\n            }\n\n            res = spiffs_page_data_check(fs, fd, data_page, data_spix);\n            SPIFFS_CHECK_RES(res);\n\n            res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                             fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, data_page) + sizeof(spiffs_page_header) + page_offs, to_write, &data[written]);\n            SPIFFS_DBG(\"append: \"_SPIPRIid\" store to existing data page, \"_SPIPRIpg\":\"_SPIPRIsp\" offset:\"_SPIPRIi\", len \"_SPIPRIi\", written \"_SPIPRIi\"\\n\", fd->obj_id\n                       , data_page, data_spix, page_offs, to_write, written);\n        }\n\n        if (res != SPIFFS_OK) break;\n\n        // update memory representation of object index page with new data page\n        if (cur_objix_spix == 0)\n        {\n            // update object index header page\n            ((spiffs_page_ix *)((u8_t *)objix_hdr + sizeof(spiffs_page_object_ix_header)))[data_spix] = data_page;\n            SPIFFS_DBG(\"append: \"_SPIPRIid\" wrote page \"_SPIPRIpg\" to objix_hdr entry \"_SPIPRIsp\" in mem\\n\", fd->obj_id\n                       , data_page, data_spix);\n            objix_hdr->size = offset + written;\n        }\n        else\n        {\n            // update object index page\n            ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)] = data_page;\n            SPIFFS_DBG(\"append: \"_SPIPRIid\" wrote page \"_SPIPRIpg\" to objix entry \"_SPIPRIsp\" in mem\\n\", fd->obj_id\n                       , data_page, (spiffs_span_ix)SPIFFS_OBJ_IX_ENTRY(fs, data_spix));\n        }\n\n        // update internals\n        page_offs = 0;\n        data_spix++;\n        written += to_write;\n    } // while all data\n\n    fd->size = offset + written;\n    fd->offset = offset + written;\n    fd->cursor_objix_pix = cur_objix_pix;\n    fd->cursor_objix_spix = cur_objix_spix;\n\n    // finalize updated object indices\n    s32_t res2 = SPIFFS_OK;\n    if (cur_objix_spix != 0)\n    {\n        // wrote beyond object index header page\n        // write last modified object index page, unless object header index page\n        SPIFFS_DBG(\"append: \"_SPIPRIid\" store objix page, \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", fd->obj_id,\n                   cur_objix_pix, cur_objix_spix, written);\n\n        res2 = spiffs_page_index_check(fs, fd, cur_objix_pix, cur_objix_spix);\n        SPIFFS_CHECK_RES(res2);\n\n        res2 = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT,\n                          fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, cur_objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n        SPIFFS_CHECK_RES(res2);\n        spiffs_cb_object_event(fs, (spiffs_page_object_ix *)fs->work,\n                               SPIFFS_EV_IX_UPD, fd->obj_id, objix->p_hdr.span_ix, cur_objix_pix, 0);\n\n        // update size in object header index page\n        res2 = spiffs_object_update_index_hdr(fs, fd, fd->obj_id,\n                                              fd->objix_hdr_pix, 0, 0, 0, offset + written, &new_objix_hdr_page);\n        SPIFFS_DBG(\"append: \"_SPIPRIid\" store new size II \"_SPIPRIi\" in objix_hdr, \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\", res \"_SPIPRIi\"\\n\", fd->obj_id\n                   , offset + written, new_objix_hdr_page, 0, written, res2);\n        SPIFFS_CHECK_RES(res2);\n    }\n    else\n    {\n        // wrote within object index header page\n        if (offset == 0)\n        {\n            // wrote to empty object - simply update size and write whole page\n            objix_hdr->size = offset + written;\n            SPIFFS_DBG(\"append: \"_SPIPRIid\" store fresh objix_hdr page, \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", fd->obj_id\n                       , cur_objix_pix, cur_objix_spix, written);\n\n            res2 = spiffs_page_index_check(fs, fd, cur_objix_pix, cur_objix_spix);\n            SPIFFS_CHECK_RES(res2);\n\n            res2 = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT,\n                              fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, cur_objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n            SPIFFS_CHECK_RES(res2);\n            // callback on object index update\n            spiffs_cb_object_event(fs, (spiffs_page_object_ix *)fs->work,\n                                   SPIFFS_EV_IX_UPD_HDR, fd->obj_id, objix_hdr->p_hdr.span_ix, cur_objix_pix, objix_hdr->size);\n        }\n        else\n        {\n            // modifying object index header page, update size and make new copy\n            res2 = spiffs_object_update_index_hdr(fs, fd, fd->obj_id,\n                                                  fd->objix_hdr_pix, fs->work, 0, 0, offset + written, &new_objix_hdr_page);\n            SPIFFS_DBG(\"append: \"_SPIPRIid\" store modified objix_hdr page, \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", fd->obj_id\n                       , new_objix_hdr_page, 0, written);\n            SPIFFS_CHECK_RES(res2);\n        }\n    }\n\n    return res;\n} // spiffs_object_append\n#endif // !SPIFFS_READ_ONLY\n\n#if !SPIFFS_READ_ONLY\n// Modify object\n// keep current object index (header) page in fs->work buffer\ns32_t spiffs_object_modify(spiffs_fd *fd, u32_t offset, u8_t *data, u32_t len)\n{\n    spiffs *fs = fd->fs;\n    s32_t res = SPIFFS_OK;\n    u32_t written = 0;\n\n    res = spiffs_gc_check(fs, len + SPIFFS_DATA_PAGE_SIZE(fs));\n    SPIFFS_CHECK_RES(res);\n\n    spiffs_page_object_ix_header *objix_hdr = (spiffs_page_object_ix_header *)fs->work;\n    spiffs_page_object_ix *objix = (spiffs_page_object_ix *)fs->work;\n    spiffs_page_header p_hdr;\n\n    spiffs_span_ix cur_objix_spix = 0;\n    spiffs_span_ix prev_objix_spix = (spiffs_span_ix) - 1;\n    spiffs_page_ix cur_objix_pix = fd->objix_hdr_pix;\n    spiffs_page_ix new_objix_hdr_pix;\n\n    spiffs_span_ix data_spix = offset / SPIFFS_DATA_PAGE_SIZE(fs);\n    spiffs_page_ix data_pix;\n    u32_t page_offs = offset % SPIFFS_DATA_PAGE_SIZE(fs);\n\n\n    // write all data\n    while (res == SPIFFS_OK && written < len)\n    {\n        // calculate object index page span index\n        cur_objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix);\n\n        // handle storing and loading of object indices\n        if (cur_objix_spix != prev_objix_spix)\n        {\n            // new object index page\n            // within this clause we return directly if something fails, object index mess-up\n            if (written > 0)\n            {\n                // store previous object index (header) page, unless first pass\n                if (prev_objix_spix == 0)\n                {\n                    // store previous object index header page\n                    res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id,\n                                                         fd->objix_hdr_pix, fs->work, 0, 0, 0, &new_objix_hdr_pix);\n                    SPIFFS_DBG(\"modify: store modified objix_hdr page, \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", new_objix_hdr_pix, 0, written);\n                    SPIFFS_CHECK_RES(res);\n                }\n                else\n                {\n                    // store new version of previous object index page\n                    spiffs_page_ix new_objix_pix;\n\n                    res = spiffs_page_index_check(fs, fd, cur_objix_pix, prev_objix_spix);\n                    SPIFFS_CHECK_RES(res);\n\n                    res = spiffs_page_move(fs, fd->file_nbr, (u8_t *)objix, fd->obj_id, 0, cur_objix_pix, &new_objix_pix);\n                    SPIFFS_DBG(\"modify: store previous modified objix page, \"_SPIPRIid\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", new_objix_pix, objix->p_hdr.span_ix, written);\n                    SPIFFS_CHECK_RES(res);\n                    spiffs_cb_object_event(fs, (spiffs_page_object_ix *)objix,\n                                           SPIFFS_EV_IX_UPD, fd->obj_id, objix->p_hdr.span_ix, new_objix_pix, 0);\n                }\n            }\n\n            // load next object index page\n            if (cur_objix_spix == 0)\n            {\n                // load object index header page, must exist\n                SPIFFS_DBG(\"modify: load objixhdr page \"_SPIPRIpg\":\"_SPIPRIsp\"\\n\", cur_objix_pix, cur_objix_spix);\n                res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ,\n                                 fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, cur_objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n                SPIFFS_CHECK_RES(res);\n                SPIFFS_VALIDATE_OBJIX(objix_hdr->p_hdr, fd->obj_id, cur_objix_spix);\n            }\n            else\n            {\n                // load existing object index page on first pass\n                spiffs_page_ix pix;\n                SPIFFS_DBG(\"modify: find objix span_ix:\"_SPIPRIsp\"\\n\", cur_objix_spix);\n                if (fd->cursor_objix_spix == cur_objix_spix)\n                {\n                    pix = fd->cursor_objix_pix;\n                }\n                else\n                {\n                    res = spiffs_obj_lu_find_id_and_span(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, 0, &pix);\n                    SPIFFS_CHECK_RES(res);\n                }\n                SPIFFS_DBG(\"modify: found object index at page \"_SPIPRIpg\"\\n\", pix);\n                res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ,\n                                 fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n                SPIFFS_CHECK_RES(res);\n                SPIFFS_VALIDATE_OBJIX(objix_hdr->p_hdr, fd->obj_id, cur_objix_spix);\n                cur_objix_pix = pix;\n            }\n            fd->cursor_objix_pix = cur_objix_pix;\n            fd->cursor_objix_spix = cur_objix_spix;\n            fd->offset = offset + written;\n            prev_objix_spix = cur_objix_spix;\n        }\n\n        // write partial data\n        u32_t to_write = MIN(len - written, SPIFFS_DATA_PAGE_SIZE(fs) - page_offs);\n        spiffs_page_ix orig_data_pix;\n        if (cur_objix_spix == 0)\n        {\n            // get data page from object index header page\n            orig_data_pix = ((spiffs_page_ix *)((u8_t *)objix_hdr + sizeof(spiffs_page_object_ix_header)))[data_spix];\n        }\n        else\n        {\n            // get data page from object index page\n            orig_data_pix = ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)];\n        }\n\n        p_hdr.obj_id = fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG;\n        p_hdr.span_ix = data_spix;\n        p_hdr.flags = 0xff;\n        if (page_offs == 0 && to_write == SPIFFS_DATA_PAGE_SIZE(fs))\n        {\n            // a full page, allocate and write a new page of data\n            res = spiffs_page_allocate_data(fs, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG,\n                                            &p_hdr, &data[written], to_write, page_offs, 1, &data_pix);\n            SPIFFS_DBG(\"modify: store new data page, \"_SPIPRIpg\":\"_SPIPRIsp\" offset:\"_SPIPRIi\", len \"_SPIPRIi\", written \"_SPIPRIi\"\\n\", data_pix, data_spix, page_offs, to_write, written);\n        }\n        else\n        {\n            // write to existing page, allocate new and copy unmodified data\n\n            res = spiffs_page_data_check(fs, fd, orig_data_pix, data_spix);\n            SPIFFS_CHECK_RES(res);\n\n            res = spiffs_page_allocate_data(fs, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG,\n                                            &p_hdr, 0, 0, 0, 0, &data_pix);\n            if (res != SPIFFS_OK) break;\n\n            // copy unmodified data\n            if (page_offs > 0)\n            {\n                // before modification\n                res = spiffs_phys_cpy(fs, fd->file_nbr,\n                                      SPIFFS_PAGE_TO_PADDR(fs, data_pix) + sizeof(spiffs_page_header),\n                                      SPIFFS_PAGE_TO_PADDR(fs, orig_data_pix) + sizeof(spiffs_page_header),\n                                      page_offs);\n                if (res != SPIFFS_OK) break;\n            }\n            if (page_offs + to_write < SPIFFS_DATA_PAGE_SIZE(fs))\n            {\n                // after modification\n                res = spiffs_phys_cpy(fs, fd->file_nbr,\n                                      SPIFFS_PAGE_TO_PADDR(fs, data_pix) + sizeof(spiffs_page_header) + page_offs + to_write,\n                                      SPIFFS_PAGE_TO_PADDR(fs, orig_data_pix) + sizeof(spiffs_page_header) + page_offs + to_write,\n                                      SPIFFS_DATA_PAGE_SIZE(fs) - (page_offs + to_write));\n                if (res != SPIFFS_OK) break;\n            }\n\n            res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                             fd->file_nbr,\n                             SPIFFS_PAGE_TO_PADDR(fs, data_pix) + sizeof(spiffs_page_header) + page_offs, to_write, &data[written]);\n            if (res != SPIFFS_OK) break;\n            p_hdr.flags &= ~SPIFFS_PH_FLAG_FINAL;\n            res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                             fd->file_nbr,\n                             SPIFFS_PAGE_TO_PADDR(fs, data_pix) + offsetof(spiffs_page_header, flags),\n                             sizeof(u8_t),\n                             (u8_t *)&p_hdr.flags);\n            if (res != SPIFFS_OK) break;\n\n            SPIFFS_DBG(\"modify: store to existing data page, src:\"_SPIPRIpg\", dst:\"_SPIPRIpg\":\"_SPIPRIsp\" offset:\"_SPIPRIi\", len \"_SPIPRIi\", written \"_SPIPRIi\"\\n\", orig_data_pix, data_pix, data_spix, page_offs, to_write, written);\n        }\n\n        // delete original data page\n        res = spiffs_page_delete(fs, orig_data_pix);\n        if (res != SPIFFS_OK) break;\n        // update memory representation of object index page with new data page\n        if (cur_objix_spix == 0)\n        {\n            // update object index header page\n            ((spiffs_page_ix *)((u8_t *)objix_hdr + sizeof(spiffs_page_object_ix_header)))[data_spix] = data_pix;\n            SPIFFS_DBG(\"modify: wrote page \"_SPIPRIpg\" to objix_hdr entry \"_SPIPRIsp\" in mem\\n\", data_pix, data_spix);\n        }\n        else\n        {\n            // update object index page\n            ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)] = data_pix;\n            SPIFFS_DBG(\"modify: wrote page \"_SPIPRIpg\" to objix entry \"_SPIPRIsp\" in mem\\n\", data_pix, (spiffs_span_ix)SPIFFS_OBJ_IX_ENTRY(fs, data_spix));\n        }\n\n        // update internals\n        page_offs = 0;\n        data_spix++;\n        written += to_write;\n    } // while all data\n\n    fd->offset = offset + written;\n    fd->cursor_objix_pix = cur_objix_pix;\n    fd->cursor_objix_spix = cur_objix_spix;\n\n    // finalize updated object indices\n    s32_t res2 = SPIFFS_OK;\n    if (cur_objix_spix != 0)\n    {\n        // wrote beyond object index header page\n        // write last modified object index page\n        // move and update page\n        spiffs_page_ix new_objix_pix;\n\n        res2 = spiffs_page_index_check(fs, fd, cur_objix_pix, cur_objix_spix);\n        SPIFFS_CHECK_RES(res2);\n\n        res2 = spiffs_page_move(fs, fd->file_nbr, (u8_t *)objix, fd->obj_id, 0, cur_objix_pix, &new_objix_pix);\n        SPIFFS_DBG(\"modify: store modified objix page, \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", new_objix_pix, cur_objix_spix, written);\n        fd->cursor_objix_pix = new_objix_pix;\n        fd->cursor_objix_spix = cur_objix_spix;\n        SPIFFS_CHECK_RES(res2);\n        spiffs_cb_object_event(fs, (spiffs_page_object_ix *)objix,\n                               SPIFFS_EV_IX_UPD, fd->obj_id, objix->p_hdr.span_ix, new_objix_pix, 0);\n\n    }\n    else\n    {\n        // wrote within object index header page\n        res2 = spiffs_object_update_index_hdr(fs, fd, fd->obj_id,\n                                              fd->objix_hdr_pix, fs->work, 0, 0, 0, &new_objix_hdr_pix);\n        SPIFFS_DBG(\"modify: store modified objix_hdr page, \"_SPIPRIpg\":\"_SPIPRIsp\", written \"_SPIPRIi\"\\n\", new_objix_hdr_pix, 0, written);\n        SPIFFS_CHECK_RES(res2);\n    }\n\n    return res;\n} // spiffs_object_modify\n#endif // !SPIFFS_READ_ONLY\n\nstatic s32_t spiffs_object_find_object_index_header_by_name_v(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_block_ix bix,\n    int ix_entry,\n    const void *user_const_p,\n    void *user_var_p)\n{\n    (void)user_var_p;\n    s32_t res;\n    spiffs_page_object_ix_header objix_hdr;\n    spiffs_page_ix pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, ix_entry);\n    if (obj_id == SPIFFS_OBJ_ID_FREE || obj_id == SPIFFS_OBJ_ID_DELETED ||\n            (obj_id & SPIFFS_OBJ_ID_IX_FLAG) == 0)\n    {\n        return SPIFFS_VIS_COUNTINUE;\n    }\n    res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                     0, SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix_header), (u8_t *)&objix_hdr);\n    SPIFFS_CHECK_RES(res);\n    if (objix_hdr.p_hdr.span_ix == 0 &&\n            (objix_hdr.p_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) ==\n            (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE))\n    {\n        if (strcmp((const char *)user_const_p, (char *)objix_hdr.name) == 0)\n        {\n            return SPIFFS_OK;\n        }\n    }\n\n    return SPIFFS_VIS_COUNTINUE;\n}\n\n// Finds object index header page by name\ns32_t spiffs_object_find_object_index_header_by_name(\n    spiffs *fs,\n    const u8_t name[SPIFFS_OBJ_NAME_LEN],\n    spiffs_page_ix *pix)\n{\n    s32_t res;\n    spiffs_block_ix bix;\n    int entry;\n\n    res = spiffs_obj_lu_find_entry_visitor(fs,\n                                           fs->cursor_block_ix,\n                                           fs->cursor_obj_lu_entry,\n                                           0,\n                                           0,\n                                           spiffs_object_find_object_index_header_by_name_v,\n                                           name,\n                                           0,\n                                           &bix,\n                                           &entry);\n\n    if (res == SPIFFS_VIS_END)\n    {\n        res = SPIFFS_ERR_NOT_FOUND;\n    }\n    SPIFFS_CHECK_RES(res);\n\n    if (pix)\n    {\n        *pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, entry);\n    }\n\n    fs->cursor_block_ix = bix;\n    fs->cursor_obj_lu_entry = entry;\n\n    return res;\n}\n\n#if !SPIFFS_READ_ONLY\n// Truncates object to new size. If new size is null, object may be removed totally\ns32_t spiffs_object_truncate(\n    spiffs_fd *fd,\n    u32_t new_size,\n    u8_t remove_full)\n{\n    s32_t res = SPIFFS_OK;\n    spiffs *fs = fd->fs;\n\n    if ((fd->size == SPIFFS_UNDEFINED_LEN || fd->size == 0) && !remove_full)\n    {\n        // no op\n        return res;\n    }\n\n    // need 2 pages if not removing: object index page + possibly chopped data page\n    if (remove_full == 0)\n    {\n        res = spiffs_gc_check(fs, SPIFFS_DATA_PAGE_SIZE(fs) * 2);\n        SPIFFS_CHECK_RES(res);\n    }\n\n    spiffs_page_ix objix_pix = fd->objix_hdr_pix;\n    spiffs_span_ix data_spix = (fd->size > 0 ? fd->size - 1 : 0) / SPIFFS_DATA_PAGE_SIZE(fs);\n    u32_t cur_size = fd->size == (u32_t)SPIFFS_UNDEFINED_LEN ? 0 : fd->size ;\n    spiffs_span_ix cur_objix_spix = 0;\n    spiffs_span_ix prev_objix_spix = (spiffs_span_ix) - 1;\n    spiffs_page_object_ix_header *objix_hdr = (spiffs_page_object_ix_header *)fs->work;\n    spiffs_page_object_ix *objix = (spiffs_page_object_ix *)fs->work;\n    spiffs_page_ix data_pix;\n    spiffs_page_ix new_objix_hdr_pix;\n\n    // before truncating, check if object is to be fully removed and mark this\n    if (remove_full && new_size == 0)\n    {\n        u8_t flags = ~( SPIFFS_PH_FLAG_USED | SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE);\n        res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_UPDT,\n                         fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, fd->objix_hdr_pix) + offsetof(spiffs_page_header, flags),\n                         sizeof(u8_t),\n                         (u8_t *)&flags);\n        SPIFFS_CHECK_RES(res);\n    }\n\n    // delete from end of object until desired len is reached\n    while (cur_size > new_size)\n    {\n        cur_objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix);\n\n        // put object index for current data span index in work buffer\n        if (prev_objix_spix != cur_objix_spix)\n        {\n            if (prev_objix_spix != (spiffs_span_ix) - 1)\n            {\n                // remove previous object index page\n                SPIFFS_DBG(\"truncate: delete objix page \"_SPIPRIpg\":\"_SPIPRIsp\"\\n\", objix_pix, prev_objix_spix);\n\n                res = spiffs_page_index_check(fs, fd, objix_pix, prev_objix_spix);\n                SPIFFS_CHECK_RES(res);\n\n                res = spiffs_page_delete(fs, objix_pix);\n                SPIFFS_CHECK_RES(res);\n                spiffs_cb_object_event(fs, (spiffs_page_object_ix *)0,\n                                       SPIFFS_EV_IX_DEL, fd->obj_id, objix->p_hdr.span_ix, objix_pix, 0);\n                if (prev_objix_spix > 0)\n                {\n                    // Update object index header page, unless we totally want to remove the file.\n                    // If fully removing, we're not keeping consistency as good as when storing the header between chunks,\n                    // would we be aborted. But when removing full files, a crammed system may otherwise\n                    // report ERR_FULL a la windows. We cannot have that.\n                    // Hence, take the risk - if aborted, a file check would free the lost pages and mend things\n                    // as the file is marked as fully deleted in the beginning.\n                    if (remove_full == 0)\n                    {\n                        SPIFFS_DBG(\"truncate: update objix hdr page \"_SPIPRIpg\":\"_SPIPRIsp\" to size \"_SPIPRIi\"\\n\", fd->objix_hdr_pix, prev_objix_spix, cur_size);\n                        res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id,\n                                                             fd->objix_hdr_pix, 0, 0, 0, cur_size, &new_objix_hdr_pix);\n                        SPIFFS_CHECK_RES(res);\n                    }\n                    fd->size = cur_size;\n                }\n            }\n            // load current object index (header) page\n            if (cur_objix_spix == 0)\n            {\n                objix_pix = fd->objix_hdr_pix;\n            }\n            else\n            {\n                res = spiffs_obj_lu_find_id_and_span(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, 0, &objix_pix);\n                SPIFFS_CHECK_RES(res);\n            }\n\n            SPIFFS_DBG(\"truncate: load objix page \"_SPIPRIpg\":\"_SPIPRIsp\" for data spix:\"_SPIPRIsp\"\\n\", objix_pix, cur_objix_spix, data_spix);\n            res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ,\n                             fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n            SPIFFS_CHECK_RES(res);\n            SPIFFS_VALIDATE_OBJIX(objix_hdr->p_hdr, fd->obj_id, cur_objix_spix);\n            fd->cursor_objix_pix = objix_pix;\n            fd->cursor_objix_spix = cur_objix_spix;\n            fd->offset = cur_size;\n\n            prev_objix_spix = cur_objix_spix;\n        }\n\n        if (cur_objix_spix == 0)\n        {\n            // get data page from object index header page\n            data_pix = ((spiffs_page_ix *)((u8_t *)objix_hdr + sizeof(spiffs_page_object_ix_header)))[data_spix];\n            ((spiffs_page_ix *)((u8_t *)objix_hdr + sizeof(spiffs_page_object_ix_header)))[data_spix] = SPIFFS_OBJ_ID_FREE;\n        }\n        else\n        {\n            // get data page from object index page\n            data_pix = ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)];\n            ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)] = SPIFFS_OBJ_ID_FREE;\n        }\n\n        SPIFFS_DBG(\"truncate: got data pix \"_SPIPRIpg\"\\n\", data_pix);\n\n        if (new_size == 0 || remove_full || cur_size - new_size >= SPIFFS_DATA_PAGE_SIZE(fs))\n        {\n            // delete full data page\n            res = spiffs_page_data_check(fs, fd, data_pix, data_spix);\n            if (res != SPIFFS_ERR_DELETED && res != SPIFFS_OK && res != SPIFFS_ERR_INDEX_REF_FREE)\n            {\n                SPIFFS_DBG(\"truncate: err validating data pix \"_SPIPRIi\"\\n\", res);\n                break;\n            }\n\n            if (res == SPIFFS_OK)\n            {\n                res = spiffs_page_delete(fs, data_pix);\n                if (res != SPIFFS_OK)\n                {\n                    SPIFFS_DBG(\"truncate: err deleting data pix \"_SPIPRIi\"\\n\", res);\n                    break;\n                }\n            }\n            else if (res == SPIFFS_ERR_DELETED || res == SPIFFS_ERR_INDEX_REF_FREE)\n            {\n                res = SPIFFS_OK;\n            }\n\n            // update current size\n            if (cur_size % SPIFFS_DATA_PAGE_SIZE(fs) == 0)\n            {\n                cur_size -= SPIFFS_DATA_PAGE_SIZE(fs);\n            }\n            else\n            {\n                cur_size -= cur_size % SPIFFS_DATA_PAGE_SIZE(fs);\n            }\n            fd->size = cur_size;\n            fd->offset = cur_size;\n            SPIFFS_DBG(\"truncate: delete data page \"_SPIPRIpg\" for data spix:\"_SPIPRIsp\", cur_size:\"_SPIPRIi\"\\n\", data_pix, data_spix, cur_size);\n        }\n        else\n        {\n            // delete last page, partially\n            spiffs_page_header p_hdr;\n            spiffs_page_ix new_data_pix;\n            u32_t bytes_to_remove = SPIFFS_DATA_PAGE_SIZE(fs) - (new_size % SPIFFS_DATA_PAGE_SIZE(fs));\n            SPIFFS_DBG(\"truncate: delete \"_SPIPRIi\" bytes from data page \"_SPIPRIpg\" for data spix:\"_SPIPRIsp\", cur_size:\"_SPIPRIi\"\\n\", bytes_to_remove, data_pix, data_spix, cur_size);\n\n            res = spiffs_page_data_check(fs, fd, data_pix, data_spix);\n            if (res != SPIFFS_OK) break;\n\n            p_hdr.obj_id = fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG;\n            p_hdr.span_ix = data_spix;\n            p_hdr.flags = 0xff;\n            // allocate new page and copy unmodified data\n            res = spiffs_page_allocate_data(fs, fd->obj_id & ~SPIFFS_OBJ_ID_IX_FLAG,\n                                            &p_hdr, 0, 0, 0, 0, &new_data_pix);\n            if (res != SPIFFS_OK) break;\n            res = spiffs_phys_cpy(fs, 0,\n                                  SPIFFS_PAGE_TO_PADDR(fs, new_data_pix) + sizeof(spiffs_page_header),\n                                  SPIFFS_PAGE_TO_PADDR(fs, data_pix) + sizeof(spiffs_page_header),\n                                  SPIFFS_DATA_PAGE_SIZE(fs) - bytes_to_remove);\n            if (res != SPIFFS_OK) break;\n            // delete original data page\n            res = spiffs_page_delete(fs, data_pix);\n            if (res != SPIFFS_OK) break;\n            p_hdr.flags &= ~SPIFFS_PH_FLAG_FINAL;\n            res = _spiffs_wr(fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_UPDT,\n                             fd->file_nbr,\n                             SPIFFS_PAGE_TO_PADDR(fs, new_data_pix) + offsetof(spiffs_page_header, flags),\n                             sizeof(u8_t),\n                             (u8_t *)&p_hdr.flags);\n            if (res != SPIFFS_OK) break;\n\n            // update memory representation of object index page with new data page\n            if (cur_objix_spix == 0)\n            {\n                // update object index header page\n                ((spiffs_page_ix *)((u8_t *)objix_hdr + sizeof(spiffs_page_object_ix_header)))[data_spix] = new_data_pix;\n                SPIFFS_DBG(\"truncate: wrote page \"_SPIPRIpg\" to objix_hdr entry \"_SPIPRIsp\" in mem\\n\", new_data_pix, (spiffs_span_ix)SPIFFS_OBJ_IX_ENTRY(fs, data_spix));\n            }\n            else\n            {\n                // update object index page\n                ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)] = new_data_pix;\n                SPIFFS_DBG(\"truncate: wrote page \"_SPIPRIpg\" to objix entry \"_SPIPRIsp\" in mem\\n\", new_data_pix, (spiffs_span_ix)SPIFFS_OBJ_IX_ENTRY(fs, data_spix));\n            }\n            cur_size = new_size;\n            fd->size = new_size;\n            fd->offset = cur_size;\n            break;\n        }\n        data_spix--;\n    } // while all data\n\n    // update object indices\n    if (cur_objix_spix == 0)\n    {\n        // update object index header page\n        if (cur_size == 0)\n        {\n            if (remove_full)\n            {\n                // remove object altogether\n                SPIFFS_DBG(\"truncate: remove object index header page \"_SPIPRIpg\"\\n\", objix_pix);\n\n                res = spiffs_page_index_check(fs, fd, objix_pix, 0);\n                SPIFFS_CHECK_RES(res);\n\n                res = spiffs_page_delete(fs, objix_pix);\n                SPIFFS_CHECK_RES(res);\n                spiffs_cb_object_event(fs, (spiffs_page_object_ix *)0,\n                                       SPIFFS_EV_IX_DEL, fd->obj_id, 0, objix_pix, 0);\n            }\n            else\n            {\n                // make uninitialized object\n                SPIFFS_DBG(\"truncate: reset objix_hdr page \"_SPIPRIpg\"\\n\", objix_pix);\n                memset(fs->work + sizeof(spiffs_page_object_ix_header), 0xff,\n                       SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_object_ix_header));\n                res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id,\n                                                     objix_pix, fs->work, 0, 0, SPIFFS_UNDEFINED_LEN, &new_objix_hdr_pix);\n                SPIFFS_CHECK_RES(res);\n            }\n        }\n        else\n        {\n            // update object index header page\n            SPIFFS_DBG(\"truncate: update object index header page with indices and size\\n\");\n            res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id,\n                                                 objix_pix, fs->work, 0, 0, cur_size, &new_objix_hdr_pix);\n            SPIFFS_CHECK_RES(res);\n        }\n    }\n    else\n    {\n        // update both current object index page and object index header page\n        spiffs_page_ix new_objix_pix;\n\n        res = spiffs_page_index_check(fs, fd, objix_pix, cur_objix_spix);\n        SPIFFS_CHECK_RES(res);\n\n        // move and update object index page\n        res = spiffs_page_move(fs, fd->file_nbr, (u8_t *)objix_hdr, fd->obj_id, 0, objix_pix, &new_objix_pix);\n        SPIFFS_CHECK_RES(res);\n        spiffs_cb_object_event(fs, (spiffs_page_object_ix *)objix_hdr,\n                               SPIFFS_EV_IX_UPD, fd->obj_id, objix->p_hdr.span_ix, new_objix_pix, 0);\n        SPIFFS_DBG(\"truncate: store modified objix page, \"_SPIPRIpg\":\"_SPIPRIsp\"\\n\", new_objix_pix, cur_objix_spix);\n        fd->cursor_objix_pix = new_objix_pix;\n        fd->cursor_objix_spix = cur_objix_spix;\n        fd->offset = cur_size;\n        // update object index header page with new size\n        res = spiffs_object_update_index_hdr(fs, fd, fd->obj_id,\n                                             fd->objix_hdr_pix, 0, 0, 0, cur_size, &new_objix_hdr_pix);\n        SPIFFS_CHECK_RES(res);\n    }\n    fd->size = cur_size;\n\n    return res;\n} // spiffs_object_truncate\n#endif // !SPIFFS_READ_ONLY\n\ns32_t spiffs_object_read(\n    spiffs_fd *fd,\n    u32_t offset,\n    u32_t len,\n    u8_t *dst)\n{\n    s32_t res = SPIFFS_OK;\n    spiffs *fs = fd->fs;\n    spiffs_page_ix objix_pix;\n    spiffs_page_ix data_pix;\n    spiffs_span_ix data_spix = offset / SPIFFS_DATA_PAGE_SIZE(fs);\n    u32_t cur_offset = offset;\n    spiffs_span_ix cur_objix_spix;\n    spiffs_span_ix prev_objix_spix = (spiffs_span_ix) - 1;\n    spiffs_page_object_ix_header *objix_hdr = (spiffs_page_object_ix_header *)fs->work;\n    spiffs_page_object_ix *objix = (spiffs_page_object_ix *)fs->work;\n\n    while (cur_offset < offset + len)\n    {\n#if SPIFFS_IX_MAP\n        // check if we have a memory, index map and if so, if we're within index map's range\n        // and if so, if the entry is populated\n        if (fd->ix_map && data_spix >= fd->ix_map->start_spix && data_spix <= fd->ix_map->end_spix\n                && fd->ix_map->map_buf[data_spix - fd->ix_map->start_spix])\n        {\n            data_pix = fd->ix_map->map_buf[data_spix - fd->ix_map->start_spix];\n        }\n        else\n        {\n#endif\n            cur_objix_spix = SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, data_spix);\n            if (prev_objix_spix != cur_objix_spix)\n            {\n                // load current object index (header) page\n                if (cur_objix_spix == 0)\n                {\n                    objix_pix = fd->objix_hdr_pix;\n                }\n                else\n                {\n                    SPIFFS_DBG(\"read: find objix \"_SPIPRIid\":\"_SPIPRIsp\"\\n\", fd->obj_id, cur_objix_spix);\n                    if (fd->cursor_objix_spix == cur_objix_spix)\n                    {\n                        objix_pix = fd->cursor_objix_pix;\n                    }\n                    else\n                    {\n                        res = spiffs_obj_lu_find_id_and_span(fs, fd->obj_id | SPIFFS_OBJ_ID_IX_FLAG, cur_objix_spix, 0, &objix_pix);\n                        SPIFFS_CHECK_RES(res);\n                    }\n                }\n                SPIFFS_DBG(\"read: load objix page \"_SPIPRIpg\":\"_SPIPRIsp\" for data spix:\"_SPIPRIsp\"\\n\", objix_pix, cur_objix_spix, data_spix);\n                res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_IX | SPIFFS_OP_C_READ,\n                                 fd->file_nbr, SPIFFS_PAGE_TO_PADDR(fs, objix_pix), SPIFFS_CFG_LOG_PAGE_SZ(fs), fs->work);\n                SPIFFS_CHECK_RES(res);\n                SPIFFS_VALIDATE_OBJIX(objix->p_hdr, fd->obj_id, cur_objix_spix);\n\n                fd->offset = cur_offset;\n                fd->cursor_objix_pix = objix_pix;\n                fd->cursor_objix_spix = cur_objix_spix;\n\n                prev_objix_spix = cur_objix_spix;\n            }\n\n            if (cur_objix_spix == 0)\n            {\n                // get data page from object index header page\n                data_pix = ((spiffs_page_ix *)((u8_t *)objix_hdr + sizeof(spiffs_page_object_ix_header)))[data_spix];\n            }\n            else\n            {\n                // get data page from object index page\n                data_pix = ((spiffs_page_ix *)((u8_t *)objix + sizeof(spiffs_page_object_ix)))[SPIFFS_OBJ_IX_ENTRY(fs, data_spix)];\n            }\n#if SPIFFS_IX_MAP\n        }\n#endif\n        // all remaining data\n        u32_t len_to_read = offset + len - cur_offset;\n        // remaining data in page\n        len_to_read = MIN(len_to_read, SPIFFS_DATA_PAGE_SIZE(fs) - (cur_offset % SPIFFS_DATA_PAGE_SIZE(fs)));\n        // remaining data in file\n        len_to_read = MIN(len_to_read, fd->size);\n        SPIFFS_DBG(\"read: offset:\"_SPIPRIi\" rd:\"_SPIPRIi\" data spix:\"_SPIPRIsp\" is data_pix:\"_SPIPRIpg\" addr:\"_SPIPRIad\"\\n\", cur_offset, len_to_read, data_spix, data_pix,\n                   (u32_t)(SPIFFS_PAGE_TO_PADDR(fs, data_pix) + sizeof(spiffs_page_header) + (cur_offset % SPIFFS_DATA_PAGE_SIZE(fs))));\n        if (len_to_read <= 0)\n        {\n            res = SPIFFS_ERR_END_OF_OBJECT;\n            break;\n        }\n        res = spiffs_page_data_check(fs, fd, data_pix, data_spix);\n        SPIFFS_CHECK_RES(res);\n        res = _spiffs_rd(\n                  fs, SPIFFS_OP_T_OBJ_DA | SPIFFS_OP_C_READ,\n                  fd->file_nbr,\n                  SPIFFS_PAGE_TO_PADDR(fs, data_pix) + sizeof(spiffs_page_header) + (cur_offset % SPIFFS_DATA_PAGE_SIZE(fs)),\n                  len_to_read,\n                  dst);\n        SPIFFS_CHECK_RES(res);\n        dst += len_to_read;\n        cur_offset += len_to_read;\n        fd->offset = cur_offset;\n        data_spix++;\n    }\n\n    return res;\n}\n\n#if !SPIFFS_READ_ONLY\ntypedef struct\n{\n    spiffs_obj_id min_obj_id;\n    spiffs_obj_id max_obj_id;\n    u32_t compaction;\n    const u8_t *conflicting_name;\n} spiffs_free_obj_id_state;\n\nstatic s32_t spiffs_obj_lu_find_free_obj_id_bitmap_v(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry,\n        const void *user_const_p, void *user_var_p)\n{\n    if (id != SPIFFS_OBJ_ID_FREE && id != SPIFFS_OBJ_ID_DELETED)\n    {\n        spiffs_obj_id min_obj_id = *((spiffs_obj_id *)user_var_p);\n        const u8_t *conflicting_name = (const u8_t *)user_const_p;\n\n        // if conflicting name parameter is given, also check if this name is found in object index hdrs\n        if (conflicting_name && (id & SPIFFS_OBJ_ID_IX_FLAG))\n        {\n            spiffs_page_ix pix = SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, bix, ix_entry);\n            int res;\n            spiffs_page_object_ix_header objix_hdr;\n            res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                             0, SPIFFS_PAGE_TO_PADDR(fs, pix), sizeof(spiffs_page_object_ix_header), (u8_t *)&objix_hdr);\n            SPIFFS_CHECK_RES(res);\n            if (objix_hdr.p_hdr.span_ix == 0 &&\n                    (objix_hdr.p_hdr.flags & (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_IXDELE)) ==\n                    (SPIFFS_PH_FLAG_DELET | SPIFFS_PH_FLAG_IXDELE))\n            {\n                if (strcmp((const char *)user_const_p, (char *)objix_hdr.name) == 0)\n                {\n                    return SPIFFS_ERR_CONFLICTING_NAME;\n                }\n            }\n        }\n\n        id &= ~SPIFFS_OBJ_ID_IX_FLAG;\n        u32_t bit_ix = (id - min_obj_id) & 7;\n        int byte_ix = (id - min_obj_id) >> 3;\n        if (byte_ix >= 0 && (u32_t)byte_ix < SPIFFS_CFG_LOG_PAGE_SZ(fs))\n        {\n            fs->work[byte_ix] |= (1 << bit_ix);\n        }\n    }\n    return SPIFFS_VIS_COUNTINUE;\n}\n\nstatic s32_t spiffs_obj_lu_find_free_obj_id_compact_v(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry,\n        const void *user_const_p, void *user_var_p)\n{\n    (void)user_var_p;\n    if (id != SPIFFS_OBJ_ID_FREE && id != SPIFFS_OBJ_ID_DELETED && (id & SPIFFS_OBJ_ID_IX_FLAG))\n    {\n        s32_t res;\n        const spiffs_free_obj_id_state *state = (const spiffs_free_obj_id_state *)user_const_p;\n        spiffs_page_object_ix_header objix_hdr;\n\n        res = _spiffs_rd(fs, SPIFFS_OP_T_OBJ_LU2 | SPIFFS_OP_C_READ,\n                         0, SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, bix, ix_entry), sizeof(spiffs_page_object_ix_header), (u8_t *)&objix_hdr);\n        if (res == SPIFFS_OK && objix_hdr.p_hdr.span_ix == 0 &&\n                ((objix_hdr.p_hdr.flags & (SPIFFS_PH_FLAG_INDEX | SPIFFS_PH_FLAG_FINAL | SPIFFS_PH_FLAG_DELET)) ==\n                 (SPIFFS_PH_FLAG_DELET)))\n        {\n            // ok object look up entry\n            if (state->conflicting_name && strcmp((const char *)state->conflicting_name, (char *)objix_hdr.name) == 0)\n            {\n                return SPIFFS_ERR_CONFLICTING_NAME;\n            }\n\n            id &= ~SPIFFS_OBJ_ID_IX_FLAG;\n            if (id >= state->min_obj_id && id <= state->max_obj_id)\n            {\n                u8_t *map = (u8_t *)fs->work;\n                int ix = (id - state->min_obj_id) / state->compaction;\n                //SPIFFS_DBG(\"free_obj_id: add ix \"_SPIPRIi\" for id \"_SPIPRIid\" min\"_SPIPRIid\" max\"_SPIPRIid\" comp:\"_SPIPRIi\"\\n\", ix, id, state->min_obj_id, state->max_obj_id, state->compaction);\n                map[ix]++;\n            }\n        }\n    }\n    return SPIFFS_VIS_COUNTINUE;\n}\n\n// Scans thru all object lookup for object index header pages. If total possible number of\n// object ids cannot fit into a work buffer, these are grouped. When a group containing free\n// object ids is found, the object lu is again scanned for object ids within group and bitmasked.\n// Finally, the bitmask is searched for a free id\ns32_t spiffs_obj_lu_find_free_obj_id(spiffs *fs, spiffs_obj_id *obj_id, const u8_t *conflicting_name)\n{\n    s32_t res = SPIFFS_OK;\n    u32_t max_objects = (fs->block_count * SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs)) / 2;\n    spiffs_free_obj_id_state state;\n    spiffs_obj_id free_obj_id = SPIFFS_OBJ_ID_FREE;\n    state.min_obj_id = 1;\n    state.max_obj_id = max_objects + 1;\n    if (state.max_obj_id & SPIFFS_OBJ_ID_IX_FLAG)\n    {\n        state.max_obj_id = ((spiffs_obj_id) - 1) & ~SPIFFS_OBJ_ID_IX_FLAG;\n    }\n    state.compaction = 0;\n    state.conflicting_name = conflicting_name;\n    while (res == SPIFFS_OK && free_obj_id == SPIFFS_OBJ_ID_FREE)\n    {\n        if (state.max_obj_id - state.min_obj_id <= (spiffs_obj_id)SPIFFS_CFG_LOG_PAGE_SZ(fs) * 8)\n        {\n            // possible to represent in bitmap\n            u32_t i, j;\n            SPIFFS_DBG(\"free_obj_id: BITM min:\"_SPIPRIid\" max:\"_SPIPRIid\"\\n\", state.min_obj_id, state.max_obj_id);\n\n            memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs));\n            res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_obj_lu_find_free_obj_id_bitmap_v,\n                                                   conflicting_name, &state.min_obj_id, 0, 0);\n            if (res == SPIFFS_VIS_END) res = SPIFFS_OK;\n            SPIFFS_CHECK_RES(res);\n            // traverse bitmask until found free obj_id\n            for (i = 0; i < SPIFFS_CFG_LOG_PAGE_SZ(fs); i++)\n            {\n                u8_t mask = fs->work[i];\n                if (mask == 0xff)\n                {\n                    continue;\n                }\n                for (j = 0; j < 8; j++)\n                {\n                    if ((mask & (1 << j)) == 0)\n                    {\n                        *obj_id = (i << 3) + j + state.min_obj_id;\n                        return SPIFFS_OK;\n                    }\n                }\n            }\n            return SPIFFS_ERR_FULL;\n        }\n        else\n        {\n            // not possible to represent all ids in range in a bitmap, compact and count\n            if (state.compaction != 0)\n            {\n                // select element in compacted table, decrease range and recompact\n                u32_t i, min_i = 0;\n                u8_t *map = (u8_t *)fs->work;\n                u8_t min_count = 0xff;\n\n                for (i = 0; i < SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(u8_t); i++)\n                {\n                    if (map[i] < min_count)\n                    {\n                        min_count = map[i];\n                        min_i = i;\n                        if (min_count == 0)\n                        {\n                            break;\n                        }\n                    }\n                }\n\n                if (min_count == state.compaction)\n                {\n                    // there are no free objids!\n                    SPIFFS_DBG(\"free_obj_id: compacted table is full\\n\");\n                    return SPIFFS_ERR_FULL;\n                }\n\n                SPIFFS_DBG(\"free_obj_id: COMP select index:\"_SPIPRIi\" min_count:\"_SPIPRIi\" min:\"_SPIPRIid\" max:\"_SPIPRIid\" compact:\"_SPIPRIi\"\\n\", min_i, min_count, state.min_obj_id, state.max_obj_id, state.compaction);\n\n                if (min_count == 0)\n                {\n                    // no id in this range, skip compacting and use directly\n                    *obj_id = min_i * state.compaction + state.min_obj_id;\n                    return SPIFFS_OK;\n                }\n                else\n                {\n                    SPIFFS_DBG(\"free_obj_id: COMP SEL chunk:\"_SPIPRIi\" min:\"_SPIPRIid\" -> \"_SPIPRIid\"\\n\", state.compaction, state.min_obj_id, state.min_obj_id + min_i *  state.compaction);\n                    state.min_obj_id += min_i *  state.compaction;\n                    state.max_obj_id = state.min_obj_id + state.compaction;\n                    // decrease compaction\n                }\n                if ((state.max_obj_id - state.min_obj_id <= (spiffs_obj_id)SPIFFS_CFG_LOG_PAGE_SZ(fs) * 8))\n                {\n                    // no need for compacting, use bitmap\n                    continue;\n                }\n            }\n            // in a work memory of log_page_size bytes, we may fit in log_page_size ids\n            // todo what if compaction is > 255 - then we cannot fit it in a byte\n            state.compaction = (state.max_obj_id - state.min_obj_id) / ((SPIFFS_CFG_LOG_PAGE_SZ(fs) / sizeof(u8_t)));\n            SPIFFS_DBG(\"free_obj_id: COMP min:\"_SPIPRIid\" max:\"_SPIPRIid\" compact:\"_SPIPRIi\"\\n\", state.min_obj_id, state.max_obj_id, state.compaction);\n\n            memset(fs->work, 0, SPIFFS_CFG_LOG_PAGE_SZ(fs));\n            res = spiffs_obj_lu_find_entry_visitor(fs, 0, 0, 0, 0, spiffs_obj_lu_find_free_obj_id_compact_v, &state, 0, 0, 0);\n            if (res == SPIFFS_VIS_END) res = SPIFFS_OK;\n            SPIFFS_CHECK_RES(res);\n            state.conflicting_name = 0; // searched for conflicting name once, no need to do it again\n        }\n    }\n\n    return res;\n}\n#endif // !SPIFFS_READ_ONLY\n\n#if SPIFFS_TEMPORAL_FD_CACHE\n// djb2 hash\nstatic u32_t spiffs_hash(spiffs *fs, const u8_t *name)\n{\n    (void)fs;\n    u32_t hash = 5381;\n    u8_t c;\n    int i = 0;\n    while (0 != (c = name[i++]) && i < SPIFFS_OBJ_NAME_LEN)\n    {\n        hash = (hash * 33) ^ c;\n    }\n    return hash;\n}\n#endif\n\ns32_t spiffs_fd_find_new(spiffs *fs, spiffs_fd **fd, const char *name)\n{\n#if SPIFFS_TEMPORAL_FD_CACHE\n    u32_t i;\n    u16_t min_score = 0xffff;\n    u32_t cand_ix = (u32_t) - 1;\n    u32_t name_hash = name ? spiffs_hash(fs, (const u8_t *)name) : 0;\n    spiffs_fd *fds = (spiffs_fd *)fs->fd_space;\n\n    if (name)\n    {\n        // first, decrease score of all closed descriptors\n        for (i = 0; i < fs->fd_count; i++)\n        {\n            spiffs_fd *cur_fd = &fds[i];\n            if (cur_fd->file_nbr == 0)\n            {\n                if (cur_fd->score > 1)   // score == 0 indicates never used fd\n                {\n                    cur_fd->score--;\n                }\n            }\n        }\n    }\n\n    // find the free fd with least score or name match\n    for (i = 0; i < fs->fd_count; i++)\n    {\n        spiffs_fd *cur_fd = &fds[i];\n        if (cur_fd->file_nbr == 0)\n        {\n            if (name && cur_fd->name_hash == name_hash)\n            {\n                cand_ix = i;\n                break;\n            }\n            if (cur_fd->score < min_score)\n            {\n                min_score = cur_fd->score;\n                cand_ix = i;\n            }\n        }\n    }\n\n    if (cand_ix != (u32_t) - 1)\n    {\n        spiffs_fd *cur_fd = &fds[cand_ix];\n        if (name)\n        {\n            if (cur_fd->name_hash == name_hash && cur_fd->score > 0)\n            {\n                // opened an fd with same name hash, assume same file\n                // set search point to saved obj index page and hope we have a correct match directly\n                // when start searching - if not, we will just keep searching until it is found\n                fs->cursor_block_ix = SPIFFS_BLOCK_FOR_PAGE(fs, cur_fd->objix_hdr_pix);\n                fs->cursor_obj_lu_entry = SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, cur_fd->objix_hdr_pix);\n                // update score\n                if (cur_fd->score < 0xffff - SPIFFS_TEMPORAL_CACHE_HIT_SCORE)\n                {\n                    cur_fd->score += SPIFFS_TEMPORAL_CACHE_HIT_SCORE;\n                }\n                else\n                {\n                    cur_fd->score = 0xffff;\n                }\n            }\n            else\n            {\n                // no hash hit, restore this fd to initial state\n                cur_fd->score = SPIFFS_TEMPORAL_CACHE_HIT_SCORE;\n                cur_fd->name_hash = name_hash;\n            }\n        }\n        cur_fd->file_nbr = cand_ix + 1;\n        *fd = cur_fd;\n        return SPIFFS_OK;\n    }\n    else\n    {\n        return SPIFFS_ERR_OUT_OF_FILE_DESCS;\n    }\n#else\n    (void)name;\n    u32_t i;\n    spiffs_fd *fds = (spiffs_fd *)fs->fd_space;\n    for (i = 0; i < fs->fd_count; i++)\n    {\n        spiffs_fd *cur_fd = &fds[i];\n        if (cur_fd->file_nbr == 0)\n        {\n            cur_fd->file_nbr = i + 1;\n            *fd = cur_fd;\n            return SPIFFS_OK;\n        }\n    }\n    return SPIFFS_ERR_OUT_OF_FILE_DESCS;\n#endif\n}\n\ns32_t spiffs_fd_return(spiffs *fs, spiffs_file f)\n{\n    if (f <= 0 || f > (s16_t)fs->fd_count)\n    {\n        return SPIFFS_ERR_BAD_DESCRIPTOR;\n    }\n    spiffs_fd *fds = (spiffs_fd *)fs->fd_space;\n    spiffs_fd *fd = &fds[f - 1];\n    if (fd->file_nbr == 0)\n    {\n        return SPIFFS_ERR_FILE_CLOSED;\n    }\n    fd->file_nbr = 0;\n#if SPIFFS_IX_MAP\n    fd->ix_map = 0;\n#endif\n    return SPIFFS_OK;\n}\n\ns32_t spiffs_fd_get(spiffs *fs, spiffs_file f, spiffs_fd **fd)\n{\n    if (f <= 0 || f > (s16_t)fs->fd_count)\n    {\n        return SPIFFS_ERR_BAD_DESCRIPTOR;\n    }\n    spiffs_fd *fds = (spiffs_fd *)fs->fd_space;\n    *fd = &fds[f - 1];\n    if ((*fd)->file_nbr == 0)\n    {\n        return SPIFFS_ERR_FILE_CLOSED;\n    }\n    return SPIFFS_OK;\n}\n\n#if SPIFFS_TEMPORAL_FD_CACHE\nvoid spiffs_fd_temporal_cache_rehash(\n    spiffs *fs,\n    const char *old_path,\n    const char *new_path)\n{\n    u32_t i;\n    u32_t old_hash = spiffs_hash(fs, (const u8_t *)old_path);\n    u32_t new_hash = spiffs_hash(fs, (const u8_t *)new_path);\n    spiffs_fd *fds = (spiffs_fd *)fs->fd_space;\n    for (i = 0; i < fs->fd_count; i++)\n    {\n        spiffs_fd *cur_fd = &fds[i];\n        if (cur_fd->score > 0 && cur_fd->name_hash == old_hash)\n        {\n            cur_fd->name_hash = new_hash;\n        }\n    }\n}\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/spiffs/spiffs_git/src/spiffs_nucleus.h",
    "content": "/*\n * spiffs_nucleus.h\n *\n *  Created on: Jun 15, 2013\n *      Author: petera\n */\n\n/* SPIFFS layout\n *\n * spiffs is designed for following spi flash characteristics:\n *   - only big areas of data (blocks) can be erased\n *   - erasing resets all bits in a block to ones\n *   - writing pulls ones to zeroes\n *   - zeroes cannot be pulled to ones, without erase\n *   - wear leveling\n *\n * spiffs is also meant to be run on embedded, memory constraint devices.\n *\n * Entire area is divided in blocks. Entire area is also divided in pages.\n * Each block contains same number of pages. A page cannot be erased, but a\n * block can be erased.\n *\n * Entire area must be block_size * x\n * page_size must be block_size / (2^y) where y > 2\n *\n * ex: area = 1024*1024 bytes, block size = 65536 bytes, page size = 256 bytes\n *\n * BLOCK 0  PAGE 0       object lookup 1\n *          PAGE 1       object lookup 2\n *          ...\n *          PAGE n-1     object lookup n\n *          PAGE n       object data 1\n *          PAGE n+1     object data 2\n *          ...\n *          PAGE n+m-1   object data m\n *\n * BLOCK 1  PAGE n+m     object lookup 1\n *          PAGE n+m+1   object lookup 2\n *          ...\n *          PAGE 2n+m-1  object lookup n\n *          PAGE 2n+m    object data 1\n *          PAGE 2n+m    object data 2\n *          ...\n *          PAGE 2n+2m-1 object data m\n * ...\n *\n * n is number of object lookup pages, which is number of pages needed to index all pages\n * in a block by object id\n *   : block_size / page_size * sizeof(obj_id) / page_size\n * m is number data pages, which is number of pages in block minus number of lookup pages\n *   : block_size / page_size - block_size / page_size * sizeof(obj_id) / page_size\n * thus, n+m is total number of pages in a block\n *   : block_size / page_size\n *\n * ex: n = 65536/256*2/256 = 2, m = 65536/256 - 2 = 254 => n+m = 65536/256 = 256\n *\n * Object lookup pages contain object id entries. Each entry represent the corresponding\n * data page.\n * Assuming a 16 bit object id, an object id being 0xffff represents a free page.\n * An object id being 0x0000 represents a deleted page.\n *\n * ex: page 0 : lookup : 0008 0001 0aaa ffff ffff ffff ffff ffff ..\n *     page 1 : lookup : ffff ffff ffff ffff ffff ffff ffff ffff ..\n *     page 2 : data   : data for object id 0008\n *     page 3 : data   : data for object id 0001\n *     page 4 : data   : data for object id 0aaa\n *     ...\n *\n *\n * Object data pages can be either object index pages or object content.\n * All object data pages contains a data page header, containing object id and span index.\n * The span index denotes the object page ordering amongst data pages with same object id.\n * This applies to both object index pages (when index spans more than one page of entries),\n * and object data pages.\n * An object index page contains page entries pointing to object content page. The entry index\n * in a object index page correlates to the span index in the actual object data page.\n * The first object index page (span index 0) is called object index header page, and also\n * contains object flags (directory/file), size, object name etc.\n *\n * ex:\n *  BLOCK 1\n *    PAGE 256: objectl lookup page 1\n *      [*123] [ 123] [ 123] [ 123]\n *      [ 123] [*123] [ 123] [ 123]\n *      [free] [free] [free] [free] ...\n *    PAGE 257: objectl lookup page 2\n *      [free] [free] [free] [free] ...\n *    PAGE 258: object index page (header)\n *      obj.id:0123 span.ix:0000 flags:INDEX\n *      size:1600 name:ex.txt type:file\n *      [259] [260] [261] [262]\n *    PAGE 259: object data page\n *      obj.id:0123 span.ix:0000 flags:DATA\n *    PAGE 260: object data page\n *      obj.id:0123 span.ix:0001 flags:DATA\n *    PAGE 261: object data page\n *      obj.id:0123 span.ix:0002 flags:DATA\n *    PAGE 262: object data page\n *      obj.id:0123 span.ix:0003 flags:DATA\n *    PAGE 263: object index page\n *      obj.id:0123 span.ix:0001 flags:INDEX\n *      [264] [265] [fre] [fre]\n *      [fre] [fre] [fre] [fre]\n *    PAGE 264: object data page\n *      obj.id:0123 span.ix:0004 flags:DATA\n *    PAGE 265: object data page\n *      obj.id:0123 span.ix:0005 flags:DATA\n *\n */\n#ifndef SPIFFS_NUCLEUS_H_\n#define SPIFFS_NUCLEUS_H_\n\n#define _SPIFFS_ERR_CHECK_FIRST         (SPIFFS_ERR_INTERNAL - 1)\n#define SPIFFS_ERR_CHECK_OBJ_ID_MISM    (SPIFFS_ERR_INTERNAL - 1)\n#define SPIFFS_ERR_CHECK_SPIX_MISM      (SPIFFS_ERR_INTERNAL - 2)\n#define SPIFFS_ERR_CHECK_FLAGS_BAD      (SPIFFS_ERR_INTERNAL - 3)\n#define _SPIFFS_ERR_CHECK_LAST          (SPIFFS_ERR_INTERNAL - 4)\n\n// visitor result, continue searching\n#define SPIFFS_VIS_COUNTINUE            (SPIFFS_ERR_INTERNAL - 20)\n// visitor result, continue searching after reloading lu buffer\n#define SPIFFS_VIS_COUNTINUE_RELOAD     (SPIFFS_ERR_INTERNAL - 21)\n// visitor result, stop searching\n#define SPIFFS_VIS_END                  (SPIFFS_ERR_INTERNAL - 22)\n\n// updating an object index contents\n#define SPIFFS_EV_IX_UPD                (0)\n// creating a new object index\n#define SPIFFS_EV_IX_NEW                (1)\n// deleting an object index\n#define SPIFFS_EV_IX_DEL                (2)\n// moving an object index without updating contents\n#define SPIFFS_EV_IX_MOV                (3)\n// updating an object index header data only, not the table itself\n#define SPIFFS_EV_IX_UPD_HDR            (4)\n\n#define SPIFFS_OBJ_ID_IX_FLAG           ((spiffs_obj_id)(1<<(8*sizeof(spiffs_obj_id)-1)))\n\n#define SPIFFS_UNDEFINED_LEN            (u32_t)(-1)\n\n#define SPIFFS_OBJ_ID_DELETED           ((spiffs_obj_id)0)\n#define SPIFFS_OBJ_ID_FREE              ((spiffs_obj_id)-1)\n\n\n\n#if defined(__GNUC__) || defined(__clang__) || defined(__TI_COMPILER_VERSION__)\n    /* For GCC, clang and TI compilers */\n#define SPIFFS_PACKED __attribute__((packed))\n#elif defined(__ICCARM__) || defined(__CC_ARM)\n    /* For IAR ARM and Keil MDK-ARM compilers */\n#define SPIFFS_PACKED \n\n#else\n    /* Unknown compiler */\n#define SPIFFS_PACKED \n#endif\n\n\n\n#if SPIFFS_USE_MAGIC\n#if !SPIFFS_USE_MAGIC_LENGTH\n#define SPIFFS_MAGIC(fs, bix)           \\\n  ((spiffs_obj_id)(0x20140529 ^ SPIFFS_CFG_LOG_PAGE_SZ(fs)))\n#else // SPIFFS_USE_MAGIC_LENGTH\n#define SPIFFS_MAGIC(fs, bix)           \\\n  ((spiffs_obj_id)(0x20140529 ^ SPIFFS_CFG_LOG_PAGE_SZ(fs) ^ ((fs)->block_count - (bix))))\n#endif // SPIFFS_USE_MAGIC_LENGTH\n#endif // SPIFFS_USE_MAGIC\n\n#define SPIFFS_CONFIG_MAGIC             (0x20090315)\n\n#if SPIFFS_SINGLETON == 0\n#define SPIFFS_CFG_LOG_PAGE_SZ(fs) \\\n  ((fs)->cfg.log_page_size)\n#define SPIFFS_CFG_LOG_BLOCK_SZ(fs) \\\n  ((fs)->cfg.log_block_size)\n#define SPIFFS_CFG_PHYS_SZ(fs) \\\n  ((fs)->cfg.phys_size)\n#define SPIFFS_CFG_PHYS_ERASE_SZ(fs) \\\n  ((fs)->cfg.phys_erase_block)\n#define SPIFFS_CFG_PHYS_ADDR(fs) \\\n  ((fs)->cfg.phys_addr)\n#endif\n\n// total number of pages\n#define SPIFFS_MAX_PAGES(fs) \\\n  ( SPIFFS_CFG_PHYS_SZ(fs)/SPIFFS_CFG_LOG_PAGE_SZ(fs) )\n// total number of pages per block, including object lookup pages\n#define SPIFFS_PAGES_PER_BLOCK(fs) \\\n  ( SPIFFS_CFG_LOG_BLOCK_SZ(fs)/SPIFFS_CFG_LOG_PAGE_SZ(fs) )\n// number of object lookup pages per block\n#define SPIFFS_OBJ_LOOKUP_PAGES(fs)     \\\n  (MAX(1, (SPIFFS_PAGES_PER_BLOCK(fs) * sizeof(spiffs_obj_id)) / SPIFFS_CFG_LOG_PAGE_SZ(fs)) )\n// checks if page index belongs to object lookup\n#define SPIFFS_IS_LOOKUP_PAGE(fs,pix)     \\\n  (((pix) % SPIFFS_PAGES_PER_BLOCK(fs)) < SPIFFS_OBJ_LOOKUP_PAGES(fs))\n// number of object lookup entries in all object lookup pages\n#define SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs) \\\n  (SPIFFS_PAGES_PER_BLOCK(fs)-SPIFFS_OBJ_LOOKUP_PAGES(fs))\n// converts a block to physical address\n#define SPIFFS_BLOCK_TO_PADDR(fs, block) \\\n  ( SPIFFS_CFG_PHYS_ADDR(fs) + (block)* SPIFFS_CFG_LOG_BLOCK_SZ(fs) )\n// converts a object lookup entry to page index\n#define SPIFFS_OBJ_LOOKUP_ENTRY_TO_PIX(fs, block, entry) \\\n  ((block)*SPIFFS_PAGES_PER_BLOCK(fs) + (SPIFFS_OBJ_LOOKUP_PAGES(fs) + entry))\n// converts a object lookup entry to physical address of corresponding page\n#define SPIFFS_OBJ_LOOKUP_ENTRY_TO_PADDR(fs, block, entry) \\\n  (SPIFFS_BLOCK_TO_PADDR(fs, block) + (SPIFFS_OBJ_LOOKUP_PAGES(fs) + entry) * SPIFFS_CFG_LOG_PAGE_SZ(fs) )\n// converts a page to physical address\n#define SPIFFS_PAGE_TO_PADDR(fs, page) \\\n  ( SPIFFS_CFG_PHYS_ADDR(fs) + (page) * SPIFFS_CFG_LOG_PAGE_SZ(fs) )\n// converts a physical address to page\n#define SPIFFS_PADDR_TO_PAGE(fs, addr) \\\n  ( ((addr) -  SPIFFS_CFG_PHYS_ADDR(fs)) / SPIFFS_CFG_LOG_PAGE_SZ(fs) )\n// gives index in page for a physical address\n#define SPIFFS_PADDR_TO_PAGE_OFFSET(fs, addr) \\\n  ( ((addr) - SPIFFS_CFG_PHYS_ADDR(fs)) % SPIFFS_CFG_LOG_PAGE_SZ(fs) )\n// returns containing block for given page\n#define SPIFFS_BLOCK_FOR_PAGE(fs, page) \\\n  ( (page) / SPIFFS_PAGES_PER_BLOCK(fs) )\n// returns starting page for block\n#define SPIFFS_PAGE_FOR_BLOCK(fs, block) \\\n  ( (block) * SPIFFS_PAGES_PER_BLOCK(fs) )\n// converts page to entry in object lookup page\n#define SPIFFS_OBJ_LOOKUP_ENTRY_FOR_PAGE(fs, page) \\\n  ( (page) % SPIFFS_PAGES_PER_BLOCK(fs) - SPIFFS_OBJ_LOOKUP_PAGES(fs) )\n// returns data size in a data page\n#define SPIFFS_DATA_PAGE_SIZE(fs) \\\n    ( SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_header) )\n// returns physical address for block's erase count,\n// always in the physical last entry of the last object lookup page\n#define SPIFFS_ERASE_COUNT_PADDR(fs, bix) \\\n  ( SPIFFS_BLOCK_TO_PADDR(fs, bix) + SPIFFS_OBJ_LOOKUP_PAGES(fs) * SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_obj_id) )\n// returns physical address for block's magic,\n// always in the physical second last entry of the last object lookup page\n#define SPIFFS_MAGIC_PADDR(fs, bix) \\\n  ( SPIFFS_BLOCK_TO_PADDR(fs, bix) + SPIFFS_OBJ_LOOKUP_PAGES(fs) * SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_obj_id)*2 )\n// checks if there is any room for magic in the object luts\n#define SPIFFS_CHECK_MAGIC_POSSIBLE(fs) \\\n  ( (SPIFFS_OBJ_LOOKUP_MAX_ENTRIES(fs) % (SPIFFS_CFG_LOG_PAGE_SZ(fs)/sizeof(spiffs_obj_id))) * sizeof(spiffs_obj_id) \\\n    <= (SPIFFS_CFG_LOG_PAGE_SZ(fs)-sizeof(spiffs_obj_id)*2) )\n\n// define helpers object\n\n// entries in an object header page index\n#define SPIFFS_OBJ_HDR_IX_LEN(fs) \\\n  ((SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_object_ix_header))/sizeof(spiffs_page_ix))\n// entries in an object page index\n#define SPIFFS_OBJ_IX_LEN(fs) \\\n  ((SPIFFS_CFG_LOG_PAGE_SZ(fs) - sizeof(spiffs_page_object_ix))/sizeof(spiffs_page_ix))\n// object index entry for given data span index\n#define SPIFFS_OBJ_IX_ENTRY(fs, spix) \\\n  ((spix) < SPIFFS_OBJ_HDR_IX_LEN(fs) ? (spix) : (((spix)-SPIFFS_OBJ_HDR_IX_LEN(fs))%SPIFFS_OBJ_IX_LEN(fs)))\n// object index span index number for given data span index or entry\n#define SPIFFS_OBJ_IX_ENTRY_SPAN_IX(fs, spix) \\\n  ((spix) < SPIFFS_OBJ_HDR_IX_LEN(fs) ? 0 : (1+((spix)-SPIFFS_OBJ_HDR_IX_LEN(fs))/SPIFFS_OBJ_IX_LEN(fs)))\n// get data span index for object index span index\n#define SPIFFS_DATA_SPAN_IX_FOR_OBJ_IX_SPAN_IX(fs, spix) \\\n  ( (spix) == 0 ? 0 : (SPIFFS_OBJ_HDR_IX_LEN(fs) + (((spix)-1) * SPIFFS_OBJ_IX_LEN(fs))) )\n\n#if SPIFFS_FILEHDL_OFFSET\n#define SPIFFS_FH_OFFS(fs, fh)   ((fh) != 0 ? ((fh) + (fs)->cfg.fh_ix_offset) : 0)\n#define SPIFFS_FH_UNOFFS(fs, fh) ((fh) != 0 ? ((fh) - (fs)->cfg.fh_ix_offset) : 0)\n#else\n#define SPIFFS_FH_OFFS(fs, fh)   (fh)\n#define SPIFFS_FH_UNOFFS(fs, fh) (fh)\n#endif\n\n\n#define SPIFFS_OP_T_OBJ_LU    (0<<0)\n#define SPIFFS_OP_T_OBJ_LU2   (1<<0)\n#define SPIFFS_OP_T_OBJ_IX    (2<<0)\n#define SPIFFS_OP_T_OBJ_DA    (3<<0)\n#define SPIFFS_OP_C_DELE      (0<<2)\n#define SPIFFS_OP_C_UPDT      (1<<2)\n#define SPIFFS_OP_C_MOVS      (2<<2)\n#define SPIFFS_OP_C_MOVD      (3<<2)\n#define SPIFFS_OP_C_FLSH      (4<<2)\n#define SPIFFS_OP_C_READ      (5<<2)\n#define SPIFFS_OP_C_WRTHRU    (6<<2)\n\n#define SPIFFS_OP_TYPE_MASK (3<<0)\n#define SPIFFS_OP_COM_MASK  (7<<2)\n\n\n// if 0, this page is written to, else clean\n#define SPIFFS_PH_FLAG_USED   (1<<0)\n// if 0, writing is finalized, else under modification\n#define SPIFFS_PH_FLAG_FINAL  (1<<1)\n// if 0, this is an index page, else a data page\n#define SPIFFS_PH_FLAG_INDEX  (1<<2)\n// if 0, page is deleted, else valid\n#define SPIFFS_PH_FLAG_DELET  (1<<7)\n// if 0, this index header is being deleted\n#define SPIFFS_PH_FLAG_IXDELE (1<<6)\n\n\n#define SPIFFS_CHECK_MOUNT(fs) \\\n  ((fs)->mounted != 0)\n\n#define SPIFFS_CHECK_CFG(fs) \\\n  ((fs)->config_magic == SPIFFS_CONFIG_MAGIC)\n\n#define SPIFFS_CHECK_RES(res) \\\n  do { \\\n    if ((res) < SPIFFS_OK) return (res); \\\n  } while (0);\n\n#define SPIFFS_API_CHECK_MOUNT(fs) \\\n  if (!SPIFFS_CHECK_MOUNT((fs))) { \\\n    (fs)->err_code = SPIFFS_ERR_NOT_MOUNTED; \\\n    return SPIFFS_ERR_NOT_MOUNTED; \\\n  }\n\n#define SPIFFS_API_CHECK_CFG(fs) \\\n  if (!SPIFFS_CHECK_CFG((fs))) { \\\n    (fs)->err_code = SPIFFS_ERR_NOT_CONFIGURED; \\\n    return SPIFFS_ERR_NOT_CONFIGURED; \\\n  }\n\n#define SPIFFS_API_CHECK_RES(fs, res) \\\n  if ((res) < SPIFFS_OK) { \\\n    (fs)->err_code = (res); \\\n    return (res); \\\n  }\n\n#define SPIFFS_API_CHECK_RES_UNLOCK(fs, res) \\\n  if ((res) < SPIFFS_OK) { \\\n    (fs)->err_code = (res); \\\n    SPIFFS_UNLOCK(fs); \\\n    return (res); \\\n  }\n\n#define SPIFFS_VALIDATE_OBJIX(ph, objid, spix) \\\n    if (((ph).flags & SPIFFS_PH_FLAG_USED) != 0) return SPIFFS_ERR_IS_FREE; \\\n    if (((ph).flags & SPIFFS_PH_FLAG_DELET) == 0) return SPIFFS_ERR_DELETED; \\\n    if (((ph).flags & SPIFFS_PH_FLAG_FINAL) != 0) return SPIFFS_ERR_NOT_FINALIZED; \\\n    if (((ph).flags & SPIFFS_PH_FLAG_INDEX) != 0) return SPIFFS_ERR_NOT_INDEX; \\\n    if (((objid) & SPIFFS_OBJ_ID_IX_FLAG) == 0) return SPIFFS_ERR_NOT_INDEX; \\\n    if ((ph).span_ix != (spix)) return SPIFFS_ERR_INDEX_SPAN_MISMATCH;\n    //if ((spix) == 0 && ((ph).flags & SPIFFS_PH_FLAG_IXDELE) == 0) return SPIFFS_ERR_DELETED;\n\n#define SPIFFS_VALIDATE_DATA(ph, objid, spix) \\\n    if (((ph).flags & SPIFFS_PH_FLAG_USED) != 0) return SPIFFS_ERR_IS_FREE; \\\n    if (((ph).flags & SPIFFS_PH_FLAG_DELET) == 0) return SPIFFS_ERR_DELETED; \\\n    if (((ph).flags & SPIFFS_PH_FLAG_FINAL) != 0) return SPIFFS_ERR_NOT_FINALIZED; \\\n    if (((ph).flags & SPIFFS_PH_FLAG_INDEX) == 0) return SPIFFS_ERR_IS_INDEX; \\\n    if ((objid) & SPIFFS_OBJ_ID_IX_FLAG) return SPIFFS_ERR_IS_INDEX; \\\n    if ((ph).span_ix != (spix)) return SPIFFS_ERR_DATA_SPAN_MISMATCH;\n\n\n// check id, only visit matching objec ids\n#define SPIFFS_VIS_CHECK_ID     (1<<0)\n// report argument object id to visitor - else object lookup id is reported\n#define SPIFFS_VIS_CHECK_PH     (1<<1)\n// stop searching at end of all look up pages\n#define SPIFFS_VIS_NO_WRAP      (1<<2)\n\n#if SPIFFS_HAL_CALLBACK_EXTRA\n\n#define SPIFFS_HAL_WRITE(_fs, _paddr, _len, _src) \\\n  (_fs)->cfg.hal_write_f((_fs), (_paddr), (_len), (_src))\n#define SPIFFS_HAL_READ(_fs, _paddr, _len, _dst) \\\n  (_fs)->cfg.hal_read_f((_fs), (_paddr), (_len), (_dst))\n#define SPIFFS_HAL_ERASE(_fs, _paddr, _len) \\\n  (_fs)->cfg.hal_erase_f((_fs), (_paddr), (_len))\n\n#else // SPIFFS_HAL_CALLBACK_EXTRA\n\n#define SPIFFS_HAL_WRITE(_fs, _paddr, _len, _src) \\\n  (_fs)->cfg.hal_write_f((_paddr), (_len), (_src))\n#define SPIFFS_HAL_READ(_fs, _paddr, _len, _dst) \\\n  (_fs)->cfg.hal_read_f((_paddr), (_len), (_dst))\n#define SPIFFS_HAL_ERASE(_fs, _paddr, _len) \\\n  (_fs)->cfg.hal_erase_f((_paddr), (_len))\n\n#endif // SPIFFS_HAL_CALLBACK_EXTRA\n\n#if SPIFFS_CACHE\n\n#define SPIFFS_CACHE_FLAG_DIRTY       (1<<0)\n#define SPIFFS_CACHE_FLAG_WRTHRU      (1<<1)\n#define SPIFFS_CACHE_FLAG_OBJLU       (1<<2)\n#define SPIFFS_CACHE_FLAG_OBJIX       (1<<3)\n#define SPIFFS_CACHE_FLAG_DATA        (1<<4)\n#define SPIFFS_CACHE_FLAG_TYPE_WR     (1<<7)\n\n#define SPIFFS_CACHE_PAGE_SIZE(fs) \\\n  (sizeof(spiffs_cache_page) + SPIFFS_CFG_LOG_PAGE_SZ(fs))\n\n#define spiffs_get_cache(fs) \\\n  ((spiffs_cache *)((fs)->cache))\n\n#define spiffs_get_cache_page_hdr(fs, c, ix) \\\n  ((spiffs_cache_page *)(&((c)->cpages[(ix) * SPIFFS_CACHE_PAGE_SIZE(fs)])))\n\n#define spiffs_get_cache_page(fs, c, ix) \\\n  ((u8_t *)(&((c)->cpages[(ix) * SPIFFS_CACHE_PAGE_SIZE(fs)])) + sizeof(spiffs_cache_page))\n\n// cache page struct\ntypedef struct {\n  // cache flags\n  u8_t flags;\n  // cache page index\n  u8_t ix;\n  // last access of this cache page\n  u32_t last_access;\n  union {\n    // type read cache\n    struct {\n      // read cache page index\n      spiffs_page_ix pix;\n    };\n#if SPIFFS_CACHE_WR\n    // type write cache\n    struct {\n      // write cache\n      spiffs_obj_id obj_id;\n      // offset in cache page\n      u32_t offset;\n      // size of cache page\n      u16_t size;\n    };\n#endif\n  };\n} spiffs_cache_page;\n\n// cache struct\ntypedef struct {\n  u8_t cpage_count;\n  u32_t last_access;\n  u32_t cpage_use_map;\n  u32_t cpage_use_mask;\n  u8_t *cpages;\n} spiffs_cache;\n\n#endif\n\n\n// spiffs nucleus file descriptor\ntypedef struct {\n  // the filesystem of this descriptor\n  spiffs *fs;\n  // number of file descriptor - if 0, the file descriptor is closed\n  spiffs_file file_nbr;\n  // object id - if SPIFFS_OBJ_ID_ERASED, the file was deleted\n  spiffs_obj_id obj_id;\n  // size of the file\n  u32_t size;\n  // cached object index header page index\n  spiffs_page_ix objix_hdr_pix;\n  // cached offset object index page index\n  spiffs_page_ix cursor_objix_pix;\n  // cached offset object index span index\n  spiffs_span_ix cursor_objix_spix;\n  // current absolute offset\n  u32_t offset;\n  // current file descriptor offset (cached)\n  u32_t fdoffset;\n  // fd flags\n  spiffs_flags flags;\n#if SPIFFS_CACHE_WR\n  spiffs_cache_page *cache_page;\n#endif\n#if SPIFFS_TEMPORAL_FD_CACHE\n  // djb2 hash of filename\n  u32_t name_hash;\n  // hit score (score == 0 indicates never used fd)\n  u16_t score;\n#endif\n#if SPIFFS_IX_MAP\n  // spiffs index map, if 0 it means unmapped\n  spiffs_ix_map *ix_map;\n#endif\n} spiffs_fd;\n\n\n// object structs\n\n// page header, part of each page except object lookup pages\n// NB: this is always aligned when the data page is an object index,\n// as in this case struct spiffs_page_object_ix is used\ntypedef struct SPIFFS_PACKED {\n  // object id\n  spiffs_obj_id obj_id;\n  // object span index\n  spiffs_span_ix span_ix;\n  // flags\n  u8_t flags;\n} spiffs_page_header;\n\n// object index header page header\ntypedef struct SPIFFS_PACKED\n#if SPIFFS_ALIGNED_OBJECT_INDEX_TABLES\n                __attribute(( aligned(sizeof(spiffs_page_ix)) ))\n#endif\n{\n  // common page header\n  spiffs_page_header p_hdr;\n  // alignment\n  u8_t _align0[4 - ((sizeof(spiffs_page_header)&3)==0 ? 4 : (sizeof(spiffs_page_header)&3))];\n  // size of object\n  u32_t size;\n  // type of object\n  spiffs_obj_type type;\n  u8_t _align1[4 - ((sizeof(spiffs_obj_type)&3)==0 ? 4 : (sizeof(spiffs_obj_type)&3))];\n  // name of object\n  u8_t name[SPIFFS_OBJ_NAME_LEN];\n#if SPIFFS_OBJ_META_LEN\n  // metadata. not interpreted by SPIFFS in any way.\n  u8_t meta[SPIFFS_OBJ_META_LEN];\n#endif\n} spiffs_page_object_ix_header;\n\n// object index page header\ntypedef struct SPIFFS_PACKED {\n spiffs_page_header p_hdr;\n u8_t _align[4 - ((sizeof(spiffs_page_header)&3)==0 ? 4 : (sizeof(spiffs_page_header)&3))];\n} spiffs_page_object_ix;\n\n// callback func for object lookup visitor\ntypedef s32_t (*spiffs_visitor_f)(spiffs *fs, spiffs_obj_id id, spiffs_block_ix bix, int ix_entry,\n    const void *user_const_p, void *user_var_p);\n\n\n#if SPIFFS_CACHE\n#define _spiffs_rd(fs, op, fh, addr, len, dst) \\\n    spiffs_phys_rd((fs), (op), (fh), (addr), (len), (dst))\n#define _spiffs_wr(fs, op, fh, addr, len, src) \\\n    spiffs_phys_wr((fs), (op), (fh), (addr), (len), (src))\n#else\n#define _spiffs_rd(fs, op, fh, addr, len, dst) \\\n    spiffs_phys_rd((fs), (addr), (len), (dst))\n#define _spiffs_wr(fs, op, fh, addr, len, src) \\\n    spiffs_phys_wr((fs), (addr), (len), (src))\n#endif\n\n#ifndef MIN\n#define MIN(a,b) ((a) < (b) ? (a) : (b))\n#endif\n#ifndef MAX\n#define MAX(a,b) ((a) > (b) ? (a) : (b))\n#endif\n\n// ---------------\n\ns32_t spiffs_phys_rd(\n    spiffs *fs,\n#if SPIFFS_CACHE\n    u8_t op,\n    spiffs_file fh,\n#endif\n    u32_t addr,\n    u32_t len,\n    u8_t *dst);\n\ns32_t spiffs_phys_wr(\n    spiffs *fs,\n#if SPIFFS_CACHE\n    u8_t op,\n    spiffs_file fh,\n#endif\n    u32_t addr,\n    u32_t len,\n    u8_t *src);\n\ns32_t spiffs_phys_cpy(\n    spiffs *fs,\n    spiffs_file fh,\n    u32_t dst,\n    u32_t src,\n    u32_t len);\n\ns32_t spiffs_phys_count_free_blocks(\n    spiffs *fs);\n\ns32_t spiffs_obj_lu_find_entry_visitor(\n    spiffs *fs,\n    spiffs_block_ix starting_block,\n    int starting_lu_entry,\n    u8_t flags,\n    spiffs_obj_id obj_id,\n    spiffs_visitor_f v,\n    const void *user_const_p,\n    void *user_var_p,\n    spiffs_block_ix *block_ix,\n    int *lu_entry);\n\ns32_t spiffs_erase_block(\n    spiffs *fs,\n    spiffs_block_ix bix);\n\n#if SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH\ns32_t spiffs_probe(\n    spiffs_config *cfg);\n#endif // SPIFFS_USE_MAGIC && SPIFFS_USE_MAGIC_LENGTH\n\n// ---------------\n\ns32_t spiffs_obj_lu_scan(\n    spiffs *fs);\n\ns32_t spiffs_obj_lu_find_free_obj_id(\n    spiffs *fs,\n    spiffs_obj_id *obj_id,\n    const u8_t *conflicting_name);\n\ns32_t spiffs_obj_lu_find_free(\n    spiffs *fs,\n    spiffs_block_ix starting_block,\n    int starting_lu_entry,\n    spiffs_block_ix *block_ix,\n    int *lu_entry);\n\ns32_t spiffs_obj_lu_find_id(\n    spiffs *fs,\n    spiffs_block_ix starting_block,\n    int starting_lu_entry,\n    spiffs_obj_id obj_id,\n    spiffs_block_ix *block_ix,\n    int *lu_entry);\n\ns32_t spiffs_obj_lu_find_id_and_span(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_span_ix spix,\n    spiffs_page_ix exclusion_pix,\n    spiffs_page_ix *pix);\n\ns32_t spiffs_obj_lu_find_id_and_span_by_phdr(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_span_ix spix,\n    spiffs_page_ix exclusion_pix,\n    spiffs_page_ix *pix);\n\n// ---------------\n\ns32_t spiffs_page_allocate_data(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_page_header *ph,\n    u8_t *data,\n    u32_t len,\n    u32_t page_offs,\n    u8_t finalize,\n    spiffs_page_ix *pix);\n\ns32_t spiffs_page_move(\n    spiffs *fs,\n    spiffs_file fh,\n    u8_t *page_data,\n    spiffs_obj_id obj_id,\n    spiffs_page_header *page_hdr,\n    spiffs_page_ix src_pix,\n    spiffs_page_ix *dst_pix);\n\ns32_t spiffs_page_delete(\n    spiffs *fs,\n    spiffs_page_ix pix);\n\n// ---------------\n\ns32_t spiffs_object_create(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    const u8_t name[],\n    const u8_t meta[],\n    spiffs_obj_type type,\n    spiffs_page_ix *objix_hdr_pix);\n\ns32_t spiffs_object_update_index_hdr(\n    spiffs *fs,\n    spiffs_fd *fd,\n    spiffs_obj_id obj_id,\n    spiffs_page_ix objix_hdr_pix,\n    u8_t *new_objix_hdr_data,\n    const u8_t name[],\n    const u8_t meta[],\n    u32_t size,\n    spiffs_page_ix *new_pix);\n\n#if SPIFFS_IX_MAP\n\ns32_t spiffs_populate_ix_map(\n    spiffs *fs,\n    spiffs_fd *fd,\n    u32_t vec_entry_start,\n    u32_t vec_entry_end);\n\n#endif\n\nvoid spiffs_cb_object_event(\n    spiffs *fs,\n    spiffs_page_object_ix *objix,\n    int ev,\n    spiffs_obj_id obj_id,\n    spiffs_span_ix spix,\n    spiffs_page_ix new_pix,\n    u32_t new_size);\n\ns32_t spiffs_object_open_by_id(\n    spiffs *fs,\n    spiffs_obj_id obj_id,\n    spiffs_fd *f,\n    spiffs_flags flags,\n    spiffs_mode mode);\n\ns32_t spiffs_object_open_by_page(\n    spiffs *fs,\n    spiffs_page_ix pix,\n    spiffs_fd *f,\n    spiffs_flags flags,\n    spiffs_mode mode);\n\ns32_t spiffs_object_append(\n    spiffs_fd *fd,\n    u32_t offset,\n    u8_t *data,\n    u32_t len);\n\ns32_t spiffs_object_modify(\n    spiffs_fd *fd,\n    u32_t offset,\n    u8_t *data,\n    u32_t len);\n\ns32_t spiffs_object_read(\n    spiffs_fd *fd,\n    u32_t offset,\n    u32_t len,\n    u8_t *dst);\n\ns32_t spiffs_object_truncate(\n    spiffs_fd *fd,\n    u32_t new_len,\n    u8_t remove_object);\n\ns32_t spiffs_object_find_object_index_header_by_name(\n    spiffs *fs,\n    const u8_t name[SPIFFS_OBJ_NAME_LEN],\n    spiffs_page_ix *pix);\n\n// ---------------\n\ns32_t spiffs_gc_check(\n    spiffs *fs,\n    u32_t len);\n\ns32_t spiffs_gc_erase_page_stats(\n    spiffs *fs,\n    spiffs_block_ix bix);\n\ns32_t spiffs_gc_find_candidate(\n    spiffs *fs,\n    spiffs_block_ix **block_candidate,\n    int *candidate_count,\n    char fs_crammed);\n\ns32_t spiffs_gc_clean(\n    spiffs *fs,\n    spiffs_block_ix bix);\n\ns32_t spiffs_gc_quick(\n    spiffs *fs, u16_t max_free_pages);\n\n// ---------------\n\ns32_t spiffs_fd_find_new(\n    spiffs *fs,\n    spiffs_fd **fd,\n    const char *name);\n\ns32_t spiffs_fd_return(\n    spiffs *fs,\n    spiffs_file f);\n\ns32_t spiffs_fd_get(\n    spiffs *fs,\n    spiffs_file f,\n    spiffs_fd **fd);\n\n#if SPIFFS_TEMPORAL_FD_CACHE\nvoid spiffs_fd_temporal_cache_rehash(\n    spiffs *fs,\n    const char *old_path,\n    const char *new_path);\n#endif\n\n#if SPIFFS_CACHE\nvoid spiffs_cache_init(\n    spiffs *fs);\n\nvoid spiffs_cache_drop_page(\n    spiffs *fs,\n    spiffs_page_ix pix);\n\n#if SPIFFS_CACHE_WR\nspiffs_cache_page *spiffs_cache_page_allocate_by_fd(\n    spiffs *fs,\n    spiffs_fd *fd);\n\nvoid spiffs_cache_fd_release(\n    spiffs *fs,\n    spiffs_cache_page *cp);\n\nspiffs_cache_page *spiffs_cache_page_get_by_fd(\n    spiffs *fs,\n    spiffs_fd *fd);\n#endif\n#endif\n\ns32_t spiffs_lookup_consistency_check(\n    spiffs *fs,\n    u8_t check_all_objects);\n\ns32_t spiffs_page_consistency_check(\n    spiffs *fs);\n\ns32_t spiffs_object_index_consistency_check(\n    spiffs *fs);\n\n// memcpy macro,\n// checked in test builds, otherwise plain memcpy (unless already defined)\n#ifdef _SPIFFS_TEST\n#define _SPIFFS_MEMCPY(__d, __s, __l) do { \\\n    intptr_t __a1 = (intptr_t)((u8_t*)(__s)); \\\n    intptr_t __a2 = (intptr_t)((u8_t*)(__s)+(__l)); \\\n    intptr_t __b1 = (intptr_t)((u8_t*)(__d)); \\\n    intptr_t __b2 = (intptr_t)((u8_t*)(__d)+(__l)); \\\n    if (__a1 <= __b2 && __b1 <= __a2) { \\\n      printf(\"FATAL OVERLAP: memcpy from %lx..%lx to %lx..%lx\\n\", __a1, __a2, __b1, __b2); \\\n      ERREXIT(); \\\n    } \\\n    memcpy((__d),(__s),(__l)); \\\n} while (0)\n#else\n#ifndef _SPIFFS_MEMCPY\n#define _SPIFFS_MEMCPY(__d, __s, __l) do{memcpy((__d),(__s),(__l));}while(0)\n#endif\n#endif //_SPIFFS_TEST\n\n#endif /* SPIFFS_NUCLEUS_H_ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/fs/vfs/los_vfs.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include <stdint.h>\n#include <string.h>\n#include <stdlib.h>\n#include <stdarg.h>\n#include \"los_config.h\"\n#include \"los_mux.h\"\n#include \"fs/sys/errno.h\"\n#include \"fs/sys/fcntl.h\"\n#include \"fs/los_vfs.h\"\n\n\n#if (LOSCFG_ENABLE_VFS == YES)\n\nstruct file          files [LOS_MAX_FILES];\nUINT32               fs_mutex = LOS_ERRNO_MUX_PTR_NULL;\nstruct mount_point *mount_points = NULL;\nstruct file_system *file_systems = NULL;\n\nstatic int _file_2_fd (struct file *file)\n{\n    return file - files;\n}\n\nstatic struct file *_fd_2_file (int fd)\n{\n    return &files [fd];\n}\n\nstatic struct file *los_file_get (void)\n{\n    int i;\n\n    /* protected by fs_mutex */\n\n    for (i = 0; i < LOS_MAX_FILES; i++)\n    {\n        if (files[i].f_status == FILE_STATUS_NOT_USED)\n        {\n            files[i].f_status = FILE_STATUS_INITING;\n            return &files[i];\n        }\n    }\n\n    return NULL;\n}\n\nstatic void los_file_put(struct file *file)\n{\n    file->f_flags  = 0;\n    file->f_fops   = NULL;\n    file->f_data   = NULL;\n    file->f_mp     = NULL;\n    file->f_offset = 0;\n    file->f_owner  = (UINT32) - 1;\n\n    file->f_status = FILE_STATUS_NOT_USED;\n}\n\nstruct mount_point *los_mp_find (const char *path, const char **path_in_mp)\n{\n    struct mount_point *mp = mount_points;\n    struct mount_point *best_mp = NULL;\n    int                  best_matches = 0;\n\n    if (path == NULL)\n    {\n        return NULL;\n    }\n    if (path_in_mp != NULL)\n    {\n        *path_in_mp = NULL;\n    }\n\n    while (mp != NULL)\n    {\n        const char      *m_path  = mp->m_path;  /* mount point path */\n        const char      *i_path  = path;        /* input path */\n        int              matches = 0;\n        const char      *t;\n\n        do\n        {\n            while (*m_path == '/') m_path++;\n            while (*i_path == '/') i_path++;\n\n            t = strchr (m_path, '/');\n\n            if (t == NULL)\n            {\n                /*\n                 * m_path now is as follows:\n                 * 1) string like \"abc\"\n                 * 2) empty string \"\\0\"\n                 * if it is empty string, means current mp matched\n                 */\n\n                t = strchr (m_path, '\\0');\n\n                if (t == m_path)\n                {\n                    break;\n                }\n            }\n\n            if (strncmp (m_path, i_path, t - m_path) != 0)\n            {\n                goto next;  /* this mount point do not match, check next */\n            }\n\n            /*\n             * if m_path is \"abc\", i_path maybe:\n             * 1) \"abc\"\n             * 2) \"abc/\"\n             * 3) \"abcd...\"\n             * if it is not 1) or 2), this mp does not match, just goto next one\n             */\n\n            i_path  += (t - m_path);\n\n            if ((*i_path != '\\0') && (*i_path != '/'))\n            {\n                goto next;\n            }\n\n            matches += (t - m_path);\n            m_path  += (t - m_path);\n        } while (*m_path != '\\0');\n\n        if (matches > best_matches)\n        {\n            best_matches = matches;\n            best_mp      = mp;\n            while (*i_path == '/') i_path++;\n\n            if (path_in_mp != NULL)\n            {\n                *path_in_mp  = i_path;\n            }\n        }\n\nnext:\n        mp = mp->m_next;\n    }\n\n    return best_mp;\n}\n\nint los_open (const char *path, int flags)\n{\n    struct file         *file = NULL;\n    int                  fd = -1;\n    const char          *path_in_mp = NULL;\n    struct mount_point *mp;\n\n    if (path == NULL)\n    {\n        VFS_ERRNO_SET (EINVAL);\n        return fd;\n    }\n\n    /* can not open dir */\n\n    if (path [strlen (path) - 1] == '/')\n    {\n        VFS_ERRNO_SET (EINVAL);\n        return fd;\n    }\n\n    /* prevent fs/mp being removed while opening */\n\n    if (LOS_OK != LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER))\n    {\n        VFS_ERRNO_SET (EAGAIN);\n        return fd;\n    }\n\n    file = los_file_get ();\n\n    if (file == NULL)\n    {\n        VFS_ERRNO_SET (ENFILE);\n        goto err_post_exit;\n    }\n\n    mp = los_mp_find (path, &path_in_mp);\n\n    if ((mp == NULL) || (path_in_mp == NULL) || (*path_in_mp == '\\0') ||\n            (mp->m_fs->fs_fops->open == NULL))\n    {\n        VFS_ERRNO_SET (ENOENT);\n        goto err_post_exit;\n    };\n\n    if (LOS_OK != LOS_MuxPend (mp->m_mutex, LOS_WAIT_FOREVER))\n    {\n        VFS_ERRNO_SET (EAGAIN);\n        goto err_post_exit;\n    }\n\n    LOS_MuxPost (fs_mutex);\n\n    file->f_flags  = flags;\n    file->f_offset = 0;\n    file->f_data   = NULL;\n    file->f_fops   = mp->m_fs->fs_fops;\n    file->f_mp     = mp;\n    file->f_owner  = LOS_CurTaskIDGet ();\n\n    if (file->f_fops->open (file, path_in_mp, flags) == 0)\n    {\n        mp->m_refs++;\n        fd = _file_2_fd (file);\n        file->f_status = FILE_STATUS_READY;     /* file now ready to use */\n    }\n    else\n    {\n        los_file_put (file);\n    }\n\n    LOS_MuxPost (mp->m_mutex);\n\n    return fd;\n\nerr_post_exit:\n\n    LOS_MuxPost (fs_mutex);\n\n    if ((fd < 0) && (file != NULL))\n    {\n        los_file_put (file);\n    }\n\n    return fd;\n}\n\n/* attach to a file and then set new status */\n\nstatic struct file *_los_attach_file (int fd, UINT32 status)\n{\n    struct file         *file = NULL;\n\n    if ((fd < 0) || (fd >= LOS_MAX_FILES))\n    {\n        VFS_ERRNO_SET (EBADF);\n        return file;\n    }\n\n    file = _fd_2_file (fd);\n\n    /*\n     * Prevent file closed after the checking of:\n     *\n     *     if (file->f_status == FILE_STATUS_READY)\n     *\n     * Because our files are not privated to one task, it may be operated\n     * by every task.\n     * So we should take the mutex of current mount point before operating it,\n     * but for now we don't know if this file is valid (FILE_STATUS_READY), if\n     * this file is not valid, the f_mp may be incorrect. so\n     * we must check the status first, but this file may be closed/removed\n     * after the checking if the senquence is not correct.\n     *\n     * Consider the following code:\n     *\n     * los_attach_file (...)\n     * {\n     *     if (file->f_status == FILE_STATUS_READY)\n     *     {\n     *         while (LOS_MuxPend (file->f_mp->m_mutex, LOS_WAIT_FOREVER) != LOS_OK);\n     *\n     *         return file;\n     *     }\n     * }\n     *\n     * It is not safe:\n     *\n     * If current task is interrupted by an IRQ just after the checking and then\n     * a new task is swapped in and the new task just closed this file.\n     *\n     * So <fs_mutex> is acquire first and then check if it is valid: if not, just\n     * return NULL (which means fail); If yes, the mutex for current mount point\n     * is qcquired. And the close operation will also set task to\n     * FILE_STATUS_CLOSING to prevent other tasks operate on this file (and also\n     * prevent other tasks pend on the mutex of this mount point for this file).\n     * At last <fs_mutex> is released. And return the file handle (struct file *).\n     *\n     * As this logic used in almost all the operation routines, this routine is\n     * made to reduce the redundant code.\n     */\n\n    while (LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER) != LOS_OK);\n\n    if (file->f_status == FILE_STATUS_READY)\n    {\n        while (LOS_MuxPend (file->f_mp->m_mutex, LOS_WAIT_FOREVER) != LOS_OK);\n\n        if (status != FILE_STATUS_READY)\n        {\n            file->f_status = status;\n        }\n    }\n    else\n    {\n        VFS_ERRNO_SET (EBADF);\n        file = NULL;\n    }\n\n    LOS_MuxPost (fs_mutex);\n\n    return file;\n}\n\nstatic struct file *los_attach_file (int fd)\n{\n    return _los_attach_file (fd, FILE_STATUS_READY);\n}\n\nstatic struct file *los_attach_file_with_status (int fd, int status)\n{\n    return _los_attach_file (fd, status);\n}\n\nstatic UINT32 los_detach_file (struct file *file)\n{\n    return LOS_MuxPost (file->f_mp->m_mutex);\n}\n\nint los_close (int fd)\n{\n    struct file         *file;\n    int                  ret = -1;\n\n    file = los_attach_file_with_status (fd, FILE_STATUS_CLOSING);\n\n    if (file == NULL)\n    {\n        return ret;\n    }\n\n    if (file->f_fops->close != NULL)\n    {\n        ret = file->f_fops->close (file);\n    }\n    else\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n    }\n\n    if (0 == ret)\n    {\n        file->f_mp->m_refs--;\n    }\n\n    los_detach_file (file);\n\n    los_file_put (file);\n\n    return ret;\n}\n\nssize_t los_read (int fd, char *buff, size_t bytes)\n{\n    struct file *file;\n    ssize_t       ret = (ssize_t) - 1;\n\n    if (buff == NULL || bytes == 0)\n    {\n        VFS_ERRNO_SET (EINVAL);\n        return ret;\n    }\n\n    file = los_attach_file (fd);\n\n    if (file == NULL)\n    {\n        return ret;\n    }\n\n    if ((file->f_flags & O_ACCMODE) == O_WRONLY)\n    {\n        VFS_ERRNO_SET (EACCES);\n    }\n    else if (file->f_fops->read != NULL)\n    {\n        ret = file->f_fops->read (file, buff, bytes);\n    }\n    else\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n    }\n\n    /* else ret will be -1 */\n\n    los_detach_file (file);\n\n    return ret;\n}\n\nssize_t los_write (int fd, const void *buff, size_t bytes)\n{\n    struct file *file;\n    ssize_t       ret = -1;\n\n    if (buff == NULL || bytes == 0)\n    {\n        VFS_ERRNO_SET (EINVAL);\n        return ret;\n    }\n\n    file = los_attach_file (fd);\n\n    if (file == NULL)\n    {\n        return ret;\n    }\n\n    if ((file->f_flags & O_ACCMODE) == O_RDONLY)\n    {\n        VFS_ERRNO_SET (EACCES);\n    }\n    else if (file->f_fops->write != NULL)\n    {\n        ret = file->f_fops->write (file, buff, bytes);\n    }\n    else\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n    }\n\n    /* else ret will be -1 */\n\n    los_detach_file (file);\n\n    return ret;\n}\n\noff_t los_lseek (int fd, off_t off, int whence)\n{\n    struct file *file;\n    off_t         ret = -1;\n\n    file = los_attach_file (fd);\n\n    if (file == NULL)\n    {\n        return ret;\n    }\n\n    if (file->f_fops->lseek == NULL)\n    {\n        ret = file->f_offset;\n    }\n    else\n    {\n        ret = file->f_fops->lseek (file, off, whence);\n    }\n\n    los_detach_file (file);\n\n    return ret;\n}\n\nint los_stat (const char *path, struct stat *stat)\n{\n    struct mount_point *mp = NULL;\n    const char *path_in_mp = NULL;\n    int ret = -1;\n\n    if (path == NULL || stat == NULL)\n    {\n        VFS_ERRNO_SET (EINVAL);\n        return ret;\n    }\n\n    if (LOS_OK != LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER))\n    {\n        VFS_ERRNO_SET (EAGAIN);\n        return ret;\n    }\n\n    mp = los_mp_find (path, &path_in_mp);\n\n    if ((mp == NULL) || (path_in_mp == NULL) || (*path_in_mp == '\\0'))\n    {\n        VFS_ERRNO_SET (ENOENT);\n        LOS_MuxPost (fs_mutex);\n        return ret;\n    }\n\n    if (mp->m_fs->fs_fops->stat != NULL)\n    {\n        ret = mp->m_fs->fs_fops->stat (mp, path_in_mp, stat);\n    }\n    else\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n    }\n\n    LOS_MuxPost (fs_mutex);\n\n    return ret;\n}\n\nint los_unlink (const char *path)\n{\n    struct mount_point *mp;\n    const char          *path_in_mp = NULL;\n    int                  ret = -1;\n\n    if (path == NULL)\n    {\n        VFS_ERRNO_SET (EINVAL);\n        return ret;\n    }\n\n    LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER);   /* prevent the file open/rename */\n\n    mp = los_mp_find (path, &path_in_mp);\n\n    if ((mp == NULL) || (path_in_mp == NULL) || (*path_in_mp == '\\0') ||\n            (mp->m_fs->fs_fops->unlink == NULL))\n    {\n        VFS_ERRNO_SET (ENOENT);\n        goto out;\n    }\n\n    ret = mp->m_fs->fs_fops->unlink (mp, path_in_mp);\n\nout:\n    LOS_MuxPost (fs_mutex);\n\n    return ret;\n}\n\nint los_rename (const char *old, const char *new)\n{\n    struct mount_point *mp_old;\n    struct mount_point *mp_new;\n    const char          *path_in_mp_old = NULL;\n    const char          *path_in_mp_new = NULL;\n    int                  ret = -1;\n\n    if (old == NULL || new == NULL)\n    {\n        VFS_ERRNO_SET (EINVAL);\n        return ret;\n    }\n\n    LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER);   /* prevent file open/unlink */\n\n    mp_old = los_mp_find (old, &path_in_mp_old);\n\n    if(path_in_mp_old == NULL)\n    {\n        VFS_ERRNO_SET (EINVAL);\n        goto out;\n    }\n\n    if ((mp_old == NULL) || (*path_in_mp_old == '\\0') ||\n            (mp_old->m_fs->fs_fops->unlink == NULL))\n    {\n        VFS_ERRNO_SET (EINVAL);\n        goto out;\n    }\n\n    mp_new = los_mp_find (new, &path_in_mp_new);\n\n    if ((mp_new == NULL) || (path_in_mp_new == NULL) || (*path_in_mp_new == '\\0') ||\n            (mp_new->m_fs->fs_fops->unlink == NULL))\n    {\n        VFS_ERRNO_SET (EINVAL);\n        goto out;\n    }\n\n    if (mp_old != mp_new)\n    {\n        VFS_ERRNO_SET (EXDEV);\n        goto out;\n    }\n\n    if (mp_old->m_fs->fs_fops->rename != NULL)\n    {\n        ret = mp_old->m_fs->fs_fops->rename (mp_old, path_in_mp_old,\n                                             path_in_mp_new);\n    }\n    else\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n    }\n\nout:\n    LOS_MuxPost (fs_mutex);\n\n    return ret;\n}\n\nint los_ioctl (int fd, int func, ...)\n{\n    va_list       ap;\n    unsigned long arg;\n    struct file *file;\n    int           ret = -1;\n\n    va_start (ap, func);\n    arg = va_arg (ap, unsigned long);\n    va_end (ap);\n\n    file = los_attach_file (fd);\n\n    if (file == NULL)\n    {\n        return ret;\n    }\n\n    if (file->f_fops->ioctl != NULL)\n    {\n        ret = file->f_fops->ioctl (file, func, arg);\n    }\n    else\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n    }\n\n    los_detach_file (file);\n\n    return ret;\n}\n\nint los_sync (int fd)\n{\n    struct file *file;\n    int           ret = -1;\n\n    file = los_attach_file (fd);\n\n    if (file == NULL)\n    {\n        return ret;\n    }\n\n    if (file->f_fops->sync != NULL)\n    {\n        ret = file->f_fops->sync (file);\n    }\n    else\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n    }\n\n    los_detach_file (file);\n\n    return ret;\n}\n\nstruct dir *los_opendir (const char *path)\n{\n    struct mount_point *mp;\n    const char          *path_in_mp = NULL;\n    struct dir          *dir = NULL;\n    int                  ret = -1;\n\n    if (path == NULL)\n    {\n        VFS_ERRNO_SET (EINVAL);\n        return NULL;\n    }\n\n    dir = (struct dir *) malloc (sizeof (struct dir));\n\n    if (dir == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in VFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        VFS_ERRNO_SET (ENOMEM);\n        return NULL;\n    }\n\n    if (LOS_OK != LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER))\n    {\n        VFS_ERRNO_SET (EAGAIN);\n        free (dir);\n        return NULL;\n    }\n\n    mp = los_mp_find (path, &path_in_mp);\n\n    if (mp == NULL || path_in_mp == NULL)\n    {\n        VFS_ERRNO_SET (ENOENT);\n        LOS_MuxPost (fs_mutex);\n        free (dir);\n        return NULL;\n    }\n\n    ret = LOS_MuxPend (mp->m_mutex, LOS_WAIT_FOREVER);\n\n    LOS_MuxPost (fs_mutex);\n\n    if (ret != LOS_OK)\n    {\n        VFS_ERRNO_SET (EAGAIN);\n        free (dir);\n        return NULL;\n    }\n\n    if (mp->m_fs->fs_fops->opendir == NULL)\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n        LOS_MuxPost (mp->m_mutex);\n        free (dir);\n        return NULL;\n    }\n\n    dir->d_mp     = mp;\n    dir->d_offset = 0;\n\n    ret = mp->m_fs->fs_fops->opendir (dir, path_in_mp);\n\n    if (ret == 0)\n    {\n        mp->m_refs++;\n    }\n    else\n    {\n        free (dir);\n        dir = NULL;\n    }\n\n    LOS_MuxPost (mp->m_mutex);\n\n    return dir;\n}\n\nstruct dirent *los_readdir (struct dir *dir)\n{\n    struct mount_point *mp;\n    struct dirent       *ret = NULL;\n\n    if (dir == NULL)\n    {\n        VFS_ERRNO_SET (EINVAL);\n        return NULL;\n    }\n\n    mp = dir->d_mp;\n\n    if (LOS_OK != LOS_MuxPend (mp->m_mutex, LOS_WAIT_FOREVER))\n    {\n        VFS_ERRNO_SET (EAGAIN);\n        return NULL;\n    }\n\n    if (dir->d_mp->m_fs->fs_fops->readdir != NULL)\n    {\n        if (dir->d_mp->m_fs->fs_fops->readdir (dir, &dir->d_dent) == 0)\n        {\n            ret = &dir->d_dent;\n        }\n        else\n        {\n            VFS_ERRNO_SET (EBADF);\n        }\n    }\n    else\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n    }\n\n    LOS_MuxPost (mp->m_mutex);\n\n    return ret;\n}\n\nint los_closedir (struct dir *dir)\n{\n    struct mount_point *mp;\n    int                  ret = -1;\n\n    if (dir == NULL)\n    {\n        VFS_ERRNO_SET (EBADF);\n        return -1;\n    }\n\n    mp = dir->d_mp;\n\n    if (LOS_OK != LOS_MuxPend (mp->m_mutex, LOS_WAIT_FOREVER))\n    {\n        VFS_ERRNO_SET (EAGAIN);\n        return -1;\n    }\n\n    if (dir->d_mp->m_fs->fs_fops->closedir != NULL)\n    {\n        ret = dir->d_mp->m_fs->fs_fops->closedir (dir);\n    }\n    else\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n    }\n\n    if (ret == 0)\n    {\n        free (dir);\n        mp->m_refs--;\n    }\n    else\n    {    \n        VFS_ERRNO_SET (EBADF);\n    }\n\n    LOS_MuxPost (mp->m_mutex);\n\n    return ret;\n}\n\nint los_mkdir (const char *path, int mode)\n{\n    struct mount_point *mp;\n    const char          *path_in_mp = NULL;\n    int                  ret = -1;\n\n    (void) mode;\n\n    if (path == NULL)\n    {\n        VFS_ERRNO_SET (EINVAL);\n        return -1;\n    }\n\n    if (LOS_OK != LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER))\n    {\n        VFS_ERRNO_SET (EAGAIN);\n        return -1;\n    }\n\n    mp = los_mp_find (path, &path_in_mp);\n\n    if ((mp == NULL) || (path_in_mp == NULL) || (*path_in_mp == '\\0'))\n    {\n        VFS_ERRNO_SET (ENOENT);\n        LOS_MuxPost (fs_mutex);\n        return -1;\n    }\n\n    ret = LOS_MuxPend (mp->m_mutex, LOS_WAIT_FOREVER);\n\n    LOS_MuxPost (fs_mutex);\n\n    if (ret != LOS_OK)\n    {\n        VFS_ERRNO_SET (EAGAIN);\n        return -1;\n    }\n\n    if (mp->m_fs->fs_fops->mkdir != NULL)\n    {\n        ret = mp->m_fs->fs_fops->mkdir (mp, path_in_mp);\n    }\n    else\n    {\n        VFS_ERRNO_SET (ENOTSUP);\n        ret = -1;\n    }\n\n    LOS_MuxPost (mp->m_mutex);\n\n    return ret;\n}\n\nstatic int los_fs_name_check (const char *name)\n{\n    char ch;\n    int  len = 0;\n\n    do\n    {\n        ch = *name++;\n\n        if (ch == '\\0')\n        {\n            break;\n        }\n\n        if ((('a' <= ch) && (ch <= 'z')) ||\n                (('A' <= ch) && (ch <= 'Z')) ||\n                (('0' <= ch) && (ch <= '9')) ||\n                (ch == '_')                  ||\n                (ch == '-'))\n        {\n            len++;\n\n            if (len == LOS_FS_MAX_NAME_LEN)\n            {\n                return LOS_NOK;\n            }\n\n            continue;\n        }\n\n        return LOS_NOK;\n    } while (1);\n\n    return len == 0 ? LOS_NOK : LOS_OK;\n}\n\nstatic struct file_system *los_fs_find (const char *name)\n{\n    struct file_system *fs;\n\n    for (fs = file_systems; fs != NULL; fs = fs->fs_next)\n    {\n        if (strncmp(fs->fs_name, name, LOS_FS_MAX_NAME_LEN) == 0)\n        {\n            break;\n        }\n    }\n\n    return fs;\n}\n\nint los_fs_register (struct file_system *fs)\n{\n    if ((fs == NULL) || (fs->fs_fops == NULL) || (fs->fs_fops->open == NULL))\n    {\n        return LOS_NOK;\n    }\n\n    if (los_fs_name_check (fs->fs_name) != LOS_OK)\n    {\n        return LOS_NOK;\n    }\n\n    if (LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER) != LOS_OK)\n    {\n        return LOS_NOK;\n    }\n\n    if (los_fs_find (fs->fs_name) != NULL)\n    {\n        LOS_MuxPost (fs_mutex);\n        return LOS_NOK;\n    }\n\n    fs->fs_next = file_systems;\n    file_systems = fs;\n\n    LOS_MuxPost (fs_mutex);\n\n    return LOS_OK;\n}\n\nint los_fs_unregister (struct file_system *fs)\n{\n    struct file_system *prev;\n    int ret = LOS_OK;\n\n    if (fs == NULL)\n    {\n        return LOS_NOK;\n    }\n\n    if (LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER) != LOS_OK)\n    {\n        return LOS_NOK;\n    }\n\n    if (fs->fs_refs > 0)\n    {\n        goto out;\n    }\n\n    if (file_systems == fs)\n    {\n        file_systems = fs->fs_next;\n        goto out;\n    }\n\n    prev = file_systems;\n\n    while (prev != NULL)\n    {\n        if (prev->fs_next == fs)\n        {\n            break;\n        }\n\n        prev = prev->fs_next;\n    }\n\n    if (prev == NULL)\n    {\n        ret = LOS_NOK;\n    }\n    else\n    {\n        prev->fs_next = fs->fs_next;\n    }\n\nout:\n    LOS_MuxPost (fs_mutex);\n\n    return ret;\n}\n\nint los_fs_mount (const char *fsname, const char *path, void *data)\n{\n    struct file_system *fs;\n    struct mount_point *mp;\n    const char          *tmp = NULL;\n\n    if (fsname == NULL || path == NULL ||\n            path [0] == '\\0' || path [0] != '/')\n    {\n        return LOS_NOK;\n    }\n\n    LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER);\n\n    fs = los_fs_find (fsname);\n\n    if (fs == NULL)\n    {\n        goto err_post_exit;\n    }\n\n    mp = los_mp_find (path, &tmp);\n\n    if ((mp != NULL) && (tmp != NULL) && (*tmp == '\\0'))\n    {\n        goto err_post_exit;\n    }\n\n    mp = malloc (sizeof (struct mount_point));\n\n    if (mp == NULL)\n    {\n        PRINT_ERR (\"fail to malloc memory in VFS, <malloc.c> is needed,\"\n                   \"make sure it is added\\n\");\n        goto err_post_exit;\n    }\n\n    memset (mp, 0, sizeof (struct mount_point));\n\n    mp->m_fs   = fs;\n    mp->m_path = path;\n    mp->m_data = data;\n    mp->m_refs = 0;\n\n    if (LOS_OK != LOS_MuxCreate (&mp->m_mutex))\n    {\n        goto err_free_exit;\n    }\n\n    mp->m_next = mount_points;\n    mount_points = mp;\n\n    fs->fs_refs++;\n\n    LOS_MuxPost (fs_mutex);\n\n    return LOS_OK;\n\nerr_free_exit:\n    free (mp);\nerr_post_exit:\n    LOS_MuxPost (fs_mutex);\n    return LOS_NOK;\n}\n\nint los_fs_unmount (const char *path)\n{\n    struct mount_point *mp;\n    struct mount_point *prev;\n    const char          *tmp = NULL;\n    int                  ret = LOS_NOK;\n\n    if (path == NULL)\n    {\n        return ret;\n    }\n\n    LOS_MuxPend (fs_mutex, LOS_WAIT_FOREVER);\n\n    mp = los_mp_find (path, &tmp);\n\n    if ((mp == NULL) || (tmp == NULL) || (*tmp != '\\0') || (mp->m_refs != 0))\n    {\n        goto post_exit;\n    }\n\n    if (mount_points == mp)\n    {\n        mount_points = mp->m_next;\n    }\n    else\n    {\n        for (prev = mount_points; prev != NULL; prev = prev->m_next)\n        {\n            if (prev->m_next != mp)\n            {\n                continue;\n            }\n\n            prev->m_next = mp->m_next;\n            break;\n        }\n    }\n\n    LOS_MuxDelete (mp->m_mutex);\n\n    mp->m_fs->fs_refs--;\n\n    free (mp);\n\n    ret = LOS_OK;\n\npost_exit:\n    LOS_MuxPost (fs_mutex);\n    return ret;\n}\n\nint los_vfs_init (void)\n{\n    if (fs_mutex != LOS_ERRNO_MUX_PTR_NULL)\n    {\n        return LOS_OK;\n    }\n\n    if (LOS_MuxCreate (&fs_mutex) == LOS_OK)\n    {\n        return LOS_OK;\n    }\n\n    PRINT_ERR (\"los_vfs_init fail!\\n\");\n\n    return LOS_NOK;\n}\n\n\n#ifndef WITH_LINUX\n\n#define MAP_TO_POSIX_RET(ret)   ( (ret) < 0 ? -1 : (ret) )\n\nint open (const char *path, int flags,...)\n{\n    int ret = los_open (path, flags);\n    return MAP_TO_POSIX_RET(ret);\n}\n\nint close (int fd)\n{\n    int ret = los_close (fd);\n    return MAP_TO_POSIX_RET(ret);\n}\n\nssize_t read (int fd, void *buff, size_t bytes)\n{\n    ssize_t ret = los_read (fd, buff, bytes);\n    return MAP_TO_POSIX_RET(ret);\n}\n\nssize_t write (int fd, const void *buff, size_t bytes)\n{\n    ssize_t ret = los_write (fd, buff, bytes);\n    return MAP_TO_POSIX_RET(ret);\n}\n\noff_t lseek (int fd, off_t off, int whence)\n{\n    off_t ret = los_lseek (fd, off, whence);\n    return MAP_TO_POSIX_RET(ret);\n}\n\nint stat (const char *path, struct stat *stat)\n{\n    int ret = los_stat (path, stat);\n    return MAP_TO_POSIX_RET(ret);\n}\n\nint unlink (const char *path)\n{\n    int ret = los_unlink (path);\n    return MAP_TO_POSIX_RET(ret);\n}\n\nint rename (const char *oldpath, const char *newpath)\n{\n    int ret = los_rename (oldpath, newpath);\n    return MAP_TO_POSIX_RET(ret);\n}\n\nint fsync (int fd)\n{\n    int ret = los_sync (fd);\n    return MAP_TO_POSIX_RET(ret);\n}\n\nstruct dir *opendir (const char *path)\n{\n    return los_opendir (path);\n}\n\nstruct dirent *readdir (struct dir *dir)\n{\n    return los_readdir (dir);\n}\n\nint closedir (struct dir *dir)\n{\n    int ret = los_closedir (dir);\n    return MAP_TO_POSIX_RET(ret);\n}\n\nint mkdir (const char *path, int mode)\n{\n    int ret = los_mkdir (path, mode);\n    return MAP_TO_POSIX_RET(ret);\n}\n\n#endif\n#endif"
  },
  {
    "path": "Huawei_LiteOS/components/lib/cJSON/cJSON.c",
    "content": "/*\n  Copyright (c) 2009-2017 Dave Gamble and cJSON contributors\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n*/\n\n/* cJSON */\n/* JSON parser in C. */\n\n/* disable warnings about old C89 functions in MSVC */\n#if !defined(_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER)\n#define _CRT_SECURE_NO_DEPRECATE\n#endif\n\n#ifdef __GNUC__\n#pragma GCC visibility push(default)\n#endif\n#if defined(_MSC_VER)\n#pragma warning (push)\n/* disable warning about single line comments in system headers */\n#pragma warning (disable : 4001)\n#endif\n\n#include <string.h>\n#include <stdio.h>\n#include <math.h>\n#include <stdlib.h>\n#include <limits.h>\n#include <ctype.h>\n\n#ifdef ENABLE_LOCALES\n#include <locale.h>\n#endif\n\n#if defined(_MSC_VER)\n#pragma warning (pop)\n#endif\n#ifdef __GNUC__\n#pragma GCC visibility pop\n#endif\n\n#include \"cJSON.h\"\n\n/* define our own boolean type */\n#define true ((cJSON_bool)1)\n#define false ((cJSON_bool)0)\n\ntypedef struct {\n    const unsigned char *json;\n    size_t position;\n} error;\nstatic error global_error = { NULL, 0 };\n\nCJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void)\n{\n    return (const char*) (global_error.json + global_error.position);\n}\n\nCJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item) {\n    if (!cJSON_IsString(item)) {\n        return NULL;\n    }\n\n    return item->valuestring;\n}\n\n/* This is a safeguard to prevent copy-pasters from using incompatible C and header files */\n#if (CJSON_VERSION_MAJOR != 1) || (CJSON_VERSION_MINOR != 7) || (CJSON_VERSION_PATCH != 8)\n    #error cJSON.h and cJSON.c have different versions. Make sure that both have the same.\n#endif\n\nCJSON_PUBLIC(const char*) cJSON_Version(void)\n{\n    static char version[15];\n    sprintf(version, \"%i.%i.%i\", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH);\n\n    return version;\n}\n\n/* Case insensitive string comparison, doesn't consider two NULL pointers equal though */\nstatic int case_insensitive_strcmp(const unsigned char *string1, const unsigned char *string2)\n{\n    if ((string1 == NULL) || (string2 == NULL))\n    {\n        return 1;\n    }\n\n    if (string1 == string2)\n    {\n        return 0;\n    }\n\n    for(; tolower(*string1) == tolower(*string2); (void)string1++, string2++)\n    {\n        if (*string1 == '\\0')\n        {\n            return 0;\n        }\n    }\n\n    return tolower(*string1) - tolower(*string2);\n}\n\ntypedef struct internal_hooks\n{\n    void *(CJSON_CDECL *allocate)(size_t size);\n    void (CJSON_CDECL *deallocate)(void *pointer);\n    void *(CJSON_CDECL *reallocate)(void *pointer, size_t size);\n} internal_hooks;\n\n#if defined(_MSC_VER)\n/* work around MSVC error C2322: '...' address of dillimport '...' is not static */\nstatic void * CJSON_CDECL internal_malloc(size_t size)\n{\n    return malloc(size);\n}\nstatic void CJSON_CDECL internal_free(void *pointer)\n{\n    free(pointer);\n}\nstatic void * CJSON_CDECL internal_realloc(void *pointer, size_t size)\n{\n    return realloc(pointer, size);\n}\n#else\n#define internal_malloc malloc\n#define internal_free free\n#define internal_realloc realloc\n#endif\n\nstatic internal_hooks global_hooks = { internal_malloc, internal_free, internal_realloc };\n\nstatic unsigned char* cJSON_strdup(const unsigned char* string, const internal_hooks * const hooks)\n{\n    size_t length = 0;\n    unsigned char *copy = NULL;\n\n    if (string == NULL)\n    {\n        return NULL;\n    }\n\n    length = strlen((const char*)string) + sizeof(\"\");\n    copy = (unsigned char*)hooks->allocate(length);\n    if (copy == NULL)\n    {\n        return NULL;\n    }\n    memcpy(copy, string, length);\n\n    return copy;\n}\n\nCJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks)\n{\n    if (hooks == NULL)\n    {\n        /* Reset hooks */\n        global_hooks.allocate = malloc;\n        global_hooks.deallocate = free;\n        global_hooks.reallocate = realloc;\n        return;\n    }\n\n    global_hooks.allocate = malloc;\n    if (hooks->malloc_fn != NULL)\n    {\n        global_hooks.allocate = hooks->malloc_fn;\n    }\n\n    global_hooks.deallocate = free;\n    if (hooks->free_fn != NULL)\n    {\n        global_hooks.deallocate = hooks->free_fn;\n    }\n\n    /* use realloc only if both free and malloc are used */\n    global_hooks.reallocate = NULL;\n    if ((global_hooks.allocate == malloc) && (global_hooks.deallocate == free))\n    {\n        global_hooks.reallocate = realloc;\n    }\n}\n\n/* Internal constructor. */\nstatic cJSON *cJSON_New_Item(const internal_hooks * const hooks)\n{\n    cJSON* node = (cJSON*)hooks->allocate(sizeof(cJSON));\n    if (node)\n    {\n        memset(node, '\\0', sizeof(cJSON));\n    }\n\n    return node;\n}\n\n/* Delete a cJSON structure. */\nCJSON_PUBLIC(void) cJSON_Delete(cJSON *item)\n{\n    cJSON *next = NULL;\n    while (item != NULL)\n    {\n        next = item->next;\n        if (!(item->type & cJSON_IsReference) && (item->child != NULL))\n        {\n            cJSON_Delete(item->child);\n        }\n        if (!(item->type & cJSON_IsReference) && (item->valuestring != NULL))\n        {\n            global_hooks.deallocate(item->valuestring);\n        }\n        if (!(item->type & cJSON_StringIsConst) && (item->string != NULL))\n        {\n            global_hooks.deallocate(item->string);\n        }\n        global_hooks.deallocate(item);\n        item = next;\n    }\n}\n\n/* get the decimal point character of the current locale */\nstatic unsigned char get_decimal_point(void)\n{\n#ifdef ENABLE_LOCALES\n    struct lconv *lconv = localeconv();\n    return (unsigned char) lconv->decimal_point[0];\n#else\n    return '.';\n#endif\n}\n\ntypedef struct\n{\n    const unsigned char *content;\n    size_t length;\n    size_t offset;\n    size_t depth; /* How deeply nested (in arrays/objects) is the input at the current offset. */\n    internal_hooks hooks;\n} parse_buffer;\n\n/* check if the given size is left to read in a given parse buffer (starting with 1) */\n#define can_read(buffer, size) ((buffer != NULL) && (((buffer)->offset + size) <= (buffer)->length))\n/* check if the buffer can be accessed at the given index (starting with 0) */\n#define can_access_at_index(buffer, index) ((buffer != NULL) && (((buffer)->offset + index) < (buffer)->length))\n#define cannot_access_at_index(buffer, index) (!can_access_at_index(buffer, index))\n/* get a pointer to the buffer at the position */\n#define buffer_at_offset(buffer) ((buffer)->content + (buffer)->offset)\n\n/* Parse the input text to generate a number, and populate the result into item. */\nstatic cJSON_bool parse_number(cJSON * const item, parse_buffer * const input_buffer)\n{\n    double number = 0;\n    unsigned char *after_end = NULL;\n    unsigned char number_c_string[64];\n    unsigned char decimal_point = get_decimal_point();\n    size_t i = 0;\n\n    if ((input_buffer == NULL) || (input_buffer->content == NULL))\n    {\n        return false;\n    }\n\n    /* copy the number into a temporary buffer and replace '.' with the decimal point\n     * of the current locale (for strtod)\n     * This also takes care of '\\0' not necessarily being available for marking the end of the input */\n    for (i = 0; (i < (sizeof(number_c_string) - 1)) && can_access_at_index(input_buffer, i); i++)\n    {\n        switch (buffer_at_offset(input_buffer)[i])\n        {\n            case '0':\n            case '1':\n            case '2':\n            case '3':\n            case '4':\n            case '5':\n            case '6':\n            case '7':\n            case '8':\n            case '9':\n            case '+':\n            case '-':\n            case 'e':\n            case 'E':\n                number_c_string[i] = buffer_at_offset(input_buffer)[i];\n                break;\n\n            case '.':\n                number_c_string[i] = decimal_point;\n                break;\n\n            default:\n                goto loop_end;\n        }\n    }\nloop_end:\n    number_c_string[i] = '\\0';\n\n    number = strtod((const char*)number_c_string, (char**)&after_end);\n    if (number_c_string == after_end)\n    {\n        return false; /* parse_error */\n    }\n\n    item->valuedouble = number;\n\n    /* use saturation in case of overflow */\n    if (number >= INT_MAX)\n    {\n        item->valueint = INT_MAX;\n    }\n    else if (number <= INT_MIN)\n    {\n        item->valueint = INT_MIN;\n    }\n    else\n    {\n        item->valueint = (int)number;\n    }\n\n    item->type = cJSON_Number;\n\n    input_buffer->offset += (size_t)(after_end - number_c_string);\n    return true;\n}\n\n/* don't ask me, but the original cJSON_SetNumberValue returns an integer or double */\nCJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number)\n{\n    if (number >= INT_MAX)\n    {\n        object->valueint = INT_MAX;\n    }\n    else if (number <= INT_MIN)\n    {\n        object->valueint = INT_MIN;\n    }\n    else\n    {\n        object->valueint = (int)number;\n    }\n\n    return object->valuedouble = number;\n}\n\ntypedef struct\n{\n    unsigned char *buffer;\n    size_t length;\n    size_t offset;\n    size_t depth; /* current nesting depth (for formatted printing) */\n    cJSON_bool noalloc;\n    cJSON_bool format; /* is this print a formatted print */\n    internal_hooks hooks;\n} printbuffer;\n\n/* realloc printbuffer if necessary to have at least \"needed\" bytes more */\nstatic unsigned char* ensure(printbuffer * const p, size_t needed)\n{\n    unsigned char *newbuffer = NULL;\n    size_t newsize = 0;\n\n    if ((p == NULL) || (p->buffer == NULL))\n    {\n        return NULL;\n    }\n\n    if ((p->length > 0) && (p->offset >= p->length))\n    {\n        /* make sure that offset is valid */\n        return NULL;\n    }\n\n    if (needed > INT_MAX)\n    {\n        /* sizes bigger than INT_MAX are currently not supported */\n        return NULL;\n    }\n\n    needed += p->offset + 1;\n    if (needed <= p->length)\n    {\n        return p->buffer + p->offset;\n    }\n\n    if (p->noalloc) {\n        return NULL;\n    }\n\n    /* calculate new buffer size */\n    if (needed > (INT_MAX / 2))\n    {\n        /* overflow of int, use INT_MAX if possible */\n        if (needed <= INT_MAX)\n        {\n            newsize = INT_MAX;\n        }\n        else\n        {\n            return NULL;\n        }\n    }\n    else\n    {\n        newsize = needed * 2;\n    }\n\n    if (p->hooks.reallocate != NULL)\n    {\n        /* reallocate with realloc if available */\n        newbuffer = (unsigned char*)p->hooks.reallocate(p->buffer, newsize);\n        if (newbuffer == NULL)\n        {\n            p->hooks.deallocate(p->buffer);\n            p->length = 0;\n            p->buffer = NULL;\n\n            return NULL;\n        }\n    }\n    else\n    {\n        /* otherwise reallocate manually */\n        newbuffer = (unsigned char*)p->hooks.allocate(newsize);\n        if (!newbuffer)\n        {\n            p->hooks.deallocate(p->buffer);\n            p->length = 0;\n            p->buffer = NULL;\n\n            return NULL;\n        }\n        if (newbuffer)\n        {\n            memcpy(newbuffer, p->buffer, p->offset + 1);\n        }\n        p->hooks.deallocate(p->buffer);\n    }\n    p->length = newsize;\n    p->buffer = newbuffer;\n\n    return newbuffer + p->offset;\n}\n\n/* calculate the new length of the string in a printbuffer and update the offset */\nstatic void update_offset(printbuffer * const buffer)\n{\n    const unsigned char *buffer_pointer = NULL;\n    if ((buffer == NULL) || (buffer->buffer == NULL))\n    {\n        return;\n    }\n    buffer_pointer = buffer->buffer + buffer->offset;\n\n    buffer->offset += strlen((const char*)buffer_pointer);\n}\n\n/* Render the number nicely from the given item into a string. */\nstatic cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer)\n{\n    unsigned char *output_pointer = NULL;\n    double d = item->valuedouble;\n    int length = 0;\n    size_t i = 0;\n    unsigned char number_buffer[26]; /* temporary buffer to print the number into */\n    unsigned char decimal_point = get_decimal_point();\n    double test;\n\n    if (output_buffer == NULL)\n    {\n        return false;\n    }\n\n    /* This checks for NaN and Infinity */\n    if ((d * 0) != 0)\n    {\n        length = sprintf((char*)number_buffer, \"null\");\n    }\n    else\n    {\n        /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */\n        length = sprintf((char*)number_buffer, \"%1.15g\", d);\n\n        /* Check whether the original double can be recovered */\n        if ((sscanf((char*)number_buffer, \"%lg\", &test) != 1) || ((double)test != d))\n        {\n            /* If not, print with 17 decimal places of precision */\n            length = sprintf((char*)number_buffer, \"%1.17g\", d);\n        }\n    }\n\n    /* sprintf failed or buffer overrun occured */\n    if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1)))\n    {\n        return false;\n    }\n\n    /* reserve appropriate space in the output */\n    output_pointer = ensure(output_buffer, (size_t)length + sizeof(\"\"));\n    if (output_pointer == NULL)\n    {\n        return false;\n    }\n\n    /* copy the printed number to the output and replace locale\n     * dependent decimal point with '.' */\n    for (i = 0; i < ((size_t)length); i++)\n    {\n        if (number_buffer[i] == decimal_point)\n        {\n            output_pointer[i] = '.';\n            continue;\n        }\n\n        output_pointer[i] = number_buffer[i];\n    }\n    output_pointer[i] = '\\0';\n\n    output_buffer->offset += (size_t)length;\n\n    return true;\n}\n\n/* parse 4 digit hexadecimal number */\nstatic unsigned parse_hex4(const unsigned char * const input)\n{\n    unsigned int h = 0;\n    size_t i = 0;\n\n    for (i = 0; i < 4; i++)\n    {\n        /* parse digit */\n        if ((input[i] >= '0') && (input[i] <= '9'))\n        {\n            h += (unsigned int) input[i] - '0';\n        }\n        else if ((input[i] >= 'A') && (input[i] <= 'F'))\n        {\n            h += (unsigned int) 10 + input[i] - 'A';\n        }\n        else if ((input[i] >= 'a') && (input[i] <= 'f'))\n        {\n            h += (unsigned int) 10 + input[i] - 'a';\n        }\n        else /* invalid */\n        {\n            return 0;\n        }\n\n        if (i < 3)\n        {\n            /* shift left to make place for the next nibble */\n            h = h << 4;\n        }\n    }\n\n    return h;\n}\n\n/* converts a UTF-16 literal to UTF-8\n * A literal can be one or two sequences of the form \\uXXXX */\nstatic unsigned char utf16_literal_to_utf8(const unsigned char * const input_pointer, const unsigned char * const input_end, unsigned char **output_pointer)\n{\n    long unsigned int codepoint = 0;\n    unsigned int first_code = 0;\n    const unsigned char *first_sequence = input_pointer;\n    unsigned char utf8_length = 0;\n    unsigned char utf8_position = 0;\n    unsigned char sequence_length = 0;\n    unsigned char first_byte_mark = 0;\n\n    if ((input_end - first_sequence) < 6)\n    {\n        /* input ends unexpectedly */\n        goto fail;\n    }\n\n    /* get the first utf16 sequence */\n    first_code = parse_hex4(first_sequence + 2);\n\n    /* check that the code is valid */\n    if (((first_code >= 0xDC00) && (first_code <= 0xDFFF)))\n    {\n        goto fail;\n    }\n\n    /* UTF16 surrogate pair */\n    if ((first_code >= 0xD800) && (first_code <= 0xDBFF))\n    {\n        const unsigned char *second_sequence = first_sequence + 6;\n        unsigned int second_code = 0;\n        sequence_length = 12; /* \\uXXXX\\uXXXX */\n\n        if ((input_end - second_sequence) < 6)\n        {\n            /* input ends unexpectedly */\n            goto fail;\n        }\n\n        if ((second_sequence[0] != '\\\\') || (second_sequence[1] != 'u'))\n        {\n            /* missing second half of the surrogate pair */\n            goto fail;\n        }\n\n        /* get the second utf16 sequence */\n        second_code = parse_hex4(second_sequence + 2);\n        /* check that the code is valid */\n        if ((second_code < 0xDC00) || (second_code > 0xDFFF))\n        {\n            /* invalid second half of the surrogate pair */\n            goto fail;\n        }\n\n\n        /* calculate the unicode codepoint from the surrogate pair */\n        codepoint = 0x10000 + (((first_code & 0x3FF) << 10) | (second_code & 0x3FF));\n    }\n    else\n    {\n        sequence_length = 6; /* \\uXXXX */\n        codepoint = first_code;\n    }\n\n    /* encode as UTF-8\n     * takes at maximum 4 bytes to encode:\n     * 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx */\n    if (codepoint < 0x80)\n    {\n        /* normal ascii, encoding 0xxxxxxx */\n        utf8_length = 1;\n    }\n    else if (codepoint < 0x800)\n    {\n        /* two bytes, encoding 110xxxxx 10xxxxxx */\n        utf8_length = 2;\n        first_byte_mark = 0xC0; /* 11000000 */\n    }\n    else if (codepoint < 0x10000)\n    {\n        /* three bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx */\n        utf8_length = 3;\n        first_byte_mark = 0xE0; /* 11100000 */\n    }\n    else if (codepoint <= 0x10FFFF)\n    {\n        /* four bytes, encoding 1110xxxx 10xxxxxx 10xxxxxx 10xxxxxx */\n        utf8_length = 4;\n        first_byte_mark = 0xF0; /* 11110000 */\n    }\n    else\n    {\n        /* invalid unicode codepoint */\n        goto fail;\n    }\n\n    /* encode as utf8 */\n    for (utf8_position = (unsigned char)(utf8_length - 1); utf8_position > 0; utf8_position--)\n    {\n        /* 10xxxxxx */\n        (*output_pointer)[utf8_position] = (unsigned char)((codepoint | 0x80) & 0xBF);\n        codepoint >>= 6;\n    }\n    /* encode first byte */\n    if (utf8_length > 1)\n    {\n        (*output_pointer)[0] = (unsigned char)((codepoint | first_byte_mark) & 0xFF);\n    }\n    else\n    {\n        (*output_pointer)[0] = (unsigned char)(codepoint & 0x7F);\n    }\n\n    *output_pointer += utf8_length;\n\n    return sequence_length;\n\nfail:\n    return 0;\n}\n\n/* Parse the input text into an unescaped cinput, and populate item. */\nstatic cJSON_bool parse_string(cJSON * const item, parse_buffer * const input_buffer)\n{\n    const unsigned char *input_pointer = buffer_at_offset(input_buffer) + 1;\n    const unsigned char *input_end = buffer_at_offset(input_buffer) + 1;\n    unsigned char *output_pointer = NULL;\n    unsigned char *output = NULL;\n\n    /* not a string */\n    if (buffer_at_offset(input_buffer)[0] != '\\\"')\n    {\n        goto fail;\n    }\n\n    {\n        /* calculate approximate size of the output (overestimate) */\n        size_t allocation_length = 0;\n        size_t skipped_bytes = 0;\n        while (((size_t)(input_end - input_buffer->content) < input_buffer->length) && (*input_end != '\\\"'))\n        {\n            /* is escape sequence */\n            if (input_end[0] == '\\\\')\n            {\n                if ((size_t)(input_end + 1 - input_buffer->content) >= input_buffer->length)\n                {\n                    /* prevent buffer overflow when last input character is a backslash */\n                    goto fail;\n                }\n                skipped_bytes++;\n                input_end++;\n            }\n            input_end++;\n        }\n        if (((size_t)(input_end - input_buffer->content) >= input_buffer->length) || (*input_end != '\\\"'))\n        {\n            goto fail; /* string ended unexpectedly */\n        }\n\n        /* This is at most how much we need for the output */\n        allocation_length = (size_t) (input_end - buffer_at_offset(input_buffer)) - skipped_bytes;\n        output = (unsigned char*)input_buffer->hooks.allocate(allocation_length + sizeof(\"\"));\n        if (output == NULL)\n        {\n            goto fail; /* allocation failure */\n        }\n    }\n\n    output_pointer = output;\n    /* loop through the string literal */\n    while (input_pointer < input_end)\n    {\n        if (*input_pointer != '\\\\')\n        {\n            *output_pointer++ = *input_pointer++;\n        }\n        /* escape sequence */\n        else\n        {\n            unsigned char sequence_length = 2;\n            if ((input_end - input_pointer) < 1)\n            {\n                goto fail;\n            }\n\n            switch (input_pointer[1])\n            {\n                case 'b':\n                    *output_pointer++ = '\\b';\n                    break;\n                case 'f':\n                    *output_pointer++ = '\\f';\n                    break;\n                case 'n':\n                    *output_pointer++ = '\\n';\n                    break;\n                case 'r':\n                    *output_pointer++ = '\\r';\n                    break;\n                case 't':\n                    *output_pointer++ = '\\t';\n                    break;\n                case '\\\"':\n                case '\\\\':\n                case '/':\n                    *output_pointer++ = input_pointer[1];\n                    break;\n\n                /* UTF-16 literal */\n                case 'u':\n                    sequence_length = utf16_literal_to_utf8(input_pointer, input_end, &output_pointer);\n                    if (sequence_length == 0)\n                    {\n                        /* failed to convert UTF16-literal to UTF-8 */\n                        goto fail;\n                    }\n                    break;\n\n                default:\n                    goto fail;\n            }\n            input_pointer += sequence_length;\n        }\n    }\n\n    /* zero terminate the output */\n    *output_pointer = '\\0';\n\n    item->type = cJSON_String;\n    item->valuestring = (char*)output;\n\n    input_buffer->offset = (size_t) (input_end - input_buffer->content);\n    input_buffer->offset++;\n\n    return true;\n\nfail:\n    if (output != NULL)\n    {\n        input_buffer->hooks.deallocate(output);\n    }\n\n    if (input_pointer != NULL)\n    {\n        input_buffer->offset = (size_t)(input_pointer - input_buffer->content);\n    }\n\n    return false;\n}\n\n/* Render the cstring provided to an escaped version that can be printed. */\nstatic cJSON_bool print_string_ptr(const unsigned char * const input, printbuffer * const output_buffer)\n{\n    const unsigned char *input_pointer = NULL;\n    unsigned char *output = NULL;\n    unsigned char *output_pointer = NULL;\n    size_t output_length = 0;\n    /* numbers of additional characters needed for escaping */\n    size_t escape_characters = 0;\n\n    if (output_buffer == NULL)\n    {\n        return false;\n    }\n\n    /* empty string */\n    if (input == NULL)\n    {\n        output = ensure(output_buffer, sizeof(\"\\\"\\\"\"));\n        if (output == NULL)\n        {\n            return false;\n        }\n        strcpy((char*)output, \"\\\"\\\"\");\n\n        return true;\n    }\n\n    /* set \"flag\" to 1 if something needs to be escaped */\n    for (input_pointer = input; *input_pointer; input_pointer++)\n    {\n        switch (*input_pointer)\n        {\n            case '\\\"':\n            case '\\\\':\n            case '\\b':\n            case '\\f':\n            case '\\n':\n            case '\\r':\n            case '\\t':\n                /* one character escape sequence */\n                escape_characters++;\n                break;\n            default:\n                if (*input_pointer < 32)\n                {\n                    /* UTF-16 escape sequence uXXXX */\n                    escape_characters += 5;\n                }\n                break;\n        }\n    }\n    output_length = (size_t)(input_pointer - input) + escape_characters;\n\n    output = ensure(output_buffer, output_length + sizeof(\"\\\"\\\"\"));\n    if (output == NULL)\n    {\n        return false;\n    }\n\n    /* no characters have to be escaped */\n    if (escape_characters == 0)\n    {\n        output[0] = '\\\"';\n        memcpy(output + 1, input, output_length);\n        output[output_length + 1] = '\\\"';\n        output[output_length + 2] = '\\0';\n\n        return true;\n    }\n\n    output[0] = '\\\"';\n    output_pointer = output + 1;\n    /* copy the string */\n    for (input_pointer = input; *input_pointer != '\\0'; (void)input_pointer++, output_pointer++)\n    {\n        if ((*input_pointer > 31) && (*input_pointer != '\\\"') && (*input_pointer != '\\\\'))\n        {\n            /* normal character, copy */\n            *output_pointer = *input_pointer;\n        }\n        else\n        {\n            /* character needs to be escaped */\n            *output_pointer++ = '\\\\';\n            switch (*input_pointer)\n            {\n                case '\\\\':\n                    *output_pointer = '\\\\';\n                    break;\n                case '\\\"':\n                    *output_pointer = '\\\"';\n                    break;\n                case '\\b':\n                    *output_pointer = 'b';\n                    break;\n                case '\\f':\n                    *output_pointer = 'f';\n                    break;\n                case '\\n':\n                    *output_pointer = 'n';\n                    break;\n                case '\\r':\n                    *output_pointer = 'r';\n                    break;\n                case '\\t':\n                    *output_pointer = 't';\n                    break;\n                default:\n                    /* escape and print as unicode codepoint */\n                    sprintf((char*)output_pointer, \"u%04x\", *input_pointer);\n                    output_pointer += 4;\n                    break;\n            }\n        }\n    }\n    output[output_length + 1] = '\\\"';\n    output[output_length + 2] = '\\0';\n\n    return true;\n}\n\n/* Invoke print_string_ptr (which is useful) on an item. */\nstatic cJSON_bool print_string(const cJSON * const item, printbuffer * const p)\n{\n    return print_string_ptr((unsigned char*)item->valuestring, p);\n}\n\n/* Predeclare these prototypes. */\nstatic cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer);\nstatic cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer);\nstatic cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer);\nstatic cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer);\nstatic cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer);\nstatic cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer);\n\n/* Utility to jump whitespace and cr/lf */\nstatic parse_buffer *buffer_skip_whitespace(parse_buffer * const buffer)\n{\n    if ((buffer == NULL) || (buffer->content == NULL))\n    {\n        return NULL;\n    }\n\n    while (can_access_at_index(buffer, 0) && (buffer_at_offset(buffer)[0] <= 32))\n    {\n       buffer->offset++;\n    }\n\n    if (buffer->offset == buffer->length)\n    {\n        buffer->offset--;\n    }\n\n    return buffer;\n}\n\n/* skip the UTF-8 BOM (byte order mark) if it is at the beginning of a buffer */\nstatic parse_buffer *skip_utf8_bom(parse_buffer * const buffer)\n{\n    if ((buffer == NULL) || (buffer->content == NULL) || (buffer->offset != 0))\n    {\n        return NULL;\n    }\n\n    if (can_access_at_index(buffer, 4) && (strncmp((const char*)buffer_at_offset(buffer), \"\\xEF\\xBB\\xBF\", 3) == 0))\n    {\n        buffer->offset += 3;\n    }\n\n    return buffer;\n}\n\n/* Parse an object - create a new root, and populate. */\nCJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated)\n{\n    parse_buffer buffer = { 0, 0, 0, 0, { 0, 0, 0 } };\n    cJSON *item = NULL;\n\n    /* reset error position */\n    global_error.json = NULL;\n    global_error.position = 0;\n\n    if (value == NULL)\n    {\n        goto fail;\n    }\n\n    buffer.content = (const unsigned char*)value;\n    buffer.length = strlen((const char*)value) + sizeof(\"\");\n    buffer.offset = 0;\n    buffer.hooks = global_hooks;\n\n    item = cJSON_New_Item(&global_hooks);\n    if (item == NULL) /* memory fail */\n    {\n        goto fail;\n    }\n\n    if (!parse_value(item, buffer_skip_whitespace(skip_utf8_bom(&buffer))))\n    {\n        /* parse failure. ep is set. */\n        goto fail;\n    }\n\n    /* if we require null-terminated JSON without appended garbage, skip and then check for a null terminator */\n    if (require_null_terminated)\n    {\n        buffer_skip_whitespace(&buffer);\n        if ((buffer.offset >= buffer.length) || buffer_at_offset(&buffer)[0] != '\\0')\n        {\n            goto fail;\n        }\n    }\n    if (return_parse_end)\n    {\n        *return_parse_end = (const char*)buffer_at_offset(&buffer);\n    }\n\n    return item;\n\nfail:\n    if (item != NULL)\n    {\n        cJSON_Delete(item);\n    }\n\n    if (value != NULL)\n    {\n        error local_error;\n        local_error.json = (const unsigned char*)value;\n        local_error.position = 0;\n\n        if (buffer.offset < buffer.length)\n        {\n            local_error.position = buffer.offset;\n        }\n        else if (buffer.length > 0)\n        {\n            local_error.position = buffer.length - 1;\n        }\n\n        if (return_parse_end != NULL)\n        {\n            *return_parse_end = (const char*)local_error.json + local_error.position;\n        }\n\n        global_error = local_error;\n    }\n\n    return NULL;\n}\n\n/* Default options for cJSON_Parse */\nCJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value)\n{\n    return cJSON_ParseWithOpts(value, 0, 0);\n}\n\n#define cjson_min(a, b) ((a < b) ? a : b)\n\nstatic unsigned char *print(const cJSON * const item, cJSON_bool format, const internal_hooks * const hooks)\n{\n    static const size_t default_buffer_size = 256;\n    printbuffer buffer[1];\n    unsigned char *printed = NULL;\n\n    memset(buffer, 0, sizeof(buffer));\n\n    /* create buffer */\n    buffer->buffer = (unsigned char*) hooks->allocate(default_buffer_size);\n    buffer->length = default_buffer_size;\n    buffer->format = format;\n    buffer->hooks = *hooks;\n    if (buffer->buffer == NULL)\n    {\n        goto fail;\n    }\n\n    /* print the value */\n    if (!print_value(item, buffer))\n    {\n        goto fail;\n    }\n    update_offset(buffer);\n\n    /* check if reallocate is available */\n    if (hooks->reallocate != NULL)\n    {\n        printed = (unsigned char*) hooks->reallocate(buffer->buffer, buffer->offset + 1);\n        if (printed == NULL) {\n            goto fail;\n        }\n        buffer->buffer = NULL;\n    }\n    else /* otherwise copy the JSON over to a new buffer */\n    {\n        printed = (unsigned char*) hooks->allocate(buffer->offset + 1);\n        if (printed == NULL)\n        {\n            goto fail;\n        }\n        memcpy(printed, buffer->buffer, cjson_min(buffer->length, buffer->offset + 1));\n        printed[buffer->offset] = '\\0'; /* just to be sure */\n\n        /* free the buffer */\n        hooks->deallocate(buffer->buffer);\n    }\n\n    return printed;\n\nfail:\n    if (buffer->buffer != NULL)\n    {\n        hooks->deallocate(buffer->buffer);\n    }\n\n    if (printed != NULL)\n    {\n        hooks->deallocate(printed);\n    }\n\n    return NULL;\n}\n\n/* Render a cJSON item/entity/structure to text. */\nCJSON_PUBLIC(char *) cJSON_Print(const cJSON *item)\n{\n    return (char*)print(item, true, &global_hooks);\n}\n\nCJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item)\n{\n    return (char*)print(item, false, &global_hooks);\n}\n\nCJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt)\n{\n    printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };\n\n    if (prebuffer < 0)\n    {\n        return NULL;\n    }\n\n    p.buffer = (unsigned char*)global_hooks.allocate((size_t)prebuffer);\n    if (!p.buffer)\n    {\n        return NULL;\n    }\n\n    p.length = (size_t)prebuffer;\n    p.offset = 0;\n    p.noalloc = false;\n    p.format = fmt;\n    p.hooks = global_hooks;\n\n    if (!print_value(item, &p))\n    {\n        global_hooks.deallocate(p.buffer);\n        return NULL;\n    }\n\n    return (char*)p.buffer;\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buf, const int len, const cJSON_bool fmt)\n{\n    printbuffer p = { 0, 0, 0, 0, 0, 0, { 0, 0, 0 } };\n\n    if ((len < 0) || (buf == NULL))\n    {\n        return false;\n    }\n\n    p.buffer = (unsigned char*)buf;\n    p.length = (size_t)len;\n    p.offset = 0;\n    p.noalloc = true;\n    p.format = fmt;\n    p.hooks = global_hooks;\n\n    return print_value(item, &p);\n}\n\n/* Parser core - when encountering text, process appropriately. */\nstatic cJSON_bool parse_value(cJSON * const item, parse_buffer * const input_buffer)\n{\n    if ((input_buffer == NULL) || (input_buffer->content == NULL))\n    {\n        return false; /* no input */\n    }\n\n    /* parse the different types of values */\n    /* null */\n    if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), \"null\", 4) == 0))\n    {\n        item->type = cJSON_NULL;\n        input_buffer->offset += 4;\n        return true;\n    }\n    /* false */\n    if (can_read(input_buffer, 5) && (strncmp((const char*)buffer_at_offset(input_buffer), \"false\", 5) == 0))\n    {\n        item->type = cJSON_False;\n        input_buffer->offset += 5;\n        return true;\n    }\n    /* true */\n    if (can_read(input_buffer, 4) && (strncmp((const char*)buffer_at_offset(input_buffer), \"true\", 4) == 0))\n    {\n        item->type = cJSON_True;\n        item->valueint = 1;\n        input_buffer->offset += 4;\n        return true;\n    }\n    /* string */\n    if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '\\\"'))\n    {\n        return parse_string(item, input_buffer);\n    }\n    /* number */\n    if (can_access_at_index(input_buffer, 0) && ((buffer_at_offset(input_buffer)[0] == '-') || ((buffer_at_offset(input_buffer)[0] >= '0') && (buffer_at_offset(input_buffer)[0] <= '9'))))\n    {\n        return parse_number(item, input_buffer);\n    }\n    /* array */\n    if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '['))\n    {\n        return parse_array(item, input_buffer);\n    }\n    /* object */\n    if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '{'))\n    {\n        return parse_object(item, input_buffer);\n    }\n\n    return false;\n}\n\n/* Render a value to text. */\nstatic cJSON_bool print_value(const cJSON * const item, printbuffer * const output_buffer)\n{\n    unsigned char *output = NULL;\n\n    if ((item == NULL) || (output_buffer == NULL))\n    {\n        return false;\n    }\n\n    switch ((item->type) & 0xFF)\n    {\n        case cJSON_NULL:\n            output = ensure(output_buffer, 5);\n            if (output == NULL)\n            {\n                return false;\n            }\n            strcpy((char*)output, \"null\");\n            return true;\n\n        case cJSON_False:\n            output = ensure(output_buffer, 6);\n            if (output == NULL)\n            {\n                return false;\n            }\n            strcpy((char*)output, \"false\");\n            return true;\n\n        case cJSON_True:\n            output = ensure(output_buffer, 5);\n            if (output == NULL)\n            {\n                return false;\n            }\n            strcpy((char*)output, \"true\");\n            return true;\n\n        case cJSON_Number:\n            return print_number(item, output_buffer);\n\n        case cJSON_Raw:\n        {\n            size_t raw_length = 0;\n            if (item->valuestring == NULL)\n            {\n                return false;\n            }\n\n            raw_length = strlen(item->valuestring) + sizeof(\"\");\n            output = ensure(output_buffer, raw_length);\n            if (output == NULL)\n            {\n                return false;\n            }\n            memcpy(output, item->valuestring, raw_length);\n            return true;\n        }\n\n        case cJSON_String:\n            return print_string(item, output_buffer);\n\n        case cJSON_Array:\n            return print_array(item, output_buffer);\n\n        case cJSON_Object:\n            return print_object(item, output_buffer);\n\n        default:\n            return false;\n    }\n}\n\n/* Build an array from input text. */\nstatic cJSON_bool parse_array(cJSON * const item, parse_buffer * const input_buffer)\n{\n    cJSON *head = NULL; /* head of the linked list */\n    cJSON *current_item = NULL;\n\n    if (input_buffer->depth >= CJSON_NESTING_LIMIT)\n    {\n        return false; /* to deeply nested */\n    }\n    input_buffer->depth++;\n\n    if (buffer_at_offset(input_buffer)[0] != '[')\n    {\n        /* not an array */\n        goto fail;\n    }\n\n    input_buffer->offset++;\n    buffer_skip_whitespace(input_buffer);\n    if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ']'))\n    {\n        /* empty array */\n        goto success;\n    }\n\n    /* check if we skipped to the end of the buffer */\n    if (cannot_access_at_index(input_buffer, 0))\n    {\n        input_buffer->offset--;\n        goto fail;\n    }\n\n    /* step back to character in front of the first element */\n    input_buffer->offset--;\n    /* loop through the comma separated array elements */\n    do\n    {\n        /* allocate next item */\n        cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks));\n        if (new_item == NULL)\n        {\n            goto fail; /* allocation failure */\n        }\n\n        /* attach next item to list */\n        if (head == NULL)\n        {\n            /* start the linked list */\n            current_item = head = new_item;\n        }\n        else\n        {\n            /* add to the end and advance */\n            current_item->next = new_item;\n            new_item->prev = current_item;\n            current_item = new_item;\n        }\n\n        /* parse next value */\n        input_buffer->offset++;\n        buffer_skip_whitespace(input_buffer);\n        if (!parse_value(current_item, input_buffer))\n        {\n            goto fail; /* failed to parse value */\n        }\n        buffer_skip_whitespace(input_buffer);\n    }\n    while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ','));\n\n    if (cannot_access_at_index(input_buffer, 0) || buffer_at_offset(input_buffer)[0] != ']')\n    {\n        goto fail; /* expected end of array */\n    }\n\nsuccess:\n    input_buffer->depth--;\n\n    item->type = cJSON_Array;\n    item->child = head;\n\n    input_buffer->offset++;\n\n    return true;\n\nfail:\n    if (head != NULL)\n    {\n        cJSON_Delete(head);\n    }\n\n    return false;\n}\n\n/* Render an array to text */\nstatic cJSON_bool print_array(const cJSON * const item, printbuffer * const output_buffer)\n{\n    unsigned char *output_pointer = NULL;\n    size_t length = 0;\n    cJSON *current_element = item->child;\n\n    if (output_buffer == NULL)\n    {\n        return false;\n    }\n\n    /* Compose the output array. */\n    /* opening square bracket */\n    output_pointer = ensure(output_buffer, 1);\n    if (output_pointer == NULL)\n    {\n        return false;\n    }\n\n    *output_pointer = '[';\n    output_buffer->offset++;\n    output_buffer->depth++;\n\n    while (current_element != NULL)\n    {\n        if (!print_value(current_element, output_buffer))\n        {\n            return false;\n        }\n        update_offset(output_buffer);\n        if (current_element->next)\n        {\n            length = (size_t) (output_buffer->format ? 2 : 1);\n            output_pointer = ensure(output_buffer, length + 1);\n            if (output_pointer == NULL)\n            {\n                return false;\n            }\n            *output_pointer++ = ',';\n            if(output_buffer->format)\n            {\n                *output_pointer++ = ' ';\n            }\n            *output_pointer = '\\0';\n            output_buffer->offset += length;\n        }\n        current_element = current_element->next;\n    }\n\n    output_pointer = ensure(output_buffer, 2);\n    if (output_pointer == NULL)\n    {\n        return false;\n    }\n    *output_pointer++ = ']';\n    *output_pointer = '\\0';\n    output_buffer->depth--;\n\n    return true;\n}\n\n/* Build an object from the text. */\nstatic cJSON_bool parse_object(cJSON * const item, parse_buffer * const input_buffer)\n{\n    cJSON *head = NULL; /* linked list head */\n    cJSON *current_item = NULL;\n\n    if (input_buffer->depth >= CJSON_NESTING_LIMIT)\n    {\n        return false; /* to deeply nested */\n    }\n    input_buffer->depth++;\n\n    if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '{'))\n    {\n        goto fail; /* not an object */\n    }\n\n    input_buffer->offset++;\n    buffer_skip_whitespace(input_buffer);\n    if (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == '}'))\n    {\n        goto success; /* empty object */\n    }\n\n    /* check if we skipped to the end of the buffer */\n    if (cannot_access_at_index(input_buffer, 0))\n    {\n        input_buffer->offset--;\n        goto fail;\n    }\n\n    /* step back to character in front of the first element */\n    input_buffer->offset--;\n    /* loop through the comma separated array elements */\n    do\n    {\n        /* allocate next item */\n        cJSON *new_item = cJSON_New_Item(&(input_buffer->hooks));\n        if (new_item == NULL)\n        {\n            goto fail; /* allocation failure */\n        }\n\n        /* attach next item to list */\n        if (head == NULL)\n        {\n            /* start the linked list */\n            current_item = head = new_item;\n        }\n        else\n        {\n            /* add to the end and advance */\n            current_item->next = new_item;\n            new_item->prev = current_item;\n            current_item = new_item;\n        }\n\n        /* parse the name of the child */\n        input_buffer->offset++;\n        buffer_skip_whitespace(input_buffer);\n        if (!parse_string(current_item, input_buffer))\n        {\n            goto fail; /* faile to parse name */\n        }\n        buffer_skip_whitespace(input_buffer);\n\n        /* swap valuestring and string, because we parsed the name */\n        current_item->string = current_item->valuestring;\n        current_item->valuestring = NULL;\n\n        if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != ':'))\n        {\n            goto fail; /* invalid object */\n        }\n\n        /* parse the value */\n        input_buffer->offset++;\n        buffer_skip_whitespace(input_buffer);\n        if (!parse_value(current_item, input_buffer))\n        {\n            goto fail; /* failed to parse value */\n        }\n        buffer_skip_whitespace(input_buffer);\n    }\n    while (can_access_at_index(input_buffer, 0) && (buffer_at_offset(input_buffer)[0] == ','));\n\n    if (cannot_access_at_index(input_buffer, 0) || (buffer_at_offset(input_buffer)[0] != '}'))\n    {\n        goto fail; /* expected end of object */\n    }\n\nsuccess:\n    input_buffer->depth--;\n\n    item->type = cJSON_Object;\n    item->child = head;\n\n    input_buffer->offset++;\n    return true;\n\nfail:\n    if (head != NULL)\n    {\n        cJSON_Delete(head);\n    }\n\n    return false;\n}\n\n/* Render an object to text. */\nstatic cJSON_bool print_object(const cJSON * const item, printbuffer * const output_buffer)\n{\n    unsigned char *output_pointer = NULL;\n    size_t length = 0;\n    cJSON *current_item = item->child;\n\n    if (output_buffer == NULL)\n    {\n        return false;\n    }\n\n    /* Compose the output: */\n    length = (size_t) (output_buffer->format ? 2 : 1); /* fmt: {\\n */\n    output_pointer = ensure(output_buffer, length + 1);\n    if (output_pointer == NULL)\n    {\n        return false;\n    }\n\n    *output_pointer++ = '{';\n    output_buffer->depth++;\n    if (output_buffer->format)\n    {\n        *output_pointer++ = '\\n';\n    }\n    output_buffer->offset += length;\n\n    while (current_item)\n    {\n        if (output_buffer->format)\n        {\n            size_t i;\n            output_pointer = ensure(output_buffer, output_buffer->depth);\n            if (output_pointer == NULL)\n            {\n                return false;\n            }\n            for (i = 0; i < output_buffer->depth; i++)\n            {\n                *output_pointer++ = '\\t';\n            }\n            output_buffer->offset += output_buffer->depth;\n        }\n\n        /* print key */\n        if (!print_string_ptr((unsigned char*)current_item->string, output_buffer))\n        {\n            return false;\n        }\n        update_offset(output_buffer);\n\n        length = (size_t) (output_buffer->format ? 2 : 1);\n        output_pointer = ensure(output_buffer, length);\n        if (output_pointer == NULL)\n        {\n            return false;\n        }\n        *output_pointer++ = ':';\n        if (output_buffer->format)\n        {\n            *output_pointer++ = '\\t';\n        }\n        output_buffer->offset += length;\n\n        /* print value */\n        if (!print_value(current_item, output_buffer))\n        {\n            return false;\n        }\n        update_offset(output_buffer);\n\n        /* print comma if not last */\n        length = (size_t) ((output_buffer->format ? 1 : 0) + (current_item->next ? 1 : 0));\n        output_pointer = ensure(output_buffer, length + 1);\n        if (output_pointer == NULL)\n        {\n            return false;\n        }\n        if (current_item->next)\n        {\n            *output_pointer++ = ',';\n        }\n\n        if (output_buffer->format)\n        {\n            *output_pointer++ = '\\n';\n        }\n        *output_pointer = '\\0';\n        output_buffer->offset += length;\n\n        current_item = current_item->next;\n    }\n\n    output_pointer = ensure(output_buffer, output_buffer->format ? (output_buffer->depth + 1) : 2);\n    if (output_pointer == NULL)\n    {\n        return false;\n    }\n    if (output_buffer->format)\n    {\n        size_t i;\n        for (i = 0; i < (output_buffer->depth - 1); i++)\n        {\n            *output_pointer++ = '\\t';\n        }\n    }\n    *output_pointer++ = '}';\n    *output_pointer = '\\0';\n    output_buffer->depth--;\n\n    return true;\n}\n\n/* Get Array size/item / object item. */\nCJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array)\n{\n    cJSON *child = NULL;\n    size_t size = 0;\n\n    if (array == NULL)\n    {\n        return 0;\n    }\n\n    child = array->child;\n\n    while(child != NULL)\n    {\n        size++;\n        child = child->next;\n    }\n\n    /* FIXME: Can overflow here. Cannot be fixed without breaking the API */\n\n    return (int)size;\n}\n\nstatic cJSON* get_array_item(const cJSON *array, size_t index)\n{\n    cJSON *current_child = NULL;\n\n    if (array == NULL)\n    {\n        return NULL;\n    }\n\n    current_child = array->child;\n    while ((current_child != NULL) && (index > 0))\n    {\n        index--;\n        current_child = current_child->next;\n    }\n\n    return current_child;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index)\n{\n    if (index < 0)\n    {\n        return NULL;\n    }\n\n    return get_array_item(array, (size_t)index);\n}\n\nstatic cJSON *get_object_item(const cJSON * const object, const char * const name, const cJSON_bool case_sensitive)\n{\n    cJSON *current_element = NULL;\n\n    if ((object == NULL) || (name == NULL))\n    {\n        return NULL;\n    }\n\n    current_element = object->child;\n    if (case_sensitive)\n    {\n        while ((current_element != NULL) && (strcmp(name, current_element->string) != 0))\n        {\n            current_element = current_element->next;\n        }\n    }\n    else\n    {\n        while ((current_element != NULL) && (case_insensitive_strcmp((const unsigned char*)name, (const unsigned char*)(current_element->string)) != 0))\n        {\n            current_element = current_element->next;\n        }\n    }\n\n    return current_element;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string)\n{\n    return get_object_item(object, string, false);\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string)\n{\n    return get_object_item(object, string, true);\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string)\n{\n    return cJSON_GetObjectItem(object, string) ? 1 : 0;\n}\n\n/* Utility for array list handling. */\nstatic void suffix_object(cJSON *prev, cJSON *item)\n{\n    prev->next = item;\n    item->prev = prev;\n}\n\n/* Utility for handling references. */\nstatic cJSON *create_reference(const cJSON *item, const internal_hooks * const hooks)\n{\n    cJSON *reference = NULL;\n    if (item == NULL)\n    {\n        return NULL;\n    }\n\n    reference = cJSON_New_Item(hooks);\n    if (reference == NULL)\n    {\n        return NULL;\n    }\n\n    memcpy(reference, item, sizeof(cJSON));\n    reference->string = NULL;\n    reference->type |= cJSON_IsReference;\n    reference->next = reference->prev = NULL;\n    return reference;\n}\n\nstatic cJSON_bool add_item_to_array(cJSON *array, cJSON *item)\n{\n    cJSON *child = NULL;\n\n    if ((item == NULL) || (array == NULL))\n    {\n        return false;\n    }\n\n    child = array->child;\n\n    if (child == NULL)\n    {\n        /* list is empty, start new one */\n        array->child = item;\n    }\n    else\n    {\n        /* append to the end */\n        while (child->next)\n        {\n            child = child->next;\n        }\n        suffix_object(child, item);\n    }\n\n    return true;\n}\n\n/* Add item to array/object. */\nCJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item)\n{\n    add_item_to_array(array, item);\n}\n\n#if defined(__clang__) || (defined(__GNUC__)  && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))\n    #pragma GCC diagnostic push\n#endif\n#ifdef __GNUC__\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#endif\n/* helper function to cast away const */\nstatic void* cast_away_const(const void* string)\n{\n    return (void*)string;\n}\n#if defined(__clang__) || (defined(__GNUC__)  && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 5))))\n    #pragma GCC diagnostic pop\n#endif\n\n\nstatic cJSON_bool add_item_to_object(cJSON * const object, const char * const string, cJSON * const item, const internal_hooks * const hooks, const cJSON_bool constant_key)\n{\n    char *new_key = NULL;\n    int new_type = cJSON_Invalid;\n\n    if ((object == NULL) || (string == NULL) || (item == NULL))\n    {\n        return false;\n    }\n\n    if (constant_key)\n    {\n        new_key = (char*)cast_away_const(string);\n        new_type = item->type | cJSON_StringIsConst;\n    }\n    else\n    {\n        new_key = (char*)cJSON_strdup((const unsigned char*)string, hooks);\n        if (new_key == NULL)\n        {\n            return false;\n        }\n\n        new_type = item->type & ~cJSON_StringIsConst;\n    }\n\n    if (!(item->type & cJSON_StringIsConst) && (item->string != NULL))\n    {\n        hooks->deallocate(item->string);\n    }\n\n    item->string = new_key;\n    item->type = new_type;\n\n    return add_item_to_array(object, item);\n}\n\nCJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item)\n{\n    add_item_to_object(object, string, item, &global_hooks, false);\n}\n\n/* Add an item to an object with constant string as key */\nCJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item)\n{\n    add_item_to_object(object, string, item, &global_hooks, true);\n}\n\nCJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item)\n{\n    if (array == NULL)\n    {\n        return;\n    }\n\n    add_item_to_array(array, create_reference(item, &global_hooks));\n}\n\nCJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item)\n{\n    if ((object == NULL) || (string == NULL))\n    {\n        return;\n    }\n\n    add_item_to_object(object, string, create_reference(item, &global_hooks), &global_hooks, false);\n}\n\nCJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name)\n{\n    cJSON *null = cJSON_CreateNull();\n    if (add_item_to_object(object, name, null, &global_hooks, false))\n    {\n        return null;\n    }\n\n    cJSON_Delete(null);\n    return NULL;\n}\n\nCJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name)\n{\n    cJSON *true_item = cJSON_CreateTrue();\n    if (add_item_to_object(object, name, true_item, &global_hooks, false))\n    {\n        return true_item;\n    }\n\n    cJSON_Delete(true_item);\n    return NULL;\n}\n\nCJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name)\n{\n    cJSON *false_item = cJSON_CreateFalse();\n    if (add_item_to_object(object, name, false_item, &global_hooks, false))\n    {\n        return false_item;\n    }\n\n    cJSON_Delete(false_item);\n    return NULL;\n}\n\nCJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean)\n{\n    cJSON *bool_item = cJSON_CreateBool(boolean);\n    if (add_item_to_object(object, name, bool_item, &global_hooks, false))\n    {\n        return bool_item;\n    }\n\n    cJSON_Delete(bool_item);\n    return NULL;\n}\n\nCJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number)\n{\n    cJSON *number_item = cJSON_CreateNumber(number);\n    if (add_item_to_object(object, name, number_item, &global_hooks, false))\n    {\n        return number_item;\n    }\n\n    cJSON_Delete(number_item);\n    return NULL;\n}\n\nCJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string)\n{\n    cJSON *string_item = cJSON_CreateString(string);\n    if (add_item_to_object(object, name, string_item, &global_hooks, false))\n    {\n        return string_item;\n    }\n\n    cJSON_Delete(string_item);\n    return NULL;\n}\n\nCJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw)\n{\n    cJSON *raw_item = cJSON_CreateRaw(raw);\n    if (add_item_to_object(object, name, raw_item, &global_hooks, false))\n    {\n        return raw_item;\n    }\n\n    cJSON_Delete(raw_item);\n    return NULL;\n}\n\nCJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name)\n{\n    cJSON *object_item = cJSON_CreateObject();\n    if (add_item_to_object(object, name, object_item, &global_hooks, false))\n    {\n        return object_item;\n    }\n\n    cJSON_Delete(object_item);\n    return NULL;\n}\n\nCJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name)\n{\n    cJSON *array = cJSON_CreateArray();\n    if (add_item_to_object(object, name, array, &global_hooks, false))\n    {\n        return array;\n    }\n\n    cJSON_Delete(array);\n    return NULL;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item)\n{\n    if ((parent == NULL) || (item == NULL))\n    {\n        return NULL;\n    }\n\n    if (item->prev != NULL)\n    {\n        /* not the first element */\n        item->prev->next = item->next;\n    }\n    if (item->next != NULL)\n    {\n        /* not the last element */\n        item->next->prev = item->prev;\n    }\n\n    if (item == parent->child)\n    {\n        /* first element */\n        parent->child = item->next;\n    }\n    /* make sure the detached item doesn't point anywhere anymore */\n    item->prev = NULL;\n    item->next = NULL;\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which)\n{\n    if (which < 0)\n    {\n        return NULL;\n    }\n\n    return cJSON_DetachItemViaPointer(array, get_array_item(array, (size_t)which));\n}\n\nCJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which)\n{\n    cJSON_Delete(cJSON_DetachItemFromArray(array, which));\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string)\n{\n    cJSON *to_detach = cJSON_GetObjectItem(object, string);\n\n    return cJSON_DetachItemViaPointer(object, to_detach);\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string)\n{\n    cJSON *to_detach = cJSON_GetObjectItemCaseSensitive(object, string);\n\n    return cJSON_DetachItemViaPointer(object, to_detach);\n}\n\nCJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string)\n{\n    cJSON_Delete(cJSON_DetachItemFromObject(object, string));\n}\n\nCJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string)\n{\n    cJSON_Delete(cJSON_DetachItemFromObjectCaseSensitive(object, string));\n}\n\n/* Replace array/object items with new ones. */\nCJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem)\n{\n    cJSON *after_inserted = NULL;\n\n    if (which < 0)\n    {\n        return;\n    }\n\n    after_inserted = get_array_item(array, (size_t)which);\n    if (after_inserted == NULL)\n    {\n        add_item_to_array(array, newitem);\n        return;\n    }\n\n    newitem->next = after_inserted;\n    newitem->prev = after_inserted->prev;\n    after_inserted->prev = newitem;\n    if (after_inserted == array->child)\n    {\n        array->child = newitem;\n    }\n    else\n    {\n        newitem->prev->next = newitem;\n    }\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement)\n{\n    if ((parent == NULL) || (replacement == NULL) || (item == NULL))\n    {\n        return false;\n    }\n\n    if (replacement == item)\n    {\n        return true;\n    }\n\n    replacement->next = item->next;\n    replacement->prev = item->prev;\n\n    if (replacement->next != NULL)\n    {\n        replacement->next->prev = replacement;\n    }\n    if (replacement->prev != NULL)\n    {\n        replacement->prev->next = replacement;\n    }\n    if (parent->child == item)\n    {\n        parent->child = replacement;\n    }\n\n    item->next = NULL;\n    item->prev = NULL;\n    cJSON_Delete(item);\n\n    return true;\n}\n\nCJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem)\n{\n    if (which < 0)\n    {\n        return;\n    }\n\n    cJSON_ReplaceItemViaPointer(array, get_array_item(array, (size_t)which), newitem);\n}\n\nstatic cJSON_bool replace_item_in_object(cJSON *object, const char *string, cJSON *replacement, cJSON_bool case_sensitive)\n{\n    if ((replacement == NULL) || (string == NULL))\n    {\n        return false;\n    }\n\n    /* replace the name in the replacement */\n    if (!(replacement->type & cJSON_StringIsConst) && (replacement->string != NULL))\n    {\n        cJSON_free(replacement->string);\n    }\n    replacement->string = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks);\n    replacement->type &= ~cJSON_StringIsConst;\n\n    cJSON_ReplaceItemViaPointer(object, get_object_item(object, string, case_sensitive), replacement);\n\n    return true;\n}\n\nCJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object, const char *string, cJSON *newitem)\n{\n    replace_item_in_object(object, string, newitem, false);\n}\n\nCJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object, const char *string, cJSON *newitem)\n{\n    replace_item_in_object(object, string, newitem, true);\n}\n\n/* Create basic types: */\nCJSON_PUBLIC(cJSON *) cJSON_CreateNull(void)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if(item)\n    {\n        item->type = cJSON_NULL;\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if(item)\n    {\n        item->type = cJSON_True;\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if(item)\n    {\n        item->type = cJSON_False;\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool b)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if(item)\n    {\n        item->type = b ? cJSON_True : cJSON_False;\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if(item)\n    {\n        item->type = cJSON_Number;\n        item->valuedouble = num;\n\n        /* use saturation in case of overflow */\n        if (num >= INT_MAX)\n        {\n            item->valueint = INT_MAX;\n        }\n        else if (num <= INT_MIN)\n        {\n            item->valueint = INT_MIN;\n        }\n        else\n        {\n            item->valueint = (int)num;\n        }\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if(item)\n    {\n        item->type = cJSON_String;\n        item->valuestring = (char*)cJSON_strdup((const unsigned char*)string, &global_hooks);\n        if(!item->valuestring)\n        {\n            cJSON_Delete(item);\n            return NULL;\n        }\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if (item != NULL)\n    {\n        item->type = cJSON_String | cJSON_IsReference;\n        item->valuestring = (char*)cast_away_const(string);\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if (item != NULL) {\n        item->type = cJSON_Object | cJSON_IsReference;\n        item->child = (cJSON*)cast_away_const(child);\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child) {\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if (item != NULL) {\n        item->type = cJSON_Array | cJSON_IsReference;\n        item->child = (cJSON*)cast_away_const(child);\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if(item)\n    {\n        item->type = cJSON_Raw;\n        item->valuestring = (char*)cJSON_strdup((const unsigned char*)raw, &global_hooks);\n        if(!item->valuestring)\n        {\n            cJSON_Delete(item);\n            return NULL;\n        }\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateArray(void)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if(item)\n    {\n        item->type=cJSON_Array;\n    }\n\n    return item;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateObject(void)\n{\n    cJSON *item = cJSON_New_Item(&global_hooks);\n    if (item)\n    {\n        item->type = cJSON_Object;\n    }\n\n    return item;\n}\n\n/* Create Arrays: */\nCJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count)\n{\n    size_t i = 0;\n    cJSON *n = NULL;\n    cJSON *p = NULL;\n    cJSON *a = NULL;\n\n    if ((count < 0) || (numbers == NULL))\n    {\n        return NULL;\n    }\n\n    a = cJSON_CreateArray();\n    for(i = 0; a && (i < (size_t)count); i++)\n    {\n        n = cJSON_CreateNumber(numbers[i]);\n        if (!n)\n        {\n            cJSON_Delete(a);\n            return NULL;\n        }\n        if(!i)\n        {\n            a->child = n;\n        }\n        else\n        {\n            suffix_object(p, n);\n        }\n        p = n;\n    }\n\n    return a;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count)\n{\n    size_t i = 0;\n    cJSON *n = NULL;\n    cJSON *p = NULL;\n    cJSON *a = NULL;\n\n    if ((count < 0) || (numbers == NULL))\n    {\n        return NULL;\n    }\n\n    a = cJSON_CreateArray();\n\n    for(i = 0; a && (i < (size_t)count); i++)\n    {\n        n = cJSON_CreateNumber((double)numbers[i]);\n        if(!n)\n        {\n            cJSON_Delete(a);\n            return NULL;\n        }\n        if(!i)\n        {\n            a->child = n;\n        }\n        else\n        {\n            suffix_object(p, n);\n        }\n        p = n;\n    }\n\n    return a;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count)\n{\n    size_t i = 0;\n    cJSON *n = NULL;\n    cJSON *p = NULL;\n    cJSON *a = NULL;\n\n    if ((count < 0) || (numbers == NULL))\n    {\n        return NULL;\n    }\n\n    a = cJSON_CreateArray();\n\n    for(i = 0;a && (i < (size_t)count); i++)\n    {\n        n = cJSON_CreateNumber(numbers[i]);\n        if(!n)\n        {\n            cJSON_Delete(a);\n            return NULL;\n        }\n        if(!i)\n        {\n            a->child = n;\n        }\n        else\n        {\n            suffix_object(p, n);\n        }\n        p = n;\n    }\n\n    return a;\n}\n\nCJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count)\n{\n    size_t i = 0;\n    cJSON *n = NULL;\n    cJSON *p = NULL;\n    cJSON *a = NULL;\n\n    if ((count < 0) || (strings == NULL))\n    {\n        return NULL;\n    }\n\n    a = cJSON_CreateArray();\n\n    for (i = 0; a && (i < (size_t)count); i++)\n    {\n        n = cJSON_CreateString(strings[i]);\n        if(!n)\n        {\n            cJSON_Delete(a);\n            return NULL;\n        }\n        if(!i)\n        {\n            a->child = n;\n        }\n        else\n        {\n            suffix_object(p,n);\n        }\n        p = n;\n    }\n\n    return a;\n}\n\n/* Duplication */\nCJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse)\n{\n    cJSON *newitem = NULL;\n    cJSON *child = NULL;\n    cJSON *next = NULL;\n    cJSON *newchild = NULL;\n\n    /* Bail on bad ptr */\n    if (!item)\n    {\n        goto fail;\n    }\n    /* Create new item */\n    newitem = cJSON_New_Item(&global_hooks);\n    if (!newitem)\n    {\n        goto fail;\n    }\n    /* Copy over all vars */\n    newitem->type = item->type & (~cJSON_IsReference);\n    newitem->valueint = item->valueint;\n    newitem->valuedouble = item->valuedouble;\n    if (item->valuestring)\n    {\n        newitem->valuestring = (char*)cJSON_strdup((unsigned char*)item->valuestring, &global_hooks);\n        if (!newitem->valuestring)\n        {\n            goto fail;\n        }\n    }\n    if (item->string)\n    {\n        newitem->string = (item->type&cJSON_StringIsConst) ? item->string : (char*)cJSON_strdup((unsigned char*)item->string, &global_hooks);\n        if (!newitem->string)\n        {\n            goto fail;\n        }\n    }\n    /* If non-recursive, then we're done! */\n    if (!recurse)\n    {\n        return newitem;\n    }\n    /* Walk the ->next chain for the child. */\n    child = item->child;\n    while (child != NULL)\n    {\n        newchild = cJSON_Duplicate(child, true); /* Duplicate (with recurse) each item in the ->next chain */\n        if (!newchild)\n        {\n            goto fail;\n        }\n        if (next != NULL)\n        {\n            /* If newitem->child already set, then crosswire ->prev and ->next and move on */\n            next->next = newchild;\n            newchild->prev = next;\n            next = newchild;\n        }\n        else\n        {\n            /* Set newitem->child and move to it */\n            newitem->child = newchild;\n            next = newchild;\n        }\n        child = child->next;\n    }\n\n    return newitem;\n\nfail:\n    if (newitem != NULL)\n    {\n        cJSON_Delete(newitem);\n    }\n\n    return NULL;\n}\n\nCJSON_PUBLIC(void) cJSON_Minify(char *json)\n{\n    unsigned char *into = (unsigned char*)json;\n\n    if (json == NULL)\n    {\n        return;\n    }\n\n    while (*json)\n    {\n        if (*json == ' ')\n        {\n            json++;\n        }\n        else if (*json == '\\t')\n        {\n            /* Whitespace characters. */\n            json++;\n        }\n        else if (*json == '\\r')\n        {\n            json++;\n        }\n        else if (*json=='\\n')\n        {\n            json++;\n        }\n        else if ((*json == '/') && (json[1] == '/'))\n        {\n            /* double-slash comments, to end of line. */\n            while (*json && (*json != '\\n'))\n            {\n                json++;\n            }\n        }\n        else if ((*json == '/') && (json[1] == '*'))\n        {\n            /* multiline comments. */\n            while (*json && !((*json == '*') && (json[1] == '/')))\n            {\n                json++;\n            }\n            json += 2;\n        }\n        else if (*json == '\\\"')\n        {\n            /* string literals, which are \\\" sensitive. */\n            *into++ = (unsigned char)*json++;\n            while (*json && (*json != '\\\"'))\n            {\n                if (*json == '\\\\')\n                {\n                    *into++ = (unsigned char)*json++;\n                }\n                *into++ = (unsigned char)*json++;\n            }\n            *into++ = (unsigned char)*json++;\n        }\n        else\n        {\n            /* All other characters. */\n            *into++ = (unsigned char)*json++;\n        }\n    }\n\n    /* and null-terminate. */\n    *into = '\\0';\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item)\n{\n    if (item == NULL)\n    {\n        return false;\n    }\n\n    return (item->type & 0xFF) == cJSON_Invalid;\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item)\n{\n    if (item == NULL)\n    {\n        return false;\n    }\n\n    return (item->type & 0xFF) == cJSON_False;\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item)\n{\n    if (item == NULL)\n    {\n        return false;\n    }\n\n    return (item->type & 0xff) == cJSON_True;\n}\n\n\nCJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item)\n{\n    if (item == NULL)\n    {\n        return false;\n    }\n\n    return (item->type & (cJSON_True | cJSON_False)) != 0;\n}\nCJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item)\n{\n    if (item == NULL)\n    {\n        return false;\n    }\n\n    return (item->type & 0xFF) == cJSON_NULL;\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item)\n{\n    if (item == NULL)\n    {\n        return false;\n    }\n\n    return (item->type & 0xFF) == cJSON_Number;\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item)\n{\n    if (item == NULL)\n    {\n        return false;\n    }\n\n    return (item->type & 0xFF) == cJSON_String;\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item)\n{\n    if (item == NULL)\n    {\n        return false;\n    }\n\n    return (item->type & 0xFF) == cJSON_Array;\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item)\n{\n    if (item == NULL)\n    {\n        return false;\n    }\n\n    return (item->type & 0xFF) == cJSON_Object;\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item)\n{\n    if (item == NULL)\n    {\n        return false;\n    }\n\n    return (item->type & 0xFF) == cJSON_Raw;\n}\n\nCJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive)\n{\n    if ((a == NULL) || (b == NULL) || ((a->type & 0xFF) != (b->type & 0xFF)) || cJSON_IsInvalid(a))\n    {\n        return false;\n    }\n\n    /* check if type is valid */\n    switch (a->type & 0xFF)\n    {\n        case cJSON_False:\n        case cJSON_True:\n        case cJSON_NULL:\n        case cJSON_Number:\n        case cJSON_String:\n        case cJSON_Raw:\n        case cJSON_Array:\n        case cJSON_Object:\n            break;\n\n        default:\n            return false;\n    }\n\n    /* identical objects are equal */\n    if (a == b)\n    {\n        return true;\n    }\n\n    switch (a->type & 0xFF)\n    {\n        /* in these cases and equal type is enough */\n        case cJSON_False:\n        case cJSON_True:\n        case cJSON_NULL:\n            return true;\n\n        case cJSON_Number:\n            if (a->valuedouble == b->valuedouble)\n            {\n                return true;\n            }\n            return false;\n\n        case cJSON_String:\n        case cJSON_Raw:\n            if ((a->valuestring == NULL) || (b->valuestring == NULL))\n            {\n                return false;\n            }\n            if (strcmp(a->valuestring, b->valuestring) == 0)\n            {\n                return true;\n            }\n\n            return false;\n\n        case cJSON_Array:\n        {\n            cJSON *a_element = a->child;\n            cJSON *b_element = b->child;\n\n            for (; (a_element != NULL) && (b_element != NULL);)\n            {\n                if (!cJSON_Compare(a_element, b_element, case_sensitive))\n                {\n                    return false;\n                }\n\n                a_element = a_element->next;\n                b_element = b_element->next;\n            }\n\n            /* one of the arrays is longer than the other */\n            if (a_element != b_element) {\n                return false;\n            }\n\n            return true;\n        }\n\n        case cJSON_Object:\n        {\n            cJSON *a_element = NULL;\n            cJSON *b_element = NULL;\n            cJSON_ArrayForEach(a_element, a)\n            {\n                /* TODO This has O(n^2) runtime, which is horrible! */\n                b_element = get_object_item(b, a_element->string, case_sensitive);\n                if (b_element == NULL)\n                {\n                    return false;\n                }\n\n                if (!cJSON_Compare(a_element, b_element, case_sensitive))\n                {\n                    return false;\n                }\n            }\n\n            /* doing this twice, once on a and b to prevent true comparison if a subset of b\n             * TODO: Do this the proper way, this is just a fix for now */\n            cJSON_ArrayForEach(b_element, b)\n            {\n                a_element = get_object_item(a, b_element->string, case_sensitive);\n                if (a_element == NULL)\n                {\n                    return false;\n                }\n\n                if (!cJSON_Compare(b_element, a_element, case_sensitive))\n                {\n                    return false;\n                }\n            }\n\n            return true;\n        }\n\n        default:\n            return false;\n    }\n}\n\nCJSON_PUBLIC(void *) cJSON_malloc(size_t size)\n{\n    return global_hooks.allocate(size);\n}\n\nCJSON_PUBLIC(void) cJSON_free(void *object)\n{\n    global_hooks.deallocate(object);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/lib/cJSON/cJSON.h",
    "content": "/*\n  Copyright (c) 2009-2017 Dave Gamble and cJSON contributors\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n*/\n\n#ifndef cJSON__h\n#define cJSON__h\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n#if !defined(__WINDOWS__) && (defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))\n#define __WINDOWS__\n#endif\n\n#ifdef __WINDOWS__\n\n/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention.  For windows you have 3 define options:\n\nCJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols\nCJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)\nCJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol\n\nFor *nix builds that support visibility attribute, you can define similar behavior by\n\nsetting default visibility to hidden by adding\n-fvisibility=hidden (for gcc)\nor\n-xldscope=hidden (for sun cc)\nto CFLAGS\n\nthen using the CJSON_API_VISIBILITY flag to \"export\" the same symbols the way CJSON_EXPORT_SYMBOLS does\n\n*/\n\n#define CJSON_CDECL __cdecl\n#define CJSON_STDCALL __stdcall\n\n/* export symbols by default, this is necessary for copy pasting the C and header file */\n#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && !defined(CJSON_EXPORT_SYMBOLS)\n#define CJSON_EXPORT_SYMBOLS\n#endif\n\n#if defined(CJSON_HIDE_SYMBOLS)\n#define CJSON_PUBLIC(type)   type CJSON_STDCALL\n#elif defined(CJSON_EXPORT_SYMBOLS)\n#define CJSON_PUBLIC(type)   __declspec(dllexport) type CJSON_STDCALL\n#elif defined(CJSON_IMPORT_SYMBOLS)\n#define CJSON_PUBLIC(type)   __declspec(dllimport) type CJSON_STDCALL\n#endif\n#else /* !__WINDOWS__ */\n#define CJSON_CDECL\n#define CJSON_STDCALL\n\n#if (defined(__GNUC__) || defined(__SUNPRO_CC) || defined (__SUNPRO_C)) && defined(CJSON_API_VISIBILITY)\n#define CJSON_PUBLIC(type)   __attribute__((visibility(\"default\"))) type\n#else\n#define CJSON_PUBLIC(type) type\n#endif\n#endif\n\n/* project version */\n#define CJSON_VERSION_MAJOR 1\n#define CJSON_VERSION_MINOR 7\n#define CJSON_VERSION_PATCH 8\n\n#include <stddef.h>\n\n/* cJSON Types: */\n#define cJSON_Invalid (0)\n#define cJSON_False  (1 << 0)\n#define cJSON_True   (1 << 1)\n#define cJSON_NULL   (1 << 2)\n#define cJSON_Number (1 << 3)\n#define cJSON_String (1 << 4)\n#define cJSON_Array  (1 << 5)\n#define cJSON_Object (1 << 6)\n#define cJSON_Raw    (1 << 7) /* raw json */\n\n#define cJSON_IsReference 256\n#define cJSON_StringIsConst 512\n\n/* The cJSON structure: */\ntypedef struct cJSON\n{\n    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */\n    struct cJSON *next;\n    struct cJSON *prev;\n    /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */\n    struct cJSON *child;\n\n    /* The type of the item, as above. */\n    int type;\n\n    /* The item's string, if type==cJSON_String  and type == cJSON_Raw */\n    char *valuestring;\n    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */\n    int valueint;\n    /* The item's number, if type==cJSON_Number */\n    double valuedouble;\n\n    /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */\n    char *string;\n} cJSON;\n\ntypedef struct cJSON_Hooks\n{\n      /* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */\n      void *(CJSON_CDECL *malloc_fn)(size_t sz);\n      void (CJSON_CDECL *free_fn)(void *ptr);\n} cJSON_Hooks;\n\ntypedef int cJSON_bool;\n\n/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.\n * This is to prevent stack overflows. */\n#ifndef CJSON_NESTING_LIMIT\n#define CJSON_NESTING_LIMIT 10\n#endif\n\n/* returns the version of cJSON as a string */\nCJSON_PUBLIC(const char*) cJSON_Version(void);\n\n/* Supply malloc, realloc and free functions to cJSON */\nCJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);\n\n/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */\n/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */\nCJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);\n/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */\n/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */\nCJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_bool require_null_terminated);\n\n/* Render a cJSON entity to text for transfer/storage. */\nCJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);\n/* Render a cJSON entity to text for transfer/storage without any formatting. */\nCJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);\n/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */\nCJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_bool fmt);\n/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */\n/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */\nCJSON_PUBLIC(cJSON_bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_bool format);\n/* Delete a cJSON entity and all subentities. */\nCJSON_PUBLIC(void) cJSON_Delete(cJSON *c);\n\n/* Returns the number of items in an array (or object). */\nCJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);\n/* Retrieve item number \"index\" from array \"array\". Returns NULL if unsuccessful. */\nCJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);\n/* Get item \"string\" from object. Case insensitive. */\nCJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);\nCJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);\nCJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON *object, const char *string);\n/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */\nCJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);\n\n/* Check if the item is a string and return its valuestring */\nCJSON_PUBLIC(char *) cJSON_GetStringValue(cJSON *item);\n\n/* These functions check the type of an item */\nCJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON * const item);\nCJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON * const item);\nCJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON * const item);\nCJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON * const item);\nCJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON * const item);\nCJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON * const item);\nCJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON * const item);\nCJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON * const item);\nCJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON * const item);\nCJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON * const item);\n\n/* These calls create a cJSON item of the appropriate type. */\nCJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);\nCJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);\nCJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);\nCJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_bool boolean);\nCJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);\nCJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);\n/* raw json */\nCJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);\nCJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);\nCJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);\n\n/* Create a string where valuestring references a string so\n * it will not be freed by cJSON_Delete */\nCJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);\n/* Create an object/arrray that only references it's elements so\n * they will not be freed by cJSON_Delete */\nCJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);\nCJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);\n\n/* These utilities create an Array of count items. */\nCJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);\nCJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);\nCJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);\nCJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char **strings, int count);\n\n/* Append item to the specified array/object. */\nCJSON_PUBLIC(void) cJSON_AddItemToArray(cJSON *array, cJSON *item);\nCJSON_PUBLIC(void) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);\n/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.\n * WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before\n * writing to `item->string` */\nCJSON_PUBLIC(void) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);\n/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */\nCJSON_PUBLIC(void) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);\nCJSON_PUBLIC(void) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);\n\n/* Remove/Detatch items from Arrays/Objects. */\nCJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);\nCJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);\nCJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);\nCJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);\nCJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);\nCJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);\nCJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);\n\n/* Update array items. */\nCJSON_PUBLIC(void) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem); /* Shifts pre-existing items to the right. */\nCJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);\nCJSON_PUBLIC(void) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);\nCJSON_PUBLIC(void) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);\nCJSON_PUBLIC(void) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);\n\n/* Duplicate a cJSON item */\nCJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_bool recurse);\n/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will\nneed to be released. With recurse!=0, it will duplicate any children connected to the item.\nThe item->next and ->prev pointers are always zero on return from Duplicate. */\n/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.\n * case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */\nCJSON_PUBLIC(cJSON_bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_bool case_sensitive);\n\n\nCJSON_PUBLIC(void) cJSON_Minify(char *json);\n\n/* Helper functions for creating and adding items to an object at the same time.\n * They return the added item or NULL on failure. */\nCJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);\nCJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);\nCJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);\nCJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_bool boolean);\nCJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);\nCJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);\nCJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);\nCJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);\nCJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);\n\n/* When assigning an integer value, it needs to be propagated to valuedouble too. */\n#define cJSON_SetIntValue(object, number) ((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))\n/* helper for the cJSON_SetNumberValue macro */\nCJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);\n#define cJSON_SetNumberValue(object, number) ((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))\n\n/* Macro for iterating over an array or object */\n#define cJSON_ArrayForEach(element, array) for(element = (array != NULL) ? (array)->child : NULL; element != NULL; element = element->next)\n\n/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */\nCJSON_PUBLIC(void *) cJSON_malloc(size_t size);\nCJSON_PUBLIC(void) cJSON_free(void *object);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/lib/libc/errno.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/* Includes -----------------------------------------------------------------*/\n\n#include \"los_config.h\"\n#include \"los_task.h\"\n#include \"los_printf.h\"\n\n\n/* Typedefs -----------------------------------------------------------------*/\n\ntypedef struct TaskReent\n{\n    int errno;\n} TaskReent;\n\n\n/* Local variables ----------------------------------------------------------*/\n\nstatic TaskReent g_task_reent[LOSCFG_BASE_CORE_TSK_LIMIT + 1];\n\n\n/* Public functions ---------------------------------------------------------*/\n\nint *task_errno(void)\n{\n    UINT32 taskid = LOS_CurTaskIDGet();\n\n    if (taskid <= LOSCFG_BASE_CORE_TSK_LIMIT)\n    {\n        return &g_task_reent[taskid].errno;\n    }\n    else\n    {\n        PRINT_WARN(\"TaskID[%d] is invalid\\n\", taskid);\n        return &g_task_reent[0].errno;\n    }\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/lib/libc/malloc.c",
    "content": "/************************************************************************\n * Copyright (c) <2013-2015>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice,this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice,this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its\n *    contributors may be used to endorse or promote products derived from\n *    this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n ************************************************************************/\n\n/************************************************************************\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations,\n * which might include those applicable to Huawei LiteOS of U.S. and the country\n * in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in\n * compliance with such applicable export control laws and regulations.\n ************************************************************************/\n\n#include \"stdlib.h\"\n#include \"los_memory.h\"\n#include \"string.h\"\n\n#if defined(LOS_LIBC_MALLOC_ALIGN) && !defined(LOS_LIBC_MALLOC_ALIGN_SIZE)\n#error \"macro LOS_LIBC_MALLOC_ALIGN_SIZE undefined\"\n#endif\n\n\n/*****************************************************************************\nFunction         :      free\nDescription      :      Deallocates the memory previously allocated by a call to calloc, malloc, or\n                realloc. The argument ptr points to the space that was previously allocated.\n                If ptr points to a memory block that was not allocated with calloc, malloc,\n                or realloc, or is a space that has been deallocated, then the result is\n                undefined.\nInput            :      [1] void *ptr, pointed to the memory need to free.\nOutput           :      nothing.\nReturn           :      No value is returned.\n*****************************************************************************/\nvoid free(void *ptr)\n{\n    if (ptr == NULL)\n        return;\n\n    LOS_MemFree((void *)OS_SYS_MEM_ADDR, ptr);/*lint !e534*/\n}\n\n\n/*****************************************************************************\nFunction         :      malloc\nDescription      :      Allocates the requested memory and returns a pointer to it. The requested\n                size is size bytes. The value of the space is indeterminate.\nInput            :      [1] size_t size, spcified the size need to allocate.\nOutput           :      nothing.\nReturn           :      On success a pointer to the requested space is returned.\n                On failure a null pointer is returned.\n*****************************************************************************/\nvoid *malloc(size_t size) /*lint !e31 !e10*/\n{\n    void *ptr = NULL; /*lint !e64 !e10*/\n\n    if (size == 0)\n        return NULL; /*lint !e64*/\n\n#if defined(LOS_LIBC_MALLOC_ALIGN)\n    ptr = LOS_MemAllocAlign((void *)OS_SYS_MEM_ADDR, (UINT32)size, LOS_LIBC_MALLOC_ALIGN_SIZE);\n#else\n    ptr = LOS_MemAlloc((void *)OS_SYS_MEM_ADDR, (UINT32)size);\n#endif\n\n    return ptr;\n}\n\n\nvoid *zalloc(size_t size) /*lint !e10*/\n{\n    void *ptr = malloc (size);\n\n    if (ptr != NULL)\n    {\n        memset((void *)ptr, (int)0, size);\n    }\n\n    return ptr;\n}\n\n\n/*****************************************************************************\nFunction         :      calloc\nDescription      :    Allocates the requested memory and returns a pointer to it. The requested\n                size is nitems each size bytes long (total memory requested is nitems*size).\n                The space is initialized to all zero bits.\nInput            :      [1] size_t nitems,\n                [2] size_t size,\nOutput           :      nothing.\nReturn           :      On success a pointer to the requested space is returned.\n                On failure a null pointer is returned.\n*****************************************************************************/\nvoid *calloc(size_t nitems, size_t size) /*lint !e578*/\n{\n    return zalloc(nitems * size);\n}\n\n\n/*****************************************************************************\nFunction         :      memalign\nDescription      :      allocates a block of size bytes whose address is a multiple of boundary.\n               The boundary must be a power of two!\nInput            :      [1] size_t size, spcified the size need to allocate.\n               [2] size_t boundary, the returned memory address will be a multiple of boundary.\n               This argument must be a power of two. This property is not checked by\n               memalign, so misuse may result in random runtime errors.\nOutput           :      nothing.\nReturn           :      On success a pointer to the requested space is returned.\n               On failure a null pointer is returned.\n*****************************************************************************/\nvoid *memalign (size_t boundary, size_t size)  /*lint !e18 !e578*/\n{\n    /*lint !e18 !e578*/\n    void *ptr = NULL;\n\n    if(size == 0)\n        return NULL; /*lint !e64*/\n\n    ptr = LOS_MemAllocAlign((void *)OS_SYS_MEM_ADDR, (UINT32)size, (UINT32)boundary);\n\n    return ptr; /*lint !e64*/\n}\n\n\n/*****************************************************************************\nFunction         :      realloc\nDescription      :      Attempts to resize the memory block pointed to by ptr that was previously\n                allocated with a call to malloc or calloc. The contents pointed to by ptr are\n                unchanged. If the value of size is greater than the previous size of the\n                block, then the additional bytes have an undeterminate value. If the value\n                of size is less than the previous size of the block, then the difference of\n                bytes at the end of the block are freed. If ptr is null, then it behaves like\n                malloc. If ptr points to a memory block that was not allocated with calloc\n                or malloc, or is a space that has been deallocated, then the result is\n                undefined. If the new space cannot be allocated, then the contents pointed\n                to by ptr are unchanged. If size is zero, then the memory block is completely\n                freed.\nInput            :      [1] void *ptr, pointed to the memory which need to remalloc.\n                [2] size_t size, specified the size to remalloc.\nOutput           :      nothing.\nReturn           :      On success a pointer to the memory block is returned (which may be in a\n                different location as before).\n               On failure or if size is zero, a null pointer is returned.\n*****************************************************************************/\nvoid *realloc(void *ptr, size_t size)\n{\n    if (ptr == NULL)\n    {\n        return malloc(size); /*lint !e64*/\n    }\n\n    if (size == 0)\n    {\n        free(ptr);\n        return NULL;\n    }\n\n    return LOS_MemRealloc((void *)OS_SYS_MEM_ADDR, (void *)ptr, (UINT32)size);\n}\n\n\n#if OS_SYS_NOCACHEMEM_SIZE\n/*****************************************************************************\nFunction       :   nocache_free\nDescription      :   Deallocates the memory previously allocated by a call to calloc, malloc, or\n             realloc. The argument ptr points to the space that was previously allocated.\n             If ptr points to a memory block that was not allocated with calloc, malloc,\n             or realloc, or is a space that has been deallocated, then the result is\n             undefined.\nInput          :   [1] void *ptr, pointed to the memory need to free.\nOutput          :   nothing.\nReturn          :   No value is returned.\n*****************************************************************************/\nvoid nocache_free(void *ptr)\n{\n    if(ptr == NULL)\n        return;\n\n    LOS_MemFree((void *)OS_SYS_NOCACHEMEM_ADDR, ptr);\n}\n\n\n/*****************************************************************************\nFunction       :   nocache_malloc\nDescription      :   Allocates the requested memory and returns a pointer to it. The requested\n             size is size bytes. The value of the space is indeterminate.\nInput          :   [1] size_t size, spcified the size need to allocate.\nOutput          :   nothing.\nReturn          :   On success a pointer to the requested space is returned.\n             On failure a null pointer is returned.\n*****************************************************************************/\nvoid *nocache_malloc(size_t size)\n{\n    void *ptr = NULL;\n\n    if(size == 0)\n        return NULL;\n\n    ptr = LOS_MemAlloc((void *)OS_SYS_NOCACHEMEM_ADDR,  (UINT32)size);\n\n    return ptr;\n}\n\n\nvoid *nocache_zalloc(size_t size)\n{\n    void *ptr = nocache_malloc(size);\n\n    if (ptr != NULL)\n    {\n        memset((void *)ptr, (int)0, size);\n    }\n\n    return ptr;\n}\n\n\n/*****************************************************************************\nFunction       :   nocache_calloc\nDescription      :   Allocates the requested memory and returns a pointer to it. The requested\n             size is nitems each size bytes long (total memory requested is nitems*size).\n             The space is initialized to all zero bits.\nInput          :   [1] size_t nitems,\n             [2] size_t size,\nOutput          :   nothing.\nReturn          :   On success a pointer to the requested space is returned.\n             On failure a null pointer is returned.\n*****************************************************************************/\nvoid *nocache_calloc(size_t nitems, size_t size)\n{\n    return nocache_zalloc (nitems * size);\n}\n\n\n/*****************************************************************************\nFunction       :   nocache_realloc\nDescription      :   Attempts to resize the memory block pointed to by ptr that was previously\n             allocated with a call to malloc or calloc. The contents pointed to by ptr are\n             unchanged. If the value of size is greater than the previous size of the\n             block, then the additional bytes have an undeterminate value. If the value\n             of size is less than the previous size of the block, then the difference of\n             bytes at the end of the block are freed. If ptr is null, then it behaves like\n             malloc. If ptr points to a memory block that was not allocated with calloc\n             or malloc, or is a space that has been deallocated, then the result is\n             undefined. If the new space cannot be allocated, then the contents pointed\n             to by ptr are unchanged. If size is zero, then the memory block is completely\n             freed.\nInput          :   [1] void *ptr, pointed to the memory which need to remalloc.\n             [2] size_t size, specified the size to remalloc.\nOutput          :   nothing.\nReturn          :   On success a pointer to the memory block is returned (which may be in a\n             different location as before).\n             On failure or if size is zero, a null pointer is returned.\n*****************************************************************************/\nvoid *nocache_realloc(void *ptr, size_t size)\n{\n    if (ptr == NULL)\n    {\n        ptr = malloc(size);\n        return ptr;\n    }\n\n    if (size == 0)\n    {\n        free(ptr);\n        return NULL;\n    }\n\n    return LOS_MemRealloc((void *)OS_SYS_NOCACHEMEM_ADDR, (void *)ptr, (UINT32)size);\n}\n#endif\n\n/* EOF malloc.c */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/lib/libc/newlib_stub.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2013-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include <reent.h>\n#include <stdlib.h>\n#include <sys/errno.h>\n#include <sys/unistd.h>\n#include <sys/time.h>\n#include <string.h>\n#include <sys/unistd.h>\n#include <los_memory.h>\n#include <stdarg.h>\n\n#include \"fs/los_vfs.h\"\n#include \"los_config.h\"\n\nint _execve_r(struct _reent *ptr, const char *name, char *const *argv, char *const *env)\n{\n    /* not support */\n    ptr->_errno = ENOTSUP;\n    return -1;\n}\n\n\n_CLOCK_T_ _times_r(struct _reent *ptr, struct tms *ptms)\n{\n    /* not support */\n    ptr->_errno = ENOTSUP;\n    return -1;\n}\n\nint _unlink_r(struct _reent *ptr, const char *file)\n{\n    return los_unlink (file);\n}\n\nint _wait_r(struct _reent *ptr, int *status)\n{\n    /* not support */\n    ptr->_errno = ENOTSUP;\n    return -1;\n}\n\nint _gettimeofday_r(struct _reent *ptr, struct timeval *tv, void *__tzp)\n{\n    /* not support */\n    ptr->_errno = ENOTSUP;\n    return -1;\n}\n\nvoid *_malloc_r(struct _reent *ptr, size_t size)\n{\n    return malloc(size);\n}\n\nvoid *_realloc_r(struct _reent *ptr, void *old, size_t newlen)\n{\n    return realloc (old, newlen);\n}\n\nvoid *_calloc_r(struct _reent *ptr, size_t size, size_t len)\n{\n    return calloc(size, len);\n}\n\nvoid _free_r(struct _reent *ptr, void *addr)\n{\n    free(addr);\n}\n\nvoid _exit(int status)\n{\n    while (1);\n}\n\nvoid _system(const char *s)\n{\n    return;\n}\n\nvoid abort(void)\n{\n    while (1);\n}\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/log/atiny_log.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"log/atiny_log.h\"\n\nstatic atiny_log_e g_atiny_log_level = LOG_ERR;\n\nstatic const char *g_log_names[] =\n{\n    \"DEBUG\",\n    \"INFO\",\n    \"WARNING\",\n    \"ERR\",\n    \"FATAL\",\n};\n\nvoid atiny_set_log_level(atiny_log_e level)\n{\n    g_atiny_log_level = level;\n}\n\natiny_log_e atiny_get_log_level(void)\n{\n    return g_atiny_log_level;\n}\n\nconst char *atiny_get_log_level_name(atiny_log_e log_level)\n{\n    if (log_level >= LOG_MAX)\n    {\n        return \"UNKOWN\";\n    }\n\n    return g_log_names[log_level];\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/at_device/emtc_bg36/bg36.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#include <string.h>\n#include <ctype.h>\n#include \"bg36.h\"\n\nextern at_task at;\n#define MAX_BG36_SOCK_NUM 11\n\nat_config at_user_conf = {\n    .name = AT_MODU_NAME,\n    .usart_port = AT_USART_PORT,\n    .buardrate = AT_BUARDRATE,\n    .linkid_num = MAX_BG36_SOCK_NUM,\n    .user_buf_len = MAX_AT_USERDATA_LEN,\n    .cmd_begin = AT_CMD_BEGIN,\n    .line_end = AT_LINE_END,\n    .mux_mode = 1, //support multi connection mode\n    .timeout = BG36_TIMEOUT,   //  ms\n};\n\nemtc_socket_info sockinfo[MAX_BG36_SOCK_NUM];\n\nint bg36_cmd(char *cmd, int32_t len, const char *suffix, char *resp_buf, int* resp_len)\n{\n    AT_LOG(\"bg36 cmd:%s len:%d\",cmd, (int)len);\n\treturn at.cmd((int8_t *)cmd, len, suffix, resp_buf, resp_len);\n}\n\nstatic int bg36_close_sock(int sockid)\n{\n    char *cmd = \"AT+QICLOSE=\";\n    char buf[64];\n    int cmd_len;\n\n    cmd_len = snprintf(buf, sizeof(buf), \"%s%d\\r\", cmd, sockid);\n    return bg36_cmd(buf, cmd_len, \"OK\", NULL,NULL);\n}\n\n//Direct Push Mode\nint32_t bg36_data_handler(void *arg, int8_t *buf, int32_t len)\n{\n    int32_t sockid = 0;\n    int32_t data_len = 0;\n    const char *p1 = NULL;\n    const char *p2 = NULL;\n    QUEUE_BUFF qbuf;\n    int32_t ret = 0;\n    int32_t offset = 0;\n\n    while(offset < len)\n    {\n        p1 = strstr((char *)(buf+offset), \"recv\");\n        if (p1 == NULL)\n        {\n            AT_LOG(\"buf done, offset:%ld len:%ld\",offset, len);\n            return AT_OK;\n        }\n        p1 += strlen(\"\\\"recv\\\"\");\n        sockid = chartoint(p1+1);\n\n        if (sockid >= MAX_BG36_SOCK_NUM || sockinfo[sockid].used_flag == false)\n        {\n            AT_LOG(\"invalid sock id %ld\", sockid);\n            return AT_FAILED;\n        }\n\n        p2 = strstr((char *)(p1+1), \",\");\n        if (p2 == NULL)\n        {\n            AT_LOG(\"invalid data %ld\", sockid);\n            return AT_FAILED;\n        }\n        data_len = chartoint(p2+1);\n        if (data_len > AT_DATA_LEN*2 || data_len <= 0)\n        {\n            AT_LOG(\"datalen too long:%ld\", data_len);\n            return AT_FAILED;\n        }\n\n        qbuf.addr = at_malloc(data_len);\n        if (qbuf.addr == NULL)\n        {\n            AT_LOG(\"at_malloc null\");\n            return AT_OK;\n        }\n\n        p1 = strstr(p2, \"\\r\\n\");\n        if (p1 != NULL)\n        {\n            memcpy(qbuf.addr, p1+2, data_len);\n            qbuf.len = data_len;\n            ret = LOS_QueueWriteCopy(at.linkid[sockid].qid, &qbuf, sizeof(qbuf), 0);\n            if (LOS_OK != ret)\n            {\n                AT_LOG(\"LOS_QueueWriteCopy failed! ret %ld\", ret);\n                at_free(qbuf.addr);\n            }\n            offset+=data_len+strlen(\"+QIURC: \\\"recv\\\",\");\n        }\n        else\n        {\n            AT_LOG(\"recv data null!\");\n            return AT_FAILED;\n        }\n    }\n\n    return AT_OK;\n}\n\nint32_t bg36_cmd_match(const char *buf, char* featurestr,int len)\n{\n    return (strstr((char *)buf, featurestr) != NULL) ? 0: -1;\n}\n\nint32_t bg36_create_socket(const int8_t * host, const int8_t *port, int32_t proto, char* service_type)\n{\n    int rbuflen = 64;\n    char inbuf[64] = {0};\n    char tmpbuf[32] = {0};\n    int conid = 0;\n    int err = 0;\n    char* str = NULL;\n    int id = 0;\n    int ret = 0;\n    char cmd[64] = {0};\n\n    AT_LOG(\"port:%s\\r\\n\", port);\n\n    if (at.mux_mode != AT_MUXMODE_MULTI)\n    {\n        AT_LOG(\"Only support in multi mode!\\r\\n\");\n        return AT_FAILED;\n    }\n\n    id = at.get_id();\n    if (id >= MAX_BG36_SOCK_NUM)\n    {\n        AT_LOG(\"sock num exceeded,socket is %d\", id);\n        return AT_FAILED;\n    }\n\n    (void)snprintf(cmd, 64, \"%s,%d,\\\"%s\\\",\\\"%s\\\",%s,0,1\\r\", QIOPEN_SOCKET, id, service_type, host, port);\n    ret = bg36_cmd(cmd, strlen(cmd), \"+QIOPEN:\", inbuf, &rbuflen);\n    str = strstr(inbuf, \"+QIOPEN:\");\n    if (str == NULL || ret != AT_OK)\n    {\n        AT_LOG(\"QIOPEN no reply, sockid:%d\", id);\n        (void)bg36_close_sock((int)id);\n        (void)LOS_TaskDelay(10000);\n        ret = bg36_cmd(cmd, strlen(cmd), \"+QIOPEN:\", inbuf, &rbuflen);\n        str = strstr(inbuf, \"+QIOPEN:\");\n        if (str == NULL || ret != AT_OK)\n        {\n            at.linkid[id].usable = AT_LINK_UNUSE;\n            return AT_FAILED;\n        }\n    }\n\n    ret = sscanf(str,\"+QIOPEN: %d,%d%s\", &conid, &err, tmpbuf);\n    if(ret == -1 || err != 0 || conid != id)\n    {\n        AT_LOG(\"Create socket %d failed. conid:%d, ret %d, err:%d\", id, conid, ret, err);\n        (void)bg36_close_sock(conid);\n        at.linkid[id].usable = AT_LINK_UNUSE;\n        return AT_FAILED;\n    }\n\n    if (LOS_QueueCreate(\"dataQueue\", 16, &at.linkid[id].qid, 0, sizeof(QUEUE_BUFF)) != LOS_OK)\n    {\n        AT_LOG(\"init dataQueue failed!\");\n        (void)bg36_close_sock(conid);\n        at.linkid[id].usable = AT_LINK_UNUSE;\n        return AT_FAILED;\n    }\n\n    sockinfo[id].used_flag = true;\n    AT_LOG(\"create socket %d success!\",id);\n\n    return id;\n}\n\nint32_t bg36_bind(const int8_t * host, const int8_t *port, int32_t proto)\n{\n    return bg36_create_socket(host, port, proto, \"TCP\");\n}\n\nint32_t bg36_connect(const int8_t * host, const int8_t *port, int32_t proto)\n{\n    char *cmd2 = \"AT+QISTATE=1,\";\n    char cmd[64] = {0};\n    int sockid;\n    sockid = bg36_create_socket(host, port, proto, \"TCP\");\n    if(sockid < 0 || sockid >= MAX_BG36_SOCK_NUM)\n    {\n        return AT_FAILED;\n    }\n    (void)snprintf(cmd, 64, \"%s%d\\r\", cmd2, sockid);\n    (void)bg36_cmd(cmd, strlen(cmd), \"+QISTATE:\", NULL, NULL);\n    return sockid;\n}\n\nint32_t bg36_send(int32_t id , const uint8_t *buf, uint32_t len)\n{\n    char *cmd1 = \"AT+QISEND=\";\n    char cmd[64] = {0};\n    int ret;\n\tif (id < 0 || id >= MAX_BG36_SOCK_NUM || len >= MAX_SEND_DATA_LEN)\n    {\n        AT_LOG(\"invalid args sockid:%d len:%d\",(int)id, (int)len);\n        return AT_FAILED;\n    }\n    (void)snprintf(cmd, sizeof(cmd),\"%s%d,%d%c\",cmd1, (int)id, (int)len,'\\r');\n    ret = bg36_cmd(cmd, strlen(cmd), \">\", NULL, NULL);\n    if(ret)\n    {\n        AT_LOG(\"socket invalid,no >\");\n        return AT_FAILED;\n    }\n    ret = bg36_cmd((char *)buf, len, \"OK\", NULL, NULL);\n    if(ret)\n    {\n        AT_LOG(\"data send failed\");\n        return AT_FAILED;\n    }\n    return len;\n}\n\nstatic int32_t bg36_recv_timeout(int32_t id , uint8_t  *buf, uint32_t len,char* ipaddr,int* port, int32_t timeout)\n{\n    int rlen =0;\n    int copylen =0;\n    int ret;\n    QUEUE_BUFF  qbuf;\n    UINT32 qlen = sizeof(QUEUE_BUFF);\n\n    if (id  >= MAX_BG36_SOCK_NUM)\n    {\n        AT_LOG(\"link id %d invalid\", (int)id);\n        return AT_FAILED;\n    }\n\n    if (sockinfo[id].buf == NULL)\n    {\n        ret = LOS_QueueReadCopy(at.linkid[id].qid, &qbuf, &qlen, timeout);\n        if (ret != LOS_OK)\n        {\n             return AT_TIMEOUT;\n        }\n        AT_LOG(\"Read queue len:%d\",(int)qbuf.len);\n        sockinfo[id].buf = (char*)qbuf.addr;\n        sockinfo[id].len = qbuf.len;\n        sockinfo[id].offset = 0;\n    }\n\n    if(sockinfo[id].len - sockinfo[id].offset > len)\n    {\n        memcpy(buf, sockinfo[id].buf + sockinfo[id].offset, len);\n        sockinfo[id].offset += len;\n        return len;\n    }\n    else\n    {\n        copylen = sockinfo[id].len - sockinfo[id].offset;\n        memcpy(buf, sockinfo[id].buf + sockinfo[id].offset, copylen);\n        at_free(sockinfo[id].buf);\n        sockinfo[id].offset = 0;\n        sockinfo[id].buf = NULL;\n        sockinfo[id].len = 0;\n        rlen = copylen;\n        while(rlen < len)\n        {\n            ret = LOS_QueueReadCopy(at.linkid[id].qid, &qbuf, &qlen, 0);\n            if (ret == LOS_OK)\n            {\n                sockinfo[id].buf = (char*)qbuf.addr;\n                sockinfo[id].len = qbuf.len;\n                sockinfo[id].offset = 0;\n                if(len-rlen < qbuf.len)\n                {\n                    memcpy(buf+rlen, sockinfo[id].buf, len - rlen);\n                    sockinfo[id].offset = len - rlen;\n                    return len;\n                }\n                else\n                {\n                    memcpy(buf+rlen, sockinfo[id].buf, qbuf.len);\n                    rlen += qbuf.len;\n                    at_free(sockinfo[id].buf);\n                    sockinfo[id].offset = 0;\n                    sockinfo[id].buf = NULL;\n                    sockinfo[id].len = 0;\n                }\n            }\n            else\n            {\n                return rlen;\n            }\n        }\n\n        return rlen;\n    }\n}\n\nstatic int32_t bg36_recv(int32_t id , uint8_t  *buf, uint32_t len)\n{\n    return bg36_recv_timeout(id, buf, len, NULL, NULL, LOS_WAIT_FOREVER);/*lint !e569*/\n}\n\nstatic int32_t bg36_close(int32_t id)\n{\n    int ret;\n    QUEUE_BUFF  qbuf = {0};\n    char *cmd2 = \"AT+QISTATE=1,\";\n    char cmd[64] = {0};\n\n    UINT32 qlen = sizeof(QUEUE_BUFF);\n\n    (void)snprintf(cmd, 64, \"%s%d\\r\", cmd2, (int)id);\n    (void)bg36_cmd(cmd, strlen(cmd), \"+QISTATE:\", NULL, NULL);\n    ret = bg36_close_sock((int)id);\n    if (ret != AT_OK)\n    {\n        AT_LOG(\"close no reply,continue. sockid:%d\", (int)id);\n        (void)LOS_TaskDelay(10000);\n        (void)bg36_close_sock((int)id);\n        (void)LOS_TaskDelay(10000);\n        (void)bg36_cmd(cmd, strlen(cmd), \"+QISTATE:\", NULL, NULL);\n    }\n\n    sockinfo[id].used_flag = false;\n    at.linkid[id].usable = false;\n\n    if(sockinfo[id].buf != NULL)\n    {\n        at_free(sockinfo[id].buf);\n    }\n\n    do\n    {\n        qbuf.addr = NULL;\n        ret = LOS_QueueReadCopy(at.linkid[id].qid, &qbuf, &qlen, 0);\n        if (ret == LOS_OK && qbuf.addr != NULL)\n        {\n            at_free(qbuf.addr);\n        }\n    }while(ret == LOS_OK);\n\n    ret = LOS_QueueDelete(at.linkid[id].qid);\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"LOS_QueueDelete failed, ret is %d!,qid %d\", ret, at.linkid[id].qid);\n    }\n\n    return ret;\n}\n\nstatic int32_t bg36_init(void)\n{\n    int rbuflen = 64;\n    char inbuf[64] = {0};\n    char tmpbuf[64] = {0};\n    int creg = 0;\n    int i = 0;\n    int ret;\n\n    at.init(&at_user_conf);\n    memset(sockinfo, 0, sizeof(emtc_socket_info) * MAX_BG36_SOCK_NUM);/*lint !e545*/\n\n    (void)at.oob_register(AT_DATAF_PREFIX, strlen(AT_DATAF_PREFIX), bg36_data_handler, bg36_cmd_match);\n    (void)bg36_cmd(ATI, strlen(ATI), \"OK\", NULL, NULL);\n    (void)bg36_cmd(ATE0, strlen(ATE0), \"OK\", NULL, NULL);\n    (void)bg36_cmd(CPIN, strlen(CPIN), \"+CPIN: READY\", NULL, NULL);\n    while(1)\n    {\n        (void)bg36_cmd(QUERYCFATT, strlen(QUERYCFATT), \"+CGATT\", inbuf,&rbuflen);\n        if (strlen(inbuf)!=0)\n        {\n            ret = sscanf(inbuf,\"\\r\\n+CGATT: %d\\r\\n%s\",&creg,tmpbuf);\n            if(ret == -1)\n            {\n                continue;\n            }\n            if (creg == 1)\n            {\n                break;\n            }\n        }\n        (void)LOS_TaskDelay(100);\n        memset(inbuf, 0, sizeof(inbuf));\n    }\n\n    for( i = 0; i < MAX_BG36_SOCK_NUM; i++)\n    {\n        (void)bg36_close((int32_t)i);/*lint !e534*/\n    }\n\n    return bg36_cmd(QIACTQUERY, strlen(QIACTQUERY), \"OK\", NULL, NULL);\n}\n\nat_adaptor_api emtc_bg36_interface =\n{\n    .init = bg36_init,\n    .bind = bg36_bind,\n    .connect = bg36_connect,\n    .send = bg36_send,\n    .sendto = NULL,\n    .recv_timeout = bg36_recv_timeout,\n    .recv = bg36_recv,\n    .recvfrom = NULL,\n    .close = bg36_close,\n    .recv_cb = NULL,\n    .deinit = NULL,\n};\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/at_device/emtc_bg36/bg36.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef __EMTC_BG36_H__\n#define __EMTC_BG36_H__\n\n#include \"at_frame/at_main.h\"\n#define AT_MODU_NAME        \"BG36\"\n#define AT_USART_PORT       3\n#define AT_BUARDRATE        115200\n#define BG36_TIMEOUT        10000    //ms\n#define MAX_AT_USERDATA_LEN (1024*4)\n#define MAX_SEND_DATA_LEN   1400\n\n#define AT_LINE_END \t\t\"\\r\"\n#define AT_CMD_BEGIN\t\t\"\\r\\n\"\n\ntypedef struct emtc_socket_info_t\n{\n    int len;\n    int offset;\n    char *buf;\n    bool used_flag;\n}emtc_socket_info;\n\n\n#define ATI \"ATI\\r\"\n#define ATE0 \"ATE0\\r\"\n#define CMEE \"AT+CMEE=2\\r\"\n#define QCFG \"AT+QCFG=\\\"nwscanseq\\\",03\\r\"\n\n#define CPIN \"AT+CPIN?\\r\"\n#define CREG \"AT+CREG?\\r\"\n#define GETQICSGP \"AT+QICSGP=1\\r\"\n#define SETCELL \"AT+CGREG=2\\r\"\n#define QUERYCELL \"AT+CGREG?\\r\"\n\n#define QICSGP \"AT+QICSGP=1,1,\\\"HUAWEI.COM\\\",\\\"\\\",\\\"\\\",1\\r\"\n#define QIACT \"AT+QIACT=1\\r\"\n#define QIACTQUERY \"AT+QIACT?\\r\"\n#define CSQ \"AT+CSQ\\r\"\n#define QIOPEN_SOCKET \"AT+QIOPEN=1\"\n#define QUERYCFATT \"AT+CGATT?\\r\"\n#define AT_DATAF_PREFIX \"+QIURC:\"\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/at_device/gprs_sim900a/sim900a.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#if defined(WITH_AT_FRAMEWORK)\n#include \"sim900a.h\"\n\nextern at_task at;\nat_adaptor_api sim900a_interface;\nchar prefix_name[15];\n\nint32_t sim900a_echo_off(void)\n{\n    return at.cmd((int8_t *)AT_CMD_ECHO_OFF, strlen(AT_CMD_ECHO_OFF), \"OK\\r\\n\", NULL,NULL);\n}\nint32_t sim900a_echo_on(void)\n{\n    return at.cmd((int8_t *)AT_CMD_ECHO_ON, strlen(AT_CMD_ECHO_OFF), \"OK\\r\\n\", NULL,NULL);\n}\nint32_t sim900a_reset(void)\n{\n    int32_t ret = 0;\n    //at.cmd((int8_t*)AT_CMD_CLOSE,strlen(AT_CMD_CLOSE),\"CLOSE OK\",\"ERROR\");\n    ret = at.cmd((int8_t *)AT_CMD_SHUT, strlen(AT_CMD_SHUT), \"SHUT OK\", NULL,NULL);\n    return ret;\n}\n\nint32_t sim900a_set_mux_mode(int32_t m)\n{\n    char cmd[64] = {0};\n    snprintf(cmd, 64, \"%s=%d\", AT_CMD_MUX, (int)m);\n    return at.cmd((int8_t *)cmd, strlen(cmd), \"OK\", NULL,NULL);\n}\n\nint32_t sim900a_connect(const int8_t *host, const int8_t *port, int32_t proto)\n{\n    int32_t ret = AT_FAILED;\n    int32_t id = at.get_id();\n    sim900a_reset();\n    char cmd1[64] = {0};\n    snprintf(cmd1, 64, \"%s=\\\"B\\\"\", AT_CMD_CLASS);\n    at.cmd((int8_t *)cmd1, strlen(cmd1), \"OK\", NULL,NULL);\n    char cmd2[64] = {0};\n    snprintf(cmd2, 64, \"%s=1,\\\"IP\\\",\\\"CMNET\\\"\", AT_CMD_PDP_CONT);\n    at.cmd((int8_t *)cmd2, strlen(cmd2), \"OK\", NULL,NULL);\n    char cmd3[64] = {0};\n    snprintf(cmd3, 64, \"%s=1\", AT_CMD_PDP_ATT);\n    at.cmd((int8_t *)cmd3, strlen(cmd3), \"OK\", NULL,NULL);\n    char cmd4[64] = {0};\n    snprintf(cmd4, 64, \"%s=1\", AT_CMD_CIPHEAD);\n    at.cmd((int8_t *)cmd4, strlen(cmd4), \"OK\", NULL,NULL);\n    char cmd5[64] = {0};\n\n    AT_LOG_DEBUG(\"host:%s, port:%s\", host, port);\n\n    if (AT_MUXMODE_SINGLE == at.mux_mode)\n    {\n        snprintf(cmd5, 64, \"%s=\\\"%s\\\",\\\"%s\\\",\\\"%s\\\"\", AT_CMD_CONN, proto == ATINY_PROTO_UDP ? \"UDP\" : \"TCP\", host, port);\n    }\n    else\n    {\n        at.cmd((int8_t *)(AT_CMD_PDP_ACT\"=1,1\"), strlen(AT_CMD_PDP_ACT\"=1,1\"), \"OK\", NULL,NULL);\n        at.cmd((int8_t *)AT_CMD_CSTT, strlen(AT_CMD_CSTT), \"OK\", NULL,NULL);\n        at.cmd((int8_t *)AT_CMD_CIICR, strlen(AT_CMD_CIICR), \"OK\", NULL,NULL);\n        at.cmd((int8_t *)AT_CMD_CIFSR, strlen(AT_CMD_CIFSR), \"\", NULL,NULL);\n        snprintf(cmd5, 64, \"%s=%ld,\\\"%s\\\",\\\"%s\\\",\\\"%s\\\"\", AT_CMD_CONN, id, proto == ATINY_PROTO_UDP ? \"UDP\" : \"TCP\", host, port);\n    }\n    if (id < 0 || id >= AT_MAX_LINK_NUM)\n    {\n        AT_LOG(\"no vailed linkid for use(id = %ld)\", id);\n        return -1;\n    }\n    ret = LOS_QueueCreate(\"dataQueue\", 16, &at.linkid[id].qid, 0, sizeof(QUEUE_BUFF));\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"init dataQueue failed!\");\n        at.linkid[id].usable = AT_LINK_UNUSE;\n        return  -1;\n    }\n    at.cmd((int8_t *)cmd5, strlen(cmd5), \"CONNECT OK\", NULL,NULL);\n    return id;\n}\n\nint32_t  sim900a_recv_timeout(int32_t id, uint8_t *buf, uint32_t len, char* ipaddr,int* port, int32_t timeout)\n{\n    uint32_t qlen = sizeof(QUEUE_BUFF);\n    uint32_t rxlen = 0;\n\n    (void)ipaddr; //gprs not need remote ip\n    (void)port;   //gprs not need remote port\n\n    QUEUE_BUFF  qbuf = {0, NULL};\n    AT_LOG(\"****at.linkid[id].qid=%d***\\n\", at.linkid[id].qid);\n    int ret = LOS_QueueReadCopy(at.linkid[id].qid, (void *)&qbuf, (UINT32 *)&qlen, timeout);\n    AT_LOG(\"ret = %x, len = %ld, id = %ld\", ret, qbuf.len, id);\n    if (ret != LOS_OK)\n    {\n        return AT_FAILED;\n    }\n\n    if (qbuf.len)\n    {\n        rxlen = (len < qbuf.len) ? len : qbuf.len;\n        memcpy(buf, qbuf.addr, rxlen);\n        at_free(qbuf.addr);\n    }\n    return rxlen;\n}\n\nint32_t  sim900a_recv(int32_t id, uint8_t *buf, uint32_t len)\n{\n    return sim900a_recv_timeout(id, buf, len, NULL,NULL,LOS_WAIT_FOREVER);\n}\n\nint32_t sim900a_send(int32_t id , const uint8_t  *buf, uint32_t len)\n{\n    int32_t ret = -1;\n    char cmd[64] = {0};\n    if (AT_MUXMODE_SINGLE == at.mux_mode)\n    {\n        snprintf(cmd, 64, \"%s=%ld\", AT_CMD_SEND, len);\n    }\n    else\n    {\n        snprintf(cmd, 64, \"%s=%ld,%ld\", AT_CMD_SEND, id, len);\n    }\n\n    ret = at.write((int8_t *)cmd, (int8_t *)\"SEND OK\", (int8_t *)buf, len);\n\n    return ret;\n}\n\nvoid sim900a_check(void)\n{\n    //check module response\n    while(AT_FAILED == at.cmd((int8_t *)AT_CMD_AT, strlen(AT_CMD_AT), \"OK\", NULL,NULL))\n    {\n        printf(\"\\r\\ncheck module response unnormal\\r\\n\");\n        printf(\"\\r\\nplease check the module pin connection and the power switch\\r\\n\");\n        SIM900A_DELAY(500);\n    }\n    if(AT_FAILED != at.cmd((int8_t *)AT_CMD_CPIN, strlen(AT_CMD_CPIN), \"OK\", NULL,NULL))\n    {\n        printf(\"detected sim card\\n\");\n    }\n    if(AT_FAILED != at.cmd((int8_t *)AT_CMD_COPS, strlen(AT_CMD_COPS), \"CHINA MOBILE\", NULL,NULL))\n    {\n        printf(\"registerd to the network\\n\");\n    }\n}\n\nint32_t sim900a_recv_cb(int32_t id)\n{\n    return AT_FAILED;\n}\n\nint32_t sim900a_close(int32_t id)\n{\n    char cmd[64] = {0};\n    if (AT_MUXMODE_SINGLE == at.mux_mode)\n    {\n        snprintf(cmd, 64, \"%s\", AT_CMD_CLOSE);\n    }\n    else\n    {\n        uint32_t qlen = sizeof(QUEUE_BUFF);\n        QUEUE_BUFF  qbuf = {0, NULL};\n        while(LOS_OK == LOS_QueueReadCopy(at.linkid[id].qid, (void *)&qbuf, (UINT32 *)&qlen, 10))\n        {\n            if (qbuf.len)\n            {\n                at_free(qbuf.addr);\n                memset(&qbuf, 0, sizeof(QUEUE_BUFF)); // don't use qlen\n            }\n        }\n        (void)LOS_QueueDelete(at.linkid[id].qid);\n        at.linkid[id].usable = 0;\n        snprintf(cmd, 64, \"%s=%ld\", AT_CMD_CLOSE, id);\n    }\n    return at.cmd((int8_t *)cmd, strlen(cmd), \"OK\", NULL,NULL);\n}\nint32_t sim900a_data_handler(void *arg, int8_t *buf, int32_t len)\n{\n    if (NULL == buf || len <= 0)\n    {\n        AT_LOG(\"param invailed!\");\n        return -1;\n    }\n    AT_LOG(\"entry!\");\n\n    //process data frame ,like +IPD,linkid,len:data\n    int32_t ret = 0;\n    int32_t linkid = 0, data_len = 0;\n    char *p1, *p2;\n    QUEUE_BUFF qbuf;\n    p1 = (char *)buf;\n\n    if (0 == memcmp(p1, prefix_name, strlen(prefix_name)))\n    {\n        p2 = strstr(p1, \",\");\n        if (NULL == p2)\n        {\n            AT_LOG(\"got data prefix invailed!\");\n            goto END;\n        }\n\n        if (AT_MUXMODE_MULTI == at.mux_mode)\n        {\n            linkid = 0;\n            for (p2++; *p2 <= '9' && *p2 >= '0'; p2++)\n            {\n                linkid = linkid * 10 + (*p2 - '0');\n            }\n        }\n\n        for (p2++; *p2 <= '9' && *p2 >= '0' ; p2++)\n        {\n            data_len = (data_len * 10 + (*p2 - '0'));\n        }\n        p2++; //over ':'\n\n        if (data_len > len)\n        {\n            AT_LOG(\"error !! receive data not complete data_len:%ld len:%ld\",data_len,len);\n            goto END;\n        }\n\n        qbuf.addr = at_malloc(data_len);\n        if (NULL == qbuf.addr)\n        {\n            AT_LOG(\"malloc for qbuf failed!\");\n            goto END;\n        }\n\n        qbuf.len = data_len;\n        if(AT_MUXMODE_MULTI == at.mux_mode)\n        {\n            p2++;\n            p2++;//multi-connect prefix is +RECEIVE,0,13:\\r\\n+packet content\n        }\n        memcpy(qbuf.addr, p2, data_len);\n\n        if (LOS_OK != (ret = LOS_QueueWriteCopy(at.linkid[linkid].qid, &qbuf, sizeof(QUEUE_BUFF), 0)))\n        {\n            AT_LOG(\"LOS_QueueWriteCopy  failed! ret = %lx\", ret);\n            at_free(qbuf.addr);\n            goto END;\n        }\n        ret = (p2 + data_len - (char *)buf);\n    }\nEND:\n    return ret;\n}\n\nint32_t sim900a_cmd_match(const char *buf, char* featurestr,int len)\n{\n    return memcmp(buf,featurestr,len);\n}\n\nint32_t sim900a_ini()\n{\n    at_config at_user_conf =\n    {\n        .name = AT_MODU_NAME,\n        .usart_port = AT_USART_PORT,\n        .buardrate = AT_BUARDRATE,\n        .linkid_num = AT_MAX_LINK_NUM,\n        .user_buf_len = MAX_AT_USERDATA_LEN,\n        .cmd_begin = AT_CMD_BEGIN,\n        .line_end = AT_LINE_END,\n        .mux_mode = 1, //support multi connection mode\n        .timeout = AT_CMD_TIMEOUT,   //  ms\n    };\n    at.init(&at_user_conf);\n    //single and multi connect prefix is different\n    if (AT_MUXMODE_MULTI == at.mux_mode)\n    {\n        memcpy(prefix_name, AT_DATAF_PREFIX_MULTI, sizeof(AT_DATAF_PREFIX_MULTI));\n    }\n    else\n    {\n        memcpy(prefix_name, AT_DATAF_PREFIX, sizeof(AT_DATAF_PREFIX));\n    }\n    at.oob_register((char *)prefix_name, strlen((char *)prefix_name), sim900a_data_handler,sim900a_cmd_match);\n    sim900a_echo_off();\n    sim900a_check();\n    sim900a_reset();\n    sim900a_set_mux_mode(at.mux_mode);\n    at.cmd((int8_t *)(\"AT+CIPMUX?\"), strlen(\"AT+CIPMUX?\"), \"OK\", NULL,NULL);\n    return AT_OK;\n}\n\nint32_t sim900a_deinit(void)\n{\n    int id = 0;\n\n    if(NULL != at.linkid)\n    {\n        for(id = 0; id < AT_MAX_LINK_NUM; id++)\n        {\n            if(AT_LINK_INUSE == at.linkid[id].usable)\n            {\n                if(AT_OK != sim900a_close(id))\n                {\n                    AT_LOG(\"sim900a_close(%d) failed\", id);\n                }\n            }\n        }\n    }\n\n    at.deinit();\n    return AT_OK;\n}\n\n\n\nat_adaptor_api sim900a_interface =\n{\n    .init = sim900a_ini,\n    .connect = sim900a_connect, /*TCP or UDP connect*/\n    .send = sim900a_send, /*send data, if no response, retrun error*/\n    .recv_timeout = sim900a_recv_timeout,\n    .recv = sim900a_recv,\n    .close = sim900a_close,/*close connect*/\n    .recv_cb = sim900a_recv_cb,/*receive event handle, no available by now */\n    .deinit = sim900a_deinit,\n};\n\n#endif //#if NETWORK_TYPE == SIM_900A\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/at_device/gprs_sim900a/sim900a.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#ifndef __SIM900A_H__\n#define __SIM900A_H__\n\n#include \"at_frame/at_main.h\"\n\n#define AT_MODU_NAME        \"SIM900A\"\n#define AT_USART_PORT       2\n#define AT_BUARDRATE        115200\n#define AT_CMD_TIMEOUT      10000    //ms\n#define AT_MAX_LINK_NUM     4\n\n#define AT_LINE_END \t\t\"\\r\"\n#define AT_CMD_BEGIN\t\t\"\\r\\n\"\n#define MAX_AT_USERDATA_LEN (1024*5)\n\n#define AT_CMD_AT    \t\t\"AT\"\n#define AT_CMD_CPIN         \"AT+CPIN?\"//check sim card\n#define AT_CMD_COPS         \"AT+COPS?\"//check register network\n#define AT_CMD_CLOSE    \t\"AT+CIPCLOSE\"\n#define AT_CMD_SHUT    \t\t\"AT+CIPSHUT\"\n#define AT_CMD_ECHO_OFF \t\"ATE0\"\n#define AT_CMD_ECHO_ON  \t\"ATE1\"\n#define AT_CMD_MUX \t\t\t\"AT+CIPMUX\"\n#define AT_CMD_CLASS        \"AT+CGCLASS\"//set MS type\n#define AT_CMD_PDP_CONT   \t\"AT+CGDCONT\"//configure pdp context\n#define AT_CMD_PDP_ATT    \t\"AT+CGATT\"//pdp attach network\n#define AT_CMD_PDP_ACT\t\t\"AT+CGACT\"//active pdp context\n#define AT_CMD_CSTT\t\t\t\"AT+CSTT\"//start task\n#define AT_CMD_CIICR\t\t\"AT+CIICR\"//start gprs connect\n#define AT_CMD_CIFSR\t\t\"AT+CIFSR\"//get local ip\n#define AT_CMD_CIPHEAD\t\t\"AT+CIPHEAD\"\n#define AT_CMD_CONN\t\t\t\"AT+CIPSTART\"\n#define AT_CMD_SEND\t\t\t\"AT+CIPSEND\"\n#define AT_CMD_CLOSE\t\t\"AT+CIPCLOSE\"\n\n#define AT_DATAF_PREFIX      \"\\r\\n+IPD\"\n#define AT_DATAF_PREFIX_MULTI      \"\\r\\n+RECEIVE\"\n#define SIM900A_DELAY       LOS_TaskDelay\n\n#endif /* __SIM900A_H__ */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/at_device/nb_bc95/bc95.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#include <string.h>\n#include <ctype.h>\n#if defined(WITH_AT_FRAMEWORK)\n#include \"at_device/bc95.h\"\n#include \"at_hal.h\"\n\n//#include \"bc95_test.h\"\n\n\n\n\nextern at_task at;\nat_adaptor_api bc95_interface;\nextern char rbuf[AT_DATA_LEN];\nextern char wbuf[AT_DATA_LEN];\n\n\ntypedef struct\n{\n    uint32_t data_len;\n    int link_idx;\n    bool valid_flag;\n}nb_data_ind_info_s;\n\nchar tmpbuf[AT_DATA_LEN]={0}; //transform to hex\n\nsocket_info sockinfo[MAX_SOCK_NUM];\nstatic nb_data_ind_info_s g_data_ind_info;\n\n#if defined ( __CC_ARM ) || defined ( __ICCARM__ )\nstatic char *strnstr(const char *s1, const char *s2, size_t len)\n{\n    size_t l2;\n\n    l2 = strlen(s2);\n    if (!l2)\n        return (char *)s1;\n    while (len >= l2) {\n        len--;\n        if (!memcmp(s1, s2, l2))\n            return (char *)s1;\n        s1++;\n    }\n    return NULL;\n}\n#endif\n\nstatic int nb_alloc_sock(int socket)\n{\n    int idx;\n\n    for (uint32_t i = 0; i < MAX_SOCK_NUM; ++i)\n    {\n        if (sockinfo[i].used_flag  && (sockinfo[i].socket == socket))\n        {\n            return i;\n        }\n    }\n\n    idx  = (socket % MAX_SOCK_NUM);\n    if (!sockinfo[idx].used_flag)\n    {\n        return idx;\n    }\n\n    for (uint32_t i = 0; i < MAX_SOCK_NUM; ++i)\n    {\n        if (!sockinfo[i].used_flag)\n        {\n            return i;\n        }\n    }\n    AT_LOG(\"save socket fail %d\", socket);\n    return MAX_SOCK_NUM;\n}\n\nstatic int nb_sock_to_idx(int socket)\n{\n    int idx;\n\n    idx  = (socket % MAX_SOCK_NUM);\n\n    if (sockinfo[idx].used_flag && (socket == sockinfo[idx].socket))\n    {\n        return idx;\n    }\n\n    for (uint32_t i = 0; i < MAX_SOCK_NUM; ++i)\n    {\n        if (sockinfo[i].used_flag && (socket == sockinfo[i].socket))\n        {\n            return i;\n        }\n    }\n\n    return MAX_SOCK_NUM;\n}\n\nint str_to_hex(const char *bufin, int len, char *bufout)\n{\n    int i = 0;\n    if (NULL == bufin || len <= 0 || NULL == bufout)\n    {\n        return -1;\n    }\n    for(i = 0; i < len; i++)\n    {\n        sprintf(bufout+i*2, \"%02X\", bufin[i]);\n    }\n    return 0;\n}\n\nvoid HexStrToStr(const unsigned char *source, unsigned char *dest, int sourceLen)\n{\n    short i;\n    unsigned char highByte, lowByte;\n    for (i = 0; i < sourceLen; i += 2)\n    {\n        highByte = toupper(source[i]);\n        lowByte  = toupper(source[i + 1]);\n        if (highByte > 0x39)\n            highByte -= 0x37;\n        else\n            highByte -= 0x30;\n        if (lowByte > 0x39)\n            lowByte -= 0x37;\n        else\n            lowByte -= 0x30;\n        dest[i / 2] = (highByte << 4) | lowByte;\n    }\n    return ;\n}\n\nint32_t nb_reboot(void)\n{\n   // memset(sockinfo, 0, MAX_SOCK_NUM * sizeof(struct _socket_info_t));\n    return at.cmd((int8_t*)AT_NB_reboot, strlen(AT_NB_reboot), \"OK\", NULL,NULL);\n}\n\nint32_t nb_hw_detect(void)//\"AT+CFUN?\\r\"\n{\n    return at.cmd((int8_t*)AT_NB_hw_detect, strlen(AT_NB_hw_detect), \"+CFUN:1\", NULL,NULL);\n}\n\nint32_t nb_check_csq(void)\n{\n    char *cmd = \"AT+CSQ\\r\";\n    return at.cmd((int8_t*)cmd, strlen(cmd), \"+CSQ:\", NULL,NULL);\n}\n\nint32_t nb_set_cdpserver(char* host, char* port)\n{\n    char *cmd = \"AT+NCDP=\";\n    char *cmd2 = \"AT+NCDP?\";\n\tchar *cmdNNMI = \"AT+NNMI=1\\r\";\n    char *cmdCMEE = \"AT+CMEE=1\\r\";\n\t//char *cmdCGP = \"AT+CGPADDR\";\n\tchar tmpbuf[128] = {0};\n\tint ret = -1;\n    char ipaddr[100] = {0};\n    if(strlen(host) > 70 || strlen(port) > 20 || host==NULL || port == NULL)\n    {\n        ret = at.cmd((int8_t*)cmdNNMI, strlen(cmdNNMI), \"OK\", NULL,NULL);\n        ret = at.cmd((int8_t*)cmdCMEE, strlen(cmdCMEE), \"OK\", NULL,NULL);\n        return ret;\n    }\n\n    snprintf(ipaddr, sizeof(ipaddr) - 1, \"%s,%s\\r\", host, port);\n\tsnprintf(tmpbuf, sizeof(tmpbuf) - 1, \"%s%s%c\", cmd, ipaddr, '\\r');\n\n    ret = at.cmd((int8_t*)tmpbuf, strlen(tmpbuf), \"OK\", NULL,NULL);\n\tif(ret < 0)\n\t{\n\t\treturn ret;\n\t}\n\tret = at.cmd((int8_t*)cmd2, strlen(cmd2), ipaddr, NULL,NULL);\n\t//LOS_TaskDelay(1000);\n\tret = at.cmd((int8_t*)cmdNNMI, strlen(cmdNNMI), \"OK\", NULL,NULL);\n\t//at.cmd((int8_t*)cmdCMEE, strlen(cmdCMEE), \"OK\", NULL, NULL);\n    //ret = at.cmd((int8_t*)cmdCGP, strlen(cmdCGP), NULL, NULL);\n\treturn ret;\n}\n\nint32_t nb_send_psk(char* pskid, char* psk)\n{\n    char* cmds = \"AT+QSECSWT\";//AT+QSECSWT=1,100    OK\n    char* cmdp = \"AT+QSETPSK\";//AT+QSETPSK=86775942,E6F4C799   OK\n    sprintf(wbuf, \"%s=%d,%d\\r\", cmds, 1, 100);//min\n    at.cmd((int8_t*)wbuf, strlen(wbuf), \"OK\", NULL,NULL);\n    snprintf(wbuf, AT_DATA_LEN, \"%s=%s,%s\\r\", cmdp, pskid, psk);\n    return at.cmd((int8_t*)wbuf, strlen(wbuf), \"OK\", NULL,NULL);\n}\n\nint32_t nb_set_no_encrypt(void)\n{\n    char* cmd = \"AT+QSECSWT=0\\r\";\n    return at.cmd((int8_t*)cmd, strlen(cmd), \"OK\", NULL,NULL);\n}\n\n#ifdef WITH_SOTA\nint sota_cmd(int8_t *cmd, int32_t len, const char *suffix, char *resp_buf, int* resp_len)\n{\n    AT_LOG(\"sota_cmd:%s\", cmd);\n    LOS_MuxPend(at.cmd_mux, LOS_WAIT_FOREVER);\n    at_transmit((uint8_t *)cmd, len, 1);\n    LOS_MuxPost(at.cmd_mux);\n\n    return AT_OK;\n\n}\n\nint nb_send_str(const char* buf, int len)\n{\n    char *cmd1 = \"AT+NMGS=\";\n    memset(wbuf, 0, AT_DATA_LEN);\n    memset(rbuf, 0, AT_DATA_LEN);\n    snprintf(wbuf, AT_DATA_LEN, \"%s%d,%s%c\",cmd1,(int)len/2,buf,'\\r');\n    return sota_cmd((int8_t*)wbuf, strlen(wbuf), \"OK\", NULL,NULL);\n\n}\n#endif\nint32_t nb_send_payload(const char* buf, int len)\n{\n    char *cmd1 = \"AT+NMGS=\";\n    char *cmd2 = \"AT+NQMGS\\r\";\n    int ret;\n    char* str = NULL;\n    int curcnt = 0;\n    int rbuflen;\n    static int sndcnt = 0;\n    if(buf == NULL || len > AT_MAX_PAYLOADLEN)\n    {\n        AT_LOG(\"payload too long\");\n        return -1;\n    }\n    memset(tmpbuf, 0, AT_DATA_LEN);\n    memset(wbuf, 0, AT_DATA_LEN);\n    str_to_hex(buf, len, tmpbuf);\n    memset(rbuf, 0, AT_DATA_LEN);\n    snprintf(wbuf, AT_DATA_LEN,\"%s%d,%s%c\",cmd1,(int)len,tmpbuf,'\\r');\n    ret = at.cmd((int8_t*)wbuf, strlen(wbuf), \"OK\", NULL,NULL);\n    if(ret < 0)\n        return -1;\n    ret = at.cmd((int8_t*)cmd2, strlen(cmd2), \"SENT=\", rbuf,&rbuflen);\n    if(ret < 0)\n        return -1;\n    str = strstr(rbuf,\"SENT=\");\n    if(str == NULL)\n        return -1;\n    sscanf(str,\"SENT=%d,%s\",&curcnt,wbuf);\n    if(curcnt == sndcnt)\n        return -1;\n    sndcnt = curcnt;\n    return ret;\n}\n\nint nb_query_ip(void)\n{\n\tchar *cmd = \"AT+CGPADDR\\r\";\n    return at.cmd((int8_t*)cmd, strlen(cmd), \"+CGPADDR:0,\", NULL,NULL);\n}\n\nint32_t nb_get_netstat(void)\n{\n\tchar *cmd = \"AT+CGATT?\\r\";\n    return at.cmd((int8_t*)cmd, strlen(cmd), \"CGATT:1\", NULL,NULL);\n}\n\nstatic int32_t nb_cmd_with_2_suffix(const int8_t *cmd, int  len,\n                        const char* suffix_ok, const char* suffix_err,  char *resp_buf, uint32_t* resp_len)\n{\n\n    const char *suffix[2] = {0};\n    at_cmd_info_s cmd_info = {0};\n\n    suffix[0] = suffix_ok;\n    suffix[1] = suffix_err;\n\n    cmd_info.suffix = suffix;\n    cmd_info.suffix_num = array_size(suffix);\n\n    cmd_info.resp_buf = resp_buf;\n    cmd_info.resp_len = resp_len;\n\n\tif (at.cmd_multi_suffix(cmd, len, &cmd_info) != AT_OK)\n    {\n        return AT_FAILED;\n    }\n\n    if (cmd_info.match_idx != 0)\n    {\n        AT_LOG(\"cmd_info.match_idx %d\", cmd_info.match_idx);\n        return AT_FAILED;\n    }\n\n    return AT_OK;\n}\n\n\nint32_t nb_create_sock(int port,int proto)\n{\n\tint socket;\n    int rbuflen = AT_DATA_LEN;\n\tconst char *cmdudp = \"AT+NSOCR=DGRAM,17,\";//udp\n\tconst char *cmdtcp = \"AT+NSOCR=STREAM,6,\";//tcp\n\tint ret;\n    char buf[64];\n    int cmd_len;\n\n\tif(proto!=17 && proto!=6)\n    {\n        AT_LOG(\"proto invalid!\");\n        return -1;\n    }\n    memset(rbuf, 0, AT_DATA_LEN);\n\n    if (proto == 17)\n    {\n        cmd_len = snprintf(buf, sizeof(buf), \"%s%d,1\\r\", cmdudp, port);//udp\n    }\n    else\n    {\n        cmd_len = snprintf(buf, sizeof(buf), \"%s%d,1\\r\", cmdtcp, port);\n    }\n\n\tnb_cmd_with_2_suffix((int8_t*)buf, cmd_len, \"OK\", \"ERROR\", rbuf, (uint32_t *)&rbuflen);\n\tret = sscanf(rbuf, \"%d\\r%s\",&socket, tmpbuf);\n    if ((2 == ret) && (socket >= 0)\n        && (strnstr(tmpbuf, \"OK\", sizeof(tmpbuf))))\n    {\n        return socket;\n    }\n\n    AT_LOG(\"sscanf fail,ret=%d,socket=%d\", ret, socket);\n    return -1;\n}\n\nstatic bool nb_is_addr_valid(const char *addr)\n{\n    const int size = 4;\n    int tmp[4];\n    int ret;\n\n    ret = sscanf(addr, \"%d.%d.%d.%d\", &tmp[0], &tmp[1], &tmp[2], &tmp[3]);\n    return  (size == ret);\n}\n\nint nb_decompose_str(const char* str, int *readleft, int *out_sockid)\n{\n    const char *tmp,*trans;\n    int sockid;\n    QUEUE_BUFF qbuf;\n    int ret = AT_FAILED;\n    int rlen;\n    int link_id;\n\n\n    tmp = strstr(str,\",\");\n    if(tmp == NULL)\n    {\n        return AT_FAILED;\n    }\n\n    sockid = chartoint(str);\n    trans = strstr(tmp+1,\",\");\n    if(trans == NULL)\n    {\n        return AT_FAILED;\n    }\n    strncpy(qbuf.ipaddr,tmp+1,MIN((trans-tmp),AT_DATA_LEN/2));\n    qbuf.ipaddr[trans-tmp-1] = '\\0';\n    if (!nb_is_addr_valid(qbuf.ipaddr))\n    {\n        return AT_FAILED;\n    }\n\n    qbuf.port = chartoint((char*)(trans+1));\n    tmp = strstr(trans+1,\",\");\n    if(tmp == NULL)\n    {\n        return AT_FAILED;\n    }\n    rlen = chartoint((char*)(tmp+1));\n    if(rlen >= AT_DATA_LEN/2 || rlen < 0)\n    {\n        AT_LOG(\"rlen %d\", rlen);\n        return AT_FAILED;\n    }\n\n    trans = strstr(tmp+1,\",\");\n    if(trans == NULL)\n    {\n        return AT_FAILED;\n    }\n\n    tmp = strstr(trans+1,\",\");\n    if (tmp == NULL)\n    {\n        return AT_FAILED;\n    }\n\n    *readleft = chartoint((char*)(tmp+1));\n\n    *out_sockid = sockid;\n\n    link_id = nb_sock_to_idx(sockid);\n    if (link_id >= MAX_SOCK_NUM)\n    {\n        AT_LOG(\"sockid invalid %d\", sockid);\n        return AT_OK;\n    }\n\n    qbuf.addr = at_malloc(rlen);\n    if (qbuf.addr == NULL)\n    {\n        AT_LOG(\"at_malloc null\");\n        return AT_OK;\n    }\n\n    HexStrToStr((const unsigned char*)(trans+1), qbuf.addr, (rlen)*2);\n    qbuf.len = rlen;\n\n    ret = LOS_QueueWriteCopy(at.linkid[link_id].qid, &qbuf, sizeof(qbuf), 0);\n    if (LOS_OK != ret)\n    {\n        AT_LOG(\"LOS_QueueWriteCopy  failed! ret %d\", ret);\n        at_free(qbuf.addr);\n    }\n\n    //AT_LOG(\"wwww write data,qid %d, len %ld, ret %d\", at.linkid[link_id].qid, qbuf.len, ret);\n\n\n    return AT_OK;\n}\n\nstatic void nb_close_sock(int sock)\n{\n    const char *cmd = \"AT+NSOCL=\";\n    char buf[64];\n    int cmd_len;\n\n\tcmd_len = snprintf(buf, sizeof(buf), \"%s%d\\r\", cmd, sock);\n\tnb_cmd_with_2_suffix((int8_t*)buf, cmd_len, \"OK\", \"ERROR\", NULL,NULL);\n}\n\n\nstatic int nb_create_sock_link(int portnum, int *link_id)\n{\n    int ret = 0;\n    int sock;\n\n    sock = nb_create_sock(portnum, UDP_PROTO);\n\tif(sock < 0)\n\t{\n\t\tAT_LOG(\"sock num exceeded,ret is %d\", sock);\n\t\treturn AT_FAILED;\n\t}\n\n    ret = nb_alloc_sock(sock);\n    if (ret >= MAX_SOCK_NUM)\n\t{\n\n        AT_LOG(\"sock num exceeded,socket is %d\", sock);\n        goto CLOSE_SOCk;\n    }\n\n    if (LOS_QueueCreate(\"dataQueue\", 16, &at.linkid[ret].qid, 0, sizeof(QUEUE_BUFF)) != LOS_OK)\n    {\n        AT_LOG(\"init dataQueue failed, ret is %d!\",ret);\n        goto CLOSE_SOCk;\n    }\n\n    *link_id = ret;\n    sockinfo[ret].socket = sock;\n    sockinfo[ret].used_flag = true;\n    return AT_OK;\n\nCLOSE_SOCk:\n    nb_close_sock(sock);\n\n    return AT_FAILED;\n\n}\n\nint32_t nb_bind(const int8_t * host, const int8_t *port, int32_t proto)\n{\n\tint ret = 0;\n\tint portnum;\n\n    (void)host;\n    (void)proto;\n\tportnum = chartoint((char*)port);\n\n    if (nb_create_sock_link(portnum, &ret) != AT_OK)\n    {\n        return AT_FAILED;\n    }\n\n    sockinfo[ret].localport = *(unsigned short*)portnum;\n\n    return AT_OK;\n}\n\nint32_t nb_connect(const int8_t * host, const int8_t *port, int32_t proto)\n{\n\tint ret = 0;\n\tstatic uint16_t localport = NB_STAT_LOCALPORT;\n    const int COAP_SEVER_PORT = 5683;\n\n    if (nb_create_sock_link(localport, &ret) != AT_OK)\n    {\n        return AT_FAILED;\n    }\n\n\tlocalport++;\n    if (localport == COAP_SEVER_PORT || localport == (COAP_SEVER_PORT + 1))\n    {\n        localport = 5685;\n    }\n\n\tstrncpy(sockinfo[ret].remoteip, (const char *)host, sizeof(sockinfo[ret].remoteip));\n    sockinfo[ret].remoteip[sizeof(sockinfo[ret].remoteip) - 1] = '\\0';\n\tsockinfo[ret].remoteport = chartoint((char*)port);\n\n    AT_LOG(\"ret:%d remoteip:%s port:%d\",ret,sockinfo[ret].remoteip,sockinfo[ret].remoteport);\n\n    return ret;\n\n}\n\n\nint32_t nb_sendto(int32_t id , const uint8_t  *buf, uint32_t len, char* ipaddr, int port)\n{\n\tchar *cmd = \"AT+NSOST=\";\n\tint data_len = len/2;\n    int cmd_len;\n\n    if(buf == NULL || data_len > AT_MAX_PAYLOADLEN || id >= MAX_SOCK_NUM)\n    {\n        AT_LOG(\"invalid args\");\n        return -1;\n    }\n\n    AT_LOG(\"id:%d remoteip:%s port:%d\",(int)sockinfo[id].socket, ipaddr, port);\n\tmemset(wbuf, 0, AT_DATA_LEN);\n\tmemset(tmpbuf, 0, AT_DATA_LEN);\n\tstr_to_hex((const char *)buf, len, tmpbuf);\n\n\tcmd_len = snprintf(wbuf, AT_DATA_LEN, \"%s%d,%s,%d,%d,%s\\r\",cmd,(int)sockinfo[id].socket,\n        ipaddr, port, (int)len, tmpbuf);\n\n\n\tif (nb_cmd_with_2_suffix((int8_t*)wbuf, cmd_len, \"OK\", \"ERROR\",\n                NULL, NULL) != AT_OK)\n    {\n        return AT_FAILED;\n    }\n\n    return len;\n}\n\n\nint32_t nb_send(int32_t id , const uint8_t *buf, uint32_t len)\n{\n\tif (id >= MAX_SOCK_NUM)\n    {\n        AT_LOG(\"invalid args\");\n        return AT_FAILED;\n    }\n    return nb_sendto(id , buf, len, sockinfo[id].remoteip,(int)sockinfo[id].remoteport);\n}\n\nint32_t nb_recv(int32_t id , uint8_t  *buf, uint32_t len)\n{\n    return nb_recv_timeout(id, buf, len,NULL,NULL, LOS_WAIT_FOREVER);\n}\n\nint32_t nb_recvfrom(int32_t id , uint8_t  *buf, uint32_t len,char* ipaddr,int* port)\n{\n    return nb_recv_timeout(id, buf, len, ipaddr,port,LOS_WAIT_FOREVER);\n}\n\nint32_t nb_recv_timeout(int32_t id , uint8_t  *buf, uint32_t len,char* ipaddr,int* port, int32_t timeout)\n{\n    int rlen = 0;\n    int ret;\n    QUEUE_BUFF\tqbuf;\n    UINT32 qlen = sizeof(QUEUE_BUFF);\n\n    if (id  >= MAX_SOCK_NUM)\n    {\n        AT_LOG(\"link id %ld invalid\", id);\n        return AT_FAILED;\n    }\n\n\n    ret = LOS_QueueReadCopy(at.linkid[id].qid, &qbuf, &qlen, timeout);\n    //AT_LOG(\"wwww LOS_QueueReadCopy data,qid %d, len %ld, ret %d\", at.linkid[id].qid, qbuf.len, ret);\n    if (ret != LOS_OK)\n    {\n        return AT_TIMEOUT;\n    }\n\n\n    if (('\\0' == sockinfo[id].remoteip[0])\n        || (0 == sockinfo[id].remoteport))\n    {\n        AT_LOG(\"update ip and port for link %ld\", id);\n        strncpy(sockinfo[id].remoteip, qbuf.ipaddr, sizeof(sockinfo[id].remoteip));\n        sockinfo[id].remoteip[sizeof(sockinfo[id].remoteip) - 1] = '\\0';\n        sockinfo[id].remoteport = qbuf.port;\n    }\n\n\tif(ipaddr != NULL)\n\t{\n\t    memcpy(ipaddr,qbuf.ipaddr,strlen(qbuf.ipaddr));\n        *port = qbuf.port;\n\t}\n\n    rlen = MIN(qbuf.len, len);\n\n    //AT_LOG(\"recv data, %d\", rlen);\n\n    if (rlen){\n        memcpy(buf, qbuf.addr, rlen);\n        at_free(qbuf.addr);\n    }\n    return rlen;\n\n}\n\n\nint32_t nb_close(int32_t id)\n{\n    int ret;\n\n    if ((id  >= MAX_SOCK_NUM)\n        || (!sockinfo[id].used_flag))\n    {\n        AT_LOG(\"link id %ld invalid\", id);\n        return AT_FAILED;\n    }\n\n    nb_close_sock(sockinfo[id].socket);\n\n    do\n    {\n        QUEUE_BUFF\tqbuf = {0};\n        UINT32 qlen = sizeof(QUEUE_BUFF);\n        ret = LOS_QueueReadCopy(at.linkid[id].qid, &qbuf, &qlen, 0);\n        if (ret == LOS_OK && qbuf.addr != NULL)\n        {\n            at_free(qbuf.addr);\n        }\n    }while(ret == LOS_OK);\n    ret = LOS_QueueDelete(at.linkid[id].qid);\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"LOS_QueueDelete failed, ret is %d!,qid %d\", ret, at.linkid[id].qid);\n    }\n    (void)memset(&sockinfo[id], 0, sizeof(sockinfo[id]));\n\n    return AT_OK;\n}\n\nint32_t nb_recv_cb(int32_t id)\n{\n    return AT_FAILED;\n}\n\nstatic int32_t nb_init(void)\n{\n    at_config at_user_conf = {\n        .name = AT_MODU_NAME,\n        .usart_port = AT_USART_PORT,\n        .buardrate = AT_BUARDRATE,\n        .linkid_num = AT_MAX_LINK_NUM,\n        .user_buf_len = MAX_AT_USERDATA_LEN,\n        .cmd_begin = AT_CMD_BEGIN,\n        .line_end = AT_LINE_END,\n        .mux_mode = 1, //support multi connection mode\n        .timeout = AT_CMD_TIMEOUT,   //  ms\n    };\n    \n    at_set_config(&at_user_conf);\n    memset(&sockinfo, 0, sizeof(sockinfo));\n    memset(&g_data_ind_info, 0, sizeof(g_data_ind_info));\n    at_reg_step_callback(&at, nb_step);\n\n    return AT_OK;\n}\n\nint32_t nb_deinit(void)\n{\n\n    for (int i = 0; i < MAX_SOCK_NUM; ++i)\n    {\n        if (sockinfo[i].used_flag)\n        {\n            nb_close(i);\n        }\n    }\n    return nb_reboot();\n}\n\nat_adaptor_api bc95_interface =\n{\n    .init = nb_init,\n\n    .bind = nb_bind,\n\n    .connect = nb_connect,\n    .send = nb_send,\n    .sendto = nb_sendto,\n\n    .recv_timeout = nb_recv_timeout,\n    .recv = nb_recv,\n    .recvfrom = nb_recvfrom,\n\n    .close = nb_close,\n    .recv_cb = nb_recv_cb,\n\n    .deinit = nb_deinit,\n};\n\nvoid nb_reattach(void)\n{\n    (void)nb_cmd_with_2_suffix((int8_t*)CGATT, strlen(CGATT), \"OK\", \"ERROR\", NULL, NULL);\n     (void)nb_cmd_with_2_suffix((int8_t*)CGATT_DEATTACH, strlen(CGATT_DEATTACH), \"OK\", \"ERROR\", NULL, NULL);\n     LOS_TaskDelay(1000);\n     (void)nb_cmd_with_2_suffix((int8_t*)CGATT_ATTACH, strlen(CGATT_ATTACH), \"OK\", \"ERROR\", NULL, NULL);\n}\n\nstatic int nb_cmd_rcv_data(int sockid, int readleft);\n\n\nstatic int32_t nb_handle_sock_data(const int8_t *data, uint32_t len)\n{\n    (void) len;\n    char *curr = (char *)data;\n\n    if (strstr((char *) data, \"ERROR\") != NULL)\n    {\n        return AT_OK;\n    }\n\n    do\n    {\n\n        int readleft;\n        int sockid;\n\n        char *next = strstr(curr, \"\\r\\n\");\n\n        if (next == curr)\n        {\n            curr += 2;\n        }\n\n        if (next != NULL)\n        {\n            next += 2;\n        }\n\n        if (nb_decompose_str(curr, &readleft, &sockid) == AT_OK)\n        {\n        /*\n            if (readleft != 0)\n            {\n                nb_cmd_rcv_data(sockid, readleft);\n            }*/\n            return AT_OK;\n        }\n        curr = next;\n    }while(curr);\n\n    return AT_FAILED;\n}\n\n\nstatic int nb_cmd_rcv_data(int sockid, int readleft)\n{\n    int cmdlen;\n    char cmdbuf[40];\n    const char* cmd = \"AT+NSORF=\";\n    const uint32_t timeout = 10;\n\n    cmdlen = snprintf(cmdbuf, sizeof(cmdbuf), \"%s%d,%d\\r\", cmd, sockid, readleft);\n    return at_cmd_in_callback((int8_t*)cmdbuf, cmdlen, nb_handle_sock_data, timeout);\n}\n\nstatic int32_t nb_handle_data_ind(const char *buf)\n{\n    int32_t sockid;\n    int32_t data_len;\n    const char *p1, *p2;\n    int link_idx;\n\n    p2 = strstr(buf, AT_DATAF_PREFIX);\n    if (NULL == p2)\n    {\n        return AT_FAILED;\n    }\n    p2+=strlen(AT_DATAF_PREFIX);\n\n    p1 = strstr(p2, \",\");\n    if (p1 == NULL)\n    {\n        return AT_FAILED;\n    }\n    sockid = chartoint(p2);\n    data_len = chartoint(p1 + 1);\n    link_idx = nb_sock_to_idx(sockid);\n    if (link_idx >= MAX_SOCK_NUM)\n    {\n        AT_LOG(\"invalid sock id %ld\", sockid);\n\n\n        return AT_OK;\n    }\n\n    if (nb_cmd_rcv_data(sockid, data_len) != AT_OK)\n    {\n        g_data_ind_info.data_len = (uint32_t)data_len;\n        g_data_ind_info.link_idx = link_idx;\n        g_data_ind_info.valid_flag = true;\n    }\n    else\n    {\n        g_data_ind_info.valid_flag = false;\n    }\n\n    return AT_OK;\n\n}\n\n\nint32_t nb_cmd_match(const char *buf, char* featurestr,int len)\n{\n    if (buf == NULL)\n    {\n        return AT_FAILED;\n    }\n\n    nb_handle_data_ind(buf);\n\n    return AT_FAILED;\n}\n\nvoid nb_step(void)\n{\n    if ((!g_data_ind_info.valid_flag)\n        || (!sockinfo[g_data_ind_info.link_idx].used_flag))\n    {\n        return;\n    }\n    if (nb_cmd_rcv_data(sockinfo[g_data_ind_info.link_idx].socket, g_data_ind_info.data_len) == AT_OK)\n    {\n        g_data_ind_info.valid_flag = false;\n    }\n}\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/at_device/wifi_esp8266/esp8266.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#if defined(WITH_AT_FRAMEWORK)\n#include \"esp8266.h\"\n\nextern at_task at;\n\n\nint esp8266_cmd(int8_t *cmd, int32_t len, const char *suffix, char *resp_buf, int* resp_len)\n{\n\treturn at.cmd(cmd, len, suffix, resp_buf, resp_len);\n}\n\nint32_t esp8266_echo_off(void)\n{\n    return esp8266_cmd((int8_t *)AT_CMD_ECHO_OFF, strlen(AT_CMD_ECHO_OFF), \"OK\\r\\n\", NULL, NULL);\n}\n\nint32_t esp8266_reset(void)\n{\n    return esp8266_cmd((int8_t *)AT_CMD_RST, strlen(AT_CMD_RST), \"ready\\r\\n\", NULL, NULL);\n}\n\nint32_t esp8266_choose_net_mode(enum_net_mode m)\n{\n    char cmd[64] = {0};\n    snprintf(cmd, 64, \"%s=%d\", AT_CMD_CWMODE, (int)m);\n    return esp8266_cmd((int8_t *)cmd, strlen(cmd), \"OK\\r\\n\", NULL, NULL);\n}\n\nint32_t esp8266_set_mux_mode(int32_t m)\n{\n    char cmd[64] = {0};\n    snprintf(cmd, 64, \"%s=%d\", AT_CMD_MUX, (int)m);\n    return esp8266_cmd((int8_t *)cmd, strlen(cmd), \"OK\\r\\n\", NULL, NULL);\n}\nint32_t esp8266_joinap(char *pssid, char *ppasswd)\n{\n    char cmd[64] = {0};\n    snprintf(cmd, 64, \"%s=\\\"%s\\\",\\\"%s\\\"\", AT_CMD_JOINAP, pssid, ppasswd);\n    return esp8266_cmd((int8_t *)cmd, strlen(cmd), \"OK\\r\\n\", NULL, NULL);\n}\n\nint32_t esp8266_connect(const int8_t *host, const int8_t *port, int32_t proto)\n{\n    int32_t ret = AT_FAILED;\n    int32_t id = 0;\n    char cmd[64] = {0};\n\n    AT_LOG(\"host:%s, port:%s\", host, port);\n\n    if (AT_MUXMODE_SINGLE == at.mux_mode)\n    {\n        snprintf(cmd, 64, \"%s=\\\"%s\\\",\\\"%s\\\",%s\", AT_CMD_CONN, proto == ATINY_PROTO_UDP ? \"UDP\" : \"TCP\", host, port);\n    }\n    else\n    {\n        id = at.get_id();\n        if (id < 0 || id >= AT_MAX_LINK_NUM)\n        {\n            AT_LOG(\"no vailed linkid for use(id = %ld)\", id);\n            return AT_FAILED;\n        }\n        snprintf(cmd, 64, \"%s=%ld,\\\"%s\\\",\\\"%s\\\",%s\", AT_CMD_CONN, id, proto == ATINY_PROTO_UDP ? \"UDP\" : \"TCP\", host, port);\n    }\n\n    //init at_link\n    memcpy(at.linkid[id].remote_ip, host, sizeof(at.linkid[id].remote_ip));\n    (void)sscanf((char*)port, \"%d\", &at.linkid[id].remote_port);\n\n    ret = LOS_QueueCreate(\"dataQueue\", 16, &at.linkid[id].qid, 0, sizeof(QUEUE_BUFF));\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"init dataQueue failed!\");\n        at.linkid[id].usable = AT_LINK_UNUSE;\n        return AT_FAILED;\n    }\n    ret = esp8266_cmd((int8_t *)cmd, strlen(cmd), \"OK\\r\\n\", NULL, NULL);\n    if (AT_FAILED == ret)\n    {\n        AT_LOG(\"at.cmd return failed!\");\n       (void)LOS_QueueDelete(at.linkid[id].qid);\n        at.linkid[id].usable = AT_LINK_UNUSE;\n        return AT_FAILED;\n    }\n    return id;\n}\n\nint32_t esp8266_send(int32_t id , const uint8_t  *buf, uint32_t len)\n{\n    int32_t ret = AT_FAILED;\n    char cmd[64] = {0};\n    if (AT_MUXMODE_SINGLE == at.mux_mode)\n    {\n        snprintf(cmd, 64, \"%s=%lu,\\\"%s\\\",%d\", AT_CMD_SEND, len,at.linkid[0].remote_ip, at.linkid[0].remote_port);\n    }\n    else\n    {\n        snprintf(cmd, 64, \"%s=%ld,%lu,\\\"%s\\\",%d\", AT_CMD_SEND, id, len,at.linkid[id].remote_ip, at.linkid[id].remote_port);\n    }\n\n    //   at.cmd(cmd, strlen(cmd), \">\", NULL);\n    ret = at.write((int8_t *)cmd, (int8_t *)\"SEND OK\\r\\n\", (int8_t *)buf, len);\n\n    return ret;\n}\n\nint32_t esp8266_recv_timeout(int32_t id, uint8_t *buf, uint32_t len, char * host, int * port, int32_t timeout)\n{\n    uint32_t qlen = sizeof(QUEUE_BUFF);\n    uint32_t rxlen = 0;\n\n    QUEUE_BUFF  qbuf = {0, NULL};\n    int ret = LOS_QueueReadCopy(at.linkid[id].qid, (void *)&qbuf, (UINT32 *)&qlen, timeout);\n//    AT_LOG(\"ret = %x, len = %ld, id = %ld, timeout = %d\", ret, qbuf.len, id, timeout);\n    if (ret != LOS_OK)\n    {\n        return AT_FAILED;\n    }\n\n    if (qbuf.len)\n    {\n        rxlen = (len < qbuf.len) ? len : qbuf.len;\n        memcpy(buf, qbuf.addr, rxlen);\n        at_free(qbuf.addr);\n    }\n    return rxlen;\n}\n\nint32_t esp8266_recv(int32_t id, uint8_t *buf, uint32_t len)\n{\n    return esp8266_recv_timeout(id, buf, len, NULL, NULL, LOS_WAIT_FOREVER);\n}\n\nint32_t esp8266_close(int32_t id)\n{\n    char cmd[64] = {0};\n\n    if(at.linkid[id].usable == AT_LINK_UNUSE)\n        return 0;\n\n    if (AT_MUXMODE_SINGLE == at.mux_mode)\n    {\n        snprintf(cmd, 64, \"%s\", AT_CMD_CLOSE);\n    }\n    else\n    {\n        uint32_t qlen = sizeof(QUEUE_BUFF);\n        QUEUE_BUFF  qbuf = {0, NULL};\n        while(LOS_OK == LOS_QueueReadCopy(at.linkid[id].qid, (void *)&qbuf, (UINT32 *)&qlen, 10))\n        {\n            if (qbuf.len)\n            {\n                at_free(qbuf.addr);\n                memset(&qbuf, 0, sizeof(QUEUE_BUFF)); // don't use qlen\n            }\n        }\n        (void)LOS_QueueDelete(at.linkid[id].qid);\n        memset(&at.linkid[id], 0, sizeof(at_link));\n        snprintf(cmd, 64, \"%s=%ld\", AT_CMD_CLOSE, id);\n    }\n    return esp8266_cmd((int8_t *)cmd, strlen(cmd), \"OK\\r\\n\", NULL, NULL);\n}\n\nint32_t esp8266_data_handler(void *arg, int8_t *buf, int32_t len)\n{\n    if (NULL == buf || len <= 0)\n    {\n        AT_LOG(\"param invailed!\");\n        return AT_FAILED;\n    }\n    AT_LOG(\"entry!\");\n\n    //process data frame ,like +IPD,linkid,len:data\n    int32_t ret = -1;\n    int32_t linkid = 0, data_len = 0;\n    int32_t remote_port = 0;\n    char * remote_ip;\n    char *p1, *p2;\n    QUEUE_BUFF qbuf;\n    p1 = (char *)buf;\n\nLOOP:\n    if (0 == memcmp(p1, AT_DATAF_PREFIX, strlen(AT_DATAF_PREFIX)))\n    {\n        p2 = strstr(p1, \",\");\n        if (NULL == p2)\n        {\n            AT_LOG(\"got data prefix invailed!\");\n            goto END;\n        }\n\n        if (AT_MUXMODE_MULTI == at.mux_mode)\n        {\n            linkid = 0;\n            for (p2++; *p2 <= '9' && *p2 >= '0'; p2++)\n            {\n                linkid = linkid * 10 + (*p2 - '0');\n            }\n        }\n\n        data_len = 0;\n        for (p2++; *p2 <= '9' && *p2 >= '0' ; p2++)\n        {\n            data_len = (data_len * 10 + (*p2 - '0'));\n        }\n\n        //remote ip:str\n        remote_ip = (char *)at.linkid[linkid].remote_ip;\n        for (p2++; *p2 != ',' ; p2++)\n        {\n            *(remote_ip++) = *p2;\n        }\n\n        //remote port\n        remote_port = 0;\n        for (p2++; *p2 <= '9' && *p2 >= '0' ; p2++)\n        {\n            remote_port = (remote_port * 10 + (*p2 - '0'));\n        }\n        at.linkid[linkid].remote_port = remote_port;\n\n        p2++; //over ':'\n\n        qbuf.addr = at_malloc(data_len);\n        if (NULL == qbuf.addr)\n        {\n            AT_LOG(\"malloc for qbuf failed!\");\n            goto END;\n        }\n\n        qbuf.len = data_len;\n        memcpy(qbuf.addr, p2, data_len);\n\n        if (LOS_OK != (ret = LOS_QueueWriteCopy(at.linkid[linkid].qid, &qbuf, sizeof(QUEUE_BUFF), 0)))\n        {\n            AT_LOG(\"LOS_QueueWriteCopy  failed! ret = %lx\", ret);\n            at_free(qbuf.addr);\n            goto END;\n        }\n        p1  = (p2 + data_len);\n\n        if ((p1 - (char*)buf) < len)\n            goto LOOP;\n    }\nEND:\n    return 0;\n}\n\nint8_t esp8266_get_localip(int8_t *ip, int8_t *gw, int8_t *mask)   /*get local IP*/\n{\n    char resp[512] = {0};\n    int len = 512;\n    esp8266_cmd((int8_t *)AT_CMD_CHECK_IP, strlen((char *)AT_CMD_CHECK_IP), \"OK\", resp, &len);\n\n    AT_LOG(\"resp:%s\", resp);\n    char *p1, *p2;\n    p1 = strstr(resp, \"ip\");\n    if (ip && p1)\n    {\n        p1 = strstr(p1, \"\\\"\");\n        p2 = strstr(p1 + 1, \"\\\"\");\n        memcpy(ip, p1 + 1, p2 - p1 - 1);\n    }\n\n    p1 = strstr(resp, \"gateway\");\n    if (gw && p1)\n    {\n        p1 = strstr(p1, \"\\\"\");\n        p2 = strstr(p1 + 1, \"\\\"\");\n        memcpy(gw, p1 + 1, p2 - p1 - 1);\n    }\n\n    p1 = strstr(resp, \"netmask\");\n    if (mask && p1)\n    {\n        p1 = strstr(p1, \"\\\"\");\n        p2 = strstr(p1 + 1, \"\\\"\");\n        memcpy(mask, p1 + 1, p2 - p1 - 1);\n    }\n\n    //    printf(\"get ip :%s\", resp);\n    return AT_OK;\n}\n\nint8_t esp8266_get_localmac(int8_t *mac) /*get local mac*/\n{\n    char resp[512] = {0};\n    char *p1, *p2;\n    int len = 512;\n\n    esp8266_cmd((int8_t *)AT_CMD_CHECK_MAC, strlen((char *)AT_CMD_CHECK_MAC), \"OK\", resp, &len);\n    AT_LOG(\"resp:%s\", resp);\n\n    p1 = strstr(resp, \":\");\n    if (mac && p1)\n    {\n        p1 = strstr(p1, \"\\\"\");\n        p2 = strstr(p1 + 1, \"\\\"\");\n        memcpy(mac, p1 + 1, p2 - p1 - 1);\n    }\n\n\n    //    printf(\"get ip :%s\", resp);\n    return AT_OK;\n}\n\nint32_t esp8266_bind(const int8_t *host, const int8_t *port, int32_t proto)\n{\n\tint ret = AT_FAILED;\n\tint port_i = 0;\n\tchar cmd[64] = {0};\n\n\t(void)sscanf((char *)port, \"%d\", &port_i);\n\tAT_LOG(\"get port = %d\\r\\n\", port_i);\n\n\tif (at.mux_mode != AT_MUXMODE_MULTI)\n\t{\n\t\tAT_LOG(\"Only support in multi mode!\\r\\n\");\n\t\treturn -1;\n\t}\n\n\tint id = at.get_id();\n    ret = LOS_QueueCreate(\"dataQueue\", 16, &at.linkid[id].qid, 0, sizeof(QUEUE_BUFF));\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"init dataQueue failed!\");\n        at.linkid[id].usable = AT_LINK_UNUSE;\n        return AT_FAILED;\n    }\n\n\tsnprintf(cmd, 64, \"%s=%d,\\\"%s\\\",\\\"0.0.0.0\\\",0,%d,0\", AT_CMD_CONN, id, proto == ATINY_PROTO_UDP ? \"UDP\" : \"TCP\", port_i);\n\n\tesp8266_cmd((int8_t *)cmd, strlen(cmd), \"OK\\r\\n\", NULL, NULL);\n\treturn id;\n}\nint32_t esp8266_recv_cb(int32_t id)\n{\n    return AT_FAILED;\n}\n\nint32_t esp8266_deinit(void)\n{\n    int id = 0;\n\n    if(NULL != at.linkid)\n    {\n        for(id = 0; id < AT_MAX_LINK_NUM; id++)\n        {\n            if(AT_LINK_INUSE == at.linkid[id].usable)\n            {\n                if(AT_OK != esp8266_close(id))\n                {\n                    AT_LOG(\"esp8266_close(%d) failed\", id);\n                }\n            }\n        }\n    }\n\n    at.deinit();\n    return AT_OK;\n}\n\nint32_t esp8266_show_dinfo(int32_t s)\n{\n    char cmd[64] = {0};\n    snprintf(cmd, 64, \"%s=%ld\", AT_CMD_SHOW_DINFO, s);\n    return esp8266_cmd((int8_t *)cmd, strlen(cmd), \"OK\\r\\n\", NULL, NULL);\n}\n\nint32_t esp8266_cmd_match(const char *buf, char* featurestr,int len)\n{\n    return memcmp(buf,featurestr,len);\n}\n\nint32_t esp8266_init()\n{\n    at_config at_user_conf =\n    {\n        .name = AT_MODU_NAME,\n        .usart_port = AT_USART_PORT,\n        .buardrate = AT_BUARDRATE,\n        .linkid_num = AT_MAX_LINK_NUM,\n        .user_buf_len = MAX_AT_USERDATA_LEN,\n        .cmd_begin = AT_CMD_BEGIN,\n        .line_end = AT_LINE_END,\n        .mux_mode = 1, //support multi connection mode\n        .timeout = AT_CMD_TIMEOUT,   //  ms\n\n    };\n    at.init(&at_user_conf);\n    //at.add_listener((int8_t*)AT_DATAF_PREFIX, NULL, esp8266_data_handler);\n    at.oob_register(AT_DATAF_PREFIX, strlen(AT_DATAF_PREFIX), esp8266_data_handler, esp8266_cmd_match);\n\n    esp8266_reset();\n    esp8266_echo_off();\n    esp8266_show_dinfo(1);\n\n    esp8266_choose_net_mode(STA);\n    while(AT_FAILED == esp8266_joinap(WIFI_SSID, WIFI_PASSWD))\n    {\n        AT_LOG(\"connect ap failed, repeat...\");\n    };\n    esp8266_set_mux_mode(at.mux_mode);\n\n    static int8_t ip[32];\n    static int8_t gw[32];\n    static int8_t mac[32];\n    esp8266_get_localip(ip, gw, NULL);\n    esp8266_get_localmac(mac);\n    AT_LOG_DEBUG(\"get ip:%s, gw:%s mac:%s\", ip, gw, mac);\n    return AT_OK;\n}\n\n\n\nat_adaptor_api esp8266_interface =\n{\n\n    .init = esp8266_init,\n    .get_localmac = esp8266_get_localmac, /*get local MAC*/\n    .get_localip = esp8266_get_localip,/*get local IP*/\n    /*build TCP or UDP connection*/\n    .connect = esp8266_connect,\n    .bind = esp8266_bind,\n    .send = esp8266_send,\n\n    .recv_timeout = esp8266_recv_timeout,\n    .recv = esp8266_recv,\n\n    .close = esp8266_close,/*close connection*/\n    .recv_cb = esp8266_recv_cb,/* operation for events, not implements yet */\n\n    .deinit = esp8266_deinit,\n};\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/at_device/wifi_esp8266/esp8266.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#ifndef __ESP8266_H__\n#define __ESP8266_H__\n\n#include \"at_frame/at_main.h\"\n\n#define WIFI_SSID      \t\t\"APAP1234\"\n#define WIFI_PASSWD    \t\t\"87654321\"\n\n#define AT_MODU_NAME    \t\"ESP8266\"\n#define AT_USART_PORT   \t3\n#define AT_BUARDRATE   \t\t115200\n#define AT_CMD_TIMEOUT\t\t10000    //ms\n#define AT_MAX_LINK_NUM     4\n\n#define AT_LINE_END \t\t\"\\r\\n\"\n#define AT_CMD_BEGIN\t\t\"\\r\\n\"\n\n\n#define MAX_AT_USERDATA_LEN (1024*5)\n\n\n#define AT_CMD_RST    \t\t\"AT+RST\"\n#define AT_CMD_ECHO_OFF \t\"ATE0\"\n#define AT_CMD_CWMODE  \t\t\"AT+CWMODE_CUR\"\n#define AT_CMD_JOINAP  \t\t\"AT+CWJAP_CUR\"\n#define AT_CMD_MUX \t\t\t\"AT+CIPMUX\"\n#define AT_CMD_CONN\t\t\t\"AT+CIPSTART\"\n#define AT_CMD_SEND\t\t\t\"AT+CIPSEND\"\n#define AT_CMD_CLOSE\t\t\"AT+CIPCLOSE\"\n#define AT_CMD_CHECK_IP\t\t\"AT+CIPSTA_CUR?\"\n#define AT_CMD_CHECK_MAC\t\"AT+CIPSTAMAC_CUR?\"\n#define AT_CMD_SHOW_DINFO   \"AT+CIPDINFO\"\n\n#define AT_DATAF_PREFIX      \"\\r\\n+IPD\"\n\ntypedef enum {\n\tSTA = 1,\n\tAP, \n\tATA_AP,\n}enum_net_mode;\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/at_frame/at_api.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#if defined(WITH_AT_FRAMEWORK)\n#include \"at_frame/at_api.h\"\n\nstatic at_adaptor_api  *gp_at_adaptor_api = NULL;\n\nint32_t at_api_register(at_adaptor_api *api)\n{\n    if (NULL == gp_at_adaptor_api)\n    {\n        gp_at_adaptor_api = api;\n        if (gp_at_adaptor_api && gp_at_adaptor_api->init)\n        {\n            return gp_at_adaptor_api->init();\n        }\n    }\n\n    return 0;\n}\n\nint32_t at_api_bind(const char *host, const char *port, int proto)\n{\n    int32_t ret = -1;\n\n    if (gp_at_adaptor_api && gp_at_adaptor_api->bind)\n    {\n        ret = gp_at_adaptor_api->bind((int8_t *)host, (int8_t *)port, proto);\n    }\n    return ret;\n}\n\nint32_t at_api_connect(const char *host, const char *port, int proto)\n{\n    int32_t ret = -1;\n\n    if (gp_at_adaptor_api && gp_at_adaptor_api->connect)\n    {\n        ret = gp_at_adaptor_api->connect((int8_t *)host, (int8_t *)port, proto);\n    }\n    return ret;\n}\n\nint32_t at_api_send(int32_t id , const unsigned char *buf, uint32_t len)\n{\n    if (gp_at_adaptor_api && gp_at_adaptor_api->send)\n    {\n        return gp_at_adaptor_api->send(id, buf, len);\n    }\n    return -1;\n}\n\nint32_t at_api_sendto(int32_t id , uint8_t  *buf, uint32_t len,char* ipaddr,int port)\n{\n    if (gp_at_adaptor_api && gp_at_adaptor_api->sendto)\n    {\n        return gp_at_adaptor_api->sendto(id, buf, len,ipaddr, port);\n    }\n    return -1;\n}\n\nint32_t at_api_recv(int32_t id, unsigned char *buf, size_t len)\n{\n    if (gp_at_adaptor_api && gp_at_adaptor_api->recv)\n    {\n        return gp_at_adaptor_api->recv(id, buf, len);\n    }\n    return -1;\n}\n\nint32_t at_api_recv_timeout(int32_t id , uint8_t  *buf, uint32_t len,char* ipaddr,int* port, int32_t timeout)\n{\n    if (gp_at_adaptor_api && gp_at_adaptor_api->recv_timeout)\n    {\n        return gp_at_adaptor_api->recv_timeout(id , buf, len, ipaddr, port, timeout);\n    }\n    return -1;\n}\n\nint32_t at_api_close(int32_t fd)\n{\n    if (gp_at_adaptor_api && gp_at_adaptor_api->close)\n    {\n        return gp_at_adaptor_api->close(fd);\n    }\n    return -1;\n}\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/at_frame/at_main.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#if defined(WITH_AT_FRAMEWORK)\n\n#include \"los_memory.h\"\n#include \"at_frame/at_main.h\"\n#include \"at_hal.h\"\n#ifdef WITH_SOTA\n#include \"sota/sota.h\"\n#endif\n#include \"los_sys.ph\"\n#include \"los_tick.ph\"\n\nstatic at_config at_user_conf;\n\n/* FUNCTION */\nvoid at_set_config(at_config *config);\nat_config *at_get_config(void);\n\nint32_t at_init(at_config *config);\n//int32_t at_read(int32_t id, int8_t * buf, uint32_t len, int32_t timeout);\nint32_t at_write(int8_t *cmd, int8_t *suffix, int8_t *buf, int32_t len);\nint32_t at_get_unuse_linkid(void);\nvoid at_listener_list_add(at_listener *p);\nvoid at_listner_list_del(at_listener *p);\nint32_t at_cmd(int8_t *cmd, int32_t len, const char *suffix, char *resp_buf, int* resp_len);\nint32_t at_oob_register(char *featurestr, int cmdlen, oob_callback callback, oob_cmd_match cmd_match);\n\nvoid at_deinit(void);\n//init function for at struct\n\nat_oob_t at_oob;\nchar rbuf[AT_DATA_LEN] = {0};\nchar wbuf[AT_DATA_LEN] = {0};\n\nuint32_t at_get_time(void)\n{\n    return ((uint32_t)(LOS_TickCountGet()* (OS_SYS_MS_PER_SECOND / LOSCFG_BASE_CORE_TICK_PER_SECOND)) )/ 1000;\n}\n\n\nint chartoint(const char* port)\n{\n\tint tmp=0;\n\twhile(*port >= '0' && *port <= '9')\n\t{\n\t\ttmp = tmp*10+*port-'0';\n\t\tport++;\n\t}\n\treturn tmp;\n}\n\n//add p to tail;\nvoid at_listener_list_add(at_listener *p)\n{\n\n    at_listener *head = at.head;\n    at_listener *cur;\n\n    //AT_LOG(\"www add listener %p, callback %p\", p, p->handle_data);\n\n    p->next = NULL;\n    if (NULL == head)\n    {\n        at.head = p;\n        return;\n    }\n\n    cur = head;\n    while(cur->next)\n    {\n        cur = cur->next;\n    }\n\n    cur->next = p;\n }\n\nvoid at_listner_list_del(at_listener *p)\n{\n    at_listener *head = at.head;\n    at_listener *cur;\n\n    //AT_LOG(\"www del listener %p callback  %p\", p, p->handle_data);\n    if (p == head)\n    {\n        at.head = head->next;\n        return;\n    }\n\n\n    cur = head;\n    while(cur->next)\n    {\n        if (cur->next == p)\n        {\n            cur->next = p->next;\n            break;\n        }\n    }\n}\n\nvoid at_listner_list_destroy(at_task *at_tsk)\n{\n    at_listener *head;\n    while(at_tsk->head != NULL)\n    {\n        head = at_tsk->head;\n        at_tsk->head = head->next;\n        if (head->handle_data != NULL)\n        {\n            at_free(head);\n        }\n    }\n}\n\n\nstatic void at_rm_node(at_listener *listener, at_listener *pre)\n{\n    //AT_LOG(\"www del listener %p callback %p\", listener, listener->handle_data);\n    if (at.head == listener)\n    {\n        at.head = listener->next;\n    }\n    else\n    {\n        if (pre)\n        {\n            pre->next = listener->next;\n        }\n    }\n    at_free(listener);\n\n    LOS_MuxPost(at.trx_mux);\n}\n\nstatic void at_rm_timeout_nodes()\n{\n    at_listener *pre = NULL;\n    at_listener *next = NULL;\n\n    for (at_listener *listener = at.head; listener != NULL;  listener = next)\n    {\n        next = listener->next;\n\n        if (listener->handle_data == NULL)\n        {\n            pre = listener;\n            continue;\n        }\n\n        if (listener->expire_time <= at_get_time())\n        {\n            AT_LOG(\"get recv data timeout\");\n            at_rm_node(listener, pre);\n        }\n        else\n        {\n            pre = listener;\n        }\n    }\n\n}\n\n\nint32_t at_get_unuse_linkid(void)\n{\n    int i = 0;\n\n    if (AT_MUXMODE_MULTI == at.mux_mode)\n    {\n        for (i = 0; i < at_user_conf.linkid_num; i++)\n        {\n            if (AT_LINK_UNUSE == at.linkid[i].usable)\n            {\n                break;\n            }\n        }\n    }\n\n    if (i < at_user_conf.linkid_num)\n        at.linkid[i].usable = AT_LINK_INUSE;\n\n    return i;\n}\n\n\nvoid store_resp_buf(int8_t *resp_buf, const int8_t *src, uint32_t src_len, uint32_t* maxlen)\n{\n\n    int copy_len;\n\n    copy_len = MIN(*maxlen, src_len);\n    memcpy((char *)resp_buf, (char *)src, copy_len);\n    *maxlen = copy_len;\n}\n\nint32_t at_cmd_in_callback(const int8_t *cmd, int32_t len,\n                    int32_t (*handle_data)(const int8_t *data, uint32_t len),  uint32_t timeout)\n{\n    int32_t ret = AT_FAILED;\n\n    if (handle_data != NULL)\n    {\n        if (LOS_MuxPend(at.trx_mux, 0) != AT_OK)\n        {\n            return AT_FAILED;\n        }\n    }\n\n    LOS_MuxPend(at.cmd_mux, LOS_WAIT_FOREVER);\n    //at_rm_timeout_nodes();\n    at_transmit((uint8_t *)cmd, len, 1);\n\n    if (handle_data != NULL)\n    {\n        at_listener *listener = NULL;\n\n        listener = at_malloc(sizeof(*listener));\n        if (listener == NULL)\n        {\n            AT_LOG(\"at_malloc fail\");\n            goto EXIT;\n        }\n        memset(listener, 0 ,sizeof(*listener));\n\n        listener->handle_data = handle_data;\n        listener->expire_time = at_get_time() + timeout;\n        at_listener_list_add(listener);\n    }\n    ret = AT_OK;\n\n\nEXIT:\n    LOS_MuxPost(at.cmd_mux);\n\n    AT_LOG(\"len %ld,cmd %s\", len, cmd);\n\n    return ret;\n}\n\n\nint32_t at_cmd_multi_suffix(const int8_t *cmd, int  len, at_cmd_info_s *cmd_info)\n{\n    at_listener listener;\n    int ret;\n    int print_len;\n\n    if ((cmd_info == NULL)\n        || (cmd == NULL))\n    {\n        return AT_FAILED;\n    }\n\n    memset(&listener, 0, sizeof(listener));\n    listener.cmd_info = *cmd_info;\n    print_len = ((cmd_info->resp_buf && cmd_info->resp_len) ? (int)*(cmd_info->resp_len) : -1);\n    AT_LOG(\"cmd len %d, %p,%d\", print_len,cmd_info->resp_buf,(int)cmd_info->resp_len);\n\n    LOS_MuxPend(at.trx_mux, LOS_WAIT_FOREVER);\n\n    LOS_MuxPend(at.cmd_mux, LOS_WAIT_FOREVER);\n    //at_rm_timeout_nodes();\n    at_listener_list_add(&listener);\n    at_transmit((uint8_t *)cmd, len, 1);\n    LOS_MuxPost(at.cmd_mux);\n\n    ret = LOS_SemPend(at.resp_sem, at.timeout);\n\n    LOS_MuxPend(at.cmd_mux, LOS_WAIT_FOREVER);\n    at_listner_list_del(&listener);\n    LOS_MuxPost(at.cmd_mux);\n\n    LOS_MuxPost(at.trx_mux);\n    write_at_task_msg(AT_SENT_DONE);\n\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"LOS_SemPend for listener.resp_sem failed(ret = %x, cmd = %s)!\", ret,cmd);\n        return AT_FAILED;\n    }\n\n    *cmd_info = listener.cmd_info;\n    return AT_OK;\n\n}\n\nint32_t at_cmd(int8_t *cmd, int32_t len, const char *suffix, char *resp_buf, int* resp_len)\n{\n    const char *suffix_array[1] = {suffix};\n    at_cmd_info_s cmd_info;\n\n    memset(&cmd_info, 0, sizeof(cmd_info));\n    cmd_info.suffix = suffix_array;\n    cmd_info.suffix_num = array_size(suffix_array);\n    cmd_info.resp_buf = resp_buf;\n    cmd_info.resp_len = (uint32_t *)resp_len;\n\n    return at_cmd_multi_suffix(cmd, len, &cmd_info);\n}\n\nint32_t at_write(int8_t *cmd, int8_t *suffix, int8_t *buf, int32_t len)\n{\n    const char *suffix_array[1];\n    at_listener listener;\n    int ret = AT_FAILED;\n\n    memset(&listener, 0, sizeof(listener));\n    listener.cmd_info.suffix_num = 1;\n    suffix_array[0] = \">\";\n    listener.cmd_info.suffix = suffix_array;\n\n    LOS_MuxPend(at.trx_mux, LOS_WAIT_FOREVER);\n\n    LOS_MuxPend(at.cmd_mux, LOS_WAIT_FOREVER);\n    //at_rm_timeout_nodes();\n    at_listener_list_add(&listener);\n    at_transmit((uint8_t *)cmd, strlen((char *)cmd), 1);\n    LOS_MuxPost(at.cmd_mux);\n\n    (void)LOS_SemPend(at.resp_sem, 200);\n\n    LOS_MuxPend(at.cmd_mux, LOS_WAIT_FOREVER);\n    suffix_array[0] = (char *)suffix;\n    at_listner_list_del(&listener);\n    at_listener_list_add(&listener);\n    at_transmit((uint8_t *)buf, len, 0);\n    LOS_MuxPost(at.cmd_mux);\n\n    ret = LOS_SemPend(at.resp_sem, at.timeout);\n\n    LOS_MuxPend(at.cmd_mux, LOS_WAIT_FOREVER);\n    at_listner_list_del(&listener);\n    LOS_MuxPost(at.cmd_mux);\n\n    LOS_MuxPost(at.trx_mux);\n    write_at_task_msg(AT_SENT_DONE);\n\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"LOS_SemPend for listener.resp_sem failed(ret = %x)!\", ret);\n        return AT_FAILED;\n    }\n    return len;\n}\n\nint cloud_cmd_matching(int8_t *buf, int32_t len)\n{\n    int ret = 0;\n    char *cmp = NULL;\n    int i;\n    //    int rlen;\n    //    memset(wbuf, 0, AT_DATA_LEN);\n\n    for(i = 0; i < at_oob.oob_num; i++)\n    {\n        //cmp = strstr((char *)buf, at_oob.oob[i].featurestr);\n        ret = at_oob.oob[i].cmd_match((const char *)buf, at_oob.oob[i].featurestr,at_oob.oob[i].len);\n        if(ret == 0)\n        {\n            cmp += at_oob.oob[i].len;\n            //            sscanf(cmp,\"%d,%s\",&rlen,wbuf);\n            if(at_oob.oob[i].callback != NULL)\n            {\n                (void)at_oob.oob[i].callback(at_oob.oob[i].arg, (int8_t *)buf, (int32_t)len);\n            }\n            return len;\n        }\n    }\n    return 0;\n}\n\n\nstatic int at_handle_callback_cmd_resp(at_listener *listener, int8_t *resp_buf, uint32_t resp_len)\n{\n\n    if (listener->handle_data == NULL)\n    {\n        return AT_FAILED;\n    }\n\n    if (listener->handle_data(resp_buf, resp_len) == AT_OK)\n    {\n        at_rm_node(listener, NULL);\n        return AT_OK;\n    }\n\n    return AT_FAILED;\n}\n\nstatic void at_handle_resp(int8_t *resp_buf, uint32_t resp_len)\n{\n    at_listener *listener = NULL;\n\n    listener = at.head;\n    if (NULL == listener)\n        return;\n\n    if (at_handle_callback_cmd_resp(listener, resp_buf, resp_len) == AT_OK)\n    {\n        return;\n    }\n\n    if(listener->cmd_info.suffix == NULL)\n    {\n\n        //store_resp_buf((int8_t *)listener->resp, (int8_t*)p1, p2 - p1);\n        (void)LOS_SemPost(at.resp_sem);\n        listener = NULL;\n        return;\n    }\n\n    for (uint32_t i = 0;  i < listener->cmd_info.suffix_num; i++)\n    {\n        char *suffix;\n\n        if (listener->cmd_info.suffix[i] == NULL)\n        {\n            continue;\n        }\n\n        suffix = strstr((char *)resp_buf, (const char *)listener->cmd_info.suffix[i]);\n        if (suffix != NULL)\n        {\n            if ((NULL != listener->cmd_info.resp_buf) && (NULL != listener->cmd_info.resp_len) && (resp_len > 0))\n            {\n                store_resp_buf((int8_t *)listener->cmd_info.resp_buf, resp_buf, resp_len, listener->cmd_info.resp_len);//suffix + strlen((char *)listener->suffix) - p1\n            }\n            listener->cmd_info.match_idx = i;\n            (void)LOS_SemPost(at.resp_sem);\n            break;\n        }\n\n    }\n}\n\nstatic uint32_t at_get_queue_wait_time()\n{\n    uint32_t ret;\n\n    if (at.step_callback == NULL)\n    {\n        return LOS_WAIT_FOREVER;\n    }\n\n    LOS_MuxPend(at.cmd_mux, LOS_WAIT_FOREVER);\n    if ((at.head == NULL) || (at.head->handle_data == NULL))\n    {\n        ret = LOS_WAIT_FOREVER;\n    }\n    else\n    {\n        const uint32_t min_wait_time = 100;\n        uint32_t  current = at_get_time();\n        ret = ((current >= at.head->expire_time) ? min_wait_time :((at.head->expire_time - current) * 1000));\n    }\n\n    LOS_MuxPost(at.cmd_mux);\n    return ret;\n}\n\nvoid at_recv_task()\n{\n    uint32_t recv_len = 0;\n    uint8_t *tmp = at.userdata;  //[MAX_USART_BUF_LEN] = {0};\n    int ret = 0;\n    recv_buff recv_buf;\n    UINT32 rlen = sizeof(recv_buff);\n\n    while(1)\n    {\n        uint32_t wait_time = at_get_queue_wait_time();\n        //AT_LOG(\"www wait time %ld\", wait_time);\n        ret = LOS_QueueReadCopy(at.rid, &recv_buf, &rlen, wait_time);\n        if(ret != LOS_OK)\n        {\n            continue;\n        }\n\n        if (recv_buf.msg_type == AT_TASK_QUIT)\n        {\n            AT_LOG(\"at recv task quit\");\n            break;\n        }\n\n        LOS_MuxPend(at.cmd_mux, LOS_WAIT_FOREVER);\n        at_rm_timeout_nodes();\n\t\tLOS_MuxPost(at.cmd_mux);\n\n        if (at.step_callback)\n        {\n            at.step_callback();\n        }\n\n        if (recv_buf.msg_type != AT_USART_RX)\n        {\n            AT_LOG(\"at recv msg sent done\");\n            continue;\n        }\n\n        memset(tmp, 0, at_user_conf.user_buf_len);\n        recv_len = read_resp(tmp, &recv_buf);\n\n        if (recv_len <= 0)\n        {\n            AT_LOG(\"err, recv_len = %ld\", recv_len);\n            continue;\n        }\n\n        AT_LOG_DEBUG(\"recv len = %lu buf = %s \", recv_len, tmp);\n\n        ret = cloud_cmd_matching((int8_t *)tmp, recv_len);\n        if(ret > 0)\n        {\n            continue;\n        }\n\n        LOS_MuxPend(at.cmd_mux, LOS_WAIT_FOREVER);\n        at_rm_timeout_nodes();\n        at_handle_resp((int8_t *)tmp, recv_len);\n        LOS_MuxPost(at.cmd_mux);\n\n    }\n}\n\nuint32_t create_at_recv_task()\n{\n    uint32_t uwRet = LOS_OK;\n    TSK_INIT_PARAM_S task_init_param;\n\n    task_init_param.usTaskPrio = 0;\n    task_init_param.pcName = \"at_recv_task\";\n    task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)at_recv_task;\n    task_init_param.uwStackSize = 0x1000;\n\n    uwRet = LOS_TaskCreate((UINT32 *)&at.tsk_hdl, &task_init_param);\n    if(LOS_OK != uwRet)\n    {\n        return uwRet;\n    }\n    return uwRet;\n\n}\n\nvoid at_init_oob(void)\n{\n    at_oob.oob_num = 0;\n    memset(at_oob.oob, 0, OOB_MAX_NUM * sizeof(struct oob_s));\n}\n\nint32_t at_struct_init(at_task *at)\n{\n    int ret = -1;\n    if (NULL == at)\n    {\n        AT_LOG(\"invaild param!\");\n        return ret;\n    }\n\n    ret = LOS_QueueCreate(\"recvQueue\", 32, (UINT32 *)&at->rid, 0, sizeof(recv_buff));\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"init recvQueue failed!\");\n        return AT_FAILED;\n    }\n    at->rid_flag = true;\n\n\n    ret = LOS_SemCreate(0, (UINT32 *)&at->recv_sem);\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"init at_recv_sem failed!\");\n        goto at_recv_sem_failed;\n    }\n\n    ret = LOS_MuxCreate((UINT32 *)&at->cmd_mux);\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"init cmd_mux failed!\");\n        goto at_cmd_mux_failed;\n    }\n\n    ret = LOS_MuxCreate((UINT32 *)&at->trx_mux);\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"init cmd_mux failed!\");\n        goto at_cmd_mux_failed;\n    }\n    at->trx_mux_flag = true;\n\n    ret = LOS_SemCreate(0, (UINT32 *)&at->resp_sem);\n    if (ret != LOS_OK)\n    {\n        AT_LOG(\"init resp_sem failed!\");\n        goto at_resp_sem_failed;\n    }\n#ifndef USE_USARTRX_DMA\n    at->recv_buf = at_malloc(at_user_conf.user_buf_len);\n    if (NULL == at->recv_buf)\n    {\n        AT_LOG(\"malloc recv_buf failed!\");\n        goto malloc_recv_buf;\n    }\n#else\n    at->recv_buf = at_malloc(at_user_conf.recv_buf_len);\n    if (NULL == at->recv_buf)\n    {\n        AT_LOG(\"malloc recv_buf failed!\");\n        goto malloc_recv_buf;\n    }\n#endif\n\n    at->cmdresp = at_malloc(at_user_conf.user_buf_len);\n    if (NULL == at->cmdresp)\n    {\n        AT_LOG(\"malloc cmdresp failed!\");\n        goto malloc_resp_buf;\n    }\n\n    at->userdata = at_malloc(at_user_conf.user_buf_len);\n    if (NULL == at->userdata)\n    {\n        AT_LOG(\"malloc userdata failed!\");\n        goto malloc_userdata_buf;\n    }\n    at->saveddata = at_malloc(at_user_conf.user_buf_len);\n    if (NULL == at->saveddata)\n    {\n        AT_LOG(\"malloc saveddata failed!\");\n        goto malloc_saveddata_buf;\n    }\n\n    at->linkid = (at_link *)at_malloc(at_user_conf.linkid_num * sizeof(at_link));\n    if (NULL == at->linkid)\n    {\n        AT_LOG(\"malloc for at linkid array failed!\");\n        goto malloc_linkid_failed;\n    }\n    memset(at->linkid, 0, at_user_conf.linkid_num * sizeof(at_link));\n\n    at->head = NULL;\n    at->mux_mode = at_user_conf.mux_mode;\n    at->timeout = at_user_conf.timeout;\n    return AT_OK;\n\n    //        atiny_free(at->linkid);\nmalloc_linkid_failed:\n    at_free(at->saveddata);\nmalloc_saveddata_buf:\n    at_free(at->userdata);\nmalloc_userdata_buf:\n    at_free(at->cmdresp);\nmalloc_resp_buf:\n    at_free(at->recv_buf);\nmalloc_recv_buf:\n    (void)LOS_SemDelete(at->resp_sem);\nat_resp_sem_failed:\n    (void)LOS_MuxDelete(at->cmd_mux);\nat_cmd_mux_failed:\n    (void)LOS_SemDelete(at->recv_sem);\nat_recv_sem_failed:\n\n    if (at->trx_mux_flag)\n    {\n        (void)LOS_MuxDelete(at->trx_mux);\n        at->trx_mux_flag = false;\n    }\n\n    if (at->rid_flag)\n    {\n        (VOID)LOS_QueueDelete(at->rid);\n        at->rid_flag = false;\n    }\n    return AT_FAILED;\n}\n\nint32_t at_struct_deinit(at_task *at)\n{\n    int32_t ret = AT_OK;\n\n    if(at == NULL)\n    {\n        AT_LOG(\"invaild param!\");\n        return AT_FAILED;\n    }\n\n    LOS_MuxPend(at->cmd_mux, LOS_WAIT_FOREVER);\n    at_listner_list_destroy(at);\n    LOS_MuxPost(at->cmd_mux);\n\n    if (LOS_SemDelete(at->recv_sem) != LOS_OK)\n    {\n        AT_LOG(\"delete at.recv_sem failed!\");\n        ret = AT_FAILED;\n    }\n\n    if (LOS_MuxDelete(at->cmd_mux) != LOS_OK)\n    {\n        AT_LOG(\"delete at.cmd_mux failed!\");\n        ret = AT_FAILED;\n    }\n\n    if (LOS_SemDelete(at->resp_sem) != LOS_OK)\n    {\n        AT_LOG(\"delete at.resp_sem failed!\");\n        ret = AT_FAILED;\n    }\n\n    if (at->trx_mux_flag)\n    {\n        (void)LOS_MuxDelete(at->trx_mux);\n        at->trx_mux_flag = false;\n    }\n\n    if (at->rid_flag)\n    {\n        (VOID)LOS_QueueDelete(at->rid);\n        at->rid_flag = false;\n    }\n\n    if (NULL != at->recv_buf)\n    {\n        at_free(at->recv_buf);\n        at->recv_buf = NULL;\n    }\n\n    if (NULL != at->cmdresp)\n    {\n        at_free(at->cmdresp);\n        at->cmdresp = NULL;\n    }\n\n    if (NULL != at->userdata)\n    {\n        at_free(at->userdata);\n        at->userdata = NULL;\n    }\n\n    if (NULL != at->saveddata)\n    {\n        at_free(at->saveddata);\n        at->saveddata = NULL;\n    }\n\n    if (NULL != at->linkid)\n    {\n        at_free(at->linkid);\n        at->linkid = NULL;\n    }\n\n    at->tsk_hdl = 0xFFFF;\n    at->head = NULL;\n    at->mux_mode = AT_MUXMODE_SINGLE;\n    at->timeout = 0;\n\n    return ret;\n}\n\nvoid at_set_config(at_config *config)\n{\n    if(NULL != config){\n        memcpy(&at_user_conf,config,sizeof(at_config));\n    }\n}\n\nat_config *at_get_config(void)\n{\n    return &at_user_conf;\n}\n\n\nint32_t at_init(at_config *config)\n{\n\n    if(NULL == config)\n    {\n        AT_LOG(\"Config is NULL, failed!!\\n\");\n        return AT_FAILED;\n    }\n\n    memcpy(&at_user_conf,config,sizeof(at_config));\n\n    AT_LOG_DEBUG(\"Config %s(buffer total is %lu)......\\n\", at_user_conf.name, at_user_conf.user_buf_len);\n\n    //LOS_TaskDelay(200);\n    if (AT_OK != at_struct_init(&at))\n    {\n        AT_LOG(\"prepare AT struct failed!\");\n        return AT_FAILED;\n    }\n    at_init_oob();\n\n    if(AT_OK != at_usart_init())\n    {\n        AT_LOG(\"at_usart_init failed!\");\n        (void)at_struct_deinit(&at);\n        return AT_FAILED;\n    }\n    if(LOS_OK != create_at_recv_task())\n    {\n        AT_LOG(\"create_at_recv_task failed!\");\n        at_usart_deinit();\n        (void)at_struct_deinit(&at);\n        return AT_FAILED;\n    }\n\n    AT_LOG(\"Config complete!!\\n\");\n    return AT_OK;\n}\n\n\nvoid at_deinit(void)\n{\n\n\n    int cnt = 0;\n    const int max_try_num = 10;\n\n\n    while(LOS_TaskNameGet(at.tsk_hdl) != NULL && cnt < max_try_num)\n    {\n        write_at_task_msg(AT_TASK_QUIT);\n        LOS_TaskDelay(1000);\n        cnt++;\n    }\n\n\n    if (LOS_TaskNameGet(at.tsk_hdl) != NULL)\n    {\n        if(LOS_OK != LOS_TaskDelete(at.tsk_hdl))\n        {\n            AT_LOG(\"at_recv_task delete failed!\");\n        }\n    }\n\n    at_usart_deinit();\n    if(AT_OK != at_struct_deinit(&at))\n    {\n        AT_LOG(\"at_struct_deinit failed!\");\n    }\n    at_init_oob();\n\n}\n\n\nint32_t at_oob_register(char *featurestr, int cmdlen, oob_callback callback, oob_cmd_match cmd_match)\n{\n    oob_t *oob;\n    if(featurestr == NULL || cmd_match == NULL || at_oob.oob_num == OOB_MAX_NUM || cmdlen >= OOB_CMD_LEN - 1)\n        return -1;\n    oob = &(at_oob.oob[at_oob.oob_num++]);\n    memcpy(oob->featurestr, featurestr, cmdlen);\n    oob->len = strlen(featurestr);\n    oob->callback = callback;\n    oob->cmd_match = cmd_match;\n    return 0;\n}\n\nvoid *at_malloc(size_t size)\n{\n    void *pMem = LOS_MemAlloc(m_aucSysMem0, size);\n    if(NULL != pMem)\n    {\n        memset(pMem, 0, size);\n    }\n    return pMem;\n}\n\nvoid at_free(void *ptr)\n{\n    (void)LOS_MemFree(m_aucSysMem0, ptr);\n}\n\nvoid at_reg_step_callback(at_task *at_tsk, void (*step_callback)(void))\n{\n    at_tsk->step_callback = step_callback;\n}\n\n\nat_task at =\n{\n    .tsk_hdl = 0xFFFF,\n    .recv_buf = NULL,\n    .cmdresp = NULL,\n    .userdata = NULL,\n    .linkid = NULL,\n    .head = NULL,\n\n    .init = at_init,\n    .deinit = at_deinit,\n    .cmd = at_cmd,\n    .write = at_write,\n    .oob_register = at_oob_register,\n    .get_id = at_get_unuse_linkid,\n    .cmd_multi_suffix = at_cmd_multi_suffix\n};\n\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/CHANGELOG",
    "content": "HISTORY\n\n(git master)\n\n  * [Enter new changes just after this line - do not remove this line]\n\n(STABLE-2.0.3)\n\n  ++ Bugfixes:\n\n  2017-09-11: Simon Goldschmidt\n  * tcp_in.c: fix bug #51937 (leaking tcp_pcbs on passive close with unacked data)\n\n  2017-08-02: Abroz Bizjak/Simon Goldschmidt\n  * multiple fixes in IPv4 reassembly (leading to corrupted datagrams received)\n  \n  2017-03-30: Simon Goldschmidt\n  * dhcp.c: return ERR_VAL instead of asserting on offset-out-of-pbuf\n\n  2017-03-23: Dirk Ziegelmeier\n  * dhcp.h: fix bug #50618 (dhcp_remove_struct() macro does not work)\n\n(STABLE-2.0.2)\n\n  ++ New features:\n\n  2017-02-10: Dirk Ziegelmeier\n  * Implement task #14367: Hooks need a better place to be defined:\n    We now have a #define for a header file name that is #included in every .c\n    file that provides hooks.\n\n  2017-02-10: Simon Goldschmidt\n  * tcp_close does not fail on memory error (instead, FIN is sent from tcp_tmr)\n\n  ++ Bugfixes:\n\n  2017-03-08\n  * tcp: do not keep sending SYNs when getting ACKs\n\n  2017-03-08: Joel Cunningham\n  * tcp: Initialize ssthresh to TCP_SND_BUF (bug #50476)\n\n  2017-03-01: Simon Goldschmidt\n  * httpd: LWIP_HTTPD_POST_MANUAL_WND: fixed double-free when httpd_post_data_recved\n    is called nested from httpd_post_receive_data() (bug #50424)\n\n  2017-02-28: David van Moolenbroek/Simon Goldschmidt\n  * tcp: fixed bug #50418: LWIP_EVENT_API: fix invalid calbacks for SYN_RCVD pcb\n\n  2017-02-17: Simon Goldschmidt\n  * dns: Improved DNS_LOCAL_HOSTLIST interface (bug #50325)\n\n  2017-02-16: Simon Goldschmidt\n  * LWIP_NETCONN_FULLDUPLEX: fixed shutdown during write (bug #50274)\n\n  2017-02-13: Simon Goldschmidt/Dirk Ziegelmeier\n  * For tiny targtes, LWIP_RAND is optional (fix compile time checks)\n\n  2017-02-10: Simon Goldschmidt\n  * tcp: Fixed bug #47485 (tcp_close() should not fail on memory error) by retrying\n    to send FIN from tcp_fasttmr\n\n  2017-02-09: Simon Goldschmidt\n  * sockets: Fixed bug #44032 (LWIP_NETCONN_FULLDUPLEX: select might work on\n    invalid/reused socket) by not allowing to reallocate a socket that has\n    \"select_waiting != 0\"\n\n  2017-02-09: Simon Goldschmidt\n  * httpd: Fixed bug #50059 (httpd LWIP_HTTPD_SUPPORT_11_KEEPALIVE vs.\n    LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED)\n\n  2017-02-08: Dirk Ziegelmeier\n  * Rename \"IPv6 mapped IPv4 addresses\" to their correct name from RFC4191:\n    \"IPv4-mapped IPv6 address\"\n\n  2017-02-08: Luc Revardel\n  * mld6.c: Fix bug #50220 (mld6_leavegroup does not send ICMP6_TYPE_MLD, even\n    if last reporter)\n\n  2017-02-08: David van Moolenbroek\n  * ip6.c: Patch #9250: fix source substitution in ip6_output_if()\n\n  2017-02-08: Simon Goldschmidt\n  * tcp_out.c: Fixed bug #50090 (last_unsent->oversize_left can become wrong value\n    in tcp_write error path)\n\n  2017-02-02: Dirk Ziegelmeier\n  * Fix bug #50206: UDP Netconn bind to IP6_ADDR_ANY fails\n\n  2017-01-18: Dirk Ziegelmeier\n  * Fix zero-copy RX, see bug bug #50064. PBUF_REFs were not supported as ARP requests.\n\n  2017-01-15: Axel Lin, Dirk Ziegelmeier\n  * minor bug fixes in mqtt\n\n  2017-01-11: Knut Andre Tidemann\n  * sockets/netconn: fix broken default ICMPv6 handling of checksums\n\n(STABLE-2.0.1)\n\n  ++ New features:\n\n  2016-12-31: Simon Goldschmidt\n  * tcp.h/.c: added function tcp_listen_with_backlog_and_err() to get the error\n    reason when listening fails (bug #49861)\n\n  2016-12-20: Erik Andersen\n  * Add MQTT client\n\n  2016-12-14: Jan Breuer:\n  * opt.h, ndc.h/.c: add support for RDNSS option (as per RFC 6106)\n\n  2016-12-14: David van Moolenbroek\n  * opt.h, nd6.c: Added LWIP_HOOK_ND6_GET_GW()\n\n  2016-12-09: Dirk Ziegelmeier\n  * ip6_frag.c: Implemented support for LWIP_NETIF_TX_SINGLE_PBUF\n\n  2016-12-09: Simon Goldschmidt\n  * dns.c: added one-shot multicast DNS queries\n\n  2016-11-24: Ambroz Bizjak, David van Moolenbroek\n  * tcp_out.c: Optimize passing contiguous nocopy buffers to tcp_write (bug #46290)\n\n  2016-11-16: Dirk Ziegelmeier\n  * sockets.c: added support for IPv6 mapped IPv4 addresses\n\n  ++ Bugfixes:\n\n  2016-12-16: Thomas Mueller\n  * api_lib.c: fixed race condition in return value of netconn_gethostbyname()\n    (and thus also lwip_gethostbyname/_r() and lwip_getaddrinfo())\n\n  2016-12-15: David van Moolenbroek\n  * opt.h, tcp: added LWIP_HOOK_TCP_ISN() to implement less predictable initial\n    sequence numbers (see contrib/addons/tcp_isn for an example implementation)\n\n  2016-12-05: Dirk Ziegelmeier\n  * fixed compiling with IPv4 disabled (IPv6 only case)\n\n  2016-11-28: Simon Goldschmidt\n  * api_lib.c: fixed bug #49725 (send-timeout: netconn_write() can return\n    ERR_OK without all bytes being written)\n\n  2016-11-28: Ambroz Bizjak\n  * tcpi_in.c: fixed bug #49717 (window size in received SYN and SYN-ACK\n    assumed scaled)\n\n  2016-11-25: Simon Goldschmidt\n  * dhcp.c: fixed bug #49676 (Possible endless loop when parsing dhcp options)\n\n  2016-11-23: Dirk Ziegelmeier\n  * udp.c: fixed bug #49662: multicast traffic is now only received on a UDP PCB\n   (and therefore on a UDP socket/netconn) when the PCB is bound to IP_ADDR_ANY\n\n  2016-11-16: Dirk Ziegelmeier\n  * *: Fixed dual-stack behaviour, IPv6 mapped IPv4 support in socket API\n\n  2016-11-14: Joel Cunningham\n  * tcp_out.c: fixed bug #49533 (start persist timer when unsent seg can't fit\n    in window) \n\n  2016-11-16: Roberto Barbieri Carrera\n  * autoip.c: fixed bug #49610 (sometimes AutoIP fails to reuse the same address)\n\n  2016-11-11: Dirk Ziegelmeier\n  * sockets.c: fixed bug #49578 (dropping multicast membership does not work\n    with LWIP_SOCKET_OFFSET)\n\n(STABLE-2.0.0)\n\n  ++ New features:\n\n  2016-07-27: Simon Goldschmidt\n  * opt.h, timeouts.h/.c: added LWIP_TIMERS_CUSTOM to override the default\n    implementation of timeouts\n\n  2016-07-xx: Dirk Ziegelmeier\n  * Large overhaul of doxygen documentation\n\n  2016-04-05: Simon Goldschmidt\n  * timers.h/.c: prepare for overriding current timeout implementation: all\n    stack-internal caclic timers are avaliable in the lwip_cyclic_timers array\n\n  2016-03-23: Simon Goldschmidt\n  * tcp: call accept-callback with ERR_MEM when allocating a pcb fails on\n    passive open to inform the application about this error\n    ATTENTION: applications have to handle NULL pcb in accept callback!\n\n  2016-02-22: Ivan Delamer\n  * Initial 6LoWPAN support\n\n  2016-02-XX to 2016-03-XX: Dirk Ziegelmeier\n  * Cleanup TCPIP thread sync methods in a way that it is possibe to use them\n    in arbitrary code that needs things to be done in TCPIP thread. Used to\n    decouple netconn, netif, ppp and 6LoWPAN from LWIP core.\n\n  2016-02-XX: Dirk Ziegelmeier\n  * Implement dual-stack support in RAW, UDP and TCP. Add new IP address\n    type IPADDR_ANY_TYPE for this. Netconn/Socket API: Dual-stack is\n    automatically supported when an IPv6 netconn/socket is created.\n\n  2015-12-26: Martin Hentschel and Dirk Ziegelmeier\n  * Rewrite SNMP agent. SNMPv2c + MIB compiler.\n\n  2015-11-12: Dirk Ziegelmeier\n  * Decouple SNMP stack from lwIP core and move stack to apps/ directory.\n    Breaking change: Users have to call snmp_init() now!\n\n  2015-11-12: Dirk Ziegelmeier\n  * Implement possibility to declare private memory pools. This is useful to\n    decouple some apps from the core (SNMP stack) or make contrib app usage\n    simpler (httpserver_raw)\n\n  2015-10-09: Simon Goldschmidt\n  * started to move \"private\" header files containing implementation details to\n    \"lwip/priv/\" include directory to seperate the API from the implementation.\n\n  2015-10-07: Simon Goldschmidt\n  * added sntp client as first \"supported\" application layer protocol implementation\n    added 'apps' folder\n\n  2015-09-30: Dirk Ziegelmeier\n  * snmp_structs.h, mib_structs.c, mib2.c: snmp: fixed ugly inheritance\n    implementation by aggregating the \"base class\" (struct mib_node) in all\n    derived node classes to get more type-safe code\n\n  2015-09-23: Simon Goldschmidt\n  * netif.h/.c, nd6.c: task #13729: Convert netif addresses (IPv4 & IPv6) to\n    ip_addr_t (so they can be used without conversion/temporary storage)\n\n  2015-09-08: Dirk Ziegelmeier\n  * snmp: Separate mib2 counter/table callbacks from snmp agent. This both cleans\n    up the code and should allow integration of a 3rd party agent/mib2. Simple\n    counters are kept in MIB2_STATS, tree/table change function prototypes moved to\n    snmp_mib2.h.\n\n  2015-09-03: Simon Goldschmidt\n  * opt.h, dns.h/.c: DNS/IPv6: added support for AAAA records\n\n  2015-09-01: Simon Goldschmidt\n  * task #12178: hardware checksum capabilities can be configured per netif\n   (use NETIF_SET_CHECKSUM_CTRL() in your netif's init function)\n\n  2015-08-30: Simon Goldschmidt\n  * PBUF_REF with \"custom\" pbufs is now supported for RX pbufs (see pcapif in\n    contrib for an example, LWIP_SUPPORT_CUSTOM_PBUF is required)\n\n  2015-08-30: Simon Goldschmidt\n  * support IPv4 source based routing: define LWIP_HOOK_IP4_ROUTE_SRC to point\n    to a routing function\n\n  2015-08-05: Simon Goldschmidt\n  * many files: allow multicast socket options IP_MULTICAST_TTL, IP_MULTICAST_IF\n    and IP_MULTICAST_LOOP to be used without IGMP\n\n  2015-04-24: Simon Goldschmidt\n  * dhcp.h/c, autoip.h/.c: added functions dhcp/autoip_supplied_address() to\n    check for the source of address assignment (replacement for NETIF_FLAG_DHCP)\n\n  2015-04-10: Simon Goldschmidt\n  * many files: task #13480: added LWIP_IPV4 define - IPv4 can be disabled,\n    leaving an IPv6-only stack\n\n  2015-04-09: Simon Goldschmidt\n  * nearly all files: task #12722 (improve IPv4/v6 address handling): renamed\n    ip_addr_t to ip4_addr_t, renamed ipX_addr_t to ip_addr_t and added IP\n    version; ip_addr_t is used for all generic IP addresses for the API,\n    ip(4/6)_addr_t are only used internally or when initializing netifs or when\n    calling version-related functions\n\n  2015-03-24: Simon Goldschmidt\n  * opt.h, ip4_addr.h, ip4.c, ip6.c: loopif is not required for loopback traffic\n    any more but passed through any netif (ENABLE_LOOPBACK has to be enabled)\n\n  2015-03-23: Simon Goldschmidt\n  * opt.h, etharp.c: with ETHARP_TABLE_MATCH_NETIF== 1, duplicate (Auto)-IP\n    addresses on multiple netifs should now be working correctly (if correctly\n    addressed by routing, that is)\n\n  2015-03-23: Simon Goldschmidt\n  * etharp.c: Stable etharp entries that are about to expire are now refreshed\n    using unicast to prevent unnecessary broadcast. Only if no answer is received\n    after 15 seconds, broadcast is used.\n\n  2015-03-06: Philip Gladstone\n  * netif.h/.c: patch #8359 (Provide utility function to add an IPv6 address to\n    an interface)\n\n  2015-03-05: Simon Goldschmidt\n  * netif.c, ip4.c, dhcp.c, autoip.c: fixed bug #37068 (netif up/down handling\n    is unclear): correclty separated administrative status of a netif (up/down)\n    from 'valid address' status\n    ATTENTION: netif_set_up() now always has to be called, even when dhcp/autoip\n    is used!\n\n  2015-02-26: patch by TabascoEye\n  * netif.c, udp.h/.c: fixed bug #40753 (re-bind UDP pcbs on change of IP address)\n\n  2015-02-22: chrysn, Simon Goldschmidt\n  * *.*: Changed nearly all functions taking 'ip(X)_addr_t' pointer to take\n    const pointers (changed user callbacks: raw_recv_fn, udp_recv_fn; changed\n    port callbacks: netif_output_fn, netif_igmp_mac_filter_fn)\n\n  2015-02-19: Ivan Delamer\n  * netif.h, dhcp.c: Removed unused netif flag for DHCP. The preferred way to evaluate\n    if DHCP is active is through netif->dhcp field.\n\n  2015-02-19: Ivan Delamer\n  * netif.h, slipif.c, ppp.c: Removed unused netif flag for point to point connections\n\n  2015-02-18: Simon Goldschmidt\n  * api_lib.c: fixed bug #37958 \"netconn API doesn't handle correctly\n    connections half-closed by peer\"\n\n  2015-02-18: Simon Goldschmidt\n  * tcp.c: tcp_alloc() prefers killing CLOSING/LAST_ACK over active connections\n    (see bug #39565)\n\n  2015-02-16: Claudius Zingerli, Sergio Caprile\n  * opt.h, dhcp.h/.c: patch #8361 \"Add support for NTP option in DHCP\"\n\n  2015-02-14: Simon Goldschmidt\n  * opt.h, snmp*: added support for write-access community and dedicated\n    community for sending traps\n\n  2015-02-13: Simon Goldschmidt\n  * opt.h, memp.c: added hook LWIP_HOOK_MEMP_AVAILABLE() to get informed when\n    a memp pool was empty and an item is now available\n\n  2015-02-13: Simon Goldschmidt\n  * opt.h, pbuf.h/.c, etharp.c: Added the option PBUF_LINK_ENCAPSULATION_HLEN to\n    allocate additional header space for TX on netifs requiring additional headers\n\n  2015-02-12: chrysn\n  * timers.h/.c: introduce sys_timeouts_sleeptime (returns the time left before\n    the next timeout is due, for NO_SYS==1)\n\n  2015-02-11: Nick van Ijzendoorn\n  * opt.h, sockets.h/c: patch #7702 \"Include ability to increase the socket number\n    with defined offset\"\n\n  2015-02-11: Frederick Baksik\n  * opt.h, def.h, others: patch #8423 \"arch/perf.h\" should be made an optional item\n\n  2015-02-11: Simon Goldschmidt\n  * api_msg.c, opt.h: started to implement fullduplex sockets/netconns\n    (note that this is highly unstable yet!)\n\n  2015-01-17: Simon Goldschmidt\n  * api: allow enabling socket API without (public) netconn API - netconn API is\n    still used by sockets, but keeping it private (static) should allow better\n    compiler optimizations\n\n  2015-01-16: Simon Goldschmidt\n  * tcp_in.c: fixed bug #20506 \"Initial congestion window is very small\" again\n    by implementing the calculation formula from RFC3390\n\n  2014-12-10: Simon Goldschmidt\n  * api: added option LWIP_NETCONN_SEM_PER_THREAD to use a semaphore per thread\n    instead of using one per netconn and per select call\n\n  2014-12-08: Simon Goldschmidt\n  * ip6.h: fixed bug #43778: IPv6 header version not set on 16-bit platform\n    (macro IP6H_VTCFL_SET())\n\n  2014-12-08: Simon Goldschmidt\n  * icmp.c, ip4.c, pbuf.c, udp.c, pbuf.h: task #11472 Support PBUF_REF for RX\n    (IPv6 and IPv4/v6 reassembly might not work yet)\n\n  2014-11-06: Simon Goldschmidt\n  * sockets.c/.h, init.c: lwip_socket_init() is not needed any more\n    -> compatibility define\n\n  2014-09-16: Simon Goldschmidt\n  * dns.c, opt.h: reduced ram usage by parsing DNS responses in place\n\n  2014-09-16: Simon Goldschmidt\n  * pbuf.h/.c: added pbuf_take_at() and pbuf_put_at()\n\n  2014-09-15: Simon Goldschmidt\n  * dns.c: added source port randomization to make the DNS client more robust\n    (see bug #43144)\n\n  2013-09-02: Simon Goldschmidt\n  * arch.h and many other files: added optional macros PACK_STRUCT_FLD_8() and\n    PACK_STRUCT_FLD_S() to prevent gcc 4 from warning about struct members that\n    do not need packing\n\n  2013-08-19: Simon Goldschmidt\n  * netif.h: bug #42998: made NETIF_MAX_HWADDR_LEN overridable for some special\n    networks\n\n  2013-03-17: Simon Goldschmidt (patch by Ghobad Emadi)\n  * opt.h, etharp.c: Added LWIP_HOOK_ETHARP_GET_GW to implement IPv4 routing with\n    multiple gateways\n\n  2013-04-20: Fatih Asici\n  * opt.h, etharp.h/.c: patch #7993: Added support for transmitting packets\n    with VLAN headers via hook function LWIP_HOOK_VLAN_SET and to check them\n    via hook function LWIP_HOOK_VLAN_CHECK\n\n  2014-02-20: Simon Goldschmidt (based on patch by Artem Pisarenko)\n  * patch #7885: modification of api modules to support FreeRTOS-MPU\n    (don't pass stack-pointers to other threads)\n\n  2014-02-05: Simon Goldschmidt (patch by \"xtian\" and \"alex_ab\")\n  * patch #6537/#7858: TCP window scaling support\n\n  2014-01-17: Jiri Engelthaler\n  * icmp, icmp6, opt.h: patch #8027: Completed HW checksuming for IPv4 and\n    IPv6 ICMP's\n\n  2012-08-22: Sylvain Rochet\n  * New PPP stack for lwIP, developed in ppp-new branch.\n    Based from pppd 2.4.5, released 2009-11-17, with huge changes to match\n    code size and memory requirements for embedded devices, including:\n    - Gluing together the previous low-level PPP code in lwIP to pppd 2.4.5, which\n      is more or less what pppd sys-* files are, so that we get something working\n      using the unix port.\n    - Merged some patchs from lwIP Git repository which add interesting features\n      or fix bugs.\n    - Merged some patchs from Debian pppd package which add interesting features\n      or fix bugs.\n    - Ported PPP timeout handling to the lwIP timers system\n    - Disabled all the PPP code using filesystem access, replaced in necessary cases\n      to configuration variables.\n    - Disabled all the PPP code forking processes.\n    - Removed IPX support, lwIP does not support IPX.\n    - Ported and improved random module from the previous PPP port.\n    - Removed samba TDB (file-driven database) usage, because it needs a filesystem.\n    - MS-CHAP required a DES implementation, we added the latest PolarSSL DES\n      implementation which is under a BSD-ish license.\n    - Also switched to PolarSSL MD4,MD5,SHA1 implementations, which are meant to be\n      used in embedded devices with reduced memory footprint.\n    - Removed PPP configuration file parsing support. \n    - Added macro definition EAP_SUPPORT to make EAP support optional.\n    - Added macro definition CHAP_SUPPORT to make CHAP support optional.\n    - Added macro definition MSCHAP_SUPPORT to make MSCHAP support optional.\n    - Added macro definition PAP_SUPPORT to make PAP support optional.\n    - Cleared all Linux syscall calls.\n    - Disabled demand support using a macro, so that it can be ported later.\n    - Disabled ECP support using a macro, so that it can be ported later.\n    - Disabled CCP support using a macro, so that it can be ported later.\n    - Disabled CBCP support using a macro, so that it can be ported later.\n    - Disabled LQR support using a macro, so that it can be ported later.\n    - Print packet debug feature optional, through PRINTPKT_SUPPORT\n    - Removed POSIX signal usage.\n    - Fully ported PPPoS code from the previous port.\n    - Fully ported PPPoE code from the previous port.\n    - Fully ported VJ compression protocol code from the previous port.\n    - Removed all malloc()/free() use from PPP, replaced by stack usage or PBUF.\n    - Disabled PPP server support using a macro, so that it can be ported later.\n    - Switched all PPP debug to lwIP debug system.\n    - Created PPP Control Block (PPP PCB), removed PPP unit integer everywhere,\n      removed all global variables everywhere, did everything necessary for\n      the PPP stack to support more than one PPP session (pppd only support\n      one session per process).\n    - Removed the statically allocated output buffer, now using PBUF.\n    - Improved structure size of all PPP modules, deep analyze of code to reduce\n      variables size to the bare minimum. Switched all boolean type (char type in\n      most architecture) to compiler generated bitfields.\n    - Added PPP IPv6 support, glued lwIP IPv6 support to PPP.\n    - Now using a persistent netif interface which can then be used in lwIP\n      functions requiring a netif.\n    - Now initializing PPP in lwip_init() function.\n    - Reworked completely the PPP state machine, so that we don't end up in\n      anymore in inconsistent state, especially with PPPoE.\n    - Improved the way we handle PPP reconnection after disconnect, cleaning\n      everything required so that we start the PPP connection again from a\n      clean state.\n    - Added PPP holdoff support, allow the lwIP user to wait a little bit before\n      reconnecting, prevents connection flood, especially when using PPPoL2TP.\n    - Added PPPoL2TP LAC support (a.k.a. UDP tunnels), adding a VPN client\n      feature to lwIP, L2TP being a widely used tunnel protocol.\n    - Switched all used PPP types to lwIP types (u8t, u16t, u32t, ...)\n    - Added PPP API \"sequential\" thread-safe API, based from NETIFAPI.\n\n  2011-07-21: Simon Goldschmidt\n  * sockets.c, opt.h: (bug #30185): added LWIP_FIONREAD_LINUXMODE that makes\n    ioctl/FIONREAD return the size of the next pending datagram.\n\n  2011-05-25: Simon Goldschmidt\n  * again nearly the whole stack, renamed ip.c to ip4.c, ip_addr.c to ip4_addr.c,\n    combined ipv4/ipv6 inet_chksum.c, added ip.h, ip_addr.h: Combined IPv4\n    and IPv6 code where possible, added defines to access IPv4/IPv6 in non-IP\n    code so that the code is more readable.\n\n  2011-05-17: Patch by Ivan Delamer (only checked in by Simon Goldschmidt)\n  * nearly the whole stack: Finally, we got decent IPv6 support, big thanks to\n    Ivan! (this is work in progress: we're just post release anyway :-)\n\n\n  ++ Bugfixes:\n\n  2016-08-23: Simon Goldschmidt\n  * etharp: removed ETHARP_TRUST_IP_MAC since it is insecure and we don't need\n    it any more after implementing unicast ARP renewal towards arp entry timeout\n\n  2016-07-20: Simon Goldschmidt\n  * memp.h/.c: fixed bug #48442 (memp stats don't work for MEMP_MEM_MALLOC)\n\n  2016-07-21: Simon Goldschmidt (patch by Ambroz Bizjak)\n  * tcp_in.c, tcp_out.c: fixed bug #48543 (TCP sent callback may prematurely\n    report sent data when only part of a segment is acked) and don't include\n    SYN/FIN in snd_buf counter\n\n  2016-07-19: Simon Goldschmidt\n  * etharp.c: fixed bug #48477 (ARP input packet might update static entry)\n\n  2016-07-11: Simon Goldschmidt\n  * tcp_in.c: fixed bug #48476 (TCP sent callback called wrongly due to picking\n    up old pcb->acked\n\n  2016-06-30: Simon Goldschmidt (original patch by Fabian Koch)\n  * tcp_in.c: fixed bug #48170 (Vulnerable to TCP RST spoofing)\n\n  2016-05-20: Dirk Ziegelmeier\n  * sntp.h/.c: Fix return value of sntp_getserver() call to return a pointer\n\n  2016-04-05: Simon Goldschmidt (patch by Philip Gladstone)\n  * udp.c: patch #8358: allow more combinations of listening PCB for IPv6\n\n  2016-04-05: Simon Goldschmidt\n  * netconn/socket API: fixed bug# 43739 (Accept not reporting errors about\n    aborted connections): netconn_accept() returns ERR_ABRT (sockets: ECONNABORTED)\n    for aborted connections, ERR_CLSD (sockets: EINVAL) if the listening netconn\n    is closed, which better seems to follow the standard.\n\n  2016-03-23: Florent Matignon\n  * dhcp.c: fixed bug #38203: DHCP options are not recorded in all DHCP ack messages\n\n  2016-03-22: Simon Goldschmidt\n  * tcp: changed accept handling to be done internally: the application does not\n    have to call tcp_accepted() any more. Instead, when delaying accept (e.g. sockets\n    do), call tcp_backlog_delayed()/tcp_backlog_accepted() (fixes bug #46696)\n\n  2016-03-22: Simon Goldschmidt\n  * dns.c: ignore dns response parsing errors, only abort resolving for correct\n    responses or error responses from correct server (bug #47459)\n\n  2016-03-17: Simon Goldschmidt\n  * api_msg.c: fixed bug #47448 (netconn/socket leak if RST is received during close)\n\n  2016-03-17: Joel Cunningham\n  * api_msg.c: don't fail closing a socket/netconn when failing to allocate the\n    FIN segment; blocking the calling thread for a while is better than risking\n    leaking a netconn/socket (see bug #46701)\n\n  2016-03-16: Joel Cunningham\n  * tcp_out.c: reset rto timer on fast retransmission\n\n  2016-03-16: Deomid Ryabkov\n  * tcp_out.c: fixed bug #46384 Segment size calculation bug with MSS != TCP_MSS\n\n  2016-03-05: Simon Goldschmidt\n  * err.h/.c, sockets.c: ERR_IF is not necessarily a fatal error\n\n  2015-11-19: fix by Kerem Hadimli\n  * sockets.c: fixed bug #46471: lwip_accept() leaks socket descriptors if new\n    netconn was already closed because of peer behavior\n\n  2015-11-12: fix by Valery Ushakov\n  * tcp_in.c: fixed bug #46365 tcp_accept_null() should call tcp_abort()\n\n  2015-10-02: Dirk Ziegelmeier/Simon Goldschmidt\n  * snmp: cleaned up snmp structs API (fixed race conditions from bug #46089,\n    reduce ram/rom usage of tables): incompatible change for private MIBs\n\n  2015-09-30: Simon Goldschmidt\n  * ip4_addr.c: fixed bug #46072: ip4addr_aton() does not check the number range\n    of all address parts\n\n  2015-08-28: Simon Goldschmidt\n  * tcp.c, tcp_in.c: fixed bug #44023: TCP ssthresh value is unclear: ssthresh\n    is set to the full send window for active open, too, and is updated once\n    after SYN to ensure the correct send window is used\n\n  2015-08-28: Simon Goldschmidt\n  * tcp: fixed bug #45559: Window scaling casts u32_t to u16_t without checks\n\n  2015-08-26: Simon Goldschmidt\n  * ip6_frag.h/.c: fixed bug bug #41009: IPv6 reassembly broken on 64-bit platforms:\n    define IPV6_FRAG_COPYHEADER==1 on these platforms to copy the IPv6 header\n    instead of referencing it, which gives more room for struct ip6_reass_helper\n\n  2015-08-25: Simon Goldschmidt\n  * sockets.c: fixed bug #45827: recvfrom: TCP window is updated with MSG_PEEK\n\n  2015-08-20: Manoj Kumar\n  * snmp_msg.h, msg_in.c: fixed bug #43790: Sending octet string of Length >255\n    from SNMP agent\n\n  2015-08-19: Jens Nielsen\n  * icmp.c, ip4.c, tcp_in.c, udp.c, raw.c: fixed bug #45120: Broadcast & multiple\n    interfaces handling\n\n  2015-08-19: Simon Goldschmidt (patch by \"Sandra\")\n  * dns.c: fixed bug #45004: dns response without answer might be discarded\n\n  2015-08-18: Chrysn\n  * timers.c: patch #8704 fix sys_timeouts_sleeptime function\n\n  2015-07-01: Erik Ekman\n  * puf.c: fixed bug #45454 (pbuf_take_at() skips write and returns OK if offset\n    is at start of pbuf in chain)\n\n  2015-05-19: Simon Goldschmidt\n  * dhcp.h/.c: fixed bugs #45140 and #45141 (dhcp was not stopped correctly after\n    fixing bug #38204)\n\n  2015-03-21: Simon Goldschmidt (patch by Homyak)\n  * tcp_in.c: fixed bug #44766 (LWIP_WND_SCALE: tcphdr->wnd was not scaled in\n    two places)\n\n  2015-03-21: Simon Goldschmidt\n  * tcp_impl.h, tcp.c, tcp_in.c: fixed bug #41318 (Bad memory ref in tcp_input()\n    after tcp_close())\n\n  2015-03-21: Simon Goldschmidt\n  * tcp_in.c: fixed bug #38468 (tcp_sent() not called on half-open connection for\n    data ACKed with the same ack as FIN)\n\n  2015-03-21: Simon Goldschmidt (patch by Christoffer Lind)\n  * dhcp.h/.c: fixed bug #38204 (DHCP lease time not handled correctly)\n\n  2015-03-20: Simon Goldschmidt\n  * dhcp.c: fixed bug #38714 (Missing option and client address in DHCPRELEASE message)\n\n  2015-03-19: Simon Goldschmidt\n  * api.h, tcpip.h, api_lib.c, api_msg.c: fixed race conditions in assigning\n    netconn->last_err (fixed bugs #38121 and #37676)\n\n  2015-03-09: Simon Goldschmidt\n  * ip4.c: fixed the IPv4 part of bug #43904 (ip_route() must detect linkup status)\n\n  2015-03-04: Simon Goldschmidt\n  * nd6.c: fixed bug #43784 (a host should send at least one Router Solicitation)\n\n  2015-03-04: Valery Ushakov\n  * ip6.c: fixed bug #41094 (Byte-order bug in IPv6 fragmentation header test)\n\n  2015-03-04: Zach Smith\n  * nd6.c: fixed bug #38153 (nd6_input() byte order issues)\n\n  2015-02-26: Simon Goldschmidt\n  * netif.c, tcp.h/.c: fixed bug #44378 (TCP connections are not aborted on netif\n    remove)\n\n  2015-02-25: Simon Goldschmidt\n  * ip4.c, etharp.c: fixed bug #40177 (System hangs when dealing with corrupted\n    packets), implemented task #12357 (Ensure that malicious packets don't\n    assert-fail): improved some pbuf_header calls to not assert-fail.\n\n  2015-02-25: patch by Joel Cunningham\n  * udp.h/.c, sockets.c: fixed bug #43028 (IP_MULTICAST_TTL affects unicast\n    datagrams)\n\n  2015-02-25: patch by Greg Renda\n  * ip4_frag.c: fixed bug #38210 (ip reassembly while remove oldest datagram)\n\n  2015-02-25: Simon Goldschmidt\n  * sockets.c: fixed bug #38165 (socket with mulicast): ensure igmp membership\n    are dropped when socket (not netconn!) is closed.\n\n  2015-02-25: Simon Goldschmidt\n  * ip4.h/.c, udp.c: fixed bug #38061 (wrong multicast routing in IPv4) by\n    adding an optional default netif for multicast routing\n\n  2015-02-25: Simon Goldschmidt\n  * netconn API: fixed that netconn_connect still used message passing for\n    LWIP_TCPIP_CORE_LOCKING==1\n\n  2015-02-22: patch by Jens Nielsen\n  * icmp.c: fixed bug #38803 (Source address in broadcast ping reply)\n\n  2015-02-22: Simon Goldschmidt\n  * udp.h, sockets.c: added proper accessor functions for pcb->multicast_ip\n    (previously used by get/setsockopt only)\n\n  2015-02-18: Simon Goldschmidt\n  * sockets.c: Fixed select not reporting received FIN as 'readable' in certain\n    rare cases (bug #43779: select(), close(), and TCP retransmission error)\n\n  2015-02-17: Simon Goldschmidt\n  * err.h, sockets.c, api_msg.c: fixed bug #38853 \"connect() use a wrong errno\":\n    return ERR_ALREADY/EALRADY during connect, ERR_ISCONN/EISCONN when already\n    connected\n\n  2015-02-17: Simon Goldschmidt\n  * tcp_impl.h, tcp_out.c, tcp.c, api_msg.c: fixed bug #37614 \"Errors from\n    ipX_output are not processed\". Now tcp_output(_segment) checks for the return\n    value of ipX_output and does not try to send more on error. A netif driver\n    can call tcp_txnow() (from tcpip_thread!) to try to send again if TX buffers\n    are available again.\n\n  2015-02-14: patches by Freddie Chopin\n  * snmp*: made community writable, fixed some const pointers\n\n  2015-02-13: Simon Goldschmidt\n  * msg_in.c: fixed bug #22070 \"MIB_OBJECT_WRITE_ONLY not implemented in SNMP\"\n\n  2015-02-12: Simon Goldschmidt\n  * ip.h, ip4.c, ip6.c: fixed bug #36403 \"ip4_input() and ip6_input() always pass\n    inp to higher layers\": now the accepting netif is passed up, but the input\n    netif is available through ip_current_input_netif() if required.\n\n  2015-02-11: patch by hichard\n  * tcpip.c: fixed bug #43094 \"The function tcpip_input() forget to handle IPv6\"\n\n  2015-02-10: Simon Goldschmidt\n  * netconn API: fixed that netconn_close/netconn_delete still used message passing\n    for LWIP_TCPIP_CORE_LOCKING==1\n\n  2015-02-10: Simon Goldschmidt\n  * netconn/socket api: fixed bug #44225 \"closing TCP socket should time out\n    eventually\", implemented task #6930 \"Implement SO_LINGER\": closing TCP sockets\n    times out after 20 seconds or after the configured SND_TIMEOUT or depending\n    on the linger settings.\n\n  2015-01-27: Simon Goldschmidt\n  * api_msg.c: fixed that SHUT_RD followed by SHUT_WR was different to SHUT_RDWR,\n    fixed return value of lwip_netconn_do_close on unconnected netconns\n\n  2015-01-17: Simon Goldschmidt\n  * sockets.c: fixed bug #43361 select() crashes with stale FDs\n\n  2015-01-17: Simon Goldschmidt\n  * sockets.c/.h, memp_std.h: fixed bug #40788 \"lwip_setsockopt_internal() crashes\"\n    by rewriting set/getsockopt functions to combine checks with the actual code\n    and add more NULL checks; this also fixes that CORE_LOCKING used message\n    passing for set/getsockopt.\n\n  2014-12-19: Simon Goldschmidt\n  * opt.h, dhcp.h/.c: prevent dhcp from starting when netif link is down (only\n    when LWIP_DHCP_CHECK_LINK_UP==1, which is disabled by default for\n    compatibility reasons)\n\n  2014-12-17: Simon Goldschmidt\n  * tcp_out.c: fixed bug #43840 Checksum error for TCP_CHECKSUM_ON_COPY==1 for\n    no-copy data with odd length\n\n  2014-12-10: Simon Goldschmidt\n  * sockets.c, tcp.c, others: fixed bug #43797 set/getsockopt: SO_SNDTIMEO/SO_RCVTIMEO\n    take int as option but should take timeval (LWIP_SO_SNDRCVTIMEO_STANDARD==0 can\n    be used to revert to the old 'winsock' style behaviour)\n    Fixed implementation of SO_ACCEPTCONN to just look at the pcb state\n\n  2014-12-09: Simon Goldschmidt\n  * ip4.c: fixed bug #43596 IGMP queries from 0.0.0.0 are discarded\n\n  2014-10-21: Simon Goldschmidt (patch by Joel Cunningham and Albert Huitsing)\n  * sockts.c: fixed bugs #41495 Possible threading issue in select() and #43278\n    event_callback() handle context switch when calling sys_sem_signal()\n\n  2014-10-21: Simon Goldschmidt\n  * api_msg.c: fixed bug #38219 Assert on TCP netconn_write with sndtimeout set\n\n  2014-09-16: Kevin Cernekee\n  * dns.c: patch #8480 Fix handling of dns_seqno wraparound\n\n  2014-09-16: Simon Goldschmidt\n  * tcp_out.c: fixed bug #43192 tcp_enqueue_flags() should not check TCP_SND_QUEUELEN\n    when sending FIN\n\n  2014-09-03: Simon Goldschmidt\n  * msg_in.c: fixed bug #39355 SNMP Memory Leak in case of error\n\n  2014-09-02: Simon Goldschmidt\n  * err.h/.c, sockets.c, api_msg.c: fixed bug #43110 call getpeername() before\n    listen() will cause a error\n\n  2014-09-02: Simon Goldschmidt\n  * sockets.c: fixed bug #42117 lwip_fcntl does not set errno\n\n  2014-09-02: Simon Goldschmidt\n  * tcp.c: fixed bug #42299 tcp_abort() leaves freed pcb on tcp_bound_pcbs list\n\n  2014-08-20: Simon Goldschmidt\n  * dns.c: fixed bug #42987 lwIP is vulnerable to DNS cache poisoning due to\n    non-randomized TXIDs\n\n  2014-06-03: Simon Goldschmidt\n  * tcp_impl.h, tcp_in.c: fixed bug #37969 SYN packet dropped as short packet in\n    tcp_input function\n\n  2014-05-20: Simon Goldschmidt\n  * tcp_out.c: fixed bug #37184 tcp_write problem for pcbs in the SYN_SENT state\n\n  2014-05-19: Simon Goldschmidt\n  * *.h: Fixed bug #35874 reserved identifier violation (removed leading underscores\n    from header include guards)\n\n  2014-04-08: Simon Goldschmidt\n  * tcp.c: Fixed bug #36167 tcp server crash when client closes (maximum window)\n\n  2014-04-06: Simon Goldschmidt\n  * tcp_in.c: Fixed bug #36210 lwIP does not elicit an empty ACK when received\n    unacceptable ACK\n\n  2014-04-06: Simon Goldschmidt\n  * dhcp.c, ip4.c/.h, ip6.c/.h, udp.c/.h, ip.h: Fixed bug #41787 DHCP Discovery\n    is invalid when an IP is set to thet netif.\n\n  2014-03-14: Simon Goldschmidt\n  * tcp_out.c: Fixed bug #36153 TCP Cheksum error if LWIP_CHECKSUM_ON_COPY=1\n\n  2014-03-11: Simon Goldschmidt (patch by Mason)\n  * opt.h, sockets.c: fixed bug #35928 BSD sockets functions must set errno for\n    POSIX-compliance\n\n  2014-02-27: Simon Goldschmidt\n  * dhcp.c: fixed bug #40303 DHCP xid renewed when sending a DHCPREQUEST\n\n  2014-02-27: Simon Goldschmidt\n  * raw.c: fixed bug #41680 raw socket can not receive IPv6 packet when\n    IP_SOF_BROADCAST_RECV==1\n\n  2014-02-27: Simon Goldschmidt\n  * api_msg.c, sockets.c: fixed bug #38404 getpeeraddr returns success on\n    unconnected/listening TCP sockets\n\n  2014-02-27: Simon Goldschmidt\n  * sockets.c: fixed bug #41729 Some socket functions return Exyz instead of -1\n\n  2014-02-25: Simon Goldschmidt\n  * ip4.c: fixed bug #39514 ip_route() may return an IPv6-only interface\n\n  2014-02-25: Simon Goldschmidt, patch by Fatih Asici\n  * pbuf.c: fixed bug #39356 Wrong increment in pbuf_memfind()\n\n  2014-02-25: Simon Goldschmidt\n  * netif.c/.h, udp.c: fixed bug #39225 udp.c uses netif_matches_ip6_addr() incorrectly;\n    renamed function netif_matches_ip6_addr() to netif_get_ip6_addr_match()\n\n  2014-02-25: Simon Goldschmidt\n  * igmp.c: fixed bug #39145 IGMP membership report for 224.0.0.1\n\n  2014-02-22: Simon Goldschmidt (patch by Amir Shalem)\n  * etharp.c, opt.h: fixed bug #34681 Limit ARP queue length by ARP_QUEUE_LEN (=3)\n\n  2014-02-22: Simon Goldschmidt (patch by Amir Shalem)\n  * etharp.h/.c: fixed bug #34682 Limit ARP request flood for unresolved entry\n\n  2014-02-20: Simon Goldschmidt\n  * tcp_out.c: fixed bug #39683 Assertion \"seg->tcphdr not aligned\" failed with\n    MEM_ALIGNMENT = 8\n\n  2014-02-20: Simon Goldschmidt\n  * sockets.c: fixed bug #39882 No function shall set errno to 0\n\n  2014-02-20: Simon Goldschmidt\n  * mib_structs.c: fixed bug #40050 SNMP problem with MIB arrays > 255\n\n  2014-02-20: Simon Goldschmidt\n  * api.h, sockets.c: fixed bug #41499 netconn::recv_avail can overflow\n\n  2014-01-08: Stathis Voukelatos\n  * memp_std.h: patch #7928 Fixed size calculation in MALLOC memory pool\n    creation macro\n\n  2014-01-18: Brian Fahs\n  * tcp_out.c: patch #8237: tcp_rexmit_rto fails to update pcb->unsent_oversize\n    when necessary\n\n  2014-01-17: Grant Erickson, Jay Logue, Simon Goldschmidt\n  * ipv6.c, netif.c: patch #7913 Enable Support for IPv6 Loopback\n\n  2014-01-16: Stathis Voukelatos\n  * netif.c: patch #7902 Fixed netif_poll() operation when LWIP_LOOPBACK_MAX_PBUFS > 0\n\n  2014-01-14: \"Freddie Chopin\"\n  * snmp.h, mib2.c: fixed constness and spelling of sysdescr\n\n  2014-01-14: Simon Goldschmidt (patch by Thomas Faber)\n  * tcpip.c: patch #8241: Fix implicit declaration of ip_input with\n    LWIP_TCPIP_CORE_LOCKING_INPUT disabled\n\n  2014-01-14: chrysn\n  * timers.c: patch #8244 make timeouts usable reliably from outside of the\n    timeout routine\n\n  2014-01-10: Simon Goldschmidt\n  * ip_frag.c, ip6_frag.c: fixed bug #41041 Potential use-after-free in IPv6 reassembly\n\n  2014-01-10: Simon Goldschmidt\n  * memp.c: fixed bug #41188 Alignment error in memp_init() when MEMP_SEPARATE_POOLS==1\n\n  2014-01-10: Simon Goldschmidt\n  * tcp.c: fixed bug #39898 tcp_fasttmr() possible lock due to infinte queue process loop\n\n  2013-06-29: Simon Goldschmidt\n  * inet.h, sockets.h: partially fixed bug #37585: IPv6 compatibility (in socket structs)\n\n  2013-06-29: Simon Goldschmidt\n  * inet6.h: bug #37585/task #12600: fixed struct in6_addr.s6_addr to conform to spec\n\n  2013-04-24: patch by Liam <morepork>\n  * api_msg.c: patch #8008 Fix a potential null pointer dereference in assert\n\n  2013-04-24: Simon Goldschmidt\n  * igmp.c: fixed possible division by zero\n\n  2013-04-24: Simon Goldschmidt\n  * ip6.h, some ipv6 C files: fixed bug #38526 Coverity: Recursive Header Inclusion in ip6.h\n\n  2013-04-24: Simon Goldschmidt (patch by Emil Ljungdahl):\n  * netif.c: fixed bug #38586 netif_loop_output() \"deadlocks\"\n\n  2013-01-15: Simon Goldschmidt\n  * ip4.c: fixed bug #37665 ip_canforward operates on address in wrong byte order\n\n  2013-01-15: Simon Goldschmidt\n  * pbuf.h: fixed bug #38097 pbuf_free_ooseq() warning\n\n  2013-01-14: Simon Goldschmidt\n  * dns.c: fixed bug #37705 Possible memory corruption in DNS query\n\n  2013-01-11: Simon Goldschmidt\n  * raw.c: fixed bug #38066 Raw pcbs can alter packet without eating it\n\n  2012-08-22: Simon Goldschmidt\n  * memp.c: fixed bug #37166: memp_sanity check loops itself\n\n  2012-08-13: Simon Goldschmidt\n  * dhcp.c: fixed bug #36645: Calling dhcp_release before dhcp_start\n    dereferences NULL\n\n  2012-08-13: Simon Goldschmidt\n  * msg_out.c: fixed bug #36840 snmp_send_trap() NULL de-reference if traps\n    configured but no interfaces available\n\n  2012-08-13: Simon Goldschmidt\n  * dns.c: fixed bug #36899 DNS TTL 0 is cached for a long time\n\n  2012-05-11: Simon Goldschmidt (patch by Marty)\n  * memp.c: fixed bug #36412: memp.c does not compile when\n    MEMP_OVERFLOW_CHECK > zero and MEMP_SEPARATE_POOLS == 1\n\n  2012-05-03: Simon Goldschmidt (patch by Sylvain Rochet)\n  * ppp.c: fixed bug #36283 (PPP struct used on header size computation and\n    not packed)\n\n  2012-05-03: Simon Goldschmidt (patch by David Empson)\n  * ppp.c: fixed bug #36388 (PPP: checksum-only in last pbuf leads to pbuf with\n    zero length)\n\n  2012-03-25: Simon Goldschmidt\n  * api_msg.c: Fixed bug #35817: do_connect() invalidly signals op_completed\n    for UDP/RAW with LWIP_TCPIP_CORE_LOCKING==1\n\n  2012-03-25: Simon Goldschmidt\n  * api_msg.h, api_lib.c, api_msg.c, netifapi.c: fixed bug #35931: Name space\n    pollution in api_msg.c and netifapi.c\n\n  2011-08-24: Simon Goldschmidt\n  * inet6.h: fixed bug #34124 struct in6_addr does not conform to the standard\n\n\n\n(STABLE-1.4.1)\n\n  ++ New features:\n\n  2012-03-25: Simon Goldschmidt (idea by Mason)\n  * posix/*: added posix-compatibility include files posix/netdb.h and posix/sys/socket.h\n    which are a simple wrapper to the correct lwIP include files.\n \n  2012-01-16: Simon Goldschmidt\n  * opt.h, icmp.c: Added option CHECKSUM_GEN_ICMP\n\n  2011-12-17: Simon Goldschmidt\n  * ip.h: implemented API functions to access so_options of IP pcbs (UDP, TCP, RAW)\n    (fixes bug #35061)\n\n  2011-09-27: Simon Goldschmidt\n  * opt.h, tcp.c, tcp_in.c: Implemented limiting data on ooseq queue (task #9989)\n    (define TCP_OOSEQ_MAX_BYTES / TCP_OOSEQ_MAX_PBUFS in lwipopts.h)\n\n  2011-09-21: Simon Goldschmidt\n  * opt.h, api.h, api_lib.c, api_msg.h/.c, sockets.c: Implemented timeout on\n    send (TCP only, bug #33820)\n\n  2011-09-21: Simon Goldschmidt\n  * init.c: Converted runtime-sanity-checks into compile-time checks that can\n    be disabled (since runtime checks can often not be seen on embedded targets)\n\n  2011-09-11: Simon Goldschmidt\n  * ppp.h, ppp_impl.h: splitted ppp.h to an internal and external header file\n    to get a clear separation of which functions an application or port may use\n    (task #11281)\n\n 2011-09-11: Simon Goldschmidt\n  * opt.h, tcp_impl.h, tcp.c, udp.h/.c: Added a config option to randomize\n    initial local TCP/UDP ports (so that different port ranges are used after\n    a reboot; bug #33818; this one added tcp_init/udp_init functions again)\n\n  2011-09-03: Simon Goldschmidt\n  * dhcp.c: DHCP uses LWIP_RAND() for xid's (bug #30302)\n\n  2011-08-24: Simon Goldschmidt\n  * opt.h, netif.h/.c: added netif remove callback (bug #32397)\n\n  2011-07-26: Simon Goldschmidt\n  * etharp.c: ETHARP_SUPPORT_VLAN: add support for an external VLAN filter\n    function instead of only checking for one VLAN (define ETHARP_VLAN_CHECK_FN)\n\n  2011-07-21: Simon Goldschmidt (patch by hanhui)\n  * ip4.c, etharp.c, pbuf.h: bug #33634 ip_forward() have a faulty behaviour:\n    Added pbuf flags to mark incoming packets as link-layer broadcast/multicast.\n    Also added code to allow ip_forward() to forward non-broadcast packets to\n    the input netif (set IP_FORWARD_ALLOW_TX_ON_RX_NETIF==1).\n\n  2011-06-26: Simon Goldschmidt (patch by Cameron Gutman)\n  * tcp.c, tcp_out.c: bug #33604: added some more asserts to check that\n    pcb->state != LISTEN\n\n   2011-05-14: Simon Goldschmidt (patch by Stéphane Lesage)\n  * tcpip.c/.h: patch #7449 allow tcpip callback from interrupt with static\n    memory message\n\n\n  ++ Bugfixes:\n\n  2012-09-26: Simon Goldschmidt\n  * api_msg.c: fixed bug #37405 'err_tcp()' uses already freed 'netconn' object\n\n  2012-09-26: patch by Henrik Persson\n  * dhcp.c: patch #7843 Fix corner case with dhcp timeouts\n\n  2012-09-26: patch by Henrik Persson\n  * dhcp.c: patch #7840 Segfault in dhcp_parse_reply if no end marker in dhcp packet\n\n  2012-08-22: Simon Goldschmidt\n  * memp.c: fixed bug #37166: memp_sanity check loops itself\n\n  2012-05-08: Simon Goldschmidt\n  * tcp_out.c: fixed bug: #36380 unsent_oversize mismatch in 1.4.1RC1 (this was\n    a debug-check issue only)\n\n  2012-03-27: Simon Goldschmidt\n  * vj.c: fixed bug #35756 header length calculation problem in ppp/vj.c\n\n  2012-03-27: Simon Goldschmidt (patch by Mason)\n  * tcp_out.c: fixed bug #35945: SYN packet should provide the recv MSS not the\n    send MSS\n\n  2012-03-22: Simon Goldschmidt\n  * ip4.c: fixed bug #35927: missing refragmentaion in ip_forward\n \n  2012-03-20: Simon Goldschmidt (patch by Mason)\n  * netdb.c: fixed bug #35907: lwip_gethostbyname_r returns an invalid h_addr_list\n \n  2012-03-12: Simon Goldschmidt (patch by Bostjan Meglic)\n  * ppp.c: fixed bug #35809: PPP GetMask(): Compiler warning on big endian,\n    possible bug on little endian system\n\n  2012-02-23: Simon Goldschmidt\n  * etharp.c: fixed bug #35595: Impossible to send broadcast without a gateway\n    (introduced when fixing bug# 33551)\n\n  2012-02-16: Simon Goldschmidt\n  * ppp.c: fixed pbuf leak when PPP session is aborted through pppSigHUP()\n    (bug #35541: PPP Memory Leak)\n\n  2012-02-16: Simon Goldschmidt\n  * etharp.c: fixed bug #35531: Impossible to send multicast without a gateway\n    (introduced when fixing bug# 33551)\n\n  2012-02-16: Simon Goldschmidt (patch by Stéphane Lesage)\n  * msg_in.c, msg_out.c: fixed bug #35536 SNMP: error too big response is malformed\n\n  2012-02-15: Simon Goldschmidt\n  * init.c: fixed bug #35537: MEMP_NUM_* sanity checks should be disabled with\n    MEMP_MEM_MALLOC==1\n\n  2012-02-12: Simon Goldschmidt\n  * tcp.h, tcp_in.c, tcp_out.c: partly fixed bug #25882: TCP hangs on\n    MSS > pcb->snd_wnd (by not creating segments bigger than half the window)\n\n  2012-02-11: Simon Goldschmidt\n  * tcp.c: fixed bug #35435: No pcb state check before adding it to time-wait\n    queue while closing\n\n  2012-01-22: Simon Goldschmidt\n  * tcp.c, tcp_in.c: fixed bug #35305: pcb may be freed too early on shutdown(WR)\n\n  2012-01-21: Simon Goldschmidt\n  * tcp.c: fixed bug #34636: FIN_WAIT_2 - Incorrect shutdown of TCP pcb\n\n  2012-01-20: Simon Goldschmidt\n  * dhcp.c: fixed bug #35151: DHCP asserts on incoming option lengths\n\n 2012-01-20: Simon Goldschmidt\n  * pbuf.c: fixed bug #35291: NULL pointer in pbuf_copy\n\n  2011-11-25: Simon Goldschmidt\n  * tcp.h/.c, tcp_impl.h, tcp_in.c: fixed bug #31177: tcp timers can corrupt\n    tcp_active_pcbs in some cases\n\n  2011-11-23: Simon Goldschmidt\n  * sys.c: fixed bug #34884: sys_msleep() body needs to be surrounded with\n    '#ifndef sys_msleep'\n\n  2011-11-22: Simon Goldschmidt\n  * netif.c, etharp.h/.c: fixed bug #34684: Clear the arp table cache when\n    netif is brought down\n\n  2011-10-28: Simon Goldschmidt\n  * tcp_in.c: fixed bug #34638: Dead code in tcp_receive - pcb->dupacks\n\n  2011-10-23: Simon Goldschmidt\n  * mem.c: fixed bug #34429: possible memory corruption with\n    LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT set to 1\n\n  2011-10-18: Simon Goldschmidt\n  * arch.h, netdb.c: fixed bug #34592: lwip_gethostbyname_r uses nonstandard\n    error value\n\n  2011-10-18: Simon Goldschmidt\n  * opt.h: fixed default values of TCP_SNDLOWAT and TCP_SNDQUEUELOWAT for small\n    windows (bug #34176 select after non-blocking send times out)\n\n  2011-10-18: Simon Goldschmidt\n  * tcp_impl.h, tcp_out.c: fixed bug #34587: TCP_BUILD_MSS_OPTION doesn't\n    consider netif->mtu, causes slow network\n\n  2011-10-18: Simon Goldschmidt\n  * sockets.c: fixed bug #34581 missing parentheses in udplite sockets code\n\n  2011-10-18: Simon Goldschmidt\n  * sockets.h: fixed bug #34580 fcntl() is missing in LWIP_COMPAT_SOCKETS\n\n  2011-10-17: Simon Goldschmidt\n  * api_msg.c: fixed bug #34569: shutdown(SHUT_WR) crashes netconn/socket api\n\n  2011-10-13: Simon Goldschmidt\n  * tcp_in.c, tcp_out.c: fixed bug #34517 (persist timer is started although no\n    zero window is received) by starting the persist timer when a zero window is\n    received, not when we have more data queued for sending than fits into the\n    window\n\n  2011-10-13: Simon Goldschmidt\n  * def.h, timers.c: fixed bug #34541: LWIP_U32_DIFF is unnecessarily complex\n\n  2011-10-13: Simon Goldschmidt\n  * sockets.c, api_lib.c: fixed bug #34540: compiler error when CORE_LOCKING is\n    used and not all protocols are enabled\n\n  2011-10-12: Simon Goldschmidt\n  * pbuf.c: fixed bug #34534: Error in sending fragmented IP if MEM_ALIGNMENT > 4\n\n  2011-10-09: Simon Goldschmidt\n  * tcp_out.c: fixed bug #34426: tcp_zero_window_probe() transmits incorrect\n    byte value when pcb->unacked != NULL\n\n  2011-10-09: Simon Goldschmidt\n  * ip4.c: fixed bug #34447 LWIP_IP_ACCEPT_UDP_PORT(dst_port) wrong\n\n  2011-09-27: Simon Goldschmidt\n  * tcp_in.c, tcp_out.c: Reset pcb->unsent_oversize in 2 more places...\n\n  2011-09-27: Simon Goldschmidt\n  * tcp_in.c: fixed bug #28288: Data after FIN in oos queue\n\n  2011-09-27: Simon Goldschmidt\n  * dhcp.c: fixed bug #34406 dhcp_option_hostname() can overflow the pbuf\n\n  2011-09-24: Simon Goldschmidt\n  * mem.h: fixed bug #34377 MEM_SIZE_F is not defined if MEM_LIBC_MALLOC==1\n\n  2011-09-23: Simon Goldschmidt\n  * pbuf.h, tcp.c, tcp_in.c: fixed bug #33871: rejecting TCP_EVENT_RECV() for\n    the last packet including FIN can lose data\n\n  2011-09-22: Simon Goldschmidt\n  * tcp_impl.h: fixed bug #34355: nagle does not take snd_buf/snd_queuelen into\n    account\n\n  2011-09-21: Simon Goldschmidt\n  * opt.h: fixed default value of TCP_SND_BUF to not violate the sanity checks\n    in init.c\n\n  2011-09-20: Simon Goldschmidt\n  * timers.c: fixed bug #34337 (possible NULL pointer in sys_check_timeouts)\n\n  2011-09-11: Simon Goldschmidt\n  * tcp_out.c: use pcb->mss instead of TCP_MSS for preallocate mss-sized pbufs\n    (bug #34019)\n\n  2011-09-09: Simon Goldschmidt\n  * udp.c: fixed bug #34072: UDP broadcast is received from wrong UDP pcb if\n    udp port matches\n\n  2011-09-03: Simon Goldschmidt\n  * tcp_in.c: fixed bug #33952 PUSH flag in incoming packet is lost when packet\n    is aggregated and sent to application\n\n  2011-09-01: Simon Goldschmidt\n  * opt.h: fixed bug #31809 LWIP_EVENT_API in opts.h is inconsistent compared\n    to other options\n\n  2011-09-01: Simon Goldschmidt\n  * tcp_in.c: fixed bug #34111 RST for ACK to listening pcb has wrong seqno\n\n  2011-08-24: Simon Goldschmidt\n  * api_msg.c, sockets.c: fixed bug #33956 Wrong error returned when calling\n    accept() on UDP connections\n\n  2011-08-24: Simon Goldschmidt\n  * sockets.h: fixed bug #34057 socklen_t should be a typedef\n\n  2011-08-24: Simon Goldschmidt\n  * pbuf.c: fixed bug #34112 Odd check in pbuf_alloced_custom (typo)\n\n  2011-08-24: Simon Goldschmidt\n  * dhcp.c: fixed bug #34122 dhcp: hostname can overflow\n\n  2011-08-24: Simon Goldschmidt\n  * netif.c: fixed bug #34121 netif_add/netif_set_ipaddr fail on NULL ipaddr\n\n  2011-08-22: Simon Goldschmidt\n  * tcp_out.c: fixed bug #33962 TF_FIN not always set after FIN is sent. (This\n    merely prevents nagle from not transmitting fast after closing.)\n\n  2011-07-22: Simon Goldschmidt\n  * api_lib.c, api_msg.c, sockets.c, api.h: fixed bug #31084 (socket API returns\n    always EMSGSIZE on non-blocking sockets if data size > send buffers) -> now\n    lwip_send() sends as much as possible for non-blocking sockets\n\n  2011-07-22: Simon Goldschmidt\n  * pbuf.c/.h, timers.c: freeing ooseq pbufs when the pbuf pool is empty implemented\n    for NO_SYS==1: when not using sys_check_timeouts(), call PBUF_CHECK_FREE_OOSEQ()\n    at regular intervals from main level.\n\n  2011-07-21: Simon Goldschmidt\n  * etharp.c: fixed bug #33551 (ARP entries may time out although in use) by\n    sending an ARP request when an ARP entry is used in the last minute before\n    it would time out.\n\n  2011-07-04: Simon Goldschmidt\n  * sys_arch.txt: Fixed documentation after changing sys arch prototypes for 1.4.0.\n\n  2011-06-26: Simon Goldschmidt\n  * tcp.c: fixed bug #31723 (tcp_kill_prio() kills pcbs with the same prio) by\n    updating its documentation only.\n\n 2011-06-26: Simon Goldschmidt\n  * mem.c: fixed bug #33545: With MEM_USE_POOLS==1, mem_malloc can return an\n    unaligned pointer.\n\n  2011-06-26: Simon Goldschmidt\n  * mem.c: fixed bug #33544 \"warning in mem.c in lwip 1.4.0 with NO_SYS=1\"\n\n   2011-05-25: Simon Goldschmidt\n  * tcp.c: fixed bug #33398 (pointless conversion when checking TCP port range)\n\n\n\n(STABLE-1.4.0)\n\n  ++ New features:\n\n  2011-03-27: Simon Goldschmidt\n  * tcp_impl.h, tcp_in.c, tcp_out.c: Removed 'dataptr' from 'struct tcp_seg' and\n    calculate it in tcp_zero_window_probe (the only place where it was used).\n\n  2010-11-21: Simon Goldschmidt\n  * dhcp.c/.h: Added a function to deallocate the struct dhcp from a netif\n    (fixes bug #31525).\n\n  2010-07-12: Simon Goldschmidt (patch by Stephane Lesage)\n  * ip.c, udp.c/.h, pbuf.h, sockets.c: task #10495: Added support for\n    IP_MULTICAST_LOOP at socket- and raw-API level.\n\n  2010-06-16: Simon Goldschmidt\n  * ip.c: Added an optional define (LWIP_IP_ACCEPT_UDP_PORT) that can allow\n    link-layer-addressed UDP traffic to be received while a netif is down (just\n    like DHCP during configuration)\n\n  2010-05-22: Simon Goldschmidt\n  * many many files: bug #27352: removed packing from ip_addr_t, the packed\n    version is now only used in protocol headers. Added global storage for\n    current src/dest IP address while in input functions.\n\n  2010-05-16: Simon Goldschmidt\n  * def.h: task #10391: Add preprocessor-macros for compile-time htonl\n    calculation (and use them throughout the stack where applicable)\n\n  2010-05-16: Simon Goldschmidt\n  * opt.h, memp_std.h, memp.c, ppp_oe.h/.c: PPPoE now uses its own MEMP pool\n    instead of the heap (moved struct pppoe_softc from ppp_oe.c to ppp_oe.h)\n\n  2010-05-16: Simon Goldschmidt\n  * opt.h, memp_std.h, dns.h/.c: DNS_LOCAL_HOSTLIST_IS_DYNAMIC uses its own\n    MEMP pool instead of the heap\n\n  2010-05-13: Simon Goldschmidt\n  * tcp.c, udp.c: task #6995: Implement SO_REUSEADDR (correctly), added\n    new option SO_REUSE_RXTOALL to pass received UDP broadcast/multicast\n    packets to more than one pcb.\n\n  2010-05-02: Simon Goldschmidt\n  * netbuf.h/.c, sockets.c, api_msg.c: use checksum-on-copy for sending\n    UDP data for LWIP_NETIF_TX_SINGLE_PBUF==1\n\n  2010-04-30: Simon Goldschmidt\n  * udp.h/.c, pbuf.h/.c: task #6849: added udp_send(_to/_if) functions that\n    take a precalculated checksum, added pbuf_fill_chksum() to copy data\n    into a pbuf and at the same time calculating the checksum for that data\n\n  2010-04-29: Simon Goldschmidt\n  * ip_addr.h, etharp.h/.c, autoip.c: Create overridable macros for copying\n    2-byte-aligned IP addresses and MAC addresses\n\n  2010-04-28: Patch by Bill Auerbach\n  * ip.c: Inline generating IP checksum to save a function call\n\n  2010-04-14: Simon Goldschmidt\n  * tcpip.h/.c, timers.c: Added an overridable define to get informed when the\n    tcpip_thread processes messages or timeouts to implement a watchdog.\n\n  2010-03-28: Simon Goldschmidt\n  * ip_frag.c: create a new (contiguous) PBUF_RAM for every outgoing\n    fragment if LWIP_NETIF_TX_SINGLE_PBUF==1\n\n  2010-03-27: Simon Goldschmidt\n  * etharp.c: Speedup TX by moving code from find_entry to etharp_output/\n    etharp_query to prevent unnecessary function calls (inspired by\n    patch #7135).\n\n  2010-03-20: Simon Goldschmidt\n  * opt.h, tcpip.c/.h: Added an option to disable tcpip_(un)timeout code\n    since the linker cannot do this automatically to save space.\n\n  2010-03-20: Simon Goldschmidt\n  * opt.h, etharp.c/.h: Added support for static ARP table entries\n\n  2010-03-14: Simon Goldschmidt\n  * tcp_impl.h, tcp_out.c, inet_chksum.h/.c: task #6849: Calculate checksum\n    when creating TCP segments, not when (re-)transmitting them.\n\n  2010-03-07: Simon Goldschmidt\n  * sockets.c: bug #28775 (select/event_callback: only check select_cb_list\n    on change) plus use SYS_LIGHTWEIGHT_PROT to protect the select code.\n    This should speed up receiving data on sockets as the select code in\n    event_callback is only executed when select is waiting.\n\n  2010-03-06: Simon Goldschmidt\n  * tcp_out.c: task #7013 (Create option to have all packets delivered to\n    netif->output in one piece): Always copy to try to create single pbufs\n    in tcp_write.\n\n  2010-03-06: Simon Goldschmidt\n  * api.h, api_lib.c, sockets.c: task #10167 (sockets: speed up TCP recv\n    by not allocating a netbuf): added function netconn_recv_tcp_pbuf()\n    for tcp netconns to receive pbufs, not netbufs; use that function\n    for tcp sockets.\n\n  2010-03-05: Jakob Ole Stoklundsen / Simon Goldschmidt\n  * opt.h, tcp.h, tcp_impl.h, tcp.c, tcp_in.c, tcp_out.c: task #7040:\n    Work on tcp_enqueue: Don't waste memory when chaining segments,\n    added option TCP_OVERSIZE to prevent creating many small pbufs when\n    calling tcp_write with many small blocks of data. Instead, pbufs are\n    allocated larger than needed and the space is used for later calls to\n    tcp_write.\n\n  2010-02-21: Simon Goldschmidt\n  * stats.c/.h: Added const char* name to mem- and memp-stats for easier\n    debugging.\n\n  2010-02-21: Simon Goldschmidt\n  * tcp.h (and usages), added tcp_impl.h: Splitted API and internal\n    implementation of tcp to make API usage cleare to application programmers\n\n  2010-02-14: Simon Goldschmidt/Stephane Lesage\n  * ip_addr.h: Improved some defines working on ip addresses, added faster\n    macro to copy addresses that cannot be NULL\n\n  2010-02-13: Simon Goldschmidt\n  * api.h, api_lib.c, api_msg.c, sockets.c: task #7865 (implement non-\n    blocking send operation)\n\n  2010-02-12: Simon Goldschmidt\n  * sockets.c/.h: Added a minimal version of posix fctl() to have a\n    standardised way to set O_NONBLOCK for nonblocking sockets.\n\n  2010-02-12: Simon Goldschmidt\n  * dhcp.c/.h, autoip.c/.h: task #10139 (Prefer statically allocated\n    memory): added autoip_set_struct() and dhcp_set_struct() to let autoip\n    and dhcp work with user-allocated structs instead of callin mem_malloc\n\n  2010-02-12: Simon Goldschmidt/Jeff Barber\n  * tcp.c/h: patch #6865 (SO_REUSEADDR for TCP): if pcb.so_options has\n    SOF_REUSEADDR set, allow binding to endpoint in TIME_WAIT\n\n  2010-02-12: Simon Goldschmidt\n  * sys layer: task #10139 (Prefer statically allocated memory): converted\n    mbox and semaphore functions to take pointers to sys_mbox_t/sys_sem_t;\n    converted sys_mbox_new/sys_sem_new to take pointers and return err_t;\n    task #7212: Add Mutex concept in sys_arch (define LWIP_COMPAT_MUTEX\n    to let sys.h use binary semaphores instead of mutexes - as before)\n\n  2010-02-09: Simon Goldschmidt (Simon Kallweit)\n  * timers.c/.h: Added function sys_restart_timeouts() from patch #7085\n    (Restart system timeout handling)\n\n  2010-02-09: Simon Goldschmidt\n  * netif.c/.h, removed loopif.c/.h: task #10153 (Integrate loopif into\n    netif.c) - loopif does not have to be created by the port any more,\n    just define LWIP_HAVE_LOOPIF to 1.\n\n  2010-02-08: Simon Goldschmidt\n  * inet.h, ip_addr.c/.h: Added reentrant versions of inet_ntoa/ipaddr_ntoa\n    inet_ntoa_r/ipaddr_ntoa_r\n\n  2010-02-08: Simon Goldschmidt\n  * netif.h: Added netif_s/get_igmp_mac_filter() macros\n\n  2010-02-05: Simon Goldschmidt\n  * netif.h: Added function-like macros to get/set the hostname on a netif\n\n  2010-02-04: Simon Goldschmidt\n  * nearly every file: Replaced struct ip_addr by typedef ip_addr_t to\n    make changing the actual implementation behind the typedef easier.\n\n  2010-02-01: Simon Goldschmidt\n  * opt.h, memp_std.h, dns.h, netdb.c, memp.c: Let netdb use a memp pool\n    for allocating memory when getaddrinfo() is called.\n\n  2010-01-31: Simon Goldschmidt\n  * dhcp.h, dhcp.c: Reworked the code that parses DHCP options: parse\n    them once instead of parsing for every option. This also removes\n    the need for mem_malloc from dhcp_recv and makes it possible to\n    correctly retrieve the BOOTP file.\n\n  2010-01-30: simon Goldschmidt\n  * sockets.c: Use SYS_LIGHTWEIGHT_PROT instead of a semaphore to protect\n    the sockets array.\n\n  2010-01-29: Simon Goldschmidt (patch by Laura Garrett)\n  * api.h, api_msg.c, sockets.c: Added except set support in select\n    (patch #6860)\n\n  2010-01-29: Simon Goldschmidt (patch by Laura Garrett)\n  * api.h, sockets.h, err.h, api_lib.c, api_msg.c, sockets.c, err.c:\n    Add non-blocking support for connect (partly from patch #6860),\n    plus many cleanups in socket & netconn API.\n\n  2010-01-27: Simon Goldschmidt\n  * opt.h, tcp.h, init.c, api_msg.c: Added TCP_SNDQUEUELOWAT corresponding\n    to TCP_SNDLOWAT and added tcp_sndqueuelen() - this fixes bug #28605\n\n  2010-01-26: Simon Goldschmidt\n  * snmp: Use memp pools for snmp instead of the heap; added 4 new pools.\n\n  2010-01-14: Simon Goldschmidt\n  * ppp.c/.h: Fixed bug #27856: PPP: Set netif link- and status-callback\n    by adding ppp_set_netif_statuscallback()/ppp_set_netif_linkcallback()\n\n  2010-01-13: Simon Goldschmidt\n  * mem.c: The heap now may be moved to user-defined memory by defining\n    LWIP_RAM_HEAP_POINTER as a void pointer to that memory's address\n    (patch #6966 and bug #26133)\n\n  2010-01-10: Simon Goldschmidt (Bill Auerbach)\n  * opt.h, memp.c: patch #6822 (Add option to place memory pools in\n    separate arrays)\n\n  2010-01-10: Simon Goldschmidt\n  * init.c, igmp.c: patch #6463 (IGMP - Adding Random Delay): added define\n    LWIP_RAND() for lwip-wide randomization (to be defined in cc.h)\n\n  2009-12-31: Simon Goldschmidt\n  * tcpip.c, init.c, memp.c, sys.c, memp_std.h, sys.h, tcpip.h\n    added timers.c/.h: Separated timer implementation from semaphore/mbox\n    implementation, moved timer implementation to timers.c/.h, timers are\n    now only called from tcpip_thread or by explicitly checking them.\n    (TASK#7235)\n\n  2009-12-27: Simon Goldschmidt\n  * opt.h, etharp.h/.c, init.c, tcpip.c: Added an additional option\n    LWIP_ETHERNET to support ethernet without ARP (necessary for pure PPPoE)\n\n\n  ++ Bugfixes:\n\n  2011-04-20: Simon Goldschmidt\n  * sys_arch.txt: sys_arch_timeouts() is not needed any more.\n\n  2011-04-13: Simon Goldschmidt\n  * tcp.c, udp.c: Fixed bug #33048 (Bad range for IP source port numbers) by\n    using ports in the IANA private/dynamic range (49152 through 65535).\n\n  2011-03-29: Simon Goldschmidt, patch by Emil Lhungdahl:\n  * etharp.h/.c: Fixed broken VLAN support.\n\n  2011-03-27: Simon Goldschmidt\n  * tcp.c: Fixed bug #32926 (TCP_RMV(&tcp_bound_pcbs) is called on unbound tcp\n    pcbs) by checking if the pcb was bound (local_port != 0).\n\n  2011-03-27: Simon Goldschmidt\n  * ppp.c: Fixed bug #32280 (ppp: a pbuf is freed twice)\n\n  2011-03-27: Simon Goldschmidt\n  * sockets.c: Fixed bug #32906: lwip_connect+lwip_send did not work for udp and\n    raw pcbs with LWIP_TCPIP_CORE_LOCKING==1.\n  \n  2011-03-27: Simon Goldschmidt\n  * tcp_out.c: Fixed bug #32820 (Outgoing TCP connections created before route\n    is present never times out) by starting retransmission timer before checking\n    route.\n\n  2011-03-22: Simon Goldschmidt\n  * ppp.c: Fixed bug #32648 (PPP code crashes when terminating a link) by only\n    calling sio_read_abort() if the file descriptor is valid.\n\n  2011-03-14: Simon Goldschmidt\n  * err.h/.c, sockets.c, api_msg.c: fixed bug #31748 (Calling non-blocking connect\n    more than once can render a socket useless) since it mainly involves changing\n    \"FATAL\" classification of error codes: ERR_USE and ERR_ISCONN just aren't fatal.\n\n  2011-03-13: Simon Goldschmidt\n  * sockets.c: fixed bug #32769 (ESHUTDOWN is linux-specific) by fixing\n    err_to_errno_table (ERR_CLSD: ENOTCONN instead of ESHUTDOWN), ERR_ISCONN:\n    use EALRADY instead of -1\n\n  2011-03-13: Simon Goldschmidt\n  * api_lib.c: netconn_accept: return ERR_ABRT instead of ERR_CLSD if the\n    connection has been aborted by err_tcp (since this is not a normal closing\n    procedure).\n\n  2011-03-13: Simon Goldschmidt\n  * tcp.c: tcp_bind: return ERR_VAL instead of ERR_ISCONN when trying to bind\n    with pcb->state != CLOSED\n\n  2011-02-17: Simon Goldschmidt\n  * rawapi.txt: Fixed bug #32561 tcp_poll argument definition out-of-order in\n    documentation\n\n  2011-02-17: Simon Goldschmidt\n  * many files: Added missing U/UL modifiers to fix 16-bit-arch portability.\n\n  2011-01-24: Simon Goldschmidt\n  * sockets.c: Fixed bug #31741: lwip_select seems to have threading problems\n\n  2010-12-02: Simon Goldschmidt\n  * err.h: Fixed ERR_IS_FATAL so that ERR_WOULDBLOCK is not fatal.\n\n  2010-11-23: Simon Goldschmidt\n  * api.h, api_lib.c, api_msg.c, sockets.c: netconn.recv_avail is only used for\n    LWIP_SO_RCVBUF and ioctl/FIONREAD.\n\n  2010-11-23: Simon Goldschmidt\n  * etharp.c: Fixed bug #31720: ARP-queueing: RFC 1122 recommends to queue at\n    least 1 packet -> ARP_QUEUEING==0 now queues the most recent packet.\n\n  2010-11-23: Simon Goldschmidt\n  * tcp_in.c: Fixed bug #30577: tcp_input: don't discard ACK-only packets after\n    refusing 'refused_data' again.\n  \n  2010-11-22: Simon Goldschmidt\n  * sockets.c: Fixed bug #31590: getsockopt(... SO_ERROR ...) gives EINPROGRESS\n    after a successful nonblocking connection.\n\n  2010-11-22: Simon Goldschmidt\n  * etharp.c: Fixed bug #31722: IP packets sent with an AutoIP source addr\n    must be sent link-local\n\n  2010-11-22: Simon Goldschmidt\n  * timers.c: patch #7329: tcp_timer_needed prototype was ifdef'ed out for\n    LWIP_TIMERS==0\n\n  2010-11-20: Simon Goldschmidt\n  * sockets.c: Fixed bug #31170: lwip_setsockopt() does not set socket number\n\n  2010-11-20: Simon Goldschmidt\n  * sockets.h: Fixed bug #31304: Changed SHUT_RD, SHUT_WR and SHUT_RDWR to\n    resemble other stacks.\n\n  2010-11-20: Simon Goldschmidt\n  * dns.c: Fixed bug #31535: TCP_SND_QUEUELEN must be at least 2 or else\n    no-copy TCP writes will never succeed.\n\n  2010-11-20: Simon Goldschmidt\n  * dns.c: Fixed bug #31701: Error return value from dns_gethostbyname() does\n    not match documentation: return ERR_ARG instead of ERR_VAL if not\n    initialized or wrong argument.\n\n  2010-10-20: Simon Goldschmidt\n  * sockets.h: Fixed bug #31385: sizeof(struct sockaddr) is 30 but should be 16\n\n  2010-10-05: Simon Goldschmidt\n  * dhcp.c: Once again fixed #30038: DHCP/AutoIP cooperation failed when\n    replugging the network cable after an AutoIP address was assigned.\n\n  2010-08-10: Simon Goldschmidt\n  * tcp.c: Fixed bug #30728: tcp_new_port() did not check listen pcbs\n\n  2010-08-03: Simon Goldschmidt\n  * udp.c, raw.c: Don't chain empty pbufs when sending them (fixes bug #30625)\n\n  2010-08-01: Simon Goldschmidt (patch by Greg Renda)\n  * ppp.c: Applied patch #7264 (PPP protocols are rejected incorrectly on big\n    endian architectures)\n  \n  2010-07-28: Simon Goldschmidt\n  * api_lib.c, api_msg.c, sockets.c, mib2.c: Fixed compilation with TCP or UDP\n    disabled.\n  \n  2010-07-27: Simon Goldschmidt\n  * tcp.c: Fixed bug #30565 (tcp_connect() check bound list): that check did no\n    harm but never did anything\n  \n  2010-07-21: Simon Goldschmidt\n  * ip.c: Fixed invalid fix for bug #30402 (CHECKSUM_GEN_IP_INLINE does not\n    add IP options)\n\n  2010-07-16: Kieran Mansley\n  * msg_in.c: Fixed SNMP ASN constant defines to not use ! operator \n\n  2010-07-10: Simon Goldschmidt\n  * ip.c: Fixed bug #30402: CHECKSUM_GEN_IP_INLINE does not add IP options\n\n  2010-06-30: Simon Goldschmidt\n  * api_msg.c: fixed bug #30300 (shutdown parameter was not initialized in\n    netconn_delete)\n\n  2010-06-28: Kieran Mansley\n  * timers.c remove unportable printing of C function pointers\n\n  2010-06-24: Simon Goldschmidt\n  * init.c, timers.c/.h, opt.h, memp_std.h: From patch #7221: added flag\n    NO_SYS_NO_TIMERS to drop timer support for NO_SYS==1 for easier upgrading\n\n  2010-06-24: Simon Goldschmidt\n  * api(_lib).c/.h, api_msg.c/.h, sockets.c/.h: Fixed bug #10088: Correctly\n    implemented shutdown at socket level.\n\n  2010-06-21: Simon Goldschmidt\n  * pbuf.c/.h, ip_frag.c/.h, opt.h, memp_std.h: Fixed bug #29361 (ip_frag has\n    problems with zero-copy DMA MACs) by adding custom pbufs and implementing\n    custom pbufs that reference other (original) pbufs. Additionally set\n    IP_FRAG_USES_STATIC_BUF=0 as default to be on the safe side.\n\n  2010-06-15: Simon Goldschmidt\n  * dhcp.c: Fixed bug #29970: DHCP endian issue parsing option responses\n\n  2010-06-14: Simon Goldschmidt\n  * autoip.c: Fixed bug #30039: AutoIP does not reuse previous addresses\n\n  2010-06-12: Simon Goldschmidt\n  * dhcp.c: Fixed bug #30038: dhcp_network_changed doesn't reset AUTOIP coop\n    state\n\n  2010-05-17: Simon Goldschmidt\n  * netdb.c: Correctly NULL-terminate h_addr_list\n\n  2010-05-16: Simon Goldschmidt\n  * def.h/.c: changed the semantics of LWIP_PREFIX_BYTEORDER_FUNCS to prevent\n    \"symbol already defined\" i.e. when linking to winsock\n\n  2010-05-05: Simon Goldschmidt\n  * def.h, timers.c: Fixed bug #29769 (sys_check_timeouts: sys_now() may\n    overflow)\n\n  2010-04-21: Simon Goldschmidt\n  * api_msg.c: Fixed bug #29617 (sometime cause stall on delete listening\n    connection)\n\n  2010-03-28: Luca Ceresoli\n  * ip_addr.c/.h: patch #7143: Add a few missing const qualifiers\n\n  2010-03-27: Luca Ceresoli\n  * mib2.c: patch #7130: remove meaningless const qualifiers\n\n  2010-03-26: Simon Goldschmidt\n  * tcp_out.c: Make LWIP_NETIF_TX_SINGLE_PBUF work for TCP, too\n\n  2010-03-26: Simon Goldschmidt\n  * various files: Fixed compiling with different options disabled (TCP/UDP),\n    triggered by bug #29345; don't allocate acceptmbox if LWIP_TCP is disabled\n\n  2010-03-25: Simon Goldschmidt\n  * sockets.c: Fixed bug #29332: lwip_select() processes readset incorrectly\n\n  2010-03-25: Simon Goldschmidt\n  * tcp_in.c, test_tcp_oos.c: Fixed bug #29080: Correctly handle remote side\n    overrunning our rcv_wnd in ooseq case.\n\n  2010-03-22: Simon Goldschmidt\n  * tcp.c: tcp_listen() did not copy the pcb's prio.\n\n  2010-03-19: Simon Goldschmidt\n  * snmp_msg.c: Fixed bug #29256: SNMP Trap address was not correctly set\n\n  2010-03-14: Simon Goldschmidt\n  * opt.h, etharp.h: Fixed bug #29148 (Incorrect PBUF_POOL_BUFSIZE for ports\n    where ETH_PAD_SIZE > 0) by moving definition of ETH_PAD_SIZE to opt.h\n    and basing PBUF_LINK_HLEN on it.\n\n  2010-03-08: Simon Goldschmidt\n  * netif.c, ipv4/ip.c: task #10241 (AutoIP: don't break existing connections\n    when assiging routable address): when checking incoming packets and\n    aborting existing connection on address change, filter out link-local\n    addresses.\n\n  2010-03-06: Simon Goldschmidt\n  * sockets.c: Fixed LWIP_NETIF_TX_SINGLE_PBUF for LWIP_TCPIP_CORE_LOCKING\n\n  2010-03-06: Simon Goldschmidt\n  * ipv4/ip.c: Don't try to forward link-local addresses\n\n  2010-03-06: Simon Goldschmidt\n  * etharp.c: Fixed bug #29087: etharp: don't send packets for LinkLocal-\n    addresses to gw\n\n  2010-03-05: Simon Goldschmidt\n  * dhcp.c: Fixed bug #29072: Correctly set ciaddr based on message-type\n    and state.\n\n  2010-03-05: Simon Goldschmidt\n  * api_msg.c: Correctly set TCP_WRITE_FLAG_MORE when netconn_write is split\n    into multiple calls to tcp_write.    \n\n  2010-02-21: Simon Goldschmidt\n  * opt.h, mem.h, dns.c: task #10140: Remove DNS_USES_STATIC_BUF (keep\n    the implementation of DNS_USES_STATIC_BUF==1)\n\n  2010-02-20: Simon Goldschmidt\n  * tcp.h, tcp.c, tcp_in.c, tcp_out.c: Task #10088: Correctly implement\n    close() vs. shutdown(). Now the application does not get any more\n    recv callbacks after calling tcp_close(). Added tcp_shutdown().\n\n  2010-02-19: Simon Goldschmidt\n  * mem.c/.h, pbuf.c: Renamed mem_realloc() to mem_trim() to prevent\n    confusion with realloc()\n\n  2010-02-15: Simon Goldschmidt/Stephane Lesage\n  * netif.c/.h: Link status does not depend on LWIP_NETIF_LINK_CALLBACK\n    (fixes bug #28899)\n\n  2010-02-14: Simon Goldschmidt\n  * netif.c: Fixed bug #28877 (Duplicate ARP gratuitous packet with\n    LWIP_NETIF_LINK_CALLBACK set on) by only sending if both link- and\n    admin-status of a netif are up\n\n  2010-02-14: Simon Goldschmidt\n  * opt.h: Disable ETHARP_TRUST_IP_MAC by default since it slows down packet\n    reception and is not really necessary\n\n  2010-02-14: Simon Goldschmidt\n  * etharp.c/.h: Fixed ARP input processing: only add a new entry if a\n    request was directed as us (RFC 826, Packet Reception), otherwise\n    only update existing entries; internalized some functions\n\n  2010-02-14: Simon Goldschmidt\n  * netif.h, etharp.c, tcpip.c: Fixed bug #28183 (ARP and TCP/IP cannot be\n    disabled on netif used for PPPoE) by adding a new netif flag\n    (NETIF_FLAG_ETHERNET) that tells the stack the device is an ethernet\n    device but prevents usage of ARP (so that ethernet_input can be used\n    for PPPoE).\n\n  2010-02-12: Simon Goldschmidt\n  * netif.c: netif_set_link_up/down: only do something if the link state\n    actually changes\n\n  2010-02-12: Simon Goldschmidt/Stephane Lesage\n  * api_msg.c: Fixed bug #28865 (Cannot close socket/netconn in non-blocking\n    connect)\n\n  2010-02-12: Simon Goldschmidt\n  * mem.h: Fixed bug #28866 (mem_realloc function defined in mem.h)\n\n  2010-02-09: Simon Goldschmidt\n  * api_lib.c, api_msg.c, sockets.c, api.h, api_msg.h: Fixed bug #22110\n   (recv() makes receive window update for data that wasn't received by\n    application)\n\n  2010-02-09: Simon Goldschmidt/Stephane Lesage\n  * sockets.c: Fixed bug #28853 (lwip_recvfrom() returns 0 on receive time-out\n    or any netconn_recv() error)\n\n  2010-02-09: Simon Goldschmidt\n  * ppp.c: task #10154 (PPP: Update snmp in/out counters for tx/rx packets)\n\n  2010-02-09: Simon Goldschmidt\n  * netif.c: For loopback packets, adjust the stats- and snmp-counters\n    for the loopback netif.\n\n  2010-02-08: Simon Goldschmidt\n  * igmp.c/.h, ip.h: Moved most defines from igmp.h to igmp.c for clarity\n    since they are not used anywhere else.\n\n  2010-02-08: Simon Goldschmidt (Stéphane Lesage)\n  * igmp.c, igmp.h, stats.c, stats.h: Improved IGMP stats\n    (patch from bug #28798)\n\n  2010-02-08: Simon Goldschmidt (Stéphane Lesage)\n  * igmp.c: Fixed bug #28798 (Error in \"Max Response Time\" processing) and\n    another bug when LWIP_RAND() returns zero.\n\n  2010-02-04: Simon Goldschmidt\n  * nearly every file: Use macros defined in ip_addr.h (some of them new)\n    to work with IP addresses (preparation for bug #27352 - Change ip_addr\n    from struct to typedef (u32_t) - and better code).\n\n  2010-01-31: Simon Goldschmidt\n  * netif.c: Don't call the link-callback from netif_set_up/down() since\n    this invalidly retriggers DHCP.\n\n  2010-01-29: Simon Goldschmidt\n  * ip_addr.h, inet.h, def.h, inet.c, def.c, more: Cleanly separate the\n    portability file inet.h and its contents from the stack: moved htonX-\n    functions to def.h (and the new def.c - they are not ipv4 dependent),\n    let inet.h depend on ip_addr.h and not the other way round.\n    This fixes bug #28732.\n\n  2010-01-28: Kieran Mansley\n  * tcp.c: Ensure ssthresh >= 2*MSS\n\n  2010-01-27: Simon Goldschmidt\n  * tcp.h, tcp.c, tcp_in.c: Fixed bug #27871: Calling tcp_abort() in recv\n    callback can lead to accessing unallocated memory. As a consequence,\n    ERR_ABRT means the application has called tcp_abort()!\n\n  2010-01-25: Simon Goldschmidt\n  * snmp_structs.h, msg_in.c: Partly fixed bug #22070 (MIB_OBJECT_WRITE_ONLY\n    not implemented in SNMP): write-only or not-accessible are still\n    returned by getnext (though not by get)\n\n  2010-01-24: Simon Goldschmidt\n  * snmp: Renamed the private mib node from 'private' to 'mib_private' to\n    not use reserved C/C++ keywords\n\n  2010-01-23: Simon Goldschmidt\n  * sockets.c: Fixed bug #28716: select() returns 0 after waiting for less\n    than 1 ms\n\n  2010-01-21: Simon Goldschmidt\n  * tcp.c, api_msg.c: Fixed bug #28651 (tcp_connect: no callbacks called\n    if tcp_enqueue fails) both in raw- and netconn-API\n\n  2010-01-19: Simon Goldschmidt\n  * api_msg.c: Fixed bug #27316: netconn: Possible deadlock in err_tcp\n\n  2010-01-18: Iordan Neshev/Simon Goldschmidt\n  * src/netif/ppp: reorganised PPP sourcecode to 2.3.11 including some\n    bugfix backports from 2.4.x.\n\n  2010-01-18: Simon Goldschmidt\n  * mem.c: Fixed bug #28679: mem_realloc calculates mem_stats wrong\n\n  2010-01-17: Simon Goldschmidt\n  * api_lib.c, api_msg.c, (api_msg.h, api.h, sockets.c, tcpip.c):\n    task #10102: \"netconn: clean up conn->err threading issues\" by adding\n    error return value to struct api_msg_msg\n\n  2010-01-17: Simon Goldschmidt\n  * api.h, api_lib.c, sockets.c: Changed netconn_recv() and netconn_accept()\n    to return err_t (bugs #27709 and #28087)\n\n  2010-01-14: Simon Goldschmidt\n  * ...: Use typedef for function prototypes throughout the stack.\n\n  2010-01-13: Simon Goldschmidt\n  * api_msg.h/.c, api_lib.c: Fixed bug #26672 (close connection when receive\n    window = 0) by correctly draining recvmbox/acceptmbox\n\n  2010-01-11: Simon Goldschmidt\n  * pap.c: Fixed bug #13315 (PPP PAP authentication can result in\n    erroneous callbacks) by copying the code from recent pppd\n\n  2010-01-10: Simon Goldschmidt\n  * raw.c: Fixed bug #28506 (raw_bind should filter received packets)\n\n  2010-01-10: Simon Goldschmidt\n  * tcp.h/.c: bug #28127 (remove call to tcp_output() from tcp_ack(_now)())\n\n  2010-01-08: Simon Goldschmidt\n  * sockets.c: Fixed bug #28519 (lwip_recvfrom bug with len > 65535)\n\n  2010-01-08: Simon Goldschmidt\n  * dns.c: Copy hostname for DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1 since string\n    passed to dns_local_addhost() might be volatile\n\n  2010-01-07: Simon Goldschmidt\n  * timers.c, tcp.h: Call tcp_timer_needed() with NO_SYS==1, too\n\n  2010-01-06: Simon Goldschmidt\n  * netdb.h: Fixed bug #28496: missing include guards in netdb.h\n\n  2009-12-31: Simon Goldschmidt\n  * many ppp files: Reorganised PPP source code from ucip structure to pppd\n    structure to easily compare our code against the pppd code (around v2.3.1)\n\n  2009-12-27: Simon Goldschmidt\n  * tcp_in.c: Another fix for bug #28241 (ooseq processing) and adapted\n    unit test\n\n\n(STABLE-1.3.2)\n\n  ++ New features:\n\n  2009-10-27 Simon Goldschmidt/Stephan Lesage\n  * netifapi.c/.h: Added netifapi_netif_set_addr()\n\n  2009-10-07 Simon Goldschmidt/Fabian Koch\n  * api_msg.c, netbuf.c/.h, opt.h: patch #6888: Patch for UDP Netbufs to\n    support dest-addr and dest-port (optional: LWIP_NETBUF_RECVINFO)\n\n  2009-08-26 Simon Goldschmidt/Simon Kallweit\n  * slipif.c/.h: bug #26397: SLIP polling support\n\n  2009-08-25 Simon Goldschmidt\n  * opt.h, etharp.h/.c: task #9033: Support IEEE 802.1q tagged frame (VLAN),\n    New configuration options ETHARP_SUPPORT_VLAN and ETHARP_VLAN_CHECK.\n\n  2009-08-25 Simon Goldschmidt\n  * ip_addr.h, netdb.c: patch #6900: added define ip_ntoa(struct ip_addr*)\n\n  2009-08-24 Jakob Stoklund Olesen\n  * autoip.c, dhcp.c, netif.c: patch #6725: Teach AutoIP and DHCP to respond\n    to netif_set_link_up().\n\n  2009-08-23 Simon Goldschmidt\n  * tcp.h/.c: Added function tcp_debug_state_str() to convert a tcp state\n    to a human-readable string.\n\n  ++ Bugfixes:\n\n  2009-12-24: Kieran Mansley\n  * tcp_in.c Apply patches from Oleg Tyshev to improve OOS processing\n    (BUG#28241)\n\n  2009-12-06: Simon Goldschmidt\n  * ppp.h/.c: Fixed bug #27079 (Yet another leak in PPP): outpacket_buf can\n    be statically allocated (like in ucip)\n\n  2009-12-04: Simon Goldschmidt (patch by Ioardan Neshev)\n  * pap.c: patch #6969: PPP: missing PAP authentication UNTIMEOUT\n\n  2009-12-03: Simon Goldschmidt\n  * tcp.h, tcp_in.c, tcp_out.c: Fixed bug #28106: dup ack for fast retransmit\n    could have non-zero length\n\n  2009-12-02: Simon Goldschmidt\n  * tcp_in.c: Fixed bug #27904: TCP sends too many ACKs: delay resetting\n    tcp_input_pcb until after calling the pcb's callbacks\n\n  2009-11-29: Simon Goldschmidt\n  * tcp_in.c: Fixed bug #28054: Two segments with FIN flag on the out-of-\n    sequence queue, also fixed PBUF_POOL leak in the out-of-sequence code\n\n  2009-11-29: Simon Goldschmidt\n  * pbuf.c: Fixed bug #28064: pbuf_alloc(PBUF_POOL) is not thread-safe by\n    queueing a call into tcpip_thread to free ooseq-bufs if the pool is empty\n\n  2009-11-26: Simon Goldschmidt\n  * tcp.h: Fixed bug #28098: Nagle can prevent fast retransmit from sending\n    segment\n\n  2009-11-26: Simon Goldschmidt\n  * tcp.h, sockets.c: Fixed bug #28099: API required to disable Nagle\n    algorithm at PCB level\n\n  2009-11-22: Simon Goldschmidt\n  * tcp_out.c: Fixed bug #27905: FIN isn't combined with data on unsent\n\n  2009-11-22: Simon Goldschmidt (suggested by Bill Auerbach)\n  * tcp.c: tcp_alloc: prevent increasing stats.err for MEMP_TCP_PCB when\n    reusing time-wait pcb\n\n  2009-11-20: Simon Goldschmidt (patch by Albert Bartel)\n  * sockets.c: Fixed bug #28062: Data received directly after accepting\n    does not wake up select\n\n  2009-11-11: Simon Goldschmidt\n  * netdb.h: Fixed bug #27994: incorrect define for freeaddrinfo(addrinfo)\n\n  2009-10-30: Simon Goldschmidt\n  * opt.h: Increased default value for TCP_MSS to 536, updated default\n    value for TCP_WND to 4*TCP_MSS to keep delayed ACK working.\n\n  2009-10-28: Kieran Mansley\n  * tcp_in.c, tcp_out.c, tcp.h: re-work the fast retransmission code\n    to follow algorithm from TCP/IP Illustrated\n\n  2009-10-27: Kieran Mansley\n  * tcp_in.c: fix BUG#27445: grow cwnd with every duplicate ACK\n\n  2009-10-25: Simon Goldschmidt\n  * tcp.h: bug-fix in the TCP_EVENT_RECV macro (has to call tcp_recved if\n    pcb->recv is NULL to keep rcv_wnd correct)\n\n  2009-10-25: Simon Goldschmidt\n  * tcp_in.c: Fixed bug #26251: RST process in TIME_WAIT TCP state\n\n  2009-10-23: Simon Goldschmidt (David Empson)\n  * tcp.c: Fixed bug #27783: Silly window avoidance for small window sizes\n\n  2009-10-21: Simon Goldschmidt\n  * tcp_in.c: Fixed bug #27215: TCP sent() callback gives leading and\n    trailing 1 byte len (SYN/FIN)\n\n  2009-10-21: Simon Goldschmidt\n  * tcp_out.c: Fixed bug #27315: zero window probe and FIN\n\n  2009-10-19: Simon Goldschmidt\n  * dhcp.c/.h: Minor code simplification (don't store received pbuf, change\n    conditional code to assert where applicable), check pbuf length before\n    testing for valid reply\n\n  2009-10-19: Simon Goldschmidt\n  * dhcp.c: Removed most calls to udp_connect since they aren't necessary\n    when using udp_sendto_if() - always stay connected to IP_ADDR_ANY.\n\n  2009-10-16: Simon Goldschmidt\n  * ip.c: Fixed bug #27390: Source IP check in ip_input() causes it to drop\n    valid DHCP packets -> allow 0.0.0.0 as source address when LWIP_DHCP is\n    enabled\n\n  2009-10-15: Simon Goldschmidt (Oleg Tyshev)\n  * tcp_in.c: Fixed bug #27329: dupacks by unidirectional data transmit\n\n  2009-10-15: Simon Goldschmidt\n  * api_lib.c: Fixed bug #27709: conn->err race condition on netconn_recv()\n    timeout\n\n  2009-10-15: Simon Goldschmidt\n  * autoip.c: Fixed bug #27704: autoip starts with wrong address\n    LWIP_AUTOIP_CREATE_SEED_ADDR() returned address in host byte order instead\n    of network byte order\n\n  2009-10-11 Simon Goldschmidt (Jörg Kesten)\n  * tcp_out.c: Fixed bug #27504: tcp_enqueue wrongly concatenates segments\n    which are not consecutive when retransmitting unacked segments\n\n  2009-10-09 Simon Goldschmidt\n  * opt.h: Fixed default values of some stats to only be enabled if used\n    Fixes bug #27338: sys_stats is defined when NO_SYS = 1\n\n  2009-08-30 Simon Goldschmidt\n  * ip.c: Fixed bug bug #27345: \"ip_frag() does not use the LWIP_NETIF_LOOPBACK\n    function\" by checking for loopback before calling ip_frag\n\n  2009-08-25 Simon Goldschmidt\n  * dhcp.c: fixed invalid dependency to etharp_query if DHCP_DOES_ARP_CHECK==0\n\n  2009-08-23 Simon Goldschmidt\n  * ppp.c: bug #27078: Possible memory leak in pppInit()\n\n  2009-08-23 Simon Goldschmidt\n  * netdb.c, dns.c: bug #26657: DNS, if host name is \"localhost\", result\n    is error.\n\n  2009-08-23 Simon Goldschmidt\n  * opt.h, init.c: bug #26649: TCP fails when TCP_MSS > TCP_SND_BUF\n    Fixed wrong parenthesis, added check in init.c\n\n  2009-08-23 Simon Goldschmidt\n  * ppp.c: bug #27266: wait-state debug message in pppMain occurs every ms\n\n  2009-08-23 Simon Goldschmidt\n  * many ppp files: bug #27267: Added include to string.h where needed\n\n  2009-08-23 Simon Goldschmidt\n  * tcp.h: patch #6843: tcp.h macro optimization patch (for little endian)\n\n\n(STABLE-1.3.1)\n\n  ++ New features:\n\n  2009-05-10 Simon Goldschmidt\n  * opt.h, sockets.c, pbuf.c, netbuf.h, pbuf.h: task #7013: Added option\n    LWIP_NETIF_TX_SINGLE_PBUF to try to create transmit packets from only\n    one pbuf to help MACs that don't support scatter-gather DMA.\n\n  2009-05-09 Simon Goldschmidt\n  * icmp.h, icmp.c: Shrinked ICMP code, added option to NOT check icoming\n    ECHO pbuf for size (just use it): LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN\n\n  2009-05-05 Simon Goldschmidt, Jakob Stoklund Olesen\n  * ip.h, ip.c: Added ip_current_netif() & ip_current_header() to receive\n    extended info about the currently received packet.\n\n  2009-04-27 Simon Goldschmidt\n  * sys.h: Made SYS_LIGHTWEIGHT_PROT and sys_now() work with NO_SYS=1\n\n  2009-04-25 Simon Goldschmidt\n  * mem.c, opt.h: Added option MEM_USE_POOLS_TRY_BIGGER_POOL to try the next\n    bigger malloc pool if one is empty (only usable with MEM_USE_POOLS).\n\n  2009-04-21 Simon Goldschmidt\n  * dns.c, init.c, dns.h, opt.h: task #7507, patch #6786: DNS supports static\n    hosts table. New configuration options DNS_LOCAL_HOSTLIST and\n    DNS_LOCAL_HOSTLIST_IS_DYNAMIC. Also, DNS_LOOKUP_LOCAL_EXTERN() can be defined\n    as an external function for lookup.\n\n  2009-04-15 Simon Goldschmidt\n  * dhcp.c: patch #6763: Global DHCP XID can be redefined to something more unique\n\n  2009-03-31 Kieran Mansley\n  * tcp.c, tcp_out.c, tcp_in.c, sys.h, tcp.h, opts.h: add support for\n    TCP timestamp options, off by default.  Rework tcp_enqueue() to\n    take option flags rather than specified option data\n\n  2009-02-18 Simon Goldschmidt\n  * cc.h: Added printf formatter for size_t: SZT_F\n\n  2009-02-16 Simon Goldschmidt (patch by Rishi Khan)\n  * icmp.c, opt.h: patch #6539: (configurable) response to broadcast- and multicast\n    pings\n\n  2009-02-12 Simon Goldschmidt\n  * init.h: Added LWIP_VERSION to get the current version of the stack\n\n  2009-02-11 Simon Goldschmidt (suggested by Gottfried Spitaler)\n  * opt.h, memp.h/.c: added MEMP_MEM_MALLOC to use mem_malloc/mem_free instead\n    of the pool allocator (can save code size with MEM_LIBC_MALLOC if libc-malloc\n    is otherwise used)\n\n  2009-01-28 Jonathan Larmour (suggested by Bill Bauerbach)\n  * ipv4/inet_chksum.c, ipv4/lwip/inet_chksum.h: inet_chksum_pseudo_partial()\n  is only used by UDPLITE at present, so conditionalise it.\n\n  2008-12-03 Simon Goldschmidt (base on patch from Luca Ceresoli)\n  * autoip.c: checked in (slightly modified) patch #6683: Customizable AUTOIP\n    \"seed\" address. This should reduce AUTOIP conflicts if\n    LWIP_AUTOIP_CREATE_SEED_ADDR is overridden.\n\n  2008-10-02 Jonathan Larmour and Rishi Khan\n  * sockets.c (lwip_accept): Return EWOULDBLOCK if would block on non-blocking\n    socket.\n\n  2008-06-30 Simon Goldschmidt\n  * mem.c, opt.h, stats.h: fixed bug #21433: Calling mem_free/pbuf_free from\n    interrupt context isn't safe: LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT allows\n    mem_free to run between mem_malloc iterations. Added illegal counter for\n    mem stats.\n\n  2008-06-27 Simon Goldschmidt\n  * stats.h/.c, some other files: patch #6483: stats module improvement:\n    Added defines to display each module's statistic individually, added stats\n    defines for MEM, MEMP and SYS modules, removed (unused) rexmit counter.\n\n  2008-06-17 Simon Goldschmidt\n  * err.h: patch #6459: Made err_t overridable to use a more efficient type\n    (define LWIP_ERR_T in cc.h)\n\n  2008-06-17 Simon Goldschmidt\n  * slipif.c: patch #6480: Added a configuration option for slipif for symmetry\n    to loopif\n\n  2008-06-17 Simon Goldschmidt (patch by Luca Ceresoli)\n  * netif.c, loopif.c, ip.c, netif.h, loopif.h, opt.h: Checked in slightly\n    modified version of patch # 6370: Moved loopif code to netif.c so that\n    loopback traffic is supported on all netifs (all local IPs).\n    Added option to limit loopback packets for each netifs.\n\n\n  ++ Bugfixes:\n  2009-08-12 Kieran Mansley\n  * tcp_in.c, tcp.c: Fix bug #27209: handle trimming of segments when\n    out of window or out of order properly\n\n  2009-08-12 Kieran Mansley\n  * tcp_in.c: Fix bug #27199: use snd_wl2 instead of snd_wl1\n\n  2009-07-28 Simon Goldschmidt\n  * mem.h: Fixed bug #27105: \"realloc() cannot replace mem_realloc()\"s\n\n  2009-07-27 Kieran Mansley\n  * api.h api_msg.h netdb.h sockets.h: add missing #include directives\n\n  2009-07-09 Kieran Mansley\n  * api_msg.c, sockets.c, api.h: BUG23240 use signed counters for\n    recv_avail and don't increment counters until message successfully\n    sent to mbox\n\n  2009-06-25 Kieran Mansley\n  * api_msg.c api.h: BUG26722: initialise netconn write variables \n    in netconn_alloc\n\n  2009-06-25 Kieran Mansley\n  * tcp.h: BUG26879: set ret value in TCP_EVENT macros when function is not set\n\n  2009-06-25 Kieran Mansley\n  * tcp.c, tcp_in.c, tcp_out.c, tcp.h: BUG26301 and BUG26267: correct\n    simultaneous close behaviour, and make snd_nxt have the same meaning \n    as in the RFCs.\n\n  2009-05-12 Simon Goldschmidt\n  * etharp.h, etharp.c, netif.c: fixed bug #26507: \"Gratuitous ARP depends on\n    arp_table / uses etharp_query\" by adding etharp_gratuitous()\n\n  2009-05-12 Simon Goldschmidt\n  * ip.h, ip.c, igmp.c: bug #26487: Added ip_output_if_opt that can add IP options\n    to the IP header (used by igmp_ip_output_if)\n\n  2009-05-06 Simon Goldschmidt\n  * inet_chksum.c: On little endian architectures, use LWIP_PLATFORM_HTONS (if\n    defined) for SWAP_BYTES_IN_WORD to speed up checksumming.\n\n  2009-05-05 Simon Goldschmidt\n  * sockets.c: bug #26405: Prematurely released semaphore causes lwip_select()\n    to crash\n\n  2009-05-04 Simon Goldschmidt\n  * init.c: snmp was not initialized in lwip_init()\n\n  2009-05-04 Frédéric Bernon\n  * dhcp.c, netbios.c: Changes if IP_SOF_BROADCAST is enabled.\n\n  2009-05-03 Simon Goldschmidt\n  * tcp.h: bug #26349: Nagle algorithm doesn't send although segment is full\n    (and unsent->next == NULL)\n\n  2009-05-02 Simon Goldschmidt\n  * tcpip.h, tcpip.c: fixed tcpip_untimeout (does not need the time, broken after\n    1.3.0 in CVS only) - fixes compilation of ppp_oe.c\n\n  2009-05-02 Simon Goldschmidt\n  * msg_in.c: fixed bug #25636: SNMPSET value is ignored for integer fields\n\n  2009-05-01 Simon Goldschmidt\n  * pap.c: bug #21680: PPP upap_rauthnak() drops legal NAK packets\n\n  2009-05-01 Simon Goldschmidt\n  * ppp.c: bug #24228: Memory corruption with PPP and DHCP\n\n  2009-04-29 Frédéric Bernon\n  * raw.c, udp.c, init.c, opt.h, ip.h, sockets.h: bug #26309: Implement the\n    SO(F)_BROADCAST filter for all API layers. Avoid the unindented reception\n    of broadcast packets even when this option wasn't set. Port maintainers\n    which want to enable this filter have to set IP_SOF_BROADCAST=1 in opt.h.\n    If you want this option also filter broadcast on recv operations, you also\n    have to set IP_SOF_BROADCAST_RECV=1 in opt.h.\n\n  2009-04-28 Simon Goldschmidt, Jakob Stoklund Olesen\n  * dhcp.c: patch #6721, bugs #25575, #25576: Some small fixes to DHCP and\n    DHCP/AUTOIP cooperation\n\n  2009-04-25 Simon Goldschmidt, Oleg Tyshev\n  * tcp_out.c: bug #24212: Deadlocked tcp_retransmit due to exceeded pcb->cwnd\n    Fixed by sorting the unsent and unacked queues (segments are inserted at the\n    right place in tcp_output and tcp_rexmit).\n\n  2009-04-25 Simon Goldschmidt\n  * memp.c, mem.c, memp.h, mem_std.h: bug #26213 \"Problem with memory allocation\n    when debugging\": memp_sizes contained the wrong sizes (including sanity\n    regions); memp pools for MEM_USE_POOLS were too small\n\n  2009-04-24 Simon Goldschmidt, Frédéric Bernon\n  * inet.c: patch #6765: Fix a small problem with the last changes (incorrect\n    behavior, with with ip address string not ended by a '\\0', a space or a\n    end of line)\n\n  2009-04-19 Simon Goldschmidt\n  * rawapi.txt: Fixed bug #26069: Corrected documentation: if tcp_connect fails,\n    pcb->err is called, not pcb->connected (with an error code).\n\n  2009-04-19 Simon Goldschmidt\n  * tcp_out.c: Fixed bug #26236: \"TCP options (timestamp) don't work with\n    no-copy-tcpwrite\": deallocate option data, only concat segments with same flags\n\n  2009-04-19 Simon Goldschmidt\n  * tcp_out.c: Fixed bug #25094: \"Zero-length pbuf\" (options are now allocated\n    in the header pbuf, not the data pbuf)\n\n  2009-04-18 Simon Goldschmidt\n  * api_msg.c: fixed bug #25695: Segmentation fault in do_writemore()\n\n  2009-04-15 Simon Goldschmidt\n  * sockets.c: tried to fix bug #23559: lwip_recvfrom problem with tcp\n\n  2009-04-15 Simon Goldschmidt\n  * dhcp.c: task #9192: mem_free of dhcp->options_in and dhcp->msg_in\n\n  2009-04-15 Simon Goldschmidt\n  * ip.c, ip6.c, tcp_out.c, ip.h: patch #6808: Add a utility function\n    ip_hinted_output() (for smaller code mainly)\n\n  2009-04-15 Simon Goldschmidt\n  * inet.c: patch #6765: Supporting new line characters in inet_aton()\n\n  2009-04-15 Simon Goldschmidt\n  * dhcp.c: patch #6764: DHCP rebind and renew did not send hostnam option;\n    Converted constant OPTION_MAX_MSG_SIZE to netif->mtu, check if netif->mtu\n    is big enough in dhcp_start\n\n  2009-04-15 Simon Goldschmidt\n  * netbuf.c: bug #26027: netbuf_chain resulted in pbuf memory leak\n\n  2009-04-15 Simon Goldschmidt\n  * sockets.c, ppp.c: bug #25763: corrected 4 occurrences of SMEMCPY to MEMCPY\n\n  2009-04-15 Simon Goldschmidt\n  * sockets.c: bug #26121: set_errno can be overridden\n\n  2009-04-09 Kieran Mansley (patch from Luca Ceresoli <lucaceresoli>)\n  * init.c, opt.h: Patch#6774 TCP_QUEUE_OOSEQ breaks compilation when\n    LWIP_TCP==0\n\n  2009-04-09 Kieran Mansley (patch from Roy Lee <roylee17>)\n  * tcp.h: Patch#6802 Add do-while-clauses to those function like\n    macros in tcp.h\n\n  2009-03-31 Kieran Mansley\n  * tcp.c, tcp_in.c, tcp_out.c, tcp.h, opt.h: Rework the way window\n    updates are calculated and sent (BUG20515)\n\n  * tcp_in.c: cope with SYN packets received during established states,\n    and retransmission of initial SYN.\n\n  * tcp_out.c: set push bit correctly when tcp segments are merged\n\n  2009-03-27 Kieran Mansley\n  * tcp_out.c set window correctly on probes (correcting change made\n    yesterday)\n\n  2009-03-26 Kieran Mansley\n  * tcp.c, tcp_in.c, tcp.h: add tcp_abandon() to cope with dropping\n    connections where no reset required (bug #25622)\n\n  * tcp_out.c: set TCP_ACK flag on keepalive and zero window probes \n    (bug #20779)\n\n  2009-02-18 Simon Goldschmidt (Jonathan Larmour and Bill Auerbach)\n  * ip_frag.c: patch #6528: the buffer used for IP_FRAG_USES_STATIC_BUF could be\n    too small depending on MEM_ALIGNMENT\n\n  2009-02-16 Simon Goldschmidt\n  * sockets.h/.c, api_*.h/.c: fixed arguments of socket functions to match the standard;\n    converted size argument of netconn_write to 'size_t'\n\n  2009-02-16 Simon Goldschmidt\n  * tcp.h, tcp.c: fixed bug #24440: TCP connection close problem on 64-bit host\n    by moving accept callback function pointer to TCP_PCB_COMMON\n\n  2009-02-12 Simon Goldschmidt\n  * dhcp.c: fixed bug #25345 (DHCPDECLINE is sent with \"Maximum message size\"\n    option)\n\n  2009-02-11 Simon Goldschmidt\n  * dhcp.c: fixed bug #24480 (releasing old udp_pdb and pbuf in dhcp_start)\n\n  2009-02-11 Simon Goldschmidt\n  * opt.h, api_msg.c: added configurable default valud for netconn->recv_bufsize:\n    RECV_BUFSIZE_DEFAULT (fixes bug #23726: pbuf pool exhaustion on slow recv())\n\n  2009-02-10 Simon Goldschmidt\n  * tcp.c: fixed bug #25467: Listen backlog is not reset on timeout in SYN_RCVD:\n    Accepts_pending is decrease on a corresponding listen pcb when a connection\n    in state SYN_RCVD is close.\n\n  2009-01-28 Jonathan Larmour\n  * pbuf.c: reclaim pbufs from TCP out-of-sequence segments if we run\n    out of pool pbufs.\n\n  2008-12-19 Simon Goldschmidt\n  * many files: patch #6699: fixed some warnings on platform where sizeof(int) == 2 \n\n  2008-12-10 Tamas Somogyi, Frédéric Bernon\n  * sockets.c: fixed bug #25051: lwip_recvfrom problem with udp: fromaddr and\n    port uses deleted netbuf.\n\n  2008-10-18 Simon Goldschmidt\n  * tcp_in.c: fixed bug ##24596: Vulnerability on faulty TCP options length\n    in tcp_parseopt\n\n  2008-10-15 Simon Goldschmidt\n  * ip_frag.c: fixed bug #24517: IP reassembly crashes on unaligned IP headers\n    by packing the struct ip_reass_helper.\n\n  2008-10-03 David Woodhouse, Jonathan Larmour\n  * etharp.c (etharp_arp_input): Fix type aliasing problem copying ip address.\n\n  2008-10-02 Jonathan Larmour\n  * dns.c: Hard-code structure sizes, to avoid issues on some compilers where\n    padding is included.\n\n  2008-09-30 Jonathan Larmour\n  * sockets.c (lwip_accept): check addr isn't NULL. If it's valid, do an\n    assertion check that addrlen isn't NULL.\n\n  2008-09-30 Jonathan Larmour\n  * tcp.c: Fix bug #24227, wrong error message in tcp_bind.\n\n  2008-08-26 Simon Goldschmidt\n  * inet.h, ip_addr.h: fixed bug #24132: Cross-dependency between ip_addr.h and\n    inet.h -> moved declaration of struct in_addr from ip_addr.h to inet.h\n\n  2008-08-14 Simon Goldschmidt\n  * api_msg.c: fixed bug #23847: do_close_internal references freed memory (when\n    tcp_close returns != ERR_OK)\n\n  2008-07-08 Frédéric Bernon\n  * stats.h: Fix some build bugs introduced with patch #6483 (missing some parameters\n    in macros, mainly if MEM_STATS=0 and MEMP_STATS=0).\n\n  2008-06-24 Jonathan Larmour\n  * tcp_in.c: Fix for bug #23693 as suggested by Art R. Ensure cseg is unused\n    if tcp_seg_copy fails.\n\n  2008-06-17 Simon Goldschmidt\n  * inet_chksum.c: Checked in some ideas of patch #6460 (loop optimizations)\n    and created defines for swapping bytes and folding u32 to u16.\n\n  2008-05-30 Kieran Mansley\n  * tcp_in.c Remove redundant \"if\" statement, and use real rcv_wnd\n    rather than rcv_ann_wnd when deciding if packets are in-window.\n    Contributed by <arasmussen@consultant.datasys.swri.edu>\n\n  2008-05-30 Kieran Mansley\n  * mem.h: Fix BUG#23254.  Change macro definition of mem_* to allow\n    passing as function pointers when MEM_LIBC_MALLOC is defined.\n\n  2008-05-09 Jonathan Larmour\n  * err.h, err.c, sockets.c: Fix bug #23119: Reorder timeout error code to\n    stop it being treated as a fatal error.\n\n  2008-04-15 Simon Goldschmidt\n  * dhcp.c: fixed bug #22804: dhcp_stop doesn't clear NETIF_FLAG_DHCP\n    (flag now cleared)\n\n  2008-03-27 Simon Goldschmidt\n  * mem.c, tcpip.c, tcpip.h, opt.h: fixed bug #21433 (Calling mem_free/pbuf_free\n    from interrupt context isn't safe): set LWIP_USE_HEAP_FROM_INTERRUPT to 1\n    in lwipopts.h or use pbuf_free_callback(p)/mem_free_callback(m) to free pbufs\n    or heap memory from interrupt context\n\n  2008-03-26 Simon Goldschmidt\n  * tcp_in.c, tcp.c: fixed bug #22249: division by zero could occur if a remote\n    host sent a zero mss as TCP option.\n\n\n(STABLE-1.3.0)\n\n  ++ New features:\n\n  2008-03-10 Jonathan Larmour\n  * inet_chksum.c: Allow choice of one of the sample algorithms to be\n    made from lwipopts.h. Fix comment on how to override LWIP_CHKSUM.\n\n  2008-01-22 Frédéric Bernon\n  * tcp.c, tcp_in.c, tcp.h, opt.h: Rename LWIP_CALCULATE_EFF_SEND_MSS in \n    TCP_CALCULATE_EFF_SEND_MSS to have coherent TCP options names.\n\n  2008-01-14 Frédéric Bernon\n  * rawapi.txt, api_msg.c, tcp.c, tcp_in.c, tcp.h: changes for task #7675 \"Enable\n    to refuse data on a TCP_EVENT_RECV call\". Important, behavior changes for the\n    tcp_recv callback (see rawapi.txt).\n\n  2008-01-14 Frédéric Bernon, Marc Chaland\n  * ip.c: Integrate patch #6369\" ip_input : checking before realloc\".\n  \n  2008-01-12 Frédéric Bernon\n  * tcpip.h, tcpip.c, api.h, api_lib.c, api_msg.c, sockets.c: replace the field\n    netconn::sem per netconn::op_completed like suggested for the task #7490\n    \"Add return value to sys_mbox_post\".\n\n  2008-01-12 Frédéric Bernon\n  * api_msg.c, opt.h: replace DEFAULT_RECVMBOX_SIZE per DEFAULT_TCP_RECVMBOX_SIZE,\n    DEFAULT_UDP_RECVMBOX_SIZE and DEFAULT_RAW_RECVMBOX_SIZE (to optimize queues\n    sizes), like suggested for the task #7490 \"Add return value to sys_mbox_post\".\n\n  2008-01-10 Frédéric Bernon\n  * tcpip.h, tcpip.c: add tcpip_callback_with_block function for the task #7490\n    \"Add return value to sys_mbox_post\". tcpip_callback is always defined as\n    \"blocking\" (\"block\" parameter = 1).\n\n  2008-01-10 Frédéric Bernon\n  * tcpip.h, tcpip.c, api.h, api_lib.c, api_msg.c, sockets.c: replace the field\n    netconn::mbox (sys_mbox_t) per netconn::sem (sys_sem_t) for the task #7490\n    \"Add return value to sys_mbox_post\".\n\n  2008-01-05 Frédéric Bernon\n  * sys_arch.txt, api.h, api_lib.c, api_msg.h, api_msg.c, tcpip.c, sys.h, opt.h:\n    Introduce changes for task #7490 \"Add return value to sys_mbox_post\" with some\n    modifications in the sys_mbox api: sys_mbox_new take a \"size\" parameters which\n    indicate the number of pointers query by the mailbox. There is three defines\n    in opt.h to indicate sizes for tcpip::mbox, netconn::recvmbox, and for the \n    netconn::acceptmbox. Port maintainers, you can decide to just add this new \n    parameter in your implementation, but to ignore it to keep the previous behavior.\n    The new sys_mbox_trypost function return a value to know if the mailbox is\n    full or if the message is posted. Take a look to sys_arch.txt for more details.\n    This new function is used in tcpip_input (so, can be called in an interrupt\n    context since the function is not blocking), and in recv_udp and recv_raw.\n\n  2008-01-04 Frédéric Bernon, Simon Goldschmidt, Jonathan Larmour\n  * rawapi.txt, api.h, api_lib.c, api_msg.h, api_msg.c, sockets.c, tcp.h, tcp.c,\n    tcp_in.c, init.c, opt.h: rename backlog options with TCP_ prefix, limit the\n    \"backlog\" parameter in an u8_t, 0 is interpreted as \"smallest queue\", add\n    documentation in the rawapi.txt file.\n\n  2007-12-31 Kieran Mansley (based on patch from Per-Henrik Lundbolm)\n  * tcp.c, tcp_in.c, tcp_out.c, tcp.h: Add TCP persist timer\n\n  2007-12-31 Frédéric Bernon, Luca Ceresoli\n  * autoip.c, etharp.c: ip_addr.h: Integrate patch #6348: \"Broadcast ARP packets\n    in autoip\". The change in etharp_raw could be removed, since all calls to\n    etharp_raw use ethbroadcast for the \"ethdst_addr\" parameter. But it could be\n    wrong in the future.\n\n  2007-12-30 Frédéric Bernon, Tom Evans\n  * ip.c: Fix bug #21846 \"LwIP doesn't appear to perform any IP Source Address\n    Filtering\" reported by Tom Evans.\n\n  2007-12-21 Frédéric Bernon, Simon Goldschmidt, Jonathan Larmour\n  * tcp.h, opt.h, api.h, api_msg.h, tcp.c, tcp_in.c, api_lib.c, api_msg.c,\n    sockets.c, init.c: task #7252: Implement TCP listen backlog: Warning: raw API\n    applications have to call 'tcp_accepted(pcb)' in their accept callback to\n    keep accepting new connections.\n\n  2007-12-13 Frédéric Bernon\n  * api_msg.c, err.h, err.c, sockets.c, dns.c, dns.h: replace \"enum dns_result\"\n    by err_t type. Add a new err_t code \"ERR_INPROGRESS\".\n\n  2007-12-12 Frédéric Bernon\n  * dns.h, dns.c, opt.h: move DNS options to the \"right\" place. Most visibles\n    are the one which have ram usage.\n\n  2007-12-05 Frédéric Bernon\n  * netdb.c: add a LWIP_DNS_API_HOSTENT_STORAGE option to decide to use a static\n    set of variables (=0) or a local one (=1). In this last case, your port should\n    provide a function \"struct hostent* sys_thread_hostent( struct hostent* h)\"\n    which have to do a copy of \"h\" and return a pointer ont the \"per-thread\" copy.\n\n  2007-12-03 Simon Goldschmidt\n  * ip.c: ip_input: check if a packet is for inp first before checking all other\n    netifs on netif_list (speeds up packet receiving in most cases)\n\n  2007-11-30 Simon Goldschmidt\n  * udp.c, raw.c: task #7497: Sort lists (pcb, netif, ...) for faster access\n    UDP: move a (connected) pcb selected for input to the front of the list of\n    pcbs so that it is found faster next time. Same for RAW pcbs that have eaten\n    a packet.\n\n  2007-11-28 Simon Goldschmidt\n  * etharp.c, stats.c, stats.h, opt.h: Introduced ETHARP_STATS\n\n  2007-11-25 Simon Goldschmidt\n  * dhcp.c: dhcp_unfold_reply() uses pbuf_copy_partial instead of its own copy\n    algorithm.\n\n  2007-11-24 Simon Goldschmidt\n  * netdb.h, netdb.c, sockets.h/.c: Moved lwip_gethostbyname from sockets.c\n    to the new file netdb.c; included lwip_getaddrinfo.\n\n  2007-11-21 Simon Goldschmidt\n  * tcp.h, opt.h, tcp.c, tcp_in.c: implemented calculating the effective send-mss\n    based on the MTU of the netif used to send. Enabled by default. Disable by\n    setting LWIP_CALCULATE_EFF_SEND_MSS to 0. This fixes bug #21492.\n\n  2007-11-19 Frédéric Bernon\n  * api_msg.c, dns.h, dns.c: Implement DNS_DOES_NAME_CHECK option (check if name\n    received match the name query), implement DNS_USES_STATIC_BUF (the place where\n    copy dns payload to parse the response), return an error if there is no place\n    for a new query, and fix some minor problems.\n\n  2007-11-16 Simon Goldschmidt\n  * new files: ipv4/inet.c, ipv4/inet_chksum.c, ipv6/inet6.c\n    removed files: core/inet.c, core/inet6.c\n    Moved inet files into ipv4/ipv6 directory; splitted inet.c/inet.h into\n    inet and chksum part; changed includes in all lwIP files as appropriate\n\n  2007-11-16 Simon Goldschmidt\n  * api.h, api_msg.h, api_lib.c, api_msg.c, socket.h, socket.c: Added sequential\n    dns resolver function for netconn api (netconn_gethostbyname) and socket api\n    (gethostbyname/gethostbyname_r).\n\n  2007-11-15 Jim Pettinato, Frédéric Bernon\n  * opt.h, init.c, tcpip.c, dhcp.c, dns.h, dns.c: add DNS client for simple name\n    requests with RAW api interface. Initialization is done in lwip_init() with\n    build time options. DNS timer is added in tcpip_thread context. DHCP can set\n    DNS server ip addresses when options are received. You need to set LWIP_DNS=1\n    in your lwipopts.h file (LWIP_DNS=0 in opt.h). DNS_DEBUG can be set to get\n    some traces with LWIP_DEBUGF. Sanity check have been added. There is a \"todo\"\n    list with points to improve.\n\n  2007-11-06 Simon Goldschmidt\n  * opt.h, mib2.c: Patch #6215: added ifAdminStatus write support (if explicitly\n    enabled by defining SNMP_SAFE_REQUESTS to 0); added code to check link status\n    for ifOperStatus if LWIP_NETIF_LINK_CALLBACK is defined.\n\n  2007-11-06 Simon Goldschmidt\n  * api.h, api_msg.h and dependent files: Task #7410: Removed the need to include\n    core header files in api.h (ip/tcp/udp/raw.h) to hide the internal\n    implementation from netconn api applications.\n\n  2007-11-03 Frédéric Bernon\n  * api.h, api_lib.c, api_msg.c, sockets.c, opt.h: add SO_RCVBUF option for UDP &\n    RAW netconn. You need to set LWIP_SO_RCVBUF=1 in your lwipopts.h (it's disabled\n    by default). Netconn API users can use the netconn_recv_bufsize macro to access\n    it. This is a first release which have to be improve for TCP. Note it used the\n    netconn::recv_avail which need to be more \"thread-safe\" (note there is already\n    the problem for FIONREAD with lwip_ioctl/ioctlsocket).\n\n  2007-11-01 Frédéric Bernon, Marc Chaland\n  * sockets.h, sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c, tcp.h, tcp_out.c:\n    Integrate \"patch #6250 : MSG_MORE flag for send\". MSG_MORE is used at socket api\n    layer, NETCONN_MORE at netconn api layer, and TCP_WRITE_FLAG_MORE at raw api\n    layer. This option enable to delayed TCP PUSH flag on multiple \"write\" calls.\n    Note that previous \"copy\" parameter for \"write\" APIs is now called \"apiflags\".\n\n  2007-10-24 Frédéric Bernon\n  * api.h, api_lib.c, api_msg.c: Add macro API_EVENT in the same spirit than \n    TCP_EVENT_xxx macros to get a code more readable. It could also help to remove\n    some code (like we have talk in \"patch #5919 : Create compile switch to remove\n    select code\"), but it could be done later.\n\n  2007-10-08 Simon Goldschmidt\n  * many files: Changed initialization: many init functions are not needed any\n    more since we now rely on the compiler initializing global and static\n    variables to zero!\n\n  2007-10-06 Simon Goldschmidt\n  * ip_frag.c, memp.c, mib2.c, ip_frag.h, memp_std.h, opt.h: Changed IP_REASSEMBLY\n    to enqueue the received pbufs so that multiple packets can be reassembled\n    simultaneously and no static reassembly buffer is needed.\n\n  2007-10-05 Simon Goldschmidt\n  * tcpip.c, etharp.h, etharp.c: moved ethernet_input from tcpip.c to etharp.c so\n    all netifs (or ports) can use it.\n\n  2007-10-05 Frédéric Bernon\n  * netifapi.h, netifapi.c: add function netifapi_netif_set_default. Change the \n    common function to reduce a little bit the footprint (for all functions using\n    only the \"netif\" parameter).\n\n  2007-10-03 Frédéric Bernon\n  * netifapi.h, netifapi.c: add functions netifapi_netif_set_up, netifapi_netif_set_down,\n    netifapi_autoip_start and netifapi_autoip_stop. Use a common function to reduce\n    a little bit the footprint (for all functions using only the \"netif\" parameter).\n\n  2007-09-15 Frédéric Bernon\n  * udp.h, udp.c, sockets.c: Changes for \"#20503 IGMP Improvement\". Add IP_MULTICAST_IF\n    option in socket API, and a new field \"multicast_ip\" in \"struct udp_pcb\" (for\n    netconn and raw API users), only if LWIP_IGMP=1. Add getsockopt processing for\n    IP_MULTICAST_TTL and IP_MULTICAST_IF.\n\n  2007-09-10 Frédéric Bernon\n  * snmp.h, mib2.c: enable to remove SNMP timer (which consumne several cycles\n    even when it's not necessary). snmp_agent.txt tell to call snmp_inc_sysuptime()\n    each 10ms (but, it's intrusive if you use sys_timeout feature). Now, you can\n    decide to call snmp_add_sysuptime(100) each 1000ms (which is bigger \"step\", but\n    call to a lower frequency). Or, you can decide to not call snmp_inc_sysuptime()\n    or snmp_add_sysuptime(), and to define the SNMP_GET_SYSUPTIME(sysuptime) macro.\n    This one is undefined by default in mib2.c. SNMP_GET_SYSUPTIME is called inside\n    snmp_get_sysuptime(u32_t *value), and enable to change \"sysuptime\" value only\n    when it's queried (any direct call to \"sysuptime\" is changed by a call to \n    snmp_get_sysuptime).\n\n  2007-09-09 Frédéric Bernon, Bill Florac\n  * igmp.h, igmp.c, netif.h, netif.c, ip.c: To enable to have interfaces with IGMP,\n    and others without it, there is a new NETIF_FLAG_IGMP flag to set in netif->flags\n    if you want IGMP on an interface. igmp_stop() is now called inside netif_remove().\n    igmp_report_groups() is now called inside netif_set_link_up() (need to have\n    LWIP_NETIF_LINK_CALLBACK=1) to resend reports once the link is up (avoid to wait\n    the next query message to receive the matching multicast streams).\n\n  2007-09-08 Frédéric Bernon\n  * sockets.c, ip.h, api.h, tcp.h: declare a \"struct ip_pcb\" which only contains\n    IP_PCB. Add in the netconn's \"pcb\" union a \"struct ip_pcb *ip;\" (no size change).\n    Use this new field to access to common pcb fields (ttl, tos, so_options, etc...).\n    Enable to access to these fields with LWIP_TCP=0.\n\n  2007-09-05 Frédéric Bernon\n  * udp.c, ipv4/icmp.c, ipv4/ip.c, ipv6/icmp.c, ipv6/ip6.c, ipv4/icmp.h,\n    ipv6/icmp.h, opt.h: Integrate \"task #7272 : LWIP_ICMP option\". The new option\n    LWIP_ICMP enable/disable ICMP module inside the IP stack (enable per default).\n    Be careful, disabling ICMP make your product non-compliant to RFC1122, but\n    help to reduce footprint, and to reduce \"visibility\" on the Internet.\n\n  2007-09-05 Frédéric Bernon, Bill Florac\n  * opt.h, sys.h, tcpip.c, slipif.c, ppp.c, sys_arch.txt: Change parameters list\n    for sys_thread_new (see \"task #7252 : Create sys_thread_new_ex()\"). Two new\n    parameters have to be provided: a task name, and a task stack size. For this\n    one, since it's platform dependant, you could define the best one for you in\n    your lwipopts.h. For port maintainers, you can just add these new parameters\n    in your sys_arch.c file, and but it's not mandatory, use them in your OS\n    specific functions.\n\n  2007-09-05 Frédéric Bernon\n  * inet.c, autoip.c, msg_in.c, msg_out.c, init.c: Move some build time checkings\n    inside init.c for task #7142 \"Sanity check user-configurable values\".\n\n  2007-09-04 Frédéric Bernon, Bill Florac\n  * igmp.h, igmp.c, memp_std.h, memp.c, init.c, opt.h: Replace mem_malloc call by\n    memp_malloc, and use a new MEMP_NUM_IGMP_GROUP option (see opt.h to define the\n    value). It will avoid potential fragmentation problems, use a counter to know\n    how many times a group is used on an netif, and free it when all applications\n    leave it. MEMP_NUM_IGMP_GROUP got 8 as default value (and init.c got a sanity\n    check if LWIP_IGMP!=0).\n\n  2007-09-03 Frédéric Bernon\n  * igmp.h, igmp.c, sockets.c, api_msg.c: Changes for \"#20503 IGMP Improvement\".\n    Initialize igmp_mac_filter to NULL in netif_add (this field should be set in\n    the netif's \"init\" function). Use the \"imr_interface\" field (for socket layer)\n    and/or the \"interface\" field (for netconn layer), for join/leave operations.\n    The igmp_join/leavegroup first parameter change from a netif to an ipaddr.\n    This field could be a netif's ipaddr, or \"any\" (same meaning than ip_addr_isany).\n\n  2007-08-30 Frédéric Bernon\n  * Add netbuf.h, netbuf.c, Change api.h, api_lib.c: #7249 \"Split netbuf functions\n    from api/api_lib\". Now netbuf API is independant of netconn, and can be used\n    with other API (application based on raw API, or future \"socket2\" API). Ports\n    maintainers just have to add src/api/netbuf.c in their makefile/projects.\n\n  2007-08-30 Frédéric Bernon, Jonathan Larmour\n  * init.c: Add first version of lwip_sanity_check for task #7142 \"Sanity check\n    user-configurable values\".\n\n  2007-08-29 Frédéric Bernon\n  * igmp.h, igmp.c, tcpip.c, init.c, netif.c: change igmp_init and add igmp_start.\n    igmp_start is call inside netif_add. Now, igmp initialization is in the same\n    spirit than the others modules. Modify some IGMP debug traces.\n\n  2007-08-29 Frédéric Bernon\n  * Add init.h, init.c, Change opt.h, tcpip.c: Task  #7213 \"Add a lwip_init function\"\n    Add lwip_init function to regroup all modules initializations, and to provide\n    a place to add code for task #7142 \"Sanity check user-configurable values\".\n    Ports maintainers should remove direct initializations calls from their code,\n    and add init.c in their makefiles. Note that lwip_init() function is called\n    inside tcpip_init, but can also be used by raw api users since all calls are\n    disabled when matching options are disabled. Also note that their is new options\n    in opt.h, you should configure in your lwipopts.h (they are enabled per default).\n\n  2007-08-26 Marc Boucher\n  * api_msg.c: do_close_internal(): Reset the callbacks and arg (conn) to NULL\n    since they can under certain circumstances be called with an invalid conn\n    pointer after the connection has been closed (and conn has been freed). \n\n  2007-08-25 Frédéric Bernon (Artem Migaev's Patch)\n  * netif.h, netif.c: Integrate \"patch #6163 : Function to check if link layer is up\".\n    Add a netif_is_link_up() function if LWIP_NETIF_LINK_CALLBACK option is set.\n\n  2007-08-22 Frédéric Bernon\n  * netif.h, netif.c, opt.h: Rename LWIP_NETIF_CALLBACK in LWIP_NETIF_STATUS_CALLBACK\n    to be coherent with new LWIP_NETIF_LINK_CALLBACK option before next release.\n\n  2007-08-22 Frédéric Bernon\n  * tcpip.h, tcpip.c, ethernetif.c, opt.h: remove options ETHARP_TCPIP_INPUT &\n    ETHARP_TCPIP_ETHINPUT, now, only \"ethinput\" code is supported, even if the \n    name is tcpip_input (we keep the name of 1.2.0 function).\n\n  2007-08-17 Jared Grubb\n  * memp_std.h, memp.h, memp.c, mem.c, stats.c: (Task #7136) Centralize mempool \n    settings into new memp_std.h and optional user file lwippools.h. This adds\n    more dynamic mempools, and allows the user to create an arbitrary number of\n    mempools for mem_malloc.\n\n  2007-08-16 Marc Boucher\n  * api_msg.c: Initialize newconn->state to NETCONN_NONE in accept_function;\n    otherwise it was left to NETCONN_CLOSE and sent_tcp() could prematurely\n    close the connection.\n\n  2007-08-16 Marc Boucher\n  * sockets.c: lwip_accept(): check netconn_peer() error return.\n\n  2007-08-16 Marc Boucher\n  * mem.c, mem.h: Added mem_calloc().\n\n  2007-08-16 Marc Boucher\n  * tcpip.c, tcpip.h memp.c, memp.h: Added distinct memp (MEMP_TCPIP_MSG_INPKT)\n    for input packets to prevent floods from consuming all of MEMP_TCPIP_MSG\n    and starving other message types.\n    Renamed MEMP_TCPIP_MSG to MEMP_TCPIP_MSG_API\n\n  2007-08-16 Marc Boucher\n  * pbuf.c, pbuf.h, etharp.c, tcp_in.c, sockets.c: Split pbuf flags in pbuf\n    type and flgs (later renamed to flags).\n    Use enum pbuf_flag as pbuf_type.  Renumber PBUF_FLAG_*.\n    Improved lwip_recvfrom().  TCP push now propagated.\n\n  2007-08-16 Marc Boucher\n  * ethernetif.c, contrib/ports/various: ethbroadcast now a shared global\n    provided by etharp.\n\n  2007-08-16 Marc Boucher\n  * ppp_oe.c ppp_oe.h, auth.c chap.c fsm.c lcp.c ppp.c ppp.h,\n    etharp.c ethernetif.c, etharp.h, opt.h tcpip.h, tcpip.c:\n    Added PPPoE support and various PPP improvements.\n\n  2007-07-25 Simon Goldschmidt\n  * api_lib.c, ip_frag.c, pbuf.c, api.h, pbuf.h: Introduced pbuf_copy_partial,\n    making netbuf_copy_partial use this function.\n\n  2007-07-25 Simon Goldschmidt\n  * tcp_in.c: Fix bug #20506: Slow start / initial congestion window starts with\n    2 * mss (instead of 1 * mss previously) to comply with some newer RFCs and\n    other stacks.\n\n  2007-07-13 Jared Grubb (integrated by Frédéric Bernon)\n  * opt.h, netif.h, netif.c, ethernetif.c: Add new configuration option to add\n    a link callback in the netif struct, and functions to handle it. Be carefull\n    for port maintainers to add the NETIF_FLAG_LINK_UP flag (like in ethernetif.c)\n    if you want to be sure to be compatible with future changes...\n\n  2007-06-30 Frédéric Bernon\n  * sockets.h, sockets.c: Implement MSG_PEEK flag for recv/recvfrom functions.\n\n  2007-06-21 Simon Goldschmidt\n  * etharp.h, etharp.c: Combined etharp_request with etharp_raw for both\n    LWIP_AUTOIP =0 and =1 to remove redundant code.\n\n  2007-06-21 Simon Goldschmidt\n  * mem.c, memp.c, mem.h, memp.h, opt.h: task #6863: Introduced the option\n    MEM_USE_POOLS to use 4 pools with different sized elements instead of a\n    heap. This both prevents memory fragmentation and gives a higher speed\n    at the cost of more memory consumption. Turned off by default.\n\n  2007-06-21 Simon Goldschmidt\n  * api_lib.c, api_msg.c, api.h, api_msg.h: Converted the length argument of\n    netconn_write (and therefore also api_msg_msg.msg.w.len) from u16_t into\n    int to be able to send a bigger buffer than 64K with one time (mainly\n    used from lwip_send).\n\n  2007-06-21 Simon Goldschmidt\n  * tcp.h, api_msg.c: Moved the nagle algorithm from netconn_write/do_write\n    into a define (tcp_output_nagle) in tcp.h to provide it to raw api users, too.\n\n  2007-06-21 Simon Goldschmidt\n  * api.h, api_lib.c, api_msg.c: Fixed bug #20021: Moved sendbuf-processing in\n    netconn_write from api_lib.c to api_msg.c to also prevent multiple context-\n    changes on low memory or empty send-buffer.\n\n  2007-06-18 Simon Goldschmidt\n  * etharp.c, etharp.h: Changed etharp to use a defined hardware address length\n    of 6 to avoid loading netif->hwaddr_len every time (since this file is only\n    used for ethernet and struct eth_addr already had a defined length of 6).\n\n  2007-06-17 Simon Goldschmidt\n  * sockets.c, sockets.h: Implemented socket options SO_NO_CHECK for UDP sockets\n    to disable UDP checksum generation on transmit.\n\n  2007-06-13 Frédéric Bernon, Simon Goldschmidt\n  * debug.h, api_msg.c: change LWIP_ERROR to use it to check errors like invalid\n    pointers or parameters, and let the possibility to redefined it in cc.h. Use\n    this macro to check \"conn\" parameter in api_msg.c functions.\n\n  2007-06-11 Simon Goldschmidt\n  * sockets.c, sockets.h: Added UDP lite support for sockets\n\n  2007-06-10 Simon Goldschmidt\n  * udp.h, opt.h, api_msg.c, ip.c, udp.c: Included switch LWIP_UDPLITE (enabled\n    by default) to switch off UDP-Lite support if not needed (reduces udp.c code\n    size)\n\n  2007-06-09 Dominik Spies (integrated by Frédéric Bernon)\n  * autoip.h, autoip.c, dhcp.h, dhcp.c, netif.h, netif.c, etharp.h, etharp.c, opt.h:\n    AutoIP implementation available for IPv4, with new options LWIP_AUTOIP and\n    LWIP_DHCP_AUTOIP_COOP if you want to cooperate with DHCP. Some tips to adapt\n    (see TODO mark in the source code).\n\n  2007-06-09 Simon Goldschmidt\n  * etharp.h, etharp.c, ethernetif.c: Modified order of parameters for\n    etharp_output() to match netif->output so etharp_output() can be used\n    directly as netif->output to save one function call.\n\n  2007-06-08 Simon Goldschmidt\n  * netif.h, ethernetif.c, slipif.c, loopif.c: Added define\n    NETIF_INIT_SNMP(netif, type, speed) to initialize per-netif snmp variables,\n    added initialization of those to ethernetif, slipif and loopif.\n\n  2007-05-18 Simon Goldschmidt\n  * opt.h, ip_frag.c, ip_frag.h, ip.c: Added option IP_FRAG_USES_STATIC_BUF\n    (defaulting to off for now) that can be set to 0 to send fragmented\n    packets by passing PBUF_REFs down the stack.\n\n  2007-05-23 Frédéric Bernon\n  * api_lib.c: Implement SO_RCVTIMEO for accept and recv on TCP\n    connections, such present in patch #5959.\n\n  2007-05-23 Frédéric Bernon\n  * api.h, api_lib.c, api_msg.c, sockets.c: group the different NETCONN_UDPxxx\n    code in only one part...\n\n  2007-05-18 Simon Goldschmidt\n  * opt.h, memp.h, memp.c: Added option MEMP_OVERFLOW_CHECK to check for memp\n    elements to overflow. This is achieved by adding some bytes before and after\n    each pool element (increasing their size, of course), filling them with a\n    prominent value and checking them on freeing the element.\n    Set it to 2 to also check every element in every pool each time memp_malloc()\n    or memp_free() is called (slower but more helpful).\n\n  2007-05-10 Simon Goldschmidt\n  * opt.h, memp.h, memp.c, pbuf.c (see task #6831): use a new memp pool for\n    PBUF_POOL pbufs instead of the old pool implementation in pbuf.c to reduce\n    code size.\n\n  2007-05-11 Frédéric Bernon\n  * sockets.c, api_lib.c, api_msg.h, api_msg.c, netifapi.h, netifapi.c, tcpip.c:\n    Include a function pointer instead of a table index in the message to reduce\n    footprint. Disable some part of lwip_send and lwip_sendto if some options are\n    not set (LWIP_TCP, LWIP_UDP, LWIP_RAW).\n\n  2007-05-10 Simon Goldschmidt\n  * *.h (except netif/ppp/*.h): Included patch #5448: include '#ifdef __cplusplus\n    \\ extern \"C\" {' in all header files. Now you can write your application using\n    the lwIP stack in C++ and simply #include the core files. Note I have left\n    out the netif/ppp/*h header files for now, since I don't know which files are\n    included by applications and which are for internal use only.\n\n  2007-05-09 Simon Goldschmidt\n  * opt.h, *.c/*.h: Included patch #5920: Create define to override C-library\n    memcpy. 2 Defines are created: MEMCPY() for normal memcpy, SMEMCPY() for\n    situations where some compilers might inline the copy and save a function\n    call. Also replaced all calls to memcpy() with calls to (S)MEMCPY().\n\n  2007-05-08 Simon Goldschmidt\n  * mem.h: If MEM_LIBC_MALLOC==1, allow the defines (e.g. mem_malloc() -> malloc())\n    to be overriden in case the C-library malloc implementation is not protected\n    against concurrent access.\n\n  2007-05-04 Simon Goldschmidt (Atte Kojo)\n  * etharp.c: Introduced fast one-entry-cache to speed up ARP lookup when sending\n    multiple packets to the same host.\n\n  2007-05-04 Frédéric Bernon, Jonathan Larmour\n  * sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c: Fix bug #19162 \"lwip_sento: a possible\n    to corrupt remote addr/port connection state\". Reduce problems \"not enought memory\" with\n    netbuf (if we receive lot of datagrams). Improve lwip_sendto (only one exchange between\n    sockets api and api_msg which run in tcpip_thread context). Add netconn_sento function.\n    Warning, if you directly access to \"fromaddr\" & \"fromport\" field from netbuf struct,\n    these fields are now renamed \"addr\" & \"port\".\n\n  2007-04-11 Jonathan Larmour\n  * sys.h, api_lib.c: Provide new sys_mbox_tryfetch function. Require ports to provide new\n    sys_arch_mbox_tryfetch function to get a message if one is there, otherwise return\n    with SYS_MBOX_EMPTY. sys_arch_mbox_tryfetch can be implemented as a function-like macro\n    by the port in sys_arch.h if desired.\n\n  2007-04-06 Frédéric Bernon, Simon Goldschmidt\n  * opt.h, tcpip.h, tcpip.c, netifapi.h, netifapi.c: New configuration option LWIP_NETIF_API\n    allow to use thread-safe functions to add/remove netif in list, and to start/stop dhcp\n    clients, using new functions from netifapi.h. Disable as default (no port change to do).\n\n  2007-04-05 Frédéric Bernon\n  * sockets.c: remplace ENOBUFS errors on alloc_socket by ENFILE to be more BSD compliant.\n\n  2007-04-04 Simon Goldschmidt\n  * arch.h, api_msg.c, dhcp.c, msg_in.c, sockets.c: Introduced #define LWIP_UNUSED_ARG(x)\n    use this for and architecture-independent form to tell the compiler you intentionally\n    are not using this variable. Can be overriden in cc.h.\n\n  2007-03-28 Frédéric Bernon\n  * opt.h, netif.h, dhcp.h, dhcp.c: New configuration option LWIP_NETIF_HOSTNAME allow to\n    define a hostname in netif struct (this is just a pointer, so, you can use a hardcoded\n    string, point on one of your's ethernetif field, or alloc a string you will free yourself).\n    It will be used by DHCP to register a client hostname, but can also be use when you call\n    snmp_set_sysname.\n\n  2007-03-28 Frédéric Bernon\n  * netif.h, netif.c: A new NETIF_FLAG_ETHARP flag is defined in netif.h, to allow to \n    initialize a network interface's flag with. It tell this interface is an ethernet\n    device, and we can use ARP with it to do a \"gratuitous ARP\" (RFC 3220 \"IP Mobility\n    Support for IPv4\" section 4.6) when interface is \"up\" with netif_set_up().\n\n  2007-03-26 Frédéric Bernon, Jonathan Larmour\n  * opt.h, tcpip.c: New configuration option LWIP_ARP allow to disable ARP init at build\n    time if you only use PPP or SLIP. The default is enable. Note we don't have to call \n    etharp_init in your port's initilization sequence if you use tcpip.c, because this call\n    is done in tcpip_init function.\n\n  2007-03-22 Frédéric Bernon\n  * stats.h, stats.c, msg_in.c: Stats counters can be change to u32_t if necessary with the\n    new option LWIP_STATS_LARGE. If you need this option, define LWIP_STATS_LARGE to 1 in\n    your lwipopts.h. More, unused counters are not defined in the stats structs, and not \n    display by stats_display(). Note that some options (SYS_STATS and RAW_STATS) are defined\n    but never used. Fix msg_in.c with the correct #if test for a stat display.\n\n  2007-03-21 Kieran Mansley\n  * netif.c, netif.h: Apply patch#4197 with some changes (originator: rireland@hmgsl.com). \n    Provides callback on netif up/down state change.\n\n  2007-03-11 Frédéric Bernon, Mace Gael, Steve Reynolds\n  * sockets.h, sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c, igmp.h, igmp.c,\n    ip.c, netif.h, tcpip.c, opt.h:\n    New configuration option LWIP_IGMP to enable IGMP processing. Based on only one \n    filter per all network interfaces. Declare a new function in netif to enable to\n    control the MAC filter (to reduce lwIP traffic processing).\n\n  2007-03-11 Frédéric Bernon\n  * tcp.h, tcp.c, sockets.c, tcp_out.c, tcp_in.c, opt.h: Keepalive values can\n    be configured at run time with LWIP_TCP_KEEPALIVE, but don't change this\n    unless you know what you're doing (default are RFC1122 compliant). Note\n    that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set in seconds.\n\n  2007-03-08 Frédéric Bernon\n  * tcp.h: Keepalive values can be configured at compile time, but don't change\n    this unless you know what you're doing (default are RFC1122 compliant).\n\n  2007-03-08 Frédéric Bernon\n  * sockets.c, api.h, api_lib.c, tcpip.c, sys.h, sys.c, err.c, opt.h:\n    Implement LWIP_SO_RCVTIMEO configuration option to enable/disable SO_RCVTIMEO\n    on UDP sockets/netconn.\n\n  2007-03-08 Simon Goldschmidt\n  * snmp_msg.h, msg_in.c: SNMP UDP ports can be configured at compile time.\n\n  2007-03-06 Frédéric Bernon\n  * api.h, api_lib.c, sockets.h, sockets.c, tcpip.c, sys.h, sys.c, err.h: \n    Implement SO_RCVTIMEO on UDP sockets/netconn.\n\n  2007-02-28 Kieran Mansley (based on patch from Simon Goldschmidt)\n  * api_lib.c, tcpip.c, memp.c, memp.h: make API msg structs allocated\n    on the stack and remove the API msg type from memp\n\n  2007-02-26 Jonathan Larmour (based on patch from Simon Goldschmidt)\n  * sockets.h, sockets.c: Move socket initialization to new\n    lwip_socket_init() function.\n    NOTE: this changes the API with ports. Ports will have to be\n    updated to call lwip_socket_init() now.\n\n  2007-02-26 Jonathan Larmour (based on patch from Simon Goldschmidt)\n  * api_lib.c: Use memcpy in netbuf_copy_partial.\n\n\n  ++ Bug fixes:\n\n  2008-03-17 Frédéric Bernon, Ed Kerekes\n  * igmp.h, igmp.c: Fix bug #22613 \"IGMP iphdr problem\" (could have\n    some problems to fill the IP header on some targets, use now the\n    ip.h macros to do it).\n\n  2008-03-13 Frédéric Bernon\n  * sockets.c: Fix bug #22435 \"lwip_recvfrom with TCP break;\". Using\n    (lwip_)recvfrom with valid \"from\" and \"fromlen\" parameters, on a\n    TCP connection caused a crash. Note that using (lwip_)recvfrom\n    like this is a bit slow and that using (lwip)getpeername is the\n    good lwip way to do it (so, using recv is faster on tcp sockets).\n\n  2008-03-12 Frédéric Bernon, Jonathan Larmour\n  * api_msg.c, contrib/apps/ping.c: Fix bug #22530 \"api_msg.c's\n    recv_raw() does not consume data\", and the ping sample (with\n    LWIP_SOCKET=1, the code did the wrong supposition that lwip_recvfrom\n    returned the IP payload, without the IP header).\n\n  2008-03-04 Jonathan Larmour\n  * mem.c, stats.c, mem.h: apply patch #6414 to avoid compiler errors\n  and/or warnings on some systems where mem_size_t and size_t differ.\n  * pbuf.c, ppp.c: Fix warnings on some systems with mem_malloc.\n\n  2008-03-04 Kieran Mansley (contributions by others) \n  * Numerous small compiler error/warning fixes from contributions to\n    mailing list after 1.3.0 release candidate made.\n\n  2008-01-25 Cui hengbin (integrated by Frédéric Bernon)\n  * dns.c: Fix bug #22108 \"DNS problem\" caused by unaligned structures.\n\n  2008-01-15 Kieran Mansley\n  * tcp_out.c: BUG20511.  Modify persist timer to start when we are\n    prevented from sending by a small send window, not just a zero\n    send window.\n\n  2008-01-09 Jonathan Larmour\n  * opt.h, ip.c: Rename IP_OPTIONS define to IP_OPTIONS_ALLOWED to avoid\n    conflict with Linux system headers.\n\n  2008-01-06 Jonathan Larmour\n  * dhcp.c: fix bug #19927: \"DHCP NACK problem\" by clearing any existing set IP\n    address entirely on receiving a DHCPNAK, and restarting discovery.\n\n  2007-12-21 Simon Goldschmidt\n  * sys.h, api_lib.c, api_msg.c, sockets.c: fix bug #21698: \"netconn->recv_avail\n    is not protected\" by using new macros for interlocked access to modify/test\n    netconn->recv_avail.\n\n  2007-12-20 Kieran Mansley (based on patch from Oleg Tyshev)\n  * tcp_in.c: fix bug# 21535 (nrtx not reset correctly in SYN_SENT state)\n\n  2007-12-20 Kieran Mansley (based on patch from Per-Henrik Lundbolm)\n  * tcp.c, tcp_in.c, tcp_out.c, tcp.h: fix bug #20199 (better handling\n    of silly window avoidance and prevent lwIP from shrinking the window)\n\n  2007-12-04 Simon Goldschmidt\n  * tcp.c, tcp_in.c: fix bug #21699 (segment leak in ooseq processing when last\n    data packet was lost): add assert that all segment lists are empty in\n    tcp_pcb_remove before setting pcb to CLOSED state; don't directly set CLOSED\n    state from LAST_ACK in tcp_process\n\n  2007-12-02 Simon Goldschmidt\n  * sockets.h: fix bug #21654: exclude definition of struct timeval from #ifndef FD_SET\n    If including <sys/time.h> for system-struct timeval, LWIP_TIMEVAL_PRIVATE now\n    has to be set to 0 in lwipopts.h\n\n  2007-12-02 Simon Goldschmidt\n  * api_msg.c, api_lib.c: fix bug #21656 (recvmbox problem in netconn API): always\n    allocate a recvmbox in netconn_new_with_proto_and_callback. For a tcp-listen\n    netconn, this recvmbox is later freed and a new mbox is allocated for acceptmbox.\n    This is a fix for thread-safety and allocates all items needed for a netconn\n    when the netconn is created.\n\n  2007-11-30 Simon Goldschmidt\n  * udp.c: first attempt to fix bug #21655 (DHCP doesn't work reliably with multiple\n    netifs): if LWIP_DHCP is enabled, UDP packets to DHCP_CLIENT_PORT are passed\n    to netif->dhcp->pcb only (if that exists) and not to any other pcb for the same\n    port (only solution to let UDP pcbs 'bind' to a netif instead of an IP address)\n\n  2007-11-27 Simon Goldschmidt\n  * ip.c: fixed bug #21643 (udp_send/raw_send don't fail if netif is down) by\n    letting ip_route only use netifs that are up.\n\n  2007-11-27 Simon Goldschmidt\n  * err.h, api_lib.c, api_msg.c, sockets.c: Changed error handling: ERR_MEM, ERR_BUF\n    and ERR_RTE are seen as non-fatal, all other errors are fatal. netconns and\n    sockets block most operations once they have seen a fatal error.\n\n  2007-11-27 Simon Goldschmidt\n  * udp.h, udp.c, dhcp.c: Implemented new function udp_sendto_if which takes the\n    netif to send as an argument (to be able to send on netifs that are down).\n\n  2007-11-26 Simon Goldschmidt\n  * tcp_in.c: Fixed bug #21582: pcb->acked accounting can be wrong when ACKs\n    arrive out-of-order\n\n  2007-11-21 Simon Goldschmidt\n  * tcp.h, tcp_out.c, api_msg.c: Fixed bug #20287: tcp_output_nagle sends too early\n    Fixed the nagle algorithm; nagle now also works for all raw API applications\n    and has to be explicitly disabled with 'tcp_pcb->flags |= TF_NODELAY'\n\n  2007-11-12 Frédéric Bernon\n  * sockets.c, api.h, api_lib.c, api_msg.h, api_msg.c: Fixed bug #20900. Now, most\n    of the netconn_peer and netconn_addr processing is done inside tcpip_thread\n    context in do_getaddr.\n\n  2007-11-10 Simon Goldschmidt\n  * etharp.c: Fixed bug: assert fired when MEMP_ARP_QUEUE was empty (which can\n    happen any time). Now the packet simply isn't enqueued when out of memory.\n\n  2007-11-01 Simon Goldschmidt\n  * tcp.c, tcp_in.c: Fixed bug #21494: The send mss (pcb->mss) is set to 536 (or\n    TCP_MSS if that is smaller) as long as no MSS option is received from the\n    remote host.\n\n  2007-11-01 Simon Goldschmidt\n  * tcp.h, tcp.c, tcp_in.c: Fixed bug #21491: The MSS option sent (with SYN)\n    is now based on TCP_MSS instead of pcb->mss (on passive open now effectively\n    sending our configured TCP_MSS instead of the one received).\n\n  2007-11-01 Simon Goldschmidt\n  * tcp_in.c: Fixed bug #21181: On active open, the initial congestion window was\n    calculated based on the configured TCP_MSS, not on the MSS option received\n    with SYN+ACK.\n\n  2007-10-09 Simon Goldschmidt\n  * udp.c, inet.c, inet.h: Fixed UDPLite: send: Checksum was always generated too\n    short and also was generated wrong if checksum coverage != tot_len;\n    receive: checksum was calculated wrong if checksum coverage != tot_len\n\n  2007-10-08 Simon Goldschmidt\n  * mem.c: lfree was not updated in mem_realloc!\n\n  2007-10-07 Frédéric Bernon\n  * sockets.c, api.h, api_lib.c: First step to fix \"bug #20900 : Potential\n    crash error problem with netconn_peer & netconn_addr\". VERY IMPORTANT:\n    this change cause an API breakage for netconn_addr, since a parameter\n    type change. Any compiler should cause an error without any changes in\n    yours netconn_peer calls (so, it can't be a \"silent change\"). It also\n    reduce a little bit the footprint for socket layer (lwip_getpeername &\n    lwip_getsockname use now a common lwip_getaddrname function since \n    netconn_peer & netconn_addr have the same parameters).\n\n  2007-09-20 Simon Goldschmidt\n  * tcp.c: Fixed bug #21080 (tcp_bind without check pcbs in TIME_WAIT state)\n    by checking  tcp_tw_pcbs also\n\n  2007-09-19 Simon Goldschmidt\n  * icmp.c: Fixed bug #21107 (didn't reset IP TTL in ICMP echo replies)\n\n  2007-09-15 Mike Kleshov\n  * mem.c: Fixed bug #21077 (inaccuracy in calculation of lwip_stat.mem.used)\n\n  2007-09-06 Frédéric Bernon\n  * several-files: replace some #include \"arch/cc.h\" by \"lwip/arch.h\", or simply remove\n    it as long as \"lwip/opt.h\" is included before (this one include \"lwip/debug.h\" which\n    already include \"lwip/arch.h\"). Like that, default defines are provided by \"lwip/arch.h\"\n    if they are not defined in cc.h, in the same spirit than \"lwip/opt.h\" for lwipopts.h.\n\n  2007-08-30 Frédéric Bernon\n  * igmp.h, igmp.c: Some changes to remove some redundant code, add some traces, \n    and fix some coding style.\n\n  2007-08-28 Frédéric Bernon\n  * tcpip.c: Fix TCPIP_MSG_INPKT processing: now, tcpip_input can be used for any\n    kind of packets. These packets are considered like Ethernet packets (payload \n    pointing to ethhdr) if the netif got the NETIF_FLAG_ETHARP flag. Else, packets \n    are considered like IP packets (payload pointing to iphdr).\n\n  2007-08-27 Frédéric Bernon\n  * api.h, api_lib.c, api_msg.c: First fix for \"bug #20900 : Potential crash error\n    problem with netconn_peer & netconn_addr\". Introduce NETCONN_LISTEN netconn_state\n    and remove obsolete ones (NETCONN_RECV & NETCONN_ACCEPT).\n\n  2007-08-24 Kieran Mansley\n  * inet.c Modify (acc >> 16) test to ((acc >> 16) != 0) to help buggy\n    compiler (Paradigm C++)\n\n  2007-08-09 Frédéric Bernon, Bill Florac\n  * stats.h, stats.c, igmp.h, igmp.c, opt.h: Fix for bug #20503 : IGMP Improvement.\n    Introduce IGMP_STATS to centralize statistics management.\n\n  2007-08-09 Frédéric Bernon, Bill Florac\n  * udp.c: Fix for bug #20503 : IGMP Improvement. Enable to receive a multicast\n    packet on a udp pcb binded on an netif's IP address, and not on \"any\".\n\n  2007-08-09 Frédéric Bernon, Bill Florac\n  * igmp.h, igmp.c, ip.c: Fix minor changes from bug #20503 : IGMP Improvement.\n    This is mainly on using lookup/lookfor, and some coding styles...\n\n  2007-07-26 Frédéric Bernon (and \"thedoctor\")\n  * igmp.c: Fix bug #20595 to accept IGMPv3 \"Query\" messages.\n\n  2007-07-25 Simon Goldschmidt\n  * api_msg.c, tcp.c: Another fix for bug #20021: by not returning an error if\n    tcp_output fails in tcp_close, the code in do_close_internal gets simpler\n    (tcp_output is called again later from tcp timers).\n\n  2007-07-25 Simon Goldschmidt\n  * ip_frag.c: Fixed bug #20429: use the new pbuf_copy_partial instead of the old\n    copy_from_pbuf, which illegally modified the given pbuf.\n\n  2007-07-25 Simon Goldschmidt\n  * tcp_out.c: tcp_enqueue: pcb->snd_queuelen didn't work for chaine PBUF_RAMs:\n    changed snd_queuelen++ to snd_queuelen += pbuf_clen(p).\n\n  2007-07-24 Simon Goldschmidt\n  * api_msg.c, tcp.c: Fix bug #20480: Check the pcb passed to tcp_listen() for the\n    correct state (must be CLOSED).\n\n  2007-07-13 Thomas Taranowski (commited by Jared Grubb)\n  * memp.c: Fix bug #20478: memp_malloc returned NULL+MEMP_SIZE on failed\n    allocation. It now returns NULL.\n\n  2007-07-13 Frédéric Bernon\n  * api_msg.c: Fix bug #20318: api_msg \"recv\" callbacks don't call pbuf_free in\n    all error cases.\n\n  2007-07-13 Frédéric Bernon\n  * api_msg.c: Fix bug #20315: possible memory leak problem if tcp_listen failed,\n    because current code doesn't follow rawapi.txt documentation.\n\n  2007-07-13 Kieran Mansley\n  * src/core/tcp_in.c Apply patch#5741 from Oleg Tyshev to fix bug in\n    out of sequence processing of received packets\n\n  2007-07-03 Simon Goldschmidt\n  * nearly-all-files: Added assertions where PBUF_RAM pbufs are used and an\n    assumption is made that this pbuf is in one piece (i.e. not chained). These\n    assumptions clash with the possibility of converting to fully pool-based\n    pbuf implementations, where PBUF_RAM pbufs might be chained.\n\n  2007-07-03 Simon Goldschmidt\n  * api.h, api_lib.c, api_msg.c: Final fix for bug #20021 and some other problems\n    when closing tcp netconns: removed conn->sem, less context switches when\n    closing, both netconn_close and netconn_delete should safely close tcp\n    connections.\n\n  2007-07-02 Simon Goldschmidt\n  * ipv4/ip.h, ipv6/ip.h, opt.h, netif.h, etharp.h, ipv4/ip.c, netif.c, raw.c,\n    tcp_out.c, udp.c, etharp.c: Added option LWIP_NETIF_HWADDRHINT (default=off)\n    to cache ARP table indices with each pcb instead of single-entry cache for\n    the complete stack.\n\n  2007-07-02 Simon Goldschmidt\n  * tcp.h, tcp.c, tcp_in.c, tcp_out.c: Added some ASSERTS and casts to prevent\n    warnings when assigning to smaller types.\n\n  2007-06-28 Simon Goldschmidt\n  * tcp_out.c: Added check to prevent tcp_pcb->snd_queuelen from overflowing.\n\n  2007-06-28 Simon Goldschmidt\n  * tcp.h: Fixed bug #20287: Fixed nagle algorithm (sending was done too early if\n    a segment contained chained pbufs)\n\n  2007-06-28 Frédéric Bernon\n  * autoip.c: replace most of rand() calls by a macro LWIP_AUTOIP_RAND which compute\n    a \"pseudo-random\" value based on netif's MAC and some autoip fields. It's always\n    possible to define this macro in your own lwipopts.h to always use C library's\n    rand(). Note that autoip_create_rand_addr doesn't use this macro.\n\n  2007-06-28 Frédéric Bernon\n  * netifapi.h, netifapi.c, tcpip.h, tcpip.c: Update code to handle the option\n    LWIP_TCPIP_CORE_LOCKING, and do some changes to be coherent with last modifications\n    in api_lib/api_msg (use pointers and not type with table, etc...) \n\n  2007-06-26 Simon Goldschmidt\n  * udp.h: Fixed bug #20259: struct udp_hdr was lacking the packin defines.\n\n  2007-06-25 Simon Goldschmidt\n  * udp.c: Fixed bug #20253: icmp_dest_unreach was called with a wrong p->payload\n    for udp packets with no matching pcb.\n\n  2007-06-25 Simon Goldschmidt\n  * udp.c: Fixed bug #20220: UDP PCB search in udp_input(): a non-local match\n    could get udp input packets if the remote side matched.\n\n  2007-06-13 Simon Goldschmidt\n  * netif.c: Fixed bug #20180 (TCP pcbs listening on IP_ADDR_ANY could get\n    changed in netif_set_ipaddr if previous netif->ip_addr.addr was 0.\n\n  2007-06-13 Simon Goldschmidt\n  * api_msg.c: pcb_new sets conn->err if protocol is not implemented\n    -> netconn_new_..() does not allocate a new connection for unsupported\n    protocols.\n\n  2007-06-13 Frédéric Bernon, Simon Goldschmidt\n  * api_lib.c: change return expression in netconn_addr and netconn_peer, because\n    conn->err was reset to ERR_OK without any reasons (and error was lost)...\n\n  2007-06-13 Frédéric Bernon, Matthias Weisser\n  * opt.h, mem.h, mem.c, memp.c, pbuf.c, ip_frag.c, vj.c: Fix bug #20162. Rename\n    MEM_ALIGN in LWIP_MEM_ALIGN and MEM_ALIGN_SIZE in LWIP_MEM_ALIGN_SIZE to avoid\n    some macro names collision with some OS macros.\n\n  2007-06-11 Simon Goldschmidt\n  * udp.c: UDP Lite: corrected the use of chksum_len (based on RFC3828: if it's 0,\n    create checksum over the complete packet. On RX, if it's < 8 (and not 0),\n    discard the packet. Also removed the duplicate 'udphdr->chksum = 0' for both\n    UDP & UDP Lite.\n\n  2007-06-11 Srinivas Gollakota & Oleg Tyshev\n  * tcp_out.c: Fix for bug #20075 : \"A problem with keep-alive timer and TCP flags\"\n    where TCP flags wasn't initialized in tcp_keepalive.\n\n  2007-06-03 Simon Goldschmidt\n  * udp.c: udp_input(): Input pbuf was not freed if pcb had no recv function\n    registered, p->payload was modified without modifying p->len if sending\n    icmp_dest_unreach() (had no negative effect but was definitively wrong).\n\n  2007-06-03 Simon Goldschmidt\n  * icmp.c: Corrected bug #19937: For responding to an icmp echo request, icmp\n    re-used the input pbuf even if that didn't have enough space to include the\n    link headers. Now the space is tested and a new pbuf is allocated for the\n    echo response packet if the echo request pbuf isn't big enough.\n\n  2007-06-01 Simon Goldschmidt\n  * sockets.c: Checked in patch #5914: Moved sockopt processing into tcpip_thread.\n\n  2007-05-23 Frédéric Bernon\n  * api_lib.c, sockets.c: Fixed bug #5958 for netconn_listen (acceptmbox only\n    allocated by do_listen if success) and netconn_accept errors handling. In\n    most of api_lib functions, we replace some errors checkings like \"if (conn==NULL)\"\n    by ASSERT, except for netconn_delete.\n\n  2007-05-23 Frédéric Bernon\n  * api_lib.c: Fixed bug #5957 \"Safe-thread problem inside netconn_recv\" to return\n    an error code if it's impossible to fetch a pbuf on a TCP connection (and not\n    directly close the recvmbox).\n\n  2007-05-22 Simon Goldschmidt\n  * tcp.c: Fixed bug #1895 (tcp_bind not correct) by introducing a list of\n    bound but unconnected (and non-listening) tcp_pcbs.\n\n  2007-05-22 Frédéric Bernon\n  * sys.h, sys.c, api_lib.c, tcpip.c: remove sys_mbox_fetch_timeout() (was only\n    used for LWIP_SO_RCVTIMEO option) and use sys_arch_mbox_fetch() instead of\n    sys_mbox_fetch() in api files. Now, users SHOULD NOT use internal lwIP features\n    like \"sys_timeout\" in their application threads.\n\n  2007-05-22 Frédéric Bernon\n  * api.h, api_lib.c, api_msg.h, api_msg.c: change the struct api_msg_msg to see\n    which parameters are used by which do_xxx function, and to avoid \"misusing\"\n    parameters (patch #5938).\n\n  2007-05-22 Simon Goldschmidt\n  * api_lib.c, api_msg.c, raw.c, api.h, api_msg.h, raw.h: Included patch #5938:\n    changed raw_pcb.protocol from u16_t to u8_t since for IPv4 and IPv6, proto\n    is only 8 bits wide. This affects the api, as there, the protocol was\n    u16_t, too.\n\n  2007-05-18 Simon Goldschmidt\n  * memp.c: addition to patch #5913: smaller pointer was returned but\n    memp_memory was the same size -> did not save memory.\n\n  2007-05-16 Simon Goldschmidt\n  * loopif.c, slipif.c: Fix bug #19729: free pbuf if netif->input() returns\n    != ERR_OK.\n\n  2007-05-16 Simon Goldschmidt\n  * api_msg.c, udp.c: If a udp_pcb has a local_ip set, check if it is the same\n    as the one of the netif used for sending to prevent sending from old\n    addresses after a netif address gets changed (partly fixes bug #3168).\n\n  2007-05-16 Frédéric Bernon\n  * tcpip.c, igmp.h, igmp.c: Fixed bug \"#19800 : IGMP: igmp_tick() will not work\n    with NO_SYS=1\". Note that igmp_init is always in tcpip_thread (and not in \n    tcpip_init) because we have to be sure that network interfaces are already\n    added (mac filter is updated only in igmp_init for the moment).\n\n  2007-05-16 Simon Goldschmidt\n  * mem.c, memp.c: Removed semaphores from memp, changed sys_sem_wait calls\n    into sys_arch_sem_wait calls to prevent timers from running while waiting\n    for the heap. This fixes bug #19167.\n\n  2007-05-13 Simon Goldschmidt\n  * tcp.h, sockets.h, sockets.c: Fixed bug from patch #5865 by moving the defines\n    for socket options (lwip_set/-getsockopt) used with level IPPROTO_TCP from\n    tcp.h to sockets.h.\n\n  2007-05-07 Simon Goldschmidt\n  * mem.c: Another attempt to fix bug #17922.\n\n  2007-05-04 Simon Goldschmidt\n  * pbuf.c, pbuf.h, etharp.c: Further update to ARP queueing: Changed pbuf_copy()\n    implementation so that it can be reused (don't allocate the target\n    pbuf inside pbuf_copy()).\n\n  2007-05-04 Simon Goldschmidt\n  * memp.c: checked in patch #5913: in memp_malloc() we can return memp as mem\n    to save a little RAM (next pointer of memp is not used while not in pool).\n\n  2007-05-03 \"maq\"\n  * sockets.c: Fix ioctl FIONREAD when some data remains from last recv.\n    (patch #3574).\n\n  2007-04-23 Simon Goldschmidt\n  * loopif.c, loopif.h, opt.h, src/netif/FILES: fix bug #2595: \"loopif results\n    in NULL reference for incoming TCP packets\". Loopif has to be configured\n    (using LWIP_LOOPIF_MULTITHREADING) to directly call netif->input()\n    (multithreading environments, e.g. netif->input() = tcpip_input()) or\n    putting packets on a list that is fed to the stack by calling loopif_poll()\n    (single-thread / NO_SYS / polling environment where e.g.\n    netif->input() = ip_input).\n\n  2007-04-17 Jonathan Larmour\n  * pbuf.c: Use s32_t in pbuf_realloc(), as an s16_t can't reliably hold\n    the difference between two u16_t's.\n  * sockets.h: FD_SETSIZE needs to match number of sockets, which is\n    MEMP_NUM_NETCONN in sockets.c right now.\n\n  2007-04-12 Jonathan Larmour\n  * icmp.c: Reset IP header TTL in ICMP ECHO responses (bug #19580).\n\n  2007-04-12 Kieran Mansley\n  * tcp.c, tcp_in.c, tcp_out.c, tcp.h: Modify way the retransmission\n    timer is reset to fix bug#19434, with help from Oleg Tyshev.\n\n  2007-04-11 Simon Goldschmidt\n  * etharp.c, pbuf.c, pbuf.h: 3rd fix for bug #11400 (arp-queuing): More pbufs than\n    previously thought need to be copied (everything but PBUF_ROM!). Cleaned up\n    pbuf.c: removed functions no needed any more (by etharp).\n\n  2007-04-11 Kieran Mansley\n  * inet.c, ip_addr.h, sockets.h, sys.h, tcp.h: Apply patch #5745: Fix\n    \"Constant is long\" warnings with 16bit compilers.  Contributed by\n    avatar@mmlab.cse.yzu.edu.tw\n\n  2007-04-05 Frédéric Bernon, Jonathan Larmour\n  * api_msg.c: Fix bug #16830: \"err_tcp() posts to connection mailbox when no pend on\n    the mailbox is active\". Now, the post is only done during a connect, and do_send,\n    do_write and do_join_leave_group don't do anything if a previous error was signaled.\n\n  2007-04-03 Frédéric Bernon\n  * ip.c: Don't set the IP_DF (\"Don't fragment\") flag in the IP header in IP output\n    packets. See patch #5834.\n\n  2007-03-30 Frédéric Bernon\n  * api_msg.c: add a \"pcb_new\" helper function to avoid redundant code, and to add\n    missing  pcb allocations checking (in do_bind, and for each raw_new). Fix style.\n\n  2007-03-30 Frédéric Bernon\n  * most of files: prefix all debug.h define with \"LWIP_\" to avoid any conflict with\n    others environment defines (these were too \"generic\").\n\n  2007-03-28 Frédéric Bernon\n  * api.h, api_lib.c, sockets.c: netbuf_ref doesn't check its internal pbuf_alloc call\n    result and can cause a crash. lwip_send now check netbuf_ref result.\n\n  2007-03-28 Simon Goldschmidt\n  * sockets.c Remove \"#include <errno.h>\" from sockets.c to avoid multiple\n    definition of macros (in errno.h and lwip/arch.h) if LWIP_PROVIDE_ERRNO is\n    defined. This is the way it should have been already (looking at\n    doc/sys_arch.txt)\n\n  2007-03-28 Kieran Mansley\n  * opt.h Change default PBUF_POOL_BUFSIZE (again) to accomodate default MSS +\n    IP and TCP headers *and* physical link headers\n\n  2007-03-26 Frédéric Bernon (based on patch from Dmitry Potapov)\n  * api_lib.c: patch for netconn_write(), fixes a possible race condition which cause\n    to send some garbage. It is not a definitive solution, but the patch does solve\n    the problem for most cases.\n\n  2007-03-22 Frédéric Bernon\n  * api_msg.h, api_msg.c: Remove obsolete API_MSG_ACCEPT and do_accept (never used).\n\n  2007-03-22 Frédéric Bernon\n  * api_lib.c: somes resources couldn't be freed if there was errors during\n    netconn_new_with_proto_and_callback.\n\n  2007-03-22 Frédéric Bernon\n  * ethernetif.c: update netif->input calls to check return value. In older ports,\n    it's a good idea to upgrade them, even if before, there could be another problem\n    (access to an uninitialized mailbox).\n\n  2007-03-21 Simon Goldschmidt\n  * sockets.c: fixed bug #5067 (essentialy a signed/unsigned warning fixed\n    by casting to unsigned).\n\n  2007-03-21 Frédéric Bernon\n  * api_lib.c, api_msg.c, tcpip.c: integrate sys_mbox_fetch(conn->mbox, NULL) calls from\n    api_lib.c to tcpip.c's tcpip_apimsg(). Now, use a local variable and not a\n    dynamic one from memp to send tcpip_msg to tcpip_thread in a synchrone call.\n    Free tcpip_msg from tcpip_apimsg is not done in tcpip_thread. This give a\n    faster and more reliable communication between api_lib and tcpip.\n\n  2007-03-21 Frédéric Bernon\n  * opt.h: Add LWIP_NETIF_CALLBACK (to avoid compiler warning) and set it to 0.\n\n  2007-03-21 Frédéric Bernon\n  * api_msg.c, igmp.c, igmp.h: Fix C++ style comments\n\n  2007-03-21 Kieran Mansley\n  * opt.h Change default PBUF_POOL_BUFSIZE to accomodate default MSS +\n    IP and TCP headers\n\n  2007-03-21 Kieran Mansley\n  * Fix all uses of pbuf_header to check the return value.  In some\n    cases just assert if it fails as I'm not sure how to fix them, but\n    this is no worse than before when they would carry on regardless\n    of the failure.\n\n  2007-03-21 Kieran Mansley\n  * sockets.c, igmp.c, igmp.h, memp.h: Fix C++ style comments and\n    comment out missing header include in icmp.c\n\n  2007-03-20 Frédéric Bernon\n  * memp.h, stats.c: Fix stats_display function where memp_names table wasn't\n    synchronized with memp.h.\n\n  2007-03-20 Frédéric Bernon\n  * tcpip.c: Initialize tcpip's mbox, and verify if initialized in tcpip_input,\n    tcpip_ethinput, tcpip_callback, tcpip_apimsg, to fix a init problem with \n    network interfaces. Also fix a compiler warning.\n\n  2007-03-20 Kieran Mansley\n  * udp.c: Only try and use pbuf_header() to make space for headers if\n    not a ROM or REF pbuf.\n\n  2007-03-19 Frédéric Bernon\n  * api_msg.h, api_msg.c, tcpip.h, tcpip.c: Add return types to tcpip_apimsg()\n    and api_msg_post().\n\n  2007-03-19 Frédéric Bernon\n  * Remove unimplemented \"memp_realloc\" function from memp.h.\n\n  2007-03-11 Simon Goldschmidt\n  * pbuf.c: checked in patch #5796: pbuf_alloc: len field claculation caused\n    memory corruption.\n\n  2007-03-11 Simon Goldschmidt (based on patch from Dmitry Potapov)\n  * api_lib.c, sockets.c, api.h, api_msg.h, sockets.h: Fixed bug #19251\n    (missing `const' qualifier in socket functions), to get more compatible to\n    standard POSIX sockets.\n\n  2007-03-11 Frédéric Bernon (based on patch from Dmitry Potapov)\n  * sockets.c: Add asserts inside bind, connect and sendto to check input\n    parameters. Remove excessive set_errno() calls after get_socket(), because\n    errno is set inside of get_socket(). Move last sock_set_errno() inside\n    lwip_close.\n\n  2007-03-09 Simon Goldschmidt\n  * memp.c: Fixed bug #11400: New etharp queueing introduced bug: memp_memory\n    was allocated too small.\n\n  2007-03-06 Simon Goldschmidt\n  * tcpip.c: Initialize dhcp timers in tcpip_thread (if LWIP_DHCP) to protect\n    the stack from concurrent access.\n\n  2007-03-06 Frédéric Bernon, Dmitry Potapov\n  * tcpip.c, ip_frag.c, ethernetif.c: Fix some build problems, and a redundancy\n    call to \"lwip_stats.link.recv++;\" in low_level_input() & ethernetif_input().\n\n  2007-03-06 Simon Goldschmidt\n  * ip_frag.c, ip_frag.h: Reduce code size: don't include code in those files\n    if IP_FRAG == 0 and IP_REASSEMBLY == 0\n\n  2007-03-06 Frédéric Bernon, Simon Goldschmidt\n  * opt.h, ip_frag.h, tcpip.h, tcpip.c, ethernetif.c: add new configuration\n    option named ETHARP_TCPIP_ETHINPUT, which enable the new tcpip_ethinput.\n    Allow to do ARP processing for incoming packets inside tcpip_thread\n    (protecting ARP layer against concurrent access). You can also disable\n    old code using tcp_input with new define ETHARP_TCPIP_INPUT set to 0.\n    Older ports have to use tcpip_ethinput.\n\n  2007-03-06 Simon Goldschmidt (based on patch from Dmitry Potapov)\n  * err.h, err.c: fixed compiler warning \"initialization dircards qualifiers\n    from pointer target type\"\n\n  2007-03-05 Frédéric Bernon\n  * opt.h, sockets.h: add new configuration options (LWIP_POSIX_SOCKETS_IO_NAMES,\n    ETHARP_TRUST_IP_MAC, review SO_REUSE)\n\n  2007-03-04 Frédéric Bernon\n  * api_msg.c: Remove some compiler warnings : parameter \"pcb\" was never\n    referenced.\n\n  2007-03-04 Frédéric Bernon\n  * api_lib.c: Fix \"[patch #5764] api_lib.c cleanup: after patch #5687\" (from\n    Dmitry Potapov).\n    The api_msg struct stay on the stack (not moved to netconn struct).\n\n  2007-03-04 Simon Goldschmidt (based on patch from Dmitry Potapov)\n  * pbuf.c: Fix BUG#19168 - pbuf_free can cause deadlock (if\n    SYS_LIGHTWEIGHT_PROT=1 & freeing PBUF_RAM when mem_sem is not available)\n    Also fixed cast warning in pbuf_alloc()\n\n  2007-03-04 Simon Goldschmidt\n  * etharp.c, etharp.h, memp.c, memp.h, opt.h: Fix BUG#11400 - don't corrupt\n    existing pbuf chain when enqueuing multiple pbufs to a pending ARP request\n\n  2007-03-03 Frédéric Bernon\n  * udp.c: remove obsolete line \"static struct udp_pcb *pcb_cache = NULL;\"\n    It is static, and never used in udp.c except udp_init().\n\n  2007-03-02 Simon Goldschmidt\n  * tcpip.c: Moved call to ip_init(), udp_init() and tcp_init() from\n    tcpip_thread() to tcpip_init(). This way, raw API connections can be\n    initialized before tcpip_thread is running (e.g. before OS is started)\n\n  2007-03-02 Frédéric Bernon\n  * rawapi.txt: Fix documentation mismatch with etharp.h about etharp_tmr's call\n    interval.\n\n  2007-02-28 Kieran Mansley \n  * pbuf.c: Fix BUG#17645 - ensure pbuf payload pointer is not moved\n    outside the region of the pbuf by pbuf_header()\n\n  2007-02-28 Kieran Mansley \n  * sockets.c: Fix BUG#19161 - ensure milliseconds timeout is non-zero\n    when supplied timeout is also non-zero \n\n(STABLE-1.2.0)\n\n  2006-12-05 Leon Woestenberg\n  * CHANGELOG: Mention STABLE-1.2.0 release.\n\n  ++ New features:\n\n  2006-12-01 Christiaan Simons\n  * mem.h, opt.h: Added MEM_LIBC_MALLOC option.\n    Note this is a workaround. Currently I have no other options left.\n\n  2006-10-26 Christiaan Simons (accepted patch by Jonathan Larmour)\n  * ipv4/ip_frag.c: rename MAX_MTU to IP_FRAG_MAX_MTU and move define\n    to include/lwip/opt.h.\n  * ipv4/lwip/ip_frag.h: Remove unused IP_REASS_INTERVAL.\n    Move IP_REASS_MAXAGE and IP_REASS_BUFSIZE to include/lwip/opt.h.\n  * opt.h: Add above new options.\n\n  2006-08-18 Christiaan Simons\n  * tcp_{in,out}.c: added SNMP counters.\n  * ipv4/ip.c: added SNMP counters.\n  * ipv4/ip_frag.c: added SNMP counters.\n\n  2006-08-08 Christiaan Simons\n  * etharp.{c,h}: added etharp_find_addr() to read\n    (stable) ethernet/IP address pair from ARP table\n\n  2006-07-14 Christiaan Simons\n  * mib_structs.c: added\n  * include/lwip/snmp_structs.h: added\n  * netif.{c,h}, netif/ethernetif.c: added SNMP statistics to netif struct\n\n  2006-07-06 Christiaan Simons\n  * snmp/asn1_{enc,dec}.c added\n  * snmp/mib2.c added\n  * snmp/msg_{in,out}.c added\n  * include/lwip/snmp_asn1.h added\n  * include/lwip/snmp_msg.h added\n  * doc/snmp_agent.txt added\n\n  2006-03-29 Christiaan Simons\n  * inet.c, inet.h: Added platform byteswap support.\n    Added LWIP_PLATFORM_BYTESWAP define (defaults to 0) and\n    optional LWIP_PLATFORM_HTONS(), LWIP_PLATFORM_HTONL() macros.\n\n  ++ Bug fixes:\n\n  2006-11-30 Christiaan Simons\n  * dhcp.c: Fixed false triggers of request_timeout.\n\n  2006-11-28 Christiaan Simons\n  * netif.c: In netif_add() fixed missing clear of ip_addr, netmask, gw and flags.\n\n  2006-10-11 Christiaan Simons\n  * api_lib.c etharp.c, ip.c, memp.c, stats.c, sys.{c,h} tcp.h:\n    Partially accepted patch #5449 for ANSI C compatibility / build fixes.\n  * ipv4/lwip/ip.h ipv6/lwip/ip.h: Corrected UDP-Lite protocol\n    identifier from 170 to 136 (bug #17574).\n\n  2006-10-10 Christiaan Simons\n  * api_msg.c: Fixed Nagle algorithm as reported by Bob Grice.\n\n  2006-08-17 Christiaan Simons\n  * udp.c: Fixed bug #17200, added check for broadcast\n    destinations for PCBs bound to a unicast address.\n\n  2006-08-07 Christiaan Simons\n  * api_msg.c: Flushing TCP output in do_close() (bug #15926).\n\n  2006-06-27 Christiaan Simons\n  * api_msg.c: Applied patch for cold case (bug #11135).\n    In accept_function() ensure newconn->callback is always initialized.\n\n  2006-06-15 Christiaan Simons\n  * mem.h: added MEM_SIZE_F alias to fix an ancient cold case (bug #1748),\n    facilitate printing of mem_size_t and u16_t statistics.\n\n  2006-06-14 Christiaan Simons\n  * api_msg.c: Applied patch #5146 to handle allocation failures\n    in accept() by Kevin Lawson.\n\n  2006-05-26 Christiaan Simons\n  * api_lib.c: Removed conn->sem creation and destruction \n    from netconn_write() and added sys_sem_new to netconn_new_*.\n\n(STABLE-1_1_1)\n\n  2006-03-03  Christiaan Simons\n  * ipv4/ip_frag.c: Added bound-checking assertions on ip_reassbitmap\n    access and added pbuf_alloc() return value checks.\n\n  2006-01-01  Leon Woestenberg <leon.woestenberg@gmx.net>\n  * tcp_{in,out}.c, tcp_out.c: Removed 'even sndbuf' fix in TCP, which is\n    now handled by the checksum routine properly.\n\n  2006-02-27  Leon Woestenberg <leon.woestenberg@gmx.net>\n   * pbuf.c: Fix alignment; pbuf_init() would not work unless\n     pbuf_pool_memory[] was properly aligned. (Patch by Curt McDowell.)\n\n  2005-12-20  Leon Woestenberg <leon.woestenberg@gmx.net>\n  * tcp.c: Remove PCBs which stay in LAST_ACK state too long. Patch\n    submitted by Mitrani Hiroshi.\n\n  2005-12-15  Christiaan Simons\n  * inet.c: Disabled the added summing routine to preserve code space.\n\n  2005-12-14  Leon Woestenberg <leon.woestenberg@gmx.net>\n  * tcp_in.c: Duplicate FIN ACK race condition fix by Kelvin Lawson.\n    Added Curt McDowell's optimized checksumming routine for future\n    inclusion. Need to create test case for unaliged, aligned, odd,\n    even length combination of cases on various endianess machines.\n\n  2005-12-09  Christiaan Simons\n  * inet.c: Rewrote standard checksum routine in proper portable C.\n\n  2005-11-25  Christiaan Simons\n  * udp.c tcp.c: Removed SO_REUSE hack. Should reside in socket code only.\n  * *.c: introduced cc.h LWIP_DEBUG formatters matching the u16_t, s16_t,\n    u32_t, s32_t typedefs. This solves most debug word-length assumes.\n\n  2005-07-17 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * inet.c: Fixed unaligned 16-bit access in the standard checksum\n    routine by Peter Jolasson.\n  * slipif.c: Fixed implementation assumption of single-pbuf datagrams.\n\n  2005-02-04 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * tcp_out.c: Fixed uninitialized 'queue' referenced in memerr branch.\n  * tcp_{out|in}.c: Applied patch fixing unaligned access.\n\n  2005-01-04 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * pbuf.c: Fixed missing semicolon after LWIP_DEBUG statement.\n\n  2005-01-03 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * udp.c: UDP pcb->recv() was called even when it was NULL.\n\n(STABLE-1_1_0)\n\n  2004-12-28 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * etharp.*: Disabled multiple packets on the ARP queue.\n    This clashes with TCP queueing.\n\n  2004-11-28 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * etharp.*: Fixed race condition from ARP request to ARP timeout.\n    Halved the ARP period, doubled the period counts.\n    ETHARP_MAX_PENDING now should be at least 2. This prevents\n    the counter from reaching 0 right away (which would allow\n    too little time for ARP responses to be received).\n\n  2004-11-25 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * dhcp.c: Decline messages were not multicast but unicast.\n  * etharp.c: ETHARP_CREATE is renamed to ETHARP_TRY_HARD.\n    Do not try hard to insert arbitrary packet's source address,\n    etharp_ip_input() now calls etharp_update() without ETHARP_TRY_HARD. \n    etharp_query() now always DOES call ETHARP_TRY_HARD so that users\n    querying an address will see it appear in the cache (DHCP could\n    suffer from this when a server invalidly gave an in-use address.)\n  * ipv4/ip_addr.h: Renamed ip_addr_maskcmp() to _netcmp() as we are\n    comparing network addresses (identifiers), not the network masks\n    themselves.\n  * ipv4/ip_addr.c: ip_addr_isbroadcast() now checks that the given\n    IP address actually belongs to the network of the given interface.\n\n  2004-11-24 Kieran Mansley <kjm25@cam.ac.uk>\n  * tcp.c: Increment pcb->snd_buf when ACK is received in SYN_SENT state.\n\n(STABLE-1_1_0-RC1)\n\n  2004-10-16 Kieran Mansley <kjm25@cam.ac.uk>\n  * tcp.c: Add code to tcp_recved() to send an ACK (window update) immediately,\n    even if one is already pending, if the rcv_wnd is above a threshold\n    (currently TCP_WND/2). This avoids waiting for a timer to expire to send a\n    delayed ACK in order to open the window if the stack is only receiving data.\n\n  2004-09-12 Kieran Mansley <kjm25@cam.ac.uk>\n  * tcp*.*: Retransmit time-out handling improvement by Sam Jansen.\n\n  2004-08-20 Tony Mountifield <tony@softins.co.uk>\n  * etharp.c: Make sure the first pbuf queued on an ARP entry\n    is properly ref counted.\n\n  2004-07-27 Tony Mountifield <tony@softins.co.uk>\n  * debug.h: Added (int) cast in LWIP_DEBUGF() to avoid compiler\n    warnings about comparison.\n  * pbuf.c: Stopped compiler complaining of empty if statement\n    when LWIP_DEBUGF() empty.  Closed an unclosed comment.\n  * tcp.c: Stopped compiler complaining of empty if statement\n    when LWIP_DEBUGF() empty.\n  * ip.h Corrected IPH_TOS() macro: returns a byte, so doesn't need htons().\n  * inet.c: Added a couple of casts to quiet the compiler.\n    No need to test isascii(c) before isdigit(c) or isxdigit(c).\n\n  2004-07-22 Tony Mountifield <tony@softins.co.uk>\n  * inet.c: Made data types consistent in inet_ntoa().\n    Added casts for return values of checksum routines, to pacify compiler.\n  * ip_frag.c, tcp_out.c, sockets.c, pbuf.c\n    Small corrections to some debugging statements, to pacify compiler.\n\n  2004-07-21 Tony Mountifield <tony@softins.co.uk>\n  * etharp.c: Removed spurious semicolon and added missing end-of-comment.\n  * ethernetif.c Updated low_level_output() to match prototype for\n    netif->linkoutput and changed low_level_input() similarly for consistency.\n  * api_msg.c: Changed recv_raw() from int to u8_t, to match prototype\n    of raw_recv() in raw.h and so avoid compiler error.\n  * sockets.c: Added trivial (int) cast to keep compiler happier.\n  * ip.c, netif.c Changed debug statements to use the tidier ip4_addrN() macros.\n\n(STABLE-1_0_0)\n\n  ++ Changes:\n\n  2004-07-05 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * sockets.*: Restructured LWIP_PRIVATE_TIMEVAL. Make sure\n    your cc.h file defines this either 1 or 0. If non-defined,\n    defaults to 1.\n  * .c: Added <string.h> and <errno.h> includes where used.\n  * etharp.c: Made some array indices unsigned.\n\n  2004-06-27 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * netif.*: Added netif_set_up()/down().\n  * dhcp.c: Changes to restart program flow.\n\n  2004-05-07 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * etharp.c: In find_entry(), instead of a list traversal per candidate, do a\n    single-pass lookup for different candidates. Should exploit locality.\n\n  2004-04-29 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * tcp*.c: Cleaned up source comment documentation for Doxygen processing.\n  * opt.h: ETHARP_ALWAYS_INSERT option removed to comply with ARP RFC.\n  * etharp.c: update_arp_entry() only adds new ARP entries when adviced to by\n    the caller. This deprecates the ETHARP_ALWAYS_INSERT overrule option.\n\n  ++ Bug fixes:\n\n  2004-04-27 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * etharp.c: Applied patch of bug #8708 by Toni Mountifield with a solution\n    suggested by Timmy Brolin. Fix for 32-bit processors that cannot access\n    non-aligned 32-bit words, such as soms 32-bit TCP/IP header fields. Fix\n    is to prefix the 14-bit Ethernet headers with two padding bytes.\n\n  2004-04-23 Leon Woestenberg <leon.woestenberg@gmx.net>\n  * ip_addr.c: Fix in the ip_addr_isbroadcast() check.\n  * etharp.c: Fixed the case where the packet that initiates the ARP request\n    is not queued, and gets lost. Fixed the case where the packets destination\n    address is already known; we now always queue the packet and perform an ARP\n    request.\n\n(STABLE-0_7_0)\n\n  ++ Bug fixes:\n\n  * Fixed TCP bug for SYN_SENT to ESTABLISHED state transition.\n  * Fixed TCP bug in dequeueing of FIN from out of order segment queue.\n  * Fixed two possible NULL references in rare cases.\n\n(STABLE-0_6_6)\n\n  ++ Bug fixes:\n\n  * Fixed DHCP which did not include the IP address in DECLINE messages.\n\n  ++ Changes:\n\n  * etharp.c has been hauled over a bit.\n\n(STABLE-0_6_5)\n\n  ++ Bug fixes:\n\n  * Fixed TCP bug induced by bad window resizing with unidirectional TCP traffic.\n  * Packets sent from ARP queue had invalid source hardware address.\n\n  ++ Changes:\n\n  * Pass-by ARP requests do now update the cache.\n\n  ++ New features:\n\n  * No longer dependent on ctype.h.\n  * New socket options.\n  * Raw IP pcb support.\n\n(STABLE-0_6_4)\n\n  ++ Bug fixes:\n\n  * Some debug formatters and casts fixed.\n  * Numereous fixes in PPP.\n\n  ++ Changes:\n\n  * DEBUGF now is LWIP_DEBUGF\n  * pbuf_dechain() has been re-enabled.\n  * Mentioned the changed use of CVS branches in README.\n\n(STABLE-0_6_3)\n\n  ++ Bug fixes:\n\n  * Fixed pool pbuf memory leak in pbuf_alloc().\n    Occured if not enough PBUF_POOL pbufs for a packet pbuf chain.\n    Reported by Savin Zlobec.\n\n  * PBUF_POOL chains had their tot_len field not set for non-first\n    pbufs. Fixed in pbuf_alloc().\n\n  ++ New features:\n\n  * Added PPP stack contributed by Marc Boucher\n\n  ++ Changes:\n\n  * Now drops short packets for ICMP/UDP/TCP protocols. More robust.\n\n  * ARP queueuing now queues the latest packet instead of the first.\n    This is the RFC recommended behaviour, but can be overridden in\n    lwipopts.h.\n\n(0.6.2)\n\n  ++ Bugfixes:\n\n  * TCP has been fixed to deal with the new use of the pbuf->ref\n    counter.\n\n  * DHCP dhcp_inform() crash bug fixed.\n\n  ++ Changes:\n\n  * Removed pbuf_pool_free_cache and pbuf_pool_alloc_cache. Also removed\n    pbuf_refresh(). This has sped up pbuf pool operations considerably.\n    Implemented by David Haas.\n\n(0.6.1)\n\n  ++ New features:\n\n  * The packet buffer implementation has been enhanced to support\n    zero-copy and copy-on-demand for packet buffers which have their\n    payloads in application-managed memory.\n    Implemented by David Haas.\n\n    Use PBUF_REF to make a pbuf refer to RAM. lwIP will use zero-copy\n    if an outgoing packet can be directly sent on the link, or perform\n    a copy-on-demand when necessary.\n\n    The application can safely assume the packet is sent, and the RAM\n    is available to the application directly after calling udp_send()\n    or similar function.\n\n  ++ Bugfixes:\n\n  * ARP_QUEUEING should now correctly work for all cases, including\n    PBUF_REF.\n    Implemented by Leon Woestenberg.\n\n  ++ Changes:\n\n  * IP_ADDR_ANY is no longer a NULL pointer. Instead, it is a pointer\n    to a '0.0.0.0' IP address.\n\n  * The packet buffer implementation is changed. The pbuf->ref counter\n    meaning has changed, and several pbuf functions have been\n    adapted accordingly.\n\n  * netif drivers have to be changed to set the hardware address length field\n    that must be initialized correctly by the driver (hint: 6 for Ethernet MAC).\n    See the contrib/ports/c16x cs8900 driver as a driver example.\n\n  * netif's have a dhcp field that must be initialized to NULL by the driver.\n    See the contrib/ports/c16x cs8900 driver as a driver example.\n\n(0.5.x) This file has been unmaintained up to 0.6.1. All changes are\n  logged in CVS but have not been explained here.\n\n(0.5.3) Changes since version 0.5.2\n\n  ++ Bugfixes:\n\n  * memp_malloc(MEMP_API_MSG) could fail with multiple application\n    threads because it wasn't protected by semaphores.\n\n  ++ Other changes:\n\n  * struct ip_addr now packed.\n\n  * The name of the time variable in arp.c has been changed to ctime\n    to avoid conflicts with the time() function.\n\n(0.5.2) Changes since version 0.5.1\n\n  ++ New features:\n\n  * A new TCP function, tcp_tmr(), now handles both TCP timers.\n\n  ++ Bugfixes:\n\n  * A bug in tcp_parseopt() could cause the stack to hang because of a\n    malformed TCP option.\n\n  * The address of new connections in the accept() function in the BSD\n    socket library was not handled correctly.\n\n  * pbuf_dechain() did not update the ->tot_len field of the tail.\n\n  * Aborted TCP connections were not handled correctly in all\n    situations.\n\n  ++ Other changes:\n\n  * All protocol header structs are now packed.\n\n  * The ->len field in the tcp_seg structure now counts the actual\n    amount of data, and does not add one for SYN and FIN segments.\n\n(0.5.1) Changes since version 0.5.0\n\n  ++ New features:\n\n  * Possible to run as a user process under Linux.\n\n  * Preliminary support for cross platform packed structs.\n\n  * ARP timer now implemented.\n\n  ++ Bugfixes:\n\n  * TCP output queue length was badly initialized when opening\n    connections.\n\n  * TCP delayed ACKs were not sent correctly.\n\n  * Explicit initialization of BSS segment variables.\n\n  * read() in BSD socket library could drop data.\n\n  * Problems with memory alignment.\n\n  * Situations when all TCP buffers were used could lead to\n    starvation.\n\n  * TCP MSS option wasn't parsed correctly.\n\n  * Problems with UDP checksum calculation.\n\n  * IP multicast address tests had endianess problems.\n\n  * ARP requests had wrong destination hardware address.\n\n  ++ Other changes:\n\n  * struct eth_addr changed from u16_t[3] array to u8_t[6].\n\n  * A ->linkoutput() member was added to struct netif.\n\n  * TCP and UDP ->dest_* struct members where changed to ->remote_*.\n\n  * ntoh* macros are now null definitions for big endian CPUs.\n\n(0.5.0) Changes since version 0.4.2\n\n  ++ New features:\n\n  * Redesigned operating system emulation layer to make porting easier.\n\n  * Better control over TCP output buffers.\n\n  * Documenation added.\n\n  ++ Bugfixes:\n\n  * Locking issues in buffer management.\n\n  * Bugfixes in the sequential API.\n\n  * IP forwarding could cause memory leakage. This has been fixed.\n\n  ++ Other changes:\n\n  * Directory structure somewhat changed; the core/ tree has been\n    collapsed.\n\n(0.4.2) Changes since version 0.4.1\n\n  ++ New features:\n\n  * Experimental ARP implementation added.\n\n  * Skeleton Ethernet driver added.\n\n  * Experimental BSD socket API library added.\n\n  ++ Bugfixes:\n\n  * In very intense situations, memory leakage could occur. This has\n    been fixed.\n\n  ++ Other changes:\n\n  * Variables named \"data\" and \"code\" have been renamed in order to\n    avoid name conflicts in certain compilers.\n\n  * Variable++ have in appliciable cases been translated to ++variable\n    since some compilers generate better code in the latter case.\n\n(0.4.1) Changes since version 0.4\n\n  ++ New features:\n\n  * TCP: Connection attempts time out earlier than data\n    transmissions. Nagle algorithm implemented. Push flag set on the\n    last segment in a burst.\n\n  * UDP: experimental support for UDP-Lite extensions.\n\n  ++ Bugfixes:\n\n  * TCP: out of order segments were in some cases handled incorrectly,\n    and this has now been fixed. Delayed acknowledgements was broken\n    in 0.4, has now been fixed. Binding to an address that is in use\n    now results in an error. Reset connections sometimes hung an\n    application; this has been fixed.\n\n  * Checksum calculation sometimes failed for chained pbufs with odd\n    lengths. This has been fixed.\n\n  * API: a lot of bug fixes in the API. The UDP API has been improved\n    and tested. Error reporting and handling has been\n    improved. Logical flaws and race conditions for incoming TCP\n    connections has been found and removed.\n\n  * Memory manager: alignment issues. Reallocating memory sometimes\n    failed, this has been fixed.\n\n  * Generic library: bcopy was flawed and has been fixed.\n\n  ++ Other changes:\n\n  * API: all datatypes has been changed from generic ones such as\n    ints, to specified ones such as u16_t. Functions that return\n    errors now have the correct type (err_t).\n\n  * General: A lot of code cleaned up and debugging code removed. Many\n    portability issues have been fixed.\n\n  * The license was changed; the advertising clause was removed.\n\n  * C64 port added.\n\n  * Thanks: Huge thanks go to Dagan Galarneau, Horst Garnetzke, Petri\n    Kosunen, Mikael Caleres, and Frits Wilmink for reporting and\n    fixing bugs!\n\n(0.4) Changes since version 0.3.1\n\n  * Memory management has been radically changed; instead of\n    allocating memory from a shared heap, memory for objects that are\n    rapidly allocated and deallocated is now kept in pools. Allocation\n    and deallocation from those memory pools is very fast. The shared\n    heap is still present but is used less frequently.\n\n  * The memory, memory pool, and packet buffer subsystems now support\n    4-, 2-, or 1-byte alignment.\n\n  * \"Out of memory\" situations are handled in a more robust way.\n\n  * Stack usage has been reduced.\n\n  * Easier configuration of lwIP parameters such as memory usage,\n    TTLs, statistics gathering, etc. All configuration parameters are\n    now kept in a single header file \"lwipopts.h\".\n\n  * The directory structure has been changed slightly so that all\n    architecture specific files are kept under the src/arch\n    hierarchy.\n\n  * Error propagation has been improved, both in the protocol modules\n    and in the API.\n\n  * The code for the RTXC architecture has been implemented, tested\n    and put to use.\n\n  * Bugs have been found and corrected in the TCP, UDP, IP, API, and\n    the Internet checksum modules.\n\n  * Bugs related to porting between a 32-bit and a 16-bit architecture\n    have been found and corrected.\n\n  * The license has been changed slightly to conform more with the\n    original BSD license, including the advertisement clause.\n\n(0.3.1) Changes since version 0.3\n\n  * Fix of a fatal bug in the buffer management. Pbufs with allocated\n    RAM never returned the RAM when the pbuf was deallocated.\n\n  * TCP congestion control, window updates and retransmissions did not\n    work correctly. This has now been fixed.\n\n  * Bugfixes in the API.\n\n(0.3) Changes since version 0.2\n\n  * New and improved directory structure. All include files are now\n    kept in a dedicated include/ directory.\n\n  * The API now has proper error handling. A new function,\n    netconn_err(), now returns an error code for the connection in\n    case of errors.\n\n  * Improvements in the memory management subsystem. The system now\n    keeps a pointer to the lowest free memory block. A new function,\n    mem_malloc2() tries to allocate memory once, and if it fails tries\n    to free some memory and retry the allocation.\n\n  * Much testing has been done with limited memory\n    configurations. lwIP now does a better job when overloaded.\n\n  * Some bugfixes and improvements to the buffer (pbuf) subsystem.\n\n  * Many bugfixes in the TCP code:\n\n    - Fixed a bug in tcp_close().\n\n    - The TCP receive window was incorrectly closed when out of\n      sequence segments was received. This has been fixed.\n\n    - Connections are now timed-out of the FIN-WAIT-2 state.\n\n    - The initial congestion window could in some cases be too\n      large. This has been fixed.\n\n    - The retransmission queue could in some cases be screwed up. This\n      has been fixed.\n\n    - TCP RST flag now handled correctly.\n\n    - Out of sequence data was in some cases never delivered to the\n      application. This has been fixed.\n\n    - Retransmitted segments now contain the correct acknowledgment\n      number and advertised window.\n\n    - TCP retransmission timeout backoffs are not correctly computed\n      (ala BSD). After a number of retransmissions, TCP now gives up\n      the connection.\n\n  * TCP connections now are kept on three lists, one for active\n    connections, one for listening connections, and one for\n    connections that are in TIME-WAIT. This greatly speeds up the fast\n    timeout processing for sending delayed ACKs.\n\n  * TCP now provides proper feedback to the application when a\n    connection has been successfully set up.\n\n  * More comments have been added to the code. The code has also been\n    somewhat cleaned up.\n\n(0.2) Initial public release.\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/COPYING",
    "content": "/*\n * Copyright (c) 2001, 2002 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/FILES",
    "content": "src/      - The source code for the lwIP TCP/IP stack.\ndoc/      - The documentation for lwIP.\ntest/     - Some code to test whether the sources do what they should.\n\nSee also the FILES file in each subdirectory.\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/README",
    "content": "INTRODUCTION\n\nlwIP is a small independent implementation of the TCP/IP protocol\nsuite that has been developed by Adam Dunkels at the Computer and\nNetworks Architectures (CNA) lab at the Swedish Institute of Computer\nScience (SICS).\n\nThe focus of the lwIP TCP/IP implementation is to reduce the RAM usage\nwhile still having a full scale TCP. This making lwIP suitable for use\nin embedded systems with tens of kilobytes of free RAM and room for\naround 40 kilobytes of code ROM.\n\n\nFEATURES\n\n  * IP (Internet Protocol, IPv4 and IPv6) including packet forwarding over\n    multiple network interfaces\n  * ICMP (Internet Control Message Protocol) for network maintenance and debugging\n  * IGMP (Internet Group Management Protocol) for multicast traffic management\n  * MLD (Multicast listener discovery for IPv6). Aims to be compliant with \n    RFC 2710. No support for MLDv2\n  * ND (Neighbor discovery and stateless address autoconfiguration for IPv6).\n    Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862\n    (Address autoconfiguration)\n  * UDP (User Datagram Protocol) including experimental UDP-lite extensions\n  * TCP (Transmission Control Protocol) with congestion control, RTT estimation\n    and fast recovery/fast retransmit\n  * raw/native API for enhanced performance\n  * Optional Berkeley-like socket API\n  * DNS (Domain names resolver)\n\n\nAPPLICATIONS\n\n  * HTTP server with SSI and CGI\n  * SNMPv2c agent with MIB compiler (Simple Network Management Protocol)\n  * SNTP (Simple network time protocol)\n  * NetBIOS name service responder\n  * MDNS (Multicast DNS) responder\n  * iPerf server implementation\n\n\nLICENSE\n\nlwIP is freely available under a BSD license.\n\n\nDEVELOPMENT\n\nlwIP has grown into an excellent TCP/IP stack for embedded devices,\nand developers using the stack often submit bug fixes, improvements,\nand additions to the stack to further increase its usefulness.\n\nDevelopment of lwIP is hosted on Savannah, a central point for\nsoftware development, maintenance and distribution. Everyone can\nhelp improve lwIP by use of Savannah's interface, Git and the\nmailing list. A core team of developers will commit changes to the\nGit source tree.\n\nThe lwIP TCP/IP stack is maintained in the 'lwip' Git module and\ncontributions (such as platform ports) are in the 'contrib' Git module.\n\nSee doc/savannah.txt for details on Git server access for users and\ndevelopers.\n\nThe current Git trees are web-browsable:\n  http://git.savannah.gnu.org/cgit/lwip.git\n  http://git.savannah.gnu.org/cgit/lwip/lwip-contrib.git\n\nSubmit patches and bugs via the lwIP project page:\n  http://savannah.nongnu.org/projects/lwip/\n\nContinuous integration builds (GCC, clang):\n  https://travis-ci.org/yarrick/lwip-merged\n\n\nDOCUMENTATION\n\nSelf documentation of the source code is regularly extracted from the current\nGit sources and is available from this web page:\n  http://www.nongnu.org/lwip/\n\nThere is now a constantly growing wiki about lwIP at\n  http://lwip.wikia.com/wiki/LwIP_Wiki\n\nAlso, there are mailing lists you can subscribe at\n  http://savannah.nongnu.org/mail/?group=lwip\nplus searchable archives:\n  http://lists.nongnu.org/archive/html/lwip-users/\n  http://lists.nongnu.org/archive/html/lwip-devel/\n\nlwIP was originally written by Adam Dunkels:\n  http://dunkels.com/adam/\n\nReading Adam's papers, the files in docs/, browsing the source code\ndocumentation and browsing the mailing list archives is a good way to\nbecome familiar with the design of lwIP.\n\nAdam Dunkels <adam@sics.se>\nLeon Woestenberg <leon.woestenberg@gmx.net>\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/UPGRADING",
    "content": "This file lists major changes between release versions that require\nports or applications to be changed. Use it to update a port or an\napplication written for an older version of lwIP to correctly work\nwith newer versions.\n\n\n(git master)\n\n  * [Enter new changes just after this line - do not remove this line]\n\n(2.0.2)\n\n  ++ Application changes:\n\n  * slipif: The way to pass serial port number has changed. netif->num is not\n    supported any more, netif->state is interpreted as an u8_t port number now\n    (it's not a POINTER to an u8_t any more!)\n\n(2.0.1)\n\n  ++ Application changes:\n\n  * UDP does NOT receive multicast traffic from ALL netifs on an UDP PCB bound to a specific\n    netif any more. Users need to bind to IP_ADDR_ANY to receive multicast traffic and compare \n    ip_current_netif() to the desired netif for every packet.\n    See bug #49662 for an explanation.\n\n(2.0.0)\n\n  ++ Application changes:\n\n  * Changed netif \"up\" flag handling to be an administrative flag (as opposed to the previous meaning of\n    \"ip4-address-valid\", a netif will now not be used for transmission if not up) -> even a DHCP netif\n    has to be set \"up\" before starting the DHCP client\n  * Added IPv6 support (dual-stack or IPv4/IPv6 only)\n  * Changed ip_addr_t to be a union in dual-stack mode (use ip4_addr_t where referring to IPv4 only).\n  * Major rewrite of SNMP (added MIB parser that creates code stubs for custom MIBs);\n    supports SNMPv2c (experimental v3 support)\n  * Moved some core applications from contrib repository to src/apps (and include/lwip/apps)\n\n  +++ Raw API:\n    * Changed TCP listen backlog: removed tcp_accepted(), added the function pair tcp_backlog_delayed()/\n      tcp_backlog_accepted() to explicitly delay backlog handling on a connection pcb\n\n  +++ Socket API:\n    * Added an implementation for posix sendmsg()\n    * Added LWIP_FIONREAD_LINUXMODE that makes ioctl/FIONREAD return the size of the next pending datagram\n\n  ++ Port changes\n\n  +++ new files:\n    * MANY new and moved files! \n    * Added src/Filelists.mk for use in Makefile projects\n    * Continued moving stack-internal parts from abc.h to abc_priv.h in sub-folder \"priv\"\n      to let abc.h only contain the actual application programmer's API\n\n  +++ sys layer:\n    * Made LWIP_TCPIP_CORE_LOCKING==1 the default as it usually performs better than\n      the traditional message passing (although with LWIP_COMPAT_MUTEX you are still\n      open to priority inversion, so this is not recommended any more)\n    * Added LWIP_NETCONN_SEM_PER_THREAD to use one \"op_completed\" semaphore per thread\n      instead of using one per netconn (these semaphores are used even with core locking\n      enabled as some longer lasting functions like big writes still need to delay)\n    * Added generalized abstraction for itoa(), strnicmp(), stricmp() and strnstr()\n      in def.h (to be overridden in cc.h) instead of config \n      options for netbiosns, httpd, dns, etc. ...\n    * New abstraction for hton* and ntoh* functions in def.h.\n      To override them, use the following in cc.h: \n      #define lwip_htons(x) <your_htons>\n      #define lwip_htonl(x) <your_htonl>\n\n  +++ new options:\n     * TODO\n\n  +++ new pools:\n     * Added LWIP_MEMPOOL_* (declare/init/alloc/free) to declare private memp pools\n       that share memp.c code but do not have to be made global via lwippools.h\n     * Added pools for IPv6, MPU_COMPATIBLE, dns-api, netif-api, etc.\n     * added hook LWIP_HOOK_MEMP_AVAILABLE() to get informed when a memp pool was empty and an item\n       is now available\n\n  * Signature of LWIP_HOOK_VLAN_SET macro was changed\n\n  * LWIP_DECLARE_MEMORY_ALIGNED() may be used to declare aligned memory buffers (mem/memp)\n    or to move buffers to dedicated memory using compiler attributes\n\n  * Standard C headers are used to define sized types and printf formatters\n    (disable by setting LWIP_NO_STDINT_H=1 or LWIP_NO_INTTYPES_H=1 if your compiler\n    does not support these)\n\n\n  ++ Major bugfixes/improvements\n\n  * Added IPv6 support (dual-stack or IPv4/IPv6 only)\n  * Major rewrite of PPP (incl. keep-up with apache pppd)\n    see doc/ppp.txt for an upgrading how-to\n  * Major rewrite of SNMP (incl. MIB parser)\n  * Fixed timing issues that might have lead to losing a DHCP lease\n  * Made rx processing path more robust against crafted errors\n  * TCP window scaling support\n  * modification of api modules to support FreeRTOS-MPU (don't pass stack-pointers to other threads)\n  * made DNS client more robust\n  * support PBUF_REF for RX packets\n  * LWIP_NETCONN_FULLDUPLEX allows netconn/sockets to be used for reading/writing from separate\n    threads each (needs LWIP_NETCONN_SEM_PER_THREAD)\n  * Moved and reordered stats (mainly memp/mib2)\n\n(1.4.0)\n\n  ++ Application changes:\n\n  * Replaced struct ip_addr by typedef ip_addr_t (struct ip_addr is kept for\n    compatibility to old applications, but will be removed in the future).\n\n  * Renamed mem_realloc() to mem_trim() to prevent confusion with realloc()\n\n  +++ Raw API:\n    * Changed the semantics of tcp_close() (since it was rather a\n      shutdown before): Now the application does *NOT* get any calls to the recv\n      callback (aside from NULL/closed) after calling tcp_close()\n\n    * When calling tcp_abort() from a raw API TCP callback function,\n      make sure you return ERR_ABRT to prevent accessing unallocated memory.\n      (ERR_ABRT now means the applicaiton has called tcp_abort!)\n\n  +++ Netconn API:\n    * Changed netconn_receive() and netconn_accept() to return\n      err_t, not a pointer to new data/netconn.\n\n  +++ Socket API:\n    * LWIP_SO_RCVTIMEO: when accept() or recv() time out, they\n      now set errno to EWOULDBLOCK/EAGAIN, not ETIMEDOUT.\n\n    * Added a minimal version of posix fctl() to have a\n      standardised way to set O_NONBLOCK for nonblocking sockets.\n\n  +++ all APIs:\n    * correctly implemented SO(F)_REUSEADDR\n\n  ++ Port changes\n\n  +++ new files:\n\n    * Added 4 new files: def.c, timers.c, timers.h, tcp_impl.h:\n\n    * Moved stack-internal parts of tcp.h to tcp_impl.h, tcp.h now only contains\n      the actual application programmer's API\n  \n    * Separated timer implementation from sys.h/.c, moved to timers.h/.c;\n      Added timer implementation for NO_SYS==1, set NO_SYS_NO_TIMERS==1 if you\n      still want to use your own timer implementation for NO_SYS==0 (as before).\n\n  +++ sys layer:\n\n    * Converted mbox- and semaphore-functions to take pointers to sys_mbox_t/\n      sys_sem_t;\n\n    * Converted sys_mbox_new/sys_sem_new to take pointers and return err_t;\n\n    * Added Mutex concept in sys_arch (define LWIP_COMPAT_MUTEX to let sys.h use\n      binary semaphores instead of mutexes - as before)\n\n  +++ new options:\n\n     * Don't waste memory when chaining segments, added option TCP_OVERSIZE to\n       prevent creating many small pbufs when calling tcp_write with many small\n       blocks of data. Instead, pbufs are allocated larger than needed and the\n       space is used for later calls to tcp_write.\n\n     * Added LWIP_NETIF_TX_SINGLE_PBUF to always copy to try to create single pbufs\n       in tcp_write/udp_send.\n\n    * Added an additional option LWIP_ETHERNET to support ethernet without ARP\n      (necessary for pure PPPoE)\n\n    * Add MEMP_SEPARATE_POOLS to place memory pools in separate arrays. This may\n      be used to place these pools into user-defined memory by using external\n      declaration.\n\n    * Added TCP_SNDQUEUELOWAT corresponding to TCP_SNDLOWAT\n\n  +++ new pools:\n\n     * Netdb uses a memp pool for allocating memory when getaddrinfo() is called,\n       so MEMP_NUM_NETDB has to be set accordingly.\n\n     * DNS_LOCAL_HOSTLIST_IS_DYNAMIC uses a memp pool instead of the heap, so\n       MEMP_NUM_LOCALHOSTLIST has to be set accordingly.\n\n     * Snmp-agent uses a memp pools instead of the heap, so MEMP_NUM_SNMP_* have\n       to be set accordingly.\n\n     * PPPoE uses a MEMP pool instead of the heap, so MEMP_NUM_PPPOE_INTERFACES\n       has to be set accordingly\n\n  * Integrated loopif into netif.c - loopif does not have to be created by the\n    port any more, just define LWIP_HAVE_LOOPIF to 1.\n\n  * Added define LWIP_RAND() for lwip-wide randomization (needs to be defined\n    in cc.h, e.g. used by igmp)\n\n  * Added printf-formatter X8_F to printf u8_t as hex\n\n  * The heap now may be moved to user-defined memory by defining\n    LWIP_RAM_HEAP_POINTER as a void pointer to that memory's address\n\n  * added autoip_set_struct() and dhcp_set_struct() to let autoip and dhcp work\n    with user-allocated structs instead of calling mem_malloc\n\n  * Added const char* name to mem- and memp-stats for easier debugging.\n\n  * Calculate the TCP/UDP checksum while copying to only fetch data once:\n    Define LWIP_CHKSUM_COPY to a memcpy-like function that returns the checksum\n\n  * Added SO_REUSE_RXTOALL to pass received UDP broadcast/multicast packets to\n    more than one pcb.\n\n  * Changed the semantics of ARP_QUEUEING==0: ARP_QUEUEING now cannot be turned\n    off any more, if this is set to 0, only one packet (the most recent one) is\n    queued (like demanded by RFC 1122).\n\n  \n  ++ Major bugfixes/improvements\n\n  * Implemented tcp_shutdown() to only shut down one end of a connection\n  * Implemented shutdown() at socket- and netconn-level\n  * Added errorset support to select() + improved select speed overhead\n  * Merged pppd to v2.3.11 (including some backported bugfixes from 2.4.x)\n  * Added timer implementation for NO_SYS==1 (may be disabled with NO_SYS_NO_TIMERS==1\n  * Use macros defined in ip_addr.h to work with IP addresses\n  * Implemented many nonblocking socket/netconn functions\n  * Fixed ARP input processing: only add a new entry if a request was directed as us\n  * mem_realloc() to mem_trim() to prevent confusion with realloc()\n  * Some improvements for AutoIP (don't route/forward link-local addresses, don't break\n    existing connections when assigning a routable address)\n  * Correctly handle remote side overrunning our rcv_wnd in ooseq case\n  * Removed packing from ip_addr_t, the packed version is now only used in protocol headers\n  * Corrected PBUF_POOL_BUFSIZE for ports where ETH_PAD_SIZE > 0\n  * Added support for static ARP table entries\n\n(STABLE-1.3.2)\n\n  * initial version of this file\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/FILES",
    "content": "doxygen/       - Configuration files and scripts to create the lwIP doxygen source\n                 documentation (found at http://www.nongnu.org/lwip/)\n\nsavannah.txt   - How to obtain the current development source code.\ncontrib.txt    - How to contribute to lwIP as a developer.\nrawapi.txt     - The documentation for the core API of lwIP.\n                 Also provides an overview about the other APIs and multithreading.\nsys_arch.txt   - The documentation for a system abstraction layer of lwIP.\nppp.txt        - Documentation of the PPP interface for lwIP.\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/NO_SYS_SampleCode.c",
    "content": "void\neth_mac_irq()\n{\n  /* Service MAC IRQ here */\n\n  /* Allocate pbuf from pool (avoid using heap in interrupts) */\n  struct pbuf* p = pbuf_alloc(PBUF_RAW, eth_data_count, PBUF_POOL);\n\n  if(p != NULL) {\n    /* Copy ethernet frame into pbuf */\n    pbuf_take(p, eth_data, eth_data_count);\n\n    /* Put in a queue which is processed in main loop */\n    if(!queue_try_put(&queue, p)) {\n      /* queue is full -> packet loss */\n      pbuf_free(p);\n    }\n  }\n}\n\nstatic err_t \nnetif_output(struct netif *netif, struct pbuf *p)\n{\n  LINK_STATS_INC(link.xmit);\n\n  /* Update SNMP stats (only if you use SNMP) */\n  MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p->tot_len);\n  int unicast = ((p->payload[0] & 0x01) == 0);\n  if (unicast) {\n    MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);\n  } else {\n    MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts);\n  }\n\n  lock_interrupts();\n  pbuf_copy_partial(p, mac_send_buffer, p->tot_len, 0);\n  /* Start MAC transmit here */\n  unlock_interrupts();\n\n  return ERR_OK;\n}\n\nstatic void \nnetif_status_callback(struct netif *netif)\n{\n  printf(\"netif status changed %s\\n\", ip4addr_ntoa(netif_ip4_addr(netif)));\n}\n\nstatic err_t \nnetif_init(struct netif *netif)\n{\n  netif->linkoutput = netif_output;\n  netif->output     = etharp_output;\n  netif->output_ip6 = ethip6_output;\n  netif->mtu        = ETHERNET_MTU;\n  netif->flags      = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET | NETIF_FLAG_IGMP | NETIF_FLAG_MLD6;\n  MIB2_INIT_NETIF(netif, snmp_ifType_ethernet_csmacd, 100000000);\n\n  SMEMCPY(netif->hwaddr, your_mac_address_goes_here, sizeof(netif->hwaddr));\n  netif->hwaddr_len = sizeof(netif->hwaddr);\n\n  return ERR_OK;\n}\n\nvoid \nmain(void)\n{\n  struct netif netif;\n\n  lwip_init();\n\n  netif_add(&netif, IP4_ADDR_ANY, IP4_ADDR_ANY, IP4_ADDR_ANY, NULL, netif_init, netif_input);\n  netif.name[0] = 'e';\n  netif.name[1] = '0';\n  netif_create_ip6_linklocal_address(&netif, 1);\n  netif.ip6_autoconfig_enabled = 1;\n  netif_set_status_callback(&netif, netif_status_callback);\n  netif_set_default(&netif);\n  netif_set_up(&netif);\n  \n  /* Start DHCP and HTTPD */\n  dhcp_start(&netif );\n  httpd_init();\n\n  while(1) {\n    /* Check link state, e.g. via MDIO communication with PHY */\n    if(link_state_changed()) {\n      if(link_is_up()) {\n        netif_set_link_up(&netif);\n      } else {\n        netif_set_link_down(&netif);\n      }\n    }\n\n    /* Check for received frames, feed them to lwIP */\n    lock_interrupts();\n    struct pbuf* p = queue_try_get(&queue);\n    unlock_interrupts();\n\n    if(p != NULL) {\n      LINK_STATS_INC(link.recv);\n \n      /* Update SNMP stats (only if you use SNMP) */\n      MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len);\n      int unicast = ((p->payload[0] & 0x01) == 0);\n      if (unicast) {\n        MIB2_STATS_NETIF_INC(netif, ifinucastpkts);\n      } else {\n        MIB2_STATS_NETIF_INC(netif, ifinnucastpkts);\n      }\n\n      if(netif.input(p, &netif) != ERR_OK) {\n        pbuf_free(p);\n      }\n    }\n     \n    /* Cyclic lwIP timers check */\n    sys_check_timeouts();\n     \n    /* your application goes here */\n  }\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/contrib.txt",
    "content": "1 Introduction\n\nThis document describes some guidelines for people participating\nin lwIP development.\n\n2 How to contribute to lwIP\n\nHere is a short list of suggestions to anybody working with lwIP and \ntrying to contribute bug reports, fixes, enhancements, platform ports etc.\nFirst of all as you may already know lwIP is a volunteer project so feedback\nto fixes or questions might often come late. Hopefully the bug and patch tracking \nfeatures of Savannah help us not lose users' input.\n\n2.1 Source code style:\n\n1. do not use tabs.\n2. indentation is two spaces per level (i.e. per tab).\n3. end debug messages with a trailing newline (\\n).\n4. one space between keyword and opening bracket.\n5. no space between function and opening bracket.\n6. one space and no newline before opening curly braces of a block.\n7. closing curly brace on a single line.\n8. spaces surrounding assignment and comparisons.\n9. don't initialize static and/or global variables to zero, the compiler takes care of that.\n10. use current source code style as further reference.\n\n2.2 Source code documentation style:\n\n1. JavaDoc compliant and Doxygen compatible.\n2. Function documentation above functions in .c files, not .h files.\n   (This forces you to synchronize documentation and implementation.)\n3. Use current documentation style as further reference.\n \n2.3 Bug reports and patches:\n\n1. Make sure you are reporting bugs or send patches against the latest\n   sources. (From the latest release and/or the current Git sources.)\n2. If you think you found a bug make sure it's not already filed in the\n   bugtracker at Savannah.\n3. If you have a fix put the patch on Savannah. If it is a patch that affects\n   both core and arch specific stuff please separate them so that the core can\n   be applied separately while leaving the other patch 'open'. The preferred way\n   is to NOT touch archs you can't test and let maintainers take care of them.\n   This is a good way to see if they are used at all - the same goes for unix\n   netifs except tapif.\n4. Do not file a bug and post a fix to it to the patch area. Either a bug report\n   or a patch will be enough.\n   If you correct an existing bug then attach the patch to the bug rather than creating a new entry in the patch area.\n5. Patches should be specific to a single change or to related changes. Do not mix bugfixes with spelling and other\n   trivial fixes unless the bugfix is trivial too. Do not reorganize code and rename identifiers in the same patch you\n   change behaviour if not necessary. A patch is easier to read and understand if it's to the point and short than\n   if it's not to the point and long :) so the chances for it to be applied are greater. \n\n2.4 Platform porters:\n\n1. If you have ported lwIP to a platform (an OS, a uC/processor or a combination of these) and\n   you think it could benefit others[1] you might want discuss this on the mailing list. You\n   can also ask for Git access to submit and maintain your port in the contrib Git module.\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/doxygen/generate.bat",
    "content": "doxygen lwip.Doxyfile\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/doxygen/generate.sh",
    "content": "#!/bin/sh\n\ndoxygen lwip.Doxyfile\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/doxygen/lwip.Doxyfile",
    "content": "# Doxyfile 1.8.11\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a double hash (##) is considered a comment and is placed in\n# front of the TAG it is preceding.\n#\n# All text after a single hash (#) is considered a comment and will be ignored.\n# The format is:\n# TAG = value [value, ...]\n# For lists, items can also be appended using:\n# TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\\\" \\\").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all text\n# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv\n# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv\n# for the list of possible encodings.\n# The default value is: UTF-8.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by\n# double-quotes, unless you are using Doxywizard) that should identify the\n# project for which the documentation is generated. This name is used in the\n# title of most generated pages and in a few other places.\n# The default value is: My Project.\n\nPROJECT_NAME           = \"lwIP\"\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number. This\n# could be handy for archiving the generated documentation or if some version\n# control system is used.\n\nPROJECT_NUMBER         = \"2.0.3\"\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer a\n# quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          = \"Lightweight IP stack\"\n\n# With the PROJECT_LOGO tag one can specify a logo or an icon that is included\n# in the documentation. The maximum height of the logo should not exceed 55\n# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy\n# the logo to the output directory.\n\nPROJECT_LOGO           =\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path\n# into which the generated documentation will be written. If a relative path is\n# entered, it will be relative to the location where doxygen was started. If\n# left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = output\n\n# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-\n# directories (in 2 levels) under the output directory of each output format and\n# will distribute the generated files over these directories. Enabling this\n# option can be useful when feeding doxygen a huge amount of source files, where\n# putting all generated files in the same directory would otherwise causes\n# performance problems for the file system.\n# The default value is: NO.\n\nCREATE_SUBDIRS         = NO\n\n# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII\n# characters to appear in the names of generated files. If set to NO, non-ASCII\n# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode\n# U+3044.\n# The default value is: NO.\n\nALLOW_UNICODE_NAMES    = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,\n# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),\n# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,\n# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),\n# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,\n# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,\n# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,\n# Ukrainian and Vietnamese.\n# The default value is: English.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member\n# descriptions after the members that are listed in the file and class\n# documentation (similar to Javadoc). Set to NO to disable this.\n# The default value is: YES.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief\n# description of a member or function before the detailed description\n#\n# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n# The default value is: YES.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator that is\n# used to form the text in various listings. Each string in this list, if found\n# as the leading text of the brief description, will be stripped from the text\n# and the result, after processing the whole list, is used as the annotated\n# text. Otherwise, the brief description is used as-is. If left blank, the\n# following values are used ($name is automatically replaced with the name of\n# the entity):The $name class, The $name widget, The $name file, is, provides,\n# specifies, contains, represents, a, an and the.\n\nABBREVIATE_BRIEF       = \"The $name class       \" \\\n                         \"The $name widget       \" \\\n                         \"The $name file       \" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# doxygen will generate a detailed section even if there is only a brief\n# description.\n# The default value is: NO.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n# The default value is: NO.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path\n# before files name in the file list and in the header files. If set to NO the\n# shortest path that makes the file name unique will be used\n# The default value is: YES.\n\nFULL_PATH_NAMES        = YES\n\n# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.\n# Stripping is only done if one of the specified strings matches the left-hand\n# part of the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the path to\n# strip.\n#\n# Note that you can specify absolute paths here, but also relative paths, which\n# will be relative from the directory where doxygen is started.\n# This tag requires that the tag FULL_PATH_NAMES is set to YES.\n\nSTRIP_FROM_PATH        = ../../\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the\n# path mentioned in the documentation of a class, which tells the reader which\n# header file to include in order to use a class. If left blank only the name of\n# the header file containing the class definition is used. Otherwise one should\n# specify the list of include paths that are normally passed to the compiler\n# using the -I flag.\n\nSTRIP_FROM_INC_PATH    =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but\n# less readable) file names. This can be useful is your file systems doesn't\n# support long names like on DOS, Mac, or CD-ROM.\n# The default value is: NO.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the\n# first line (until the first dot) of a Javadoc-style comment as the brief\n# description. If set to NO, the Javadoc-style will behave just like regular Qt-\n# style comments (thus requiring an explicit @brief command for a brief\n# description.)\n# The default value is: NO.\n\nJAVADOC_AUTOBRIEF      = NO\n\n# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first\n# line (until the first dot) of a Qt-style comment as the brief description. If\n# set to NO, the Qt-style will behave just like regular Qt-style comments (thus\n# requiring an explicit \\brief command for a brief description.)\n# The default value is: NO.\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a\n# multi-line C++ special comment block (i.e. a block of //! or /// comments) as\n# a brief description. This used to be the default behavior. The new default is\n# to treat a multi-line C++ comment block as a detailed description. Set this\n# tag to YES if you prefer the old behavior instead.\n#\n# Note that setting this tag to YES also means that rational rose comments are\n# not recognized any more.\n# The default value is: NO.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the\n# documentation from any documented member that it re-implements.\n# The default value is: YES.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new\n# page for each member. If set to NO, the documentation of a member will be part\n# of the file/class/namespace that contains it.\n# The default value is: NO.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen\n# uses this value to replace tabs by spaces in code fragments.\n# Minimum value: 1, maximum value: 16, default value: 4.\n\nTAB_SIZE               = 8\n\n# This tag can be used to specify a number of aliases that act as commands in\n# the documentation. An alias has the form:\n# name=value\n# For example adding\n# \"sideeffect=@par Side Effects:\\n\"\n# will allow you to put the command \\sideeffect (or @sideeffect) in the\n# documentation, which will result in a user-defined paragraph with heading\n# \"Side Effects:\". You can put \\n's in the value part of an alias to insert\n# newlines.\n\nALIASES                =\n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding \"class=itcl::class\"\n# will allow you to use the command class in the itcl::class meaning.\n\nTCL_SUBST              =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources\n# only. Doxygen will then generate output that is more tailored for C. For\n# instance, some of the names that are used will be different. The list of all\n# members will be omitted, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_FOR_C  = YES\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or\n# Python sources only. Doxygen will then generate output that is more tailored\n# for that language. For instance, namespaces will be presented as packages,\n# qualified scopes will look different, etc.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources. Doxygen will then generate output that is tailored for Fortran.\n# The default value is: NO.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for VHDL.\n# The default value is: NO.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given\n# extension. Doxygen has a built-in mapping, but you can override or extend it\n# using this tag. The format is ext=language, where ext is a file extension, and\n# language is one of the parsers supported by doxygen: IDL, Java, Javascript,\n# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:\n# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:\n# Fortran. In the later case the parser tries to guess whether the code is fixed\n# or free formatted code, this is the default for Fortran type files), VHDL. For\n# instance to make doxygen treat .inc files as Fortran files (default is PHP),\n# and .f files as C (default is Fortran), use: inc=Fortran f=C.\n#\n# Note: For files without extension you can use no_extension as a placeholder.\n#\n# Note that for custom extensions you also need to set FILE_PATTERNS otherwise\n# the files are not read by doxygen.\n\nEXTENSION_MAPPING      =\n\n# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments\n# according to the Markdown format, which allows for more readable\n# documentation. See http://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you can\n# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in\n# case of backward compatibilities issues.\n# The default value is: YES.\n\nMARKDOWN_SUPPORT       = YES\n\n# When enabled doxygen tries to link words that correspond to documented\n# classes, or namespaces to their corresponding documentation. Such a link can\n# be prevented in individual cases by putting a % sign in front of the word or\n# globally by setting AUTOLINK_SUPPORT to NO.\n# The default value is: YES.\n\nAUTOLINK_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should set this\n# tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string);\n# versus func(std::string) {}). This also make the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n# The default value is: NO.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n# The default value is: NO.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:\n# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen\n# will parse them like normal C++ but will assume all classes use public instead\n# of private inheritance when no explicit protection keyword is present.\n# The default value is: NO.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate\n# getter and setter methods for a property. Setting this option to YES will make\n# doxygen to replace the get and set methods by a property in the documentation.\n# This will only work if the methods are indeed getting or setting a simple\n# type. If this is not the case, or you want to show the methods anyway, you\n# should set this option to NO.\n# The default value is: YES.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n# The default value is: NO.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# If one adds a struct or class to a group and this option is enabled, then also\n# any nested class or struct is added to the same group. By default this option\n# is disabled and one has to add nested compounds explicitly via \\ingroup.\n# The default value is: NO.\n\nGROUP_NESTED_COMPOUNDS = NO\n\n# Set the SUBGROUPING tag to YES to allow class member groups of the same type\n# (for instance a group of public functions) to be put as a subgroup of that\n# type (e.g. under the Public Functions section). Set it to NO to prevent\n# subgrouping. Alternatively, this can be done per class using the\n# \\nosubgrouping command.\n# The default value is: YES.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions\n# are shown inside the group in which they are included (e.g. using \\ingroup)\n# instead of on a separate page (for HTML and Man pages) or section (for LaTeX\n# and RTF).\n#\n# Note that this feature does not work in combination with\n# SEPARATE_MEMBER_PAGES.\n# The default value is: NO.\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions\n# with only public data fields or simple typedef fields will be shown inline in\n# the documentation of the scope in which they are defined (i.e. file,\n# namespace, or group documentation), provided this scope is documented. If set\n# to NO, structs, classes, and unions are shown on a separate page (for HTML and\n# Man pages) or section (for LaTeX and RTF).\n# The default value is: NO.\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or\n# enum is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically be\n# useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n# The default value is: NO.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This\n# cache is used to resolve symbols given their name and scope. Since this can be\n# an expensive process and often the same symbol appears multiple times in the\n# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small\n# doxygen will become slower. If the cache is too large, memory is wasted. The\n# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range\n# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536\n# symbols. At the end of a run doxygen will report the cache usage and suggest\n# the optimal cache size from a speed point of view.\n# Minimum value: 0, maximum value: 9, default value: 0.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in\n# documentation are documented, even if no documentation was available. Private\n# class members and static file members will be hidden unless the\n# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.\n# Note: This will also disable the warnings about undocumented members that are\n# normally produced when WARNINGS is set to YES.\n# The default value is: NO.\n\nEXTRACT_ALL            = NO\n\n# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will\n# be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal\n# scope will be included in the documentation.\n# The default value is: NO.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be\n# included in the documentation.\n# The default value is: NO.\n\nEXTRACT_STATIC         = NO\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined\n# locally in source files will be included in the documentation. If set to NO,\n# only classes defined in header files are included. Does not have any effect\n# for Java sources.\n# The default value is: YES.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. If set to YES, local methods,\n# which are defined in the implementation section but not in the interface are\n# included in the documentation. If set to NO, only methods in the interface are\n# included.\n# The default value is: NO.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base name of\n# the file that contains the anonymous namespace. By default anonymous namespace\n# are hidden.\n# The default value is: NO.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all\n# undocumented members inside documented classes or files. If set to NO these\n# members will be included in the various overviews, but no documentation\n# section is generated. This option has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_MEMBERS     = YES\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy. If set\n# to NO, these classes will be included in the various overviews. This option\n# has no effect if EXTRACT_ALL is enabled.\n# The default value is: NO.\n\nHIDE_UNDOC_CLASSES     = YES\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend\n# (class|struct|union) declarations. If set to NO, these declarations will be\n# included in the documentation.\n# The default value is: NO.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any\n# documentation blocks found inside the body of a function. If set to NO, these\n# blocks will be appended to the function's detailed documentation block.\n# The default value is: NO.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation that is typed after a\n# \\internal command is included. If the tag is set to NO then the documentation\n# will be excluded. Set it to YES to include the internal documentation.\n# The default value is: NO.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file\n# names in lower-case letters. If set to YES, upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n# The default value is: system dependent.\n\nCASE_SENSE_NAMES       = NO\n\n# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with\n# their full class and namespace scopes in the documentation. If set to YES, the\n# scope will be hidden.\n# The default value is: NO.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will\n# append additional text to a page's title, such as Class Reference. If set to\n# YES the compound reference will be hidden.\n# The default value is: NO.\n\nHIDE_COMPOUND_REFERENCE= NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of\n# the files that are included by a file in the documentation of that file.\n# The default value is: YES.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each\n# grouped member an include statement to the documentation, telling the reader\n# which file to include in order to use the member.\n# The default value is: NO.\n\nSHOW_GROUPED_MEMB_INC  = NO\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include\n# files with double quotes in the documentation rather than with sharp brackets.\n# The default value is: NO.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the\n# documentation for inline members.\n# The default value is: YES.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the\n# (detailed) documentation of file and class members alphabetically by member\n# name. If set to NO, the members will appear in declaration order.\n# The default value is: YES.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief\n# descriptions of file, namespace and class members alphabetically by member\n# name. If set to NO, the members will appear in declaration order. Note that\n# this will also influence the order of the classes in the class list.\n# The default value is: NO.\n\nSORT_BRIEF_DOCS        = NO\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the\n# (brief and detailed) documentation of class members so that constructors and\n# destructors are listed first. If set to NO the constructors will appear in the\n# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.\n# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief\n# member documentation.\n# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting\n# detailed member documentation.\n# The default value is: NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy\n# of group names into alphabetical order. If set to NO the group names will\n# appear in their defined order.\n# The default value is: NO.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by\n# fully-qualified names, including namespaces. If set to NO, the class list will\n# be sorted only by class name, not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the alphabetical\n# list.\n# The default value is: NO.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper\n# type resolution of all parameters of a function it will reject a match between\n# the prototype and the implementation of a member function even if there is\n# only one candidate or it is obvious which candidate to choose by doing a\n# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still\n# accept a match between prototype and implementation in such cases.\n# The default value is: NO.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo\n# list. This list is created by putting \\todo commands in the documentation.\n# The default value is: YES.\n\nGENERATE_TODOLIST      = NO\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test\n# list. This list is created by putting \\test commands in the documentation.\n# The default value is: YES.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug\n# list. This list is created by putting \\bug commands in the documentation.\n# The default value is: YES.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)\n# the deprecated list. This list is created by putting \\deprecated commands in\n# the documentation.\n# The default value is: YES.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional documentation\n# sections, marked by \\if <section_label> ... \\endif and \\cond <section_label>\n# ... \\endcond blocks.\n\nENABLED_SECTIONS       =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the\n# initial value of a variable or macro / define can have for it to appear in the\n# documentation. If the initializer consists of more lines than specified here\n# it will be hidden. Use a value of 0 to hide initializers completely. The\n# appearance of the value of individual variables and macros / defines can be\n# controlled using \\showinitializer or \\hideinitializer command in the\n# documentation regardless of this setting.\n# Minimum value: 0, maximum value: 10000, default value: 30.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at\n# the bottom of the documentation of classes and structs. If set to YES, the\n# list will mention the files that were used to generate the documentation.\n# The default value is: YES.\n\nSHOW_USED_FILES        = YES\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This\n# will remove the Files entry from the Quick Index and from the Folder Tree View\n# (if specified).\n# The default value is: YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces\n# page. This will remove the Namespaces entry from the Quick Index and from the\n# Folder Tree View (if specified).\n# The default value is: YES.\n\nSHOW_NAMESPACES        = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command command input-file, where command is the value of the\n# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided\n# by doxygen. Whatever the program writes to standard output is used as the file\n# version. For an example see the documentation.\n\nFILE_VERSION_FILTER    =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option. You can\n# optionally specify a file name after the option, if omitted DoxygenLayout.xml\n# will be used as the name of the layout file.\n#\n# Note that if you run doxygen from a directory containing a file called\n# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE\n# tag is left empty.\n\nLAYOUT_FILE            =\n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files containing\n# the reference definitions. This must be a list of .bib files. The .bib\n# extension is automatically appended if omitted. This requires the bibtex tool\n# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.\n# For LaTeX the style of the bibliography can be controlled using\n# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the\n# search path. See also \\cite for info how to create references.\n\nCITE_BIB_FILES         =\n\n#---------------------------------------------------------------------------\n# Configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated to\n# standard output by doxygen. If QUIET is set to YES this implies that the\n# messages are off.\n# The default value is: NO.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES\n# this implies that the warnings are on.\n#\n# Tip: Turn warnings on while writing the documentation.\n# The default value is: YES.\n\nWARNINGS               = YES\n\n# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate\n# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag\n# will automatically be disabled.\n# The default value is: YES.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some parameters\n# in a documented function, or documenting parameters that don't exist or using\n# markup commands wrongly.\n# The default value is: YES.\n\nWARN_IF_DOC_ERROR      = YES\n\n# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that\n# are documented, but have no documentation for their parameters or return\n# value. If set to NO, doxygen will only warn about wrong or incomplete\n# parameter documentation, but not about the absence of documentation.\n# The default value is: NO.\n\nWARN_NO_PARAMDOC       = NO\n\n# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when\n# a warning is encountered.\n# The default value is: NO.\n\nWARN_AS_ERROR          = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that doxygen\n# can produce. The string should contain the $file, $line, and $text tags, which\n# will be replaced by the file and line number from which the warning originated\n# and the warning text. Optionally the format may contain $version, which will\n# be replaced by the version of the file (if it could be obtained via\n# FILE_VERSION_FILTER)\n# The default value is: $file:$line: $text.\n\nWARN_FORMAT            = \"$file:$line: $text       \"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning and error\n# messages should be written. If left blank the output is written to standard\n# error (stderr).\n\nWARN_LOGFILE           =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag is used to specify the files and/or directories that contain\n# documented source files. You may enter file names like myfile.cpp or\n# directories like /usr/src/myproject. Separate the files or directories with\n# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING\n# Note: If this tag is empty the current directory is searched.\n\nINPUT                  = main_page.h ../../src\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses\n# libiconv (or the iconv built into libc) for the transcoding. See the libiconv\n# documentation (see: http://www.gnu.org/software/libiconv) for the list of\n# possible encodings.\n# The default value is: UTF-8.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and\n# *.h) to filter out the source-files in the directories.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# read by doxygen.\n#\n# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,\n# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,\n# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,\n# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,\n# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.\n\nFILE_PATTERNS          = *.c \\\n                         *.cc \\\n                         *.cxx \\\n                         *.cpp \\\n                         *.c++ \\\n                         *.java \\\n                         *.ii \\\n                         *.ixx \\\n                         *.ipp \\\n                         *.i++ \\\n                         *.inl \\\n                         *.h \\\n                         *.hh \\\n                         *.hxx \\\n                         *.hpp \\\n                         *.h++ \\\n                         *.idl \\\n                         *.odl \\\n                         *.inc \\\n                         *.m \\\n                         *.mm \\\n                         *.dox\n\n# The RECURSIVE tag can be used to specify whether or not subdirectories should\n# be searched for input files as well.\n# The default value is: NO.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n#\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                = ../../src/include/netif/ppp/polarssl\n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n# The default value is: NO.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories.\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       =\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n#\n# Note that the wildcards are matched against the file with absolute path, so to\n# exclude all test directories use the pattern */test/*\n\nEXCLUDE_SYMBOLS        =\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or directories\n# that contain example code fragments that are included (see the \\include\n# command).\n\nEXAMPLE_PATH           = ../ ../../\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and\n# *.h) to filter out the source-files in the directories. If left blank all\n# files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude commands\n# irrespective of the value of the RECURSIVE tag.\n# The default value is: NO.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or directories\n# that contain images that are to be included in the documentation (see the\n# \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command:\n#\n# <filter> <input-file>\n#\n# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the\n# name of an input file. Doxygen will then use the output that the filter\n# program writes to standard output. If FILTER_PATTERNS is specified, this tag\n# will be ignored.\n#\n# Note that the filter must not add or remove lines; it is applied before the\n# code is scanned, but not when the output code is generated. If lines are added\n# or removed, the anchors will not be placed correctly.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# properly processed by doxygen.\n\nINPUT_FILTER           =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis. Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match. The filters are a list of the form: pattern=filter\n# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how\n# filters are used. If the FILTER_PATTERNS tag is empty or if none of the\n# patterns match the file name, INPUT_FILTER is applied.\n#\n# Note that for custom extensions or not directly supported extensions you also\n# need to set EXTENSION_MAPPING for the extension otherwise the files are not\n# properly processed by doxygen.\n\nFILTER_PATTERNS        =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will also be used to filter the input files that are used for\n# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).\n# The default value is: NO.\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and\n# it is also possible to disable source filtering for a specific pattern using\n# *.ext= (so without naming a filter).\n# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.\n\nFILTER_SOURCE_PATTERNS =\n\n# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that\n# is part of the input, its contents will be placed on the main page\n# (index.html). This can be useful if you have a project on for instance GitHub\n# and want to reuse the introduction page also for the doxygen output.\n\nUSE_MDFILE_AS_MAINPAGE = main_page.h\n\n#---------------------------------------------------------------------------\n# Configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will be\n# generated. Documented entities will be cross-referenced with these sources.\n#\n# Note: To get rid of all source code in the generated output, make sure that\n# also VERBATIM_HEADERS is set to NO.\n# The default value is: NO.\n\nSOURCE_BROWSER         = NO\n\n# Setting the INLINE_SOURCES tag to YES will include the body of functions,\n# classes and enums directly into the documentation.\n# The default value is: NO.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any\n# special comment blocks from generated source code fragments. Normal C, C++ and\n# Fortran comments will always remain visible.\n# The default value is: YES.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES then for each documented\n# function all documented functions referencing it will be listed.\n# The default value is: NO.\n\nREFERENCED_BY_RELATION = NO\n\n# If the REFERENCES_RELATION tag is set to YES then for each documented function\n# all documented entities called/used by that function will be listed.\n# The default value is: NO.\n\nREFERENCES_RELATION    = NO\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set\n# to YES then the hyperlinks from functions in REFERENCES_RELATION and\n# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will\n# link to the documentation.\n# The default value is: YES.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the\n# source code will show a tooltip with additional information such as prototype,\n# brief description and links to the definition and documentation. Since this\n# will make the HTML file larger and loading of large files a bit slower, you\n# can opt to disable this feature.\n# The default value is: YES.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nSOURCE_TOOLTIPS        = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code will\n# point to the HTML generated by the htags(1) tool instead of doxygen built-in\n# source browser. The htags tool is part of GNU's global source tagging system\n# (see http://www.gnu.org/software/global/global.html). You will need version\n# 4.8.6 or higher.\n#\n# To use it do the following:\n# - Install the latest version of global\n# - Enable SOURCE_BROWSER and USE_HTAGS in the config file\n# - Make sure the INPUT points to the root of the source tree\n# - Run doxygen as normal\n#\n# Doxygen will invoke htags (and that will in turn invoke gtags), so these\n# tools must be available from the command line (i.e. in the search path).\n#\n# The result: instead of the source browser generated by doxygen, the links to\n# source code will now point to the output of htags.\n# The default value is: NO.\n# This tag requires that the tag SOURCE_BROWSER is set to YES.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a\n# verbatim copy of the header file for each class for which an include is\n# specified. Set to NO to disable this.\n# See also: Section \\class.\n# The default value is: YES.\n\nVERBATIM_HEADERS       = NO\n\n# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the\n# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the\n# cost of reduced performance. This can be particularly helpful with template\n# rich C++ code for which doxygen's built-in parser lacks the necessary type\n# information.\n# Note: The availability of this option depends on whether or not doxygen was\n# generated with the -Duse-libclang=ON option for CMake.\n# The default value is: NO.\n\nCLANG_ASSISTED_PARSING = NO\n\n# If clang assisted parsing is enabled you can provide the compiler with command\n# line options that you would normally use when invoking the compiler. Note that\n# the include paths will already be set by doxygen for the files and directories\n# specified with INPUT and INCLUDE_PATH.\n# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.\n\nCLANG_OPTIONS          =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all\n# compounds will be generated. Enable this if the project contains a lot of\n# classes, structs, unions or interfaces.\n# The default value is: YES.\n\nALPHABETICAL_INDEX     = NO\n\n# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in\n# which the alphabetical index list will be split.\n# Minimum value: 1, maximum value: 20, default value: 5.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all classes will\n# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag\n# can be used to specify a prefix (or a list of prefixes) that should be ignored\n# while generating the index headers.\n# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.\n\nIGNORE_PREFIX          =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output\n# The default value is: YES.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_OUTPUT            = html\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each\n# generated HTML page (for example: .htm, .php, .asp).\n# The default value is: .html.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a user-defined HTML header file for\n# each generated HTML page. If the tag is left blank doxygen will generate a\n# standard header.\n#\n# To get valid HTML the header file that includes any scripts and style sheets\n# that doxygen needs, which is dependent on the configuration options used (e.g.\n# the setting GENERATE_TREEVIEW). It is highly recommended to start with a\n# default header using\n# doxygen -w html new_header.html new_footer.html new_stylesheet.css\n# YourConfigFile\n# and then modify the file new_header.html. See also section \"Doxygen usage\"\n# for information on how to generate the default header that doxygen normally\n# uses.\n# Note: The header is subject to change so you typically have to regenerate the\n# default header when upgrading to a newer version of doxygen. For a description\n# of the possible markers and block names see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_HEADER            =\n\n# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each\n# generated HTML page. If the tag is left blank doxygen will generate a standard\n# footer. See HTML_HEADER for more information on how to generate a default\n# footer and what special commands can be used inside the footer. See also\n# section \"Doxygen usage\" for information on how to generate the default footer\n# that doxygen normally uses.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_FOOTER            =\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style\n# sheet that is used by each HTML page. It can be used to fine-tune the look of\n# the HTML output. If left blank doxygen will generate a default style sheet.\n# See also section \"Doxygen usage\" for information on how to generate the style\n# sheet that doxygen normally uses.\n# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as\n# it is more robust and this tag (HTML_STYLESHEET) will in the future become\n# obsolete.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_STYLESHEET        =\n\n# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined\n# cascading style sheets that are included after the standard style sheets\n# created by doxygen. Using this option one can overrule certain style aspects.\n# This is preferred over using HTML_STYLESHEET since it does not replace the\n# standard style sheet and is therefore more robust against future updates.\n# Doxygen will copy the style sheet files to the output directory.\n# Note: The order of the extra style sheet files is of importance (e.g. the last\n# style sheet in the list overrules the setting of the previous ones in the\n# list). For an example see the documentation.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_STYLESHEET  =\n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that the\n# files will be copied as-is; there are no commands or markers available.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_EXTRA_FILES       =\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen\n# will adjust the colors in the style sheet and background images according to\n# this color. Hue is specified as an angle on a colorwheel, see\n# http://en.wikipedia.org/wiki/Hue for more information. For instance the value\n# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300\n# purple, and 360 is red again.\n# Minimum value: 0, maximum value: 359, default value: 220.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors\n# in the HTML output. For a value of 0 the output will use grayscales only. A\n# value of 255 will produce the most vivid colors.\n# Minimum value: 0, maximum value: 255, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the\n# luminance component of the colors in the HTML output. Values below 100\n# gradually make the output lighter, whereas values above 100 make the output\n# darker. The value divided by 100 is the actual gamma applied, so 80 represents\n# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not\n# change the gamma.\n# Minimum value: 40, maximum value: 240, default value: 80.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting this\n# to YES can help to show when doxygen was last run and thus if the\n# documentation is up to date.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_TIMESTAMP         = NO\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries\n# shown in the various tree structured indices initially; the user can expand\n# and collapse entries dynamically later on. Doxygen will expand the tree to\n# such a level that at most the specified number of entries are visible (unless\n# a fully collapsed tree already exceeds this amount). So setting the number of\n# entries 1 will produce a full collapsed tree by default. 0 is a special value\n# representing an infinite number of entries and will result in a full expanded\n# tree by default.\n# Minimum value: 0, maximum value: 9999, default value: 100.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files will be\n# generated that can be used as input for Apple's Xcode 3 integrated development\n# environment (see: http://developer.apple.com/tools/xcode/), introduced with\n# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a\n# Makefile in the HTML output directory. Running make will produce the docset in\n# that directory and running make install will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at\n# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_DOCSET        = NO\n\n# This tag determines the name of the docset feed. A documentation feed provides\n# an umbrella under which multiple documentation sets from a single provider\n# (such as a company or product suite) can be grouped.\n# The default value is: Doxygen generated docs.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# This tag specifies a string that should uniquely identify the documentation\n# set bundle. This should be a reverse domain-name style string, e.g.\n# com.mycompany.MyDocSet. Doxygen will append .docset to the name.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify\n# the documentation publisher. This should be a reverse domain-name style\n# string, e.g. com.mycompany.MyDocSet.documentation.\n# The default value is: org.doxygen.Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.\n# The default value is: Publisher.\n# This tag requires that the tag GENERATE_DOCSET is set to YES.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three\n# additional HTML index files: index.hhp, index.hhc, and index.hhk. The\n# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop\n# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on\n# Windows.\n#\n# The HTML Help Workshop contains a compiler that can convert all HTML output\n# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML\n# files are now used as the Windows 98 help format, and will replace the old\n# Windows help format (.hlp) on all Windows platforms in the future. Compressed\n# HTML files also contain an index, a table of contents, and you can search for\n# words in the documentation. The HTML workshop also contains a viewer for\n# compressed HTML files.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_HTMLHELP      = NO\n\n# The CHM_FILE tag can be used to specify the file name of the resulting .chm\n# file. You can add a path in front of the file if the result should not be\n# written to the html output directory.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_FILE               = lwip.chm\n\n# The HHC_LOCATION tag can be used to specify the location (absolute path\n# including file name) of the HTML help compiler (hhc.exe). If non-empty,\n# doxygen will try to run the HTML help compiler on the generated index.hhp.\n# The file has to be specified with full path.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nHHC_LOCATION           =\n\n# The GENERATE_CHI flag controls if a separate .chi index file is generated\n# (YES) or that it should be included in the master .chm file (NO).\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nGENERATE_CHI           = NO\n\n# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)\n# and project file content.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nCHM_INDEX_ENCODING     =\n\n# The BINARY_TOC flag controls whether a binary table of contents is generated\n# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it\n# enables the Previous and Next buttons.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members to\n# the table of contents of the HTML help documentation and to the tree view.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTMLHELP is set to YES.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that\n# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help\n# (.qch) of the generated HTML documentation.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify\n# the file name of the resulting .qch file. The path specified is relative to\n# the HTML output folder.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQCH_FILE               =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help\n# Project output. For more information please see Qt Help Project / Namespace\n# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt\n# Help Project output. For more information please see Qt Help Project / Virtual\n# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-\n# folders).\n# The default value is: doc.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom\n# filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_NAME   =\n\n# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see Qt Help Project / Custom\n# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-\n# filters).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_CUST_FILTER_ATTRS  =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's filter section matches. Qt Help Project / Filter Attributes (see:\n# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHP_SECT_FILTER_ATTRS  =\n\n# The QHG_LOCATION tag can be used to specify the location of Qt's\n# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the\n# generated .qhp file.\n# This tag requires that the tag GENERATE_QHP is set to YES.\n\nQHG_LOCATION           =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be\n# generated, together with the HTML files, they form an Eclipse help plugin. To\n# install this plugin and make it available under the help contents menu in\n# Eclipse, the contents of the directory containing the HTML and XML files needs\n# to be copied into the plugins directory of eclipse. The name of the directory\n# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.\n# After copying Eclipse needs to be restarted before the help appears.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the Eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have this\n# name. Each documentation set should have its own identifier.\n# The default value is: org.doxygen.Project.\n# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# If you want full control over the layout of the generated HTML pages it might\n# be necessary to disable the index and replace it with your own. The\n# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top\n# of each HTML page. A value of NO enables the index and the value YES disables\n# it. Since the tabs in the index contain the same information as the navigation\n# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information. If the tag\n# value is set to YES, a side panel will be generated containing a tree-like\n# index structure (just like the one that is generated for HTML Help). For this\n# to work a browser that supports JavaScript, DHTML, CSS and frames is required\n# (i.e. any modern browser). Windows users are probably better off using the\n# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can\n# further fine-tune the look of the index. As an example, the default style\n# sheet generated by doxygen has an example that shows how to put an image at\n# the root of the tree instead of the PROJECT_NAME. Since the tree basically has\n# the same information as the tab index, you could consider setting\n# DISABLE_INDEX to YES when enabling this option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nGENERATE_TREEVIEW      = YES\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that\n# doxygen will group on one line in the generated HTML documentation.\n#\n# Note that a value of 0 will completely suppress the enum values from appearing\n# in the overview section.\n# Minimum value: 0, maximum value: 20, default value: 4.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used\n# to set the initial width (in pixels) of the frame in which the tree is shown.\n# Minimum value: 0, maximum value: 1500, default value: 250.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nTREEVIEW_WIDTH         = 250\n\n# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to\n# external symbols imported via tag files in a separate window.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of LaTeX formulas included as images in\n# the HTML documentation. When you change the font size after a successful\n# doxygen run you need to manually remove any form_*.png images from the HTML\n# output directory to force them to be regenerated.\n# Minimum value: 8, maximum value: 50, default value: 10.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are not\n# supported properly for IE 6.0, but are supported on all modern browsers.\n#\n# Note that when changing this option you need to delete any form_*.png files in\n# the HTML output directory before the changes have effect.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see\n# http://www.mathjax.org) which uses client side Javascript for the rendering\n# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX\n# installed or if you want to formulas look prettier in the HTML output. When\n# enabled you may also need to install MathJax separately and configure the path\n# to it using the MATHJAX_RELPATH option.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you can set the default output format to be used for\n# the MathJax output. See the MathJax site (see:\n# http://docs.mathjax.org/en/latest/output.html) for more details.\n# Possible values are: HTML-CSS (which is slower, but has the best\n# compatibility), NativeMML (i.e. MathML) and SVG.\n# The default value is: HTML-CSS.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_FORMAT         = HTML-CSS\n\n# When MathJax is enabled you need to specify the location relative to the HTML\n# output directory using the MATHJAX_RELPATH option. The destination directory\n# should contain the MathJax.js script. For instance, if the mathjax directory\n# is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax\n# Content Delivery Network so you can quickly see the result without installing\n# MathJax. However, it is strongly recommended to install a local copy of\n# MathJax from http://www.mathjax.org before deployment.\n# The default value is: http://cdn.mathjax.org/mathjax/latest.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax\n# extension names that should be enabled during MathJax rendering. For example\n# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_EXTENSIONS     =\n\n# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces\n# of code that will be used on startup of the MathJax code. See the MathJax site\n# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an\n# example see the documentation.\n# This tag requires that the tag USE_MATHJAX is set to YES.\n\nMATHJAX_CODEFILE       =\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box for\n# the HTML output. The underlying search engine uses javascript and DHTML and\n# should work on any modern browser. Note that when using HTML help\n# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)\n# there is already a search function so this one should typically be disabled.\n# For large projects the javascript based search engine can be slow, then\n# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to\n# search using the keyboard; to jump to the search box use <access key> + S\n# (what the <access key> is depends on the OS and browser, but it is typically\n# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down\n# key> to jump into the search results window, the results can be navigated\n# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel\n# the search. The filter options can be selected when the cursor is inside the\n# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>\n# to select a filter and <Enter> or <escape> to activate or cancel the filter\n# option.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_HTML is set to YES.\n\nSEARCHENGINE           = YES\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a web server instead of a web client using Javascript. There\n# are two flavors of web server based searching depending on the EXTERNAL_SEARCH\n# setting. When disabled, doxygen will generate a PHP script for searching and\n# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing\n# and searching needs to be provided by external tools. See the section\n# \"External Indexing and Searching\" for details.\n# The default value is: NO.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSERVER_BASED_SEARCH    = NO\n\n# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP\n# script for searching. Instead the search results are written to an XML file\n# which needs to be processed by an external indexer. Doxygen will invoke an\n# external search engine pointed to by the SEARCHENGINE_URL option to obtain the\n# search results.\n#\n# Doxygen ships with an example indexer (doxyindexer) and search engine\n# (doxysearch.cgi) which are based on the open source search engine library\n# Xapian (see: http://xapian.org/).\n#\n# See the section \"External Indexing and Searching\" for details.\n# The default value is: NO.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTERNAL_SEARCH        = NO\n\n# The SEARCHENGINE_URL should point to a search engine hosted by a web server\n# which will return the search results when EXTERNAL_SEARCH is enabled.\n#\n# Doxygen ships with an example indexer (doxyindexer) and search engine\n# (doxysearch.cgi) which are based on the open source search engine library\n# Xapian (see: http://xapian.org/). See the section \"External Indexing and\n# Searching\" for details.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSEARCHENGINE_URL       =\n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed\n# search data is written to a file for indexing by an external tool. With the\n# SEARCHDATA_FILE tag the name of this file can be specified.\n# The default file is: searchdata.xml.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nSEARCHDATA_FILE        = searchdata.xml\n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the\n# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n# projects and redirect the results back to the right project.\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTERNAL_SEARCH_ID     =\n\n# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n# projects other than the one defined by this configuration file, but that are\n# all added to the same external search index. Each project needs to have a\n# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of\n# to a relative location where the documentation can be found. The format is:\n# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...\n# This tag requires that the tag SEARCHENGINE is set to YES.\n\nEXTRA_SEARCH_MAPPINGS  =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.\n# The default value is: YES.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: latex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked.\n#\n# Note that when enabling USE_PDFLATEX this option is only used for generating\n# bitmaps for formulas in the HTML output, but not in the Makefile that is\n# written to the output directory.\n# The default file is: latex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate\n# index for LaTeX.\n# The default file is: makeindex.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX\n# documents. This may be useful for small projects and may help to save some\n# trees in general.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used by the\n# printer.\n# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x\n# 14 inches) and executive (7.25 x 10.5 inches).\n# The default value is: a4.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nPAPER_TYPE             = a4wide\n\n# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names\n# that should be included in the LaTeX output. The package can be specified just\n# by its name or with the correct syntax as to be used with the LaTeX\n# \\usepackage command. To get the times font for instance you can specify :\n# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}\n# To use the option intlimits with the amsmath package you can specify:\n# EXTRA_PACKAGES=[intlimits]{amsmath}\n# If left blank no extra packages will be included.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nEXTRA_PACKAGES         =\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the\n# generated LaTeX document. The header should contain everything until the first\n# chapter. If it is left blank doxygen will generate a standard header. See\n# section \"Doxygen usage\" for information on how to let doxygen write the\n# default header to a separate file.\n#\n# Note: Only use a user-defined header if you know what you are doing! The\n# following commands have a special meaning inside the header: $title,\n# $datetime, $date, $doxygenversion, $projectname, $projectnumber,\n# $projectbrief, $projectlogo. Doxygen will replace $title with the empty\n# string, for the replacement values of the other commands the user is referred\n# to HTML_HEADER.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_HEADER           =\n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the\n# generated LaTeX document. The footer should contain everything after the last\n# chapter. If it is left blank doxygen will generate a standard footer. See\n# LATEX_HEADER for more information on how to generate a default footer and what\n# special commands can be used inside the footer.\n#\n# Note: Only use a user-defined footer if you know what you are doing!\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_FOOTER           =\n\n# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined\n# LaTeX style sheets that are included after the standard style sheets created\n# by doxygen. Using this option one can overrule certain style aspects. Doxygen\n# will copy the style sheet files to the output directory.\n# Note: The order of the extra style sheet files is of importance (e.g. the last\n# style sheet in the list overrules the setting of the previous ones in the\n# list).\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EXTRA_STYLESHEET =\n\n# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the LATEX_OUTPUT output\n# directory. Note that the files will be copied as-is; there are no commands or\n# markers available.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_EXTRA_FILES      =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is\n# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will\n# contain links (just like the HTML output) instead of page references. This\n# makes the output suitable for online browsing using a PDF viewer.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nPDF_HYPERLINKS         = NO\n\n# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate\n# the PDF file directly from the LaTeX files. Set this option to YES, to get a\n# higher quality PDF documentation.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nUSE_PDFLATEX           = NO\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode\n# command to the generated LaTeX files. This will instruct LaTeX to keep running\n# if errors occur, instead of asking the user for help. This option is also used\n# when generating formulas in HTML.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_BATCHMODE        = NO\n\n# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the\n# index chapters (such as File Index, Compound Index, etc.) in the output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_HIDE_INDICES     = NO\n\n# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source\n# code with syntax highlighting in the LaTeX output.\n#\n# Note that which sources are shown also depends on other settings such as\n# SOURCE_BROWSER.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. See\n# http://en.wikipedia.org/wiki/BibTeX and \\cite for more info.\n# The default value is: plain.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_BIB_STYLE        = plain\n\n# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated\n# page will contain the date and time when the page was generated. Setting this\n# to NO can help when comparing the output of multiple runs.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_LATEX is set to YES.\n\nLATEX_TIMESTAMP        = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The\n# RTF output is optimized for Word 97 and may not look too pretty with other RTF\n# readers/editors.\n# The default value is: NO.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: rtf.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF\n# documents. This may be useful for small projects and may help to save some\n# trees in general.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will\n# contain hyperlink fields. The RTF file will contain links (just like the HTML\n# output) instead of page references. This makes the output suitable for online\n# browsing using Word or some other Word compatible readers that support those\n# fields.\n#\n# Note: WordPad (write) and others do not support links.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_HYPERLINKS         = NO\n\n# Load stylesheet definitions from file. Syntax is similar to doxygen's config\n# file, i.e. a series of assignments. You only have to provide replacements,\n# missing definitions are set to their default value.\n#\n# See also section \"Doxygen usage\" for information on how to generate the\n# default style sheet that doxygen normally uses.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an RTF document. Syntax is\n# similar to doxygen's config file. A template extensions file can be generated\n# using doxygen -e rtf extensionFile.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_EXTENSIONS_FILE    =\n\n# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code\n# with syntax highlighting in the RTF output.\n#\n# Note that which sources are shown also depends on other settings such as\n# SOURCE_BROWSER.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_RTF is set to YES.\n\nRTF_SOURCE_CODE        = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for\n# classes and files.\n# The default value is: NO.\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it. A directory man3 will be created inside the directory specified by\n# MAN_OUTPUT.\n# The default directory is: man.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to the generated\n# man pages. In case the manual section does not start with a number, the number\n# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is\n# optional.\n# The default value is: .3.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_EXTENSION          = .3\n\n# The MAN_SUBDIR tag determines the name of the directory created within\n# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by\n# MAN_EXTENSION with the initial . removed.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_SUBDIR             =\n\n# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it\n# will generate one additional man file for each entity documented in the real\n# man page(s). These additional files only source the real man page, but without\n# them the man command would be unable to find the correct page.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_MAN is set to YES.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that\n# captures the structure of the code including all documentation.\n# The default value is: NO.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a\n# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of\n# it.\n# The default directory is: xml.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_OUTPUT             = xml\n\n# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program\n# listings (including syntax highlighting and cross-referencing information) to\n# the XML output. Note that enabling this will significantly increase the size\n# of the XML output.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_XML is set to YES.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# Configuration options related to the DOCBOOK output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files\n# that can be used to generate PDF.\n# The default value is: NO.\n\nGENERATE_DOCBOOK       = NO\n\n# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in\n# front of it.\n# The default directory is: docbook.\n# This tag requires that the tag GENERATE_DOCBOOK is set to YES.\n\nDOCBOOK_OUTPUT         = docbook\n\n# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the\n# program listings (including syntax highlighting and cross-referencing\n# information) to the DOCBOOK output. Note that enabling this will significantly\n# increase the size of the DOCBOOK output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_DOCBOOK is set to YES.\n\nDOCBOOK_PROGRAMLISTING = NO\n\n#---------------------------------------------------------------------------\n# Configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an\n# AutoGen Definitions (see http://autogen.sf.net) file that captures the\n# structure of the code including all documentation. Note that this feature is\n# still experimental and incomplete at the moment.\n# The default value is: NO.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module\n# file that captures the structure of the code including all documentation.\n#\n# Note that this feature is still experimental and incomplete at the moment.\n# The default value is: NO.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary\n# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI\n# output from the Perl module output.\n# The default value is: NO.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely\n# formatted so it can be parsed by a human reader. This is useful if you want to\n# understand what is going on. On the other hand, if this tag is set to NO, the\n# size of the Perl module output will be much smaller and Perl will parse it\n# just the same.\n# The default value is: YES.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file are\n# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful\n# so different doxyrules.make files included by the same Makefile don't\n# overwrite each other's variables.\n# This tag requires that the tag GENERATE_PERLMOD is set to YES.\n\nPERLMOD_MAKEVAR_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all\n# C-preprocessor directives found in the sources and include files.\n# The default value is: YES.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names\n# in the source code. If set to NO, only conditional compilation will be\n# performed. Macro expansion can be done in a controlled way by setting\n# EXPAND_ONLY_PREDEF to YES.\n# The default value is: NO.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nMACRO_EXPANSION        = YES\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then\n# the macro expansion is limited to the macros specified with the PREDEFINED and\n# EXPAND_AS_DEFINED tags.\n# The default value is: NO.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES, the include files in the\n# INCLUDE_PATH will be searched if a #include is found.\n# The default value is: YES.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by the\n# preprocessor.\n# This tag requires that the tag SEARCH_INCLUDES is set to YES.\n\nINCLUDE_PATH           = ../../src/include\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will be\n# used.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nINCLUDE_FILE_PATTERNS  = *.h\n\n# The PREDEFINED tag can be used to specify one or more macro names that are\n# defined before the preprocessor is started (similar to the -D option of e.g.\n# gcc). The argument of the tag is a list of macros of the form: name or\n# name=definition (no spaces). If the definition and the \"=\" are omitted, \"=1\"\n# is assumed. To prevent a macro definition from being undefined via #undef or\n# recursively expanded use the := operator instead of the = operator.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nPREDEFINED             = __DOXYGEN__=1 \\\n                         NO_SYS=0 \\\n                         SYS_LIGHTWEIGHT_PROT=1 \\\n                         LWIP_TCPIP_CORE_LOCKING=1 \\\n                         LWIP_IPV4=1 \\\n                         LWIP_IPV6=1 \\\n                         LWIP_ICMP=1 \\\n                         LWIP_RAW=1 \\\n                         LWIP_DHCP=1 \\\n                         LWIP_UDPLITE=1 \\\n                         LWIP_UDP=1 \\\n                         LWIP_IGMP=1 \\\n                         LWIP_TCP=1 \\\n                         TCP_LISTEN_BACKLOG=1 \\\n                         LWIP_SNMP=1 \\\n                         SNMP_USE_NETCONN=1 \\\n                         SNMP_USE_RAW=1 \\\n                         MIB2_STATS=1 \\\n                         LWIP_MDNS_RESPONDER=1 \\\n                         MEMP_OVERFLOW_CHECK=0 \\\n                         MEMP_SANITY_CHECK=1 \\\n                         LWIP_ARP=1 \\\n                         LWIP_HAVE_LOOPIF=1 \\\n                         LWIP_NETIF_HOSTNAME=1 \\\n                         LWIP_NETIF_API=1 \\\n                         LWIP_NETIF_CALLBACK=1 \\\n                         LWIP_NETIF_STATUS_CALLBACK=1 \\\n                         LWIP_NETIF_REMOVE_CALLBACK=1 \\\n                         LWIP_NETIF_LINK_CALLBACK=1 \\\n                         LWIP_NUM_NETIF_CLIENT_DATA=1 \\\n                         ENABLE_LOOPBACK=1 \\\n                         LWIP_AUTOIP=1 \\\n                         ARP_QUEUEING=1 \\\n                         LWIP_STATS=1 \\\n                         MEM_USE_POOLS=0 \\\n                         LWIP_DNS=1 \\\n                         LWIP_SOCKET=1 \\\n                         LWIP_NETCONN=1 \\\n                         IP_SOF_BROADCAST=1 \\\n                         IP_SOF_BROADCAST_RECV=1 \\\n                         LWIP_NETIF_API=1 \\\n                         LWIP_SO_SNDTIMEO=1 \\\n                         LWIP_SO_RCVBUF=1 \\\n                         LWIP_SO_LINGER=1 \\\n                         SO_REUSE=1 \\\n                         SO_REUSE_RXTOALL=1 \\\n                         LWIP_HAVE_SLIPIF=1 \\\n                         LWIP_6LOWPAN=1\n \n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this\n# tag can be used to specify a list of macro names that should be expanded. The\n# macro definition that is found in the sources will be used. Use the PREDEFINED\n# tag if you want to use a different macro definition that overrules the\n# definition found in the source code.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nEXPAND_AS_DEFINED      =\n\n# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will\n# remove all references to function-like macros that are alone on a line, have\n# an all uppercase name, and do not end with a semicolon. Such function macros\n# are typically used for boiler-plate code, and will confuse the parser if not\n# removed.\n# The default value is: YES.\n# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.\n\nSKIP_FUNCTION_MACROS   = NO\n\n#---------------------------------------------------------------------------\n# Configuration options related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES tag can be used to specify one or more tag files. For each tag\n# file the location of the external documentation should be added. The format of\n# a tag file without this location is as follows:\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where loc1 and loc2 can be relative or absolute paths or URLs. See the\n# section \"Linking to external documentation\" for more information about the use\n# of tag files.\n# Note: Each tag file must have a unique name (where the name does NOT include\n# the path). If a tag file is not located in the directory in which doxygen is\n# run, you must also specify the path to the tagfile here.\n\nTAGFILES               =\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create a\n# tag file that is based on the input files it reads. See section \"Linking to\n# external documentation\" for more information about the usage of tag files.\n\nGENERATE_TAGFILE       =\n\n# If the ALLEXTERNALS tag is set to YES, all external class will be listed in\n# the class index. If set to NO, only the inherited external classes will be\n# listed.\n# The default value is: NO.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will be\n# listed.\n# The default value is: YES.\n\nEXTERNAL_GROUPS        = YES\n\n# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in\n# the related pages index. If set to NO, only the current project's pages will\n# be listed.\n# The default value is: YES.\n\nEXTERNAL_PAGES         = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of 'which perl').\n# The default file (with absolute path) is: /usr/bin/perl.\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram\n# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to\n# NO turns the diagrams off. Note that this option also works with HAVE_DOT\n# disabled, but it is recommended to install and use dot, since it yields more\n# powerful graphs.\n# The default value is: YES.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see:\n# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            =\n\n# You can include diagrams made with dia in doxygen documentation. Doxygen will\n# then run dia to produce the diagram and insert it in the documentation. The\n# DIA_PATH tag allows you to specify the directory where the dia binary resides.\n# If left empty dia is assumed to be found in the default search path.\n\nDIA_PATH               =\n\n# If set to YES the inheritance and collaboration graphs will hide inheritance\n# and usage relations if the target is undocumented or is not a class.\n# The default value is: YES.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz (see:\n# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent\n# Bell Labs. The other options in this section have no effect if this option is\n# set to NO\n# The default value is: YES.\n\nHAVE_DOT               = NO\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed\n# to run in parallel. When set to 0 doxygen will base this on the number of\n# processors available in the system. You can set it explicitly to a value\n# larger than 0 to get control over the balance between CPU load and processing\n# speed.\n# Minimum value: 0, maximum value: 32, default value: 0.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_NUM_THREADS        = 0\n\n# When you want a differently looking font in the dot files that doxygen\n# generates you can specify the font name using DOT_FONTNAME. You need to make\n# sure dot is able to find the font, which can be done by putting it in a\n# standard location or by setting the DOTFONTPATH environment variable or by\n# setting DOT_FONTPATH to the directory containing the font.\n# The default value is: Helvetica.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTNAME           = Helvetica\n\n# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of\n# dot graphs.\n# Minimum value: 4, maximum value: 24, default value: 10.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the default font as specified with\n# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set\n# the path where dot can find it using this tag.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_FONTPATH           =\n\n# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for\n# each documented class showing the direct and indirect inheritance relations.\n# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a\n# graph for each documented class showing the direct and indirect implementation\n# dependencies (inheritance, containment, and class references variables) of the\n# class with other documented classes.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for\n# groups, showing the direct groups dependencies.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside the\n# class node. If there are many fields or methods and many nodes the graph may\n# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the\n# number of items for each type to make the size more manageable. Set this to 0\n# for no limit. Note that the threshold may be exceeded by 50% before the limit\n# is enforced. So when you set the threshold to 10, up to 15 fields may appear,\n# but if the number exceeds 15, the total amount of fields shown is limited to\n# 10.\n# Minimum value: 0, maximum value: 100, default value: 10.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and\n# collaboration graphs will show the relations between templates and their\n# instances.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to\n# YES then doxygen will generate a graph for each documented file showing the\n# direct and indirect include dependencies of the file with other documented\n# files.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINCLUDE_GRAPH          = YES\n\n# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are\n# set to YES then doxygen will generate a graph for each documented file showing\n# the direct and indirect include dependencies of the file with other documented\n# files.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH tag is set to YES then doxygen will generate a call\n# dependency graph for every global function or class method.\n#\n# Note that enabling this option will significantly increase the time of a run.\n# So in most cases it will be better to enable call graphs for selected\n# functions only using the \\callgraph command. Disabling a call graph can be\n# accomplished by means of the command \\hidecallgraph.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller\n# dependency graph for every global function or class method.\n#\n# Note that enabling this option will significantly increase the time of a run.\n# So in most cases it will be better to enable caller graphs for selected\n# functions only using the \\callergraph command. Disabling a caller graph can be\n# accomplished by means of the command \\hidecallergraph.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical\n# hierarchy of all classes instead of a textual one.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the\n# dependencies a directory has on other directories in a graphical way. The\n# dependency relations are determined by the #include relations between the\n# files in the directories.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. For an explanation of the image formats see the section\n# output formats in the documentation of the dot tool (Graphviz (see:\n# http://www.graphviz.org/)).\n# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order\n# to make the SVG files visible in IE 9+ (other browsers do not have this\n# requirement).\n# Possible values are: png, png:cairo, png:cairo:cairo, png:cairo:gd, png:gd,\n# png:gd:gd, jpg, jpg:cairo, jpg:cairo:gd, jpg:gd, jpg:gd:gd, gif, gif:cairo,\n# gif:cairo:gd, gif:gd, gif:gd:gd, svg, png:gd, png:gd:gd, png:cairo,\n# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and\n# png:gdiplus:gdiplus.\n# The default value is: png.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n#\n# Note that this requires a modern browser other than Internet Explorer. Tested\n# and working are Firefox, Chrome, Safari, and Opera.\n# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make\n# the SVG files visible. Older versions of IE do not have SVG support.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nINTERACTIVE_SVG        = NO\n\n# The DOT_PATH tag can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_PATH               =\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the \\dotfile\n# command).\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOTFILE_DIRS           =\n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the \\mscfile\n# command).\n\nMSCFILE_DIRS           =\n\n# The DIAFILE_DIRS tag can be used to specify one or more directories that\n# contain dia files that are included in the documentation (see the \\diafile\n# command).\n\nDIAFILE_DIRS           =\n\n# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the\n# path where java can find the plantuml.jar file. If left blank, it is assumed\n# PlantUML is not used or called during a preprocessing step. Doxygen will\n# generate a warning when it encounters a \\startuml command in this case and\n# will not generate output for the diagram.\n\nPLANTUML_JAR_PATH      =\n\n# When using plantuml, the specified paths are searched for files specified by\n# the !include statement in a plantuml block.\n\nPLANTUML_INCLUDE_PATH  =\n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes\n# that will be shown in the graph. If the number of nodes in a graph becomes\n# larger than this value, doxygen will truncate the graph, which is visualized\n# by representing a node as a red box. Note that doxygen if the number of direct\n# children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that\n# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n# Minimum value: 0, maximum value: 10000, default value: 50.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs\n# generated by dot. A depth value of 3 means that only nodes reachable from the\n# root by following a path via at most 3 edges will be shown. Nodes that lay\n# further from the root node will be omitted. Note that setting this option to 1\n# or 2 may greatly reduce the computation time needed for large code bases. Also\n# note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n# Minimum value: 0, maximum value: 1000, default value: 0.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nMAX_DOT_GRAPH_DEPTH    = 1000\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not seem\n# to support this out of the box.\n#\n# Warning: Depending on the platform used, enabling this option may lead to\n# badly anti-aliased labels on the edges of a graph (i.e. they become hard to\n# read).\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10) support\n# this, this feature is disabled by default.\n# The default value is: NO.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page\n# explaining the meaning of the various boxes and arrows in the dot generated\n# graphs.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot\n# files that are used to generate the various graphs.\n# The default value is: YES.\n# This tag requires that the tag HAVE_DOT is set to YES.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/doxygen/main_page.h",
    "content": "﻿/**\n * @defgroup lwip lwIP\n *\n * @defgroup infrastructure Infrastructure\n *\n * @defgroup callbackstyle_api Callback-style APIs\n * Non thread-safe APIs, callback style for maximum performance and minimum\n * memory footprint.\n * \n * @defgroup sequential_api Sequential-style APIs\n * Sequential-style APIs, blocking functions. More overhead, but can be called\n * from any thread except TCPIP thread.\n * \n * @defgroup addons Addons\n * \n * @defgroup apps Applications\n */\n\n/**\n * @mainpage Overview\n * @verbinclude \"README\"\n */\n\n/**\n * @page upgrading Upgrading\n * @verbinclude \"UPGRADING\"\n */\n\n/**\n * @page changelog Changelog\n * @verbinclude \"CHANGELOG\"\n */\n\n/**\n * @page contrib How to contribute to lwIP\n * @verbinclude \"contrib.txt\"\n */\n\n/**\n * @page pitfalls Common pitfalls\n *\n * Multiple Execution Contexts in lwIP code\n * ========================================\n *\n * The most common source of lwIP problems is to have multiple execution contexts\n * inside the lwIP code.\n * \n * lwIP can be used in two basic modes: @ref lwip_nosys (no OS/RTOS \n * running on target system) or @ref lwip_os (there is an OS running\n * on the target system).\n *\n * Mainloop Mode\n * -------------\n * In mainloop mode, only @ref callbackstyle_api can be used.\n * The user has two possibilities to ensure there is only one \n * exection context at a time in lwIP:\n *\n * 1) Deliver RX ethernet packets directly in interrupt context to lwIP\n *    by calling netif->input directly in interrupt. This implies all lwIP \n *    callback functions are called in IRQ context, which may cause further\n *    problems in application code: IRQ is blocked for a long time, multiple\n *    execution contexts in application code etc. When the application wants\n *    to call lwIP, it only needs to disable interrupts during the call.\n *    If timers are involved, even more locking code is needed to lock out\n *    timer IRQ and ethernet IRQ from each other, assuming these may be nested.\n *\n * 2) Run lwIP in a mainloop. There is example code here: @ref lwip_nosys.\n *    lwIP is _ONLY_ called from mainloop callstacks here. The ethernet IRQ\n *    has to put received telegrams into a queue which is polled in the\n *    mainloop. Ensure lwIP is _NEVER_ called from an interrupt, e.g.\n *    some SPI IRQ wants to forward data to udp_send() or tcp_write()!\n *\n * OS Mode\n * -------\n * In OS mode, @ref callbackstyle_api AND @ref sequential_api can be used.\n * @ref sequential_api are designed to be called from threads other than\n * the TCPIP thread, so there is nothing to consider here.\n * But @ref callbackstyle_api functions must _ONLY_ be called from\n * TCPIP thread. It is a common error to call these from other threads\n * or from IRQ contexts. ​Ethernet RX needs to deliver incoming packets\n * in the correct way by sending a message to TCPIP thread, this is\n * implemented in tcpip_input().​​\n * Again, ensure lwIP is _NEVER_ called from an interrupt, e.g.\n * some SPI IRQ wants to forward data to udp_send() or tcp_write()!\n * \n * 1) tcpip_callback() can be used get called back from TCPIP thread,\n *    it is safe to call any @ref callbackstyle_api from there.\n *\n * 2) Use @ref LWIP_TCPIP_CORE_LOCKING. All @ref callbackstyle_api\n *    functions can be called when lwIP core lock is aquired, see\n *    @ref LOCK_TCPIP_CORE() and @ref UNLOCK_TCPIP_CORE().\n *    These macros cannot be used in an interrupt context!\n *    Note the OS must correctly handle priority inversion for this.\n */\n\n/**\n * @page bugs Reporting bugs\n * Please report bugs in the lwIP bug tracker at savannah.\\n\n * BEFORE submitting, please check if the bug has already been reported!\\n\n * https://savannah.nongnu.org/bugs/?group=lwip\n */\n\n/**\n * @defgroup lwip_nosys Mainloop mode (\"NO_SYS\")\n * @ingroup lwip\n * Use this mode if you do not run an OS on your system. \\#define NO_SYS to 1.\n * Feed incoming packets to netif->input(pbuf, netif) function from mainloop,\n * *not* *from* *interrupt* *context*. You can allocate a @ref pbuf in interrupt\n * context and put them into a queue which is processed from mainloop.\\n\n * Call sys_check_timeouts() periodically in the mainloop.\\n\n * Porting: implement all functions in @ref sys_time, @ref sys_prot and \n * @ref compiler_abstraction.\\n\n * You can only use @ref callbackstyle_api in this mode.\\n\n * Sample code:\\n\n * @include NO_SYS_SampleCode.c\n */\n\n/**\n * @defgroup lwip_os OS mode (TCPIP thread)\n * @ingroup lwip\n * Use this mode if you run an OS on your system. It is recommended to\n * use an RTOS that correctly handles priority inversion and\n * to use @ref LWIP_TCPIP_CORE_LOCKING.\\n\n * Porting: implement all functions in @ref sys_layer.\\n\n * You can use @ref callbackstyle_api together with @ref tcpip_callback,\n * and all @ref sequential_api.\n */\n\n/**\n * @page raw_api lwIP API\n * @verbinclude \"rawapi.txt\"\n */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/mdns.txt",
    "content": "Multicast DNS for lwIP\n\nAuthor: Erik Ekman\n\n\nNote! The MDNS responder does not have all features required by the standards.\nSee notes in src/apps/mdns/mdns.c for what is left. It is however usable in normal\ncases - but watch out if many devices on the same network try to use the same\nhost/service instance names.\n\n\nHow to enable:\n==============\n\nMDNS support does not depend on DNS.\nMDNS supports using IPv4 only, v6 only, or v4+v6.\n\nTo enable MDNS responder, set\n  LWIP_MDNS_RESPONDER = 1\nin lwipopts.h and add src/apps/mdns/mdns.c to your list of files to build.\n\nThe max number of services supported per netif is defined by MDNS_MAX_SERVICES,\ndefault is 1.\n\nIncrease MEMP_NUM_UDP_PCB by 1. MDNS needs one PCB.\nIncrease LWIP_NUM_NETIF_CLIENT_DATA by 1 (MDNS needs one entry on netif).\n\nMDNS with IPv4 requires LWIP_IGMP = 1, and preferably LWIP_AUTOIP = 1.\nMDNS with IPv6 requires LWIP_IPV6_MLD = 1, and that a link-local address is\ngenerated.\n\nThe MDNS code puts its structs on the stack where suitable to reduce dynamic\nmemory allocation. It may use up to 1kB of stack.\n\nMDNS needs a strncasecmp() implementation. If you have one, define\nLWIP_MDNS_STRNCASECMP to it. Otherwise the code will provide an implementation\nfor you.\n\n\nHow to use:\n===========\n\nCall mdns_resp_init() during system initialization.\nThis opens UDP sockets on port 5353 for IPv4 and IPv6.\n\n\nTo start responding on a netif, run\n  mdns_resp_add_netif(struct netif *netif, char *hostname, u32_t dns_ttl)\n\nThe hostname will be copied. If this returns successfully, the netif will join\nthe multicast groups and any MDNS/legacy DNS requests sent unicast or multicast\nto port 5353 will be handled:\n- <hostname>.local type A, AAAA or ANY returns relevant IP addresses\n- Reverse lookups (PTR in-addr.arpa, ip6.arpa) of netif addresses\n  returns <hostname>.local\nAnswers will use the supplied TTL (in seconds)\nMDNS allows UTF-8 names, but it is recommended to stay within ASCII,\nsince the default case-insensitive comparison assumes this.\n\nIt is recommended to call this function after an IPv4 address has been set,\nsince there is currently no check if the v4 address is valid.\n\nCall mdns_resp_netif_settings_changed() every time the IP address\non the netif has changed.\n\nTo stop responding on a netif, run\n  mdns_resp_remove_netif(struct netif *netif)\n\n\nAdding services:\n================\n\nThe netif first needs to be registered. Then run\n  mdns_resp_add_service(struct netif *netif, char *name, char *service,\n      u16_t proto, u16_t port, u32_t dns_ttl,\n      service_get_txt_fn_t txt_fn, void *txt_userdata);\n\nThe name and service pointers will be copied. Name refers to the name of the\nservice instance, and service is the type of service, like _http\nproto can be DNSSD_PROTO_UDP or DNSSD_PROTO_TCP which represent _udp and _tcp.\nIf this call returns successfully, the following queries will be answered:\n- _services._dns-sd._udp.local type PTR returns <service>.<proto>.local\n- <service>.<proto>.local type PTR returns <name>.<service>.<proto>.local\n- <name>.<service>.<proto>.local type SRV returns hostname and port of service\n- <name>.<service>.<proto>.local type TXT builds text strings by calling txt_fn\n  with the supplied userdata. The callback adds strings to the reply by calling\n  mdns_resp_add_service_txtitem(struct mdns_service *service, char *txt,\n   int txt_len). Example callback method:\n\n   static void srv_txt(struct mdns_service *service, void *txt_userdata)\n   {\n     res = mdns_resp_add_service_txtitem(service, \"path=/\", 6);\n     LWIP_ERROR(\"mdns add service txt failed\\n\", (res == ERR_OK), return);\n   }\n\n  Since a hostname struct is used for TXT storage each single item can be max\n  63 bytes long, and  the total max length (including length bytes for each\n  item) is 255 bytes.\n\nIf your device runs a webserver on port 80, an example call might be:\n\n  mdns_resp_add_service(netif, \"myweb\", \"_http\"\n      DNSSD_PROTO_TCP, 80, 3600, srv_txt, NULL);\n\nwhich will publish myweb._http._tcp.local for any hosts looking for web servers,\nand point them to <hostname>.local:80\n\nRelevant information will be sent as additional records to reduce number of\nrequests required from a client.\n\nRemoving services is currently not supported. Services are removed when the\nnetif is removed.\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/mqtt_client.txt",
    "content": "MQTT client for lwIP\n\nAuthor: Erik Andersson\n\nDetails of the MQTT protocol can be found at:\nhttp://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.html \n\n-----------------------------------------------------------------\n1. Initial steps, reserve memory and make connection to server:\n\n1.1: Provide storage\n\nStatic allocation:\n  mqtt_client_t static_client;\n  example_do_connect(&static_client);\n\nDynamic allocation:\n  mqtt_client_t *client = mqtt_client_new();\n  if(client != NULL) {\n    example_do_connect(&client);\n  }\n  \n1.2: Establish Connection with server\n\nvoid example_do_connect(mqtt_client_t *client)\n{\n  struct mqtt_connect_client_info_t ci;\n  err_t err;\n  \n  /* Setup an empty client info structure */\n  memset(&ci, 0, sizeof(ci));\n  \n  /* Minimal amount of information required is client identifier, so set it here */ \n  ci.client_id = \"lwip_test\";\n  \n  /* Initiate client and connect to server, if this fails immediately an error code is returned\n     otherwise mqtt_connection_cb will be called with connection result after attempting \n     to establish a connection with the server. \n     For now MQTT version 3.1.1 is always used */\n  \n  err = mqtt_client_connect(client, ip_addr, MQTT_PORT, mqtt_connection_cb, 0, &ci);\n  \n  /* For now just print the result code if something goes wrong\n  if(err != ERR_OK) {\n    printf(\"mqtt_connect return %d\\n\", err);\n  }\n}\n\nConnection to server can also be probed by calling mqtt_client_is_connected(client) \n\n-----------------------------------------------------------------\n2. Implementing the connection status callback\n\n\nstatic void mqtt_connection_cb(mqtt_client_t *client, void *arg, mqtt_connection_status_t status)\n{\n  err_t err;\n  if(status == MQTT_CONNECT_ACCEPTED) {\n    printf(\"mqtt_connection_cb: Successfully connected\\n\");\n    \n    /* Setup callback for incoming publish requests */\n    mqtt_set_inpub_callback(client, mqtt_incoming_publish_cb, mqtt_incoming_data_cb, arg);\n    \n    /* Subscribe to a topic named \"subtopic\" with QoS level 1, call mqtt_sub_request_cb with result */ \n    err = mqtt_subscribe(client, \"subtopic\", 1, mqtt_sub_request_cb, arg);\n\n    if(err != ERR_OK) {\n      printf(\"mqtt_subscribe return: %d\\n\", err);\n    }\n  } else {\n    printf(\"mqtt_connection_cb: Disconnected, reason: %d\\n\", status);\n    \n    /* Its more nice to be connected, so try to reconnect */\n    example_do_connect(client);\n  }  \n}\n\nstatic void mqtt_sub_request_cb(void *arg, err_t result)\n{\n  /* Just print the result code here for simplicity, \n     normal behaviour would be to take some action if subscribe fails like \n     notifying user, retry subscribe or disconnect from server */\n  printf(\"Subscribe result: %d\\n\", result);\n}\n\n-----------------------------------------------------------------\n3. Implementing callbacks for incoming publish and data\n\n/* The idea is to demultiplex topic and create some reference to be used in data callbacks\n   Example here uses a global variable, better would be to use a member in arg\n   If RAM and CPU budget allows it, the easiest implementation might be to just take a copy of\n   the topic string and use it in mqtt_incoming_data_cb\n*/\nstatic int inpub_id;\nstatic void mqtt_incoming_publish_cb(void *arg, const char *topic, u32_t tot_len)\n{\n  printf(\"Incoming publish at topic %s with total length %u\\n\", topic, (unsigned int)tot_len);\n\n  /* Decode topic string into a user defined reference */\n  if(strcmp(topic, \"print_payload\") == 0) {\n    inpub_id = 0;\n  } else if(topic[0] == 'A') {\n    /* All topics starting with 'A' might be handled at the same way */\n    inpub_id = 1;\n  } else {\n    /* For all other topics */\n    inpub_id = 2;\n  }\n}\n\nstatic void mqtt_incoming_data_cb(void *arg, const u8_t *data, u16_t len, u8_t flags)\n{\n  printf(\"Incoming publish payload with length %d, flags %u\\n\", len, (unsigned int)flags);\n\n  if(flags & MQTT_DATA_FLAG_LAST) {\n    /* Last fragment of payload received (or whole part if payload fits receive buffer\n       See MQTT_VAR_HEADER_BUFFER_LEN)  */\n\n    /* Call function or do action depending on reference, in this case inpub_id */\n    if(inpub_id == 0) {\n      /* Don't trust the publisher, check zero termination */\n      if(data[len-1] == 0) {\n        printf(\"mqtt_incoming_data_cb: %s\\n\", (const char *)data);\n      }\n    } else if(inpub_id == 1) {\n      /* Call an 'A' function... */\n    } else {\n      printf(\"mqtt_incoming_data_cb: Ignoring payload...\\n\");\n    }\n  } else {\n    /* Handle fragmented payload, store in buffer, write to file or whatever */\n  }\n}\n\n-----------------------------------------------------------------\n4. Using outgoing publish\n\n\nvoid example_publish(mqtt_client_t *client, void *arg)\n{\n  const char *pub_payload= \"PubSubHubLubJub\";\n  err_t err;\n  u8_t qos = 2; /* 0 1 or 2, see MQTT specification */\n  u8_t retain = 0; /* No don't retain such crappy payload... */\n  err = mqtt_publish(client, \"pub_topic\", pub_payload, strlen(pub_payload), qos, retain, mqtt_pub_request_cb, arg);\n  if(err != ERR_OK) {\n    printf(\"Publish err: %d\\n\", err);\n  }\n}\n\n/* Called when publish is complete either with sucess or failure */\nstatic void mqtt_pub_request_cb(void *arg, err_t result)\n{\n  if(result != ERR_OK) {\n    printf(\"Publish result: %d\\n\", result);\n  }\n}\n\n-----------------------------------------------------------------\n5. Disconnecting\n\nSimply call mqtt_disconnect(client)\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/ppp.txt",
    "content": "PPP interface for lwIP\n\nAuthor: Sylvain Rochet\n\nTable of Contents:\n\n1 - Supported PPP protocols and features\n2 - Raw API PPP example for all protocols\n3 - PPPoS input path (raw API, IRQ safe API, TCPIP API)\n4 - Thread safe PPP API (PPPAPI)\n5 - Notify phase callback (PPP_NOTIFY_PHASE)\n6 - Upgrading from lwIP <= 1.4.x to lwIP >= 2.0.x\n\n\n\n1 Supported PPP protocols and features\n======================================\n\nSupported Low level protocols:\n* PPP over serial using HDLC-like framing, such as wired dialup modems\n  or mobile telecommunications GPRS/EDGE/UMTS/HSPA+/LTE modems\n* PPP over Ethernet, such as xDSL modems\n* PPP over L2TP (Layer 2 Tunneling Protocol) LAC (L2TP Access Concentrator),\n  IP tunnel over UDP, such as VPN access\n\nSupported auth protocols:\n* PAP, Password Authentication Protocol\n* CHAP, Challenge-Handshake Authentication Protocol, also known as CHAP-MD5\n* MSCHAPv1, Microsoft version of CHAP, version 1\n* MSCHAPv2, Microsoft version of CHAP, version 2\n* EAP, Extensible Authentication Protocol\n\nSupported address protocols:\n* IPCP, IP Control Protocol, IPv4 addresses negotiation\n* IP6CP, IPv6 Control Protocol, IPv6 link-local addresses negotiation\n\nSupported encryption protocols:\n* MPPE, Microsoft Point-to-Point Encryption\n\nSupported compression or miscellaneous protocols, for serial links only:\n* PFC, Protocol Field Compression\n* ACFC, Address-and-Control-Field-Compression\n* ACCM, Asynchronous-Control-Character-Map\n* VJ, Van Jacobson TCP/IP Header Compression\n\n\n\n2 Raw API PPP example for all protocols\n=======================================\n\nAs usual, raw API for lwIP means the lightweight API which *MUST* only be used\nfor NO_SYS=1 systems or called inside lwIP core thread for NO_SYS=0 systems.\n\n/*\n * Globals\n * =======\n */\n\n/* The PPP control block */\nppp_pcb *ppp;\n\n/* The PPP IP interface */\nstruct netif ppp_netif;\n\n\n/*\n * PPP status callback\n * ===================\n *\n * PPP status callback is called on PPP status change (up, down, …) from lwIP\n * core thread\n */\n\n/* PPP status callback example */\nstatic void status_cb(ppp_pcb *pcb, int err_code, void *ctx) {\n  struct netif *pppif = ppp_netif(pcb);\n  LWIP_UNUSED_ARG(ctx);\n\n  switch(err_code) {\n    case PPPERR_NONE: {\n#if LWIP_DNS\n      const ip_addr_t *ns;\n#endif /* LWIP_DNS */\n      printf(\"status_cb: Connected\\n\");\n#if PPP_IPV4_SUPPORT\n      printf(\"   our_ipaddr  = %s\\n\", ipaddr_ntoa(&pppif->ip_addr));\n      printf(\"   his_ipaddr  = %s\\n\", ipaddr_ntoa(&pppif->gw));\n      printf(\"   netmask     = %s\\n\", ipaddr_ntoa(&pppif->netmask));\n#if LWIP_DNS\n      ns = dns_getserver(0);\n      printf(\"   dns1        = %s\\n\", ipaddr_ntoa(ns));\n      ns = dns_getserver(1);\n      printf(\"   dns2        = %s\\n\", ipaddr_ntoa(ns));\n#endif /* LWIP_DNS */\n#endif /* PPP_IPV4_SUPPORT */\n#if PPP_IPV6_SUPPORT\n      printf(\"   our6_ipaddr = %s\\n\", ip6addr_ntoa(netif_ip6_addr(pppif, 0)));\n#endif /* PPP_IPV6_SUPPORT */\n      break;\n    }\n    case PPPERR_PARAM: {\n      printf(\"status_cb: Invalid parameter\\n\");\n      break;\n    }\n    case PPPERR_OPEN: {\n      printf(\"status_cb: Unable to open PPP session\\n\");\n      break;\n    }\n    case PPPERR_DEVICE: {\n      printf(\"status_cb: Invalid I/O device for PPP\\n\");\n      break;\n    }\n    case PPPERR_ALLOC: {\n      printf(\"status_cb: Unable to allocate resources\\n\");\n      break;\n    }\n    case PPPERR_USER: {\n      printf(\"status_cb: User interrupt\\n\");\n      break;\n    }\n    case PPPERR_CONNECT: {\n      printf(\"status_cb: Connection lost\\n\");\n      break;\n    }\n    case PPPERR_AUTHFAIL: {\n      printf(\"status_cb: Failed authentication challenge\\n\");\n      break;\n    }\n    case PPPERR_PROTOCOL: {\n      printf(\"status_cb: Failed to meet protocol\\n\");\n      break;\n    }\n    case PPPERR_PEERDEAD: {\n      printf(\"status_cb: Connection timeout\\n\");\n      break;\n    }\n    case PPPERR_IDLETIMEOUT: {\n      printf(\"status_cb: Idle Timeout\\n\");\n      break;\n    }\n    case PPPERR_CONNECTTIME: {\n      printf(\"status_cb: Max connect time reached\\n\");\n      break;\n    }\n    case PPPERR_LOOPBACK: {\n      printf(\"status_cb: Loopback detected\\n\");\n      break;\n    }\n    default: {\n      printf(\"status_cb: Unknown error code %d\\n\", err_code);\n      break;\n    }\n  }\n\n/*\n * This should be in the switch case, this is put outside of the switch\n * case for example readability.\n */\n\n  if (err_code == PPPERR_NONE) {\n    return;\n  }\n\n  /* ppp_close() was previously called, don't reconnect */\n  if (err_code == PPPERR_USER) {\n    /* ppp_free(); -- can be called here */\n    return;\n  }\n\n  /*\n   * Try to reconnect in 30 seconds, if you need a modem chatscript you have\n   * to do a much better signaling here ;-)\n   */\n  ppp_connect(pcb, 30);\n  /* OR ppp_listen(pcb); */\n}\n\n\n/*\n * Creating a new PPPoS session\n * ============================\n *\n * In lwIP, PPPoS is not PPPoSONET, in lwIP PPPoS is PPPoSerial.\n */\n\n#include \"netif/ppp/pppos.h\"\n\n/*\n * PPPoS serial output callback\n *\n * ppp_pcb, PPP control block\n * data, buffer to write to serial port\n * len, length of the data buffer\n * ctx, optional user-provided callback context pointer\n *\n * Return value: len if write succeed\n */\nstatic u32_t output_cb(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx) {\n  return uart_write(UART, data, len);\n}\n\n/*\n * Create a new PPPoS interface\n *\n * ppp_netif, netif to use for this PPP link, i.e. PPP IP interface\n * output_cb, PPPoS serial output callback\n * status_cb, PPP status callback, called on PPP status change (up, down, …)\n * ctx_cb, optional user-provided callback context pointer\n */\nppp = pppos_create(&ppp_netif,\n       output_cb, status_cb, ctx_cb);\n\n\n/*\n * Creating a new PPPoE session\n * ============================\n */\n\n#include \"netif/ppp/pppoe.h\"\n\n/*\n * Create a new PPPoE interface\n *\n * ppp_netif, netif to use for this PPP link, i.e. PPP IP interface\n * ethif, already existing and setup Ethernet interface to use\n * service_name, PPPoE service name discriminator (not supported yet)\n * concentrator_name, PPPoE concentrator name discriminator (not supported yet)\n * status_cb, PPP status callback, called on PPP status change (up, down, …)\n * ctx_cb, optional user-provided callback context pointer\n */\nppp = pppoe_create(&ppp_netif,\n       &ethif,\n       service_name, concentrator_name,\n       status_cb, ctx_cb);\n\n\n/*\n * Creating a new PPPoL2TP session\n * ===============================\n */\n\n#include \"netif/ppp/pppol2tp.h\"\n\n/*\n * Create a new PPPoL2TP interface\n *\n * ppp_netif, netif to use for this PPP link, i.e. PPP IP interface\n * netif, optional already existing and setup output netif, necessary if you\n *        want to set this interface as default route to settle the chicken\n *        and egg problem with VPN links\n * ipaddr, IP to connect to\n * port, UDP port to connect to (usually 1701)\n * secret, L2TP secret to use\n * secret_len, size in bytes of the L2TP secret\n * status_cb, PPP status callback, called on PPP status change (up, down, …)\n * ctx_cb, optional user-provided callback context pointer\n */\nppp = pppol2tp_create(&ppp_netif,\n       struct netif *netif, ip_addr_t *ipaddr, u16_t port,\n       u8_t *secret, u8_t secret_len,\n       ppp_link_status_cb_fn link_status_cb, void *ctx_cb);\n\n\n/*\n * Initiate PPP client connection\n * ==============================\n */\n\n/* Set this interface as default route */\nppp_set_default(ppp);\n\n/*\n * Basic PPP client configuration. Can only be set if PPP session is in the\n * dead state (i.e. disconnected). We don't need to provide thread-safe\n * equivalents through PPPAPI because those helpers are only changing\n * structure members while session is inactive for lwIP core. Configuration\n * only need to be done once.\n */\n\n/* Ask the peer for up to 2 DNS server addresses. */\nppp_set_usepeerdns(ppp, 1);\n\n/* Auth configuration, this is pretty self-explanatory */\nppp_set_auth(ppp, PPPAUTHTYPE_ANY, \"login\", \"password\");\n\n/*\n * Initiate PPP negotiation, without waiting (holdoff=0), can only be called\n * if PPP session is in the dead state (i.e. disconnected).\n */\nu16_t holdoff = 0;\nppp_connect(ppp, holdoff);\n\n\n/*\n * Initiate PPP server listener\n * ============================\n */\n\n/*\n * Basic PPP server configuration. Can only be set if PPP session is in the\n * dead state (i.e. disconnected). We don't need to provide thread-safe\n * equivalents through PPPAPI because those helpers are only changing\n * structure members while session is inactive for lwIP core. Configuration\n * only need to be done once.\n */\nip4_addr_t addr;\n\n/* Set our address */\nIP4_ADDR(&addr, 192,168,0,1);\nppp_set_ipcp_ouraddr(ppp, &addr);\n\n/* Set peer(his) address */\nIP4_ADDR(&addr, 192,168,0,2);\nppp_set_ipcp_hisaddr(ppp, &addr);\n\n/* Set primary DNS server */\nIP4_ADDR(&addr, 192,168,10,20);\nppp_set_ipcp_dnsaddr(ppp, 0, &addr);\n\n/* Set secondary DNS server */\nIP4_ADDR(&addr, 192,168,10,21);\nppp_set_ipcp_dnsaddr(ppp, 1, &addr);\n\n/* Auth configuration, this is pretty self-explanatory */\nppp_set_auth(ppp, PPPAUTHTYPE_ANY, \"login\", \"password\");\n\n/* Require peer to authenticate */\nppp_set_auth_required(ppp, 1);\n\n/*\n * Only for PPPoS, the PPP session should be up and waiting for input.\n *\n * Note: for PPPoS, ppp_connect() and ppp_listen() are actually the same thing.\n * The listen call is meant for future support of PPPoE and PPPoL2TP server\n * mode, where we will need to negotiate the incoming PPPoE session or L2TP\n * session before initiating PPP itself. We need this call because there is\n * two passive modes for PPPoS, ppp_set_passive and ppp_set_silent.\n */\nppp_set_silent(pppos, 1);\n\n/*\n * Initiate PPP listener (i.e. wait for an incoming connection), can only\n * be called if PPP session is in the dead state (i.e. disconnected).\n */\nppp_listen(ppp);\n\n\n/*\n * Closing PPP connection\n * ======================\n */\n\n/*\n * Initiate the end of the PPP session, without carrier lost signal\n * (nocarrier=0), meaning a clean shutdown of PPP protocols.\n * You can call this function at anytime.\n */\nu8_t nocarrier = 0;\nppp_close(ppp, nocarrier);\n/*\n * Then you must wait your status_cb() to be called, it may takes from a few\n * seconds to several tens of seconds depending on the current PPP state.\n */\n\n/*\n * Freeing a PPP connection\n * ========================\n */\n\n/*\n * Free the PPP control block, can only be called if PPP session is in the\n * dead state (i.e. disconnected). You need to call ppp_close() before.\n */\nppp_free(ppp);\n\n\n\n3 PPPoS input path (raw API, IRQ safe API, TCPIP API)\n=====================================================\n\nReceived data on serial port should be sent to lwIP using the pppos_input()\nfunction or the pppos_input_tcpip() function.\n\nIf NO_SYS is 1 and if PPP_INPROC_IRQ_SAFE is 0 (the default), pppos_input()\nis not IRQ safe and then *MUST* only be called inside your main loop.\n\nWhatever the NO_SYS value, if PPP_INPROC_IRQ_SAFE is 1, pppos_input() is IRQ\nsafe and can be safely called from an interrupt context, using that is going\nto reduce your need of buffer if pppos_input() is called byte after byte in\nyour rx serial interrupt.\n\nif NO_SYS is 0, the thread safe way outside an interrupt context is to use\nthe pppos_input_tcpip() function to pass input data to the lwIP core thread\nusing the TCPIP API. This is thread safe in all cases but you should avoid\npassing data byte after byte because it uses heavy locking (mailbox) and it\nallocates pbuf, better fill them !\n\nif NO_SYS is 0 and if PPP_INPROC_IRQ_SAFE is 1, you may also use pppos_input()\nfrom an RX thread, however pppos_input() is not thread safe by itself. You can\ndo that *BUT* you should NEVER call pppos_connect(), pppos_listen() and\nppp_free() if pppos_input() can still be running, doing this is NOT thread safe\nat all. Using PPP_INPROC_IRQ_SAFE from an RX thread is discouraged unless you\nreally know what you are doing, your move ;-)\n\n\n/*\n * Fonction to call for received data\n *\n * ppp, PPP control block\n * buffer, input buffer\n * buffer_len, buffer length in bytes\n */\nvoid pppos_input(ppp, buffer, buffer_len);\n\nor\n\nvoid pppos_input_tcpip(ppp, buffer, buffer_len);\n\n\n\n4 Thread safe PPP API (PPPAPI)\n==============================\n\nThere is a thread safe API for all corresponding ppp_* functions, you have to\nenable LWIP_PPP_API in your lwipopts.h file, then see\ninclude/netif/ppp/pppapi.h, this is actually pretty obvious.\n\n\n\n5 Notify phase callback (PPP_NOTIFY_PHASE)\n==========================================\n\nNotify phase callback, enabled using the PPP_NOTIFY_PHASE config option, let\nyou configure a callback that is called on each PPP internal state change.\nThis is different from the status callback which only warns you about\nup(running) and down(dead) events.\n\nNotify phase callback can be used, for example, to set a LED pattern depending\non the current phase of the PPP session. Here is a callback example which\ntries to mimic what we usually see on xDSL modems while they are negotiating\nthe link, which should be self-explanatory:\n\nstatic void ppp_notify_phase_cb(ppp_pcb *pcb, u8_t phase, void *ctx) {\n  switch (phase) {\n\n  /* Session is down (either permanently or briefly) */\n  case PPP_PHASE_DEAD:\n    led_set(PPP_LED, LED_OFF);\n    break;\n\n  /* We are between two sessions */\n  case PPP_PHASE_HOLDOFF:\n    led_set(PPP_LED, LED_SLOW_BLINK);\n    break;\n\n  /* Session just started */\n  case PPP_PHASE_INITIALIZE:\n    led_set(PPP_LED, LED_FAST_BLINK);\n    break;\n\n  /* Session is running */\n  case PPP_PHASE_RUNNING:\n    led_set(PPP_LED, LED_ON);\n    break;\n\n  default:\n    break;\n  }\n}\n\n\n\n6 Upgrading from lwIP <= 1.4.x to lwIP >= 2.0.x\n===============================================\n\nPPP API was fully reworked between 1.4.x and 2.0.x releases. However porting\nfrom previous lwIP version is pretty easy:\n\n* Previous PPP API used an integer to identify PPP sessions, we are now\n  using ppp_pcb* control block, therefore all functions changed from \"int ppp\"\n  to \"ppp_pcb *ppp\"\n\n* struct netif was moved outside the PPP structure, you have to provide a netif\n  for PPP interface in pppoX_create() functions\n\n* PPP session are not started automatically after you created them anymore,\n  you have to call ppp_connect(), this way you can configure the session before\n  starting it.\n\n* Previous PPP API used CamelCase, we are now using snake_case.\n\n* Previous PPP API mixed PPPoS and PPPoE calls, this isn't the case anymore,\n  PPPoS functions are now prefixed pppos_ and PPPoE functions are now prefixed\n  pppoe_, common functions are now prefixed ppp_.\n\n* New PPPERR_ error codes added, check you have all of them in your status\n  callback function\n\n* Only the following include files should now be used in user application:\n  #include \"netif/ppp/pppapi.h\"\n  #include \"netif/ppp/pppos.h\"\n  #include \"netif/ppp/pppoe.h\"\n  #include \"netif/ppp/pppol2tp.h\"\n\n  Functions from ppp.h can be used, but you don't need to include this header\n  file as it is already included by above header files.\n\n* PPP_INPROC_OWNTHREAD was broken by design and was removed, you have to create\n  your own serial rx thread\n\n* PPP_INPROC_MULTITHREADED option was misnamed and confusing and was renamed\n  PPP_INPROC_IRQ_SAFE, please read the \"PPPoS input path\" documentation above\n  because you might have been fooled by that\n\n* If you used tcpip_callback_with_block() on ppp_ functions you may wish to use\n  the PPPAPI API instead.\n\n* ppp_sighup and ppp_close functions were merged using an optional argument\n  \"nocarrier\" on ppp_close.\n\n* DNS servers are now only remotely asked if LWIP_DNS is set and if\n  ppp_set_usepeerdns() is set to true, they are now automatically registered\n  using the dns_setserver() function so you don't need to do that in the PPP\n  callback anymore.\n\n* PPPoS does not use the SIO API anymore, as such it now requires a serial\n  output callback in place of sio_write\n\n* PPP_MAXIDLEFLAG is now in ms instead of jiffies\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/rawapi.txt",
    "content": "Raw TCP/IP interface for lwIP\n\nAuthors: Adam Dunkels, Leon Woestenberg, Christiaan Simons\n\nlwIP provides three Application Program's Interfaces (APIs) for programs\nto use for communication with the TCP/IP code:\n* low-level \"core\" / \"callback\" or \"raw\" API.\n* higher-level \"sequential\" API.\n* BSD-style socket API.\n\nThe raw API (sometimes called native API) is an event-driven API designed\nto be used without an operating system that implements zero-copy send and\nreceive. This API is also used by the core stack for interaction between\nthe various protocols. It is the only API available when running lwIP\nwithout an operating system.\n\nThe sequential API provides a way for ordinary, sequential, programs\nto use the lwIP stack. It is quite similar to the BSD socket API. The\nmodel of execution is based on the blocking open-read-write-close\nparadigm. Since the TCP/IP stack is event based by nature, the TCP/IP\ncode and the application program must reside in different execution\ncontexts (threads).\n\nThe socket API is a compatibility API for existing applications,\ncurrently it is built on top of the sequential API. It is meant to\nprovide all functions needed to run socket API applications running\non other platforms (e.g. unix / windows etc.). However, due to limitations\nin the specification of this API, there might be incompatibilities\nthat require small modifications of existing programs.\n\n** Multithreading\n\nlwIP started targeting single-threaded environments. When adding multi-\nthreading support, instead of making the core thread-safe, another\napproach was chosen: there is one main thread running the lwIP core\n(also known as the \"tcpip_thread\"). When running in a multithreaded\nenvironment, raw API functions MUST only be called from the core thread\nsince raw API functions are not protected from concurrent access (aside\nfrom pbuf- and memory management functions). Application threads using\nthe sequential- or socket API communicate with this main thread through\nmessage passing.\n\n      As such, the list of functions that may be called from\n      other threads or an ISR is very limited! Only functions\n      from these API header files are thread-safe:\n      - api.h\n      - netbuf.h\n      - netdb.h\n      - netifapi.h\n      - pppapi.h\n      - sockets.h\n      - sys.h\n\n      Additionaly, memory (de-)allocation functions may be\n      called from multiple threads (not ISR!) with NO_SYS=0\n      since they are protected by SYS_LIGHTWEIGHT_PROT and/or\n      semaphores.\n\n      Netconn or Socket API functions are thread safe against the\n      core thread but they are not reentrant at the control block\n      granularity level. That is, a UDP or TCP control block must\n      not be shared among multiple threads without proper locking.\n\n      If SYS_LIGHTWEIGHT_PROT is set to 1 and\n      LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT is set to 1,\n      pbuf_free() may also be called from another thread or\n      an ISR (since only then, mem_free - for PBUF_RAM - may\n      be called from an ISR: otherwise, the HEAP is only\n      protected by semaphores).\n\n\n** The remainder of this document discusses the \"raw\" API. **\n\nThe raw TCP/IP interface allows the application program to integrate\nbetter with the TCP/IP code. Program execution is event based by\nhaving callback functions being called from within the TCP/IP\ncode. The TCP/IP code and the application program both run in the same\nthread. The sequential API has a much higher overhead and is not very\nwell suited for small systems since it forces a multithreaded paradigm\non the application.\n\nThe raw TCP/IP interface is not only faster in terms of code execution\ntime but is also less memory intensive. The drawback is that program\ndevelopment is somewhat harder and application programs written for\nthe raw TCP/IP interface are more difficult to understand. Still, this\nis the preferred way of writing applications that should be small in\ncode size and memory usage.\n\nAll APIs can be used simultaneously by different application\nprograms. In fact, the sequential API is implemented as an application\nprogram using the raw TCP/IP interface.\n\nDo not confuse the lwIP raw API with raw Ethernet or IP sockets.\nThe former is a way of interfacing the lwIP network stack (including\nTCP and UDP), the later refers to processing raw Ethernet or IP data\ninstead of TCP connections or UDP packets.\n\nRaw API applications may never block since all packet processing\n(input and output) as well as timer processing (TCP mainly) is done\nin a single execution context.\n\n--- Callbacks\n\nProgram execution is driven by callbacks functions, which are then\ninvoked by the lwIP core when activity related to that application\noccurs. A particular application may register to be notified via a\ncallback function for events such as incoming data available, outgoing\ndata sent, error notifications, poll timer expiration, connection\nclosed, etc. An application can provide a callback function to perform\nprocessing for any or all of these events. Each callback is an ordinary\nC function that is called from within the TCP/IP code. Every callback\nfunction is passed the current TCP or UDP connection state as an\nargument. Also, in order to be able to keep program specific state,\nthe callback functions are called with a program specified argument\nthat is independent of the TCP/IP state.\n\nThe function for setting the application connection state is:\n\n- void tcp_arg(struct tcp_pcb *pcb, void *arg)\n\n  Specifies the program specific state that should be passed to all\n  other callback functions. The \"pcb\" argument is the current TCP\n  connection control block, and the \"arg\" argument is the argument\n  that will be passed to the callbacks.\n\n  \n--- TCP connection setup\n\nThe functions used for setting up connections is similar to that of\nthe sequential API and of the BSD socket API. A new TCP connection\nidentifier (i.e., a protocol control block - PCB) is created with the\ntcp_new() function. This PCB can then be either set to listen for new\nincoming connections or be explicitly connected to another host.\n\n- struct tcp_pcb *tcp_new(void)\n\n  Creates a new connection identifier (PCB). If memory is not\n  available for creating the new pcb, NULL is returned.\n\n- err_t tcp_bind(struct tcp_pcb *pcb, ip_addr_t *ipaddr,\n                 u16_t port)\n\n  Binds the pcb to a local IP address and port number. The IP address\n  can be specified as IP_ADDR_ANY in order to bind the connection to\n  all local IP addresses.\n\n  If another connection is bound to the same port, the function will\n  return ERR_USE, otherwise ERR_OK is returned.\n\n- struct tcp_pcb *tcp_listen(struct tcp_pcb *pcb)\n\n  Commands a pcb to start listening for incoming connections. When an\n  incoming connection is accepted, the function specified with the\n  tcp_accept() function will be called. The pcb will have to be bound\n  to a local port with the tcp_bind() function.\n\n  The tcp_listen() function returns a new connection identifier, and\n  the one passed as an argument to the function will be\n  deallocated. The reason for this behavior is that less memory is\n  needed for a connection that is listening, so tcp_listen() will\n  reclaim the memory needed for the original connection and allocate a\n  new smaller memory block for the listening connection.\n\n  tcp_listen() may return NULL if no memory was available for the\n  listening connection. If so, the memory associated with the pcb\n  passed as an argument to tcp_listen() will not be deallocated.\n\n- struct tcp_pcb *tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)\n\n  Same as tcp_listen, but limits the number of outstanding connections\n  in the listen queue to the value specified by the backlog argument.\n  To use it, your need to set TCP_LISTEN_BACKLOG=1 in your lwipopts.h.\n\n- void tcp_accept(struct tcp_pcb *pcb,\n                  err_t (* accept)(void *arg, struct tcp_pcb *newpcb,\n                                   err_t err))\n\n  Specified the callback function that should be called when a new\n  connection arrives on a listening connection.\n\n- err_t tcp_connect(struct tcp_pcb *pcb, ip_addr_t *ipaddr,\n                    u16_t port, err_t (* connected)(void *arg,\n                                                    struct tcp_pcb *tpcb,\n                                                    err_t err));\n\n  Sets up the pcb to connect to the remote host and sends the\n  initial SYN segment which opens the connection. \n\n  The tcp_connect() function returns immediately; it does not wait for\n  the connection to be properly setup. Instead, it will call the\n  function specified as the fourth argument (the \"connected\" argument)\n  when the connection is established. If the connection could not be\n  properly established, either because the other host refused the\n  connection or because the other host didn't answer, the \"err\"\n  callback function of this pcb (registered with tcp_err, see below)\n  will be called.\n\n  The tcp_connect() function can return ERR_MEM if no memory is\n  available for enqueueing the SYN segment. If the SYN indeed was\n  enqueued successfully, the tcp_connect() function returns ERR_OK.\n\n\n--- Sending TCP data\n\nTCP data is sent by enqueueing the data with a call to\ntcp_write(). When the data is successfully transmitted to the remote\nhost, the application will be notified with a call to a specified\ncallback function.\n\n- err_t tcp_write(struct tcp_pcb *pcb, const void *dataptr, u16_t len,\n                  u8_t apiflags)\n\n  Enqueues the data pointed to by the argument dataptr. The length of\n  the data is passed as the len parameter. The apiflags can be one or more of:\n  - TCP_WRITE_FLAG_COPY: indicates whether the new memory should be allocated\n    for the data to be copied into. If this flag is not given, no new memory\n    should be allocated and the data should only be referenced by pointer. This\n    also means that the memory behind dataptr must not change until the data is\n    ACKed by the remote host\n  - TCP_WRITE_FLAG_MORE: indicates that more data follows. If this is omitted,\n    the PSH flag is set in the last segment created by this call to tcp_write.\n    If this flag is given, the PSH flag is not set.\n\n  The tcp_write() function will fail and return ERR_MEM if the length\n  of the data exceeds the current send buffer size or if the length of\n  the queue of outgoing segment is larger than the upper limit defined\n  in lwipopts.h. The number of bytes available in the output queue can\n  be retrieved with the tcp_sndbuf() function.\n\n  The proper way to use this function is to call the function with at\n  most tcp_sndbuf() bytes of data. If the function returns ERR_MEM,\n  the application should wait until some of the currently enqueued\n  data has been successfully received by the other host and try again.\n\n- void tcp_sent(struct tcp_pcb *pcb,\n                err_t (* sent)(void *arg, struct tcp_pcb *tpcb,\n                u16_t len))\n\n  Specifies the callback function that should be called when data has\n  successfully been received (i.e., acknowledged) by the remote\n  host. The len argument passed to the callback function gives the\n  amount bytes that was acknowledged by the last acknowledgment.\n\n  \n--- Receiving TCP data\n\nTCP data reception is callback based - an application specified\ncallback function is called when new data arrives. When the\napplication has taken the data, it has to call the tcp_recved()\nfunction to indicate that TCP can advertise increase the receive\nwindow.\n\n- void tcp_recv(struct tcp_pcb *pcb,\n                err_t (* recv)(void *arg, struct tcp_pcb *tpcb,\n                               struct pbuf *p, err_t err))\n\n  Sets the callback function that will be called when new data\n  arrives. The callback function will be passed a NULL pbuf to\n  indicate that the remote host has closed the connection. If\n  there are no errors and the callback function is to return\n  ERR_OK, then it must free the pbuf. Otherwise, it must not\n  free the pbuf so that lwIP core code can store it.\n\n- void tcp_recved(struct tcp_pcb *pcb, u16_t len)\n\n  Must be called when the application has received the data. The len\n  argument indicates the length of the received data.\n\n\n--- Application polling\n\nWhen a connection is idle (i.e., no data is either transmitted or\nreceived), lwIP will repeatedly poll the application by calling a\nspecified callback function. This can be used either as a watchdog\ntimer for killing connections that have stayed idle for too long, or\nas a method of waiting for memory to become available. For instance,\nif a call to tcp_write() has failed because memory wasn't available,\nthe application may use the polling functionality to call tcp_write()\nagain when the connection has been idle for a while.\n\n- void tcp_poll(struct tcp_pcb *pcb, \n                err_t (* poll)(void *arg, struct tcp_pcb *tpcb),\n                u8_t interval)\n\n  Specifies the polling interval and the callback function that should\n  be called to poll the application. The interval is specified in\n  number of TCP coarse grained timer shots, which typically occurs\n  twice a second. An interval of 10 means that the application would\n  be polled every 5 seconds.\n\n\n--- Closing and aborting connections\n\n- err_t tcp_close(struct tcp_pcb *pcb)\n\n  Closes the connection. The function may return ERR_MEM if no memory\n  was available for closing the connection. If so, the application\n  should wait and try again either by using the acknowledgment\n  callback or the polling functionality. If the close succeeds, the\n  function returns ERR_OK.\n\n  The pcb is deallocated by the TCP code after a call to tcp_close(). \n\n- void tcp_abort(struct tcp_pcb *pcb)\n\n  Aborts the connection by sending a RST (reset) segment to the remote\n  host. The pcb is deallocated. This function never fails.\n\n  ATTENTION: When calling this from one of the TCP callbacks, make\n  sure you always return ERR_ABRT (and never return ERR_ABRT otherwise\n  or you will risk accessing deallocated memory or memory leaks!\n\n\nIf a connection is aborted because of an error, the application is\nalerted of this event by the err callback. Errors that might abort a\nconnection are when there is a shortage of memory. The callback\nfunction to be called is set using the tcp_err() function.\n\n- void tcp_err(struct tcp_pcb *pcb, void (* err)(void *arg,\n       err_t err))\n\n  The error callback function does not get the pcb passed to it as a\n  parameter since the pcb may already have been deallocated.\n\n\n--- UDP interface\n\nThe UDP interface is similar to that of TCP, but due to the lower\nlevel of complexity of UDP, the interface is significantly simpler.\n\n- struct udp_pcb *udp_new(void)\n\n  Creates a new UDP pcb which can be used for UDP communication. The\n  pcb is not active until it has either been bound to a local address\n  or connected to a remote address.\n\n- void udp_remove(struct udp_pcb *pcb)\n\n  Removes and deallocates the pcb.  \n  \n- err_t udp_bind(struct udp_pcb *pcb, ip_addr_t *ipaddr,\n                 u16_t port)\n\n  Binds the pcb to a local address. The IP-address argument \"ipaddr\"\n  can be IP_ADDR_ANY to indicate that it should listen to any local IP\n  address. The function currently always return ERR_OK.\n\n- err_t udp_connect(struct udp_pcb *pcb, ip_addr_t *ipaddr,\n                    u16_t port)\n\n  Sets the remote end of the pcb. This function does not generate any\n  network traffic, but only set the remote address of the pcb.\n\n- err_t udp_disconnect(struct udp_pcb *pcb)\n\n  Remove the remote end of the pcb. This function does not generate\n  any network traffic, but only removes the remote address of the pcb.\n\n- err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)\n\n  Sends the pbuf p. The pbuf is not deallocated.\n\n- void udp_recv(struct udp_pcb *pcb,\n                void (* recv)(void *arg, struct udp_pcb *upcb,\n                                         struct pbuf *p,\n                                         ip_addr_t *addr,\n                                         u16_t port),\n                              void *recv_arg)\n\n  Specifies a callback function that should be called when a UDP\n  datagram is received.\n  \n\n--- System initalization\n\nA truly complete and generic sequence for initializing the lwIP stack\ncannot be given because it depends on additional initializations for\nyour runtime environment (e.g. timers).\n\nWe can give you some idea on how to proceed when using the raw API.\nWe assume a configuration using a single Ethernet netif and the\nUDP and TCP transport layers, IPv4 and the DHCP client.\n\nCall these functions in the order of appearance:\n\n- lwip_init()\n\n  Initialize the lwIP stack and all of its subsystems.\n\n- netif_add(struct netif *netif, const ip4_addr_t *ipaddr,\n            const ip4_addr_t *netmask, const ip4_addr_t *gw,\n            void *state, netif_init_fn init, netif_input_fn input)\n\n  Adds your network interface to the netif_list. Allocate a struct\n  netif and pass a pointer to this structure as the first argument.\n  Give pointers to cleared ip_addr structures when using DHCP,\n  or fill them with sane numbers otherwise. The state pointer may be NULL.\n\n  The init function pointer must point to a initialization function for\n  your Ethernet netif interface. The following code illustrates its use.\n  \n  err_t netif_if_init(struct netif *netif)\n  {\n    u8_t i;\n    \n    for (i = 0; i < ETHARP_HWADDR_LEN; i++) {\n      netif->hwaddr[i] = some_eth_addr[i];\n    }\n    init_my_eth_device();\n    return ERR_OK;\n  }\n  \n  For Ethernet drivers, the input function pointer must point to the lwIP\n  function ethernet_input() declared in \"netif/etharp.h\". Other drivers\n  must use ip_input() declared in \"lwip/ip.h\".\n  \n- netif_set_default(struct netif *netif)\n\n  Registers the default network interface.\n\n- netif_set_link_up(struct netif *netif)\n\n  This is the hardware link state; e.g. whether cable is plugged for wired\n  Ethernet interface. This function must be called even if you don't know\n  the current state. Having link up and link down events is optional but\n  DHCP and IPv6 discover benefit well from those events.\n\n- netif_set_up(struct netif *netif)\n\n  This is the administrative (= software) state of the netif, when the\n  netif is fully configured this function must be called.\n\n- dhcp_start(struct netif *netif)\n\n  Creates a new DHCP client for this interface on the first call.\n  \n  You can peek in the netif->dhcp struct for the actual DHCP status.\n\n- sys_check_timeouts()\n\n  When the system is running, you have to periodically call\n  sys_check_timeouts() which will handle all timers for all protocols in\n  the stack; add this to your main loop or equivalent.\n\n\n--- Optimalization hints\n\nThe first thing you want to optimize is the lwip_standard_checksum()\nroutine from src/core/inet.c. You can override this standard\nfunction with the #define LWIP_CHKSUM <your_checksum_routine>.\n\nThere are C examples given in inet.c or you might want to\ncraft an assembly function for this. RFC1071 is a good\nintroduction to this subject.\n\nOther significant improvements can be made by supplying\nassembly or inline replacements for htons() and htonl()\nif you're using a little-endian architecture.\n#define lwip_htons(x) <your_htons>\n#define lwip_htonl(x) <your_htonl>\nIf you #define them to htons() and htonl(), you should\n#define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS to prevent lwIP from\ndefining hton*/ntoh* compatibility macros.\n\nCheck your network interface driver if it reads at\na higher speed than the maximum wire-speed. If the\nhardware isn't serviced frequently and fast enough\nbuffer overflows are likely to occur.\n\nE.g. when using the cs8900 driver, call cs8900if_service(ethif)\nas frequently as possible. When using an RTOS let the cs8900 interrupt\nwake a high priority task that services your driver using a binary\nsemaphore or event flag. Some drivers might allow additional tuning\nto match your application and network.\n\nFor a production release it is recommended to set LWIP_STATS to 0.\nNote that speed performance isn't influenced much by simply setting\nhigh values to the memory options.\n\nFor more optimization hints take a look at the lwIP wiki.\n\n--- Zero-copy MACs\n\nTo achieve zero-copy on transmit, the data passed to the raw API must\nremain unchanged until sent. Because the send- (or write-)functions return\nwhen the packets have been enqueued for sending, data must be kept stable\nafter that, too.\n\nThis implies that PBUF_RAM/PBUF_POOL pbufs passed to raw-API send functions\nmust *not* be reused by the application unless their ref-count is 1.\n\nFor no-copy pbufs (PBUF_ROM/PBUF_REF), data must be kept unchanged, too,\nbut the stack/driver will/must copy PBUF_REF'ed data when enqueueing, while\nPBUF_ROM-pbufs are just enqueued (as ROM-data is expected to never change).\n\nAlso, data passed to tcp_write without the copy-flag must not be changed!\n\nTherefore, be careful which type of PBUF you use and if you copy TCP data\nor not!\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/savannah.txt",
    "content": "Daily Use Guide for using Savannah for lwIP\n\nTable of Contents:\n\n1 - Obtaining lwIP from the Git repository\n2 - Committers/developers Git access using SSH\n3 - Merging a development branch to master branch\n4 - How to release lwIP\n\n\n\n1 Obtaining lwIP from the Git repository\n----------------------------------------\n\nTo perform an anonymous Git clone of the master branch (this is where\nbug fixes and incremental enhancements occur), do this:\n git clone git://git.savannah.nongnu.org/lwip.git\n\nOr, obtain a stable branch (updated with bug fixes only) as follows:\n git clone --branch DEVEL-1_4_1 git://git.savannah.nongnu.org/lwip.git\n\nOr, obtain a specific (fixed) release as follows:\n git clone --branch STABLE-1_4_1 git://git.savannah.nongnu.org/lwip.git\n\n\n2 Committers/developers Git access using SSH\n--------------------------------------------\n\nThe Savannah server uses SSH (Secure Shell) protocol 2 authentication and encryption.\nAs such, Git commits to the server occur through a SSH tunnel for project members.\nTo create a SSH2 key pair in UNIX-like environments, do this:\n ssh-keygen -t dsa\n\nUnder Windows, a recommended SSH client is \"PuTTY\", freely available with good\ndocumentation and a graphic user interface. Use its key generator.\n\nNow paste the id_dsa.pub contents into your Savannah account public key list. Wait\na while so that Savannah can update its configuration (This can take minutes).\n\nTry to login using SSH:\n ssh -v your_login@git.sv.gnu.org\n\nIf it tells you:\n Linux vcs.savannah.gnu.org 2.6.32-5-xen-686 #1 SMP Wed Jun 17 17:10:03 UTC 2015 i686\n\n Interactive shell login is not possible for security reasons.\n VCS commands are allowed.\n Last login: Tue May 15 23:10:12 2012 from 82.245.102.129\n You tried to execute:\n Sorry, you are not allowed to execute that command.\n Shared connection to git.sv.gnu.org closed.\n\nthen you could login; Savannah refuses to give you a shell - which is OK, as we\nare allowed to use SSH for Git only. Now, you should be able to do this:\n git clone your_login@git.sv.gnu.org:/srv/git/lwip.git\n\nAfter which you can edit your local files with bug fixes or new features and\ncommit them. Make sure you know what you are doing when using Git to make\nchanges on the repository. If in doubt, ask on the lwip-members mailing list.\n\n(If SSH asks about authenticity of the host, you can check the key\nfingerprint against https://savannah.nongnu.org/git/?group=lwip\n\n\n3 - Merging a development branch to master branch\n-------------------------------------------------\n\nMerging is a straightforward process in Git. How to merge all changes in a\ndevelopment branch since our last merge from main:\n\nCheckout the master branch:\n git checkout master\n\nMerge the development branch to master:\n git merge your-development-branch\n\nResolve any conflict.\n\nCommit the merge result.\n git commit -a\n\nPush your commits:\n git push\n\n\n4 How to release lwIP\n---------------------\n\nFirst, tag the release using Git: (I use release number 1.4.1 throughout\nthis example).\n git tag -a STABLE-1_4_1\n\nShare the tag reference by pushing it to remote:\n git push origin STABLE-1_4_1\n\nPrepare the release:\n cp -r lwip lwip-1.4.1\n rm -rf lwip-1.4.1/.git lwip-1.4.1/.gitattributes\n\nArchive the current directory using tar, gzip'd, bzip2'd and zip'd.\n tar czvf lwip-1.4.1.tar.gz lwip-1.4.1\n tar cjvf lwip-1.4.1.tar.bz2 lwip-1.4.1\n zip -r lwip-1.4.1.zip lwip-1.4.1\n\nNow, sign the archives with a detached GPG binary signature as follows:\n gpg -b lwip-1.4.1.tar.gz\n gpg -b lwip-1.4.1.tar.bz2\n gpg -b lwip-1.4.1.zip\n\nUpload these files using anonymous FTP:\n ncftp ftp://savannah.gnu.org/incoming/savannah/lwip\n ncftp> mput *1.4.1.*\n\nAdditionally, you may post a news item on Savannah, like this:\n\nA new 1.4.1 release is now available here:\nhttp://savannah.nongnu.org/files/?group=lwip&highlight=1.4.1\n\nYou will have to submit this via the user News interface, then approve\nthis via the Administrator News interface.\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/doc/sys_arch.txt",
    "content": "sys_arch interface for lwIP\n\nAuthor: Adam Dunkels\n        Simon Goldschmidt\n\nThe operating system emulation layer provides a common interface\nbetween the lwIP code and the underlying operating system kernel. The\ngeneral idea is that porting lwIP to new architectures requires only\nsmall changes to a few header files and a new sys_arch\nimplementation. It is also possible to do a sys_arch implementation\nthat does not rely on any underlying operating system.\n\nThe sys_arch provides semaphores, mailboxes and mutexes to lwIP. For the full\nlwIP functionality, multiple threads support can be implemented in the\nsys_arch, but this is not required for the basic lwIP\nfunctionality. Timer scheduling is implemented in lwIP, but can be implemented\nby the sys_arch port (LWIP_TIMERS_CUSTOM==1).\n\nIn addition to the source file providing the functionality of sys_arch,\nthe OS emulation layer must provide several header files defining\nmacros used throughout lwip.  The files required and the macros they\nmust define are listed below the sys_arch description.\n\nSemaphores can be either counting or binary - lwIP works with both\nkinds. Mailboxes should be implemented as a queue which allows multiple messages\nto be posted (implementing as a rendez-vous point where only one message can be\nposted at a time can have a highly negative impact on performance). A message\nin a mailbox is just a pointer, nothing more. \n\nSemaphores are represented by the type \"sys_sem_t\" which is typedef'd\nin the sys_arch.h file. Mailboxes are equivalently represented by the\ntype \"sys_mbox_t\". Mutexes are represented by the type \"sys_mutex_t\".\nlwIP does not place any restrictions on how these types are represented\ninternally.\n\nSince lwIP 1.4.0, semaphore, mutexes and mailbox functions are prototyped in a way that\nallows both using pointers or actual OS structures to be used. This way, memory\nrequired for such types can be either allocated in place (globally or on the\nstack) or on the heap (allocated internally in the \"*_new()\" functions).\n\nThe following functions must be implemented by the sys_arch:\n\n- void sys_init(void)\n\n  Is called to initialize the sys_arch layer.\n\n- err_t sys_sem_new(sys_sem_t *sem, u8_t count)\n\n  Creates a new semaphore. The semaphore is allocated to the memory that 'sem'\n  points to (which can be both a pointer or the actual OS structure).\n  The \"count\" argument specifies the initial state of the semaphore (which is\n  either 0 or 1).\n  If the semaphore has been created, ERR_OK should be returned. Returning any\n  other error will provide a hint what went wrong, but except for assertions,\n  no real error handling is implemented.\n\n- void sys_sem_free(sys_sem_t *sem)\n\n  Deallocates a semaphore.\n\n- void sys_sem_signal(sys_sem_t *sem)\n\n  Signals a semaphore.\n\n- u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)\n\n  Blocks the thread while waiting for the semaphore to be\n  signaled. If the \"timeout\" argument is non-zero, the thread should\n  only be blocked for the specified time (measured in\n  milliseconds). If the \"timeout\" argument is zero, the thread should be\n  blocked until the semaphore is signalled.\n\n  If the timeout argument is non-zero, the return value is the number of\n  milliseconds spent waiting for the semaphore to be signaled. If the\n  semaphore wasn't signaled within the specified time, the return value is\n  SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore\n  (i.e., it was already signaled), the function may return zero.\n\n  Notice that lwIP implements a function with a similar name,\n  sys_sem_wait(), that uses the sys_arch_sem_wait() function.\n\n- int sys_sem_valid(sys_sem_t *sem)\n\n  Returns 1 if the semaphore is valid, 0 if it is not valid.\n  When using pointers, a simple way is to check the pointer for != NULL.\n  When directly using OS structures, implementing this may be more complex.\n  This may also be a define, in which case the function is not prototyped.\n\n- void sys_sem_set_invalid(sys_sem_t *sem)\n\n  Invalidate a semaphore so that sys_sem_valid() returns 0.\n  ATTENTION: This does NOT mean that the semaphore shall be deallocated:\n  sys_sem_free() is always called before calling this function!\n  This may also be a define, in which case the function is not prototyped.\n\n- void sys_mutex_new(sys_mutex_t *mutex)\n\n  Creates a new mutex. The mutex is allocated to the memory that 'mutex'\n  points to (which can be both a pointer or the actual OS structure).\n  If the mutex has been created, ERR_OK should be returned. Returning any\n  other error will provide a hint what went wrong, but except for assertions,\n  no real error handling is implemented.\n\n- void sys_mutex_free(sys_mutex_t *mutex)\n\n  Deallocates a mutex.\n\n- void sys_mutex_lock(sys_mutex_t *mutex)\n  \n  Blocks the thread until the mutex can be grabbed.\n\n- void sys_mutex_unlock(sys_mutex_t *mutex)\n\n  Releases the mutex previously locked through 'sys_mutex_lock()'.\n\n- void sys_mutex_valid(sys_mutex_t *mutex)\n\n  Returns 1 if the mutes is valid, 0 if it is not valid.\n  When using pointers, a simple way is to check the pointer for != NULL.\n  When directly using OS structures, implementing this may be more complex.\n  This may also be a define, in which case the function is not prototyped.\n\n- void sys_mutex_set_invalid(sys_mutex_t *mutex)\n\n  Invalidate a mutex so that sys_mutex_valid() returns 0.\n  ATTENTION: This does NOT mean that the mutex shall be deallocated:\n  sys_mutex_free() is always called before calling this function!\n  This may also be a define, in which case the function is not prototyped.\n\n- err_t sys_mbox_new(sys_mbox_t *mbox, int size)\n\n  Creates an empty mailbox for maximum \"size\" elements. Elements stored\n  in mailboxes are pointers. You have to define macros \"_MBOX_SIZE\"\n  in your lwipopts.h, or ignore this parameter in your implementation\n  and use a default size.\n  If the mailbox has been created, ERR_OK should be returned. Returning any\n  other error will provide a hint what went wrong, but except for assertions,\n  no real error handling is implemented.\n\n- void sys_mbox_free(sys_mbox_t *mbox)\n\n  Deallocates a mailbox. If there are messages still present in the\n  mailbox when the mailbox is deallocated, it is an indication of a\n  programming error in lwIP and the developer should be notified.\n\n- void sys_mbox_post(sys_mbox_t *mbox, void *msg)\n\n  Posts the \"msg\" to the mailbox. This function have to block until\n  the \"msg\" is really posted.\n\n- err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)\n\n  Try to post the \"msg\" to the mailbox. Returns ERR_MEM if this one\n  is full, else, ERR_OK if the \"msg\" is posted.\n\n- u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout)\n\n  Blocks the thread until a message arrives in the mailbox, but does\n  not block the thread longer than \"timeout\" milliseconds (similar to\n  the sys_arch_sem_wait() function). If \"timeout\" is 0, the thread should\n  be blocked until a message arrives. The \"msg\" argument is a result\n  parameter that is set by the function (i.e., by doing \"*msg =\n  ptr\"). The \"msg\" parameter maybe NULL to indicate that the message\n  should be dropped.\n\n  The return values are the same as for the sys_arch_sem_wait() function:\n  Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a\n  timeout.\n\n  Note that a function with a similar name, sys_mbox_fetch(), is\n  implemented by lwIP. \n\n- u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg)\n\n  This is similar to sys_arch_mbox_fetch, however if a message is not\n  present in the mailbox, it immediately returns with the code\n  SYS_MBOX_EMPTY. On success 0 is returned.\n\n  To allow for efficient implementations, this can be defined as a\n  function-like macro in sys_arch.h instead of a normal function. For\n  example, a naive implementation could be:\n    #define sys_arch_mbox_tryfetch(mbox,msg) \\\n      sys_arch_mbox_fetch(mbox,msg,1)\n  although this would introduce unnecessary delays.\n\n- int sys_mbox_valid(sys_mbox_t *mbox)\n\n  Returns 1 if the mailbox is valid, 0 if it is not valid.\n  When using pointers, a simple way is to check the pointer for != NULL.\n  When directly using OS structures, implementing this may be more complex.\n  This may also be a define, in which case the function is not prototyped.\n\n- void sys_mbox_set_invalid(sys_mbox_t *mbox)\n\n  Invalidate a mailbox so that sys_mbox_valid() returns 0.\n  ATTENTION: This does NOT mean that the mailbox shall be deallocated:\n  sys_mbox_free() is always called before calling this function!\n  This may also be a define, in which case the function is not prototyped.\n\nIf threads are supported by the underlying operating system and if\nsuch functionality is needed in lwIP, the following function will have\nto be implemented as well:\n\n- sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio)\n\n  Starts a new thread named \"name\" with priority \"prio\" that will begin its\n  execution in the function \"thread()\". The \"arg\" argument will be passed as an\n  argument to the thread() function. The stack size to used for this thread is\n  the \"stacksize\" parameter. The id of the new thread is returned. Both the id\n  and the priority are system dependent.\n\nWhen lwIP is used from more than one context (e.g. from multiple threads OR from\nmain-loop and from interrupts), the SYS_LIGHTWEIGHT_PROT protection SHOULD be enabled!\n\n- sys_prot_t sys_arch_protect(void)\n\n  This optional function does a \"fast\" critical region protection and returns\n  the previous protection level. This function is only called during very short\n  critical regions. An embedded system which supports ISR-based drivers might\n  want to implement this function by disabling interrupts. Task-based systems\n  might want to implement this by using a mutex or disabling tasking. This\n  function should support recursive calls from the same task or interrupt. In\n  other words, sys_arch_protect() could be called while already protected. In\n  that case the return value indicates that it is already protected.\n\n  sys_arch_protect() is only required if your port is supporting an operating\n  system.\n\n- void sys_arch_unprotect(sys_prot_t pval)\n\n  This optional function does a \"fast\" set of critical region protection to the\n  value specified by pval. See the documentation for sys_arch_protect() for\n  more information. This function is only required if your port is supporting\n  an operating system.\n\nFor some configurations, you also need:\n\n- u32_t sys_now(void)\n\n  This optional function returns the current time in milliseconds (don't care\n  for wraparound, this is only used for time diffs).\n  Not implementing this function means you cannot use some modules (e.g. TCP\n  timestamps, internal timeouts for NO_SYS==1).\n\n\nNote:\n\nBe careful with using mem_malloc() in sys_arch. When malloc() refers to\nmem_malloc() you can run into a circular function call problem. In mem.c\nmem_init() tries to allcate a semaphore using mem_malloc, which of course\ncan't be performed when sys_arch uses mem_malloc.\n\n-------------------------------------------------------------------------------\nAdditional files required for the \"OS support\" emulation layer:\n-------------------------------------------------------------------------------\n\ncc.h       - Architecture environment, some compiler specific, some\n             environment specific (probably should move env stuff \n             to sys_arch.h.)\n\n  Typedefs for the types used by lwip -\n    u8_t, s8_t, u16_t, s16_t, u32_t, s32_t, mem_ptr_t\n\n  Compiler hints for packing lwip's structures -\n    PACK_STRUCT_FIELD(x)\n    PACK_STRUCT_STRUCT\n    PACK_STRUCT_BEGIN\n    PACK_STRUCT_END\n\n  Platform specific diagnostic output -\n    LWIP_PLATFORM_DIAG(x)    - non-fatal, print a message.\n    LWIP_PLATFORM_ASSERT(x)  - fatal, print message and abandon execution.\n    Portability defines for printf formatters:\n    U16_F, S16_F, X16_F, U32_F, S32_F, X32_F, SZT_F\n\n  \"lightweight\" synchronization mechanisms -\n    SYS_ARCH_DECL_PROTECT(x) - declare a protection state variable.\n    SYS_ARCH_PROTECT(x)      - enter protection mode.\n    SYS_ARCH_UNPROTECT(x)    - leave protection mode.\n\n  If the compiler does not provide memset() this file must include a\n  definition of it, or include a file which defines it.\n\n  This file must either include a system-local <errno.h> which defines\n  the standard *nix error codes, or it should #define LWIP_PROVIDE_ERRNO\n  to make lwip/arch.h define the codes which are used throughout.\n\n\nperf.h     - Architecture specific performance measurement.\n  Measurement calls made throughout lwip, these can be defined to nothing.\n    PERF_START               - start measuring something.\n    PERF_STOP(x)             - stop measuring something, and record the result.\n\nsys_arch.h - Tied to sys_arch.c\n\n  Arch dependent types for the following objects:\n    sys_sem_t, sys_mbox_t, sys_thread_t,\n  And, optionally:\n    sys_prot_t\n\n  Defines to set vars of sys_mbox_t and sys_sem_t to NULL.\n    SYS_MBOX_NULL NULL\n    SYS_SEM_NULL NULL\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/FILES",
    "content": "api/      - The code for the high-level wrapper API. Not needed if\n            you use the lowel-level call-back/raw API.\n\napps/     - Higher layer applications that are specifically programmed\n            with the lwIP low-level raw API.\n\ncore/     - The core of the TPC/IP stack; protocol implementations,\n            memory and buffer management, and the low-level raw API.\n\ninclude/  - lwIP include files.\n\nnetif/    - Generic network interface device drivers are kept here.\n\nFor more information on the various subdirectories, check the FILES\nfile in each directory.\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/Filelists.mk",
    "content": "#\n# Copyright (c) 2001, 2002 Swedish Institute of Computer Science.\n# All rights reserved. \n# \n# Redistribution and use in source and binary forms, with or without modification, \n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice,\n#    this list of conditions and the following disclaimer.\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n#    this list of conditions and the following disclaimer in the documentation\n#    and/or other materials provided with the distribution.\n# 3. The name of the author may not be used to endorse or promote products\n#    derived from this software without specific prior written permission. \n#\n# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n# SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n# OF SUCH DAMAGE.\n#\n# This file is part of the lwIP TCP/IP stack.\n# \n# Author: Adam Dunkels <adam@sics.se>\n#\n\n# COREFILES, CORE4FILES: The minimum set of files needed for lwIP.\nCOREFILES=$(LWIPDIR)/core/init.c \\\n\t$(LWIPDIR)/core/def.c \\\n\t$(LWIPDIR)/core/dns.c \\\n\t$(LWIPDIR)/core/inet_chksum.c \\\n\t$(LWIPDIR)/core/ip.c \\\n\t$(LWIPDIR)/core/mem.c \\\n\t$(LWIPDIR)/core/memp.c \\\n\t$(LWIPDIR)/core/netif.c \\\n\t$(LWIPDIR)/core/pbuf.c \\\n\t$(LWIPDIR)/core/raw.c \\\n\t$(LWIPDIR)/core/stats.c \\\n\t$(LWIPDIR)/core/sys.c \\\n\t$(LWIPDIR)/core/tcp.c \\\n\t$(LWIPDIR)/core/tcp_in.c \\\n\t$(LWIPDIR)/core/tcp_out.c \\\n\t$(LWIPDIR)/core/timeouts.c \\\n\t$(LWIPDIR)/core/udp.c\n\nCORE4FILES=$(LWIPDIR)/core/ipv4/autoip.c \\\n\t$(LWIPDIR)/core/ipv4/dhcp.c \\\n\t$(LWIPDIR)/core/ipv4/etharp.c \\\n\t$(LWIPDIR)/core/ipv4/icmp.c \\\n\t$(LWIPDIR)/core/ipv4/igmp.c \\\n\t$(LWIPDIR)/core/ipv4/ip4_frag.c \\\n\t$(LWIPDIR)/core/ipv4/ip4.c \\\n\t$(LWIPDIR)/core/ipv4/ip4_addr.c\n\nCORE6FILES=$(LWIPDIR)/core/ipv6/dhcp6.c \\\n\t$(LWIPDIR)/core/ipv6/ethip6.c \\\n\t$(LWIPDIR)/core/ipv6/icmp6.c \\\n\t$(LWIPDIR)/core/ipv6/inet6.c \\\n\t$(LWIPDIR)/core/ipv6/ip6.c \\\n\t$(LWIPDIR)/core/ipv6/ip6_addr.c \\\n\t$(LWIPDIR)/core/ipv6/ip6_frag.c \\\n\t$(LWIPDIR)/core/ipv6/mld6.c \\\n\t$(LWIPDIR)/core/ipv6/nd6.c\n\n# APIFILES: The files which implement the sequential and socket APIs.\nAPIFILES=$(LWIPDIR)/api/api_lib.c \\\n\t$(LWIPDIR)/api/api_msg.c \\\n\t$(LWIPDIR)/api/err.c \\\n\t$(LWIPDIR)/api/netbuf.c \\\n\t$(LWIPDIR)/api/netdb.c \\\n\t$(LWIPDIR)/api/netifapi.c \\\n\t$(LWIPDIR)/api/sockets.c \\\n\t$(LWIPDIR)/api/tcpip.c\n\n# NETIFFILES: Files implementing various generic network interface functions\nNETIFFILES=$(LWIPDIR)/netif/ethernet.c \\\n\t$(LWIPDIR)/netif/slipif.c\n\n# SIXLOWPAN: 6LoWPAN\nSIXLOWPAN=$(LWIPDIR)/netif/lowpan6.c \\\n\n# PPPFILES: PPP\nPPPFILES=$(LWIPDIR)/netif/ppp/auth.c \\\n\t$(LWIPDIR)/netif/ppp/ccp.c \\\n\t$(LWIPDIR)/netif/ppp/chap-md5.c \\\n\t$(LWIPDIR)/netif/ppp/chap_ms.c \\\n\t$(LWIPDIR)/netif/ppp/chap-new.c \\\n\t$(LWIPDIR)/netif/ppp/demand.c \\\n\t$(LWIPDIR)/netif/ppp/eap.c \\\n\t$(LWIPDIR)/netif/ppp/ecp.c \\\n\t$(LWIPDIR)/netif/ppp/eui64.c \\\n\t$(LWIPDIR)/netif/ppp/fsm.c \\\n\t$(LWIPDIR)/netif/ppp/ipcp.c \\\n\t$(LWIPDIR)/netif/ppp/ipv6cp.c \\\n\t$(LWIPDIR)/netif/ppp/lcp.c \\\n\t$(LWIPDIR)/netif/ppp/magic.c \\\n\t$(LWIPDIR)/netif/ppp/mppe.c \\\n\t$(LWIPDIR)/netif/ppp/multilink.c \\\n\t$(LWIPDIR)/netif/ppp/ppp.c \\\n\t$(LWIPDIR)/netif/ppp/pppapi.c \\\n\t$(LWIPDIR)/netif/ppp/pppcrypt.c \\\n\t$(LWIPDIR)/netif/ppp/pppoe.c \\\n\t$(LWIPDIR)/netif/ppp/pppol2tp.c \\\n\t$(LWIPDIR)/netif/ppp/pppos.c \\\n\t$(LWIPDIR)/netif/ppp/upap.c \\\n\t$(LWIPDIR)/netif/ppp/utils.c \\\n\t$(LWIPDIR)/netif/ppp/vj.c \\\n\t$(LWIPDIR)/netif/ppp/polarssl/arc4.c \\\n\t$(LWIPDIR)/netif/ppp/polarssl/des.c \\\n\t$(LWIPDIR)/netif/ppp/polarssl/md4.c \\\n\t$(LWIPDIR)/netif/ppp/polarssl/md5.c \\\n\t$(LWIPDIR)/netif/ppp/polarssl/sha1.c\n\n# LWIPNOAPPSFILES: All LWIP files without apps\nLWIPNOAPPSFILES=$(COREFILES) \\\n\t$(CORE4FILES) \\\n\t$(CORE6FILES) \\\n\t$(APIFILES) \\\n\t$(NETIFFILES) \\\n\t$(PPPFILES) \\\n\t$(SIXLOWPAN)\n\n# SNMPFILES: SNMPv2c agent\nSNMPFILES=$(LWIPDIR)/apps/snmp/snmp_asn1.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_core.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_mib2.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_mib2_icmp.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_mib2_interfaces.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_mib2_ip.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_mib2_snmp.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_mib2_system.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_mib2_tcp.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_mib2_udp.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_msg.c \\\n\t$(LWIPDIR)/apps/snmp/snmpv3.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_netconn.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_pbuf_stream.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_raw.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_scalar.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_table.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_threadsync.c \\\n\t$(LWIPDIR)/apps/snmp/snmp_traps.c \\\n\t$(LWIPDIR)/apps/snmp/snmpv3_mbedtls.c \\\n\t$(LWIPDIR)/apps/snmp/snmpv3_dummy.c\n\n# HTTPDFILES: HTTP server\nHTTPDFILES=$(LWIPDIR)/apps/httpd/fs.c \\\n\t$(LWIPDIR)/apps/httpd/httpd.c\n\n# LWIPERFFILES: IPERF server\nLWIPERFFILES=$(LWIPDIR)/apps/lwiperf/lwiperf.c\n\n# SNTPFILES: SNTP client\nSNTPFILES=$(LWIPDIR)/apps/sntp/sntp.c\n\n# MDNSFILES: MDNS responder\nMDNSFILES=$(LWIPDIR)/apps/mdns/mdns.c\n\n# NETBIOSNSFILES: NetBIOS name server\nNETBIOSNSFILES=$(LWIPDIR)/apps/netbiosns/netbiosns.c\n\n# TFTPFILES: TFTP server files\nTFTPFILES=$(LWIPDIR)/apps/tftp/tftp_server.c\n\n# MQTTFILES: MQTT client files\nMQTTFILES=$(LWIPDIR)/apps/mqtt/mqtt.c\n\n# LWIPAPPFILES: All LWIP APPs\nLWIPAPPFILES=$(SNMPFILES) \\\n\t$(HTTPDFILES) \\\n\t$(LWIPERFFILES) \\\n\t$(SNTPFILES) \\\n\t$(MDNSFILES) \\\n\t$(NETBIOSNSFILES) \\\n\t$(TFTPFILES) \\\n\t$(MQTTFILES)\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/api/api_lib.c",
    "content": "/**\n * @file\n * Sequential API External module\n * \n * @defgroup netconn Netconn API\n * @ingroup sequential_api\n * Thread-safe, to be called from non-TCPIP threads only.\n * TX/RX handling based on @ref netbuf (containing @ref pbuf)\n * to avoid copying data around.\n * \n * @defgroup netconn_common Common functions\n * @ingroup netconn\n * For use with TCP and UDP\n * \n * @defgroup netconn_tcp TCP only\n * @ingroup netconn\n * TCP only functions\n * \n * @defgroup netconn_udp UDP only\n * @ingroup netconn\n * UDP only functions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n */\n\n/* This is the part of the API that is linked with\n   the application */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/api.h\"\n#include \"lwip/memp.h\"\n\n#include \"lwip/ip.h\"\n#include \"lwip/raw.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/priv/api_msg.h\"\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n\n#include <string.h>\n\n#define API_MSG_VAR_REF(name)               API_VAR_REF(name)\n#define API_MSG_VAR_DECLARE(name)           API_VAR_DECLARE(struct api_msg, name)\n#define API_MSG_VAR_ALLOC(name)             API_VAR_ALLOC(struct api_msg, MEMP_API_MSG, name, ERR_MEM)\n#define API_MSG_VAR_ALLOC_RETURN_NULL(name) API_VAR_ALLOC(struct api_msg, MEMP_API_MSG, name, NULL)\n#define API_MSG_VAR_FREE(name)              API_VAR_FREE(MEMP_API_MSG, name)\n\nstatic err_t netconn_close_shutdown(struct netconn *conn, u8_t how);\n\n/**\n * Call the lower part of a netconn_* function\n * This function is then running in the thread context\n * of tcpip_thread and has exclusive access to lwIP core code.\n *\n * @param fn function to call\n * @param apimsg a struct containing the function to call and its parameters\n * @return ERR_OK if the function was called, another err_t if not\n */\nstatic err_t\nnetconn_apimsg(tcpip_callback_fn fn, struct api_msg *apimsg)\n{\n  err_t err;\n\n#ifdef LWIP_DEBUG\n  /* catch functions that don't set err */\n  apimsg->err = ERR_VAL;\n#endif /* LWIP_DEBUG */\n\n#if LWIP_NETCONN_SEM_PER_THREAD\n  apimsg->op_completed_sem = LWIP_NETCONN_THREAD_SEM_GET();\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n\n  err = tcpip_send_msg_wait_sem(fn, apimsg, LWIP_API_MSG_SEM(apimsg));\n  if (err == ERR_OK) {\n    return apimsg->err;\n  }\n  return err;\n}\n\n/**\n * Create a new netconn (of a specific type) that has a callback function.\n * The corresponding pcb is also created.\n *\n * @param t the type of 'connection' to create (@see enum netconn_type)\n * @param proto the IP protocol for RAW IP pcbs\n * @param callback a function to call on status changes (RX available, TX'ed)\n * @return a newly allocated struct netconn or\n *         NULL on memory error\n */\nstruct netconn*\nnetconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto, netconn_callback callback)\n{\n  struct netconn *conn;\n  API_MSG_VAR_DECLARE(msg);\n  API_MSG_VAR_ALLOC_RETURN_NULL(msg);\n\n  conn = netconn_alloc(t, callback);\n  if (conn != NULL) {\n    err_t err;\n\n    API_MSG_VAR_REF(msg).msg.n.proto = proto;\n    API_MSG_VAR_REF(msg).conn = conn;\n    err = netconn_apimsg(lwip_netconn_do_newconn, &API_MSG_VAR_REF(msg));\n    if (err != ERR_OK) {\n      LWIP_ASSERT(\"freeing conn without freeing pcb\", conn->pcb.tcp == NULL);\n      LWIP_ASSERT(\"conn has no recvmbox\", sys_mbox_valid(&conn->recvmbox));\n#if LWIP_TCP\n      LWIP_ASSERT(\"conn->acceptmbox shouldn't exist\", !sys_mbox_valid(&conn->acceptmbox));\n#endif /* LWIP_TCP */\n#if !LWIP_NETCONN_SEM_PER_THREAD\n      LWIP_ASSERT(\"conn has no op_completed\", sys_sem_valid(&conn->op_completed));\n      sys_sem_free(&conn->op_completed);\n#endif /* !LWIP_NETCONN_SEM_PER_THREAD */\n      sys_mbox_free(&conn->recvmbox);\n      memp_free(MEMP_NETCONN, conn);\n      API_MSG_VAR_FREE(msg);\n      return NULL;\n    }\n  }\n  API_MSG_VAR_FREE(msg);\n  return conn;\n}\n\n/**\n * @ingroup netconn_common\n * Close a netconn 'connection' and free its resources.\n * UDP and RAW connection are completely closed, TCP pcbs might still be in a waitstate\n * after this returns.\n *\n * @param conn the netconn to delete\n * @return ERR_OK if the connection was deleted\n */\nerr_t\nnetconn_delete(struct netconn *conn)\n{\n  err_t err;\n  API_MSG_VAR_DECLARE(msg);\n\n  /* No ASSERT here because possible to get a (conn == NULL) if we got an accept error */\n  if (conn == NULL) {\n    return ERR_OK;\n  }\n\n  API_MSG_VAR_ALLOC(msg);\n  API_MSG_VAR_REF(msg).conn = conn;\n#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER\n  /* get the time we started, which is later compared to\n     sys_now() + conn->send_timeout */\n  API_MSG_VAR_REF(msg).msg.sd.time_started = sys_now();\n#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */\n#if LWIP_TCP\n  API_MSG_VAR_REF(msg).msg.sd.polls_left =\n    ((LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT + TCP_SLOW_INTERVAL - 1) / TCP_SLOW_INTERVAL) + 1;\n#endif /* LWIP_TCP */\n#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */\n  err = netconn_apimsg(lwip_netconn_do_delconn, &API_MSG_VAR_REF(msg));\n  API_MSG_VAR_FREE(msg);\n\n  if (err != ERR_OK) {\n    return err;\n  }\n\n  netconn_free(conn);\n\n  return ERR_OK;\n}\n\n/**\n * Get the local or remote IP address and port of a netconn.\n * For RAW netconns, this returns the protocol instead of a port!\n *\n * @param conn the netconn to query\n * @param addr a pointer to which to save the IP address\n * @param port a pointer to which to save the port (or protocol for RAW)\n * @param local 1 to get the local IP address, 0 to get the remote one\n * @return ERR_CONN for invalid connections\n *         ERR_OK if the information was retrieved\n */\nerr_t\nnetconn_getaddr(struct netconn *conn, ip_addr_t *addr, u16_t *port, u8_t local)\n{\n  API_MSG_VAR_DECLARE(msg);\n  err_t err;\n\n  LWIP_ERROR(\"netconn_getaddr: invalid conn\", (conn != NULL), return ERR_ARG;);\n  LWIP_ERROR(\"netconn_getaddr: invalid addr\", (addr != NULL), return ERR_ARG;);\n  LWIP_ERROR(\"netconn_getaddr: invalid port\", (port != NULL), return ERR_ARG;);\n\n  API_MSG_VAR_ALLOC(msg);\n  API_MSG_VAR_REF(msg).conn = conn;\n  API_MSG_VAR_REF(msg).msg.ad.local = local;\n#if LWIP_MPU_COMPATIBLE\n  err = netconn_apimsg(lwip_netconn_do_getaddr, &API_MSG_VAR_REF(msg));\n  *addr = msg->msg.ad.ipaddr;\n  *port = msg->msg.ad.port;\n#else /* LWIP_MPU_COMPATIBLE */\n  msg.msg.ad.ipaddr = addr;\n  msg.msg.ad.port = port;\n  err = netconn_apimsg(lwip_netconn_do_getaddr, &msg);\n#endif /* LWIP_MPU_COMPATIBLE */\n  API_MSG_VAR_FREE(msg);\n\n  return err;\n}\n\n/**\n * @ingroup netconn_common\n * Bind a netconn to a specific local IP address and port.\n * Binding one netconn twice might not always be checked correctly!\n *\n * @param conn the netconn to bind\n * @param addr the local IP address to bind the netconn to \n *             (use IP4_ADDR_ANY/IP6_ADDR_ANY to bind to all addresses)\n * @param port the local port to bind the netconn to (not used for RAW)\n * @return ERR_OK if bound, any other err_t on failure\n */\nerr_t\nnetconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port)\n{\n  API_MSG_VAR_DECLARE(msg);\n  err_t err;\n  \n  LWIP_ERROR(\"netconn_bind: invalid conn\", (conn != NULL), return ERR_ARG;);\n\n#if LWIP_IPV4\n  /* Don't propagate NULL pointer (IP_ADDR_ANY alias) to subsequent functions */\n  if (addr == NULL) {\n    addr = IP4_ADDR_ANY;\n  }\n#endif /* LWIP_IPV4 */\n  \n#if LWIP_IPV4 && LWIP_IPV6\n  /* \"Socket API like\" dual-stack support: If IP to bind to is IP6_ADDR_ANY,\n   * and NETCONN_FLAG_IPV6_V6ONLY is 0, use IP_ANY_TYPE to bind\n   */\n  if ((netconn_get_ipv6only(conn) == 0) &&\n     ip_addr_cmp(addr, IP6_ADDR_ANY)) {\n    addr = IP_ANY_TYPE;\n  }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n  API_MSG_VAR_ALLOC(msg);\n  API_MSG_VAR_REF(msg).conn = conn;\n  API_MSG_VAR_REF(msg).msg.bc.ipaddr = API_MSG_VAR_REF(addr);\n  API_MSG_VAR_REF(msg).msg.bc.port = port;\n  err = netconn_apimsg(lwip_netconn_do_bind, &API_MSG_VAR_REF(msg));\n  API_MSG_VAR_FREE(msg);\n\n  return err;\n}\n\n/**\n * @ingroup netconn_common\n * Connect a netconn to a specific remote IP address and port.\n *\n * @param conn the netconn to connect\n * @param addr the remote IP address to connect to\n * @param port the remote port to connect to (no used for RAW)\n * @return ERR_OK if connected, return value of tcp_/udp_/raw_connect otherwise\n */\nerr_t\nnetconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port)\n{\n  API_MSG_VAR_DECLARE(msg);\n  err_t err;\n\n  LWIP_ERROR(\"netconn_connect: invalid conn\", (conn != NULL), return ERR_ARG;);\n\n#if LWIP_IPV4\n  /* Don't propagate NULL pointer (IP_ADDR_ANY alias) to subsequent functions */\n  if (addr == NULL) {\n    addr = IP4_ADDR_ANY;\n  }\n#endif /* LWIP_IPV4 */\n\n  API_MSG_VAR_ALLOC(msg);\n  API_MSG_VAR_REF(msg).conn = conn;\n  API_MSG_VAR_REF(msg).msg.bc.ipaddr = API_MSG_VAR_REF(addr);\n  API_MSG_VAR_REF(msg).msg.bc.port = port;\n  err = netconn_apimsg(lwip_netconn_do_connect, &API_MSG_VAR_REF(msg));\n  API_MSG_VAR_FREE(msg);\n\n  return err;\n}\n\n/**\n * @ingroup netconn_udp\n * Disconnect a netconn from its current peer (only valid for UDP netconns).\n *\n * @param conn the netconn to disconnect\n * @return See @ref err_t\n */\nerr_t\nnetconn_disconnect(struct netconn *conn)\n{\n  API_MSG_VAR_DECLARE(msg);\n  err_t err;\n\n  LWIP_ERROR(\"netconn_disconnect: invalid conn\", (conn != NULL), return ERR_ARG;);\n\n  API_MSG_VAR_ALLOC(msg);\n  API_MSG_VAR_REF(msg).conn = conn;\n  err = netconn_apimsg(lwip_netconn_do_disconnect, &API_MSG_VAR_REF(msg));\n  API_MSG_VAR_FREE(msg);\n\n  return err;\n}\n\n/**\n * @ingroup netconn_tcp\n * Set a TCP netconn into listen mode\n *\n * @param conn the tcp netconn to set to listen mode\n * @param backlog the listen backlog, only used if TCP_LISTEN_BACKLOG==1\n * @return ERR_OK if the netconn was set to listen (UDP and RAW netconns\n *         don't return any error (yet?))\n */\nerr_t\nnetconn_listen_with_backlog(struct netconn *conn, u8_t backlog)\n{\n#if LWIP_TCP\n  API_MSG_VAR_DECLARE(msg);\n  err_t err;\n\n  /* This does no harm. If TCP_LISTEN_BACKLOG is off, backlog is unused. */\n  LWIP_UNUSED_ARG(backlog);\n\n  LWIP_ERROR(\"netconn_listen: invalid conn\", (conn != NULL), return ERR_ARG;);\n\n  API_MSG_VAR_ALLOC(msg);\n  API_MSG_VAR_REF(msg).conn = conn;\n#if TCP_LISTEN_BACKLOG\n  API_MSG_VAR_REF(msg).msg.lb.backlog = backlog;\n#endif /* TCP_LISTEN_BACKLOG */\n  err = netconn_apimsg(lwip_netconn_do_listen, &API_MSG_VAR_REF(msg));\n  API_MSG_VAR_FREE(msg);\n\n  return err;\n#else /* LWIP_TCP */\n  LWIP_UNUSED_ARG(conn);\n  LWIP_UNUSED_ARG(backlog);\n  return ERR_ARG;\n#endif /* LWIP_TCP */\n}\n\n/**\n * @ingroup netconn_tcp\n * Accept a new connection on a TCP listening netconn.\n *\n * @param conn the TCP listen netconn\n * @param new_conn pointer where the new connection is stored\n * @return ERR_OK if a new connection has been received or an error\n *                code otherwise\n */\nerr_t\nnetconn_accept(struct netconn *conn, struct netconn **new_conn)\n{\n#if LWIP_TCP\n  void *accept_ptr;\n  struct netconn *newconn;\n#if TCP_LISTEN_BACKLOG\n  API_MSG_VAR_DECLARE(msg);\n#endif /* TCP_LISTEN_BACKLOG */\n\n  LWIP_ERROR(\"netconn_accept: invalid pointer\",    (new_conn != NULL),                  return ERR_ARG;);\n  *new_conn = NULL;\n  LWIP_ERROR(\"netconn_accept: invalid conn\",       (conn != NULL),                      return ERR_ARG;);\n\n  if (ERR_IS_FATAL(conn->last_err)) {\n    /* don't recv on fatal errors: this might block the application task\n       waiting on acceptmbox forever! */\n    return conn->last_err;\n  }\n  if (!sys_mbox_valid(&conn->acceptmbox)) {\n    return ERR_CLSD;\n  }\n\n#if TCP_LISTEN_BACKLOG\n  API_MSG_VAR_ALLOC(msg);\n#endif /* TCP_LISTEN_BACKLOG */\n\n#if LWIP_SO_RCVTIMEO\n  if (sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {\n#if TCP_LISTEN_BACKLOG\n    API_MSG_VAR_FREE(msg);\n#endif /* TCP_LISTEN_BACKLOG */\n    return ERR_TIMEOUT;\n  }\n#else\n  sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, 0);\n#endif /* LWIP_SO_RCVTIMEO*/\n  newconn = (struct netconn *)accept_ptr;\n  /* Register event with callback */\n  API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);\n\n  if (accept_ptr == &netconn_aborted) {\n    /* a connection has been aborted: out of pcbs or out of netconns during accept */\n    /* @todo: set netconn error, but this would be fatal and thus block further accepts */\n#if TCP_LISTEN_BACKLOG\n    API_MSG_VAR_FREE(msg);\n#endif /* TCP_LISTEN_BACKLOG */\n    return ERR_ABRT;\n  }\n  if (newconn == NULL) {\n    /* connection has been aborted */\n    /* in this special case, we set the netconn error from application thread, as\n       on a ready-to-accept listening netconn, there should not be anything running\n       in tcpip_thread */\n    NETCONN_SET_SAFE_ERR(conn, ERR_CLSD);\n#if TCP_LISTEN_BACKLOG\n    API_MSG_VAR_FREE(msg);\n#endif /* TCP_LISTEN_BACKLOG */\n    return ERR_CLSD;\n  }\n#if TCP_LISTEN_BACKLOG\n  /* Let the stack know that we have accepted the connection. */\n  API_MSG_VAR_REF(msg).conn = newconn;\n  /* don't care for the return value of lwip_netconn_do_recv */\n  netconn_apimsg(lwip_netconn_do_accepted, &API_MSG_VAR_REF(msg));\n  API_MSG_VAR_FREE(msg);\n#endif /* TCP_LISTEN_BACKLOG */\n\n  *new_conn = newconn;\n  /* don't set conn->last_err: it's only ERR_OK, anyway */\n  return ERR_OK;\n#else /* LWIP_TCP */\n  LWIP_UNUSED_ARG(conn);\n  LWIP_UNUSED_ARG(new_conn);\n  return ERR_ARG;\n#endif /* LWIP_TCP */\n}\n\n/**\n * @ingroup netconn_common\n * Receive data: actual implementation that doesn't care whether pbuf or netbuf\n * is received\n *\n * @param conn the netconn from which to receive data\n * @param new_buf pointer where a new pbuf/netbuf is stored when received data\n * @return ERR_OK if data has been received, an error code otherwise (timeout,\n *                memory error or another error)\n */\nstatic err_t\nnetconn_recv_data(struct netconn *conn, void **new_buf)\n{\n  void *buf = NULL;\n  u16_t len;\n#if LWIP_TCP\n  API_MSG_VAR_DECLARE(msg);\n#if LWIP_MPU_COMPATIBLE\n  msg = NULL;\n#endif\n#endif /* LWIP_TCP */\n\n  LWIP_ERROR(\"netconn_recv: invalid pointer\", (new_buf != NULL), return ERR_ARG;);\n  *new_buf = NULL;\n  LWIP_ERROR(\"netconn_recv: invalid conn\",    (conn != NULL),    return ERR_ARG;);\n#if LWIP_TCP\n#if (LWIP_UDP || LWIP_RAW)\n  if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)\n#endif /* (LWIP_UDP || LWIP_RAW) */\n  {\n    if (!sys_mbox_valid(&conn->recvmbox)) {\n      /* This happens when calling this function after receiving FIN */\n      return sys_mbox_valid(&conn->acceptmbox) ? ERR_CONN : ERR_CLSD;\n    }\n  }\n#endif /* LWIP_TCP */\n  LWIP_ERROR(\"netconn_recv: invalid recvmbox\", sys_mbox_valid(&conn->recvmbox), return ERR_CONN;);\n\n  if (ERR_IS_FATAL(conn->last_err)) {\n    /* don't recv on fatal errors: this might block the application task\n       waiting on recvmbox forever! */\n    /* @todo: this does not allow us to fetch data that has been put into recvmbox\n       before the fatal error occurred - is that a problem? */\n    return conn->last_err;\n  }\n#if LWIP_TCP\n#if (LWIP_UDP || LWIP_RAW)\n  if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)\n#endif /* (LWIP_UDP || LWIP_RAW) */\n  {\n    API_MSG_VAR_ALLOC(msg);\n  }\n#endif /* LWIP_TCP */\n\n#if LWIP_SO_RCVTIMEO\n  if (sys_arch_mbox_fetch(&conn->recvmbox, &buf, conn->recv_timeout) == SYS_ARCH_TIMEOUT) {\n#if LWIP_TCP\n#if (LWIP_UDP || LWIP_RAW)\n    if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)\n#endif /* (LWIP_UDP || LWIP_RAW) */\n    {\n      API_MSG_VAR_FREE(msg);\n    }\n#endif /* LWIP_TCP */\n    return ERR_TIMEOUT;\n  }\n#else\n  sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0);\n#endif /* LWIP_SO_RCVTIMEO*/\n\n#if LWIP_TCP\n#if (LWIP_UDP || LWIP_RAW)\n  if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)\n#endif /* (LWIP_UDP || LWIP_RAW) */\n  {\n    /* Let the stack know that we have taken the data. */\n    /* @todo: Speedup: Don't block and wait for the answer here\n       (to prevent multiple thread-switches). */\n    API_MSG_VAR_REF(msg).conn = conn;\n    if (buf != NULL) {\n      API_MSG_VAR_REF(msg).msg.r.len = ((struct pbuf *)buf)->tot_len;\n    } else {\n      API_MSG_VAR_REF(msg).msg.r.len = 1;\n    }\n\n    /* don't care for the return value of lwip_netconn_do_recv */\n    netconn_apimsg(lwip_netconn_do_recv, &API_MSG_VAR_REF(msg));\n    API_MSG_VAR_FREE(msg);\n\n    /* If we are closed, we indicate that we no longer wish to use the socket */\n    if (buf == NULL) {\n      API_EVENT(conn, NETCONN_EVT_RCVMINUS, 0);\n      if (conn->pcb.ip == NULL) {\n        /* race condition: RST during recv */\n        return conn->last_err == ERR_OK ? ERR_RST : conn->last_err;\n      }\n      /* RX side is closed, so deallocate the recvmbox */\n      netconn_close_shutdown(conn, NETCONN_SHUT_RD);\n      /* Don' store ERR_CLSD as conn->err since we are only half-closed */\n      return ERR_CLSD;\n    }\n    len = ((struct pbuf *)buf)->tot_len;\n  }\n#endif /* LWIP_TCP */\n#if LWIP_TCP && (LWIP_UDP || LWIP_RAW)\n  else\n#endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */\n#if (LWIP_UDP || LWIP_RAW)\n  {\n    LWIP_ASSERT(\"buf != NULL\", buf != NULL);\n    len = netbuf_len((struct netbuf*)buf);\n  }\n#endif /* (LWIP_UDP || LWIP_RAW) */\n\n#if LWIP_SO_RCVBUF\n  SYS_ARCH_DEC(conn->recv_avail, len);\n#endif /* LWIP_SO_RCVBUF */\n  /* Register event with callback */\n  API_EVENT(conn, NETCONN_EVT_RCVMINUS, len);\n\n  LWIP_DEBUGF(API_LIB_DEBUG, (\"netconn_recv_data: received %p, len=%\"U16_F\"\\n\", buf, len));\n\n  *new_buf = buf;\n  /* don't set conn->last_err: it's only ERR_OK, anyway */\n  return ERR_OK;\n}\n\n/**\n * @ingroup netconn_tcp\n * Receive data (in form of a pbuf) from a TCP netconn\n *\n * @param conn the netconn from which to receive data\n * @param new_buf pointer where a new pbuf is stored when received data\n * @return ERR_OK if data has been received, an error code otherwise (timeout,\n *                memory error or another error)\n *         ERR_ARG if conn is not a TCP netconn\n */\nerr_t\nnetconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf)\n{\n  LWIP_ERROR(\"netconn_recv: invalid conn\", (conn != NULL) &&\n             NETCONNTYPE_GROUP(netconn_type(conn)) == NETCONN_TCP, return ERR_ARG;);\n\n  return netconn_recv_data(conn, (void **)new_buf);\n}\n\n/**\n * @ingroup netconn_common\n * Receive data (in form of a netbuf containing a packet buffer) from a netconn\n *\n * @param conn the netconn from which to receive data\n * @param new_buf pointer where a new netbuf is stored when received data\n * @return ERR_OK if data has been received, an error code otherwise (timeout,\n *                memory error or another error)\n */\nerr_t\nnetconn_recv(struct netconn *conn, struct netbuf **new_buf)\n{\n#if LWIP_TCP\n  struct netbuf *buf = NULL;\n  err_t err;\n#endif /* LWIP_TCP */\n\n  LWIP_ERROR(\"netconn_recv: invalid pointer\", (new_buf != NULL), return ERR_ARG;);\n  *new_buf = NULL;\n  LWIP_ERROR(\"netconn_recv: invalid conn\",    (conn != NULL),    return ERR_ARG;);\n\n#if LWIP_TCP\n#if (LWIP_UDP || LWIP_RAW)\n  if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP)\n#endif /* (LWIP_UDP || LWIP_RAW) */\n  {\n    struct pbuf *p = NULL;\n    /* This is not a listening netconn, since recvmbox is set */\n\n    buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);\n    if (buf == NULL) {\n      return ERR_MEM;\n    }\n\n    err = netconn_recv_data(conn, (void **)&p);\n    if (err != ERR_OK) {\n      memp_free(MEMP_NETBUF, buf);\n      return err;\n    }\n    LWIP_ASSERT(\"p != NULL\", p != NULL);\n\n    buf->p = p;\n    buf->ptr = p;\n    buf->port = 0;\n    ip_addr_set_zero(&buf->addr);\n    *new_buf = buf;\n    /* don't set conn->last_err: it's only ERR_OK, anyway */\n    return ERR_OK;\n  }\n#endif /* LWIP_TCP */\n#if LWIP_TCP && (LWIP_UDP || LWIP_RAW)\n  else\n#endif /* LWIP_TCP && (LWIP_UDP || LWIP_RAW) */\n  {\n#if (LWIP_UDP || LWIP_RAW)\n    return netconn_recv_data(conn, (void **)new_buf);\n#endif /* (LWIP_UDP || LWIP_RAW) */\n  }\n}\n\n/**\n * @ingroup netconn_udp\n * Send data (in form of a netbuf) to a specific remote IP address and port.\n * Only to be used for UDP and RAW netconns (not TCP).\n *\n * @param conn the netconn over which to send data\n * @param buf a netbuf containing the data to send\n * @param addr the remote IP address to which to send the data\n * @param port the remote port to which to send the data\n * @return ERR_OK if data was sent, any other err_t on error\n */\nerr_t\nnetconn_sendto(struct netconn *conn, struct netbuf *buf, const ip_addr_t *addr, u16_t port)\n{\n  if (buf != NULL) {\n    ip_addr_set(&buf->addr, addr);\n    buf->port = port;\n    return netconn_send(conn, buf);\n  }\n  return ERR_VAL;\n}\n\n/**\n * @ingroup netconn_udp\n * Send data over a UDP or RAW netconn (that is already connected).\n *\n * @param conn the UDP or RAW netconn over which to send data\n * @param buf a netbuf containing the data to send\n * @return ERR_OK if data was sent, any other err_t on error\n */\nerr_t\nnetconn_send(struct netconn *conn, struct netbuf *buf)\n{\n  API_MSG_VAR_DECLARE(msg);\n  err_t err;\n\n  LWIP_ERROR(\"netconn_send: invalid conn\",  (conn != NULL), return ERR_ARG;);\n\n  LWIP_DEBUGF(API_LIB_DEBUG, (\"netconn_send: sending %\"U16_F\" bytes\\n\", buf->p->tot_len));\n\n  API_MSG_VAR_ALLOC(msg);\n  API_MSG_VAR_REF(msg).conn = conn;\n  API_MSG_VAR_REF(msg).msg.b = buf;\n  err = netconn_apimsg(lwip_netconn_do_send, &API_MSG_VAR_REF(msg));\n  API_MSG_VAR_FREE(msg);\n\n  return err;\n}\n\n/**\n * @ingroup netconn_tcp\n * Send data over a TCP netconn.\n *\n * @param conn the TCP netconn over which to send data\n * @param dataptr pointer to the application buffer that contains the data to send\n * @param size size of the application data to send\n * @param apiflags combination of following flags :\n * - NETCONN_COPY: data will be copied into memory belonging to the stack\n * - NETCONN_MORE: for TCP connection, PSH flag will be set on last segment sent\n * - NETCONN_DONTBLOCK: only write the data if all data can be written at once\n * @param bytes_written pointer to a location that receives the number of written bytes\n * @return ERR_OK if data was sent, any other err_t on error\n */\nerr_t\nnetconn_write_partly(struct netconn *conn, const void *dataptr, size_t size,\n                     u8_t apiflags, size_t *bytes_written)\n{\n  API_MSG_VAR_DECLARE(msg);\n  err_t err;\n  u8_t dontblock;\n\n  LWIP_ERROR(\"netconn_write: invalid conn\",  (conn != NULL), return ERR_ARG;);\n  LWIP_ERROR(\"netconn_write: invalid conn->type\",  (NETCONNTYPE_GROUP(conn->type)== NETCONN_TCP), return ERR_VAL;);\n  if (size == 0) {\n    return ERR_OK;\n  }\n  dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);\n#if LWIP_SO_SNDTIMEO\n  if (conn->send_timeout != 0) {\n    dontblock = 1;\n  }\n#endif /* LWIP_SO_SNDTIMEO */\n  if (dontblock && !bytes_written) {\n    /* This implies netconn_write() cannot be used for non-blocking send, since\n       it has no way to return the number of bytes written. */\n    return ERR_VAL;\n  }\n\n  API_MSG_VAR_ALLOC(msg);\n  /* non-blocking write sends as much  */\n  API_MSG_VAR_REF(msg).conn = conn;\n  API_MSG_VAR_REF(msg).msg.w.dataptr = dataptr;\n  API_MSG_VAR_REF(msg).msg.w.apiflags = apiflags;\n  API_MSG_VAR_REF(msg).msg.w.len = size;\n#if LWIP_SO_SNDTIMEO\n  if (conn->send_timeout != 0) {\n    /* get the time we started, which is later compared to\n        sys_now() + conn->send_timeout */\n    API_MSG_VAR_REF(msg).msg.w.time_started = sys_now();\n  } else {\n    API_MSG_VAR_REF(msg).msg.w.time_started = 0;\n  }\n#endif /* LWIP_SO_SNDTIMEO */\n\n  /* For locking the core: this _can_ be delayed on low memory/low send buffer,\n     but if it is, this is done inside api_msg.c:do_write(), so we can use the\n     non-blocking version here. */\n  err = netconn_apimsg(lwip_netconn_do_write, &API_MSG_VAR_REF(msg));\n  if ((err == ERR_OK) && (bytes_written != NULL)) {\n    if (dontblock) {\n      /* nonblocking write: maybe the data has been sent partly */\n      *bytes_written = API_MSG_VAR_REF(msg).msg.w.len;\n    } else {\n      /* blocking call succeeded: all data has been sent if it */\n      *bytes_written = size;\n    }\n  }\n  API_MSG_VAR_FREE(msg);\n\n  return err;\n}\n\n/**\n * @ingroup netconn_tcp\n * Close or shutdown a TCP netconn (doesn't delete it).\n *\n * @param conn the TCP netconn to close or shutdown\n * @param how fully close or only shutdown one side?\n * @return ERR_OK if the netconn was closed, any other err_t on error\n */\nstatic err_t\nnetconn_close_shutdown(struct netconn *conn, u8_t how)\n{\n  API_MSG_VAR_DECLARE(msg);\n  err_t err;\n  LWIP_UNUSED_ARG(how);\n\n  LWIP_ERROR(\"netconn_close: invalid conn\",  (conn != NULL), return ERR_ARG;);\n\n  API_MSG_VAR_ALLOC(msg);\n  API_MSG_VAR_REF(msg).conn = conn;\n#if LWIP_TCP\n  /* shutting down both ends is the same as closing */\n  API_MSG_VAR_REF(msg).msg.sd.shut = how;\n#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER\n  /* get the time we started, which is later compared to\n     sys_now() + conn->send_timeout */\n  API_MSG_VAR_REF(msg).msg.sd.time_started = sys_now();\n#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */\n  API_MSG_VAR_REF(msg).msg.sd.polls_left =\n    ((LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT + TCP_SLOW_INTERVAL - 1) / TCP_SLOW_INTERVAL) + 1;\n#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */\n#endif /* LWIP_TCP */\n  err = netconn_apimsg(lwip_netconn_do_close, &API_MSG_VAR_REF(msg));\n  API_MSG_VAR_FREE(msg);\n\n  return err;\n}\n\n/**\n * @ingroup netconn_tcp\n * Close a TCP netconn (doesn't delete it).\n *\n * @param conn the TCP netconn to close\n * @return ERR_OK if the netconn was closed, any other err_t on error\n */\nerr_t\nnetconn_close(struct netconn *conn)\n{\n  /* shutting down both ends is the same as closing */\n  return netconn_close_shutdown(conn, NETCONN_SHUT_RDWR);\n}\n\n/**\n * @ingroup netconn_tcp\n * Shut down one or both sides of a TCP netconn (doesn't delete it).\n *\n * @param conn the TCP netconn to shut down\n * @param shut_rx shut down the RX side (no more read possible after this)\n * @param shut_tx shut down the TX side (no more write possible after this)\n * @return ERR_OK if the netconn was closed, any other err_t on error\n */\nerr_t\nnetconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx)\n{\n  return netconn_close_shutdown(conn, (shut_rx ? NETCONN_SHUT_RD : 0) | (shut_tx ? NETCONN_SHUT_WR : 0));\n}\n\n#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)\n/**\n * @ingroup netconn_udp\n * Join multicast groups for UDP netconns.\n *\n * @param conn the UDP netconn for which to change multicast addresses\n * @param multiaddr IP address of the multicast group to join or leave\n * @param netif_addr the IP address of the network interface on which to send\n *                  the igmp message\n * @param join_or_leave flag whether to send a join- or leave-message\n * @return ERR_OK if the action was taken, any err_t on error\n */\nerr_t\nnetconn_join_leave_group(struct netconn *conn,\n                         const ip_addr_t *multiaddr,\n                         const ip_addr_t *netif_addr,\n                         enum netconn_igmp join_or_leave)\n{\n  API_MSG_VAR_DECLARE(msg);\n  err_t err;\n\n  LWIP_ERROR(\"netconn_join_leave_group: invalid conn\",  (conn != NULL), return ERR_ARG;);\n\n  API_MSG_VAR_ALLOC(msg);\n\n#if LWIP_IPV4\n  /* Don't propagate NULL pointer (IP_ADDR_ANY alias) to subsequent functions */\n  if (multiaddr == NULL) {\n    multiaddr = IP4_ADDR_ANY;\n  }\n  if (netif_addr == NULL) {\n    netif_addr = IP4_ADDR_ANY;\n  }\n#endif /* LWIP_IPV4 */\n\n  API_MSG_VAR_REF(msg).conn = conn;\n  API_MSG_VAR_REF(msg).msg.jl.multiaddr = API_MSG_VAR_REF(multiaddr);\n  API_MSG_VAR_REF(msg).msg.jl.netif_addr = API_MSG_VAR_REF(netif_addr);\n  API_MSG_VAR_REF(msg).msg.jl.join_or_leave = join_or_leave;\n  err = netconn_apimsg(lwip_netconn_do_join_leave_group, &API_MSG_VAR_REF(msg));\n  API_MSG_VAR_FREE(msg);\n\n  return err;\n}\n#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */\n\n#if LWIP_DNS\n/**\n * @ingroup netconn_common\n * Execute a DNS query, only one IP address is returned\n *\n * @param name a string representation of the DNS host name to query\n * @param addr a preallocated ip_addr_t where to store the resolved IP address\n * @param dns_addrtype IP address type (IPv4 / IPv6)\n * @return ERR_OK: resolving succeeded\n *         ERR_MEM: memory error, try again later\n *         ERR_ARG: dns client not initialized or invalid hostname\n *         ERR_VAL: dns server response was invalid\n */\n#if LWIP_IPV4 && LWIP_IPV6\nerr_t\nnetconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype)\n#else\nerr_t\nnetconn_gethostbyname(const char *name, ip_addr_t *addr)\n#endif\n{\n  API_VAR_DECLARE(struct dns_api_msg, msg);\n#if !LWIP_MPU_COMPATIBLE\n  sys_sem_t sem;\n#endif /* LWIP_MPU_COMPATIBLE */\n  err_t err;\n  err_t cberr;\n\n  LWIP_ERROR(\"netconn_gethostbyname: invalid name\", (name != NULL), return ERR_ARG;);\n  LWIP_ERROR(\"netconn_gethostbyname: invalid addr\", (addr != NULL), return ERR_ARG;);\n#if LWIP_MPU_COMPATIBLE\n  if (strlen(name) >= DNS_MAX_NAME_LENGTH) {\n    return ERR_ARG;\n  }\n#endif\n\n  API_VAR_ALLOC(struct dns_api_msg, MEMP_DNS_API_MSG, msg, ERR_MEM);\n#if LWIP_MPU_COMPATIBLE\n  strncpy(API_VAR_REF(msg).name, name, DNS_MAX_NAME_LENGTH-1);\n  API_VAR_REF(msg).name[DNS_MAX_NAME_LENGTH-1] = 0;\n#else /* LWIP_MPU_COMPATIBLE */\n  msg.err = &err;\n  msg.sem = &sem;\n  API_VAR_REF(msg).addr = API_VAR_REF(addr);\n  API_VAR_REF(msg).name = name;\n#endif /* LWIP_MPU_COMPATIBLE */\n#if LWIP_IPV4 && LWIP_IPV6\n  API_VAR_REF(msg).dns_addrtype = dns_addrtype;\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n#if LWIP_NETCONN_SEM_PER_THREAD\n  API_VAR_REF(msg).sem = LWIP_NETCONN_THREAD_SEM_GET();\n#else /* LWIP_NETCONN_SEM_PER_THREAD*/\n  err = sys_sem_new(API_EXPR_REF(API_VAR_REF(msg).sem), 0);\n  if (err != ERR_OK) {\n    API_VAR_FREE(MEMP_DNS_API_MSG, msg);\n    return err;\n  }\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n\n  cberr = tcpip_callback(lwip_netconn_do_gethostbyname, &API_VAR_REF(msg));\n  if (cberr != ERR_OK) {\n#if !LWIP_NETCONN_SEM_PER_THREAD\n    sys_sem_free(API_EXPR_REF(API_VAR_REF(msg).sem));\n#endif /* !LWIP_NETCONN_SEM_PER_THREAD */\n    API_VAR_FREE(MEMP_DNS_API_MSG, msg);\n    return cberr;\n  }\n  sys_sem_wait(API_EXPR_REF_SEM(API_VAR_REF(msg).sem));\n#if !LWIP_NETCONN_SEM_PER_THREAD\n  sys_sem_free(API_EXPR_REF(API_VAR_REF(msg).sem));\n#endif /* !LWIP_NETCONN_SEM_PER_THREAD */\n\n#if LWIP_MPU_COMPATIBLE\n  *addr = msg->addr;\n  err = msg->err;\n#endif /* LWIP_MPU_COMPATIBLE */\n\n  API_VAR_FREE(MEMP_DNS_API_MSG, msg);\n  return err;\n}\n#endif /* LWIP_DNS*/\n\n#if LWIP_NETCONN_SEM_PER_THREAD\nvoid\nnetconn_thread_init(void)\n{\n  sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET();\n  if ((sem == NULL) || !sys_sem_valid(sem)) {\n    /* call alloc only once */\n    LWIP_NETCONN_THREAD_SEM_ALLOC();\n    LWIP_ASSERT(\"LWIP_NETCONN_THREAD_SEM_ALLOC() failed\", sys_sem_valid(LWIP_NETCONN_THREAD_SEM_GET()));\n  }\n}\n\nvoid\nnetconn_thread_cleanup(void)\n{\n  sys_sem_t *sem = LWIP_NETCONN_THREAD_SEM_GET();\n  if ((sem != NULL) && sys_sem_valid(sem)) {\n    /* call free only once */\n    LWIP_NETCONN_THREAD_SEM_FREE();\n  }\n}\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n\n#endif /* LWIP_NETCONN */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/api/api_msg.c",
    "content": "/**\n * @file\n * Sequential API Internal module\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/priv/api_msg.h\"\n\n#include \"lwip/ip.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/tcp.h\"\n#include \"lwip/raw.h\"\n\n#include \"lwip/memp.h\"\n#include \"lwip/igmp.h\"\n#include \"lwip/dns.h\"\n#include \"lwip/mld6.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n\n#include <string.h>\n\n/* netconns are polled once per second (e.g. continue write on memory error) */\n#define NETCONN_TCP_POLL_INTERVAL 2\n\n#define SET_NONBLOCKING_CONNECT(conn, val)  do { if (val) { \\\n  (conn)->flags |= NETCONN_FLAG_IN_NONBLOCKING_CONNECT; \\\n} else { \\\n  (conn)->flags &= ~ NETCONN_FLAG_IN_NONBLOCKING_CONNECT; }} while(0)\n#define IN_NONBLOCKING_CONNECT(conn) (((conn)->flags & NETCONN_FLAG_IN_NONBLOCKING_CONNECT) != 0)\n\n/* forward declarations */\n#if LWIP_TCP\n#if LWIP_TCPIP_CORE_LOCKING\n#define WRITE_DELAYED         , 1\n#define WRITE_DELAYED_PARAM   , u8_t delayed\n#else /* LWIP_TCPIP_CORE_LOCKING */\n#define WRITE_DELAYED\n#define WRITE_DELAYED_PARAM\n#endif /* LWIP_TCPIP_CORE_LOCKING */\nstatic err_t lwip_netconn_do_writemore(struct netconn *conn  WRITE_DELAYED_PARAM);\nstatic err_t lwip_netconn_do_close_internal(struct netconn *conn  WRITE_DELAYED_PARAM);\n#endif\n\n#if LWIP_TCPIP_CORE_LOCKING\n#define TCPIP_APIMSG_ACK(m)   NETCONN_SET_SAFE_ERR((m)->conn, (m)->err)\n#else /* LWIP_TCPIP_CORE_LOCKING */\n#define TCPIP_APIMSG_ACK(m)   do { NETCONN_SET_SAFE_ERR((m)->conn, (m)->err); sys_sem_signal(LWIP_API_MSG_SEM(m)); } while(0)\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n\n#if LWIP_TCP\nu8_t netconn_aborted;\n#endif /* LWIP_TCP */\n\n#if LWIP_RAW\n/**\n * Receive callback function for RAW netconns.\n * Doesn't 'eat' the packet, only copies it and sends it to\n * conn->recvmbox\n *\n * @see raw.h (struct raw_pcb.recv) for parameters and return value\n */\nstatic u8_t\nrecv_raw(void *arg, struct raw_pcb *pcb, struct pbuf *p,\n    const ip_addr_t *addr)\n{\n  struct pbuf *q;\n  struct netbuf *buf;\n  struct netconn *conn;\n\n  LWIP_UNUSED_ARG(addr);\n  conn = (struct netconn *)arg;\n\n  if ((conn != NULL) && sys_mbox_valid(&conn->recvmbox)) {\n#if LWIP_SO_RCVBUF\n    int recv_avail;\n    SYS_ARCH_GET(conn->recv_avail, recv_avail);\n    if ((recv_avail + (int)(p->tot_len)) > conn->recv_bufsize) {\n      return 0;\n    }\n#endif /* LWIP_SO_RCVBUF */\n    /* copy the whole packet into new pbufs */\n    q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);\n    if (q != NULL) {\n      if (pbuf_copy(q, p) != ERR_OK) {\n        pbuf_free(q);\n        q = NULL;\n      }\n    }\n\n    if (q != NULL) {\n      u16_t len;\n      buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);\n      if (buf == NULL) {\n        pbuf_free(q);\n        return 0;\n      }\n\n      buf->p = q;\n      buf->ptr = q;\n      ip_addr_copy(buf->addr, *ip_current_src_addr());\n      buf->port = pcb->protocol;\n\n      len = q->tot_len;\n      if (sys_mbox_trypost(&conn->recvmbox, buf) != ERR_OK) {\n        netbuf_delete(buf);\n        return 0;\n      } else {\n#if LWIP_SO_RCVBUF\n        SYS_ARCH_INC(conn->recv_avail, len);\n#endif /* LWIP_SO_RCVBUF */\n        /* Register event with callback */\n        API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);\n      }\n    }\n  }\n\n  return 0; /* do not eat the packet */\n}\n#endif /* LWIP_RAW*/\n\n#if LWIP_UDP\n/**\n * Receive callback function for UDP netconns.\n * Posts the packet to conn->recvmbox or deletes it on memory error.\n *\n * @see udp.h (struct udp_pcb.recv) for parameters\n */\nstatic void\nrecv_udp(void *arg, struct udp_pcb *pcb, struct pbuf *p,\n   const ip_addr_t *addr, u16_t port)\n{\n  struct netbuf *buf;\n  struct netconn *conn;\n  u16_t len;\n#if LWIP_SO_RCVBUF\n  int recv_avail;\n#endif /* LWIP_SO_RCVBUF */\n\n  LWIP_UNUSED_ARG(pcb); /* only used for asserts... */\n  LWIP_ASSERT(\"recv_udp must have a pcb argument\", pcb != NULL);\n  LWIP_ASSERT(\"recv_udp must have an argument\", arg != NULL);\n  conn = (struct netconn *)arg;\n\n  if (conn == NULL) {\n    pbuf_free(p);\n    return;\n  }\n\n  LWIP_ASSERT(\"recv_udp: recv for wrong pcb!\", conn->pcb.udp == pcb);\n\n#if LWIP_SO_RCVBUF\n  SYS_ARCH_GET(conn->recv_avail, recv_avail);\n  if (!sys_mbox_valid(&conn->recvmbox) ||\n      ((recv_avail + (int)(p->tot_len)) > conn->recv_bufsize)) {\n#else  /* LWIP_SO_RCVBUF */\n  if (!sys_mbox_valid(&conn->recvmbox)) {\n#endif /* LWIP_SO_RCVBUF */\n    pbuf_free(p);\n    return;\n  }\n\n  buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);\n  if (buf == NULL) {\n    pbuf_free(p);\n    return;\n  } else {\n    buf->p = p;\n    buf->ptr = p;\n    ip_addr_set(&buf->addr, addr);\n    buf->port = port;\n#if LWIP_NETBUF_RECVINFO\n    {\n      /* get the UDP header - always in the first pbuf, ensured by udp_input */\n      const struct udp_hdr* udphdr = (const struct udp_hdr*)ip_next_header_ptr();\n#if LWIP_CHECKSUM_ON_COPY\n      buf->flags = NETBUF_FLAG_DESTADDR;\n#endif /* LWIP_CHECKSUM_ON_COPY */\n      ip_addr_set(&buf->toaddr, ip_current_dest_addr());\n      buf->toport_chksum = udphdr->dest;\n    }\n#endif /* LWIP_NETBUF_RECVINFO */\n  }\n\n  len = p->tot_len;\n  if (sys_mbox_trypost(&conn->recvmbox, buf) != ERR_OK) {\n    netbuf_delete(buf);\n    return;\n  } else {\n#if LWIP_SO_RCVBUF\n    SYS_ARCH_INC(conn->recv_avail, len);\n#endif /* LWIP_SO_RCVBUF */\n    /* Register event with callback */\n    API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);\n  }\n}\n#endif /* LWIP_UDP */\n\n#if LWIP_TCP\n/**\n * Receive callback function for TCP netconns.\n * Posts the packet to conn->recvmbox, but doesn't delete it on errors.\n *\n * @see tcp.h (struct tcp_pcb.recv) for parameters and return value\n */\nstatic err_t\nrecv_tcp(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)\n{\n  struct netconn *conn;\n  u16_t len;\n\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_ASSERT(\"recv_tcp must have a pcb argument\", pcb != NULL);\n  LWIP_ASSERT(\"recv_tcp must have an argument\", arg != NULL);\n  conn = (struct netconn *)arg;\n\n  if (conn == NULL) {\n    return ERR_VAL;\n  }\n  LWIP_ASSERT(\"recv_tcp: recv for wrong pcb!\", conn->pcb.tcp == pcb);\n\n  if (!sys_mbox_valid(&conn->recvmbox)) {\n    /* recvmbox already deleted */\n    if (p != NULL) {\n      tcp_recved(pcb, p->tot_len);\n      pbuf_free(p);\n    }\n    return ERR_OK;\n  }\n  /* Unlike for UDP or RAW pcbs, don't check for available space\n     using recv_avail since that could break the connection\n     (data is already ACKed) */\n\n  /* don't overwrite fatal errors! */\n  if (err != ERR_OK) {\n    NETCONN_SET_SAFE_ERR(conn, err);\n  }\n\n  if (p != NULL) {\n    len = p->tot_len;\n  } else {\n    len = 0;\n  }\n\n  if (sys_mbox_trypost(&conn->recvmbox, p) != ERR_OK) {\n    /* don't deallocate p: it is presented to us later again from tcp_fasttmr! */\n    return ERR_MEM;\n  } else {\n#if LWIP_SO_RCVBUF\n    SYS_ARCH_INC(conn->recv_avail, len);\n#endif /* LWIP_SO_RCVBUF */\n    /* Register event with callback */\n    API_EVENT(conn, NETCONN_EVT_RCVPLUS, len);\n  }\n\n  return ERR_OK;\n}\n\n/**\n * Poll callback function for TCP netconns.\n * Wakes up an application thread that waits for a connection to close\n * or data to be sent. The application thread then takes the\n * appropriate action to go on.\n *\n * Signals the conn->sem.\n * netconn_close waits for conn->sem if closing failed.\n *\n * @see tcp.h (struct tcp_pcb.poll) for parameters and return value\n */\nstatic err_t\npoll_tcp(void *arg, struct tcp_pcb *pcb)\n{\n  struct netconn *conn = (struct netconn *)arg;\n\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_ASSERT(\"conn != NULL\", (conn != NULL));\n\n  if (conn->state == NETCONN_WRITE) {\n    lwip_netconn_do_writemore(conn  WRITE_DELAYED);\n  } else if (conn->state == NETCONN_CLOSE) {\n#if !LWIP_SO_SNDTIMEO && !LWIP_SO_LINGER\n    if (conn->current_msg && conn->current_msg->msg.sd.polls_left) {\n      conn->current_msg->msg.sd.polls_left--;\n    }\n#endif /* !LWIP_SO_SNDTIMEO && !LWIP_SO_LINGER */\n    lwip_netconn_do_close_internal(conn  WRITE_DELAYED);\n  }\n  /* @todo: implement connect timeout here? */\n\n  /* Did a nonblocking write fail before? Then check available write-space. */\n  if (conn->flags & NETCONN_FLAG_CHECK_WRITESPACE) {\n    /* If the queued byte- or pbuf-count drops below the configured low-water limit,\n       let select mark this pcb as writable again. */\n    if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) &&\n      (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) {\n      conn->flags &= ~NETCONN_FLAG_CHECK_WRITESPACE;\n      API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);\n    }\n  }\n\n  return ERR_OK;\n}\n\n/**\n * Sent callback function for TCP netconns.\n * Signals the conn->sem and calls API_EVENT.\n * netconn_write waits for conn->sem if send buffer is low.\n *\n * @see tcp.h (struct tcp_pcb.sent) for parameters and return value\n */\nstatic err_t\nsent_tcp(void *arg, struct tcp_pcb *pcb, u16_t len)\n{\n  struct netconn *conn = (struct netconn *)arg;\n\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_ASSERT(\"conn != NULL\", (conn != NULL));\n\n  if (conn) {\n    if (conn->state == NETCONN_WRITE) {\n      lwip_netconn_do_writemore(conn  WRITE_DELAYED);\n    } else if (conn->state == NETCONN_CLOSE) {\n      lwip_netconn_do_close_internal(conn  WRITE_DELAYED);\n    }\n\n    /* If the queued byte- or pbuf-count drops below the configured low-water limit,\n       let select mark this pcb as writable again. */\n    if ((conn->pcb.tcp != NULL) && (tcp_sndbuf(conn->pcb.tcp) > TCP_SNDLOWAT) &&\n      (tcp_sndqueuelen(conn->pcb.tcp) < TCP_SNDQUEUELOWAT)) {\n      conn->flags &= ~NETCONN_FLAG_CHECK_WRITESPACE;\n      API_EVENT(conn, NETCONN_EVT_SENDPLUS, len);\n    }\n  }\n\n  return ERR_OK;\n}\n\n/**\n * Error callback function for TCP netconns.\n * Signals conn->sem, posts to all conn mboxes and calls API_EVENT.\n * The application thread has then to decide what to do.\n *\n * @see tcp.h (struct tcp_pcb.err) for parameters\n */\nstatic void\nerr_tcp(void *arg, err_t err)\n{\n  struct netconn *conn;\n  enum netconn_state old_state;\n\n  conn = (struct netconn *)arg;\n  LWIP_ASSERT(\"conn != NULL\", (conn != NULL));\n\n  conn->pcb.tcp = NULL;\n\n  /* reset conn->state now before waking up other threads */\n  old_state = conn->state;\n  conn->state = NETCONN_NONE;\n\n  if (old_state == NETCONN_CLOSE) {\n    /* RST during close: let close return success & dealloc the netconn */\n    err = ERR_OK;\n    NETCONN_SET_SAFE_ERR(conn, ERR_OK);\n  } else {\n    /* no check since this is always fatal! */\n    SYS_ARCH_SET(conn->last_err, err);\n  }\n\n  /* @todo: the type of NETCONN_EVT created should depend on 'old_state' */\n\n  /* Notify the user layer about a connection error. Used to signal select. */\n  API_EVENT(conn, NETCONN_EVT_ERROR, 0);\n  /* Try to release selects pending on 'read' or 'write', too.\n     They will get an error if they actually try to read or write. */\n  API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);\n  API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);\n\n  /* pass NULL-message to recvmbox to wake up pending recv */\n  if (sys_mbox_valid(&conn->recvmbox)) {\n    /* use trypost to prevent deadlock */\n    sys_mbox_trypost(&conn->recvmbox, NULL);\n  }\n  /* pass NULL-message to acceptmbox to wake up pending accept */\n  if (sys_mbox_valid(&conn->acceptmbox)) {\n    /* use trypost to preven deadlock */\n    sys_mbox_trypost(&conn->acceptmbox, NULL);\n  }\n\n  if ((old_state == NETCONN_WRITE) || (old_state == NETCONN_CLOSE) ||\n      (old_state == NETCONN_CONNECT)) {\n    /* calling lwip_netconn_do_writemore/lwip_netconn_do_close_internal is not necessary\n       since the pcb has already been deleted! */\n    int was_nonblocking_connect = IN_NONBLOCKING_CONNECT(conn);\n    SET_NONBLOCKING_CONNECT(conn, 0);\n\n    if (!was_nonblocking_connect) {\n      sys_sem_t* op_completed_sem;\n      /* set error return code */\n      LWIP_ASSERT(\"conn->current_msg != NULL\", conn->current_msg != NULL);\n      conn->current_msg->err = err;\n      op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);\n      LWIP_ASSERT(\"inavlid op_completed_sem\", sys_sem_valid(op_completed_sem));\n      conn->current_msg = NULL;\n      /* wake up the waiting task */\n      NETCONN_SET_SAFE_ERR(conn, err);\n      sys_sem_signal(op_completed_sem);\n    }\n  } else {\n    LWIP_ASSERT(\"conn->current_msg == NULL\", conn->current_msg == NULL);\n  }\n}\n\n/**\n * Setup a tcp_pcb with the correct callback function pointers\n * and their arguments.\n *\n * @param conn the TCP netconn to setup\n */\nstatic void\nsetup_tcp(struct netconn *conn)\n{\n  struct tcp_pcb *pcb;\n\n  pcb = conn->pcb.tcp;\n  tcp_arg(pcb, conn);\n  tcp_recv(pcb, recv_tcp);\n  tcp_sent(pcb, sent_tcp);\n  tcp_poll(pcb, poll_tcp, NETCONN_TCP_POLL_INTERVAL);\n  tcp_err(pcb, err_tcp);\n}\n\n/**\n * Accept callback function for TCP netconns.\n * Allocates a new netconn and posts that to conn->acceptmbox.\n *\n * @see tcp.h (struct tcp_pcb_listen.accept) for parameters and return value\n */\nstatic err_t\naccept_function(void *arg, struct tcp_pcb *newpcb, err_t err)\n{\n  struct netconn *newconn;\n  struct netconn *conn = (struct netconn *)arg;\n\n  if (conn == NULL) {\n    return ERR_VAL;\n  }\n  if (!sys_mbox_valid(&conn->acceptmbox)) {\n    LWIP_DEBUGF(API_MSG_DEBUG, (\"accept_function: acceptmbox already deleted\\n\"));\n    return ERR_VAL;\n  }\n\n  if (newpcb == NULL) {\n    /* out-of-pcbs during connect: pass on this error to the application */\n    if (sys_mbox_trypost(&conn->acceptmbox, &netconn_aborted) == ERR_OK) {\n      /* Register event with callback */\n      API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);\n    }\n    return ERR_VAL;\n  }\n\n  LWIP_DEBUGF(API_MSG_DEBUG, (\"accept_function: newpcb->tate: %s\\n\", tcp_debug_state_str(newpcb->state)));\n\n  /* We have to set the callback here even though\n   * the new socket is unknown. newconn->socket is marked as -1. */\n  newconn = netconn_alloc(conn->type, conn->callback);\n  if (newconn == NULL) {\n    /* outof netconns: pass on this error to the application */\n    if (sys_mbox_trypost(&conn->acceptmbox, &netconn_aborted) == ERR_OK) {\n      /* Register event with callback */\n      API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);\n    }\n    return ERR_MEM;\n  }\n  newconn->pcb.tcp = newpcb;\n  setup_tcp(newconn);\n  /* no protection: when creating the pcb, the netconn is not yet known\n     to the application thread */\n  newconn->last_err = err;\n\n  /* handle backlog counter */\n  tcp_backlog_delayed(newpcb);\n\n  if (sys_mbox_trypost(&conn->acceptmbox, newconn) != ERR_OK) {\n    /* When returning != ERR_OK, the pcb is aborted in tcp_process(),\n       so do nothing here! */\n    /* remove all references to this netconn from the pcb */\n    struct tcp_pcb* pcb = newconn->pcb.tcp;\n    tcp_arg(pcb, NULL);\n    tcp_recv(pcb, NULL);\n    tcp_sent(pcb, NULL);\n    tcp_poll(pcb, NULL, 0);\n    tcp_err(pcb, NULL);\n    /* remove reference from to the pcb from this netconn */\n    newconn->pcb.tcp = NULL;\n    /* no need to drain since we know the recvmbox is empty. */\n    sys_mbox_free(&newconn->recvmbox);\n    sys_mbox_set_invalid(&newconn->recvmbox);\n    netconn_free(newconn);\n    return ERR_MEM;\n  } else {\n    /* Register event with callback */\n    API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);\n  }\n\n  return ERR_OK;\n}\n#endif /* LWIP_TCP */\n\n/**\n * Create a new pcb of a specific type.\n * Called from lwip_netconn_do_newconn().\n *\n * @param msg the api_msg_msg describing the connection type\n */\nstatic void\npcb_new(struct api_msg *msg)\n{\n  enum lwip_ip_addr_type iptype = IPADDR_TYPE_V4;\n\n  LWIP_ASSERT(\"pcb_new: pcb already allocated\", msg->conn->pcb.tcp == NULL);\n \n#if LWIP_IPV6 && LWIP_IPV4\n  /* IPv6: Dual-stack by default, unless netconn_set_ipv6only() is called */\n  if(NETCONNTYPE_ISIPV6(netconn_type(msg->conn))) {\n    iptype = IPADDR_TYPE_ANY;\n  }\n#endif\n  \n  /* Allocate a PCB for this connection */\n  switch(NETCONNTYPE_GROUP(msg->conn->type)) {\n#if LWIP_RAW\n  case NETCONN_RAW:\n    msg->conn->pcb.raw = raw_new_ip_type(iptype, msg->msg.n.proto);\n    if (msg->conn->pcb.raw != NULL) {\n#if LWIP_IPV6\n      /* ICMPv6 packets should always have checksum calculated by the stack as per RFC 3542 chapter 3.1 */\n      if (NETCONNTYPE_ISIPV6(msg->conn->type) && msg->conn->pcb.raw->protocol == IP6_NEXTH_ICMP6) {\n        msg->conn->pcb.raw->chksum_reqd = 1;\n        msg->conn->pcb.raw->chksum_offset = 2;\n      }\n#endif /* LWIP_IPV6 */\n      raw_recv(msg->conn->pcb.raw, recv_raw, msg->conn);\n    }\n    break;\n#endif /* LWIP_RAW */\n#if LWIP_UDP\n  case NETCONN_UDP:\n    msg->conn->pcb.udp = udp_new_ip_type(iptype);\n    if (msg->conn->pcb.udp != NULL) {\n#if LWIP_UDPLITE\n      if (NETCONNTYPE_ISUDPLITE(msg->conn->type)) {\n        udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_UDPLITE);\n      }\n#endif /* LWIP_UDPLITE */\n      if (NETCONNTYPE_ISUDPNOCHKSUM(msg->conn->type)) {\n        udp_setflags(msg->conn->pcb.udp, UDP_FLAGS_NOCHKSUM);\n      }\n      udp_recv(msg->conn->pcb.udp, recv_udp, msg->conn);\n    }\n    break;\n#endif /* LWIP_UDP */\n#if LWIP_TCP\n  case NETCONN_TCP:\n    msg->conn->pcb.tcp = tcp_new_ip_type(iptype);\n    if (msg->conn->pcb.tcp != NULL) {\n      setup_tcp(msg->conn);\n    }\n    break;\n#endif /* LWIP_TCP */\n  default:\n    /* Unsupported netconn type, e.g. protocol disabled */\n    msg->err = ERR_VAL;\n    return;\n  }\n  if (msg->conn->pcb.ip == NULL) {\n    msg->err = ERR_MEM;\n  }\n}\n\n/**\n * Create a new pcb of a specific type inside a netconn.\n * Called from netconn_new_with_proto_and_callback.\n *\n * @param m the api_msg_msg describing the connection type\n */\nvoid\nlwip_netconn_do_newconn(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  msg->err = ERR_OK;\n  if (msg->conn->pcb.tcp == NULL) {\n    pcb_new(msg);\n  }\n  /* Else? This \"new\" connection already has a PCB allocated. */\n  /* Is this an error condition? Should it be deleted? */\n  /* We currently just are happy and return. */\n\n  TCPIP_APIMSG_ACK(msg);\n}\n\n/**\n * Create a new netconn (of a specific type) that has a callback function.\n * The corresponding pcb is NOT created!\n *\n * @param t the type of 'connection' to create (@see enum netconn_type)\n * @param callback a function to call on status changes (RX available, TX'ed)\n * @return a newly allocated struct netconn or\n *         NULL on memory error\n */\nstruct netconn*\nnetconn_alloc(enum netconn_type t, netconn_callback callback)\n{\n  struct netconn *conn;\n  int size;\n\n  conn = (struct netconn *)memp_malloc(MEMP_NETCONN);\n  if (conn == NULL) {\n    return NULL;\n  }\n\n  conn->last_err = ERR_OK;\n  conn->type = t;\n  conn->pcb.tcp = NULL;\n\n  /* If all sizes are the same, every compiler should optimize this switch to nothing */\n  switch(NETCONNTYPE_GROUP(t)) {\n#if LWIP_RAW\n  case NETCONN_RAW:\n    size = DEFAULT_RAW_RECVMBOX_SIZE;\n    break;\n#endif /* LWIP_RAW */\n#if LWIP_UDP\n  case NETCONN_UDP:\n    size = DEFAULT_UDP_RECVMBOX_SIZE;\n    break;\n#endif /* LWIP_UDP */\n#if LWIP_TCP\n  case NETCONN_TCP:\n    size = DEFAULT_TCP_RECVMBOX_SIZE;\n    break;\n#endif /* LWIP_TCP */\n  default:\n    LWIP_ASSERT(\"netconn_alloc: undefined netconn_type\", 0);\n    goto free_and_return;\n  }\n\n  if (sys_mbox_new(&conn->recvmbox, size) != ERR_OK) {\n    goto free_and_return;\n  }\n#if !LWIP_NETCONN_SEM_PER_THREAD\n  if (sys_sem_new(&conn->op_completed, 0) != ERR_OK) {\n    sys_mbox_free(&conn->recvmbox);\n    goto free_and_return;\n  }\n#endif\n\n#if LWIP_TCP\n  sys_mbox_set_invalid(&conn->acceptmbox);\n#endif\n  conn->state        = NETCONN_NONE;\n#if LWIP_SOCKET\n  /* initialize socket to -1 since 0 is a valid socket */\n  conn->socket       = -1;\n#endif /* LWIP_SOCKET */\n  conn->callback     = callback;\n#if LWIP_TCP\n  conn->current_msg  = NULL;\n  conn->write_offset = 0;\n#endif /* LWIP_TCP */\n#if LWIP_SO_SNDTIMEO\n  conn->send_timeout = 0;\n#endif /* LWIP_SO_SNDTIMEO */\n#if LWIP_SO_RCVTIMEO\n  conn->recv_timeout = 0;\n#endif /* LWIP_SO_RCVTIMEO */\n#if LWIP_SO_RCVBUF\n  conn->recv_bufsize = RECV_BUFSIZE_DEFAULT;\n  conn->recv_avail   = 0;\n#endif /* LWIP_SO_RCVBUF */\n#if LWIP_SO_LINGER\n  conn->linger = -1;\n#endif /* LWIP_SO_LINGER */\n  conn->flags = 0;\n  return conn;\nfree_and_return:\n  memp_free(MEMP_NETCONN, conn);\n  return NULL;\n}\n\n/**\n * Delete a netconn and all its resources.\n * The pcb is NOT freed (since we might not be in the right thread context do this).\n *\n * @param conn the netconn to free\n */\nvoid\nnetconn_free(struct netconn *conn)\n{\n  LWIP_ASSERT(\"PCB must be deallocated outside this function\", conn->pcb.tcp == NULL);\n  LWIP_ASSERT(\"recvmbox must be deallocated before calling this function\",\n    !sys_mbox_valid(&conn->recvmbox));\n#if LWIP_TCP\n  LWIP_ASSERT(\"acceptmbox must be deallocated before calling this function\",\n    !sys_mbox_valid(&conn->acceptmbox));\n#endif /* LWIP_TCP */\n\n#if !LWIP_NETCONN_SEM_PER_THREAD\n  sys_sem_free(&conn->op_completed);\n  sys_sem_set_invalid(&conn->op_completed);\n#endif\n\n  memp_free(MEMP_NETCONN, conn);\n}\n\n/**\n * Delete rcvmbox and acceptmbox of a netconn and free the left-over data in\n * these mboxes\n *\n * @param conn the netconn to free\n * @bytes_drained bytes drained from recvmbox\n * @accepts_drained pending connections drained from acceptmbox\n */\nstatic void\nnetconn_drain(struct netconn *conn)\n{\n  void *mem;\n#if LWIP_TCP\n  struct pbuf *p;\n#endif /* LWIP_TCP */\n\n  /* This runs in tcpip_thread, so we don't need to lock against rx packets */\n\n  /* Delete and drain the recvmbox. */\n  if (sys_mbox_valid(&conn->recvmbox)) {\n    while (sys_mbox_tryfetch(&conn->recvmbox, &mem) != SYS_MBOX_EMPTY) {\n#if LWIP_TCP\n      if (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) {\n        if (mem != NULL) {\n          p = (struct pbuf*)mem;\n          /* pcb might be set to NULL already by err_tcp() */\n          if (conn->pcb.tcp != NULL) {\n            tcp_recved(conn->pcb.tcp, p->tot_len);\n          }\n          pbuf_free(p);\n        }\n      } else\n#endif /* LWIP_TCP */\n      {\n        netbuf_delete((struct netbuf *)mem);\n      }\n    }\n    sys_mbox_free(&conn->recvmbox);\n    sys_mbox_set_invalid(&conn->recvmbox);\n  }\n\n  /* Delete and drain the acceptmbox. */\n#if LWIP_TCP\n  if (sys_mbox_valid(&conn->acceptmbox)) {\n    while (sys_mbox_tryfetch(&conn->acceptmbox, &mem) != SYS_MBOX_EMPTY) {\n      if (mem != &netconn_aborted) {\n        struct netconn *newconn = (struct netconn *)mem;\n        /* Only tcp pcbs have an acceptmbox, so no need to check conn->type */\n        /* pcb might be set to NULL already by err_tcp() */\n        /* drain recvmbox */\n        netconn_drain(newconn);\n        if (newconn->pcb.tcp != NULL) {\n          tcp_abort(newconn->pcb.tcp);\n          newconn->pcb.tcp = NULL;\n        }\n        netconn_free(newconn);\n      }\n    }\n    sys_mbox_free(&conn->acceptmbox);\n    sys_mbox_set_invalid(&conn->acceptmbox);\n  }\n#endif /* LWIP_TCP */\n}\n\n#if LWIP_TCP\n/**\n * Internal helper function to close a TCP netconn: since this sometimes\n * doesn't work at the first attempt, this function is called from multiple\n * places.\n *\n * @param conn the TCP netconn to close\n */\nstatic err_t\nlwip_netconn_do_close_internal(struct netconn *conn  WRITE_DELAYED_PARAM)\n{\n  err_t err;\n  u8_t shut, shut_rx, shut_tx, close;\n  u8_t close_finished = 0;\n  struct tcp_pcb* tpcb;\n#if LWIP_SO_LINGER\n  u8_t linger_wait_required = 0;\n#endif /* LWIP_SO_LINGER */\n\n  LWIP_ASSERT(\"invalid conn\", (conn != NULL));\n  LWIP_ASSERT(\"this is for tcp netconns only\", (NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP));\n  LWIP_ASSERT(\"conn must be in state NETCONN_CLOSE\", (conn->state == NETCONN_CLOSE));\n  LWIP_ASSERT(\"pcb already closed\", (conn->pcb.tcp != NULL));\n  LWIP_ASSERT(\"conn->current_msg != NULL\", conn->current_msg != NULL);\n\n  tpcb = conn->pcb.tcp;\n  shut = conn->current_msg->msg.sd.shut;\n  shut_rx = shut & NETCONN_SHUT_RD;\n  shut_tx = shut & NETCONN_SHUT_WR;\n  /* shutting down both ends is the same as closing\n     (also if RD or WR side was shut down before already) */\n  if (shut == NETCONN_SHUT_RDWR) {\n    close = 1;\n  } else if (shut_rx &&\n             ((tpcb->state == FIN_WAIT_1) ||\n              (tpcb->state == FIN_WAIT_2) ||\n              (tpcb->state == CLOSING))) {\n    close = 1;\n  } else if (shut_tx && ((tpcb->flags & TF_RXCLOSED) != 0)) {\n    close = 1;\n  } else {\n    close = 0;\n  }\n\n  /* Set back some callback pointers */\n  if (close) {\n    tcp_arg(tpcb, NULL);\n  }\n  if (tpcb->state == LISTEN) {\n    tcp_accept(tpcb, NULL);\n  } else {\n    /* some callbacks have to be reset if tcp_close is not successful */\n    if (shut_rx) {\n      tcp_recv(tpcb, NULL);\n      tcp_accept(tpcb, NULL);\n    }\n    if (shut_tx) {\n      tcp_sent(tpcb, NULL);\n    }\n    if (close) {\n      tcp_poll(tpcb, NULL, 0);\n      tcp_err(tpcb, NULL);\n    }\n  }\n  /* Try to close the connection */\n  if (close) {\n#if LWIP_SO_LINGER\n    /* check linger possibilites before calling tcp_close */\n    err = ERR_OK;\n    /* linger enabled/required at all? (i.e. is there untransmitted data left?) */\n    if ((conn->linger >= 0) && (conn->pcb.tcp->unsent || conn->pcb.tcp->unacked)) {\n      if ((conn->linger == 0)) {\n        /* data left but linger prevents waiting */\n        tcp_abort(tpcb);\n        tpcb = NULL;\n      } else if (conn->linger > 0) {\n        /* data left and linger says we should wait */\n        if (netconn_is_nonblocking(conn)) {\n          /* data left on a nonblocking netconn -> cannot linger */\n          err = ERR_WOULDBLOCK;\n        } else if ((s32_t)(sys_now() - conn->current_msg->msg.sd.time_started) >=\n          (conn->linger * 1000)) {\n          /* data left but linger timeout has expired (this happens on further\n             calls to this function through poll_tcp */\n          tcp_abort(tpcb);\n          tpcb = NULL;\n        } else {\n          /* data left -> need to wait for ACK after successful close */\n          linger_wait_required = 1;\n        }\n      }\n    }\n    if ((err == ERR_OK) && (tpcb != NULL))\n#endif /* LWIP_SO_LINGER */\n    {\n      err = tcp_close(tpcb);\n    }\n  } else {\n    err = tcp_shutdown(tpcb, shut_rx, shut_tx);\n  }\n  if (err == ERR_OK) {\n    close_finished = 1;\n#if LWIP_SO_LINGER\n    if (linger_wait_required) {\n      /* wait for ACK of all unsent/unacked data by just getting called again */\n      close_finished = 0;\n      err = ERR_INPROGRESS;\n    }\n#endif /* LWIP_SO_LINGER */\n  } else {\n    if (err == ERR_MEM) {\n      /* Closing failed because of memory shortage, try again later. Even for\n         nonblocking netconns, we have to wait since no standard socket application\n         is prepared for close failing because of resource shortage.\n         Check the timeout: this is kind of an lwip addition to the standard sockets:\n         we wait for some time when failing to allocate a segment for the FIN */\n#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER\n      s32_t close_timeout = LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT;\n#if LWIP_SO_SNDTIMEO\n      if (conn->send_timeout > 0) {\n        close_timeout = conn->send_timeout;\n      }\n#endif /* LWIP_SO_SNDTIMEO */\n#if LWIP_SO_LINGER\n      if (conn->linger >= 0) {\n        /* use linger timeout (seconds) */\n        close_timeout = conn->linger * 1000U;\n      }\n#endif\n      if ((s32_t)(sys_now() - conn->current_msg->msg.sd.time_started) >= close_timeout) {\n#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */\n      if (conn->current_msg->msg.sd.polls_left == 0) {\n#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */\n        close_finished = 1;\n        if (close) {\n          /* in this case, we want to RST the connection */\n          tcp_abort(tpcb);\n          err = ERR_OK;\n        }\n      }\n    } else {\n      /* Closing failed for a non-memory error: give up */\n      close_finished = 1;\n    }\n  }\n  if (close_finished) {\n    /* Closing done (succeeded, non-memory error, nonblocking error or timeout) */\n    sys_sem_t* op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);\n    conn->current_msg->err = err;\n    conn->current_msg = NULL;\n    conn->state = NETCONN_NONE;\n    if (err == ERR_OK) {\n      if (close) {\n        /* Set back some callback pointers as conn is going away */\n        conn->pcb.tcp = NULL;\n        /* Trigger select() in socket layer. Make sure everybody notices activity\n         on the connection, error first! */\n        API_EVENT(conn, NETCONN_EVT_ERROR, 0);\n      }\n      if (shut_rx) {\n        API_EVENT(conn, NETCONN_EVT_RCVPLUS, 0);\n      }\n      if (shut_tx) {\n        API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);\n      }\n    }\n    NETCONN_SET_SAFE_ERR(conn, err);\n#if LWIP_TCPIP_CORE_LOCKING\n    if (delayed)\n#endif\n    {\n      /* wake up the application task */\n      sys_sem_signal(op_completed_sem);\n    }\n    return ERR_OK;\n  }\n  if (!close_finished) {\n    /* Closing failed and we want to wait: restore some of the callbacks */\n    /* Closing of listen pcb will never fail! */\n    LWIP_ASSERT(\"Closing a listen pcb may not fail!\", (tpcb->state != LISTEN));\n    if (shut_tx) {\n      tcp_sent(tpcb, sent_tcp);\n    }\n    /* when waiting for close, set up poll interval to 500ms */\n    tcp_poll(tpcb, poll_tcp, 1);\n    tcp_err(tpcb, err_tcp);\n    tcp_arg(tpcb, conn);\n    /* don't restore recv callback: we don't want to receive any more data */\n  }\n  /* If closing didn't succeed, we get called again either\n     from poll_tcp or from sent_tcp */\n  LWIP_ASSERT(\"err != ERR_OK\", err != ERR_OK);\n  return err;\n}\n#endif /* LWIP_TCP */\n\n/**\n * Delete the pcb inside a netconn.\n * Called from netconn_delete.\n *\n * @param m the api_msg_msg pointing to the connection\n */\nvoid\nlwip_netconn_do_delconn(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  enum netconn_state state = msg->conn->state;\n  LWIP_ASSERT(\"netconn state error\", /* this only happens for TCP netconns */\n    (state == NETCONN_NONE) || (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP));\n#if LWIP_NETCONN_FULLDUPLEX\n  /* In full duplex mode, blocking write/connect is aborted with ERR_CLSD */\n  if (state != NETCONN_NONE) {\n    if ((state == NETCONN_WRITE) ||\n        ((state == NETCONN_CONNECT) && !IN_NONBLOCKING_CONNECT(msg->conn))) {\n      /* close requested, abort running write/connect */\n      sys_sem_t* op_completed_sem;\n      LWIP_ASSERT(\"msg->conn->current_msg != NULL\", msg->conn->current_msg != NULL);\n      op_completed_sem = LWIP_API_MSG_SEM(msg->conn->current_msg);\n      msg->conn->current_msg->err = ERR_CLSD;\n      msg->conn->current_msg = NULL;\n      msg->conn->write_offset = 0;\n      msg->conn->state = NETCONN_NONE;\n      NETCONN_SET_SAFE_ERR(msg->conn, ERR_CLSD);\n      sys_sem_signal(op_completed_sem);\n    }\n  }\n#else /* LWIP_NETCONN_FULLDUPLEX */\n  if (((state != NETCONN_NONE) &&\n       (state != NETCONN_LISTEN) &&\n       (state != NETCONN_CONNECT)) ||\n      ((state == NETCONN_CONNECT) && !IN_NONBLOCKING_CONNECT(msg->conn))) {\n    /* This means either a blocking write or blocking connect is running\n       (nonblocking write returns and sets state to NONE) */\n    msg->err = ERR_INPROGRESS;\n  } else\n#endif /* LWIP_NETCONN_FULLDUPLEX */\n  {\n    LWIP_ASSERT(\"blocking connect in progress\",\n      (state != NETCONN_CONNECT) || IN_NONBLOCKING_CONNECT(msg->conn));\n    msg->err = ERR_OK;\n    /* Drain and delete mboxes */\n    netconn_drain(msg->conn);\n\n    if (msg->conn->pcb.tcp != NULL) {\n\n      switch (NETCONNTYPE_GROUP(msg->conn->type)) {\n#if LWIP_RAW\n      case NETCONN_RAW:\n        raw_remove(msg->conn->pcb.raw);\n        break;\n#endif /* LWIP_RAW */\n#if LWIP_UDP\n      case NETCONN_UDP:\n        msg->conn->pcb.udp->recv_arg = NULL;\n        udp_remove(msg->conn->pcb.udp);\n        break;\n#endif /* LWIP_UDP */\n#if LWIP_TCP\n      case NETCONN_TCP:\n        LWIP_ASSERT(\"already writing or closing\", msg->conn->current_msg == NULL &&\n          msg->conn->write_offset == 0);\n        msg->conn->state = NETCONN_CLOSE;\n        msg->msg.sd.shut = NETCONN_SHUT_RDWR;\n        msg->conn->current_msg = msg;\n#if LWIP_TCPIP_CORE_LOCKING\n        if (lwip_netconn_do_close_internal(msg->conn, 0) != ERR_OK) {\n          LWIP_ASSERT(\"state!\", msg->conn->state == NETCONN_CLOSE);\n          UNLOCK_TCPIP_CORE();\n          sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);\n          LOCK_TCPIP_CORE();\n          LWIP_ASSERT(\"state!\", msg->conn->state == NETCONN_NONE);\n        }\n#else /* LWIP_TCPIP_CORE_LOCKING */\n        lwip_netconn_do_close_internal(msg->conn);\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n        /* API_EVENT is called inside lwip_netconn_do_close_internal, before releasing\n           the application thread, so we can return at this point! */\n        return;\n#endif /* LWIP_TCP */\n      default:\n        break;\n      }\n      msg->conn->pcb.tcp = NULL;\n    }\n    /* tcp netconns don't come here! */\n\n    /* @todo: this lets select make the socket readable and writable,\n       which is wrong! errfd instead? */\n    API_EVENT(msg->conn, NETCONN_EVT_RCVPLUS, 0);\n    API_EVENT(msg->conn, NETCONN_EVT_SENDPLUS, 0);\n  }\n  if (sys_sem_valid(LWIP_API_MSG_SEM(msg))) {\n    TCPIP_APIMSG_ACK(msg);\n  }\n}\n\n/**\n * Bind a pcb contained in a netconn\n * Called from netconn_bind.\n *\n * @param m the api_msg_msg pointing to the connection and containing\n *          the IP address and port to bind to\n */\nvoid\nlwip_netconn_do_bind(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  if (ERR_IS_FATAL(msg->conn->last_err)) {\n    msg->err = msg->conn->last_err;\n  } else {\n    msg->err = ERR_VAL;\n    if (msg->conn->pcb.tcp != NULL) {\n      switch (NETCONNTYPE_GROUP(msg->conn->type)) {\n#if LWIP_RAW\n      case NETCONN_RAW:\n        msg->err = raw_bind(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr));\n        break;\n#endif /* LWIP_RAW */\n#if LWIP_UDP\n      case NETCONN_UDP:\n        msg->err = udp_bind(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port);\n        break;\n#endif /* LWIP_UDP */\n#if LWIP_TCP\n      case NETCONN_TCP:\n        msg->err = tcp_bind(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port);\n        break;\n#endif /* LWIP_TCP */\n      default:\n        break;\n      }\n    }\n  }\n  TCPIP_APIMSG_ACK(msg);\n}\n\n#if LWIP_TCP\n/**\n * TCP callback function if a connection (opened by tcp_connect/lwip_netconn_do_connect) has\n * been established (or reset by the remote host).\n *\n * @see tcp.h (struct tcp_pcb.connected) for parameters and return values\n */\nstatic err_t\nlwip_netconn_do_connected(void *arg, struct tcp_pcb *pcb, err_t err)\n{\n  struct netconn *conn;\n  int was_blocking;\n  sys_sem_t* op_completed_sem = NULL;\n\n  LWIP_UNUSED_ARG(pcb);\n\n  conn = (struct netconn *)arg;\n\n  if (conn == NULL) {\n    return ERR_VAL;\n  }\n\n  LWIP_ASSERT(\"conn->state == NETCONN_CONNECT\", conn->state == NETCONN_CONNECT);\n  LWIP_ASSERT(\"(conn->current_msg != NULL) || conn->in_non_blocking_connect\",\n    (conn->current_msg != NULL) || IN_NONBLOCKING_CONNECT(conn));\n\n  if (conn->current_msg != NULL) {\n    conn->current_msg->err = err;\n    op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);\n  }\n  if ((NETCONNTYPE_GROUP(conn->type) == NETCONN_TCP) && (err == ERR_OK)) {\n    setup_tcp(conn);\n  }\n  was_blocking = !IN_NONBLOCKING_CONNECT(conn);\n  SET_NONBLOCKING_CONNECT(conn, 0);\n  LWIP_ASSERT(\"blocking connect state error\",\n    (was_blocking && op_completed_sem != NULL) ||\n    (!was_blocking && op_completed_sem == NULL));\n  conn->current_msg = NULL;\n  conn->state = NETCONN_NONE;\n  NETCONN_SET_SAFE_ERR(conn, ERR_OK);\n  API_EVENT(conn, NETCONN_EVT_SENDPLUS, 0);\n\n  if (was_blocking) {\n    sys_sem_signal(op_completed_sem);\n  }\n  return ERR_OK;\n}\n#endif /* LWIP_TCP */\n\n/**\n * Connect a pcb contained inside a netconn\n * Called from netconn_connect.\n *\n * @param m the api_msg_msg pointing to the connection and containing\n *          the IP address and port to connect to\n */\nvoid\nlwip_netconn_do_connect(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  if (msg->conn->pcb.tcp == NULL) {\n    /* This may happen when calling netconn_connect() a second time */\n    msg->err = ERR_CLSD;\n  } else {\n    switch (NETCONNTYPE_GROUP(msg->conn->type)) {\n#if LWIP_RAW\n    case NETCONN_RAW:\n      msg->err = raw_connect(msg->conn->pcb.raw, API_EXPR_REF(msg->msg.bc.ipaddr));\n      break;\n#endif /* LWIP_RAW */\n#if LWIP_UDP\n    case NETCONN_UDP:\n      msg->err = udp_connect(msg->conn->pcb.udp, API_EXPR_REF(msg->msg.bc.ipaddr), msg->msg.bc.port);\n      break;\n#endif /* LWIP_UDP */\n#if LWIP_TCP\n    case NETCONN_TCP:\n      /* Prevent connect while doing any other action. */\n      if (msg->conn->state == NETCONN_CONNECT) {\n        msg->err = ERR_ALREADY;\n      } else if (msg->conn->state != NETCONN_NONE) {\n        msg->err = ERR_ISCONN;\n      } else {\n        setup_tcp(msg->conn);\n        msg->err = tcp_connect(msg->conn->pcb.tcp, API_EXPR_REF(msg->msg.bc.ipaddr),\n          msg->msg.bc.port, lwip_netconn_do_connected);\n        if (msg->err == ERR_OK) {\n          u8_t non_blocking = netconn_is_nonblocking(msg->conn);\n          msg->conn->state = NETCONN_CONNECT;\n          SET_NONBLOCKING_CONNECT(msg->conn, non_blocking);\n          if (non_blocking) {\n            msg->err = ERR_INPROGRESS;\n          } else {\n            msg->conn->current_msg = msg;\n            /* sys_sem_signal() is called from lwip_netconn_do_connected (or err_tcp()),\n               when the connection is established! */\n#if LWIP_TCPIP_CORE_LOCKING\n            LWIP_ASSERT(\"state!\", msg->conn->state == NETCONN_CONNECT);\n            UNLOCK_TCPIP_CORE();\n            sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);\n            LOCK_TCPIP_CORE();\n            LWIP_ASSERT(\"state!\", msg->conn->state != NETCONN_CONNECT);\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n            return;\n          }\n        }\n      }\n      break;\n#endif /* LWIP_TCP */\n    default:\n      LWIP_ERROR(\"Invalid netconn type\", 0, do{ msg->err = ERR_VAL; }while(0));\n      break;\n    }\n  }\n  /* For all other protocols, netconn_connect() calls TCPIP_APIMSG(),\n     so use TCPIP_APIMSG_ACK() here. */\n  TCPIP_APIMSG_ACK(msg);\n}\n\n/**\n * Disconnect a pcb contained inside a netconn\n * Only used for UDP netconns.\n * Called from netconn_disconnect.\n *\n * @param m the api_msg_msg pointing to the connection to disconnect\n */\nvoid\nlwip_netconn_do_disconnect(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n#if LWIP_UDP\n  if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) {\n    udp_disconnect(msg->conn->pcb.udp);\n    msg->err = ERR_OK;\n  } else\n#endif /* LWIP_UDP */\n  {\n    msg->err = ERR_VAL;\n  }\n  TCPIP_APIMSG_ACK(msg);\n}\n\n#if LWIP_TCP\n/**\n * Set a TCP pcb contained in a netconn into listen mode\n * Called from netconn_listen.\n *\n * @param m the api_msg_msg pointing to the connection\n */\nvoid\nlwip_netconn_do_listen(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  if (ERR_IS_FATAL(msg->conn->last_err)) {\n    msg->err = msg->conn->last_err;\n  } else {\n    msg->err = ERR_CONN;\n    if (msg->conn->pcb.tcp != NULL) {\n      if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {\n        if (msg->conn->state == NETCONN_NONE) {\n          struct tcp_pcb* lpcb;\n          if (msg->conn->pcb.tcp->state != CLOSED) {\n            /* connection is not closed, cannot listen */\n            msg->err = ERR_VAL;\n          } else {\n            err_t err;\n            u8_t backlog;\n#if TCP_LISTEN_BACKLOG\n            backlog = msg->msg.lb.backlog;\n#else  /* TCP_LISTEN_BACKLOG */\n            backlog = TCP_DEFAULT_LISTEN_BACKLOG;\n#endif /* TCP_LISTEN_BACKLOG */\n#if LWIP_IPV4 && LWIP_IPV6\n            /* \"Socket API like\" dual-stack support: If IP to listen to is IP6_ADDR_ANY,\n             * and NETCONN_FLAG_IPV6_V6ONLY is NOT set, use IP_ANY_TYPE to listen\n             */\n            if (ip_addr_cmp(&msg->conn->pcb.ip->local_ip, IP6_ADDR_ANY) &&\n                (netconn_get_ipv6only(msg->conn) == 0)) {\n              /* change PCB type to IPADDR_TYPE_ANY */\n              IP_SET_TYPE_VAL(msg->conn->pcb.tcp->local_ip,  IPADDR_TYPE_ANY);\n              IP_SET_TYPE_VAL(msg->conn->pcb.tcp->remote_ip, IPADDR_TYPE_ANY);\n            }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n            lpcb = tcp_listen_with_backlog_and_err(msg->conn->pcb.tcp, backlog, &err);\n\n            if (lpcb == NULL) {\n              /* in this case, the old pcb is still allocated */\n              msg->err = err;\n            } else {\n              /* delete the recvmbox and allocate the acceptmbox */\n              if (sys_mbox_valid(&msg->conn->recvmbox)) {\n                /** @todo: should we drain the recvmbox here? */\n                sys_mbox_free(&msg->conn->recvmbox);\n                sys_mbox_set_invalid(&msg->conn->recvmbox);\n              }\n              msg->err = ERR_OK;\n              if (!sys_mbox_valid(&msg->conn->acceptmbox)) {\n                msg->err = sys_mbox_new(&msg->conn->acceptmbox, DEFAULT_ACCEPTMBOX_SIZE);\n              }\n              if (msg->err == ERR_OK) {\n                msg->conn->state = NETCONN_LISTEN;\n                msg->conn->pcb.tcp = lpcb;\n                tcp_arg(msg->conn->pcb.tcp, msg->conn);\n                tcp_accept(msg->conn->pcb.tcp, accept_function);\n              } else {\n                /* since the old pcb is already deallocated, free lpcb now */\n                tcp_close(lpcb);\n                msg->conn->pcb.tcp = NULL;\n              }\n            }\n          }\n        } else if (msg->conn->state == NETCONN_LISTEN) {\n          /* already listening, allow updating of the backlog */\n          msg->err = ERR_OK;\n          tcp_backlog_set(msg->conn->pcb.tcp, msg->msg.lb.backlog);\n        }\n      } else {\n        msg->err = ERR_ARG;\n      }\n    }\n  }\n  TCPIP_APIMSG_ACK(msg);\n}\n#endif /* LWIP_TCP */\n\n/**\n * Send some data on a RAW or UDP pcb contained in a netconn\n * Called from netconn_send\n *\n * @param m the api_msg_msg pointing to the connection\n */\nvoid\nlwip_netconn_do_send(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  if (ERR_IS_FATAL(msg->conn->last_err)) {\n    msg->err = msg->conn->last_err;\n  } else {\n    msg->err = ERR_CONN;\n    if (msg->conn->pcb.tcp != NULL) {\n      switch (NETCONNTYPE_GROUP(msg->conn->type)) {\n#if LWIP_RAW\n      case NETCONN_RAW:\n        if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {\n          msg->err = raw_send(msg->conn->pcb.raw, msg->msg.b->p);\n        } else {\n          msg->err = raw_sendto(msg->conn->pcb.raw, msg->msg.b->p, &msg->msg.b->addr);\n        }\n        break;\n#endif\n#if LWIP_UDP\n      case NETCONN_UDP:\n#if LWIP_CHECKSUM_ON_COPY\n        if (ip_addr_isany(&msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {\n          msg->err = udp_send_chksum(msg->conn->pcb.udp, msg->msg.b->p,\n            msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum);\n        } else {\n          msg->err = udp_sendto_chksum(msg->conn->pcb.udp, msg->msg.b->p,\n            &msg->msg.b->addr, msg->msg.b->port,\n            msg->msg.b->flags & NETBUF_FLAG_CHKSUM, msg->msg.b->toport_chksum);\n        }\n#else /* LWIP_CHECKSUM_ON_COPY */\n        if (ip_addr_isany_val(msg->msg.b->addr) || IP_IS_ANY_TYPE_VAL(msg->msg.b->addr)) {\n          msg->err = udp_send(msg->conn->pcb.udp, msg->msg.b->p);\n        } else {\n          msg->err = udp_sendto(msg->conn->pcb.udp, msg->msg.b->p, &msg->msg.b->addr, msg->msg.b->port);\n        }\n#endif /* LWIP_CHECKSUM_ON_COPY */\n        break;\n#endif /* LWIP_UDP */\n      default:\n        break;\n      }\n    }\n  }\n  TCPIP_APIMSG_ACK(msg);\n}\n\n#if LWIP_TCP\n/**\n * Indicate data has been received from a TCP pcb contained in a netconn\n * Called from netconn_recv\n *\n * @param m the api_msg_msg pointing to the connection\n */\nvoid\nlwip_netconn_do_recv(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  msg->err = ERR_OK;\n  if (msg->conn->pcb.tcp != NULL) {\n    if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {\n      u32_t remaining = msg->msg.r.len;\n      do {\n        u16_t recved = (remaining > 0xffff) ? 0xffff : (u16_t)remaining;\n        tcp_recved(msg->conn->pcb.tcp, recved);\n        remaining -= recved;\n      } while (remaining != 0);\n    }\n  }\n  TCPIP_APIMSG_ACK(msg);\n}\n\n#if TCP_LISTEN_BACKLOG\n/** Indicate that a TCP pcb has been accepted\n * Called from netconn_accept\n *\n * @param m the api_msg_msg pointing to the connection\n */\nvoid\nlwip_netconn_do_accepted(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  msg->err = ERR_OK;\n  if (msg->conn->pcb.tcp != NULL) {\n    if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {\n      tcp_backlog_accepted(msg->conn->pcb.tcp);\n    }\n  }\n  TCPIP_APIMSG_ACK(msg);\n}\n#endif /* TCP_LISTEN_BACKLOG */\n\n/**\n * See if more data needs to be written from a previous call to netconn_write.\n * Called initially from lwip_netconn_do_write. If the first call can't send all data\n * (because of low memory or empty send-buffer), this function is called again\n * from sent_tcp() or poll_tcp() to send more data. If all data is sent, the\n * blocking application thread (waiting in netconn_write) is released.\n *\n * @param conn netconn (that is currently in state NETCONN_WRITE) to process\n * @return ERR_OK\n *         ERR_MEM if LWIP_TCPIP_CORE_LOCKING=1 and sending hasn't yet finished\n */\nstatic err_t\nlwip_netconn_do_writemore(struct netconn *conn  WRITE_DELAYED_PARAM)\n{\n  err_t err;\n  const void *dataptr;\n  u16_t len, available;\n  u8_t write_finished = 0;\n  size_t diff;\n  u8_t dontblock;\n  u8_t apiflags;\n\n  LWIP_ASSERT(\"conn != NULL\", conn != NULL);\n  LWIP_ASSERT(\"conn->state == NETCONN_WRITE\", (conn->state == NETCONN_WRITE));\n  LWIP_ASSERT(\"conn->current_msg != NULL\", conn->current_msg != NULL);\n  LWIP_ASSERT(\"conn->pcb.tcp != NULL\", conn->pcb.tcp != NULL);\n  LWIP_ASSERT(\"conn->write_offset < conn->current_msg->msg.w.len\",\n    conn->write_offset < conn->current_msg->msg.w.len);\n\n  apiflags = conn->current_msg->msg.w.apiflags;\n  dontblock = netconn_is_nonblocking(conn) || (apiflags & NETCONN_DONTBLOCK);\n\n#if LWIP_SO_SNDTIMEO\n  if ((conn->send_timeout != 0) &&\n      ((s32_t)(sys_now() - conn->current_msg->msg.w.time_started) >= conn->send_timeout)) {\n    write_finished = 1;\n    if (conn->write_offset == 0) {\n      /* nothing has been written */\n      err = ERR_WOULDBLOCK;\n      conn->current_msg->msg.w.len = 0;\n    } else {\n      /* partial write */\n      err = ERR_OK;\n      conn->current_msg->msg.w.len = conn->write_offset;\n      conn->write_offset = 0;\n    }\n  } else\n#endif /* LWIP_SO_SNDTIMEO */\n  {\n    dataptr = (const u8_t*)conn->current_msg->msg.w.dataptr + conn->write_offset;\n    diff = conn->current_msg->msg.w.len - conn->write_offset;\n    if (diff > 0xffffUL) { /* max_u16_t */\n      len = 0xffff;\n      apiflags |= TCP_WRITE_FLAG_MORE;\n    } else {\n      len = (u16_t)diff;\n    }\n    available = tcp_sndbuf(conn->pcb.tcp);\n    if (available < len) {\n      /* don't try to write more than sendbuf */\n      len = available;\n      if (dontblock) {\n        if (!len) {\n          err = ERR_WOULDBLOCK;\n          goto err_mem;\n        }\n      } else {\n        apiflags |= TCP_WRITE_FLAG_MORE;\n      }\n    }\n    LWIP_ASSERT(\"lwip_netconn_do_writemore: invalid length!\", ((conn->write_offset + len) <= conn->current_msg->msg.w.len));\n    err = tcp_write(conn->pcb.tcp, dataptr, len, apiflags);\n    /* if OK or memory error, check available space */\n    if ((err == ERR_OK) || (err == ERR_MEM)) {\nerr_mem:\n      if (dontblock && (len < conn->current_msg->msg.w.len)) {\n        /* non-blocking write did not write everything: mark the pcb non-writable\n           and let poll_tcp check writable space to mark the pcb writable again */\n        API_EVENT(conn, NETCONN_EVT_SENDMINUS, len);\n        conn->flags |= NETCONN_FLAG_CHECK_WRITESPACE;\n      } else if ((tcp_sndbuf(conn->pcb.tcp) <= TCP_SNDLOWAT) ||\n                 (tcp_sndqueuelen(conn->pcb.tcp) >= TCP_SNDQUEUELOWAT)) {\n        /* The queued byte- or pbuf-count exceeds the configured low-water limit,\n           let select mark this pcb as non-writable. */\n        API_EVENT(conn, NETCONN_EVT_SENDMINUS, len);\n      }\n    }\n\n    if (err == ERR_OK) {\n      err_t out_err;\n      conn->write_offset += len;\n      if ((conn->write_offset == conn->current_msg->msg.w.len) || dontblock) {\n        /* return sent length */\n        conn->current_msg->msg.w.len = conn->write_offset;\n        /* everything was written */\n        write_finished = 1;\n      }\n      out_err = tcp_output(conn->pcb.tcp);\n      if (ERR_IS_FATAL(out_err) || (out_err == ERR_RTE)) {\n        /* If tcp_output fails with fatal error or no route is found,\n           don't try writing any more but return the error\n           to the application thread. */\n        err = out_err;\n        write_finished = 1;\n        conn->current_msg->msg.w.len = 0;\n      }\n    } else if (err == ERR_MEM) {\n      /* If ERR_MEM, we wait for sent_tcp or poll_tcp to be called.\n         For blocking sockets, we do NOT return to the application\n         thread, since ERR_MEM is only a temporary error! Non-blocking\n         will remain non-writable until sent_tcp/poll_tcp is called */\n\n      /* tcp_write returned ERR_MEM, try tcp_output anyway */\n      err_t out_err = tcp_output(conn->pcb.tcp);\n      if (ERR_IS_FATAL(out_err) || (out_err == ERR_RTE)) {\n        /* If tcp_output fails with fatal error or no route is found,\n           don't try writing any more but return the error\n           to the application thread. */\n        err = out_err;\n        write_finished = 1;\n        conn->current_msg->msg.w.len = 0;\n      } else if (dontblock) {\n        /* non-blocking write is done on ERR_MEM */\n        err = ERR_WOULDBLOCK;\n        write_finished = 1;\n        conn->current_msg->msg.w.len = 0;\n      }\n    } else {\n      /* On errors != ERR_MEM, we don't try writing any more but return\n         the error to the application thread. */\n      write_finished = 1;\n      conn->current_msg->msg.w.len = 0;\n    }\n  }\n  if (write_finished) {\n    /* everything was written: set back connection state\n       and back to application task */\n    sys_sem_t* op_completed_sem = LWIP_API_MSG_SEM(conn->current_msg);\n    conn->current_msg->err = err;\n    conn->current_msg = NULL;\n    conn->write_offset = 0;\n    conn->state = NETCONN_NONE;\n    NETCONN_SET_SAFE_ERR(conn, err);\n#if LWIP_TCPIP_CORE_LOCKING\n    if (delayed)\n#endif\n    {\n      sys_sem_signal(op_completed_sem);\n    }\n  }\n#if LWIP_TCPIP_CORE_LOCKING\n  else {\n    return ERR_MEM;\n  }\n#endif\n  return ERR_OK;\n}\n#endif /* LWIP_TCP */\n\n/**\n * Send some data on a TCP pcb contained in a netconn\n * Called from netconn_write\n *\n * @param m the api_msg_msg pointing to the connection\n */\nvoid\nlwip_netconn_do_write(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  if (ERR_IS_FATAL(msg->conn->last_err)) {\n    msg->err = msg->conn->last_err;\n  } else {\n    if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) {\n#if LWIP_TCP\n      if (msg->conn->state != NETCONN_NONE) {\n        /* netconn is connecting, closing or in blocking write */\n        msg->err = ERR_INPROGRESS;\n      } else if (msg->conn->pcb.tcp != NULL) {\n        msg->conn->state = NETCONN_WRITE;\n        /* set all the variables used by lwip_netconn_do_writemore */\n        LWIP_ASSERT(\"already writing or closing\", msg->conn->current_msg == NULL &&\n          msg->conn->write_offset == 0);\n        LWIP_ASSERT(\"msg->msg.w.len != 0\", msg->msg.w.len != 0);\n        msg->conn->current_msg = msg;\n        msg->conn->write_offset = 0;\n#if LWIP_TCPIP_CORE_LOCKING\n        if (lwip_netconn_do_writemore(msg->conn, 0) != ERR_OK) {\n          LWIP_ASSERT(\"state!\", msg->conn->state == NETCONN_WRITE);\n          UNLOCK_TCPIP_CORE();\n          sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);\n          LOCK_TCPIP_CORE();\n          LWIP_ASSERT(\"state!\", msg->conn->state != NETCONN_WRITE);\n        }\n#else /* LWIP_TCPIP_CORE_LOCKING */\n        lwip_netconn_do_writemore(msg->conn);\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n        /* for both cases: if lwip_netconn_do_writemore was called, don't ACK the APIMSG\n           since lwip_netconn_do_writemore ACKs it! */\n        return;\n      } else {\n        msg->err = ERR_CONN;\n      }\n#else /* LWIP_TCP */\n      msg->err = ERR_VAL;\n#endif /* LWIP_TCP */\n#if (LWIP_UDP || LWIP_RAW)\n    } else {\n      msg->err = ERR_VAL;\n#endif /* (LWIP_UDP || LWIP_RAW) */\n    }\n  }\n  TCPIP_APIMSG_ACK(msg);\n}\n\n/**\n * Return a connection's local or remote address\n * Called from netconn_getaddr\n *\n * @param m the api_msg_msg pointing to the connection\n */\nvoid\nlwip_netconn_do_getaddr(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  if (msg->conn->pcb.ip != NULL) {\n    if (msg->msg.ad.local) {\n      ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr),\n        msg->conn->pcb.ip->local_ip);\n    } else {\n      ip_addr_copy(API_EXPR_DEREF(msg->msg.ad.ipaddr),\n        msg->conn->pcb.ip->remote_ip);\n    }\n\n    msg->err = ERR_OK;\n    switch (NETCONNTYPE_GROUP(msg->conn->type)) {\n#if LWIP_RAW\n    case NETCONN_RAW:\n      if (msg->msg.ad.local) {\n        API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.raw->protocol;\n      } else {\n        /* return an error as connecting is only a helper for upper layers */\n        msg->err = ERR_CONN;\n      }\n      break;\n#endif /* LWIP_RAW */\n#if LWIP_UDP\n    case NETCONN_UDP:\n      if (msg->msg.ad.local) {\n        API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->local_port;\n      } else {\n        if ((msg->conn->pcb.udp->flags & UDP_FLAGS_CONNECTED) == 0) {\n          msg->err = ERR_CONN;\n        } else {\n          API_EXPR_DEREF(msg->msg.ad.port) = msg->conn->pcb.udp->remote_port;\n        }\n      }\n      break;\n#endif /* LWIP_UDP */\n#if LWIP_TCP\n    case NETCONN_TCP:\n      if ((msg->msg.ad.local == 0) &&\n          ((msg->conn->pcb.tcp->state == CLOSED) || (msg->conn->pcb.tcp->state == LISTEN))) {\n        /* pcb is not connected and remote name is requested */\n        msg->err = ERR_CONN;\n      } else {\n        API_EXPR_DEREF(msg->msg.ad.port) = (msg->msg.ad.local ? msg->conn->pcb.tcp->local_port : msg->conn->pcb.tcp->remote_port);\n      }\n      break;\n#endif /* LWIP_TCP */\n    default:\n      LWIP_ASSERT(\"invalid netconn_type\", 0);\n      break;\n    }\n  } else {\n    msg->err = ERR_CONN;\n  }\n  TCPIP_APIMSG_ACK(msg);\n}\n\n/**\n * Close or half-shutdown a TCP pcb contained in a netconn\n * Called from netconn_close\n * In contrast to closing sockets, the netconn is not deallocated.\n *\n * @param m the api_msg_msg pointing to the connection\n */\nvoid\nlwip_netconn_do_close(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n#if LWIP_TCP\n  enum netconn_state state = msg->conn->state;\n  /* First check if this is a TCP netconn and if it is in a correct state\n      (LISTEN doesn't support half shutdown) */\n  if ((msg->conn->pcb.tcp != NULL) &&\n      (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_TCP) &&\n      ((msg->msg.sd.shut == NETCONN_SHUT_RDWR) || (state != NETCONN_LISTEN))) {\n    /* Check if we are in a connected state */\n    if (state == NETCONN_CONNECT) {\n      /* TCP connect in progress: cannot shutdown */\n      msg->err = ERR_CONN;\n    } else if (state == NETCONN_WRITE) {\n#if LWIP_NETCONN_FULLDUPLEX\n      if (msg->msg.sd.shut & NETCONN_SHUT_WR) {\n        /* close requested, abort running write */\n        sys_sem_t* write_completed_sem;\n        LWIP_ASSERT(\"msg->conn->current_msg != NULL\", msg->conn->current_msg != NULL);\n        write_completed_sem = LWIP_API_MSG_SEM(msg->conn->current_msg);\n        msg->conn->current_msg->err = ERR_CLSD;\n        msg->conn->current_msg = NULL;\n        msg->conn->write_offset = 0;\n        msg->conn->state = NETCONN_NONE;\n        state = NETCONN_NONE;\n        NETCONN_SET_SAFE_ERR(msg->conn, ERR_CLSD);\n        sys_sem_signal(write_completed_sem);\n      } else {\n        LWIP_ASSERT(\"msg->msg.sd.shut == NETCONN_SHUT_RD\", msg->msg.sd.shut == NETCONN_SHUT_RD);\n        /* In this case, let the write continue and do not interfere with\n           conn->current_msg or conn->state! */\n        msg->err = tcp_shutdown(msg->conn->pcb.tcp, 1, 0);\n      }\n    }\n    if (state == NETCONN_NONE) {\n#else /* LWIP_NETCONN_FULLDUPLEX */\n      msg->err = ERR_INPROGRESS;\n    } else {\n#endif /* LWIP_NETCONN_FULLDUPLEX */\n      if (msg->msg.sd.shut & NETCONN_SHUT_RD) {\n        /* Drain and delete mboxes */\n        netconn_drain(msg->conn);\n      }\n      LWIP_ASSERT(\"already writing or closing\", msg->conn->current_msg == NULL &&\n        msg->conn->write_offset == 0);\n      msg->conn->state = NETCONN_CLOSE;\n      msg->conn->current_msg = msg;\n#if LWIP_TCPIP_CORE_LOCKING\n      if (lwip_netconn_do_close_internal(msg->conn, 0) != ERR_OK) {\n        LWIP_ASSERT(\"state!\", msg->conn->state == NETCONN_CLOSE);\n        UNLOCK_TCPIP_CORE();\n        sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);\n        LOCK_TCPIP_CORE();\n        LWIP_ASSERT(\"state!\", msg->conn->state == NETCONN_NONE);\n      }\n#else /* LWIP_TCPIP_CORE_LOCKING */\n      lwip_netconn_do_close_internal(msg->conn);\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n      /* for tcp netconns, lwip_netconn_do_close_internal ACKs the message */\n      return;\n    }\n  } else\n#endif /* LWIP_TCP */\n  {\n    msg->err = ERR_CONN;\n  }\n  TCPIP_APIMSG_ACK(msg);\n}\n\n#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)\n/**\n * Join multicast groups for UDP netconns.\n * Called from netconn_join_leave_group\n *\n * @param m the api_msg_msg pointing to the connection\n */\nvoid\nlwip_netconn_do_join_leave_group(void *m)\n{\n  struct api_msg *msg = (struct api_msg*)m;\n\n  if (ERR_IS_FATAL(msg->conn->last_err)) {\n    msg->err = msg->conn->last_err;\n  } else {\n    if (msg->conn->pcb.tcp != NULL) {\n      if (NETCONNTYPE_GROUP(msg->conn->type) == NETCONN_UDP) {\n#if LWIP_UDP\n#if LWIP_IPV6 && LWIP_IPV6_MLD\n        if (NETCONNTYPE_ISIPV6(msg->conn->type)) {\n          if (msg->msg.jl.join_or_leave == NETCONN_JOIN) {\n            msg->err = mld6_joingroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)),\n              ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr)));\n          } else {\n            msg->err = mld6_leavegroup(ip_2_ip6(API_EXPR_REF(msg->msg.jl.netif_addr)),\n              ip_2_ip6(API_EXPR_REF(msg->msg.jl.multiaddr)));\n          }\n        }\n        else\n#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */\n        {\n#if LWIP_IGMP\n          if (msg->msg.jl.join_or_leave == NETCONN_JOIN) {\n            msg->err = igmp_joingroup(ip_2_ip4(API_EXPR_REF(msg->msg.jl.netif_addr)),\n              ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr)));\n          } else {\n            msg->err = igmp_leavegroup(ip_2_ip4(API_EXPR_REF(msg->msg.jl.netif_addr)),\n              ip_2_ip4(API_EXPR_REF(msg->msg.jl.multiaddr)));\n          }\n#endif /* LWIP_IGMP */\n        }\n#endif /* LWIP_UDP */\n#if (LWIP_TCP || LWIP_RAW)\n      } else {\n        msg->err = ERR_VAL;\n#endif /* (LWIP_TCP || LWIP_RAW) */\n      }\n    } else {\n      msg->err = ERR_CONN;\n    }\n  }\n  TCPIP_APIMSG_ACK(msg);\n}\n#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */\n\n#if LWIP_DNS\n/**\n * Callback function that is called when DNS name is resolved\n * (or on timeout). A waiting application thread is waked up by\n * signaling the semaphore.\n */\nstatic void\nlwip_netconn_do_dns_found(const char *name, const ip_addr_t *ipaddr, void *arg)\n{\n  struct dns_api_msg *msg = (struct dns_api_msg*)arg;\n\n  /* we trust the internal implementation to be correct :-) */\n  LWIP_UNUSED_ARG(name);\n\n  if (ipaddr == NULL) {\n    /* timeout or memory error */\n    API_EXPR_DEREF(msg->err) = ERR_VAL;\n  } else {\n    /* address was resolved */\n    API_EXPR_DEREF(msg->err) = ERR_OK;\n    API_EXPR_DEREF(msg->addr) = *ipaddr;\n  }\n  /* wake up the application task waiting in netconn_gethostbyname */\n  sys_sem_signal(API_EXPR_REF_SEM(msg->sem));\n}\n\n/**\n * Execute a DNS query\n * Called from netconn_gethostbyname\n *\n * @param arg the dns_api_msg pointing to the query\n */\nvoid\nlwip_netconn_do_gethostbyname(void *arg)\n{\n  struct dns_api_msg *msg = (struct dns_api_msg*)arg;\n  u8_t addrtype =\n#if LWIP_IPV4 && LWIP_IPV6\n    msg->dns_addrtype;\n#else\n    LWIP_DNS_ADDRTYPE_DEFAULT;\n#endif\n\n  API_EXPR_DEREF(msg->err) = dns_gethostbyname_addrtype(msg->name,\n    API_EXPR_REF(msg->addr), lwip_netconn_do_dns_found, msg, addrtype);\n  if (API_EXPR_DEREF(msg->err) != ERR_INPROGRESS) {\n    /* on error or immediate success, wake up the application\n     * task waiting in netconn_gethostbyname */\n    sys_sem_signal(API_EXPR_REF_SEM(msg->sem));\n  }\n}\n#endif /* LWIP_DNS */\n\n#endif /* LWIP_NETCONN */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/api/err.c",
    "content": "/**\n * @file\n * Error Management module\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/err.h\"\n#include \"lwip/def.h\"\n#include \"lwip/sys.h\"\n\n#include \"lwip/errno.h\"\n\n#if !NO_SYS\n/** Table to quickly map an lwIP error (err_t) to a socket error\n  * by using -err as an index */\nstatic const int err_to_errno_table[] = {\n  0,             /* ERR_OK          0      No error, everything OK. */\n  ENOMEM,        /* ERR_MEM        -1      Out of memory error.     */\n  ENOBUFS,       /* ERR_BUF        -2      Buffer error.            */\n  EWOULDBLOCK,   /* ERR_TIMEOUT    -3      Timeout                  */\n  EHOSTUNREACH,  /* ERR_RTE        -4      Routing problem.         */\n  EINPROGRESS,   /* ERR_INPROGRESS -5      Operation in progress    */\n  EINVAL,        /* ERR_VAL        -6      Illegal value.           */\n  EWOULDBLOCK,   /* ERR_WOULDBLOCK -7      Operation would block.   */\n  EADDRINUSE,    /* ERR_USE        -8      Address in use.          */\n  EALREADY,      /* ERR_ALREADY    -9      Already connecting.      */\n  EISCONN,       /* ERR_ISCONN     -10     Conn already established.*/\n  ENOTCONN,      /* ERR_CONN       -11     Not connected.           */\n  -1,            /* ERR_IF         -12     Low-level netif error    */\n  ECONNABORTED,  /* ERR_ABRT       -13     Connection aborted.      */\n  ECONNRESET,    /* ERR_RST        -14     Connection reset.        */\n  ENOTCONN,      /* ERR_CLSD       -15     Connection closed.       */\n  EIO            /* ERR_ARG        -16     Illegal argument.        */\n};\n\nint\nerr_to_errno(err_t err)\n{\n  if ((err > 0) || (-err >= (err_t)LWIP_ARRAYSIZE(err_to_errno_table))) {\n    return EIO;\n  }\n  return err_to_errno_table[-err];\n}\n#endif /* !NO_SYS */\n\n#ifdef LWIP_DEBUG\n\nstatic const char *err_strerr[] = {\n           \"Ok.\",                    /* ERR_OK          0  */\n           \"Out of memory error.\",   /* ERR_MEM        -1  */\n           \"Buffer error.\",          /* ERR_BUF        -2  */\n           \"Timeout.\",               /* ERR_TIMEOUT    -3  */\n           \"Routing problem.\",       /* ERR_RTE        -4  */\n           \"Operation in progress.\", /* ERR_INPROGRESS -5  */\n           \"Illegal value.\",         /* ERR_VAL        -6  */\n           \"Operation would block.\", /* ERR_WOULDBLOCK -7  */\n           \"Address in use.\",        /* ERR_USE        -8  */\n           \"Already connecting.\",    /* ERR_ALREADY    -9  */\n           \"Already connected.\",     /* ERR_ISCONN     -10 */\n           \"Not connected.\",         /* ERR_CONN       -11 */\n           \"Low-level netif error.\", /* ERR_IF         -12 */\n           \"Connection aborted.\",    /* ERR_ABRT       -13 */\n           \"Connection reset.\",      /* ERR_RST        -14 */\n           \"Connection closed.\",     /* ERR_CLSD       -15 */\n           \"Illegal argument.\"       /* ERR_ARG        -16 */\n};\n\n/**\n * Convert an lwip internal error to a string representation.\n *\n * @param err an lwip internal err_t\n * @return a string representation for err\n */\nconst char *\nlwip_strerr(err_t err)\n{\n  if ((err > 0) || (-err >= (err_t)LWIP_ARRAYSIZE(err_strerr))) {\n    return \"Unknown error.\";\n  }\n  return err_strerr[-err];\n}\n\n#endif /* LWIP_DEBUG */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/api/netbuf.c",
    "content": "/**\n * @file\n * Network buffer management\n *\n * @defgroup netbuf Network buffers\n * @ingroup netconn\n * Network buffer descriptor for @ref netconn. Based on @ref pbuf internally\n * to avoid copying data around.\\n\n * Buffers must not be shared accross multiple threads, all functions except\n * netbuf_new() and netbuf_delete() are not thread-safe.\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_NETCONN /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/netbuf.h\"\n#include \"lwip/memp.h\"\n\n#include <string.h>\n\n/**\n * @ingroup netbuf\n * Create (allocate) and initialize a new netbuf.\n * The netbuf doesn't yet contain a packet buffer!\n *\n * @return a pointer to a new netbuf\n *         NULL on lack of memory\n */\nstruct\nnetbuf *netbuf_new(void)\n{\n  struct netbuf *buf;\n\n  buf = (struct netbuf *)memp_malloc(MEMP_NETBUF);\n  if (buf != NULL) {\n    memset(buf, 0, sizeof(struct netbuf));\n  }\n  return buf;\n}\n\n/**\n * @ingroup netbuf\n * Deallocate a netbuf allocated by netbuf_new().\n *\n * @param buf pointer to a netbuf allocated by netbuf_new()\n */\nvoid\nnetbuf_delete(struct netbuf *buf)\n{\n  if (buf != NULL) {\n    if (buf->p != NULL) {\n      pbuf_free(buf->p);\n      buf->p = buf->ptr = NULL;\n    }\n    memp_free(MEMP_NETBUF, buf);\n  }\n}\n\n/**\n * @ingroup netbuf\n * Allocate memory for a packet buffer for a given netbuf.\n *\n * @param buf the netbuf for which to allocate a packet buffer\n * @param size the size of the packet buffer to allocate\n * @return pointer to the allocated memory\n *         NULL if no memory could be allocated\n */\nvoid *\nnetbuf_alloc(struct netbuf *buf, u16_t size)\n{\n  LWIP_ERROR(\"netbuf_alloc: invalid buf\", (buf != NULL), return NULL;);\n\n  /* Deallocate any previously allocated memory. */\n  if (buf->p != NULL) {\n    pbuf_free(buf->p);\n  }\n  buf->p = pbuf_alloc(PBUF_TRANSPORT, size, PBUF_RAM);\n  if (buf->p == NULL) {\n     return NULL;\n  }\n  LWIP_ASSERT(\"check that first pbuf can hold size\",\n             (buf->p->len >= size));\n  buf->ptr = buf->p;\n  return buf->p->payload;\n}\n\n/**\n * @ingroup netbuf\n * Free the packet buffer included in a netbuf\n *\n * @param buf pointer to the netbuf which contains the packet buffer to free\n */\nvoid\nnetbuf_free(struct netbuf *buf)\n{\n  LWIP_ERROR(\"netbuf_free: invalid buf\", (buf != NULL), return;);\n  if (buf->p != NULL) {\n    pbuf_free(buf->p);\n  }\n  buf->p = buf->ptr = NULL;\n}\n\n/**\n * @ingroup netbuf\n * Let a netbuf reference existing (non-volatile) data.\n *\n * @param buf netbuf which should reference the data\n * @param dataptr pointer to the data to reference\n * @param size size of the data\n * @return ERR_OK if data is referenced\n *         ERR_MEM if data couldn't be referenced due to lack of memory\n */\nerr_t\nnetbuf_ref(struct netbuf *buf, const void *dataptr, u16_t size)\n{\n  LWIP_ERROR(\"netbuf_ref: invalid buf\", (buf != NULL), return ERR_ARG;);\n  if (buf->p != NULL) {\n    pbuf_free(buf->p);\n  }\n  buf->p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);\n  if (buf->p == NULL) {\n    buf->ptr = NULL;\n    return ERR_MEM;\n  }\n  ((struct pbuf_rom*)buf->p)->payload = dataptr;\n  buf->p->len = buf->p->tot_len = size;\n  buf->ptr = buf->p;\n  return ERR_OK;\n}\n\n/**\n * @ingroup netbuf\n * Chain one netbuf to another (@see pbuf_chain)\n *\n * @param head the first netbuf\n * @param tail netbuf to chain after head, freed by this function, may not be reference after returning\n */\nvoid\nnetbuf_chain(struct netbuf *head, struct netbuf *tail)\n{\n  LWIP_ERROR(\"netbuf_chain: invalid head\", (head != NULL), return;);\n  LWIP_ERROR(\"netbuf_chain: invalid tail\", (tail != NULL), return;);\n  pbuf_cat(head->p, tail->p);\n  head->ptr = head->p;\n  memp_free(MEMP_NETBUF, tail);\n}\n\n/**\n * @ingroup netbuf\n * Get the data pointer and length of the data inside a netbuf.\n *\n * @param buf netbuf to get the data from\n * @param dataptr pointer to a void pointer where to store the data pointer\n * @param len pointer to an u16_t where the length of the data is stored\n * @return ERR_OK if the information was retrieved,\n *         ERR_BUF on error.\n */\nerr_t\nnetbuf_data(struct netbuf *buf, void **dataptr, u16_t *len)\n{\n  LWIP_ERROR(\"netbuf_data: invalid buf\", (buf != NULL), return ERR_ARG;);\n  LWIP_ERROR(\"netbuf_data: invalid dataptr\", (dataptr != NULL), return ERR_ARG;);\n  LWIP_ERROR(\"netbuf_data: invalid len\", (len != NULL), return ERR_ARG;);\n\n  if (buf->ptr == NULL) {\n    return ERR_BUF;\n  }\n  *dataptr = buf->ptr->payload;\n  *len = buf->ptr->len;\n  return ERR_OK;\n}\n\n/**\n * @ingroup netbuf\n * Move the current data pointer of a packet buffer contained in a netbuf\n * to the next part.\n * The packet buffer itself is not modified.\n *\n * @param buf the netbuf to modify\n * @return -1 if there is no next part\n *         1  if moved to the next part but now there is no next part\n *         0  if moved to the next part and there are still more parts\n */\ns8_t\nnetbuf_next(struct netbuf *buf)\n{\n  LWIP_ERROR(\"netbuf_next: invalid buf\", (buf != NULL), return -1;);\n  if (buf->ptr->next == NULL) {\n    return -1;\n  }\n  buf->ptr = buf->ptr->next;\n  if (buf->ptr->next == NULL) {\n    return 1;\n  }\n  return 0;\n}\n\n/**\n * @ingroup netbuf\n * Move the current data pointer of a packet buffer contained in a netbuf\n * to the beginning of the packet.\n * The packet buffer itself is not modified.\n *\n * @param buf the netbuf to modify\n */\nvoid\nnetbuf_first(struct netbuf *buf)\n{\n  LWIP_ERROR(\"netbuf_first: invalid buf\", (buf != NULL), return;);\n  buf->ptr = buf->p;\n}\n\n#endif /* LWIP_NETCONN */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/api/netdb.c",
    "content": "/**\n * @file\n * API functions for name resolving\n *\n * @defgroup netdbapi NETDB API\n * @ingroup socket\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Simon Goldschmidt\n *\n */\n\n#include \"lwip/netdb.h\"\n\n#if LWIP_DNS && LWIP_SOCKET\n\n#include \"lwip/err.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/api.h\"\n#include \"lwip/dns.h\"\n\n#include <string.h> /* memset */\n#include <stdlib.h> /* atoi */\n\n/** helper struct for gethostbyname_r to access the char* buffer */\nstruct gethostbyname_r_helper {\n  ip_addr_t *addr_list[2];\n  ip_addr_t addr;\n  char *aliases;\n};\n\n/** h_errno is exported in netdb.h for access by applications. */\n#if LWIP_DNS_API_DECLARE_H_ERRNO\nint h_errno;\n#endif /* LWIP_DNS_API_DECLARE_H_ERRNO */\n\n/** define \"hostent\" variables storage: 0 if we use a static (but unprotected)\n * set of variables for lwip_gethostbyname, 1 if we use a local storage */\n#ifndef LWIP_DNS_API_HOSTENT_STORAGE\n#define LWIP_DNS_API_HOSTENT_STORAGE 0\n#endif\n\n/** define \"hostent\" variables storage */\n#if LWIP_DNS_API_HOSTENT_STORAGE\n#define HOSTENT_STORAGE\n#else\n#define HOSTENT_STORAGE static\n#endif /* LWIP_DNS_API_STATIC_HOSTENT */\n\n/**\n * Returns an entry containing addresses of address family AF_INET\n * for the host with name name.\n * Due to dns_gethostbyname limitations, only one address is returned.\n *\n * @param name the hostname to resolve\n * @return an entry containing addresses of address family AF_INET\n *         for the host with name name\n */\nstruct hostent*\nlwip_gethostbyname(const char *name)\n{\n  err_t err;\n  ip_addr_t addr;\n\n  /* buffer variables for lwip_gethostbyname() */\n  HOSTENT_STORAGE struct hostent s_hostent;\n  HOSTENT_STORAGE char *s_aliases;\n  HOSTENT_STORAGE ip_addr_t s_hostent_addr;\n  HOSTENT_STORAGE ip_addr_t *s_phostent_addr[2];\n  HOSTENT_STORAGE char s_hostname[DNS_MAX_NAME_LENGTH + 1];\n\n  /* query host IP address */\n  err = netconn_gethostbyname(name, &addr);\n  if (err != ERR_OK) {\n    LWIP_DEBUGF(DNS_DEBUG, (\"lwip_gethostbyname(%s) failed, err=%d\\n\", name, err));\n    h_errno = HOST_NOT_FOUND;\n    return NULL;\n  }\n\n  /* fill hostent */\n  s_hostent_addr = addr;\n  s_phostent_addr[0] = &s_hostent_addr;\n  s_phostent_addr[1] = NULL;\n  strncpy(s_hostname, name, DNS_MAX_NAME_LENGTH);\n  s_hostname[DNS_MAX_NAME_LENGTH] = 0;\n  s_hostent.h_name = s_hostname;\n  s_aliases = NULL;\n  s_hostent.h_aliases = &s_aliases;\n  s_hostent.h_addrtype = AF_INET;\n  s_hostent.h_length = sizeof(ip_addr_t);\n  s_hostent.h_addr_list = (char**)&s_phostent_addr;\n\n#if DNS_DEBUG\n  /* dump hostent */\n  LWIP_DEBUGF(DNS_DEBUG, (\"hostent.h_name           == %s\\n\", s_hostent.h_name));\n  LWIP_DEBUGF(DNS_DEBUG, (\"hostent.h_aliases        == %p\\n\", (void*)s_hostent.h_aliases));\n  /* h_aliases are always empty */\n  LWIP_DEBUGF(DNS_DEBUG, (\"hostent.h_addrtype       == %d\\n\", s_hostent.h_addrtype));\n  LWIP_DEBUGF(DNS_DEBUG, (\"hostent.h_length         == %d\\n\", s_hostent.h_length));\n  LWIP_DEBUGF(DNS_DEBUG, (\"hostent.h_addr_list      == %p\\n\", (void*)s_hostent.h_addr_list));\n  if (s_hostent.h_addr_list != NULL) {\n    u8_t idx;\n    for (idx=0; s_hostent.h_addr_list[idx]; idx++) {\n      LWIP_DEBUGF(DNS_DEBUG, (\"hostent.h_addr_list[%i]   == %p\\n\", idx, s_hostent.h_addr_list[idx]));\n      LWIP_DEBUGF(DNS_DEBUG, (\"hostent.h_addr_list[%i]-> == %s\\n\", idx, ipaddr_ntoa((ip_addr_t*)s_hostent.h_addr_list[idx])));\n    }\n  }\n#endif /* DNS_DEBUG */\n\n#if LWIP_DNS_API_HOSTENT_STORAGE\n  /* this function should return the \"per-thread\" hostent after copy from s_hostent */\n  return sys_thread_hostent(&s_hostent);\n#else\n  return &s_hostent;\n#endif /* LWIP_DNS_API_HOSTENT_STORAGE */\n}\n\n/**\n * Thread-safe variant of lwip_gethostbyname: instead of using a static\n * buffer, this function takes buffer and errno pointers as arguments\n * and uses these for the result.\n *\n * @param name the hostname to resolve\n * @param ret pre-allocated struct where to store the result\n * @param buf pre-allocated buffer where to store additional data\n * @param buflen the size of buf\n * @param result pointer to a hostent pointer that is set to ret on success\n *               and set to zero on error\n * @param h_errnop pointer to an int where to store errors (instead of modifying\n *                 the global h_errno)\n * @return 0 on success, non-zero on error, additional error information\n *         is stored in *h_errnop instead of h_errno to be thread-safe\n */\nint\nlwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf,\n                size_t buflen, struct hostent **result, int *h_errnop)\n{\n  err_t err;\n  struct gethostbyname_r_helper *h;\n  char *hostname;\n  size_t namelen;\n  int lh_errno;\n\n  if (h_errnop == NULL) {\n    /* ensure h_errnop is never NULL */\n    h_errnop = &lh_errno;\n  }\n\n  if (result == NULL) {\n    /* not all arguments given */\n    *h_errnop = EINVAL;\n    return -1;\n  }\n  /* first thing to do: set *result to nothing */\n  *result = NULL;\n  if ((name == NULL) || (ret == NULL) || (buf == NULL)) {\n    /* not all arguments given */\n    *h_errnop = EINVAL;\n    return -1;\n  }\n\n  namelen = strlen(name);\n  if (buflen < (sizeof(struct gethostbyname_r_helper) + namelen + 1 + (MEM_ALIGNMENT - 1))) {\n    /* buf can't hold the data needed + a copy of name */\n    *h_errnop = ERANGE;\n    return -1;\n  }\n\n  h = (struct gethostbyname_r_helper*)LWIP_MEM_ALIGN(buf);\n  hostname = ((char*)h) + sizeof(struct gethostbyname_r_helper);\n\n  /* query host IP address */\n  err = netconn_gethostbyname(name, &h->addr);\n  if (err != ERR_OK) {\n    LWIP_DEBUGF(DNS_DEBUG, (\"lwip_gethostbyname(%s) failed, err=%d\\n\", name, err));\n    *h_errnop = HOST_NOT_FOUND;\n    return -1;\n  }\n\n  /* copy the hostname into buf */\n  MEMCPY(hostname, name, namelen);\n  hostname[namelen] = 0;\n\n  /* fill hostent */\n  h->addr_list[0] = &h->addr;\n  h->addr_list[1] = NULL;\n  h->aliases = NULL;\n  ret->h_name = hostname;\n  ret->h_aliases = &h->aliases;\n  ret->h_addrtype = AF_INET;\n  ret->h_length = sizeof(ip_addr_t);\n  ret->h_addr_list = (char**)&h->addr_list;\n\n  /* set result != NULL */\n  *result = ret;\n\n  /* return success */\n  return 0;\n}\n\n/**\n * Frees one or more addrinfo structures returned by getaddrinfo(), along with\n * any additional storage associated with those structures. If the ai_next field\n * of the structure is not null, the entire list of structures is freed.\n *\n * @param ai struct addrinfo to free\n */\nvoid\nlwip_freeaddrinfo(struct addrinfo *ai)\n{\n  struct addrinfo *next;\n\n  while (ai != NULL) {\n    next = ai->ai_next;\n    memp_free(MEMP_NETDB, ai);\n    ai = next;\n  }\n}\n\n/**\n * Translates the name of a service location (for example, a host name) and/or\n * a service name and returns a set of socket addresses and associated\n * information to be used in creating a socket with which to address the\n * specified service.\n * Memory for the result is allocated internally and must be freed by calling\n * lwip_freeaddrinfo()!\n *\n * Due to a limitation in dns_gethostbyname, only the first address of a\n * host is returned.\n * Also, service names are not supported (only port numbers)!\n *\n * @param nodename descriptive name or address string of the host\n *                 (may be NULL -> local address)\n * @param servname port number as string of NULL\n * @param hints structure containing input values that set socktype and protocol\n * @param res pointer to a pointer where to store the result (set to NULL on failure)\n * @return 0 on success, non-zero on failure\n *\n * @todo: implement AI_V4MAPPED, AI_ADDRCONFIG\n */\nint\nlwip_getaddrinfo(const char *nodename, const char *servname,\n       const struct addrinfo *hints, struct addrinfo **res)\n{\n  err_t err;\n  ip_addr_t addr;\n  struct addrinfo *ai;\n  struct sockaddr_storage *sa = NULL;\n  int port_nr = 0;\n  size_t total_size;\n  size_t namelen = 0;\n  int ai_family;\n\n  if (res == NULL) {\n    return EAI_FAIL;\n  }\n  *res = NULL;\n  if ((nodename == NULL) && (servname == NULL)) {\n    return EAI_NONAME;\n  }\n\n  if (hints != NULL) {\n    ai_family = hints->ai_family;\n    if ((ai_family != AF_UNSPEC)\n#if LWIP_IPV4\n      && (ai_family != AF_INET)\n#endif /* LWIP_IPV4 */\n#if LWIP_IPV6\n      && (ai_family != AF_INET6)\n#endif /* LWIP_IPV6 */\n      ) {\n      return EAI_FAMILY;\n    }\n  } else {\n    ai_family = AF_UNSPEC;\n  }\n\n  if (servname != NULL) {\n    /* service name specified: convert to port number\n     * @todo?: currently, only ASCII integers (port numbers) are supported (AI_NUMERICSERV)! */\n    port_nr = atoi(servname);\n    if ((port_nr <= 0) || (port_nr > 0xffff)) {\n      return EAI_SERVICE;\n    }\n  }\n\n  if (nodename != NULL) {\n    /* service location specified, try to resolve */\n    if ((hints != NULL) && (hints->ai_flags & AI_NUMERICHOST)) {\n      /* no DNS lookup, just parse for an address string */\n      if (!ipaddr_aton(nodename, &addr)) {\n        return EAI_NONAME;\n      }\n#if LWIP_IPV4 && LWIP_IPV6\n      if ((IP_IS_V6_VAL(addr) && ai_family == AF_INET) ||\n          (IP_IS_V4_VAL(addr) && ai_family == AF_INET6)) {\n        return EAI_NONAME;\n      }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n    } else {\n#if LWIP_IPV4 && LWIP_IPV6\n      /* AF_UNSPEC: prefer IPv4 */\n      u8_t type = NETCONN_DNS_IPV4_IPV6;\n      if (ai_family == AF_INET) {\n        type = NETCONN_DNS_IPV4;\n      } else if (ai_family == AF_INET6) {\n        type = NETCONN_DNS_IPV6;\n      }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n      err = netconn_gethostbyname_addrtype(nodename, &addr, type);\n      if (err != ERR_OK) {\n        return EAI_FAIL;\n      }\n    }\n  } else {\n    /* service location specified, use loopback address */\n    if ((hints != NULL) && (hints->ai_flags & AI_PASSIVE)) {\n      ip_addr_set_any(ai_family == AF_INET6, &addr);\n    } else {\n      ip_addr_set_loopback(ai_family == AF_INET6, &addr);\n    }\n  }\n\n  total_size = sizeof(struct addrinfo) + sizeof(struct sockaddr_storage);\n  if (nodename != NULL) {\n    namelen = strlen(nodename);\n    if (namelen > DNS_MAX_NAME_LENGTH) {\n      /* invalid name length */\n      return EAI_FAIL;\n    }\n    LWIP_ASSERT(\"namelen is too long\", total_size + namelen + 1 > total_size);\n    total_size += namelen + 1;\n  }\n  /* If this fails, please report to lwip-devel! :-) */\n  LWIP_ASSERT(\"total_size <= NETDB_ELEM_SIZE: please report this!\",\n    total_size <= NETDB_ELEM_SIZE);\n  ai = (struct addrinfo *)memp_malloc(MEMP_NETDB);\n  if (ai == NULL) {\n    return EAI_MEMORY;\n  }\n  memset(ai, 0, total_size);\n  /* cast through void* to get rid of alignment warnings */\n  sa = (struct sockaddr_storage *)(void*)((u8_t*)ai + sizeof(struct addrinfo));\n  if (IP_IS_V6_VAL(addr)) {\n#if LWIP_IPV6\n    struct sockaddr_in6 *sa6 = (struct sockaddr_in6*)sa;\n    /* set up sockaddr */\n    inet6_addr_from_ip6addr(&sa6->sin6_addr, ip_2_ip6(&addr));\n    sa6->sin6_family = AF_INET6;\n    sa6->sin6_len = sizeof(struct sockaddr_in6);\n    sa6->sin6_port = lwip_htons((u16_t)port_nr);\n    ai->ai_family = AF_INET6;\n#endif /* LWIP_IPV6 */\n  } else {\n#if LWIP_IPV4\n    struct sockaddr_in *sa4 = (struct sockaddr_in*)sa;\n    /* set up sockaddr */\n    inet_addr_from_ip4addr(&sa4->sin_addr, ip_2_ip4(&addr));\n    sa4->sin_family = AF_INET;\n    sa4->sin_len = sizeof(struct sockaddr_in);\n    sa4->sin_port = lwip_htons((u16_t)port_nr);\n    ai->ai_family = AF_INET;\n#endif /* LWIP_IPV4 */\n  }\n\n  /* set up addrinfo */\n  if (hints != NULL) {\n    /* copy socktype & protocol from hints if specified */\n    ai->ai_socktype = hints->ai_socktype;\n    ai->ai_protocol = hints->ai_protocol;\n  }\n  if (nodename != NULL) {\n    /* copy nodename to canonname if specified */\n    ai->ai_canonname = ((char*)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_storage));\n    MEMCPY(ai->ai_canonname, nodename, namelen);\n    ai->ai_canonname[namelen] = 0;\n  }\n  ai->ai_addrlen = sizeof(struct sockaddr_storage);\n  ai->ai_addr = (struct sockaddr*)sa;\n\n  *res = ai;\n\n  return 0;\n}\n\n#endif /* LWIP_DNS && LWIP_SOCKET */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/api/netifapi.c",
    "content": "/**\n * @file\n * Network Interface Sequential API module\n *\n * @defgroup netifapi NETIF API\n * @ingroup sequential_api\n * Thread-safe functions to be called from non-TCPIP threads\n * \n * @defgroup netifapi_netif NETIF related\n * @ingroup netifapi\n * To be called from non-TCPIP threads \n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/netifapi.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n\n#define NETIFAPI_VAR_REF(name)      API_VAR_REF(name)\n#define NETIFAPI_VAR_DECLARE(name)  API_VAR_DECLARE(struct netifapi_msg, name)\n#define NETIFAPI_VAR_ALLOC(name)    API_VAR_ALLOC(struct netifapi_msg, MEMP_NETIFAPI_MSG, name, ERR_MEM)\n#define NETIFAPI_VAR_FREE(name)     API_VAR_FREE(MEMP_NETIFAPI_MSG, name)\n\n/**\n * Call netif_add() inside the tcpip_thread context.\n */\nstatic err_t\nnetifapi_do_netif_add(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct netifapi_msg */\n  struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;\n  \n  if (!netif_add( msg->netif,\n#if LWIP_IPV4\n                  API_EXPR_REF(msg->msg.add.ipaddr),\n                  API_EXPR_REF(msg->msg.add.netmask),\n                  API_EXPR_REF(msg->msg.add.gw),\n#endif /* LWIP_IPV4 */\n                  msg->msg.add.state,\n                  msg->msg.add.init,\n                  msg->msg.add.input)) {\n    return ERR_IF;\n  } else {\n    return ERR_OK;\n  }\n}\n\n#if LWIP_IPV4\n/**\n * Call netif_set_addr() inside the tcpip_thread context.\n */\nstatic err_t\nnetifapi_do_netif_set_addr(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct netifapi_msg */\n  struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;\n\n  netif_set_addr( msg->netif,\n                  API_EXPR_REF(msg->msg.add.ipaddr),\n                  API_EXPR_REF(msg->msg.add.netmask),\n                  API_EXPR_REF(msg->msg.add.gw));\n  return ERR_OK;\n}\n#endif /* LWIP_IPV4 */\n\n/**\n * Call the \"errtfunc\" (or the \"voidfunc\" if \"errtfunc\" is NULL) inside the\n * tcpip_thread context.\n */\nstatic err_t\nnetifapi_do_netif_common(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct netifapi_msg */\n  struct netifapi_msg *msg = (struct netifapi_msg*)(void*)m;\n\n  if (msg->msg.common.errtfunc != NULL) {\n    return msg->msg.common.errtfunc(msg->netif);\n  } else {\n    msg->msg.common.voidfunc(msg->netif);\n    return ERR_OK;\n  }\n}\n\n/**\n * @ingroup netifapi_netif\n * Call netif_add() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n *\n * @note for params @see netif_add()\n */\nerr_t\nnetifapi_netif_add(struct netif *netif,\n#if LWIP_IPV4\n                   const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,\n#endif /* LWIP_IPV4 */\n                   void *state, netif_init_fn init, netif_input_fn input)\n{\n  err_t err;\n  NETIFAPI_VAR_DECLARE(msg);\n  NETIFAPI_VAR_ALLOC(msg);\n\n#if LWIP_IPV4\n  if (ipaddr == NULL) {\n    ipaddr = IP4_ADDR_ANY4;\n  }\n  if (netmask == NULL) {\n    netmask = IP4_ADDR_ANY4;\n  }\n  if (gw == NULL) {\n    gw = IP4_ADDR_ANY4;\n  }\n#endif /* LWIP_IPV4 */\n\n  NETIFAPI_VAR_REF(msg).netif = netif;\n#if LWIP_IPV4\n  NETIFAPI_VAR_REF(msg).msg.add.ipaddr  = NETIFAPI_VAR_REF(ipaddr);\n  NETIFAPI_VAR_REF(msg).msg.add.netmask = NETIFAPI_VAR_REF(netmask);\n  NETIFAPI_VAR_REF(msg).msg.add.gw      = NETIFAPI_VAR_REF(gw);\n#endif /* LWIP_IPV4 */\n  NETIFAPI_VAR_REF(msg).msg.add.state   = state;\n  NETIFAPI_VAR_REF(msg).msg.add.init    = init;\n  NETIFAPI_VAR_REF(msg).msg.add.input   = input;\n  err = tcpip_api_call(netifapi_do_netif_add, &API_VAR_REF(msg).call);\n  NETIFAPI_VAR_FREE(msg);\n  return err;\n}\n\n#if LWIP_IPV4\n/**\n * @ingroup netifapi_netif\n * Call netif_set_addr() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n *\n * @note for params @see netif_set_addr()\n */\nerr_t\nnetifapi_netif_set_addr(struct netif *netif,\n                        const ip4_addr_t *ipaddr,\n                        const ip4_addr_t *netmask,\n                        const ip4_addr_t *gw)\n{\n  err_t err;\n  NETIFAPI_VAR_DECLARE(msg);\n  NETIFAPI_VAR_ALLOC(msg);\n\n  if (ipaddr == NULL) {\n    ipaddr = IP4_ADDR_ANY4;\n  }\n  if (netmask == NULL) {\n    netmask = IP4_ADDR_ANY4;\n  }\n  if (gw == NULL) {\n    gw = IP4_ADDR_ANY4;\n  }\n\n  NETIFAPI_VAR_REF(msg).netif = netif;\n  NETIFAPI_VAR_REF(msg).msg.add.ipaddr  = NETIFAPI_VAR_REF(ipaddr);\n  NETIFAPI_VAR_REF(msg).msg.add.netmask = NETIFAPI_VAR_REF(netmask);\n  NETIFAPI_VAR_REF(msg).msg.add.gw      = NETIFAPI_VAR_REF(gw);\n  err = tcpip_api_call(netifapi_do_netif_set_addr, &API_VAR_REF(msg).call);\n  NETIFAPI_VAR_FREE(msg);\n  return err;\n}\n#endif /* LWIP_IPV4 */\n\n/**\n * call the \"errtfunc\" (or the \"voidfunc\" if \"errtfunc\" is NULL) in a thread-safe\n * way by running that function inside the tcpip_thread context.\n *\n * @note use only for functions where there is only \"netif\" parameter.\n */\nerr_t\nnetifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc,\n                       netifapi_errt_fn errtfunc)\n{\n  err_t err;\n  NETIFAPI_VAR_DECLARE(msg);\n  NETIFAPI_VAR_ALLOC(msg);\n\n  NETIFAPI_VAR_REF(msg).netif = netif;\n  NETIFAPI_VAR_REF(msg).msg.common.voidfunc = voidfunc;\n  NETIFAPI_VAR_REF(msg).msg.common.errtfunc = errtfunc;\n  err = tcpip_api_call(netifapi_do_netif_common, &API_VAR_REF(msg).call);\n  NETIFAPI_VAR_FREE(msg);\n  return err;\n}\n\n#endif /* LWIP_NETIF_API */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/api/sockets.c",
    "content": "/**\n * @file\n * Sockets BSD-Like API module\n *\n * @defgroup socket Socket API\n * @ingroup sequential_api\n * BSD-style socket API.\\n\n * Thread-safe, to be called from non-TCPIP threads only.\\n\n * Can be activated by defining @ref LWIP_SOCKET to 1.\\n\n * Header is in posix/sys/socket.h\\b\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n * Improved by Marc Boucher <marc@mbsi.ca> and David Haas <dhaas@alum.rpi.edu>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/sockets.h\"\n#include \"lwip/api.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/igmp.h\"\n#include \"lwip/inet.h\"\n#include \"lwip/tcp.h\"\n#include \"lwip/raw.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n#if LWIP_CHECKSUM_ON_COPY\n#include \"lwip/inet_chksum.h\"\n#endif\n\n#include <string.h>\n\n/* If the netconn API is not required publicly, then we include the necessary\n   files here to get the implementation */\n#if !LWIP_NETCONN\n#undef LWIP_NETCONN\n#define LWIP_NETCONN 1\n#include \"api_msg.c\"\n#include \"api_lib.c\"\n#include \"netbuf.c\"\n#undef LWIP_NETCONN\n#define LWIP_NETCONN 0\n#endif\n\nint errno;\n\n\n#if LWIP_IPV4\n#define IP4ADDR_PORT_TO_SOCKADDR(sin, ipaddr, port) do { \\\n      (sin)->sin_len = sizeof(struct sockaddr_in); \\\n      (sin)->sin_family = AF_INET; \\\n      (sin)->sin_port = lwip_htons((port)); \\\n      inet_addr_from_ip4addr(&(sin)->sin_addr, ipaddr); \\\n      memset((sin)->sin_zero, 0, SIN_ZERO_LEN); }while(0)\n#define SOCKADDR4_TO_IP4ADDR_PORT(sin, ipaddr, port) do { \\\n    inet_addr_to_ip4addr(ip_2_ip4(ipaddr), &((sin)->sin_addr)); \\\n    (port) = lwip_ntohs((sin)->sin_port); }while(0)\n#endif /* LWIP_IPV4 */\n\n#if LWIP_IPV6\n#define IP6ADDR_PORT_TO_SOCKADDR(sin6, ipaddr, port) do { \\\n      (sin6)->sin6_len = sizeof(struct sockaddr_in6); \\\n      (sin6)->sin6_family = AF_INET6; \\\n      (sin6)->sin6_port = lwip_htons((port)); \\\n      (sin6)->sin6_flowinfo = 0; \\\n      inet6_addr_from_ip6addr(&(sin6)->sin6_addr, ipaddr); \\\n      (sin6)->sin6_scope_id = 0; }while(0)\n#define SOCKADDR6_TO_IP6ADDR_PORT(sin6, ipaddr, port) do { \\\n    inet6_addr_to_ip6addr(ip_2_ip6(ipaddr), &((sin6)->sin6_addr)); \\\n    (port) = lwip_ntohs((sin6)->sin6_port); }while(0)\n#endif /* LWIP_IPV6 */\n\n#if LWIP_IPV4 && LWIP_IPV6\nstatic void sockaddr_to_ipaddr_port(const struct sockaddr* sockaddr, ip_addr_t* ipaddr, u16_t* port);\n\n#define IS_SOCK_ADDR_LEN_VALID(namelen)  (((namelen) == sizeof(struct sockaddr_in)) || \\\n                                         ((namelen) == sizeof(struct sockaddr_in6)))\n#define IS_SOCK_ADDR_TYPE_VALID(name)    (((name)->sa_family == AF_INET) || \\\n                                         ((name)->sa_family == AF_INET6))\n#define SOCK_ADDR_TYPE_MATCH(name, sock) \\\n       ((((name)->sa_family == AF_INET) && !(NETCONNTYPE_ISIPV6((sock)->conn->type))) || \\\n       (((name)->sa_family == AF_INET6) && (NETCONNTYPE_ISIPV6((sock)->conn->type))))\n#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) do { \\\n    if (IP_IS_V6(ipaddr)) { \\\n      IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ip_2_ip6(ipaddr), port); \\\n    } else { \\\n      IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ip_2_ip4(ipaddr), port); \\\n    } } while(0)\n#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) sockaddr_to_ipaddr_port(sockaddr, ipaddr, &(port))\n#define DOMAIN_TO_NETCONN_TYPE(domain, type) (((domain) == AF_INET) ? \\\n  (type) : (enum netconn_type)((type) | NETCONN_TYPE_IPV6))\n#elif LWIP_IPV6 /* LWIP_IPV4 && LWIP_IPV6 */\n#define IS_SOCK_ADDR_LEN_VALID(namelen)  ((namelen) == sizeof(struct sockaddr_in6))\n#define IS_SOCK_ADDR_TYPE_VALID(name)    ((name)->sa_family == AF_INET6)\n#define SOCK_ADDR_TYPE_MATCH(name, sock) 1\n#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) \\\n        IP6ADDR_PORT_TO_SOCKADDR((struct sockaddr_in6*)(void*)(sockaddr), ip_2_ip6(ipaddr), port)\n#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) \\\n        SOCKADDR6_TO_IP6ADDR_PORT((const struct sockaddr_in6*)(const void*)(sockaddr), ipaddr, port)\n#define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type)\n#else /*-> LWIP_IPV4: LWIP_IPV4 && LWIP_IPV6 */\n#define IS_SOCK_ADDR_LEN_VALID(namelen)  ((namelen) == sizeof(struct sockaddr_in))\n#define IS_SOCK_ADDR_TYPE_VALID(name)    ((name)->sa_family == AF_INET)\n#define SOCK_ADDR_TYPE_MATCH(name, sock) 1\n#define IPADDR_PORT_TO_SOCKADDR(sockaddr, ipaddr, port) \\\n        IP4ADDR_PORT_TO_SOCKADDR((struct sockaddr_in*)(void*)(sockaddr), ip_2_ip4(ipaddr), port)\n#define SOCKADDR_TO_IPADDR_PORT(sockaddr, ipaddr, port) \\\n        SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in*)(const void*)(sockaddr), ipaddr, port)\n#define DOMAIN_TO_NETCONN_TYPE(domain, netconn_type) (netconn_type)\n#endif /* LWIP_IPV6 */\n\n#define IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name)    (((name)->sa_family == AF_UNSPEC) || \\\n                                                    IS_SOCK_ADDR_TYPE_VALID(name))\n#define SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock) (((name)->sa_family == AF_UNSPEC) || \\\n                                                    SOCK_ADDR_TYPE_MATCH(name, sock))\n#define IS_SOCK_ADDR_ALIGNED(name)      ((((mem_ptr_t)(name)) % 4) == 0)\n\n\n#define LWIP_SOCKOPT_CHECK_OPTLEN(optlen, opttype) do { if ((optlen) < sizeof(opttype)) { return EINVAL; }}while(0)\n#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, opttype) do { \\\n  LWIP_SOCKOPT_CHECK_OPTLEN(optlen, opttype); \\\n  if ((sock)->conn == NULL) { return EINVAL; } }while(0)\n#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype) do { \\\n  LWIP_SOCKOPT_CHECK_OPTLEN(optlen, opttype); \\\n  if (((sock)->conn == NULL) || ((sock)->conn->pcb.tcp == NULL)) { return EINVAL; } }while(0)\n#define LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, opttype, netconntype) do { \\\n  LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, opttype); \\\n  if (NETCONNTYPE_GROUP(netconn_type((sock)->conn)) != netconntype) { return ENOPROTOOPT; } }while(0)\n\n\n#define LWIP_SETGETSOCKOPT_DATA_VAR_REF(name)     API_VAR_REF(name)\n#define LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(name) API_VAR_DECLARE(struct lwip_setgetsockopt_data, name)\n#define LWIP_SETGETSOCKOPT_DATA_VAR_FREE(name)    API_VAR_FREE(MEMP_SOCKET_SETGETSOCKOPT_DATA, name)\n#if LWIP_MPU_COMPATIBLE\n#define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock) do { \\\n  name = (struct lwip_setgetsockopt_data *)memp_malloc(MEMP_SOCKET_SETGETSOCKOPT_DATA); \\\n  if (name == NULL) { \\\n    sock_set_errno(sock, ENOMEM); \\\n    return -1; \\\n  } }while(0)\n#else /* LWIP_MPU_COMPATIBLE */\n#define LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(name, sock)\n#endif /* LWIP_MPU_COMPATIBLE */\n\n#if LWIP_SO_SNDRCVTIMEO_NONSTANDARD\n#define LWIP_SO_SNDRCVTIMEO_OPTTYPE int\n#define LWIP_SO_SNDRCVTIMEO_SET(optval, val) (*(int *)(optval) = (val))\n#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval)   ((s32_t)*(const int*)(optval))\n#else\n#define LWIP_SO_SNDRCVTIMEO_OPTTYPE struct timeval\n#define LWIP_SO_SNDRCVTIMEO_SET(optval, val)  do { \\\n  s32_t loc = (val); \\\n  ((struct timeval *)(optval))->tv_sec = (loc) / 1000U; \\\n  ((struct timeval *)(optval))->tv_usec = ((loc) % 1000U) * 1000U; }while(0)\n#define LWIP_SO_SNDRCVTIMEO_GET_MS(optval) ((((const struct timeval *)(optval))->tv_sec * 1000U) + (((const struct timeval *)(optval))->tv_usec / 1000U))\n#endif\n\n#define NUM_SOCKETS MEMP_NUM_NETCONN\n\n/** This is overridable for the rare case where more than 255 threads\n * select on the same socket...\n */\n#ifndef SELWAIT_T\n#define SELWAIT_T u8_t\n#endif\n\n/** Contains all internal pointers and states used for a socket */\nstruct lwip_sock {\n  /** sockets currently are built on netconns, each socket has one netconn */\n  struct netconn *conn;\n  /** data that was left from the previous read */\n  void *lastdata;\n  /** offset in the data that was left from the previous read */\n  u16_t lastoffset;\n  /** number of times data was received, set by event_callback(),\n      tested by the receive and select functions */\n  s16_t rcvevent;\n  /** number of times data was ACKed (free send buffer), set by event_callback(),\n      tested by select */\n  u16_t sendevent;\n  /** error happened for this socket, set by event_callback(), tested by select */\n  u16_t errevent;\n  /** last error that occurred on this socket (in fact, all our errnos fit into an u8_t) */\n  u8_t err;\n  /** counter of how many threads are waiting for this socket using select */\n  SELWAIT_T select_waiting;\n};\n\n#if LWIP_NETCONN_SEM_PER_THREAD\n#define SELECT_SEM_T        sys_sem_t*\n#define SELECT_SEM_PTR(sem) (sem)\n#else /* LWIP_NETCONN_SEM_PER_THREAD */\n#define SELECT_SEM_T        sys_sem_t\n#define SELECT_SEM_PTR(sem) (&(sem))\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n\n/** Description for a task waiting in select */\nstruct lwip_select_cb {\n  /** Pointer to the next waiting task */\n  struct lwip_select_cb *next;\n  /** Pointer to the previous waiting task */\n  struct lwip_select_cb *prev;\n  /** readset passed to select */\n  fd_set *readset;\n  /** writeset passed to select */\n  fd_set *writeset;\n  /** unimplemented: exceptset passed to select */\n  fd_set *exceptset;\n  /** don't signal the same semaphore twice: set to 1 when signalled */\n  int sem_signalled;\n  /** semaphore to wake up a task waiting for select */\n  SELECT_SEM_T sem;\n};\n\n/** A struct sockaddr replacement that has the same alignment as sockaddr_in/\n *  sockaddr_in6 if instantiated.\n */\nunion sockaddr_aligned {\n   struct sockaddr sa;\n#if LWIP_IPV6\n   struct sockaddr_in6 sin6;\n#endif /* LWIP_IPV6 */\n#if LWIP_IPV4\n   struct sockaddr_in sin;\n#endif /* LWIP_IPV4 */\n};\n\n#if LWIP_IGMP\n/* Define the number of IPv4 multicast memberships, default is one per socket */\n#ifndef LWIP_SOCKET_MAX_MEMBERSHIPS\n#define LWIP_SOCKET_MAX_MEMBERSHIPS NUM_SOCKETS\n#endif\n\n/* This is to keep track of IP_ADD_MEMBERSHIP calls to drop the membership when\n   a socket is closed */\nstruct lwip_socket_multicast_pair {\n  /** the socket */\n  struct lwip_sock* sock;\n  /** the interface address */\n  ip4_addr_t if_addr;\n  /** the group address */\n  ip4_addr_t multi_addr;\n};\n\nstruct lwip_socket_multicast_pair socket_ipv4_multicast_memberships[LWIP_SOCKET_MAX_MEMBERSHIPS];\n\nstatic int  lwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr);\nstatic void lwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr);\nstatic void lwip_socket_drop_registered_memberships(int s);\n#endif /* LWIP_IGMP */\n\n/** The global array of available sockets */\nstatic struct lwip_sock sockets[NUM_SOCKETS];\n/** The global list of tasks waiting for select */\nstatic struct lwip_select_cb *select_cb_list;\n/** This counter is increased from lwip_select when the list is changed\n    and checked in event_callback to see if it has changed. */\nstatic volatile int select_cb_ctr;\n\n#if LWIP_SOCKET_SET_ERRNO\n#ifndef set_errno\n#define set_errno(err) do { if (err) { errno = (err); } } while(0)\n#endif\n#else /* LWIP_SOCKET_SET_ERRNO */\n#define set_errno(err)\n#endif /* LWIP_SOCKET_SET_ERRNO */\n\n#define sock_set_errno(sk, e) do { \\\n  const int sockerr = (e); \\\n  sk->err = (u8_t)sockerr; \\\n  set_errno(sockerr); \\\n} while (0)\n\n/* Forward declaration of some functions */\nstatic void event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len);\n#if !LWIP_TCPIP_CORE_LOCKING\nstatic void lwip_getsockopt_callback(void *arg);\nstatic void lwip_setsockopt_callback(void *arg);\n#endif\nstatic u8_t lwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *optlen);\nstatic u8_t lwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_t optlen);\n\n#if LWIP_IPV4 && LWIP_IPV6\nstatic void\nsockaddr_to_ipaddr_port(const struct sockaddr* sockaddr, ip_addr_t* ipaddr, u16_t* port)\n{\n  if ((sockaddr->sa_family) == AF_INET6) {\n    SOCKADDR6_TO_IP6ADDR_PORT((const struct sockaddr_in6*)(const void*)(sockaddr), ipaddr, *port);\n    ipaddr->type = IPADDR_TYPE_V6;\n  } else {\n    SOCKADDR4_TO_IP4ADDR_PORT((const struct sockaddr_in*)(const void*)(sockaddr), ipaddr, *port);\n    ipaddr->type = IPADDR_TYPE_V4;\n  }\n}\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n/** LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */\nvoid\nlwip_socket_thread_init(void)\n{\n   netconn_thread_init();\n}\n\n/** LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */\nvoid\nlwip_socket_thread_cleanup(void)\n{\n   netconn_thread_cleanup();\n}\n\n/**\n * Map a externally used socket index to the internal socket representation.\n *\n * @param s externally used socket index\n * @return struct lwip_sock for the socket or NULL if not found\n */\nstatic struct lwip_sock *\nget_socket(int s)\n{\n  struct lwip_sock *sock;\n\n  s -= LWIP_SOCKET_OFFSET;\n\n  if ((s < 0) || (s >= NUM_SOCKETS)) {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"get_socket(%d): invalid\\n\", s + LWIP_SOCKET_OFFSET));\n    set_errno(EBADF);\n    return NULL;\n  }\n\n  sock = &sockets[s];\n\n  if (!sock->conn) {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"get_socket(%d): not active\\n\", s + LWIP_SOCKET_OFFSET));\n    set_errno(EBADF);\n    return NULL;\n  }\n\n  return sock;\n}\n\n/**\n * Same as get_socket but doesn't set errno\n *\n * @param s externally used socket index\n * @return struct lwip_sock for the socket or NULL if not found\n */\nstatic struct lwip_sock *\ntryget_socket(int s)\n{\n  s -= LWIP_SOCKET_OFFSET;\n  if ((s < 0) || (s >= NUM_SOCKETS)) {\n    return NULL;\n  }\n  if (!sockets[s].conn) {\n    return NULL;\n  }\n  return &sockets[s];\n}\n\n/**\n * Allocate a new socket for a given netconn.\n *\n * @param newconn the netconn for which to allocate a socket\n * @param accepted 1 if socket has been created by accept(),\n *                 0 if socket has been created by socket()\n * @return the index of the new socket; -1 on error\n */\nstatic int\nalloc_socket(struct netconn *newconn, int accepted)\n{\n  int i;\n  SYS_ARCH_DECL_PROTECT(lev);\n\n  /* allocate a new socket identifier */\n  for (i = 0; i < NUM_SOCKETS; ++i) {\n    /* Protect socket array */\n    SYS_ARCH_PROTECT(lev);\n    if (!sockets[i].conn && (sockets[i].select_waiting == 0)) {\n      sockets[i].conn       = newconn;\n      /* The socket is not yet known to anyone, so no need to protect\n         after having marked it as used. */\n      SYS_ARCH_UNPROTECT(lev);\n      sockets[i].lastdata   = NULL;\n      sockets[i].lastoffset = 0;\n      sockets[i].rcvevent   = 0;\n      /* TCP sendbuf is empty, but the socket is not yet writable until connected\n       * (unless it has been created by accept()). */\n      sockets[i].sendevent  = (NETCONNTYPE_GROUP(newconn->type) == NETCONN_TCP ? (accepted != 0) : 1);\n      sockets[i].errevent   = 0;\n      sockets[i].err        = 0;\n      return i + LWIP_SOCKET_OFFSET;\n    }\n    SYS_ARCH_UNPROTECT(lev);\n  }\n  return -1;\n}\n\n/** Free a socket. The socket's netconn must have been\n * delete before!\n *\n * @param sock the socket to free\n * @param is_tcp != 0 for TCP sockets, used to free lastdata\n */\nstatic void\nfree_socket(struct lwip_sock *sock, int is_tcp)\n{\n  void *lastdata;\n\n  lastdata         = sock->lastdata;\n  sock->lastdata   = NULL;\n  sock->lastoffset = 0;\n  sock->err        = 0;\n\n  /* Protect socket array */\n  SYS_ARCH_SET(sock->conn, NULL);\n  /* don't use 'sock' after this line, as another task might have allocated it */\n\n  if (lastdata != NULL) {\n    if (is_tcp) {\n      pbuf_free((struct pbuf *)lastdata);\n    } else {\n      netbuf_delete((struct netbuf *)lastdata);\n    }\n  }\n}\n\n/* Below this, the well-known socket functions are implemented.\n * Use google.com or opengroup.org to get a good description :-)\n *\n * Exceptions are documented!\n */\n\nint\nlwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen)\n{\n  struct lwip_sock *sock, *nsock;\n  struct netconn *newconn;\n  ip_addr_t naddr;\n  u16_t port = 0;\n  int newsock;\n  err_t err;\n  SYS_ARCH_DECL_PROTECT(lev);\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_accept(%d)...\\n\", s));\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  if (netconn_is_nonblocking(sock->conn) && (sock->rcvevent <= 0)) {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_accept(%d): returning EWOULDBLOCK\\n\", s));\n    set_errno(EWOULDBLOCK);\n    return -1;\n  }\n\n  /* wait for a new connection */\n  err = netconn_accept(sock->conn, &newconn);\n  if (err != ERR_OK) {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_accept(%d): netconn_acept failed, err=%d\\n\", s, err));\n    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {\n      sock_set_errno(sock, EOPNOTSUPP);\n    } else if (err == ERR_CLSD) {\n      sock_set_errno(sock, EINVAL);\n    } else {\n      sock_set_errno(sock, err_to_errno(err));\n    }\n    return -1;\n  }\n  LWIP_ASSERT(\"newconn != NULL\", newconn != NULL);\n\n  newsock = alloc_socket(newconn, 1);\n  if (newsock == -1) {\n    netconn_delete(newconn);\n    sock_set_errno(sock, ENFILE);\n    return -1;\n  }\n  LWIP_ASSERT(\"invalid socket index\", (newsock >= LWIP_SOCKET_OFFSET) && (newsock < NUM_SOCKETS + LWIP_SOCKET_OFFSET));\n  LWIP_ASSERT(\"newconn->callback == event_callback\", newconn->callback == event_callback);\n  nsock = &sockets[newsock - LWIP_SOCKET_OFFSET];\n\n  /* See event_callback: If data comes in right away after an accept, even\n   * though the server task might not have created a new socket yet.\n   * In that case, newconn->socket is counted down (newconn->socket--),\n   * so nsock->rcvevent is >= 1 here!\n   */\n  SYS_ARCH_PROTECT(lev);\n  nsock->rcvevent += (s16_t)(-1 - newconn->socket);\n  newconn->socket = newsock;\n  SYS_ARCH_UNPROTECT(lev);\n\n  /* Note that POSIX only requires us to check addr is non-NULL. addrlen must\n   * not be NULL if addr is valid.\n   */\n  if (addr != NULL) {\n    union sockaddr_aligned tempaddr;\n    /* get the IP address and port of the remote host */\n    err = netconn_peer(newconn, &naddr, &port);\n    if (err != ERR_OK) {\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_accept(%d): netconn_peer failed, err=%d\\n\", s, err));\n      netconn_delete(newconn);\n      free_socket(nsock, 1);\n      sock_set_errno(sock, err_to_errno(err));\n      return -1;\n    }\n    LWIP_ASSERT(\"addr valid but addrlen NULL\", addrlen != NULL);\n\n    IPADDR_PORT_TO_SOCKADDR(&tempaddr, &naddr, port);\n    if (*addrlen > tempaddr.sa.sa_len) {\n      *addrlen = tempaddr.sa.sa_len;\n    }\n    MEMCPY(addr, &tempaddr, *addrlen);\n\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_accept(%d) returning new sock=%d addr=\", s, newsock));\n    ip_addr_debug_print_val(SOCKETS_DEBUG, naddr);\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\" port=%\"U16_F\"\\n\", port));\n  } else {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_accept(%d) returning new sock=%d\", s, newsock));\n  }\n\n  sock_set_errno(sock, 0);\n  return newsock;\n}\n\nint\nlwip_bind(int s, const struct sockaddr *name, socklen_t namelen)\n{\n  struct lwip_sock *sock;\n  ip_addr_t local_addr;\n  u16_t local_port;\n  err_t err;\n\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  if (!SOCK_ADDR_TYPE_MATCH(name, sock)) {\n    /* sockaddr does not match socket type (IPv4/IPv6) */\n    sock_set_errno(sock, err_to_errno(ERR_VAL));\n    return -1;\n  }\n\n  /* check size, family and alignment of 'name' */\n  LWIP_ERROR(\"lwip_bind: invalid address\", (IS_SOCK_ADDR_LEN_VALID(namelen) &&\n             IS_SOCK_ADDR_TYPE_VALID(name) && IS_SOCK_ADDR_ALIGNED(name)),\n             sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;);\n  LWIP_UNUSED_ARG(namelen);\n\n  SOCKADDR_TO_IPADDR_PORT(name, &local_addr, local_port);\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_bind(%d, addr=\", s));\n  ip_addr_debug_print_val(SOCKETS_DEBUG, local_addr);\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\" port=%\"U16_F\")\\n\", local_port));\n\n#if LWIP_IPV4 && LWIP_IPV6\n  /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */\n  if (IP_IS_V6_VAL(local_addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&local_addr))) {\n    unmap_ipv4_mapped_ipv6(ip_2_ip4(&local_addr), ip_2_ip6(&local_addr));\n    IP_SET_TYPE_VAL(local_addr, IPADDR_TYPE_V4);\n  }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n  err = netconn_bind(sock->conn, &local_addr, local_port);\n\n  if (err != ERR_OK) {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_bind(%d) failed, err=%d\\n\", s, err));\n    sock_set_errno(sock, err_to_errno(err));\n    return -1;\n  }\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_bind(%d) succeeded\\n\", s));\n  sock_set_errno(sock, 0);\n  return 0;\n}\n\nint\nlwip_close(int s)\n{\n  struct lwip_sock *sock;\n  int is_tcp = 0;\n  err_t err;\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_close(%d)\\n\", s));\n\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  if (sock->conn != NULL) {\n    is_tcp = NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP;\n  } else {\n    LWIP_ASSERT(\"sock->lastdata == NULL\", sock->lastdata == NULL);\n  }\n\n#if LWIP_IGMP\n  /* drop all possibly joined IGMP memberships */\n  lwip_socket_drop_registered_memberships(s);\n#endif /* LWIP_IGMP */\n\n  err = netconn_delete(sock->conn);\n  if (err != ERR_OK) {\n    sock_set_errno(sock, err_to_errno(err));\n    return -1;\n  }\n\n  free_socket(sock, is_tcp);\n  set_errno(0);\n  return 0;\n}\n\nint\nlwip_connect(int s, const struct sockaddr *name, socklen_t namelen)\n{\n  struct lwip_sock *sock;\n  err_t err;\n\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  if (!SOCK_ADDR_TYPE_MATCH_OR_UNSPEC(name, sock)) {\n    /* sockaddr does not match socket type (IPv4/IPv6) */\n    sock_set_errno(sock, err_to_errno(ERR_VAL));\n    return -1;\n  }\n\n  LWIP_UNUSED_ARG(namelen);\n  if (name->sa_family == AF_UNSPEC) {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_connect(%d, AF_UNSPEC)\\n\", s));\n    err = netconn_disconnect(sock->conn);\n  } else {\n    ip_addr_t remote_addr;\n    u16_t remote_port;\n\n    /* check size, family and alignment of 'name' */\n    LWIP_ERROR(\"lwip_connect: invalid address\", IS_SOCK_ADDR_LEN_VALID(namelen) &&\n               IS_SOCK_ADDR_TYPE_VALID_OR_UNSPEC(name) && IS_SOCK_ADDR_ALIGNED(name),\n               sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;);\n\n    SOCKADDR_TO_IPADDR_PORT(name, &remote_addr, remote_port);\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_connect(%d, addr=\", s));\n    ip_addr_debug_print_val(SOCKETS_DEBUG, remote_addr);\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\" port=%\"U16_F\")\\n\", remote_port));\n\n#if LWIP_IPV4 && LWIP_IPV6\n    /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */\n    if (IP_IS_V6_VAL(remote_addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&remote_addr))) {\n      unmap_ipv4_mapped_ipv6(ip_2_ip4(&remote_addr), ip_2_ip6(&remote_addr));\n      IP_SET_TYPE_VAL(remote_addr, IPADDR_TYPE_V4);\n    }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n    err = netconn_connect(sock->conn, &remote_addr, remote_port);\n  }\n\n  if (err != ERR_OK) {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_connect(%d) failed, err=%d\\n\", s, err));\n    sock_set_errno(sock, err_to_errno(err));\n    return -1;\n  }\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_connect(%d) succeeded\\n\", s));\n  sock_set_errno(sock, 0);\n  return 0;\n}\n\n/**\n * Set a socket into listen mode.\n * The socket may not have been used for another connection previously.\n *\n * @param s the socket to set to listening mode\n * @param backlog (ATTENTION: needs TCP_LISTEN_BACKLOG=1)\n * @return 0 on success, non-zero on failure\n */\nint\nlwip_listen(int s, int backlog)\n{\n  struct lwip_sock *sock;\n  err_t err;\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_listen(%d, backlog=%d)\\n\", s, backlog));\n\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  /* limit the \"backlog\" parameter to fit in an u8_t */\n  backlog = LWIP_MIN(LWIP_MAX(backlog, 0), 0xff);\n\n  err = netconn_listen_with_backlog(sock->conn, (u8_t)backlog);\n\n  if (err != ERR_OK) {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_listen(%d) failed, err=%d\\n\", s, err));\n    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {\n      sock_set_errno(sock, EOPNOTSUPP);\n      return -1;\n    }\n    sock_set_errno(sock, err_to_errno(err));\n    return -1;\n  }\n\n  sock_set_errno(sock, 0);\n  return 0;\n}\n\nint\nlwip_recvfrom(int s, void *mem, size_t len, int flags,\n              struct sockaddr *from, socklen_t *fromlen)\n{\n  struct lwip_sock *sock;\n  void             *buf = NULL;\n  struct pbuf      *p;\n  u16_t            buflen, copylen;\n  int              off = 0;\n  u8_t             done = 0;\n  err_t            err;\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_recvfrom(%d, %p, %\"SZT_F\", 0x%x, ..)\\n\", s, mem, len, flags));\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  do {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_recvfrom: top while sock->lastdata=%p\\n\", sock->lastdata));\n    /* Check if there is data left from the last recv operation. */\n    if (sock->lastdata) {\n      buf = sock->lastdata;\n    } else {\n      /* If this is non-blocking call, then check first */\n      if (((flags & MSG_DONTWAIT) || netconn_is_nonblocking(sock->conn)) &&\n          (sock->rcvevent <= 0)) {\n        if (off > 0) {\n          /* already received data, return that */\n          sock_set_errno(sock, 0);\n          return off;\n        }\n        LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_recvfrom(%d): returning EWOULDBLOCK\\n\", s));\n        set_errno(EWOULDBLOCK);\n        return -1;\n      }\n\n      /* No data was left from the previous operation, so we try to get\n         some from the network. */\n      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {\n        err = netconn_recv_tcp_pbuf(sock->conn, (struct pbuf **)&buf);\n      } else {\n        err = netconn_recv(sock->conn, (struct netbuf **)&buf);\n      }\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_recvfrom: netconn_recv err=%d, netbuf=%p\\n\",\n        err, buf));\n\n      if (err != ERR_OK) {\n        if (off > 0) {\n          if (err == ERR_CLSD) {\n            /* closed but already received data, ensure select gets the FIN, too */\n            event_callback(sock->conn, NETCONN_EVT_RCVPLUS, 0);\n          }\n          /* already received data, return that */\n          sock_set_errno(sock, 0);\n          return off;\n        }\n        /* We should really do some error checking here. */\n        LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_recvfrom(%d): buf == NULL, error is \\\"%s\\\"!\\n\",\n          s, lwip_strerr(err)));\n        sock_set_errno(sock, err_to_errno(err));\n        if (err == ERR_CLSD) {\n          return 0;\n        } else {\n          return -1;\n        }\n      }\n      LWIP_ASSERT(\"buf != NULL\", buf != NULL);\n      sock->lastdata = buf;\n    }\n\n    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {\n      p = (struct pbuf *)buf;\n    } else {\n      p = ((struct netbuf *)buf)->p;\n    }\n    buflen = p->tot_len;\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_recvfrom: buflen=%\"U16_F\" len=%\"SZT_F\" off=%d sock->lastoffset=%\"U16_F\"\\n\",\n      buflen, len, off, sock->lastoffset));\n\n    buflen -= sock->lastoffset;\n\n    if (len > buflen) {\n      copylen = buflen;\n    } else {\n      copylen = (u16_t)len;\n    }\n\n    /* copy the contents of the received buffer into\n    the supplied memory pointer mem */\n    pbuf_copy_partial(p, (u8_t*)mem + off, copylen, sock->lastoffset);\n\n    off += copylen;\n\n    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {\n      LWIP_ASSERT(\"invalid copylen, len would underflow\", len >= copylen);\n      len -= copylen;\n      if ((len <= 0) ||\n          (p->flags & PBUF_FLAG_PUSH) ||\n          (sock->rcvevent <= 0) ||\n          ((flags & MSG_PEEK) != 0)) {\n        done = 1;\n      }\n    } else {\n      done = 1;\n    }\n\n    /* Check to see from where the data was.*/\n    if (done) {\n#if !SOCKETS_DEBUG\n      if (from && fromlen)\n#endif /* !SOCKETS_DEBUG */\n      {\n        u16_t port;\n        ip_addr_t tmpaddr;\n        ip_addr_t *fromaddr;\n        union sockaddr_aligned saddr;\n        LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_recvfrom(%d): addr=\", s));\n        if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {\n          fromaddr = &tmpaddr;\n          netconn_getaddr(sock->conn, fromaddr, &port, 0);\n        } else {\n          port = netbuf_fromport((struct netbuf *)buf);\n          fromaddr = netbuf_fromaddr((struct netbuf *)buf);\n        }\n\n#if LWIP_IPV4 && LWIP_IPV6\n        /* Dual-stack: Map IPv4 addresses to IPv4 mapped IPv6 */\n        if (NETCONNTYPE_ISIPV6(netconn_type(sock->conn)) && IP_IS_V4(fromaddr)) {\n          ip4_2_ipv4_mapped_ipv6(ip_2_ip6(fromaddr), ip_2_ip4(fromaddr));\n          IP_SET_TYPE(fromaddr, IPADDR_TYPE_V6);\n        }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n        IPADDR_PORT_TO_SOCKADDR(&saddr, fromaddr, port);\n        ip_addr_debug_print(SOCKETS_DEBUG, fromaddr);\n        LWIP_DEBUGF(SOCKETS_DEBUG, (\" port=%\"U16_F\" len=%d\\n\", port, off));\n#if SOCKETS_DEBUG\n        if (from && fromlen)\n#endif /* SOCKETS_DEBUG */\n        {\n          if (*fromlen > saddr.sa.sa_len) {\n            *fromlen = saddr.sa.sa_len;\n          }\n          MEMCPY(from, &saddr, *fromlen);\n        }\n      }\n    }\n\n    /* If we don't peek the incoming message... */\n    if ((flags & MSG_PEEK) == 0) {\n      /* If this is a TCP socket, check if there is data left in the\n         buffer. If so, it should be saved in the sock structure for next\n         time around. */\n      if ((NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) && (buflen - copylen > 0)) {\n        sock->lastdata = buf;\n        sock->lastoffset += copylen;\n        LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_recvfrom: lastdata now netbuf=%p\\n\", buf));\n      } else {\n        sock->lastdata = NULL;\n        sock->lastoffset = 0;\n        LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_recvfrom: deleting netbuf=%p\\n\", buf));\n        if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {\n          pbuf_free((struct pbuf *)buf);\n        } else {\n          netbuf_delete((struct netbuf *)buf);\n        }\n        buf = NULL;\n      }\n    }\n  } while (!done);\n\n  sock_set_errno(sock, 0);\n  return off;\n}\n\nint\nlwip_read(int s, void *mem, size_t len)\n{\n  return lwip_recvfrom(s, mem, len, 0, NULL, NULL);\n}\n\nint\nlwip_recv(int s, void *mem, size_t len, int flags)\n{\n  return lwip_recvfrom(s, mem, len, flags, NULL, NULL);\n}\n\nint\nlwip_send(int s, const void *data, size_t size, int flags)\n{\n  struct lwip_sock *sock;\n  err_t err;\n  u8_t write_flags;\n  size_t written;\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_send(%d, data=%p, size=%\"SZT_F\", flags=0x%x)\\n\",\n                              s, data, size, flags));\n\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {\n#if (LWIP_UDP || LWIP_RAW)\n    return lwip_sendto(s, data, size, flags, NULL, 0);\n#else /* (LWIP_UDP || LWIP_RAW) */\n    sock_set_errno(sock, err_to_errno(ERR_ARG));\n    return -1;\n#endif /* (LWIP_UDP || LWIP_RAW) */\n  }\n\n  write_flags = NETCONN_COPY |\n    ((flags & MSG_MORE)     ? NETCONN_MORE      : 0) |\n    ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0);\n  written = 0;\n  err = netconn_write_partly(sock->conn, data, size, write_flags, &written);\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_send(%d) err=%d written=%\"SZT_F\"\\n\", s, err, written));\n  sock_set_errno(sock, err_to_errno(err));\n  return (err == ERR_OK ? (int)written : -1);\n}\n\nint\nlwip_sendmsg(int s, const struct msghdr *msg, int flags)\n{\n  struct lwip_sock *sock;\n  int i;\n#if LWIP_TCP\n  u8_t write_flags;\n  size_t written;\n#endif\n  int size = 0;\n  err_t err = ERR_OK;\n\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  LWIP_ERROR(\"lwip_sendmsg: invalid msghdr\", msg != NULL,\n             sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;);\n\n  LWIP_UNUSED_ARG(msg->msg_control);\n  LWIP_UNUSED_ARG(msg->msg_controllen);\n  LWIP_UNUSED_ARG(msg->msg_flags);\n  LWIP_ERROR(\"lwip_sendmsg: invalid msghdr iov\", (msg->msg_iov != NULL && msg->msg_iovlen != 0),\n             sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;);\n\n  if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {\n#if LWIP_TCP\n    write_flags = NETCONN_COPY |\n    ((flags & MSG_MORE)     ? NETCONN_MORE      : 0) |\n    ((flags & MSG_DONTWAIT) ? NETCONN_DONTBLOCK : 0);\n\n    for (i = 0; i < msg->msg_iovlen; i++) {\n      u8_t apiflags = write_flags;\n      if (i + 1 < msg->msg_iovlen) {\n        apiflags |= NETCONN_MORE;\n      }\n      written = 0;\n      err = netconn_write_partly(sock->conn, msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len, write_flags, &written);\n      if (err == ERR_OK) {\n        size += written;\n        /* check that the entire IO vector was accepected, if not return a partial write */\n        if (written != msg->msg_iov[i].iov_len)\n          break;\n      }\n      /* none of this IO vector was accepted, but previous was, return partial write and conceal ERR_WOULDBLOCK */\n      else if (err == ERR_WOULDBLOCK && size > 0) {\n        err = ERR_OK;\n        /* let ERR_WOULDBLOCK persist on the netconn since we are returning ERR_OK */\n        break;\n      } else {\n        size = -1;\n        break;\n      }\n    }\n    sock_set_errno(sock, err_to_errno(err));\n    return size;\n#else /* LWIP_TCP */\n    sock_set_errno(sock, err_to_errno(ERR_ARG));\n    return -1;\n#endif /* LWIP_TCP */\n  }\n  /* else, UDP and RAW NETCONNs */\n#if LWIP_UDP || LWIP_RAW\n  {\n    struct netbuf *chain_buf;\n\n    LWIP_UNUSED_ARG(flags);\n    LWIP_ERROR(\"lwip_sendmsg: invalid msghdr name\", (((msg->msg_name == NULL) && (msg->msg_namelen == 0)) ||\n               IS_SOCK_ADDR_LEN_VALID(msg->msg_namelen)) ,\n               sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;);\n\n    /* initialize chain buffer with destination */\n    chain_buf = netbuf_new();\n    if (!chain_buf) {\n      sock_set_errno(sock, err_to_errno(ERR_MEM));\n      return -1;\n    }\n    if (msg->msg_name) {\n      u16_t remote_port;\n      SOCKADDR_TO_IPADDR_PORT((const struct sockaddr *)msg->msg_name, &chain_buf->addr, remote_port);\n      netbuf_fromport(chain_buf) = remote_port;\n    }\n#if LWIP_NETIF_TX_SINGLE_PBUF\n    for (i = 0; i < msg->msg_iovlen; i++) {\n      size += msg->msg_iov[i].iov_len;\n    }\n    /* Allocate a new netbuf and copy the data into it. */\n    if (netbuf_alloc(chain_buf, (u16_t)size) == NULL) {\n       err = ERR_MEM;\n    } else {\n      /* flatten the IO vectors */\n      size_t offset = 0;\n      for (i = 0; i < msg->msg_iovlen; i++) {\n        MEMCPY(&((u8_t*)chain_buf->p->payload)[offset], msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len);\n        offset += msg->msg_iov[i].iov_len;\n      }\n#if LWIP_CHECKSUM_ON_COPY\n      {\n        /* This can be improved by using LWIP_CHKSUM_COPY() and aggregating the checksum for each IO vector */\n        u16_t chksum = ~inet_chksum_pbuf(chain_buf->p);\n        netbuf_set_chksum(chain_buf, chksum);\n      }\n#endif /* LWIP_CHECKSUM_ON_COPY */\n      err = ERR_OK;\n    }\n#else /* LWIP_NETIF_TX_SINGLE_PBUF */\n    /* create a chained netbuf from the IO vectors. NOTE: we assemble a pbuf chain\n       manually to avoid having to allocate, chain, and delete a netbuf for each iov */\n    for (i = 0; i < msg->msg_iovlen; i++) {\n      struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 0, PBUF_REF);\n      if (p == NULL) {\n        err = ERR_MEM; /* let netbuf_delete() cleanup chain_buf */\n        break;\n      }\n      p->payload = msg->msg_iov[i].iov_base;\n      LWIP_ASSERT(\"iov_len < u16_t\", msg->msg_iov[i].iov_len <= 0xFFFF);\n      p->len = p->tot_len = (u16_t)msg->msg_iov[i].iov_len;\n      /* netbuf empty, add new pbuf */\n      if (chain_buf->p == NULL) {\n        chain_buf->p = chain_buf->ptr = p;\n        /* add pbuf to existing pbuf chain */\n      } else {\n        pbuf_cat(chain_buf->p, p);\n      }\n    }\n    /* save size of total chain */\n    if (err == ERR_OK) {\n      size = netbuf_len(chain_buf);\n    }\n#endif /* LWIP_NETIF_TX_SINGLE_PBUF */\n\n    if (err == ERR_OK) {\n#if LWIP_IPV4 && LWIP_IPV6\n      /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */\n      if (IP_IS_V6_VAL(chain_buf->addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&chain_buf->addr))) {\n        unmap_ipv4_mapped_ipv6(ip_2_ip4(&chain_buf->addr), ip_2_ip6(&chain_buf->addr));\n        IP_SET_TYPE_VAL(chain_buf->addr, IPADDR_TYPE_V4);\n      }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n      /* send the data */\n      err = netconn_send(sock->conn, chain_buf);\n    }\n\n    /* deallocated the buffer */\n    netbuf_delete(chain_buf);\n\n    sock_set_errno(sock, err_to_errno(err));\n    return (err == ERR_OK ? size : -1);\n  }\n#else /* LWIP_UDP || LWIP_RAW */\n  sock_set_errno(sock, err_to_errno(ERR_ARG));\n  return -1;\n#endif /* LWIP_UDP || LWIP_RAW */\n}\n\nint\nlwip_sendto(int s, const void *data, size_t size, int flags,\n       const struct sockaddr *to, socklen_t tolen)\n{\n  struct lwip_sock *sock;\n  err_t err;\n  u16_t short_size;\n  u16_t remote_port;\n  struct netbuf buf;\n\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) == NETCONN_TCP) {\n#if LWIP_TCP\n    return lwip_send(s, data, size, flags);\n#else /* LWIP_TCP */\n    LWIP_UNUSED_ARG(flags);\n    sock_set_errno(sock, err_to_errno(ERR_ARG));\n    return -1;\n#endif /* LWIP_TCP */\n  }\n\n  /* @todo: split into multiple sendto's? */\n  LWIP_ASSERT(\"lwip_sendto: size must fit in u16_t\", size <= 0xffff);\n  short_size = (u16_t)size;\n  LWIP_ERROR(\"lwip_sendto: invalid address\", (((to == NULL) && (tolen == 0)) ||\n             (IS_SOCK_ADDR_LEN_VALID(tolen) &&\n             IS_SOCK_ADDR_TYPE_VALID(to) && IS_SOCK_ADDR_ALIGNED(to))),\n             sock_set_errno(sock, err_to_errno(ERR_ARG)); return -1;);\n  LWIP_UNUSED_ARG(tolen);\n\n  /* initialize a buffer */\n  buf.p = buf.ptr = NULL;\n#if LWIP_CHECKSUM_ON_COPY\n  buf.flags = 0;\n#endif /* LWIP_CHECKSUM_ON_COPY */\n  if (to) {\n    SOCKADDR_TO_IPADDR_PORT(to, &buf.addr, remote_port);\n  } else {\n    remote_port = 0;\n    ip_addr_set_any(NETCONNTYPE_ISIPV6(netconn_type(sock->conn)), &buf.addr);\n  }\n  netbuf_fromport(&buf) = remote_port;\n\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_sendto(%d, data=%p, short_size=%\"U16_F\", flags=0x%x to=\",\n              s, data, short_size, flags));\n  ip_addr_debug_print(SOCKETS_DEBUG, &buf.addr);\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\" port=%\"U16_F\"\\n\", remote_port));\n\n  /* make the buffer point to the data that should be sent */\n#if LWIP_NETIF_TX_SINGLE_PBUF\n  /* Allocate a new netbuf and copy the data into it. */\n  if (netbuf_alloc(&buf, short_size) == NULL) {\n    err = ERR_MEM;\n  } else {\n#if LWIP_CHECKSUM_ON_COPY\n    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_RAW) {\n      u16_t chksum = LWIP_CHKSUM_COPY(buf.p->payload, data, short_size);\n      netbuf_set_chksum(&buf, chksum);\n    } else\n#endif /* LWIP_CHECKSUM_ON_COPY */\n    {\n      MEMCPY(buf.p->payload, data, short_size);\n    }\n    err = ERR_OK;\n  }\n#else /* LWIP_NETIF_TX_SINGLE_PBUF */\n  err = netbuf_ref(&buf, data, short_size);\n#endif /* LWIP_NETIF_TX_SINGLE_PBUF */\n  if (err == ERR_OK) {\n#if LWIP_IPV4 && LWIP_IPV6\n    /* Dual-stack: Unmap IPv4 mapped IPv6 addresses */\n    if (IP_IS_V6_VAL(buf.addr) && ip6_addr_isipv4mappedipv6(ip_2_ip6(&buf.addr))) {\n      unmap_ipv4_mapped_ipv6(ip_2_ip4(&buf.addr), ip_2_ip6(&buf.addr));\n      IP_SET_TYPE_VAL(buf.addr, IPADDR_TYPE_V4);\n    }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n    /* send the data */\n    err = netconn_send(sock->conn, &buf);\n  }\n\n  /* deallocated the buffer */\n  netbuf_free(&buf);\n\n  sock_set_errno(sock, err_to_errno(err));\n  return (err == ERR_OK ? short_size : -1);\n}\n\nint\nlwip_socket(int domain, int type, int protocol)\n{\n  struct netconn *conn;\n  int i;\n\n  LWIP_UNUSED_ARG(domain); /* @todo: check this */\n\n  /* create a netconn */\n  switch (type) {\n  case SOCK_RAW:\n    conn = netconn_new_with_proto_and_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_RAW),\n                                               (u8_t)protocol, event_callback);\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_socket(%s, SOCK_RAW, %d) = \",\n                                 domain == PF_INET ? \"PF_INET\" : \"UNKNOWN\", protocol));\n    break;\n  case SOCK_DGRAM:\n    conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain,\n                 ((protocol == IPPROTO_UDPLITE) ? NETCONN_UDPLITE : NETCONN_UDP)) ,\n                 event_callback);\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_socket(%s, SOCK_DGRAM, %d) = \",\n                                 domain == PF_INET ? \"PF_INET\" : \"UNKNOWN\", protocol));\n    break;\n  case SOCK_STREAM:\n    conn = netconn_new_with_callback(DOMAIN_TO_NETCONN_TYPE(domain, NETCONN_TCP), event_callback);\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_socket(%s, SOCK_STREAM, %d) = \",\n                                 domain == PF_INET ? \"PF_INET\" : \"UNKNOWN\", protocol));\n    break;\n  default:\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_socket(%d, %d/UNKNOWN, %d) = -1\\n\",\n                                 domain, type, protocol));\n    set_errno(EINVAL);\n    return -1;\n  }\n\n  if (!conn) {\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"-1 / ENOBUFS (could not create netconn)\\n\"));\n    set_errno(ENOBUFS);\n    return -1;\n  }\n\n  i = alloc_socket(conn, 0);\n\n  if (i == -1) {\n    netconn_delete(conn);\n    set_errno(ENFILE);\n    return -1;\n  }\n  conn->socket = i;\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"%d\\n\", i));\n  set_errno(0);\n  return i;\n}\n\nint\nlwip_write(int s, const void *data, size_t size)\n{\n  return lwip_send(s, data, size, 0);\n}\n\nint\nlwip_writev(int s, const struct iovec *iov, int iovcnt)\n{\n  struct msghdr msg;\n\n  msg.msg_name = NULL;\n  msg.msg_namelen = 0;\n  /* Hack: we have to cast via number to cast from 'const' pointer to non-const.\n     Blame the opengroup standard for this inconsistency. */\n  msg.msg_iov = LWIP_CONST_CAST(struct iovec *, iov);\n  msg.msg_iovlen = iovcnt;\n  msg.msg_control = NULL;\n  msg.msg_controllen = 0;\n  msg.msg_flags = 0;\n  return lwip_sendmsg(s, &msg, 0);\n}\n\n/**\n * Go through the readset and writeset lists and see which socket of the sockets\n * set in the sets has events. On return, readset, writeset and exceptset have\n * the sockets enabled that had events.\n *\n * @param maxfdp1 the highest socket index in the sets\n * @param readset_in    set of sockets to check for read events\n * @param writeset_in   set of sockets to check for write events\n * @param exceptset_in  set of sockets to check for error events\n * @param readset_out   set of sockets that had read events\n * @param writeset_out  set of sockets that had write events\n * @param exceptset_out set os sockets that had error events\n * @return number of sockets that had events (read/write/exception) (>= 0)\n */\nstatic int\nlwip_selscan(int maxfdp1, fd_set *readset_in, fd_set *writeset_in, fd_set *exceptset_in,\n             fd_set *readset_out, fd_set *writeset_out, fd_set *exceptset_out)\n{\n  int i, nready = 0;\n  fd_set lreadset, lwriteset, lexceptset;\n  struct lwip_sock *sock;\n  SYS_ARCH_DECL_PROTECT(lev);\n\n  FD_ZERO(&lreadset);\n  FD_ZERO(&lwriteset);\n  FD_ZERO(&lexceptset);\n\n  /* Go through each socket in each list to count number of sockets which\n     currently match */\n  for (i = LWIP_SOCKET_OFFSET; i < maxfdp1; i++) {\n    /* if this FD is not in the set, continue */\n    if (!(readset_in && FD_ISSET(i, readset_in)) &&\n        !(writeset_in && FD_ISSET(i, writeset_in)) &&\n        !(exceptset_in && FD_ISSET(i, exceptset_in))) {\n      continue;\n    }\n    /* First get the socket's status (protected)... */\n    SYS_ARCH_PROTECT(lev);\n    sock = tryget_socket(i);\n    if (sock != NULL) {\n      void* lastdata = sock->lastdata;\n      s16_t rcvevent = sock->rcvevent;\n      u16_t sendevent = sock->sendevent;\n      u16_t errevent = sock->errevent;\n      SYS_ARCH_UNPROTECT(lev);\n\n      /* ... then examine it: */\n      /* See if netconn of this socket is ready for read */\n      if (readset_in && FD_ISSET(i, readset_in) && ((lastdata != NULL) || (rcvevent > 0))) {\n        FD_SET(i, &lreadset);\n        LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_selscan: fd=%d ready for reading\\n\", i));\n        nready++;\n      }\n      /* See if netconn of this socket is ready for write */\n      if (writeset_in && FD_ISSET(i, writeset_in) && (sendevent != 0)) {\n        FD_SET(i, &lwriteset);\n        LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_selscan: fd=%d ready for writing\\n\", i));\n        nready++;\n      }\n      /* See if netconn of this socket had an error */\n      if (exceptset_in && FD_ISSET(i, exceptset_in) && (errevent != 0)) {\n        FD_SET(i, &lexceptset);\n        LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_selscan: fd=%d ready for exception\\n\", i));\n        nready++;\n      }\n    } else {\n      SYS_ARCH_UNPROTECT(lev);\n      /* continue on to next FD in list */\n    }\n  }\n  /* copy local sets to the ones provided as arguments */\n  *readset_out = lreadset;\n  *writeset_out = lwriteset;\n  *exceptset_out = lexceptset;\n\n  LWIP_ASSERT(\"nready >= 0\", nready >= 0);\n  return nready;\n}\n\nint\nlwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,\n            struct timeval *timeout)\n{\n  u32_t waitres = 0;\n  int nready;\n  fd_set lreadset, lwriteset, lexceptset;\n  u32_t msectimeout;\n  struct lwip_select_cb select_cb;\n  int i;\n  int maxfdp2;\n#if LWIP_NETCONN_SEM_PER_THREAD\n  int waited = 0;\n#endif\n  SYS_ARCH_DECL_PROTECT(lev);\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_select(%d, %p, %p, %p, tvsec=%\"S32_F\" tvusec=%\"S32_F\")\\n\",\n                  maxfdp1, (void *)readset, (void *) writeset, (void *) exceptset,\n                  timeout ? (s32_t)timeout->tv_sec : (s32_t)-1,\n                  timeout ? (s32_t)timeout->tv_usec : (s32_t)-1));\n\n  /* Go through each socket in each list to count number of sockets which\n     currently match */\n  nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);\n\n  /* If we don't have any current events, then suspend if we are supposed to */\n  if (!nready) {\n    if (timeout && timeout->tv_sec == 0 && timeout->tv_usec == 0) {\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_select: no timeout, returning 0\\n\"));\n      /* This is OK as the local fdsets are empty and nready is zero,\n         or we would have returned earlier. */\n      goto return_copy_fdsets;\n    }\n\n    /* None ready: add our semaphore to list:\n       We don't actually need any dynamic memory. Our entry on the\n       list is only valid while we are in this function, so it's ok\n       to use local variables. */\n\n    select_cb.next = NULL;\n    select_cb.prev = NULL;\n    select_cb.readset = readset;\n    select_cb.writeset = writeset;\n    select_cb.exceptset = exceptset;\n    select_cb.sem_signalled = 0;\n#if LWIP_NETCONN_SEM_PER_THREAD\n    select_cb.sem = LWIP_NETCONN_THREAD_SEM_GET();\n#else /* LWIP_NETCONN_SEM_PER_THREAD */\n    if (sys_sem_new(&select_cb.sem, 0) != ERR_OK) {\n      /* failed to create semaphore */\n      set_errno(ENOMEM);\n      return -1;\n    }\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n\n    /* Protect the select_cb_list */\n    SYS_ARCH_PROTECT(lev);\n\n    /* Put this select_cb on top of list */\n    select_cb.next = select_cb_list;\n    if (select_cb_list != NULL) {\n      select_cb_list->prev = &select_cb;\n    }\n    select_cb_list = &select_cb;\n    /* Increasing this counter tells event_callback that the list has changed. */\n    select_cb_ctr++;\n\n    /* Now we can safely unprotect */\n    SYS_ARCH_UNPROTECT(lev);\n\n    /* Increase select_waiting for each socket we are interested in */\n    maxfdp2 = maxfdp1;\n    for (i = LWIP_SOCKET_OFFSET; i < maxfdp1; i++) {\n      if ((readset && FD_ISSET(i, readset)) ||\n          (writeset && FD_ISSET(i, writeset)) ||\n          (exceptset && FD_ISSET(i, exceptset))) {\n        struct lwip_sock *sock;\n        SYS_ARCH_PROTECT(lev);\n        sock = tryget_socket(i);\n        if (sock != NULL) {\n          sock->select_waiting++;\n          LWIP_ASSERT(\"sock->select_waiting > 0\", sock->select_waiting > 0);\n        } else {\n          /* Not a valid socket */\n          nready = -1;\n          maxfdp2 = i;\n          SYS_ARCH_UNPROTECT(lev);\n          break;\n        }\n        SYS_ARCH_UNPROTECT(lev);\n      }\n    }\n\n    if (nready >= 0) {\n      /* Call lwip_selscan again: there could have been events between\n         the last scan (without us on the list) and putting us on the list! */\n      nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);\n      if (!nready) {\n        /* Still none ready, just wait to be woken */\n        if (timeout == 0) {\n          /* Wait forever */\n          msectimeout = 0;\n        } else {\n          msectimeout =  ((timeout->tv_sec * 1000) + ((timeout->tv_usec + 500)/1000));\n          if (msectimeout == 0) {\n            /* Wait 1ms at least (0 means wait forever) */\n            msectimeout = 1;\n          }\n        }\n\n        waitres = sys_arch_sem_wait(SELECT_SEM_PTR(select_cb.sem), msectimeout);\n#if LWIP_NETCONN_SEM_PER_THREAD\n        waited = 1;\n#endif\n      }\n    }\n\n    /* Decrease select_waiting for each socket we are interested in */\n    for (i = LWIP_SOCKET_OFFSET; i < maxfdp2; i++) {\n      if ((readset && FD_ISSET(i, readset)) ||\n          (writeset && FD_ISSET(i, writeset)) ||\n          (exceptset && FD_ISSET(i, exceptset))) {\n        struct lwip_sock *sock;\n        SYS_ARCH_PROTECT(lev);\n        sock = tryget_socket(i);\n        if (sock != NULL) {\n          /* for now, handle select_waiting==0... */\n          LWIP_ASSERT(\"sock->select_waiting > 0\", sock->select_waiting > 0);\n          if (sock->select_waiting > 0) {\n            sock->select_waiting--;\n          }\n        } else {\n          /* Not a valid socket */\n          nready = -1;\n        }\n        SYS_ARCH_UNPROTECT(lev);\n      }\n    }\n    /* Take us off the list */\n    SYS_ARCH_PROTECT(lev);\n    if (select_cb.next != NULL) {\n      select_cb.next->prev = select_cb.prev;\n    }\n    if (select_cb_list == &select_cb) {\n      LWIP_ASSERT(\"select_cb.prev == NULL\", select_cb.prev == NULL);\n      select_cb_list = select_cb.next;\n    } else {\n      LWIP_ASSERT(\"select_cb.prev != NULL\", select_cb.prev != NULL);\n      select_cb.prev->next = select_cb.next;\n    }\n    /* Increasing this counter tells event_callback that the list has changed. */\n    select_cb_ctr++;\n    SYS_ARCH_UNPROTECT(lev);\n\n#if LWIP_NETCONN_SEM_PER_THREAD\n    if (select_cb.sem_signalled && (!waited || (waitres == SYS_ARCH_TIMEOUT))) {\n      /* don't leave the thread-local semaphore signalled */\n      sys_arch_sem_wait(select_cb.sem, 1);\n    }\n#else /* LWIP_NETCONN_SEM_PER_THREAD */\n    sys_sem_free(&select_cb.sem);\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n\n    if (nready < 0) {\n      /* This happens when a socket got closed while waiting */\n      set_errno(EBADF);\n      return -1;\n    }\n\n    if (waitres == SYS_ARCH_TIMEOUT) {\n      /* Timeout */\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_select: timeout expired\\n\"));\n      /* This is OK as the local fdsets are empty and nready is zero,\n         or we would have returned earlier. */\n      goto return_copy_fdsets;\n    }\n\n    /* See what's set */\n    nready = lwip_selscan(maxfdp1, readset, writeset, exceptset, &lreadset, &lwriteset, &lexceptset);\n  }\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_select: nready=%d\\n\", nready));\nreturn_copy_fdsets:\n  set_errno(0);\n  if (readset) {\n    *readset = lreadset;\n  }\n  if (writeset) {\n    *writeset = lwriteset;\n  }\n  if (exceptset) {\n    *exceptset = lexceptset;\n  }\n  return nready;\n}\n\n/**\n * Callback registered in the netconn layer for each socket-netconn.\n * Processes recvevent (data available) and wakes up tasks waiting for select.\n */\nstatic void\nevent_callback(struct netconn *conn, enum netconn_evt evt, u16_t len)\n{\n  int s;\n  struct lwip_sock *sock;\n  struct lwip_select_cb *scb;\n  int last_select_cb_ctr;\n  SYS_ARCH_DECL_PROTECT(lev);\n\n  LWIP_UNUSED_ARG(len);\n\n  /* Get socket */\n  if (conn) {\n    s = conn->socket;\n    if (s < 0) {\n      /* Data comes in right away after an accept, even though\n       * the server task might not have created a new socket yet.\n       * Just count down (or up) if that's the case and we\n       * will use the data later. Note that only receive events\n       * can happen before the new socket is set up. */\n      SYS_ARCH_PROTECT(lev);\n      if (conn->socket < 0) {\n        if (evt == NETCONN_EVT_RCVPLUS) {\n          conn->socket--;\n        }\n        SYS_ARCH_UNPROTECT(lev);\n        return;\n      }\n      s = conn->socket;\n      SYS_ARCH_UNPROTECT(lev);\n    }\n\n    sock = get_socket(s);\n    if (!sock) {\n      return;\n    }\n  } else {\n    return;\n  }\n\n  SYS_ARCH_PROTECT(lev);\n  /* Set event as required */\n  switch (evt) {\n    case NETCONN_EVT_RCVPLUS:\n      sock->rcvevent++;\n      break;\n    case NETCONN_EVT_RCVMINUS:\n      sock->rcvevent--;\n      break;\n    case NETCONN_EVT_SENDPLUS:\n      sock->sendevent = 1;\n      break;\n    case NETCONN_EVT_SENDMINUS:\n      sock->sendevent = 0;\n      break;\n    case NETCONN_EVT_ERROR:\n      sock->errevent = 1;\n      break;\n    default:\n      LWIP_ASSERT(\"unknown event\", 0);\n      break;\n  }\n\n  if (sock->select_waiting == 0) {\n    /* noone is waiting for this socket, no need to check select_cb_list */\n    SYS_ARCH_UNPROTECT(lev);\n    return;\n  }\n\n  /* Now decide if anyone is waiting for this socket */\n  /* NOTE: This code goes through the select_cb_list list multiple times\n     ONLY IF a select was actually waiting. We go through the list the number\n     of waiting select calls + 1. This list is expected to be small. */\n\n  /* At this point, SYS_ARCH is still protected! */\nagain:\n  for (scb = select_cb_list; scb != NULL; scb = scb->next) {\n    /* remember the state of select_cb_list to detect changes */\n    last_select_cb_ctr = select_cb_ctr;\n    if (scb->sem_signalled == 0) {\n      /* semaphore not signalled yet */\n      int do_signal = 0;\n      /* Test this select call for our socket */\n      if (sock->rcvevent > 0) {\n        if (scb->readset && FD_ISSET(s, scb->readset)) {\n          do_signal = 1;\n        }\n      }\n      if (sock->sendevent != 0) {\n        if (!do_signal && scb->writeset && FD_ISSET(s, scb->writeset)) {\n          do_signal = 1;\n        }\n      }\n      if (sock->errevent != 0) {\n        if (!do_signal && scb->exceptset && FD_ISSET(s, scb->exceptset)) {\n          do_signal = 1;\n        }\n      }\n      if (do_signal) {\n        scb->sem_signalled = 1;\n        /* Don't call SYS_ARCH_UNPROTECT() before signaling the semaphore, as this might\n           lead to the select thread taking itself off the list, invalidating the semaphore. */\n        sys_sem_signal(SELECT_SEM_PTR(scb->sem));\n      }\n    }\n    /* unlock interrupts with each step */\n    SYS_ARCH_UNPROTECT(lev);\n    /* this makes sure interrupt protection time is short */\n    SYS_ARCH_PROTECT(lev);\n    if (last_select_cb_ctr != select_cb_ctr) {\n      /* someone has changed select_cb_list, restart at the beginning */\n      goto again;\n    }\n  }\n  SYS_ARCH_UNPROTECT(lev);\n}\n\n/**\n * Close one end of a full-duplex connection.\n */\nint\nlwip_shutdown(int s, int how)\n{\n  struct lwip_sock *sock;\n  err_t err;\n  u8_t shut_rx = 0, shut_tx = 0;\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_shutdown(%d, how=%d)\\n\", s, how));\n\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  if (sock->conn != NULL) {\n    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {\n      sock_set_errno(sock, EOPNOTSUPP);\n      return -1;\n    }\n  } else {\n    sock_set_errno(sock, ENOTCONN);\n    return -1;\n  }\n\n  if (how == SHUT_RD) {\n    shut_rx = 1;\n  } else if (how == SHUT_WR) {\n    shut_tx = 1;\n  } else if (how == SHUT_RDWR) {\n    shut_rx = 1;\n    shut_tx = 1;\n  } else {\n    sock_set_errno(sock, EINVAL);\n    return -1;\n  }\n  err = netconn_shutdown(sock->conn, shut_rx, shut_tx);\n\n  sock_set_errno(sock, err_to_errno(err));\n  return (err == ERR_OK ? 0 : -1);\n}\n\nstatic int\nlwip_getaddrname(int s, struct sockaddr *name, socklen_t *namelen, u8_t local)\n{\n  struct lwip_sock *sock;\n  union sockaddr_aligned saddr;\n  ip_addr_t naddr;\n  u16_t port;\n  err_t err;\n\n  sock = get_socket(s);\n  if (!sock) {\n    return -1;\n  }\n\n  /* get the IP address and port */\n  err = netconn_getaddr(sock->conn, &naddr, &port, local);\n  if (err != ERR_OK) {\n    sock_set_errno(sock, err_to_errno(err));\n    return -1;\n  }\n\n#if LWIP_IPV4 && LWIP_IPV6\n  /* Dual-stack: Map IPv4 addresses to IPv4 mapped IPv6 */\n  if (NETCONNTYPE_ISIPV6(netconn_type(sock->conn)) &&\n      IP_IS_V4_VAL(naddr)) {\n    ip4_2_ipv4_mapped_ipv6(ip_2_ip6(&naddr), ip_2_ip4(&naddr));\n    IP_SET_TYPE_VAL(naddr, IPADDR_TYPE_V6);\n  }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n  IPADDR_PORT_TO_SOCKADDR(&saddr, &naddr, port);\n\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getaddrname(%d, addr=\", s));\n  ip_addr_debug_print_val(SOCKETS_DEBUG, naddr);\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\" port=%\"U16_F\")\\n\", port));\n\n  if (*namelen > saddr.sa.sa_len) {\n    *namelen = saddr.sa.sa_len;\n  }\n  MEMCPY(name, &saddr, *namelen);\n\n  sock_set_errno(sock, 0);\n  return 0;\n}\n\nint\nlwip_getpeername(int s, struct sockaddr *name, socklen_t *namelen)\n{\n  return lwip_getaddrname(s, name, namelen, 0);\n}\n\nint\nlwip_getsockname(int s, struct sockaddr *name, socklen_t *namelen)\n{\n  return lwip_getaddrname(s, name, namelen, 1);\n}\n\nint\nlwip_getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen)\n{\n  u8_t err;\n  struct lwip_sock *sock = get_socket(s);\n#if !LWIP_TCPIP_CORE_LOCKING\n  LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(data);\n#endif /* !LWIP_TCPIP_CORE_LOCKING */\n\n  if (!sock) {\n    return -1;\n  }\n\n  if ((NULL == optval) || (NULL == optlen)) {\n    sock_set_errno(sock, EFAULT);\n    return -1;\n  }\n\n#if LWIP_TCPIP_CORE_LOCKING\n  /* core-locking can just call the -impl function */\n  LOCK_TCPIP_CORE();\n  err = lwip_getsockopt_impl(s, level, optname, optval, optlen);\n  UNLOCK_TCPIP_CORE();\n\n#else /* LWIP_TCPIP_CORE_LOCKING */\n\n#if LWIP_MPU_COMPATIBLE\n  /* MPU_COMPATIBLE copies the optval data, so check for max size here */\n  if (*optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) {\n    sock_set_errno(sock, ENOBUFS);\n    return -1;\n  }\n#endif /* LWIP_MPU_COMPATIBLE */\n\n  LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(data, sock);\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).s = s;\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).level = level;\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optname = optname;\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen = *optlen;\n#if !LWIP_MPU_COMPATIBLE\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval.p = optval;\n#endif /* !LWIP_MPU_COMPATIBLE */\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err = 0;\n#if LWIP_NETCONN_SEM_PER_THREAD\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = LWIP_NETCONN_THREAD_SEM_GET();\n#else\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = &sock->conn->op_completed;\n#endif\n  err = tcpip_callback(lwip_getsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(data));\n  if (err != ERR_OK) {\n    LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);\n    sock_set_errno(sock, err_to_errno(err));\n    return -1;\n  }\n  sys_arch_sem_wait((sys_sem_t*)(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem), 0);\n\n  /* write back optlen and optval */\n  *optlen = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen;\n#if LWIP_MPU_COMPATIBLE\n  MEMCPY(optval, LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval,\n    LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen);\n#endif /* LWIP_MPU_COMPATIBLE */\n\n  /* maybe lwip_getsockopt_internal has changed err */\n  err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err;\n  LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n\n  sock_set_errno(sock, err);\n  return err ? -1 : 0;\n}\n\n#if !LWIP_TCPIP_CORE_LOCKING\n/** lwip_getsockopt_callback: only used without CORE_LOCKING\n * to get into the tcpip_thread\n */\nstatic void\nlwip_getsockopt_callback(void *arg)\n{\n  struct lwip_setgetsockopt_data *data;\n  LWIP_ASSERT(\"arg != NULL\", arg != NULL);\n  data = (struct lwip_setgetsockopt_data*)arg;\n\n  data->err = lwip_getsockopt_impl(data->s, data->level, data->optname,\n#if LWIP_MPU_COMPATIBLE\n    data->optval,\n#else /* LWIP_MPU_COMPATIBLE */\n    data->optval.p,\n#endif /* LWIP_MPU_COMPATIBLE */\n    &data->optlen);\n\n  sys_sem_signal((sys_sem_t*)(data->completed_sem));\n}\n#endif  /* LWIP_TCPIP_CORE_LOCKING */\n\n/** lwip_getsockopt_impl: the actual implementation of getsockopt:\n * same argument as lwip_getsockopt, either called directly or through callback\n */\nstatic u8_t\nlwip_getsockopt_impl(int s, int level, int optname, void *optval, socklen_t *optlen)\n{\n  u8_t err = 0;\n  struct lwip_sock *sock = tryget_socket(s);\n  if (!sock) {\n    return EBADF;\n  }\n\n  switch (level) {\n\n/* Level: SOL_SOCKET */\n  case SOL_SOCKET:\n    switch (optname) {\n\n#if LWIP_TCP\n    case SO_ACCEPTCONN:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);\n      if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_TCP) {\n        return ENOPROTOOPT;\n      }\n      if ((sock->conn->pcb.tcp != NULL) && (sock->conn->pcb.tcp->state == LISTEN)) {\n        *(int*)optval = 1;\n      } else {\n        *(int*)optval = 0;\n      }\n      break;\n#endif /* LWIP_TCP */\n\n    /* The option flags */\n    case SO_BROADCAST:\n    case SO_KEEPALIVE:\n#if SO_REUSE\n    case SO_REUSEADDR:\n#endif /* SO_REUSE */\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);\n      *(int*)optval = ip_get_option(sock->conn->pcb.ip, optname);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, SOL_SOCKET, optname=0x%x, ..) = %s\\n\",\n                                  s, optname, (*(int*)optval?\"on\":\"off\")));\n      break;\n\n    case SO_TYPE:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);\n      switch (NETCONNTYPE_GROUP(netconn_type(sock->conn))) {\n      case NETCONN_RAW:\n        *(int*)optval = SOCK_RAW;\n        break;\n      case NETCONN_TCP:\n        *(int*)optval = SOCK_STREAM;\n        break;\n      case NETCONN_UDP:\n        *(int*)optval = SOCK_DGRAM;\n        break;\n      default: /* unrecognized socket type */\n        *(int*)optval = netconn_type(sock->conn);\n        LWIP_DEBUGF(SOCKETS_DEBUG,\n                    (\"lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE): unrecognized socket type %d\\n\",\n                    s, *(int *)optval));\n      }  /* switch (netconn_type(sock->conn)) */\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, SOL_SOCKET, SO_TYPE) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n\n    case SO_ERROR:\n      LWIP_SOCKOPT_CHECK_OPTLEN(*optlen, int);\n      /* only overwrite ERR_OK or temporary errors */\n      if (((sock->err == 0) || (sock->err == EINPROGRESS)) && (sock->conn != NULL)) {\n        sock_set_errno(sock, err_to_errno(sock->conn->last_err));\n      }\n      *(int *)optval = (sock->err == 0xFF ? (int)-1 : (int)sock->err);\n      sock->err = 0;\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, SOL_SOCKET, SO_ERROR) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n\n#if LWIP_SO_SNDTIMEO\n    case SO_SNDTIMEO:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);\n      LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_sendtimeout(sock->conn));\n      break;\n#endif /* LWIP_SO_SNDTIMEO */\n#if LWIP_SO_RCVTIMEO\n    case SO_RCVTIMEO:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);\n      LWIP_SO_SNDRCVTIMEO_SET(optval, netconn_get_recvtimeout(sock->conn));\n      break;\n#endif /* LWIP_SO_RCVTIMEO */\n#if LWIP_SO_RCVBUF\n    case SO_RCVBUF:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);\n      *(int *)optval = netconn_get_recvbufsize(sock->conn);\n      break;\n#endif /* LWIP_SO_RCVBUF */\n#if LWIP_SO_LINGER\n    case SO_LINGER:\n      {\n        s16_t conn_linger;\n        struct linger* linger = (struct linger*)optval;\n        LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, struct linger);\n        conn_linger = sock->conn->linger;\n        if (conn_linger >= 0) {\n          linger->l_onoff = 1;\n          linger->l_linger = (int)conn_linger;\n        } else {\n          linger->l_onoff = 0;\n          linger->l_linger = 0;\n        }\n      }\n      break;\n#endif /* LWIP_SO_LINGER */\n#if LWIP_UDP\n    case SO_NO_CHECK:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_UDP);\n#if LWIP_UDPLITE\n      if ((udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_UDPLITE) != 0) {\n        /* this flag is only available for UDP, not for UDP lite */\n        return EAFNOSUPPORT;\n      }\n#endif /* LWIP_UDPLITE */\n      *(int*)optval = (udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_NOCHKSUM) ? 1 : 0;\n      break;\n#endif /* LWIP_UDP*/\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n\n/* Level: IPPROTO_IP */\n  case IPPROTO_IP:\n    switch (optname) {\n    case IP_TTL:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);\n      *(int*)optval = sock->conn->pcb.ip->ttl;\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_IP, IP_TTL) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n    case IP_TOS:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);\n      *(int*)optval = sock->conn->pcb.ip->tos;\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_IP, IP_TOS) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n#if LWIP_MULTICAST_TX_OPTIONS\n    case IP_MULTICAST_TTL:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t);\n      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) {\n        return ENOPROTOOPT;\n      }\n      *(u8_t*)optval = udp_get_multicast_ttl(sock->conn->pcb.udp);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_TTL) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n    case IP_MULTICAST_IF:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, struct in_addr);\n      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_UDP) {\n        return ENOPROTOOPT;\n      }\n      inet_addr_from_ip4addr((struct in_addr*)optval, udp_get_multicast_netif_addr(sock->conn->pcb.udp));\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_IF) = 0x%\"X32_F\"\\n\",\n                  s, *(u32_t *)optval));\n      break;\n    case IP_MULTICAST_LOOP:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, u8_t);\n      if ((sock->conn->pcb.udp->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) {\n        *(u8_t*)optval = 1;\n      } else {\n        *(u8_t*)optval = 0;\n      }\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_IP, IP_MULTICAST_LOOP) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n\n#if LWIP_TCP\n/* Level: IPPROTO_TCP */\n  case IPPROTO_TCP:\n    /* Special case: all IPPROTO_TCP option take an int */\n    LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_TCP);\n    if (sock->conn->pcb.tcp->state == LISTEN) {\n      return EINVAL;\n    }\n    switch (optname) {\n    case TCP_NODELAY:\n      *(int*)optval = tcp_nagle_disabled(sock->conn->pcb.tcp);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_TCP, TCP_NODELAY) = %s\\n\",\n                  s, (*(int*)optval)?\"on\":\"off\") );\n      break;\n    case TCP_KEEPALIVE:\n      *(int*)optval = (int)sock->conn->pcb.tcp->keep_idle;\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n\n#if LWIP_TCP_KEEPALIVE\n    case TCP_KEEPIDLE:\n      *(int*)optval = (int)(sock->conn->pcb.tcp->keep_idle/1000);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n    case TCP_KEEPINTVL:\n      *(int*)optval = (int)(sock->conn->pcb.tcp->keep_intvl/1000);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n    case TCP_KEEPCNT:\n      *(int*)optval = (int)sock->conn->pcb.tcp->keep_cnt;\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n#endif /* LWIP_TCP_KEEPALIVE */\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n#endif /* LWIP_TCP */\n\n#if LWIP_IPV6\n/* Level: IPPROTO_IPV6 */\n  case IPPROTO_IPV6:\n    switch (optname) {\n    case IPV6_V6ONLY:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, *optlen, int);\n      *(int*)optval = (netconn_get_ipv6only(sock->conn) ? 1 : 0);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY) = %d\\n\",\n                  s, *(int *)optval));\n      break;\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n#endif /* LWIP_IPV6 */\n\n#if LWIP_UDP && LWIP_UDPLITE\n  /* Level: IPPROTO_UDPLITE */\n  case IPPROTO_UDPLITE:\n    /* Special case: all IPPROTO_UDPLITE option take an int */\n    LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, *optlen, int);\n    /* If this is no UDP lite socket, ignore any options. */\n    if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) {\n      return ENOPROTOOPT;\n    }\n    switch (optname) {\n    case UDPLITE_SEND_CSCOV:\n      *(int*)optval = sock->conn->pcb.udp->chksum_len_tx;\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) = %d\\n\",\n                  s, (*(int*)optval)) );\n      break;\n    case UDPLITE_RECV_CSCOV:\n      *(int*)optval = sock->conn->pcb.udp->chksum_len_rx;\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) = %d\\n\",\n                  s, (*(int*)optval)) );\n      break;\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n#endif /* LWIP_UDP */\n  /* Level: IPPROTO_RAW */\n  case IPPROTO_RAW:\n    switch (optname) {\n#if LWIP_IPV6 && LWIP_RAW\n    case IPV6_CHECKSUM:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, *optlen, int, NETCONN_RAW);\n      if (sock->conn->pcb.raw->chksum_reqd == 0) {\n        *(int *)optval = -1;\n      } else {\n        *(int *)optval = sock->conn->pcb.raw->chksum_offset;\n      }\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM) = %d\\n\",\n                  s, (*(int*)optval)) );\n      break;\n#endif /* LWIP_IPV6 && LWIP_RAW */\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, IPPROTO_RAW, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n  default:\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_getsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\\n\",\n                                s, level, optname));\n    err = ENOPROTOOPT;\n    break;\n  } /* switch (level) */\n\n  return err;\n}\n\nint\nlwip_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen)\n{\n  u8_t err = 0;\n  struct lwip_sock *sock = get_socket(s);\n#if !LWIP_TCPIP_CORE_LOCKING\n  LWIP_SETGETSOCKOPT_DATA_VAR_DECLARE(data);\n#endif /* !LWIP_TCPIP_CORE_LOCKING */\n\n  if (!sock) {\n    return -1;\n  }\n\n  if (NULL == optval) {\n    sock_set_errno(sock, EFAULT);\n    return -1;\n  }\n\n#if LWIP_TCPIP_CORE_LOCKING\n  /* core-locking can just call the -impl function */\n  LOCK_TCPIP_CORE();\n  err = lwip_setsockopt_impl(s, level, optname, optval, optlen);\n  UNLOCK_TCPIP_CORE();\n\n#else /* LWIP_TCPIP_CORE_LOCKING */\n\n#if LWIP_MPU_COMPATIBLE\n  /* MPU_COMPATIBLE copies the optval data, so check for max size here */\n  if (optlen > LWIP_SETGETSOCKOPT_MAXOPTLEN) {\n    sock_set_errno(sock, ENOBUFS);\n    return -1;\n  }\n#endif /* LWIP_MPU_COMPATIBLE */\n\n  LWIP_SETGETSOCKOPT_DATA_VAR_ALLOC(data, sock);\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).s = s;\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).level = level;\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optname = optname;\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optlen = optlen;\n#if LWIP_MPU_COMPATIBLE\n  MEMCPY(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval, optval, optlen);\n#else /* LWIP_MPU_COMPATIBLE */\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).optval.pc = (const void*)optval;\n#endif /* LWIP_MPU_COMPATIBLE */\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err = 0;\n#if LWIP_NETCONN_SEM_PER_THREAD\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = LWIP_NETCONN_THREAD_SEM_GET();\n#else\n  LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem = &sock->conn->op_completed;\n#endif\n  err = tcpip_callback(lwip_setsockopt_callback, &LWIP_SETGETSOCKOPT_DATA_VAR_REF(data));\n  if (err != ERR_OK) {\n    LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);\n    sock_set_errno(sock, err_to_errno(err));\n    return -1;\n  }\n  sys_arch_sem_wait((sys_sem_t*)(LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).completed_sem), 0);\n\n  /* maybe lwip_getsockopt_internal has changed err */\n  err = LWIP_SETGETSOCKOPT_DATA_VAR_REF(data).err;\n  LWIP_SETGETSOCKOPT_DATA_VAR_FREE(data);\n#endif  /* LWIP_TCPIP_CORE_LOCKING */\n\n  sock_set_errno(sock, err);\n  return err ? -1 : 0;\n}\n\n#if !LWIP_TCPIP_CORE_LOCKING\n/** lwip_setsockopt_callback: only used without CORE_LOCKING\n * to get into the tcpip_thread\n */\nstatic void\nlwip_setsockopt_callback(void *arg)\n{\n  struct lwip_setgetsockopt_data *data;\n  LWIP_ASSERT(\"arg != NULL\", arg != NULL);\n  data = (struct lwip_setgetsockopt_data*)arg;\n\n  data->err = lwip_setsockopt_impl(data->s, data->level, data->optname,\n#if LWIP_MPU_COMPATIBLE\n    data->optval,\n#else /* LWIP_MPU_COMPATIBLE */\n    data->optval.pc,\n#endif /* LWIP_MPU_COMPATIBLE */\n    data->optlen);\n\n  sys_sem_signal((sys_sem_t*)(data->completed_sem));\n}\n#endif  /* LWIP_TCPIP_CORE_LOCKING */\n\n/** lwip_setsockopt_impl: the actual implementation of setsockopt:\n * same argument as lwip_setsockopt, either called directly or through callback\n */\nstatic u8_t\nlwip_setsockopt_impl(int s, int level, int optname, const void *optval, socklen_t optlen)\n{\n  u8_t err = 0;\n  struct lwip_sock *sock = tryget_socket(s);\n  if (!sock) {\n    return EBADF;\n  }\n\n  switch (level) {\n\n/* Level: SOL_SOCKET */\n  case SOL_SOCKET:\n    switch (optname) {\n\n    /* SO_ACCEPTCONN is get-only */\n\n    /* The option flags */\n    case SO_BROADCAST:\n    case SO_KEEPALIVE:\n#if SO_REUSE\n    case SO_REUSEADDR:\n#endif /* SO_REUSE */\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);\n      if (*(const int*)optval) {\n        ip_set_option(sock->conn->pcb.ip, optname);\n      } else {\n        ip_reset_option(sock->conn->pcb.ip, optname);\n      }\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, SOL_SOCKET, optname=0x%x, ..) -> %s\\n\",\n                  s, optname, (*(const int*)optval?\"on\":\"off\")));\n      break;\n\n    /* SO_TYPE is get-only */\n    /* SO_ERROR is get-only */\n\n#if LWIP_SO_SNDTIMEO\n    case SO_SNDTIMEO:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);\n      netconn_set_sendtimeout(sock->conn, LWIP_SO_SNDRCVTIMEO_GET_MS(optval));\n      break;\n#endif /* LWIP_SO_SNDTIMEO */\n#if LWIP_SO_RCVTIMEO\n    case SO_RCVTIMEO:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, LWIP_SO_SNDRCVTIMEO_OPTTYPE);\n      netconn_set_recvtimeout(sock->conn, (int)LWIP_SO_SNDRCVTIMEO_GET_MS(optval));\n      break;\n#endif /* LWIP_SO_RCVTIMEO */\n#if LWIP_SO_RCVBUF\n    case SO_RCVBUF:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, int);\n      netconn_set_recvbufsize(sock->conn, *(const int*)optval);\n      break;\n#endif /* LWIP_SO_RCVBUF */\n#if LWIP_SO_LINGER\n    case SO_LINGER:\n      {\n        const struct linger* linger = (const struct linger*)optval;\n        LWIP_SOCKOPT_CHECK_OPTLEN_CONN(sock, optlen, struct linger);\n        if (linger->l_onoff) {\n          int lingersec = linger->l_linger;\n          if (lingersec < 0) {\n            return EINVAL;\n          }\n          if (lingersec > 0xFFFF) {\n            lingersec = 0xFFFF;\n          }\n          sock->conn->linger = (s16_t)lingersec;\n        } else {\n          sock->conn->linger = -1;\n        }\n      }\n      break;\n#endif /* LWIP_SO_LINGER */\n#if LWIP_UDP\n    case SO_NO_CHECK:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_UDP);\n#if LWIP_UDPLITE\n      if ((udp_flags(sock->conn->pcb.udp) & UDP_FLAGS_UDPLITE) != 0) {\n        /* this flag is only available for UDP, not for UDP lite */\n        return EAFNOSUPPORT;\n      }\n#endif /* LWIP_UDPLITE */\n      if (*(const int*)optval) {\n        udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) | UDP_FLAGS_NOCHKSUM);\n      } else {\n        udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) & ~UDP_FLAGS_NOCHKSUM);\n      }\n      break;\n#endif /* LWIP_UDP */\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, SOL_SOCKET, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n\n/* Level: IPPROTO_IP */\n  case IPPROTO_IP:\n    switch (optname) {\n    case IP_TTL:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);\n      sock->conn->pcb.ip->ttl = (u8_t)(*(const int*)optval);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_IP, IP_TTL, ..) -> %d\\n\",\n                  s, sock->conn->pcb.ip->ttl));\n      break;\n    case IP_TOS:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);\n      sock->conn->pcb.ip->tos = (u8_t)(*(const int*)optval);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_IP, IP_TOS, ..)-> %d\\n\",\n                  s, sock->conn->pcb.ip->tos));\n      break;\n#if LWIP_MULTICAST_TX_OPTIONS\n    case IP_MULTICAST_TTL:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP);\n      udp_set_multicast_ttl(sock->conn->pcb.udp, (u8_t)(*(const u8_t*)optval));\n      break;\n    case IP_MULTICAST_IF:\n      {\n        ip4_addr_t if_addr;\n        LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct in_addr, NETCONN_UDP);\n        inet_addr_to_ip4addr(&if_addr, (const struct in_addr*)optval);\n        udp_set_multicast_netif_addr(sock->conn->pcb.udp, &if_addr);\n      }\n      break;\n    case IP_MULTICAST_LOOP:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, u8_t, NETCONN_UDP);\n      if (*(const u8_t*)optval) {\n        udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) | UDP_FLAGS_MULTICAST_LOOP);\n      } else {\n        udp_setflags(sock->conn->pcb.udp, udp_flags(sock->conn->pcb.udp) & ~UDP_FLAGS_MULTICAST_LOOP);\n      }\n      break;\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n#if LWIP_IGMP\n    case IP_ADD_MEMBERSHIP:\n    case IP_DROP_MEMBERSHIP:\n      {\n        /* If this is a TCP or a RAW socket, ignore these options. */\n        /* @todo: assign membership to this socket so that it is dropped when closing the socket */\n        err_t igmp_err;\n        const struct ip_mreq *imr = (const struct ip_mreq *)optval;\n        ip4_addr_t if_addr;\n        ip4_addr_t multi_addr;\n        LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, struct ip_mreq, NETCONN_UDP);\n        inet_addr_to_ip4addr(&if_addr, &imr->imr_interface);\n        inet_addr_to_ip4addr(&multi_addr, &imr->imr_multiaddr);\n        if (optname == IP_ADD_MEMBERSHIP) {\n          if (!lwip_socket_register_membership(s, &if_addr, &multi_addr)) {\n            /* cannot track membership (out of memory) */\n            err = ENOMEM;\n            igmp_err = ERR_OK;\n          } else {\n            igmp_err = igmp_joingroup(&if_addr, &multi_addr);\n          }\n        } else {\n          igmp_err = igmp_leavegroup(&if_addr, &multi_addr);\n          lwip_socket_unregister_membership(s, &if_addr, &multi_addr);\n        }\n        if (igmp_err != ERR_OK) {\n          err = EADDRNOTAVAIL;\n        }\n      }\n      break;\n#endif /* LWIP_IGMP */\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_IP, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n\n#if LWIP_TCP\n/* Level: IPPROTO_TCP */\n  case IPPROTO_TCP:\n    /* Special case: all IPPROTO_TCP option take an int */\n    LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP);\n    if (sock->conn->pcb.tcp->state == LISTEN) {\n      return EINVAL;\n    }\n    switch (optname) {\n    case TCP_NODELAY:\n      if (*(const int*)optval) {\n        tcp_nagle_disable(sock->conn->pcb.tcp);\n      } else {\n        tcp_nagle_enable(sock->conn->pcb.tcp);\n      }\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_TCP, TCP_NODELAY) -> %s\\n\",\n                  s, (*(const int *)optval)?\"on\":\"off\") );\n      break;\n    case TCP_KEEPALIVE:\n      sock->conn->pcb.tcp->keep_idle = (u32_t)(*(const int*)optval);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPALIVE) -> %\"U32_F\"\\n\",\n                  s, sock->conn->pcb.tcp->keep_idle));\n      break;\n\n#if LWIP_TCP_KEEPALIVE\n    case TCP_KEEPIDLE:\n      sock->conn->pcb.tcp->keep_idle = 1000*(u32_t)(*(const int*)optval);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPIDLE) -> %\"U32_F\"\\n\",\n                  s, sock->conn->pcb.tcp->keep_idle));\n      break;\n    case TCP_KEEPINTVL:\n      sock->conn->pcb.tcp->keep_intvl = 1000*(u32_t)(*(const int*)optval);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPINTVL) -> %\"U32_F\"\\n\",\n                  s, sock->conn->pcb.tcp->keep_intvl));\n      break;\n    case TCP_KEEPCNT:\n      sock->conn->pcb.tcp->keep_cnt = (u32_t)(*(const int*)optval);\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_TCP, TCP_KEEPCNT) -> %\"U32_F\"\\n\",\n                  s, sock->conn->pcb.tcp->keep_cnt));\n      break;\n#endif /* LWIP_TCP_KEEPALIVE */\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_TCP, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n#endif /* LWIP_TCP*/\n\n#if LWIP_IPV6\n/* Level: IPPROTO_IPV6 */\n  case IPPROTO_IPV6:\n    switch (optname) {\n    case IPV6_V6ONLY:\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_TCP);\n      if (*(const int*)optval) {\n        netconn_set_ipv6only(sock->conn, 1);\n      } else {\n        netconn_set_ipv6only(sock->conn, 0);\n      }\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_IPV6, IPV6_V6ONLY, ..) -> %d\\n\",\n                  s, (netconn_get_ipv6only(sock->conn) ? 1 : 0)));\n      break;\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_IPV6, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n#endif /* LWIP_IPV6 */\n\n#if LWIP_UDP && LWIP_UDPLITE\n  /* Level: IPPROTO_UDPLITE */\n  case IPPROTO_UDPLITE:\n    /* Special case: all IPPROTO_UDPLITE option take an int */\n    LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB(sock, optlen, int);\n    /* If this is no UDP lite socket, ignore any options. */\n    if (!NETCONNTYPE_ISUDPLITE(netconn_type(sock->conn))) {\n      return ENOPROTOOPT;\n    }\n    switch (optname) {\n    case UDPLITE_SEND_CSCOV:\n      if ((*(const int*)optval != 0) && ((*(const int*)optval < 8) || (*(const int*)optval > 0xffff))) {\n        /* don't allow illegal values! */\n        sock->conn->pcb.udp->chksum_len_tx = 8;\n      } else {\n        sock->conn->pcb.udp->chksum_len_tx = (u16_t)*(const int*)optval;\n      }\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV) -> %d\\n\",\n                  s, (*(const int*)optval)) );\n      break;\n    case UDPLITE_RECV_CSCOV:\n      if ((*(const int*)optval != 0) && ((*(const int*)optval < 8) || (*(const int*)optval > 0xffff))) {\n        /* don't allow illegal values! */\n        sock->conn->pcb.udp->chksum_len_rx = 8;\n      } else {\n        sock->conn->pcb.udp->chksum_len_rx = (u16_t)*(const int*)optval;\n      }\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV) -> %d\\n\",\n                  s, (*(const int*)optval)) );\n      break;\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_UDPLITE, UNIMPL: optname=0x%x, ..)\\n\",\n                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n#endif /* LWIP_UDP */\n  /* Level: IPPROTO_RAW */\n  case IPPROTO_RAW:\n    switch (optname) {\n#if LWIP_IPV6 && LWIP_RAW\n    case IPV6_CHECKSUM:\n      /* It should not be possible to disable the checksum generation with ICMPv6\n       * as per RFC 3542 chapter 3.1 */\n      if(sock->conn->pcb.raw->protocol == IPPROTO_ICMPV6) {\n        return EINVAL;\n      }\n\n      LWIP_SOCKOPT_CHECK_OPTLEN_CONN_PCB_TYPE(sock, optlen, int, NETCONN_RAW);\n      if (*(const int *)optval < 0) {\n        sock->conn->pcb.raw->chksum_reqd = 0;\n      } else if (*(const int *)optval & 1) {\n        /* Per RFC3542, odd offsets are not allowed */\n        return EINVAL;\n      } else {\n        sock->conn->pcb.raw->chksum_reqd = 1;\n        sock->conn->pcb.raw->chksum_offset = (u16_t)*(const int *)optval;\n      }\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_RAW, IPV6_CHECKSUM, ..) -> %d\\n\",\n                  s, sock->conn->pcb.raw->chksum_reqd));\n      break;\n#endif /* LWIP_IPV6 && LWIP_RAW */\n    default:\n      LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, IPPROTO_RAW, UNIMPL: optname=0x%x, ..)\\n\",\n                                  s, optname));\n      err = ENOPROTOOPT;\n      break;\n    }  /* switch (optname) */\n    break;\n  default:\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_setsockopt(%d, level=0x%x, UNIMPL: optname=0x%x, ..)\\n\",\n                s, level, optname));\n    err = ENOPROTOOPT;\n    break;\n  }  /* switch (level) */\n\n  return err;\n}\n\nint\nlwip_ioctl(int s, long cmd, void *argp)\n{\n  struct lwip_sock *sock = get_socket(s);\n  u8_t val;\n#if LWIP_SO_RCVBUF\n  u16_t buflen = 0;\n  int recv_avail;\n#endif /* LWIP_SO_RCVBUF */\n\n  if (!sock) {\n    return -1;\n  }\n\n  switch (cmd) {\n#if LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE\n  case FIONREAD:\n    if (!argp) {\n      sock_set_errno(sock, EINVAL);\n      return -1;\n    }\n#if LWIP_FIONREAD_LINUXMODE\n    if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {\n      struct pbuf *p;\n      if (sock->lastdata) {\n        p = ((struct netbuf *)sock->lastdata)->p;\n        *((int*)argp) = p->tot_len - sock->lastoffset;\n      } else {\n        struct netbuf *rxbuf;\n        err_t err;\n        if (sock->rcvevent <= 0) {\n          *((int*)argp) = 0;\n        } else {\n          err = netconn_recv(sock->conn, &rxbuf);\n          if (err != ERR_OK) {\n            *((int*)argp) = 0;\n          } else {\n            sock->lastdata = rxbuf;\n            sock->lastoffset = 0;\n            *((int*)argp) = rxbuf->p->tot_len;\n          }\n        }\n      }\n      return 0;\n    }\n#endif /* LWIP_FIONREAD_LINUXMODE */\n\n#if LWIP_SO_RCVBUF\n    /* we come here if either LWIP_FIONREAD_LINUXMODE==0 or this is a TCP socket */\n    SYS_ARCH_GET(sock->conn->recv_avail, recv_avail);\n    if (recv_avail < 0) {\n      recv_avail = 0;\n    }\n    *((int*)argp) = recv_avail;\n\n    /* Check if there is data left from the last recv operation. /maq 041215 */\n    if (sock->lastdata) {\n      struct pbuf *p = (struct pbuf *)sock->lastdata;\n      if (NETCONNTYPE_GROUP(netconn_type(sock->conn)) != NETCONN_TCP) {\n        p = ((struct netbuf *)p)->p;\n      }\n      buflen = p->tot_len;\n      buflen -= sock->lastoffset;\n\n      *((int*)argp) += buflen;\n    }\n\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_ioctl(%d, FIONREAD, %p) = %\"U16_F\"\\n\", s, argp, *((u16_t*)argp)));\n    sock_set_errno(sock, 0);\n    return 0;\n#else /* LWIP_SO_RCVBUF */\n    break;\n#endif /* LWIP_SO_RCVBUF */\n#endif /* LWIP_SO_RCVBUF || LWIP_FIONREAD_LINUXMODE */\n\n  case (long)FIONBIO:\n    val = 0;\n    if (argp && *(u32_t*)argp) {\n      val = 1;\n    }\n    netconn_set_nonblocking(sock->conn, val);\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_ioctl(%d, FIONBIO, %d)\\n\", s, val));\n    sock_set_errno(sock, 0);\n    return 0;\n\n  default:\n    break;\n  } /* switch (cmd) */\n  LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_ioctl(%d, UNIMPL: 0x%lx, %p)\\n\", s, cmd, argp));\n  sock_set_errno(sock, ENOSYS); /* not yet implemented */\n  return -1;\n}\n\n/** A minimal implementation of fcntl.\n * Currently only the commands F_GETFL and F_SETFL are implemented.\n * Only the flag O_NONBLOCK is implemented.\n */\nint\nlwip_fcntl(int s, int cmd, int val)\n{\n  struct lwip_sock *sock = get_socket(s);\n  int ret = -1;\n\n  if (!sock) {\n    return -1;\n  }\n\n  switch (cmd) {\n  case F_GETFL:\n    ret = netconn_is_nonblocking(sock->conn) ? O_NONBLOCK : 0;\n    sock_set_errno(sock, 0);\n    break;\n  case F_SETFL:\n    if ((val & ~O_NONBLOCK) == 0) {\n      /* only O_NONBLOCK, all other bits are zero */\n      netconn_set_nonblocking(sock->conn, val & O_NONBLOCK);\n      ret = 0;\n      sock_set_errno(sock, 0);\n    } else {\n      sock_set_errno(sock, ENOSYS); /* not yet implemented */\n    }\n    break;\n  default:\n    LWIP_DEBUGF(SOCKETS_DEBUG, (\"lwip_fcntl(%d, UNIMPL: %d, %d)\\n\", s, cmd, val));\n    sock_set_errno(sock, ENOSYS); /* not yet implemented */\n    break;\n  }\n  return ret;\n}\n\n#if LWIP_IGMP\n/** Register a new IGMP membership. On socket close, the membership is dropped automatically.\n *\n * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK).\n *\n * @return 1 on success, 0 on failure\n */\nstatic int\nlwip_socket_register_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr)\n{\n  struct lwip_sock *sock = get_socket(s);\n  int i;\n\n  if (!sock) {\n    return 0;\n  }\n\n  for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {\n    if (socket_ipv4_multicast_memberships[i].sock == NULL) {\n      socket_ipv4_multicast_memberships[i].sock = sock;\n      ip4_addr_copy(socket_ipv4_multicast_memberships[i].if_addr, *if_addr);\n      ip4_addr_copy(socket_ipv4_multicast_memberships[i].multi_addr, *multi_addr);\n      return 1;\n    }\n  }\n  return 0;\n}\n\n/** Unregister a previously registered membership. This prevents dropping the membership\n * on socket close.\n *\n * ATTENTION: this function is called from tcpip_thread (or under CORE_LOCK).\n */\nstatic void\nlwip_socket_unregister_membership(int s, const ip4_addr_t *if_addr, const ip4_addr_t *multi_addr)\n{\n  struct lwip_sock *sock = get_socket(s);\n  int i;\n\n  if (!sock) {\n    return;\n  }\n\n  for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {\n    if ((socket_ipv4_multicast_memberships[i].sock == sock) &&\n        ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].if_addr, if_addr) &&\n        ip4_addr_cmp(&socket_ipv4_multicast_memberships[i].multi_addr, multi_addr)) {\n      socket_ipv4_multicast_memberships[i].sock = NULL;\n      ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr);\n      ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr);\n      return;\n    }\n  }\n}\n\n/** Drop all memberships of a socket that were not dropped explicitly via setsockopt.\n *\n * ATTENTION: this function is NOT called from tcpip_thread (or under CORE_LOCK).\n */\nstatic void\nlwip_socket_drop_registered_memberships(int s)\n{\n  struct lwip_sock *sock = get_socket(s);\n  int i;\n\n  if (!sock) {\n    return;\n  }\n\n  for (i = 0; i < LWIP_SOCKET_MAX_MEMBERSHIPS; i++) {\n    if (socket_ipv4_multicast_memberships[i].sock == sock) {\n      ip_addr_t multi_addr, if_addr;\n      ip_addr_copy_from_ip4(multi_addr, socket_ipv4_multicast_memberships[i].multi_addr);\n      ip_addr_copy_from_ip4(if_addr, socket_ipv4_multicast_memberships[i].if_addr);\n      socket_ipv4_multicast_memberships[i].sock = NULL;\n      ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].if_addr);\n      ip4_addr_set_zero(&socket_ipv4_multicast_memberships[i].multi_addr);\n\n      netconn_join_leave_group(sock->conn, &multi_addr, &if_addr, NETCONN_LEAVE);\n    }\n  }\n}\n#endif /* LWIP_IGMP */\n#endif /* LWIP_SOCKET */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/api/tcpip.c",
    "content": "/**\n * @file\n * Sequential API Main thread module\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if !NO_SYS /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/priv/tcpip_priv.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/init.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/etharp.h\"\n#include \"netif/ethernet.h\"\n\n#define TCPIP_MSG_VAR_REF(name)     API_VAR_REF(name)\n#define TCPIP_MSG_VAR_DECLARE(name) API_VAR_DECLARE(struct tcpip_msg, name)\n#define TCPIP_MSG_VAR_ALLOC(name)   API_VAR_ALLOC(struct tcpip_msg, MEMP_TCPIP_MSG_API, name, ERR_MEM)\n#define TCPIP_MSG_VAR_FREE(name)    API_VAR_FREE(MEMP_TCPIP_MSG_API, name)\n\n/* global variables */\nstatic tcpip_init_done_fn tcpip_init_done;\nstatic void *tcpip_init_done_arg;\nstatic sys_mbox_t mbox;\n\n#if LWIP_TCPIP_CORE_LOCKING\n/** The global semaphore to lock the stack. */\nsys_mutex_t lock_tcpip_core;\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n\n#if LWIP_TIMERS\n/* wait for a message, timeouts are processed while waiting */\n#define TCPIP_MBOX_FETCH(mbox, msg) sys_timeouts_mbox_fetch(mbox, msg)\n#else /* LWIP_TIMERS */\n/* wait for a message with timers disabled (e.g. pass a timer-check trigger into tcpip_thread) */\n#define TCPIP_MBOX_FETCH(mbox, msg) sys_mbox_fetch(mbox, msg)\n#endif /* LWIP_TIMERS */\n\n/**\n * The main lwIP thread. This thread has exclusive access to lwIP core functions\n * (unless access to them is not locked). Other threads communicate with this\n * thread using message boxes.\n *\n * It also starts all the timers to make sure they are running in the right\n * thread context.\n *\n * @param arg unused argument\n */\nstatic void\ntcpip_thread(void *arg)\n{\n  struct tcpip_msg *msg;\n  LWIP_UNUSED_ARG(arg);\n\n  if (tcpip_init_done != NULL) {\n    tcpip_init_done(tcpip_init_done_arg);\n  }\n\n  LOCK_TCPIP_CORE();\n  while (1) {                          /* MAIN Loop */\n    UNLOCK_TCPIP_CORE();\n    LWIP_TCPIP_THREAD_ALIVE();\n    /* wait for a message, timeouts are processed while waiting */\n    TCPIP_MBOX_FETCH(&mbox, (void **)&msg);\n    LOCK_TCPIP_CORE();\n    if (msg == NULL) {\n      LWIP_DEBUGF(TCPIP_DEBUG, (\"tcpip_thread: invalid message: NULL\\n\"));\n      LWIP_ASSERT(\"tcpip_thread: invalid message\", 0);\n      continue;\n    }\n    switch (msg->type) {\n#if !LWIP_TCPIP_CORE_LOCKING\n    case TCPIP_MSG_API:\n      LWIP_DEBUGF(TCPIP_DEBUG, (\"tcpip_thread: API message %p\\n\", (void *)msg));\n      msg->msg.api_msg.function(msg->msg.api_msg.msg);\n      break;\n    case TCPIP_MSG_API_CALL:\n      LWIP_DEBUGF(TCPIP_DEBUG, (\"tcpip_thread: API CALL message %p\\n\", (void *)msg));\n      msg->msg.api_call.arg->err = msg->msg.api_call.function(msg->msg.api_call.arg);\n      sys_sem_signal(msg->msg.api_call.sem);\n      break;\n#endif /* !LWIP_TCPIP_CORE_LOCKING */\n\n#if !LWIP_TCPIP_CORE_LOCKING_INPUT\n    case TCPIP_MSG_INPKT:\n      LWIP_DEBUGF(TCPIP_DEBUG, (\"tcpip_thread: PACKET %p\\n\", (void *)msg));\n      msg->msg.inp.input_fn(msg->msg.inp.p, msg->msg.inp.netif);\n      memp_free(MEMP_TCPIP_MSG_INPKT, msg);\n      break;\n#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */\n\n#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS\n    case TCPIP_MSG_TIMEOUT:\n      LWIP_DEBUGF(TCPIP_DEBUG, (\"tcpip_thread: TIMEOUT %p\\n\", (void *)msg));\n      sys_timeout(msg->msg.tmo.msecs, msg->msg.tmo.h, msg->msg.tmo.arg);\n      memp_free(MEMP_TCPIP_MSG_API, msg);\n      break;\n    case TCPIP_MSG_UNTIMEOUT:\n      LWIP_DEBUGF(TCPIP_DEBUG, (\"tcpip_thread: UNTIMEOUT %p\\n\", (void *)msg));\n      sys_untimeout(msg->msg.tmo.h, msg->msg.tmo.arg);\n      memp_free(MEMP_TCPIP_MSG_API, msg);\n      break;\n#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */\n\n    case TCPIP_MSG_CALLBACK:\n      LWIP_DEBUGF(TCPIP_DEBUG, (\"tcpip_thread: CALLBACK %p\\n\", (void *)msg));\n      msg->msg.cb.function(msg->msg.cb.ctx);\n      memp_free(MEMP_TCPIP_MSG_API, msg);\n      break;\n\n    case TCPIP_MSG_CALLBACK_STATIC:\n      LWIP_DEBUGF(TCPIP_DEBUG, (\"tcpip_thread: CALLBACK_STATIC %p\\n\", (void *)msg));\n      msg->msg.cb.function(msg->msg.cb.ctx);\n      break;\n\n    default:\n      LWIP_DEBUGF(TCPIP_DEBUG, (\"tcpip_thread: invalid message: %d\\n\", msg->type));\n      LWIP_ASSERT(\"tcpip_thread: invalid message\", 0);\n      break;\n    }\n  }\n}\n\n/**\n * Pass a received packet to tcpip_thread for input processing\n *\n * @param p the received packet\n * @param inp the network interface on which the packet was received\n * @param input_fn input function to call\n */\nerr_t\ntcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn)\n{\n#if LWIP_TCPIP_CORE_LOCKING_INPUT\n  err_t ret;\n  LWIP_DEBUGF(TCPIP_DEBUG, (\"tcpip_inpkt: PACKET %p/%p\\n\", (void *)p, (void *)inp));\n  LOCK_TCPIP_CORE();\n  ret = input_fn(p, inp);\n  UNLOCK_TCPIP_CORE();\n  return ret;\n#else /* LWIP_TCPIP_CORE_LOCKING_INPUT */\n  struct tcpip_msg *msg;\n\n  LWIP_ASSERT(\"Invalid mbox\", sys_mbox_valid_val(mbox));\n\n  msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_INPKT);\n  if (msg == NULL) {\n    return ERR_MEM;\n  }\n\n  msg->type = TCPIP_MSG_INPKT;\n  msg->msg.inp.p = p;\n  msg->msg.inp.netif = inp;\n  msg->msg.inp.input_fn = input_fn;\n  if (sys_mbox_trypost(&mbox, msg) != ERR_OK) {\n    memp_free(MEMP_TCPIP_MSG_INPKT, msg);\n    return ERR_MEM;\n  }\n  return ERR_OK;\n#endif /* LWIP_TCPIP_CORE_LOCKING_INPUT */\n}\n\n/**\n * @ingroup lwip_os\n * Pass a received packet to tcpip_thread for input processing with\n * ethernet_input or ip_input. Don't call directly, pass to netif_add()\n * and call netif->input().\n *\n * @param p the received packet, p->payload pointing to the Ethernet header or\n *          to an IP header (if inp doesn't have NETIF_FLAG_ETHARP or\n *          NETIF_FLAG_ETHERNET flags)\n * @param inp the network interface on which the packet was received\n */\nerr_t\ntcpip_input(struct pbuf *p, struct netif *inp)\n{\n#if LWIP_ETHERNET\n  if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {\n    return tcpip_inpkt(p, inp, ethernet_input);\n  } else\n#endif /* LWIP_ETHERNET */\n  return tcpip_inpkt(p, inp, ip_input);\n}\n\n/**\n * Call a specific function in the thread context of\n * tcpip_thread for easy access synchronization.\n * A function called in that way may access lwIP core code\n * without fearing concurrent access.\n *\n * @param function the function to call\n * @param ctx parameter passed to f\n * @param block 1 to block until the request is posted, 0 to non-blocking mode\n * @return ERR_OK if the function was called, another err_t if not\n */\nerr_t\ntcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block)\n{\n  struct tcpip_msg *msg;\n\n  LWIP_ASSERT(\"Invalid mbox\", sys_mbox_valid_val(mbox));\n\n  msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);\n  if (msg == NULL) {\n    return ERR_MEM;\n  }\n\n  msg->type = TCPIP_MSG_CALLBACK;\n  msg->msg.cb.function = function;\n  msg->msg.cb.ctx = ctx;\n  if (block) {\n    sys_mbox_post(&mbox, msg);\n  } else {\n    if (sys_mbox_trypost(&mbox, msg) != ERR_OK) {\n      memp_free(MEMP_TCPIP_MSG_API, msg);\n      return ERR_MEM;\n    }\n  }\n  return ERR_OK;\n}\n\n#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS\n/**\n * call sys_timeout in tcpip_thread\n *\n * @param msecs time in milliseconds for timeout\n * @param h function to be called on timeout\n * @param arg argument to pass to timeout function h\n * @return ERR_MEM on memory error, ERR_OK otherwise\n */\nerr_t\ntcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg)\n{\n  struct tcpip_msg *msg;\n\n  LWIP_ASSERT(\"Invalid mbox\", sys_mbox_valid_val(mbox));\n\n  msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);\n  if (msg == NULL) {\n    return ERR_MEM;\n  }\n\n  msg->type = TCPIP_MSG_TIMEOUT;\n  msg->msg.tmo.msecs = msecs;\n  msg->msg.tmo.h = h;\n  msg->msg.tmo.arg = arg;\n  sys_mbox_post(&mbox, msg);\n  return ERR_OK;\n}\n\n/**\n * call sys_untimeout in tcpip_thread\n *\n * @param h function to be called on timeout\n * @param arg argument to pass to timeout function h\n * @return ERR_MEM on memory error, ERR_OK otherwise\n */\nerr_t\ntcpip_untimeout(sys_timeout_handler h, void *arg)\n{\n  struct tcpip_msg *msg;\n\n  LWIP_ASSERT(\"Invalid mbox\", sys_mbox_valid_val(mbox));\n\n  msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);\n  if (msg == NULL) {\n    return ERR_MEM;\n  }\n\n  msg->type = TCPIP_MSG_UNTIMEOUT;\n  msg->msg.tmo.h = h;\n  msg->msg.tmo.arg = arg;\n  sys_mbox_post(&mbox, msg);\n  return ERR_OK;\n}\n#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */\n\n\n/**\n * Sends a message to TCPIP thread to call a function. Caller thread blocks on\n * on a provided semaphore, which ist NOT automatically signalled by TCPIP thread,\n * this has to be done by the user.\n * It is recommended to use LWIP_TCPIP_CORE_LOCKING since this is the way\n * with least runtime overhead.\n *\n * @param fn function to be called from TCPIP thread\n * @param apimsg argument to API function\n * @param sem semaphore to wait on\n * @return ERR_OK if the function was called, another err_t if not\n */\nerr_t\ntcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t* sem)\n{\n#if LWIP_TCPIP_CORE_LOCKING\n  LWIP_UNUSED_ARG(sem);\n  LOCK_TCPIP_CORE();\n  fn(apimsg);\n  UNLOCK_TCPIP_CORE();\n  return ERR_OK;\n#else /* LWIP_TCPIP_CORE_LOCKING */\n  TCPIP_MSG_VAR_DECLARE(msg);\n\n  LWIP_ASSERT(\"semaphore not initialized\", sys_sem_valid(sem));\n  LWIP_ASSERT(\"Invalid mbox\", sys_mbox_valid_val(mbox));\n\n  TCPIP_MSG_VAR_ALLOC(msg);\n  TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API;\n  TCPIP_MSG_VAR_REF(msg).msg.api_msg.function = fn;\n  TCPIP_MSG_VAR_REF(msg).msg.api_msg.msg = apimsg;\n  sys_mbox_post(&mbox, &TCPIP_MSG_VAR_REF(msg));\n  sys_arch_sem_wait(sem, 0);\n  TCPIP_MSG_VAR_FREE(msg);\n  return ERR_OK;\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n}\n\n/**\n * Synchronously calls function in TCPIP thread and waits for its completion.\n * It is recommended to use LWIP_TCPIP_CORE_LOCKING (preferred) or\n * LWIP_NETCONN_SEM_PER_THREAD. \n * If not, a semaphore is created and destroyed on every call which is usually\n * an expensive/slow operation.\n * @param fn Function to call\n * @param call Call parameters\n * @return Return value from tcpip_api_call_fn\n */\nerr_t\ntcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call)\n{\n#if LWIP_TCPIP_CORE_LOCKING\n  err_t err;\n  LOCK_TCPIP_CORE();\n  err = fn(call);\n  UNLOCK_TCPIP_CORE();\n  return err;\n#else /* LWIP_TCPIP_CORE_LOCKING */\n  TCPIP_MSG_VAR_DECLARE(msg);\n\n#if !LWIP_NETCONN_SEM_PER_THREAD\n  err_t err = sys_sem_new(&call->sem, 0);\n  if (err != ERR_OK) {\n    return err;\n  }\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n\n  LWIP_ASSERT(\"Invalid mbox\", sys_mbox_valid_val(mbox));\n\n  TCPIP_MSG_VAR_ALLOC(msg);\n  TCPIP_MSG_VAR_REF(msg).type = TCPIP_MSG_API_CALL;\n  TCPIP_MSG_VAR_REF(msg).msg.api_call.arg = call;\n  TCPIP_MSG_VAR_REF(msg).msg.api_call.function = fn;\n#if LWIP_NETCONN_SEM_PER_THREAD\n  TCPIP_MSG_VAR_REF(msg).msg.api_call.sem = LWIP_NETCONN_THREAD_SEM_GET();\n#else /* LWIP_NETCONN_SEM_PER_THREAD */\n  TCPIP_MSG_VAR_REF(msg).msg.api_call.sem = &call->sem;\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n  sys_mbox_post(&mbox, &TCPIP_MSG_VAR_REF(msg));\n  sys_arch_sem_wait(TCPIP_MSG_VAR_REF(msg).msg.api_call.sem, 0);\n  TCPIP_MSG_VAR_FREE(msg);\n\n#if !LWIP_NETCONN_SEM_PER_THREAD\n  sys_sem_free(&call->sem);\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n\n  return call->err;\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n}\n\n/**\n * Allocate a structure for a static callback message and initialize it.\n * This is intended to be used to send \"static\" messages from interrupt context.\n *\n * @param function the function to call\n * @param ctx parameter passed to function\n * @return a struct pointer to pass to tcpip_trycallback().\n */\nstruct tcpip_callback_msg*\ntcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx)\n{\n  struct tcpip_msg *msg = (struct tcpip_msg *)memp_malloc(MEMP_TCPIP_MSG_API);\n  if (msg == NULL) {\n    return NULL;\n  }\n  msg->type = TCPIP_MSG_CALLBACK_STATIC;\n  msg->msg.cb.function = function;\n  msg->msg.cb.ctx = ctx;\n  return (struct tcpip_callback_msg*)msg;\n}\n\n/**\n * Free a callback message allocated by tcpip_callbackmsg_new().\n *\n * @param msg the message to free\n */\nvoid\ntcpip_callbackmsg_delete(struct tcpip_callback_msg* msg)\n{\n  memp_free(MEMP_TCPIP_MSG_API, msg);\n}\n\n/**\n * Try to post a callback-message to the tcpip_thread mbox\n * This is intended to be used to send \"static\" messages from interrupt context.\n *\n * @param msg pointer to the message to post\n * @return sys_mbox_trypost() return code\n */\nerr_t\ntcpip_trycallback(struct tcpip_callback_msg* msg)\n{\n  LWIP_ASSERT(\"Invalid mbox\", sys_mbox_valid_val(mbox));\n  return sys_mbox_trypost(&mbox, msg);\n}\n\n/**\n * @ingroup lwip_os\n * Initialize this module:\n * - initialize all sub modules\n * - start the tcpip_thread\n *\n * @param initfunc a function to call when tcpip_thread is running and finished initializing\n * @param arg argument to pass to initfunc\n */\nvoid\ntcpip_init(tcpip_init_done_fn initfunc, void *arg)\n{\n  lwip_init();\n\n  tcpip_init_done = initfunc;\n  tcpip_init_done_arg = arg;\n  if (sys_mbox_new(&mbox, TCPIP_MBOX_SIZE) != ERR_OK) {\n    LWIP_ASSERT(\"failed to create tcpip_thread mbox\", 0);\n  }\n#if LWIP_TCPIP_CORE_LOCKING\n  if (sys_mutex_new(&lock_tcpip_core) != ERR_OK) {\n    LWIP_ASSERT(\"failed to create lock_tcpip_core\", 0);\n  }\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n\n  sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);\n}\n\n/**\n * Simple callback function used with tcpip_callback to free a pbuf\n * (pbuf_free has a wrong signature for tcpip_callback)\n *\n * @param p The pbuf (chain) to be dereferenced.\n */\nstatic void\npbuf_free_int(void *p)\n{\n  struct pbuf *q = (struct pbuf *)p;\n  pbuf_free(q);\n}\n\n/**\n * A simple wrapper function that allows you to free a pbuf from interrupt context.\n *\n * @param p The pbuf (chain) to be dereferenced.\n * @return ERR_OK if callback could be enqueued, an err_t if not\n */\nerr_t\npbuf_free_callback(struct pbuf *p)\n{\n  return tcpip_callback_with_block(pbuf_free_int, p, 0);\n}\n\n/**\n * A simple wrapper function that allows you to free heap memory from\n * interrupt context.\n *\n * @param m the heap memory to free\n * @return ERR_OK if callback could be enqueued, an err_t if not\n */\nerr_t\nmem_free_callback(void *m)\n{\n  return tcpip_callback_with_block(mem_free, m, 0);\n}\n\n#endif /* !NO_SYS */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/httpd/fs.c",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/apps/httpd_opts.h\"\n#include \"lwip/def.h\"\n#include \"lwip/apps/fs.h\"\n#include \"fsdata.h\"\n#include <string.h>\n\n\n#if HTTPD_USE_CUSTOM_FSDATA\n#include \"fsdata_custom.c\"\n#else /* HTTPD_USE_CUSTOM_FSDATA */\n#include \"fsdata.c\"\n#endif /* HTTPD_USE_CUSTOM_FSDATA */\n\n/*-----------------------------------------------------------------------------------*/\n\n#if LWIP_HTTPD_CUSTOM_FILES\nint fs_open_custom(struct fs_file *file, const char *name);\nvoid fs_close_custom(struct fs_file *file);\n#if LWIP_HTTPD_FS_ASYNC_READ\nu8_t fs_canread_custom(struct fs_file *file);\nu8_t fs_wait_read_custom(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg);\nint fs_read_async_custom(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg);\n#else /* LWIP_HTTPD_FS_ASYNC_READ */\nint fs_read_custom(struct fs_file *file, char *buffer, int count);\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n#endif /* LWIP_HTTPD_CUSTOM_FILES */\n\n/*-----------------------------------------------------------------------------------*/\nerr_t\nfs_open(struct fs_file *file, const char *name)\n{\n  const struct fsdata_file *f;\n\n  if ((file == NULL) || (name == NULL)) {\n     return ERR_ARG;\n  }\n\n#if LWIP_HTTPD_CUSTOM_FILES\n  if (fs_open_custom(file, name)) {\n    file->is_custom_file = 1;\n    return ERR_OK;\n  }\n  file->is_custom_file = 0;\n#endif /* LWIP_HTTPD_CUSTOM_FILES */\n\n  for (f = FS_ROOT; f != NULL; f = f->next) {\n    if (!strcmp(name, (const char *)f->name)) {\n      file->data = (const char *)f->data;\n      file->len = f->len;\n      file->index = f->len;\n      file->pextension = NULL;\n      file->flags = f->flags;\n#if HTTPD_PRECALCULATED_CHECKSUM\n      file->chksum_count = f->chksum_count;\n      file->chksum = f->chksum;\n#endif /* HTTPD_PRECALCULATED_CHECKSUM */\n#if LWIP_HTTPD_FILE_STATE\n      file->state = fs_state_init(file, name);\n#endif /* #if LWIP_HTTPD_FILE_STATE */\n      return ERR_OK;\n    }\n  }\n  /* file not found */\n  return ERR_VAL;\n}\n\n/*-----------------------------------------------------------------------------------*/\nvoid\nfs_close(struct fs_file *file)\n{\n#if LWIP_HTTPD_CUSTOM_FILES\n  if (file->is_custom_file) {\n    fs_close_custom(file);\n  }\n#endif /* LWIP_HTTPD_CUSTOM_FILES */\n#if LWIP_HTTPD_FILE_STATE\n  fs_state_free(file, file->state);\n#endif /* #if LWIP_HTTPD_FILE_STATE */\n  LWIP_UNUSED_ARG(file);\n}\n/*-----------------------------------------------------------------------------------*/\n#if LWIP_HTTPD_DYNAMIC_FILE_READ\n#if LWIP_HTTPD_FS_ASYNC_READ\nint\nfs_read_async(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg)\n#else /* LWIP_HTTPD_FS_ASYNC_READ */\nint\nfs_read(struct fs_file *file, char *buffer, int count)\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n{\n  int read;\n  if(file->index == file->len) {\n    return FS_READ_EOF;\n  }\n#if LWIP_HTTPD_FS_ASYNC_READ\n  LWIP_UNUSED_ARG(callback_fn);\n  LWIP_UNUSED_ARG(callback_arg);\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n#if LWIP_HTTPD_CUSTOM_FILES\n  if (file->is_custom_file) {\n#if LWIP_HTTPD_FS_ASYNC_READ\n    return fs_read_async_custom(file, buffer, count, callback_fn, callback_arg);\n#else /* LWIP_HTTPD_FS_ASYNC_READ */\n    return fs_read_custom(file, buffer, count);\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n  }\n#endif /* LWIP_HTTPD_CUSTOM_FILES */\n\n  read = file->len - file->index;\n  if(read > count) {\n    read = count;\n  }\n\n  MEMCPY(buffer, (file->data + file->index), read);\n  file->index += read;\n\n  return(read);\n}\n#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */\n/*-----------------------------------------------------------------------------------*/\n#if LWIP_HTTPD_FS_ASYNC_READ\nint\nfs_is_file_ready(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg)\n{\n  if (file != NULL) {\n#if LWIP_HTTPD_FS_ASYNC_READ\n#if LWIP_HTTPD_CUSTOM_FILES\n    if (!fs_canread_custom(file)) {\n      if (fs_wait_read_custom(file, callback_fn, callback_arg)) {\n        return 0;\n      }\n    }\n#else /* LWIP_HTTPD_CUSTOM_FILES */\n    LWIP_UNUSED_ARG(callback_fn);\n    LWIP_UNUSED_ARG(callback_arg);\n#endif /* LWIP_HTTPD_CUSTOM_FILES */\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n  }\n  return 1;\n}\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n/*-----------------------------------------------------------------------------------*/\nint\nfs_bytes_left(struct fs_file *file)\n{\n  return file->len - file->index;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/httpd/fsdata.c",
    "content": "#include \"lwip/apps/fs.h\"\n#include \"lwip/def.h\"\n#include \"fsdata.h\"\n\n\n#define file_NULL (struct fsdata_file *) NULL\n\n\nstatic const unsigned int dummy_align__img_sics_gif = 0;\nstatic const unsigned char data__img_sics_gif[] = {\n/* /img/sics.gif (14 chars) */\n0x2f,0x69,0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x00,0x00,0x00,\n\n/* HTTP header */\n/* \"HTTP/1.0 200 OK\n\" (17 bytes) */\n0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,\n0x0a,\n/* \"Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)\n\" (63 bytes) */\n0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33,\n0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e,\n0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70,\n0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,\n/* \"Content-type: image/gif\n\n\" (27 bytes) */\n0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x69,0x6d,\n0x61,0x67,0x65,0x2f,0x67,0x69,0x66,0x0d,0x0a,0x0d,0x0a,\n/* raw file data (724 bytes) */\n0x47,0x49,0x46,0x38,0x39,0x61,0x46,0x00,0x22,0x00,0xa5,0x00,0x00,0xd9,0x2b,0x39,\n0x6a,0x6a,0x6a,0xbf,0xbf,0xbf,0x93,0x93,0x93,0x0f,0x0f,0x0f,0xb0,0xb0,0xb0,0xa6,\n0xa6,0xa6,0x80,0x80,0x80,0x76,0x76,0x76,0x1e,0x1e,0x1e,0x9d,0x9d,0x9d,0x2e,0x2e,\n0x2e,0x49,0x49,0x49,0x54,0x54,0x54,0x8a,0x8a,0x8a,0x60,0x60,0x60,0xc6,0xa6,0x99,\n0xbd,0xb5,0xb2,0xc2,0xab,0xa1,0xd9,0x41,0x40,0xd5,0x67,0x55,0xc0,0xb0,0xaa,0xd5,\n0x5e,0x4e,0xd6,0x50,0x45,0xcc,0x93,0x7d,0xc8,0xa1,0x90,0xce,0x8b,0x76,0xd2,0x7b,\n0x65,0xd1,0x84,0x6d,0xc9,0x99,0x86,0x3a,0x3a,0x3a,0x00,0x00,0x00,0xb8,0xb8,0xb8,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,\n0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2c,0x00,0x00,\n0x00,0x00,0x46,0x00,0x22,0x00,0x00,0x06,0xfe,0x40,0x90,0x70,0x48,0x2c,0x1a,0x8f,\n0xc8,0xa4,0x72,0xc9,0x6c,0x3a,0x9f,0xd0,0xa8,0x74,0x4a,0xad,0x5a,0xaf,0xd8,0xac,\n0x76,0xa9,0x40,0x04,0xbe,0x83,0xe2,0x60,0x3c,0x50,0x20,0x0d,0x8e,0x6f,0x00,0x31,\n0x28,0x1c,0x0d,0x07,0xb5,0xc3,0x60,0x75,0x24,0x3e,0xf8,0xfc,0x87,0x11,0x06,0xe9,\n0x3d,0x46,0x07,0x0b,0x7a,0x7a,0x7c,0x43,0x06,0x1e,0x84,0x78,0x0b,0x07,0x6e,0x51,\n0x01,0x8a,0x84,0x08,0x7e,0x79,0x80,0x87,0x89,0x91,0x7a,0x93,0x0a,0x04,0x99,0x78,\n0x96,0x4f,0x03,0x9e,0x79,0x01,0x94,0x9f,0x43,0x9c,0xa3,0xa4,0x05,0x77,0xa3,0xa0,\n0x4e,0x98,0x79,0x0b,0x1e,0x83,0xa4,0xa6,0x1f,0x96,0x05,0x9d,0xaa,0x78,0x01,0x07,\n0x84,0x04,0x1e,0x1e,0xbb,0xb8,0x51,0x84,0x0e,0x43,0x05,0x07,0x77,0xa5,0x7f,0x42,\n0xb1,0xb2,0x01,0x63,0x08,0x0d,0xbb,0x01,0x0c,0x7a,0x0d,0x44,0x0e,0xd8,0xaf,0x4c,\n0x05,0x7a,0x04,0x47,0x07,0x07,0xb7,0x80,0xa2,0xe1,0x7d,0x44,0x05,0x01,0x04,0x01,\n0xd0,0xea,0x87,0x93,0x4f,0xe0,0x9a,0x49,0xce,0xd8,0x79,0x04,0x66,0x20,0x15,0x10,\n0x10,0x11,0x92,0x29,0x80,0xb6,0xc0,0x91,0x15,0x45,0x1e,0x90,0x19,0x71,0x46,0xa8,\n0x5c,0x04,0x0e,0x00,0x22,0x4e,0xe8,0x40,0x24,0x9f,0x3e,0x04,0x06,0xa7,0x58,0xd4,\n0x93,0xa0,0x1c,0x91,0x3f,0xe8,0xf0,0x88,0x03,0xb1,0x21,0xa2,0x49,0x00,0x19,0x86,\n0xfc,0x52,0x44,0xe0,0x01,0x9d,0x29,0x21,0x15,0x25,0x50,0xf7,0x67,0x25,0x1e,0x06,\n0xfd,0x4e,0x9a,0xb4,0x90,0xac,0x15,0xfa,0xcb,0x52,0x53,0x1e,0x8c,0xf2,0xf8,0x07,\n0x92,0x2d,0x08,0x3a,0x4d,0x12,0x49,0x95,0x49,0xdb,0x14,0x04,0xc4,0x14,0x85,0x29,\n0xaa,0xe7,0x01,0x08,0xa4,0x49,0x01,0x14,0x51,0xe0,0x53,0x91,0xd5,0x29,0x06,0x1a,\n0x64,0x02,0xf4,0xc7,0x81,0x9e,0x05,0x20,0x22,0x64,0xa5,0x30,0xae,0xab,0x9e,0x97,\n0x53,0xd8,0xb9,0xfd,0x50,0xef,0x93,0x02,0x42,0x74,0x34,0xe8,0x9c,0x20,0x21,0xc9,\n0x01,0x68,0x78,0xe6,0x55,0x29,0x20,0x56,0x4f,0x4c,0x40,0x51,0x71,0x82,0xc0,0x70,\n0x21,0x22,0x85,0xbe,0x4b,0x1c,0x44,0x05,0xea,0xa4,0x01,0xbf,0x22,0xb5,0xf0,0x1c,\n0x06,0x51,0x38,0x8f,0xe0,0x22,0xec,0x18,0xac,0x39,0x22,0xd4,0xd6,0x93,0x44,0x01,\n0x32,0x82,0xc8,0xfc,0x61,0xb3,0x01,0x45,0x0c,0x2e,0x83,0x30,0xd0,0x0e,0x17,0x24,\n0x0f,0x70,0x85,0x94,0xee,0x05,0x05,0x53,0x4b,0x32,0x1b,0x3f,0x98,0xd3,0x1d,0x29,\n0x81,0xb0,0xae,0x1e,0x8c,0x7e,0x68,0xe0,0x60,0x5a,0x54,0x8f,0xb0,0x78,0x69,0x73,\n0x06,0xa2,0x00,0x6b,0x57,0xca,0x3d,0x11,0x50,0xbd,0x04,0x30,0x4b,0x3a,0xd4,0xab,\n0x5f,0x1f,0x9b,0x3d,0x13,0x74,0x27,0x88,0x3c,0x25,0xe0,0x17,0xbe,0x7a,0x79,0x45,\n0x0d,0x0c,0xb0,0x8b,0xda,0x90,0xca,0x80,0x06,0x5d,0x17,0x60,0x1c,0x22,0x4c,0xd8,\n0x57,0x22,0x06,0x20,0x00,0x98,0x07,0x08,0xe4,0x56,0x80,0x80,0x1c,0xc5,0xb7,0xc5,\n0x82,0x0c,0x36,0xe8,0xe0,0x83,0x10,0x46,0x28,0xe1,0x84,0x14,0x56,0x68,0xa1,0x10,\n0x41,0x00,0x00,0x3b,};\n\nstatic const unsigned int dummy_align__404_html = 1;\nstatic const unsigned char data__404_html[] = {\n/* /404.html (10 chars) */\n0x2f,0x34,0x30,0x34,0x2e,0x68,0x74,0x6d,0x6c,0x00,0x00,0x00,\n\n/* HTTP header */\n/* \"HTTP/1.0 404 File not found\n\" (29 bytes) */\n0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x34,0x30,0x34,0x20,0x46,0x69,0x6c,\n0x65,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x0d,0x0a,\n/* \"Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)\n\" (63 bytes) */\n0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33,\n0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e,\n0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70,\n0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,\n/* \"Content-type: text/html\n\n\" (27 bytes) */\n0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65,\n0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a,\n/* raw file data (565 bytes) */\n0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74,\n0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69,\n0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,\n0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f,\n0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63,\n0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78,\n0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20,\n0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,\n0x31,0x30,0x30,0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,\n0x72,0x20,0x76,0x61,0x6c,0x69,0x67,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x3c,\n0x74,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x09,0x20,\n0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,\n0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,\n0x65,0x2f,0x22,0x3e,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69,\n0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x0d,0x0a,0x09,0x20,\n0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d,\n0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c,\n0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x3e,0x3c,0x2f,\n0x61,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x77,0x69,\n0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x09,0x20,0x20,0x0d,0x0a,0x09,\n0x20,0x20,0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,\n0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,\n0x50,0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x20,\n0x20,0x3c,0x68,0x32,0x3e,0x34,0x30,0x34,0x20,0x2d,0x20,0x50,0x61,0x67,0x65,0x20,\n0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x3c,0x2f,0x68,0x32,0x3e,0x0d,0x0a,\n0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x53,0x6f,0x72,\n0x72,0x79,0x2c,0x20,0x74,0x68,0x65,0x20,0x70,0x61,0x67,0x65,0x20,0x79,0x6f,0x75,\n0x20,0x61,0x72,0x65,0x20,0x72,0x65,0x71,0x75,0x65,0x73,0x74,0x69,0x6e,0x67,0x20,\n0x77,0x61,0x73,0x20,0x6e,0x6f,0x74,0x20,0x66,0x6f,0x75,0x6e,0x64,0x20,0x6f,0x6e,\n0x20,0x74,0x68,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76,\n0x65,0x72,0x2e,0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,\n0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x26,0x6e,\n0x62,0x73,0x70,0x3b,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,\n0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,\n0x3e,0x0d,0x0a,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,\n0x6d,0x6c,0x3e,0x0d,0x0a,};\n\nstatic const unsigned int dummy_align__index_html = 2;\nstatic const unsigned char data__index_html[] = {\n/* /index.html (12 chars) */\n0x2f,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,0x6c,0x00,\n\n/* HTTP header */\n/* \"HTTP/1.0 200 OK\n\" (17 bytes) */\n0x48,0x54,0x54,0x50,0x2f,0x31,0x2e,0x30,0x20,0x32,0x30,0x30,0x20,0x4f,0x4b,0x0d,\n0x0a,\n/* \"Server: lwIP/1.3.1 (http://savannah.nongnu.org/projects/lwip)\n\" (63 bytes) */\n0x53,0x65,0x72,0x76,0x65,0x72,0x3a,0x20,0x6c,0x77,0x49,0x50,0x2f,0x31,0x2e,0x33,\n0x2e,0x31,0x20,0x28,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e,\n0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70,\n0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x29,0x0d,0x0a,\n/* \"Content-type: text/html\n\n\" (27 bytes) */\n0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x2d,0x74,0x79,0x70,0x65,0x3a,0x20,0x74,0x65,\n0x78,0x74,0x2f,0x68,0x74,0x6d,0x6c,0x0d,0x0a,0x0d,0x0a,\n/* raw file data (1751 bytes) */\n0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x3e,0x3c,0x74,\n0x69,0x74,0x6c,0x65,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,0x69,\n0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,\n0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x74,0x69,0x74,0x6c,0x65,0x3e,0x3c,0x2f,\n0x68,0x65,0x61,0x64,0x3e,0x0d,0x0a,0x3c,0x62,0x6f,0x64,0x79,0x20,0x62,0x67,0x63,\n0x6f,0x6c,0x6f,0x72,0x3d,0x22,0x77,0x68,0x69,0x74,0x65,0x22,0x20,0x74,0x65,0x78,\n0x74,0x3d,0x22,0x62,0x6c,0x61,0x63,0x6b,0x22,0x3e,0x0d,0x0a,0x0d,0x0a,0x20,0x20,\n0x20,0x20,0x3c,0x74,0x61,0x62,0x6c,0x65,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,\n0x31,0x30,0x30,0x25,0x22,0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x74,\n0x72,0x20,0x76,0x61,0x6c,0x69,0x67,0x6e,0x3d,0x22,0x74,0x6f,0x70,0x22,0x3e,0x3c,\n0x74,0x64,0x20,0x77,0x69,0x64,0x74,0x68,0x3d,0x22,0x38,0x30,0x22,0x3e,0x09,0x20,\n0x20,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x61,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,\n0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,\n0x65,0x2f,0x22,0x3e,0x3c,0x69,0x6d,0x67,0x20,0x73,0x72,0x63,0x3d,0x22,0x2f,0x69,\n0x6d,0x67,0x2f,0x73,0x69,0x63,0x73,0x2e,0x67,0x69,0x66,0x22,0x0d,0x0a,0x09,0x20,\n0x20,0x62,0x6f,0x72,0x64,0x65,0x72,0x3d,0x22,0x30,0x22,0x20,0x61,0x6c,0x74,0x3d,\n0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x20,0x74,0x69,0x74,0x6c,\n0x65,0x3d,0x22,0x53,0x49,0x43,0x53,0x20,0x6c,0x6f,0x67,0x6f,0x22,0x3e,0x3c,0x2f,\n0x61,0x3e,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x20,0x77,0x69,\n0x64,0x74,0x68,0x3d,0x22,0x35,0x30,0x30,0x22,0x3e,0x09,0x20,0x20,0x0d,0x0a,0x09,\n0x20,0x20,0x3c,0x68,0x31,0x3e,0x6c,0x77,0x49,0x50,0x20,0x2d,0x20,0x41,0x20,0x4c,\n0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,\n0x50,0x20,0x53,0x74,0x61,0x63,0x6b,0x3c,0x2f,0x68,0x31,0x3e,0x0d,0x0a,0x09,0x20,\n0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x54,0x68,0x65,0x20,0x77,\n0x65,0x62,0x20,0x70,0x61,0x67,0x65,0x20,0x79,0x6f,0x75,0x20,0x61,0x72,0x65,0x20,\n0x77,0x61,0x74,0x63,0x68,0x69,0x6e,0x67,0x20,0x77,0x61,0x73,0x20,0x73,0x65,0x72,\n0x76,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x73,0x69,0x6d,0x70,0x6c,0x65,0x20,\n0x77,0x65,0x62,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x65,0x72,0x76,0x65,0x72,\n0x20,0x72,0x75,0x6e,0x6e,0x69,0x6e,0x67,0x20,0x6f,0x6e,0x20,0x74,0x6f,0x70,0x20,\n0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x6c,0x69,0x67,0x68,0x74,0x77,0x65,0x69,0x67,\n0x68,0x74,0x20,0x54,0x43,0x50,0x2f,0x49,0x50,0x20,0x73,0x74,0x61,0x63,0x6b,0x20,\n0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,\n0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,\n0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x6c,\n0x77,0x49,0x50,0x3c,0x2f,0x61,0x3e,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,\n0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,\n0x6c,0x77,0x49,0x50,0x20,0x69,0x73,0x20,0x61,0x6e,0x20,0x6f,0x70,0x65,0x6e,0x20,\n0x73,0x6f,0x75,0x72,0x63,0x65,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,\n0x61,0x74,0x69,0x6f,0x6e,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,0x20,0x54,0x43,0x50,\n0x2f,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x72,0x6f,0x74,0x6f,0x63,\n0x6f,0x6c,0x20,0x73,0x75,0x69,0x74,0x65,0x20,0x74,0x68,0x61,0x74,0x20,0x77,0x61,\n0x73,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x6c,0x79,0x20,0x77,0x72,0x69,\n0x74,0x74,0x65,0x6e,0x20,0x62,0x79,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,\n0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,\n0x77,0x2e,0x73,0x69,0x63,0x73,0x2e,0x73,0x65,0x2f,0x7e,0x61,0x64,0x61,0x6d,0x2f,\n0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x41,0x64,0x61,0x6d,0x20,0x44,0x75,0x6e,0x6b,\n0x65,0x6c,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x66,0x20,0x74,0x68,0x65,\n0x20,0x53,0x77,0x65,0x64,0x69,0x73,0x68,0x20,0x49,0x6e,0x73,0x74,0x69,0x74,0x75,\n0x74,0x65,0x20,0x6f,0x66,0x20,0x43,0x6f,0x6d,0x70,0x75,0x74,0x65,0x72,0x20,0x53,\n0x63,0x69,0x65,0x6e,0x63,0x65,0x3c,0x2f,0x61,0x3e,0x20,0x62,0x75,0x74,0x20,0x6e,\n0x6f,0x77,0x20,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x62,0x65,0x69,0x6e,\n0x67,0x20,0x61,0x63,0x74,0x69,0x76,0x65,0x6c,0x79,0x20,0x64,0x65,0x76,0x65,0x6c,\n0x6f,0x70,0x65,0x64,0x20,0x62,0x79,0x20,0x61,0x20,0x74,0x65,0x61,0x6d,0x20,0x6f,\n0x66,0x20,0x64,0x65,0x76,0x65,0x6c,0x6f,0x70,0x65,0x72,0x73,0x0d,0x0a,0x09,0x20,\n0x20,0x20,0x20,0x64,0x69,0x73,0x74,0x72,0x69,0x62,0x75,0x74,0x65,0x64,0x20,0x77,\n0x6f,0x72,0x6c,0x64,0x2d,0x77,0x69,0x64,0x65,0x2e,0x20,0x53,0x69,0x6e,0x63,0x65,\n0x20,0x69,0x74,0x27,0x73,0x20,0x72,0x65,0x6c,0x65,0x61,0x73,0x65,0x2c,0x20,0x6c,\n0x77,0x49,0x50,0x20,0x68,0x61,0x73,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x73,0x70,\n0x75,0x72,0x72,0x65,0x64,0x20,0x61,0x20,0x6c,0x6f,0x74,0x20,0x6f,0x66,0x20,0x69,\n0x6e,0x74,0x65,0x72,0x65,0x73,0x74,0x20,0x61,0x6e,0x64,0x20,0x68,0x61,0x73,0x20,\n0x62,0x65,0x65,0x6e,0x20,0x70,0x6f,0x72,0x74,0x65,0x64,0x20,0x74,0x6f,0x20,0x73,\n0x65,0x76,0x65,0x72,0x61,0x6c,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x70,0x6c,0x61,\n0x74,0x66,0x6f,0x72,0x6d,0x73,0x20,0x61,0x6e,0x64,0x20,0x6f,0x70,0x65,0x72,0x61,\n0x74,0x69,0x6e,0x67,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,0x73,0x2e,0x20,0x6c,0x77,\n0x49,0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x75,0x73,0x65,0x64,0x20,0x65,\n0x69,0x74,0x68,0x65,0x72,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x77,0x69,0x74,0x68,\n0x20,0x6f,0x72,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x61,0x6e,0x20,0x75,\n0x6e,0x64,0x65,0x72,0x6c,0x79,0x69,0x6e,0x67,0x20,0x4f,0x53,0x2e,0x0d,0x0a,0x09,\n0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,0x0a,\n0x09,0x20,0x20,0x20,0x20,0x54,0x68,0x65,0x20,0x66,0x6f,0x63,0x75,0x73,0x20,0x6f,\n0x66,0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x20,0x54,0x43,0x50,0x2f,0x49,\n0x50,0x20,0x69,0x6d,0x70,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x61,0x74,0x69,0x6f,0x6e,\n0x20,0x69,0x73,0x20,0x74,0x6f,0x20,0x72,0x65,0x64,0x75,0x63,0x65,0x0d,0x0a,0x09,\n0x20,0x20,0x20,0x20,0x74,0x68,0x65,0x20,0x52,0x41,0x4d,0x20,0x75,0x73,0x61,0x67,\n0x65,0x20,0x77,0x68,0x69,0x6c,0x65,0x20,0x73,0x74,0x69,0x6c,0x6c,0x20,0x68,0x61,\n0x76,0x69,0x6e,0x67,0x20,0x61,0x20,0x66,0x75,0x6c,0x6c,0x20,0x73,0x63,0x61,0x6c,\n0x65,0x20,0x54,0x43,0x50,0x2e,0x20,0x54,0x68,0x69,0x73,0x0d,0x0a,0x09,0x20,0x20,\n0x20,0x20,0x6d,0x61,0x6b,0x65,0x73,0x20,0x6c,0x77,0x49,0x50,0x20,0x73,0x75,0x69,\n0x74,0x61,0x62,0x6c,0x65,0x20,0x66,0x6f,0x72,0x20,0x75,0x73,0x65,0x20,0x69,0x6e,\n0x20,0x65,0x6d,0x62,0x65,0x64,0x64,0x65,0x64,0x20,0x73,0x79,0x73,0x74,0x65,0x6d,\n0x73,0x20,0x77,0x69,0x74,0x68,0x20,0x74,0x65,0x6e,0x73,0x0d,0x0a,0x09,0x20,0x20,\n0x20,0x20,0x6f,0x66,0x20,0x6b,0x69,0x6c,0x6f,0x62,0x79,0x74,0x65,0x73,0x20,0x6f,\n0x66,0x20,0x66,0x72,0x65,0x65,0x20,0x52,0x41,0x4d,0x20,0x61,0x6e,0x64,0x20,0x72,\n0x6f,0x6f,0x6d,0x20,0x66,0x6f,0x72,0x20,0x61,0x72,0x6f,0x75,0x6e,0x64,0x20,0x34,\n0x30,0x20,0x6b,0x69,0x6c,0x6f,0x62,0x79,0x74,0x65,0x73,0x0d,0x0a,0x09,0x20,0x20,\n0x20,0x20,0x6f,0x66,0x20,0x63,0x6f,0x64,0x65,0x20,0x52,0x4f,0x4d,0x2e,0x0d,0x0a,\n0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x70,0x3e,0x0d,\n0x0a,0x09,0x20,0x20,0x20,0x20,0x4d,0x6f,0x72,0x65,0x20,0x69,0x6e,0x66,0x6f,0x72,\n0x6d,0x61,0x74,0x69,0x6f,0x6e,0x20,0x61,0x62,0x6f,0x75,0x74,0x20,0x6c,0x77,0x49,\n0x50,0x20,0x63,0x61,0x6e,0x20,0x62,0x65,0x20,0x66,0x6f,0x75,0x6e,0x64,0x20,0x61,\n0x74,0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x0d,0x0a,0x09,0x20,0x20,0x20,\n0x20,0x68,0x6f,0x6d,0x65,0x70,0x61,0x67,0x65,0x20,0x61,0x74,0x20,0x3c,0x61,0x0d,\n0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,0x22,0x68,0x74,0x74,0x70,\n0x3a,0x2f,0x2f,0x73,0x61,0x76,0x61,0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,\n0x6e,0x75,0x2e,0x6f,0x72,0x67,0x2f,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,\n0x6c,0x77,0x69,0x70,0x2f,0x22,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x73,0x61,\n0x76,0x61,0x6e,0x6e,0x61,0x68,0x2e,0x6e,0x6f,0x6e,0x67,0x6e,0x75,0x2e,0x6f,0x72,\n0x67,0x2f,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x73,0x2f,0x6c,0x77,0x69,0x70,0x2f,\n0x3c,0x2f,0x61,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x6f,0x72,0x20,0x61,0x74,\n0x20,0x74,0x68,0x65,0x20,0x6c,0x77,0x49,0x50,0x20,0x77,0x69,0x6b,0x69,0x20,0x61,\n0x74,0x20,0x3c,0x61,0x0d,0x0a,0x09,0x20,0x20,0x20,0x20,0x68,0x72,0x65,0x66,0x3d,\n0x22,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x6c,0x77,0x69,0x70,0x2e,0x77,0x69,0x6b,\n0x69,0x61,0x2e,0x63,0x6f,0x6d,0x2f,0x22,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,\n0x6c,0x77,0x69,0x70,0x2e,0x77,0x69,0x6b,0x69,0x61,0x2e,0x63,0x6f,0x6d,0x2f,0x3c,\n0x2f,0x61,0x3e,0x2e,0x0d,0x0a,0x09,0x20,0x20,0x3c,0x2f,0x70,0x3e,0x0d,0x0a,0x09,\n0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x74,0x64,0x3e,0x0d,0x0a,0x09,0x20,0x20,0x26,0x6e,\n0x62,0x73,0x70,0x3b,0x0d,0x0a,0x09,0x3c,0x2f,0x74,0x64,0x3e,0x3c,0x2f,0x74,0x72,\n0x3e,0x0d,0x0a,0x20,0x20,0x20,0x20,0x20,0x20,0x3c,0x2f,0x74,0x61,0x62,0x6c,0x65,\n0x3e,0x0d,0x0a,0x3c,0x2f,0x62,0x6f,0x64,0x79,0x3e,0x0d,0x0a,0x3c,0x2f,0x68,0x74,\n0x6d,0x6c,0x3e,0x0d,0x0a,0x0d,0x0a,};\n\n\n\nconst struct fsdata_file file__img_sics_gif[] = { {\nfile_NULL,\ndata__img_sics_gif,\ndata__img_sics_gif + 16,\nsizeof(data__img_sics_gif) - 16,\n1,\n}};\n\nconst struct fsdata_file file__404_html[] = { {\nfile__img_sics_gif,\ndata__404_html,\ndata__404_html + 12,\nsizeof(data__404_html) - 12,\n1,\n}};\n\nconst struct fsdata_file file__index_html[] = { {\nfile__404_html,\ndata__index_html,\ndata__index_html + 12,\nsizeof(data__index_html) - 12,\n1,\n}};\n\n#define FS_ROOT file__index_html\n#define FS_NUMFILES 3\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/httpd/fsdata.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_FSDATA_H\n#define LWIP_FSDATA_H\n\n#include \"lwip/apps/httpd_opts.h\"\n#include \"lwip/apps/fs.h\"\n\nstruct fsdata_file {\n  const struct fsdata_file *next;\n  const unsigned char *name;\n  const unsigned char *data;\n  int len;\n  u8_t flags;\n#if HTTPD_PRECALCULATED_CHECKSUM\n  u16_t chksum_count;\n  const struct fsdata_chksum *chksum;\n#endif /* HTTPD_PRECALCULATED_CHECKSUM */\n};\n\n#endif /* LWIP_FSDATA_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/httpd/httpd.c",
    "content": "/**\n * @file\n * LWIP HTTP server implementation\n */\n\n/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *         Simon Goldschmidt\n *\n */\n\n/**\n * @defgroup httpd HTTP server\n * @ingroup apps\n *\n * This httpd supports for a\n * rudimentary server-side-include facility which will replace tags of the form\n * <!--#tag--> in any file whose extension is .shtml, .shtm or .ssi with\n * strings provided by an include handler whose pointer is provided to the\n * module via function http_set_ssi_handler().\n * Additionally, a simple common\n * gateway interface (CGI) handling mechanism has been added to allow clients\n * to hook functions to particular request URIs.\n *\n * To enable SSI support, define label LWIP_HTTPD_SSI in lwipopts.h.\n * To enable CGI support, define label LWIP_HTTPD_CGI in lwipopts.h.\n *\n * By default, the server assumes that HTTP headers are already present in\n * each file stored in the file system.  By defining LWIP_HTTPD_DYNAMIC_HEADERS in\n * lwipopts.h, this behavior can be changed such that the server inserts the\n * headers automatically based on the extension of the file being served.  If\n * this mode is used, be careful to ensure that the file system image used\n * does not already contain the header information.\n *\n * File system images without headers can be created using the makefsfile\n * tool with the -h command line option.\n *\n *\n * Notes about valid SSI tags\n * --------------------------\n *\n * The following assumptions are made about tags used in SSI markers:\n *\n * 1. No tag may contain '-' or whitespace characters within the tag name.\n * 2. Whitespace is allowed between the tag leadin \"<!--#\" and the start of\n *    the tag name and between the tag name and the leadout string \"-->\".\n * 3. The maximum tag name length is LWIP_HTTPD_MAX_TAG_NAME_LEN, currently 8 characters.\n *\n * Notes on CGI usage\n * ------------------\n *\n * The simple CGI support offered here works with GET method requests only\n * and can handle up to 16 parameters encoded into the URI. The handler\n * function may not write directly to the HTTP output but must return a\n * filename that the HTTP server will send to the browser as a response to\n * the incoming CGI request.\n *\n *\n *\n * The list of supported file types is quite short, so if makefsdata complains\n * about an unknown extension, make sure to add it (and its doctype) to\n * the 'g_psHTTPHeaders' list.\n */\n#include \"lwip/init.h\"\n#include \"lwip/apps/httpd.h\"\n#include \"lwip/debug.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/apps/fs.h\"\n#include \"httpd_structs.h\"\n#include \"lwip/def.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/tcp.h\"\n\n#include <string.h> /* memset */\n#include <stdlib.h> /* atoi */\n#include <stdio.h>\n\n#if LWIP_TCP && LWIP_CALLBACK_API\n\n/** Minimum length for a valid HTTP/0.9 request: \"GET /\\r\\n\" -> 7 bytes */\n#define MIN_REQ_LEN   7\n\n#define CRLF \"\\r\\n\"\n#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE\n#define HTTP11_CONNECTIONKEEPALIVE  \"Connection: keep-alive\"\n#define HTTP11_CONNECTIONKEEPALIVE2 \"Connection: Keep-Alive\"\n#endif\n\n/** These defines check whether tcp_write has to copy data or not */\n\n/** This was TI's check whether to let TCP copy data or not\n * \\#define HTTP_IS_DATA_VOLATILE(hs) ((hs->file < (char *)0x20000000) ? 0 : TCP_WRITE_FLAG_COPY)\n */\n#ifndef HTTP_IS_DATA_VOLATILE\n#if LWIP_HTTPD_SSI\n/* Copy for SSI files, no copy for non-SSI files */\n#define HTTP_IS_DATA_VOLATILE(hs)   ((hs)->ssi ? TCP_WRITE_FLAG_COPY : 0)\n#else /* LWIP_HTTPD_SSI */\n/** Default: don't copy if the data is sent from file-system directly */\n#define HTTP_IS_DATA_VOLATILE(hs) (((hs->file != NULL) && (hs->handle != NULL) && (hs->file == \\\n                                   (const char*)hs->handle->data + hs->handle->len - hs->left)) \\\n                                   ? 0 : TCP_WRITE_FLAG_COPY)\n#endif /* LWIP_HTTPD_SSI */\n#endif\n\n/** Default: headers are sent from ROM */\n#ifndef HTTP_IS_HDR_VOLATILE\n#define HTTP_IS_HDR_VOLATILE(hs, ptr) 0\n#endif\n\n/* Return values for http_send_*() */\n#define HTTP_DATA_TO_SEND_BREAK    2\n#define HTTP_DATA_TO_SEND_CONTINUE 1\n#define HTTP_NO_DATA_TO_SEND       0\n\ntypedef struct\n{\n  const char *name;\n  u8_t shtml;\n} default_filename;\n\nconst default_filename g_psDefaultFilenames[] = {\n  {\"/index.shtml\", 1 },\n  {\"/index.ssi\",   1 },\n  {\"/index.shtm\",  1 },\n  {\"/index.html\",  0 },\n  {\"/index.htm\",   0 }\n};\n\n#define NUM_DEFAULT_FILENAMES (sizeof(g_psDefaultFilenames) /   \\\n                               sizeof(default_filename))\n\n#if LWIP_HTTPD_SUPPORT_REQUESTLIST\n/** HTTP request is copied here from pbufs for simple parsing */\nstatic char httpd_req_buf[LWIP_HTTPD_MAX_REQ_LENGTH+1];\n#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n\n#if LWIP_HTTPD_SUPPORT_POST\n#if LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN > LWIP_HTTPD_MAX_REQUEST_URI_LEN\n#define LWIP_HTTPD_URI_BUF_LEN LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN\n#endif\n#endif\n#ifndef LWIP_HTTPD_URI_BUF_LEN\n#define LWIP_HTTPD_URI_BUF_LEN LWIP_HTTPD_MAX_REQUEST_URI_LEN\n#endif\n#if LWIP_HTTPD_URI_BUF_LEN\n/* Filename for response file to send when POST is finished or\n * search for default files when a directory is requested. */\nstatic char http_uri_buf[LWIP_HTTPD_URI_BUF_LEN+1];\n#endif\n\n#if LWIP_HTTPD_DYNAMIC_HEADERS\n/* The number of individual strings that comprise the headers sent before each\n * requested file.\n */\n#define NUM_FILE_HDR_STRINGS 5\n#define HDR_STRINGS_IDX_HTTP_STATUS          0 /* e.g. \"HTTP/1.0 200 OK\\r\\n\" */\n#define HDR_STRINGS_IDX_SERVER_NAME          1 /* e.g. \"Server: \"HTTPD_SERVER_AGENT\"\\r\\n\" */\n#define HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE 2 /* e.g. \"Content-Length: xy\\r\\n\" and/or \"Connection: keep-alive\\r\\n\" */\n#define HDR_STRINGS_IDX_CONTENT_LEN_NR       3 /* the byte count, when content-length is used */\n#define HDR_STRINGS_IDX_CONTENT_TYPE         4 /* the content type (or default answer content type including default document) */\n\n/* The dynamically generated Content-Length buffer needs space for CRLF + NULL */\n#define LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET 3\n#ifndef LWIP_HTTPD_MAX_CONTENT_LEN_SIZE\n/* The dynamically generated Content-Length buffer shall be able to work with\n   ~953 MB (9 digits) */\n#define LWIP_HTTPD_MAX_CONTENT_LEN_SIZE   (9 + LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET)\n#endif\n#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */\n\n#if LWIP_HTTPD_SSI\n\n#define HTTPD_LAST_TAG_PART 0xFFFF\n\nenum tag_check_state {\n  TAG_NONE,       /* Not processing an SSI tag */\n  TAG_LEADIN,     /* Tag lead in \"<!--#\" being processed */\n  TAG_FOUND,      /* Tag name being read, looking for lead-out start */\n  TAG_LEADOUT,    /* Tag lead out \"-->\" being processed */\n  TAG_SENDING     /* Sending tag replacement string */\n};\n\nstruct http_ssi_state {\n  const char *parsed;     /* Pointer to the first unparsed byte in buf. */\n#if !LWIP_HTTPD_SSI_INCLUDE_TAG\n  const char *tag_started;/* Pointer to the first opening '<' of the tag. */\n#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */\n  const char *tag_end;    /* Pointer to char after the closing '>' of the tag. */\n  u32_t parse_left; /* Number of unparsed bytes in buf. */\n  u16_t tag_index;   /* Counter used by tag parsing state machine */\n  u16_t tag_insert_len; /* Length of insert in string tag_insert */\n#if LWIP_HTTPD_SSI_MULTIPART\n  u16_t tag_part; /* Counter passed to and changed by tag insertion function to insert multiple times */\n#endif /* LWIP_HTTPD_SSI_MULTIPART */\n  u8_t tag_name_len; /* Length of the tag name in string tag_name */\n  char tag_name[LWIP_HTTPD_MAX_TAG_NAME_LEN + 1]; /* Last tag name extracted */\n  char tag_insert[LWIP_HTTPD_MAX_TAG_INSERT_LEN + 1]; /* Insert string for tag_name */\n  enum tag_check_state tag_state; /* State of the tag processor */\n};\n#endif /* LWIP_HTTPD_SSI */\n\nstruct http_state {\n#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED\n  struct http_state *next;\n#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */\n  struct fs_file file_handle;\n  struct fs_file *handle;\n  const char *file;       /* Pointer to first unsent byte in buf. */\n\n  struct tcp_pcb *pcb;\n#if LWIP_HTTPD_SUPPORT_REQUESTLIST\n  struct pbuf *req;\n#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n\n#if LWIP_HTTPD_DYNAMIC_FILE_READ\n  char *buf;        /* File read buffer. */\n  int buf_len;      /* Size of file read buffer, buf. */\n#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */\n  u32_t left;       /* Number of unsent bytes in buf. */\n  u8_t retries;\n#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE\n  u8_t keepalive;\n#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */\n#if LWIP_HTTPD_SSI\n  struct http_ssi_state *ssi;\n#endif /* LWIP_HTTPD_SSI */\n#if LWIP_HTTPD_CGI\n  char *params[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Params extracted from the request URI */\n  char *param_vals[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Values for each extracted param */\n#endif /* LWIP_HTTPD_CGI */\n#if LWIP_HTTPD_DYNAMIC_HEADERS\n  const char *hdrs[NUM_FILE_HDR_STRINGS]; /* HTTP headers to be sent. */\n  char hdr_content_len[LWIP_HTTPD_MAX_CONTENT_LEN_SIZE];\n  u16_t hdr_pos;     /* The position of the first unsent header byte in the\n                        current string */\n  u16_t hdr_index;   /* The index of the hdr string currently being sent. */\n#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */\n#if LWIP_HTTPD_TIMING\n  u32_t time_started;\n#endif /* LWIP_HTTPD_TIMING */\n#if LWIP_HTTPD_SUPPORT_POST\n  u32_t post_content_len_left;\n#if LWIP_HTTPD_POST_MANUAL_WND\n  u32_t unrecved_bytes;\n  u8_t no_auto_wnd;\n  u8_t post_finished;\n#endif /* LWIP_HTTPD_POST_MANUAL_WND */\n#endif /* LWIP_HTTPD_SUPPORT_POST*/\n};\n\n#if HTTPD_USE_MEM_POOL\nLWIP_MEMPOOL_DECLARE(HTTPD_STATE,     MEMP_NUM_PARALLEL_HTTPD_CONNS,     sizeof(struct http_state),     \"HTTPD_STATE\")\n#if LWIP_HTTPD_SSI\nLWIP_MEMPOOL_DECLARE(HTTPD_SSI_STATE, MEMP_NUM_PARALLEL_HTTPD_SSI_CONNS, sizeof(struct http_ssi_state), \"HTTPD_SSI_STATE\")\n#define HTTP_FREE_SSI_STATE(x)  LWIP_MEMPOOL_FREE(HTTPD_SSI_STATE, (x))\n#define HTTP_ALLOC_SSI_STATE()  (struct http_ssi_state *)LWIP_MEMPOOL_ALLOC(HTTPD_SSI_STATE)\n#endif /* LWIP_HTTPD_SSI */\n#define HTTP_ALLOC_HTTP_STATE() (struct http_state *)LWIP_MEMPOOL_ALLOC(HTTPD_STATE)\n#define HTTP_FREE_HTTP_STATE(x) LWIP_MEMPOOL_FREE(HTTPD_STATE, (x))\n#else /* HTTPD_USE_MEM_POOL */\n#define HTTP_ALLOC_HTTP_STATE() (struct http_state *)mem_malloc(sizeof(struct http_state))\n#define HTTP_FREE_HTTP_STATE(x) mem_free(x)\n#if LWIP_HTTPD_SSI\n#define HTTP_ALLOC_SSI_STATE()  (struct http_ssi_state *)mem_malloc(sizeof(struct http_ssi_state))\n#define HTTP_FREE_SSI_STATE(x)  mem_free(x)\n#endif /* LWIP_HTTPD_SSI */\n#endif /* HTTPD_USE_MEM_POOL */\n\nstatic err_t http_close_conn(struct tcp_pcb *pcb, struct http_state *hs);\nstatic err_t http_close_or_abort_conn(struct tcp_pcb *pcb, struct http_state *hs, u8_t abort_conn);\nstatic err_t http_find_file(struct http_state *hs, const char *uri, int is_09);\nstatic err_t http_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri, u8_t tag_check, char* params);\nstatic err_t http_poll(void *arg, struct tcp_pcb *pcb);\nstatic u8_t http_check_eof(struct tcp_pcb *pcb, struct http_state *hs);\n#if LWIP_HTTPD_FS_ASYNC_READ\nstatic void http_continue(void *connection);\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n\n#if LWIP_HTTPD_SSI\n/* SSI insert handler function pointer. */\ntSSIHandler g_pfnSSIHandler;\n#if !LWIP_HTTPD_SSI_RAW\nint g_iNumTags;\nconst char **g_ppcTags;\n#endif /* !LWIP_HTTPD_SSI_RAW */\n\n#define LEN_TAG_LEAD_IN 5\nconst char * const g_pcTagLeadIn = \"<!--#\";\n\n#define LEN_TAG_LEAD_OUT 3\nconst char * const g_pcTagLeadOut = \"-->\";\n#endif /* LWIP_HTTPD_SSI */\n\n#if LWIP_HTTPD_CGI\n/* CGI handler information */\nconst tCGI *g_pCGIs;\nint g_iNumCGIs;\nint http_cgi_paramcount;\n#define http_cgi_params     hs->params\n#define http_cgi_param_vals hs->param_vals\n#elif LWIP_HTTPD_CGI_SSI\nchar *http_cgi_params[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Params extracted from the request URI */\nchar *http_cgi_param_vals[LWIP_HTTPD_MAX_CGI_PARAMETERS]; /* Values for each extracted param */\n#endif /* LWIP_HTTPD_CGI */\n\n#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED\n/** global list of active HTTP connections, use to kill the oldest when\n    running out of memory */\nstatic struct http_state *http_connections;\n\nstatic void\nhttp_add_connection(struct http_state *hs)\n{\n  /* add the connection to the list */\n  hs->next = http_connections;\n  http_connections = hs;\n}\n\nstatic void\nhttp_remove_connection(struct http_state *hs)\n{\n  /* take the connection off the list */\n  if (http_connections) {\n    if (http_connections == hs) {\n      http_connections = hs->next;\n    } else {\n      struct http_state *last;\n      for(last = http_connections; last->next != NULL; last = last->next) {\n        if (last->next == hs) {\n          last->next = hs->next;\n          break;\n        }\n      }\n    }\n  }\n}\n\nstatic void\nhttp_kill_oldest_connection(u8_t ssi_required)\n{\n  struct http_state *hs = http_connections;\n  struct http_state *hs_free_next = NULL;\n  while(hs && hs->next) {\n#if LWIP_HTTPD_SSI\n    if (ssi_required) {\n      if (hs->next->ssi != NULL) {\n        hs_free_next = hs;\n      }\n    } else\n#else /* LWIP_HTTPD_SSI */\n    LWIP_UNUSED_ARG(ssi_required);\n#endif /* LWIP_HTTPD_SSI */\n    {\n      hs_free_next = hs;\n    }\n    LWIP_ASSERT(\"broken list\", hs != hs->next);\n    hs = hs->next;\n  }\n  if (hs_free_next != NULL) {\n    LWIP_ASSERT(\"hs_free_next->next != NULL\", hs_free_next->next != NULL);\n    LWIP_ASSERT(\"hs_free_next->next->pcb != NULL\", hs_free_next->next->pcb != NULL);\n    /* send RST when killing a connection because of memory shortage */\n    http_close_or_abort_conn(hs_free_next->next->pcb, hs_free_next->next, 1); /* this also unlinks the http_state from the list */\n  }\n}\n#else /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */\n\n#define http_add_connection(hs)\n#define http_remove_connection(hs)\n\n#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */\n\n#if LWIP_HTTPD_SSI\n/** Allocate as struct http_ssi_state. */\nstatic struct http_ssi_state*\nhttp_ssi_state_alloc(void)\n{\n  struct http_ssi_state *ret = HTTP_ALLOC_SSI_STATE();\n#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED\n  if (ret == NULL) {\n    http_kill_oldest_connection(1);\n    ret = HTTP_ALLOC_SSI_STATE();\n  }\n#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */\n  if (ret != NULL) {\n    memset(ret, 0, sizeof(struct http_ssi_state));\n  }\n  return ret;\n}\n\n/** Free a struct http_ssi_state. */\nstatic void\nhttp_ssi_state_free(struct http_ssi_state *ssi)\n{\n  if (ssi != NULL) {\n    HTTP_FREE_SSI_STATE(ssi);\n  }\n}\n#endif /* LWIP_HTTPD_SSI */\n\n/** Initialize a struct http_state.\n */\nstatic void\nhttp_state_init(struct http_state* hs)\n{\n  /* Initialize the structure. */\n  memset(hs, 0, sizeof(struct http_state));\n#if LWIP_HTTPD_DYNAMIC_HEADERS\n  /* Indicate that the headers are not yet valid */\n  hs->hdr_index = NUM_FILE_HDR_STRINGS;\n#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */\n}\n\n/** Allocate a struct http_state. */\nstatic struct http_state*\nhttp_state_alloc(void)\n{\n  struct http_state *ret = HTTP_ALLOC_HTTP_STATE();\n#if LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED\n  if (ret == NULL) {\n    http_kill_oldest_connection(0);\n    ret = HTTP_ALLOC_HTTP_STATE();\n  }\n#endif /* LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED */\n  if (ret != NULL) {\n    http_state_init(ret);\n    http_add_connection(ret);\n  }\n  return ret;\n}\n\n/** Free a struct http_state.\n * Also frees the file data if dynamic.\n */\nstatic void\nhttp_state_eof(struct http_state *hs)\n{\n  if(hs->handle) {\n#if LWIP_HTTPD_TIMING\n    u32_t ms_needed = sys_now() - hs->time_started;\n    u32_t needed = LWIP_MAX(1, (ms_needed/100));\n    LWIP_DEBUGF(HTTPD_DEBUG_TIMING, (\"httpd: needed %\"U32_F\" ms to send file of %d bytes -> %\"U32_F\" bytes/sec\\n\",\n      ms_needed, hs->handle->len, ((((u32_t)hs->handle->len) * 10) / needed)));\n#endif /* LWIP_HTTPD_TIMING */\n    fs_close(hs->handle);\n    hs->handle = NULL;\n  }\n#if LWIP_HTTPD_DYNAMIC_FILE_READ\n  if (hs->buf != NULL) {\n    mem_free(hs->buf);\n    hs->buf = NULL;\n  }\n#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */\n#if LWIP_HTTPD_SSI\n  if (hs->ssi) {\n    http_ssi_state_free(hs->ssi);\n    hs->ssi = NULL;\n  }\n#endif /* LWIP_HTTPD_SSI */\n#if LWIP_HTTPD_SUPPORT_REQUESTLIST\n  if (hs->req) {\n    pbuf_free(hs->req);\n    hs->req = NULL;\n  }\n#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n}\n\n/** Free a struct http_state.\n * Also frees the file data if dynamic.\n */\nstatic void\nhttp_state_free(struct http_state *hs)\n{\n  if (hs != NULL) {\n    http_state_eof(hs);\n    http_remove_connection(hs);\n    HTTP_FREE_HTTP_STATE(hs);\n  }\n}\n\n/** Call tcp_write() in a loop trying smaller and smaller length\n *\n * @param pcb tcp_pcb to send\n * @param ptr Data to send\n * @param length Length of data to send (in/out: on return, contains the\n *        amount of data sent)\n * @param apiflags directly passed to tcp_write\n * @return the return value of tcp_write\n */\nstatic err_t\nhttp_write(struct tcp_pcb *pcb, const void* ptr, u16_t *length, u8_t apiflags)\n{\n  u16_t len, max_len;\n  err_t err;\n  LWIP_ASSERT(\"length != NULL\", length != NULL);\n  len = *length;\n  if (len == 0) {\n    return ERR_OK;\n  }\n  /* We cannot send more data than space available in the send buffer. */\n  max_len = tcp_sndbuf(pcb);\n  if (max_len < len) {\n    len = max_len;\n  }\n#ifdef HTTPD_MAX_WRITE_LEN\n  /* Additional limitation: e.g. don't enqueue more than 2*mss at once */\n  max_len = HTTPD_MAX_WRITE_LEN(pcb);\n  if(len > max_len) {\n    len = max_len;\n  }\n#endif /* HTTPD_MAX_WRITE_LEN */\n  do {\n    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"Trying go send %d bytes\\n\", len));\n    err = tcp_write(pcb, ptr, len, apiflags);\n    if (err == ERR_MEM) {\n      if ((tcp_sndbuf(pcb) == 0) ||\n        (tcp_sndqueuelen(pcb) >= TCP_SND_QUEUELEN)) {\n          /* no need to try smaller sizes */\n          len = 1;\n      } else {\n        len /= 2;\n      }\n      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, \n        (\"Send failed, trying less (%d bytes)\\n\", len));\n    }\n  } while ((err == ERR_MEM) && (len > 1));\n\n  if (err == ERR_OK) {\n    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"Sent %d bytes\\n\", len));\n    *length = len;\n  } else {\n    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"Send failed with err %d (\\\"%s\\\")\\n\", err, lwip_strerr(err)));\n    *length = 0;\n  }\n\n#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE\n   /* ensure nagle is normally enabled (only disabled for persistent connections\n      when all data has been enqueued but the connection stays open for the next\n      request */\n   tcp_nagle_enable(pcb);\n#endif\n\n  return err;\n}\n\n/**\n * The connection shall be actively closed (using RST to close from fault states).\n * Reset the sent- and recv-callbacks.\n *\n * @param pcb the tcp pcb to reset callbacks\n * @param hs connection state to free\n */\nstatic err_t\nhttp_close_or_abort_conn(struct tcp_pcb *pcb, struct http_state *hs, u8_t abort_conn)\n{\n  err_t err;\n  LWIP_DEBUGF(HTTPD_DEBUG, (\"Closing connection %p\\n\", (void*)pcb));\n\n#if LWIP_HTTPD_SUPPORT_POST\n  if (hs != NULL) {\n    if ((hs->post_content_len_left != 0)\n#if LWIP_HTTPD_POST_MANUAL_WND\n       || ((hs->no_auto_wnd != 0) && (hs->unrecved_bytes != 0))\n#endif /* LWIP_HTTPD_POST_MANUAL_WND */\n       ) {\n      /* make sure the post code knows that the connection is closed */\n      http_uri_buf[0] = 0;\n      httpd_post_finished(hs, http_uri_buf, LWIP_HTTPD_URI_BUF_LEN);\n    }\n  }\n#endif /* LWIP_HTTPD_SUPPORT_POST*/\n\n\n  tcp_arg(pcb, NULL);\n  tcp_recv(pcb, NULL);\n  tcp_err(pcb, NULL);\n  tcp_poll(pcb, NULL, 0);\n  tcp_sent(pcb, NULL);\n  if (hs != NULL) {\n    http_state_free(hs);\n  }\n\n  if (abort_conn) {\n    tcp_abort(pcb);\n    return ERR_OK;\n  }\n  err = tcp_close(pcb);\n  if (err != ERR_OK) {\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"Error %d closing %p\\n\", err, (void*)pcb));\n    /* error closing, try again later in poll */\n    tcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL);\n  }\n  return err;\n}\n\n/**\n * The connection shall be actively closed.\n * Reset the sent- and recv-callbacks.\n *\n * @param pcb the tcp pcb to reset callbacks\n * @param hs connection state to free\n */\nstatic err_t\nhttp_close_conn(struct tcp_pcb *pcb, struct http_state *hs)\n{\n   return http_close_or_abort_conn(pcb, hs, 0);\n}\n\n/** End of file: either close the connection (Connection: close) or\n * close the file (Connection: keep-alive)\n */\nstatic void\nhttp_eof(struct tcp_pcb *pcb, struct http_state *hs)\n{\n  /* HTTP/1.1 persistent connection? (Not supported for SSI) */\n#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE\n  if (hs->keepalive) {\n    http_remove_connection(hs);\n\n    http_state_eof(hs);\n    http_state_init(hs);\n    /* restore state: */\n    hs->pcb = pcb;\n    hs->keepalive = 1;\n    http_add_connection(hs);\n    /* ensure nagle doesn't interfere with sending all data as fast as possible: */\n    tcp_nagle_disable(pcb);\n  } else\n#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */\n  {\n    http_close_conn(pcb, hs);\n  }\n}\n\n#if LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI\n/**\n * Extract URI parameters from the parameter-part of an URI in the form\n * \"test.cgi?x=y\" @todo: better explanation!\n * Pointers to the parameters are stored in hs->param_vals.\n *\n * @param hs http connection state\n * @param params pointer to the NULL-terminated parameter string from the URI\n * @return number of parameters extracted\n */\nstatic int\nextract_uri_parameters(struct http_state *hs, char *params)\n{\n  char *pair;\n  char *equals;\n  int loop;\n\n  LWIP_UNUSED_ARG(hs);\n\n  /* If we have no parameters at all, return immediately. */\n  if(!params || (params[0] == '\\0')) {\n      return(0);\n  }\n\n  /* Get a pointer to our first parameter */\n  pair = params;\n\n  /* Parse up to LWIP_HTTPD_MAX_CGI_PARAMETERS from the passed string and ignore the\n   * remainder (if any) */\n  for(loop = 0; (loop < LWIP_HTTPD_MAX_CGI_PARAMETERS) && pair; loop++) {\n\n    /* Save the name of the parameter */\n    http_cgi_params[loop] = pair;\n\n    /* Remember the start of this name=value pair */\n    equals = pair;\n\n    /* Find the start of the next name=value pair and replace the delimiter\n     * with a 0 to terminate the previous pair string. */\n    pair = strchr(pair, '&');\n    if(pair) {\n      *pair = '\\0';\n      pair++;\n    } else {\n       /* We didn't find a new parameter so find the end of the URI and\n        * replace the space with a '\\0' */\n        pair = strchr(equals, ' ');\n        if(pair) {\n            *pair = '\\0';\n        }\n\n        /* Revert to NULL so that we exit the loop as expected. */\n        pair = NULL;\n    }\n\n    /* Now find the '=' in the previous pair, replace it with '\\0' and save\n     * the parameter value string. */\n    equals = strchr(equals, '=');\n    if(equals) {\n      *equals = '\\0';\n      http_cgi_param_vals[loop] = equals + 1;\n    } else {\n      http_cgi_param_vals[loop] = NULL;\n    }\n  }\n\n  return loop;\n}\n#endif /* LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI */\n\n#if LWIP_HTTPD_SSI\n/**\n * Insert a tag (found in an shtml in the form of \"<!--#tagname-->\" into the file.\n * The tag's name is stored in ssi->tag_name (NULL-terminated), the replacement\n * should be written to hs->tag_insert (up to a length of LWIP_HTTPD_MAX_TAG_INSERT_LEN).\n * The amount of data written is stored to ssi->tag_insert_len.\n *\n * @todo: return tag_insert_len - maybe it can be removed from struct http_state?\n *\n * @param hs http connection state\n */\nstatic void\nget_tag_insert(struct http_state *hs)\n{\n#if LWIP_HTTPD_SSI_RAW\n  const char* tag;\n#else /* LWIP_HTTPD_SSI_RAW */\n  int tag;\n#endif /* LWIP_HTTPD_SSI_RAW */\n  size_t len;\n  struct http_ssi_state *ssi;\n#if LWIP_HTTPD_SSI_MULTIPART\n  u16_t current_tag_part;\n#endif /* LWIP_HTTPD_SSI_MULTIPART */\n\n  LWIP_ASSERT(\"hs != NULL\", hs != NULL);\n  ssi = hs->ssi;\n  LWIP_ASSERT(\"ssi != NULL\", ssi != NULL);\n#if LWIP_HTTPD_SSI_MULTIPART\n  current_tag_part = ssi->tag_part;\n  ssi->tag_part = HTTPD_LAST_TAG_PART;\n#endif /* LWIP_HTTPD_SSI_MULTIPART */\n#if LWIP_HTTPD_SSI_RAW\n  tag = ssi->tag_name;\n#endif\n\n  if(g_pfnSSIHandler\n#if !LWIP_HTTPD_SSI_RAW\n     && g_ppcTags && g_iNumTags\n#endif /* !LWIP_HTTPD_SSI_RAW */\n     ) {\n\n    /* Find this tag in the list we have been provided. */\n#if LWIP_HTTPD_SSI_RAW\n    {\n#else /* LWIP_HTTPD_SSI_RAW */\n    for(tag = 0; tag < g_iNumTags; tag++) {\n      if(strcmp(ssi->tag_name, g_ppcTags[tag]) == 0)\n#endif /* LWIP_HTTPD_SSI_RAW */\n      {\n        ssi->tag_insert_len = g_pfnSSIHandler(tag, ssi->tag_insert,\n           LWIP_HTTPD_MAX_TAG_INSERT_LEN\n#if LWIP_HTTPD_SSI_MULTIPART\n           , current_tag_part, &ssi->tag_part\n#endif /* LWIP_HTTPD_SSI_MULTIPART */\n#if LWIP_HTTPD_FILE_STATE\n           , (hs->handle ? hs->handle->state : NULL)\n#endif /* LWIP_HTTPD_FILE_STATE */\n           );\n#if LWIP_HTTPD_SSI_RAW\n        if (ssi->tag_insert_len != HTTPD_SSI_TAG_UNKNOWN)\n#endif /* LWIP_HTTPD_SSI_RAW */\n        {\n          return;\n        }\n      }\n    }\n  }\n\n  /* If we drop out, we were asked to serve a page which contains tags that\n   * we don't have a handler for. Merely echo back the tags with an error\n   * marker. */\n#define UNKNOWN_TAG1_TEXT \"<b>***UNKNOWN TAG \"\n#define UNKNOWN_TAG1_LEN  18\n#define UNKNOWN_TAG2_TEXT \"***</b>\"\n#define UNKNOWN_TAG2_LEN  7\n  len = LWIP_MIN(sizeof(ssi->tag_name), LWIP_MIN(strlen(ssi->tag_name),\n    LWIP_HTTPD_MAX_TAG_INSERT_LEN - (UNKNOWN_TAG1_LEN + UNKNOWN_TAG2_LEN)));\n  MEMCPY(ssi->tag_insert, UNKNOWN_TAG1_TEXT, UNKNOWN_TAG1_LEN);\n  MEMCPY(&ssi->tag_insert[UNKNOWN_TAG1_LEN], ssi->tag_name, len);\n  MEMCPY(&ssi->tag_insert[UNKNOWN_TAG1_LEN + len], UNKNOWN_TAG2_TEXT, UNKNOWN_TAG2_LEN);\n  ssi->tag_insert[UNKNOWN_TAG1_LEN + len + UNKNOWN_TAG2_LEN] = 0;\n\n  len = strlen(ssi->tag_insert);\n  LWIP_ASSERT(\"len <= 0xffff\", len <= 0xffff);\n  ssi->tag_insert_len = (u16_t)len;\n}\n#endif /* LWIP_HTTPD_SSI */\n\n#if LWIP_HTTPD_DYNAMIC_HEADERS\n/**\n * Generate the relevant HTTP headers for the given filename and write\n * them into the supplied buffer.\n */\nstatic void\nget_http_headers(struct http_state *hs, const char *uri)\n{\n  size_t content_type;\n  char *tmp;\n  char *ext;\n  char *vars;\n  u8_t add_content_len;\n\n  /* In all cases, the second header we send is the server identification\n     so set it here. */\n  hs->hdrs[HDR_STRINGS_IDX_SERVER_NAME] = g_psHTTPHeaderStrings[HTTP_HDR_SERVER];\n  hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = NULL;\n  hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_NR] = NULL;\n\n  /* Is this a normal file or the special case we use to send back the\n     default \"404: Page not found\" response? */\n  if (uri == NULL) {\n    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_FOUND];\n#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE\n    if (hs->keepalive) {\n      hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = g_psHTTPHeaderStrings[DEFAULT_404_HTML_PERSISTENT];\n    } else\n#endif\n    {\n      hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = g_psHTTPHeaderStrings[DEFAULT_404_HTML];\n    }\n\n    /* Set up to send the first header string. */\n    hs->hdr_index = 0;\n    hs->hdr_pos = 0;\n    return;\n  }\n  /* We are dealing with a particular filename. Look for one other\n      special case.  We assume that any filename with \"404\" in it must be\n      indicative of a 404 server error whereas all other files require\n      the 200 OK header. */\n  if (strstr(uri, \"404\")) {\n    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_FOUND];\n  } else if (strstr(uri, \"400\")) {\n    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_BAD_REQUEST];\n  } else if (strstr(uri, \"501\")) {\n    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_NOT_IMPL];\n  } else {\n    hs->hdrs[HDR_STRINGS_IDX_HTTP_STATUS] = g_psHTTPHeaderStrings[HTTP_HDR_OK];\n  }\n\n  /* Determine if the URI has any variables and, if so, temporarily remove \n      them. */\n  vars = strchr(uri, '?');\n  if(vars) {\n    *vars = '\\0';\n  }\n\n  /* Get a pointer to the file extension.  We find this by looking for the\n      last occurrence of \".\" in the filename passed. */\n  ext = NULL;\n  tmp = strchr(uri, '.');\n  while (tmp) {\n    ext = tmp + 1;\n    tmp = strchr(ext, '.');\n  }\n  if (ext != NULL) {\n    /* Now determine the content type and add the relevant header for that. */\n    for (content_type = 0; content_type < NUM_HTTP_HEADERS; content_type++) {\n      /* Have we found a matching extension? */\n      if(!lwip_stricmp(g_psHTTPHeaders[content_type].extension, ext)) {\n        break;\n      }\n    }\n  } else {\n    content_type = NUM_HTTP_HEADERS;\n  }\n\n  /* Reinstate the parameter marker if there was one in the original URI. */\n  if (vars) {\n    *vars = '?';\n  }\n\n#if LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI\n  /* Does the URL passed have any file extension?  If not, we assume it\n     is a special-case URL used for control state notification and we do\n     not send any HTTP headers with the response. */\n  if (!ext) {\n    /* Force the header index to a value indicating that all headers\n       have already been sent. */\n    hs->hdr_index = NUM_FILE_HDR_STRINGS;\n    return;\n  }\n#endif /* LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI */\n  add_content_len = 1;\n  /* Did we find a matching extension? */\n  if(content_type < NUM_HTTP_HEADERS) {\n    /* yes, store it */\n    hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = g_psHTTPHeaders[content_type].content_type;\n  } else if (!ext) {\n    /* no, no extension found -> use binary transfer to prevent the browser adding '.txt' on save */\n    hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = HTTP_HDR_APP;\n  } else {\n    /* No - use the default, plain text file type. */\n    hs->hdrs[HDR_STRINGS_IDX_CONTENT_TYPE] = HTTP_HDR_DEFAULT_TYPE;\n  }\n  /* Add content-length header? */\n#if LWIP_HTTPD_SSI\n  if (hs->ssi != NULL) {\n    add_content_len = 0; /* @todo: get maximum file length from SSI */\n  } else\n#endif /* LWIP_HTTPD_SSI */\n  if ((hs->handle == NULL) ||\n      ((hs->handle->flags & (FS_FILE_FLAGS_HEADER_INCLUDED|FS_FILE_FLAGS_HEADER_PERSISTENT)) == FS_FILE_FLAGS_HEADER_INCLUDED)) {\n    add_content_len = 0;\n  }\n  if (add_content_len) {\n    size_t len;\n    lwip_itoa(hs->hdr_content_len, (size_t)LWIP_HTTPD_MAX_CONTENT_LEN_SIZE,\n      hs->handle->len);\n    len = strlen(hs->hdr_content_len);\n    if (len <= LWIP_HTTPD_MAX_CONTENT_LEN_SIZE - LWIP_HTTPD_MAX_CONTENT_LEN_OFFSET) {\n      SMEMCPY(&hs->hdr_content_len[len], CRLF \"\\0\", 3);\n      hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_NR] = hs->hdr_content_len;\n    } else {\n      add_content_len = 0;\n    }\n  }\n#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE\n  if (add_content_len) {\n    hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_KEEPALIVE_LEN];\n  } else {\n    hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE];\n  }\n#else /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */\n  if (add_content_len) {\n    hs->hdrs[HDR_STRINGS_IDX_CONTENT_LEN_KEPALIVE] = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH];\n  }\n#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */\n\n  /* Set up to send the first header string. */\n  hs->hdr_index = 0;\n  hs->hdr_pos = 0;\n}\n\n/** Sub-function of http_send(): send dynamic headers\n *\n * @returns: - HTTP_NO_DATA_TO_SEND: no new data has been enqueued\n *           - HTTP_DATA_TO_SEND_CONTINUE: continue with sending HTTP body\n *           - HTTP_DATA_TO_SEND_BREAK: data has been enqueued, headers pending,\n *                                      so don't send HTTP body yet\n */\nstatic u8_t\nhttp_send_headers(struct tcp_pcb *pcb, struct http_state *hs)\n{\n  err_t err;\n  u16_t len;\n  u8_t data_to_send = HTTP_NO_DATA_TO_SEND;\n  u16_t hdrlen, sendlen;\n\n  /* How much data can we send? */\n  len = tcp_sndbuf(pcb);\n  sendlen = len;\n\n  while(len && (hs->hdr_index < NUM_FILE_HDR_STRINGS) && sendlen) {\n    const void *ptr;\n    u16_t old_sendlen;\n    u8_t apiflags;\n    /* How much do we have to send from the current header? */\n    hdrlen = (u16_t)strlen(hs->hdrs[hs->hdr_index]);\n\n    /* How much of this can we send? */\n    sendlen = (len < (hdrlen - hs->hdr_pos)) ? len : (hdrlen - hs->hdr_pos);\n\n    /* Send this amount of data or as much as we can given memory\n     * constraints. */\n    ptr = (const void *)(hs->hdrs[hs->hdr_index] + hs->hdr_pos);\n    old_sendlen = sendlen;\n    apiflags = HTTP_IS_HDR_VOLATILE(hs, ptr);\n    if (hs->hdr_index == HDR_STRINGS_IDX_CONTENT_LEN_NR) {\n      /* content-length is always volatile */\n      apiflags |= TCP_WRITE_FLAG_COPY;\n    }\n    if (hs->hdr_index < NUM_FILE_HDR_STRINGS - 1) {\n      apiflags |= TCP_WRITE_FLAG_MORE;\n    }\n    err = http_write(pcb, ptr, &sendlen, apiflags);\n    if ((err == ERR_OK) && (old_sendlen != sendlen)) {\n      /* Remember that we added some more data to be transmitted. */\n      data_to_send = HTTP_DATA_TO_SEND_CONTINUE;\n    } else if (err != ERR_OK) {\n       /* special case: http_write does not try to send 1 byte */\n      sendlen = 0;\n    }\n\n    /* Fix up the header position for the next time round. */\n    hs->hdr_pos += sendlen;\n    len -= sendlen;\n\n    /* Have we finished sending this string? */\n    if(hs->hdr_pos == hdrlen) {\n      /* Yes - move on to the next one */\n      hs->hdr_index++;\n      /* skip headers that are NULL (not all headers are required) */\n      while ((hs->hdr_index < NUM_FILE_HDR_STRINGS) &&\n         (hs->hdrs[hs->hdr_index] == NULL)) {\n        hs->hdr_index++;\n      }\n      hs->hdr_pos = 0;\n    }\n  }\n\n  if ((hs->hdr_index >= NUM_FILE_HDR_STRINGS) && (hs->file == NULL)) {\n    /* When we are at the end of the headers, check for data to send\n     * instead of waiting for ACK from remote side to continue\n     * (which would happen when sending files from async read). */\n    if(http_check_eof(pcb, hs)) {\n      data_to_send = HTTP_DATA_TO_SEND_CONTINUE;\n    }\n  }\n  /* If we get here and there are still header bytes to send, we send\n   * the header information we just wrote immediately. If there are no\n   * more headers to send, but we do have file data to send, drop through\n   * to try to send some file data too. */\n  if((hs->hdr_index < NUM_FILE_HDR_STRINGS) || !hs->file) {\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"tcp_output\\n\"));\n    return HTTP_DATA_TO_SEND_BREAK;\n  }\n  return data_to_send;\n}\n#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */\n\n/** Sub-function of http_send(): end-of-file (or block) is reached,\n * either close the file or read the next block (if supported).\n *\n * @returns: 0 if the file is finished or no data has been read\n *           1 if the file is not finished and data has been read\n */\nstatic u8_t\nhttp_check_eof(struct tcp_pcb *pcb, struct http_state *hs)\n{\n  int bytes_left;\n#if LWIP_HTTPD_DYNAMIC_FILE_READ\n  int count;\n#ifdef HTTPD_MAX_WRITE_LEN\n  int max_write_len;\n#endif /* HTTPD_MAX_WRITE_LEN */\n#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */\n\n  /* Do we have a valid file handle? */\n  if (hs->handle == NULL) {\n    /* No - close the connection. */\n    http_eof(pcb, hs);\n    return 0;\n  }\n  bytes_left = fs_bytes_left(hs->handle);\n  if (bytes_left <= 0) {\n    /* We reached the end of the file so this request is done. */\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"End of file.\\n\"));\n    http_eof(pcb, hs);\n    return 0;\n  }\n#if LWIP_HTTPD_DYNAMIC_FILE_READ\n  /* Do we already have a send buffer allocated? */\n  if(hs->buf) {\n    /* Yes - get the length of the buffer */\n    count = LWIP_MIN(hs->buf_len, bytes_left);\n  } else {\n    /* We don't have a send buffer so allocate one now */\n    count = tcp_sndbuf(pcb);\n    if(bytes_left < count) {\n      count = bytes_left;\n    }\n#ifdef HTTPD_MAX_WRITE_LEN\n    /* Additional limitation: e.g. don't enqueue more than 2*mss at once */\n    max_write_len = HTTPD_MAX_WRITE_LEN(pcb);\n    if (count > max_write_len) {\n      count = max_write_len;\n    }\n#endif /* HTTPD_MAX_WRITE_LEN */\n    do {\n      hs->buf = (char*)mem_malloc((mem_size_t)count);\n      if (hs->buf != NULL) {\n        hs->buf_len = count;\n        break;\n      }\n      count = count / 2;\n    } while (count > 100);\n\n    /* Did we get a send buffer? If not, return immediately. */\n    if (hs->buf == NULL) {\n      LWIP_DEBUGF(HTTPD_DEBUG, (\"No buff\\n\"));\n      return 0;\n    }\n  }\n\n  /* Read a block of data from the file. */\n  LWIP_DEBUGF(HTTPD_DEBUG, (\"Trying to read %d bytes.\\n\", count));\n\n#if LWIP_HTTPD_FS_ASYNC_READ\n  count = fs_read_async(hs->handle, hs->buf, count, http_continue, hs);\n#else /* LWIP_HTTPD_FS_ASYNC_READ */\n  count = fs_read(hs->handle, hs->buf, count);\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n  if (count < 0) {\n    if (count == FS_READ_DELAYED) {\n      /* Delayed read, wait for FS to unblock us */\n      return 0;\n    }\n    /* We reached the end of the file so this request is done.\n     * @todo: close here for HTTP/1.1 when reading file fails */\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"End of file.\\n\"));\n    http_eof(pcb, hs);\n    return 0;\n  }\n\n  /* Set up to send the block of data we just read */\n  LWIP_DEBUGF(HTTPD_DEBUG, (\"Read %d bytes.\\n\", count));\n  hs->left = count;\n  hs->file = hs->buf;\n#if LWIP_HTTPD_SSI\n  if (hs->ssi) {\n    hs->ssi->parse_left = count;\n    hs->ssi->parsed = hs->buf;\n  }\n#endif /* LWIP_HTTPD_SSI */\n#else /* LWIP_HTTPD_DYNAMIC_FILE_READ */\n  LWIP_ASSERT(\"SSI and DYNAMIC_HEADERS turned off but eof not reached\", 0);\n#endif /* LWIP_HTTPD_SSI || LWIP_HTTPD_DYNAMIC_HEADERS */\n  return 1;\n}\n\n/** Sub-function of http_send(): This is the normal send-routine for non-ssi files\n *\n * @returns: - 1: data has been written (so call tcp_ouput)\n *           - 0: no data has been written (no need to call tcp_output)\n */\nstatic u8_t\nhttp_send_data_nonssi(struct tcp_pcb *pcb, struct http_state *hs)\n{\n  err_t err;\n  u16_t len;\n  u8_t data_to_send = 0;\n\n  /* We are not processing an SHTML file so no tag checking is necessary.\n   * Just send the data as we received it from the file. */\n  len = (u16_t)LWIP_MIN(hs->left, 0xffff);\n\n  err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));\n  if (err == ERR_OK) {\n    data_to_send = 1;\n    hs->file += len;\n    hs->left -= len;\n  }\n\n  return data_to_send;\n}\n\n#if LWIP_HTTPD_SSI\n/** Sub-function of http_send(): This is the send-routine for ssi files\n *\n * @returns: - 1: data has been written (so call tcp_ouput)\n *           - 0: no data has been written (no need to call tcp_output)\n */\nstatic u8_t\nhttp_send_data_ssi(struct tcp_pcb *pcb, struct http_state *hs)\n{\n  err_t err = ERR_OK;\n  u16_t len;\n  u8_t data_to_send = 0;\n\n  struct http_ssi_state *ssi = hs->ssi;\n  LWIP_ASSERT(\"ssi != NULL\", ssi != NULL);\n  /* We are processing an SHTML file so need to scan for tags and replace\n   * them with insert strings. We need to be careful here since a tag may\n   * straddle the boundary of two blocks read from the file and we may also\n   * have to split the insert string between two tcp_write operations. */\n\n  /* How much data could we send? */\n  len = tcp_sndbuf(pcb);\n\n  /* Do we have remaining data to send before parsing more? */\n  if(ssi->parsed > hs->file) {\n    len = (u16_t)LWIP_MIN(ssi->parsed - hs->file, 0xffff);\n\n    err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));\n    if (err == ERR_OK) {\n      data_to_send = 1;\n      hs->file += len;\n      hs->left -= len;\n    }\n\n    /* If the send buffer is full, return now. */\n    if(tcp_sndbuf(pcb) == 0) {\n      return data_to_send;\n    }\n  }\n\n  LWIP_DEBUGF(HTTPD_DEBUG, (\"State %d, %d left\\n\", ssi->tag_state, (int)ssi->parse_left));\n\n  /* We have sent all the data that was already parsed so continue parsing\n   * the buffer contents looking for SSI tags. */\n  while((ssi->parse_left) && (err == ERR_OK)) {\n    if (len == 0) {\n      return data_to_send;\n    }\n    switch(ssi->tag_state) {\n      case TAG_NONE:\n        /* We are not currently processing an SSI tag so scan for the\n         * start of the lead-in marker. */\n        if(*ssi->parsed == g_pcTagLeadIn[0]) {\n          /* We found what could be the lead-in for a new tag so change\n           * state appropriately. */\n          ssi->tag_state = TAG_LEADIN;\n          ssi->tag_index = 1;\n#if !LWIP_HTTPD_SSI_INCLUDE_TAG\n          ssi->tag_started = ssi->parsed;\n#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG */\n        }\n\n        /* Move on to the next character in the buffer */\n        ssi->parse_left--;\n        ssi->parsed++;\n        break;\n\n      case TAG_LEADIN:\n        /* We are processing the lead-in marker, looking for the start of\n         * the tag name. */\n\n        /* Have we reached the end of the leadin? */\n        if(ssi->tag_index == LEN_TAG_LEAD_IN) {\n          ssi->tag_index = 0;\n          ssi->tag_state = TAG_FOUND;\n        } else {\n          /* Have we found the next character we expect for the tag leadin? */\n          if(*ssi->parsed == g_pcTagLeadIn[ssi->tag_index]) {\n            /* Yes - move to the next one unless we have found the complete\n             * leadin, in which case we start looking for the tag itself */\n            ssi->tag_index++;\n          } else {\n            /* We found an unexpected character so this is not a tag. Move\n             * back to idle state. */\n            ssi->tag_state = TAG_NONE;\n          }\n\n          /* Move on to the next character in the buffer */\n          ssi->parse_left--;\n          ssi->parsed++;\n        }\n        break;\n\n      case TAG_FOUND:\n        /* We are reading the tag name, looking for the start of the\n         * lead-out marker and removing any whitespace found. */\n\n        /* Remove leading whitespace between the tag leading and the first\n         * tag name character. */\n        if((ssi->tag_index == 0) && ((*ssi->parsed == ' ') ||\n           (*ssi->parsed == '\\t') || (*ssi->parsed == '\\n') ||\n           (*ssi->parsed == '\\r'))) {\n          /* Move on to the next character in the buffer */\n          ssi->parse_left--;\n          ssi->parsed++;\n          break;\n        }\n\n        /* Have we found the end of the tag name? This is signalled by\n         * us finding the first leadout character or whitespace */\n        if((*ssi->parsed == g_pcTagLeadOut[0]) ||\n           (*ssi->parsed == ' ')  || (*ssi->parsed == '\\t') ||\n           (*ssi->parsed == '\\n') || (*ssi->parsed == '\\r')) {\n\n          if(ssi->tag_index == 0) {\n            /* We read a zero length tag so ignore it. */\n            ssi->tag_state = TAG_NONE;\n          } else {\n            /* We read a non-empty tag so go ahead and look for the\n             * leadout string. */\n            ssi->tag_state = TAG_LEADOUT;\n            LWIP_ASSERT(\"ssi->tag_index <= 0xff\", ssi->tag_index <= 0xff);\n            ssi->tag_name_len = (u8_t)ssi->tag_index;\n            ssi->tag_name[ssi->tag_index] = '\\0';\n            if(*ssi->parsed == g_pcTagLeadOut[0]) {\n              ssi->tag_index = 1;\n            } else {\n              ssi->tag_index = 0;\n            }\n          }\n        } else {\n          /* This character is part of the tag name so save it */\n          if(ssi->tag_index < LWIP_HTTPD_MAX_TAG_NAME_LEN) {\n            ssi->tag_name[ssi->tag_index++] = *ssi->parsed;\n          } else {\n            /* The tag was too long so ignore it. */\n            ssi->tag_state = TAG_NONE;\n          }\n        }\n\n        /* Move on to the next character in the buffer */\n        ssi->parse_left--;\n        ssi->parsed++;\n\n        break;\n\n      /* We are looking for the end of the lead-out marker. */\n      case TAG_LEADOUT:\n        /* Remove leading whitespace between the tag leading and the first\n         * tag leadout character. */\n        if((ssi->tag_index == 0) && ((*ssi->parsed == ' ') ||\n           (*ssi->parsed == '\\t') || (*ssi->parsed == '\\n') ||\n           (*ssi->parsed == '\\r'))) {\n          /* Move on to the next character in the buffer */\n          ssi->parse_left--;\n          ssi->parsed++;\n          break;\n        }\n\n        /* Have we found the next character we expect for the tag leadout? */\n        if(*ssi->parsed == g_pcTagLeadOut[ssi->tag_index]) {\n          /* Yes - move to the next one unless we have found the complete\n           * leadout, in which case we need to call the client to process\n           * the tag. */\n\n          /* Move on to the next character in the buffer */\n          ssi->parse_left--;\n          ssi->parsed++;\n\n          if(ssi->tag_index == (LEN_TAG_LEAD_OUT - 1)) {\n            /* Call the client to ask for the insert string for the\n             * tag we just found. */\n#if LWIP_HTTPD_SSI_MULTIPART\n            ssi->tag_part = 0; /* start with tag part 0 */\n#endif /* LWIP_HTTPD_SSI_MULTIPART */\n            get_tag_insert(hs);\n\n            /* Next time through, we are going to be sending data\n             * immediately, either the end of the block we start\n             * sending here or the insert string. */\n            ssi->tag_index = 0;\n            ssi->tag_state = TAG_SENDING;\n            ssi->tag_end = ssi->parsed;\n#if !LWIP_HTTPD_SSI_INCLUDE_TAG\n            ssi->parsed = ssi->tag_started;\n#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/\n\n            /* If there is any unsent data in the buffer prior to the\n             * tag, we need to send it now. */\n            if (ssi->tag_end > hs->file) {\n              /* How much of the data can we send? */\n#if LWIP_HTTPD_SSI_INCLUDE_TAG\n              len = (u16_t)LWIP_MIN(ssi->tag_end - hs->file, 0xffff);\n#else /* LWIP_HTTPD_SSI_INCLUDE_TAG*/\n              /* we would include the tag in sending */\n              len = (u16_t)LWIP_MIN(ssi->tag_started - hs->file, 0xffff);\n#endif /* LWIP_HTTPD_SSI_INCLUDE_TAG*/\n\n              err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));\n              if (err == ERR_OK) {\n                data_to_send = 1;\n#if !LWIP_HTTPD_SSI_INCLUDE_TAG\n                if(ssi->tag_started <= hs->file) {\n                  /* pretend to have sent the tag, too */\n                  len += ssi->tag_end - ssi->tag_started;\n                }\n#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/\n                hs->file += len;\n                hs->left -= len;\n              }\n            }\n          } else {\n            ssi->tag_index++;\n          }\n        } else {\n          /* We found an unexpected character so this is not a tag. Move\n           * back to idle state. */\n          ssi->parse_left--;\n          ssi->parsed++;\n          ssi->tag_state = TAG_NONE;\n        }\n        break;\n\n      /*\n       * We have found a valid tag and are in the process of sending\n       * data as a result of that discovery. We send either remaining data\n       * from the file prior to the insert point or the insert string itself.\n       */\n      case TAG_SENDING:\n        /* Do we have any remaining file data to send from the buffer prior\n         * to the tag? */\n        if(ssi->tag_end > hs->file) {\n          /* How much of the data can we send? */\n#if LWIP_HTTPD_SSI_INCLUDE_TAG\n          len = (u16_t)LWIP_MIN(ssi->tag_end - hs->file, 0xffff);\n#else /* LWIP_HTTPD_SSI_INCLUDE_TAG*/\n          LWIP_ASSERT(\"hs->started >= hs->file\", ssi->tag_started >= hs->file);\n          /* we would include the tag in sending */\n          len = (u16_t)LWIP_MIN(ssi->tag_started - hs->file, 0xffff);\n#endif /* LWIP_HTTPD_SSI_INCLUDE_TAG*/\n          if (len != 0) {\n            err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));\n          } else {\n            err = ERR_OK;\n          }\n          if (err == ERR_OK) {\n            data_to_send = 1;\n#if !LWIP_HTTPD_SSI_INCLUDE_TAG\n            if(ssi->tag_started <= hs->file) {\n              /* pretend to have sent the tag, too */\n              len += ssi->tag_end - ssi->tag_started;\n            }\n#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/\n            hs->file += len;\n            hs->left -= len;\n          }\n        } else {\n#if LWIP_HTTPD_SSI_MULTIPART\n          if(ssi->tag_index >= ssi->tag_insert_len) {\n            /* Did the last SSIHandler have more to send? */\n            if (ssi->tag_part != HTTPD_LAST_TAG_PART) {\n              /* If so, call it again */\n              ssi->tag_index = 0;\n              get_tag_insert(hs);\n            }\n          }\n#endif /* LWIP_HTTPD_SSI_MULTIPART */\n\n          /* Do we still have insert data left to send? */\n          if(ssi->tag_index < ssi->tag_insert_len) {\n            /* We are sending the insert string itself. How much of the\n             * insert can we send? */\n            len = (ssi->tag_insert_len - ssi->tag_index);\n\n            /* Note that we set the copy flag here since we only have a\n             * single tag insert buffer per connection. If we don't do\n             * this, insert corruption can occur if more than one insert\n             * is processed before we call tcp_output. */\n            err = http_write(pcb, &(ssi->tag_insert[ssi->tag_index]), &len,\n                             HTTP_IS_TAG_VOLATILE(hs));\n            if (err == ERR_OK) {\n              data_to_send = 1;\n              ssi->tag_index += len;\n              /* Don't return here: keep on sending data */\n            }\n          } else {\n#if LWIP_HTTPD_SSI_MULTIPART\n            if (ssi->tag_part == HTTPD_LAST_TAG_PART)\n#endif /* LWIP_HTTPD_SSI_MULTIPART */\n            {\n              /* We have sent all the insert data so go back to looking for\n               * a new tag. */\n              LWIP_DEBUGF(HTTPD_DEBUG, (\"Everything sent.\\n\"));\n              ssi->tag_index = 0;\n              ssi->tag_state = TAG_NONE;\n#if !LWIP_HTTPD_SSI_INCLUDE_TAG\n              ssi->parsed = ssi->tag_end;\n#endif /* !LWIP_HTTPD_SSI_INCLUDE_TAG*/\n            }\n          }\n          break;\n        default:\n          break;\n      }\n    }\n  }\n\n  /* If we drop out of the end of the for loop, this implies we must have\n   * file data to send so send it now. In TAG_SENDING state, we've already\n   * handled this so skip the send if that's the case. */\n  if((ssi->tag_state != TAG_SENDING) && (ssi->parsed > hs->file)) {\n    len = (u16_t)LWIP_MIN(ssi->parsed - hs->file, 0xffff);\n\n    err = http_write(pcb, hs->file, &len, HTTP_IS_DATA_VOLATILE(hs));\n    if (err == ERR_OK) {\n      data_to_send = 1;\n      hs->file += len;\n      hs->left -= len;\n    }\n  }\n  return data_to_send;\n}\n#endif /* LWIP_HTTPD_SSI */\n\n/**\n * Try to send more data on this pcb.\n *\n * @param pcb the pcb to send data\n * @param hs connection state\n */\nstatic u8_t\nhttp_send(struct tcp_pcb *pcb, struct http_state *hs)\n{\n  u8_t data_to_send = HTTP_NO_DATA_TO_SEND;\n\n  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"http_send: pcb=%p hs=%p left=%d\\n\", (void*)pcb,\n    (void*)hs, hs != NULL ? (int)hs->left : 0));\n\n#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND\n  if (hs->unrecved_bytes != 0) {\n    return 0;\n  }\n#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */\n\n  /* If we were passed a NULL state structure pointer, ignore the call. */\n  if (hs == NULL) {\n    return 0;\n  }\n\n#if LWIP_HTTPD_FS_ASYNC_READ\n  /* Check if we are allowed to read from this file.\n     (e.g. SSI might want to delay sending until data is available) */\n  if (!fs_is_file_ready(hs->handle, http_continue, hs)) {\n    return 0;\n  }\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n\n#if LWIP_HTTPD_DYNAMIC_HEADERS\n  /* Do we have any more header data to send for this file? */\n  if (hs->hdr_index < NUM_FILE_HDR_STRINGS) {\n    data_to_send = http_send_headers(pcb, hs);\n    if ((data_to_send != HTTP_DATA_TO_SEND_CONTINUE) &&\n        (hs->hdr_index < NUM_FILE_HDR_STRINGS)) {\n      return data_to_send;\n    }\n  }\n#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */\n\n  /* Have we run out of file data to send? If so, we need to read the next\n   * block from the file. */\n  if (hs->left == 0) {\n    if (!http_check_eof(pcb, hs)) {\n      return 0;\n    }\n  }\n\n#if LWIP_HTTPD_SSI\n  if(hs->ssi) {\n    data_to_send = http_send_data_ssi(pcb, hs);\n  } else\n#endif /* LWIP_HTTPD_SSI */\n  {\n    data_to_send = http_send_data_nonssi(pcb, hs);\n  }\n\n  if((hs->left == 0) && (fs_bytes_left(hs->handle) <= 0)) {\n    /* We reached the end of the file so this request is done.\n     * This adds the FIN flag right into the last data segment. */\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"End of file.\\n\"));\n    http_eof(pcb, hs);\n    return 0;\n  }\n  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"send_data end.\\n\"));\n  return data_to_send;\n}\n\n#if LWIP_HTTPD_SUPPORT_EXTSTATUS\n/** Initialize a http connection with a file to send for an error message\n *\n * @param hs http connection state\n * @param error_nr HTTP error number\n * @return ERR_OK if file was found and hs has been initialized correctly\n *         another err_t otherwise\n */\nstatic err_t\nhttp_find_error_file(struct http_state *hs, u16_t error_nr)\n{\n  const char *uri1, *uri2, *uri3;\n  err_t err;\n\n  if (error_nr == 501) {\n    uri1 = \"/501.html\";\n    uri2 = \"/501.htm\";\n    uri3 = \"/501.shtml\";\n  } else {\n    /* 400 (bad request is the default) */\n    uri1 = \"/400.html\";\n    uri2 = \"/400.htm\";\n    uri3 = \"/400.shtml\";\n  }\n  err = fs_open(&hs->file_handle, uri1);\n  if (err != ERR_OK) {\n    err = fs_open(&hs->file_handle, uri2);\n    if (err != ERR_OK) {\n      err = fs_open(&hs->file_handle, uri3);\n      if (err != ERR_OK) {\n        LWIP_DEBUGF(HTTPD_DEBUG, (\"Error page for error %\"U16_F\" not found\\n\",\n          error_nr));\n        return ERR_ARG;\n      }\n    }\n  }\n  return http_init_file(hs, &hs->file_handle, 0, NULL, 0, NULL);\n}\n#else /* LWIP_HTTPD_SUPPORT_EXTSTATUS */\n#define http_find_error_file(hs, error_nr) ERR_ARG\n#endif /* LWIP_HTTPD_SUPPORT_EXTSTATUS */\n\n/**\n * Get the file struct for a 404 error page.\n * Tries some file names and returns NULL if none found.\n *\n * @param uri pointer that receives the actual file name URI\n * @return file struct for the error page or NULL no matching file was found\n */\nstatic struct fs_file *\nhttp_get_404_file(struct http_state *hs, const char **uri)\n{\n  err_t err;\n\n  *uri = \"/404.html\";\n  err = fs_open(&hs->file_handle, *uri);\n  if (err != ERR_OK) {\n    /* 404.html doesn't exist. Try 404.htm instead. */\n    *uri = \"/404.htm\";\n    err = fs_open(&hs->file_handle, *uri);\n    if (err != ERR_OK) {\n      /* 404.htm doesn't exist either. Try 404.shtml instead. */\n      *uri = \"/404.shtml\";\n      err = fs_open(&hs->file_handle, *uri);\n      if (err != ERR_OK) {\n        /* 404.htm doesn't exist either. Indicate to the caller that it should\n         * send back a default 404 page.\n         */\n        *uri = NULL;\n        return NULL;\n      }\n    }\n  }\n\n  return &hs->file_handle;\n}\n\n#if LWIP_HTTPD_SUPPORT_POST\nstatic err_t\nhttp_handle_post_finished(struct http_state *hs)\n{\n#if LWIP_HTTPD_POST_MANUAL_WND\n  /* Prevent multiple calls to httpd_post_finished, since it might have already\n     been called before from httpd_post_data_recved(). */\n  if (hs->post_finished) {\n    return ERR_OK;\n  }\n  hs->post_finished = 1;\n#endif /* LWIP_HTTPD_POST_MANUAL_WND */\n  /* application error or POST finished */\n  /* NULL-terminate the buffer */\n  http_uri_buf[0] = 0;\n  httpd_post_finished(hs, http_uri_buf, LWIP_HTTPD_URI_BUF_LEN);\n  return http_find_file(hs, http_uri_buf, 0);\n}\n\n/** Pass received POST body data to the application and correctly handle\n * returning a response document or closing the connection.\n * ATTENTION: The application is responsible for the pbuf now, so don't free it!\n *\n * @param hs http connection state\n * @param p pbuf to pass to the application\n * @return ERR_OK if passed successfully, another err_t if the response file\n *         hasn't been found (after POST finished)\n */\nstatic err_t\nhttp_post_rxpbuf(struct http_state *hs, struct pbuf *p)\n{\n  err_t err;\n\n  if (p != NULL) {\n    /* adjust remaining Content-Length */\n    if (hs->post_content_len_left < p->tot_len) {\n      hs->post_content_len_left = 0;\n    } else {\n      hs->post_content_len_left -= p->tot_len;\n    }\n  }\n#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND\n  /* prevent connection being closed if httpd_post_data_recved() is called nested */\n  hs->unrecved_bytes++;\n#endif\n  err = httpd_post_receive_data(hs, p);\n#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND\n  hs->unrecved_bytes--;\n#endif\n  if (err != ERR_OK) {\n    /* Ignore remaining content in case of application error */\n    hs->post_content_len_left = 0;\n  }\n  if (hs->post_content_len_left == 0) {\n#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND\n    if (hs->unrecved_bytes != 0) {\n       return ERR_OK;\n    }\n#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */\n    /* application error or POST finished */\n    return http_handle_post_finished(hs);\n  }\n\n  return ERR_OK;\n}\n\n/** Handle a post request. Called from http_parse_request when method 'POST'\n * is found.\n *\n * @param p The input pbuf (containing the POST header and body).\n * @param hs The http connection state.\n * @param data HTTP request (header and part of body) from input pbuf(s).\n * @param data_len Size of 'data'.\n * @param uri The HTTP URI parsed from input pbuf(s).\n * @param uri_end Pointer to the end of 'uri' (here, the rest of the HTTP\n *                header starts).\n * @return ERR_OK: POST correctly parsed and accepted by the application.\n *         ERR_INPROGRESS: POST not completely parsed (no error yet)\n *         another err_t: Error parsing POST or denied by the application\n */\nstatic err_t\nhttp_post_request(struct pbuf *inp, struct http_state *hs,\n                  char *data, u16_t data_len, char *uri, char *uri_end)\n{\n  err_t err;\n  /* search for end-of-header (first double-CRLF) */\n  char* crlfcrlf = lwip_strnstr(uri_end + 1, CRLF CRLF, data_len - (uri_end + 1 - data));\n\n  if (crlfcrlf != NULL) {\n    /* search for \"Content-Length: \" */\n#define HTTP_HDR_CONTENT_LEN                \"Content-Length: \"\n#define HTTP_HDR_CONTENT_LEN_LEN            16\n#define HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN  10\n    char *scontent_len = lwip_strnstr(uri_end + 1, HTTP_HDR_CONTENT_LEN, crlfcrlf - (uri_end + 1));\n    if (scontent_len != NULL) {\n      char *scontent_len_end = lwip_strnstr(scontent_len + HTTP_HDR_CONTENT_LEN_LEN, CRLF, HTTP_HDR_CONTENT_LEN_DIGIT_MAX_LEN);\n      if (scontent_len_end != NULL) {\n        int content_len;\n        char *content_len_num = scontent_len + HTTP_HDR_CONTENT_LEN_LEN;\n        content_len = atoi(content_len_num);\n        if (content_len == 0) {\n          /* if atoi returns 0 on error, fix this */\n          if ((content_len_num[0] != '0') || (content_len_num[1] != '\\r')) {\n            content_len = -1;\n          }\n        }\n        if (content_len >= 0) {\n          /* adjust length of HTTP header passed to application */\n          const char *hdr_start_after_uri = uri_end + 1;\n          u16_t hdr_len = (u16_t)LWIP_MIN(data_len, crlfcrlf + 4 - data);\n          u16_t hdr_data_len = (u16_t)LWIP_MIN(data_len, crlfcrlf + 4 - hdr_start_after_uri);\n          u8_t post_auto_wnd = 1;\n          http_uri_buf[0] = 0;\n          /* trim http header */\n          *crlfcrlf = 0;\n          err = httpd_post_begin(hs, uri, hdr_start_after_uri, hdr_data_len, content_len,\n            http_uri_buf, LWIP_HTTPD_URI_BUF_LEN, &post_auto_wnd);\n          if (err == ERR_OK) {\n            /* try to pass in data of the first pbuf(s) */\n            struct pbuf *q = inp;\n            u16_t start_offset = hdr_len;\n#if LWIP_HTTPD_POST_MANUAL_WND\n            hs->no_auto_wnd = !post_auto_wnd;\n#endif /* LWIP_HTTPD_POST_MANUAL_WND */\n            /* set the Content-Length to be received for this POST */\n            hs->post_content_len_left = (u32_t)content_len;\n\n            /* get to the pbuf where the body starts */\n            while((q != NULL) && (q->len <= start_offset)) {\n              start_offset -= q->len;\n              q = q->next;\n            }\n            if (q != NULL) {\n              /* hide the remaining HTTP header */\n              pbuf_header(q, -(s16_t)start_offset);\n#if LWIP_HTTPD_POST_MANUAL_WND\n              if (!post_auto_wnd) {\n                /* already tcp_recved() this data... */\n                hs->unrecved_bytes = q->tot_len;\n              }\n#endif /* LWIP_HTTPD_POST_MANUAL_WND */\n              pbuf_ref(q);\n              return http_post_rxpbuf(hs, q);\n            } else if (hs->post_content_len_left == 0) {\n              q = pbuf_alloc(PBUF_RAW, 0, PBUF_REF);\n              return http_post_rxpbuf(hs, q);\n            } else {\n              return ERR_OK;\n            }\n          } else {\n            /* return file passed from application */\n            return http_find_file(hs, http_uri_buf, 0);\n          }\n        } else {\n          LWIP_DEBUGF(HTTPD_DEBUG, (\"POST received invalid Content-Length: %s\\n\",\n            content_len_num));\n          return ERR_ARG;\n        }\n      }\n    }\n    /* If we come here, headers are fully received (double-crlf), but Content-Length\n       was not included. Since this is currently the only supported method, we have\n       to fail in this case! */\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"Error when parsing Content-Length\\n\"));\n    return ERR_ARG;\n  }\n  /* if we come here, the POST is incomplete */\n#if LWIP_HTTPD_SUPPORT_REQUESTLIST\n  return ERR_INPROGRESS;\n#else /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n  return ERR_ARG;\n#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n}\n\n#if LWIP_HTTPD_POST_MANUAL_WND\n/** A POST implementation can call this function to update the TCP window.\n * This can be used to throttle data reception (e.g. when received data is\n * programmed to flash and data is received faster than programmed).\n *\n * @param connection A connection handle passed to httpd_post_begin for which\n *        httpd_post_finished has *NOT* been called yet!\n * @param recved_len Length of data received (for window update)\n */\nvoid httpd_post_data_recved(void *connection, u16_t recved_len)\n{\n  struct http_state *hs = (struct http_state*)connection;\n  if (hs != NULL) {\n    if (hs->no_auto_wnd) {\n      u16_t len = recved_len;\n      if (hs->unrecved_bytes >= recved_len) {\n        hs->unrecved_bytes -= recved_len;\n      } else {\n        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_LEVEL_WARNING, (\"httpd_post_data_recved: recved_len too big\\n\"));\n        len = (u16_t)hs->unrecved_bytes;\n        hs->unrecved_bytes = 0;\n      }\n      if (hs->pcb != NULL) {\n        if (len != 0) {\n          tcp_recved(hs->pcb, len);\n        }\n        if ((hs->post_content_len_left == 0) && (hs->unrecved_bytes == 0)) {\n          /* finished handling POST */\n          http_handle_post_finished(hs);\n          http_send(hs->pcb, hs);\n        }\n      }\n    }\n  }\n}\n#endif /* LWIP_HTTPD_POST_MANUAL_WND */\n\n#endif /* LWIP_HTTPD_SUPPORT_POST */\n\n#if LWIP_HTTPD_FS_ASYNC_READ\n/** Try to send more data if file has been blocked before\n * This is a callback function passed to fs_read_async().\n */\nstatic void\nhttp_continue(void *connection)\n{\n  struct http_state *hs = (struct http_state*)connection;\n  if (hs && (hs->pcb) && (hs->handle)) {\n    LWIP_ASSERT(\"hs->pcb != NULL\", hs->pcb != NULL);\n    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"httpd_continue: try to send more data\\n\"));\n    if (http_send(hs->pcb, hs)) {\n      /* If we wrote anything to be sent, go ahead and send it now. */\n      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"tcp_output\\n\"));\n      tcp_output(hs->pcb);\n    }\n  }\n}\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n\n/**\n * When data has been received in the correct state, try to parse it\n * as a HTTP request.\n *\n * @param inp the received pbuf\n * @param hs the connection state\n * @param pcb the tcp_pcb which received this packet\n * @return ERR_OK if request was OK and hs has been initialized correctly\n *         ERR_INPROGRESS if request was OK so far but not fully received\n *         another err_t otherwise\n */\nstatic err_t\nhttp_parse_request(struct pbuf *inp, struct http_state *hs, struct tcp_pcb *pcb)\n{\n  char *data;\n  char *crlf;\n  u16_t data_len;\n  struct pbuf *p = inp;\n#if LWIP_HTTPD_SUPPORT_REQUESTLIST\n  u16_t clen;\n#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n#if LWIP_HTTPD_SUPPORT_POST\n  err_t err;\n#endif /* LWIP_HTTPD_SUPPORT_POST */\n\n  LWIP_UNUSED_ARG(pcb); /* only used for post */\n  LWIP_ASSERT(\"p != NULL\", p != NULL);\n  LWIP_ASSERT(\"hs != NULL\", hs != NULL);\n\n  if ((hs->handle != NULL) || (hs->file != NULL)) {\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"Received data while sending a file\\n\"));\n    /* already sending a file */\n    /* @todo: abort? */\n    return ERR_USE;\n  }\n\n#if LWIP_HTTPD_SUPPORT_REQUESTLIST\n\n  LWIP_DEBUGF(HTTPD_DEBUG, (\"Received %\"U16_F\" bytes\\n\", p->tot_len));\n\n  /* first check allowed characters in this pbuf? */\n\n  /* enqueue the pbuf */\n  if (hs->req == NULL) {\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"First pbuf\\n\"));\n    hs->req = p;\n  } else {\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"pbuf enqueued\\n\"));\n    pbuf_cat(hs->req, p);\n  }\n  /* increase pbuf ref counter as it is freed when we return but we want to\n     keep it on the req list */\n  pbuf_ref(p);\n\n  if (hs->req->next != NULL) {\n    data_len = LWIP_MIN(hs->req->tot_len, LWIP_HTTPD_MAX_REQ_LENGTH);\n    pbuf_copy_partial(hs->req, httpd_req_buf, data_len, 0);\n    data = httpd_req_buf;\n  } else\n#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n  {\n    data = (char *)p->payload;\n    data_len = p->len;\n    if (p->len != p->tot_len) {\n      LWIP_DEBUGF(HTTPD_DEBUG, (\"Warning: incomplete header due to chained pbufs\\n\"));\n    }\n  }\n\n  /* received enough data for minimal request? */\n  if (data_len >= MIN_REQ_LEN) {\n    /* wait for CRLF before parsing anything */\n    crlf = lwip_strnstr(data, CRLF, data_len);\n    if (crlf != NULL) {\n#if LWIP_HTTPD_SUPPORT_POST\n      int is_post = 0;\n#endif /* LWIP_HTTPD_SUPPORT_POST */\n      int is_09 = 0;\n      char *sp1, *sp2;\n      u16_t left_len, uri_len;\n      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"CRLF received, parsing request\\n\"));\n      /* parse method */\n      if (!strncmp(data, \"GET \", 4)) {\n        sp1 = data + 3;\n        /* received GET request */\n        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"Received GET request\\\"\\n\"));\n#if LWIP_HTTPD_SUPPORT_POST\n      } else if (!strncmp(data, \"POST \", 5)) {\n        /* store request type */\n        is_post = 1;\n        sp1 = data + 4;\n        /* received GET request */\n        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"Received POST request\\n\"));\n#endif /* LWIP_HTTPD_SUPPORT_POST */\n      } else {\n        /* null-terminate the METHOD (pbuf is freed anyway wen returning) */\n        data[4] = 0;\n        /* unsupported method! */\n        LWIP_DEBUGF(HTTPD_DEBUG, (\"Unsupported request method (not implemented): \\\"%s\\\"\\n\",\n          data));\n        return http_find_error_file(hs, 501);\n      }\n      /* if we come here, method is OK, parse URI */\n      left_len = (u16_t)(data_len - ((sp1 +1) - data));\n      sp2 = lwip_strnstr(sp1 + 1, \" \", left_len);\n#if LWIP_HTTPD_SUPPORT_V09\n      if (sp2 == NULL) {\n        /* HTTP 0.9: respond with correct protocol version */\n        sp2 = lwip_strnstr(sp1 + 1, CRLF, left_len);\n        is_09 = 1;\n#if LWIP_HTTPD_SUPPORT_POST\n        if (is_post) {\n          /* HTTP/0.9 does not support POST */\n          goto badrequest;\n        }\n#endif /* LWIP_HTTPD_SUPPORT_POST */\n      }\n#endif /* LWIP_HTTPD_SUPPORT_V09 */\n      uri_len = (u16_t)(sp2 - (sp1 + 1));\n      if ((sp2 != 0) && (sp2 > sp1)) {\n        /* wait for CRLFCRLF (indicating end of HTTP headers) before parsing anything */\n        if (lwip_strnstr(data, CRLF CRLF, data_len) != NULL) {\n          char *uri = sp1 + 1;\n#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE\n          /* This is HTTP/1.0 compatible: for strict 1.1, a connection\n             would always be persistent unless \"close\" was specified. */\n          if (!is_09 && (lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE, data_len) ||\n              lwip_strnstr(data, HTTP11_CONNECTIONKEEPALIVE2, data_len))) {\n            hs->keepalive = 1;\n          } else {\n            hs->keepalive = 0;\n          }\n#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */\n          /* null-terminate the METHOD (pbuf is freed anyway wen returning) */\n          *sp1 = 0;\n          uri[uri_len] = 0;\n          LWIP_DEBUGF(HTTPD_DEBUG, (\"Received \\\"%s\\\" request for URI: \\\"%s\\\"\\n\",\n                      data, uri));\n#if LWIP_HTTPD_SUPPORT_POST\n          if (is_post) {\n#if LWIP_HTTPD_SUPPORT_REQUESTLIST\n            struct pbuf *q = hs->req;\n#else /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n            struct pbuf *q = inp;\n#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n            err = http_post_request(q, hs, data, data_len, uri, sp2);\n            if (err != ERR_OK) {\n              /* restore header for next try */\n              *sp1 = ' ';\n              *sp2 = ' ';\n              uri[uri_len] = ' ';\n            }\n            if (err == ERR_ARG) {\n              goto badrequest;\n            }\n            return err;\n          } else\n#endif /* LWIP_HTTPD_SUPPORT_POST */\n          {\n            return http_find_file(hs, uri, is_09);\n          }\n        }\n      } else {\n        LWIP_DEBUGF(HTTPD_DEBUG, (\"invalid URI\\n\"));\n      }\n    }\n  }\n\n#if LWIP_HTTPD_SUPPORT_REQUESTLIST\n  clen = pbuf_clen(hs->req);\n  if ((hs->req->tot_len <= LWIP_HTTPD_REQ_BUFSIZE) &&\n    (clen <= LWIP_HTTPD_REQ_QUEUELEN)) {\n    /* request not fully received (too short or CRLF is missing) */\n    return ERR_INPROGRESS;\n  } else\n#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n  {\n#if LWIP_HTTPD_SUPPORT_POST\nbadrequest:\n#endif /* LWIP_HTTPD_SUPPORT_POST */\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"bad request\\n\"));\n    /* could not parse request */\n    return http_find_error_file(hs, 400);\n  }\n}\n\n/** Try to find the file specified by uri and, if found, initialize hs\n * accordingly.\n *\n * @param hs the connection state\n * @param uri the HTTP header URI\n * @param is_09 1 if the request is HTTP/0.9 (no HTTP headers in response)\n * @return ERR_OK if file was found and hs has been initialized correctly\n *         another err_t otherwise\n */\nstatic err_t\nhttp_find_file(struct http_state *hs, const char *uri, int is_09)\n{\n  size_t loop;\n  struct fs_file *file = NULL;\n  char *params = NULL;\n  err_t err;\n#if LWIP_HTTPD_CGI\n  int i;\n#endif /* LWIP_HTTPD_CGI */\n#if !LWIP_HTTPD_SSI\n  const\n#endif /* !LWIP_HTTPD_SSI */\n  /* By default, assume we will not be processing server-side-includes tags */\n  u8_t tag_check = 0;\n\n  /* Have we been asked for the default file (in root or a directory) ? */\n#if LWIP_HTTPD_MAX_REQUEST_URI_LEN\n  size_t uri_len = strlen(uri);\n  if ((uri_len > 0) && (uri[uri_len-1] == '/') &&\n      ((uri != http_uri_buf) || (uri_len == 1))) {\n    size_t copy_len = LWIP_MIN(sizeof(http_uri_buf) - 1, uri_len - 1);\n    if (copy_len > 0) {\n      MEMCPY(http_uri_buf, uri, copy_len);\n      http_uri_buf[copy_len] = 0;\n    }\n#else /* LWIP_HTTPD_MAX_REQUEST_URI_LEN */\n  if ((uri[0] == '/') &&  (uri[1] == 0)) {\n#endif /* LWIP_HTTPD_MAX_REQUEST_URI_LEN */\n    /* Try each of the configured default filenames until we find one\n       that exists. */\n    for (loop = 0; loop < NUM_DEFAULT_FILENAMES; loop++) {\n      const char* file_name;\n#if LWIP_HTTPD_MAX_REQUEST_URI_LEN\n      if (copy_len > 0) {\n        size_t len_left = sizeof(http_uri_buf) - copy_len - 1;\n        if (len_left > 0) {\n          size_t name_len = strlen(g_psDefaultFilenames[loop].name);\n          size_t name_copy_len = LWIP_MIN(len_left, name_len);\n          MEMCPY(&http_uri_buf[copy_len], g_psDefaultFilenames[loop].name, name_copy_len);\n        }\n        file_name = http_uri_buf;\n      } else\n#endif /* LWIP_HTTPD_MAX_REQUEST_URI_LEN */\n      {\n        file_name = g_psDefaultFilenames[loop].name;\n      }\n      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"Looking for %s...\\n\", file_name));\n      err = fs_open(&hs->file_handle, file_name);\n      if(err == ERR_OK) {\n        uri = file_name;\n        file = &hs->file_handle;\n        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"Opened.\\n\"));\n#if LWIP_HTTPD_SSI\n        tag_check = g_psDefaultFilenames[loop].shtml;\n#endif /* LWIP_HTTPD_SSI */\n        break;\n      }\n    }\n  }\n  if (file == NULL) {\n    /* No - we've been asked for a specific file. */\n    /* First, isolate the base URI (without any parameters) */\n    params = (char *)strchr(uri, '?');\n    if (params != NULL) {\n      /* URI contains parameters. NULL-terminate the base URI */\n      *params = '\\0';\n      params++;\n    }\n\n#if LWIP_HTTPD_CGI\n    http_cgi_paramcount = -1;\n    /* Does the base URI we have isolated correspond to a CGI handler? */\n    if (g_iNumCGIs && g_pCGIs) {\n      for (i = 0; i < g_iNumCGIs; i++) {\n        if (strcmp(uri, g_pCGIs[i].pcCGIName) == 0) {\n          /*\n           * We found a CGI that handles this URI so extract the\n           * parameters and call the handler.\n           */\n           http_cgi_paramcount = extract_uri_parameters(hs, params);\n           uri = g_pCGIs[i].pfnCGIHandler(i, http_cgi_paramcount, hs->params,\n                                          hs->param_vals);\n           break;\n        }\n      }\n    }\n#endif /* LWIP_HTTPD_CGI */\n\n    LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"Opening %s\\n\", uri));\n\n    err = fs_open(&hs->file_handle, uri);\n    if (err == ERR_OK) {\n       file = &hs->file_handle;\n    } else {\n      file = http_get_404_file(hs, &uri);\n    }\n#if LWIP_HTTPD_SSI\n    if (file != NULL) {\n      /* See if we have been asked for an shtml file and, if so,\n         enable tag checking. */\n      const char* ext = NULL, *sub;\n      char* param = (char*)strstr(uri, \"?\");\n      if (param != NULL) {\n         /* separate uri from parameters for now, set back later */\n         *param = 0;\n      }\n      sub = uri;\n      ext = uri;\n      for (sub = strstr(sub, \".\"); sub != NULL; sub = strstr(sub, \".\"))\n      {\n         ext = sub;\n         sub++;\n      }\n      tag_check = 0;\n      for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) {\n        if (!lwip_stricmp(ext, g_pcSSIExtensions[loop])) {\n          tag_check = 1;\n          break;\n        }\n      }\n      if (param != NULL) {\n         *param = '?';\n      }\n    }\n#endif /* LWIP_HTTPD_SSI */\n  }\n  if (file == NULL) {\n    /* None of the default filenames exist so send back a 404 page */\n    file = http_get_404_file(hs, &uri);\n  }\n  return http_init_file(hs, file, is_09, uri, tag_check, params);\n}\n\n/** Initialize a http connection with a file to send (if found).\n * Called by http_find_file and http_find_error_file.\n *\n * @param hs http connection state\n * @param file file structure to send (or NULL if not found)\n * @param is_09 1 if the request is HTTP/0.9 (no HTTP headers in response)\n * @param uri the HTTP header URI\n * @param tag_check enable SSI tag checking\n * @param params != NULL if URI has parameters (separated by '?')\n * @return ERR_OK if file was found and hs has been initialized correctly\n *         another err_t otherwise\n */\nstatic err_t\nhttp_init_file(struct http_state *hs, struct fs_file *file, int is_09, const char *uri,\n               u8_t tag_check, char* params)\n{\n  if (file != NULL) {\n    /* file opened, initialise struct http_state */\n#if LWIP_HTTPD_SSI\n    if (tag_check) {\n      struct http_ssi_state *ssi = http_ssi_state_alloc();\n      if (ssi != NULL) {\n        ssi->tag_index = 0;\n        ssi->tag_state = TAG_NONE;\n        ssi->parsed = file->data;\n        ssi->parse_left = file->len;\n        ssi->tag_end = file->data;\n        hs->ssi = ssi;\n      }\n    }\n#else /* LWIP_HTTPD_SSI */\n    LWIP_UNUSED_ARG(tag_check);\n#endif /* LWIP_HTTPD_SSI */\n    hs->handle = file;\n    hs->file = file->data;\n    LWIP_ASSERT(\"File length must be positive!\", (file->len >= 0));\n#if LWIP_HTTPD_CUSTOM_FILES\n    if (file->is_custom_file && (file->data == NULL)) {\n      /* custom file, need to read data first (via fs_read_custom) */\n      hs->left = 0;\n    } else\n#endif /* LWIP_HTTPD_CUSTOM_FILES */\n    {\n      hs->left = file->len;\n    }\n    hs->retries = 0;\n#if LWIP_HTTPD_TIMING\n    hs->time_started = sys_now();\n#endif /* LWIP_HTTPD_TIMING */\n#if !LWIP_HTTPD_DYNAMIC_HEADERS\n    LWIP_ASSERT(\"HTTP headers not included in file system\",\n       (hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0);\n#endif /* !LWIP_HTTPD_DYNAMIC_HEADERS */\n#if LWIP_HTTPD_SUPPORT_V09\n    if (is_09 && ((hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) != 0)) {\n      /* HTTP/0.9 responses are sent without HTTP header,\n         search for the end of the header. */\n      char *file_start = lwip_strnstr(hs->file, CRLF CRLF, hs->left);\n      if (file_start != NULL) {\n        size_t diff = file_start + 4 - hs->file;\n        hs->file += diff;\n        hs->left -= (u32_t)diff;\n      }\n    }\n#endif /* LWIP_HTTPD_SUPPORT_V09*/\n#if LWIP_HTTPD_CGI_SSI\n    if (params != NULL) {\n      /* URI contains parameters, call generic CGI handler */\n      int count;\n#if LWIP_HTTPD_CGI\n      if (http_cgi_paramcount >= 0) {\n        count = http_cgi_paramcount;\n      } else\n#endif\n      {\n        count = extract_uri_parameters(hs, params);\n      }\n      httpd_cgi_handler(uri, count, http_cgi_params, http_cgi_param_vals\n#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE\n         , hs->handle->state\n#endif /* LWIP_HTTPD_FILE_STATE */\n                        );\n    }\n#else /* LWIP_HTTPD_CGI_SSI */\n    LWIP_UNUSED_ARG(params);\n#endif /* LWIP_HTTPD_CGI_SSI */\n  } else {\n    hs->handle = NULL;\n    hs->file = NULL;\n    hs->left = 0;\n    hs->retries = 0;\n  }\n#if LWIP_HTTPD_DYNAMIC_HEADERS\n  /* Determine the HTTP headers to send based on the file extension of\n   * the requested URI. */\n  if ((hs->handle == NULL) || ((hs->handle->flags & FS_FILE_FLAGS_HEADER_INCLUDED) == 0)) {\n    get_http_headers(hs, uri);\n  }\n#else /* LWIP_HTTPD_DYNAMIC_HEADERS */\n  LWIP_UNUSED_ARG(uri);\n#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */\n#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE\n  if (hs->keepalive) {\n#if LWIP_HTTPD_SSI\n     if (hs->ssi != NULL) {\n       hs->keepalive = 0;\n     } else\n#endif /* LWIP_HTTPD_SSI */\n     {\n       if ((hs->handle != NULL) &&\n           ((hs->handle->flags & (FS_FILE_FLAGS_HEADER_INCLUDED|FS_FILE_FLAGS_HEADER_PERSISTENT)) == FS_FILE_FLAGS_HEADER_INCLUDED)) {\n         hs->keepalive = 0;\n       }\n     }\n  }\n#endif /* LWIP_HTTPD_SUPPORT_11_KEEPALIVE */\n  return ERR_OK;\n}\n\n/**\n * The pcb had an error and is already deallocated.\n * The argument might still be valid (if != NULL).\n */\nstatic void\nhttp_err(void *arg, err_t err)\n{\n  struct http_state *hs = (struct http_state *)arg;\n  LWIP_UNUSED_ARG(err);\n\n  LWIP_DEBUGF(HTTPD_DEBUG, (\"http_err: %s\", lwip_strerr(err)));\n\n  if (hs != NULL) {\n    http_state_free(hs);\n  }\n}\n\n/**\n * Data has been sent and acknowledged by the remote host.\n * This means that more data can be sent.\n */\nstatic err_t\nhttp_sent(void *arg, struct tcp_pcb *pcb, u16_t len)\n{\n  struct http_state *hs = (struct http_state *)arg;\n\n  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"http_sent %p\\n\", (void*)pcb));\n\n  LWIP_UNUSED_ARG(len);\n\n  if (hs == NULL) {\n    return ERR_OK;\n  }\n\n  hs->retries = 0;\n\n  http_send(pcb, hs);\n\n  return ERR_OK;\n}\n\n/**\n * The poll function is called every 2nd second.\n * If there has been no data sent (which resets the retries) in 8 seconds, close.\n * If the last portion of a file has not been sent in 2 seconds, close.\n *\n * This could be increased, but we don't want to waste resources for bad connections.\n */\nstatic err_t\nhttp_poll(void *arg, struct tcp_pcb *pcb)\n{\n  struct http_state *hs = (struct http_state *)arg;\n  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"http_poll: pcb=%p hs=%p pcb_state=%s\\n\",\n    (void*)pcb, (void*)hs, tcp_debug_state_str(pcb->state)));\n\n  if (hs == NULL) {\n    err_t closed;\n    /* arg is null, close. */\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"http_poll: arg is NULL, close\\n\"));\n    closed = http_close_conn(pcb, NULL);\n    LWIP_UNUSED_ARG(closed);\n#if LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR\n    if (closed == ERR_MEM) {\n       tcp_abort(pcb);\n       return ERR_ABRT;\n    }\n#endif /* LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR */\n    return ERR_OK;\n  } else {\n    hs->retries++;\n    if (hs->retries == HTTPD_MAX_RETRIES) {\n      LWIP_DEBUGF(HTTPD_DEBUG, (\"http_poll: too many retries, close\\n\"));\n      http_close_conn(pcb, hs);\n      return ERR_OK;\n    }\n\n    /* If this connection has a file open, try to send some more data. If\n     * it has not yet received a GET request, don't do this since it will\n     * cause the connection to close immediately. */\n    if(hs && (hs->handle)) {\n      LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"http_poll: try to send more data\\n\"));\n      if(http_send(pcb, hs)) {\n        /* If we wrote anything to be sent, go ahead and send it now. */\n        LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"tcp_output\\n\"));\n        tcp_output(pcb);\n      }\n    }\n  }\n\n  return ERR_OK;\n}\n\n/**\n * Data has been received on this pcb.\n * For HTTP 1.0, this should normally only happen once (if the request fits in one packet).\n */\nstatic err_t\nhttp_recv(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)\n{\n  struct http_state *hs = (struct http_state *)arg;\n  LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"http_recv: pcb=%p pbuf=%p err=%s\\n\", (void*)pcb,\n    (void*)p, lwip_strerr(err)));\n\n  if ((err != ERR_OK) || (p == NULL) || (hs == NULL)) {\n    /* error or closed by other side? */\n    if (p != NULL) {\n      /* Inform TCP that we have taken the data. */\n      tcp_recved(pcb, p->tot_len);\n      pbuf_free(p);\n    }\n    if (hs == NULL) {\n      /* this should not happen, only to be robust */\n      LWIP_DEBUGF(HTTPD_DEBUG, (\"Error, http_recv: hs is NULL, close\\n\"));\n    }\n    http_close_conn(pcb, hs);\n    return ERR_OK;\n  }\n\n#if LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND\n  if (hs->no_auto_wnd) {\n     hs->unrecved_bytes += p->tot_len;\n  } else\n#endif /* LWIP_HTTPD_SUPPORT_POST && LWIP_HTTPD_POST_MANUAL_WND */\n  {\n    /* Inform TCP that we have taken the data. */\n    tcp_recved(pcb, p->tot_len);\n  }\n\n#if LWIP_HTTPD_SUPPORT_POST\n  if (hs->post_content_len_left > 0) {\n    /* reset idle counter when POST data is received */\n    hs->retries = 0;\n    /* this is data for a POST, pass the complete pbuf to the application */\n    http_post_rxpbuf(hs, p);\n    /* pbuf is passed to the application, don't free it! */\n    if (hs->post_content_len_left == 0) {\n      /* all data received, send response or close connection */\n      http_send(pcb, hs);\n    }\n    return ERR_OK;\n  } else\n#endif /* LWIP_HTTPD_SUPPORT_POST */\n  {\n    if (hs->handle == NULL) {\n      err_t parsed = http_parse_request(p, hs, pcb);\n      LWIP_ASSERT(\"http_parse_request: unexpected return value\", parsed == ERR_OK\n        || parsed == ERR_INPROGRESS ||parsed == ERR_ARG || parsed == ERR_USE);\n#if LWIP_HTTPD_SUPPORT_REQUESTLIST\n      if (parsed != ERR_INPROGRESS) {\n        /* request fully parsed or error */\n        if (hs->req != NULL) {\n          pbuf_free(hs->req);\n          hs->req = NULL;\n        }\n      }\n#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n      pbuf_free(p);\n      if (parsed == ERR_OK) {\n#if LWIP_HTTPD_SUPPORT_POST\n       if (hs->post_content_len_left == 0)\n#endif /* LWIP_HTTPD_SUPPORT_POST */\n        {\n          LWIP_DEBUGF(HTTPD_DEBUG | LWIP_DBG_TRACE, (\"http_recv: data %p len %\"S32_F\"\\n\", (const void*)hs->file, hs->left));\n          http_send(pcb, hs);\n        }\n      } else if (parsed == ERR_ARG) {\n        /* @todo: close on ERR_USE? */\n        http_close_conn(pcb, hs);\n      }\n    } else {\n      LWIP_DEBUGF(HTTPD_DEBUG, (\"http_recv: already sending data\\n\"));\n      /* already sending but still receiving data, we might want to RST here? */\n      pbuf_free(p);\n    }\n  }\n  return ERR_OK;\n}\n\n/**\n * A new incoming connection has been accepted.\n */\nstatic err_t\nhttp_accept(void *arg, struct tcp_pcb *pcb, err_t err)\n{\n  struct http_state *hs;\n  LWIP_UNUSED_ARG(err);\n  LWIP_UNUSED_ARG(arg);\n  LWIP_DEBUGF(HTTPD_DEBUG, (\"http_accept %p / %p\\n\", (void*)pcb, arg));\n\n  if ((err != ERR_OK) || (pcb == NULL)) {\n    return ERR_VAL;\n  }\n\n  /* Set priority */\n  tcp_setprio(pcb, HTTPD_TCP_PRIO);\n\n  /* Allocate memory for the structure that holds the state of the\n     connection - initialized by that function. */\n  hs = http_state_alloc();\n  if (hs == NULL) {\n    LWIP_DEBUGF(HTTPD_DEBUG, (\"http_accept: Out of memory, RST\\n\"));\n    return ERR_MEM;\n  }\n  hs->pcb = pcb;\n\n  /* Tell TCP that this is the structure we wish to be passed for our\n     callbacks. */\n  tcp_arg(pcb, hs);\n\n  /* Set up the various callback functions */\n  tcp_recv(pcb, http_recv);\n  tcp_err(pcb, http_err);\n  tcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL);\n  tcp_sent(pcb, http_sent);\n\n  return ERR_OK;\n}\n\n/**\n * @ingroup httpd\n * Initialize the httpd: set up a listening PCB and bind it to the defined port\n */\nvoid\nhttpd_init(void)\n{\n  struct tcp_pcb *pcb;\n  err_t err;\n\n#if HTTPD_USE_MEM_POOL\n  LWIP_MEMPOOL_INIT(HTTPD_STATE);\n#if LWIP_HTTPD_SSI\n  LWIP_MEMPOOL_INIT(HTTPD_SSI_STATE);\n#endif\n#endif\n  LWIP_DEBUGF(HTTPD_DEBUG, (\"httpd_init\\n\"));\n\n  pcb = tcp_new_ip_type(IPADDR_TYPE_ANY);\n  LWIP_ASSERT(\"httpd_init: tcp_new failed\", pcb != NULL);\n  tcp_setprio(pcb, HTTPD_TCP_PRIO);\n  /* set SOF_REUSEADDR here to explicitly bind httpd to multiple interfaces */\n  err = tcp_bind(pcb, IP_ANY_TYPE, HTTPD_SERVER_PORT);\n  LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */\n  LWIP_ASSERT(\"httpd_init: tcp_bind failed\", err == ERR_OK);\n  pcb = tcp_listen(pcb);\n  LWIP_ASSERT(\"httpd_init: tcp_listen failed\", pcb != NULL);\n  tcp_accept(pcb, http_accept);\n}\n\n#if LWIP_HTTPD_SSI\n/**\n * Set the SSI handler function.\n *\n * @param ssi_handler the SSI handler function\n * @param tags an array of SSI tag strings to search for in SSI-enabled files\n * @param num_tags number of tags in the 'tags' array\n */\nvoid\nhttp_set_ssi_handler(tSSIHandler ssi_handler, const char **tags, int num_tags)\n{\n  LWIP_DEBUGF(HTTPD_DEBUG, (\"http_set_ssi_handler\\n\"));\n\n  LWIP_ASSERT(\"no ssi_handler given\", ssi_handler != NULL);\n  g_pfnSSIHandler = ssi_handler;\n\n#if LWIP_HTTPD_SSI_RAW\n  LWIP_UNUSED_ARG(tags);\n  LWIP_UNUSED_ARG(num_tags);\n#else /* LWIP_HTTPD_SSI_RAW */\n  LWIP_ASSERT(\"no tags given\", tags != NULL);\n  LWIP_ASSERT(\"invalid number of tags\", num_tags > 0);\n\n  g_ppcTags = tags;\n  g_iNumTags = num_tags;\n#endif /* !LWIP_HTTPD_SSI_RAW */\n}\n#endif /* LWIP_HTTPD_SSI */\n\n#if LWIP_HTTPD_CGI\n/**\n * Set an array of CGI filenames/handler functions\n *\n * @param cgis an array of CGI filenames/handler functions\n * @param num_handlers number of elements in the 'cgis' array\n */\nvoid\nhttp_set_cgi_handlers(const tCGI *cgis, int num_handlers)\n{\n  LWIP_ASSERT(\"no cgis given\", cgis != NULL);\n  LWIP_ASSERT(\"invalid number of handlers\", num_handlers > 0);\n\n  g_pCGIs = cgis;\n  g_iNumCGIs = num_handlers;\n}\n#endif /* LWIP_HTTPD_CGI */\n\n#endif /* LWIP_TCP && LWIP_CALLBACK_API */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/httpd/httpd_structs.h",
    "content": "#ifndef LWIP_HTTPD_STRUCTS_H\n#define LWIP_HTTPD_STRUCTS_H\n\n#include \"lwip/apps/httpd.h\"\n\n#if LWIP_HTTPD_DYNAMIC_HEADERS\n/** This struct is used for a list of HTTP header strings for various\n * filename extensions. */\ntypedef struct\n{\n  const char *extension;\n  const char *content_type;\n} tHTTPHeader;\n\n/** A list of strings used in HTTP headers (see RFC 1945 HTTP/1.0 and\n * RFC 2616 HTTP/1.1 for header field definitions) */\nstatic const char * const g_psHTTPHeaderStrings[] =\n{\n \"HTTP/1.0 200 OK\\r\\n\",\n \"HTTP/1.0 404 File not found\\r\\n\",\n \"HTTP/1.0 400 Bad Request\\r\\n\",\n \"HTTP/1.0 501 Not Implemented\\r\\n\",\n \"HTTP/1.1 200 OK\\r\\n\",\n \"HTTP/1.1 404 File not found\\r\\n\",\n \"HTTP/1.1 400 Bad Request\\r\\n\",\n \"HTTP/1.1 501 Not Implemented\\r\\n\",\n \"Content-Length: \",\n \"Connection: Close\\r\\n\",\n \"Connection: keep-alive\\r\\n\",\n \"Connection: keep-alive\\r\\nContent-Length: \",\n \"Server: \"HTTPD_SERVER_AGENT\"\\r\\n\",\n \"\\r\\n<html><body><h2>404: The requested file cannot be found.</h2></body></html>\\r\\n\"\n#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE\n ,\"Connection: keep-alive\\r\\nContent-Length: 77\\r\\n\\r\\n<html><body><h2>404: The requested file cannot be found.</h2></body></html>\\r\\n\"\n#endif\n};\n\n/* Indexes into the g_psHTTPHeaderStrings array */\n#define HTTP_HDR_OK             0 /* 200 OK */\n#define HTTP_HDR_NOT_FOUND      1 /* 404 File not found */\n#define HTTP_HDR_BAD_REQUEST    2 /* 400 Bad request */\n#define HTTP_HDR_NOT_IMPL       3 /* 501 Not Implemented */\n#define HTTP_HDR_OK_11          4 /* 200 OK */\n#define HTTP_HDR_NOT_FOUND_11   5 /* 404 File not found */\n#define HTTP_HDR_BAD_REQUEST_11 6 /* 400 Bad request */\n#define HTTP_HDR_NOT_IMPL_11    7 /* 501 Not Implemented */\n#define HTTP_HDR_CONTENT_LENGTH 8 /* Content-Length: (HTTP 1.0)*/\n#define HTTP_HDR_CONN_CLOSE     9 /* Connection: Close (HTTP 1.1) */\n#define HTTP_HDR_CONN_KEEPALIVE 10 /* Connection: keep-alive (HTTP 1.1) */\n#define HTTP_HDR_KEEPALIVE_LEN  11 /* Connection: keep-alive + Content-Length: (HTTP 1.1)*/\n#define HTTP_HDR_SERVER         12 /* Server: HTTPD_SERVER_AGENT */\n#define DEFAULT_404_HTML        13 /* default 404 body */\n#if LWIP_HTTPD_SUPPORT_11_KEEPALIVE\n#define DEFAULT_404_HTML_PERSISTENT 14 /* default 404 body, but including Connection: keep-alive */\n#endif\n\n\n#define HTTP_HDR_HTML           \"Content-type: text/html\\r\\n\\r\\n\"\n#define HTTP_HDR_SSI            \"Content-type: text/html\\r\\nExpires: Fri, 10 Apr 2008 14:00:00 GMT\\r\\nPragma: no-cache\\r\\n\\r\\n\"\n#define HTTP_HDR_GIF            \"Content-type: image/gif\\r\\n\\r\\n\"\n#define HTTP_HDR_PNG            \"Content-type: image/png\\r\\n\\r\\n\"\n#define HTTP_HDR_JPG            \"Content-type: image/jpeg\\r\\n\\r\\n\"\n#define HTTP_HDR_BMP            \"Content-type: image/bmp\\r\\n\\r\\n\"\n#define HTTP_HDR_ICO            \"Content-type: image/x-icon\\r\\n\\r\\n\"\n#define HTTP_HDR_APP            \"Content-type: application/octet-stream\\r\\n\\r\\n\"\n#define HTTP_HDR_JS             \"Content-type: application/javascript\\r\\n\\r\\n\"\n#define HTTP_HDR_RA             \"Content-type: application/javascript\\r\\n\\r\\n\"\n#define HTTP_HDR_CSS            \"Content-type: text/css\\r\\n\\r\\n\"\n#define HTTP_HDR_SWF            \"Content-type: application/x-shockwave-flash\\r\\n\\r\\n\"\n#define HTTP_HDR_XML            \"Content-type: text/xml\\r\\n\\r\\n\"\n#define HTTP_HDR_PDF            \"Content-type: application/pdf\\r\\n\\r\\n\"\n#define HTTP_HDR_JSON           \"Content-type: application/json\\r\\n\\r\\n\"\n\n#define HTTP_HDR_DEFAULT_TYPE   \"Content-type: text/plain\\r\\n\\r\\n\"\n\n/** A list of extension-to-HTTP header strings (see outdated RFC 1700 MEDIA TYPES\n * and http://www.iana.org/assignments/media-types for registered content types\n * and subtypes) */\nstatic const tHTTPHeader g_psHTTPHeaders[] =\n{\n { \"html\", HTTP_HDR_HTML},\n { \"htm\",  HTTP_HDR_HTML},\n { \"shtml\",HTTP_HDR_SSI},\n { \"shtm\", HTTP_HDR_SSI},\n { \"ssi\",  HTTP_HDR_SSI},\n { \"gif\",  HTTP_HDR_GIF},\n { \"png\",  HTTP_HDR_PNG},\n { \"jpg\",  HTTP_HDR_JPG},\n { \"bmp\",  HTTP_HDR_BMP},\n { \"ico\",  HTTP_HDR_ICO},\n { \"class\",HTTP_HDR_APP},\n { \"cls\",  HTTP_HDR_APP},\n { \"js\",   HTTP_HDR_JS},\n { \"ram\",  HTTP_HDR_RA},\n { \"css\",  HTTP_HDR_CSS},\n { \"swf\",  HTTP_HDR_SWF},\n { \"xml\",  HTTP_HDR_XML},\n { \"xsl\",  HTTP_HDR_XML},\n { \"pdf\",  HTTP_HDR_PDF},\n { \"json\", HTTP_HDR_JSON}\n};\n\n#define NUM_HTTP_HEADERS (sizeof(g_psHTTPHeaders) / sizeof(tHTTPHeader))\n\n#endif /* LWIP_HTTPD_DYNAMIC_HEADERS */\n\n#if LWIP_HTTPD_SSI\nstatic const char * const g_pcSSIExtensions[] = {\n  \".shtml\", \".shtm\", \".ssi\", \".xml\"\n};\n#define NUM_SHTML_EXTENSIONS (sizeof(g_pcSSIExtensions) / sizeof(const char *))\n#endif /* LWIP_HTTPD_SSI */\n\n#endif /* LWIP_HTTPD_STRUCTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/httpd/makefsdata/makefsdata",
    "content": "#!/usr/bin/perl\n\nopen(OUTPUT, \"> fsdata.c\");\n\nchdir(\"fs\");\nopen(FILES, \"find . -type f |\");\n\nwhile($file = <FILES>) {\n\n    # Do not include files in CVS directories nor backup files.\n    if($file =~ /(CVS|~)/) {\n    \tnext;\n    }\n    \n    chop($file);\n    \n    open(HEADER, \"> /tmp/header\") || die $!;\n    if($file =~ /404/) {\n\tprint(HEADER \"HTTP/1.0 404 File not found\\r\\n\");\n    } else {\n\tprint(HEADER \"HTTP/1.0 200 OK\\r\\n\");\n    }\n    print(HEADER \"Server: lwIP/pre-0.6 (http://www.sics.se/~adam/lwip/)\\r\\n\");\n    if($file =~ /\\.html$/) {\n\tprint(HEADER \"Content-type: text/html\\r\\n\");\n    } elsif($file =~ /\\.gif$/) {\n\tprint(HEADER \"Content-type: image/gif\\r\\n\");\n    } elsif($file =~ /\\.png$/) {\n\tprint(HEADER \"Content-type: image/png\\r\\n\");\n    } elsif($file =~ /\\.jpg$/) {\n\tprint(HEADER \"Content-type: image/jpeg\\r\\n\");\n    } elsif($file =~ /\\.class$/) {\n\tprint(HEADER \"Content-type: application/octet-stream\\r\\n\");\n    } elsif($file =~ /\\.ram$/) {\n\tprint(HEADER \"Content-type: audio/x-pn-realaudio\\r\\n\");    \n    } else {\n\tprint(HEADER \"Content-type: text/plain\\r\\n\");\n    }\n    print(HEADER \"\\r\\n\");\n    close(HEADER);\n\n    unless($file =~ /\\.plain$/ || $file =~ /cgi/) {\n\tsystem(\"cat /tmp/header $file > /tmp/file\");\n    } else {\n\tsystem(\"cp $file /tmp/file\");\n    }\n    \n    open(FILE, \"/tmp/file\");\n    unlink(\"/tmp/file\");\n    unlink(\"/tmp/header\");\n\n    $file =~ s/\\.//;\n    $fvar = $file;\n    $fvar =~ s-/-_-g;\n    $fvar =~ s-\\.-_-g;\n    print(OUTPUT \"static const unsigned char data\".$fvar.\"[] = {\\n\");\n    print(OUTPUT \"\\t/* $file */\\n\\t\");\n    for($j = 0; $j < length($file); $j++) {\n\tprintf(OUTPUT \"%#02x, \", unpack(\"C\", substr($file, $j, 1)));\n    }\n    printf(OUTPUT \"0,\\n\");\n    \n    \n    $i = 0;\n    while(read(FILE, $data, 1)) {\n        if($i == 0) {\n            print(OUTPUT \"\\t\");\n        }\n        printf(OUTPUT \"%#02x, \", unpack(\"C\", $data));\n        $i++;\n        if($i == 10) {\n            print(OUTPUT \"\\n\");\n            $i = 0;\n        }\n    }\n    print(OUTPUT \"};\\n\\n\");\n    close(FILE);\n    push(@fvars, $fvar);\n    push(@files, $file);\n}\n\nfor($i = 0; $i < @fvars; $i++) {\n    $file = $files[$i];\n    $fvar = $fvars[$i];\n\n    if($i == 0) {\n        $prevfile = \"NULL\";\n    } else {\n        $prevfile = \"file\" . $fvars[$i - 1];\n    }\n    print(OUTPUT \"const struct fsdata_file file\".$fvar.\"[] = {{$prevfile, data$fvar, \");\n    print(OUTPUT \"data$fvar + \". (length($file) + 1) .\", \");\n    print(OUTPUT \"sizeof(data$fvar) - \". (length($file) + 1) .\"}};\\n\\n\");\n}\n\nprint(OUTPUT \"#define FS_ROOT file$fvars[$i - 1]\\n\\n\");\nprint(OUTPUT \"#define FS_NUMFILES $i\\n\");\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/httpd/makefsdata/makefsdata.c",
    "content": "/**\n * makefsdata: Converts a directory structure for use with the lwIP httpd.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Jim Pettinato\n *         Simon Goldschmidt\n *\n * @todo:\n * - take TCP_MSS, LWIP_TCP_TIMESTAMPS and\n *   PAYLOAD_ALIGN_TYPE/PAYLOAD_ALIGNMENT as arguments\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#ifdef WIN32\n#define WIN32_LEAN_AND_MEAN\n#include \"windows.h\"\n#else\n#include <dir.h>\n#endif\n#include <dos.h>\n#include <string.h>\n#include <time.h>\n#include <sys/stat.h>\n\n/** Makefsdata can generate *all* files deflate-compressed (where file size shrinks).\n * Since nearly all browsers support this, this is a good way to reduce ROM size.\n * To compress the files, \"miniz.c\" must be downloaded seperately.\n */\n#ifndef MAKEFS_SUPPORT_DEFLATE\n#define MAKEFS_SUPPORT_DEFLATE 0\n#endif\n\n#define COPY_BUFSIZE (1024*1024) /* 1 MByte */\n\n#if MAKEFS_SUPPORT_DEFLATE\n#include \"../miniz.c\"\n\ntypedef unsigned char uint8;\ntypedef unsigned short uint16;\ntypedef unsigned int uint;\n\n#define my_max(a,b) (((a) > (b)) ? (a) : (b))\n#define my_min(a,b) (((a) < (b)) ? (a) : (b))\n\n/* COMP_OUT_BUF_SIZE is the size of the output buffer used during compression.\n   COMP_OUT_BUF_SIZE must be >= 1 and <= OUT_BUF_SIZE */\n#define COMP_OUT_BUF_SIZE COPY_BUFSIZE\n\n/* OUT_BUF_SIZE is the size of the output buffer used during decompression.\n   OUT_BUF_SIZE must be a power of 2 >= TINFL_LZ_DICT_SIZE (because the low-level decompressor not only writes, but reads from the output buffer as it decompresses) */\n#define OUT_BUF_SIZE COPY_BUFSIZE\nstatic uint8 s_outbuf[OUT_BUF_SIZE];\nstatic uint8 s_checkbuf[OUT_BUF_SIZE];\n\n/* tdefl_compressor contains all the state needed by the low-level compressor so it's a pretty big struct (~300k).\n   This example makes it a global vs. putting it on the stack, of course in real-world usage you'll probably malloc() or new it. */\ntdefl_compressor g_deflator;\ntinfl_decompressor g_inflator;\n\nint deflate_level = 10; /* default compression level, can be changed via command line */\n#define USAGE_ARG_DEFLATE \" [-defl<:compr_level>]\"\n#else /* MAKEFS_SUPPORT_DEFLATE */\n#define USAGE_ARG_DEFLATE \"\"\n#endif /* MAKEFS_SUPPORT_DEFLATE */\n\n/* Compatibility defines Win32 vs. DOS */\n#ifdef WIN32\n\n#define FIND_T                        WIN32_FIND_DATAA\n#define FIND_T_FILENAME(fInfo)        (fInfo.cFileName)\n#define FIND_T_IS_DIR(fInfo)          ((fInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)\n#define FIND_T_IS_FILE(fInfo)         ((fInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)\n#define FIND_RET_T                    HANDLE\n#define FINDFIRST_FILE(path, result)  FindFirstFileA(path, result)\n#define FINDFIRST_DIR(path, result)   FindFirstFileA(path, result)\n#define FINDNEXT(ff_res, result)      FindNextFileA(ff_res, result)\n#define FINDFIRST_SUCCEEDED(ret)      (ret != INVALID_HANDLE_VALUE)\n#define FINDNEXT_SUCCEEDED(ret)       (ret == TRUE)\n\n#define GETCWD(path, len)             GetCurrentDirectoryA(len, path)\n#define CHDIR(path)                   SetCurrentDirectoryA(path)\n#define CHDIR_SUCCEEDED(ret)          (ret == TRUE)\n\n#else\n\n#define FIND_T                        struct ffblk\n#define FIND_T_FILENAME(fInfo)        (fInfo.ff_name)\n#define FIND_T_IS_DIR(fInfo)          ((fInfo.ff_attrib & FA_DIREC) == FA_DIREC)\n#define FIND_T_IS_FILE(fInfo)         (1)\n#define FIND_RET_T                    int\n#define FINDFIRST_FILE(path, result)  findfirst(path, result, FA_ARCH)\n#define FINDFIRST_DIR(path, result)   findfirst(path, result, FA_DIREC)\n#define FINDNEXT(ff_res, result)      FindNextFileA(ff_res, result)\n#define FINDFIRST_SUCCEEDED(ret)      (ret == 0)\n#define FINDNEXT_SUCCEEDED(ret)       (ret == 0)\n\n#define GETCWD(path, len)             getcwd(path, len)\n#define CHDIR(path)                   chdir(path)\n#define CHDIR_SUCCEEDED(ret)          (ret == 0)\n\n#endif\n\n#define NEWLINE     \"\\r\\n\"\n#define NEWLINE_LEN 2\n\n/* define this to get the header variables we use to build HTTP headers */\n#define LWIP_HTTPD_DYNAMIC_HEADERS 1\n#define LWIP_HTTPD_SSI             1\n#include \"lwip/init.h\"\n#include \"../httpd_structs.h\"\n#include \"lwip/apps/fs.h\"\n\n#include \"../core/inet_chksum.c\"\n#include \"../core/def.c\"\n\n/** (Your server name here) */\nconst char *serverID = \"Server: \"HTTPD_SERVER_AGENT\"\\r\\n\";\nchar serverIDBuffer[1024];\n\n/* change this to suit your MEM_ALIGNMENT */\n#define PAYLOAD_ALIGNMENT 4\n/* set this to 0 to prevent aligning payload */\n#define ALIGN_PAYLOAD 1\n/* define this to a type that has the required alignment */\n#define PAYLOAD_ALIGN_TYPE \"unsigned int\"\nstatic int payload_alingment_dummy_counter = 0;\n\n#define HEX_BYTES_PER_LINE 16\n\n#define MAX_PATH_LEN 256\n\nstruct file_entry\n{\n   struct file_entry* next;\n   const char* filename_c;\n};\n\nint process_sub(FILE *data_file, FILE *struct_file);\nint process_file(FILE *data_file, FILE *struct_file, const char *filename);\nint file_write_http_header(FILE *data_file, const char *filename, int file_size, u16_t *http_hdr_len,\n                           u16_t *http_hdr_chksum, u8_t provide_content_len, int is_compressed);\nint file_put_ascii(FILE *file, const char *ascii_string, int len, int *i);\nint s_put_ascii(char *buf, const char *ascii_string, int len, int *i);\nvoid concat_files(const char *file1, const char *file2, const char *targetfile);\nint check_path(char* path, size_t size);\n\n/* 5 bytes per char + 3 bytes per line */\nstatic char file_buffer_c[COPY_BUFSIZE * 5 + ((COPY_BUFSIZE / HEX_BYTES_PER_LINE) * 3)];\n\nchar curSubdir[MAX_PATH_LEN];\nchar lastFileVar[MAX_PATH_LEN];\nchar hdr_buf[4096];\n\nunsigned char processSubs = 1;\nunsigned char includeHttpHeader = 1;\nunsigned char useHttp11 = 0;\nunsigned char supportSsi = 1;\nunsigned char precalcChksum = 0;\nunsigned char includeLastModified = 0;\n#if MAKEFS_SUPPORT_DEFLATE\nunsigned char deflateNonSsiFiles = 0;\nsize_t deflatedBytesReduced = 0;\nsize_t overallDataBytes = 0;\n#endif\n\nstruct file_entry* first_file = NULL;\nstruct file_entry* last_file = NULL;\n\nstatic void print_usage(void)\n{\n  printf(\" Usage: htmlgen [targetdir] [-s] [-e] [-i] [-11] [-nossi] [-c] [-f:<filename>] [-m] [-svr:<name>]\" USAGE_ARG_DEFLATE NEWLINE NEWLINE);\n  printf(\"   targetdir: relative or absolute path to files to convert\" NEWLINE);\n  printf(\"   switch -s: toggle processing of subdirectories (default is on)\" NEWLINE);\n  printf(\"   switch -e: exclude HTTP header from file (header is created at runtime, default is off)\" NEWLINE);\n  printf(\"   switch -11: include HTTP 1.1 header (1.0 is default)\" NEWLINE);\n  printf(\"   switch -nossi: no support for SSI (cannot calculate Content-Length for SSI)\" NEWLINE);\n  printf(\"   switch -c: precalculate checksums for all pages (default is off)\" NEWLINE);\n  printf(\"   switch -f: target filename (default is \\\"fsdata.c\\\")\" NEWLINE);\n  printf(\"   switch -m: include \\\"Last-Modified\\\" header based on file time\" NEWLINE);\n  printf(\"   switch -svr: server identifier sent in HTTP response header ('Server' field)\" NEWLINE);\n#if MAKEFS_SUPPORT_DEFLATE\n  printf(\"   switch -defl: deflate-compress all non-SSI files (with opt. compr.-level, default=10)\" NEWLINE);\n  printf(\"                 ATTENTION: browser has to support \\\"Content-Encoding: deflate\\\"!\" NEWLINE);\n#endif\n  printf(\"   if targetdir not specified, htmlgen will attempt to\" NEWLINE);\n  printf(\"   process files in subdirectory 'fs'\" NEWLINE);\n}\n\nint main(int argc, char *argv[])\n{\n  char path[MAX_PATH_LEN];\n  char appPath[MAX_PATH_LEN];\n  FILE *data_file;\n  FILE *struct_file;\n  int filesProcessed;\n  int i;\n  char targetfile[MAX_PATH_LEN];\n  strcpy(targetfile, \"fsdata.c\");\n\n  memset(path, 0, sizeof(path));\n  memset(appPath, 0, sizeof(appPath));\n\n  printf(NEWLINE \" makefsdata - HTML to C source converter\" NEWLINE);\n  printf(\"     by Jim Pettinato               - circa 2003 \" NEWLINE);\n  printf(\"     extended by Simon Goldschmidt  - 2009 \" NEWLINE NEWLINE);\n\n  strcpy(path, \"fs\");\n  for (i = 1; i < argc; i++) {\n    if (argv[i] == NULL) {\n      continue;\n    }\n    if (argv[i][0] == '-') {\n      if (strstr(argv[i], \"-svr:\") == argv[i]) {\n        snprintf(serverIDBuffer, sizeof(serverIDBuffer), \"Server: %s\\r\\n\", &argv[i][5]);\n        serverID = serverIDBuffer;\n        printf(\"Using Server-ID: \\\"%s\\\"\\n\", serverID);\n      } else if (strstr(argv[i], \"-s\") == argv[i]) {\n        processSubs = 0;\n      } else if (strstr(argv[i], \"-e\") == argv[i]) {\n        includeHttpHeader = 0;\n      } else if (strstr(argv[i], \"-11\") == argv[i]) {\n        useHttp11 = 1;\n      } else if (strstr(argv[i], \"-nossi\") == argv[i]) {\n        supportSsi = 0;\n      } else if (strstr(argv[i], \"-c\") == argv[i]) {\n        precalcChksum = 1;\n      } else if (strstr(argv[i], \"-f:\") == argv[i]) {\n        strncpy(targetfile, &argv[i][3], sizeof(targetfile) - 1);\n        targetfile[sizeof(targetfile) - 1] = 0;\n        printf(\"Writing to file \\\"%s\\\"\\n\", targetfile);\n      } else if (strstr(argv[i], \"-m\") == argv[i]) {\n        includeLastModified = 1;\n      } else if (strstr(argv[i], \"-defl\") == argv[i]) {\n#if MAKEFS_SUPPORT_DEFLATE\n        char* colon = strstr(argv[i], \":\");\n        if (colon) {\n          if (colon[1] != 0) {\n            int defl_level = atoi(&colon[1]);\n            if ((defl_level >= 0) && (defl_level <= 10)) {\n              deflate_level = defl_level;\n            } else {\n              printf(\"ERROR: deflate level must be [0..10]\" NEWLINE);\n              exit(0);\n            }\n          }\n        }\n        deflateNonSsiFiles = 1;\n        printf(\"Deflating all non-SSI files with level %d (but only if size is reduced)\" NEWLINE, deflate_level);\n#else\n        printf(\"WARNING: Deflate support is disabled\\n\");\n#endif\n      } else if ((strstr(argv[i], \"-?\")) || (strstr(argv[i], \"-h\"))) {\n        print_usage();\n        exit(0);\n      }\n    } else if ((argv[i][0] == '/') && (argv[i][1] == '?') && (argv[i][2] == 0)) {\n      print_usage();\n      exit(0);\n    } else {\n      strncpy(path, argv[i], sizeof(path)-1);\n      path[sizeof(path)-1] = 0;\n    }\n  }\n\n  if (!check_path(path, sizeof(path))) {\n    printf(\"Invalid path: \\\"%s\\\".\" NEWLINE, path);\n    exit(-1);\n  }\n\n  GETCWD(appPath, MAX_PATH_LEN);\n  /* if command line param or subdir named 'fs' not found spout usage verbiage */\n  if (!CHDIR_SUCCEEDED(CHDIR(path))) {\n    /* if no subdir named 'fs' (or the one which was given) exists, spout usage verbiage */\n    printf(\" Failed to open directory \\\"%s\\\".\" NEWLINE NEWLINE, path);\n    print_usage();\n    exit(-1);\n  }\n  CHDIR(appPath);\n\n  printf(\"HTTP %sheader will %s statically included.\" NEWLINE,\n    (includeHttpHeader ? (useHttp11 ? \"1.1 \" : \"1.0 \") : \"\"),\n    (includeHttpHeader ? \"be\" : \"not be\"));\n\n  sprintf(curSubdir, \"\");  /* start off in web page's root directory - relative paths */\n  printf(\"  Processing all files in directory %s\", path);\n  if (processSubs) {\n    printf(\" and subdirectories...\" NEWLINE NEWLINE);\n  } else {\n    printf(\"...\" NEWLINE NEWLINE);\n  }\n\n  data_file = fopen(\"fsdata.tmp\", \"wb\");\n  if (data_file == NULL) {\n    printf(\"Failed to create file \\\"fsdata.tmp\\\"\\n\");\n    exit(-1);\n  }\n  struct_file = fopen(\"fshdr.tmp\", \"wb\");\n  if (struct_file == NULL) {\n    printf(\"Failed to create file \\\"fshdr.tmp\\\"\\n\");\n    fclose(data_file);\n    exit(-1);\n  }\n\n  CHDIR(path);\n\n  fprintf(data_file, \"#include \\\"lwip/apps/fs.h\\\"\" NEWLINE);\n  fprintf(data_file, \"#include \\\"lwip/def.h\\\"\" NEWLINE);\n  fprintf(data_file, \"#include \\\"fsdata.h\\\"\" NEWLINE NEWLINE NEWLINE);\n\n  fprintf(data_file, \"#define file_NULL (struct fsdata_file *) NULL\" NEWLINE NEWLINE NEWLINE);\n  /* define FS_FILE_FLAGS_HEADER_INCLUDED to 1 if not defined (compatibility with older httpd/fs) */\n  fprintf(data_file, \"#ifndef FS_FILE_FLAGS_HEADER_INCLUDED\" NEWLINE \"#define FS_FILE_FLAGS_HEADER_INCLUDED 1\" NEWLINE \"#endif\" NEWLINE);\n  /* define FS_FILE_FLAGS_HEADER_PERSISTENT to 0 if not defined (compatibility with older httpd/fs: wasn't supported back then) */\n  fprintf(data_file, \"#ifndef FS_FILE_FLAGS_HEADER_PERSISTENT\" NEWLINE \"#define FS_FILE_FLAGS_HEADER_PERSISTENT 0\" NEWLINE \"#endif\" NEWLINE);\n\n  /* define alignment defines */\n#if ALIGN_PAYLOAD\n  fprintf(data_file, \"/* FSDATA_FILE_ALIGNMENT: 0=off, 1=by variable, 2=by include */\" NEWLINE \"#ifndef FSDATA_FILE_ALIGNMENT\" NEWLINE \"#define FSDATA_FILE_ALIGNMENT 0\" NEWLINE \"#endif\" NEWLINE);\n#endif\n  fprintf(data_file, \"#ifndef FSDATA_ALIGN_PRE\"  NEWLINE \"#define FSDATA_ALIGN_PRE\"  NEWLINE \"#endif\" NEWLINE);\n  fprintf(data_file, \"#ifndef FSDATA_ALIGN_POST\" NEWLINE \"#define FSDATA_ALIGN_POST\" NEWLINE \"#endif\" NEWLINE);\n#if ALIGN_PAYLOAD\n  fprintf(data_file, \"#if FSDATA_FILE_ALIGNMENT==2\" NEWLINE \"#include \\\"fsdata_alignment.h\\\"\" NEWLINE \"#endif\" NEWLINE);\n#endif\n\n  sprintf(lastFileVar, \"NULL\");\n\n  filesProcessed = process_sub(data_file, struct_file);\n\n  /* data_file now contains all of the raw data.. now append linked list of\n   * file header structs to allow embedded app to search for a file name */\n  fprintf(data_file, NEWLINE NEWLINE);\n  fprintf(struct_file, \"#define FS_ROOT file_%s\" NEWLINE, lastFileVar);\n  fprintf(struct_file, \"#define FS_NUMFILES %d\" NEWLINE NEWLINE, filesProcessed);\n\n  fclose(data_file);\n  fclose(struct_file);\n\n  CHDIR(appPath);\n  /* append struct_file to data_file */\n  printf(NEWLINE \"Creating target file...\" NEWLINE NEWLINE);\n  concat_files(\"fsdata.tmp\", \"fshdr.tmp\", targetfile);\n\n  /* if succeeded, delete the temporary files */\n  if (remove(\"fsdata.tmp\") != 0) {\n    printf(\"Warning: failed to delete fsdata.tmp\\n\");\n  }\n  if (remove(\"fshdr.tmp\") != 0) {\n    printf(\"Warning: failed to delete fshdr.tmp\\n\");\n  }\n\n  printf(NEWLINE \"Processed %d files - done.\" NEWLINE, filesProcessed);\n#if MAKEFS_SUPPORT_DEFLATE\n  if (deflateNonSsiFiles) {\n    printf(\"(Deflated total byte reduction: %d bytes -> %d bytes (%.02f%%)\" NEWLINE,\n      (int)overallDataBytes, (int)deflatedBytesReduced, (float)((deflatedBytesReduced*100.0)/overallDataBytes));\n  }\n#endif\n  printf(NEWLINE);\n\n  while (first_file != NULL) {\n     struct file_entry* fe = first_file;\n     first_file = fe->next;\n     free(fe);\n  }\n\n  return 0;\n}\n\nint check_path(char* path, size_t size)\n{\n  size_t slen;\n  if (path[0] == 0) {\n    /* empty */\n    return 0;\n  }\n  slen = strlen(path);\n  if (slen >= size) {\n    /* not NULL-terminated */\n    return 0;\n  }\n  while ((slen > 0) && ((path[slen] == '\\\\') || (path[slen] == '/'))) {\n    /* path should not end with trailing backslash */\n    path[slen] = 0;\n    slen--;\n  }\n  if (slen == 0) {\n    return 0;\n  }\n  return 1;\n}\n\nstatic void copy_file(const char *filename_in, FILE *fout)\n{\n  FILE *fin;\n  size_t len;\n  void* buf;\n  fin = fopen(filename_in, \"rb\");\n  if (fin == NULL) {\n    printf(\"Failed to open file \\\"%s\\\"\\n\", filename_in);\n    exit(-1);\n  }\n  buf = malloc(COPY_BUFSIZE);\n  while ((len = fread(buf, 1, COPY_BUFSIZE, fin)) > 0) {\n    fwrite(buf, 1, len, fout);\n  }\n  free(buf);\n  fclose(fin);\n}\n\nvoid concat_files(const char *file1, const char *file2, const char *targetfile)\n{\n  FILE *fout;\n  fout = fopen(targetfile, \"wb\");\n  if (fout == NULL) {\n    printf(\"Failed to open file \\\"%s\\\"\\n\", targetfile);\n    exit(-1);\n  }\n  copy_file(file1, fout);\n  copy_file(file2, fout);\n  fclose(fout);\n}\n\nint process_sub(FILE *data_file, FILE *struct_file)\n{\n  FIND_T fInfo;\n  FIND_RET_T fret;\n  int filesProcessed = 0;\n\n  if (processSubs) {\n    /* process subs recursively */\n    size_t sublen = strlen(curSubdir);\n    size_t freelen = sizeof(curSubdir) - sublen - 1;\n    LWIP_ASSERT(\"sublen < sizeof(curSubdir)\", sublen < sizeof(curSubdir));\n    fret = FINDFIRST_DIR(\"*\", &fInfo);\n    if (FINDFIRST_SUCCEEDED(fret)) {\n      do {\n        const char *curName = FIND_T_FILENAME(fInfo);\n        if ((curName[0] == '.') || (strcmp(curName, \"CVS\") == 0)) {\n          continue;\n        }\n        if (!FIND_T_IS_DIR(fInfo)) {\n          continue;\n        }\n        if (freelen > 0) {\n           CHDIR(curName);\n           strncat(curSubdir, \"/\", freelen);\n           strncat(curSubdir, curName, freelen - 1);\n           curSubdir[sizeof(curSubdir) - 1] = 0;\n           printf(\"processing subdirectory %s/...\" NEWLINE, curSubdir);\n           filesProcessed += process_sub(data_file, struct_file);\n           CHDIR(\"..\");\n           curSubdir[sublen] = 0;\n        } else {\n           printf(\"WARNING: cannot process sub due to path length restrictions: \\\"%s/%s\\\"\\n\", curSubdir, curName);\n        }\n      } while (FINDNEXT_SUCCEEDED(FINDNEXT(fret, &fInfo)));\n    }\n  }\n\n  fret = FINDFIRST_FILE(\"*.*\", &fInfo);\n  if (FINDFIRST_SUCCEEDED(fret)) {\n    /* at least one file in directory */\n    do {\n      if (FIND_T_IS_FILE(fInfo)) {\n        const char *curName = FIND_T_FILENAME(fInfo);\n        printf(\"processing %s/%s...\" NEWLINE, curSubdir, curName);\n        if (process_file(data_file, struct_file, curName) < 0) {\n          printf(NEWLINE \"Error... aborting\" NEWLINE);\n          return -1;\n        }\n        filesProcessed++;\n      }\n    } while (FINDNEXT_SUCCEEDED(FINDNEXT(fret, &fInfo)));\n  }\n  return filesProcessed;\n}\n\nu8_t* get_file_data(const char* filename, int* file_size, int can_be_compressed, int* is_compressed)\n{\n  FILE *inFile;\n  size_t fsize = 0;\n  u8_t* buf;\n  size_t r;\n  int rs;\n  inFile = fopen(filename, \"rb\");\n  if (inFile == NULL) {\n    printf(\"Failed to open file \\\"%s\\\"\\n\", filename);\n    exit(-1);\n  }\n  fseek(inFile, 0, SEEK_END);\n  rs = ftell(inFile);\n  if (rs < 0) {\n     printf(\"ftell failed with %d\\n\", errno);\n     exit(-1);\n  }\n  fsize = (size_t)rs;\n  fseek(inFile, 0, SEEK_SET);\n  buf = (u8_t*)malloc(fsize);\n  LWIP_ASSERT(\"buf != NULL\", buf != NULL);\n  r = fread(buf, 1, fsize, inFile);\n  *file_size = fsize;\n  *is_compressed = 0;\n#if MAKEFS_SUPPORT_DEFLATE\n  overallDataBytes += fsize;\n  if (deflateNonSsiFiles) {\n    if (can_be_compressed) {\n      if (fsize < OUT_BUF_SIZE) {\n        u8_t* ret_buf;\n        tdefl_status status;\n        size_t in_bytes = fsize;\n        size_t out_bytes = OUT_BUF_SIZE;\n        const void *next_in = buf;\n        void *next_out = s_outbuf;\n        /* create tdefl() compatible flags (we have to compose the low-level flags ourselves, or use tdefl_create_comp_flags_from_zip_params() but that means MINIZ_NO_ZLIB_APIS can't be defined). */\n        mz_uint comp_flags = s_tdefl_num_probes[MZ_MIN(10, deflate_level)] | ((deflate_level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0);\n        if (!deflate_level) {\n          comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS;\n        }\n        status = tdefl_init(&g_deflator, NULL, NULL, comp_flags);\n        if (status != TDEFL_STATUS_OKAY) {\n          printf(\"tdefl_init() failed!\\n\");\n          exit(-1);\n        }\n        memset(s_outbuf, 0, sizeof(s_outbuf));\n        status = tdefl_compress(&g_deflator, next_in, &in_bytes, next_out, &out_bytes, TDEFL_FINISH);\n        if (status != TDEFL_STATUS_DONE) {\n          printf(\"deflate failed: %d\\n\", status);\n          exit(-1);\n        }\n        LWIP_ASSERT(\"out_bytes <= COPY_BUFSIZE\", out_bytes <= OUT_BUF_SIZE);\n        if (out_bytes < fsize) {\n          ret_buf = (u8_t*)malloc(out_bytes);\n          LWIP_ASSERT(\"ret_buf != NULL\", ret_buf != NULL);\n          memcpy(ret_buf, s_outbuf, out_bytes);\n          {\n            /* sanity-check compression be inflating and comparing to the original */\n            tinfl_status dec_status;\n            tinfl_decompressor inflator;\n            size_t dec_in_bytes = out_bytes;\n            size_t dec_out_bytes = OUT_BUF_SIZE;\n            next_out = s_checkbuf;\n\n            tinfl_init(&inflator);\n            memset(s_checkbuf, 0, sizeof(s_checkbuf));\n            dec_status = tinfl_decompress(&inflator, (const mz_uint8 *)ret_buf, &dec_in_bytes, s_checkbuf, (mz_uint8 *)next_out, &dec_out_bytes, 0);\n            LWIP_ASSERT(\"tinfl_decompress failed\", dec_status == TINFL_STATUS_DONE);\n            LWIP_ASSERT(\"tinfl_decompress size mismatch\", fsize == dec_out_bytes);\n            LWIP_ASSERT(\"decompressed memcmp failed\", !memcmp(s_checkbuf, buf, fsize));\n          }\n          /* free original buffer, use compressed data + size */\n          free(buf);\n          buf = ret_buf;\n          *file_size = out_bytes;\n          printf(\" - deflate: %d bytes -> %d bytes (%.02f%%)\" NEWLINE, (int)fsize, (int)out_bytes, (float)((out_bytes*100.0)/fsize));\n          deflatedBytesReduced += (size_t)(fsize - out_bytes);\n          *is_compressed = 1;\n        } else {\n          printf(\" - uncompressed: (would be %d bytes larger using deflate)\" NEWLINE, (int)(out_bytes - fsize));\n        }\n      } else {\n        printf(\" - uncompressed: (file is larger than deflate bufer)\" NEWLINE);\n      }\n    } else {\n      printf(\" - SSI file, cannot be compressed\" NEWLINE);\n    }\n  }\n#else\n  LWIP_UNUSED_ARG(can_be_compressed);\n#endif\n  fclose(inFile);\n  return buf;\n}\n\nvoid process_file_data(FILE* data_file, u8_t* file_data, size_t file_size)\n{\n  size_t written, i, src_off=0;\n\n  size_t off = 0;\n  for (i = 0; i < file_size; i++) {\n    LWIP_ASSERT(\"file_buffer_c overflow\", off < sizeof(file_buffer_c) - 5);\n    sprintf(&file_buffer_c[off], \"0x%02.2x,\", file_data[i]);\n    off += 5;\n    if ((++src_off % HEX_BYTES_PER_LINE) == 0) {\n      LWIP_ASSERT(\"file_buffer_c overflow\", off < sizeof(file_buffer_c) - NEWLINE_LEN);\n      memcpy(&file_buffer_c[off], NEWLINE, NEWLINE_LEN);\n      off += NEWLINE_LEN;\n    }\n    if (off + 20 >= sizeof(file_buffer_c)) {\n      written = fwrite(file_buffer_c, 1, off, data_file);\n      LWIP_ASSERT(\"written == off\", written == off);\n      off = 0;\n    }\n  }\n  written = fwrite(file_buffer_c, 1, off, data_file);\n  LWIP_ASSERT(\"written == off\", written == off);\n}\n\nint write_checksums(FILE *struct_file, const char *varname,\n                    u16_t hdr_len, u16_t hdr_chksum, const u8_t* file_data, size_t file_size)\n{\n  int chunk_size = TCP_MSS;\n  int offset, src_offset;\n  size_t len;\n  int i = 0;\n#if LWIP_TCP_TIMESTAMPS\n  /* when timestamps are used, usable space is 12 bytes less per segment */\n  chunk_size -= 12;\n#endif\n\n  fprintf(struct_file, \"#if HTTPD_PRECALCULATED_CHECKSUM\" NEWLINE);\n  fprintf(struct_file, \"const struct fsdata_chksum chksums_%s[] = {\" NEWLINE, varname);\n\n  if (hdr_len > 0) {\n    /* add checksum for HTTP header */\n    fprintf(struct_file, \"{%d, 0x%04x, %d},\" NEWLINE, 0, hdr_chksum, hdr_len);\n    i++;\n  }\n  src_offset = 0;\n  for (offset = hdr_len; ; offset += len) {\n    unsigned short chksum;\n    void* data = (void*)&file_data[src_offset];\n    len = LWIP_MIN(chunk_size, (int)file_size - src_offset);\n    if (len == 0) {\n      break;\n    }\n    chksum = ~inet_chksum(data, (u16_t)len);\n    /* add checksum for data */\n    fprintf(struct_file, \"{%d, 0x%04x, %d},\" NEWLINE, offset, chksum, len);\n    i++;\n  }\n  fprintf(struct_file, \"};\" NEWLINE);\n  fprintf(struct_file, \"#endif /* HTTPD_PRECALCULATED_CHECKSUM */\" NEWLINE);\n  return i;\n}\n\nstatic int is_valid_char_for_c_var(char x)\n{\n   if (((x >= 'A') && (x <= 'Z')) ||\n       ((x >= 'a') && (x <= 'z')) ||\n       ((x >= '0') && (x <= '9')) ||\n        (x == '_')) {\n      return 1;\n   }\n   return 0;\n}\n\nstatic void fix_filename_for_c(char* qualifiedName, size_t max_len)\n{\n   struct file_entry* f;\n   size_t len = strlen(qualifiedName);\n   char *new_name = (char*)malloc(len + 2);\n   int filename_ok;\n   int cnt = 0;\n   size_t i;\n   if (len + 3 == max_len) {\n      printf(\"File name too long: \\\"%s\\\"\\n\", qualifiedName);\n      exit(-1);\n   }\n   strcpy(new_name, qualifiedName);\n   for (i = 0; i < len; i++) {\n      if (!is_valid_char_for_c_var(new_name[i])) {\n         new_name[i] = '_';\n      }\n   }\n   do {\n      filename_ok = 1;\n      for (f = first_file; f != NULL; f = f->next) {\n         if (!strcmp(f->filename_c, new_name)) {\n            filename_ok = 0;\n            cnt++;\n            /* try next unique file name */\n            sprintf(&new_name[len], \"%d\", cnt);\n            break;\n         }\n      }\n   } while (!filename_ok && (cnt < 999));\n   if (!filename_ok) {\n      printf(\"Failed to get unique file name: \\\"%s\\\"\\n\", qualifiedName);\n      exit(-1);\n   }\n   strcpy(qualifiedName, new_name);\n   free(new_name);\n}\n\nstatic void register_filename(const char* qualifiedName)\n{\n   struct file_entry* fe = (struct file_entry*)malloc(sizeof(struct file_entry));\n   fe->filename_c = strdup(qualifiedName);\n   fe->next = NULL;\n   if (first_file == NULL) {\n      first_file = last_file = fe;\n   } else {\n      last_file->next = fe;\n      last_file = fe;\n   }\n}\n\nint is_ssi_file(const char* filename)\n{\n  size_t loop;\n  for (loop = 0; loop < NUM_SHTML_EXTENSIONS; loop++) {\n    if (strstr(filename, g_pcSSIExtensions[loop])) {\n      return 1;\n    }\n  }\n  return 0;\n}\n\nint process_file(FILE *data_file, FILE *struct_file, const char *filename)\n{\n  char varname[MAX_PATH_LEN];\n  int i = 0;\n  char qualifiedName[MAX_PATH_LEN];\n  int file_size;\n  u16_t http_hdr_chksum = 0;\n  u16_t http_hdr_len = 0;\n  int chksum_count = 0;\n  u8_t flags = 0;\n  const char* flags_str;\n  u8_t has_content_len;\n  u8_t* file_data;\n  int is_compressed = 0;\n\n  /* create qualified name (@todo: prepend slash or not?) */\n  sprintf(qualifiedName,\"%s/%s\", curSubdir, filename);\n  /* create C variable name */\n  strcpy(varname, qualifiedName);\n  /* convert slashes & dots to underscores */\n  fix_filename_for_c(varname, MAX_PATH_LEN);\n  register_filename(varname);\n#if ALIGN_PAYLOAD\n  /* to force even alignment of array, type 1 */\n  fprintf(data_file, \"#if FSDATA_FILE_ALIGNMENT==1\" NEWLINE);\n  fprintf(data_file, \"static const \" PAYLOAD_ALIGN_TYPE \" dummy_align_%s = %d;\" NEWLINE, varname, payload_alingment_dummy_counter++);\n  fprintf(data_file, \"#endif\" NEWLINE);\n#endif /* ALIGN_PAYLOAD */\n  fprintf(data_file, \"static const unsigned char FSDATA_ALIGN_PRE data_%s[] FSDATA_ALIGN_POST = {\" NEWLINE, varname);\n  /* encode source file name (used by file system, not returned to browser) */\n  fprintf(data_file, \"/* %s (%d chars) */\" NEWLINE, qualifiedName, strlen(qualifiedName)+1);\n  file_put_ascii(data_file, qualifiedName, strlen(qualifiedName)+1, &i);\n#if ALIGN_PAYLOAD\n  /* pad to even number of bytes to assure payload is on aligned boundary */\n  while(i % PAYLOAD_ALIGNMENT != 0) {\n    fprintf(data_file, \"0x%02.2x,\", 0);\n    i++;\n  }\n#endif /* ALIGN_PAYLOAD */\n  fprintf(data_file, NEWLINE);\n\n  has_content_len = !is_ssi_file(filename);\n  file_data = get_file_data(filename, &file_size, includeHttpHeader && has_content_len, &is_compressed);\n  if (includeHttpHeader) {\n    file_write_http_header(data_file, filename, file_size, &http_hdr_len, &http_hdr_chksum, has_content_len, is_compressed);\n    flags = FS_FILE_FLAGS_HEADER_INCLUDED;\n    if (has_content_len) {\n      flags |= FS_FILE_FLAGS_HEADER_PERSISTENT;\n    }\n  }\n  if (precalcChksum) {\n    chksum_count = write_checksums(struct_file, varname, http_hdr_len, http_hdr_chksum, file_data, file_size);\n  }\n\n  /* build declaration of struct fsdata_file in temp file */\n  fprintf(struct_file, \"const struct fsdata_file file_%s[] = { {\" NEWLINE, varname);\n  fprintf(struct_file, \"file_%s,\" NEWLINE, lastFileVar);\n  fprintf(struct_file, \"data_%s,\" NEWLINE, varname);\n  fprintf(struct_file, \"data_%s + %d,\" NEWLINE, varname, i);\n  fprintf(struct_file, \"sizeof(data_%s) - %d,\" NEWLINE, varname, i);\n  switch(flags)\n  {\n  case(FS_FILE_FLAGS_HEADER_INCLUDED):\n     flags_str = \"FS_FILE_FLAGS_HEADER_INCLUDED\";\n     break;\n  case(FS_FILE_FLAGS_HEADER_PERSISTENT):\n     flags_str = \"FS_FILE_FLAGS_HEADER_PERSISTENT\";\n     break;\n  case(FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT):\n     flags_str = \"FS_FILE_FLAGS_HEADER_INCLUDED | FS_FILE_FLAGS_HEADER_PERSISTENT\";\n     break;\n  default:\n     flags_str = \"0\";\n     break;\n  }\n  fprintf(struct_file, \"%s,\" NEWLINE, flags_str);\n  if (precalcChksum) {\n    fprintf(struct_file, \"#if HTTPD_PRECALCULATED_CHECKSUM\" NEWLINE);\n    fprintf(struct_file, \"%d, chksums_%s,\" NEWLINE, chksum_count, varname);\n    fprintf(struct_file, \"#endif /* HTTPD_PRECALCULATED_CHECKSUM */\" NEWLINE);\n  }\n  fprintf(struct_file, \"}};\" NEWLINE NEWLINE);\n  strcpy(lastFileVar, varname);\n\n  /* write actual file contents */\n  i = 0;\n  fprintf(data_file, NEWLINE \"/* raw file data (%d bytes) */\" NEWLINE, file_size);\n  process_file_data(data_file, file_data, file_size);\n  fprintf(data_file, \"};\" NEWLINE NEWLINE);\n  free(file_data);\n  return 0;\n}\n\nint file_write_http_header(FILE *data_file, const char *filename, int file_size, u16_t *http_hdr_len,\n                           u16_t *http_hdr_chksum, u8_t provide_content_len, int is_compressed)\n{\n  int i = 0;\n  int response_type = HTTP_HDR_OK;\n  const char* file_type;\n  const char *cur_string;\n  size_t cur_len;\n  int written = 0;\n  size_t hdr_len = 0;\n  u16_t acc;\n  const char *file_ext;\n  int j;\n  u8_t provide_last_modified = includeLastModified;\n\n  memset(hdr_buf, 0, sizeof(hdr_buf));\n\n  if (useHttp11) {\n    response_type = HTTP_HDR_OK_11;\n  }\n\n  fprintf(data_file, NEWLINE \"/* HTTP header */\");\n  if (strstr(filename, \"404\") == filename) {\n    response_type = HTTP_HDR_NOT_FOUND;\n    if (useHttp11) {\n      response_type = HTTP_HDR_NOT_FOUND_11;\n    }\n  } else if (strstr(filename, \"400\") == filename) {\n    response_type = HTTP_HDR_BAD_REQUEST;\n    if (useHttp11) {\n      response_type = HTTP_HDR_BAD_REQUEST_11;\n    }\n  } else if (strstr(filename, \"501\") == filename) {\n    response_type = HTTP_HDR_NOT_IMPL;\n    if (useHttp11) {\n      response_type = HTTP_HDR_NOT_IMPL_11;\n    }\n  }\n  cur_string = g_psHTTPHeaderStrings[response_type];\n  cur_len = strlen(cur_string);\n  fprintf(data_file, NEWLINE \"/* \\\"%s\\\" (%d bytes) */\" NEWLINE, cur_string, cur_len);\n  written += file_put_ascii(data_file, cur_string, cur_len, &i);\n  i = 0;\n  if (precalcChksum) {\n    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);\n    hdr_len += cur_len;\n  }\n\n  cur_string = serverID;\n  cur_len = strlen(cur_string);\n  fprintf(data_file, NEWLINE \"/* \\\"%s\\\" (%d bytes) */\" NEWLINE, cur_string, cur_len);\n  written += file_put_ascii(data_file, cur_string, cur_len, &i);\n  i = 0;\n  if (precalcChksum) {\n    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);\n    hdr_len += cur_len;\n  }\n\n  file_ext = filename;\n  if (file_ext != NULL) {\n    while(strstr(file_ext, \".\") != NULL) {\n      file_ext = strstr(file_ext, \".\");\n      file_ext++;\n    }\n  }\n  if ((file_ext == NULL) || (*file_ext == 0)) {\n    printf(\"failed to get extension for file \\\"%s\\\", using default.\\n\", filename);\n    file_type = HTTP_HDR_DEFAULT_TYPE;\n  } else {\n    file_type = NULL;\n    for (j = 0; j < NUM_HTTP_HEADERS; j++) {\n      if (!strcmp(file_ext, g_psHTTPHeaders[j].extension)) {\n        file_type = g_psHTTPHeaders[j].content_type;\n        break;\n      }\n    }\n    if (file_type == NULL) {\n      printf(\"failed to get file type for extension \\\"%s\\\", using default.\\n\", file_ext);\n      file_type = HTTP_HDR_DEFAULT_TYPE;\n    }\n  }\n\n  /* Content-Length is used for persistent connections in HTTP/1.1 but also for\n     download progress in older versions\n     @todo: just use a big-enough buffer and let the HTTPD send spaces? */\n  if (provide_content_len) {\n    char intbuf[MAX_PATH_LEN];\n    int content_len = file_size;\n    memset(intbuf, 0, sizeof(intbuf));\n    cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONTENT_LENGTH];\n    cur_len = strlen(cur_string);\n    fprintf(data_file, NEWLINE \"/* \\\"%s%d\\r\\n\\\" (%d+ bytes) */\" NEWLINE, cur_string, content_len, cur_len+2);\n    written += file_put_ascii(data_file, cur_string, cur_len, &i);\n    if (precalcChksum) {\n      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);\n      hdr_len += cur_len;\n    }\n\n    _itoa(content_len, intbuf, 10);\n    strcat(intbuf, \"\\r\\n\");\n    cur_len = strlen(intbuf);\n    written += file_put_ascii(data_file, intbuf, cur_len, &i);\n    i = 0;\n    if (precalcChksum) {\n      memcpy(&hdr_buf[hdr_len], intbuf, cur_len);\n      hdr_len += cur_len;\n    }\n  }\n  if (provide_last_modified) {\n    char modbuf[256];\n    struct stat stat_data;\n    struct tm* t;\n    memset(modbuf, 0, sizeof(modbuf));\n    memset(&stat_data, 0, sizeof(stat_data));\n    cur_string = modbuf;\n    strcpy(modbuf, \"Last-Modified: \");\n    if (stat(filename, &stat_data) != 0) {\n       printf(\"stat(%s) failed with error %d\\n\", filename, errno);\n       exit(-1);\n    }\n    t = gmtime(&stat_data.st_mtime);\n    if (t == NULL) {\n       printf(\"gmtime() failed with error %d\\n\", errno);\n       exit(-1);\n    }\n    strftime(&modbuf[15], sizeof(modbuf)-15, \"%a, %d %b %Y %H:%M:%S GMT\", t);\n    cur_len = strlen(cur_string);\n    fprintf(data_file, NEWLINE \"/* \\\"%s\\\"\\r\\n\\\" (%d+ bytes) */\" NEWLINE, cur_string, cur_len+2);\n    written += file_put_ascii(data_file, cur_string, cur_len, &i);\n    if (precalcChksum) {\n      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);\n      hdr_len += cur_len;\n    }\n\n    modbuf[0] = 0;\n    strcat(modbuf, \"\\r\\n\");\n    cur_len = strlen(modbuf);\n    written += file_put_ascii(data_file, modbuf, cur_len, &i);\n    i = 0;\n    if (precalcChksum) {\n      memcpy(&hdr_buf[hdr_len], modbuf, cur_len);\n      hdr_len += cur_len;\n    }\n  }\n\n  /* HTTP/1.1 implements persistent connections */\n  if (useHttp11) {\n    if (provide_content_len) {\n      cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONN_KEEPALIVE];\n    } else {\n      /* no Content-Length available, so a persistent connection is no possible\n         because the client does not know the data length */\n      cur_string = g_psHTTPHeaderStrings[HTTP_HDR_CONN_CLOSE];\n    }\n    cur_len = strlen(cur_string);\n    fprintf(data_file, NEWLINE \"/* \\\"%s\\\" (%d bytes) */\" NEWLINE, cur_string, cur_len);\n    written += file_put_ascii(data_file, cur_string, cur_len, &i);\n    i = 0;\n    if (precalcChksum) {\n      memcpy(&hdr_buf[hdr_len], cur_string, cur_len);\n      hdr_len += cur_len;\n    }\n  }\n\n#if MAKEFS_SUPPORT_DEFLATE\n  if (is_compressed) {\n    /* tell the client about the deflate encoding */\n    LWIP_ASSERT(\"error\", deflateNonSsiFiles);\n    cur_string = \"Content-Encoding: deflate\\r\\n\";\n    cur_len = strlen(cur_string);\n    fprintf(data_file, NEWLINE \"/* \\\"%s\\\" (%d bytes) */\" NEWLINE, cur_string, cur_len);\n    written += file_put_ascii(data_file, cur_string, cur_len, &i);\n    i = 0;\n  }\n#else\n  LWIP_UNUSED_ARG(is_compressed);\n#endif\n\n  /* write content-type, ATTENTION: this includes the double-CRLF! */\n  cur_string = file_type;\n  cur_len = strlen(cur_string);\n  fprintf(data_file, NEWLINE \"/* \\\"%s\\\" (%d bytes) */\" NEWLINE, cur_string, cur_len);\n  written += file_put_ascii(data_file, cur_string, cur_len, &i);\n  i = 0;\n\n  /* ATTENTION: headers are done now (double-CRLF has been written!) */\n\n  if (precalcChksum) {\n    memcpy(&hdr_buf[hdr_len], cur_string, cur_len);\n    hdr_len += cur_len;\n\n    LWIP_ASSERT(\"hdr_len <= 0xffff\", hdr_len <= 0xffff);\n    LWIP_ASSERT(\"strlen(hdr_buf) == hdr_len\", strlen(hdr_buf) == hdr_len);\n    acc = ~inet_chksum(hdr_buf, (u16_t)hdr_len);\n    *http_hdr_len = (u16_t)hdr_len;\n    *http_hdr_chksum = acc;\n  }\n\n  return written;\n}\n\nint file_put_ascii(FILE *file, const char* ascii_string, int len, int *i)\n{\n  int x;\n  for (x = 0; x < len; x++) {\n    unsigned char cur = ascii_string[x];\n    fprintf(file, \"0x%02.2x,\", cur);\n    if ((++(*i) % HEX_BYTES_PER_LINE) == 0) {\n      fprintf(file, NEWLINE);\n    }\n  }\n  return len;\n}\n\nint s_put_ascii(char *buf, const char *ascii_string, int len, int *i)\n{\n  int x;\n  int idx = 0;\n  for (x = 0; x < len; x++) {\n    unsigned char cur = ascii_string[x];\n    sprintf(&buf[idx], \"0x%02.2x,\", cur);\n    idx += 5;\n    if ((++(*i) % HEX_BYTES_PER_LINE) == 0) {\n      sprintf(&buf[idx], NEWLINE);\n      idx += NEWLINE_LEN;\n    }\n  }\n  return len;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/httpd/makefsdata/readme.txt",
    "content": "This directory contains a script ('makefsdata') to create C code suitable for\nhttpd for given html pages (or other files) in a directory.\n\nThere is also a plain C console application doing the same and extended a bit.\n\nUsage: htmlgen [targetdir] [-s] [-i]s\n   targetdir: relative or absolute path to files to convert\n   switch -s: toggle processing of subdirectories (default is on)\n   switch -e: exclude HTTP header from file (header is created at runtime, default is on)\n   switch -11: include HTTP 1.1 header (1.0 is default)\n\n  if targetdir not specified, makefsdata will attempt to\n  process files in subdirectory 'fs'.\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/lwiperf/lwiperf.c",
    "content": "/**\n * @file\n * lwIP iPerf server implementation\n */\n\n/**\n * @defgroup iperf Iperf server\n * @ingroup apps\n *\n * This is a simple performance measuring server to check your bandwith using\n * iPerf2 on a PC as client.\n * It is currently a minimal implementation providing an IPv4 TCP server only.\n *\n * @todo: implement UDP mode and IPv6\n */\n\n/*\n * Copyright (c) 2014 Simon Goldschmidt\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Simon Goldschmidt\n */\n\n#include \"lwip/apps/lwiperf.h\"\n\n#include \"lwip/tcp.h\"\n#include \"lwip/sys.h\"\n\n#include <string.h>\n\n/* Currently, only TCP-over-IPv4 is implemented (does iperf support IPv6 anyway?) */\n#if LWIP_IPV4 && LWIP_TCP && LWIP_CALLBACK_API\n\n/** Specify the idle timeout (in seconds) after that the test fails */\n#ifndef LWIPERF_TCP_MAX_IDLE_SEC\n#define LWIPERF_TCP_MAX_IDLE_SEC    10U\n#endif\n#if LWIPERF_TCP_MAX_IDLE_SEC > 255\n#error LWIPERF_TCP_MAX_IDLE_SEC must fit into an u8_t\n#endif\n\n/* File internal memory allocation (struct lwiperf_*): this defaults to\n   the heap */\n#ifndef LWIPERF_ALLOC\n#define LWIPERF_ALLOC(type)         mem_malloc(sizeof(type))\n#define LWIPERF_FREE(type, item)    mem_free(item)\n#endif\n\n/** If this is 1, check that received data has the correct format */\n#ifndef LWIPERF_CHECK_RX_DATA\n#define LWIPERF_CHECK_RX_DATA       0\n#endif\n\n/** This is the Iperf settings struct sent from the client */\ntypedef struct _lwiperf_settings {\n#define LWIPERF_FLAGS_ANSWER_TEST 0x80000000\n#define LWIPERF_FLAGS_ANSWER_NOW  0x00000001\n  u32_t flags;\n  u32_t num_threads; /* unused for now */\n  u32_t remote_port;\n  u32_t buffer_len; /* unused for now */\n  u32_t win_band; /* TCP window / UDP rate: unused for now */\n  u32_t amount; /* pos. value: bytes?; neg. values: time (unit is 10ms: 1/100 second) */\n} lwiperf_settings_t;\n\n/** Basic connection handle */\nstruct _lwiperf_state_base;\ntypedef struct _lwiperf_state_base lwiperf_state_base_t;\nstruct _lwiperf_state_base {\n  /* 1=tcp, 0=udp */\n  u8_t tcp;\n  /* 1=server, 0=client */\n  u8_t server;\n  lwiperf_state_base_t* next;\n  lwiperf_state_base_t* related_server_state;\n};\n\n/** Connection handle for a TCP iperf session */\ntypedef struct _lwiperf_state_tcp {\n  lwiperf_state_base_t base;\n  struct tcp_pcb* server_pcb;\n  struct tcp_pcb* conn_pcb;\n  u32_t time_started;\n  lwiperf_report_fn report_fn;\n  void* report_arg;\n  u8_t poll_count;\n  u8_t next_num;\n  u32_t bytes_transferred;\n  lwiperf_settings_t settings;\n  u8_t have_settings_buf;\n} lwiperf_state_tcp_t;\n\n/** List of active iperf sessions */\nstatic lwiperf_state_base_t* lwiperf_all_connections;\n/** A const buffer to send from: we want to measure sending, not copying! */\nstatic const u8_t lwiperf_txbuf_const[1600] = {\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n  '0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9','0','1','2','3','4','5','6','7','8','9',\n};\n\nstatic err_t lwiperf_tcp_poll(void *arg, struct tcp_pcb *tpcb);\nstatic void lwiperf_tcp_err(void *arg, err_t err);\n\n/** Add an iperf session to the 'active' list */\nstatic void\nlwiperf_list_add(lwiperf_state_base_t* item)\n{\n  if (lwiperf_all_connections == NULL) {\n    lwiperf_all_connections = item;\n  } else {\n    item = lwiperf_all_connections;\n  }\n}\n\n/** Remove an iperf session from the 'active' list */\nstatic void\nlwiperf_list_remove(lwiperf_state_base_t* item)\n{\n  lwiperf_state_base_t* prev = NULL;\n  lwiperf_state_base_t* iter;\n  for (iter = lwiperf_all_connections; iter != NULL; prev = iter, iter = iter->next) {\n    if (iter == item) {\n      if (prev == NULL) {\n        lwiperf_all_connections = iter->next;\n      } else {\n        prev->next = item;\n      }\n      /* @debug: ensure this item is listed only once */\n      for (iter = iter->next; iter != NULL; iter = iter->next) {\n        LWIP_ASSERT(\"duplicate entry\", iter != item);\n      }\n      break;\n    }\n  }\n}\n\n/** Call the report function of an iperf tcp session */\nstatic void\nlwip_tcp_conn_report(lwiperf_state_tcp_t* conn, enum lwiperf_report_type report_type)\n{\n  if ((conn != NULL) && (conn->report_fn != NULL)) {\n    u32_t now, duration_ms, bandwidth_kbitpsec;\n    now = sys_now();\n    duration_ms = now - conn->time_started;\n    if (duration_ms == 0) {\n      bandwidth_kbitpsec = 0;\n    } else {\n      bandwidth_kbitpsec = (conn->bytes_transferred / duration_ms) * 8U;\n    }\n    conn->report_fn(conn->report_arg, report_type,\n      &conn->conn_pcb->local_ip, conn->conn_pcb->local_port,\n      &conn->conn_pcb->remote_ip, conn->conn_pcb->remote_port,\n      conn->bytes_transferred, duration_ms, bandwidth_kbitpsec);\n  }\n}\n\n/** Close an iperf tcp session */\nstatic void\nlwiperf_tcp_close(lwiperf_state_tcp_t* conn, enum lwiperf_report_type report_type)\n{\n  err_t err;\n\n  lwip_tcp_conn_report(conn, report_type);\n  lwiperf_list_remove(&conn->base);\n  if (conn->conn_pcb != NULL) {\n    tcp_arg(conn->conn_pcb, NULL);\n    tcp_poll(conn->conn_pcb, NULL, 0);\n    tcp_sent(conn->conn_pcb, NULL);\n    tcp_recv(conn->conn_pcb, NULL);\n    tcp_err(conn->conn_pcb, NULL);\n    err = tcp_close(conn->conn_pcb);\n    if (err != ERR_OK) {\n      /* don't want to wait for free memory here... */\n      tcp_abort(conn->conn_pcb);\n    }\n  } else {\n    /* no conn pcb, this is the server pcb */\n    err = tcp_close(conn->server_pcb);\n    LWIP_ASSERT(\"error\", err != ERR_OK);\n  }\n  LWIPERF_FREE(lwiperf_state_tcp_t, conn);\n}\n\n/** Try to send more data on an iperf tcp session */\nstatic err_t\nlwiperf_tcp_client_send_more(lwiperf_state_tcp_t* conn)\n{\n  int send_more;\n  err_t err;\n  u16_t txlen;\n  u16_t txlen_max;\n  void* txptr;\n  u8_t apiflags;\n\n  LWIP_ASSERT(\"conn invalid\", (conn != NULL) && conn->base.tcp && (conn->base.server == 0));\n\n  do {\n    send_more = 0;\n    if (conn->settings.amount & PP_HTONL(0x80000000)) {\n      /* this session is time-limited */\n      u32_t now = sys_now();\n      u32_t diff_ms = now - conn->time_started;\n      u32_t time = (u32_t)-(s32_t)lwip_htonl(conn->settings.amount);\n      u32_t time_ms = time * 10;\n      if (diff_ms >= time_ms) {\n        /* time specified by the client is over -> close the connection */\n        lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_CLIENT);\n        return ERR_OK;\n      }\n    } else {\n      /* this session is byte-limited */\n      u32_t amount_bytes = lwip_htonl(conn->settings.amount);\n      /* @todo: this can send up to 1*MSS more than requested... */\n      if (amount_bytes >= conn->bytes_transferred) {\n        /* all requested bytes transferred -> close the connection */\n        lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_CLIENT);\n        return ERR_OK;\n      }\n    }\n\n    if (conn->bytes_transferred < 24) {\n      /* transmit the settings a first time */\n      txptr = &((u8_t*)&conn->settings)[conn->bytes_transferred];\n      txlen_max = (u16_t)(24 - conn->bytes_transferred);\n      apiflags = TCP_WRITE_FLAG_COPY;\n    } else if (conn->bytes_transferred < 48) {\n      /* transmit the settings a second time */\n      txptr = &((u8_t*)&conn->settings)[conn->bytes_transferred - 24];\n      txlen_max = (u16_t)(48 - conn->bytes_transferred);\n      apiflags = TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE;\n      send_more = 1;\n    } else {\n      /* transmit data */\n      /* @todo: every x bytes, transmit the settings again */\n      txptr = LWIP_CONST_CAST(void*, &lwiperf_txbuf_const[conn->bytes_transferred % 10]);\n      txlen_max = TCP_MSS;\n      if (conn->bytes_transferred == 48) { /* @todo: fix this for intermediate settings, too */\n        txlen_max = TCP_MSS - 24;\n      }\n      apiflags = 0; /* no copying needed */\n      send_more = 1;\n    }\n    txlen = txlen_max;\n    do {\n      err = tcp_write(conn->conn_pcb, txptr, txlen, apiflags);\n      if (err ==  ERR_MEM) {\n        txlen /= 2;\n      }\n    } while ((err == ERR_MEM) && (txlen >= (TCP_MSS/2)));\n\n    if (err == ERR_OK) {\n      conn->bytes_transferred += txlen;\n    } else {\n      send_more = 0;\n    }\n  } while(send_more);\n\n  tcp_output(conn->conn_pcb);\n  return ERR_OK;\n}\n\n/** TCP sent callback, try to send more data */\nstatic err_t\nlwiperf_tcp_client_sent(void *arg, struct tcp_pcb *tpcb, u16_t len)\n{\n  lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;\n  /* @todo: check 'len' (e.g. to time ACK of all data)? for now, we just send more... */\n  LWIP_ASSERT(\"invalid conn\", conn->conn_pcb == tpcb);\n  LWIP_UNUSED_ARG(tpcb);\n  LWIP_UNUSED_ARG(len);\n\n  conn->poll_count = 0;\n\n  return lwiperf_tcp_client_send_more(conn);\n}\n\n/** TCP connected callback (active connection), send data now */\nstatic err_t\nlwiperf_tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)\n{\n  lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;\n  LWIP_ASSERT(\"invalid conn\", conn->conn_pcb == tpcb);\n  LWIP_UNUSED_ARG(tpcb);\n  if (err != ERR_OK) {\n    lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE);\n    return ERR_OK;\n  }\n  conn->poll_count = 0;\n  conn->time_started = sys_now();\n  return lwiperf_tcp_client_send_more(conn);\n}\n\n/** Start TCP connection back to the client (either parallel or after the\n * receive test has finished.\n */\nstatic err_t\nlwiperf_tx_start(lwiperf_state_tcp_t* conn)\n{\n  err_t err;\n  lwiperf_state_tcp_t* client_conn;\n  struct tcp_pcb* newpcb;\n  ip_addr_t remote_addr;\n  u16_t remote_port;\n\n  client_conn = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t);\n  if (client_conn == NULL) {\n    return ERR_MEM;\n  }\n  newpcb = tcp_new();\n  if (newpcb == NULL) {\n    LWIPERF_FREE(lwiperf_state_tcp_t, client_conn);\n    return ERR_MEM;\n  }\n\n  MEMCPY(client_conn, conn, sizeof(lwiperf_state_tcp_t));\n  client_conn->base.server = 0;\n  client_conn->server_pcb = NULL;\n  client_conn->conn_pcb = newpcb;\n  client_conn->time_started = sys_now(); /* @todo: set this again on 'connected' */\n  client_conn->poll_count = 0;\n  client_conn->next_num = 4; /* initial nr is '4' since the header has 24 byte */\n  client_conn->bytes_transferred = 0;\n  client_conn->settings.flags = 0; /* prevent the remote side starting back as client again */\n\n  tcp_arg(newpcb, client_conn);\n  tcp_sent(newpcb, lwiperf_tcp_client_sent);\n  tcp_poll(newpcb, lwiperf_tcp_poll, 2U);\n  tcp_err(newpcb, lwiperf_tcp_err);\n\n  ip_addr_copy(remote_addr, conn->conn_pcb->remote_ip);\n  remote_port = (u16_t)lwip_htonl(client_conn->settings.remote_port);\n\n  err = tcp_connect(newpcb, &remote_addr, remote_port, lwiperf_tcp_client_connected);\n  if (err != ERR_OK) {\n    lwiperf_tcp_close(client_conn, LWIPERF_TCP_ABORTED_LOCAL);\n    return err;\n  }\n  lwiperf_list_add(&client_conn->base);\n  return ERR_OK;\n}\n\n/** Receive data on an iperf tcp session */\nstatic err_t\nlwiperf_tcp_recv(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err)\n{\n  u8_t tmp;\n  u16_t tot_len;\n  u32_t packet_idx;\n  struct pbuf* q;\n  lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;\n\n  LWIP_ASSERT(\"pcb mismatch\", conn->conn_pcb == tpcb);\n  LWIP_UNUSED_ARG(tpcb);\n\n  if (err != ERR_OK) {\n    lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE);\n    return ERR_OK;\n  }\n  if (p == NULL) {\n    /* connection closed -> test done */\n    if ((conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) ==\n        PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST)) {\n      /* client requested transmission after end of test */\n      lwiperf_tx_start(conn);\n    }\n    lwiperf_tcp_close(conn, LWIPERF_TCP_DONE_SERVER);\n    return ERR_OK;\n  }\n  tot_len = p->tot_len;\n\n  conn->poll_count = 0;\n\n  if ((!conn->have_settings_buf) || ((conn->bytes_transferred -24) % (1024*128) == 0)) {\n    /* wait for 24-byte header */\n    if (p->tot_len < sizeof(lwiperf_settings_t)) {\n      lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);\n      pbuf_free(p);\n      return ERR_VAL;\n    }\n    if (!conn->have_settings_buf) {\n      if (pbuf_copy_partial(p, &conn->settings, sizeof(lwiperf_settings_t), 0) != sizeof(lwiperf_settings_t)) {\n        lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL);\n        pbuf_free(p);\n        return ERR_VAL;\n      }\n      conn->have_settings_buf = 1;\n      if ((conn->settings.flags & PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) ==\n        PP_HTONL(LWIPERF_FLAGS_ANSWER_TEST|LWIPERF_FLAGS_ANSWER_NOW)) {\n          /* client requested parallel transmission test */\n          err_t err2 = lwiperf_tx_start(conn);\n          if (err2 != ERR_OK) {\n            lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_TXERROR);\n            pbuf_free(p);\n            return err2;\n          }\n      }\n    } else {\n      if (pbuf_memcmp(p, 0, &conn->settings, sizeof(lwiperf_settings_t)) != 0) {\n        lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);\n        pbuf_free(p);\n        return ERR_VAL;\n      }\n    }\n    conn->bytes_transferred += sizeof(lwiperf_settings_t);\n    if (conn->bytes_transferred <= 24) {\n      conn->time_started = sys_now();\n      tcp_recved(tpcb, p->tot_len);\n      pbuf_free(p);\n      return ERR_OK;\n    }\n    conn->next_num = 4; /* 24 bytes received... */\n    tmp = pbuf_header(p, -24);\n    LWIP_ASSERT(\"pbuf_header failed\", tmp == 0);\n  }\n\n  packet_idx = 0;\n  for (q = p; q != NULL; q = q->next) {\n#if LWIPERF_CHECK_RX_DATA\n    const u8_t* payload = (const u8_t*)q->payload;\n    u16_t i;\n    for (i = 0; i < q->len; i++) {\n      u8_t val = payload[i];\n      u8_t num = val - '0';\n      if (num == conn->next_num) {\n        conn->next_num++;\n        if (conn->next_num == 10) {\n          conn->next_num = 0;\n        }\n      } else {\n        lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL_DATAERROR);\n        pbuf_free(p);\n        return ERR_VAL;\n      }\n    }\n#endif\n    packet_idx += q->len;\n  }\n  LWIP_ASSERT(\"count mismatch\", packet_idx == p->tot_len);\n  conn->bytes_transferred += packet_idx;\n  tcp_recved(tpcb, tot_len);\n  pbuf_free(p);\n  return ERR_OK;\n}\n\n/** Error callback, iperf tcp session aborted */\nstatic void\nlwiperf_tcp_err(void *arg, err_t err)\n{\n  lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;\n  LWIP_UNUSED_ARG(err);\n  lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_REMOTE);\n}\n\n/** TCP poll callback, try to send more data */\nstatic err_t\nlwiperf_tcp_poll(void *arg, struct tcp_pcb *tpcb)\n{\n  lwiperf_state_tcp_t* conn = (lwiperf_state_tcp_t*)arg;\n  LWIP_ASSERT(\"pcb mismatch\", conn->conn_pcb == tpcb);\n  LWIP_UNUSED_ARG(tpcb);\n  if (++conn->poll_count >= LWIPERF_TCP_MAX_IDLE_SEC) {\n    lwiperf_tcp_close(conn, LWIPERF_TCP_ABORTED_LOCAL);\n    return ERR_OK; /* lwiperf_tcp_close frees conn */\n  }\n\n  if (!conn->base.server) {\n    lwiperf_tcp_client_send_more(conn);\n  }\n\n  return ERR_OK;\n}\n\n/** This is called when a new client connects for an iperf tcp session */\nstatic err_t\nlwiperf_tcp_accept(void *arg, struct tcp_pcb *newpcb, err_t err)\n{\n  lwiperf_state_tcp_t *s, *conn;\n  if ((err != ERR_OK) || (newpcb == NULL) || (arg == NULL)) {\n    return ERR_VAL;\n  }\n\n  s = (lwiperf_state_tcp_t*)arg;\n  conn = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t);\n  if (conn == NULL) {\n    return ERR_MEM;\n  }\n  memset(conn, 0, sizeof(lwiperf_state_tcp_t));\n  conn->base.tcp = 1;\n  conn->base.server = 1;\n  conn->base.related_server_state = &s->base;\n  conn->server_pcb = s->server_pcb;\n  conn->conn_pcb = newpcb;\n  conn->time_started = sys_now();\n  conn->report_fn = s->report_fn;\n  conn->report_arg = s->report_arg;\n\n  /* setup the tcp rx connection */\n  tcp_arg(newpcb, conn);\n  tcp_recv(newpcb, lwiperf_tcp_recv);\n  tcp_poll(newpcb, lwiperf_tcp_poll, 2U);\n  tcp_err(conn->conn_pcb, lwiperf_tcp_err);\n\n  lwiperf_list_add(&conn->base);\n  return ERR_OK;\n}\n\n/** \n * @ingroup iperf\n * Start a TCP iperf server on the default TCP port (5001) and listen for\n * incoming connections from iperf clients.\n *\n * @returns a connection handle that can be used to abort the server\n *          by calling @ref lwiperf_abort()\n */\nvoid*\nlwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void* report_arg)\n{\n  return lwiperf_start_tcp_server(IP_ADDR_ANY, LWIPERF_TCP_PORT_DEFAULT,\n    report_fn, report_arg);\n}\n\n/**\n * @ingroup iperf\n * Start a TCP iperf server on a specific IP address and port and listen for\n * incoming connections from iperf clients.\n *\n * @returns a connection handle that can be used to abort the server\n *          by calling @ref lwiperf_abort()\n */\nvoid*\nlwiperf_start_tcp_server(const ip_addr_t* local_addr, u16_t local_port,\n  lwiperf_report_fn report_fn, void* report_arg)\n{\n  err_t err;\n  struct tcp_pcb* pcb;\n  lwiperf_state_tcp_t* s;\n\n  if (local_addr == NULL) {\n    return NULL;\n  }\n\n  s = (lwiperf_state_tcp_t*)LWIPERF_ALLOC(lwiperf_state_tcp_t);\n  if (s == NULL) {\n    return NULL;\n  }\n  memset(s, 0, sizeof(lwiperf_state_tcp_t));\n  s->base.tcp = 1;\n  s->base.server = 1;\n  s->report_fn = report_fn;\n  s->report_arg = report_arg;\n\n  pcb = tcp_new();\n  if (pcb != NULL) {\n    err = tcp_bind(pcb, local_addr, local_port);\n    if (err == ERR_OK) {\n      s->server_pcb = tcp_listen_with_backlog(pcb, 1);\n    }\n  }\n  if (s->server_pcb == NULL) {\n    if (pcb != NULL) {\n      tcp_close(pcb);\n    }\n    LWIPERF_FREE(lwiperf_state_tcp_t, s);\n    return NULL;\n  }\n  pcb = NULL;\n\n  tcp_arg(s->server_pcb, s);\n  tcp_accept(s->server_pcb, lwiperf_tcp_accept);\n\n  lwiperf_list_add(&s->base);\n  return s;\n}\n\n/**\n * @ingroup iperf\n * Abort an iperf session (handle returned by lwiperf_start_tcp_server*())\n */\nvoid\nlwiperf_abort(void* lwiperf_session)\n{\n  lwiperf_state_base_t* i, *dealloc, *last = NULL;\n\n  for (i = lwiperf_all_connections; i != NULL; ) {\n    if ((i == lwiperf_session) || (i->related_server_state == lwiperf_session)) {\n      dealloc = i;\n      i = i->next;\n      if (last != NULL) {\n        last->next = i;\n      }\n      LWIPERF_FREE(lwiperf_state_tcp_t, dealloc); /* @todo: type? */\n    } else {\n      last = i;\n      i = i->next;\n    }\n  }\n}\n\n#endif /* LWIP_IPV4 && LWIP_TCP && LWIP_CALLBACK_API */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/mdns/mdns.c",
    "content": "/**\n * @file\n * MDNS responder implementation\n *\n * @defgroup mdns MDNS\n * @ingroup apps\n *\n * RFC 6762 - Multicast DNS\\n\n * RFC 6763 - DNS-Based Service Discovery\\n\n * \n * @verbinclude mdns.txt\n * \n * Things left to implement:\n * -------------------------\n *\n * - Probing/conflict resolution\n * - Sending goodbye messages (zero ttl) - shutdown, DHCP lease about to expire, DHCP turned off...\n * - Checking that source address of unicast requests are on the same network\n * - Limiting multicast responses to 1 per second per resource record\n * - Fragmenting replies if required\n * - Subscribe to netif address/link change events and act on them (currently needs to be done manually)\n * - Handling multi-packet known answers\n * - Individual known answer detection for all local IPv6 addresses\n * - Dynamic size of outgoing packet\n */\n\n/*\n * Copyright (c) 2015 Verisure Innovation AB\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Erik Ekman <erik@kryo.se>\n *\n */\n\n#include \"lwip/apps/mdns.h\"\n#include \"lwip/apps/mdns_priv.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/prot/dns.h\"\n\n#include <string.h>\n\n#if LWIP_MDNS_RESPONDER\n\n#if (LWIP_IPV4 && !LWIP_IGMP)\n  #error \"If you want to use MDNS with IPv4, you have to define LWIP_IGMP=1 in your lwipopts.h\"\n#endif\n#if (LWIP_IPV6 && !LWIP_IPV6_MLD)\n#error \"If you want to use MDNS with IPv6, you have to define LWIP_IPV6_MLD=1 in your lwipopts.h\"\n#endif\n#if (!LWIP_UDP)\n  #error \"If you want to use MDNS, you have to define LWIP_UDP=1 in your lwipopts.h\"\n#endif\n\n#if LWIP_IPV4\n#include \"lwip/igmp.h\"\n/* IPv4 multicast group 224.0.0.251 */\nstatic const ip_addr_t v4group = DNS_MQUERY_IPV4_GROUP_INIT;\n#endif\n\n#if LWIP_IPV6\n#include \"lwip/mld6.h\"\n/* IPv6 multicast group FF02::FB */\nstatic const ip_addr_t v6group = DNS_MQUERY_IPV6_GROUP_INIT;\n#endif\n\n#define MDNS_PORT 5353\n#define MDNS_TTL  255\n\n/* Stored offsets to beginning of domain names\n * Used for compression.\n */\n#define NUM_DOMAIN_OFFSETS 10\n#define DOMAIN_JUMP_SIZE 2\n#define DOMAIN_JUMP 0xc000\n\nstatic u8_t mdns_netif_client_id;\nstatic struct udp_pcb *mdns_pcb;\n\n#define NETIF_TO_HOST(netif) (struct mdns_host*)(netif_get_client_data(netif, mdns_netif_client_id))\n\n#define TOPDOMAIN_LOCAL \"local\"\n\n#define REVERSE_PTR_TOPDOMAIN \"arpa\"\n#define REVERSE_PTR_V4_DOMAIN \"in-addr\"\n#define REVERSE_PTR_V6_DOMAIN \"ip6\"\n\n#define SRV_PRIORITY 0\n#define SRV_WEIGHT   0\n\n/* Payload size allocated for each outgoing UDP packet */\n#define OUTPACKET_SIZE 500\n\n/* Lookup from hostname -> IPv4 */\n#define REPLY_HOST_A            0x01\n/* Lookup from IPv4/v6 -> hostname */\n#define REPLY_HOST_PTR_V4       0x02\n/* Lookup from hostname -> IPv6 */\n#define REPLY_HOST_AAAA         0x04\n/* Lookup from hostname -> IPv6 */\n#define REPLY_HOST_PTR_V6       0x08\n\n/* Lookup for service types */\n#define REPLY_SERVICE_TYPE_PTR  0x10\n/* Lookup for instances of service */\n#define REPLY_SERVICE_NAME_PTR  0x20\n/* Lookup for location of service instance */\n#define REPLY_SERVICE_SRV       0x40\n/* Lookup for text info on service instance */\n#define REPLY_SERVICE_TXT       0x80\n\nstatic const char *dnssd_protos[] = {\n    \"_udp\", /* DNSSD_PROTO_UDP */\n    \"_tcp\", /* DNSSD_PROTO_TCP */\n};\n\n/** Description of a service */\nstruct mdns_service {\n  /** TXT record to answer with */\n  struct mdns_domain txtdata;\n  /** Name of service, like 'myweb' */\n  char name[MDNS_LABEL_MAXLEN + 1];\n  /** Type of service, like '_http' */\n  char service[MDNS_LABEL_MAXLEN + 1];\n  /** Callback function and userdata\n   * to update txtdata buffer */\n  service_get_txt_fn_t txt_fn;\n  void *txt_userdata;\n  /** TTL in seconds of SRV/TXT replies */\n  u32_t dns_ttl;\n  /** Protocol, TCP or UDP */\n  u16_t proto;\n  /** Port of the service */\n  u16_t port;\n};\n\n/** Description of a host/netif */\nstruct mdns_host {\n  /** Hostname */\n  char name[MDNS_LABEL_MAXLEN + 1];\n  /** Pointer to services */\n  struct mdns_service *services[MDNS_MAX_SERVICES];\n  /** TTL in seconds of A/AAAA/PTR replies */\n  u32_t dns_ttl;\n};\n\n/** Information about received packet */\nstruct mdns_packet {\n  /** Sender IP/port */\n  ip_addr_t source_addr;\n  u16_t source_port;\n  /** If packet was received unicast */\n  u16_t recv_unicast;\n  /** Netif that received the packet */\n  struct netif *netif;\n  /** Packet data */\n  struct pbuf *pbuf;\n  /** Current parsing offset in packet */\n  u16_t parse_offset;\n  /** Identifier. Used in legacy queries */\n  u16_t tx_id;\n  /** Number of questions in packet,\n   *  read from packet header */\n  u16_t questions;\n  /** Number of unparsed questions */\n  u16_t questions_left;\n  /** Number of answers in packet,\n   *  (sum of normal, authorative and additional answers)\n   *  read from packet header */\n  u16_t answers;\n  /** Number of unparsed answers */\n  u16_t answers_left;\n};\n\n/** Information about outgoing packet */\nstruct mdns_outpacket {\n  /** Netif to send the packet on */\n  struct netif *netif;\n  /** Packet data */\n  struct pbuf *pbuf;\n  /** Current write offset in packet */\n  u16_t write_offset;\n  /** Identifier. Used in legacy queries */\n  u16_t tx_id;\n  /** Destination IP/port if sent unicast */\n  ip_addr_t dest_addr;\n  u16_t dest_port;\n  /** Number of questions written */\n  u16_t questions;\n  /** Number of normal answers written */\n  u16_t answers;\n  /** Number of additional answers written */\n  u16_t additional;\n  /** Offsets for written domain names in packet.\n   *  Used for compression */\n  u16_t domain_offsets[NUM_DOMAIN_OFFSETS];\n  /** If all answers in packet should set cache_flush bit */\n  u8_t cache_flush;\n  /** If reply should be sent unicast */\n  u8_t unicast_reply;\n  /** If legacy query. (tx_id needed, and write\n   *  question again in reply before answer) */\n  u8_t legacy_query;\n  /* Reply bitmask for host information */\n  u8_t host_replies;\n  /* Bitmask for which reverse IPv6 hosts to answer */\n  u8_t host_reverse_v6_replies;\n  /* Reply bitmask per service */\n  u8_t serv_replies[MDNS_MAX_SERVICES];\n};\n\n/** Domain, type and class.\n *  Shared between questions and answers */\nstruct mdns_rr_info {\n  struct mdns_domain domain;\n  u16_t type;\n  u16_t klass;\n};\n\nstruct mdns_question {\n  struct mdns_rr_info info;\n  /** unicast reply requested */\n  u16_t unicast;\n};\n\nstruct mdns_answer {\n  struct mdns_rr_info info;\n  /** cache flush command bit */\n  u16_t cache_flush;\n  /* Validity time in seconds */\n  u32_t ttl;\n  /** Length of variable answer */\n  u16_t rd_length;\n  /** Offset of start of variable answer in packet */\n  u16_t rd_offset;\n};\n\n/**\n * Add a label part to a domain\n * @param domain The domain to add a label to\n * @param label The label to add, like &lt;hostname&gt;, 'local', 'com' or ''\n * @param len The length of the label\n * @return ERR_OK on success, an err_t otherwise if label too long\n */\nerr_t\nmdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len)\n{\n  if (len > MDNS_LABEL_MAXLEN) {\n    return ERR_VAL;\n  }\n  if (len > 0 && (1 + len + domain->length >= MDNS_DOMAIN_MAXLEN)) {\n    return ERR_VAL;\n  }\n  /* Allow only zero marker on last byte */\n  if (len == 0 && (1 + domain->length > MDNS_DOMAIN_MAXLEN)) {\n    return ERR_VAL;\n  }\n  domain->name[domain->length] = len;\n  domain->length++;\n  if (len) {\n    MEMCPY(&domain->name[domain->length], label, len);\n    domain->length += len;\n  }\n  return ERR_OK;\n}\n\n/**\n * Internal readname function with max 6 levels of recursion following jumps\n * while decompressing name\n */\nstatic u16_t\nmdns_readname_loop(struct pbuf *p, u16_t offset, struct mdns_domain *domain, unsigned depth)\n{\n  u8_t c;\n\n  do {\n    if (depth > 5) {\n      /* Too many jumps */\n      return MDNS_READNAME_ERROR;\n    }\n\n    c = pbuf_get_at(p, offset);\n    offset++;\n\n    /* is this a compressed label? */\n    if((c & 0xc0) == 0xc0) {\n      u16_t jumpaddr;\n      if (offset >= p->tot_len) {\n        /* Make sure both jump bytes fit in the packet */\n        return MDNS_READNAME_ERROR;\n      }\n      jumpaddr = (((c & 0x3f) << 8) | (pbuf_get_at(p, offset) & 0xff));\n      offset++;\n      if (jumpaddr >= SIZEOF_DNS_HDR && jumpaddr < p->tot_len) {\n        u16_t res;\n      /* Recursive call, maximum depth will be checked */\n        res = mdns_readname_loop(p, jumpaddr, domain, depth + 1);\n        /* Dont return offset since new bytes were not read (jumped to somewhere in packet) */\n        if (res == MDNS_READNAME_ERROR) {\n          return res;\n        }\n      } else {\n        return MDNS_READNAME_ERROR;\n      }\n      break;\n    }\n\n    /* normal label */\n    if (c <= MDNS_LABEL_MAXLEN) {\n      u8_t label[MDNS_LABEL_MAXLEN];\n      err_t res;\n\n      if (c + domain->length >= MDNS_DOMAIN_MAXLEN) {\n        return MDNS_READNAME_ERROR;\n      }\n      if (c != 0) {\n        if (pbuf_copy_partial(p, label, c, offset) != c) {\n          return MDNS_READNAME_ERROR;\n        }\n        offset += c;\n      }\n      res = mdns_domain_add_label(domain, (char *) label, c);\n      if (res != ERR_OK) {\n        return MDNS_READNAME_ERROR;\n      }\n    } else {\n      /* bad length byte */\n      return MDNS_READNAME_ERROR;\n    }\n  } while (c != 0);\n\n  return offset;\n}\n\n/**\n * Read possibly compressed domain name from packet buffer\n * @param p The packet\n * @param offset start position of domain name in packet\n * @param domain The domain name destination\n * @return The new offset after the domain, or MDNS_READNAME_ERROR\n *         if reading failed\n */\nu16_t\nmdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain)\n{\n  memset(domain, 0, sizeof(struct mdns_domain));\n  return mdns_readname_loop(p, offset, domain, 0);\n}\n\n/**\n * Print domain name to debug output\n * @param domain The domain name\n */\nstatic void\nmdns_domain_debug_print(struct mdns_domain *domain)\n{\n  u8_t *src = domain->name;\n  u8_t i;\n\n  while (*src) {\n    u8_t label_len = *src;\n    src++;\n    for (i = 0; i < label_len; i++) {\n      LWIP_DEBUGF(MDNS_DEBUG, (\"%c\", src[i]));\n    }\n    src += label_len;\n    LWIP_DEBUGF(MDNS_DEBUG, (\".\"));\n  }\n}\n\n/**\n * Return 1 if contents of domains match (case-insensitive)\n * @param a Domain name to compare 1\n * @param b Domain name to compare 2\n * @return 1 if domains are equal ignoring case, 0 otherwise\n */\nint\nmdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b)\n{\n  u8_t *ptra, *ptrb;\n  u8_t len;\n  int res;\n\n  if (a->length != b->length) {\n    return 0;\n  }\n\n  ptra = a->name;\n  ptrb = b->name;\n  while (*ptra && *ptrb && ptra < &a->name[a->length]) {\n    if (*ptra != *ptrb) {\n      return 0;\n    }\n    len = *ptra;\n    ptra++;\n    ptrb++;\n    res = lwip_strnicmp((char *) ptra, (char *) ptrb, len);\n    if (res != 0) {\n      return 0;\n    }\n    ptra += len;\n    ptrb += len;\n  }\n  if (*ptra != *ptrb && ptra < &a->name[a->length]) {\n    return 0;\n  }\n  return 1;\n}\n\n/**\n * Call user supplied function to setup TXT data\n * @param service The service to build TXT record for\n */\nstatic void\nmdns_prepare_txtdata(struct mdns_service *service)\n{\n  memset(&service->txtdata, 0, sizeof(struct mdns_domain));\n  if (service->txt_fn) {\n    service->txt_fn(service, service->txt_userdata);\n  }\n}\n\n#if LWIP_IPV4\n/**\n * Build domain for reverse lookup of IPv4 address\n * like 12.0.168.192.in-addr.arpa. for 192.168.0.12\n * @param domain Where to write the domain name\n * @param addr Pointer to an IPv4 address to encode\n * @return ERR_OK if domain was written, an err_t otherwise\n */\nstatic err_t\nmdns_build_reverse_v4_domain(struct mdns_domain *domain, const ip4_addr_t *addr)\n{\n  int i;\n  err_t res;\n  const u8_t *ptr;\n  if (!domain || !addr) {\n    return ERR_ARG;\n  }\n  memset(domain, 0, sizeof(struct mdns_domain));\n  ptr = (const u8_t *) addr;\n  for (i = sizeof(ip4_addr_t) - 1; i >= 0; i--) {\n    char buf[4];\n    u8_t val = ptr[i];\n\n    lwip_itoa(buf, sizeof(buf), val);\n    res = mdns_domain_add_label(domain, buf, (u8_t)strlen(buf));\n    LWIP_ERROR(\"mdns_build_reverse_v4_domain: Failed to add label\", (res == ERR_OK), return res);\n  }\n  res = mdns_domain_add_label(domain, REVERSE_PTR_V4_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V4_DOMAIN)-1));\n  LWIP_ERROR(\"mdns_build_reverse_v4_domain: Failed to add label\", (res == ERR_OK), return res);\n  res = mdns_domain_add_label(domain, REVERSE_PTR_TOPDOMAIN, (u8_t)(sizeof(REVERSE_PTR_TOPDOMAIN)-1));\n  LWIP_ERROR(\"mdns_build_reverse_v4_domain: Failed to add label\", (res == ERR_OK), return res);\n  res = mdns_domain_add_label(domain, NULL, 0);\n  LWIP_ERROR(\"mdns_build_reverse_v4_domain: Failed to add label\", (res == ERR_OK), return res);\n\n  return ERR_OK;\n}\n#endif\n\n#if LWIP_IPV6\n/**\n * Build domain for reverse lookup of IP address\n * like b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. for 2001:db8::567:89ab\n * @param domain Where to write the domain name\n * @param addr Pointer to an IPv6 address to encode\n * @return ERR_OK if domain was written, an err_t otherwise\n */\nstatic err_t\nmdns_build_reverse_v6_domain(struct mdns_domain *domain, const ip6_addr_t *addr)\n{\n  int i;\n  err_t res;\n  const u8_t *ptr;\n  if (!domain || !addr) {\n    return ERR_ARG;\n  }\n  memset(domain, 0, sizeof(struct mdns_domain));\n  ptr = (const u8_t *) addr;\n  for (i = sizeof(ip6_addr_t) - 1; i >= 0; i--) {\n    char buf;\n    u8_t byte = ptr[i];\n    int j;\n    for (j = 0; j < 2; j++) {\n      if ((byte & 0x0F) < 0xA) {\n        buf = '0' + (byte & 0x0F);\n      } else {\n        buf = 'a' + (byte & 0x0F) - 0xA;\n      }\n      res = mdns_domain_add_label(domain, &buf, sizeof(buf));\n      LWIP_ERROR(\"mdns_build_reverse_v6_domain: Failed to add label\", (res == ERR_OK), return res);\n      byte >>= 4;\n    }\n  }\n  res = mdns_domain_add_label(domain, REVERSE_PTR_V6_DOMAIN, (u8_t)(sizeof(REVERSE_PTR_V6_DOMAIN)-1));\n  LWIP_ERROR(\"mdns_build_reverse_v6_domain: Failed to add label\", (res == ERR_OK), return res);\n  res = mdns_domain_add_label(domain, REVERSE_PTR_TOPDOMAIN, (u8_t)(sizeof(REVERSE_PTR_TOPDOMAIN)-1));\n  LWIP_ERROR(\"mdns_build_reverse_v6_domain: Failed to add label\", (res == ERR_OK), return res);\n  res = mdns_domain_add_label(domain, NULL, 0);\n  LWIP_ERROR(\"mdns_build_reverse_v6_domain: Failed to add label\", (res == ERR_OK), return res);\n\n  return ERR_OK;\n}\n#endif\n\n/* Add .local. to domain */\nstatic err_t\nmdns_add_dotlocal(struct mdns_domain *domain)\n{\n  err_t res = mdns_domain_add_label(domain, TOPDOMAIN_LOCAL, (u8_t)(sizeof(TOPDOMAIN_LOCAL)-1));\n  LWIP_ERROR(\"mdns_add_dotlocal: Failed to add label\", (res == ERR_OK), return res);\n  return mdns_domain_add_label(domain, NULL, 0);\n}\n\n/**\n * Build the <hostname>.local. domain name\n * @param domain Where to write the domain name\n * @param mdns TMDNS netif descriptor.\n * @return ERR_OK if domain <hostname>.local. was written, an err_t otherwise\n */\nstatic err_t\nmdns_build_host_domain(struct mdns_domain *domain, struct mdns_host *mdns)\n{\n  err_t res;\n  memset(domain, 0, sizeof(struct mdns_domain));\n  LWIP_ERROR(\"mdns_build_host_domain: mdns != NULL\", (mdns != NULL), return ERR_VAL);\n  res = mdns_domain_add_label(domain, mdns->name, (u8_t)strlen(mdns->name));\n  LWIP_ERROR(\"mdns_build_host_domain: Failed to add label\", (res == ERR_OK), return res);\n  return mdns_add_dotlocal(domain);\n}\n\n/**\n * Build the lookup-all-services special DNS-SD domain name\n * @param domain Where to write the domain name\n * @return ERR_OK if domain _services._dns-sd._udp.local. was written, an err_t otherwise\n */\nstatic err_t\nmdns_build_dnssd_domain(struct mdns_domain *domain)\n{\n  err_t res;\n  memset(domain, 0, sizeof(struct mdns_domain));\n  res = mdns_domain_add_label(domain, \"_services\", (u8_t)(sizeof(\"_services\")-1));\n  LWIP_ERROR(\"mdns_build_dnssd_domain: Failed to add label\", (res == ERR_OK), return res);\n  res = mdns_domain_add_label(domain, \"_dns-sd\", (u8_t)(sizeof(\"_dns-sd\")-1));\n  LWIP_ERROR(\"mdns_build_dnssd_domain: Failed to add label\", (res == ERR_OK), return res);\n  res = mdns_domain_add_label(domain, dnssd_protos[DNSSD_PROTO_UDP], (u8_t)strlen(dnssd_protos[DNSSD_PROTO_UDP]));\n  LWIP_ERROR(\"mdns_build_dnssd_domain: Failed to add label\", (res == ERR_OK), return res);\n  return mdns_add_dotlocal(domain);\n}\n\n/**\n * Build domain name for a service\n * @param domain Where to write the domain name\n * @param service The service struct, containing service name, type and protocol\n * @param include_name Whether to include the service name in the domain\n * @return ERR_OK if domain was written. If service name is included,\n *         <name>.<type>.<proto>.local. will be written, otherwise <type>.<proto>.local.\n *         An err_t is returned on error.\n */\nstatic err_t\nmdns_build_service_domain(struct mdns_domain *domain, struct mdns_service *service, int include_name)\n{\n  err_t res;\n  memset(domain, 0, sizeof(struct mdns_domain));\n  if (include_name) {\n    res = mdns_domain_add_label(domain, service->name, (u8_t)strlen(service->name));\n    LWIP_ERROR(\"mdns_build_service_domain: Failed to add label\", (res == ERR_OK), return res);\n  }\n  res = mdns_domain_add_label(domain, service->service, (u8_t)strlen(service->service));\n  LWIP_ERROR(\"mdns_build_service_domain: Failed to add label\", (res == ERR_OK), return res);\n  res = mdns_domain_add_label(domain, dnssd_protos[service->proto], (u8_t)strlen(dnssd_protos[service->proto]));\n  LWIP_ERROR(\"mdns_build_service_domain: Failed to add label\", (res == ERR_OK), return res);\n  return mdns_add_dotlocal(domain);\n}\n\n/**\n * Check which replies we should send for a host/netif based on question\n * @param netif The network interface that received the question\n * @param rr Domain/type/class from a question\n * @param reverse_v6_reply Bitmask of which IPv6 addresses to send reverse PTRs for\n *                         if reply bit has REPLY_HOST_PTR_V6 set\n * @return Bitmask of which replies to send\n */\nstatic int\ncheck_host(struct netif *netif, struct mdns_rr_info *rr, u8_t *reverse_v6_reply)\n{\n  err_t res;\n  int replies = 0;\n  struct mdns_domain mydomain;\n\n  LWIP_UNUSED_ARG(reverse_v6_reply); /* if ipv6 is disabled */\n\n  if (rr->klass != DNS_RRCLASS_IN && rr->klass != DNS_RRCLASS_ANY) {\n    /* Invalid class */\n    return replies;\n  }\n\n  /* Handle PTR for our addresses */\n  if (rr->type == DNS_RRTYPE_PTR || rr->type == DNS_RRTYPE_ANY) {\n#if LWIP_IPV6\n    int i;\n    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) {\n        res = mdns_build_reverse_v6_domain(&mydomain, netif_ip6_addr(netif, i));\n        if (res == ERR_OK && mdns_domain_eq(&rr->domain, &mydomain)) {\n          replies |= REPLY_HOST_PTR_V6;\n          /* Mark which addresses where requested */\n          if (reverse_v6_reply) {\n            *reverse_v6_reply |= (1 << i);\n          }\n        }\n      }\n    }\n#endif\n#if LWIP_IPV4\n    if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) {\n      res = mdns_build_reverse_v4_domain(&mydomain, netif_ip4_addr(netif));\n      if (res == ERR_OK && mdns_domain_eq(&rr->domain, &mydomain)) {\n        replies |= REPLY_HOST_PTR_V4;\n      }\n    }\n#endif\n  }\n\n  res = mdns_build_host_domain(&mydomain, NETIF_TO_HOST(netif));\n  /* Handle requests for our hostname */\n  if (res == ERR_OK && mdns_domain_eq(&rr->domain, &mydomain)) {\n    /* TODO return NSEC if unsupported protocol requested */\n#if LWIP_IPV4\n    if (!ip4_addr_isany_val(*netif_ip4_addr(netif))\n        && (rr->type == DNS_RRTYPE_A || rr->type == DNS_RRTYPE_ANY)) {\n      replies |= REPLY_HOST_A;\n    }\n#endif\n#if LWIP_IPV6\n    if (rr->type == DNS_RRTYPE_AAAA || rr->type == DNS_RRTYPE_ANY) {\n      replies |= REPLY_HOST_AAAA;\n    }\n#endif\n  }\n\n  return replies;\n}\n\n/**\n * Check which replies we should send for a service based on question\n * @param service A registered MDNS service\n * @param rr Domain/type/class from a question\n * @return Bitmask of which replies to send\n */\nstatic int\ncheck_service(struct mdns_service *service, struct mdns_rr_info *rr)\n{\n  err_t res;\n  int replies = 0;\n  struct mdns_domain mydomain;\n\n  if (rr->klass != DNS_RRCLASS_IN && rr->klass != DNS_RRCLASS_ANY) {\n    /* Invalid class */\n    return 0;\n  }\n\n  res = mdns_build_dnssd_domain(&mydomain);\n  if (res == ERR_OK && mdns_domain_eq(&rr->domain, &mydomain) &&\n      (rr->type == DNS_RRTYPE_PTR || rr->type == DNS_RRTYPE_ANY)) {\n    /* Request for all service types */\n    replies |= REPLY_SERVICE_TYPE_PTR;\n  }\n\n  res = mdns_build_service_domain(&mydomain, service, 0);\n  if (res == ERR_OK && mdns_domain_eq(&rr->domain, &mydomain) &&\n      (rr->type == DNS_RRTYPE_PTR || rr->type == DNS_RRTYPE_ANY)) {\n    /* Request for the instance of my service */\n    replies |= REPLY_SERVICE_NAME_PTR;\n  }\n\n  res = mdns_build_service_domain(&mydomain, service, 1);\n  if (res == ERR_OK && mdns_domain_eq(&rr->domain, &mydomain)) {\n    /* Request for info about my service */\n    if (rr->type == DNS_RRTYPE_SRV || rr->type == DNS_RRTYPE_ANY) {\n      replies |= REPLY_SERVICE_SRV;\n    }\n    if (rr->type == DNS_RRTYPE_TXT || rr->type == DNS_RRTYPE_ANY) {\n      replies |= REPLY_SERVICE_TXT;\n    }\n  }\n\n  return replies;\n}\n\n/**\n * Return bytes needed to write before jump for best result of compressing supplied domain\n * against domain in outpacket starting at specified offset.\n * If a match is found, offset is updated to where to jump to\n * @param pbuf Pointer to pbuf with the partially constructed DNS packet\n * @param offset Start position of a domain written earlier. If this location is suitable\n *               for compression, the pointer is updated to where in the domain to jump to.\n * @param domain The domain to write\n * @return Number of bytes to write of the new domain before writing a jump to the offset.\n *         If compression can not be done against this previous domain name, the full new\n *         domain length is returned.\n */\nu16_t\nmdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain)\n{\n  struct mdns_domain target;\n  u16_t target_end;\n  u8_t target_len;\n  u8_t writelen = 0;\n  u8_t *ptr;\n  if (pbuf == NULL) {\n    return domain->length;\n  }\n  target_end = mdns_readname(pbuf, *offset, &target);\n  if (target_end == MDNS_READNAME_ERROR) {\n    return domain->length;\n  }\n  target_len = (u8_t)(target_end - *offset);\n  ptr = domain->name;\n  while (writelen < domain->length) {\n    u8_t domainlen = (u8_t)(domain->length - writelen);\n    u8_t labellen;\n    if (domainlen <= target.length && domainlen > DOMAIN_JUMP_SIZE) {\n      /* Compare domains if target is long enough, and we have enough left of the domain */\n      u8_t targetpos = (u8_t)(target.length - domainlen);\n      if ((targetpos + DOMAIN_JUMP_SIZE) >= target_len) {\n        /* We are checking at or beyond a jump in the original, stop looking */\n        break;\n      }\n      if (target.length >= domainlen &&\n          memcmp(&domain->name[writelen], &target.name[targetpos], domainlen) == 0) {\n        *offset += targetpos;\n        return writelen;\n      }\n    }\n    /* Skip to next label in domain */\n    labellen = *ptr;\n    writelen += 1 + labellen;\n    ptr += 1 + labellen;\n  }\n  /* Nothing found */\n  return domain->length;\n}\n\n/**\n * Write domain to outpacket. Compression will be attempted,\n * unless domain->skip_compression is set.\n * @param outpkt The outpacket to write to\n * @param domain The domain name to write\n * @return ERR_OK on success, an err_t otherwise\n */\nstatic err_t\nmdns_write_domain(struct mdns_outpacket *outpkt, struct mdns_domain *domain)\n{\n  int i;\n  err_t res;\n  u16_t writelen = domain->length;\n  u16_t jump_offset = 0;\n  u16_t jump;\n\n  if (!domain->skip_compression) {\n    for (i = 0; i < NUM_DOMAIN_OFFSETS; ++i) {\n      u16_t offset = outpkt->domain_offsets[i];\n      if (offset) {\n        u16_t len = mdns_compress_domain(outpkt->pbuf, &offset, domain);\n        if (len < writelen) {\n          writelen = len;\n          jump_offset = offset;\n        }\n      }\n    }\n  }\n\n  if (writelen) {\n    /* Write uncompressed part of name */\n    res = pbuf_take_at(outpkt->pbuf, domain->name, writelen, outpkt->write_offset);\n    if (res != ERR_OK) {\n      return res;\n    }\n\n    /* Store offset of this new domain */\n    for (i = 0; i < NUM_DOMAIN_OFFSETS; ++i) {\n      if (outpkt->domain_offsets[i] == 0) {\n        outpkt->domain_offsets[i] = outpkt->write_offset;\n        break;\n      }\n    }\n\n    outpkt->write_offset += writelen;\n  }\n  if (jump_offset) {\n    /* Write jump */\n    jump = lwip_htons(DOMAIN_JUMP | jump_offset);\n    res = pbuf_take_at(outpkt->pbuf, &jump, DOMAIN_JUMP_SIZE, outpkt->write_offset);\n    if (res != ERR_OK) {\n      return res;\n    }\n    outpkt->write_offset += DOMAIN_JUMP_SIZE;\n  }\n  return ERR_OK;\n}\n\n/**\n * Write a question to an outpacket\n * A question contains domain, type and class. Since an answer also starts with these fields this function is also\n * called from mdns_add_answer().\n * @param outpkt The outpacket to write to\n * @param domain The domain name the answer is for\n * @param type The DNS type of the answer (like 'AAAA', 'SRV')\n * @param klass The DNS type of the answer (like 'IN')\n * @param unicast If highest bit in class should be set, to instruct the responder to\n *                reply with a unicast packet\n * @return ERR_OK on success, an err_t otherwise\n */\nstatic err_t\nmdns_add_question(struct mdns_outpacket *outpkt, struct mdns_domain *domain, u16_t type, u16_t klass, u16_t unicast)\n{\n  u16_t question_len;\n  u16_t field16;\n  err_t res;\n\n  if (!outpkt->pbuf) {\n    /* If no pbuf is active, allocate one */\n    outpkt->pbuf = pbuf_alloc(PBUF_TRANSPORT, OUTPACKET_SIZE, PBUF_RAM);\n    if (!outpkt->pbuf) {\n      return ERR_MEM;\n    }\n    outpkt->write_offset = SIZEOF_DNS_HDR;\n  }\n\n  /* Worst case calculation. Domain string might be compressed */\n  question_len = domain->length + sizeof(type) + sizeof(klass);\n  if (outpkt->write_offset + question_len > outpkt->pbuf->tot_len) {\n    /* No space */\n    return ERR_MEM;\n  }\n\n  /* Write name */\n  res = mdns_write_domain(outpkt, domain);\n  if (res != ERR_OK) {\n    return res;\n  }\n\n  /* Write type */\n  field16 = lwip_htons(type);\n  res = pbuf_take_at(outpkt->pbuf, &field16, sizeof(field16), outpkt->write_offset);\n  if (res != ERR_OK) {\n    return res;\n  }\n  outpkt->write_offset += sizeof(field16);\n\n  /* Write class */\n  if (unicast) {\n    klass |= 0x8000;\n  }\n  field16 = lwip_htons(klass);\n  res = pbuf_take_at(outpkt->pbuf, &field16, sizeof(field16), outpkt->write_offset);\n  if (res != ERR_OK) {\n    return res;\n  }\n  outpkt->write_offset += sizeof(field16);\n\n  return ERR_OK;\n}\n\n/**\n * Write answer to reply packet.\n * buf or answer_domain can be null. The rd_length written will be buf_length +\n * size of (compressed) domain. Most uses will need either buf or answer_domain,\n * special case is SRV that starts with 3 u16 and then a domain name.\n * @param reply The outpacket to write to\n * @param domain The domain name the answer is for\n * @param type The DNS type of the answer (like 'AAAA', 'SRV')\n * @param klass The DNS type of the answer (like 'IN')\n * @param cache_flush If highest bit in class should be set, to instruct receiver that\n *                    this reply replaces any earlier answer for this domain/type/class\n * @param ttl Validity time in seconds to send out for IP address data in DNS replies\n * @param buf Pointer to buffer of answer data\n * @param buf_length Length of variable data\n * @param answer_domain A domain to write after any buffer data as answer\n * @return ERR_OK on success, an err_t otherwise\n */\nstatic err_t\nmdns_add_answer(struct mdns_outpacket *reply, struct mdns_domain *domain, u16_t type, u16_t klass, u16_t cache_flush,\n                u32_t ttl, const u8_t *buf, size_t buf_length, struct mdns_domain *answer_domain)\n{\n  u16_t answer_len;\n  u16_t field16;\n  u16_t rdlen_offset;\n  u16_t answer_offset;\n  u32_t field32;\n  err_t res;\n\n  if (!reply->pbuf) {\n    /* If no pbuf is active, allocate one */\n    reply->pbuf = pbuf_alloc(PBUF_TRANSPORT, OUTPACKET_SIZE, PBUF_RAM);\n    if (!reply->pbuf) {\n      return ERR_MEM;\n    }\n    reply->write_offset = SIZEOF_DNS_HDR;\n  }\n\n  /* Worst case calculation. Domain strings might be compressed */\n  answer_len = domain->length + sizeof(type) + sizeof(klass) + sizeof(ttl) + sizeof(field16)/*rd_length*/;\n  if (buf) {\n    answer_len += (u16_t)buf_length;\n  }\n  if (answer_domain) {\n    answer_len += answer_domain->length;\n  }\n  if (reply->write_offset + answer_len > reply->pbuf->tot_len) {\n    /* No space */\n    return ERR_MEM;\n  }\n\n  /* Answer starts with same data as question, then more fields */\n  mdns_add_question(reply, domain, type, klass, cache_flush);\n\n  /* Write TTL */\n  field32 = lwip_htonl(ttl);\n  res = pbuf_take_at(reply->pbuf, &field32, sizeof(field32), reply->write_offset);\n  if (res != ERR_OK) {\n    return res;\n  }\n  reply->write_offset += sizeof(field32);\n\n  /* Store offsets and skip forward to the data */\n  rdlen_offset = reply->write_offset;\n  reply->write_offset += sizeof(field16);\n  answer_offset = reply->write_offset;\n\n  if (buf) {\n    /* Write static data */\n    res = pbuf_take_at(reply->pbuf, buf, (u16_t)buf_length, reply->write_offset);\n    if (res != ERR_OK) {\n      return res;\n    }\n    reply->write_offset += (u16_t)buf_length;\n  }\n\n  if (answer_domain) {\n    /* Write name answer (compressed if possible) */\n    res = mdns_write_domain(reply, answer_domain);\n    if (res != ERR_OK) {\n      return res;\n    }\n  }\n\n  /* Write rd_length after when we know the answer size */\n  field16 = lwip_htons(reply->write_offset - answer_offset);\n  res = pbuf_take_at(reply->pbuf, &field16, sizeof(field16), rdlen_offset);\n\n  return res;\n}\n\n/**\n * Helper function for mdns_read_question/mdns_read_answer\n * Reads a domain, type and class from the packet\n * @param pkt The MDNS packet to read from. The parse_offset field will be\n *            incremented to point to the next unparsed byte.\n * @param info The struct to fill with domain, type and class\n * @return ERR_OK on success, an err_t otherwise\n */\nstatic err_t\nmdns_read_rr_info(struct mdns_packet *pkt, struct mdns_rr_info *info)\n{\n  u16_t field16, copied;\n  pkt->parse_offset = mdns_readname(pkt->pbuf, pkt->parse_offset, &info->domain);\n  if (pkt->parse_offset == MDNS_READNAME_ERROR) {\n    return ERR_VAL;\n  }\n\n  copied = pbuf_copy_partial(pkt->pbuf, &field16, sizeof(field16), pkt->parse_offset);\n  if (copied != sizeof(field16)) {\n    return ERR_VAL;\n  }\n  pkt->parse_offset += copied;\n  info->type = lwip_ntohs(field16);\n\n  copied = pbuf_copy_partial(pkt->pbuf, &field16, sizeof(field16), pkt->parse_offset);\n  if (copied != sizeof(field16)) {\n    return ERR_VAL;\n  }\n  pkt->parse_offset += copied;\n  info->klass = lwip_ntohs(field16);\n\n  return ERR_OK;\n}\n\n/**\n * Read a question from the packet.\n * All questions have to be read before the answers.\n * @param pkt The MDNS packet to read from. The questions_left field will be decremented\n *            and the parse_offset will be updated.\n * @param question The struct to fill with question data\n * @return ERR_OK on success, an err_t otherwise\n */\nstatic err_t\nmdns_read_question(struct mdns_packet *pkt, struct mdns_question *question)\n{\n  /* Safety check */\n  if (pkt->pbuf->tot_len < pkt->parse_offset) {\n    return ERR_VAL;\n  }\n\n  if (pkt->questions_left) {\n    err_t res;\n    pkt->questions_left--;\n\n    memset(question, 0, sizeof(struct mdns_question));\n    res = mdns_read_rr_info(pkt, &question->info);\n    if (res != ERR_OK) {\n      return res;\n    }\n\n    /* Extract unicast flag from class field */\n    question->unicast = question->info.klass & 0x8000;\n    question->info.klass &= 0x7FFF;\n\n    return ERR_OK;\n  }\n  return ERR_VAL;\n}\n\n/**\n * Read an answer from the packet\n * The variable length reply is not copied, its pbuf offset and length is stored instead.\n * @param pkt The MDNS packet to read. The answers_left field will be decremented and\n *            the parse_offset will be updated.\n * @param answer The struct to fill with answer data\n * @return ERR_OK on success, an err_t otherwise\n */\nstatic err_t\nmdns_read_answer(struct mdns_packet *pkt, struct mdns_answer *answer)\n{\n  /* Read questions first */\n  if (pkt->questions_left) {\n    return ERR_VAL;\n  }\n\n  /* Safety check */\n  if (pkt->pbuf->tot_len < pkt->parse_offset) {\n    return ERR_VAL;\n  }\n\n  if (pkt->answers_left) {\n    u16_t copied, field16;\n    u32_t ttl;\n    err_t res;\n    pkt->answers_left--;\n\n    memset(answer, 0, sizeof(struct mdns_answer));\n    res = mdns_read_rr_info(pkt, &answer->info);\n    if (res != ERR_OK) {\n      return res;\n    }\n\n    /* Extract cache_flush flag from class field */\n    answer->cache_flush = answer->info.klass & 0x8000;\n    answer->info.klass &= 0x7FFF;\n\n    copied = pbuf_copy_partial(pkt->pbuf, &ttl, sizeof(ttl), pkt->parse_offset);\n    if (copied != sizeof(ttl)) {\n      return ERR_VAL;\n    }\n    pkt->parse_offset += copied;\n    answer->ttl = lwip_ntohl(ttl);\n\n    copied = pbuf_copy_partial(pkt->pbuf, &field16, sizeof(field16), pkt->parse_offset);\n    if (copied != sizeof(field16)) {\n      return ERR_VAL;\n    }\n    pkt->parse_offset += copied;\n    answer->rd_length = lwip_ntohs(field16);\n\n    answer->rd_offset = pkt->parse_offset;\n    pkt->parse_offset += answer->rd_length;\n\n    return ERR_OK;\n  }\n  return ERR_VAL;\n}\n\n#if LWIP_IPV4\n/** Write an IPv4 address (A) RR to outpacket */\nstatic err_t\nmdns_add_a_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct netif *netif)\n{\n  struct mdns_domain host;\n  mdns_build_host_domain(&host, NETIF_TO_HOST(netif));\n  LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Responding with A record\\n\"));\n  return mdns_add_answer(reply, &host, DNS_RRTYPE_A, DNS_RRCLASS_IN, cache_flush, (NETIF_TO_HOST(netif))->dns_ttl, (const u8_t *) netif_ip4_addr(netif), sizeof(ip4_addr_t), NULL);\n}\n\n/** Write a 4.3.2.1.in-addr.arpa -> hostname.local PTR RR to outpacket */\nstatic err_t\nmdns_add_hostv4_ptr_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct netif *netif)\n{\n  struct mdns_domain host, revhost;\n  mdns_build_host_domain(&host, NETIF_TO_HOST(netif));\n  mdns_build_reverse_v4_domain(&revhost, netif_ip4_addr(netif));\n  LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Responding with v4 PTR record\\n\"));\n  return mdns_add_answer(reply, &revhost, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, cache_flush, (NETIF_TO_HOST(netif))->dns_ttl, NULL, 0, &host);\n}\n#endif\n\n#if LWIP_IPV6\n/** Write an IPv6 address (AAAA) RR to outpacket */\nstatic err_t\nmdns_add_aaaa_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct netif *netif, int addrindex)\n{\n  struct mdns_domain host;\n  mdns_build_host_domain(&host, NETIF_TO_HOST(netif));\n  LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Responding with AAAA record\\n\"));\n  return mdns_add_answer(reply, &host, DNS_RRTYPE_AAAA, DNS_RRCLASS_IN, cache_flush, (NETIF_TO_HOST(netif))->dns_ttl, (const u8_t *) netif_ip6_addr(netif, addrindex), sizeof(ip6_addr_t), NULL);\n}\n\n/** Write a x.y.z.ip6.arpa -> hostname.local PTR RR to outpacket */\nstatic err_t\nmdns_add_hostv6_ptr_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct netif *netif, int addrindex)\n{\n  struct mdns_domain host, revhost;\n  mdns_build_host_domain(&host, NETIF_TO_HOST(netif));\n  mdns_build_reverse_v6_domain(&revhost, netif_ip6_addr(netif, addrindex));\n  LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Responding with v6 PTR record\\n\"));\n  return mdns_add_answer(reply, &revhost, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, cache_flush, (NETIF_TO_HOST(netif))->dns_ttl, NULL, 0, &host);\n}\n#endif\n\n/** Write an all-services -> servicetype PTR RR to outpacket */\nstatic err_t\nmdns_add_servicetype_ptr_answer(struct mdns_outpacket *reply, struct mdns_service *service)\n{\n  struct mdns_domain service_type, service_dnssd;\n  mdns_build_service_domain(&service_type, service, 0);\n  mdns_build_dnssd_domain(&service_dnssd);\n  LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Responding with service type PTR record\\n\"));\n  return mdns_add_answer(reply, &service_dnssd, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, 0, service->dns_ttl, NULL, 0, &service_type);\n}\n\n/** Write a servicetype -> servicename PTR RR to outpacket */\nstatic err_t\nmdns_add_servicename_ptr_answer(struct mdns_outpacket *reply, struct mdns_service *service)\n{\n  struct mdns_domain service_type, service_instance;\n  mdns_build_service_domain(&service_type, service, 0);\n  mdns_build_service_domain(&service_instance, service, 1);\n  LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Responding with service name PTR record\\n\"));\n  return mdns_add_answer(reply, &service_type, DNS_RRTYPE_PTR, DNS_RRCLASS_IN, 0, service->dns_ttl, NULL, 0, &service_instance);\n}\n\n/** Write a SRV RR to outpacket */\nstatic err_t\nmdns_add_srv_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct mdns_host *mdns, struct mdns_service *service)\n{\n  struct mdns_domain service_instance, srvhost;\n  u16_t srvdata[3];\n  mdns_build_service_domain(&service_instance, service, 1);\n  mdns_build_host_domain(&srvhost, mdns);\n  if (reply->legacy_query) {\n    /* RFC 6762 section 18.14:\n     * In legacy unicast responses generated to answer legacy queries,\n     * name compression MUST NOT be performed on SRV records.\n     */\n    srvhost.skip_compression = 1;\n  }\n  srvdata[0] = lwip_htons(SRV_PRIORITY);\n  srvdata[1] = lwip_htons(SRV_WEIGHT);\n  srvdata[2] = lwip_htons(service->port);\n  LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Responding with SRV record\\n\"));\n  return mdns_add_answer(reply, &service_instance, DNS_RRTYPE_SRV, DNS_RRCLASS_IN, cache_flush, service->dns_ttl,\n                         (const u8_t *) &srvdata, sizeof(srvdata), &srvhost);\n}\n\n/** Write a TXT RR to outpacket */\nstatic err_t\nmdns_add_txt_answer(struct mdns_outpacket *reply, u16_t cache_flush, struct mdns_service *service)\n{\n  struct mdns_domain service_instance;\n  mdns_build_service_domain(&service_instance, service, 1);\n  mdns_prepare_txtdata(service);\n  LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Responding with TXT record\\n\"));\n  return mdns_add_answer(reply, &service_instance, DNS_RRTYPE_TXT, DNS_RRCLASS_IN, cache_flush, service->dns_ttl,\n                         (u8_t *) &service->txtdata.name, service->txtdata.length, NULL);\n}\n\n/**\n * Setup outpacket as a reply to the incoming packet\n */\nstatic void\nmdns_init_outpacket(struct mdns_outpacket *out, struct mdns_packet *in)\n{\n  memset(out, 0, sizeof(struct mdns_outpacket));\n  out->cache_flush = 1;\n  out->netif = in->netif;\n\n  /* Copy source IP/port to use when responding unicast, or to choose\n   * which pcb to use for multicast (IPv4/IPv6)\n   */\n  SMEMCPY(&out->dest_addr, &in->source_addr, sizeof(ip_addr_t));\n  out->dest_port = in->source_port;\n\n  if (in->source_port != MDNS_PORT) {\n    out->unicast_reply = 1;\n    out->cache_flush = 0;\n    if (in->questions == 1) {\n      out->legacy_query = 1;\n      out->tx_id = in->tx_id;\n    }\n  }\n\n  if (in->recv_unicast) {\n    out->unicast_reply = 1;\n  }\n}\n\n/**\n * Send chosen answers as a reply\n *\n * Add all selected answers (first write will allocate pbuf)\n * Add additional answers based on the selected answers\n * Send the packet\n */\nstatic void\nmdns_send_outpacket(struct mdns_outpacket *outpkt)\n{\n  struct mdns_service *service;\n  err_t res;\n  int i;\n  struct mdns_host* mdns = NETIF_TO_HOST(outpkt->netif);\n\n  /* Write answers to host questions */\n#if LWIP_IPV4\n  if (outpkt->host_replies & REPLY_HOST_A) {\n    res = mdns_add_a_answer(outpkt, outpkt->cache_flush, outpkt->netif);\n    if (res != ERR_OK) {\n      goto cleanup;\n    }\n    outpkt->answers++;\n  }\n  if (outpkt->host_replies & REPLY_HOST_PTR_V4) {\n    res = mdns_add_hostv4_ptr_answer(outpkt, outpkt->cache_flush, outpkt->netif);\n    if (res != ERR_OK) {\n      goto cleanup;\n    }\n    outpkt->answers++;\n  }\n#endif\n#if LWIP_IPV6\n  if (outpkt->host_replies & REPLY_HOST_AAAA) {\n    int addrindex;\n    for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; ++addrindex) {\n      if (ip6_addr_isvalid(netif_ip6_addr_state(outpkt->netif, addrindex))) {\n        res = mdns_add_aaaa_answer(outpkt, outpkt->cache_flush, outpkt->netif, addrindex);\n        if (res != ERR_OK) {\n          goto cleanup;\n        }\n        outpkt->answers++;\n      }\n    }\n  }\n  if (outpkt->host_replies & REPLY_HOST_PTR_V6) {\n    u8_t rev_addrs = outpkt->host_reverse_v6_replies;\n    int addrindex = 0;\n    while (rev_addrs) {\n      if (rev_addrs & 1) {\n        res = mdns_add_hostv6_ptr_answer(outpkt, outpkt->cache_flush, outpkt->netif, addrindex);\n        if (res != ERR_OK) {\n          goto cleanup;\n        }\n        outpkt->answers++;\n      }\n      addrindex++;\n      rev_addrs >>= 1;\n    }\n  }\n#endif\n\n  /* Write answers to service questions */\n  for (i = 0; i < MDNS_MAX_SERVICES; ++i) {\n    service = mdns->services[i];\n    if (!service) {\n      continue;\n    }\n\n    if (outpkt->serv_replies[i] & REPLY_SERVICE_TYPE_PTR) {\n      res = mdns_add_servicetype_ptr_answer(outpkt, service);\n      if (res != ERR_OK) {\n        goto cleanup;\n      }\n      outpkt->answers++;\n    }\n\n    if (outpkt->serv_replies[i] & REPLY_SERVICE_NAME_PTR) {\n      res = mdns_add_servicename_ptr_answer(outpkt, service);\n      if (res != ERR_OK) {\n        goto cleanup;\n      }\n      outpkt->answers++;\n    }\n\n    if (outpkt->serv_replies[i] & REPLY_SERVICE_SRV) {\n      res = mdns_add_srv_answer(outpkt, outpkt->cache_flush, mdns, service);\n      if (res != ERR_OK) {\n        goto cleanup;\n      }\n      outpkt->answers++;\n    }\n\n    if (outpkt->serv_replies[i] & REPLY_SERVICE_TXT) {\n      res = mdns_add_txt_answer(outpkt, outpkt->cache_flush, service);\n      if (res != ERR_OK) {\n        goto cleanup;\n      }\n      outpkt->answers++;\n    }\n  }\n\n  /* All answers written, add additional RRs */\n  for (i = 0; i < MDNS_MAX_SERVICES; ++i) {\n    service = mdns->services[i];\n    if (!service) {\n      continue;\n    }\n\n    if (outpkt->serv_replies[i] & REPLY_SERVICE_NAME_PTR) {\n      /* Our service instance requested, include SRV & TXT\n       * if they are already not requested. */\n      if (!(outpkt->serv_replies[i] & REPLY_SERVICE_SRV)) {\n        res = mdns_add_srv_answer(outpkt, outpkt->cache_flush, mdns, service);\n        if (res != ERR_OK) {\n          goto cleanup;\n        }\n        outpkt->additional++;\n      }\n\n      if (!(outpkt->serv_replies[i] & REPLY_SERVICE_TXT)) {\n        res = mdns_add_txt_answer(outpkt, outpkt->cache_flush, service);\n        if (res != ERR_OK) {\n          goto cleanup;\n        }\n        outpkt->additional++;\n      }\n    }\n\n    /* If service instance, SRV, record or an IP address is requested,\n     * supply all addresses for the host\n     */\n    if ((outpkt->serv_replies[i] & (REPLY_SERVICE_NAME_PTR | REPLY_SERVICE_SRV)) ||\n        (outpkt->host_replies & (REPLY_HOST_A | REPLY_HOST_AAAA))) {\n#if LWIP_IPV6\n      if (!(outpkt->host_replies & REPLY_HOST_AAAA)) {\n        int addrindex;\n        for (addrindex = 0; addrindex < LWIP_IPV6_NUM_ADDRESSES; ++addrindex) {\n          if (ip6_addr_isvalid(netif_ip6_addr_state(outpkt->netif, addrindex))) {\n            res = mdns_add_aaaa_answer(outpkt, outpkt->cache_flush, outpkt->netif, addrindex);\n            if (res != ERR_OK) {\n              goto cleanup;\n            }\n            outpkt->additional++;\n          }\n        }\n      }\n#endif\n#if LWIP_IPV4\n      if (!(outpkt->host_replies & REPLY_HOST_A)) {\n        res = mdns_add_a_answer(outpkt, outpkt->cache_flush, outpkt->netif);\n        if (res != ERR_OK) {\n          goto cleanup;\n        }\n        outpkt->additional++;\n      }\n#endif\n    }\n  }\n\n  if (outpkt->pbuf) {\n    const ip_addr_t *mcast_destaddr;\n    struct dns_hdr hdr;\n\n    /* Write header */\n    memset(&hdr, 0, sizeof(hdr));\n    hdr.flags1 = DNS_FLAG1_RESPONSE | DNS_FLAG1_AUTHORATIVE;\n    hdr.numanswers = lwip_htons(outpkt->answers);\n    hdr.numextrarr = lwip_htons(outpkt->additional);\n    if (outpkt->legacy_query) {\n      hdr.numquestions = lwip_htons(1);\n      hdr.id = lwip_htons(outpkt->tx_id);\n    }\n    pbuf_take(outpkt->pbuf, &hdr, sizeof(hdr));\n\n    /* Shrink packet */\n    pbuf_realloc(outpkt->pbuf, outpkt->write_offset);\n\n    if (IP_IS_V6_VAL(outpkt->dest_addr)) {\n#if LWIP_IPV6\n      mcast_destaddr = &v6group;\n#endif\n    } else {\n#if LWIP_IPV4\n      mcast_destaddr = &v4group;\n#endif\n    }\n    /* Send created packet */\n    LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Sending packet, len=%d, unicast=%d\\n\", outpkt->write_offset, outpkt->unicast_reply));\n    if (outpkt->unicast_reply) {\n      udp_sendto_if(mdns_pcb, outpkt->pbuf, &outpkt->dest_addr, outpkt->dest_port, outpkt->netif);\n    } else {\n      udp_sendto_if(mdns_pcb, outpkt->pbuf, mcast_destaddr, MDNS_PORT, outpkt->netif);\n    }\n  }\n\ncleanup:\n  if (outpkt->pbuf) {\n    pbuf_free(outpkt->pbuf);\n    outpkt->pbuf = NULL;\n  }\n}\n\n/**\n * Send unsolicited answer containing all our known data\n * @param netif The network interface to send on\n * @param destination The target address to send to (usually multicast address)\n */\nstatic void\nmdns_announce(struct netif *netif, const ip_addr_t *destination)\n{\n  struct mdns_outpacket announce;\n  int i;\n  struct mdns_host* mdns = NETIF_TO_HOST(netif);\n\n  memset(&announce, 0, sizeof(announce));\n  announce.netif = netif;\n  announce.cache_flush = 1;\n#if LWIP_IPV4\n  if (!ip4_addr_isany_val(*netif_ip4_addr(netif)))\n    announce.host_replies = REPLY_HOST_A | REPLY_HOST_PTR_V4;\n#endif\n#if LWIP_IPV6\n  for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {\n    if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) {\n      announce.host_replies |= REPLY_HOST_AAAA | REPLY_HOST_PTR_V6;\n      announce.host_reverse_v6_replies |= (1 << i);\n    }\n  }\n#endif\n\n  for (i = 0; i < MDNS_MAX_SERVICES; i++) {\n    struct mdns_service *serv = mdns->services[i];\n    if (serv) {\n      announce.serv_replies[i] = REPLY_SERVICE_TYPE_PTR | REPLY_SERVICE_NAME_PTR |\n          REPLY_SERVICE_SRV | REPLY_SERVICE_TXT;\n    }\n  }\n\n  announce.dest_port = MDNS_PORT;\n  SMEMCPY(&announce.dest_addr, destination, sizeof(announce.dest_addr));\n  mdns_send_outpacket(&announce);\n}\n\n/**\n * Handle question MDNS packet\n * 1. Parse all questions and set bits what answers to send\n * 2. Clear pending answers if known answers are supplied\n * 3. Put chosen answers in new packet and send as reply\n */\nstatic void\nmdns_handle_question(struct mdns_packet *pkt)\n{\n  struct mdns_service *service;\n  struct mdns_outpacket reply;\n  int replies = 0;\n  int i;\n  err_t res;\n  struct mdns_host* mdns = NETIF_TO_HOST(pkt->netif);\n\n  mdns_init_outpacket(&reply, pkt);\n\n  while (pkt->questions_left) {\n    struct mdns_question q;\n\n    res = mdns_read_question(pkt, &q);\n    if (res != ERR_OK) {\n      LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Failed to parse question, skipping query packet\\n\"));\n      return;\n    }\n\n    LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Query for domain \"));\n    mdns_domain_debug_print(&q.info.domain);\n    LWIP_DEBUGF(MDNS_DEBUG, (\" type %d class %d\\n\", q.info.type, q.info.klass));\n\n    if (q.unicast) {\n      /* Reply unicast if any question is unicast */\n      reply.unicast_reply = 1;\n    }\n\n    reply.host_replies |= check_host(pkt->netif, &q.info, &reply.host_reverse_v6_replies);\n    replies |= reply.host_replies;\n\n    for (i = 0; i < MDNS_MAX_SERVICES; ++i) {\n      service = mdns->services[i];\n      if (!service) {\n        continue;\n      }\n      reply.serv_replies[i] |= check_service(service, &q.info);\n      replies |= reply.serv_replies[i];\n    }\n\n    if (replies && reply.legacy_query) {\n      /* Add question to reply packet (legacy packet only has 1 question) */\n      res = mdns_add_question(&reply, &q.info.domain, q.info.type, q.info.klass, 0);\n      if (res != ERR_OK) {\n        goto cleanup;\n      }\n    }\n  }\n\n  /* Handle known answers */\n  while (pkt->answers_left) {\n    struct mdns_answer ans;\n    u8_t rev_v6;\n    int match;\n\n    res = mdns_read_answer(pkt, &ans);\n    if (res != ERR_OK) {\n      LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Failed to parse answer, skipping query packet\\n\"));\n      goto cleanup;\n    }\n\n    LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Known answer for domain \"));\n    mdns_domain_debug_print(&ans.info.domain);\n    LWIP_DEBUGF(MDNS_DEBUG, (\" type %d class %d\\n\", ans.info.type, ans.info.klass));\n\n\n    if (ans.info.type == DNS_RRTYPE_ANY || ans.info.klass == DNS_RRCLASS_ANY) {\n      /* Skip known answers for ANY type & class */\n      continue;\n    }\n\n    rev_v6 = 0;\n    match = reply.host_replies & check_host(pkt->netif, &ans.info, &rev_v6);\n    if (match && (ans.ttl > (mdns->dns_ttl / 2))) {\n      /* The RR in the known answer matches an RR we are planning to send,\n       * and the TTL is less than half gone.\n       * If the payload matches we should not send that answer.\n       */\n      if (ans.info.type == DNS_RRTYPE_PTR) {\n        /* Read domain and compare */\n        struct mdns_domain known_ans, my_ans;\n        u16_t len;\n        len = mdns_readname(pkt->pbuf, ans.rd_offset, &known_ans);\n        res = mdns_build_host_domain(&my_ans, mdns);\n        if (len != MDNS_READNAME_ERROR && res == ERR_OK && mdns_domain_eq(&known_ans, &my_ans)) {\n#if LWIP_IPV4\n          if (match & REPLY_HOST_PTR_V4) {\n              LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Skipping known answer: v4 PTR\\n\"));\n              reply.host_replies &= ~REPLY_HOST_PTR_V4;\n          }\n#endif\n#if LWIP_IPV6\n          if (match & REPLY_HOST_PTR_V6) {\n              LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Skipping known answer: v6 PTR\\n\"));\n              reply.host_reverse_v6_replies &= ~rev_v6;\n              if (reply.host_reverse_v6_replies == 0) {\n                reply.host_replies &= ~REPLY_HOST_PTR_V6;\n              }\n          }\n#endif\n        }\n      } else if (match & REPLY_HOST_A) {\n#if LWIP_IPV4\n        if (ans.rd_length == sizeof(ip4_addr_t) &&\n            pbuf_memcmp(pkt->pbuf, ans.rd_offset, netif_ip4_addr(pkt->netif), ans.rd_length) == 0) {\n          LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Skipping known answer: A\\n\"));\n          reply.host_replies &= ~REPLY_HOST_A;\n        }\n#endif\n      } else if (match & REPLY_HOST_AAAA) {\n#if LWIP_IPV6\n        if (ans.rd_length == sizeof(ip6_addr_t) &&\n            /* TODO this clears all AAAA responses if first addr is set as known */\n            pbuf_memcmp(pkt->pbuf, ans.rd_offset, netif_ip6_addr(pkt->netif, 0), ans.rd_length) == 0) {\n          LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Skipping known answer: AAAA\\n\"));\n          reply.host_replies &= ~REPLY_HOST_AAAA;\n        }\n#endif\n      }\n    }\n\n    for (i = 0; i < MDNS_MAX_SERVICES; ++i) {\n      service = mdns->services[i];\n      if (!service) {\n        continue;\n      }\n      match = reply.serv_replies[i] & check_service(service, &ans.info);\n      if (match && (ans.ttl > (service->dns_ttl / 2))) {\n        /* The RR in the known answer matches an RR we are planning to send,\n         * and the TTL is less than half gone.\n         * If the payload matches we should not send that answer.\n         */\n        if (ans.info.type == DNS_RRTYPE_PTR) {\n          /* Read domain and compare */\n          struct mdns_domain known_ans, my_ans;\n          u16_t len;\n          len = mdns_readname(pkt->pbuf, ans.rd_offset, &known_ans);\n          if (len != MDNS_READNAME_ERROR) {\n            if (match & REPLY_SERVICE_TYPE_PTR) {\n              res = mdns_build_service_domain(&my_ans, service, 0);\n              if (res == ERR_OK && mdns_domain_eq(&known_ans, &my_ans)) {\n                LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Skipping known answer: service type PTR\\n\"));\n                reply.serv_replies[i] &= ~REPLY_SERVICE_TYPE_PTR;\n              }\n            }\n            if (match & REPLY_SERVICE_NAME_PTR) {\n              res = mdns_build_service_domain(&my_ans, service, 1);\n              if (res == ERR_OK && mdns_domain_eq(&known_ans, &my_ans)) {\n                LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Skipping known answer: service name PTR\\n\"));\n                reply.serv_replies[i] &= ~REPLY_SERVICE_NAME_PTR;\n              }\n            }\n          }\n        } else if (match & REPLY_SERVICE_SRV) {\n          /* Read and compare to my SRV record */\n          u16_t field16, len, read_pos;\n          struct mdns_domain known_ans, my_ans;\n          read_pos = ans.rd_offset;\n          do {\n            /* Check priority field */\n            len = pbuf_copy_partial(pkt->pbuf, &field16, sizeof(field16), read_pos);\n            if (len != sizeof(field16) || lwip_ntohs(field16) != SRV_PRIORITY) {\n              break;\n            }\n            read_pos += len;\n            /* Check weight field */\n            len = pbuf_copy_partial(pkt->pbuf, &field16, sizeof(field16), read_pos);\n            if (len != sizeof(field16) || lwip_ntohs(field16) != SRV_WEIGHT) {\n              break;\n            }\n            read_pos += len;\n            /* Check port field */\n            len = pbuf_copy_partial(pkt->pbuf, &field16, sizeof(field16), read_pos);\n            if (len != sizeof(field16) || lwip_ntohs(field16) != service->port) {\n              break;\n            }\n            read_pos += len;\n            /* Check host field */\n            len = mdns_readname(pkt->pbuf, read_pos, &known_ans);\n            mdns_build_host_domain(&my_ans, mdns);\n            if (len == MDNS_READNAME_ERROR || !mdns_domain_eq(&known_ans, &my_ans)) {\n              break;\n            }\n            LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Skipping known answer: SRV\\n\"));\n            reply.serv_replies[i] &= ~REPLY_SERVICE_SRV;\n          } while (0);\n        } else if (match & REPLY_SERVICE_TXT) {\n          mdns_prepare_txtdata(service);\n          if (service->txtdata.length == ans.rd_length &&\n              pbuf_memcmp(pkt->pbuf, ans.rd_offset, service->txtdata.name, ans.rd_length) == 0) {\n            LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Skipping known answer: TXT\\n\"));\n            reply.serv_replies[i] &= ~REPLY_SERVICE_TXT;\n          }\n        }\n      }\n    }\n  }\n\n  mdns_send_outpacket(&reply);\n\ncleanup:\n  if (reply.pbuf) {\n    /* This should only happen if we fail to alloc/write question for legacy query */\n    pbuf_free(reply.pbuf);\n    reply.pbuf = NULL;\n  }\n}\n\n/**\n * Handle response MDNS packet\n * Only prints debug for now. Will need more code to do conflict resolution.\n */\nstatic void\nmdns_handle_response(struct mdns_packet *pkt)\n{\n  /* Ignore all questions */\n  while (pkt->questions_left) {\n    struct mdns_question q;\n    err_t res;\n\n    res = mdns_read_question(pkt, &q);\n    if (res != ERR_OK) {\n      LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Failed to parse question, skipping response packet\\n\"));\n      return;\n    }\n  }\n\n  while (pkt->answers_left) {\n    struct mdns_answer ans;\n    err_t res;\n\n    res = mdns_read_answer(pkt, &ans);\n    if (res != ERR_OK) {\n      LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Failed to parse answer, skipping response packet\\n\"));\n      return;\n    }\n\n    LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Answer for domain \"));\n    mdns_domain_debug_print(&ans.info.domain);\n    LWIP_DEBUGF(MDNS_DEBUG, (\" type %d class %d\\n\", ans.info.type, ans.info.klass));\n  }\n}\n\n/**\n * Receive input function for MDNS packets.\n * Handles both IPv4 and IPv6 UDP pcbs.\n */\nstatic void\nmdns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)\n{\n  struct dns_hdr hdr;\n  struct mdns_packet packet;\n  struct netif *recv_netif = ip_current_input_netif();\n  u16_t offset = 0;\n\n  LWIP_UNUSED_ARG(arg);\n  LWIP_UNUSED_ARG(pcb);\n\n  LWIP_DEBUGF(MDNS_DEBUG, (\"MDNS: Received IPv%d MDNS packet, len %d\\n\", IP_IS_V6(addr)? 6 : 4, p->tot_len));\n\n  if (NETIF_TO_HOST(recv_netif) == NULL) {\n    /* From netif not configured for MDNS */\n    goto dealloc;\n  }\n\n  if (pbuf_copy_partial(p, &hdr, SIZEOF_DNS_HDR, offset) < SIZEOF_DNS_HDR) {\n    /* Too small */\n    goto dealloc;\n  }\n  offset += SIZEOF_DNS_HDR;\n\n  if (DNS_HDR_GET_OPCODE(&hdr)) {\n    /* Ignore non-standard queries in multicast packets (RFC 6762, section 18.3) */\n    goto dealloc;\n  }\n\n  memset(&packet, 0, sizeof(packet));\n  SMEMCPY(&packet.source_addr, addr, sizeof(packet.source_addr));\n  packet.source_port = port;\n  packet.netif = recv_netif;\n  packet.pbuf = p;\n  packet.parse_offset = offset;\n  packet.tx_id = lwip_ntohs(hdr.id);\n  packet.questions = packet.questions_left = lwip_ntohs(hdr.numquestions);\n  packet.answers = packet.answers_left = lwip_ntohs(hdr.numanswers) + lwip_ntohs(hdr.numauthrr) + lwip_ntohs(hdr.numextrarr);\n\n#if LWIP_IPV6\n  if (IP_IS_V6(ip_current_dest_addr())) {\n    if (!ip_addr_cmp(ip_current_dest_addr(), &v6group)) {\n      packet.recv_unicast = 1;\n    }\n  }\n#endif\n#if LWIP_IPV4\n  if (!IP_IS_V6(ip_current_dest_addr())) {\n    if (!ip_addr_cmp(ip_current_dest_addr(), &v4group)) {\n      packet.recv_unicast = 1;\n    }\n  }\n#endif\n\n  if (hdr.flags1 & DNS_FLAG1_RESPONSE) {\n    mdns_handle_response(&packet);\n  } else {\n    mdns_handle_question(&packet);\n  }\n\ndealloc:\n  pbuf_free(p);\n}\n\n/**\n * @ingroup mdns\n * Initiate MDNS responder. Will open UDP sockets on port 5353\n */\nvoid\nmdns_resp_init(void)\n{\n  err_t res;\n\n  mdns_pcb = udp_new_ip_type(IPADDR_TYPE_ANY);\n  LWIP_ASSERT(\"Failed to allocate pcb\", mdns_pcb != NULL);\n#if LWIP_MULTICAST_TX_OPTIONS\n  udp_set_multicast_ttl(mdns_pcb, MDNS_TTL);\n#else\n  mdns_pcb->ttl = MDNS_TTL;\n#endif\n  res = udp_bind(mdns_pcb, IP_ANY_TYPE, MDNS_PORT);\n  LWIP_UNUSED_ARG(res); /* in case of LWIP_NOASSERT */\n  LWIP_ASSERT(\"Failed to bind pcb\", res == ERR_OK);\n  udp_recv(mdns_pcb, mdns_recv, NULL);\n\n  mdns_netif_client_id = netif_alloc_client_data_id();\n}\n\n/**\n * @ingroup mdns\n * Announce IP settings have changed on netif.\n * Call this in your callback registered by netif_set_status_callback().\n * This function may go away in the future when netif supports registering\n * multiple callback functions.\n * @param netif The network interface where settings have changed.\n */\nvoid\nmdns_resp_netif_settings_changed(struct netif *netif)\n{\n  LWIP_ERROR(\"mdns_resp_netif_ip_changed: netif != NULL\", (netif != NULL), return);\n\n  if (NETIF_TO_HOST(netif) == NULL) {\n    return;\n  }\n\n  /* Announce on IPv6 and IPv4 */\n#if LWIP_IPV6\n   mdns_announce(netif, IP6_ADDR_ANY);\n#endif\n#if LWIP_IPV4\n   mdns_announce(netif, IP4_ADDR_ANY);\n#endif\n}\n\n/**\n * @ingroup mdns\n * Activate MDNS responder for a network interface and send announce packets.\n * @param netif The network interface to activate.\n * @param hostname Name to use. Queries for &lt;hostname&gt;.local will be answered\n *                 with the IP addresses of the netif. The hostname will be copied, the\n *                 given pointer can be on the stack.\n * @param dns_ttl Validity time in seconds to send out for IP address data in DNS replies\n * @return ERR_OK if netif was added, an err_t otherwise\n */\nerr_t\nmdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl)\n{\n  err_t res;\n  struct mdns_host* mdns;\n\n  LWIP_ERROR(\"mdns_resp_add_netif: netif != NULL\", (netif != NULL), return ERR_VAL);\n  LWIP_ERROR(\"mdns_resp_add_netif: Hostname too long\", (strlen(hostname) <= MDNS_LABEL_MAXLEN), return ERR_VAL);\n\n  LWIP_ASSERT(\"mdns_resp_add_netif: Double add\", NETIF_TO_HOST(netif) == NULL);\n  mdns = (struct mdns_host *) mem_malloc(sizeof(struct mdns_host));\n  LWIP_ERROR(\"mdns_resp_add_netif: Alloc failed\", (mdns != NULL), return ERR_MEM);\n\n  netif_set_client_data(netif, mdns_netif_client_id, mdns);\n\n  memset(mdns, 0, sizeof(struct mdns_host));\n  MEMCPY(&mdns->name, hostname, LWIP_MIN(MDNS_LABEL_MAXLEN, strlen(hostname)));\n  mdns->dns_ttl = dns_ttl;\n\n  /* Join multicast groups */\n#if LWIP_IPV4\n  res = igmp_joingroup_netif(netif, ip_2_ip4(&v4group));\n  if (res != ERR_OK) {\n    goto cleanup;\n  }\n#endif\n#if LWIP_IPV6\n  res = mld6_joingroup_netif(netif, ip_2_ip6(&v6group));\n  if (res != ERR_OK) {\n    goto cleanup;\n  }\n#endif\n\n  mdns_resp_netif_settings_changed(netif);\n  return ERR_OK;\n\ncleanup:\n  mem_free(mdns);\n  netif_set_client_data(netif, mdns_netif_client_id, NULL);\n  return res;\n}\n\n/**\n * @ingroup mdns\n * Stop responding to MDNS queries on this interface, leave multicast groups,\n * and free the helper structure and any of its services.\n * @param netif The network interface to remove.\n * @return ERR_OK if netif was removed, an err_t otherwise\n */\nerr_t\nmdns_resp_remove_netif(struct netif *netif)\n{\n  int i;\n  struct mdns_host* mdns;\n\n  LWIP_ASSERT(\"mdns_resp_remove_netif: Null pointer\", netif);\n  mdns = NETIF_TO_HOST(netif);\n  LWIP_ERROR(\"mdns_resp_remove_netif: Not an active netif\", (mdns != NULL), return ERR_VAL);\n\n  for (i = 0; i < MDNS_MAX_SERVICES; i++) {\n    struct mdns_service *service = mdns->services[i];\n    if (service) {\n      mem_free(service);\n    }\n  }\n\n  /* Leave multicast groups */\n#if LWIP_IPV4\n  igmp_leavegroup_netif(netif, ip_2_ip4(&v4group));\n#endif\n#if LWIP_IPV6\n  mld6_leavegroup_netif(netif, ip_2_ip6(&v6group));\n#endif\n\n  mem_free(mdns);\n  netif_set_client_data(netif, mdns_netif_client_id, NULL);\n  return ERR_OK;\n}\n\n/**\n * @ingroup mdns\n * Add a service to the selected network interface.\n * @param netif The network interface to publish this service on\n * @param name The name of the service\n * @param service The service type, like \"_http\"\n * @param proto The service protocol, DNSSD_PROTO_TCP for TCP (\"_tcp\") and DNSSD_PROTO_UDP\n *              for others (\"_udp\")\n * @param port The port the service listens to\n * @param dns_ttl Validity time in seconds to send out for service data in DNS replies\n * @param txt_fn Callback to get TXT data. Will be called each time a TXT reply is created to\n *               allow dynamic replies.\n * @param txt_data Userdata pointer for txt_fn\n * @return ERR_OK if the service was added to the netif, an err_t otherwise\n */\nerr_t\nmdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_data)\n{\n  int i;\n  int slot = -1;\n  struct mdns_service *srv;\n  struct mdns_host* mdns;\n\n  LWIP_ASSERT(\"mdns_resp_add_service: netif != NULL\", netif);\n  mdns = NETIF_TO_HOST(netif);\n  LWIP_ERROR(\"mdns_resp_add_service: Not an mdns netif\", (mdns != NULL), return ERR_VAL);\n\n  LWIP_ERROR(\"mdns_resp_add_service: Name too long\", (strlen(name) <= MDNS_LABEL_MAXLEN), return ERR_VAL);\n  LWIP_ERROR(\"mdns_resp_add_service: Service too long\", (strlen(service) <= MDNS_LABEL_MAXLEN), return ERR_VAL);\n  LWIP_ERROR(\"mdns_resp_add_service: Bad proto (need TCP or UDP)\", (proto == DNSSD_PROTO_TCP || proto == DNSSD_PROTO_UDP), return ERR_VAL);\n\n  for (i = 0; i < MDNS_MAX_SERVICES; i++) {\n    if (mdns->services[i] == NULL) {\n      slot = i;\n      break;\n    }\n  }\n  LWIP_ERROR(\"mdns_resp_add_service: Service list full (increase MDNS_MAX_SERVICES)\", (slot >= 0), return ERR_MEM);\n\n  srv = (struct mdns_service*)mem_malloc(sizeof(struct mdns_service));\n  LWIP_ERROR(\"mdns_resp_add_service: Alloc failed\", (srv != NULL), return ERR_MEM);\n\n  memset(srv, 0, sizeof(struct mdns_service));\n\n  MEMCPY(&srv->name, name, LWIP_MIN(MDNS_LABEL_MAXLEN, strlen(name)));\n  MEMCPY(&srv->service, service, LWIP_MIN(MDNS_LABEL_MAXLEN, strlen(service)));\n  srv->txt_fn = txt_fn;\n  srv->txt_userdata = txt_data;\n  srv->proto = (u16_t)proto;\n  srv->port = port;\n  srv->dns_ttl = dns_ttl;\n\n  mdns->services[slot] = srv;\n\n  /* Announce on IPv6 and IPv4 */\n#if LWIP_IPV6\n  mdns_announce(netif, IP6_ADDR_ANY);\n#endif\n#if LWIP_IPV4\n  mdns_announce(netif, IP4_ADDR_ANY);\n#endif\n\n  return ERR_OK;\n}\n\n/**\n * @ingroup mdns\n * Call this function from inside the service_get_txt_fn_t callback to add text data.\n * Buffer for TXT data is 256 bytes, and each field is prefixed with a length byte.\n * @param service The service provided to the get_txt callback\n * @param txt String to add to the TXT field.\n * @param txt_len Length of string\n * @return ERR_OK if the string was added to the reply, an err_t otherwise\n */\nerr_t\nmdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len)\n{\n  LWIP_ASSERT(\"mdns_resp_add_service_txtitem: service != NULL\", service);\n\n  /* Use a mdns_domain struct to store txt chunks since it is the same encoding */\n  return mdns_domain_add_label(&service->txtdata, txt, txt_len);\n}\n\n#endif /* LWIP_MDNS_RESPONDER */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/mqtt/mqtt.c",
    "content": "/**\n * @file\n * MQTT client\n *\n * @defgroup mqtt MQTT client\n * @ingroup apps\n * @verbinclude mqtt_client.txt\n */\n\n/*\n * Copyright (c) 2016 Erik Andersson <erian747@gmail.com>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack\n *\n * Author: Erik Andersson <erian747@gmail.com>\n *\n *\n * @todo:\n * - Handle large outgoing payloads for PUBLISH messages\n * - Fix restriction of a single topic in each (UN)SUBSCRIBE message (protocol has support for multiple topics)\n * - Add support for legacy MQTT protocol version\n *\n * Please coordinate changes and requests with Erik Andersson\n * Erik Andersson <erian747@gmail.com>\n *\n */\n#include \"lwip/apps/mqtt.h\"\n#include \"lwip/timeouts.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/err.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/tcp.h\"\n#include <string.h>\n\n#if LWIP_TCP && LWIP_CALLBACK_API\n\n/**\n * MQTT_DEBUG: Default is off.\n */\n#if !defined MQTT_DEBUG || defined __DOXYGEN__\n#define MQTT_DEBUG                  LWIP_DBG_OFF\n#endif\n\n#define MQTT_DEBUG_TRACE        (MQTT_DEBUG | LWIP_DBG_TRACE)\n#define MQTT_DEBUG_STATE        (MQTT_DEBUG | LWIP_DBG_STATE)\n#define MQTT_DEBUG_WARN         (MQTT_DEBUG | LWIP_DBG_LEVEL_WARNING)\n#define MQTT_DEBUG_WARN_STATE   (MQTT_DEBUG | LWIP_DBG_LEVEL_WARNING | LWIP_DBG_STATE)\n#define MQTT_DEBUG_SERIOUS      (MQTT_DEBUG | LWIP_DBG_LEVEL_SERIOUS)\n\nstatic void mqtt_cyclic_timer(void *arg);\n\n/**\n * MQTT client connection states\n */\nenum {\n  TCP_DISCONNECTED,\n  TCP_CONNECTING,\n  MQTT_CONNECTING,\n  MQTT_CONNECTED\n};\n\n/**\n * MQTT control message types\n */\nenum mqtt_message_type {\n  MQTT_MSG_TYPE_CONNECT = 1,\n  MQTT_MSG_TYPE_CONNACK = 2,\n  MQTT_MSG_TYPE_PUBLISH = 3,\n  MQTT_MSG_TYPE_PUBACK = 4,\n  MQTT_MSG_TYPE_PUBREC = 5,\n  MQTT_MSG_TYPE_PUBREL = 6,\n  MQTT_MSG_TYPE_PUBCOMP = 7,\n  MQTT_MSG_TYPE_SUBSCRIBE = 8,\n  MQTT_MSG_TYPE_SUBACK = 9,\n  MQTT_MSG_TYPE_UNSUBSCRIBE = 10,\n  MQTT_MSG_TYPE_UNSUBACK = 11,\n  MQTT_MSG_TYPE_PINGREQ = 12,\n  MQTT_MSG_TYPE_PINGRESP = 13,\n  MQTT_MSG_TYPE_DISCONNECT = 14\n};\n\n/** Helpers to extract control packet type and qos from first byte in fixed header */\n#define MQTT_CTL_PACKET_TYPE(fixed_hdr_byte0) ((fixed_hdr_byte0 & 0xf0) >> 4)\n#define MQTT_CTL_PACKET_QOS(fixed_hdr_byte0) ((fixed_hdr_byte0 & 0x6) >> 1)\n\n/**\n * MQTT connect flags, only used in CONNECT message\n */\nenum mqtt_connect_flag {\n  MQTT_CONNECT_FLAG_USERNAME = 1 << 7,\n  MQTT_CONNECT_FLAG_PASSWORD = 1 << 6,\n  MQTT_CONNECT_FLAG_WILL_RETAIN = 1 << 5,\n  MQTT_CONNECT_FLAG_WILL = 1 << 2,\n  MQTT_CONNECT_FLAG_CLEAN_SESSION = 1 << 1\n};\n\n\n#if defined(LWIP_DEBUG)\nstatic const char * const mqtt_message_type_str[15] =\n{\n  \"UNDEFINED\",\n  \"CONNECT\",\n  \"CONNACK\",\n  \"PUBLISH\",\n  \"PUBACK\",\n  \"PUBREC\",\n  \"PUBREL\",\n  \"PUBCOMP\",\n  \"SUBSCRIBE\",\n  \"SUBACK\",\n  \"UNSUBSCRIBE\",\n  \"UNSUBACK\",\n  \"PINGREQ\",\n  \"PINGRESP\",\n  \"DISCONNECT\"\n};\n\n/**\n * Message type value to string\n * @param msg_type see enum mqtt_message_type\n * \n * @return Control message type text string\n */\nstatic const char *\nmqtt_msg_type_to_str(u8_t msg_type)\n{\n  if (msg_type >= LWIP_ARRAYSIZE(mqtt_message_type_str)) {\n    msg_type = 0;\n  }\n  return mqtt_message_type_str[msg_type];\n}\n\n#endif\n\n\n/**\n * Generate MQTT packet identifier\n * @param client MQTT client\n * @return New packet identifier, range 1 to 65535\n */\nstatic u16_t\nmsg_generate_packet_id(mqtt_client_t *client)\n{\n  client->pkt_id_seq++;\n  if (client->pkt_id_seq == 0) {\n    client->pkt_id_seq++;\n  }\n  return client->pkt_id_seq;\n}\n\n/*--------------------------------------------------------------------------------------------------------------------- */\n/* Output ring buffer */\n\n\n#define MQTT_RINGBUF_IDX_MASK ((MQTT_OUTPUT_RINGBUF_SIZE) - 1)\n\n/** Add single item to ring buffer */\n#define mqtt_ringbuf_put(rb, item) ((rb)->buf)[(rb)->put++ & MQTT_RINGBUF_IDX_MASK] = (item)\n\n/** Return number of bytes in ring buffer */\n#define mqtt_ringbuf_len(rb) ((u16_t)((rb)->put - (rb)->get))\n\n/** Return number of bytes free in ring buffer */\n#define mqtt_ringbuf_free(rb) (MQTT_OUTPUT_RINGBUF_SIZE - mqtt_ringbuf_len(rb))\n\n/** Return number of bytes possible to read without wrapping around */\n#define mqtt_ringbuf_linear_read_length(rb) LWIP_MIN(mqtt_ringbuf_len(rb), (MQTT_OUTPUT_RINGBUF_SIZE - ((rb)->get & MQTT_RINGBUF_IDX_MASK)))\n\n/** Return pointer to ring buffer get position */\n#define mqtt_ringbuf_get_ptr(rb) (&(rb)->buf[(rb)->get & MQTT_RINGBUF_IDX_MASK])\n\n#define mqtt_ringbuf_advance_get_idx(rb, len) ((rb)->get += (len))\n\n\n/**\n * Try send as many bytes as possible from output ring buffer\n * @param rb Output ring buffer\n * @param tpcb TCP connection handle\n */\nstatic void\nmqtt_output_send(struct mqtt_ringbuf_t *rb, struct tcp_pcb *tpcb)\n{\n  err_t err;\n  u8_t wrap = 0;\n  u16_t ringbuf_lin_len = mqtt_ringbuf_linear_read_length(rb);\n  u16_t send_len = tcp_sndbuf(tpcb);\n  LWIP_ASSERT(\"mqtt_output_send: tpcb != NULL\", tpcb != NULL);\n\n  if (send_len == 0 || ringbuf_lin_len == 0) {\n    return;\n  }\n\n  LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_output_send: tcp_sndbuf: %d bytes, ringbuf_linear_available: %d, get %d, put %d\\n\",\n                                send_len, ringbuf_lin_len, ((rb)->get & MQTT_RINGBUF_IDX_MASK), ((rb)->put & MQTT_RINGBUF_IDX_MASK)));\n\n  if (send_len > ringbuf_lin_len) {\n    /* Space in TCP output buffer is larger than available in ring buffer linear portion */\n    send_len = ringbuf_lin_len;\n    /* Wrap around if more data in ring buffer after linear portion */\n    wrap = (mqtt_ringbuf_len(rb) > ringbuf_lin_len);\n  }\n  err = tcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY | (wrap ? TCP_WRITE_FLAG_MORE : 0));\n  if ((err == ERR_OK) && wrap) {\n    mqtt_ringbuf_advance_get_idx(rb, send_len);\n    /* Use the lesser one of ring buffer linear length and TCP send buffer size */\n    send_len = LWIP_MIN(tcp_sndbuf(tpcb), mqtt_ringbuf_linear_read_length(rb));\n    err = tcp_write(tpcb, mqtt_ringbuf_get_ptr(rb), send_len, TCP_WRITE_FLAG_COPY);\n  }\n\n  if (err == ERR_OK) {\n    mqtt_ringbuf_advance_get_idx(rb, send_len);\n    /* Flush */\n    tcp_output(tpcb);\n  } else {\n    LWIP_DEBUGF(MQTT_DEBUG_WARN, (\"mqtt_output_send: Send failed with err %d (\\\"%s\\\")\\n\", err, lwip_strerr(err)));\n  }\n}\n\n\n\n/*--------------------------------------------------------------------------------------------------------------------- */\n/* Request queue */\n\n/**\n * Create request item\n * @param r_objs Pointer to request objects\n * @param pkt_id Packet identifier of request\n * @param cb Packet callback to call when requests lifetime ends\n * @param arg Parameter following callback\n * @return Request or NULL if failed to create\n */\nstatic struct mqtt_request_t *\nmqtt_create_request(struct mqtt_request_t *r_objs, u16_t pkt_id, mqtt_request_cb_t cb, void *arg)\n{\n  struct mqtt_request_t *r = NULL;\n  u8_t n;\n  LWIP_ASSERT(\"mqtt_create_request: r_objs != NULL\", r_objs != NULL);\n  for (n = 0; n < MQTT_REQ_MAX_IN_FLIGHT; n++) {\n    /* Item point to itself if not in use */\n    if (r_objs[n].next == &r_objs[n]) {\n      r = &r_objs[n];\n      r->next = NULL;\n      r->cb = cb;\n      r->arg = arg;\n      r->pkt_id = pkt_id;\n      break;\n    }\n  }\n  return r;\n}\n\n\n/**\n * Append request to pending request queue\n * @param tail Pointer to request queue tail pointer\n * @param r Request to append\n */\nstatic void\nmqtt_append_request(struct mqtt_request_t **tail, struct mqtt_request_t *r)\n{\n  struct mqtt_request_t *head = NULL;\n  s16_t time_before = 0;\n  struct mqtt_request_t *iter;\n\n  LWIP_ASSERT(\"mqtt_append_request: tail != NULL\", tail != NULL);\n\n  /* Iterate trough queue to find head, and count total timeout time */\n  for (iter = *tail; iter != NULL; iter = iter->next) {\n    time_before += iter->timeout_diff;\n    head = iter;\n  }\n\n  LWIP_ASSERT(\"mqtt_append_request: time_before <= MQTT_REQ_TIMEOUT\", time_before <= MQTT_REQ_TIMEOUT);\n  r->timeout_diff = MQTT_REQ_TIMEOUT - time_before;\n  if (head == NULL) {\n    *tail = r;\n  } else {\n    head->next = r;\n  }\n}\n\n\n/**\n * Delete request item\n * @param r Request item to delete\n */\nstatic void\nmqtt_delete_request(struct mqtt_request_t *r)\n{\n  if (r != NULL) {\n    r->next = r;\n  }\n}\n\n/**\n * Remove a request item with a specific packet identifier from request queue\n * @param tail Pointer to request queue tail pointer\n * @param pkt_id Packet identifier of request to take\n * @return Request item if found, NULL if not\n */\nstatic struct mqtt_request_t *\nmqtt_take_request(struct mqtt_request_t **tail, u16_t pkt_id)\n{\n  struct mqtt_request_t *iter = NULL, *prev = NULL;\n  LWIP_ASSERT(\"mqtt_take_request: tail != NULL\", tail != NULL);\n  /* Search all request for pkt_id */\n  for (iter = *tail; iter != NULL; iter = iter->next) {\n    if (iter->pkt_id == pkt_id) {\n      break;\n    }\n    prev = iter;\n  }\n\n  /* If request was found */\n  if (iter != NULL) {\n    /* unchain */\n    if (prev == NULL) {\n      *tail= iter->next;\n    } else {\n      prev->next = iter->next;\n    }\n    /* If exists, add remaining timeout time for the request to next */\n    if (iter->next != NULL) {\n      iter->next->timeout_diff += iter->timeout_diff;\n    }\n    iter->next = NULL;\n  }\n  return iter;\n}\n\n/**\n * Handle requests timeout\n * @param tail Pointer to request queue tail pointer\n * @param t Time since last call in seconds\n */\nstatic void\nmqtt_request_time_elapsed(struct mqtt_request_t **tail, u8_t t)\n{\n  struct mqtt_request_t *r;\n  LWIP_ASSERT(\"mqtt_request_time_elapsed: tail != NULL\", tail != NULL);\n  r = *tail;\n  while (t > 0 && r != NULL) {\n    if (t >= r->timeout_diff) {\n      t -= (u8_t)r->timeout_diff;\n      /* Unchain */\n      *tail = r->next;\n      /* Notify upper layer about timeout */\n      if (r->cb != NULL) {\n        r->cb(r->arg, ERR_TIMEOUT);\n      }\n      mqtt_delete_request(r);\n      /* Tail might be be modified in callback, so re-read it in every iteration */\n      r = *(struct mqtt_request_t * const volatile *)tail;\n    } else {\n      r->timeout_diff -= t;\n      t = 0;\n    }\n  }\n}\n\n/**\n * Free all request items\n * @param tail Pointer to request queue tail pointer\n */\nstatic void\nmqtt_clear_requests(struct mqtt_request_t **tail)\n{\n  struct mqtt_request_t *iter, *next;\n  LWIP_ASSERT(\"mqtt_clear_requests: tail != NULL\", tail != NULL);\n  for (iter = *tail; iter != NULL; iter = next) {\n    next = iter->next;\n    mqtt_delete_request(iter);\n  }\n  *tail = NULL;\n}\n/**\n * Initialize all request items\n * @param r_objs Pointer to request objects\n */\nstatic void\nmqtt_init_requests(struct mqtt_request_t *r_objs)\n{\n  u8_t n;\n  LWIP_ASSERT(\"mqtt_init_requests: r_objs != NULL\", r_objs != NULL);\n  for (n = 0; n < MQTT_REQ_MAX_IN_FLIGHT; n++) {\n    /* Item pointing to itself indicates unused */\n    r_objs[n].next = &r_objs[n];\n  }\n}\n\n/*--------------------------------------------------------------------------------------------------------------------- */\n/* Output message build helpers */\n\n\nstatic void\nmqtt_output_append_u8(struct mqtt_ringbuf_t *rb, u8_t value)\n{\n  mqtt_ringbuf_put(rb, value);\n}\n\nstatic\nvoid mqtt_output_append_u16(struct mqtt_ringbuf_t *rb, u16_t value)\n{\n  mqtt_ringbuf_put(rb, value >> 8);\n  mqtt_ringbuf_put(rb, value & 0xff);\n}\n\nstatic void\nmqtt_output_append_buf(struct mqtt_ringbuf_t *rb, const void *data, u16_t length)\n{\n  u16_t n;\n  for (n = 0; n < length; n++) {\n    mqtt_ringbuf_put(rb, ((const u8_t *)data)[n]);\n  }\n}\n\nstatic void\nmqtt_output_append_string(struct mqtt_ringbuf_t *rb, const char *str, u16_t length)\n{\n  u16_t n;\n  mqtt_ringbuf_put(rb, length >> 8);\n  mqtt_ringbuf_put(rb, length & 0xff);\n  for (n = 0; n < length; n++) {\n    mqtt_ringbuf_put(rb, str[n]);\n  }\n}\n\n/**\n * Append fixed header\n * @param rb Output ring buffer\n * @param msg_type see enum mqtt_message_type\n * @param dup MQTT DUP flag\n * @param qos MQTT QoS field\n * @param retain MQTT retain flag\n * @param r_length Remaining length after fixed header\n */\n\nstatic void\nmqtt_output_append_fixed_header(struct mqtt_ringbuf_t *rb, u8_t msg_type, u8_t dup,\n                 u8_t qos, u8_t retain, u16_t r_length)\n{\n  /* Start with control byte */\n  mqtt_output_append_u8(rb, (((msg_type & 0x0f) << 4) | ((dup & 1) << 3) | ((qos & 3) << 1) | (retain & 1)));\n  /* Encode remaining length field */\n  do {\n    mqtt_output_append_u8(rb, (r_length & 0x7f) | (r_length >= 128 ? 0x80 : 0));\n    r_length >>= 7;\n  } while (r_length > 0);\n}\n\n\n/**\n * Check output buffer space\n * @param rb Output ring buffer\n * @param r_length Remaining length after fixed header\n * @return 1 if message will fit, 0 if not enough buffer space\n */\nstatic u8_t\nmqtt_output_check_space(struct mqtt_ringbuf_t *rb, u16_t r_length)\n{\n  /* Start with length of type byte + remaining length */\n  u16_t total_len = 1 + r_length;\n\n  LWIP_ASSERT(\"mqtt_output_check_space: rb != NULL\", rb != NULL);\n\n /* Calculate number of required bytes to contain the remaining bytes field and add to total*/\n  do {\n    total_len++;\n    r_length >>= 7;\n  } while (r_length > 0);\n\n  return (total_len <= mqtt_ringbuf_free(rb));\n}\n\n\n/**\n * Close connection to server\n * @param client MQTT client\n * @param reason Reason for disconnection\n */\nstatic void\nmqtt_close(mqtt_client_t *client, mqtt_connection_status_t reason)\n{\n  LWIP_ASSERT(\"mqtt_close: client != NULL\", client != NULL);\n\n  /* Bring down TCP connection if not already done */\n  if (client->conn != NULL) {\n    err_t res;\n    tcp_recv(client->conn, NULL);\n    tcp_err(client->conn,  NULL);\n    tcp_sent(client->conn, NULL);\n    res = tcp_close(client->conn);\n    if (res != ERR_OK) {\n      tcp_abort(client->conn);\n      LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_close: Close err=%s\\n\", lwip_strerr(res)));\n    }\n    client->conn = NULL;\n  }\n\n  /* Remove all pending requests */\n  mqtt_clear_requests(&client->pend_req_queue);\n  /* Stop cyclic timer */\n  sys_untimeout(mqtt_cyclic_timer, client);\n\n  /* Notify upper layer of disconnection if changed state */\n  if (client->conn_state != TCP_DISCONNECTED) {\n\n    client->conn_state = TCP_DISCONNECTED;\n    if (client->connect_cb != NULL) {\n      client->connect_cb(client, client->connect_arg, reason);\n    }\n  }\n}\n\n\n/**\n * Interval timer, called every MQTT_CYCLIC_TIMER_INTERVAL seconds in MQTT_CONNECTING and MQTT_CONNECTED states\n * @param arg MQTT client\n */\nstatic void\nmqtt_cyclic_timer(void *arg)\n{\n  u8_t restart_timer = 1;\n  mqtt_client_t *client = (mqtt_client_t *)arg;\n  LWIP_ASSERT(\"mqtt_cyclic_timer: client != NULL\", client != NULL);\n\n  if (client->conn_state == MQTT_CONNECTING) {\n    client->cyclic_tick++;\n    if ((client->cyclic_tick * MQTT_CYCLIC_TIMER_INTERVAL) >= MQTT_CONNECT_TIMOUT) {\n      LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_cyclic_timer: CONNECT attempt to server timed out\\n\"));\n      /* Disconnect TCP */\n      mqtt_close(client, MQTT_CONNECT_TIMEOUT);\n      restart_timer = 0;\n    }\n  } else if (client->conn_state == MQTT_CONNECTED) {\n    /* Handle timeout for pending requests */\n    mqtt_request_time_elapsed(&client->pend_req_queue, MQTT_CYCLIC_TIMER_INTERVAL);\n\n    /* keep_alive > 0 means keep alive functionality shall be used */\n    if (client->keep_alive > 0) {\n\n      client->server_watchdog++;\n      /* If reception from server has been idle for 1.5*keep_alive time, server is considered unresponsive */\n      if ((client->server_watchdog * MQTT_CYCLIC_TIMER_INTERVAL) > (client->keep_alive + client->keep_alive/2)) {\n        LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_cyclic_timer: Server incoming keep-alive timeout\\n\"));\n        mqtt_close(client, MQTT_CONNECT_TIMEOUT);\n        restart_timer = 0;\n      }\n\n      /* If time for a keep alive message to be sent, transmission has been idle for keep_alive time */\n      if ((client->cyclic_tick * MQTT_CYCLIC_TIMER_INTERVAL) >= client->keep_alive) {\n        LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_cyclic_timer: Sending keep-alive message to server\\n\"));\n        if (mqtt_output_check_space(&client->output, 0) != 0) {\n          mqtt_output_append_fixed_header(&client->output, MQTT_MSG_TYPE_PINGREQ, 0, 0, 0, 0);\n          client->cyclic_tick = 0;\n        }\n      } else {\n        client->cyclic_tick++;\n      }\n    }\n  } else {\n    LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_cyclic_timer: Timer should not be running in state %d\\n\", client->conn_state));\n    restart_timer = 0;\n  }\n  if (restart_timer) {\n    sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL*1000, mqtt_cyclic_timer, arg);\n  }\n}\n\n\n/**\n * Send PUBACK, PUBREC or PUBREL response message\n * @param client MQTT client\n * @param msg PUBACK, PUBREC or PUBREL\n * @param pkt_id Packet identifier\n * @param qos QoS value\n * @return ERR_OK if successful, ERR_MEM if out of memory\n */\nstatic err_t\npub_ack_rec_rel_response(mqtt_client_t *client, u8_t msg, u16_t pkt_id, u8_t qos)\n{\n  err_t err = ERR_OK;\n  if (mqtt_output_check_space(&client->output, 2)) {\n    mqtt_output_append_fixed_header(&client->output, msg, 0, qos, 0, 2);\n    mqtt_output_append_u16(&client->output, pkt_id);\n    mqtt_output_send(&client->output, client->conn);\n  } else {\n    LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"pub_ack_rec_rel_response: OOM creating response: %s with pkt_id: %d\\n\",\n                                  mqtt_msg_type_to_str(msg), pkt_id));\n    err = ERR_MEM;\n  }\n  return err;\n}\n\n/**\n * Subscribe response from server\n * @param r Matching request\n * @param result Result code from server\n */\nstatic void\nmqtt_incomming_suback(struct mqtt_request_t *r, u8_t result)\n{\n  if (r->cb != NULL) {\n    r->cb(r->arg, result < 3 ? ERR_OK : ERR_ABRT);\n  }\n}\n\n\n/**\n * Complete MQTT message received or buffer full\n * @param client MQTT client\n * @param fixed_hdr_idx header index\n * @param length length received part\n * @param remaining_length Remaining length of complete message\n */\nstatic mqtt_connection_status_t\n  mqtt_message_received(mqtt_client_t *client, u8_t fixed_hdr_idx, u16_t length, u32_t remaining_length)\n{\n  mqtt_connection_status_t res = MQTT_CONNECT_ACCEPTED;\n\n  u8_t *var_hdr_payload = client->rx_buffer + fixed_hdr_idx;\n\n  /* Control packet type */\n  u8_t pkt_type = MQTT_CTL_PACKET_TYPE(client->rx_buffer[0]);\n  u16_t pkt_id = 0;\n\n  if (pkt_type == MQTT_MSG_TYPE_CONNACK) {\n    if (client->conn_state == MQTT_CONNECTING) {\n      /* Get result code from CONNACK */\n      res = (mqtt_connection_status_t)var_hdr_payload[1];\n      LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_message_received: Connect response code %d\\n\", res));\n      if (res == MQTT_CONNECT_ACCEPTED) {\n        /* Reset cyclic_tick when changing to connected state */\n        client->cyclic_tick = 0;\n        client->conn_state = MQTT_CONNECTED;\n        /* Notify upper layer */\n        if (client->connect_cb != 0) {\n          client->connect_cb(client, client->connect_arg, res);\n        }\n      }\n    } else {\n      LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_message_received: Received CONNACK in connected state\\n\"));\n    }\n  } else if (pkt_type == MQTT_MSG_TYPE_PINGRESP) {\n    LWIP_DEBUGF(MQTT_DEBUG_TRACE,( \"mqtt_message_received: Received PINGRESP from server\\n\"));\n\n  } else if (pkt_type == MQTT_MSG_TYPE_PUBLISH) {\n    u16_t payload_offset = 0;\n    u16_t payload_length = length;\n    u8_t qos = MQTT_CTL_PACKET_QOS(client->rx_buffer[0]);\n\n    if (client->msg_idx <= MQTT_VAR_HEADER_BUFFER_LEN) {\n      /* Should have topic and pkt id*/\n      uint8_t *topic;\n      uint16_t after_topic;\n      u8_t bkp;\n      u16_t topic_len = var_hdr_payload[0];\n      topic_len = (topic_len << 8) + (u16_t)(var_hdr_payload[1]);\n\n      topic = var_hdr_payload + 2;\n      after_topic = 2 + topic_len;\n      /* Check length, add one byte even for QoS 0 so that zero termination will fit */\n      if ((after_topic + (qos? 2 : 1)) > length) {\n        LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_message_received: Receive buffer can not fit topic + pkt_id\\n\"));\n        goto out_disconnect;\n      }\n\n      /* id for QoS 1 and 2 */\n      if (qos > 0) {\n        client->inpub_pkt_id = ((u16_t)var_hdr_payload[after_topic] << 8) + (u16_t)var_hdr_payload[after_topic + 1];\n        after_topic += 2;\n      } else {\n        client->inpub_pkt_id = 0;\n      }\n      /* Take backup of byte after topic */\n      bkp = topic[topic_len];\n      /* Zero terminate string */\n      topic[topic_len] = 0;\n      /* Payload data remaining in receive buffer */\n      payload_length = length - after_topic;\n      payload_offset = after_topic;\n\n      LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_incomming_publish: Received message with QoS %d at topic: %s, payload length %d\\n\",\n                                    qos, topic, remaining_length + payload_length));\n      if (client->pub_cb != NULL) {\n        client->pub_cb(client->inpub_arg, (const char *)topic, remaining_length + payload_length);\n      }\n      /* Restore byte after topic */\n      topic[topic_len] = bkp;\n    }\n    if (payload_length > 0 || remaining_length == 0) {\n      client->data_cb(client->inpub_arg, var_hdr_payload + payload_offset, payload_length, remaining_length == 0 ? MQTT_DATA_FLAG_LAST : 0);\n      /* Reply if QoS > 0 */\n      if (remaining_length == 0 && qos > 0) {\n        /* Send PUBACK for QoS 1 or PUBREC for QoS 2 */\n        u8_t resp_msg = (qos == 1) ? MQTT_MSG_TYPE_PUBACK : MQTT_MSG_TYPE_PUBREC;\n        LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_incomming_publish: Sending publish response: %s with pkt_id: %d\\n\",\n                                      mqtt_msg_type_to_str(resp_msg), client->inpub_pkt_id));\n        pub_ack_rec_rel_response(client, resp_msg, client->inpub_pkt_id, 0);\n      }\n    }\n  } else {\n    /* Get packet identifier */\n    pkt_id = (u16_t)var_hdr_payload[0] << 8;\n    pkt_id |= (u16_t)var_hdr_payload[1];\n    if (pkt_id == 0) {\n      LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_message_received: Got message with illegal packet identifier: 0\\n\"));\n      goto out_disconnect;\n    }\n    if (pkt_type == MQTT_MSG_TYPE_PUBREC) {\n      LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_message_received: PUBREC, sending PUBREL with pkt_id: %d\\n\",pkt_id));\n      pub_ack_rec_rel_response(client, MQTT_MSG_TYPE_PUBREL, pkt_id, 1);\n\n    } else if (pkt_type == MQTT_MSG_TYPE_PUBREL) {\n      LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_message_received: PUBREL, sending PUBCOMP response with pkt_id: %d\\n\",pkt_id));\n      pub_ack_rec_rel_response(client, MQTT_MSG_TYPE_PUBCOMP, pkt_id, 0);\n\n    } else if (pkt_type == MQTT_MSG_TYPE_SUBACK || pkt_type == MQTT_MSG_TYPE_UNSUBACK ||\n              pkt_type == MQTT_MSG_TYPE_PUBCOMP || pkt_type == MQTT_MSG_TYPE_PUBACK) {\n      struct mqtt_request_t *r = mqtt_take_request(&client->pend_req_queue, pkt_id);\n      if (r != NULL) {\n        LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_message_received: %s response with id %d\\n\", mqtt_msg_type_to_str(pkt_type), pkt_id));\n        if (pkt_type == MQTT_MSG_TYPE_SUBACK) {\n          if (length < 3) {\n            LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_message_received: To small SUBACK packet\\n\"));\n            goto out_disconnect;\n          } else {\n            mqtt_incomming_suback(r, var_hdr_payload[2]);\n          }\n        } else if (r->cb != NULL) {\n          r->cb(r->arg, ERR_OK);\n        }\n        mqtt_delete_request(r);\n      } else {\n        LWIP_DEBUGF(MQTT_DEBUG_WARN,( \"mqtt_message_received: Received %s reply, with wrong pkt_id: %d\\n\", mqtt_msg_type_to_str(pkt_type), pkt_id));\n      }\n    } else {\n      LWIP_DEBUGF(MQTT_DEBUG_WARN,( \"mqtt_message_received: Received unknown message type: %d\\n\", pkt_type));\n      goto out_disconnect;\n    }\n  }\n  return res;\nout_disconnect:\n  return MQTT_CONNECT_DISCONNECTED;\n}\n\n\n/**\n * MQTT incoming message parser\n * @param client MQTT client\n * @param p PBUF chain of received data\n * @return Connection status\n */\nstatic mqtt_connection_status_t\nmqtt_parse_incoming(mqtt_client_t *client, struct pbuf *p)\n{\n  u16_t in_offset = 0;\n  u32_t msg_rem_len = 0;\n  u8_t fixed_hdr_idx = 0;\n  u8_t b = 0;\n\n  while (p->tot_len > in_offset) {\n    if ((fixed_hdr_idx < 2) || ((b & 0x80) != 0)) {\n\n      if (fixed_hdr_idx < client->msg_idx) {\n        b = client->rx_buffer[fixed_hdr_idx];\n      } else {\n        b = pbuf_get_at(p, in_offset++);\n        client->rx_buffer[client->msg_idx++] = b;\n      }\n      fixed_hdr_idx++;\n\n      if (fixed_hdr_idx >= 2) {\n        msg_rem_len |= (u32_t)(b & 0x7f) << ((fixed_hdr_idx - 2) * 7);\n        if ((b & 0x80) == 0) {\n          LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_parse_incoming: Remaining length after fixed header: %d\\n\", msg_rem_len));\n          if (msg_rem_len == 0) {\n            /* Complete message with no extra headers of payload received */\n            mqtt_message_received(client, fixed_hdr_idx, 0, 0);\n            client->msg_idx = 0;\n            fixed_hdr_idx = 0;\n          } else {\n            /* Bytes remaining in message */\n            msg_rem_len = (msg_rem_len + fixed_hdr_idx) - client->msg_idx;\n          }\n        }\n      }\n    } else {\n      u16_t cpy_len, cpy_start, buffer_space;\n\n      cpy_start = (client->msg_idx - fixed_hdr_idx) % (MQTT_VAR_HEADER_BUFFER_LEN - fixed_hdr_idx) + fixed_hdr_idx;\n\n      /* Allow to copy the lesser one of available length in input data or bytes remaining in message */\n      cpy_len = (u16_t)LWIP_MIN((u16_t)(p->tot_len - in_offset), msg_rem_len);\n\n      /* Limit to available space in buffer */\n      buffer_space = MQTT_VAR_HEADER_BUFFER_LEN - cpy_start;\n      if (cpy_len > buffer_space) {\n        cpy_len = buffer_space;\n      }\n      pbuf_copy_partial(p, client->rx_buffer+cpy_start, cpy_len, in_offset);\n\n      /* Advance get and put indexes  */\n      client->msg_idx += cpy_len;\n      in_offset += cpy_len;\n      msg_rem_len -= cpy_len;\n\n      LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_parse_incoming: msg_idx: %d, cpy_len: %d, remaining %d\\n\", client->msg_idx, cpy_len, msg_rem_len));\n      if (msg_rem_len == 0 || cpy_len == buffer_space) {\n        /* Whole message received or buffer is full */\n        mqtt_connection_status_t res = mqtt_message_received(client, fixed_hdr_idx, (cpy_start + cpy_len) - fixed_hdr_idx, msg_rem_len);\n        if (res != MQTT_CONNECT_ACCEPTED) {\n          return res;\n        }\n        if (msg_rem_len == 0) {\n          /* Reset parser state */\n          client->msg_idx = 0;\n          /* msg_tot_len = 0; */\n          fixed_hdr_idx = 0;\n        }\n      }\n    }\n  }\n  return MQTT_CONNECT_ACCEPTED;\n}\n\n\n/**\n * TCP received callback function. @see tcp_recv_fn\n * @param arg MQTT client\n * @param p PBUF chain of received data\n * @param err Passed as return value if not ERR_OK\n * @return ERR_OK or err passed into callback\n */\nstatic err_t\nmqtt_tcp_recv_cb(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)\n{\n  mqtt_client_t *client = (mqtt_client_t *)arg;\n  LWIP_ASSERT(\"mqtt_tcp_recv_cb: client != NULL\", client != NULL);\n  LWIP_ASSERT(\"mqtt_tcp_recv_cb: client->conn == pcb\", client->conn == pcb);\n\n  if (p == NULL) {\n    LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_tcp_recv_cb: Recv pbuf=NULL, remote has closed connection\\n\"));\n    mqtt_close(client, MQTT_CONNECT_DISCONNECTED);\n  } else {\n    mqtt_connection_status_t res;\n    if (err != ERR_OK) {\n      LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_tcp_recv_cb: Recv err=%d\\n\", err));\n      pbuf_free(p);\n      return err;\n    }\n\n    /* Tell remote that data has been received */\n    tcp_recved(pcb, p->tot_len);\n    res = mqtt_parse_incoming(client, p);\n    pbuf_free(p);\n\n    if (res != MQTT_CONNECT_ACCEPTED) {\n      mqtt_close(client, res);\n    }\n    /* If keep alive functionality is used */\n    if (client->keep_alive != 0) {\n      /* Reset server alive watchdog */\n      client->server_watchdog = 0;\n    }\n\n  }\n  return ERR_OK;\n}\n\n\n/**\n * TCP data sent callback function. @see tcp_sent_fn\n * @param arg MQTT client\n * @param tpcb TCP connection handle\n * @param len Number of bytes sent\n * @return ERR_OK\n */\nstatic err_t\nmqtt_tcp_sent_cb(void *arg, struct tcp_pcb *tpcb, u16_t len)\n{\n  mqtt_client_t *client = (mqtt_client_t *)arg;\n\n  LWIP_UNUSED_ARG(tpcb);\n  LWIP_UNUSED_ARG(len);\n\n  if (client->conn_state == MQTT_CONNECTED) {\n    struct mqtt_request_t *r;\n\n    /* Reset keep-alive send timer and server watchdog */\n    client->cyclic_tick = 0;\n    client->server_watchdog = 0;\n    /* QoS 0 publish has no response from server, so call its callbacks here */\n    while ((r = mqtt_take_request(&client->pend_req_queue, 0)) != NULL) {\n      LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_tcp_sent_cb: Calling QoS 0 publish complete callback\\n\"));\n      if (r->cb != NULL) {\n        r->cb(r->arg, ERR_OK);\n      }\n      mqtt_delete_request(r);\n    }\n    /* Try send any remaining buffers from output queue */\n    mqtt_output_send(&client->output, client->conn);\n  }\n  return ERR_OK;\n}\n\n/**\n * TCP error callback function. @see tcp_err_fn\n * @param arg MQTT client\n * @param err Error encountered\n */\nstatic void\nmqtt_tcp_err_cb(void *arg, err_t err)\n{\n  mqtt_client_t *client = (mqtt_client_t *)arg;\n  LWIP_UNUSED_ARG(err); /* only used for debug output */\n  LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_tcp_err_cb: TCP error callback: error %d, arg: %p\\n\", err, arg));\n  LWIP_ASSERT(\"mqtt_tcp_err_cb: client != NULL\", client != NULL);\n  /* Set conn to null before calling close as pcb is already deallocated*/\n  client->conn = 0;\n  mqtt_close(client, MQTT_CONNECT_DISCONNECTED);\n}\n\n/**\n * TCP poll callback function. @see tcp_poll_fn\n * @param arg MQTT client\n * @param tpcb TCP connection handle\n * @return err ERR_OK\n */\nstatic err_t\nmqtt_tcp_poll_cb(void *arg, struct tcp_pcb *tpcb)\n{\n  mqtt_client_t *client = (mqtt_client_t *)arg;\n  if (client->conn_state == MQTT_CONNECTED) {\n    /* Try send any remaining buffers from output queue */\n    mqtt_output_send(&client->output, tpcb);\n  }\n  return ERR_OK;\n}\n\n/**\n * TCP connect callback function. @see tcp_connected_fn\n * @param arg MQTT client\n * @param err Always ERR_OK, mqtt_tcp_err_cb is called in case of error\n * @return ERR_OK\n */\nstatic err_t\nmqtt_tcp_connect_cb(void *arg, struct tcp_pcb *tpcb, err_t err)\n{\n  mqtt_client_t* client = (mqtt_client_t *)arg;\n\n  if (err != ERR_OK) {\n    LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_tcp_connect_cb: TCP connect error %d\\n\", err));\n    return err;\n  }\n\n  /* Initiate receiver state */\n  client->msg_idx = 0;\n\n  /* Setup TCP callbacks */\n  tcp_recv(tpcb, mqtt_tcp_recv_cb);\n  tcp_sent(tpcb, mqtt_tcp_sent_cb);\n  tcp_poll(tpcb, mqtt_tcp_poll_cb, 2);\n\n  LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_tcp_connect_cb: TCP connection established to server\\n\"));\n  /* Enter MQTT connect state */\n  client->conn_state = MQTT_CONNECTING;\n\n  /* Start cyclic timer */\n  sys_timeout(MQTT_CYCLIC_TIMER_INTERVAL*1000, mqtt_cyclic_timer, client);\n  client->cyclic_tick = 0;\n\n  /* Start transmission from output queue, connect message is the first one out*/\n  mqtt_output_send(&client->output, client->conn);\n\n  return ERR_OK;\n}\n\n\n\n/*---------------------------------------------------------------------------------------------------- */\n/* Public API */\n\n\n/**\n * @ingroup mqtt\n * MQTT publish function.\n * @param client MQTT client\n * @param topic Publish topic string\n * @param payload Data to publish (NULL is allowed)\n * @param payload_length: Length of payload (0 is allowed)\n * @param qos Quality of service, 0 1 or 2\n * @param retain MQTT retain flag\n * @param cb Callback to call when publish is complete or has timed out\n * @param arg User supplied argument to publish callback\n * @return ERR_OK if successful\n *         ERR_CONN if client is disconnected\n *         ERR_MEM if short on memory\n */\nerr_t\nmqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain,\n             mqtt_request_cb_t cb, void *arg)\n{\n  struct mqtt_request_t *r;\n  u16_t pkt_id;\n  size_t topic_strlen;\n  size_t total_len;\n  u16_t topic_len;\n  u16_t remaining_length;\n\n  LWIP_ASSERT(\"mqtt_publish: client != NULL\", client);\n  LWIP_ASSERT(\"mqtt_publish: topic != NULL\", topic);\n  LWIP_ERROR(\"mqtt_publish: TCP disconnected\", (client->conn_state != TCP_DISCONNECTED), return ERR_CONN);\n\n  topic_strlen = strlen(topic);\n  LWIP_ERROR(\"mqtt_publish: topic length overflow\", (topic_strlen <= (0xFFFF - 2)), return ERR_ARG);\n  topic_len = (u16_t)topic_strlen;\n  total_len = 2 + topic_len + payload_length;\n  LWIP_ERROR(\"mqtt_publish: total length overflow\", (total_len <= 0xFFFF), return ERR_ARG);\n  remaining_length = (u16_t)total_len;\n\n  LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_publish: Publish with payload length %d to topic \\\"%s\\\"\\n\", payload_length, topic));\n\n  if (qos > 0) {\n    remaining_length += 2;\n    /* Generate pkt_id id for QoS1 and 2 */\n    pkt_id = msg_generate_packet_id(client);\n  } else {\n    /* Use reserved value pkt_id 0 for QoS 0 in request handle */\n    pkt_id = 0;\n  }\n\n  r = mqtt_create_request(client->req_list, pkt_id, cb, arg);\n  if (r == NULL) {\n    return ERR_MEM;\n  }\n\n  if (mqtt_output_check_space(&client->output, remaining_length) == 0) {\n    mqtt_delete_request(r);\n    return ERR_MEM;\n  }\n  /* Append fixed header */\n  mqtt_output_append_fixed_header(&client->output, MQTT_MSG_TYPE_PUBLISH, 0, qos, retain, remaining_length);\n\n  /* Append Topic */\n  mqtt_output_append_string(&client->output, topic, topic_len);\n\n  /* Append packet if for QoS 1 and 2*/\n  if (qos > 0) {\n    mqtt_output_append_u16(&client->output, pkt_id);\n  }\n\n  /* Append optional publish payload */\n  if ((payload != NULL) && (payload_length > 0)) {\n    mqtt_output_append_buf(&client->output, payload, payload_length);\n  }\n\n  mqtt_append_request(&client->pend_req_queue, r);\n  mqtt_output_send(&client->output, client->conn);\n  return ERR_OK;\n}\n\n\n/**\n * @ingroup mqtt\n * MQTT subscribe/unsubscribe function.\n * @param client MQTT client\n * @param topic topic to subscribe to\n * @param qos Quality of service, 0 1 or 2 (only used for subscribe)\n * @param cb Callback to call when subscribe/unsubscribe reponse is received\n * @param arg User supplied argument to publish callback\n * @param sub 1 for subscribe, 0 for unsubscribe\n * @return ERR_OK if successful, @see err_t enum for other results\n */\nerr_t\nmqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub)\n{\n  size_t topic_strlen;\n  size_t total_len;\n  u16_t topic_len;\n  u16_t remaining_length;\n  u16_t pkt_id;\n  struct mqtt_request_t *r;\n\n  LWIP_ASSERT(\"mqtt_sub_unsub: client != NULL\", client);\n  LWIP_ASSERT(\"mqtt_sub_unsub: topic != NULL\", topic);\n\n  topic_strlen = strlen(topic);\n  LWIP_ERROR(\"mqtt_sub_unsub: topic length overflow\", (topic_strlen <= (0xFFFF - 2)), return ERR_ARG);\n  topic_len = (u16_t)topic_strlen;\n  /* Topic string, pkt_id, qos for subscribe */\n  total_len =  topic_len + 2 + 2 + (sub != 0);\n  LWIP_ERROR(\"mqtt_sub_unsub: total length overflow\", (total_len <= 0xFFFF), return ERR_ARG);\n  remaining_length = (u16_t)total_len;\n\n  LWIP_ASSERT(\"mqtt_sub_unsub: qos < 3\", qos < 3);\n  if (client->conn_state == TCP_DISCONNECTED) {\n    LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_sub_unsub: Can not (un)subscribe in disconnected state\\n\"));\n    return ERR_CONN;\n  }\n\n  pkt_id = msg_generate_packet_id(client);\n  r = mqtt_create_request(client->req_list, pkt_id, cb, arg);\n  if (r == NULL) {\n    return ERR_MEM;\n  }\n\n  if (mqtt_output_check_space(&client->output, remaining_length) == 0) {\n    mqtt_delete_request(r);\n    return ERR_MEM;\n  }\n\n  LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_sub_unsub: Client (un)subscribe to topic \\\"%s\\\", id: %d\\n\", topic, pkt_id));\n\n  mqtt_output_append_fixed_header(&client->output, sub ? MQTT_MSG_TYPE_SUBSCRIBE : MQTT_MSG_TYPE_UNSUBSCRIBE, 0, 1, 0, remaining_length);\n  /* Packet id */\n  mqtt_output_append_u16(&client->output, pkt_id);\n  /* Topic */\n  mqtt_output_append_string(&client->output, topic, topic_len);\n  /* QoS */\n  if (sub != 0) {\n    mqtt_output_append_u8(&client->output, LWIP_MIN(qos, 2));\n  }\n\n  mqtt_append_request(&client->pend_req_queue, r);\n  mqtt_output_send(&client->output, client->conn);\n  return ERR_OK;\n}\n\n\n/**\n * @ingroup mqtt\n * Set callback to handle incoming publish requests from server\n * @param client MQTT client\n * @param pub_cb Callback invoked when publish starts, contain topic and total length of payload\n * @param data_cb Callback for each fragment of payload that arrives\n * @param arg User supplied argument to both callbacks\n */\nvoid\nmqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t pub_cb,\n                             mqtt_incoming_data_cb_t data_cb, void *arg)\n{\n  LWIP_ASSERT(\"mqtt_set_inpub_callback: client != NULL\", client != NULL);\n  client->data_cb = data_cb;\n  client->pub_cb = pub_cb;\n  client->inpub_arg = arg;\n}\n\n/**\n * @ingroup mqtt\n * Create a new MQTT client instance\n * @return Pointer to instance on success, NULL otherwise\n */\nmqtt_client_t *\nmqtt_client_new(void)\n{\n  mqtt_client_t *client = (mqtt_client_t *)mem_malloc(sizeof(mqtt_client_t));\n  if (client != NULL) {\n    memset(client, 0, sizeof(mqtt_client_t));\n  }\n  return client;\n}\n\n\n/**\n * @ingroup mqtt\n * Connect to MQTT server\n * @param client MQTT client\n * @param ip_addr Server IP\n * @param port Server port\n * @param cb Connection state change callback\n * @param arg User supplied argument to connection callback\n * @param client_info Client identification and connection options\n * @return ERR_OK if successful, @see err_t enum for other results\n */\nerr_t\nmqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ip_addr, u16_t port, mqtt_connection_cb_t cb, void *arg,\n                    const struct mqtt_connect_client_info_t *client_info)\n{\n  err_t err;\n  size_t len;\n  u16_t client_id_length;\n  /* Length is the sum of 2+\"MQTT\", protocol level, flags and keep alive */\n  u16_t remaining_length = 2 + 4 + 1 + 1 + 2;\n  u8_t flags = 0, will_topic_len = 0, will_msg_len = 0;\n\n  LWIP_ASSERT(\"mqtt_client_connect: client != NULL\", client != NULL);\n  LWIP_ASSERT(\"mqtt_client_connect: ip_addr != NULL\", ip_addr != NULL);\n  LWIP_ASSERT(\"mqtt_client_connect: client_info != NULL\", client_info != NULL);\n  LWIP_ASSERT(\"mqtt_client_connect: client_info->client_id != NULL\", client_info->client_id != NULL);\n\n  if (client->conn_state != TCP_DISCONNECTED) {\n    LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_client_connect: Already connected\\n\"));\n    return ERR_ISCONN;\n  }\n\n  /* Wipe clean */\n  memset(client, 0, sizeof(mqtt_client_t));\n  client->connect_arg = arg;\n  client->connect_cb = cb;\n  client->keep_alive = client_info->keep_alive;\n  mqtt_init_requests(client->req_list);\n\n  /* Build connect message */\n  if (client_info->will_topic != NULL && client_info->will_msg != NULL) {\n    flags |= MQTT_CONNECT_FLAG_WILL;\n    flags |= (client_info->will_qos & 3) << 3;\n    if (client_info->will_retain) {\n      flags |= MQTT_CONNECT_FLAG_WILL_RETAIN;\n    }\n    len = strlen(client_info->will_topic);\n    LWIP_ERROR(\"mqtt_client_connect: client_info->will_topic length overflow\", len <= 0xFF, return ERR_VAL);\n    LWIP_ERROR(\"mqtt_client_connect: client_info->will_topic length must be > 0\", len > 0, return ERR_VAL);\n    will_topic_len = (u8_t)len;\n    len = strlen(client_info->will_msg);\n    LWIP_ERROR(\"mqtt_client_connect: client_info->will_msg length overflow\", len <= 0xFF, return ERR_VAL);\n    will_msg_len = (u8_t)len;\n    len = remaining_length + 2 + will_topic_len + 2 + will_msg_len;\n    LWIP_ERROR(\"mqtt_client_connect: remaining_length overflow\", len <= 0xFFFF, return ERR_VAL);\n    remaining_length = (u16_t)len;\n  }\n\n  /* Don't complicate things, always connect using clean session */\n  flags |= MQTT_CONNECT_FLAG_CLEAN_SESSION;\n\n  len = strlen(client_info->client_id);\n  LWIP_ERROR(\"mqtt_client_connect: client_info->client_id length overflow\", len <= 0xFFFF, return ERR_VAL);\n  client_id_length = (u16_t)len;\n  len = remaining_length + 2 + client_id_length;\n  LWIP_ERROR(\"mqtt_client_connect: remaining_length overflow\", len <= 0xFFFF, return ERR_VAL);\n  remaining_length = (u16_t)len;\n\n  if (mqtt_output_check_space(&client->output, remaining_length) == 0) {\n    return ERR_MEM;\n  }\n\n  client->conn = tcp_new();\n  if (client->conn == NULL) {\n    return ERR_MEM;\n  }\n\n  /* Set arg pointer for callbacks */\n  tcp_arg(client->conn, client);\n  /* Any local address, pick random local port number */\n  err = tcp_bind(client->conn, IP_ADDR_ANY, 0);\n  if (err != ERR_OK) {\n    LWIP_DEBUGF(MQTT_DEBUG_WARN,(\"mqtt_client_connect: Error binding to local ip/port, %d\\n\", err));\n    goto tcp_fail;\n  }\n  LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_client_connect: Connecting to host: %s at port:%\"U16_F\"\\n\", ipaddr_ntoa(ip_addr), port));\n\n  /* Connect to server */\n  err = tcp_connect(client->conn, ip_addr, port, mqtt_tcp_connect_cb);\n  if (err != ERR_OK) {\n    LWIP_DEBUGF(MQTT_DEBUG_TRACE,(\"mqtt_client_connect: Error connecting to remote ip/port, %d\\n\", err));\n    goto tcp_fail;\n  }\n  /* Set error callback */\n  tcp_err(client->conn, mqtt_tcp_err_cb);\n  client->conn_state = TCP_CONNECTING;\n\n  /* Append fixed header */\n  mqtt_output_append_fixed_header(&client->output, MQTT_MSG_TYPE_CONNECT, 0, 0, 0, remaining_length);\n  /* Append Protocol string */\n  mqtt_output_append_string(&client->output, \"MQTT\", 4);\n  /* Append Protocol level */\n  mqtt_output_append_u8(&client->output, 4);\n  /* Append connect flags */\n  mqtt_output_append_u8(&client->output, flags);\n  /* Append keep-alive */\n  mqtt_output_append_u16(&client->output, client_info->keep_alive);\n  /* Append client id */\n  mqtt_output_append_string(&client->output, client_info->client_id, client_id_length);\n  /* Append will message if used */\n  if ((flags & MQTT_CONNECT_FLAG_WILL) != 0) {\n    mqtt_output_append_string(&client->output, client_info->will_topic, will_topic_len);\n    mqtt_output_append_string(&client->output, client_info->will_msg, will_msg_len);\n  }\n  return ERR_OK;\n\ntcp_fail:\n  tcp_abort(client->conn);\n  client->conn = NULL;\n  return err;\n}\n\n\n/**\n * @ingroup mqtt\n * Disconnect from MQTT server\n * @param client MQTT client\n */\nvoid\nmqtt_disconnect(mqtt_client_t *client)\n{\n  LWIP_ASSERT(\"mqtt_disconnect: client != NULL\", client);\n  /* If connection in not already closed */\n  if (client->conn_state != TCP_DISCONNECTED) {\n    /* Set conn_state before calling mqtt_close to prevent callback from being called */\n    client->conn_state = TCP_DISCONNECTED;\n    mqtt_close(client, (mqtt_connection_status_t)0);\n  }\n}\n\n/**\n * @ingroup mqtt\n * Check connection with server\n * @param client MQTT client\n * @return 1 if connected to server, 0 otherwise\n */\nu8_t\nmqtt_client_is_connected(mqtt_client_t *client)\n{\n  LWIP_ASSERT(\"mqtt_client_is_connected: client != NULL\", client);\n  return client->conn_state == MQTT_CONNECTED;\n}\n\n#endif /* LWIP_TCP && LWIP_CALLBACK_API */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/netbiosns/netbiosns.c",
    "content": "/**\n * @file\n * NetBIOS name service responder\n */\n\n/**\n * @defgroup netbiosns NETBIOS responder\n * @ingroup apps\n *\n * This is an example implementation of a NetBIOS name server.\n * It responds to name queries for a configurable name.\n * Name resolving is not supported.\n *\n * Note that the device doesn't broadcast it's own name so can't\n * detect duplicate names!\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"lwip/apps/netbiosns.h\"\n\n#if LWIP_IPV4 && LWIP_UDP  /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/def.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/netif.h\"\n\n#include <string.h>\n\n/** default port number for \"NetBIOS Name service */\n#define NETBIOS_PORT     137\n\n/** size of a NetBIOS name */\n#define NETBIOS_NAME_LEN 16\n\n/** The Time-To-Live for NetBIOS name responds (in seconds)\n * Default is 300000 seconds (3 days, 11 hours, 20 minutes) */\n#define NETBIOS_NAME_TTL 300000u\n\n/** NetBIOS header flags */\n#define NETB_HFLAG_RESPONSE           0x8000U\n#define NETB_HFLAG_OPCODE             0x7800U\n#define NETB_HFLAG_OPCODE_NAME_QUERY  0x0000U\n#define NETB_HFLAG_AUTHORATIVE        0x0400U\n#define NETB_HFLAG_TRUNCATED          0x0200U\n#define NETB_HFLAG_RECURS_DESIRED     0x0100U\n#define NETB_HFLAG_RECURS_AVAILABLE   0x0080U\n#define NETB_HFLAG_BROADCAST          0x0010U\n#define NETB_HFLAG_REPLYCODE          0x0008U\n#define NETB_HFLAG_REPLYCODE_NOERROR  0x0000U\n\n/** NetBIOS name flags */\n#define NETB_NFLAG_UNIQUE             0x8000U\n#define NETB_NFLAG_NODETYPE           0x6000U\n#define NETB_NFLAG_NODETYPE_HNODE     0x6000U\n#define NETB_NFLAG_NODETYPE_MNODE     0x4000U\n#define NETB_NFLAG_NODETYPE_PNODE     0x2000U\n#define NETB_NFLAG_NODETYPE_BNODE     0x0000U\n\n/** NetBIOS message header */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct netbios_hdr {\n  PACK_STRUCT_FIELD(u16_t trans_id);\n  PACK_STRUCT_FIELD(u16_t flags);\n  PACK_STRUCT_FIELD(u16_t questions);\n  PACK_STRUCT_FIELD(u16_t answerRRs);\n  PACK_STRUCT_FIELD(u16_t authorityRRs);\n  PACK_STRUCT_FIELD(u16_t additionalRRs);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** NetBIOS message name part */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct netbios_name_hdr {\n  PACK_STRUCT_FLD_8(u8_t  nametype);\n  PACK_STRUCT_FLD_8(u8_t  encname[(NETBIOS_NAME_LEN*2)+1]);\n  PACK_STRUCT_FIELD(u16_t type);\n  PACK_STRUCT_FIELD(u16_t cls);\n  PACK_STRUCT_FIELD(u32_t ttl);\n  PACK_STRUCT_FIELD(u16_t datalen);\n  PACK_STRUCT_FIELD(u16_t flags);\n  PACK_STRUCT_FLD_S(ip4_addr_p_t addr);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** NetBIOS message */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct netbios_resp\n{\n  struct netbios_hdr      resp_hdr;\n  struct netbios_name_hdr resp_name;\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#ifdef NETBIOS_LWIP_NAME\n#define NETBIOS_LOCAL_NAME NETBIOS_LWIP_NAME\n#else\nstatic char netbiosns_local_name[NETBIOS_NAME_LEN];\n#define NETBIOS_LOCAL_NAME netbiosns_local_name\n#endif\n\nstruct udp_pcb *netbiosns_pcb;\n\n/** Decode a NetBIOS name (from packet to string) */\nstatic int\nnetbiosns_name_decode(char *name_enc, char *name_dec, int name_dec_len)\n{\n  char *pname;\n  char  cname;\n  char  cnbname;\n  int   idx = 0;\n\n  LWIP_UNUSED_ARG(name_dec_len);\n\n  /* Start decoding netbios name. */\n  pname  = name_enc;\n  for (;;) {\n    /* Every two characters of the first level-encoded name\n     * turn into one character in the decoded name. */\n    cname = *pname;\n    if (cname == '\\0')\n      break;    /* no more characters */\n    if (cname == '.')\n      break;    /* scope ID follows */\n    if (cname < 'A' || cname > 'Z') {\n      /* Not legal. */\n      return -1;\n    }\n    cname -= 'A';\n    cnbname = cname << 4;\n    pname++;\n\n    cname = *pname;\n    if (cname == '\\0' || cname == '.') {\n      /* No more characters in the name - but we're in\n       * the middle of a pair.  Not legal. */\n      return -1;\n    }\n    if (cname < 'A' || cname > 'Z') {\n      /* Not legal. */\n      return -1;\n    }\n    cname -= 'A';\n    cnbname |= cname;\n    pname++;\n\n    /* Do we have room to store the character? */\n    if (idx < NETBIOS_NAME_LEN) {\n      /* Yes - store the character. */\n      name_dec[idx++] = (cnbname!=' '?cnbname:'\\0');\n    }\n  }\n\n  return 0;\n}\n\n#if 0 /* function currently unused */\n/** Encode a NetBIOS name (from string to packet) - currently unused because\n    we don't ask for names. */\nstatic int\nnetbiosns_name_encode(char *name_enc, char *name_dec, int name_dec_len)\n{\n  char         *pname;\n  char          cname;\n  unsigned char ucname;\n  int           idx = 0;\n\n  /* Start encoding netbios name. */\n  pname = name_enc;\n\n  for (;;) {\n    /* Every two characters of the first level-encoded name\n     * turn into one character in the decoded name. */\n    cname = *pname;\n    if (cname == '\\0')\n      break;    /* no more characters */\n    if (cname == '.')\n      break;    /* scope ID follows */\n    if ((cname < 'A' || cname > 'Z') && (cname < '0' || cname > '9')) {\n      /* Not legal. */\n      return -1;\n    }\n\n    /* Do we have room to store the character? */\n    if (idx >= name_dec_len) {\n      return -1;\n    }\n\n    /* Yes - store the character. */\n    ucname = cname;\n    name_dec[idx++] = ('A'+((ucname>>4) & 0x0F));\n    name_dec[idx++] = ('A'+( ucname     & 0x0F));\n    pname++;\n  }\n\n  /* Fill with \"space\" coding */\n  for (;idx < name_dec_len - 1;) {\n    name_dec[idx++] = 'C';\n    name_dec[idx++] = 'A';\n  }\n\n  /* Terminate string */\n  name_dec[idx] = '\\0';\n\n  return 0;\n}\n#endif /* 0 */\n\n/** NetBIOS Name service recv callback */\nstatic void\nnetbiosns_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)\n{\n  LWIP_UNUSED_ARG(arg);\n\n  /* if packet is valid */\n  if (p != NULL) {\n    char   netbios_name[NETBIOS_NAME_LEN+1];\n    struct netbios_hdr*      netbios_hdr      = (struct netbios_hdr*)p->payload;\n    struct netbios_name_hdr* netbios_name_hdr = (struct netbios_name_hdr*)(netbios_hdr+1);\n\n    /* we only answer if we got a default interface */\n    if (netif_default != NULL) {\n      /* @todo: do we need to check answerRRs/authorityRRs/additionalRRs? */\n      /* if the packet is a NetBIOS name query question */\n      if (((netbios_hdr->flags & PP_NTOHS(NETB_HFLAG_OPCODE)) == PP_NTOHS(NETB_HFLAG_OPCODE_NAME_QUERY)) &&\n          ((netbios_hdr->flags & PP_NTOHS(NETB_HFLAG_RESPONSE)) == 0) &&\n           (netbios_hdr->questions == PP_NTOHS(1))) {\n        /* decode the NetBIOS name */\n        netbiosns_name_decode((char*)(netbios_name_hdr->encname), netbios_name, sizeof(netbios_name));\n        /* if the packet is for us */\n        if (lwip_strnicmp(netbios_name, NETBIOS_LOCAL_NAME, sizeof(NETBIOS_LOCAL_NAME)) == 0) {\n          struct pbuf *q;\n          struct netbios_resp *resp;\n\n          q = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct netbios_resp), PBUF_RAM);\n          if (q != NULL) {\n            resp = (struct netbios_resp*)q->payload;\n\n            /* prepare NetBIOS header response */\n            resp->resp_hdr.trans_id      = netbios_hdr->trans_id;\n            resp->resp_hdr.flags         = PP_HTONS(NETB_HFLAG_RESPONSE |\n                                                 NETB_HFLAG_OPCODE_NAME_QUERY |\n                                                 NETB_HFLAG_AUTHORATIVE |\n                                                 NETB_HFLAG_RECURS_DESIRED);\n            resp->resp_hdr.questions     = 0;\n            resp->resp_hdr.answerRRs     = PP_HTONS(1);\n            resp->resp_hdr.authorityRRs  = 0;\n            resp->resp_hdr.additionalRRs = 0;\n\n            /* prepare NetBIOS header datas */\n            MEMCPY( resp->resp_name.encname, netbios_name_hdr->encname, sizeof(netbios_name_hdr->encname));\n            resp->resp_name.nametype     = netbios_name_hdr->nametype;\n            resp->resp_name.type         = netbios_name_hdr->type;\n            resp->resp_name.cls          = netbios_name_hdr->cls;\n            resp->resp_name.ttl          = PP_HTONL(NETBIOS_NAME_TTL);\n            resp->resp_name.datalen      = PP_HTONS(sizeof(resp->resp_name.flags)+sizeof(resp->resp_name.addr));\n            resp->resp_name.flags        = PP_HTONS(NETB_NFLAG_NODETYPE_BNODE);\n            ip4_addr_copy(resp->resp_name.addr, *netif_ip4_addr(netif_default));\n\n            /* send the NetBIOS response */\n            udp_sendto(upcb, q, addr, port);\n\n            /* free the \"reference\" pbuf */\n            pbuf_free(q);\n          }\n        }\n      }\n    }\n    /* free the pbuf */\n    pbuf_free(p);\n  }\n}\n\n/**\n * @ingroup netbiosns \n * Init netbios responder\n */\nvoid\nnetbiosns_init(void)\n{\n#ifdef NETBIOS_LWIP_NAME\n  LWIP_ASSERT(\"NetBIOS name is too long!\", strlen(NETBIOS_LWIP_NAME) < NETBIOS_NAME_LEN);\n#endif\n\n  netbiosns_pcb = udp_new_ip_type(IPADDR_TYPE_ANY);\n  if (netbiosns_pcb != NULL) {\n    /* we have to be allowed to send broadcast packets! */\n    ip_set_option(netbiosns_pcb, SOF_BROADCAST);\n    udp_bind(netbiosns_pcb, IP_ANY_TYPE, NETBIOS_PORT);\n    udp_recv(netbiosns_pcb, netbiosns_recv, netbiosns_pcb);\n  }\n}\n\n#ifndef NETBIOS_LWIP_NAME\n/**\n * @ingroup netbiosns \n * Set netbios name. ATTENTION: the hostname must be less than 15 characters!\n */\nvoid\nnetbiosns_set_name(const char* hostname)\n{\n  size_t copy_len = strlen(hostname);\n  LWIP_ASSERT(\"NetBIOS name is too long!\", copy_len < NETBIOS_NAME_LEN);\n  if (copy_len >= NETBIOS_NAME_LEN) {\n    copy_len = NETBIOS_NAME_LEN - 1;\n  }\n  MEMCPY(netbiosns_local_name, hostname, copy_len + 1);\n}\n#endif\n\n/**\n * @ingroup netbiosns \n * Stop netbios responder\n */\nvoid\nnetbiosns_stop(void)\n{\n  if (netbiosns_pcb != NULL) {\n    udp_remove(netbiosns_pcb);\n    netbiosns_pcb = NULL;\n  }\n}\n\n#endif /* LWIP_IPV4 && LWIP_UDP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_asn1.c",
    "content": "/**\n * @file\n * Abstract Syntax Notation One (ISO 8824, 8825) encoding\n *\n * @todo not optimised (yet), favor correctness over speed, favor speed over size\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Christiaan Simons <christiaan.simons@axon.tv>\n *         Martin Hentschel <info@cl-soft.de>\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"snmp_asn1.h\"\n\n#define PBUF_OP_EXEC(code) \\\n  if ((code) != ERR_OK) { \\\n    return ERR_BUF; \\\n  }\n\n/**\n * Encodes a TLV into a pbuf stream.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param tlv TLV to encode\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode\n */\nerr_t\nsnmp_ans1_enc_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv)\n{\n  u8_t data;\n  u8_t length_bytes_required;\n\n  /* write type */\n  if ((tlv->type & SNMP_ASN1_DATATYPE_MASK) == SNMP_ASN1_DATATYPE_EXTENDED) {\n    /* extended format is not used by SNMP so we do not accept those values */\n    return ERR_ARG;\n  }\n  if (tlv->type_len != 0) {\n    /* any other value as auto is not accepted for type (we always use one byte because extended syntax is prohibited) */\n    return ERR_ARG;\n  }\n\n  PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, tlv->type));\n  tlv->type_len = 1;\n\n  /* write length */\n  if (tlv->value_len <= 127) {\n    length_bytes_required = 1;\n  } else if (tlv->value_len <= 255) {\n    length_bytes_required = 2;\n  } else  {\n    length_bytes_required = 3;\n  }\n\n  /* check for forced min length */\n  if (tlv->length_len > 0) {\n    if (tlv->length_len < length_bytes_required) {\n      /* unable to code requested length in requested number of bytes */\n      return ERR_ARG;\n    }\n\n    length_bytes_required = tlv->length_len;\n  } else {\n    tlv->length_len = length_bytes_required;\n  }\n\n  if (length_bytes_required > 1) {\n    /* multi byte representation required */\n    length_bytes_required--;\n    data = 0x80 | length_bytes_required; /* extended length definition, 1 length byte follows */\n\n    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, data));\n\n    while (length_bytes_required > 1) {\n      if (length_bytes_required == 2) {\n        /* append high byte */\n        data = (u8_t)(tlv->value_len >> 8);\n      } else {\n        /* append leading 0x00 */\n        data = 0x00;\n      }\n\n      PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, data));\n      length_bytes_required--;\n    }\n  }\n\n  /* append low byte */\n  data = (u8_t)(tlv->value_len & 0xFF);\n  PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, data));\n\n  return ERR_OK;\n}\n\n/**\n * Encodes raw data (octet string, opaque) into a pbuf chained ASN1 msg.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param raw_len raw data length\n * @param raw points raw data\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode\n */\nerr_t\nsnmp_asn1_enc_raw(struct snmp_pbuf_stream* pbuf_stream, const u8_t *raw, u16_t raw_len)\n{\n  PBUF_OP_EXEC(snmp_pbuf_stream_writebuf(pbuf_stream, raw, raw_len));\n\n  return ERR_OK;\n}\n\n/**\n * Encodes u32_t (counter, gauge, timeticks) into a pbuf chained ASN1 msg.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param octets_needed encoding length (from snmp_asn1_enc_u32t_cnt())\n * @param value is the host order u32_t value to be encoded\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode\n *\n * @see snmp_asn1_enc_u32t_cnt()\n */\nerr_t\nsnmp_asn1_enc_u32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, u32_t value)\n{\n  if (octets_needed > 5) {\n    return ERR_ARG;\n  }\n  if (octets_needed == 5) {\n    /* not enough bits in 'value' add leading 0x00 */\n    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, 0x00));\n    octets_needed--;\n  }\n\n  while (octets_needed > 1) {\n    octets_needed--;\n    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(value >> (octets_needed << 3))));\n  }\n\n  /* (only) one least significant octet */\n  PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)value));\n\n  return ERR_OK;\n}\n\n/**\n * Encodes u64_t (counter64) into a pbuf chained ASN1 msg.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param octets_needed encoding length (from snmp_asn1_enc_u32t_cnt())\n * @param value is the host order u32_t value to be encoded\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode\n *\n * @see snmp_asn1_enc_u64t_cnt()\n */\nerr_t\nsnmp_asn1_enc_u64t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, const u32_t* value)\n{\n  if (octets_needed > 9) {\n    return ERR_ARG;\n  }\n  if (octets_needed == 9) {\n    /* not enough bits in 'value' add leading 0x00 */\n    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, 0x00));\n    octets_needed--;\n  }\n\n  while (octets_needed > 4) {\n    octets_needed--;\n    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(*value >> ((octets_needed-4) << 3))));\n  }\n\n  /* skip to low u32 */\n  value++;\n\n  while (octets_needed > 1) {\n    octets_needed--;\n    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(*value >> (octets_needed << 3))));\n  }\n\n  /* always write at least one octet (also in case of value == 0) */\n  PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(*value)));\n\n  return ERR_OK;\n}\n\n/**\n * Encodes s32_t integer into a pbuf chained ASN1 msg.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param octets_needed encoding length (from snmp_asn1_enc_s32t_cnt())\n * @param value is the host order s32_t value to be encoded\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode\n *\n * @see snmp_asn1_enc_s32t_cnt()\n */\nerr_t\nsnmp_asn1_enc_s32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, s32_t value)\n{\n  while (octets_needed > 1) {\n    octets_needed--;\n\n    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)(value >> (octets_needed << 3))));\n  }\n\n  /* (only) one least significant octet */\n  PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)value));\n\n  return ERR_OK;\n}\n\n/**\n * Encodes object identifier into a pbuf chained ASN1 msg.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param oid points to object identifier array\n * @param oid_len object identifier array length\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) encode\n */\nerr_t\nsnmp_asn1_enc_oid(struct snmp_pbuf_stream* pbuf_stream, const u32_t *oid, u16_t oid_len)\n{\n  if (oid_len > 1) {\n    /* write compressed first two sub id's */\n    u32_t compressed_byte = ((oid[0] * 40) + oid[1]);\n    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)compressed_byte));\n    oid_len -= 2;\n    oid += 2;\n  } else {\n    /* @bug:  allow empty varbinds for symmetry (we must decode them for getnext), allow partial compression?? */\n    /* ident_len <= 1, at least we need zeroDotZero (0.0) (ident_len == 2) */\n    return ERR_ARG;\n  }\n\n  while (oid_len > 0) {\n    u32_t sub_id;\n    u8_t shift, tail;\n\n    oid_len--;\n    sub_id = *oid;\n    tail = 0;\n    shift = 28;\n    while (shift > 0) {\n      u8_t code;\n\n      code = (u8_t)(sub_id >> shift);\n      if ((code != 0) || (tail != 0)) {\n        tail = 1;\n        PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, code | 0x80));\n      }\n      shift -= 7;\n    }\n    PBUF_OP_EXEC(snmp_pbuf_stream_write(pbuf_stream, (u8_t)sub_id & 0x7F));\n\n    /* proceed to next sub-identifier */\n    oid++;\n  }\n  return ERR_OK;\n}\n\n/**\n * Returns octet count for length.\n *\n * @param length parameter length\n * @param octets_needed points to the return value\n */\nvoid\nsnmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed)\n{\n  if (length < 0x80U) {\n    *octets_needed = 1;\n  } else if (length < 0x100U) {\n    *octets_needed = 2;\n  } else {\n    *octets_needed = 3;\n  }\n}\n\n/**\n * Returns octet count for an u32_t.\n *\n * @param value value to be encoded\n * @param octets_needed points to the return value\n *\n * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded\n * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value\n * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!\n */\nvoid\nsnmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed)\n{\n  if (value < 0x80UL) {\n    *octets_needed = 1;\n  } else if (value < 0x8000UL) {\n    *octets_needed = 2;\n  } else if (value < 0x800000UL) {\n    *octets_needed = 3;\n  } else if (value < 0x80000000UL) {\n    *octets_needed = 4;\n  } else {\n    *octets_needed = 5;\n  }\n}\n\n/**\n * Returns octet count for an u64_t.\n *\n * @param value value to be encoded\n * @param octets_needed points to the return value\n *\n * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded\n * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value\n * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!\n */\nvoid\nsnmp_asn1_enc_u64t_cnt(const u32_t *value, u16_t *octets_needed)\n{\n  /* check if high u32 is 0 */\n  if (*value == 0x00) {\n    /* only low u32 is important */\n    value++;\n    snmp_asn1_enc_u32t_cnt(*value, octets_needed);\n  } else {\n    /* low u32 does not matter for length determination */\n    snmp_asn1_enc_u32t_cnt(*value, octets_needed);\n    *octets_needed = *octets_needed + 4; /* add the 4 bytes of low u32 */\n  }\n}\n\n/**\n * Returns octet count for an s32_t.\n *\n * @param value value to be encoded\n * @param octets_needed points to the return value\n *\n * @note ASN coded integers are _always_ signed.\n */\nvoid\nsnmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed)\n{\n  if (value < 0) {\n    value = ~value;\n  }\n  if (value < 0x80L) {\n    *octets_needed = 1;\n  } else if (value < 0x8000L) {\n    *octets_needed = 2;\n  } else if (value < 0x800000L) {\n    *octets_needed = 3;\n  } else {\n    *octets_needed = 4;\n  }\n}\n\n/**\n * Returns octet count for an object identifier.\n *\n * @param oid points to object identifier array\n * @param oid_len object identifier array length\n * @param octets_needed points to the return value\n */\nvoid\nsnmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed)\n{\n  u32_t sub_id;\n\n  *octets_needed = 0;\n  if (oid_len > 1) {\n    /* compressed prefix in one octet */\n    (*octets_needed)++;\n    oid_len -= 2;\n    oid += 2;\n  }\n  while (oid_len > 0) {\n    oid_len--;\n    sub_id = *oid;\n\n    sub_id >>= 7;\n    (*octets_needed)++;\n    while (sub_id > 0) {\n      sub_id >>= 7;\n      (*octets_needed)++;\n    }\n    oid++;\n  }\n}\n\n/**\n * Decodes a TLV from a pbuf stream.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param tlv returns decoded TLV\n * @return ERR_OK if successful, ERR_VAL if we can't decode\n */\nerr_t\nsnmp_asn1_dec_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv)\n{\n  u8_t data;\n\n  /* decode type first */\n  PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n  tlv->type = data;\n\n  if ((tlv->type & SNMP_ASN1_DATATYPE_MASK) == SNMP_ASN1_DATATYPE_EXTENDED) {\n    /* extended format is not used by SNMP so we do not accept those values */\n    return ERR_VAL;\n  }\n  tlv->type_len = 1;\n\n  /* now, decode length */\n  PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n\n  if (data < 0x80) { /* short form */\n    tlv->length_len = 1;\n    tlv->value_len  = data;\n  } else if (data > 0x80) { /* long form */\n    u8_t length_bytes = data - 0x80;\n    tlv->length_len = length_bytes + 1; /* this byte + defined number of length bytes following */\n    tlv->value_len = 0;\n\n    while (length_bytes > 0) {\n      /* we only support up to u16.maxvalue-1 (2 bytes) but have to accept leading zero bytes */\n      if (tlv->value_len > 0xFF) {\n        return ERR_VAL;\n      }\n      PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n      tlv->value_len <<= 8;\n      tlv->value_len |= data;\n\n      /* take care for special value used for indefinite length */\n      if (tlv->value_len == 0xFFFF) {\n        return ERR_VAL;\n      }\n\n      length_bytes--;\n    }\n  } else { /* data == 0x80 indefinite length form */\n    /* (not allowed for SNMP; RFC 1157, 3.2.2) */\n    return ERR_VAL;\n  }\n\n  return ERR_OK;\n}\n\n/**\n * Decodes positive integer (counter, gauge, timeticks) into u32_t.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param len length of the coded integer field\n * @param value return host order integer\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode\n *\n * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded\n * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value\n * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!\n */\nerr_t\nsnmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value)\n{\n  u8_t data;\n\n  if ((len > 0) && (len <= 5)) {\n    PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n\n    /* expecting sign bit to be zero, only unsigned please! */\n    if (((len == 5) && (data == 0x00)) || ((len < 5) && ((data & 0x80) == 0))) {\n      *value = data;\n      len--;\n\n      while (len > 0) {\n        PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n        len--;\n\n        *value <<= 8;\n        *value |= data;\n      }\n\n      return ERR_OK;\n    }\n  }\n\n  return ERR_VAL;\n}\n\n/**\n * Decodes large positive integer (counter64) into 2x u32_t.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param len length of the coded integer field\n * @param value return host order integer\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode\n *\n * @note ASN coded integers are _always_ signed. E.g. +0xFFFF is coded\n * as 0x00,0xFF,0xFF. Note the leading sign octet. A positive value\n * of 0xFFFFFFFF is preceded with 0x00 and the length is 5 octets!!\n */\nerr_t\nsnmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value)\n{\n  u8_t data;\n\n  if (len <= 4) {\n    /* high u32 is 0 */\n    *value = 0;\n    /* directly skip to low u32 */\n    value++;\n  }\n\n  if ((len > 0) && (len <= 9)) {\n    PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n\n    /* expecting sign bit to be zero, only unsigned please! */\n    if (((len == 9) && (data == 0x00)) || ((len < 9) && ((data & 0x80) == 0))) {\n      *value = data;\n      len--;\n\n      while (len > 0) {\n        PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n\n        if (len == 4) {\n          /* skip to low u32 */\n          value++;\n          *value = 0;\n        } else {\n          *value <<= 8;\n        }\n\n        *value |= data;\n        len--;\n      }\n\n      return ERR_OK;\n    }\n  }\n\n  return ERR_VAL;\n}\n\n/**\n * Decodes integer into s32_t.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param len length of the coded integer field\n * @param value return host order integer\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode\n *\n * @note ASN coded integers are _always_ signed!\n */\nerr_t\nsnmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value)\n{\n#if BYTE_ORDER == LITTLE_ENDIAN\n  u8_t *lsb_ptr = (u8_t*)value;\n#endif\n#if BYTE_ORDER == BIG_ENDIAN\n  u8_t *lsb_ptr = (u8_t*)value + sizeof(s32_t) - 1;\n#endif\n  u8_t sign;\n  u8_t data;\n\n  if ((len > 0) && (len < 5)) {\n    PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n    len--;\n\n    if (data & 0x80) {\n      /* negative, start from -1 */\n      *value = -1;\n      sign = 1;\n      *lsb_ptr &= data;\n    } else {\n      /* positive, start from 0 */\n      *value = 0;\n      sign = 0;\n      *lsb_ptr |= data;\n    }\n\n    /* OR/AND octets with value */\n    while (len > 0) {\n      PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n      len--;\n\n#if BYTE_ORDER == LITTLE_ENDIAN\n      *value <<= 8;\n#endif\n#if BYTE_ORDER == BIG_ENDIAN\n      *value >>= 8;\n#endif\n\n      if (sign) {\n        *lsb_ptr |= 255;\n        *lsb_ptr &= data;\n      } else {\n        *lsb_ptr |= data;\n      }\n    }\n\n    return ERR_OK;\n  }\n\n  return ERR_VAL;\n}\n\n/**\n * Decodes object identifier from incoming message into array of u32_t.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param len length of the coded object identifier\n * @param oid return decoded object identifier\n * @param oid_len return decoded object identifier length\n * @param oid_max_len size of oid buffer\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode\n */\nerr_t\nsnmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t* oid, u8_t* oid_len, u8_t oid_max_len)\n{\n  u32_t *oid_ptr;\n  u8_t data;\n\n  *oid_len = 0;\n  oid_ptr = oid;\n  if (len > 0) {\n    if (oid_max_len < 2) {\n      return ERR_MEM;\n    }\n\n    PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n    len--;\n\n    /* first compressed octet */\n    if (data == 0x2B) {\n      /* (most) common case 1.3 (iso.org) */\n      *oid_ptr = 1;\n      oid_ptr++;\n      *oid_ptr = 3;\n      oid_ptr++;\n    } else if (data < 40) {\n      *oid_ptr = 0;\n      oid_ptr++;\n      *oid_ptr = data;\n      oid_ptr++;\n    } else if (data < 80) {\n      *oid_ptr = 1;\n      oid_ptr++;\n      *oid_ptr = data - 40;\n      oid_ptr++;\n    } else {\n      *oid_ptr = 2;\n      oid_ptr++;\n      *oid_ptr = data - 80;\n      oid_ptr++;\n    }\n    *oid_len = 2;\n  } else {\n    /* accepting zero length identifiers e.g. for getnext operation. uncommon but valid */\n    return ERR_OK;\n  }\n\n  while ((len > 0) && (*oid_len < oid_max_len)) {\n    PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n    len--;\n\n    if ((data & 0x80) == 0x00) {\n      /* sub-identifier uses single octet */\n      *oid_ptr = data;\n    } else {\n      /* sub-identifier uses multiple octets */\n      u32_t sub_id = (data & ~0x80);\n      while ((len > 0) && ((data & 0x80) != 0)) {\n        PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, &data));\n        len--;\n\n        sub_id = (sub_id << 7) + (data & ~0x80);\n      }\n\n      if ((data & 0x80) != 0) {\n        /* \"more bytes following\" bit still set at end of len */\n        return ERR_VAL;\n      }\n      *oid_ptr = sub_id;\n    }\n    oid_ptr++;\n    (*oid_len)++;\n  }\n\n  if (len > 0) {\n    /* OID to long to fit in our buffer */\n    return ERR_MEM;\n  }\n\n  return ERR_OK;\n}\n\n/**\n * Decodes (copies) raw data (ip-addresses, octet strings, opaque encoding)\n * from incoming message into array.\n *\n * @param pbuf_stream points to a pbuf stream\n * @param len length of the coded raw data (zero is valid, e.g. empty string!)\n * @param buf return raw bytes\n * @param buf_len returns length of the raw return value\n * @param buf_max_len buffer size\n * @return ERR_OK if successful, ERR_ARG if we can't (or won't) decode\n */\nerr_t\nsnmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t* buf_len, u16_t buf_max_len)\n{\n  if (len > buf_max_len) {\n    /* not enough dst space */\n    return ERR_MEM;\n  }\n  *buf_len = len;\n\n  while (len > 0) {\n    PBUF_OP_EXEC(snmp_pbuf_stream_read(pbuf_stream, buf));\n    buf++;\n    len--;\n  }\n\n  return ERR_OK;\n}\n\n#endif /* LWIP_SNMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_asn1.h",
    "content": "/**\n * @file\n * Abstract Syntax Notation One (ISO 8824, 8825) codec.\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * Copyright (c) 2016 Elias Oenal.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Christiaan Simons <christiaan.simons@axon.tv>\n *         Martin Hentschel <info@cl-soft.de>\n *         Elias Oenal <lwip@eliasoenal.com>\n */\n\n#ifndef LWIP_HDR_APPS_SNMP_ASN1_H\n#define LWIP_HDR_APPS_SNMP_ASN1_H\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP\n\n#include \"lwip/err.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"snmp_pbuf_stream.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define SNMP_ASN1_TLV_INDEFINITE_LENGTH 0x80\n\n#define SNMP_ASN1_CLASS_MASK        0xC0\n#define SNMP_ASN1_CONTENTTYPE_MASK  0x20\n#define SNMP_ASN1_DATATYPE_MASK     0x1F\n#define SNMP_ASN1_DATATYPE_EXTENDED 0x1F /* DataType indicating that datatype is encoded in following bytes */\n\n/* context specific (SNMP) tags (from SNMP spec. RFC1157) */\n#define SNMP_ASN1_CONTEXT_PDU_GET_REQ      0\n#define SNMP_ASN1_CONTEXT_PDU_GET_NEXT_REQ 1\n#define SNMP_ASN1_CONTEXT_PDU_GET_RESP     2\n#define SNMP_ASN1_CONTEXT_PDU_SET_REQ      3\n#define SNMP_ASN1_CONTEXT_PDU_TRAP         4\n#define SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ 5\n\n#define SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_OBJECT      0\n#define SNMP_ASN1_CONTEXT_VARBIND_END_OF_MIB_VIEW     2\n\nstruct snmp_asn1_tlv\n{\n  u8_t  type;       /* only U8 because extended types are not specified by SNMP */\n  u8_t  type_len;   /* encoded length of 'type' field (normally 1) */\n  u8_t  length_len; /* indicates how many bytes are required to encode the 'value_len' field */\n  u16_t value_len;  /* encoded length of the value */\n};\n#define SNMP_ASN1_TLV_HDR_LENGTH(tlv) ((tlv).type_len + (tlv).length_len)\n#define SNMP_ASN1_TLV_LENGTH(tlv) ((tlv).type_len + (tlv).length_len + (tlv).value_len)\n#define SNMP_ASN1_SET_TLV_PARAMS(tlv, type_, length_len_, value_len_) do { (tlv).type = (type_); (tlv).type_len = 0; (tlv).length_len = (length_len_); (tlv).value_len = (value_len_); } while (0);\n\nerr_t snmp_asn1_dec_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv);\nerr_t snmp_asn1_dec_u32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value);\nerr_t snmp_asn1_dec_u64t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t *value);\nerr_t snmp_asn1_dec_s32t(struct snmp_pbuf_stream *pbuf_stream, u16_t len, s32_t *value);\nerr_t snmp_asn1_dec_oid(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u32_t* oid, u8_t* oid_len, u8_t oid_max_len);\nerr_t snmp_asn1_dec_raw(struct snmp_pbuf_stream *pbuf_stream, u16_t len, u8_t *buf, u16_t* buf_len, u16_t buf_max_len);\n\nerr_t snmp_ans1_enc_tlv(struct snmp_pbuf_stream* pbuf_stream, struct snmp_asn1_tlv* tlv);\n\nvoid snmp_asn1_enc_length_cnt(u16_t length, u8_t *octets_needed);\nvoid snmp_asn1_enc_u32t_cnt(u32_t value, u16_t *octets_needed);\nvoid snmp_asn1_enc_u64t_cnt(const u32_t *value, u16_t *octets_needed);\nvoid snmp_asn1_enc_s32t_cnt(s32_t value, u16_t *octets_needed);\nvoid snmp_asn1_enc_oid_cnt(const u32_t *oid, u16_t oid_len, u16_t *octets_needed);\nerr_t snmp_asn1_enc_oid(struct snmp_pbuf_stream* pbuf_stream, const u32_t *oid, u16_t oid_len);\nerr_t snmp_asn1_enc_s32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, s32_t value);\nerr_t snmp_asn1_enc_u32t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, u32_t value);\nerr_t snmp_asn1_enc_u64t(struct snmp_pbuf_stream* pbuf_stream, u16_t octets_needed, const u32_t* value);\nerr_t snmp_asn1_enc_raw(struct snmp_pbuf_stream* pbuf_stream, const u8_t *raw, u16_t raw_len);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_SNMP */\n\n#endif /* LWIP_HDR_APPS_SNMP_ASN1_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_core.c",
    "content": "/**\n * @file\n * MIB tree access/construction functions.\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Christiaan Simons <christiaan.simons@axon.tv>\n *         Martin Hentschel <info@cl-soft.de>\n*/\n\n/**\n * @defgroup snmp SNMPv2c agent\n * @ingroup apps\n * SNMPv2c compatible agent\\n\n * There is also a MIB compiler and a MIB viewer in lwIP contrib repository\n * (lwip-contrib/apps/LwipMibCompiler).\\n\n * The agent implements the most important MIB2 MIBs including IPv6 support\n * (interfaces, UDP, TCP, SNMP, ICMP, SYSTEM). IP MIB is an older version\n * whithout IPv6 statistics (TODO).\\n\n * Rewritten by Martin Hentschel <info@cl-soft.de> and\n * Dirk Ziegelmeier <dziegel@gmx.de>\\n\n * Work on SNMPv3 has started, but is not finished.\\n\n *\n * 0 Agent Capabilities\n * ====================\n * \n * Features:\n * ---------\n * - SNMPv2c support.\n * - Low RAM usage - no memory pools, stack only.\n * - MIB2 implementation is separated from SNMP stack.\n * - Support for multiple MIBs (snmp_set_mibs() call) - e.g. for private MIB.\n * - Simple and generic API for MIB implementation.\n * - Comfortable node types and helper functions for scalar arrays and tables.\n * - Counter64, bit and truthvalue datatype support.\n * - Callbacks for SNMP writes e.g. to implement persistency.\n * - Runs on two APIs: RAW and netconn.\n * - Async API is gone - the stack now supports netconn API instead,\n *   so blocking operations can be done in MIB calls.\n *   SNMP runs in a worker thread when netconn API is used.\n * - Simplified thread sync support for MIBs - useful when MIBs\n *   need to access variables shared with other threads where no locking is\n *   possible. Used in MIB2 to access lwIP stats from lwIP thread.\n * \n * MIB compiler (code generator):\n * ------------------------------\n * - Provided in lwIP contrib repository.\n * - Written in C#. MIB viewer used Windows Forms.\n * - Developed on Windows with Visual Studio 2010.\n * - Can be compiled and used on all platforms with http://www.monodevelop.com/.\n * - Based on a heavily modified version of of SharpSnmpLib (a4bd05c6afb4)\n *   (https://sharpsnmplib.codeplex.com/SourceControl/network/forks/Nemo157/MIBParserUpdate).\n * - MIB parser, C file generation framework and LWIP code generation are cleanly\n *   separated, which means the code may be useful as a base for code generation\n *   of other SNMP agents.\n * \n * Notes:\n * ------\n * - Stack and MIB compiler were used to implement a Profinet device.\n *   Compiled/implemented MIBs: LLDP-MIB, LLDP-EXT-DOT3-MIB, LLDP-EXT-PNO-MIB.\n * \n * SNMPv1 per RFC1157 and SNMPv2c per RFC 3416\n * -------------------------------------------\n *   Note the S in SNMP stands for \"Simple\". Note that \"Simple\" is\n *   relative. SNMP is simple compared to the complex ISO network\n *   management protocols CMIP (Common Management Information Protocol)\n *   and CMOT (CMip Over Tcp).\n * \n * MIB II\n * ------\n *   The standard lwIP stack management information base.\n *   This is a required MIB, so this is always enabled.\n *   The groups EGP, CMOT and transmission are disabled by default.\n * \n *   Most mib-2 objects are not writable except:\n *   sysName, sysLocation, sysContact, snmpEnableAuthenTraps.\n *   Writing to or changing the ARP and IP address and route\n *   tables is not possible.\n * \n *   Note lwIP has a very limited notion of IP routing. It currently\n *   doen't have a route table and doesn't have a notion of the U,G,H flags.\n *   Instead lwIP uses the interface list with only one default interface\n *   acting as a single gateway interface (G) for the default route.\n * \n *   The agent returns a \"virtual table\" with the default route 0.0.0.0\n *   for the default interface and network routes (no H) for each\n *   network interface in the netif_list.\n *   All routes are considered to be up (U).\n * \n * Loading additional MIBs\n * -----------------------\n *   MIBs can only be added in compile-time, not in run-time.\n *  \n * \n * 1 Building the Agent\n * ====================\n * First of all you'll need to add the following define\n * to your local lwipopts.h:\n * \\#define LWIP_SNMP               1\n * \n * and add the source files your makefile.\n * \n * Note you'll might need to adapt you network driver to update\n * the mib2 variables for your interface.\n * \n * 2 Running the Agent\n * ===================\n * The following function calls must be made in your program to\n * actually get the SNMP agent running.\n * \n * Before starting the agent you should supply pointers\n * for sysContact, sysLocation, and snmpEnableAuthenTraps.\n * You can do this by calling\n * \n * - snmp_mib2_set_syscontact()\n * - snmp_mib2_set_syslocation()\n * - snmp_set_auth_traps_enabled()\n * \n * You can register a callback which is called on successful write access: \n * snmp_set_write_callback().\n * \n * Additionally you may want to set\n * \n * - snmp_mib2_set_sysdescr()\n * - snmp_set_device_enterprise_oid()\n * - snmp_mib2_set_sysname()\n * \n * Also before starting the agent you need to setup\n * one or more trap destinations using these calls:\n * \n * - snmp_trap_dst_enable()\n * - snmp_trap_dst_ip_set()\n * \n * If you need more than MIB2, set the MIBs you want to use\n * by snmp_set_mibs().\n * \n * Finally, enable the agent by calling snmp_init()\n *\n * @defgroup snmp_core Core\n * @ingroup snmp\n * \n * @defgroup snmp_traps Traps\n * @ingroup snmp\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"snmp_core_priv.h\"\n#include \"lwip/netif.h\"\n#include <string.h>\n\n\n#if (LWIP_SNMP && (SNMP_TRAP_DESTINATIONS<=0))\n  #error \"If you want to use SNMP, you have to define SNMP_TRAP_DESTINATIONS>=1 in your lwipopts.h\"\n#endif\n#if (!LWIP_UDP && LWIP_SNMP)\n  #error \"If you want to use SNMP, you have to define LWIP_UDP=1 in your lwipopts.h\"\n#endif\n\nstruct snmp_statistics snmp_stats;\nstatic const struct snmp_obj_id  snmp_device_enterprise_oid_default = {SNMP_DEVICE_ENTERPRISE_OID_LEN, SNMP_DEVICE_ENTERPRISE_OID};\nstatic const struct snmp_obj_id* snmp_device_enterprise_oid         = &snmp_device_enterprise_oid_default;\n\nconst u32_t snmp_zero_dot_zero_values[] = { 0, 0 };\nconst struct snmp_obj_id_const_ref snmp_zero_dot_zero = { LWIP_ARRAYSIZE(snmp_zero_dot_zero_values), snmp_zero_dot_zero_values };\n\n\n#if SNMP_LWIP_MIB2\n#include \"lwip/apps/snmp_mib2.h\"\nstatic const struct snmp_mib* const default_mibs[] = { &mib2 };\nstatic u8_t snmp_num_mibs                          = 1;\n#else\nstatic const struct snmp_mib* const default_mibs[] = { NULL };\nstatic u8_t snmp_num_mibs                          = 0;\n#endif\n\n/* List of known mibs */\nstatic struct snmp_mib const * const *snmp_mibs = default_mibs;\n\n/**\n * @ingroup snmp_core\n * Sets the MIBs to use.\n * Example: call snmp_set_mibs() as follows:\n * static const struct snmp_mib *my_snmp_mibs[] = {\n *   &mib2,\n *   &private_mib\n * };\n * snmp_set_mibs(my_snmp_mibs, LWIP_ARRAYSIZE(my_snmp_mibs));\n */\nvoid\nsnmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs)\n{\n  LWIP_ASSERT(\"mibs pointer must be != NULL\", (mibs != NULL));\n  LWIP_ASSERT(\"num_mibs pointer must be != 0\", (num_mibs != 0));\n  snmp_mibs     = mibs;\n  snmp_num_mibs = num_mibs;\n}\n\n/**\n * @ingroup snmp_core\n * 'device enterprise oid' is used for 'device OID' field in trap PDU's (for identification of generating device)\n * as well as for value returned by MIB-2 'sysObjectID' field (if internal MIB2 implementation is used).\n * The 'device enterprise oid' shall point to an OID located under 'private-enterprises' branch (1.3.6.1.4.1.XXX). If a vendor\n * wants to provide a custom object there, he has to get its own enterprise oid from IANA (http://www.iana.org). It\n * is not allowed to use LWIP enterprise ID!\n * In order to identify a specific device it is recommended to create a dedicated OID for each device type under its own \n * enterprise oid.\n * e.g.\n * device a > 1.3.6.1.4.1.XXX(ent-oid).1(devices).1(device a)\n * device b > 1.3.6.1.4.1.XXX(ent-oid).1(devices).2(device b)\n * for more details see description of 'sysObjectID' field in RFC1213-MIB\n */\nvoid snmp_set_device_enterprise_oid(const struct snmp_obj_id* device_enterprise_oid)\n{\n  if (device_enterprise_oid == NULL) {\n    snmp_device_enterprise_oid = &snmp_device_enterprise_oid_default;\n  } else {\n    snmp_device_enterprise_oid = device_enterprise_oid;\n  }\n}\n\n/**\n * @ingroup snmp_core\n * Get 'device enterprise oid' \n */\nconst struct snmp_obj_id* snmp_get_device_enterprise_oid(void)\n{\n  return snmp_device_enterprise_oid;\n}\n\n#if LWIP_IPV4\n/**\n * Conversion from InetAddressIPv4 oid to lwIP ip4_addr\n * @param oid points to u32_t ident[4] input\n * @param ip points to output struct\n */\nu8_t\nsnmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip)\n{\n  if ((oid[0] > 0xFF) ||\n      (oid[1] > 0xFF) ||\n      (oid[2] > 0xFF) ||\n      (oid[3] > 0xFF)) {\n    ip4_addr_copy(*ip, *IP4_ADDR_ANY4);\n    return 0;\n  }\n\n  IP4_ADDR(ip, oid[0], oid[1], oid[2], oid[3]);\n  return 1;\n}\n\n/**\n * Convert ip4_addr to InetAddressIPv4 (no InetAddressType)\n * @param ip points to input struct\n * @param oid points to u32_t ident[4] output\n */\nvoid\nsnmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid)\n{\n  oid[0] = ip4_addr1(ip);\n  oid[1] = ip4_addr2(ip);\n  oid[2] = ip4_addr3(ip);\n  oid[3] = ip4_addr4(ip);\n}\n#endif /* LWIP_IPV4 */\n\n#if LWIP_IPV6\n/**\n * Conversion from InetAddressIPv6 oid to lwIP ip6_addr\n * @param oid points to u32_t oid[16] input\n * @param ip points to output struct\n */\nu8_t\nsnmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip)\n{\n  if ((oid[0]  > 0xFF) ||\n      (oid[1]  > 0xFF) ||\n      (oid[2]  > 0xFF) ||\n      (oid[3]  > 0xFF) ||\n      (oid[4]  > 0xFF) ||\n      (oid[5]  > 0xFF) ||\n      (oid[6]  > 0xFF) ||\n      (oid[7]  > 0xFF) ||\n      (oid[8]  > 0xFF) ||\n      (oid[9]  > 0xFF) ||\n      (oid[10] > 0xFF) ||\n      (oid[11] > 0xFF) ||\n      (oid[12] > 0xFF) ||\n      (oid[13] > 0xFF) ||\n      (oid[14] > 0xFF) ||\n      (oid[15] > 0xFF)) {\n    ip6_addr_set_any(ip);\n    return 0;\n  }\n\n  ip->addr[0] = (oid[0]  << 24) | (oid[1]  << 16) | (oid[2]  << 8) | (oid[3]  << 0);\n  ip->addr[1] = (oid[4]  << 24) | (oid[5]  << 16) | (oid[6]  << 8) | (oid[7]  << 0);\n  ip->addr[2] = (oid[8]  << 24) | (oid[9]  << 16) | (oid[10] << 8) | (oid[11] << 0);\n  ip->addr[3] = (oid[12] << 24) | (oid[13] << 16) | (oid[14] << 8) | (oid[15] << 0);\n  return 1;\n}\n\n/**\n * Convert ip6_addr to InetAddressIPv6 (no InetAddressType)\n * @param ip points to input struct\n * @param oid points to u32_t ident[16] output\n */\nvoid\nsnmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid)\n{\n  oid[0]  = (ip->addr[0] & 0xFF000000) >> 24;\n  oid[1]  = (ip->addr[0] & 0x00FF0000) >> 16;\n  oid[2]  = (ip->addr[0] & 0x0000FF00) >>  8;\n  oid[3]  = (ip->addr[0] & 0x000000FF) >>  0;\n  oid[4]  = (ip->addr[1] & 0xFF000000) >> 24;\n  oid[5]  = (ip->addr[1] & 0x00FF0000) >> 16;\n  oid[6]  = (ip->addr[1] & 0x0000FF00) >>  8;\n  oid[7]  = (ip->addr[1] & 0x000000FF) >>  0;\n  oid[8]  = (ip->addr[2] & 0xFF000000) >> 24;\n  oid[9]  = (ip->addr[2] & 0x00FF0000) >> 16;\n  oid[10] = (ip->addr[2] & 0x0000FF00) >>  8;\n  oid[11] = (ip->addr[2] & 0x000000FF) >>  0;\n  oid[12] = (ip->addr[3] & 0xFF000000) >> 24;\n  oid[13] = (ip->addr[3] & 0x00FF0000) >> 16;\n  oid[14] = (ip->addr[3] & 0x0000FF00) >>  8;\n  oid[15] = (ip->addr[3] & 0x000000FF) >>  0;\n}\n#endif /* LWIP_IPV6 */\n\n#if LWIP_IPV4 || LWIP_IPV6\n/**\n * Convert to InetAddressType+InetAddress+InetPortNumber\n * @param ip IP address\n * @param port Port\n * @param oid OID\n * @return OID length\n */\nu8_t\nsnmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid)\n{\n  u8_t idx;\n\n  idx = snmp_ip_to_oid(ip, oid);\n  oid[idx] = port;\n  idx++;\n\n  return idx;\n}\n\n/**\n * Convert to InetAddressType+InetAddress\n * @param ip IP address\n * @param oid OID\n * @return OID length\n */\nu8_t\nsnmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid)\n{\n  if (IP_IS_ANY_TYPE_VAL(*ip)) {\n    oid[0] = 0; /* any */\n    oid[1] = 0; /* no IP OIDs follow */\n    return 2;\n  } else if (IP_IS_V6(ip)) {\n#if LWIP_IPV6\n    oid[0] = 2; /* ipv6 */\n    oid[1] = 16; /* 16 InetAddressIPv6 OIDs follow */\n    snmp_ip6_to_oid(ip_2_ip6(ip), &oid[2]);\n    return 18;\n#else /* LWIP_IPV6 */\n    return 0;\n#endif /* LWIP_IPV6 */\n  } else {\n#if LWIP_IPV4\n    oid[0] = 1; /* ipv4 */\n    oid[1] = 4; /* 4 InetAddressIPv4 OIDs follow */\n    snmp_ip4_to_oid(ip_2_ip4(ip), &oid[2]);\n    return 6;\n#else /* LWIP_IPV4 */\n    return 0;\n#endif /* LWIP_IPV4 */\n  }\n}\n\n/**\n * Convert from InetAddressType+InetAddress to ip_addr_t\n * @param oid OID\n * @param oid_len OID length\n * @param ip IP address\n * @return Parsed OID length\n */\nu8_t\nsnmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip)\n{\n  /* InetAddressType */\n  if (oid_len < 1) {\n    return 0;\n  }\n\n  if (oid[0] == 0) { /* any */\n    /* 1x InetAddressType, 1x OID len */\n    if (oid_len < 2) {\n      return 0;\n    }\n    if (oid[1] != 0) {\n      return 0;\n    }\n\n    memset(ip, 0, sizeof(*ip));\n    IP_SET_TYPE(ip, IPADDR_TYPE_ANY);\n\n    return 2;\n  } else if (oid[0] == 1) { /* ipv4 */\n#if LWIP_IPV4\n    /* 1x InetAddressType, 1x OID len, 4x InetAddressIPv4 */\n    if (oid_len < 6) {\n      return 0;\n    }\n\n    /* 4x ipv4 OID */\n    if (oid[1] != 4) {\n      return 0;\n    }\n\n    IP_SET_TYPE(ip, IPADDR_TYPE_V4);\n    if (!snmp_oid_to_ip4(&oid[2], ip_2_ip4(ip))) {\n      return 0;\n    }\n\n    return 6;\n#else /* LWIP_IPV4 */\n    return 0;\n#endif /* LWIP_IPV4 */\n  } else if (oid[0] == 2) { /* ipv6 */\n#if LWIP_IPV6\n    /* 1x InetAddressType, 1x OID len, 16x InetAddressIPv6 */\n    if (oid_len < 18) {\n      return 0;\n    }\n\n    /* 16x ipv6 OID */\n    if (oid[1] != 16) {\n      return 0;\n    }\n\n    IP_SET_TYPE(ip, IPADDR_TYPE_V6);\n    if (!snmp_oid_to_ip6(&oid[2], ip_2_ip6(ip))) {\n      return 0;\n    }\n\n    return 18;\n#else /* LWIP_IPV6 */\n    return 0;\n#endif /* LWIP_IPV6 */\n  } else { /* unsupported InetAddressType */\n    return 0;\n  }\n}\n\n/**\n * Convert from InetAddressType+InetAddress+InetPortNumber to ip_addr_t and u16_t\n * @param oid OID\n * @param oid_len OID length\n * @param ip IP address\n * @param port Port\n * @return Parsed OID length\n */\nu8_t\nsnmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port)\n{\n  u8_t idx = 0;\n\n  /* InetAddressType + InetAddress */\n  idx += snmp_oid_to_ip(&oid[idx], oid_len-idx, ip);\n  if (idx == 0) {\n    return 0;\n  }\n\n  /* InetPortNumber */\n  if (oid_len < (idx+1)) {\n    return 0;\n  }\n  if (oid[idx] > 0xffff) {\n    return 0;\n  }\n  *port = (u16_t)oid[idx];\n  idx++;\n\n  return idx;\n}\n\n#endif /* LWIP_IPV4 || LWIP_IPV6 */\n\n/**\n * Assign an OID to struct snmp_obj_id\n * @param target Assignment target \n * @param oid OID\n * @param oid_len OID length\n */\nvoid\nsnmp_oid_assign(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len)\n{\n  LWIP_ASSERT(\"oid_len <= LWIP_SNMP_OBJ_ID_LEN\", oid_len <= SNMP_MAX_OBJ_ID_LEN);\n\n  target->len = oid_len;\n\n  if (oid_len > 0) {\n    MEMCPY(target->id, oid, oid_len * sizeof(u32_t));\n  }\n}\n\n/**\n * Prefix an OID to OID in struct snmp_obj_id\n * @param target Assignment target to prefix\n * @param oid OID\n * @param oid_len OID length\n */\nvoid\nsnmp_oid_prefix(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len)\n{\n  LWIP_ASSERT(\"target->len + oid_len <= LWIP_SNMP_OBJ_ID_LEN\", (target->len + oid_len) <= SNMP_MAX_OBJ_ID_LEN);\n\n  if (oid_len > 0) {\n    /* move existing OID to make room at the beginning for OID to insert */\n    int i;\n    for (i = target->len-1; i>=0; i--) {\n      target->id[i + oid_len] = target->id[i];\n    }\n\n    /* paste oid at the beginning */\n    MEMCPY(target->id, oid, oid_len * sizeof(u32_t));\n  }\n}\n\n/**\n * Combine two OIDs into struct snmp_obj_id\n * @param target Assignmet target\n * @param oid1 OID 1\n * @param oid1_len OID 1 length\n * @param oid2 OID 2\n * @param oid2_len OID 2 length\n */\nvoid\nsnmp_oid_combine(struct snmp_obj_id* target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)\n{\n  snmp_oid_assign(target, oid1, oid1_len);\n  snmp_oid_append(target, oid2, oid2_len);\n}\n\n/**\n * Append OIDs to struct snmp_obj_id\n * @param target Assignment target to append to\n * @param oid OID\n * @param oid_len OID length\n */\nvoid\nsnmp_oid_append(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len)\n{\n  LWIP_ASSERT(\"offset + oid_len <= LWIP_SNMP_OBJ_ID_LEN\", (target->len + oid_len) <= SNMP_MAX_OBJ_ID_LEN);\n\n  if (oid_len > 0) {\n    MEMCPY(&target->id[target->len], oid, oid_len * sizeof(u32_t));\n    target->len += oid_len;\n  }\n}\n\n/**\n * Compare two OIDs\n * @param oid1 OID 1\n * @param oid1_len OID 1 length\n * @param oid2 OID 2\n * @param oid2_len OID 2 length\n * @return -1: OID1&lt;OID2  1: OID1 &gt;OID2 0: equal\n */\ns8_t\nsnmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)\n{\n  u8_t level = 0;\n  LWIP_ASSERT(\"'oid1' param must not be NULL or 'oid1_len' param be 0!\", (oid1 != NULL) || (oid1_len == 0));\n  LWIP_ASSERT(\"'oid2' param must not be NULL or 'oid2_len' param be 0!\", (oid2 != NULL) || (oid2_len == 0));\n\n  while ((level < oid1_len) && (level < oid2_len)) {\n    if (*oid1 < *oid2) {\n      return -1;\n    }\n    if (*oid1 > *oid2) {\n      return 1;\n    }\n\n    level++;\n    oid1++;\n    oid2++;\n  }\n\n  /* common part of both OID's is equal, compare length */\n  if (oid1_len < oid2_len) {\n    return -1;\n  }\n  if (oid1_len > oid2_len) {\n    return 1;\n  }\n\n  /* they are equal */\n  return 0;\n}\n\n\n/**\n * Check of two OIDs are equal\n * @param oid1 OID 1\n * @param oid1_len OID 1 length\n * @param oid2 OID 2\n * @param oid2_len OID 2 length\n * @return 1: equal 0: non-equal\n */\nu8_t\nsnmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)\n{\n  return (snmp_oid_compare(oid1, oid1_len, oid2, oid2_len) == 0)? 1 : 0;\n}\n\n/**\n * Convert netif to interface index\n * @param netif netif\n * @return index\n */\nu8_t\nnetif_to_num(const struct netif *netif)\n{\n  u8_t result = 0;\n  struct netif *netif_iterator = netif_list;\n\n  while (netif_iterator != NULL) {\n    result++;\n\n    if (netif_iterator == netif) {\n      return result;\n    }\n\n    netif_iterator = netif_iterator->next;\n  }\n\n  LWIP_ASSERT(\"netif not found in netif_list\", 0);\n  return 0;\n}\n\nstatic const struct snmp_mib*\nsnmp_get_mib_from_oid(const u32_t *oid, u8_t oid_len)\n{\n  const u32_t* list_oid;\n  const u32_t* searched_oid;\n  u8_t i, l;\n\n  u8_t max_match_len = 0;\n  const struct snmp_mib* matched_mib = NULL;\n\n  LWIP_ASSERT(\"'oid' param must not be NULL!\", (oid != NULL));\n\n  if (oid_len == 0) {\n    return NULL;\n  }\n\n  for (i = 0; i < snmp_num_mibs; i++) {\n    LWIP_ASSERT(\"MIB array not initialized correctly\", (snmp_mibs[i] != NULL));\n    LWIP_ASSERT(\"MIB array not initialized correctly - base OID is NULL\", (snmp_mibs[i]->base_oid != NULL));\n\n    if (oid_len >= snmp_mibs[i]->base_oid_len) {\n      l            = snmp_mibs[i]->base_oid_len;\n      list_oid     = snmp_mibs[i]->base_oid;\n      searched_oid = oid;\n\n      while (l > 0) {\n        if (*list_oid != *searched_oid) {\n          break;\n        }\n\n        l--;\n        list_oid++;\n        searched_oid++;\n      }\n\n      if ((l == 0) && (snmp_mibs[i]->base_oid_len > max_match_len)) {\n        max_match_len = snmp_mibs[i]->base_oid_len;\n        matched_mib = snmp_mibs[i];\n      }\n    }\n  }\n\n  return matched_mib;\n}\n\nstatic const struct snmp_mib*\nsnmp_get_next_mib(const u32_t *oid, u8_t oid_len)\n{\n  u8_t i;\n  const struct snmp_mib* next_mib = NULL;\n\n  LWIP_ASSERT(\"'oid' param must not be NULL!\", (oid != NULL));\n\n  if (oid_len == 0) {\n    return NULL;\n  }\n\n  for (i = 0; i < snmp_num_mibs; i++) {\n    if (snmp_mibs[i]->base_oid != NULL) {\n      /* check if mib is located behind starting point */\n      if (snmp_oid_compare(snmp_mibs[i]->base_oid, snmp_mibs[i]->base_oid_len, oid, oid_len) > 0) {\n        if ((next_mib == NULL) ||\n            (snmp_oid_compare(snmp_mibs[i]->base_oid, snmp_mibs[i]->base_oid_len,\n                              next_mib->base_oid, next_mib->base_oid_len) < 0)) {\n          next_mib = snmp_mibs[i];\n        }\n      }\n    }\n  }\n\n  return next_mib;\n}\n\nstatic const struct snmp_mib*\nsnmp_get_mib_between(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len)\n{\n  const struct snmp_mib* next_mib = snmp_get_next_mib(oid1, oid1_len);\n\n  LWIP_ASSERT(\"'oid2' param must not be NULL!\", (oid2 != NULL));\n  LWIP_ASSERT(\"'oid2_len' param must be greater than 0!\", (oid2_len > 0));\n\n  if (next_mib != NULL) {\n    if (snmp_oid_compare(next_mib->base_oid, next_mib->base_oid_len, oid2, oid2_len) < 0) {\n      return next_mib;\n    }\n  }\n\n  return NULL;\n}\n\nu8_t\nsnmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node_instance* node_instance)\n{\n  u8_t result = SNMP_ERR_NOSUCHOBJECT;\n  const struct snmp_mib *mib;\n  const struct snmp_node *mn = NULL;\n\n  mib = snmp_get_mib_from_oid(oid, oid_len);\n  if (mib != NULL) {\n    u8_t oid_instance_len;\n\n    mn = snmp_mib_tree_resolve_exact(mib, oid, oid_len, &oid_instance_len);\n    if ((mn != NULL) && (mn->node_type != SNMP_NODE_TREE)) {\n      /* get instance */\n      const struct snmp_leaf_node* leaf_node = (const struct snmp_leaf_node*)(const void*)mn;\n\n      node_instance->node = mn;\n      snmp_oid_assign(&node_instance->instance_oid, oid + (oid_len - oid_instance_len), oid_instance_len);\n\n      result = leaf_node->get_instance(\n        oid,\n        oid_len - oid_instance_len,\n        node_instance);\n\n#ifdef LWIP_DEBUG\n      if (result == SNMP_ERR_NOERROR) {\n        if (((node_instance->access & SNMP_NODE_INSTANCE_ACCESS_READ) != 0) && (node_instance->get_value == NULL)) {\n          LWIP_DEBUGF(SNMP_DEBUG, (\"SNMP inconsistent access: node is readable but no get_value function is specified\\n\"));\n        }\n        if (((node_instance->access & SNMP_NODE_INSTANCE_ACCESS_WRITE) != 0) && (node_instance->set_value == NULL)) {\n          LWIP_DEBUGF(SNMP_DEBUG, (\"SNMP inconsistent access: node is writable but no set_value and/or set_test function is specified\\n\"));\n        }\n      }\n#endif\n    }\n  }\n\n  return result;\n}\n\nu8_t\nsnmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_validate_node_instance_method validate_node_instance_method, void* validate_node_instance_arg, struct snmp_obj_id* node_oid, struct snmp_node_instance* node_instance)\n{\n  const struct snmp_mib      *mib;\n  const struct snmp_node *mn = NULL;\n  const u32_t* start_oid     = NULL;\n  u8_t         start_oid_len = 0;\n\n  /* resolve target MIB from passed OID */\n  mib = snmp_get_mib_from_oid(oid, oid_len);\n  if (mib == NULL) {\n    /* passed OID does not reference any known MIB, start at the next closest MIB */\n    mib = snmp_get_next_mib(oid, oid_len);\n\n    if (mib != NULL) {\n      start_oid     = mib->base_oid;\n      start_oid_len = mib->base_oid_len;\n    }\n  } else {\n    start_oid     = oid;\n    start_oid_len = oid_len;\n  }\n\n  /* resolve target node from MIB, skip to next MIB if no suitable node is found in current MIB */\n  while ((mib != NULL) && (mn == NULL)) {\n    u8_t oid_instance_len;\n\n    /* check if OID directly references a node inside current MIB, in this case we have to ask this node for the next instance */\n    mn = snmp_mib_tree_resolve_exact(mib, start_oid, start_oid_len, &oid_instance_len);\n    if (mn != NULL) {\n      snmp_oid_assign(node_oid, start_oid, start_oid_len - oid_instance_len); /* set oid to node */\n      snmp_oid_assign(&node_instance->instance_oid, start_oid + (start_oid_len - oid_instance_len), oid_instance_len); /* set (relative) instance oid */\n    } else {\n      /* OID does not reference a node, search for the next closest node inside MIB; set instance_oid.len to zero because we want the first instance of this node */\n      mn = snmp_mib_tree_resolve_next(mib, start_oid, start_oid_len, node_oid);\n      node_instance->instance_oid.len = 0;\n    }\n\n    /* validate the node; if the node has no further instance or the returned instance is invalid, search for the next in MIB and validate again */\n    node_instance->node = mn;\n    while (mn != NULL) {\n       u8_t result;\n\n      /* clear fields which may have values from previous loops */\n      node_instance->asn1_type        = 0;\n      node_instance->access           = SNMP_NODE_INSTANCE_NOT_ACCESSIBLE;\n      node_instance->get_value        = NULL;\n      node_instance->set_test         = NULL;\n      node_instance->set_value        = NULL;\n      node_instance->release_instance = NULL;\n      node_instance->reference.ptr    = NULL;\n      node_instance->reference_len    = 0;\n\n      result = ((const struct snmp_leaf_node*)(const void*)mn)->get_next_instance(\n        node_oid->id,\n        node_oid->len,\n        node_instance);\n\n      if (result == SNMP_ERR_NOERROR) {\n#ifdef LWIP_DEBUG\n        if (((node_instance->access & SNMP_NODE_INSTANCE_ACCESS_READ) != 0) && (node_instance->get_value == NULL)) {\n          LWIP_DEBUGF(SNMP_DEBUG, (\"SNMP inconsistent access: node is readable but no get_value function is specified\\n\"));\n        }\n        if (((node_instance->access & SNMP_NODE_INSTANCE_ACCESS_WRITE) != 0) && (node_instance->set_value == NULL)) {\n          LWIP_DEBUGF(SNMP_DEBUG, (\"SNMP inconsistent access: node is writable but no set_value function is specified\\n\"));\n        }\n#endif\n\n        /* validate node because the node may be not accessible for example (but let the caller decide what is valid */\n        if ((validate_node_instance_method == NULL) ||\n            (validate_node_instance_method(node_instance, validate_node_instance_arg) == SNMP_ERR_NOERROR)) {\n          /* node_oid \"returns\" the full result OID (including the instance part) */\n          snmp_oid_append(node_oid, node_instance->instance_oid.id, node_instance->instance_oid.len);\n          break;\n        }\n\n        if (node_instance->release_instance != NULL) {\n          node_instance->release_instance(node_instance);\n        }\n        /*\n        the instance itself is not valid, ask for next instance from same node.\n        we don't have to change any variables because node_instance->instance_oid is used as input (starting point)\n        as well as output (resulting next OID), so we have to simply call get_next_instance method again\n        */\n      } else {\n        if (node_instance->release_instance != NULL) {\n          node_instance->release_instance(node_instance);\n        }\n\n        /* the node has no further instance, skip to next node */\n        mn = snmp_mib_tree_resolve_next(mib, node_oid->id, node_oid->len, &node_instance->instance_oid); /* misuse node_instance->instance_oid as tmp buffer */\n        if (mn != NULL) {\n          /* prepare for next loop */\n          snmp_oid_assign(node_oid, node_instance->instance_oid.id, node_instance->instance_oid.len);\n          node_instance->instance_oid.len = 0;\n          node_instance->node = mn;\n        }\n      }\n    }\n\n    if (mn != NULL) {\n      /*\n      we found a suitable next node,\n      now we have to check if a inner MIB is located between the searched OID and the resulting OID.\n      this is possible because MIB's may be located anywhere in the global tree, that means also in \n      the subtree of another MIB (e.g. if searched OID is .2 and resulting OID is .4, then another\n      MIB having .3 as root node may exist)\n      */\n      const struct snmp_mib *intermediate_mib;\n      intermediate_mib = snmp_get_mib_between(start_oid, start_oid_len, node_oid->id, node_oid->len);\n\n      if (intermediate_mib != NULL) {\n        /* search for first node inside intermediate mib in next loop */\n        if (node_instance->release_instance != NULL) {\n          node_instance->release_instance(node_instance);\n        }\n\n        mn            = NULL;\n        mib           = intermediate_mib;\n        start_oid     = mib->base_oid;\n        start_oid_len = mib->base_oid_len;\n      }\n      /* else { we found out target node } */\n    } else {\n      /*\n      there is no further (suitable) node inside this MIB, search for the next MIB with following priority\n      1. search for inner MIB's (whose root is located inside tree of current MIB)\n      2. search for surrouding MIB's (where the current MIB is the inner MIB) and continue there if any\n      3. take the next closest MIB (not being related to the current MIB)\n      */\n      const struct snmp_mib *next_mib;\n      next_mib = snmp_get_next_mib(start_oid, start_oid_len); /* returns MIB's related to point 1 and 3 */\n\n      /* is the found MIB an inner MIB? (point 1) */\n      if ((next_mib != NULL) && (next_mib->base_oid_len > mib->base_oid_len) &&\n          (snmp_oid_compare(next_mib->base_oid, mib->base_oid_len, mib->base_oid, mib->base_oid_len) == 0)) {\n        /* yes it is -> continue at inner MIB */\n        mib = next_mib;\n        start_oid     = mib->base_oid;\n        start_oid_len = mib->base_oid_len;\n      } else {\n        /* check if there is a surrounding mib where to continue (point 2) (only possible if OID length > 1) */\n        if (mib->base_oid_len > 1) {\n          mib = snmp_get_mib_from_oid(mib->base_oid, mib->base_oid_len - 1);\n\n          if (mib == NULL) {\n            /* no surrounding mib, use next mib encountered above (point 3) */\n            mib = next_mib;\n\n            if (mib != NULL) {\n              start_oid     = mib->base_oid;\n              start_oid_len = mib->base_oid_len;\n            }\n          }\n          /* else { start_oid stays the same because we want to continue from current offset in surrounding mib (point 2) } */\n        }\n      }\n    }\n  }\n\n  if (mib == NULL) {\n    /* loop is only left when mib == null (error) or mib_node != NULL (success) */\n    return SNMP_ERR_ENDOFMIBVIEW;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\n/**\n * Searches tree for the supplied object identifier.\n *\n */\nconst struct snmp_node *\nsnmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, u8_t* oid_instance_len)\n{\n  const struct snmp_node* const* node = &mib->root_node;\n  u8_t oid_offset = mib->base_oid_len;\n\n  while ((oid_offset < oid_len) && ((*node)->node_type == SNMP_NODE_TREE)) {\n    /* search for matching sub node */\n    u32_t subnode_oid = *(oid + oid_offset);\n\n    u32_t i = (*(const struct snmp_tree_node* const*)node)->subnode_count;\n    node    = (*(const struct snmp_tree_node* const*)node)->subnodes;\n    while ((i > 0) && ((*node)->oid != subnode_oid)) {\n      node++;\n      i--;\n    }\n\n    if (i == 0) {\n      /* no matching subnode found */\n      return NULL;\n    }\n\n    oid_offset++;\n  }\n\n  if ((*node)->node_type != SNMP_NODE_TREE) {\n    /* we found a leaf node */\n    *oid_instance_len = oid_len - oid_offset;\n    return (*node);\n  }\n\n  return NULL;\n}\n\nconst struct snmp_node*\nsnmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, struct snmp_obj_id* oidret)\n{\n  u8_t  oid_offset = mib->base_oid_len;\n  const struct snmp_node* const* node;\n  const struct snmp_tree_node* node_stack[SNMP_MAX_OBJ_ID_LEN];\n  s32_t nsi = 0; /* NodeStackIndex */\n  u32_t subnode_oid;\n\n  if (mib->root_node->node_type != SNMP_NODE_TREE) {\n    /* a next operation on a mib with only a leaf node will always return NULL because there is no other node */\n    return NULL;\n  }\n\n  /* first build node stack related to passed oid (as far as possible), then go backwards to determine the next node */\n  node_stack[nsi] = (const struct snmp_tree_node*)(const void*)mib->root_node;\n  while (oid_offset < oid_len) {\n    /* search for matching sub node */\n    u32_t i = node_stack[nsi]->subnode_count;\n    node    = node_stack[nsi]->subnodes;\n\n    subnode_oid = *(oid + oid_offset);\n\n    while ((i > 0) && ((*node)->oid != subnode_oid)) {\n      node++;\n      i--;\n    }\n\n    if ((i == 0) || ((*node)->node_type != SNMP_NODE_TREE)) {\n      /* no (matching) tree-subnode found */\n      break;\n    }\n    nsi++;\n    node_stack[nsi] = (const struct snmp_tree_node*)(const void*)(*node);\n\n    oid_offset++;\n  }\n\n\n  if (oid_offset >= oid_len) {\n    /* passed oid references a tree node -> return first useable sub node of it */\n    subnode_oid = 0;\n  } else {\n    subnode_oid = *(oid + oid_offset) + 1;\n  }\n\n  while (nsi >= 0) {\n    const struct snmp_node* subnode = NULL;\n\n    /* find next node on current level */\n    s32_t i        = node_stack[nsi]->subnode_count;\n    node           = node_stack[nsi]->subnodes;\n    while (i > 0) {\n      if ((*node)->oid == subnode_oid) {\n        subnode = *node;\n        break;\n      } else if (((*node)->oid > subnode_oid) && ((subnode == NULL) || ((*node)->oid < subnode->oid))) {\n        subnode = *node;\n      }\n\n      node++;\n      i--;\n    }\n\n    if (subnode == NULL) {\n      /* no further node found on this level, go one level up and start searching with index of current node*/\n      subnode_oid = node_stack[nsi]->node.oid + 1;\n      nsi--;\n    } else {\n      if (subnode->node_type == SNMP_NODE_TREE) {\n        /* next is a tree node, go into it and start searching */\n        nsi++;\n        node_stack[nsi] = (const struct snmp_tree_node*)(const void*)subnode;\n        subnode_oid = 0;\n      } else {\n        /* we found a leaf node -> fill oidret and return it */\n        snmp_oid_assign(oidret, mib->base_oid, mib->base_oid_len);\n        i = 1;\n        while (i <= nsi) {\n          oidret->id[oidret->len] = node_stack[i]->node.oid;\n          oidret->len++;\n          i++;\n        }\n\n        oidret->id[oidret->len] = subnode->oid;\n        oidret->len++;\n\n        return subnode;\n      }\n    }\n  }\n\n  return NULL;\n}\n\n/** initialize struct next_oid_state using this function before passing it to next_oid_check */\nvoid\nsnmp_next_oid_init(struct snmp_next_oid_state *state,\n  const u32_t *start_oid, u8_t start_oid_len,\n  u32_t *next_oid_buf, u8_t next_oid_max_len)\n{\n  state->start_oid        = start_oid;\n  state->start_oid_len    = start_oid_len;\n  state->next_oid         = next_oid_buf;\n  state->next_oid_len     = 0;\n  state->next_oid_max_len = next_oid_max_len;\n  state->status           = SNMP_NEXT_OID_STATUS_NO_MATCH;\n}\n\n/** checks if the passed incomplete OID may be a possible candidate for snmp_next_oid_check();\nthis methid is intended if the complete OID is not yet known but it is very expensive to build it up,\nso it is possible to test the starting part before building up the complete oid and pass it to snmp_next_oid_check()*/\nu8_t\nsnmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len)\n{\n  if (state->status != SNMP_NEXT_OID_STATUS_BUF_TO_SMALL) {\n    u8_t start_oid_len = (oid_len < state->start_oid_len) ? oid_len : state->start_oid_len;\n\n    /* check passed OID is located behind start offset */\n    if (snmp_oid_compare(oid, oid_len, state->start_oid, start_oid_len) >= 0) {\n      /* check if new oid is located closer to start oid than current closest oid */\n      if ((state->status == SNMP_NEXT_OID_STATUS_NO_MATCH) ||\n        (snmp_oid_compare(oid, oid_len, state->next_oid, state->next_oid_len) < 0)) {\n        return 1;\n      }\n    }\n  }\n\n  return 0;\n}\n\n/** checks the passed OID if it is a candidate to be the next one (get_next); returns !=0 if passed oid is currently closest, otherwise 0 */\nu8_t\nsnmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len, void* reference)\n{\n  /* do not overwrite a fail result */\n  if (state->status != SNMP_NEXT_OID_STATUS_BUF_TO_SMALL) {\n    /* check passed OID is located behind start offset */\n    if (snmp_oid_compare(oid, oid_len, state->start_oid, state->start_oid_len) > 0) {\n      /* check if new oid is located closer to start oid than current closest oid */\n      if ((state->status == SNMP_NEXT_OID_STATUS_NO_MATCH) ||\n        (snmp_oid_compare(oid, oid_len, state->next_oid, state->next_oid_len) < 0)) {\n        if (oid_len <= state->next_oid_max_len) {\n          MEMCPY(state->next_oid, oid, oid_len * sizeof(u32_t));\n          state->next_oid_len = oid_len;\n          state->status       = SNMP_NEXT_OID_STATUS_SUCCESS;\n          state->reference    = reference;\n          return 1;\n        } else {\n          state->status = SNMP_NEXT_OID_STATUS_BUF_TO_SMALL;\n        }\n      }\n    }\n  }\n\n  return 0;\n}\n\nu8_t\nsnmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len)\n{\n  u8_t i;\n\n  if (oid_len != oid_ranges_len) {\n    return 0;\n  }\n\n  for (i = 0; i < oid_ranges_len; i++) {\n    if ((oid_in[i] < oid_ranges[i].min) || (oid_in[i] > oid_ranges[i].max)) {\n      return 0;\n    }\n  }\n\n  return 1;\n}\n\nsnmp_err_t\nsnmp_set_test_ok(struct snmp_node_instance* instance, u16_t value_len, void* value)\n{\n  LWIP_UNUSED_ARG(instance);\n  LWIP_UNUSED_ARG(value_len);\n  LWIP_UNUSED_ARG(value);\n\n  return SNMP_ERR_NOERROR;\n}\n\n/**\n * Decodes BITS pseudotype value from ASN.1 OctetString.\n *\n * @note Because BITS pseudo type is encoded as OCTET STRING, it cannot directly\n * be encoded/decoded by the agent. Instead call this function as required from\n * get/test/set methods.\n *\n * @param buf points to a buffer holding the ASN1 octet string\n * @param buf_len length of octet string\n * @param bit_value decoded Bit value with Bit0 == LSB\n * @return ERR_OK if successful, ERR_ARG if bit value contains more than 32 bit\n */\nerr_t\nsnmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value)\n{\n  u8_t b;\n  u8_t bits_processed = 0;\n  *bit_value = 0;\n\n  while (buf_len > 0) {\n    /* any bit set in this byte? */\n    if (*buf != 0x00) {\n      if (bits_processed >= 32) {\n        /* accept more than 4 bytes, but only when no bits are set */\n        return ERR_VAL;\n      }\n\n      b = *buf;\n      do {\n        if (b & 0x80) {\n          *bit_value |= (1 << bits_processed);\n        }\n        bits_processed++;\n        b <<= 1;\n      }\n      while ((bits_processed & 0x07) != 0); /* &0x07 -> % 8 */\n    } else {\n      bits_processed += 8;\n    }\n\n    buf_len--;\n    buf++;\n  }\n\n  return ERR_OK;\n}\n\nerr_t\nsnmp_decode_truthvalue(const s32_t *asn1_value, u8_t *bool_value)\n{\n  /* defined by RFC1443:\n   TruthValue ::= TEXTUAL-CONVENTION\n    STATUS       current\n    DESCRIPTION\n     \"Represents a boolean value.\"\n    SYNTAX       INTEGER { true(1), false(2) }\n  */\n\n  if ((asn1_value == NULL) || (bool_value == NULL)) {\n    return ERR_ARG;\n  }\n\n  if (*asn1_value == 1) {\n    *bool_value = 1;\n  } else if (*asn1_value == 2) {\n    *bool_value = 0;\n  } else {\n    return ERR_VAL;\n  }\n\n  return ERR_OK;\n}\n\n/**\n * Encodes BITS pseudotype value into ASN.1 OctetString.\n *\n * @note Because BITS pseudo type is encoded as OCTET STRING, it cannot directly\n * be encoded/decoded by the agent. Instead call this function as required from\n * get/test/set methods.\n *\n * @param buf points to a buffer where the resulting ASN1 octet string is stored to\n * @param buf_len max length of the bufffer\n * @param bit_value Bit value to encode with Bit0 == LSB\n * @param bit_count Number of possible bits for the bit value (according to rfc we have to send all bits independant from their truth value)\n * @return number of bytes used from buffer to store the resulting OctetString\n */\nu8_t\nsnmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count)\n{\n  u8_t len = 0;\n  u8_t min_bytes = (bit_count + 7) >> 3; /* >>3 -> / 8 */\n\n  while ((buf_len > 0) && (bit_value != 0x00)) {\n    s8_t i = 7;\n    *buf = 0x00;\n    while (i >= 0) {\n      if (bit_value & 0x01) {\n        *buf |= 0x01;\n      }\n\n      if (i > 0) {\n        *buf <<= 1;\n      }\n\n      bit_value >>= 1;\n      i--;\n    }\n\n    buf++;\n    buf_len--;\n    len++;\n  }\n\n  if (len < min_bytes) {\n    buf     += len;\n    buf_len -= len;\n\n    while ((len < min_bytes) && (buf_len > 0)) {\n      *buf = 0x00;\n      buf++;\n      buf_len--;\n      len++;\n    }\n  }\n\n  return len;\n}\n\nu8_t\nsnmp_encode_truthvalue(s32_t *asn1_value, u32_t bool_value)\n{\n  /* defined by RFC1443:\n   TruthValue ::= TEXTUAL-CONVENTION\n    STATUS       current\n    DESCRIPTION\n     \"Represents a boolean value.\"\n    SYNTAX       INTEGER { true(1), false(2) }\n  */\n\n  if (asn1_value == NULL) {\n    return 0;\n  }\n\n  if (bool_value) {\n    *asn1_value = 1; /* defined by RFC1443 */\n  } else {\n    *asn1_value = 2; /* defined by RFC1443 */\n  }\n\n  return sizeof(s32_t);\n}\n\n#endif /* LWIP_SNMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_core_priv.h",
    "content": "/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Martin Hentschel <info@cl-soft.de>\n *\n */\n\n#ifndef LWIP_HDR_APPS_SNMP_CORE_PRIV_H\n#define LWIP_HDR_APPS_SNMP_CORE_PRIV_H\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/apps/snmp_core.h\"\n#include \"snmp_asn1.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* (outdated) SNMPv1 error codes\n * shall not be used by MIBS anymore, nevertheless required from core for properly answering a v1 request\n */\n#define SNMP_ERR_NOSUCHNAME 2\n#define SNMP_ERR_BADVALUE   3\n#define SNMP_ERR_READONLY   4\n/* error codes which are internal and shall not be used by MIBS\n * shall not be used by MIBS anymore, nevertheless required from core for properly answering a v1 request\n */\n#define SNMP_ERR_TOOBIG               1\n#define SNMP_ERR_AUTHORIZATIONERROR   16\n#define SNMP_ERR_NOSUCHOBJECT         SNMP_VARBIND_EXCEPTION_OFFSET + SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_OBJECT\n#define SNMP_ERR_ENDOFMIBVIEW         SNMP_VARBIND_EXCEPTION_OFFSET + SNMP_ASN1_CONTEXT_VARBIND_END_OF_MIB_VIEW\n\n\nconst struct snmp_node* snmp_mib_tree_resolve_exact(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, u8_t* oid_instance_len);\nconst struct snmp_node* snmp_mib_tree_resolve_next(const struct snmp_mib *mib, const u32_t *oid, u8_t oid_len, struct snmp_obj_id* oidret);\n\ntypedef u8_t (*snmp_validate_node_instance_method)(struct snmp_node_instance*, void*);\n\nu8_t snmp_get_node_instance_from_oid(const u32_t *oid, u8_t oid_len, struct snmp_node_instance* node_instance);\nu8_t snmp_get_next_node_instance_from_oid(const u32_t *oid, u8_t oid_len, snmp_validate_node_instance_method validate_node_instance_method, void* validate_node_instance_arg, struct snmp_obj_id* node_oid, struct snmp_node_instance* node_instance);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_SNMP */\n\n#endif /* LWIP_HDR_APPS_SNMP_CORE_PRIV_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_mib2.c",
    "content": "/**\n * @file\n * Management Information Base II (RFC1213) objects and functions.\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *         Christiaan Simons <christiaan.simons@axon.tv>\n */\n\n/**\n * @defgroup snmp_mib2 MIB2\n * @ingroup snmp\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP && SNMP_LWIP_MIB2 /* don't build if not configured for use in lwipopts.h */\n\n#if !LWIP_STATS\n#error LWIP_SNMP MIB2 needs LWIP_STATS (for MIB2)\n#endif\n#if !MIB2_STATS\n#error LWIP_SNMP MIB2 needs MIB2_STATS (for MIB2)\n#endif\n\n#include \"lwip/snmp.h\"\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/apps/snmp_mib2.h\"\n#include \"lwip/apps/snmp_scalar.h\"\n\n#if SNMP_USE_NETCONN\n#include \"lwip/tcpip.h\"\n#include \"lwip/priv/tcpip_priv.h\"\nvoid\nsnmp_mib2_lwip_synchronizer(snmp_threadsync_called_fn fn, void* arg)\n{\n#if LWIP_TCPIP_CORE_LOCKING\n  LOCK_TCPIP_CORE();\n  fn(arg);\n  UNLOCK_TCPIP_CORE();\n#else\n  tcpip_callback(fn, arg);\n#endif\n}\n\nstruct snmp_threadsync_instance snmp_mib2_lwip_locks;\n#endif\n\n/* dot3 and EtherLike MIB not planned. (transmission .1.3.6.1.2.1.10) */\n/* historical (some say hysterical). (cmot .1.3.6.1.2.1.9) */\n/* lwIP has no EGP, thus may not implement it. (egp .1.3.6.1.2.1.8) */\n\n/* --- mib-2 .1.3.6.1.2.1 ----------------------------------------------------- */\nextern const struct snmp_scalar_array_node snmp_mib2_snmp_root;\nextern const struct snmp_tree_node snmp_mib2_udp_root;\nextern const struct snmp_tree_node snmp_mib2_tcp_root;\nextern const struct snmp_scalar_array_node snmp_mib2_icmp_root;\nextern const struct snmp_tree_node snmp_mib2_interface_root;\nextern const struct snmp_scalar_array_node snmp_mib2_system_node;\nextern const struct snmp_tree_node snmp_mib2_at_root;\nextern const struct snmp_tree_node snmp_mib2_ip_root;\n\nstatic const struct snmp_node* const mib2_nodes[] = {\n  &snmp_mib2_system_node.node.node,\n  &snmp_mib2_interface_root.node,\n#if LWIP_ARP && LWIP_IPV4\n  &snmp_mib2_at_root.node,\n#endif /* LWIP_ARP && LWIP_IPV4 */\n#if LWIP_IPV4\n  &snmp_mib2_ip_root.node,\n#endif /* LWIP_IPV4 */\n#if LWIP_ICMP\n  &snmp_mib2_icmp_root.node.node,\n#endif /* LWIP_ICMP */\n#if LWIP_TCP\n  &snmp_mib2_tcp_root.node,\n#endif /* LWIP_TCP */\n#if LWIP_UDP\n  &snmp_mib2_udp_root.node,\n#endif /* LWIP_UDP */\n  &snmp_mib2_snmp_root.node.node\n};\n\nstatic const struct snmp_tree_node mib2_root = SNMP_CREATE_TREE_NODE(1, mib2_nodes);\n\nstatic const u32_t  mib2_base_oid_arr[] = { 1,3,6,1,2,1 };\nconst struct snmp_mib mib2 = SNMP_MIB_CREATE(mib2_base_oid_arr, &mib2_root.node);\n\n#endif /* LWIP_SNMP && SNMP_LWIP_MIB2 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_mib2_icmp.c",
    "content": "/**\n * @file\n * Management Information Base II (RFC1213) ICMP objects and functions.\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *         Christiaan Simons <christiaan.simons@axon.tv>\n */\n\n#include \"lwip/snmp.h\"\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/apps/snmp_mib2.h\"\n#include \"lwip/apps/snmp_table.h\"\n#include \"lwip/apps/snmp_scalar.h\"\n#include \"lwip/icmp.h\"\n#include \"lwip/stats.h\"\n\n#if LWIP_SNMP && SNMP_LWIP_MIB2 && LWIP_ICMP\n\n#if SNMP_USE_NETCONN\n#define SYNC_NODE_NAME(node_name) node_name ## _synced\n#define CREATE_LWIP_SYNC_NODE(oid, node_name) \\\n   static const struct snmp_threadsync_node node_name ## _synced = SNMP_CREATE_THREAD_SYNC_NODE(oid, &node_name.node, &snmp_mib2_lwip_locks);\n#else\n#define SYNC_NODE_NAME(node_name) node_name\n#define CREATE_LWIP_SYNC_NODE(oid, node_name)\n#endif\n\n/* --- icmp .1.3.6.1.2.1.5 ----------------------------------------------------- */\n\nstatic s16_t\nicmp_get_value(const struct snmp_scalar_array_node_def *node, void *value)\n{\n  u32_t *uint_ptr = (u32_t*)value;\n\n  switch (node->oid) {\n  case 1: /* icmpInMsgs */\n    *uint_ptr = STATS_GET(mib2.icmpinmsgs);\n    return sizeof(*uint_ptr);\n  case 2: /* icmpInErrors */\n    *uint_ptr = STATS_GET(mib2.icmpinerrors);\n    return sizeof(*uint_ptr);\n  case 3: /* icmpInDestUnreachs */\n    *uint_ptr = STATS_GET(mib2.icmpindestunreachs);\n    return sizeof(*uint_ptr);\n  case 4: /* icmpInTimeExcds */\n    *uint_ptr = STATS_GET(mib2.icmpintimeexcds);\n    return sizeof(*uint_ptr);\n  case 5: /* icmpInParmProbs */\n    *uint_ptr = STATS_GET(mib2.icmpinparmprobs);\n    return sizeof(*uint_ptr);\n  case 6: /* icmpInSrcQuenchs */\n    *uint_ptr = STATS_GET(mib2.icmpinsrcquenchs);\n    return sizeof(*uint_ptr);\n  case 7: /* icmpInRedirects */\n    *uint_ptr = STATS_GET(mib2.icmpinredirects);\n    return sizeof(*uint_ptr);\n  case 8: /* icmpInEchos */\n    *uint_ptr = STATS_GET(mib2.icmpinechos);\n    return sizeof(*uint_ptr);\n  case 9: /* icmpInEchoReps */\n    *uint_ptr = STATS_GET(mib2.icmpinechoreps);\n    return sizeof(*uint_ptr);\n  case 10: /* icmpInTimestamps */\n    *uint_ptr = STATS_GET(mib2.icmpintimestamps);\n    return sizeof(*uint_ptr);\n  case 11: /* icmpInTimestampReps */\n    *uint_ptr = STATS_GET(mib2.icmpintimestampreps);\n    return sizeof(*uint_ptr);\n  case 12: /* icmpInAddrMasks */\n    *uint_ptr = STATS_GET(mib2.icmpinaddrmasks);\n    return sizeof(*uint_ptr);\n  case 13: /* icmpInAddrMaskReps */\n    *uint_ptr = STATS_GET(mib2.icmpinaddrmaskreps);\n    return sizeof(*uint_ptr);\n  case 14: /* icmpOutMsgs */\n    *uint_ptr = STATS_GET(mib2.icmpoutmsgs);\n    return sizeof(*uint_ptr);\n  case 15: /* icmpOutErrors */\n    *uint_ptr = STATS_GET(mib2.icmpouterrors);\n    return sizeof(*uint_ptr);\n  case 16: /* icmpOutDestUnreachs */\n    *uint_ptr = STATS_GET(mib2.icmpoutdestunreachs);\n    return sizeof(*uint_ptr);\n  case 17: /* icmpOutTimeExcds */\n    *uint_ptr = STATS_GET(mib2.icmpouttimeexcds);\n    return sizeof(*uint_ptr);\n  case 18: /* icmpOutParmProbs: not supported -> always 0 */\n    *uint_ptr = 0;\n    return sizeof(*uint_ptr);\n  case 19: /* icmpOutSrcQuenchs: not supported -> always 0 */\n    *uint_ptr = 0;\n    return sizeof(*uint_ptr);\n  case 20: /* icmpOutRedirects: not supported -> always 0 */\n    *uint_ptr = 0;\n    return sizeof(*uint_ptr);\n  case 21: /* icmpOutEchos */\n    *uint_ptr = STATS_GET(mib2.icmpoutechos);\n    return sizeof(*uint_ptr);\n  case 22: /* icmpOutEchoReps */\n    *uint_ptr = STATS_GET(mib2.icmpoutechoreps);\n    return sizeof(*uint_ptr);\n  case 23: /* icmpOutTimestamps: not supported -> always 0 */\n    *uint_ptr = 0;\n    return sizeof(*uint_ptr);\n  case 24: /* icmpOutTimestampReps: not supported -> always 0 */\n    *uint_ptr = 0;\n    return sizeof(*uint_ptr);\n  case 25: /* icmpOutAddrMasks: not supported -> always 0 */\n    *uint_ptr = 0;\n    return sizeof(*uint_ptr);\n  case 26: /* icmpOutAddrMaskReps: not supported -> always 0 */\n    *uint_ptr = 0;\n    return sizeof(*uint_ptr);\n  default:\n    LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"icmp_get_value(): unknown id: %\"S32_F\"\\n\", node->oid));\n    break;\n  }\n\n  return 0;\n}\n\n\nstatic const struct snmp_scalar_array_node_def icmp_nodes[] = {\n  { 1, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  { 2, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  { 3, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  { 4, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  { 5, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  { 6, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  { 7, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  { 8, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  { 9, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {10, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {11, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {12, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {13, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {14, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {15, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {16, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {17, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {18, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {19, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {20, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {21, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {22, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {23, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {24, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {25, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},\n  {26, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}\n};\n\nconst struct snmp_scalar_array_node snmp_mib2_icmp_root = SNMP_SCALAR_CREATE_ARRAY_NODE(5, icmp_nodes, icmp_get_value, NULL, NULL);\n\n#endif /* LWIP_SNMP && SNMP_LWIP_MIB2 && LWIP_ICMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_mib2_interfaces.c",
    "content": "/**\n * @file\n * Management Information Base II (RFC1213) INTERFACES objects and functions.\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *         Christiaan Simons <christiaan.simons@axon.tv>\n */\n\n#include \"lwip/snmp.h\"\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/apps/snmp_mib2.h\"\n#include \"lwip/apps/snmp_table.h\"\n#include \"lwip/apps/snmp_scalar.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/stats.h\"\n\n#include <string.h>\n\n#if LWIP_SNMP && SNMP_LWIP_MIB2\n\n#if SNMP_USE_NETCONN\n#define SYNC_NODE_NAME(node_name) node_name ## _synced\n#define CREATE_LWIP_SYNC_NODE(oid, node_name) \\\n   static const struct snmp_threadsync_node node_name ## _synced = SNMP_CREATE_THREAD_SYNC_NODE(oid, &node_name.node, &snmp_mib2_lwip_locks);\n#else\n#define SYNC_NODE_NAME(node_name) node_name\n#define CREATE_LWIP_SYNC_NODE(oid, node_name)\n#endif\n\n\n/* --- interfaces .1.3.6.1.2.1.2 ----------------------------------------------------- */\n\nstatic s16_t\ninterfaces_get_value(struct snmp_node_instance* instance, void* value)\n{\n  if (instance->node->oid == 1) {\n    s32_t *sint_ptr = (s32_t*)value;\n    s32_t num_netifs = 0;\n\n    struct netif *netif = netif_list;\n    while (netif != NULL) {\n      num_netifs++;\n      netif = netif->next;\n    }\n\n    *sint_ptr = num_netifs;\n    return sizeof(*sint_ptr);\n  }\n\n  return 0;\n}\n\n/* list of allowed value ranges for incoming OID */\nstatic const struct snmp_oid_range interfaces_Table_oid_ranges[] = {\n  { 1, 0xff } /* netif->num is u8_t */\n};\n\nstatic const u8_t iftable_ifOutQLen         = 0;\n\nstatic const u8_t iftable_ifOperStatus_up   = 1;\nstatic const u8_t iftable_ifOperStatus_down = 2;\n\nstatic const u8_t iftable_ifAdminStatus_up             = 1;\nstatic const u8_t iftable_ifAdminStatus_lowerLayerDown = 7;\nstatic const u8_t iftable_ifAdminStatus_down           = 2;\n\nstatic snmp_err_t\ninterfaces_Table_get_cell_instance(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, struct snmp_node_instance* cell_instance)\n{\n  u32_t ifIndex;\n  struct netif *netif;\n\n  LWIP_UNUSED_ARG(column);\n\n  /* check if incoming OID length and if values are in plausible range */\n  if (!snmp_oid_in_range(row_oid, row_oid_len, interfaces_Table_oid_ranges, LWIP_ARRAYSIZE(interfaces_Table_oid_ranges))) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* get netif index from incoming OID */\n  ifIndex = row_oid[0];\n\n  /* find netif with index */\n  netif = netif_list;\n  while (netif != NULL) {\n    if (netif_to_num(netif) == ifIndex) {\n      /* store netif pointer for subsequent operations (get/test/set) */\n      cell_instance->reference.ptr = netif;\n      return SNMP_ERR_NOERROR;\n    }\n    netif = netif->next;\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nstatic snmp_err_t\ninterfaces_Table_get_next_cell_instance(const u32_t* column, struct snmp_obj_id* row_oid, struct snmp_node_instance* cell_instance)\n{\n  struct netif *netif;\n  struct snmp_next_oid_state state;\n  u32_t result_temp[LWIP_ARRAYSIZE(interfaces_Table_oid_ranges)];\n\n  LWIP_UNUSED_ARG(column);\n\n  /* init struct to search next oid */\n  snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(interfaces_Table_oid_ranges));\n\n  /* iterate over all possible OIDs to find the next one */\n  netif = netif_list;\n  while (netif != NULL) {\n    u32_t test_oid[LWIP_ARRAYSIZE(interfaces_Table_oid_ranges)];\n    test_oid[0] = netif_to_num(netif);\n\n    /* check generated OID: is it a candidate for the next one? */\n    snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(interfaces_Table_oid_ranges), netif);\n\n    netif = netif->next;\n  }\n\n  /* did we find a next one? */\n  if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {\n    snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n    /* store netif pointer for subsequent operations (get/test/set) */\n    cell_instance->reference.ptr = /* (struct netif*) */state.reference;\n    return SNMP_ERR_NOERROR;\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nstatic s16_t\ninterfaces_Table_get_value(struct snmp_node_instance* instance, void* value)\n{\n  struct netif *netif = (struct netif*)instance->reference.ptr;\n  u32_t* value_u32 = (u32_t*)value;\n  s32_t* value_s32 = (s32_t*)value;\n  u16_t value_len;\n\n  switch (SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id))\n  {\n  case 1: /* ifIndex */\n    *value_s32 = netif_to_num(netif);\n    value_len = sizeof(*value_s32);\n    break;\n  case 2: /* ifDescr */\n    value_len = sizeof(netif->name);\n    MEMCPY(value, netif->name, value_len);\n    break;\n  case 3: /* ifType */\n    *value_s32 = netif->link_type;\n    value_len = sizeof(*value_s32);\n    break;\n  case 4: /* ifMtu */\n    *value_s32 = netif->mtu;\n    value_len = sizeof(*value_s32);\n    break;\n  case 5: /* ifSpeed */\n    *value_u32 = netif->link_speed;\n    value_len = sizeof(*value_u32);\n    break;\n  case 6: /* ifPhysAddress */\n    value_len = sizeof(netif->hwaddr);\n    MEMCPY(value, &netif->hwaddr, value_len);\n    break;\n  case 7: /* ifAdminStatus */\n    if (netif_is_up(netif)) {\n      *value_s32 = iftable_ifOperStatus_up;\n    } else {\n      *value_s32 = iftable_ifOperStatus_down;\n    }\n    value_len = sizeof(*value_s32);\n    break;\n  case 8: /* ifOperStatus */\n    if (netif_is_up(netif)) {\n      if (netif_is_link_up(netif)) {\n        *value_s32 = iftable_ifAdminStatus_up;\n      } else {\n        *value_s32 = iftable_ifAdminStatus_lowerLayerDown;\n      }\n    } else {\n      *value_s32 = iftable_ifAdminStatus_down;\n    }\n    value_len = sizeof(*value_s32);\n    break;\n  case 9: /* ifLastChange */\n    *value_u32 = netif->ts;\n    value_len = sizeof(*value_u32);\n    break;\n  case 10: /* ifInOctets */\n    *value_u32 = netif->mib2_counters.ifinoctets;\n    value_len = sizeof(*value_u32);\n    break;\n  case 11: /* ifInUcastPkts */\n    *value_u32 = netif->mib2_counters.ifinucastpkts;\n    value_len = sizeof(*value_u32);\n    break;\n  case 12: /* ifInNUcastPkts */\n    *value_u32 = netif->mib2_counters.ifinnucastpkts;\n    value_len = sizeof(*value_u32);\n    break;\n  case 13: /* ifInDiscards */\n    *value_u32 = netif->mib2_counters.ifindiscards;\n    value_len = sizeof(*value_u32);\n    break;\n  case 14: /* ifInErrors */\n    *value_u32 = netif->mib2_counters.ifinerrors;\n    value_len = sizeof(*value_u32);\n    break;\n  case 15: /* ifInUnkownProtos */\n    *value_u32 = netif->mib2_counters.ifinunknownprotos;\n    value_len = sizeof(*value_u32);\n    break;\n  case 16: /* ifOutOctets */\n    *value_u32 = netif->mib2_counters.ifoutoctets;\n    value_len = sizeof(*value_u32);\n    break;\n  case 17: /* ifOutUcastPkts */\n    *value_u32 = netif->mib2_counters.ifoutucastpkts;\n    value_len = sizeof(*value_u32);\n    break;\n  case 18: /* ifOutNUcastPkts */\n    *value_u32 = netif->mib2_counters.ifoutnucastpkts;\n    value_len = sizeof(*value_u32);\n    break;\n  case 19: /* ifOutDiscarts */\n    *value_u32 = netif->mib2_counters.ifoutdiscards;\n    value_len = sizeof(*value_u32);\n    break;\n  case 20: /* ifOutErrors */\n    *value_u32 = netif->mib2_counters.ifouterrors;\n    value_len = sizeof(*value_u32);\n    break;\n  case 21: /* ifOutQLen */\n    *value_u32 = iftable_ifOutQLen;\n    value_len = sizeof(*value_u32);\n    break;\n  /** @note returning zeroDotZero (0.0) no media specific MIB support */\n  case 22: /* ifSpecific */\n    value_len = snmp_zero_dot_zero.len * sizeof(u32_t);\n    MEMCPY(value, snmp_zero_dot_zero.id, value_len);\n    break;\n  default:\n    return 0;\n  }\n\n  return value_len;\n}\n\n#if !SNMP_SAFE_REQUESTS\n\nstatic snmp_err_t\ninterfaces_Table_set_test(struct snmp_node_instance* instance, u16_t len, void *value)\n{\n  s32_t *sint_ptr = (s32_t*)value;\n\n  /* stack should never call this method for another column,\n  because all other columns are set to readonly */\n  LWIP_ASSERT(\"Invalid column\", (SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id) == 7));\n  LWIP_UNUSED_ARG(len);\n\n  if (*sint_ptr == 1 || *sint_ptr == 2) {\n    return SNMP_ERR_NOERROR;\n  }\n\n  return SNMP_ERR_WRONGVALUE;\n}\n\nstatic snmp_err_t\ninterfaces_Table_set_value(struct snmp_node_instance* instance, u16_t len, void *value)\n{\n  struct netif *netif = (struct netif*)instance->reference.ptr;\n  s32_t *sint_ptr = (s32_t*)value;\n\n  /* stack should never call this method for another column,\n  because all other columns are set to readonly */\n  LWIP_ASSERT(\"Invalid column\", (SNMP_TABLE_GET_COLUMN_FROM_OID(instance->instance_oid.id) == 7));\n  LWIP_UNUSED_ARG(len);\n\n  if (*sint_ptr == 1) {\n    netif_set_up(netif);\n  } else if (*sint_ptr == 2) {\n    netif_set_down(netif);\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\n#endif /* SNMP_SAFE_REQUESTS */\n\nstatic const struct snmp_scalar_node interfaces_Number = SNMP_SCALAR_CREATE_NODE_READONLY(1, SNMP_ASN1_TYPE_INTEGER, interfaces_get_value);\n\nstatic const struct snmp_table_col_def interfaces_Table_columns[] = {\n  {  1, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifIndex */\n  {  2, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY }, /* ifDescr */\n  {  3, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifType */\n  {  4, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifMtu */\n  {  5, SNMP_ASN1_TYPE_GAUGE,        SNMP_NODE_INSTANCE_READ_ONLY }, /* ifSpeed */\n  {  6, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY }, /* ifPhysAddress */\n#if !SNMP_SAFE_REQUESTS\n  {  7, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_WRITE }, /* ifAdminStatus */\n#else\n  {  7, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifAdminStatus */\n#endif\n  {  8, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifOperStatus */\n  {  9, SNMP_ASN1_TYPE_TIMETICKS,    SNMP_NODE_INSTANCE_READ_ONLY }, /* ifLastChange */\n  { 10, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifInOctets */\n  { 11, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifInUcastPkts */\n  { 12, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifInNUcastPkts */\n  { 13, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifInDiscarts */\n  { 14, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifInErrors */\n  { 15, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifInUnkownProtos */\n  { 16, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifOutOctets */\n  { 17, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifOutUcastPkts */\n  { 18, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifOutNUcastPkts */\n  { 19, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifOutDiscarts */\n  { 20, SNMP_ASN1_TYPE_COUNTER,      SNMP_NODE_INSTANCE_READ_ONLY }, /* ifOutErrors */\n  { 21, SNMP_ASN1_TYPE_GAUGE,        SNMP_NODE_INSTANCE_READ_ONLY }, /* ifOutQLen */\n  { 22, SNMP_ASN1_TYPE_OBJECT_ID,    SNMP_NODE_INSTANCE_READ_ONLY }  /* ifSpecific */\n};\n\n#if !SNMP_SAFE_REQUESTS\nstatic const struct snmp_table_node interfaces_Table = SNMP_TABLE_CREATE(\n  2, interfaces_Table_columns,\n  interfaces_Table_get_cell_instance, interfaces_Table_get_next_cell_instance,\n  interfaces_Table_get_value, interfaces_Table_set_test, interfaces_Table_set_value);\n#else\nstatic const struct snmp_table_node interfaces_Table = SNMP_TABLE_CREATE(\n  2, interfaces_Table_columns,\n  interfaces_Table_get_cell_instance, interfaces_Table_get_next_cell_instance,\n  interfaces_Table_get_value, NULL, NULL);\n#endif\n\n/* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */\nCREATE_LWIP_SYNC_NODE(1, interfaces_Number)\nCREATE_LWIP_SYNC_NODE(2, interfaces_Table)\n\nstatic const struct snmp_node* const interface_nodes[] = {\n  &SYNC_NODE_NAME(interfaces_Number).node.node,\n  &SYNC_NODE_NAME(interfaces_Table).node.node\n};\n\nconst struct snmp_tree_node snmp_mib2_interface_root = SNMP_CREATE_TREE_NODE(2, interface_nodes);\n\n#endif /* LWIP_SNMP && SNMP_LWIP_MIB2 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_mib2_ip.c",
    "content": "/**\n * @file\n * Management Information Base II (RFC1213) IP objects and functions.\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *         Christiaan Simons <christiaan.simons@axon.tv>\n */\n\n#include \"lwip/snmp.h\"\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/apps/snmp_mib2.h\"\n#include \"lwip/apps/snmp_table.h\"\n#include \"lwip/apps/snmp_scalar.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/etharp.h\"\n\n#if LWIP_SNMP && SNMP_LWIP_MIB2\n\n#if SNMP_USE_NETCONN\n#define SYNC_NODE_NAME(node_name) node_name ## _synced\n#define CREATE_LWIP_SYNC_NODE(oid, node_name) \\\n   static const struct snmp_threadsync_node node_name ## _synced = SNMP_CREATE_THREAD_SYNC_NODE(oid, &node_name.node, &snmp_mib2_lwip_locks);\n#else\n#define SYNC_NODE_NAME(node_name) node_name\n#define CREATE_LWIP_SYNC_NODE(oid, node_name)\n#endif\n\n#if LWIP_IPV4\n/* --- ip .1.3.6.1.2.1.4 ----------------------------------------------------- */\n\nstatic s16_t\nip_get_value(struct snmp_node_instance* instance, void* value)\n{\n  s32_t* sint_ptr = (s32_t*)value;\n  u32_t* uint_ptr = (u32_t*)value;\n\n  switch (instance->node->oid) {\n  case 1: /* ipForwarding */\n#if IP_FORWARD\n    /* forwarding */\n    *sint_ptr = 1;\n#else\n    /* not-forwarding */\n    *sint_ptr = 2;\n#endif\n    return sizeof(*sint_ptr);\n  case 2: /* ipDefaultTTL */\n    *sint_ptr = IP_DEFAULT_TTL;\n    return sizeof(*sint_ptr);\n  case 3: /* ipInReceives */\n    *uint_ptr = STATS_GET(mib2.ipinreceives);\n    return sizeof(*uint_ptr);\n  case 4: /* ipInHdrErrors */\n    *uint_ptr = STATS_GET(mib2.ipinhdrerrors);\n    return sizeof(*uint_ptr);\n  case 5: /* ipInAddrErrors */\n    *uint_ptr = STATS_GET(mib2.ipinaddrerrors);\n    return sizeof(*uint_ptr);\n  case 6: /* ipForwDatagrams */\n    *uint_ptr = STATS_GET(mib2.ipforwdatagrams);\n    return sizeof(*uint_ptr);\n  case 7: /* ipInUnknownProtos */\n    *uint_ptr = STATS_GET(mib2.ipinunknownprotos);\n    return sizeof(*uint_ptr);\n  case 8: /* ipInDiscards */\n    *uint_ptr = STATS_GET(mib2.ipindiscards);\n    return sizeof(*uint_ptr);\n  case 9: /* ipInDelivers */\n    *uint_ptr = STATS_GET(mib2.ipindelivers);\n    return sizeof(*uint_ptr);\n  case 10: /* ipOutRequests */\n    *uint_ptr = STATS_GET(mib2.ipoutrequests);\n    return sizeof(*uint_ptr);\n  case 11: /* ipOutDiscards */\n    *uint_ptr = STATS_GET(mib2.ipoutdiscards);\n    return sizeof(*uint_ptr);\n  case 12: /* ipOutNoRoutes */\n    *uint_ptr = STATS_GET(mib2.ipoutnoroutes);\n    return sizeof(*uint_ptr);\n  case 13: /* ipReasmTimeout */\n#if IP_REASSEMBLY\n    *sint_ptr = IP_REASS_MAXAGE;\n#else\n    *sint_ptr = 0;\n#endif\n    return sizeof(*sint_ptr);\n  case 14: /* ipReasmReqds */\n    *uint_ptr = STATS_GET(mib2.ipreasmreqds);\n    return sizeof(*uint_ptr);\n  case 15: /* ipReasmOKs */\n    *uint_ptr = STATS_GET(mib2.ipreasmoks);\n    return sizeof(*uint_ptr);\n  case 16: /* ipReasmFails */\n    *uint_ptr = STATS_GET(mib2.ipreasmfails);\n    return sizeof(*uint_ptr);\n  case 17: /* ipFragOKs */\n    *uint_ptr = STATS_GET(mib2.ipfragoks);\n    return sizeof(*uint_ptr);\n  case 18: /* ipFragFails */\n    *uint_ptr = STATS_GET(mib2.ipfragfails);\n    return sizeof(*uint_ptr);\n  case 19: /* ipFragCreates */\n    *uint_ptr = STATS_GET(mib2.ipfragcreates);\n    return sizeof(*uint_ptr);\n  case 23: /* ipRoutingDiscards: not supported -> always 0 */\n    *uint_ptr = 0;\n    return sizeof(*uint_ptr);\n  default:\n    LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"ip_get_value(): unknown id: %\"S32_F\"\\n\", instance->node->oid));\n    break;\n  }\n\n  return 0;\n}\n\n/**\n * Test ip object value before setting.\n *\n * @param instance node instance\n * @param len return value space (in bytes)\n * @param value points to (varbind) space to copy value from.\n *\n * @note we allow set if the value matches the hardwired value,\n *   otherwise return badvalue.\n */\nstatic snmp_err_t\nip_set_test(struct snmp_node_instance* instance, u16_t len, void *value)\n{\n  snmp_err_t ret = SNMP_ERR_WRONGVALUE;\n  s32_t *sint_ptr = (s32_t*)value;\n\n  LWIP_UNUSED_ARG(len);\n  switch (instance->node->oid) {\n  case 1: /* ipForwarding */\n#if IP_FORWARD\n    /* forwarding */\n    if (*sint_ptr == 1)\n#else\n    /* not-forwarding */\n    if (*sint_ptr == 2)\n#endif\n    {\n      ret = SNMP_ERR_NOERROR;\n    }\n    break;\n  case 2: /* ipDefaultTTL */\n    if (*sint_ptr == IP_DEFAULT_TTL) {\n      ret = SNMP_ERR_NOERROR;\n    }\n    break;\n  default:\n    LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"ip_set_test(): unknown id: %\"S32_F\"\\n\", instance->node->oid));\n    break;\n  }\n\n  return ret;\n}\n\nstatic snmp_err_t\nip_set_value(struct snmp_node_instance* instance, u16_t len, void *value)\n{\n  LWIP_UNUSED_ARG(instance);\n  LWIP_UNUSED_ARG(len);\n  LWIP_UNUSED_ARG(value);\n  /* nothing to do here because in set_test we only accept values being the same as our own stored value -> no need to store anything */\n  return SNMP_ERR_NOERROR;\n}\n\n/* --- ipAddrTable --- */\n\n/* list of allowed value ranges for incoming OID */\nstatic const struct snmp_oid_range ip_AddrTable_oid_ranges[] = {\n  { 0, 0xff }, /* IP A */\n  { 0, 0xff }, /* IP B */\n  { 0, 0xff }, /* IP C */\n  { 0, 0xff }  /* IP D */\n};\n\nstatic snmp_err_t\nip_AddrTable_get_cell_value_core(struct netif *netif, const u32_t* column, union snmp_variant_value* value, u32_t* value_len)\n{\n  LWIP_UNUSED_ARG(value_len);\n\n  switch (*column) {\n  case 1: /* ipAdEntAddr */\n    value->u32 = netif_ip4_addr(netif)->addr;\n    break;\n  case 2: /* ipAdEntIfIndex */\n    value->u32 = netif_to_num(netif);\n    break;\n  case 3: /* ipAdEntNetMask */\n    value->u32 = netif_ip4_netmask(netif)->addr;\n    break;\n  case 4: /* ipAdEntBcastAddr */\n    /* lwIP oddity, there's no broadcast\n       address in the netif we can rely on */\n    value->u32 = IPADDR_BROADCAST & 1;\n    break;\n  case 5: /* ipAdEntReasmMaxSize */\n#if IP_REASSEMBLY\n    /* @todo The theoretical maximum is IP_REASS_MAX_PBUFS * size of the pbufs,\n     * but only if receiving one fragmented packet at a time.\n     * The current solution is to calculate for 2 simultaneous packets...\n     */\n    value->u32 = (IP_HLEN + ((IP_REASS_MAX_PBUFS/2) *\n        (PBUF_POOL_BUFSIZE - PBUF_LINK_ENCAPSULATION_HLEN - PBUF_LINK_HLEN - IP_HLEN)));\n#else\n    /** @todo returning MTU would be a bad thing and\n        returning a wild guess like '576' isn't good either */\n    value->u32 = 0;\n#endif\n    break;\n  default:\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic snmp_err_t\nip_AddrTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)\n{\n  ip4_addr_t ip;\n  struct netif *netif;\n\n  /* check if incoming OID length and if values are in plausible range */\n  if (!snmp_oid_in_range(row_oid, row_oid_len, ip_AddrTable_oid_ranges, LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges))) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* get IP from incoming OID */\n  snmp_oid_to_ip4(&row_oid[0], &ip); /* we know it succeeds because of oid_in_range check above */\n\n  /* find netif with requested ip */\n  netif = netif_list;\n  while (netif != NULL) {\n    if (ip4_addr_cmp(&ip, netif_ip4_addr(netif))) {\n      /* fill in object properties */\n      return ip_AddrTable_get_cell_value_core(netif, column, value, value_len);\n    }\n\n    netif = netif->next;\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nstatic snmp_err_t\nip_AddrTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)\n{\n  struct netif *netif;\n  struct snmp_next_oid_state state;\n  u32_t result_temp[LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges)];\n\n  /* init struct to search next oid */\n  snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges));\n\n  /* iterate over all possible OIDs to find the next one */\n  netif = netif_list;\n  while (netif != NULL) {\n    u32_t test_oid[LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges)];\n    snmp_ip4_to_oid(netif_ip4_addr(netif), &test_oid[0]);\n\n    /* check generated OID: is it a candidate for the next one? */\n    snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(ip_AddrTable_oid_ranges), netif);\n\n    netif = netif->next;\n  }\n\n  /* did we find a next one? */\n  if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {\n    snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n    /* fill in object properties */\n    return ip_AddrTable_get_cell_value_core((struct netif*)state.reference, column, value, value_len);\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\n/* --- ipRouteTable --- */\n\n/* list of allowed value ranges for incoming OID */\nstatic const struct snmp_oid_range ip_RouteTable_oid_ranges[] = {\n  { 0, 0xff }, /* IP A */\n  { 0, 0xff }, /* IP B */\n  { 0, 0xff }, /* IP C */\n  { 0, 0xff }, /* IP D */\n};\n\nstatic snmp_err_t\nip_RouteTable_get_cell_value_core(struct netif *netif, u8_t default_route, const u32_t* column, union snmp_variant_value* value, u32_t* value_len)\n{\n  switch (*column) {\n  case 1: /* ipRouteDest */\n    if (default_route) {\n       /* default rte has 0.0.0.0 dest */\n      value->u32 = IP4_ADDR_ANY4->addr;\n    } else {\n      /* netifs have netaddress dest */\n      ip4_addr_t tmp;\n      ip4_addr_get_network(&tmp, netif_ip4_addr(netif), netif_ip4_netmask(netif));\n      value->u32 = tmp.addr;\n    }\n    break;\n  case 2: /* ipRouteIfIndex */\n    value->u32 = netif_to_num(netif);\n    break;\n  case 3: /* ipRouteMetric1 */\n    if (default_route) {\n      value->s32 = 1; /* default */\n    } else {\n      value->s32 = 0; /* normal */\n    }\n    break;\n  case 4: /* ipRouteMetric2 */\n  case 5: /* ipRouteMetric3 */\n  case 6: /* ipRouteMetric4 */\n    value->s32 = -1; /* none */\n    break;\n  case 7: /* ipRouteNextHop */\n    if (default_route) {\n      /* default rte: gateway */\n      value->u32 = netif_ip4_gw(netif)->addr;\n    } else {\n      /* other rtes: netif ip_addr  */\n      value->u32 = netif_ip4_addr(netif)->addr;\n    }\n    break;\n  case 8: /* ipRouteType */\n    if (default_route) {\n      /* default rte is indirect */\n      value->u32 = 4; /* indirect */\n    } else {\n      /* other rtes are direct */\n      value->u32 = 3; /* direct */\n    }\n    break;\n  case 9: /* ipRouteProto */\n    /* locally defined routes */\n    value->u32 = 2; /* local */\n    break;\n  case 10: /* ipRouteAge */\n    /* @todo (sysuptime - timestamp last change) / 100 */\n    value->u32 = 0;\n    break;\n  case 11: /* ipRouteMask */\n    if (default_route) {\n      /* default rte use 0.0.0.0 mask */\n      value->u32 = IP4_ADDR_ANY4->addr;\n    } else {\n      /* other rtes use netmask */\n      value->u32 = netif_ip4_netmask(netif)->addr;\n    }\n    break;\n  case 12: /* ipRouteMetric5 */\n    value->s32 = -1; /* none */\n    break;\n  case 13: /* ipRouteInfo */\n    value->const_ptr = snmp_zero_dot_zero.id;\n    *value_len = snmp_zero_dot_zero.len * sizeof(u32_t);\n    break;\n  default:\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic snmp_err_t\nip_RouteTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)\n{\n  ip4_addr_t test_ip;\n  struct netif *netif;\n\n  /* check if incoming OID length and if values are in plausible range */\n  if (!snmp_oid_in_range(row_oid, row_oid_len, ip_RouteTable_oid_ranges, LWIP_ARRAYSIZE(ip_RouteTable_oid_ranges))) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* get IP and port from incoming OID */\n  snmp_oid_to_ip4(&row_oid[0], &test_ip); /* we know it succeeds because of oid_in_range check above */\n\n  /* default route is on default netif */\n  if (ip4_addr_isany_val(test_ip) && (netif_default != NULL)) {\n    /* fill in object properties */\n    return ip_RouteTable_get_cell_value_core(netif_default, 1, column, value, value_len);\n  }\n\n  /* find netif with requested route */\n  netif = netif_list;\n  while (netif != NULL) {\n    ip4_addr_t dst;\n    ip4_addr_get_network(&dst, netif_ip4_addr(netif), netif_ip4_netmask(netif));\n\n    if (ip4_addr_cmp(&dst, &test_ip)) {\n      /* fill in object properties */\n      return ip_RouteTable_get_cell_value_core(netif, 0, column, value, value_len);\n    }\n\n    netif = netif->next;\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nstatic snmp_err_t\nip_RouteTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)\n{\n  struct netif *netif;\n  struct snmp_next_oid_state state;\n  u32_t result_temp[LWIP_ARRAYSIZE(ip_RouteTable_oid_ranges)];\n  u32_t test_oid[LWIP_ARRAYSIZE(ip_RouteTable_oid_ranges)];\n\n  /* init struct to search next oid */\n  snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(ip_RouteTable_oid_ranges));\n\n  /* check default route */\n  if (netif_default != NULL) {\n    snmp_ip4_to_oid(IP4_ADDR_ANY4, &test_oid[0]);\n    snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(ip_RouteTable_oid_ranges), netif_default);\n  }\n\n  /* iterate over all possible OIDs to find the next one */\n  netif = netif_list;\n  while (netif != NULL) {\n    ip4_addr_t dst;\n    ip4_addr_get_network(&dst, netif_ip4_addr(netif), netif_ip4_netmask(netif));\n\n    /* check generated OID: is it a candidate for the next one? */\n    if (!ip4_addr_isany_val(dst)) {\n      snmp_ip4_to_oid(&dst, &test_oid[0]);\n      snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(ip_RouteTable_oid_ranges), netif);\n    }\n\n    netif = netif->next;\n  }\n\n  /* did we find a next one? */\n  if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {\n    ip4_addr_t dst;\n    snmp_oid_to_ip4(&result_temp[0], &dst);\n    snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n    /* fill in object properties */\n    return ip_RouteTable_get_cell_value_core((struct netif*)state.reference, ip4_addr_isany_val(dst), column, value, value_len);\n  } else {\n    /* not found */\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n}\n\n#if LWIP_ARP && LWIP_IPV4\n/* --- ipNetToMediaTable --- */\n\n/* list of allowed value ranges for incoming OID */\nstatic const struct snmp_oid_range ip_NetToMediaTable_oid_ranges[] = {\n  { 1, 0xff }, /* IfIndex */\n  { 0, 0xff }, /* IP A    */\n  { 0, 0xff }, /* IP B    */\n  { 0, 0xff }, /* IP C    */\n  { 0, 0xff }  /* IP D    */\n};\n\nstatic snmp_err_t\nip_NetToMediaTable_get_cell_value_core(u8_t arp_table_index, const u32_t* column, union snmp_variant_value* value, u32_t* value_len)\n{\n  ip4_addr_t *ip;\n  struct netif *netif;\n  struct eth_addr *ethaddr;\n\n  etharp_get_entry(arp_table_index, &ip, &netif, &ethaddr);\n\n  /* value */\n  switch (*column) {\n  case 1: /* atIfIndex / ipNetToMediaIfIndex */\n    value->u32 = netif_to_num(netif);\n    break;\n  case 2: /* atPhysAddress / ipNetToMediaPhysAddress */\n    value->ptr = ethaddr;\n    *value_len = sizeof(*ethaddr);\n    break;\n  case 3: /* atNetAddress / ipNetToMediaNetAddress */\n    value->u32 = ip->addr;\n    break;\n  case 4: /* ipNetToMediaType */\n    value->u32 = 3; /* dynamic*/\n    break;\n  default:\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic snmp_err_t\nip_NetToMediaTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)\n{\n  ip4_addr_t ip_in;\n  u8_t netif_index;\n  u8_t i;\n\n  /* check if incoming OID length and if values are in plausible range */\n  if (!snmp_oid_in_range(row_oid, row_oid_len, ip_NetToMediaTable_oid_ranges, LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges))) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* get IP from incoming OID */\n  netif_index = (u8_t)row_oid[0];\n  snmp_oid_to_ip4(&row_oid[1], &ip_in); /* we know it succeeds because of oid_in_range check above */\n\n  /* find requested entry */\n  for (i=0; i<ARP_TABLE_SIZE; i++) {\n    ip4_addr_t *ip;\n    struct netif *netif;\n    struct eth_addr *ethaddr;\n\n    if (etharp_get_entry(i, &ip, &netif, &ethaddr)) {\n      if ((netif_index == netif_to_num(netif)) && ip4_addr_cmp(&ip_in, ip)) {\n        /* fill in object properties */\n        return ip_NetToMediaTable_get_cell_value_core(i, column, value, value_len);\n      }\n    }\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nstatic snmp_err_t\nip_NetToMediaTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)\n{\n  u8_t i;\n  struct snmp_next_oid_state state;\n  u32_t result_temp[LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges)];\n\n  /* init struct to search next oid */\n  snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges));\n\n  /* iterate over all possible OIDs to find the next one */\n  for (i=0; i<ARP_TABLE_SIZE; i++) {\n    ip4_addr_t *ip;\n    struct netif *netif;\n    struct eth_addr *ethaddr;\n\n    if (etharp_get_entry(i, &ip, &netif, &ethaddr)) {\n      u32_t test_oid[LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges)];\n\n      test_oid[0] = netif_to_num(netif);\n      snmp_ip4_to_oid(ip, &test_oid[1]);\n\n      /* check generated OID: is it a candidate for the next one? */\n      snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(ip_NetToMediaTable_oid_ranges), LWIP_PTR_NUMERIC_CAST(void*, i));\n    }\n  }\n\n  /* did we find a next one? */\n  if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {\n    snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n    /* fill in object properties */\n    return ip_NetToMediaTable_get_cell_value_core(LWIP_PTR_NUMERIC_CAST(u8_t, state.reference), column, value, value_len);\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\n#endif /* LWIP_ARP && LWIP_IPV4 */\n\nstatic const struct snmp_scalar_node ip_Forwarding      = SNMP_SCALAR_CREATE_NODE(1, SNMP_NODE_INSTANCE_READ_WRITE, SNMP_ASN1_TYPE_INTEGER, ip_get_value, ip_set_test, ip_set_value);\nstatic const struct snmp_scalar_node ip_DefaultTTL      = SNMP_SCALAR_CREATE_NODE(2, SNMP_NODE_INSTANCE_READ_WRITE, SNMP_ASN1_TYPE_INTEGER, ip_get_value, ip_set_test, ip_set_value);\nstatic const struct snmp_scalar_node ip_InReceives      = SNMP_SCALAR_CREATE_NODE_READONLY(3, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_InHdrErrors     = SNMP_SCALAR_CREATE_NODE_READONLY(4, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_InAddrErrors    = SNMP_SCALAR_CREATE_NODE_READONLY(5, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_ForwDatagrams   = SNMP_SCALAR_CREATE_NODE_READONLY(6, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_InUnknownProtos = SNMP_SCALAR_CREATE_NODE_READONLY(7, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_InDiscards      = SNMP_SCALAR_CREATE_NODE_READONLY(8, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_InDelivers      = SNMP_SCALAR_CREATE_NODE_READONLY(9, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_OutRequests     = SNMP_SCALAR_CREATE_NODE_READONLY(10, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_OutDiscards     = SNMP_SCALAR_CREATE_NODE_READONLY(11, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_OutNoRoutes     = SNMP_SCALAR_CREATE_NODE_READONLY(12, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_ReasmTimeout    = SNMP_SCALAR_CREATE_NODE_READONLY(13, SNMP_ASN1_TYPE_INTEGER, ip_get_value);\nstatic const struct snmp_scalar_node ip_ReasmReqds      = SNMP_SCALAR_CREATE_NODE_READONLY(14, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_ReasmOKs        = SNMP_SCALAR_CREATE_NODE_READONLY(15, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_ReasmFails      = SNMP_SCALAR_CREATE_NODE_READONLY(16, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_FragOKs         = SNMP_SCALAR_CREATE_NODE_READONLY(17, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_FragFails       = SNMP_SCALAR_CREATE_NODE_READONLY(18, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_FragCreates     = SNMP_SCALAR_CREATE_NODE_READONLY(19, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\nstatic const struct snmp_scalar_node ip_RoutingDiscards = SNMP_SCALAR_CREATE_NODE_READONLY(23, SNMP_ASN1_TYPE_COUNTER, ip_get_value);\n\nstatic const struct snmp_table_simple_col_def ip_AddrTable_columns[] = {\n  { 1, SNMP_ASN1_TYPE_IPADDR,  SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipAdEntAddr */\n  { 2, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipAdEntIfIndex */\n  { 3, SNMP_ASN1_TYPE_IPADDR,  SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipAdEntNetMask */\n  { 4, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipAdEntBcastAddr */\n  { 5, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 }  /* ipAdEntReasmMaxSize */\n};\n\nstatic const struct snmp_table_simple_node ip_AddrTable = SNMP_TABLE_CREATE_SIMPLE(20, ip_AddrTable_columns, ip_AddrTable_get_cell_value, ip_AddrTable_get_next_cell_instance_and_value);\n\nstatic const struct snmp_table_simple_col_def ip_RouteTable_columns[] = {\n  {  1, SNMP_ASN1_TYPE_IPADDR,    SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipRouteDest */\n  {  2, SNMP_ASN1_TYPE_INTEGER,   SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipRouteIfIndex */\n  {  3, SNMP_ASN1_TYPE_INTEGER,   SNMP_VARIANT_VALUE_TYPE_S32 }, /* ipRouteMetric1 */\n  {  4, SNMP_ASN1_TYPE_INTEGER,   SNMP_VARIANT_VALUE_TYPE_S32 }, /* ipRouteMetric2 */\n  {  5, SNMP_ASN1_TYPE_INTEGER,   SNMP_VARIANT_VALUE_TYPE_S32 }, /* ipRouteMetric3 */\n  {  6, SNMP_ASN1_TYPE_INTEGER,   SNMP_VARIANT_VALUE_TYPE_S32 }, /* ipRouteMetric4 */\n  {  7, SNMP_ASN1_TYPE_IPADDR,    SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipRouteNextHop */\n  {  8, SNMP_ASN1_TYPE_INTEGER,   SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipRouteType */\n  {  9, SNMP_ASN1_TYPE_INTEGER,   SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipRouteProto */\n  { 10, SNMP_ASN1_TYPE_INTEGER,   SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipRouteAge */\n  { 11, SNMP_ASN1_TYPE_IPADDR,    SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipRouteMask */\n  { 12, SNMP_ASN1_TYPE_INTEGER,   SNMP_VARIANT_VALUE_TYPE_S32 }, /* ipRouteMetric5 */\n  { 13, SNMP_ASN1_TYPE_OBJECT_ID, SNMP_VARIANT_VALUE_TYPE_PTR }  /* ipRouteInfo */\n};\n\nstatic const struct snmp_table_simple_node ip_RouteTable = SNMP_TABLE_CREATE_SIMPLE(21, ip_RouteTable_columns, ip_RouteTable_get_cell_value, ip_RouteTable_get_next_cell_instance_and_value);\n#endif /* LWIP_IPV4 */\n\n#if LWIP_ARP && LWIP_IPV4\nstatic const struct snmp_table_simple_col_def ip_NetToMediaTable_columns[] = {\n  {  1, SNMP_ASN1_TYPE_INTEGER,      SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipNetToMediaIfIndex */\n  {  2, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_VARIANT_VALUE_TYPE_PTR }, /* ipNetToMediaPhysAddress */\n  {  3, SNMP_ASN1_TYPE_IPADDR,       SNMP_VARIANT_VALUE_TYPE_U32 }, /* ipNetToMediaNetAddress */\n  {  4, SNMP_ASN1_TYPE_INTEGER,      SNMP_VARIANT_VALUE_TYPE_U32 }  /* ipNetToMediaType */\n};\n\nstatic const struct snmp_table_simple_node ip_NetToMediaTable = SNMP_TABLE_CREATE_SIMPLE(22, ip_NetToMediaTable_columns, ip_NetToMediaTable_get_cell_value, ip_NetToMediaTable_get_next_cell_instance_and_value);\n#endif /* LWIP_ARP && LWIP_IPV4 */\n\n#if LWIP_IPV4\n/* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */\nCREATE_LWIP_SYNC_NODE( 1, ip_Forwarding)\nCREATE_LWIP_SYNC_NODE( 2, ip_DefaultTTL)\nCREATE_LWIP_SYNC_NODE( 3, ip_InReceives)\nCREATE_LWIP_SYNC_NODE( 4, ip_InHdrErrors)\nCREATE_LWIP_SYNC_NODE( 5, ip_InAddrErrors)\nCREATE_LWIP_SYNC_NODE( 6, ip_ForwDatagrams)\nCREATE_LWIP_SYNC_NODE( 7, ip_InUnknownProtos)\nCREATE_LWIP_SYNC_NODE( 8, ip_InDiscards)\nCREATE_LWIP_SYNC_NODE( 9, ip_InDelivers)\nCREATE_LWIP_SYNC_NODE(10, ip_OutRequests)\nCREATE_LWIP_SYNC_NODE(11, ip_OutDiscards)\nCREATE_LWIP_SYNC_NODE(12, ip_OutNoRoutes)\nCREATE_LWIP_SYNC_NODE(13, ip_ReasmTimeout)\nCREATE_LWIP_SYNC_NODE(14, ip_ReasmReqds)\nCREATE_LWIP_SYNC_NODE(15, ip_ReasmOKs)\nCREATE_LWIP_SYNC_NODE(15, ip_ReasmFails)\nCREATE_LWIP_SYNC_NODE(17, ip_FragOKs)\nCREATE_LWIP_SYNC_NODE(18, ip_FragFails)\nCREATE_LWIP_SYNC_NODE(19, ip_FragCreates)\nCREATE_LWIP_SYNC_NODE(20, ip_AddrTable)\nCREATE_LWIP_SYNC_NODE(21, ip_RouteTable)\n#if LWIP_ARP\nCREATE_LWIP_SYNC_NODE(22, ip_NetToMediaTable)\n#endif /* LWIP_ARP */\nCREATE_LWIP_SYNC_NODE(23, ip_RoutingDiscards)\n\nstatic const struct snmp_node* const ip_nodes[] = {\n  &SYNC_NODE_NAME(ip_Forwarding).node.node,\n  &SYNC_NODE_NAME(ip_DefaultTTL).node.node,\n  &SYNC_NODE_NAME(ip_InReceives).node.node,\n  &SYNC_NODE_NAME(ip_InHdrErrors).node.node,\n  &SYNC_NODE_NAME(ip_InAddrErrors).node.node,\n  &SYNC_NODE_NAME(ip_ForwDatagrams).node.node,\n  &SYNC_NODE_NAME(ip_InUnknownProtos).node.node,\n  &SYNC_NODE_NAME(ip_InDiscards).node.node,\n  &SYNC_NODE_NAME(ip_InDelivers).node.node,\n  &SYNC_NODE_NAME(ip_OutRequests).node.node,\n  &SYNC_NODE_NAME(ip_OutDiscards).node.node,\n  &SYNC_NODE_NAME(ip_OutNoRoutes).node.node,\n  &SYNC_NODE_NAME(ip_ReasmTimeout).node.node,\n  &SYNC_NODE_NAME(ip_ReasmReqds).node.node,\n  &SYNC_NODE_NAME(ip_ReasmOKs).node.node,\n  &SYNC_NODE_NAME(ip_ReasmFails).node.node,\n  &SYNC_NODE_NAME(ip_FragOKs).node.node,\n  &SYNC_NODE_NAME(ip_FragFails).node.node,\n  &SYNC_NODE_NAME(ip_FragCreates).node.node,\n  &SYNC_NODE_NAME(ip_AddrTable).node.node,\n  &SYNC_NODE_NAME(ip_RouteTable).node.node,\n#if LWIP_ARP\n  &SYNC_NODE_NAME(ip_NetToMediaTable).node.node,\n#endif /* LWIP_ARP */\n  &SYNC_NODE_NAME(ip_RoutingDiscards).node.node\n};\n\nconst struct snmp_tree_node snmp_mib2_ip_root = SNMP_CREATE_TREE_NODE(4, ip_nodes);\n#endif /* LWIP_IPV4 */\n\n/* --- at .1.3.6.1.2.1.3 ----------------------------------------------------- */\n\n#if LWIP_ARP && LWIP_IPV4\n/* at node table is a subset of ip_nettomedia table (same rows but less columns) */\nstatic const struct snmp_table_simple_col_def at_Table_columns[] = {\n  { 1, SNMP_ASN1_TYPE_INTEGER,      SNMP_VARIANT_VALUE_TYPE_U32 }, /* atIfIndex */\n  { 2, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_VARIANT_VALUE_TYPE_PTR }, /* atPhysAddress */\n  { 3, SNMP_ASN1_TYPE_IPADDR,       SNMP_VARIANT_VALUE_TYPE_U32 }  /* atNetAddress */\n};\n\nstatic const struct snmp_table_simple_node at_Table = SNMP_TABLE_CREATE_SIMPLE(1, at_Table_columns, ip_NetToMediaTable_get_cell_value, ip_NetToMediaTable_get_next_cell_instance_and_value);\n\n/* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */\nCREATE_LWIP_SYNC_NODE(1, at_Table)\n\nstatic const struct snmp_node* const at_nodes[] = {\n  &SYNC_NODE_NAME(at_Table).node.node\n};\n\nconst struct snmp_tree_node snmp_mib2_at_root = SNMP_CREATE_TREE_NODE(3, at_nodes);\n#endif /* LWIP_ARP && LWIP_IPV4 */\n\n#endif /* LWIP_SNMP && SNMP_LWIP_MIB2 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_mib2_snmp.c",
    "content": "/**\n * @file\n * Management Information Base II (RFC1213) SNMP objects and functions.\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *         Christiaan Simons <christiaan.simons@axon.tv>\n */\n\n#include \"lwip/snmp.h\"\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/apps/snmp_mib2.h\"\n#include \"lwip/apps/snmp_scalar.h\"\n\n#if LWIP_SNMP && SNMP_LWIP_MIB2\n\n#define MIB2_AUTH_TRAPS_ENABLED  1\n#define MIB2_AUTH_TRAPS_DISABLED 2\n\n/* --- snmp .1.3.6.1.2.1.11 ----------------------------------------------------- */\nstatic s16_t\nsnmp_get_value(const struct snmp_scalar_array_node_def *node, void *value)\n{\n  u32_t *uint_ptr = (u32_t*)value;\n  switch (node->oid) {\n  case 1: /* snmpInPkts */\n    *uint_ptr = snmp_stats.inpkts;\n    break;\n  case 2: /* snmpOutPkts */\n    *uint_ptr = snmp_stats.outpkts;\n    break;\n  case 3: /* snmpInBadVersions */\n    *uint_ptr = snmp_stats.inbadversions;\n    break;\n  case 4: /* snmpInBadCommunityNames */\n    *uint_ptr = snmp_stats.inbadcommunitynames;\n    break;\n  case 5: /* snmpInBadCommunityUses */\n    *uint_ptr = snmp_stats.inbadcommunityuses;\n    break;\n  case 6: /* snmpInASNParseErrs */\n    *uint_ptr = snmp_stats.inasnparseerrs;\n    break;\n  case 8: /* snmpInTooBigs */\n    *uint_ptr = snmp_stats.intoobigs;\n    break;\n  case 9: /* snmpInNoSuchNames */\n    *uint_ptr = snmp_stats.innosuchnames;\n    break;\n  case 10: /* snmpInBadValues */\n    *uint_ptr = snmp_stats.inbadvalues;\n    break;\n  case 11: /* snmpInReadOnlys */\n    *uint_ptr = snmp_stats.inreadonlys;\n    break;\n  case 12: /* snmpInGenErrs */\n    *uint_ptr = snmp_stats.ingenerrs;\n    break;\n  case 13: /* snmpInTotalReqVars */\n    *uint_ptr = snmp_stats.intotalreqvars;\n    break;\n  case 14: /* snmpInTotalSetVars */\n    *uint_ptr = snmp_stats.intotalsetvars;\n    break;\n  case 15: /* snmpInGetRequests */\n    *uint_ptr = snmp_stats.ingetrequests;\n    break;\n  case 16: /* snmpInGetNexts */\n    *uint_ptr = snmp_stats.ingetnexts;\n    break;\n  case 17: /* snmpInSetRequests */\n    *uint_ptr = snmp_stats.insetrequests;\n    break;\n  case 18: /* snmpInGetResponses */\n    *uint_ptr = snmp_stats.ingetresponses;\n    break;\n  case 19: /* snmpInTraps */\n    *uint_ptr = snmp_stats.intraps;\n    break;\n  case 20: /* snmpOutTooBigs */\n    *uint_ptr = snmp_stats.outtoobigs;\n    break;\n  case 21: /* snmpOutNoSuchNames */\n    *uint_ptr = snmp_stats.outnosuchnames;\n    break;\n  case 22: /* snmpOutBadValues */\n    *uint_ptr = snmp_stats.outbadvalues;\n    break;\n  case 24: /* snmpOutGenErrs */\n    *uint_ptr = snmp_stats.outgenerrs;\n    break;\n  case 25: /* snmpOutGetRequests */\n    *uint_ptr = snmp_stats.outgetrequests;\n    break;\n  case 26: /* snmpOutGetNexts */\n    *uint_ptr = snmp_stats.outgetnexts;\n    break;\n  case 27: /* snmpOutSetRequests */\n    *uint_ptr = snmp_stats.outsetrequests;\n    break;\n  case 28: /* snmpOutGetResponses */\n    *uint_ptr = snmp_stats.outgetresponses;\n    break;\n  case 29: /* snmpOutTraps */\n    *uint_ptr = snmp_stats.outtraps;\n    break;\n  case 30: /* snmpEnableAuthenTraps */\n    if (snmp_get_auth_traps_enabled() == SNMP_AUTH_TRAPS_DISABLED) {\n      *uint_ptr = MIB2_AUTH_TRAPS_DISABLED;\n    } else {\n      *uint_ptr = MIB2_AUTH_TRAPS_ENABLED;\n    }\n    break;\n  case 31: /* snmpSilentDrops */\n    *uint_ptr = 0; /* not supported */\n    break;\n  case 32: /* snmpProxyDrops */\n    *uint_ptr = 0; /* not supported */\n    break;\n  default:\n    LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"snmp_get_value(): unknown id: %\"S32_F\"\\n\", node->oid));\n    return 0;\n  }\n\n  return sizeof(*uint_ptr);\n}\n\nstatic snmp_err_t\nsnmp_set_test(const struct snmp_scalar_array_node_def *node, u16_t len, void *value)\n{\n  snmp_err_t ret = SNMP_ERR_WRONGVALUE;\n  LWIP_UNUSED_ARG(len);\n\n  if (node->oid == 30) {\n    /* snmpEnableAuthenTraps */\n    s32_t *sint_ptr = (s32_t*)value;\n\n    /* we should have writable non-volatile mem here */\n    if ((*sint_ptr == MIB2_AUTH_TRAPS_DISABLED) || (*sint_ptr == MIB2_AUTH_TRAPS_ENABLED)) {\n      ret = SNMP_ERR_NOERROR;\n    }\n  }\n  return ret;\n}\n\nstatic snmp_err_t\nsnmp_set_value(const struct snmp_scalar_array_node_def *node, u16_t len, void *value)\n{\n  LWIP_UNUSED_ARG(len);\n\n  if (node->oid == 30) {\n    /* snmpEnableAuthenTraps */\n    s32_t *sint_ptr = (s32_t*)value;\n    if (*sint_ptr == MIB2_AUTH_TRAPS_DISABLED) {\n      snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_DISABLED);\n    } else {\n      snmp_set_auth_traps_enabled(SNMP_AUTH_TRAPS_ENABLED);\n    }\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\n/* the following nodes access variables in SNMP stack (snmp_stats) from SNMP worker thread -> OK, no sync needed */\nstatic const struct snmp_scalar_array_node_def snmp_nodes[] = {\n  { 1, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInPkts */\n  { 2, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpOutPkts */\n  { 3, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInBadVersions */\n  { 4, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInBadCommunityNames */\n  { 5, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInBadCommunityUses */\n  { 6, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInASNParseErrs */\n  { 8, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInTooBigs */\n  { 9, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInNoSuchNames */\n  {10, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInBadValues */\n  {11, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInReadOnlys */\n  {12, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInGenErrs */\n  {13, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInTotalReqVars */\n  {14, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInTotalSetVars */\n  {15, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInGetRequests */\n  {16, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInGetNexts */\n  {17, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInSetRequests */\n  {18, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInGetResponses */\n  {19, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpInTraps */\n  {20, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpOutTooBigs */\n  {21, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpOutNoSuchNames */\n  {22, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpOutBadValues */\n  {24, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpOutGenErrs */\n  {25, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpOutGetRequests */\n  {26, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpOutGetNexts */\n  {27, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpOutSetRequests */\n  {28, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpOutGetResponses */\n  {29, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpOutTraps */\n  {30, SNMP_ASN1_TYPE_INTEGER, SNMP_NODE_INSTANCE_READ_WRITE}, /* snmpEnableAuthenTraps */\n  {31, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY},  /* snmpSilentDrops */\n  {32, SNMP_ASN1_TYPE_COUNTER, SNMP_NODE_INSTANCE_READ_ONLY}   /* snmpProxyDrops */\n};\n\nconst struct snmp_scalar_array_node snmp_mib2_snmp_root = SNMP_SCALAR_CREATE_ARRAY_NODE(11, snmp_nodes, snmp_get_value, snmp_set_test, snmp_set_value);\n\n#endif /* LWIP_SNMP && SNMP_LWIP_MIB2 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_mib2_system.c",
    "content": "/**\n * @file\n * Management Information Base II (RFC1213) SYSTEM objects and functions.\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *         Christiaan Simons <christiaan.simons@axon.tv>\n */\n\n#include \"lwip/snmp.h\"\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/apps/snmp_mib2.h\"\n#include \"lwip/apps/snmp_table.h\"\n#include \"lwip/apps/snmp_scalar.h\"\n#include \"lwip/sys.h\"\n\n#include <string.h>\n\n#if LWIP_SNMP && SNMP_LWIP_MIB2\n\n#if SNMP_USE_NETCONN\n#define SYNC_NODE_NAME(node_name) node_name ## _synced\n#define CREATE_LWIP_SYNC_NODE(oid, node_name) \\\n   static const struct snmp_threadsync_node node_name ## _synced = SNMP_CREATE_THREAD_SYNC_NODE(oid, &node_name.node, &snmp_mib2_lwip_locks);\n#else\n#define SYNC_NODE_NAME(node_name) node_name\n#define CREATE_LWIP_SYNC_NODE(oid, node_name)\n#endif\n\n/* --- system .1.3.6.1.2.1.1 ----------------------------------------------------- */\n\n/** mib-2.system.sysDescr */\nstatic const u8_t   sysdescr_default[] = SNMP_LWIP_MIB2_SYSDESC;\nstatic const u8_t*  sysdescr           = sysdescr_default;\nstatic const u16_t* sysdescr_len       = NULL; /* use strlen for determining len */\n\n/** mib-2.system.sysContact */\nstatic const u8_t   syscontact_default[]     = SNMP_LWIP_MIB2_SYSCONTACT;\nstatic const u8_t*  syscontact               = syscontact_default;\nstatic const u16_t* syscontact_len           = NULL; /* use strlen for determining len */\nstatic u8_t*        syscontact_wr            = NULL; /* if writable, points to the same buffer as syscontact (required for correct constness) */\nstatic u16_t*       syscontact_wr_len        = NULL; /* if writable, points to the same buffer as syscontact_len (required for correct constness) */\nstatic u16_t        syscontact_bufsize       = 0;    /* 0=not writable */\n\n/** mib-2.system.sysName */\nstatic const u8_t   sysname_default[]        = SNMP_LWIP_MIB2_SYSNAME;\nstatic const u8_t*  sysname                  = sysname_default;\nstatic const u16_t* sysname_len              = NULL; /* use strlen for determining len */\nstatic u8_t*        sysname_wr               = NULL; /* if writable, points to the same buffer as sysname (required for correct constness) */\nstatic u16_t*       sysname_wr_len           = NULL; /* if writable, points to the same buffer as sysname_len (required for correct constness) */\nstatic u16_t        sysname_bufsize          = 0;    /* 0=not writable */\n\n/** mib-2.system.sysLocation */\nstatic const u8_t   syslocation_default[]    = SNMP_LWIP_MIB2_SYSLOCATION;\nstatic const u8_t*  syslocation              = syslocation_default;\nstatic const u16_t* syslocation_len           = NULL; /* use strlen for determining len */\nstatic u8_t*        syslocation_wr            = NULL; /* if writable, points to the same buffer as syslocation (required for correct constness) */\nstatic u16_t*       syslocation_wr_len        = NULL; /* if writable, points to the same buffer as syslocation_len (required for correct constness) */\nstatic u16_t        syslocation_bufsize       = 0;    /* 0=not writable */\n\n/**\n * @ingroup snmp_mib2\n * Initializes sysDescr pointers.\n *\n * @param str if non-NULL then copy str pointer\n * @param len points to string length, excluding zero terminator\n */\nvoid\nsnmp_mib2_set_sysdescr(const u8_t *str, const u16_t *len)\n{\n  if (str != NULL) {\n    sysdescr     = str;\n    sysdescr_len = len;\n  }\n}\n\n/**\n * @ingroup snmp_mib2\n * Initializes sysContact pointers\n *\n * @param ocstr if non-NULL then copy str pointer\n * @param ocstrlen points to string length, excluding zero terminator.\n *        if set to NULL it is assumed that ocstr is NULL-terminated.\n * @param bufsize size of the buffer in bytes.\n *        (this is required because the buffer can be overwritten by snmp-set)\n *        if ocstrlen is NULL buffer needs space for terminating 0 byte.\n *        otherwise complete buffer is used for string.\n *        if bufsize is set to 0, the value is regarded as read-only.\n */\nvoid\nsnmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)\n{\n  if (ocstr != NULL) {\n    syscontact         = ocstr;\n    syscontact_wr      = ocstr;\n    syscontact_len     = ocstrlen;\n    syscontact_wr_len  = ocstrlen;\n    syscontact_bufsize = bufsize;\n  }\n}\n\n/**\n * @ingroup snmp_mib2\n * see \\ref snmp_mib2_set_syscontact but set pointer to readonly memory\n */\nvoid\nsnmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen)\n{\n  if (ocstr != NULL) {\n    syscontact         = ocstr;\n    syscontact_len     = ocstrlen;\n    syscontact_wr      = NULL;\n    syscontact_wr_len  = NULL;\n    syscontact_bufsize = 0;\n  }\n}\n\n\n/**\n * @ingroup snmp_mib2\n * Initializes sysName pointers\n *\n * @param ocstr if non-NULL then copy str pointer\n * @param ocstrlen points to string length, excluding zero terminator.\n *        if set to NULL it is assumed that ocstr is NULL-terminated.\n * @param bufsize size of the buffer in bytes.\n *        (this is required because the buffer can be overwritten by snmp-set)\n *        if ocstrlen is NULL buffer needs space for terminating 0 byte.\n *        otherwise complete buffer is used for string.\n *        if bufsize is set to 0, the value is regarded as read-only.\n */\nvoid\nsnmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)\n{\n  if (ocstr != NULL) {\n    sysname         = ocstr;\n    sysname_wr      = ocstr;\n    sysname_len     = ocstrlen;\n    sysname_wr_len  = ocstrlen;\n    sysname_bufsize = bufsize;\n  }\n}\n\n/**\n * @ingroup snmp_mib2\n * see \\ref snmp_mib2_set_sysname but set pointer to readonly memory\n */\nvoid\nsnmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen)\n{\n  if (ocstr != NULL) {\n    sysname         = ocstr;\n    sysname_len     = ocstrlen;\n    sysname_wr      = NULL;\n    sysname_wr_len  = NULL;\n    sysname_bufsize = 0;\n  }\n}\n\n/**\n * @ingroup snmp_mib2\n * Initializes sysLocation pointers\n *\n * @param ocstr if non-NULL then copy str pointer\n * @param ocstrlen points to string length, excluding zero terminator.\n *        if set to NULL it is assumed that ocstr is NULL-terminated.\n * @param bufsize size of the buffer in bytes.\n *        (this is required because the buffer can be overwritten by snmp-set)\n *        if ocstrlen is NULL buffer needs space for terminating 0 byte.\n *        otherwise complete buffer is used for string.\n *        if bufsize is set to 0, the value is regarded as read-only.\n */\nvoid\nsnmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize)\n{\n  if (ocstr != NULL) {\n    syslocation         = ocstr;\n    syslocation_wr      = ocstr;\n    syslocation_len     = ocstrlen;\n    syslocation_wr_len  = ocstrlen;\n    syslocation_bufsize = bufsize;\n  }\n}\n\n/**\n * @ingroup snmp_mib2\n * see \\ref snmp_mib2_set_syslocation but set pointer to readonly memory\n */\nvoid\nsnmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen)\n{\n  if (ocstr != NULL) {\n    syslocation         = ocstr;\n    syslocation_len     = ocstrlen;\n    syslocation_wr      = NULL;\n    syslocation_wr_len  = NULL;\n    syslocation_bufsize = 0;\n  }\n}\n\n\nstatic s16_t\nsystem_get_value(const struct snmp_scalar_array_node_def *node, void *value)\n{\n  const u8_t*  var = NULL;\n  const s16_t* var_len;\n  u16_t result;\n\n  switch (node->oid) {\n  case 1: /* sysDescr */\n    var     = sysdescr;\n    var_len = (const s16_t*)sysdescr_len;\n    break;\n  case 2: /* sysObjectID */\n    {\n      const struct snmp_obj_id* dev_enterprise_oid = snmp_get_device_enterprise_oid();\n      MEMCPY(value, dev_enterprise_oid->id, dev_enterprise_oid->len * sizeof(u32_t));\n      return dev_enterprise_oid->len * sizeof(u32_t);\n    }\n  case 3: /* sysUpTime */\n    MIB2_COPY_SYSUPTIME_TO((u32_t*)value);\n    return sizeof(u32_t);\n  case 4: /* sysContact */\n    var     = syscontact;\n    var_len = (const s16_t*)syscontact_len;\n    break;\n  case 5: /* sysName */\n    var     = sysname;\n    var_len = (const s16_t*)sysname_len;\n    break;\n  case 6: /* sysLocation */\n    var     = syslocation;\n    var_len = (const s16_t*)syslocation_len;\n    break;\n  case 7: /* sysServices */\n    *(s32_t*)value = SNMP_SYSSERVICES;\n    return sizeof(s32_t);\n  default:\n    LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"system_get_value(): unknown id: %\"S32_F\"\\n\", node->oid));\n    return 0;\n  }\n\n  /* handle string values (OID 1,4,5 and 6) */\n  LWIP_ASSERT(\"\", (value != NULL));\n  if (var_len == NULL) {\n    result = (s16_t)strlen((const char*)var);\n  } else {\n    result = *var_len;\n  }\n  MEMCPY(value, var, result);\n  return result;\n}\n\nstatic snmp_err_t\nsystem_set_test(const struct snmp_scalar_array_node_def *node, u16_t len, void *value)\n{\n  snmp_err_t ret = SNMP_ERR_WRONGVALUE;\n  const u16_t* var_bufsize  = NULL;\n  const u16_t* var_wr_len;\n\n  LWIP_UNUSED_ARG(value);\n\n  switch (node->oid) {\n  case 4: /* sysContact */\n    var_bufsize  = &syscontact_bufsize;\n    var_wr_len   = syscontact_wr_len;\n    break;\n  case 5: /* sysName */\n    var_bufsize  = &sysname_bufsize;\n    var_wr_len   = sysname_wr_len;\n    break;\n  case 6: /* sysLocation */\n    var_bufsize  = &syslocation_bufsize;\n    var_wr_len   = syslocation_wr_len;\n    break;\n  default:\n    LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"system_set_test(): unknown id: %\"S32_F\"\\n\", node->oid));\n    return ret;\n  }\n\n  /* check if value is writable at all */\n  if (*var_bufsize > 0) {\n    if (var_wr_len == NULL) {\n      /* we have to take the terminating 0 into account */\n      if (len < *var_bufsize) {\n        ret = SNMP_ERR_NOERROR;\n      }\n    } else {\n      if (len <= *var_bufsize) {\n        ret = SNMP_ERR_NOERROR;\n      }\n    }\n  } else {\n    ret = SNMP_ERR_NOTWRITABLE;\n  }\n\n  return ret;\n}\n\nstatic snmp_err_t\nsystem_set_value(const struct snmp_scalar_array_node_def *node, u16_t len, void *value)\n{\n  u8_t*  var_wr = NULL;\n  u16_t* var_wr_len;\n\n  switch (node->oid) {\n  case 4: /* sysContact */\n    var_wr     = syscontact_wr;\n    var_wr_len = syscontact_wr_len;\n    break;\n  case 5: /* sysName */\n    var_wr     = sysname_wr;\n    var_wr_len = sysname_wr_len;\n    break;\n  case 6: /* sysLocation */\n    var_wr     = syslocation_wr;\n    var_wr_len = syslocation_wr_len;\n    break;\n  default:\n    LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"system_set_value(): unknown id: %\"S32_F\"\\n\", node->oid));\n    return SNMP_ERR_GENERROR;\n  }\n\n  /* no need to check size of target buffer, this was already done in set_test method */\n  LWIP_ASSERT(\"\", var_wr != NULL);\n  MEMCPY(var_wr, value, len);\n  \n  if (var_wr_len == NULL) {\n    /* add terminating 0 */\n    var_wr[len] = 0;\n  } else {\n    *var_wr_len = len;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic const struct snmp_scalar_array_node_def system_nodes[] = {\n  {1, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_ONLY},  /* sysDescr */\n  {2, SNMP_ASN1_TYPE_OBJECT_ID,    SNMP_NODE_INSTANCE_READ_ONLY},  /* sysObjectID */\n  {3, SNMP_ASN1_TYPE_TIMETICKS,    SNMP_NODE_INSTANCE_READ_ONLY},  /* sysUpTime */\n  {4, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE}, /* sysContact */\n  {5, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE}, /* sysName */\n  {6, SNMP_ASN1_TYPE_OCTET_STRING, SNMP_NODE_INSTANCE_READ_WRITE}, /* sysLocation */\n  {7, SNMP_ASN1_TYPE_INTEGER,      SNMP_NODE_INSTANCE_READ_ONLY}   /* sysServices */\n};\n\nconst struct snmp_scalar_array_node snmp_mib2_system_node = SNMP_SCALAR_CREATE_ARRAY_NODE(1, system_nodes, system_get_value, system_set_test, system_set_value);\n\n#endif /* LWIP_SNMP && SNMP_LWIP_MIB2 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_mib2_tcp.c",
    "content": "/**\n * @file\n * Management Information Base II (RFC1213) TCP objects and functions.\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *         Christiaan Simons <christiaan.simons@axon.tv>\n */\n\n#include \"lwip/snmp.h\"\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/apps/snmp_mib2.h\"\n#include \"lwip/apps/snmp_table.h\"\n#include \"lwip/apps/snmp_scalar.h\"\n#include \"lwip/tcp.h\"\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/stats.h\"\n\n#include <string.h>\n\n#if LWIP_SNMP && SNMP_LWIP_MIB2 && LWIP_TCP\n\n#if SNMP_USE_NETCONN\n#define SYNC_NODE_NAME(node_name) node_name ## _synced\n#define CREATE_LWIP_SYNC_NODE(oid, node_name) \\\n   static const struct snmp_threadsync_node node_name ## _synced = SNMP_CREATE_THREAD_SYNC_NODE(oid, &node_name.node, &snmp_mib2_lwip_locks);\n#else\n#define SYNC_NODE_NAME(node_name) node_name\n#define CREATE_LWIP_SYNC_NODE(oid, node_name)\n#endif\n\n/* --- tcp .1.3.6.1.2.1.6 ----------------------------------------------------- */\n\nstatic s16_t\ntcp_get_value(struct snmp_node_instance* instance, void* value)\n{\n  u32_t *uint_ptr = (u32_t*)value;\n  s32_t *sint_ptr = (s32_t*)value;\n\n  switch (instance->node->oid) {\n  case 1: /* tcpRtoAlgorithm, vanj(4) */\n    *sint_ptr = 4;\n    return sizeof(*sint_ptr);\n  case 2: /* tcpRtoMin */\n    /* @todo not the actual value, a guess,\n        needs to be calculated */\n    *sint_ptr = 1000;\n    return sizeof(*sint_ptr);\n  case 3: /* tcpRtoMax */\n    /* @todo not the actual value, a guess,\n        needs to be calculated */\n    *sint_ptr = 60000;\n    return sizeof(*sint_ptr);\n  case 4: /* tcpMaxConn */\n    *sint_ptr = MEMP_NUM_TCP_PCB;\n    return sizeof(*sint_ptr);\n  case 5: /* tcpActiveOpens */\n    *uint_ptr = STATS_GET(mib2.tcpactiveopens);\n    return sizeof(*uint_ptr);\n  case 6: /* tcpPassiveOpens */\n    *uint_ptr = STATS_GET(mib2.tcppassiveopens);\n    return sizeof(*uint_ptr);\n  case 7: /* tcpAttemptFails */\n    *uint_ptr = STATS_GET(mib2.tcpattemptfails);\n    return sizeof(*uint_ptr);\n  case 8: /* tcpEstabResets */\n    *uint_ptr = STATS_GET(mib2.tcpestabresets);\n    return sizeof(*uint_ptr);\n  case 9: /* tcpCurrEstab */\n    {\n      u16_t tcpcurrestab = 0;\n      struct tcp_pcb *pcb = tcp_active_pcbs;\n      while (pcb != NULL) {\n        if ((pcb->state == ESTABLISHED) ||\n            (pcb->state == CLOSE_WAIT)) {\n          tcpcurrestab++;\n        }\n        pcb = pcb->next;\n      }\n      *uint_ptr = tcpcurrestab;\n    }\n    return sizeof(*uint_ptr);\n  case 10: /* tcpInSegs */\n    *uint_ptr = STATS_GET(mib2.tcpinsegs);\n    return sizeof(*uint_ptr);\n  case 11: /* tcpOutSegs */\n    *uint_ptr = STATS_GET(mib2.tcpoutsegs);\n    return sizeof(*uint_ptr);\n  case 12: /* tcpRetransSegs */\n    *uint_ptr = STATS_GET(mib2.tcpretranssegs);\n    return sizeof(*uint_ptr);\n  case 14: /* tcpInErrs */\n    *uint_ptr = STATS_GET(mib2.tcpinerrs);\n    return sizeof(*uint_ptr);\n  case 15: /* tcpOutRsts */\n    *uint_ptr = STATS_GET(mib2.tcpoutrsts);\n    return sizeof(*uint_ptr);\n  case 17: /* tcpHCInSegs */\n    memset(value, 0, 2*sizeof(u32_t)); /* not supported */\n    return 2*sizeof(u32_t);\n  case 18: /* tcpHCOutSegs */\n    memset(value, 0, 2*sizeof(u32_t)); /* not supported */\n    return 2*sizeof(u32_t);\n  default:\n    LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"tcp_get_value(): unknown id: %\"S32_F\"\\n\", instance->node->oid));\n    break;\n  }\n\n  return 0;\n}\n\n/* --- tcpConnTable --- */\n\n#if LWIP_IPV4\n\n/* list of allowed value ranges for incoming OID */\nstatic const struct snmp_oid_range tcp_ConnTable_oid_ranges[] = {\n  { 0, 0xff   }, /* IP A */\n  { 0, 0xff   }, /* IP B */\n  { 0, 0xff   }, /* IP C */\n  { 0, 0xff   }, /* IP D */\n  { 0, 0xffff }, /* Port */\n  { 0, 0xff   }, /* IP A */\n  { 0, 0xff   }, /* IP B */\n  { 0, 0xff   }, /* IP C */\n  { 0, 0xff   }, /* IP D */\n  { 0, 0xffff }  /* Port */\n};\n\nstatic snmp_err_t\ntcp_ConnTable_get_cell_value_core(struct tcp_pcb *pcb, const u32_t* column, union snmp_variant_value* value, u32_t* value_len)\n{\n  LWIP_UNUSED_ARG(value_len);\n\n  /* value */\n  switch (*column) {\n  case 1: /* tcpConnState */\n    value->u32 = pcb->state + 1;\n    break;\n  case 2: /* tcpConnLocalAddress */\n    value->u32 = ip_2_ip4(&pcb->local_ip)->addr;\n    break;\n  case 3: /* tcpConnLocalPort */\n    value->u32 = pcb->local_port;\n    break;\n  case 4: /* tcpConnRemAddress */\n    if (pcb->state == LISTEN) {\n      value->u32 = IP4_ADDR_ANY4->addr;\n    } else {\n      value->u32 = ip_2_ip4(&pcb->remote_ip)->addr;\n    }\n    break;\n  case 5: /* tcpConnRemPort */\n    if (pcb->state == LISTEN) {\n      value->u32 = 0;\n    } else {\n      value->u32 = pcb->remote_port;\n    }\n    break;\n  default:\n    LWIP_ASSERT(\"invalid id\", 0);\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic snmp_err_t\ntcp_ConnTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)\n{\n  u8_t i;\n  ip4_addr_t local_ip;\n  ip4_addr_t remote_ip;\n  u16_t local_port;\n  u16_t remote_port;\n  struct tcp_pcb *pcb;\n\n  /* check if incoming OID length and if values are in plausible range */\n  if (!snmp_oid_in_range(row_oid, row_oid_len, tcp_ConnTable_oid_ranges, LWIP_ARRAYSIZE(tcp_ConnTable_oid_ranges))) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* get IPs and ports from incoming OID */\n  snmp_oid_to_ip4(&row_oid[0], &local_ip); /* we know it succeeds because of oid_in_range check above */\n  local_port = (u16_t)row_oid[4];\n  snmp_oid_to_ip4(&row_oid[5], &remote_ip); /* we know it succeeds because of oid_in_range check above */\n  remote_port = (u16_t)row_oid[9];\n\n  /* find tcp_pcb with requested ips and ports */\n  for (i = 0; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) {\n    pcb = *tcp_pcb_lists[i];\n\n    while (pcb != NULL) {\n      /* do local IP and local port match? */\n      if (IP_IS_V4_VAL(pcb->local_ip) &&\n         ip4_addr_cmp(&local_ip, ip_2_ip4(&pcb->local_ip)) && (local_port == pcb->local_port)) {\n\n        /* PCBs in state LISTEN are not connected and have no remote_ip or remote_port */\n        if (pcb->state == LISTEN) {\n          if (ip4_addr_cmp(&remote_ip, IP4_ADDR_ANY4) && (remote_port == 0)) {\n            /* fill in object properties */\n            return tcp_ConnTable_get_cell_value_core(pcb, column, value, value_len);\n          }\n        } else {\n          if (IP_IS_V4_VAL(pcb->remote_ip) &&\n             ip4_addr_cmp(&remote_ip, ip_2_ip4(&pcb->remote_ip)) && (remote_port == pcb->remote_port)) {\n            /* fill in object properties */\n            return tcp_ConnTable_get_cell_value_core(pcb, column, value, value_len);\n          }\n        }\n      }\n\n      pcb = pcb->next;\n    }\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nstatic snmp_err_t\ntcp_ConnTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)\n{\n  u8_t i;\n  struct tcp_pcb *pcb;\n  struct snmp_next_oid_state state;\n  u32_t result_temp[LWIP_ARRAYSIZE(tcp_ConnTable_oid_ranges)];\n\n  /* init struct to search next oid */\n  snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(tcp_ConnTable_oid_ranges));\n\n  /* iterate over all possible OIDs to find the next one */\n  for (i = 0; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) {\n    pcb = *tcp_pcb_lists[i];\n    while (pcb != NULL) {\n      u32_t test_oid[LWIP_ARRAYSIZE(tcp_ConnTable_oid_ranges)];\n\n      if (IP_IS_V4_VAL(pcb->local_ip)) {\n        snmp_ip4_to_oid(ip_2_ip4(&pcb->local_ip), &test_oid[0]);\n        test_oid[4] = pcb->local_port;\n\n        /* PCBs in state LISTEN are not connected and have no remote_ip or remote_port */\n        if (pcb->state == LISTEN) {\n          snmp_ip4_to_oid(IP4_ADDR_ANY4, &test_oid[5]);\n          test_oid[9] = 0;\n        } else {\n          if (IP_IS_V6_VAL(pcb->remote_ip)) { /* should never happen */\n            continue;\n          }\n          snmp_ip4_to_oid(ip_2_ip4(&pcb->remote_ip), &test_oid[5]);\n          test_oid[9] = pcb->remote_port;\n        }\n\n        /* check generated OID: is it a candidate for the next one? */\n        snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(tcp_ConnTable_oid_ranges), pcb);\n      }\n\n      pcb = pcb->next;\n    }\n  }\n\n  /* did we find a next one? */\n  if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {\n    snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n    /* fill in object properties */\n    return tcp_ConnTable_get_cell_value_core((struct tcp_pcb*)state.reference, column, value, value_len);\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\n#endif /* LWIP_IPV4 */\n\n/* --- tcpConnectionTable --- */\n\nstatic snmp_err_t\ntcp_ConnectionTable_get_cell_value_core(const u32_t* column, struct tcp_pcb *pcb, union snmp_variant_value* value)\n{\n  /* all items except tcpConnectionState and tcpConnectionProcess are declared as not-accessible */\n  switch (*column) {\n  case 7: /* tcpConnectionState */\n    value->u32 = pcb->state + 1;\n    break;\n  case 8: /* tcpConnectionProcess */\n    value->u32 = 0; /* not supported */\n    break;\n  default:\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic snmp_err_t\ntcp_ConnectionTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)\n{\n  ip_addr_t local_ip, remote_ip;\n  u16_t local_port, remote_port;\n  struct tcp_pcb *pcb;\n  u8_t idx = 0;\n  u8_t i;\n  struct tcp_pcb ** const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs};\n\n  LWIP_UNUSED_ARG(value_len);\n\n  /* tcpConnectionLocalAddressType + tcpConnectionLocalAddress + tcpConnectionLocalPort */\n  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &local_ip, &local_port);\n  if (idx == 0) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* tcpConnectionRemAddressType + tcpConnectionRemAddress + tcpConnectionRemPort */\n  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &remote_ip, &remote_port);\n  if (idx == 0) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* find tcp_pcb with requested ip and port*/\n  for (i = 0; i < LWIP_ARRAYSIZE(tcp_pcb_nonlisten_lists); i++) {\n    pcb = *tcp_pcb_nonlisten_lists[i];\n\n    while (pcb != NULL) {\n      if (ip_addr_cmp(&local_ip, &pcb->local_ip) &&\n         (local_port == pcb->local_port) &&\n         ip_addr_cmp(&remote_ip, &pcb->remote_ip) &&\n         (remote_port == pcb->remote_port)) {\n        /* fill in object properties */\n        return tcp_ConnectionTable_get_cell_value_core(column, pcb, value);\n      }\n      pcb = pcb->next;\n    }\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nstatic snmp_err_t\ntcp_ConnectionTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)\n{\n  struct tcp_pcb *pcb;\n  struct snmp_next_oid_state state;\n  /* 1x tcpConnectionLocalAddressType + 1x OID len + 16x tcpConnectionLocalAddress  + 1x tcpConnectionLocalPort\n   * 1x tcpConnectionRemAddressType   + 1x OID len + 16x tcpConnectionRemAddress    + 1x tcpConnectionRemPort */\n  u32_t  result_temp[38];\n  u8_t i;\n  struct tcp_pcb ** const tcp_pcb_nonlisten_lists[] = {&tcp_bound_pcbs, &tcp_active_pcbs, &tcp_tw_pcbs};\n\n  LWIP_UNUSED_ARG(value_len);\n\n  /* init struct to search next oid */\n  snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(result_temp));\n\n  /* iterate over all possible OIDs to find the next one */\n  for (i = 0; i < LWIP_ARRAYSIZE(tcp_pcb_nonlisten_lists); i++) {\n    pcb = *tcp_pcb_nonlisten_lists[i];\n\n    while (pcb != NULL) {\n      u8_t idx = 0;\n      u32_t test_oid[LWIP_ARRAYSIZE(result_temp)];\n\n      /* tcpConnectionLocalAddressType + tcpConnectionLocalAddress + tcpConnectionLocalPort */\n      idx += snmp_ip_port_to_oid(&pcb->local_ip, pcb->local_port, &test_oid[idx]);\n\n      /* tcpConnectionRemAddressType + tcpConnectionRemAddress + tcpConnectionRemPort */\n      idx += snmp_ip_port_to_oid(&pcb->remote_ip, pcb->remote_port, &test_oid[idx]);\n\n      /* check generated OID: is it a candidate for the next one? */\n      snmp_next_oid_check(&state, test_oid, idx, pcb);\n\n      pcb = pcb->next;\n    }\n  }\n\n  /* did we find a next one? */\n  if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {\n    snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n    /* fill in object properties */\n    return tcp_ConnectionTable_get_cell_value_core(column, (struct tcp_pcb*)state.reference, value);\n  } else {\n    /* not found */\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n}\n\n/* --- tcpListenerTable --- */\n\nstatic snmp_err_t\ntcp_ListenerTable_get_cell_value_core(const u32_t* column, union snmp_variant_value* value)\n{\n  /* all items except tcpListenerProcess are declared as not-accessible */\n  switch (*column) {\n  case 4: /* tcpListenerProcess */\n    value->u32 = 0; /* not supported */\n    break;\n  default:\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic snmp_err_t\ntcp_ListenerTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)\n{\n  ip_addr_t local_ip;\n  u16_t local_port;\n  struct tcp_pcb_listen *pcb;\n  u8_t idx = 0;\n\n  LWIP_UNUSED_ARG(value_len);\n\n  /* tcpListenerLocalAddressType + tcpListenerLocalAddress + tcpListenerLocalPort */\n  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &local_ip, &local_port);\n  if (idx == 0) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* find tcp_pcb with requested ip and port*/\n  pcb = tcp_listen_pcbs.listen_pcbs;\n  while (pcb != NULL) {\n    if (ip_addr_cmp(&local_ip, &pcb->local_ip) &&\n       (local_port == pcb->local_port)) {\n      /* fill in object properties */\n      return tcp_ListenerTable_get_cell_value_core(column, value);\n    }\n    pcb = pcb->next;\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nstatic snmp_err_t\ntcp_ListenerTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)\n{\n  struct tcp_pcb_listen *pcb;\n  struct snmp_next_oid_state state;\n  /* 1x tcpListenerLocalAddressType + 1x OID len + 16x tcpListenerLocalAddress  + 1x tcpListenerLocalPort */\n  u32_t  result_temp[19];\n\n  LWIP_UNUSED_ARG(value_len);\n\n  /* init struct to search next oid */\n  snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(result_temp));\n\n  /* iterate over all possible OIDs to find the next one */\n  pcb = tcp_listen_pcbs.listen_pcbs;\n  while (pcb != NULL) {\n    u8_t idx = 0;\n    u32_t test_oid[LWIP_ARRAYSIZE(result_temp)];\n\n    /* tcpListenerLocalAddressType + tcpListenerLocalAddress + tcpListenerLocalPort */\n    idx += snmp_ip_port_to_oid(&pcb->local_ip, pcb->local_port, &test_oid[idx]);\n\n    /* check generated OID: is it a candidate for the next one? */\n    snmp_next_oid_check(&state, test_oid, idx, NULL);\n\n    pcb = pcb->next;\n  }\n\n  /* did we find a next one? */\n  if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {\n    snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n    /* fill in object properties */\n    return tcp_ListenerTable_get_cell_value_core(column, value);\n  } else {\n    /* not found */\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n}\n\nstatic const struct snmp_scalar_node tcp_RtoAlgorithm  = SNMP_SCALAR_CREATE_NODE_READONLY(1, SNMP_ASN1_TYPE_INTEGER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_RtoMin        = SNMP_SCALAR_CREATE_NODE_READONLY(2, SNMP_ASN1_TYPE_INTEGER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_RtoMax        = SNMP_SCALAR_CREATE_NODE_READONLY(3, SNMP_ASN1_TYPE_INTEGER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_MaxConn       = SNMP_SCALAR_CREATE_NODE_READONLY(4, SNMP_ASN1_TYPE_INTEGER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_ActiveOpens   = SNMP_SCALAR_CREATE_NODE_READONLY(5, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_PassiveOpens  = SNMP_SCALAR_CREATE_NODE_READONLY(6, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_AttemptFails  = SNMP_SCALAR_CREATE_NODE_READONLY(7, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_EstabResets   = SNMP_SCALAR_CREATE_NODE_READONLY(8, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_CurrEstab     = SNMP_SCALAR_CREATE_NODE_READONLY(9, SNMP_ASN1_TYPE_GAUGE, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_InSegs        = SNMP_SCALAR_CREATE_NODE_READONLY(10, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_OutSegs       = SNMP_SCALAR_CREATE_NODE_READONLY(11, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_RetransSegs   = SNMP_SCALAR_CREATE_NODE_READONLY(12, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_InErrs        = SNMP_SCALAR_CREATE_NODE_READONLY(14, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_OutRsts       = SNMP_SCALAR_CREATE_NODE_READONLY(15, SNMP_ASN1_TYPE_COUNTER, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_HCInSegs      = SNMP_SCALAR_CREATE_NODE_READONLY(17, SNMP_ASN1_TYPE_COUNTER64, tcp_get_value);\nstatic const struct snmp_scalar_node tcp_HCOutSegs     = SNMP_SCALAR_CREATE_NODE_READONLY(18, SNMP_ASN1_TYPE_COUNTER64, tcp_get_value);\n\n#if LWIP_IPV4\nstatic const struct snmp_table_simple_col_def tcp_ConnTable_columns[] = {\n  {  1, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 }, /* tcpConnState */\n  {  2, SNMP_ASN1_TYPE_IPADDR,  SNMP_VARIANT_VALUE_TYPE_U32 }, /* tcpConnLocalAddress */\n  {  3, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 }, /* tcpConnLocalPort */\n  {  4, SNMP_ASN1_TYPE_IPADDR,  SNMP_VARIANT_VALUE_TYPE_U32 }, /* tcpConnRemAddress */\n  {  5, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 }  /* tcpConnRemPort */\n};\n\nstatic const struct snmp_table_simple_node tcp_ConnTable = SNMP_TABLE_CREATE_SIMPLE(13, tcp_ConnTable_columns, tcp_ConnTable_get_cell_value, tcp_ConnTable_get_next_cell_instance_and_value);\n#endif /* LWIP_IPV4 */\n\nstatic const struct snmp_table_simple_col_def tcp_ConnectionTable_columns[] = {\n  /* all items except tcpConnectionState and tcpConnectionProcess are declared as not-accessible */\n  { 7, SNMP_ASN1_TYPE_INTEGER,    SNMP_VARIANT_VALUE_TYPE_U32 }, /* tcpConnectionState */\n  { 8, SNMP_ASN1_TYPE_UNSIGNED32, SNMP_VARIANT_VALUE_TYPE_U32 }  /* tcpConnectionProcess */\n};\n\nstatic const struct snmp_table_simple_node tcp_ConnectionTable = SNMP_TABLE_CREATE_SIMPLE(19, tcp_ConnectionTable_columns, tcp_ConnectionTable_get_cell_value, tcp_ConnectionTable_get_next_cell_instance_and_value);\n\n\nstatic const struct snmp_table_simple_col_def tcp_ListenerTable_columns[] = {\n  /* all items except tcpListenerProcess are declared as not-accessible */\n  { 4, SNMP_ASN1_TYPE_UNSIGNED32, SNMP_VARIANT_VALUE_TYPE_U32 }  /* tcpListenerProcess */\n};\n\nstatic const struct snmp_table_simple_node tcp_ListenerTable = SNMP_TABLE_CREATE_SIMPLE(20, tcp_ListenerTable_columns, tcp_ListenerTable_get_cell_value, tcp_ListenerTable_get_next_cell_instance_and_value);\n\n/* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */\nCREATE_LWIP_SYNC_NODE( 1, tcp_RtoAlgorithm)\nCREATE_LWIP_SYNC_NODE( 2, tcp_RtoMin)\nCREATE_LWIP_SYNC_NODE( 3, tcp_RtoMax)\nCREATE_LWIP_SYNC_NODE( 4, tcp_MaxConn)\nCREATE_LWIP_SYNC_NODE( 5, tcp_ActiveOpens)\nCREATE_LWIP_SYNC_NODE( 6, tcp_PassiveOpens)\nCREATE_LWIP_SYNC_NODE( 7, tcp_AttemptFails)\nCREATE_LWIP_SYNC_NODE( 8, tcp_EstabResets)\nCREATE_LWIP_SYNC_NODE( 9, tcp_CurrEstab)\nCREATE_LWIP_SYNC_NODE(10, tcp_InSegs)\nCREATE_LWIP_SYNC_NODE(11, tcp_OutSegs)\nCREATE_LWIP_SYNC_NODE(12, tcp_RetransSegs)\n#if LWIP_IPV4\nCREATE_LWIP_SYNC_NODE(13, tcp_ConnTable)\n#endif /* LWIP_IPV4 */\nCREATE_LWIP_SYNC_NODE(14, tcp_InErrs)\nCREATE_LWIP_SYNC_NODE(15, tcp_OutRsts)\nCREATE_LWIP_SYNC_NODE(17, tcp_HCInSegs)\nCREATE_LWIP_SYNC_NODE(18, tcp_HCOutSegs)\nCREATE_LWIP_SYNC_NODE(19, tcp_ConnectionTable)\nCREATE_LWIP_SYNC_NODE(20, tcp_ListenerTable)\n\nstatic const struct snmp_node* const tcp_nodes[] = {\n  &SYNC_NODE_NAME(tcp_RtoAlgorithm).node.node,\n  &SYNC_NODE_NAME(tcp_RtoMin).node.node,\n  &SYNC_NODE_NAME(tcp_RtoMax).node.node,\n  &SYNC_NODE_NAME(tcp_MaxConn).node.node,\n  &SYNC_NODE_NAME(tcp_ActiveOpens).node.node,\n  &SYNC_NODE_NAME(tcp_PassiveOpens).node.node,\n  &SYNC_NODE_NAME(tcp_AttemptFails).node.node,\n  &SYNC_NODE_NAME(tcp_EstabResets).node.node,\n  &SYNC_NODE_NAME(tcp_CurrEstab).node.node,\n  &SYNC_NODE_NAME(tcp_InSegs).node.node,\n  &SYNC_NODE_NAME(tcp_OutSegs).node.node,\n  &SYNC_NODE_NAME(tcp_RetransSegs).node.node,\n#if LWIP_IPV4\n  &SYNC_NODE_NAME(tcp_ConnTable).node.node,\n#endif /* LWIP_IPV4 */\n  &SYNC_NODE_NAME(tcp_InErrs).node.node,\n  &SYNC_NODE_NAME(tcp_OutRsts).node.node,\n  &SYNC_NODE_NAME(tcp_HCInSegs).node.node,\n  &SYNC_NODE_NAME(tcp_HCOutSegs).node.node,\n  &SYNC_NODE_NAME(tcp_ConnectionTable).node.node,\n  &SYNC_NODE_NAME(tcp_ListenerTable).node.node\n};\n\nconst struct snmp_tree_node snmp_mib2_tcp_root = SNMP_CREATE_TREE_NODE(6, tcp_nodes);\n#endif /* LWIP_SNMP && SNMP_LWIP_MIB2 && LWIP_TCP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_mib2_udp.c",
    "content": "/**\n * @file\n * Management Information Base II (RFC1213) UDP objects and functions.\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *         Christiaan Simons <christiaan.simons@axon.tv>\n */\n\n#include \"lwip/snmp.h\"\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/apps/snmp_mib2.h\"\n#include \"lwip/apps/snmp_table.h\"\n#include \"lwip/apps/snmp_scalar.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/stats.h\"\n\n#include <string.h>\n\n#if LWIP_SNMP && SNMP_LWIP_MIB2 && LWIP_UDP\n\n#if SNMP_USE_NETCONN\n#define SYNC_NODE_NAME(node_name) node_name ## _synced\n#define CREATE_LWIP_SYNC_NODE(oid, node_name) \\\n   static const struct snmp_threadsync_node node_name ## _synced = SNMP_CREATE_THREAD_SYNC_NODE(oid, &node_name.node, &snmp_mib2_lwip_locks);\n#else\n#define SYNC_NODE_NAME(node_name) node_name\n#define CREATE_LWIP_SYNC_NODE(oid, node_name)\n#endif\n\n/* --- udp .1.3.6.1.2.1.7 ----------------------------------------------------- */\n\nstatic s16_t\nudp_get_value(struct snmp_node_instance* instance, void* value)\n{\n  u32_t *uint_ptr = (u32_t*)value;\n\n  switch (instance->node->oid) {\n  case 1: /* udpInDatagrams */\n    *uint_ptr = STATS_GET(mib2.udpindatagrams);\n    return sizeof(*uint_ptr);\n  case 2: /* udpNoPorts */\n    *uint_ptr = STATS_GET(mib2.udpnoports);\n    return sizeof(*uint_ptr);\n  case 3: /* udpInErrors */\n    *uint_ptr = STATS_GET(mib2.udpinerrors);\n    return sizeof(*uint_ptr);\n  case 4: /* udpOutDatagrams */\n    *uint_ptr = STATS_GET(mib2.udpoutdatagrams);\n    return sizeof(*uint_ptr);\n  case 8: /* udpHCInDatagrams */\n    memset(value, 0, 2*sizeof(u32_t)); /* not supported */\n    return 2*sizeof(u32_t);\n  case 9: /* udpHCOutDatagrams */\n    memset(value, 0, 2*sizeof(u32_t)); /* not supported */\n    return 2*sizeof(u32_t);\n  default:\n    LWIP_DEBUGF(SNMP_MIB_DEBUG,(\"udp_get_value(): unknown id: %\"S32_F\"\\n\", instance->node->oid));\n    break;\n  }\n\n  return 0;\n}\n\n/* --- udpEndpointTable --- */\n\nstatic snmp_err_t\nudp_endpointTable_get_cell_value_core(const u32_t* column, union snmp_variant_value* value)\n{\n  /* all items except udpEndpointProcess are declared as not-accessible */\n  switch (*column) {\n  case 8: /* udpEndpointProcess */\n    value->u32 = 0; /* not supported */\n    break;\n  default:\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic snmp_err_t\nudp_endpointTable_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)\n{\n  ip_addr_t local_ip, remote_ip;\n  u16_t local_port, remote_port;\n  struct udp_pcb *pcb;\n  u8_t idx = 0;\n\n  LWIP_UNUSED_ARG(value_len);\n\n  /* udpEndpointLocalAddressType + udpEndpointLocalAddress + udpEndpointLocalPort */\n  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &local_ip, &local_port);\n  if (idx == 0) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* udpEndpointRemoteAddressType + udpEndpointRemoteAddress + udpEndpointRemotePort */\n  idx += snmp_oid_to_ip_port(&row_oid[idx], row_oid_len-idx, &remote_ip, &remote_port);\n  if (idx == 0) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* udpEndpointInstance */\n  if (row_oid_len < (idx+1)) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n  if (row_oid[idx] != 0) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n  \n  /* find udp_pcb with requested ip and port*/\n  pcb = udp_pcbs;\n  while (pcb != NULL) {\n    if (ip_addr_cmp(&local_ip, &pcb->local_ip) &&\n       (local_port == pcb->local_port) &&\n       ip_addr_cmp(&remote_ip, &pcb->remote_ip) &&\n       (remote_port == pcb->remote_port)) {\n      /* fill in object properties */\n      return udp_endpointTable_get_cell_value_core(column, value);\n    }\n    pcb = pcb->next;\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nstatic snmp_err_t \nudp_endpointTable_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)\n{\n  struct udp_pcb *pcb;\n  struct snmp_next_oid_state state;\n  /* 1x udpEndpointLocalAddressType  + 1x OID len + 16x udpEndpointLocalAddress  + 1x udpEndpointLocalPort  +\n   * 1x udpEndpointRemoteAddressType + 1x OID len + 16x udpEndpointRemoteAddress + 1x udpEndpointRemotePort +\n   * 1x udpEndpointInstance = 39\n   */\n  u32_t  result_temp[39];\n\n  LWIP_UNUSED_ARG(value_len);\n\n  /* init struct to search next oid */\n  snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(result_temp));\n\n  /* iterate over all possible OIDs to find the next one */\n  pcb = udp_pcbs;\n  while (pcb != NULL) {\n    u32_t test_oid[LWIP_ARRAYSIZE(result_temp)];\n    u8_t idx = 0;\n\n    /* udpEndpointLocalAddressType + udpEndpointLocalAddress + udpEndpointLocalPort */\n    idx += snmp_ip_port_to_oid(&pcb->local_ip, pcb->local_port, &test_oid[idx]);\n\n    /* udpEndpointRemoteAddressType + udpEndpointRemoteAddress + udpEndpointRemotePort */\n    idx += snmp_ip_port_to_oid(&pcb->remote_ip, pcb->remote_port, &test_oid[idx]);\n\n    test_oid[idx] = 0; /* udpEndpointInstance */    \n    idx++;\n    \n    /* check generated OID: is it a candidate for the next one? */\n    snmp_next_oid_check(&state, test_oid, idx, NULL);\n    \n    pcb = pcb->next;\n  }\n\n  /* did we find a next one? */\n  if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {\n    snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n    /* fill in object properties */\n    return udp_endpointTable_get_cell_value_core(column, value);\n  } else {\n    /* not found */\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n}\n\n/* --- udpTable --- */\n\n#if LWIP_IPV4\n\n/* list of allowed value ranges for incoming OID */\nstatic const struct snmp_oid_range udp_Table_oid_ranges[] = {\n  { 0, 0xff   }, /* IP A        */\n  { 0, 0xff   }, /* IP B        */\n  { 0, 0xff   }, /* IP C        */\n  { 0, 0xff   }, /* IP D        */\n  { 1, 0xffff }  /* Port        */\n};\n\nstatic snmp_err_t \nudp_Table_get_cell_value_core(struct udp_pcb *pcb, const u32_t* column, union snmp_variant_value* value, u32_t* value_len)\n{\n  LWIP_UNUSED_ARG(value_len);\n\n  switch (*column) {\n  case 1: /* udpLocalAddress */\n    /* set reference to PCB local IP and return a generic node that copies IP4 addresses */\n    value->u32 = ip_2_ip4(&pcb->local_ip)->addr;\n    break;\n  case 2: /* udpLocalPort */\n    /* set reference to PCB local port and return a generic node that copies u16_t values */\n    value->u32 = pcb->local_port;\n    break;\n  default:\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic snmp_err_t \nudp_Table_get_cell_value(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len)\n{\n  ip4_addr_t ip;\n  u16_t port;\n  struct udp_pcb *pcb;\n\n  /* check if incoming OID length and if values are in plausible range */\n  if (!snmp_oid_in_range(row_oid, row_oid_len, udp_Table_oid_ranges, LWIP_ARRAYSIZE(udp_Table_oid_ranges))) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  /* get IP and port from incoming OID */\n  snmp_oid_to_ip4(&row_oid[0], &ip); /* we know it succeeds because of oid_in_range check above */\n  port = (u16_t)row_oid[4];\n\n  /* find udp_pcb with requested ip and port*/\n  pcb = udp_pcbs;\n  while (pcb != NULL) {\n    if (IP_IS_V4_VAL(pcb->local_ip)) {\n      if (ip4_addr_cmp(&ip, ip_2_ip4(&pcb->local_ip)) && (port == pcb->local_port)) {\n        /* fill in object properties */\n        return udp_Table_get_cell_value_core(pcb, column, value, value_len);\n      }\n    }\n    pcb = pcb->next;\n  }\n\n  /* not found */\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nstatic snmp_err_t \nudp_Table_get_next_cell_instance_and_value(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len)\n{\n  struct udp_pcb *pcb;\n  struct snmp_next_oid_state state;\n  u32_t  result_temp[LWIP_ARRAYSIZE(udp_Table_oid_ranges)];\n\n  /* init struct to search next oid */\n  snmp_next_oid_init(&state, row_oid->id, row_oid->len, result_temp, LWIP_ARRAYSIZE(udp_Table_oid_ranges));\n\n  /* iterate over all possible OIDs to find the next one */\n  pcb = udp_pcbs;\n  while (pcb != NULL) {\n    u32_t test_oid[LWIP_ARRAYSIZE(udp_Table_oid_ranges)];\n\n    if (IP_IS_V4_VAL(pcb->local_ip)) {\n      snmp_ip4_to_oid(ip_2_ip4(&pcb->local_ip), &test_oid[0]);\n      test_oid[4] = pcb->local_port;\n\n      /* check generated OID: is it a candidate for the next one? */\n      snmp_next_oid_check(&state, test_oid, LWIP_ARRAYSIZE(udp_Table_oid_ranges), pcb);\n    }\n    \n    pcb = pcb->next;\n  }\n\n  /* did we find a next one? */\n  if (state.status == SNMP_NEXT_OID_STATUS_SUCCESS) {\n    snmp_oid_assign(row_oid, state.next_oid, state.next_oid_len);\n    /* fill in object properties */\n    return udp_Table_get_cell_value_core((struct udp_pcb*)state.reference, column, value, value_len);\n  } else {\n    /* not found */\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n}\n\n#endif /* LWIP_IPV4 */\n\nstatic const struct snmp_scalar_node udp_inDatagrams    = SNMP_SCALAR_CREATE_NODE_READONLY(1, SNMP_ASN1_TYPE_COUNTER,   udp_get_value);\nstatic const struct snmp_scalar_node udp_noPorts        = SNMP_SCALAR_CREATE_NODE_READONLY(2, SNMP_ASN1_TYPE_COUNTER,   udp_get_value);\nstatic const struct snmp_scalar_node udp_inErrors       = SNMP_SCALAR_CREATE_NODE_READONLY(3, SNMP_ASN1_TYPE_COUNTER,   udp_get_value);\nstatic const struct snmp_scalar_node udp_outDatagrams   = SNMP_SCALAR_CREATE_NODE_READONLY(4, SNMP_ASN1_TYPE_COUNTER,   udp_get_value);\nstatic const struct snmp_scalar_node udp_HCInDatagrams  = SNMP_SCALAR_CREATE_NODE_READONLY(8, SNMP_ASN1_TYPE_COUNTER64, udp_get_value);\nstatic const struct snmp_scalar_node udp_HCOutDatagrams = SNMP_SCALAR_CREATE_NODE_READONLY(9, SNMP_ASN1_TYPE_COUNTER64, udp_get_value);\n\n#if LWIP_IPV4\nstatic const struct snmp_table_simple_col_def udp_Table_columns[] = {\n  { 1, SNMP_ASN1_TYPE_IPADDR,  SNMP_VARIANT_VALUE_TYPE_U32 }, /* udpLocalAddress */\n  { 2, SNMP_ASN1_TYPE_INTEGER, SNMP_VARIANT_VALUE_TYPE_U32 }  /* udpLocalPort */\n};\nstatic const struct snmp_table_simple_node udp_Table = SNMP_TABLE_CREATE_SIMPLE(5, udp_Table_columns, udp_Table_get_cell_value, udp_Table_get_next_cell_instance_and_value);\n#endif /* LWIP_IPV4 */\n\nstatic const struct snmp_table_simple_col_def udp_endpointTable_columns[] = {\n  /* all items except udpEndpointProcess are declared as not-accessible */   \n  { 8, SNMP_ASN1_TYPE_UNSIGNED32, SNMP_VARIANT_VALUE_TYPE_U32 }  /* udpEndpointProcess */\n};\n\nstatic const struct snmp_table_simple_node udp_endpointTable = SNMP_TABLE_CREATE_SIMPLE(7, udp_endpointTable_columns, udp_endpointTable_get_cell_value, udp_endpointTable_get_next_cell_instance_and_value);\n\n/* the following nodes access variables in LWIP stack from SNMP worker thread and must therefore be synced to LWIP (TCPIP) thread */ \nCREATE_LWIP_SYNC_NODE(1, udp_inDatagrams)\nCREATE_LWIP_SYNC_NODE(2, udp_noPorts)\nCREATE_LWIP_SYNC_NODE(3, udp_inErrors)\nCREATE_LWIP_SYNC_NODE(4, udp_outDatagrams)\n#if LWIP_IPV4\nCREATE_LWIP_SYNC_NODE(5, udp_Table)\n#endif /* LWIP_IPV4 */\nCREATE_LWIP_SYNC_NODE(7, udp_endpointTable)\nCREATE_LWIP_SYNC_NODE(8, udp_HCInDatagrams)\nCREATE_LWIP_SYNC_NODE(9, udp_HCOutDatagrams)\n\nstatic const struct snmp_node* const udp_nodes[] = {\n  &SYNC_NODE_NAME(udp_inDatagrams).node.node,\n  &SYNC_NODE_NAME(udp_noPorts).node.node,\n  &SYNC_NODE_NAME(udp_inErrors).node.node,\n  &SYNC_NODE_NAME(udp_outDatagrams).node.node,\n#if LWIP_IPV4\n  &SYNC_NODE_NAME(udp_Table).node.node,\n#endif /* LWIP_IPV4 */\n  &SYNC_NODE_NAME(udp_endpointTable).node.node,\n  &SYNC_NODE_NAME(udp_HCInDatagrams).node.node,\n  &SYNC_NODE_NAME(udp_HCOutDatagrams).node.node\n};\n\nconst struct snmp_tree_node snmp_mib2_udp_root = SNMP_CREATE_TREE_NODE(7, udp_nodes);\n#endif /* LWIP_SNMP && SNMP_LWIP_MIB2 && LWIP_UDP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_msg.c",
    "content": "/**\n * @file\n * SNMP message processing (RFC1157).\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * Copyright (c) 2016 Elias Oenal.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Christiaan Simons <christiaan.simons@axon.tv>\n *         Martin Hentschel <info@cl-soft.de>\n *         Elias Oenal <lwip@eliasoenal.com>\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"snmp_msg.h\"\n#include \"snmp_asn1.h\"\n#include \"snmp_core_priv.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/stats.h\"\n\n#if LWIP_SNMP_V3\n#include \"lwip/apps/snmpv3.h\"\n#include \"snmpv3_priv.h\"\n#ifdef LWIP_SNMPV3_INCLUDE_ENGINE\n#include LWIP_SNMPV3_INCLUDE_ENGINE\n#endif\n#endif\n\n#include <string.h>\n\n/* public (non-static) constants */\n/** SNMP community string */\nconst char *snmp_community = SNMP_COMMUNITY;\n/** SNMP community string for write access */\nconst char *snmp_community_write = SNMP_COMMUNITY_WRITE;\n/** SNMP community string for sending traps */\nconst char *snmp_community_trap = SNMP_COMMUNITY_TRAP;\n\nsnmp_write_callback_fct snmp_write_callback     = NULL;\nvoid*                   snmp_write_callback_arg = NULL;\n\n/**\n * @ingroup snmp_core\n * Returns current SNMP community string.\n * @return current SNMP community string\n */\nconst char *\nsnmp_get_community(void)\n{\n  return snmp_community;\n}\n\n/**\n * @ingroup snmp_core\n * Sets SNMP community string.\n * The string itself (its storage) must be valid throughout the whole life of\n * program (or until it is changed to sth else).\n *\n * @param community is a pointer to new community string\n */\nvoid\nsnmp_set_community(const char * const community)\n{\n  LWIP_ASSERT(\"community string is too long!\", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN);\n  snmp_community = community;\n}\n\n/**\n * @ingroup snmp_core\n * Returns current SNMP write-access community string.\n * @return current SNMP write-access community string\n */\nconst char *\nsnmp_get_community_write(void)\n{\n  return snmp_community_write;\n}\n\n/**\n * @ingroup snmp_traps\n * Returns current SNMP community string used for sending traps.\n * @return current SNMP community string used for sending traps\n */\nconst char *\nsnmp_get_community_trap(void)\n{\n  return snmp_community_trap;\n}\n\n/**\n * @ingroup snmp_core\n * Sets SNMP community string for write-access.\n * The string itself (its storage) must be valid throughout the whole life of\n * program (or until it is changed to sth else).\n *\n * @param community is a pointer to new write-access community string\n */\nvoid\nsnmp_set_community_write(const char * const community)\n{\n  LWIP_ASSERT(\"community string must not be NULL\", community != NULL);\n  LWIP_ASSERT(\"community string is too long!\", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN);\n  snmp_community_write = community;\n}\n\n/**\n * @ingroup snmp_traps\n * Sets SNMP community string used for sending traps.\n * The string itself (its storage) must be valid throughout the whole life of\n * program (or until it is changed to sth else).\n *\n * @param community is a pointer to new trap community string\n */\nvoid\nsnmp_set_community_trap(const char * const community)\n{\n  LWIP_ASSERT(\"community string is too long!\", strlen(community) <= SNMP_MAX_COMMUNITY_STR_LEN);\n  snmp_community_trap = community;\n}\n\n/**\n * @ingroup snmp_core\n * Callback fired on every successful write access\n */\nvoid \nsnmp_set_write_callback(snmp_write_callback_fct write_callback, void* callback_arg)\n{\n  snmp_write_callback     = write_callback;\n  snmp_write_callback_arg = callback_arg;\n}\n\n/* ----------------------------------------------------------------------- */\n/* forward declarations */\n/* ----------------------------------------------------------------------- */\n\nstatic err_t snmp_process_get_request(struct snmp_request *request);\nstatic err_t snmp_process_getnext_request(struct snmp_request *request);\nstatic err_t snmp_process_getbulk_request(struct snmp_request *request);\nstatic err_t snmp_process_set_request(struct snmp_request *request);\n\nstatic err_t snmp_parse_inbound_frame(struct snmp_request *request);\nstatic err_t snmp_prepare_outbound_frame(struct snmp_request *request);\nstatic err_t snmp_complete_outbound_frame(struct snmp_request *request);\nstatic void snmp_execute_write_callbacks(struct snmp_request *request);\n\n\n/* ----------------------------------------------------------------------- */\n/* implementation */\n/* ----------------------------------------------------------------------- */\n\nvoid\nsnmp_receive(void *handle, struct pbuf *p, const ip_addr_t *source_ip, u16_t port)\n{\n  err_t err;\n  struct snmp_request request;\n   \n  memset(&request, 0, sizeof(request));\n  request.handle       = handle;\n  request.source_ip    = source_ip;\n  request.source_port  = port;\n  request.inbound_pbuf = p;\n\n  snmp_stats.inpkts++;\n\n  err = snmp_parse_inbound_frame(&request);\n  if (err == ERR_OK) {\n    err = snmp_prepare_outbound_frame(&request);\n    if (err == ERR_OK) {\n\n      if (request.error_status == SNMP_ERR_NOERROR) {\n        /* only process frame if we do not already have an error to return (e.g. all readonly) */\n        if (request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_REQ) {\n          err = snmp_process_get_request(&request);\n        } else if (request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_NEXT_REQ) {\n          err = snmp_process_getnext_request(&request);\n        } else if (request.request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {\n          err = snmp_process_getbulk_request(&request);\n        } else if (request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {\n          err = snmp_process_set_request(&request);\n        }\n      }\n\n      if (err == ERR_OK) {\n        err = snmp_complete_outbound_frame(&request);\n      \n        if (err == ERR_OK) {\n          err = snmp_sendto(request.handle, request.outbound_pbuf, request.source_ip, request.source_port);\n\n          if ((request.request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) \n            && (request.error_status == SNMP_ERR_NOERROR) \n            && (snmp_write_callback != NULL)) {\n            /* raise write notification for all written objects */\n            snmp_execute_write_callbacks(&request);\n          }\n        }\n      }\n    }\n  \n    if (request.outbound_pbuf != NULL) {\n      pbuf_free(request.outbound_pbuf);\n    }\n  }\n}\n\nstatic u8_t\nsnmp_msg_getnext_validate_node_inst(struct snmp_node_instance* node_instance, void* validate_arg)\n{\n  if (((node_instance->access & SNMP_NODE_INSTANCE_ACCESS_READ) != SNMP_NODE_INSTANCE_ACCESS_READ) || (node_instance->get_value == NULL)) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  if ((node_instance->asn1_type == SNMP_ASN1_TYPE_COUNTER64) && (((struct snmp_request*)validate_arg)->version == SNMP_VERSION_1)) {\n    /* according to RFC 2089 skip Counter64 objects in GetNext requests from v1 clients */\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic void \nsnmp_process_varbind(struct snmp_request *request, struct snmp_varbind *vb, u8_t get_next)\n{\n  err_t err;\n  struct snmp_node_instance node_instance;\n  memset(&node_instance, 0, sizeof(node_instance));\n\n  if (get_next) {\n    struct snmp_obj_id result_oid;\n    request->error_status = snmp_get_next_node_instance_from_oid(vb->oid.id, vb->oid.len, snmp_msg_getnext_validate_node_inst, request,  &result_oid, &node_instance);\n\n    if (request->error_status == SNMP_ERR_NOERROR) {\n      snmp_oid_assign(&vb->oid, result_oid.id, result_oid.len);\n    }\n  } else {\n    request->error_status = snmp_get_node_instance_from_oid(vb->oid.id, vb->oid.len, &node_instance);\n\n    if (request->error_status == SNMP_ERR_NOERROR) {\n      /* use 'getnext_validate' method for validation to avoid code duplication (some checks have to be executed here) */\n      request->error_status = snmp_msg_getnext_validate_node_inst(&node_instance, request);\n\n      if (request->error_status != SNMP_ERR_NOERROR) {\n        if (node_instance.release_instance != NULL) {\n          node_instance.release_instance(&node_instance);\n        }\n      }\n    }\n  }\n\n  if (request->error_status != SNMP_ERR_NOERROR)  {\n    if (request->error_status >= SNMP_VARBIND_EXCEPTION_OFFSET) {\n      if ((request->version == SNMP_VERSION_2c) || request->version == SNMP_VERSION_3) {\n        /* in SNMP v2c a varbind related exception is stored in varbind and not in frame header */\n        vb->type = (SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_CLASS_CONTEXT | (request->error_status & SNMP_VARBIND_EXCEPTION_MASK));\n        vb->value_len = 0;\n\n        err = snmp_append_outbound_varbind(&(request->outbound_pbuf_stream), vb);\n        if (err == ERR_OK) {\n          /* we stored the exception in varbind -> go on */\n          request->error_status = SNMP_ERR_NOERROR;\n        } else if (err == ERR_BUF) {\n          request->error_status = SNMP_ERR_TOOBIG;\n        } else {\n          request->error_status = SNMP_ERR_GENERROR;\n        }\n      }\n    } else {\n      /* according to RFC 1157/1905, all other errors only return genError */\n      request->error_status = SNMP_ERR_GENERROR;\n    }\n  } else {\n    s16_t len = node_instance.get_value(&node_instance, vb->value);\n    vb->type = node_instance.asn1_type;\n\n    if(len >= 0) {\n      vb->value_len = (u16_t)len; /* cast is OK because we checked >= 0 above */\n\n      LWIP_ASSERT(\"SNMP_MAX_VALUE_SIZE is configured too low\", (vb->value_len & ~SNMP_GET_VALUE_RAW_DATA) <= SNMP_MAX_VALUE_SIZE);\n      err = snmp_append_outbound_varbind(&request->outbound_pbuf_stream, vb);\n\n      if (err == ERR_BUF) {\n        request->error_status = SNMP_ERR_TOOBIG;\n      } else if (err != ERR_OK) {\n        request->error_status = SNMP_ERR_GENERROR;\n      }\n    } else {\n      request->error_status = SNMP_ERR_GENERROR;\n    }\n\n    if (node_instance.release_instance != NULL) {\n      node_instance.release_instance(&node_instance);\n    }\n  }\n}\n\n\n/**\n * Service an internal or external event for SNMP GET.\n *\n * @param request points to the associated message process state\n */\nstatic err_t\nsnmp_process_get_request(struct snmp_request *request)\n{\n  snmp_vb_enumerator_err_t err;\n  struct snmp_varbind vb;\n  vb.value = request->value_buffer;\n\n  LWIP_DEBUGF(SNMP_DEBUG, (\"SNMP get request\\n\"));\n\n  while (request->error_status == SNMP_ERR_NOERROR) {\n    err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);\n    if (err == SNMP_VB_ENUMERATOR_ERR_OK) {\n      if ((vb.type == SNMP_ASN1_TYPE_NULL) && (vb.value_len == 0)) {\n        snmp_process_varbind(request, &vb, 0);\n      } else {\n        request->error_status = SNMP_ERR_GENERROR;\n      }\n    } else if (err == SNMP_VB_ENUMERATOR_ERR_EOVB) {\n      /* no more varbinds in request */\n      break;\n    } else if (err == SNMP_VB_ENUMERATOR_ERR_ASN1ERROR) {\n      /* malformed ASN.1, don't answer */\n      return ERR_ARG;\n    } else {\n      request->error_status = SNMP_ERR_GENERROR;\n    }\n  }\n\n  return ERR_OK;\n}\n\n/**\n * Service an internal or external event for SNMP GET.\n *\n * @param request points to the associated message process state\n */\nstatic err_t\nsnmp_process_getnext_request(struct snmp_request *request)\n{\n  snmp_vb_enumerator_err_t err;\n  struct snmp_varbind vb;\n  vb.value = request->value_buffer;\n\n  LWIP_DEBUGF(SNMP_DEBUG, (\"SNMP get-next request\\n\"));\n\n  while (request->error_status == SNMP_ERR_NOERROR) {\n    err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);\n    if (err == SNMP_VB_ENUMERATOR_ERR_OK) {\n      if ((vb.type == SNMP_ASN1_TYPE_NULL) && (vb.value_len == 0)) {\n        snmp_process_varbind(request, &vb, 1);\n      } else {\n        request->error_status = SNMP_ERR_GENERROR;\n      }\n    } else if (err == SNMP_VB_ENUMERATOR_ERR_EOVB) {\n      /* no more varbinds in request */\n      break;\n    } else if (err == SNMP_VB_ENUMERATOR_ERR_ASN1ERROR) {\n      /* malformed ASN.1, don't answer */\n      return ERR_ARG;\n    } else {\n      request->error_status = SNMP_ERR_GENERROR;\n    }\n  }\n  \n  return ERR_OK;\n}\n\n/**\n * Service an internal or external event for SNMP GETBULKT.\n *\n * @param request points to the associated message process state\n */\nstatic err_t\nsnmp_process_getbulk_request(struct snmp_request *request)\n{\n  snmp_vb_enumerator_err_t err;\n  s32_t non_repeaters     = request->non_repeaters;\n  s32_t repetitions;\n  u16_t repetition_offset = 0;\n  struct snmp_varbind_enumerator repetition_varbind_enumerator;\n  struct snmp_varbind vb;\n  vb.value = request->value_buffer;\n\n  if (SNMP_LWIP_GETBULK_MAX_REPETITIONS > 0) {\n    repetitions = LWIP_MIN(request->max_repetitions, SNMP_LWIP_GETBULK_MAX_REPETITIONS);\n  } else {\n    repetitions = request->max_repetitions;\n  }\n\n  LWIP_DEBUGF(SNMP_DEBUG, (\"SNMP get-bulk request\\n\"));\n\n  /* process non repeaters and first repetition */\n  while (request->error_status == SNMP_ERR_NOERROR) {\n    if (non_repeaters == 0) {\n      repetition_offset = request->outbound_pbuf_stream.offset;\n\n      if (repetitions == 0) {\n        /* do not resolve repeaters when repetitions is set to 0 */\n        break;\n      }\n      repetitions--;\n    }\n\n    err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);\n    if (err == SNMP_VB_ENUMERATOR_ERR_EOVB) {\n      /* no more varbinds in request */\n      break;\n    } else if (err == SNMP_VB_ENUMERATOR_ERR_ASN1ERROR) {\n      /* malformed ASN.1, don't answer */\n      return ERR_ARG;\n    } else if ((err != SNMP_VB_ENUMERATOR_ERR_OK) || (vb.type != SNMP_ASN1_TYPE_NULL) || (vb.value_len != 0)) {\n      request->error_status = SNMP_ERR_GENERROR;\n    } else {\n      snmp_process_varbind(request, &vb, 1);\n      non_repeaters--;\n    }\n  }\n\n  /* process repetitions > 1 */\n  while ((request->error_status == SNMP_ERR_NOERROR) && (repetitions > 0) && (request->outbound_pbuf_stream.offset != repetition_offset)) {\n\n    u8_t all_endofmibview = 1;\n    \n    snmp_vb_enumerator_init(&repetition_varbind_enumerator, request->outbound_pbuf, repetition_offset, request->outbound_pbuf_stream.offset - repetition_offset);\n    repetition_offset = request->outbound_pbuf_stream.offset; /* for next loop */\n\n    while (request->error_status == SNMP_ERR_NOERROR) {\n      vb.value = NULL; /* do NOT decode value (we enumerate outbound buffer here, so all varbinds have values assigned) */\n      err = snmp_vb_enumerator_get_next(&repetition_varbind_enumerator, &vb);\n      if (err == SNMP_VB_ENUMERATOR_ERR_OK) {\n        vb.value = request->value_buffer;\n        snmp_process_varbind(request, &vb, 1);\n\n        if (request->error_status != SNMP_ERR_NOERROR) {\n          /* already set correct error-index (here it cannot be taken from inbound varbind enumerator) */\n          request->error_index = request->non_repeaters + repetition_varbind_enumerator.varbind_count;\n        } else if (vb.type != (SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTEXT_VARBIND_END_OF_MIB_VIEW)) {\n          all_endofmibview = 0;\n        }\n      } else if (err == SNMP_VB_ENUMERATOR_ERR_EOVB) {\n        /* no more varbinds in request */\n        break;\n      } else {\n        LWIP_DEBUGF(SNMP_DEBUG, (\"Very strange, we cannot parse the varbind output that we created just before!\"));\n        request->error_status = SNMP_ERR_GENERROR;\n        request->error_index  = request->non_repeaters + repetition_varbind_enumerator.varbind_count;\n      }\n    }\n\n    if ((request->error_status == SNMP_ERR_NOERROR) && all_endofmibview) {\n      /* stop when all varbinds in a loop return EndOfMibView */\n      break;\n    }\n    \n    repetitions--;\n  }\n\n  if (request->error_status == SNMP_ERR_TOOBIG) {\n    /* for GetBulk it is ok, if not all requested variables fit into the response -> just return the varbinds added so far */\n    request->error_status = SNMP_ERR_NOERROR;\n  }\n\n  return ERR_OK;\n}\n\n/**\n * Service an internal or external event for SNMP SET.\n *\n * @param request points to the associated message process state\n */\nstatic err_t\nsnmp_process_set_request(struct snmp_request *request)\n{\n  snmp_vb_enumerator_err_t err;\n  struct snmp_varbind vb;\n  vb.value = request->value_buffer;\n\n  LWIP_DEBUGF(SNMP_DEBUG, (\"SNMP set request\\n\"));\n\n  /* perform set test on all objects */\n  while (request->error_status == SNMP_ERR_NOERROR) {\n    err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);\n    if (err == SNMP_VB_ENUMERATOR_ERR_OK) {\n      struct snmp_node_instance node_instance;\n      memset(&node_instance, 0, sizeof(node_instance));\n      \n      request->error_status = snmp_get_node_instance_from_oid(vb.oid.id, vb.oid.len, &node_instance);\n      if (request->error_status == SNMP_ERR_NOERROR) {\n        if (node_instance.asn1_type != vb.type) {\n          request->error_status = SNMP_ERR_WRONGTYPE;\n        } else if (((node_instance.access & SNMP_NODE_INSTANCE_ACCESS_WRITE) != SNMP_NODE_INSTANCE_ACCESS_WRITE) || (node_instance.set_value == NULL)) {\n          request->error_status = SNMP_ERR_NOTWRITABLE;\n        } else {\n          if (node_instance.set_test != NULL) {\n            request->error_status = node_instance.set_test(&node_instance, vb.value_len, vb.value);\n          }\n        }\n\n        if (node_instance.release_instance != NULL) {\n          node_instance.release_instance(&node_instance);\n        }\n      }\n    } else if (err == SNMP_VB_ENUMERATOR_ERR_EOVB) {\n      /* no more varbinds in request */\n      break;\n    } else if (err == SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH) {\n      request->error_status = SNMP_ERR_WRONGLENGTH;\n    } else if (err == SNMP_VB_ENUMERATOR_ERR_ASN1ERROR) {\n      /* malformed ASN.1, don't answer */\n      return ERR_ARG;\n    } else {\n      request->error_status = SNMP_ERR_GENERROR;\n    }\n  }\n\n  /* perform real set operation on all objects */\n  if (request->error_status == SNMP_ERR_NOERROR) {\n    snmp_vb_enumerator_init(&request->inbound_varbind_enumerator, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len);\n    while (request->error_status == SNMP_ERR_NOERROR) {\n      err = snmp_vb_enumerator_get_next(&request->inbound_varbind_enumerator, &vb);\n      if (err == SNMP_VB_ENUMERATOR_ERR_OK) {\n        struct snmp_node_instance node_instance;\n        memset(&node_instance, 0, sizeof(node_instance));\n        request->error_status = snmp_get_node_instance_from_oid(vb.oid.id, vb.oid.len, &node_instance);\n        if (request->error_status == SNMP_ERR_NOERROR) {\n          if (node_instance.set_value(&node_instance, vb.value_len, vb.value) != SNMP_ERR_NOERROR) {\n            if (request->inbound_varbind_enumerator.varbind_count == 1) {\n              request->error_status = SNMP_ERR_COMMITFAILED;\n            } else {\n              /* we cannot undo the set operations done so far */\n              request->error_status = SNMP_ERR_UNDOFAILED;\n            }\n          }\n\n          if (node_instance.release_instance != NULL) {\n            node_instance.release_instance(&node_instance);\n          }\n        }\n      } else if (err == SNMP_VB_ENUMERATOR_ERR_EOVB) {\n        /* no more varbinds in request */\n        break;\n      } else {\n        /* first time enumerating varbinds work but second time not, although nothing should have changed in between ??? */\n        request->error_status = SNMP_ERR_GENERROR;\n      }\n    }\n  }\n\n  return ERR_OK;\n}\n\n#define PARSE_EXEC(code, retValue) \\\n  if ((code) != ERR_OK) { \\\n    LWIP_DEBUGF(SNMP_DEBUG, (\"Malformed ASN.1 detected.\\n\")); \\\n    snmp_stats.inasnparseerrs++; \\\n    return retValue; \\\n  }\n\n#define PARSE_ASSERT(cond, retValue) \\\n  if (!(cond)) { \\\n    LWIP_DEBUGF(SNMP_DEBUG, (\"SNMP parse assertion failed!: \" # cond)); \\\n    snmp_stats.inasnparseerrs++; \\\n    return retValue; \\\n  }\n\n#define BUILD_EXEC(code, retValue) \\\n  if ((code) != ERR_OK) { \\\n    LWIP_DEBUGF(SNMP_DEBUG, (\"SNMP error during creation of outbound frame!: \" # code)); \\\n    return retValue; \\\n  }\n\n#define IF_PARSE_EXEC(code)   PARSE_EXEC(code, ERR_ARG)\n#define IF_PARSE_ASSERT(code) PARSE_ASSERT(code, ERR_ARG)\n\n/**\n * Checks and decodes incoming SNMP message header, logs header errors.\n *\n * @param request points to the current message request state return\n * @return\n * - ERR_OK SNMP header is sane and accepted\n * - ERR_VAL SNMP header is either malformed or rejected\n */\nstatic err_t\nsnmp_parse_inbound_frame(struct snmp_request *request)\n{\n  struct snmp_pbuf_stream pbuf_stream;\n  struct snmp_asn1_tlv tlv;\n  s32_t parent_tlv_value_len;\n  s32_t s32_value;\n  err_t err;\n\n  IF_PARSE_EXEC(snmp_pbuf_stream_init(&pbuf_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));\n  \n  /* decode main container consisting of version, community and PDU */\n  IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n  IF_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_SEQUENCE) && (tlv.value_len == pbuf_stream.length));\n  parent_tlv_value_len = tlv.value_len;\n\n  /* decode version */\n  IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n  IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);\n  parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n  IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n  \n  IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));\n  if ((s32_value != SNMP_VERSION_1) &&\n      (s32_value != SNMP_VERSION_2c)\n#if LWIP_SNMP_V3\n      && (s32_value != SNMP_VERSION_3)\n#endif\n     )\n  {\n    /* unsupported SNMP version */\n    snmp_stats.inbadversions++;\n    return ERR_ARG;\n  }\n  request->version = (u8_t)s32_value;\n\n#if LWIP_SNMP_V3\n  if (request->version == SNMP_VERSION_3) {\n    u16_t u16_value;\n    u16_t inbound_msgAuthenticationParameters_offset;\n\n    /* SNMPv3 doesn't use communities */\n    /* @todo: Differentiate read/write access */\n    strcpy((char*)request->community, snmp_community);\n    request->community_strlen = (u16_t)strlen(snmp_community);\n\n    /* RFC3414 globalData */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_SEQUENCE);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    /* decode msgID */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));\n    request->msg_id = s32_value;\n\n    /* decode msgMaxSize */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));\n    request->msg_max_size = s32_value;\n\n    /* decode msgFlags */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));\n    request->msg_flags = (u8_t)s32_value;\n\n    /* decode msgSecurityModel */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));\n    request->msg_security_model = s32_value;\n\n    /* RFC3414 msgSecurityParameters\n     * The User-based Security Model defines the contents of the OCTET\n     * STRING as a SEQUENCE.\n     *\n     * We skip the protective dummy OCTET STRING header\n     * to access the SEQUENCE header.\n     */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    /* msgSecurityParameters SEQUENCE header */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_SEQUENCE);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    /* decode msgAuthoritativeEngineID */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_authoritative_engine_id,\n        &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));\n    request->msg_authoritative_engine_id_len = (u8_t)u16_value;\n\n    /* msgAuthoritativeEngineBoots */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n    IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->msg_authoritative_engine_boots));\n\n    /* msgAuthoritativeEngineTime */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n    IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->msg_authoritative_engine_time));\n    /* @todo: Implement time window checking */\n\n    /* msgUserName */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_user_name,\n        &u16_value, SNMP_V3_MAX_USER_LENGTH));\n    request->msg_user_name_len = (u8_t)u16_value;\n    /* @todo: Implement unknown user error response */\n    IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, NULL, NULL));\n\n    /* msgAuthenticationParameters */\n    memset(request->msg_authentication_parameters, 0, SNMP_V3_MAX_AUTH_PARAM_LENGTH);\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n    /* Remember position */\n    inbound_msgAuthenticationParameters_offset = pbuf_stream.offset;\n    LWIP_UNUSED_ARG(inbound_msgAuthenticationParameters_offset);\n    /* Read auth parameters */\n    IF_PARSE_ASSERT(tlv.value_len <= SNMP_V3_MAX_AUTH_PARAM_LENGTH);\n    IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_authentication_parameters,\n        &u16_value, tlv.value_len));\n\n#if LWIP_SNMP_V3_CRYPTO\n    if (request->msg_flags & SNMP_V3_AUTH_FLAG) {\n      const u8_t zero_arr[SNMP_V3_MAX_AUTH_PARAM_LENGTH] = { 0 };\n      u8_t key[20];\n      u8_t algo;\n      u8_t hmac[LWIP_MAX(SNMP_V3_SHA_LEN, SNMP_V3_MD5_LEN)];\n      struct snmp_pbuf_stream auth_stream;\n\n      /* Rewind stream */\n      IF_PARSE_EXEC(snmp_pbuf_stream_init(&pbuf_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));\n      IF_PARSE_EXEC(snmp_pbuf_stream_seek_abs(&pbuf_stream, inbound_msgAuthenticationParameters_offset));\n      /* Set auth parameters to zero for verification */\n      IF_PARSE_EXEC(snmp_asn1_enc_raw(&pbuf_stream, zero_arr, tlv.value_len));\n\n      /* Verify authentication */\n      IF_PARSE_EXEC(snmp_pbuf_stream_init(&auth_stream, request->inbound_pbuf, 0, request->inbound_pbuf->tot_len));\n\n      IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, &algo, key, NULL, NULL));\n      IF_PARSE_EXEC(snmpv3_auth(&auth_stream, request->inbound_pbuf->tot_len, key, algo, hmac));\n      /* @todo: Implement error response */\n      IF_PARSE_EXEC(memcmp(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH));\n    }\n#else\n    /* Ungraceful exit if we encounter cryptography and don't support it.\n     * @todo: Implement error response\n     */\n    IF_PARSE_ASSERT(!(request->msg_flags & (SNMP_V3_AUTH_FLAG | SNMP_V3_PRIV_FLAG)));\n#endif\n\n    /* msgPrivacyParameters */\n    memset(request->msg_privacy_parameters, 0, SNMP_V3_MAX_PRIV_PARAM_LENGTH);\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->msg_privacy_parameters,\n        &u16_value, SNMP_V3_MAX_PRIV_PARAM_LENGTH));\n\n#if LWIP_SNMP_V3_CRYPTO\n    /* Decrypt message */\n    if (request->msg_flags & SNMP_V3_PRIV_FLAG) {\n      u8_t key[20];\n      u8_t algo;\n\n      IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n      IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);\n      parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);\n      IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n      IF_PARSE_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, &algo, key));\n      IF_PARSE_EXEC(snmpv3_crypt(&pbuf_stream, tlv.value_len, key,\n          request->msg_privacy_parameters, request->msg_authoritative_engine_boots,\n          request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_DECRYPT));\n    }\n#endif\n\n    /* Scoped PDU\n     * Encryption context\n     */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_SEQUENCE);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_HDR_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    /* contextEngineID */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->context_engine_id,\n        &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));\n    request->context_engine_id_len = (u8_t)u16_value;\n\n    /* contextName */\n    IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n    IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);\n    parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n    IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n    IF_PARSE_EXEC(snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->context_name,\n        &u16_value, SNMP_V3_MAX_ENGINE_ID_LENGTH));\n    request->context_name_len = (u8_t)u16_value;\n  } else\n#endif\n  {\n  /* decode community */\n  IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n  IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_OCTET_STRING);\n  parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n  IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n  err = snmp_asn1_dec_raw(&pbuf_stream, tlv.value_len, request->community, &request->community_strlen, SNMP_MAX_COMMUNITY_STR_LEN);\n  if (err == ERR_MEM) {\n    /* community string does not fit in our buffer -> its too long -> its invalid */\n    request->community_strlen = 0;\n    snmp_pbuf_stream_seek(&pbuf_stream, tlv.value_len);\n  } else {\n    IF_PARSE_ASSERT(err == ERR_OK);\n  }\n  /* add zero terminator */\n  request->community[request->community_strlen] = 0;\n  }\n\n  /* decode PDU type (next container level) */\n  IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n  IF_PARSE_ASSERT(tlv.value_len <= pbuf_stream.length);\n  request->inbound_padding_len = pbuf_stream.length - tlv.value_len;\n  parent_tlv_value_len = tlv.value_len;\n\n  /* validate PDU type */\n  switch(tlv.type) {\n    case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_REQ):\n      /* GetRequest PDU */\n      snmp_stats.ingetrequests++;\n      break;\n    case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_NEXT_REQ):\n      /* GetNextRequest PDU */\n      snmp_stats.ingetnexts++;\n      break;\n    case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ):\n      /* GetBulkRequest PDU */\n      if (request->version < SNMP_VERSION_2c) {\n        /* RFC2089: invalid, drop packet */\n        return ERR_ARG;\n      }\n      break;\n    case (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_SET_REQ):\n      /* SetRequest PDU */\n      snmp_stats.insetrequests++;\n      break;\n    default:\n      /* unsupported input PDU for this agent (no parse error) */\n      LWIP_DEBUGF(SNMP_DEBUG, (\"Unknown/Invalid SNMP PDU type received: %d\", tlv.type)); \\\n      return ERR_ARG;\n      break;\n  }\n  request->request_type = tlv.type & SNMP_ASN1_DATATYPE_MASK;\n\n  /* validate community (do this after decoding PDU type because we don't want to increase 'inbadcommunitynames' for wrong frame types */\n  if (request->community_strlen == 0) {\n    /* community string was too long or really empty*/\n    snmp_stats.inbadcommunitynames++;\n    snmp_authfail_trap();\n    return ERR_ARG;\n  } else if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {\n    if (snmp_community_write[0] == 0) {\n      /* our write community is empty, that means all our objects are readonly */\n      request->error_status = SNMP_ERR_NOTWRITABLE;\n      request->error_index  = 1;\n    } else if (strncmp(snmp_community_write, (const char*)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) {\n      /* community name does not match */\n      snmp_stats.inbadcommunitynames++;\n      snmp_authfail_trap();\n      return ERR_ARG;\n    }\n  } else { \n    if (strncmp(snmp_community, (const char*)request->community, SNMP_MAX_COMMUNITY_STR_LEN) != 0) {\n      /* community name does not match */\n      snmp_stats.inbadcommunitynames++;\n      snmp_authfail_trap();\n      return ERR_ARG;\n    }\n  }\n  \n  /* decode request ID */\n  IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n  IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);\n  parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n  IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n  \n  IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->request_id));\n\n  /* decode error status / non-repeaters */\n  IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n  IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);\n  parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n  IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n  if (request->request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {\n    IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->non_repeaters));\n    if (request->non_repeaters < 0) {\n      /* RFC 1905, 4.2.3 */\n      request->non_repeaters = 0;\n    }\n  } else {\n    /* only check valid value, don't touch 'request->error_status', maybe a response error status was already set to above; */\n    IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &s32_value));\n    IF_PARSE_ASSERT(s32_value == SNMP_ERR_NOERROR);\n  }\n\n  /* decode error index / max-repetitions */\n  IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n  IF_PARSE_ASSERT(tlv.type == SNMP_ASN1_TYPE_INTEGER);\n  parent_tlv_value_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n  IF_PARSE_ASSERT(parent_tlv_value_len > 0);\n\n  if (request->request_type == SNMP_ASN1_CONTEXT_PDU_GET_BULK_REQ) {\n    IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->max_repetitions));\n    if (request->max_repetitions < 0) {\n      /* RFC 1905, 4.2.3 */\n      request->max_repetitions = 0;\n    }\n  } else {\n    IF_PARSE_EXEC(snmp_asn1_dec_s32t(&pbuf_stream, tlv.value_len, &request->error_index));\n    IF_PARSE_ASSERT(s32_value == 0);\n  }\n\n  /* decode varbind-list type (next container level) */\n  IF_PARSE_EXEC(snmp_asn1_dec_tlv(&pbuf_stream, &tlv));\n  IF_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_SEQUENCE) && (tlv.value_len <= pbuf_stream.length));\n  \n  request->inbound_varbind_offset = pbuf_stream.offset;\n  request->inbound_varbind_len    = pbuf_stream.length - request->inbound_padding_len;\n  snmp_vb_enumerator_init(&(request->inbound_varbind_enumerator), request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len);\n\n  return ERR_OK;\n}\n\n#define OF_BUILD_EXEC(code) BUILD_EXEC(code, ERR_ARG)\n\nstatic err_t\nsnmp_prepare_outbound_frame(struct snmp_request *request)\n{\n  struct snmp_asn1_tlv tlv;\n  struct snmp_pbuf_stream* pbuf_stream = &(request->outbound_pbuf_stream);\n\n  /* try allocating pbuf(s) for maximum response size */\n  request->outbound_pbuf = pbuf_alloc(PBUF_TRANSPORT, 1472, PBUF_RAM);\n  if (request->outbound_pbuf == NULL) {\n    return ERR_MEM;\n  }\n\n  snmp_pbuf_stream_init(pbuf_stream, request->outbound_pbuf, 0, request->outbound_pbuf->tot_len);\n\n  /* 'Message' sequence */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, 0);\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );\n\n  /* version */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);\n  snmp_asn1_enc_s32t_cnt(request->version, &tlv.value_len);\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );\n  OF_BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->version) );\n\n#if LWIP_SNMP_V3\n  if (request->version < SNMP_VERSION_3) {\n#endif\n  /* community */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->community_strlen);\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );\n  OF_BUILD_EXEC( snmp_asn1_enc_raw(pbuf_stream, request->community, request->community_strlen) );\n#if LWIP_SNMP_V3\n  } else {\n    const char* id;\n\n    /* globalData */\n    request->outbound_msg_global_data_offset = pbuf_stream->offset;\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, 0);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n\n    /* msgID */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 1);\n    snmp_asn1_enc_s32t_cnt(request->msg_id, &tlv.value_len);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_id));\n\n    /* msgMaxSize */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 1);\n    snmp_asn1_enc_s32t_cnt(request->msg_max_size, &tlv.value_len);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_max_size));\n\n    /* msgFlags */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, 1);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, &request->msg_flags, 1));\n\n    /* msgSecurityModel */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 1);\n    snmp_asn1_enc_s32t_cnt(request->msg_security_model, &tlv.value_len);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_security_model));\n\n    /* end of msgGlobalData */\n    request->outbound_msg_global_data_end = pbuf_stream->offset;\n\n    /* msgSecurityParameters */\n    request->outbound_msg_security_parameters_str_offset = pbuf_stream->offset;\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, 0);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n\n    request->outbound_msg_security_parameters_seq_offset = pbuf_stream->offset;\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, 0);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n\n    /* msgAuthoritativeEngineID */\n    snmpv3_get_engine_id(&id, &request->msg_authoritative_engine_id_len);\n    MEMCPY(request->msg_authoritative_engine_id, id, request->msg_authoritative_engine_id_len);\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->msg_authoritative_engine_id_len);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_authoritative_engine_id, request->msg_authoritative_engine_id_len));\n\n    request->msg_authoritative_engine_time = snmpv3_get_engine_time();\n    request->msg_authoritative_engine_boots = snmpv3_get_engine_boots();\n\n    /* msgAuthoritativeEngineBoots */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);\n    snmp_asn1_enc_s32t_cnt(request->msg_authoritative_engine_boots, &tlv.value_len);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_authoritative_engine_boots));\n\n    /* msgAuthoritativeEngineTime */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);\n    snmp_asn1_enc_s32t_cnt(request->msg_authoritative_engine_time, &tlv.value_len);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->msg_authoritative_engine_time));\n\n    /* msgUserName */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->msg_user_name_len);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_user_name, request->msg_user_name_len));\n\n#if LWIP_SNMP_V3_CRYPTO\n    /* msgAuthenticationParameters */\n    if (request->msg_flags & SNMP_V3_AUTH_FLAG) {\n      memset(request->msg_authentication_parameters, 0, SNMP_V3_MAX_AUTH_PARAM_LENGTH);\n      request->outbound_msg_authentication_parameters_offset = pbuf_stream->offset;\n      SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, SNMP_V3_MAX_AUTH_PARAM_LENGTH);\n      OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n      OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH));\n    } else\n#endif\n    {\n      SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, 0);\n      OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    }\n\n#if LWIP_SNMP_V3_CRYPTO\n    /* msgPrivacyParameters */\n    if (request->msg_flags & SNMP_V3_PRIV_FLAG) {\n      snmpv3_build_priv_param(request->msg_privacy_parameters);\n\n      SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, SNMP_V3_MAX_PRIV_PARAM_LENGTH);\n      OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n      OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->msg_privacy_parameters, SNMP_V3_MAX_PRIV_PARAM_LENGTH));\n    } else\n#endif\n    {\n      SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, 0);\n      OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv) );\n    }\n\n    /* End of msgSecurityParameters, so we can calculate the length of this sequence later */\n    request->outbound_msg_security_parameters_end = pbuf_stream->offset;\n\n#if LWIP_SNMP_V3_CRYPTO\n    /* For encryption we have to encapsulate the payload in an octet string */\n    if (request->msg_flags & SNMP_V3_PRIV_FLAG) {\n      request->outbound_scoped_pdu_string_offset = pbuf_stream->offset;\n      SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 3, 0);\n      OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    }\n#endif\n    /* Scoped PDU\n     * Encryption context\n     */\n    request->outbound_scoped_pdu_seq_offset = pbuf_stream->offset;\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, 0);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n\n    /* contextEngineID */\n    snmpv3_get_engine_id(&id, &request->context_engine_id_len);\n    MEMCPY(request->context_engine_id, id, request->context_engine_id_len);\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->context_engine_id_len);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->context_engine_id, request->context_engine_id_len));\n\n    /* contextName */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, request->context_name_len);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, request->context_name, request->context_name_len));\n  }\n#endif\n\n  /* 'PDU' sequence */\n  request->outbound_pdu_offset = pbuf_stream->offset;\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP), 3, 0);\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );\n\n  /* request ID */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);\n  snmp_asn1_enc_s32t_cnt(request->request_id, &tlv.value_len);\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );\n  OF_BUILD_EXEC( snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, request->request_id) );\n\n  /* error status */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 1);\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );\n  request->outbound_error_status_offset = pbuf_stream->offset;\n  OF_BUILD_EXEC( snmp_pbuf_stream_write(pbuf_stream, 0) );\n\n  /* error index */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 1);\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );\n  request->outbound_error_index_offset = pbuf_stream->offset;\n  OF_BUILD_EXEC( snmp_pbuf_stream_write(pbuf_stream, 0) );\n\n  /* 'VarBindList' sequence */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, 0);\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(pbuf_stream, &tlv) );\n\n  request->outbound_varbind_offset = pbuf_stream->offset;\n\n  return ERR_OK;\n}\n\n/** Calculate the length of a varbind list */\nerr_t\nsnmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len)\n{\n  /* calculate required lengths */\n  snmp_asn1_enc_oid_cnt(varbind->oid.id, varbind->oid.len, &len->oid_value_len);\n  snmp_asn1_enc_length_cnt(len->oid_value_len, &len->oid_len_len);\n\n  if (varbind->value_len == 0) {\n    len->value_value_len = 0;\n  } else if (varbind->value_len & SNMP_GET_VALUE_RAW_DATA) {\n    len->value_value_len = varbind->value_len & (~SNMP_GET_VALUE_RAW_DATA);\n  } else {\n    switch (varbind->type) {\n      case SNMP_ASN1_TYPE_INTEGER:\n        if (varbind->value_len != sizeof (s32_t)) {\n          return ERR_VAL;\n        }\n        snmp_asn1_enc_s32t_cnt(*((s32_t*) varbind->value), &len->value_value_len);\n        break;\n      case SNMP_ASN1_TYPE_COUNTER:\n      case SNMP_ASN1_TYPE_GAUGE:\n      case SNMP_ASN1_TYPE_TIMETICKS:\n        if (varbind->value_len != sizeof (u32_t)) {\n          return ERR_VAL;\n        }\n        snmp_asn1_enc_u32t_cnt(*((u32_t*) varbind->value), &len->value_value_len);\n        break;\n      case SNMP_ASN1_TYPE_OCTET_STRING:\n      case SNMP_ASN1_TYPE_IPADDR:\n      case SNMP_ASN1_TYPE_OPAQUE:\n        len->value_value_len = varbind->value_len;\n        break;\n      case SNMP_ASN1_TYPE_NULL:\n        if (varbind->value_len != 0) {\n          return ERR_VAL;\n        }\n        len->value_value_len = 0;\n        break;\n      case SNMP_ASN1_TYPE_OBJECT_ID:\n        if ((varbind->value_len & 0x03) != 0) {\n          return ERR_VAL;\n        }\n        snmp_asn1_enc_oid_cnt((u32_t*) varbind->value, varbind->value_len >> 2, &len->value_value_len);\n        break;\n      case SNMP_ASN1_TYPE_COUNTER64:\n        if (varbind->value_len != (2 * sizeof (u32_t))) {\n          return ERR_VAL;\n        }\n        snmp_asn1_enc_u64t_cnt((u32_t*) varbind->value, &len->value_value_len);\n        break;\n      default:\n        /* unsupported type */\n        return ERR_VAL;\n    }\n  }\n  snmp_asn1_enc_length_cnt(len->value_value_len, &len->value_len_len);\n\n  len->vb_value_len = 1 + len->oid_len_len + len->oid_value_len + 1 + len->value_len_len + len->value_value_len;\n  snmp_asn1_enc_length_cnt(len->vb_value_len, &len->vb_len_len);\n\n  return ERR_OK;\n}\n\n#define OVB_BUILD_EXEC(code) BUILD_EXEC(code, ERR_ARG)\n\nerr_t\nsnmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind* varbind)\n{\n  struct snmp_asn1_tlv tlv;\n  struct snmp_varbind_len len;\n  err_t err;\n\n  err = snmp_varbind_length(varbind, &len);\n\n  if (err != ERR_OK) {\n    return err;\n  }\n\n  /* check length already before adding first data because in case of GetBulk,\n   *  data added so far is returned and therefore no partial data shall be added\n   */\n  if ((1 + len.vb_len_len + len.vb_value_len) > pbuf_stream->length) {\n    return ERR_BUF;\n  }\n\n  /* 'VarBind' sequence */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, len.vb_len_len, len.vb_value_len);\n  OVB_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n\n  /* VarBind OID */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OBJECT_ID, len.oid_len_len, len.oid_value_len);\n  OVB_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n  OVB_BUILD_EXEC(snmp_asn1_enc_oid(pbuf_stream, varbind->oid.id, varbind->oid.len));\n\n  /* VarBind value */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, varbind->type, len.value_len_len, len.value_value_len);\n  OVB_BUILD_EXEC(snmp_ans1_enc_tlv(pbuf_stream, &tlv));\n\n  if (len.value_value_len > 0) {\n    if (varbind->value_len & SNMP_GET_VALUE_RAW_DATA) {\n      OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (u8_t*) varbind->value, len.value_value_len));\n    } else {\n      switch (varbind->type) {\n        case SNMP_ASN1_TYPE_INTEGER:\n          OVB_BUILD_EXEC(snmp_asn1_enc_s32t(pbuf_stream, len.value_value_len, *((s32_t*) varbind->value)));\n          break;\n        case SNMP_ASN1_TYPE_COUNTER:\n        case SNMP_ASN1_TYPE_GAUGE:\n        case SNMP_ASN1_TYPE_TIMETICKS:\n          OVB_BUILD_EXEC(snmp_asn1_enc_u32t(pbuf_stream, len.value_value_len, *((u32_t*) varbind->value)));\n          break;\n        case SNMP_ASN1_TYPE_OCTET_STRING:\n        case SNMP_ASN1_TYPE_IPADDR:\n        case SNMP_ASN1_TYPE_OPAQUE:\n          OVB_BUILD_EXEC(snmp_asn1_enc_raw(pbuf_stream, (u8_t*) varbind->value, len.value_value_len));\n          len.value_value_len = varbind->value_len;\n          break;\n        case SNMP_ASN1_TYPE_OBJECT_ID:\n          OVB_BUILD_EXEC(snmp_asn1_enc_oid(pbuf_stream, (u32_t*) varbind->value, varbind->value_len / sizeof (u32_t)));\n          break;\n        case SNMP_ASN1_TYPE_COUNTER64:\n          OVB_BUILD_EXEC(snmp_asn1_enc_u64t(pbuf_stream, len.value_value_len, (u32_t*) varbind->value));\n          break;\n        default:\n          LWIP_ASSERT(\"Unknown variable type\", 0);\n          break;\n      }\n    }\n  }\n\n  return ERR_OK;\n}\n\nstatic err_t\nsnmp_complete_outbound_frame(struct snmp_request *request)\n{\n  struct snmp_asn1_tlv tlv;\n  u16_t frame_size;\n  u8_t outbound_padding = 0;\n\n  if (request->version == SNMP_VERSION_1) {\n    if (request->error_status != SNMP_ERR_NOERROR) {\n      /* map v2c error codes to v1 compliant error code (according to RFC 2089) */\n      switch (request->error_status) {\n        /* mapping of implementation specific \"virtual\" error codes \n         * (during processing of frame we already stored them in error_status field, \n         * so no need to check all varbinds here for those exceptions as suggested by RFC) */\n        case SNMP_ERR_NOSUCHINSTANCE:\n        case SNMP_ERR_NOSUCHOBJECT:\n        case SNMP_ERR_ENDOFMIBVIEW:\n          request->error_status = SNMP_ERR_NOSUCHNAME;\n          break;\n        /* mapping according to RFC */\n        case SNMP_ERR_WRONGVALUE:\n        case SNMP_ERR_WRONGENCODING:\n        case SNMP_ERR_WRONGTYPE:\n        case SNMP_ERR_WRONGLENGTH:\n        case SNMP_ERR_INCONSISTENTVALUE:\n          request->error_status = SNMP_ERR_BADVALUE;\n          break;\n        case SNMP_ERR_NOACCESS:\n        case SNMP_ERR_NOTWRITABLE:\n        case SNMP_ERR_NOCREATION:\n        case SNMP_ERR_INCONSISTENTNAME:\n        case SNMP_ERR_AUTHORIZATIONERROR:\n          request->error_status = SNMP_ERR_NOSUCHNAME;\n          break;\n        case SNMP_ERR_RESOURCEUNAVAILABLE:\n        case SNMP_ERR_COMMITFAILED:\n        case SNMP_ERR_UNDOFAILED:\n        default:\n          request->error_status = SNMP_ERR_GENERROR;\n          break;\n       }\n    }\n  } else {\n    if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {\n      /* map error codes to according to RFC 1905 (4.2.5.  The SetRequest-PDU) return 'NotWritable' for unknown OIDs) */\n      switch (request->error_status) {\n        case SNMP_ERR_NOSUCHINSTANCE:\n        case SNMP_ERR_NOSUCHOBJECT:\n        case SNMP_ERR_ENDOFMIBVIEW:\n          request->error_status = SNMP_ERR_NOTWRITABLE;\n          break;\n        default:\n          break;\n      }\n    }\n\n    if (request->error_status >= SNMP_VARBIND_EXCEPTION_OFFSET) {\n      /* should never occur because v2 frames store exceptions directly inside varbinds and not as frame error_status */\n      LWIP_DEBUGF(SNMP_DEBUG, (\"snmp_complete_outbound_frame() > Found v2 request with varbind exception code stored as error status!\\n\"));\n      return ERR_ARG;\n    }\n  }\n\n  if ((request->error_status != SNMP_ERR_NOERROR) || (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ)) {\n    /* all inbound vars are returned in response without any modification for error responses and successful set requests*/\n    struct snmp_pbuf_stream inbound_stream;\n    OF_BUILD_EXEC( snmp_pbuf_stream_init(&inbound_stream, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len) );\n    OF_BUILD_EXEC( snmp_pbuf_stream_init(&(request->outbound_pbuf_stream), request->outbound_pbuf, request->outbound_varbind_offset, request->outbound_pbuf->tot_len - request->outbound_varbind_offset) );\n    snmp_pbuf_stream_writeto(&inbound_stream, &(request->outbound_pbuf_stream), 0);\n  }\n\n  frame_size = request->outbound_pbuf_stream.offset;\n\n#if LWIP_SNMP_V3 && LWIP_SNMP_V3_CRYPTO\n  /* Calculate padding for encryption */\n  if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_PRIV_FLAG)) {\n    u8_t i;\n    outbound_padding = (8 - (u8_t)((frame_size - request->outbound_scoped_pdu_seq_offset) & 0x07)) & 0x07;\n    for (i = 0; i < outbound_padding; i++) {\n      snmp_pbuf_stream_write(&request->outbound_pbuf_stream, 0);\n    }\n  }\n#endif\n\n  /* complete missing length in 'Message' sequence ; 'Message' tlv is located at the beginning (offset 0) */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, frame_size + outbound_padding - 1 - 3); /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */\n  OF_BUILD_EXEC( snmp_pbuf_stream_init(&(request->outbound_pbuf_stream), request->outbound_pbuf, 0, request->outbound_pbuf->tot_len) );\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) );\n\n#if LWIP_SNMP_V3\n  if (request->version == SNMP_VERSION_3) {\n    /* complete missing length in 'globalData' sequence */\n    /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, request->outbound_msg_global_data_end\n        - request->outbound_msg_global_data_offset - 1 - 1);\n    OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_global_data_offset));\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));\n\n    /* complete missing length in 'msgSecurityParameters' sequence */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, request->outbound_msg_security_parameters_end\n        - request->outbound_msg_security_parameters_str_offset - 1 - 1);\n    OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_security_parameters_str_offset));\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));\n\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 1, request->outbound_msg_security_parameters_end\n        - request->outbound_msg_security_parameters_seq_offset - 1 - 1);\n    OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_msg_security_parameters_seq_offset));\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));\n\n    /* complete missing length in scoped PDU sequence */\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, frame_size - request->outbound_scoped_pdu_seq_offset - 1 - 3);\n    OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_scoped_pdu_seq_offset));\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));\n  }\n#endif\n\n  /* complete missing length in 'PDU' sequence */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_GET_RESP), 3,\n      frame_size - request->outbound_pdu_offset - 1 - 3); /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */\n  OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_pdu_offset) );\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) );\n\n  /* process and encode final error status */\n  if (request->error_status != 0) {\n    u16_t len;\n    snmp_asn1_enc_s32t_cnt(request->error_status, &len);\n    if (len != 1) {\n      /* error, we only reserved one byte for it */\n      return ERR_ARG;\n    }\n    OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_error_status_offset) );\n    OF_BUILD_EXEC( snmp_asn1_enc_s32t(&(request->outbound_pbuf_stream), len, request->error_status) );\n\n    /* for compatibility to v1, log statistics; in v2 (RFC 1907) these statistics are obsoleted */\n    switch (request->error_status) {\n      case SNMP_ERR_TOOBIG:\n        snmp_stats.outtoobigs++;\n        break;\n      case SNMP_ERR_NOSUCHNAME:\n        snmp_stats.outnosuchnames++;\n        break;\n      case SNMP_ERR_BADVALUE:\n        snmp_stats.outbadvalues++;\n        break;\n      case SNMP_ERR_GENERROR:\n      default:\n        snmp_stats.outgenerrs++;\n        break;\n    }\n\n    if (request->error_status == SNMP_ERR_TOOBIG) {\n      request->error_index = 0; /* defined by RFC 1157 */\n    } else if (request->error_index == 0) {\n      /* set index to varbind where error occured (if not already set before, e.g. during GetBulk processing) */\n      request->error_index = request->inbound_varbind_enumerator.varbind_count;\n    }\n  } else {\n    if (request->request_type == SNMP_ASN1_CONTEXT_PDU_SET_REQ) {\n      snmp_stats.intotalsetvars += request->inbound_varbind_enumerator.varbind_count;\n    } else {\n      snmp_stats.intotalreqvars += request->inbound_varbind_enumerator.varbind_count;\n    }\n  }\n\n  /* encode final error index*/\n  if (request->error_index != 0) {\n    u16_t len;\n    snmp_asn1_enc_s32t_cnt(request->error_index, &len);\n    if (len != 1) {\n      /* error, we only reserved one byte for it */\n      return ERR_VAL;\n    }\n    OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_error_index_offset) );\n    OF_BUILD_EXEC( snmp_asn1_enc_s32t(&(request->outbound_pbuf_stream), len, request->error_index) );\n  }\n\n  /* complete missing length in 'VarBindList' sequence ; 'VarBindList' tlv is located directly before varbind offset */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 3, frame_size - request->outbound_varbind_offset);\n  OF_BUILD_EXEC( snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_varbind_offset - 1 - 3) ); /* - type - length_len(fixed, see snmp_prepare_outbound_frame()) */\n  OF_BUILD_EXEC( snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv) );\n\n  /* Authenticate response */\n#if LWIP_SNMP_V3 && LWIP_SNMP_V3_CRYPTO\n  /* Encrypt response */\n  if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_PRIV_FLAG)) {\n    u8_t key[20];\n    u8_t algo;\n\n    /* complete missing length in PDU sequence */\n    OF_BUILD_EXEC(snmp_pbuf_stream_init(&request->outbound_pbuf_stream, request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));\n    OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&(request->outbound_pbuf_stream), request->outbound_scoped_pdu_string_offset));\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 3, frame_size + outbound_padding\n        - request->outbound_scoped_pdu_string_offset - 1 - 3);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(&(request->outbound_pbuf_stream), &tlv));\n\n    OF_BUILD_EXEC(snmpv3_get_user((char*)request->msg_user_name, NULL, NULL, &algo, key));\n\n    OF_BUILD_EXEC(snmpv3_crypt(&request->outbound_pbuf_stream, tlv.value_len, key,\n        request->msg_privacy_parameters, request->msg_authoritative_engine_boots,\n        request->msg_authoritative_engine_time, algo, SNMP_V3_PRIV_MODE_ENCRYPT));\n  }\n\n  if (request->version == SNMP_VERSION_3 && (request->msg_flags & SNMP_V3_AUTH_FLAG)) {\n    u8_t key[20];\n    u8_t algo;\n    u8_t hmac[20];\n\n    OF_BUILD_EXEC(snmpv3_get_user((char*)request->msg_user_name, &algo, key, NULL, NULL));\n    OF_BUILD_EXEC(snmp_pbuf_stream_init(&(request->outbound_pbuf_stream),\n        request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));\n    OF_BUILD_EXEC(snmpv3_auth(&request->outbound_pbuf_stream, frame_size + outbound_padding, key, algo, hmac));\n\n    MEMCPY(request->msg_authentication_parameters, hmac, SNMP_V3_MAX_AUTH_PARAM_LENGTH);\n    OF_BUILD_EXEC(snmp_pbuf_stream_init(&request->outbound_pbuf_stream,\n                  request->outbound_pbuf, 0, request->outbound_pbuf->tot_len));\n    OF_BUILD_EXEC(snmp_pbuf_stream_seek_abs(&request->outbound_pbuf_stream,\n                  request->outbound_msg_authentication_parameters_offset));\n\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 1, SNMP_V3_MAX_AUTH_PARAM_LENGTH);\n    OF_BUILD_EXEC(snmp_ans1_enc_tlv(&request->outbound_pbuf_stream, &tlv));\n    OF_BUILD_EXEC(snmp_asn1_enc_raw(&request->outbound_pbuf_stream,\n                  request->msg_authentication_parameters, SNMP_V3_MAX_AUTH_PARAM_LENGTH));\n  }\n#endif\n\n  pbuf_realloc(request->outbound_pbuf, frame_size + outbound_padding);\n\n  snmp_stats.outgetresponses++;\n  snmp_stats.outpkts++;\n\n  return ERR_OK;\n}\n\nstatic void \nsnmp_execute_write_callbacks(struct snmp_request *request)\n{\n  struct snmp_varbind_enumerator inbound_varbind_enumerator;\n  struct snmp_varbind vb;\n\n  snmp_vb_enumerator_init(&inbound_varbind_enumerator, request->inbound_pbuf, request->inbound_varbind_offset, request->inbound_varbind_len);\n  vb.value = NULL; /* do NOT decode value (we enumerate outbound buffer here, so all varbinds have values assigned, which we don't need here) */\n\n  while (snmp_vb_enumerator_get_next(&inbound_varbind_enumerator, &vb) == SNMP_VB_ENUMERATOR_ERR_OK) {\n    snmp_write_callback(vb.oid.id, vb.oid.len, snmp_write_callback_arg);\n  }\n}\n\n\n/* ----------------------------------------------------------------------- */\n/* VarBind enumerator methods */\n/* ----------------------------------------------------------------------- */\n\nvoid\nsnmp_vb_enumerator_init(struct snmp_varbind_enumerator* enumerator, struct pbuf* p, u16_t offset, u16_t length)\n{\n  snmp_pbuf_stream_init(&(enumerator->pbuf_stream), p, offset, length);\n  enumerator->varbind_count = 0;\n}\n\n#define VB_PARSE_EXEC(code)   PARSE_EXEC(code, SNMP_VB_ENUMERATOR_ERR_ASN1ERROR)\n#define VB_PARSE_ASSERT(code) PARSE_ASSERT(code, SNMP_VB_ENUMERATOR_ERR_ASN1ERROR)\n\nsnmp_vb_enumerator_err_t\nsnmp_vb_enumerator_get_next(struct snmp_varbind_enumerator* enumerator, struct snmp_varbind* varbind)\n{\n  struct snmp_asn1_tlv tlv;\n  u16_t  varbind_len;\n  err_t  err;\n  \n  if (enumerator->pbuf_stream.length == 0)\n  {\n    return SNMP_VB_ENUMERATOR_ERR_EOVB;\n  }\n  enumerator->varbind_count++;\n\n  /* decode varbind itself (parent container of a varbind) */\n  VB_PARSE_EXEC(snmp_asn1_dec_tlv(&(enumerator->pbuf_stream), &tlv));\n  VB_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_SEQUENCE) && (tlv.value_len <= enumerator->pbuf_stream.length));\n  varbind_len = tlv.value_len;\n\n  /* decode varbind name (object id) */\n  VB_PARSE_EXEC(snmp_asn1_dec_tlv(&(enumerator->pbuf_stream), &tlv));\n  VB_PARSE_ASSERT((tlv.type == SNMP_ASN1_TYPE_OBJECT_ID) && (SNMP_ASN1_TLV_LENGTH(tlv) < varbind_len) && (tlv.value_len < enumerator->pbuf_stream.length));\n   \n  VB_PARSE_EXEC(snmp_asn1_dec_oid(&(enumerator->pbuf_stream), tlv.value_len, varbind->oid.id, &(varbind->oid.len), SNMP_MAX_OBJ_ID_LEN));\n  varbind_len -= SNMP_ASN1_TLV_LENGTH(tlv);\n\n  /* decode varbind value (object id) */\n  VB_PARSE_EXEC(snmp_asn1_dec_tlv(&(enumerator->pbuf_stream), &tlv));\n  VB_PARSE_ASSERT((SNMP_ASN1_TLV_LENGTH(tlv) == varbind_len) && (tlv.value_len <= enumerator->pbuf_stream.length));\n  varbind->type = tlv.type;\n\n  /* shall the value be decoded ? */\n  if (varbind->value != NULL) {\n    switch (varbind->type) {\n      case SNMP_ASN1_TYPE_INTEGER:\n        VB_PARSE_EXEC(snmp_asn1_dec_s32t(&(enumerator->pbuf_stream), tlv.value_len, (s32_t*)varbind->value));\n        varbind->value_len = sizeof(s32_t*);\n        break;\n      case SNMP_ASN1_TYPE_COUNTER:\n      case SNMP_ASN1_TYPE_GAUGE:\n      case SNMP_ASN1_TYPE_TIMETICKS:\n        VB_PARSE_EXEC(snmp_asn1_dec_u32t(&(enumerator->pbuf_stream), tlv.value_len, (u32_t*)varbind->value));\n        varbind->value_len = sizeof(u32_t*);\n        break;\n      case SNMP_ASN1_TYPE_OCTET_STRING:\n      case SNMP_ASN1_TYPE_OPAQUE:\n        err = snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (u8_t*)varbind->value, &varbind->value_len, SNMP_MAX_VALUE_SIZE);\n        if (err == ERR_MEM) {\n          return SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH;\n        }\n        VB_PARSE_ASSERT(err == ERR_OK);\n        break;\n      case SNMP_ASN1_TYPE_NULL:\n        varbind->value_len = 0;\n        break;\n      case SNMP_ASN1_TYPE_OBJECT_ID:\n        /* misuse tlv.length_len as OID_length transporter */\n        err = snmp_asn1_dec_oid(&(enumerator->pbuf_stream), tlv.value_len, (u32_t*)varbind->value, &tlv.length_len, SNMP_MAX_OBJ_ID_LEN);\n        if (err == ERR_MEM) {\n          return SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH;\n        }\n        VB_PARSE_ASSERT(err == ERR_OK);\n        varbind->value_len = tlv.length_len * sizeof(u32_t);\n        break;\n      case SNMP_ASN1_TYPE_IPADDR:\n        if (tlv.value_len == 4) {\n          /* must be exactly 4 octets! */\n          VB_PARSE_EXEC(snmp_asn1_dec_raw(&(enumerator->pbuf_stream), tlv.value_len, (u8_t*)varbind->value, &varbind->value_len, SNMP_MAX_VALUE_SIZE));\n        } else {\n          VB_PARSE_ASSERT(0);\n        }\n        break;\n      case SNMP_ASN1_TYPE_COUNTER64:\n        VB_PARSE_EXEC(snmp_asn1_dec_u64t(&(enumerator->pbuf_stream), tlv.value_len, (u32_t*)varbind->value));\n        varbind->value_len = 2 * sizeof(u32_t*);\n        break;\n      default:\n        VB_PARSE_ASSERT(0);\n        break;\n    }\n  } else {\n    snmp_pbuf_stream_seek(&(enumerator->pbuf_stream), tlv.value_len);\n    varbind->value_len = tlv.value_len;\n  }\n\n  return SNMP_VB_ENUMERATOR_ERR_OK;\n}\n\n#endif /* LWIP_SNMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_msg.h",
    "content": "/**\n * @file\n * SNMP Agent message handling structures (internal API, do not use in client code).\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * Copyright (c) 2016 Elias Oenal.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Christiaan Simons <christiaan.simons@axon.tv>\n *         Martin Hentschel <info@cl-soft.de>\n *         Elias Oenal <lwip@eliasoenal.com>\n */\n\n#ifndef LWIP_HDR_APPS_SNMP_MSG_H\n#define LWIP_HDR_APPS_SNMP_MSG_H\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP\n\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"snmp_pbuf_stream.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/err.h\"\n\n#if LWIP_SNMP_V3\n#include \"snmpv3_priv.h\"\n#endif\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* The listen port of the SNMP agent. Clients have to make their requests to\n   this port. Most standard clients won't work if you change this! */\n#ifndef SNMP_IN_PORT\n#define SNMP_IN_PORT 161\n#endif\n/* The remote port the SNMP agent sends traps to. Most standard trap sinks won't\n   work if you change this! */\n#ifndef SNMP_TRAP_PORT\n#define SNMP_TRAP_PORT 162\n#endif\n\n/* version defines used in PDU */\n#define SNMP_VERSION_1  0\n#define SNMP_VERSION_2c 1\n#define SNMP_VERSION_3  3\n\nstruct snmp_varbind_enumerator\n{\n  struct snmp_pbuf_stream pbuf_stream;\n  u16_t varbind_count;\n};\n\ntypedef enum {\n  SNMP_VB_ENUMERATOR_ERR_OK            = 0,\n  SNMP_VB_ENUMERATOR_ERR_EOVB          = 1,\n  SNMP_VB_ENUMERATOR_ERR_ASN1ERROR     = 2,\n  SNMP_VB_ENUMERATOR_ERR_INVALIDLENGTH = 3\n} snmp_vb_enumerator_err_t;\n\nvoid snmp_vb_enumerator_init(struct snmp_varbind_enumerator* enumerator, struct pbuf* p, u16_t offset, u16_t length);\nsnmp_vb_enumerator_err_t snmp_vb_enumerator_get_next(struct snmp_varbind_enumerator* enumerator, struct snmp_varbind* varbind);\n\nstruct snmp_request\n{\n  /* Communication handle */\n  void *handle;\n  /* source IP address */\n  const ip_addr_t *source_ip;\n  /* source UDP port */\n  u16_t source_port;\n  /* incoming snmp version */\n  u8_t version;\n  /* community name (zero terminated) */\n  u8_t community[SNMP_MAX_COMMUNITY_STR_LEN + 1];\n  /* community string length (exclusive zero term) */\n  u16_t community_strlen;\n  /* request type */\n  u8_t request_type;\n  /* request ID */\n  s32_t request_id;\n  /* error status */\n  s32_t error_status;\n  /* error index */\n  s32_t error_index;\n  /* non-repeaters (getBulkRequest (SNMPv2c)) */\n  s32_t non_repeaters;\n  /* max-repetitions (getBulkRequest (SNMPv2c)) */\n  s32_t max_repetitions;\n  \n#if LWIP_SNMP_V3\n  s32_t msg_id;\n  s32_t msg_max_size;\n  u8_t  msg_flags;\n  s32_t msg_security_model;\n  u8_t  msg_authoritative_engine_id[SNMP_V3_MAX_ENGINE_ID_LENGTH];\n  u8_t  msg_authoritative_engine_id_len;\n  s32_t msg_authoritative_engine_boots;\n  s32_t msg_authoritative_engine_time;\n  u8_t  msg_user_name[SNMP_V3_MAX_USER_LENGTH];\n  u8_t  msg_user_name_len;\n  u8_t  msg_authentication_parameters[SNMP_V3_MAX_AUTH_PARAM_LENGTH];\n  u8_t  msg_privacy_parameters[SNMP_V3_MAX_PRIV_PARAM_LENGTH];\n  u8_t  context_engine_id[SNMP_V3_MAX_ENGINE_ID_LENGTH];\n  u8_t  context_engine_id_len;\n  u8_t  context_name[SNMP_V3_MAX_ENGINE_ID_LENGTH];\n  u8_t  context_name_len;\n#endif\n\n  struct pbuf *inbound_pbuf;\n  struct snmp_varbind_enumerator inbound_varbind_enumerator;\n  u16_t inbound_varbind_offset;\n  u16_t inbound_varbind_len;\n  u16_t inbound_padding_len;\n\n  struct pbuf *outbound_pbuf;\n  struct snmp_pbuf_stream outbound_pbuf_stream;\n  u16_t outbound_pdu_offset;\n  u16_t outbound_error_status_offset;\n  u16_t outbound_error_index_offset;\n  u16_t outbound_varbind_offset;\n#if LWIP_SNMP_V3\n  u16_t outbound_msg_global_data_offset;\n  u16_t outbound_msg_global_data_end;\n  u16_t outbound_msg_security_parameters_str_offset;\n  u16_t outbound_msg_security_parameters_seq_offset;\n  u16_t outbound_msg_security_parameters_end;\n  u16_t outbound_msg_authentication_parameters_offset;\n  u16_t outbound_scoped_pdu_seq_offset;\n  u16_t outbound_scoped_pdu_string_offset;\n#endif\n\n  u8_t value_buffer[SNMP_MAX_VALUE_SIZE];\n};\n\n/** A helper struct keeping length information about varbinds */\nstruct snmp_varbind_len\n{\n  u8_t  vb_len_len;\n  u16_t vb_value_len;\n  u8_t  oid_len_len;\n  u16_t oid_value_len;\n  u8_t  value_len_len;\n  u16_t value_value_len;\n};\n\n/** Agent community string */\nextern const char *snmp_community;\n/** Agent community string for write access */\nextern const char *snmp_community_write;\n/** handle for sending traps */\nextern void* snmp_traps_handle;\n\nvoid snmp_receive(void *handle, struct pbuf *p, const ip_addr_t *source_ip, u16_t port);\nerr_t snmp_sendto(void *handle, struct pbuf *p, const ip_addr_t *dst, u16_t port);\nu8_t snmp_get_local_ip_for_dst(void* handle, const ip_addr_t *dst, ip_addr_t *result);\nerr_t snmp_varbind_length(struct snmp_varbind *varbind, struct snmp_varbind_len *len);\nerr_t snmp_append_outbound_varbind(struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind* varbind);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_SNMP */\n\n#endif /* LWIP_HDR_APPS_SNMP_MSG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_netconn.c",
    "content": "/**\n * @file\n * SNMP netconn frontend.\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP && SNMP_USE_NETCONN\n\n#include <string.h>\n#include \"lwip/api.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/udp.h\"\n#include \"snmp_msg.h\"\n#include \"lwip/sys.h\"\n\n/** SNMP netconn API worker thread */\nstatic void\nsnmp_netconn_thread(void *arg)\n{\n  struct netconn *conn;\n  struct netbuf *buf;\n  err_t err;\n  LWIP_UNUSED_ARG(arg);\n  \n  /* Bind to SNMP port with default IP address */\n#if LWIP_IPV6\n  conn = netconn_new(NETCONN_UDP_IPV6);\n  netconn_bind(conn, IP6_ADDR_ANY, SNMP_IN_PORT);\n#else /* LWIP_IPV6 */\n  conn = netconn_new(NETCONN_UDP);\n  netconn_bind(conn, IP4_ADDR_ANY, SNMP_IN_PORT);\n#endif /* LWIP_IPV6 */\n  LWIP_ERROR(\"snmp_netconn: invalid conn\", (conn != NULL), return;);\n  \n  snmp_traps_handle = conn;\n\n  do {\n    err = netconn_recv(conn, &buf);\n\n    if (err == ERR_OK) {\n      snmp_receive(conn, buf->p, &buf->addr, buf->port);\n    }\n\n    if (buf != NULL) {\n      netbuf_delete(buf);\n    }\n  } while(1);\n}\n\nerr_t \nsnmp_sendto(void *handle, struct pbuf *p, const ip_addr_t *dst, u16_t port)\n{\n  err_t result;\n  struct netbuf buf;\n  \n  memset(&buf, 0, sizeof(buf));\n  buf.p = p;\n  result = netconn_sendto((struct netconn*)handle, &buf, dst, port);\n  \n  return result;\n}\n\nu8_t\nsnmp_get_local_ip_for_dst(void* handle, const ip_addr_t *dst, ip_addr_t *result)\n{\n  struct netconn* conn = (struct netconn*)handle;\n  struct netif *dst_if;\n  const ip_addr_t* dst_ip;\n\n  LWIP_UNUSED_ARG(conn); /* unused in case of IPV4 only configuration */\n\n  ip_route_get_local_ip(&conn->pcb.udp->local_ip, dst, dst_if, dst_ip);\n\n  if ((dst_if != NULL) && (dst_ip != NULL)) {\n    ip_addr_copy(*result, *dst_ip);\n    return 1;\n  } else {\n    return 0;\n  }\n}\n\n/**\n * Starts SNMP Agent.\n */\nvoid\nsnmp_init(void)\n{\n  sys_thread_new(\"snmp_netconn\", snmp_netconn_thread, NULL, SNMP_STACK_SIZE, SNMP_THREAD_PRIO);\n}\n\n#endif /* LWIP_SNMP && SNMP_USE_NETCONN */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_pbuf_stream.c",
    "content": "/**\n * @file\n * SNMP pbuf stream wrapper implementation (internal API, do not use in client code).\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Martin Hentschel <info@cl-soft.de>\n *\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"snmp_pbuf_stream.h\"\n#include \"lwip/def.h\"\n#include <string.h>\n\nerr_t\nsnmp_pbuf_stream_init(struct snmp_pbuf_stream* pbuf_stream, struct pbuf* p, u16_t offset, u16_t length)\n{\n  pbuf_stream->offset = offset;\n  pbuf_stream->length = length;\n  pbuf_stream->pbuf   = p;\n\n  return ERR_OK;\n}\n\nerr_t\nsnmp_pbuf_stream_read(struct snmp_pbuf_stream* pbuf_stream, u8_t* data)\n{\n  if (pbuf_stream->length == 0) {\n    return ERR_BUF;\n  }\n\n  if (pbuf_copy_partial(pbuf_stream->pbuf, data, 1, pbuf_stream->offset) == 0) {\n    return ERR_BUF;\n  }\n\n  pbuf_stream->offset++;\n  pbuf_stream->length--;\n\n  return ERR_OK;\n}\n\nerr_t\nsnmp_pbuf_stream_write(struct snmp_pbuf_stream* pbuf_stream, u8_t data)\n{\n  return snmp_pbuf_stream_writebuf(pbuf_stream, &data, 1);\n}\n\nerr_t\nsnmp_pbuf_stream_writebuf(struct snmp_pbuf_stream* pbuf_stream, const void* buf, u16_t buf_len)\n{\n  if (pbuf_stream->length < buf_len) {\n    return ERR_BUF;\n  }\n\n  if (pbuf_take_at(pbuf_stream->pbuf, buf, buf_len, pbuf_stream->offset) != ERR_OK) {\n    return ERR_BUF;\n  }\n\n  pbuf_stream->offset += buf_len;\n  pbuf_stream->length -= buf_len;\n\n  return ERR_OK;\n}\n\nerr_t\nsnmp_pbuf_stream_writeto(struct snmp_pbuf_stream* pbuf_stream, struct snmp_pbuf_stream* target_pbuf_stream, u16_t len)\n{\n\n  if ((pbuf_stream == NULL) || (target_pbuf_stream == NULL)) {\n    return ERR_ARG;\n  }\n  if ((len > pbuf_stream->length) || (len > target_pbuf_stream->length)) {\n    return ERR_ARG;\n  }\n\n  if (len == 0) {\n    len = LWIP_MIN(pbuf_stream->length, target_pbuf_stream->length);\n  }\n\n  while (len > 0) {\n    u16_t chunk_len;\n    err_t err;\n    u16_t target_offset;\n    struct pbuf* pbuf = pbuf_skip(pbuf_stream->pbuf, pbuf_stream->offset, &target_offset);\n\n    if ((pbuf == NULL) || (pbuf->len == 0)) {\n      return ERR_BUF;\n    }\n\n    chunk_len = LWIP_MIN(len, pbuf->len);\n    err = snmp_pbuf_stream_writebuf(target_pbuf_stream, &((u8_t*)pbuf->payload)[target_offset], chunk_len);\n    if (err != ERR_OK) {\n      return err;\n    }\n\n    pbuf_stream->offset   += chunk_len;\n    pbuf_stream->length   -= chunk_len;\n    len -= chunk_len;\n  }\n\n  return ERR_OK;\n}\n\nerr_t\nsnmp_pbuf_stream_seek(struct snmp_pbuf_stream* pbuf_stream, s32_t offset)\n{\n  if ((offset < 0) || (offset > pbuf_stream->length)) {\n    /* we cannot seek backwards or forward behind stream end */\n    return ERR_ARG;\n  }\n\n  pbuf_stream->offset += (u16_t)offset;\n  pbuf_stream->length -= (u16_t)offset;\n\n  return ERR_OK;\n}\n\nerr_t\nsnmp_pbuf_stream_seek_abs(struct snmp_pbuf_stream* pbuf_stream, u32_t offset)\n{\n  s32_t rel_offset = offset - pbuf_stream->offset;\n  return snmp_pbuf_stream_seek(pbuf_stream, rel_offset);\n}\n\n#endif /* LWIP_SNMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_pbuf_stream.h",
    "content": "/**\n * @file\n * SNMP pbuf stream wrapper (internal API, do not use in client code).\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Martin Hentschel <info@cl-soft.de>\n *\n */\n\n#ifndef LWIP_HDR_APPS_SNMP_PBUF_STREAM_H\n#define LWIP_HDR_APPS_SNMP_PBUF_STREAM_H\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP\n\n#include \"lwip/err.h\"\n#include \"lwip/pbuf.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct snmp_pbuf_stream\n{\n  struct pbuf* pbuf;\n  u16_t offset;\n  u16_t length;\n};\n\nerr_t snmp_pbuf_stream_init(struct snmp_pbuf_stream* pbuf_stream, struct pbuf* p, u16_t offset, u16_t length);\nerr_t snmp_pbuf_stream_read(struct snmp_pbuf_stream* pbuf_stream, u8_t* data);\nerr_t snmp_pbuf_stream_write(struct snmp_pbuf_stream* pbuf_stream, u8_t data);\nerr_t snmp_pbuf_stream_writebuf(struct snmp_pbuf_stream* pbuf_stream, const void* buf, u16_t buf_len);\nerr_t snmp_pbuf_stream_writeto(struct snmp_pbuf_stream* pbuf_stream, struct snmp_pbuf_stream* target_pbuf_stream, u16_t len);\nerr_t snmp_pbuf_stream_seek(struct snmp_pbuf_stream* pbuf_stream, s32_t offset);\nerr_t snmp_pbuf_stream_seek_abs(struct snmp_pbuf_stream* pbuf_stream, u32_t offset);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_SNMP */\n\n#endif /* LWIP_HDR_APPS_SNMP_PBUF_STREAM_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_raw.c",
    "content": "/**\n * @file\n * SNMP RAW API frontend.\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n#include \"lwip/ip_addr.h\"\n\n#if LWIP_SNMP && SNMP_USE_RAW\n\n#include \"lwip/udp.h\"\n#include \"lwip/ip.h\"\n#include \"snmp_msg.h\"\n\n/* lwIP UDP receive callback function */\nstatic void\nsnmp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)\n{\n  LWIP_UNUSED_ARG(arg);\n\n  snmp_receive(pcb, p, addr, port);\n\n  pbuf_free(p);\n}\n\nerr_t \nsnmp_sendto(void *handle, struct pbuf *p, const ip_addr_t *dst, u16_t port)\n{\n  return udp_sendto((struct udp_pcb*)handle, p, dst, port);\n}\n\nu8_t\nsnmp_get_local_ip_for_dst(void* handle, const ip_addr_t *dst, ip_addr_t *result)\n{\n  struct udp_pcb* udp_pcb = (struct udp_pcb*)handle;\n  struct netif *dst_if;\n  const ip_addr_t* dst_ip;\n\n  LWIP_UNUSED_ARG(udp_pcb); /* unused in case of IPV4 only configuration */\n\n  ip_route_get_local_ip(&udp_pcb->local_ip, dst, dst_if, dst_ip);\n\n  if ((dst_if != NULL) && (dst_ip != NULL)) {\n    ip_addr_copy(*result, *dst_ip);\n    return 1;\n  } else {\n    return 0;\n  }\n}\n\n/**\n * @ingroup snmp_core\n * Starts SNMP Agent.\n * Allocates UDP pcb and binds it to IP_ANY_TYPE port 161.\n */\nvoid\nsnmp_init(void)\n{\n  err_t err;\n  \n  struct udp_pcb *snmp_pcb = udp_new_ip_type(IPADDR_TYPE_ANY);\n  LWIP_ERROR(\"snmp_raw: no PCB\", (snmp_pcb != NULL), return;);\n\n  snmp_traps_handle = snmp_pcb;\n\n  udp_recv(snmp_pcb, snmp_recv, (void *)SNMP_IN_PORT);\n  err = udp_bind(snmp_pcb, IP_ANY_TYPE, SNMP_IN_PORT);\n  LWIP_ERROR(\"snmp_raw: Unable to bind PCB\", (err == ERR_OK), return;);\n}\n\n#endif /* LWIP_SNMP && SNMP_USE_RAW */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_scalar.c",
    "content": "/**\n * @file\n * SNMP scalar node support implementation.\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Martin Hentschel <info@cl-soft.de>\n *\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/apps/snmp_scalar.h\"\n#include \"lwip/apps/snmp_core.h\"\n\nstatic s16_t snmp_scalar_array_get_value(struct snmp_node_instance* instance, void* value);\nstatic snmp_err_t  snmp_scalar_array_set_test(struct snmp_node_instance* instance, u16_t value_len, void* value);\nstatic snmp_err_t  snmp_scalar_array_set_value(struct snmp_node_instance* instance, u16_t value_len, void* value);\n\nsnmp_err_t \nsnmp_scalar_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)\n{\n  const struct snmp_scalar_node* scalar_node = (const struct snmp_scalar_node*)(const void*)instance->node;\n\n  LWIP_UNUSED_ARG(root_oid);\n  LWIP_UNUSED_ARG(root_oid_len);\n\n  /* scalar only has one dedicated instance: .0 */\n  if ((instance->instance_oid.len != 1) || (instance->instance_oid.id[0] != 0)) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  instance->access    = scalar_node->access;\n  instance->asn1_type = scalar_node->asn1_type;\n  instance->get_value = scalar_node->get_value;\n  instance->set_test  = scalar_node->set_test;\n  instance->set_value = scalar_node->set_value;\n  return SNMP_ERR_NOERROR;\n}\n\nsnmp_err_t \nsnmp_scalar_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)\n{\n  /* because our only instance is .0 we can only return a next instance if no instance oid is passed */\n  if (instance->instance_oid.len == 0) {\n    instance->instance_oid.len   = 1;\n    instance->instance_oid.id[0] = 0;\n\n    return snmp_scalar_get_instance(root_oid, root_oid_len, instance);\n  }\n\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\n\nsnmp_err_t\nsnmp_scalar_array_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)\n{\n  LWIP_UNUSED_ARG(root_oid);\n  LWIP_UNUSED_ARG(root_oid_len);\n\n  if ((instance->instance_oid.len == 2) && (instance->instance_oid.id[1] == 0)) {\n    const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node;\n    const struct snmp_scalar_array_node_def* array_node_def = array_node->array_nodes;\n    u32_t i = 0;\n\n    while (i < array_node->array_node_count) {\n      if (array_node_def->oid == instance->instance_oid.id[0]) {\n        break;\n      }\n\n      array_node_def++;\n      i++;\n    }\n\n    if (i < array_node->array_node_count) {\n      instance->access              = array_node_def->access;\n      instance->asn1_type           = array_node_def->asn1_type;\n      instance->get_value           = snmp_scalar_array_get_value;\n      instance->set_test            = snmp_scalar_array_set_test;\n      instance->set_value           = snmp_scalar_array_set_value;\n      instance->reference.const_ptr = array_node_def;\n\n      return SNMP_ERR_NOERROR;\n    }\n  }\n\n  return SNMP_ERR_NOSUCHINSTANCE;\n}\n\nsnmp_err_t\nsnmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)\n{\n  const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node;\n  const struct snmp_scalar_array_node_def* array_node_def = array_node->array_nodes;\n  const struct snmp_scalar_array_node_def* result = NULL;\n\n  LWIP_UNUSED_ARG(root_oid);\n  LWIP_UNUSED_ARG(root_oid_len);\n\n  if ((instance->instance_oid.len == 0) && (array_node->array_node_count > 0)) {\n    /* return node with lowest OID */\n    u16_t i = 0;\n    \n    result = array_node_def;\n    array_node_def++;\n\n    for (i = 1; i < array_node->array_node_count; i++) {\n      if (array_node_def->oid < result->oid) {\n        result = array_node_def;\n      }\n      array_node_def++;\n    }\n  } else if (instance->instance_oid.len >= 1) {\n    if (instance->instance_oid.len == 1) {\n      /* if we have the requested OID we return its instance, otherwise we search for the next available */    \n      u16_t i = 0;\n      while (i < array_node->array_node_count) {\n        if (array_node_def->oid == instance->instance_oid.id[0]) {\n          result = array_node_def;\n          break;\n        }\n\n        array_node_def++;\n        i++;\n      }\n    }\n    if (result == NULL) {\n      u32_t oid_dist = 0xFFFFFFFFUL;\n      u16_t i        = 0;\n      array_node_def = array_node->array_nodes; /* may be already at the end when if case before was executed without result -> reinitialize to start */\n      while (i < array_node->array_node_count) {\n        if ((array_node_def->oid > instance->instance_oid.id[0]) &&\n            ((u32_t)(array_node_def->oid - instance->instance_oid.id[0]) < oid_dist)) {\n          result   = array_node_def;\n          oid_dist = array_node_def->oid - instance->instance_oid.id[0];\n        }\n\n        array_node_def++;\n        i++;\n      }\n    }\n  }\n\n  if (result == NULL) {\n    /* nothing to return */\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  instance->instance_oid.len   = 2;\n  instance->instance_oid.id[0] = result->oid;\n  instance->instance_oid.id[1] = 0;\n  \n  instance->access              = result->access;\n  instance->asn1_type           = result->asn1_type;\n  instance->get_value           = snmp_scalar_array_get_value;\n  instance->set_test            = snmp_scalar_array_set_test;\n  instance->set_value           = snmp_scalar_array_set_value;\n  instance->reference.const_ptr = result;\n\n  return SNMP_ERR_NOERROR;\n}\n\nstatic s16_t\nsnmp_scalar_array_get_value(struct snmp_node_instance* instance, void* value)\n{\n  const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node;\n  const struct snmp_scalar_array_node_def* array_node_def = (const struct snmp_scalar_array_node_def*)instance->reference.const_ptr;\n\n  return array_node->get_value(array_node_def, value);\n}\n\nstatic snmp_err_t\nsnmp_scalar_array_set_test(struct snmp_node_instance* instance, u16_t value_len, void* value)\n{\n  const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node;\n  const struct snmp_scalar_array_node_def* array_node_def = (const struct snmp_scalar_array_node_def*)instance->reference.const_ptr;\n\n  return array_node->set_test(array_node_def, value_len, value);\n}\n\nstatic snmp_err_t\nsnmp_scalar_array_set_value(struct snmp_node_instance* instance, u16_t value_len, void* value)\n{\n  const struct snmp_scalar_array_node* array_node = (const struct snmp_scalar_array_node*)(const void*)instance->node;\n  const struct snmp_scalar_array_node_def* array_node_def = (const struct snmp_scalar_array_node_def*)instance->reference.const_ptr;\n\n  return array_node->set_value(array_node_def, value_len, value);\n}\n\n#endif /* LWIP_SNMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_table.c",
    "content": "/**\n * @file\n * SNMP table support implementation.\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Martin Hentschel <info@cl-soft.de>\n *\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/apps/snmp_table.h\"\n#include <string.h>\n\nsnmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)\n{\n  snmp_err_t ret = SNMP_ERR_NOSUCHINSTANCE;\n  const struct snmp_table_node* table_node = (const struct snmp_table_node*)(const void*)instance->node;\n\n  LWIP_UNUSED_ARG(root_oid);\n  LWIP_UNUSED_ARG(root_oid_len);\n\n  /* check min. length (fixed row entry definition, column, row instance oid with at least one entry */\n  /* fixed row entry always has oid 1 */\n  if ((instance->instance_oid.len >= 3) && (instance->instance_oid.id[0] == 1)) {\n    /* search column */\n    const struct snmp_table_col_def* col_def = table_node->columns;\n    u16_t i = table_node->column_count;\n    while (i > 0) {\n      if (col_def->index == instance->instance_oid.id[1]) {\n        break;\n      }\n      \n      col_def++;\n      i--;\n    }\n\n    if (i > 0) {\n      /* everything may be overwritten by get_cell_instance_method() in order to implement special handling for single columns/cells */\n      instance->asn1_type = col_def->asn1_type;\n      instance->access    = col_def->access;\n      instance->get_value = table_node->get_value;\n      instance->set_test  = table_node->set_test;\n      instance->set_value = table_node->set_value;\n\n      ret = table_node->get_cell_instance(\n        &(instance->instance_oid.id[1]),\n        &(instance->instance_oid.id[2]),\n        instance->instance_oid.len-2,\n        instance);\n    }\n  }\n\n  return ret;\n}\n\nsnmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)\n{\n  const struct snmp_table_node* table_node = (const struct snmp_table_node*)(const void*)instance->node;\n  const struct snmp_table_col_def* col_def;\n  struct snmp_obj_id row_oid;\n  u32_t column = 0;\n  snmp_err_t result;\n\n  LWIP_UNUSED_ARG(root_oid);\n  LWIP_UNUSED_ARG(root_oid_len);\n\n  /* check that first part of id is 0 or 1, referencing fixed row entry */\n  if ((instance->instance_oid.len > 0) && (instance->instance_oid.id[0] > 1)) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n  if (instance->instance_oid.len > 1) {\n    column = instance->instance_oid.id[1];\n  }\n  if (instance->instance_oid.len > 2) {\n    snmp_oid_assign(&row_oid, &(instance->instance_oid.id[2]), instance->instance_oid.len - 2);\n  } else {\n    row_oid.len = 0;\n  }\n\n  instance->get_value    = table_node->get_value;\n  instance->set_test     = table_node->set_test;\n  instance->set_value    = table_node->set_value;\n\n  /* resolve column and value */\n  do {\n    u16_t i;\n    const struct snmp_table_col_def* next_col_def = NULL;\n    col_def = table_node->columns;\n\n    for (i = 0; i < table_node->column_count; i++) {\n      if (col_def->index == column) {\n        next_col_def = col_def;\n        break;\n      } else if ((col_def->index > column) && ((next_col_def == NULL) || (col_def->index < next_col_def->index))) {\n        next_col_def = col_def;\n      }\n      col_def++;\n    }\n\n    if (next_col_def == NULL) {\n      /* no further column found */\n      return SNMP_ERR_NOSUCHINSTANCE;\n    }\n\n    instance->asn1_type          = next_col_def->asn1_type;\n    instance->access             = next_col_def->access;\n\n    result = table_node->get_next_cell_instance(\n      &next_col_def->index,\n      &row_oid,\n      instance);\n\n    if (result == SNMP_ERR_NOERROR) {\n      col_def = next_col_def;\n      break;\n    }\n\n    row_oid.len = 0; /* reset row_oid because we switch to next column and start with the first entry there */\n    column = next_col_def->index + 1;\n  } while (1);\n\n  /* build resulting oid */\n  instance->instance_oid.len   = 2;\n  instance->instance_oid.id[0] = 1;\n  instance->instance_oid.id[1] = col_def->index;\n  snmp_oid_append(&instance->instance_oid, row_oid.id, row_oid.len);\n\n  return SNMP_ERR_NOERROR;\n}\n\n\nsnmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)\n{\n  snmp_err_t ret = SNMP_ERR_NOSUCHINSTANCE;\n  const struct snmp_table_simple_node* table_node = (const struct snmp_table_simple_node*)(const void*)instance->node;\n\n  LWIP_UNUSED_ARG(root_oid);\n  LWIP_UNUSED_ARG(root_oid_len);\n\n  /* check min. length (fixed row entry definition, column, row instance oid with at least one entry */\n  /* fixed row entry always has oid 1 */\n  if ((instance->instance_oid.len >= 3) && (instance->instance_oid.id[0] == 1)) {\n    ret = table_node->get_cell_value(\n      &(instance->instance_oid.id[1]),\n      &(instance->instance_oid.id[2]),\n      instance->instance_oid.len-2,\n      &instance->reference,\n      &instance->reference_len);\n\n    if (ret == SNMP_ERR_NOERROR) {\n      /* search column */\n      const struct snmp_table_simple_col_def* col_def = table_node->columns;\n      u32_t i = table_node->column_count;\n      while (i > 0) {\n        if (col_def->index == instance->instance_oid.id[1]) {\n          break;\n        }\n\n        col_def++;\n        i--;\n      }\n\n      if (i > 0) {\n        instance->asn1_type = col_def->asn1_type;\n        instance->access    = SNMP_NODE_INSTANCE_READ_ONLY;\n        instance->set_test  = NULL;\n        instance->set_value = NULL;\n\n        switch (col_def->data_type) {\n          case SNMP_VARIANT_VALUE_TYPE_U32:\n            instance->get_value = snmp_table_extract_value_from_u32ref;\n            break;\n          case SNMP_VARIANT_VALUE_TYPE_S32:\n            instance->get_value = snmp_table_extract_value_from_s32ref;\n            break;\n          case SNMP_VARIANT_VALUE_TYPE_PTR: /* fall through */\n          case SNMP_VARIANT_VALUE_TYPE_CONST_PTR:\n            instance->get_value = snmp_table_extract_value_from_refconstptr;\n            break;\n          default:\n            LWIP_DEBUGF(SNMP_DEBUG, (\"snmp_table_simple_get_instance(): unknown column data_type: %d\\n\", col_def->data_type));\n            return SNMP_ERR_GENERROR;\n        }        \n\n        ret = SNMP_ERR_NOERROR;\n      } else {\n        ret = SNMP_ERR_NOSUCHINSTANCE;\n      }\n    } \n  }\n\n  return ret;\n}\n\nsnmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)\n{\n  const struct snmp_table_simple_node* table_node = (const struct snmp_table_simple_node*)(const void*)instance->node;\n  const struct snmp_table_simple_col_def* col_def;\n  struct snmp_obj_id row_oid;\n  u32_t column = 0;\n  snmp_err_t result;\n\n  LWIP_UNUSED_ARG(root_oid);\n  LWIP_UNUSED_ARG(root_oid_len);\n\n  /* check that first part of id is 0 or 1, referencing fixed row entry */\n  if ((instance->instance_oid.len > 0) && (instance->instance_oid.id[0] > 1)) {\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n  if (instance->instance_oid.len > 1) {\n    column = instance->instance_oid.id[1];\n  }\n  if (instance->instance_oid.len > 2) {\n    snmp_oid_assign(&row_oid, &(instance->instance_oid.id[2]), instance->instance_oid.len - 2);\n  } else {\n    row_oid.len = 0;\n  }\n\n  /* resolve column and value */\n  do {\n    u32_t i;\n    const struct snmp_table_simple_col_def* next_col_def = NULL;\n    col_def = table_node->columns;\n\n    for (i = 0; i < table_node->column_count; i++) {\n      if (col_def->index == column) {\n        next_col_def = col_def;\n        break;\n      } else if ((col_def->index > column) && ((next_col_def == NULL) ||\n                 (col_def->index < next_col_def->index))) {\n        next_col_def = col_def;\n      }\n      col_def++;\n    }\n\n    if (next_col_def == NULL) {\n      /* no further column found */\n      return SNMP_ERR_NOSUCHINSTANCE;\n    }\n\n    result = table_node->get_next_cell_instance_and_value(\n      &next_col_def->index,\n      &row_oid,\n      &instance->reference,\n      &instance->reference_len);\n\n    if (result == SNMP_ERR_NOERROR) {\n      col_def = next_col_def;\n      break;\n    }\n\n    row_oid.len = 0; /* reset row_oid because we switch to next column and start with the first entry there */\n    column = next_col_def->index + 1;\n  }\n  while (1);\n\n  instance->asn1_type = col_def->asn1_type;\n  instance->access    = SNMP_NODE_INSTANCE_READ_ONLY;\n  instance->set_test  = NULL;\n  instance->set_value = NULL;\n\n  switch (col_def->data_type) {\n    case SNMP_VARIANT_VALUE_TYPE_U32:\n      instance->get_value = snmp_table_extract_value_from_u32ref;\n      break;\n    case SNMP_VARIANT_VALUE_TYPE_S32:\n      instance->get_value = snmp_table_extract_value_from_s32ref;\n      break;\n    case SNMP_VARIANT_VALUE_TYPE_PTR: /* fall through */\n    case SNMP_VARIANT_VALUE_TYPE_CONST_PTR:\n      instance->get_value = snmp_table_extract_value_from_refconstptr;\n      break;\n    default:\n      LWIP_DEBUGF(SNMP_DEBUG, (\"snmp_table_simple_get_instance(): unknown column data_type: %d\\n\", col_def->data_type));\n      return SNMP_ERR_GENERROR;\n  }\n\n  /* build resulting oid */\n  instance->instance_oid.len   = 2;\n  instance->instance_oid.id[0] = 1;\n  instance->instance_oid.id[1] = col_def->index;\n  snmp_oid_append(&instance->instance_oid, row_oid.id, row_oid.len);\n\n  return SNMP_ERR_NOERROR;\n}\n\n\ns16_t\nsnmp_table_extract_value_from_s32ref(struct snmp_node_instance* instance, void* value)\n{\n  s32_t *dst = (s32_t*)value;\n  *dst = instance->reference.s32;\n  return sizeof(*dst);\n}\n\ns16_t\nsnmp_table_extract_value_from_u32ref(struct snmp_node_instance* instance, void* value)\n{\n  u32_t *dst = (u32_t*)value;\n  *dst = instance->reference.u32;\n  return sizeof(*dst);\n}\n\ns16_t\nsnmp_table_extract_value_from_refconstptr(struct snmp_node_instance* instance, void* value)\n{\n  MEMCPY(value, instance->reference.const_ptr, instance->reference_len);\n  return (u16_t)instance->reference_len;\n}\n\n#endif /* LWIP_SNMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_threadsync.c",
    "content": "/**\n * @file\n * SNMP thread synchronization implementation.\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP && (NO_SYS == 0) /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/apps/snmp_threadsync.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/sys.h\"\n#include <string.h>\n        \nstatic void\ncall_synced_function(struct threadsync_data *call_data, snmp_threadsync_called_fn fn)\n{\n  sys_mutex_lock(&call_data->threadsync_node->instance->sem_usage_mutex);\n  call_data->threadsync_node->instance->sync_fn(fn, call_data);\n  sys_sem_wait(&call_data->threadsync_node->instance->sem);\n  sys_mutex_unlock(&call_data->threadsync_node->instance->sem_usage_mutex);\n}\n\nstatic void\nthreadsync_get_value_synced(void *ctx)\n{\n  struct threadsync_data *call_data = (struct threadsync_data*)ctx;\n\n  call_data->retval.s16 = call_data->proxy_instance.get_value(&call_data->proxy_instance, call_data->arg1.value);\n\n  sys_sem_signal(&call_data->threadsync_node->instance->sem);\n}\n\nstatic s16_t\nthreadsync_get_value(struct snmp_node_instance* instance, void* value)\n{\n  struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr;\n\n  call_data->arg1.value = value;\n  call_synced_function(call_data, threadsync_get_value_synced);\n\n  return call_data->retval.s16;\n}\n\nstatic void\nthreadsync_set_test_synced(void *ctx)\n{\n  struct threadsync_data *call_data = (struct threadsync_data*)ctx;\n\n  call_data->retval.err = call_data->proxy_instance.set_test(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value);\n\n  sys_sem_signal(&call_data->threadsync_node->instance->sem);\n}\n\nstatic snmp_err_t\nthreadsync_set_test(struct snmp_node_instance* instance, u16_t len, void *value)\n{\n  struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr;\n\n  call_data->arg1.value = value;\n  call_data->arg2.len = len;\n  call_synced_function(call_data, threadsync_set_test_synced);\n\n  return call_data->retval.err;\n}\n\nstatic void\nthreadsync_set_value_synced(void *ctx)\n{\n  struct threadsync_data *call_data = (struct threadsync_data*)ctx;\n\n  call_data->retval.err = call_data->proxy_instance.set_value(&call_data->proxy_instance, call_data->arg2.len, call_data->arg1.value);\n\n  sys_sem_signal(&call_data->threadsync_node->instance->sem);\n}\n\nstatic snmp_err_t\nthreadsync_set_value(struct snmp_node_instance* instance, u16_t len, void *value)\n{\n  struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr;\n\n  call_data->arg1.value = value;\n  call_data->arg2.len = len;\n  call_synced_function(call_data, threadsync_set_value_synced);\n  \n  return call_data->retval.err;\n}\n\nstatic void\nthreadsync_release_instance_synced(void* ctx)\n{\n  struct threadsync_data *call_data = (struct threadsync_data*)ctx;\n  \n  call_data->proxy_instance.release_instance(&call_data->proxy_instance);\n\n  sys_sem_signal(&call_data->threadsync_node->instance->sem);\n}\n\nstatic void\nthreadsync_release_instance(struct snmp_node_instance *instance)\n{\n  struct threadsync_data *call_data = (struct threadsync_data*)instance->reference.ptr;\n  \n  if (call_data->proxy_instance.release_instance != NULL) {\n    call_synced_function(call_data, threadsync_release_instance_synced);\n  }\n}\n\nstatic void\nget_instance_synced(void* ctx)\n{\n  struct threadsync_data *call_data   = (struct threadsync_data*)ctx;\n  const struct snmp_leaf_node *leaf   = (const struct snmp_leaf_node*)(const void*)call_data->proxy_instance.node;\n\n  call_data->retval.err = leaf->get_instance(call_data->arg1.root_oid, call_data->arg2.root_oid_len, &call_data->proxy_instance);\n\n  sys_sem_signal(&call_data->threadsync_node->instance->sem);\n}\n\nstatic void\nget_next_instance_synced(void* ctx)\n{\n  struct threadsync_data *call_data   = (struct threadsync_data*)ctx;\n  const struct snmp_leaf_node *leaf   = (const struct snmp_leaf_node*)(const void*)call_data->proxy_instance.node;\n\n  call_data->retval.err = leaf->get_next_instance(call_data->arg1.root_oid, call_data->arg2.root_oid_len, &call_data->proxy_instance);\n\n  sys_sem_signal(&call_data->threadsync_node->instance->sem);\n}\n\nstatic snmp_err_t\ndo_sync(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance, snmp_threadsync_called_fn fn)\n{\n  const struct snmp_threadsync_node *threadsync_node = (const struct snmp_threadsync_node*)(const void*)instance->node;\n  struct threadsync_data *call_data = &threadsync_node->instance->data;\n\n  if (threadsync_node->node.node.oid != threadsync_node->target->node.oid) {\n    LWIP_DEBUGF(SNMP_DEBUG, (\"Sync node OID does not match target node OID\"));\n    return SNMP_ERR_NOSUCHINSTANCE;\n  }\n\n  memset(&call_data->proxy_instance, 0, sizeof(call_data->proxy_instance));\n\n  instance->reference.ptr = call_data;\n  snmp_oid_assign(&call_data->proxy_instance.instance_oid, instance->instance_oid.id, instance->instance_oid.len);\n\n  call_data->proxy_instance.node = &threadsync_node->target->node;\n  call_data->threadsync_node     = threadsync_node;\n\n  call_data->arg1.root_oid       = root_oid;\n  call_data->arg2.root_oid_len   = root_oid_len;\n  call_synced_function(call_data, fn);\n\n  if (call_data->retval.err == SNMP_ERR_NOERROR) {\n    instance->access           = call_data->proxy_instance.access;\n    instance->asn1_type        = call_data->proxy_instance.asn1_type;\n    instance->release_instance = threadsync_release_instance;\n    instance->get_value        = (call_data->proxy_instance.get_value != NULL)? threadsync_get_value : NULL;\n    instance->set_value        = (call_data->proxy_instance.set_value != NULL)? threadsync_set_value : NULL;\n    instance->set_test         = (call_data->proxy_instance.set_test != NULL)?  threadsync_set_test  : NULL;\n    snmp_oid_assign(&instance->instance_oid, call_data->proxy_instance.instance_oid.id, call_data->proxy_instance.instance_oid.len);\n  }\n\n  return call_data->retval.err;\n}\n\nsnmp_err_t\nsnmp_threadsync_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)\n{\n  return do_sync(root_oid, root_oid_len, instance, get_instance_synced);\n}\n\nsnmp_err_t\nsnmp_threadsync_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance)\n{\n  return do_sync(root_oid, root_oid_len, instance, get_next_instance_synced);\n}\n\n/** Initializes thread synchronization instance */\nvoid snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn)\n{\n  err_t err = sys_mutex_new(&instance->sem_usage_mutex);\n  LWIP_ASSERT(\"Failed to set up mutex\", err == ERR_OK);\n  err = sys_sem_new(&instance->sem, 0);\n  LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */\n  LWIP_ASSERT(\"Failed to set up semaphore\", err == ERR_OK);\n  instance->sync_fn = sync_fn;\n}\n\n#endif /* LWIP_SNMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmp_traps.c",
    "content": "/**\n * @file\n * SNMPv1 traps implementation.\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Martin Hentschel\n *         Christiaan Simons <christiaan.simons@axon.tv>\n *\n */\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include <string.h>\n\n#include \"lwip/snmp.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/apps/snmp.h\"\n#include \"lwip/apps/snmp_core.h\"\n#include \"snmp_msg.h\"\n#include \"snmp_asn1.h\"\n#include \"snmp_core_priv.h\"\n\nstruct snmp_msg_trap\n{\n  /* source enterprise ID (sysObjectID) */\n  const struct snmp_obj_id *enterprise;\n  /* source IP address, raw network order format */\n  ip_addr_t sip;\n  /* generic trap code */\n  u32_t gen_trap;\n  /* specific trap code */\n  u32_t spc_trap;\n  /* timestamp */\n  u32_t ts;\n  /* snmp_version */\n  u32_t snmp_version;\n\n  /* output trap lengths used in ASN encoding */\n  /* encoding pdu length */\n  u16_t pdulen;\n  /* encoding community length */\n  u16_t comlen;\n  /* encoding sequence length */\n  u16_t seqlen;\n  /* encoding varbinds sequence length */\n  u16_t vbseqlen;\n};\n\nstatic u16_t snmp_trap_varbind_sum(struct snmp_msg_trap *trap, struct snmp_varbind *varbinds);\nstatic u16_t snmp_trap_header_sum(struct snmp_msg_trap *trap, u16_t vb_len);\nstatic void snmp_trap_header_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream);\nstatic void snmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbinds);\n\n/** Agent community string for sending traps */\nextern const char *snmp_community_trap;\n\nvoid* snmp_traps_handle;\n\nstruct snmp_trap_dst\n{\n  /* destination IP address in network order */\n  ip_addr_t dip;\n  /* set to 0 when disabled, >0 when enabled */\n  u8_t enable;\n};\nstatic struct snmp_trap_dst trap_dst[SNMP_TRAP_DESTINATIONS];\n\nstatic u8_t snmp_auth_traps_enabled = 0;\n\n/**\n * @ingroup snmp_traps\n * Sets enable switch for this trap destination.\n * @param dst_idx index in 0 .. SNMP_TRAP_DESTINATIONS-1\n * @param enable switch if 0 destination is disabled >0 enabled.\n */\nvoid\nsnmp_trap_dst_enable(u8_t dst_idx, u8_t enable)\n{\n  if (dst_idx < SNMP_TRAP_DESTINATIONS) {\n    trap_dst[dst_idx].enable = enable;\n  }\n}\n\n/**\n * @ingroup snmp_traps\n * Sets IPv4 address for this trap destination.\n * @param dst_idx index in 0 .. SNMP_TRAP_DESTINATIONS-1\n * @param dst IPv4 address in host order.\n */\nvoid\nsnmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst)\n{\n  if (dst_idx < SNMP_TRAP_DESTINATIONS) {\n    ip_addr_set(&trap_dst[dst_idx].dip, dst);\n  }\n}\n\n/**\n * @ingroup snmp_traps\n * Enable/disable authentication traps\n */\nvoid\nsnmp_set_auth_traps_enabled(u8_t enable)\n{\n  snmp_auth_traps_enabled = enable;\n}\n\n/**\n * @ingroup snmp_traps\n * Get authentication traps enabled state\n */\nu8_t\nsnmp_get_auth_traps_enabled(void)\n{\n  return snmp_auth_traps_enabled;\n}\n\n\n/**\n * @ingroup snmp_traps\n * Sends a generic or enterprise specific trap message.\n *\n * @param eoid points to enterprise object identifier\n * @param generic_trap is the trap code\n * @param specific_trap used for enterprise traps when generic_trap == 6\n * @param varbinds linked list of varbinds to be sent\n * @return ERR_OK when success, ERR_MEM if we're out of memory\n *\n * @note the use of the enterprise identifier field\n * is per RFC1215.\n * Use .iso.org.dod.internet.mgmt.mib-2.snmp for generic traps\n * and .iso.org.dod.internet.private.enterprises.yourenterprise\n * (sysObjectID) for specific traps.\n */\nerr_t\nsnmp_send_trap(const struct snmp_obj_id* eoid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds)\n{\n  struct snmp_msg_trap trap_msg;\n  struct snmp_trap_dst *td;\n  struct pbuf *p;\n  u16_t i, tot_len;\n  err_t err = ERR_OK;\n\n  trap_msg.snmp_version = 0;\n\n  for (i = 0, td = &trap_dst[0]; i < SNMP_TRAP_DESTINATIONS; i++, td++) {\n    if ((td->enable != 0) && !ip_addr_isany(&td->dip)) {\n      /* lookup current source address for this dst */\n      if (snmp_get_local_ip_for_dst(snmp_traps_handle, &td->dip, &trap_msg.sip)) {\n        if (eoid == NULL) {\n          trap_msg.enterprise = snmp_get_device_enterprise_oid();\n        } else {\n          trap_msg.enterprise = eoid;\n        }\n\n        trap_msg.gen_trap = generic_trap;\n        if (generic_trap == SNMP_GENTRAP_ENTERPRISE_SPECIFIC) {\n          trap_msg.spc_trap = specific_trap;\n        } else {\n          trap_msg.spc_trap = 0;\n        }\n\n        MIB2_COPY_SYSUPTIME_TO(&trap_msg.ts);\n\n        /* pass 0, calculate length fields */\n        tot_len = snmp_trap_varbind_sum(&trap_msg, varbinds);\n        tot_len = snmp_trap_header_sum(&trap_msg, tot_len);\n\n        /* allocate pbuf(s) */\n        p = pbuf_alloc(PBUF_TRANSPORT, tot_len, PBUF_RAM);\n        if (p != NULL) {\n          struct snmp_pbuf_stream pbuf_stream;\n          snmp_pbuf_stream_init(&pbuf_stream, p, 0, tot_len);\n\n          /* pass 1, encode packet ino the pbuf(s) */\n          snmp_trap_header_enc(&trap_msg, &pbuf_stream);\n          snmp_trap_varbind_enc(&trap_msg, &pbuf_stream, varbinds);\n\n          snmp_stats.outtraps++;\n          snmp_stats.outpkts++;\n\n          /** send to the TRAP destination */\n          snmp_sendto(snmp_traps_handle, p, &td->dip, SNMP_TRAP_PORT);\n          pbuf_free(p);\n        } else {\n          err = ERR_MEM;\n        }\n      } else {\n        /* routing error */\n        err = ERR_RTE;\n      }\n    }\n  }\n  return err;\n}\n\n/**\n * @ingroup snmp_traps\n * Send generic SNMP trap\n */\nerr_t \nsnmp_send_trap_generic(s32_t generic_trap)\n{\n  static const struct snmp_obj_id oid = { 7, { 1, 3, 6, 1, 2, 1, 11 } };\n  return snmp_send_trap(&oid, generic_trap, 0, NULL);\n}\n\n/**\n * @ingroup snmp_traps\n * Send specific SNMP trap with variable bindings\n */\nerr_t\nsnmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds)\n{\n  return snmp_send_trap(NULL, SNMP_GENTRAP_ENTERPRISE_SPECIFIC, specific_trap, varbinds);\n}\n\n/**\n * @ingroup snmp_traps\n * Send coldstart trap\n */\nvoid\nsnmp_coldstart_trap(void)\n{\n  snmp_send_trap_generic(SNMP_GENTRAP_COLDSTART);\n}\n\n/**\n * @ingroup snmp_traps\n * Send authentication failure trap (used internally by agent) \n */\nvoid\nsnmp_authfail_trap(void)\n{\n  if (snmp_auth_traps_enabled != 0) {\n    snmp_send_trap_generic(SNMP_GENTRAP_AUTH_FAILURE);\n  }\n}\n\nstatic u16_t\nsnmp_trap_varbind_sum(struct snmp_msg_trap *trap, struct snmp_varbind *varbinds)\n{\n  struct snmp_varbind *varbind;\n  u16_t tot_len;\n  u8_t tot_len_len;\n\n  tot_len = 0;\n  varbind = varbinds;\n  while (varbind != NULL) {\n    struct snmp_varbind_len len;\n\n    if (snmp_varbind_length(varbind, &len) == ERR_OK) {\n      tot_len += 1 + len.vb_len_len + len.vb_value_len;\n    }\n\n    varbind = varbind->next;\n  }\n\n  trap->vbseqlen = tot_len;\n  snmp_asn1_enc_length_cnt(trap->vbseqlen, &tot_len_len);\n  tot_len += 1 + tot_len_len;\n\n  return tot_len;\n}\n\n/**\n * Sums trap header field lengths from tail to head and\n * returns trap_header_lengths for second encoding pass.\n *\n * @param trap Trap message\n * @param vb_len varbind-list length\n * @return the required length for encoding the trap header\n */\nstatic u16_t\nsnmp_trap_header_sum(struct snmp_msg_trap *trap, u16_t vb_len)\n{\n  u16_t tot_len;\n  u16_t len;\n  u8_t lenlen;\n\n  tot_len = vb_len;\n\n  snmp_asn1_enc_u32t_cnt(trap->ts, &len);\n  snmp_asn1_enc_length_cnt(len, &lenlen);\n  tot_len += 1 + len + lenlen;\n\n  snmp_asn1_enc_s32t_cnt(trap->spc_trap, &len);\n  snmp_asn1_enc_length_cnt(len, &lenlen);\n  tot_len += 1 + len + lenlen;\n\n  snmp_asn1_enc_s32t_cnt(trap->gen_trap, &len);\n  snmp_asn1_enc_length_cnt(len, &lenlen);\n  tot_len += 1 + len + lenlen;\n\n  if (IP_IS_V6_VAL(trap->sip)) {\n#if LWIP_IPV6\n    len = sizeof(ip_2_ip6(&trap->sip)->addr);\n#endif\n  } else {\n#if LWIP_IPV4\n    len = sizeof(ip_2_ip4(&trap->sip)->addr);\n#endif\n  }\n  snmp_asn1_enc_length_cnt(len, &lenlen);\n  tot_len += 1 + len + lenlen;\n\n  snmp_asn1_enc_oid_cnt(trap->enterprise->id, trap->enterprise->len, &len);\n  snmp_asn1_enc_length_cnt(len, &lenlen);\n  tot_len += 1 + len + lenlen;\n\n  trap->pdulen = tot_len;\n  snmp_asn1_enc_length_cnt(trap->pdulen, &lenlen);\n  tot_len += 1 + lenlen;\n\n  trap->comlen = (u16_t)LWIP_MIN(strlen(snmp_community_trap), 0xFFFF);\n  snmp_asn1_enc_length_cnt(trap->comlen, &lenlen);\n  tot_len += 1 + lenlen + trap->comlen;\n\n  snmp_asn1_enc_s32t_cnt(trap->snmp_version, &len);\n  snmp_asn1_enc_length_cnt(len, &lenlen);\n  tot_len += 1 + len + lenlen;\n\n  trap->seqlen = tot_len;\n  snmp_asn1_enc_length_cnt(trap->seqlen, &lenlen);\n  tot_len += 1 + lenlen;\n\n  return tot_len;\n}\n\nstatic void\nsnmp_trap_varbind_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream, struct snmp_varbind *varbinds)\n{\n  struct snmp_asn1_tlv tlv;\n  struct snmp_varbind *varbind;\n\n  varbind = varbinds;\n\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 0, trap->vbseqlen);\n  snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n\n  while (varbind != NULL) {\n    snmp_append_outbound_varbind(pbuf_stream, varbind);\n\n    varbind = varbind->next;\n  }\n}\n\n/**\n * Encodes trap header from head to tail.\n */\nstatic void\nsnmp_trap_header_enc(struct snmp_msg_trap *trap, struct snmp_pbuf_stream *pbuf_stream)\n{\n  struct snmp_asn1_tlv tlv;\n\n  /* 'Message' sequence */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_SEQUENCE, 0, trap->seqlen);\n  snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n\n  /* version */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);\n  snmp_asn1_enc_s32t_cnt(trap->snmp_version, &tlv.value_len);\n  snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n  snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->snmp_version);\n\n  /* community */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OCTET_STRING, 0, trap->comlen);\n  snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n  snmp_asn1_enc_raw(pbuf_stream,  (const u8_t *)snmp_community_trap, trap->comlen);\n\n  /* 'PDU' sequence */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, (SNMP_ASN1_CLASS_CONTEXT | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_CONTEXT_PDU_TRAP), 0, trap->pdulen);\n  snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n\n  /* object ID */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_OBJECT_ID, 0, 0);\n  snmp_asn1_enc_oid_cnt(trap->enterprise->id, trap->enterprise->len, &tlv.value_len);\n  snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n  snmp_asn1_enc_oid(pbuf_stream, trap->enterprise->id, trap->enterprise->len);\n\n  /* IP addr */\n  if (IP_IS_V6_VAL(trap->sip)) {\n#if LWIP_IPV6\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_IPADDR, 0, sizeof(ip_2_ip6(&trap->sip)->addr));\n    snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n    snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)&ip_2_ip6(&trap->sip)->addr, sizeof(ip_2_ip6(&trap->sip)->addr));\n#endif\n  } else {\n#if LWIP_IPV4\n    SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_IPADDR, 0, sizeof(ip_2_ip4(&trap->sip)->addr));\n    snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n    snmp_asn1_enc_raw(pbuf_stream, (const u8_t *)&ip_2_ip4(&trap->sip)->addr, sizeof(ip_2_ip4(&trap->sip)->addr));\n#endif\n  }\n\n  /* trap length */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);\n  snmp_asn1_enc_s32t_cnt(trap->gen_trap, &tlv.value_len);\n  snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n  snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->gen_trap);\n\n  /* specific trap */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_INTEGER, 0, 0);\n  snmp_asn1_enc_s32t_cnt(trap->spc_trap, &tlv.value_len);\n  snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n  snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->spc_trap);\n\n  /* timestamp */\n  SNMP_ASN1_SET_TLV_PARAMS(tlv, SNMP_ASN1_TYPE_TIMETICKS, 0, 0);\n  snmp_asn1_enc_s32t_cnt(trap->ts, &tlv.value_len);\n  snmp_ans1_enc_tlv(pbuf_stream, &tlv);\n  snmp_asn1_enc_s32t(pbuf_stream, tlv.value_len, trap->ts);\n}\n\n#endif /* LWIP_SNMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmpv3.c",
    "content": "/**\n * @file\n * Additional SNMPv3 functionality RFC3414 and RFC3826.\n */\n\n/*\n * Copyright (c) 2016 Elias Oenal.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Elias Oenal <lwip@eliasoenal.com>\n */\n\n#include \"snmpv3_priv.h\"\n#include \"lwip/apps/snmpv3.h\"\n#include \"lwip/sys.h\"\n#include <string.h>\n\n#if LWIP_SNMP && LWIP_SNMP_V3\n\n#ifdef LWIP_SNMPV3_INCLUDE_ENGINE\n#include LWIP_SNMPV3_INCLUDE_ENGINE\n#endif\n\n#define SNMP_MAX_TIME_BOOT 2147483647UL\n\n/** Call this if engine has been changed. Has to reset boots, see below */\nvoid\nsnmpv3_engine_id_changed(void)\n{\n  snmpv3_set_engine_boots(0);\n}\n\n/** According to RFC3414 2.2.2.\n *\n * The number of times that the SNMP engine has\n * (re-)initialized itself since snmpEngineID\n * was last configured.\n */\nu32_t\nsnmpv3_get_engine_boots_internal(void)\n{\n  if (snmpv3_get_engine_boots() == 0 ||\n      snmpv3_get_engine_boots() < SNMP_MAX_TIME_BOOT) {\n    return snmpv3_get_engine_boots();\n  }\n\n  snmpv3_set_engine_boots(SNMP_MAX_TIME_BOOT);\n  return snmpv3_get_engine_boots();\n}\n\n/** RFC3414 2.2.2.\n *\n * Once the timer reaches 2147483647 it gets reset to zero and the\n * engine boot ups get incremented.\n */\nu32_t\nsnmpv3_get_engine_time_internal(void)\n{\n  if (snmpv3_get_engine_time() >= SNMP_MAX_TIME_BOOT) {\n    snmpv3_reset_engine_time();\n\n    if (snmpv3_get_engine_boots() < SNMP_MAX_TIME_BOOT - 1) {\n      snmpv3_set_engine_boots(snmpv3_get_engine_boots() + 1);\n    } else {\n      snmpv3_set_engine_boots(SNMP_MAX_TIME_BOOT);\n    }\n  }\n\n  return snmpv3_get_engine_time();\n}\n\n#if LWIP_SNMP_V3_CRYPTO\n\n/* This function ignores the byte order suggestion in RFC3414\n * since it simply doesn't influence the effectiveness of an IV.\n *\n * Implementing RFC3826 priv param algorithm if LWIP_RAND is available.\n *\n * @todo: This is a potential thread safety issue.\n */\nerr_t\nsnmpv3_build_priv_param(u8_t* priv_param)\n{\n#ifdef LWIP_RAND /* Based on RFC3826 */\n  static u8_t init;\n  static u32_t priv1, priv2;\n\n  /* Lazy initialisation */\n  if (init == 0) {\n    init = 1;\n    priv1 = LWIP_RAND();\n    priv2 = LWIP_RAND();\n  }\n\n  SMEMCPY(&priv_param[0], &priv1, sizeof(priv1));\n  SMEMCPY(&priv_param[4], &priv2, sizeof(priv2));\n\n  /* Emulate 64bit increment */\n  priv1++;\n  if (!priv1) { /* Overflow */\n    priv2++;\n  }\n#else /* Based on RFC3414 */\n  static u32_t ctr;\n  u32_t boots = LWIP_SNMPV3_GET_ENGINE_BOOTS();\n  SMEMCPY(&priv_param[0], &boots, 4);\n  SMEMCPY(&priv_param[4], &ctr, 4);\n  ctr++;\n#endif\n  return ERR_OK;\n}\n#endif /* LWIP_SNMP_V3_CRYPTO */\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmpv3_dummy.c",
    "content": "/**\n * @file\n * Dummy SNMPv3 functions.\n */\n\n/*\n * Copyright (c) 2016 Elias Oenal.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Elias Oenal <lwip@eliasoenal.com>\n *         Dirk Ziegelmeier <dirk@ziegelmeier.net>\n */\n\n#include \"lwip/apps/snmpv3.h\"\n#include \"snmpv3_priv.h\"\n#include <string.h>\n#include \"lwip/err.h\"\n\n#if LWIP_SNMP && LWIP_SNMP_V3\n\n/**\n *  @param username is a pointer to a string.\n * @param auth_algo is a pointer to u8_t. The implementation has to set this if user was found.\n * @param auth_key is a pointer to a pointer to a string. Implementation has to set this if user was found.\n * @param priv_algo is a pointer to u8_t. The implementation has to set this if user was found.\n * @param priv_key is a pointer to a pointer to a string. Implementation has to set this if user was found.\n */\nerr_t\nsnmpv3_get_user(const char* username, u8_t *auth_algo, u8_t *auth_key, u8_t *priv_algo, u8_t *priv_key)\n{\n  const char* engine_id;\n  u8_t engine_id_len;\n  \n  if(strlen(username) == 0) {\n    return ERR_OK;\n  }\n  \n  if(memcmp(username, \"lwip\", 4) != 0) {\n    return ERR_VAL;\n  }\n  \n  snmpv3_get_engine_id(&engine_id, &engine_id_len);\n  \n  if(auth_key != NULL) {\n    snmpv3_password_to_key_sha((const u8_t*)\"maplesyrup\", 10,\n      (const u8_t*)engine_id, engine_id_len,\n      auth_key);\n    *auth_algo = SNMP_V3_AUTH_ALGO_SHA;\n  }\n  if(priv_key != NULL) {\n    snmpv3_password_to_key_sha((const u8_t*)\"maplesyrup\", 10,\n      (const u8_t*)engine_id, engine_id_len,\n      priv_key);\n    *priv_algo = SNMP_V3_PRIV_ALGO_DES;\n  }\n  return ERR_OK;\n}\n\n/**\n * Get engine ID from persistence\n * @param id\n * @param len\n */\nvoid\nsnmpv3_get_engine_id(const char **id, u8_t *len)\n{\n  *id = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02\";\n  *len = 12;\n}\n\n/**\n * Store engine ID in persistence\n * @param id\n * @param len\n */\nerr_t\nsnmpv3_set_engine_id(const char *id, u8_t len)\n{\n  LWIP_UNUSED_ARG(id);\n  LWIP_UNUSED_ARG(len);\n  return ERR_OK;\n}\n\n/**\n * Get engine boots from persistence. Must be increased on each boot.\n * @return \n */\nu32_t\nsnmpv3_get_engine_boots(void)\n{\n  return 0;\n}\n\n/**\n * Store engine boots in persistence\n * @param boots\n */\nvoid \nsnmpv3_set_engine_boots(u32_t boots)\n{\n  LWIP_UNUSED_ARG(boots);\n}\n\n/**\n * RFC3414 2.2.2.\n * Once the timer reaches 2147483647 it gets reset to zero and the\n * engine boot ups get incremented.\n */\nu32_t\nsnmpv3_get_engine_time(void)\n{\n  return 0;\n}\n\n/**\n * Reset current engine time to 0\n */\nvoid\nsnmpv3_reset_engine_time(void)\n{\n}\n\n#endif /* LWIP_SNMP && LWIP_SNMP_V3 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmpv3_mbedtls.c",
    "content": "/**\n * @file\n * SNMPv3 crypto/auth functions implemented for ARM mbedtls.\n */\n\n/*\n * Copyright (c) 2016 Elias Oenal and Dirk Ziegelmeier.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Elias Oenal <lwip@eliasoenal.com>\n *         Dirk Ziegelmeier <dirk@ziegelmeier.net>\n */\n\n#include \"lwip/apps/snmpv3.h\"\n#include \"snmpv3_priv.h\"\n#include \"lwip/arch.h\"\n#include \"snmp_msg.h\"\n#include \"lwip/sys.h\"\n#include <string.h>\n\n#if LWIP_SNMP && LWIP_SNMP_V3 && LWIP_SNMP_V3_MBEDTLS\n\n#include \"mbedtls/md.h\"\n#include \"mbedtls/cipher.h\"\n\n#include \"mbedtls/md5.h\"\n#include \"mbedtls/sha1.h\"\n\nerr_t\nsnmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length,\n    const u8_t* key, u8_t algo, u8_t* hmac_out)\n{\n  u32_t i;\n  u8_t key_len;\n  const mbedtls_md_info_t *md_info;\n  mbedtls_md_context_t ctx;\n  struct snmp_pbuf_stream read_stream;\n  snmp_pbuf_stream_init(&read_stream, stream->pbuf, stream->offset, stream->length);\n\n  if (algo == SNMP_V3_AUTH_ALGO_MD5) {\n    md_info = mbedtls_md_info_from_type(MBEDTLS_MD_MD5);\n    key_len = SNMP_V3_MD5_LEN;\n  } else if (algo == SNMP_V3_AUTH_ALGO_SHA) {\n    md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);\n    key_len = SNMP_V3_SHA_LEN;\n  } else {\n    return ERR_ARG;\n  }\n\n  mbedtls_md_init(&ctx);\n  if(mbedtls_md_setup(&ctx, md_info, 1) != 0) {\n    return ERR_ARG;\n  }\n          \n  if (mbedtls_md_hmac_starts(&ctx, key, key_len) != 0) {\n    goto free_md;\n  }\n\n  for (i = 0; i < length; i++) {\n    u8_t byte;\n\n    if (snmp_pbuf_stream_read(&read_stream, &byte)) {\n      goto free_md;\n    }\n\n    if (mbedtls_md_hmac_update(&ctx, &byte, 1) != 0) {\n      goto free_md;\n    }\n  }\n\n  if (mbedtls_md_hmac_finish(&ctx, hmac_out) != 0) {\n    goto free_md;\n  }\n\n  mbedtls_md_free(&ctx);\n  return ERR_OK;\n  \nfree_md:\n  mbedtls_md_free(&ctx);\n  return ERR_ARG;\n}\n\n#if LWIP_SNMP_V3_CRYPTO\n\nerr_t\nsnmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length,\n    const u8_t* key, const u8_t* priv_param, const u32_t engine_boots,\n    const u32_t engine_time, u8_t algo, u8_t mode)\n{\n  size_t i;\n  mbedtls_cipher_context_t ctx;\n  const mbedtls_cipher_info_t *cipher_info;\n\n  struct snmp_pbuf_stream read_stream;\n  struct snmp_pbuf_stream write_stream;\n  snmp_pbuf_stream_init(&read_stream, stream->pbuf, stream->offset, stream->length);\n  snmp_pbuf_stream_init(&write_stream, stream->pbuf, stream->offset, stream->length);\n  mbedtls_cipher_init(&ctx);\n\n  if (algo == SNMP_V3_PRIV_ALGO_DES) {\n    u8_t iv_local[8];\n    u8_t out_bytes[8];\n    size_t out_len;\n\n    /* RFC 3414 mandates padding for DES */\n    if ((length & 0x07) != 0) {\n      return ERR_ARG;\n    }\n\n    cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_DES_CBC);\n    if(mbedtls_cipher_setup(&ctx, cipher_info) != 0) {\n      return ERR_ARG;\n    }\n    if(mbedtls_cipher_set_padding_mode(&ctx, MBEDTLS_PADDING_NONE) != 0) {\n      return ERR_ARG;\n    }\n    if(mbedtls_cipher_setkey(&ctx, key, 8*8, (mode == SNMP_V3_PRIV_MODE_ENCRYPT)? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT) != 0) {\n      goto error;\n    }\n\n    /* Prepare IV */    \n    for (i = 0; i < LWIP_ARRAYSIZE(iv_local); i++) {\n      iv_local[i] = priv_param[i] ^ key[i + 8];\n    }\n    if(mbedtls_cipher_set_iv(&ctx, iv_local, LWIP_ARRAYSIZE(iv_local)) != 0) {\n      goto error;\n    }\n\n    for (i = 0; i < length; i += 8) {\n      size_t j;\n      u8_t in_bytes[8];\n      out_len = LWIP_ARRAYSIZE(out_bytes) ;\n      \n      for (j = 0; j < LWIP_ARRAYSIZE(in_bytes); j++) {\n        snmp_pbuf_stream_read(&read_stream, &in_bytes[j]);\n      }\n\n      if(mbedtls_cipher_update(&ctx, in_bytes, LWIP_ARRAYSIZE(in_bytes), out_bytes, &out_len) != 0) {\n        goto error;\n      }\n\n      snmp_pbuf_stream_writebuf(&write_stream, out_bytes, out_len);\n    }\n    \n    out_len = LWIP_ARRAYSIZE(out_bytes);\n    if(mbedtls_cipher_finish(&ctx, out_bytes, &out_len) != 0) {\n      goto error;\n    }\n    snmp_pbuf_stream_writebuf(&write_stream, out_bytes, out_len);\n  } else if (algo == SNMP_V3_PRIV_ALGO_AES) {\n    u8_t iv_local[16];\n\n    cipher_info = mbedtls_cipher_info_from_type(MBEDTLS_CIPHER_AES_128_CFB128);\n    if(mbedtls_cipher_setup(&ctx, cipher_info) != 0) {\n      return ERR_ARG;\n    }\n    if(mbedtls_cipher_setkey(&ctx, key, 16*8, (mode == SNMP_V3_PRIV_MODE_ENCRYPT)? MBEDTLS_ENCRYPT : MBEDTLS_DECRYPT) != 0) {\n      goto error;\n    }\n\n    /*\n     * IV is the big endian concatenation of boots,\n     * uptime and priv param - see RFC3826.\n     */\n    iv_local[0 + 0] = (engine_boots >> 24) & 0xFF;\n    iv_local[0 + 1] = (engine_boots >> 16) & 0xFF;\n    iv_local[0 + 2] = (engine_boots >>  8) & 0xFF;\n    iv_local[0 + 3] = (engine_boots >>  0) & 0xFF;\n    iv_local[4 + 0] = (engine_time  >> 24) & 0xFF;\n    iv_local[4 + 1] = (engine_time  >> 16) & 0xFF;\n    iv_local[4 + 2] = (engine_time  >>  8) & 0xFF;\n    iv_local[4 + 3] = (engine_time  >>  0) & 0xFF;\n    SMEMCPY(iv_local + 8, priv_param, 8);\n    if(mbedtls_cipher_set_iv(&ctx, iv_local, LWIP_ARRAYSIZE(iv_local)) != 0) {\n      goto error;\n    }\n\n    for (i = 0; i < length; i++) {\n      u8_t in_byte;\n      u8_t out_byte;\n      size_t out_len = sizeof(out_byte);\n      \n      snmp_pbuf_stream_read(&read_stream, &in_byte);\n      if(mbedtls_cipher_update(&ctx, &in_byte, sizeof(in_byte), &out_byte, &out_len) != 0) {\n        goto error;\n      }\n      snmp_pbuf_stream_write(&write_stream, out_byte);\n    }\n  } else {\n    return ERR_ARG;\n  }\n\n  mbedtls_cipher_free(&ctx);\n  return ERR_OK;\n\nerror:\n  mbedtls_cipher_free(&ctx);\n  return ERR_OK;\n}\n\n#endif /* LWIP_SNMP_V3_CRYPTO */\n\n/* A.2.1. Password to Key Sample Code for MD5 */\nvoid \nsnmpv3_password_to_key_md5(\n    const u8_t *password,    /* IN */\n    u8_t        passwordlen, /* IN */\n    const u8_t *engineID,    /* IN  - pointer to snmpEngineID  */\n    u8_t        engineLength,/* IN  - length of snmpEngineID */\n    u8_t       *key)         /* OUT - pointer to caller 16-octet buffer */\n{\n  mbedtls_md5_context MD;\n  u8_t *cp, password_buf[64];\n  u32_t password_index = 0;\n  u8_t i;\n  u32_t count = 0;\n\n  mbedtls_md5_init(&MD); /* initialize MD5 */\n  mbedtls_md5_starts(&MD);\n\n  /**********************************************/\n  /* Use while loop until we've done 1 Megabyte */\n  /**********************************************/\n  while (count < 1048576) {\n    cp = password_buf;\n    for (i = 0; i < 64; i++) {\n      /*************************************************/\n      /* Take the next octet of the password, wrapping */\n      /* to the beginning of the password as necessary.*/\n      /*************************************************/\n      *cp++ = password[password_index++ % passwordlen];\n    }\n    mbedtls_md5_update(&MD, password_buf, 64);\n    count += 64;\n  }\n  mbedtls_md5_finish(&MD, key); /* tell MD5 we're done */\n\n  /*****************************************************/\n  /* Now localize the key with the engineID and pass   */\n  /* through MD5 to produce final key                  */\n  /* May want to ensure that engineLength <= 32,       */\n  /* otherwise need to use a buffer larger than 64     */\n  /*****************************************************/\n  SMEMCPY(password_buf, key, 16);\n  MEMCPY(password_buf + 16, engineID, engineLength);\n  SMEMCPY(password_buf + 16 + engineLength, key, 16);\n\n  mbedtls_md5_starts(&MD);\n  mbedtls_md5_update(&MD, password_buf, 32 + engineLength);\n  mbedtls_md5_finish(&MD, key);\n\n  mbedtls_md5_free(&MD);\n  return;\n}\n\n/* A.2.2. Password to Key Sample Code for SHA */\nvoid \nsnmpv3_password_to_key_sha(\n    const u8_t *password,    /* IN */\n    u8_t        passwordlen, /* IN */\n    const u8_t *engineID,    /* IN  - pointer to snmpEngineID  */\n    u8_t        engineLength,/* IN  - length of snmpEngineID */\n    u8_t       *key)         /* OUT - pointer to caller 20-octet buffer */\n{\n  mbedtls_sha1_context SH;\n  u8_t *cp, password_buf[72];\n  u32_t password_index = 0;\n  u8_t i;\n  u32_t count = 0;\n\n  mbedtls_sha1_init(&SH); /* initialize SHA */\n  mbedtls_sha1_starts(&SH);\n\n  /**********************************************/\n  /* Use while loop until we've done 1 Megabyte */\n  /**********************************************/\n  while (count < 1048576) {\n    cp = password_buf;\n    for (i = 0; i < 64; i++) {\n      /*************************************************/\n      /* Take the next octet of the password, wrapping */\n      /* to the beginning of the password as necessary.*/\n      /*************************************************/\n      *cp++ = password[password_index++ % passwordlen];\n    }\n    mbedtls_sha1_update(&SH, password_buf, 64);\n    count += 64;\n  }\n  mbedtls_sha1_finish(&SH, key); /* tell SHA we're done */\n\n  /*****************************************************/\n  /* Now localize the key with the engineID and pass   */\n  /* through SHA to produce final key                  */\n  /* May want to ensure that engineLength <= 32,       */\n  /* otherwise need to use a buffer larger than 72     */\n  /*****************************************************/\n  SMEMCPY(password_buf, key, 20);\n  MEMCPY(password_buf + 20, engineID, engineLength);\n  SMEMCPY(password_buf + 20 + engineLength, key, 20);\n\n  mbedtls_sha1_starts(&SH);\n  mbedtls_sha1_update(&SH, password_buf, 40 + engineLength);\n  mbedtls_sha1_finish(&SH, key);\n  \n  mbedtls_sha1_free(&SH);\n  return;\n}\n\n#endif /* LWIP_SNMP && LWIP_SNMP_V3 && LWIP_SNMP_V3_MBEDTLS */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/snmp/snmpv3_priv.h",
    "content": "/**\n * @file\n * Additional SNMPv3 functionality RFC3414 and RFC3826 (internal API, do not use in client code).\n */\n\n/*\n * Copyright (c) 2016 Elias Oenal.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Elias Oenal <lwip@eliasoenal.com>\n */\n\n#ifndef LWIP_HDR_APPS_SNMP_V3_PRIV_H\n#define LWIP_HDR_APPS_SNMP_V3_PRIV_H\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP && LWIP_SNMP_V3\n\n#include \"snmp_pbuf_stream.h\"\n\n/* According to RFC 3411 */\n#define SNMP_V3_MAX_ENGINE_ID_LENGTH  32\n#define SNMP_V3_MAX_USER_LENGTH       32\n\n#define SNMP_V3_MAX_AUTH_PARAM_LENGTH  12\n#define SNMP_V3_MAX_PRIV_PARAM_LENGTH  8\n\n#define SNMP_V3_AUTH_FLAG      0x01\n#define SNMP_V3_PRIV_FLAG      0x02\n\n#define SNMP_V3_MD5_LEN        16\n#define SNMP_V3_SHA_LEN        20\n\nu32_t snmpv3_get_engine_boots_internal(void);\nu32_t snmpv3_get_engine_time_internal(void);\nerr_t snmpv3_auth(struct snmp_pbuf_stream* stream, u16_t length, const u8_t* key, u8_t algo, u8_t* hmac_out);\nerr_t snmpv3_crypt(struct snmp_pbuf_stream* stream, u16_t length, const u8_t* key,\n    const u8_t* priv_param, const u32_t engine_boots, const u32_t engine_time, u8_t algo, u8_t mode);\nerr_t snmpv3_build_priv_param(u8_t* priv_param);\n\n#endif\n\n#endif /* LWIP_HDR_APPS_SNMP_V3_PRIV_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/sntp/sntp.c",
    "content": "/**\n * @file\n * SNTP client module\n */\n\n/*\n * Copyright (c) 2007-2009 Frédéric Bernon, Simon Goldschmidt\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Frédéric Bernon, Simon Goldschmidt\n */\n\n\n/**\n * @defgroup sntp SNTP\n * @ingroup apps\n *\n * This is simple \"SNTP\" client for the lwIP raw API.\n * It is a minimal implementation of SNTPv4 as specified in RFC 4330.\n *\n * For a list of some public NTP servers, see this link :\n * http://support.ntp.org/bin/view/Servers/NTPPoolServers\n *\n * @todo:\n * - set/change servers at runtime\n * - complete SNTP_CHECK_RESPONSE checks 3 and 4\n */\n\n#include \"lwip/apps/sntp.h\"\n\n#include \"lwip/opt.h\"\n#include \"lwip/timeouts.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/dns.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/dhcp.h\"\n\n#include <string.h>\n#include <time.h>\n\n#if LWIP_UDP\n\n/* Handle support for more than one server via SNTP_MAX_SERVERS */\n#if SNTP_MAX_SERVERS > 1\n#define SNTP_SUPPORT_MULTIPLE_SERVERS 1\n#else /* NTP_MAX_SERVERS > 1 */\n#define SNTP_SUPPORT_MULTIPLE_SERVERS 0\n#endif /* NTP_MAX_SERVERS > 1 */\n\n#if (SNTP_UPDATE_DELAY < 15000) && !defined(SNTP_SUPPRESS_DELAY_CHECK)\n#error \"SNTPv4 RFC 4330 enforces a minimum update time of 15 seconds (define SNTP_SUPPRESS_DELAY_CHECK to disable this error)!\"\n#endif\n\n/* Configure behaviour depending on microsecond or second precision */\n#ifdef SNTP_SET_SYSTEM_TIME_US\n#define SNTP_CALC_TIME_US           1\n#define SNTP_RECEIVE_TIME_SIZE      2\n#else\n#define SNTP_SET_SYSTEM_TIME_US(sec, us)\n#define SNTP_CALC_TIME_US           0\n#define SNTP_RECEIVE_TIME_SIZE      1\n#endif\n\n\n/* the various debug levels for this file */\n#define SNTP_DEBUG_TRACE        (SNTP_DEBUG | LWIP_DBG_TRACE)\n#define SNTP_DEBUG_STATE        (SNTP_DEBUG | LWIP_DBG_STATE)\n#define SNTP_DEBUG_WARN         (SNTP_DEBUG | LWIP_DBG_LEVEL_WARNING)\n#define SNTP_DEBUG_WARN_STATE   (SNTP_DEBUG | LWIP_DBG_LEVEL_WARNING | LWIP_DBG_STATE)\n#define SNTP_DEBUG_SERIOUS      (SNTP_DEBUG | LWIP_DBG_LEVEL_SERIOUS)\n\n#define SNTP_ERR_KOD                1\n\n/* SNTP protocol defines */\n#define SNTP_MSG_LEN                48\n\n#define SNTP_OFFSET_LI_VN_MODE      0\n#define SNTP_LI_MASK                0xC0\n#define SNTP_LI_NO_WARNING          0x00\n#define SNTP_LI_LAST_MINUTE_61_SEC  0x01\n#define SNTP_LI_LAST_MINUTE_59_SEC  0x02\n#define SNTP_LI_ALARM_CONDITION     0x03 /* (clock not synchronized) */\n\n#define SNTP_VERSION_MASK           0x38\n#define SNTP_VERSION                (4/* NTP Version 4*/<<3)\n\n#define SNTP_MODE_MASK              0x07\n#define SNTP_MODE_CLIENT            0x03\n#define SNTP_MODE_SERVER            0x04\n#define SNTP_MODE_BROADCAST         0x05\n\n#define SNTP_OFFSET_STRATUM         1\n#define SNTP_STRATUM_KOD            0x00\n\n#define SNTP_OFFSET_ORIGINATE_TIME  24\n#define SNTP_OFFSET_RECEIVE_TIME    32\n#define SNTP_OFFSET_TRANSMIT_TIME   40\n\n/* number of seconds between 1900 and 1970 (MSB=1)*/\n#define DIFF_SEC_1900_1970         (2208988800UL)\n/* number of seconds between 1970 and Feb 7, 2036 (6:28:16 UTC) (MSB=0) */\n#define DIFF_SEC_1970_2036         (2085978496UL)\n\n/**\n * SNTP packet format (without optional fields)\n * Timestamps are coded as 64 bits:\n * - 32 bits seconds since Jan 01, 1970, 00:00\n * - 32 bits seconds fraction (0-padded)\n * For future use, if the MSB in the seconds part is set, seconds are based\n * on Feb 07, 2036, 06:28:16.\n */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct sntp_msg {\n  PACK_STRUCT_FLD_8(u8_t  li_vn_mode);\n  PACK_STRUCT_FLD_8(u8_t  stratum);\n  PACK_STRUCT_FLD_8(u8_t  poll);\n  PACK_STRUCT_FLD_8(u8_t  precision);\n  PACK_STRUCT_FIELD(u32_t root_delay);\n  PACK_STRUCT_FIELD(u32_t root_dispersion);\n  PACK_STRUCT_FIELD(u32_t reference_identifier);\n  PACK_STRUCT_FIELD(u32_t reference_timestamp[2]);\n  PACK_STRUCT_FIELD(u32_t originate_timestamp[2]);\n  PACK_STRUCT_FIELD(u32_t receive_timestamp[2]);\n  PACK_STRUCT_FIELD(u32_t transmit_timestamp[2]);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/* function prototypes */\nstatic void sntp_request(void *arg);\n\n/** The operating mode */\nstatic u8_t sntp_opmode;\n\n/** The UDP pcb used by the SNTP client */\nstatic struct udp_pcb* sntp_pcb;\n/** Names/Addresses of servers */\nstruct sntp_server {\n#if SNTP_SERVER_DNS\n  char* name;\n#endif /* SNTP_SERVER_DNS */\n  ip_addr_t addr;\n};\nstatic struct sntp_server sntp_servers[SNTP_MAX_SERVERS];\n\n#if SNTP_GET_SERVERS_FROM_DHCP\nstatic u8_t sntp_set_servers_from_dhcp;\n#endif /* SNTP_GET_SERVERS_FROM_DHCP */\n#if SNTP_SUPPORT_MULTIPLE_SERVERS\n/** The currently used server (initialized to 0) */\nstatic u8_t sntp_current_server;\n#else /* SNTP_SUPPORT_MULTIPLE_SERVERS */\n#define sntp_current_server 0\n#endif /* SNTP_SUPPORT_MULTIPLE_SERVERS */\n\n#if SNTP_RETRY_TIMEOUT_EXP\n#define SNTP_RESET_RETRY_TIMEOUT() sntp_retry_timeout = SNTP_RETRY_TIMEOUT\n/** Retry time, initialized with SNTP_RETRY_TIMEOUT and doubled with each retry. */\nstatic u32_t sntp_retry_timeout;\n#else /* SNTP_RETRY_TIMEOUT_EXP */\n#define SNTP_RESET_RETRY_TIMEOUT()\n#define sntp_retry_timeout SNTP_RETRY_TIMEOUT\n#endif /* SNTP_RETRY_TIMEOUT_EXP */\n\n#if SNTP_CHECK_RESPONSE >= 1\n/** Saves the last server address to compare with response */\nstatic ip_addr_t sntp_last_server_address;\n#endif /* SNTP_CHECK_RESPONSE >= 1 */\n\n#if SNTP_CHECK_RESPONSE >= 2\n/** Saves the last timestamp sent (which is sent back by the server)\n * to compare against in response */\nstatic u32_t sntp_last_timestamp_sent[2];\n#endif /* SNTP_CHECK_RESPONSE >= 2 */\n\n/**\n * SNTP processing of received timestamp\n */\nstatic void\nsntp_process(u32_t *receive_timestamp)\n{\n  /* convert SNTP time (1900-based) to unix GMT time (1970-based)\n   * if MSB is 0, SNTP time is 2036-based!\n   */\n  u32_t rx_secs = lwip_ntohl(receive_timestamp[0]);\n  int is_1900_based = ((rx_secs & 0x80000000) != 0);\n  u32_t t = is_1900_based ? (rx_secs - DIFF_SEC_1900_1970) : (rx_secs + DIFF_SEC_1970_2036);\n  time_t tim = t;\n\n#if SNTP_CALC_TIME_US\n  u32_t us = lwip_ntohl(receive_timestamp[1]) / 4295;\n  SNTP_SET_SYSTEM_TIME_US(t, us);\n  /* display local time from GMT time */\n  LWIP_DEBUGF(SNTP_DEBUG_TRACE, (\"sntp_process: %s, %\"U32_F\" us\", ctime(&tim), us));\n\n#else /* SNTP_CALC_TIME_US */\n\n  /* change system time and/or the update the RTC clock */\n  SNTP_SET_SYSTEM_TIME(t);\n  /* display local time from GMT time */\n  LWIP_DEBUGF(SNTP_DEBUG_TRACE, (\"sntp_process: %s\", ctime(&tim)));\n#endif /* SNTP_CALC_TIME_US */\n  LWIP_UNUSED_ARG(tim);\n}\n\n/**\n * Initialize request struct to be sent to server.\n */\nstatic void\nsntp_initialize_request(struct sntp_msg *req)\n{\n  memset(req, 0, SNTP_MSG_LEN);\n  req->li_vn_mode = SNTP_LI_NO_WARNING | SNTP_VERSION | SNTP_MODE_CLIENT;\n\n#if SNTP_CHECK_RESPONSE >= 2\n  {\n    u32_t sntp_time_sec, sntp_time_us;\n    /* fill in transmit timestamp and save it in 'sntp_last_timestamp_sent' */\n    SNTP_GET_SYSTEM_TIME(sntp_time_sec, sntp_time_us);\n    sntp_last_timestamp_sent[0] = lwip_htonl(sntp_time_sec + DIFF_SEC_1900_1970);\n    req->transmit_timestamp[0] = sntp_last_timestamp_sent[0];\n    /* we send/save us instead of fraction to be faster... */\n    sntp_last_timestamp_sent[1] = lwip_htonl(sntp_time_us);\n    req->transmit_timestamp[1] = sntp_last_timestamp_sent[1];\n  }\n#endif /* SNTP_CHECK_RESPONSE >= 2 */\n}\n\n/**\n * Retry: send a new request (and increase retry timeout).\n *\n * @param arg is unused (only necessary to conform to sys_timeout)\n */\nstatic void\nsntp_retry(void* arg)\n{\n  LWIP_UNUSED_ARG(arg);\n\n  LWIP_DEBUGF(SNTP_DEBUG_STATE, (\"sntp_retry: Next request will be sent in %\"U32_F\" ms\\n\",\n    sntp_retry_timeout));\n\n  /* set up a timer to send a retry and increase the retry delay */\n  sys_timeout(sntp_retry_timeout, sntp_request, NULL);\n\n#if SNTP_RETRY_TIMEOUT_EXP\n  {\n    u32_t new_retry_timeout;\n    /* increase the timeout for next retry */\n    new_retry_timeout = sntp_retry_timeout << 1;\n    /* limit to maximum timeout and prevent overflow */\n    if ((new_retry_timeout <= SNTP_RETRY_TIMEOUT_MAX) &&\n        (new_retry_timeout > sntp_retry_timeout)) {\n      sntp_retry_timeout = new_retry_timeout;\n    }\n  }\n#endif /* SNTP_RETRY_TIMEOUT_EXP */\n}\n\n#if SNTP_SUPPORT_MULTIPLE_SERVERS\n/**\n * If Kiss-of-Death is received (or another packet parsing error),\n * try the next server or retry the current server and increase the retry\n * timeout if only one server is available.\n * (implicitly, SNTP_MAX_SERVERS > 1)\n *\n * @param arg is unused (only necessary to conform to sys_timeout)\n */\nstatic void\nsntp_try_next_server(void* arg)\n{\n  u8_t old_server, i;\n  LWIP_UNUSED_ARG(arg);\n\n  old_server = sntp_current_server;\n  for (i = 0; i < SNTP_MAX_SERVERS - 1; i++) {\n    sntp_current_server++;\n    if (sntp_current_server >= SNTP_MAX_SERVERS) {\n      sntp_current_server = 0;\n    }\n    if (!ip_addr_isany(&sntp_servers[sntp_current_server].addr)\n#if SNTP_SERVER_DNS\n        || (sntp_servers[sntp_current_server].name != NULL)\n#endif\n        ) {\n      LWIP_DEBUGF(SNTP_DEBUG_STATE, (\"sntp_try_next_server: Sending request to server %\"U16_F\"\\n\",\n        (u16_t)sntp_current_server));\n      /* new server: reset retry timeout */\n      SNTP_RESET_RETRY_TIMEOUT();\n      /* instantly send a request to the next server */\n      sntp_request(NULL);\n      return;\n    }\n  }\n  /* no other valid server found */\n  sntp_current_server = old_server;\n  sntp_retry(NULL);\n}\n#else /* SNTP_SUPPORT_MULTIPLE_SERVERS */\n/* Always retry on error if only one server is supported */\n#define sntp_try_next_server    sntp_retry\n#endif /* SNTP_SUPPORT_MULTIPLE_SERVERS */\n\n/** UDP recv callback for the sntp pcb */\nstatic void\nsntp_recv(void *arg, struct udp_pcb* pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)\n{\n  u8_t mode;\n  u8_t stratum;\n  u32_t receive_timestamp[SNTP_RECEIVE_TIME_SIZE];\n  err_t err;\n\n  LWIP_UNUSED_ARG(arg);\n  LWIP_UNUSED_ARG(pcb);\n\n  /* packet received: stop retry timeout  */\n  sys_untimeout(sntp_try_next_server, NULL);\n  sys_untimeout(sntp_request, NULL);\n\n  err = ERR_ARG;\n#if SNTP_CHECK_RESPONSE >= 1\n  /* check server address and port */\n  if (((sntp_opmode != SNTP_OPMODE_POLL) || ip_addr_cmp(addr, &sntp_last_server_address)) &&\n    (port == SNTP_PORT))\n#else /* SNTP_CHECK_RESPONSE >= 1 */\n  LWIP_UNUSED_ARG(addr);\n  LWIP_UNUSED_ARG(port);\n#endif /* SNTP_CHECK_RESPONSE >= 1 */\n  {\n    /* process the response */\n    if (p->tot_len == SNTP_MSG_LEN) {\n      pbuf_copy_partial(p, &mode, 1, SNTP_OFFSET_LI_VN_MODE);\n      mode &= SNTP_MODE_MASK;\n      /* if this is a SNTP response... */\n      if (((sntp_opmode == SNTP_OPMODE_POLL) && (mode == SNTP_MODE_SERVER)) ||\n          ((sntp_opmode == SNTP_OPMODE_LISTENONLY) && (mode == SNTP_MODE_BROADCAST))) {\n        pbuf_copy_partial(p, &stratum, 1, SNTP_OFFSET_STRATUM);\n        if (stratum == SNTP_STRATUM_KOD) {\n          /* Kiss-of-death packet. Use another server or increase UPDATE_DELAY. */\n          err = SNTP_ERR_KOD;\n          LWIP_DEBUGF(SNTP_DEBUG_STATE, (\"sntp_recv: Received Kiss-of-Death\\n\"));\n        } else {\n#if SNTP_CHECK_RESPONSE >= 2\n          /* check originate_timetamp against sntp_last_timestamp_sent */\n          u32_t originate_timestamp[2];\n          pbuf_copy_partial(p, &originate_timestamp, 8, SNTP_OFFSET_ORIGINATE_TIME);\n          if ((originate_timestamp[0] != sntp_last_timestamp_sent[0]) ||\n              (originate_timestamp[1] != sntp_last_timestamp_sent[1]))\n          {\n            LWIP_DEBUGF(SNTP_DEBUG_WARN, (\"sntp_recv: Invalid originate timestamp in response\\n\"));\n          } else\n#endif /* SNTP_CHECK_RESPONSE >= 2 */\n          /* @todo: add code for SNTP_CHECK_RESPONSE >= 3 and >= 4 here */\n          {\n            /* correct answer */\n            err = ERR_OK;\n            pbuf_copy_partial(p, &receive_timestamp, SNTP_RECEIVE_TIME_SIZE * 4, SNTP_OFFSET_TRANSMIT_TIME);\n          }\n        }\n      } else {\n        LWIP_DEBUGF(SNTP_DEBUG_WARN, (\"sntp_recv: Invalid mode in response: %\"U16_F\"\\n\", (u16_t)mode));\n        /* wait for correct response */\n        err = ERR_TIMEOUT;\n      }\n    } else {\n      LWIP_DEBUGF(SNTP_DEBUG_WARN, (\"sntp_recv: Invalid packet length: %\"U16_F\"\\n\", p->tot_len));\n    }\n  }\n#if SNTP_CHECK_RESPONSE >= 1\n  else {\n    /* packet from wrong remote address or port, wait for correct response */\n    err = ERR_TIMEOUT;\n  }\n#endif /* SNTP_CHECK_RESPONSE >= 1 */\n  pbuf_free(p);\n  if (err == ERR_OK) {\n    sntp_process(receive_timestamp);\n\n    /* Set up timeout for next request (only if poll response was received)*/\n    if (sntp_opmode == SNTP_OPMODE_POLL) {\n      /* Correct response, reset retry timeout */\n      SNTP_RESET_RETRY_TIMEOUT();\n\n      sys_timeout((u32_t)SNTP_UPDATE_DELAY, sntp_request, NULL);\n      LWIP_DEBUGF(SNTP_DEBUG_STATE, (\"sntp_recv: Scheduled next time request: %\"U32_F\" ms\\n\",\n        (u32_t)SNTP_UPDATE_DELAY));\n    }\n  } else if (err != ERR_TIMEOUT) {\n    /* Errors are only processed in case of an explicit poll response */\n    if (sntp_opmode == SNTP_OPMODE_POLL) {\n      if (err == SNTP_ERR_KOD) {\n        /* Kiss-of-death packet. Use another server or increase UPDATE_DELAY. */\n        sntp_try_next_server(NULL);\n      } else {\n        /* another error, try the same server again */\n        sntp_retry(NULL);\n      }\n    }\n  }\n}\n\n/** Actually send an sntp request to a server.\n *\n * @param server_addr resolved IP address of the SNTP server\n */\nstatic void\nsntp_send_request(const ip_addr_t *server_addr)\n{\n  struct pbuf* p;\n  p = pbuf_alloc(PBUF_TRANSPORT, SNTP_MSG_LEN, PBUF_RAM);\n  if (p != NULL) {\n    struct sntp_msg *sntpmsg = (struct sntp_msg *)p->payload;\n    LWIP_DEBUGF(SNTP_DEBUG_STATE, (\"sntp_send_request: Sending request to server\\n\"));\n    /* initialize request message */\n    sntp_initialize_request(sntpmsg);\n    /* send request */\n    udp_sendto(sntp_pcb, p, server_addr, SNTP_PORT);\n    /* free the pbuf after sending it */\n    pbuf_free(p);\n    /* set up receive timeout: try next server or retry on timeout */\n    sys_timeout((u32_t)SNTP_RECV_TIMEOUT, sntp_try_next_server, NULL);\n#if SNTP_CHECK_RESPONSE >= 1\n    /* save server address to verify it in sntp_recv */\n    ip_addr_set(&sntp_last_server_address, server_addr);\n#endif /* SNTP_CHECK_RESPONSE >= 1 */\n  } else {\n    LWIP_DEBUGF(SNTP_DEBUG_SERIOUS, (\"sntp_send_request: Out of memory, trying again in %\"U32_F\" ms\\n\",\n      (u32_t)SNTP_RETRY_TIMEOUT));\n    /* out of memory: set up a timer to send a retry */\n    sys_timeout((u32_t)SNTP_RETRY_TIMEOUT, sntp_request, NULL);\n  }\n}\n\n#if SNTP_SERVER_DNS\n/**\n * DNS found callback when using DNS names as server address.\n */\nstatic void\nsntp_dns_found(const char* hostname, const ip_addr_t *ipaddr, void *arg)\n{\n  LWIP_UNUSED_ARG(hostname);\n  LWIP_UNUSED_ARG(arg);\n\n  if (ipaddr != NULL) {\n    /* Address resolved, send request */\n    LWIP_DEBUGF(SNTP_DEBUG_STATE, (\"sntp_dns_found: Server address resolved, sending request\\n\"));\n    sntp_send_request(ipaddr);\n  } else {\n    /* DNS resolving failed -> try another server */\n    LWIP_DEBUGF(SNTP_DEBUG_WARN_STATE, (\"sntp_dns_found: Failed to resolve server address resolved, trying next server\\n\"));\n    sntp_try_next_server(NULL);\n  }\n}\n#endif /* SNTP_SERVER_DNS */\n\n/**\n * Send out an sntp request.\n *\n * @param arg is unused (only necessary to conform to sys_timeout)\n */\nstatic void\nsntp_request(void *arg)\n{\n  ip_addr_t sntp_server_address;\n  err_t err;\n\n  LWIP_UNUSED_ARG(arg);\n\n  /* initialize SNTP server address */\n#if SNTP_SERVER_DNS\n  if (sntp_servers[sntp_current_server].name) {\n    /* always resolve the name and rely on dns-internal caching & timeout */\n    ip_addr_set_zero(&sntp_servers[sntp_current_server].addr);\n    err = dns_gethostbyname(sntp_servers[sntp_current_server].name, &sntp_server_address,\n      sntp_dns_found, NULL);\n    if (err == ERR_INPROGRESS) {\n      /* DNS request sent, wait for sntp_dns_found being called */\n      LWIP_DEBUGF(SNTP_DEBUG_STATE, (\"sntp_request: Waiting for server address to be resolved.\\n\"));\n      return;\n    } else if (err == ERR_OK) {\n      sntp_servers[sntp_current_server].addr = sntp_server_address;\n    }\n  } else\n#endif /* SNTP_SERVER_DNS */\n  {\n    sntp_server_address = sntp_servers[sntp_current_server].addr;\n    err = (ip_addr_isany_val(sntp_server_address)) ? ERR_ARG : ERR_OK;\n  }\n\n  if (err == ERR_OK) {\n    LWIP_DEBUGF(SNTP_DEBUG_TRACE, (\"sntp_request: current server address is %s\\n\",\n      ipaddr_ntoa(&sntp_server_address)));\n    sntp_send_request(&sntp_server_address);\n  } else {\n    /* address conversion failed, try another server */\n    LWIP_DEBUGF(SNTP_DEBUG_WARN_STATE, (\"sntp_request: Invalid server address, trying next server.\\n\"));\n    sys_timeout((u32_t)SNTP_RETRY_TIMEOUT, sntp_try_next_server, NULL);\n  }\n}\n\n/**\n * @ingroup sntp\n * Initialize this module.\n * Send out request instantly or after SNTP_STARTUP_DELAY(_FUNC).\n */\nvoid\nsntp_init(void)\n{\n#ifdef SNTP_SERVER_ADDRESS\n#if SNTP_SERVER_DNS\n  sntp_setservername(0, SNTP_SERVER_ADDRESS);\n#else\n#error SNTP_SERVER_ADDRESS string not supported SNTP_SERVER_DNS==0\n#endif\n#endif /* SNTP_SERVER_ADDRESS */\n\n  if (sntp_pcb == NULL) {\n    sntp_pcb = udp_new_ip_type(IPADDR_TYPE_ANY);\n    LWIP_ASSERT(\"Failed to allocate udp pcb for sntp client\", sntp_pcb != NULL);\n    if (sntp_pcb != NULL) {\n      udp_recv(sntp_pcb, sntp_recv, NULL);\n\n      if (sntp_opmode == SNTP_OPMODE_POLL) {\n        SNTP_RESET_RETRY_TIMEOUT();\n#if SNTP_STARTUP_DELAY\n        sys_timeout((u32_t)SNTP_STARTUP_DELAY_FUNC, sntp_request, NULL);\n#else\n        sntp_request(NULL);\n#endif\n      } else if (sntp_opmode == SNTP_OPMODE_LISTENONLY) {\n        ip_set_option(sntp_pcb, SOF_BROADCAST);\n        udp_bind(sntp_pcb, IP_ANY_TYPE, SNTP_PORT);\n      }\n    }\n  }\n}\n\n/**\n * @ingroup sntp\n * Stop this module.\n */\nvoid\nsntp_stop(void)\n{\n  if (sntp_pcb != NULL) {\n    sys_untimeout(sntp_request, NULL);\n    sys_untimeout(sntp_try_next_server, NULL);\n    udp_remove(sntp_pcb);\n    sntp_pcb = NULL;\n  }\n}\n\n/**\n * @ingroup sntp\n * Get enabled state.\n */\nu8_t sntp_enabled(void)\n{\n  return (sntp_pcb != NULL)? 1 : 0;\n}\n\n/**\n * @ingroup sntp\n * Sets the operating mode.\n * @param operating_mode one of the available operating modes\n */\nvoid\nsntp_setoperatingmode(u8_t operating_mode)\n{\n  LWIP_ASSERT(\"Invalid operating mode\", operating_mode <= SNTP_OPMODE_LISTENONLY);\n  LWIP_ASSERT(\"Operating mode must not be set while SNTP client is running\", sntp_pcb == NULL);\n  sntp_opmode = operating_mode;\n}\n\n/**\n * @ingroup sntp\n * Gets the operating mode.\n */\nu8_t\nsntp_getoperatingmode(void)\n{\n  return sntp_opmode;\n}\n\n#if SNTP_GET_SERVERS_FROM_DHCP\n/**\n * Config SNTP server handling by IP address, name, or DHCP; clear table\n * @param set_servers_from_dhcp enable or disable getting server addresses from dhcp\n */\nvoid\nsntp_servermode_dhcp(int set_servers_from_dhcp)\n{\n  u8_t new_mode = set_servers_from_dhcp ? 1 : 0;\n  if (sntp_set_servers_from_dhcp != new_mode) {\n    sntp_set_servers_from_dhcp = new_mode;\n  }\n}\n#endif /* SNTP_GET_SERVERS_FROM_DHCP */\n\n/**\n * @ingroup sntp\n * Initialize one of the NTP servers by IP address\n *\n * @param idx the index of the NTP server to set must be < SNTP_MAX_SERVERS\n * @param server IP address of the NTP server to set\n */\nvoid\nsntp_setserver(u8_t idx, const ip_addr_t *server)\n{\n  if (idx < SNTP_MAX_SERVERS) {\n    if (server != NULL) {\n      sntp_servers[idx].addr = (*server);\n    } else {\n      ip_addr_set_zero(&sntp_servers[idx].addr);\n    }\n#if SNTP_SERVER_DNS\n    sntp_servers[idx].name = NULL;\n#endif\n  }\n}\n\n#if LWIP_DHCP && SNTP_GET_SERVERS_FROM_DHCP\n/**\n * Initialize one of the NTP servers by IP address, required by DHCP\n *\n * @param numdns the index of the NTP server to set must be < SNTP_MAX_SERVERS\n * @param dnsserver IP address of the NTP server to set\n */\nvoid\ndhcp_set_ntp_servers(u8_t num, const ip4_addr_t *server)\n{\n  LWIP_DEBUGF(SNTP_DEBUG_TRACE, (\"sntp: %s %u.%u.%u.%u as NTP server #%u via DHCP\\n\",\n    (sntp_set_servers_from_dhcp ? \"Got\" : \"Rejected\"),\n    ip4_addr1(server), ip4_addr2(server), ip4_addr3(server), ip4_addr4(server), num));\n  if (sntp_set_servers_from_dhcp && num) {\n    u8_t i;\n    for (i = 0; (i < num) && (i < SNTP_MAX_SERVERS); i++) {\n      ip_addr_t addr;\n      ip_addr_copy_from_ip4(addr, server[i]);\n      sntp_setserver(i, &addr);\n    }\n    for (i = num; i < SNTP_MAX_SERVERS; i++) {\n      sntp_setserver(i, NULL);\n    }\n  }\n}\n#endif /* LWIP_DHCP && SNTP_GET_SERVERS_FROM_DHCP */\n\n/**\n * @ingroup sntp\n * Obtain one of the currently configured by IP address (or DHCP) NTP servers\n *\n * @param idx the index of the NTP server\n * @return IP address of the indexed NTP server or \"ip_addr_any\" if the NTP\n *         server has not been configured by address (or at all).\n */\nconst ip_addr_t*\nsntp_getserver(u8_t idx)\n{\n  if (idx < SNTP_MAX_SERVERS) {\n    return &sntp_servers[idx].addr;\n  }\n  return IP_ADDR_ANY;\n}\n\n#if SNTP_SERVER_DNS\n/**\n * Initialize one of the NTP servers by name\n *\n * @param numdns the index of the NTP server to set must be < SNTP_MAX_SERVERS\n * @param dnsserver DNS name of the NTP server to set, to be resolved at contact time\n */\nvoid\nsntp_setservername(u8_t idx, char *server)\n{\n  if (idx < SNTP_MAX_SERVERS) {\n    sntp_servers[idx].name = server;\n  }\n}\n\n/**\n * Obtain one of the currently configured by name NTP servers.\n *\n * @param numdns the index of the NTP server\n * @return IP address of the indexed NTP server or NULL if the NTP\n *         server has not been configured by name (or at all)\n */\nchar *\nsntp_getservername(u8_t idx)\n{\n  if (idx < SNTP_MAX_SERVERS) {\n    return sntp_servers[idx].name;\n  }\n  return NULL;\n}\n#endif /* SNTP_SERVER_DNS */\n\n#endif /* LWIP_UDP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/apps/tftp/tftp_server.c",
    "content": "/****************************************************************//**\n *\n * @file tftp_server.c\n *\n * @author   Logan Gunthorpe <logang@deltatee.com>\n *           Dirk Ziegelmeier <dziegel@gmx.de>\n *\n * @brief    Trivial File Transfer Protocol (RFC 1350)\n *\n * Copyright (c) Deltatee Enterprises Ltd. 2013\n * All rights reserved.\n *\n ********************************************************************/\n\n/* \n * Redistribution and use in source and binary forms, with or without\n * modification,are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Author: Logan Gunthorpe <logang@deltatee.com>\n *         Dirk Ziegelmeier <dziegel@gmx.de>\n *\n */\n\n/**\n * @defgroup tftp TFTP server\n * @ingroup apps\n *\n * This is simple TFTP server for the lwIP raw API.\n */\n\n#include \"lwip/apps/tftp_server.h\"\n\n#if LWIP_UDP\n\n#include \"lwip/udp.h\"\n#include \"lwip/timeouts.h\"\n#include \"lwip/debug.h\"\n\n#define TFTP_MAX_PAYLOAD_SIZE 512\n#define TFTP_HEADER_LENGTH    4\n\n#define TFTP_RRQ   1\n#define TFTP_WRQ   2\n#define TFTP_DATA  3\n#define TFTP_ACK   4\n#define TFTP_ERROR 5\n\nenum tftp_error {\n  TFTP_ERROR_FILE_NOT_FOUND    = 1,\n  TFTP_ERROR_ACCESS_VIOLATION  = 2,\n  TFTP_ERROR_DISK_FULL         = 3,\n  TFTP_ERROR_ILLEGAL_OPERATION = 4,\n  TFTP_ERROR_UNKNOWN_TRFR_ID   = 5,\n  TFTP_ERROR_FILE_EXISTS       = 6,\n  TFTP_ERROR_NO_SUCH_USER      = 7\n};\n\n#include <string.h>\n\nstruct tftp_state {\n  const struct tftp_context *ctx;\n  void *handle;\n  struct pbuf *last_data;\n  struct udp_pcb *upcb;\n  ip_addr_t addr;\n  u16_t port;\n  int timer;\n  int last_pkt;\n  u16_t blknum;\n  u8_t retries;\n  u8_t mode_write;\n};\n\nstatic struct tftp_state tftp_state;\n\nstatic void tftp_tmr(void* arg);\n\nstatic void\nclose_handle(void)\n{\n  tftp_state.port = 0;\n  ip_addr_set_any(0, &tftp_state.addr);\n\n  if(tftp_state.last_data != NULL) {\n    pbuf_free(tftp_state.last_data);\n    tftp_state.last_data = NULL;\n  }\n\n  sys_untimeout(tftp_tmr, NULL);\n  \n  if (tftp_state.handle) {\n    tftp_state.ctx->close(tftp_state.handle);\n    tftp_state.handle = NULL;\n    LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, (\"tftp: closing\\n\"));\n  }\n}\n\nstatic void\nsend_error(const ip_addr_t *addr, u16_t port, enum tftp_error code, const char *str)\n{\n  int str_length = strlen(str);\n  struct pbuf* p;\n  u16_t* payload;\n  \n  p = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(TFTP_HEADER_LENGTH + str_length + 1), PBUF_RAM);\n  if(p == NULL) {\n    return;\n  }\n\n  payload = (u16_t*) p->payload;\n  payload[0] = PP_HTONS(TFTP_ERROR);\n  payload[1] = lwip_htons(code);\n  MEMCPY(&payload[2], str, str_length + 1);\n\n  udp_sendto(tftp_state.upcb, p, addr, port);\n  pbuf_free(p);\n}\n\nstatic void\nsend_ack(u16_t blknum)\n{\n  struct pbuf* p;\n  u16_t* payload;\n  \n  p = pbuf_alloc(PBUF_TRANSPORT, TFTP_HEADER_LENGTH, PBUF_RAM);\n  if(p == NULL) {\n    return;\n  }\n  payload = (u16_t*) p->payload;\n  \n  payload[0] = PP_HTONS(TFTP_ACK);\n  payload[1] = lwip_htons(blknum);\n  udp_sendto(tftp_state.upcb, p, &tftp_state.addr, tftp_state.port);\n  pbuf_free(p);\n}\n\nstatic void\nresend_data(void)\n{\n  struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, tftp_state.last_data->len, PBUF_RAM);\n  if(p == NULL) {\n    return;\n  }\n\n  if(pbuf_copy(p, tftp_state.last_data) != ERR_OK) {\n    pbuf_free(p);\n    return;\n  }\n    \n  udp_sendto(tftp_state.upcb, p, &tftp_state.addr, tftp_state.port);\n  pbuf_free(p);\n}\n\nstatic void\nsend_data(void)\n{\n  u16_t *payload;\n  int ret;\n\n  if(tftp_state.last_data != NULL) {\n    pbuf_free(tftp_state.last_data);\n  }\n  \n  tftp_state.last_data = pbuf_alloc(PBUF_TRANSPORT, TFTP_HEADER_LENGTH + TFTP_MAX_PAYLOAD_SIZE, PBUF_RAM);\n  if(tftp_state.last_data == NULL) {\n    return;\n  }\n\n  payload = (u16_t *) tftp_state.last_data->payload;\n  payload[0] = PP_HTONS(TFTP_DATA);\n  payload[1] = lwip_htons(tftp_state.blknum);\n\n  ret = tftp_state.ctx->read(tftp_state.handle, &payload[2], TFTP_MAX_PAYLOAD_SIZE);\n  if (ret < 0) {\n    send_error(&tftp_state.addr, tftp_state.port, TFTP_ERROR_ACCESS_VIOLATION, \"Error occured while reading the file.\");\n    close_handle();\n    return;\n  }\n\n  pbuf_realloc(tftp_state.last_data, (u16_t)(TFTP_HEADER_LENGTH + ret));\n  resend_data();\n}\n\nstatic void\nrecv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)\n{\n  u16_t *sbuf = (u16_t *) p->payload;\n  int opcode;\n\n  LWIP_UNUSED_ARG(arg);\n  LWIP_UNUSED_ARG(upcb);\n  \n  if (((tftp_state.port != 0) && (port != tftp_state.port)) ||\n      (!ip_addr_isany_val(tftp_state.addr) && !ip_addr_cmp(&tftp_state.addr, addr))) {\n    send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, \"Only one connection at a time is supported\");\n    pbuf_free(p);\n    return;\n  }\n\n  opcode = sbuf[0];\n\n  tftp_state.last_pkt = tftp_state.timer;\n  tftp_state.retries = 0;\n\n  switch (opcode) {\n    case PP_HTONS(TFTP_RRQ): /* fall through */\n    case PP_HTONS(TFTP_WRQ):\n    {\n      const char tftp_null = 0;\n      char filename[TFTP_MAX_FILENAME_LEN];\n      char mode[TFTP_MAX_MODE_LEN];\n      u16_t filename_end_offset;\n      u16_t mode_end_offset;\n\n      if(tftp_state.handle != NULL) {\n        send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, \"Only one connection at a time is supported\");\n        break;\n      }\n      \n      sys_timeout(TFTP_TIMER_MSECS, tftp_tmr, NULL);\n\n      /* find \\0 in pbuf -> end of filename string */\n      filename_end_offset = pbuf_memfind(p, &tftp_null, sizeof(tftp_null), 2);\n      if((u16_t)(filename_end_offset-2) > sizeof(filename)) {\n        send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, \"Filename too long/not NULL terminated\");\n        break;\n      }\n      pbuf_copy_partial(p, filename, filename_end_offset-2, 2);\n\n      /* find \\0 in pbuf -> end of mode string */\n      mode_end_offset = pbuf_memfind(p, &tftp_null, sizeof(tftp_null), filename_end_offset+1);\n      if((u16_t)(mode_end_offset-filename_end_offset) > sizeof(mode)) {\n        send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, \"Mode too long/not NULL terminated\");\n        break;\n      }\n      pbuf_copy_partial(p, mode, mode_end_offset-filename_end_offset, filename_end_offset+1);\n \n      tftp_state.handle = tftp_state.ctx->open(filename, mode, opcode == PP_HTONS(TFTP_WRQ));\n      tftp_state.blknum = 1;\n\n      if (!tftp_state.handle) {\n        send_error(addr, port, TFTP_ERROR_FILE_NOT_FOUND, \"Unable to open requested file.\");\n        break;\n      }\n\n      LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, (\"tftp: %s request from \", (opcode == PP_HTONS(TFTP_WRQ)) ? \"write\" : \"read\"));\n      ip_addr_debug_print(TFTP_DEBUG | LWIP_DBG_STATE, addr);\n      LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, (\" for '%s' mode '%s'\\n\", filename, mode));\n\n      ip_addr_copy(tftp_state.addr, *addr);\n      tftp_state.port = port;\n\n      if (opcode == PP_HTONS(TFTP_WRQ)) {\n        tftp_state.mode_write = 1;\n        send_ack(0);\n      } else {\n        tftp_state.mode_write = 0;\n        send_data();\n      }\n\n      break;\n    }\n    \n    case PP_HTONS(TFTP_DATA):\n    {\n      int ret;\n      u16_t blknum;\n      \n      if (tftp_state.handle == NULL) {\n        send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, \"No connection\");\n        break;\n      }\n\n      if (tftp_state.mode_write != 1) {\n        send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, \"Not a write connection\");\n        break;\n      }\n\n      blknum = lwip_ntohs(sbuf[1]);\n      pbuf_header(p, -TFTP_HEADER_LENGTH);\n\n      ret = tftp_state.ctx->write(tftp_state.handle, p);\n      if (ret < 0) {\n        send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, \"error writing file\");\n        close_handle();\n      } else {\n        send_ack(blknum);\n      }\n\n      if (p->tot_len < TFTP_MAX_PAYLOAD_SIZE) {\n        close_handle();\n      }\n      break;\n    }\n\n    case PP_HTONS(TFTP_ACK):\n    {\n      u16_t blknum;\n      int lastpkt;\n\n      if (tftp_state.handle == NULL) {\n        send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, \"No connection\");\n        break;\n      }\n\n      if (tftp_state.mode_write != 0) {\n        send_error(addr, port, TFTP_ERROR_ACCESS_VIOLATION, \"Not a read connection\");\n        break;\n      }\n\n      blknum = lwip_ntohs(sbuf[1]);\n      if (blknum != tftp_state.blknum) {\n        send_error(addr, port, TFTP_ERROR_UNKNOWN_TRFR_ID, \"Wrong block number\");\n        break;\n      }\n\n      lastpkt = 0;\n\n      if (tftp_state.last_data != NULL) {\n        lastpkt = tftp_state.last_data->tot_len != (TFTP_MAX_PAYLOAD_SIZE + TFTP_HEADER_LENGTH);\n      }\n\n      if (!lastpkt) {\n        tftp_state.blknum++;\n        send_data();\n      } else {\n        close_handle();\n      }\n\n      break;\n    }\n    \n    default:\n      send_error(addr, port, TFTP_ERROR_ILLEGAL_OPERATION, \"Unknown operation\");\n      break;\n  }\n\n  pbuf_free(p);\n}\n\nstatic void\ntftp_tmr(void* arg)\n{\n  LWIP_UNUSED_ARG(arg);\n  \n  tftp_state.timer++;\n\n  if (tftp_state.handle == NULL) {\n    return;\n  }\n\n  sys_timeout(TFTP_TIMER_MSECS, tftp_tmr, NULL);\n\n  if ((tftp_state.timer - tftp_state.last_pkt) > (TFTP_TIMEOUT_MSECS / TFTP_TIMER_MSECS)) {\n    if ((tftp_state.last_data != NULL) && (tftp_state.retries < TFTP_MAX_RETRIES)) {\n      LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, (\"tftp: timeout, retrying\\n\"));\n      resend_data();\n      tftp_state.retries++;\n    } else {\n      LWIP_DEBUGF(TFTP_DEBUG | LWIP_DBG_STATE, (\"tftp: timeout\\n\"));\n      close_handle();\n    }\n  }\n}\n\n/** @ingroup tftp\n * Initialize TFTP server.\n * @param ctx TFTP callback struct\n */\nerr_t \ntftp_init(const struct tftp_context *ctx)\n{\n  err_t ret;\n\n  struct udp_pcb *pcb = udp_new_ip_type(IPADDR_TYPE_ANY);\n  if (pcb == NULL) {\n    return ERR_MEM;\n  }\n\n  ret = udp_bind(pcb, IP_ANY_TYPE, TFTP_PORT);\n  if (ret != ERR_OK) {\n    udp_remove(pcb);\n    return ret;\n  }\n\n  tftp_state.handle    = NULL;\n  tftp_state.port      = 0;\n  tftp_state.ctx       = ctx;\n  tftp_state.timer     = 0;\n  tftp_state.last_data = NULL;\n  tftp_state.upcb      = pcb;\n\n  udp_recv(pcb, recv, NULL);\n\n  return ERR_OK;\n}\n\n#endif /* LWIP_UDP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/def.c",
    "content": "/**\n * @file\n * Common functions used throughout the stack.\n *\n * These are reference implementations of the byte swapping functions.\n * Again with the aim of being simple, correct and fully portable.\n * Byte swapping is the second thing you would want to optimize. You will\n * need to port it to your architecture and in your cc.h:\n *\n * \\#define lwip_htons(x) your_htons\n * \\#define lwip_htonl(x) your_htonl\n *\n * Note lwip_ntohs() and lwip_ntohl() are merely references to the htonx counterparts.\n * \n * If you \\#define them to htons() and htonl(), you should\n * \\#define LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS to prevent lwIP from\n * defining htonx/ntohx compatibility macros.\n\n * @defgroup sys_nonstandard Non-standard functions\n * @ingroup sys_layer\n * lwIP provides default implementations for non-standard functions.\n * These can be mapped to OS functions to reduce code footprint if desired.\n * All defines related to this section must not be placed in lwipopts.h,\n * but in arch/cc.h!\n * These options cannot be \\#defined in lwipopts.h since they are not options\n * of lwIP itself, but options of the lwIP port to your system.\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Simon Goldschmidt\n *\n */\n\n#include \"lwip/opt.h\"\n#include \"lwip/def.h\"\n\n#include <string.h>\n\n#if BYTE_ORDER == LITTLE_ENDIAN\n\n#if !defined(lwip_htons)\n/**\n * Convert an u16_t from host- to network byte order.\n *\n * @param n u16_t in host byte order\n * @return n in network byte order\n */\nu16_t\nlwip_htons(u16_t n)\n{\n  return (u16_t)PP_HTONS(n);\n}\n#endif /* lwip_htons */\n\n#if !defined(lwip_htonl)\n/**\n * Convert an u32_t from host- to network byte order.\n *\n * @param n u32_t in host byte order\n * @return n in network byte order\n */\nu32_t\nlwip_htonl(u32_t n)\n{\n  return (u32_t)PP_HTONL(n);\n}\n#endif /* lwip_htonl */\n\n#endif /* BYTE_ORDER == LITTLE_ENDIAN */\n\n#ifndef lwip_strnstr\n/**\n * @ingroup sys_nonstandard\n * lwIP default implementation for strnstr() non-standard function.\n * This can be \\#defined to strnstr() depending on your platform port.\n */\nchar*\nlwip_strnstr(const char* buffer, const char* token, size_t n)\n{\n  const char* p;\n  size_t tokenlen = strlen(token);\n  if (tokenlen == 0) {\n    return LWIP_CONST_CAST(char *, buffer);\n  }\n  for (p = buffer; *p && (p + tokenlen <= buffer + n); p++) {\n    if ((*p == *token) && (strncmp(p, token, tokenlen) == 0)) {\n      return LWIP_CONST_CAST(char *, p);\n    }\n  }\n  return NULL;\n}\n#endif\n\n#ifndef lwip_stricmp\n/**\n * @ingroup sys_nonstandard\n * lwIP default implementation for stricmp() non-standard function.\n * This can be \\#defined to stricmp() depending on your platform port.\n */\nint\nlwip_stricmp(const char* str1, const char* str2)\n{\n  char c1, c2;\n\n  do {\n    c1 = *str1++;\n    c2 = *str2++;\n    if (c1 != c2) {\n      char c1_upc = c1 | 0x20;\n      if ((c1_upc >= 'a') && (c1_upc <= 'z')) {\n        /* characters are not equal an one is in the alphabet range:\n        downcase both chars and check again */\n        char c2_upc = c2 | 0x20;\n        if (c1_upc != c2_upc) {\n          /* still not equal */\n          /* don't care for < or > */\n          return 1;\n        }\n      } else {\n        /* characters are not equal but none is in the alphabet range */\n        return 1;\n      }\n    }\n  } while (c1 != 0);\n  return 0;\n}\n#endif\n\n#ifndef lwip_strnicmp\n/**\n * @ingroup sys_nonstandard\n * lwIP default implementation for strnicmp() non-standard function.\n * This can be \\#defined to strnicmp() depending on your platform port.\n */\nint\nlwip_strnicmp(const char* str1, const char* str2, size_t len)\n{\n  char c1, c2;\n\n  do {\n    c1 = *str1++;\n    c2 = *str2++;\n    if (c1 != c2) {\n      char c1_upc = c1 | 0x20;\n      if ((c1_upc >= 'a') && (c1_upc <= 'z')) {\n        /* characters are not equal an one is in the alphabet range:\n        downcase both chars and check again */\n        char c2_upc = c2 | 0x20;\n        if (c1_upc != c2_upc) {\n          /* still not equal */\n          /* don't care for < or > */\n          return 1;\n        }\n      } else {\n        /* characters are not equal but none is in the alphabet range */\n        return 1;\n      }\n    }\n  } while (len-- && c1 != 0);\n  return 0;\n}\n#endif\n\n#ifndef lwip_itoa\n/**\n * @ingroup sys_nonstandard\n * lwIP default implementation for itoa() non-standard function.\n * This can be \\#defined to itoa() or snprintf(result, bufsize, \"%d\", number) depending on your platform port.\n */\nvoid\nlwip_itoa(char* result, size_t bufsize, int number)\n{\n  const int base = 10;\n  char* ptr = result, *ptr1 = result, tmp_char;\n  int tmp_value;\n  LWIP_UNUSED_ARG(bufsize);\n\n  do {\n    tmp_value = number;\n    number /= base;\n    *ptr++ = \"zyxwvutsrqponmlkjihgfedcba9876543210123456789abcdefghijklmnopqrstuvwxyz\"[35 + (tmp_value - number * base)];\n  } while(number);\n\n   /* Apply negative sign */\n  if (tmp_value < 0) {\n     *ptr++ = '-';\n  }\n  *ptr-- = '\\0';\n  while(ptr1 < ptr) {\n    tmp_char = *ptr;\n    *ptr--= *ptr1;\n    *ptr1++ = tmp_char;\n  }\n}\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/dns.c",
    "content": "/**\n * @file\n * DNS - host name to IP address resolver.\n *\n * @defgroup dns DNS\n * @ingroup callbackstyle_api\n *\n * Implements a DNS host name to IP address resolver.\n *\n * The lwIP DNS resolver functions are used to lookup a host name and\n * map it to a numerical IP address. It maintains a list of resolved\n * hostnames that can be queried with the dns_lookup() function.\n * New hostnames can be resolved using the dns_query() function.\n *\n * The lwIP version of the resolver also adds a non-blocking version of\n * gethostbyname() that will work with a raw API application. This function\n * checks for an IP address string first and converts it if it is valid.\n * gethostbyname() then does a dns_lookup() to see if the name is\n * already in the table. If so, the IP is returned. If not, a query is\n * issued and the function returns with a ERR_INPROGRESS status. The app\n * using the dns client must then go into a waiting state.\n *\n * Once a hostname has been resolved (or found to be non-existent),\n * the resolver code calls a specified callback function (which\n * must be implemented by the module that uses the resolver).\n * \n * Multicast DNS queries are supported for names ending on \".local\".\n * However, only \"One-Shot Multicast DNS Queries\" are supported (RFC 6762\n * chapter 5.1), this is not a fully compliant implementation of continuous\n * mDNS querying!\n *\n * All functions must be called from TCPIP thread.\n * \n * @see @ref netconn_common for thread-safe access.\n */\n\n/*\n * Port to lwIP from uIP\n * by Jim Pettinato April 2007\n *\n * security fixes and more by Simon Goldschmidt\n *\n * uIP version Copyright (c) 2002-2003, Adam Dunkels.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote\n *    products derived from this software without specific prior\n *    written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*-----------------------------------------------------------------------------\n * RFC 1035 - Domain names - implementation and specification\n * RFC 2181 - Clarifications to the DNS Specification\n *----------------------------------------------------------------------------*/\n\n/** @todo: define good default values (rfc compliance) */\n/** @todo: improve answer parsing, more checkings... */\n/** @todo: check RFC1035 - 7.3. Processing responses */\n/** @todo: one-shot mDNS: dual-stack fallback to another IP version */\n\n/*-----------------------------------------------------------------------------\n * Includes\n *----------------------------------------------------------------------------*/\n\n#include \"lwip/opt.h\"\n\n#if LWIP_DNS /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/def.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/dns.h\"\n#include \"lwip/prot/dns.h\"\n\n#include <string.h>\n\n/** Random generator function to create random TXIDs and source ports for queries */\n#ifndef DNS_RAND_TXID\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_XID) != 0)\n#define DNS_RAND_TXID LWIP_RAND\n#else\nstatic u16_t dns_txid;\n#define DNS_RAND_TXID() (++dns_txid)\n#endif\n#endif\n\n/** Limits the source port to be >= 1024 by default */\n#ifndef DNS_PORT_ALLOWED\n#define DNS_PORT_ALLOWED(port) ((port) >= 1024)\n#endif\n\n/** DNS maximum number of retries when asking for a name, before \"timeout\". */\n#ifndef DNS_MAX_RETRIES\n#define DNS_MAX_RETRIES           4\n#endif\n\n/** DNS resource record max. TTL (one week as default) */\n#ifndef DNS_MAX_TTL\n#define DNS_MAX_TTL               604800\n#elif DNS_MAX_TTL > 0x7FFFFFFF\n#error DNS_MAX_TTL must be a positive 32-bit value\n#endif\n\n#if DNS_TABLE_SIZE > 255\n#error DNS_TABLE_SIZE must fit into an u8_t\n#endif\n#if DNS_MAX_SERVERS > 255\n#error DNS_MAX_SERVERS must fit into an u8_t\n#endif\n\n/* The number of parallel requests (i.e. calls to dns_gethostbyname\n * that cannot be answered from the DNS table.\n * This is set to the table size by default.\n */\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)\n#ifndef DNS_MAX_REQUESTS\n#define DNS_MAX_REQUESTS          DNS_TABLE_SIZE\n#else\n#if DNS_MAX_REQUESTS > 255\n#error DNS_MAX_REQUESTS must fit into an u8_t\n#endif\n#endif\n#else\n/* In this configuration, both arrays have to have the same size and are used\n * like one entry (used/free) */\n#define DNS_MAX_REQUESTS          DNS_TABLE_SIZE\n#endif\n\n/* The number of UDP source ports used in parallel */\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)\n#ifndef DNS_MAX_SOURCE_PORTS\n#define DNS_MAX_SOURCE_PORTS      DNS_MAX_REQUESTS\n#else\n#if DNS_MAX_SOURCE_PORTS > 255\n#error DNS_MAX_SOURCE_PORTS must fit into an u8_t\n#endif\n#endif\n#else\n#ifdef DNS_MAX_SOURCE_PORTS\n#undef DNS_MAX_SOURCE_PORTS\n#endif\n#define DNS_MAX_SOURCE_PORTS      1\n#endif\n\n#if LWIP_IPV4 && LWIP_IPV6\n#define LWIP_DNS_ADDRTYPE_IS_IPV6(t) (((t) == LWIP_DNS_ADDRTYPE_IPV6_IPV4) || ((t) == LWIP_DNS_ADDRTYPE_IPV6))\n#define LWIP_DNS_ADDRTYPE_MATCH_IP(t, ip) (IP_IS_V6_VAL(ip) ? LWIP_DNS_ADDRTYPE_IS_IPV6(t) : (!LWIP_DNS_ADDRTYPE_IS_IPV6(t)))\n#define LWIP_DNS_ADDRTYPE_ARG(x) , x\n#define LWIP_DNS_ADDRTYPE_ARG_OR_ZERO(x) x\n#define LWIP_DNS_SET_ADDRTYPE(x, y) do { x = y; } while(0)\n#else\n#if LWIP_IPV6\n#define LWIP_DNS_ADDRTYPE_IS_IPV6(t) 1\n#else\n#define LWIP_DNS_ADDRTYPE_IS_IPV6(t) 0\n#endif\n#define LWIP_DNS_ADDRTYPE_MATCH_IP(t, ip) 1\n#define LWIP_DNS_ADDRTYPE_ARG(x)\n#define LWIP_DNS_ADDRTYPE_ARG_OR_ZERO(x) 0\n#define LWIP_DNS_SET_ADDRTYPE(x, y)\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n#if LWIP_DNS_SUPPORT_MDNS_QUERIES\n#define LWIP_DNS_ISMDNS_ARG(x) , x\n#else\n#define LWIP_DNS_ISMDNS_ARG(x)\n#endif\n\n/** DNS query message structure.\n    No packing needed: only used locally on the stack. */\nstruct dns_query {\n  /* DNS query record starts with either a domain name or a pointer\n     to a name already present somewhere in the packet. */\n  u16_t type;\n  u16_t cls;\n};\n#define SIZEOF_DNS_QUERY 4\n\n/** DNS answer message structure.\n    No packing needed: only used locally on the stack. */\nstruct dns_answer {\n  /* DNS answer record starts with either a domain name or a pointer\n     to a name already present somewhere in the packet. */\n  u16_t type;\n  u16_t cls;\n  u32_t ttl;\n  u16_t len;\n};\n#define SIZEOF_DNS_ANSWER 10\n/* maximum allowed size for the struct due to non-packed */\n#define SIZEOF_DNS_ANSWER_ASSERT 12\n\n/* DNS table entry states */\ntypedef enum {\n  DNS_STATE_UNUSED           = 0,\n  DNS_STATE_NEW              = 1,\n  DNS_STATE_ASKING           = 2,\n  DNS_STATE_DONE             = 3\n} dns_state_enum_t;\n\n/** DNS table entry */\nstruct dns_table_entry {\n  u32_t ttl;\n  ip_addr_t ipaddr;\n  u16_t txid;\n  u8_t  state;\n  u8_t  server_idx;\n  u8_t  tmr;\n  u8_t  retries;\n  u8_t  seqno;\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)\n  u8_t pcb_idx;\n#endif\n  char name[DNS_MAX_NAME_LENGTH];\n#if LWIP_IPV4 && LWIP_IPV6\n  u8_t reqaddrtype;\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n#if LWIP_DNS_SUPPORT_MDNS_QUERIES\n  u8_t is_mdns;\n#endif\n};\n\n/** DNS request table entry: used when dns_gehostbyname cannot answer the\n * request from the DNS table */\nstruct dns_req_entry {\n  /* pointer to callback on DNS query done */\n  dns_found_callback found;\n  /* argument passed to the callback function */\n  void *arg;\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)\n  u8_t dns_table_idx;\n#endif\n#if LWIP_IPV4 && LWIP_IPV6\n  u8_t reqaddrtype;\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n};\n\n#if DNS_LOCAL_HOSTLIST\n\n#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC\n/** Local host-list. For hostnames in this list, no\n *  external name resolution is performed */\nstatic struct local_hostlist_entry *local_hostlist_dynamic;\n#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */\n\n/** Defining this allows the local_hostlist_static to be placed in a different\n * linker section (e.g. FLASH) */\n#ifndef DNS_LOCAL_HOSTLIST_STORAGE_PRE\n#define DNS_LOCAL_HOSTLIST_STORAGE_PRE static\n#endif /* DNS_LOCAL_HOSTLIST_STORAGE_PRE */\n/** Defining this allows the local_hostlist_static to be placed in a different\n * linker section (e.g. FLASH) */\n#ifndef DNS_LOCAL_HOSTLIST_STORAGE_POST\n#define DNS_LOCAL_HOSTLIST_STORAGE_POST\n#endif /* DNS_LOCAL_HOSTLIST_STORAGE_POST */\nDNS_LOCAL_HOSTLIST_STORAGE_PRE struct local_hostlist_entry local_hostlist_static[]\n  DNS_LOCAL_HOSTLIST_STORAGE_POST = DNS_LOCAL_HOSTLIST_INIT;\n\n#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */\n\nstatic void dns_init_local(void);\nstatic err_t dns_lookup_local(const char *hostname, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype));\n#endif /* DNS_LOCAL_HOSTLIST */\n\n\n/* forward declarations */\nstatic void dns_recv(void *s, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);\nstatic void dns_check_entries(void);\nstatic void dns_call_found(u8_t idx, ip_addr_t* addr);\n\n/*-----------------------------------------------------------------------------\n * Globals\n *----------------------------------------------------------------------------*/\n\n/* DNS variables */\nstatic struct udp_pcb        *dns_pcbs[DNS_MAX_SOURCE_PORTS];\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)\nstatic u8_t                   dns_last_pcb_idx;\n#endif\nstatic u8_t                   dns_seqno;\nstatic struct dns_table_entry dns_table[DNS_TABLE_SIZE];\nstatic struct dns_req_entry   dns_requests[DNS_MAX_REQUESTS];\nstatic ip_addr_t              dns_servers[DNS_MAX_SERVERS];\n\n#if LWIP_IPV4\nconst ip_addr_t dns_mquery_v4group = DNS_MQUERY_IPV4_GROUP_INIT;\n#endif /* LWIP_IPV4 */\n#if LWIP_IPV6\nconst ip_addr_t dns_mquery_v6group = DNS_MQUERY_IPV6_GROUP_INIT;\n#endif /* LWIP_IPV6 */\n\n/**\n * Initialize the resolver: set up the UDP pcb and configure the default server\n * (if DNS_SERVER_ADDRESS is set).\n */\nvoid\ndns_init(void)\n{\n#ifdef DNS_SERVER_ADDRESS\n  /* initialize default DNS server address */\n  ip_addr_t dnsserver;\n  DNS_SERVER_ADDRESS(&dnsserver);\n  dns_setserver(0, &dnsserver);\n#endif /* DNS_SERVER_ADDRESS */\n\n  LWIP_ASSERT(\"sanity check SIZEOF_DNS_QUERY\",\n    sizeof(struct dns_query) == SIZEOF_DNS_QUERY);\n  LWIP_ASSERT(\"sanity check SIZEOF_DNS_ANSWER\",\n    sizeof(struct dns_answer) <= SIZEOF_DNS_ANSWER_ASSERT);\n\n  LWIP_DEBUGF(DNS_DEBUG, (\"dns_init: initializing\\n\"));\n\n  /* if dns client not yet initialized... */\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) == 0)\n  if (dns_pcbs[0] == NULL) {\n    dns_pcbs[0] = udp_new_ip_type(IPADDR_TYPE_ANY);\n    LWIP_ASSERT(\"dns_pcbs[0] != NULL\", dns_pcbs[0] != NULL);\n\n    /* initialize DNS table not needed (initialized to zero since it is a\n     * global variable) */\n    LWIP_ASSERT(\"For implicit initialization to work, DNS_STATE_UNUSED needs to be 0\",\n      DNS_STATE_UNUSED == 0);\n\n    /* initialize DNS client */\n    udp_bind(dns_pcbs[0], IP_ANY_TYPE, 0);\n    udp_recv(dns_pcbs[0], dns_recv, NULL);\n  }\n#endif\n\n#if DNS_LOCAL_HOSTLIST\n  dns_init_local();\n#endif\n}\n\n/**\n * @ingroup dns\n * Initialize one of the DNS servers.\n *\n * @param numdns the index of the DNS server to set must be < DNS_MAX_SERVERS\n * @param dnsserver IP address of the DNS server to set\n */\nvoid\ndns_setserver(u8_t numdns, const ip_addr_t *dnsserver)\n{\n  if (numdns < DNS_MAX_SERVERS) {\n    if (dnsserver != NULL) {\n      dns_servers[numdns] = (*dnsserver);\n    } else {\n      dns_servers[numdns] = *IP_ADDR_ANY;\n    }\n  }\n}\n\n/**\n * @ingroup dns\n * Obtain one of the currently configured DNS server.\n *\n * @param numdns the index of the DNS server\n * @return IP address of the indexed DNS server or \"ip_addr_any\" if the DNS\n *         server has not been configured.\n */\nconst ip_addr_t*\ndns_getserver(u8_t numdns)\n{\n  if (numdns < DNS_MAX_SERVERS) {\n    return &dns_servers[numdns];\n  } else {\n    return IP_ADDR_ANY;\n  }\n}\n\n/**\n * The DNS resolver client timer - handle retries and timeouts and should\n * be called every DNS_TMR_INTERVAL milliseconds (every second by default).\n */\nvoid\ndns_tmr(void)\n{\n  LWIP_DEBUGF(DNS_DEBUG, (\"dns_tmr: dns_check_entries\\n\"));\n  dns_check_entries();\n}\n\n#if DNS_LOCAL_HOSTLIST\nstatic void\ndns_init_local(void)\n{\n#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC && defined(DNS_LOCAL_HOSTLIST_INIT)\n  size_t i;\n  struct local_hostlist_entry *entry;\n  /* Dynamic: copy entries from DNS_LOCAL_HOSTLIST_INIT to list */\n  struct local_hostlist_entry local_hostlist_init[] = DNS_LOCAL_HOSTLIST_INIT;\n  size_t namelen;\n  for (i = 0; i < LWIP_ARRAYSIZE(local_hostlist_init); i++) {\n    struct local_hostlist_entry *init_entry = &local_hostlist_init[i];\n    LWIP_ASSERT(\"invalid host name (NULL)\", init_entry->name != NULL);\n    namelen = strlen(init_entry->name);\n    LWIP_ASSERT(\"namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN\", namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN);\n    entry = (struct local_hostlist_entry *)memp_malloc(MEMP_LOCALHOSTLIST);\n    LWIP_ASSERT(\"mem-error in dns_init_local\", entry != NULL);\n    if (entry != NULL) {\n      char* entry_name = (char*)entry + sizeof(struct local_hostlist_entry);\n      MEMCPY(entry_name, init_entry->name, namelen);\n      entry_name[namelen] = 0;\n      entry->name = entry_name;\n      entry->addr = init_entry->addr;\n      entry->next = local_hostlist_dynamic;\n      local_hostlist_dynamic = entry;\n    }\n  }\n#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC && defined(DNS_LOCAL_HOSTLIST_INIT) */\n}\n\n/**\n * @ingroup dns\n * Iterate the local host-list for a hostname.\n *\n * @param iterator_fn a function that is called for every entry in the local host-list\n * @param iterator_arg 3rd argument passed to iterator_fn\n * @return the number of entries in the local host-list\n */\nsize_t\ndns_local_iterate(dns_found_callback iterator_fn, void *iterator_arg)\n{\n  size_t i;\n#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC\n  struct local_hostlist_entry *entry = local_hostlist_dynamic;\n  i = 0;\n  while (entry != NULL) {\n    if (iterator_fn != NULL) {\n      iterator_fn(entry->name, &entry->addr, iterator_arg);\n    }\n    i++;\n    entry = entry->next;\n  }\n#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */\n  for (i = 0; i < LWIP_ARRAYSIZE(local_hostlist_static); i++) {\n    if (iterator_fn != NULL) {\n      iterator_fn(local_hostlist_static[i].name, &local_hostlist_static[i].addr, iterator_arg);\n    }\n  }\n#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */\n  return i;\n}\n\n/**\n * @ingroup dns\n * Scans the local host-list for a hostname.\n *\n * @param hostname Hostname to look for in the local host-list\n * @param addr the first IP address for the hostname in the local host-list or\n *         IPADDR_NONE if not found.\n * @param dns_addrtype - LWIP_DNS_ADDRTYPE_IPV4_IPV6: try to resolve IPv4 (ATTENTION: no fallback here!)\n *                     - LWIP_DNS_ADDRTYPE_IPV6_IPV4: try to resolve IPv6 (ATTENTION: no fallback here!)\n *                     - LWIP_DNS_ADDRTYPE_IPV4: try to resolve IPv4 only\n *                     - LWIP_DNS_ADDRTYPE_IPV6: try to resolve IPv6 only\n * @return ERR_OK if found, ERR_ARG if not found\n */\nerr_t\ndns_local_lookup(const char *hostname, ip_addr_t *addr, u8_t dns_addrtype)\n{\n  LWIP_UNUSED_ARG(dns_addrtype);\n  return dns_lookup_local(hostname, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype));\n}\n\n/* Internal implementation for dns_local_lookup and dns_lookup */\nstatic err_t\ndns_lookup_local(const char *hostname, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))\n{\n#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC\n  struct local_hostlist_entry *entry = local_hostlist_dynamic;\n  while (entry != NULL) {\n    if ((lwip_stricmp(entry->name, hostname) == 0) &&\n        LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, entry->addr)) {\n      if (addr) {\n        ip_addr_copy(*addr, entry->addr);\n      }\n      return ERR_OK;\n    }\n    entry = entry->next;\n  }\n#else /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */\n  size_t i;\n  for (i = 0; i < LWIP_ARRAYSIZE(local_hostlist_static); i++) {\n    if ((lwip_stricmp(local_hostlist_static[i].name, hostname) == 0) &&\n        LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, local_hostlist_static[i].addr)) {\n      if (addr) {\n        ip_addr_copy(*addr, local_hostlist_static[i].addr);\n      }\n      return ERR_OK;\n    }\n  }\n#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */\n  return ERR_ARG;\n}\n\n#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC\n/**\n * @ingroup dns\n * Remove all entries from the local host-list for a specific hostname\n * and/or IP address\n *\n * @param hostname hostname for which entries shall be removed from the local\n *                 host-list\n * @param addr address for which entries shall be removed from the local host-list\n * @return the number of removed entries\n */\nint\ndns_local_removehost(const char *hostname, const ip_addr_t *addr)\n{\n  int removed = 0;\n  struct local_hostlist_entry *entry = local_hostlist_dynamic;\n  struct local_hostlist_entry *last_entry = NULL;\n  while (entry != NULL) {\n    if (((hostname == NULL) || !lwip_stricmp(entry->name, hostname)) &&\n        ((addr == NULL) || ip_addr_cmp(&entry->addr, addr))) {\n      struct local_hostlist_entry *free_entry;\n      if (last_entry != NULL) {\n        last_entry->next = entry->next;\n      } else {\n        local_hostlist_dynamic = entry->next;\n      }\n      free_entry = entry;\n      entry = entry->next;\n      memp_free(MEMP_LOCALHOSTLIST, free_entry);\n      removed++;\n    } else {\n      last_entry = entry;\n      entry = entry->next;\n    }\n  }\n  return removed;\n}\n\n/**\n * @ingroup dns\n * Add a hostname/IP address pair to the local host-list.\n * Duplicates are not checked.\n *\n * @param hostname hostname of the new entry\n * @param addr IP address of the new entry\n * @return ERR_OK if succeeded or ERR_MEM on memory error\n */\nerr_t\ndns_local_addhost(const char *hostname, const ip_addr_t *addr)\n{\n  struct local_hostlist_entry *entry;\n  size_t namelen;\n  char* entry_name;\n  LWIP_ASSERT(\"invalid host name (NULL)\", hostname != NULL);\n  namelen = strlen(hostname);\n  LWIP_ASSERT(\"namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN\", namelen <= DNS_LOCAL_HOSTLIST_MAX_NAMELEN);\n  entry = (struct local_hostlist_entry *)memp_malloc(MEMP_LOCALHOSTLIST);\n  if (entry == NULL) {\n    return ERR_MEM;\n  }\n  entry_name = (char*)entry + sizeof(struct local_hostlist_entry);\n  MEMCPY(entry_name, hostname, namelen);\n  entry_name[namelen] = 0;\n  entry->name = entry_name;\n  ip_addr_copy(entry->addr, *addr);\n  entry->next = local_hostlist_dynamic;\n  local_hostlist_dynamic = entry;\n  return ERR_OK;\n}\n#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC*/\n#endif /* DNS_LOCAL_HOSTLIST */\n\n/**\n * @ingroup dns\n * Look up a hostname in the array of known hostnames.\n *\n * @note This function only looks in the internal array of known\n * hostnames, it does not send out a query for the hostname if none\n * was found. The function dns_enqueue() can be used to send a query\n * for a hostname.\n *\n * @param name the hostname to look up\n * @param addr the hostname's IP address, as u32_t (instead of ip_addr_t to\n *         better check for failure: != IPADDR_NONE) or IPADDR_NONE if the hostname\n *         was not found in the cached dns_table.\n * @return ERR_OK if found, ERR_ARG if not found\n */\nstatic err_t\ndns_lookup(const char *name, ip_addr_t *addr LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype))\n{\n  u8_t i;\n#if DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN)\n#endif /* DNS_LOCAL_HOSTLIST || defined(DNS_LOOKUP_LOCAL_EXTERN) */\n#if DNS_LOCAL_HOSTLIST\n  if (dns_lookup_local(name, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {\n    return ERR_OK;\n  }\n#endif /* DNS_LOCAL_HOSTLIST */\n#ifdef DNS_LOOKUP_LOCAL_EXTERN\n  if (DNS_LOOKUP_LOCAL_EXTERN(name, addr, LWIP_DNS_ADDRTYPE_ARG_OR_ZERO(dns_addrtype)) == ERR_OK) {\n    return ERR_OK;\n  }\n#endif /* DNS_LOOKUP_LOCAL_EXTERN */\n\n  /* Walk through name list, return entry if found. If not, return NULL. */\n  for (i = 0; i < DNS_TABLE_SIZE; ++i) {\n    if ((dns_table[i].state == DNS_STATE_DONE) &&\n        (lwip_strnicmp(name, dns_table[i].name, sizeof(dns_table[i].name)) == 0) &&\n        LWIP_DNS_ADDRTYPE_MATCH_IP(dns_addrtype, dns_table[i].ipaddr)) {\n      LWIP_DEBUGF(DNS_DEBUG, (\"dns_lookup: \\\"%s\\\": found = \", name));\n      ip_addr_debug_print(DNS_DEBUG, &(dns_table[i].ipaddr));\n      LWIP_DEBUGF(DNS_DEBUG, (\"\\n\"));\n      if (addr) {\n        ip_addr_copy(*addr, dns_table[i].ipaddr);\n      }\n      return ERR_OK;\n    }\n  }\n\n  return ERR_ARG;\n}\n\n/**\n * Compare the \"dotted\" name \"query\" with the encoded name \"response\"\n * to make sure an answer from the DNS server matches the current dns_table\n * entry (otherwise, answers might arrive late for hostname not on the list\n * any more).\n *\n * @param query hostname (not encoded) from the dns_table\n * @param p pbuf containing the encoded hostname in the DNS response\n * @param start_offset offset into p where the name starts\n * @return 0xFFFF: names differ, other: names equal -> offset behind name\n */\nstatic u16_t\ndns_compare_name(const char *query, struct pbuf* p, u16_t start_offset)\n{\n  int n;\n  u16_t response_offset = start_offset;\n\n  do {\n    n = pbuf_try_get_at(p, response_offset++);\n    if (n < 0) {\n      return 0xFFFF;\n    }\n    /** @see RFC 1035 - 4.1.4. Message compression */\n    if ((n & 0xc0) == 0xc0) {\n      /* Compressed name: cannot be equal since we don't send them */\n      return 0xFFFF;\n    } else {\n      /* Not compressed name */\n      while (n > 0) {\n        int c = pbuf_try_get_at(p, response_offset);\n        if (c < 0) {\n          return 0xFFFF;\n        }\n        if ((*query) != (u8_t)c) {\n          return 0xFFFF;\n        }\n        ++response_offset;\n        ++query;\n        --n;\n      }\n      ++query;\n    }\n    n = pbuf_try_get_at(p, response_offset);\n    if (n < 0) {\n      return 0xFFFF;\n    }\n  } while (n != 0);\n\n  return response_offset + 1;\n}\n\n/**\n * Walk through a compact encoded DNS name and return the end of the name.\n *\n * @param p pbuf containing the name\n * @param query_idx start index into p pointing to encoded DNS name in the DNS server response\n * @return index to end of the name\n */\nstatic u16_t\ndns_skip_name(struct pbuf* p, u16_t query_idx)\n{\n  int n;\n  u16_t offset = query_idx;\n\n  do {\n    n = pbuf_try_get_at(p, offset++);\n    if (n < 0) {\n      return 0xFFFF;\n    }\n    /** @see RFC 1035 - 4.1.4. Message compression */\n    if ((n & 0xc0) == 0xc0) {\n      /* Compressed name: since we only want to skip it (not check it), stop here */\n      break;\n    } else {\n      /* Not compressed name */\n      if (offset + n >= p->tot_len) {\n        return 0xFFFF;\n      }\n      offset = (u16_t)(offset + n);\n    }\n    n = pbuf_try_get_at(p, offset);\n    if (n < 0) {\n      return 0xFFFF;\n    }\n  } while (n != 0);\n\n  return offset + 1;\n}\n\n/**\n * Send a DNS query packet.\n *\n * @param idx the DNS table entry index for which to send a request\n * @return ERR_OK if packet is sent; an err_t indicating the problem otherwise\n */\nstatic err_t\ndns_send(u8_t idx)\n{\n  err_t err;\n  struct dns_hdr hdr;\n  struct dns_query qry;\n  struct pbuf *p;\n  u16_t query_idx, copy_len;\n  const char *hostname, *hostname_part;\n  u8_t n;\n  u8_t pcb_idx;\n  struct dns_table_entry* entry = &dns_table[idx];\n\n  LWIP_DEBUGF(DNS_DEBUG, (\"dns_send: dns_servers[%\"U16_F\"] \\\"%s\\\": request\\n\",\n              (u16_t)(entry->server_idx), entry->name));\n  LWIP_ASSERT(\"dns server out of array\", entry->server_idx < DNS_MAX_SERVERS);\n  if (ip_addr_isany_val(dns_servers[entry->server_idx])\n#if LWIP_DNS_SUPPORT_MDNS_QUERIES\n      && !entry->is_mdns\n#endif\n    ) {\n    /* DNS server not valid anymore, e.g. PPP netif has been shut down */\n    /* call specified callback function if provided */\n    dns_call_found(idx, NULL);\n    /* flush this entry */\n    entry->state = DNS_STATE_UNUSED;\n    return ERR_OK;\n  }\n\n  /* if here, we have either a new query or a retry on a previous query to process */\n  p = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(SIZEOF_DNS_HDR + strlen(entry->name) + 2 +\n                 SIZEOF_DNS_QUERY), PBUF_RAM);\n  if (p != NULL) {\n    const ip_addr_t* dst;\n    u16_t dst_port;\n    /* fill dns header */\n    memset(&hdr, 0, SIZEOF_DNS_HDR);\n    hdr.id = lwip_htons(entry->txid);\n    hdr.flags1 = DNS_FLAG1_RD;\n    hdr.numquestions = PP_HTONS(1);\n    pbuf_take(p, &hdr, SIZEOF_DNS_HDR);\n    hostname = entry->name;\n    --hostname;\n\n    /* convert hostname into suitable query format. */\n    query_idx = SIZEOF_DNS_HDR;\n    do {\n      ++hostname;\n      hostname_part = hostname;\n      for (n = 0; *hostname != '.' && *hostname != 0; ++hostname) {\n        ++n;\n      }\n      copy_len = (u16_t)(hostname - hostname_part);\n      pbuf_put_at(p, query_idx, n);\n      pbuf_take_at(p, hostname_part, copy_len, query_idx + 1);\n      query_idx += n + 1;\n    } while (*hostname != 0);\n    pbuf_put_at(p, query_idx, 0);\n    query_idx++;\n\n    /* fill dns query */\n    if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype)) {\n      qry.type = PP_HTONS(DNS_RRTYPE_AAAA);\n    } else {\n      qry.type = PP_HTONS(DNS_RRTYPE_A);\n    }\n    qry.cls = PP_HTONS(DNS_RRCLASS_IN);\n    pbuf_take_at(p, &qry, SIZEOF_DNS_QUERY, query_idx);\n\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)\n    pcb_idx = entry->pcb_idx;\n#else\n    pcb_idx = 0;\n#endif\n    /* send dns packet */\n    LWIP_DEBUGF(DNS_DEBUG, (\"sending DNS request ID %d for name \\\"%s\\\" to server %d\\r\\n\",\n      entry->txid, entry->name, entry->server_idx));\n#if LWIP_DNS_SUPPORT_MDNS_QUERIES\n    if (entry->is_mdns) {\n      dst_port = DNS_MQUERY_PORT;\n#if LWIP_IPV6\n      if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype))\n      {\n        dst = &dns_mquery_v6group;\n      }\n#endif\n#if LWIP_IPV4 && LWIP_IPV6\n      else\n#endif\n#if LWIP_IPV4\n      {\n        dst = &dns_mquery_v4group;\n      }\n#endif\n    } else\n#endif /* LWIP_DNS_SUPPORT_MDNS_QUERIES */\n    {\n      dst_port = DNS_SERVER_PORT;\n      dst = &dns_servers[entry->server_idx];\n    }\n    err = udp_sendto(dns_pcbs[pcb_idx], p, dst, dst_port);\n\n    /* free pbuf */\n    pbuf_free(p);\n  } else {\n    err = ERR_MEM;\n  }\n\n  return err;\n}\n\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)\nstatic struct udp_pcb*\ndns_alloc_random_port(void)\n{\n  err_t err;\n  struct udp_pcb* ret;\n\n  ret = udp_new_ip_type(IPADDR_TYPE_ANY);\n  if (ret == NULL) {\n    /* out of memory, have to reuse an existing pcb */\n    return NULL;\n  }\n  do {\n    u16_t port = (u16_t)DNS_RAND_TXID();\n    if (!DNS_PORT_ALLOWED(port)) {\n      /* this port is not allowed, try again */\n      err = ERR_USE;\n      continue;\n    }\n    err = udp_bind(ret, IP_ANY_TYPE, port);\n  } while (err == ERR_USE);\n  if (err != ERR_OK) {\n    udp_remove(ret);\n    return NULL;\n  }\n  udp_recv(ret, dns_recv, NULL);\n  return ret;\n}\n\n/**\n * dns_alloc_pcb() - allocates a new pcb (or reuses an existing one) to be used\n * for sending a request\n *\n * @return an index into dns_pcbs\n */\nstatic u8_t\ndns_alloc_pcb(void)\n{\n  u8_t i;\n  u8_t idx;\n\n  for (i = 0; i < DNS_MAX_SOURCE_PORTS; i++) {\n    if (dns_pcbs[i] == NULL) {\n      break;\n    }\n  }\n  if (i < DNS_MAX_SOURCE_PORTS) {\n    dns_pcbs[i] = dns_alloc_random_port();\n    if (dns_pcbs[i] != NULL) {\n      /* succeeded */\n      dns_last_pcb_idx = i;\n      return i;\n    }\n  }\n  /* if we come here, creating a new UDP pcb failed, so we have to use\n     an already existing one */\n  for (i = 0, idx = dns_last_pcb_idx + 1; i < DNS_MAX_SOURCE_PORTS; i++, idx++) {\n    if (idx >= DNS_MAX_SOURCE_PORTS) {\n      idx = 0;\n    }\n    if (dns_pcbs[idx] != NULL) {\n      dns_last_pcb_idx = idx;\n      return idx;\n    }\n  }\n  return DNS_MAX_SOURCE_PORTS;\n}\n#endif /* ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0) */\n\n/**\n * dns_call_found() - call the found callback and check if there are duplicate\n * entries for the given hostname. If there are any, their found callback will\n * be called and they will be removed.\n *\n * @param idx dns table index of the entry that is resolved or removed\n * @param addr IP address for the hostname (or NULL on error or memory shortage)\n */\nstatic void\ndns_call_found(u8_t idx, ip_addr_t* addr)\n{\n#if ((LWIP_DNS_SECURE & (LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)) != 0)\n  u8_t i;\n#endif\n\n#if LWIP_IPV4 && LWIP_IPV6\n  if (addr != NULL) {\n    /* check that address type matches the request and adapt the table entry */\n    if (IP_IS_V6_VAL(*addr)) {\n      LWIP_ASSERT(\"invalid response\", LWIP_DNS_ADDRTYPE_IS_IPV6(dns_table[idx].reqaddrtype));\n      dns_table[idx].reqaddrtype = LWIP_DNS_ADDRTYPE_IPV6;\n    } else {\n      LWIP_ASSERT(\"invalid response\", !LWIP_DNS_ADDRTYPE_IS_IPV6(dns_table[idx].reqaddrtype));\n      dns_table[idx].reqaddrtype = LWIP_DNS_ADDRTYPE_IPV4;\n    }\n  }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)\n  for (i = 0; i < DNS_MAX_REQUESTS; i++) {\n    if (dns_requests[i].found && (dns_requests[i].dns_table_idx == idx)) {\n      (*dns_requests[i].found)(dns_table[idx].name, addr, dns_requests[i].arg);\n      /* flush this entry */\n      dns_requests[i].found = NULL;\n    }\n  }\n#else\n  if (dns_requests[idx].found) {\n    (*dns_requests[idx].found)(dns_table[idx].name, addr, dns_requests[idx].arg);\n  }\n  dns_requests[idx].found = NULL;\n#endif\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)\n  /* close the pcb used unless other request are using it */\n  for (i = 0; i < DNS_MAX_REQUESTS; i++) {\n    if (i == idx) {\n      continue; /* only check other requests */\n    }\n    if (dns_table[i].state == DNS_STATE_ASKING) {\n      if (dns_table[i].pcb_idx == dns_table[idx].pcb_idx) {\n        /* another request is still using the same pcb */\n        dns_table[idx].pcb_idx = DNS_MAX_SOURCE_PORTS;\n        break;\n      }\n    }\n  }\n  if (dns_table[idx].pcb_idx < DNS_MAX_SOURCE_PORTS) {\n    /* if we come here, the pcb is not used any more and can be removed */\n    udp_remove(dns_pcbs[dns_table[idx].pcb_idx]);\n    dns_pcbs[dns_table[idx].pcb_idx] = NULL;\n    dns_table[idx].pcb_idx = DNS_MAX_SOURCE_PORTS;\n  }\n#endif\n}\n\n/* Create a query transmission ID that is unique for all outstanding queries */\nstatic u16_t\ndns_create_txid(void)\n{\n  u16_t txid;\n  u8_t i;\n\nagain:\n  txid = (u16_t)DNS_RAND_TXID();\n\n  /* check whether the ID is unique */\n  for (i = 0; i < DNS_TABLE_SIZE; i++) {\n    if ((dns_table[i].state == DNS_STATE_ASKING) &&\n        (dns_table[i].txid == txid)) {\n      /* ID already used by another pending query */\n      goto again;\n    }\n  }\n\n  return txid;\n}\n\n/**\n * dns_check_entry() - see if entry has not yet been queried and, if so, sends out a query.\n * Check an entry in the dns_table:\n * - send out query for new entries\n * - retry old pending entries on timeout (also with different servers)\n * - remove completed entries from the table if their TTL has expired\n *\n * @param i index of the dns_table entry to check\n */\nstatic void\ndns_check_entry(u8_t i)\n{\n  err_t err;\n  struct dns_table_entry *entry = &dns_table[i];\n\n  LWIP_ASSERT(\"array index out of bounds\", i < DNS_TABLE_SIZE);\n\n  switch (entry->state) {\n    case DNS_STATE_NEW:\n      /* initialize new entry */\n      entry->txid = dns_create_txid();\n      entry->state = DNS_STATE_ASKING;\n      entry->server_idx = 0;\n      entry->tmr = 1;\n      entry->retries = 0;\n\n      /* send DNS packet for this entry */\n      err = dns_send(i);\n      if (err != ERR_OK) {\n        LWIP_DEBUGF(DNS_DEBUG | LWIP_DBG_LEVEL_WARNING,\n                    (\"dns_send returned error: %s\\n\", lwip_strerr(err)));\n      }\n      break;\n    case DNS_STATE_ASKING:\n      if (--entry->tmr == 0) {\n        if (++entry->retries == DNS_MAX_RETRIES) {\n          if ((entry->server_idx + 1 < DNS_MAX_SERVERS) && !ip_addr_isany_val(dns_servers[entry->server_idx + 1])\n#if LWIP_DNS_SUPPORT_MDNS_QUERIES\n            && !entry->is_mdns\n#endif /* LWIP_DNS_SUPPORT_MDNS_QUERIES */\n            ) {\n            /* change of server */\n            entry->server_idx++;\n            entry->tmr = 1;\n            entry->retries = 0;\n          } else {\n            LWIP_DEBUGF(DNS_DEBUG, (\"dns_check_entry: \\\"%s\\\": timeout\\n\", entry->name));\n            /* call specified callback function if provided */\n            dns_call_found(i, NULL);\n            /* flush this entry */\n            entry->state = DNS_STATE_UNUSED;\n            break;\n          }\n        } else {\n          /* wait longer for the next retry */\n          entry->tmr = entry->retries;\n        }\n\n        /* send DNS packet for this entry */\n        err = dns_send(i);\n        if (err != ERR_OK) {\n          LWIP_DEBUGF(DNS_DEBUG | LWIP_DBG_LEVEL_WARNING,\n                      (\"dns_send returned error: %s\\n\", lwip_strerr(err)));\n        }\n      }\n      break;\n    case DNS_STATE_DONE:\n      /* if the time to live is nul */\n      if ((entry->ttl == 0) || (--entry->ttl == 0)) {\n        LWIP_DEBUGF(DNS_DEBUG, (\"dns_check_entry: \\\"%s\\\": flush\\n\", entry->name));\n        /* flush this entry, there cannot be any related pending entries in this state */\n        entry->state = DNS_STATE_UNUSED;\n      }\n      break;\n    case DNS_STATE_UNUSED:\n      /* nothing to do */\n      break;\n    default:\n      LWIP_ASSERT(\"unknown dns_table entry state:\", 0);\n      break;\n  }\n}\n\n/**\n * Call dns_check_entry for each entry in dns_table - check all entries.\n */\nstatic void\ndns_check_entries(void)\n{\n  u8_t i;\n\n  for (i = 0; i < DNS_TABLE_SIZE; ++i) {\n    dns_check_entry(i);\n  }\n}\n\n/**\n * Save TTL and call dns_call_found for correct response.\n */\nstatic void\ndns_correct_response(u8_t idx, u32_t ttl)\n{\n  struct dns_table_entry *entry = &dns_table[idx];\n\n  entry->state = DNS_STATE_DONE;\n\n  LWIP_DEBUGF(DNS_DEBUG, (\"dns_recv: \\\"%s\\\": response = \", entry->name));\n  ip_addr_debug_print(DNS_DEBUG, (&(entry->ipaddr)));\n  LWIP_DEBUGF(DNS_DEBUG, (\"\\n\"));\n\n  /* read the answer resource record's TTL, and maximize it if needed */\n  entry->ttl = ttl;\n  if (entry->ttl > DNS_MAX_TTL) {\n    entry->ttl = DNS_MAX_TTL;\n  }\n  dns_call_found(idx, &entry->ipaddr);\n\n  if (entry->ttl == 0) {\n    /* RFC 883, page 29: \"Zero values are\n       interpreted to mean that the RR can only be used for the\n       transaction in progress, and should not be cached.\"\n       -> flush this entry now */\n    /* entry reused during callback? */\n    if (entry->state == DNS_STATE_DONE) {\n      entry->state = DNS_STATE_UNUSED;\n    }\n  }\n}\n/**\n * Receive input function for DNS response packets arriving for the dns UDP pcb.\n */\nstatic void\ndns_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)\n{\n  u8_t i;\n  u16_t txid;\n  u16_t res_idx;\n  struct dns_hdr hdr;\n  struct dns_answer ans;\n  struct dns_query qry;\n  u16_t nquestions, nanswers;\n\n  LWIP_UNUSED_ARG(arg);\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_UNUSED_ARG(port);\n\n  /* is the dns message big enough ? */\n  if (p->tot_len < (SIZEOF_DNS_HDR + SIZEOF_DNS_QUERY)) {\n    LWIP_DEBUGF(DNS_DEBUG, (\"dns_recv: pbuf too small\\n\"));\n    /* free pbuf and return */\n    goto memerr;\n  }\n\n  /* copy dns payload inside static buffer for processing */\n  if (pbuf_copy_partial(p, &hdr, SIZEOF_DNS_HDR, 0) == SIZEOF_DNS_HDR) {\n    /* Match the ID in the DNS header with the name table. */\n    txid = lwip_htons(hdr.id);\n    for (i = 0; i < DNS_TABLE_SIZE; i++) {\n      const struct dns_table_entry *entry = &dns_table[i];\n      if ((entry->state == DNS_STATE_ASKING) &&\n          (entry->txid == txid)) {\n\n        /* We only care about the question(s) and the answers. The authrr\n           and the extrarr are simply discarded. */\n        nquestions = lwip_htons(hdr.numquestions);\n        nanswers   = lwip_htons(hdr.numanswers);\n\n        /* Check for correct response. */\n        if ((hdr.flags1 & DNS_FLAG1_RESPONSE) == 0) {\n          LWIP_DEBUGF(DNS_DEBUG, (\"dns_recv: \\\"%s\\\": not a response\\n\", entry->name));\n          goto memerr; /* ignore this packet */\n        }\n        if (nquestions != 1) {\n          LWIP_DEBUGF(DNS_DEBUG, (\"dns_recv: \\\"%s\\\": response not match to query\\n\", entry->name));\n          goto memerr; /* ignore this packet */\n        }\n\n#if LWIP_DNS_SUPPORT_MDNS_QUERIES\n        if (!entry->is_mdns)\n#endif /* LWIP_DNS_SUPPORT_MDNS_QUERIES */\n        {\n          /* Check whether response comes from the same network address to which the\n             question was sent. (RFC 5452) */\n          if (!ip_addr_cmp(addr, &dns_servers[entry->server_idx])) {\n            goto memerr; /* ignore this packet */\n          }\n        }\n\n        /* Check if the name in the \"question\" part match with the name in the entry and\n           skip it if equal. */\n        res_idx = dns_compare_name(entry->name, p, SIZEOF_DNS_HDR);\n        if (res_idx == 0xFFFF) {\n          LWIP_DEBUGF(DNS_DEBUG, (\"dns_recv: \\\"%s\\\": response not match to query\\n\", entry->name));\n          goto memerr; /* ignore this packet */\n        }\n\n        /* check if \"question\" part matches the request */\n        if (pbuf_copy_partial(p, &qry, SIZEOF_DNS_QUERY, res_idx) != SIZEOF_DNS_QUERY) {\n          goto memerr; /* ignore this packet */\n        }\n        if ((qry.cls != PP_HTONS(DNS_RRCLASS_IN)) ||\n          (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype) && (qry.type != PP_HTONS(DNS_RRTYPE_AAAA))) ||\n          (!LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype) && (qry.type != PP_HTONS(DNS_RRTYPE_A)))) {\n          LWIP_DEBUGF(DNS_DEBUG, (\"dns_recv: \\\"%s\\\": response not match to query\\n\", entry->name));\n          goto memerr; /* ignore this packet */\n        }\n        /* skip the rest of the \"question\" part */\n        res_idx += SIZEOF_DNS_QUERY;\n\n        /* Check for error. If so, call callback to inform. */\n        if (hdr.flags2 & DNS_FLAG2_ERR_MASK) {\n          LWIP_DEBUGF(DNS_DEBUG, (\"dns_recv: \\\"%s\\\": error in flags\\n\", entry->name));\n        } else {\n          while ((nanswers > 0) && (res_idx < p->tot_len)) {\n            /* skip answer resource record's host name */\n            res_idx = dns_skip_name(p, res_idx);\n            if (res_idx == 0xFFFF) {\n              goto memerr; /* ignore this packet */\n            }\n\n            /* Check for IP address type and Internet class. Others are discarded. */\n            if (pbuf_copy_partial(p, &ans, SIZEOF_DNS_ANSWER, res_idx) != SIZEOF_DNS_ANSWER) {\n              goto memerr; /* ignore this packet */\n            }\n            res_idx += SIZEOF_DNS_ANSWER;\n\n            if (ans.cls == PP_HTONS(DNS_RRCLASS_IN)) {\n#if LWIP_IPV4\n              if ((ans.type == PP_HTONS(DNS_RRTYPE_A)) && (ans.len == PP_HTONS(sizeof(ip4_addr_t)))) {\n#if LWIP_IPV4 && LWIP_IPV6\n                if (!LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype))\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n                {\n                  ip4_addr_t ip4addr;\n                  /* read the IP address after answer resource record's header */\n                  if (pbuf_copy_partial(p, &ip4addr, sizeof(ip4_addr_t), res_idx) != sizeof(ip4_addr_t)) {\n                    goto memerr; /* ignore this packet */\n                  }\n                  ip_addr_copy_from_ip4(dns_table[i].ipaddr, ip4addr);\n                  pbuf_free(p);\n                  /* handle correct response */\n                  dns_correct_response(i, lwip_ntohl(ans.ttl));\n                  return;\n                }\n              }\n#endif /* LWIP_IPV4 */\n#if LWIP_IPV6\n              if ((ans.type == PP_HTONS(DNS_RRTYPE_AAAA)) && (ans.len == PP_HTONS(sizeof(ip6_addr_t)))) {\n#if LWIP_IPV4 && LWIP_IPV6\n                if (LWIP_DNS_ADDRTYPE_IS_IPV6(entry->reqaddrtype))\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n                {\n                  ip6_addr_t ip6addr;\n                  /* read the IP address after answer resource record's header */\n                  if (pbuf_copy_partial(p, &ip6addr, sizeof(ip6_addr_t), res_idx) != sizeof(ip6_addr_t)) {\n                    goto memerr; /* ignore this packet */\n                  }\n                  ip_addr_copy_from_ip6(dns_table[i].ipaddr, ip6addr);\n                  pbuf_free(p);\n                  /* handle correct response */\n                  dns_correct_response(i, lwip_ntohl(ans.ttl));\n                  return;\n                }\n              }\n#endif /* LWIP_IPV6 */\n            }\n            /* skip this answer */\n            if ((int)(res_idx + lwip_htons(ans.len)) > 0xFFFF) {\n              goto memerr; /* ignore this packet */\n            }\n            res_idx += lwip_htons(ans.len);\n            --nanswers;\n          }\n#if LWIP_IPV4 && LWIP_IPV6\n          if ((entry->reqaddrtype == LWIP_DNS_ADDRTYPE_IPV4_IPV6) ||\n              (entry->reqaddrtype == LWIP_DNS_ADDRTYPE_IPV6_IPV4)) {\n            if (entry->reqaddrtype == LWIP_DNS_ADDRTYPE_IPV4_IPV6) {\n              /* IPv4 failed, try IPv6 */\n              dns_table[i].reqaddrtype = LWIP_DNS_ADDRTYPE_IPV6;\n            } else {\n              /* IPv6 failed, try IPv4 */\n              dns_table[i].reqaddrtype = LWIP_DNS_ADDRTYPE_IPV4;\n            }\n            pbuf_free(p);\n            dns_table[i].state = DNS_STATE_NEW;\n            dns_check_entry(i);\n            return;\n          }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n          LWIP_DEBUGF(DNS_DEBUG, (\"dns_recv: \\\"%s\\\": error in response\\n\", entry->name));\n        }\n        /* call callback to indicate error, clean up memory and return */\n        pbuf_free(p);\n        dns_call_found(i, NULL);\n        dns_table[i].state = DNS_STATE_UNUSED;\n        return;\n      }\n    }\n  }\n\nmemerr:\n  /* deallocate memory and return */\n  pbuf_free(p);\n  return;\n}\n\n/**\n * Queues a new hostname to resolve and sends out a DNS query for that hostname\n *\n * @param name the hostname that is to be queried\n * @param hostnamelen length of the hostname\n * @param found a callback function to be called on success, failure or timeout\n * @param callback_arg argument to pass to the callback function\n * @return err_t return code.\n */\nstatic err_t\ndns_enqueue(const char *name, size_t hostnamelen, dns_found_callback found,\n            void *callback_arg LWIP_DNS_ADDRTYPE_ARG(u8_t dns_addrtype) LWIP_DNS_ISMDNS_ARG(u8_t is_mdns))\n{\n  u8_t i;\n  u8_t lseq, lseqi;\n  struct dns_table_entry *entry = NULL;\n  size_t namelen;\n  struct dns_req_entry* req;\n\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)\n  u8_t r;\n  /* check for duplicate entries */\n  for (i = 0; i < DNS_TABLE_SIZE; i++) {\n    if ((dns_table[i].state == DNS_STATE_ASKING) &&\n        (lwip_strnicmp(name, dns_table[i].name, sizeof(dns_table[i].name)) == 0)) {\n#if LWIP_IPV4 && LWIP_IPV6\n      if (dns_table[i].reqaddrtype != dns_addrtype) {\n        /* requested address types don't match\n           this can lead to 2 concurrent requests, but mixing the address types\n           for the same host should not be that common */\n        continue;\n      }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n      /* this is a duplicate entry, find a free request entry */\n      for (r = 0; r < DNS_MAX_REQUESTS; r++) {\n        if (dns_requests[r].found == 0) {\n          dns_requests[r].found = found;\n          dns_requests[r].arg = callback_arg;\n          dns_requests[r].dns_table_idx = i;\n          LWIP_DNS_SET_ADDRTYPE(dns_requests[r].reqaddrtype, dns_addrtype);\n          LWIP_DEBUGF(DNS_DEBUG, (\"dns_enqueue: \\\"%s\\\": duplicate request\\n\", name));\n          return ERR_INPROGRESS;\n        }\n      }\n    }\n  }\n  /* no duplicate entries found */\n#endif\n\n  /* search an unused entry, or the oldest one */\n  lseq = 0;\n  lseqi = DNS_TABLE_SIZE;\n  for (i = 0; i < DNS_TABLE_SIZE; ++i) {\n    entry = &dns_table[i];\n    /* is it an unused entry ? */\n    if (entry->state == DNS_STATE_UNUSED) {\n      break;\n    }\n    /* check if this is the oldest completed entry */\n    if (entry->state == DNS_STATE_DONE) {\n      u8_t age = dns_seqno - entry->seqno;\n      if (age > lseq) {\n        lseq = age;\n        lseqi = i;\n      }\n    }\n  }\n\n  /* if we don't have found an unused entry, use the oldest completed one */\n  if (i == DNS_TABLE_SIZE) {\n    if ((lseqi >= DNS_TABLE_SIZE) || (dns_table[lseqi].state != DNS_STATE_DONE)) {\n      /* no entry can be used now, table is full */\n      LWIP_DEBUGF(DNS_DEBUG, (\"dns_enqueue: \\\"%s\\\": DNS entries table is full\\n\", name));\n      return ERR_MEM;\n    } else {\n      /* use the oldest completed one */\n      i = lseqi;\n      entry = &dns_table[i];\n    }\n  }\n\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING) != 0)\n  /* find a free request entry */\n  req = NULL;\n  for (r = 0; r < DNS_MAX_REQUESTS; r++) {\n    if (dns_requests[r].found == NULL) {\n      req = &dns_requests[r];\n      break;\n    }\n  }\n  if (req == NULL) {\n    /* no request entry can be used now, table is full */\n    LWIP_DEBUGF(DNS_DEBUG, (\"dns_enqueue: \\\"%s\\\": DNS request entries table is full\\n\", name));\n    return ERR_MEM;\n  }\n  req->dns_table_idx = i;\n#else\n  /* in this configuration, the entry index is the same as the request index */\n  req = &dns_requests[i];\n#endif\n\n  /* use this entry */\n  LWIP_DEBUGF(DNS_DEBUG, (\"dns_enqueue: \\\"%s\\\": use DNS entry %\"U16_F\"\\n\", name, (u16_t)(i)));\n\n  /* fill the entry */\n  entry->state = DNS_STATE_NEW;\n  entry->seqno = dns_seqno;\n  LWIP_DNS_SET_ADDRTYPE(entry->reqaddrtype, dns_addrtype);\n  LWIP_DNS_SET_ADDRTYPE(req->reqaddrtype, dns_addrtype);\n  req->found = found;\n  req->arg   = callback_arg;\n  namelen = LWIP_MIN(hostnamelen, DNS_MAX_NAME_LENGTH-1);\n  MEMCPY(entry->name, name, namelen);\n  entry->name[namelen] = 0;\n\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) != 0)\n  entry->pcb_idx = dns_alloc_pcb();\n  if (entry->pcb_idx >= DNS_MAX_SOURCE_PORTS) {\n    /* failed to get a UDP pcb */\n    LWIP_DEBUGF(DNS_DEBUG, (\"dns_enqueue: \\\"%s\\\": failed to allocate a pcb\\n\", name));\n    entry->state = DNS_STATE_UNUSED;\n    req->found = NULL;\n    return ERR_MEM;\n  }\n  LWIP_DEBUGF(DNS_DEBUG, (\"dns_enqueue: \\\"%s\\\": use DNS pcb %\"U16_F\"\\n\", name, (u16_t)(entry->pcb_idx)));\n#endif\n\n#if LWIP_DNS_SUPPORT_MDNS_QUERIES\n  entry->is_mdns = is_mdns;\n#endif\n\n  dns_seqno++;\n\n  /* force to send query without waiting timer */\n  dns_check_entry(i);\n\n  /* dns query is enqueued */\n  return ERR_INPROGRESS;\n}\n\n/**\n * @ingroup dns\n * Resolve a hostname (string) into an IP address.\n * NON-BLOCKING callback version for use with raw API!!!\n *\n * Returns immediately with one of err_t return codes:\n * - ERR_OK if hostname is a valid IP address string or the host\n *   name is already in the local names table.\n * - ERR_INPROGRESS enqueue a request to be sent to the DNS server\n *   for resolution if no errors are present.\n * - ERR_ARG: dns client not initialized or invalid hostname\n *\n * @param hostname the hostname that is to be queried\n * @param addr pointer to a ip_addr_t where to store the address if it is already\n *             cached in the dns_table (only valid if ERR_OK is returned!)\n * @param found a callback function to be called on success, failure or timeout (only if\n *              ERR_INPROGRESS is returned!)\n * @param callback_arg argument to pass to the callback function\n * @return a err_t return code.\n */\nerr_t\ndns_gethostbyname(const char *hostname, ip_addr_t *addr, dns_found_callback found,\n                  void *callback_arg)\n{\n  return dns_gethostbyname_addrtype(hostname, addr, found, callback_arg, LWIP_DNS_ADDRTYPE_DEFAULT);\n}\n\n/**\n * @ingroup dns\n * Like dns_gethostbyname, but returned address type can be controlled:\n * @param hostname the hostname that is to be queried\n * @param addr pointer to a ip_addr_t where to store the address if it is already\n *             cached in the dns_table (only valid if ERR_OK is returned!)\n * @param found a callback function to be called on success, failure or timeout (only if\n *              ERR_INPROGRESS is returned!)\n * @param callback_arg argument to pass to the callback function\n * @param dns_addrtype - LWIP_DNS_ADDRTYPE_IPV4_IPV6: try to resolve IPv4 first, try IPv6 if IPv4 fails only\n *                     - LWIP_DNS_ADDRTYPE_IPV6_IPV4: try to resolve IPv6 first, try IPv4 if IPv6 fails only\n *                     - LWIP_DNS_ADDRTYPE_IPV4: try to resolve IPv4 only\n *                     - LWIP_DNS_ADDRTYPE_IPV6: try to resolve IPv6 only\n */\nerr_t\ndns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr, dns_found_callback found,\n                           void *callback_arg, u8_t dns_addrtype)\n{\n  size_t hostnamelen;\n#if LWIP_DNS_SUPPORT_MDNS_QUERIES\n  u8_t is_mdns;\n#endif\n  /* not initialized or no valid server yet, or invalid addr pointer\n   * or invalid hostname or invalid hostname length */\n  if ((addr == NULL) ||\n      (!hostname) || (!hostname[0])) {\n    return ERR_ARG;\n  }\n#if ((LWIP_DNS_SECURE & LWIP_DNS_SECURE_RAND_SRC_PORT) == 0)\n  if (dns_pcbs[0] == NULL) {\n    return ERR_ARG;\n  }\n#endif\n  hostnamelen = strlen(hostname);\n  if (hostnamelen >= DNS_MAX_NAME_LENGTH) {\n    LWIP_DEBUGF(DNS_DEBUG, (\"dns_gethostbyname: name too long to resolve\"));\n    return ERR_ARG;\n  }\n\n\n#if LWIP_HAVE_LOOPIF\n  if (strcmp(hostname, \"localhost\") == 0) {\n    ip_addr_set_loopback(LWIP_DNS_ADDRTYPE_IS_IPV6(dns_addrtype), addr);\n    return ERR_OK;\n  }\n#endif /* LWIP_HAVE_LOOPIF */\n\n  /* host name already in octet notation? set ip addr and return ERR_OK */\n  if (ipaddr_aton(hostname, addr)) {\n#if LWIP_IPV4 && LWIP_IPV6\n    if ((IP_IS_V6(addr) && (dns_addrtype != LWIP_DNS_ADDRTYPE_IPV4)) ||\n        (IP_IS_V4(addr) && (dns_addrtype != LWIP_DNS_ADDRTYPE_IPV6)))\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n    {\n      return ERR_OK;\n    }\n  }\n  /* already have this address cached? */\n  if (dns_lookup(hostname, addr LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)) == ERR_OK) {\n    return ERR_OK;\n  }\n#if LWIP_IPV4 && LWIP_IPV6\n  if ((dns_addrtype == LWIP_DNS_ADDRTYPE_IPV4_IPV6) || (dns_addrtype == LWIP_DNS_ADDRTYPE_IPV6_IPV4)) {\n    /* fallback to 2nd IP type and try again to lookup */\n    u8_t fallback;\n    if (dns_addrtype == LWIP_DNS_ADDRTYPE_IPV4_IPV6) {\n      fallback = LWIP_DNS_ADDRTYPE_IPV6;\n    } else {\n      fallback = LWIP_DNS_ADDRTYPE_IPV4;\n    }\n    if (dns_lookup(hostname, addr LWIP_DNS_ADDRTYPE_ARG(fallback)) == ERR_OK) {\n      return ERR_OK;\n    }\n  }\n#else /* LWIP_IPV4 && LWIP_IPV6 */\n  LWIP_UNUSED_ARG(dns_addrtype);\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n#if LWIP_DNS_SUPPORT_MDNS_QUERIES\n  if (strstr(hostname, \".local\") == &hostname[hostnamelen] - 6) {\n    is_mdns = 1;\n  } else {\n    is_mdns = 0;\n  }\n\n  if (!is_mdns)\n#endif /* LWIP_DNS_SUPPORT_MDNS_QUERIES */\n  {\n    /* prevent calling found callback if no server is set, return error instead */\n    if (ip_addr_isany_val(dns_servers[0])) {\n      return ERR_VAL;\n    }\n  }\n\n  /* queue query with specified callback */\n  return dns_enqueue(hostname, hostnamelen, found, callback_arg LWIP_DNS_ADDRTYPE_ARG(dns_addrtype)\n     LWIP_DNS_ISMDNS_ARG(is_mdns));\n}\n\n#endif /* LWIP_DNS */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/inet_chksum.c",
    "content": "/**\n * @file\n * Incluse internet checksum functions.\\n\n *\n * These are some reference implementations of the checksum algorithm, with the\n * aim of being simple, correct and fully portable. Checksumming is the\n * first thing you would want to optimize for your platform. If you create\n * your own version, link it in and in your cc.h put:\n *\n * \\#define LWIP_CHKSUM your_checksum_routine\n * \n * Or you can select from the implementations below by defining\n * LWIP_CHKSUM_ALGORITHM to 1, 2 or 3.\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/def.h\"\n#include \"lwip/ip_addr.h\"\n\n#include <string.h>\n\n#ifndef LWIP_CHKSUM\n# define LWIP_CHKSUM lwip_standard_chksum\n# ifndef LWIP_CHKSUM_ALGORITHM\n#  define LWIP_CHKSUM_ALGORITHM 2\n# endif\nu16_t lwip_standard_chksum(const void *dataptr, int len);\n#endif\n/* If none set: */\n#ifndef LWIP_CHKSUM_ALGORITHM\n# define LWIP_CHKSUM_ALGORITHM 0\n#endif\n\n#if (LWIP_CHKSUM_ALGORITHM == 1) /* Version #1 */\n/**\n * lwip checksum\n *\n * @param dataptr points to start of data to be summed at any boundary\n * @param len length of data to be summed\n * @return host order (!) lwip checksum (non-inverted Internet sum)\n *\n * @note accumulator size limits summable length to 64k\n * @note host endianess is irrelevant (p3 RFC1071)\n */\nu16_t\nlwip_standard_chksum(const void *dataptr, int len)\n{\n  u32_t acc;\n  u16_t src;\n  const u8_t *octetptr;\n\n  acc = 0;\n  /* dataptr may be at odd or even addresses */\n  octetptr = (const u8_t*)dataptr;\n  while (len > 1) {\n    /* declare first octet as most significant\n       thus assume network order, ignoring host order */\n    src = (*octetptr) << 8;\n    octetptr++;\n    /* declare second octet as least significant */\n    src |= (*octetptr);\n    octetptr++;\n    acc += src;\n    len -= 2;\n  }\n  if (len > 0) {\n    /* accumulate remaining octet */\n    src = (*octetptr) << 8;\n    acc += src;\n  }\n  /* add deferred carry bits */\n  acc = (acc >> 16) + (acc & 0x0000ffffUL);\n  if ((acc & 0xffff0000UL) != 0) {\n    acc = (acc >> 16) + (acc & 0x0000ffffUL);\n  }\n  /* This maybe a little confusing: reorder sum using lwip_htons()\n     instead of lwip_ntohs() since it has a little less call overhead.\n     The caller must invert bits for Internet sum ! */\n  return lwip_htons((u16_t)acc);\n}\n#endif\n\n#if (LWIP_CHKSUM_ALGORITHM == 2) /* Alternative version #2 */\n/*\n * Curt McDowell\n * Broadcom Corp.\n * csm@broadcom.com\n *\n * IP checksum two bytes at a time with support for\n * unaligned buffer.\n * Works for len up to and including 0x20000.\n * by Curt McDowell, Broadcom Corp. 12/08/2005\n *\n * @param dataptr points to start of data to be summed at any boundary\n * @param len length of data to be summed\n * @return host order (!) lwip checksum (non-inverted Internet sum)\n */\nu16_t\nlwip_standard_chksum(const void *dataptr, int len)\n{\n  const u8_t *pb = (const u8_t *)dataptr;\n  const u16_t *ps;\n  u16_t t = 0;\n  u32_t sum = 0;\n  int odd = ((mem_ptr_t)pb & 1);\n\n  /* Get aligned to u16_t */\n  if (odd && len > 0) {\n    ((u8_t *)&t)[1] = *pb++;\n    len--;\n  }\n\n  /* Add the bulk of the data */\n  ps = (const u16_t *)(const void *)pb;\n  while (len > 1) {\n    sum += *ps++;\n    len -= 2;\n  }\n\n  /* Consume left-over byte, if any */\n  if (len > 0) {\n    ((u8_t *)&t)[0] = *(const u8_t *)ps;\n  }\n\n  /* Add end bytes */\n  sum += t;\n\n  /* Fold 32-bit sum to 16 bits\n     calling this twice is probably faster than if statements... */\n  sum = FOLD_U32T(sum);\n  sum = FOLD_U32T(sum);\n\n  /* Swap if alignment was odd */\n  if (odd) {\n    sum = SWAP_BYTES_IN_WORD(sum);\n  }\n\n  return (u16_t)sum;\n}\n#endif\n\n#if (LWIP_CHKSUM_ALGORITHM == 3) /* Alternative version #3 */\n/**\n * An optimized checksum routine. Basically, it uses loop-unrolling on\n * the checksum loop, treating the head and tail bytes specially, whereas\n * the inner loop acts on 8 bytes at a time.\n *\n * @arg start of buffer to be checksummed. May be an odd byte address.\n * @len number of bytes in the buffer to be checksummed.\n * @return host order (!) lwip checksum (non-inverted Internet sum)\n *\n * by Curt McDowell, Broadcom Corp. December 8th, 2005\n */\nu16_t\nlwip_standard_chksum(const void *dataptr, int len)\n{\n  const u8_t *pb = (const u8_t *)dataptr;\n  const u16_t *ps;\n  u16_t t = 0;\n  const u32_t *pl;\n  u32_t sum = 0, tmp;\n  /* starts at odd byte address? */\n  int odd = ((mem_ptr_t)pb & 1);\n\n  if (odd && len > 0) {\n    ((u8_t *)&t)[1] = *pb++;\n    len--;\n  }\n\n  ps = (const u16_t *)(const void*)pb;\n\n  if (((mem_ptr_t)ps & 3) && len > 1) {\n    sum += *ps++;\n    len -= 2;\n  }\n\n  pl = (const u32_t *)(const void*)ps;\n\n  while (len > 7)  {\n    tmp = sum + *pl++;          /* ping */\n    if (tmp < sum) {\n      tmp++;                    /* add back carry */\n    }\n\n    sum = tmp + *pl++;          /* pong */\n    if (sum < tmp) {\n      sum++;                    /* add back carry */\n    }\n\n    len -= 8;\n  }\n\n  /* make room in upper bits */\n  sum = FOLD_U32T(sum);\n\n  ps = (const u16_t *)pl;\n\n  /* 16-bit aligned word remaining? */\n  while (len > 1) {\n    sum += *ps++;\n    len -= 2;\n  }\n\n  /* dangling tail byte remaining? */\n  if (len > 0) {                /* include odd byte */\n    ((u8_t *)&t)[0] = *(const u8_t *)ps;\n  }\n\n  sum += t;                     /* add end bytes */\n\n  /* Fold 32-bit sum to 16 bits\n     calling this twice is probably faster than if statements... */\n  sum = FOLD_U32T(sum);\n  sum = FOLD_U32T(sum);\n\n  if (odd) {\n    sum = SWAP_BYTES_IN_WORD(sum);\n  }\n\n  return (u16_t)sum;\n}\n#endif\n\n/** Parts of the pseudo checksum which are common to IPv4 and IPv6 */\nstatic u16_t\ninet_cksum_pseudo_base(struct pbuf *p, u8_t proto, u16_t proto_len, u32_t acc)\n{\n  struct pbuf *q;\n  u8_t swapped = 0;\n\n  /* iterate through all pbuf in chain */\n  for (q = p; q != NULL; q = q->next) {\n    LWIP_DEBUGF(INET_DEBUG, (\"inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \\n\",\n      (void *)q, (void *)q->next));\n    acc += LWIP_CHKSUM(q->payload, q->len);\n    /*LWIP_DEBUGF(INET_DEBUG, (\"inet_chksum_pseudo(): unwrapped lwip_chksum()=%\"X32_F\" \\n\", acc));*/\n    /* just executing this next line is probably faster that the if statement needed\n       to check whether we really need to execute it, and does no harm */\n    acc = FOLD_U32T(acc);\n    if (q->len % 2 != 0) {\n      swapped = 1 - swapped;\n      acc = SWAP_BYTES_IN_WORD(acc);\n    }\n    /*LWIP_DEBUGF(INET_DEBUG, (\"inet_chksum_pseudo(): wrapped lwip_chksum()=%\"X32_F\" \\n\", acc));*/\n  }\n\n  if (swapped) {\n    acc = SWAP_BYTES_IN_WORD(acc);\n  }\n\n  acc += (u32_t)lwip_htons((u16_t)proto);\n  acc += (u32_t)lwip_htons(proto_len);\n\n  /* Fold 32-bit sum to 16 bits\n     calling this twice is probably faster than if statements... */\n  acc = FOLD_U32T(acc);\n  acc = FOLD_U32T(acc);\n  LWIP_DEBUGF(INET_DEBUG, (\"inet_chksum_pseudo(): pbuf chain lwip_chksum()=%\"X32_F\"\\n\", acc));\n  return (u16_t)~(acc & 0xffffUL);\n}\n\n#if LWIP_IPV4\n/* inet_chksum_pseudo:\n *\n * Calculates the IPv4 pseudo Internet checksum used by TCP and UDP for a pbuf chain.\n * IP addresses are expected to be in network byte order.\n *\n * @param p chain of pbufs over that a checksum should be calculated (ip data part)\n * @param src source ip address (used for checksum of pseudo header)\n * @param dst destination ip address (used for checksum of pseudo header)\n * @param proto ip protocol (used for checksum of pseudo header)\n * @param proto_len length of the ip data part (used for checksum of pseudo header)\n * @return checksum (as u16_t) to be saved directly in the protocol header\n */\nu16_t\ninet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,\n       const ip4_addr_t *src, const ip4_addr_t *dest)\n{\n  u32_t acc;\n  u32_t addr;\n\n  addr = ip4_addr_get_u32(src);\n  acc = (addr & 0xffffUL);\n  acc += ((addr >> 16) & 0xffffUL);\n  addr = ip4_addr_get_u32(dest);\n  acc += (addr & 0xffffUL);\n  acc += ((addr >> 16) & 0xffffUL);\n  /* fold down to 16 bits */\n  acc = FOLD_U32T(acc);\n  acc = FOLD_U32T(acc);\n\n  return inet_cksum_pseudo_base(p, proto, proto_len, acc);\n}\n#endif /* LWIP_IPV4 */\n\n#if LWIP_IPV6\n/**\n * Calculates the checksum with IPv6 pseudo header used by TCP and UDP for a pbuf chain.\n * IPv6 addresses are expected to be in network byte order.\n *\n * @param p chain of pbufs over that a checksum should be calculated (ip data part)\n * @param proto ipv6 protocol/next header (used for checksum of pseudo header)\n * @param proto_len length of the ipv6 payload (used for checksum of pseudo header)\n * @param src source ipv6 address (used for checksum of pseudo header)\n * @param dest destination ipv6 address (used for checksum of pseudo header)\n * @return checksum (as u16_t) to be saved directly in the protocol header\n */\nu16_t\nip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,\n       const ip6_addr_t *src, const ip6_addr_t *dest)\n{\n  u32_t acc = 0;\n  u32_t addr;\n  u8_t addr_part;\n\n  for (addr_part = 0; addr_part < 4; addr_part++) {\n    addr = src->addr[addr_part];\n    acc += (addr & 0xffffUL);\n    acc += ((addr >> 16) & 0xffffUL);\n    addr = dest->addr[addr_part];\n    acc += (addr & 0xffffUL);\n    acc += ((addr >> 16) & 0xffffUL);\n  }\n  /* fold down to 16 bits */\n  acc = FOLD_U32T(acc);\n  acc = FOLD_U32T(acc);\n\n  return inet_cksum_pseudo_base(p, proto, proto_len, acc);\n}\n#endif /* LWIP_IPV6 */\n\n/* ip_chksum_pseudo:\n *\n * Calculates the IPv4 or IPv6 pseudo Internet checksum used by TCP and UDP for a pbuf chain.\n * IP addresses are expected to be in network byte order.\n *\n * @param p chain of pbufs over that a checksum should be calculated (ip data part)\n * @param src source ip address (used for checksum of pseudo header)\n * @param dst destination ip address (used for checksum of pseudo header)\n * @param proto ip protocol (used for checksum of pseudo header)\n * @param proto_len length of the ip data part (used for checksum of pseudo header)\n * @return checksum (as u16_t) to be saved directly in the protocol header\n */\nu16_t\nip_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,\n       const ip_addr_t *src, const ip_addr_t *dest)\n{\n#if LWIP_IPV6\n  if (IP_IS_V6(dest)) {\n    return ip6_chksum_pseudo(p, proto, proto_len, ip_2_ip6(src), ip_2_ip6(dest));\n  }\n#endif /* LWIP_IPV6 */\n#if LWIP_IPV4 && LWIP_IPV6\n  else\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n#if LWIP_IPV4\n  {\n    return inet_chksum_pseudo(p, proto, proto_len, ip_2_ip4(src), ip_2_ip4(dest));\n  }\n#endif /* LWIP_IPV4 */\n}\n\n/** Parts of the pseudo checksum which are common to IPv4 and IPv6 */\nstatic u16_t\ninet_cksum_pseudo_partial_base(struct pbuf *p, u8_t proto, u16_t proto_len,\n       u16_t chksum_len, u32_t acc)\n{\n  struct pbuf *q;\n  u8_t swapped = 0;\n  u16_t chklen;\n\n  /* iterate through all pbuf in chain */\n  for (q = p; (q != NULL) && (chksum_len > 0); q = q->next) {\n    LWIP_DEBUGF(INET_DEBUG, (\"inet_chksum_pseudo(): checksumming pbuf %p (has next %p) \\n\",\n      (void *)q, (void *)q->next));\n    chklen = q->len;\n    if (chklen > chksum_len) {\n      chklen = chksum_len;\n    }\n    acc += LWIP_CHKSUM(q->payload, chklen);\n    chksum_len -= chklen;\n    LWIP_ASSERT(\"delete me\", chksum_len < 0x7fff);\n    /*LWIP_DEBUGF(INET_DEBUG, (\"inet_chksum_pseudo(): unwrapped lwip_chksum()=%\"X32_F\" \\n\", acc));*/\n    /* fold the upper bit down */\n    acc = FOLD_U32T(acc);\n    if (q->len % 2 != 0) {\n      swapped = 1 - swapped;\n      acc = SWAP_BYTES_IN_WORD(acc);\n    }\n    /*LWIP_DEBUGF(INET_DEBUG, (\"inet_chksum_pseudo(): wrapped lwip_chksum()=%\"X32_F\" \\n\", acc));*/\n  }\n\n  if (swapped) {\n    acc = SWAP_BYTES_IN_WORD(acc);\n  }\n\n  acc += (u32_t)lwip_htons((u16_t)proto);\n  acc += (u32_t)lwip_htons(proto_len);\n\n  /* Fold 32-bit sum to 16 bits\n     calling this twice is probably faster than if statements... */\n  acc = FOLD_U32T(acc);\n  acc = FOLD_U32T(acc);\n  LWIP_DEBUGF(INET_DEBUG, (\"inet_chksum_pseudo(): pbuf chain lwip_chksum()=%\"X32_F\"\\n\", acc));\n  return (u16_t)~(acc & 0xffffUL);\n}\n\n#if LWIP_IPV4\n/* inet_chksum_pseudo_partial:\n *\n * Calculates the IPv4 pseudo Internet checksum used by TCP and UDP for a pbuf chain.\n * IP addresses are expected to be in network byte order.\n *\n * @param p chain of pbufs over that a checksum should be calculated (ip data part)\n * @param src source ip address (used for checksum of pseudo header)\n * @param dst destination ip address (used for checksum of pseudo header)\n * @param proto ip protocol (used for checksum of pseudo header)\n * @param proto_len length of the ip data part (used for checksum of pseudo header)\n * @return checksum (as u16_t) to be saved directly in the protocol header\n */\nu16_t\ninet_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len,\n       u16_t chksum_len, const ip4_addr_t *src, const ip4_addr_t *dest)\n{\n  u32_t acc;\n  u32_t addr;\n\n  addr = ip4_addr_get_u32(src);\n  acc = (addr & 0xffffUL);\n  acc += ((addr >> 16) & 0xffffUL);\n  addr = ip4_addr_get_u32(dest);\n  acc += (addr & 0xffffUL);\n  acc += ((addr >> 16) & 0xffffUL);\n  /* fold down to 16 bits */\n  acc = FOLD_U32T(acc);\n  acc = FOLD_U32T(acc);\n\n  return inet_cksum_pseudo_partial_base(p, proto, proto_len, chksum_len, acc);\n}\n#endif /* LWIP_IPV4 */\n\n#if LWIP_IPV6\n/**\n * Calculates the checksum with IPv6 pseudo header used by TCP and UDP for a pbuf chain.\n * IPv6 addresses are expected to be in network byte order. Will only compute for a\n * portion of the payload.\n *\n * @param p chain of pbufs over that a checksum should be calculated (ip data part)\n * @param proto ipv6 protocol/next header (used for checksum of pseudo header)\n * @param proto_len length of the ipv6 payload (used for checksum of pseudo header)\n * @param chksum_len number of payload bytes used to compute chksum\n * @param src source ipv6 address (used for checksum of pseudo header)\n * @param dest destination ipv6 address (used for checksum of pseudo header)\n * @return checksum (as u16_t) to be saved directly in the protocol header\n */\nu16_t\nip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len,\n       u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest)\n{\n  u32_t acc = 0;\n  u32_t addr;\n  u8_t addr_part;\n\n  for (addr_part = 0; addr_part < 4; addr_part++) {\n    addr = src->addr[addr_part];\n    acc += (addr & 0xffffUL);\n    acc += ((addr >> 16) & 0xffffUL);\n    addr = dest->addr[addr_part];\n    acc += (addr & 0xffffUL);\n    acc += ((addr >> 16) & 0xffffUL);\n  }\n  /* fold down to 16 bits */\n  acc = FOLD_U32T(acc);\n  acc = FOLD_U32T(acc);\n\n  return inet_cksum_pseudo_partial_base(p, proto, proto_len, chksum_len, acc);\n}\n#endif /* LWIP_IPV6 */\n\n/* ip_chksum_pseudo_partial:\n *\n * Calculates the IPv4 or IPv6 pseudo Internet checksum used by TCP and UDP for a pbuf chain.\n *\n * @param p chain of pbufs over that a checksum should be calculated (ip data part)\n * @param src source ip address (used for checksum of pseudo header)\n * @param dst destination ip address (used for checksum of pseudo header)\n * @param proto ip protocol (used for checksum of pseudo header)\n * @param proto_len length of the ip data part (used for checksum of pseudo header)\n * @return checksum (as u16_t) to be saved directly in the protocol header\n */\nu16_t\nip_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len,\n       u16_t chksum_len, const ip_addr_t *src, const ip_addr_t *dest)\n{\n#if LWIP_IPV6\n  if (IP_IS_V6(dest)) {\n    return ip6_chksum_pseudo_partial(p, proto, proto_len, chksum_len, ip_2_ip6(src), ip_2_ip6(dest));\n  }\n#endif /* LWIP_IPV6 */\n#if LWIP_IPV4 && LWIP_IPV6\n  else\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n#if LWIP_IPV4\n  {\n    return inet_chksum_pseudo_partial(p, proto, proto_len, chksum_len, ip_2_ip4(src), ip_2_ip4(dest));\n  }\n#endif /* LWIP_IPV4 */\n}\n\n/* inet_chksum:\n *\n * Calculates the Internet checksum over a portion of memory. Used primarily for IP\n * and ICMP.\n *\n * @param dataptr start of the buffer to calculate the checksum (no alignment needed)\n * @param len length of the buffer to calculate the checksum\n * @return checksum (as u16_t) to be saved directly in the protocol header\n */\n\nu16_t\ninet_chksum(const void *dataptr, u16_t len)\n{\n  return (u16_t)~(unsigned int)LWIP_CHKSUM(dataptr, len);\n}\n\n/**\n * Calculate a checksum over a chain of pbufs (without pseudo-header, much like\n * inet_chksum only pbufs are used).\n *\n * @param p pbuf chain over that the checksum should be calculated\n * @return checksum (as u16_t) to be saved directly in the protocol header\n */\nu16_t\ninet_chksum_pbuf(struct pbuf *p)\n{\n  u32_t acc;\n  struct pbuf *q;\n  u8_t swapped;\n\n  acc = 0;\n  swapped = 0;\n  for (q = p; q != NULL; q = q->next) {\n    acc += LWIP_CHKSUM(q->payload, q->len);\n    acc = FOLD_U32T(acc);\n    if (q->len % 2 != 0) {\n      swapped = 1 - swapped;\n      acc = SWAP_BYTES_IN_WORD(acc);\n    }\n  }\n\n  if (swapped) {\n    acc = SWAP_BYTES_IN_WORD(acc);\n  }\n  return (u16_t)~(acc & 0xffffUL);\n}\n\n/* These are some implementations for LWIP_CHKSUM_COPY, which copies data\n * like MEMCPY but generates a checksum at the same time. Since this is a\n * performance-sensitive function, you might want to create your own version\n * in assembly targeted at your hardware by defining it in lwipopts.h:\n *   #define LWIP_CHKSUM_COPY(dst, src, len) your_chksum_copy(dst, src, len)\n */\n\n#if (LWIP_CHKSUM_COPY_ALGORITHM == 1) /* Version #1 */\n/** Safe but slow: first call MEMCPY, then call LWIP_CHKSUM.\n * For architectures with big caches, data might still be in cache when\n * generating the checksum after copying.\n */\nu16_t\nlwip_chksum_copy(void *dst, const void *src, u16_t len)\n{\n  MEMCPY(dst, src, len);\n  return LWIP_CHKSUM(dst, len);\n}\n#endif /* (LWIP_CHKSUM_COPY_ALGORITHM == 1) */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/init.c",
    "content": "/**\n * @file\n * Modules initialization\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n */\n\n#include \"lwip/opt.h\"\n\n#include \"lwip/init.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/sockets.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/raw.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/igmp.h\"\n#include \"lwip/dns.h\"\n#include \"lwip/timeouts.h\"\n#include \"lwip/etharp.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/nd6.h\"\n#include \"lwip/mld6.h\"\n#include \"lwip/api.h\"\n\n#include \"netif/ppp/ppp_opts.h\"\n#include \"netif/ppp/ppp_impl.h\"\n\n#ifndef LWIP_SKIP_PACKING_CHECK\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct packed_struct_test\n{\n  PACK_STRUCT_FLD_8(u8_t  dummy1);\n  PACK_STRUCT_FIELD(u32_t dummy2);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n#define PACKED_STRUCT_TEST_EXPECTED_SIZE 5\n\n#endif\n\n/* Compile-time sanity checks for configuration errors.\n * These can be done independently of LWIP_DEBUG, without penalty.\n */\n#ifndef BYTE_ORDER\n  #error \"BYTE_ORDER is not defined, you have to define it in your cc.h\"\n#endif\n#if (!IP_SOF_BROADCAST && IP_SOF_BROADCAST_RECV)\n  #error \"If you want to use broadcast filter per pcb on recv operations, you have to define IP_SOF_BROADCAST=1 in your lwipopts.h\"\n#endif\n#if (!LWIP_UDP && LWIP_UDPLITE)\n  #error \"If you want to use UDP Lite, you have to define LWIP_UDP=1 in your lwipopts.h\"\n#endif\n#if (!LWIP_UDP && LWIP_DHCP)\n  #error \"If you want to use DHCP, you have to define LWIP_UDP=1 in your lwipopts.h\"\n#endif\n#if (!LWIP_UDP && LWIP_MULTICAST_TX_OPTIONS)\n  #error \"If you want to use IGMP/LWIP_MULTICAST_TX_OPTIONS, you have to define LWIP_UDP=1 in your lwipopts.h\"\n#endif\n#if (!LWIP_UDP && LWIP_DNS)\n  #error \"If you want to use DNS, you have to define LWIP_UDP=1 in your lwipopts.h\"\n#endif\n#if !MEMP_MEM_MALLOC /* MEMP_NUM_* checks are disabled when not using the pool allocator */\n#if (LWIP_ARP && ARP_QUEUEING && (MEMP_NUM_ARP_QUEUE<=0))\n  #error \"If you want to use ARP Queueing, you have to define MEMP_NUM_ARP_QUEUE>=1 in your lwipopts.h\"\n#endif\n#if (LWIP_RAW && (MEMP_NUM_RAW_PCB<=0))\n  #error \"If you want to use RAW, you have to define MEMP_NUM_RAW_PCB>=1 in your lwipopts.h\"\n#endif\n#if (LWIP_UDP && (MEMP_NUM_UDP_PCB<=0))\n  #error \"If you want to use UDP, you have to define MEMP_NUM_UDP_PCB>=1 in your lwipopts.h\"\n#endif\n#if (LWIP_TCP && (MEMP_NUM_TCP_PCB<=0))\n  #error \"If you want to use TCP, you have to define MEMP_NUM_TCP_PCB>=1 in your lwipopts.h\"\n#endif\n#if (LWIP_IGMP && (MEMP_NUM_IGMP_GROUP<=1))\n  #error \"If you want to use IGMP, you have to define MEMP_NUM_IGMP_GROUP>1 in your lwipopts.h\"\n#endif\n#if (LWIP_IGMP && !LWIP_MULTICAST_TX_OPTIONS)\n  #error \"If you want to use IGMP, you have to define LWIP_MULTICAST_TX_OPTIONS==1 in your lwipopts.h\"\n#endif\n#if (LWIP_IGMP && !LWIP_IPV4)\n  #error \"IGMP needs LWIP_IPV4 enabled in your lwipopts.h\"\n#endif\n#if (LWIP_MULTICAST_TX_OPTIONS && !LWIP_IPV4)\n  #error \"LWIP_MULTICAST_TX_OPTIONS needs LWIP_IPV4 enabled in your lwipopts.h\"\n#endif\n#if ((LWIP_NETCONN || LWIP_SOCKET) && (MEMP_NUM_TCPIP_MSG_API<=0))\n  #error \"If you want to use Sequential API, you have to define MEMP_NUM_TCPIP_MSG_API>=1 in your lwipopts.h\"\n#endif\n/* There must be sufficient timeouts, taking into account requirements of the subsystems. */\n#if LWIP_TIMERS && (MEMP_NUM_SYS_TIMEOUT < (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + PPP_SUPPORT + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0)))\n  #error \"MEMP_NUM_SYS_TIMEOUT is too low to accomodate all required timeouts\"\n#endif\n#if (IP_REASSEMBLY && (MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS))\n  #error \"MEMP_NUM_REASSDATA > IP_REASS_MAX_PBUFS doesn't make sense since each struct ip_reassdata must hold 2 pbufs at least!\"\n#endif\n#endif /* !MEMP_MEM_MALLOC */\n#if LWIP_WND_SCALE\n#if (LWIP_TCP && (TCP_WND > 0xffffffff))\n  #error \"If you want to use TCP, TCP_WND must fit in an u32_t, so, you have to reduce it in your lwipopts.h\"\n#endif\n#if (LWIP_TCP && (TCP_RCV_SCALE > 14))\n  #error \"The maximum valid window scale value is 14!\"\n#endif\n#if (LWIP_TCP && (TCP_WND > (0xFFFFU << TCP_RCV_SCALE)))\n  #error \"TCP_WND is bigger than the configured LWIP_WND_SCALE allows!\"\n#endif\n#if (LWIP_TCP && ((TCP_WND >> TCP_RCV_SCALE) == 0))\n  #error \"TCP_WND is too small for the configured LWIP_WND_SCALE (results in zero window)!\"\n#endif\n#else /* LWIP_WND_SCALE */\n#if (LWIP_TCP && (TCP_WND > 0xffff))\n  #error \"If you want to use TCP, TCP_WND must fit in an u16_t, so, you have to reduce it in your lwipopts.h (or enable window scaling)\"\n#endif\n#endif /* LWIP_WND_SCALE */\n#if (LWIP_TCP && (TCP_SND_QUEUELEN > 0xffff))\n  #error \"If you want to use TCP, TCP_SND_QUEUELEN must fit in an u16_t, so, you have to reduce it in your lwipopts.h\"\n#endif\n#if (LWIP_TCP && (TCP_SND_QUEUELEN < 2))\n  #error \"TCP_SND_QUEUELEN must be at least 2 for no-copy TCP writes to work\"\n#endif\n#if (LWIP_TCP && ((TCP_MAXRTX > 12) || (TCP_SYNMAXRTX > 12)))\n  #error \"If you want to use TCP, TCP_MAXRTX and TCP_SYNMAXRTX must less or equal to 12 (due to tcp_backoff table), so, you have to reduce them in your lwipopts.h\"\n#endif\n#if (LWIP_TCP && TCP_LISTEN_BACKLOG && ((TCP_DEFAULT_LISTEN_BACKLOG < 0) || (TCP_DEFAULT_LISTEN_BACKLOG > 0xff)))\n  #error \"If you want to use TCP backlog, TCP_DEFAULT_LISTEN_BACKLOG must fit into an u8_t\"\n#endif\n#if (LWIP_NETIF_API && (NO_SYS==1))\n  #error \"If you want to use NETIF API, you have to define NO_SYS=0 in your lwipopts.h\"\n#endif\n#if ((LWIP_SOCKET || LWIP_NETCONN) && (NO_SYS==1))\n  #error \"If you want to use Sequential API, you have to define NO_SYS=0 in your lwipopts.h\"\n#endif\n#if (LWIP_PPP_API && (NO_SYS==1))\n  #error \"If you want to use PPP API, you have to define NO_SYS=0 in your lwipopts.h\"\n#endif\n#if (LWIP_PPP_API && (PPP_SUPPORT==0))\n  #error \"If you want to use PPP API, you have to enable PPP_SUPPORT in your lwipopts.h\"\n#endif\n#if (((!LWIP_DHCP) || (!LWIP_AUTOIP)) && LWIP_DHCP_AUTOIP_COOP)\n  #error \"If you want to use DHCP/AUTOIP cooperation mode, you have to define LWIP_DHCP=1 and LWIP_AUTOIP=1 in your lwipopts.h\"\n#endif\n#if (((!LWIP_DHCP) || (!LWIP_ARP)) && DHCP_DOES_ARP_CHECK)\n  #error \"If you want to use DHCP ARP checking, you have to define LWIP_DHCP=1 and LWIP_ARP=1 in your lwipopts.h\"\n#endif\n#if (!LWIP_ARP && LWIP_AUTOIP)\n  #error \"If you want to use AUTOIP, you have to define LWIP_ARP=1 in your lwipopts.h\"\n#endif\n#if (LWIP_TCP && ((LWIP_EVENT_API && LWIP_CALLBACK_API) || (!LWIP_EVENT_API && !LWIP_CALLBACK_API)))\n  #error \"One and exactly one of LWIP_EVENT_API and LWIP_CALLBACK_API has to be enabled in your lwipopts.h\"\n#endif\n#if (MEM_LIBC_MALLOC && MEM_USE_POOLS)\n  #error \"MEM_LIBC_MALLOC and MEM_USE_POOLS may not both be simultaneously enabled in your lwipopts.h\"\n#endif\n#if (MEM_USE_POOLS && !MEMP_USE_CUSTOM_POOLS)\n  #error \"MEM_USE_POOLS requires custom pools (MEMP_USE_CUSTOM_POOLS) to be enabled in your lwipopts.h\"\n#endif\n#if (PBUF_POOL_BUFSIZE <= MEM_ALIGNMENT)\n  #error \"PBUF_POOL_BUFSIZE must be greater than MEM_ALIGNMENT or the offset may take the full first pbuf\"\n#endif\n#if (DNS_LOCAL_HOSTLIST && !DNS_LOCAL_HOSTLIST_IS_DYNAMIC && !(defined(DNS_LOCAL_HOSTLIST_INIT)))\n  #error \"you have to define define DNS_LOCAL_HOSTLIST_INIT {{'host1', 0x123}, {'host2', 0x234}} to initialize DNS_LOCAL_HOSTLIST\"\n#endif\n#if PPP_SUPPORT && !PPPOS_SUPPORT && !PPPOE_SUPPORT && !PPPOL2TP_SUPPORT\n  #error \"PPP_SUPPORT needs at least one of PPPOS_SUPPORT, PPPOE_SUPPORT or PPPOL2TP_SUPPORT turned on\"\n#endif\n#if PPP_SUPPORT && !PPP_IPV4_SUPPORT && !PPP_IPV6_SUPPORT\n  #error \"PPP_SUPPORT needs PPP_IPV4_SUPPORT and/or PPP_IPV6_SUPPORT turned on\"\n#endif\n#if PPP_SUPPORT && PPP_IPV4_SUPPORT && !LWIP_IPV4\n  #error \"PPP_IPV4_SUPPORT needs LWIP_IPV4 turned on\"\n#endif\n#if PPP_SUPPORT && PPP_IPV6_SUPPORT && !LWIP_IPV6\n  #error \"PPP_IPV6_SUPPORT needs LWIP_IPV6 turned on\"\n#endif\n#if !LWIP_ETHERNET && (LWIP_ARP || PPPOE_SUPPORT)\n  #error \"LWIP_ETHERNET needs to be turned on for LWIP_ARP or PPPOE_SUPPORT\"\n#endif\n#if LWIP_TCPIP_CORE_LOCKING_INPUT && !LWIP_TCPIP_CORE_LOCKING\n  #error \"When using LWIP_TCPIP_CORE_LOCKING_INPUT, LWIP_TCPIP_CORE_LOCKING must be enabled, too\"\n#endif\n#if LWIP_TCP && LWIP_NETIF_TX_SINGLE_PBUF && !TCP_OVERSIZE\n  #error \"LWIP_NETIF_TX_SINGLE_PBUF needs TCP_OVERSIZE enabled to create single-pbuf TCP packets\"\n#endif\n#if LWIP_NETCONN && LWIP_TCP\n#if NETCONN_COPY != TCP_WRITE_FLAG_COPY\n  #error \"NETCONN_COPY != TCP_WRITE_FLAG_COPY\"\n#endif\n#if NETCONN_MORE != TCP_WRITE_FLAG_MORE\n  #error \"NETCONN_MORE != TCP_WRITE_FLAG_MORE\"\n#endif\n#endif /* LWIP_NETCONN && LWIP_TCP */\n#if LWIP_SOCKET\n/* Check that the SO_* socket options and SOF_* lwIP-internal flags match */\n#if SO_REUSEADDR != SOF_REUSEADDR\n  #error \"WARNING: SO_REUSEADDR != SOF_REUSEADDR\"\n#endif\n#if SO_KEEPALIVE != SOF_KEEPALIVE\n  #error \"WARNING: SO_KEEPALIVE != SOF_KEEPALIVE\"\n#endif\n#if SO_BROADCAST != SOF_BROADCAST\n  #error \"WARNING: SO_BROADCAST != SOF_BROADCAST\"\n#endif\n#endif /* LWIP_SOCKET */\n\n\n/* Compile-time checks for deprecated options.\n */\n#ifdef MEMP_NUM_TCPIP_MSG\n  #error \"MEMP_NUM_TCPIP_MSG option is deprecated. Remove it from your lwipopts.h.\"\n#endif\n#ifdef TCP_REXMIT_DEBUG\n  #error \"TCP_REXMIT_DEBUG option is deprecated. Remove it from your lwipopts.h.\"\n#endif\n#ifdef RAW_STATS\n  #error \"RAW_STATS option is deprecated. Remove it from your lwipopts.h.\"\n#endif\n#ifdef ETHARP_QUEUE_FIRST\n  #error \"ETHARP_QUEUE_FIRST option is deprecated. Remove it from your lwipopts.h.\"\n#endif\n#ifdef ETHARP_ALWAYS_INSERT\n  #error \"ETHARP_ALWAYS_INSERT option is deprecated. Remove it from your lwipopts.h.\"\n#endif\n#if !NO_SYS && LWIP_TCPIP_CORE_LOCKING && LWIP_COMPAT_MUTEX && !defined(LWIP_COMPAT_MUTEX_ALLOWED)\n  #error \"LWIP_COMPAT_MUTEX cannot prevent priority inversion. It is recommended to implement priority-aware mutexes. (Define LWIP_COMPAT_MUTEX_ALLOWED to disable this error.)\"\n#endif\n\n#ifndef LWIP_DISABLE_TCP_SANITY_CHECKS\n#define LWIP_DISABLE_TCP_SANITY_CHECKS  0\n#endif\n#ifndef LWIP_DISABLE_MEMP_SANITY_CHECKS\n#define LWIP_DISABLE_MEMP_SANITY_CHECKS 0\n#endif\n\n/* MEMP sanity checks */\n#if MEMP_MEM_MALLOC\n#if !LWIP_DISABLE_MEMP_SANITY_CHECKS\n#if LWIP_NETCONN || LWIP_SOCKET\n#if !MEMP_NUM_NETCONN && LWIP_SOCKET\n#error \"lwip_sanity_check: WARNING: MEMP_NUM_NETCONN cannot be 0 when using sockets!\"\n#endif\n#else /* MEMP_MEM_MALLOC */\n#if MEMP_NUM_NETCONN > (MEMP_NUM_TCP_PCB+MEMP_NUM_TCP_PCB_LISTEN+MEMP_NUM_UDP_PCB+MEMP_NUM_RAW_PCB)\n#error \"lwip_sanity_check: WARNING: MEMP_NUM_NETCONN should be less than the sum of MEMP_NUM_{TCP,RAW,UDP}_PCB+MEMP_NUM_TCP_PCB_LISTEN. If you know what you are doing, define LWIP_DISABLE_MEMP_SANITY_CHECKS to 1 to disable this error.\"\n#endif\n#endif /* LWIP_NETCONN || LWIP_SOCKET */\n#endif /* !LWIP_DISABLE_MEMP_SANITY_CHECKS */\n#if MEM_USE_POOLS\n#error \"MEMP_MEM_MALLOC and MEM_USE_POOLS cannot be enabled at the same time\"\n#endif\n#ifdef LWIP_HOOK_MEMP_AVAILABLE\n#error \"LWIP_HOOK_MEMP_AVAILABLE doesn't make sense with MEMP_MEM_MALLOC\"\n#endif\n#endif /* MEMP_MEM_MALLOC */\n\n/* TCP sanity checks */\n#if !LWIP_DISABLE_TCP_SANITY_CHECKS\n#if LWIP_TCP\n#if !MEMP_MEM_MALLOC && (MEMP_NUM_TCP_SEG < TCP_SND_QUEUELEN)\n  #error \"lwip_sanity_check: WARNING: MEMP_NUM_TCP_SEG should be at least as big as TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error.\"\n#endif\n#if TCP_SND_BUF < (2 * TCP_MSS)\n  #error \"lwip_sanity_check: WARNING: TCP_SND_BUF must be at least as much as (2 * TCP_MSS) for things to work smoothly. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error.\"\n#endif\n#if TCP_SND_QUEUELEN < (2 * (TCP_SND_BUF / TCP_MSS))\n  #error \"lwip_sanity_check: WARNING: TCP_SND_QUEUELEN must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error.\"\n#endif\n#if TCP_SNDLOWAT >= TCP_SND_BUF\n  #error \"lwip_sanity_check: WARNING: TCP_SNDLOWAT must be less than TCP_SND_BUF. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error.\"\n#endif\n#if TCP_SNDLOWAT >= (0xFFFF - (4 * TCP_MSS))\n  #error \"lwip_sanity_check: WARNING: TCP_SNDLOWAT must at least be 4*MSS below u16_t overflow!\"\n#endif\n#if TCP_SNDQUEUELOWAT >= TCP_SND_QUEUELEN\n  #error \"lwip_sanity_check: WARNING: TCP_SNDQUEUELOWAT must be less than TCP_SND_QUEUELEN. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error.\"\n#endif\n#if !MEMP_MEM_MALLOC && PBUF_POOL_SIZE && (PBUF_POOL_BUFSIZE <= (PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))\n  #error \"lwip_sanity_check: WARNING: PBUF_POOL_BUFSIZE does not provide enough space for protocol headers. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error.\"\n#endif\n#if !MEMP_MEM_MALLOC && PBUF_POOL_SIZE && (TCP_WND > (PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - (PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))))\n  #error \"lwip_sanity_check: WARNING: TCP_WND is larger than space provided by PBUF_POOL_SIZE * (PBUF_POOL_BUFSIZE - protocol headers). If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error.\"\n#endif\n#if TCP_WND < TCP_MSS\n  #error \"lwip_sanity_check: WARNING: TCP_WND is smaller than MSS. If you know what you are doing, define LWIP_DISABLE_TCP_SANITY_CHECKS to 1 to disable this error.\"\n#endif\n#endif /* LWIP_TCP */\n#endif /* !LWIP_DISABLE_TCP_SANITY_CHECKS */\n\nSTlwIPFuncSsp g_stlwIPSspCallbacks;\n\nvoid lwIPRegSspCbk(const STlwIPFuncSsp* pstFuncSsp)\n{\n    if (NULL != pstFuncSsp && NULL != pstFuncSsp->pfRand)\n    {\n        g_stlwIPSspCallbacks.pfRand = pstFuncSsp->pfRand;\n    }\n}\n\n/**\n * @ingroup lwip_nosys\n * Initialize all modules.\n * Use this in NO_SYS mode. Use tcpip_init() otherwise.\n */\nvoid\nlwip_init(void)\n{\n#ifndef LWIP_SKIP_CONST_CHECK\n  int a = 0;\n  LWIP_UNUSED_ARG(a);\n  LWIP_ASSERT(\"LWIP_CONST_CAST not implemented correctly. Check your lwIP port.\", LWIP_CONST_CAST(void*, &a) == &a);\n#endif\n#ifndef LWIP_SKIP_PACKING_CHECK\n  LWIP_ASSERT(\"Struct packing not implemented correctly. Check your lwIP port.\", sizeof(struct packed_struct_test) == PACKED_STRUCT_TEST_EXPECTED_SIZE);\n#endif\n\n  /* Modules initialization */\n  stats_init();\n#if !NO_SYS\n  sys_init();\n#endif /* !NO_SYS */\n  mem_init();\n  memp_init();\n  pbuf_init();\n  netif_init();\n#if LWIP_IPV4\n  ip_init();\n#if LWIP_ARP\n  etharp_init();\n#endif /* LWIP_ARP */\n#endif /* LWIP_IPV4 */\n#if LWIP_RAW\n  raw_init();\n#endif /* LWIP_RAW */\n#if LWIP_UDP\n  udp_init();\n#endif /* LWIP_UDP */\n#if LWIP_TCP\n  tcp_init();\n#endif /* LWIP_TCP */\n#if LWIP_IGMP\n  igmp_init();\n#endif /* LWIP_IGMP */\n#if LWIP_DNS\n  dns_init();\n#endif /* LWIP_DNS */\n#if PPP_SUPPORT\n  ppp_init();\n#endif\n \n#if LWIP_TIMERS\n  sys_timeouts_init();\n#endif /* LWIP_TIMERS */\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ip.c",
    "content": "/**\n * @file\n * Common IPv4 and IPv6 code\n *\n * @defgroup ip IP\n * @ingroup callbackstyle_api\n * \n * @defgroup ip4 IPv4\n * @ingroup ip\n *\n * @defgroup ip6 IPv6\n * @ingroup ip\n * \n * @defgroup ipaddr IP address handling\n * @ingroup infrastructure\n * \n * @defgroup ip4addr IPv4 only\n * @ingroup ipaddr\n * \n * @defgroup ip6addr IPv6 only\n * @ingroup ipaddr\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV4 || LWIP_IPV6\n\n#include \"lwip/ip_addr.h\"\n#include \"lwip/ip.h\"\n\n/** Global data for both IPv4 and IPv6 */\nstruct ip_globals ip_data;\n\n#if LWIP_IPV4 && LWIP_IPV6\n\nconst ip_addr_t ip_addr_any_type = IPADDR_ANY_TYPE_INIT;\n\n/**\n * @ingroup ipaddr\n * Convert IP address string (both versions) to numeric.\n * The version is auto-detected from the string.\n *\n * @param cp IP address string to convert\n * @param addr conversion result is stored here\n * @return 1 on success, 0 on error\n */\nint\nipaddr_aton(const char *cp, ip_addr_t *addr)\n{\n  if (cp != NULL) {\n    const char* c;\n    for (c = cp; *c != 0; c++) {\n      if (*c == ':') {\n        /* contains a colon: IPv6 address */\n        if (addr) {\n          IP_SET_TYPE_VAL(*addr, IPADDR_TYPE_V6);\n        }\n        return ip6addr_aton(cp, ip_2_ip6(addr));\n      } else if (*c == '.') {\n        /* contains a dot: IPv4 address */\n        break;\n      }\n    }\n    /* call ip4addr_aton as fallback or if IPv4 was found */\n    if (addr) {\n      IP_SET_TYPE_VAL(*addr, IPADDR_TYPE_V4);\n    }\n    return ip4addr_aton(cp, ip_2_ip4(addr));\n  }\n  return 0;\n}\n\n/**\n * @ingroup lwip_nosys\n * If both IP versions are enabled, this function can dispatch packets to the correct one.\n * Don't call directly, pass to netif_add() and call netif->input().\n */\nerr_t\nip_input(struct pbuf *p, struct netif *inp)\n{\n  if (p != NULL) {\n    if (IP_HDR_GET_VERSION(p->payload) == 6) {\n      return ip6_input(p, inp);\n    }\n    return ip4_input(p, inp);\n  }\n  return ERR_VAL;\n}\n\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n#endif /* LWIP_IPV4 || LWIP_IPV6 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv4/autoip.c",
    "content": "/**\n * @file\n * AutoIP Automatic LinkLocal IP Configuration\n *\n * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform\n * with RFC 3927.\n *\n * @defgroup autoip AUTOIP\n * @ingroup ip4\n * AUTOIP related functions\n * USAGE:\n *\n * define @ref LWIP_AUTOIP 1 in your lwipopts.h\n * Options:\n * AUTOIP_TMR_INTERVAL msecs,\n *   I recommend a value of 100. The value must divide 1000 with a remainder almost 0.\n *   Possible values are 1000, 500, 333, 250, 200, 166, 142, 125, 111, 100 ....\n *\n * Without DHCP:\n * - Call autoip_start() after netif_add().\n *\n * With DHCP:\n * - define @ref LWIP_DHCP_AUTOIP_COOP 1 in your lwipopts.h.\n * - Configure your DHCP Client.\n * \n * @see netifapi_autoip\n */\n\n/*\n *\n * Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dominik Spies <kontakt@dspies.de>\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV4 && LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/mem.h\"\n/* #include \"lwip/udp.h\" */\n#include \"lwip/ip_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/autoip.h\"\n#include \"lwip/etharp.h\"\n#include \"lwip/prot/autoip.h\"\n\n#include <string.h>\n\n/** Pseudo random macro based on netif informations.\n * You could use \"rand()\" from the C Library if you define LWIP_AUTOIP_RAND in lwipopts.h */\n#ifndef LWIP_AUTOIP_RAND\n#define LWIP_AUTOIP_RAND(netif) ( (((u32_t)((netif->hwaddr[5]) & 0xff) << 24) | \\\n                                   ((u32_t)((netif->hwaddr[3]) & 0xff) << 16) | \\\n                                   ((u32_t)((netif->hwaddr[2]) & 0xff) << 8) | \\\n                                   ((u32_t)((netif->hwaddr[4]) & 0xff))) + \\\n                                   (netif_autoip_data(netif)? netif_autoip_data(netif)->tried_llipaddr : 0))\n#endif /* LWIP_AUTOIP_RAND */\n\n/**\n * Macro that generates the initial IP address to be tried by AUTOIP.\n * If you want to override this, define it to something else in lwipopts.h.\n */\n#ifndef LWIP_AUTOIP_CREATE_SEED_ADDR\n#define LWIP_AUTOIP_CREATE_SEED_ADDR(netif) \\\n  lwip_htonl(AUTOIP_RANGE_START + ((u32_t)(((u8_t)(netif->hwaddr[4])) | \\\n                 ((u32_t)((u8_t)(netif->hwaddr[5]))) << 8)))\n#endif /* LWIP_AUTOIP_CREATE_SEED_ADDR */\n\n/* static functions */\nstatic err_t autoip_arp_announce(struct netif *netif);\nstatic void autoip_start_probing(struct netif *netif);\n\n/**\n * @ingroup autoip \n * Set a statically allocated struct autoip to work with.\n * Using this prevents autoip_start to allocate it using mem_malloc.\n *\n * @param netif the netif for which to set the struct autoip\n * @param autoip (uninitialised) autoip struct allocated by the application\n */\nvoid\nautoip_set_struct(struct netif *netif, struct autoip *autoip)\n{\n  LWIP_ASSERT(\"netif != NULL\", netif != NULL);\n  LWIP_ASSERT(\"autoip != NULL\", autoip != NULL);\n  LWIP_ASSERT(\"netif already has a struct autoip set\",\n              netif_autoip_data(netif) == NULL);\n\n  /* clear data structure */\n  memset(autoip, 0, sizeof(struct autoip));\n  /* autoip->state = AUTOIP_STATE_OFF; */\n  netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP, autoip);\n}\n\n/** Restart AutoIP client and check the next address (conflict detected)\n *\n * @param netif The netif under AutoIP control\n */\nstatic void\nautoip_restart(struct netif *netif)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n  autoip->tried_llipaddr++;\n  autoip_start(netif);\n}\n\n/**\n * Handle a IP address conflict after an ARP conflict detection\n */\nstatic void\nautoip_handle_arp_conflict(struct netif *netif)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n\n  /* RFC3927, 2.5 \"Conflict Detection and Defense\" allows two options where\n     a) means retreat on the first conflict and\n     b) allows to keep an already configured address when having only one\n        conflict in 10 seconds\n     We use option b) since it helps to improve the chance that one of the two\n     conflicting hosts may be able to retain its address. */\n\n  if (autoip->lastconflict > 0) {\n    /* retreat, there was a conflicting ARP in the last DEFEND_INTERVAL seconds */\n    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,\n      (\"autoip_handle_arp_conflict(): we are defending, but in DEFEND_INTERVAL, retreating\\n\"));\n\n    /* Active TCP sessions are aborted when removing the ip addresss */\n    autoip_restart(netif);\n  } else {\n    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,\n      (\"autoip_handle_arp_conflict(): we are defend, send ARP Announce\\n\"));\n    autoip_arp_announce(netif);\n    autoip->lastconflict = DEFEND_INTERVAL * AUTOIP_TICKS_PER_SECOND;\n  }\n}\n\n/**\n * Create an IP-Address out of range 169.254.1.0 to 169.254.254.255\n *\n * @param netif network interface on which create the IP-Address\n * @param ipaddr ip address to initialize\n */\nstatic void\nautoip_create_addr(struct netif *netif, ip4_addr_t *ipaddr)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n\n  /* Here we create an IP-Address out of range 169.254.1.0 to 169.254.254.255\n   * compliant to RFC 3927 Section 2.1\n   * We have 254 * 256 possibilities */\n\n  u32_t addr = lwip_ntohl(LWIP_AUTOIP_CREATE_SEED_ADDR(netif));\n  addr += autoip->tried_llipaddr;\n  addr = AUTOIP_NET | (addr & 0xffff);\n  /* Now, 169.254.0.0 <= addr <= 169.254.255.255 */\n\n  if (addr < AUTOIP_RANGE_START) {\n    addr += AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1;\n  }\n  if (addr > AUTOIP_RANGE_END) {\n    addr -= AUTOIP_RANGE_END - AUTOIP_RANGE_START + 1;\n  }\n  LWIP_ASSERT(\"AUTOIP address not in range\", (addr >= AUTOIP_RANGE_START) &&\n    (addr <= AUTOIP_RANGE_END));\n  ip4_addr_set_u32(ipaddr, lwip_htonl(addr));\n\n  LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,\n    (\"autoip_create_addr(): tried_llipaddr=%\"U16_F\", %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n    (u16_t)(autoip->tried_llipaddr), ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr),\n    ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr)));\n}\n\n/**\n * Sends an ARP probe from a network interface\n *\n * @param netif network interface used to send the probe\n */\nstatic err_t\nautoip_arp_probe(struct netif *netif)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n  /* this works because netif->ip_addr is ANY */\n  return etharp_request(netif, &autoip->llipaddr);\n}\n\n/**\n * Sends an ARP announce from a network interface\n *\n * @param netif network interface used to send the announce\n */\nstatic err_t\nautoip_arp_announce(struct netif *netif)\n{\n  return etharp_gratuitous(netif);\n}\n\n/**\n * Configure interface for use with current LL IP-Address\n *\n * @param netif network interface to configure with current LL IP-Address\n */\nstatic err_t\nautoip_bind(struct netif *netif)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n  ip4_addr_t sn_mask, gw_addr;\n\n  LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,\n    (\"autoip_bind(netif=%p) %c%c%\"U16_F\" %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n    (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num,\n    ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),\n    ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));\n\n  IP4_ADDR(&sn_mask, 255, 255, 0, 0);\n  IP4_ADDR(&gw_addr, 0, 0, 0, 0);\n\n  netif_set_addr(netif, &autoip->llipaddr, &sn_mask, &gw_addr);\n  /* interface is used by routing now that an address is set */\n\n  return ERR_OK;\n}\n\n/**\n * @ingroup autoip \n * Start AutoIP client\n *\n * @param netif network interface on which start the AutoIP client\n */\nerr_t\nautoip_start(struct netif *netif)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n  err_t result = ERR_OK;\n\n  LWIP_ERROR(\"netif is not up, old style port?\", netif_is_up(netif), return ERR_ARG;);\n\n  /* Set IP-Address, Netmask and Gateway to 0 to make sure that\n   * ARP Packets are formed correctly\n   */\n  netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);\n\n  LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,\n    (\"autoip_start(netif=%p) %c%c%\"U16_F\"\\n\", (void*)netif, netif->name[0],\n    netif->name[1], (u16_t)netif->num));\n  if (autoip == NULL) {\n    /* no AutoIP client attached yet? */\n    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,\n      (\"autoip_start(): starting new AUTOIP client\\n\"));\n    autoip = (struct autoip *)mem_malloc(sizeof(struct autoip));\n    if (autoip == NULL) {\n      LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,\n        (\"autoip_start(): could not allocate autoip\\n\"));\n      return ERR_MEM;\n    }\n    memset(autoip, 0, sizeof(struct autoip));\n    /* store this AutoIP client in the netif */\n    netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP, autoip);\n    LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, (\"autoip_start(): allocated autoip\"));\n  } else {\n    autoip->state = AUTOIP_STATE_OFF;\n    autoip->ttw = 0;\n    autoip->sent_num = 0;\n    ip4_addr_set_zero(&autoip->llipaddr);\n    autoip->lastconflict = 0;\n  }\n\n  autoip_create_addr(netif, &(autoip->llipaddr));\n  autoip_start_probing(netif);\n\n  return result;\n}\n\nstatic void\nautoip_start_probing(struct netif *netif)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n\n  autoip->state = AUTOIP_STATE_PROBING;\n  autoip->sent_num = 0;\n  LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,\n     (\"autoip_start_probing(): changing state to PROBING: %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n      ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),\n      ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));\n\n  /* time to wait to first probe, this is randomly\n   * chosen out of 0 to PROBE_WAIT seconds.\n   * compliant to RFC 3927 Section 2.2.1\n   */\n  autoip->ttw = (u16_t)(LWIP_AUTOIP_RAND(netif) % (PROBE_WAIT * AUTOIP_TICKS_PER_SECOND));\n\n  /*\n   * if we tried more then MAX_CONFLICTS we must limit our rate for\n   * acquiring and probing address\n   * compliant to RFC 3927 Section 2.2.1\n   */\n  if (autoip->tried_llipaddr > MAX_CONFLICTS) {\n    autoip->ttw = RATE_LIMIT_INTERVAL * AUTOIP_TICKS_PER_SECOND;\n  }\n}\n\n/**\n * Handle a possible change in the network configuration.\n *\n * If there is an AutoIP address configured, take the interface down\n * and begin probing with the same address.\n */\nvoid\nautoip_network_changed(struct netif *netif)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n\n  if (autoip && (autoip->state != AUTOIP_STATE_OFF)) {\n    autoip_start_probing(netif);\n  }\n}\n\n/**\n * @ingroup autoip \n * Stop AutoIP client\n *\n * @param netif network interface on which stop the AutoIP client\n */\nerr_t\nautoip_stop(struct netif *netif)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n\n  if (autoip != NULL) {\n    autoip->state = AUTOIP_STATE_OFF;\n    if (ip4_addr_islinklocal(netif_ip4_addr(netif))) {\n      netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);\n    }\n  }\n  return ERR_OK;\n}\n\n/**\n * Has to be called in loop every AUTOIP_TMR_INTERVAL milliseconds\n */\nvoid\nautoip_tmr(void)\n{\n  struct netif *netif = netif_list;\n  /* loop through netif's */\n  while (netif != NULL) {\n    struct autoip* autoip = netif_autoip_data(netif);\n    /* only act on AutoIP configured interfaces */\n    if (autoip != NULL) {\n      if (autoip->lastconflict > 0) {\n        autoip->lastconflict--;\n      }\n\n      LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE,\n        (\"autoip_tmr() AutoIP-State: %\"U16_F\", ttw=%\"U16_F\"\\n\",\n        (u16_t)(autoip->state), autoip->ttw));\n\n      if (autoip->ttw > 0) {\n        autoip->ttw--;\n      }\n\n      switch(autoip->state) {\n        case AUTOIP_STATE_PROBING:\n          if (autoip->ttw == 0) {\n            if (autoip->sent_num >= PROBE_NUM) {\n              /* Switch to ANNOUNCING: now we can bind to an IP address and use it */\n              autoip->state = AUTOIP_STATE_ANNOUNCING;\n              autoip_bind(netif);\n              /* autoip_bind() calls netif_set_addr(): this triggers a gratuitous ARP\n                 which counts as an announcement */\n              autoip->sent_num = 1;\n              autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND;\n              LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,\n                 (\"autoip_tmr(): changing state to ANNOUNCING: %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n                  ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),\n                  ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));\n            } else {\n              autoip_arp_probe(netif);\n              LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, (\"autoip_tmr() PROBING Sent Probe\\n\"));\n              autoip->sent_num++;\n              if (autoip->sent_num == PROBE_NUM) {\n                /* calculate time to wait to for announce */\n                autoip->ttw = ANNOUNCE_WAIT * AUTOIP_TICKS_PER_SECOND;\n              } else {\n                /* calculate time to wait to next probe */\n                autoip->ttw = (u16_t)((LWIP_AUTOIP_RAND(netif) %\n                  ((PROBE_MAX - PROBE_MIN) * AUTOIP_TICKS_PER_SECOND) ) +\n                  PROBE_MIN * AUTOIP_TICKS_PER_SECOND);\n              }\n            }\n          }\n          break;\n\n        case AUTOIP_STATE_ANNOUNCING:\n          if (autoip->ttw == 0) {\n            autoip_arp_announce(netif);\n            LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, (\"autoip_tmr() ANNOUNCING Sent Announce\\n\"));\n            autoip->ttw = ANNOUNCE_INTERVAL * AUTOIP_TICKS_PER_SECOND;\n            autoip->sent_num++;\n\n            if (autoip->sent_num >= ANNOUNCE_NUM) {\n                autoip->state = AUTOIP_STATE_BOUND;\n                autoip->sent_num = 0;\n                autoip->ttw = 0;\n                 LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,\n                    (\"autoip_tmr(): changing state to BOUND: %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n                     ip4_addr1_16(&autoip->llipaddr), ip4_addr2_16(&autoip->llipaddr),\n                     ip4_addr3_16(&autoip->llipaddr), ip4_addr4_16(&autoip->llipaddr)));\n            }\n          }\n          break;\n\n        default:\n          /* nothing to do in other states */\n          break;\n      }\n    }\n    /* proceed to next network interface */\n    netif = netif->next;\n  }\n}\n\n/**\n * Handles every incoming ARP Packet, called by etharp_input().\n *\n * @param netif network interface to use for autoip processing\n * @param hdr Incoming ARP packet\n */\nvoid\nautoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n\n  LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE, (\"autoip_arp_reply()\\n\"));\n  if ((autoip != NULL) && (autoip->state != AUTOIP_STATE_OFF)) {\n   /* when ip.src == llipaddr && hw.src != netif->hwaddr\n    *\n    * when probing  ip.dst == llipaddr && hw.src != netif->hwaddr\n    * we have a conflict and must solve it\n    */\n    ip4_addr_t sipaddr, dipaddr;\n    struct eth_addr netifaddr;\n    ETHADDR16_COPY(netifaddr.addr, netif->hwaddr);\n\n    /* Copy struct ip4_addr2 to aligned ip4_addr, to support compilers without\n     * structure packing (not using structure copy which breaks strict-aliasing rules).\n     */\n    IPADDR2_COPY(&sipaddr, &hdr->sipaddr);\n    IPADDR2_COPY(&dipaddr, &hdr->dipaddr);\n\n    if (autoip->state == AUTOIP_STATE_PROBING) {\n     /* RFC 3927 Section 2.2.1:\n      * from beginning to after ANNOUNCE_WAIT\n      * seconds we have a conflict if\n      * ip.src == llipaddr OR\n      * ip.dst == llipaddr && hw.src != own hwaddr\n      */\n      if ((ip4_addr_cmp(&sipaddr, &autoip->llipaddr)) ||\n          (ip4_addr_isany_val(sipaddr) &&\n           ip4_addr_cmp(&dipaddr, &autoip->llipaddr) &&\n           !eth_addr_cmp(&netifaddr, &hdr->shwaddr))) {\n        LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,\n          (\"autoip_arp_reply(): Probe Conflict detected\\n\"));\n        autoip_restart(netif);\n      }\n    } else {\n     /* RFC 3927 Section 2.5:\n      * in any state we have a conflict if\n      * ip.src == llipaddr && hw.src != own hwaddr\n      */\n      if (ip4_addr_cmp(&sipaddr, &autoip->llipaddr) &&\n          !eth_addr_cmp(&netifaddr, &hdr->shwaddr)) {\n        LWIP_DEBUGF(AUTOIP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,\n          (\"autoip_arp_reply(): Conflicting ARP-Packet detected\\n\"));\n        autoip_handle_arp_conflict(netif);\n      }\n    }\n  }\n}\n\n/** check if AutoIP supplied netif->ip_addr\n *\n * @param netif the netif to check\n * @return 1 if AutoIP supplied netif->ip_addr (state BOUND or ANNOUNCING),\n *         0 otherwise\n */\nu8_t\nautoip_supplied_address(const struct netif *netif)\n{\n  if ((netif != NULL) && (netif_autoip_data(netif) != NULL)) {\n    struct autoip* autoip = netif_autoip_data(netif);\n    return (autoip->state == AUTOIP_STATE_BOUND) || (autoip->state == AUTOIP_STATE_ANNOUNCING);\n  }\n  return 0;\n}\n\nu8_t\nautoip_accept_packet(struct netif *netif, const ip4_addr_t *addr)\n{\n  struct autoip* autoip = netif_autoip_data(netif);\n  return (autoip != NULL) && ip4_addr_cmp(addr, &(autoip->llipaddr));\n}\n\n#endif /* LWIP_IPV4 && LWIP_AUTOIP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv4/dhcp.c",
    "content": "/**\n * @file\n * Dynamic Host Configuration Protocol client\n *\n * @defgroup dhcp4 DHCPv4\n * @ingroup ip4\n * DHCP (IPv4) related functions\n * This is a DHCP client for the lwIP TCP/IP stack. It aims to conform\n * with RFC 2131 and RFC 2132.\n *\n * @todo:\n * - Support for interfaces other than Ethernet (SLIP, PPP, ...)\n *\n * Options:\n * @ref DHCP_COARSE_TIMER_SECS (recommended 60 which is a minute)\n * @ref DHCP_FINE_TIMER_MSECS (recommended 500 which equals TCP coarse timer)\n *\n * dhcp_start() starts a DHCP client instance which\n * configures the interface by obtaining an IP address lease and maintaining it.\n *\n * Use dhcp_release() to end the lease and use dhcp_stop()\n * to remove the DHCP client.\n *\n * @see netifapi_dhcp4\n */\n\n/*\n * Copyright (c) 2001-2004 Leon Woestenberg <leon.woestenberg@gmx.net>\n * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * The Swedish Institute of Computer Science and Adam Dunkels\n * are specifically granted permission to redistribute this\n * source code.\n *\n * Author: Leon Woestenberg <leon.woestenberg@gmx.net>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV4 && LWIP_DHCP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/stats.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/def.h\"\n#include \"lwip/dhcp.h\"\n#include \"lwip/autoip.h\"\n#include \"lwip/dns.h\"\n#include \"lwip/etharp.h\"\n#include \"lwip/prot/dhcp.h\"\n\n#include <string.h>\n\n/** DHCP_CREATE_RAND_XID: if this is set to 1, the xid is created using\n * LWIP_RAND() (this overrides DHCP_GLOBAL_XID)\n */\n#ifndef DHCP_CREATE_RAND_XID\n#define DHCP_CREATE_RAND_XID        1\n#endif\n\n/** Default for DHCP_GLOBAL_XID is 0xABCD0000\n * This can be changed by defining DHCP_GLOBAL_XID and DHCP_GLOBAL_XID_HEADER, e.g.\n *  \\#define DHCP_GLOBAL_XID_HEADER \"stdlib.h\"\n *  \\#define DHCP_GLOBAL_XID rand()\n */\n#ifdef DHCP_GLOBAL_XID_HEADER\n#include DHCP_GLOBAL_XID_HEADER /* include optional starting XID generation prototypes */\n#endif\n\n/** DHCP_OPTION_MAX_MSG_SIZE is set to the MTU\n * MTU is checked to be big enough in dhcp_start */\n#define DHCP_MAX_MSG_LEN(netif)        (netif->mtu)\n#define DHCP_MAX_MSG_LEN_MIN_REQUIRED  576\n/** Minimum length for reply before packet is parsed */\n#define DHCP_MIN_REPLY_LEN             44\n\n#define REBOOT_TRIES                2\n\n#if LWIP_DNS && LWIP_DHCP_MAX_DNS_SERVERS\n#if DNS_MAX_SERVERS > LWIP_DHCP_MAX_DNS_SERVERS\n#define LWIP_DHCP_PROVIDE_DNS_SERVERS LWIP_DHCP_MAX_DNS_SERVERS\n#else\n#define LWIP_DHCP_PROVIDE_DNS_SERVERS DNS_MAX_SERVERS\n#endif\n#else\n#define LWIP_DHCP_PROVIDE_DNS_SERVERS 0\n#endif\n\n/** Option handling: options are parsed in dhcp_parse_reply\n * and saved in an array where other functions can load them from.\n * This might be moved into the struct dhcp (not necessarily since\n * lwIP is single-threaded and the array is only used while in recv\n * callback). */\nenum dhcp_option_idx {\n  DHCP_OPTION_IDX_OVERLOAD = 0,\n  DHCP_OPTION_IDX_MSG_TYPE,\n  DHCP_OPTION_IDX_SERVER_ID,\n  DHCP_OPTION_IDX_LEASE_TIME,\n  DHCP_OPTION_IDX_T1,\n  DHCP_OPTION_IDX_T2,\n  DHCP_OPTION_IDX_SUBNET_MASK,\n  DHCP_OPTION_IDX_ROUTER,\n#if LWIP_DHCP_PROVIDE_DNS_SERVERS\n  DHCP_OPTION_IDX_DNS_SERVER,\n  DHCP_OPTION_IDX_DNS_SERVER_LAST = DHCP_OPTION_IDX_DNS_SERVER + LWIP_DHCP_PROVIDE_DNS_SERVERS - 1,\n#endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */\n#if LWIP_DHCP_GET_NTP_SRV\n  DHCP_OPTION_IDX_NTP_SERVER,\n  DHCP_OPTION_IDX_NTP_SERVER_LAST = DHCP_OPTION_IDX_NTP_SERVER + LWIP_DHCP_MAX_NTP_SERVERS - 1,\n#endif /* LWIP_DHCP_GET_NTP_SRV */\n  DHCP_OPTION_IDX_MAX\n};\n\n/** Holds the decoded option values, only valid while in dhcp_recv.\n    @todo: move this into struct dhcp? */\nu32_t dhcp_rx_options_val[DHCP_OPTION_IDX_MAX];\n/** Holds a flag which option was received and is contained in dhcp_rx_options_val,\n    only valid while in dhcp_recv.\n    @todo: move this into struct dhcp? */\nu8_t  dhcp_rx_options_given[DHCP_OPTION_IDX_MAX];\n\nstatic u8_t dhcp_discover_request_options[] = {\n  DHCP_OPTION_SUBNET_MASK,\n  DHCP_OPTION_ROUTER,\n  DHCP_OPTION_BROADCAST\n#if LWIP_DHCP_PROVIDE_DNS_SERVERS\n  , DHCP_OPTION_DNS_SERVER\n#endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */\n#if LWIP_DHCP_GET_NTP_SRV\n  , DHCP_OPTION_NTP\n#endif /* LWIP_DHCP_GET_NTP_SRV */\n  };\n\n#ifdef DHCP_GLOBAL_XID\nstatic u32_t xid;\nstatic u8_t xid_initialised;\n#endif /* DHCP_GLOBAL_XID */\n\n#define dhcp_option_given(dhcp, idx)          (dhcp_rx_options_given[idx] != 0)\n#define dhcp_got_option(dhcp, idx)            (dhcp_rx_options_given[idx] = 1)\n#define dhcp_clear_option(dhcp, idx)          (dhcp_rx_options_given[idx] = 0)\n#define dhcp_clear_all_options(dhcp)          (memset(dhcp_rx_options_given, 0, sizeof(dhcp_rx_options_given)))\n#define dhcp_get_option_value(dhcp, idx)      (dhcp_rx_options_val[idx])\n#define dhcp_set_option_value(dhcp, idx, val) (dhcp_rx_options_val[idx] = (val))\n\nstatic struct udp_pcb *dhcp_pcb;\nstatic u8_t dhcp_pcb_refcount;\n\n/* DHCP client state machine functions */\nstatic err_t dhcp_discover(struct netif *netif);\nstatic err_t dhcp_select(struct netif *netif);\nstatic void dhcp_bind(struct netif *netif);\n#if DHCP_DOES_ARP_CHECK\nstatic err_t dhcp_decline(struct netif *netif);\n#endif /* DHCP_DOES_ARP_CHECK */\nstatic err_t dhcp_rebind(struct netif *netif);\nstatic err_t dhcp_reboot(struct netif *netif);\nstatic void dhcp_set_state(struct dhcp *dhcp, u8_t new_state);\n\n/* receive, unfold, parse and free incoming messages */\nstatic void dhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);\n\n/* set the DHCP timers */\nstatic void dhcp_timeout(struct netif *netif);\nstatic void dhcp_t1_timeout(struct netif *netif);\nstatic void dhcp_t2_timeout(struct netif *netif);\n\n/* build outgoing messages */\n/* create a DHCP message, fill in common headers */\nstatic err_t dhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type);\n/* free a DHCP request */\nstatic void dhcp_delete_msg(struct dhcp *dhcp);\n/* add a DHCP option (type, then length in bytes) */\nstatic void dhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len);\n/* add option values */\nstatic void dhcp_option_byte(struct dhcp *dhcp, u8_t value);\nstatic void dhcp_option_short(struct dhcp *dhcp, u16_t value);\nstatic void dhcp_option_long(struct dhcp *dhcp, u32_t value);\n#if LWIP_NETIF_HOSTNAME\nstatic void dhcp_option_hostname(struct dhcp *dhcp, struct netif *netif);\n#endif /* LWIP_NETIF_HOSTNAME */\n/* always add the DHCP options trailer to end and pad */\nstatic void dhcp_option_trailer(struct dhcp *dhcp);\n\n/** Ensure DHCP PCB is allocated and bound */\nstatic err_t\ndhcp_inc_pcb_refcount(void)\n{\n  if (dhcp_pcb_refcount == 0) {\n    LWIP_ASSERT(\"dhcp_inc_pcb_refcount(): memory leak\", dhcp_pcb == NULL);\n\n    /* allocate UDP PCB */\n    dhcp_pcb = udp_new();\n\n    if (dhcp_pcb == NULL) {\n      return ERR_MEM;\n    }\n\n    ip_set_option(dhcp_pcb, SOF_BROADCAST);\n\n    /* set up local and remote port for the pcb -> listen on all interfaces on all src/dest IPs */\n    udp_bind(dhcp_pcb, IP4_ADDR_ANY, DHCP_CLIENT_PORT);\n    udp_connect(dhcp_pcb, IP4_ADDR_ANY, DHCP_SERVER_PORT);\n    udp_recv(dhcp_pcb, dhcp_recv, NULL);\n  }\n\n  dhcp_pcb_refcount++;\n\n  return ERR_OK;\n}\n\n/** Free DHCP PCB if the last netif stops using it */\nstatic void\ndhcp_dec_pcb_refcount(void)\n{\n  LWIP_ASSERT(\"dhcp_pcb_refcount(): refcount error\", (dhcp_pcb_refcount > 0));\n  dhcp_pcb_refcount--;\n\n  if (dhcp_pcb_refcount == 0) {\n    udp_remove(dhcp_pcb);\n    dhcp_pcb = NULL;\n  }\n}\n\n/**\n * Back-off the DHCP client (because of a received NAK response).\n *\n * Back-off the DHCP client because of a received NAK. Receiving a\n * NAK means the client asked for something non-sensible, for\n * example when it tries to renew a lease obtained on another network.\n *\n * We clear any existing set IP address and restart DHCP negotiation\n * afresh (as per RFC2131 3.2.3).\n *\n * @param netif the netif under DHCP control\n */\nstatic void\ndhcp_handle_nak(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_handle_nak(netif=%p) %c%c%\"U16_F\"\\n\",\n    (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));\n  /* Change to a defined state - set this before assigning the address\n     to ensure the callback can use dhcp_supplied_address() */\n  dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);\n  /* remove IP address from interface (must no longer be used, as per RFC2131) */\n  netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);\n  /* We can immediately restart discovery */\n  dhcp_discover(netif);\n}\n\n#if DHCP_DOES_ARP_CHECK\n/**\n * Checks if the offered IP address is already in use.\n *\n * It does so by sending an ARP request for the offered address and\n * entering CHECKING state. If no ARP reply is received within a small\n * interval, the address is assumed to be free for use by us.\n *\n * @param netif the netif under DHCP control\n */\nstatic void\ndhcp_check(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n  err_t result;\n  u16_t msecs;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_check(netif=%p) %c%c\\n\", (void *)netif, (s16_t)netif->name[0],\n    (s16_t)netif->name[1]));\n  dhcp_set_state(dhcp, DHCP_STATE_CHECKING);\n  /* create an ARP query for the offered IP address, expecting that no host\n     responds, as the IP address should not be in use. */\n  result = etharp_query(netif, &dhcp->offered_ip_addr, NULL);\n  if (result != ERR_OK) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, (\"dhcp_check: could not perform ARP query\\n\"));\n  }\n  if (dhcp->tries < 255) {\n    dhcp->tries++;\n  }\n  msecs = 500;\n  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_check(): set request timeout %\"U16_F\" msecs\\n\", msecs));\n}\n#endif /* DHCP_DOES_ARP_CHECK */\n\n/**\n * Remember the configuration offered by a DHCP server.\n *\n * @param netif the netif under DHCP control\n */\nstatic void\ndhcp_handle_offer(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_handle_offer(netif=%p) %c%c%\"U16_F\"\\n\",\n    (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));\n  /* obtain the server address */\n  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SERVER_ID)) {\n    ip_addr_set_ip4_u32(&dhcp->server_ip_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SERVER_ID)));\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, (\"dhcp_handle_offer(): server 0x%08\"X32_F\"\\n\",\n      ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));\n    /* remember offered address */\n    ip4_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, (\"dhcp_handle_offer(): offer for 0x%08\"X32_F\"\\n\",\n      ip4_addr_get_u32(&dhcp->offered_ip_addr)));\n\n    dhcp_select(netif);\n  } else {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,\n      (\"dhcp_handle_offer(netif=%p) did not get server ID!\\n\", (void*)netif));\n  }\n}\n\n/**\n * Select a DHCP server offer out of all offers.\n *\n * Simply select the first offer received.\n *\n * @param netif the netif under DHCP control\n * @return lwIP specific error (see error.h)\n */\nstatic err_t\ndhcp_select(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n  err_t result;\n  u16_t msecs;\n  u8_t i;\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_select(netif=%p) %c%c%\"U16_F\"\\n\", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));\n  dhcp_set_state(dhcp, DHCP_STATE_REQUESTING);\n\n  /* create and initialize the DHCP message header */\n  result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);\n  if (result == ERR_OK) {\n    dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);\n    dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));\n\n    /* MUST request the offered IP address */\n    dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);\n    dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));\n\n    dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);\n    dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&dhcp->server_ip_addr))));\n\n    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));\n    for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {\n      dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);\n    }\n\n#if LWIP_NETIF_HOSTNAME\n    dhcp_option_hostname(dhcp, netif);\n#endif /* LWIP_NETIF_HOSTNAME */\n\n    dhcp_option_trailer(dhcp);\n    /* shrink the pbuf to the actual content length */\n    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);\n\n    /* send broadcast to any DHCP server */\n    udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP4_ADDR_ANY);\n    dhcp_delete_msg(dhcp);\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_select: REQUESTING\\n\"));\n  } else {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, (\"dhcp_select: could not allocate DHCP request\\n\"));\n  }\n  if (dhcp->tries < 255) {\n    dhcp->tries++;\n  }\n  msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;\n  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, (\"dhcp_select(): set request timeout %\"U16_F\" msecs\\n\", msecs));\n  return result;\n}\n\n/**\n * The DHCP timer that checks for lease renewal/rebind timeouts.\n * Must be called once a minute (see @ref DHCP_COARSE_TIMER_SECS).\n */\nvoid\ndhcp_coarse_tmr(void)\n{\n  struct netif *netif = netif_list;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_coarse_tmr()\\n\"));\n  /* iterate through all network interfaces */\n  while (netif != NULL) {\n    /* only act on DHCP configured interfaces */\n    struct dhcp *dhcp = netif_dhcp_data(netif);\n    if ((dhcp != NULL) && (dhcp->state != DHCP_STATE_OFF)) {\n      /* compare lease time to expire timeout */\n      if (dhcp->t0_timeout && (++dhcp->lease_used == dhcp->t0_timeout)) {\n        LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_coarse_tmr(): t0 timeout\\n\"));\n        /* this clients' lease time has expired */\n        dhcp_release(netif);\n        dhcp_discover(netif);\n      /* timer is active (non zero), and triggers (zeroes) now? */\n      } else if (dhcp->t2_rebind_time && (dhcp->t2_rebind_time-- == 1)) {\n        LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_coarse_tmr(): t2 timeout\\n\"));\n        /* this clients' rebind timeout triggered */\n        dhcp_t2_timeout(netif);\n      /* timer is active (non zero), and triggers (zeroes) now */\n      } else if (dhcp->t1_renew_time && (dhcp->t1_renew_time-- == 1)) {\n        LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_coarse_tmr(): t1 timeout\\n\"));\n        /* this clients' renewal timeout triggered */\n        dhcp_t1_timeout(netif);\n      }\n    }\n    /* proceed to next netif */\n    netif = netif->next;\n  }\n}\n\n/**\n * DHCP transaction timeout handling (this function must be called every 500ms,\n * see @ref DHCP_FINE_TIMER_MSECS).\n *\n * A DHCP server is expected to respond within a short period of time.\n * This timer checks whether an outstanding DHCP request is timed out.\n */\nvoid\ndhcp_fine_tmr(void)\n{\n  struct netif *netif = netif_list;\n  /* loop through netif's */\n  while (netif != NULL) {\n    struct dhcp *dhcp = netif_dhcp_data(netif);\n    /* only act on DHCP configured interfaces */\n    if (dhcp != NULL) {\n      /* timer is active (non zero), and is about to trigger now */\n      if (dhcp->request_timeout > 1) {\n        dhcp->request_timeout--;\n      }\n      else if (dhcp->request_timeout == 1) {\n        dhcp->request_timeout--;\n        /* { netif->dhcp->request_timeout == 0 } */\n        LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_fine_tmr(): request timeout\\n\"));\n        /* this client's request timeout triggered */\n        dhcp_timeout(netif);\n      }\n    }\n    /* proceed to next network interface */\n    netif = netif->next;\n  }\n}\n\n/**\n * A DHCP negotiation transaction, or ARP request, has timed out.\n *\n * The timer that was started with the DHCP or ARP request has\n * timed out, indicating no response was received in time.\n *\n * @param netif the netif under DHCP control\n */\nstatic void\ndhcp_timeout(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_timeout()\\n\"));\n  /* back-off period has passed, or server selection timed out */\n  if ((dhcp->state == DHCP_STATE_BACKING_OFF) || (dhcp->state == DHCP_STATE_SELECTING)) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_timeout(): restarting discovery\\n\"));\n    dhcp_discover(netif);\n  /* receiving the requested lease timed out */\n  } else if (dhcp->state == DHCP_STATE_REQUESTING) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_timeout(): REQUESTING, DHCP request timed out\\n\"));\n    if (dhcp->tries <= 5) {\n      dhcp_select(netif);\n    } else {\n      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_timeout(): REQUESTING, releasing, restarting\\n\"));\n      dhcp_release(netif);\n      dhcp_discover(netif);\n    }\n#if DHCP_DOES_ARP_CHECK\n  /* received no ARP reply for the offered address (which is good) */\n  } else if (dhcp->state == DHCP_STATE_CHECKING) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_timeout(): CHECKING, ARP request timed out\\n\"));\n    if (dhcp->tries <= 1) {\n      dhcp_check(netif);\n    /* no ARP replies on the offered address,\n       looks like the IP address is indeed free */\n    } else {\n      /* bind the interface to the offered address */\n      dhcp_bind(netif);\n    }\n#endif /* DHCP_DOES_ARP_CHECK */\n  } else if (dhcp->state == DHCP_STATE_REBOOTING) {\n    if (dhcp->tries < REBOOT_TRIES) {\n      dhcp_reboot(netif);\n    } else {\n      dhcp_discover(netif);\n    }\n  }\n}\n\n/**\n * The renewal period has timed out.\n *\n * @param netif the netif under DHCP control\n */\nstatic void\ndhcp_t1_timeout(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, (\"dhcp_t1_timeout()\\n\"));\n  if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) ||\n      (dhcp->state == DHCP_STATE_RENEWING)) {\n    /* just retry to renew - note that the rebind timer (t2) will\n     * eventually time-out if renew tries fail. */\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,\n                (\"dhcp_t1_timeout(): must renew\\n\"));\n    /* This slightly different to RFC2131: DHCPREQUEST will be sent from state\n       DHCP_STATE_RENEWING, not DHCP_STATE_BOUND */\n    dhcp_renew(netif);\n    /* Calculate next timeout */\n    if (((dhcp->t2_timeout - dhcp->lease_used) / 2) >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS))\n    {\n       dhcp->t1_renew_time = ((dhcp->t2_timeout - dhcp->lease_used) / 2);\n    }\n  }\n}\n\n/**\n * The rebind period has timed out.\n *\n * @param netif the netif under DHCP control\n */\nstatic void\ndhcp_t2_timeout(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_t2_timeout()\\n\"));\n  if ((dhcp->state == DHCP_STATE_REQUESTING) || (dhcp->state == DHCP_STATE_BOUND) ||\n      (dhcp->state == DHCP_STATE_RENEWING) || (dhcp->state == DHCP_STATE_REBINDING)) {\n    /* just retry to rebind */\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,\n                (\"dhcp_t2_timeout(): must rebind\\n\"));\n    /* This slightly different to RFC2131: DHCPREQUEST will be sent from state\n       DHCP_STATE_REBINDING, not DHCP_STATE_BOUND */\n    dhcp_rebind(netif);\n    /* Calculate next timeout */\n    if (((dhcp->t0_timeout - dhcp->lease_used) / 2) >= ((60 + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS))\n    {\n       dhcp->t2_rebind_time = ((dhcp->t0_timeout - dhcp->lease_used) / 2);\n    }\n  }\n}\n\n/**\n * Handle a DHCP ACK packet\n *\n * @param netif the netif under DHCP control\n */\nstatic void\ndhcp_handle_ack(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n\n#if LWIP_DHCP_PROVIDE_DNS_SERVERS || LWIP_DHCP_GET_NTP_SRV\n  u8_t n;\n#endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS || LWIP_DHCP_GET_NTP_SRV */\n#if LWIP_DHCP_GET_NTP_SRV\n  ip4_addr_t ntp_server_addrs[LWIP_DHCP_MAX_NTP_SERVERS];\n#endif\n\n  /* clear options we might not get from the ACK */\n  ip4_addr_set_zero(&dhcp->offered_sn_mask);\n  ip4_addr_set_zero(&dhcp->offered_gw_addr);\n#if LWIP_DHCP_BOOTP_FILE\n  ip4_addr_set_zero(&dhcp->offered_si_addr);\n#endif /* LWIP_DHCP_BOOTP_FILE */\n\n  /* lease time given? */\n  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_LEASE_TIME)) {\n    /* remember offered lease time */\n    dhcp->offered_t0_lease = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_LEASE_TIME);\n  }\n  /* renewal period given? */\n  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T1)) {\n    /* remember given renewal period */\n    dhcp->offered_t1_renew = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T1);\n  } else {\n    /* calculate safe periods for renewal */\n    dhcp->offered_t1_renew = dhcp->offered_t0_lease / 2;\n  }\n\n  /* renewal period given? */\n  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_T2)) {\n    /* remember given rebind period */\n    dhcp->offered_t2_rebind = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_T2);\n  } else {\n    /* calculate safe periods for rebinding (offered_t0_lease * 0.875 -> 87.5%)*/\n    dhcp->offered_t2_rebind = (dhcp->offered_t0_lease * 7U) / 8U;\n  }\n\n  /* (y)our internet address */\n  ip4_addr_copy(dhcp->offered_ip_addr, dhcp->msg_in->yiaddr);\n\n#if LWIP_DHCP_BOOTP_FILE\n  /* copy boot server address,\n     boot file name copied in dhcp_parse_reply if not overloaded */\n  ip4_addr_copy(dhcp->offered_si_addr, dhcp->msg_in->siaddr);\n#endif /* LWIP_DHCP_BOOTP_FILE */\n\n  /* subnet mask given? */\n  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)) {\n    /* remember given subnet mask */\n    ip4_addr_set_u32(&dhcp->offered_sn_mask, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_SUBNET_MASK)));\n    dhcp->subnet_mask_given = 1;\n  } else {\n    dhcp->subnet_mask_given = 0;\n  }\n\n  /* gateway router */\n  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_ROUTER)) {\n    ip4_addr_set_u32(&dhcp->offered_gw_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_ROUTER)));\n  }\n\n#if LWIP_DHCP_GET_NTP_SRV\n  /* NTP servers */\n  for (n = 0; (n < LWIP_DHCP_MAX_NTP_SERVERS) && dhcp_option_given(dhcp, DHCP_OPTION_IDX_NTP_SERVER + n); n++) {\n    ip4_addr_set_u32(&ntp_server_addrs[n], lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_NTP_SERVER + n)));\n  }\n  dhcp_set_ntp_servers(n, ntp_server_addrs);\n#endif /* LWIP_DHCP_GET_NTP_SRV */\n\n#if LWIP_DHCP_PROVIDE_DNS_SERVERS\n  /* DNS servers */\n  for (n = 0; (n < LWIP_DHCP_PROVIDE_DNS_SERVERS) && dhcp_option_given(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n); n++) {\n    ip_addr_t dns_addr;\n    ip_addr_set_ip4_u32(&dns_addr, lwip_htonl(dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_DNS_SERVER + n)));\n    dns_setserver(n, &dns_addr);\n  }\n#endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */\n}\n\n/**\n * @ingroup dhcp4\n * Set a statically allocated struct dhcp to work with.\n * Using this prevents dhcp_start to allocate it using mem_malloc.\n *\n * @param netif the netif for which to set the struct dhcp\n * @param dhcp (uninitialised) dhcp struct allocated by the application\n */\nvoid\ndhcp_set_struct(struct netif *netif, struct dhcp *dhcp)\n{\n  LWIP_ASSERT(\"netif != NULL\", netif != NULL);\n  LWIP_ASSERT(\"dhcp != NULL\", dhcp != NULL);\n  LWIP_ASSERT(\"netif already has a struct dhcp set\", netif_dhcp_data(netif) == NULL);\n\n  /* clear data structure */\n  memset(dhcp, 0, sizeof(struct dhcp));\n  /* dhcp_set_state(&dhcp, DHCP_STATE_OFF); */\n  netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, dhcp);\n}\n\n/**\n * @ingroup dhcp4\n * Removes a struct dhcp from a netif.\n *\n * ATTENTION: Only use this when not using dhcp_set_struct() to allocate the\n *            struct dhcp since the memory is passed back to the heap.\n *\n * @param netif the netif from which to remove the struct dhcp\n */\nvoid dhcp_cleanup(struct netif *netif)\n{\n  LWIP_ASSERT(\"netif != NULL\", netif != NULL);\n\n  if (netif_dhcp_data(netif) != NULL) {\n    mem_free(netif_dhcp_data(netif));\n    netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, NULL);\n  }\n}\n\n/**\n * @ingroup dhcp4\n * Start DHCP negotiation for a network interface.\n *\n * If no DHCP client instance was attached to this interface,\n * a new client is created first. If a DHCP client instance\n * was already present, it restarts negotiation.\n *\n * @param netif The lwIP network interface\n * @return lwIP error code\n * - ERR_OK - No error\n * - ERR_MEM - Out of memory\n */\nerr_t\ndhcp_start(struct netif *netif)\n{\n  struct dhcp *dhcp;\n  err_t result;\n\n  LWIP_ERROR(\"netif != NULL\", (netif != NULL), return ERR_ARG;);\n  LWIP_ERROR(\"netif is not up, old style port?\", netif_is_up(netif), return ERR_ARG;);\n  dhcp = netif_dhcp_data(netif);\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_start(netif=%p) %c%c%\"U16_F\"\\n\", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));\n\n  /* check MTU of the netif */\n  if (netif->mtu < DHCP_MAX_MSG_LEN_MIN_REQUIRED) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_start(): Cannot use this netif with DHCP: MTU is too small\\n\"));\n    return ERR_MEM;\n  }\n\n  /* no DHCP client attached yet? */\n  if (dhcp == NULL) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_start(): mallocing new DHCP client\\n\"));\n    dhcp = (struct dhcp *)mem_malloc(sizeof(struct dhcp));\n    if (dhcp == NULL) {\n      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_start(): could not allocate dhcp\\n\"));\n      return ERR_MEM;\n    }\n\n    /* store this dhcp client in the netif */\n    netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, dhcp);\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_start(): allocated dhcp\"));\n  /* already has DHCP client attached */\n  } else {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_start(): restarting DHCP configuration\\n\"));\n    LWIP_ASSERT(\"pbuf p_out wasn't freed\", dhcp->p_out == NULL);\n    LWIP_ASSERT(\"reply wasn't freed\", dhcp->msg_in == NULL );\n\n    if (dhcp->pcb_allocated != 0) {\n      dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */\n    }\n    /* dhcp is cleared below, no need to reset flag*/\n  }\n\n  /* clear data structure */\n  memset(dhcp, 0, sizeof(struct dhcp));\n  /* dhcp_set_state(&dhcp, DHCP_STATE_OFF); */\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_start(): starting DHCP configuration\\n\"));\n\n  if (dhcp_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP PCB is allocated */\n    return ERR_MEM;\n  }\n  dhcp->pcb_allocated = 1;\n\n#if LWIP_DHCP_CHECK_LINK_UP\n  if (!netif_is_link_up(netif)) {\n    /* set state INIT and wait for dhcp_network_changed() to call dhcp_discover() */\n    dhcp_set_state(dhcp, DHCP_STATE_INIT);\n    return ERR_OK;\n  }\n#endif /* LWIP_DHCP_CHECK_LINK_UP */\n\n\n  /* (re)start the DHCP negotiation */\n  result = dhcp_discover(netif);\n  if (result != ERR_OK) {\n    /* free resources allocated above */\n    dhcp_stop(netif);\n    return ERR_MEM;\n  }\n  return result;\n}\n\n/**\n * @ingroup dhcp4\n * Inform a DHCP server of our manual configuration.\n *\n * This informs DHCP servers of our fixed IP address configuration\n * by sending an INFORM message. It does not involve DHCP address\n * configuration, it is just here to be nice to the network.\n *\n * @param netif The lwIP network interface\n */\nvoid\ndhcp_inform(struct netif *netif)\n{\n  struct dhcp dhcp;\n  err_t result = ERR_OK;\n\n  LWIP_ERROR(\"netif != NULL\", (netif != NULL), return;);\n\n  if (dhcp_inc_pcb_refcount() != ERR_OK) { /* ensure DHCP PCB is allocated */\n    return;\n  }\n\n  memset(&dhcp, 0, sizeof(struct dhcp));\n  dhcp_set_state(&dhcp, DHCP_STATE_INFORMING);\n\n  /* create and initialize the DHCP message header */\n  result = dhcp_create_msg(netif, &dhcp, DHCP_INFORM);\n  if (result == ERR_OK) {\n    dhcp_option(&dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);\n    dhcp_option_short(&dhcp, DHCP_MAX_MSG_LEN(netif));\n\n    dhcp_option_trailer(&dhcp);\n\n    pbuf_realloc(dhcp.p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp.options_out_len);\n\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_inform: INFORMING\\n\"));\n\n    udp_sendto_if(dhcp_pcb, dhcp.p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);\n\n    dhcp_delete_msg(&dhcp);\n  } else {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, (\"dhcp_inform: could not allocate DHCP request\\n\"));\n  }\n\n  dhcp_dec_pcb_refcount(); /* delete DHCP PCB if not needed any more */\n}\n\n/** Handle a possible change in the network configuration.\n *\n * This enters the REBOOTING state to verify that the currently bound\n * address is still valid.\n */\nvoid\ndhcp_network_changed(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n\n  if (!dhcp)\n    return;\n  switch (dhcp->state) {\n  case DHCP_STATE_REBINDING:\n  case DHCP_STATE_RENEWING:\n  case DHCP_STATE_BOUND:\n  case DHCP_STATE_REBOOTING:\n    dhcp->tries = 0;\n    dhcp_reboot(netif);\n    break;\n  case DHCP_STATE_OFF:\n    /* stay off */\n    break;\n  default:\n    /* INIT/REQUESTING/CHECKING/BACKING_OFF restart with new 'rid' because the\n       state changes, SELECTING: continue with current 'rid' as we stay in the\n       same state */\n#if LWIP_DHCP_AUTOIP_COOP\n    if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) {\n      autoip_stop(netif);\n      dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;\n    }\n#endif /* LWIP_DHCP_AUTOIP_COOP */\n    /* ensure we start with short timeouts, even if already discovering */\n    dhcp->tries = 0;\n    dhcp_discover(netif);\n    break;\n  }\n}\n\n#if DHCP_DOES_ARP_CHECK\n/**\n * Match an ARP reply with the offered IP address:\n * check whether the offered IP address is not in use using ARP\n *\n * @param netif the network interface on which the reply was received\n * @param addr The IP address we received a reply from\n */\nvoid\ndhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr)\n{\n  struct dhcp *dhcp;\n\n  LWIP_ERROR(\"netif != NULL\", (netif != NULL), return;);\n  dhcp = netif_dhcp_data(netif);\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_arp_reply()\\n\"));\n  /* is a DHCP client doing an ARP check? */\n  if ((dhcp != NULL) && (dhcp->state == DHCP_STATE_CHECKING)) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_arp_reply(): CHECKING, arp reply for 0x%08\"X32_F\"\\n\",\n      ip4_addr_get_u32(addr)));\n    /* did a host respond with the address we\n       were offered by the DHCP server? */\n    if (ip4_addr_cmp(addr, &dhcp->offered_ip_addr)) {\n      /* we will not accept the offered address */\n      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE | LWIP_DBG_LEVEL_WARNING,\n        (\"dhcp_arp_reply(): arp reply matched with offered address, declining\\n\"));\n      dhcp_decline(netif);\n    }\n  }\n}\n\n/**\n * Decline an offered lease.\n *\n * Tell the DHCP server we do not accept the offered address.\n * One reason to decline the lease is when we find out the address\n * is already in use by another host (through ARP).\n *\n * @param netif the netif under DHCP control\n */\nstatic err_t\ndhcp_decline(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n  err_t result = ERR_OK;\n  u16_t msecs;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_decline()\\n\"));\n  dhcp_set_state(dhcp, DHCP_STATE_BACKING_OFF);\n  /* create and initialize the DHCP message header */\n  result = dhcp_create_msg(netif, dhcp, DHCP_DECLINE);\n  if (result == ERR_OK) {\n    dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);\n    dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));\n\n    dhcp_option_trailer(dhcp);\n    /* resize pbuf to reflect true size of options */\n    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);\n\n    /* per section 4.4.4, broadcast DECLINE messages */\n    udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP4_ADDR_ANY);\n    dhcp_delete_msg(dhcp);\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_decline: BACKING OFF\\n\"));\n  } else {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,\n      (\"dhcp_decline: could not allocate DHCP request\\n\"));\n  }\n  if (dhcp->tries < 255) {\n    dhcp->tries++;\n  }\n  msecs = 10*1000;\n  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_decline(): set request timeout %\"U16_F\" msecs\\n\", msecs));\n  return result;\n}\n#endif /* DHCP_DOES_ARP_CHECK */\n\n\n/**\n * Start the DHCP process, discover a DHCP server.\n *\n * @param netif the netif under DHCP control\n */\nstatic err_t\ndhcp_discover(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n  err_t result = ERR_OK;\n  u16_t msecs;\n  u8_t i;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_discover()\\n\"));\n  ip4_addr_set_any(&dhcp->offered_ip_addr);\n  dhcp_set_state(dhcp, DHCP_STATE_SELECTING);\n  /* create and initialize the DHCP message header */\n  result = dhcp_create_msg(netif, dhcp, DHCP_DISCOVER);\n  if (result == ERR_OK) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_discover: making request\\n\"));\n\n    dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);\n    dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));\n\n    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));\n    for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {\n      dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);\n    }\n    dhcp_option_trailer(dhcp);\n\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_discover: realloc()ing\\n\"));\n    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);\n\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_discover: sendto(DISCOVER, IP_ADDR_BROADCAST, DHCP_SERVER_PORT)\\n\"));\n    udp_sendto_if_src(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif, IP4_ADDR_ANY);\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_discover: deleting()ing\\n\"));\n    dhcp_delete_msg(dhcp);\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_discover: SELECTING\\n\"));\n  } else {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, (\"dhcp_discover: could not allocate DHCP request\\n\"));\n  }\n  if (dhcp->tries < 255) {\n    dhcp->tries++;\n  }\n#if LWIP_DHCP_AUTOIP_COOP\n  if (dhcp->tries >= LWIP_DHCP_AUTOIP_COOP_TRIES && dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_OFF) {\n    dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_ON;\n    autoip_start(netif);\n  }\n#endif /* LWIP_DHCP_AUTOIP_COOP */\n  msecs = (dhcp->tries < 6 ? 1 << dhcp->tries : 60) * 1000;\n  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_discover(): set request timeout %\"U16_F\" msecs\\n\", msecs));\n  return result;\n}\n\n\n/**\n * Bind the interface to the offered IP address.\n *\n * @param netif network interface to bind to the offered address\n */\nstatic void\ndhcp_bind(struct netif *netif)\n{\n  u32_t timeout;\n  struct dhcp *dhcp;\n  ip4_addr_t sn_mask, gw_addr;\n  LWIP_ERROR(\"dhcp_bind: netif != NULL\", (netif != NULL), return;);\n  dhcp = netif_dhcp_data(netif);\n  LWIP_ERROR(\"dhcp_bind: dhcp != NULL\", (dhcp != NULL), return;);\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_bind(netif=%p) %c%c%\"U16_F\"\\n\", (void*)netif, netif->name[0], netif->name[1], (u16_t)netif->num));\n\n  /* reset time used of lease */\n  dhcp->lease_used = 0;\n\n  if (dhcp->offered_t0_lease != 0xffffffffUL) {\n     /* set renewal period timer */\n     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_bind(): t0 renewal timer %\"U32_F\" secs\\n\", dhcp->offered_t0_lease));\n     timeout = (dhcp->offered_t0_lease + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;\n     if (timeout > 0xffff) {\n       timeout = 0xffff;\n     }\n     dhcp->t0_timeout = (u16_t)timeout;\n     if (dhcp->t0_timeout == 0) {\n       dhcp->t0_timeout = 1;\n     }\n     LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_bind(): set request timeout %\"U32_F\" msecs\\n\", dhcp->offered_t0_lease*1000));\n  }\n\n  /* temporary DHCP lease? */\n  if (dhcp->offered_t1_renew != 0xffffffffUL) {\n    /* set renewal period timer */\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_bind(): t1 renewal timer %\"U32_F\" secs\\n\", dhcp->offered_t1_renew));\n    timeout = (dhcp->offered_t1_renew + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;\n    if (timeout > 0xffff) {\n      timeout = 0xffff;\n    }\n    dhcp->t1_timeout = (u16_t)timeout;\n    if (dhcp->t1_timeout == 0) {\n      dhcp->t1_timeout = 1;\n    }\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_bind(): set request timeout %\"U32_F\" msecs\\n\", dhcp->offered_t1_renew*1000));\n    dhcp->t1_renew_time = dhcp->t1_timeout;\n  }\n  /* set renewal period timer */\n  if (dhcp->offered_t2_rebind != 0xffffffffUL) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_bind(): t2 rebind timer %\"U32_F\" secs\\n\", dhcp->offered_t2_rebind));\n    timeout = (dhcp->offered_t2_rebind + DHCP_COARSE_TIMER_SECS / 2) / DHCP_COARSE_TIMER_SECS;\n    if (timeout > 0xffff) {\n      timeout = 0xffff;\n    }\n    dhcp->t2_timeout = (u16_t)timeout;\n    if (dhcp->t2_timeout == 0) {\n      dhcp->t2_timeout = 1;\n    }\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_bind(): set request timeout %\"U32_F\" msecs\\n\", dhcp->offered_t2_rebind*1000));\n    dhcp->t2_rebind_time = dhcp->t2_timeout;\n  }\n\n  /* If we have sub 1 minute lease, t2 and t1 will kick in at the same time. */\n  if ((dhcp->t1_timeout >= dhcp->t2_timeout) && (dhcp->t2_timeout > 0)) {\n    dhcp->t1_timeout = 0;\n  }\n\n  if (dhcp->subnet_mask_given) {\n    /* copy offered network mask */\n    ip4_addr_copy(sn_mask, dhcp->offered_sn_mask);\n  } else {\n    /* subnet mask not given, choose a safe subnet mask given the network class */\n    u8_t first_octet = ip4_addr1(&dhcp->offered_ip_addr);\n    if (first_octet <= 127) {\n      ip4_addr_set_u32(&sn_mask, PP_HTONL(0xff000000UL));\n    } else if (first_octet >= 192) {\n      ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffffff00UL));\n    } else {\n      ip4_addr_set_u32(&sn_mask, PP_HTONL(0xffff0000UL));\n    }\n  }\n\n  ip4_addr_copy(gw_addr, dhcp->offered_gw_addr);\n  /* gateway address not given? */\n  if (ip4_addr_isany_val(gw_addr)) {\n    /* copy network address */\n    ip4_addr_get_network(&gw_addr, &dhcp->offered_ip_addr, &sn_mask);\n    /* use first host address on network as gateway */\n    ip4_addr_set_u32(&gw_addr, ip4_addr_get_u32(&gw_addr) | PP_HTONL(0x00000001UL));\n  }\n\n#if LWIP_DHCP_AUTOIP_COOP\n  if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) {\n    autoip_stop(netif);\n    dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;\n  }\n#endif /* LWIP_DHCP_AUTOIP_COOP */\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_STATE, (\"dhcp_bind(): IP: 0x%08\"X32_F\" SN: 0x%08\"X32_F\" GW: 0x%08\"X32_F\"\\n\",\n    ip4_addr_get_u32(&dhcp->offered_ip_addr), ip4_addr_get_u32(&sn_mask), ip4_addr_get_u32(&gw_addr)));\n  /* netif is now bound to DHCP leased address - set this before assigning the address\n     to ensure the callback can use dhcp_supplied_address() */\n  dhcp_set_state(dhcp, DHCP_STATE_BOUND);\n\n  netif_set_addr(netif, &dhcp->offered_ip_addr, &sn_mask, &gw_addr);\n  /* interface is used by routing now that an address is set */\n}\n\n/**\n * @ingroup dhcp4\n * Renew an existing DHCP lease at the involved DHCP server.\n *\n * @param netif network interface which must renew its lease\n */\nerr_t\ndhcp_renew(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n  err_t result;\n  u16_t msecs;\n  u8_t i;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_renew()\\n\"));\n  dhcp_set_state(dhcp, DHCP_STATE_RENEWING);\n\n  /* create and initialize the DHCP message header */\n  result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);\n  if (result == ERR_OK) {\n    dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);\n    dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));\n\n    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));\n    for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {\n      dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);\n    }\n\n#if LWIP_NETIF_HOSTNAME\n    dhcp_option_hostname(dhcp, netif);\n#endif /* LWIP_NETIF_HOSTNAME */\n\n    /* append DHCP message trailer */\n    dhcp_option_trailer(dhcp);\n\n    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);\n\n    udp_sendto_if(dhcp_pcb, dhcp->p_out, &dhcp->server_ip_addr, DHCP_SERVER_PORT, netif);\n    dhcp_delete_msg(dhcp);\n\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_renew: RENEWING\\n\"));\n  } else {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, (\"dhcp_renew: could not allocate DHCP request\\n\"));\n  }\n  if (dhcp->tries < 255) {\n    dhcp->tries++;\n  }\n  /* back-off on retries, but to a maximum of 20 seconds */\n  msecs = dhcp->tries < 10 ? dhcp->tries * 2000 : 20 * 1000;\n  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_renew(): set request timeout %\"U16_F\" msecs\\n\", msecs));\n  return result;\n}\n\n/**\n * Rebind with a DHCP server for an existing DHCP lease.\n *\n * @param netif network interface which must rebind with a DHCP server\n */\nstatic err_t\ndhcp_rebind(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n  err_t result;\n  u16_t msecs;\n  u8_t i;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_rebind()\\n\"));\n  dhcp_set_state(dhcp, DHCP_STATE_REBINDING);\n\n  /* create and initialize the DHCP message header */\n  result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);\n  if (result == ERR_OK) {\n    dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);\n    dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN(netif));\n\n    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));\n    for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {\n      dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);\n    }\n\n#if LWIP_NETIF_HOSTNAME\n    dhcp_option_hostname(dhcp, netif);\n#endif /* LWIP_NETIF_HOSTNAME */\n\n    dhcp_option_trailer(dhcp);\n\n    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);\n\n    /* broadcast to server */\n    udp_sendto_if(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);\n    dhcp_delete_msg(dhcp);\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_rebind: REBINDING\\n\"));\n  } else {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, (\"dhcp_rebind: could not allocate DHCP request\\n\"));\n  }\n  if (dhcp->tries < 255) {\n    dhcp->tries++;\n  }\n  msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;\n  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_rebind(): set request timeout %\"U16_F\" msecs\\n\", msecs));\n  return result;\n}\n\n/**\n * Enter REBOOTING state to verify an existing lease\n *\n * @param netif network interface which must reboot\n */\nstatic err_t\ndhcp_reboot(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n  err_t result;\n  u16_t msecs;\n  u8_t i;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_reboot()\\n\"));\n  dhcp_set_state(dhcp, DHCP_STATE_REBOOTING);\n\n  /* create and initialize the DHCP message header */\n  result = dhcp_create_msg(netif, dhcp, DHCP_REQUEST);\n  if (result == ERR_OK) {\n    dhcp_option(dhcp, DHCP_OPTION_MAX_MSG_SIZE, DHCP_OPTION_MAX_MSG_SIZE_LEN);\n    dhcp_option_short(dhcp, DHCP_MAX_MSG_LEN_MIN_REQUIRED);\n\n    dhcp_option(dhcp, DHCP_OPTION_REQUESTED_IP, 4);\n    dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(&dhcp->offered_ip_addr)));\n\n    dhcp_option(dhcp, DHCP_OPTION_PARAMETER_REQUEST_LIST, LWIP_ARRAYSIZE(dhcp_discover_request_options));\n    for (i = 0; i < LWIP_ARRAYSIZE(dhcp_discover_request_options); i++) {\n      dhcp_option_byte(dhcp, dhcp_discover_request_options[i]);\n    }\n\n    dhcp_option_trailer(dhcp);\n\n    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);\n\n    /* broadcast to server */\n    udp_sendto_if(dhcp_pcb, dhcp->p_out, IP_ADDR_BROADCAST, DHCP_SERVER_PORT, netif);\n    dhcp_delete_msg(dhcp);\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_reboot: REBOOTING\\n\"));\n  } else {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, (\"dhcp_reboot: could not allocate DHCP request\\n\"));\n  }\n  if (dhcp->tries < 255) {\n    dhcp->tries++;\n  }\n  msecs = dhcp->tries < 10 ? dhcp->tries * 1000 : 10 * 1000;\n  dhcp->request_timeout = (msecs + DHCP_FINE_TIMER_MSECS - 1) / DHCP_FINE_TIMER_MSECS;\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_reboot(): set request timeout %\"U16_F\" msecs\\n\", msecs));\n  return result;\n}\n\n\n/**\n * @ingroup dhcp4\n * Release a DHCP lease (usually called before @ref dhcp_stop).\n *\n * @param netif network interface which must release its lease\n */\nerr_t\ndhcp_release(struct netif *netif)\n{\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n  err_t result;\n  ip_addr_t server_ip_addr;\n  u8_t is_dhcp_supplied_address;\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_release()\\n\"));\n  if (dhcp == NULL) {\n    return ERR_ARG;\n  }\n  ip_addr_copy(server_ip_addr, dhcp->server_ip_addr);\n\n  is_dhcp_supplied_address = dhcp_supplied_address(netif);\n\n  /* idle DHCP client */\n  dhcp_set_state(dhcp, DHCP_STATE_OFF);\n  /* clean old DHCP offer */\n  ip_addr_set_zero_ip4(&dhcp->server_ip_addr);\n  ip4_addr_set_zero(&dhcp->offered_ip_addr);\n  ip4_addr_set_zero(&dhcp->offered_sn_mask);\n  ip4_addr_set_zero(&dhcp->offered_gw_addr);\n#if LWIP_DHCP_BOOTP_FILE\n  ip4_addr_set_zero(&dhcp->offered_si_addr);\n#endif /* LWIP_DHCP_BOOTP_FILE */\n  dhcp->offered_t0_lease = dhcp->offered_t1_renew = dhcp->offered_t2_rebind = 0;\n  dhcp->t1_renew_time = dhcp->t2_rebind_time = dhcp->lease_used = dhcp->t0_timeout = 0;\n\n  if (!is_dhcp_supplied_address) {\n    /* don't issue release message when address is not dhcp-assigned */\n    return ERR_OK;\n  }\n\n  /* create and initialize the DHCP message header */\n  result = dhcp_create_msg(netif, dhcp, DHCP_RELEASE);\n  if (result == ERR_OK) {\n    dhcp_option(dhcp, DHCP_OPTION_SERVER_ID, 4);\n    dhcp_option_long(dhcp, lwip_ntohl(ip4_addr_get_u32(ip_2_ip4(&server_ip_addr))));\n\n    dhcp_option_trailer(dhcp);\n\n    pbuf_realloc(dhcp->p_out, sizeof(struct dhcp_msg) - DHCP_OPTIONS_LEN + dhcp->options_out_len);\n\n    udp_sendto_if(dhcp_pcb, dhcp->p_out, &server_ip_addr, DHCP_SERVER_PORT, netif);\n    dhcp_delete_msg(dhcp);\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"dhcp_release: RELEASED, DHCP_STATE_OFF\\n\"));\n  } else {\n    /* sending release failed, but that's not a problem since the correct behaviour of dhcp does not rely on release */\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, (\"dhcp_release: could not allocate DHCP request\\n\"));\n  }\n  /* remove IP address from interface (prevents routing from selecting this interface) */\n  netif_set_addr(netif, IP4_ADDR_ANY4, IP4_ADDR_ANY4, IP4_ADDR_ANY4);\n\n  return result;\n}\n\n/**\n * @ingroup dhcp4\n * Remove the DHCP client from the interface.\n *\n * @param netif The network interface to stop DHCP on\n */\nvoid\ndhcp_stop(struct netif *netif)\n{\n  struct dhcp *dhcp;\n  LWIP_ERROR(\"dhcp_stop: netif != NULL\", (netif != NULL), return;);\n  dhcp = netif_dhcp_data(netif);\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_stop()\\n\"));\n  /* netif is DHCP configured? */\n  if (dhcp != NULL) {\n#if LWIP_DHCP_AUTOIP_COOP\n    if (dhcp->autoip_coop_state == DHCP_AUTOIP_COOP_STATE_ON) {\n      autoip_stop(netif);\n      dhcp->autoip_coop_state = DHCP_AUTOIP_COOP_STATE_OFF;\n    }\n#endif /* LWIP_DHCP_AUTOIP_COOP */\n\n    LWIP_ASSERT(\"reply wasn't freed\", dhcp->msg_in == NULL);\n    dhcp_set_state(dhcp, DHCP_STATE_OFF);\n\n    if (dhcp->pcb_allocated != 0) {\n      dhcp_dec_pcb_refcount(); /* free DHCP PCB if not needed any more */\n      dhcp->pcb_allocated = 0;\n    }\n  }\n}\n\n/*\n * Set the DHCP state of a DHCP client.\n *\n * If the state changed, reset the number of tries.\n */\nstatic void\ndhcp_set_state(struct dhcp *dhcp, u8_t new_state)\n{\n  if (new_state != dhcp->state) {\n    dhcp->state = new_state;\n    dhcp->tries = 0;\n    dhcp->request_timeout = 0;\n  }\n}\n\n/*\n * Concatenate an option type and length field to the outgoing\n * DHCP message.\n *\n */\nstatic void\ndhcp_option(struct dhcp *dhcp, u8_t option_type, u8_t option_len)\n{\n  LWIP_ASSERT(\"dhcp_option: dhcp->options_out_len + 2 + option_len <= DHCP_OPTIONS_LEN\", dhcp->options_out_len + 2U + option_len <= DHCP_OPTIONS_LEN);\n  dhcp->msg_out->options[dhcp->options_out_len++] = option_type;\n  dhcp->msg_out->options[dhcp->options_out_len++] = option_len;\n}\n/*\n * Concatenate a single byte to the outgoing DHCP message.\n *\n */\nstatic void\ndhcp_option_byte(struct dhcp *dhcp, u8_t value)\n{\n  LWIP_ASSERT(\"dhcp_option_byte: dhcp->options_out_len < DHCP_OPTIONS_LEN\", dhcp->options_out_len < DHCP_OPTIONS_LEN);\n  dhcp->msg_out->options[dhcp->options_out_len++] = value;\n}\n\nstatic void\ndhcp_option_short(struct dhcp *dhcp, u16_t value)\n{\n  LWIP_ASSERT(\"dhcp_option_short: dhcp->options_out_len + 2 <= DHCP_OPTIONS_LEN\", dhcp->options_out_len + 2U <= DHCP_OPTIONS_LEN);\n  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff00U) >> 8);\n  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t) (value & 0x00ffU);\n}\n\nstatic void\ndhcp_option_long(struct dhcp *dhcp, u32_t value)\n{\n  LWIP_ASSERT(\"dhcp_option_long: dhcp->options_out_len + 4 <= DHCP_OPTIONS_LEN\", dhcp->options_out_len + 4U <= DHCP_OPTIONS_LEN);\n  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0xff000000UL) >> 24);\n  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x00ff0000UL) >> 16);\n  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x0000ff00UL) >> 8);\n  dhcp->msg_out->options[dhcp->options_out_len++] = (u8_t)((value & 0x000000ffUL));\n}\n\n#if LWIP_NETIF_HOSTNAME\nstatic void\ndhcp_option_hostname(struct dhcp *dhcp, struct netif *netif)\n{\n  if (netif->hostname != NULL) {\n    size_t namelen = strlen(netif->hostname);\n    if (namelen > 0) {\n      size_t len;\n      const char *p = netif->hostname;\n      /* Shrink len to available bytes (need 2 bytes for OPTION_HOSTNAME\n         and 1 byte for trailer) */\n      size_t available = DHCP_OPTIONS_LEN - dhcp->options_out_len - 3;\n      LWIP_ASSERT(\"DHCP: hostname is too long!\", namelen <= available);\n      len = LWIP_MIN(namelen, available);\n      LWIP_ASSERT(\"DHCP: hostname is too long!\", len <= 0xFF);\n      dhcp_option(dhcp, DHCP_OPTION_HOSTNAME, (u8_t)len);\n      while (len--) {\n        dhcp_option_byte(dhcp, *p++);\n      }\n    }\n  }\n}\n#endif /* LWIP_NETIF_HOSTNAME */\n\n/**\n * Extract the DHCP message and the DHCP options.\n *\n * Extract the DHCP message and the DHCP options, each into a contiguous\n * piece of memory. As a DHCP message is variable sized by its options,\n * and also allows overriding some fields for options, the easy approach\n * is to first unfold the options into a contiguous piece of memory, and\n * use that further on.\n *\n */\nstatic err_t\ndhcp_parse_reply(struct dhcp *dhcp, struct pbuf *p)\n{\n  u8_t *options;\n  u16_t offset;\n  u16_t offset_max;\n  u16_t options_idx;\n  u16_t options_idx_max;\n  struct pbuf *q;\n  int parse_file_as_options = 0;\n  int parse_sname_as_options = 0;\n\n  /* clear received options */\n  dhcp_clear_all_options(dhcp);\n  /* check that beginning of dhcp_msg (up to and including chaddr) is in first pbuf */\n  if (p->len < DHCP_SNAME_OFS) {\n    return ERR_BUF;\n  }\n  dhcp->msg_in = (struct dhcp_msg *)p->payload;\n#if LWIP_DHCP_BOOTP_FILE\n  /* clear boot file name */\n  dhcp->boot_file_name[0] = 0;\n#endif /* LWIP_DHCP_BOOTP_FILE */\n\n  /* parse options */\n\n  /* start with options field */\n  options_idx = DHCP_OPTIONS_OFS;\n  /* parse options to the end of the received packet */\n  options_idx_max = p->tot_len;\nagain:\n  q = p;\n  while ((q != NULL) && (options_idx >= q->len)) {\n    options_idx -= q->len;\n    options_idx_max -= q->len;\n    q = q->next;\n  }\n  if (q == NULL) {\n    return ERR_BUF;\n  }\n  offset = options_idx;\n  offset_max = options_idx_max;\n  options = (u8_t*)q->payload;\n  /* at least 1 byte to read and no end marker, then at least 3 bytes to read? */\n  while ((q != NULL) && (offset < offset_max) && (options[offset] != DHCP_OPTION_END)) {\n    u8_t op = options[offset];\n    u8_t len;\n    u8_t decode_len = 0;\n    int decode_idx = -1;\n    u16_t val_offset = offset + 2;\n    /* len byte might be in the next pbuf */\n    if ((offset + 1) < q->len) {\n      len = options[offset + 1];\n    } else {\n      len = (q->next != NULL ? ((u8_t*)q->next->payload)[0] : 0);\n    }\n    /* LWIP_DEBUGF(DHCP_DEBUG, (\"msg_offset=%\"U16_F\", q->len=%\"U16_F, msg_offset, q->len)); */\n    decode_len = len;\n    switch(op) {\n      /* case(DHCP_OPTION_END): handled above */\n      case(DHCP_OPTION_PAD):\n        /* special option: no len encoded */\n        decode_len = len = 0;\n        /* will be increased below */\n        offset--;\n        break;\n      case(DHCP_OPTION_SUBNET_MASK):\n        LWIP_ERROR(\"len == 4\", len == 4, return ERR_VAL;);\n        decode_idx = DHCP_OPTION_IDX_SUBNET_MASK;\n        break;\n      case(DHCP_OPTION_ROUTER):\n        decode_len = 4; /* only copy the first given router */\n        LWIP_ERROR(\"len >= decode_len\", len >= decode_len, return ERR_VAL;);\n        decode_idx = DHCP_OPTION_IDX_ROUTER;\n        break;\n#if LWIP_DHCP_PROVIDE_DNS_SERVERS\n      case(DHCP_OPTION_DNS_SERVER):\n        /* special case: there might be more than one server */\n        LWIP_ERROR(\"len %% 4 == 0\", len % 4 == 0, return ERR_VAL;);\n        /* limit number of DNS servers */\n        decode_len = LWIP_MIN(len, 4 * DNS_MAX_SERVERS);\n        LWIP_ERROR(\"len >= decode_len\", len >= decode_len, return ERR_VAL;);\n        decode_idx = DHCP_OPTION_IDX_DNS_SERVER;\n        break;\n#endif /* LWIP_DHCP_PROVIDE_DNS_SERVERS */\n      case(DHCP_OPTION_LEASE_TIME):\n        LWIP_ERROR(\"len == 4\", len == 4, return ERR_VAL;);\n        decode_idx = DHCP_OPTION_IDX_LEASE_TIME;\n        break;\n#if LWIP_DHCP_GET_NTP_SRV\n      case(DHCP_OPTION_NTP):\n        /* special case: there might be more than one server */\n        LWIP_ERROR(\"len %% 4 == 0\", len % 4 == 0, return ERR_VAL;);\n        /* limit number of NTP servers */\n        decode_len = LWIP_MIN(len, 4 * LWIP_DHCP_MAX_NTP_SERVERS);\n        LWIP_ERROR(\"len >= decode_len\", len >= decode_len, return ERR_VAL;);\n        decode_idx = DHCP_OPTION_IDX_NTP_SERVER;\n        break;\n#endif /* LWIP_DHCP_GET_NTP_SRV*/\n      case(DHCP_OPTION_OVERLOAD):\n        LWIP_ERROR(\"len == 1\", len == 1, return ERR_VAL;);\n        /* decode overload only in options, not in file/sname: invalid packet */\n        LWIP_ERROR(\"overload in file/sname\", options_idx == DHCP_OPTIONS_OFS, return ERR_VAL;);\n        decode_idx = DHCP_OPTION_IDX_OVERLOAD;\n        break;\n      case(DHCP_OPTION_MESSAGE_TYPE):\n        LWIP_ERROR(\"len == 1\", len == 1, return ERR_VAL;);\n        decode_idx = DHCP_OPTION_IDX_MSG_TYPE;\n        break;\n      case(DHCP_OPTION_SERVER_ID):\n        LWIP_ERROR(\"len == 4\", len == 4, return ERR_VAL;);\n        decode_idx = DHCP_OPTION_IDX_SERVER_ID;\n        break;\n      case(DHCP_OPTION_T1):\n        LWIP_ERROR(\"len == 4\", len == 4, return ERR_VAL;);\n        decode_idx = DHCP_OPTION_IDX_T1;\n        break;\n      case(DHCP_OPTION_T2):\n        LWIP_ERROR(\"len == 4\", len == 4, return ERR_VAL;);\n        decode_idx = DHCP_OPTION_IDX_T2;\n        break;\n      default:\n        decode_len = 0;\n        LWIP_DEBUGF(DHCP_DEBUG, (\"skipping option %\"U16_F\" in options\\n\", (u16_t)op));\n        break;\n    }\n    offset += len + 2;\n    if (decode_len > 0) {\n      u32_t value = 0;\n      u16_t copy_len;\ndecode_next:\n      LWIP_ASSERT(\"check decode_idx\", decode_idx >= 0 && decode_idx < DHCP_OPTION_IDX_MAX);\n      if (!dhcp_option_given(dhcp, decode_idx)) {\n        copy_len = LWIP_MIN(decode_len, 4);\n        if (pbuf_copy_partial(q, &value, copy_len, val_offset) != copy_len) {\n          return ERR_BUF;\n        }\n        if (decode_len > 4) {\n          /* decode more than one u32_t */\n          LWIP_ERROR(\"decode_len %% 4 == 0\", decode_len % 4 == 0, return ERR_VAL;);\n          dhcp_got_option(dhcp, decode_idx);\n          dhcp_set_option_value(dhcp, decode_idx, lwip_htonl(value));\n          decode_len -= 4;\n          val_offset += 4;\n          decode_idx++;\n          goto decode_next;\n        } else if (decode_len == 4) {\n          value = lwip_ntohl(value);\n        } else {\n          LWIP_ERROR(\"invalid decode_len\", decode_len == 1, return ERR_VAL;);\n          value = ((u8_t*)&value)[0];\n        }\n        dhcp_got_option(dhcp, decode_idx);\n        dhcp_set_option_value(dhcp, decode_idx, value);\n      }\n    }\n    if (offset >= q->len) {\n      offset -= q->len;\n      offset_max -= q->len;\n      if ((offset < offset_max) && offset_max) {\n        q = q->next;\n        LWIP_ERROR(\"next pbuf was null\", q != NULL, return ERR_VAL;);\n        options = (u8_t*)q->payload;\n      } else {\n        /* We've run out of bytes, probably no end marker. Don't proceed. */\n        break;\n      }\n    }\n  }\n  /* is this an overloaded message? */\n  if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_OVERLOAD)) {\n    u32_t overload = dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_OVERLOAD);\n    dhcp_clear_option(dhcp, DHCP_OPTION_IDX_OVERLOAD);\n    if (overload == DHCP_OVERLOAD_FILE) {\n      parse_file_as_options = 1;\n      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"overloaded file field\\n\"));\n    } else if (overload == DHCP_OVERLOAD_SNAME) {\n      parse_sname_as_options = 1;\n      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"overloaded sname field\\n\"));\n    } else if (overload == DHCP_OVERLOAD_SNAME_FILE) {\n      parse_sname_as_options = 1;\n      parse_file_as_options = 1;\n      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"overloaded sname and file field\\n\"));\n    } else {\n      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"invalid overload option: %d\\n\", (int)overload));\n    }\n#if LWIP_DHCP_BOOTP_FILE\n    if (!parse_file_as_options) {\n      /* only do this for ACK messages */\n      if (dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE) &&\n        (dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE) == DHCP_ACK))\n      /* copy bootp file name, don't care for sname (server hostname) */\n      if (pbuf_copy_partial(p, dhcp->boot_file_name, DHCP_FILE_LEN-1, DHCP_FILE_OFS) != (DHCP_FILE_LEN-1)) {\n        return ERR_BUF;\n      }\n      /* make sure the string is really NULL-terminated */\n      dhcp->boot_file_name[DHCP_FILE_LEN-1] = 0;\n    }\n#endif /* LWIP_DHCP_BOOTP_FILE */\n  }\n  if (parse_file_as_options) {\n    /* if both are overloaded, parse file first and then sname (RFC 2131 ch. 4.1) */\n    parse_file_as_options = 0;\n    options_idx = DHCP_FILE_OFS;\n    options_idx_max = DHCP_FILE_OFS + DHCP_FILE_LEN;\n    goto again;\n  } else if (parse_sname_as_options) {\n    parse_sname_as_options = 0;\n    options_idx = DHCP_SNAME_OFS;\n    options_idx_max = DHCP_SNAME_OFS + DHCP_SNAME_LEN;\n    goto again;\n  }\n  return ERR_OK;\n}\n\n/**\n * If an incoming DHCP message is in response to us, then trigger the state machine\n */\nstatic void\ndhcp_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)\n{\n  struct netif *netif = ip_current_input_netif();\n  struct dhcp *dhcp = netif_dhcp_data(netif);\n  struct dhcp_msg *reply_msg = (struct dhcp_msg *)p->payload;\n  u8_t msg_type;\n  u8_t i;\n\n  LWIP_UNUSED_ARG(arg);\n\n  /* Caught DHCP message from netif that does not have DHCP enabled? -> not interested */\n  if ((dhcp == NULL) || (dhcp->pcb_allocated == 0)) {\n    goto free_pbuf_and_return;\n  }\n\n  LWIP_ASSERT(\"invalid server address type\", IP_IS_V4(addr));\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"dhcp_recv(pbuf = %p) from DHCP server %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\" port %\"U16_F\"\\n\", (void*)p,\n    ip4_addr1_16(ip_2_ip4(addr)), ip4_addr2_16(ip_2_ip4(addr)), ip4_addr3_16(ip_2_ip4(addr)), ip4_addr4_16(ip_2_ip4(addr)), port));\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"pbuf->len = %\"U16_F\"\\n\", p->len));\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"pbuf->tot_len = %\"U16_F\"\\n\", p->tot_len));\n  /* prevent warnings about unused arguments */\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_UNUSED_ARG(addr);\n  LWIP_UNUSED_ARG(port);\n\n  LWIP_ASSERT(\"reply wasn't freed\", dhcp->msg_in == NULL);\n\n  if (p->len < DHCP_MIN_REPLY_LEN) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, (\"DHCP reply message or pbuf too short\\n\"));\n    goto free_pbuf_and_return;\n  }\n\n  if (reply_msg->op != DHCP_BOOTREPLY) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, (\"not a DHCP reply message, but type %\"U16_F\"\\n\", (u16_t)reply_msg->op));\n    goto free_pbuf_and_return;\n  }\n  /* iterate through hardware address and match against DHCP message */\n  for (i = 0; i < netif->hwaddr_len && i < NETIF_MAX_HWADDR_LEN && i < DHCP_CHADDR_LEN; i++) {\n    if (netif->hwaddr[i] != reply_msg->chaddr[i]) {\n      LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,\n        (\"netif->hwaddr[%\"U16_F\"]==%02\"X16_F\" != reply_msg->chaddr[%\"U16_F\"]==%02\"X16_F\"\\n\",\n        (u16_t)i, (u16_t)netif->hwaddr[i], (u16_t)i, (u16_t)reply_msg->chaddr[i]));\n      goto free_pbuf_and_return;\n    }\n  }\n  /* match transaction ID against what we expected */\n  if (lwip_ntohl(reply_msg->xid) != dhcp->xid) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,\n      (\"transaction id mismatch reply_msg->xid(%\"X32_F\")!=dhcp->xid(%\"X32_F\")\\n\",lwip_ntohl(reply_msg->xid),dhcp->xid));\n    goto free_pbuf_and_return;\n  }\n  /* option fields could be unfold? */\n  if (dhcp_parse_reply(dhcp, p) != ERR_OK) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,\n      (\"problem unfolding DHCP message - too short on memory?\\n\"));\n    goto free_pbuf_and_return;\n  }\n\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"searching DHCP_OPTION_MESSAGE_TYPE\\n\"));\n  /* obtain pointer to DHCP message type */\n  if (!dhcp_option_given(dhcp, DHCP_OPTION_IDX_MSG_TYPE)) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, (\"DHCP_OPTION_MESSAGE_TYPE option not found\\n\"));\n    goto free_pbuf_and_return;\n  }\n\n  /* read DHCP message type */\n  msg_type = (u8_t)dhcp_get_option_value(dhcp, DHCP_OPTION_IDX_MSG_TYPE);\n  /* message type is DHCP ACK? */\n  if (msg_type == DHCP_ACK) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"DHCP_ACK received\\n\"));\n    /* in requesting state? */\n    if (dhcp->state == DHCP_STATE_REQUESTING) {\n      dhcp_handle_ack(netif);\n#if DHCP_DOES_ARP_CHECK\n      if ((netif->flags & NETIF_FLAG_ETHARP) != 0) {\n        /* check if the acknowledged lease address is already in use */\n        dhcp_check(netif);\n      } else {\n        /* bind interface to the acknowledged lease address */\n        dhcp_bind(netif);\n      }\n#else\n      /* bind interface to the acknowledged lease address */\n      dhcp_bind(netif);\n#endif\n    }\n    /* already bound to the given lease address? */\n    else if ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REBINDING) ||\n             (dhcp->state == DHCP_STATE_RENEWING)) {\n      dhcp_handle_ack(netif);\n      dhcp_bind(netif);\n    }\n  }\n  /* received a DHCP_NAK in appropriate state? */\n  else if ((msg_type == DHCP_NAK) &&\n    ((dhcp->state == DHCP_STATE_REBOOTING) || (dhcp->state == DHCP_STATE_REQUESTING) ||\n     (dhcp->state == DHCP_STATE_REBINDING) || (dhcp->state == DHCP_STATE_RENEWING  ))) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"DHCP_NAK received\\n\"));\n    dhcp_handle_nak(netif);\n  }\n  /* received a DHCP_OFFER in DHCP_STATE_SELECTING state? */\n  else if ((msg_type == DHCP_OFFER) && (dhcp->state == DHCP_STATE_SELECTING)) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, (\"DHCP_OFFER received in DHCP_STATE_SELECTING state\\n\"));\n    dhcp->request_timeout = 0;\n    /* remember offered lease */\n    dhcp_handle_offer(netif);\n  }\n\nfree_pbuf_and_return:\n  if (dhcp != NULL) {\n    dhcp->msg_in = NULL;\n  }\n  pbuf_free(p);\n}\n\n/**\n * Create a DHCP request, fill in common headers\n *\n * @param netif the netif under DHCP control\n * @param dhcp dhcp control struct\n * @param message_type message type of the request\n */\nstatic err_t\ndhcp_create_msg(struct netif *netif, struct dhcp *dhcp, u8_t message_type)\n{\n  u16_t i;\n#ifndef DHCP_GLOBAL_XID\n  /** default global transaction identifier starting value (easy to match\n   *  with a packet analyser). We simply increment for each new request.\n   *  Predefine DHCP_GLOBAL_XID to a better value or a function call to generate one\n   *  at runtime, any supporting function prototypes can be defined in DHCP_GLOBAL_XID_HEADER */\n#if DHCP_CREATE_RAND_XID && defined(LWIP_RAND)\n  static u32_t xid;\n#else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */\n  static u32_t xid = 0xABCD0000;\n#endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */\n#else\n  if (!xid_initialised) {\n    xid = DHCP_GLOBAL_XID;\n    xid_initialised = !xid_initialised;\n  }\n#endif\n  LWIP_ERROR(\"dhcp_create_msg: netif != NULL\", (netif != NULL), return ERR_ARG;);\n  LWIP_ERROR(\"dhcp_create_msg: dhcp != NULL\", (dhcp != NULL), return ERR_VAL;);\n  LWIP_ASSERT(\"dhcp_create_msg: dhcp->p_out == NULL\", dhcp->p_out == NULL);\n  LWIP_ASSERT(\"dhcp_create_msg: dhcp->msg_out == NULL\", dhcp->msg_out == NULL);\n  dhcp->p_out = pbuf_alloc(PBUF_TRANSPORT, sizeof(struct dhcp_msg), PBUF_RAM);\n  if (dhcp->p_out == NULL) {\n    LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,\n      (\"dhcp_create_msg(): could not allocate pbuf\\n\"));\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"dhcp_create_msg: check that first pbuf can hold struct dhcp_msg\",\n           (dhcp->p_out->len >= sizeof(struct dhcp_msg)));\n\n  /* DHCP_REQUEST should reuse 'xid' from DHCPOFFER */\n  if ((message_type != DHCP_REQUEST) || (dhcp->state == DHCP_STATE_REBOOTING)) {\n    /* reuse transaction identifier in retransmissions */\n    if (dhcp->tries == 0) {\n#if DHCP_CREATE_RAND_XID && defined(LWIP_RAND)\n      xid = LWIP_RAND();\n#else /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */\n      xid++;\n#endif /* DHCP_CREATE_RAND_XID && defined(LWIP_RAND) */\n    }\n    dhcp->xid = xid;\n  }\n  LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE,\n              (\"transaction id xid(%\"X32_F\")\\n\", xid));\n\n  dhcp->msg_out = (struct dhcp_msg *)dhcp->p_out->payload;\n\n  dhcp->msg_out->op = DHCP_BOOTREQUEST;\n  /* @todo: make link layer independent */\n  dhcp->msg_out->htype = DHCP_HTYPE_ETH;\n  dhcp->msg_out->hlen = netif->hwaddr_len;\n  dhcp->msg_out->hops = 0;\n  dhcp->msg_out->xid = lwip_htonl(dhcp->xid);\n  dhcp->msg_out->secs = 0;\n  /* we don't need the broadcast flag since we can receive unicast traffic\n     before being fully configured! */\n  dhcp->msg_out->flags = 0;\n  ip4_addr_set_zero(&dhcp->msg_out->ciaddr);\n  /* set ciaddr to netif->ip_addr based on message_type and state */\n  if ((message_type == DHCP_INFORM) || (message_type == DHCP_DECLINE) || (message_type == DHCP_RELEASE) ||\n      ((message_type == DHCP_REQUEST) && /* DHCP_STATE_BOUND not used for sending! */\n       ((dhcp->state== DHCP_STATE_RENEWING) || dhcp->state== DHCP_STATE_REBINDING))) {\n    ip4_addr_copy(dhcp->msg_out->ciaddr, *netif_ip4_addr(netif));\n  }\n  ip4_addr_set_zero(&dhcp->msg_out->yiaddr);\n  ip4_addr_set_zero(&dhcp->msg_out->siaddr);\n  ip4_addr_set_zero(&dhcp->msg_out->giaddr);\n  for (i = 0; i < DHCP_CHADDR_LEN; i++) {\n    /* copy netif hardware address, pad with zeroes */\n    dhcp->msg_out->chaddr[i] = (i < netif->hwaddr_len && i < NETIF_MAX_HWADDR_LEN) ? netif->hwaddr[i] : 0/* pad byte*/;\n  }\n  for (i = 0; i < DHCP_SNAME_LEN; i++) {\n    dhcp->msg_out->sname[i] = 0;\n  }\n  for (i = 0; i < DHCP_FILE_LEN; i++) {\n    dhcp->msg_out->file[i] = 0;\n  }\n  dhcp->msg_out->cookie = PP_HTONL(DHCP_MAGIC_COOKIE);\n  dhcp->options_out_len = 0;\n  /* fill options field with an incrementing array (for debugging purposes) */\n  for (i = 0; i < DHCP_OPTIONS_LEN; i++) {\n    dhcp->msg_out->options[i] = (u8_t)i; /* for debugging only, no matter if truncated */\n  }\n  /* Add option MESSAGE_TYPE */\n  dhcp_option(dhcp, DHCP_OPTION_MESSAGE_TYPE, DHCP_OPTION_MESSAGE_TYPE_LEN);\n  dhcp_option_byte(dhcp, message_type);\n  return ERR_OK;\n}\n\n/**\n * Free previously allocated memory used to send a DHCP request.\n *\n * @param dhcp the dhcp struct to free the request from\n */\nstatic void\ndhcp_delete_msg(struct dhcp *dhcp)\n{\n  LWIP_ERROR(\"dhcp_delete_msg: dhcp != NULL\", (dhcp != NULL), return;);\n  LWIP_ASSERT(\"dhcp_delete_msg: dhcp->p_out != NULL\", dhcp->p_out != NULL);\n  LWIP_ASSERT(\"dhcp_delete_msg: dhcp->msg_out != NULL\", dhcp->msg_out != NULL);\n  if (dhcp->p_out != NULL) {\n    pbuf_free(dhcp->p_out);\n  }\n  dhcp->p_out = NULL;\n  dhcp->msg_out = NULL;\n}\n\n/**\n * Add a DHCP message trailer\n *\n * Adds the END option to the DHCP message, and if\n * necessary, up to three padding bytes.\n *\n * @param dhcp DHCP state structure\n */\nstatic void\ndhcp_option_trailer(struct dhcp *dhcp)\n{\n  LWIP_ERROR(\"dhcp_option_trailer: dhcp != NULL\", (dhcp != NULL), return;);\n  LWIP_ASSERT(\"dhcp_option_trailer: dhcp->msg_out != NULL\\n\", dhcp->msg_out != NULL);\n  LWIP_ASSERT(\"dhcp_option_trailer: dhcp->options_out_len < DHCP_OPTIONS_LEN\\n\", dhcp->options_out_len < DHCP_OPTIONS_LEN);\n  dhcp->msg_out->options[dhcp->options_out_len++] = DHCP_OPTION_END;\n  /* packet is too small, or not 4 byte aligned? */\n  while (((dhcp->options_out_len < DHCP_MIN_OPTIONS_LEN) || (dhcp->options_out_len & 3)) &&\n         (dhcp->options_out_len < DHCP_OPTIONS_LEN)) {\n    /* add a fill/padding byte */\n    dhcp->msg_out->options[dhcp->options_out_len++] = 0;\n  }\n}\n\n/** check if DHCP supplied netif->ip_addr\n *\n * @param netif the netif to check\n * @return 1 if DHCP supplied netif->ip_addr (states BOUND or RENEWING),\n *         0 otherwise\n */\nu8_t\ndhcp_supplied_address(const struct netif *netif)\n{\n  if ((netif != NULL) && (netif_dhcp_data(netif) != NULL)) {\n    struct dhcp* dhcp = netif_dhcp_data(netif);\n    return (dhcp->state == DHCP_STATE_BOUND) || (dhcp->state == DHCP_STATE_RENEWING) ||\n           (dhcp->state == DHCP_STATE_REBINDING);\n  }\n  return 0;\n}\n\n#endif /* LWIP_IPV4 && LWIP_DHCP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv4/etharp.c",
    "content": "/**\n * @file\n * Address Resolution Protocol module for IP over Ethernet\n *\n * Functionally, ARP is divided into two parts. The first maps an IP address\n * to a physical address when sending a packet, and the second part answers\n * requests from other machines for our physical address.\n *\n * This implementation complies with RFC 826 (Ethernet ARP). It supports\n * Gratuitious ARP from RFC3220 (IP Mobility Support for IPv4) section 4.6\n * if an interface calls etharp_gratuitous(our_netif) upon address change.\n */\n\n/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>\n * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_ARP || LWIP_ETHERNET\n\n#include \"lwip/etharp.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/snmp.h\"\n#include \"lwip/dhcp.h\"\n#include \"lwip/autoip.h\"\n#include \"netif/ethernet.h\"\n\n#include <string.h>\n\n#ifdef LWIP_HOOK_FILENAME\n#include LWIP_HOOK_FILENAME\n#endif\n\n#if LWIP_IPV4 && LWIP_ARP /* don't build if not configured for use in lwipopts.h */\n\n/** Re-request a used ARP entry 1 minute before it would expire to prevent\n *  breaking a steadily used connection because the ARP entry timed out. */\n#define ARP_AGE_REREQUEST_USED_UNICAST   (ARP_MAXAGE - 30)\n#define ARP_AGE_REREQUEST_USED_BROADCAST (ARP_MAXAGE - 15)\n\n/** the time an ARP entry stays pending after first request,\n *  for ARP_TMR_INTERVAL = 1000, this is\n *  10 seconds.\n *\n *  @internal Keep this number at least 2, otherwise it might\n *  run out instantly if the timeout occurs directly after a request.\n */\n#define ARP_MAXPENDING 5\n\n/** ARP states */\nenum etharp_state {\n  ETHARP_STATE_EMPTY = 0,\n  ETHARP_STATE_PENDING,\n  ETHARP_STATE_STABLE,\n  ETHARP_STATE_STABLE_REREQUESTING_1,\n  ETHARP_STATE_STABLE_REREQUESTING_2\n#if ETHARP_SUPPORT_STATIC_ENTRIES\n  ,ETHARP_STATE_STATIC\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n};\n\nstruct etharp_entry {\n#if ARP_QUEUEING\n  /** Pointer to queue of pending outgoing packets on this ARP entry. */\n  struct etharp_q_entry *q;\n#else /* ARP_QUEUEING */\n  /** Pointer to a single pending outgoing packet on this ARP entry. */\n  struct pbuf *q;\n#endif /* ARP_QUEUEING */\n  ip4_addr_t ipaddr;\n  struct netif *netif;\n  struct eth_addr ethaddr;\n  u16_t ctime;\n  u8_t state;\n};\n\nstatic struct etharp_entry arp_table[ARP_TABLE_SIZE];\n\n#if !LWIP_NETIF_HWADDRHINT\nstatic u8_t etharp_cached_entry;\n#endif /* !LWIP_NETIF_HWADDRHINT */\n\n/** Try hard to create a new entry - we want the IP address to appear in\n    the cache (even if this means removing an active entry or so). */\n#define ETHARP_FLAG_TRY_HARD     1\n#define ETHARP_FLAG_FIND_ONLY    2\n#if ETHARP_SUPPORT_STATIC_ENTRIES\n#define ETHARP_FLAG_STATIC_ENTRY 4\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n\n#if LWIP_NETIF_HWADDRHINT\n#define ETHARP_SET_HINT(netif, hint)  if (((netif) != NULL) && ((netif)->addr_hint != NULL))  \\\n                                      *((netif)->addr_hint) = (hint);\n#else /* LWIP_NETIF_HWADDRHINT */\n#define ETHARP_SET_HINT(netif, hint)  (etharp_cached_entry = (hint))\n#endif /* LWIP_NETIF_HWADDRHINT */\n\n\n/* Some checks, instead of etharp_init(): */\n#if (LWIP_ARP && (ARP_TABLE_SIZE > 0x7f))\n  #error \"ARP_TABLE_SIZE must fit in an s8_t, you have to reduce it in your lwipopts.h\"\n#endif\n\n\nstatic err_t etharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr* hw_dst_addr);\nstatic err_t etharp_raw(struct netif *netif,\n                        const struct eth_addr *ethsrc_addr, const struct eth_addr *ethdst_addr,\n                        const struct eth_addr *hwsrc_addr, const ip4_addr_t *ipsrc_addr,\n                        const struct eth_addr *hwdst_addr, const ip4_addr_t *ipdst_addr,\n                        const u16_t opcode);\n\n#if ARP_QUEUEING\n/**\n * Free a complete queue of etharp entries\n *\n * @param q a qeueue of etharp_q_entry's to free\n */\nstatic void\nfree_etharp_q(struct etharp_q_entry *q)\n{\n  struct etharp_q_entry *r;\n  LWIP_ASSERT(\"q != NULL\", q != NULL);\n  LWIP_ASSERT(\"q->p != NULL\", q->p != NULL);\n  while (q) {\n    r = q;\n    q = q->next;\n    LWIP_ASSERT(\"r->p != NULL\", (r->p != NULL));\n    pbuf_free(r->p);\n    memp_free(MEMP_ARP_QUEUE, r);\n  }\n}\n#else /* ARP_QUEUEING */\n\n/** Compatibility define: free the queued pbuf */\n#define free_etharp_q(q) pbuf_free(q)\n\n#endif /* ARP_QUEUEING */\n\n/** Clean up ARP table entries */\nstatic void\netharp_free_entry(int i)\n{\n  /* remove from SNMP ARP index tree */\n  mib2_remove_arp_entry(arp_table[i].netif, &arp_table[i].ipaddr);\n  /* and empty packet queue */\n  if (arp_table[i].q != NULL) {\n    /* remove all queued packets */\n    LWIP_DEBUGF(ETHARP_DEBUG, (\"etharp_free_entry: freeing entry %\"U16_F\", packet queue %p.\\n\", (u16_t)i, (void *)(arp_table[i].q)));\n    free_etharp_q(arp_table[i].q);\n    arp_table[i].q = NULL;\n  }\n  /* recycle entry for re-use */\n  arp_table[i].state = ETHARP_STATE_EMPTY;\n#ifdef LWIP_DEBUG\n  /* for debugging, clean out the complete entry */\n  arp_table[i].ctime = 0;\n  arp_table[i].netif = NULL;\n  ip4_addr_set_zero(&arp_table[i].ipaddr);\n  arp_table[i].ethaddr = ethzero;\n#endif /* LWIP_DEBUG */\n}\n\n/**\n * Clears expired entries in the ARP table.\n *\n * This function should be called every ARP_TMR_INTERVAL milliseconds (1 second),\n * in order to expire entries in the ARP table.\n */\nvoid\netharp_tmr(void)\n{\n  u8_t i;\n\n  LWIP_DEBUGF(ETHARP_DEBUG, (\"etharp_timer\\n\"));\n  /* remove expired entries from the ARP table */\n  for (i = 0; i < ARP_TABLE_SIZE; ++i) {\n    u8_t state = arp_table[i].state;\n    if (state != ETHARP_STATE_EMPTY\n#if ETHARP_SUPPORT_STATIC_ENTRIES\n      && (state != ETHARP_STATE_STATIC)\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n      ) {\n      arp_table[i].ctime++;\n      if ((arp_table[i].ctime >= ARP_MAXAGE) ||\n          ((arp_table[i].state == ETHARP_STATE_PENDING)  &&\n           (arp_table[i].ctime >= ARP_MAXPENDING))) {\n        /* pending or stable entry has become old! */\n        LWIP_DEBUGF(ETHARP_DEBUG, (\"etharp_timer: expired %s entry %\"U16_F\".\\n\",\n             arp_table[i].state >= ETHARP_STATE_STABLE ? \"stable\" : \"pending\", (u16_t)i));\n        /* clean up entries that have just been expired */\n        etharp_free_entry(i);\n      } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_1) {\n        /* Don't send more than one request every 2 seconds. */\n        arp_table[i].state = ETHARP_STATE_STABLE_REREQUESTING_2;\n      } else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING_2) {\n        /* Reset state to stable, so that the next transmitted packet will\n           re-send an ARP request. */\n        arp_table[i].state = ETHARP_STATE_STABLE;\n      } else if (arp_table[i].state == ETHARP_STATE_PENDING) {\n        /* still pending, resend an ARP query */\n        etharp_request(arp_table[i].netif, &arp_table[i].ipaddr);\n      }\n    }\n  }\n}\n\n/**\n * Search the ARP table for a matching or new entry.\n *\n * If an IP address is given, return a pending or stable ARP entry that matches\n * the address. If no match is found, create a new entry with this address set,\n * but in state ETHARP_EMPTY. The caller must check and possibly change the\n * state of the returned entry.\n *\n * If ipaddr is NULL, return a initialized new entry in state ETHARP_EMPTY.\n *\n * In all cases, attempt to create new entries from an empty entry. If no\n * empty entries are available and ETHARP_FLAG_TRY_HARD flag is set, recycle\n * old entries. Heuristic choose the least important entry for recycling.\n *\n * @param ipaddr IP address to find in ARP cache, or to add if not found.\n * @param flags See @ref etharp_state\n * @param netif netif related to this address (used for NETIF_HWADDRHINT)\n *\n * @return The ARP entry index that matched or is created, ERR_MEM if no\n * entry is found or could be recycled.\n */\nstatic s8_t\netharp_find_entry(const ip4_addr_t *ipaddr, u8_t flags, struct netif* netif)\n{\n  s8_t old_pending = ARP_TABLE_SIZE, old_stable = ARP_TABLE_SIZE;\n  s8_t empty = ARP_TABLE_SIZE;\n  u8_t i = 0;\n  /* oldest entry with packets on queue */\n  s8_t old_queue = ARP_TABLE_SIZE;\n  /* its age */\n  u16_t age_queue = 0, age_pending = 0, age_stable = 0;\n\n  LWIP_UNUSED_ARG(netif);\n\n  /**\n   * a) do a search through the cache, remember candidates\n   * b) select candidate entry\n   * c) create new entry\n   */\n\n  /* a) in a single search sweep, do all of this\n   * 1) remember the first empty entry (if any)\n   * 2) remember the oldest stable entry (if any)\n   * 3) remember the oldest pending entry without queued packets (if any)\n   * 4) remember the oldest pending entry with queued packets (if any)\n   * 5) search for a matching IP entry, either pending or stable\n   *    until 5 matches, or all entries are searched for.\n   */\n\n  for (i = 0; i < ARP_TABLE_SIZE; ++i) {\n    u8_t state = arp_table[i].state;\n    /* no empty entry found yet and now we do find one? */\n    if ((empty == ARP_TABLE_SIZE) && (state == ETHARP_STATE_EMPTY)) {\n      LWIP_DEBUGF(ETHARP_DEBUG, (\"etharp_find_entry: found empty entry %\"U16_F\"\\n\", (u16_t)i));\n      /* remember first empty entry */\n      empty = i;\n    } else if (state != ETHARP_STATE_EMPTY) {\n      LWIP_ASSERT(\"state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE\",\n        state == ETHARP_STATE_PENDING || state >= ETHARP_STATE_STABLE);\n      /* if given, does IP address match IP address in ARP entry? */\n      if (ipaddr && ip4_addr_cmp(ipaddr, &arp_table[i].ipaddr)\n#if ETHARP_TABLE_MATCH_NETIF\n          && ((netif == NULL) || (netif == arp_table[i].netif))\n#endif /* ETHARP_TABLE_MATCH_NETIF */\n        ) {\n        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_find_entry: found matching entry %\"U16_F\"\\n\", (u16_t)i));\n        /* found exact IP address match, simply bail out */\n        return i;\n      }\n      /* pending entry? */\n      if (state == ETHARP_STATE_PENDING) {\n        /* pending with queued packets? */\n        if (arp_table[i].q != NULL) {\n          if (arp_table[i].ctime >= age_queue) {\n            old_queue = i;\n            age_queue = arp_table[i].ctime;\n          }\n        } else\n        /* pending without queued packets? */\n        {\n          if (arp_table[i].ctime >= age_pending) {\n            old_pending = i;\n            age_pending = arp_table[i].ctime;\n          }\n        }\n      /* stable entry? */\n      } else if (state >= ETHARP_STATE_STABLE) {\n#if ETHARP_SUPPORT_STATIC_ENTRIES\n        /* don't record old_stable for static entries since they never expire */\n        if (state < ETHARP_STATE_STATIC)\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n        {\n          /* remember entry with oldest stable entry in oldest, its age in maxtime */\n          if (arp_table[i].ctime >= age_stable) {\n            old_stable = i;\n            age_stable = arp_table[i].ctime;\n          }\n        }\n      }\n    }\n  }\n  /* { we have no match } => try to create a new entry */\n\n  /* don't create new entry, only search? */\n  if (((flags & ETHARP_FLAG_FIND_ONLY) != 0) ||\n      /* or no empty entry found and not allowed to recycle? */\n      ((empty == ARP_TABLE_SIZE) && ((flags & ETHARP_FLAG_TRY_HARD) == 0))) {\n    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_find_entry: no empty entry found and not allowed to recycle\\n\"));\n    return (s8_t)ERR_MEM;\n  }\n\n  /* b) choose the least destructive entry to recycle:\n   * 1) empty entry\n   * 2) oldest stable entry\n   * 3) oldest pending entry without queued packets\n   * 4) oldest pending entry with queued packets\n   *\n   * { ETHARP_FLAG_TRY_HARD is set at this point }\n   */\n\n  /* 1) empty entry available? */\n  if (empty < ARP_TABLE_SIZE) {\n    i = empty;\n    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_find_entry: selecting empty entry %\"U16_F\"\\n\", (u16_t)i));\n  } else {\n    /* 2) found recyclable stable entry? */\n    if (old_stable < ARP_TABLE_SIZE) {\n      /* recycle oldest stable*/\n      i = old_stable;\n      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_find_entry: selecting oldest stable entry %\"U16_F\"\\n\", (u16_t)i));\n      /* no queued packets should exist on stable entries */\n      LWIP_ASSERT(\"arp_table[i].q == NULL\", arp_table[i].q == NULL);\n    /* 3) found recyclable pending entry without queued packets? */\n    } else if (old_pending < ARP_TABLE_SIZE) {\n      /* recycle oldest pending */\n      i = old_pending;\n      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_find_entry: selecting oldest pending entry %\"U16_F\" (without queue)\\n\", (u16_t)i));\n    /* 4) found recyclable pending entry with queued packets? */\n    } else if (old_queue < ARP_TABLE_SIZE) {\n      /* recycle oldest pending (queued packets are free in etharp_free_entry) */\n      i = old_queue;\n      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_find_entry: selecting oldest pending entry %\"U16_F\", freeing packet queue %p\\n\", (u16_t)i, (void *)(arp_table[i].q)));\n      /* no empty or recyclable entries found */\n    } else {\n      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_find_entry: no empty or recyclable entries found\\n\"));\n      return (s8_t)ERR_MEM;\n    }\n\n    /* { empty or recyclable entry found } */\n    LWIP_ASSERT(\"i < ARP_TABLE_SIZE\", i < ARP_TABLE_SIZE);\n    etharp_free_entry(i);\n  }\n\n  LWIP_ASSERT(\"i < ARP_TABLE_SIZE\", i < ARP_TABLE_SIZE);\n  LWIP_ASSERT(\"arp_table[i].state == ETHARP_STATE_EMPTY\",\n    arp_table[i].state == ETHARP_STATE_EMPTY);\n\n  /* IP address given? */\n  if (ipaddr != NULL) {\n    /* set IP address */\n    ip4_addr_copy(arp_table[i].ipaddr, *ipaddr);\n  }\n  arp_table[i].ctime = 0;\n#if ETHARP_TABLE_MATCH_NETIF\n  arp_table[i].netif = netif;\n#endif /* ETHARP_TABLE_MATCH_NETIF*/\n  return (err_t)i;\n}\n\n/**\n * Update (or insert) a IP/MAC address pair in the ARP cache.\n *\n * If a pending entry is resolved, any queued packets will be sent\n * at this point.\n *\n * @param netif netif related to this entry (used for NETIF_ADDRHINT)\n * @param ipaddr IP address of the inserted ARP entry.\n * @param ethaddr Ethernet address of the inserted ARP entry.\n * @param flags See @ref etharp_state\n *\n * @return\n * - ERR_OK Successfully updated ARP cache.\n * - ERR_MEM If we could not add a new ARP entry when ETHARP_FLAG_TRY_HARD was set.\n * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.\n *\n * @see pbuf_free()\n */\nstatic err_t\netharp_update_arp_entry(struct netif *netif, const ip4_addr_t *ipaddr, struct eth_addr *ethaddr, u8_t flags)\n{\n  s8_t i;\n  LWIP_ASSERT(\"netif->hwaddr_len == ETH_HWADDR_LEN\", netif->hwaddr_len == ETH_HWADDR_LEN);\n  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_update_arp_entry: %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\" - %02\"X16_F\":%02\"X16_F\":%02\"X16_F\":%02\"X16_F\":%02\"X16_F\":%02\"X16_F\"\\n\",\n    ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),\n    (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2],\n    (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5]));\n  /* non-unicast address? */\n  if (ip4_addr_isany(ipaddr) ||\n      ip4_addr_isbroadcast(ipaddr, netif) ||\n      ip4_addr_ismulticast(ipaddr)) {\n    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_update_arp_entry: will not add non-unicast IP address to ARP cache\\n\"));\n    return ERR_ARG;\n  }\n  /* find or create ARP entry */\n  i = etharp_find_entry(ipaddr, flags, netif);\n  /* bail out if no entry could be found */\n  if (i < 0) {\n    return (err_t)i;\n  }\n\n#if ETHARP_SUPPORT_STATIC_ENTRIES\n  if (flags & ETHARP_FLAG_STATIC_ENTRY) {\n    /* record static type */\n    arp_table[i].state = ETHARP_STATE_STATIC;\n  } else if (arp_table[i].state == ETHARP_STATE_STATIC) {\n    /* found entry is a static type, don't overwrite it */\n    return ERR_VAL;\n  } else\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n  {\n    /* mark it stable */\n    arp_table[i].state = ETHARP_STATE_STABLE;\n  }\n\n  /* record network interface */\n  arp_table[i].netif = netif;\n  /* insert in SNMP ARP index tree */\n  mib2_add_arp_entry(netif, &arp_table[i].ipaddr);\n\n  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_update_arp_entry: updating stable entry %\"S16_F\"\\n\", (s16_t)i));\n  /* update address */\n  ETHADDR32_COPY(&arp_table[i].ethaddr, ethaddr);\n  /* reset time stamp */\n  arp_table[i].ctime = 0;\n  /* this is where we will send out queued packets! */\n#if ARP_QUEUEING\n  while (arp_table[i].q != NULL) {\n    struct pbuf *p;\n    /* remember remainder of queue */\n    struct etharp_q_entry *q = arp_table[i].q;\n    /* pop first item off the queue */\n    arp_table[i].q = q->next;\n    /* get the packet pointer */\n    p = q->p;\n    /* now queue entry can be freed */\n    memp_free(MEMP_ARP_QUEUE, q);\n#else /* ARP_QUEUEING */\n  if (arp_table[i].q != NULL) {\n    struct pbuf *p = arp_table[i].q;\n    arp_table[i].q = NULL;\n#endif /* ARP_QUEUEING */\n    /* send the queued IP packet */\n    ethernet_output(netif, p, (struct eth_addr*)(netif->hwaddr), ethaddr, ETHTYPE_IP);\n    /* free the queued IP packet */\n    pbuf_free(p);\n  }\n  return ERR_OK;\n}\n\n#if ETHARP_SUPPORT_STATIC_ENTRIES\n/** Add a new static entry to the ARP table. If an entry exists for the\n * specified IP address, this entry is overwritten.\n * If packets are queued for the specified IP address, they are sent out.\n *\n * @param ipaddr IP address for the new static entry\n * @param ethaddr ethernet address for the new static entry\n * @return See return values of etharp_add_static_entry\n */\nerr_t\netharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr)\n{\n  struct netif *netif;\n  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_add_static_entry: %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\" - %02\"X16_F\":%02\"X16_F\":%02\"X16_F\":%02\"X16_F\":%02\"X16_F\":%02\"X16_F\"\\n\",\n    ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr),\n    (u16_t)ethaddr->addr[0], (u16_t)ethaddr->addr[1], (u16_t)ethaddr->addr[2],\n    (u16_t)ethaddr->addr[3], (u16_t)ethaddr->addr[4], (u16_t)ethaddr->addr[5]));\n\n  netif = ip4_route(ipaddr);\n  if (netif == NULL) {\n    return ERR_RTE;\n  }\n\n  return etharp_update_arp_entry(netif, ipaddr, ethaddr, ETHARP_FLAG_TRY_HARD | ETHARP_FLAG_STATIC_ENTRY);\n}\n\n/** Remove a static entry from the ARP table previously added with a call to\n * etharp_add_static_entry.\n *\n * @param ipaddr IP address of the static entry to remove\n * @return ERR_OK: entry removed\n *         ERR_MEM: entry wasn't found\n *         ERR_ARG: entry wasn't a static entry but a dynamic one\n */\nerr_t\netharp_remove_static_entry(const ip4_addr_t *ipaddr)\n{\n  s8_t i;\n  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_remove_static_entry: %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n    ip4_addr1_16(ipaddr), ip4_addr2_16(ipaddr), ip4_addr3_16(ipaddr), ip4_addr4_16(ipaddr)));\n\n  /* find or create ARP entry */\n  i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY, NULL);\n  /* bail out if no entry could be found */\n  if (i < 0) {\n    return (err_t)i;\n  }\n\n  if (arp_table[i].state != ETHARP_STATE_STATIC) {\n    /* entry wasn't a static entry, cannot remove it */\n    return ERR_ARG;\n  }\n  /* entry found, free it */\n  etharp_free_entry(i);\n  return ERR_OK;\n}\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n\n/**\n * Remove all ARP table entries of the specified netif.\n *\n * @param netif points to a network interface\n */\nvoid\netharp_cleanup_netif(struct netif *netif)\n{\n  u8_t i;\n\n  for (i = 0; i < ARP_TABLE_SIZE; ++i) {\n    u8_t state = arp_table[i].state;\n    if ((state != ETHARP_STATE_EMPTY) && (arp_table[i].netif == netif)) {\n      etharp_free_entry(i);\n    }\n  }\n}\n\n/**\n * Finds (stable) ethernet/IP address pair from ARP table\n * using interface and IP address index.\n * @note the addresses in the ARP table are in network order!\n *\n * @param netif points to interface index\n * @param ipaddr points to the (network order) IP address index\n * @param eth_ret points to return pointer\n * @param ip_ret points to return pointer\n * @return table index if found, -1 otherwise\n */\ns8_t\netharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr,\n         struct eth_addr **eth_ret, const ip4_addr_t **ip_ret)\n{\n  s8_t i;\n\n  LWIP_ASSERT(\"eth_ret != NULL && ip_ret != NULL\",\n    eth_ret != NULL && ip_ret != NULL);\n\n  LWIP_UNUSED_ARG(netif);\n\n  i = etharp_find_entry(ipaddr, ETHARP_FLAG_FIND_ONLY, netif);\n  if ((i >= 0) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {\n      *eth_ret = &arp_table[i].ethaddr;\n      *ip_ret = &arp_table[i].ipaddr;\n      return i;\n  }\n  return -1;\n}\n\n/**\n * Possibility to iterate over stable ARP table entries\n *\n * @param i entry number, 0 to ARP_TABLE_SIZE\n * @param ipaddr return value: IP address\n * @param netif return value: points to interface\n * @param eth_ret return value: ETH address\n * @return 1 on valid index, 0 otherwise\n */\nu8_t\netharp_get_entry(u8_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret)\n{\n  LWIP_ASSERT(\"ipaddr != NULL\", ipaddr != NULL);\n  LWIP_ASSERT(\"netif != NULL\", netif != NULL);\n  LWIP_ASSERT(\"eth_ret != NULL\", eth_ret != NULL);\n\n  if((i < ARP_TABLE_SIZE) && (arp_table[i].state >= ETHARP_STATE_STABLE)) {\n    *ipaddr  = &arp_table[i].ipaddr;\n    *netif   = arp_table[i].netif;\n    *eth_ret = &arp_table[i].ethaddr;\n    return 1;\n  } else {\n    return 0;\n  }\n}\n\n/**\n * Responds to ARP requests to us. Upon ARP replies to us, add entry to cache\n * send out queued IP packets. Updates cache with snooped address pairs.\n *\n * Should be called for incoming ARP packets. The pbuf in the argument\n * is freed by this function.\n *\n * @param p The ARP packet that arrived on netif. Is freed by this function.\n * @param netif The lwIP network interface on which the ARP packet pbuf arrived.\n *\n * @see pbuf_free()\n */\nvoid\netharp_input(struct pbuf *p, struct netif *netif)\n{\n  struct etharp_hdr *hdr;\n  /* these are aligned properly, whereas the ARP header fields might not be */\n  ip4_addr_t sipaddr, dipaddr;\n  u8_t for_us;\n\n  LWIP_ERROR(\"netif != NULL\", (netif != NULL), return;);\n\n  hdr = (struct etharp_hdr *)p->payload;\n\n  /* RFC 826 \"Packet Reception\": */\n  if ((hdr->hwtype != PP_HTONS(HWTYPE_ETHERNET)) ||\n      (hdr->hwlen != ETH_HWADDR_LEN) ||\n      (hdr->protolen != sizeof(ip4_addr_t)) ||\n      (hdr->proto != PP_HTONS(ETHTYPE_IP)))  {\n    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,\n      (\"etharp_input: packet dropped, wrong hw type, hwlen, proto, protolen or ethernet type (%\"U16_F\"/%\"U16_F\"/%\"U16_F\"/%\"U16_F\")\\n\",\n      hdr->hwtype, (u16_t)hdr->hwlen, hdr->proto, (u16_t)hdr->protolen));\n    ETHARP_STATS_INC(etharp.proterr);\n    ETHARP_STATS_INC(etharp.drop);\n    pbuf_free(p);\n    return;\n  }\n  ETHARP_STATS_INC(etharp.recv);\n\n#if LWIP_AUTOIP\n  /* We have to check if a host already has configured our random\n   * created link local address and continuously check if there is\n   * a host with this IP-address so we can detect collisions */\n  autoip_arp_reply(netif, hdr);\n#endif /* LWIP_AUTOIP */\n\n  /* Copy struct ip4_addr2 to aligned ip4_addr, to support compilers without\n   * structure packing (not using structure copy which breaks strict-aliasing rules). */\n  IPADDR2_COPY(&sipaddr, &hdr->sipaddr);\n  IPADDR2_COPY(&dipaddr, &hdr->dipaddr);\n\n  /* this interface is not configured? */\n  if (ip4_addr_isany_val(*netif_ip4_addr(netif))) {\n    for_us = 0;\n  } else {\n    /* ARP packet directed to us? */\n    for_us = (u8_t)ip4_addr_cmp(&dipaddr, netif_ip4_addr(netif));\n  }\n\n  /* ARP message directed to us?\n      -> add IP address in ARP cache; assume requester wants to talk to us,\n         can result in directly sending the queued packets for this host.\n     ARP message not directed to us?\n      ->  update the source IP address in the cache, if present */\n  etharp_update_arp_entry(netif, &sipaddr, &(hdr->shwaddr),\n                   for_us ? ETHARP_FLAG_TRY_HARD : ETHARP_FLAG_FIND_ONLY);\n\n  /* now act on the message itself */\n  switch (hdr->opcode) {\n  /* ARP request? */\n  case PP_HTONS(ARP_REQUEST):\n    /* ARP request. If it asked for our address, we send out a\n     * reply. In any case, we time-stamp any existing ARP entry,\n     * and possibly send out an IP packet that was queued on it. */\n\n    LWIP_DEBUGF (ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_input: incoming ARP request\\n\"));\n    /* ARP request for our address? */\n    if (for_us) {\n      /* send ARP response */\n      etharp_raw(netif,\n                 (struct eth_addr *)netif->hwaddr, &hdr->shwaddr,\n                 (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif),\n                 &hdr->shwaddr, &sipaddr,\n                 ARP_REPLY);\n    /* we are not configured? */\n    } else if (ip4_addr_isany_val(*netif_ip4_addr(netif))) {\n      /* { for_us == 0 and netif->ip_addr.addr == 0 } */\n      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_input: we are unconfigured, ARP request ignored.\\n\"));\n    /* request was not directed to us */\n    } else {\n      /* { for_us == 0 and netif->ip_addr.addr != 0 } */\n      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_input: ARP request was not for us.\\n\"));\n    }\n    break;\n  case PP_HTONS(ARP_REPLY):\n    /* ARP reply. We already updated the ARP cache earlier. */\n    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_input: incoming ARP reply\\n\"));\n#if (LWIP_DHCP && DHCP_DOES_ARP_CHECK)\n    /* DHCP wants to know about ARP replies from any host with an\n     * IP address also offered to us by the DHCP server. We do not\n     * want to take a duplicate IP address on a single network.\n     * @todo How should we handle redundant (fail-over) interfaces? */\n    dhcp_arp_reply(netif, &sipaddr);\n#endif /* (LWIP_DHCP && DHCP_DOES_ARP_CHECK) */\n    break;\n  default:\n    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_input: ARP unknown opcode type %\"S16_F\"\\n\", lwip_htons(hdr->opcode)));\n    ETHARP_STATS_INC(etharp.err);\n    break;\n  }\n  /* free ARP packet */\n  pbuf_free(p);\n}\n\n/** Just a small helper function that sends a pbuf to an ethernet address\n * in the arp_table specified by the index 'arp_idx'.\n */\nstatic err_t\netharp_output_to_arp_index(struct netif *netif, struct pbuf *q, u8_t arp_idx)\n{\n  LWIP_ASSERT(\"arp_table[arp_idx].state >= ETHARP_STATE_STABLE\",\n              arp_table[arp_idx].state >= ETHARP_STATE_STABLE);\n  /* if arp table entry is about to expire: re-request it,\n     but only if its state is ETHARP_STATE_STABLE to prevent flooding the\n     network with ARP requests if this address is used frequently. */\n  if (arp_table[arp_idx].state == ETHARP_STATE_STABLE) {\n    if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_BROADCAST) {\n      /* issue a standard request using broadcast */\n      if (etharp_request(netif, &arp_table[arp_idx].ipaddr) == ERR_OK) {\n        arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1;\n      }\n    } else if (arp_table[arp_idx].ctime >= ARP_AGE_REREQUEST_USED_UNICAST) {\n      /* issue a unicast request (for 15 seconds) to prevent unnecessary broadcast */\n      if (etharp_request_dst(netif, &arp_table[arp_idx].ipaddr, &arp_table[arp_idx].ethaddr) == ERR_OK) {\n        arp_table[arp_idx].state = ETHARP_STATE_STABLE_REREQUESTING_1;\n      }\n    }\n  }\n\n  return ethernet_output(netif, q, (struct eth_addr*)(netif->hwaddr), &arp_table[arp_idx].ethaddr, ETHTYPE_IP);\n}\n\n/**\n * Resolve and fill-in Ethernet address header for outgoing IP packet.\n *\n * For IP multicast and broadcast, corresponding Ethernet addresses\n * are selected and the packet is transmitted on the link.\n *\n * For unicast addresses, the packet is submitted to etharp_query(). In\n * case the IP address is outside the local network, the IP address of\n * the gateway is used.\n *\n * @param netif The lwIP network interface which the IP packet will be sent on.\n * @param q The pbuf(s) containing the IP packet to be sent.\n * @param ipaddr The IP address of the packet destination.\n *\n * @return\n * - ERR_RTE No route to destination (no gateway to external networks),\n * or the return type of either etharp_query() or ethernet_output().\n */\nerr_t\netharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr)\n{\n  const struct eth_addr *dest;\n  struct eth_addr mcastaddr;\n  const ip4_addr_t *dst_addr = ipaddr;\n\n  LWIP_ASSERT(\"netif != NULL\", netif != NULL);\n  LWIP_ASSERT(\"q != NULL\", q != NULL);\n  LWIP_ASSERT(\"ipaddr != NULL\", ipaddr != NULL);\n\n  /* Determine on destination hardware address. Broadcasts and multicasts\n   * are special, other IP addresses are looked up in the ARP table. */\n\n  /* broadcast destination IP address? */\n  if (ip4_addr_isbroadcast(ipaddr, netif)) {\n    /* broadcast on Ethernet also */\n    dest = (const struct eth_addr *)&ethbroadcast;\n  /* multicast destination IP address? */\n  } else if (ip4_addr_ismulticast(ipaddr)) {\n    /* Hash IP multicast address to MAC address.*/\n    mcastaddr.addr[0] = LL_IP4_MULTICAST_ADDR_0;\n    mcastaddr.addr[1] = LL_IP4_MULTICAST_ADDR_1;\n    mcastaddr.addr[2] = LL_IP4_MULTICAST_ADDR_2;\n    mcastaddr.addr[3] = ip4_addr2(ipaddr) & 0x7f;\n    mcastaddr.addr[4] = ip4_addr3(ipaddr);\n    mcastaddr.addr[5] = ip4_addr4(ipaddr);\n    /* destination Ethernet address is multicast */\n    dest = &mcastaddr;\n  /* unicast destination IP address? */\n  } else {\n    s8_t i;\n    /* outside local network? if so, this can neither be a global broadcast nor\n       a subnet broadcast. */\n    if (!ip4_addr_netcmp(ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif)) &&\n        !ip4_addr_islinklocal(ipaddr)) {\n#if LWIP_AUTOIP\n      struct ip_hdr *iphdr = LWIP_ALIGNMENT_CAST(struct ip_hdr*, q->payload);\n      /* According to RFC 3297, chapter 2.6.2 (Forwarding Rules), a packet with\n         a link-local source address must always be \"directly to its destination\n         on the same physical link. The host MUST NOT send the packet to any\n         router for forwarding\". */\n      if (!ip4_addr_islinklocal(&iphdr->src))\n#endif /* LWIP_AUTOIP */\n      {\n#ifdef LWIP_HOOK_ETHARP_GET_GW\n        /* For advanced routing, a single default gateway might not be enough, so get\n           the IP address of the gateway to handle the current destination address. */\n        dst_addr = LWIP_HOOK_ETHARP_GET_GW(netif, ipaddr);\n        if (dst_addr == NULL)\n#endif /* LWIP_HOOK_ETHARP_GET_GW */\n        {\n          /* interface has default gateway? */\n          if (!ip4_addr_isany_val(*netif_ip4_gw(netif))) {\n            /* send to hardware address of default gateway IP address */\n            dst_addr = netif_ip4_gw(netif);\n          /* no default gateway available */\n          } else {\n            /* no route to destination error (default gateway missing) */\n            return ERR_RTE;\n          }\n        }\n      }\n    }\n#if LWIP_NETIF_HWADDRHINT\n    if (netif->addr_hint != NULL) {\n      /* per-pcb cached entry was given */\n      u8_t etharp_cached_entry = *(netif->addr_hint);\n      if (etharp_cached_entry < ARP_TABLE_SIZE) {\n#endif /* LWIP_NETIF_HWADDRHINT */\n        if ((arp_table[etharp_cached_entry].state >= ETHARP_STATE_STABLE) &&\n#if ETHARP_TABLE_MATCH_NETIF\n            (arp_table[etharp_cached_entry].netif == netif) &&\n#endif\n            (ip4_addr_cmp(dst_addr, &arp_table[etharp_cached_entry].ipaddr))) {\n          /* the per-pcb-cached entry is stable and the right one! */\n          ETHARP_STATS_INC(etharp.cachehit);\n          return etharp_output_to_arp_index(netif, q, etharp_cached_entry);\n        }\n#if LWIP_NETIF_HWADDRHINT\n      }\n    }\n#endif /* LWIP_NETIF_HWADDRHINT */\n\n    /* find stable entry: do this here since this is a critical path for\n       throughput and etharp_find_entry() is kind of slow */\n    for (i = 0; i < ARP_TABLE_SIZE; i++) {\n      if ((arp_table[i].state >= ETHARP_STATE_STABLE) &&\n#if ETHARP_TABLE_MATCH_NETIF\n          (arp_table[i].netif == netif) &&\n#endif\n          (ip4_addr_cmp(dst_addr, &arp_table[i].ipaddr))) {\n        /* found an existing, stable entry */\n        ETHARP_SET_HINT(netif, i);\n        return etharp_output_to_arp_index(netif, q, i);\n      }\n    }\n    /* no stable entry found, use the (slower) query function:\n       queue on destination Ethernet address belonging to ipaddr */\n    return etharp_query(netif, dst_addr, q);\n  }\n\n  /* continuation for multicast/broadcast destinations */\n  /* obtain source Ethernet address of the given interface */\n  /* send packet directly on the link */\n  return ethernet_output(netif, q, (struct eth_addr*)(netif->hwaddr), dest, ETHTYPE_IP);\n}\n\n/**\n * Send an ARP request for the given IP address and/or queue a packet.\n *\n * If the IP address was not yet in the cache, a pending ARP cache entry\n * is added and an ARP request is sent for the given address. The packet\n * is queued on this entry.\n *\n * If the IP address was already pending in the cache, a new ARP request\n * is sent for the given address. The packet is queued on this entry.\n *\n * If the IP address was already stable in the cache, and a packet is\n * given, it is directly sent and no ARP request is sent out.\n *\n * If the IP address was already stable in the cache, and no packet is\n * given, an ARP request is sent out.\n *\n * @param netif The lwIP network interface on which ipaddr\n * must be queried for.\n * @param ipaddr The IP address to be resolved.\n * @param q If non-NULL, a pbuf that must be delivered to the IP address.\n * q is not freed by this function.\n *\n * @note q must only be ONE packet, not a packet queue!\n *\n * @return\n * - ERR_BUF Could not make room for Ethernet header.\n * - ERR_MEM Hardware address unknown, and no more ARP entries available\n *   to query for address or queue the packet.\n * - ERR_MEM Could not queue packet due to memory shortage.\n * - ERR_RTE No route to destination (no gateway to external networks).\n * - ERR_ARG Non-unicast address given, those will not appear in ARP cache.\n *\n */\nerr_t\netharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q)\n{\n  struct eth_addr * srcaddr = (struct eth_addr *)netif->hwaddr;\n  err_t result = ERR_MEM;\n  int is_new_entry = 0;\n  s8_t i; /* ARP entry index */\n\n  /* non-unicast address? */\n  if (ip4_addr_isbroadcast(ipaddr, netif) ||\n      ip4_addr_ismulticast(ipaddr) ||\n      ip4_addr_isany(ipaddr)) {\n    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_query: will not add non-unicast IP address to ARP cache\\n\"));\n    return ERR_ARG;\n  }\n\n  /* find entry in ARP cache, ask to create entry if queueing packet */\n  i = etharp_find_entry(ipaddr, ETHARP_FLAG_TRY_HARD, netif);\n\n  /* could not find or create entry? */\n  if (i < 0) {\n    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_query: could not create ARP entry\\n\"));\n    if (q) {\n      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_query: packet dropped\\n\"));\n      ETHARP_STATS_INC(etharp.memerr);\n    }\n    return (err_t)i;\n  }\n\n  /* mark a fresh entry as pending (we just sent a request) */\n  if (arp_table[i].state == ETHARP_STATE_EMPTY) {\n    is_new_entry = 1;\n    arp_table[i].state = ETHARP_STATE_PENDING;\n    /* record network interface for re-sending arp request in etharp_tmr */\n    arp_table[i].netif = netif;\n  }\n\n  /* { i is either a STABLE or (new or existing) PENDING entry } */\n  LWIP_ASSERT(\"arp_table[i].state == PENDING or STABLE\",\n  ((arp_table[i].state == ETHARP_STATE_PENDING) ||\n   (arp_table[i].state >= ETHARP_STATE_STABLE)));\n\n  /* do we have a new entry? or an implicit query request? */\n  if (is_new_entry || (q == NULL)) {\n    /* try to resolve it; send out ARP request */\n    result = etharp_request(netif, ipaddr);\n    if (result != ERR_OK) {\n      /* ARP request couldn't be sent */\n      /* We don't re-send arp request in etharp_tmr, but we still queue packets,\n         since this failure could be temporary, and the next packet calling\n         etharp_query again could lead to sending the queued packets. */\n    }\n    if (q == NULL) {\n      return result;\n    }\n  }\n\n  /* packet given? */\n  LWIP_ASSERT(\"q != NULL\", q != NULL);\n  /* stable entry? */\n  if (arp_table[i].state >= ETHARP_STATE_STABLE) {\n    /* we have a valid IP->Ethernet address mapping */\n    ETHARP_SET_HINT(netif, i);\n    /* send the packet */\n    result = ethernet_output(netif, q, srcaddr, &(arp_table[i].ethaddr), ETHTYPE_IP);\n  /* pending entry? (either just created or already pending */\n  } else if (arp_table[i].state == ETHARP_STATE_PENDING) {\n    /* entry is still pending, queue the given packet 'q' */\n    struct pbuf *p;\n    int copy_needed = 0;\n    /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but\n     * to copy the whole queue into a new PBUF_RAM (see bug #11400)\n     * PBUF_ROMs can be left as they are, since ROM must not get changed. */\n    p = q;\n    while (p) {\n      LWIP_ASSERT(\"no packet queues allowed!\", (p->len != p->tot_len) || (p->next == 0));\n      if (p->type != PBUF_ROM) {\n        copy_needed = 1;\n        break;\n      }\n      p = p->next;\n    }\n    if (copy_needed) {\n      /* copy the whole packet into new pbufs */\n      p = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM);\n      if (p != NULL) {\n        if (pbuf_copy(p, q) != ERR_OK) {\n          pbuf_free(p);\n          p = NULL;\n        }\n      }\n    } else {\n      /* referencing the old pbuf is enough */\n      p = q;\n      pbuf_ref(p);\n    }\n    /* packet could be taken over? */\n    if (p != NULL) {\n      /* queue packet ... */\n#if ARP_QUEUEING\n      struct etharp_q_entry *new_entry;\n      /* allocate a new arp queue entry */\n      new_entry = (struct etharp_q_entry *)memp_malloc(MEMP_ARP_QUEUE);\n      if (new_entry != NULL) {\n        unsigned int qlen = 0;\n        new_entry->next = 0;\n        new_entry->p = p;\n        if (arp_table[i].q != NULL) {\n          /* queue was already existent, append the new entry to the end */\n          struct etharp_q_entry *r;\n          r = arp_table[i].q;\n          qlen++;\n          while (r->next != NULL) {\n            r = r->next;\n            qlen++;\n          }\n          r->next = new_entry;\n        } else {\n          /* queue did not exist, first item in queue */\n          arp_table[i].q = new_entry;\n        }\n#if ARP_QUEUE_LEN\n        if (qlen >= ARP_QUEUE_LEN) {\n          struct etharp_q_entry *old;\n          old = arp_table[i].q;\n          arp_table[i].q = arp_table[i].q->next;\n          pbuf_free(old->p);\n          memp_free(MEMP_ARP_QUEUE, old);\n        }\n#endif\n        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_query: queued packet %p on ARP entry %\"S16_F\"\\n\", (void *)q, (s16_t)i));\n        result = ERR_OK;\n      } else {\n        /* the pool MEMP_ARP_QUEUE is empty */\n        pbuf_free(p);\n        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\\n\", (void *)q));\n        result = ERR_MEM;\n      }\n#else /* ARP_QUEUEING */\n      /* always queue one packet per ARP request only, freeing a previously queued packet */\n      if (arp_table[i].q != NULL) {\n        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_query: dropped previously queued packet %p for ARP entry %\"S16_F\"\\n\", (void *)q, (s16_t)i));\n        pbuf_free(arp_table[i].q);\n      }\n      arp_table[i].q = p;\n      result = ERR_OK;\n      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_query: queued packet %p on ARP entry %\"S16_F\"\\n\", (void *)q, (s16_t)i));\n#endif /* ARP_QUEUEING */\n    } else {\n      ETHARP_STATS_INC(etharp.memerr);\n      LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_query: could not queue a copy of PBUF_REF packet %p (out of memory)\\n\", (void *)q));\n      result = ERR_MEM;\n    }\n  }\n  return result;\n}\n\n/**\n * Send a raw ARP packet (opcode and all addresses can be modified)\n *\n * @param netif the lwip network interface on which to send the ARP packet\n * @param ethsrc_addr the source MAC address for the ethernet header\n * @param ethdst_addr the destination MAC address for the ethernet header\n * @param hwsrc_addr the source MAC address for the ARP protocol header\n * @param ipsrc_addr the source IP address for the ARP protocol header\n * @param hwdst_addr the destination MAC address for the ARP protocol header\n * @param ipdst_addr the destination IP address for the ARP protocol header\n * @param opcode the type of the ARP packet\n * @return ERR_OK if the ARP packet has been sent\n *         ERR_MEM if the ARP packet couldn't be allocated\n *         any other err_t on failure\n */\nstatic err_t\netharp_raw(struct netif *netif, const struct eth_addr *ethsrc_addr,\n           const struct eth_addr *ethdst_addr,\n           const struct eth_addr *hwsrc_addr, const ip4_addr_t *ipsrc_addr,\n           const struct eth_addr *hwdst_addr, const ip4_addr_t *ipdst_addr,\n           const u16_t opcode)\n{\n  struct pbuf *p;\n  err_t result = ERR_OK;\n  struct etharp_hdr *hdr;\n\n  LWIP_ASSERT(\"netif != NULL\", netif != NULL);\n\n  /* allocate a pbuf for the outgoing ARP request packet */\n  p = pbuf_alloc(PBUF_LINK, SIZEOF_ETHARP_HDR, PBUF_RAM);\n  /* could allocate a pbuf for an ARP request? */\n  if (p == NULL) {\n    LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,\n      (\"etharp_raw: could not allocate pbuf for ARP request.\\n\"));\n    ETHARP_STATS_INC(etharp.memerr);\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"check that first pbuf can hold struct etharp_hdr\",\n              (p->len >= SIZEOF_ETHARP_HDR));\n\n  hdr = (struct etharp_hdr *)p->payload;\n  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_raw: sending raw ARP packet.\\n\"));\n  hdr->opcode = lwip_htons(opcode);\n\n  LWIP_ASSERT(\"netif->hwaddr_len must be the same as ETH_HWADDR_LEN for etharp!\",\n              (netif->hwaddr_len == ETH_HWADDR_LEN));\n\n  /* Write the ARP MAC-Addresses */\n  ETHADDR16_COPY(&hdr->shwaddr, hwsrc_addr);\n  ETHADDR16_COPY(&hdr->dhwaddr, hwdst_addr);\n  /* Copy struct ip4_addr2 to aligned ip4_addr, to support compilers without\n   * structure packing. */\n  IPADDR2_COPY(&hdr->sipaddr, ipsrc_addr);\n  IPADDR2_COPY(&hdr->dipaddr, ipdst_addr);\n\n  hdr->hwtype = PP_HTONS(HWTYPE_ETHERNET);\n  hdr->proto = PP_HTONS(ETHTYPE_IP);\n  /* set hwlen and protolen */\n  hdr->hwlen = ETH_HWADDR_LEN;\n  hdr->protolen = sizeof(ip4_addr_t);\n\n  /* send ARP query */\n#if LWIP_AUTOIP\n  /* If we are using Link-Local, all ARP packets that contain a Link-Local\n   * 'sender IP address' MUST be sent using link-layer broadcast instead of\n   * link-layer unicast. (See RFC3927 Section 2.5, last paragraph) */\n  if(ip4_addr_islinklocal(ipsrc_addr)) {\n    ethernet_output(netif, p, ethsrc_addr, &ethbroadcast, ETHTYPE_ARP);\n  } else\n#endif /* LWIP_AUTOIP */\n  {\n    ethernet_output(netif, p, ethsrc_addr, ethdst_addr, ETHTYPE_ARP);\n  }\n\n  ETHARP_STATS_INC(etharp.xmit);\n  /* free ARP query packet */\n  pbuf_free(p);\n  p = NULL;\n  /* could not allocate pbuf for ARP request */\n\n  return result;\n}\n\n/**\n * Send an ARP request packet asking for ipaddr to a specific eth address.\n * Used to send unicast request to refresh the ARP table just before an entry\n * times out\n *\n * @param netif the lwip network interface on which to send the request\n * @param ipaddr the IP address for which to ask\n * @param hw_dst_addr the ethernet address to send this packet to\n * @return ERR_OK if the request has been sent\n *         ERR_MEM if the ARP packet couldn't be allocated\n *         any other err_t on failure\n */\nstatic err_t\netharp_request_dst(struct netif *netif, const ip4_addr_t *ipaddr, const struct eth_addr* hw_dst_addr)\n{\n  return etharp_raw(netif, (struct eth_addr *)netif->hwaddr, hw_dst_addr,\n                    (struct eth_addr *)netif->hwaddr, netif_ip4_addr(netif), &ethzero,\n                    ipaddr, ARP_REQUEST);\n}\n\n/**\n * Send an ARP request packet asking for ipaddr.\n *\n * @param netif the lwip network interface on which to send the request\n * @param ipaddr the IP address for which to ask\n * @return ERR_OK if the request has been sent\n *         ERR_MEM if the ARP packet couldn't be allocated\n *         any other err_t on failure\n */\nerr_t\netharp_request(struct netif *netif, const ip4_addr_t *ipaddr)\n{\n  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"etharp_request: sending ARP request.\\n\"));\n  return etharp_request_dst(netif, ipaddr, &ethbroadcast);\n}\n#endif /* LWIP_IPV4 && LWIP_ARP */\n\n#endif /* LWIP_ARP || LWIP_ETHERNET */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv4/icmp.c",
    "content": "/**\n * @file\n * ICMP - Internet Control Message Protocol\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n/* Some ICMP messages should be passed to the transport protocols. This\n   is not implemented. */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV4 && LWIP_ICMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/icmp.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/def.h\"\n#include \"lwip/stats.h\"\n\n#include <string.h>\n\n#ifdef LWIP_HOOK_FILENAME\n#include LWIP_HOOK_FILENAME\n#endif\n\n/** Small optimization: set to 0 if incoming PBUF_POOL pbuf always can be\n * used to modify and send a response packet (and to 1 if this is not the case,\n * e.g. when link header is stripped of when receiving) */\n#ifndef LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN\n#define LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN 1\n#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */\n\n/* The amount of data from the original packet to return in a dest-unreachable */\n#define ICMP_DEST_UNREACH_DATASIZE 8\n\nstatic void icmp_send_response(struct pbuf *p, u8_t type, u8_t code);\n\n/**\n * Processes ICMP input packets, called from ip_input().\n *\n * Currently only processes icmp echo requests and sends\n * out the echo response.\n *\n * @param p the icmp echo request packet, p->payload pointing to the icmp header\n * @param inp the netif on which this packet was received\n */\nvoid\nicmp_input(struct pbuf *p, struct netif *inp)\n{\n  u8_t type;\n#ifdef LWIP_DEBUG\n  u8_t code;\n#endif /* LWIP_DEBUG */\n  struct icmp_echo_hdr *iecho;\n  const struct ip_hdr *iphdr_in;\n  u16_t hlen;\n  const ip4_addr_t* src;\n\n  ICMP_STATS_INC(icmp.recv);\n  MIB2_STATS_INC(mib2.icmpinmsgs);\n\n  iphdr_in = ip4_current_header();\n  hlen = IPH_HL(iphdr_in) * 4;\n  if (hlen < IP_HLEN) {\n    LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_input: short IP header (%\"S16_F\" bytes) received\\n\", hlen));\n    goto lenerr;\n  }\n  if (p->len < sizeof(u16_t)*2) {\n    LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_input: short ICMP (%\"U16_F\" bytes) received\\n\", p->tot_len));\n    goto lenerr;\n  }\n\n  type = *((u8_t *)p->payload);\n#ifdef LWIP_DEBUG\n  code = *(((u8_t *)p->payload)+1);\n#endif /* LWIP_DEBUG */\n  switch (type) {\n  case ICMP_ER:\n    /* This is OK, echo reply might have been parsed by a raw PCB\n       (as obviously, an echo request has been sent, too). */\n    MIB2_STATS_INC(mib2.icmpinechoreps);\n    break;\n  case ICMP_ECHO:\n    MIB2_STATS_INC(mib2.icmpinechos);\n    src = ip4_current_dest_addr();\n    /* multicast destination address? */\n    if (ip4_addr_ismulticast(ip4_current_dest_addr())) {\n#if LWIP_MULTICAST_PING\n      /* For multicast, use address of receiving interface as source address */\n      src = netif_ip4_addr(inp);\n#else /* LWIP_MULTICAST_PING */\n      LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_input: Not echoing to multicast pings\\n\"));\n      goto icmperr;\n#endif /* LWIP_MULTICAST_PING */\n    }\n    /* broadcast destination address? */\n    if (ip4_addr_isbroadcast(ip4_current_dest_addr(), ip_current_netif())) {\n#if LWIP_BROADCAST_PING\n      /* For broadcast, use address of receiving interface as source address */\n      src = netif_ip4_addr(inp);\n#else /* LWIP_BROADCAST_PING */\n      LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_input: Not echoing to broadcast pings\\n\"));\n      goto icmperr;\n#endif /* LWIP_BROADCAST_PING */\n    }\n    LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_input: ping\\n\"));\n    if (p->tot_len < sizeof(struct icmp_echo_hdr)) {\n      LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_input: bad ICMP echo received\\n\"));\n      goto lenerr;\n    }\n#if CHECKSUM_CHECK_ICMP\n    IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_ICMP) {\n      if (inet_chksum_pbuf(p) != 0) {\n        LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_input: checksum failed for received ICMP echo\\n\"));\n        pbuf_free(p);\n        ICMP_STATS_INC(icmp.chkerr);\n        MIB2_STATS_INC(mib2.icmpinerrors);\n        return;\n      }\n    }\n#endif\n#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN\n    if (pbuf_header(p, (s16_t)(hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN))) {\n      /* p is not big enough to contain link headers\n       * allocate a new one and copy p into it\n       */\n      struct pbuf *r;\n      /* allocate new packet buffer with space for link headers */\n      r = pbuf_alloc(PBUF_LINK, p->tot_len + hlen, PBUF_RAM);\n      if (r == NULL) {\n        LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_input: allocating new pbuf failed\\n\"));\n        goto icmperr;\n      }\n      if (r->len < hlen + sizeof(struct icmp_echo_hdr)) {\n        LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"first pbuf cannot hold the ICMP header\"));\n        pbuf_free(r);\n        goto icmperr;\n      }\n      /* copy the ip header */\n      MEMCPY(r->payload, iphdr_in, hlen);\n      /* switch r->payload back to icmp header (cannot fail) */\n      if (pbuf_header(r, (s16_t)-hlen)) {\n        LWIP_ASSERT(\"icmp_input: moving r->payload to icmp header failed\\n\", 0);\n        pbuf_free(r);\n        goto icmperr;\n      }\n      /* copy the rest of the packet without ip header */\n      if (pbuf_copy(r, p) != ERR_OK) {\n        LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"icmp_input: copying to new pbuf failed\"));\n        pbuf_free(r);\n        goto icmperr;\n      }\n      /* free the original p */\n      pbuf_free(p);\n      /* we now have an identical copy of p that has room for link headers */\n      p = r;\n    } else {\n      /* restore p->payload to point to icmp header (cannot fail) */\n      if (pbuf_header(p, -(s16_t)(hlen + PBUF_LINK_HLEN + PBUF_LINK_ENCAPSULATION_HLEN))) {\n        LWIP_ASSERT(\"icmp_input: restoring original p->payload failed\\n\", 0);\n        goto icmperr;\n      }\n    }\n#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN */\n    /* At this point, all checks are OK. */\n    /* We generate an answer by switching the dest and src ip addresses,\n     * setting the icmp type to ECHO_RESPONSE and updating the checksum. */\n    iecho = (struct icmp_echo_hdr *)p->payload;\n    if (pbuf_header(p, (s16_t)hlen)) {\n      LWIP_DEBUGF(ICMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"Can't move over header in packet\"));\n    } else {\n      err_t ret;\n      struct ip_hdr *iphdr = (struct ip_hdr*)p->payload;\n      ip4_addr_copy(iphdr->src, *src);\n      ip4_addr_copy(iphdr->dest, *ip4_current_src_addr());\n      ICMPH_TYPE_SET(iecho, ICMP_ER);\n#if CHECKSUM_GEN_ICMP\n      IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_ICMP) {\n        /* adjust the checksum */\n        if (iecho->chksum > PP_HTONS(0xffffU - (ICMP_ECHO << 8))) {\n          iecho->chksum += PP_HTONS(ICMP_ECHO << 8) + 1;\n        } else {\n          iecho->chksum += PP_HTONS(ICMP_ECHO << 8);\n        }\n      }\n#if LWIP_CHECKSUM_CTRL_PER_NETIF\n      else {\n        iecho->chksum = 0;\n      }\n#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */\n#else /* CHECKSUM_GEN_ICMP */\n      iecho->chksum = 0;\n#endif /* CHECKSUM_GEN_ICMP */\n\n      /* Set the correct TTL and recalculate the header checksum. */\n      IPH_TTL_SET(iphdr, ICMP_TTL);\n      IPH_CHKSUM_SET(iphdr, 0);\n#if CHECKSUM_GEN_IP\n      IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_IP) {\n        IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, hlen));\n      }\n#endif /* CHECKSUM_GEN_IP */\n\n      ICMP_STATS_INC(icmp.xmit);\n      /* increase number of messages attempted to send */\n      MIB2_STATS_INC(mib2.icmpoutmsgs);\n      /* increase number of echo replies attempted to send */\n      MIB2_STATS_INC(mib2.icmpoutechoreps);\n\n      /* send an ICMP packet */\n      ret = ip4_output_if(p, src, LWIP_IP_HDRINCL,\n                   ICMP_TTL, 0, IP_PROTO_ICMP, inp);\n      if (ret != ERR_OK) {\n        LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_input: ip_output_if returned an error: %s\\n\", lwip_strerr(ret)));\n      }\n    }\n    break;\n  default:\n    if (type == ICMP_DUR) {\n      MIB2_STATS_INC(mib2.icmpindestunreachs);\n    } else if (type == ICMP_TE) {\n      MIB2_STATS_INC(mib2.icmpintimeexcds);\n    } else if (type == ICMP_PP) {\n      MIB2_STATS_INC(mib2.icmpinparmprobs);\n    } else if (type == ICMP_SQ) {\n      MIB2_STATS_INC(mib2.icmpinsrcquenchs);\n    } else if (type == ICMP_RD) {\n      MIB2_STATS_INC(mib2.icmpinredirects);\n    } else if (type == ICMP_TS) {\n      MIB2_STATS_INC(mib2.icmpintimestamps);\n    } else if (type == ICMP_TSR) {\n      MIB2_STATS_INC(mib2.icmpintimestampreps);\n    } else if (type == ICMP_AM) {\n      MIB2_STATS_INC(mib2.icmpinaddrmasks);\n    } else if (type == ICMP_AMR) {\n      MIB2_STATS_INC(mib2.icmpinaddrmaskreps);\n    }\n    LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_input: ICMP type %\"S16_F\" code %\"S16_F\" not supported.\\n\",\n                (s16_t)type, (s16_t)code));\n    ICMP_STATS_INC(icmp.proterr);\n    ICMP_STATS_INC(icmp.drop);\n  }\n  pbuf_free(p);\n  return;\nlenerr:\n  pbuf_free(p);\n  ICMP_STATS_INC(icmp.lenerr);\n  MIB2_STATS_INC(mib2.icmpinerrors);\n  return;\n#if LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN || !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING\nicmperr:\n  pbuf_free(p);\n  ICMP_STATS_INC(icmp.err);\n  MIB2_STATS_INC(mib2.icmpinerrors);\n  return;\n#endif /* LWIP_ICMP_ECHO_CHECK_INPUT_PBUF_LEN || !LWIP_MULTICAST_PING || !LWIP_BROADCAST_PING */\n}\n\n/**\n * Send an icmp 'destination unreachable' packet, called from ip_input() if\n * the transport layer protocol is unknown and from udp_input() if the local\n * port is not bound.\n *\n * @param p the input packet for which the 'unreachable' should be sent,\n *          p->payload pointing to the IP header\n * @param t type of the 'unreachable' packet\n */\nvoid\nicmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t)\n{\n  MIB2_STATS_INC(mib2.icmpoutdestunreachs);\n  icmp_send_response(p, ICMP_DUR, t);\n}\n\n#if IP_FORWARD || IP_REASSEMBLY\n/**\n * Send a 'time exceeded' packet, called from ip_forward() if TTL is 0.\n *\n * @param p the input packet for which the 'time exceeded' should be sent,\n *          p->payload pointing to the IP header\n * @param t type of the 'time exceeded' packet\n */\nvoid\nicmp_time_exceeded(struct pbuf *p, enum icmp_te_type t)\n{\n  MIB2_STATS_INC(mib2.icmpouttimeexcds);\n  icmp_send_response(p, ICMP_TE, t);\n}\n\n#endif /* IP_FORWARD || IP_REASSEMBLY */\n\n/**\n * Send an icmp packet in response to an incoming packet.\n *\n * @param p the input packet for which the 'unreachable' should be sent,\n *          p->payload pointing to the IP header\n * @param type Type of the ICMP header\n * @param code Code of the ICMP header\n */\nstatic void\nicmp_send_response(struct pbuf *p, u8_t type, u8_t code)\n{\n  struct pbuf *q;\n  struct ip_hdr *iphdr;\n  /* we can use the echo header here */\n  struct icmp_echo_hdr *icmphdr;\n  ip4_addr_t iphdr_src;\n  struct netif *netif;\n\n  /* increase number of messages attempted to send */\n  MIB2_STATS_INC(mib2.icmpoutmsgs);\n\n  /* ICMP header + IP header + 8 bytes of data */\n  q = pbuf_alloc(PBUF_IP, sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE,\n                 PBUF_RAM);\n  if (q == NULL) {\n    LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_time_exceeded: failed to allocate pbuf for ICMP packet.\\n\"));\n    MIB2_STATS_INC(mib2.icmpouterrors);\n    return;\n  }\n  LWIP_ASSERT(\"check that first pbuf can hold icmp message\",\n             (q->len >= (sizeof(struct icmp_echo_hdr) + IP_HLEN + ICMP_DEST_UNREACH_DATASIZE)));\n\n  iphdr = (struct ip_hdr *)p->payload;\n  LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_time_exceeded from \"));\n  ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->src);\n  LWIP_DEBUGF(ICMP_DEBUG, (\" to \"));\n  ip4_addr_debug_print_val(ICMP_DEBUG, iphdr->dest);\n  LWIP_DEBUGF(ICMP_DEBUG, (\"\\n\"));\n\n  icmphdr = (struct icmp_echo_hdr *)q->payload;\n  icmphdr->type = type;\n  icmphdr->code = code;\n  icmphdr->id = 0;\n  icmphdr->seqno = 0;\n\n  /* copy fields from original packet */\n  SMEMCPY((u8_t *)q->payload + sizeof(struct icmp_echo_hdr), (u8_t *)p->payload,\n          IP_HLEN + ICMP_DEST_UNREACH_DATASIZE);\n\n  ip4_addr_copy(iphdr_src, iphdr->src);\n#ifdef LWIP_HOOK_IP4_ROUTE_SRC\n  {\n    ip4_addr_t iphdr_dst;\n    ip4_addr_copy(iphdr_dst, iphdr->dest);\n    netif = ip4_route_src(&iphdr_src, &iphdr_dst);\n  }\n#else\n  netif = ip4_route(&iphdr_src);\n#endif\n  if (netif != NULL) {\n    /* calculate checksum */\n    icmphdr->chksum = 0;\n#if CHECKSUM_GEN_ICMP\n    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP) {\n      icmphdr->chksum = inet_chksum(icmphdr, q->len);\n    }\n#endif\n    ICMP_STATS_INC(icmp.xmit);\n    ip4_output_if(q, NULL, &iphdr_src, ICMP_TTL, 0, IP_PROTO_ICMP, netif);\n  }\n  pbuf_free(q);\n}\n\n#endif /* LWIP_IPV4 && LWIP_ICMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv4/igmp.c",
    "content": "/**\n * @file\n * IGMP - Internet Group Management Protocol\n *\n * @defgroup igmp IGMP\n * @ingroup ip4\n * To be called from TCPIP thread\n */\n\n/*\n * Copyright (c) 2002 CITEL Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of CITEL Technologies Ltd nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES AND CONTRIBUTORS ``AS IS''\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file is a contribution to the lwIP TCP/IP stack.\n * The Swedish Institute of Computer Science and Adam Dunkels\n * are specifically granted permission to redistribute this\n * source code.\n*/\n\n/*-------------------------------------------------------------\nNote 1)\nAlthough the rfc requires V1 AND V2 capability\nwe will only support v2 since now V1 is very old (August 1989)\nV1 can be added if required\n\na debug print and statistic have been implemented to\nshow this up.\n-------------------------------------------------------------\n-------------------------------------------------------------\nNote 2)\nA query for a specific group address (as opposed to ALLHOSTS)\nhas now been implemented as I am unsure if it is required\n\na debug print and statistic have been implemented to\nshow this up.\n-------------------------------------------------------------\n-------------------------------------------------------------\nNote 3)\nThe router alert rfc 2113 is implemented in outgoing packets\nbut not checked rigorously incoming\n-------------------------------------------------------------\nSteve Reynolds\n------------------------------------------------------------*/\n\n/*-----------------------------------------------------------------------------\n * RFC 988  - Host extensions for IP multicasting                         - V0\n * RFC 1054 - Host extensions for IP multicasting                         -\n * RFC 1112 - Host extensions for IP multicasting                         - V1\n * RFC 2236 - Internet Group Management Protocol, Version 2               - V2  <- this code is based on this RFC (it's the \"de facto\" standard)\n * RFC 3376 - Internet Group Management Protocol, Version 3               - V3\n * RFC 4604 - Using Internet Group Management Protocol Version 3...       - V3+\n * RFC 2113 - IP Router Alert Option                                      -\n *----------------------------------------------------------------------------*/\n\n/*-----------------------------------------------------------------------------\n * Includes\n *----------------------------------------------------------------------------*/\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV4 && LWIP_IGMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/igmp.h\"\n#include \"lwip/debug.h\"\n#include \"lwip/def.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/prot/igmp.h\"\n\n#include \"string.h\"\n\nstatic struct igmp_group *igmp_lookup_group(struct netif *ifp, const ip4_addr_t *addr);\nstatic err_t  igmp_remove_group(struct netif* netif, struct igmp_group *group);\nstatic void   igmp_timeout(struct netif *netif, struct igmp_group *group);\nstatic void   igmp_start_timer(struct igmp_group *group, u8_t max_time);\nstatic void   igmp_delaying_member(struct igmp_group *group, u8_t maxresp);\nstatic err_t  igmp_ip_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, struct netif *netif);\nstatic void   igmp_send(struct netif *netif, struct igmp_group *group, u8_t type);\n\nstatic ip4_addr_t     allsystems;\nstatic ip4_addr_t     allrouters;\n\n/**\n * Initialize the IGMP module\n */\nvoid\nigmp_init(void)\n{\n  LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_init: initializing\\n\"));\n\n  IP4_ADDR(&allsystems, 224, 0, 0, 1);\n  IP4_ADDR(&allrouters, 224, 0, 0, 2);\n}\n\n/**\n * Start IGMP processing on interface\n *\n * @param netif network interface on which start IGMP processing\n */\nerr_t\nigmp_start(struct netif *netif)\n{\n  struct igmp_group* group;\n\n  LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_start: starting IGMP processing on if %p\\n\", (void*)netif));\n\n  group = igmp_lookup_group(netif, &allsystems);\n\n  if (group != NULL) {\n    group->group_state = IGMP_GROUP_IDLE_MEMBER;\n    group->use++;\n\n    /* Allow the igmp messages at the MAC level */\n    if (netif->igmp_mac_filter != NULL) {\n      LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_start: igmp_mac_filter(ADD \"));\n      ip4_addr_debug_print_val(IGMP_DEBUG, allsystems);\n      LWIP_DEBUGF(IGMP_DEBUG, (\") on if %p\\n\", (void*)netif));\n      netif->igmp_mac_filter(netif, &allsystems, NETIF_ADD_MAC_FILTER);\n    }\n\n    return ERR_OK;\n  }\n\n  return ERR_MEM;\n}\n\n/**\n * Stop IGMP processing on interface\n *\n * @param netif network interface on which stop IGMP processing\n */\nerr_t\nigmp_stop(struct netif *netif)\n{\n  struct igmp_group *group = netif_igmp_data(netif);\n\n  netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP, NULL);\n\n  while (group != NULL) {\n    struct igmp_group *next = group->next; /* avoid use-after-free below */\n\n    /* disable the group at the MAC level */\n    if (netif->igmp_mac_filter != NULL) {\n      LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_stop: igmp_mac_filter(DEL \"));\n      ip4_addr_debug_print(IGMP_DEBUG, &group->group_address);\n      LWIP_DEBUGF(IGMP_DEBUG, (\") on if %p\\n\", (void*)netif));\n      netif->igmp_mac_filter(netif, &(group->group_address), NETIF_DEL_MAC_FILTER);\n    }\n\n    /* free group */\n    memp_free(MEMP_IGMP_GROUP, group);\n\n    /* move to \"next\" */\n    group = next;\n  }\n  return ERR_OK;\n}\n\n/**\n * Report IGMP memberships for this interface\n *\n * @param netif network interface on which report IGMP memberships\n */\nvoid\nigmp_report_groups(struct netif *netif)\n{\n  struct igmp_group *group = netif_igmp_data(netif);\n\n  LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_report_groups: sending IGMP reports on if %p\\n\", (void*)netif));\n\n  /* Skip the first group in the list, it is always the allsystems group added in igmp_start() */\n  if(group != NULL) {\n    group = group->next;\n  }\n  \n  while (group != NULL) {\n    igmp_delaying_member(group, IGMP_JOIN_DELAYING_MEMBER_TMR);\n    group = group->next;\n  }\n}\n\n/**\n * Search for a group in the global igmp_group_list\n *\n * @param ifp the network interface for which to look\n * @param addr the group ip address to search for\n * @return a struct igmp_group* if the group has been found,\n *         NULL if the group wasn't found.\n */\nstruct igmp_group *\nigmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr)\n{\n  struct igmp_group *group = netif_igmp_data(ifp);\n\n  while (group != NULL) {\n    if (ip4_addr_cmp(&(group->group_address), addr)) {\n      return group;\n    }\n    group = group->next;\n  }\n\n  /* to be clearer, we return NULL here instead of\n   * 'group' (which is also NULL at this point).\n   */\n  return NULL;\n}\n\n/**\n * Search for a specific igmp group and create a new one if not found-\n *\n * @param ifp the network interface for which to look\n * @param addr the group ip address to search\n * @return a struct igmp_group*,\n *         NULL on memory error.\n */\nstatic struct igmp_group *\nigmp_lookup_group(struct netif *ifp, const ip4_addr_t *addr)\n{\n  struct igmp_group *group;\n  struct igmp_group *list_head = netif_igmp_data(ifp);\n\n  /* Search if the group already exists */\n  group = igmp_lookfor_group(ifp, addr);\n  if (group != NULL) {\n    /* Group already exists. */\n    return group;\n  }\n  \n  /* Group doesn't exist yet, create a new one */\n  group = (struct igmp_group *)memp_malloc(MEMP_IGMP_GROUP);\n  if (group != NULL) {\n    ip4_addr_set(&(group->group_address), addr);\n    group->timer              = 0; /* Not running */\n    group->group_state        = IGMP_GROUP_NON_MEMBER;\n    group->last_reporter_flag = 0;\n    group->use                = 0;\n\n    /* Ensure allsystems group is always first in list */    \n    if (list_head == NULL) {\n      /* this is the first entry in linked list */\n      LWIP_ASSERT(\"igmp_lookup_group: first group must be allsystems\",\n        (ip4_addr_cmp(addr, &allsystems) != 0));\n      group->next = NULL;\n      netif_set_client_data(ifp, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP, group);\n    } else {\n      /* append _after_ first entry */\n      LWIP_ASSERT(\"igmp_lookup_group: all except first group must not be allsystems\",\n        (ip4_addr_cmp(addr, &allsystems) == 0));\n      group->next = list_head->next;\n      list_head->next = group;\n    }\n  }\n\n  LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_lookup_group: %sallocated a new group with address \", (group?\"\":\"impossible to \")));\n  ip4_addr_debug_print(IGMP_DEBUG, addr);\n  LWIP_DEBUGF(IGMP_DEBUG, (\" on if %p\\n\", (void*)ifp));\n\n  return group;\n}\n\n/**\n * Remove a group in the global igmp_group_list, but don't free it yet\n *\n * @param group the group to remove from the global igmp_group_list\n * @return ERR_OK if group was removed from the list, an err_t otherwise\n */\nstatic err_t\nigmp_remove_group(struct netif* netif, struct igmp_group *group)\n{\n  err_t err = ERR_OK;\n  struct igmp_group *tmp_group;\n\n  /* Skip the first group in the list, it is always the allsystems group added in igmp_start() */\n  for (tmp_group = netif_igmp_data(netif); tmp_group != NULL; tmp_group = tmp_group->next) {\n    if (tmp_group->next == group) {\n      tmp_group->next = group->next;\n      break;\n    }\n  }\n  /* Group not found in the global igmp_group_list */\n  if (tmp_group == NULL) {\n    err = ERR_ARG;\n  }\n\n  return err;\n}\n\n/**\n * Called from ip_input() if a new IGMP packet is received.\n *\n * @param p received igmp packet, p->payload pointing to the igmp header\n * @param inp network interface on which the packet was received\n * @param dest destination ip address of the igmp packet\n */\nvoid\nigmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest)\n{\n  struct igmp_msg*   igmp;\n  struct igmp_group* group;\n  struct igmp_group* groupref;\n\n  IGMP_STATS_INC(igmp.recv);\n\n  /* Note that the length CAN be greater than 8 but only 8 are used - All are included in the checksum */\n  if (p->len < IGMP_MINLEN) {\n    pbuf_free(p);\n    IGMP_STATS_INC(igmp.lenerr);\n    LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_input: length error\\n\"));\n    return;\n  }\n\n  LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_input: message from \"));\n  ip4_addr_debug_print(IGMP_DEBUG, &(ip4_current_header()->src));\n  LWIP_DEBUGF(IGMP_DEBUG, (\" to address \"));\n  ip4_addr_debug_print(IGMP_DEBUG, &(ip4_current_header()->dest));\n  LWIP_DEBUGF(IGMP_DEBUG, (\" on if %p\\n\", (void*)inp));\n\n  /* Now calculate and check the checksum */\n  igmp = (struct igmp_msg *)p->payload;\n  if (inet_chksum(igmp, p->len)) {\n    pbuf_free(p);\n    IGMP_STATS_INC(igmp.chkerr);\n    LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_input: checksum error\\n\"));\n    return;\n  }\n\n  /* Packet is ok so find an existing group */\n  group = igmp_lookfor_group(inp, dest); /* use the destination IP address of incoming packet */\n\n  /* If group can be found or create... */\n  if (!group) {\n    pbuf_free(p);\n    IGMP_STATS_INC(igmp.drop);\n    LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_input: IGMP frame not for us\\n\"));\n    return;\n  }\n\n  /* NOW ACT ON THE INCOMING MESSAGE TYPE... */\n  switch (igmp->igmp_msgtype) {\n  case IGMP_MEMB_QUERY:\n    /* IGMP_MEMB_QUERY to the \"all systems\" address ? */\n    if ((ip4_addr_cmp(dest, &allsystems)) && ip4_addr_isany(&igmp->igmp_group_address)) {\n      /* THIS IS THE GENERAL QUERY */\n      LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_input: General IGMP_MEMB_QUERY on \\\"ALL SYSTEMS\\\" address (224.0.0.1) [igmp_maxresp=%i]\\n\", (int)(igmp->igmp_maxresp)));\n\n      if (igmp->igmp_maxresp == 0) {\n        IGMP_STATS_INC(igmp.rx_v1);\n        LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_input: got an all hosts query with time== 0 - this is V1 and not implemented - treat as v2\\n\"));\n        igmp->igmp_maxresp = IGMP_V1_DELAYING_MEMBER_TMR;\n      } else {\n        IGMP_STATS_INC(igmp.rx_general);\n      }\n\n      groupref = netif_igmp_data(inp);\n      \n      /* Do not send messages on the all systems group address! */\n      /* Skip the first group in the list, it is always the allsystems group added in igmp_start() */\n      if(groupref != NULL) {\n        groupref = groupref->next;\n      }\n\n      while (groupref) {\n        igmp_delaying_member(groupref, igmp->igmp_maxresp);\n        groupref = groupref->next;\n      }\n    } else {\n      /* IGMP_MEMB_QUERY to a specific group ? */\n      if (!ip4_addr_isany(&igmp->igmp_group_address)) {\n        LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_input: IGMP_MEMB_QUERY to a specific group \"));\n        ip4_addr_debug_print(IGMP_DEBUG, &igmp->igmp_group_address);\n        if (ip4_addr_cmp(dest, &allsystems)) {\n          ip4_addr_t groupaddr;\n          LWIP_DEBUGF(IGMP_DEBUG, (\" using \\\"ALL SYSTEMS\\\" address (224.0.0.1) [igmp_maxresp=%i]\\n\", (int)(igmp->igmp_maxresp)));\n          /* we first need to re-look for the group since we used dest last time */\n          ip4_addr_copy(groupaddr, igmp->igmp_group_address);\n          group = igmp_lookfor_group(inp, &groupaddr);\n        } else {\n          LWIP_DEBUGF(IGMP_DEBUG, (\" with the group address as destination [igmp_maxresp=%i]\\n\", (int)(igmp->igmp_maxresp)));\n        }\n\n        if (group != NULL) {\n          IGMP_STATS_INC(igmp.rx_group);\n          igmp_delaying_member(group, igmp->igmp_maxresp);\n        } else {\n          IGMP_STATS_INC(igmp.drop);\n        }\n      } else {\n        IGMP_STATS_INC(igmp.proterr);\n      }\n    }\n    break;\n  case IGMP_V2_MEMB_REPORT:\n    LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_input: IGMP_V2_MEMB_REPORT\\n\"));\n    IGMP_STATS_INC(igmp.rx_report);\n    if (group->group_state == IGMP_GROUP_DELAYING_MEMBER) {\n      /* This is on a specific group we have already looked up */\n      group->timer = 0; /* stopped */\n      group->group_state = IGMP_GROUP_IDLE_MEMBER;\n      group->last_reporter_flag = 0;\n    }\n    break;\n  default:\n    LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_input: unexpected msg %d in state %d on group %p on if %p\\n\",\n      igmp->igmp_msgtype, group->group_state, (void*)&group, (void*)inp));\n    IGMP_STATS_INC(igmp.proterr);\n    break;\n  }\n\n  pbuf_free(p);\n  return;\n}\n\n/**\n * @ingroup igmp\n * Join a group on one network interface.\n *\n * @param ifaddr ip address of the network interface which should join a new group\n * @param groupaddr the ip address of the group which to join\n * @return ERR_OK if group was joined on the netif(s), an err_t otherwise\n */\nerr_t\nigmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr)\n{\n  err_t err = ERR_VAL; /* no matching interface */\n  struct netif *netif;\n\n  /* make sure it is multicast address */\n  LWIP_ERROR(\"igmp_joingroup: attempt to join non-multicast address\", ip4_addr_ismulticast(groupaddr), return ERR_VAL;);\n  LWIP_ERROR(\"igmp_joingroup: attempt to join allsystems address\", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;);\n\n  /* loop through netif's */\n  netif = netif_list;\n  while (netif != NULL) {\n    /* Should we join this interface ? */\n    if ((netif->flags & NETIF_FLAG_IGMP) && ((ip4_addr_isany(ifaddr) || ip4_addr_cmp(netif_ip4_addr(netif), ifaddr)))) {\n      err = igmp_joingroup_netif(netif, groupaddr);\n      if (err != ERR_OK) {\n        /* Return an error even if some network interfaces are joined */\n        /** @todo undo any other netif already joined */\n        return err;\n      }\n    }\n    /* proceed to next network interface */\n    netif = netif->next;\n  }\n\n  return err;\n}\n\n/**\n * @ingroup igmp\n * Join a group on one network interface.\n *\n * @param netif the network interface which should join a new group\n * @param groupaddr the ip address of the group which to join\n * @return ERR_OK if group was joined on the netif, an err_t otherwise\n */\nerr_t\nigmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr)\n{\n  struct igmp_group *group;\n\n  /* make sure it is multicast address */\n  LWIP_ERROR(\"igmp_joingroup_netif: attempt to join non-multicast address\", ip4_addr_ismulticast(groupaddr), return ERR_VAL;);\n  LWIP_ERROR(\"igmp_joingroup_netif: attempt to join allsystems address\", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;);\n\n  /* make sure it is an igmp-enabled netif */\n  LWIP_ERROR(\"igmp_joingroup_netif: attempt to join on non-IGMP netif\", netif->flags & NETIF_FLAG_IGMP, return ERR_VAL;);\n\n  /* find group or create a new one if not found */\n  group = igmp_lookup_group(netif, groupaddr);\n\n  if (group != NULL) {\n    /* This should create a new group, check the state to make sure */\n    if (group->group_state != IGMP_GROUP_NON_MEMBER) {\n      LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_joingroup_netif: join to group not in state IGMP_GROUP_NON_MEMBER\\n\"));\n    } else {\n      /* OK - it was new group */\n      LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_joingroup_netif: join to new group: \"));\n      ip4_addr_debug_print(IGMP_DEBUG, groupaddr);\n      LWIP_DEBUGF(IGMP_DEBUG, (\"\\n\"));\n\n      /* If first use of the group, allow the group at the MAC level */\n      if ((group->use==0) && (netif->igmp_mac_filter != NULL)) {\n        LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_joingroup_netif: igmp_mac_filter(ADD \"));\n        ip4_addr_debug_print(IGMP_DEBUG, groupaddr);\n        LWIP_DEBUGF(IGMP_DEBUG, (\") on if %p\\n\", (void*)netif));\n        netif->igmp_mac_filter(netif, groupaddr, NETIF_ADD_MAC_FILTER);\n      }\n\n      IGMP_STATS_INC(igmp.tx_join);\n      igmp_send(netif, group, IGMP_V2_MEMB_REPORT);\n\n      igmp_start_timer(group, IGMP_JOIN_DELAYING_MEMBER_TMR);\n\n      /* Need to work out where this timer comes from */\n      group->group_state = IGMP_GROUP_DELAYING_MEMBER;\n    }\n    /* Increment group use */\n    group->use++;\n    /* Join on this interface */\n    return ERR_OK;\n  } else {\n    LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_joingroup_netif: Not enough memory to join to group\\n\"));\n    return ERR_MEM;\n  }\n}\n\n/**\n * @ingroup igmp\n * Leave a group on one network interface.\n *\n * @param ifaddr ip address of the network interface which should leave a group\n * @param groupaddr the ip address of the group which to leave\n * @return ERR_OK if group was left on the netif(s), an err_t otherwise\n */\nerr_t\nigmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr)\n{\n  err_t err = ERR_VAL; /* no matching interface */\n  struct netif *netif;\n\n  /* make sure it is multicast address */\n  LWIP_ERROR(\"igmp_leavegroup: attempt to leave non-multicast address\", ip4_addr_ismulticast(groupaddr), return ERR_VAL;);\n  LWIP_ERROR(\"igmp_leavegroup: attempt to leave allsystems address\", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;);\n\n  /* loop through netif's */\n  netif = netif_list;\n  while (netif != NULL) {\n    /* Should we leave this interface ? */\n    if ((netif->flags & NETIF_FLAG_IGMP) && ((ip4_addr_isany(ifaddr) || ip4_addr_cmp(netif_ip4_addr(netif), ifaddr)))) {\n      err_t res = igmp_leavegroup_netif(netif, groupaddr);\n      if (err != ERR_OK) {\n        /* Store this result if we have not yet gotten a success */\n        err = res;\n      }\n    }\n    /* proceed to next network interface */\n    netif = netif->next;\n  }\n\n  return err;\n}\n\n/**\n * @ingroup igmp\n * Leave a group on one network interface.\n *\n * @param netif the network interface which should leave a group\n * @param groupaddr the ip address of the group which to leave\n * @return ERR_OK if group was left on the netif, an err_t otherwise\n */\nerr_t\nigmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr)\n{\n  struct igmp_group *group;\n\n  /* make sure it is multicast address */\n  LWIP_ERROR(\"igmp_leavegroup_netif: attempt to leave non-multicast address\", ip4_addr_ismulticast(groupaddr), return ERR_VAL;);\n  LWIP_ERROR(\"igmp_leavegroup_netif: attempt to leave allsystems address\", (!ip4_addr_cmp(groupaddr, &allsystems)), return ERR_VAL;);\n\n  /* make sure it is an igmp-enabled netif */\n  LWIP_ERROR(\"igmp_leavegroup_netif: attempt to leave on non-IGMP netif\", netif->flags & NETIF_FLAG_IGMP, return ERR_VAL;);\n\n  /* find group */\n  group = igmp_lookfor_group(netif, groupaddr);\n\n  if (group != NULL) {\n    /* Only send a leave if the flag is set according to the state diagram */\n    LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_leavegroup_netif: Leaving group: \"));\n    ip4_addr_debug_print(IGMP_DEBUG, groupaddr);\n    LWIP_DEBUGF(IGMP_DEBUG, (\"\\n\"));\n\n    /* If there is no other use of the group */\n    if (group->use <= 1) {\n      /* Remove the group from the list */\n      igmp_remove_group(netif, group);\n\n      /* If we are the last reporter for this group */\n      if (group->last_reporter_flag) {\n        LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_leavegroup_netif: sending leaving group\\n\"));\n        IGMP_STATS_INC(igmp.tx_leave);\n        igmp_send(netif, group, IGMP_LEAVE_GROUP);\n      }\n\n      /* Disable the group at the MAC level */\n      if (netif->igmp_mac_filter != NULL) {\n        LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_leavegroup_netif: igmp_mac_filter(DEL \"));\n        ip4_addr_debug_print(IGMP_DEBUG, groupaddr);\n        LWIP_DEBUGF(IGMP_DEBUG, (\") on if %p\\n\", (void*)netif));\n        netif->igmp_mac_filter(netif, groupaddr, NETIF_DEL_MAC_FILTER);\n      }\n\n      /* Free group struct */\n      memp_free(MEMP_IGMP_GROUP, group);\n    } else {\n      /* Decrement group use */\n      group->use--;\n    }\n    return ERR_OK;\n  } else {\n    LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_leavegroup_netif: not member of group\\n\"));\n    return ERR_VAL;\n  }\n}\n\n/**\n * The igmp timer function (both for NO_SYS=1 and =0)\n * Should be called every IGMP_TMR_INTERVAL milliseconds (100 ms is default).\n */\nvoid\nigmp_tmr(void)\n{\n  struct netif *netif = netif_list;\n\n  while (netif != NULL) {\n    struct igmp_group *group = netif_igmp_data(netif);\n\n    while (group != NULL) {\n      if (group->timer > 0) {\n        group->timer--;\n        if (group->timer == 0) {\n          igmp_timeout(netif, group);\n        }\n      }\n      group = group->next;\n    }\n    netif = netif->next;\n  }\n}\n\n/**\n * Called if a timeout for one group is reached.\n * Sends a report for this group.\n *\n * @param group an igmp_group for which a timeout is reached\n */\nstatic void\nigmp_timeout(struct netif *netif, struct igmp_group *group)\n{\n  /* If the state is IGMP_GROUP_DELAYING_MEMBER then we send a report for this group\n     (unless it is the allsystems group) */\n  if ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) &&\n      (!(ip4_addr_cmp(&(group->group_address), &allsystems)))) {\n    LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_timeout: report membership for group with address \"));\n    ip4_addr_debug_print(IGMP_DEBUG, &(group->group_address));\n    LWIP_DEBUGF(IGMP_DEBUG, (\" on if %p\\n\", (void*)netif));\n\n    group->group_state = IGMP_GROUP_IDLE_MEMBER;\n    \n    IGMP_STATS_INC(igmp.tx_report);\n    igmp_send(netif, group, IGMP_V2_MEMB_REPORT);\n  }\n}\n\n/**\n * Start a timer for an igmp group\n *\n * @param group the igmp_group for which to start a timer\n * @param max_time the time in multiples of IGMP_TMR_INTERVAL (decrease with\n *        every call to igmp_tmr())\n */\nstatic void\nigmp_start_timer(struct igmp_group *group, u8_t max_time)\n{\n#ifdef LWIP_RAND\n  group->timer = max_time > 2 ? (LWIP_RAND() % max_time) : 1;\n#else /* LWIP_RAND */\n  /* ATTENTION: use this only if absolutely necessary! */\n  group->timer = max_time / 2;\n#endif /* LWIP_RAND */\n\n  if (group->timer == 0) {\n    group->timer = 1;\n  }\n}\n\n/**\n * Delaying membership report for a group if necessary\n *\n * @param group the igmp_group for which \"delaying\" membership report\n * @param maxresp query delay\n */\nstatic void\nigmp_delaying_member(struct igmp_group *group, u8_t maxresp)\n{\n  if ((group->group_state == IGMP_GROUP_IDLE_MEMBER) ||\n     ((group->group_state == IGMP_GROUP_DELAYING_MEMBER) &&\n      ((group->timer == 0) || (maxresp < group->timer)))) {\n    igmp_start_timer(group, maxresp);\n    group->group_state = IGMP_GROUP_DELAYING_MEMBER;\n  }\n}\n\n\n/**\n * Sends an IP packet on a network interface. This function constructs the IP header\n * and calculates the IP header checksum. If the source IP address is NULL,\n * the IP address of the outgoing network interface is filled in as source address.\n *\n * @param p the packet to send (p->payload points to the data, e.g. next\n            protocol header; if dest == LWIP_IP_HDRINCL, p already includes an\n            IP header and p->payload points to that IP header)\n * @param src the source IP address to send from (if src == IP4_ADDR_ANY, the\n *         IP  address of the netif used to send is used as source address)\n * @param dest the destination IP address to send the packet to\n * @param netif the netif on which to send this packet\n * @return ERR_OK if the packet was sent OK\n *         ERR_BUF if p doesn't have enough space for IP/LINK headers\n *         returns errors returned by netif->output\n */\nstatic err_t\nigmp_ip_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest, struct netif *netif)\n{\n  /* This is the \"router alert\" option */\n  u16_t ra[2];\n  ra[0] = PP_HTONS(ROUTER_ALERT);\n  ra[1] = 0x0000; /* Router shall examine packet */\n  IGMP_STATS_INC(igmp.xmit);\n  return ip4_output_if_opt(p, src, dest, IGMP_TTL, 0, IP_PROTO_IGMP, netif, ra, ROUTER_ALERTLEN);\n}\n\n/**\n * Send an igmp packet to a specific group.\n *\n * @param group the group to which to send the packet\n * @param type the type of igmp packet to send\n */\nstatic void\nigmp_send(struct netif *netif, struct igmp_group *group, u8_t type)\n{\n  struct pbuf*     p    = NULL;\n  struct igmp_msg* igmp = NULL;\n  ip4_addr_t   src  = *IP4_ADDR_ANY4;\n  ip4_addr_t*  dest = NULL;\n\n  /* IP header + \"router alert\" option + IGMP header */\n  p = pbuf_alloc(PBUF_TRANSPORT, IGMP_MINLEN, PBUF_RAM);\n\n  if (p) {\n    igmp = (struct igmp_msg *)p->payload;\n    LWIP_ASSERT(\"igmp_send: check that first pbuf can hold struct igmp_msg\",\n               (p->len >= sizeof(struct igmp_msg)));\n    ip4_addr_copy(src, *netif_ip4_addr(netif));\n\n    if (type == IGMP_V2_MEMB_REPORT) {\n      dest = &(group->group_address);\n      ip4_addr_copy(igmp->igmp_group_address, group->group_address);\n      group->last_reporter_flag = 1; /* Remember we were the last to report */\n    } else {\n      if (type == IGMP_LEAVE_GROUP) {\n        dest = &allrouters;\n        ip4_addr_copy(igmp->igmp_group_address, group->group_address);\n      }\n    }\n\n    if ((type == IGMP_V2_MEMB_REPORT) || (type == IGMP_LEAVE_GROUP)) {\n      igmp->igmp_msgtype  = type;\n      igmp->igmp_maxresp  = 0;\n      igmp->igmp_checksum = 0;\n      igmp->igmp_checksum = inet_chksum(igmp, IGMP_MINLEN);\n\n      igmp_ip_output_if(p, &src, dest, netif);\n    }\n\n    pbuf_free(p);\n  } else {\n    LWIP_DEBUGF(IGMP_DEBUG, (\"igmp_send: not enough memory for igmp_send\\n\"));\n    IGMP_STATS_INC(igmp.memerr);\n  }\n}\n\n#endif /* LWIP_IPV4 && LWIP_IGMP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv4/ip4.c",
    "content": "/**\n * @file\n * This is the IPv4 layer implementation for incoming and outgoing IP traffic.\n *\n * @see ip_frag.c\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV4\n\n#include \"lwip/ip.h\"\n#include \"lwip/def.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/ip4_frag.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/icmp.h\"\n#include \"lwip/igmp.h\"\n#include \"lwip/raw.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/autoip.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/prot/dhcp.h\"\n\n#include <string.h>\n\n#ifdef LWIP_HOOK_FILENAME\n#include LWIP_HOOK_FILENAME\n#endif\n\n/** Set this to 0 in the rare case of wanting to call an extra function to\n * generate the IP checksum (in contrast to calculating it on-the-fly). */\n#ifndef LWIP_INLINE_IP_CHKSUM\n#if LWIP_CHECKSUM_CTRL_PER_NETIF\n#define LWIP_INLINE_IP_CHKSUM   0\n#else /* LWIP_CHECKSUM_CTRL_PER_NETIF */\n#define LWIP_INLINE_IP_CHKSUM   1\n#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */\n#endif\n\n#if LWIP_INLINE_IP_CHKSUM && CHECKSUM_GEN_IP\n#define CHECKSUM_GEN_IP_INLINE  1\n#else\n#define CHECKSUM_GEN_IP_INLINE  0\n#endif\n\n#if LWIP_DHCP || defined(LWIP_IP_ACCEPT_UDP_PORT)\n#define IP_ACCEPT_LINK_LAYER_ADDRESSING 1\n\n/** Some defines for DHCP to let link-layer-addressed packets through while the\n * netif is down.\n * To use this in your own application/protocol, define LWIP_IP_ACCEPT_UDP_PORT(port)\n * to return 1 if the port is accepted and 0 if the port is not accepted.\n */\n#if LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT)\n/* accept DHCP client port and custom port */\n#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (((port) == PP_NTOHS(DHCP_CLIENT_PORT)) \\\n         || (LWIP_IP_ACCEPT_UDP_PORT(port)))\n#elif defined(LWIP_IP_ACCEPT_UDP_PORT) /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */\n/* accept custom port only */\n#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) (LWIP_IP_ACCEPT_UDP_PORT(port))\n#else /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */\n/* accept DHCP client port only */\n#define IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(port) ((port) == PP_NTOHS(DHCP_CLIENT_PORT))\n#endif /* LWIP_DHCP && defined(LWIP_IP_ACCEPT_UDP_PORT) */\n\n#else /* LWIP_DHCP */\n#define IP_ACCEPT_LINK_LAYER_ADDRESSING 0\n#endif /* LWIP_DHCP */\n\n/** The IP header ID of the next outgoing IP packet */\nstatic u16_t ip_id;\n\n#if LWIP_MULTICAST_TX_OPTIONS\n/** The default netif used for multicast */\nstatic struct netif* ip4_default_multicast_netif;\n\n/**\n * @ingroup ip4\n * Set a default netif for IPv4 multicast. */\nvoid\nip4_set_default_multicast_netif(struct netif* default_multicast_netif)\n{\n  ip4_default_multicast_netif = default_multicast_netif;\n}\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n\n#ifdef LWIP_HOOK_IP4_ROUTE_SRC\n/**\n * Source based IPv4 routing must be fully implemented in\n * LWIP_HOOK_IP4_ROUTE_SRC(). This function only provides he parameters.\n */\nstruct netif *\nip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src)\n{\n  if (src != NULL) {\n    /* when src==NULL, the hook is called from ip4_route(dest) */\n    struct netif *netif = LWIP_HOOK_IP4_ROUTE_SRC(dest, src);\n    if (netif != NULL) {\n      return netif;\n    }\n  }\n  return ip4_route(dest);\n}\n#endif /* LWIP_HOOK_IP4_ROUTE_SRC */\n\n/**\n * Finds the appropriate network interface for a given IP address. It\n * searches the list of network interfaces linearly. A match is found\n * if the masked IP address of the network interface equals the masked\n * IP address given to the function.\n *\n * @param dest the destination IP address for which to find the route\n * @return the netif on which to send to reach dest\n */\nstruct netif *\nip4_route(const ip4_addr_t *dest)\n{\n  struct netif *netif;\n\n#if LWIP_MULTICAST_TX_OPTIONS\n  /* Use administratively selected interface for multicast by default */\n  if (ip4_addr_ismulticast(dest) && ip4_default_multicast_netif) {\n    return ip4_default_multicast_netif;\n  }\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n\n  /* iterate through netifs */\n  for (netif = netif_list; netif != NULL; netif = netif->next) {\n    /* is the netif up, does it have a link and a valid address? */\n    if (netif_is_up(netif) && netif_is_link_up(netif) && !ip4_addr_isany_val(*netif_ip4_addr(netif))) {\n      /* network mask matches? */\n      if (ip4_addr_netcmp(dest, netif_ip4_addr(netif), netif_ip4_netmask(netif))) {\n        /* return netif on which to forward IP packet */\n        return netif;\n      }\n      /* gateway matches on a non broadcast interface? (i.e. peer in a point to point interface) */\n      if (((netif->flags & NETIF_FLAG_BROADCAST) == 0) && ip4_addr_cmp(dest, netif_ip4_gw(netif))) {\n        /* return netif on which to forward IP packet */\n        return netif;\n      }\n    }\n  }\n\n#if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF\n  /* loopif is disabled, looopback traffic is passed through any netif */\n  if (ip4_addr_isloopback(dest)) {\n    /* don't check for link on loopback traffic */\n    if (netif_default != NULL && netif_is_up(netif_default)) {\n      return netif_default;\n    }\n    /* default netif is not up, just use any netif for loopback traffic */\n    for (netif = netif_list; netif != NULL; netif = netif->next) {\n      if (netif_is_up(netif)) {\n        return netif;\n      }\n    }\n    return NULL;\n  }\n#endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */\n\n#ifdef LWIP_HOOK_IP4_ROUTE_SRC\n  netif = LWIP_HOOK_IP4_ROUTE_SRC(dest, NULL);\n  if (netif != NULL) {\n    return netif;\n  }\n#elif defined(LWIP_HOOK_IP4_ROUTE)\n  netif = LWIP_HOOK_IP4_ROUTE(dest);\n  if (netif != NULL) {\n    return netif;\n  }\n#endif\n\n  if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default) ||\n      ip4_addr_isany_val(*netif_ip4_addr(netif_default))) {\n    /* No matching netif found and default netif is not usable.\n       If this is not good enough for you, use LWIP_HOOK_IP4_ROUTE() */\n    LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"ip4_route: No route to %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n      ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));\n    IP_STATS_INC(ip.rterr);\n    MIB2_STATS_INC(mib2.ipoutnoroutes);\n    return NULL;\n  }\n\n  return netif_default;\n}\n\n#if IP_FORWARD\n/**\n * Determine whether an IP address is in a reserved set of addresses\n * that may not be forwarded, or whether datagrams to that destination\n * may be forwarded.\n * @param p the packet to forward\n * @return 1: can forward 0: discard\n */\nstatic int\nip4_canforward(struct pbuf *p)\n{\n  u32_t addr = lwip_htonl(ip4_addr_get_u32(ip4_current_dest_addr()));\n\n  if (p->flags & PBUF_FLAG_LLBCAST) {\n    /* don't route link-layer broadcasts */\n    return 0;\n  }\n  if ((p->flags & PBUF_FLAG_LLMCAST) && !IP_MULTICAST(addr)) {\n    /* don't route link-layer multicasts unless the destination address is an IP\n       multicast address */\n    return 0;\n  }\n  if (IP_EXPERIMENTAL(addr)) {\n    return 0;\n  }\n  if (IP_CLASSA(addr)) {\n    u32_t net = addr & IP_CLASSA_NET;\n    if ((net == 0) || (net == ((u32_t)IP_LOOPBACKNET << IP_CLASSA_NSHIFT))) {\n      /* don't route loopback packets */\n      return 0;\n    }\n  }\n  return 1;\n}\n\n/**\n * Forwards an IP packet. It finds an appropriate route for the\n * packet, decrements the TTL value of the packet, adjusts the\n * checksum and outputs the packet on the appropriate interface.\n *\n * @param p the packet to forward (p->payload points to IP header)\n * @param iphdr the IP header of the input packet\n * @param inp the netif on which this packet was received\n */\nstatic void\nip4_forward(struct pbuf *p, struct ip_hdr *iphdr, struct netif *inp)\n{\n  struct netif *netif;\n\n  PERF_START;\n  LWIP_UNUSED_ARG(inp);\n\n  if (!ip4_canforward(p)) {\n    goto return_noroute;\n  }\n\n  /* RFC3927 2.7: do not forward link-local addresses */\n  if (ip4_addr_islinklocal(ip4_current_dest_addr())) {\n    LWIP_DEBUGF(IP_DEBUG, (\"ip4_forward: not forwarding LLA %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n      ip4_addr1_16(ip4_current_dest_addr()), ip4_addr2_16(ip4_current_dest_addr()),\n      ip4_addr3_16(ip4_current_dest_addr()), ip4_addr4_16(ip4_current_dest_addr())));\n    goto return_noroute;\n  }\n\n  /* Find network interface where to forward this IP packet to. */\n  netif = ip4_route_src(ip4_current_dest_addr(), ip4_current_src_addr());\n  if (netif == NULL) {\n    LWIP_DEBUGF(IP_DEBUG, (\"ip4_forward: no forwarding route for %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\" found\\n\",\n      ip4_addr1_16(ip4_current_dest_addr()), ip4_addr2_16(ip4_current_dest_addr()),\n      ip4_addr3_16(ip4_current_dest_addr()), ip4_addr4_16(ip4_current_dest_addr())));\n    /* @todo: send ICMP_DUR_NET? */\n    goto return_noroute;\n  }\n#if !IP_FORWARD_ALLOW_TX_ON_RX_NETIF\n  /* Do not forward packets onto the same network interface on which\n   * they arrived. */\n  if (netif == inp) {\n    LWIP_DEBUGF(IP_DEBUG, (\"ip4_forward: not bouncing packets back on incoming interface.\\n\"));\n    goto return_noroute;\n  }\n#endif /* IP_FORWARD_ALLOW_TX_ON_RX_NETIF */\n\n  /* decrement TTL */\n  IPH_TTL_SET(iphdr, IPH_TTL(iphdr) - 1);\n  /* send ICMP if TTL == 0 */\n  if (IPH_TTL(iphdr) == 0) {\n    MIB2_STATS_INC(mib2.ipinhdrerrors);\n#if LWIP_ICMP\n    /* Don't send ICMP messages in response to ICMP messages */\n    if (IPH_PROTO(iphdr) != IP_PROTO_ICMP) {\n      icmp_time_exceeded(p, ICMP_TE_TTL);\n    }\n#endif /* LWIP_ICMP */\n    return;\n  }\n\n  /* Incrementally update the IP checksum. */\n  if (IPH_CHKSUM(iphdr) >= PP_HTONS(0xffffU - 0x100)) {\n    IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100) + 1);\n  } else {\n    IPH_CHKSUM_SET(iphdr, IPH_CHKSUM(iphdr) + PP_HTONS(0x100));\n  }\n\n  LWIP_DEBUGF(IP_DEBUG, (\"ip4_forward: forwarding packet to %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n    ip4_addr1_16(ip4_current_dest_addr()), ip4_addr2_16(ip4_current_dest_addr()),\n    ip4_addr3_16(ip4_current_dest_addr()), ip4_addr4_16(ip4_current_dest_addr())));\n\n  IP_STATS_INC(ip.fw);\n  MIB2_STATS_INC(mib2.ipforwdatagrams);\n  IP_STATS_INC(ip.xmit);\n\n  PERF_STOP(\"ip4_forward\");\n  /* don't fragment if interface has mtu set to 0 [loopif] */\n  if (netif->mtu && (p->tot_len > netif->mtu)) {\n    if ((IPH_OFFSET(iphdr) & PP_NTOHS(IP_DF)) == 0) {\n#if IP_FRAG\n      ip4_frag(p, netif, ip4_current_dest_addr());\n#else /* IP_FRAG */\n      /* @todo: send ICMP Destination Unreachable code 13 \"Communication administratively prohibited\"? */\n#endif /* IP_FRAG */\n    } else {\n#if LWIP_ICMP\n      /* send ICMP Destination Unreachable code 4: \"Fragmentation Needed and DF Set\" */\n      icmp_dest_unreach(p, ICMP_DUR_FRAG);\n#endif /* LWIP_ICMP */\n    }\n    return;\n  }\n  /* transmit pbuf on chosen interface */\n  netif->output(netif, p, ip4_current_dest_addr());\n  return;\nreturn_noroute:\n  MIB2_STATS_INC(mib2.ipoutnoroutes);\n}\n#endif /* IP_FORWARD */\n\n/**\n * This function is called by the network interface device driver when\n * an IP packet is received. The function does the basic checks of the\n * IP header such as packet size being at least larger than the header\n * size etc. If the packet was not destined for us, the packet is\n * forwarded (using ip_forward). The IP checksum is always checked.\n *\n * Finally, the packet is sent to the upper layer protocol input function.\n *\n * @param p the received IP packet (p->payload points to IP header)\n * @param inp the netif on which this packet was received\n * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't\n *         processed, but currently always returns ERR_OK)\n */\nerr_t\nip4_input(struct pbuf *p, struct netif *inp)\n{\n  struct ip_hdr *iphdr;\n  struct netif *netif;\n  u16_t iphdr_hlen;\n  u16_t iphdr_len;\n#if IP_ACCEPT_LINK_LAYER_ADDRESSING || LWIP_IGMP\n  int check_ip_src = 1;\n#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING || LWIP_IGMP */\n\n  IP_STATS_INC(ip.recv);\n  MIB2_STATS_INC(mib2.ipinreceives);\n\n  /* identify the IP header */\n  iphdr = (struct ip_hdr *)p->payload;\n  if (IPH_V(iphdr) != 4) {\n    LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_WARNING, (\"IP packet dropped due to bad version number %\"U16_F\"\\n\", (u16_t)IPH_V(iphdr)));\n    ip4_debug_print(p);\n    pbuf_free(p);\n    IP_STATS_INC(ip.err);\n    IP_STATS_INC(ip.drop);\n    MIB2_STATS_INC(mib2.ipinhdrerrors);\n    return ERR_OK;\n  }\n\n#ifdef LWIP_HOOK_IP4_INPUT\n  if (LWIP_HOOK_IP4_INPUT(p, inp)) {\n    /* the packet has been eaten */\n    return ERR_OK;\n  }\n#endif\n\n  /* obtain IP header length in number of 32-bit words */\n  iphdr_hlen = IPH_HL(iphdr);\n  /* calculate IP header length in bytes */\n  iphdr_hlen *= 4;\n  /* obtain ip length in bytes */\n  iphdr_len = lwip_ntohs(IPH_LEN(iphdr));\n\n  /* Trim pbuf. This is especially required for packets < 60 bytes. */\n  if (iphdr_len < p->tot_len) {\n    pbuf_realloc(p, iphdr_len);\n  }\n\n  /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */\n  if ((iphdr_hlen > p->len) || (iphdr_len > p->tot_len) || (iphdr_hlen < IP_HLEN)) {\n    if (iphdr_hlen < IP_HLEN) {\n      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n        (\"ip4_input: short IP header (%\"U16_F\" bytes) received, IP packet dropped\\n\", iphdr_hlen));\n    }\n    if (iphdr_hlen > p->len) {\n      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n        (\"IP header (len %\"U16_F\") does not fit in first pbuf (len %\"U16_F\"), IP packet dropped.\\n\",\n        iphdr_hlen, p->len));\n    }\n    if (iphdr_len > p->tot_len) {\n      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n        (\"IP (len %\"U16_F\") is longer than pbuf (len %\"U16_F\"), IP packet dropped.\\n\",\n        iphdr_len, p->tot_len));\n    }\n    /* free (drop) packet pbufs */\n    pbuf_free(p);\n    IP_STATS_INC(ip.lenerr);\n    IP_STATS_INC(ip.drop);\n    MIB2_STATS_INC(mib2.ipindiscards);\n    return ERR_OK;\n  }\n\n  /* verify checksum */\n#if CHECKSUM_CHECK_IP\n  IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_IP) {\n    if (inet_chksum(iphdr, iphdr_hlen) != 0) {\n\n      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n        (\"Checksum (0x%\"X16_F\") failed, IP packet dropped.\\n\", inet_chksum(iphdr, iphdr_hlen)));\n      ip4_debug_print(p);\n      pbuf_free(p);\n      IP_STATS_INC(ip.chkerr);\n      IP_STATS_INC(ip.drop);\n      MIB2_STATS_INC(mib2.ipinhdrerrors);\n      return ERR_OK;\n    }\n  }\n#endif\n\n  /* copy IP addresses to aligned ip_addr_t */\n  ip_addr_copy_from_ip4(ip_data.current_iphdr_dest, iphdr->dest);\n  ip_addr_copy_from_ip4(ip_data.current_iphdr_src, iphdr->src);\n\n  /* match packet against an interface, i.e. is this packet for us? */\n  if (ip4_addr_ismulticast(ip4_current_dest_addr())) {\n#if LWIP_IGMP\n    if ((inp->flags & NETIF_FLAG_IGMP) && (igmp_lookfor_group(inp, ip4_current_dest_addr()))) {\n      /* IGMP snooping switches need 0.0.0.0 to be allowed as source address (RFC 4541) */\n      ip4_addr_t allsystems;\n      IP4_ADDR(&allsystems, 224, 0, 0, 1);\n      if (ip4_addr_cmp(ip4_current_dest_addr(), &allsystems) &&\n          ip4_addr_isany(ip4_current_src_addr())) {\n        check_ip_src = 0;\n      }\n      netif = inp;\n    } else {\n      netif = NULL;\n    }\n#else /* LWIP_IGMP */\n    if ((netif_is_up(inp)) && (!ip4_addr_isany_val(*netif_ip4_addr(inp)))) {\n      netif = inp;\n    } else {\n      netif = NULL;\n    }\n#endif /* LWIP_IGMP */\n  } else {\n    /* start trying with inp. if that's not acceptable, start walking the\n       list of configured netifs.\n       'first' is used as a boolean to mark whether we started walking the list */\n    int first = 1;\n    netif = inp;\n    do {\n      LWIP_DEBUGF(IP_DEBUG, (\"ip_input: iphdr->dest 0x%\"X32_F\" netif->ip_addr 0x%\"X32_F\" (0x%\"X32_F\", 0x%\"X32_F\", 0x%\"X32_F\")\\n\",\n          ip4_addr_get_u32(&iphdr->dest), ip4_addr_get_u32(netif_ip4_addr(netif)),\n          ip4_addr_get_u32(&iphdr->dest) & ip4_addr_get_u32(netif_ip4_netmask(netif)),\n          ip4_addr_get_u32(netif_ip4_addr(netif)) & ip4_addr_get_u32(netif_ip4_netmask(netif)),\n          ip4_addr_get_u32(&iphdr->dest) & ~ip4_addr_get_u32(netif_ip4_netmask(netif))));\n\n      /* interface is up and configured? */\n      if ((netif_is_up(netif)) && (!ip4_addr_isany_val(*netif_ip4_addr(netif)))) {\n        /* unicast to this interface address? */\n        if (ip4_addr_cmp(ip4_current_dest_addr(), netif_ip4_addr(netif)) ||\n            /* or broadcast on this interface network address? */\n            ip4_addr_isbroadcast(ip4_current_dest_addr(), netif)\n#if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF\n            || (ip4_addr_get_u32(ip4_current_dest_addr()) == PP_HTONL(IPADDR_LOOPBACK))\n#endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */\n            ) {\n          LWIP_DEBUGF(IP_DEBUG, (\"ip4_input: packet accepted on interface %c%c\\n\",\n              netif->name[0], netif->name[1]));\n          /* break out of for loop */\n          break;\n        }\n#if LWIP_AUTOIP\n        /* connections to link-local addresses must persist after changing\n           the netif's address (RFC3927 ch. 1.9) */\n        if (autoip_accept_packet(netif, ip4_current_dest_addr())) {\n          LWIP_DEBUGF(IP_DEBUG, (\"ip4_input: LLA packet accepted on interface %c%c\\n\",\n              netif->name[0], netif->name[1]));\n          /* break out of for loop */\n          break;\n        }\n#endif /* LWIP_AUTOIP */\n      }\n      if (first) {\n#if !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF\n        /* Packets sent to the loopback address must not be accepted on an\n         * interface that does not have the loopback address assigned to it,\n         * unless a non-loopback interface is used for loopback traffic. */\n        if (ip4_addr_isloopback(ip4_current_dest_addr())) {\n          netif = NULL;\n          break;\n        }\n#endif /* !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF */\n        first = 0;\n        netif = netif_list;\n      } else {\n        netif = netif->next;\n      }\n      if (netif == inp) {\n        netif = netif->next;\n      }\n    } while (netif != NULL);\n  }\n\n#if IP_ACCEPT_LINK_LAYER_ADDRESSING\n  /* Pass DHCP messages regardless of destination address. DHCP traffic is addressed\n   * using link layer addressing (such as Ethernet MAC) so we must not filter on IP.\n   * According to RFC 1542 section 3.1.1, referred by RFC 2131).\n   *\n   * If you want to accept private broadcast communication while a netif is down,\n   * define LWIP_IP_ACCEPT_UDP_PORT(dst_port), e.g.:\n   *\n   * #define LWIP_IP_ACCEPT_UDP_PORT(dst_port) ((dst_port) == PP_NTOHS(12345))\n   */\n  if (netif == NULL) {\n    /* remote port is DHCP server? */\n    if (IPH_PROTO(iphdr) == IP_PROTO_UDP) {\n      struct udp_hdr *udphdr = (struct udp_hdr *)((u8_t *)iphdr + iphdr_hlen);\n      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, (\"ip4_input: UDP packet to DHCP client port %\"U16_F\"\\n\",\n        lwip_ntohs(udphdr->dest)));\n      if (IP_ACCEPT_LINK_LAYER_ADDRESSED_PORT(udphdr->dest)) {\n        LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, (\"ip4_input: DHCP packet accepted.\\n\"));\n        netif = inp;\n        check_ip_src = 0;\n      }\n    }\n  }\n#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */\n\n  /* broadcast or multicast packet source address? Compliant with RFC 1122: 3.2.1.3 */\n#if LWIP_IGMP || IP_ACCEPT_LINK_LAYER_ADDRESSING\n  if (check_ip_src\n#if IP_ACCEPT_LINK_LAYER_ADDRESSING\n  /* DHCP servers need 0.0.0.0 to be allowed as source address (RFC 1.1.2.2: 3.2.1.3/a) */\n      && !ip4_addr_isany_val(*ip4_current_src_addr())\n#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */\n     )\n#endif /* LWIP_IGMP || IP_ACCEPT_LINK_LAYER_ADDRESSING */\n  {\n    if ((ip4_addr_isbroadcast(ip4_current_src_addr(), inp)) ||\n        (ip4_addr_ismulticast(ip4_current_src_addr()))) {\n      /* packet source is not valid */\n      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING, (\"ip4_input: packet source is not valid.\\n\"));\n      /* free (drop) packet pbufs */\n      pbuf_free(p);\n      IP_STATS_INC(ip.drop);\n      MIB2_STATS_INC(mib2.ipinaddrerrors);\n      MIB2_STATS_INC(mib2.ipindiscards);\n      return ERR_OK;\n    }\n  }\n\n  /* packet not for us? */\n  if (netif == NULL) {\n    /* packet not for us, route or discard */\n    LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_TRACE, (\"ip4_input: packet not for us.\\n\"));\n#if IP_FORWARD\n    /* non-broadcast packet? */\n    if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), inp)) {\n      /* try to forward IP packet on (other) interfaces */\n      ip4_forward(p, iphdr, inp);\n    } else\n#endif /* IP_FORWARD */\n    {\n      IP_STATS_INC(ip.drop);\n      MIB2_STATS_INC(mib2.ipinaddrerrors);\n      MIB2_STATS_INC(mib2.ipindiscards);\n    }\n    pbuf_free(p);\n    return ERR_OK;\n  }\n  /* packet consists of multiple fragments? */\n  if ((IPH_OFFSET(iphdr) & PP_HTONS(IP_OFFMASK | IP_MF)) != 0) {\n#if IP_REASSEMBLY /* packet fragment reassembly code present? */\n    LWIP_DEBUGF(IP_DEBUG, (\"IP packet is a fragment (id=0x%04\"X16_F\" tot_len=%\"U16_F\" len=%\"U16_F\" MF=%\"U16_F\" offset=%\"U16_F\"), calling ip4_reass()\\n\",\n      lwip_ntohs(IPH_ID(iphdr)), p->tot_len, lwip_ntohs(IPH_LEN(iphdr)), (u16_t)!!(IPH_OFFSET(iphdr) & PP_HTONS(IP_MF)), (u16_t)((lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)*8)));\n    /* reassemble the packet*/\n    p = ip4_reass(p);\n    /* packet not fully reassembled yet? */\n    if (p == NULL) {\n      return ERR_OK;\n    }\n    iphdr = (struct ip_hdr *)p->payload;\n#else /* IP_REASSEMBLY == 0, no packet fragment reassembly code present */\n    pbuf_free(p);\n    LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"IP packet dropped since it was fragmented (0x%\"X16_F\") (while IP_REASSEMBLY == 0).\\n\",\n      lwip_ntohs(IPH_OFFSET(iphdr))));\n    IP_STATS_INC(ip.opterr);\n    IP_STATS_INC(ip.drop);\n    /* unsupported protocol feature */\n    MIB2_STATS_INC(mib2.ipinunknownprotos);\n    return ERR_OK;\n#endif /* IP_REASSEMBLY */\n  }\n\n#if IP_OPTIONS_ALLOWED == 0 /* no support for IP options in the IP header? */\n\n#if LWIP_IGMP\n  /* there is an extra \"router alert\" option in IGMP messages which we allow for but do not police */\n  if ((iphdr_hlen > IP_HLEN) &&  (IPH_PROTO(iphdr) != IP_PROTO_IGMP)) {\n#else\n  if (iphdr_hlen > IP_HLEN) {\n#endif /* LWIP_IGMP */\n    LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"IP packet dropped since there were IP options (while IP_OPTIONS_ALLOWED == 0).\\n\"));\n    pbuf_free(p);\n    IP_STATS_INC(ip.opterr);\n    IP_STATS_INC(ip.drop);\n    /* unsupported protocol feature */\n    MIB2_STATS_INC(mib2.ipinunknownprotos);\n    return ERR_OK;\n  }\n#endif /* IP_OPTIONS_ALLOWED == 0 */\n\n  /* send to upper layers */\n  LWIP_DEBUGF(IP_DEBUG, (\"ip4_input: \\n\"));\n  ip4_debug_print(p);\n  LWIP_DEBUGF(IP_DEBUG, (\"ip4_input: p->len %\"U16_F\" p->tot_len %\"U16_F\"\\n\", p->len, p->tot_len));\n\n  ip_data.current_netif = netif;\n  ip_data.current_input_netif = inp;\n  ip_data.current_ip4_header = iphdr;\n  ip_data.current_ip_header_tot_len = IPH_HL(iphdr) * 4;\n\n#if LWIP_RAW\n  /* raw input did not eat the packet? */\n  if (raw_input(p, inp) == 0)\n#endif /* LWIP_RAW */\n  {\n    pbuf_header(p, -(s16_t)iphdr_hlen); /* Move to payload, no check necessary. */\n\n    switch (IPH_PROTO(iphdr)) {\n#if LWIP_UDP\n    case IP_PROTO_UDP:\n#if LWIP_UDPLITE\n    case IP_PROTO_UDPLITE:\n#endif /* LWIP_UDPLITE */\n      MIB2_STATS_INC(mib2.ipindelivers);\n      udp_input(p, inp);\n      break;\n#endif /* LWIP_UDP */\n#if LWIP_TCP\n    case IP_PROTO_TCP:\n      MIB2_STATS_INC(mib2.ipindelivers);\n      tcp_input(p, inp);\n      break;\n#endif /* LWIP_TCP */\n#if LWIP_ICMP\n    case IP_PROTO_ICMP:\n      MIB2_STATS_INC(mib2.ipindelivers);\n      icmp_input(p, inp);\n      break;\n#endif /* LWIP_ICMP */\n#if LWIP_IGMP\n    case IP_PROTO_IGMP:\n      igmp_input(p, inp, ip4_current_dest_addr());\n      break;\n#endif /* LWIP_IGMP */\n    default:\n#if LWIP_ICMP\n      /* send ICMP destination protocol unreachable unless is was a broadcast */\n      if (!ip4_addr_isbroadcast(ip4_current_dest_addr(), netif) &&\n          !ip4_addr_ismulticast(ip4_current_dest_addr())) {\n        pbuf_header_force(p, iphdr_hlen); /* Move to ip header, no check necessary. */\n        p->payload = iphdr;\n        icmp_dest_unreach(p, ICMP_DUR_PROTO);\n      }\n#endif /* LWIP_ICMP */\n      pbuf_free(p);\n\n      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"Unsupported transport protocol %\"U16_F\"\\n\", (u16_t)IPH_PROTO(iphdr)));\n\n      IP_STATS_INC(ip.proterr);\n      IP_STATS_INC(ip.drop);\n      MIB2_STATS_INC(mib2.ipinunknownprotos);\n    }\n  }\n\n  /* @todo: this is not really necessary... */\n  ip_data.current_netif = NULL;\n  ip_data.current_input_netif = NULL;\n  ip_data.current_ip4_header = NULL;\n  ip_data.current_ip_header_tot_len = 0;\n  ip4_addr_set_any(ip4_current_src_addr());\n  ip4_addr_set_any(ip4_current_dest_addr());\n\n  return ERR_OK;\n}\n\n/**\n * Sends an IP packet on a network interface. This function constructs\n * the IP header and calculates the IP header checksum. If the source\n * IP address is NULL, the IP address of the outgoing network\n * interface is filled in as source address.\n * If the destination IP address is LWIP_IP_HDRINCL, p is assumed to already\n * include an IP header and p->payload points to it instead of the data.\n *\n * @param p the packet to send (p->payload points to the data, e.g. next\n            protocol header; if dest == LWIP_IP_HDRINCL, p already includes an\n            IP header and p->payload points to that IP header)\n * @param src the source IP address to send from (if src == IP4_ADDR_ANY, the\n *         IP  address of the netif used to send is used as source address)\n * @param dest the destination IP address to send the packet to\n * @param ttl the TTL value to be set in the IP header\n * @param tos the TOS value to be set in the IP header\n * @param proto the PROTOCOL to be set in the IP header\n * @param netif the netif on which to send this packet\n * @return ERR_OK if the packet was sent OK\n *         ERR_BUF if p doesn't have enough space for IP/LINK headers\n *         returns errors returned by netif->output\n *\n * @note ip_id: RFC791 \"some host may be able to simply use\n *  unique identifiers independent of destination\"\n */\nerr_t\nip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n             u8_t ttl, u8_t tos,\n             u8_t proto, struct netif *netif)\n{\n#if IP_OPTIONS_SEND\n  return ip4_output_if_opt(p, src, dest, ttl, tos, proto, netif, NULL, 0);\n}\n\n/**\n * Same as ip_output_if() but with the possibility to include IP options:\n *\n * @ param ip_options pointer to the IP options, copied into the IP header\n * @ param optlen length of ip_options\n */\nerr_t\nip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n       u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,\n       u16_t optlen)\n{\n#endif /* IP_OPTIONS_SEND */\n  const ip4_addr_t *src_used = src;\n  if (dest != LWIP_IP_HDRINCL) {\n    if (ip4_addr_isany(src)) {\n      src_used = netif_ip4_addr(netif);\n    }\n  }\n\n#if IP_OPTIONS_SEND\n  return ip4_output_if_opt_src(p, src_used, dest, ttl, tos, proto, netif,\n    ip_options, optlen);\n#else /* IP_OPTIONS_SEND */\n  return ip4_output_if_src(p, src_used, dest, ttl, tos, proto, netif);\n#endif /* IP_OPTIONS_SEND */\n}\n\n/**\n * Same as ip_output_if() but 'src' address is not replaced by netif address\n * when it is 'any'.\n */\nerr_t\nip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n             u8_t ttl, u8_t tos,\n             u8_t proto, struct netif *netif)\n{\n#if IP_OPTIONS_SEND\n  return ip4_output_if_opt_src(p, src, dest, ttl, tos, proto, netif, NULL, 0);\n}\n\n/**\n * Same as ip_output_if_opt() but 'src' address is not replaced by netif address\n * when it is 'any'.\n */\nerr_t\nip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n       u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,\n       u16_t optlen)\n{\n#endif /* IP_OPTIONS_SEND */\n  struct ip_hdr *iphdr;\n  ip4_addr_t dest_addr;\n#if CHECKSUM_GEN_IP_INLINE\n  u32_t chk_sum = 0;\n#endif /* CHECKSUM_GEN_IP_INLINE */\n\n  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);\n\n  MIB2_STATS_INC(mib2.ipoutrequests);\n\n  /* Should the IP header be generated or is it already included in p? */\n  if (dest != LWIP_IP_HDRINCL) {\n    u16_t ip_hlen = IP_HLEN;\n#if IP_OPTIONS_SEND\n    u16_t optlen_aligned = 0;\n    if (optlen != 0) {\n#if CHECKSUM_GEN_IP_INLINE\n      int i;\n#endif /* CHECKSUM_GEN_IP_INLINE */\n      /* round up to a multiple of 4 */\n      optlen_aligned = ((optlen + 3) & ~3);\n      ip_hlen += optlen_aligned;\n      /* First write in the IP options */\n      if (pbuf_header(p, optlen_aligned)) {\n        LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"ip4_output_if_opt: not enough room for IP options in pbuf\\n\"));\n        IP_STATS_INC(ip.err);\n        MIB2_STATS_INC(mib2.ipoutdiscards);\n        return ERR_BUF;\n      }\n      MEMCPY(p->payload, ip_options, optlen);\n      if (optlen < optlen_aligned) {\n        /* zero the remaining bytes */\n        memset(((char*)p->payload) + optlen, 0, optlen_aligned - optlen);\n      }\n#if CHECKSUM_GEN_IP_INLINE\n      for (i = 0; i < optlen_aligned/2; i++) {\n        chk_sum += ((u16_t*)p->payload)[i];\n      }\n#endif /* CHECKSUM_GEN_IP_INLINE */\n    }\n#endif /* IP_OPTIONS_SEND */\n    /* generate IP header */\n    if (pbuf_header(p, IP_HLEN)) {\n      LWIP_DEBUGF(IP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"ip4_output: not enough room for IP header in pbuf\\n\"));\n\n      IP_STATS_INC(ip.err);\n      MIB2_STATS_INC(mib2.ipoutdiscards);\n      return ERR_BUF;\n    }\n\n    iphdr = (struct ip_hdr *)p->payload;\n    LWIP_ASSERT(\"check that first pbuf can hold struct ip_hdr\",\n               (p->len >= sizeof(struct ip_hdr)));\n\n    IPH_TTL_SET(iphdr, ttl);\n    IPH_PROTO_SET(iphdr, proto);\n#if CHECKSUM_GEN_IP_INLINE\n    chk_sum += PP_NTOHS(proto | (ttl << 8));\n#endif /* CHECKSUM_GEN_IP_INLINE */\n\n    /* dest cannot be NULL here */\n    ip4_addr_copy(iphdr->dest, *dest);\n#if CHECKSUM_GEN_IP_INLINE\n    chk_sum += ip4_addr_get_u32(&iphdr->dest) & 0xFFFF;\n    chk_sum += ip4_addr_get_u32(&iphdr->dest) >> 16;\n#endif /* CHECKSUM_GEN_IP_INLINE */\n\n    IPH_VHL_SET(iphdr, 4, ip_hlen / 4);\n    IPH_TOS_SET(iphdr, tos);\n#if CHECKSUM_GEN_IP_INLINE\n    chk_sum += PP_NTOHS(tos | (iphdr->_v_hl << 8));\n#endif /* CHECKSUM_GEN_IP_INLINE */\n    IPH_LEN_SET(iphdr, lwip_htons(p->tot_len));\n#if CHECKSUM_GEN_IP_INLINE\n    chk_sum += iphdr->_len;\n#endif /* CHECKSUM_GEN_IP_INLINE */\n    IPH_OFFSET_SET(iphdr, 0);\n    IPH_ID_SET(iphdr, lwip_htons(ip_id));\n#if CHECKSUM_GEN_IP_INLINE\n    chk_sum += iphdr->_id;\n#endif /* CHECKSUM_GEN_IP_INLINE */\n    ++ip_id;\n\n    if (src == NULL) {\n      ip4_addr_copy(iphdr->src, *IP4_ADDR_ANY4);\n    } else {\n      /* src cannot be NULL here */\n      ip4_addr_copy(iphdr->src, *src);\n    }\n\n#if CHECKSUM_GEN_IP_INLINE\n    chk_sum += ip4_addr_get_u32(&iphdr->src) & 0xFFFF;\n    chk_sum += ip4_addr_get_u32(&iphdr->src) >> 16;\n    chk_sum = (chk_sum >> 16) + (chk_sum & 0xFFFF);\n    chk_sum = (chk_sum >> 16) + chk_sum;\n    chk_sum = ~chk_sum;\n    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) {\n      iphdr->_chksum = (u16_t)chk_sum; /* network order */\n    }\n#if LWIP_CHECKSUM_CTRL_PER_NETIF\n    else {\n      IPH_CHKSUM_SET(iphdr, 0);\n    }\n#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF*/\n#else /* CHECKSUM_GEN_IP_INLINE */\n    IPH_CHKSUM_SET(iphdr, 0);\n#if CHECKSUM_GEN_IP\n    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) {\n      IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, ip_hlen));\n    }\n#endif /* CHECKSUM_GEN_IP */\n#endif /* CHECKSUM_GEN_IP_INLINE */\n  } else {\n    /* IP header already included in p */\n    iphdr = (struct ip_hdr *)p->payload;\n    ip4_addr_copy(dest_addr, iphdr->dest);\n    dest = &dest_addr;\n  }\n\n  IP_STATS_INC(ip.xmit);\n\n  LWIP_DEBUGF(IP_DEBUG, (\"ip4_output_if: %c%c%\"U16_F\"\\n\", netif->name[0], netif->name[1], (u16_t)netif->num));\n  ip4_debug_print(p);\n\n#if ENABLE_LOOPBACK\n  if (ip4_addr_cmp(dest, netif_ip4_addr(netif))\n#if !LWIP_HAVE_LOOPIF\n      || ip4_addr_isloopback(dest)\n#endif /* !LWIP_HAVE_LOOPIF */\n      ) {\n    /* Packet to self, enqueue it for loopback */\n    LWIP_DEBUGF(IP_DEBUG, (\"netif_loop_output()\"));\n    return netif_loop_output(netif, p);\n  }\n#if LWIP_MULTICAST_TX_OPTIONS\n  if ((p->flags & PBUF_FLAG_MCASTLOOP) != 0) {\n    netif_loop_output(netif, p);\n  }\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n#endif /* ENABLE_LOOPBACK */\n#if IP_FRAG\n  /* don't fragment if interface has mtu set to 0 [loopif] */\n  if (netif->mtu && (p->tot_len > netif->mtu)) {\n    return ip4_frag(p, netif, dest);\n  }\n#endif /* IP_FRAG */\n\n  LWIP_DEBUGF(IP_DEBUG, (\"ip4_output_if: call netif->output()\\n\"));\n  return netif->output(netif, p, dest);\n}\n\n/**\n * Simple interface to ip_output_if. It finds the outgoing network\n * interface and calls upon ip_output_if to do the actual work.\n *\n * @param p the packet to send (p->payload points to the data, e.g. next\n            protocol header; if dest == LWIP_IP_HDRINCL, p already includes an\n            IP header and p->payload points to that IP header)\n * @param src the source IP address to send from (if src == IP4_ADDR_ANY, the\n *         IP  address of the netif used to send is used as source address)\n * @param dest the destination IP address to send the packet to\n * @param ttl the TTL value to be set in the IP header\n * @param tos the TOS value to be set in the IP header\n * @param proto the PROTOCOL to be set in the IP header\n *\n * @return ERR_RTE if no route is found\n *         see ip_output_if() for more return values\n */\nerr_t\nip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n          u8_t ttl, u8_t tos, u8_t proto)\n{\n  struct netif *netif;\n\n  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);\n\n  if ((netif = ip4_route_src(dest, src)) == NULL) {\n    LWIP_DEBUGF(IP_DEBUG, (\"ip4_output: No route to %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n      ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));\n    IP_STATS_INC(ip.rterr);\n    return ERR_RTE;\n  }\n\n  return ip4_output_if(p, src, dest, ttl, tos, proto, netif);\n}\n\n#if LWIP_NETIF_HWADDRHINT\n/** Like ip_output, but takes and addr_hint pointer that is passed on to netif->addr_hint\n *  before calling ip_output_if.\n *\n * @param p the packet to send (p->payload points to the data, e.g. next\n            protocol header; if dest == LWIP_IP_HDRINCL, p already includes an\n            IP header and p->payload points to that IP header)\n * @param src the source IP address to send from (if src == IP4_ADDR_ANY, the\n *         IP  address of the netif used to send is used as source address)\n * @param dest the destination IP address to send the packet to\n * @param ttl the TTL value to be set in the IP header\n * @param tos the TOS value to be set in the IP header\n * @param proto the PROTOCOL to be set in the IP header\n * @param addr_hint address hint pointer set to netif->addr_hint before\n *        calling ip_output_if()\n *\n * @return ERR_RTE if no route is found\n *         see ip_output_if() for more return values\n */\nerr_t\nip4_output_hinted(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n          u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint)\n{\n  struct netif *netif;\n  err_t err;\n\n  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);\n\n  if ((netif = ip4_route_src(dest, src)) == NULL) {\n    LWIP_DEBUGF(IP_DEBUG, (\"ip4_output: No route to %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n      ip4_addr1_16(dest), ip4_addr2_16(dest), ip4_addr3_16(dest), ip4_addr4_16(dest)));\n    IP_STATS_INC(ip.rterr);\n    return ERR_RTE;\n  }\n\n  NETIF_SET_HWADDRHINT(netif, addr_hint);\n  err = ip4_output_if(p, src, dest, ttl, tos, proto, netif);\n  NETIF_SET_HWADDRHINT(netif, NULL);\n\n  return err;\n}\n#endif /* LWIP_NETIF_HWADDRHINT*/\n\n#if IP_DEBUG\n/* Print an IP header by using LWIP_DEBUGF\n * @param p an IP packet, p->payload pointing to the IP header\n */\nvoid\nip4_debug_print(struct pbuf *p)\n{\n  struct ip_hdr *iphdr = (struct ip_hdr *)p->payload;\n\n  LWIP_DEBUGF(IP_DEBUG, (\"IP header:\\n\"));\n  LWIP_DEBUGF(IP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(IP_DEBUG, (\"|%2\"S16_F\" |%2\"S16_F\" |  0x%02\"X16_F\" |     %5\"U16_F\"     | (v, hl, tos, len)\\n\",\n                    (u16_t)IPH_V(iphdr),\n                    (u16_t)IPH_HL(iphdr),\n                    (u16_t)IPH_TOS(iphdr),\n                    lwip_ntohs(IPH_LEN(iphdr))));\n  LWIP_DEBUGF(IP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(IP_DEBUG, (\"|    %5\"U16_F\"      |%\"U16_F\"%\"U16_F\"%\"U16_F\"|    %4\"U16_F\"   | (id, flags, offset)\\n\",\n                    lwip_ntohs(IPH_ID(iphdr)),\n                    (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 15 & 1),\n                    (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 14 & 1),\n                    (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) >> 13 & 1),\n                    (u16_t)(lwip_ntohs(IPH_OFFSET(iphdr)) & IP_OFFMASK)));\n  LWIP_DEBUGF(IP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(IP_DEBUG, (\"|  %3\"U16_F\"  |  %3\"U16_F\"  |    0x%04\"X16_F\"     | (ttl, proto, chksum)\\n\",\n                    (u16_t)IPH_TTL(iphdr),\n                    (u16_t)IPH_PROTO(iphdr),\n                    lwip_ntohs(IPH_CHKSUM(iphdr))));\n  LWIP_DEBUGF(IP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(IP_DEBUG, (\"|  %3\"U16_F\"  |  %3\"U16_F\"  |  %3\"U16_F\"  |  %3\"U16_F\"  | (src)\\n\",\n                    ip4_addr1_16(&iphdr->src),\n                    ip4_addr2_16(&iphdr->src),\n                    ip4_addr3_16(&iphdr->src),\n                    ip4_addr4_16(&iphdr->src)));\n  LWIP_DEBUGF(IP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(IP_DEBUG, (\"|  %3\"U16_F\"  |  %3\"U16_F\"  |  %3\"U16_F\"  |  %3\"U16_F\"  | (dest)\\n\",\n                    ip4_addr1_16(&iphdr->dest),\n                    ip4_addr2_16(&iphdr->dest),\n                    ip4_addr3_16(&iphdr->dest),\n                    ip4_addr4_16(&iphdr->dest)));\n  LWIP_DEBUGF(IP_DEBUG, (\"+-------------------------------+\\n\"));\n}\n#endif /* IP_DEBUG */\n\n#endif /* LWIP_IPV4 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv4/ip4_addr.c",
    "content": "/**\n * @file\n * This is the IPv4 address tools implementation.\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV4\n\n#include \"lwip/ip_addr.h\"\n#include \"lwip/netif.h\"\n\n/* used by IP4_ADDR_ANY and IP_ADDR_BROADCAST in ip_addr.h */\nconst ip_addr_t ip_addr_any = IPADDR4_INIT(IPADDR_ANY);\nconst ip_addr_t ip_addr_broadcast = IPADDR4_INIT(IPADDR_BROADCAST);\n\n/**\n * Determine if an address is a broadcast address on a network interface\n *\n * @param addr address to be checked\n * @param netif the network interface against which the address is checked\n * @return returns non-zero if the address is a broadcast address\n */\nu8_t\nip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif)\n{\n  ip4_addr_t ipaddr;\n  ip4_addr_set_u32(&ipaddr, addr);\n\n  /* all ones (broadcast) or all zeroes (old skool broadcast) */\n  if ((~addr == IPADDR_ANY) ||\n      (addr == IPADDR_ANY)) {\n    return 1;\n  /* no broadcast support on this network interface? */\n  } else if ((netif->flags & NETIF_FLAG_BROADCAST) == 0) {\n    /* the given address cannot be a broadcast address\n     * nor can we check against any broadcast addresses */\n    return 0;\n  /* address matches network interface address exactly? => no broadcast */\n  } else if (addr == ip4_addr_get_u32(netif_ip4_addr(netif))) {\n    return 0;\n  /*  on the same (sub) network... */\n  } else if (ip4_addr_netcmp(&ipaddr, netif_ip4_addr(netif), netif_ip4_netmask(netif))\n         /* ...and host identifier bits are all ones? =>... */\n          && ((addr & ~ip4_addr_get_u32(netif_ip4_netmask(netif))) ==\n           (IPADDR_BROADCAST & ~ip4_addr_get_u32(netif_ip4_netmask(netif))))) {\n    /* => network broadcast address */\n    return 1;\n  } else {\n    return 0;\n  }\n}\n\n/** Checks if a netmask is valid (starting with ones, then only zeros)\n *\n * @param netmask the IPv4 netmask to check (in network byte order!)\n * @return 1 if the netmask is valid, 0 if it is not\n */\nu8_t\nip4_addr_netmask_valid(u32_t netmask)\n{\n  u32_t mask;\n  u32_t nm_hostorder = lwip_htonl(netmask);\n\n  /* first, check for the first zero */\n  for (mask = 1UL << 31 ; mask != 0; mask >>= 1) {\n    if ((nm_hostorder & mask) == 0) {\n      break;\n    }\n  }\n  /* then check that there is no one */\n  for (; mask != 0; mask >>= 1) {\n    if ((nm_hostorder & mask) != 0) {\n      /* there is a one after the first zero -> invalid */\n      return 0;\n    }\n  }\n  /* no one after the first zero -> valid */\n  return 1;\n}\n\n/* Here for now until needed in other places in lwIP */\n#ifndef isprint\n#define in_range(c, lo, up)  ((u8_t)c >= lo && (u8_t)c <= up)\n#define isprint(c)           in_range(c, 0x20, 0x7f)\n#define isdigit(c)           in_range(c, '0', '9')\n#define isxdigit(c)          (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))\n#define islower(c)           in_range(c, 'a', 'z')\n#define isspace(c)           (c == ' ' || c == '\\f' || c == '\\n' || c == '\\r' || c == '\\t' || c == '\\v')\n#endif\n\n/**\n * Ascii internet address interpretation routine.\n * The value returned is in network order.\n *\n * @param cp IP address in ascii representation (e.g. \"127.0.0.1\")\n * @return ip address in network order\n */\nu32_t\nipaddr_addr(const char *cp)\n{\n  ip4_addr_t val;\n\n  if (ip4addr_aton(cp, &val)) {\n    return ip4_addr_get_u32(&val);\n  }\n  return (IPADDR_NONE);\n}\n\n/**\n * Check whether \"cp\" is a valid ascii representation\n * of an Internet address and convert to a binary address.\n * Returns 1 if the address is valid, 0 if not.\n * This replaces inet_addr, the return value from which\n * cannot distinguish between failure and a local broadcast address.\n *\n * @param cp IP address in ascii representation (e.g. \"127.0.0.1\")\n * @param addr pointer to which to save the ip address in network order\n * @return 1 if cp could be converted to addr, 0 on failure\n */\nint\nip4addr_aton(const char *cp, ip4_addr_t *addr)\n{\n  u32_t val;\n  u8_t base;\n  char c;\n  u32_t parts[4];\n  u32_t *pp = parts;\n\n  c = *cp;\n  for (;;) {\n    /*\n     * Collect number up to ``.''.\n     * Values are specified as for C:\n     * 0x=hex, 0=octal, 1-9=decimal.\n     */\n    if (!isdigit(c)) {\n      return 0;\n    }\n    val = 0;\n    base = 10;\n    if (c == '0') {\n      c = *++cp;\n      if (c == 'x' || c == 'X') {\n        base = 16;\n        c = *++cp;\n      } else {\n        base = 8;\n      }\n    }\n    for (;;) {\n      if (isdigit(c)) {\n        val = (val * base) + (u32_t)(c - '0');\n        c = *++cp;\n      } else if (base == 16 && isxdigit(c)) {\n        val = (val << 4) | (u32_t)(c + 10 - (islower(c) ? 'a' : 'A'));\n        c = *++cp;\n      } else {\n        break;\n      }\n    }\n    if (c == '.') {\n      /*\n       * Internet format:\n       *  a.b.c.d\n       *  a.b.c   (with c treated as 16 bits)\n       *  a.b (with b treated as 24 bits)\n       */\n      if (pp >= parts + 3) {\n        return 0;\n      }\n      *pp++ = val;\n      c = *++cp;\n    } else {\n      break;\n    }\n  }\n  /*\n   * Check for trailing characters.\n   */\n  if (c != '\\0' && !isspace(c)) {\n    return 0;\n  }\n  /*\n   * Concoct the address according to\n   * the number of parts specified.\n   */\n  switch (pp - parts + 1) {\n\n  case 0:\n    return 0;       /* initial nondigit */\n\n  case 1:             /* a -- 32 bits */\n    break;\n\n  case 2:             /* a.b -- 8.24 bits */\n    if (val > 0xffffffUL) {\n      return 0;\n    }\n    if (parts[0] > 0xff) {\n      return 0;\n    }\n    val |= parts[0] << 24;\n    break;\n\n  case 3:             /* a.b.c -- 8.8.16 bits */\n    if (val > 0xffff) {\n      return 0;\n    }\n    if ((parts[0] > 0xff) || (parts[1] > 0xff)) {\n      return 0;\n    }\n    val |= (parts[0] << 24) | (parts[1] << 16);\n    break;\n\n  case 4:             /* a.b.c.d -- 8.8.8.8 bits */\n    if (val > 0xff) {\n      return 0;\n    }\n    if ((parts[0] > 0xff) || (parts[1] > 0xff) || (parts[2] > 0xff)) {\n      return 0;\n    }\n    val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);\n    break;\n  default:\n    LWIP_ASSERT(\"unhandled\", 0);\n    break;\n  }\n  if (addr) {\n    ip4_addr_set_u32(addr, lwip_htonl(val));\n  }\n  return 1;\n}\n\n/**\n * Convert numeric IP address into decimal dotted ASCII representation.\n * returns ptr to static buffer; not reentrant!\n *\n * @param addr ip address in network order to convert\n * @return pointer to a global static (!) buffer that holds the ASCII\n *         representation of addr\n */\nchar*\nip4addr_ntoa(const ip4_addr_t *addr)\n{\n  static char str[IP4ADDR_STRLEN_MAX];\n  return ip4addr_ntoa_r(addr, str, IP4ADDR_STRLEN_MAX);\n}\n\n/**\n * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.\n *\n * @param addr ip address in network order to convert\n * @param buf target buffer where the string is stored\n * @param buflen length of buf\n * @return either pointer to buf which now holds the ASCII\n *         representation of addr or NULL if buf was too small\n */\nchar*\nip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen)\n{\n  u32_t s_addr;\n  char inv[3];\n  char *rp;\n  u8_t *ap;\n  u8_t rem;\n  u8_t n;\n  u8_t i;\n  int len = 0;\n\n  s_addr = ip4_addr_get_u32(addr);\n\n  rp = buf;\n  ap = (u8_t *)&s_addr;\n  for (n = 0; n < 4; n++) {\n    i = 0;\n    do {\n      rem = *ap % (u8_t)10;\n      *ap /= (u8_t)10;\n      inv[i++] = (char)('0' + rem);\n    } while (*ap);\n    while (i--) {\n      if (len++ >= buflen) {\n        return NULL;\n      }\n      *rp++ = inv[i];\n    }\n    if (len++ >= buflen) {\n      return NULL;\n    }\n    *rp++ = '.';\n    ap++;\n  }\n  *--rp = 0;\n  return buf;\n}\n\n#endif /* LWIP_IPV4 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv4/ip4_frag.c",
    "content": "/**\n * @file\n * This is the IPv4 packet segmentation and reassembly implementation.\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Jani Monoses <jani@iv.ro>\n *         Simon Goldschmidt\n * original reassembly code by Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV4\n\n#include \"lwip/ip4_frag.h\"\n#include \"lwip/def.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/icmp.h\"\n\n#include <string.h>\n\n#if IP_REASSEMBLY\n/**\n * The IP reassembly code currently has the following limitations:\n * - IP header options are not supported\n * - fragments must not overlap (e.g. due to different routes),\n *   currently, overlapping or duplicate fragments are thrown away\n *   if IP_REASS_CHECK_OVERLAP=1 (the default)!\n *\n * @todo: work with IP header options\n */\n\n/** Setting this to 0, you can turn off checking the fragments for overlapping\n * regions. The code gets a little smaller. Only use this if you know that\n * overlapping won't occur on your network! */\n#ifndef IP_REASS_CHECK_OVERLAP\n#define IP_REASS_CHECK_OVERLAP 1\n#endif /* IP_REASS_CHECK_OVERLAP */\n\n/** Set to 0 to prevent freeing the oldest datagram when the reassembly buffer is\n * full (IP_REASS_MAX_PBUFS pbufs are enqueued). The code gets a little smaller.\n * Datagrams will be freed by timeout only. Especially useful when MEMP_NUM_REASSDATA\n * is set to 1, so one datagram can be reassembled at a time, only. */\n#ifndef IP_REASS_FREE_OLDEST\n#define IP_REASS_FREE_OLDEST 1\n#endif /* IP_REASS_FREE_OLDEST */\n\n#define IP_REASS_FLAG_LASTFRAG 0x01\n\n#define IP_REASS_VALIDATE_TELEGRAM_FINISHED  1\n#define IP_REASS_VALIDATE_PBUF_QUEUED        0\n#define IP_REASS_VALIDATE_PBUF_DROPPED       -1\n\n/** This is a helper struct which holds the starting\n * offset and the ending offset of this fragment to\n * easily chain the fragments.\n * It has the same packing requirements as the IP header, since it replaces\n * the IP header in memory in incoming fragments (after copying it) to keep\n * track of the various fragments. (-> If the IP header doesn't need packing,\n * this struct doesn't need packing, too.)\n */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct ip_reass_helper {\n  PACK_STRUCT_FIELD(struct pbuf *next_pbuf);\n  PACK_STRUCT_FIELD(u16_t start);\n  PACK_STRUCT_FIELD(u16_t end);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#define IP_ADDRESSES_AND_ID_MATCH(iphdrA, iphdrB)  \\\n  (ip4_addr_cmp(&(iphdrA)->src, &(iphdrB)->src) && \\\n   ip4_addr_cmp(&(iphdrA)->dest, &(iphdrB)->dest) && \\\n   IPH_ID(iphdrA) == IPH_ID(iphdrB)) ? 1 : 0\n\n/* global variables */\nstatic struct ip_reassdata *reassdatagrams;\nstatic u16_t ip_reass_pbufcount;\n\n/* function prototypes */\nstatic void ip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev);\nstatic int ip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev);\n\n/**\n * Reassembly timer base function\n * for both NO_SYS == 0 and 1 (!).\n *\n * Should be called every 1000 msec (defined by IP_TMR_INTERVAL).\n */\nvoid\nip_reass_tmr(void)\n{\n  struct ip_reassdata *r, *prev = NULL;\n\n  r = reassdatagrams;\n  while (r != NULL) {\n    /* Decrement the timer. Once it reaches 0,\n     * clean up the incomplete fragment assembly */\n    if (r->timer > 0) {\n      r->timer--;\n      LWIP_DEBUGF(IP_REASS_DEBUG, (\"ip_reass_tmr: timer dec %\"U16_F\"\\n\",(u16_t)r->timer));\n      prev = r;\n      r = r->next;\n    } else {\n      /* reassembly timed out */\n      struct ip_reassdata *tmp;\n      LWIP_DEBUGF(IP_REASS_DEBUG, (\"ip_reass_tmr: timer timed out\\n\"));\n      tmp = r;\n      /* get the next pointer before freeing */\n      r = r->next;\n      /* free the helper struct and all enqueued pbufs */\n      ip_reass_free_complete_datagram(tmp, prev);\n     }\n   }\n}\n\n/**\n * Free a datagram (struct ip_reassdata) and all its pbufs.\n * Updates the total count of enqueued pbufs (ip_reass_pbufcount),\n * SNMP counters and sends an ICMP time exceeded packet.\n *\n * @param ipr datagram to free\n * @param prev the previous datagram in the linked list\n * @return the number of pbufs freed\n */\nstatic int\nip_reass_free_complete_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev)\n{\n  u16_t pbufs_freed = 0;\n  u16_t clen;\n  struct pbuf *p;\n  struct ip_reass_helper *iprh;\n\n  LWIP_ASSERT(\"prev != ipr\", prev != ipr);\n  if (prev != NULL) {\n    LWIP_ASSERT(\"prev->next == ipr\", prev->next == ipr);\n  }\n\n  MIB2_STATS_INC(mib2.ipreasmfails);\n#if LWIP_ICMP\n  iprh = (struct ip_reass_helper *)ipr->p->payload;\n  if (iprh->start == 0) {\n    /* The first fragment was received, send ICMP time exceeded. */\n    /* First, de-queue the first pbuf from r->p. */\n    p = ipr->p;\n    ipr->p = iprh->next_pbuf;\n    /* Then, copy the original header into it. */\n    SMEMCPY(p->payload, &ipr->iphdr, IP_HLEN);\n    icmp_time_exceeded(p, ICMP_TE_FRAG);\n    clen = pbuf_clen(p);\n    LWIP_ASSERT(\"pbufs_freed + clen <= 0xffff\", pbufs_freed + clen <= 0xffff);\n    pbufs_freed += clen;\n    pbuf_free(p);\n  }\n#endif /* LWIP_ICMP */\n\n  /* First, free all received pbufs.  The individual pbufs need to be released\n     separately as they have not yet been chained */\n  p = ipr->p;\n  while (p != NULL) {\n    struct pbuf *pcur;\n    iprh = (struct ip_reass_helper *)p->payload;\n    pcur = p;\n    /* get the next pointer before freeing */\n    p = iprh->next_pbuf;\n    clen = pbuf_clen(pcur);\n    LWIP_ASSERT(\"pbufs_freed + clen <= 0xffff\", pbufs_freed + clen <= 0xffff);\n    pbufs_freed += clen;\n    pbuf_free(pcur);\n  }\n  /* Then, unchain the struct ip_reassdata from the list and free it. */\n  ip_reass_dequeue_datagram(ipr, prev);\n  LWIP_ASSERT(\"ip_reass_pbufcount >= clen\", ip_reass_pbufcount >= pbufs_freed);\n  ip_reass_pbufcount -= pbufs_freed;\n\n  return pbufs_freed;\n}\n\n#if IP_REASS_FREE_OLDEST\n/**\n * Free the oldest datagram to make room for enqueueing new fragments.\n * The datagram 'fraghdr' belongs to is not freed!\n *\n * @param fraghdr IP header of the current fragment\n * @param pbufs_needed number of pbufs needed to enqueue\n *        (used for freeing other datagrams if not enough space)\n * @return the number of pbufs freed\n */\nstatic int\nip_reass_remove_oldest_datagram(struct ip_hdr *fraghdr, int pbufs_needed)\n{\n  /* @todo Can't we simply remove the last datagram in the\n   *       linked list behind reassdatagrams?\n   */\n  struct ip_reassdata *r, *oldest, *prev, *oldest_prev;\n  int pbufs_freed = 0, pbufs_freed_current;\n  int other_datagrams;\n\n  /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs,\n   * but don't free the datagram that 'fraghdr' belongs to! */\n  do {\n    oldest = NULL;\n    prev = NULL;\n    oldest_prev = NULL;\n    other_datagrams = 0;\n    r = reassdatagrams;\n    while (r != NULL) {\n      if (!IP_ADDRESSES_AND_ID_MATCH(&r->iphdr, fraghdr)) {\n        /* Not the same datagram as fraghdr */\n        other_datagrams++;\n        if (oldest == NULL) {\n          oldest = r;\n          oldest_prev = prev;\n        } else if (r->timer <= oldest->timer) {\n          /* older than the previous oldest */\n          oldest = r;\n          oldest_prev = prev;\n        }\n      }\n      if (r->next != NULL) {\n        prev = r;\n      }\n      r = r->next;\n    }\n    if (oldest != NULL) {\n      pbufs_freed_current = ip_reass_free_complete_datagram(oldest, oldest_prev);\n      pbufs_freed += pbufs_freed_current;\n    }\n  } while ((pbufs_freed < pbufs_needed) && (other_datagrams > 1));\n  return pbufs_freed;\n}\n#endif /* IP_REASS_FREE_OLDEST */\n\n/**\n * Enqueues a new fragment into the fragment queue\n * @param fraghdr points to the new fragments IP hdr\n * @param clen number of pbufs needed to enqueue (used for freeing other datagrams if not enough space)\n * @return A pointer to the queue location into which the fragment was enqueued\n */\nstatic struct ip_reassdata*\nip_reass_enqueue_new_datagram(struct ip_hdr *fraghdr, int clen)\n{\n  struct ip_reassdata* ipr;\n#if ! IP_REASS_FREE_OLDEST\n  LWIP_UNUSED_ARG(clen);\n#endif\n\n  /* No matching previous fragment found, allocate a new reassdata struct */\n  ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA);\n  if (ipr == NULL) {\n#if IP_REASS_FREE_OLDEST\n    if (ip_reass_remove_oldest_datagram(fraghdr, clen) >= clen) {\n      ipr = (struct ip_reassdata *)memp_malloc(MEMP_REASSDATA);\n    }\n    if (ipr == NULL)\n#endif /* IP_REASS_FREE_OLDEST */\n    {\n      IPFRAG_STATS_INC(ip_frag.memerr);\n      LWIP_DEBUGF(IP_REASS_DEBUG,(\"Failed to alloc reassdata struct\\n\"));\n      return NULL;\n    }\n  }\n  memset(ipr, 0, sizeof(struct ip_reassdata));\n  ipr->timer = IP_REASS_MAXAGE;\n\n  /* enqueue the new structure to the front of the list */\n  ipr->next = reassdatagrams;\n  reassdatagrams = ipr;\n  /* copy the ip header for later tests and input */\n  /* @todo: no ip options supported? */\n  SMEMCPY(&(ipr->iphdr), fraghdr, IP_HLEN);\n  return ipr;\n}\n\n/**\n * Dequeues a datagram from the datagram queue. Doesn't deallocate the pbufs.\n * @param ipr points to the queue entry to dequeue\n */\nstatic void\nip_reass_dequeue_datagram(struct ip_reassdata *ipr, struct ip_reassdata *prev)\n{\n  /* dequeue the reass struct  */\n  if (reassdatagrams == ipr) {\n    /* it was the first in the list */\n    reassdatagrams = ipr->next;\n  } else {\n    /* it wasn't the first, so it must have a valid 'prev' */\n    LWIP_ASSERT(\"sanity check linked list\", prev != NULL);\n    prev->next = ipr->next;\n  }\n\n  /* now we can free the ip_reassdata struct */\n  memp_free(MEMP_REASSDATA, ipr);\n}\n\n/**\n * Chain a new pbuf into the pbuf list that composes the datagram.  The pbuf list\n * will grow over time as  new pbufs are rx.\n * Also checks that the datagram passes basic continuity checks (if the last\n * fragment was received at least once).\n * @param ipr points to the reassembly state\n * @param new_p points to the pbuf for the current fragment\n * @param is_last is 1 if this pbuf has MF==0 (ipr->flags not updated yet)\n * @return see IP_REASS_VALIDATE_* defines\n */\nstatic int\nip_reass_chain_frag_into_datagram_and_validate(struct ip_reassdata *ipr, struct pbuf *new_p, int is_last)\n{\n  struct ip_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL;\n  struct pbuf *q;\n  u16_t offset, len;\n  struct ip_hdr *fraghdr;\n  int valid = 1;\n\n  /* Extract length and fragment offset from current fragment */\n  fraghdr = (struct ip_hdr*)new_p->payload;\n  len = lwip_ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4;\n  offset = (lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8;\n\n  /* overwrite the fragment's ip header from the pbuf with our helper struct,\n   * and setup the embedded helper structure. */\n  /* make sure the struct ip_reass_helper fits into the IP header */\n  LWIP_ASSERT(\"sizeof(struct ip_reass_helper) <= IP_HLEN\",\n              sizeof(struct ip_reass_helper) <= IP_HLEN);\n  iprh = (struct ip_reass_helper*)new_p->payload;\n  iprh->next_pbuf = NULL;\n  iprh->start = offset;\n  iprh->end = offset + len;\n\n  /* Iterate through until we either get to the end of the list (append),\n   * or we find one with a larger offset (insert). */\n  for (q = ipr->p; q != NULL;) {\n    iprh_tmp = (struct ip_reass_helper*)q->payload;\n    if (iprh->start < iprh_tmp->start) {\n      /* the new pbuf should be inserted before this */\n      iprh->next_pbuf = q;\n      if (iprh_prev != NULL) {\n        /* not the fragment with the lowest offset */\n#if IP_REASS_CHECK_OVERLAP\n        if ((iprh->start < iprh_prev->end) || (iprh->end > iprh_tmp->start)) {\n          /* fragment overlaps with previous or following, throw away */\n          goto freepbuf;\n        }\n#endif /* IP_REASS_CHECK_OVERLAP */\n        iprh_prev->next_pbuf = new_p;\n        if (iprh_prev->end != iprh->start) {\n          /* There is a fragment missing between the current\n           * and the previous fragment */\n          valid = 0;\n        }\n      } else {\n#if IP_REASS_CHECK_OVERLAP\n        if (iprh->end > iprh_tmp->start) {\n          /* fragment overlaps with following, throw away */\n          goto freepbuf;\n        }\n#endif /* IP_REASS_CHECK_OVERLAP */\n        /* fragment with the lowest offset */\n        ipr->p = new_p;\n      }\n      break;\n    } else if (iprh->start == iprh_tmp->start) {\n      /* received the same datagram twice: no need to keep the datagram */\n      goto freepbuf;\n#if IP_REASS_CHECK_OVERLAP\n    } else if (iprh->start < iprh_tmp->end) {\n      /* overlap: no need to keep the new datagram */\n      goto freepbuf;\n#endif /* IP_REASS_CHECK_OVERLAP */\n    } else {\n      /* Check if the fragments received so far have no holes. */\n      if (iprh_prev != NULL) {\n        if (iprh_prev->end != iprh_tmp->start) {\n          /* There is a fragment missing between the current\n           * and the previous fragment */\n          valid = 0;\n        }\n      }\n    }\n    q = iprh_tmp->next_pbuf;\n    iprh_prev = iprh_tmp;\n  }\n\n  /* If q is NULL, then we made it to the end of the list. Determine what to do now */\n  if (q == NULL) {\n    if (iprh_prev != NULL) {\n      /* this is (for now), the fragment with the highest offset:\n       * chain it to the last fragment */\n#if IP_REASS_CHECK_OVERLAP\n      LWIP_ASSERT(\"check fragments don't overlap\", iprh_prev->end <= iprh->start);\n#endif /* IP_REASS_CHECK_OVERLAP */\n      iprh_prev->next_pbuf = new_p;\n      if (iprh_prev->end != iprh->start) {\n        valid = 0;\n      }\n    } else {\n#if IP_REASS_CHECK_OVERLAP\n      LWIP_ASSERT(\"no previous fragment, this must be the first fragment!\",\n        ipr->p == NULL);\n#endif /* IP_REASS_CHECK_OVERLAP */\n      /* this is the first fragment we ever received for this ip datagram */\n      ipr->p = new_p;\n    }\n  }\n\n  /* At this point, the validation part begins: */\n  /* If we already received the last fragment */\n  if (is_last || ((ipr->flags & IP_REASS_FLAG_LASTFRAG) != 0)) {\n    /* and had no holes so far */\n    if (valid) {\n      /* then check if the rest of the fragments is here */\n      /* Check if the queue starts with the first datagram */\n      if ((ipr->p == NULL) || (((struct ip_reass_helper*)ipr->p->payload)->start != 0)) {\n        valid = 0;\n      } else {\n        /* and check that there are no holes after this datagram */\n        iprh_prev = iprh;\n        q = iprh->next_pbuf;\n        while (q != NULL) {\n          iprh = (struct ip_reass_helper*)q->payload;\n          if (iprh_prev->end != iprh->start) {\n            valid = 0;\n            break;\n          }\n          iprh_prev = iprh;\n          q = iprh->next_pbuf;\n        }\n        /* if still valid, all fragments are received\n         * (because to the MF==0 already arrived */\n        if (valid) {\n          LWIP_ASSERT(\"sanity check\", ipr->p != NULL);\n          LWIP_ASSERT(\"sanity check\",\n            ((struct ip_reass_helper*)ipr->p->payload) != iprh);\n          LWIP_ASSERT(\"validate_datagram:next_pbuf!=NULL\",\n            iprh->next_pbuf == NULL);\n        }\n      }\n    }\n    /* If valid is 0 here, there are some fragments missing in the middle\n     * (since MF == 0 has already arrived). Such datagrams simply time out if\n     * no more fragments are received... */\n    return valid ? IP_REASS_VALIDATE_TELEGRAM_FINISHED : IP_REASS_VALIDATE_PBUF_QUEUED;\n  }\n  /* If we come here, not all fragments were received, yet! */\n  return IP_REASS_VALIDATE_PBUF_QUEUED; /* not yet valid! */\n#if IP_REASS_CHECK_OVERLAP\nfreepbuf:\n  ip_reass_pbufcount -= pbuf_clen(new_p);\n  pbuf_free(new_p);\n  return IP_REASS_VALIDATE_PBUF_DROPPED;\n#endif /* IP_REASS_CHECK_OVERLAP */\n}\n\n/**\n * Reassembles incoming IP fragments into an IP datagram.\n *\n * @param p points to a pbuf chain of the fragment\n * @return NULL if reassembly is incomplete, ? otherwise\n */\nstruct pbuf *\nip4_reass(struct pbuf *p)\n{\n  struct pbuf *r;\n  struct ip_hdr *fraghdr;\n  struct ip_reassdata *ipr;\n  struct ip_reass_helper *iprh;\n  u16_t offset, len, clen;\n  int valid;\n  int is_last;\n\n  IPFRAG_STATS_INC(ip_frag.recv);\n  MIB2_STATS_INC(mib2.ipreasmreqds);\n\n  fraghdr = (struct ip_hdr*)p->payload;\n\n  if ((IPH_HL(fraghdr) * 4) != IP_HLEN) {\n    LWIP_DEBUGF(IP_REASS_DEBUG,(\"ip4_reass: IP options currently not supported!\\n\"));\n    IPFRAG_STATS_INC(ip_frag.err);\n    goto nullreturn;\n  }\n\n  offset = (lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) * 8;\n  len = lwip_ntohs(IPH_LEN(fraghdr)) - IPH_HL(fraghdr) * 4;\n\n  /* Check if we are allowed to enqueue more datagrams. */\n  clen = pbuf_clen(p);\n  if ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) {\n#if IP_REASS_FREE_OLDEST\n    if (!ip_reass_remove_oldest_datagram(fraghdr, clen) ||\n        ((ip_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS))\n#endif /* IP_REASS_FREE_OLDEST */\n    {\n      /* No datagram could be freed and still too many pbufs enqueued */\n      LWIP_DEBUGF(IP_REASS_DEBUG,(\"ip4_reass: Overflow condition: pbufct=%d, clen=%d, MAX=%d\\n\",\n        ip_reass_pbufcount, clen, IP_REASS_MAX_PBUFS));\n      IPFRAG_STATS_INC(ip_frag.memerr);\n      /* @todo: send ICMP time exceeded here? */\n      /* drop this pbuf */\n      goto nullreturn;\n    }\n  }\n\n  /* Look for the datagram the fragment belongs to in the current datagram queue,\n   * remembering the previous in the queue for later dequeueing. */\n  for (ipr = reassdatagrams; ipr != NULL; ipr = ipr->next) {\n    /* Check if the incoming fragment matches the one currently present\n       in the reassembly buffer. If so, we proceed with copying the\n       fragment into the buffer. */\n    if (IP_ADDRESSES_AND_ID_MATCH(&ipr->iphdr, fraghdr)) {\n      LWIP_DEBUGF(IP_REASS_DEBUG, (\"ip4_reass: matching previous fragment ID=%\"X16_F\"\\n\",\n        lwip_ntohs(IPH_ID(fraghdr))));\n      IPFRAG_STATS_INC(ip_frag.cachehit);\n      break;\n    }\n  }\n\n  if (ipr == NULL) {\n  /* Enqueue a new datagram into the datagram queue */\n    ipr = ip_reass_enqueue_new_datagram(fraghdr, clen);\n    /* Bail if unable to enqueue */\n    if (ipr == NULL) {\n      goto nullreturn;\n    }\n  } else {\n    if (((lwip_ntohs(IPH_OFFSET(fraghdr)) & IP_OFFMASK) == 0) &&\n      ((lwip_ntohs(IPH_OFFSET(&ipr->iphdr)) & IP_OFFMASK) != 0)) {\n      /* ipr->iphdr is not the header from the first fragment, but fraghdr is\n       * -> copy fraghdr into ipr->iphdr since we want to have the header\n       * of the first fragment (for ICMP time exceeded and later, for copying\n       * all options, if supported)*/\n      SMEMCPY(&ipr->iphdr, fraghdr, IP_HLEN);\n    }\n  }\n\n  /* At this point, we have either created a new entry or pointing\n   * to an existing one */\n\n  /* check for 'no more fragments', and update queue entry*/\n  is_last = (IPH_OFFSET(fraghdr) & PP_NTOHS(IP_MF)) == 0;\n  if (is_last) {\n    u16_t datagram_len = (u16_t)(offset + len);\n    if ((datagram_len < offset) || (datagram_len > (0xFFFF - IP_HLEN))) {\n      /* u16_t overflow, cannot handle this */\n      goto nullreturn;\n    }\n  }\n  /* find the right place to insert this pbuf */\n  /* @todo: trim pbufs if fragments are overlapping */\n  valid = ip_reass_chain_frag_into_datagram_and_validate(ipr, p, is_last);\n  if (valid == IP_REASS_VALIDATE_PBUF_DROPPED) {\n    goto nullreturn;\n  }\n  /* if we come here, the pbuf has been enqueued */\n\n  /* Track the current number of pbufs current 'in-flight', in order to limit\n     the number of fragments that may be enqueued at any one time\n     (overflow checked by testing against IP_REASS_MAX_PBUFS) */\n  ip_reass_pbufcount = (u16_t)(ip_reass_pbufcount + clen);\n  if (is_last) {\n    u16_t datagram_len = (u16_t)(offset + len);\n    ipr->datagram_len = datagram_len;\n    ipr->flags |= IP_REASS_FLAG_LASTFRAG;\n    LWIP_DEBUGF(IP_REASS_DEBUG,\n     (\"ip4_reass: last fragment seen, total len %\"S16_F\"\\n\",\n      ipr->datagram_len));\n  }\n\n  if (valid == IP_REASS_VALIDATE_TELEGRAM_FINISHED) {\n    struct ip_reassdata *ipr_prev;\n    /* the totally last fragment (flag more fragments = 0) was received at least\n     * once AND all fragments are received */\n    ipr->datagram_len += IP_HLEN;\n\n    /* save the second pbuf before copying the header over the pointer */\n    r = ((struct ip_reass_helper*)ipr->p->payload)->next_pbuf;\n\n    /* copy the original ip header back to the first pbuf */\n    fraghdr = (struct ip_hdr*)(ipr->p->payload);\n    SMEMCPY(fraghdr, &ipr->iphdr, IP_HLEN);\n    IPH_LEN_SET(fraghdr, lwip_htons(ipr->datagram_len));\n    IPH_OFFSET_SET(fraghdr, 0);\n    IPH_CHKSUM_SET(fraghdr, 0);\n    /* @todo: do we need to set/calculate the correct checksum? */\n#if CHECKSUM_GEN_IP\n    IF__NETIF_CHECKSUM_ENABLED(ip_current_input_netif(), NETIF_CHECKSUM_GEN_IP) {\n      IPH_CHKSUM_SET(fraghdr, inet_chksum(fraghdr, IP_HLEN));\n    }\n#endif /* CHECKSUM_GEN_IP */\n\n    p = ipr->p;\n\n    /* chain together the pbufs contained within the reass_data list. */\n    while (r != NULL) {\n      iprh = (struct ip_reass_helper*)r->payload;\n\n      /* hide the ip header for every succeeding fragment */\n      pbuf_header(r, -IP_HLEN);\n      pbuf_cat(p, r);\n      r = iprh->next_pbuf;\n    }\n\n    /* find the previous entry in the linked list */\n    if (ipr == reassdatagrams) {\n      ipr_prev = NULL;\n    } else {\n      for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) {\n        if (ipr_prev->next == ipr) {\n          break;\n        }\n      }\n    }\n\n    /* release the sources allocate for the fragment queue entry */\n    ip_reass_dequeue_datagram(ipr, ipr_prev);\n\n    /* and adjust the number of pbufs currently queued for reassembly. */\n    ip_reass_pbufcount -= pbuf_clen(p);\n\n    MIB2_STATS_INC(mib2.ipreasmoks);\n\n    /* Return the pbuf chain */\n    return p;\n  }\n  /* the datagram is not (yet?) reassembled completely */\n  LWIP_DEBUGF(IP_REASS_DEBUG,(\"ip_reass_pbufcount: %d out\\n\", ip_reass_pbufcount));\n  return NULL;\n\nnullreturn:\n  LWIP_DEBUGF(IP_REASS_DEBUG,(\"ip4_reass: nullreturn\\n\"));\n  IPFRAG_STATS_INC(ip_frag.drop);\n  pbuf_free(p);\n  return NULL;\n}\n#endif /* IP_REASSEMBLY */\n\n#if IP_FRAG\n#if !LWIP_NETIF_TX_SINGLE_PBUF\n/** Allocate a new struct pbuf_custom_ref */\nstatic struct pbuf_custom_ref*\nip_frag_alloc_pbuf_custom_ref(void)\n{\n  return (struct pbuf_custom_ref*)memp_malloc(MEMP_FRAG_PBUF);\n}\n\n/** Free a struct pbuf_custom_ref */\nstatic void\nip_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p)\n{\n  LWIP_ASSERT(\"p != NULL\", p != NULL);\n  memp_free(MEMP_FRAG_PBUF, p);\n}\n\n/** Free-callback function to free a 'struct pbuf_custom_ref', called by\n * pbuf_free. */\nstatic void\nipfrag_free_pbuf_custom(struct pbuf *p)\n{\n  struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref*)p;\n  LWIP_ASSERT(\"pcr != NULL\", pcr != NULL);\n  LWIP_ASSERT(\"pcr == p\", (void*)pcr == (void*)p);\n  if (pcr->original != NULL) {\n    pbuf_free(pcr->original);\n  }\n  ip_frag_free_pbuf_custom_ref(pcr);\n}\n#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */\n\n/**\n * Fragment an IP datagram if too large for the netif.\n *\n * Chop the datagram in MTU sized chunks and send them in order\n * by pointing PBUF_REFs into p.\n *\n * @param p ip packet to send\n * @param netif the netif on which to send\n * @param dest destination ip address to which to send\n *\n * @return ERR_OK if sent successfully, err_t otherwise\n */\nerr_t\nip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest)\n{\n  struct pbuf *rambuf;\n#if !LWIP_NETIF_TX_SINGLE_PBUF\n  struct pbuf *newpbuf;\n  u16_t newpbuflen = 0;\n  u16_t left_to_copy;\n#endif\n  struct ip_hdr *original_iphdr;\n  struct ip_hdr *iphdr;\n  const u16_t nfb = (netif->mtu - IP_HLEN) / 8;\n  u16_t left, fragsize;\n  u16_t ofo;\n  int last;\n  u16_t poff = IP_HLEN;\n  u16_t tmp;\n\n  original_iphdr = (struct ip_hdr *)p->payload;\n  iphdr = original_iphdr;\n  LWIP_ERROR(\"ip4_frag() does not support IP options\", IPH_HL(iphdr) * 4 == IP_HLEN, return ERR_VAL);\n\n  /* Save original offset */\n  tmp = lwip_ntohs(IPH_OFFSET(iphdr));\n  ofo = tmp & IP_OFFMASK;\n  LWIP_ERROR(\"ip_frag(): MF already set\", (tmp & IP_MF) == 0, return ERR_VAL);\n\n  left = p->tot_len - IP_HLEN;\n\n  while (left) {\n    /* Fill this fragment */\n    fragsize = LWIP_MIN(left, nfb * 8);\n\n#if LWIP_NETIF_TX_SINGLE_PBUF\n    rambuf = pbuf_alloc(PBUF_IP, fragsize, PBUF_RAM);\n    if (rambuf == NULL) {\n      goto memerr;\n    }\n    LWIP_ASSERT(\"this needs a pbuf in one piece!\",\n      (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL));\n    poff += pbuf_copy_partial(p, rambuf->payload, fragsize, poff);\n    /* make room for the IP header */\n    if (pbuf_header(rambuf, IP_HLEN)) {\n      pbuf_free(rambuf);\n      goto memerr;\n    }\n    /* fill in the IP header */\n    SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN);\n    iphdr = (struct ip_hdr*)rambuf->payload;\n#else /* LWIP_NETIF_TX_SINGLE_PBUF */\n    /* When not using a static buffer, create a chain of pbufs.\n     * The first will be a PBUF_RAM holding the link and IP header.\n     * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged,\n     * but limited to the size of an mtu.\n     */\n    rambuf = pbuf_alloc(PBUF_LINK, IP_HLEN, PBUF_RAM);\n    if (rambuf == NULL) {\n      goto memerr;\n    }\n    LWIP_ASSERT(\"this needs a pbuf in one piece!\",\n                (p->len >= (IP_HLEN)));\n    SMEMCPY(rambuf->payload, original_iphdr, IP_HLEN);\n    iphdr = (struct ip_hdr *)rambuf->payload;\n\n    left_to_copy = fragsize;\n    while (left_to_copy) {\n      struct pbuf_custom_ref *pcr;\n      u16_t plen = p->len - poff;\n      newpbuflen = LWIP_MIN(left_to_copy, plen);\n      /* Is this pbuf already empty? */\n      if (!newpbuflen) {\n        poff = 0;\n        p = p->next;\n        continue;\n      }\n      pcr = ip_frag_alloc_pbuf_custom_ref();\n      if (pcr == NULL) {\n        pbuf_free(rambuf);\n        goto memerr;\n      }\n      /* Mirror this pbuf, although we might not need all of it. */\n      newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc,\n        (u8_t*)p->payload + poff, newpbuflen);\n      if (newpbuf == NULL) {\n        ip_frag_free_pbuf_custom_ref(pcr);\n        pbuf_free(rambuf);\n        goto memerr;\n      }\n      pbuf_ref(p);\n      pcr->original = p;\n      pcr->pc.custom_free_function = ipfrag_free_pbuf_custom;\n\n      /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain\n       * so that it is removed when pbuf_dechain is later called on rambuf.\n       */\n      pbuf_cat(rambuf, newpbuf);\n      left_to_copy -= newpbuflen;\n      if (left_to_copy) {\n        poff = 0;\n        p = p->next;\n      }\n    }\n    poff += newpbuflen;\n#endif /* LWIP_NETIF_TX_SINGLE_PBUF */\n\n    /* Correct header */\n    last = (left <= netif->mtu - IP_HLEN);\n\n    /* Set new offset and MF flag */\n    tmp = (IP_OFFMASK & (ofo));\n    if (!last) {\n      tmp = tmp | IP_MF;\n    }\n    IPH_OFFSET_SET(iphdr, lwip_htons(tmp));\n    IPH_LEN_SET(iphdr, lwip_htons(fragsize + IP_HLEN));\n    IPH_CHKSUM_SET(iphdr, 0);\n#if CHECKSUM_GEN_IP\n    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_IP) {\n      IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));\n    }\n#endif /* CHECKSUM_GEN_IP */\n\n    /* No need for separate header pbuf - we allowed room for it in rambuf\n     * when allocated.\n     */\n    netif->output(netif, rambuf, dest);\n    IPFRAG_STATS_INC(ip_frag.xmit);\n\n    /* Unfortunately we can't reuse rambuf - the hardware may still be\n     * using the buffer. Instead we free it (and the ensuing chain) and\n     * recreate it next time round the loop. If we're lucky the hardware\n     * will have already sent the packet, the free will really free, and\n     * there will be zero memory penalty.\n     */\n\n    pbuf_free(rambuf);\n    left -= fragsize;\n    ofo += nfb;\n  }\n  MIB2_STATS_INC(mib2.ipfragoks);\n  return ERR_OK;\nmemerr:\n  MIB2_STATS_INC(mib2.ipfragfails);\n  return ERR_MEM;\n}\n#endif /* IP_FRAG */\n\n#endif /* LWIP_IPV4 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv6/dhcp6.c",
    "content": "/**\n * @file\n *\n * DHCPv6.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6 && LWIP_IPV6_DHCP6 /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/def.h\"\n\n\n#endif /* LWIP_IPV6 && LWIP_IPV6_DHCP6 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv6/ethip6.c",
    "content": "/**\n * @file\n *\n * Ethernet output for IPv6. Uses ND tables for link-layer addressing.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6 && LWIP_ETHERNET\n\n#include \"lwip/ethip6.h\"\n#include \"lwip/nd6.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/icmp6.h\"\n#include \"lwip/prot/ethernet.h\"\n#include \"netif/ethernet.h\"\n\n#include <string.h>\n\n/**\n * Resolve and fill-in Ethernet address header for outgoing IPv6 packet.\n *\n * For IPv6 multicast, corresponding Ethernet addresses\n * are selected and the packet is transmitted on the link.\n *\n * For unicast addresses, ask the ND6 module what to do. It will either let us\n * send the the packet right away, or queue the packet for later itself, unless\n * an error occurs.\n *\n * @todo anycast addresses\n *\n * @param netif The lwIP network interface which the IP packet will be sent on.\n * @param q The pbuf(s) containing the IP packet to be sent.\n * @param ip6addr The IP address of the packet destination.\n *\n * @return\n * - ERR_OK or the return value of @ref nd6_get_next_hop_addr_or_queue.\n */\nerr_t\nethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr)\n{\n  struct eth_addr dest;\n  const u8_t *hwaddr;\n  err_t result;\n\n  /* multicast destination IP address? */\n  if (ip6_addr_ismulticast(ip6addr)) {\n    /* Hash IP multicast address to MAC address.*/\n    dest.addr[0] = 0x33;\n    dest.addr[1] = 0x33;\n    dest.addr[2] = ((const u8_t *)(&(ip6addr->addr[3])))[0];\n    dest.addr[3] = ((const u8_t *)(&(ip6addr->addr[3])))[1];\n    dest.addr[4] = ((const u8_t *)(&(ip6addr->addr[3])))[2];\n    dest.addr[5] = ((const u8_t *)(&(ip6addr->addr[3])))[3];\n\n    /* Send out. */\n    return ethernet_output(netif, q, (const struct eth_addr*)(netif->hwaddr), &dest, ETHTYPE_IPV6);\n  }\n\n  /* We have a unicast destination IP address */\n  /* @todo anycast? */\n\n  /* Ask ND6 what to do with the packet. */\n  result = nd6_get_next_hop_addr_or_queue(netif, q, ip6addr, &hwaddr);\n  if (result != ERR_OK) {\n    return result;\n  }\n\n  /* If no hardware address is returned, nd6 has queued the packet for later. */\n  if (hwaddr == NULL) {\n    return ERR_OK;\n  }\n\n  /* Send out the packet using the returned hardware address. */\n  SMEMCPY(dest.addr, hwaddr, 6);\n  return ethernet_output(netif, q, (const struct eth_addr*)(netif->hwaddr), &dest, ETHTYPE_IPV6);\n}\n\n#endif /* LWIP_IPV6 && LWIP_ETHERNET */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv6/icmp6.c",
    "content": "/**\n * @file\n *\n * IPv6 version of ICMP, as per RFC 4443.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_ICMP6 && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/icmp6.h\"\n#include \"lwip/prot/icmp6.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/nd6.h\"\n#include \"lwip/mld6.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/stats.h\"\n\n#include <string.h>\n\n#ifndef LWIP_ICMP6_DATASIZE\n#define LWIP_ICMP6_DATASIZE   8\n#endif\n#if LWIP_ICMP6_DATASIZE == 0\n#define LWIP_ICMP6_DATASIZE   8\n#endif\n\n/* Forward declarations */\nstatic void icmp6_send_response(struct pbuf *p, u8_t code, u32_t data, u8_t type);\n\n\n/**\n * Process an input ICMPv6 message. Called by ip6_input.\n *\n * Will generate a reply for echo requests. Other messages are forwarded\n * to nd6_input, or mld6_input.\n *\n * @param p the mld packet, p->payload pointing to the icmpv6 header\n * @param inp the netif on which this packet was received\n */\nvoid\nicmp6_input(struct pbuf *p, struct netif *inp)\n{\n  struct icmp6_hdr *icmp6hdr;\n  struct pbuf *r;\n  const ip6_addr_t *reply_src;\n\n  ICMP6_STATS_INC(icmp6.recv);\n\n  /* Check that ICMPv6 header fits in payload */\n  if (p->len < sizeof(struct icmp6_hdr)) {\n    /* drop short packets */\n    pbuf_free(p);\n    ICMP6_STATS_INC(icmp6.lenerr);\n    ICMP6_STATS_INC(icmp6.drop);\n    return;\n  }\n\n  icmp6hdr = (struct icmp6_hdr *)p->payload;\n\n#if CHECKSUM_CHECK_ICMP6\n  IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_ICMP6) {\n    if (ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->tot_len, ip6_current_src_addr(),\n                          ip6_current_dest_addr()) != 0) {\n      /* Checksum failed */\n      pbuf_free(p);\n      ICMP6_STATS_INC(icmp6.chkerr);\n      ICMP6_STATS_INC(icmp6.drop);\n      return;\n    }\n  }\n#endif /* CHECKSUM_CHECK_ICMP6 */\n\n  switch (icmp6hdr->type) {\n  case ICMP6_TYPE_NA: /* Neighbor advertisement */\n  case ICMP6_TYPE_NS: /* Neighbor solicitation */\n  case ICMP6_TYPE_RA: /* Router advertisement */\n  case ICMP6_TYPE_RD: /* Redirect */\n  case ICMP6_TYPE_PTB: /* Packet too big */\n    nd6_input(p, inp);\n    return;\n    break;\n  case ICMP6_TYPE_RS:\n#if LWIP_IPV6_FORWARD\n    /* @todo implement router functionality */\n#endif\n    break;\n#if LWIP_IPV6_MLD\n  case ICMP6_TYPE_MLQ:\n  case ICMP6_TYPE_MLR:\n  case ICMP6_TYPE_MLD:\n    mld6_input(p, inp);\n    return;\n    break;\n#endif\n  case ICMP6_TYPE_EREQ:\n#if !LWIP_MULTICAST_PING\n    /* multicast destination address? */\n    if (ip6_addr_ismulticast(ip6_current_dest_addr())) {\n      /* drop */\n      pbuf_free(p);\n      ICMP6_STATS_INC(icmp6.drop);\n      return;\n    }\n#endif /* LWIP_MULTICAST_PING */\n\n    /* Allocate reply. */\n    r = pbuf_alloc(PBUF_IP, p->tot_len, PBUF_RAM);\n    if (r == NULL) {\n      /* drop */\n      pbuf_free(p);\n      ICMP6_STATS_INC(icmp6.memerr);\n      return;\n    }\n\n    /* Copy echo request. */\n    if (pbuf_copy(r, p) != ERR_OK) {\n      /* drop */\n      pbuf_free(p);\n      pbuf_free(r);\n      ICMP6_STATS_INC(icmp6.err);\n      return;\n    }\n\n    /* Determine reply source IPv6 address. */\n#if LWIP_MULTICAST_PING\n    if (ip6_addr_ismulticast(ip6_current_dest_addr())) {\n      reply_src = ip_2_ip6(ip6_select_source_address(inp, ip6_current_src_addr()));\n      if (reply_src == NULL) {\n        /* drop */\n        pbuf_free(p);\n        pbuf_free(r);\n        ICMP6_STATS_INC(icmp6.rterr);\n        return;\n      }\n    }\n    else\n#endif /* LWIP_MULTICAST_PING */\n    {\n      reply_src = ip6_current_dest_addr();\n    }\n\n    /* Set fields in reply. */\n    ((struct icmp6_echo_hdr *)(r->payload))->type = ICMP6_TYPE_EREP;\n    ((struct icmp6_echo_hdr *)(r->payload))->chksum = 0;\n#if CHECKSUM_GEN_ICMP6\n    IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_GEN_ICMP6) {\n      ((struct icmp6_echo_hdr *)(r->payload))->chksum = ip6_chksum_pseudo(r,\n          IP6_NEXTH_ICMP6, r->tot_len, reply_src, ip6_current_src_addr());\n    }\n#endif /* CHECKSUM_GEN_ICMP6 */\n\n    /* Send reply. */\n    ICMP6_STATS_INC(icmp6.xmit);\n    ip6_output_if(r, reply_src, ip6_current_src_addr(),\n        LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, inp);\n    pbuf_free(r);\n\n    break;\n  default:\n    ICMP6_STATS_INC(icmp6.proterr);\n    ICMP6_STATS_INC(icmp6.drop);\n    break;\n  }\n\n  pbuf_free(p);\n}\n\n\n/**\n * Send an icmpv6 'destination unreachable' packet.\n *\n * @param p the input packet for which the 'unreachable' should be sent,\n *          p->payload pointing to the IPv6 header\n * @param c ICMPv6 code for the unreachable type\n */\nvoid\nicmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c)\n{\n  icmp6_send_response(p, c, 0, ICMP6_TYPE_DUR);\n}\n\n/**\n * Send an icmpv6 'packet too big' packet.\n *\n * @param p the input packet for which the 'packet too big' should be sent,\n *          p->payload pointing to the IPv6 header\n * @param mtu the maximum mtu that we can accept\n */\nvoid\nicmp6_packet_too_big(struct pbuf *p, u32_t mtu)\n{\n  icmp6_send_response(p, 0, mtu, ICMP6_TYPE_PTB);\n}\n\n/**\n * Send an icmpv6 'time exceeded' packet.\n *\n * @param p the input packet for which the 'unreachable' should be sent,\n *          p->payload pointing to the IPv6 header\n * @param c ICMPv6 code for the time exceeded type\n */\nvoid\nicmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c)\n{\n  icmp6_send_response(p, c, 0, ICMP6_TYPE_TE);\n}\n\n/**\n * Send an icmpv6 'parameter problem' packet.\n *\n * @param p the input packet for which the 'param problem' should be sent,\n *          p->payload pointing to the IP header\n * @param c ICMPv6 code for the param problem type\n * @param pointer the pointer to the byte where the parameter is found\n */\nvoid\nicmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, u32_t pointer)\n{\n  icmp6_send_response(p, c, pointer, ICMP6_TYPE_PP);\n}\n\n/**\n * Send an ICMPv6 packet in response to an incoming packet.\n *\n * @param p the input packet for which the response should be sent,\n *          p->payload pointing to the IPv6 header\n * @param code Code of the ICMPv6 header\n * @param data Additional 32-bit parameter in the ICMPv6 header\n * @param type Type of the ICMPv6 header\n */\nstatic void\nicmp6_send_response(struct pbuf *p, u8_t code, u32_t data, u8_t type)\n{\n  struct pbuf *q;\n  struct icmp6_hdr *icmp6hdr;\n  const ip6_addr_t *reply_src;\n  ip6_addr_t *reply_dest;\n  ip6_addr_t reply_src_local, reply_dest_local;\n  struct ip6_hdr *ip6hdr;\n  struct netif *netif;\n\n  /* ICMPv6 header + IPv6 header + data */\n  q = pbuf_alloc(PBUF_IP, sizeof(struct icmp6_hdr) + IP6_HLEN + LWIP_ICMP6_DATASIZE,\n                 PBUF_RAM);\n  if (q == NULL) {\n    LWIP_DEBUGF(ICMP_DEBUG, (\"icmp_time_exceeded: failed to allocate pbuf for ICMPv6 packet.\\n\"));\n    ICMP6_STATS_INC(icmp6.memerr);\n    return;\n  }\n  LWIP_ASSERT(\"check that first pbuf can hold icmp 6message\",\n             (q->len >= (sizeof(struct icmp6_hdr) + IP6_HLEN + LWIP_ICMP6_DATASIZE)));\n\n  icmp6hdr = (struct icmp6_hdr *)q->payload;\n  icmp6hdr->type = type;\n  icmp6hdr->code = code;\n  icmp6hdr->data = data;\n\n  /* copy fields from original packet */\n  SMEMCPY((u8_t *)q->payload + sizeof(struct icmp6_hdr), (u8_t *)p->payload,\n          IP6_HLEN + LWIP_ICMP6_DATASIZE);\n\n  /* Get the destination address and netif for this ICMP message. */\n  if ((ip_current_netif() == NULL) ||\n      ((code == ICMP6_TE_FRAG) && (type == ICMP6_TYPE_TE))) {\n    /* Special case, as ip6_current_xxx is either NULL, or points\n     * to a different packet than the one that expired.\n     * We must use the addresses that are stored in the expired packet. */\n    ip6hdr = (struct ip6_hdr *)p->payload;\n    /* copy from packed address to aligned address */\n    ip6_addr_copy(reply_dest_local, ip6hdr->src);\n    ip6_addr_copy(reply_src_local, ip6hdr->dest);\n    reply_dest = &reply_dest_local;\n    reply_src = &reply_src_local;\n    netif = ip6_route(reply_src, reply_dest);\n    if (netif == NULL) {\n      /* drop */\n      pbuf_free(q);\n      ICMP6_STATS_INC(icmp6.rterr);\n      return;\n    }\n  }\n  else {\n    netif = ip_current_netif();\n    reply_dest = ip6_current_src_addr();\n\n    /* Select an address to use as source. */\n    reply_src = ip_2_ip6(ip6_select_source_address(netif, reply_dest));\n    if (reply_src == NULL) {\n      /* drop */\n      pbuf_free(q);\n      ICMP6_STATS_INC(icmp6.rterr);\n      return;\n    }\n  }\n\n  /* calculate checksum */\n  icmp6hdr->chksum = 0;\n#if CHECKSUM_GEN_ICMP6\n  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) {\n    icmp6hdr->chksum = ip6_chksum_pseudo(q, IP6_NEXTH_ICMP6, q->tot_len,\n      reply_src, reply_dest);\n  }\n#endif /* CHECKSUM_GEN_ICMP6 */\n\n  ICMP6_STATS_INC(icmp6.xmit);\n  ip6_output_if(q, reply_src, reply_dest, LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif);\n  pbuf_free(q);\n}\n\n#endif /* LWIP_ICMP6 && LWIP_IPV6 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv6/inet6.c",
    "content": "/**\n * @file\n *\n * INET v6 addresses.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6 && LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/def.h\"\n#include \"lwip/inet.h\"\n\n/** This variable is initialized by the system to contain the wildcard IPv6 address.\n */\nconst struct in6_addr in6addr_any = IN6ADDR_ANY_INIT;\n\n#endif /* LWIP_IPV6 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv6/ip6.c",
    "content": "/**\n * @file\n *\n * IPv6 layer.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/def.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/ip6_frag.h\"\n#include \"lwip/icmp6.h\"\n#include \"lwip/raw.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/dhcp6.h\"\n#include \"lwip/nd6.h\"\n#include \"lwip/mld6.h\"\n#include \"lwip/debug.h\"\n#include \"lwip/stats.h\"\n\n#ifdef LWIP_HOOK_FILENAME\n#include LWIP_HOOK_FILENAME\n#endif\n\n/**\n * Finds the appropriate network interface for a given IPv6 address. It tries to select\n * a netif following a sequence of heuristics:\n * 1) if there is only 1 netif, return it\n * 2) if the destination is a link-local address, try to match the src address to a netif.\n *    this is a tricky case because with multiple netifs, link-local addresses only have\n *    meaning within a particular subnet/link.\n * 3) tries to match the destination subnet to a configured address\n * 4) tries to find a router\n * 5) tries to match the source address to the netif\n * 6) returns the default netif, if configured\n *\n * @param src the source IPv6 address, if known\n * @param dest the destination IPv6 address for which to find the route\n * @return the netif on which to send to reach dest\n */\nstruct netif *\nip6_route(const ip6_addr_t *src, const ip6_addr_t *dest)\n{\n  struct netif *netif;\n  s8_t i;\n\n  /* If single netif configuration, fast return. */\n  if ((netif_list != NULL) && (netif_list->next == NULL)) {\n    if (!netif_is_up(netif_list) || !netif_is_link_up(netif_list)) {\n      return NULL;\n    }\n    return netif_list;\n  }\n\n  /* Special processing for link-local addresses. */\n  if (ip6_addr_islinklocal(dest)) {\n    if (ip6_addr_isany(src)) {\n      /* Use default netif, if Up. */\n      if (netif_default == NULL || !netif_is_up(netif_default) ||\n          !netif_is_link_up(netif_default)) {\n        return NULL;\n      }\n      return netif_default;\n    }\n\n    /* Try to find the netif for the source address, checking that link is up. */\n    for (netif = netif_list; netif != NULL; netif = netif->next) {\n      if (!netif_is_up(netif) || !netif_is_link_up(netif)) {\n        continue;\n      }\n      for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n        if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n            ip6_addr_cmp(src, netif_ip6_addr(netif, i))) {\n          return netif;\n        }\n      }\n    }\n\n    /* netif not found, use default netif, if up */\n    if (netif_default == NULL || !netif_is_up(netif_default) ||\n        !netif_is_link_up(netif_default)) {\n      return NULL;\n    }\n    return netif_default;\n  }\n\n  /* we come here for non-link-local addresses */\n#ifdef LWIP_HOOK_IP6_ROUTE\n  netif = LWIP_HOOK_IP6_ROUTE(src, dest);\n  if (netif != NULL) {\n    return netif;\n  }\n#endif\n\n  /* See if the destination subnet matches a configured address. */\n  for (netif = netif_list; netif != NULL; netif = netif->next) {\n    if (!netif_is_up(netif) || !netif_is_link_up(netif)) {\n      continue;\n    }\n    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n          ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) {\n        return netif;\n      }\n    }\n  }\n\n  /* Get the netif for a suitable router. */\n  netif = nd6_find_route(dest);\n  if ((netif != NULL) && netif_is_up(netif) && netif_is_link_up(netif)) {\n    return netif;\n  }\n\n  /* try with the netif that matches the source address. */\n  if (!ip6_addr_isany(src)) {\n    for (netif = netif_list; netif != NULL; netif = netif->next) {\n      if (!netif_is_up(netif) || !netif_is_link_up(netif)) {\n        continue;\n      }\n      for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n        if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n            ip6_addr_cmp(src, netif_ip6_addr(netif, i))) {\n          return netif;\n        }\n      }\n    }\n  }\n\n#if LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF\n  /* loopif is disabled, loopback traffic is passed through any netif */\n  if (ip6_addr_isloopback(dest)) {\n    /* don't check for link on loopback traffic */\n    if (netif_default != NULL && netif_is_up(netif_default)) {\n      return netif_default;\n    }\n    /* default netif is not up, just use any netif for loopback traffic */\n    for (netif = netif_list; netif != NULL; netif = netif->next) {\n      if (netif_is_up(netif)) {\n        return netif;\n      }\n    }\n    return NULL;\n  }\n#endif /* LWIP_NETIF_LOOPBACK && !LWIP_HAVE_LOOPIF */\n\n  /* no matching netif found, use default netif, if up */\n  if ((netif_default == NULL) || !netif_is_up(netif_default) || !netif_is_link_up(netif_default)) {\n    return NULL;\n  }\n  return netif_default;\n}\n\n/**\n * @ingroup ip6\n * Select the best IPv6 source address for a given destination\n * IPv6 address. Loosely follows RFC 3484. \"Strong host\" behavior\n * is assumed.\n *\n * @param netif the netif on which to send a packet\n * @param dest the destination we are trying to reach\n * @return the most suitable source address to use, or NULL if no suitable\n *         source address is found\n */\nconst ip_addr_t *\nip6_select_source_address(struct netif *netif, const ip6_addr_t *dest)\n{\n  const ip_addr_t *src = NULL;\n  u8_t i;\n\n  /* If dest is link-local, choose a link-local source. */\n  if (ip6_addr_islinklocal(dest) || ip6_addr_ismulticast_linklocal(dest) || ip6_addr_ismulticast_iflocal(dest)) {\n    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n          ip6_addr_islinklocal(netif_ip6_addr(netif, i))) {\n        return netif_ip_addr6(netif, i);\n      }\n    }\n  }\n\n  /* Choose a site-local with matching prefix. */\n  if (ip6_addr_issitelocal(dest) || ip6_addr_ismulticast_sitelocal(dest)) {\n    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n          ip6_addr_issitelocal(netif_ip6_addr(netif, i)) &&\n          ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) {\n        return netif_ip_addr6(netif, i);\n      }\n    }\n  }\n\n  /* Choose a unique-local with matching prefix. */\n  if (ip6_addr_isuniquelocal(dest) || ip6_addr_ismulticast_orglocal(dest)) {\n    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n          ip6_addr_isuniquelocal(netif_ip6_addr(netif, i)) &&\n          ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) {\n        return netif_ip_addr6(netif, i);\n      }\n    }\n  }\n\n  /* Choose a global with best matching prefix. */\n  if (ip6_addr_isglobal(dest) || ip6_addr_ismulticast_global(dest)) {\n    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n          ip6_addr_isglobal(netif_ip6_addr(netif, i))) {\n        if (src == NULL) {\n          src = netif_ip_addr6(netif, i);\n        }\n        else {\n          /* Replace src only if we find a prefix match. */\n          /* @todo find longest matching prefix. */\n          if ((!(ip6_addr_netcmp(ip_2_ip6(src), dest))) &&\n              ip6_addr_netcmp(netif_ip6_addr(netif, i), dest)) {\n            src = netif_ip_addr6(netif, i);\n          }\n        }\n      }\n    }\n    if (src != NULL) {\n      return src;\n    }\n  }\n\n  /* Last resort: see if arbitrary prefix matches. */\n  for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n    if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n        ip6_addr_netcmp(dest, netif_ip6_addr(netif, i))) {\n      return netif_ip_addr6(netif, i);\n    }\n  }\n\n  return NULL;\n}\n\n#if LWIP_IPV6_FORWARD\n/**\n * Forwards an IPv6 packet. It finds an appropriate route for the\n * packet, decrements the HL value of the packet, and outputs\n * the packet on the appropriate interface.\n *\n * @param p the packet to forward (p->payload points to IP header)\n * @param iphdr the IPv6 header of the input packet\n * @param inp the netif on which this packet was received\n */\nstatic void\nip6_forward(struct pbuf *p, struct ip6_hdr *iphdr, struct netif *inp)\n{\n  struct netif *netif;\n\n  /* do not forward link-local or loopback addresses */\n  if (ip6_addr_islinklocal(ip6_current_dest_addr()) ||\n      ip6_addr_isloopback(ip6_current_dest_addr())) {\n    LWIP_DEBUGF(IP6_DEBUG, (\"ip6_forward: not forwarding link-local address.\\n\"));\n    IP6_STATS_INC(ip6.rterr);\n    IP6_STATS_INC(ip6.drop);\n    return;\n  }\n\n  /* Find network interface where to forward this IP packet to. */\n  netif = ip6_route(IP6_ADDR_ANY6, ip6_current_dest_addr());\n  if (netif == NULL) {\n    LWIP_DEBUGF(IP6_DEBUG, (\"ip6_forward: no route for %\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\"\\n\",\n        IP6_ADDR_BLOCK1(ip6_current_dest_addr()),\n        IP6_ADDR_BLOCK2(ip6_current_dest_addr()),\n        IP6_ADDR_BLOCK3(ip6_current_dest_addr()),\n        IP6_ADDR_BLOCK4(ip6_current_dest_addr()),\n        IP6_ADDR_BLOCK5(ip6_current_dest_addr()),\n        IP6_ADDR_BLOCK6(ip6_current_dest_addr()),\n        IP6_ADDR_BLOCK7(ip6_current_dest_addr()),\n        IP6_ADDR_BLOCK8(ip6_current_dest_addr())));\n#if LWIP_ICMP6\n    /* Don't send ICMP messages in response to ICMP messages */\n    if (IP6H_NEXTH(iphdr) != IP6_NEXTH_ICMP6) {\n      icmp6_dest_unreach(p, ICMP6_DUR_NO_ROUTE);\n    }\n#endif /* LWIP_ICMP6 */\n    IP6_STATS_INC(ip6.rterr);\n    IP6_STATS_INC(ip6.drop);\n    return;\n  }\n  /* Do not forward packets onto the same network interface on which\n   * they arrived. */\n  if (netif == inp) {\n    LWIP_DEBUGF(IP6_DEBUG, (\"ip6_forward: not bouncing packets back on incoming interface.\\n\"));\n    IP6_STATS_INC(ip6.rterr);\n    IP6_STATS_INC(ip6.drop);\n    return;\n  }\n\n  /* decrement HL */\n  IP6H_HOPLIM_SET(iphdr, IP6H_HOPLIM(iphdr) - 1);\n  /* send ICMP6 if HL == 0 */\n  if (IP6H_HOPLIM(iphdr) == 0) {\n#if LWIP_ICMP6\n    /* Don't send ICMP messages in response to ICMP messages */\n    if (IP6H_NEXTH(iphdr) != IP6_NEXTH_ICMP6) {\n      icmp6_time_exceeded(p, ICMP6_TE_HL);\n    }\n#endif /* LWIP_ICMP6 */\n    IP6_STATS_INC(ip6.drop);\n    return;\n  }\n\n  if (netif->mtu && (p->tot_len > netif->mtu)) {\n#if LWIP_ICMP6\n    /* Don't send ICMP messages in response to ICMP messages */\n    if (IP6H_NEXTH(iphdr) != IP6_NEXTH_ICMP6) {\n      icmp6_packet_too_big(p, netif->mtu);\n    }\n#endif /* LWIP_ICMP6 */\n    IP6_STATS_INC(ip6.drop);\n    return;\n  }\n\n  LWIP_DEBUGF(IP6_DEBUG, (\"ip6_forward: forwarding packet to %\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\"\\n\",\n      IP6_ADDR_BLOCK1(ip6_current_dest_addr()),\n      IP6_ADDR_BLOCK2(ip6_current_dest_addr()),\n      IP6_ADDR_BLOCK3(ip6_current_dest_addr()),\n      IP6_ADDR_BLOCK4(ip6_current_dest_addr()),\n      IP6_ADDR_BLOCK5(ip6_current_dest_addr()),\n      IP6_ADDR_BLOCK6(ip6_current_dest_addr()),\n      IP6_ADDR_BLOCK7(ip6_current_dest_addr()),\n      IP6_ADDR_BLOCK8(ip6_current_dest_addr())));\n\n  /* transmit pbuf on chosen interface */\n  netif->output_ip6(netif, p, ip6_current_dest_addr());\n  IP6_STATS_INC(ip6.fw);\n  IP6_STATS_INC(ip6.xmit);\n  return;\n}\n#endif /* LWIP_IPV6_FORWARD */\n\n/**\n * This function is called by the network interface device driver when\n * an IPv6 packet is received. The function does the basic checks of the\n * IP header such as packet size being at least larger than the header\n * size etc. If the packet was not destined for us, the packet is\n * forwarded (using ip6_forward).\n *\n * Finally, the packet is sent to the upper layer protocol input function.\n *\n * @param p the received IPv6 packet (p->payload points to IPv6 header)\n * @param inp the netif on which this packet was received\n * @return ERR_OK if the packet was processed (could return ERR_* if it wasn't\n *         processed, but currently always returns ERR_OK)\n */\nerr_t\nip6_input(struct pbuf *p, struct netif *inp)\n{\n  struct ip6_hdr *ip6hdr;\n  struct netif *netif;\n  u8_t nexth;\n  u16_t hlen; /* the current header length */\n  u8_t i;\n#if 0 /*IP_ACCEPT_LINK_LAYER_ADDRESSING*/\n  @todo\n  int check_ip_src=1;\n#endif /* IP_ACCEPT_LINK_LAYER_ADDRESSING */\n\n  IP6_STATS_INC(ip6.recv);\n\n  /* identify the IP header */\n  ip6hdr = (struct ip6_hdr *)p->payload;\n  if (IP6H_V(ip6hdr) != 6) {\n    LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_WARNING, (\"IPv6 packet dropped due to bad version number %\"U32_F\"\\n\",\n        IP6H_V(ip6hdr)));\n    pbuf_free(p);\n    IP6_STATS_INC(ip6.err);\n    IP6_STATS_INC(ip6.drop);\n    return ERR_OK;\n  }\n\n#ifdef LWIP_HOOK_IP6_INPUT\n  if (LWIP_HOOK_IP6_INPUT(p, inp)) {\n    /* the packet has been eaten */\n    return ERR_OK;\n  }\n#endif\n\n  /* header length exceeds first pbuf length, or ip length exceeds total pbuf length? */\n  if ((IP6_HLEN > p->len) || ((IP6H_PLEN(ip6hdr) + IP6_HLEN) > p->tot_len)) {\n    if (IP6_HLEN > p->len) {\n      LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n        (\"IPv6 header (len %\"U16_F\") does not fit in first pbuf (len %\"U16_F\"), IP packet dropped.\\n\",\n            (u16_t)IP6_HLEN, p->len));\n    }\n    if ((IP6H_PLEN(ip6hdr) + IP6_HLEN) > p->tot_len) {\n      LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n        (\"IPv6 (plen %\"U16_F\") is longer than pbuf (len %\"U16_F\"), IP packet dropped.\\n\",\n            (u16_t)(IP6H_PLEN(ip6hdr) + IP6_HLEN), p->tot_len));\n    }\n    /* free (drop) packet pbufs */\n    pbuf_free(p);\n    IP6_STATS_INC(ip6.lenerr);\n    IP6_STATS_INC(ip6.drop);\n    return ERR_OK;\n  }\n\n  /* Trim pbuf. This should have been done at the netif layer,\n   * but we'll do it anyway just to be sure that its done. */\n  pbuf_realloc(p, IP6_HLEN + IP6H_PLEN(ip6hdr));\n\n  /* copy IP addresses to aligned ip6_addr_t */\n  ip_addr_copy_from_ip6(ip_data.current_iphdr_dest, ip6hdr->dest);\n  ip_addr_copy_from_ip6(ip_data.current_iphdr_src, ip6hdr->src);\n\n  /* Don't accept virtual IPv4 mapped IPv6 addresses.\n   * Don't accept multicast source addresses. */\n  if (ip6_addr_isipv4mappedipv6(ip_2_ip6(&ip_data.current_iphdr_dest)) ||\n     ip6_addr_isipv4mappedipv6(ip_2_ip6(&ip_data.current_iphdr_src)) ||\n     ip6_addr_ismulticast(ip_2_ip6(&ip_data.current_iphdr_src))) {\n    IP6_STATS_INC(ip6.err);\n    IP6_STATS_INC(ip6.drop);\n    return ERR_OK;\n  }\n\n  /* current header pointer. */\n  ip_data.current_ip6_header = ip6hdr;\n\n  /* In netif, used in case we need to send ICMPv6 packets back. */\n  ip_data.current_netif = inp;\n  ip_data.current_input_netif = inp;\n\n  /* match packet against an interface, i.e. is this packet for us? */\n  if (ip6_addr_ismulticast(ip6_current_dest_addr())) {\n    /* Always joined to multicast if-local and link-local all-nodes group. */\n    if (ip6_addr_isallnodes_iflocal(ip6_current_dest_addr()) ||\n        ip6_addr_isallnodes_linklocal(ip6_current_dest_addr())) {\n      netif = inp;\n    }\n#if LWIP_IPV6_MLD\n    else if (mld6_lookfor_group(inp, ip6_current_dest_addr())) {\n      netif = inp;\n    }\n#else /* LWIP_IPV6_MLD */\n    else if (ip6_addr_issolicitednode(ip6_current_dest_addr())) {\n      /* Filter solicited node packets when MLD is not enabled\n       * (for Neighbor discovery). */\n      netif = NULL;\n      for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n        if (ip6_addr_isvalid(netif_ip6_addr_state(inp, i)) &&\n            ip6_addr_cmp_solicitednode(ip6_current_dest_addr(), netif_ip6_addr(inp, i))) {\n          netif = inp;\n          LWIP_DEBUGF(IP6_DEBUG, (\"ip6_input: solicited node packet accepted on interface %c%c\\n\",\n              netif->name[0], netif->name[1]));\n          break;\n        }\n      }\n    }\n#endif /* LWIP_IPV6_MLD */\n    else {\n      netif = NULL;\n    }\n  } else {\n    /* start trying with inp. if that's not acceptable, start walking the\n       list of configured netifs.\n       'first' is used as a boolean to mark whether we started walking the list */\n    int first = 1;\n    netif = inp;\n    do {\n      /* interface is up? */\n      if (netif_is_up(netif)) {\n        /* unicast to this interface address? address configured? */\n        for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n          if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n              ip6_addr_cmp(ip6_current_dest_addr(), netif_ip6_addr(netif, i))) {\n            /* exit outer loop */\n            goto netif_found;\n          }\n        }\n      }\n      if (first) {\n        if (ip6_addr_islinklocal(ip6_current_dest_addr())\n#if !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF\n            || ip6_addr_isloopback(ip6_current_dest_addr())\n#endif /* !LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF */\n        ) {\n          /* Do not match link-local addresses to other netifs. The loopback\n           * address is to be considered link-local and packets to it should be\n           * dropped on other interfaces, as per RFC 4291 Sec. 2.5.3. This\n           * requirement cannot be implemented in the case that loopback\n           * traffic is sent across a non-loopback interface, however.\n           */\n          netif = NULL;\n          break;\n        }\n        first = 0;\n        netif = netif_list;\n      } else {\n        netif = netif->next;\n      }\n      if (netif == inp) {\n        netif = netif->next;\n      }\n    } while (netif != NULL);\nnetif_found:\n    LWIP_DEBUGF(IP6_DEBUG, (\"ip6_input: packet accepted on interface %c%c\\n\",\n        netif ? netif->name[0] : 'X', netif? netif->name[1] : 'X'));\n  }\n\n  /* \"::\" packet source address? (used in duplicate address detection) */\n  if (ip6_addr_isany(ip6_current_src_addr()) &&\n      (!ip6_addr_issolicitednode(ip6_current_dest_addr()))) {\n    /* packet source is not valid */\n    /* free (drop) packet pbufs */\n    LWIP_DEBUGF(IP6_DEBUG, (\"ip6_input: packet with src ANY_ADDRESS dropped\\n\"));\n    pbuf_free(p);\n    IP6_STATS_INC(ip6.drop);\n    goto ip6_input_cleanup;\n  }\n\n  /* packet not for us? */\n  if (netif == NULL) {\n    /* packet not for us, route or discard */\n    LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_TRACE, (\"ip6_input: packet not for us.\\n\"));\n#if LWIP_IPV6_FORWARD\n    /* non-multicast packet? */\n    if (!ip6_addr_ismulticast(ip6_current_dest_addr())) {\n      /* try to forward IP packet on (other) interfaces */\n      ip6_forward(p, ip6hdr, inp);\n    }\n#endif /* LWIP_IPV6_FORWARD */\n    pbuf_free(p);\n    goto ip6_input_cleanup;\n  }\n\n  /* current netif pointer. */\n  ip_data.current_netif = netif;\n\n  /* Save next header type. */\n  nexth = IP6H_NEXTH(ip6hdr);\n\n  /* Init header length. */\n  hlen = ip_data.current_ip_header_tot_len = IP6_HLEN;\n\n  /* Move to payload. */\n  pbuf_header(p, -IP6_HLEN);\n\n  /* Process known option extension headers, if present. */\n  while (nexth != IP6_NEXTH_NONE)\n  {\n    switch (nexth) {\n    case IP6_NEXTH_HOPBYHOP:\n      LWIP_DEBUGF(IP6_DEBUG, (\"ip6_input: packet with Hop-by-Hop options header\\n\"));\n      /* Get next header type. */\n      nexth = *((u8_t *)p->payload);\n\n      /* Get the header length. */\n      hlen = 8 * (1 + *((u8_t *)p->payload + 1));\n      ip_data.current_ip_header_tot_len += hlen;\n\n      /* Skip over this header. */\n      if (hlen > p->len) {\n        LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n          (\"IPv6 options header (hlen %\"U16_F\") does not fit in first pbuf (len %\"U16_F\"), IPv6 packet dropped.\\n\",\n              hlen, p->len));\n        /* free (drop) packet pbufs */\n        pbuf_free(p);\n        IP6_STATS_INC(ip6.lenerr);\n        IP6_STATS_INC(ip6.drop);\n        goto ip6_input_cleanup;\n      }\n\n      pbuf_header(p, -(s16_t)hlen);\n      break;\n    case IP6_NEXTH_DESTOPTS:\n      LWIP_DEBUGF(IP6_DEBUG, (\"ip6_input: packet with Destination options header\\n\"));\n      /* Get next header type. */\n      nexth = *((u8_t *)p->payload);\n\n      /* Get the header length. */\n      hlen = 8 * (1 + *((u8_t *)p->payload + 1));\n      ip_data.current_ip_header_tot_len += hlen;\n\n      /* Skip over this header. */\n      if (hlen > p->len) {\n        LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n          (\"IPv6 options header (hlen %\"U16_F\") does not fit in first pbuf (len %\"U16_F\"), IPv6 packet dropped.\\n\",\n              hlen, p->len));\n        /* free (drop) packet pbufs */\n        pbuf_free(p);\n        IP6_STATS_INC(ip6.lenerr);\n        IP6_STATS_INC(ip6.drop);\n        goto ip6_input_cleanup;\n      }\n\n      pbuf_header(p, -(s16_t)hlen);\n      break;\n    case IP6_NEXTH_ROUTING:\n      LWIP_DEBUGF(IP6_DEBUG, (\"ip6_input: packet with Routing header\\n\"));\n      /* Get next header type. */\n      nexth = *((u8_t *)p->payload);\n\n      /* Get the header length. */\n      hlen = 8 * (1 + *((u8_t *)p->payload + 1));\n      ip_data.current_ip_header_tot_len += hlen;\n\n      /* Skip over this header. */\n      if (hlen > p->len) {\n        LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n          (\"IPv6 options header (hlen %\"U16_F\") does not fit in first pbuf (len %\"U16_F\"), IPv6 packet dropped.\\n\",\n              hlen, p->len));\n        /* free (drop) packet pbufs */\n        pbuf_free(p);\n        IP6_STATS_INC(ip6.lenerr);\n        IP6_STATS_INC(ip6.drop);\n        goto ip6_input_cleanup;\n      }\n\n      pbuf_header(p, -(s16_t)hlen);\n      break;\n\n    case IP6_NEXTH_FRAGMENT:\n    {\n      struct ip6_frag_hdr *frag_hdr;\n      LWIP_DEBUGF(IP6_DEBUG, (\"ip6_input: packet with Fragment header\\n\"));\n\n      frag_hdr = (struct ip6_frag_hdr *)p->payload;\n\n      /* Get next header type. */\n      nexth = frag_hdr->_nexth;\n\n      /* Fragment Header length. */\n      hlen = 8;\n      ip_data.current_ip_header_tot_len += hlen;\n\n      /* Make sure this header fits in current pbuf. */\n      if (hlen > p->len) {\n        LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n          (\"IPv6 options header (hlen %\"U16_F\") does not fit in first pbuf (len %\"U16_F\"), IPv6 packet dropped.\\n\",\n              hlen, p->len));\n        /* free (drop) packet pbufs */\n        pbuf_free(p);\n        IP6_FRAG_STATS_INC(ip6_frag.lenerr);\n        IP6_FRAG_STATS_INC(ip6_frag.drop);\n        goto ip6_input_cleanup;\n      }\n\n      /* Offset == 0 and more_fragments == 0? */\n      if ((frag_hdr->_fragment_offset &\n           PP_HTONS(IP6_FRAG_OFFSET_MASK | IP6_FRAG_MORE_FLAG)) == 0) {\n        /* This is a 1-fragment packet, usually a packet that we have\n         * already reassembled. Skip this header anc continue. */\n        pbuf_header(p, -(s16_t)hlen);\n      } else {\n#if LWIP_IPV6_REASS\n\n        /* reassemble the packet */\n        p = ip6_reass(p);\n        /* packet not fully reassembled yet? */\n        if (p == NULL) {\n          goto ip6_input_cleanup;\n        }\n\n        /* Returned p point to IPv6 header.\n         * Update all our variables and pointers and continue. */\n        ip6hdr = (struct ip6_hdr *)p->payload;\n        nexth = IP6H_NEXTH(ip6hdr);\n        hlen = ip_data.current_ip_header_tot_len = IP6_HLEN;\n        pbuf_header(p, -IP6_HLEN);\n\n#else /* LWIP_IPV6_REASS */\n        /* free (drop) packet pbufs */\n        LWIP_DEBUGF(IP6_DEBUG, (\"ip6_input: packet with Fragment header dropped (with LWIP_IPV6_REASS==0)\\n\"));\n        pbuf_free(p);\n        IP6_STATS_INC(ip6.opterr);\n        IP6_STATS_INC(ip6.drop);\n        goto ip6_input_cleanup;\n#endif /* LWIP_IPV6_REASS */\n      }\n      break;\n    }\n    default:\n      goto options_done;\n      break;\n    }\n  }\noptions_done:\n\n  /* p points to IPv6 header again. */\n  pbuf_header_force(p, (s16_t)ip_data.current_ip_header_tot_len);\n\n  /* send to upper layers */\n  LWIP_DEBUGF(IP6_DEBUG, (\"ip6_input: \\n\"));\n  ip6_debug_print(p);\n  LWIP_DEBUGF(IP6_DEBUG, (\"ip6_input: p->len %\"U16_F\" p->tot_len %\"U16_F\"\\n\", p->len, p->tot_len));\n\n#if LWIP_RAW\n  /* raw input did not eat the packet? */\n  if (raw_input(p, inp) == 0)\n#endif /* LWIP_RAW */\n  {\n    switch (nexth) {\n    case IP6_NEXTH_NONE:\n      pbuf_free(p);\n      break;\n#if LWIP_UDP\n    case IP6_NEXTH_UDP:\n#if LWIP_UDPLITE\n    case IP6_NEXTH_UDPLITE:\n#endif /* LWIP_UDPLITE */\n      /* Point to payload. */\n      pbuf_header(p, -(s16_t)ip_data.current_ip_header_tot_len);\n      udp_input(p, inp);\n      break;\n#endif /* LWIP_UDP */\n#if LWIP_TCP\n    case IP6_NEXTH_TCP:\n      /* Point to payload. */\n      pbuf_header(p, -(s16_t)ip_data.current_ip_header_tot_len);\n      tcp_input(p, inp);\n      break;\n#endif /* LWIP_TCP */\n#if LWIP_ICMP6\n    case IP6_NEXTH_ICMP6:\n      /* Point to payload. */\n      pbuf_header(p, -(s16_t)ip_data.current_ip_header_tot_len);\n      icmp6_input(p, inp);\n      break;\n#endif /* LWIP_ICMP */\n    default:\n#if LWIP_ICMP6\n      /* send ICMP parameter problem unless it was a multicast or ICMPv6 */\n      if ((!ip6_addr_ismulticast(ip6_current_dest_addr())) &&\n          (IP6H_NEXTH(ip6hdr) != IP6_NEXTH_ICMP6)) {\n        icmp6_param_problem(p, ICMP6_PP_HEADER, ip_data.current_ip_header_tot_len - hlen);\n      }\n#endif /* LWIP_ICMP */\n      LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"ip6_input: Unsupported transport protocol %\"U16_F\"\\n\", (u16_t)IP6H_NEXTH(ip6hdr)));\n      pbuf_free(p);\n      IP6_STATS_INC(ip6.proterr);\n      IP6_STATS_INC(ip6.drop);\n      break;\n    }\n  }\n\nip6_input_cleanup:\n  ip_data.current_netif = NULL;\n  ip_data.current_input_netif = NULL;\n  ip_data.current_ip6_header = NULL;\n  ip_data.current_ip_header_tot_len = 0;\n  ip6_addr_set_zero(ip6_current_src_addr());\n  ip6_addr_set_zero(ip6_current_dest_addr());\n\n  return ERR_OK;\n}\n\n\n/**\n * Sends an IPv6 packet on a network interface. This function constructs\n * the IPv6 header. If the source IPv6 address is NULL, the IPv6 \"ANY\" address is\n * used as source (usually during network startup). If the source IPv6 address it\n * IP6_ADDR_ANY, the most appropriate IPv6 address of the outgoing network\n * interface is filled in as source address. If the destination IPv6 address is\n * LWIP_IP_HDRINCL, p is assumed to already include an IPv6 header and\n * p->payload points to it instead of the data.\n *\n * @param p the packet to send (p->payload points to the data, e.g. next\n            protocol header; if dest == LWIP_IP_HDRINCL, p already includes an\n            IPv6 header and p->payload points to that IPv6 header)\n * @param src the source IPv6 address to send from (if src == IP6_ADDR_ANY, an\n *         IP address of the netif is selected and used as source address.\n *         if src == NULL, IP6_ADDR_ANY is used as source)\n * @param dest the destination IPv6 address to send the packet to\n * @param hl the Hop Limit value to be set in the IPv6 header\n * @param tc the Traffic Class value to be set in the IPv6 header\n * @param nexth the Next Header to be set in the IPv6 header\n * @param netif the netif on which to send this packet\n * @return ERR_OK if the packet was sent OK\n *         ERR_BUF if p doesn't have enough space for IPv6/LINK headers\n *         returns errors returned by netif->output\n */\nerr_t\nip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,\n             u8_t hl, u8_t tc,\n             u8_t nexth, struct netif *netif)\n{\n  const ip6_addr_t *src_used = src;\n  if (dest != LWIP_IP_HDRINCL) {\n    if (src != NULL && ip6_addr_isany(src)) {\n      src_used = ip_2_ip6(ip6_select_source_address(netif, dest));\n      if ((src_used == NULL) || ip6_addr_isany(src_used)) {\n        /* No appropriate source address was found for this packet. */\n        LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"ip6_output: No suitable source address for packet.\\n\"));\n        IP6_STATS_INC(ip6.rterr);\n        return ERR_RTE;\n      }\n    }\n  }\n  return ip6_output_if_src(p, src_used, dest, hl, tc, nexth, netif);\n}\n\n/**\n * Same as ip6_output_if() but 'src' address is not replaced by netif address\n * when it is 'any'.\n */\nerr_t\nip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,\n             u8_t hl, u8_t tc,\n             u8_t nexth, struct netif *netif)\n{\n  struct ip6_hdr *ip6hdr;\n  ip6_addr_t dest_addr;\n\n  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);\n\n  /* Should the IPv6 header be generated or is it already included in p? */\n  if (dest != LWIP_IP_HDRINCL) {\n    /* generate IPv6 header */\n    if (pbuf_header(p, IP6_HLEN)) {\n      LWIP_DEBUGF(IP6_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"ip6_output: not enough room for IPv6 header in pbuf\\n\"));\n      IP6_STATS_INC(ip6.err);\n      return ERR_BUF;\n    }\n\n    ip6hdr = (struct ip6_hdr *)p->payload;\n    LWIP_ASSERT(\"check that first pbuf can hold struct ip6_hdr\",\n               (p->len >= sizeof(struct ip6_hdr)));\n\n    IP6H_HOPLIM_SET(ip6hdr, hl);\n    IP6H_NEXTH_SET(ip6hdr, nexth);\n\n    /* dest cannot be NULL here */\n    ip6_addr_copy(ip6hdr->dest, *dest);\n\n    IP6H_VTCFL_SET(ip6hdr, 6, tc, 0);\n    IP6H_PLEN_SET(ip6hdr, p->tot_len - IP6_HLEN);\n\n    if (src == NULL) {\n      src = IP6_ADDR_ANY6;\n    }\n    /* src cannot be NULL here */\n    ip6_addr_copy(ip6hdr->src, *src);\n\n  } else {\n    /* IP header already included in p */\n    ip6hdr = (struct ip6_hdr *)p->payload;\n    ip6_addr_copy(dest_addr, ip6hdr->dest);\n    dest = &dest_addr;\n  }\n\n  IP6_STATS_INC(ip6.xmit);\n\n  LWIP_DEBUGF(IP6_DEBUG, (\"ip6_output_if: %c%c%\"U16_F\"\\n\", netif->name[0], netif->name[1], (u16_t)netif->num));\n  ip6_debug_print(p);\n\n#if ENABLE_LOOPBACK\n  {\n    int i;\n#if !LWIP_HAVE_LOOPIF\n    if (ip6_addr_isloopback(dest)) {\n      return netif_loop_output(netif, p);\n    }\n#endif /* !LWIP_HAVE_LOOPIF */\n    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n      if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n          ip6_addr_cmp(dest, netif_ip6_addr(netif, i))) {\n        /* Packet to self, enqueue it for loopback */\n        LWIP_DEBUGF(IP6_DEBUG, (\"netif_loop_output()\\n\"));\n        return netif_loop_output(netif, p);\n      }\n    }\n  }\n#endif /* ENABLE_LOOPBACK */\n#if LWIP_IPV6_FRAG\n  /* don't fragment if interface has mtu set to 0 [loopif] */\n  if (netif->mtu && (p->tot_len > nd6_get_destination_mtu(dest, netif))) {\n    return ip6_frag(p, netif, dest);\n  }\n#endif /* LWIP_IPV6_FRAG */\n\n  LWIP_DEBUGF(IP6_DEBUG, (\"netif->output_ip6()\\n\"));\n  return netif->output_ip6(netif, p, dest);\n}\n\n/**\n * Simple interface to ip6_output_if. It finds the outgoing network\n * interface and calls upon ip6_output_if to do the actual work.\n *\n * @param p the packet to send (p->payload points to the data, e.g. next\n            protocol header; if dest == LWIP_IP_HDRINCL, p already includes an\n            IPv6 header and p->payload points to that IPv6 header)\n * @param src the source IPv6 address to send from (if src == IP6_ADDR_ANY, an\n *         IP address of the netif is selected and used as source address.\n *         if src == NULL, IP6_ADDR_ANY is used as source)\n * @param dest the destination IPv6 address to send the packet to\n * @param hl the Hop Limit value to be set in the IPv6 header\n * @param tc the Traffic Class value to be set in the IPv6 header\n * @param nexth the Next Header to be set in the IPv6 header\n *\n * @return ERR_RTE if no route is found\n *         see ip_output_if() for more return values\n */\nerr_t\nip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,\n          u8_t hl, u8_t tc, u8_t nexth)\n{\n  struct netif *netif;\n  struct ip6_hdr *ip6hdr;\n  ip6_addr_t src_addr, dest_addr;\n\n  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);\n\n  if (dest != LWIP_IP_HDRINCL) {\n    netif = ip6_route(src, dest);\n  } else {\n    /* IP header included in p, read addresses. */\n    ip6hdr = (struct ip6_hdr *)p->payload;\n    ip6_addr_copy(src_addr, ip6hdr->src);\n    ip6_addr_copy(dest_addr, ip6hdr->dest);\n    netif = ip6_route(&src_addr, &dest_addr);\n  }\n\n  if (netif == NULL) {\n    LWIP_DEBUGF(IP6_DEBUG, (\"ip6_output: no route for %\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\"\\n\",\n        IP6_ADDR_BLOCK1(dest),\n        IP6_ADDR_BLOCK2(dest),\n        IP6_ADDR_BLOCK3(dest),\n        IP6_ADDR_BLOCK4(dest),\n        IP6_ADDR_BLOCK5(dest),\n        IP6_ADDR_BLOCK6(dest),\n        IP6_ADDR_BLOCK7(dest),\n        IP6_ADDR_BLOCK8(dest)));\n    IP6_STATS_INC(ip6.rterr);\n    return ERR_RTE;\n  }\n\n  return ip6_output_if(p, src, dest, hl, tc, nexth, netif);\n}\n\n\n#if LWIP_NETIF_HWADDRHINT\n/** Like ip6_output, but takes and addr_hint pointer that is passed on to netif->addr_hint\n *  before calling ip6_output_if.\n *\n * @param p the packet to send (p->payload points to the data, e.g. next\n            protocol header; if dest == LWIP_IP_HDRINCL, p already includes an\n            IPv6 header and p->payload points to that IPv6 header)\n * @param src the source IPv6 address to send from (if src == IP6_ADDR_ANY, an\n *         IP address of the netif is selected and used as source address.\n *         if src == NULL, IP6_ADDR_ANY is used as source)\n * @param dest the destination IPv6 address to send the packet to\n * @param hl the Hop Limit value to be set in the IPv6 header\n * @param tc the Traffic Class value to be set in the IPv6 header\n * @param nexth the Next Header to be set in the IPv6 header\n * @param addr_hint address hint pointer set to netif->addr_hint before\n *        calling ip_output_if()\n *\n * @return ERR_RTE if no route is found\n *         see ip_output_if() for more return values\n */\nerr_t\nip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,\n          u8_t hl, u8_t tc, u8_t nexth, u8_t *addr_hint)\n{\n  struct netif *netif;\n  struct ip6_hdr *ip6hdr;\n  ip6_addr_t src_addr, dest_addr;\n  err_t err;\n\n  LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p);\n\n  if (dest != LWIP_IP_HDRINCL) {\n    netif = ip6_route(src, dest);\n  } else {\n    /* IP header included in p, read addresses. */\n    ip6hdr = (struct ip6_hdr *)p->payload;\n    ip6_addr_copy(src_addr, ip6hdr->src);\n    ip6_addr_copy(dest_addr, ip6hdr->dest);\n    netif = ip6_route(&src_addr, &dest_addr);\n  }\n\n  if (netif == NULL) {\n    LWIP_DEBUGF(IP6_DEBUG, (\"ip6_output: no route for %\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\":%\"X16_F\"\\n\",\n        IP6_ADDR_BLOCK1(dest),\n        IP6_ADDR_BLOCK2(dest),\n        IP6_ADDR_BLOCK3(dest),\n        IP6_ADDR_BLOCK4(dest),\n        IP6_ADDR_BLOCK5(dest),\n        IP6_ADDR_BLOCK6(dest),\n        IP6_ADDR_BLOCK7(dest),\n        IP6_ADDR_BLOCK8(dest)));\n    IP6_STATS_INC(ip6.rterr);\n    return ERR_RTE;\n  }\n\n  NETIF_SET_HWADDRHINT(netif, addr_hint);\n  err = ip6_output_if(p, src, dest, hl, tc, nexth, netif);\n  NETIF_SET_HWADDRHINT(netif, NULL);\n\n  return err;\n}\n#endif /* LWIP_NETIF_HWADDRHINT*/\n\n#if LWIP_IPV6_MLD\n/**\n * Add a hop-by-hop options header with a router alert option and padding.\n *\n * Used by MLD when sending a Multicast listener report/done message.\n *\n * @param p the packet to which we will prepend the options header\n * @param nexth the next header protocol number (e.g. IP6_NEXTH_ICMP6)\n * @param value the value of the router alert option data (e.g. IP6_ROUTER_ALERT_VALUE_MLD)\n * @return ERR_OK if hop-by-hop header was added, ERR_* otherwise\n */\nerr_t\nip6_options_add_hbh_ra(struct pbuf *p, u8_t nexth, u8_t value)\n{\n  struct ip6_hbh_hdr *hbh_hdr;\n\n  /* Move pointer to make room for hop-by-hop options header. */\n  if (pbuf_header(p, sizeof(struct ip6_hbh_hdr))) {\n    LWIP_DEBUGF(IP6_DEBUG, (\"ip6_options: no space for options header\\n\"));\n    IP6_STATS_INC(ip6.err);\n    return ERR_BUF;\n  }\n\n  hbh_hdr = (struct ip6_hbh_hdr *)p->payload;\n\n  /* Set fields. */\n  hbh_hdr->_nexth = nexth;\n  hbh_hdr->_hlen = 0;\n  hbh_hdr->_ra_opt_type = IP6_ROUTER_ALERT_OPTION;\n  hbh_hdr->_ra_opt_dlen = 2;\n  hbh_hdr->_ra_opt_data = value;\n  hbh_hdr->_padn_opt_type = IP6_PADN_ALERT_OPTION;\n  hbh_hdr->_padn_opt_dlen = 0;\n\n  return ERR_OK;\n}\n#endif /* LWIP_IPV6_MLD */\n\n#if IP6_DEBUG\n/* Print an IPv6 header by using LWIP_DEBUGF\n * @param p an IPv6 packet, p->payload pointing to the IPv6 header\n */\nvoid\nip6_debug_print(struct pbuf *p)\n{\n  struct ip6_hdr *ip6hdr = (struct ip6_hdr *)p->payload;\n\n  LWIP_DEBUGF(IP6_DEBUG, (\"IPv6 header:\\n\"));\n  LWIP_DEBUGF(IP6_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(IP6_DEBUG, (\"| %2\"U16_F\" |  %3\"U16_F\"  |      %7\"U32_F\"     | (ver, class, flow)\\n\",\n                    IP6H_V(ip6hdr),\n                    IP6H_TC(ip6hdr),\n                    IP6H_FL(ip6hdr)));\n  LWIP_DEBUGF(IP6_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(IP6_DEBUG, (\"|     %5\"U16_F\"     |  %3\"U16_F\"  |  %3\"U16_F\"  | (plen, nexth, hopl)\\n\",\n                    IP6H_PLEN(ip6hdr),\n                    IP6H_NEXTH(ip6hdr),\n                    IP6H_HOPLIM(ip6hdr)));\n  LWIP_DEBUGF(IP6_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(IP6_DEBUG, (\"|  %4\"X32_F\" |  %4\"X32_F\" |  %4\"X32_F\" |  %4\"X32_F\" | (src)\\n\",\n                    IP6_ADDR_BLOCK1(&(ip6hdr->src)),\n                    IP6_ADDR_BLOCK2(&(ip6hdr->src)),\n                    IP6_ADDR_BLOCK3(&(ip6hdr->src)),\n                    IP6_ADDR_BLOCK4(&(ip6hdr->src))));\n  LWIP_DEBUGF(IP6_DEBUG, (\"|  %4\"X32_F\" |  %4\"X32_F\" |  %4\"X32_F\" |  %4\"X32_F\" |\\n\",\n                    IP6_ADDR_BLOCK5(&(ip6hdr->src)),\n                    IP6_ADDR_BLOCK6(&(ip6hdr->src)),\n                    IP6_ADDR_BLOCK7(&(ip6hdr->src)),\n                    IP6_ADDR_BLOCK8(&(ip6hdr->src))));\n  LWIP_DEBUGF(IP6_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(IP6_DEBUG, (\"|  %4\"X32_F\" |  %4\"X32_F\" |  %4\"X32_F\" |  %4\"X32_F\" | (dest)\\n\",\n                    IP6_ADDR_BLOCK1(&(ip6hdr->dest)),\n                    IP6_ADDR_BLOCK2(&(ip6hdr->dest)),\n                    IP6_ADDR_BLOCK3(&(ip6hdr->dest)),\n                    IP6_ADDR_BLOCK4(&(ip6hdr->dest))));\n  LWIP_DEBUGF(IP6_DEBUG, (\"|  %4\"X32_F\" |  %4\"X32_F\" |  %4\"X32_F\" |  %4\"X32_F\" |\\n\",\n                    IP6_ADDR_BLOCK5(&(ip6hdr->dest)),\n                    IP6_ADDR_BLOCK6(&(ip6hdr->dest)),\n                    IP6_ADDR_BLOCK7(&(ip6hdr->dest)),\n                    IP6_ADDR_BLOCK8(&(ip6hdr->dest))));\n  LWIP_DEBUGF(IP6_DEBUG, (\"+-------------------------------+\\n\"));\n}\n#endif /* IP6_DEBUG */\n\n#endif /* LWIP_IPV6 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv6/ip6_addr.c",
    "content": "/**\n * @file\n *\n * IPv6 addresses.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n * Functions for handling IPv6 addresses.\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/ip_addr.h\"\n#include \"lwip/def.h\"\n\n/* used by IP6_ADDR_ANY(6) in ip6_addr.h */\nconst ip_addr_t ip6_addr_any = IPADDR6_INIT(0ul, 0ul, 0ul, 0ul);\n\n#ifndef isprint\n#define in_range(c, lo, up)  ((u8_t)c >= lo && (u8_t)c <= up)\n#define isprint(c)           in_range(c, 0x20, 0x7f)\n#define isdigit(c)           in_range(c, '0', '9')\n#define isxdigit(c)          (isdigit(c) || in_range(c, 'a', 'f') || in_range(c, 'A', 'F'))\n#define islower(c)           in_range(c, 'a', 'z')\n#define isspace(c)           (c == ' ' || c == '\\f' || c == '\\n' || c == '\\r' || c == '\\t' || c == '\\v')\n#define xchar(i)             ((i) < 10 ? '0' + (i) : 'A' + (i) - 10)\n#endif\n\n/**\n * Check whether \"cp\" is a valid ascii representation\n * of an IPv6 address and convert to a binary address.\n * Returns 1 if the address is valid, 0 if not.\n *\n * @param cp IPv6 address in ascii representation (e.g. \"FF01::1\")\n * @param addr pointer to which to save the ip address in network order\n * @return 1 if cp could be converted to addr, 0 on failure\n */\nint\nip6addr_aton(const char *cp, ip6_addr_t *addr)\n{\n  u32_t addr_index, zero_blocks, current_block_index, current_block_value;\n  const char *s;\n\n  /* Count the number of colons, to count the number of blocks in a \"::\" sequence\n     zero_blocks may be 1 even if there are no :: sequences */\n  zero_blocks = 8;\n  for (s = cp; *s != 0; s++) {\n    if (*s == ':') {\n      zero_blocks--;\n    } else if (!isxdigit(*s)) {\n      break;\n    }\n  }\n\n  /* parse each block */\n  addr_index = 0;\n  current_block_index = 0;\n  current_block_value = 0;\n  for (s = cp; *s != 0; s++) {\n    if (*s == ':') {\n      if (addr) {\n        if (current_block_index & 0x1) {\n          addr->addr[addr_index++] |= current_block_value;\n        }\n        else {\n          addr->addr[addr_index] = current_block_value << 16;\n        }\n      }\n      current_block_index++;\n      current_block_value = 0;\n      if (current_block_index > 7) {\n        /* address too long! */\n        return 0;\n      }\n      if (s[1] == ':') {\n        if (s[2] == ':') {\n          /* invalid format: three successive colons */\n          return 0;\n        }\n        s++;\n        /* \"::\" found, set zeros */\n        while (zero_blocks > 0) {\n          zero_blocks--;\n          if (current_block_index & 0x1) {\n            addr_index++;\n          } else {\n            if (addr) {\n              addr->addr[addr_index] = 0;\n            }\n          }\n          current_block_index++;\n          if (current_block_index > 7) {\n            /* address too long! */\n            return 0;\n          }\n        }\n      }\n    } else if (isxdigit(*s)) {\n      /* add current digit */\n      current_block_value = (current_block_value << 4) +\n          (isdigit(*s) ? (u32_t)(*s - '0') :\n          (u32_t)(10 + (islower(*s) ? *s - 'a' : *s - 'A')));\n    } else {\n      /* unexpected digit, space? CRLF? */\n      break;\n    }\n  }\n\n  if (addr) {\n    if (current_block_index & 0x1) {\n      addr->addr[addr_index++] |= current_block_value;\n    }\n    else {\n      addr->addr[addr_index] = current_block_value << 16;\n    }\n  }\n\n  /* convert to network byte order. */\n  if (addr) {\n    for (addr_index = 0; addr_index < 4; addr_index++) {\n      addr->addr[addr_index] = lwip_htonl(addr->addr[addr_index]);\n    }\n  }\n\n  if (current_block_index != 7) {\n    return 0;\n  }\n\n  return 1;\n}\n\n/**\n * Convert numeric IPv6 address into ASCII representation.\n * returns ptr to static buffer; not reentrant!\n *\n * @param addr ip6 address in network order to convert\n * @return pointer to a global static (!) buffer that holds the ASCII\n *         representation of addr\n */\nchar *\nip6addr_ntoa(const ip6_addr_t *addr)\n{\n  static char str[40];\n  return ip6addr_ntoa_r(addr, str, 40);\n}\n\n/**\n * Same as ipaddr_ntoa, but reentrant since a user-supplied buffer is used.\n *\n * @param addr ip6 address in network order to convert\n * @param buf target buffer where the string is stored\n * @param buflen length of buf\n * @return either pointer to buf which now holds the ASCII\n *         representation of addr or NULL if buf was too small\n */\nchar *\nip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen)\n{\n  u32_t current_block_index, current_block_value, next_block_value;\n  s32_t i;\n  u8_t zero_flag, empty_block_flag;\n\n  i = 0;\n  empty_block_flag = 0; /* used to indicate a zero chain for \"::' */\n\n  for (current_block_index = 0; current_block_index < 8; current_block_index++) {\n    /* get the current 16-bit block */\n    current_block_value = lwip_htonl(addr->addr[current_block_index >> 1]);\n    if ((current_block_index & 0x1) == 0) {\n      current_block_value = current_block_value >> 16;\n    }\n    current_block_value &= 0xffff;\n\n    /* Check for empty block. */\n    if (current_block_value == 0) {\n      if (current_block_index == 7 && empty_block_flag == 1) {\n        /* special case, we must render a ':' for the last block. */\n        buf[i++] = ':';\n        if (i >= buflen) {\n          return NULL;\n        }\n        break;\n      }\n      if (empty_block_flag == 0) {\n        /* generate empty block \"::\", but only if more than one contiguous zero block,\n         * according to current formatting suggestions RFC 5952. */\n        next_block_value = lwip_htonl(addr->addr[(current_block_index + 1) >> 1]);\n        if ((current_block_index & 0x1) == 0x01) {\n            next_block_value = next_block_value >> 16;\n        }\n        next_block_value &= 0xffff;\n        if (next_block_value == 0) {\n          empty_block_flag = 1;\n          buf[i++] = ':';\n          if (i >= buflen) {\n            return NULL;\n          }\n          continue; /* move on to next block. */\n        }\n      } else if (empty_block_flag == 1) {\n        /* move on to next block. */\n        continue;\n      }\n    } else if (empty_block_flag == 1) {\n      /* Set this flag value so we don't produce multiple empty blocks. */\n      empty_block_flag = 2;\n    }\n\n    if (current_block_index > 0) {\n      buf[i++] = ':';\n      if (i >= buflen) {\n        return NULL;\n      }\n    }\n\n    if ((current_block_value & 0xf000) == 0) {\n      zero_flag = 1;\n    } else {\n      buf[i++] = xchar(((current_block_value & 0xf000) >> 12));\n      zero_flag = 0;\n      if (i >= buflen) {\n        return NULL;\n      }\n    }\n\n    if (((current_block_value & 0xf00) == 0) && (zero_flag)) {\n      /* do nothing */\n    } else {\n      buf[i++] = xchar(((current_block_value & 0xf00) >> 8));\n      zero_flag = 0;\n      if (i >= buflen) {\n        return NULL;\n      }\n    }\n\n    if (((current_block_value & 0xf0) == 0) && (zero_flag)) {\n      /* do nothing */\n    }\n    else {\n      buf[i++] = xchar(((current_block_value & 0xf0) >> 4));\n      zero_flag = 0;\n      if (i >= buflen) {\n        return NULL;\n      }\n    }\n\n    buf[i++] = xchar((current_block_value & 0xf));\n    if (i >= buflen) {\n      return NULL;\n    }\n  }\n\n  buf[i] = 0;\n\n  return buf;\n}\n\n#endif /* LWIP_IPV6 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv6/ip6_frag.c",
    "content": "/**\n * @file\n *\n * IPv6 fragmentation and reassembly.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#include \"lwip/opt.h\"\n#include \"lwip/ip6_frag.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/icmp6.h\"\n#include \"lwip/nd6.h\"\n#include \"lwip/ip.h\"\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/stats.h\"\n\n#include <string.h>\n\n#if LWIP_IPV6 && LWIP_IPV6_REASS  /* don't build if not configured for use in lwipopts.h */\n\n\n/** Setting this to 0, you can turn off checking the fragments for overlapping\n * regions. The code gets a little smaller. Only use this if you know that\n * overlapping won't occur on your network! */\n#ifndef IP_REASS_CHECK_OVERLAP\n#define IP_REASS_CHECK_OVERLAP 1\n#endif /* IP_REASS_CHECK_OVERLAP */\n\n/** Set to 0 to prevent freeing the oldest datagram when the reassembly buffer is\n * full (IP_REASS_MAX_PBUFS pbufs are enqueued). The code gets a little smaller.\n * Datagrams will be freed by timeout only. Especially useful when MEMP_NUM_REASSDATA\n * is set to 1, so one datagram can be reassembled at a time, only. */\n#ifndef IP_REASS_FREE_OLDEST\n#define IP_REASS_FREE_OLDEST 1\n#endif /* IP_REASS_FREE_OLDEST */\n\n#if IPV6_FRAG_COPYHEADER\n#define IPV6_FRAG_REQROOM ((s16_t)(sizeof(struct ip6_reass_helper) - IP6_FRAG_HLEN))\n#endif\n\n#define IP_REASS_FLAG_LASTFRAG 0x01\n\n/** This is a helper struct which holds the starting\n * offset and the ending offset of this fragment to\n * easily chain the fragments.\n * It has the same packing requirements as the IPv6 header, since it replaces\n * the Fragment Header in memory in incoming fragments to keep\n * track of the various fragments.\n */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct ip6_reass_helper {\n  PACK_STRUCT_FIELD(struct pbuf *next_pbuf);\n  PACK_STRUCT_FIELD(u16_t start);\n  PACK_STRUCT_FIELD(u16_t end);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/* static variables */\nstatic struct ip6_reassdata *reassdatagrams;\nstatic u16_t ip6_reass_pbufcount;\n\n/* Forward declarations. */\nstatic void ip6_reass_free_complete_datagram(struct ip6_reassdata *ipr);\n#if IP_REASS_FREE_OLDEST\nstatic void ip6_reass_remove_oldest_datagram(struct ip6_reassdata *ipr, int pbufs_needed);\n#endif /* IP_REASS_FREE_OLDEST */\n\nvoid\nip6_reass_tmr(void)\n{\n  struct ip6_reassdata *r, *tmp;\n\n#if !IPV6_FRAG_COPYHEADER\n  LWIP_ASSERT(\"sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN, set IPV6_FRAG_COPYHEADER to 1\",\n    sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN);\n#endif /* !IPV6_FRAG_COPYHEADER */\n\n  r = reassdatagrams;\n  while (r != NULL) {\n    /* Decrement the timer. Once it reaches 0,\n     * clean up the incomplete fragment assembly */\n    if (r->timer > 0) {\n      r->timer--;\n      r = r->next;\n    } else {\n      /* reassembly timed out */\n      tmp = r;\n      /* get the next pointer before freeing */\n      r = r->next;\n      /* free the helper struct and all enqueued pbufs */\n      ip6_reass_free_complete_datagram(tmp);\n     }\n   }\n}\n\n/**\n * Free a datagram (struct ip6_reassdata) and all its pbufs.\n * Updates the total count of enqueued pbufs (ip6_reass_pbufcount),\n * sends an ICMP time exceeded packet.\n *\n * @param ipr datagram to free\n */\nstatic void\nip6_reass_free_complete_datagram(struct ip6_reassdata *ipr)\n{\n  struct ip6_reassdata *prev;\n  u16_t pbufs_freed = 0;\n  u16_t clen;\n  struct pbuf *p;\n  struct ip6_reass_helper *iprh;\n\n#if LWIP_ICMP6\n  iprh = (struct ip6_reass_helper *)ipr->p->payload;\n  if (iprh->start == 0) {\n    /* The first fragment was received, send ICMP time exceeded. */\n    /* First, de-queue the first pbuf from r->p. */\n    p = ipr->p;\n    ipr->p = iprh->next_pbuf;\n    /* Then, move back to the original ipv6 header (we are now pointing to Fragment header).\n       This cannot fail since we already checked when receiving this fragment. */\n    if (pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (u8_t*)IPV6_FRAG_HDRREF(ipr->iphdr)))) {\n      LWIP_ASSERT(\"ip6_reass_free: moving p->payload to ip6 header failed\\n\", 0);\n    }\n    else {\n      icmp6_time_exceeded(p, ICMP6_TE_FRAG);\n    }\n    clen = pbuf_clen(p);\n    LWIP_ASSERT(\"pbufs_freed + clen <= 0xffff\", pbufs_freed + clen <= 0xffff);\n    pbufs_freed += clen;\n    pbuf_free(p);\n  }\n#endif /* LWIP_ICMP6 */\n\n  /* First, free all received pbufs.  The individual pbufs need to be released\n     separately as they have not yet been chained */\n  p = ipr->p;\n  while (p != NULL) {\n    struct pbuf *pcur;\n    iprh = (struct ip6_reass_helper *)p->payload;\n    pcur = p;\n    /* get the next pointer before freeing */\n    p = iprh->next_pbuf;\n    clen = pbuf_clen(pcur);\n    LWIP_ASSERT(\"pbufs_freed + clen <= 0xffff\", pbufs_freed + clen <= 0xffff);\n    pbufs_freed += clen;\n    pbuf_free(pcur);\n  }\n\n  /* Then, unchain the struct ip6_reassdata from the list and free it. */\n  if (ipr == reassdatagrams) {\n    reassdatagrams = ipr->next;\n  } else {\n    prev = reassdatagrams;\n    while (prev != NULL) {\n      if (prev->next == ipr) {\n        break;\n      }\n      prev = prev->next;\n    }\n    if (prev != NULL) {\n      prev->next = ipr->next;\n    }\n  }\n  memp_free(MEMP_IP6_REASSDATA, ipr);\n\n  /* Finally, update number of pbufs in reassembly queue */\n  LWIP_ASSERT(\"ip_reass_pbufcount >= clen\", ip6_reass_pbufcount >= pbufs_freed);\n  ip6_reass_pbufcount -= pbufs_freed;\n}\n\n#if IP_REASS_FREE_OLDEST\n/**\n * Free the oldest datagram to make room for enqueueing new fragments.\n * The datagram ipr is not freed!\n *\n * @param ipr ip6_reassdata for the current fragment\n * @param pbufs_needed number of pbufs needed to enqueue\n *        (used for freeing other datagrams if not enough space)\n */\nstatic void\nip6_reass_remove_oldest_datagram(struct ip6_reassdata *ipr, int pbufs_needed)\n{\n  struct ip6_reassdata *r, *oldest;\n\n  /* Free datagrams until being allowed to enqueue 'pbufs_needed' pbufs,\n   * but don't free the current datagram! */\n  do {\n    r = oldest = reassdatagrams;\n    while (r != NULL) {\n      if (r != ipr) {\n        if (r->timer <= oldest->timer) {\n          /* older than the previous oldest */\n          oldest = r;\n        }\n      }\n      r = r->next;\n    }\n    if (oldest == ipr) {\n      /* nothing to free, ipr is the only element on the list */\n      return;\n    }\n    if (oldest != NULL) {\n      ip6_reass_free_complete_datagram(oldest);\n    }\n  } while (((ip6_reass_pbufcount + pbufs_needed) > IP_REASS_MAX_PBUFS) && (reassdatagrams != NULL));\n}\n#endif /* IP_REASS_FREE_OLDEST */\n\n/**\n * Reassembles incoming IPv6 fragments into an IPv6 datagram.\n *\n * @param p points to the IPv6 Fragment Header\n * @return NULL if reassembly is incomplete, pbuf pointing to\n *         IPv6 Header if reassembly is complete\n */\nstruct pbuf *\nip6_reass(struct pbuf *p)\n{\n  struct ip6_reassdata *ipr, *ipr_prev;\n  struct ip6_reass_helper *iprh, *iprh_tmp, *iprh_prev=NULL;\n  struct ip6_frag_hdr *frag_hdr;\n  u16_t offset, len;\n  u16_t clen;\n  u8_t valid = 1;\n  struct pbuf *q;\n\n  IP6_FRAG_STATS_INC(ip6_frag.recv);\n\n  if ((const void*)ip6_current_header() != ((u8_t*)p->payload) - IP6_HLEN) {\n    /* ip6_frag_hdr must be in the first pbuf, not chained */\n    IP6_FRAG_STATS_INC(ip6_frag.proterr);\n    IP6_FRAG_STATS_INC(ip6_frag.drop);\n    goto nullreturn;\n  }\n\n  frag_hdr = (struct ip6_frag_hdr *) p->payload;\n\n  clen = pbuf_clen(p);\n\n  offset = lwip_ntohs(frag_hdr->_fragment_offset);\n\n  /* Calculate fragment length from IPv6 payload length.\n   * Adjust for headers before Fragment Header.\n   * And finally adjust by Fragment Header length. */\n  len = lwip_ntohs(ip6_current_header()->_plen);\n  len -= (u16_t)(((u8_t*)p->payload - (const u8_t*)ip6_current_header()) - IP6_HLEN);\n  len -= IP6_FRAG_HLEN;\n\n  /* Look for the datagram the fragment belongs to in the current datagram queue,\n   * remembering the previous in the queue for later dequeueing. */\n  for (ipr = reassdatagrams, ipr_prev = NULL; ipr != NULL; ipr = ipr->next) {\n    /* Check if the incoming fragment matches the one currently present\n       in the reassembly buffer. If so, we proceed with copying the\n       fragment into the buffer. */\n    if ((frag_hdr->_identification == ipr->identification) &&\n        ip6_addr_cmp(ip6_current_src_addr(), &(IPV6_FRAG_HDRREF(ipr->iphdr)->src)) &&\n        ip6_addr_cmp(ip6_current_dest_addr(), &(IPV6_FRAG_HDRREF(ipr->iphdr)->dest))) {\n      IP6_FRAG_STATS_INC(ip6_frag.cachehit);\n      break;\n    }\n    ipr_prev = ipr;\n  }\n\n  if (ipr == NULL) {\n  /* Enqueue a new datagram into the datagram queue */\n    ipr = (struct ip6_reassdata *)memp_malloc(MEMP_IP6_REASSDATA);\n    if (ipr == NULL) {\n#if IP_REASS_FREE_OLDEST\n      /* Make room and try again. */\n      ip6_reass_remove_oldest_datagram(ipr, clen);\n      ipr = (struct ip6_reassdata *)memp_malloc(MEMP_IP6_REASSDATA);\n      if (ipr != NULL) {\n        /* re-search ipr_prev since it might have been removed */\n        for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) {\n          if (ipr_prev->next == ipr) {\n            break;\n          }\n        }\n      } else\n#endif /* IP_REASS_FREE_OLDEST */\n      {\n        IP6_FRAG_STATS_INC(ip6_frag.memerr);\n        IP6_FRAG_STATS_INC(ip6_frag.drop);\n        goto nullreturn;\n      }\n    }\n\n    memset(ipr, 0, sizeof(struct ip6_reassdata));\n    ipr->timer = IP_REASS_MAXAGE;\n\n    /* enqueue the new structure to the front of the list */\n    ipr->next = reassdatagrams;\n    reassdatagrams = ipr;\n\n    /* Use the current IPv6 header for src/dest address reference.\n     * Eventually, we will replace it when we get the first fragment\n     * (it might be this one, in any case, it is done later). */\n#if IPV6_FRAG_COPYHEADER\n    MEMCPY(&ipr->iphdr, ip6_current_header(), IP6_HLEN);\n#else /* IPV6_FRAG_COPYHEADER */\n    /* need to use the none-const pointer here: */\n    ipr->iphdr = ip_data.current_ip6_header;\n#endif /* IPV6_FRAG_COPYHEADER */\n\n    /* copy the fragmented packet id. */\n    ipr->identification = frag_hdr->_identification;\n\n    /* copy the nexth field */\n    ipr->nexth = frag_hdr->_nexth;\n  }\n\n  /* Check if we are allowed to enqueue more datagrams. */\n  if ((ip6_reass_pbufcount + clen) > IP_REASS_MAX_PBUFS) {\n#if IP_REASS_FREE_OLDEST\n    ip6_reass_remove_oldest_datagram(ipr, clen);\n    if ((ip6_reass_pbufcount + clen) <= IP_REASS_MAX_PBUFS) {\n      /* re-search ipr_prev since it might have been removed */\n      for (ipr_prev = reassdatagrams; ipr_prev != NULL; ipr_prev = ipr_prev->next) {\n        if (ipr_prev->next == ipr) {\n          break;\n        }\n      }\n    } else\n#endif /* IP_REASS_FREE_OLDEST */\n    {\n      /* @todo: send ICMPv6 time exceeded here? */\n      /* drop this pbuf */\n      IP6_FRAG_STATS_INC(ip6_frag.memerr);\n      IP6_FRAG_STATS_INC(ip6_frag.drop);\n      goto nullreturn;\n    }\n  }\n\n  /* Overwrite Fragment Header with our own helper struct. */\n#if IPV6_FRAG_COPYHEADER\n  if (IPV6_FRAG_REQROOM > 0) {\n    /* Make room for struct ip6_reass_helper (only required if sizeof(void*) > 4).\n       This cannot fail since we already checked when receiving this fragment. */\n    u8_t hdrerr = pbuf_header_force(p, IPV6_FRAG_REQROOM);\n    LWIP_UNUSED_ARG(hdrerr); /* in case of LWIP_NOASSERT */\n    LWIP_ASSERT(\"no room for struct ip6_reass_helper\", hdrerr == 0);\n  }\n#else /* IPV6_FRAG_COPYHEADER */\n  LWIP_ASSERT(\"sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN, set IPV6_FRAG_COPYHEADER to 1\",\n    sizeof(struct ip6_reass_helper) <= IP6_FRAG_HLEN);\n#endif /* IPV6_FRAG_COPYHEADER */\n  iprh = (struct ip6_reass_helper *)p->payload;\n  iprh->next_pbuf = NULL;\n  iprh->start = (offset & IP6_FRAG_OFFSET_MASK);\n  iprh->end = (offset & IP6_FRAG_OFFSET_MASK) + len;\n\n  /* find the right place to insert this pbuf */\n  /* Iterate through until we either get to the end of the list (append),\n   * or we find on with a larger offset (insert). */\n  for (q = ipr->p; q != NULL;) {\n    iprh_tmp = (struct ip6_reass_helper*)q->payload;\n    if (iprh->start < iprh_tmp->start) {\n#if IP_REASS_CHECK_OVERLAP\n      if (iprh->end > iprh_tmp->start) {\n        /* fragment overlaps with following, throw away */\n        IP6_FRAG_STATS_INC(ip6_frag.proterr);\n        IP6_FRAG_STATS_INC(ip6_frag.drop);\n        goto nullreturn;\n      }\n      if (iprh_prev != NULL) {\n        if (iprh->start < iprh_prev->end) {\n          /* fragment overlaps with previous, throw away */\n          IP6_FRAG_STATS_INC(ip6_frag.proterr);\n          IP6_FRAG_STATS_INC(ip6_frag.drop);\n          goto nullreturn;\n        }\n      }\n#endif /* IP_REASS_CHECK_OVERLAP */\n      /* the new pbuf should be inserted before this */\n      iprh->next_pbuf = q;\n      if (iprh_prev != NULL) {\n        /* not the fragment with the lowest offset */\n        iprh_prev->next_pbuf = p;\n      } else {\n        /* fragment with the lowest offset */\n        ipr->p = p;\n      }\n      break;\n    } else if (iprh->start == iprh_tmp->start) {\n      /* received the same datagram twice: no need to keep the datagram */\n      IP6_FRAG_STATS_INC(ip6_frag.drop);\n      goto nullreturn;\n#if IP_REASS_CHECK_OVERLAP\n    } else if (iprh->start < iprh_tmp->end) {\n      /* overlap: no need to keep the new datagram */\n      IP6_FRAG_STATS_INC(ip6_frag.proterr);\n      IP6_FRAG_STATS_INC(ip6_frag.drop);\n      goto nullreturn;\n#endif /* IP_REASS_CHECK_OVERLAP */\n    } else {\n      /* Check if the fragments received so far have no gaps. */\n      if (iprh_prev != NULL) {\n        if (iprh_prev->end != iprh_tmp->start) {\n          /* There is a fragment missing between the current\n           * and the previous fragment */\n          valid = 0;\n        }\n      }\n    }\n    q = iprh_tmp->next_pbuf;\n    iprh_prev = iprh_tmp;\n  }\n\n  /* If q is NULL, then we made it to the end of the list. Determine what to do now */\n  if (q == NULL) {\n    if (iprh_prev != NULL) {\n      /* this is (for now), the fragment with the highest offset:\n       * chain it to the last fragment */\n#if IP_REASS_CHECK_OVERLAP\n      LWIP_ASSERT(\"check fragments don't overlap\", iprh_prev->end <= iprh->start);\n#endif /* IP_REASS_CHECK_OVERLAP */\n      iprh_prev->next_pbuf = p;\n      if (iprh_prev->end != iprh->start) {\n        valid = 0;\n      }\n    } else {\n#if IP_REASS_CHECK_OVERLAP\n      LWIP_ASSERT(\"no previous fragment, this must be the first fragment!\",\n        ipr->p == NULL);\n#endif /* IP_REASS_CHECK_OVERLAP */\n      /* this is the first fragment we ever received for this ip datagram */\n      ipr->p = p;\n    }\n  }\n\n  /* Track the current number of pbufs current 'in-flight', in order to limit\n  the number of fragments that may be enqueued at any one time */\n  ip6_reass_pbufcount += clen;\n\n  /* Remember IPv6 header if this is the first fragment. */\n  if (iprh->start == 0) {\n#if IPV6_FRAG_COPYHEADER\n    if (iprh->next_pbuf != NULL) {\n      MEMCPY(&ipr->iphdr, ip6_current_header(), IP6_HLEN);\n    }\n#else /* IPV6_FRAG_COPYHEADER */\n    /* need to use the none-const pointer here: */\n    ipr->iphdr = ip_data.current_ip6_header;\n#endif /* IPV6_FRAG_COPYHEADER */\n  }\n\n  /* If this is the last fragment, calculate total packet length. */\n  if ((offset & IP6_FRAG_MORE_FLAG) == 0) {\n    ipr->datagram_len = iprh->end;\n  }\n\n  /* Additional validity tests: we have received first and last fragment. */\n  iprh_tmp = (struct ip6_reass_helper*)ipr->p->payload;\n  if (iprh_tmp->start != 0) {\n    valid = 0;\n  }\n  if (ipr->datagram_len == 0) {\n    valid = 0;\n  }\n\n  /* Final validity test: no gaps between current and last fragment. */\n  iprh_prev = iprh;\n  q = iprh->next_pbuf;\n  while ((q != NULL) && valid) {\n    iprh = (struct ip6_reass_helper*)q->payload;\n    if (iprh_prev->end != iprh->start) {\n      valid = 0;\n      break;\n    }\n    iprh_prev = iprh;\n    q = iprh->next_pbuf;\n  }\n\n  if (valid) {\n    /* All fragments have been received */\n    struct ip6_hdr* iphdr_ptr;\n\n    /* chain together the pbufs contained within the ip6_reassdata list. */\n    iprh = (struct ip6_reass_helper*) ipr->p->payload;\n    while (iprh != NULL) {\n      struct pbuf* next_pbuf = iprh->next_pbuf;\n      if (next_pbuf != NULL) {\n        /* Save next helper struct (will be hidden in next step). */\n        iprh_tmp = (struct ip6_reass_helper*)next_pbuf->payload;\n\n        /* hide the fragment header for every succeeding fragment */\n        pbuf_header(next_pbuf, -IP6_FRAG_HLEN);\n#if IPV6_FRAG_COPYHEADER\n        if (IPV6_FRAG_REQROOM > 0) {\n          /* hide the extra bytes borrowed from ip6_hdr for struct ip6_reass_helper */\n          u8_t hdrerr = pbuf_header(next_pbuf, -(s16_t)(IPV6_FRAG_REQROOM));\n          LWIP_UNUSED_ARG(hdrerr); /* in case of LWIP_NOASSERT */\n          LWIP_ASSERT(\"no room for struct ip6_reass_helper\", hdrerr == 0);\n        }\n#endif\n        pbuf_cat(ipr->p, next_pbuf);\n      }\n      else {\n        iprh_tmp = NULL;\n      }\n\n      iprh = iprh_tmp;\n    }\n\n#if IPV6_FRAG_COPYHEADER\n    if (IPV6_FRAG_REQROOM > 0) {\n      /* get back room for struct ip6_reass_helper (only required if sizeof(void*) > 4) */\n      u8_t hdrerr = pbuf_header(ipr->p, -(s16_t)(IPV6_FRAG_REQROOM));\n      LWIP_UNUSED_ARG(hdrerr); /* in case of LWIP_NOASSERT */\n      LWIP_ASSERT(\"no room for struct ip6_reass_helper\", hdrerr == 0);\n    }\n    iphdr_ptr = (struct ip6_hdr*)((u8_t*)ipr->p->payload - IP6_HLEN);\n    MEMCPY(iphdr_ptr, &ipr->iphdr, IP6_HLEN);\n#else\n    iphdr_ptr = ipr->iphdr;\n#endif\n\n    /* Adjust datagram length by adding header lengths. */\n    ipr->datagram_len += (u16_t)(((u8_t*)ipr->p->payload - (u8_t*)iphdr_ptr)\n                         + IP6_FRAG_HLEN\n                         - IP6_HLEN);\n\n    /* Set payload length in ip header. */\n    iphdr_ptr->_plen = lwip_htons(ipr->datagram_len);\n\n    /* Get the first pbuf. */\n    p = ipr->p;\n\n    /* Restore Fragment Header in first pbuf. Mark as \"single fragment\"\n     * packet. Restore nexth. */\n    frag_hdr = (struct ip6_frag_hdr *) p->payload;\n    frag_hdr->_nexth = ipr->nexth;\n    frag_hdr->reserved = 0;\n    frag_hdr->_fragment_offset = 0;\n    frag_hdr->_identification = 0;\n\n    /* release the sources allocate for the fragment queue entry */\n    if (reassdatagrams == ipr) {\n      /* it was the first in the list */\n      reassdatagrams = ipr->next;\n    } else {\n      /* it wasn't the first, so it must have a valid 'prev' */\n      LWIP_ASSERT(\"sanity check linked list\", ipr_prev != NULL);\n      ipr_prev->next = ipr->next;\n    }\n    memp_free(MEMP_IP6_REASSDATA, ipr);\n\n    /* adjust the number of pbufs currently queued for reassembly. */\n    ip6_reass_pbufcount -= pbuf_clen(p);\n\n    /* Move pbuf back to IPv6 header.\n       This cannot fail since we already checked when receiving this fragment. */\n    if (pbuf_header_force(p, (s16_t)((u8_t*)p->payload - (u8_t*)iphdr_ptr))) {\n      LWIP_ASSERT(\"ip6_reass: moving p->payload to ip6 header failed\\n\", 0);\n      pbuf_free(p);\n      return NULL;\n    }\n\n    /* Return the pbuf chain */\n    return p;\n  }\n  /* the datagram is not (yet?) reassembled completely */\n  return NULL;\n\nnullreturn:\n  pbuf_free(p);\n  return NULL;\n}\n\n#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */\n\n#if LWIP_IPV6 && LWIP_IPV6_FRAG\n\n#if !LWIP_NETIF_TX_SINGLE_PBUF\n/** Allocate a new struct pbuf_custom_ref */\nstatic struct pbuf_custom_ref*\nip6_frag_alloc_pbuf_custom_ref(void)\n{\n  return (struct pbuf_custom_ref*)memp_malloc(MEMP_FRAG_PBUF);\n}\n\n/** Free a struct pbuf_custom_ref */\nstatic void\nip6_frag_free_pbuf_custom_ref(struct pbuf_custom_ref* p)\n{\n  LWIP_ASSERT(\"p != NULL\", p != NULL);\n  memp_free(MEMP_FRAG_PBUF, p);\n}\n\n/** Free-callback function to free a 'struct pbuf_custom_ref', called by\n * pbuf_free. */\nstatic void\nip6_frag_free_pbuf_custom(struct pbuf *p)\n{\n  struct pbuf_custom_ref *pcr = (struct pbuf_custom_ref*)p;\n  LWIP_ASSERT(\"pcr != NULL\", pcr != NULL);\n  LWIP_ASSERT(\"pcr == p\", (void*)pcr == (void*)p);\n  if (pcr->original != NULL) {\n    pbuf_free(pcr->original);\n  }\n  ip6_frag_free_pbuf_custom_ref(pcr);\n}\n#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */\n\n/**\n * Fragment an IPv6 datagram if too large for the netif or path MTU.\n *\n * Chop the datagram in MTU sized chunks and send them in order\n * by pointing PBUF_REFs into p\n *\n * @param p ipv6 packet to send\n * @param netif the netif on which to send\n * @param dest destination ipv6 address to which to send\n *\n * @return ERR_OK if sent successfully, err_t otherwise\n */\nerr_t\nip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest)\n{\n  struct ip6_hdr *original_ip6hdr;\n  struct ip6_hdr *ip6hdr;\n  struct ip6_frag_hdr *frag_hdr;\n  struct pbuf *rambuf;\n#if !LWIP_NETIF_TX_SINGLE_PBUF\n  struct pbuf *newpbuf;\n  u16_t newpbuflen = 0;\n  u16_t left_to_copy;\n#endif\n  static u32_t identification;\n  u16_t nfb;\n  u16_t left, cop;\n  u16_t mtu;\n  u16_t fragment_offset = 0;\n  u16_t last;\n  u16_t poff = IP6_HLEN;\n\n  identification++;\n\n  original_ip6hdr = (struct ip6_hdr *)p->payload;\n\n  mtu = nd6_get_destination_mtu(dest, netif);\n\n  /* @todo we assume there are no options in the unfragmentable part (IPv6 header). */\n  left = p->tot_len - IP6_HLEN;\n\n  nfb = (mtu - (IP6_HLEN + IP6_FRAG_HLEN)) & IP6_FRAG_OFFSET_MASK;\n\n  while (left) {\n    last = (left <= nfb);\n\n    /* Fill this fragment */\n    cop = last ? left : nfb;\n\n#if LWIP_NETIF_TX_SINGLE_PBUF\n    rambuf = pbuf_alloc(PBUF_IP, cop + IP6_FRAG_HLEN, PBUF_RAM);\n    if (rambuf == NULL) {\n      IP6_FRAG_STATS_INC(ip6_frag.memerr);\n      return ERR_MEM;\n    }\n    LWIP_ASSERT(\"this needs a pbuf in one piece!\",\n      (rambuf->len == rambuf->tot_len) && (rambuf->next == NULL));\n    poff += pbuf_copy_partial(p, (u8_t*)rambuf->payload + IP6_FRAG_HLEN, cop, poff);\n    /* make room for the IP header */\n    if (pbuf_header(rambuf, IP6_HLEN)) {\n      pbuf_free(rambuf);\n      IP6_FRAG_STATS_INC(ip6_frag.memerr);\n      return ERR_MEM;\n    }\n    /* fill in the IP header */\n    SMEMCPY(rambuf->payload, original_ip6hdr, IP6_HLEN);\n    ip6hdr = (struct ip6_hdr *)rambuf->payload;\n    frag_hdr = (struct ip6_frag_hdr *)((u8_t*)rambuf->payload + IP6_HLEN);\n#else\n    /* When not using a static buffer, create a chain of pbufs.\n     * The first will be a PBUF_RAM holding the link, IPv6, and Fragment header.\n     * The rest will be PBUF_REFs mirroring the pbuf chain to be fragged,\n     * but limited to the size of an mtu.\n     */\n    rambuf = pbuf_alloc(PBUF_LINK, IP6_HLEN + IP6_FRAG_HLEN, PBUF_RAM);\n    if (rambuf == NULL) {\n      IP6_FRAG_STATS_INC(ip6_frag.memerr);\n      return ERR_MEM;\n    }\n    LWIP_ASSERT(\"this needs a pbuf in one piece!\",\n                (p->len >= (IP6_HLEN)));\n    SMEMCPY(rambuf->payload, original_ip6hdr, IP6_HLEN);\n    ip6hdr = (struct ip6_hdr *)rambuf->payload;\n    frag_hdr = (struct ip6_frag_hdr *)((u8_t*)rambuf->payload + IP6_HLEN);\n\n    /* Can just adjust p directly for needed offset. */\n    p->payload = (u8_t *)p->payload + poff;\n    p->len -= poff;\n    p->tot_len -= poff;\n\n    left_to_copy = cop;\n    while (left_to_copy) {\n      struct pbuf_custom_ref *pcr;\n      newpbuflen = (left_to_copy < p->len) ? left_to_copy : p->len;\n      /* Is this pbuf already empty? */\n      if (!newpbuflen) {\n        p = p->next;\n        continue;\n      }\n      pcr = ip6_frag_alloc_pbuf_custom_ref();\n      if (pcr == NULL) {\n        pbuf_free(rambuf);\n        IP6_FRAG_STATS_INC(ip6_frag.memerr);\n        return ERR_MEM;\n      }\n      /* Mirror this pbuf, although we might not need all of it. */\n      newpbuf = pbuf_alloced_custom(PBUF_RAW, newpbuflen, PBUF_REF, &pcr->pc, p->payload, newpbuflen);\n      if (newpbuf == NULL) {\n        ip6_frag_free_pbuf_custom_ref(pcr);\n        pbuf_free(rambuf);\n        IP6_FRAG_STATS_INC(ip6_frag.memerr);\n        return ERR_MEM;\n      }\n      pbuf_ref(p);\n      pcr->original = p;\n      pcr->pc.custom_free_function = ip6_frag_free_pbuf_custom;\n\n      /* Add it to end of rambuf's chain, but using pbuf_cat, not pbuf_chain\n       * so that it is removed when pbuf_dechain is later called on rambuf.\n       */\n      pbuf_cat(rambuf, newpbuf);\n      left_to_copy -= newpbuflen;\n      if (left_to_copy) {\n        p = p->next;\n      }\n    }\n    poff = newpbuflen;\n#endif /* LWIP_NETIF_TX_SINGLE_PBUF */\n\n    /* Set headers */\n    frag_hdr->_nexth = original_ip6hdr->_nexth;\n    frag_hdr->reserved = 0;\n    frag_hdr->_fragment_offset = lwip_htons((fragment_offset & IP6_FRAG_OFFSET_MASK) | (last ? 0 : IP6_FRAG_MORE_FLAG));\n    frag_hdr->_identification = lwip_htonl(identification);\n\n    IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_FRAGMENT);\n    IP6H_PLEN_SET(ip6hdr, cop + IP6_FRAG_HLEN);\n\n    /* No need for separate header pbuf - we allowed room for it in rambuf\n     * when allocated.\n     */\n    IP6_FRAG_STATS_INC(ip6_frag.xmit);\n    netif->output_ip6(netif, rambuf, dest);\n\n    /* Unfortunately we can't reuse rambuf - the hardware may still be\n     * using the buffer. Instead we free it (and the ensuing chain) and\n     * recreate it next time round the loop. If we're lucky the hardware\n     * will have already sent the packet, the free will really free, and\n     * there will be zero memory penalty.\n     */\n\n    pbuf_free(rambuf);\n    left -= cop;\n    fragment_offset += cop;\n  }\n  return ERR_OK;\n}\n\n#endif /* LWIP_IPV6 && LWIP_IPV6_FRAG */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv6/mld6.c",
    "content": "/**\n * @file\n * Multicast listener discovery\n *\n * @defgroup mld6 MLD6\n * @ingroup ip6\n * Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710.\n * No support for MLDv2.\\n\n * To be called from TCPIP thread\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n/* Based on igmp.c implementation of igmp v2 protocol */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6 && LWIP_IPV6_MLD  /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/mld6.h\"\n#include \"lwip/prot/mld6.h\"\n#include \"lwip/icmp6.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/stats.h\"\n\n#include <string.h>\n\n\n/*\n * MLD constants\n */\n#define MLD6_HL                           1\n#define MLD6_JOIN_DELAYING_MEMBER_TMR_MS  (500)\n\n#define MLD6_GROUP_NON_MEMBER             0\n#define MLD6_GROUP_DELAYING_MEMBER        1\n#define MLD6_GROUP_IDLE_MEMBER            2\n\n/* Forward declarations. */\nstatic struct mld_group *mld6_new_group(struct netif *ifp, const ip6_addr_t *addr);\nstatic err_t mld6_remove_group(struct netif *netif, struct mld_group *group);\nstatic void mld6_delayed_report(struct mld_group *group, u16_t maxresp);\nstatic void mld6_send(struct netif *netif, struct mld_group *group, u8_t type);\n\n\n/**\n * Stop MLD processing on interface\n *\n * @param netif network interface on which stop MLD processing\n */\nerr_t\nmld6_stop(struct netif *netif)\n{\n  struct mld_group *group = netif_mld6_data(netif);\n\n  netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_MLD6, NULL);\n\n  while (group != NULL) {\n    struct mld_group *next = group->next; /* avoid use-after-free below */\n\n    /* disable the group at the MAC level */\n    if (netif->mld_mac_filter != NULL) {\n      netif->mld_mac_filter(netif, &(group->group_address), NETIF_DEL_MAC_FILTER);\n    }\n\n    /* free group */\n    memp_free(MEMP_MLD6_GROUP, group);\n\n    /* move to \"next\" */\n    group = next;\n  }\n  return ERR_OK;\n}\n\n/**\n * Report MLD memberships for this interface\n *\n * @param netif network interface on which report MLD memberships\n */\nvoid\nmld6_report_groups(struct netif *netif)\n{\n  struct mld_group *group = netif_mld6_data(netif);\n\n  while (group != NULL) {\n    mld6_delayed_report(group, MLD6_JOIN_DELAYING_MEMBER_TMR_MS);\n    group = group->next;\n  }\n}\n\n/**\n * Search for a group that is joined on a netif\n *\n * @param ifp the network interface for which to look\n * @param addr the group ipv6 address to search for\n * @return a struct mld_group* if the group has been found,\n *         NULL if the group wasn't found.\n */\nstruct mld_group *\nmld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr)\n{\n  struct mld_group *group = netif_mld6_data(ifp);\n\n  while (group != NULL) {\n    if (ip6_addr_cmp(&(group->group_address), addr)) {\n      return group;\n    }\n    group = group->next;\n  }\n\n  return NULL;\n}\n\n\n/**\n * create a new group\n *\n * @param ifp the network interface for which to create\n * @param addr the new group ipv6\n * @return a struct mld_group*,\n *         NULL on memory error.\n */\nstatic struct mld_group *\nmld6_new_group(struct netif *ifp, const ip6_addr_t *addr)\n{\n  struct mld_group *group;\n\n  group = (struct mld_group *)memp_malloc(MEMP_MLD6_GROUP);\n  if (group != NULL) {\n    ip6_addr_set(&(group->group_address), addr);\n    group->timer              = 0; /* Not running */\n    group->group_state        = MLD6_GROUP_IDLE_MEMBER;\n    group->last_reporter_flag = 0;\n    group->use                = 0;\n    group->next               = netif_mld6_data(ifp);\n\n    netif_set_client_data(ifp, LWIP_NETIF_CLIENT_DATA_INDEX_MLD6, group);\n  }\n\n  return group;\n}\n\n/**\n * Remove a group from the mld_group_list, but do not free it yet\n *\n * @param group the group to remove\n * @return ERR_OK if group was removed from the list, an err_t otherwise\n */\nstatic err_t\nmld6_remove_group(struct netif *netif, struct mld_group *group)\n{\n  err_t err = ERR_OK;\n\n  /* Is it the first group? */\n  if (netif_mld6_data(netif) == group) {\n    netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_MLD6, group->next);\n  } else {\n    /* look for group further down the list */\n    struct mld_group *tmpGroup;\n    for (tmpGroup = netif_mld6_data(netif); tmpGroup != NULL; tmpGroup = tmpGroup->next) {\n      if (tmpGroup->next == group) {\n        tmpGroup->next = group->next;\n        break;\n      }\n    }\n    /* Group not find group */\n    if (tmpGroup == NULL) {\n      err = ERR_ARG;\n    }\n  }\n\n  return err;\n}\n\n\n/**\n * Process an input MLD message. Called by icmp6_input.\n *\n * @param p the mld packet, p->payload pointing to the icmpv6 header\n * @param inp the netif on which this packet was received\n */\nvoid\nmld6_input(struct pbuf *p, struct netif *inp)\n{\n  struct mld_header *mld_hdr;\n  struct mld_group *group;\n\n  MLD6_STATS_INC(mld6.recv);\n\n  /* Check that mld header fits in packet. */\n  if (p->len < sizeof(struct mld_header)) {\n    /* @todo debug message */\n    pbuf_free(p);\n    MLD6_STATS_INC(mld6.lenerr);\n    MLD6_STATS_INC(mld6.drop);\n    return;\n  }\n\n  mld_hdr = (struct mld_header *)p->payload;\n\n  switch (mld_hdr->type) {\n  case ICMP6_TYPE_MLQ: /* Multicast listener query. */\n    /* Is it a general query? */\n    if (ip6_addr_isallnodes_linklocal(ip6_current_dest_addr()) &&\n        ip6_addr_isany(&(mld_hdr->multicast_address))) {\n      MLD6_STATS_INC(mld6.rx_general);\n      /* Report all groups, except all nodes group, and if-local groups. */\n      group = netif_mld6_data(inp);\n      while (group != NULL) {\n        if ((!(ip6_addr_ismulticast_iflocal(&(group->group_address)))) &&\n            (!(ip6_addr_isallnodes_linklocal(&(group->group_address))))) {\n          mld6_delayed_report(group, mld_hdr->max_resp_delay);\n        }\n        group = group->next;\n      }\n    } else {\n      /* Have we joined this group?\n       * We use IP6 destination address to have a memory aligned copy.\n       * mld_hdr->multicast_address should be the same. */\n      MLD6_STATS_INC(mld6.rx_group);\n      group = mld6_lookfor_group(inp, ip6_current_dest_addr());\n      if (group != NULL) {\n        /* Schedule a report. */\n        mld6_delayed_report(group, mld_hdr->max_resp_delay);\n      }\n    }\n    break; /* ICMP6_TYPE_MLQ */\n  case ICMP6_TYPE_MLR: /* Multicast listener report. */\n    /* Have we joined this group?\n     * We use IP6 destination address to have a memory aligned copy.\n     * mld_hdr->multicast_address should be the same. */\n    MLD6_STATS_INC(mld6.rx_report);\n    group = mld6_lookfor_group(inp, ip6_current_dest_addr());\n    if (group != NULL) {\n      /* If we are waiting to report, cancel it. */\n      if (group->group_state == MLD6_GROUP_DELAYING_MEMBER) {\n        group->timer = 0; /* stopped */\n        group->group_state = MLD6_GROUP_IDLE_MEMBER;\n        group->last_reporter_flag = 0;\n      }\n    }\n    break; /* ICMP6_TYPE_MLR */\n  case ICMP6_TYPE_MLD: /* Multicast listener done. */\n    /* Do nothing, router will query us. */\n    break; /* ICMP6_TYPE_MLD */\n  default:\n    MLD6_STATS_INC(mld6.proterr);\n    MLD6_STATS_INC(mld6.drop);\n    break;\n  }\n\n  pbuf_free(p);\n}\n\n/**\n * @ingroup mld6\n * Join a group on a network interface.\n *\n * @param srcaddr ipv6 address of the network interface which should\n *                join a new group. If IP6_ADDR_ANY, join on all netifs\n * @param groupaddr the ipv6 address of the group to join\n * @return ERR_OK if group was joined on the netif(s), an err_t otherwise\n */\nerr_t\nmld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr)\n{\n  err_t         err = ERR_VAL; /* no matching interface */\n  struct netif *netif;\n\n  /* loop through netif's */\n  netif = netif_list;\n  while (netif != NULL) {\n    /* Should we join this interface ? */\n    if (ip6_addr_isany(srcaddr) ||\n        netif_get_ip6_addr_match(netif, srcaddr) >= 0) {\n      err = mld6_joingroup_netif(netif, groupaddr);\n      if (err != ERR_OK) {\n        return err;\n      }\n    }\n\n    /* proceed to next network interface */\n    netif = netif->next;\n  }\n\n  return err;\n}\n\n/**\n * @ingroup mld6\n * Join a group on a network interface.\n *\n * @param netif the network interface which should join a new group.\n * @param groupaddr the ipv6 address of the group to join\n * @return ERR_OK if group was joined on the netif, an err_t otherwise\n */\nerr_t\nmld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr)\n{\n  struct mld_group *group;\n\n  /* find group or create a new one if not found */\n  group = mld6_lookfor_group(netif, groupaddr);\n\n  if (group == NULL) {\n    /* Joining a new group. Create a new group entry. */\n    group = mld6_new_group(netif, groupaddr);\n    if (group == NULL) {\n      return ERR_MEM;\n    }\n\n    /* Activate this address on the MAC layer. */\n    if (netif->mld_mac_filter != NULL) {\n      netif->mld_mac_filter(netif, groupaddr, NETIF_ADD_MAC_FILTER);\n    }\n\n    /* Report our membership. */\n    MLD6_STATS_INC(mld6.tx_report);\n    mld6_send(netif, group, ICMP6_TYPE_MLR);\n    mld6_delayed_report(group, MLD6_JOIN_DELAYING_MEMBER_TMR_MS);\n  }\n\n  /* Increment group use */\n  group->use++;\n  return ERR_OK;\n}\n\n/**\n * @ingroup mld6\n * Leave a group on a network interface.\n *\n * @param srcaddr ipv6 address of the network interface which should\n *                leave the group. If IP6_ISANY, leave on all netifs\n * @param groupaddr the ipv6 address of the group to leave\n * @return ERR_OK if group was left on the netif(s), an err_t otherwise\n */\nerr_t\nmld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr)\n{\n  err_t         err = ERR_VAL; /* no matching interface */\n  struct netif *netif;\n\n  /* loop through netif's */\n  netif = netif_list;\n  while (netif != NULL) {\n    /* Should we leave this interface ? */\n    if (ip6_addr_isany(srcaddr) ||\n        netif_get_ip6_addr_match(netif, srcaddr) >= 0) {\n      err_t res = mld6_leavegroup_netif(netif, groupaddr);\n      if (err != ERR_OK) {\n        /* Store this result if we have not yet gotten a success */\n        err = res;\n      }\n    }\n    /* proceed to next network interface */\n    netif = netif->next;\n  }\n\n  return err;\n}\n\n/**\n * @ingroup mld6\n * Leave a group on a network interface.\n *\n * @param netif the network interface which should leave the group.\n * @param groupaddr the ipv6 address of the group to leave\n * @return ERR_OK if group was left on the netif, an err_t otherwise\n */\nerr_t\nmld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr)\n{\n  struct mld_group *group;\n\n  /* find group */\n  group = mld6_lookfor_group(netif, groupaddr);\n\n  if (group != NULL) {\n    /* Leave if there is no other use of the group */\n    if (group->use <= 1) {\n      /* Remove the group from the list */\n      mld6_remove_group(netif, group);\n\n      /* If we are the last reporter for this group */\n      if (group->last_reporter_flag) {\n        MLD6_STATS_INC(mld6.tx_leave);\n        mld6_send(netif, group, ICMP6_TYPE_MLD);\n      }\n\n      /* Disable the group at the MAC level */\n      if (netif->mld_mac_filter != NULL) {\n        netif->mld_mac_filter(netif, groupaddr, NETIF_DEL_MAC_FILTER);\n      }\n\n      /* free group struct */\n      memp_free(MEMP_MLD6_GROUP, group);\n    } else {\n      /* Decrement group use */\n      group->use--;\n    }\n\n    /* Left group */\n    return ERR_OK;\n  }\n\n  /* Group not found */\n  return ERR_VAL;\n}\n\n\n/**\n * Periodic timer for mld processing. Must be called every\n * MLD6_TMR_INTERVAL milliseconds (100).\n *\n * When a delaying member expires, a membership report is sent.\n */\nvoid\nmld6_tmr(void)\n{\n  struct netif *netif = netif_list;\n\n  while (netif != NULL) {\n    struct mld_group *group = netif_mld6_data(netif);\n\n    while (group != NULL) {\n      if (group->timer > 0) {\n        group->timer--;\n        if (group->timer == 0) {\n          /* If the state is MLD6_GROUP_DELAYING_MEMBER then we send a report for this group */\n          if (group->group_state == MLD6_GROUP_DELAYING_MEMBER) {\n            MLD6_STATS_INC(mld6.tx_report);\n            mld6_send(netif, group, ICMP6_TYPE_MLR);\n            group->group_state = MLD6_GROUP_IDLE_MEMBER;\n          }\n        }\n      }\n      group = group->next;\n    }\n    netif = netif->next;\n  }\n}\n\n/**\n * Schedule a delayed membership report for a group\n *\n * @param group the mld_group for which \"delaying\" membership report\n *              should be sent\n * @param maxresp the max resp delay provided in the query\n */\nstatic void\nmld6_delayed_report(struct mld_group *group, u16_t maxresp)\n{\n  /* Convert maxresp from milliseconds to tmr ticks */\n  maxresp = maxresp / MLD6_TMR_INTERVAL;\n  if (maxresp == 0) {\n    maxresp = 1;\n  }\n\n#ifdef LWIP_RAND\n  /* Randomize maxresp. (if LWIP_RAND is supported) */\n  maxresp = LWIP_RAND() % maxresp;\n  if (maxresp == 0) {\n    maxresp = 1;\n  }\n#endif /* LWIP_RAND */\n\n  /* Apply timer value if no report has been scheduled already. */\n  if ((group->group_state == MLD6_GROUP_IDLE_MEMBER) ||\n     ((group->group_state == MLD6_GROUP_DELAYING_MEMBER) &&\n      ((group->timer == 0) || (maxresp < group->timer)))) {\n    group->timer = maxresp;\n    group->group_state = MLD6_GROUP_DELAYING_MEMBER;\n  }\n}\n\n/**\n * Send a MLD message (report or done).\n *\n * An IPv6 hop-by-hop options header with a router alert option\n * is prepended.\n *\n * @param group the group to report or quit\n * @param type ICMP6_TYPE_MLR (report) or ICMP6_TYPE_MLD (done)\n */\nstatic void\nmld6_send(struct netif *netif, struct mld_group *group, u8_t type)\n{\n  struct mld_header *mld_hdr;\n  struct pbuf *p;\n  const ip6_addr_t *src_addr;\n\n  /* Allocate a packet. Size is MLD header + IPv6 Hop-by-hop options header. */\n  p = pbuf_alloc(PBUF_IP, sizeof(struct mld_header) + sizeof(struct ip6_hbh_hdr), PBUF_RAM);\n  if (p == NULL) {\n    MLD6_STATS_INC(mld6.memerr);\n    return;\n  }\n\n  /* Move to make room for Hop-by-hop options header. */\n  if (pbuf_header(p, -IP6_HBH_HLEN)) {\n    pbuf_free(p);\n    MLD6_STATS_INC(mld6.lenerr);\n    return;\n  }\n\n  /* Select our source address. */\n  if (!ip6_addr_isvalid(netif_ip6_addr_state(netif, 0))) {\n    /* This is a special case, when we are performing duplicate address detection.\n     * We must join the multicast group, but we don't have a valid address yet. */\n    src_addr = IP6_ADDR_ANY6;\n  } else {\n    /* Use link-local address as source address. */\n    src_addr = netif_ip6_addr(netif, 0);\n  }\n\n  /* MLD message header pointer. */\n  mld_hdr = (struct mld_header *)p->payload;\n\n  /* Set fields. */\n  mld_hdr->type = type;\n  mld_hdr->code = 0;\n  mld_hdr->chksum = 0;\n  mld_hdr->max_resp_delay = 0;\n  mld_hdr->reserved = 0;\n  ip6_addr_set(&(mld_hdr->multicast_address), &(group->group_address));\n\n#if CHECKSUM_GEN_ICMP6\n  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) {\n    mld_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len,\n      src_addr, &(group->group_address));\n  }\n#endif /* CHECKSUM_GEN_ICMP6 */\n\n  /* Add hop-by-hop headers options: router alert with MLD value. */\n  ip6_options_add_hbh_ra(p, IP6_NEXTH_ICMP6, IP6_ROUTER_ALERT_VALUE_MLD);\n\n  if (type == ICMP6_TYPE_MLR) {\n    /* Remember we were the last to report */\n    group->last_reporter_flag = 1;\n  }\n\n  /* Send the packet out. */\n  MLD6_STATS_INC(mld6.xmit);\n  ip6_output_if(p, (ip6_addr_isany(src_addr)) ? NULL : src_addr, &(group->group_address),\n      MLD6_HL, 0, IP6_NEXTH_HOPBYHOP, netif);\n  pbuf_free(p);\n}\n\n#endif /* LWIP_IPV6 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/ipv6/nd6.c",
    "content": "/**\n * @file\n *\n * Neighbor discovery and stateless address autoconfiguration for IPv6.\n * Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862\n * (Address autoconfiguration).\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/nd6.h\"\n#include \"lwip/priv/nd6_priv.h\"\n#include \"lwip/prot/nd6.h\"\n#include \"lwip/prot/icmp6.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/icmp6.h\"\n#include \"lwip/mld6.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/dns.h\"\n\n#include <string.h>\n\n#ifdef LWIP_HOOK_FILENAME\n#include LWIP_HOOK_FILENAME\n#endif\n\n#if LWIP_IPV6_DUP_DETECT_ATTEMPTS > IP6_ADDR_TENTATIVE_COUNT_MASK\n#error LWIP_IPV6_DUP_DETECT_ATTEMPTS > IP6_ADDR_TENTATIVE_COUNT_MASK\n#endif\n\n/* Router tables. */\nstruct nd6_neighbor_cache_entry neighbor_cache[LWIP_ND6_NUM_NEIGHBORS];\nstruct nd6_destination_cache_entry destination_cache[LWIP_ND6_NUM_DESTINATIONS];\nstruct nd6_prefix_list_entry prefix_list[LWIP_ND6_NUM_PREFIXES];\nstruct nd6_router_list_entry default_router_list[LWIP_ND6_NUM_ROUTERS];\n\n/* Default values, can be updated by a RA message. */\nu32_t reachable_time = LWIP_ND6_REACHABLE_TIME;\nu32_t retrans_timer = LWIP_ND6_RETRANS_TIMER; /* @todo implement this value in timer */\n\n/* Index for cache entries. */\nstatic u8_t nd6_cached_neighbor_index;\nstatic u8_t nd6_cached_destination_index;\n\n/* Multicast address holder. */\nstatic ip6_addr_t multicast_address;\n\n/* Static buffer to parse RA packet options (size of a prefix option, biggest option) */\nstatic u8_t nd6_ra_buffer[sizeof(struct prefix_option)];\n\n/* Forward declarations. */\nstatic s8_t nd6_find_neighbor_cache_entry(const ip6_addr_t *ip6addr);\nstatic s8_t nd6_new_neighbor_cache_entry(void);\nstatic void nd6_free_neighbor_cache_entry(s8_t i);\nstatic s8_t nd6_find_destination_cache_entry(const ip6_addr_t *ip6addr);\nstatic s8_t nd6_new_destination_cache_entry(void);\nstatic s8_t nd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif);\nstatic s8_t nd6_select_router(const ip6_addr_t *ip6addr, struct netif *netif);\nstatic s8_t nd6_get_router(const ip6_addr_t *router_addr, struct netif *netif);\nstatic s8_t nd6_new_router(const ip6_addr_t *router_addr, struct netif *netif);\nstatic s8_t nd6_get_onlink_prefix(ip6_addr_t *prefix, struct netif *netif);\nstatic s8_t nd6_new_onlink_prefix(ip6_addr_t *prefix, struct netif *netif);\nstatic s8_t nd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif);\nstatic err_t nd6_queue_packet(s8_t neighbor_index, struct pbuf *q);\n\n#define ND6_SEND_FLAG_MULTICAST_DEST 0x01\n#define ND6_SEND_FLAG_ALLNODES_DEST 0x02\nstatic void nd6_send_ns(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags);\nstatic void nd6_send_na(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags);\nstatic void nd6_send_neighbor_cache_probe(struct nd6_neighbor_cache_entry *entry, u8_t flags);\n#if LWIP_IPV6_SEND_ROUTER_SOLICIT\nstatic err_t nd6_send_rs(struct netif *netif);\n#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */\n\n#if LWIP_ND6_QUEUEING\nstatic void nd6_free_q(struct nd6_q_entry *q);\n#else /* LWIP_ND6_QUEUEING */\n#define nd6_free_q(q) pbuf_free(q)\n#endif /* LWIP_ND6_QUEUEING */\nstatic void nd6_send_q(s8_t i);\n\n\n/**\n * Process an incoming neighbor discovery message\n *\n * @param p the nd packet, p->payload pointing to the icmpv6 header\n * @param inp the netif on which this packet was received\n */\nvoid\nnd6_input(struct pbuf *p, struct netif *inp)\n{\n  u8_t msg_type;\n  s8_t i;\n\n  ND6_STATS_INC(nd6.recv);\n\n  msg_type = *((u8_t *)p->payload);\n  switch (msg_type) {\n  case ICMP6_TYPE_NA: /* Neighbor Advertisement. */\n  {\n    struct na_header *na_hdr;\n    struct lladdr_option *lladdr_opt;\n\n    /* Check that na header fits in packet. */\n    if (p->len < (sizeof(struct na_header))) {\n      /* @todo debug message */\n      pbuf_free(p);\n      ND6_STATS_INC(nd6.lenerr);\n      ND6_STATS_INC(nd6.drop);\n      return;\n    }\n\n    na_hdr = (struct na_header *)p->payload;\n\n    /* Unsolicited NA?*/\n    if (ip6_addr_ismulticast(ip6_current_dest_addr())) {\n      ip6_addr_t target_address;\n      \n      /* This is an unsolicited NA.\n       * link-layer changed?\n       * part of DAD mechanism? */\n\n      /* Create an aligned copy. */\n      ip6_addr_set(&target_address, &(na_hdr->target_address));\n\n#if LWIP_IPV6_DUP_DETECT_ATTEMPTS\n      /* If the target address matches this netif, it is a DAD response. */\n      for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n        if (!ip6_addr_isinvalid(netif_ip6_addr_state(inp, i)) &&\n            ip6_addr_cmp(&target_address, netif_ip6_addr(inp, i))) {\n          /* We are using a duplicate address. */\n          netif_ip6_addr_set_state(inp, i, IP6_ADDR_INVALID);\n\n#if LWIP_IPV6_AUTOCONFIG\n          /* Check to see if this address was autoconfigured. */\n          if (!ip6_addr_islinklocal(&target_address)) {\n            i = nd6_get_onlink_prefix(&target_address, inp);\n            if (i >= 0) {\n              /* Mark this prefix as duplicate, so that we don't use it\n               * to generate this address again. */\n              prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_ADDRESS_DUPLICATE;\n            }\n          }\n#endif /* LWIP_IPV6_AUTOCONFIG */\n\n          pbuf_free(p);\n          return;\n        }\n      }\n#endif /* LWIP_IPV6_DUP_DETECT_ATTEMPTS */\n\n      /* Check that link-layer address option also fits in packet. */\n      if (p->len < (sizeof(struct na_header) + 2)) {\n        /* @todo debug message */\n        pbuf_free(p);\n        ND6_STATS_INC(nd6.lenerr);\n        ND6_STATS_INC(nd6.drop);\n        return;\n      }\n\n      lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header));\n\n      if (p->len < (sizeof(struct na_header) + (lladdr_opt->length << 3))) {\n        /* @todo debug message */\n        pbuf_free(p);\n        ND6_STATS_INC(nd6.lenerr);\n        ND6_STATS_INC(nd6.drop);\n        return;\n      }\n\n      /* This is an unsolicited NA, most likely there was a LLADDR change. */\n      i = nd6_find_neighbor_cache_entry(&target_address);\n      if (i >= 0) {\n        if (na_hdr->flags & ND6_FLAG_OVERRIDE) {\n          MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);\n        }\n      }\n    } else {\n      ip6_addr_t target_address;\n\n      /* This is a solicited NA.\n       * neighbor address resolution response?\n       * neighbor unreachability detection response? */\n\n      /* Create an aligned copy. */\n      ip6_addr_set(&target_address, &(na_hdr->target_address));\n\n      /* Find the cache entry corresponding to this na. */\n      i = nd6_find_neighbor_cache_entry(&target_address);\n      if (i < 0) {\n        /* We no longer care about this target address. drop it. */\n        pbuf_free(p);\n        return;\n      }\n\n      /* Update cache entry. */\n      if ((na_hdr->flags & ND6_FLAG_OVERRIDE) ||\n          (neighbor_cache[i].state == ND6_INCOMPLETE)) {\n        /* Check that link-layer address option also fits in packet. */\n        if (p->len < (sizeof(struct na_header) + 2)) {\n          /* @todo debug message */\n          pbuf_free(p);\n          ND6_STATS_INC(nd6.lenerr);\n          ND6_STATS_INC(nd6.drop);\n          return;\n        }\n\n        lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header));\n\n        if (p->len < (sizeof(struct na_header) + (lladdr_opt->length << 3))) {\n          /* @todo debug message */\n          pbuf_free(p);\n          ND6_STATS_INC(nd6.lenerr);\n          ND6_STATS_INC(nd6.drop);\n          return;\n        }\n\n        MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);\n      }\n\n      neighbor_cache[i].netif = inp;\n      neighbor_cache[i].state = ND6_REACHABLE;\n      neighbor_cache[i].counter.reachable_time = reachable_time;\n\n      /* Send queued packets, if any. */\n      if (neighbor_cache[i].q != NULL) {\n        nd6_send_q(i);\n      }\n    }\n\n    break; /* ICMP6_TYPE_NA */\n  }\n  case ICMP6_TYPE_NS: /* Neighbor solicitation. */\n  {\n    struct ns_header *ns_hdr;\n    struct lladdr_option *lladdr_opt;\n    u8_t accepted;\n\n    /* Check that ns header fits in packet. */\n    if (p->len < sizeof(struct ns_header)) {\n      /* @todo debug message */\n      pbuf_free(p);\n      ND6_STATS_INC(nd6.lenerr);\n      ND6_STATS_INC(nd6.drop);\n      return;\n    }\n\n    ns_hdr = (struct ns_header *)p->payload;\n\n    /* Check if there is a link-layer address provided. Only point to it if in this buffer. */\n    if (p->len >= (sizeof(struct ns_header) + 2)) {\n      lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct ns_header));\n      if (p->len < (sizeof(struct ns_header) + (lladdr_opt->length << 3))) {\n        lladdr_opt = NULL;\n      }\n    } else {\n      lladdr_opt = NULL;\n    }\n\n    /* Check if the target address is configured on the receiving netif. */\n    accepted = 0;\n    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {\n      if ((ip6_addr_isvalid(netif_ip6_addr_state(inp, i)) ||\n           (ip6_addr_istentative(netif_ip6_addr_state(inp, i)) &&\n            ip6_addr_isany(ip6_current_src_addr()))) &&\n          ip6_addr_cmp(&(ns_hdr->target_address), netif_ip6_addr(inp, i))) {\n        accepted = 1;\n        break;\n      }\n    }\n\n    /* NS not for us? */\n    if (!accepted) {\n      pbuf_free(p);\n      return;\n    }\n\n    /* Check for ANY address in src (DAD algorithm). */\n    if (ip6_addr_isany(ip6_current_src_addr())) {\n      /* Sender is validating this address. */\n      for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {\n        if (!ip6_addr_isinvalid(netif_ip6_addr_state(inp, i)) &&\n            ip6_addr_cmp(&(ns_hdr->target_address), netif_ip6_addr(inp, i))) {\n          /* Send a NA back so that the sender does not use this address. */\n          nd6_send_na(inp, netif_ip6_addr(inp, i), ND6_FLAG_OVERRIDE | ND6_SEND_FLAG_ALLNODES_DEST);\n          if (ip6_addr_istentative(netif_ip6_addr_state(inp, i))) {\n            /* We shouldn't use this address either. */\n            netif_ip6_addr_set_state(inp, i, IP6_ADDR_INVALID);\n          }\n        }\n      }\n    } else {\n      ip6_addr_t target_address;\n      \n      /* Sender is trying to resolve our address. */\n      /* Verify that they included their own link-layer address. */\n      if (lladdr_opt == NULL) {\n        /* Not a valid message. */\n        pbuf_free(p);\n        ND6_STATS_INC(nd6.proterr);\n        ND6_STATS_INC(nd6.drop);\n        return;\n      }\n\n      i = nd6_find_neighbor_cache_entry(ip6_current_src_addr());\n      if (i>= 0) {\n        /* We already have a record for the solicitor. */\n        if (neighbor_cache[i].state == ND6_INCOMPLETE) {\n          neighbor_cache[i].netif = inp;\n          MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);\n\n          /* Delay probe in case we get confirmation of reachability from upper layer (TCP). */\n          neighbor_cache[i].state = ND6_DELAY;\n          neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME / ND6_TMR_INTERVAL;\n        }\n      } else {\n        /* Add their IPv6 address and link-layer address to neighbor cache.\n         * We will need it at least to send a unicast NA message, but most\n         * likely we will also be communicating with this node soon. */\n        i = nd6_new_neighbor_cache_entry();\n        if (i < 0) {\n          /* We couldn't assign a cache entry for this neighbor.\n           * we won't be able to reply. drop it. */\n          pbuf_free(p);\n          ND6_STATS_INC(nd6.memerr);\n          return;\n        }\n        neighbor_cache[i].netif = inp;\n        MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);\n        ip6_addr_set(&(neighbor_cache[i].next_hop_address), ip6_current_src_addr());\n\n        /* Receiving a message does not prove reachability: only in one direction.\n         * Delay probe in case we get confirmation of reachability from upper layer (TCP). */\n        neighbor_cache[i].state = ND6_DELAY;\n        neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME / ND6_TMR_INTERVAL;\n      }\n\n      /* Create an aligned copy. */\n      ip6_addr_set(&target_address, &(ns_hdr->target_address));\n\n      /* Send back a NA for us. Allocate the reply pbuf. */\n      nd6_send_na(inp, &target_address, ND6_FLAG_SOLICITED | ND6_FLAG_OVERRIDE);\n    }\n\n    break; /* ICMP6_TYPE_NS */\n  }\n  case ICMP6_TYPE_RA: /* Router Advertisement. */\n  {\n    struct ra_header *ra_hdr;\n    u8_t *buffer; /* Used to copy options. */\n    u16_t offset;\n#if LWIP_ND6_RDNSS_MAX_DNS_SERVERS\n    /* There can by multiple RDNSS options per RA */\n    u8_t rdnss_server_idx = 0;\n#endif /* LWIP_ND6_RDNSS_MAX_DNS_SERVERS */\n\n    /* Check that RA header fits in packet. */\n    if (p->len < sizeof(struct ra_header)) {\n      /* @todo debug message */\n      pbuf_free(p);\n      ND6_STATS_INC(nd6.lenerr);\n      ND6_STATS_INC(nd6.drop);\n      return;\n    }\n\n    ra_hdr = (struct ra_header *)p->payload;\n\n    /* If we are sending RS messages, stop. */\n#if LWIP_IPV6_SEND_ROUTER_SOLICIT\n    /* ensure at least one solicitation is sent */\n    if ((inp->rs_count < LWIP_ND6_MAX_MULTICAST_SOLICIT) ||\n        (nd6_send_rs(inp) == ERR_OK)) {\n      inp->rs_count = 0;\n    }\n#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */\n\n    /* Get the matching default router entry. */\n    i = nd6_get_router(ip6_current_src_addr(), inp);\n    if (i < 0) {\n      /* Create a new router entry. */\n      i = nd6_new_router(ip6_current_src_addr(), inp);\n    }\n\n    if (i < 0) {\n      /* Could not create a new router entry. */\n      pbuf_free(p);\n      ND6_STATS_INC(nd6.memerr);\n      return;\n    }\n\n    /* Re-set invalidation timer. */\n    default_router_list[i].invalidation_timer = lwip_htons(ra_hdr->router_lifetime);\n\n    /* Re-set default timer values. */\n#if LWIP_ND6_ALLOW_RA_UPDATES\n    if (ra_hdr->retrans_timer > 0) {\n      retrans_timer = lwip_htonl(ra_hdr->retrans_timer);\n    }\n    if (ra_hdr->reachable_time > 0) {\n      reachable_time = lwip_htonl(ra_hdr->reachable_time);\n    }\n#endif /* LWIP_ND6_ALLOW_RA_UPDATES */\n\n    /* @todo set default hop limit... */\n    /* ra_hdr->current_hop_limit;*/\n\n    /* Update flags in local entry (incl. preference). */\n    default_router_list[i].flags = ra_hdr->flags;\n\n    /* Offset to options. */\n    offset = sizeof(struct ra_header);\n\n    /* Process each option. */\n    while ((p->tot_len - offset) > 0) {\n      if (p->len == p->tot_len) {\n        /* no need to copy from contiguous pbuf */\n        buffer = &((u8_t*)p->payload)[offset];\n      } else {\n        buffer = nd6_ra_buffer;\n        if (pbuf_copy_partial(p, buffer, sizeof(struct prefix_option), offset) != sizeof(struct prefix_option)) {\n          pbuf_free(p);\n          ND6_STATS_INC(nd6.lenerr);\n          ND6_STATS_INC(nd6.drop);\n          return;\n        }\n      }\n      if (buffer[1] == 0) {\n        /* zero-length extension. drop packet */\n        pbuf_free(p);\n        ND6_STATS_INC(nd6.lenerr);\n        ND6_STATS_INC(nd6.drop);\n        return;\n      }\n      switch (buffer[0]) {\n      case ND6_OPTION_TYPE_SOURCE_LLADDR:\n      {\n        struct lladdr_option *lladdr_opt;\n        lladdr_opt = (struct lladdr_option *)buffer;\n        if ((default_router_list[i].neighbor_entry != NULL) &&\n            (default_router_list[i].neighbor_entry->state == ND6_INCOMPLETE)) {\n          SMEMCPY(default_router_list[i].neighbor_entry->lladdr, lladdr_opt->addr, inp->hwaddr_len);\n          default_router_list[i].neighbor_entry->state = ND6_REACHABLE;\n          default_router_list[i].neighbor_entry->counter.reachable_time = reachable_time;\n        }\n        break;\n      }\n      case ND6_OPTION_TYPE_MTU:\n      {\n        struct mtu_option *mtu_opt;\n        mtu_opt = (struct mtu_option *)buffer;\n        if (lwip_htonl(mtu_opt->mtu) >= 1280) {\n#if LWIP_ND6_ALLOW_RA_UPDATES\n          inp->mtu = (u16_t)lwip_htonl(mtu_opt->mtu);\n#endif /* LWIP_ND6_ALLOW_RA_UPDATES */\n        }\n        break;\n      }\n      case ND6_OPTION_TYPE_PREFIX_INFO:\n      {\n        struct prefix_option *prefix_opt;\n        prefix_opt = (struct prefix_option *)buffer;\n\n        if ((prefix_opt->flags & ND6_PREFIX_FLAG_ON_LINK) &&\n            (prefix_opt->prefix_length == 64)  &&\n            !ip6_addr_islinklocal(&(prefix_opt->prefix))) {\n          /* Add to on-link prefix list. */\n          s8_t prefix;\n          ip6_addr_t prefix_addr;\n\n          /* Get a memory-aligned copy of the prefix. */\n          ip6_addr_set(&prefix_addr, &(prefix_opt->prefix));\n\n          /* find cache entry for this prefix. */\n          prefix = nd6_get_onlink_prefix(&prefix_addr, inp);\n          if (prefix < 0) {\n            /* Create a new cache entry. */\n            prefix = nd6_new_onlink_prefix(&prefix_addr, inp);\n          }\n          if (prefix >= 0) {\n            prefix_list[prefix].invalidation_timer = lwip_htonl(prefix_opt->valid_lifetime);\n\n#if LWIP_IPV6_AUTOCONFIG\n            if (prefix_opt->flags & ND6_PREFIX_FLAG_AUTONOMOUS) {\n              /* Mark prefix as autonomous, so that address autoconfiguration can take place.\n               * Only OR flag, so that we don't over-write other flags (such as ADDRESS_DUPLICATE)*/\n              prefix_list[prefix].flags |= ND6_PREFIX_AUTOCONFIG_AUTONOMOUS;\n            }\n#endif /* LWIP_IPV6_AUTOCONFIG */\n          }\n        }\n\n        break;\n      }\n      case ND6_OPTION_TYPE_ROUTE_INFO:\n        /* @todo implement preferred routes.\n        struct route_option * route_opt;\n        route_opt = (struct route_option *)buffer;*/\n\n        break;\n#if LWIP_ND6_RDNSS_MAX_DNS_SERVERS\n      case ND6_OPTION_TYPE_RDNSS:\n      {\n        u8_t num, n;\n        struct rdnss_option * rdnss_opt;\n\n        rdnss_opt = (struct rdnss_option *)buffer;\n        num = (rdnss_opt->length - 1) / 2;\n        for (n = 0; (rdnss_server_idx < DNS_MAX_SERVERS) && (n < num); n++) {\n          ip_addr_t rdnss_address;\n\n          /* Get a memory-aligned copy of the prefix. */\n          ip_addr_copy_from_ip6(rdnss_address, rdnss_opt->rdnss_address[n]);\n\n          if (htonl(rdnss_opt->lifetime) > 0) {\n            /* TODO implement Lifetime > 0 */\n            dns_setserver(rdnss_server_idx++, &rdnss_address);\n          } else {\n            /* TODO implement DNS removal in dns.c */\n            u8_t s;\n            for (s = 0; s < DNS_MAX_SERVERS; s++) {\n              const ip_addr_t *addr = dns_getserver(s);\n              if(ip_addr_cmp(addr, &rdnss_address)) {\n                dns_setserver(s, NULL);\n              }\n            }\n          }\n        }\n        break;\n      }\n#endif /* LWIP_ND6_RDNSS_MAX_DNS_SERVERS */\n      default:\n        /* Unrecognized option, abort. */\n        ND6_STATS_INC(nd6.proterr);\n        break;\n      }\n      /* option length is checked earlier to be non-zero to make sure loop ends */\n      offset += 8 * ((u16_t)buffer[1]);\n    }\n\n    break; /* ICMP6_TYPE_RA */\n  }\n  case ICMP6_TYPE_RD: /* Redirect */\n  {\n    struct redirect_header *redir_hdr;\n    struct lladdr_option *lladdr_opt;\n    ip6_addr_t tmp;\n\n    /* Check that Redir header fits in packet. */\n    if (p->len < sizeof(struct redirect_header)) {\n      /* @todo debug message */\n      pbuf_free(p);\n      ND6_STATS_INC(nd6.lenerr);\n      ND6_STATS_INC(nd6.drop);\n      return;\n    }\n\n    redir_hdr = (struct redirect_header *)p->payload;\n\n    if (p->len >= (sizeof(struct redirect_header) + 2)) {\n      lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct redirect_header));\n      if (p->len < (sizeof(struct redirect_header) + (lladdr_opt->length << 3))) {\n        lladdr_opt = NULL;\n      }\n    } else {\n      lladdr_opt = NULL;\n    }\n\n    /* Copy original destination address to current source address, to have an aligned copy. */\n    ip6_addr_set(&tmp, &(redir_hdr->destination_address));\n\n    /* Find dest address in cache */\n    i = nd6_find_destination_cache_entry(&tmp);\n    if (i < 0) {\n      /* Destination not in cache, drop packet. */\n      pbuf_free(p);\n      return;\n    }\n\n    /* Set the new target address. */\n    ip6_addr_set(&(destination_cache[i].next_hop_addr), &(redir_hdr->target_address));\n\n    /* If Link-layer address of other router is given, try to add to neighbor cache. */\n    if (lladdr_opt != NULL) {\n      if (lladdr_opt->type == ND6_OPTION_TYPE_TARGET_LLADDR) {\n        /* Copy target address to current source address, to have an aligned copy. */\n        ip6_addr_set(&tmp, &(redir_hdr->target_address));\n\n        i = nd6_find_neighbor_cache_entry(&tmp);\n        if (i < 0) {\n          i = nd6_new_neighbor_cache_entry();\n          if (i >= 0) {\n            neighbor_cache[i].netif = inp;\n            MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);\n            ip6_addr_set(&(neighbor_cache[i].next_hop_address), &tmp);\n\n            /* Receiving a message does not prove reachability: only in one direction.\n             * Delay probe in case we get confirmation of reachability from upper layer (TCP). */\n            neighbor_cache[i].state = ND6_DELAY;\n            neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME / ND6_TMR_INTERVAL;\n          }\n        }\n        if (i >= 0) {\n          if (neighbor_cache[i].state == ND6_INCOMPLETE) {\n            MEMCPY(neighbor_cache[i].lladdr, lladdr_opt->addr, inp->hwaddr_len);\n            /* Receiving a message does not prove reachability: only in one direction.\n             * Delay probe in case we get confirmation of reachability from upper layer (TCP). */\n            neighbor_cache[i].state = ND6_DELAY;\n            neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME / ND6_TMR_INTERVAL;\n          }\n        }\n      }\n    }\n    break; /* ICMP6_TYPE_RD */\n  }\n  case ICMP6_TYPE_PTB: /* Packet too big */\n  {\n    struct icmp6_hdr *icmp6hdr; /* Packet too big message */\n    struct ip6_hdr *ip6hdr; /* IPv6 header of the packet which caused the error */\n    u32_t pmtu;\n    ip6_addr_t tmp;\n\n    /* Check that ICMPv6 header + IPv6 header fit in payload */\n    if (p->len < (sizeof(struct icmp6_hdr) + IP6_HLEN)) {\n      /* drop short packets */\n      pbuf_free(p);\n      ND6_STATS_INC(nd6.lenerr);\n      ND6_STATS_INC(nd6.drop);\n      return;\n    }\n\n    icmp6hdr = (struct icmp6_hdr *)p->payload;\n    ip6hdr = (struct ip6_hdr *)((u8_t*)p->payload + sizeof(struct icmp6_hdr));\n\n    /* Copy original destination address to current source address, to have an aligned copy. */\n    ip6_addr_set(&tmp, &(ip6hdr->dest));\n\n    /* Look for entry in destination cache. */\n    i = nd6_find_destination_cache_entry(&tmp);\n    if (i < 0) {\n      /* Destination not in cache, drop packet. */\n      pbuf_free(p);\n      return;\n    }\n\n    /* Change the Path MTU. */\n    pmtu = lwip_htonl(icmp6hdr->data);\n    destination_cache[i].pmtu = (u16_t)LWIP_MIN(pmtu, 0xFFFF);\n\n    break; /* ICMP6_TYPE_PTB */\n  }\n\n  default:\n    ND6_STATS_INC(nd6.proterr);\n    ND6_STATS_INC(nd6.drop);\n    break; /* default */\n  }\n\n  pbuf_free(p);\n}\n\n\n/**\n * Periodic timer for Neighbor discovery functions:\n *\n * - Update neighbor reachability states\n * - Update destination cache entries age\n * - Update invalidation timers of default routers and on-link prefixes\n * - Perform duplicate address detection (DAD) for our addresses\n * - Send router solicitations\n */\nvoid\nnd6_tmr(void)\n{\n  s8_t i;\n  struct netif *netif;\n\n  /* Process neighbor entries. */\n  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {\n    switch (neighbor_cache[i].state) {\n    case ND6_INCOMPLETE:\n      if ((neighbor_cache[i].counter.probes_sent >= LWIP_ND6_MAX_MULTICAST_SOLICIT) &&\n          (!neighbor_cache[i].isrouter)) {\n        /* Retries exceeded. */\n        nd6_free_neighbor_cache_entry(i);\n      } else {\n        /* Send a NS for this entry. */\n        neighbor_cache[i].counter.probes_sent++;\n        nd6_send_neighbor_cache_probe(&neighbor_cache[i], ND6_SEND_FLAG_MULTICAST_DEST);\n      }\n      break;\n    case ND6_REACHABLE:\n      /* Send queued packets, if any are left. Should have been sent already. */\n      if (neighbor_cache[i].q != NULL) {\n        nd6_send_q(i);\n      }\n      if (neighbor_cache[i].counter.reachable_time <= ND6_TMR_INTERVAL) {\n        /* Change to stale state. */\n        neighbor_cache[i].state = ND6_STALE;\n        neighbor_cache[i].counter.stale_time = 0;\n      } else {\n        neighbor_cache[i].counter.reachable_time -= ND6_TMR_INTERVAL;\n      }\n      break;\n    case ND6_STALE:\n      neighbor_cache[i].counter.stale_time++;\n      break;\n    case ND6_DELAY:\n      if (neighbor_cache[i].counter.delay_time <= 1) {\n        /* Change to PROBE state. */\n        neighbor_cache[i].state = ND6_PROBE;\n        neighbor_cache[i].counter.probes_sent = 0;\n      } else {\n        neighbor_cache[i].counter.delay_time--;\n      }\n      break;\n    case ND6_PROBE:\n      if ((neighbor_cache[i].counter.probes_sent >= LWIP_ND6_MAX_MULTICAST_SOLICIT) &&\n          (!neighbor_cache[i].isrouter)) {\n        /* Retries exceeded. */\n        nd6_free_neighbor_cache_entry(i);\n      } else {\n        /* Send a NS for this entry. */\n        neighbor_cache[i].counter.probes_sent++;\n        nd6_send_neighbor_cache_probe(&neighbor_cache[i], 0);\n      }\n      break;\n    case ND6_NO_ENTRY:\n    default:\n      /* Do nothing. */\n      break;\n    }\n  }\n\n  /* Process destination entries. */\n  for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {\n    destination_cache[i].age++;\n  }\n\n  /* Process router entries. */\n  for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {\n    if (default_router_list[i].neighbor_entry != NULL) {\n      /* Active entry. */\n      if (default_router_list[i].invalidation_timer > 0) {\n        default_router_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000;\n      }\n      if (default_router_list[i].invalidation_timer < ND6_TMR_INTERVAL / 1000) {\n        /* Less than 1 second remaining. Clear this entry. */\n        default_router_list[i].neighbor_entry->isrouter = 0;\n        default_router_list[i].neighbor_entry = NULL;\n        default_router_list[i].invalidation_timer = 0;\n        default_router_list[i].flags = 0;\n      }\n    }\n  }\n\n  /* Process prefix entries. */\n  for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) {\n    if (prefix_list[i].netif != NULL) {\n      if (prefix_list[i].invalidation_timer < ND6_TMR_INTERVAL / 1000) {\n        /* Entry timed out, remove it */\n        prefix_list[i].invalidation_timer = 0;\n\n#if LWIP_IPV6_AUTOCONFIG\n        /* If any addresses were configured with this prefix, remove them */\n        if (prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED) {\n          s8_t j;\n\n          for (j = 1; j < LWIP_IPV6_NUM_ADDRESSES; j++) {\n            if ((netif_ip6_addr_state(prefix_list[i].netif, j) != IP6_ADDR_INVALID) &&\n                ip6_addr_netcmp(&prefix_list[i].prefix, netif_ip6_addr(prefix_list[i].netif, j))) {\n              netif_ip6_addr_set_state(prefix_list[i].netif, j, IP6_ADDR_INVALID);\n              prefix_list[i].flags = 0;\n\n              /* Exit loop. */\n              break;\n            }\n          }\n        }\n#endif /* LWIP_IPV6_AUTOCONFIG */\n\n        prefix_list[i].netif = NULL;\n        prefix_list[i].flags = 0;\n      } else {\n        prefix_list[i].invalidation_timer -= ND6_TMR_INTERVAL / 1000;\n\n#if LWIP_IPV6_AUTOCONFIG\n        /* Initiate address autoconfiguration for this prefix, if conditions are met. */\n        if (prefix_list[i].netif->ip6_autoconfig_enabled &&\n            (prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_AUTONOMOUS) &&\n            !(prefix_list[i].flags & ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED)) {\n          s8_t j;\n          /* Try to get an address on this netif that is invalid.\n           * Skip 0 index (link-local address) */\n          for (j = 1; j < LWIP_IPV6_NUM_ADDRESSES; j++) {\n            if (netif_ip6_addr_state(prefix_list[i].netif, j) == IP6_ADDR_INVALID) {\n              /* Generate an address using this prefix and interface ID from link-local address. */\n              netif_ip6_addr_set_parts(prefix_list[i].netif, j,\n                prefix_list[i].prefix.addr[0], prefix_list[i].prefix.addr[1],\n                netif_ip6_addr(prefix_list[i].netif, 0)->addr[2], netif_ip6_addr(prefix_list[i].netif, 0)->addr[3]);\n\n              /* Mark it as tentative (DAD will be performed if configured). */\n              netif_ip6_addr_set_state(prefix_list[i].netif, j, IP6_ADDR_TENTATIVE);\n\n              /* Mark this prefix with ADDRESS_GENERATED, so that we don't try again. */\n              prefix_list[i].flags |= ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED;\n\n              /* Exit loop. */\n              break;\n            }\n          }\n        }\n#endif /* LWIP_IPV6_AUTOCONFIG */\n      }\n    }\n  }\n\n\n  /* Process our own addresses, if DAD configured. */\n  for (netif = netif_list; netif != NULL; netif = netif->next) {\n    for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; ++i) {\n      u8_t addr_state = netif_ip6_addr_state(netif, i);\n      if (ip6_addr_istentative(addr_state)) {\n        if ((addr_state & IP6_ADDR_TENTATIVE_COUNT_MASK) >= LWIP_IPV6_DUP_DETECT_ATTEMPTS) {\n          /* No NA received in response. Mark address as valid. */\n          netif_ip6_addr_set_state(netif, i, IP6_ADDR_PREFERRED);\n          /* @todo implement preferred and valid lifetimes. */\n        } else if (netif->flags & NETIF_FLAG_UP) {\n          /* Send a NS for this address. */\n          nd6_send_ns(netif, netif_ip6_addr(netif, i), ND6_SEND_FLAG_MULTICAST_DEST);\n          /* tentative: set next state by increasing by one */\n          netif_ip6_addr_set_state(netif, i, addr_state + 1);\n          /* @todo send max 1 NS per tmr call? enable return*/\n          /*return;*/\n        }\n      }\n    }\n  }\n\n#if LWIP_IPV6_SEND_ROUTER_SOLICIT\n  /* Send router solicitation messages, if necessary. */\n  for (netif = netif_list; netif != NULL; netif = netif->next) {\n    if ((netif->rs_count > 0) && (netif->flags & NETIF_FLAG_UP) &&\n        (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, 0)))) {\n      if (nd6_send_rs(netif) == ERR_OK) {\n        netif->rs_count--;\n      }\n    }\n  }\n#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */\n\n}\n\n/** Send a neighbor solicitation message for a specific neighbor cache entry\n *\n * @param entry the neightbor cache entry for wich to send the message\n * @param flags one of ND6_SEND_FLAG_*\n */\nstatic void\nnd6_send_neighbor_cache_probe(struct nd6_neighbor_cache_entry *entry, u8_t flags)\n{\n  nd6_send_ns(entry->netif, &entry->next_hop_address, flags);\n}\n\n/**\n * Send a neighbor solicitation message\n *\n * @param netif the netif on which to send the message\n * @param target_addr the IPv6 target address for the ND message\n * @param flags one of ND6_SEND_FLAG_*\n */\nstatic void\nnd6_send_ns(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags)\n{\n  struct ns_header *ns_hdr;\n  struct pbuf *p;\n  const ip6_addr_t *src_addr;\n  u16_t lladdr_opt_len;\n\n  if (ip6_addr_isvalid(netif_ip6_addr_state(netif,0))) {\n    /* Use link-local address as source address. */\n    src_addr = netif_ip6_addr(netif, 0);\n    /* calculate option length (in 8-byte-blocks) */\n    lladdr_opt_len = ((netif->hwaddr_len + 2) + 7) >> 3;\n  } else {\n    src_addr = IP6_ADDR_ANY6;\n    /* Option \"MUST NOT be included when the source IP address is the unspecified address.\" */\n    lladdr_opt_len = 0;\n  }\n\n  /* Allocate a packet. */\n  p = pbuf_alloc(PBUF_IP, sizeof(struct ns_header) + (lladdr_opt_len << 3), PBUF_RAM);\n  if (p == NULL) {\n    ND6_STATS_INC(nd6.memerr);\n    return;\n  }\n\n  /* Set fields. */\n  ns_hdr = (struct ns_header *)p->payload;\n\n  ns_hdr->type = ICMP6_TYPE_NS;\n  ns_hdr->code = 0;\n  ns_hdr->chksum = 0;\n  ns_hdr->reserved = 0;\n  ip6_addr_set(&(ns_hdr->target_address), target_addr);\n\n  if (lladdr_opt_len != 0) {\n    struct lladdr_option *lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct ns_header));\n    lladdr_opt->type = ND6_OPTION_TYPE_SOURCE_LLADDR;\n    lladdr_opt->length = (u8_t)lladdr_opt_len;\n    SMEMCPY(lladdr_opt->addr, netif->hwaddr, netif->hwaddr_len);\n  }\n\n  /* Generate the solicited node address for the target address. */\n  if (flags & ND6_SEND_FLAG_MULTICAST_DEST) {\n    ip6_addr_set_solicitednode(&multicast_address, target_addr->addr[3]);\n    target_addr = &multicast_address;\n  }\n\n#if CHECKSUM_GEN_ICMP6\n  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) {\n    ns_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr,\n      target_addr);\n  }\n#endif /* CHECKSUM_GEN_ICMP6 */\n\n  /* Send the packet out. */\n  ND6_STATS_INC(nd6.xmit);\n  ip6_output_if(p, (src_addr == IP6_ADDR_ANY6) ? NULL : src_addr, target_addr,\n      LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif);\n  pbuf_free(p);\n}\n\n/**\n * Send a neighbor advertisement message\n *\n * @param netif the netif on which to send the message\n * @param target_addr the IPv6 target address for the ND message\n * @param flags one of ND6_SEND_FLAG_*\n */\nstatic void\nnd6_send_na(struct netif *netif, const ip6_addr_t *target_addr, u8_t flags)\n{\n  struct na_header *na_hdr;\n  struct lladdr_option *lladdr_opt;\n  struct pbuf *p;\n  const ip6_addr_t *src_addr;\n  const ip6_addr_t *dest_addr;\n  u16_t lladdr_opt_len;\n\n  /* Use link-local address as source address. */\n  /* src_addr = netif_ip6_addr(netif, 0); */\n  /* Use target address as source address. */\n  src_addr = target_addr;\n\n  /* Allocate a packet. */\n  lladdr_opt_len = ((netif->hwaddr_len + 2) >> 3) + (((netif->hwaddr_len + 2) & 0x07) ? 1 : 0);\n  p = pbuf_alloc(PBUF_IP, sizeof(struct na_header) + (lladdr_opt_len << 3), PBUF_RAM);\n  if (p == NULL) {\n    ND6_STATS_INC(nd6.memerr);\n    return;\n  }\n\n  /* Set fields. */\n  na_hdr = (struct na_header *)p->payload;\n  lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct na_header));\n\n  na_hdr->type = ICMP6_TYPE_NA;\n  na_hdr->code = 0;\n  na_hdr->chksum = 0;\n  na_hdr->flags = flags & 0xf0;\n  na_hdr->reserved[0] = 0;\n  na_hdr->reserved[1] = 0;\n  na_hdr->reserved[2] = 0;\n  ip6_addr_set(&(na_hdr->target_address), target_addr);\n\n  lladdr_opt->type = ND6_OPTION_TYPE_TARGET_LLADDR;\n  lladdr_opt->length = (u8_t)lladdr_opt_len;\n  SMEMCPY(lladdr_opt->addr, netif->hwaddr, netif->hwaddr_len);\n\n  /* Generate the solicited node address for the target address. */\n  if (flags & ND6_SEND_FLAG_MULTICAST_DEST) {\n    ip6_addr_set_solicitednode(&multicast_address, target_addr->addr[3]);\n    dest_addr = &multicast_address;\n  } else if (flags & ND6_SEND_FLAG_ALLNODES_DEST) {\n    ip6_addr_set_allnodes_linklocal(&multicast_address);\n    dest_addr = &multicast_address;\n  } else {\n    dest_addr = ip6_current_src_addr();\n  }\n\n#if CHECKSUM_GEN_ICMP6\n  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) {\n    na_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr,\n      dest_addr);\n  }\n#endif /* CHECKSUM_GEN_ICMP6 */\n\n  /* Send the packet out. */\n  ND6_STATS_INC(nd6.xmit);\n  ip6_output_if(p, src_addr, dest_addr,\n      LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif);\n  pbuf_free(p);\n}\n\n#if LWIP_IPV6_SEND_ROUTER_SOLICIT\n/**\n * Send a router solicitation message\n *\n * @param netif the netif on which to send the message\n */\nstatic err_t\nnd6_send_rs(struct netif *netif)\n{\n  struct rs_header *rs_hdr;\n  struct lladdr_option *lladdr_opt;\n  struct pbuf *p;\n  const ip6_addr_t *src_addr;\n  err_t err;\n  u16_t lladdr_opt_len = 0;\n\n  /* Link-local source address, or unspecified address? */\n  if (ip6_addr_isvalid(netif_ip6_addr_state(netif, 0))) {\n    src_addr = netif_ip6_addr(netif, 0);\n  } else {\n    src_addr = IP6_ADDR_ANY6;\n  }\n\n  /* Generate the all routers target address. */\n  ip6_addr_set_allrouters_linklocal(&multicast_address);\n\n  /* Allocate a packet. */\n  if (src_addr != IP6_ADDR_ANY6) {\n    lladdr_opt_len = ((netif->hwaddr_len + 2) >> 3) + (((netif->hwaddr_len + 2) & 0x07) ? 1 : 0);\n  }\n  p = pbuf_alloc(PBUF_IP, sizeof(struct rs_header) + (lladdr_opt_len << 3), PBUF_RAM);\n  if (p == NULL) {\n    ND6_STATS_INC(nd6.memerr);\n    return ERR_BUF;\n  }\n\n  /* Set fields. */\n  rs_hdr = (struct rs_header *)p->payload;\n\n  rs_hdr->type = ICMP6_TYPE_RS;\n  rs_hdr->code = 0;\n  rs_hdr->chksum = 0;\n  rs_hdr->reserved = 0;\n\n  if (src_addr != IP6_ADDR_ANY6) {\n    /* Include our hw address. */\n    lladdr_opt = (struct lladdr_option *)((u8_t*)p->payload + sizeof(struct rs_header));\n    lladdr_opt->type = ND6_OPTION_TYPE_SOURCE_LLADDR;\n    lladdr_opt->length = (u8_t)lladdr_opt_len;\n    SMEMCPY(lladdr_opt->addr, netif->hwaddr, netif->hwaddr_len);\n  }\n\n#if CHECKSUM_GEN_ICMP6\n  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_ICMP6) {\n    rs_hdr->chksum = ip6_chksum_pseudo(p, IP6_NEXTH_ICMP6, p->len, src_addr,\n      &multicast_address);\n  }\n#endif /* CHECKSUM_GEN_ICMP6 */\n\n  /* Send the packet out. */\n  ND6_STATS_INC(nd6.xmit);\n\n  err = ip6_output_if(p, (src_addr == IP6_ADDR_ANY6) ? NULL : src_addr, &multicast_address,\n      LWIP_ICMP6_HL, 0, IP6_NEXTH_ICMP6, netif);\n  pbuf_free(p);\n\n  return err;\n}\n#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */\n\n/**\n * Search for a neighbor cache entry\n *\n * @param ip6addr the IPv6 address of the neighbor\n * @return The neighbor cache entry index that matched, -1 if no\n * entry is found\n */\nstatic s8_t\nnd6_find_neighbor_cache_entry(const ip6_addr_t *ip6addr)\n{\n  s8_t i;\n  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {\n    if (ip6_addr_cmp(ip6addr, &(neighbor_cache[i].next_hop_address))) {\n      return i;\n    }\n  }\n  return -1;\n}\n\n/**\n * Create a new neighbor cache entry.\n *\n * If no unused entry is found, will try to recycle an old entry\n * according to ad-hoc \"age\" heuristic.\n *\n * @return The neighbor cache entry index that was created, -1 if no\n * entry could be created\n */\nstatic s8_t\nnd6_new_neighbor_cache_entry(void)\n{\n  s8_t i;\n  s8_t j;\n  u32_t time;\n\n\n  /* First, try to find an empty entry. */\n  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {\n    if (neighbor_cache[i].state == ND6_NO_ENTRY) {\n      return i;\n    }\n  }\n\n  /* We need to recycle an entry. in general, do not recycle if it is a router. */\n\n  /* Next, try to find a Stale entry. */\n  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {\n    if ((neighbor_cache[i].state == ND6_STALE) &&\n        (!neighbor_cache[i].isrouter)) {\n      nd6_free_neighbor_cache_entry(i);\n      return i;\n    }\n  }\n\n  /* Next, try to find a Probe entry. */\n  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {\n    if ((neighbor_cache[i].state == ND6_PROBE) &&\n        (!neighbor_cache[i].isrouter)) {\n      nd6_free_neighbor_cache_entry(i);\n      return i;\n    }\n  }\n\n  /* Next, try to find a Delayed entry. */\n  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {\n    if ((neighbor_cache[i].state == ND6_DELAY) &&\n        (!neighbor_cache[i].isrouter)) {\n      nd6_free_neighbor_cache_entry(i);\n      return i;\n    }\n  }\n\n  /* Next, try to find the oldest reachable entry. */\n  time = 0xfffffffful;\n  j = -1;\n  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {\n    if ((neighbor_cache[i].state == ND6_REACHABLE) &&\n        (!neighbor_cache[i].isrouter)) {\n      if (neighbor_cache[i].counter.reachable_time < time) {\n        j = i;\n        time = neighbor_cache[i].counter.reachable_time;\n      }\n    }\n  }\n  if (j >= 0) {\n    nd6_free_neighbor_cache_entry(j);\n    return j;\n  }\n\n  /* Next, find oldest incomplete entry without queued packets. */\n  time = 0;\n  j = -1;\n  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {\n    if (\n        (neighbor_cache[i].q == NULL) &&\n        (neighbor_cache[i].state == ND6_INCOMPLETE) &&\n        (!neighbor_cache[i].isrouter)) {\n      if (neighbor_cache[i].counter.probes_sent >= time) {\n        j = i;\n        time = neighbor_cache[i].counter.probes_sent;\n      }\n    }\n  }\n  if (j >= 0) {\n    nd6_free_neighbor_cache_entry(j);\n    return j;\n  }\n\n  /* Next, find oldest incomplete entry with queued packets. */\n  time = 0;\n  j = -1;\n  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {\n    if ((neighbor_cache[i].state == ND6_INCOMPLETE) &&\n        (!neighbor_cache[i].isrouter)) {\n      if (neighbor_cache[i].counter.probes_sent >= time) {\n        j = i;\n        time = neighbor_cache[i].counter.probes_sent;\n      }\n    }\n  }\n  if (j >= 0) {\n    nd6_free_neighbor_cache_entry(j);\n    return j;\n  }\n\n  /* No more entries to try. */\n  return -1;\n}\n\n/**\n * Will free any resources associated with a neighbor cache\n * entry, and will mark it as unused.\n *\n * @param i the neighbor cache entry index to free\n */\nstatic void\nnd6_free_neighbor_cache_entry(s8_t i)\n{\n  if ((i < 0) || (i >= LWIP_ND6_NUM_NEIGHBORS)) {\n    return;\n  }\n  if (neighbor_cache[i].isrouter) {\n    /* isrouter needs to be cleared before deleting a neighbor cache entry */\n    return;\n  }\n\n  /* Free any queued packets. */\n  if (neighbor_cache[i].q != NULL) {\n    nd6_free_q(neighbor_cache[i].q);\n    neighbor_cache[i].q = NULL;\n  }\n\n  neighbor_cache[i].state = ND6_NO_ENTRY;\n  neighbor_cache[i].isrouter = 0;\n  neighbor_cache[i].netif = NULL;\n  neighbor_cache[i].counter.reachable_time = 0;\n  ip6_addr_set_zero(&(neighbor_cache[i].next_hop_address));\n}\n\n/**\n * Search for a destination cache entry\n *\n * @param ip6addr the IPv6 address of the destination\n * @return The destination cache entry index that matched, -1 if no\n * entry is found\n */\nstatic s8_t\nnd6_find_destination_cache_entry(const ip6_addr_t *ip6addr)\n{\n  s8_t i;\n  for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {\n    if (ip6_addr_cmp(ip6addr, &(destination_cache[i].destination_addr))) {\n      return i;\n    }\n  }\n  return -1;\n}\n\n/**\n * Create a new destination cache entry. If no unused entry is found,\n * will recycle oldest entry.\n *\n * @return The destination cache entry index that was created, -1 if no\n * entry was created\n */\nstatic s8_t\nnd6_new_destination_cache_entry(void)\n{\n  s8_t i, j;\n  u32_t age;\n\n  /* Find an empty entry. */\n  for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {\n    if (ip6_addr_isany(&(destination_cache[i].destination_addr))) {\n      return i;\n    }\n  }\n\n  /* Find oldest entry. */\n  age = 0;\n  j = LWIP_ND6_NUM_DESTINATIONS - 1;\n  for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {\n    if (destination_cache[i].age > age) {\n      j = i;\n    }\n  }\n\n  return j;\n}\n\n/**\n * Clear the destination cache.\n *\n * This operation may be necessary for consistency in the light of changing\n * local addresses and/or use of the gateway hook.\n */\nvoid\nnd6_clear_destination_cache(void)\n{\n  int i;\n\n  for (i = 0; i < LWIP_ND6_NUM_DESTINATIONS; i++) {\n    ip6_addr_set_any(&destination_cache[i].destination_addr);\n  }\n}\n\n/**\n * Determine whether an address matches an on-link prefix.\n *\n * @param ip6addr the IPv6 address to match\n * @return 1 if the address is on-link, 0 otherwise\n */\nstatic s8_t\nnd6_is_prefix_in_netif(const ip6_addr_t *ip6addr, struct netif *netif)\n{\n  s8_t i;\n  for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) {\n    if ((prefix_list[i].netif == netif) &&\n        (prefix_list[i].invalidation_timer > 0) &&\n        ip6_addr_netcmp(ip6addr, &(prefix_list[i].prefix))) {\n      return 1;\n    }\n  }\n  /* Check to see if address prefix matches a (manually?) configured address. */\n  for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n    if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i)) &&\n        ip6_addr_netcmp(ip6addr, netif_ip6_addr(netif, i))) {\n      return 1;\n    }\n  }\n  return 0;\n}\n\n/**\n * Select a default router for a destination.\n *\n * @param ip6addr the destination address\n * @param netif the netif for the outgoing packet, if known\n * @return the default router entry index, or -1 if no suitable\n *         router is found\n */\nstatic s8_t\nnd6_select_router(const ip6_addr_t *ip6addr, struct netif *netif)\n{\n  s8_t i;\n  /* last_router is used for round-robin router selection (as recommended\n   * in RFC). This is more robust in case one router is not reachable,\n   * we are not stuck trying to resolve it. */\n  static s8_t last_router;\n  (void)ip6addr; /* @todo match preferred routes!! (must implement ND6_OPTION_TYPE_ROUTE_INFO) */\n\n  /* @todo: implement default router preference */\n\n  /* Look for reachable routers. */\n  for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {\n    if (++last_router >= LWIP_ND6_NUM_ROUTERS) {\n      last_router = 0;\n    }\n    if ((default_router_list[i].neighbor_entry != NULL) &&\n        (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1) &&\n        (default_router_list[i].invalidation_timer > 0) &&\n        (default_router_list[i].neighbor_entry->state == ND6_REACHABLE)) {\n      return i;\n    }\n  }\n\n  /* Look for router in other reachability states, but still valid according to timer. */\n  for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {\n    if (++last_router >= LWIP_ND6_NUM_ROUTERS) {\n      last_router = 0;\n    }\n    if ((default_router_list[i].neighbor_entry != NULL) &&\n        (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1) &&\n        (default_router_list[i].invalidation_timer > 0)) {\n      return i;\n    }\n  }\n\n  /* Look for any router for which we have any information at all. */\n  for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {\n    if (++last_router >= LWIP_ND6_NUM_ROUTERS) {\n      last_router = 0;\n    }\n    if (default_router_list[i].neighbor_entry != NULL &&\n        (netif != NULL ? netif == default_router_list[i].neighbor_entry->netif : 1)) {\n      return i;\n    }\n  }\n\n  /* no suitable router found. */\n  return -1;\n}\n\n/**\n * Find a router-announced route to the given destination.\n *\n * The caller is responsible for checking whether the returned netif, if any,\n * is in a suitable state (up, link up) to be used for packet transmission.\n *\n * @param ip6addr the destination IPv6 address\n * @return the netif to use for the destination, or NULL if none found\n */\nstruct netif *\nnd6_find_route(const ip6_addr_t *ip6addr)\n{\n  s8_t i;\n\n  i = nd6_select_router(ip6addr, NULL);\n  if (i >= 0) {\n    if (default_router_list[i].neighbor_entry != NULL) {\n      return default_router_list[i].neighbor_entry->netif; /* may be NULL */\n    }\n  }\n\n  return NULL;\n}\n\n/**\n * Find an entry for a default router.\n *\n * @param router_addr the IPv6 address of the router\n * @param netif the netif on which the router is found, if known\n * @return the index of the router entry, or -1 if not found\n */\nstatic s8_t\nnd6_get_router(const ip6_addr_t *router_addr, struct netif *netif)\n{\n  s8_t i;\n\n  /* Look for router. */\n  for (i = 0; i < LWIP_ND6_NUM_ROUTERS; i++) {\n    if ((default_router_list[i].neighbor_entry != NULL) &&\n        ((netif != NULL) ? netif == default_router_list[i].neighbor_entry->netif : 1) &&\n        ip6_addr_cmp(router_addr, &(default_router_list[i].neighbor_entry->next_hop_address))) {\n      return i;\n    }\n  }\n\n  /* router not found. */\n  return -1;\n}\n\n/**\n * Create a new entry for a default router.\n *\n * @param router_addr the IPv6 address of the router\n * @param netif the netif on which the router is connected, if known\n * @return the index on the router table, or -1 if could not be created\n */\nstatic s8_t\nnd6_new_router(const ip6_addr_t *router_addr, struct netif *netif)\n{\n  s8_t router_index;\n  s8_t free_router_index;\n  s8_t neighbor_index;\n\n  /* Do we have a neighbor entry for this router? */\n  neighbor_index = nd6_find_neighbor_cache_entry(router_addr);\n  if (neighbor_index < 0) {\n    /* Create a neighbor entry for this router. */\n    neighbor_index = nd6_new_neighbor_cache_entry();\n    if (neighbor_index < 0) {\n      /* Could not create neighbor entry for this router. */\n      return -1;\n    }\n    ip6_addr_set(&(neighbor_cache[neighbor_index].next_hop_address), router_addr);\n    neighbor_cache[neighbor_index].netif = netif;\n    neighbor_cache[neighbor_index].q = NULL;\n    neighbor_cache[neighbor_index].state = ND6_INCOMPLETE;\n    neighbor_cache[neighbor_index].counter.probes_sent = 1;\n    nd6_send_neighbor_cache_probe(&neighbor_cache[neighbor_index], ND6_SEND_FLAG_MULTICAST_DEST);\n  }\n\n  /* Mark neighbor as router. */\n  neighbor_cache[neighbor_index].isrouter = 1;\n\n  /* Look for empty entry. */\n  free_router_index = LWIP_ND6_NUM_ROUTERS;\n  for (router_index = LWIP_ND6_NUM_ROUTERS - 1; router_index >= 0; router_index--) {\n    /* check if router already exists (this is a special case for 2 netifs on the same subnet\n       - e.g. wifi and cable) */\n    if(default_router_list[router_index].neighbor_entry == &(neighbor_cache[neighbor_index])){ \n      return router_index; \n    } \n    if (default_router_list[router_index].neighbor_entry == NULL) {\n      /* remember lowest free index to create a new entry */\n      free_router_index = router_index;\n    }\n  }\n  if (free_router_index < LWIP_ND6_NUM_ROUTERS) {\n    default_router_list[free_router_index].neighbor_entry = &(neighbor_cache[neighbor_index]);\n    return free_router_index;\n  }\n\n  /* Could not create a router entry. */\n\n  /* Mark neighbor entry as not-router. Entry might be useful as neighbor still. */\n  neighbor_cache[neighbor_index].isrouter = 0;\n\n  /* router not found. */\n  return -1;\n}\n\n/**\n * Find the cached entry for an on-link prefix.\n *\n * @param prefix the IPv6 prefix that is on-link\n * @param netif the netif on which the prefix is on-link\n * @return the index on the prefix table, or -1 if not found\n */\nstatic s8_t\nnd6_get_onlink_prefix(ip6_addr_t *prefix, struct netif *netif)\n{\n  s8_t i;\n\n  /* Look for prefix in list. */\n  for (i = 0; i < LWIP_ND6_NUM_PREFIXES; ++i) {\n    if ((ip6_addr_netcmp(&(prefix_list[i].prefix), prefix)) &&\n        (prefix_list[i].netif == netif)) {\n      return i;\n    }\n  }\n\n  /* Entry not available. */\n  return -1;\n}\n\n/**\n * Creates a new entry for an on-link prefix.\n *\n * @param prefix the IPv6 prefix that is on-link\n * @param netif the netif on which the prefix is on-link\n * @return the index on the prefix table, or -1 if not created\n */\nstatic s8_t\nnd6_new_onlink_prefix(ip6_addr_t *prefix, struct netif *netif)\n{\n  s8_t i;\n\n  /* Create new entry. */\n  for (i = 0; i < LWIP_ND6_NUM_PREFIXES; ++i) {\n    if ((prefix_list[i].netif == NULL) ||\n        (prefix_list[i].invalidation_timer == 0)) {\n      /* Found empty prefix entry. */\n      prefix_list[i].netif = netif;\n      ip6_addr_set(&(prefix_list[i].prefix), prefix);\n#if LWIP_IPV6_AUTOCONFIG\n      prefix_list[i].flags = 0;\n#endif /* LWIP_IPV6_AUTOCONFIG */\n      return i;\n    }\n  }\n\n  /* Entry not available. */\n  return -1;\n}\n\n/**\n * Determine the next hop for a destination. Will determine if the\n * destination is on-link, else a suitable on-link router is selected.\n *\n * The last entry index is cached for fast entry search.\n *\n * @param ip6addr the destination address\n * @param netif the netif on which the packet will be sent\n * @return the neighbor cache entry for the next hop, ERR_RTE if no\n *         suitable next hop was found, ERR_MEM if no cache entry\n *         could be created\n */\nstatic s8_t\nnd6_get_next_hop_entry(const ip6_addr_t *ip6addr, struct netif *netif)\n{\n#ifdef LWIP_HOOK_ND6_GET_GW\n  const ip6_addr_t *next_hop_addr;\n  ip6_addr_t *LWIP_HOOK_ND6_GET_GW(const struct netif *netif, const ip6_addr_t *ip6addr);\n#endif /* LWIP_HOOK_ND6_GET_GW */\n  s8_t i;\n\n#if LWIP_NETIF_HWADDRHINT\n  if (netif->addr_hint != NULL) {\n    /* per-pcb cached entry was given */\n    u8_t addr_hint = *(netif->addr_hint);\n    if (addr_hint < LWIP_ND6_NUM_DESTINATIONS) {\n      nd6_cached_destination_index = addr_hint;\n    }\n  }\n#endif /* LWIP_NETIF_HWADDRHINT */\n\n  /* Look for ip6addr in destination cache. */\n  if (ip6_addr_cmp(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) {\n    /* the cached entry index is the right one! */\n    /* do nothing. */\n    ND6_STATS_INC(nd6.cachehit);\n  } else {\n    /* Search destination cache. */\n    i = nd6_find_destination_cache_entry(ip6addr);\n    if (i >= 0) {\n      /* found destination entry. make it our new cached index. */\n      nd6_cached_destination_index = i;\n    } else {\n      /* Not found. Create a new destination entry. */\n      i = nd6_new_destination_cache_entry();\n      if (i >= 0) {\n        /* got new destination entry. make it our new cached index. */\n        nd6_cached_destination_index = i;\n      } else {\n        /* Could not create a destination cache entry. */\n        return ERR_MEM;\n      }\n\n      /* Copy dest address to destination cache. */\n      ip6_addr_set(&(destination_cache[nd6_cached_destination_index].destination_addr), ip6addr);\n\n      /* Now find the next hop. is it a neighbor? */\n      if (ip6_addr_islinklocal(ip6addr) ||\n          nd6_is_prefix_in_netif(ip6addr, netif)) {\n        /* Destination in local link. */\n        destination_cache[nd6_cached_destination_index].pmtu = netif->mtu;\n        ip6_addr_copy(destination_cache[nd6_cached_destination_index].next_hop_addr, destination_cache[nd6_cached_destination_index].destination_addr);\n#ifdef LWIP_HOOK_ND6_GET_GW\n      } else if ((next_hop_addr = LWIP_HOOK_ND6_GET_GW(netif, ip6addr)) != NULL) {\n        /* Next hop for destination provided by hook function. */\n        destination_cache[nd6_cached_destination_index].pmtu = netif->mtu;\n        ip6_addr_set(&destination_cache[nd6_cached_destination_index].next_hop_addr, next_hop_addr);\n#endif /* LWIP_HOOK_ND6_GET_GW */\n      } else {\n        /* We need to select a router. */\n        i = nd6_select_router(ip6addr, netif);\n        if (i < 0) {\n          /* No router found. */\n          ip6_addr_set_any(&(destination_cache[nd6_cached_destination_index].destination_addr));\n          return ERR_RTE;\n        }\n        destination_cache[nd6_cached_destination_index].pmtu = netif->mtu; /* Start with netif mtu, correct through ICMPv6 if necessary */\n        ip6_addr_copy(destination_cache[nd6_cached_destination_index].next_hop_addr, default_router_list[i].neighbor_entry->next_hop_address);\n      }\n    }\n  }\n\n#if LWIP_NETIF_HWADDRHINT\n  if (netif->addr_hint != NULL) {\n    /* per-pcb cached entry was given */\n    *(netif->addr_hint) = nd6_cached_destination_index;\n  }\n#endif /* LWIP_NETIF_HWADDRHINT */\n\n  /* Look in neighbor cache for the next-hop address. */\n  if (ip6_addr_cmp(&(destination_cache[nd6_cached_destination_index].next_hop_addr),\n                   &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) {\n    /* Cache hit. */\n    /* Do nothing. */\n    ND6_STATS_INC(nd6.cachehit);\n  } else {\n    i = nd6_find_neighbor_cache_entry(&(destination_cache[nd6_cached_destination_index].next_hop_addr));\n    if (i >= 0) {\n      /* Found a matching record, make it new cached entry. */\n      nd6_cached_neighbor_index = i;\n    } else {\n      /* Neighbor not in cache. Make a new entry. */\n      i = nd6_new_neighbor_cache_entry();\n      if (i >= 0) {\n        /* got new neighbor entry. make it our new cached index. */\n        nd6_cached_neighbor_index = i;\n      } else {\n        /* Could not create a neighbor cache entry. */\n        return ERR_MEM;\n      }\n\n      /* Initialize fields. */\n      ip6_addr_copy(neighbor_cache[i].next_hop_address,\n                   destination_cache[nd6_cached_destination_index].next_hop_addr);\n      neighbor_cache[i].isrouter = 0;\n      neighbor_cache[i].netif = netif;\n      neighbor_cache[i].state = ND6_INCOMPLETE;\n      neighbor_cache[i].counter.probes_sent = 1;\n      nd6_send_neighbor_cache_probe(&neighbor_cache[i], ND6_SEND_FLAG_MULTICAST_DEST);\n    }\n  }\n\n  /* Reset this destination's age. */\n  destination_cache[nd6_cached_destination_index].age = 0;\n\n  return nd6_cached_neighbor_index;\n}\n\n/**\n * Queue a packet for a neighbor.\n *\n * @param neighbor_index the index in the neighbor cache table\n * @param q packet to be queued\n * @return ERR_OK if succeeded, ERR_MEM if out of memory\n */\nstatic err_t\nnd6_queue_packet(s8_t neighbor_index, struct pbuf *q)\n{\n  err_t result = ERR_MEM;\n  struct pbuf *p;\n  int copy_needed = 0;\n#if LWIP_ND6_QUEUEING\n  struct nd6_q_entry *new_entry, *r;\n#endif /* LWIP_ND6_QUEUEING */\n\n  if ((neighbor_index < 0) || (neighbor_index >= LWIP_ND6_NUM_NEIGHBORS)) {\n    return ERR_ARG;\n  }\n\n  /* IF q includes a PBUF_REF, PBUF_POOL or PBUF_RAM, we have no choice but\n   * to copy the whole queue into a new PBUF_RAM (see bug #11400)\n   * PBUF_ROMs can be left as they are, since ROM must not get changed. */\n  p = q;\n  while (p) {\n    if (p->type != PBUF_ROM) {\n      copy_needed = 1;\n      break;\n    }\n    p = p->next;\n  }\n  if (copy_needed) {\n    /* copy the whole packet into new pbufs */\n    p = pbuf_alloc(PBUF_LINK, q->tot_len, PBUF_RAM);\n    while ((p == NULL) && (neighbor_cache[neighbor_index].q != NULL)) {\n      /* Free oldest packet (as per RFC recommendation) */\n#if LWIP_ND6_QUEUEING\n      r = neighbor_cache[neighbor_index].q;\n      neighbor_cache[neighbor_index].q = r->next;\n      r->next = NULL;\n      nd6_free_q(r);\n#else /* LWIP_ND6_QUEUEING */\n      pbuf_free(neighbor_cache[neighbor_index].q);\n      neighbor_cache[neighbor_index].q = NULL;\n#endif /* LWIP_ND6_QUEUEING */\n      p = pbuf_alloc(PBUF_LINK, q->tot_len, PBUF_RAM);\n    }\n    if (p != NULL) {\n      if (pbuf_copy(p, q) != ERR_OK) {\n        pbuf_free(p);\n        p = NULL;\n      }\n    }\n  } else {\n    /* referencing the old pbuf is enough */\n    p = q;\n    pbuf_ref(p);\n  }\n  /* packet was copied/ref'd? */\n  if (p != NULL) {\n    /* queue packet ... */\n#if LWIP_ND6_QUEUEING\n    /* allocate a new nd6 queue entry */\n    new_entry = (struct nd6_q_entry *)memp_malloc(MEMP_ND6_QUEUE);\n    if ((new_entry == NULL) && (neighbor_cache[neighbor_index].q != NULL)) {\n      /* Free oldest packet (as per RFC recommendation) */\n      r = neighbor_cache[neighbor_index].q;\n      neighbor_cache[neighbor_index].q = r->next;\n      r->next = NULL;\n      nd6_free_q(r);\n      new_entry = (struct nd6_q_entry *)memp_malloc(MEMP_ND6_QUEUE);\n    }\n    if (new_entry != NULL) {\n      new_entry->next = NULL;\n      new_entry->p = p;\n      if (neighbor_cache[neighbor_index].q != NULL) {\n        /* queue was already existent, append the new entry to the end */\n        r = neighbor_cache[neighbor_index].q;\n        while (r->next != NULL) {\n          r = r->next;\n        }\n        r->next = new_entry;\n      } else {\n        /* queue did not exist, first item in queue */\n        neighbor_cache[neighbor_index].q = new_entry;\n      }\n      LWIP_DEBUGF(LWIP_DBG_TRACE, (\"ipv6: queued packet %p on neighbor entry %\"S16_F\"\\n\", (void *)p, (s16_t)neighbor_index));\n      result = ERR_OK;\n    } else {\n      /* the pool MEMP_ND6_QUEUE is empty */\n      pbuf_free(p);\n      LWIP_DEBUGF(LWIP_DBG_TRACE, (\"ipv6: could not queue a copy of packet %p (out of memory)\\n\", (void *)p));\n      /* { result == ERR_MEM } through initialization */\n    }\n#else /* LWIP_ND6_QUEUEING */\n    /* Queue a single packet. If an older packet is already queued, free it as per RFC. */\n    if (neighbor_cache[neighbor_index].q != NULL) {\n      pbuf_free(neighbor_cache[neighbor_index].q);\n    }\n    neighbor_cache[neighbor_index].q = p;\n    LWIP_DEBUGF(LWIP_DBG_TRACE, (\"ipv6: queued packet %p on neighbor entry %\"S16_F\"\\n\", (void *)p, (s16_t)neighbor_index));\n    result = ERR_OK;\n#endif /* LWIP_ND6_QUEUEING */\n  } else {\n    LWIP_DEBUGF(LWIP_DBG_TRACE, (\"ipv6: could not queue a copy of packet %p (out of memory)\\n\", (void *)q));\n    /* { result == ERR_MEM } through initialization */\n  }\n\n  return result;\n}\n\n#if LWIP_ND6_QUEUEING\n/**\n * Free a complete queue of nd6 q entries\n *\n * @param q a queue of nd6_q_entry to free\n */\nstatic void\nnd6_free_q(struct nd6_q_entry *q)\n{\n  struct nd6_q_entry *r;\n  LWIP_ASSERT(\"q != NULL\", q != NULL);\n  LWIP_ASSERT(\"q->p != NULL\", q->p != NULL);\n  while (q) {\n    r = q;\n    q = q->next;\n    LWIP_ASSERT(\"r->p != NULL\", (r->p != NULL));\n    pbuf_free(r->p);\n    memp_free(MEMP_ND6_QUEUE, r);\n  }\n}\n#endif /* LWIP_ND6_QUEUEING */\n\n/**\n * Send queued packets for a neighbor\n *\n * @param i the neighbor to send packets to\n */\nstatic void\nnd6_send_q(s8_t i)\n{\n  struct ip6_hdr *ip6hdr;\n  ip6_addr_t dest;\n#if LWIP_ND6_QUEUEING\n  struct nd6_q_entry *q;\n#endif /* LWIP_ND6_QUEUEING */\n\n  if ((i < 0) || (i >= LWIP_ND6_NUM_NEIGHBORS)) {\n    return;\n  }\n\n#if LWIP_ND6_QUEUEING\n  while (neighbor_cache[i].q != NULL) {\n    /* remember first in queue */\n    q = neighbor_cache[i].q;\n    /* pop first item off the queue */\n    neighbor_cache[i].q = q->next;\n    /* Get ipv6 header. */\n    ip6hdr = (struct ip6_hdr *)(q->p->payload);\n    /* Create an aligned copy. */\n    ip6_addr_set(&dest, &(ip6hdr->dest));\n    /* send the queued IPv6 packet */\n    (neighbor_cache[i].netif)->output_ip6(neighbor_cache[i].netif, q->p, &dest);\n    /* free the queued IP packet */\n    pbuf_free(q->p);\n    /* now queue entry can be freed */\n    memp_free(MEMP_ND6_QUEUE, q);\n  }\n#else /* LWIP_ND6_QUEUEING */\n  if (neighbor_cache[i].q != NULL) {\n    /* Get ipv6 header. */\n    ip6hdr = (struct ip6_hdr *)(neighbor_cache[i].q->payload);\n    /* Create an aligned copy. */\n    ip6_addr_set(&dest, &(ip6hdr->dest));\n    /* send the queued IPv6 packet */\n    (neighbor_cache[i].netif)->output_ip6(neighbor_cache[i].netif, neighbor_cache[i].q, &dest);\n    /* free the queued IP packet */\n    pbuf_free(neighbor_cache[i].q);\n    neighbor_cache[i].q = NULL;\n  }\n#endif /* LWIP_ND6_QUEUEING */\n}\n\n/**\n * A packet is to be transmitted to a specific IPv6 destination on a specific\n * interface. Check if we can find the hardware address of the next hop to use\n * for the packet. If so, give the hardware address to the caller, which should\n * use it to send the packet right away. Otherwise, enqueue the packet for\n * later transmission while looking up the hardware address, if possible.\n *\n * As such, this function returns one of three different possible results:\n *\n * - ERR_OK with a non-NULL 'hwaddrp': the caller should send the packet now.\n * - ERR_OK with a NULL 'hwaddrp': the packet has been enqueued for later.\n * - not ERR_OK: something went wrong; forward the error upward in the stack.\n *\n * @param netif The lwIP network interface on which the IP packet will be sent.\n * @param q The pbuf(s) containing the IP packet to be sent.\n * @param ip6addr The destination IPv6 address of the packet.\n * @param hwaddrp On success, filled with a pointer to a HW address or NULL (meaning\n *        the packet has been queued).\n * @return\n * - ERR_OK on success, ERR_RTE if no route was found for the packet,\n * or ERR_MEM if low memory conditions prohibit sending the packet at all.\n */\nerr_t\nnd6_get_next_hop_addr_or_queue(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr, const u8_t **hwaddrp)\n{\n  s8_t i;\n\n  /* Get next hop record. */\n  i = nd6_get_next_hop_entry(ip6addr, netif);\n  if (i < 0) {\n    /* failed to get a next hop neighbor record. */\n    return i;\n  }\n\n  /* Now that we have a destination record, send or queue the packet. */\n  if (neighbor_cache[i].state == ND6_STALE) {\n    /* Switch to delay state. */\n    neighbor_cache[i].state = ND6_DELAY;\n    neighbor_cache[i].counter.delay_time = LWIP_ND6_DELAY_FIRST_PROBE_TIME / ND6_TMR_INTERVAL;\n  }\n  /* @todo should we send or queue if PROBE? send for now, to let unicast NS pass. */\n  if ((neighbor_cache[i].state == ND6_REACHABLE) ||\n      (neighbor_cache[i].state == ND6_DELAY) ||\n      (neighbor_cache[i].state == ND6_PROBE)) {\n\n    /* Tell the caller to send out the packet now. */\n    *hwaddrp = neighbor_cache[i].lladdr;\n    return ERR_OK;\n  }\n\n  /* We should queue packet on this interface. */\n  *hwaddrp = NULL;\n  return nd6_queue_packet(i, q);\n}\n\n\n/**\n * Get the Path MTU for a destination.\n *\n * @param ip6addr the destination address\n * @param netif the netif on which the packet will be sent\n * @return the Path MTU, if known, or the netif default MTU\n */\nu16_t\nnd6_get_destination_mtu(const ip6_addr_t *ip6addr, struct netif *netif)\n{\n  s8_t i;\n\n  i = nd6_find_destination_cache_entry(ip6addr);\n  if (i >= 0) {\n    if (destination_cache[i].pmtu > 0) {\n      return destination_cache[i].pmtu;\n    }\n  }\n\n  if (netif != NULL) {\n    return netif->mtu;\n  }\n\n  return 1280; /* Minimum MTU */\n}\n\n\n#if LWIP_ND6_TCP_REACHABILITY_HINTS\n/**\n * Provide the Neighbor discovery process with a hint that a\n * destination is reachable. Called by tcp_receive when ACKs are\n * received or sent (as per RFC). This is useful to avoid sending\n * NS messages every 30 seconds.\n *\n * @param ip6addr the destination address which is know to be reachable\n *                by an upper layer protocol (TCP)\n */\nvoid\nnd6_reachability_hint(const ip6_addr_t *ip6addr)\n{\n  s8_t i;\n\n  /* Find destination in cache. */\n  if (ip6_addr_cmp(ip6addr, &(destination_cache[nd6_cached_destination_index].destination_addr))) {\n    i = nd6_cached_destination_index;\n    ND6_STATS_INC(nd6.cachehit);\n  } else {\n    i = nd6_find_destination_cache_entry(ip6addr);\n  }\n  if (i < 0) {\n    return;\n  }\n\n  /* Find next hop neighbor in cache. */\n  if (ip6_addr_cmp(&(destination_cache[i].next_hop_addr), &(neighbor_cache[nd6_cached_neighbor_index].next_hop_address))) {\n    i = nd6_cached_neighbor_index;\n    ND6_STATS_INC(nd6.cachehit);\n  } else {\n    i = nd6_find_neighbor_cache_entry(&(destination_cache[i].next_hop_addr));\n  }\n  if (i < 0) {\n    return;\n  }\n\n  /* For safety: don't set as reachable if we don't have a LL address yet. Misuse protection. */\n  if (neighbor_cache[i].state == ND6_INCOMPLETE || neighbor_cache[i].state == ND6_NO_ENTRY) {\n    return;\n  }\n\n  /* Set reachability state. */\n  neighbor_cache[i].state = ND6_REACHABLE;\n  neighbor_cache[i].counter.reachable_time = reachable_time;\n}\n#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */\n\n/**\n * Remove all prefix, neighbor_cache and router entries of the specified netif.\n *\n * @param netif points to a network interface\n */\nvoid\nnd6_cleanup_netif(struct netif *netif)\n{\n  u8_t i;\n  s8_t router_index;\n  for (i = 0; i < LWIP_ND6_NUM_PREFIXES; i++) {\n    if (prefix_list[i].netif == netif) {\n      prefix_list[i].netif = NULL;\n      prefix_list[i].flags = 0;\n    }\n  }\n  for (i = 0; i < LWIP_ND6_NUM_NEIGHBORS; i++) {\n    if (neighbor_cache[i].netif == netif) {\n      for (router_index = 0; router_index < LWIP_ND6_NUM_ROUTERS; router_index++) {\n        if (default_router_list[router_index].neighbor_entry == &neighbor_cache[i]) {\n          default_router_list[router_index].neighbor_entry = NULL;\n          default_router_list[router_index].flags = 0;\n        }\n      }\n      neighbor_cache[i].isrouter = 0;\n      nd6_free_neighbor_cache_entry(i);\n    }\n  }\n}\n\n#if LWIP_IPV6_MLD\n/**\n * The state of a local IPv6 address entry is about to change. If needed, join\n * or leave the solicited-node multicast group for the address.\n *\n * @param netif The netif that owns the address.\n * @param addr_idx The index of the address.\n * @param new_state The new (IP6_ADDR_) state for the address.\n */\nvoid\nnd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state)\n{\n  u8_t old_state, old_member, new_member;\n\n  old_state = netif_ip6_addr_state(netif, addr_idx);\n\n  /* Determine whether we were, and should be, a member of the solicited-node\n   * multicast group for this address. For tentative addresses, the group is\n   * not joined until the address enters the TENTATIVE_1 (or VALID) state. */\n  old_member = (old_state != IP6_ADDR_INVALID && old_state != IP6_ADDR_TENTATIVE);\n  new_member = (new_state != IP6_ADDR_INVALID && new_state != IP6_ADDR_TENTATIVE);\n\n  if (old_member != new_member) {\n    ip6_addr_set_solicitednode(&multicast_address, netif_ip6_addr(netif, addr_idx)->addr[3]);\n\n    if (new_member) {\n      mld6_joingroup_netif(netif, &multicast_address);\n    } else {\n      mld6_leavegroup_netif(netif, &multicast_address);\n    }\n  }\n}\n#endif /* LWIP_IPV6_MLD */\n\n#endif /* LWIP_IPV6 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/mem.c",
    "content": "/**\n * @file\n * Dynamic memory manager\n *\n * This is a lightweight replacement for the standard C library malloc().\n *\n * If you want to use the standard C library malloc() instead, define\n * MEM_LIBC_MALLOC to 1 in your lwipopts.h\n *\n * To let mem_malloc() use pools (prevents fragmentation and is much faster than\n * a heap but might waste some memory), define MEM_USE_POOLS to 1, define\n * MEMP_USE_CUSTOM_POOLS to 1 and create a file \"lwippools.h\" that includes a list\n * of pools like this (more pools can be added between _START and _END):\n *\n * Define three pools with sizes 256, 512, and 1512 bytes\n * LWIP_MALLOC_MEMPOOL_START\n * LWIP_MALLOC_MEMPOOL(20, 256)\n * LWIP_MALLOC_MEMPOOL(10, 512)\n * LWIP_MALLOC_MEMPOOL(5, 1512)\n * LWIP_MALLOC_MEMPOOL_END\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *         Simon Goldschmidt\n *\n */\n\n#include \"lwip/opt.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/def.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/err.h\"\n\n#include <string.h>\n\n#if MEM_LIBC_MALLOC\n#include <stdlib.h> /* for malloc()/free() */\n#endif\n\n#if MEM_LIBC_MALLOC || MEM_USE_POOLS\n\n/** mem_init is not used when using pools instead of a heap or using\n * C library malloc().\n */\nvoid\nmem_init(void)\n{\n}\n\n/** mem_trim is not used when using pools instead of a heap or using\n * C library malloc(): we can't free part of a pool element and the stack\n * support mem_trim() to return a different pointer\n */\nvoid*\nmem_trim(void *mem, mem_size_t size)\n{\n  LWIP_UNUSED_ARG(size);\n  return mem;\n}\n#endif /* MEM_LIBC_MALLOC || MEM_USE_POOLS */\n\n#if MEM_LIBC_MALLOC\n/* lwIP heap implemented using C library malloc() */\n\n/* in case C library malloc() needs extra protection,\n * allow these defines to be overridden.\n */\n#ifndef mem_clib_free\n#define mem_clib_free free\n#endif\n#ifndef mem_clib_malloc\n#define mem_clib_malloc malloc\n#endif\n#ifndef mem_clib_calloc\n#define mem_clib_calloc calloc\n#endif\n\n#if LWIP_STATS && MEM_STATS\n#define MEM_LIBC_STATSHELPER_SIZE LWIP_MEM_ALIGN_SIZE(sizeof(mem_size_t))\n#else\n#define MEM_LIBC_STATSHELPER_SIZE 0\n#endif\n\n/**\n * Allocate a block of memory with a minimum of 'size' bytes.\n *\n * @param size is the minimum size of the requested block in bytes.\n * @return pointer to allocated memory or NULL if no free memory was found.\n *\n * Note that the returned value must always be aligned (as defined by MEM_ALIGNMENT).\n */\nvoid *\nmem_malloc(mem_size_t size)\n{\n  void* ret = mem_clib_malloc(size + MEM_LIBC_STATSHELPER_SIZE);\n  if (ret == NULL) {\n    MEM_STATS_INC(err);\n  } else {\n    LWIP_ASSERT(\"malloc() must return aligned memory\", LWIP_MEM_ALIGN(ret) == ret);\n#if LWIP_STATS && MEM_STATS\n    *(mem_size_t*)ret = size;\n    ret = (u8_t*)ret + MEM_LIBC_STATSHELPER_SIZE;\n    MEM_STATS_INC_USED(used, size);\n#endif\n  }\n  return ret;\n}\n\n/** Put memory back on the heap\n *\n * @param rmem is the pointer as returned by a previous call to mem_malloc()\n */\nvoid\nmem_free(void *rmem)\n{\n  LWIP_ASSERT(\"rmem != NULL\", (rmem != NULL));\n  LWIP_ASSERT(\"rmem == MEM_ALIGN(rmem)\", (rmem == LWIP_MEM_ALIGN(rmem)));\n#if LWIP_STATS && MEM_STATS\n  rmem = (u8_t*)rmem - MEM_LIBC_STATSHELPER_SIZE;\n  MEM_STATS_DEC_USED(used, *(mem_size_t*)rmem);\n#endif\n  mem_clib_free(rmem);\n}\n\n#elif MEM_USE_POOLS\n\n/* lwIP heap implemented with different sized pools */\n\n/**\n * Allocate memory: determine the smallest pool that is big enough\n * to contain an element of 'size' and get an element from that pool.\n *\n * @param size the size in bytes of the memory needed\n * @return a pointer to the allocated memory or NULL if the pool is empty\n */\nvoid *\nmem_malloc(mem_size_t size)\n{\n  void *ret;\n  struct memp_malloc_helper *element = NULL;\n  memp_t poolnr;\n  mem_size_t required_size = size + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper));\n\n  for (poolnr = MEMP_POOL_FIRST; poolnr <= MEMP_POOL_LAST; poolnr = (memp_t)(poolnr + 1)) {\n    /* is this pool big enough to hold an element of the required size\n       plus a struct memp_malloc_helper that saves the pool this element came from? */\n    if (required_size <= memp_pools[poolnr]->size) {\n      element = (struct memp_malloc_helper*)memp_malloc(poolnr);\n      if (element == NULL) {\n        /* No need to DEBUGF or ASSERT: This error is already taken care of in memp.c */\n#if MEM_USE_POOLS_TRY_BIGGER_POOL\n        /** Try a bigger pool if this one is empty! */\n        if (poolnr < MEMP_POOL_LAST) {\n          continue;\n        }\n#endif /* MEM_USE_POOLS_TRY_BIGGER_POOL */\n        MEM_STATS_INC(err);\n        return NULL;\n      }\n      break;\n    }\n  }\n  if (poolnr > MEMP_POOL_LAST) {\n    LWIP_ASSERT(\"mem_malloc(): no pool is that big!\", 0);\n    MEM_STATS_INC(err);\n    return NULL;\n  }\n\n  /* save the pool number this element came from */\n  element->poolnr = poolnr;\n  /* and return a pointer to the memory directly after the struct memp_malloc_helper */\n  ret = (u8_t*)element + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper));\n\n#if MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS)\n  /* truncating to u16_t is safe because struct memp_desc::size is u16_t */\n  element->size = (u16_t)size;\n  MEM_STATS_INC_USED(used, element->size);\n#endif /* MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS) */\n#if MEMP_OVERFLOW_CHECK\n  /* initialize unused memory (diff between requested size and selected pool's size) */\n  memset((u8_t*)ret + size, 0xcd, memp_pools[poolnr]->size - size);\n#endif /* MEMP_OVERFLOW_CHECK */\n  return ret;\n}\n\n/**\n * Free memory previously allocated by mem_malloc. Loads the pool number\n * and calls memp_free with that pool number to put the element back into\n * its pool\n *\n * @param rmem the memory element to free\n */\nvoid\nmem_free(void *rmem)\n{\n  struct memp_malloc_helper *hmem;\n\n  LWIP_ASSERT(\"rmem != NULL\", (rmem != NULL));\n  LWIP_ASSERT(\"rmem == MEM_ALIGN(rmem)\", (rmem == LWIP_MEM_ALIGN(rmem)));\n\n  /* get the original struct memp_malloc_helper */\n  /* cast through void* to get rid of alignment warnings */\n  hmem = (struct memp_malloc_helper*)(void*)((u8_t*)rmem - LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper)));\n\n  LWIP_ASSERT(\"hmem != NULL\", (hmem != NULL));\n  LWIP_ASSERT(\"hmem == MEM_ALIGN(hmem)\", (hmem == LWIP_MEM_ALIGN(hmem)));\n  LWIP_ASSERT(\"hmem->poolnr < MEMP_MAX\", (hmem->poolnr < MEMP_MAX));\n\n  MEM_STATS_DEC_USED(used, hmem->size);\n#if MEMP_OVERFLOW_CHECK\n  {\n     u16_t i;\n     LWIP_ASSERT(\"MEM_USE_POOLS: invalid chunk size\",\n        hmem->size <= memp_pools[hmem->poolnr]->size);\n     /* check that unused memory remained untouched (diff between requested size and selected pool's size) */\n     for (i = hmem->size; i < memp_pools[hmem->poolnr]->size; i++) {\n        u8_t data = *((u8_t*)rmem + i);\n        LWIP_ASSERT(\"MEM_USE_POOLS: mem overflow detected\", data == 0xcd);\n     }\n  }\n#endif /* MEMP_OVERFLOW_CHECK */\n\n  /* and put it in the pool we saved earlier */\n  memp_free(hmem->poolnr, hmem);\n}\n\n#else /* MEM_USE_POOLS */\n/* lwIP replacement for your libc malloc() */\n\n/**\n * The heap is made up as a list of structs of this type.\n * This does not have to be aligned since for getting its size,\n * we only use the macro SIZEOF_STRUCT_MEM, which automatically aligns.\n */\nstruct mem {\n  /** index (-> ram[next]) of the next struct */\n  mem_size_t next;\n  /** index (-> ram[prev]) of the previous struct */\n  mem_size_t prev;\n  /** 1: this area is used; 0: this area is unused */\n  u8_t used;\n};\n\n/** All allocated blocks will be MIN_SIZE bytes big, at least!\n * MIN_SIZE can be overridden to suit your needs. Smaller values save space,\n * larger values could prevent too small blocks to fragment the RAM too much. */\n#ifndef MIN_SIZE\n#define MIN_SIZE             12\n#endif /* MIN_SIZE */\n/* some alignment macros: we define them here for better source code layout */\n#define MIN_SIZE_ALIGNED     LWIP_MEM_ALIGN_SIZE(MIN_SIZE)\n#define SIZEOF_STRUCT_MEM    LWIP_MEM_ALIGN_SIZE(sizeof(struct mem))\n#define MEM_SIZE_ALIGNED     LWIP_MEM_ALIGN_SIZE(MEM_SIZE)\n\n/** If you want to relocate the heap to external memory, simply define\n * LWIP_RAM_HEAP_POINTER as a void-pointer to that location.\n * If so, make sure the memory at that location is big enough (see below on\n * how that space is calculated). */\n#ifndef LWIP_RAM_HEAP_POINTER\n/** the heap. we need one struct mem at the end and some room for alignment */\nLWIP_DECLARE_MEMORY_ALIGNED(ram_heap, MEM_SIZE_ALIGNED + (2U*SIZEOF_STRUCT_MEM));\n#define LWIP_RAM_HEAP_POINTER ram_heap\n#endif /* LWIP_RAM_HEAP_POINTER */\n\n/** pointer to the heap (ram_heap): for alignment, ram is now a pointer instead of an array */\nstatic u8_t *ram;\n/** the last entry, always unused! */\nstatic struct mem *ram_end;\n/** pointer to the lowest free block, this is used for faster search */\nstatic struct mem *lfree;\n\n/** concurrent access protection */\n#if !NO_SYS\nstatic sys_mutex_t mem_mutex;\n#endif\n\n#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT\n\nstatic volatile u8_t mem_free_count;\n\n/* Allow mem_free from other (e.g. interrupt) context */\n#define LWIP_MEM_FREE_DECL_PROTECT()  SYS_ARCH_DECL_PROTECT(lev_free)\n#define LWIP_MEM_FREE_PROTECT()       SYS_ARCH_PROTECT(lev_free)\n#define LWIP_MEM_FREE_UNPROTECT()     SYS_ARCH_UNPROTECT(lev_free)\n#define LWIP_MEM_ALLOC_DECL_PROTECT() SYS_ARCH_DECL_PROTECT(lev_alloc)\n#define LWIP_MEM_ALLOC_PROTECT()      SYS_ARCH_PROTECT(lev_alloc)\n#define LWIP_MEM_ALLOC_UNPROTECT()    SYS_ARCH_UNPROTECT(lev_alloc)\n\n#else /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */\n\n/* Protect the heap only by using a semaphore */\n#define LWIP_MEM_FREE_DECL_PROTECT()\n#define LWIP_MEM_FREE_PROTECT()    sys_mutex_lock(&mem_mutex)\n#define LWIP_MEM_FREE_UNPROTECT()  sys_mutex_unlock(&mem_mutex)\n/* mem_malloc is protected using semaphore AND LWIP_MEM_ALLOC_PROTECT */\n#define LWIP_MEM_ALLOC_DECL_PROTECT()\n#define LWIP_MEM_ALLOC_PROTECT()\n#define LWIP_MEM_ALLOC_UNPROTECT()\n\n#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */\n\n\n/**\n * \"Plug holes\" by combining adjacent empty struct mems.\n * After this function is through, there should not exist\n * one empty struct mem pointing to another empty struct mem.\n *\n * @param mem this points to a struct mem which just has been freed\n * @internal this function is only called by mem_free() and mem_trim()\n *\n * This assumes access to the heap is protected by the calling function\n * already.\n */\nstatic void\nplug_holes(struct mem *mem)\n{\n  struct mem *nmem;\n  struct mem *pmem;\n\n  LWIP_ASSERT(\"plug_holes: mem >= ram\", (u8_t *)mem >= ram);\n  LWIP_ASSERT(\"plug_holes: mem < ram_end\", (u8_t *)mem < (u8_t *)ram_end);\n  LWIP_ASSERT(\"plug_holes: mem->used == 0\", mem->used == 0);\n\n  /* plug hole forward */\n  LWIP_ASSERT(\"plug_holes: mem->next <= MEM_SIZE_ALIGNED\", mem->next <= MEM_SIZE_ALIGNED);\n\n  nmem = (struct mem *)(void *)&ram[mem->next];\n  if (mem != nmem && nmem->used == 0 && (u8_t *)nmem != (u8_t *)ram_end) {\n    /* if mem->next is unused and not end of ram, combine mem and mem->next */\n    if (lfree == nmem) {\n      lfree = mem;\n    }\n    mem->next = nmem->next;\n    ((struct mem *)(void *)&ram[nmem->next])->prev = (mem_size_t)((u8_t *)mem - ram);\n  }\n\n  /* plug hole backward */\n  pmem = (struct mem *)(void *)&ram[mem->prev];\n  if (pmem != mem && pmem->used == 0) {\n    /* if mem->prev is unused, combine mem and mem->prev */\n    if (lfree == mem) {\n      lfree = pmem;\n    }\n    pmem->next = mem->next;\n    ((struct mem *)(void *)&ram[mem->next])->prev = (mem_size_t)((u8_t *)pmem - ram);\n  }\n}\n\n/**\n * Zero the heap and initialize start, end and lowest-free\n */\nvoid\nmem_init(void)\n{\n  struct mem *mem;\n\n  LWIP_ASSERT(\"Sanity check alignment\",\n    (SIZEOF_STRUCT_MEM & (MEM_ALIGNMENT-1)) == 0);\n\n  /* align the heap */\n  ram = (u8_t *)LWIP_MEM_ALIGN(LWIP_RAM_HEAP_POINTER);\n  /* initialize the start of the heap */\n  mem = (struct mem *)(void *)ram;\n  mem->next = MEM_SIZE_ALIGNED;\n  mem->prev = 0;\n  mem->used = 0;\n  /* initialize the end of the heap */\n  ram_end = (struct mem *)(void *)&ram[MEM_SIZE_ALIGNED];\n  ram_end->used = 1;\n  ram_end->next = MEM_SIZE_ALIGNED;\n  ram_end->prev = MEM_SIZE_ALIGNED;\n\n  /* initialize the lowest-free pointer to the start of the heap */\n  lfree = (struct mem *)(void *)ram;\n\n  MEM_STATS_AVAIL(avail, MEM_SIZE_ALIGNED);\n\n  if (sys_mutex_new(&mem_mutex) != ERR_OK) {\n    LWIP_ASSERT(\"failed to create mem_mutex\", 0);\n  }\n}\n\n/**\n * Put a struct mem back on the heap\n *\n * @param rmem is the data portion of a struct mem as returned by a previous\n *             call to mem_malloc()\n */\nvoid\nmem_free(void *rmem)\n{\n  struct mem *mem;\n  LWIP_MEM_FREE_DECL_PROTECT();\n\n  if (rmem == NULL) {\n    LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, (\"mem_free(p == NULL) was called.\\n\"));\n    return;\n  }\n  LWIP_ASSERT(\"mem_free: sanity check alignment\", (((mem_ptr_t)rmem) & (MEM_ALIGNMENT-1)) == 0);\n\n  LWIP_ASSERT(\"mem_free: legal memory\", (u8_t *)rmem >= (u8_t *)ram &&\n    (u8_t *)rmem < (u8_t *)ram_end);\n\n  if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {\n    SYS_ARCH_DECL_PROTECT(lev);\n    LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, (\"mem_free: illegal memory\\n\"));\n    /* protect mem stats from concurrent access */\n    SYS_ARCH_PROTECT(lev);\n    MEM_STATS_INC(illegal);\n    SYS_ARCH_UNPROTECT(lev);\n    return;\n  }\n  /* protect the heap from concurrent access */\n  LWIP_MEM_FREE_PROTECT();\n  /* Get the corresponding struct mem ... */\n  /* cast through void* to get rid of alignment warnings */\n  mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);\n  /* ... which has to be in a used state ... */\n  LWIP_ASSERT(\"mem_free: mem->used\", mem->used);\n  /* ... and is now unused. */\n  mem->used = 0;\n\n  if (mem < lfree) {\n    /* the newly freed struct is now the lowest */\n    lfree = mem;\n  }\n\n  MEM_STATS_DEC_USED(used, mem->next - (mem_size_t)(((u8_t *)mem - ram)));\n\n  /* finally, see if prev or next are free also */\n  plug_holes(mem);\n#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT\n  mem_free_count = 1;\n#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */\n  LWIP_MEM_FREE_UNPROTECT();\n}\n\n/**\n * Shrink memory returned by mem_malloc().\n *\n * @param rmem pointer to memory allocated by mem_malloc the is to be shrinked\n * @param newsize required size after shrinking (needs to be smaller than or\n *                equal to the previous size)\n * @return for compatibility reasons: is always == rmem, at the moment\n *         or NULL if newsize is > old size, in which case rmem is NOT touched\n *         or freed!\n */\nvoid *\nmem_trim(void *rmem, mem_size_t newsize)\n{\n  mem_size_t size;\n  mem_size_t ptr, ptr2;\n  struct mem *mem, *mem2;\n  /* use the FREE_PROTECT here: it protects with sem OR SYS_ARCH_PROTECT */\n  LWIP_MEM_FREE_DECL_PROTECT();\n\n  /* Expand the size of the allocated memory region so that we can\n     adjust for alignment. */\n  newsize = LWIP_MEM_ALIGN_SIZE(newsize);\n\n  if (newsize < MIN_SIZE_ALIGNED) {\n    /* every data block must be at least MIN_SIZE_ALIGNED long */\n    newsize = MIN_SIZE_ALIGNED;\n  }\n\n  if (newsize > MEM_SIZE_ALIGNED) {\n    return NULL;\n  }\n\n  LWIP_ASSERT(\"mem_trim: legal memory\", (u8_t *)rmem >= (u8_t *)ram &&\n   (u8_t *)rmem < (u8_t *)ram_end);\n\n  if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) {\n    SYS_ARCH_DECL_PROTECT(lev);\n    LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SEVERE, (\"mem_trim: illegal memory\\n\"));\n    /* protect mem stats from concurrent access */\n    SYS_ARCH_PROTECT(lev);\n    MEM_STATS_INC(illegal);\n    SYS_ARCH_UNPROTECT(lev);\n    return rmem;\n  }\n  /* Get the corresponding struct mem ... */\n  /* cast through void* to get rid of alignment warnings */\n  mem = (struct mem *)(void *)((u8_t *)rmem - SIZEOF_STRUCT_MEM);\n  /* ... and its offset pointer */\n  ptr = (mem_size_t)((u8_t *)mem - ram);\n\n  size = mem->next - ptr - SIZEOF_STRUCT_MEM;\n  LWIP_ASSERT(\"mem_trim can only shrink memory\", newsize <= size);\n  if (newsize > size) {\n    /* not supported */\n    return NULL;\n  }\n  if (newsize == size) {\n    /* No change in size, simply return */\n    return rmem;\n  }\n\n  /* protect the heap from concurrent access */\n  LWIP_MEM_FREE_PROTECT();\n\n  mem2 = (struct mem *)(void *)&ram[mem->next];\n  if (mem2->used == 0) {\n    /* The next struct is unused, we can simply move it at little */\n    mem_size_t next;\n    /* remember the old next pointer */\n    next = mem2->next;\n    /* create new struct mem which is moved directly after the shrinked mem */\n    ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;\n    if (lfree == mem2) {\n      lfree = (struct mem *)(void *)&ram[ptr2];\n    }\n    mem2 = (struct mem *)(void *)&ram[ptr2];\n    mem2->used = 0;\n    /* restore the next pointer */\n    mem2->next = next;\n    /* link it back to mem */\n    mem2->prev = ptr;\n    /* link mem to it */\n    mem->next = ptr2;\n    /* last thing to restore linked list: as we have moved mem2,\n     * let 'mem2->next->prev' point to mem2 again. but only if mem2->next is not\n     * the end of the heap */\n    if (mem2->next != MEM_SIZE_ALIGNED) {\n      ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;\n    }\n    MEM_STATS_DEC_USED(used, (size - newsize));\n    /* no need to plug holes, we've already done that */\n  } else if (newsize + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED <= size) {\n    /* Next struct is used but there's room for another struct mem with\n     * at least MIN_SIZE_ALIGNED of data.\n     * Old size ('size') must be big enough to contain at least 'newsize' plus a struct mem\n     * ('SIZEOF_STRUCT_MEM') with some data ('MIN_SIZE_ALIGNED').\n     * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty\n     *       region that couldn't hold data, but when mem->next gets freed,\n     *       the 2 regions would be combined, resulting in more free memory */\n    ptr2 = ptr + SIZEOF_STRUCT_MEM + newsize;\n    mem2 = (struct mem *)(void *)&ram[ptr2];\n    if (mem2 < lfree) {\n      lfree = mem2;\n    }\n    mem2->used = 0;\n    mem2->next = mem->next;\n    mem2->prev = ptr;\n    mem->next = ptr2;\n    if (mem2->next != MEM_SIZE_ALIGNED) {\n      ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;\n    }\n    MEM_STATS_DEC_USED(used, (size - newsize));\n    /* the original mem->next is used, so no need to plug holes! */\n  }\n  /* else {\n    next struct mem is used but size between mem and mem2 is not big enough\n    to create another struct mem\n    -> don't do anyhting.\n    -> the remaining space stays unused since it is too small\n  } */\n#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT\n  mem_free_count = 1;\n#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */\n  LWIP_MEM_FREE_UNPROTECT();\n  return rmem;\n}\n\n/**\n * Allocate a block of memory with a minimum of 'size' bytes.\n *\n * @param size is the minimum size of the requested block in bytes.\n * @return pointer to allocated memory or NULL if no free memory was found.\n *\n * Note that the returned value will always be aligned (as defined by MEM_ALIGNMENT).\n */\nvoid *\nmem_malloc(mem_size_t size)\n{\n  mem_size_t ptr, ptr2;\n  struct mem *mem, *mem2;\n#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT\n  u8_t local_mem_free_count = 0;\n#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */\n  LWIP_MEM_ALLOC_DECL_PROTECT();\n\n  if (size == 0) {\n    return NULL;\n  }\n\n  /* Expand the size of the allocated memory region so that we can\n     adjust for alignment. */\n  size = LWIP_MEM_ALIGN_SIZE(size);\n\n  if (size < MIN_SIZE_ALIGNED) {\n    /* every data block must be at least MIN_SIZE_ALIGNED long */\n    size = MIN_SIZE_ALIGNED;\n  }\n\n  if (size > MEM_SIZE_ALIGNED) {\n    return NULL;\n  }\n\n  /* protect the heap from concurrent access */\n  sys_mutex_lock(&mem_mutex);\n  LWIP_MEM_ALLOC_PROTECT();\n#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT\n  /* run as long as a mem_free disturbed mem_malloc or mem_trim */\n  do {\n    local_mem_free_count = 0;\n#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */\n\n    /* Scan through the heap searching for a free block that is big enough,\n     * beginning with the lowest free block.\n     */\n    for (ptr = (mem_size_t)((u8_t *)lfree - ram); ptr < MEM_SIZE_ALIGNED - size;\n         ptr = ((struct mem *)(void *)&ram[ptr])->next) {\n      mem = (struct mem *)(void *)&ram[ptr];\n#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT\n      mem_free_count = 0;\n      LWIP_MEM_ALLOC_UNPROTECT();\n      /* allow mem_free or mem_trim to run */\n      LWIP_MEM_ALLOC_PROTECT();\n      if (mem_free_count != 0) {\n        /* If mem_free or mem_trim have run, we have to restart since they\n           could have altered our current struct mem. */\n        local_mem_free_count = 1;\n        break;\n      }\n#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */\n\n      if ((!mem->used) &&\n          (mem->next - (ptr + SIZEOF_STRUCT_MEM)) >= size) {\n        /* mem is not used and at least perfect fit is possible:\n         * mem->next - (ptr + SIZEOF_STRUCT_MEM) gives us the 'user data size' of mem */\n\n        if (mem->next - (ptr + SIZEOF_STRUCT_MEM) >= (size + SIZEOF_STRUCT_MEM + MIN_SIZE_ALIGNED)) {\n          /* (in addition to the above, we test if another struct mem (SIZEOF_STRUCT_MEM) containing\n           * at least MIN_SIZE_ALIGNED of data also fits in the 'user data space' of 'mem')\n           * -> split large block, create empty remainder,\n           * remainder must be large enough to contain MIN_SIZE_ALIGNED data: if\n           * mem->next - (ptr + (2*SIZEOF_STRUCT_MEM)) == size,\n           * struct mem would fit in but no data between mem2 and mem2->next\n           * @todo we could leave out MIN_SIZE_ALIGNED. We would create an empty\n           *       region that couldn't hold data, but when mem->next gets freed,\n           *       the 2 regions would be combined, resulting in more free memory\n           */\n          ptr2 = ptr + SIZEOF_STRUCT_MEM + size;\n          /* create mem2 struct */\n          mem2 = (struct mem *)(void *)&ram[ptr2];\n          mem2->used = 0;\n          mem2->next = mem->next;\n          mem2->prev = ptr;\n          /* and insert it between mem and mem->next */\n          mem->next = ptr2;\n          mem->used = 1;\n\n          if (mem2->next != MEM_SIZE_ALIGNED) {\n            ((struct mem *)(void *)&ram[mem2->next])->prev = ptr2;\n          }\n          MEM_STATS_INC_USED(used, (size + SIZEOF_STRUCT_MEM));\n        } else {\n          /* (a mem2 struct does no fit into the user data space of mem and mem->next will always\n           * be used at this point: if not we have 2 unused structs in a row, plug_holes should have\n           * take care of this).\n           * -> near fit or exact fit: do not split, no mem2 creation\n           * also can't move mem->next directly behind mem, since mem->next\n           * will always be used at this point!\n           */\n          mem->used = 1;\n          MEM_STATS_INC_USED(used, mem->next - (mem_size_t)((u8_t *)mem - ram));\n        }\n#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT\nmem_malloc_adjust_lfree:\n#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */\n        if (mem == lfree) {\n          struct mem *cur = lfree;\n          /* Find next free block after mem and update lowest free pointer */\n          while (cur->used && cur != ram_end) {\n#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT\n            mem_free_count = 0;\n            LWIP_MEM_ALLOC_UNPROTECT();\n            /* prevent high interrupt latency... */\n            LWIP_MEM_ALLOC_PROTECT();\n            if (mem_free_count != 0) {\n              /* If mem_free or mem_trim have run, we have to restart since they\n                 could have altered our current struct mem or lfree. */\n              goto mem_malloc_adjust_lfree;\n            }\n#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */\n            cur = (struct mem *)(void *)&ram[cur->next];\n          }\n          lfree = cur;\n          LWIP_ASSERT(\"mem_malloc: !lfree->used\", ((lfree == ram_end) || (!lfree->used)));\n        }\n        LWIP_MEM_ALLOC_UNPROTECT();\n        sys_mutex_unlock(&mem_mutex);\n        LWIP_ASSERT(\"mem_malloc: allocated memory not above ram_end.\",\n         (mem_ptr_t)mem + SIZEOF_STRUCT_MEM + size <= (mem_ptr_t)ram_end);\n        LWIP_ASSERT(\"mem_malloc: allocated memory properly aligned.\",\n         ((mem_ptr_t)mem + SIZEOF_STRUCT_MEM) % MEM_ALIGNMENT == 0);\n        LWIP_ASSERT(\"mem_malloc: sanity check alignment\",\n          (((mem_ptr_t)mem) & (MEM_ALIGNMENT-1)) == 0);\n\n        return (u8_t *)mem + SIZEOF_STRUCT_MEM;\n      }\n    }\n#if LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT\n    /* if we got interrupted by a mem_free, try again */\n  } while (local_mem_free_count != 0);\n#endif /* LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT */\n  LWIP_DEBUGF(MEM_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"mem_malloc: could not allocate %\"S16_F\" bytes\\n\", (s16_t)size));\n  MEM_STATS_INC(err);\n  LWIP_MEM_ALLOC_UNPROTECT();\n  sys_mutex_unlock(&mem_mutex);\n  return NULL;\n}\n\n#endif /* MEM_USE_POOLS */\n\n#if MEM_LIBC_MALLOC && (!LWIP_STATS || !MEM_STATS)\nvoid *\nmem_calloc(mem_size_t count, mem_size_t size)\n{\n  return mem_clib_calloc(count, size);\n}\n\n#else /* MEM_LIBC_MALLOC && (!LWIP_STATS || !MEM_STATS) */\n/**\n * Contiguously allocates enough space for count objects that are size bytes\n * of memory each and returns a pointer to the allocated memory.\n *\n * The allocated memory is filled with bytes of value zero.\n *\n * @param count number of objects to allocate\n * @param size size of the objects to allocate\n * @return pointer to allocated memory / NULL pointer if there is an error\n */\nvoid *\nmem_calloc(mem_size_t count, mem_size_t size)\n{\n  void *p;\n\n  /* allocate 'count' objects of size 'size' */\n  p = mem_malloc(count * size);\n  if (p) {\n    /* zero the memory */\n    memset(p, 0, (size_t)count * (size_t)size);\n  }\n  return p;\n}\n#endif /* MEM_LIBC_MALLOC && (!LWIP_STATS || !MEM_STATS) */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/memp.c",
    "content": "/**\n * @file\n * Dynamic pool memory manager\n *\n * lwIP has dedicated pools for many structures (netconn, protocol control blocks,\n * packet buffers, ...). All these pools are managed here.\n *\n * @defgroup mempool Memory pools\n * @ingroup infrastructure\n * Custom memory pools\n\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#include \"lwip/memp.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/stats.h\"\n\n#include <string.h>\n\n/* Make sure we include everything we need for size calculation required by memp_std.h */\n#include \"lwip/pbuf.h\"\n#include \"lwip/raw.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/tcp.h\"\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/ip4_frag.h\"\n#include \"lwip/netbuf.h\"\n#include \"lwip/api.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n#include \"lwip/priv/api_msg.h\"\n#include \"lwip/sockets.h\"\n#include \"lwip/netifapi.h\"\n#include \"lwip/etharp.h\"\n#include \"lwip/igmp.h\"\n#include \"lwip/timeouts.h\"\n/* needed by default MEMP_NUM_SYS_TIMEOUT */\n#include \"netif/ppp/ppp_opts.h\"\n#include \"lwip/netdb.h\"\n#include \"lwip/dns.h\"\n#include \"lwip/priv/nd6_priv.h\"\n#include \"lwip/ip6_frag.h\"\n#include \"lwip/mld6.h\"\n\n#define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEMPOOL_DECLARE(name,num,size,desc)\n#include \"lwip/priv/memp_std.h\"\n\nconst struct memp_desc* const memp_pools[MEMP_MAX] = {\n#define LWIP_MEMPOOL(name,num,size,desc) &memp_ ## name,\n#include \"lwip/priv/memp_std.h\"\n};\n\n#ifdef LWIP_HOOK_FILENAME\n#include LWIP_HOOK_FILENAME\n#endif\n\n#if MEMP_MEM_MALLOC && MEMP_OVERFLOW_CHECK >= 2\n#undef MEMP_OVERFLOW_CHECK\n/* MEMP_OVERFLOW_CHECK >= 2 does not work with MEMP_MEM_MALLOC, use 1 instead */\n#define MEMP_OVERFLOW_CHECK 1\n#endif\n\n#if MEMP_SANITY_CHECK && !MEMP_MEM_MALLOC\n/**\n * Check that memp-lists don't form a circle, using \"Floyd's cycle-finding algorithm\".\n */\nstatic int\nmemp_sanity(const struct memp_desc *desc)\n{\n  struct memp *t, *h;\n\n  t = *desc->tab;\n  if (t != NULL) {\n    for (h = t->next; (t != NULL) && (h != NULL); t = t->next,\n      h = ((h->next != NULL) ? h->next->next : NULL)) {\n      if (t == h) {\n        return 0;\n      }\n    }\n  }\n\n  return 1;\n}\n#endif /* MEMP_SANITY_CHECK && !MEMP_MEM_MALLOC */\n\n#if MEMP_OVERFLOW_CHECK\n/**\n * Check if a memp element was victim of an overflow\n * (e.g. the restricted area after it has been altered)\n *\n * @param p the memp element to check\n * @param desc the pool p comes from\n */\nstatic void\nmemp_overflow_check_element_overflow(struct memp *p, const struct memp_desc *desc)\n{\n#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0\n  u16_t k;\n  u8_t *m;\n  m = (u8_t*)p + MEMP_SIZE + desc->size;\n  for (k = 0; k < MEMP_SANITY_REGION_AFTER_ALIGNED; k++) {\n    if (m[k] != 0xcd) {\n      char errstr[128] = \"detected memp overflow in pool \";\n      strcat(errstr, desc->desc);\n      LWIP_ASSERT(errstr, 0);\n    }\n  }\n#else /* MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */\n  LWIP_UNUSED_ARG(p);\n  LWIP_UNUSED_ARG(desc);\n#endif /* MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */\n}\n\n/**\n * Check if a memp element was victim of an underflow\n * (e.g. the restricted area before it has been altered)\n *\n * @param p the memp element to check\n * @param desc the pool p comes from\n */\nstatic void\nmemp_overflow_check_element_underflow(struct memp *p, const struct memp_desc *desc)\n{\n#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0\n  u16_t k;\n  u8_t *m;\n  m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED;\n  for (k = 0; k < MEMP_SANITY_REGION_BEFORE_ALIGNED; k++) {\n    if (m[k] != 0xcd) {\n      char errstr[128] = \"detected memp underflow in pool \";\n      strcat(errstr, desc->desc);\n      LWIP_ASSERT(errstr, 0);\n    }\n  }\n#else /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 */\n  LWIP_UNUSED_ARG(p);\n  LWIP_UNUSED_ARG(desc);\n#endif /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 */\n}\n\n/**\n * Initialize the restricted area of on memp element.\n */\nstatic void\nmemp_overflow_init_element(struct memp *p, const struct memp_desc *desc)\n{\n#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 || MEMP_SANITY_REGION_AFTER_ALIGNED > 0\n  u8_t *m;\n#if MEMP_SANITY_REGION_BEFORE_ALIGNED > 0\n  m = (u8_t*)p + MEMP_SIZE - MEMP_SANITY_REGION_BEFORE_ALIGNED;\n  memset(m, 0xcd, MEMP_SANITY_REGION_BEFORE_ALIGNED);\n#endif\n#if MEMP_SANITY_REGION_AFTER_ALIGNED > 0\n  m = (u8_t*)p + MEMP_SIZE + desc->size;\n  memset(m, 0xcd, MEMP_SANITY_REGION_AFTER_ALIGNED);\n#endif\n#else /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 || MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */\n  LWIP_UNUSED_ARG(p);\n  LWIP_UNUSED_ARG(desc);\n#endif /* MEMP_SANITY_REGION_BEFORE_ALIGNED > 0 || MEMP_SANITY_REGION_AFTER_ALIGNED > 0 */\n}\n\n#if MEMP_OVERFLOW_CHECK >= 2\n/**\n * Do an overflow check for all elements in every pool.\n *\n * @see memp_overflow_check_element for a description of the check\n */\nstatic void\nmemp_overflow_check_all(void)\n{\n  u16_t i, j;\n  struct memp *p;\n  SYS_ARCH_DECL_PROTECT(old_level);\n  SYS_ARCH_PROTECT(old_level);\n\n  for (i = 0; i < MEMP_MAX; ++i) {\n    p = (struct memp*)LWIP_MEM_ALIGN(memp_pools[i]->base);\n    for (j = 0; j < memp_pools[i]->num; ++j) {\n      memp_overflow_check_element_overflow(p, memp_pools[i]);\n      memp_overflow_check_element_underflow(p, memp_pools[i]);\n      p = LWIP_ALIGNMENT_CAST(struct memp*, ((u8_t*)p + MEMP_SIZE + memp_pools[i]->size + MEMP_SANITY_REGION_AFTER_ALIGNED));\n    }\n  }\n  SYS_ARCH_UNPROTECT(old_level);\n}\n#endif /* MEMP_OVERFLOW_CHECK >= 2 */\n#endif /* MEMP_OVERFLOW_CHECK */\n\n/**\n * Initialize custom memory pool.\n * Related functions: memp_malloc_pool, memp_free_pool\n *\n * @param desc pool to initialize\n */\nvoid\nmemp_init_pool(const struct memp_desc *desc)\n{\n#if MEMP_MEM_MALLOC\n  LWIP_UNUSED_ARG(desc);\n#else\n  int i;\n  struct memp *memp;\n\n  *desc->tab = NULL;\n  memp = (struct memp*)LWIP_MEM_ALIGN(desc->base);\n  /* create a linked list of memp elements */\n  for (i = 0; i < desc->num; ++i) {\n    memp->next = *desc->tab;\n    *desc->tab = memp;\n#if MEMP_OVERFLOW_CHECK\n    memp_overflow_init_element(memp, desc);\n#endif /* MEMP_OVERFLOW_CHECK */\n   /* cast through void* to get rid of alignment warnings */\n   memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size\n#if MEMP_OVERFLOW_CHECK\n      + MEMP_SANITY_REGION_AFTER_ALIGNED\n#endif\n    );\n  }\n#if MEMP_STATS\n  desc->stats->avail = desc->num;\n#endif /* MEMP_STATS */\n#endif /* !MEMP_MEM_MALLOC */\n\n#if MEMP_STATS && (defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY)\n  desc->stats->name  = desc->desc;\n#endif /* MEMP_STATS && (defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY) */\n}\n\n/**\n * Initializes lwIP built-in pools.\n * Related functions: memp_malloc, memp_free\n *\n * Carves out memp_memory into linked lists for each pool-type.\n */\nvoid\nmemp_init(void)\n{\n  u16_t i;\n\n  /* for every pool: */\n  for (i = 0; i < LWIP_ARRAYSIZE(memp_pools); i++) {\n    memp_init_pool(memp_pools[i]);\n\n#if LWIP_STATS && MEMP_STATS\n    lwip_stats.memp[i] = memp_pools[i]->stats;\n#endif\n  }\n\n#if MEMP_OVERFLOW_CHECK >= 2\n  /* check everything a first time to see if it worked */\n  memp_overflow_check_all();\n#endif /* MEMP_OVERFLOW_CHECK >= 2 */\n}\n\nstatic void*\n#if !MEMP_OVERFLOW_CHECK\ndo_memp_malloc_pool(const struct memp_desc *desc)\n#else\ndo_memp_malloc_pool_fn(const struct memp_desc *desc, const char* file, const int line)\n#endif\n{\n  struct memp *memp;\n  SYS_ARCH_DECL_PROTECT(old_level);\n\n#if MEMP_MEM_MALLOC\n  memp = (struct memp *)mem_malloc(MEMP_SIZE + MEMP_ALIGN_SIZE(desc->size));\n  SYS_ARCH_PROTECT(old_level);\n#else /* MEMP_MEM_MALLOC */\n  SYS_ARCH_PROTECT(old_level);\n\n  memp = *desc->tab;\n#endif /* MEMP_MEM_MALLOC */\n\n  if (memp != NULL) {\n#if !MEMP_MEM_MALLOC\n#if MEMP_OVERFLOW_CHECK == 1\n    memp_overflow_check_element_overflow(memp, desc);\n    memp_overflow_check_element_underflow(memp, desc);\n#endif /* MEMP_OVERFLOW_CHECK */\n\n    *desc->tab = memp->next;\n#if MEMP_OVERFLOW_CHECK\n    memp->next = NULL;\n#endif /* MEMP_OVERFLOW_CHECK */\n#endif /* !MEMP_MEM_MALLOC */\n#if MEMP_OVERFLOW_CHECK\n    memp->file = file;\n    memp->line = line;\n#if MEMP_MEM_MALLOC\n    memp_overflow_init_element(memp, desc);\n#endif /* MEMP_MEM_MALLOC */\n#endif /* MEMP_OVERFLOW_CHECK */\n    LWIP_ASSERT(\"memp_malloc: memp properly aligned\",\n                ((mem_ptr_t)memp % MEM_ALIGNMENT) == 0);\n#if MEMP_STATS\n    desc->stats->used++;\n    if (desc->stats->used > desc->stats->max) {\n      desc->stats->max = desc->stats->used;\n    }\n#endif\n    SYS_ARCH_UNPROTECT(old_level);\n    /* cast through u8_t* to get rid of alignment warnings */\n    return ((u8_t*)memp + MEMP_SIZE);\n  } else {\n    LWIP_DEBUGF(MEMP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"memp_malloc: out of memory in pool %s\\n\", desc->desc));\n#if MEMP_STATS\n    desc->stats->err++;\n#endif\n  }\n\n  SYS_ARCH_UNPROTECT(old_level);\n  return NULL;\n}\n\n/**\n * Get an element from a custom pool.\n *\n * @param desc the pool to get an element from\n *\n * @return a pointer to the allocated memory or a NULL pointer on error\n */\nvoid *\n#if !MEMP_OVERFLOW_CHECK\nmemp_malloc_pool(const struct memp_desc *desc)\n#else\nmemp_malloc_pool_fn(const struct memp_desc *desc, const char* file, const int line)\n#endif\n{\n  LWIP_ASSERT(\"invalid pool desc\", desc != NULL);\n  if (desc == NULL) {\n    return NULL;\n  }\n\n#if !MEMP_OVERFLOW_CHECK\n  return do_memp_malloc_pool(desc);\n#else\n  return do_memp_malloc_pool_fn(desc, file, line);\n#endif\n}\n\n/**\n * Get an element from a specific pool.\n *\n * @param type the pool to get an element from\n *\n * @return a pointer to the allocated memory or a NULL pointer on error\n */\nvoid *\n#if !MEMP_OVERFLOW_CHECK\nmemp_malloc(memp_t type)\n#else\nmemp_malloc_fn(memp_t type, const char* file, const int line)\n#endif\n{\n  void *memp;\n  LWIP_ERROR(\"memp_malloc: type < MEMP_MAX\", (type < MEMP_MAX), return NULL;);\n\n#if MEMP_OVERFLOW_CHECK >= 2\n  memp_overflow_check_all();\n#endif /* MEMP_OVERFLOW_CHECK >= 2 */\n\n#if !MEMP_OVERFLOW_CHECK\n  memp = do_memp_malloc_pool(memp_pools[type]);\n#else\n  memp = do_memp_malloc_pool_fn(memp_pools[type], file, line);\n#endif\n\n  return memp;\n}\n\nstatic void\ndo_memp_free_pool(const struct memp_desc* desc, void *mem)\n{\n  struct memp *memp;\n  SYS_ARCH_DECL_PROTECT(old_level);\n\n  LWIP_ASSERT(\"memp_free: mem properly aligned\",\n                ((mem_ptr_t)mem % MEM_ALIGNMENT) == 0);\n\n  /* cast through void* to get rid of alignment warnings */\n  memp = (struct memp *)(void *)((u8_t*)mem - MEMP_SIZE);\n\n  SYS_ARCH_PROTECT(old_level);\n\n#if MEMP_OVERFLOW_CHECK == 1\n  memp_overflow_check_element_overflow(memp, desc);\n  memp_overflow_check_element_underflow(memp, desc);\n#endif /* MEMP_OVERFLOW_CHECK */\n\n#if MEMP_STATS\n  desc->stats->used--;\n#endif\n\n#if MEMP_MEM_MALLOC\n  LWIP_UNUSED_ARG(desc);\n  SYS_ARCH_UNPROTECT(old_level);\n  mem_free(memp);\n#else /* MEMP_MEM_MALLOC */\n  memp->next = *desc->tab;\n  *desc->tab = memp;\n\n#if MEMP_SANITY_CHECK\n  LWIP_ASSERT(\"memp sanity\", memp_sanity(desc));\n#endif /* MEMP_SANITY_CHECK */\n\n  SYS_ARCH_UNPROTECT(old_level);\n#endif /* !MEMP_MEM_MALLOC */\n}\n\n/**\n * Put a custom pool element back into its pool.\n *\n * @param desc the pool where to put mem\n * @param mem the memp element to free\n */\nvoid\nmemp_free_pool(const struct memp_desc* desc, void *mem)\n{\n  LWIP_ASSERT(\"invalid pool desc\", desc != NULL);\n  if ((desc == NULL) || (mem == NULL)) {\n    return;\n  }\n\n  do_memp_free_pool(desc, mem);\n}\n\n/**\n * Put an element back into its pool.\n *\n * @param type the pool where to put mem\n * @param mem the memp element to free\n */\nvoid\nmemp_free(memp_t type, void *mem)\n{\n#ifdef LWIP_HOOK_MEMP_AVAILABLE\n  struct memp *old_first;\n#endif\n\n  LWIP_ERROR(\"memp_free: type < MEMP_MAX\", (type < MEMP_MAX), return;);\n\n  if (mem == NULL) {\n    return;\n  }\n\n#if MEMP_OVERFLOW_CHECK >= 2\n  memp_overflow_check_all();\n#endif /* MEMP_OVERFLOW_CHECK >= 2 */\n\n#ifdef LWIP_HOOK_MEMP_AVAILABLE\n  old_first = *memp_pools[type]->tab;\n#endif\n\n  do_memp_free_pool(memp_pools[type], mem);\n\n#ifdef LWIP_HOOK_MEMP_AVAILABLE\n  if (old_first == NULL) {\n    LWIP_HOOK_MEMP_AVAILABLE(type);\n  }\n#endif\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/netif.c",
    "content": "/**\n * @file\n * lwIP network interface abstraction\n * \n * @defgroup netif Network interface (NETIF)\n * @ingroup callbackstyle_api\n * \n * @defgroup netif_ip4 IPv4 address handling\n * @ingroup netif\n * \n * @defgroup netif_ip6 IPv6 address handling\n * @ingroup netif\n * \n * @defgroup netif_cd Client data handling\n * Store data (void*) on a netif for application usage.\n * @see @ref LWIP_NUM_NETIF_CLIENT_DATA\n * @ingroup netif\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n */\n\n#include \"lwip/opt.h\"\n\n#include <string.h>\n\n#include \"lwip/def.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/raw.h\"\n#include \"lwip/snmp.h\"\n#include \"lwip/igmp.h\"\n#include \"lwip/etharp.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/ip.h\"\n#if ENABLE_LOOPBACK\n#if LWIP_NETIF_LOOPBACK_MULTITHREADING\n#include \"lwip/tcpip.h\"\n#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */\n#endif /* ENABLE_LOOPBACK */\n\n#include \"netif/ethernet.h\"\n\n#if LWIP_AUTOIP\n#include \"lwip/autoip.h\"\n#endif /* LWIP_AUTOIP */\n#if LWIP_DHCP\n#include \"lwip/dhcp.h\"\n#endif /* LWIP_DHCP */\n#if LWIP_IPV6_DHCP6\n#include \"lwip/dhcp6.h\"\n#endif /* LWIP_IPV6_DHCP6 */\n#if LWIP_IPV6_MLD\n#include \"lwip/mld6.h\"\n#endif /* LWIP_IPV6_MLD */\n#if LWIP_IPV6\n#include \"lwip/nd6.h\"\n#endif\n\n#if LWIP_NETIF_STATUS_CALLBACK\n#define NETIF_STATUS_CALLBACK(n) do{ if (n->status_callback) { (n->status_callback)(n); }}while(0)\n#else\n#define NETIF_STATUS_CALLBACK(n)\n#endif /* LWIP_NETIF_STATUS_CALLBACK */\n\n#if LWIP_NETIF_LINK_CALLBACK\n#define NETIF_LINK_CALLBACK(n) do{ if (n->link_callback) { (n->link_callback)(n); }}while(0)\n#else\n#define NETIF_LINK_CALLBACK(n)\n#endif /* LWIP_NETIF_LINK_CALLBACK */\n\nstruct netif *netif_list;\nstruct netif *netif_default;\n\nstatic u8_t netif_num;\n\n#if LWIP_NUM_NETIF_CLIENT_DATA > 0\nstatic u8_t netif_client_id;\n#endif\n\n#define NETIF_REPORT_TYPE_IPV4  0x01\n#define NETIF_REPORT_TYPE_IPV6  0x02\nstatic void netif_issue_reports(struct netif* netif, u8_t report_type);\n\n#if LWIP_IPV6\nstatic err_t netif_null_output_ip6(struct netif *netif, struct pbuf *p, const ip6_addr_t *ipaddr);\n#endif /* LWIP_IPV6 */\n\n#if LWIP_HAVE_LOOPIF\n#if LWIP_IPV4\nstatic err_t netif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t* addr);\n#endif\n#if LWIP_IPV6\nstatic err_t netif_loop_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t* addr);\n#endif\n\n\nstatic struct netif loop_netif;\n\n/**\n * Initialize a lwip network interface structure for a loopback interface\n *\n * @param netif the lwip network interface structure for this loopif\n * @return ERR_OK if the loopif is initialized\n *         ERR_MEM if private data couldn't be allocated\n */\nstatic err_t\nnetif_loopif_init(struct netif *netif)\n{\n  /* initialize the snmp variables and counters inside the struct netif\n   * ifSpeed: no assumption can be made!\n   */\n  MIB2_INIT_NETIF(netif, snmp_ifType_softwareLoopback, 0);\n\n  netif->name[0] = 'l';\n  netif->name[1] = 'o';\n#if LWIP_IPV4\n  netif->output = netif_loop_output_ipv4;\n#endif\n#if LWIP_IPV6\n  netif->output_ip6 = netif_loop_output_ipv6;\n#endif\n#if LWIP_LOOPIF_MULTICAST\n  netif->flags |= NETIF_FLAG_IGMP;\n#endif\n  return ERR_OK;\n}\n#endif /* LWIP_HAVE_LOOPIF */\n\nvoid\nnetif_init(void)\n{\n#if LWIP_HAVE_LOOPIF\n#if LWIP_IPV4\n#define LOOPIF_ADDRINIT &loop_ipaddr, &loop_netmask, &loop_gw,\n  ip4_addr_t loop_ipaddr, loop_netmask, loop_gw;\n  IP4_ADDR(&loop_gw, 127,0,0,1);\n  IP4_ADDR(&loop_ipaddr, 127,0,0,1);\n  IP4_ADDR(&loop_netmask, 255,0,0,0);\n#else /* LWIP_IPV4 */\n#define LOOPIF_ADDRINIT\n#endif /* LWIP_IPV4 */\n\n#if NO_SYS\n  netif_add(&loop_netif, LOOPIF_ADDRINIT NULL, netif_loopif_init, ip_input);\n#else  /* NO_SYS */\n  netif_add(&loop_netif, LOOPIF_ADDRINIT NULL, netif_loopif_init, tcpip_input);\n#endif /* NO_SYS */\n\n#if LWIP_IPV6\n  IP_ADDR6_HOST(loop_netif.ip6_addr, 0, 0, 0, 0x00000001UL);\n  loop_netif.ip6_addr_state[0] = IP6_ADDR_VALID;\n#endif /* LWIP_IPV6 */\n\n  netif_set_link_up(&loop_netif);\n  netif_set_up(&loop_netif);\n\n#endif /* LWIP_HAVE_LOOPIF */\n}\n\n/**\n * @ingroup lwip_nosys\n * Forwards a received packet for input processing with\n * ethernet_input() or ip_input() depending on netif flags.\n * Don't call directly, pass to netif_add() and call\n * netif->input().\n * Only works if the netif driver correctly sets \n * NETIF_FLAG_ETHARP and/or NETIF_FLAG_ETHERNET flag!\n */\nerr_t\nnetif_input(struct pbuf *p, struct netif *inp)\n{\n#if LWIP_ETHERNET\n  if (inp->flags & (NETIF_FLAG_ETHARP | NETIF_FLAG_ETHERNET)) {\n    return ethernet_input(p, inp);\n  } else\n#endif /* LWIP_ETHERNET */\n  return ip_input(p, inp);\n}\n\n/**\n * @ingroup netif\n * Add a network interface to the list of lwIP netifs.\n *\n * @param netif a pre-allocated netif structure\n * @param ipaddr IP address for the new netif\n * @param netmask network mask for the new netif\n * @param gw default gateway IP address for the new netif\n * @param state opaque data passed to the new netif\n * @param init callback function that initializes the interface\n * @param input callback function that is called to pass\n * ingress packets up in the protocol layer stack.\\n\n * It is recommended to use a function that passes the input directly\n * to the stack (netif_input(), NO_SYS=1 mode) or via sending a\n * message to TCPIP thread (tcpip_input(), NO_SYS=0 mode).\\n\n * These functions use netif flags NETIF_FLAG_ETHARP and NETIF_FLAG_ETHERNET\n * to decide whether to forward to ethernet_input() or ip_input().\n * In other words, the functions only work when the netif\n * driver is implemented correctly!\\n\n * Most members of struct netif should be be initialized by the \n * netif init function = netif driver (init parameter of this function).\\n\n * IPv6: Don't forget to call netif_create_ip6_linklocal_address() after\n * setting the MAC address in struct netif.hwaddr\n * (IPv6 requires a link-local address).\n * \n * @return netif, or NULL if failed.\n */\nstruct netif *\nnetif_add(struct netif *netif,\n#if LWIP_IPV4\n          const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,\n#endif /* LWIP_IPV4 */\n          void *state, netif_init_fn init, netif_input_fn input)\n{\n#if LWIP_IPV6\n  s8_t i;\n#endif\n\n  LWIP_ASSERT(\"No init function given\", init != NULL);\n\n  /* reset new interface configuration state */\n#if LWIP_IPV4\n  ip_addr_set_zero_ip4(&netif->ip_addr);\n  ip_addr_set_zero_ip4(&netif->netmask);\n  ip_addr_set_zero_ip4(&netif->gw);\n#endif /* LWIP_IPV4 */\n#if LWIP_IPV6\n  for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n    ip_addr_set_zero_ip6(&netif->ip6_addr[i]);\n    netif->ip6_addr_state[i] = IP6_ADDR_INVALID;\n  }\n  netif->output_ip6 = netif_null_output_ip6;\n#endif /* LWIP_IPV6 */\n  NETIF_SET_CHECKSUM_CTRL(netif, NETIF_CHECKSUM_ENABLE_ALL);\n  netif->flags = 0;\n#ifdef netif_get_client_data\n  memset(netif->client_data, 0, sizeof(netif->client_data));\n#endif /* LWIP_NUM_NETIF_CLIENT_DATA */\n#if LWIP_IPV6_AUTOCONFIG\n  /* IPv6 address autoconfiguration not enabled by default */\n  netif->ip6_autoconfig_enabled = 0;\n#endif /* LWIP_IPV6_AUTOCONFIG */\n#if LWIP_IPV6_SEND_ROUTER_SOLICIT\n  netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT;\n#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */\n#if LWIP_NETIF_STATUS_CALLBACK\n  netif->status_callback = NULL;\n#endif /* LWIP_NETIF_STATUS_CALLBACK */\n#if LWIP_NETIF_LINK_CALLBACK\n  netif->link_callback = NULL;\n#endif /* LWIP_NETIF_LINK_CALLBACK */\n#if LWIP_IGMP\n  netif->igmp_mac_filter = NULL;\n#endif /* LWIP_IGMP */\n#if LWIP_IPV6 && LWIP_IPV6_MLD\n  netif->mld_mac_filter = NULL;\n#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */\n#if ENABLE_LOOPBACK\n  netif->loop_first = NULL;\n  netif->loop_last = NULL;\n#endif /* ENABLE_LOOPBACK */\n\n  /* remember netif specific state information data */\n  netif->state = state;\n  netif->num = netif_num++;\n  netif->input = input;\n\n  NETIF_SET_HWADDRHINT(netif, NULL);\n#if ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS\n  netif->loop_cnt_current = 0;\n#endif /* ENABLE_LOOPBACK && LWIP_LOOPBACK_MAX_PBUFS */\n\n#if LWIP_IPV4\n  netif_set_addr(netif, ipaddr, netmask, gw);\n#endif /* LWIP_IPV4 */\n\n  /* call user specified initialization function for netif */\n  if (init(netif) != ERR_OK) {\n    return NULL;\n  }\n\n  /* add this netif to the list */\n  netif->next = netif_list;\n  netif_list = netif;\n  mib2_netif_added(netif);\n\n#if LWIP_IGMP\n  /* start IGMP processing */\n  if (netif->flags & NETIF_FLAG_IGMP) {\n    igmp_start(netif);\n  }\n#endif /* LWIP_IGMP */\n\n  LWIP_DEBUGF(NETIF_DEBUG, (\"netif: added interface %c%c IP\",\n    netif->name[0], netif->name[1]));\n#if LWIP_IPV4\n  LWIP_DEBUGF(NETIF_DEBUG, (\" addr \"));\n  ip4_addr_debug_print(NETIF_DEBUG, ipaddr);\n  LWIP_DEBUGF(NETIF_DEBUG, (\" netmask \"));\n  ip4_addr_debug_print(NETIF_DEBUG, netmask);\n  LWIP_DEBUGF(NETIF_DEBUG, (\" gw \"));\n  ip4_addr_debug_print(NETIF_DEBUG, gw);\n#endif /* LWIP_IPV4 */\n  LWIP_DEBUGF(NETIF_DEBUG, (\"\\n\"));\n  return netif;\n}\n\n#if LWIP_IPV4\n/**\n * @ingroup netif_ip4\n * Change IP address configuration for a network interface (including netmask\n * and default gateway).\n *\n * @param netif the network interface to change\n * @param ipaddr the new IP address\n * @param netmask the new netmask\n * @param gw the new default gateway\n */\nvoid\nnetif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask,\n    const ip4_addr_t *gw)\n{\n  if (ip4_addr_isany(ipaddr)) {\n    /* when removing an address, we have to remove it *before* changing netmask/gw\n       to ensure that tcp RST segment can be sent correctly */\n    netif_set_ipaddr(netif, ipaddr);\n    netif_set_netmask(netif, netmask);\n    netif_set_gw(netif, gw);\n  } else {\n    netif_set_netmask(netif, netmask);\n    netif_set_gw(netif, gw);\n    /* set ipaddr last to ensure netmask/gw have been set when status callback is called */\n    netif_set_ipaddr(netif, ipaddr);\n  }\n}\n#endif /* LWIP_IPV4*/\n\n/**\n * @ingroup netif\n * Remove a network interface from the list of lwIP netifs.\n *\n * @param netif the network interface to remove\n */\nvoid\nnetif_remove(struct netif *netif)\n{\n#if LWIP_IPV6\n  int i;\n#endif\n\n  if (netif == NULL) {\n    return;\n  }\n\n#if LWIP_IPV4\n  if (!ip4_addr_isany_val(*netif_ip4_addr(netif))) {\n#if LWIP_TCP\n    tcp_netif_ip_addr_changed(netif_ip_addr4(netif), NULL);\n#endif /* LWIP_TCP */\n#if LWIP_UDP\n    udp_netif_ip_addr_changed(netif_ip_addr4(netif), NULL);\n#endif /* LWIP_UDP */\n#if LWIP_RAW\n    raw_netif_ip_addr_changed(netif_ip_addr4(netif), NULL);\n#endif /* LWIP_RAW */\n  }\n\n#if LWIP_IGMP\n  /* stop IGMP processing */\n  if (netif->flags & NETIF_FLAG_IGMP) {\n    igmp_stop(netif);\n  }\n#endif /* LWIP_IGMP */\n#endif /* LWIP_IPV4*/\n\n#if LWIP_IPV6\n  for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n    if (ip6_addr_isvalid(netif_ip6_addr_state(netif, i))) {\n#if LWIP_TCP\n      tcp_netif_ip_addr_changed(netif_ip_addr6(netif, i), NULL);\n#endif /* LWIP_TCP */\n#if LWIP_UDP\n      udp_netif_ip_addr_changed(netif_ip_addr6(netif, i), NULL);\n#endif /* LWIP_UDP */\n#if LWIP_RAW\n      raw_netif_ip_addr_changed(netif_ip_addr6(netif, i), NULL);\n#endif /* LWIP_RAW */\n    }\n  }\n#if LWIP_IPV6_MLD\n  /* stop MLD processing */\n  mld6_stop(netif);\n#endif /* LWIP_IPV6_MLD */\n#endif /* LWIP_IPV6 */\n  if (netif_is_up(netif)) {\n    /* set netif down before removing (call callback function) */\n    netif_set_down(netif);\n  }\n\n  mib2_remove_ip4(netif);\n\n  /* this netif is default? */\n  if (netif_default == netif) {\n    /* reset default netif */\n    netif_set_default(NULL);\n  }\n  /*  is it the first netif? */\n  if (netif_list == netif) {\n    netif_list = netif->next;\n  } else {\n    /*  look for netif further down the list */\n    struct netif * tmp_netif;\n    for (tmp_netif = netif_list; tmp_netif != NULL; tmp_netif = tmp_netif->next) {\n      if (tmp_netif->next == netif) {\n        tmp_netif->next = netif->next;\n        break;\n      }\n    }\n    if (tmp_netif == NULL) {\n      return; /* netif is not on the list */\n    }\n  }\n  mib2_netif_removed(netif);\n#if LWIP_NETIF_REMOVE_CALLBACK\n  if (netif->remove_callback) {\n    netif->remove_callback(netif);\n  }\n#endif /* LWIP_NETIF_REMOVE_CALLBACK */\n  LWIP_DEBUGF( NETIF_DEBUG, (\"netif_remove: removed netif\\n\") );\n}\n\n/**\n * @ingroup netif\n * Find a network interface by searching for its name\n *\n * @param name the name of the netif (like netif->name) plus concatenated number\n * in ascii representation (e.g. 'en0')\n */\nstruct netif *\nnetif_find(const char *name)\n{\n  struct netif *netif;\n  u8_t num;\n\n  if (name == NULL) {\n    return NULL;\n  }\n\n  num = (u8_t)(name[2] - '0');\n\n  for (netif = netif_list; netif != NULL; netif = netif->next) {\n    if (num == netif->num &&\n       name[0] == netif->name[0] &&\n       name[1] == netif->name[1]) {\n      LWIP_DEBUGF(NETIF_DEBUG, (\"netif_find: found %c%c\\n\", name[0], name[1]));\n      return netif;\n    }\n  }\n  LWIP_DEBUGF(NETIF_DEBUG, (\"netif_find: didn't find %c%c\\n\", name[0], name[1]));\n  return NULL;\n}\n\n#if LWIP_IPV4\n/**\n * @ingroup netif_ip4\n * Change the IP address of a network interface\n *\n * @param netif the network interface to change\n * @param ipaddr the new IP address\n *\n * @note call netif_set_addr() if you also want to change netmask and\n * default gateway\n */\nvoid\nnetif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr)\n{\n  ip_addr_t new_addr;\n  *ip_2_ip4(&new_addr) = (ipaddr ? *ipaddr : *IP4_ADDR_ANY4);\n  IP_SET_TYPE_VAL(new_addr, IPADDR_TYPE_V4);\n\n  /* address is actually being changed? */\n  if (ip4_addr_cmp(ip_2_ip4(&new_addr), netif_ip4_addr(netif)) == 0) {\n    LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, (\"netif_set_ipaddr: netif address being changed\\n\"));\n#if LWIP_TCP\n    tcp_netif_ip_addr_changed(netif_ip_addr4(netif), &new_addr);\n#endif /* LWIP_TCP */\n#if LWIP_UDP\n    udp_netif_ip_addr_changed(netif_ip_addr4(netif), &new_addr);\n#endif /* LWIP_UDP */\n#if LWIP_RAW\n    raw_netif_ip_addr_changed(netif_ip_addr4(netif), &new_addr);\n#endif /* LWIP_RAW */\n\n    mib2_remove_ip4(netif);\n    mib2_remove_route_ip4(0, netif);\n    /* set new IP address to netif */\n    ip4_addr_set(ip_2_ip4(&netif->ip_addr), ipaddr);\n    IP_SET_TYPE_VAL(netif->ip_addr, IPADDR_TYPE_V4);\n    mib2_add_ip4(netif);\n    mib2_add_route_ip4(0, netif);\n\n    netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4);\n\n    NETIF_STATUS_CALLBACK(netif);\n  }\n\n  LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"netif: IP address of interface %c%c set to %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n    netif->name[0], netif->name[1],\n    ip4_addr1_16(netif_ip4_addr(netif)),\n    ip4_addr2_16(netif_ip4_addr(netif)),\n    ip4_addr3_16(netif_ip4_addr(netif)),\n    ip4_addr4_16(netif_ip4_addr(netif))));\n}\n\n/**\n * @ingroup netif_ip4\n * Change the default gateway for a network interface\n *\n * @param netif the network interface to change\n * @param gw the new default gateway\n *\n * @note call netif_set_addr() if you also want to change ip address and netmask\n */\nvoid\nnetif_set_gw(struct netif *netif, const ip4_addr_t *gw)\n{\n  ip4_addr_set(ip_2_ip4(&netif->gw), gw);\n  IP_SET_TYPE_VAL(netif->gw, IPADDR_TYPE_V4);\n  LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"netif: GW address of interface %c%c set to %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n    netif->name[0], netif->name[1],\n    ip4_addr1_16(netif_ip4_gw(netif)),\n    ip4_addr2_16(netif_ip4_gw(netif)),\n    ip4_addr3_16(netif_ip4_gw(netif)),\n    ip4_addr4_16(netif_ip4_gw(netif))));\n}\n\n/**\n * @ingroup netif_ip4\n * Change the netmask of a network interface\n *\n * @param netif the network interface to change\n * @param netmask the new netmask\n *\n * @note call netif_set_addr() if you also want to change ip address and\n * default gateway\n */\nvoid\nnetif_set_netmask(struct netif *netif, const ip4_addr_t *netmask)\n{\n  mib2_remove_route_ip4(0, netif);\n  /* set new netmask to netif */\n  ip4_addr_set(ip_2_ip4(&netif->netmask), netmask);\n  IP_SET_TYPE_VAL(netif->netmask, IPADDR_TYPE_V4);\n  mib2_add_route_ip4(0, netif);\n  LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"netif: netmask of interface %c%c set to %\"U16_F\".%\"U16_F\".%\"U16_F\".%\"U16_F\"\\n\",\n    netif->name[0], netif->name[1],\n    ip4_addr1_16(netif_ip4_netmask(netif)),\n    ip4_addr2_16(netif_ip4_netmask(netif)),\n    ip4_addr3_16(netif_ip4_netmask(netif)),\n    ip4_addr4_16(netif_ip4_netmask(netif))));\n}\n#endif /* LWIP_IPV4 */\n\n/**\n * @ingroup netif\n * Set a network interface as the default network interface\n * (used to output all packets for which no specific route is found)\n *\n * @param netif the default network interface\n */\nvoid\nnetif_set_default(struct netif *netif)\n{\n  if (netif == NULL) {\n    /* remove default route */\n    mib2_remove_route_ip4(1, netif);\n  } else {\n    /* install default route */\n    mib2_add_route_ip4(1, netif);\n  }\n  netif_default = netif;\n  LWIP_DEBUGF(NETIF_DEBUG, (\"netif: setting default interface %c%c\\n\",\n           netif ? netif->name[0] : '\\'', netif ? netif->name[1] : '\\''));\n}\n\n/**\n * @ingroup netif\n * Bring an interface up, available for processing\n * traffic.\n */\nvoid\nnetif_set_up(struct netif *netif)\n{\n  if (!(netif->flags & NETIF_FLAG_UP)) {\n    netif->flags |= NETIF_FLAG_UP;\n\n    MIB2_COPY_SYSUPTIME_TO(&netif->ts);\n\n    NETIF_STATUS_CALLBACK(netif);\n\n    if (netif->flags & NETIF_FLAG_LINK_UP) {\n      netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4|NETIF_REPORT_TYPE_IPV6);\n    }\n  }\n}\n\n/** Send ARP/IGMP/MLD/RS events, e.g. on link-up/netif-up or addr-change\n */\nstatic void\nnetif_issue_reports(struct netif* netif, u8_t report_type)\n{\n#if LWIP_IPV4\n  if ((report_type & NETIF_REPORT_TYPE_IPV4) &&\n      !ip4_addr_isany_val(*netif_ip4_addr(netif))) {\n#if LWIP_ARP\n    /* For Ethernet network interfaces, we would like to send a \"gratuitous ARP\" */\n    if (netif->flags & (NETIF_FLAG_ETHARP)) {\n      etharp_gratuitous(netif);\n    }\n#endif /* LWIP_ARP */\n\n#if LWIP_IGMP\n    /* resend IGMP memberships */\n    if (netif->flags & NETIF_FLAG_IGMP) {\n      igmp_report_groups(netif);\n    }\n#endif /* LWIP_IGMP */\n  }\n#endif /* LWIP_IPV4 */\n\n#if LWIP_IPV6\n  if (report_type & NETIF_REPORT_TYPE_IPV6) {\n#if LWIP_IPV6_MLD\n    /* send mld memberships */\n    mld6_report_groups(netif);\n#endif /* LWIP_IPV6_MLD */\n#if LWIP_IPV6_SEND_ROUTER_SOLICIT\n    /* Send Router Solicitation messages. */\n    netif->rs_count = LWIP_ND6_MAX_MULTICAST_SOLICIT;\n#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */\n  }\n#endif /* LWIP_IPV6 */\n}\n\n/**\n * @ingroup netif\n * Bring an interface down, disabling any traffic processing.\n */\nvoid\nnetif_set_down(struct netif *netif)\n{\n  if (netif->flags & NETIF_FLAG_UP) {\n    netif->flags &= ~NETIF_FLAG_UP;\n    MIB2_COPY_SYSUPTIME_TO(&netif->ts);\n\n#if LWIP_IPV4 && LWIP_ARP\n    if (netif->flags & NETIF_FLAG_ETHARP) {\n      etharp_cleanup_netif(netif);\n    }\n#endif /* LWIP_IPV4 && LWIP_ARP */\n\n#if LWIP_IPV6\n    nd6_cleanup_netif(netif);\n#endif /* LWIP_IPV6 */\n\n    NETIF_STATUS_CALLBACK(netif);\n  }\n}\n\n#if LWIP_NETIF_STATUS_CALLBACK\n/**\n * @ingroup netif\n * Set callback to be called when interface is brought up/down or address is changed while up\n */\nvoid\nnetif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback)\n{\n  if (netif) {\n    netif->status_callback = status_callback;\n  }\n}\n#endif /* LWIP_NETIF_STATUS_CALLBACK */\n\n#if LWIP_NETIF_REMOVE_CALLBACK\n/**\n * @ingroup netif\n * Set callback to be called when the interface has been removed\n */\nvoid\nnetif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback)\n{\n  if (netif) {\n    netif->remove_callback = remove_callback;\n  }\n}\n#endif /* LWIP_NETIF_REMOVE_CALLBACK */\n\n/**\n * @ingroup netif\n * Called by a driver when its link goes up\n */\nvoid\nnetif_set_link_up(struct netif *netif)\n{\n  if (!(netif->flags & NETIF_FLAG_LINK_UP)) {\n    netif->flags |= NETIF_FLAG_LINK_UP;\n\n#if LWIP_DHCP\n    dhcp_network_changed(netif);\n#endif /* LWIP_DHCP */\n\n#if LWIP_AUTOIP\n    autoip_network_changed(netif);\n#endif /* LWIP_AUTOIP */\n\n    if (netif->flags & NETIF_FLAG_UP) {\n      netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV4|NETIF_REPORT_TYPE_IPV6);\n    }\n    NETIF_LINK_CALLBACK(netif);\n  }\n}\n\n/**\n * @ingroup netif\n * Called by a driver when its link goes down\n */\nvoid\nnetif_set_link_down(struct netif *netif )\n{\n  if (netif->flags & NETIF_FLAG_LINK_UP) {\n    netif->flags &= ~NETIF_FLAG_LINK_UP;\n    NETIF_LINK_CALLBACK(netif);\n  }\n}\n\n#if LWIP_NETIF_LINK_CALLBACK\n/**\n * @ingroup netif\n * Set callback to be called when link is brought up/down\n */\nvoid\nnetif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback)\n{\n  if (netif) {\n    netif->link_callback = link_callback;\n  }\n}\n#endif /* LWIP_NETIF_LINK_CALLBACK */\n\n#if ENABLE_LOOPBACK\n/**\n * @ingroup netif\n * Send an IP packet to be received on the same netif (loopif-like).\n * The pbuf is simply copied and handed back to netif->input.\n * In multithreaded mode, this is done directly since netif->input must put\n * the packet on a queue.\n * In callback mode, the packet is put on an internal queue and is fed to\n * netif->input by netif_poll().\n *\n * @param netif the lwip network interface structure\n * @param p the (IP) packet to 'send'\n * @return ERR_OK if the packet has been sent\n *         ERR_MEM if the pbuf used to copy the packet couldn't be allocated\n */\nerr_t\nnetif_loop_output(struct netif *netif, struct pbuf *p)\n{\n  struct pbuf *r;\n  err_t err;\n  struct pbuf *last;\n#if LWIP_LOOPBACK_MAX_PBUFS\n  u16_t clen = 0;\n#endif /* LWIP_LOOPBACK_MAX_PBUFS */\n  /* If we have a loopif, SNMP counters are adjusted for it,\n   * if not they are adjusted for 'netif'. */\n#if MIB2_STATS\n#if LWIP_HAVE_LOOPIF\n  struct netif *stats_if = &loop_netif;\n#else /* LWIP_HAVE_LOOPIF */\n  struct netif *stats_if = netif;\n#endif /* LWIP_HAVE_LOOPIF */\n#endif /* MIB2_STATS */\n  SYS_ARCH_DECL_PROTECT(lev);\n\n  /* Allocate a new pbuf */\n  r = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM);\n  if (r == NULL) {\n    LINK_STATS_INC(link.memerr);\n    LINK_STATS_INC(link.drop);\n    MIB2_STATS_NETIF_INC(stats_if, ifoutdiscards);\n    return ERR_MEM;\n  }\n#if LWIP_LOOPBACK_MAX_PBUFS\n  clen = pbuf_clen(r);\n  /* check for overflow or too many pbuf on queue */\n  if (((netif->loop_cnt_current + clen) < netif->loop_cnt_current) ||\n     ((netif->loop_cnt_current + clen) > LWIP_LOOPBACK_MAX_PBUFS)) {\n    pbuf_free(r);\n    LINK_STATS_INC(link.memerr);\n    LINK_STATS_INC(link.drop);\n    MIB2_STATS_NETIF_INC(stats_if, ifoutdiscards);\n    return ERR_MEM;\n  }\n  netif->loop_cnt_current += clen;\n#endif /* LWIP_LOOPBACK_MAX_PBUFS */\n\n  /* Copy the whole pbuf queue p into the single pbuf r */\n  if ((err = pbuf_copy(r, p)) != ERR_OK) {\n    pbuf_free(r);\n    LINK_STATS_INC(link.memerr);\n    LINK_STATS_INC(link.drop);\n    MIB2_STATS_NETIF_INC(stats_if, ifoutdiscards);\n    return err;\n  }\n\n  /* Put the packet on a linked list which gets emptied through calling\n     netif_poll(). */\n\n  /* let last point to the last pbuf in chain r */\n  for (last = r; last->next != NULL; last = last->next) {\n    /* nothing to do here, just get to the last pbuf */\n  }\n\n  SYS_ARCH_PROTECT(lev);\n  if (netif->loop_first != NULL) {\n    LWIP_ASSERT(\"if first != NULL, last must also be != NULL\", netif->loop_last != NULL);\n    netif->loop_last->next = r;\n    netif->loop_last = last;\n  } else {\n    netif->loop_first = r;\n    netif->loop_last = last;\n  }\n  SYS_ARCH_UNPROTECT(lev);\n\n  LINK_STATS_INC(link.xmit);\n  MIB2_STATS_NETIF_ADD(stats_if, ifoutoctets, p->tot_len);\n  MIB2_STATS_NETIF_INC(stats_if, ifoutucastpkts);\n\n#if LWIP_NETIF_LOOPBACK_MULTITHREADING\n  /* For multithreading environment, schedule a call to netif_poll */\n  tcpip_callback_with_block((tcpip_callback_fn)netif_poll, netif, 0);\n#endif /* LWIP_NETIF_LOOPBACK_MULTITHREADING */\n\n  return ERR_OK;\n}\n\n#if LWIP_HAVE_LOOPIF\n#if LWIP_IPV4\nstatic err_t\nnetif_loop_output_ipv4(struct netif *netif, struct pbuf *p, const ip4_addr_t* addr)\n{\n  LWIP_UNUSED_ARG(addr);\n  return netif_loop_output(netif, p);\n}\n#endif /* LWIP_IPV4 */\n\n#if LWIP_IPV6\nstatic err_t\nnetif_loop_output_ipv6(struct netif *netif, struct pbuf *p, const ip6_addr_t* addr)\n{\n  LWIP_UNUSED_ARG(addr);\n  return netif_loop_output(netif, p);\n}\n#endif /* LWIP_IPV6 */\n#endif /* LWIP_HAVE_LOOPIF */\n\n\n/**\n * Call netif_poll() in the main loop of your application. This is to prevent\n * reentering non-reentrant functions like tcp_input(). Packets passed to\n * netif_loop_output() are put on a list that is passed to netif->input() by\n * netif_poll().\n */\nvoid\nnetif_poll(struct netif *netif)\n{\n  /* If we have a loopif, SNMP counters are adjusted for it,\n   * if not they are adjusted for 'netif'. */\n#if MIB2_STATS\n#if LWIP_HAVE_LOOPIF\n  struct netif *stats_if = &loop_netif;\n#else /* LWIP_HAVE_LOOPIF */\n  struct netif *stats_if = netif;\n#endif /* LWIP_HAVE_LOOPIF */\n#endif /* MIB2_STATS */\n  SYS_ARCH_DECL_PROTECT(lev);\n\n  /* Get a packet from the list. With SYS_LIGHTWEIGHT_PROT=1, this is protected */\n  SYS_ARCH_PROTECT(lev);\n  while (netif->loop_first != NULL) {\n    struct pbuf *in, *in_end;\n#if LWIP_LOOPBACK_MAX_PBUFS\n    u8_t clen = 1;\n#endif /* LWIP_LOOPBACK_MAX_PBUFS */\n\n    in = in_end = netif->loop_first;\n    while (in_end->len != in_end->tot_len) {\n      LWIP_ASSERT(\"bogus pbuf: len != tot_len but next == NULL!\", in_end->next != NULL);\n      in_end = in_end->next;\n#if LWIP_LOOPBACK_MAX_PBUFS\n      clen++;\n#endif /* LWIP_LOOPBACK_MAX_PBUFS */\n    }\n#if LWIP_LOOPBACK_MAX_PBUFS\n    /* adjust the number of pbufs on queue */\n    LWIP_ASSERT(\"netif->loop_cnt_current underflow\",\n      ((netif->loop_cnt_current - clen) < netif->loop_cnt_current));\n    netif->loop_cnt_current -= clen;\n#endif /* LWIP_LOOPBACK_MAX_PBUFS */\n\n    /* 'in_end' now points to the last pbuf from 'in' */\n    if (in_end == netif->loop_last) {\n      /* this was the last pbuf in the list */\n      netif->loop_first = netif->loop_last = NULL;\n    } else {\n      /* pop the pbuf off the list */\n      netif->loop_first = in_end->next;\n      LWIP_ASSERT(\"should not be null since first != last!\", netif->loop_first != NULL);\n    }\n    /* De-queue the pbuf from its successors on the 'loop_' list. */\n    in_end->next = NULL;\n    SYS_ARCH_UNPROTECT(lev);\n\n    LINK_STATS_INC(link.recv);\n    MIB2_STATS_NETIF_ADD(stats_if, ifinoctets, in->tot_len);\n    MIB2_STATS_NETIF_INC(stats_if, ifinucastpkts);\n    /* loopback packets are always IP packets! */\n    if (ip_input(in, netif) != ERR_OK) {\n      pbuf_free(in);\n    }\n    SYS_ARCH_PROTECT(lev);\n  }\n  SYS_ARCH_UNPROTECT(lev);\n}\n\n#if !LWIP_NETIF_LOOPBACK_MULTITHREADING\n/**\n * Calls netif_poll() for every netif on the netif_list.\n */\nvoid\nnetif_poll_all(void)\n{\n  struct netif *netif = netif_list;\n  /* loop through netifs */\n  while (netif != NULL) {\n    netif_poll(netif);\n    /* proceed to next network interface */\n    netif = netif->next;\n  }\n}\n#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */\n#endif /* ENABLE_LOOPBACK */\n\n#if LWIP_NUM_NETIF_CLIENT_DATA > 0\n/**\n * @ingroup netif_cd\n * Allocate an index to store data in client_data member of struct netif.\n * Returned value is an index in mentioned array.\n * @see LWIP_NUM_NETIF_CLIENT_DATA\n */\nu8_t\nnetif_alloc_client_data_id(void)\n{\n  u8_t result = netif_client_id;\n  netif_client_id++;\n\n  LWIP_ASSERT(\"Increase LWIP_NUM_NETIF_CLIENT_DATA in lwipopts.h\", result < LWIP_NUM_NETIF_CLIENT_DATA);\n  return result + LWIP_NETIF_CLIENT_DATA_INDEX_MAX;\n}\n#endif\n\n#if LWIP_IPV6\n/**\n * @ingroup netif_ip6\n * Change an IPv6 address of a network interface\n *\n * @param netif the network interface to change\n * @param addr_idx index of the IPv6 address\n * @param addr6 the new IPv6 address\n *\n * @note call netif_ip6_addr_set_state() to set the address valid/temptative\n */\nvoid\nnetif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6)\n{\n  LWIP_ASSERT(\"addr6 != NULL\", addr6 != NULL);\n  netif_ip6_addr_set_parts(netif, addr_idx, addr6->addr[0], addr6->addr[1],\n    addr6->addr[2], addr6->addr[3]);\n}\n\n/*\n * Change an IPv6 address of a network interface (internal version taking 4 * u32_t)\n *\n * @param netif the network interface to change\n * @param addr_idx index of the IPv6 address\n * @param i0 word0 of the new IPv6 address\n * @param i1 word1 of the new IPv6 address\n * @param i2 word2 of the new IPv6 address\n * @param i3 word3 of the new IPv6 address\n */\nvoid\nnetif_ip6_addr_set_parts(struct netif *netif, s8_t addr_idx, u32_t i0, u32_t i1, u32_t i2, u32_t i3)\n{\n  const ip6_addr_t *old_addr;\n  LWIP_ASSERT(\"netif != NULL\", netif != NULL);\n  LWIP_ASSERT(\"invalid index\", addr_idx < LWIP_IPV6_NUM_ADDRESSES);\n\n  old_addr = netif_ip6_addr(netif, addr_idx);\n  /* address is actually being changed? */\n  if ((old_addr->addr[0] != i0) || (old_addr->addr[1] != i1) ||\n      (old_addr->addr[2] != i2) || (old_addr->addr[3] != i3)) {\n    LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, (\"netif_ip6_addr_set: netif address being changed\\n\"));\n\n    if (netif_ip6_addr_state(netif, addr_idx) & IP6_ADDR_VALID) {\n#if LWIP_TCP || LWIP_UDP\n      ip_addr_t new_ipaddr;\n      IP_ADDR6(&new_ipaddr, i0, i1, i2, i3);\n#endif /* LWIP_TCP || LWIP_UDP */\n#if LWIP_TCP\n      tcp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr);\n#endif /* LWIP_TCP */\n#if LWIP_UDP\n      udp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr);\n#endif /* LWIP_UDP */\n#if LWIP_RAW\n      raw_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), &new_ipaddr);\n#endif /* LWIP_RAW */\n    }\n    /* @todo: remove/readd mib2 ip6 entries? */\n\n    IP6_ADDR(ip_2_ip6(&(netif->ip6_addr[addr_idx])), i0, i1, i2, i3);\n    IP_SET_TYPE_VAL(netif->ip6_addr[addr_idx], IPADDR_TYPE_V6);\n\n    if (netif_ip6_addr_state(netif, addr_idx) & IP6_ADDR_VALID) {\n      netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV6);\n      NETIF_STATUS_CALLBACK(netif);\n    }\n  }\n\n  LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"netif: IPv6 address %d of interface %c%c set to %s/0x%\"X8_F\"\\n\",\n    addr_idx, netif->name[0], netif->name[1], ip6addr_ntoa(netif_ip6_addr(netif, addr_idx)),\n    netif_ip6_addr_state(netif, addr_idx)));\n}\n\n/**\n * @ingroup netif_ip6\n * Change the state of an IPv6 address of a network interface\n * (INVALID, TEMPTATIVE, PREFERRED, DEPRECATED, where TEMPTATIVE\n * includes the number of checks done, see ip6_addr.h)\n *\n * @param netif the network interface to change\n * @param addr_idx index of the IPv6 address\n * @param state the new IPv6 address state\n */\nvoid\nnetif_ip6_addr_set_state(struct netif* netif, s8_t addr_idx, u8_t state)\n{\n  u8_t old_state;\n  LWIP_ASSERT(\"netif != NULL\", netif != NULL);\n  LWIP_ASSERT(\"invalid index\", addr_idx < LWIP_IPV6_NUM_ADDRESSES);\n\n  old_state = netif_ip6_addr_state(netif, addr_idx);\n  /* state is actually being changed? */\n  if (old_state != state) {\n    u8_t old_valid = old_state & IP6_ADDR_VALID;\n    u8_t new_valid = state & IP6_ADDR_VALID;\n    LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, (\"netif_ip6_addr_set_state: netif address state being changed\\n\"));\n\n#if LWIP_IPV6_MLD\n    /* Reevaluate solicited-node multicast group membership. */\n    if (netif->flags & NETIF_FLAG_MLD6) {\n      nd6_adjust_mld_membership(netif, addr_idx, state);\n    }\n#endif /* LWIP_IPV6_MLD */\n\n    if (old_valid && !new_valid) {\n      /* address about to be removed by setting invalid */\n#if LWIP_TCP\n      tcp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL);\n#endif /* LWIP_TCP */\n#if LWIP_UDP\n      udp_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL);\n#endif /* LWIP_UDP */\n#if LWIP_RAW\n      raw_netif_ip_addr_changed(netif_ip_addr6(netif, addr_idx), NULL);\n#endif /* LWIP_RAW */\n      /* @todo: remove mib2 ip6 entries? */\n    }\n    netif->ip6_addr_state[addr_idx] = state;\n\n    if (!old_valid && new_valid) {\n      /* address added by setting valid */\n      /* @todo: add mib2 ip6 entries? */\n      netif_issue_reports(netif, NETIF_REPORT_TYPE_IPV6);\n    }\n    if ((old_state & IP6_ADDR_PREFERRED) != (state & IP6_ADDR_PREFERRED)) {\n      /* address state has changed (valid flag changed or switched between\n         preferred and deprecated) -> call the callback function */\n      NETIF_STATUS_CALLBACK(netif);\n    }\n  }\n\n  LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"netif: IPv6 address %d of interface %c%c set to %s/0x%\"X8_F\"\\n\",\n    addr_idx, netif->name[0], netif->name[1], ip6addr_ntoa(netif_ip6_addr(netif, addr_idx)),\n    netif_ip6_addr_state(netif, addr_idx)));\n}\n\n/**\n * Checks if a specific address is assigned to the netif and returns its\n * index.\n *\n * @param netif the netif to check\n * @param ip6addr the IPv6 address to find\n * @return >= 0: address found, this is its index\n *         -1: address not found on this netif\n */\ns8_t\nnetif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr)\n{\n  s8_t i;\n  for (i = 0; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n    if (!ip6_addr_isinvalid(netif_ip6_addr_state(netif, i)) &&\n        ip6_addr_cmp(netif_ip6_addr(netif, i), ip6addr)) {\n      return i;\n    }\n  }\n  return -1;\n}\n\n/**\n * @ingroup netif_ip6\n * Create a link-local IPv6 address on a netif (stored in slot 0)\n *\n * @param netif the netif to create the address on\n * @param from_mac_48bit if != 0, assume hwadr is a 48-bit MAC address (std conversion)\n *                       if == 0, use hwaddr directly as interface ID\n */\nvoid\nnetif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit)\n{\n  u8_t i, addr_index;\n\n  /* Link-local prefix. */\n  ip_2_ip6(&netif->ip6_addr[0])->addr[0] = PP_HTONL(0xfe800000ul);\n  ip_2_ip6(&netif->ip6_addr[0])->addr[1] = 0;\n\n  /* Generate interface ID. */\n  if (from_mac_48bit) {\n    /* Assume hwaddr is a 48-bit IEEE 802 MAC. Convert to EUI-64 address. Complement Group bit. */\n    ip_2_ip6(&netif->ip6_addr[0])->addr[2] = lwip_htonl((((u32_t)(netif->hwaddr[0] ^ 0x02)) << 24) |\n        ((u32_t)(netif->hwaddr[1]) << 16) |\n        ((u32_t)(netif->hwaddr[2]) << 8) |\n        (0xff));\n    ip_2_ip6(&netif->ip6_addr[0])->addr[3] = lwip_htonl((0xfeul << 24) |\n        ((u32_t)(netif->hwaddr[3]) << 16) |\n        ((u32_t)(netif->hwaddr[4]) << 8) |\n        (netif->hwaddr[5]));\n  } else {\n    /* Use hwaddr directly as interface ID. */\n    ip_2_ip6(&netif->ip6_addr[0])->addr[2] = 0;\n    ip_2_ip6(&netif->ip6_addr[0])->addr[3] = 0;\n\n    addr_index = 3;\n    for (i = 0; (i < 8) && (i < netif->hwaddr_len); i++) {\n      if (i == 4) {\n        addr_index--;\n      }\n      ip_2_ip6(&netif->ip6_addr[0])->addr[addr_index] |= ((u32_t)(netif->hwaddr[netif->hwaddr_len - i - 1])) << (8 * (i & 0x03));\n    }\n  }\n\n  /* Set address state. */\n#if LWIP_IPV6_DUP_DETECT_ATTEMPTS\n  /* Will perform duplicate address detection (DAD). */\n  netif_ip6_addr_set_state(netif, 0, IP6_ADDR_TENTATIVE);\n#else\n  /* Consider address valid. */\n  netif_ip6_addr_set_state(netif, 0, IP6_ADDR_PREFERRED);\n#endif /* LWIP_IPV6_AUTOCONFIG */\n}\n\n/**\n * @ingroup netif_ip6\n * This function allows for the easy addition of a new IPv6 address to an interface.\n * It takes care of finding an empty slot and then sets the address tentative\n * (to make sure that all the subsequent processing happens).\n *\n * @param netif netif to add the address on\n * @param ip6addr address to add\n * @param chosen_idx if != NULL, the chosen IPv6 address index will be stored here\n */\nerr_t\nnetif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx)\n{\n  s8_t i;\n\n  i = netif_get_ip6_addr_match(netif, ip6addr);\n  if (i >= 0) {\n    /* Address already added */\n    if (chosen_idx != NULL) {\n      *chosen_idx = i;\n    }\n    return ERR_OK;\n  }\n\n  /* Find a free slot -- musn't be the first one (reserved for link local) */\n  for (i = 1; i < LWIP_IPV6_NUM_ADDRESSES; i++) {\n    if (ip6_addr_isinvalid(netif_ip6_addr_state(netif, i))) {\n      ip_addr_copy_from_ip6(netif->ip6_addr[i], *ip6addr);\n      netif_ip6_addr_set_state(netif, i, IP6_ADDR_TENTATIVE);\n      if (chosen_idx != NULL) {\n        *chosen_idx = i;\n      }\n      return ERR_OK;\n    }\n  }\n\n  if (chosen_idx != NULL) {\n    *chosen_idx = -1;\n  }\n  return ERR_VAL;\n}\n\n/** Dummy IPv6 output function for netifs not supporting IPv6\n */\nstatic err_t\nnetif_null_output_ip6(struct netif *netif, struct pbuf *p, const ip6_addr_t *ipaddr)\n{\n  LWIP_UNUSED_ARG(netif);\n  LWIP_UNUSED_ARG(p);\n  LWIP_UNUSED_ARG(ipaddr);\n\n  return ERR_IF;\n}\n#endif /* LWIP_IPV6 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/pbuf.c",
    "content": "/**\n * @file\n * Packet buffer management\n */\n\n/**\n * @defgroup pbuf Packet buffers (PBUF)\n * @ingroup infrastructure\n *\n * Packets are built from the pbuf data structure. It supports dynamic\n * memory allocation for packet contents or can reference externally\n * managed packet contents both in RAM and ROM. Quick allocation for\n * incoming packets is provided through pools with fixed sized pbufs.\n *\n * A packet may span over multiple pbufs, chained as a singly linked\n * list. This is called a \"pbuf chain\".\n *\n * Multiple packets may be queued, also using this singly linked list.\n * This is called a \"packet queue\".\n *\n * So, a packet queue consists of one or more pbuf chains, each of\n * which consist of one or more pbufs. CURRENTLY, PACKET QUEUES ARE\n * NOT SUPPORTED!!! Use helper structs to queue multiple packets.\n *\n * The differences between a pbuf chain and a packet queue are very\n * precise but subtle.\n *\n * The last pbuf of a packet has a ->tot_len field that equals the\n * ->len field. It can be found by traversing the list. If the last\n * pbuf of a packet has a ->next field other than NULL, more packets\n * are on the queue.\n *\n * Therefore, looping through a pbuf of a single packet, has an\n * loop end condition (tot_len == p->len), NOT (next == NULL).\n *\n * Example of custom pbuf usage for zero-copy RX:\n  @code{.c}\ntypedef struct my_custom_pbuf\n{\n   struct pbuf_custom p;\n   void* dma_descriptor;\n} my_custom_pbuf_t;\n\nLWIP_MEMPOOL_DECLARE(RX_POOL, 10, sizeof(my_custom_pbuf_t), \"Zero-copy RX PBUF pool\");\n\nvoid my_pbuf_free_custom(void* p)\n{\n  my_custom_pbuf_t* my_puf = (my_custom_pbuf_t*)p;\n\n  LOCK_INTERRUPTS();\n  free_rx_dma_descriptor(my_pbuf->dma_descriptor);\n  LWIP_MEMPOOL_FREE(RX_POOL, my_pbuf);\n  UNLOCK_INTERRUPTS();\n}\n\nvoid eth_rx_irq()\n{\n  dma_descriptor*   dma_desc = get_RX_DMA_descriptor_from_ethernet();\n  my_custom_pbuf_t* my_pbuf  = (my_custom_pbuf_t*)LWIP_MEMPOOL_ALLOC(RX_POOL);\n\n  my_pbuf->p.custom_free_function = my_pbuf_free_custom;\n  my_pbuf->dma_descriptor         = dma_desc;\n\n  invalidate_cpu_cache(dma_desc->rx_data, dma_desc->rx_length);\n  \n  struct pbuf* p = pbuf_alloced_custom(PBUF_RAW,\n     dma_desc->rx_length,\n     PBUF_REF,\n     &my_pbuf->p,\n     dma_desc->rx_data,\n     dma_desc->max_buffer_size);\n\n  if(netif->input(p, netif) != ERR_OK) {\n    pbuf_free(p);\n  }\n}\n  @endcode\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#include \"lwip/stats.h\"\n#include \"lwip/def.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/sys.h\"\n#if LWIP_TCP && TCP_QUEUE_OOSEQ\n#include \"lwip/priv/tcp_priv.h\"\n#endif\n#if LWIP_CHECKSUM_ON_COPY\n#include \"lwip/inet_chksum.h\"\n#endif\n\n#include <string.h>\n\n#define SIZEOF_STRUCT_PBUF        LWIP_MEM_ALIGN_SIZE(sizeof(struct pbuf))\n/* Since the pool is created in memp, PBUF_POOL_BUFSIZE will be automatically\n   aligned there. Therefore, PBUF_POOL_BUFSIZE_ALIGNED can be used here. */\n#define PBUF_POOL_BUFSIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE)\n\n#if !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ\n#define PBUF_POOL_IS_EMPTY()\n#else /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */\n\n#if !NO_SYS\n#ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL\n#include \"lwip/tcpip.h\"\n#define PBUF_POOL_FREE_OOSEQ_QUEUE_CALL()  do { \\\n  if (tcpip_callback_with_block(pbuf_free_ooseq_callback, NULL, 0) != ERR_OK) { \\\n      SYS_ARCH_PROTECT(old_level); \\\n      pbuf_free_ooseq_pending = 0; \\\n      SYS_ARCH_UNPROTECT(old_level); \\\n  } } while(0)\n#endif /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */\n#endif /* !NO_SYS */\n\nvolatile u8_t pbuf_free_ooseq_pending;\n#define PBUF_POOL_IS_EMPTY() pbuf_pool_is_empty()\n\n/**\n * Attempt to reclaim some memory from queued out-of-sequence TCP segments\n * if we run out of pool pbufs. It's better to give priority to new packets\n * if we're running out.\n *\n * This must be done in the correct thread context therefore this function\n * can only be used with NO_SYS=0 and through tcpip_callback.\n */\n#if !NO_SYS\nstatic\n#endif /* !NO_SYS */\nvoid\npbuf_free_ooseq(void)\n{\n  struct tcp_pcb* pcb;\n  SYS_ARCH_SET(pbuf_free_ooseq_pending, 0);\n\n  for (pcb = tcp_active_pcbs; NULL != pcb; pcb = pcb->next) {\n    if (NULL != pcb->ooseq) {\n      /** Free the ooseq pbufs of one PCB only */\n      LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_free_ooseq: freeing out-of-sequence pbufs\\n\"));\n      tcp_segs_free(pcb->ooseq);\n      pcb->ooseq = NULL;\n      return;\n    }\n  }\n}\n\n#if !NO_SYS\n/**\n * Just a callback function for tcpip_callback() that calls pbuf_free_ooseq().\n */\nstatic void\npbuf_free_ooseq_callback(void *arg)\n{\n  LWIP_UNUSED_ARG(arg);\n  pbuf_free_ooseq();\n}\n#endif /* !NO_SYS */\n\n/** Queue a call to pbuf_free_ooseq if not already queued. */\nstatic void\npbuf_pool_is_empty(void)\n{\n#ifndef PBUF_POOL_FREE_OOSEQ_QUEUE_CALL\n  SYS_ARCH_SET(pbuf_free_ooseq_pending, 1);\n#else /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */\n  u8_t queued;\n  SYS_ARCH_DECL_PROTECT(old_level);\n  SYS_ARCH_PROTECT(old_level);\n  queued = pbuf_free_ooseq_pending;\n  pbuf_free_ooseq_pending = 1;\n  SYS_ARCH_UNPROTECT(old_level);\n\n  if (!queued) {\n    /* queue a call to pbuf_free_ooseq if not already queued */\n    PBUF_POOL_FREE_OOSEQ_QUEUE_CALL();\n  }\n#endif /* PBUF_POOL_FREE_OOSEQ_QUEUE_CALL */\n}\n#endif /* !LWIP_TCP || !TCP_QUEUE_OOSEQ || !PBUF_POOL_FREE_OOSEQ */\n\n/**\n * @ingroup pbuf\n * Allocates a pbuf of the given type (possibly a chain for PBUF_POOL type).\n *\n * The actual memory allocated for the pbuf is determined by the\n * layer at which the pbuf is allocated and the requested size\n * (from the size parameter).\n *\n * @param layer flag to define header size\n * @param length size of the pbuf's payload\n * @param type this parameter decides how and where the pbuf\n * should be allocated as follows:\n *\n * - PBUF_RAM: buffer memory for pbuf is allocated as one large\n *             chunk. This includes protocol headers as well.\n * - PBUF_ROM: no buffer memory is allocated for the pbuf, even for\n *             protocol headers. Additional headers must be prepended\n *             by allocating another pbuf and chain in to the front of\n *             the ROM pbuf. It is assumed that the memory used is really\n *             similar to ROM in that it is immutable and will not be\n *             changed. Memory which is dynamic should generally not\n *             be attached to PBUF_ROM pbufs. Use PBUF_REF instead.\n * - PBUF_REF: no buffer memory is allocated for the pbuf, even for\n *             protocol headers. It is assumed that the pbuf is only\n *             being used in a single thread. If the pbuf gets queued,\n *             then pbuf_take should be called to copy the buffer.\n * - PBUF_POOL: the pbuf is allocated as a pbuf chain, with pbufs from\n *              the pbuf pool that is allocated during pbuf_init().\n *\n * @return the allocated pbuf. If multiple pbufs where allocated, this\n * is the first pbuf of a pbuf chain.\n */\nstruct pbuf *\npbuf_alloc(pbuf_layer layer, u16_t length, pbuf_type type)\n{\n  struct pbuf *p, *q, *r;\n  u16_t offset;\n  s32_t rem_len; /* remaining length */\n  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_alloc(length=%\"U16_F\")\\n\", length));\n\n  /* determine header offset */\n  switch (layer) {\n  case PBUF_TRANSPORT:\n    /* add room for transport (often TCP) layer header */\n    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;\n    break;\n  case PBUF_IP:\n    /* add room for IP layer header */\n    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN;\n    break;\n  case PBUF_LINK:\n    /* add room for link layer header */\n    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN;\n    break;\n  case PBUF_RAW_TX:\n    /* add room for encapsulating link layer headers (e.g. 802.11) */\n    offset = PBUF_LINK_ENCAPSULATION_HLEN;\n    break;\n  case PBUF_RAW:\n    /* no offset (e.g. RX buffers or chain successors) */\n    offset = 0;\n    break;\n  default:\n    LWIP_ASSERT(\"pbuf_alloc: bad pbuf layer\", 0);\n    return NULL;\n  }\n\n  switch (type) {\n  case PBUF_POOL:\n    /* allocate head of pbuf chain into p */\n    p = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);\n    LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_alloc: allocated pbuf %p\\n\", (void *)p));\n    if (p == NULL) {\n      PBUF_POOL_IS_EMPTY();\n      return NULL;\n    }\n    p->type = type;\n    p->next = NULL;\n\n    /* make the payload pointer point 'offset' bytes into pbuf data memory */\n    p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + (SIZEOF_STRUCT_PBUF + offset)));\n    LWIP_ASSERT(\"pbuf_alloc: pbuf p->payload properly aligned\",\n            ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);\n    /* the total length of the pbuf chain is the requested size */\n    p->tot_len = length;\n    /* set the length of the first pbuf in the chain */\n    p->len = LWIP_MIN(length, PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset));\n    LWIP_ASSERT(\"check p->payload + p->len does not overflow pbuf\",\n                ((u8_t*)p->payload + p->len <=\n                 (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));\n    LWIP_ASSERT(\"PBUF_POOL_BUFSIZE must be bigger than MEM_ALIGNMENT\",\n      (PBUF_POOL_BUFSIZE_ALIGNED - LWIP_MEM_ALIGN_SIZE(offset)) > 0 );\n    /* set reference count (needed here in case we fail) */\n    p->ref = 1;\n\n    /* now allocate the tail of the pbuf chain */\n\n    /* remember first pbuf for linkage in next iteration */\n    r = p;\n    /* remaining length to be allocated */\n    rem_len = length - p->len;\n    /* any remaining pbufs to be allocated? */\n    while (rem_len > 0) {\n      q = (struct pbuf *)memp_malloc(MEMP_PBUF_POOL);\n      if (q == NULL) {\n        PBUF_POOL_IS_EMPTY();\n        /* free chain so far allocated */\n        pbuf_free(p);\n        /* bail out unsuccessfully */\n        return NULL;\n      }\n      q->type = type;\n      q->flags = 0;\n      q->next = NULL;\n      /* make previous pbuf point to this pbuf */\n      r->next = q;\n      /* set total length of this pbuf and next in chain */\n      LWIP_ASSERT(\"rem_len < max_u16_t\", rem_len < 0xffff);\n      q->tot_len = (u16_t)rem_len;\n      /* this pbuf length is pool size, unless smaller sized tail */\n      q->len = LWIP_MIN((u16_t)rem_len, PBUF_POOL_BUFSIZE_ALIGNED);\n      q->payload = (void *)((u8_t *)q + SIZEOF_STRUCT_PBUF);\n      LWIP_ASSERT(\"pbuf_alloc: pbuf q->payload properly aligned\",\n              ((mem_ptr_t)q->payload % MEM_ALIGNMENT) == 0);\n      LWIP_ASSERT(\"check p->payload + p->len does not overflow pbuf\",\n                  ((u8_t*)p->payload + p->len <=\n                   (u8_t*)p + SIZEOF_STRUCT_PBUF + PBUF_POOL_BUFSIZE_ALIGNED));\n      q->ref = 1;\n      /* calculate remaining length to be allocated */\n      rem_len -= q->len;\n      /* remember this pbuf for linkage in next iteration */\n      r = q;\n    }\n    /* end of chain */\n    /*r->next = NULL;*/\n\n    break;\n  case PBUF_RAM:\n    {\n      mem_size_t alloc_len = LWIP_MEM_ALIGN_SIZE(SIZEOF_STRUCT_PBUF + offset) + LWIP_MEM_ALIGN_SIZE(length);\n      \n      /* bug #50040: Check for integer overflow when calculating alloc_len */\n      if (alloc_len < LWIP_MEM_ALIGN_SIZE(length)) {\n        return NULL;\n      }\n    \n      /* If pbuf is to be allocated in RAM, allocate memory for it. */\n      p = (struct pbuf*)mem_malloc(alloc_len);\n    }\n\n    if (p == NULL) {\n      return NULL;\n    }\n    /* Set up internal structure of the pbuf. */\n    p->payload = LWIP_MEM_ALIGN((void *)((u8_t *)p + SIZEOF_STRUCT_PBUF + offset));\n    p->len = p->tot_len = length;\n    p->next = NULL;\n    p->type = type;\n\n    LWIP_ASSERT(\"pbuf_alloc: pbuf->payload properly aligned\",\n           ((mem_ptr_t)p->payload % MEM_ALIGNMENT) == 0);\n    break;\n  /* pbuf references existing (non-volatile static constant) ROM payload? */\n  case PBUF_ROM:\n  /* pbuf references existing (externally allocated) RAM payload? */\n  case PBUF_REF:\n    /* only allocate memory for the pbuf structure */\n    p = (struct pbuf *)memp_malloc(MEMP_PBUF);\n    if (p == NULL) {\n      LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n                  (\"pbuf_alloc: Could not allocate MEMP_PBUF for PBUF_%s.\\n\",\n                  (type == PBUF_ROM) ? \"ROM\" : \"REF\"));\n      return NULL;\n    }\n    /* caller must set this field properly, afterwards */\n    p->payload = NULL;\n    p->len = p->tot_len = length;\n    p->next = NULL;\n    p->type = type;\n    break;\n  default:\n    LWIP_ASSERT(\"pbuf_alloc: erroneous type\", 0);\n    return NULL;\n  }\n  /* set reference count */\n  p->ref = 1;\n  /* set flags */\n  p->flags = 0;\n  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_alloc(length=%\"U16_F\") == %p\\n\", length, (void *)p));\n  return p;\n}\n\n#if LWIP_SUPPORT_CUSTOM_PBUF\n/**\n * @ingroup pbuf\n * Initialize a custom pbuf (already allocated).\n *\n * @param l flag to define header size\n * @param length size of the pbuf's payload\n * @param type type of the pbuf (only used to treat the pbuf accordingly, as\n *        this function allocates no memory)\n * @param p pointer to the custom pbuf to initialize (already allocated)\n * @param payload_mem pointer to the buffer that is used for payload and headers,\n *        must be at least big enough to hold 'length' plus the header size,\n *        may be NULL if set later.\n *        ATTENTION: The caller is responsible for correct alignment of this buffer!!\n * @param payload_mem_len the size of the 'payload_mem' buffer, must be at least\n *        big enough to hold 'length' plus the header size\n */\nstruct pbuf*\npbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type, struct pbuf_custom *p,\n                    void *payload_mem, u16_t payload_mem_len)\n{\n  u16_t offset;\n  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_alloced_custom(length=%\"U16_F\")\\n\", length));\n\n  /* determine header offset */\n  switch (l) {\n  case PBUF_TRANSPORT:\n    /* add room for transport (often TCP) layer header */\n    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN;\n    break;\n  case PBUF_IP:\n    /* add room for IP layer header */\n    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN;\n    break;\n  case PBUF_LINK:\n    /* add room for link layer header */\n    offset = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN;\n    break;\n  case PBUF_RAW_TX:\n    /* add room for encapsulating link layer headers (e.g. 802.11) */\n    offset = PBUF_LINK_ENCAPSULATION_HLEN;\n    break;\n  case PBUF_RAW:\n    offset = 0;\n    break;\n  default:\n    LWIP_ASSERT(\"pbuf_alloced_custom: bad pbuf layer\", 0);\n    return NULL;\n  }\n\n  if (LWIP_MEM_ALIGN_SIZE(offset) + length > payload_mem_len) {\n    LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_WARNING, (\"pbuf_alloced_custom(length=%\"U16_F\") buffer too short\\n\", length));\n    return NULL;\n  }\n\n  p->pbuf.next = NULL;\n  if (payload_mem != NULL) {\n    p->pbuf.payload = (u8_t *)payload_mem + LWIP_MEM_ALIGN_SIZE(offset);\n  } else {\n    p->pbuf.payload = NULL;\n  }\n  p->pbuf.flags = PBUF_FLAG_IS_CUSTOM;\n  p->pbuf.len = p->pbuf.tot_len = length;\n  p->pbuf.type = type;\n  p->pbuf.ref = 1;\n  return &p->pbuf;\n}\n#endif /* LWIP_SUPPORT_CUSTOM_PBUF */\n\n/**\n * @ingroup pbuf\n * Shrink a pbuf chain to a desired length.\n *\n * @param p pbuf to shrink.\n * @param new_len desired new length of pbuf chain\n *\n * Depending on the desired length, the first few pbufs in a chain might\n * be skipped and left unchanged. The new last pbuf in the chain will be\n * resized, and any remaining pbufs will be freed.\n *\n * @note If the pbuf is ROM/REF, only the ->tot_len and ->len fields are adjusted.\n * @note May not be called on a packet queue.\n *\n * @note Despite its name, pbuf_realloc cannot grow the size of a pbuf (chain).\n */\nvoid\npbuf_realloc(struct pbuf *p, u16_t new_len)\n{\n  struct pbuf *q;\n  u16_t rem_len; /* remaining length */\n  s32_t grow;\n\n  LWIP_ASSERT(\"pbuf_realloc: p != NULL\", p != NULL);\n  LWIP_ASSERT(\"pbuf_realloc: sane p->type\", p->type == PBUF_POOL ||\n              p->type == PBUF_ROM ||\n              p->type == PBUF_RAM ||\n              p->type == PBUF_REF);\n\n  /* desired length larger than current length? */\n  if (new_len >= p->tot_len) {\n    /* enlarging not yet supported */\n    return;\n  }\n\n  /* the pbuf chain grows by (new_len - p->tot_len) bytes\n   * (which may be negative in case of shrinking) */\n  grow = new_len - p->tot_len;\n\n  /* first, step over any pbufs that should remain in the chain */\n  rem_len = new_len;\n  q = p;\n  /* should this pbuf be kept? */\n  while (rem_len > q->len) {\n    /* decrease remaining length by pbuf length */\n    rem_len -= q->len;\n    /* decrease total length indicator */\n    LWIP_ASSERT(\"grow < max_u16_t\", grow < 0xffff);\n    q->tot_len += (u16_t)grow;\n    /* proceed to next pbuf in chain */\n    q = q->next;\n    LWIP_ASSERT(\"pbuf_realloc: q != NULL\", q != NULL);\n  }\n  /* we have now reached the new last pbuf (in q) */\n  /* rem_len == desired length for pbuf q */\n\n  /* shrink allocated memory for PBUF_RAM */\n  /* (other types merely adjust their length fields */\n  if ((q->type == PBUF_RAM) && (rem_len != q->len)\n#if LWIP_SUPPORT_CUSTOM_PBUF\n      && ((q->flags & PBUF_FLAG_IS_CUSTOM) == 0)\n#endif /* LWIP_SUPPORT_CUSTOM_PBUF */\n     ) {\n    /* reallocate and adjust the length of the pbuf that will be split */\n    q = (struct pbuf *)mem_trim(q, (u16_t)((u8_t *)q->payload - (u8_t *)q) + rem_len);\n    LWIP_ASSERT(\"mem_trim returned q == NULL\", q != NULL);\n  }\n  /* adjust length fields for new last pbuf */\n  q->len = rem_len;\n  q->tot_len = q->len;\n\n  /* any remaining pbufs in chain? */\n  if (q->next != NULL) {\n    /* free remaining pbufs in chain */\n    pbuf_free(q->next);\n  }\n  /* q is last packet in chain */\n  q->next = NULL;\n\n}\n\n/**\n * Adjusts the payload pointer to hide or reveal headers in the payload.\n * @see pbuf_header.\n *\n * @param p pbuf to change the header size.\n * @param header_size_increment Number of bytes to increment header size.\n * @param force Allow 'header_size_increment > 0' for PBUF_REF/PBUF_ROM types\n *\n * @return non-zero on failure, zero on success.\n *\n */\nstatic u8_t\npbuf_header_impl(struct pbuf *p, s16_t header_size_increment, u8_t force)\n{\n  u16_t type;\n  void *payload;\n  u16_t increment_magnitude;\n\n  LWIP_ASSERT(\"p != NULL\", p != NULL);\n  if ((header_size_increment == 0) || (p == NULL)) {\n    return 0;\n  }\n\n  if (header_size_increment < 0) {\n    increment_magnitude = (u16_t)-header_size_increment;\n    /* Check that we aren't going to move off the end of the pbuf */\n    LWIP_ERROR(\"increment_magnitude <= p->len\", (increment_magnitude <= p->len), return 1;);\n  } else {\n    increment_magnitude = (u16_t)header_size_increment;\n#if 0\n    /* Can't assert these as some callers speculatively call\n         pbuf_header() to see if it's OK.  Will return 1 below instead. */\n    /* Check that we've got the correct type of pbuf to work with */\n    LWIP_ASSERT(\"p->type == PBUF_RAM || p->type == PBUF_POOL\",\n                p->type == PBUF_RAM || p->type == PBUF_POOL);\n    /* Check that we aren't going to move off the beginning of the pbuf */\n    LWIP_ASSERT(\"p->payload - increment_magnitude >= p + SIZEOF_STRUCT_PBUF\",\n                (u8_t *)p->payload - increment_magnitude >= (u8_t *)p + SIZEOF_STRUCT_PBUF);\n#endif\n  }\n\n  type = p->type;\n  /* remember current payload pointer */\n  payload = p->payload;\n\n  /* pbuf types containing payloads? */\n  if (type == PBUF_RAM || type == PBUF_POOL) {\n    /* set new payload pointer */\n    p->payload = (u8_t *)p->payload - header_size_increment;\n    /* boundary check fails? */\n    if ((u8_t *)p->payload < (u8_t *)p + SIZEOF_STRUCT_PBUF) {\n      LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE,\n        (\"pbuf_header: failed as %p < %p (not enough space for new header size)\\n\",\n        (void *)p->payload, (void *)((u8_t *)p + SIZEOF_STRUCT_PBUF)));\n      /* restore old payload pointer */\n      p->payload = payload;\n      /* bail out unsuccessfully */\n      return 1;\n    }\n  /* pbuf types referring to external payloads? */\n  } else if (type == PBUF_REF || type == PBUF_ROM) {\n    /* hide a header in the payload? */\n    if ((header_size_increment < 0) && (increment_magnitude <= p->len)) {\n      /* increase payload pointer */\n      p->payload = (u8_t *)p->payload - header_size_increment;\n    } else if ((header_size_increment > 0) && force) {\n      p->payload = (u8_t *)p->payload - header_size_increment;\n    } else {\n      /* cannot expand payload to front (yet!)\n       * bail out unsuccessfully */\n      return 1;\n    }\n  } else {\n    /* Unknown type */\n    LWIP_ASSERT(\"bad pbuf type\", 0);\n    return 1;\n  }\n  /* modify pbuf length fields */\n  p->len += header_size_increment;\n  p->tot_len += header_size_increment;\n\n  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_header: old %p new %p (%\"S16_F\")\\n\",\n    (void *)payload, (void *)p->payload, header_size_increment));\n\n  return 0;\n}\n\n/**\n * Adjusts the payload pointer to hide or reveal headers in the payload.\n *\n * Adjusts the ->payload pointer so that space for a header\n * (dis)appears in the pbuf payload.\n *\n * The ->payload, ->tot_len and ->len fields are adjusted.\n *\n * @param p pbuf to change the header size.\n * @param header_size_increment Number of bytes to increment header size which\n * increases the size of the pbuf. New space is on the front.\n * (Using a negative value decreases the header size.)\n * If hdr_size_inc is 0, this function does nothing and returns successful.\n *\n * PBUF_ROM and PBUF_REF type buffers cannot have their sizes increased, so\n * the call will fail. A check is made that the increase in header size does\n * not move the payload pointer in front of the start of the buffer.\n * @return non-zero on failure, zero on success.\n *\n */\nu8_t\npbuf_header(struct pbuf *p, s16_t header_size_increment)\n{\n   return pbuf_header_impl(p, header_size_increment, 0);\n}\n\n/**\n * Same as pbuf_header but does not check if 'header_size > 0' is allowed.\n * This is used internally only, to allow PBUF_REF for RX.\n */\nu8_t\npbuf_header_force(struct pbuf *p, s16_t header_size_increment)\n{\n   return pbuf_header_impl(p, header_size_increment, 1);\n}\n\n/**\n * @ingroup pbuf\n * Dereference a pbuf chain or queue and deallocate any no-longer-used\n * pbufs at the head of this chain or queue.\n *\n * Decrements the pbuf reference count. If it reaches zero, the pbuf is\n * deallocated.\n *\n * For a pbuf chain, this is repeated for each pbuf in the chain,\n * up to the first pbuf which has a non-zero reference count after\n * decrementing. So, when all reference counts are one, the whole\n * chain is free'd.\n *\n * @param p The pbuf (chain) to be dereferenced.\n *\n * @return the number of pbufs that were de-allocated\n * from the head of the chain.\n *\n * @note MUST NOT be called on a packet queue (Not verified to work yet).\n * @note the reference counter of a pbuf equals the number of pointers\n * that refer to the pbuf (or into the pbuf).\n *\n * @internal examples:\n *\n * Assuming existing chains a->b->c with the following reference\n * counts, calling pbuf_free(a) results in:\n *\n * 1->2->3 becomes ...1->3\n * 3->3->3 becomes 2->3->3\n * 1->1->2 becomes ......1\n * 2->1->1 becomes 1->1->1\n * 1->1->1 becomes .......\n *\n */\nu8_t\npbuf_free(struct pbuf *p)\n{\n  u16_t type;\n  struct pbuf *q;\n  u8_t count;\n\n  if (p == NULL) {\n    LWIP_ASSERT(\"p != NULL\", p != NULL);\n    /* if assertions are disabled, proceed with debug output */\n    LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n      (\"pbuf_free(p == NULL) was called.\\n\"));\n    return 0;\n  }\n  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_free(%p)\\n\", (void *)p));\n\n  PERF_START;\n\n  LWIP_ASSERT(\"pbuf_free: sane type\",\n    p->type == PBUF_RAM || p->type == PBUF_ROM ||\n    p->type == PBUF_REF || p->type == PBUF_POOL);\n\n  count = 0;\n  /* de-allocate all consecutive pbufs from the head of the chain that\n   * obtain a zero reference count after decrementing*/\n  while (p != NULL) {\n    u16_t ref;\n    SYS_ARCH_DECL_PROTECT(old_level);\n    /* Since decrementing ref cannot be guaranteed to be a single machine operation\n     * we must protect it. We put the new ref into a local variable to prevent\n     * further protection. */\n    SYS_ARCH_PROTECT(old_level);\n    /* all pbufs in a chain are referenced at least once */\n    LWIP_ASSERT(\"pbuf_free: p->ref > 0\", p->ref > 0);\n    /* decrease reference count (number of pointers to pbuf) */\n    ref = --(p->ref);\n    SYS_ARCH_UNPROTECT(old_level);\n    /* this pbuf is no longer referenced to? */\n    if (ref == 0) {\n      /* remember next pbuf in chain for next iteration */\n      q = p->next;\n      LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_free: deallocating %p\\n\", (void *)p));\n      type = p->type;\n#if LWIP_SUPPORT_CUSTOM_PBUF\n      /* is this a custom pbuf? */\n      if ((p->flags & PBUF_FLAG_IS_CUSTOM) != 0) {\n        struct pbuf_custom *pc = (struct pbuf_custom*)p;\n        LWIP_ASSERT(\"pc->custom_free_function != NULL\", pc->custom_free_function != NULL);\n        pc->custom_free_function(p);\n      } else\n#endif /* LWIP_SUPPORT_CUSTOM_PBUF */\n      {\n        /* is this a pbuf from the pool? */\n        if (type == PBUF_POOL) {\n          memp_free(MEMP_PBUF_POOL, p);\n        /* is this a ROM or RAM referencing pbuf? */\n        } else if (type == PBUF_ROM || type == PBUF_REF) {\n          memp_free(MEMP_PBUF, p);\n        /* type == PBUF_RAM */\n        } else {\n          mem_free(p);\n        }\n      }\n      count++;\n      /* proceed to next pbuf */\n      p = q;\n    /* p->ref > 0, this pbuf is still referenced to */\n    /* (and so the remaining pbufs in chain as well) */\n    } else {\n      LWIP_DEBUGF( PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_free: %p has ref %\"U16_F\", ending here.\\n\", (void *)p, ref));\n      /* stop walking through the chain */\n      p = NULL;\n    }\n  }\n  PERF_STOP(\"pbuf_free\");\n  /* return number of de-allocated pbufs */\n  return count;\n}\n\n/**\n * Count number of pbufs in a chain\n *\n * @param p first pbuf of chain\n * @return the number of pbufs in a chain\n */\nu16_t\npbuf_clen(const struct pbuf *p)\n{\n  u16_t len;\n\n  len = 0;\n  while (p != NULL) {\n    ++len;\n    p = p->next;\n  }\n  return len;\n}\n\n/**\n * @ingroup pbuf\n * Increment the reference count of the pbuf.\n *\n * @param p pbuf to increase reference counter of\n *\n */\nvoid\npbuf_ref(struct pbuf *p)\n{\n  /* pbuf given? */\n  if (p != NULL) {\n    SYS_ARCH_INC(p->ref, 1);\n    LWIP_ASSERT(\"pbuf ref overflow\", p->ref > 0);\n  }\n}\n\n/**\n * @ingroup pbuf\n * Concatenate two pbufs (each may be a pbuf chain) and take over\n * the caller's reference of the tail pbuf.\n *\n * @note The caller MAY NOT reference the tail pbuf afterwards.\n * Use pbuf_chain() for that purpose.\n *\n * @see pbuf_chain()\n */\nvoid\npbuf_cat(struct pbuf *h, struct pbuf *t)\n{\n  struct pbuf *p;\n\n  LWIP_ERROR(\"(h != NULL) && (t != NULL) (programmer violates API)\",\n             ((h != NULL) && (t != NULL)), return;);\n\n  /* proceed to last pbuf of chain */\n  for (p = h; p->next != NULL; p = p->next) {\n    /* add total length of second chain to all totals of first chain */\n    p->tot_len += t->tot_len;\n  }\n  /* { p is last pbuf of first h chain, p->next == NULL } */\n  LWIP_ASSERT(\"p->tot_len == p->len (of last pbuf in chain)\", p->tot_len == p->len);\n  LWIP_ASSERT(\"p->next == NULL\", p->next == NULL);\n  /* add total length of second chain to last pbuf total of first chain */\n  p->tot_len += t->tot_len;\n  /* chain last pbuf of head (p) with first of tail (t) */\n  p->next = t;\n  /* p->next now references t, but the caller will drop its reference to t,\n   * so netto there is no change to the reference count of t.\n   */\n}\n\n/**\n * @ingroup pbuf\n * Chain two pbufs (or pbuf chains) together.\n *\n * The caller MUST call pbuf_free(t) once it has stopped\n * using it. Use pbuf_cat() instead if you no longer use t.\n *\n * @param h head pbuf (chain)\n * @param t tail pbuf (chain)\n * @note The pbufs MUST belong to the same packet.\n * @note MAY NOT be called on a packet queue.\n *\n * The ->tot_len fields of all pbufs of the head chain are adjusted.\n * The ->next field of the last pbuf of the head chain is adjusted.\n * The ->ref field of the first pbuf of the tail chain is adjusted.\n *\n */\nvoid\npbuf_chain(struct pbuf *h, struct pbuf *t)\n{\n  pbuf_cat(h, t);\n  /* t is now referenced by h */\n  pbuf_ref(t);\n  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_chain: %p references %p\\n\", (void *)h, (void *)t));\n}\n\n/**\n * Dechains the first pbuf from its succeeding pbufs in the chain.\n *\n * Makes p->tot_len field equal to p->len.\n * @param p pbuf to dechain\n * @return remainder of the pbuf chain, or NULL if it was de-allocated.\n * @note May not be called on a packet queue.\n */\nstruct pbuf *\npbuf_dechain(struct pbuf *p)\n{\n  struct pbuf *q;\n  u8_t tail_gone = 1;\n  /* tail */\n  q = p->next;\n  /* pbuf has successor in chain? */\n  if (q != NULL) {\n    /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */\n    LWIP_ASSERT(\"p->tot_len == p->len + q->tot_len\", q->tot_len == p->tot_len - p->len);\n    /* enforce invariant if assertion is disabled */\n    q->tot_len = p->tot_len - p->len;\n    /* decouple pbuf from remainder */\n    p->next = NULL;\n    /* total length of pbuf p is its own length only */\n    p->tot_len = p->len;\n    /* q is no longer referenced by p, free it */\n    LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_dechain: unreferencing %p\\n\", (void *)q));\n    tail_gone = pbuf_free(q);\n    if (tail_gone > 0) {\n      LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE,\n                  (\"pbuf_dechain: deallocated %p (as it is no longer referenced)\\n\", (void *)q));\n    }\n    /* return remaining tail or NULL if deallocated */\n  }\n  /* assert tot_len invariant: (p->tot_len == p->len + (p->next? p->next->tot_len: 0) */\n  LWIP_ASSERT(\"p->tot_len == p->len\", p->tot_len == p->len);\n  return ((tail_gone > 0) ? NULL : q);\n}\n\n/**\n * @ingroup pbuf\n * Create PBUF_RAM copies of pbufs.\n *\n * Used to queue packets on behalf of the lwIP stack, such as\n * ARP based queueing.\n *\n * @note You MUST explicitly use p = pbuf_take(p);\n *\n * @note Only one packet is copied, no packet queue!\n *\n * @param p_to pbuf destination of the copy\n * @param p_from pbuf source of the copy\n *\n * @return ERR_OK if pbuf was copied\n *         ERR_ARG if one of the pbufs is NULL or p_to is not big\n *                 enough to hold p_from\n */\nerr_t\npbuf_copy(struct pbuf *p_to, const struct pbuf *p_from)\n{\n  u16_t offset_to=0, offset_from=0, len;\n\n  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_copy(%p, %p)\\n\",\n    (const void*)p_to, (const void*)p_from));\n\n  /* is the target big enough to hold the source? */\n  LWIP_ERROR(\"pbuf_copy: target not big enough to hold source\", ((p_to != NULL) &&\n             (p_from != NULL) && (p_to->tot_len >= p_from->tot_len)), return ERR_ARG;);\n\n  /* iterate through pbuf chain */\n  do\n  {\n    /* copy one part of the original chain */\n    if ((p_to->len - offset_to) >= (p_from->len - offset_from)) {\n      /* complete current p_from fits into current p_to */\n      len = p_from->len - offset_from;\n    } else {\n      /* current p_from does not fit into current p_to */\n      len = p_to->len - offset_to;\n    }\n    MEMCPY((u8_t*)p_to->payload + offset_to, (u8_t*)p_from->payload + offset_from, len);\n    offset_to += len;\n    offset_from += len;\n    LWIP_ASSERT(\"offset_to <= p_to->len\", offset_to <= p_to->len);\n    LWIP_ASSERT(\"offset_from <= p_from->len\", offset_from <= p_from->len);\n    if (offset_from >= p_from->len) {\n      /* on to next p_from (if any) */\n      offset_from = 0;\n      p_from = p_from->next;\n    }\n    if (offset_to == p_to->len) {\n      /* on to next p_to (if any) */\n      offset_to = 0;\n      p_to = p_to->next;\n      LWIP_ERROR(\"p_to != NULL\", (p_to != NULL) || (p_from == NULL) , return ERR_ARG;);\n    }\n\n    if ((p_from != NULL) && (p_from->len == p_from->tot_len)) {\n      /* don't copy more than one packet! */\n      LWIP_ERROR(\"pbuf_copy() does not allow packet queues!\",\n                 (p_from->next == NULL), return ERR_VAL;);\n    }\n    if ((p_to != NULL) && (p_to->len == p_to->tot_len)) {\n      /* don't copy more than one packet! */\n      LWIP_ERROR(\"pbuf_copy() does not allow packet queues!\",\n                  (p_to->next == NULL), return ERR_VAL;);\n    }\n  } while (p_from);\n  LWIP_DEBUGF(PBUF_DEBUG | LWIP_DBG_TRACE, (\"pbuf_copy: end of chain reached.\\n\"));\n  return ERR_OK;\n}\n\n/**\n * @ingroup pbuf\n * Copy (part of) the contents of a packet buffer\n * to an application supplied buffer.\n *\n * @param buf the pbuf from which to copy data\n * @param dataptr the application supplied buffer\n * @param len length of data to copy (dataptr must be big enough). No more\n * than buf->tot_len will be copied, irrespective of len\n * @param offset offset into the packet buffer from where to begin copying len bytes\n * @return the number of bytes copied, or 0 on failure\n */\nu16_t\npbuf_copy_partial(const struct pbuf *buf, void *dataptr, u16_t len, u16_t offset)\n{\n  const struct pbuf *p;\n  u16_t left;\n  u16_t buf_copy_len;\n  u16_t copied_total = 0;\n\n  LWIP_ERROR(\"pbuf_copy_partial: invalid buf\", (buf != NULL), return 0;);\n  LWIP_ERROR(\"pbuf_copy_partial: invalid dataptr\", (dataptr != NULL), return 0;);\n\n  left = 0;\n\n  if ((buf == NULL) || (dataptr == NULL)) {\n    return 0;\n  }\n\n  /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */\n  for (p = buf; len != 0 && p != NULL; p = p->next) {\n    if ((offset != 0) && (offset >= p->len)) {\n      /* don't copy from this buffer -> on to the next */\n      offset -= p->len;\n    } else {\n      /* copy from this buffer. maybe only partially. */\n      buf_copy_len = p->len - offset;\n      if (buf_copy_len > len) {\n        buf_copy_len = len;\n      }\n      /* copy the necessary parts of the buffer */\n      MEMCPY(&((char*)dataptr)[left], &((char*)p->payload)[offset], buf_copy_len);\n      copied_total += buf_copy_len;\n      left += buf_copy_len;\n      len -= buf_copy_len;\n      offset = 0;\n    }\n  }\n  return copied_total;\n}\n\n#if LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\n/**\n * This method modifies a 'pbuf chain', so that its total length is\n * smaller than 64K. The remainder of the original pbuf chain is stored\n * in *rest.\n * This function never creates new pbufs, but splits an existing chain\n * in two parts. The tot_len of the modified packet queue will likely be\n * smaller than 64K.\n * 'packet queues' are not supported by this function.\n *\n * @param p the pbuf queue to be split\n * @param rest pointer to store the remainder (after the first 64K)\n */\nvoid pbuf_split_64k(struct pbuf *p, struct pbuf **rest)\n{\n  *rest = NULL;\n  if ((p != NULL) && (p->next != NULL)) {\n    u16_t tot_len_front = p->len;\n    struct pbuf *i = p;\n    struct pbuf *r = p->next;\n\n    /* continue until the total length (summed up as u16_t) overflows */\n    while ((r != NULL) && ((u16_t)(tot_len_front + r->len) > tot_len_front)) {\n      tot_len_front += r->len;\n      i = r;\n      r = r->next;\n    }\n    /* i now points to last packet of the first segment. Set next\n       pointer to NULL */\n    i->next = NULL;\n\n    if (r != NULL) {\n      /* Update the tot_len field in the first part */\n      for (i = p; i != NULL; i = i->next) {\n        i->tot_len -= r->tot_len;\n        LWIP_ASSERT(\"tot_len/len mismatch in last pbuf\",\n                    (i->next != NULL) || (i->tot_len == i->len));\n      }\n      if (p->flags & PBUF_FLAG_TCP_FIN) {\n        r->flags |= PBUF_FLAG_TCP_FIN;\n      }\n\n      /* tot_len field in rest does not need modifications */\n      /* reference counters do not need modifications */\n      *rest = r;\n    }\n  }\n}\n#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n\n/* Actual implementation of pbuf_skip() but returning const pointer... */\nstatic const struct pbuf*\npbuf_skip_const(const struct pbuf* in, u16_t in_offset, u16_t* out_offset)\n{\n  u16_t offset_left = in_offset;\n  const struct pbuf* q = in;\n\n  /* get the correct pbuf */\n  while ((q != NULL) && (q->len <= offset_left)) {\n    offset_left -= q->len;\n    q = q->next;\n  }\n  if (out_offset != NULL) {\n    *out_offset = offset_left;\n  }\n  return q;\n}\n\n/**\n * @ingroup pbuf\n * Skip a number of bytes at the start of a pbuf\n *\n * @param in input pbuf\n * @param in_offset offset to skip\n * @param out_offset resulting offset in the returned pbuf\n * @return the pbuf in the queue where the offset is\n */\nstruct pbuf*\npbuf_skip(struct pbuf* in, u16_t in_offset, u16_t* out_offset)\n{\n  const struct pbuf* out = pbuf_skip_const(in, in_offset, out_offset);\n  return LWIP_CONST_CAST(struct pbuf*, out);\n}\n\n/**\n * @ingroup pbuf\n * Copy application supplied data into a pbuf.\n * This function can only be used to copy the equivalent of buf->tot_len data.\n *\n * @param buf pbuf to fill with data\n * @param dataptr application supplied data buffer\n * @param len length of the application supplied data buffer\n *\n * @return ERR_OK if successful, ERR_MEM if the pbuf is not big enough\n */\nerr_t\npbuf_take(struct pbuf *buf, const void *dataptr, u16_t len)\n{\n  struct pbuf *p;\n  u16_t buf_copy_len;\n  u16_t total_copy_len = len;\n  u16_t copied_total = 0;\n\n  LWIP_ERROR(\"pbuf_take: invalid buf\", (buf != NULL), return ERR_ARG;);\n  LWIP_ERROR(\"pbuf_take: invalid dataptr\", (dataptr != NULL), return ERR_ARG;);\n  LWIP_ERROR(\"pbuf_take: buf not large enough\", (buf->tot_len >= len), return ERR_MEM;);\n\n  if ((buf == NULL) || (dataptr == NULL) || (buf->tot_len < len)) {\n    return ERR_ARG;\n  }\n\n  /* Note some systems use byte copy if dataptr or one of the pbuf payload pointers are unaligned. */\n  for (p = buf; total_copy_len != 0; p = p->next) {\n    LWIP_ASSERT(\"pbuf_take: invalid pbuf\", p != NULL);\n    buf_copy_len = total_copy_len;\n    if (buf_copy_len > p->len) {\n      /* this pbuf cannot hold all remaining data */\n      buf_copy_len = p->len;\n    }\n    /* copy the necessary parts of the buffer */\n    MEMCPY(p->payload, &((const char*)dataptr)[copied_total], buf_copy_len);\n    total_copy_len -= buf_copy_len;\n    copied_total += buf_copy_len;\n  }\n  LWIP_ASSERT(\"did not copy all data\", total_copy_len == 0 && copied_total == len);\n  return ERR_OK;\n}\n\n/**\n * @ingroup pbuf\n * Same as pbuf_take() but puts data at an offset\n *\n * @param buf pbuf to fill with data\n * @param dataptr application supplied data buffer\n * @param len length of the application supplied data buffer\n * @param offset offset in pbuf where to copy dataptr to\n *\n * @return ERR_OK if successful, ERR_MEM if the pbuf is not big enough\n */\nerr_t\npbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset)\n{\n  u16_t target_offset;\n  struct pbuf* q = pbuf_skip(buf, offset, &target_offset);\n\n  /* return requested data if pbuf is OK */\n  if ((q != NULL) && (q->tot_len >= target_offset + len)) {\n    u16_t remaining_len = len;\n    const u8_t* src_ptr = (const u8_t*)dataptr;\n    /* copy the part that goes into the first pbuf */\n    u16_t first_copy_len = LWIP_MIN(q->len - target_offset, len);\n    MEMCPY(((u8_t*)q->payload) + target_offset, dataptr, first_copy_len);\n    remaining_len -= first_copy_len;\n    src_ptr += first_copy_len;\n    if (remaining_len > 0) {\n      return pbuf_take(q->next, src_ptr, remaining_len);\n    }\n    return ERR_OK;\n  }\n  return ERR_MEM;\n}\n\n/**\n * @ingroup pbuf\n * Creates a single pbuf out of a queue of pbufs.\n *\n * @remark: Either the source pbuf 'p' is freed by this function or the original\n *          pbuf 'p' is returned, therefore the caller has to check the result!\n *\n * @param p the source pbuf\n * @param layer pbuf_layer of the new pbuf\n *\n * @return a new, single pbuf (p->next is NULL)\n *         or the old pbuf if allocation fails\n */\nstruct pbuf*\npbuf_coalesce(struct pbuf *p, pbuf_layer layer)\n{\n  struct pbuf *q;\n  err_t err;\n  if (p->next == NULL) {\n    return p;\n  }\n  q = pbuf_alloc(layer, p->tot_len, PBUF_RAM);\n  if (q == NULL) {\n    /* @todo: what do we do now? */\n    return p;\n  }\n  err = pbuf_copy(q, p);\n  LWIP_UNUSED_ARG(err); /* in case of LWIP_NOASSERT */\n  LWIP_ASSERT(\"pbuf_copy failed\", err == ERR_OK);\n  pbuf_free(p);\n  return q;\n}\n\n#if LWIP_CHECKSUM_ON_COPY\n/**\n * Copies data into a single pbuf (*not* into a pbuf queue!) and updates\n * the checksum while copying\n *\n * @param p the pbuf to copy data into\n * @param start_offset offset of p->payload where to copy the data to\n * @param dataptr data to copy into the pbuf\n * @param len length of data to copy into the pbuf\n * @param chksum pointer to the checksum which is updated\n * @return ERR_OK if successful, another error if the data does not fit\n *         within the (first) pbuf (no pbuf queues!)\n */\nerr_t\npbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr,\n                 u16_t len, u16_t *chksum)\n{\n  u32_t acc;\n  u16_t copy_chksum;\n  char *dst_ptr;\n  LWIP_ASSERT(\"p != NULL\", p != NULL);\n  LWIP_ASSERT(\"dataptr != NULL\", dataptr != NULL);\n  LWIP_ASSERT(\"chksum != NULL\", chksum != NULL);\n  LWIP_ASSERT(\"len != 0\", len != 0);\n\n  if ((start_offset >= p->len) || (start_offset + len > p->len)) {\n    return ERR_ARG;\n  }\n\n  dst_ptr = ((char*)p->payload) + start_offset;\n  copy_chksum = LWIP_CHKSUM_COPY(dst_ptr, dataptr, len);\n  if ((start_offset & 1) != 0) {\n    copy_chksum = SWAP_BYTES_IN_WORD(copy_chksum);\n  }\n  acc = *chksum;\n  acc += copy_chksum;\n  *chksum = FOLD_U32T(acc);\n  return ERR_OK;\n}\n#endif /* LWIP_CHECKSUM_ON_COPY */\n\n/**\n * @ingroup pbuf\n * Get one byte from the specified position in a pbuf\n * WARNING: returns zero for offset >= p->tot_len\n *\n * @param p pbuf to parse\n * @param offset offset into p of the byte to return\n * @return byte at an offset into p OR ZERO IF 'offset' >= p->tot_len\n */\nu8_t\npbuf_get_at(const struct pbuf* p, u16_t offset)\n{\n  int ret = pbuf_try_get_at(p, offset);\n  if (ret >= 0) {\n    return (u8_t)ret;\n  }\n  return 0;\n}\n\n/**\n * @ingroup pbuf\n * Get one byte from the specified position in a pbuf\n *\n * @param p pbuf to parse\n * @param offset offset into p of the byte to return\n * @return byte at an offset into p [0..0xFF] OR negative if 'offset' >= p->tot_len\n */\nint\npbuf_try_get_at(const struct pbuf* p, u16_t offset)\n{\n  u16_t q_idx;\n  const struct pbuf* q = pbuf_skip_const(p, offset, &q_idx);\n\n  /* return requested data if pbuf is OK */\n  if ((q != NULL) && (q->len > q_idx)) {\n    return ((u8_t*)q->payload)[q_idx];\n  }\n  return -1;\n}\n\n/**\n * @ingroup pbuf\n * Put one byte to the specified position in a pbuf\n * WARNING: silently ignores offset >= p->tot_len\n *\n * @param p pbuf to fill\n * @param offset offset into p of the byte to write\n * @param data byte to write at an offset into p\n */\nvoid\npbuf_put_at(struct pbuf* p, u16_t offset, u8_t data)\n{\n  u16_t q_idx;\n  struct pbuf* q = pbuf_skip(p, offset, &q_idx);\n\n  /* write requested data if pbuf is OK */\n  if ((q != NULL) && (q->len > q_idx)) {\n    ((u8_t*)q->payload)[q_idx] = data;\n  }\n}\n\n/**\n * @ingroup pbuf\n * Compare pbuf contents at specified offset with memory s2, both of length n\n *\n * @param p pbuf to compare\n * @param offset offset into p at which to start comparing\n * @param s2 buffer to compare\n * @param n length of buffer to compare\n * @return zero if equal, nonzero otherwise\n *         (0xffff if p is too short, diffoffset+1 otherwise)\n */\nu16_t\npbuf_memcmp(const struct pbuf* p, u16_t offset, const void* s2, u16_t n)\n{\n  u16_t start = offset;\n  const struct pbuf* q = p;\n  u16_t i;\n \n  /* pbuf long enough to perform check? */\n  if(p->tot_len < (offset + n)) {\n    return 0xffff;\n  }\n \n  /* get the correct pbuf from chain. We know it succeeds because of p->tot_len check above. */\n  while ((q != NULL) && (q->len <= start)) {\n    start -= q->len;\n    q = q->next;\n  }\n \n  /* return requested data if pbuf is OK */\n  for (i = 0; i < n; i++) {\n    /* We know pbuf_get_at() succeeds because of p->tot_len check above. */\n    u8_t a = pbuf_get_at(q, start + i);\n    u8_t b = ((const u8_t*)s2)[i];\n    if (a != b) {\n      return i+1;\n    }\n  }\n  return 0;\n}\n\n/**\n * @ingroup pbuf\n * Find occurrence of mem (with length mem_len) in pbuf p, starting at offset\n * start_offset.\n *\n * @param p pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as\n *        return value 'not found'\n * @param mem search for the contents of this buffer\n * @param mem_len length of 'mem'\n * @param start_offset offset into p at which to start searching\n * @return 0xFFFF if substr was not found in p or the index where it was found\n */\nu16_t\npbuf_memfind(const struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset)\n{\n  u16_t i;\n  u16_t max = p->tot_len - mem_len;\n  if (p->tot_len >= mem_len + start_offset) {\n    for (i = start_offset; i <= max; i++) {\n      u16_t plus = pbuf_memcmp(p, i, mem, mem_len);\n      if (plus == 0) {\n        return i;\n      }\n    }\n  }\n  return 0xFFFF;\n}\n\n/**\n * Find occurrence of substr with length substr_len in pbuf p, start at offset\n * start_offset\n * WARNING: in contrast to strstr(), this one does not stop at the first \\0 in\n * the pbuf/source string!\n *\n * @param p pbuf to search, maximum length is 0xFFFE since 0xFFFF is used as\n *        return value 'not found'\n * @param substr string to search for in p, maximum length is 0xFFFE\n * @return 0xFFFF if substr was not found in p or the index where it was found\n */\nu16_t\npbuf_strstr(const struct pbuf* p, const char* substr)\n{\n  size_t substr_len;\n  if ((substr == NULL) || (substr[0] == 0) || (p->tot_len == 0xFFFF)) {\n    return 0xFFFF;\n  }\n  substr_len = strlen(substr);\n  if (substr_len >= 0xFFFF) {\n    return 0xFFFF;\n  }\n  return pbuf_memfind(p, substr, (u16_t)substr_len, 0);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/raw.c",
    "content": "/**\n * @file\n * Implementation of raw protocol PCBs for low-level handling of\n * different types of protocols besides (or overriding) those\n * already available in lwIP.\\n\n * See also @ref raw_raw\n * \n * @defgroup raw_raw RAW\n * @ingroup callbackstyle_api\n * Implementation of raw protocol PCBs for low-level handling of\n * different types of protocols besides (or overriding) those\n * already available in lwIP.\\n\n * @see @ref raw_api\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/def.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/raw.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/inet_chksum.h\"\n\n#include <string.h>\n\n/** The list of RAW PCBs */\nstatic struct raw_pcb *raw_pcbs;\n\nstatic u8_t\nraw_input_match(struct raw_pcb *pcb, u8_t broadcast)\n{\n  LWIP_UNUSED_ARG(broadcast); /* in IPv6 only case */\n\n#if LWIP_IPV4 && LWIP_IPV6\n  /* Dual-stack: PCBs listening to any IP type also listen to any IP address */\n  if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {\n#if IP_SOF_BROADCAST_RECV\n    if ((broadcast != 0) && !ip_get_option(pcb, SOF_BROADCAST)) {\n      return 0;\n    }\n#endif /* IP_SOF_BROADCAST_RECV */\n    return 1;\n  }\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n  /* Only need to check PCB if incoming IP version matches PCB IP version */\n  if (IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ip_current_dest_addr())) {\n#if LWIP_IPV4\n    /* Special case: IPv4 broadcast: receive all broadcasts\n     * Note: broadcast variable can only be 1 if it is an IPv4 broadcast */\n    if (broadcast != 0) {\n#if IP_SOF_BROADCAST_RECV\n      if (ip_get_option(pcb, SOF_BROADCAST))\n#endif /* IP_SOF_BROADCAST_RECV */\n      {\n        if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip))) {\n          return 1;\n        }\n      }\n    } else\n#endif /* LWIP_IPV4 */\n    /* Handle IPv4 and IPv6: catch all or exact match */\n    if (ip_addr_isany(&pcb->local_ip) ||\n       ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {\n      return 1;\n    }\n  }\n\n  return 0;\n}\n\n/**\n * Determine if in incoming IP packet is covered by a RAW PCB\n * and if so, pass it to a user-provided receive callback function.\n *\n * Given an incoming IP datagram (as a chain of pbufs) this function\n * finds a corresponding RAW PCB and calls the corresponding receive\n * callback function.\n *\n * @param p pbuf to be demultiplexed to a RAW PCB.\n * @param inp network interface on which the datagram was received.\n * @return - 1 if the packet has been eaten by a RAW PCB receive\n *           callback function. The caller MAY NOT not reference the\n *           packet any longer, and MAY NOT call pbuf_free().\n * @return - 0 if packet is not eaten (pbuf is still referenced by the\n *           caller).\n *\n */\nu8_t\nraw_input(struct pbuf *p, struct netif *inp)\n{\n  struct raw_pcb *pcb, *prev;\n  s16_t proto;\n  u8_t eaten = 0;\n  u8_t broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif());\n\n  LWIP_UNUSED_ARG(inp);\n\n#if LWIP_IPV6\n#if LWIP_IPV4\n  if (IP_HDR_GET_VERSION(p->payload) == 6)\n#endif /* LWIP_IPV4 */\n  {\n    struct ip6_hdr *ip6hdr = (struct ip6_hdr *)p->payload;\n    proto = IP6H_NEXTH(ip6hdr);\n  }\n#if LWIP_IPV4\n  else\n#endif /* LWIP_IPV4 */\n#endif /* LWIP_IPV6 */\n#if LWIP_IPV4\n  {\n    proto = IPH_PROTO((struct ip_hdr *)p->payload);\n  }\n#endif /* LWIP_IPV4 */\n\n  prev = NULL;\n  pcb = raw_pcbs;\n  /* loop through all raw pcbs until the packet is eaten by one */\n  /* this allows multiple pcbs to match against the packet by design */\n  while ((eaten == 0) && (pcb != NULL)) {\n    if ((pcb->protocol == proto) && raw_input_match(pcb, broadcast)) {\n      /* receive callback function available? */\n      if (pcb->recv != NULL) {\n#ifndef LWIP_NOASSERT\n        void* old_payload = p->payload;\n#endif\n        /* the receive callback function did not eat the packet? */\n        eaten = pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr());\n        if (eaten != 0) {\n          /* receive function ate the packet */\n          p = NULL;\n          eaten = 1;\n          if (prev != NULL) {\n          /* move the pcb to the front of raw_pcbs so that is\n             found faster next time */\n            prev->next = pcb->next;\n            pcb->next = raw_pcbs;\n            raw_pcbs = pcb;\n          }\n        } else {\n          /* sanity-check that the receive callback did not alter the pbuf */\n          LWIP_ASSERT(\"raw pcb recv callback altered pbuf payload pointer without eating packet\",\n            p->payload == old_payload);\n        }\n      }\n      /* no receive callback function was set for this raw PCB */\n    }\n    /* drop the packet */\n    prev = pcb;\n    pcb = pcb->next;\n  }\n  return eaten;\n}\n\n/**\n * @ingroup raw_raw\n * Bind a RAW PCB.\n *\n * @param pcb RAW PCB to be bound with a local address ipaddr.\n * @param ipaddr local IP address to bind with. Use IP4_ADDR_ANY to\n * bind to all local interfaces.\n *\n * @return lwIP error code.\n * - ERR_OK. Successful. No error occurred.\n * - ERR_USE. The specified IP address is already bound to by\n * another RAW PCB.\n *\n * @see raw_disconnect()\n */\nerr_t\nraw_bind(struct raw_pcb *pcb, const ip_addr_t *ipaddr)\n{\n  if ((pcb == NULL) || (ipaddr == NULL)) {\n    return ERR_VAL;\n  }\n  ip_addr_set_ipaddr(&pcb->local_ip, ipaddr);\n  return ERR_OK;\n}\n\n/**\n * @ingroup raw_raw\n * Connect an RAW PCB. This function is required by upper layers\n * of lwip. Using the raw api you could use raw_sendto() instead\n *\n * This will associate the RAW PCB with the remote address.\n *\n * @param pcb RAW PCB to be connected with remote address ipaddr and port.\n * @param ipaddr remote IP address to connect with.\n *\n * @return lwIP error code\n *\n * @see raw_disconnect() and raw_sendto()\n */\nerr_t\nraw_connect(struct raw_pcb *pcb, const ip_addr_t *ipaddr)\n{\n  if ((pcb == NULL) || (ipaddr == NULL)) {\n    return ERR_VAL;\n  }\n  ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr);\n  return ERR_OK;\n}\n\n/**\n * @ingroup raw_raw\n * Set the callback function for received packets that match the\n * raw PCB's protocol and binding.\n *\n * The callback function MUST either\n * - eat the packet by calling pbuf_free() and returning non-zero. The\n *   packet will not be passed to other raw PCBs or other protocol layers.\n * - not free the packet, and return zero. The packet will be matched\n *   against further PCBs and/or forwarded to another protocol layers.\n */\nvoid\nraw_recv(struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg)\n{\n  /* remember recv() callback and user data */\n  pcb->recv = recv;\n  pcb->recv_arg = recv_arg;\n}\n\n/**\n * @ingroup raw_raw\n * Send the raw IP packet to the given address. Note that actually you cannot\n * modify the IP headers (this is inconsistent with the receive callback where\n * you actually get the IP headers), you can only specify the IP payload here.\n * It requires some more changes in lwIP. (there will be a raw_send() function\n * then.)\n *\n * @param pcb the raw pcb which to send\n * @param p the IP payload to send\n * @param ipaddr the destination address of the IP packet\n *\n */\nerr_t\nraw_sendto(struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr)\n{\n  err_t err;\n  struct netif *netif;\n  const ip_addr_t *src_ip;\n  struct pbuf *q; /* q will be sent down the stack */\n  s16_t header_size;\n\n  if ((pcb == NULL) || (ipaddr == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr)) {\n    return ERR_VAL;\n  }\n\n  LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, (\"raw_sendto\\n\"));\n\n  header_size = (\n#if LWIP_IPV4 && LWIP_IPV6\n    IP_IS_V6(ipaddr) ? IP6_HLEN : IP_HLEN);\n#elif LWIP_IPV4\n    IP_HLEN);\n#else\n    IP6_HLEN);\n#endif\n\n  /* not enough space to add an IP header to first pbuf in given p chain? */\n  if (pbuf_header(p, header_size)) {\n    /* allocate header in new pbuf */\n    q = pbuf_alloc(PBUF_IP, 0, PBUF_RAM);\n    /* new header pbuf could not be allocated? */\n    if (q == NULL) {\n      LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, (\"raw_sendto: could not allocate header\\n\"));\n      return ERR_MEM;\n    }\n    if (p->tot_len != 0) {\n      /* chain header q in front of given pbuf p */\n      pbuf_chain(q, p);\n    }\n    /* { first pbuf q points to header pbuf } */\n    LWIP_DEBUGF(RAW_DEBUG, (\"raw_sendto: added header pbuf %p before given pbuf %p\\n\", (void *)q, (void *)p));\n  } else {\n    /* first pbuf q equals given pbuf */\n    q = p;\n    if (pbuf_header(q, -header_size)) {\n      LWIP_ASSERT(\"Can't restore header we just removed!\", 0);\n      return ERR_MEM;\n    }\n  }\n\n  if(IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {\n    /* Don't call ip_route() with IP_ANY_TYPE */\n    netif = ip_route(IP46_ADDR_ANY(IP_GET_TYPE(ipaddr)), ipaddr);\n  } else {\n    netif = ip_route(&pcb->local_ip, ipaddr);\n  }\n\n  if (netif == NULL) {\n    LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, (\"raw_sendto: No route to \"));\n    ip_addr_debug_print(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, ipaddr);\n    /* free any temporary header pbuf allocated by pbuf_header() */\n    if (q != p) {\n      pbuf_free(q);\n    }\n    return ERR_RTE;\n  }\n\n#if IP_SOF_BROADCAST\n  if (IP_IS_V4(ipaddr))\n  {\n    /* broadcast filter? */\n    if (!ip_get_option(pcb, SOF_BROADCAST) && ip_addr_isbroadcast(ipaddr, netif)) {\n      LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_LEVEL_WARNING, (\"raw_sendto: SOF_BROADCAST not enabled on pcb %p\\n\", (void *)pcb));\n      /* free any temporary header pbuf allocated by pbuf_header() */\n      if (q != p) {\n        pbuf_free(q);\n      }\n      return ERR_VAL;\n    }\n  }\n#endif /* IP_SOF_BROADCAST */\n\n  if (ip_addr_isany(&pcb->local_ip)) {\n    /* use outgoing network interface IP address as source address */\n    src_ip = ip_netif_get_local_ip(netif, ipaddr);\n#if LWIP_IPV6\n    if (src_ip == NULL) {\n      if (q != p) {\n        pbuf_free(q);\n      }\n      return ERR_RTE;\n    }\n#endif /* LWIP_IPV6 */\n  } else {\n    /* use RAW PCB local IP address as source address */\n    src_ip = &pcb->local_ip;\n  }\n\n#if LWIP_IPV6\n  /* If requested, based on the IPV6_CHECKSUM socket option per RFC3542,\n     compute the checksum and update the checksum in the payload. */\n  if (IP_IS_V6(ipaddr) && pcb->chksum_reqd) {\n    u16_t chksum = ip6_chksum_pseudo(p, pcb->protocol, p->tot_len, ip_2_ip6(src_ip), ip_2_ip6(ipaddr));\n    LWIP_ASSERT(\"Checksum must fit into first pbuf\", p->len >= (pcb->chksum_offset + 2));\n    SMEMCPY(((u8_t *)p->payload) + pcb->chksum_offset, &chksum, sizeof(u16_t));\n  }\n#endif\n\n  NETIF_SET_HWADDRHINT(netif, &pcb->addr_hint);\n  err = ip_output_if(q, src_ip, ipaddr, pcb->ttl, pcb->tos, pcb->protocol, netif);\n  NETIF_SET_HWADDRHINT(netif, NULL);\n\n  /* did we chain a header earlier? */\n  if (q != p) {\n    /* free the header */\n    pbuf_free(q);\n  }\n  return err;\n}\n\n/**\n * @ingroup raw_raw\n * Send the raw IP packet to the address given by raw_connect()\n *\n * @param pcb the raw pcb which to send\n * @param p the IP payload to send\n *\n */\nerr_t\nraw_send(struct raw_pcb *pcb, struct pbuf *p)\n{\n  return raw_sendto(pcb, p, &pcb->remote_ip);\n}\n\n/**\n * @ingroup raw_raw\n * Remove an RAW PCB.\n *\n * @param pcb RAW PCB to be removed. The PCB is removed from the list of\n * RAW PCB's and the data structure is freed from memory.\n *\n * @see raw_new()\n */\nvoid\nraw_remove(struct raw_pcb *pcb)\n{\n  struct raw_pcb *pcb2;\n  /* pcb to be removed is first in list? */\n  if (raw_pcbs == pcb) {\n    /* make list start at 2nd pcb */\n    raw_pcbs = raw_pcbs->next;\n    /* pcb not 1st in list */\n  } else {\n    for (pcb2 = raw_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {\n      /* find pcb in raw_pcbs list */\n      if (pcb2->next != NULL && pcb2->next == pcb) {\n        /* remove pcb from list */\n        pcb2->next = pcb->next;\n        break;\n      }\n    }\n  }\n  memp_free(MEMP_RAW_PCB, pcb);\n}\n\n/**\n * @ingroup raw_raw\n * Create a RAW PCB.\n *\n * @return The RAW PCB which was created. NULL if the PCB data structure\n * could not be allocated.\n *\n * @param proto the protocol number of the IPs payload (e.g. IP_PROTO_ICMP)\n *\n * @see raw_remove()\n */\nstruct raw_pcb *\nraw_new(u8_t proto)\n{\n  struct raw_pcb *pcb;\n\n  LWIP_DEBUGF(RAW_DEBUG | LWIP_DBG_TRACE, (\"raw_new\\n\"));\n\n  pcb = (struct raw_pcb *)memp_malloc(MEMP_RAW_PCB);\n  /* could allocate RAW PCB? */\n  if (pcb != NULL) {\n    /* initialize PCB to all zeroes */\n    memset(pcb, 0, sizeof(struct raw_pcb));\n    pcb->protocol = proto;\n    pcb->ttl = RAW_TTL;\n    pcb->next = raw_pcbs;\n    raw_pcbs = pcb;\n  }\n  return pcb;\n}\n\n/**\n * @ingroup raw_raw\n * Create a RAW PCB for specific IP type.\n *\n * @return The RAW PCB which was created. NULL if the PCB data structure\n * could not be allocated.\n *\n * @param type IP address type, see @ref lwip_ip_addr_type definitions.\n * If you want to listen to IPv4 and IPv6 (dual-stack) packets,\n * supply @ref IPADDR_TYPE_ANY as argument and bind to @ref IP_ANY_TYPE.\n * @param proto the protocol number (next header) of the IPv6 packet payload\n *              (e.g. IP6_NEXTH_ICMP6)\n *\n * @see raw_remove()\n */\nstruct raw_pcb *\nraw_new_ip_type(u8_t type, u8_t proto)\n{\n  struct raw_pcb *pcb;\n  pcb = raw_new(proto);\n#if LWIP_IPV4 && LWIP_IPV6\n  if (pcb != NULL) {\n    IP_SET_TYPE_VAL(pcb->local_ip,  type);\n    IP_SET_TYPE_VAL(pcb->remote_ip, type);\n  }\n#else /* LWIP_IPV4 && LWIP_IPV6 */\n  LWIP_UNUSED_ARG(type);\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n  return pcb;\n}\n\n/** This function is called from netif.c when address is changed\n *\n * @param old_addr IP address of the netif before change\n * @param new_addr IP address of the netif after change\n */\nvoid raw_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr)\n{\n  struct raw_pcb* rpcb;\n\n  if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) {\n    for (rpcb = raw_pcbs; rpcb != NULL; rpcb = rpcb->next) {\n      /* PCB bound to current local interface address? */\n      if (ip_addr_cmp(&rpcb->local_ip, old_addr)) {\n        /* The PCB is bound to the old ipaddr and\n         * is set to bound to the new one instead */\n        ip_addr_copy(rpcb->local_ip, *new_addr);\n      }\n    }\n  }\n}\n\n#endif /* LWIP_RAW */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/stats.c",
    "content": "/**\n * @file\n * Statistics module\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_STATS /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/def.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/debug.h\"\n\n#include <string.h>\n\nstruct stats_ lwip_stats;\n\nvoid\nstats_init(void)\n{\n#ifdef LWIP_DEBUG\n#if MEM_STATS\n  lwip_stats.mem.name = \"MEM\";\n#endif /* MEM_STATS */\n#endif /* LWIP_DEBUG */\n}\n\n#if LWIP_STATS_DISPLAY\nvoid\nstats_display_proto(struct stats_proto *proto, const char *name)\n{\n  LWIP_PLATFORM_DIAG((\"\\n%s\\n\\t\", name));\n  LWIP_PLATFORM_DIAG((\"xmit: %\"STAT_COUNTER_F\"\\n\\t\", proto->xmit));\n  LWIP_PLATFORM_DIAG((\"recv: %\"STAT_COUNTER_F\"\\n\\t\", proto->recv));\n  LWIP_PLATFORM_DIAG((\"fw: %\"STAT_COUNTER_F\"\\n\\t\", proto->fw));\n  LWIP_PLATFORM_DIAG((\"drop: %\"STAT_COUNTER_F\"\\n\\t\", proto->drop));\n  LWIP_PLATFORM_DIAG((\"chkerr: %\"STAT_COUNTER_F\"\\n\\t\", proto->chkerr));\n  LWIP_PLATFORM_DIAG((\"lenerr: %\"STAT_COUNTER_F\"\\n\\t\", proto->lenerr));\n  LWIP_PLATFORM_DIAG((\"memerr: %\"STAT_COUNTER_F\"\\n\\t\", proto->memerr));\n  LWIP_PLATFORM_DIAG((\"rterr: %\"STAT_COUNTER_F\"\\n\\t\", proto->rterr));\n  LWIP_PLATFORM_DIAG((\"proterr: %\"STAT_COUNTER_F\"\\n\\t\", proto->proterr));\n  LWIP_PLATFORM_DIAG((\"opterr: %\"STAT_COUNTER_F\"\\n\\t\", proto->opterr));\n  LWIP_PLATFORM_DIAG((\"err: %\"STAT_COUNTER_F\"\\n\\t\", proto->err));\n  LWIP_PLATFORM_DIAG((\"cachehit: %\"STAT_COUNTER_F\"\\n\", proto->cachehit));\n}\n\n#if IGMP_STATS || MLD6_STATS\nvoid\nstats_display_igmp(struct stats_igmp *igmp, const char *name)\n{\n  LWIP_PLATFORM_DIAG((\"\\n%s\\n\\t\", name));\n  LWIP_PLATFORM_DIAG((\"xmit: %\"STAT_COUNTER_F\"\\n\\t\", igmp->xmit));\n  LWIP_PLATFORM_DIAG((\"recv: %\"STAT_COUNTER_F\"\\n\\t\", igmp->recv));\n  LWIP_PLATFORM_DIAG((\"drop: %\"STAT_COUNTER_F\"\\n\\t\", igmp->drop));\n  LWIP_PLATFORM_DIAG((\"chkerr: %\"STAT_COUNTER_F\"\\n\\t\", igmp->chkerr));\n  LWIP_PLATFORM_DIAG((\"lenerr: %\"STAT_COUNTER_F\"\\n\\t\", igmp->lenerr));\n  LWIP_PLATFORM_DIAG((\"memerr: %\"STAT_COUNTER_F\"\\n\\t\", igmp->memerr));\n  LWIP_PLATFORM_DIAG((\"proterr: %\"STAT_COUNTER_F\"\\n\\t\", igmp->proterr));\n  LWIP_PLATFORM_DIAG((\"rx_v1: %\"STAT_COUNTER_F\"\\n\\t\", igmp->rx_v1));\n  LWIP_PLATFORM_DIAG((\"rx_group: %\"STAT_COUNTER_F\"\\n\\t\", igmp->rx_group));\n  LWIP_PLATFORM_DIAG((\"rx_general: %\"STAT_COUNTER_F\"\\n\\t\", igmp->rx_general));\n  LWIP_PLATFORM_DIAG((\"rx_report: %\"STAT_COUNTER_F\"\\n\\t\", igmp->rx_report));\n  LWIP_PLATFORM_DIAG((\"tx_join: %\"STAT_COUNTER_F\"\\n\\t\", igmp->tx_join));\n  LWIP_PLATFORM_DIAG((\"tx_leave: %\"STAT_COUNTER_F\"\\n\\t\", igmp->tx_leave));\n  LWIP_PLATFORM_DIAG((\"tx_report: %\"STAT_COUNTER_F\"\\n\", igmp->tx_report));\n}\n#endif /* IGMP_STATS || MLD6_STATS */\n\n#if MEM_STATS || MEMP_STATS\nvoid\nstats_display_mem(struct stats_mem *mem, const char *name)\n{\n  LWIP_PLATFORM_DIAG((\"\\nMEM %s\\n\\t\", name));\n  LWIP_PLATFORM_DIAG((\"avail: %\"U32_F\"\\n\\t\", (u32_t)mem->avail));\n  LWIP_PLATFORM_DIAG((\"used: %\"U32_F\"\\n\\t\", (u32_t)mem->used));\n  LWIP_PLATFORM_DIAG((\"max: %\"U32_F\"\\n\\t\", (u32_t)mem->max));\n  LWIP_PLATFORM_DIAG((\"err: %\"U32_F\"\\n\", (u32_t)mem->err));\n}\n\n#if MEMP_STATS\nvoid\nstats_display_memp(struct stats_mem *mem, int index)\n{\n  if (index < MEMP_MAX) {\n    stats_display_mem(mem, mem->name);\n  }\n}\n#endif /* MEMP_STATS */\n#endif /* MEM_STATS || MEMP_STATS */\n\n#if SYS_STATS\nvoid\nstats_display_sys(struct stats_sys *sys)\n{\n  LWIP_PLATFORM_DIAG((\"\\nSYS\\n\\t\"));\n  LWIP_PLATFORM_DIAG((\"sem.used:  %\"U32_F\"\\n\\t\", (u32_t)sys->sem.used));\n  LWIP_PLATFORM_DIAG((\"sem.max:   %\"U32_F\"\\n\\t\", (u32_t)sys->sem.max));\n  LWIP_PLATFORM_DIAG((\"sem.err:   %\"U32_F\"\\n\\t\", (u32_t)sys->sem.err));\n  LWIP_PLATFORM_DIAG((\"mutex.used: %\"U32_F\"\\n\\t\", (u32_t)sys->mutex.used));\n  LWIP_PLATFORM_DIAG((\"mutex.max:  %\"U32_F\"\\n\\t\", (u32_t)sys->mutex.max));\n  LWIP_PLATFORM_DIAG((\"mutex.err:  %\"U32_F\"\\n\\t\", (u32_t)sys->mutex.err));\n  LWIP_PLATFORM_DIAG((\"mbox.used:  %\"U32_F\"\\n\\t\", (u32_t)sys->mbox.used));\n  LWIP_PLATFORM_DIAG((\"mbox.max:   %\"U32_F\"\\n\\t\", (u32_t)sys->mbox.max));\n  LWIP_PLATFORM_DIAG((\"mbox.err:   %\"U32_F\"\\n\", (u32_t)sys->mbox.err));\n}\n#endif /* SYS_STATS */\n\nvoid\nstats_display(void)\n{\n  s16_t i;\n\n  LINK_STATS_DISPLAY();\n  ETHARP_STATS_DISPLAY();\n  IPFRAG_STATS_DISPLAY();\n  IP6_FRAG_STATS_DISPLAY();\n  IP_STATS_DISPLAY();\n  ND6_STATS_DISPLAY();\n  IP6_STATS_DISPLAY();\n  IGMP_STATS_DISPLAY();\n  MLD6_STATS_DISPLAY();\n  ICMP_STATS_DISPLAY();\n  ICMP6_STATS_DISPLAY();\n  UDP_STATS_DISPLAY();\n  TCP_STATS_DISPLAY();\n  MEM_STATS_DISPLAY();\n  for (i = 0; i < MEMP_MAX; i++) {\n    MEMP_STATS_DISPLAY(i);\n  }\n  SYS_STATS_DISPLAY();\n}\n#endif /* LWIP_STATS_DISPLAY */\n\n#endif /* LWIP_STATS */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/sys.c",
    "content": "/**\n * @file\n * lwIP Operating System abstraction\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n/**\n * @defgroup sys_layer Porting (system abstraction layer)\n * @ingroup lwip\n * @verbinclude \"sys_arch.txt\"\n *\n * @defgroup sys_os OS abstraction layer\n * @ingroup sys_layer\n * No need to implement functions in this section in NO_SYS mode.\n *\n * @defgroup sys_sem Semaphores\n * @ingroup sys_os\n *\n * @defgroup sys_mutex Mutexes\n * @ingroup sys_os\n * Mutexes are recommended to correctly handle priority inversion,\n * especially if you use LWIP_CORE_LOCKING .\n *\n * @defgroup sys_mbox Mailboxes\n * @ingroup sys_os\n *\n * @defgroup sys_time Time\n * @ingroup sys_layer\n *\n * @defgroup sys_prot Critical sections\n * @ingroup sys_layer\n * Used to protect short regions of code against concurrent access.\n * - Your system is a bare-metal system (probably with an RTOS)\n *   and interrupts are under your control:\n *   Implement this as LockInterrupts() / UnlockInterrupts()\n * - Your system uses an RTOS with deferred interrupt handling from a\n *   worker thread: Implement as a global mutex or lock/unlock scheduler\n * - Your system uses a high-level OS with e.g. POSIX signals:\n *   Implement as a global mutex\n *\n * @defgroup sys_misc Misc\n * @ingroup sys_os\n */\n\n#include \"lwip/opt.h\"\n\n#include \"lwip/sys.h\"\n\n/* Most of the functions defined in sys.h must be implemented in the\n * architecture-dependent file sys_arch.c */\n\n#if !NO_SYS\n\n#ifndef sys_msleep\n/**\n * Sleep for some ms. Timeouts are NOT processed while sleeping.\n *\n * @param ms number of milliseconds to sleep\n */\nvoid\nsys_msleep(u32_t ms)\n{\n  if (ms > 0) {\n    sys_sem_t delaysem;\n    err_t err = sys_sem_new(&delaysem, 0);\n    if (err == ERR_OK) {\n      sys_arch_sem_wait(&delaysem, ms);\n      sys_sem_free(&delaysem);\n    }\n  }\n}\n#endif /* sys_msleep */\n\n#endif /* !NO_SYS */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/tcp.c",
    "content": "/**\n * @file \n * Transmission Control Protocol for IP\n * See also @ref tcp_raw\n *\n * @defgroup tcp_raw TCP\n * @ingroup callbackstyle_api\n * Transmission Control Protocol for IP\\n\n * @see @ref raw_api and @ref netconn\n *\n * Common functions for the TCP implementation, such as functinos\n * for manipulating the data structures and the TCP timer functions. TCP functions\n * related to input and output is found in tcp_in.c and tcp_out.c respectively.\\n\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/def.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/tcp.h\"\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/debug.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/nd6.h\"\n\n#include <string.h>\n\n#ifdef LWIP_HOOK_FILENAME\n#include LWIP_HOOK_FILENAME\n#endif\n\n#ifndef TCP_LOCAL_PORT_RANGE_START\n/* From http://www.iana.org/assignments/port-numbers:\n   \"The Dynamic and/or Private Ports are those from 49152 through 65535\" */\n#define TCP_LOCAL_PORT_RANGE_START        0xc000\n#define TCP_LOCAL_PORT_RANGE_END          0xffff\n#define TCP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & ~TCP_LOCAL_PORT_RANGE_START) + TCP_LOCAL_PORT_RANGE_START))\n#endif\n\n#if LWIP_TCP_KEEPALIVE\n#define TCP_KEEP_DUR(pcb)   ((pcb)->keep_cnt * (pcb)->keep_intvl)\n#define TCP_KEEP_INTVL(pcb) ((pcb)->keep_intvl)\n#else /* LWIP_TCP_KEEPALIVE */\n#define TCP_KEEP_DUR(pcb)   TCP_MAXIDLE\n#define TCP_KEEP_INTVL(pcb) TCP_KEEPINTVL_DEFAULT\n#endif /* LWIP_TCP_KEEPALIVE */\n\n/* As initial send MSS, we use TCP_MSS but limit it to 536. */\n#if TCP_MSS > 536\n#define INITIAL_MSS 536\n#else\n#define INITIAL_MSS TCP_MSS\n#endif\n\nstatic const char * const tcp_state_str[] = {\n  \"CLOSED\",\n  \"LISTEN\",\n  \"SYN_SENT\",\n  \"SYN_RCVD\",\n  \"ESTABLISHED\",\n  \"FIN_WAIT_1\",\n  \"FIN_WAIT_2\",\n  \"CLOSE_WAIT\",\n  \"CLOSING\",\n  \"LAST_ACK\",\n  \"TIME_WAIT\"\n};\n\n/* last local TCP port */\nstatic u16_t tcp_port = TCP_LOCAL_PORT_RANGE_START;\n\n/* Incremented every coarse grained timer shot (typically every 500 ms). */\nu32_t tcp_ticks;\nstatic const u8_t tcp_backoff[13] =\n    { 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7};\n /* Times per slowtmr hits */\nstatic const u8_t tcp_persist_backoff[7] = { 3, 6, 12, 24, 48, 96, 120 };\n\n/* The TCP PCB lists. */\n\n/** List of all TCP PCBs bound but not yet (connected || listening) */\nstruct tcp_pcb *tcp_bound_pcbs;\n/** List of all TCP PCBs in LISTEN state */\nunion tcp_listen_pcbs_t tcp_listen_pcbs;\n/** List of all TCP PCBs that are in a state in which\n * they accept or send data. */\nstruct tcp_pcb *tcp_active_pcbs;\n/** List of all TCP PCBs in TIME-WAIT state */\nstruct tcp_pcb *tcp_tw_pcbs;\n\n/** An array with all (non-temporary) PCB lists, mainly used for smaller code size */\nstruct tcp_pcb ** const tcp_pcb_lists[] = {&tcp_listen_pcbs.pcbs, &tcp_bound_pcbs,\n  &tcp_active_pcbs, &tcp_tw_pcbs};\n\nu8_t tcp_active_pcbs_changed;\n\n/** Timer counter to handle calling slow-timer from tcp_tmr() */\nstatic u8_t tcp_timer;\nstatic u8_t tcp_timer_ctr;\nstatic u16_t tcp_new_port(void);\n\nstatic err_t tcp_close_shutdown_fin(struct tcp_pcb *pcb);\n\n/**\n * Initialize this module.\n */\nvoid\ntcp_init(void)\n{\n#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND)\n  tcp_port = TCP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());\n#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */\n}\n\n/**\n * Called periodically to dispatch TCP timers.\n */\nvoid\ntcp_tmr(void)\n{\n  /* Call tcp_fasttmr() every 250 ms */\n  tcp_fasttmr();\n\n  if (++tcp_timer & 1) {\n    /* Call tcp_slowtmr() every 500 ms, i.e., every other timer\n       tcp_tmr() is called. */\n    tcp_slowtmr();\n  }\n}\n\n#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG\n/** Called when a listen pcb is closed. Iterates one pcb list and removes the\n * closed listener pcb from pcb->listener if matching.\n */\nstatic void\ntcp_remove_listener(struct tcp_pcb *list, struct tcp_pcb_listen *lpcb)\n{\n   struct tcp_pcb *pcb;\n   for (pcb = list; pcb != NULL; pcb = pcb->next) {\n      if (pcb->listener == lpcb) {\n         pcb->listener = NULL;\n      }\n   }\n}\n#endif\n\n/** Called when a listen pcb is closed. Iterates all pcb lists and removes the\n * closed listener pcb from pcb->listener if matching.\n */\nstatic void\ntcp_listen_closed(struct tcp_pcb *pcb)\n{\n#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG\n  size_t i;\n  LWIP_ASSERT(\"pcb != NULL\", pcb != NULL);\n  LWIP_ASSERT(\"pcb->state == LISTEN\", pcb->state == LISTEN);\n  for (i = 1; i < LWIP_ARRAYSIZE(tcp_pcb_lists); i++) {\n    tcp_remove_listener(*tcp_pcb_lists[i], (struct tcp_pcb_listen*)pcb);\n  }\n#endif\n  LWIP_UNUSED_ARG(pcb);\n}\n\n#if TCP_LISTEN_BACKLOG\n/** @ingroup tcp_raw\n * Delay accepting a connection in respect to the listen backlog:\n * the number of outstanding connections is increased until\n * tcp_backlog_accepted() is called.\n *\n * ATTENTION: the caller is responsible for calling tcp_backlog_accepted()\n * or else the backlog feature will get out of sync!\n *\n * @param pcb the connection pcb which is not fully accepted yet\n */\nvoid\ntcp_backlog_delayed(struct tcp_pcb* pcb)\n{\n  LWIP_ASSERT(\"pcb != NULL\", pcb != NULL);\n  if ((pcb->flags & TF_BACKLOGPEND) == 0) {\n    if (pcb->listener != NULL) {\n      pcb->listener->accepts_pending++;\n      LWIP_ASSERT(\"accepts_pending != 0\", pcb->listener->accepts_pending != 0);\n      pcb->flags |= TF_BACKLOGPEND;\n    }\n  }\n}\n\n/** @ingroup tcp_raw\n * A delayed-accept a connection is accepted (or closed/aborted): decreases\n * the number of outstanding connections after calling tcp_backlog_delayed().\n *\n * ATTENTION: the caller is responsible for calling tcp_backlog_accepted()\n * or else the backlog feature will get out of sync!\n *\n * @param pcb the connection pcb which is now fully accepted (or closed/aborted)\n */\nvoid\ntcp_backlog_accepted(struct tcp_pcb* pcb)\n{\n  LWIP_ASSERT(\"pcb != NULL\", pcb != NULL);\n  if ((pcb->flags & TF_BACKLOGPEND) != 0) {\n    if (pcb->listener != NULL) {\n      LWIP_ASSERT(\"accepts_pending != 0\", pcb->listener->accepts_pending != 0);\n      pcb->listener->accepts_pending--;\n      pcb->flags &= ~TF_BACKLOGPEND;\n    }\n  }\n}\n#endif /* TCP_LISTEN_BACKLOG */\n\n/**\n * Closes the TX side of a connection held by the PCB.\n * For tcp_close(), a RST is sent if the application didn't receive all data\n * (tcp_recved() not called for all data passed to recv callback).\n *\n * Listening pcbs are freed and may not be referenced any more.\n * Connection pcbs are freed if not yet connected and may not be referenced\n * any more. If a connection is established (at least SYN received or in\n * a closing state), the connection is closed, and put in a closing state.\n * The pcb is then automatically freed in tcp_slowtmr(). It is therefore\n * unsafe to reference it.\n *\n * @param pcb the tcp_pcb to close\n * @return ERR_OK if connection has been closed\n *         another err_t if closing failed and pcb is not freed\n */\nstatic err_t\ntcp_close_shutdown(struct tcp_pcb *pcb, u8_t rst_on_unacked_data)\n{\n  if (rst_on_unacked_data && ((pcb->state == ESTABLISHED) || (pcb->state == CLOSE_WAIT))) {\n    if ((pcb->refused_data != NULL) || (pcb->rcv_wnd != TCP_WND_MAX(pcb))) {\n      /* Not all data received by application, send RST to tell the remote\n         side about this. */\n      LWIP_ASSERT(\"pcb->flags & TF_RXCLOSED\", pcb->flags & TF_RXCLOSED);\n\n      /* don't call tcp_abort here: we must not deallocate the pcb since\n         that might not be expected when calling tcp_close */\n      tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,\n               pcb->local_port, pcb->remote_port);\n\n      tcp_pcb_purge(pcb);\n      TCP_RMV_ACTIVE(pcb);\n      if (pcb->state == ESTABLISHED) {\n        /* move to TIME_WAIT since we close actively */\n        pcb->state = TIME_WAIT;\n        TCP_REG(&tcp_tw_pcbs, pcb);\n      } else {\n        /* CLOSE_WAIT: deallocate the pcb since we already sent a RST for it */\n        if (tcp_input_pcb == pcb) {\n          /* prevent using a deallocated pcb: free it from tcp_input later */\n          tcp_trigger_input_pcb_close();\n        } else {\n          memp_free(MEMP_TCP_PCB, pcb);\n        }\n      }\n      return ERR_OK;\n    }\n  }\n\n  /* - states which free the pcb are handled here,\n     - states which send FIN and change state are handled in tcp_close_shutdown_fin() */\n  switch (pcb->state) {\n  case CLOSED:\n    /* Closing a pcb in the CLOSED state might seem erroneous,\n     * however, it is in this state once allocated and as yet unused\n     * and the user needs some way to free it should the need arise.\n     * Calling tcp_close() with a pcb that has already been closed, (i.e. twice)\n     * or for a pcb that has been used and then entered the CLOSED state\n     * is erroneous, but this should never happen as the pcb has in those cases\n     * been freed, and so any remaining handles are bogus. */\n    if (pcb->local_port != 0) {\n      TCP_RMV(&tcp_bound_pcbs, pcb);\n    }\n    memp_free(MEMP_TCP_PCB, pcb);\n    break;\n  case LISTEN:\n    tcp_listen_closed(pcb);\n    tcp_pcb_remove(&tcp_listen_pcbs.pcbs, pcb);\n    memp_free(MEMP_TCP_PCB_LISTEN, pcb);\n    break;\n  case SYN_SENT:\n    TCP_PCB_REMOVE_ACTIVE(pcb);\n    memp_free(MEMP_TCP_PCB, pcb);\n    MIB2_STATS_INC(mib2.tcpattemptfails);\n    break;\n  default:\n    return tcp_close_shutdown_fin(pcb);\n  }\n  return ERR_OK;\n}\n\nstatic err_t\ntcp_close_shutdown_fin(struct tcp_pcb *pcb)\n{\n  err_t err;\n  LWIP_ASSERT(\"pcb != NULL\", pcb != NULL);\n\n  switch (pcb->state) {\n  case SYN_RCVD:\n    err = tcp_send_fin(pcb);\n    if (err == ERR_OK) {\n      tcp_backlog_accepted(pcb);\n      MIB2_STATS_INC(mib2.tcpattemptfails);\n      pcb->state = FIN_WAIT_1;\n    }\n    break;\n  case ESTABLISHED:\n    err = tcp_send_fin(pcb);\n    if (err == ERR_OK) {\n      MIB2_STATS_INC(mib2.tcpestabresets);\n      pcb->state = FIN_WAIT_1;\n    }\n    break;\n  case CLOSE_WAIT:\n    err = tcp_send_fin(pcb);\n    if (err == ERR_OK) {\n      MIB2_STATS_INC(mib2.tcpestabresets);\n      pcb->state = LAST_ACK;\n    }\n    break;\n  default:\n    /* Has already been closed, do nothing. */\n    return ERR_OK;\n  }\n\n  if (err == ERR_OK) {\n    /* To ensure all data has been sent when tcp_close returns, we have\n       to make sure tcp_output doesn't fail.\n       Since we don't really have to ensure all data has been sent when tcp_close\n       returns (unsent data is sent from tcp timer functions, also), we don't care\n       for the return value of tcp_output for now. */\n    tcp_output(pcb);\n  } else if (err == ERR_MEM) {\n    /* Mark this pcb for closing. Closing is retried from tcp_tmr. */\n    pcb->flags |= TF_CLOSEPEND;\n    /* We have to return ERR_OK from here to indicate to the callers that this\n       pcb should not be used any more as it will be freed soon via tcp_tmr.\n       This is OK here since sending FIN does not guarantee a time frime for\n       actually freeing the pcb, either (it is left in closure states for\n       remote ACK or timeout) */\n    return ERR_OK;\n  }\n  return err;\n}\n\n/**\n * @ingroup tcp_raw\n * Closes the connection held by the PCB.\n *\n * Listening pcbs are freed and may not be referenced any more.\n * Connection pcbs are freed if not yet connected and may not be referenced\n * any more. If a connection is established (at least SYN received or in\n * a closing state), the connection is closed, and put in a closing state.\n * The pcb is then automatically freed in tcp_slowtmr(). It is therefore\n * unsafe to reference it (unless an error is returned).\n *\n * @param pcb the tcp_pcb to close\n * @return ERR_OK if connection has been closed\n *         another err_t if closing failed and pcb is not freed\n */\nerr_t\ntcp_close(struct tcp_pcb *pcb)\n{\n  LWIP_DEBUGF(TCP_DEBUG, (\"tcp_close: closing in \"));\n  tcp_debug_print_state(pcb->state);\n\n  if (pcb->state != LISTEN) {\n    /* Set a flag not to receive any more data... */\n    pcb->flags |= TF_RXCLOSED;\n  }\n  /* ... and close */\n  return tcp_close_shutdown(pcb, 1);\n}\n\n/**\n * @ingroup tcp_raw\n * Causes all or part of a full-duplex connection of this PCB to be shut down.\n * This doesn't deallocate the PCB unless shutting down both sides!\n * Shutting down both sides is the same as calling tcp_close, so if it succeds\n * (i.e. returns ER_OK), the PCB must not be referenced any more!\n *\n * @param pcb PCB to shutdown\n * @param shut_rx shut down receive side if this is != 0\n * @param shut_tx shut down send side if this is != 0\n * @return ERR_OK if shutdown succeeded (or the PCB has already been shut down)\n *         another err_t on error.\n */\nerr_t\ntcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx)\n{\n  if (pcb->state == LISTEN) {\n    return ERR_CONN;\n  }\n  if (shut_rx) {\n    /* shut down the receive side: set a flag not to receive any more data... */\n    pcb->flags |= TF_RXCLOSED;\n    if (shut_tx) {\n      /* shutting down the tx AND rx side is the same as closing for the raw API */\n      return tcp_close_shutdown(pcb, 1);\n    }\n    /* ... and free buffered data */\n    if (pcb->refused_data != NULL) {\n      pbuf_free(pcb->refused_data);\n      pcb->refused_data = NULL;\n    }\n  }\n  if (shut_tx) {\n    /* This can't happen twice since if it succeeds, the pcb's state is changed.\n       Only close in these states as the others directly deallocate the PCB */\n    switch (pcb->state) {\n    case SYN_RCVD:\n    case ESTABLISHED:\n    case CLOSE_WAIT:\n      return tcp_close_shutdown(pcb, (u8_t)shut_rx);\n    default:\n      /* Not (yet?) connected, cannot shutdown the TX side as that would bring us\n        into CLOSED state, where the PCB is deallocated. */\n      return ERR_CONN;\n    }\n  }\n  return ERR_OK;\n}\n\n/**\n * Abandons a connection and optionally sends a RST to the remote\n * host.  Deletes the local protocol control block. This is done when\n * a connection is killed because of shortage of memory.\n *\n * @param pcb the tcp_pcb to abort\n * @param reset boolean to indicate whether a reset should be sent\n */\nvoid\ntcp_abandon(struct tcp_pcb *pcb, int reset)\n{\n  u32_t seqno, ackno;\n#if LWIP_CALLBACK_API\n  tcp_err_fn errf;\n#endif /* LWIP_CALLBACK_API */\n  void *errf_arg;\n\n  /* pcb->state LISTEN not allowed here */\n  LWIP_ASSERT(\"don't call tcp_abort/tcp_abandon for listen-pcbs\",\n    pcb->state != LISTEN);\n  /* Figure out on which TCP PCB list we are, and remove us. If we\n     are in an active state, call the receive function associated with\n     the PCB with a NULL argument, and send an RST to the remote end. */\n  if (pcb->state == TIME_WAIT) {\n    tcp_pcb_remove(&tcp_tw_pcbs, pcb);\n    memp_free(MEMP_TCP_PCB, pcb);\n  } else {\n    int send_rst = 0;\n    u16_t local_port = 0;\n    enum tcp_state last_state;\n    seqno = pcb->snd_nxt;\n    ackno = pcb->rcv_nxt;\n#if LWIP_CALLBACK_API\n    errf = pcb->errf;\n#endif /* LWIP_CALLBACK_API */\n    errf_arg = pcb->callback_arg;\n    if (pcb->state == CLOSED) {\n      if (pcb->local_port != 0) {\n        /* bound, not yet opened */\n        TCP_RMV(&tcp_bound_pcbs, pcb);\n      }\n    } else {\n      send_rst = reset;\n      local_port = pcb->local_port;\n      TCP_PCB_REMOVE_ACTIVE(pcb);\n    }\n    if (pcb->unacked != NULL) {\n      tcp_segs_free(pcb->unacked);\n    }\n    if (pcb->unsent != NULL) {\n      tcp_segs_free(pcb->unsent);\n    }\n#if TCP_QUEUE_OOSEQ\n    if (pcb->ooseq != NULL) {\n      tcp_segs_free(pcb->ooseq);\n    }\n#endif /* TCP_QUEUE_OOSEQ */\n    tcp_backlog_accepted(pcb);\n    if (send_rst) {\n      LWIP_DEBUGF(TCP_RST_DEBUG, (\"tcp_abandon: sending RST\\n\"));\n      tcp_rst(seqno, ackno, &pcb->local_ip, &pcb->remote_ip, local_port, pcb->remote_port);\n    }\n    last_state = pcb->state;\n    memp_free(MEMP_TCP_PCB, pcb);\n    TCP_EVENT_ERR(last_state, errf, errf_arg, ERR_ABRT);\n  }\n}\n\n/**\n * @ingroup tcp_raw\n * Aborts the connection by sending a RST (reset) segment to the remote\n * host. The pcb is deallocated. This function never fails.\n *\n * ATTENTION: When calling this from one of the TCP callbacks, make\n * sure you always return ERR_ABRT (and never return ERR_ABRT otherwise\n * or you will risk accessing deallocated memory or memory leaks!\n *\n * @param pcb the tcp pcb to abort\n */\nvoid\ntcp_abort(struct tcp_pcb *pcb)\n{\n  tcp_abandon(pcb, 1);\n}\n\n/**\n * @ingroup tcp_raw\n * Binds the connection to a local port number and IP address. If the\n * IP address is not given (i.e., ipaddr == NULL), the IP address of\n * the outgoing network interface is used instead.\n *\n * @param pcb the tcp_pcb to bind (no check is done whether this pcb is\n *        already bound!)\n * @param ipaddr the local ip address to bind to (use IP4_ADDR_ANY to bind\n *        to any local address\n * @param port the local port to bind to\n * @return ERR_USE if the port is already in use\n *         ERR_VAL if bind failed because the PCB is not in a valid state\n *         ERR_OK if bound\n */\nerr_t\ntcp_bind(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)\n{\n  int i;\n  int max_pcb_list = NUM_TCP_PCB_LISTS;\n  struct tcp_pcb *cpcb;\n\n#if LWIP_IPV4\n  /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */\n  if (ipaddr == NULL) {\n    ipaddr = IP4_ADDR_ANY;\n  }\n#endif /* LWIP_IPV4 */\n\n  /* still need to check for ipaddr == NULL in IPv6 only case */\n  if ((pcb == NULL) || (ipaddr == NULL)) {\n    return ERR_VAL;\n  }\n\n  LWIP_ERROR(\"tcp_bind: can only bind in state CLOSED\", pcb->state == CLOSED, return ERR_VAL);\n\n#if SO_REUSE\n  /* Unless the REUSEADDR flag is set,\n     we have to check the pcbs in TIME-WAIT state, also.\n     We do not dump TIME_WAIT pcb's; they can still be matched by incoming\n     packets using both local and remote IP addresses and ports to distinguish.\n   */\n  if (ip_get_option(pcb, SOF_REUSEADDR)) {\n    max_pcb_list = NUM_TCP_PCB_LISTS_NO_TIME_WAIT;\n  }\n#endif /* SO_REUSE */\n\n  if (port == 0) {\n    port = tcp_new_port();\n    if (port == 0) {\n      return ERR_BUF;\n    }\n  } else {\n    /* Check if the address already is in use (on all lists) */\n    for (i = 0; i < max_pcb_list; i++) {\n      for (cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {\n        if (cpcb->local_port == port) {\n#if SO_REUSE\n          /* Omit checking for the same port if both pcbs have REUSEADDR set.\n             For SO_REUSEADDR, the duplicate-check for a 5-tuple is done in\n             tcp_connect. */\n          if (!ip_get_option(pcb, SOF_REUSEADDR) ||\n              !ip_get_option(cpcb, SOF_REUSEADDR))\n#endif /* SO_REUSE */\n          {\n            /* @todo: check accept_any_ip_version */\n            if ((IP_IS_V6(ipaddr) == IP_IS_V6_VAL(cpcb->local_ip)) &&\n                (ip_addr_isany(&cpcb->local_ip) ||\n                ip_addr_isany(ipaddr) ||\n                ip_addr_cmp(&cpcb->local_ip, ipaddr))) {\n              return ERR_USE;\n            }\n          }\n        }\n      }\n    }\n  }\n\n  if (!ip_addr_isany(ipaddr)) {\n    ip_addr_set(&pcb->local_ip, ipaddr);\n  }\n  pcb->local_port = port;\n  TCP_REG(&tcp_bound_pcbs, pcb);\n  LWIP_DEBUGF(TCP_DEBUG, (\"tcp_bind: bind to port %\"U16_F\"\\n\", port));\n  return ERR_OK;\n}\n#if LWIP_CALLBACK_API\n/**\n * Default accept callback if no accept callback is specified by the user.\n */\nstatic err_t\ntcp_accept_null(void *arg, struct tcp_pcb *pcb, err_t err)\n{\n  LWIP_UNUSED_ARG(arg);\n  LWIP_UNUSED_ARG(err);\n\n  tcp_abort(pcb);\n\n  return ERR_ABRT;\n}\n#endif /* LWIP_CALLBACK_API */\n\n/**\n * @ingroup tcp_raw\n * Set the state of the connection to be LISTEN, which means that it\n * is able to accept incoming connections. The protocol control block\n * is reallocated in order to consume less memory. Setting the\n * connection to LISTEN is an irreversible process.\n *\n * @param pcb the original tcp_pcb\n * @param backlog the incoming connections queue limit\n * @return tcp_pcb used for listening, consumes less memory.\n *\n * @note The original tcp_pcb is freed. This function therefore has to be\n *       called like this:\n *             tpcb = tcp_listen_with_backlog(tpcb, backlog);\n */\nstruct tcp_pcb *\ntcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)\n{\n  return tcp_listen_with_backlog_and_err(pcb, backlog, NULL);\n}\n\n/**\n * @ingroup tcp_raw\n * Set the state of the connection to be LISTEN, which means that it\n * is able to accept incoming connections. The protocol control block\n * is reallocated in order to consume less memory. Setting the\n * connection to LISTEN is an irreversible process.\n *\n * @param pcb the original tcp_pcb\n * @param backlog the incoming connections queue limit\n * @param err when NULL is returned, this contains the error reason\n * @return tcp_pcb used for listening, consumes less memory.\n *\n * @note The original tcp_pcb is freed. This function therefore has to be\n *       called like this:\n *             tpcb = tcp_listen_with_backlog_and_err(tpcb, backlog, &err);\n */\nstruct tcp_pcb *\ntcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err)\n{\n  struct tcp_pcb_listen *lpcb = NULL;\n  err_t res;\n\n  LWIP_UNUSED_ARG(backlog);\n  LWIP_ERROR(\"tcp_listen: pcb already connected\", pcb->state == CLOSED, res = ERR_CLSD; goto done);\n\n  /* already listening? */\n  if (pcb->state == LISTEN) {\n    lpcb = (struct tcp_pcb_listen*)pcb;\n    res = ERR_ALREADY;\n    goto done;\n  }\n#if SO_REUSE\n  if (ip_get_option(pcb, SOF_REUSEADDR)) {\n    /* Since SOF_REUSEADDR allows reusing a local address before the pcb's usage\n       is declared (listen-/connection-pcb), we have to make sure now that\n       this port is only used once for every local IP. */\n    for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {\n      if ((lpcb->local_port == pcb->local_port) &&\n          ip_addr_cmp(&lpcb->local_ip, &pcb->local_ip)) {\n        /* this address/port is already used */\n        lpcb = NULL;\n        res = ERR_USE;\n        goto done;\n      }\n    }\n  }\n#endif /* SO_REUSE */\n  lpcb = (struct tcp_pcb_listen *)memp_malloc(MEMP_TCP_PCB_LISTEN);\n  if (lpcb == NULL) {\n    res = ERR_MEM;\n    goto done;\n  }\n  lpcb->callback_arg = pcb->callback_arg;\n  lpcb->local_port = pcb->local_port;\n  lpcb->state = LISTEN;\n  lpcb->prio = pcb->prio;\n  lpcb->so_options = pcb->so_options;\n  lpcb->ttl = pcb->ttl;\n  lpcb->tos = pcb->tos;\n#if LWIP_IPV4 && LWIP_IPV6\n  IP_SET_TYPE_VAL(lpcb->remote_ip, pcb->local_ip.type);\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n  ip_addr_copy(lpcb->local_ip, pcb->local_ip);\n  if (pcb->local_port != 0) {\n    TCP_RMV(&tcp_bound_pcbs, pcb);\n  }\n  memp_free(MEMP_TCP_PCB, pcb);\n#if LWIP_CALLBACK_API\n  lpcb->accept = tcp_accept_null;\n#endif /* LWIP_CALLBACK_API */\n#if TCP_LISTEN_BACKLOG\n  lpcb->accepts_pending = 0;\n  tcp_backlog_set(lpcb, backlog);\n#endif /* TCP_LISTEN_BACKLOG */\n  TCP_REG(&tcp_listen_pcbs.pcbs, (struct tcp_pcb *)lpcb);\n  res = ERR_OK;\ndone:\n  if (err != NULL) {\n    *err = res;\n  }\n  return (struct tcp_pcb *)lpcb;\n}\n\n/**\n * Update the state that tracks the available window space to advertise.\n *\n * Returns how much extra window would be advertised if we sent an\n * update now.\n */\nu32_t\ntcp_update_rcv_ann_wnd(struct tcp_pcb *pcb)\n{\n  u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;\n\n  if (TCP_SEQ_GEQ(new_right_edge, pcb->rcv_ann_right_edge + LWIP_MIN((TCP_WND / 2), pcb->mss))) {\n    /* we can advertise more window */\n    pcb->rcv_ann_wnd = pcb->rcv_wnd;\n    return new_right_edge - pcb->rcv_ann_right_edge;\n  } else {\n    if (TCP_SEQ_GT(pcb->rcv_nxt, pcb->rcv_ann_right_edge)) {\n      /* Can happen due to other end sending out of advertised window,\n       * but within actual available (but not yet advertised) window */\n      pcb->rcv_ann_wnd = 0;\n    } else {\n      /* keep the right edge of window constant */\n      u32_t new_rcv_ann_wnd = pcb->rcv_ann_right_edge - pcb->rcv_nxt;\n#if !LWIP_WND_SCALE\n      LWIP_ASSERT(\"new_rcv_ann_wnd <= 0xffff\", new_rcv_ann_wnd <= 0xffff);\n#endif\n      pcb->rcv_ann_wnd = (tcpwnd_size_t)new_rcv_ann_wnd;\n    }\n    return 0;\n  }\n}\n\n/**\n * @ingroup tcp_raw\n * This function should be called by the application when it has\n * processed the data. The purpose is to advertise a larger window\n * when the data has been processed.\n *\n * @param pcb the tcp_pcb for which data is read\n * @param len the amount of bytes that have been read by the application\n */\nvoid\ntcp_recved(struct tcp_pcb *pcb, u16_t len)\n{\n  int wnd_inflation;\n\n  /* pcb->state LISTEN not allowed here */\n  LWIP_ASSERT(\"don't call tcp_recved for listen-pcbs\",\n    pcb->state != LISTEN);\n\n  pcb->rcv_wnd += len;\n  if (pcb->rcv_wnd > TCP_WND_MAX(pcb)) {\n    pcb->rcv_wnd = TCP_WND_MAX(pcb);\n  } else if (pcb->rcv_wnd == 0) {\n    /* rcv_wnd overflowed */\n    if ((pcb->state == CLOSE_WAIT) || (pcb->state == LAST_ACK)) {\n      /* In passive close, we allow this, since the FIN bit is added to rcv_wnd\n         by the stack itself, since it is not mandatory for an application\n         to call tcp_recved() for the FIN bit, but e.g. the netconn API does so. */\n      pcb->rcv_wnd = TCP_WND_MAX(pcb);\n    } else {\n      LWIP_ASSERT(\"tcp_recved: len wrapped rcv_wnd\\n\", 0);\n    }\n  }\n\n  wnd_inflation = tcp_update_rcv_ann_wnd(pcb);\n\n  /* If the change in the right edge of window is significant (default\n   * watermark is TCP_WND/4), then send an explicit update now.\n   * Otherwise wait for a packet to be sent in the normal course of\n   * events (or more window to be available later) */\n  if (wnd_inflation >= TCP_WND_UPDATE_THRESHOLD) {\n    tcp_ack_now(pcb);\n    tcp_output(pcb);\n  }\n\n  LWIP_DEBUGF(TCP_DEBUG, (\"tcp_recved: received %\"U16_F\" bytes, wnd %\"TCPWNDSIZE_F\" (%\"TCPWNDSIZE_F\").\\n\",\n         len, pcb->rcv_wnd, (u16_t)(TCP_WND_MAX(pcb) - pcb->rcv_wnd)));\n}\n\n/**\n * Allocate a new local TCP port.\n *\n * @return a new (free) local TCP port number\n */\nstatic u16_t\ntcp_new_port(void)\n{\n  u8_t i;\n  u16_t n = 0;\n  struct tcp_pcb *pcb;\n\nagain:\n  if (tcp_port++ == TCP_LOCAL_PORT_RANGE_END) {\n    tcp_port = TCP_LOCAL_PORT_RANGE_START;\n  }\n  /* Check all PCB lists. */\n  for (i = 0; i < NUM_TCP_PCB_LISTS; i++) {\n    for (pcb = *tcp_pcb_lists[i]; pcb != NULL; pcb = pcb->next) {\n      if (pcb->local_port == tcp_port) {\n        if (++n > (TCP_LOCAL_PORT_RANGE_END - TCP_LOCAL_PORT_RANGE_START)) {\n          return 0;\n        }\n        goto again;\n      }\n    }\n  }\n  return tcp_port;\n}\n\n/**\n * @ingroup tcp_raw\n * Connects to another host. The function given as the \"connected\"\n * argument will be called when the connection has been established.\n *\n * @param pcb the tcp_pcb used to establish the connection\n * @param ipaddr the remote ip address to connect to\n * @param port the remote tcp port to connect to\n * @param connected callback function to call when connected (on error,\n                    the err calback will be called)\n * @return ERR_VAL if invalid arguments are given\n *         ERR_OK if connect request has been sent\n *         other err_t values if connect request couldn't be sent\n */\nerr_t\ntcp_connect(struct tcp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port,\n      tcp_connected_fn connected)\n{\n  err_t ret;\n  u32_t iss;\n  u16_t old_local_port;\n\n  if ((pcb == NULL) || (ipaddr == NULL)) {\n    return ERR_VAL;\n  }\n\n  LWIP_ERROR(\"tcp_connect: can only connect from state CLOSED\", pcb->state == CLOSED, return ERR_ISCONN);\n\n  LWIP_DEBUGF(TCP_DEBUG, (\"tcp_connect to port %\"U16_F\"\\n\", port));\n  ip_addr_set(&pcb->remote_ip, ipaddr);\n  pcb->remote_port = port;\n\n  /* check if we have a route to the remote host */\n  if (ip_addr_isany(&pcb->local_ip)) {\n    /* no local IP address set, yet. */\n    struct netif *netif;\n    const ip_addr_t *local_ip;\n    ip_route_get_local_ip(&pcb->local_ip, &pcb->remote_ip, netif, local_ip);\n    if ((netif == NULL) || (local_ip == NULL)) {\n      /* Don't even try to send a SYN packet if we have no route\n         since that will fail. */\n      return ERR_RTE;\n    }\n    /* Use the address as local address of the pcb. */\n    ip_addr_copy(pcb->local_ip, *local_ip);\n  }\n\n  old_local_port = pcb->local_port;\n  if (pcb->local_port == 0) {\n    pcb->local_port = tcp_new_port();\n    if (pcb->local_port == 0) {\n      return ERR_BUF;\n    }\n  } else {\n#if SO_REUSE\n    if (ip_get_option(pcb, SOF_REUSEADDR)) {\n      /* Since SOF_REUSEADDR allows reusing a local address, we have to make sure\n         now that the 5-tuple is unique. */\n      struct tcp_pcb *cpcb;\n      int i;\n      /* Don't check listen- and bound-PCBs, check active- and TIME-WAIT PCBs. */\n      for (i = 2; i < NUM_TCP_PCB_LISTS; i++) {\n        for (cpcb = *tcp_pcb_lists[i]; cpcb != NULL; cpcb = cpcb->next) {\n          if ((cpcb->local_port == pcb->local_port) &&\n              (cpcb->remote_port == port) &&\n              ip_addr_cmp(&cpcb->local_ip, &pcb->local_ip) &&\n              ip_addr_cmp(&cpcb->remote_ip, ipaddr)) {\n            /* linux returns EISCONN here, but ERR_USE should be OK for us */\n            return ERR_USE;\n          }\n        }\n      }\n    }\n#endif /* SO_REUSE */\n  }\n\n  iss = tcp_next_iss(pcb);\n  pcb->rcv_nxt = 0;\n  pcb->snd_nxt = iss;\n  pcb->lastack = iss - 1;\n  pcb->snd_wl2 = iss - 1;\n  pcb->snd_lbb = iss - 1;\n  /* Start with a window that does not need scaling. When window scaling is\n     enabled and used, the window is enlarged when both sides agree on scaling. */\n  pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND);\n  pcb->rcv_ann_right_edge = pcb->rcv_nxt;\n  pcb->snd_wnd = TCP_WND;\n  /* As initial send MSS, we use TCP_MSS but limit it to 536.\n     The send MSS is updated when an MSS option is received. */\n  pcb->mss = INITIAL_MSS;\n#if TCP_CALCULATE_EFF_SEND_MSS\n  pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip);\n#endif /* TCP_CALCULATE_EFF_SEND_MSS */\n  pcb->cwnd = 1;\n#if LWIP_CALLBACK_API\n  pcb->connected = connected;\n#else /* LWIP_CALLBACK_API */\n  LWIP_UNUSED_ARG(connected);\n#endif /* LWIP_CALLBACK_API */\n\n  /* Send a SYN together with the MSS option. */\n  ret = tcp_enqueue_flags(pcb, TCP_SYN);\n  if (ret == ERR_OK) {\n    /* SYN segment was enqueued, changed the pcbs state now */\n    pcb->state = SYN_SENT;\n    if (old_local_port != 0) {\n      TCP_RMV(&tcp_bound_pcbs, pcb);\n    }\n    TCP_REG_ACTIVE(pcb);\n    MIB2_STATS_INC(mib2.tcpactiveopens);\n\n    tcp_output(pcb);\n  }\n  return ret;\n}\n\n/**\n * Called every 500 ms and implements the retransmission timer and the timer that\n * removes PCBs that have been in TIME-WAIT for enough time. It also increments\n * various timers such as the inactivity timer in each PCB.\n *\n * Automatically called from tcp_tmr().\n */\nvoid\ntcp_slowtmr(void)\n{\n  struct tcp_pcb *pcb, *prev;\n  tcpwnd_size_t eff_wnd;\n  u8_t pcb_remove;      /* flag if a PCB should be removed */\n  u8_t pcb_reset;       /* flag if a RST should be sent when removing */\n  err_t err;\n\n  err = ERR_OK;\n\n  ++tcp_ticks;\n  ++tcp_timer_ctr;\n\ntcp_slowtmr_start:\n  /* Steps through all of the active PCBs. */\n  prev = NULL;\n  pcb = tcp_active_pcbs;\n  if (pcb == NULL) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"tcp_slowtmr: no active pcbs\\n\"));\n  }\n  while (pcb != NULL) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"tcp_slowtmr: processing active pcb\\n\"));\n    LWIP_ASSERT(\"tcp_slowtmr: active pcb->state != CLOSED\\n\", pcb->state != CLOSED);\n    LWIP_ASSERT(\"tcp_slowtmr: active pcb->state != LISTEN\\n\", pcb->state != LISTEN);\n    LWIP_ASSERT(\"tcp_slowtmr: active pcb->state != TIME-WAIT\\n\", pcb->state != TIME_WAIT);\n    if (pcb->last_timer == tcp_timer_ctr) {\n      /* skip this pcb, we have already processed it */\n      pcb = pcb->next;\n      continue;\n    }\n    pcb->last_timer = tcp_timer_ctr;\n\n    pcb_remove = 0;\n    pcb_reset = 0;\n\n    if (pcb->state == SYN_SENT && pcb->nrtx >= TCP_SYNMAXRTX) {\n      ++pcb_remove;\n      LWIP_DEBUGF(TCP_DEBUG, (\"tcp_slowtmr: max SYN retries reached\\n\"));\n    }\n    else if (pcb->nrtx >= TCP_MAXRTX) {\n      ++pcb_remove;\n      LWIP_DEBUGF(TCP_DEBUG, (\"tcp_slowtmr: max DATA retries reached\\n\"));\n    } else {\n      if (pcb->persist_backoff > 0) {\n        /* If snd_wnd is zero, use persist timer to send 1 byte probes\n         * instead of using the standard retransmission mechanism. */\n        u8_t backoff_cnt = tcp_persist_backoff[pcb->persist_backoff-1];\n        if (pcb->persist_cnt < backoff_cnt) {\n          pcb->persist_cnt++;\n        }\n        if (pcb->persist_cnt >= backoff_cnt) {\n          if (tcp_zero_window_probe(pcb) == ERR_OK) {\n            pcb->persist_cnt = 0;\n            if (pcb->persist_backoff < sizeof(tcp_persist_backoff)) {\n              pcb->persist_backoff++;\n            }\n          }\n        }\n      } else {\n        /* Increase the retransmission timer if it is running */\n        if (pcb->rtime >= 0) {\n          ++pcb->rtime;\n        }\n\n        if (pcb->unacked != NULL && pcb->rtime >= pcb->rto) {\n          /* Time for a retransmission. */\n          LWIP_DEBUGF(TCP_RTO_DEBUG, (\"tcp_slowtmr: rtime %\"S16_F\n                                      \" pcb->rto %\"S16_F\"\\n\",\n                                      pcb->rtime, pcb->rto));\n\n          /* Double retransmission time-out unless we are trying to\n           * connect to somebody (i.e., we are in SYN_SENT). */\n          if (pcb->state != SYN_SENT) {\n            u8_t backoff_idx = LWIP_MIN(pcb->nrtx, sizeof(tcp_backoff)-1);\n            pcb->rto = ((pcb->sa >> 3) + pcb->sv) << tcp_backoff[backoff_idx];\n          }\n\n          /* Reset the retransmission timer. */\n          pcb->rtime = 0;\n\n          /* Reduce congestion window and ssthresh. */\n          eff_wnd = LWIP_MIN(pcb->cwnd, pcb->snd_wnd);\n          pcb->ssthresh = eff_wnd >> 1;\n          if (pcb->ssthresh < (tcpwnd_size_t)(pcb->mss << 1)) {\n            pcb->ssthresh = (pcb->mss << 1);\n          }\n          pcb->cwnd = pcb->mss;\n          LWIP_DEBUGF(TCP_CWND_DEBUG, (\"tcp_slowtmr: cwnd %\"TCPWNDSIZE_F\n                                       \" ssthresh %\"TCPWNDSIZE_F\"\\n\",\n                                       pcb->cwnd, pcb->ssthresh));\n\n          /* The following needs to be called AFTER cwnd is set to one\n             mss - STJ */\n          tcp_rexmit_rto(pcb);\n        }\n      }\n    }\n    /* Check if this PCB has stayed too long in FIN-WAIT-2 */\n    if (pcb->state == FIN_WAIT_2) {\n      /* If this PCB is in FIN_WAIT_2 because of SHUT_WR don't let it time out. */\n      if (pcb->flags & TF_RXCLOSED) {\n        /* PCB was fully closed (either through close() or SHUT_RDWR):\n           normal FIN-WAIT timeout handling. */\n        if ((u32_t)(tcp_ticks - pcb->tmr) >\n            TCP_FIN_WAIT_TIMEOUT / TCP_SLOW_INTERVAL) {\n          ++pcb_remove;\n          LWIP_DEBUGF(TCP_DEBUG, (\"tcp_slowtmr: removing pcb stuck in FIN-WAIT-2\\n\"));\n        }\n      }\n    }\n\n    /* Check if KEEPALIVE should be sent */\n    if (ip_get_option(pcb, SOF_KEEPALIVE) &&\n       ((pcb->state == ESTABLISHED) ||\n        (pcb->state == CLOSE_WAIT))) {\n      if ((u32_t)(tcp_ticks - pcb->tmr) >\n         (pcb->keep_idle + TCP_KEEP_DUR(pcb)) / TCP_SLOW_INTERVAL)\n      {\n        LWIP_DEBUGF(TCP_DEBUG, (\"tcp_slowtmr: KEEPALIVE timeout. Aborting connection to \"));\n        ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip);\n        LWIP_DEBUGF(TCP_DEBUG, (\"\\n\"));\n\n        ++pcb_remove;\n        ++pcb_reset;\n      } else if ((u32_t)(tcp_ticks - pcb->tmr) >\n                (pcb->keep_idle + pcb->keep_cnt_sent * TCP_KEEP_INTVL(pcb))\n                / TCP_SLOW_INTERVAL)\n      {\n        err = tcp_keepalive(pcb);\n        if (err == ERR_OK) {\n          pcb->keep_cnt_sent++;\n        }\n      }\n    }\n\n    /* If this PCB has queued out of sequence data, but has been\n       inactive for too long, will drop the data (it will eventually\n       be retransmitted). */\n#if TCP_QUEUE_OOSEQ\n    if (pcb->ooseq != NULL &&\n        (u32_t)tcp_ticks - pcb->tmr >= pcb->rto * TCP_OOSEQ_TIMEOUT) {\n      tcp_segs_free(pcb->ooseq);\n      pcb->ooseq = NULL;\n      LWIP_DEBUGF(TCP_CWND_DEBUG, (\"tcp_slowtmr: dropping OOSEQ queued data\\n\"));\n    }\n#endif /* TCP_QUEUE_OOSEQ */\n\n    /* Check if this PCB has stayed too long in SYN-RCVD */\n    if (pcb->state == SYN_RCVD) {\n      if ((u32_t)(tcp_ticks - pcb->tmr) >\n          TCP_SYN_RCVD_TIMEOUT / TCP_SLOW_INTERVAL) {\n        ++pcb_remove;\n        LWIP_DEBUGF(TCP_DEBUG, (\"tcp_slowtmr: removing pcb stuck in SYN-RCVD\\n\"));\n      }\n    }\n\n    /* Check if this PCB has stayed too long in LAST-ACK */\n    if (pcb->state == LAST_ACK) {\n      if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {\n        ++pcb_remove;\n        LWIP_DEBUGF(TCP_DEBUG, (\"tcp_slowtmr: removing pcb stuck in LAST-ACK\\n\"));\n      }\n    }\n\n    /* If the PCB should be removed, do it. */\n    if (pcb_remove) {\n      struct tcp_pcb *pcb2;\n#if LWIP_CALLBACK_API\n      tcp_err_fn err_fn = pcb->errf;\n#endif /* LWIP_CALLBACK_API */\n      void *err_arg;\n      enum tcp_state last_state;\n      tcp_pcb_purge(pcb);\n      /* Remove PCB from tcp_active_pcbs list. */\n      if (prev != NULL) {\n        LWIP_ASSERT(\"tcp_slowtmr: middle tcp != tcp_active_pcbs\", pcb != tcp_active_pcbs);\n        prev->next = pcb->next;\n      } else {\n        /* This PCB was the first. */\n        LWIP_ASSERT(\"tcp_slowtmr: first pcb == tcp_active_pcbs\", tcp_active_pcbs == pcb);\n        tcp_active_pcbs = pcb->next;\n      }\n\n      if (pcb_reset) {\n        tcp_rst(pcb->snd_nxt, pcb->rcv_nxt, &pcb->local_ip, &pcb->remote_ip,\n                 pcb->local_port, pcb->remote_port);\n      }\n\n      err_arg = pcb->callback_arg;\n      last_state = pcb->state;\n      pcb2 = pcb;\n      pcb = pcb->next;\n      memp_free(MEMP_TCP_PCB, pcb2);\n\n      tcp_active_pcbs_changed = 0;\n      TCP_EVENT_ERR(last_state, err_fn, err_arg, ERR_ABRT);\n      if (tcp_active_pcbs_changed) {\n        goto tcp_slowtmr_start;\n      }\n    } else {\n      /* get the 'next' element now and work with 'prev' below (in case of abort) */\n      prev = pcb;\n      pcb = pcb->next;\n\n      /* We check if we should poll the connection. */\n      ++prev->polltmr;\n      if (prev->polltmr >= prev->pollinterval) {\n        prev->polltmr = 0;\n        LWIP_DEBUGF(TCP_DEBUG, (\"tcp_slowtmr: polling application\\n\"));\n        tcp_active_pcbs_changed = 0;\n        TCP_EVENT_POLL(prev, err);\n        if (tcp_active_pcbs_changed) {\n          goto tcp_slowtmr_start;\n        }\n        /* if err == ERR_ABRT, 'prev' is already deallocated */\n        if (err == ERR_OK) {\n          tcp_output(prev);\n        }\n      }\n    }\n  }\n\n\n  /* Steps through all of the TIME-WAIT PCBs. */\n  prev = NULL;\n  pcb = tcp_tw_pcbs;\n  while (pcb != NULL) {\n    LWIP_ASSERT(\"tcp_slowtmr: TIME-WAIT pcb->state == TIME-WAIT\", pcb->state == TIME_WAIT);\n    pcb_remove = 0;\n\n    /* Check if this PCB has stayed long enough in TIME-WAIT */\n    if ((u32_t)(tcp_ticks - pcb->tmr) > 2 * TCP_MSL / TCP_SLOW_INTERVAL) {\n      ++pcb_remove;\n    }\n\n    /* If the PCB should be removed, do it. */\n    if (pcb_remove) {\n      struct tcp_pcb *pcb2;\n      tcp_pcb_purge(pcb);\n      /* Remove PCB from tcp_tw_pcbs list. */\n      if (prev != NULL) {\n        LWIP_ASSERT(\"tcp_slowtmr: middle tcp != tcp_tw_pcbs\", pcb != tcp_tw_pcbs);\n        prev->next = pcb->next;\n      } else {\n        /* This PCB was the first. */\n        LWIP_ASSERT(\"tcp_slowtmr: first pcb == tcp_tw_pcbs\", tcp_tw_pcbs == pcb);\n        tcp_tw_pcbs = pcb->next;\n      }\n      pcb2 = pcb;\n      pcb = pcb->next;\n      memp_free(MEMP_TCP_PCB, pcb2);\n    } else {\n      prev = pcb;\n      pcb = pcb->next;\n    }\n  }\n}\n\n/**\n * Is called every TCP_FAST_INTERVAL (250 ms) and process data previously\n * \"refused\" by upper layer (application) and sends delayed ACKs.\n *\n * Automatically called from tcp_tmr().\n */\nvoid\ntcp_fasttmr(void)\n{\n  struct tcp_pcb *pcb;\n\n  ++tcp_timer_ctr;\n\ntcp_fasttmr_start:\n  pcb = tcp_active_pcbs;\n\n  while (pcb != NULL) {\n    if (pcb->last_timer != tcp_timer_ctr) {\n      struct tcp_pcb *next;\n      pcb->last_timer = tcp_timer_ctr;\n      /* send delayed ACKs */\n      if (pcb->flags & TF_ACK_DELAY) {\n        LWIP_DEBUGF(TCP_DEBUG, (\"tcp_fasttmr: delayed ACK\\n\"));\n        tcp_ack_now(pcb);\n        tcp_output(pcb);\n        pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);\n      }\n      /* send pending FIN */\n      if (pcb->flags & TF_CLOSEPEND) {\n        LWIP_DEBUGF(TCP_DEBUG, (\"tcp_fasttmr: pending FIN\\n\"));\n        pcb->flags &= ~(TF_CLOSEPEND);\n        tcp_close_shutdown_fin(pcb);\n      }\n\n      next = pcb->next;\n\n      /* If there is data which was previously \"refused\" by upper layer */\n      if (pcb->refused_data != NULL) {\n        tcp_active_pcbs_changed = 0;\n        tcp_process_refused_data(pcb);\n        if (tcp_active_pcbs_changed) {\n          /* application callback has changed the pcb list: restart the loop */\n          goto tcp_fasttmr_start;\n        }\n      }\n      pcb = next;\n    } else {\n      pcb = pcb->next;\n    }\n  }\n}\n\n/** Call tcp_output for all active pcbs that have TF_NAGLEMEMERR set */\nvoid\ntcp_txnow(void)\n{\n  struct tcp_pcb *pcb;\n\n  for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {\n    if (pcb->flags & TF_NAGLEMEMERR) {\n      tcp_output(pcb);\n    }\n  }\n}\n\n/** Pass pcb->refused_data to the recv callback */\nerr_t\ntcp_process_refused_data(struct tcp_pcb *pcb)\n{\n#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\n  struct pbuf *rest;\n  while (pcb->refused_data != NULL)\n#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n  {\n    err_t err;\n    u8_t refused_flags = pcb->refused_data->flags;\n    /* set pcb->refused_data to NULL in case the callback frees it and then\n       closes the pcb */\n    struct pbuf *refused_data = pcb->refused_data;\n#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\n    pbuf_split_64k(refused_data, &rest);\n    pcb->refused_data = rest;\n#else /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n    pcb->refused_data = NULL;\n#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n    /* Notify again application with data previously received. */\n    LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_input: notify kept packet\\n\"));\n    TCP_EVENT_RECV(pcb, refused_data, ERR_OK, err);\n    if (err == ERR_OK) {\n      /* did refused_data include a FIN? */\n      if (refused_flags & PBUF_FLAG_TCP_FIN\n#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\n          && (rest == NULL)\n#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n         ) {\n        /* correct rcv_wnd as the application won't call tcp_recved()\n           for the FIN's seqno */\n        if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {\n          pcb->rcv_wnd++;\n        }\n        TCP_EVENT_CLOSED(pcb, err);\n        if (err == ERR_ABRT) {\n          return ERR_ABRT;\n        }\n      }\n    } else if (err == ERR_ABRT) {\n      /* if err == ERR_ABRT, 'pcb' is already deallocated */\n      /* Drop incoming packets because pcb is \"full\" (only if the incoming\n         segment contains data). */\n      LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_input: drop incoming packets, because pcb is \\\"full\\\"\\n\"));\n      return ERR_ABRT;\n    } else {\n      /* data is still refused, pbuf is still valid (go on for ACK-only packets) */\n#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\n      if (rest != NULL) {\n        pbuf_cat(refused_data, rest);\n      }\n#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n      pcb->refused_data = refused_data;\n      return ERR_INPROGRESS;\n    }\n  }\n  return ERR_OK;\n}\n\n/**\n * Deallocates a list of TCP segments (tcp_seg structures).\n *\n * @param seg tcp_seg list of TCP segments to free\n */\nvoid\ntcp_segs_free(struct tcp_seg *seg)\n{\n  while (seg != NULL) {\n    struct tcp_seg *next = seg->next;\n    tcp_seg_free(seg);\n    seg = next;\n  }\n}\n\n/**\n * Frees a TCP segment (tcp_seg structure).\n *\n * @param seg single tcp_seg to free\n */\nvoid\ntcp_seg_free(struct tcp_seg *seg)\n{\n  if (seg != NULL) {\n    if (seg->p != NULL) {\n      pbuf_free(seg->p);\n#if TCP_DEBUG\n      seg->p = NULL;\n#endif /* TCP_DEBUG */\n    }\n    memp_free(MEMP_TCP_SEG, seg);\n  }\n}\n\n/**\n * Sets the priority of a connection.\n *\n * @param pcb the tcp_pcb to manipulate\n * @param prio new priority\n */\nvoid\ntcp_setprio(struct tcp_pcb *pcb, u8_t prio)\n{\n  pcb->prio = prio;\n}\n\n#if TCP_QUEUE_OOSEQ\n/**\n * Returns a copy of the given TCP segment.\n * The pbuf and data are not copied, only the pointers\n *\n * @param seg the old tcp_seg\n * @return a copy of seg\n */\nstruct tcp_seg *\ntcp_seg_copy(struct tcp_seg *seg)\n{\n  struct tcp_seg *cseg;\n\n  cseg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG);\n  if (cseg == NULL) {\n    return NULL;\n  }\n  SMEMCPY((u8_t *)cseg, (const u8_t *)seg, sizeof(struct tcp_seg));\n  pbuf_ref(cseg->p);\n  return cseg;\n}\n#endif /* TCP_QUEUE_OOSEQ */\n\n#if LWIP_CALLBACK_API\n/**\n * Default receive callback that is called if the user didn't register\n * a recv callback for the pcb.\n */\nerr_t\ntcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err)\n{\n  LWIP_UNUSED_ARG(arg);\n  if (p != NULL) {\n    tcp_recved(pcb, p->tot_len);\n    pbuf_free(p);\n  } else if (err == ERR_OK) {\n    return tcp_close(pcb);\n  }\n  return ERR_OK;\n}\n#endif /* LWIP_CALLBACK_API */\n\n/**\n * Kills the oldest active connection that has the same or lower priority than\n * 'prio'.\n *\n * @param prio minimum priority\n */\nstatic void\ntcp_kill_prio(u8_t prio)\n{\n  struct tcp_pcb *pcb, *inactive;\n  u32_t inactivity;\n  u8_t mprio;\n\n  mprio = LWIP_MIN(TCP_PRIO_MAX, prio);\n\n  /* We kill the oldest active connection that has lower priority than prio. */\n  inactivity = 0;\n  inactive = NULL;\n  for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {\n    if (pcb->prio <= mprio &&\n       (u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {\n      inactivity = tcp_ticks - pcb->tmr;\n      inactive = pcb;\n      mprio = pcb->prio;\n    }\n  }\n  if (inactive != NULL) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"tcp_kill_prio: killing oldest PCB %p (%\"S32_F\")\\n\",\n           (void *)inactive, inactivity));\n    tcp_abort(inactive);\n  }\n}\n\n/**\n * Kills the oldest connection that is in specific state.\n * Called from tcp_alloc() for LAST_ACK and CLOSING if no more connections are available.\n */\nstatic void\ntcp_kill_state(enum tcp_state state)\n{\n  struct tcp_pcb *pcb, *inactive;\n  u32_t inactivity;\n\n  LWIP_ASSERT(\"invalid state\", (state == CLOSING) || (state == LAST_ACK));\n\n  inactivity = 0;\n  inactive = NULL;\n  /* Go through the list of active pcbs and get the oldest pcb that is in state\n     CLOSING/LAST_ACK. */\n  for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {\n    if (pcb->state == state) {\n      if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {\n        inactivity = tcp_ticks - pcb->tmr;\n        inactive = pcb;\n      }\n    }\n  }\n  if (inactive != NULL) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"tcp_kill_closing: killing oldest %s PCB %p (%\"S32_F\")\\n\",\n           tcp_state_str[state], (void *)inactive, inactivity));\n    /* Don't send a RST, since no data is lost. */\n    tcp_abandon(inactive, 0);\n  }\n}\n\n/**\n * Kills the oldest connection that is in TIME_WAIT state.\n * Called from tcp_alloc() if no more connections are available.\n */\nstatic void\ntcp_kill_timewait(void)\n{\n  struct tcp_pcb *pcb, *inactive;\n  u32_t inactivity;\n\n  inactivity = 0;\n  inactive = NULL;\n  /* Go through the list of TIME_WAIT pcbs and get the oldest pcb. */\n  for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {\n    if ((u32_t)(tcp_ticks - pcb->tmr) >= inactivity) {\n      inactivity = tcp_ticks - pcb->tmr;\n      inactive = pcb;\n    }\n  }\n  if (inactive != NULL) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"tcp_kill_timewait: killing oldest TIME-WAIT PCB %p (%\"S32_F\")\\n\",\n           (void *)inactive, inactivity));\n    tcp_abort(inactive);\n  }\n}\n\n/**\n * Allocate a new tcp_pcb structure.\n *\n * @param prio priority for the new pcb\n * @return a new tcp_pcb that initially is in state CLOSED\n */\nstruct tcp_pcb *\ntcp_alloc(u8_t prio)\n{\n  struct tcp_pcb *pcb;\n\n  pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);\n  if (pcb == NULL) {\n    /* Try killing oldest connection in TIME-WAIT. */\n    LWIP_DEBUGF(TCP_DEBUG, (\"tcp_alloc: killing off oldest TIME-WAIT connection\\n\"));\n    tcp_kill_timewait();\n    /* Try to allocate a tcp_pcb again. */\n    pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);\n    if (pcb == NULL) {\n      /* Try killing oldest connection in LAST-ACK (these wouldn't go to TIME-WAIT). */\n      LWIP_DEBUGF(TCP_DEBUG, (\"tcp_alloc: killing off oldest LAST-ACK connection\\n\"));\n      tcp_kill_state(LAST_ACK);\n      /* Try to allocate a tcp_pcb again. */\n      pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);\n      if (pcb == NULL) {\n        /* Try killing oldest connection in CLOSING. */\n        LWIP_DEBUGF(TCP_DEBUG, (\"tcp_alloc: killing off oldest CLOSING connection\\n\"));\n        tcp_kill_state(CLOSING);\n        /* Try to allocate a tcp_pcb again. */\n        pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);\n        if (pcb == NULL) {\n          /* Try killing active connections with lower priority than the new one. */\n          LWIP_DEBUGF(TCP_DEBUG, (\"tcp_alloc: killing connection with prio lower than %d\\n\", prio));\n          tcp_kill_prio(prio);\n          /* Try to allocate a tcp_pcb again. */\n          pcb = (struct tcp_pcb *)memp_malloc(MEMP_TCP_PCB);\n          if (pcb != NULL) {\n            /* adjust err stats: memp_malloc failed multiple times before */\n            MEMP_STATS_DEC(err, MEMP_TCP_PCB);\n          }\n        }\n        if (pcb != NULL) {\n          /* adjust err stats: memp_malloc failed multiple times before */\n          MEMP_STATS_DEC(err, MEMP_TCP_PCB);\n        }\n      }\n      if (pcb != NULL) {\n        /* adjust err stats: memp_malloc failed multiple times before */\n        MEMP_STATS_DEC(err, MEMP_TCP_PCB);\n      }\n    }\n    if (pcb != NULL) {\n      /* adjust err stats: memp_malloc failed above */\n      MEMP_STATS_DEC(err, MEMP_TCP_PCB);\n    }\n  }\n  if (pcb != NULL) {\n    /* zero out the whole pcb, so there is no need to initialize members to zero */\n    memset(pcb, 0, sizeof(struct tcp_pcb));\n    pcb->prio = prio;\n    pcb->snd_buf = TCP_SND_BUF;\n    /* Start with a window that does not need scaling. When window scaling is\n       enabled and used, the window is enlarged when both sides agree on scaling. */\n    pcb->rcv_wnd = pcb->rcv_ann_wnd = TCPWND_MIN16(TCP_WND);\n    pcb->ttl = TCP_TTL;\n    /* As initial send MSS, we use TCP_MSS but limit it to 536.\n       The send MSS is updated when an MSS option is received. */\n    pcb->mss = INITIAL_MSS;\n    pcb->rto = 3000 / TCP_SLOW_INTERVAL;\n    pcb->sv = 3000 / TCP_SLOW_INTERVAL;\n    pcb->rtime = -1;\n    pcb->cwnd = 1;\n    pcb->tmr = tcp_ticks;\n    pcb->last_timer = tcp_timer_ctr;\n\n    /* RFC 5681 recommends setting ssthresh abritrarily high and gives an example\n    of using the largest advertised receive window.  We've seen complications with\n    receiving TCPs that use window scaling and/or window auto-tuning where the\n    initial advertised window is very small and then grows rapidly once the\n    connection is established. To avoid these complications, we set ssthresh to the\n    largest effective cwnd (amount of in-flight data) that the sender can have. */\n    pcb->ssthresh = TCP_SND_BUF;\n\n#if LWIP_CALLBACK_API\n    pcb->recv = tcp_recv_null;\n#endif /* LWIP_CALLBACK_API */\n\n    /* Init KEEPALIVE timer */\n    pcb->keep_idle  = TCP_KEEPIDLE_DEFAULT;\n\n#if LWIP_TCP_KEEPALIVE\n    pcb->keep_intvl = TCP_KEEPINTVL_DEFAULT;\n    pcb->keep_cnt   = TCP_KEEPCNT_DEFAULT;\n#endif /* LWIP_TCP_KEEPALIVE */\n  }\n  return pcb;\n}\n\n/**\n * @ingroup tcp_raw\n * Creates a new TCP protocol control block but doesn't place it on\n * any of the TCP PCB lists.\n * The pcb is not put on any list until binding using tcp_bind().\n *\n * @internal: Maybe there should be a idle TCP PCB list where these\n * PCBs are put on. Port reservation using tcp_bind() is implemented but\n * allocated pcbs that are not bound can't be killed automatically if wanting\n * to allocate a pcb with higher prio (@see tcp_kill_prio())\n *\n * @return a new tcp_pcb that initially is in state CLOSED\n */\nstruct tcp_pcb *\ntcp_new(void)\n{\n  return tcp_alloc(TCP_PRIO_NORMAL);\n}\n\n/**\n * @ingroup tcp_raw\n * Creates a new TCP protocol control block but doesn't\n * place it on any of the TCP PCB lists.\n * The pcb is not put on any list until binding using tcp_bind().\n *\n * @param type IP address type, see @ref lwip_ip_addr_type definitions.\n * If you want to listen to IPv4 and IPv6 (dual-stack) connections,\n * supply @ref IPADDR_TYPE_ANY as argument and bind to @ref IP_ANY_TYPE.\n * @return a new tcp_pcb that initially is in state CLOSED\n */\nstruct tcp_pcb *\ntcp_new_ip_type(u8_t type)\n{\n  struct tcp_pcb * pcb;\n  pcb = tcp_alloc(TCP_PRIO_NORMAL);\n#if LWIP_IPV4 && LWIP_IPV6\n  if (pcb != NULL) {\n    IP_SET_TYPE_VAL(pcb->local_ip, type);\n    IP_SET_TYPE_VAL(pcb->remote_ip, type);\n  }\n#else\n  LWIP_UNUSED_ARG(type);\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n  return pcb;\n}\n\n/**\n * @ingroup tcp_raw\n * Used to specify the argument that should be passed callback\n * functions.\n *\n * @param pcb tcp_pcb to set the callback argument\n * @param arg void pointer argument to pass to callback functions\n */\nvoid\ntcp_arg(struct tcp_pcb *pcb, void *arg)\n{\n  /* This function is allowed to be called for both listen pcbs and\n     connection pcbs. */\n  if (pcb != NULL) {\n    pcb->callback_arg = arg;\n  }\n}\n#if LWIP_CALLBACK_API\n\n/**\n * @ingroup tcp_raw\n * Used to specify the function that should be called when a TCP\n * connection receives data.\n *\n * @param pcb tcp_pcb to set the recv callback\n * @param recv callback function to call for this pcb when data is received\n */\nvoid\ntcp_recv(struct tcp_pcb *pcb, tcp_recv_fn recv)\n{\n  if (pcb != NULL) {\n    LWIP_ASSERT(\"invalid socket state for recv callback\", pcb->state != LISTEN);\n    pcb->recv = recv;\n  }\n}\n\n/**\n * @ingroup tcp_raw\n * Used to specify the function that should be called when TCP data\n * has been successfully delivered to the remote host.\n *\n * @param pcb tcp_pcb to set the sent callback\n * @param sent callback function to call for this pcb when data is successfully sent\n */\nvoid\ntcp_sent(struct tcp_pcb *pcb, tcp_sent_fn sent)\n{\n  if (pcb != NULL) {\n    LWIP_ASSERT(\"invalid socket state for sent callback\", pcb->state != LISTEN);\n    pcb->sent = sent;\n  }\n}\n\n/**\n * @ingroup tcp_raw\n * Used to specify the function that should be called when a fatal error\n * has occurred on the connection.\n *\n * @note The corresponding pcb is already freed when this callback is called!\n * \n * @param pcb tcp_pcb to set the err callback\n * @param err callback function to call for this pcb when a fatal error\n *        has occurred on the connection\n */\nvoid\ntcp_err(struct tcp_pcb *pcb, tcp_err_fn err)\n{\n  if (pcb != NULL) {\n    LWIP_ASSERT(\"invalid socket state for err callback\", pcb->state != LISTEN);\n    pcb->errf = err;\n  }\n}\n\n/**\n * @ingroup tcp_raw\n * Used for specifying the function that should be called when a\n * LISTENing connection has been connected to another host.\n *\n * @param pcb tcp_pcb to set the accept callback\n * @param accept callback function to call for this pcb when LISTENing\n *        connection has been connected to another host\n */\nvoid\ntcp_accept(struct tcp_pcb *pcb, tcp_accept_fn accept)\n{\n  if ((pcb != NULL) && (pcb->state == LISTEN)) {\n    struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen*)pcb;\n    lpcb->accept = accept;\n  }\n}\n#endif /* LWIP_CALLBACK_API */\n\n\n/**\n * @ingroup tcp_raw\n * Used to specify the function that should be called periodically\n * from TCP. The interval is specified in terms of the TCP coarse\n * timer interval, which is called twice a second.\n *\n */\nvoid\ntcp_poll(struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval)\n{\n  LWIP_ASSERT(\"invalid socket state for poll\", pcb->state != LISTEN);\n#if LWIP_CALLBACK_API\n  pcb->poll = poll;\n#else /* LWIP_CALLBACK_API */\n  LWIP_UNUSED_ARG(poll);\n#endif /* LWIP_CALLBACK_API */\n  pcb->pollinterval = interval;\n}\n\n/**\n * Purges a TCP PCB. Removes any buffered data and frees the buffer memory\n * (pcb->ooseq, pcb->unsent and pcb->unacked are freed).\n *\n * @param pcb tcp_pcb to purge. The pcb itself is not deallocated!\n */\nvoid\ntcp_pcb_purge(struct tcp_pcb *pcb)\n{\n  if (pcb->state != CLOSED &&\n     pcb->state != TIME_WAIT &&\n     pcb->state != LISTEN) {\n\n    LWIP_DEBUGF(TCP_DEBUG, (\"tcp_pcb_purge\\n\"));\n\n    tcp_backlog_accepted(pcb);\n\n    if (pcb->refused_data != NULL) {\n      LWIP_DEBUGF(TCP_DEBUG, (\"tcp_pcb_purge: data left on ->refused_data\\n\"));\n      pbuf_free(pcb->refused_data);\n      pcb->refused_data = NULL;\n    }\n    if (pcb->unsent != NULL) {\n      LWIP_DEBUGF(TCP_DEBUG, (\"tcp_pcb_purge: not all data sent\\n\"));\n    }\n    if (pcb->unacked != NULL) {\n      LWIP_DEBUGF(TCP_DEBUG, (\"tcp_pcb_purge: data left on ->unacked\\n\"));\n    }\n#if TCP_QUEUE_OOSEQ\n    if (pcb->ooseq != NULL) {\n      LWIP_DEBUGF(TCP_DEBUG, (\"tcp_pcb_purge: data left on ->ooseq\\n\"));\n    }\n    tcp_segs_free(pcb->ooseq);\n    pcb->ooseq = NULL;\n#endif /* TCP_QUEUE_OOSEQ */\n\n    /* Stop the retransmission timer as it will expect data on unacked\n       queue if it fires */\n    pcb->rtime = -1;\n\n    tcp_segs_free(pcb->unsent);\n    tcp_segs_free(pcb->unacked);\n    pcb->unacked = pcb->unsent = NULL;\n#if TCP_OVERSIZE\n    pcb->unsent_oversize = 0;\n#endif /* TCP_OVERSIZE */\n  }\n}\n\n/**\n * Purges the PCB and removes it from a PCB list. Any delayed ACKs are sent first.\n *\n * @param pcblist PCB list to purge.\n * @param pcb tcp_pcb to purge. The pcb itself is NOT deallocated!\n */\nvoid\ntcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb)\n{\n  TCP_RMV(pcblist, pcb);\n\n  tcp_pcb_purge(pcb);\n\n  /* if there is an outstanding delayed ACKs, send it */\n  if (pcb->state != TIME_WAIT &&\n     pcb->state != LISTEN &&\n     pcb->flags & TF_ACK_DELAY) {\n    pcb->flags |= TF_ACK_NOW;\n    tcp_output(pcb);\n  }\n\n  if (pcb->state != LISTEN) {\n    LWIP_ASSERT(\"unsent segments leaking\", pcb->unsent == NULL);\n    LWIP_ASSERT(\"unacked segments leaking\", pcb->unacked == NULL);\n#if TCP_QUEUE_OOSEQ\n    LWIP_ASSERT(\"ooseq segments leaking\", pcb->ooseq == NULL);\n#endif /* TCP_QUEUE_OOSEQ */\n  }\n\n  pcb->state = CLOSED;\n  /* reset the local port to prevent the pcb from being 'bound' */\n  pcb->local_port = 0;\n\n  LWIP_ASSERT(\"tcp_pcb_remove: tcp_pcbs_sane()\", tcp_pcbs_sane());\n}\n\n/**\n * Calculates a new initial sequence number for new connections.\n *\n * @return u32_t pseudo random sequence number\n */\nu32_t\ntcp_next_iss(struct tcp_pcb *pcb)\n{\n#ifdef LWIP_HOOK_TCP_ISN\n  return LWIP_HOOK_TCP_ISN(&pcb->local_ip, pcb->local_port, &pcb->remote_ip, pcb->remote_port);\n#else /* LWIP_HOOK_TCP_ISN */\n  static u32_t iss = 6510;\n\n  LWIP_UNUSED_ARG(pcb);\n\n  iss += tcp_ticks;       /* XXX */\n  return iss;\n#endif /* LWIP_HOOK_TCP_ISN */\n}\n\n#if TCP_CALCULATE_EFF_SEND_MSS\n/**\n * Calculates the effective send mss that can be used for a specific IP address\n * by using ip_route to determine the netif used to send to the address and\n * calculating the minimum of TCP_MSS and that netif's mtu (if set).\n */\nu16_t\ntcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest\n#if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING\n                     , const ip_addr_t *src\n#endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */\n                     )\n{\n  u16_t mss_s;\n  struct netif *outif;\n  s16_t mtu;\n\n  outif = ip_route(src, dest);\n#if LWIP_IPV6\n#if LWIP_IPV4\n  if (IP_IS_V6(dest))\n#endif /* LWIP_IPV4 */\n  {\n    /* First look in destination cache, to see if there is a Path MTU. */\n    mtu = nd6_get_destination_mtu(ip_2_ip6(dest), outif);\n  }\n#if LWIP_IPV4\n  else\n#endif /* LWIP_IPV4 */\n#endif /* LWIP_IPV6 */\n#if LWIP_IPV4\n  {\n    if (outif == NULL) {\n      return sendmss;\n    }\n    mtu = outif->mtu;\n  }\n#endif /* LWIP_IPV4 */\n\n  if (mtu != 0) {\n#if LWIP_IPV6\n#if LWIP_IPV4\n    if (IP_IS_V6(dest))\n#endif /* LWIP_IPV4 */\n    {\n      mss_s = mtu - IP6_HLEN - TCP_HLEN;\n    }\n#if LWIP_IPV4\n    else\n#endif /* LWIP_IPV4 */\n#endif /* LWIP_IPV6 */\n#if LWIP_IPV4\n    {\n      mss_s = mtu - IP_HLEN - TCP_HLEN;\n    }\n#endif /* LWIP_IPV4 */\n    /* RFC 1122, chap 4.2.2.6:\n     * Eff.snd.MSS = min(SendMSS+20, MMS_S) - TCPhdrsize - IPoptionsize\n     * We correct for TCP options in tcp_write(), and don't support IP options.\n     */\n    sendmss = LWIP_MIN(sendmss, mss_s);\n  }\n  return sendmss;\n}\n#endif /* TCP_CALCULATE_EFF_SEND_MSS */\n\n/** Helper function for tcp_netif_ip_addr_changed() that iterates a pcb list */\nstatic void\ntcp_netif_ip_addr_changed_pcblist(const ip_addr_t* old_addr, struct tcp_pcb* pcb_list)\n{\n  struct tcp_pcb *pcb;\n  pcb = pcb_list;\n  while (pcb != NULL) {\n    /* PCB bound to current local interface address? */\n    if (ip_addr_cmp(&pcb->local_ip, old_addr)\n#if LWIP_AUTOIP\n      /* connections to link-local addresses must persist (RFC3927 ch. 1.9) */\n      && (!IP_IS_V4_VAL(pcb->local_ip) || !ip4_addr_islinklocal(ip_2_ip4(&pcb->local_ip)))\n#endif /* LWIP_AUTOIP */\n      ) {\n      /* this connection must be aborted */\n      struct tcp_pcb *next = pcb->next;\n      LWIP_DEBUGF(NETIF_DEBUG | LWIP_DBG_STATE, (\"netif_set_ipaddr: aborting TCP pcb %p\\n\", (void *)pcb));\n      tcp_abort(pcb);\n      pcb = next;\n    } else {\n      pcb = pcb->next;\n    }\n  }\n}\n\n/** This function is called from netif.c when address is changed or netif is removed\n *\n * @param old_addr IP address of the netif before change\n * @param new_addr IP address of the netif after change or NULL if netif has been removed\n */\nvoid\ntcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr)\n{\n  struct tcp_pcb_listen *lpcb, *next;\n\n  if (!ip_addr_isany(old_addr)) {\n    tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_active_pcbs);\n    tcp_netif_ip_addr_changed_pcblist(old_addr, tcp_bound_pcbs);\n\n    if (!ip_addr_isany(new_addr)) {\n      /* PCB bound to current local interface address? */\n      for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = next) {\n        next = lpcb->next;\n        /* PCB bound to current local interface address? */\n        if (ip_addr_cmp(&lpcb->local_ip, old_addr)) {\n          /* The PCB is listening to the old ipaddr and\n            * is set to listen to the new one instead */\n          ip_addr_copy(lpcb->local_ip, *new_addr);\n        }\n      }\n    }\n  }\n}\n\nconst char*\ntcp_debug_state_str(enum tcp_state s)\n{\n  return tcp_state_str[s];\n}\n\n#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG\n/**\n * Print a tcp header for debugging purposes.\n *\n * @param tcphdr pointer to a struct tcp_hdr\n */\nvoid\ntcp_debug_print(struct tcp_hdr *tcphdr)\n{\n  LWIP_DEBUGF(TCP_DEBUG, (\"TCP header:\\n\"));\n  LWIP_DEBUGF(TCP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(TCP_DEBUG, (\"|    %5\"U16_F\"      |    %5\"U16_F\"      | (src port, dest port)\\n\",\n         lwip_ntohs(tcphdr->src), lwip_ntohs(tcphdr->dest)));\n  LWIP_DEBUGF(TCP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(TCP_DEBUG, (\"|           %010\"U32_F\"          | (seq no)\\n\",\n          lwip_ntohl(tcphdr->seqno)));\n  LWIP_DEBUGF(TCP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(TCP_DEBUG, (\"|           %010\"U32_F\"          | (ack no)\\n\",\n         lwip_ntohl(tcphdr->ackno)));\n  LWIP_DEBUGF(TCP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(TCP_DEBUG, (\"| %2\"U16_F\" |   |%\"U16_F\"%\"U16_F\"%\"U16_F\"%\"U16_F\"%\"U16_F\"%\"U16_F\"|     %5\"U16_F\"     | (hdrlen, flags (\",\n       TCPH_HDRLEN(tcphdr),\n         (u16_t)(TCPH_FLAGS(tcphdr) >> 5 & 1),\n         (u16_t)(TCPH_FLAGS(tcphdr) >> 4 & 1),\n         (u16_t)(TCPH_FLAGS(tcphdr) >> 3 & 1),\n         (u16_t)(TCPH_FLAGS(tcphdr) >> 2 & 1),\n         (u16_t)(TCPH_FLAGS(tcphdr) >> 1 & 1),\n         (u16_t)(TCPH_FLAGS(tcphdr)      & 1),\n         lwip_ntohs(tcphdr->wnd)));\n  tcp_debug_print_flags(TCPH_FLAGS(tcphdr));\n  LWIP_DEBUGF(TCP_DEBUG, (\"), win)\\n\"));\n  LWIP_DEBUGF(TCP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(TCP_DEBUG, (\"|    0x%04\"X16_F\"     |     %5\"U16_F\"     | (chksum, urgp)\\n\",\n         lwip_ntohs(tcphdr->chksum), lwip_ntohs(tcphdr->urgp)));\n  LWIP_DEBUGF(TCP_DEBUG, (\"+-------------------------------+\\n\"));\n}\n\n/**\n * Print a tcp state for debugging purposes.\n *\n * @param s enum tcp_state to print\n */\nvoid\ntcp_debug_print_state(enum tcp_state s)\n{\n  LWIP_DEBUGF(TCP_DEBUG, (\"State: %s\\n\", tcp_state_str[s]));\n}\n\n/**\n * Print tcp flags for debugging purposes.\n *\n * @param flags tcp flags, all active flags are printed\n */\nvoid\ntcp_debug_print_flags(u8_t flags)\n{\n  if (flags & TCP_FIN) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"FIN \"));\n  }\n  if (flags & TCP_SYN) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"SYN \"));\n  }\n  if (flags & TCP_RST) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"RST \"));\n  }\n  if (flags & TCP_PSH) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"PSH \"));\n  }\n  if (flags & TCP_ACK) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"ACK \"));\n  }\n  if (flags & TCP_URG) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"URG \"));\n  }\n  if (flags & TCP_ECE) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"ECE \"));\n  }\n  if (flags & TCP_CWR) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"CWR \"));\n  }\n  LWIP_DEBUGF(TCP_DEBUG, (\"\\n\"));\n}\n\n/**\n * Print all tcp_pcbs in every list for debugging purposes.\n */\nvoid\ntcp_debug_print_pcbs(void)\n{\n  struct tcp_pcb *pcb;\n  struct tcp_pcb_listen *pcbl;\n\n  LWIP_DEBUGF(TCP_DEBUG, (\"Active PCB states:\\n\"));\n  for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"Local port %\"U16_F\", foreign port %\"U16_F\" snd_nxt %\"U32_F\" rcv_nxt %\"U32_F\" \",\n                       pcb->local_port, pcb->remote_port,\n                       pcb->snd_nxt, pcb->rcv_nxt));\n    tcp_debug_print_state(pcb->state);\n  }\n\n  LWIP_DEBUGF(TCP_DEBUG, (\"Listen PCB states:\\n\"));\n  for (pcbl = tcp_listen_pcbs.listen_pcbs; pcbl != NULL; pcbl = pcbl->next) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"Local port %\"U16_F\" \", pcbl->local_port));\n    tcp_debug_print_state(pcbl->state);\n  }\n\n  LWIP_DEBUGF(TCP_DEBUG, (\"TIME-WAIT PCB states:\\n\"));\n  for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"Local port %\"U16_F\", foreign port %\"U16_F\" snd_nxt %\"U32_F\" rcv_nxt %\"U32_F\" \",\n                       pcb->local_port, pcb->remote_port,\n                       pcb->snd_nxt, pcb->rcv_nxt));\n    tcp_debug_print_state(pcb->state);\n  }\n}\n\n/**\n * Check state consistency of the tcp_pcb lists.\n */\ns16_t\ntcp_pcbs_sane(void)\n{\n  struct tcp_pcb *pcb;\n  for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {\n    LWIP_ASSERT(\"tcp_pcbs_sane: active pcb->state != CLOSED\", pcb->state != CLOSED);\n    LWIP_ASSERT(\"tcp_pcbs_sane: active pcb->state != LISTEN\", pcb->state != LISTEN);\n    LWIP_ASSERT(\"tcp_pcbs_sane: active pcb->state != TIME-WAIT\", pcb->state != TIME_WAIT);\n  }\n  for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {\n    LWIP_ASSERT(\"tcp_pcbs_sane: tw pcb->state == TIME-WAIT\", pcb->state == TIME_WAIT);\n  }\n  return 1;\n}\n#endif /* TCP_DEBUG */\n\n#endif /* LWIP_TCP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/tcp_in.c",
    "content": "/**\n * @file\n * Transmission Control Protocol, incoming traffic\n *\n * The input processing functions of the TCP layer.\n *\n * These functions are generally called in the order (ip_input() ->)\n * tcp_input() -> * tcp_process() -> tcp_receive() (-> application).\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/def.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#if LWIP_ND6_TCP_REACHABILITY_HINTS\n#include \"lwip/nd6.h\"\n#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */\n\n/** Initial CWND calculation as defined RFC 2581 */\n#define LWIP_TCP_CALC_INITIAL_CWND(mss) LWIP_MIN((4U * (mss)), LWIP_MAX((2U * (mss)), 4380U));\n\n/* These variables are global to all functions involved in the input\n   processing of TCP segments. They are set by the tcp_input()\n   function. */\nstatic struct tcp_seg inseg;\nstatic struct tcp_hdr *tcphdr;\nstatic u16_t tcphdr_optlen;\nstatic u16_t tcphdr_opt1len;\nstatic u8_t* tcphdr_opt2;\nstatic u16_t tcp_optidx;\nstatic u32_t seqno, ackno;\nstatic tcpwnd_size_t recv_acked;\nstatic u16_t tcplen;\nstatic u8_t flags;\n\nstatic u8_t recv_flags;\nstatic struct pbuf *recv_data;\n\nstruct tcp_pcb *tcp_input_pcb;\n\n/* Forward declarations. */\nstatic err_t tcp_process(struct tcp_pcb *pcb);\nstatic void tcp_receive(struct tcp_pcb *pcb);\nstatic void tcp_parseopt(struct tcp_pcb *pcb);\n\nstatic void tcp_listen_input(struct tcp_pcb_listen *pcb);\nstatic void tcp_timewait_input(struct tcp_pcb *pcb);\n\nstatic int tcp_input_delayed_close(struct tcp_pcb *pcb);\n\n/**\n * The initial input processing of TCP. It verifies the TCP header, demultiplexes\n * the segment between the PCBs and passes it on to tcp_process(), which implements\n * the TCP finite state machine. This function is called by the IP layer (in\n * ip_input()).\n *\n * @param p received TCP segment to process (p->payload pointing to the TCP header)\n * @param inp network interface on which this segment was received\n */\nvoid\ntcp_input(struct pbuf *p, struct netif *inp)\n{\n  struct tcp_pcb *pcb, *prev;\n  struct tcp_pcb_listen *lpcb;\n#if SO_REUSE\n  struct tcp_pcb *lpcb_prev = NULL;\n  struct tcp_pcb_listen *lpcb_any = NULL;\n#endif /* SO_REUSE */\n  u8_t hdrlen_bytes;\n  err_t err;\n\n  LWIP_UNUSED_ARG(inp);\n\n  PERF_START;\n\n  TCP_STATS_INC(tcp.recv);\n  MIB2_STATS_INC(mib2.tcpinsegs);\n\n  tcphdr = (struct tcp_hdr *)p->payload;\n\n#if TCP_INPUT_DEBUG\n  tcp_debug_print(tcphdr);\n#endif\n\n  /* Check that TCP header fits in payload */\n  if (p->len < TCP_HLEN) {\n    /* drop short packets */\n    LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_input: short packet (%\"U16_F\" bytes) discarded\\n\", p->tot_len));\n    TCP_STATS_INC(tcp.lenerr);\n    goto dropped;\n  }\n\n  /* Don't even process incoming broadcasts/multicasts. */\n  if (ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif()) ||\n      ip_addr_ismulticast(ip_current_dest_addr())) {\n    TCP_STATS_INC(tcp.proterr);\n    goto dropped;\n  }\n\n#if CHECKSUM_CHECK_TCP\n  IF__NETIF_CHECKSUM_ENABLED(inp, NETIF_CHECKSUM_CHECK_TCP) {\n    /* Verify TCP checksum. */\n    u16_t chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,\n                               ip_current_src_addr(), ip_current_dest_addr());\n    if (chksum != 0) {\n        LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_input: packet discarded due to failing checksum 0x%04\"X16_F\"\\n\",\n          chksum));\n      tcp_debug_print(tcphdr);\n      TCP_STATS_INC(tcp.chkerr);\n      goto dropped;\n    }\n  }\n#endif /* CHECKSUM_CHECK_TCP */\n\n  /* sanity-check header length */\n  hdrlen_bytes = TCPH_HDRLEN(tcphdr) * 4;\n  if ((hdrlen_bytes < TCP_HLEN) || (hdrlen_bytes > p->tot_len)) {\n    LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_input: invalid header length (%\"U16_F\")\\n\", (u16_t)hdrlen_bytes));\n    TCP_STATS_INC(tcp.lenerr);\n    goto dropped;\n  }\n\n  /* Move the payload pointer in the pbuf so that it points to the\n     TCP data instead of the TCP header. */\n  tcphdr_optlen = hdrlen_bytes - TCP_HLEN;\n  tcphdr_opt2 = NULL;\n  if (p->len >= hdrlen_bytes) {\n    /* all options are in the first pbuf */\n    tcphdr_opt1len = tcphdr_optlen;\n    pbuf_header(p, -(s16_t)hdrlen_bytes); /* cannot fail */\n  } else {\n    u16_t opt2len;\n    /* TCP header fits into first pbuf, options don't - data is in the next pbuf */\n    /* there must be a next pbuf, due to hdrlen_bytes sanity check above */\n    LWIP_ASSERT(\"p->next != NULL\", p->next != NULL);\n\n    /* advance over the TCP header (cannot fail) */\n    pbuf_header(p, -TCP_HLEN);\n\n    /* determine how long the first and second parts of the options are */\n    tcphdr_opt1len = p->len;\n    opt2len = tcphdr_optlen - tcphdr_opt1len;\n\n    /* options continue in the next pbuf: set p to zero length and hide the\n        options in the next pbuf (adjusting p->tot_len) */\n    pbuf_header(p, -(s16_t)tcphdr_opt1len);\n\n    /* check that the options fit in the second pbuf */\n    if (opt2len > p->next->len) {\n      /* drop short packets */\n      LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_input: options overflow second pbuf (%\"U16_F\" bytes)\\n\", p->next->len));\n      TCP_STATS_INC(tcp.lenerr);\n      goto dropped;\n    }\n\n    /* remember the pointer to the second part of the options */\n    tcphdr_opt2 = (u8_t*)p->next->payload;\n\n    /* advance p->next to point after the options, and manually\n        adjust p->tot_len to keep it consistent with the changed p->next */\n    pbuf_header(p->next, -(s16_t)opt2len);\n    p->tot_len -= opt2len;\n\n    LWIP_ASSERT(\"p->len == 0\", p->len == 0);\n    LWIP_ASSERT(\"p->tot_len == p->next->tot_len\", p->tot_len == p->next->tot_len);\n  }\n\n  /* Convert fields in TCP header to host byte order. */\n  tcphdr->src = lwip_ntohs(tcphdr->src);\n  tcphdr->dest = lwip_ntohs(tcphdr->dest);\n  seqno = tcphdr->seqno = lwip_ntohl(tcphdr->seqno);\n  ackno = tcphdr->ackno = lwip_ntohl(tcphdr->ackno);\n  tcphdr->wnd = lwip_ntohs(tcphdr->wnd);\n\n  flags = TCPH_FLAGS(tcphdr);\n  tcplen = p->tot_len + ((flags & (TCP_FIN | TCP_SYN)) ? 1 : 0);\n\n  /* Demultiplex an incoming segment. First, we check if it is destined\n     for an active connection. */\n  prev = NULL;\n\n  for (pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {\n    LWIP_ASSERT(\"tcp_input: active pcb->state != CLOSED\", pcb->state != CLOSED);\n    LWIP_ASSERT(\"tcp_input: active pcb->state != TIME-WAIT\", pcb->state != TIME_WAIT);\n    LWIP_ASSERT(\"tcp_input: active pcb->state != LISTEN\", pcb->state != LISTEN);\n    if (pcb->remote_port == tcphdr->src &&\n        pcb->local_port == tcphdr->dest &&\n        ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&\n        ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {\n      /* Move this PCB to the front of the list so that subsequent\n         lookups will be faster (we exploit locality in TCP segment\n         arrivals). */\n      LWIP_ASSERT(\"tcp_input: pcb->next != pcb (before cache)\", pcb->next != pcb);\n      if (prev != NULL) {\n        prev->next = pcb->next;\n        pcb->next = tcp_active_pcbs;\n        tcp_active_pcbs = pcb;\n      } else {\n        TCP_STATS_INC(tcp.cachehit);\n      }\n      LWIP_ASSERT(\"tcp_input: pcb->next != pcb (after cache)\", pcb->next != pcb);\n      break;\n    }\n    prev = pcb;\n  }\n\n  if (pcb == NULL) {\n    /* If it did not go to an active connection, we check the connections\n       in the TIME-WAIT state. */\n    for (pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {\n      LWIP_ASSERT(\"tcp_input: TIME-WAIT pcb->state == TIME-WAIT\", pcb->state == TIME_WAIT);\n      if (pcb->remote_port == tcphdr->src &&\n          pcb->local_port == tcphdr->dest &&\n          ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()) &&\n          ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {\n        /* We don't really care enough to move this PCB to the front\n           of the list since we are not very likely to receive that\n           many segments for connections in TIME-WAIT. */\n        LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_input: packed for TIME_WAITing connection.\\n\"));\n        tcp_timewait_input(pcb);\n        pbuf_free(p);\n        return;\n      }\n    }\n\n    /* Finally, if we still did not get a match, we check all PCBs that\n       are LISTENing for incoming connections. */\n    prev = NULL;\n    for (lpcb = tcp_listen_pcbs.listen_pcbs; lpcb != NULL; lpcb = lpcb->next) {\n      if (lpcb->local_port == tcphdr->dest) {\n        if (IP_IS_ANY_TYPE_VAL(lpcb->local_ip)) {\n          /* found an ANY TYPE (IPv4/IPv6) match */\n#if SO_REUSE\n          lpcb_any = lpcb;\n          lpcb_prev = prev;\n#else /* SO_REUSE */\n          break;\n#endif /* SO_REUSE */\n        } else if (IP_ADDR_PCB_VERSION_MATCH_EXACT(lpcb, ip_current_dest_addr())) {\n          if (ip_addr_cmp(&lpcb->local_ip, ip_current_dest_addr())) {\n            /* found an exact match */\n            break;\n          } else if (ip_addr_isany(&lpcb->local_ip)) {\n            /* found an ANY-match */\n#if SO_REUSE\n            lpcb_any = lpcb;\n            lpcb_prev = prev;\n#else /* SO_REUSE */\n            break;\n #endif /* SO_REUSE */\n          }\n        }\n      }\n      prev = (struct tcp_pcb *)lpcb;\n    }\n#if SO_REUSE\n    /* first try specific local IP */\n    if (lpcb == NULL) {\n      /* only pass to ANY if no specific local IP has been found */\n      lpcb = lpcb_any;\n      prev = lpcb_prev;\n    }\n#endif /* SO_REUSE */\n    if (lpcb != NULL) {\n      /* Move this PCB to the front of the list so that subsequent\n         lookups will be faster (we exploit locality in TCP segment\n         arrivals). */\n      if (prev != NULL) {\n        ((struct tcp_pcb_listen *)prev)->next = lpcb->next;\n              /* our successor is the remainder of the listening list */\n        lpcb->next = tcp_listen_pcbs.listen_pcbs;\n              /* put this listening pcb at the head of the listening list */\n        tcp_listen_pcbs.listen_pcbs = lpcb;\n      } else {\n        TCP_STATS_INC(tcp.cachehit);\n      }\n\n      LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_input: packed for LISTENing connection.\\n\"));\n      tcp_listen_input(lpcb);\n      pbuf_free(p);\n      return;\n    }\n  }\n\n#if TCP_INPUT_DEBUG\n  LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"+-+-+-+-+-+-+-+-+-+-+-+-+-+- tcp_input: flags \"));\n  tcp_debug_print_flags(TCPH_FLAGS(tcphdr));\n  LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"-+-+-+-+-+-+-+-+-+-+-+-+-+-+\\n\"));\n#endif /* TCP_INPUT_DEBUG */\n\n\n  if (pcb != NULL) {\n    /* The incoming segment belongs to a connection. */\n#if TCP_INPUT_DEBUG\n    tcp_debug_print_state(pcb->state);\n#endif /* TCP_INPUT_DEBUG */\n\n    /* Set up a tcp_seg structure. */\n    inseg.next = NULL;\n    inseg.len = p->tot_len;\n    inseg.p = p;\n    inseg.tcphdr = tcphdr;\n\n    recv_data = NULL;\n    recv_flags = 0;\n    recv_acked = 0;\n\n    if (flags & TCP_PSH) {\n      p->flags |= PBUF_FLAG_PUSH;\n    }\n\n    /* If there is data which was previously \"refused\" by upper layer */\n    if (pcb->refused_data != NULL) {\n      if ((tcp_process_refused_data(pcb) == ERR_ABRT) ||\n        ((pcb->refused_data != NULL) && (tcplen > 0))) {\n        /* pcb has been aborted or refused data is still refused and the new\n           segment contains data */\n        if (pcb->rcv_ann_wnd == 0) {\n          /* this is a zero-window probe, we respond to it with current RCV.NXT\n          and drop the data segment */\n          tcp_send_empty_ack(pcb);\n        }\n        TCP_STATS_INC(tcp.drop);\n        MIB2_STATS_INC(mib2.tcpinerrs);\n        goto aborted;\n      }\n    }\n    tcp_input_pcb = pcb;\n    err = tcp_process(pcb);\n    /* A return value of ERR_ABRT means that tcp_abort() was called\n       and that the pcb has been freed. If so, we don't do anything. */\n    if (err != ERR_ABRT) {\n      if (recv_flags & TF_RESET) {\n        /* TF_RESET means that the connection was reset by the other\n           end. We then call the error callback to inform the\n           application that the connection is dead before we\n           deallocate the PCB. */\n        TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_RST);\n        tcp_pcb_remove(&tcp_active_pcbs, pcb);\n        memp_free(MEMP_TCP_PCB, pcb);\n      } else {\n        err = ERR_OK;\n        /* If the application has registered a \"sent\" function to be\n           called when new send buffer space is available, we call it\n           now. */\n        if (recv_acked > 0) {\n          u16_t acked16;\n#if LWIP_WND_SCALE\n          /* recv_acked is u32_t but the sent callback only takes a u16_t,\n             so we might have to call it multiple times. */\n          u32_t acked = recv_acked;\n          while (acked > 0) {\n            acked16 = (u16_t)LWIP_MIN(acked, 0xffffu);\n            acked -= acked16;\n#else\n          {\n            acked16 = recv_acked;\n#endif\n            TCP_EVENT_SENT(pcb, (u16_t)acked16, err);\n            if (err == ERR_ABRT) {\n              goto aborted;\n            }\n          }\n          recv_acked = 0;\n        }\n        if (tcp_input_delayed_close(pcb)) {\n          goto aborted;\n        }\n#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\n        while (recv_data != NULL) {\n          struct pbuf *rest = NULL;\n          pbuf_split_64k(recv_data, &rest);\n#else /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n        if (recv_data != NULL) {\n#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n\n          LWIP_ASSERT(\"pcb->refused_data == NULL\", pcb->refused_data == NULL);\n          if (pcb->flags & TF_RXCLOSED) {\n            /* received data although already closed -> abort (send RST) to\n               notify the remote host that not all data has been processed */\n            pbuf_free(recv_data);\n#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\n            if (rest != NULL) {\n              pbuf_free(rest);\n            }\n#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n            tcp_abort(pcb);\n            goto aborted;\n          }\n\n          /* Notify application that data has been received. */\n          TCP_EVENT_RECV(pcb, recv_data, ERR_OK, err);\n          if (err == ERR_ABRT) {\n#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\n            if (rest != NULL) {\n              pbuf_free(rest);\n            }\n#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n            goto aborted;\n          }\n\n          /* If the upper layer can't receive this data, store it */\n          if (err != ERR_OK) {\n#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\n            if (rest != NULL) {\n              pbuf_cat(recv_data, rest);\n            }\n#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n            pcb->refused_data = recv_data;\n            LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_input: keep incoming packet, because pcb is \\\"full\\\"\\n\"));\n#if TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\n            break;\n          } else {\n            /* Upper layer received the data, go on with the rest if > 64K */\n            recv_data = rest;\n#endif /* TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n          }\n        }\n\n        /* If a FIN segment was received, we call the callback\n           function with a NULL buffer to indicate EOF. */\n        if (recv_flags & TF_GOT_FIN) {\n          if (pcb->refused_data != NULL) {\n            /* Delay this if we have refused data. */\n            pcb->refused_data->flags |= PBUF_FLAG_TCP_FIN;\n          } else {\n            /* correct rcv_wnd as the application won't call tcp_recved()\n               for the FIN's seqno */\n            if (pcb->rcv_wnd != TCP_WND_MAX(pcb)) {\n              pcb->rcv_wnd++;\n            }\n            TCP_EVENT_CLOSED(pcb, err);\n            if (err == ERR_ABRT) {\n              goto aborted;\n            }\n          }\n        }\n\n        tcp_input_pcb = NULL;\n        if (tcp_input_delayed_close(pcb)) {\n          goto aborted;\n        }\n        /* Try to send something out. */\n        tcp_output(pcb);\n#if TCP_INPUT_DEBUG\n#if TCP_DEBUG\n        tcp_debug_print_state(pcb->state);\n#endif /* TCP_DEBUG */\n#endif /* TCP_INPUT_DEBUG */\n      }\n    }\n    /* Jump target if pcb has been aborted in a callback (by calling tcp_abort()).\n       Below this line, 'pcb' may not be dereferenced! */\naborted:\n    tcp_input_pcb = NULL;\n    recv_data = NULL;\n\n    /* give up our reference to inseg.p */\n    if (inseg.p != NULL)\n    {\n      pbuf_free(inseg.p);\n      inseg.p = NULL;\n    }\n  } else {\n\n    /* If no matching PCB was found, send a TCP RST (reset) to the\n       sender. */\n    LWIP_DEBUGF(TCP_RST_DEBUG, (\"tcp_input: no PCB match found, resetting.\\n\"));\n    if (!(TCPH_FLAGS(tcphdr) & TCP_RST)) {\n      TCP_STATS_INC(tcp.proterr);\n      TCP_STATS_INC(tcp.drop);\n      tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),\n        ip_current_src_addr(), tcphdr->dest, tcphdr->src);\n    }\n    pbuf_free(p);\n  }\n\n  LWIP_ASSERT(\"tcp_input: tcp_pcbs_sane()\", tcp_pcbs_sane());\n  PERF_STOP(\"tcp_input\");\n  return;\ndropped:\n  TCP_STATS_INC(tcp.drop);\n  MIB2_STATS_INC(mib2.tcpinerrs);\n  pbuf_free(p);\n}\n\n/** Called from tcp_input to check for TF_CLOSED flag. This results in closing\n * and deallocating a pcb at the correct place to ensure noone references it\n * any more.\n * @returns 1 if the pcb has been closed and deallocated, 0 otherwise\n */\nstatic int\ntcp_input_delayed_close(struct tcp_pcb *pcb)\n{\n  if (recv_flags & TF_CLOSED) {\n    /* The connection has been closed and we will deallocate the\n        PCB. */\n    if (!(pcb->flags & TF_RXCLOSED)) {\n      /* Connection closed although the application has only shut down the\n          tx side: call the PCB's err callback and indicate the closure to\n          ensure the application doesn't continue using the PCB. */\n      TCP_EVENT_ERR(pcb->state, pcb->errf, pcb->callback_arg, ERR_CLSD);\n    }\n    tcp_pcb_remove(&tcp_active_pcbs, pcb);\n    memp_free(MEMP_TCP_PCB, pcb);\n    return 1;\n  }\n  return 0;\n}\n\n/**\n * Called by tcp_input() when a segment arrives for a listening\n * connection (from tcp_input()).\n *\n * @param pcb the tcp_pcb_listen for which a segment arrived\n *\n * @note the segment which arrived is saved in global variables, therefore only the pcb\n *       involved is passed as a parameter to this function\n */\nstatic void\ntcp_listen_input(struct tcp_pcb_listen *pcb)\n{\n  struct tcp_pcb *npcb;\n  u32_t iss;\n  err_t rc;\n\n  if (flags & TCP_RST) {\n    /* An incoming RST should be ignored. Return. */\n    return;\n  }\n\n  /* In the LISTEN state, we check for incoming SYN segments,\n     creates a new PCB, and responds with a SYN|ACK. */\n  if (flags & TCP_ACK) {\n    /* For incoming segments with the ACK flag set, respond with a\n       RST. */\n    LWIP_DEBUGF(TCP_RST_DEBUG, (\"tcp_listen_input: ACK in LISTEN, sending reset\\n\"));\n    tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),\n      ip_current_src_addr(), tcphdr->dest, tcphdr->src);\n  } else if (flags & TCP_SYN) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"TCP connection request %\"U16_F\" -> %\"U16_F\".\\n\", tcphdr->src, tcphdr->dest));\n#if TCP_LISTEN_BACKLOG\n    if (pcb->accepts_pending >= pcb->backlog) {\n      LWIP_DEBUGF(TCP_DEBUG, (\"tcp_listen_input: listen backlog exceeded for port %\"U16_F\"\\n\", tcphdr->dest));\n      return;\n    }\n#endif /* TCP_LISTEN_BACKLOG */\n    npcb = tcp_alloc(pcb->prio);\n    /* If a new PCB could not be created (probably due to lack of memory),\n       we don't do anything, but rely on the sender will retransmit the\n       SYN at a time when we have more memory available. */\n    if (npcb == NULL) {\n      err_t err;\n      LWIP_DEBUGF(TCP_DEBUG, (\"tcp_listen_input: could not allocate PCB\\n\"));\n      TCP_STATS_INC(tcp.memerr);\n      TCP_EVENT_ACCEPT(pcb, NULL, pcb->callback_arg, ERR_MEM, err);\n      LWIP_UNUSED_ARG(err); /* err not useful here */\n      return;\n    }\n#if TCP_LISTEN_BACKLOG\n    pcb->accepts_pending++;\n    npcb->flags |= TF_BACKLOGPEND;\n#endif /* TCP_LISTEN_BACKLOG */\n    /* Set up the new PCB. */\n    ip_addr_copy(npcb->local_ip, *ip_current_dest_addr());\n    ip_addr_copy(npcb->remote_ip, *ip_current_src_addr());\n    npcb->local_port = pcb->local_port;\n    npcb->remote_port = tcphdr->src;\n    npcb->state = SYN_RCVD;\n    npcb->rcv_nxt = seqno + 1;\n    npcb->rcv_ann_right_edge = npcb->rcv_nxt;\n    iss = tcp_next_iss(npcb);\n    npcb->snd_wl2 = iss;\n    npcb->snd_nxt = iss;\n    npcb->lastack = iss;\n    npcb->snd_lbb = iss;\n    npcb->snd_wl1 = seqno - 1;/* initialise to seqno-1 to force window update */\n    npcb->callback_arg = pcb->callback_arg;\n#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG\n    npcb->listener = pcb;\n#endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */\n    /* inherit socket options */\n    npcb->so_options = pcb->so_options & SOF_INHERITED;\n    /* Register the new PCB so that we can begin receiving segments\n       for it. */\n    TCP_REG_ACTIVE(npcb);\n\n    /* Parse any options in the SYN. */\n    tcp_parseopt(npcb);\n    npcb->snd_wnd = tcphdr->wnd;\n    npcb->snd_wnd_max = npcb->snd_wnd;\n\n#if TCP_CALCULATE_EFF_SEND_MSS\n    npcb->mss = tcp_eff_send_mss(npcb->mss, &npcb->local_ip, &npcb->remote_ip);\n#endif /* TCP_CALCULATE_EFF_SEND_MSS */\n\n    MIB2_STATS_INC(mib2.tcppassiveopens);\n\n    /* Send a SYN|ACK together with the MSS option. */\n    rc = tcp_enqueue_flags(npcb, TCP_SYN | TCP_ACK);\n    if (rc != ERR_OK) {\n      tcp_abandon(npcb, 0);\n      return;\n    }\n    tcp_output(npcb);\n  }\n  return;\n}\n\n/**\n * Called by tcp_input() when a segment arrives for a connection in\n * TIME_WAIT.\n *\n * @param pcb the tcp_pcb for which a segment arrived\n *\n * @note the segment which arrived is saved in global variables, therefore only the pcb\n *       involved is passed as a parameter to this function\n */\nstatic void\ntcp_timewait_input(struct tcp_pcb *pcb)\n{\n  /* RFC 1337: in TIME_WAIT, ignore RST and ACK FINs + any 'acceptable' segments */\n  /* RFC 793 3.9 Event Processing - Segment Arrives:\n   * - first check sequence number - we skip that one in TIME_WAIT (always\n   *   acceptable since we only send ACKs)\n   * - second check the RST bit (... return) */\n  if (flags & TCP_RST) {\n    return;\n  }\n  /* - fourth, check the SYN bit, */\n  if (flags & TCP_SYN) {\n    /* If an incoming segment is not acceptable, an acknowledgment\n       should be sent in reply */\n    if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd)) {\n      /* If the SYN is in the window it is an error, send a reset */\n      tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),\n        ip_current_src_addr(), tcphdr->dest, tcphdr->src);\n      return;\n    }\n  } else if (flags & TCP_FIN) {\n    /* - eighth, check the FIN bit: Remain in the TIME-WAIT state.\n         Restart the 2 MSL time-wait timeout.*/\n    pcb->tmr = tcp_ticks;\n  }\n\n  if ((tcplen > 0)) {\n    /* Acknowledge data, FIN or out-of-window SYN */\n    pcb->flags |= TF_ACK_NOW;\n    tcp_output(pcb);\n  }\n  return;\n}\n\n/**\n * Implements the TCP state machine. Called by tcp_input. In some\n * states tcp_receive() is called to receive data. The tcp_seg\n * argument will be freed by the caller (tcp_input()) unless the\n * recv_data pointer in the pcb is set.\n *\n * @param pcb the tcp_pcb for which a segment arrived\n *\n * @note the segment which arrived is saved in global variables, therefore only the pcb\n *       involved is passed as a parameter to this function\n */\nstatic err_t\ntcp_process(struct tcp_pcb *pcb)\n{\n  struct tcp_seg *rseg;\n  u8_t acceptable = 0;\n  err_t err;\n\n  err = ERR_OK;\n\n  /* Process incoming RST segments. */\n  if (flags & TCP_RST) {\n    /* First, determine if the reset is acceptable. */\n    if (pcb->state == SYN_SENT) {\n      /* \"In the SYN-SENT state (a RST received in response to an initial SYN),\n          the RST is acceptable if the ACK field acknowledges the SYN.\" */\n      if (ackno == pcb->snd_nxt) {\n        acceptable = 1;\n      }\n    } else {\n      /* \"In all states except SYN-SENT, all reset (RST) segments are validated\n          by checking their SEQ-fields.\" */\n      if (seqno == pcb->rcv_nxt) {\n        acceptable = 1;\n      } else  if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,\n                                  pcb->rcv_nxt + pcb->rcv_wnd)) {\n        /* If the sequence number is inside the window, we only send an ACK\n           and wait for a re-send with matching sequence number.\n           This violates RFC 793, but is required to protection against\n           CVE-2004-0230 (RST spoofing attack). */\n        tcp_ack_now(pcb);\n      }\n    }\n\n    if (acceptable) {\n      LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_process: Connection RESET\\n\"));\n      LWIP_ASSERT(\"tcp_input: pcb->state != CLOSED\", pcb->state != CLOSED);\n      recv_flags |= TF_RESET;\n      pcb->flags &= ~TF_ACK_DELAY;\n      return ERR_RST;\n    } else {\n      LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_process: unacceptable reset seqno %\"U32_F\" rcv_nxt %\"U32_F\"\\n\",\n       seqno, pcb->rcv_nxt));\n      LWIP_DEBUGF(TCP_DEBUG, (\"tcp_process: unacceptable reset seqno %\"U32_F\" rcv_nxt %\"U32_F\"\\n\",\n       seqno, pcb->rcv_nxt));\n      return ERR_OK;\n    }\n  }\n\n  if ((flags & TCP_SYN) && (pcb->state != SYN_SENT && pcb->state != SYN_RCVD)) {\n    /* Cope with new connection attempt after remote end crashed */\n    tcp_ack_now(pcb);\n    return ERR_OK;\n  }\n\n  if ((pcb->flags & TF_RXCLOSED) == 0) {\n    /* Update the PCB (in)activity timer unless rx is closed (see tcp_shutdown) */\n    pcb->tmr = tcp_ticks;\n  }\n  pcb->keep_cnt_sent = 0;\n\n  tcp_parseopt(pcb);\n\n  /* Do different things depending on the TCP state. */\n  switch (pcb->state) {\n  case SYN_SENT:\n    LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"SYN-SENT: ackno %\"U32_F\" pcb->snd_nxt %\"U32_F\" unacked %\"U32_F\"\\n\", ackno,\n     pcb->snd_nxt, lwip_ntohl(pcb->unacked->tcphdr->seqno)));\n    /* received SYN ACK with expected sequence number? */\n    if ((flags & TCP_ACK) && (flags & TCP_SYN)\n        && (ackno == pcb->lastack + 1)) {\n      pcb->rcv_nxt = seqno + 1;\n      pcb->rcv_ann_right_edge = pcb->rcv_nxt;\n      pcb->lastack = ackno;\n      pcb->snd_wnd = tcphdr->wnd;\n      pcb->snd_wnd_max = pcb->snd_wnd;\n      pcb->snd_wl1 = seqno - 1; /* initialise to seqno - 1 to force window update */\n      pcb->state = ESTABLISHED;\n\n#if TCP_CALCULATE_EFF_SEND_MSS\n      pcb->mss = tcp_eff_send_mss(pcb->mss, &pcb->local_ip, &pcb->remote_ip);\n#endif /* TCP_CALCULATE_EFF_SEND_MSS */\n\n      pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);\n      LWIP_DEBUGF(TCP_CWND_DEBUG, (\"tcp_process (SENT): cwnd %\"TCPWNDSIZE_F\n                                   \" ssthresh %\"TCPWNDSIZE_F\"\\n\",\n                                   pcb->cwnd, pcb->ssthresh));\n      LWIP_ASSERT(\"pcb->snd_queuelen > 0\", (pcb->snd_queuelen > 0));\n      --pcb->snd_queuelen;\n      LWIP_DEBUGF(TCP_QLEN_DEBUG, (\"tcp_process: SYN-SENT --queuelen %\"TCPWNDSIZE_F\"\\n\", (tcpwnd_size_t)pcb->snd_queuelen));\n      rseg = pcb->unacked;\n      if (rseg == NULL) {\n        /* might happen if tcp_output fails in tcp_rexmit_rto()\n           in which case the segment is on the unsent list */\n        rseg = pcb->unsent;\n        LWIP_ASSERT(\"no segment to free\", rseg != NULL);\n        pcb->unsent = rseg->next;\n      } else {\n        pcb->unacked = rseg->next;\n      }\n      tcp_seg_free(rseg);\n\n      /* If there's nothing left to acknowledge, stop the retransmit\n         timer, otherwise reset it to start again */\n      if (pcb->unacked == NULL) {\n        pcb->rtime = -1;\n      } else {\n        pcb->rtime = 0;\n        pcb->nrtx = 0;\n      }\n\n      /* Call the user specified function to call when successfully\n       * connected. */\n      TCP_EVENT_CONNECTED(pcb, ERR_OK, err);\n      if (err == ERR_ABRT) {\n        return ERR_ABRT;\n      }\n      tcp_ack_now(pcb);\n    }\n    /* received ACK? possibly a half-open connection */\n    else if (flags & TCP_ACK) {\n      /* send a RST to bring the other side in a non-synchronized state. */\n      tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),\n        ip_current_src_addr(), tcphdr->dest, tcphdr->src);\n      /* Resend SYN immediately (don't wait for rto timeout) to establish\n        connection faster, but do not send more SYNs than we otherwise would\n        have, or we might get caught in a loop on loopback interfaces. */\n      if (pcb->nrtx < TCP_SYNMAXRTX) {\n        pcb->rtime = 0;\n        tcp_rexmit_rto(pcb);\n      }\n    }\n    break;\n  case SYN_RCVD:\n    if (flags & TCP_ACK) {\n      /* expected ACK number? */\n      if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {\n        pcb->state = ESTABLISHED;\n        LWIP_DEBUGF(TCP_DEBUG, (\"TCP connection established %\"U16_F\" -> %\"U16_F\".\\n\", inseg.tcphdr->src, inseg.tcphdr->dest));\n#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG\n#if LWIP_CALLBACK_API\n        LWIP_ASSERT(\"pcb->listener->accept != NULL\",\n          (pcb->listener == NULL) || (pcb->listener->accept != NULL));\n#endif\n        if (pcb->listener == NULL) {\n          /* listen pcb might be closed by now */\n          err = ERR_VAL;\n        } else\n#endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */\n        {\n          tcp_backlog_accepted(pcb);\n          /* Call the accept function. */\n          TCP_EVENT_ACCEPT(pcb->listener, pcb, pcb->callback_arg, ERR_OK, err);\n        }\n        if (err != ERR_OK) {\n          /* If the accept function returns with an error, we abort\n           * the connection. */\n          /* Already aborted? */\n          if (err != ERR_ABRT) {\n            tcp_abort(pcb);\n          }\n          return ERR_ABRT;\n        }\n        /* If there was any data contained within this ACK,\n         * we'd better pass it on to the application as well. */\n        tcp_receive(pcb);\n\n        /* Prevent ACK for SYN to generate a sent event */\n        if (recv_acked != 0) {\n          recv_acked--;\n        }\n\n        pcb->cwnd = LWIP_TCP_CALC_INITIAL_CWND(pcb->mss);\n        LWIP_DEBUGF(TCP_CWND_DEBUG, (\"tcp_process (SYN_RCVD): cwnd %\"TCPWNDSIZE_F\n                                     \" ssthresh %\"TCPWNDSIZE_F\"\\n\",\n                                     pcb->cwnd, pcb->ssthresh));\n\n        if (recv_flags & TF_GOT_FIN) {\n          tcp_ack_now(pcb);\n          pcb->state = CLOSE_WAIT;\n        }\n      } else {\n        /* incorrect ACK number, send RST */\n        tcp_rst(ackno, seqno + tcplen, ip_current_dest_addr(),\n          ip_current_src_addr(), tcphdr->dest, tcphdr->src);\n      }\n    } else if ((flags & TCP_SYN) && (seqno == pcb->rcv_nxt - 1)) {\n      /* Looks like another copy of the SYN - retransmit our SYN-ACK */\n      tcp_rexmit(pcb);\n    }\n    break;\n  case CLOSE_WAIT:\n    /* FALLTHROUGH */\n  case ESTABLISHED:\n    tcp_receive(pcb);\n    if (recv_flags & TF_GOT_FIN) { /* passive close */\n      tcp_ack_now(pcb);\n      pcb->state = CLOSE_WAIT;\n    }\n    break;\n  case FIN_WAIT_1:\n    tcp_receive(pcb);\n    if (recv_flags & TF_GOT_FIN) {\n      if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&\n          pcb->unsent == NULL) {\n        LWIP_DEBUGF(TCP_DEBUG,\n          (\"TCP connection closed: FIN_WAIT_1 %\"U16_F\" -> %\"U16_F\".\\n\", inseg.tcphdr->src, inseg.tcphdr->dest));\n        tcp_ack_now(pcb);\n        tcp_pcb_purge(pcb);\n        TCP_RMV_ACTIVE(pcb);\n        pcb->state = TIME_WAIT;\n        TCP_REG(&tcp_tw_pcbs, pcb);\n      } else {\n        tcp_ack_now(pcb);\n        pcb->state = CLOSING;\n      }\n    } else if ((flags & TCP_ACK) && (ackno == pcb->snd_nxt) &&\n               pcb->unsent == NULL) {\n      pcb->state = FIN_WAIT_2;\n    }\n    break;\n  case FIN_WAIT_2:\n    tcp_receive(pcb);\n    if (recv_flags & TF_GOT_FIN) {\n      LWIP_DEBUGF(TCP_DEBUG, (\"TCP connection closed: FIN_WAIT_2 %\"U16_F\" -> %\"U16_F\".\\n\", inseg.tcphdr->src, inseg.tcphdr->dest));\n      tcp_ack_now(pcb);\n      tcp_pcb_purge(pcb);\n      TCP_RMV_ACTIVE(pcb);\n      pcb->state = TIME_WAIT;\n      TCP_REG(&tcp_tw_pcbs, pcb);\n    }\n    break;\n  case CLOSING:\n    tcp_receive(pcb);\n    if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) {\n      LWIP_DEBUGF(TCP_DEBUG, (\"TCP connection closed: CLOSING %\"U16_F\" -> %\"U16_F\".\\n\", inseg.tcphdr->src, inseg.tcphdr->dest));\n      tcp_pcb_purge(pcb);\n      TCP_RMV_ACTIVE(pcb);\n      pcb->state = TIME_WAIT;\n      TCP_REG(&tcp_tw_pcbs, pcb);\n    }\n    break;\n  case LAST_ACK:\n    tcp_receive(pcb);\n    if ((flags & TCP_ACK) && ackno == pcb->snd_nxt && pcb->unsent == NULL) {\n      LWIP_DEBUGF(TCP_DEBUG, (\"TCP connection closed: LAST_ACK %\"U16_F\" -> %\"U16_F\".\\n\", inseg.tcphdr->src, inseg.tcphdr->dest));\n      /* bugfix #21699: don't set pcb->state to CLOSED here or we risk leaking segments */\n      recv_flags |= TF_CLOSED;\n    }\n    break;\n  default:\n    break;\n  }\n  return ERR_OK;\n}\n\n#if TCP_QUEUE_OOSEQ\n/**\n * Insert segment into the list (segments covered with new one will be deleted)\n *\n * Called from tcp_receive()\n */\nstatic void\ntcp_oos_insert_segment(struct tcp_seg *cseg, struct tcp_seg *next)\n{\n  struct tcp_seg *old_seg;\n\n  if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {\n    /* received segment overlaps all following segments */\n    tcp_segs_free(next);\n    next = NULL;\n  } else {\n    /* delete some following segments\n       oos queue may have segments with FIN flag */\n    while (next &&\n           TCP_SEQ_GEQ((seqno + cseg->len),\n                      (next->tcphdr->seqno + next->len))) {\n      /* cseg with FIN already processed */\n      if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) {\n        TCPH_SET_FLAG(cseg->tcphdr, TCP_FIN);\n      }\n      old_seg = next;\n      next = next->next;\n      tcp_seg_free(old_seg);\n    }\n    if (next &&\n        TCP_SEQ_GT(seqno + cseg->len, next->tcphdr->seqno)) {\n      /* We need to trim the incoming segment. */\n      cseg->len = (u16_t)(next->tcphdr->seqno - seqno);\n      pbuf_realloc(cseg->p, cseg->len);\n    }\n  }\n  cseg->next = next;\n}\n#endif /* TCP_QUEUE_OOSEQ */\n\n/**\n * Called by tcp_process. Checks if the given segment is an ACK for outstanding\n * data, and if so frees the memory of the buffered data. Next, it places the\n * segment on any of the receive queues (pcb->recved or pcb->ooseq). If the segment\n * is buffered, the pbuf is referenced by pbuf_ref so that it will not be freed until\n * it has been removed from the buffer.\n *\n * If the incoming segment constitutes an ACK for a segment that was used for RTT\n * estimation, the RTT is estimated here as well.\n *\n * Called from tcp_process().\n */\nstatic void\ntcp_receive(struct tcp_pcb *pcb)\n{\n  struct tcp_seg *next;\n#if TCP_QUEUE_OOSEQ\n  struct tcp_seg *prev, *cseg;\n#endif /* TCP_QUEUE_OOSEQ */\n  s32_t off;\n  s16_t m;\n  u32_t right_wnd_edge;\n  u16_t new_tot_len;\n  int found_dupack = 0;\n#if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS\n  u32_t ooseq_blen;\n  u16_t ooseq_qlen;\n#endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */\n\n  LWIP_ASSERT(\"tcp_receive: wrong state\", pcb->state >= ESTABLISHED);\n\n  if (flags & TCP_ACK) {\n    right_wnd_edge = pcb->snd_wnd + pcb->snd_wl2;\n\n    /* Update window. */\n    if (TCP_SEQ_LT(pcb->snd_wl1, seqno) ||\n       (pcb->snd_wl1 == seqno && TCP_SEQ_LT(pcb->snd_wl2, ackno)) ||\n       (pcb->snd_wl2 == ackno && (u32_t)SND_WND_SCALE(pcb, tcphdr->wnd) > pcb->snd_wnd)) {\n      pcb->snd_wnd = SND_WND_SCALE(pcb, tcphdr->wnd);\n      /* keep track of the biggest window announced by the remote host to calculate\n         the maximum segment size */\n      if (pcb->snd_wnd_max < pcb->snd_wnd) {\n        pcb->snd_wnd_max = pcb->snd_wnd;\n      }\n      pcb->snd_wl1 = seqno;\n      pcb->snd_wl2 = ackno;\n      if (pcb->snd_wnd == 0) {\n        if (pcb->persist_backoff == 0) {\n          /* start persist timer */\n          pcb->persist_cnt = 0;\n          pcb->persist_backoff = 1;\n        }\n      } else if (pcb->persist_backoff > 0) {\n        /* stop persist timer */\n          pcb->persist_backoff = 0;\n      }\n      LWIP_DEBUGF(TCP_WND_DEBUG, (\"tcp_receive: window update %\"TCPWNDSIZE_F\"\\n\", pcb->snd_wnd));\n#if TCP_WND_DEBUG\n    } else {\n      if (pcb->snd_wnd != (tcpwnd_size_t)SND_WND_SCALE(pcb, tcphdr->wnd)) {\n        LWIP_DEBUGF(TCP_WND_DEBUG,\n                    (\"tcp_receive: no window update lastack %\"U32_F\" ackno %\"\n                     U32_F\" wl1 %\"U32_F\" seqno %\"U32_F\" wl2 %\"U32_F\"\\n\",\n                     pcb->lastack, ackno, pcb->snd_wl1, seqno, pcb->snd_wl2));\n      }\n#endif /* TCP_WND_DEBUG */\n    }\n\n    /* (From Stevens TCP/IP Illustrated Vol II, p970.) Its only a\n     * duplicate ack if:\n     * 1) It doesn't ACK new data\n     * 2) length of received packet is zero (i.e. no payload)\n     * 3) the advertised window hasn't changed\n     * 4) There is outstanding unacknowledged data (retransmission timer running)\n     * 5) The ACK is == biggest ACK sequence number so far seen (snd_una)\n     *\n     * If it passes all five, should process as a dupack:\n     * a) dupacks < 3: do nothing\n     * b) dupacks == 3: fast retransmit\n     * c) dupacks > 3: increase cwnd\n     *\n     * If it only passes 1-3, should reset dupack counter (and add to\n     * stats, which we don't do in lwIP)\n     *\n     * If it only passes 1, should reset dupack counter\n     *\n     */\n\n    /* Clause 1 */\n    if (TCP_SEQ_LEQ(ackno, pcb->lastack)) {\n      /* Clause 2 */\n      if (tcplen == 0) {\n        /* Clause 3 */\n        if (pcb->snd_wl2 + pcb->snd_wnd == right_wnd_edge) {\n          /* Clause 4 */\n          if (pcb->rtime >= 0) {\n            /* Clause 5 */\n            if (pcb->lastack == ackno) {\n              found_dupack = 1;\n              if ((u8_t)(pcb->dupacks + 1) > pcb->dupacks) {\n                ++pcb->dupacks;\n              }\n              if (pcb->dupacks > 3) {\n                /* Inflate the congestion window, but not if it means that\n                   the value overflows. */\n                if ((tcpwnd_size_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {\n                  pcb->cwnd += pcb->mss;\n                }\n              } else if (pcb->dupacks == 3) {\n                /* Do fast retransmit */\n                tcp_rexmit_fast(pcb);\n              }\n            }\n          }\n        }\n      }\n      /* If Clause (1) or more is true, but not a duplicate ack, reset\n       * count of consecutive duplicate acks */\n      if (!found_dupack) {\n        pcb->dupacks = 0;\n      }\n    } else if (TCP_SEQ_BETWEEN(ackno, pcb->lastack+1, pcb->snd_nxt)) {\n      /* We come here when the ACK acknowledges new data. */\n\n      /* Reset the \"IN Fast Retransmit\" flag, since we are no longer\n         in fast retransmit. Also reset the congestion window to the\n         slow start threshold. */\n      if (pcb->flags & TF_INFR) {\n        pcb->flags &= ~TF_INFR;\n        pcb->cwnd = pcb->ssthresh;\n      }\n\n      /* Reset the number of retransmissions. */\n      pcb->nrtx = 0;\n\n      /* Reset the retransmission time-out. */\n      pcb->rto = (pcb->sa >> 3) + pcb->sv;\n\n      /* Reset the fast retransmit variables. */\n      pcb->dupacks = 0;\n      pcb->lastack = ackno;\n\n      /* Update the congestion control variables (cwnd and\n         ssthresh). */\n      if (pcb->state >= ESTABLISHED) {\n        if (pcb->cwnd < pcb->ssthresh) {\n          if ((tcpwnd_size_t)(pcb->cwnd + pcb->mss) > pcb->cwnd) {\n            pcb->cwnd += pcb->mss;\n          }\n          LWIP_DEBUGF(TCP_CWND_DEBUG, (\"tcp_receive: slow start cwnd %\"TCPWNDSIZE_F\"\\n\", pcb->cwnd));\n        } else {\n          tcpwnd_size_t new_cwnd = (pcb->cwnd + pcb->mss * pcb->mss / pcb->cwnd);\n          if (new_cwnd > pcb->cwnd) {\n            pcb->cwnd = new_cwnd;\n          }\n          LWIP_DEBUGF(TCP_CWND_DEBUG, (\"tcp_receive: congestion avoidance cwnd %\"TCPWNDSIZE_F\"\\n\", pcb->cwnd));\n        }\n      }\n      LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_receive: ACK for %\"U32_F\", unacked->seqno %\"U32_F\":%\"U32_F\"\\n\",\n                                    ackno,\n                                    pcb->unacked != NULL?\n                                    lwip_ntohl(pcb->unacked->tcphdr->seqno): 0,\n                                    pcb->unacked != NULL?\n                                    lwip_ntohl(pcb->unacked->tcphdr->seqno) + TCP_TCPLEN(pcb->unacked): 0));\n\n      /* Remove segment from the unacknowledged list if the incoming\n         ACK acknowledges them. */\n      while (pcb->unacked != NULL &&\n             TCP_SEQ_LEQ(lwip_ntohl(pcb->unacked->tcphdr->seqno) +\n                         TCP_TCPLEN(pcb->unacked), ackno)) {\n        LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_receive: removing %\"U32_F\":%\"U32_F\" from pcb->unacked\\n\",\n                                      lwip_ntohl(pcb->unacked->tcphdr->seqno),\n                                      lwip_ntohl(pcb->unacked->tcphdr->seqno) +\n                                      TCP_TCPLEN(pcb->unacked)));\n\n        next = pcb->unacked;\n        pcb->unacked = pcb->unacked->next;\n\n        LWIP_DEBUGF(TCP_QLEN_DEBUG, (\"tcp_receive: queuelen %\"TCPWNDSIZE_F\" ... \", (tcpwnd_size_t)pcb->snd_queuelen));\n        LWIP_ASSERT(\"pcb->snd_queuelen >= pbuf_clen(next->p)\", (pcb->snd_queuelen >= pbuf_clen(next->p)));\n\n        pcb->snd_queuelen -= pbuf_clen(next->p);\n        recv_acked += next->len;\n        tcp_seg_free(next);\n\n        LWIP_DEBUGF(TCP_QLEN_DEBUG, (\"%\"TCPWNDSIZE_F\" (after freeing unacked)\\n\", (tcpwnd_size_t)pcb->snd_queuelen));\n        if (pcb->snd_queuelen != 0) {\n          LWIP_ASSERT(\"tcp_receive: valid queue length\", pcb->unacked != NULL ||\n                      pcb->unsent != NULL);\n        }\n      }\n\n      /* If there's nothing left to acknowledge, stop the retransmit\n         timer, otherwise reset it to start again */\n      if (pcb->unacked == NULL) {\n        pcb->rtime = -1;\n      } else {\n        pcb->rtime = 0;\n      }\n\n      pcb->polltmr = 0;\n\n#if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS\n      if (ip_current_is_v6()) {\n        /* Inform neighbor reachability of forward progress. */\n        nd6_reachability_hint(ip6_current_src_addr());\n      }\n#endif /* LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS*/\n    } else {\n      /* Out of sequence ACK, didn't really ack anything */\n      tcp_send_empty_ack(pcb);\n    }\n\n    /* We go through the ->unsent list to see if any of the segments\n       on the list are acknowledged by the ACK. This may seem\n       strange since an \"unsent\" segment shouldn't be acked. The\n       rationale is that lwIP puts all outstanding segments on the\n       ->unsent list after a retransmission, so these segments may\n       in fact have been sent once. */\n    while (pcb->unsent != NULL &&\n           TCP_SEQ_BETWEEN(ackno, lwip_ntohl(pcb->unsent->tcphdr->seqno) +\n                           TCP_TCPLEN(pcb->unsent), pcb->snd_nxt)) {\n      LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_receive: removing %\"U32_F\":%\"U32_F\" from pcb->unsent\\n\",\n                                    lwip_ntohl(pcb->unsent->tcphdr->seqno), lwip_ntohl(pcb->unsent->tcphdr->seqno) +\n                                    TCP_TCPLEN(pcb->unsent)));\n\n      next = pcb->unsent;\n      pcb->unsent = pcb->unsent->next;\n#if TCP_OVERSIZE\n      if (pcb->unsent == NULL) {\n        pcb->unsent_oversize = 0;\n      }\n#endif /* TCP_OVERSIZE */\n      LWIP_DEBUGF(TCP_QLEN_DEBUG, (\"tcp_receive: queuelen %\"TCPWNDSIZE_F\" ... \", (tcpwnd_size_t)pcb->snd_queuelen));\n      LWIP_ASSERT(\"pcb->snd_queuelen >= pbuf_clen(next->p)\", (pcb->snd_queuelen >= pbuf_clen(next->p)));\n      /* Prevent ACK for FIN to generate a sent event */\n      pcb->snd_queuelen -= pbuf_clen(next->p);\n      recv_acked += next->len;\n      tcp_seg_free(next);\n      LWIP_DEBUGF(TCP_QLEN_DEBUG, (\"%\"TCPWNDSIZE_F\" (after freeing unsent)\\n\", (tcpwnd_size_t)pcb->snd_queuelen));\n      if (pcb->snd_queuelen != 0) {\n        LWIP_ASSERT(\"tcp_receive: valid queue length\",\n          pcb->unacked != NULL || pcb->unsent != NULL);\n      }\n    }\n    pcb->snd_buf += recv_acked;\n    /* End of ACK for new data processing. */\n\n    LWIP_DEBUGF(TCP_RTO_DEBUG, (\"tcp_receive: pcb->rttest %\"U32_F\" rtseq %\"U32_F\" ackno %\"U32_F\"\\n\",\n                                pcb->rttest, pcb->rtseq, ackno));\n\n    /* RTT estimation calculations. This is done by checking if the\n       incoming segment acknowledges the segment we use to take a\n       round-trip time measurement. */\n    if (pcb->rttest && TCP_SEQ_LT(pcb->rtseq, ackno)) {\n      /* diff between this shouldn't exceed 32K since this are tcp timer ticks\n         and a round-trip shouldn't be that long... */\n      m = (s16_t)(tcp_ticks - pcb->rttest);\n\n      LWIP_DEBUGF(TCP_RTO_DEBUG, (\"tcp_receive: experienced rtt %\"U16_F\" ticks (%\"U16_F\" msec).\\n\",\n                                  m, (u16_t)(m * TCP_SLOW_INTERVAL)));\n\n      /* This is taken directly from VJs original code in his paper */\n      m = m - (pcb->sa >> 3);\n      pcb->sa += m;\n      if (m < 0) {\n        m = -m;\n      }\n      m = m - (pcb->sv >> 2);\n      pcb->sv += m;\n      pcb->rto = (pcb->sa >> 3) + pcb->sv;\n\n      LWIP_DEBUGF(TCP_RTO_DEBUG, (\"tcp_receive: RTO %\"U16_F\" (%\"U16_F\" milliseconds)\\n\",\n                                  pcb->rto, (u16_t)(pcb->rto * TCP_SLOW_INTERVAL)));\n\n      pcb->rttest = 0;\n    }\n  }\n\n  /* If the incoming segment contains data, we must process it\n     further unless the pcb already received a FIN.\n     (RFC 793, chapter 3.9, \"SEGMENT ARRIVES\" in states CLOSE-WAIT, CLOSING,\n     LAST-ACK and TIME-WAIT: \"Ignore the segment text.\") */\n  if ((tcplen > 0) && (pcb->state < CLOSE_WAIT)) {\n    /* This code basically does three things:\n\n    +) If the incoming segment contains data that is the next\n    in-sequence data, this data is passed to the application. This\n    might involve trimming the first edge of the data. The rcv_nxt\n    variable and the advertised window are adjusted.\n\n    +) If the incoming segment has data that is above the next\n    sequence number expected (->rcv_nxt), the segment is placed on\n    the ->ooseq queue. This is done by finding the appropriate\n    place in the ->ooseq queue (which is ordered by sequence\n    number) and trim the segment in both ends if needed. An\n    immediate ACK is sent to indicate that we received an\n    out-of-sequence segment.\n\n    +) Finally, we check if the first segment on the ->ooseq queue\n    now is in sequence (i.e., if rcv_nxt >= ooseq->seqno). If\n    rcv_nxt > ooseq->seqno, we must trim the first edge of the\n    segment on ->ooseq before we adjust rcv_nxt. The data in the\n    segments that are now on sequence are chained onto the\n    incoming segment so that we only need to call the application\n    once.\n    */\n\n    /* First, we check if we must trim the first edge. We have to do\n       this if the sequence number of the incoming segment is less\n       than rcv_nxt, and the sequence number plus the length of the\n       segment is larger than rcv_nxt. */\n    /*    if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) {\n          if (TCP_SEQ_LT(pcb->rcv_nxt, seqno + tcplen)) {*/\n    if (TCP_SEQ_BETWEEN(pcb->rcv_nxt, seqno + 1, seqno + tcplen - 1)) {\n      /* Trimming the first edge is done by pushing the payload\n         pointer in the pbuf downwards. This is somewhat tricky since\n         we do not want to discard the full contents of the pbuf up to\n         the new starting point of the data since we have to keep the\n         TCP header which is present in the first pbuf in the chain.\n\n         What is done is really quite a nasty hack: the first pbuf in\n         the pbuf chain is pointed to by inseg.p. Since we need to be\n         able to deallocate the whole pbuf, we cannot change this\n         inseg.p pointer to point to any of the later pbufs in the\n         chain. Instead, we point the ->payload pointer in the first\n         pbuf to data in one of the later pbufs. We also set the\n         inseg.data pointer to point to the right place. This way, the\n         ->p pointer will still point to the first pbuf, but the\n         ->p->payload pointer will point to data in another pbuf.\n\n         After we are done with adjusting the pbuf pointers we must\n         adjust the ->data pointer in the seg and the segment\n         length.*/\n\n      struct pbuf *p = inseg.p;\n      off = pcb->rcv_nxt - seqno;\n      LWIP_ASSERT(\"inseg.p != NULL\", inseg.p);\n      LWIP_ASSERT(\"insane offset!\", (off < 0x7fff));\n      if (inseg.p->len < off) {\n        LWIP_ASSERT(\"pbuf too short!\", (((s32_t)inseg.p->tot_len) >= off));\n        new_tot_len = (u16_t)(inseg.p->tot_len - off);\n        while (p->len < off) {\n          off -= p->len;\n          /* KJM following line changed (with addition of new_tot_len var)\n             to fix bug #9076\n             inseg.p->tot_len -= p->len; */\n          p->tot_len = new_tot_len;\n          p->len = 0;\n          p = p->next;\n        }\n        if (pbuf_header(p, (s16_t)-off)) {\n          /* Do we need to cope with this failing?  Assert for now */\n          LWIP_ASSERT(\"pbuf_header failed\", 0);\n        }\n      } else {\n        if (pbuf_header(inseg.p, (s16_t)-off)) {\n          /* Do we need to cope with this failing?  Assert for now */\n          LWIP_ASSERT(\"pbuf_header failed\", 0);\n        }\n      }\n      inseg.len -= (u16_t)(pcb->rcv_nxt - seqno);\n      inseg.tcphdr->seqno = seqno = pcb->rcv_nxt;\n    }\n    else {\n      if (TCP_SEQ_LT(seqno, pcb->rcv_nxt)) {\n        /* the whole segment is < rcv_nxt */\n        /* must be a duplicate of a packet that has already been correctly handled */\n\n        LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_receive: duplicate seqno %\"U32_F\"\\n\", seqno));\n        tcp_ack_now(pcb);\n      }\n    }\n\n    /* The sequence number must be within the window (above rcv_nxt\n       and below rcv_nxt + rcv_wnd) in order to be further\n       processed. */\n    if (TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt,\n                        pcb->rcv_nxt + pcb->rcv_wnd - 1)) {\n      if (pcb->rcv_nxt == seqno) {\n        /* The incoming segment is the next in sequence. We check if\n           we have to trim the end of the segment and update rcv_nxt\n           and pass the data to the application. */\n        tcplen = TCP_TCPLEN(&inseg);\n\n        if (tcplen > pcb->rcv_wnd) {\n          LWIP_DEBUGF(TCP_INPUT_DEBUG,\n                      (\"tcp_receive: other end overran receive window\"\n                       \"seqno %\"U32_F\" len %\"U16_F\" right edge %\"U32_F\"\\n\",\n                       seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));\n          if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {\n            /* Must remove the FIN from the header as we're trimming\n             * that byte of sequence-space from the packet */\n            TCPH_FLAGS_SET(inseg.tcphdr, TCPH_FLAGS(inseg.tcphdr) & ~(unsigned int)TCP_FIN);\n          }\n          /* Adjust length of segment to fit in the window. */\n          TCPWND_CHECK16(pcb->rcv_wnd);\n          inseg.len = (u16_t)pcb->rcv_wnd;\n          if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {\n            inseg.len -= 1;\n          }\n          pbuf_realloc(inseg.p, inseg.len);\n          tcplen = TCP_TCPLEN(&inseg);\n          LWIP_ASSERT(\"tcp_receive: segment not trimmed correctly to rcv_wnd\\n\",\n                      (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd));\n        }\n#if TCP_QUEUE_OOSEQ\n        /* Received in-sequence data, adjust ooseq data if:\n           - FIN has been received or\n           - inseq overlaps with ooseq */\n        if (pcb->ooseq != NULL) {\n          if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {\n            LWIP_DEBUGF(TCP_INPUT_DEBUG,\n                        (\"tcp_receive: received in-order FIN, binning ooseq queue\\n\"));\n            /* Received in-order FIN means anything that was received\n             * out of order must now have been received in-order, so\n             * bin the ooseq queue */\n            while (pcb->ooseq != NULL) {\n              struct tcp_seg *old_ooseq = pcb->ooseq;\n              pcb->ooseq = pcb->ooseq->next;\n              tcp_seg_free(old_ooseq);\n            }\n          } else {\n            next = pcb->ooseq;\n            /* Remove all segments on ooseq that are covered by inseg already.\n             * FIN is copied from ooseq to inseg if present. */\n            while (next &&\n                   TCP_SEQ_GEQ(seqno + tcplen,\n                               next->tcphdr->seqno + next->len)) {\n              /* inseg cannot have FIN here (already processed above) */\n              if ((TCPH_FLAGS(next->tcphdr) & TCP_FIN) != 0 &&\n                  (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) == 0) {\n                TCPH_SET_FLAG(inseg.tcphdr, TCP_FIN);\n                tcplen = TCP_TCPLEN(&inseg);\n              }\n              prev = next;\n              next = next->next;\n              tcp_seg_free(prev);\n            }\n            /* Now trim right side of inseg if it overlaps with the first\n             * segment on ooseq */\n            if (next &&\n                TCP_SEQ_GT(seqno + tcplen,\n                           next->tcphdr->seqno)) {\n              /* inseg cannot have FIN here (already processed above) */\n              inseg.len = (u16_t)(next->tcphdr->seqno - seqno);\n              if (TCPH_FLAGS(inseg.tcphdr) & TCP_SYN) {\n                inseg.len -= 1;\n              }\n              pbuf_realloc(inseg.p, inseg.len);\n              tcplen = TCP_TCPLEN(&inseg);\n              LWIP_ASSERT(\"tcp_receive: segment not trimmed correctly to ooseq queue\\n\",\n                          (seqno + tcplen) == next->tcphdr->seqno);\n            }\n            pcb->ooseq = next;\n          }\n        }\n#endif /* TCP_QUEUE_OOSEQ */\n\n        pcb->rcv_nxt = seqno + tcplen;\n\n        /* Update the receiver's (our) window. */\n        LWIP_ASSERT(\"tcp_receive: tcplen > rcv_wnd\\n\", pcb->rcv_wnd >= tcplen);\n        pcb->rcv_wnd -= tcplen;\n\n        tcp_update_rcv_ann_wnd(pcb);\n\n        /* If there is data in the segment, we make preparations to\n           pass this up to the application. The ->recv_data variable\n           is used for holding the pbuf that goes to the\n           application. The code for reassembling out-of-sequence data\n           chains its data on this pbuf as well.\n\n           If the segment was a FIN, we set the TF_GOT_FIN flag that will\n           be used to indicate to the application that the remote side has\n           closed its end of the connection. */\n        if (inseg.p->tot_len > 0) {\n          recv_data = inseg.p;\n          /* Since this pbuf now is the responsibility of the\n             application, we delete our reference to it so that we won't\n             (mistakingly) deallocate it. */\n          inseg.p = NULL;\n        }\n        if (TCPH_FLAGS(inseg.tcphdr) & TCP_FIN) {\n          LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_receive: received FIN.\\n\"));\n          recv_flags |= TF_GOT_FIN;\n        }\n\n#if TCP_QUEUE_OOSEQ\n        /* We now check if we have segments on the ->ooseq queue that\n           are now in sequence. */\n        while (pcb->ooseq != NULL &&\n               pcb->ooseq->tcphdr->seqno == pcb->rcv_nxt) {\n\n          cseg = pcb->ooseq;\n          seqno = pcb->ooseq->tcphdr->seqno;\n\n          pcb->rcv_nxt += TCP_TCPLEN(cseg);\n          LWIP_ASSERT(\"tcp_receive: ooseq tcplen > rcv_wnd\\n\",\n                      pcb->rcv_wnd >= TCP_TCPLEN(cseg));\n          pcb->rcv_wnd -= TCP_TCPLEN(cseg);\n\n          tcp_update_rcv_ann_wnd(pcb);\n\n          if (cseg->p->tot_len > 0) {\n            /* Chain this pbuf onto the pbuf that we will pass to\n               the application. */\n            /* With window scaling, this can overflow recv_data->tot_len, but\n               that's not a problem since we explicitly fix that before passing\n               recv_data to the application. */\n            if (recv_data) {\n              pbuf_cat(recv_data, cseg->p);\n            } else {\n              recv_data = cseg->p;\n            }\n            cseg->p = NULL;\n          }\n          if (TCPH_FLAGS(cseg->tcphdr) & TCP_FIN) {\n            LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_receive: dequeued FIN.\\n\"));\n            recv_flags |= TF_GOT_FIN;\n            if (pcb->state == ESTABLISHED) { /* force passive close or we can move to active close */\n              pcb->state = CLOSE_WAIT;\n            }\n          }\n\n          pcb->ooseq = cseg->next;\n          tcp_seg_free(cseg);\n        }\n#endif /* TCP_QUEUE_OOSEQ */\n\n\n        /* Acknowledge the segment(s). */\n        tcp_ack(pcb);\n\n#if LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS\n        if (ip_current_is_v6()) {\n          /* Inform neighbor reachability of forward progress. */\n          nd6_reachability_hint(ip6_current_src_addr());\n        }\n#endif /* LWIP_IPV6 && LWIP_ND6_TCP_REACHABILITY_HINTS*/\n\n      } else {\n        /* We get here if the incoming segment is out-of-sequence. */\n        tcp_send_empty_ack(pcb);\n#if TCP_QUEUE_OOSEQ\n        /* We queue the segment on the ->ooseq queue. */\n        if (pcb->ooseq == NULL) {\n          pcb->ooseq = tcp_seg_copy(&inseg);\n        } else {\n          /* If the queue is not empty, we walk through the queue and\n             try to find a place where the sequence number of the\n             incoming segment is between the sequence numbers of the\n             previous and the next segment on the ->ooseq queue. That is\n             the place where we put the incoming segment. If needed, we\n             trim the second edges of the previous and the incoming\n             segment so that it will fit into the sequence.\n\n             If the incoming segment has the same sequence number as a\n             segment on the ->ooseq queue, we discard the segment that\n             contains less data. */\n\n          prev = NULL;\n          for (next = pcb->ooseq; next != NULL; next = next->next) {\n            if (seqno == next->tcphdr->seqno) {\n              /* The sequence number of the incoming segment is the\n                 same as the sequence number of the segment on\n                 ->ooseq. We check the lengths to see which one to\n                 discard. */\n              if (inseg.len > next->len) {\n                /* The incoming segment is larger than the old\n                   segment. We replace some segments with the new\n                   one. */\n                cseg = tcp_seg_copy(&inseg);\n                if (cseg != NULL) {\n                  if (prev != NULL) {\n                    prev->next = cseg;\n                  } else {\n                    pcb->ooseq = cseg;\n                  }\n                  tcp_oos_insert_segment(cseg, next);\n                }\n                break;\n              } else {\n                /* Either the lengths are the same or the incoming\n                   segment was smaller than the old one; in either\n                   case, we ditch the incoming segment. */\n                break;\n              }\n            } else {\n              if (prev == NULL) {\n                if (TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {\n                  /* The sequence number of the incoming segment is lower\n                     than the sequence number of the first segment on the\n                     queue. We put the incoming segment first on the\n                     queue. */\n                  cseg = tcp_seg_copy(&inseg);\n                  if (cseg != NULL) {\n                    pcb->ooseq = cseg;\n                    tcp_oos_insert_segment(cseg, next);\n                  }\n                  break;\n                }\n              } else {\n                /*if (TCP_SEQ_LT(prev->tcphdr->seqno, seqno) &&\n                  TCP_SEQ_LT(seqno, next->tcphdr->seqno)) {*/\n                if (TCP_SEQ_BETWEEN(seqno, prev->tcphdr->seqno+1, next->tcphdr->seqno-1)) {\n                  /* The sequence number of the incoming segment is in\n                     between the sequence numbers of the previous and\n                     the next segment on ->ooseq. We trim trim the previous\n                     segment, delete next segments that included in received segment\n                     and trim received, if needed. */\n                  cseg = tcp_seg_copy(&inseg);\n                  if (cseg != NULL) {\n                    if (TCP_SEQ_GT(prev->tcphdr->seqno + prev->len, seqno)) {\n                      /* We need to trim the prev segment. */\n                      prev->len = (u16_t)(seqno - prev->tcphdr->seqno);\n                      pbuf_realloc(prev->p, prev->len);\n                    }\n                    prev->next = cseg;\n                    tcp_oos_insert_segment(cseg, next);\n                  }\n                  break;\n                }\n              }\n              /* If the \"next\" segment is the last segment on the\n                 ooseq queue, we add the incoming segment to the end\n                 of the list. */\n              if (next->next == NULL &&\n                  TCP_SEQ_GT(seqno, next->tcphdr->seqno)) {\n                if (TCPH_FLAGS(next->tcphdr) & TCP_FIN) {\n                  /* segment \"next\" already contains all data */\n                  break;\n                }\n                next->next = tcp_seg_copy(&inseg);\n                if (next->next != NULL) {\n                  if (TCP_SEQ_GT(next->tcphdr->seqno + next->len, seqno)) {\n                    /* We need to trim the last segment. */\n                    next->len = (u16_t)(seqno - next->tcphdr->seqno);\n                    pbuf_realloc(next->p, next->len);\n                  }\n                  /* check if the remote side overruns our receive window */\n                  if (TCP_SEQ_GT((u32_t)tcplen + seqno, pcb->rcv_nxt + (u32_t)pcb->rcv_wnd)) {\n                    LWIP_DEBUGF(TCP_INPUT_DEBUG,\n                                (\"tcp_receive: other end overran receive window\"\n                                 \"seqno %\"U32_F\" len %\"U16_F\" right edge %\"U32_F\"\\n\",\n                                 seqno, tcplen, pcb->rcv_nxt + pcb->rcv_wnd));\n                    if (TCPH_FLAGS(next->next->tcphdr) & TCP_FIN) {\n                      /* Must remove the FIN from the header as we're trimming\n                       * that byte of sequence-space from the packet */\n                      TCPH_FLAGS_SET(next->next->tcphdr, TCPH_FLAGS(next->next->tcphdr) & ~TCP_FIN);\n                    }\n                    /* Adjust length of segment to fit in the window. */\n                    next->next->len = (u16_t)(pcb->rcv_nxt + pcb->rcv_wnd - seqno);\n                    pbuf_realloc(next->next->p, next->next->len);\n                    tcplen = TCP_TCPLEN(next->next);\n                    LWIP_ASSERT(\"tcp_receive: segment not trimmed correctly to rcv_wnd\\n\",\n                                (seqno + tcplen) == (pcb->rcv_nxt + pcb->rcv_wnd));\n                  }\n                }\n                break;\n              }\n            }\n            prev = next;\n          }\n        }\n#if TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS\n        /* Check that the data on ooseq doesn't exceed one of the limits\n           and throw away everything above that limit. */\n        ooseq_blen = 0;\n        ooseq_qlen = 0;\n        prev = NULL;\n        for (next = pcb->ooseq; next != NULL; prev = next, next = next->next) {\n          struct pbuf *p = next->p;\n          ooseq_blen += p->tot_len;\n          ooseq_qlen += pbuf_clen(p);\n          if ((ooseq_blen > TCP_OOSEQ_MAX_BYTES) ||\n              (ooseq_qlen > TCP_OOSEQ_MAX_PBUFS)) {\n             /* too much ooseq data, dump this and everything after it */\n             tcp_segs_free(next);\n             if (prev == NULL) {\n               /* first ooseq segment is too much, dump the whole queue */\n               pcb->ooseq = NULL;\n             } else {\n               /* just dump 'next' and everything after it */\n               prev->next = NULL;\n             }\n             break;\n          }\n        }\n#endif /* TCP_OOSEQ_MAX_BYTES || TCP_OOSEQ_MAX_PBUFS */\n#endif /* TCP_QUEUE_OOSEQ */\n      }\n    } else {\n      /* The incoming segment is not within the window. */\n      tcp_send_empty_ack(pcb);\n    }\n  } else {\n    /* Segments with length 0 is taken care of here. Segments that\n       fall out of the window are ACKed. */\n    if (!TCP_SEQ_BETWEEN(seqno, pcb->rcv_nxt, pcb->rcv_nxt + pcb->rcv_wnd - 1)) {\n      tcp_ack_now(pcb);\n    }\n  }\n}\n\nstatic u8_t\ntcp_getoptbyte(void)\n{\n  if ((tcphdr_opt2 == NULL) || (tcp_optidx < tcphdr_opt1len)) {\n    u8_t* opts = (u8_t *)tcphdr + TCP_HLEN;\n    return opts[tcp_optidx++];\n  } else {\n    u8_t idx = (u8_t)(tcp_optidx++ - tcphdr_opt1len);\n    return tcphdr_opt2[idx];\n  }\n}\n\n/**\n * Parses the options contained in the incoming segment.\n *\n * Called from tcp_listen_input() and tcp_process().\n * Currently, only the MSS option is supported!\n *\n * @param pcb the tcp_pcb for which a segment arrived\n */\nstatic void\ntcp_parseopt(struct tcp_pcb *pcb)\n{\n  u8_t data;\n  u16_t mss;\n#if LWIP_TCP_TIMESTAMPS\n  u32_t tsval;\n#endif\n\n  /* Parse the TCP MSS option, if present. */\n  if (tcphdr_optlen != 0) {\n    for (tcp_optidx = 0; tcp_optidx < tcphdr_optlen; ) {\n      u8_t opt = tcp_getoptbyte();\n      switch (opt) {\n      case LWIP_TCP_OPT_EOL:\n        /* End of options. */\n        LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_parseopt: EOL\\n\"));\n        return;\n      case LWIP_TCP_OPT_NOP:\n        /* NOP option. */\n        LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_parseopt: NOP\\n\"));\n        break;\n      case LWIP_TCP_OPT_MSS:\n        LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_parseopt: MSS\\n\"));\n        if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_MSS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_MSS) > tcphdr_optlen) {\n          /* Bad length */\n          LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_parseopt: bad length\\n\"));\n          return;\n        }\n        /* An MSS option with the right option length. */\n        mss = (tcp_getoptbyte() << 8);\n        mss |= tcp_getoptbyte();\n        /* Limit the mss to the configured TCP_MSS and prevent division by zero */\n        pcb->mss = ((mss > TCP_MSS) || (mss == 0)) ? TCP_MSS : mss;\n        break;\n#if LWIP_WND_SCALE\n      case LWIP_TCP_OPT_WS:\n        LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_parseopt: WND_SCALE\\n\"));\n        if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_WS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_WS) > tcphdr_optlen) {\n          /* Bad length */\n          LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_parseopt: bad length\\n\"));\n          return;\n        }\n        /* An WND_SCALE option with the right option length. */\n        data = tcp_getoptbyte();\n        /* If syn was received with wnd scale option,\n           activate wnd scale opt, but only if this is not a retransmission */\n        if ((flags & TCP_SYN) && !(pcb->flags & TF_WND_SCALE)) {\n          pcb->snd_scale = data;\n          if (pcb->snd_scale > 14U) {\n            pcb->snd_scale = 14U;\n          }\n          pcb->rcv_scale = TCP_RCV_SCALE;\n          pcb->flags |= TF_WND_SCALE;\n          /* window scaling is enabled, we can use the full receive window */\n          LWIP_ASSERT(\"window not at default value\", pcb->rcv_wnd == TCPWND_MIN16(TCP_WND));\n          LWIP_ASSERT(\"window not at default value\", pcb->rcv_ann_wnd == TCPWND_MIN16(TCP_WND));\n          pcb->rcv_wnd = pcb->rcv_ann_wnd = TCP_WND;\n        }\n        break;\n#endif\n#if LWIP_TCP_TIMESTAMPS\n      case LWIP_TCP_OPT_TS:\n        LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_parseopt: TS\\n\"));\n        if (tcp_getoptbyte() != LWIP_TCP_OPT_LEN_TS || (tcp_optidx - 2 + LWIP_TCP_OPT_LEN_TS) > tcphdr_optlen) {\n          /* Bad length */\n          LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_parseopt: bad length\\n\"));\n          return;\n        }\n        /* TCP timestamp option with valid length */\n        tsval = tcp_getoptbyte();\n        tsval |= (tcp_getoptbyte() << 8);\n        tsval |= (tcp_getoptbyte() << 16);\n        tsval |= (tcp_getoptbyte() << 24);\n        if (flags & TCP_SYN) {\n          pcb->ts_recent = lwip_ntohl(tsval);\n          /* Enable sending timestamps in every segment now that we know\n             the remote host supports it. */\n          pcb->flags |= TF_TIMESTAMP;\n        } else if (TCP_SEQ_BETWEEN(pcb->ts_lastacksent, seqno, seqno+tcplen)) {\n          pcb->ts_recent = lwip_ntohl(tsval);\n        }\n        /* Advance to next option (6 bytes already read) */\n        tcp_optidx += LWIP_TCP_OPT_LEN_TS - 6;\n        break;\n#endif\n      default:\n        LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_parseopt: other\\n\"));\n        data = tcp_getoptbyte();\n        if (data < 2) {\n          LWIP_DEBUGF(TCP_INPUT_DEBUG, (\"tcp_parseopt: bad length\\n\"));\n          /* If the length field is zero, the options are malformed\n             and we don't process them further. */\n          return;\n        }\n        /* All other options have a length field, so that we easily\n           can skip past them. */\n        tcp_optidx += data - 2;\n      }\n    }\n  }\n}\n\nvoid\ntcp_trigger_input_pcb_close(void)\n{\n  recv_flags |= TF_CLOSED;\n}\n\n#endif /* LWIP_TCP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/tcp_out.c",
    "content": "/**\n * @file\n * Transmission Control Protocol, outgoing traffic\n *\n * The output functions of TCP.\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/def.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#if LWIP_TCP_TIMESTAMPS\n#include \"lwip/sys.h\"\n#endif\n\n#include <string.h>\n\n/* Define some copy-macros for checksum-on-copy so that the code looks\n   nicer by preventing too many ifdef's. */\n#if TCP_CHECKSUM_ON_COPY\n#define TCP_DATA_COPY(dst, src, len, seg) do { \\\n  tcp_seg_add_chksum(LWIP_CHKSUM_COPY(dst, src, len), \\\n                     len, &seg->chksum, &seg->chksum_swapped); \\\n  seg->flags |= TF_SEG_DATA_CHECKSUMMED; } while(0)\n#define TCP_DATA_COPY2(dst, src, len, chksum, chksum_swapped)  \\\n  tcp_seg_add_chksum(LWIP_CHKSUM_COPY(dst, src, len), len, chksum, chksum_swapped);\n#else /* TCP_CHECKSUM_ON_COPY*/\n#define TCP_DATA_COPY(dst, src, len, seg)                     MEMCPY(dst, src, len)\n#define TCP_DATA_COPY2(dst, src, len, chksum, chksum_swapped) MEMCPY(dst, src, len)\n#endif /* TCP_CHECKSUM_ON_COPY*/\n\n/** Define this to 1 for an extra check that the output checksum is valid\n * (usefule when the checksum is generated by the application, not the stack) */\n#ifndef TCP_CHECKSUM_ON_COPY_SANITY_CHECK\n#define TCP_CHECKSUM_ON_COPY_SANITY_CHECK   0\n#endif\n/* Allow to override the failure of sanity check from warning to e.g. hard failure */\n#if TCP_CHECKSUM_ON_COPY_SANITY_CHECK\n#ifndef TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL\n#define TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL(msg) LWIP_DEBUGF(TCP_DEBUG | LWIP_DBG_LEVEL_WARNING, msg)\n#endif\n#endif\n\n#if TCP_OVERSIZE\n/** The size of segment pbufs created when TCP_OVERSIZE is enabled */\n#ifndef TCP_OVERSIZE_CALC_LENGTH\n#define TCP_OVERSIZE_CALC_LENGTH(length) ((length) + TCP_OVERSIZE)\n#endif\n#endif\n\n/* Forward declarations.*/\nstatic err_t tcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif);\n\n/** Allocate a pbuf and create a tcphdr at p->payload, used for output\n * functions other than the default tcp_output -> tcp_output_segment\n * (e.g. tcp_send_empty_ack, etc.)\n *\n * @param pcb tcp pcb for which to send a packet (used to initialize tcp_hdr)\n * @param optlen length of header-options\n * @param datalen length of tcp data to reserve in pbuf\n * @param seqno_be seqno in network byte order (big-endian)\n * @return pbuf with p->payload being the tcp_hdr\n */\nstatic struct pbuf *\ntcp_output_alloc_header(struct tcp_pcb *pcb, u16_t optlen, u16_t datalen,\n                      u32_t seqno_be /* already in network byte order */)\n{\n  struct tcp_hdr *tcphdr;\n  struct pbuf *p = pbuf_alloc(PBUF_IP, TCP_HLEN + optlen + datalen, PBUF_RAM);\n  if (p != NULL) {\n    LWIP_ASSERT(\"check that first pbuf can hold struct tcp_hdr\",\n                 (p->len >= TCP_HLEN + optlen));\n    tcphdr = (struct tcp_hdr *)p->payload;\n    tcphdr->src = lwip_htons(pcb->local_port);\n    tcphdr->dest = lwip_htons(pcb->remote_port);\n    tcphdr->seqno = seqno_be;\n    tcphdr->ackno = lwip_htonl(pcb->rcv_nxt);\n    TCPH_HDRLEN_FLAGS_SET(tcphdr, (5 + optlen / 4), TCP_ACK);\n    tcphdr->wnd = lwip_htons(TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd)));\n    tcphdr->chksum = 0;\n    tcphdr->urgp = 0;\n\n    /* If we're sending a packet, update the announced right window edge */\n    pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;\n  }\n  return p;\n}\n\n/**\n * Called by tcp_close() to send a segment including FIN flag but not data.\n *\n * @param pcb the tcp_pcb over which to send a segment\n * @return ERR_OK if sent, another err_t otherwise\n */\nerr_t\ntcp_send_fin(struct tcp_pcb *pcb)\n{\n  /* first, try to add the fin to the last unsent segment */\n  if (pcb->unsent != NULL) {\n    struct tcp_seg *last_unsent;\n    for (last_unsent = pcb->unsent; last_unsent->next != NULL;\n         last_unsent = last_unsent->next);\n\n    if ((TCPH_FLAGS(last_unsent->tcphdr) & (TCP_SYN | TCP_FIN | TCP_RST)) == 0) {\n      /* no SYN/FIN/RST flag in the header, we can add the FIN flag */\n      TCPH_SET_FLAG(last_unsent->tcphdr, TCP_FIN);\n      pcb->flags |= TF_FIN;\n      return ERR_OK;\n    }\n  }\n  /* no data, no length, flags, copy=1, no optdata */\n  return tcp_enqueue_flags(pcb, TCP_FIN);\n}\n\n/**\n * Create a TCP segment with prefilled header.\n *\n * Called by tcp_write and tcp_enqueue_flags.\n *\n * @param pcb Protocol control block for the TCP connection.\n * @param p pbuf that is used to hold the TCP header.\n * @param flags TCP flags for header.\n * @param seqno TCP sequence number of this packet\n * @param optflags options to include in TCP header\n * @return a new tcp_seg pointing to p, or NULL.\n * The TCP header is filled in except ackno and wnd.\n * p is freed on failure.\n */\nstatic struct tcp_seg *\ntcp_create_segment(struct tcp_pcb *pcb, struct pbuf *p, u8_t flags, u32_t seqno, u8_t optflags)\n{\n  struct tcp_seg *seg;\n  u8_t optlen = LWIP_TCP_OPT_LENGTH(optflags);\n\n  if ((seg = (struct tcp_seg *)memp_malloc(MEMP_TCP_SEG)) == NULL) {\n    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"tcp_create_segment: no memory.\\n\"));\n    pbuf_free(p);\n    return NULL;\n  }\n  seg->flags = optflags;\n  seg->next = NULL;\n  seg->p = p;\n  LWIP_ASSERT(\"p->tot_len >= optlen\", p->tot_len >= optlen);\n  seg->len = p->tot_len - optlen;\n#if TCP_OVERSIZE_DBGCHECK\n  seg->oversize_left = 0;\n#endif /* TCP_OVERSIZE_DBGCHECK */\n#if TCP_CHECKSUM_ON_COPY\n  seg->chksum = 0;\n  seg->chksum_swapped = 0;\n  /* check optflags */\n  LWIP_ASSERT(\"invalid optflags passed: TF_SEG_DATA_CHECKSUMMED\",\n              (optflags & TF_SEG_DATA_CHECKSUMMED) == 0);\n#endif /* TCP_CHECKSUM_ON_COPY */\n\n  /* build TCP header */\n  if (pbuf_header(p, TCP_HLEN)) {\n    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"tcp_create_segment: no room for TCP header in pbuf.\\n\"));\n    TCP_STATS_INC(tcp.err);\n    tcp_seg_free(seg);\n    return NULL;\n  }\n  seg->tcphdr = (struct tcp_hdr *)seg->p->payload;\n  seg->tcphdr->src = lwip_htons(pcb->local_port);\n  seg->tcphdr->dest = lwip_htons(pcb->remote_port);\n  seg->tcphdr->seqno = lwip_htonl(seqno);\n  /* ackno is set in tcp_output */\n  TCPH_HDRLEN_FLAGS_SET(seg->tcphdr, (5 + optlen / 4), flags);\n  /* wnd and chksum are set in tcp_output */\n  seg->tcphdr->urgp = 0;\n  return seg;\n}\n\n/**\n * Allocate a PBUF_RAM pbuf, perhaps with extra space at the end.\n *\n * This function is like pbuf_alloc(layer, length, PBUF_RAM) except\n * there may be extra bytes available at the end.\n *\n * @param layer flag to define header size.\n * @param length size of the pbuf's payload.\n * @param max_length maximum usable size of payload+oversize.\n * @param oversize pointer to a u16_t that will receive the number of usable tail bytes.\n * @param pcb The TCP connection that will enqueue the pbuf.\n * @param apiflags API flags given to tcp_write.\n * @param first_seg true when this pbuf will be used in the first enqueued segment.\n */\n#if TCP_OVERSIZE\nstatic struct pbuf *\ntcp_pbuf_prealloc(pbuf_layer layer, u16_t length, u16_t max_length,\n                  u16_t *oversize, struct tcp_pcb *pcb, u8_t apiflags,\n                  u8_t first_seg)\n{\n  struct pbuf *p;\n  u16_t alloc = length;\n\n#if LWIP_NETIF_TX_SINGLE_PBUF\n  LWIP_UNUSED_ARG(max_length);\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_UNUSED_ARG(apiflags);\n  LWIP_UNUSED_ARG(first_seg);\n  alloc = max_length;\n#else /* LWIP_NETIF_TX_SINGLE_PBUF */\n  if (length < max_length) {\n    /* Should we allocate an oversized pbuf, or just the minimum\n     * length required? If tcp_write is going to be called again\n     * before this segment is transmitted, we want the oversized\n     * buffer. If the segment will be transmitted immediately, we can\n     * save memory by allocating only length. We use a simple\n     * heuristic based on the following information:\n     *\n     * Did the user set TCP_WRITE_FLAG_MORE?\n     *\n     * Will the Nagle algorithm defer transmission of this segment?\n     */\n    if ((apiflags & TCP_WRITE_FLAG_MORE) ||\n        (!(pcb->flags & TF_NODELAY) &&\n         (!first_seg ||\n          pcb->unsent != NULL ||\n          pcb->unacked != NULL))) {\n      alloc = LWIP_MIN(max_length, LWIP_MEM_ALIGN_SIZE(TCP_OVERSIZE_CALC_LENGTH(length)));\n    }\n  }\n#endif /* LWIP_NETIF_TX_SINGLE_PBUF */\n  p = pbuf_alloc(layer, alloc, PBUF_RAM);\n  if (p == NULL) {\n    return NULL;\n  }\n  LWIP_ASSERT(\"need unchained pbuf\", p->next == NULL);\n  *oversize = p->len - length;\n  /* trim p->len to the currently used size */\n  p->len = p->tot_len = length;\n  return p;\n}\n#else /* TCP_OVERSIZE */\n#define tcp_pbuf_prealloc(layer, length, mx, os, pcb, api, fst) pbuf_alloc((layer), (length), PBUF_RAM)\n#endif /* TCP_OVERSIZE */\n\n#if TCP_CHECKSUM_ON_COPY\n/** Add a checksum of newly added data to the segment */\nstatic void\ntcp_seg_add_chksum(u16_t chksum, u16_t len, u16_t *seg_chksum,\n                   u8_t *seg_chksum_swapped)\n{\n  u32_t helper;\n  /* add chksum to old chksum and fold to u16_t */\n  helper = chksum + *seg_chksum;\n  chksum = FOLD_U32T(helper);\n  if ((len & 1) != 0) {\n    *seg_chksum_swapped = 1 - *seg_chksum_swapped;\n    chksum = SWAP_BYTES_IN_WORD(chksum);\n  }\n  *seg_chksum = chksum;\n}\n#endif /* TCP_CHECKSUM_ON_COPY */\n\n/** Checks if tcp_write is allowed or not (checks state, snd_buf and snd_queuelen).\n *\n * @param pcb the tcp pcb to check for\n * @param len length of data to send (checked agains snd_buf)\n * @return ERR_OK if tcp_write is allowed to proceed, another err_t otherwise\n */\nstatic err_t\ntcp_write_checks(struct tcp_pcb *pcb, u16_t len)\n{\n  /* connection is in invalid state for data transmission? */\n  if ((pcb->state != ESTABLISHED) &&\n      (pcb->state != CLOSE_WAIT) &&\n      (pcb->state != SYN_SENT) &&\n      (pcb->state != SYN_RCVD)) {\n    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_STATE | LWIP_DBG_LEVEL_SEVERE, (\"tcp_write() called in invalid state\\n\"));\n    return ERR_CONN;\n  } else if (len == 0) {\n    return ERR_OK;\n  }\n\n  /* fail on too much data */\n  if (len > pcb->snd_buf) {\n    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, (\"tcp_write: too much data (len=%\"U16_F\" > snd_buf=%\"TCPWNDSIZE_F\")\\n\",\n      len, pcb->snd_buf));\n    pcb->flags |= TF_NAGLEMEMERR;\n    return ERR_MEM;\n  }\n\n  LWIP_DEBUGF(TCP_QLEN_DEBUG, (\"tcp_write: queuelen: %\"TCPWNDSIZE_F\"\\n\", (tcpwnd_size_t)pcb->snd_queuelen));\n\n  /* If total number of pbufs on the unsent/unacked queues exceeds the\n   * configured maximum, return an error */\n  /* check for configured max queuelen and possible overflow */\n  if ((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {\n    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, (\"tcp_write: too long queue %\"U16_F\" (max %\"U16_F\")\\n\",\n      pcb->snd_queuelen, (u16_t)TCP_SND_QUEUELEN));\n    TCP_STATS_INC(tcp.memerr);\n    pcb->flags |= TF_NAGLEMEMERR;\n    return ERR_MEM;\n  }\n  if (pcb->snd_queuelen != 0) {\n    LWIP_ASSERT(\"tcp_write: pbufs on queue => at least one queue non-empty\",\n      pcb->unacked != NULL || pcb->unsent != NULL);\n  } else {\n    LWIP_ASSERT(\"tcp_write: no pbufs on queue => both queues empty\",\n      pcb->unacked == NULL && pcb->unsent == NULL);\n  }\n  return ERR_OK;\n}\n\n/**\n * @ingroup tcp_raw\n * Write data for sending (but does not send it immediately).\n *\n * It waits in the expectation of more data being sent soon (as\n * it can send them more efficiently by combining them together).\n * To prompt the system to send data now, call tcp_output() after\n * calling tcp_write().\n *\n * @param pcb Protocol control block for the TCP connection to enqueue data for.\n * @param arg Pointer to the data to be enqueued for sending.\n * @param len Data length in bytes\n * @param apiflags combination of following flags :\n * - TCP_WRITE_FLAG_COPY (0x01) data will be copied into memory belonging to the stack\n * - TCP_WRITE_FLAG_MORE (0x02) for TCP connection, PSH flag will not be set on last segment sent,\n * @return ERR_OK if enqueued, another err_t on error\n */\nerr_t\ntcp_write(struct tcp_pcb *pcb, const void *arg, u16_t len, u8_t apiflags)\n{\n  struct pbuf *concat_p = NULL;\n  struct tcp_seg *last_unsent = NULL, *seg = NULL, *prev_seg = NULL, *queue = NULL;\n  u16_t pos = 0; /* position in 'arg' data */\n  u16_t queuelen;\n  u8_t optlen = 0;\n  u8_t optflags = 0;\n#if TCP_OVERSIZE\n  u16_t oversize = 0;\n  u16_t oversize_used = 0;\n#if TCP_OVERSIZE_DBGCHECK\n  u16_t oversize_add = 0;\n#endif /* TCP_OVERSIZE_DBGCHECK*/\n#endif /* TCP_OVERSIZE */\n  u16_t extendlen = 0;\n#if TCP_CHECKSUM_ON_COPY\n  u16_t concat_chksum = 0;\n  u8_t concat_chksum_swapped = 0;\n  u16_t concat_chksummed = 0;\n#endif /* TCP_CHECKSUM_ON_COPY */\n  err_t err;\n  /* don't allocate segments bigger than half the maximum window we ever received */\n  u16_t mss_local = LWIP_MIN(pcb->mss, TCPWND_MIN16(pcb->snd_wnd_max/2));\n  mss_local = mss_local ? mss_local : pcb->mss;\n\n#if LWIP_NETIF_TX_SINGLE_PBUF\n  /* Always copy to try to create single pbufs for TX */\n  apiflags |= TCP_WRITE_FLAG_COPY;\n#endif /* LWIP_NETIF_TX_SINGLE_PBUF */\n\n  LWIP_DEBUGF(TCP_OUTPUT_DEBUG, (\"tcp_write(pcb=%p, data=%p, len=%\"U16_F\", apiflags=%\"U16_F\")\\n\",\n    (void *)pcb, arg, len, (u16_t)apiflags));\n  LWIP_ERROR(\"tcp_write: arg == NULL (programmer violates API)\",\n             arg != NULL, return ERR_ARG;);\n\n  err = tcp_write_checks(pcb, len);\n  if (err != ERR_OK) {\n    return err;\n  }\n  queuelen = pcb->snd_queuelen;\n\n#if LWIP_TCP_TIMESTAMPS\n  if ((pcb->flags & TF_TIMESTAMP)) {\n    /* Make sure the timestamp option is only included in data segments if we\n       agreed about it with the remote host. */\n    optflags = TF_SEG_OPTS_TS;\n    optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS);\n    /* ensure that segments can hold at least one data byte... */\n    mss_local = LWIP_MAX(mss_local, LWIP_TCP_OPT_LEN_TS + 1);\n  }\n#endif /* LWIP_TCP_TIMESTAMPS */\n\n\n  /*\n   * TCP segmentation is done in three phases with increasing complexity:\n   *\n   * 1. Copy data directly into an oversized pbuf.\n   * 2. Chain a new pbuf to the end of pcb->unsent.\n   * 3. Create new segments.\n   *\n   * We may run out of memory at any point. In that case we must\n   * return ERR_MEM and not change anything in pcb. Therefore, all\n   * changes are recorded in local variables and committed at the end\n   * of the function. Some pcb fields are maintained in local copies:\n   *\n   * queuelen = pcb->snd_queuelen\n   * oversize = pcb->unsent_oversize\n   *\n   * These variables are set consistently by the phases:\n   *\n   * seg points to the last segment tampered with.\n   *\n   * pos records progress as data is segmented.\n   */\n\n  /* Find the tail of the unsent queue. */\n  if (pcb->unsent != NULL) {\n    u16_t space;\n    u16_t unsent_optlen;\n\n    /* @todo: this could be sped up by keeping last_unsent in the pcb */\n    for (last_unsent = pcb->unsent; last_unsent->next != NULL;\n         last_unsent = last_unsent->next);\n\n    /* Usable space at the end of the last unsent segment */\n    unsent_optlen = LWIP_TCP_OPT_LENGTH(last_unsent->flags);\n    LWIP_ASSERT(\"mss_local is too small\", mss_local >= last_unsent->len + unsent_optlen);\n    space = mss_local - (last_unsent->len + unsent_optlen);\n\n    /*\n     * Phase 1: Copy data directly into an oversized pbuf.\n     *\n     * The number of bytes copied is recorded in the oversize_used\n     * variable. The actual copying is done at the bottom of the\n     * function.\n     */\n#if TCP_OVERSIZE\n#if TCP_OVERSIZE_DBGCHECK\n    /* check that pcb->unsent_oversize matches last_unsent->oversize_left */\n    LWIP_ASSERT(\"unsent_oversize mismatch (pcb vs. last_unsent)\",\n                pcb->unsent_oversize == last_unsent->oversize_left);\n#endif /* TCP_OVERSIZE_DBGCHECK */\n    oversize = pcb->unsent_oversize;\n    if (oversize > 0) {\n      LWIP_ASSERT(\"inconsistent oversize vs. space\", oversize <= space);\n      seg = last_unsent;\n      oversize_used = LWIP_MIN(space, LWIP_MIN(oversize, len));\n      pos += oversize_used;\n      oversize -= oversize_used;\n      space -= oversize_used;\n    }\n    /* now we are either finished or oversize is zero */\n    LWIP_ASSERT(\"inconsistent oversize vs. len\", (oversize == 0) || (pos == len));\n#endif /* TCP_OVERSIZE */\n\n    /*\n     * Phase 2: Chain a new pbuf to the end of pcb->unsent.\n     *\n     * As an exception when NOT copying the data, if the given data buffer\n     * directly follows the last unsent data buffer in memory, extend the last\n     * ROM pbuf reference to the buffer, thus saving a ROM pbuf allocation.\n     *\n     * We don't extend segments containing SYN/FIN flags or options\n     * (len==0). The new pbuf is kept in concat_p and pbuf_cat'ed at\n     * the end.\n     */\n    if ((pos < len) && (space > 0) && (last_unsent->len > 0)) {\n      u16_t seglen = LWIP_MIN(space, len - pos);\n      seg = last_unsent;\n\n      /* Create a pbuf with a copy or reference to seglen bytes. We\n       * can use PBUF_RAW here since the data appears in the middle of\n       * a segment. A header will never be prepended. */\n      if (apiflags & TCP_WRITE_FLAG_COPY) {\n        /* Data is copied */\n        if ((concat_p = tcp_pbuf_prealloc(PBUF_RAW, seglen, space, &oversize, pcb, apiflags, 1)) == NULL) {\n          LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n                      (\"tcp_write : could not allocate memory for pbuf copy size %\"U16_F\"\\n\",\n                       seglen));\n          goto memerr;\n        }\n#if TCP_OVERSIZE_DBGCHECK\n        oversize_add = oversize;\n#endif /* TCP_OVERSIZE_DBGCHECK */\n        TCP_DATA_COPY2(concat_p->payload, (const u8_t*)arg + pos, seglen, &concat_chksum, &concat_chksum_swapped);\n#if TCP_CHECKSUM_ON_COPY\n        concat_chksummed += seglen;\n#endif /* TCP_CHECKSUM_ON_COPY */\n        queuelen += pbuf_clen(concat_p);\n      } else {\n        /* Data is not copied */\n        /* If the last unsent pbuf is of type PBUF_ROM, try to extend it. */\n        struct pbuf *p;\n        for (p = last_unsent->p; p->next != NULL; p = p->next);\n        if (p->type == PBUF_ROM && (const u8_t *)p->payload + p->len == (const u8_t *)arg) {\n          LWIP_ASSERT(\"tcp_write: ROM pbufs cannot be oversized\", pos == 0);\n          extendlen = seglen;\n        } else {\n          if ((concat_p = pbuf_alloc(PBUF_RAW, seglen, PBUF_ROM)) == NULL) {\n            LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n                        (\"tcp_write: could not allocate memory for zero-copy pbuf\\n\"));\n            goto memerr;\n          }\n          /* reference the non-volatile payload data */\n          ((struct pbuf_rom*)concat_p)->payload = (const u8_t*)arg + pos;\n          queuelen += pbuf_clen(concat_p);\n        }\n#if TCP_CHECKSUM_ON_COPY\n        /* calculate the checksum of nocopy-data */\n        tcp_seg_add_chksum(~inet_chksum((const u8_t*)arg + pos, seglen), seglen,\n          &concat_chksum, &concat_chksum_swapped);\n        concat_chksummed += seglen;\n#endif /* TCP_CHECKSUM_ON_COPY */\n      }\n\n      pos += seglen;\n    }\n  } else {\n#if TCP_OVERSIZE\n    LWIP_ASSERT(\"unsent_oversize mismatch (pcb->unsent is NULL)\",\n                pcb->unsent_oversize == 0);\n#endif /* TCP_OVERSIZE */\n  }\n\n  /*\n   * Phase 3: Create new segments.\n   *\n   * The new segments are chained together in the local 'queue'\n   * variable, ready to be appended to pcb->unsent.\n   */\n  while (pos < len) {\n    struct pbuf *p;\n    u16_t left = len - pos;\n    u16_t max_len = mss_local - optlen;\n    u16_t seglen = LWIP_MIN(left, max_len);\n#if TCP_CHECKSUM_ON_COPY\n    u16_t chksum = 0;\n    u8_t chksum_swapped = 0;\n#endif /* TCP_CHECKSUM_ON_COPY */\n\n    if (apiflags & TCP_WRITE_FLAG_COPY) {\n      /* If copy is set, memory should be allocated and data copied\n       * into pbuf */\n      if ((p = tcp_pbuf_prealloc(PBUF_TRANSPORT, seglen + optlen, mss_local, &oversize, pcb, apiflags, queue == NULL)) == NULL) {\n        LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"tcp_write : could not allocate memory for pbuf copy size %\"U16_F\"\\n\", seglen));\n        goto memerr;\n      }\n      LWIP_ASSERT(\"tcp_write: check that first pbuf can hold the complete seglen\",\n                  (p->len >= seglen));\n      TCP_DATA_COPY2((char *)p->payload + optlen, (const u8_t*)arg + pos, seglen, &chksum, &chksum_swapped);\n    } else {\n      /* Copy is not set: First allocate a pbuf for holding the data.\n       * Since the referenced data is available at least until it is\n       * sent out on the link (as it has to be ACKed by the remote\n       * party) we can safely use PBUF_ROM instead of PBUF_REF here.\n       */\n      struct pbuf *p2;\n#if TCP_OVERSIZE\n      LWIP_ASSERT(\"oversize == 0\", oversize == 0);\n#endif /* TCP_OVERSIZE */\n      if ((p2 = pbuf_alloc(PBUF_TRANSPORT, seglen, PBUF_ROM)) == NULL) {\n        LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"tcp_write: could not allocate memory for zero-copy pbuf\\n\"));\n        goto memerr;\n      }\n#if TCP_CHECKSUM_ON_COPY\n      /* calculate the checksum of nocopy-data */\n      chksum = ~inet_chksum((const u8_t*)arg + pos, seglen);\n      if (seglen & 1) {\n        chksum_swapped = 1;\n        chksum = SWAP_BYTES_IN_WORD(chksum);\n      }\n#endif /* TCP_CHECKSUM_ON_COPY */\n      /* reference the non-volatile payload data */\n      ((struct pbuf_rom*)p2)->payload = (const u8_t*)arg + pos;\n\n      /* Second, allocate a pbuf for the headers. */\n      if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {\n        /* If allocation fails, we have to deallocate the data pbuf as\n         * well. */\n        pbuf_free(p2);\n        LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"tcp_write: could not allocate memory for header pbuf\\n\"));\n        goto memerr;\n      }\n      /* Concatenate the headers and data pbufs together. */\n      pbuf_cat(p/*header*/, p2/*data*/);\n    }\n\n    queuelen += pbuf_clen(p);\n\n    /* Now that there are more segments queued, we check again if the\n     * length of the queue exceeds the configured maximum or\n     * overflows. */\n    if ((queuelen > TCP_SND_QUEUELEN) || (queuelen > TCP_SNDQUEUELEN_OVERFLOW)) {\n      LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"tcp_write: queue too long %\"U16_F\" (%d)\\n\",\n        queuelen, (int)TCP_SND_QUEUELEN));\n      pbuf_free(p);\n      goto memerr;\n    }\n\n    if ((seg = tcp_create_segment(pcb, p, 0, pcb->snd_lbb + pos, optflags)) == NULL) {\n      goto memerr;\n    }\n#if TCP_OVERSIZE_DBGCHECK\n    seg->oversize_left = oversize;\n#endif /* TCP_OVERSIZE_DBGCHECK */\n#if TCP_CHECKSUM_ON_COPY\n    seg->chksum = chksum;\n    seg->chksum_swapped = chksum_swapped;\n    seg->flags |= TF_SEG_DATA_CHECKSUMMED;\n#endif /* TCP_CHECKSUM_ON_COPY */\n\n    /* first segment of to-be-queued data? */\n    if (queue == NULL) {\n      queue = seg;\n    } else {\n      /* Attach the segment to the end of the queued segments */\n      LWIP_ASSERT(\"prev_seg != NULL\", prev_seg != NULL);\n      prev_seg->next = seg;\n    }\n    /* remember last segment of to-be-queued data for next iteration */\n    prev_seg = seg;\n\n    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE, (\"tcp_write: queueing %\"U32_F\":%\"U32_F\"\\n\",\n      lwip_ntohl(seg->tcphdr->seqno),\n      lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg)));\n\n    pos += seglen;\n  }\n\n  /*\n   * All three segmentation phases were successful. We can commit the\n   * transaction.\n   */\n#if TCP_OVERSIZE_DBGCHECK\n  if ((last_unsent != NULL) && (oversize_add != 0)) {\n    last_unsent->oversize_left += oversize_add;\n  }\n#endif /* TCP_OVERSIZE_DBGCHECK */\n\n  /*\n   * Phase 1: If data has been added to the preallocated tail of\n   * last_unsent, we update the length fields of the pbuf chain.\n   */\n#if TCP_OVERSIZE\n  if (oversize_used > 0) {\n    struct pbuf *p;\n    /* Bump tot_len of whole chain, len of tail */\n    for (p = last_unsent->p; p; p = p->next) {\n      p->tot_len += oversize_used;\n      if (p->next == NULL) {\n        TCP_DATA_COPY((char *)p->payload + p->len, arg, oversize_used, last_unsent);\n        p->len += oversize_used;\n      }\n    }\n    last_unsent->len += oversize_used;\n#if TCP_OVERSIZE_DBGCHECK\n    LWIP_ASSERT(\"last_unsent->oversize_left >= oversize_used\",\n                last_unsent->oversize_left >= oversize_used);\n    last_unsent->oversize_left -= oversize_used;\n#endif /* TCP_OVERSIZE_DBGCHECK */\n  }\n  pcb->unsent_oversize = oversize;\n#endif /* TCP_OVERSIZE */\n\n  /*\n   * Phase 2: concat_p can be concatenated onto last_unsent->p, unless we\n   * determined that the last ROM pbuf can be extended to include the new data.\n   */\n  if (concat_p != NULL) {\n    LWIP_ASSERT(\"tcp_write: cannot concatenate when pcb->unsent is empty\",\n      (last_unsent != NULL));\n    pbuf_cat(last_unsent->p, concat_p);\n    last_unsent->len += concat_p->tot_len;\n  } else if (extendlen > 0) {\n    struct pbuf *p;\n    LWIP_ASSERT(\"tcp_write: extension of reference requires reference\",\n      last_unsent != NULL && last_unsent->p != NULL);\n    for (p = last_unsent->p; p->next != NULL; p = p->next) {\n      p->tot_len += extendlen;\n    }\n    p->tot_len += extendlen;\n    p->len += extendlen;\n    last_unsent->len += extendlen;\n  }\n\n#if TCP_CHECKSUM_ON_COPY\n  if (concat_chksummed) {\n    LWIP_ASSERT(\"tcp_write: concat checksum needs concatenated data\",\n        concat_p != NULL || extendlen > 0);\n    /*if concat checksumm swapped - swap it back */\n    if (concat_chksum_swapped) {\n      concat_chksum = SWAP_BYTES_IN_WORD(concat_chksum);\n    }\n    tcp_seg_add_chksum(concat_chksum, concat_chksummed, &last_unsent->chksum,\n      &last_unsent->chksum_swapped);\n    last_unsent->flags |= TF_SEG_DATA_CHECKSUMMED;\n  }\n#endif /* TCP_CHECKSUM_ON_COPY */\n\n  /*\n   * Phase 3: Append queue to pcb->unsent. Queue may be NULL, but that\n   * is harmless\n   */\n  if (last_unsent == NULL) {\n    pcb->unsent = queue;\n  } else {\n    last_unsent->next = queue;\n  }\n\n  /*\n   * Finally update the pcb state.\n   */\n  pcb->snd_lbb += len;\n  pcb->snd_buf -= len;\n  pcb->snd_queuelen = queuelen;\n\n  LWIP_DEBUGF(TCP_QLEN_DEBUG, (\"tcp_write: %\"S16_F\" (after enqueued)\\n\",\n    pcb->snd_queuelen));\n  if (pcb->snd_queuelen != 0) {\n    LWIP_ASSERT(\"tcp_write: valid queue length\",\n                pcb->unacked != NULL || pcb->unsent != NULL);\n  }\n\n  /* Set the PSH flag in the last segment that we enqueued. */\n  if (seg != NULL && seg->tcphdr != NULL && ((apiflags & TCP_WRITE_FLAG_MORE)==0)) {\n    TCPH_SET_FLAG(seg->tcphdr, TCP_PSH);\n  }\n\n  return ERR_OK;\nmemerr:\n  pcb->flags |= TF_NAGLEMEMERR;\n  TCP_STATS_INC(tcp.memerr);\n\n  if (concat_p != NULL) {\n    pbuf_free(concat_p);\n  }\n  if (queue != NULL) {\n    tcp_segs_free(queue);\n  }\n  if (pcb->snd_queuelen != 0) {\n    LWIP_ASSERT(\"tcp_write: valid queue length\", pcb->unacked != NULL ||\n      pcb->unsent != NULL);\n  }\n  LWIP_DEBUGF(TCP_QLEN_DEBUG | LWIP_DBG_STATE, (\"tcp_write: %\"S16_F\" (with mem err)\\n\", pcb->snd_queuelen));\n  return ERR_MEM;\n}\n\n/**\n * Enqueue TCP options for transmission.\n *\n * Called by tcp_connect(), tcp_listen_input(), and tcp_send_ctrl().\n *\n * @param pcb Protocol control block for the TCP connection.\n * @param flags TCP header flags to set in the outgoing segment.\n */\nerr_t\ntcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags)\n{\n  struct pbuf *p;\n  struct tcp_seg *seg;\n  u8_t optflags = 0;\n  u8_t optlen = 0;\n\n  LWIP_DEBUGF(TCP_QLEN_DEBUG, (\"tcp_enqueue_flags: queuelen: %\"U16_F\"\\n\", (u16_t)pcb->snd_queuelen));\n\n  LWIP_ASSERT(\"tcp_enqueue_flags: need either TCP_SYN or TCP_FIN in flags (programmer violates API)\",\n              (flags & (TCP_SYN | TCP_FIN)) != 0);\n\n  /* check for configured max queuelen and possible overflow (FIN flag should always come through!) */\n  if (((pcb->snd_queuelen >= TCP_SND_QUEUELEN) || (pcb->snd_queuelen > TCP_SNDQUEUELEN_OVERFLOW)) &&\n      ((flags & TCP_FIN) == 0)) {\n    LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_LEVEL_SEVERE, (\"tcp_enqueue_flags: too long queue %\"U16_F\" (max %\"U16_F\")\\n\",\n                                       pcb->snd_queuelen, (u16_t)TCP_SND_QUEUELEN));\n    TCP_STATS_INC(tcp.memerr);\n    pcb->flags |= TF_NAGLEMEMERR;\n    return ERR_MEM;\n  }\n\n  if (flags & TCP_SYN) {\n    optflags = TF_SEG_OPTS_MSS;\n#if LWIP_WND_SCALE\n    if ((pcb->state != SYN_RCVD) || (pcb->flags & TF_WND_SCALE)) {\n      /* In a <SYN,ACK> (sent in state SYN_RCVD), the window scale option may only\n         be sent if we received a window scale option from the remote host. */\n      optflags |= TF_SEG_OPTS_WND_SCALE;\n    }\n#endif /* LWIP_WND_SCALE */\n  }\n#if LWIP_TCP_TIMESTAMPS\n  if ((pcb->flags & TF_TIMESTAMP)) {\n    /* Make sure the timestamp option is only included in data segments if we\n       agreed about it with the remote host. */\n    optflags |= TF_SEG_OPTS_TS;\n  }\n#endif /* LWIP_TCP_TIMESTAMPS */\n  optlen = LWIP_TCP_OPT_LENGTH(optflags);\n\n  /* Allocate pbuf with room for TCP header + options */\n  if ((p = pbuf_alloc(PBUF_TRANSPORT, optlen, PBUF_RAM)) == NULL) {\n    pcb->flags |= TF_NAGLEMEMERR;\n    TCP_STATS_INC(tcp.memerr);\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"tcp_enqueue_flags: check that first pbuf can hold optlen\",\n              (p->len >= optlen));\n\n  /* Allocate memory for tcp_seg, and fill in fields. */\n  if ((seg = tcp_create_segment(pcb, p, flags, pcb->snd_lbb, optflags)) == NULL) {\n    pcb->flags |= TF_NAGLEMEMERR;\n    TCP_STATS_INC(tcp.memerr);\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"seg->tcphdr not aligned\", ((mem_ptr_t)seg->tcphdr % LWIP_MIN(MEM_ALIGNMENT, 4)) == 0);\n  LWIP_ASSERT(\"tcp_enqueue_flags: invalid segment length\", seg->len == 0);\n\n  LWIP_DEBUGF(TCP_OUTPUT_DEBUG | LWIP_DBG_TRACE,\n              (\"tcp_enqueue_flags: queueing %\"U32_F\":%\"U32_F\" (0x%\"X16_F\")\\n\",\n               lwip_ntohl(seg->tcphdr->seqno),\n               lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg),\n               (u16_t)flags));\n\n  /* Now append seg to pcb->unsent queue */\n  if (pcb->unsent == NULL) {\n    pcb->unsent = seg;\n  } else {\n    struct tcp_seg *useg;\n    for (useg = pcb->unsent; useg->next != NULL; useg = useg->next);\n    useg->next = seg;\n  }\n#if TCP_OVERSIZE\n  /* The new unsent tail has no space */\n  pcb->unsent_oversize = 0;\n#endif /* TCP_OVERSIZE */\n\n  /* SYN and FIN bump the sequence number */\n  if ((flags & TCP_SYN) || (flags & TCP_FIN)) {\n    pcb->snd_lbb++;\n    /* optlen does not influence snd_buf */\n  }\n  if (flags & TCP_FIN) {\n    pcb->flags |= TF_FIN;\n  }\n\n  /* update number of segments on the queues */\n  pcb->snd_queuelen += pbuf_clen(seg->p);\n  LWIP_DEBUGF(TCP_QLEN_DEBUG, (\"tcp_enqueue_flags: %\"S16_F\" (after enqueued)\\n\", pcb->snd_queuelen));\n  if (pcb->snd_queuelen != 0) {\n    LWIP_ASSERT(\"tcp_enqueue_flags: invalid queue length\",\n      pcb->unacked != NULL || pcb->unsent != NULL);\n  }\n\n  return ERR_OK;\n}\n\n#if LWIP_TCP_TIMESTAMPS\n/* Build a timestamp option (12 bytes long) at the specified options pointer)\n *\n * @param pcb tcp_pcb\n * @param opts option pointer where to store the timestamp option\n */\nstatic void\ntcp_build_timestamp_option(struct tcp_pcb *pcb, u32_t *opts)\n{\n  /* Pad with two NOP options to make everything nicely aligned */\n  opts[0] = PP_HTONL(0x0101080A);\n  opts[1] = lwip_htonl(sys_now());\n  opts[2] = lwip_htonl(pcb->ts_recent);\n}\n#endif\n\n#if LWIP_WND_SCALE\n/** Build a window scale option (3 bytes long) at the specified options pointer)\n *\n * @param opts option pointer where to store the window scale option\n */\nstatic void\ntcp_build_wnd_scale_option(u32_t *opts)\n{\n  /* Pad with one NOP option to make everything nicely aligned */\n  opts[0] = PP_HTONL(0x01030300 | TCP_RCV_SCALE);\n}\n#endif\n\n/**\n * Send an ACK without data.\n *\n * @param pcb Protocol control block for the TCP connection to send the ACK\n */\nerr_t\ntcp_send_empty_ack(struct tcp_pcb *pcb)\n{\n  err_t err;\n  struct pbuf *p;\n  u8_t optlen = 0;\n  struct netif *netif;\n#if LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP\n  struct tcp_hdr *tcphdr;\n#endif /* LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP */\n\n#if LWIP_TCP_TIMESTAMPS\n  if (pcb->flags & TF_TIMESTAMP) {\n    optlen = LWIP_TCP_OPT_LENGTH(TF_SEG_OPTS_TS);\n  }\n#endif\n\n  p = tcp_output_alloc_header(pcb, optlen, 0, lwip_htonl(pcb->snd_nxt));\n  if (p == NULL) {\n    /* let tcp_fasttmr retry sending this ACK */\n    pcb->flags |= (TF_ACK_DELAY | TF_ACK_NOW);\n    LWIP_DEBUGF(TCP_OUTPUT_DEBUG, (\"tcp_output: (ACK) could not allocate pbuf\\n\"));\n    return ERR_BUF;\n  }\n#if LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP\n  tcphdr = (struct tcp_hdr *)p->payload;\n#endif /* LWIP_TCP_TIMESTAMPS || CHECKSUM_GEN_TCP */\n  LWIP_DEBUGF(TCP_OUTPUT_DEBUG,\n              (\"tcp_output: sending ACK for %\"U32_F\"\\n\", pcb->rcv_nxt));\n\n  /* NB. MSS and window scale options are only sent on SYNs, so ignore them here */\n#if LWIP_TCP_TIMESTAMPS\n  pcb->ts_lastacksent = pcb->rcv_nxt;\n\n  if (pcb->flags & TF_TIMESTAMP) {\n    tcp_build_timestamp_option(pcb, (u32_t *)(tcphdr + 1));\n  }\n#endif\n\n  netif = ip_route(&pcb->local_ip, &pcb->remote_ip);\n  if (netif == NULL) {\n    err = ERR_RTE;\n  } else {\n#if CHECKSUM_GEN_TCP\n    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {\n      tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,\n        &pcb->local_ip, &pcb->remote_ip);\n    }\n#endif\n    NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));\n    err = ip_output_if(p, &pcb->local_ip, &pcb->remote_ip,\n      pcb->ttl, pcb->tos, IP_PROTO_TCP, netif);\n    NETIF_SET_HWADDRHINT(netif, NULL);\n  }\n  pbuf_free(p);\n\n  if (err != ERR_OK) {\n    /* let tcp_fasttmr retry sending this ACK */\n    pcb->flags |= (TF_ACK_DELAY | TF_ACK_NOW);\n  } else {\n    /* remove ACK flags from the PCB, as we sent an empty ACK now */\n    pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);\n  }\n\n  return err;\n}\n\n/**\n * @ingroup tcp_raw\n * Find out what we can send and send it\n *\n * @param pcb Protocol control block for the TCP connection to send data\n * @return ERR_OK if data has been sent or nothing to send\n *         another err_t on error\n */\nerr_t\ntcp_output(struct tcp_pcb *pcb)\n{\n  struct tcp_seg *seg, *useg;\n  u32_t wnd, snd_nxt;\n  err_t err;\n  struct netif *netif;\n#if TCP_CWND_DEBUG\n  s16_t i = 0;\n#endif /* TCP_CWND_DEBUG */\n\n  /* pcb->state LISTEN not allowed here */\n  LWIP_ASSERT(\"don't call tcp_output for listen-pcbs\",\n    pcb->state != LISTEN);\n\n  /* First, check if we are invoked by the TCP input processing\n     code. If so, we do not output anything. Instead, we rely on the\n     input processing code to call us when input processing is done\n     with. */\n  if (tcp_input_pcb == pcb) {\n    return ERR_OK;\n  }\n\n  wnd = LWIP_MIN(pcb->snd_wnd, pcb->cwnd);\n\n  seg = pcb->unsent;\n\n  /* If the TF_ACK_NOW flag is set and no data will be sent (either\n   * because the ->unsent queue is empty or because the window does\n   * not allow it), construct an empty ACK segment and send it.\n   *\n   * If data is to be sent, we will just piggyback the ACK (see below).\n   */\n  if (pcb->flags & TF_ACK_NOW &&\n     (seg == NULL ||\n      lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd)) {\n     return tcp_send_empty_ack(pcb);\n  }\n\n  /* useg should point to last segment on unacked queue */\n  useg = pcb->unacked;\n  if (useg != NULL) {\n    for (; useg->next != NULL; useg = useg->next);\n  }\n\n  netif = ip_route(&pcb->local_ip, &pcb->remote_ip);\n  if (netif == NULL) {\n    return ERR_RTE;\n  }\n\n  /* If we don't have a local IP address, we get one from netif */\n  if (ip_addr_isany(&pcb->local_ip)) {\n    const ip_addr_t *local_ip = ip_netif_get_local_ip(netif, &pcb->remote_ip);\n    if (local_ip == NULL) {\n      return ERR_RTE;\n    }\n    ip_addr_copy(pcb->local_ip, *local_ip);\n  }\n\n#if TCP_OUTPUT_DEBUG\n  if (seg == NULL) {\n    LWIP_DEBUGF(TCP_OUTPUT_DEBUG, (\"tcp_output: nothing to send (%p)\\n\",\n                                   (void*)pcb->unsent));\n  }\n#endif /* TCP_OUTPUT_DEBUG */\n#if TCP_CWND_DEBUG\n  if (seg == NULL) {\n    LWIP_DEBUGF(TCP_CWND_DEBUG, (\"tcp_output: snd_wnd %\"TCPWNDSIZE_F\n                                 \", cwnd %\"TCPWNDSIZE_F\", wnd %\"U32_F\n                                 \", seg == NULL, ack %\"U32_F\"\\n\",\n                                 pcb->snd_wnd, pcb->cwnd, wnd, pcb->lastack));\n  } else {\n    LWIP_DEBUGF(TCP_CWND_DEBUG,\n                (\"tcp_output: snd_wnd %\"TCPWNDSIZE_F\", cwnd %\"TCPWNDSIZE_F\", wnd %\"U32_F\n                 \", effwnd %\"U32_F\", seq %\"U32_F\", ack %\"U32_F\"\\n\",\n                 pcb->snd_wnd, pcb->cwnd, wnd,\n                 lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len,\n                 lwip_ntohl(seg->tcphdr->seqno), pcb->lastack));\n  }\n#endif /* TCP_CWND_DEBUG */\n  /* Check if we need to start the persistent timer when the next unsent segment\n   * does not fit within the remaining send window and RTO timer is not running (we\n   * have no in-flight data). A traditional approach would fill the remaining window\n   * with part of the unsent segment (which will engage zero-window probing upon\n   * reception of the zero window update from the receiver). This ensures the\n   * subsequent window update is reliably received. With the goal of being lightweight,\n   * we avoid splitting the unsent segment and treat the window as already zero.\n   */\n  if (seg != NULL &&\n      lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len > wnd &&\n      wnd > 0 && wnd == pcb->snd_wnd && pcb->unacked == NULL) {\n    /* Start the persist timer */\n    if (pcb->persist_backoff == 0) {\n      pcb->persist_cnt = 0;\n      pcb->persist_backoff = 1;\n    }\n    goto output_done;\n  }\n  /* data available and window allows it to be sent? */\n  while (seg != NULL &&\n         lwip_ntohl(seg->tcphdr->seqno) - pcb->lastack + seg->len <= wnd) {\n    LWIP_ASSERT(\"RST not expected here!\",\n                (TCPH_FLAGS(seg->tcphdr) & TCP_RST) == 0);\n    /* Stop sending if the nagle algorithm would prevent it\n     * Don't stop:\n     * - if tcp_write had a memory error before (prevent delayed ACK timeout) or\n     * - if FIN was already enqueued for this PCB (SYN is always alone in a segment -\n     *   either seg->next != NULL or pcb->unacked == NULL;\n     *   RST is no sent using tcp_write/tcp_output.\n     */\n    if ((tcp_do_output_nagle(pcb) == 0) &&\n      ((pcb->flags & (TF_NAGLEMEMERR | TF_FIN)) == 0)) {\n      break;\n    }\n#if TCP_CWND_DEBUG\n    LWIP_DEBUGF(TCP_CWND_DEBUG, (\"tcp_output: snd_wnd %\"TCPWNDSIZE_F\", cwnd %\"TCPWNDSIZE_F\", wnd %\"U32_F\", effwnd %\"U32_F\", seq %\"U32_F\", ack %\"U32_F\", i %\"S16_F\"\\n\",\n                            pcb->snd_wnd, pcb->cwnd, wnd,\n                            lwip_ntohl(seg->tcphdr->seqno) + seg->len -\n                            pcb->lastack,\n                            lwip_ntohl(seg->tcphdr->seqno), pcb->lastack, i));\n    ++i;\n#endif /* TCP_CWND_DEBUG */\n\n    if (pcb->state != SYN_SENT) {\n      TCPH_SET_FLAG(seg->tcphdr, TCP_ACK);\n    }\n\n#if TCP_OVERSIZE_DBGCHECK\n    seg->oversize_left = 0;\n#endif /* TCP_OVERSIZE_DBGCHECK */\n    err = tcp_output_segment(seg, pcb, netif);\n    if (err != ERR_OK) {\n      /* segment could not be sent, for whatever reason */\n      pcb->flags |= TF_NAGLEMEMERR;\n      return err;\n    }\n    pcb->unsent = seg->next;\n    if (pcb->state != SYN_SENT) {\n      pcb->flags &= ~(TF_ACK_DELAY | TF_ACK_NOW);\n    }\n    snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + TCP_TCPLEN(seg);\n    if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {\n      pcb->snd_nxt = snd_nxt;\n    }\n    /* put segment on unacknowledged list if length > 0 */\n    if (TCP_TCPLEN(seg) > 0) {\n      seg->next = NULL;\n      /* unacked list is empty? */\n      if (pcb->unacked == NULL) {\n        pcb->unacked = seg;\n        useg = seg;\n      /* unacked list is not empty? */\n      } else {\n        /* In the case of fast retransmit, the packet should not go to the tail\n         * of the unacked queue, but rather somewhere before it. We need to check for\n         * this case. -STJ Jul 27, 2004 */\n        if (TCP_SEQ_LT(lwip_ntohl(seg->tcphdr->seqno), lwip_ntohl(useg->tcphdr->seqno))) {\n          /* add segment to before tail of unacked list, keeping the list sorted */\n          struct tcp_seg **cur_seg = &(pcb->unacked);\n          while (*cur_seg &&\n            TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {\n              cur_seg = &((*cur_seg)->next );\n          }\n          seg->next = (*cur_seg);\n          (*cur_seg) = seg;\n        } else {\n          /* add segment to tail of unacked list */\n          useg->next = seg;\n          useg = useg->next;\n        }\n      }\n    /* do not queue empty segments on the unacked list */\n    } else {\n      tcp_seg_free(seg);\n    }\n    seg = pcb->unsent;\n  }\noutput_done:\n#if TCP_OVERSIZE\n  if (pcb->unsent == NULL) {\n    /* last unsent has been removed, reset unsent_oversize */\n    pcb->unsent_oversize = 0;\n  }\n#endif /* TCP_OVERSIZE */\n\n  pcb->flags &= ~TF_NAGLEMEMERR;\n  return ERR_OK;\n}\n\n/**\n * Called by tcp_output() to actually send a TCP segment over IP.\n *\n * @param seg the tcp_seg to send\n * @param pcb the tcp_pcb for the TCP connection used to send the segment\n * @param netif the netif used to send the segment\n */\nstatic err_t\ntcp_output_segment(struct tcp_seg *seg, struct tcp_pcb *pcb, struct netif *netif)\n{\n  err_t err;\n  u16_t len;\n  u32_t *opts;\n\n  if (seg->p->ref != 1) {\n    /* This can happen if the pbuf of this segment is still referenced by the\n       netif driver due to deferred transmission. Since this function modifies\n       p->len, we must not continue in this case. */\n    return ERR_OK;\n  }\n\n  /* The TCP header has already been constructed, but the ackno and\n   wnd fields remain. */\n  seg->tcphdr->ackno = lwip_htonl(pcb->rcv_nxt);\n\n  /* advertise our receive window size in this TCP segment */\n#if LWIP_WND_SCALE\n  if (seg->flags & TF_SEG_OPTS_WND_SCALE) {\n    /* The Window field in a SYN segment itself (the only type where we send\n       the window scale option) is never scaled. */\n    seg->tcphdr->wnd = lwip_htons(TCPWND_MIN16(pcb->rcv_ann_wnd));\n  } else\n#endif /* LWIP_WND_SCALE */\n  {\n    seg->tcphdr->wnd = lwip_htons(TCPWND_MIN16(RCV_WND_SCALE(pcb, pcb->rcv_ann_wnd)));\n  }\n\n  pcb->rcv_ann_right_edge = pcb->rcv_nxt + pcb->rcv_ann_wnd;\n\n  /* Add any requested options.  NB MSS option is only set on SYN\n     packets, so ignore it here */\n  /* cast through void* to get rid of alignment warnings */\n  opts = (u32_t *)(void *)(seg->tcphdr + 1);\n  if (seg->flags & TF_SEG_OPTS_MSS) {\n    u16_t mss;\n#if TCP_CALCULATE_EFF_SEND_MSS\n    mss = tcp_eff_send_mss(TCP_MSS, &pcb->local_ip, &pcb->remote_ip);\n#else /* TCP_CALCULATE_EFF_SEND_MSS */\n    mss = TCP_MSS;\n#endif /* TCP_CALCULATE_EFF_SEND_MSS */\n    *opts = TCP_BUILD_MSS_OPTION(mss);\n    opts += 1;\n  }\n#if LWIP_TCP_TIMESTAMPS\n  pcb->ts_lastacksent = pcb->rcv_nxt;\n\n  if (seg->flags & TF_SEG_OPTS_TS) {\n    tcp_build_timestamp_option(pcb, opts);\n    opts += 3;\n  }\n#endif\n#if LWIP_WND_SCALE\n  if (seg->flags & TF_SEG_OPTS_WND_SCALE) {\n    tcp_build_wnd_scale_option(opts);\n    opts += 1;\n  }\n#endif\n\n  /* Set retransmission timer running if it is not currently enabled\n     This must be set before checking the route. */\n  if (pcb->rtime < 0) {\n    pcb->rtime = 0;\n  }\n\n  if (pcb->rttest == 0) {\n    pcb->rttest = tcp_ticks;\n    pcb->rtseq = lwip_ntohl(seg->tcphdr->seqno);\n\n    LWIP_DEBUGF(TCP_RTO_DEBUG, (\"tcp_output_segment: rtseq %\"U32_F\"\\n\", pcb->rtseq));\n  }\n  LWIP_DEBUGF(TCP_OUTPUT_DEBUG, (\"tcp_output_segment: %\"U32_F\":%\"U32_F\"\\n\",\n          lwip_htonl(seg->tcphdr->seqno), lwip_htonl(seg->tcphdr->seqno) +\n          seg->len));\n\n  len = (u16_t)((u8_t *)seg->tcphdr - (u8_t *)seg->p->payload);\n  if (len == 0) {\n    /** Exclude retransmitted segments from this count. */\n    MIB2_STATS_INC(mib2.tcpoutsegs);\n  }\n\n  seg->p->len -= len;\n  seg->p->tot_len -= len;\n\n  seg->p->payload = seg->tcphdr;\n\n  seg->tcphdr->chksum = 0;\n#if CHECKSUM_GEN_TCP\n  IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {\n#if TCP_CHECKSUM_ON_COPY\n    u32_t acc;\n#if TCP_CHECKSUM_ON_COPY_SANITY_CHECK\n    u16_t chksum_slow = ip_chksum_pseudo(seg->p, IP_PROTO_TCP,\n      seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip);\n#endif /* TCP_CHECKSUM_ON_COPY_SANITY_CHECK */\n    if ((seg->flags & TF_SEG_DATA_CHECKSUMMED) == 0) {\n      LWIP_ASSERT(\"data included but not checksummed\",\n        seg->p->tot_len == (TCPH_HDRLEN(seg->tcphdr) * 4));\n    }\n\n    /* rebuild TCP header checksum (TCP header changes for retransmissions!) */\n    acc = ip_chksum_pseudo_partial(seg->p, IP_PROTO_TCP,\n      seg->p->tot_len, TCPH_HDRLEN(seg->tcphdr) * 4, &pcb->local_ip, &pcb->remote_ip);\n    /* add payload checksum */\n    if (seg->chksum_swapped) {\n      seg->chksum = SWAP_BYTES_IN_WORD(seg->chksum);\n      seg->chksum_swapped = 0;\n    }\n    acc += (u16_t)~(seg->chksum);\n    seg->tcphdr->chksum = FOLD_U32T(acc);\n#if TCP_CHECKSUM_ON_COPY_SANITY_CHECK\n    if (chksum_slow != seg->tcphdr->chksum) {\n      TCP_CHECKSUM_ON_COPY_SANITY_CHECK_FAIL(\n                  (\"tcp_output_segment: calculated checksum is %\"X16_F\" instead of %\"X16_F\"\\n\",\n                  seg->tcphdr->chksum, chksum_slow));\n      seg->tcphdr->chksum = chksum_slow;\n    }\n#endif /* TCP_CHECKSUM_ON_COPY_SANITY_CHECK */\n#else /* TCP_CHECKSUM_ON_COPY */\n    seg->tcphdr->chksum = ip_chksum_pseudo(seg->p, IP_PROTO_TCP,\n      seg->p->tot_len, &pcb->local_ip, &pcb->remote_ip);\n#endif /* TCP_CHECKSUM_ON_COPY */\n  }\n#endif /* CHECKSUM_GEN_TCP */\n  TCP_STATS_INC(tcp.xmit);\n\n  NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));\n  err = ip_output_if(seg->p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl,\n    pcb->tos, IP_PROTO_TCP, netif);\n  NETIF_SET_HWADDRHINT(netif, NULL);\n  return err;\n}\n\n/**\n * Send a TCP RESET packet (empty segment with RST flag set) either to\n * abort a connection or to show that there is no matching local connection\n * for a received segment.\n *\n * Called by tcp_abort() (to abort a local connection), tcp_input() (if no\n * matching local pcb was found), tcp_listen_input() (if incoming segment\n * has ACK flag set) and tcp_process() (received segment in the wrong state)\n *\n * Since a RST segment is in most cases not sent for an active connection,\n * tcp_rst() has a number of arguments that are taken from a tcp_pcb for\n * most other segment output functions.\n *\n * @param seqno the sequence number to use for the outgoing segment\n * @param ackno the acknowledge number to use for the outgoing segment\n * @param local_ip the local IP address to send the segment from\n * @param remote_ip the remote IP address to send the segment to\n * @param local_port the local TCP port to send the segment from\n * @param remote_port the remote TCP port to send the segment to\n */\nvoid\ntcp_rst(u32_t seqno, u32_t ackno,\n  const ip_addr_t *local_ip, const ip_addr_t *remote_ip,\n  u16_t local_port, u16_t remote_port)\n{\n  struct pbuf *p;\n  struct tcp_hdr *tcphdr;\n  struct netif *netif;\n  p = pbuf_alloc(PBUF_IP, TCP_HLEN, PBUF_RAM);\n  if (p == NULL) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"tcp_rst: could not allocate memory for pbuf\\n\"));\n    return;\n  }\n  LWIP_ASSERT(\"check that first pbuf can hold struct tcp_hdr\",\n              (p->len >= sizeof(struct tcp_hdr)));\n\n  tcphdr = (struct tcp_hdr *)p->payload;\n  tcphdr->src = lwip_htons(local_port);\n  tcphdr->dest = lwip_htons(remote_port);\n  tcphdr->seqno = lwip_htonl(seqno);\n  tcphdr->ackno = lwip_htonl(ackno);\n  TCPH_HDRLEN_FLAGS_SET(tcphdr, TCP_HLEN/4, TCP_RST | TCP_ACK);\n#if LWIP_WND_SCALE\n  tcphdr->wnd = PP_HTONS(((TCP_WND >> TCP_RCV_SCALE) & 0xFFFF));\n#else\n  tcphdr->wnd = PP_HTONS(TCP_WND);\n#endif\n  tcphdr->chksum = 0;\n  tcphdr->urgp = 0;\n\n  TCP_STATS_INC(tcp.xmit);\n  MIB2_STATS_INC(mib2.tcpoutrsts);\n\n  netif = ip_route(local_ip, remote_ip);\n  if (netif != NULL) {\n#if CHECKSUM_GEN_TCP\n    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {\n      tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,\n                                        local_ip, remote_ip);\n    }\n#endif\n    /* Send output with hardcoded TTL/HL since we have no access to the pcb */\n    ip_output_if(p, local_ip, remote_ip, TCP_TTL, 0, IP_PROTO_TCP, netif);\n  }\n  pbuf_free(p);\n  LWIP_DEBUGF(TCP_RST_DEBUG, (\"tcp_rst: seqno %\"U32_F\" ackno %\"U32_F\".\\n\", seqno, ackno));\n}\n\n/**\n * Requeue all unacked segments for retransmission\n *\n * Called by tcp_slowtmr() for slow retransmission.\n *\n * @param pcb the tcp_pcb for which to re-enqueue all unacked segments\n */\nvoid\ntcp_rexmit_rto(struct tcp_pcb *pcb)\n{\n  struct tcp_seg *seg;\n\n  if (pcb->unacked == NULL) {\n    return;\n  }\n\n  /* Move all unacked segments to the head of the unsent queue */\n  for (seg = pcb->unacked; seg->next != NULL; seg = seg->next);\n  /* concatenate unsent queue after unacked queue */\n  seg->next = pcb->unsent;\n#if TCP_OVERSIZE_DBGCHECK\n  /* if last unsent changed, we need to update unsent_oversize */\n  if (pcb->unsent == NULL) {\n    pcb->unsent_oversize = seg->oversize_left;\n  }\n#endif /* TCP_OVERSIZE_DBGCHECK */\n  /* unsent queue is the concatenated queue (of unacked, unsent) */\n  pcb->unsent = pcb->unacked;\n  /* unacked queue is now empty */\n  pcb->unacked = NULL;\n\n  /* increment number of retransmissions */\n  if (pcb->nrtx < 0xFF) {\n    ++pcb->nrtx;\n  }\n\n  /* Don't take any RTT measurements after retransmitting. */\n  pcb->rttest = 0;\n\n  /* Do the actual retransmission */\n  tcp_output(pcb);\n}\n\n/**\n * Requeue the first unacked segment for retransmission\n *\n * Called by tcp_receive() for fast retransmit.\n *\n * @param pcb the tcp_pcb for which to retransmit the first unacked segment\n */\nvoid\ntcp_rexmit(struct tcp_pcb *pcb)\n{\n  struct tcp_seg *seg;\n  struct tcp_seg **cur_seg;\n\n  if (pcb->unacked == NULL) {\n    return;\n  }\n\n  /* Move the first unacked segment to the unsent queue */\n  /* Keep the unsent queue sorted. */\n  seg = pcb->unacked;\n  pcb->unacked = seg->next;\n\n  cur_seg = &(pcb->unsent);\n  while (*cur_seg &&\n    TCP_SEQ_LT(lwip_ntohl((*cur_seg)->tcphdr->seqno), lwip_ntohl(seg->tcphdr->seqno))) {\n      cur_seg = &((*cur_seg)->next );\n  }\n  seg->next = *cur_seg;\n  *cur_seg = seg;\n#if TCP_OVERSIZE\n  if (seg->next == NULL) {\n    /* the retransmitted segment is last in unsent, so reset unsent_oversize */\n    pcb->unsent_oversize = 0;\n  }\n#endif /* TCP_OVERSIZE */\n\n  if (pcb->nrtx < 0xFF) {\n    ++pcb->nrtx;\n  }\n\n  /* Don't take any rtt measurements after retransmitting. */\n  pcb->rttest = 0;\n\n  /* Do the actual retransmission. */\n  MIB2_STATS_INC(mib2.tcpretranssegs);\n  /* No need to call tcp_output: we are always called from tcp_input()\n     and thus tcp_output directly returns. */\n}\n\n\n/**\n * Handle retransmission after three dupacks received\n *\n * @param pcb the tcp_pcb for which to retransmit the first unacked segment\n */\nvoid\ntcp_rexmit_fast(struct tcp_pcb *pcb)\n{\n  if (pcb->unacked != NULL && !(pcb->flags & TF_INFR)) {\n    /* This is fast retransmit. Retransmit the first unacked segment. */\n    LWIP_DEBUGF(TCP_FR_DEBUG,\n                (\"tcp_receive: dupacks %\"U16_F\" (%\"U32_F\n                 \"), fast retransmit %\"U32_F\"\\n\",\n                 (u16_t)pcb->dupacks, pcb->lastack,\n                 lwip_ntohl(pcb->unacked->tcphdr->seqno)));\n    tcp_rexmit(pcb);\n\n    /* Set ssthresh to half of the minimum of the current\n     * cwnd and the advertised window */\n    pcb->ssthresh = LWIP_MIN(pcb->cwnd, pcb->snd_wnd) / 2;\n\n    /* The minimum value for ssthresh should be 2 MSS */\n    if (pcb->ssthresh < (2U * pcb->mss)) {\n      LWIP_DEBUGF(TCP_FR_DEBUG,\n                  (\"tcp_receive: The minimum value for ssthresh %\"TCPWNDSIZE_F\n                   \" should be min 2 mss %\"U16_F\"...\\n\",\n                   pcb->ssthresh, (u16_t)(2*pcb->mss)));\n      pcb->ssthresh = 2*pcb->mss;\n    }\n\n    pcb->cwnd = pcb->ssthresh + 3 * pcb->mss;\n    pcb->flags |= TF_INFR;\n\n    /* Reset the retransmission timer to prevent immediate rto retransmissions */\n    pcb->rtime = 0;\n  }\n}\n\n\n/**\n * Send keepalive packets to keep a connection active although\n * no data is sent over it.\n *\n * Called by tcp_slowtmr()\n *\n * @param pcb the tcp_pcb for which to send a keepalive packet\n */\nerr_t\ntcp_keepalive(struct tcp_pcb *pcb)\n{\n  err_t err;\n  struct pbuf *p;\n  struct netif *netif;\n\n  LWIP_DEBUGF(TCP_DEBUG, (\"tcp_keepalive: sending KEEPALIVE probe to \"));\n  ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip);\n  LWIP_DEBUGF(TCP_DEBUG, (\"\\n\"));\n\n  LWIP_DEBUGF(TCP_DEBUG, (\"tcp_keepalive: tcp_ticks %\"U32_F\"   pcb->tmr %\"U32_F\" pcb->keep_cnt_sent %\"U16_F\"\\n\",\n                          tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent));\n\n  p = tcp_output_alloc_header(pcb, 0, 0, lwip_htonl(pcb->snd_nxt - 1));\n  if (p == NULL) {\n    LWIP_DEBUGF(TCP_DEBUG,\n                (\"tcp_keepalive: could not allocate memory for pbuf\\n\"));\n    return ERR_MEM;\n  }\n  netif = ip_route(&pcb->local_ip, &pcb->remote_ip);\n  if (netif == NULL) {\n    err = ERR_RTE;\n  } else {\n#if CHECKSUM_GEN_TCP\n    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {\n      struct tcp_hdr *tcphdr = (struct tcp_hdr *)p->payload;\n      tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,\n        &pcb->local_ip, &pcb->remote_ip);\n    }\n#endif /* CHECKSUM_GEN_TCP */\n    TCP_STATS_INC(tcp.xmit);\n\n    /* Send output to IP */\n    NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));\n    err = ip_output_if(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl, 0, IP_PROTO_TCP, netif);\n    NETIF_SET_HWADDRHINT(netif, NULL);\n  }\n  pbuf_free(p);\n\n  LWIP_DEBUGF(TCP_DEBUG, (\"tcp_keepalive: seqno %\"U32_F\" ackno %\"U32_F\" err %d.\\n\",\n                          pcb->snd_nxt - 1, pcb->rcv_nxt, (int)err));\n  return err;\n}\n\n\n/**\n * Send persist timer zero-window probes to keep a connection active\n * when a window update is lost.\n *\n * Called by tcp_slowtmr()\n *\n * @param pcb the tcp_pcb for which to send a zero-window probe packet\n */\nerr_t\ntcp_zero_window_probe(struct tcp_pcb *pcb)\n{\n  err_t err;\n  struct pbuf *p;\n  struct tcp_hdr *tcphdr;\n  struct tcp_seg *seg;\n  u16_t len;\n  u8_t is_fin;\n  u32_t snd_nxt;\n  struct netif *netif;\n\n  LWIP_DEBUGF(TCP_DEBUG, (\"tcp_zero_window_probe: sending ZERO WINDOW probe to \"));\n  ip_addr_debug_print(TCP_DEBUG, &pcb->remote_ip);\n  LWIP_DEBUGF(TCP_DEBUG, (\"\\n\"));\n\n  LWIP_DEBUGF(TCP_DEBUG,\n              (\"tcp_zero_window_probe: tcp_ticks %\"U32_F\n               \"   pcb->tmr %\"U32_F\" pcb->keep_cnt_sent %\"U16_F\"\\n\",\n               tcp_ticks, pcb->tmr, (u16_t)pcb->keep_cnt_sent));\n\n  seg = pcb->unacked;\n\n  if (seg == NULL) {\n    seg = pcb->unsent;\n  }\n  if (seg == NULL) {\n    /* nothing to send, zero window probe not needed */\n    return ERR_OK;\n  }\n\n  is_fin = ((TCPH_FLAGS(seg->tcphdr) & TCP_FIN) != 0) && (seg->len == 0);\n  /* we want to send one seqno: either FIN or data (no options) */\n  len = is_fin ? 0 : 1;\n\n  p = tcp_output_alloc_header(pcb, 0, len, seg->tcphdr->seqno);\n  if (p == NULL) {\n    LWIP_DEBUGF(TCP_DEBUG, (\"tcp_zero_window_probe: no memory for pbuf\\n\"));\n    return ERR_MEM;\n  }\n  tcphdr = (struct tcp_hdr *)p->payload;\n\n  if (is_fin) {\n    /* FIN segment, no data */\n    TCPH_FLAGS_SET(tcphdr, TCP_ACK | TCP_FIN);\n  } else {\n    /* Data segment, copy in one byte from the head of the unacked queue */\n    char *d = ((char *)p->payload + TCP_HLEN);\n    /* Depending on whether the segment has already been sent (unacked) or not\n       (unsent), seg->p->payload points to the IP header or TCP header.\n       Ensure we copy the first TCP data byte: */\n    pbuf_copy_partial(seg->p, d, 1, seg->p->tot_len - seg->len);\n  }\n\n  /* The byte may be acknowledged without the window being opened. */\n  snd_nxt = lwip_ntohl(seg->tcphdr->seqno) + 1;\n  if (TCP_SEQ_LT(pcb->snd_nxt, snd_nxt)) {\n    pcb->snd_nxt = snd_nxt;\n  }\n\n  netif = ip_route(&pcb->local_ip, &pcb->remote_ip);\n  if (netif == NULL) {\n    err = ERR_RTE;\n  } else {\n#if CHECKSUM_GEN_TCP\n    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_TCP) {\n      tcphdr->chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,\n        &pcb->local_ip, &pcb->remote_ip);\n    }\n#endif\n    TCP_STATS_INC(tcp.xmit);\n\n    /* Send output to IP */\n    NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));\n    err = ip_output_if(p, &pcb->local_ip, &pcb->remote_ip, pcb->ttl,\n      0, IP_PROTO_TCP, netif);\n    NETIF_SET_HWADDRHINT(netif, NULL);\n  }\n\n  pbuf_free(p);\n\n  LWIP_DEBUGF(TCP_DEBUG, (\"tcp_zero_window_probe: seqno %\"U32_F\n                          \" ackno %\"U32_F\" err %d.\\n\",\n                          pcb->snd_nxt - 1, pcb->rcv_nxt, (int)err));\n  return err;\n}\n#endif /* LWIP_TCP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/timeouts.c",
    "content": "/**\n * @file\n * Stack-internal timers implementation.\n * This file includes timer callbacks for stack-internal timers as well as\n * functions to set up or stop timers and check for expired timers.\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *         Simon Goldschmidt\n *\n */\n\n#include \"lwip/opt.h\"\n\n#include \"lwip/timeouts.h\"\n#include \"lwip/priv/tcp_priv.h\"\n\n#include \"lwip/def.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n\n#include \"lwip/ip4_frag.h\"\n#include \"lwip/etharp.h\"\n#include \"lwip/dhcp.h\"\n#include \"lwip/autoip.h\"\n#include \"lwip/igmp.h\"\n#include \"lwip/dns.h\"\n#include \"lwip/nd6.h\"\n#include \"lwip/ip6_frag.h\"\n#include \"lwip/mld6.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/pbuf.h\"\n\n#if LWIP_DEBUG_TIMERNAMES\n#define HANDLER(x) x, #x\n#else /* LWIP_DEBUG_TIMERNAMES */\n#define HANDLER(x) x\n#endif /* LWIP_DEBUG_TIMERNAMES */\n\n/** This array contains all stack-internal cyclic timers. To get the number of\n * timers, use LWIP_ARRAYSIZE() */\nconst struct lwip_cyclic_timer lwip_cyclic_timers[] = {\n#if LWIP_TCP\n  /* The TCP timer is a special case: it does not have to run always and\n     is triggered to start from TCP using tcp_timer_needed() */\n  {TCP_TMR_INTERVAL, HANDLER(tcp_tmr)},\n#endif /* LWIP_TCP */\n#if LWIP_IPV4\n#if IP_REASSEMBLY\n  {IP_TMR_INTERVAL, HANDLER(ip_reass_tmr)},\n#endif /* IP_REASSEMBLY */\n#if LWIP_ARP\n  {ARP_TMR_INTERVAL, HANDLER(etharp_tmr)},\n#endif /* LWIP_ARP */\n#if LWIP_DHCP\n  {DHCP_COARSE_TIMER_MSECS, HANDLER(dhcp_coarse_tmr)},\n  {DHCP_FINE_TIMER_MSECS, HANDLER(dhcp_fine_tmr)},\n#endif /* LWIP_DHCP */\n#if LWIP_AUTOIP\n  {AUTOIP_TMR_INTERVAL, HANDLER(autoip_tmr)},\n#endif /* LWIP_AUTOIP */\n#if LWIP_IGMP\n  {IGMP_TMR_INTERVAL, HANDLER(igmp_tmr)},\n#endif /* LWIP_IGMP */\n#endif /* LWIP_IPV4 */\n#if LWIP_DNS\n  {DNS_TMR_INTERVAL, HANDLER(dns_tmr)},\n#endif /* LWIP_DNS */\n#if LWIP_IPV6\n  {ND6_TMR_INTERVAL, HANDLER(nd6_tmr)},\n#if LWIP_IPV6_REASS\n  {IP6_REASS_TMR_INTERVAL, HANDLER(ip6_reass_tmr)},\n#endif /* LWIP_IPV6_REASS */\n#if LWIP_IPV6_MLD\n  {MLD6_TMR_INTERVAL, HANDLER(mld6_tmr)},\n#endif /* LWIP_IPV6_MLD */\n#endif /* LWIP_IPV6 */\n};\n\n#if LWIP_TIMERS && !LWIP_TIMERS_CUSTOM\n\n/** The one and only timeout list */\nstatic struct sys_timeo *next_timeout;\nstatic u32_t timeouts_last_time;\n\n#if LWIP_TCP\n/** global variable that shows if the tcp timer is currently scheduled or not */\nstatic int tcpip_tcp_timer_active;\n\n/**\n * Timer callback function that calls tcp_tmr() and reschedules itself.\n *\n * @param arg unused argument\n */\nstatic void\ntcpip_tcp_timer(void *arg)\n{\n  LWIP_UNUSED_ARG(arg);\n\n  /* call TCP timer handler */\n  tcp_tmr();\n  /* timer still needed? */\n  if (tcp_active_pcbs || tcp_tw_pcbs) {\n    /* restart timer */\n    sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);\n  } else {\n    /* disable timer */\n    tcpip_tcp_timer_active = 0;\n  }\n}\n\n/**\n * Called from TCP_REG when registering a new PCB:\n * the reason is to have the TCP timer only running when\n * there are active (or time-wait) PCBs.\n */\nvoid\ntcp_timer_needed(void)\n{\n  /* timer is off but needed again? */\n  if (!tcpip_tcp_timer_active && (tcp_active_pcbs || tcp_tw_pcbs)) {\n    /* enable and start timer */\n    tcpip_tcp_timer_active = 1;\n    sys_timeout(TCP_TMR_INTERVAL, tcpip_tcp_timer, NULL);\n  }\n}\n#endif /* LWIP_TCP */\n\n/**\n * Timer callback function that calls mld6_tmr() and reschedules itself.\n *\n * @param arg unused argument\n */\nstatic void\ncyclic_timer(void *arg)\n{\n  const struct lwip_cyclic_timer* cyclic = (const struct lwip_cyclic_timer*)arg;\n#if LWIP_DEBUG_TIMERNAMES\n  LWIP_DEBUGF(TIMERS_DEBUG, (\"tcpip: %s()\\n\", cyclic->handler_name));\n#endif\n  cyclic->handler();\n  sys_timeout(cyclic->interval_ms, cyclic_timer, arg);\n}\n\n/** Initialize this module */\nvoid sys_timeouts_init(void)\n{\n  size_t i;\n  /* tcp_tmr() at index 0 is started on demand */\n  for (i = (LWIP_TCP ? 1 : 0); i < LWIP_ARRAYSIZE(lwip_cyclic_timers); i++) {\n    /* we have to cast via size_t to get rid of const warning\n      (this is OK as cyclic_timer() casts back to const* */\n    sys_timeout(lwip_cyclic_timers[i].interval_ms, cyclic_timer, LWIP_CONST_CAST(void*, &lwip_cyclic_timers[i]));\n  }\n\n  /* Initialise timestamp for sys_check_timeouts */\n  timeouts_last_time = sys_now();\n}\n\n/**\n * Create a one-shot timer (aka timeout). Timeouts are processed in the\n * following cases:\n * - while waiting for a message using sys_timeouts_mbox_fetch()\n * - by calling sys_check_timeouts() (NO_SYS==1 only)\n *\n * @param msecs time in milliseconds after that the timer should expire\n * @param handler callback function to call when msecs have elapsed\n * @param arg argument to pass to the callback function\n */\n#if LWIP_DEBUG_TIMERNAMES\nvoid\nsys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name)\n#else /* LWIP_DEBUG_TIMERNAMES */\nvoid\nsys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg)\n#endif /* LWIP_DEBUG_TIMERNAMES */\n{\n  struct sys_timeo *timeout, *t;\n  u32_t now, diff;\n\n  timeout = (struct sys_timeo *)memp_malloc(MEMP_SYS_TIMEOUT);\n  if (timeout == NULL) {\n    LWIP_ASSERT(\"sys_timeout: timeout != NULL, pool MEMP_SYS_TIMEOUT is empty\", timeout != NULL);\n    return;\n  }\n\n  now = sys_now();\n  if (next_timeout == NULL) {\n    diff = 0;\n    timeouts_last_time = now;\n  } else {\n    diff = now - timeouts_last_time;\n  }\n\n  timeout->next = NULL;\n  timeout->h = handler;\n  timeout->arg = arg;\n  timeout->time = msecs + diff;\n#if LWIP_DEBUG_TIMERNAMES\n  timeout->handler_name = handler_name;\n  LWIP_DEBUGF(TIMERS_DEBUG, (\"sys_timeout: %p msecs=%\"U32_F\" handler=%s arg=%p\\n\",\n    (void *)timeout, msecs, handler_name, (void *)arg));\n#endif /* LWIP_DEBUG_TIMERNAMES */\n\n  if (next_timeout == NULL) {\n    next_timeout = timeout;\n    return;\n  }\n\n  if (next_timeout->time > msecs) {\n    next_timeout->time -= msecs;\n    timeout->next = next_timeout;\n    next_timeout = timeout;\n  } else {\n    for (t = next_timeout; t != NULL; t = t->next) {\n      timeout->time -= t->time;\n      if (t->next == NULL || t->next->time > timeout->time || t== t->next) {\n        if (t->next != NULL) {\n          t->next->time -= timeout->time;\n        } else if (timeout->time > msecs) {\n          /* If this is the case, 'timeouts_last_time' and 'now' differs too much.\n             This can be due to sys_check_timeouts() not being called at the right\n             times, but also when stopping in a breakpoint. Anyway, let's assume\n             this is not wanted, so add the first timer's time instead of 'diff' */\n          timeout->time = msecs + next_timeout->time;\n        }\n        timeout->next = t->next;\n        t->next = timeout;\n        break;\n      }\n    }\n  }\n}\n\n/**\n * Go through timeout list (for this task only) and remove the first matching\n * entry (subsequent entries remain untouched), even though the timeout has not\n * triggered yet.\n *\n * @param handler callback function that would be called by the timeout\n * @param arg callback argument that would be passed to handler\n*/\nvoid\nsys_untimeout(sys_timeout_handler handler, void *arg)\n{\n  struct sys_timeo *prev_t, *t;\n\n  if (next_timeout == NULL) {\n    return;\n  }\n\n  for (t = next_timeout, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {\n    if ((t->h == handler) && (t->arg == arg)) {\n      /* We have a match */\n      /* Unlink from previous in list */\n      if (prev_t == NULL) {\n        next_timeout = t->next;\n      } else {\n        prev_t->next = t->next;\n      }\n      /* If not the last one, add time of this one back to next */\n      if (t->next != NULL) {\n        t->next->time += t->time;\n      }\n      memp_free(MEMP_SYS_TIMEOUT, t);\n      return;\n    }\n  }\n  return;\n}\n\n/**\n * @ingroup lwip_nosys\n * Handle timeouts for NO_SYS==1 (i.e. without using\n * tcpip_thread/sys_timeouts_mbox_fetch(). Uses sys_now() to call timeout\n * handler functions when timeouts expire.\n *\n * Must be called periodically from your main loop.\n */\n#if !NO_SYS && !defined __DOXYGEN__\nstatic\n#endif /* !NO_SYS */\nvoid\nsys_check_timeouts(void)\n{\n  if (next_timeout) {\n    struct sys_timeo *tmptimeout;\n    u32_t diff;\n    sys_timeout_handler handler;\n    void *arg;\n    u8_t had_one;\n    u32_t now;\n\n    now = sys_now();\n    /* this cares for wraparounds */\n    diff = now - timeouts_last_time;\n    do {\n      PBUF_CHECK_FREE_OOSEQ();\n      had_one = 0;\n      tmptimeout = next_timeout;\n      if (tmptimeout && (tmptimeout->time <= diff)) {\n        /* timeout has expired */\n        had_one = 1;\n        timeouts_last_time += tmptimeout->time;\n        diff -= tmptimeout->time;\n        next_timeout = tmptimeout->next;\n        handler = tmptimeout->h;\n        arg = tmptimeout->arg;\n#if LWIP_DEBUG_TIMERNAMES\n        if (handler != NULL) {\n          LWIP_DEBUGF(TIMERS_DEBUG, (\"sct calling h=%s arg=%p\\n\",\n            tmptimeout->handler_name, arg));\n        }\n#endif /* LWIP_DEBUG_TIMERNAMES */\n        memp_free(MEMP_SYS_TIMEOUT, tmptimeout);\n        if (handler != NULL) {\n#if !NO_SYS\n          /* For LWIP_TCPIP_CORE_LOCKING, lock the core before calling the\n             timeout handler function. */\n          LOCK_TCPIP_CORE();\n#endif /* !NO_SYS */\n          handler(arg);\n#if !NO_SYS\n          UNLOCK_TCPIP_CORE();\n#endif /* !NO_SYS */\n        }\n        LWIP_TCPIP_THREAD_ALIVE();\n      }\n    /* repeat until all expired timers have been called */\n    } while (had_one);\n  }\n}\n\n/** Set back the timestamp of the last call to sys_check_timeouts()\n * This is necessary if sys_check_timeouts() hasn't been called for a long\n * time (e.g. while saving energy) to prevent all timer functions of that\n * period being called.\n */\nvoid\nsys_restart_timeouts(void)\n{\n  timeouts_last_time = sys_now();\n}\n\n/** Return the time left before the next timeout is due. If no timeouts are\n * enqueued, returns 0xffffffff\n */\n#if !NO_SYS\nstatic\n#endif /* !NO_SYS */\nu32_t\nsys_timeouts_sleeptime(void)\n{\n  u32_t diff;\n  if (next_timeout == NULL) {\n    return 0xffffffff;\n  }\n  diff = sys_now() - timeouts_last_time;\n  if (diff > next_timeout->time) {\n    return 0;\n  } else {\n    return next_timeout->time - diff;\n  }\n}\n\n#if !NO_SYS\n\n/**\n * Wait (forever) for a message to arrive in an mbox.\n * While waiting, timeouts are processed.\n *\n * @param mbox the mbox to fetch the message from\n * @param msg the place to store the message\n */\nvoid\nsys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg)\n{\n  u32_t sleeptime;\n\nagain:\n  if (!next_timeout) {\n    sys_arch_mbox_fetch(mbox, msg, 0);\n    return;\n  }\n\n  sleeptime = sys_timeouts_sleeptime();\n  if (sleeptime == 0 || sys_arch_mbox_fetch(mbox, msg, sleeptime) == SYS_ARCH_TIMEOUT) {\n    /* If a SYS_ARCH_TIMEOUT value is returned, a timeout occurred\n       before a message could be fetched. */\n    sys_check_timeouts();\n    /* We try again to fetch a message from the mbox. */\n    goto again;\n  }\n}\n\n#endif /* NO_SYS */\n\n#else /* LWIP_TIMERS && !LWIP_TIMERS_CUSTOM */\n/* Satisfy the TCP code which calls this function */\nvoid\ntcp_timer_needed(void)\n{\n}\n#endif /* LWIP_TIMERS && !LWIP_TIMERS_CUSTOM */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/core/udp.c",
    "content": "/**\n * @file\n * User Datagram Protocol module\\n\n * The code for the User Datagram Protocol UDP & UDPLite (RFC 3828).\\n\n * See also @ref udp_raw\n * \n * @defgroup udp_raw UDP\n * @ingroup callbackstyle_api\n * User Datagram Protocol module\\n\n * @see @ref raw_api and @ref netconn\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n/* @todo Check the use of '(struct udp_pcb).chksum_len_rx'!\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/udp.h\"\n#include \"lwip/def.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/icmp.h\"\n#include \"lwip/icmp6.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/snmp.h\"\n#include \"lwip/dhcp.h\"\n\n#include <string.h>\n\n#ifndef UDP_LOCAL_PORT_RANGE_START\n/* From http://www.iana.org/assignments/port-numbers:\n   \"The Dynamic and/or Private Ports are those from 49152 through 65535\" */\n#define UDP_LOCAL_PORT_RANGE_START  0xc000\n#define UDP_LOCAL_PORT_RANGE_END    0xffff\n#define UDP_ENSURE_LOCAL_PORT_RANGE(port) ((u16_t)(((port) & ~UDP_LOCAL_PORT_RANGE_START) + UDP_LOCAL_PORT_RANGE_START))\n#endif\n\n/* last local UDP port */\nstatic u16_t udp_port = UDP_LOCAL_PORT_RANGE_START;\n\n/* The list of UDP PCBs */\n/* exported in udp.h (was static) */\nstruct udp_pcb *udp_pcbs;\n\n/**\n * Initialize this module.\n */\nvoid\nudp_init(void)\n{\n#if LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND)\n  udp_port = UDP_ENSURE_LOCAL_PORT_RANGE(LWIP_RAND());\n#endif /* LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS && defined(LWIP_RAND) */\n}\n\n/**\n * Allocate a new local UDP port.\n *\n * @return a new (free) local UDP port number\n */\nstatic u16_t\nudp_new_port(void)\n{\n  u16_t n = 0;\n  struct udp_pcb *pcb;\n\nagain:\n  if (udp_port++ == UDP_LOCAL_PORT_RANGE_END) {\n    udp_port = UDP_LOCAL_PORT_RANGE_START;\n  }\n  /* Check all PCBs. */\n  for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {\n    if (pcb->local_port == udp_port) {\n      if (++n > (UDP_LOCAL_PORT_RANGE_END - UDP_LOCAL_PORT_RANGE_START)) {\n        return 0;\n      }\n      goto again;\n    }\n  }\n  return udp_port;\n}\n\n/** Common code to see if the current input packet matches the pcb\n * (current input packet is accessed via ip(4/6)_current_* macros)\n *\n * @param pcb pcb to check\n * @param inp network interface on which the datagram was received (only used for IPv4)\n * @param broadcast 1 if his is an IPv4 broadcast (global or subnet-only), 0 otherwise (only used for IPv4)\n * @return 1 on match, 0 otherwise\n */\nstatic u8_t\nudp_input_local_match(struct udp_pcb *pcb, struct netif *inp, u8_t broadcast)\n{\n  LWIP_UNUSED_ARG(inp);       /* in IPv6 only case */\n  LWIP_UNUSED_ARG(broadcast); /* in IPv6 only case */\n\n  /* Dual-stack: PCBs listening to any IP type also listen to any IP address */\n  if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {\n#if LWIP_IPV4 && IP_SOF_BROADCAST_RECV\n    if ((broadcast != 0) && !ip_get_option(pcb, SOF_BROADCAST)) {\n      return 0;\n    }\n#endif /* LWIP_IPV4 && IP_SOF_BROADCAST_RECV */\n    return 1;\n  }\n\n  /* Only need to check PCB if incoming IP version matches PCB IP version */\n  if (IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ip_current_dest_addr())) {\n#if LWIP_IPV4\n    /* Special case: IPv4 broadcast: all or broadcasts in my subnet\n     * Note: broadcast variable can only be 1 if it is an IPv4 broadcast */\n    if (broadcast != 0) {\n#if IP_SOF_BROADCAST_RECV\n      if (ip_get_option(pcb, SOF_BROADCAST))\n#endif /* IP_SOF_BROADCAST_RECV */\n      {\n        if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||\n          ((ip4_current_dest_addr()->addr == IPADDR_BROADCAST)) ||\n           ip4_addr_netcmp(ip_2_ip4(&pcb->local_ip), ip4_current_dest_addr(), netif_ip4_netmask(inp))) {\n          return 1;\n        }\n      }\n    } else\n#endif /* LWIP_IPV4 */\n    /* Handle IPv4 and IPv6: all or exact match */\n    if (ip_addr_isany(&pcb->local_ip) || ip_addr_cmp(&pcb->local_ip, ip_current_dest_addr())) {\n      return 1;\n    }\n  }\n\n  return 0;\n}\n\n/**\n * Process an incoming UDP datagram.\n *\n * Given an incoming UDP datagram (as a chain of pbufs) this function\n * finds a corresponding UDP PCB and hands over the pbuf to the pcbs\n * recv function. If no pcb is found or the datagram is incorrect, the\n * pbuf is freed.\n *\n * @param p pbuf to be demultiplexed to a UDP PCB (p->payload pointing to the UDP header)\n * @param inp network interface on which the datagram was received.\n *\n */\nvoid\nudp_input(struct pbuf *p, struct netif *inp)\n{\n  struct udp_hdr *udphdr;\n  struct udp_pcb *pcb, *prev;\n  struct udp_pcb *uncon_pcb;\n  u16_t src, dest;\n  u8_t broadcast;\n  u8_t for_us = 0;\n\n  LWIP_UNUSED_ARG(inp);\n\n  PERF_START;\n\n  UDP_STATS_INC(udp.recv);\n\n  /* Check minimum length (UDP header) */\n  if (p->len < UDP_HLEN) {\n    /* drop short packets */\n    LWIP_DEBUGF(UDP_DEBUG,\n                (\"udp_input: short UDP datagram (%\"U16_F\" bytes) discarded\\n\", p->tot_len));\n    UDP_STATS_INC(udp.lenerr);\n    UDP_STATS_INC(udp.drop);\n    MIB2_STATS_INC(mib2.udpinerrors);\n    pbuf_free(p);\n    goto end;\n  }\n\n  udphdr = (struct udp_hdr *)p->payload;\n\n  /* is broadcast packet ? */\n  broadcast = ip_addr_isbroadcast(ip_current_dest_addr(), ip_current_netif());\n\n  LWIP_DEBUGF(UDP_DEBUG, (\"udp_input: received datagram of length %\"U16_F\"\\n\", p->tot_len));\n\n  /* convert src and dest ports to host byte order */\n  src = lwip_ntohs(udphdr->src);\n  dest = lwip_ntohs(udphdr->dest);\n\n  udp_debug_print(udphdr);\n\n  /* print the UDP source and destination */\n  LWIP_DEBUGF(UDP_DEBUG, (\"udp (\"));\n  ip_addr_debug_print(UDP_DEBUG, ip_current_dest_addr());\n  LWIP_DEBUGF(UDP_DEBUG, (\", %\"U16_F\") <-- (\", lwip_ntohs(udphdr->dest)));\n  ip_addr_debug_print(UDP_DEBUG, ip_current_src_addr());\n  LWIP_DEBUGF(UDP_DEBUG, (\", %\"U16_F\")\\n\", lwip_ntohs(udphdr->src)));\n\n  pcb = NULL;\n  prev = NULL;\n  uncon_pcb = NULL;\n  /* Iterate through the UDP pcb list for a matching pcb.\n   * 'Perfect match' pcbs (connected to the remote port & ip address) are\n   * preferred. If no perfect match is found, the first unconnected pcb that\n   * matches the local port and ip address gets the datagram. */\n  for (pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {\n    /* print the PCB local and remote address */\n    LWIP_DEBUGF(UDP_DEBUG, (\"pcb (\"));\n    ip_addr_debug_print(UDP_DEBUG, &pcb->local_ip);\n    LWIP_DEBUGF(UDP_DEBUG, (\", %\"U16_F\") <-- (\", pcb->local_port));\n    ip_addr_debug_print(UDP_DEBUG, &pcb->remote_ip);\n    LWIP_DEBUGF(UDP_DEBUG, (\", %\"U16_F\")\\n\", pcb->remote_port));\n\n    /* compare PCB local addr+port to UDP destination addr+port */\n    if ((pcb->local_port == dest) &&\n        (udp_input_local_match(pcb, inp, broadcast) != 0)) {\n      if (((pcb->flags & UDP_FLAGS_CONNECTED) == 0) &&\n          ((uncon_pcb == NULL)\n#if SO_REUSE\n          /* prefer specific IPs over cath-all */\n          || !ip_addr_isany(&pcb->local_ip)\n#endif /* SO_REUSE */\n          )) {\n        /* the first unconnected matching PCB */\n        uncon_pcb = pcb;\n      }\n\n      /* compare PCB remote addr+port to UDP source addr+port */\n      if ((pcb->remote_port == src) &&\n          (ip_addr_isany_val(pcb->remote_ip) ||\n          ip_addr_cmp(&pcb->remote_ip, ip_current_src_addr()))) {\n        /* the first fully matching PCB */\n        if (prev != NULL) {\n          /* move the pcb to the front of udp_pcbs so that is\n             found faster next time */\n          prev->next = pcb->next;\n          pcb->next = udp_pcbs;\n          udp_pcbs = pcb;\n        } else {\n          UDP_STATS_INC(udp.cachehit);\n        }\n        break;\n      }\n    }\n\n    prev = pcb;\n  }\n  /* no fully matching pcb found? then look for an unconnected pcb */\n  if (pcb == NULL) {\n    pcb = uncon_pcb;\n  }\n\n  /* Check checksum if this is a match or if it was directed at us. */\n  if (pcb != NULL) {\n    for_us = 1;\n  } else {\n#if LWIP_IPV6\n    if (ip_current_is_v6()) {\n      for_us = netif_get_ip6_addr_match(inp, ip6_current_dest_addr()) >= 0;\n    }\n#endif /* LWIP_IPV6 */\n#if LWIP_IPV4\n    if (!ip_current_is_v6()) {\n      for_us = ip4_addr_cmp(netif_ip4_addr(inp), ip4_current_dest_addr());\n    }\n#endif /* LWIP_IPV4 */\n  }\n\n  if (for_us) {\n    LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (\"udp_input: calculating checksum\\n\"));\n#if CHECKSUM_CHECK_UDP\n    IF__NETIF_CHECKSUM_ENABLED(inp, CHECKSUM_CHECK_UDP) {\n#if LWIP_UDPLITE\n      if (ip_current_header_proto() == IP_PROTO_UDPLITE) {\n        /* Do the UDP Lite checksum */\n        u16_t chklen = lwip_ntohs(udphdr->len);\n        if (chklen < sizeof(struct udp_hdr)) {\n          if (chklen == 0) {\n            /* For UDP-Lite, checksum length of 0 means checksum\n               over the complete packet (See RFC 3828 chap. 3.1) */\n            chklen = p->tot_len;\n          } else {\n            /* At least the UDP-Lite header must be covered by the\n               checksum! (Again, see RFC 3828 chap. 3.1) */\n            goto chkerr;\n          }\n        }\n        if (ip_chksum_pseudo_partial(p, IP_PROTO_UDPLITE,\n                     p->tot_len, chklen,\n                     ip_current_src_addr(), ip_current_dest_addr()) != 0) {\n          goto chkerr;\n        }\n      } else\n#endif /* LWIP_UDPLITE */\n      {\n        if (udphdr->chksum != 0) {\n          if (ip_chksum_pseudo(p, IP_PROTO_UDP, p->tot_len,\n                               ip_current_src_addr(),\n                               ip_current_dest_addr()) != 0) {\n            goto chkerr;\n          }\n        }\n      }\n    }\n#endif /* CHECKSUM_CHECK_UDP */\n    if (pbuf_header(p, -UDP_HLEN)) {\n      /* Can we cope with this failing? Just assert for now */\n      LWIP_ASSERT(\"pbuf_header failed\\n\", 0);\n      UDP_STATS_INC(udp.drop);\n      MIB2_STATS_INC(mib2.udpinerrors);\n      pbuf_free(p);\n      goto end;\n    }\n\n    if (pcb != NULL) {\n      MIB2_STATS_INC(mib2.udpindatagrams);\n#if SO_REUSE && SO_REUSE_RXTOALL\n      if (ip_get_option(pcb, SOF_REUSEADDR) &&\n          (broadcast || ip_addr_ismulticast(ip_current_dest_addr()))) {\n        /* pass broadcast- or multicast packets to all multicast pcbs\n           if SOF_REUSEADDR is set on the first match */\n        struct udp_pcb *mpcb;\n        u8_t p_header_changed = 0;\n        s16_t hdrs_len = (s16_t)(ip_current_header_tot_len() + UDP_HLEN);\n        for (mpcb = udp_pcbs; mpcb != NULL; mpcb = mpcb->next) {\n          if (mpcb != pcb) {\n            /* compare PCB local addr+port to UDP destination addr+port */\n            if ((mpcb->local_port == dest) &&\n                (udp_input_local_match(mpcb, inp, broadcast) != 0)) {\n              /* pass a copy of the packet to all local matches */\n              if (mpcb->recv != NULL) {\n                struct pbuf *q;\n                /* for that, move payload to IP header again */\n                if (p_header_changed == 0) {\n                  pbuf_header_force(p, hdrs_len);\n                  p_header_changed = 1;\n                }\n                q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);\n                if (q != NULL) {\n                  err_t err = pbuf_copy(q, p);\n                  if (err == ERR_OK) {\n                    /* move payload to UDP data */\n                    pbuf_header(q, -hdrs_len);\n                    mpcb->recv(mpcb->recv_arg, mpcb, q, ip_current_src_addr(), src);\n                  }\n                }\n              }\n            }\n          }\n        }\n        if (p_header_changed) {\n          /* and move payload to UDP data again */\n          pbuf_header(p, -hdrs_len);\n        }\n      }\n#endif /* SO_REUSE && SO_REUSE_RXTOALL */\n      /* callback */\n      if (pcb->recv != NULL) {\n        /* now the recv function is responsible for freeing p */\n        pcb->recv(pcb->recv_arg, pcb, p, ip_current_src_addr(), src);\n      } else {\n        /* no recv function registered? then we have to free the pbuf! */\n        pbuf_free(p);\n        goto end;\n      }\n    } else {\n      LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (\"udp_input: not for us.\\n\"));\n\n#if LWIP_ICMP || LWIP_ICMP6\n      /* No match was found, send ICMP destination port unreachable unless\n         destination address was broadcast/multicast. */\n      if (!broadcast && !ip_addr_ismulticast(ip_current_dest_addr())) {\n        /* move payload pointer back to ip header */\n        pbuf_header_force(p, (s16_t)(ip_current_header_tot_len() + UDP_HLEN));\n        icmp_port_unreach(ip_current_is_v6(), p);\n      }\n#endif /* LWIP_ICMP || LWIP_ICMP6 */\n      UDP_STATS_INC(udp.proterr);\n      UDP_STATS_INC(udp.drop);\n      MIB2_STATS_INC(mib2.udpnoports);\n      pbuf_free(p);\n    }\n  } else {\n    pbuf_free(p);\n  }\nend:\n  PERF_STOP(\"udp_input\");\n  return;\n#if CHECKSUM_CHECK_UDP\nchkerr:\n  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n              (\"udp_input: UDP (or UDP Lite) datagram discarded due to failing checksum\\n\"));\n  UDP_STATS_INC(udp.chkerr);\n  UDP_STATS_INC(udp.drop);\n  MIB2_STATS_INC(mib2.udpinerrors);\n  pbuf_free(p);\n  PERF_STOP(\"udp_input\");\n#endif /* CHECKSUM_CHECK_UDP */\n}\n\n/**\n * @ingroup udp_raw\n * Send data using UDP.\n *\n * @param pcb UDP PCB used to send the data.\n * @param p chain of pbuf's to be sent.\n *\n * The datagram will be sent to the current remote_ip & remote_port\n * stored in pcb. If the pcb is not bound to a port, it will\n * automatically be bound to a random port.\n *\n * @return lwIP error code.\n * - ERR_OK. Successful. No error occurred.\n * - ERR_MEM. Out of memory.\n * - ERR_RTE. Could not find route to destination address.\n * - ERR_VAL. No PCB or PCB is dual-stack\n * - More errors could be returned by lower protocol layers.\n *\n * @see udp_disconnect() udp_sendto()\n */\nerr_t\nudp_send(struct udp_pcb *pcb, struct pbuf *p)\n{\n  if ((pcb == NULL) || IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) {\n    return ERR_VAL;\n  }\n\n  /* send to the packet using remote ip and port stored in the pcb */\n  return udp_sendto(pcb, p, &pcb->remote_ip, pcb->remote_port);\n}\n\n#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP\n/** @ingroup udp_raw\n * Same as udp_send() but with checksum\n */\nerr_t\nudp_send_chksum(struct udp_pcb *pcb, struct pbuf *p,\n                u8_t have_chksum, u16_t chksum)\n{\n  if ((pcb == NULL) || IP_IS_ANY_TYPE_VAL(pcb->remote_ip)) {\n    return ERR_VAL;\n  }\n\n  /* send to the packet using remote ip and port stored in the pcb */\n  return udp_sendto_chksum(pcb, p, &pcb->remote_ip, pcb->remote_port,\n    have_chksum, chksum);\n}\n#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */\n\n/**\n * @ingroup udp_raw\n * Send data to a specified address using UDP.\n *\n * @param pcb UDP PCB used to send the data.\n * @param p chain of pbuf's to be sent.\n * @param dst_ip Destination IP address.\n * @param dst_port Destination UDP port.\n *\n * dst_ip & dst_port are expected to be in the same byte order as in the pcb.\n *\n * If the PCB already has a remote address association, it will\n * be restored after the data is sent.\n *\n * @return lwIP error code (@see udp_send for possible error codes)\n *\n * @see udp_disconnect() udp_send()\n */\nerr_t\nudp_sendto(struct udp_pcb *pcb, struct pbuf *p,\n  const ip_addr_t *dst_ip, u16_t dst_port)\n{\n#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP\n  return udp_sendto_chksum(pcb, p, dst_ip, dst_port, 0, 0);\n}\n\n/** @ingroup udp_raw\n * Same as udp_sendto(), but with checksum */\nerr_t\nudp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip,\n                  u16_t dst_port, u8_t have_chksum, u16_t chksum)\n{\n#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */\n  struct netif *netif;\n  const ip_addr_t *dst_ip_route = dst_ip;\n\n  if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {\n    return ERR_VAL;\n  }\n\n  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (\"udp_send\\n\"));\n\n#if LWIP_IPV6 || (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS)\n  if (ip_addr_ismulticast(dst_ip_route)) {\n#if LWIP_IPV6\n    if (IP_IS_V6(dst_ip)) {\n      /* For multicast, find a netif based on source address. */\n      dst_ip_route = &pcb->local_ip;\n    } else\n#endif /* LWIP_IPV6 */\n    {\n#if LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS\n      /* IPv4 does not use source-based routing by default, so we use an\n         administratively selected interface for multicast by default.\n         However, this can be overridden by setting an interface address\n         in pcb->multicast_ip that is used for routing. */\n      if (!ip_addr_isany_val(pcb->multicast_ip) &&\n          !ip4_addr_cmp(ip_2_ip4(&pcb->multicast_ip), IP4_ADDR_BROADCAST)) {\n        dst_ip_route = &pcb->multicast_ip;\n      }\n#endif /* LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS */\n    }\n  }\n#endif /* LWIP_IPV6 || (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) */\n\n  /* find the outgoing network interface for this packet */\n  if(IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {\n    /* Don't call ip_route() with IP_ANY_TYPE */\n    netif = ip_route(IP46_ADDR_ANY(IP_GET_TYPE(dst_ip_route)), dst_ip_route);\n  } else {\n    netif = ip_route(&pcb->local_ip, dst_ip_route);\n  }\n\n  /* no outgoing network interface could be found? */\n  if (netif == NULL) {\n    LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, (\"udp_send: No route to \"));\n    ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS, dst_ip);\n    LWIP_DEBUGF(UDP_DEBUG, (\"\\n\"));\n    UDP_STATS_INC(udp.rterr);\n    return ERR_RTE;\n  }\n#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP\n  return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum);\n#else /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */\n  return udp_sendto_if(pcb, p, dst_ip, dst_port, netif);\n#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */\n}\n\n/**\n * @ingroup udp_raw\n * Send data to a specified address using UDP.\n * The netif used for sending can be specified.\n *\n * This function exists mainly for DHCP, to be able to send UDP packets\n * on a netif that is still down.\n *\n * @param pcb UDP PCB used to send the data.\n * @param p chain of pbuf's to be sent.\n * @param dst_ip Destination IP address.\n * @param dst_port Destination UDP port.\n * @param netif the netif used for sending.\n *\n * dst_ip & dst_port are expected to be in the same byte order as in the pcb.\n *\n * @return lwIP error code (@see udp_send for possible error codes)\n *\n * @see udp_disconnect() udp_send()\n */\nerr_t\nudp_sendto_if(struct udp_pcb *pcb, struct pbuf *p,\n  const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif)\n{\n#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP\n  return udp_sendto_if_chksum(pcb, p, dst_ip, dst_port, netif, 0, 0);\n}\n\n/** Same as udp_sendto_if(), but with checksum */\nerr_t\nudp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip,\n                     u16_t dst_port, struct netif *netif, u8_t have_chksum,\n                     u16_t chksum)\n{\n#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */\n  const ip_addr_t *src_ip;\n\n  if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {\n    return ERR_VAL;\n  }\n\n  /* PCB local address is IP_ANY_ADDR? */\n#if LWIP_IPV6\n  if (IP_IS_V6(dst_ip)) {\n    if (ip6_addr_isany(ip_2_ip6(&pcb->local_ip))) {\n      src_ip = ip6_select_source_address(netif, ip_2_ip6(dst_ip));\n      if (src_ip == NULL) {\n        /* No suitable source address was found. */\n        return ERR_RTE;\n      }\n    } else {\n      /* use UDP PCB local IPv6 address as source address, if still valid. */\n      if (netif_get_ip6_addr_match(netif, ip_2_ip6(&pcb->local_ip)) < 0) {\n        /* Address isn't valid anymore. */\n        return ERR_RTE;\n      }\n      src_ip = &pcb->local_ip;\n    }\n  }\n#endif /* LWIP_IPV6 */\n#if LWIP_IPV4 && LWIP_IPV6\n  else\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n#if LWIP_IPV4\n  if (ip4_addr_isany(ip_2_ip4(&pcb->local_ip)) ||\n      ip4_addr_ismulticast(ip_2_ip4(&pcb->local_ip))) {\n    /* if the local_ip is any or multicast\n     * use the outgoing network interface IP address as source address */\n    src_ip = netif_ip_addr4(netif);\n  } else {\n    /* check if UDP PCB local IP address is correct\n     * this could be an old address if netif->ip_addr has changed */\n    if (!ip4_addr_cmp(ip_2_ip4(&(pcb->local_ip)), netif_ip4_addr(netif))) {\n      /* local_ip doesn't match, drop the packet */\n      return ERR_RTE;\n    }\n    /* use UDP PCB local IP address as source address */\n    src_ip = &pcb->local_ip;\n  }\n#endif /* LWIP_IPV4 */\n#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP\n  return udp_sendto_if_src_chksum(pcb, p, dst_ip, dst_port, netif, have_chksum, chksum, src_ip);\n#else /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */\n  return udp_sendto_if_src(pcb, p, dst_ip, dst_port, netif, src_ip);\n#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */\n}\n\n/** @ingroup udp_raw\n * Same as @ref udp_sendto_if, but with source address */\nerr_t\nudp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p,\n  const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif, const ip_addr_t *src_ip)\n{\n#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP\n  return udp_sendto_if_src_chksum(pcb, p, dst_ip, dst_port, netif, 0, 0, src_ip);\n}\n\n/** Same as udp_sendto_if_src(), but with checksum */\nerr_t\nudp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *dst_ip,\n                     u16_t dst_port, struct netif *netif, u8_t have_chksum,\n                     u16_t chksum, const ip_addr_t *src_ip)\n{\n#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */\n  struct udp_hdr *udphdr;\n  err_t err;\n  struct pbuf *q; /* q will be sent down the stack */\n  u8_t ip_proto;\n  u8_t ttl;\n\n  if ((pcb == NULL) || (dst_ip == NULL) || !IP_ADDR_PCB_VERSION_MATCH(pcb, src_ip) ||\n      !IP_ADDR_PCB_VERSION_MATCH(pcb, dst_ip)) {\n    return ERR_VAL;\n  }\n\n#if LWIP_IPV4 && IP_SOF_BROADCAST\n  /* broadcast filter? */\n  if (!ip_get_option(pcb, SOF_BROADCAST) &&\n#if LWIP_IPV6\n      IP_IS_V4(dst_ip) &&\n#endif /* LWIP_IPV6 */\n      ip_addr_isbroadcast(dst_ip, netif)) {\n    LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_LEVEL_SERIOUS,\n      (\"udp_sendto_if: SOF_BROADCAST not enabled on pcb %p\\n\", (void *)pcb));\n    return ERR_VAL;\n  }\n#endif /* LWIP_IPV4 && IP_SOF_BROADCAST */\n\n  /* if the PCB is not yet bound to a port, bind it here */\n  if (pcb->local_port == 0) {\n    LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (\"udp_send: not yet bound to a port, binding now\\n\"));\n    err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);\n    if (err != ERR_OK) {\n      LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, (\"udp_send: forced port bind failed\\n\"));\n      return err;\n    }\n  }\n\n  /* not enough space to add an UDP header to first pbuf in given p chain? */\n  if (pbuf_header(p, UDP_HLEN)) {\n    /* allocate header in a separate new pbuf */\n    q = pbuf_alloc(PBUF_IP, UDP_HLEN, PBUF_RAM);\n    /* new header pbuf could not be allocated? */\n    if (q == NULL) {\n      LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS, (\"udp_send: could not allocate header\\n\"));\n      return ERR_MEM;\n    }\n    if (p->tot_len != 0) {\n      /* chain header q in front of given pbuf p (only if p contains data) */\n      pbuf_chain(q, p);\n    }\n    /* first pbuf q points to header pbuf */\n    LWIP_DEBUGF(UDP_DEBUG,\n                (\"udp_send: added header pbuf %p before given pbuf %p\\n\", (void *)q, (void *)p));\n  } else {\n    /* adding space for header within p succeeded */\n    /* first pbuf q equals given pbuf */\n    q = p;\n    LWIP_DEBUGF(UDP_DEBUG, (\"udp_send: added header in given pbuf %p\\n\", (void *)p));\n  }\n  LWIP_ASSERT(\"check that first pbuf can hold struct udp_hdr\",\n              (q->len >= sizeof(struct udp_hdr)));\n  /* q now represents the packet to be sent */\n  udphdr = (struct udp_hdr *)q->payload;\n  udphdr->src = lwip_htons(pcb->local_port);\n  udphdr->dest = lwip_htons(dst_port);\n  /* in UDP, 0 checksum means 'no checksum' */\n  udphdr->chksum = 0x0000;\n\n  /* Multicast Loop? */\n#if (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) || (LWIP_IPV6 && LWIP_IPV6_MLD)\n  if (((pcb->flags & UDP_FLAGS_MULTICAST_LOOP) != 0) && ip_addr_ismulticast(dst_ip)) {\n    q->flags |= PBUF_FLAG_MCASTLOOP;\n  }\n#endif /* (LWIP_IPV4 && LWIP_MULTICAST_TX_OPTIONS) || (LWIP_IPV6 && LWIP_IPV6_MLD) */\n\n  LWIP_DEBUGF(UDP_DEBUG, (\"udp_send: sending datagram of length %\"U16_F\"\\n\", q->tot_len));\n\n#if LWIP_UDPLITE\n  /* UDP Lite protocol? */\n  if (pcb->flags & UDP_FLAGS_UDPLITE) {\n    u16_t chklen, chklen_hdr;\n    LWIP_DEBUGF(UDP_DEBUG, (\"udp_send: UDP LITE packet length %\"U16_F\"\\n\", q->tot_len));\n    /* set UDP message length in UDP header */\n    chklen_hdr = chklen = pcb->chksum_len_tx;\n    if ((chklen < sizeof(struct udp_hdr)) || (chklen > q->tot_len)) {\n      if (chklen != 0) {\n        LWIP_DEBUGF(UDP_DEBUG, (\"udp_send: UDP LITE pcb->chksum_len is illegal: %\"U16_F\"\\n\", chklen));\n      }\n      /* For UDP-Lite, checksum length of 0 means checksum\n         over the complete packet. (See RFC 3828 chap. 3.1)\n         At least the UDP-Lite header must be covered by the\n         checksum, therefore, if chksum_len has an illegal\n         value, we generate the checksum over the complete\n         packet to be safe. */\n      chklen_hdr = 0;\n      chklen = q->tot_len;\n    }\n    udphdr->len = lwip_htons(chklen_hdr);\n    /* calculate checksum */\n#if CHECKSUM_GEN_UDP\n    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_UDP) {\n#if LWIP_CHECKSUM_ON_COPY\n      if (have_chksum) {\n        chklen = UDP_HLEN;\n      }\n#endif /* LWIP_CHECKSUM_ON_COPY */\n      udphdr->chksum = ip_chksum_pseudo_partial(q, IP_PROTO_UDPLITE,\n        q->tot_len, chklen, src_ip, dst_ip);\n#if LWIP_CHECKSUM_ON_COPY\n      if (have_chksum) {\n        u32_t acc;\n        acc = udphdr->chksum + (u16_t)~(chksum);\n        udphdr->chksum = FOLD_U32T(acc);\n      }\n#endif /* LWIP_CHECKSUM_ON_COPY */\n\n      /* chksum zero must become 0xffff, as zero means 'no checksum' */\n      if (udphdr->chksum == 0x0000) {\n        udphdr->chksum = 0xffff;\n      }\n    }\n#endif /* CHECKSUM_GEN_UDP */\n\n    ip_proto = IP_PROTO_UDPLITE;\n  } else\n#endif /* LWIP_UDPLITE */\n  {      /* UDP */\n    LWIP_DEBUGF(UDP_DEBUG, (\"udp_send: UDP packet length %\"U16_F\"\\n\", q->tot_len));\n    udphdr->len = lwip_htons(q->tot_len);\n    /* calculate checksum */\n#if CHECKSUM_GEN_UDP\n    IF__NETIF_CHECKSUM_ENABLED(netif, NETIF_CHECKSUM_GEN_UDP) {\n      /* Checksum is mandatory over IPv6. */\n      if (IP_IS_V6(dst_ip) || (pcb->flags & UDP_FLAGS_NOCHKSUM) == 0) {\n        u16_t udpchksum;\n#if LWIP_CHECKSUM_ON_COPY\n        if (have_chksum) {\n          u32_t acc;\n          udpchksum = ip_chksum_pseudo_partial(q, IP_PROTO_UDP,\n            q->tot_len, UDP_HLEN, src_ip, dst_ip);\n          acc = udpchksum + (u16_t)~(chksum);\n          udpchksum = FOLD_U32T(acc);\n        } else\n#endif /* LWIP_CHECKSUM_ON_COPY */\n        {\n          udpchksum = ip_chksum_pseudo(q, IP_PROTO_UDP, q->tot_len,\n            src_ip, dst_ip);\n        }\n\n        /* chksum zero must become 0xffff, as zero means 'no checksum' */\n        if (udpchksum == 0x0000) {\n          udpchksum = 0xffff;\n        }\n        udphdr->chksum = udpchksum;\n      }\n    }\n#endif /* CHECKSUM_GEN_UDP */\n    ip_proto = IP_PROTO_UDP;\n  }\n\n  /* Determine TTL to use */\n#if LWIP_MULTICAST_TX_OPTIONS\n  ttl = (ip_addr_ismulticast(dst_ip) ? udp_get_multicast_ttl(pcb) : pcb->ttl);\n#else /* LWIP_MULTICAST_TX_OPTIONS */\n  ttl = pcb->ttl;\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n\n  LWIP_DEBUGF(UDP_DEBUG, (\"udp_send: UDP checksum 0x%04\"X16_F\"\\n\", udphdr->chksum));\n  LWIP_DEBUGF(UDP_DEBUG, (\"udp_send: ip_output_if (,,,,0x%02\"X16_F\",)\\n\", (u16_t)ip_proto));\n  /* output to IP */\n  NETIF_SET_HWADDRHINT(netif, &(pcb->addr_hint));\n  err = ip_output_if_src(q, src_ip, dst_ip, ttl, pcb->tos, ip_proto, netif);\n  NETIF_SET_HWADDRHINT(netif, NULL);\n\n  /* @todo: must this be increased even if error occurred? */\n  MIB2_STATS_INC(mib2.udpoutdatagrams);\n\n  /* did we chain a separate header pbuf earlier? */\n  if (q != p) {\n    /* free the header pbuf */\n    pbuf_free(q);\n    q = NULL;\n    /* p is still referenced by the caller, and will live on */\n  }\n\n  UDP_STATS_INC(udp.xmit);\n  return err;\n}\n\n/**\n * @ingroup udp_raw\n * Bind an UDP PCB.\n *\n * @param pcb UDP PCB to be bound with a local address ipaddr and port.\n * @param ipaddr local IP address to bind with. Use IP4_ADDR_ANY to\n * bind to all local interfaces.\n * @param port local UDP port to bind with. Use 0 to automatically bind\n * to a random port between UDP_LOCAL_PORT_RANGE_START and\n * UDP_LOCAL_PORT_RANGE_END.\n *\n * ipaddr & port are expected to be in the same byte order as in the pcb.\n *\n * @return lwIP error code.\n * - ERR_OK. Successful. No error occurred.\n * - ERR_USE. The specified ipaddr and port are already bound to by\n * another UDP PCB.\n *\n * @see udp_disconnect()\n */\nerr_t\nudp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)\n{\n  struct udp_pcb *ipcb;\n  u8_t rebind;\n\n#if LWIP_IPV4\n  /* Don't propagate NULL pointer (IPv4 ANY) to subsequent functions */\n  if (ipaddr == NULL) {\n    ipaddr = IP4_ADDR_ANY;\n  }\n#endif /* LWIP_IPV4 */\n\n  /* still need to check for ipaddr == NULL in IPv6 only case */\n  if ((pcb == NULL) || (ipaddr == NULL)) {\n    return ERR_VAL;\n  }\n\n  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (\"udp_bind(ipaddr = \"));\n  ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE, ipaddr);\n  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE, (\", port = %\"U16_F\")\\n\", port));\n\n  rebind = 0;\n  /* Check for double bind and rebind of the same pcb */\n  for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {\n    /* is this UDP PCB already on active list? */\n    if (pcb == ipcb) {\n      rebind = 1;\n      break;\n    }\n  }\n\n  /* no port specified? */\n  if (port == 0) {\n    port = udp_new_port();\n    if (port == 0) {\n      /* no more ports available in local range */\n      LWIP_DEBUGF(UDP_DEBUG, (\"udp_bind: out of free UDP ports\\n\"));\n      return ERR_USE;\n    }\n  } else {\n    for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {\n      if (pcb != ipcb) {\n      /* By default, we don't allow to bind to a port that any other udp\n         PCB is already bound to, unless *all* PCBs with that port have tha\n         REUSEADDR flag set. */\n#if SO_REUSE\n        if (!ip_get_option(pcb, SOF_REUSEADDR) ||\n            !ip_get_option(ipcb, SOF_REUSEADDR))\n#endif /* SO_REUSE */\n        {\n          /* port matches that of PCB in list and REUSEADDR not set -> reject */\n          if ((ipcb->local_port == port) &&\n              /* IP address matches? */\n              ip_addr_cmp(&ipcb->local_ip, ipaddr)) {\n            /* other PCB already binds to this local IP and port */\n            LWIP_DEBUGF(UDP_DEBUG,\n                        (\"udp_bind: local port %\"U16_F\" already bound by another pcb\\n\", port));\n            return ERR_USE;\n          }\n        }\n      }\n    }\n  }\n\n  ip_addr_set_ipaddr(&pcb->local_ip, ipaddr);\n\n  pcb->local_port = port;\n  mib2_udp_bind(pcb);\n  /* pcb not active yet? */\n  if (rebind == 0) {\n    /* place the PCB on the active list if not already there */\n    pcb->next = udp_pcbs;\n    udp_pcbs = pcb;\n  }\n  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"udp_bind: bound to \"));\n  ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, &pcb->local_ip);\n  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\", port %\"U16_F\")\\n\", pcb->local_port));\n  return ERR_OK;\n}\n\n/**\n * @ingroup udp_raw\n * Connect an UDP PCB.\n *\n * This will associate the UDP PCB with the remote address.\n *\n * @param pcb UDP PCB to be connected with remote address ipaddr and port.\n * @param ipaddr remote IP address to connect with.\n * @param port remote UDP port to connect with.\n *\n * @return lwIP error code\n *\n * ipaddr & port are expected to be in the same byte order as in the pcb.\n *\n * The udp pcb is bound to a random local port if not already bound.\n *\n * @see udp_disconnect()\n */\nerr_t\nudp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port)\n{\n  struct udp_pcb *ipcb;\n\n  if ((pcb == NULL) || (ipaddr == NULL)) {\n    return ERR_VAL;\n  }\n\n  if (pcb->local_port == 0) {\n    err_t err = udp_bind(pcb, &pcb->local_ip, pcb->local_port);\n    if (err != ERR_OK) {\n      return err;\n    }\n  }\n\n  ip_addr_set_ipaddr(&pcb->remote_ip, ipaddr);\n  pcb->remote_port = port;\n  pcb->flags |= UDP_FLAGS_CONNECTED;\n\n  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\"udp_connect: connected to \"));\n  ip_addr_debug_print(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE,\n                      &pcb->remote_ip);\n  LWIP_DEBUGF(UDP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_STATE, (\", port %\"U16_F\")\\n\", pcb->remote_port));\n\n  /* Insert UDP PCB into the list of active UDP PCBs. */\n  for (ipcb = udp_pcbs; ipcb != NULL; ipcb = ipcb->next) {\n    if (pcb == ipcb) {\n      /* already on the list, just return */\n      return ERR_OK;\n    }\n  }\n  /* PCB not yet on the list, add PCB now */\n  pcb->next = udp_pcbs;\n  udp_pcbs = pcb;\n  return ERR_OK;\n}\n\n/**\n * @ingroup udp_raw\n * Disconnect a UDP PCB\n *\n * @param pcb the udp pcb to disconnect.\n */\nvoid\nudp_disconnect(struct udp_pcb *pcb)\n{\n  /* reset remote address association */\n#if LWIP_IPV4 && LWIP_IPV6\n  if (IP_IS_ANY_TYPE_VAL(pcb->local_ip)) {\n    ip_addr_copy(pcb->remote_ip, *IP_ANY_TYPE);\n  } else {\n#endif\n    ip_addr_set_any(IP_IS_V6_VAL(pcb->remote_ip), &pcb->remote_ip);\n#if LWIP_IPV4 && LWIP_IPV6\n  }\n#endif\n  pcb->remote_port = 0;\n  /* mark PCB as unconnected */\n  pcb->flags &= ~UDP_FLAGS_CONNECTED;\n}\n\n/**\n * @ingroup udp_raw\n * Set a receive callback for a UDP PCB\n *\n * This callback will be called when receiving a datagram for the pcb.\n *\n * @param pcb the pcb for which to set the recv callback\n * @param recv function pointer of the callback function\n * @param recv_arg additional argument to pass to the callback function\n */\nvoid\nudp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg)\n{\n  /* remember recv() callback and user data */\n  pcb->recv = recv;\n  pcb->recv_arg = recv_arg;\n}\n\n/**\n * @ingroup udp_raw\n * Remove an UDP PCB.\n *\n * @param pcb UDP PCB to be removed. The PCB is removed from the list of\n * UDP PCB's and the data structure is freed from memory.\n *\n * @see udp_new()\n */\nvoid\nudp_remove(struct udp_pcb *pcb)\n{\n  struct udp_pcb *pcb2;\n\n  mib2_udp_unbind(pcb);\n  /* pcb to be removed is first in list? */\n  if (udp_pcbs == pcb) {\n    /* make list start at 2nd pcb */\n    udp_pcbs = udp_pcbs->next;\n    /* pcb not 1st in list */\n  } else {\n    for (pcb2 = udp_pcbs; pcb2 != NULL; pcb2 = pcb2->next) {\n      /* find pcb in udp_pcbs list */\n      if (pcb2->next != NULL && pcb2->next == pcb) {\n        /* remove pcb from list */\n        pcb2->next = pcb->next;\n        break;\n      }\n    }\n  }\n  memp_free(MEMP_UDP_PCB, pcb);\n}\n\n/**\n * @ingroup udp_raw\n * Create a UDP PCB.\n *\n * @return The UDP PCB which was created. NULL if the PCB data structure\n * could not be allocated.\n *\n * @see udp_remove()\n */\nstruct udp_pcb *\nudp_new(void)\n{\n  struct udp_pcb *pcb;\n  pcb = (struct udp_pcb *)memp_malloc(MEMP_UDP_PCB);\n  /* could allocate UDP PCB? */\n  if (pcb != NULL) {\n    /* UDP Lite: by initializing to all zeroes, chksum_len is set to 0\n     * which means checksum is generated over the whole datagram per default\n     * (recommended as default by RFC 3828). */\n    /* initialize PCB to all zeroes */\n    memset(pcb, 0, sizeof(struct udp_pcb));\n    pcb->ttl = UDP_TTL;\n#if LWIP_MULTICAST_TX_OPTIONS\n    udp_set_multicast_ttl(pcb, UDP_TTL);\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n  }\n  return pcb;\n}\n\n/**\n * @ingroup udp_raw\n * Create a UDP PCB for specific IP type.\n *\n * @param type IP address type, see @ref lwip_ip_addr_type definitions.\n * If you want to listen to IPv4 and IPv6 (dual-stack) packets,\n * supply @ref IPADDR_TYPE_ANY as argument and bind to @ref IP_ANY_TYPE.\n * @return The UDP PCB which was created. NULL if the PCB data structure\n * could not be allocated.\n *\n * @see udp_remove()\n */\nstruct udp_pcb *\nudp_new_ip_type(u8_t type)\n{\n  struct udp_pcb *pcb;\n  pcb = udp_new();\n#if LWIP_IPV4 && LWIP_IPV6\n  if (pcb != NULL) {\n    IP_SET_TYPE_VAL(pcb->local_ip,  type);\n    IP_SET_TYPE_VAL(pcb->remote_ip, type);\n  }\n#else\n  LWIP_UNUSED_ARG(type);\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n  return pcb;\n}\n\n/** This function is called from netif.c when address is changed\n *\n * @param old_addr IP address of the netif before change\n * @param new_addr IP address of the netif after change\n */\nvoid udp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr)\n{\n  struct udp_pcb* upcb;\n\n  if (!ip_addr_isany(old_addr) && !ip_addr_isany(new_addr)) {\n    for (upcb = udp_pcbs; upcb != NULL; upcb = upcb->next) {\n      /* PCB bound to current local interface address? */\n      if (ip_addr_cmp(&upcb->local_ip, old_addr)) {\n        /* The PCB is bound to the old ipaddr and\n         * is set to bound to the new one instead */\n        ip_addr_copy(upcb->local_ip, *new_addr);\n      }\n    }\n  }\n}\n\n#if UDP_DEBUG\n/**\n * Print UDP header information for debug purposes.\n *\n * @param udphdr pointer to the udp header in memory.\n */\nvoid\nudp_debug_print(struct udp_hdr *udphdr)\n{\n  LWIP_DEBUGF(UDP_DEBUG, (\"UDP header:\\n\"));\n  LWIP_DEBUGF(UDP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(UDP_DEBUG, (\"|     %5\"U16_F\"     |     %5\"U16_F\"     | (src port, dest port)\\n\",\n                          lwip_ntohs(udphdr->src), lwip_ntohs(udphdr->dest)));\n  LWIP_DEBUGF(UDP_DEBUG, (\"+-------------------------------+\\n\"));\n  LWIP_DEBUGF(UDP_DEBUG, (\"|     %5\"U16_F\"     |     0x%04\"X16_F\"    | (len, chksum)\\n\",\n                          lwip_ntohs(udphdr->len), lwip_ntohs(udphdr->chksum)));\n  LWIP_DEBUGF(UDP_DEBUG, (\"+-------------------------------+\\n\"));\n}\n#endif /* UDP_DEBUG */\n\n#endif /* LWIP_UDP */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/api.h",
    "content": "/**\n * @file\n * netconn API (to be used from non-TCPIP threads)\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_API_H\n#define LWIP_HDR_API_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_NETCONN || LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */\n/* Note: Netconn API is always available when sockets are enabled -\n * sockets are implemented on top of them */\n\n#include \"lwip/arch.h\"\n#include \"lwip/netbuf.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/err.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Throughout this file, IP addresses and port numbers are expected to be in\n * the same byte order as in the corresponding pcb.\n */\n\n/* Flags for netconn_write (u8_t) */\n#define NETCONN_NOFLAG    0x00\n#define NETCONN_NOCOPY    0x00 /* Only for source code compatibility */\n#define NETCONN_COPY      0x01\n#define NETCONN_MORE      0x02\n#define NETCONN_DONTBLOCK 0x04\n\n/* Flags for struct netconn.flags (u8_t) */\n/** Should this netconn avoid blocking? */\n#define NETCONN_FLAG_NON_BLOCKING             0x02\n/** Was the last connect action a non-blocking one? */\n#define NETCONN_FLAG_IN_NONBLOCKING_CONNECT   0x04\n/** If a nonblocking write has been rejected before, poll_tcp needs to\n    check if the netconn is writable again */\n#define NETCONN_FLAG_CHECK_WRITESPACE         0x10\n#if LWIP_IPV6\n/** If this flag is set then only IPv6 communication is allowed on the\n    netconn. As per RFC#3493 this features defaults to OFF allowing\n    dual-stack usage by default. */\n#define NETCONN_FLAG_IPV6_V6ONLY              0x20\n#endif /* LWIP_IPV6 */\n\n\n/* Helpers to process several netconn_types by the same code */\n#define NETCONNTYPE_GROUP(t)         ((t)&0xF0)\n#define NETCONNTYPE_DATAGRAM(t)      ((t)&0xE0)\n#if LWIP_IPV6\n#define NETCONN_TYPE_IPV6            0x08\n#define NETCONNTYPE_ISIPV6(t)        (((t)&NETCONN_TYPE_IPV6) != 0)\n#define NETCONNTYPE_ISUDPLITE(t)     (((t)&0xF3) == NETCONN_UDPLITE)\n#define NETCONNTYPE_ISUDPNOCHKSUM(t) (((t)&0xF3) == NETCONN_UDPNOCHKSUM)\n#else /* LWIP_IPV6 */\n#define NETCONNTYPE_ISIPV6(t)        (0)\n#define NETCONNTYPE_ISUDPLITE(t)     ((t) == NETCONN_UDPLITE)\n#define NETCONNTYPE_ISUDPNOCHKSUM(t) ((t) == NETCONN_UDPNOCHKSUM)\n#endif /* LWIP_IPV6 */\n\n/** @ingroup netconn_common\n * Protocol family and type of the netconn\n */\nenum netconn_type {\n  NETCONN_INVALID     = 0,\n  /** TCP IPv4 */\n  NETCONN_TCP         = 0x10,\n#if LWIP_IPV6\n  /** TCP IPv6 */\n  NETCONN_TCP_IPV6    = NETCONN_TCP | NETCONN_TYPE_IPV6 /* 0x18 */,\n#endif /* LWIP_IPV6 */\n  /** UDP IPv4 */\n  NETCONN_UDP         = 0x20,\n  /** UDP IPv4 lite */\n  NETCONN_UDPLITE     = 0x21,\n  /** UDP IPv4 no checksum */\n  NETCONN_UDPNOCHKSUM = 0x22,\n\n#if LWIP_IPV6\n  /** UDP IPv6 (dual-stack by default, unless you call @ref netconn_set_ipv6only) */\n  NETCONN_UDP_IPV6         = NETCONN_UDP | NETCONN_TYPE_IPV6 /* 0x28 */,\n  /** UDP IPv6 lite (dual-stack by default, unless you call @ref netconn_set_ipv6only) */\n  NETCONN_UDPLITE_IPV6     = NETCONN_UDPLITE | NETCONN_TYPE_IPV6 /* 0x29 */,\n  /** UDP IPv6 no checksum (dual-stack by default, unless you call @ref netconn_set_ipv6only) */\n  NETCONN_UDPNOCHKSUM_IPV6 = NETCONN_UDPNOCHKSUM | NETCONN_TYPE_IPV6 /* 0x2a */,\n#endif /* LWIP_IPV6 */\n\n  /** Raw connection IPv4 */\n  NETCONN_RAW         = 0x40\n#if LWIP_IPV6\n  /** Raw connection IPv6 (dual-stack by default, unless you call @ref netconn_set_ipv6only) */\n  , NETCONN_RAW_IPV6    = NETCONN_RAW | NETCONN_TYPE_IPV6 /* 0x48 */\n#endif /* LWIP_IPV6 */\n};\n\n/** Current state of the netconn. Non-TCP netconns are always\n * in state NETCONN_NONE! */\nenum netconn_state {\n  NETCONN_NONE,\n  NETCONN_WRITE,\n  NETCONN_LISTEN,\n  NETCONN_CONNECT,\n  NETCONN_CLOSE\n};\n\n/** Used to inform the callback function about changes\n * \n * Event explanation:\n * \n * In the netconn implementation, there are three ways to block a client:\n * \n * - accept mbox (sys_arch_mbox_fetch(&conn->acceptmbox, &accept_ptr, 0); in netconn_accept())\n * - receive mbox (sys_arch_mbox_fetch(&conn->recvmbox, &buf, 0); in netconn_recv_data())\n * - send queue is full (sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0); in lwip_netconn_do_write())\n * \n * The events have to be seen as events signaling the state of these mboxes/semaphores. For non-blocking\n * connections, you need to know in advance whether a call to a netconn function call would block or not,\n * and these events tell you about that.\n * \n * RCVPLUS events say: Safe to perform a potentially blocking call call once more. \n * They are counted in sockets - three RCVPLUS events for accept mbox means you are safe\n * to call netconn_accept 3 times without being blocked.\n * Same thing for receive mbox.\n * \n * RCVMINUS events say: Your call to to a possibly blocking function is \"acknowledged\".\n * Socket implementation decrements the counter.\n * \n * For TX, there is no need to count, its merely a flag. SENDPLUS means you may send something.\n * SENDPLUS occurs when enough data was delivered to peer so netconn_send() can be called again.\n * A SENDMINUS event occurs when the next call to a netconn_send() would be blocking.\n */\nenum netconn_evt {\n  NETCONN_EVT_RCVPLUS,\n  NETCONN_EVT_RCVMINUS,\n  NETCONN_EVT_SENDPLUS,\n  NETCONN_EVT_SENDMINUS,\n  NETCONN_EVT_ERROR\n};\n\n#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)\n/** Used for netconn_join_leave_group() */\nenum netconn_igmp {\n  NETCONN_JOIN,\n  NETCONN_LEAVE\n};\n#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */\n\n#if LWIP_DNS\n/* Used for netconn_gethostbyname_addrtype(), these should match the DNS_ADDRTYPE defines in dns.h */\n#define NETCONN_DNS_DEFAULT   NETCONN_DNS_IPV4_IPV6\n#define NETCONN_DNS_IPV4      0\n#define NETCONN_DNS_IPV6      1\n#define NETCONN_DNS_IPV4_IPV6 2 /* try to resolve IPv4 first, try IPv6 if IPv4 fails only */\n#define NETCONN_DNS_IPV6_IPV4 3 /* try to resolve IPv6 first, try IPv4 if IPv6 fails only */\n#endif /* LWIP_DNS */\n\n/* forward-declare some structs to avoid to include their headers */\nstruct ip_pcb;\nstruct tcp_pcb;\nstruct udp_pcb;\nstruct raw_pcb;\nstruct netconn;\nstruct api_msg;\n\n/** A callback prototype to inform about events for a netconn */\ntypedef void (* netconn_callback)(struct netconn *, enum netconn_evt, u16_t len);\n\n/** A netconn descriptor */\nstruct netconn {\n  /** type of the netconn (TCP, UDP or RAW) */\n  enum netconn_type type;\n  /** current state of the netconn */\n  enum netconn_state state;\n  /** the lwIP internal protocol control block */\n  union {\n    struct ip_pcb  *ip;\n    struct tcp_pcb *tcp;\n    struct udp_pcb *udp;\n    struct raw_pcb *raw;\n  } pcb;\n  /** the last error this netconn had */\n  err_t last_err;\n#if !LWIP_NETCONN_SEM_PER_THREAD\n  /** sem that is used to synchronously execute functions in the core context */\n  sys_sem_t op_completed;\n#endif\n  /** mbox where received packets are stored until they are fetched\n      by the netconn application thread (can grow quite big) */\n  sys_mbox_t recvmbox;\n#if LWIP_TCP\n  /** mbox where new connections are stored until processed\n      by the application thread */\n  sys_mbox_t acceptmbox;\n#endif /* LWIP_TCP */\n  /** only used for socket layer */\n#if LWIP_SOCKET\n  int socket;\n#endif /* LWIP_SOCKET */\n#if LWIP_SO_SNDTIMEO\n  /** timeout to wait for sending data (which means enqueueing data for sending\n      in internal buffers) in milliseconds */\n  s32_t send_timeout;\n#endif /* LWIP_SO_RCVTIMEO */\n#if LWIP_SO_RCVTIMEO\n  /** timeout in milliseconds to wait for new data to be received\n      (or connections to arrive for listening netconns) */\n  int recv_timeout;\n#endif /* LWIP_SO_RCVTIMEO */\n#if LWIP_SO_RCVBUF\n  /** maximum amount of bytes queued in recvmbox\n      not used for TCP: adjust TCP_WND instead! */\n  int recv_bufsize;\n  /** number of bytes currently in recvmbox to be received,\n      tested against recv_bufsize to limit bytes on recvmbox\n      for UDP and RAW, used for FIONREAD */\n  int recv_avail;\n#endif /* LWIP_SO_RCVBUF */\n#if LWIP_SO_LINGER\n   /** values <0 mean linger is disabled, values > 0 are seconds to linger */\n  s16_t linger;\n#endif /* LWIP_SO_LINGER */\n  /** flags holding more netconn-internal state, see NETCONN_FLAG_* defines */\n  u8_t flags;\n#if LWIP_TCP\n  /** TCP: when data passed to netconn_write doesn't fit into the send buffer,\n      this temporarily stores how much is already sent. */\n  size_t write_offset;\n  /** TCP: when data passed to netconn_write doesn't fit into the send buffer,\n      this temporarily stores the message.\n      Also used during connect and close. */\n  struct api_msg *current_msg;\n#endif /* LWIP_TCP */\n  /** A callback function that is informed about events for this netconn */\n  netconn_callback callback;\n};\n\n/** Register an Network connection event */\n#define API_EVENT(c,e,l) if (c->callback) {         \\\n                           (*c->callback)(c, e, l); \\\n                         }\n\n/** Set conn->last_err to err but don't overwrite fatal errors */\n#define NETCONN_SET_SAFE_ERR(conn, err) do { if ((conn) != NULL) { \\\n  SYS_ARCH_DECL_PROTECT(netconn_set_safe_err_lev); \\\n  SYS_ARCH_PROTECT(netconn_set_safe_err_lev); \\\n  if (!ERR_IS_FATAL((conn)->last_err)) { \\\n    (conn)->last_err = err; \\\n  } \\\n  SYS_ARCH_UNPROTECT(netconn_set_safe_err_lev); \\\n}} while(0);\n\n/* Network connection functions: */\n\n/** @ingroup netconn_common\n * Create new netconn connection\n * @param t @ref netconn_type */\n#define netconn_new(t)                  netconn_new_with_proto_and_callback(t, 0, NULL)\n#define netconn_new_with_callback(t, c) netconn_new_with_proto_and_callback(t, 0, c)\nstruct netconn *netconn_new_with_proto_and_callback(enum netconn_type t, u8_t proto,\n                                             netconn_callback callback);\nerr_t   netconn_delete(struct netconn *conn);\n/** Get the type of a netconn (as enum netconn_type). */\n#define netconn_type(conn) (conn->type)\n\nerr_t   netconn_getaddr(struct netconn *conn, ip_addr_t *addr,\n                        u16_t *port, u8_t local);\n/** @ingroup netconn_common */\n#define netconn_peer(c,i,p) netconn_getaddr(c,i,p,0)\n/** @ingroup netconn_common */\n#define netconn_addr(c,i,p) netconn_getaddr(c,i,p,1)\n\nerr_t   netconn_bind(struct netconn *conn, const ip_addr_t *addr, u16_t port);\nerr_t   netconn_connect(struct netconn *conn, const ip_addr_t *addr, u16_t port);\nerr_t   netconn_disconnect (struct netconn *conn);\nerr_t   netconn_listen_with_backlog(struct netconn *conn, u8_t backlog);\n/** @ingroup netconn_tcp */\n#define netconn_listen(conn) netconn_listen_with_backlog(conn, TCP_DEFAULT_LISTEN_BACKLOG)\nerr_t   netconn_accept(struct netconn *conn, struct netconn **new_conn);\nerr_t   netconn_recv(struct netconn *conn, struct netbuf **new_buf);\nerr_t   netconn_recv_tcp_pbuf(struct netconn *conn, struct pbuf **new_buf);\nerr_t   netconn_sendto(struct netconn *conn, struct netbuf *buf,\n                             const ip_addr_t *addr, u16_t port);\nerr_t   netconn_send(struct netconn *conn, struct netbuf *buf);\nerr_t   netconn_write_partly(struct netconn *conn, const void *dataptr, size_t size,\n                             u8_t apiflags, size_t *bytes_written);\n/** @ingroup netconn_tcp */\n#define netconn_write(conn, dataptr, size, apiflags) \\\n          netconn_write_partly(conn, dataptr, size, apiflags, NULL)\nerr_t   netconn_close(struct netconn *conn);\nerr_t   netconn_shutdown(struct netconn *conn, u8_t shut_rx, u8_t shut_tx);\n\n#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)\nerr_t   netconn_join_leave_group(struct netconn *conn, const ip_addr_t *multiaddr,\n                             const ip_addr_t *netif_addr, enum netconn_igmp join_or_leave);\n#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */\n#if LWIP_DNS\n#if LWIP_IPV4 && LWIP_IPV6\nerr_t   netconn_gethostbyname_addrtype(const char *name, ip_addr_t *addr, u8_t dns_addrtype);\n#define netconn_gethostbyname(name, addr) netconn_gethostbyname_addrtype(name, addr, NETCONN_DNS_DEFAULT)\n#else /* LWIP_IPV4 && LWIP_IPV6 */\nerr_t   netconn_gethostbyname(const char *name, ip_addr_t *addr);\n#define netconn_gethostbyname_addrtype(name, addr, dns_addrtype) netconn_gethostbyname(name, addr)\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n#endif /* LWIP_DNS */\n\n#define netconn_err(conn)               ((conn)->last_err)\n#define netconn_recv_bufsize(conn)      ((conn)->recv_bufsize)\n\n/** Set the blocking status of netconn calls (@todo: write/send is missing) */\n#define netconn_set_nonblocking(conn, val)  do { if(val) { \\\n  (conn)->flags |= NETCONN_FLAG_NON_BLOCKING; \\\n} else { \\\n  (conn)->flags &= ~ NETCONN_FLAG_NON_BLOCKING; }} while(0)\n/** Get the blocking status of netconn calls (@todo: write/send is missing) */\n#define netconn_is_nonblocking(conn)        (((conn)->flags & NETCONN_FLAG_NON_BLOCKING) != 0)\n\n#if LWIP_IPV6\n/** @ingroup netconn_common\n * TCP: Set the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY)\n */\n#define netconn_set_ipv6only(conn, val)  do { if(val) { \\\n  (conn)->flags |= NETCONN_FLAG_IPV6_V6ONLY; \\\n} else { \\\n  (conn)->flags &= ~ NETCONN_FLAG_IPV6_V6ONLY; }} while(0)\n/** @ingroup netconn_common\n * TCP: Get the IPv6 ONLY status of netconn calls (see NETCONN_FLAG_IPV6_V6ONLY)\n */\n#define netconn_get_ipv6only(conn)        (((conn)->flags & NETCONN_FLAG_IPV6_V6ONLY) != 0)\n#endif /* LWIP_IPV6 */\n\n#if LWIP_SO_SNDTIMEO\n/** Set the send timeout in milliseconds */\n#define netconn_set_sendtimeout(conn, timeout)      ((conn)->send_timeout = (timeout))\n/** Get the send timeout in milliseconds */\n#define netconn_get_sendtimeout(conn)               ((conn)->send_timeout)\n#endif /* LWIP_SO_SNDTIMEO */\n#if LWIP_SO_RCVTIMEO\n/** Set the receive timeout in milliseconds */\n#define netconn_set_recvtimeout(conn, timeout)      ((conn)->recv_timeout = (timeout))\n/** Get the receive timeout in milliseconds */\n#define netconn_get_recvtimeout(conn)               ((conn)->recv_timeout)\n#endif /* LWIP_SO_RCVTIMEO */\n#if LWIP_SO_RCVBUF\n/** Set the receive buffer in bytes */\n#define netconn_set_recvbufsize(conn, recvbufsize)  ((conn)->recv_bufsize = (recvbufsize))\n/** Get the receive buffer in bytes */\n#define netconn_get_recvbufsize(conn)               ((conn)->recv_bufsize)\n#endif /* LWIP_SO_RCVBUF*/\n\n#if LWIP_NETCONN_SEM_PER_THREAD\nvoid netconn_thread_init(void);\nvoid netconn_thread_cleanup(void);\n#else /* LWIP_NETCONN_SEM_PER_THREAD */\n#define netconn_thread_init()\n#define netconn_thread_cleanup()\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_NETCONN || LWIP_SOCKET */\n\n#endif /* LWIP_HDR_API_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/FILES",
    "content": "This directory contains application headers.\nEvery application shall provide one api file APP.h and optionally one options file APP_opts.h\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/fs.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_APPS_FS_H\n#define LWIP_HDR_APPS_FS_H\n\n#include \"httpd_opts.h\"\n#include \"lwip/err.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define FS_READ_EOF     -1\n#define FS_READ_DELAYED -2\n\n#if HTTPD_PRECALCULATED_CHECKSUM\nstruct fsdata_chksum {\n  u32_t offset;\n  u16_t chksum;\n  u16_t len;\n};\n#endif /* HTTPD_PRECALCULATED_CHECKSUM */\n\n#define FS_FILE_FLAGS_HEADER_INCLUDED     0x01\n#define FS_FILE_FLAGS_HEADER_PERSISTENT   0x02\n\nstruct fs_file {\n  const char *data;\n  int len;\n  int index;\n  void *pextension;\n#if HTTPD_PRECALCULATED_CHECKSUM\n  const struct fsdata_chksum *chksum;\n  u16_t chksum_count;\n#endif /* HTTPD_PRECALCULATED_CHECKSUM */\n  u8_t flags;\n#if LWIP_HTTPD_CUSTOM_FILES\n  u8_t is_custom_file;\n#endif /* LWIP_HTTPD_CUSTOM_FILES */\n#if LWIP_HTTPD_FILE_STATE\n  void *state;\n#endif /* LWIP_HTTPD_FILE_STATE */\n};\n\n#if LWIP_HTTPD_FS_ASYNC_READ\ntypedef void (*fs_wait_cb)(void *arg);\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n\nerr_t fs_open(struct fs_file *file, const char *name);\nvoid fs_close(struct fs_file *file);\n#if LWIP_HTTPD_DYNAMIC_FILE_READ\n#if LWIP_HTTPD_FS_ASYNC_READ\nint fs_read_async(struct fs_file *file, char *buffer, int count, fs_wait_cb callback_fn, void *callback_arg);\n#else /* LWIP_HTTPD_FS_ASYNC_READ */\nint fs_read(struct fs_file *file, char *buffer, int count);\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\n#endif /* LWIP_HTTPD_DYNAMIC_FILE_READ */\n#if LWIP_HTTPD_FS_ASYNC_READ\nint fs_is_file_ready(struct fs_file *file, fs_wait_cb callback_fn, void *callback_arg);\n#endif /* LWIP_HTTPD_FS_ASYNC_READ */\nint fs_bytes_left(struct fs_file *file);\n\n#if LWIP_HTTPD_FILE_STATE\n/** This user-defined function is called when a file is opened. */\nvoid *fs_state_init(struct fs_file *file, const char *name);\n/** This user-defined function is called when a file is closed. */\nvoid fs_state_free(struct fs_file *file, void *state);\n#endif /* #if LWIP_HTTPD_FILE_STATE */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_FS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/httpd.h",
    "content": "/**\n * @file\n * HTTP server\n */\n\n/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n * This version of the file has been modified by Texas Instruments to offer\n * simple server-side-include (SSI) and Common Gateway Interface (CGI)\n * capability.\n */\n\n#ifndef LWIP_HDR_APPS_HTTPD_H\n#define LWIP_HDR_APPS_HTTPD_H\n\n#include \"httpd_opts.h\"\n#include \"lwip/err.h\"\n#include \"lwip/pbuf.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_HTTPD_CGI\n\n/*\n * Function pointer for a CGI script handler.\n *\n * This function is called each time the HTTPD server is asked for a file\n * whose name was previously registered as a CGI function using a call to\n * http_set_cgi_handler. The iIndex parameter provides the index of the\n * CGI within the ppcURLs array passed to http_set_cgi_handler. Parameters\n * pcParam and pcValue provide access to the parameters provided along with\n * the URI. iNumParams provides a count of the entries in the pcParam and\n * pcValue arrays. Each entry in the pcParam array contains the name of a\n * parameter with the corresponding entry in the pcValue array containing the\n * value for that parameter. Note that pcParam may contain multiple elements\n * with the same name if, for example, a multi-selection list control is used\n * in the form generating the data.\n *\n * The function should return a pointer to a character string which is the\n * path and filename of the response that is to be sent to the connected\n * browser, for example \"/thanks.htm\" or \"/response/error.ssi\".\n *\n * The maximum number of parameters that will be passed to this function via\n * iNumParams is defined by LWIP_HTTPD_MAX_CGI_PARAMETERS. Any parameters in the incoming\n * HTTP request above this number will be discarded.\n *\n * Requests intended for use by this CGI mechanism must be sent using the GET\n * method (which encodes all parameters within the URI rather than in a block\n * later in the request). Attempts to use the POST method will result in the\n * request being ignored.\n *\n */\ntypedef const char *(*tCGIHandler)(int iIndex, int iNumParams, char *pcParam[],\n                             char *pcValue[]);\n\n/*\n * Structure defining the base filename (URL) of a CGI and the associated\n * function which is to be called when that URL is requested.\n */\ntypedef struct\n{\n    const char *pcCGIName;\n    tCGIHandler pfnCGIHandler;\n} tCGI;\n\nvoid http_set_cgi_handlers(const tCGI *pCGIs, int iNumHandlers);\n\n#endif /* LWIP_HTTPD_CGI */\n\n#if LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI\n\n#if LWIP_HTTPD_CGI_SSI\n/** Define this generic CGI handler in your application.\n * It is called once for every URI with parameters.\n * The parameters can be stored to \n */\nextern void httpd_cgi_handler(const char* uri, int iNumParams, char **pcParam, char **pcValue\n#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE\n                                     , void *connection_state\n#endif /* LWIP_HTTPD_FILE_STATE */\n                                     );\n#endif /* LWIP_HTTPD_CGI_SSI */\n\n#endif /* LWIP_HTTPD_CGI || LWIP_HTTPD_CGI_SSI */\n\n#if LWIP_HTTPD_SSI\n\n/*\n * Function pointer for the SSI tag handler callback.\n *\n * This function will be called each time the HTTPD server detects a tag of the\n * form <!--#name--> in a .shtml, .ssi or .shtm file where \"name\" appears as\n * one of the tags supplied to http_set_ssi_handler in the ppcTags array.  The\n * returned insert string, which will be appended after the the string\n * \"<!--#name-->\" in file sent back to the client,should be written to pointer\n * pcInsert.  iInsertLen contains the size of the buffer pointed to by\n * pcInsert.  The iIndex parameter provides the zero-based index of the tag as\n * found in the ppcTags array and identifies the tag that is to be processed.\n *\n * The handler returns the number of characters written to pcInsert excluding\n * any terminating NULL or a negative number to indicate a failure (tag not\n * recognized, for example).\n *\n * Note that the behavior of this SSI mechanism is somewhat different from the\n * \"normal\" SSI processing as found in, for example, the Apache web server.  In\n * this case, the inserted text is appended following the SSI tag rather than\n * replacing the tag entirely.  This allows for an implementation that does not\n * require significant additional buffering of output data yet which will still\n * offer usable SSI functionality.  One downside to this approach is when\n * attempting to use SSI within JavaScript.  The SSI tag is structured to\n * resemble an HTML comment but this syntax does not constitute a comment\n * within JavaScript and, hence, leaving the tag in place will result in\n * problems in these cases.  To work around this, any SSI tag which needs to\n * output JavaScript code must do so in an encapsulated way, sending the whole\n * HTML <script>...</script> section as a single include.\n */\ntypedef u16_t (*tSSIHandler)(\n#if LWIP_HTTPD_SSI_RAW\n                             const char* ssi_tag_name,\n#else /* LWIP_HTTPD_SSI_RAW */\n                             int iIndex,\n#endif /* LWIP_HTTPD_SSI_RAW */\n                             char *pcInsert, int iInsertLen\n#if LWIP_HTTPD_SSI_MULTIPART\n                             , u16_t current_tag_part, u16_t *next_tag_part\n#endif /* LWIP_HTTPD_SSI_MULTIPART */\n#if defined(LWIP_HTTPD_FILE_STATE) && LWIP_HTTPD_FILE_STATE\n                             , void *connection_state\n#endif /* LWIP_HTTPD_FILE_STATE */\n                             );\n\n/** Set the SSI handler function\n * (if LWIP_HTTPD_SSI_RAW==1, only the first argument is used)\n */\nvoid http_set_ssi_handler(tSSIHandler pfnSSIHandler,\n                          const char **ppcTags, int iNumTags);\n\n/** For LWIP_HTTPD_SSI_RAW==1, return this to indicate the tag is unknown.\n * In this case, the webserver writes a warning into the page.\n * You can also just return 0 to write nothing for unknown tags.\n */\n#define HTTPD_SSI_TAG_UNKNOWN 0xFFFF\n\n#endif /* LWIP_HTTPD_SSI */\n\n#if LWIP_HTTPD_SUPPORT_POST\n\n/* These functions must be implemented by the application */\n\n/** Called when a POST request has been received. The application can decide\n * whether to accept it or not.\n *\n * @param connection Unique connection identifier, valid until httpd_post_end\n *        is called.\n * @param uri The HTTP header URI receiving the POST request.\n * @param http_request The raw HTTP request (the first packet, normally).\n * @param http_request_len Size of 'http_request'.\n * @param content_len Content-Length from HTTP header.\n * @param response_uri Filename of response file, to be filled when denying the\n *        request\n * @param response_uri_len Size of the 'response_uri' buffer.\n * @param post_auto_wnd Set this to 0 to let the callback code handle window\n *        updates by calling 'httpd_post_data_recved' (to throttle rx speed)\n *        default is 1 (httpd handles window updates automatically)\n * @return ERR_OK: Accept the POST request, data may be passed in\n *         another err_t: Deny the POST request, send back 'bad request'.\n */\nerr_t httpd_post_begin(void *connection, const char *uri, const char *http_request,\n                       u16_t http_request_len, int content_len, char *response_uri,\n                       u16_t response_uri_len, u8_t *post_auto_wnd);\n\n/** Called for each pbuf of data that has been received for a POST.\n * ATTENTION: The application is responsible for freeing the pbufs passed in!\n *\n * @param connection Unique connection identifier.\n * @param p Received data.\n * @return ERR_OK: Data accepted.\n *         another err_t: Data denied, http_post_get_response_uri will be called.\n */\nerr_t httpd_post_receive_data(void *connection, struct pbuf *p);\n\n/** Called when all data is received or when the connection is closed.\n * The application must return the filename/URI of a file to send in response\n * to this POST request. If the response_uri buffer is untouched, a 404\n * response is returned.\n *\n * @param connection Unique connection identifier.\n * @param response_uri Filename of response file, to be filled when denying the request\n * @param response_uri_len Size of the 'response_uri' buffer.\n */\nvoid httpd_post_finished(void *connection, char *response_uri, u16_t response_uri_len);\n\n#if LWIP_HTTPD_POST_MANUAL_WND\nvoid httpd_post_data_recved(void *connection, u16_t recved_len);\n#endif /* LWIP_HTTPD_POST_MANUAL_WND */\n\n#endif /* LWIP_HTTPD_SUPPORT_POST */\n\nvoid httpd_init(void);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HTTPD_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/httpd_opts.h",
    "content": "/**\n * @file\n * HTTP server options list\n */\n\n/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n * This version of the file has been modified by Texas Instruments to offer\n * simple server-side-include (SSI) and Common Gateway Interface (CGI)\n * capability.\n */\n\n#ifndef LWIP_HDR_APPS_HTTPD_OPTS_H\n#define LWIP_HDR_APPS_HTTPD_OPTS_H\n\n#include \"lwip/opt.h\"\n\n/**\n * @defgroup httpd_opts Options\n * @ingroup httpd\n * @{\n */\n\n/** Set this to 1 to support CGI (old style) */\n#if !defined LWIP_HTTPD_CGI || defined __DOXYGEN__\n#define LWIP_HTTPD_CGI            0\n#endif\n\n/** Set this to 1 to support CGI (new style) */\n#if !defined LWIP_HTTPD_CGI_SSI || defined __DOXYGEN__\n#define LWIP_HTTPD_CGI_SSI        0\n#endif\n\n/** Set this to 1 to support SSI (Server-Side-Includes) */\n#if !defined LWIP_HTTPD_SSI || defined __DOXYGEN__\n#define LWIP_HTTPD_SSI            0\n#endif\n\n/** Set this to 1 to implement an SSI tag handler callback that gets a const char*\n * to the tag (instead of an index into a pre-registered array of known tags) */\n#if !defined LWIP_HTTPD_SSI_RAW || defined __DOXYGEN__\n#define LWIP_HTTPD_SSI_RAW        0\n#endif\n\n/** Set this to 1 to support HTTP POST */\n#if !defined LWIP_HTTPD_SUPPORT_POST || defined __DOXYGEN__\n#define LWIP_HTTPD_SUPPORT_POST   0\n#endif\n\n/* The maximum number of parameters that the CGI handler can be sent. */\n#if !defined LWIP_HTTPD_MAX_CGI_PARAMETERS || defined __DOXYGEN__\n#define LWIP_HTTPD_MAX_CGI_PARAMETERS 16\n#endif\n\n/** LWIP_HTTPD_SSI_MULTIPART==1: SSI handler function is called with 2 more\n * arguments indicating a counter for insert string that are too long to be\n * inserted at once: the SSI handler function must then set 'next_tag_part'\n * which will be passed back to it in the next call. */\n#if !defined LWIP_HTTPD_SSI_MULTIPART || defined __DOXYGEN__\n#define LWIP_HTTPD_SSI_MULTIPART    0\n#endif\n\n/* The maximum length of the string comprising the tag name */\n#if !defined LWIP_HTTPD_MAX_TAG_NAME_LEN || defined __DOXYGEN__\n#define LWIP_HTTPD_MAX_TAG_NAME_LEN 8\n#endif\n\n/* The maximum length of string that can be returned to replace any given tag */\n#if !defined LWIP_HTTPD_MAX_TAG_INSERT_LEN || defined __DOXYGEN__\n#define LWIP_HTTPD_MAX_TAG_INSERT_LEN 192\n#endif\n\n#if !defined LWIP_HTTPD_POST_MANUAL_WND || defined __DOXYGEN__\n#define LWIP_HTTPD_POST_MANUAL_WND  0\n#endif\n\n/** This string is passed in the HTTP header as \"Server: \" */\n#if !defined HTTPD_SERVER_AGENT || defined __DOXYGEN__\n#define HTTPD_SERVER_AGENT \"lwIP/\" LWIP_VERSION_STRING \" (http://savannah.nongnu.org/projects/lwip)\"\n#endif\n\n/** Set this to 1 if you want to include code that creates HTTP headers\n * at runtime. Default is off: HTTP headers are then created statically\n * by the makefsdata tool. Static headers mean smaller code size, but\n * the (readonly) fsdata will grow a bit as every file includes the HTTP\n * header. */\n#if !defined LWIP_HTTPD_DYNAMIC_HEADERS || defined __DOXYGEN__\n#define LWIP_HTTPD_DYNAMIC_HEADERS 0\n#endif\n\n#if !defined HTTPD_DEBUG || defined __DOXYGEN__\n#define HTTPD_DEBUG         LWIP_DBG_OFF\n#endif\n\n/** Set this to 1 to use a memp pool for allocating \n * struct http_state instead of the heap.\n */\n#if !defined HTTPD_USE_MEM_POOL || defined __DOXYGEN__\n#define HTTPD_USE_MEM_POOL  0\n#endif\n\n/** The server port for HTTPD to use */\n#if !defined HTTPD_SERVER_PORT || defined __DOXYGEN__\n#define HTTPD_SERVER_PORT                   80\n#endif\n\n/** Maximum retries before the connection is aborted/closed.\n * - number of times pcb->poll is called -> default is 4*500ms = 2s;\n * - reset when pcb->sent is called\n */\n#if !defined HTTPD_MAX_RETRIES || defined __DOXYGEN__\n#define HTTPD_MAX_RETRIES                   4\n#endif\n\n/** The poll delay is X*500ms */\n#if !defined HTTPD_POLL_INTERVAL || defined __DOXYGEN__\n#define HTTPD_POLL_INTERVAL                 4\n#endif\n\n/** Priority for tcp pcbs created by HTTPD (very low by default).\n *  Lower priorities get killed first when running out of memory.\n */\n#if !defined HTTPD_TCP_PRIO || defined __DOXYGEN__\n#define HTTPD_TCP_PRIO                      TCP_PRIO_MIN\n#endif\n\n/** Set this to 1 to enable timing each file sent */\n#if !defined LWIP_HTTPD_TIMING || defined __DOXYGEN__\n#define LWIP_HTTPD_TIMING                   0\n#endif\n/** Set this to 1 to enable timing each file sent */\n#if !defined HTTPD_DEBUG_TIMING || defined __DOXYGEN__\n#define HTTPD_DEBUG_TIMING                  LWIP_DBG_OFF\n#endif\n\n/** Set this to one to show error pages when parsing a request fails instead\n    of simply closing the connection. */\n#if !defined LWIP_HTTPD_SUPPORT_EXTSTATUS || defined __DOXYGEN__\n#define LWIP_HTTPD_SUPPORT_EXTSTATUS        0\n#endif\n\n/** Set this to 0 to drop support for HTTP/0.9 clients (to save some bytes) */\n#if !defined LWIP_HTTPD_SUPPORT_V09 || defined __DOXYGEN__\n#define LWIP_HTTPD_SUPPORT_V09              1\n#endif\n\n/** Set this to 1 to enable HTTP/1.1 persistent connections.\n * ATTENTION: If the generated file system includes HTTP headers, these must\n * include the \"Connection: keep-alive\" header (pass argument \"-11\" to makefsdata).\n */\n#if !defined LWIP_HTTPD_SUPPORT_11_KEEPALIVE || defined __DOXYGEN__\n#define LWIP_HTTPD_SUPPORT_11_KEEPALIVE     0\n#endif\n\n/** Set this to 1 to support HTTP request coming in in multiple packets/pbufs */\n#if !defined LWIP_HTTPD_SUPPORT_REQUESTLIST || defined __DOXYGEN__\n#define LWIP_HTTPD_SUPPORT_REQUESTLIST      1\n#endif\n\n#if LWIP_HTTPD_SUPPORT_REQUESTLIST\n/** Number of rx pbufs to enqueue to parse an incoming request (up to the first\n    newline) */\n#if !defined LWIP_HTTPD_REQ_QUEUELEN || defined __DOXYGEN__\n#define LWIP_HTTPD_REQ_QUEUELEN             5\n#endif\n\n/** Number of (TCP payload-) bytes (in pbufs) to enqueue to parse and incoming\n    request (up to the first double-newline) */\n#if !defined LWIP_HTTPD_REQ_BUFSIZE || defined __DOXYGEN__\n#define LWIP_HTTPD_REQ_BUFSIZE              LWIP_HTTPD_MAX_REQ_LENGTH\n#endif\n\n/** Defines the maximum length of a HTTP request line (up to the first CRLF,\n    copied from pbuf into this a global buffer when pbuf- or packet-queues\n    are received - otherwise the input pbuf is used directly) */\n#if !defined LWIP_HTTPD_MAX_REQ_LENGTH || defined __DOXYGEN__\n#define LWIP_HTTPD_MAX_REQ_LENGTH           LWIP_MIN(1023, (LWIP_HTTPD_REQ_QUEUELEN * PBUF_POOL_BUFSIZE))\n#endif\n#endif /* LWIP_HTTPD_SUPPORT_REQUESTLIST */\n\n/** This is the size of a static buffer used when URIs end with '/'.\n * In this buffer, the directory requested is concatenated with all the\n * configured default file names.\n * Set to 0 to disable checking default filenames on non-root directories.\n */\n#if !defined LWIP_HTTPD_MAX_REQUEST_URI_LEN || defined __DOXYGEN__\n#define LWIP_HTTPD_MAX_REQUEST_URI_LEN      63\n#endif\n\n/** Maximum length of the filename to send as response to a POST request,\n * filled in by the application when a POST is finished.\n */\n#if !defined LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN || defined __DOXYGEN__\n#define LWIP_HTTPD_POST_MAX_RESPONSE_URI_LEN 63\n#endif\n\n/** Set this to 0 to not send the SSI tag (default is on, so the tag will\n * be sent in the HTML page */\n#if !defined LWIP_HTTPD_SSI_INCLUDE_TAG || defined __DOXYGEN__\n#define LWIP_HTTPD_SSI_INCLUDE_TAG           1\n#endif\n\n/** Set this to 1 to call tcp_abort when tcp_close fails with memory error.\n * This can be used to prevent consuming all memory in situations where the\n * HTTP server has low priority compared to other communication. */\n#if !defined LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR || defined __DOXYGEN__\n#define LWIP_HTTPD_ABORT_ON_CLOSE_MEM_ERROR  0\n#endif\n\n/** Set this to 1 to kill the oldest connection when running out of\n * memory for 'struct http_state' or 'struct http_ssi_state'.\n * ATTENTION: This puts all connections on a linked list, so may be kind of slow.\n */\n#if !defined LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED || defined __DOXYGEN__\n#define LWIP_HTTPD_KILL_OLD_ON_CONNECTIONS_EXCEEDED 0\n#endif\n\n/** Set this to 1 to send URIs without extension without headers\n * (who uses this at all??) */\n#if !defined LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI || defined __DOXYGEN__\n#define LWIP_HTTPD_OMIT_HEADER_FOR_EXTENSIONLESS_URI 0\n#endif\n\n/** Default: Tags are sent from struct http_state and are therefore volatile */\n#if !defined HTTP_IS_TAG_VOLATILE || defined __DOXYGEN__\n#define HTTP_IS_TAG_VOLATILE(ptr) TCP_WRITE_FLAG_COPY\n#endif\n\n/* By default, the httpd is limited to send 2*pcb->mss to keep resource usage low\n   when http is not an important protocol in the device. */\n#if !defined HTTPD_LIMIT_SENDING_TO_2MSS || defined __DOXYGEN__\n#define HTTPD_LIMIT_SENDING_TO_2MSS 1\n#endif\n\n/* Define this to a function that returns the maximum amount of data to enqueue.\n   The function have this signature: u16_t fn(struct tcp_pcb* pcb); */\n#if !defined HTTPD_MAX_WRITE_LEN || defined __DOXYGEN__\n#if HTTPD_LIMIT_SENDING_TO_2MSS\n#define HTTPD_MAX_WRITE_LEN(pcb)    (2 * tcp_mss(pcb))\n#endif\n#endif\n\n/*------------------- FS OPTIONS -------------------*/\n\n/** Set this to 1 and provide the functions:\n * - \"int fs_open_custom(struct fs_file *file, const char *name)\"\n *    Called first for every opened file to allow opening files\n *    that are not included in fsdata(_custom).c\n * - \"void fs_close_custom(struct fs_file *file)\"\n *    Called to free resources allocated by fs_open_custom().\n */\n#if !defined LWIP_HTTPD_CUSTOM_FILES || defined __DOXYGEN__\n#define LWIP_HTTPD_CUSTOM_FILES       0\n#endif\n\n/** Set this to 1 to support fs_read() to dynamically read file data.\n * Without this (default=off), only one-block files are supported,\n * and the contents must be ready after fs_open().\n */\n#if !defined LWIP_HTTPD_DYNAMIC_FILE_READ || defined __DOXYGEN__\n#define LWIP_HTTPD_DYNAMIC_FILE_READ  0\n#endif\n\n/** Set this to 1 to include an application state argument per file\n * that is opened. This allows to keep a state per connection/file.\n */\n#if !defined LWIP_HTTPD_FILE_STATE || defined __DOXYGEN__\n#define LWIP_HTTPD_FILE_STATE         0\n#endif\n\n/** HTTPD_PRECALCULATED_CHECKSUM==1: include precompiled checksums for\n * predefined (MSS-sized) chunks of the files to prevent having to calculate\n * the checksums at runtime. */\n#if !defined HTTPD_PRECALCULATED_CHECKSUM || defined __DOXYGEN__\n#define HTTPD_PRECALCULATED_CHECKSUM  0\n#endif\n\n/** LWIP_HTTPD_FS_ASYNC_READ==1: support asynchronous read operations\n * (fs_read_async returns FS_READ_DELAYED and calls a callback when finished).\n */\n#if !defined LWIP_HTTPD_FS_ASYNC_READ || defined __DOXYGEN__\n#define LWIP_HTTPD_FS_ASYNC_READ      0\n#endif\n\n/** Set this to 1 to include \"fsdata_custom.c\" instead of \"fsdata.c\" for the\n * file system (to prevent changing the file included in CVS) */\n#if !defined HTTPD_USE_CUSTOM_FSDATA || defined __DOXYGEN__\n#define HTTPD_USE_CUSTOM_FSDATA 0\n#endif\n\n/**\n * @}\n */\n\n#endif /* LWIP_HDR_APPS_HTTPD_OPTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/lwiperf.h",
    "content": "/**\n * @file\n * lwIP iPerf server implementation\n */\n\n/*\n * Copyright (c) 2014 Simon Goldschmidt\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Simon Goldschmidt\n *\n */\n#ifndef LWIP_HDR_APPS_LWIPERF_H\n#define LWIP_HDR_APPS_LWIPERF_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/ip_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LWIPERF_TCP_PORT_DEFAULT  5001\n\n/** lwIPerf test results */\nenum lwiperf_report_type\n{\n  /** The server side test is done */\n  LWIPERF_TCP_DONE_SERVER,\n  /** The client side test is done */\n  LWIPERF_TCP_DONE_CLIENT,\n  /** Local error lead to test abort */\n  LWIPERF_TCP_ABORTED_LOCAL,\n  /** Data check error lead to test abort */\n  LWIPERF_TCP_ABORTED_LOCAL_DATAERROR,\n  /** Transmit error lead to test abort */\n  LWIPERF_TCP_ABORTED_LOCAL_TXERROR,\n  /** Remote side aborted the test */\n  LWIPERF_TCP_ABORTED_REMOTE\n};\n\n/** Prototype of a report function that is called when a session is finished.\n    This report function can show the test results.\n    @param report_type contains the test result */\ntypedef void (*lwiperf_report_fn)(void *arg, enum lwiperf_report_type report_type,\n  const ip_addr_t* local_addr, u16_t local_port, const ip_addr_t* remote_addr, u16_t remote_port,\n  u32_t bytes_transferred, u32_t ms_duration, u32_t bandwidth_kbitpsec);\n\n\nvoid* lwiperf_start_tcp_server(const ip_addr_t* local_addr, u16_t local_port,\n                               lwiperf_report_fn report_fn, void* report_arg);\nvoid* lwiperf_start_tcp_server_default(lwiperf_report_fn report_fn, void* report_arg);\nvoid  lwiperf_abort(void* lwiperf_session);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_LWIPERF_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/mdns.h",
    "content": "/**\n * @file\n * MDNS responder\n */\n\n /*\n * Copyright (c) 2015 Verisure Innovation AB\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Erik Ekman <erik@kryo.se>\n *\n */\n#ifndef LWIP_HDR_MDNS_H\n#define LWIP_HDR_MDNS_H\n\n#include \"lwip/apps/mdns_opts.h\"\n#include \"lwip/netif.h\"\n\n#if LWIP_MDNS_RESPONDER\n\nenum mdns_sd_proto {\n  DNSSD_PROTO_UDP = 0,\n  DNSSD_PROTO_TCP = 1\n};\n\n#define MDNS_LABEL_MAXLEN  63\n\nstruct mdns_host;\nstruct mdns_service;\n\n/** Callback function to add text to a reply, called when generating the reply */\ntypedef void (*service_get_txt_fn_t)(struct mdns_service *service, void *txt_userdata);\n\nvoid mdns_resp_init(void);\n\nerr_t mdns_resp_add_netif(struct netif *netif, const char *hostname, u32_t dns_ttl);\nerr_t mdns_resp_remove_netif(struct netif *netif);\n\nerr_t mdns_resp_add_service(struct netif *netif, const char *name, const char *service, enum mdns_sd_proto proto, u16_t port, u32_t dns_ttl, service_get_txt_fn_t txt_fn, void *txt_userdata);\nerr_t mdns_resp_add_service_txtitem(struct mdns_service *service, const char *txt, u8_t txt_len);\nvoid mdns_resp_netif_settings_changed(struct netif *netif);\n\n#endif /* LWIP_MDNS_RESPONDER */\n\n#endif /* LWIP_HDR_MDNS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/mdns_opts.h",
    "content": "/**\n * @file\n * MDNS responder\n */\n\n /*\n * Copyright (c) 2015 Verisure Innovation AB\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Erik Ekman <erik@kryo.se>\n *\n */\n\n#ifndef LWIP_HDR_APPS_MDNS_OPTS_H\n#define LWIP_HDR_APPS_MDNS_OPTS_H\n\n#include \"lwip/opt.h\"\n\n/**\n * @defgroup mdns_opts Options\n * @ingroup mdns\n * @{\n */\n\n/**\n * LWIP_MDNS_RESPONDER==1: Turn on multicast DNS module. UDP must be available for MDNS\n * transport. IGMP is needed for IPv4 multicast.\n */\n#ifndef LWIP_MDNS_RESPONDER\n#define LWIP_MDNS_RESPONDER             0\n#endif /* LWIP_MDNS_RESPONDER */\n\n/** The maximum number of services per netif */\n#ifndef MDNS_MAX_SERVICES\n#define MDNS_MAX_SERVICES               1\n#endif\n\n/**\n * MDNS_DEBUG: Enable debugging for multicast DNS.\n */\n#ifndef MDNS_DEBUG\n#define MDNS_DEBUG                       LWIP_DBG_OFF\n#endif\n\n/**\n * @}\n */\n\n#endif /* LWIP_HDR_APPS_MDNS_OPTS_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/mdns_priv.h",
    "content": "/**\n * @file\n * MDNS responder private definitions\n */\n\n /*\n * Copyright (c) 2015 Verisure Innovation AB\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Erik Ekman <erik@kryo.se>\n *\n */\n#ifndef LWIP_HDR_MDNS_PRIV_H\n#define LWIP_HDR_MDNS_PRIV_H\n\n#include \"lwip/apps/mdns_opts.h\"\n#include \"lwip/pbuf.h\"\n\n#if LWIP_MDNS_RESPONDER\n\n/* Domain struct and methods - visible for unit tests */\n\n#define MDNS_DOMAIN_MAXLEN 256\n#define MDNS_READNAME_ERROR 0xFFFF\n\nstruct mdns_domain {\n  /* Encoded domain name */\n  u8_t name[MDNS_DOMAIN_MAXLEN];\n  /* Total length of domain name, including zero */\n  u16_t length;\n  /* Set if compression of this domain is not allowed */\n  u8_t skip_compression;\n};\n\nerr_t mdns_domain_add_label(struct mdns_domain *domain, const char *label, u8_t len);\nu16_t mdns_readname(struct pbuf *p, u16_t offset, struct mdns_domain *domain);\nint mdns_domain_eq(struct mdns_domain *a, struct mdns_domain *b);\nu16_t mdns_compress_domain(struct pbuf *pbuf, u16_t *offset, struct mdns_domain *domain);\n\n#endif /* LWIP_MDNS_RESPONDER */\n\n#endif /* LWIP_HDR_MDNS_PRIV_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/mqtt.h",
    "content": "/**\n * @file\n * MQTT client\n */\n\n/*\n * Copyright (c) 2016 Erik Andersson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Erik Andersson\n *\n */\n#ifndef LWIP_HDR_APPS_MQTT_CLIENT_H\n#define LWIP_HDR_APPS_MQTT_CLIENT_H\n\n#include \"lwip/apps/mqtt_opts.h\"\n#include \"lwip/err.h\"\n#include \"lwip/ip_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct mqtt_client_t mqtt_client_t;\n\n/** @ingroup mqtt\n * Default MQTT port */\n#define MQTT_PORT 1883\n\n/*---------------------------------------------------------------------------------------------- */\n/* Connection with server */\n\n/**\n * @ingroup mqtt\n * Client information and connection parameters */\nstruct mqtt_connect_client_info_t {\n  /** Client identifier, must be set by caller */\n  const char *client_id;\n  /** User name and password, set to NULL if not used */\n  const char* client_user;\n  const char* client_pass;\n  /** keep alive time in seconds, 0 to disable keep alive functionality*/\n  u16_t keep_alive;\n  /** will topic, set to NULL if will is not to be used,\n      will_msg, will_qos and will retain are then ignored */\n  const char* will_topic;\n  const char* will_msg;\n  u8_t will_qos;\n  u8_t will_retain;\n};\n\n/**\n * @ingroup mqtt\n * Connection status codes */\ntypedef enum\n{\n  MQTT_CONNECT_ACCEPTED                 = 0,\n  MQTT_CONNECT_REFUSED_PROTOCOL_VERSION = 1,\n  MQTT_CONNECT_REFUSED_IDENTIFIER       = 2,\n  MQTT_CONNECT_REFUSED_SERVER           = 3,\n  MQTT_CONNECT_REFUSED_USERNAME_PASS    = 4,\n  MQTT_CONNECT_REFUSED_NOT_AUTHORIZED_  = 5,\n  MQTT_CONNECT_DISCONNECTED             = 256,\n  MQTT_CONNECT_TIMEOUT                  = 257\n} mqtt_connection_status_t;\n\n/**\n * @ingroup mqtt\n * Function prototype for mqtt connection status callback. Called when\n * client has connected to the server after initiating a mqtt connection attempt by\n * calling mqtt_connect() or when connection is closed by server or an error\n *\n * @param client MQTT client itself\n * @param arg Additional argument to pass to the callback function\n * @param status Connect result code or disconnection notification @see mqtt_connection_status_t\n *\n */\ntypedef void (*mqtt_connection_cb_t)(mqtt_client_t *client, void *arg, mqtt_connection_status_t status);\n\n\n/**\n * @ingroup mqtt\n * Data callback flags */\nenum {\n  /** Flag set when last fragment of data arrives in data callback */\n  MQTT_DATA_FLAG_LAST = 1\n};\n\n/** \n * @ingroup mqtt\n * Function prototype for MQTT incoming publish data callback function. Called when data\n * arrives to a subscribed topic @see mqtt_subscribe\n *\n * @param arg Additional argument to pass to the callback function\n * @param data User data, pointed object, data may not be referenced after callback return,\n          NULL is passed when all publish data are delivered\n * @param len Length of publish data fragment\n * @param flags MQTT_DATA_FLAG_LAST set when this call contains the last part of data from publish message\n *\n */\ntypedef void (*mqtt_incoming_data_cb_t)(void *arg, const u8_t *data, u16_t len, u8_t flags);\n\n\n/** \n * @ingroup mqtt\n * Function prototype for MQTT incoming publish function. Called when an incoming publish\n * arrives to a subscribed topic @see mqtt_subscribe\n *\n * @param arg Additional argument to pass to the callback function\n * @param topic Zero terminated Topic text string, topic may not be referenced after callback return\n * @param tot_len Total length of publish data, if set to 0 (no publish payload) data callback will not be invoked\n */\ntypedef void (*mqtt_incoming_publish_cb_t)(void *arg, const char *topic, u32_t tot_len);\n\n\n/**\n * @ingroup mqtt\n * Function prototype for mqtt request callback. Called when a subscribe, unsubscribe\n * or publish request has completed\n * @param arg Pointer to user data supplied when invoking request\n * @param err ERR_OK on success\n *            ERR_TIMEOUT if no response was received within timeout,\n *            ERR_ABRT if (un)subscribe was denied\n */\ntypedef void (*mqtt_request_cb_t)(void *arg, err_t err);\n\n\n/**\n * Pending request item, binds application callback to pending server requests\n */\nstruct mqtt_request_t\n{\n  /** Next item in list, NULL means this is the last in chain,\n      next pointing at itself means request is unallocated */\n  struct mqtt_request_t *next;\n  /** Callback to upper layer */\n  mqtt_request_cb_t cb;\n  void *arg;\n  /** MQTT packet identifier */\n  u16_t pkt_id;\n  /** Expire time relative to element before this  */\n  u16_t timeout_diff;\n};\n\n/** Ring buffer */\nstruct mqtt_ringbuf_t {\n  u16_t put;\n  u16_t get;\n  u8_t buf[MQTT_OUTPUT_RINGBUF_SIZE];\n};\n\n/** MQTT client */\nstruct mqtt_client_t\n{\n  /** Timers and timeouts */\n  u16_t cyclic_tick;\n  u16_t keep_alive;\n  u16_t server_watchdog;\n  /** Packet identifier generator*/\n  u16_t pkt_id_seq;\n  /** Packet identifier of pending incoming publish */\n  u16_t inpub_pkt_id;\n  /** Connection state */\n  u8_t conn_state;\n  struct tcp_pcb *conn;\n  /** Connection callback */\n  void *connect_arg;\n  mqtt_connection_cb_t connect_cb;\n  /** Pending requests to server */\n  struct mqtt_request_t *pend_req_queue;\n  struct mqtt_request_t req_list[MQTT_REQ_MAX_IN_FLIGHT];\n  void *inpub_arg;\n  /** Incoming data callback */\n  mqtt_incoming_data_cb_t data_cb;\n  mqtt_incoming_publish_cb_t pub_cb;\n  /** Input */\n  u32_t msg_idx;\n  u8_t rx_buffer[MQTT_VAR_HEADER_BUFFER_LEN];\n  /** Output ring-buffer */\n  struct mqtt_ringbuf_t output;\n};\n\n\n/** Connect to server */\nerr_t mqtt_client_connect(mqtt_client_t *client, const ip_addr_t *ipaddr, u16_t port, mqtt_connection_cb_t cb, void *arg,\n                   const struct mqtt_connect_client_info_t *client_info);\n\n/** Disconnect from server */\nvoid mqtt_disconnect(mqtt_client_t *client);\n\n/** Create new client */\nmqtt_client_t *mqtt_client_new(void);\n\n/** Check connection status */\nu8_t mqtt_client_is_connected(mqtt_client_t *client);\n\n/** Set callback to call for incoming publish */\nvoid mqtt_set_inpub_callback(mqtt_client_t *client, mqtt_incoming_publish_cb_t,\n                             mqtt_incoming_data_cb_t data_cb, void *arg);\n\n/** Common function for subscribe and unsubscribe */\nerr_t mqtt_sub_unsub(mqtt_client_t *client, const char *topic, u8_t qos, mqtt_request_cb_t cb, void *arg, u8_t sub);\n\n/** @ingroup mqtt\n *Subscribe to topic */\n#define mqtt_subscribe(client, topic, qos, cb, arg) mqtt_sub_unsub(client, topic, qos, cb, arg, 1)\n/** @ingroup mqtt\n *  Unsubscribe to topic */\n#define mqtt_unsubscribe(client, topic, cb, arg) mqtt_sub_unsub(client, topic, 0, cb, arg, 0)\n\n\n/** Publish data to topic */\nerr_t mqtt_publish(mqtt_client_t *client, const char *topic, const void *payload, u16_t payload_length, u8_t qos, u8_t retain,\n                                    mqtt_request_cb_t cb, void *arg);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_MQTT_CLIENT_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/mqtt_opts.h",
    "content": "/**\n * @file\n * MQTT client options\n */\n\n/*\n * Copyright (c) 2016 Erik Andersson\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Erik Andersson\n *\n */\n#ifndef LWIP_HDR_APPS_MQTT_OPTS_H\n#define LWIP_HDR_APPS_MQTT_OPTS_H\n\n#include \"lwip/opt.h\"\n\n#ifdef    __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @defgroup mqtt_opts Options\n * @ingroup mqtt\n * @{\n */\n\n/**\n * Output ring-buffer size, must be able to fit largest outgoing publish message topic+payloads\n */\n#ifndef MQTT_OUTPUT_RINGBUF_SIZE\n#define MQTT_OUTPUT_RINGBUF_SIZE 256\n#endif\n\n/**\n * Number of bytes in receive buffer, must be at least the size of the longest incoming topic + 8\n * If one wants to avoid fragmented incoming publish, set length to max incoming topic length + max payload length + 8\n */\n#ifndef MQTT_VAR_HEADER_BUFFER_LEN\n#define MQTT_VAR_HEADER_BUFFER_LEN 128\n#endif\n\n/**\n * Maximum number of pending subscribe, unsubscribe and publish requests to server .\n */\n#ifndef MQTT_REQ_MAX_IN_FLIGHT\n#define MQTT_REQ_MAX_IN_FLIGHT 4\n#endif\n\n/**\n * Seconds between each cyclic timer call.\n */\n#ifndef MQTT_CYCLIC_TIMER_INTERVAL\n#define MQTT_CYCLIC_TIMER_INTERVAL 5\n#endif\n\n/**\n * Publish, subscribe and unsubscribe request timeout in seconds.\n */\n#ifndef MQTT_REQ_TIMEOUT\n#define MQTT_REQ_TIMEOUT 30\n#endif\n\n/**\n * Seconds for MQTT connect response timeout after sending connect request\n */\n#ifndef MQTT_CONNECT_TIMOUT\n#define MQTT_CONNECT_TIMOUT 100\n#endif\n\n/**\n * @}\n */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_MQTT_OPTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/netbiosns.h",
    "content": "/**\n * @file\n * NETBIOS name service responder\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n#ifndef LWIP_HDR_APPS_NETBIOS_H\n#define LWIP_HDR_APPS_NETBIOS_H\n\n#include \"lwip/apps/netbiosns_opts.h\"\n\nvoid netbiosns_init(void);\n#ifndef NETBIOS_LWIP_NAME\nvoid netbiosns_set_name(const char* hostname);\n#endif\nvoid netbiosns_stop(void);\n\n#endif /* LWIP_HDR_APPS_NETBIOS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/netbiosns_opts.h",
    "content": "/**\n * @file\n * NETBIOS name service responder options\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n#ifndef LWIP_HDR_APPS_NETBIOS_OPTS_H\n#define LWIP_HDR_APPS_NETBIOS_OPTS_H\n\n#include \"lwip/opt.h\"\n\n/**\n * @defgroup netbiosns_opts Options\n * @ingroup netbiosns\n * @{\n */\n\n/** NetBIOS name of lwip device\n * This must be uppercase until NETBIOS_STRCMP() is defined to a string\n * comparision function that is case insensitive.\n * If you want to use the netif's hostname, use this (with LWIP_NETIF_HOSTNAME):\n * (ip_current_netif() != NULL ? ip_current_netif()->hostname != NULL ? ip_current_netif()->hostname : \"\" : \"\")\n *\n * If this is not defined, netbiosns_set_name() can be called at runtime to change the name.\n */\n#ifdef __DOXYGEN__\n#define NETBIOS_LWIP_NAME \"NETBIOSLWIPDEV\"\n#endif\n\n/**\n * @}\n */\n\n#endif /* LWIP_HDR_APPS_NETBIOS_OPTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/snmp.h",
    "content": "/**\n * @file\n * SNMP server main API - start and basic configuration\n */\n\n/*\n * Copyright (c) 2001, 2002 Leon Woestenberg <leon.woestenberg@axon.tv>\n * Copyright (c) 2001, 2002 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Leon Woestenberg <leon.woestenberg@axon.tv>\n *         Martin Hentschel <info@cl-soft.de>\n *\n */\n#ifndef LWIP_HDR_APPS_SNMP_H\n#define LWIP_HDR_APPS_SNMP_H\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/err.h\"\n#include \"lwip/apps/snmp_core.h\"\n\n/** SNMP variable binding descriptor (publically needed for traps) */\nstruct snmp_varbind\n{\n  /** pointer to next varbind, NULL for last in list */\n  struct snmp_varbind *next;\n  /** pointer to previous varbind, NULL for first in list */\n  struct snmp_varbind *prev;\n\n  /** object identifier */\n  struct snmp_obj_id oid;\n\n  /** value ASN1 type */\n  u8_t type;\n  /** object value length */\n  u16_t value_len;\n  /** object value */\n  void *value;\n};\n\n/**\n * @ingroup snmp_core\n * Agent setup, start listening to port 161.\n */\nvoid snmp_init(void);\nvoid snmp_set_mibs(const struct snmp_mib **mibs, u8_t num_mibs);\n\nvoid snmp_set_device_enterprise_oid(const struct snmp_obj_id* device_enterprise_oid);\nconst struct snmp_obj_id* snmp_get_device_enterprise_oid(void);\n\nvoid snmp_trap_dst_enable(u8_t dst_idx, u8_t enable);\nvoid snmp_trap_dst_ip_set(u8_t dst_idx, const ip_addr_t *dst);\n\n/** Generic trap: cold start */\n#define SNMP_GENTRAP_COLDSTART 0\n/** Generic trap: warm start */\n#define SNMP_GENTRAP_WARMSTART 1\n/** Generic trap: link down */\n#define SNMP_GENTRAP_LINKDOWN 2\n/** Generic trap: link up */\n#define SNMP_GENTRAP_LINKUP 3\n/** Generic trap: authentication failure */\n#define SNMP_GENTRAP_AUTH_FAILURE 4\n/** Generic trap: EGP neighbor lost */\n#define SNMP_GENTRAP_EGP_NEIGHBOR_LOSS 5\n/** Generic trap: enterprise specific */\n#define SNMP_GENTRAP_ENTERPRISE_SPECIFIC 6\n\nerr_t snmp_send_trap_generic(s32_t generic_trap);\nerr_t snmp_send_trap_specific(s32_t specific_trap, struct snmp_varbind *varbinds);\nerr_t snmp_send_trap(const struct snmp_obj_id* oid, s32_t generic_trap, s32_t specific_trap, struct snmp_varbind *varbinds);\n\n#define SNMP_AUTH_TRAPS_DISABLED 0\n#define SNMP_AUTH_TRAPS_ENABLED  1\nvoid snmp_set_auth_traps_enabled(u8_t enable);\nu8_t snmp_get_auth_traps_enabled(void);\n\nconst char * snmp_get_community(void);\nconst char * snmp_get_community_write(void);\nconst char * snmp_get_community_trap(void);\nvoid snmp_set_community(const char * const community);\nvoid snmp_set_community_write(const char * const community);\nvoid snmp_set_community_trap(const char * const community);\n\nvoid snmp_coldstart_trap(void);\nvoid snmp_authfail_trap(void);\n\ntypedef void (*snmp_write_callback_fct)(const u32_t* oid, u8_t oid_len, void* callback_arg);\nvoid snmp_set_write_callback(snmp_write_callback_fct write_callback, void* callback_arg);\n\n#endif /* LWIP_SNMP */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_SNMP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/snmp_core.h",
    "content": "/**\n * @file\n * SNMP core API for implementing MIBs\n */\n\n/*\n * Copyright (c) 2006 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Christiaan Simons <christiaan.simons@axon.tv>\n *         Martin Hentschel <info@cl-soft.de>\n */\n\n#ifndef LWIP_HDR_APPS_SNMP_CORE_H\n#define LWIP_HDR_APPS_SNMP_CORE_H\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/ip_addr.h\"\n#include \"lwip/err.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* basic ASN1 defines */\n#define SNMP_ASN1_CLASS_UNIVERSAL   0x00\n#define SNMP_ASN1_CLASS_APPLICATION 0x40\n#define SNMP_ASN1_CLASS_CONTEXT     0x80\n#define SNMP_ASN1_CLASS_PRIVATE     0xC0\n\n#define SNMP_ASN1_CONTENTTYPE_PRIMITIVE   0x00\n#define SNMP_ASN1_CONTENTTYPE_CONSTRUCTED 0x20\n\n/* universal tags (from ASN.1 spec.) */\n#define SNMP_ASN1_UNIVERSAL_END_OF_CONTENT  0\n#define SNMP_ASN1_UNIVERSAL_INTEGER         2\n#define SNMP_ASN1_UNIVERSAL_OCTET_STRING    4\n#define SNMP_ASN1_UNIVERSAL_NULL            5\n#define SNMP_ASN1_UNIVERSAL_OBJECT_ID       6\n#define SNMP_ASN1_UNIVERSAL_SEQUENCE_OF    16\n\n/* application specific (SNMP) tags (from SNMPv2-SMI) */\n#define SNMP_ASN1_APPLICATION_IPADDR    0  /* [APPLICATION 0] IMPLICIT OCTET STRING (SIZE (4)) */\n#define SNMP_ASN1_APPLICATION_COUNTER   1  /* [APPLICATION 1] IMPLICIT INTEGER (0..4294967295) => u32_t */\n#define SNMP_ASN1_APPLICATION_GAUGE     2  /* [APPLICATION 2] IMPLICIT INTEGER (0..4294967295) => u32_t */\n#define SNMP_ASN1_APPLICATION_TIMETICKS 3  /* [APPLICATION 3] IMPLICIT INTEGER (0..4294967295) => u32_t */\n#define SNMP_ASN1_APPLICATION_OPAQUE    4  /* [APPLICATION 4] IMPLICIT OCTET STRING */\n#define SNMP_ASN1_APPLICATION_COUNTER64 6  /* [APPLICATION 6] IMPLICIT INTEGER (0..18446744073709551615) */\n\n/* context specific (SNMP) tags (from RFC 1905) */\n#define SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_INSTANCE 1\n\n/* full ASN1 type defines */\n#define SNMP_ASN1_TYPE_END_OF_CONTENT (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_END_OF_CONTENT)\n#define SNMP_ASN1_TYPE_INTEGER        (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_INTEGER)\n#define SNMP_ASN1_TYPE_OCTET_STRING   (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_OCTET_STRING)\n#define SNMP_ASN1_TYPE_NULL           (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_NULL)\n#define SNMP_ASN1_TYPE_OBJECT_ID      (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_UNIVERSAL_OBJECT_ID)\n#define SNMP_ASN1_TYPE_SEQUENCE       (SNMP_ASN1_CLASS_UNIVERSAL | SNMP_ASN1_CONTENTTYPE_CONSTRUCTED | SNMP_ASN1_UNIVERSAL_SEQUENCE_OF)\n#define SNMP_ASN1_TYPE_IPADDR         (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_IPADDR)\n#define SNMP_ASN1_TYPE_IPADDRESS      SNMP_ASN1_TYPE_IPADDR\n#define SNMP_ASN1_TYPE_COUNTER        (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_COUNTER)\n#define SNMP_ASN1_TYPE_COUNTER32      SNMP_ASN1_TYPE_COUNTER\n#define SNMP_ASN1_TYPE_GAUGE          (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_GAUGE)\n#define SNMP_ASN1_TYPE_GAUGE32        SNMP_ASN1_TYPE_GAUGE\n#define SNMP_ASN1_TYPE_UNSIGNED32     SNMP_ASN1_TYPE_GAUGE\n#define SNMP_ASN1_TYPE_TIMETICKS      (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_TIMETICKS)\n#define SNMP_ASN1_TYPE_OPAQUE         (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_OPAQUE)\n#define SNMP_ASN1_TYPE_COUNTER64      (SNMP_ASN1_CLASS_APPLICATION | SNMP_ASN1_CONTENTTYPE_PRIMITIVE | SNMP_ASN1_APPLICATION_COUNTER64)\n\n#define SNMP_VARBIND_EXCEPTION_OFFSET 0xF0\n#define SNMP_VARBIND_EXCEPTION_MASK   0x0F\n\n/** error codes predefined by SNMP prot. */\ntypedef enum {\n  SNMP_ERR_NOERROR             = 0,\n/* \noutdated v1 error codes. do not use anmore!\n#define SNMP_ERR_NOSUCHNAME 2  use SNMP_ERR_NOSUCHINSTANCE instead\n#define SNMP_ERR_BADVALUE   3  use SNMP_ERR_WRONGTYPE,SNMP_ERR_WRONGLENGTH,SNMP_ERR_WRONGENCODING or SNMP_ERR_WRONGVALUE instead\n#define SNMP_ERR_READONLY   4  use SNMP_ERR_NOTWRITABLE instead\n*/\n  SNMP_ERR_GENERROR            = 5,\n  SNMP_ERR_NOACCESS            = 6,\n  SNMP_ERR_WRONGTYPE           = 7,\n  SNMP_ERR_WRONGLENGTH         = 8,\n  SNMP_ERR_WRONGENCODING       = 9,\n  SNMP_ERR_WRONGVALUE          = 10,\n  SNMP_ERR_NOCREATION          = 11,\n  SNMP_ERR_INCONSISTENTVALUE   = 12,\n  SNMP_ERR_RESOURCEUNAVAILABLE = 13,\n  SNMP_ERR_COMMITFAILED        = 14,\n  SNMP_ERR_UNDOFAILED          = 15,\n  SNMP_ERR_NOTWRITABLE         = 17,\n  SNMP_ERR_INCONSISTENTNAME    = 18,\n\n  SNMP_ERR_NOSUCHINSTANCE      = SNMP_VARBIND_EXCEPTION_OFFSET + SNMP_ASN1_CONTEXT_VARBIND_NO_SUCH_INSTANCE\n} snmp_err_t;\n\n/** internal object identifier representation */\nstruct snmp_obj_id\n{\n  u8_t len;\n  u32_t id[SNMP_MAX_OBJ_ID_LEN];\n};\n\nstruct snmp_obj_id_const_ref\n{\n  u8_t len;\n  const u32_t* id;\n};\n\nextern const struct snmp_obj_id_const_ref snmp_zero_dot_zero; /* administrative identifier from SNMPv2-SMI */\n\n/** SNMP variant value, used as reference in struct snmp_node_instance and table implementation */\nunion snmp_variant_value\n{\n  void* ptr;\n  const void* const_ptr;\n  u32_t u32;\n  s32_t s32;\n};\n\n\n/**\nSNMP MIB node types\n tree node is the only node the stack can process in order to walk the tree,\n all other nodes are assumed to be leaf nodes.\n This cannot be an enum because users may want to define their own node types.\n*/\n#define SNMP_NODE_TREE         0x00\n/* predefined leaf node types */\n#define SNMP_NODE_SCALAR       0x01\n#define SNMP_NODE_SCALAR_ARRAY 0x02\n#define SNMP_NODE_TABLE        0x03\n#define SNMP_NODE_THREADSYNC   0x04\n\n/** node \"base class\" layout, the mandatory fields for a node  */\nstruct snmp_node\n{\n  /** one out of SNMP_NODE_TREE or any leaf node type (like SNMP_NODE_SCALAR) */\n  u8_t node_type;\n  /** the number assigned to this node which used as part of the full OID */\n  u32_t oid;\n};\n\n/** SNMP node instance access types */\ntypedef enum {\n  SNMP_NODE_INSTANCE_ACCESS_READ    = 1,\n  SNMP_NODE_INSTANCE_ACCESS_WRITE   = 2,\n  SNMP_NODE_INSTANCE_READ_ONLY      = SNMP_NODE_INSTANCE_ACCESS_READ,\n  SNMP_NODE_INSTANCE_READ_WRITE     = (SNMP_NODE_INSTANCE_ACCESS_READ | SNMP_NODE_INSTANCE_ACCESS_WRITE),\n  SNMP_NODE_INSTANCE_WRITE_ONLY     = SNMP_NODE_INSTANCE_ACCESS_WRITE,\n  SNMP_NODE_INSTANCE_NOT_ACCESSIBLE = 0\n} snmp_access_t;\n\nstruct snmp_node_instance;\n\ntypedef s16_t (*node_instance_get_value_method)(struct snmp_node_instance*, void*);\ntypedef snmp_err_t (*node_instance_set_test_method)(struct snmp_node_instance*, u16_t, void*);\ntypedef snmp_err_t (*node_instance_set_value_method)(struct snmp_node_instance*, u16_t, void*);\ntypedef void (*node_instance_release_method)(struct snmp_node_instance*);\n\n#define SNMP_GET_VALUE_RAW_DATA 0x8000\n\n/** SNMP node instance */\nstruct snmp_node_instance\n{\n  /** prefilled with the node, get_instance() is called on; may be changed by user to any value to pass an arbitrary node between calls to get_instance() and get_value/test_value/set_value */\n  const struct snmp_node* node;\n  /** prefilled with the instance id requested; for get_instance() this is the exact oid requested; for get_next_instance() this is the relative starting point, stack expects relative oid of next node here */\n  struct snmp_obj_id instance_oid;\n\n  /** ASN type for this object (see snmp_asn1.h for definitions) */\n  u8_t asn1_type;\n  /** one out of instance access types defined above (SNMP_NODE_INSTANCE_READ_ONLY,...) */\n  snmp_access_t access;\n\n  /** returns object value for the given object identifier. Return values <0 to indicate an error */\n  node_instance_get_value_method get_value;\n  /** tests length and/or range BEFORE setting */\n  node_instance_set_test_method set_test;\n  /** sets object value, only called when set_test() was successful */\n  node_instance_set_value_method set_value;\n  /** called in any case when the instance is not required anymore by stack (useful for freeing memory allocated in get_instance/get_next_instance methods) */\n  node_instance_release_method release_instance;\n\n  /** reference to pass arbitrary value between calls to get_instance() and get_value/test_value/set_value */\n  union snmp_variant_value reference;\n  /** see reference (if reference is a pointer, the length of underlying data may be stored here or anything else) */\n  u32_t reference_len;\n};\n\n\n/** SNMP tree node */\nstruct snmp_tree_node\n{\n  /** inherited \"base class\" members */\n  struct snmp_node node;\n  u16_t subnode_count;\n  const struct snmp_node* const *subnodes;\n};\n\n#define SNMP_CREATE_TREE_NODE(oid, subnodes) \\\n  {{ SNMP_NODE_TREE, (oid) }, \\\n  (u16_t)LWIP_ARRAYSIZE(subnodes), (subnodes) }\n\n#define SNMP_CREATE_EMPTY_TREE_NODE(oid) \\\n  {{ SNMP_NODE_TREE, (oid) }, \\\n  0, NULL }\n\n/** SNMP leaf node */\nstruct snmp_leaf_node\n{\n  /** inherited \"base class\" members */\n  struct snmp_node node;\n  snmp_err_t (*get_instance)(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\n  snmp_err_t (*get_next_instance)(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\n};\n\n/** represents a single mib with its base oid and root node */\nstruct snmp_mib\n{\n  const u32_t *base_oid;\n  u8_t base_oid_len;\n  const struct snmp_node *root_node;\n};\n\n#define SNMP_MIB_CREATE(oid_list, root_node) { (oid_list), (u8_t)LWIP_ARRAYSIZE(oid_list), root_node }\n\n/** OID range structure */\nstruct snmp_oid_range\n{\n  u32_t min;\n  u32_t max;\n};\n\n/** checks if incoming OID length and values are in allowed ranges */\nu8_t snmp_oid_in_range(const u32_t *oid_in, u8_t oid_len, const struct snmp_oid_range *oid_ranges, u8_t oid_ranges_len);\n\ntypedef enum {\n  SNMP_NEXT_OID_STATUS_SUCCESS,\n  SNMP_NEXT_OID_STATUS_NO_MATCH,\n  SNMP_NEXT_OID_STATUS_BUF_TO_SMALL\n} snmp_next_oid_status_t;\n\n/** state for next_oid_init / next_oid_check functions */\nstruct snmp_next_oid_state\n{\n  const u32_t* start_oid;\n  u8_t start_oid_len;\n\n  u32_t* next_oid;\n  u8_t next_oid_len;\n  u8_t next_oid_max_len;\n\n  snmp_next_oid_status_t status;\n  void* reference;\n};\n\nvoid snmp_next_oid_init(struct snmp_next_oid_state *state,\n  const u32_t *start_oid, u8_t start_oid_len,\n  u32_t *next_oid_buf, u8_t next_oid_max_len);\nu8_t snmp_next_oid_precheck(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len);\nu8_t snmp_next_oid_check(struct snmp_next_oid_state *state, const u32_t *oid, const u8_t oid_len, void* reference);\n\nvoid snmp_oid_assign(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len);\nvoid snmp_oid_combine(struct snmp_obj_id* target, const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len);\nvoid snmp_oid_prefix(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len);\nvoid snmp_oid_append(struct snmp_obj_id* target, const u32_t *oid, u8_t oid_len);\nu8_t snmp_oid_equal(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len);\ns8_t snmp_oid_compare(const u32_t *oid1, u8_t oid1_len, const u32_t *oid2, u8_t oid2_len);\n\n#if LWIP_IPV4\nu8_t snmp_oid_to_ip4(const u32_t *oid, ip4_addr_t *ip);\nvoid snmp_ip4_to_oid(const ip4_addr_t *ip, u32_t *oid);\n#endif /* LWIP_IPV4 */\n#if LWIP_IPV6\nu8_t snmp_oid_to_ip6(const u32_t *oid, ip6_addr_t *ip);\nvoid snmp_ip6_to_oid(const ip6_addr_t *ip, u32_t *oid);\n#endif /* LWIP_IPV6 */\n#if LWIP_IPV4 || LWIP_IPV6\nu8_t snmp_ip_to_oid(const ip_addr_t *ip, u32_t *oid);\nu8_t snmp_ip_port_to_oid(const ip_addr_t *ip, u16_t port, u32_t *oid);\n\nu8_t snmp_oid_to_ip(const u32_t *oid, u8_t oid_len, ip_addr_t *ip);\nu8_t snmp_oid_to_ip_port(const u32_t *oid, u8_t oid_len, ip_addr_t *ip, u16_t *port);\n#endif /* LWIP_IPV4 || LWIP_IPV6 */\n\nstruct netif;\nu8_t netif_to_num(const struct netif *netif);\n\nsnmp_err_t snmp_set_test_ok(struct snmp_node_instance* instance, u16_t value_len, void* value); /* generic function which can be used if test is always successful */\n\nerr_t snmp_decode_bits(const u8_t *buf, u32_t buf_len, u32_t *bit_value);\nerr_t snmp_decode_truthvalue(const s32_t *asn1_value, u8_t *bool_value);\nu8_t  snmp_encode_bits(u8_t *buf, u32_t buf_len, u32_t bit_value, u8_t bit_count);\nu8_t  snmp_encode_truthvalue(s32_t *asn1_value, u32_t bool_value);\n\nstruct snmp_statistics\n{\n  u32_t inpkts;\n  u32_t outpkts;\n  u32_t inbadversions;\n  u32_t inbadcommunitynames;\n  u32_t inbadcommunityuses;\n  u32_t inasnparseerrs;\n  u32_t intoobigs;\n  u32_t innosuchnames;\n  u32_t inbadvalues;\n  u32_t inreadonlys;\n  u32_t ingenerrs;\n  u32_t intotalreqvars;\n  u32_t intotalsetvars;\n  u32_t ingetrequests;\n  u32_t ingetnexts;\n  u32_t insetrequests;\n  u32_t ingetresponses;\n  u32_t intraps;\n  u32_t outtoobigs;\n  u32_t outnosuchnames;\n  u32_t outbadvalues;\n  u32_t outgenerrs;\n  u32_t outgetrequests;\n  u32_t outgetnexts;\n  u32_t outsetrequests;\n  u32_t outgetresponses;\n  u32_t outtraps;\n};\n\nextern struct snmp_statistics snmp_stats;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_SNMP */\n\n#endif /* LWIP_HDR_APPS_SNMP_CORE_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/snmp_mib2.h",
    "content": "/**\n * @file\n * SNMP MIB2 API\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *\n */\n#ifndef LWIP_HDR_APPS_SNMP_MIB2_H\n#define LWIP_HDR_APPS_SNMP_MIB2_H\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n#if SNMP_LWIP_MIB2\n\n#include \"lwip/apps/snmp_core.h\"\n\nextern const struct snmp_mib mib2;\n\n#if SNMP_USE_NETCONN\n#include \"lwip/apps/snmp_threadsync.h\"\nvoid snmp_mib2_lwip_synchronizer(snmp_threadsync_called_fn fn, void* arg);\nextern struct snmp_threadsync_instance snmp_mib2_lwip_locks;\n#endif\n\n#ifndef SNMP_SYSSERVICES\n#define SNMP_SYSSERVICES ((1 << 6) | (1 << 3) | ((IP_FORWARD) << 2))\n#endif\n\nvoid snmp_mib2_set_sysdescr(const u8_t* str, const u16_t* len); /* read-only be defintion */\nvoid snmp_mib2_set_syscontact(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize);\nvoid snmp_mib2_set_syscontact_readonly(const u8_t *ocstr, const u16_t *ocstrlen);\nvoid snmp_mib2_set_sysname(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize);\nvoid snmp_mib2_set_sysname_readonly(const u8_t *ocstr, const u16_t *ocstrlen);\nvoid snmp_mib2_set_syslocation(u8_t *ocstr, u16_t *ocstrlen, u16_t bufsize);\nvoid snmp_mib2_set_syslocation_readonly(const u8_t *ocstr, const u16_t *ocstrlen);\n\n#endif /* SNMP_LWIP_MIB2 */\n#endif /* LWIP_SNMP */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_SNMP_MIB2_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/snmp_opts.h",
    "content": "/**\n * @file\n * SNMP server options list\n */\n\n/*\n * Copyright (c) 2015 Dirk Ziegelmeier\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Dirk Ziegelmeier\n *\n */\n#ifndef LWIP_HDR_SNMP_OPTS_H\n#define LWIP_HDR_SNMP_OPTS_H\n\n#include \"lwip/opt.h\"\n\n/**\n * @defgroup snmp_opts Options\n * @ingroup snmp\n * @{\n */\n\n/**\n * LWIP_SNMP==1: This enables the lwIP SNMP agent. UDP must be available\n * for SNMP transport.\n * If you want to use your own SNMP agent, leave this disabled.\n * To integrate MIB2 of an external agent, you need to enable\n * LWIP_MIB2_CALLBACKS and MIB2_STATS. This will give you the callbacks\n * and statistics counters you need to get MIB2 working.\n */\n#if !defined LWIP_SNMP || defined __DOXYGEN__\n#define LWIP_SNMP                       0\n#endif\n\n/**\n * SNMP_USE_NETCONN: Use netconn API instead of raw API.\n * Makes SNMP agent run in a worker thread, so blocking operations\n * can be done in MIB calls.\n */\n#if !defined SNMP_USE_NETCONN || defined __DOXYGEN__\n#define SNMP_USE_NETCONN           0\n#endif\n\n/**\n * SNMP_USE_RAW: Use raw API.\n * SNMP agent does not run in a worker thread, so blocking operations\n * should not be done in MIB calls.\n */\n#if !defined SNMP_USE_RAW || defined __DOXYGEN__\n#define SNMP_USE_RAW               1\n#endif\n\n#if SNMP_USE_NETCONN && SNMP_USE_RAW\n#error SNMP stack can use only one of the APIs {raw, netconn}\n#endif\n\n#if LWIP_SNMP && !SNMP_USE_NETCONN && !SNMP_USE_RAW\n#error SNMP stack needs a receive API and UDP {raw, netconn}\n#endif\n\n#if SNMP_USE_NETCONN\n/**\n * SNMP_STACK_SIZE: Stack size of SNMP netconn worker thread\n */\n#if !defined SNMP_STACK_SIZE || defined __DOXYGEN__\n#define SNMP_STACK_SIZE            DEFAULT_THREAD_STACKSIZE\n#endif\n\n/**\n * SNMP_THREAD_PRIO: SNMP netconn worker thread priority\n */\n#if !defined SNMP_THREAD_PRIO || defined __DOXYGEN__\n#define SNMP_THREAD_PRIO           DEFAULT_THREAD_PRIO\n#endif\n#endif /* SNMP_USE_NETCONN */\n\n/**\n * SNMP_TRAP_DESTINATIONS: Number of trap destinations. At least one trap\n * destination is required\n */\n#if !defined SNMP_TRAP_DESTINATIONS || defined __DOXYGEN__\n#define SNMP_TRAP_DESTINATIONS          1\n#endif\n\n/**\n * Only allow SNMP write actions that are 'safe' (e.g. disabling netifs is not\n * a safe action and disabled when SNMP_SAFE_REQUESTS = 1).\n * Unsafe requests are disabled by default!\n */\n#if !defined SNMP_SAFE_REQUESTS || defined __DOXYGEN__\n#define SNMP_SAFE_REQUESTS              1\n#endif\n\n/**\n * The maximum length of strings used.\n */\n#if !defined SNMP_MAX_OCTET_STRING_LEN || defined __DOXYGEN__\n#define SNMP_MAX_OCTET_STRING_LEN       127\n#endif\n\n/**\n * The maximum number of Sub ID's inside an object identifier.\n * Indirectly this also limits the maximum depth of SNMP tree.\n */\n#if !defined SNMP_MAX_OBJ_ID_LEN || defined __DOXYGEN__\n#define SNMP_MAX_OBJ_ID_LEN             50\n#endif\n\n#if !defined SNMP_MAX_VALUE_SIZE || defined __DOXYGEN__\n/**\n * The maximum size of a value.\n */\n#define SNMP_MIN_VALUE_SIZE             (2 * sizeof(u32_t*)) /* size required to store the basic types (8 bytes for counter64) */\n/**\n * The minimum size of a value.\n */\n#define SNMP_MAX_VALUE_SIZE             LWIP_MAX(LWIP_MAX((SNMP_MAX_OCTET_STRING_LEN), sizeof(u32_t)*(SNMP_MAX_OBJ_ID_LEN)), SNMP_MIN_VALUE_SIZE)\n#endif\n\n/**\n * The snmp read-access community. Used for write-access and traps, too\n * unless SNMP_COMMUNITY_WRITE or SNMP_COMMUNITY_TRAP are enabled, respectively.\n */\n#if !defined SNMP_COMMUNITY || defined __DOXYGEN__\n#define SNMP_COMMUNITY                  \"public\"\n#endif\n\n/**\n * The snmp write-access community.\n * Set this community to \"\" in order to disallow any write access.\n */\n#if !defined SNMP_COMMUNITY_WRITE || defined __DOXYGEN__\n#define SNMP_COMMUNITY_WRITE            \"private\"\n#endif\n\n/**\n * The snmp community used for sending traps.\n */\n#if !defined SNMP_COMMUNITY_TRAP || defined __DOXYGEN__\n#define SNMP_COMMUNITY_TRAP             \"public\"\n#endif\n\n/**\n * The maximum length of community string.\n * If community names shall be adjusted at runtime via snmp_set_community() calls,\n * enter here the possible maximum length (+1 for terminating null character).\n */\n#if !defined SNMP_MAX_COMMUNITY_STR_LEN || defined __DOXYGEN__\n#define SNMP_MAX_COMMUNITY_STR_LEN LWIP_MAX(LWIP_MAX(sizeof(SNMP_COMMUNITY), sizeof(SNMP_COMMUNITY_WRITE)), sizeof(SNMP_COMMUNITY_TRAP))\n#endif\n\n/**\n * The OID identifiying the device. This may be the enterprise OID itself or any OID located below it in tree.\n */\n#if !defined SNMP_DEVICE_ENTERPRISE_OID || defined __DOXYGEN__\n#define SNMP_LWIP_ENTERPRISE_OID 26381\n/**\n * IANA assigned enterprise ID for lwIP is 26381\n * @see http://www.iana.org/assignments/enterprise-numbers\n *\n * @note this enterprise ID is assigned to the lwIP project,\n * all object identifiers living under this ID are assigned\n * by the lwIP maintainers!\n * @note don't change this define, use snmp_set_device_enterprise_oid()\n *\n * If you need to create your own private MIB you'll need\n * to apply for your own enterprise ID with IANA:\n * http://www.iana.org/numbers.html\n */\n#define SNMP_DEVICE_ENTERPRISE_OID {1, 3, 6, 1, 4, 1, SNMP_LWIP_ENTERPRISE_OID}\n/**\n * Length of SNMP_DEVICE_ENTERPRISE_OID\n */\n#define SNMP_DEVICE_ENTERPRISE_OID_LEN 7\n#endif\n\n/**\n * SNMP_DEBUG: Enable debugging for SNMP messages.\n */\n#if !defined SNMP_DEBUG || defined __DOXYGEN__\n#define SNMP_DEBUG                      LWIP_DBG_OFF\n#endif\n\n/**\n * SNMP_MIB_DEBUG: Enable debugging for SNMP MIBs.\n */\n#if !defined SNMP_MIB_DEBUG || defined __DOXYGEN__\n#define SNMP_MIB_DEBUG                  LWIP_DBG_OFF\n#endif\n\n/**\n * Indicates if the MIB2 implementation of LWIP SNMP stack is used.\n */\n#if !defined SNMP_LWIP_MIB2 || defined __DOXYGEN__\n#define SNMP_LWIP_MIB2                      LWIP_SNMP\n#endif\n\n/**\n * Value return for sysDesc field of MIB2.\n */\n#if !defined SNMP_LWIP_MIB2_SYSDESC || defined __DOXYGEN__\n#define SNMP_LWIP_MIB2_SYSDESC              \"lwIP\"\n#endif\n\n/**\n * Value return for sysName field of MIB2.\n * To make sysName field settable, call snmp_mib2_set_sysname() to provide the necessary buffers.\n */\n#if !defined SNMP_LWIP_MIB2_SYSNAME || defined __DOXYGEN__\n#define SNMP_LWIP_MIB2_SYSNAME              \"FQDN-unk\"\n#endif\n\n/**\n * Value return for sysContact field of MIB2.\n * To make sysContact field settable, call snmp_mib2_set_syscontact() to provide the necessary buffers.\n */\n#if !defined SNMP_LWIP_MIB2_SYSCONTACT || defined __DOXYGEN__\n#define SNMP_LWIP_MIB2_SYSCONTACT           \"\"\n#endif\n\n/**\n * Value return for sysLocation field of MIB2.\n * To make sysLocation field settable, call snmp_mib2_set_syslocation() to provide the necessary buffers.\n */\n#if !defined SNMP_LWIP_MIB2_SYSLOCATION || defined __DOXYGEN__\n#define SNMP_LWIP_MIB2_SYSLOCATION          \"\"\n#endif\n\n/**\n * This value is used to limit the repetitions processed in GetBulk requests (value == 0 means no limitation).\n * This may be useful to limit the load for a single request.\n * According to SNMP RFC 1905 it is allowed to not return all requested variables from a GetBulk request if system load would be too high.\n * so the effect is that the client will do more requests to gather all data.\n * For the stack this could be useful in case that SNMP processing is done in TCP/IP thread. In this situation a request with many\n * repetitions could block the thread for a longer time. Setting limit here will keep the stack more responsive.\n */\n#if !defined SNMP_LWIP_GETBULK_MAX_REPETITIONS || defined __DOXYGEN__\n#define SNMP_LWIP_GETBULK_MAX_REPETITIONS 0\n#endif\n\n/**\n * @}\n */\n\n/*\n   ------------------------------------\n   ---------- SNMPv3 options ----------\n   ------------------------------------\n*/\n\n/**\n * LWIP_SNMP_V3==1: This enables EXPERIMENTAL SNMPv3 support. LWIP_SNMP must\n * also be enabled.\n * THIS IS UNDER DEVELOPMENT AND SHOULD NOT BE ENABLED IN PRODUCTS.\n */\n#ifndef LWIP_SNMP_V3\n#define LWIP_SNMP_V3               0\n#endif\n\n#ifndef LWIP_SNMP_V3_CRYPTO\n#define LWIP_SNMP_V3_CRYPTO        LWIP_SNMP_V3\n#endif\n\n#ifndef LWIP_SNMP_V3_MBEDTLS\n#define LWIP_SNMP_V3_MBEDTLS       LWIP_SNMP_V3\n#endif\n\n#endif /* LWIP_HDR_SNMP_OPTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/snmp_scalar.h",
    "content": "/**\n * @file\n * SNMP server MIB API to implement scalar nodes\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Martin Hentschel <info@cl-soft.de>\n *\n */\n\n#ifndef LWIP_HDR_APPS_SNMP_SCALAR_H\n#define LWIP_HDR_APPS_SNMP_SCALAR_H\n\n#include \"lwip/apps/snmp_opts.h\"\n#include \"lwip/apps/snmp_core.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n/** basic scalar node */\nstruct snmp_scalar_node\n{\n  /** inherited \"base class\" members */\n  struct snmp_leaf_node node;\n  u8_t asn1_type;\n  snmp_access_t access;\n  node_instance_get_value_method get_value;\n  node_instance_set_test_method set_test;\n  node_instance_set_value_method set_value;\n};\n\n\nsnmp_err_t snmp_scalar_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\nsnmp_err_t snmp_scalar_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\n\n#define SNMP_SCALAR_CREATE_NODE(oid, access, asn1_type, get_value_method, set_test_method, set_value_method) \\\n  {{{ SNMP_NODE_SCALAR, (oid) }, \\\n    snmp_scalar_get_instance, \\\n    snmp_scalar_get_next_instance }, \\\n    (asn1_type), (access), (get_value_method), (set_test_method), (set_value_method) }\n\n#define SNMP_SCALAR_CREATE_NODE_READONLY(oid, asn1_type, get_value_method) SNMP_SCALAR_CREATE_NODE(oid, SNMP_NODE_INSTANCE_READ_ONLY, asn1_type, get_value_method, NULL, NULL)\n\n/** scalar array node - a tree node which contains scalars only as children */\nstruct snmp_scalar_array_node_def\n{\n  u32_t         oid;\n  u8_t          asn1_type;\n  snmp_access_t access;\n};\n\ntypedef s16_t (*snmp_scalar_array_get_value_method)(const struct snmp_scalar_array_node_def*, void*);\ntypedef snmp_err_t (*snmp_scalar_array_set_test_method)(const struct snmp_scalar_array_node_def*, u16_t, void*);\ntypedef snmp_err_t (*snmp_scalar_array_set_value_method)(const struct snmp_scalar_array_node_def*, u16_t, void*);\n\n/** basic scalar array node */\nstruct snmp_scalar_array_node\n{\n  /** inherited \"base class\" members */\n  struct snmp_leaf_node node;\n  u16_t array_node_count;\n  const struct snmp_scalar_array_node_def* array_nodes;\n  snmp_scalar_array_get_value_method get_value;\n  snmp_scalar_array_set_test_method set_test;\n  snmp_scalar_array_set_value_method set_value;\n};\n\nsnmp_err_t snmp_scalar_array_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\nsnmp_err_t snmp_scalar_array_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\n\n#define SNMP_SCALAR_CREATE_ARRAY_NODE(oid, array_nodes, get_value_method, set_test_method, set_value_method) \\\n  {{{ SNMP_NODE_SCALAR_ARRAY, (oid) }, \\\n    snmp_scalar_array_get_instance, \\\n    snmp_scalar_array_get_next_instance }, \\\n    (u16_t)LWIP_ARRAYSIZE(array_nodes), (array_nodes), (get_value_method), (set_test_method), (set_value_method) }\n\n#endif /* LWIP_SNMP */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_SNMP_SCALAR_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/snmp_table.h",
    "content": "/**\n * @file\n * SNMP server MIB API to implement table nodes\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Martin Hentschel <info@cl-soft.de>\n *\n */\n\n#ifndef LWIP_HDR_APPS_SNMP_TABLE_H\n#define LWIP_HDR_APPS_SNMP_TABLE_H\n\n#include \"lwip/apps/snmp_opts.h\"\n#include \"lwip/apps/snmp_core.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n/** default (customizable) read/write table */\nstruct snmp_table_col_def\n{\n  u32_t index;\n  u8_t asn1_type;\n  snmp_access_t access;\n};\n\n/** table node */\nstruct snmp_table_node\n{\n  /** inherited \"base class\" members */\n  struct snmp_leaf_node node;\n  u16_t column_count;\n  const struct snmp_table_col_def* columns;\n  snmp_err_t (*get_cell_instance)(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, struct snmp_node_instance* cell_instance);\n  snmp_err_t (*get_next_cell_instance)(const u32_t* column, struct snmp_obj_id* row_oid, struct snmp_node_instance* cell_instance);\n  /** returns object value for the given object identifier */\n  node_instance_get_value_method get_value;\n  /** tests length and/or range BEFORE setting */\n  node_instance_set_test_method set_test;\n  /** sets object value, only called when set_test() was successful */\n  node_instance_set_value_method set_value;\n};\n\nsnmp_err_t snmp_table_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\nsnmp_err_t snmp_table_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\n\n#define SNMP_TABLE_CREATE(oid, columns, get_cell_instance_method, get_next_cell_instance_method, get_value_method, set_test_method, set_value_method) \\\n  {{{ SNMP_NODE_TABLE, (oid) }, \\\n  snmp_table_get_instance, \\\n  snmp_table_get_next_instance }, \\\n  (u16_t)LWIP_ARRAYSIZE(columns), (columns), \\\n  (get_cell_instance_method), (get_next_cell_instance_method), \\\n  (get_value_method), (set_test_method), (set_value_method)}\n\n#define SNMP_TABLE_GET_COLUMN_FROM_OID(oid) ((oid)[1]) /* first array value is (fixed) row entry (fixed to 1) and 2nd value is column, follow3ed by instance */\n\n\n/** simple read-only table */\ntypedef enum {\n  SNMP_VARIANT_VALUE_TYPE_U32,\n  SNMP_VARIANT_VALUE_TYPE_S32,\n  SNMP_VARIANT_VALUE_TYPE_PTR,\n  SNMP_VARIANT_VALUE_TYPE_CONST_PTR\n} snmp_table_column_data_type_t;\n\nstruct snmp_table_simple_col_def\n{\n  u32_t index;\n  u8_t asn1_type;\n  snmp_table_column_data_type_t data_type; /* depending of what union member is used to store the value*/\n};\n\n/** simple read-only table node */\nstruct snmp_table_simple_node\n{\n  /* inherited \"base class\" members */\n  struct snmp_leaf_node node;\n  u16_t column_count;\n  const struct snmp_table_simple_col_def* columns;\n  snmp_err_t (*get_cell_value)(const u32_t* column, const u32_t* row_oid, u8_t row_oid_len, union snmp_variant_value* value, u32_t* value_len);\n  snmp_err_t (*get_next_cell_instance_and_value)(const u32_t* column, struct snmp_obj_id* row_oid, union snmp_variant_value* value, u32_t* value_len);\n};\n\nsnmp_err_t snmp_table_simple_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\nsnmp_err_t snmp_table_simple_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\n\n#define SNMP_TABLE_CREATE_SIMPLE(oid, columns, get_cell_value_method, get_next_cell_instance_and_value_method) \\\n  {{{ SNMP_NODE_TABLE, (oid) }, \\\n  snmp_table_simple_get_instance, \\\n  snmp_table_simple_get_next_instance }, \\\n  (u16_t)LWIP_ARRAYSIZE(columns), (columns), (get_cell_value_method), (get_next_cell_instance_and_value_method) }\n\ns16_t snmp_table_extract_value_from_s32ref(struct snmp_node_instance* instance, void* value);\ns16_t snmp_table_extract_value_from_u32ref(struct snmp_node_instance* instance, void* value);\ns16_t snmp_table_extract_value_from_refconstptr(struct snmp_node_instance* instance, void* value);\n\n#endif /* LWIP_SNMP */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_SNMP_TABLE_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/snmp_threadsync.h",
    "content": "/**\n * @file\n * SNMP server MIB API to implement thread synchronization\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *\n */\n\n#ifndef LWIP_HDR_APPS_SNMP_THREADSYNC_H\n#define LWIP_HDR_APPS_SNMP_THREADSYNC_H\n\n#include \"lwip/apps/snmp_opts.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_SNMP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/apps/snmp_core.h\"\n#include \"lwip/sys.h\"\n\ntypedef void (*snmp_threadsync_called_fn)(void* arg);\ntypedef void (*snmp_threadsync_synchronizer_fn)(snmp_threadsync_called_fn fn, void* arg);\n\n\n/** Thread sync runtime data. For internal usage only. */\nstruct threadsync_data\n{\n  union {\n    snmp_err_t err;\n    s16_t s16;\n  } retval;\n  union {\n    const u32_t *root_oid;\n    void *value;\n  } arg1;\n  union {\n    u8_t root_oid_len;\n    u16_t len;\n  } arg2;\n  const struct snmp_threadsync_node *threadsync_node;\n  struct snmp_node_instance proxy_instance;\n};\n\n/** Thread sync instance. Needed EXCATLY once for every thread to be synced into. */\nstruct snmp_threadsync_instance\n{\n  sys_sem_t                       sem;\n  sys_mutex_t                     sem_usage_mutex;\n  snmp_threadsync_synchronizer_fn sync_fn;\n  struct threadsync_data          data;\n};\n\n/** SNMP thread sync proxy leaf node */\nstruct snmp_threadsync_node\n{\n  /* inherited \"base class\" members */\n  struct snmp_leaf_node           node;\n\n  const struct snmp_leaf_node     *target;\n  struct snmp_threadsync_instance *instance;\n};\n\nsnmp_err_t snmp_threadsync_get_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\nsnmp_err_t snmp_threadsync_get_next_instance(const u32_t *root_oid, u8_t root_oid_len, struct snmp_node_instance* instance);\n\n/** Create thread sync proxy node */\n#define SNMP_CREATE_THREAD_SYNC_NODE(oid, target_leaf_node, threadsync_instance) \\\n  {{{ SNMP_NODE_THREADSYNC, (oid) }, \\\n    snmp_threadsync_get_instance, \\\n    snmp_threadsync_get_next_instance }, \\\n    (target_leaf_node), \\\n    (threadsync_instance) }\n\n/** Create thread sync instance data */\nvoid snmp_threadsync_init(struct snmp_threadsync_instance *instance, snmp_threadsync_synchronizer_fn sync_fn);\n\n#endif /* LWIP_SNMP */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_SNMP_THREADSYNC_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/snmpv3.h",
    "content": "/**\n * @file\n * Additional SNMPv3 functionality RFC3414 and RFC3826.\n */\n\n/*\n * Copyright (c) 2016 Elias Oenal.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Elias Oenal <lwip@eliasoenal.com>\n */\n\n#ifndef LWIP_HDR_APPS_SNMP_V3_H\n#define LWIP_HDR_APPS_SNMP_V3_H\n\n#include \"lwip/apps/snmp_opts.h\"\n#include \"lwip/err.h\"\n\n#if LWIP_SNMP && LWIP_SNMP_V3\n\n#define SNMP_V3_AUTH_ALGO_INVAL  0\n#define SNMP_V3_AUTH_ALGO_MD5    1\n#define SNMP_V3_AUTH_ALGO_SHA    2\n\n#define SNMP_V3_PRIV_ALGO_INVAL  0\n#define SNMP_V3_PRIV_ALGO_DES    1\n#define SNMP_V3_PRIV_ALGO_AES    2\n\n#define SNMP_V3_PRIV_MODE_DECRYPT  0\n#define SNMP_V3_PRIV_MODE_ENCRYPT  1\n\n/*\n * The following callback functions must be implemented by the application.\n * There is a dummy implementation in snmpv3_dummy.c.\n */\n\nvoid snmpv3_get_engine_id(const char **id, u8_t *len);\nerr_t snmpv3_set_engine_id(const char* id, u8_t len);\n\nu32_t snmpv3_get_engine_boots(void);\nvoid snmpv3_set_engine_boots(u32_t boots);\n\nu32_t snmpv3_get_engine_time(void);\nvoid snmpv3_reset_engine_time(void);\n\nerr_t snmpv3_get_user(const char* username, u8_t *auth_algo, u8_t *auth_key, u8_t *priv_algo, u8_t *priv_key);\n\n/* The following functions are provided by the SNMPv3 agent */\n\nvoid snmpv3_engine_id_changed(void);\n\nvoid snmpv3_password_to_key_md5(\n    const u8_t *password,     /* IN */\n    u8_t        passwordlen,  /* IN */\n    const u8_t *engineID,     /* IN  - pointer to snmpEngineID  */\n    u8_t        engineLength, /* IN  - length of snmpEngineID */\n    u8_t       *key);         /* OUT - pointer to caller 16-octet buffer */\n\nvoid snmpv3_password_to_key_sha(\n    const u8_t *password,     /* IN */\n    u8_t        passwordlen,  /* IN */\n    const u8_t *engineID,     /* IN  - pointer to snmpEngineID  */\n    u8_t        engineLength, /* IN  - length of snmpEngineID */\n    u8_t       *key);         /* OUT - pointer to caller 20-octet buffer */\n\n#endif\n\n#endif /* LWIP_HDR_APPS_SNMP_V3_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/sntp.h",
    "content": "/**\n * @file\n * SNTP client API\n */\n\n/*\n * Copyright (c) 2007-2009 Frédéric Bernon, Simon Goldschmidt\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Frédéric Bernon, Simon Goldschmidt\n *\n */\n#ifndef LWIP_HDR_APPS_SNTP_H\n#define LWIP_HDR_APPS_SNTP_H\n\n#include \"lwip/apps/sntp_opts.h\"\n#include \"lwip/ip_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* SNTP operating modes: default is to poll using unicast.\n   The mode has to be set before calling sntp_init(). */\n#define SNTP_OPMODE_POLL            0\n#define SNTP_OPMODE_LISTENONLY      1\nvoid sntp_setoperatingmode(u8_t operating_mode);\nu8_t sntp_getoperatingmode(void);\n\nvoid sntp_init(void);\nvoid sntp_stop(void);\nu8_t sntp_enabled(void);\n\nvoid sntp_setserver(u8_t idx, const ip_addr_t *addr);\nconst ip_addr_t* sntp_getserver(u8_t idx);\n\n#if SNTP_SERVER_DNS\nvoid sntp_setservername(u8_t idx, char *server);\nchar *sntp_getservername(u8_t idx);\n#endif /* SNTP_SERVER_DNS */\n\n#if SNTP_GET_SERVERS_FROM_DHCP\nvoid sntp_servermode_dhcp(int set_servers_from_dhcp);\n#else /* SNTP_GET_SERVERS_FROM_DHCP */\n#define sntp_servermode_dhcp(x)\n#endif /* SNTP_GET_SERVERS_FROM_DHCP */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_SNTP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/sntp_opts.h",
    "content": "/**\n * @file\n * SNTP client options list\n */\n\n/*\n * Copyright (c) 2007-2009 Frédéric Bernon, Simon Goldschmidt\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Frédéric Bernon, Simon Goldschmidt\n *\n */\n#ifndef LWIP_HDR_APPS_SNTP_OPTS_H\n#define LWIP_HDR_APPS_SNTP_OPTS_H\n\n#include \"lwip/opt.h\"\n\n/**\n * @defgroup sntp_opts Options\n * @ingroup sntp\n * @{\n */\n\n/** SNTP macro to change system time in seconds\n * Define SNTP_SET_SYSTEM_TIME_US(sec, us) to set the time in microseconds instead of this one\n * if you need the additional precision.\n */\n#if !defined SNTP_SET_SYSTEM_TIME || defined __DOXYGEN__\n#define SNTP_SET_SYSTEM_TIME(sec)   LWIP_UNUSED_ARG(sec)\n#endif\n\n/** The maximum number of SNTP servers that can be set */\n#if !defined SNTP_MAX_SERVERS || defined __DOXYGEN__\n#define SNTP_MAX_SERVERS           LWIP_DHCP_MAX_NTP_SERVERS\n#endif\n\n/** Set this to 1 to implement the callback function called by dhcp when\n * NTP servers are received. */\n#if !defined SNTP_GET_SERVERS_FROM_DHCP || defined __DOXYGEN__\n#define SNTP_GET_SERVERS_FROM_DHCP LWIP_DHCP_GET_NTP_SRV\n#endif\n\n/** Set this to 1 to support DNS names (or IP address strings) to set sntp servers\n * One server address/name can be defined as default if SNTP_SERVER_DNS == 1:\n * \\#define SNTP_SERVER_ADDRESS \"pool.ntp.org\"\n */\n#if !defined SNTP_SERVER_DNS || defined __DOXYGEN__\n#define SNTP_SERVER_DNS            0\n#endif\n\n/**\n * SNTP_DEBUG: Enable debugging for SNTP.\n */\n#if !defined SNTP_DEBUG || defined __DOXYGEN__\n#define SNTP_DEBUG                  LWIP_DBG_OFF\n#endif\n\n/** SNTP server port */\n#if !defined SNTP_PORT || defined __DOXYGEN__\n#define SNTP_PORT                   123\n#endif\n\n/** Set this to 1 to allow config of SNTP server(s) by DNS name */\n#if !defined SNTP_SERVER_DNS || defined __DOXYGEN__\n#define SNTP_SERVER_DNS             0\n#endif\n\n/** Sanity check:\n * Define this to\n * - 0 to turn off sanity checks (default; smaller code)\n * - >= 1 to check address and port of the response packet to ensure the\n *        response comes from the server we sent the request to.\n * - >= 2 to check returned Originate Timestamp against Transmit Timestamp\n *        sent to the server (to ensure response to older request).\n * - >= 3 @todo: discard reply if any of the LI, Stratum, or Transmit Timestamp\n *        fields is 0 or the Mode field is not 4 (unicast) or 5 (broadcast).\n * - >= 4 @todo: to check that the Root Delay and Root Dispersion fields are each\n *        greater than or equal to 0 and less than infinity, where infinity is\n *        currently a cozy number like one second. This check avoids using a\n *        server whose synchronization source has expired for a very long time.\n */\n#if !defined SNTP_CHECK_RESPONSE || defined __DOXYGEN__\n#define SNTP_CHECK_RESPONSE         0\n#endif\n\n/** According to the RFC, this shall be a random delay\n * between 1 and 5 minutes (in milliseconds) to prevent load peaks.\n * This can be defined to a random generation function,\n * which must return the delay in milliseconds as u32_t.\n * Turned off by default.\n */\n#if !defined SNTP_STARTUP_DELAY || defined __DOXYGEN__\n#define SNTP_STARTUP_DELAY          0\n#endif\n\n/** If you want the startup delay to be a function, define this\n * to a function (including the brackets) and define SNTP_STARTUP_DELAY to 1.\n */\n#if !defined SNTP_STARTUP_DELAY_FUNC || defined __DOXYGEN__\n#define SNTP_STARTUP_DELAY_FUNC     SNTP_STARTUP_DELAY\n#endif\n\n/** SNTP receive timeout - in milliseconds\n * Also used as retry timeout - this shouldn't be too low.\n * Default is 3 seconds.\n */\n#if !defined SNTP_RECV_TIMEOUT || defined __DOXYGEN__\n#define SNTP_RECV_TIMEOUT           3000\n#endif\n\n/** SNTP update delay - in milliseconds\n * Default is 1 hour. Must not be beolw 15 seconds by specification (i.e. 15000)\n */\n#if !defined SNTP_UPDATE_DELAY || defined __DOXYGEN__\n#define SNTP_UPDATE_DELAY           3600000\n#endif\n\n/** SNTP macro to get system time, used with SNTP_CHECK_RESPONSE >= 2\n * to send in request and compare in response.\n */\n#if !defined SNTP_GET_SYSTEM_TIME || defined __DOXYGEN__\n#define SNTP_GET_SYSTEM_TIME(sec, us)     do { (sec) = 0; (us) = 0; } while(0)\n#endif\n\n/** Default retry timeout (in milliseconds) if the response\n * received is invalid.\n * This is doubled with each retry until SNTP_RETRY_TIMEOUT_MAX is reached.\n */\n#if !defined SNTP_RETRY_TIMEOUT || defined __DOXYGEN__\n#define SNTP_RETRY_TIMEOUT          SNTP_RECV_TIMEOUT\n#endif\n\n/** Maximum retry timeout (in milliseconds). */\n#if !defined SNTP_RETRY_TIMEOUT_MAX || defined __DOXYGEN__\n#define SNTP_RETRY_TIMEOUT_MAX      (SNTP_RETRY_TIMEOUT * 10)\n#endif\n\n/** Increase retry timeout with every retry sent\n * Default is on to conform to RFC.\n */\n#if !defined SNTP_RETRY_TIMEOUT_EXP || defined __DOXYGEN__\n#define SNTP_RETRY_TIMEOUT_EXP      1\n#endif\n\n/**\n * @}\n */\n\n#endif /* LWIP_HDR_APPS_SNTP_OPTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/tftp_opts.h",
    "content": "/****************************************************************//**\n *\n * @file tftp_opts.h\n *\n * @author   Logan Gunthorpe <logang@deltatee.com>\n *\n * @brief    Trivial File Transfer Protocol (RFC 1350) implementation options\n *\n * Copyright (c) Deltatee Enterprises Ltd. 2013\n * All rights reserved.\n *\n ********************************************************************/\n\n/* \n * Redistribution and use in source and binary forms, with or without\n * modification,are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Author: Logan Gunthorpe <logang@deltatee.com>\n *\n */\n\n#ifndef LWIP_HDR_APPS_TFTP_OPTS_H\n#define LWIP_HDR_APPS_TFTP_OPTS_H\n\n#include \"lwip/opt.h\"\n\n/**\n * @defgroup tftp_opts Options\n * @ingroup tftp\n * @{\n */\n\n/**\n * Enable TFTP debug messages\n */\n#if !defined TFTP_DEBUG || defined __DOXYGEN__\n#define TFTP_DEBUG            LWIP_DBG_ON\n#endif\n\n/**\n * TFTP server port\n */\n#if !defined TFTP_PORT || defined __DOXYGEN__\n#define TFTP_PORT             69\n#endif\n\n/**\n * TFTP timeout\n */\n#if !defined TFTP_TIMEOUT_MSECS || defined __DOXYGEN__\n#define TFTP_TIMEOUT_MSECS    10000\n#endif\n\n/**\n * Max. number of retries when a file is read from server\n */\n#if !defined TFTP_MAX_RETRIES || defined __DOXYGEN__\n#define TFTP_MAX_RETRIES      5\n#endif\n\n/**\n * TFTP timer cyclic interval\n */\n#if !defined TFTP_TIMER_MSECS || defined __DOXYGEN__\n#define TFTP_TIMER_MSECS      50\n#endif\n\n/**\n * Max. length of TFTP filename\n */\n#if !defined TFTP_MAX_FILENAME_LEN || defined __DOXYGEN__\n#define TFTP_MAX_FILENAME_LEN 20\n#endif\n\n/**\n * Max. length of TFTP mode\n */\n#if !defined TFTP_MAX_MODE_LEN || defined __DOXYGEN__\n#define TFTP_MAX_MODE_LEN     7\n#endif\n\n/**\n * @}\n */\n\n#endif /* LWIP_HDR_APPS_TFTP_OPTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/apps/tftp_server.h",
    "content": "/****************************************************************//**\n *\n * @file tftp_server.h\n *\n * @author   Logan Gunthorpe <logang@deltatee.com>\n *\n * @brief    Trivial File Transfer Protocol (RFC 1350)\n *\n * Copyright (c) Deltatee Enterprises Ltd. 2013\n * All rights reserved.\n *\n ********************************************************************/\n\n/* \n * Redistribution and use in source and binary forms, with or without\n * modification,are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Author: Logan Gunthorpe <logang@deltatee.com>\n *\n */\n\n#ifndef LWIP_HDR_APPS_TFTP_SERVER_H\n#define LWIP_HDR_APPS_TFTP_SERVER_H\n\n#include \"lwip/apps/tftp_opts.h\"\n#include \"lwip/err.h\"\n#include \"lwip/pbuf.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @ingroup tftp\n * TFTP context containing callback functions for TFTP transfers\n */\nstruct tftp_context {\n  /**\n   * Open file for read/write.\n   * @param fname Filename\n   * @param mode Mode string from TFTP RFC 1350 (netascii, octet, mail)\n   * @param write Flag indicating read (0) or write (!= 0) access\n   * @returns File handle supplied to other functions\n   */\n  void* (*open)(const char* fname, const char* mode, u8_t write);\n  /**\n   * Close file handle\n   * @param handle File handle returned by open()\n   */\n  void (*close)(void* handle);\n  /**\n   * Read from file \n   * @param handle File handle returned by open()\n   * @param buf Target buffer to copy read data to\n   * @param bytes Number of bytes to copy to buf\n   * @returns &gt;= 0: Success; &lt; 0: Error\n   */\n  int (*read)(void* handle, void* buf, int bytes);\n  /**\n   * Write to file\n   * @param handle File handle returned by open()\n   * @param pbuf PBUF adjusted such that payload pointer points\n   *             to the beginning of write data. In other words,\n   *             TFTP headers are stripped off.\n   * @returns &gt;= 0: Success; &lt; 0: Error\n   */\n  int (*write)(void* handle, struct pbuf* p);\n};\n\nerr_t tftp_init(const struct tftp_context* ctx);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_APPS_TFTP_SERVER_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/arch.h",
    "content": "/**\n * @file\n * Support for different processor and compiler architectures\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_ARCH_H\n#define LWIP_HDR_ARCH_H\n\n#ifndef LITTLE_ENDIAN\n#define LITTLE_ENDIAN 1234\n#endif\n\n#ifndef BIG_ENDIAN\n#define BIG_ENDIAN 4321\n#endif\n\n#include \"arch/cc.h\"\n\n/**\n * @defgroup compiler_abstraction Compiler/platform abstraction\n * @ingroup sys_layer\n * All defines related to this section must not be placed in lwipopts.h,\n * but in arch/cc.h!\n * These options cannot be \\#defined in lwipopts.h since they are not options\n * of lwIP itself, but options of the lwIP port to your system.\n * @{\n */\n\n/** Define the byte order of the system.\n * Needed for conversion of network data to host byte order.\n * Allowed values: LITTLE_ENDIAN and BIG_ENDIAN\n */\n#ifndef BYTE_ORDER\n#define BYTE_ORDER LITTLE_ENDIAN\n#endif\n\n/** Define random number generator function of your system */\n#ifdef __DOXYGEN__\n#define LWIP_RAND() ((u32_t)rand())\n#endif\n\n/** Platform specific diagnostic output.\\n\n * Note the default implementation pulls in printf, which may\n * in turn pull in a lot of standard libary code. In resource-constrained \n * systems, this should be defined to something less resource-consuming.\n */\n#ifndef LWIP_PLATFORM_DIAG\n#define LWIP_PLATFORM_DIAG(x) do {printf x;} while(0)\n#include <stdio.h>\n#include <stdlib.h>\n#endif\n\n/** Platform specific assertion handling.\\n\n * Note the default implementation pulls in printf, fflush and abort, which may\n * in turn pull in a lot of standard libary code. In resource-constrained \n * systems, this should be defined to something less resource-consuming.\n */\n#ifndef LWIP_PLATFORM_ASSERT\n#define LWIP_PLATFORM_ASSERT(x) do {printf(\"Assertion \\\"%s\\\" failed at line %d in %s\\n\", \\\n                                     x, __LINE__, __FILE__); fflush(NULL); abort();} while(0)\n#include <stdio.h>\n#include <stdlib.h>\n#endif\n\n/** Define this to 1 in arch/cc.h of your port if you do not want to\n * include stddef.h header to get size_t. You need to typedef size_t\n * by yourself in this case.\n */\n#ifndef LWIP_NO_STDDEF_H\n#define LWIP_NO_STDDEF_H 0\n#endif\n\n#if !LWIP_NO_STDDEF_H\n#include <stddef.h> /* for size_t */\n#endif\n\n/** Define this to 1 in arch/cc.h of your port if your compiler does not provide\n * the stdint.h header. You need to typedef the generic types listed in\n * lwip/arch.h yourself in this case (u8_t, u16_t...).\n */\n#ifndef LWIP_NO_STDINT_H\n#define LWIP_NO_STDINT_H 1\n#endif\n\n/* Define generic types used in lwIP */\n#if !LWIP_NO_STDINT_H\n#include <stdint.h>\ntypedef uint8_t   u8_t;\ntypedef int8_t    s8_t;\ntypedef uint16_t  u16_t;\ntypedef int16_t   s16_t;\ntypedef uint32_t  u32_t;\ntypedef int32_t   s32_t;\ntypedef uintptr_t mem_ptr_t;\n#endif\n\n/** Define this to 1 in arch/cc.h of your port if your compiler does not provide\n * the inttypes.h header. You need to define the format strings listed in\n * lwip/arch.h yourself in this case (X8_F, U16_F...).\n */\n#ifndef LWIP_NO_INTTYPES_H\n#define LWIP_NO_INTTYPES_H 0\n#endif\n\n/* Define (sn)printf formatters for these lwIP types */\n#if !LWIP_NO_INTTYPES_H\n#include <inttypes.h>\n#ifndef X8_F\n#define X8_F  \"02\" PRIx8\n#endif\n#ifndef U16_F\n#define U16_F PRIu16\n#endif\n#ifndef S16_F\n#define S16_F PRId16\n#endif\n#ifndef X16_F\n#define X16_F PRIx16\n#endif\n#ifndef U32_F\n#define U32_F PRIu32\n#endif\n#ifndef S32_F\n#define S32_F PRId32\n#endif\n#ifndef X32_F\n#define X32_F PRIx32\n#endif\n#ifndef SZT_F\n#define SZT_F PRIuPTR\n#endif\n#endif\n\n/** Define this to 1 in arch/cc.h of your port if your compiler does not provide\n * the limits.h header. You need to define the type limits yourself in this case\n * (e.g. INT_MAX).\n */\n#ifndef LWIP_NO_LIMITS_H\n#define LWIP_NO_LIMITS_H 0\n#endif\n\n/* Include limits.h? */\n#if !LWIP_NO_LIMITS_H\n#include <limits.h>\n#endif\n\n/** C++ const_cast<target_type>(val) equivalent to remove constness from a value (GCC -Wcast-qual) */\n#ifndef LWIP_CONST_CAST\n#define LWIP_CONST_CAST(target_type, val) ((target_type)((ptrdiff_t)val))\n#endif\n\n/** Get rid of alignment cast warnings (GCC -Wcast-align) */\n#ifndef LWIP_ALIGNMENT_CAST\n#define LWIP_ALIGNMENT_CAST(target_type, val) LWIP_CONST_CAST(target_type, val)\n#endif\n\n/** Get rid of warnings related to pointer-to-numeric and vice-versa casts,\n * e.g. \"conversion from 'u8_t' to 'void *' of greater size\"\n */\n#ifndef LWIP_PTR_NUMERIC_CAST\n#define LWIP_PTR_NUMERIC_CAST(target_type, val) LWIP_CONST_CAST(target_type, val)\n#endif\n\n/** Allocates a memory buffer of specified size that is of sufficient size to align\n * its start address using LWIP_MEM_ALIGN.\n * You can declare your own version here e.g. to enforce alignment without adding\n * trailing padding bytes (see LWIP_MEM_ALIGN_BUFFER) or your own section placement\n * requirements.\\n\n * e.g. if you use gcc and need 32 bit alignment:\\n\n * \\#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[size] \\_\\_attribute\\_\\_((aligned(4)))\\n\n * or more portable:\\n\n * \\#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u32_t variable_name[(size + sizeof(u32_t) - 1) / sizeof(u32_t)]\n */\n#ifndef LWIP_DECLARE_MEMORY_ALIGNED\n#define LWIP_DECLARE_MEMORY_ALIGNED(variable_name, size) u8_t variable_name[LWIP_MEM_ALIGN_BUFFER(size)]\n#endif\n\n/** Calculate memory size for an aligned buffer - returns the next highest\n * multiple of MEM_ALIGNMENT (e.g. LWIP_MEM_ALIGN_SIZE(3) and\n * LWIP_MEM_ALIGN_SIZE(4) will both yield 4 for MEM_ALIGNMENT == 4).\n */\n#ifndef LWIP_MEM_ALIGN_SIZE\n#define LWIP_MEM_ALIGN_SIZE(size) (((size) + MEM_ALIGNMENT - 1U) & ~(MEM_ALIGNMENT-1U))\n#endif\n\n/** Calculate safe memory size for an aligned buffer when using an unaligned\n * type as storage. This includes a safety-margin on (MEM_ALIGNMENT - 1) at the\n * start (e.g. if buffer is u8_t[] and actual data will be u32_t*)\n */\n#ifndef LWIP_MEM_ALIGN_BUFFER\n#define LWIP_MEM_ALIGN_BUFFER(size) (((size) + MEM_ALIGNMENT - 1U))\n#endif\n\n/** Align a memory pointer to the alignment defined by MEM_ALIGNMENT\n * so that ADDR % MEM_ALIGNMENT == 0\n */\n#ifndef LWIP_MEM_ALIGN\n#define LWIP_MEM_ALIGN(addr) ((void *)(((mem_ptr_t)(addr) + MEM_ALIGNMENT - 1) & ~(mem_ptr_t)(MEM_ALIGNMENT-1)))\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** Packed structs support.\n  * Placed BEFORE declaration of a packed struct.\\n\n  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\\n\n  * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.\n  */\n#ifndef PACK_STRUCT_BEGIN\n#define PACK_STRUCT_BEGIN\n#endif /* PACK_STRUCT_BEGIN */\n\n/** Packed structs support.\n  * Placed AFTER declaration of a packed struct.\\n\n  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\\n\n  * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.\n  */\n#ifndef PACK_STRUCT_END\n#define PACK_STRUCT_END\n#endif /* PACK_STRUCT_END */\n\n/** Packed structs support.\n  * Placed between end of declaration of a packed struct and trailing semicolon.\\n\n  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\\n\n  * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.\n  */\n#ifndef PACK_STRUCT_STRUCT\n#if defined(__GNUC__) || defined(__clang__)\n#define PACK_STRUCT_STRUCT __attribute__((packed))\n#else\n#define PACK_STRUCT_STRUCT\n#endif\n#endif /* PACK_STRUCT_STRUCT */\n\n/** Packed structs support.\n  * Wraps u32_t and u16_t members.\\n\n  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\\n\n  * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.\n  */\n#ifndef PACK_STRUCT_FIELD\n#define PACK_STRUCT_FIELD(x) x\n#endif /* PACK_STRUCT_FIELD */\n\n/** Packed structs support.\n  * Wraps u8_t members, where some compilers warn that packing is not necessary.\\n\n  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\\n\n  * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.\n  */\n#ifndef PACK_STRUCT_FLD_8\n#define PACK_STRUCT_FLD_8(x) PACK_STRUCT_FIELD(x)\n#endif /* PACK_STRUCT_FLD_8 */\n\n/** Packed structs support.\n  * Wraps members that are packed structs themselves, where some compilers warn that packing is not necessary.\\n\n  * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\\n\n  * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.\n  */\n#ifndef PACK_STRUCT_FLD_S\n#define PACK_STRUCT_FLD_S(x) PACK_STRUCT_FIELD(x)\n#endif /* PACK_STRUCT_FLD_S */\n\n/** Packed structs support using \\#include files before and after struct to be packed.\\n\n * The file included BEFORE the struct is \"arch/bpstruct.h\".\\n\n * The file included AFTER the struct is \"arch/epstruct.h\".\\n\n * This can be used to implement struct packing on MS Visual C compilers, see\n * the Win32 port in the lwIP contrib repository for reference.\n * For examples of packed struct declarations, see include/lwip/prot/ subfolder.\\n\n * A port to GCC/clang is included in lwIP, if you use these compilers there is nothing to do here.\n */\n#ifdef __DOXYGEN__\n#define PACK_STRUCT_USE_INCLUDES\n#endif\n\n/** Eliminates compiler warning about unused arguments (GCC -Wextra -Wunused). */\n#ifndef LWIP_UNUSED_ARG\n#define LWIP_UNUSED_ARG(x) (void)x\n#endif /* LWIP_UNUSED_ARG */\n\n/**\n * @}\n */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_ARCH_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/autoip.h",
    "content": "/**\n * @file\n *\n * AutoIP Automatic LinkLocal IP Configuration\n */\n\n/*\n *\n * Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dominik Spies <kontakt@dspies.de>\n *\n * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform\n * with RFC 3927.\n *\n */\n\n#ifndef LWIP_HDR_AUTOIP_H\n#define LWIP_HDR_AUTOIP_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV4 && LWIP_AUTOIP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/netif.h\"\n/* #include \"lwip/udp.h\" */\n#include \"lwip/etharp.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** AutoIP Timing */\n#define AUTOIP_TMR_INTERVAL      100\n#define AUTOIP_TICKS_PER_SECOND (1000 / AUTOIP_TMR_INTERVAL)\n\n/** AutoIP state information per netif */\nstruct autoip\n{\n  /** the currently selected, probed, announced or used LL IP-Address */\n  ip4_addr_t llipaddr;\n  /** current AutoIP state machine state */\n  u8_t state;\n  /** sent number of probes or announces, dependent on state */\n  u8_t sent_num;\n  /** ticks to wait, tick is AUTOIP_TMR_INTERVAL long */\n  u16_t ttw;\n  /** ticks until a conflict can be solved by defending */\n  u8_t lastconflict;\n  /** total number of probed/used Link Local IP-Addresses */\n  u8_t tried_llipaddr;\n};\n\n\nvoid autoip_set_struct(struct netif *netif, struct autoip *autoip);\n/** Remove a struct autoip previously set to the netif using autoip_set_struct() */\n#define autoip_remove_struct(netif) do { (netif)->autoip = NULL; } while (0)\nerr_t autoip_start(struct netif *netif);\nerr_t autoip_stop(struct netif *netif);\nvoid autoip_arp_reply(struct netif *netif, struct etharp_hdr *hdr);\nvoid autoip_tmr(void);\nvoid autoip_network_changed(struct netif *netif);\nu8_t autoip_supplied_address(const struct netif *netif);\n\n/* for lwIP internal use by ip4.c */\nu8_t autoip_accept_packet(struct netif *netif, const ip4_addr_t *addr);\n\n#define netif_autoip_data(netif) ((struct autoip*)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP))\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV4 && LWIP_AUTOIP */\n\n#endif /* LWIP_HDR_AUTOIP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/debug.h",
    "content": "/**\n * @file\n * Debug messages infrastructure\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_DEBUG_H\n#define LWIP_HDR_DEBUG_H\n\n#include \"lwip/arch.h\"\n#include \"lwip/opt.h\"\n\n/**\n * @defgroup debugging_levels LWIP_DBG_MIN_LEVEL and LWIP_DBG_TYPES_ON values\n * @ingroup lwip_opts_debugmsg\n * @{\n */\n\n/** @name Debug level (LWIP_DBG_MIN_LEVEL)\n * @{\n */\n/** Debug level: ALL messages*/\n#define LWIP_DBG_LEVEL_ALL     0x00\n/** Debug level: Warnings. bad checksums, dropped packets, ... */\n#define LWIP_DBG_LEVEL_WARNING 0x01\n/** Debug level: Serious. memory allocation failures, ... */\n#define LWIP_DBG_LEVEL_SERIOUS 0x02\n/** Debug level: Severe */\n#define LWIP_DBG_LEVEL_SEVERE  0x03\n/**\n * @}\n */\n\n#define LWIP_DBG_MASK_LEVEL    0x03\n/* compatibility define only */\n#define LWIP_DBG_LEVEL_OFF     LWIP_DBG_LEVEL_ALL\n\n/** @name Enable/disable debug messages completely (LWIP_DBG_TYPES_ON)\n * @{\n */\n/** flag for LWIP_DEBUGF to enable that debug message */\n#define LWIP_DBG_ON            0x80U\n/** flag for LWIP_DEBUGF to disable that debug message */\n#define LWIP_DBG_OFF           0x00U\n/**\n * @}\n */\n\n/** @name Debug message types (LWIP_DBG_TYPES_ON)\n * @{\n */\n/** flag for LWIP_DEBUGF indicating a tracing message (to follow program flow) */\n#define LWIP_DBG_TRACE         0x40U\n/** flag for LWIP_DEBUGF indicating a state debug message (to follow module states) */\n#define LWIP_DBG_STATE         0x20U\n/** flag for LWIP_DEBUGF indicating newly added code, not thoroughly tested yet */\n#define LWIP_DBG_FRESH         0x10U\n/** flag for LWIP_DEBUGF to halt after printing this debug message */\n#define LWIP_DBG_HALT          0x08U\n/**\n * @}\n */\n\n/**\n * @}\n */\n\n/**\n * @defgroup lwip_assertions Assertion handling\n * @ingroup lwip_opts_debug\n * @{\n */\n/**\n * LWIP_NOASSERT: Disable LWIP_ASSERT checks:\n * To disable assertions define LWIP_NOASSERT in arch/cc.h.\n */\n#ifdef __DOXYGEN__\n#define LWIP_NOASSERT\n#undef LWIP_NOASSERT\n#endif\n/**\n * @}\n */\n\n#ifndef LWIP_NOASSERT\n#define LWIP_ASSERT(message, assertion) do { if (!(assertion)) { \\\n  LWIP_PLATFORM_ASSERT(message); }} while(0)\n#ifndef LWIP_PLATFORM_ASSERT\n#error \"If you want to use LWIP_ASSERT, LWIP_PLATFORM_ASSERT(message) needs to be defined in your arch/cc.h\"\n#endif\n#else  /* LWIP_NOASSERT */\n#define LWIP_ASSERT(message, assertion)\n#endif /* LWIP_NOASSERT */\n\n#ifndef LWIP_ERROR\n#ifndef LWIP_NOASSERT\n#define LWIP_PLATFORM_ERROR(message) LWIP_PLATFORM_ASSERT(message)\n#elif defined LWIP_DEBUG\n#define LWIP_PLATFORM_ERROR(message) LWIP_PLATFORM_DIAG((message))\n#else\n#define LWIP_PLATFORM_ERROR(message)\n#endif\n\n/* if \"expression\" isn't true, then print \"message\" and execute \"handler\" expression */\n#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \\\n  LWIP_PLATFORM_ERROR(message); handler;}} while(0)\n#endif /* LWIP_ERROR */\n\n/** Enable debug message printing, but only if debug message type is enabled\n *  AND is of correct type AND is at least LWIP_DBG_LEVEL.\n */\n#ifdef __DOXYGEN__\n#define LWIP_DEBUG\n#undef LWIP_DEBUG\n#endif\n\n#ifdef LWIP_DEBUG\n#ifndef LWIP_PLATFORM_DIAG\n#error \"If you want to use LWIP_DEBUG, LWIP_PLATFORM_DIAG(message) needs to be defined in your arch/cc.h\"\n#endif\n#define LWIP_DEBUGF(debug, message) do { \\\n                               if ( \\\n                                   ((debug) & LWIP_DBG_ON) && \\\n                                   ((debug) & LWIP_DBG_TYPES_ON) && \\\n                                   ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \\\n                                 LWIP_PLATFORM_DIAG(message); \\\n                                 if ((debug) & LWIP_DBG_HALT) { \\\n                                   while(1); \\\n                                 } \\\n                               } \\\n                             } while(0)\n\n#else  /* LWIP_DEBUG */\n#define LWIP_DEBUGF(debug, message)\n#endif /* LWIP_DEBUG */\n\n#endif /* LWIP_HDR_DEBUG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/def.h",
    "content": "/**\n * @file\n * various utility macros\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_DEF_H\n#define LWIP_HDR_DEF_H\n\n/* arch.h might define NULL already */\n#include \"lwip/arch.h\"\n#include \"lwip/opt.h\"\n#if LWIP_PERF\n#include \"arch/perf.h\"\n#else /* LWIP_PERF */\n#define PERF_START    /* null definition */\n#define PERF_STOP(x)  /* null definition */\n#endif /* LWIP_PERF */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LWIP_MAX(x , y)  (((x) > (y)) ? (x) : (y))\n#define LWIP_MIN(x , y)  (((x) < (y)) ? (x) : (y))\n\n/* Get the number of entries in an array ('x' must NOT be a pointer!) */\n#define LWIP_ARRAYSIZE(x) (sizeof(x)/sizeof((x)[0]))\n\n/** Create u32_t value from bytes */\n#define LWIP_MAKEU32(a,b,c,d) (((u32_t)((a) & 0xff) << 24) | \\\n                               ((u32_t)((b) & 0xff) << 16) | \\\n                               ((u32_t)((c) & 0xff) << 8)  | \\\n                                (u32_t)((d) & 0xff))\n\n#ifndef NULL\n#ifdef __cplusplus\n#define NULL 0\n#else\n#define NULL ((void *)0)\n#endif\n#endif\n\n#if BYTE_ORDER == BIG_ENDIAN\n#define lwip_htons(x) (x)\n#define lwip_ntohs(x) (x)\n#define lwip_htonl(x) (x)\n#define lwip_ntohl(x) (x)\n#define PP_HTONS(x) (x)\n#define PP_NTOHS(x) (x)\n#define PP_HTONL(x) (x)\n#define PP_NTOHL(x) (x)\n#else /* BYTE_ORDER != BIG_ENDIAN */\n#ifndef lwip_htons\nu16_t lwip_htons(u16_t x);\n#endif\n#define lwip_ntohs(x) lwip_htons(x)\n\n#ifndef lwip_htonl\nu32_t lwip_htonl(u32_t x);\n#endif\n#define lwip_ntohl(x) lwip_htonl(x)\n\n/* These macros should be calculated by the preprocessor and are used\n   with compile-time constants only (so that there is no little-endian\n   overhead at runtime). */\n#define PP_HTONS(x) ((((x) & 0x00ffUL) << 8) | (((x) & 0xff00UL) >> 8))\n#define PP_NTOHS(x) PP_HTONS(x)\n#define PP_HTONL(x) ((((x) & 0x000000ffUL) << 24) | \\\n                     (((x) & 0x0000ff00UL) <<  8) | \\\n                     (((x) & 0x00ff0000UL) >>  8) | \\\n                     (((x) & 0xff000000UL) >> 24))\n#define PP_NTOHL(x) PP_HTONL(x)\n#endif /* BYTE_ORDER == BIG_ENDIAN */\n\n/* Provide usual function names as macros for users, but this can be turned off */\n#ifndef LWIP_DONT_PROVIDE_BYTEORDER_FUNCTIONS\n#define htons(x) lwip_htons(x)\n#define ntohs(x) lwip_ntohs(x)\n#define htonl(x) lwip_htonl(x)\n#define ntohl(x) lwip_ntohl(x)\n#endif\n\n/* Functions that are not available as standard implementations.\n * In cc.h, you can #define these to implementations available on\n * your platform to save some code bytes if you use these functions\n * in your application, too.\n */\n\n#ifndef lwip_itoa\n/* This can be #defined to itoa() or snprintf(result, bufsize, \"%d\", number) depending on your platform */\nvoid  lwip_itoa(char* result, size_t bufsize, int number);\n#endif\n#ifndef lwip_strnicmp\n/* This can be #defined to strnicmp() or strncasecmp() depending on your platform */\nint   lwip_strnicmp(const char* str1, const char* str2, size_t len);\n#endif\n#ifndef lwip_stricmp\n/* This can be #defined to stricmp() or strcasecmp() depending on your platform */\nint   lwip_stricmp(const char* str1, const char* str2);\n#endif\n#ifndef lwip_strnstr\n/* This can be #defined to strnstr() depending on your platform */\nchar* lwip_strnstr(const char* buffer, const char* token, size_t n);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_DEF_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/dhcp.h",
    "content": "/**\n * @file\n * DHCP client API\n */\n\n/*\n * Copyright (c) 2001-2004 Leon Woestenberg <leon.woestenberg@gmx.net>\n * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Leon Woestenberg <leon.woestenberg@gmx.net>\n *\n */\n#ifndef LWIP_HDR_DHCP_H\n#define LWIP_HDR_DHCP_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_DHCP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/netif.h\"\n#include \"lwip/udp.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** period (in seconds) of the application calling dhcp_coarse_tmr() */\n#define DHCP_COARSE_TIMER_SECS  60\n/** period (in milliseconds) of the application calling dhcp_coarse_tmr() */\n#define DHCP_COARSE_TIMER_MSECS (DHCP_COARSE_TIMER_SECS * 1000UL)\n/** period (in milliseconds) of the application calling dhcp_fine_tmr() */\n#define DHCP_FINE_TIMER_MSECS   500\n\n#define DHCP_BOOT_FILE_LEN      128U\n\n/* AutoIP cooperation flags (struct dhcp.autoip_coop_state) */\ntypedef enum {\n  DHCP_AUTOIP_COOP_STATE_OFF  = 0,\n  DHCP_AUTOIP_COOP_STATE_ON   = 1\n} dhcp_autoip_coop_state_enum_t;\n\nstruct dhcp\n{\n  /** transaction identifier of last sent request */\n  u32_t xid;\n  /** incoming msg */\n  struct dhcp_msg *msg_in;\n  /** track PCB allocation state */\n  u8_t pcb_allocated;\n  /** current DHCP state machine state */\n  u8_t state;\n  /** retries of current request */\n  u8_t tries;\n#if LWIP_DHCP_AUTOIP_COOP\n  u8_t autoip_coop_state;\n#endif\n  u8_t subnet_mask_given;\n\n  struct pbuf *p_out; /* pbuf of outcoming msg */\n  struct dhcp_msg *msg_out; /* outgoing msg */\n  u16_t options_out_len; /* outgoing msg options length */\n  u16_t request_timeout; /* #ticks with period DHCP_FINE_TIMER_SECS for request timeout */\n  u16_t t1_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for renewal time */\n  u16_t t2_timeout;  /* #ticks with period DHCP_COARSE_TIMER_SECS for rebind time */\n  u16_t t1_renew_time;  /* #ticks with period DHCP_COARSE_TIMER_SECS until next renew try */\n  u16_t t2_rebind_time; /* #ticks with period DHCP_COARSE_TIMER_SECS until next rebind try */\n  u16_t lease_used; /* #ticks with period DHCP_COARSE_TIMER_SECS since last received DHCP ack */\n  u16_t t0_timeout; /* #ticks with period DHCP_COARSE_TIMER_SECS for lease time */\n  ip_addr_t server_ip_addr; /* dhcp server address that offered this lease (ip_addr_t because passed to UDP) */\n  ip4_addr_t offered_ip_addr;\n  ip4_addr_t offered_sn_mask;\n  ip4_addr_t offered_gw_addr;\n\n  u32_t offered_t0_lease; /* lease period (in seconds) */\n  u32_t offered_t1_renew; /* recommended renew time (usually 50% of lease period) */\n  u32_t offered_t2_rebind; /* recommended rebind time (usually 87.5 of lease period)  */\n#if LWIP_DHCP_BOOTP_FILE\n  ip4_addr_t offered_si_addr;\n  char boot_file_name[DHCP_BOOT_FILE_LEN];\n#endif /* LWIP_DHCP_BOOTPFILE */\n};\n\n\nvoid dhcp_set_struct(struct netif *netif, struct dhcp *dhcp);\n/** Remove a struct dhcp previously set to the netif using dhcp_set_struct() */\n#define dhcp_remove_struct(netif) netif_set_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP, NULL)\nvoid dhcp_cleanup(struct netif *netif);\nerr_t dhcp_start(struct netif *netif);\nerr_t dhcp_renew(struct netif *netif);\nerr_t dhcp_release(struct netif *netif);\nvoid dhcp_stop(struct netif *netif);\nvoid dhcp_inform(struct netif *netif);\nvoid dhcp_network_changed(struct netif *netif);\n#if DHCP_DOES_ARP_CHECK\nvoid dhcp_arp_reply(struct netif *netif, const ip4_addr_t *addr);\n#endif\nu8_t dhcp_supplied_address(const struct netif *netif);\n/* to be called every minute */\nvoid dhcp_coarse_tmr(void);\n/* to be called every half second */\nvoid dhcp_fine_tmr(void);\n\n#if LWIP_DHCP_GET_NTP_SRV\n/** This function must exist, in other to add offered NTP servers to\n * the NTP (or SNTP) engine.\n * See LWIP_DHCP_MAX_NTP_SERVERS */\nextern void dhcp_set_ntp_servers(u8_t num_ntp_servers, const ip4_addr_t* ntp_server_addrs);\n#endif /* LWIP_DHCP_GET_NTP_SRV */\n\n#define netif_dhcp_data(netif) ((struct dhcp*)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_DHCP))\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_DHCP */\n\n#endif /*LWIP_HDR_DHCP_H*/\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/dhcp6.h",
    "content": "/**\n * @file\n *\n * IPv6 address autoconfiguration as per RFC 4862.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n * IPv6 address autoconfiguration as per RFC 4862.\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#ifndef LWIP_HDR_IP6_DHCP6_H\n#define LWIP_HDR_IP6_DHCP6_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6_DHCP6  /* don't build if not configured for use in lwipopts.h */\n\n\nstruct dhcp6\n{\n  /*@todo: implement DHCP6*/\n};\n\n#endif /* LWIP_IPV6_DHCP6 */\n\n#endif /* LWIP_HDR_IP6_DHCP6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/dns.h",
    "content": "/**\n * @file\n * DNS API\n */\n\n/**\n * lwip DNS resolver header file.\n\n * Author: Jim Pettinato\n *   April 2007\n\n * ported from uIP resolv.c Copyright (c) 2002-2003, Adam Dunkels.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote\n *    products derived from this software without specific prior\n *    written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef LWIP_HDR_DNS_H\n#define LWIP_HDR_DNS_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_DNS\n\n#include \"lwip/ip_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** DNS timer period */\n#define DNS_TMR_INTERVAL          1000\n\n/* DNS resolve types: */\n#define LWIP_DNS_ADDRTYPE_IPV4      0\n#define LWIP_DNS_ADDRTYPE_IPV6      1\n#define LWIP_DNS_ADDRTYPE_IPV4_IPV6 2 /* try to resolve IPv4 first, try IPv6 if IPv4 fails only */\n#define LWIP_DNS_ADDRTYPE_IPV6_IPV4 3 /* try to resolve IPv6 first, try IPv4 if IPv6 fails only */\n#if LWIP_IPV4 && LWIP_IPV6\n#ifndef LWIP_DNS_ADDRTYPE_DEFAULT\n#define LWIP_DNS_ADDRTYPE_DEFAULT   LWIP_DNS_ADDRTYPE_IPV4_IPV6\n#endif\n#elif LWIP_IPV4\n#define LWIP_DNS_ADDRTYPE_DEFAULT   LWIP_DNS_ADDRTYPE_IPV4\n#else\n#define LWIP_DNS_ADDRTYPE_DEFAULT   LWIP_DNS_ADDRTYPE_IPV6\n#endif\n\n#if DNS_LOCAL_HOSTLIST\n/** struct used for local host-list */\nstruct local_hostlist_entry {\n  /** static hostname */\n  const char *name;\n  /** static host address in network byteorder */\n  ip_addr_t addr;\n  struct local_hostlist_entry *next;\n};\n#define DNS_LOCAL_HOSTLIST_ELEM(name, addr_init) {name, addr_init, NULL}\n#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC\n#ifndef DNS_LOCAL_HOSTLIST_MAX_NAMELEN\n#define DNS_LOCAL_HOSTLIST_MAX_NAMELEN  DNS_MAX_NAME_LENGTH\n#endif\n#define LOCALHOSTLIST_ELEM_SIZE ((sizeof(struct local_hostlist_entry) + DNS_LOCAL_HOSTLIST_MAX_NAMELEN + 1))\n#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */\n#endif /* DNS_LOCAL_HOSTLIST */\n\n#if LWIP_IPV4\nextern const ip_addr_t dns_mquery_v4group;\n#endif /* LWIP_IPV4 */\n#if LWIP_IPV6\nextern const ip_addr_t dns_mquery_v6group;\n#endif /* LWIP_IPV6 */\n\n/** Callback which is invoked when a hostname is found.\n * A function of this type must be implemented by the application using the DNS resolver.\n * @param name pointer to the name that was looked up.\n * @param ipaddr pointer to an ip_addr_t containing the IP address of the hostname,\n *        or NULL if the name could not be found (or on any other error).\n * @param callback_arg a user-specified callback argument passed to dns_gethostbyname\n*/\ntypedef void (*dns_found_callback)(const char *name, const ip_addr_t *ipaddr, void *callback_arg);\n\nvoid             dns_init(void);\nvoid             dns_tmr(void);\nvoid             dns_setserver(u8_t numdns, const ip_addr_t *dnsserver);\nconst ip_addr_t* dns_getserver(u8_t numdns);\nerr_t            dns_gethostbyname(const char *hostname, ip_addr_t *addr,\n                                   dns_found_callback found, void *callback_arg);\nerr_t            dns_gethostbyname_addrtype(const char *hostname, ip_addr_t *addr,\n                                   dns_found_callback found, void *callback_arg,\n                                   u8_t dns_addrtype);\n\n\n#if DNS_LOCAL_HOSTLIST\nsize_t         dns_local_iterate(dns_found_callback iterator_fn, void *iterator_arg);\nerr_t          dns_local_lookup(const char *hostname, ip_addr_t *addr, u8_t dns_addrtype);\n#if DNS_LOCAL_HOSTLIST_IS_DYNAMIC\nint            dns_local_removehost(const char *hostname, const ip_addr_t *addr);\nerr_t          dns_local_addhost(const char *hostname, const ip_addr_t *addr);\n#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */\n#endif /* DNS_LOCAL_HOSTLIST */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_DNS */\n\n#endif /* LWIP_HDR_DNS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/err.h",
    "content": "/**\n * @file\n * lwIP Error codes\n */\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_ERR_H\n#define LWIP_HDR_ERR_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/arch.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @defgroup infrastructure_errors Error codes\n * @ingroup infrastructure\n * @{\n */\n\n/** Define LWIP_ERR_T in cc.h if you want to use\n *  a different type for your platform (must be signed). */\n#ifdef LWIP_ERR_T\ntypedef LWIP_ERR_T err_t;\n#else /* LWIP_ERR_T */\ntypedef s8_t err_t;\n#endif /* LWIP_ERR_T*/\n\n/** Definitions for error constants. */\ntypedef enum {\n/** No error, everything OK. */\n  ERR_OK         = 0,\n/** Out of memory error.     */\n  ERR_MEM        = -1,\n/** Buffer error.            */\n  ERR_BUF        = -2,\n/** Timeout.                 */\n  ERR_TIMEOUT    = -3,\n/** Routing problem.         */\n  ERR_RTE        = -4,\n/** Operation in progress    */\n  ERR_INPROGRESS = -5,\n/** Illegal value.           */\n  ERR_VAL        = -6,\n/** Operation would block.   */\n  ERR_WOULDBLOCK = -7,\n/** Address in use.          */\n  ERR_USE        = -8,\n/** Already connecting.      */\n  ERR_ALREADY    = -9,\n/** Conn already established.*/\n  ERR_ISCONN     = -10,\n/** Not connected.           */\n  ERR_CONN       = -11,\n/** Low-level netif error    */\n  ERR_IF         = -12,\n\n/** Connection aborted.      */\n  ERR_ABRT       = -13,\n/** Connection reset.        */\n  ERR_RST        = -14,\n/** Connection closed.       */\n  ERR_CLSD       = -15,\n/** Illegal argument.        */\n  ERR_ARG        = -16\n} err_enum_t;\n\n#define ERR_IS_FATAL(e) ((e) <= ERR_ABRT)\n\n/**\n * @}\n */\n\n#ifdef LWIP_DEBUG\nextern const char *lwip_strerr(err_t err);\n#else\n#define lwip_strerr(x) \"\"\n#endif /* LWIP_DEBUG */\n\n#if !NO_SYS\nint err_to_errno(err_t err);\n#endif /* !NO_SYS */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_ERR_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/errno.h",
    "content": "/**\n * @file\n * Posix Errno defines\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_ERRNO_H\n#define LWIP_HDR_ERRNO_H\n\n#include \"lwip/opt.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef LWIP_PROVIDE_ERRNO\n\n#define  EPERM            1  /* Operation not permitted */\n#define  ENOENT           2  /* No such file or directory */\n#define  ESRCH            3  /* No such process */\n#define  EINTR            4  /* Interrupted system call */\n#define  EIO              5  /* I/O error */\n#define  ENXIO            6  /* No such device or address */\n#define  E2BIG            7  /* Arg list too long */\n#define  ENOEXEC          8  /* Exec format error */\n#define  EBADF            9  /* Bad file number */\n#define  ECHILD          10  /* No child processes */\n#define  EAGAIN          11  /* Try again */\n#define  ENOMEM          12  /* Out of memory */\n#define  EACCES          13  /* Permission denied */\n#define  EFAULT          14  /* Bad address */\n#define  ENOTBLK         15  /* Block device required */\n#define  EBUSY           16  /* Device or resource busy */\n#define  EEXIST          17  /* File exists */\n#define  EXDEV           18  /* Cross-device link */\n#define  ENODEV          19  /* No such device */\n#define  ENOTDIR         20  /* Not a directory */\n#define  EISDIR          21  /* Is a directory */\n#define  EINVAL          22  /* Invalid argument */\n#define  ENFILE          23  /* File table overflow */\n#define  EMFILE          24  /* Too many open files */\n#define  ENOTTY          25  /* Not a typewriter */\n#define  ETXTBSY         26  /* Text file busy */\n#define  EFBIG           27  /* File too large */\n#define  ENOSPC          28  /* No space left on device */\n#define  ESPIPE          29  /* Illegal seek */\n#define  EROFS           30  /* Read-only file system */\n#define  EMLINK          31  /* Too many links */\n#define  EPIPE           32  /* Broken pipe */\n#define  EDOM            33  /* Math argument out of domain of func */\n#define  ERANGE          34  /* Math result not representable */\n#define  EDEADLK         35  /* Resource deadlock would occur */\n#define  ENAMETOOLONG    36  /* File name too long */\n#define  ENOLCK          37  /* No record locks available */\n#define  ENOSYS          38  /* Function not implemented */\n#define  ENOTEMPTY       39  /* Directory not empty */\n#define  ELOOP           40  /* Too many symbolic links encountered */\n#define  EWOULDBLOCK     EAGAIN  /* Operation would block */\n#define  ENOMSG          42  /* No message of desired type */\n#define  EIDRM           43  /* Identifier removed */\n#define  ECHRNG          44  /* Channel number out of range */\n#define  EL2NSYNC        45  /* Level 2 not synchronized */\n#define  EL3HLT          46  /* Level 3 halted */\n#define  EL3RST          47  /* Level 3 reset */\n#define  ELNRNG          48  /* Link number out of range */\n#define  EUNATCH         49  /* Protocol driver not attached */\n#define  ENOCSI          50  /* No CSI structure available */\n#define  EL2HLT          51  /* Level 2 halted */\n#define  EBADE           52  /* Invalid exchange */\n#define  EBADR           53  /* Invalid request descriptor */\n#define  EXFULL          54  /* Exchange full */\n#define  ENOANO          55  /* No anode */\n#define  EBADRQC         56  /* Invalid request code */\n#define  EBADSLT         57  /* Invalid slot */\n\n#define  EDEADLOCK       EDEADLK\n\n#define  EBFONT          59  /* Bad font file format */\n#define  ENOSTR          60  /* Device not a stream */\n#define  ENODATA         61  /* No data available */\n#define  ETIME           62  /* Timer expired */\n#define  ENOSR           63  /* Out of streams resources */\n#define  ENONET          64  /* Machine is not on the network */\n#define  ENOPKG          65  /* Package not installed */\n#define  EREMOTE         66  /* Object is remote */\n#define  ENOLINK         67  /* Link has been severed */\n#define  EADV            68  /* Advertise error */\n#define  ESRMNT          69  /* Srmount error */\n#define  ECOMM           70  /* Communication error on send */\n#define  EPROTO          71  /* Protocol error */\n#define  EMULTIHOP       72  /* Multihop attempted */\n#define  EDOTDOT         73  /* RFS specific error */\n#define  EBADMSG         74  /* Not a data message */\n#define  EOVERFLOW       75  /* Value too large for defined data type */\n#define  ENOTUNIQ        76  /* Name not unique on network */\n#define  EBADFD          77  /* File descriptor in bad state */\n#define  EREMCHG         78  /* Remote address changed */\n#define  ELIBACC         79  /* Can not access a needed shared library */\n#define  ELIBBAD         80  /* Accessing a corrupted shared library */\n#define  ELIBSCN         81  /* .lib section in a.out corrupted */\n#define  ELIBMAX         82  /* Attempting to link in too many shared libraries */\n#define  ELIBEXEC        83  /* Cannot exec a shared library directly */\n#define  EILSEQ          84  /* Illegal byte sequence */\n#define  ERESTART        85  /* Interrupted system call should be restarted */\n#define  ESTRPIPE        86  /* Streams pipe error */\n#define  EUSERS          87  /* Too many users */\n#define  ENOTSOCK        88  /* Socket operation on non-socket */\n#define  EDESTADDRREQ    89  /* Destination address required */\n#define  EMSGSIZE        90  /* Message too long */\n#define  EPROTOTYPE      91  /* Protocol wrong type for socket */\n#define  ENOPROTOOPT     92  /* Protocol not available */\n#define  EPROTONOSUPPORT 93  /* Protocol not supported */\n#define  ESOCKTNOSUPPORT 94  /* Socket type not supported */\n#define  EOPNOTSUPP      95  /* Operation not supported on transport endpoint */\n#define  EPFNOSUPPORT    96  /* Protocol family not supported */\n#define  EAFNOSUPPORT    97  /* Address family not supported by protocol */\n#define  EADDRINUSE      98  /* Address already in use */\n#define  EADDRNOTAVAIL   99  /* Cannot assign requested address */\n#define  ENETDOWN       100  /* Network is down */\n#define  ENETUNREACH    101  /* Network is unreachable */\n#define  ENETRESET      102  /* Network dropped connection because of reset */\n#define  ECONNABORTED   103  /* Software caused connection abort */\n#define  ECONNRESET     104  /* Connection reset by peer */\n#define  ENOBUFS        105  /* No buffer space available */\n#define  EISCONN        106  /* Transport endpoint is already connected */\n#define  ENOTCONN       107  /* Transport endpoint is not connected */\n#define  ESHUTDOWN      108  /* Cannot send after transport endpoint shutdown */\n#define  ETOOMANYREFS   109  /* Too many references: cannot splice */\n#define  ETIMEDOUT      110  /* Connection timed out */\n#define  ECONNREFUSED   111  /* Connection refused */\n#define  EHOSTDOWN      112  /* Host is down */\n#define  EHOSTUNREACH   113  /* No route to host */\n#define  EALREADY       114  /* Operation already in progress */\n#define  EINPROGRESS    115  /* Operation now in progress */\n#define  ESTALE         116  /* Stale NFS file handle */\n#define  EUCLEAN        117  /* Structure needs cleaning */\n#define  ENOTNAM        118  /* Not a XENIX named type file */\n#define  ENAVAIL        119  /* No XENIX semaphores available */\n#define  EISNAM         120  /* Is a named type file */\n#define  EREMOTEIO      121  /* Remote I/O error */\n#define  EDQUOT         122  /* Quota exceeded */\n\n#define  ENOMEDIUM      123  /* No medium found */\n#define  EMEDIUMTYPE    124  /* Wrong medium type */\n\n#ifndef errno\nextern int errno;\n#endif\n\n#else /* LWIP_PROVIDE_ERRNO */\n\n/* Define LWIP_ERRNO_INCLUDE to <errno.h> to include the error defines here */\n#ifdef LWIP_ERRNO_INCLUDE\n#include LWIP_ERRNO_INCLUDE\n#endif /* LWIP_ERRNO_INCLUDE */\n\n#endif /* LWIP_PROVIDE_ERRNO */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_ERRNO_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/etharp.h",
    "content": "/**\n * @file\n * Ethernet output function - handles OUTGOING ethernet level traffic, implements\n * ARP resolving.\n * To be used in most low-level netif implementations\n */\n\n/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>\n * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#ifndef LWIP_HDR_NETIF_ETHARP_H\n#define LWIP_HDR_NETIF_ETHARP_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_ARP || LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip4_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/ip4.h\"\n#include \"lwip/prot/ethernet.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_IPV4 && LWIP_ARP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/prot/etharp.h\"\n\n#ifdef USE_MRVL_SDIO_WIFI\n/** 5 seconds period */\n#define ARP_TMR_INTERVAL 5000\n#else\n/** 1 seconds period */\n#define ARP_TMR_INTERVAL 1000\n#endif\n\n#if ARP_QUEUEING\n/** struct for queueing outgoing packets for unknown address\n  * defined here to be accessed by memp.h\n  */\nstruct etharp_q_entry {\n  struct etharp_q_entry *next;\n  struct pbuf *p;\n};\n#endif /* ARP_QUEUEING */\n\n#define etharp_init() /* Compatibility define, no init needed. */\nvoid etharp_tmr(void);\ns8_t etharp_find_addr(struct netif *netif, const ip4_addr_t *ipaddr,\n         struct eth_addr **eth_ret, const ip4_addr_t **ip_ret);\nu8_t etharp_get_entry(u8_t i, ip4_addr_t **ipaddr, struct netif **netif, struct eth_addr **eth_ret);\nerr_t etharp_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr);\nerr_t etharp_query(struct netif *netif, const ip4_addr_t *ipaddr, struct pbuf *q);\nerr_t etharp_request(struct netif *netif, const ip4_addr_t *ipaddr);\n/** For Ethernet network interfaces, we might want to send \"gratuitous ARP\";\n *  this is an ARP packet sent by a node in order to spontaneously cause other\n *  nodes to update an entry in their ARP cache.\n *  From RFC 3220 \"IP Mobility Support for IPv4\" section 4.6. */\n#define etharp_gratuitous(netif) etharp_request((netif), netif_ip4_addr(netif))\nvoid etharp_cleanup_netif(struct netif *netif);\n\n#if ETHARP_SUPPORT_STATIC_ENTRIES\nerr_t etharp_add_static_entry(const ip4_addr_t *ipaddr, struct eth_addr *ethaddr);\nerr_t etharp_remove_static_entry(const ip4_addr_t *ipaddr);\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n\n#endif /* LWIP_IPV4 && LWIP_ARP */\n\nvoid etharp_input(struct pbuf *p, struct netif *netif);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_ARP || LWIP_ETHERNET */\n\n#endif /* LWIP_HDR_NETIF_ETHARP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/ethip6.h",
    "content": "/**\n * @file\n *\n * Ethernet output for IPv6. Uses ND tables for link-layer addressing.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#ifndef LWIP_HDR_ETHIP6_H\n#define LWIP_HDR_ETHIP6_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6 && LWIP_ETHERNET /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/netif.h\"\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\nerr_t ethip6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV6 && LWIP_ETHERNET */\n\n#endif /* LWIP_HDR_ETHIP6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/icmp.h",
    "content": "/**\n * @file\n * ICMP API\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_ICMP_H\n#define LWIP_HDR_ICMP_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/prot/icmp.h\"\n\n#if LWIP_IPV6 && LWIP_ICMP6\n#include \"lwip/icmp6.h\"\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** ICMP destination unreachable codes */\nenum icmp_dur_type {\n  /** net unreachable */\n  ICMP_DUR_NET   = 0,\n  /** host unreachable */\n  ICMP_DUR_HOST  = 1,\n  /** protocol unreachable */\n  ICMP_DUR_PROTO = 2,\n  /** port unreachable */\n  ICMP_DUR_PORT  = 3,\n  /** fragmentation needed and DF set */\n  ICMP_DUR_FRAG  = 4,\n  /** source route failed */\n  ICMP_DUR_SR    = 5\n};\n\n/** ICMP time exceeded codes */\nenum icmp_te_type {\n  /** time to live exceeded in transit */\n  ICMP_TE_TTL  = 0,\n  /** fragment reassembly time exceeded */\n  ICMP_TE_FRAG = 1\n};\n\n#if LWIP_IPV4 && LWIP_ICMP /* don't build if not configured for use in lwipopts.h */\n\nvoid icmp_input(struct pbuf *p, struct netif *inp);\nvoid icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t);\nvoid icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t);\n\n#endif /* LWIP_IPV4 && LWIP_ICMP */\n\n#if LWIP_IPV4 && LWIP_IPV6\n#if LWIP_ICMP && LWIP_ICMP6\n#define icmp_port_unreach(isipv6, pbuf) ((isipv6) ? \\\n                                         icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT) : \\\n                                         icmp_dest_unreach(pbuf, ICMP_DUR_PORT))\n#elif LWIP_ICMP\n#define icmp_port_unreach(isipv6, pbuf) do{ if(!(isipv6)) { icmp_dest_unreach(pbuf, ICMP_DUR_PORT);}}while(0)\n#elif LWIP_ICMP6\n#define icmp_port_unreach(isipv6, pbuf) do{ if(isipv6) { icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT);}}while(0)\n#else\n#define icmp_port_unreach(isipv6, pbuf)\n#endif\n#elif LWIP_IPV6 && LWIP_ICMP6\n#define icmp_port_unreach(isipv6, pbuf) icmp6_dest_unreach(pbuf, ICMP6_DUR_PORT)\n#elif LWIP_IPV4 && LWIP_ICMP\n#define icmp_port_unreach(isipv6, pbuf) icmp_dest_unreach(pbuf, ICMP_DUR_PORT)\n#else /* (LWIP_IPV6 && LWIP_ICMP6) || (LWIP_IPV4 && LWIP_ICMP) */\n#define icmp_port_unreach(isipv6, pbuf)\n#endif /* (LWIP_IPV6 && LWIP_ICMP6) || (LWIP_IPV4 && LWIP_ICMP) LWIP_IPV4*/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_ICMP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/icmp6.h",
    "content": "/**\n * @file\n *\n * IPv6 version of ICMP, as per RFC 4443.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n#ifndef LWIP_HDR_ICMP6_H\n#define LWIP_HDR_ICMP6_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/prot/icmp6.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_ICMP6 && LWIP_IPV6 /* don't build if not configured for use in lwipopts.h */\n\nvoid icmp6_input(struct pbuf *p, struct netif *inp);\nvoid icmp6_dest_unreach(struct pbuf *p, enum icmp6_dur_code c);\nvoid icmp6_packet_too_big(struct pbuf *p, u32_t mtu);\nvoid icmp6_time_exceeded(struct pbuf *p, enum icmp6_te_code c);\nvoid icmp6_param_problem(struct pbuf *p, enum icmp6_pp_code c, u32_t pointer);\n\n#endif /* LWIP_ICMP6 && LWIP_IPV6 */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n\n#endif /* LWIP_HDR_ICMP6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/igmp.h",
    "content": "/**\n * @file\n * IGMP API\n */\n\n/*\n * Copyright (c) 2002 CITEL Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of CITEL Technologies Ltd nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY CITEL TECHNOLOGIES AND CONTRIBUTORS ``AS IS''\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL CITEL TECHNOLOGIES OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file is a contribution to the lwIP TCP/IP stack.\n * The Swedish Institute of Computer Science and Adam Dunkels\n * are specifically granted permission to redistribute this\n * source code.\n*/\n\n#ifndef LWIP_HDR_IGMP_H\n#define LWIP_HDR_IGMP_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/pbuf.h\"\n\n#if LWIP_IPV4 && LWIP_IGMP /* don't build if not configured for use in lwipopts.h */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* IGMP timer */\n#define IGMP_TMR_INTERVAL              100 /* Milliseconds */\n#define IGMP_V1_DELAYING_MEMBER_TMR   (1000/IGMP_TMR_INTERVAL)\n#define IGMP_JOIN_DELAYING_MEMBER_TMR (500 /IGMP_TMR_INTERVAL)\n\n/* Compatibility defines (don't use for new code) */\n#define IGMP_DEL_MAC_FILTER            NETIF_DEL_MAC_FILTER\n#define IGMP_ADD_MAC_FILTER            NETIF_ADD_MAC_FILTER\n\n/**\n * igmp group structure - there is\n * a list of groups for each interface\n * these should really be linked from the interface, but\n * if we keep them separate we will not affect the lwip original code\n * too much\n *\n * There will be a group for the all systems group address but this\n * will not run the state machine as it is used to kick off reports\n * from all the other groups\n */\nstruct igmp_group {\n  /** next link */\n  struct igmp_group *next;\n  /** multicast address */\n  ip4_addr_t         group_address;\n  /** signifies we were the last person to report */\n  u8_t               last_reporter_flag;\n  /** current state of the group */\n  u8_t               group_state;\n  /** timer for reporting, negative is OFF */\n  u16_t              timer;\n  /** counter of simultaneous uses */\n  u8_t               use;\n};\n\n/*  Prototypes */\nvoid   igmp_init(void);\nerr_t  igmp_start(struct netif *netif);\nerr_t  igmp_stop(struct netif *netif);\nvoid   igmp_report_groups(struct netif *netif);\nstruct igmp_group *igmp_lookfor_group(struct netif *ifp, const ip4_addr_t *addr);\nvoid   igmp_input(struct pbuf *p, struct netif *inp, const ip4_addr_t *dest);\nerr_t  igmp_joingroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr);\nerr_t  igmp_joingroup_netif(struct netif *netif, const ip4_addr_t *groupaddr);\nerr_t  igmp_leavegroup(const ip4_addr_t *ifaddr, const ip4_addr_t *groupaddr);\nerr_t  igmp_leavegroup_netif(struct netif *netif, const ip4_addr_t *groupaddr);\nvoid   igmp_tmr(void);\n\n/** @ingroup igmp \n * Get list head of IGMP groups for netif.\n * Note: The allsystems group IP is contained in the list as first entry.\n * @see @ref netif_set_igmp_mac_filter()\n */\n#define netif_igmp_data(netif) ((struct igmp_group *)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_IGMP))\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV4 && LWIP_IGMP */\n\n#endif /* LWIP_HDR_IGMP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/inet.h",
    "content": "/**\n * @file\n * This file (together with sockets.h) aims to provide structs and functions from\n * - arpa/inet.h\n * - netinet/in.h\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_INET_H\n#define LWIP_HDR_INET_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/def.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/ip6_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* If your port already typedef's in_addr_t, define IN_ADDR_T_DEFINED\n   to prevent this code from redefining it. */\n#if !defined(in_addr_t) && !defined(IN_ADDR_T_DEFINED)\ntypedef u32_t in_addr_t;\n#endif\n\nstruct in_addr {\n  in_addr_t s_addr;\n};\n\nstruct in6_addr {\n  union {\n    u32_t u32_addr[4];\n    u8_t  u8_addr[16];\n  } un;\n#define s6_addr  un.u8_addr\n};\n\n/** 255.255.255.255 */\n#define INADDR_NONE         IPADDR_NONE\n/** 127.0.0.1 */\n#define INADDR_LOOPBACK     IPADDR_LOOPBACK\n/** 0.0.0.0 */\n#define INADDR_ANY          IPADDR_ANY\n/** 255.255.255.255 */\n#define INADDR_BROADCAST    IPADDR_BROADCAST\n\n/** This macro can be used to initialize a variable of type struct in6_addr\n    to the IPv6 wildcard address. */\n#define IN6ADDR_ANY_INIT {{{0,0,0,0}}}\n/** This macro can be used to initialize a variable of type struct in6_addr\n    to the IPv6 loopback address. */\n#define IN6ADDR_LOOPBACK_INIT {{{0,0,0,PP_HTONL(1)}}}\n/** This variable is initialized by the system to contain the wildcard IPv6 address. */\nextern const struct in6_addr in6addr_any;\n\n/* Definitions of the bits in an (IPv4) Internet address integer.\n\n   On subnets, host and network parts are found according to\n   the subnet mask, not these masks.  */\n#define IN_CLASSA(a)        IP_CLASSA(a)\n#define IN_CLASSA_NET       IP_CLASSA_NET\n#define IN_CLASSA_NSHIFT    IP_CLASSA_NSHIFT\n#define IN_CLASSA_HOST      IP_CLASSA_HOST\n#define IN_CLASSA_MAX       IP_CLASSA_MAX\n\n#define IN_CLASSB(b)        IP_CLASSB(b)\n#define IN_CLASSB_NET       IP_CLASSB_NET\n#define IN_CLASSB_NSHIFT    IP_CLASSB_NSHIFT\n#define IN_CLASSB_HOST      IP_CLASSB_HOST\n#define IN_CLASSB_MAX       IP_CLASSB_MAX\n\n#define IN_CLASSC(c)        IP_CLASSC(c)\n#define IN_CLASSC_NET       IP_CLASSC_NET\n#define IN_CLASSC_NSHIFT    IP_CLASSC_NSHIFT\n#define IN_CLASSC_HOST      IP_CLASSC_HOST\n#define IN_CLASSC_MAX       IP_CLASSC_MAX\n\n#define IN_CLASSD(d)        IP_CLASSD(d)\n#define IN_CLASSD_NET       IP_CLASSD_NET     /* These ones aren't really */\n#define IN_CLASSD_NSHIFT    IP_CLASSD_NSHIFT  /*   net and host fields, but */\n#define IN_CLASSD_HOST      IP_CLASSD_HOST    /*   routing needn't know. */\n#define IN_CLASSD_MAX       IP_CLASSD_MAX\n\n#define IN_MULTICAST(a)     IP_MULTICAST(a)\n\n#define IN_EXPERIMENTAL(a)  IP_EXPERIMENTAL(a)\n#define IN_BADCLASS(a)      IP_BADCLASS(a)\n\n#define IN_LOOPBACKNET      IP_LOOPBACKNET\n\n\n#ifndef INET_ADDRSTRLEN\n#define INET_ADDRSTRLEN     IP4ADDR_STRLEN_MAX\n#endif\n#if LWIP_IPV6\n#ifndef INET6_ADDRSTRLEN\n#define INET6_ADDRSTRLEN    IP6ADDR_STRLEN_MAX\n#endif\n#endif\n\n#if LWIP_IPV4\n\n#define inet_addr_from_ip4addr(target_inaddr, source_ipaddr) ((target_inaddr)->s_addr = ip4_addr_get_u32(source_ipaddr))\n#define inet_addr_to_ip4addr(target_ipaddr, source_inaddr)   (ip4_addr_set_u32(target_ipaddr, (source_inaddr)->s_addr))\n/* ATTENTION: the next define only works because both s_addr and ip4_addr_t are an u32_t effectively! */\n#define inet_addr_to_ip4addr_p(target_ip4addr_p, source_inaddr)   ((target_ip4addr_p) = (ip4_addr_t*)&((source_inaddr)->s_addr))\n\n/* directly map this to the lwip internal functions */\n#define inet_addr(cp)                   ipaddr_addr(cp)\n#define inet_aton(cp, addr)             ip4addr_aton(cp, (ip4_addr_t*)addr)\n#define inet_ntoa(addr)                 ip4addr_ntoa((const ip4_addr_t*)&(addr))\n#define inet_ntoa_r(addr, buf, buflen)  ip4addr_ntoa_r((const ip4_addr_t*)&(addr), buf, buflen)\n\n#endif /* LWIP_IPV4 */\n\n#if LWIP_IPV6\n#define inet6_addr_from_ip6addr(target_in6addr, source_ip6addr) {(target_in6addr)->un.u32_addr[0] = (source_ip6addr)->addr[0]; \\\n                                                                 (target_in6addr)->un.u32_addr[1] = (source_ip6addr)->addr[1]; \\\n                                                                 (target_in6addr)->un.u32_addr[2] = (source_ip6addr)->addr[2]; \\\n                                                                 (target_in6addr)->un.u32_addr[3] = (source_ip6addr)->addr[3];}\n#define inet6_addr_to_ip6addr(target_ip6addr, source_in6addr)   {(target_ip6addr)->addr[0] = (source_in6addr)->un.u32_addr[0]; \\\n                                                                 (target_ip6addr)->addr[1] = (source_in6addr)->un.u32_addr[1]; \\\n                                                                 (target_ip6addr)->addr[2] = (source_in6addr)->un.u32_addr[2]; \\\n                                                                 (target_ip6addr)->addr[3] = (source_in6addr)->un.u32_addr[3];}\n/* ATTENTION: the next define only works because both in6_addr and ip6_addr_t are an u32_t[4] effectively! */\n#define inet6_addr_to_ip6addr_p(target_ip6addr_p, source_in6addr)   ((target_ip6addr_p) = (ip6_addr_t*)(source_in6addr))\n\n/* directly map this to the lwip internal functions */\n#define inet6_aton(cp, addr)            ip6addr_aton(cp, (ip6_addr_t*)addr)\n#define inet6_ntoa(addr)                ip6addr_ntoa((const ip6_addr_t*)&(addr))\n#define inet6_ntoa_r(addr, buf, buflen) ip6addr_ntoa_r((const ip6_addr_t*)&(addr), buf, buflen)\n\n#endif /* LWIP_IPV6 */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_INET_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/inet_chksum.h",
    "content": "/**\n * @file\n * IP checksum calculation functions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_INET_CHKSUM_H\n#define LWIP_HDR_INET_CHKSUM_H\n\n#include \"lwip/opt.h\"\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip_addr.h\"\n\n/** Swap the bytes in an u16_t: much like lwip_htons() for little-endian */\n#ifndef SWAP_BYTES_IN_WORD\n#define SWAP_BYTES_IN_WORD(w) (((w) & 0xff) << 8) | (((w) & 0xff00) >> 8)\n#endif /* SWAP_BYTES_IN_WORD */\n\n/** Split an u32_t in two u16_ts and add them up */\n#ifndef FOLD_U32T\n#define FOLD_U32T(u)          (((u) >> 16) + ((u) & 0x0000ffffUL))\n#endif\n\n#if LWIP_CHECKSUM_ON_COPY\n/** Function-like macro: same as MEMCPY but returns the checksum of copied data\n    as u16_t */\n# ifndef LWIP_CHKSUM_COPY\n#  define LWIP_CHKSUM_COPY(dst, src, len) lwip_chksum_copy(dst, src, len)\n#  ifndef LWIP_CHKSUM_COPY_ALGORITHM\n#   define LWIP_CHKSUM_COPY_ALGORITHM 1\n#  endif /* LWIP_CHKSUM_COPY_ALGORITHM */\n# else /* LWIP_CHKSUM_COPY */\n#  define LWIP_CHKSUM_COPY_ALGORITHM 0\n# endif /* LWIP_CHKSUM_COPY */\n#else /* LWIP_CHECKSUM_ON_COPY */\n# define LWIP_CHKSUM_COPY_ALGORITHM 0\n#endif /* LWIP_CHECKSUM_ON_COPY */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nu16_t inet_chksum(const void *dataptr, u16_t len);\nu16_t inet_chksum_pbuf(struct pbuf *p);\n#if LWIP_CHKSUM_COPY_ALGORITHM\nu16_t lwip_chksum_copy(void *dst, const void *src, u16_t len);\n#endif /* LWIP_CHKSUM_COPY_ALGORITHM */\n\n#if LWIP_IPV4\nu16_t inet_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,\n       const ip4_addr_t *src, const ip4_addr_t *dest);\nu16_t inet_chksum_pseudo_partial(struct pbuf *p, u8_t proto,\n       u16_t proto_len, u16_t chksum_len, const ip4_addr_t *src, const ip4_addr_t *dest);\n#endif /* LWIP_IPV4 */\n\n#if LWIP_IPV6\nu16_t ip6_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,\n       const ip6_addr_t *src, const ip6_addr_t *dest);\nu16_t ip6_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len,\n       u16_t chksum_len, const ip6_addr_t *src, const ip6_addr_t *dest);\n#endif /* LWIP_IPV6 */\n\n\nu16_t ip_chksum_pseudo(struct pbuf *p, u8_t proto, u16_t proto_len,\n       const ip_addr_t *src, const ip_addr_t *dest);\nu16_t ip_chksum_pseudo_partial(struct pbuf *p, u8_t proto, u16_t proto_len,\n       u16_t chksum_len, const ip_addr_t *src, const ip_addr_t *dest);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_INET_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/init.h",
    "content": "/**\n * @file\n * lwIP initialization API\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_INIT_H\n#define LWIP_HDR_INIT_H\n\n#include \"lwip/opt.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @defgroup lwip_version Version\n * @ingroup lwip\n * @{\n */\n\n/** X.x.x: Major version of the stack */\n#define LWIP_VERSION_MAJOR      2\n/** x.X.x: Minor version of the stack */\n#define LWIP_VERSION_MINOR      0\n/** x.x.X: Revision of the stack */\n#define LWIP_VERSION_REVISION   3\n/** For release candidates, this is set to 1..254\n  * For official releases, this is set to 255 (LWIP_RC_RELEASE)\n  * For development versions (Git), this is set to 0 (LWIP_RC_DEVELOPMENT) */\n#define LWIP_VERSION_RC         LWIP_RC_RELEASE\n\n/** LWIP_VERSION_RC is set to LWIP_RC_RELEASE for official releases */\n#define LWIP_RC_RELEASE         255\n/** LWIP_VERSION_RC is set to LWIP_RC_DEVELOPMENT for Git versions */\n#define LWIP_RC_DEVELOPMENT     0\n\n#define LWIP_VERSION_IS_RELEASE     (LWIP_VERSION_RC == LWIP_RC_RELEASE)\n#define LWIP_VERSION_IS_DEVELOPMENT (LWIP_VERSION_RC == LWIP_RC_DEVELOPMENT)\n#define LWIP_VERSION_IS_RC          ((LWIP_VERSION_RC != LWIP_RC_RELEASE) && (LWIP_VERSION_RC != LWIP_RC_DEVELOPMENT))\n\n/* Some helper defines to get a version string */\n#define LWIP_VERSTR2(x) #x\n#define LWIP_VERSTR(x) LWIP_VERSTR2(x)\n#if LWIP_VERSION_IS_RELEASE\n#define LWIP_VERSION_STRING_SUFFIX \"\"\n#elif LWIP_VERSION_IS_DEVELOPMENT\n#define LWIP_VERSION_STRING_SUFFIX \"d\"\n#else\n#define LWIP_VERSION_STRING_SUFFIX \"rc\" LWIP_VERSTR(LWIP_VERSION_RC)\n#endif\n\n/** Provides the version of the stack */\n#define LWIP_VERSION   (((u32_t)LWIP_VERSION_MAJOR) << 24   | ((u32_t)LWIP_VERSION_MINOR) << 16 | \\\n                        ((u32_t)LWIP_VERSION_REVISION) << 8 | ((u32_t)LWIP_VERSION_RC))\n/** Provides the version of the stack as string */\n#define LWIP_VERSION_STRING     LWIP_VERSTR(LWIP_VERSION_MAJOR) \".\" LWIP_VERSTR(LWIP_VERSION_MINOR) \".\" LWIP_VERSTR(LWIP_VERSION_REVISION) LWIP_VERSION_STRING_SUFFIX\n\n/**\n * @}\n */\n\n/* Modules initialization */\nvoid lwip_init(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_INIT_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/ip.h",
    "content": "/**\n * @file\n * IP API\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_IP_H\n#define LWIP_HDR_IP_H\n\n#include \"lwip/opt.h\"\n\n#include \"lwip/def.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/err.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/ip4.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/prot/ip.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* This is passed as the destination address to ip_output_if (not\n   to ip_output), meaning that an IP header already is constructed\n   in the pbuf. This is used when TCP retransmits. */\n#define LWIP_IP_HDRINCL  NULL\n\n/** pbufs passed to IP must have a ref-count of 1 as their payload pointer\n    gets altered as the packet is passed down the stack */\n#ifndef LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX\n#define LWIP_IP_CHECK_PBUF_REF_COUNT_FOR_TX(p) LWIP_ASSERT(\"p->ref == 1\", (p)->ref == 1)\n#endif\n\n#if LWIP_NETIF_HWADDRHINT\n#define IP_PCB_ADDRHINT ;u8_t addr_hint\n#else\n#define IP_PCB_ADDRHINT\n#endif /* LWIP_NETIF_HWADDRHINT */\n\n/** This is the common part of all PCB types. It needs to be at the\n   beginning of a PCB type definition. It is located here so that\n   changes to this common part are made in one location instead of\n   having to change all PCB structs. */\n#define IP_PCB \\\n  /* ip addresses in network byte order */ \\\n  ip_addr_t local_ip; \\\n  ip_addr_t remote_ip; \\\n   /* Socket options */  \\\n  u8_t so_options;      \\\n   /* Type Of Service */ \\\n  u8_t tos;              \\\n  /* Time To Live */     \\\n  u8_t ttl               \\\n  /* link layer address resolution hint */ \\\n  IP_PCB_ADDRHINT\n\nstruct ip_pcb {\n/* Common members of all PCB types */\n  IP_PCB;\n};\n\n/*\n * Option flags per-socket. These are the same like SO_XXX in sockets.h\n */\n#define SOF_REUSEADDR     0x04U  /* allow local address reuse */\n#define SOF_KEEPALIVE     0x08U  /* keep connections alive */\n#define SOF_BROADCAST     0x20U  /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */\n\n/* These flags are inherited (e.g. from a listen-pcb to a connection-pcb): */\n#define SOF_INHERITED   (SOF_REUSEADDR|SOF_KEEPALIVE)\n\n/** Global variables of this module, kept in a struct for efficient access using base+index. */\nstruct ip_globals\n{\n  /** The interface that accepted the packet for the current callback invocation. */\n  struct netif *current_netif;\n  /** The interface that received the packet for the current callback invocation. */\n  struct netif *current_input_netif;\n#if LWIP_IPV4\n  /** Header of the input packet currently being processed. */\n  struct ip_hdr *current_ip4_header;\n#endif /* LWIP_IPV4 */\n#if LWIP_IPV6\n  /** Header of the input IPv6 packet currently being processed. */\n  struct ip6_hdr *current_ip6_header;\n#endif /* LWIP_IPV6 */\n  /** Total header length of current_ip4/6_header (i.e. after this, the UDP/TCP header starts) */\n  u16_t current_ip_header_tot_len;\n  /** Source IP address of current_header */\n  ip_addr_t current_iphdr_src;\n  /** Destination IP address of current_header */\n  ip_addr_t current_iphdr_dest;\n};\nextern struct ip_globals ip_data;\n\n\n/** Get the interface that accepted the current packet.\n * This may or may not be the receiving netif, depending on your netif/network setup.\n * This function must only be called from a receive callback (udp_recv,\n * raw_recv, tcp_accept). It will return NULL otherwise. */\n#define ip_current_netif()      (ip_data.current_netif)\n/** Get the interface that received the current packet.\n * This function must only be called from a receive callback (udp_recv,\n * raw_recv, tcp_accept). It will return NULL otherwise. */\n#define ip_current_input_netif() (ip_data.current_input_netif)\n/** Total header length of ip(6)_current_header() (i.e. after this, the UDP/TCP header starts) */\n#define ip_current_header_tot_len() (ip_data.current_ip_header_tot_len)\n/** Source IP address of current_header */\n#define ip_current_src_addr()   (&ip_data.current_iphdr_src)\n/** Destination IP address of current_header */\n#define ip_current_dest_addr()  (&ip_data.current_iphdr_dest)\n\n#if LWIP_IPV4 && LWIP_IPV6\n/** Get the IPv4 header of the current packet.\n * This function must only be called from a receive callback (udp_recv,\n * raw_recv, tcp_accept). It will return NULL otherwise. */\n#define ip4_current_header()     ((const struct ip_hdr*)(ip_data.current_ip4_header))\n/** Get the IPv6 header of the current packet.\n * This function must only be called from a receive callback (udp_recv,\n * raw_recv, tcp_accept). It will return NULL otherwise. */\n#define ip6_current_header()      ((const struct ip6_hdr*)(ip_data.current_ip6_header))\n/** Returns TRUE if the current IP input packet is IPv6, FALSE if it is IPv4 */\n#define ip_current_is_v6()        (ip6_current_header() != NULL)\n/** Source IPv6 address of current_header */\n#define ip6_current_src_addr()    (ip_2_ip6(&ip_data.current_iphdr_src))\n/** Destination IPv6 address of current_header */\n#define ip6_current_dest_addr()   (ip_2_ip6(&ip_data.current_iphdr_dest))\n/** Get the transport layer protocol */\n#define ip_current_header_proto() (ip_current_is_v6() ? \\\n                                   IP6H_NEXTH(ip6_current_header()) :\\\n                                   IPH_PROTO(ip4_current_header()))\n/** Get the transport layer header */\n#define ip_next_header_ptr()     ((const void*)((ip_current_is_v6() ? \\\n  (const u8_t*)ip6_current_header() : (const u8_t*)ip4_current_header())  + ip_current_header_tot_len()))\n\n/** Source IP4 address of current_header */\n#define ip4_current_src_addr()     (ip_2_ip4(&ip_data.current_iphdr_src))\n/** Destination IP4 address of current_header */\n#define ip4_current_dest_addr()    (ip_2_ip4(&ip_data.current_iphdr_dest))\n\n#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */\n\n/** Get the IPv4 header of the current packet.\n * This function must only be called from a receive callback (udp_recv,\n * raw_recv, tcp_accept). It will return NULL otherwise. */\n#define ip4_current_header()     ((const struct ip_hdr*)(ip_data.current_ip4_header))\n/** Always returns FALSE when only supporting IPv4 only */\n#define ip_current_is_v6()        0\n/** Get the transport layer protocol */\n#define ip_current_header_proto() IPH_PROTO(ip4_current_header())\n/** Get the transport layer header */\n#define ip_next_header_ptr()     ((const void*)((const u8_t*)ip4_current_header() + ip_current_header_tot_len()))\n/** Source IP4 address of current_header */\n#define ip4_current_src_addr()     (&ip_data.current_iphdr_src)\n/** Destination IP4 address of current_header */\n#define ip4_current_dest_addr()    (&ip_data.current_iphdr_dest)\n\n#elif LWIP_IPV6 /* LWIP_IPV4 && LWIP_IPV6 */\n\n/** Get the IPv6 header of the current packet.\n * This function must only be called from a receive callback (udp_recv,\n * raw_recv, tcp_accept). It will return NULL otherwise. */\n#define ip6_current_header()      ((const struct ip6_hdr*)(ip_data.current_ip6_header))\n/** Always returns TRUE when only supporting IPv6 only */\n#define ip_current_is_v6()        1\n/** Get the transport layer protocol */\n#define ip_current_header_proto() IP6H_NEXTH(ip6_current_header())\n/** Get the transport layer header */\n#define ip_next_header_ptr()     ((const void*)((const u8_t*)ip6_current_header()))\n/** Source IP6 address of current_header */\n#define ip6_current_src_addr()    (&ip_data.current_iphdr_src)\n/** Destination IP6 address of current_header */\n#define ip6_current_dest_addr()   (&ip_data.current_iphdr_dest)\n\n#endif /* LWIP_IPV6 */\n\n/** Union source address of current_header */\n#define ip_current_src_addr()    (&ip_data.current_iphdr_src)\n/** Union destination address of current_header */\n#define ip_current_dest_addr()   (&ip_data.current_iphdr_dest)\n\n/** Gets an IP pcb option (SOF_* flags) */\n#define ip_get_option(pcb, opt)   ((pcb)->so_options & (opt))\n/** Sets an IP pcb option (SOF_* flags) */\n#define ip_set_option(pcb, opt)   ((pcb)->so_options |= (opt))\n/** Resets an IP pcb option (SOF_* flags) */\n#define ip_reset_option(pcb, opt) ((pcb)->so_options &= ~(opt))\n\n#if LWIP_IPV4 && LWIP_IPV6\n/**\n * @ingroup ip\n * Output IP packet, netif is selected by source address\n */\n#define ip_output(p, src, dest, ttl, tos, proto) \\\n        (IP_IS_V6(dest) ? \\\n        ip6_output(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto) : \\\n        ip4_output(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto))\n/**\n * @ingroup ip\n * Output IP packet to specified interface\n */\n#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \\\n        (IP_IS_V6(dest) ? \\\n        ip6_output_if(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \\\n        ip4_output_if(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif))\n/**\n * @ingroup ip\n * Output IP packet to interface specifying source address\n */\n#define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \\\n        (IP_IS_V6(dest) ? \\\n        ip6_output_if_src(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, netif) : \\\n        ip4_output_if_src(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, netif))\n/** Output IP packet with addr_hint */\n#define ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) \\\n        (IP_IS_V6(dest) ? \\\n        ip6_output_hinted(p, ip_2_ip6(src), ip_2_ip6(dest), ttl, tos, proto, addr_hint) : \\\n        ip4_output_hinted(p, ip_2_ip4(src), ip_2_ip4(dest), ttl, tos, proto, addr_hint))\n/**\n * @ingroup ip\n * Get netif for address combination. See \\ref ip6_route and \\ref ip4_route\n */\n#define ip_route(src, dest) \\\n        (IP_IS_V6(dest) ? \\\n        ip6_route(ip_2_ip6(src), ip_2_ip6(dest)) : \\\n        ip4_route_src(ip_2_ip4(dest), ip_2_ip4(src)))\n/**\n * @ingroup ip\n * Get netif for IP.\n */\n#define ip_netif_get_local_ip(netif, dest) (IP_IS_V6(dest) ? \\\n        ip6_netif_get_local_ip(netif, ip_2_ip6(dest)) : \\\n        ip4_netif_get_local_ip(netif))\n#define ip_debug_print(is_ipv6, p) ((is_ipv6) ? ip6_debug_print(p) : ip4_debug_print(p))\n\nerr_t ip_input(struct pbuf *p, struct netif *inp);\n\n#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */\n\n#define ip_output(p, src, dest, ttl, tos, proto) \\\n        ip4_output(p, src, dest, ttl, tos, proto)\n#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \\\n        ip4_output_if(p, src, dest, ttl, tos, proto, netif)\n#define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \\\n        ip4_output_if_src(p, src, dest, ttl, tos, proto, netif)\n#define ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) \\\n        ip4_output_hinted(p, src, dest, ttl, tos, proto, addr_hint)\n#define ip_route(src, dest) \\\n        ip4_route_src(dest, src)\n#define ip_netif_get_local_ip(netif, dest) \\\n        ip4_netif_get_local_ip(netif)\n#define ip_debug_print(is_ipv6, p) ip4_debug_print(p)\n\n#define ip_input ip4_input\n\n#elif LWIP_IPV6 /* LWIP_IPV4 && LWIP_IPV6 */\n\n#define ip_output(p, src, dest, ttl, tos, proto) \\\n        ip6_output(p, src, dest, ttl, tos, proto)\n#define ip_output_if(p, src, dest, ttl, tos, proto, netif) \\\n        ip6_output_if(p, src, dest, ttl, tos, proto, netif)\n#define ip_output_if_src(p, src, dest, ttl, tos, proto, netif) \\\n        ip6_output_if_src(p, src, dest, ttl, tos, proto, netif)\n#define ip_output_hinted(p, src, dest, ttl, tos, proto, addr_hint) \\\n        ip6_output_hinted(p, src, dest, ttl, tos, proto, addr_hint)\n#define ip_route(src, dest) \\\n        ip6_route(src, dest)\n#define ip_netif_get_local_ip(netif, dest) \\\n        ip6_netif_get_local_ip(netif, dest)\n#define ip_debug_print(is_ipv6, p) ip6_debug_print(p)\n\n#define ip_input ip6_input\n\n#endif /* LWIP_IPV6 */\n\n#define ip_route_get_local_ip(src, dest, netif, ipaddr) do { \\\n  (netif) = ip_route(src, dest); \\\n  (ipaddr) = ip_netif_get_local_ip(netif, dest); \\\n}while(0)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_IP_H */\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/ip4.h",
    "content": "/**\n * @file\n * IPv4 API\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_IP4_H\n#define LWIP_HDR_IP4_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV4\n\n#include \"lwip/def.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip4_addr.h\"\n#include \"lwip/err.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/prot/ip4.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef LWIP_HOOK_IP4_ROUTE_SRC\n#define LWIP_IPV4_SRC_ROUTING   1\n#else\n#define LWIP_IPV4_SRC_ROUTING   0\n#endif\n\n/** Currently, the function ip_output_if_opt() is only used with IGMP */\n#define IP_OPTIONS_SEND   (LWIP_IPV4 && LWIP_IGMP)\n\n#define ip_init() /* Compatibility define, no init needed. */\nstruct netif *ip4_route(const ip4_addr_t *dest);\n#if LWIP_IPV4_SRC_ROUTING\nstruct netif *ip4_route_src(const ip4_addr_t *dest, const ip4_addr_t *src);\n#else /* LWIP_IPV4_SRC_ROUTING */\n#define ip4_route_src(dest, src) ip4_route(dest)\n#endif /* LWIP_IPV4_SRC_ROUTING */\nerr_t ip4_input(struct pbuf *p, struct netif *inp);\nerr_t ip4_output(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n       u8_t ttl, u8_t tos, u8_t proto);\nerr_t ip4_output_if(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n       u8_t ttl, u8_t tos, u8_t proto, struct netif *netif);\nerr_t ip4_output_if_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n       u8_t ttl, u8_t tos, u8_t proto, struct netif *netif);\n#if LWIP_NETIF_HWADDRHINT\nerr_t ip4_output_hinted(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n       u8_t ttl, u8_t tos, u8_t proto, u8_t *addr_hint);\n#endif /* LWIP_NETIF_HWADDRHINT */\n#if IP_OPTIONS_SEND\nerr_t ip4_output_if_opt(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n       u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,\n       u16_t optlen);\nerr_t ip4_output_if_opt_src(struct pbuf *p, const ip4_addr_t *src, const ip4_addr_t *dest,\n       u8_t ttl, u8_t tos, u8_t proto, struct netif *netif, void *ip_options,\n       u16_t optlen);\n#endif /* IP_OPTIONS_SEND */\n\n#if LWIP_MULTICAST_TX_OPTIONS\nvoid  ip4_set_default_multicast_netif(struct netif* default_multicast_netif);\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n\n#define ip4_netif_get_local_ip(netif) (((netif) != NULL) ? netif_ip_addr4(netif) : NULL)\n\n#if IP_DEBUG\nvoid ip4_debug_print(struct pbuf *p);\n#else\n#define ip4_debug_print(p)\n#endif /* IP_DEBUG */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV4 */\n\n#endif /* LWIP_HDR_IP_H */\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/ip4_addr.h",
    "content": "/**\n * @file\n * IPv4 address API\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_IP4_ADDR_H\n#define LWIP_HDR_IP4_ADDR_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/def.h\"\n\n#if LWIP_IPV4\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** This is the aligned version of ip4_addr_t,\n   used as local variable, on the stack, etc. */\nstruct ip4_addr {\n  u32_t addr;\n};\n\n/** ip4_addr_t uses a struct for convenience only, so that the same defines can\n * operate both on ip4_addr_t as well as on ip4_addr_p_t. */\ntypedef struct ip4_addr ip4_addr_t;\n\n/**\n * struct ipaddr2 is used in the definition of the ARP packet format in\n * order to support compilers that don't have structure packing.\n */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct ip4_addr2 {\n  PACK_STRUCT_FIELD(u16_t addrw[2]);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/* Forward declaration to not include netif.h */\nstruct netif;\n\n/** 255.255.255.255 */\n#define IPADDR_NONE         ((u32_t)0xffffffffUL)\n/** 127.0.0.1 */\n#define IPADDR_LOOPBACK     ((u32_t)0x7f000001UL)\n/** 0.0.0.0 */\n#define IPADDR_ANY          ((u32_t)0x00000000UL)\n/** 255.255.255.255 */\n#define IPADDR_BROADCAST    ((u32_t)0xffffffffUL)\n\n/* Definitions of the bits in an Internet address integer.\n\n   On subnets, host and network parts are found according to\n   the subnet mask, not these masks.  */\n#define IP_CLASSA(a)        ((((u32_t)(a)) & 0x80000000UL) == 0)\n#define IP_CLASSA_NET       0xff000000\n#define IP_CLASSA_NSHIFT    24\n#define IP_CLASSA_HOST      (0xffffffff & ~IP_CLASSA_NET)\n#define IP_CLASSA_MAX       128\n\n#define IP_CLASSB(a)        ((((u32_t)(a)) & 0xc0000000UL) == 0x80000000UL)\n#define IP_CLASSB_NET       0xffff0000\n#define IP_CLASSB_NSHIFT    16\n#define IP_CLASSB_HOST      (0xffffffff & ~IP_CLASSB_NET)\n#define IP_CLASSB_MAX       65536\n\n#define IP_CLASSC(a)        ((((u32_t)(a)) & 0xe0000000UL) == 0xc0000000UL)\n#define IP_CLASSC_NET       0xffffff00\n#define IP_CLASSC_NSHIFT    8\n#define IP_CLASSC_HOST      (0xffffffff & ~IP_CLASSC_NET)\n\n#define IP_CLASSD(a)        (((u32_t)(a) & 0xf0000000UL) == 0xe0000000UL)\n#define IP_CLASSD_NET       0xf0000000          /* These ones aren't really */\n#define IP_CLASSD_NSHIFT    28                  /*   net and host fields, but */\n#define IP_CLASSD_HOST      0x0fffffff          /*   routing needn't know. */\n#define IP_MULTICAST(a)     IP_CLASSD(a)\n\n#define IP_EXPERIMENTAL(a)  (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL)\n#define IP_BADCLASS(a)      (((u32_t)(a) & 0xf0000000UL) == 0xf0000000UL)\n\n#define IP_LOOPBACKNET      127                 /* official! */\n\n/** Set an IP address given by the four byte-parts */\n#define IP4_ADDR(ipaddr, a,b,c,d)  (ipaddr)->addr = PP_HTONL(LWIP_MAKEU32(a,b,c,d))\n\n/** MEMCPY-like copying of IP addresses where addresses are known to be\n * 16-bit-aligned if the port is correctly configured (so a port could define\n * this to copying 2 u16_t's) - no NULL-pointer-checking needed. */\n#ifndef IPADDR2_COPY\n#define IPADDR2_COPY(dest, src) SMEMCPY(dest, src, sizeof(ip4_addr_t))\n#endif\n\n/** Copy IP address - faster than ip4_addr_set: no NULL check */\n#define ip4_addr_copy(dest, src) ((dest).addr = (src).addr)\n/** Safely copy one IP address to another (src may be NULL) */\n#define ip4_addr_set(dest, src) ((dest)->addr = \\\n                                    ((src) == NULL ? 0 : \\\n                                    (src)->addr))\n/** Set complete address to zero */\n#define ip4_addr_set_zero(ipaddr)     ((ipaddr)->addr = 0)\n/** Set address to IPADDR_ANY (no need for lwip_htonl()) */\n#define ip4_addr_set_any(ipaddr)      ((ipaddr)->addr = IPADDR_ANY)\n/** Set address to loopback address */\n#define ip4_addr_set_loopback(ipaddr) ((ipaddr)->addr = PP_HTONL(IPADDR_LOOPBACK))\n/** Check if an address is in the loopback region */\n#define ip4_addr_isloopback(ipaddr)    (((ipaddr)->addr & PP_HTONL(IP_CLASSA_NET)) == PP_HTONL(((u32_t)IP_LOOPBACKNET) << 24))\n/** Safely copy one IP address to another and change byte order\n * from host- to network-order. */\n#define ip4_addr_set_hton(dest, src) ((dest)->addr = \\\n                               ((src) == NULL ? 0:\\\n                               lwip_htonl((src)->addr)))\n/** IPv4 only: set the IP address given as an u32_t */\n#define ip4_addr_set_u32(dest_ipaddr, src_u32) ((dest_ipaddr)->addr = (src_u32))\n/** IPv4 only: get the IP address as an u32_t */\n#define ip4_addr_get_u32(src_ipaddr) ((src_ipaddr)->addr)\n\n/** Get the network address by combining host address with netmask */\n#define ip4_addr_get_network(target, host, netmask) do { ((target)->addr = ((host)->addr) & ((netmask)->addr)); } while(0)\n\n/**\n * Determine if two address are on the same network.\n *\n * @arg addr1 IP address 1\n * @arg addr2 IP address 2\n * @arg mask network identifier mask\n * @return !0 if the network identifiers of both address match\n */\n#define ip4_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \\\n                                              (mask)->addr) == \\\n                                             ((addr2)->addr & \\\n                                              (mask)->addr))\n#define ip4_addr_cmp(addr1, addr2) ((addr1)->addr == (addr2)->addr)\n\n#define ip4_addr_isany_val(addr1)   ((addr1).addr == IPADDR_ANY)\n#define ip4_addr_isany(addr1) ((addr1) == NULL || ip4_addr_isany_val(*(addr1)))\n\n#define ip4_addr_isbroadcast(addr1, netif) ip4_addr_isbroadcast_u32((addr1)->addr, netif)\nu8_t ip4_addr_isbroadcast_u32(u32_t addr, const struct netif *netif);\n\n#define ip_addr_netmask_valid(netmask) ip4_addr_netmask_valid((netmask)->addr)\nu8_t ip4_addr_netmask_valid(u32_t netmask);\n\n#define ip4_addr_ismulticast(addr1) (((addr1)->addr & PP_HTONL(0xf0000000UL)) == PP_HTONL(0xe0000000UL))\n\n#define ip4_addr_islinklocal(addr1) (((addr1)->addr & PP_HTONL(0xffff0000UL)) == PP_HTONL(0xa9fe0000UL))\n\n#define ip4_addr_debug_print_parts(debug, a, b, c, d) \\\n  LWIP_DEBUGF(debug, (\"%\" U16_F \".%\" U16_F \".%\" U16_F \".%\" U16_F, a, b, c, d))\n#define ip4_addr_debug_print(debug, ipaddr) \\\n  ip4_addr_debug_print_parts(debug, \\\n                      (u16_t)((ipaddr) != NULL ? ip4_addr1_16(ipaddr) : 0),       \\\n                      (u16_t)((ipaddr) != NULL ? ip4_addr2_16(ipaddr) : 0),       \\\n                      (u16_t)((ipaddr) != NULL ? ip4_addr3_16(ipaddr) : 0),       \\\n                      (u16_t)((ipaddr) != NULL ? ip4_addr4_16(ipaddr) : 0))\n#define ip4_addr_debug_print_val(debug, ipaddr) \\\n  ip4_addr_debug_print_parts(debug, \\\n                      ip4_addr1_16(&(ipaddr)),       \\\n                      ip4_addr2_16(&(ipaddr)),       \\\n                      ip4_addr3_16(&(ipaddr)),       \\\n                      ip4_addr4_16(&(ipaddr)))\n\n/* Get one byte from the 4-byte address */\n#define ip4_addr1(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[0])\n#define ip4_addr2(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[1])\n#define ip4_addr3(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[2])\n#define ip4_addr4(ipaddr) (((const u8_t*)(&(ipaddr)->addr))[3])\n/* These are cast to u16_t, with the intent that they are often arguments\n * to printf using the U16_F format from cc.h. */\n#define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr))\n#define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr))\n#define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr))\n#define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr))\n\n#define IP4ADDR_STRLEN_MAX  16\n\n/** For backwards compatibility */\n#define ip_ntoa(ipaddr)  ipaddr_ntoa(ipaddr)\n\nu32_t ipaddr_addr(const char *cp);\nint ip4addr_aton(const char *cp, ip4_addr_t *addr);\n/** returns ptr to static buffer; not reentrant! */\nchar *ip4addr_ntoa(const ip4_addr_t *addr);\nchar *ip4addr_ntoa_r(const ip4_addr_t *addr, char *buf, int buflen);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV4 */\n\n#endif /* LWIP_HDR_IP_ADDR_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/ip4_frag.h",
    "content": "/**\n * @file\n * IP fragmentation/reassembly\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Jani Monoses <jani@iv.ro>\n *\n */\n\n#ifndef LWIP_HDR_IP4_FRAG_H\n#define LWIP_HDR_IP4_FRAG_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/err.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/ip.h\"\n\n#if LWIP_IPV4\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if IP_REASSEMBLY\n/* The IP reassembly timer interval in milliseconds. */\n#define IP_TMR_INTERVAL 1000\n\n/** IP reassembly helper struct.\n * This is exported because memp needs to know the size.\n */\nstruct ip_reassdata {\n  struct ip_reassdata *next;\n  struct pbuf *p;\n  struct ip_hdr iphdr;\n  u16_t datagram_len;\n  u8_t flags;\n  u8_t timer;\n};\n\nvoid ip_reass_init(void);\nvoid ip_reass_tmr(void);\nstruct pbuf * ip4_reass(struct pbuf *p);\n#endif /* IP_REASSEMBLY */\n\n#if IP_FRAG\n#if !LWIP_NETIF_TX_SINGLE_PBUF\n#ifndef LWIP_PBUF_CUSTOM_REF_DEFINED\n#define LWIP_PBUF_CUSTOM_REF_DEFINED\n/** A custom pbuf that holds a reference to another pbuf, which is freed\n * when this custom pbuf is freed. This is used to create a custom PBUF_REF\n * that points into the original pbuf. */\nstruct pbuf_custom_ref {\n  /** 'base class' */\n  struct pbuf_custom pc;\n  /** pointer to the original pbuf that is referenced */\n  struct pbuf *original;\n};\n#endif /* LWIP_PBUF_CUSTOM_REF_DEFINED */\n#endif /* !LWIP_NETIF_TX_SINGLE_PBUF */\n\nerr_t ip4_frag(struct pbuf *p, struct netif *netif, const ip4_addr_t *dest);\n#endif /* IP_FRAG */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV4 */\n\n#endif /* LWIP_HDR_IP4_FRAG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/ip6.h",
    "content": "/**\n * @file\n *\n * IPv6 layer.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n#ifndef LWIP_HDR_IP6_H\n#define LWIP_HDR_IP6_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/prot/ip6.h\"\n#include \"lwip/def.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/netif.h\"\n\n#include \"lwip/err.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct netif *ip6_route(const ip6_addr_t *src, const ip6_addr_t *dest);\nconst ip_addr_t *ip6_select_source_address(struct netif *netif, const ip6_addr_t * dest);\nerr_t         ip6_input(struct pbuf *p, struct netif *inp);\nerr_t         ip6_output(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,\n                         u8_t hl, u8_t tc, u8_t nexth);\nerr_t         ip6_output_if(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,\n                            u8_t hl, u8_t tc, u8_t nexth, struct netif *netif);\nerr_t         ip6_output_if_src(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,\n                            u8_t hl, u8_t tc, u8_t nexth, struct netif *netif);\n#if LWIP_NETIF_HWADDRHINT\nerr_t         ip6_output_hinted(struct pbuf *p, const ip6_addr_t *src, const ip6_addr_t *dest,\n                                u8_t hl, u8_t tc, u8_t nexth, u8_t *addr_hint);\n#endif /* LWIP_NETIF_HWADDRHINT */\n#if LWIP_IPV6_MLD\nerr_t         ip6_options_add_hbh_ra(struct pbuf * p, u8_t nexth, u8_t value);\n#endif /* LWIP_IPV6_MLD */\n\n#define ip6_netif_get_local_ip(netif, dest) (((netif) != NULL) ? \\\n  ip6_select_source_address(netif, dest) : NULL)\n\n#if IP6_DEBUG\nvoid ip6_debug_print(struct pbuf *p);\n#else\n#define ip6_debug_print(p)\n#endif /* IP6_DEBUG */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV6 */\n\n#endif /* LWIP_HDR_IP6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/ip6_addr.h",
    "content": "/**\n * @file\n *\n * IPv6 addresses.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n * Structs and macros for handling IPv6 addresses.\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n#ifndef LWIP_HDR_IP6_ADDR_H\n#define LWIP_HDR_IP6_ADDR_H\n\n#include \"lwip/opt.h\"\n#include \"def.h\"\n\n#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/** This is the aligned version of ip6_addr_t,\n    used as local variable, on the stack, etc. */\nstruct ip6_addr {\n  u32_t addr[4];\n};\n\n/** IPv6 address */\ntypedef struct ip6_addr ip6_addr_t;\n\n/** Set an IPv6 partial address given by byte-parts */\n#define IP6_ADDR_PART(ip6addr, index, a,b,c,d) \\\n  (ip6addr)->addr[index] = PP_HTONL(LWIP_MAKEU32(a,b,c,d))\n\n/** Set a full IPv6 address by passing the 4 u32_t indices in network byte order\n    (use PP_HTONL() for constants) */\n#define IP6_ADDR(ip6addr, idx0, idx1, idx2, idx3) do { \\\n  (ip6addr)->addr[0] = idx0; \\\n  (ip6addr)->addr[1] = idx1; \\\n  (ip6addr)->addr[2] = idx2; \\\n  (ip6addr)->addr[3] = idx3; } while(0)\n\n/** Access address in 16-bit block */\n#define IP6_ADDR_BLOCK1(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xffff))\n/** Access address in 16-bit block */\n#define IP6_ADDR_BLOCK2(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[0])) & 0xffff))\n/** Access address in 16-bit block */\n#define IP6_ADDR_BLOCK3(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[1]) >> 16) & 0xffff))\n/** Access address in 16-bit block */\n#define IP6_ADDR_BLOCK4(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[1])) & 0xffff))\n/** Access address in 16-bit block */\n#define IP6_ADDR_BLOCK5(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[2]) >> 16) & 0xffff))\n/** Access address in 16-bit block */\n#define IP6_ADDR_BLOCK6(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[2])) & 0xffff))\n/** Access address in 16-bit block */\n#define IP6_ADDR_BLOCK7(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[3]) >> 16) & 0xffff))\n/** Access address in 16-bit block */\n#define IP6_ADDR_BLOCK8(ip6addr) ((u16_t)((lwip_htonl((ip6addr)->addr[3])) & 0xffff))\n\n/** Copy IPv6 address - faster than ip6_addr_set: no NULL check */\n#define ip6_addr_copy(dest, src) do{(dest).addr[0] = (src).addr[0]; \\\n                                    (dest).addr[1] = (src).addr[1]; \\\n                                    (dest).addr[2] = (src).addr[2]; \\\n                                    (dest).addr[3] = (src).addr[3];}while(0)\n/** Safely copy one IPv6 address to another (src may be NULL) */\n#define ip6_addr_set(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : (src)->addr[0]; \\\n                                   (dest)->addr[1] = (src) == NULL ? 0 : (src)->addr[1]; \\\n                                   (dest)->addr[2] = (src) == NULL ? 0 : (src)->addr[2]; \\\n                                   (dest)->addr[3] = (src) == NULL ? 0 : (src)->addr[3];}while(0)\n\n/** Set complete address to zero */\n#define ip6_addr_set_zero(ip6addr)    do{(ip6addr)->addr[0] = 0; \\\n                                         (ip6addr)->addr[1] = 0; \\\n                                         (ip6addr)->addr[2] = 0; \\\n                                         (ip6addr)->addr[3] = 0;}while(0)\n\n/** Set address to ipv6 'any' (no need for lwip_htonl()) */\n#define ip6_addr_set_any(ip6addr)       ip6_addr_set_zero(ip6addr)\n/** Set address to ipv6 loopback address */\n#define ip6_addr_set_loopback(ip6addr) do{(ip6addr)->addr[0] = 0; \\\n                                          (ip6addr)->addr[1] = 0; \\\n                                          (ip6addr)->addr[2] = 0; \\\n                                          (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0)\n/** Safely copy one IPv6 address to another and change byte order\n * from host- to network-order. */\n#define ip6_addr_set_hton(dest, src) do{(dest)->addr[0] = (src) == NULL ? 0 : lwip_htonl((src)->addr[0]); \\\n                                        (dest)->addr[1] = (src) == NULL ? 0 : lwip_htonl((src)->addr[1]); \\\n                                        (dest)->addr[2] = (src) == NULL ? 0 : lwip_htonl((src)->addr[2]); \\\n                                        (dest)->addr[3] = (src) == NULL ? 0 : lwip_htonl((src)->addr[3]);}while(0)\n\n\n/**\n * Determine if two IPv6 address are on the same network.\n *\n * @arg addr1 IPv6 address 1\n * @arg addr2 IPv6 address 2\n * @return !0 if the network identifiers of both address match\n */\n#define ip6_addr_netcmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \\\n                                       ((addr1)->addr[1] == (addr2)->addr[1]))\n\n#define ip6_addr_cmp(addr1, addr2) (((addr1)->addr[0] == (addr2)->addr[0]) && \\\n                                    ((addr1)->addr[1] == (addr2)->addr[1]) && \\\n                                    ((addr1)->addr[2] == (addr2)->addr[2]) && \\\n                                    ((addr1)->addr[3] == (addr2)->addr[3]))\n\n#define ip6_get_subnet_id(ip6addr)   (lwip_htonl((ip6addr)->addr[2]) & 0x0000ffffUL)\n\n#define ip6_addr_isany_val(ip6addr) (((ip6addr).addr[0] == 0) && \\\n                                     ((ip6addr).addr[1] == 0) && \\\n                                     ((ip6addr).addr[2] == 0) && \\\n                                     ((ip6addr).addr[3] == 0))\n#define ip6_addr_isany(ip6addr) (((ip6addr) == NULL) || ip6_addr_isany_val(*(ip6addr)))\n\n#define ip6_addr_isloopback(ip6addr) (((ip6addr)->addr[0] == 0UL) && \\\n                                      ((ip6addr)->addr[1] == 0UL) && \\\n                                      ((ip6addr)->addr[2] == 0UL) && \\\n                                      ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))\n\n#define ip6_addr_isglobal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xe0000000UL)) == PP_HTONL(0x20000000UL))\n\n#define ip6_addr_islinklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfe800000UL))\n\n#define ip6_addr_issitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xffc00000UL)) == PP_HTONL(0xfec00000UL))\n\n#define ip6_addr_isuniquelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xfe000000UL)) == PP_HTONL(0xfc000000UL))\n\n#define ip6_addr_isipv4mappedipv6(ip6addr) (((ip6addr)->addr[0] == 0) && ((ip6addr)->addr[1] == 0) && (((ip6addr)->addr[2]) == PP_HTONL(0x0000FFFFUL)))\n\n#define ip6_addr_ismulticast(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL))\n#define ip6_addr_multicast_transient_flag(ip6addr)  ((ip6addr)->addr[0] & PP_HTONL(0x00100000UL))\n#define ip6_addr_multicast_prefix_flag(ip6addr)     ((ip6addr)->addr[0] & PP_HTONL(0x00200000UL))\n#define ip6_addr_multicast_rendezvous_flag(ip6addr) ((ip6addr)->addr[0] & PP_HTONL(0x00400000UL))\n#define ip6_addr_multicast_scope(ip6addr) ((lwip_htonl((ip6addr)->addr[0]) >> 16) & 0xf)\n#define IP6_MULTICAST_SCOPE_RESERVED            0x0\n#define IP6_MULTICAST_SCOPE_RESERVED0           0x0\n#define IP6_MULTICAST_SCOPE_INTERFACE_LOCAL     0x1\n#define IP6_MULTICAST_SCOPE_LINK_LOCAL          0x2\n#define IP6_MULTICAST_SCOPE_RESERVED3           0x3\n#define IP6_MULTICAST_SCOPE_ADMIN_LOCAL         0x4\n#define IP6_MULTICAST_SCOPE_SITE_LOCAL          0x5\n#define IP6_MULTICAST_SCOPE_ORGANIZATION_LOCAL  0x8\n#define IP6_MULTICAST_SCOPE_GLOBAL              0xe\n#define IP6_MULTICAST_SCOPE_RESERVEDF           0xf\n#define ip6_addr_ismulticast_iflocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff010000UL))\n#define ip6_addr_ismulticast_linklocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff020000UL))\n#define ip6_addr_ismulticast_adminlocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff040000UL))\n#define ip6_addr_ismulticast_sitelocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff050000UL))\n#define ip6_addr_ismulticast_orglocal(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff080000UL))\n#define ip6_addr_ismulticast_global(ip6addr) (((ip6addr)->addr[0] & PP_HTONL(0xff8f0000UL)) == PP_HTONL(0xff0e0000UL))\n\n/* @todo define get/set for well-know multicast addresses, e.g. ff02::1 */\n#define ip6_addr_isallnodes_iflocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff010000UL)) && \\\n    ((ip6addr)->addr[1] == 0UL) && \\\n    ((ip6addr)->addr[2] == 0UL) && \\\n    ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))\n\n#define ip6_addr_isallnodes_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \\\n    ((ip6addr)->addr[1] == 0UL) && \\\n    ((ip6addr)->addr[2] == 0UL) && \\\n    ((ip6addr)->addr[3] == PP_HTONL(0x00000001UL)))\n#define ip6_addr_set_allnodes_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \\\n                (ip6addr)->addr[1] = 0; \\\n                (ip6addr)->addr[2] = 0; \\\n                (ip6addr)->addr[3] = PP_HTONL(0x00000001UL);}while(0)\n\n#define ip6_addr_isallrouters_linklocal(ip6addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \\\n    ((ip6addr)->addr[1] == 0UL) && \\\n    ((ip6addr)->addr[2] == 0UL) && \\\n    ((ip6addr)->addr[3] == PP_HTONL(0x00000002UL)))\n#define ip6_addr_set_allrouters_linklocal(ip6addr) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \\\n                (ip6addr)->addr[1] = 0; \\\n                (ip6addr)->addr[2] = 0; \\\n                (ip6addr)->addr[3] = PP_HTONL(0x00000002UL);}while(0)\n\n#define ip6_addr_issolicitednode(ip6addr) ( ((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \\\n        ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \\\n        (((ip6addr)->addr[3] & PP_HTONL(0xff000000UL)) == PP_HTONL(0xff000000UL)) )\n\n#define ip6_addr_set_solicitednode(ip6addr, if_id) do{(ip6addr)->addr[0] = PP_HTONL(0xff020000UL); \\\n                (ip6addr)->addr[1] = 0; \\\n                (ip6addr)->addr[2] = PP_HTONL(0x00000001UL); \\\n                (ip6addr)->addr[3] = (PP_HTONL(0xff000000UL) | (if_id));}while(0)\n\n#define ip6_addr_cmp_solicitednode(ip6addr, sn_addr) (((ip6addr)->addr[0] == PP_HTONL(0xff020000UL)) && \\\n                                    ((ip6addr)->addr[1] == 0) && \\\n                                    ((ip6addr)->addr[2] == PP_HTONL(0x00000001UL)) && \\\n                                    ((ip6addr)->addr[3] == (PP_HTONL(0xff000000UL) | (sn_addr)->addr[3])))\n\n/* IPv6 address states. */\n#define IP6_ADDR_INVALID      0x00\n#define IP6_ADDR_TENTATIVE    0x08\n#define IP6_ADDR_TENTATIVE_1  0x09 /* 1 probe sent */\n#define IP6_ADDR_TENTATIVE_2  0x0a /* 2 probes sent */\n#define IP6_ADDR_TENTATIVE_3  0x0b /* 3 probes sent */\n#define IP6_ADDR_TENTATIVE_4  0x0c /* 4 probes sent */\n#define IP6_ADDR_TENTATIVE_5  0x0d /* 5 probes sent */\n#define IP6_ADDR_TENTATIVE_6  0x0e /* 6 probes sent */\n#define IP6_ADDR_TENTATIVE_7  0x0f /* 7 probes sent */\n#define IP6_ADDR_VALID        0x10 /* This bit marks an address as valid (preferred or deprecated) */\n#define IP6_ADDR_PREFERRED    0x30\n#define IP6_ADDR_DEPRECATED   0x10 /* Same as VALID (valid but not preferred) */\n\n#define IP6_ADDR_TENTATIVE_COUNT_MASK 0x07 /* 1-7 probes sent */\n\n#define ip6_addr_isinvalid(addr_state) (addr_state == IP6_ADDR_INVALID)\n#define ip6_addr_istentative(addr_state) (addr_state & IP6_ADDR_TENTATIVE)\n#define ip6_addr_isvalid(addr_state) (addr_state & IP6_ADDR_VALID) /* Include valid, preferred, and deprecated. */\n#define ip6_addr_ispreferred(addr_state) (addr_state == IP6_ADDR_PREFERRED)\n#define ip6_addr_isdeprecated(addr_state) (addr_state == IP6_ADDR_DEPRECATED)\n\n#define ip6_addr_debug_print_parts(debug, a, b, c, d, e, f, g, h) \\\n  LWIP_DEBUGF(debug, (\"%\" X16_F \":%\" X16_F \":%\" X16_F \":%\" X16_F \":%\" X16_F \":%\" X16_F \":%\" X16_F \":%\" X16_F, \\\n                      a, b, c, d, e, f, g, h))\n#define ip6_addr_debug_print(debug, ipaddr) \\\n  ip6_addr_debug_print_parts(debug, \\\n                      (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK1(ipaddr) : 0),    \\\n                      (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK2(ipaddr) : 0),    \\\n                      (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK3(ipaddr) : 0),    \\\n                      (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK4(ipaddr) : 0),    \\\n                      (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK5(ipaddr) : 0),    \\\n                      (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK6(ipaddr) : 0),    \\\n                      (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK7(ipaddr) : 0),    \\\n                      (u16_t)((ipaddr) != NULL ? IP6_ADDR_BLOCK8(ipaddr) : 0))\n#define ip6_addr_debug_print_val(debug, ipaddr) \\\n  ip6_addr_debug_print_parts(debug, \\\n                      IP6_ADDR_BLOCK1(&(ipaddr)),    \\\n                      IP6_ADDR_BLOCK2(&(ipaddr)),    \\\n                      IP6_ADDR_BLOCK3(&(ipaddr)),    \\\n                      IP6_ADDR_BLOCK4(&(ipaddr)),    \\\n                      IP6_ADDR_BLOCK5(&(ipaddr)),    \\\n                      IP6_ADDR_BLOCK6(&(ipaddr)),    \\\n                      IP6_ADDR_BLOCK7(&(ipaddr)),    \\\n                      IP6_ADDR_BLOCK8(&(ipaddr)))\n\n#define IP6ADDR_STRLEN_MAX    46\n\nint ip6addr_aton(const char *cp, ip6_addr_t *addr);\n/** returns ptr to static buffer; not reentrant! */\nchar *ip6addr_ntoa(const ip6_addr_t *addr);\nchar *ip6addr_ntoa_r(const ip6_addr_t *addr, char *buf, int buflen);\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV6 */\n\n#endif /* LWIP_HDR_IP6_ADDR_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/ip6_frag.h",
    "content": "/**\n * @file\n *\n * IPv6 fragmentation and reassembly.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n#ifndef LWIP_HDR_IP6_FRAG_H\n#define LWIP_HDR_IP6_FRAG_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/netif.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n#if LWIP_IPV6 && LWIP_IPV6_REASS  /* don't build if not configured for use in lwipopts.h */\n\n/** IP6_FRAG_COPYHEADER==1: for platforms where sizeof(void*) > 4, this needs to\n * be enabled (to not overwrite part of the data). When enabled, the IPv6 header\n * is copied instead of referencing it, which gives more room for struct ip6_reass_helper */\n#ifndef IPV6_FRAG_COPYHEADER\n#define IPV6_FRAG_COPYHEADER   0\n#endif\n\n/** The IPv6 reassembly timer interval in milliseconds. */\n#define IP6_REASS_TMR_INTERVAL 1000\n\n/* Copy the complete header of the first fragment to struct ip6_reassdata\n   or just point to its original location in the first pbuf? */\n#if IPV6_FRAG_COPYHEADER\n#define IPV6_FRAG_HDRPTR\n#define IPV6_FRAG_HDRREF(hdr) (&(hdr))\n#else /* IPV6_FRAG_COPYHEADER */\n#define IPV6_FRAG_HDRPTR *\n#define IPV6_FRAG_HDRREF(hdr) (hdr)\n#endif /* IPV6_FRAG_COPYHEADER */\n\n/** IPv6 reassembly helper struct.\n * This is exported because memp needs to know the size.\n */\nstruct ip6_reassdata {\n  struct ip6_reassdata *next;\n  struct pbuf *p;\n  struct ip6_hdr IPV6_FRAG_HDRPTR iphdr;\n  u32_t identification;\n  u16_t datagram_len;\n  u8_t nexth;\n  u8_t timer;\n};\n\n#define ip6_reass_init() /* Compatibility define */\nvoid ip6_reass_tmr(void);\nstruct pbuf *ip6_reass(struct pbuf *p);\n\n#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */\n\n#if LWIP_IPV6 && LWIP_IPV6_FRAG  /* don't build if not configured for use in lwipopts.h */\n\n#ifndef LWIP_PBUF_CUSTOM_REF_DEFINED\n#define LWIP_PBUF_CUSTOM_REF_DEFINED\n/** A custom pbuf that holds a reference to another pbuf, which is freed\n * when this custom pbuf is freed. This is used to create a custom PBUF_REF\n * that points into the original pbuf. */\nstruct pbuf_custom_ref {\n  /** 'base class' */\n  struct pbuf_custom pc;\n  /** pointer to the original pbuf that is referenced */\n  struct pbuf *original;\n};\n#endif /* LWIP_PBUF_CUSTOM_REF_DEFINED */\n\nerr_t ip6_frag(struct pbuf *p, struct netif *netif, const ip6_addr_t *dest);\n\n#endif /* LWIP_IPV6 && LWIP_IPV6_FRAG */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_IP6_FRAG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/ip_addr.h",
    "content": "/**\n * @file\n * IP address API (common IPv4 and IPv6)\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_IP_ADDR_H\n#define LWIP_HDR_IP_ADDR_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/def.h\"\n\n#include \"lwip/ip4_addr.h\"\n#include \"lwip/ip6_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @ingroup ipaddr\n * IP address types for use in ip_addr_t.type member.\n * @see tcp_new_ip_type(), udp_new_ip_type(), raw_new_ip_type().\n */\nenum lwip_ip_addr_type {\n  /** IPv4 */\n  IPADDR_TYPE_V4 =   0U,\n  /** IPv6 */\n  IPADDR_TYPE_V6 =   6U,\n  /** IPv4+IPv6 (\"dual-stack\") */\n  IPADDR_TYPE_ANY = 46U\n};\n\n#if LWIP_IPV4 && LWIP_IPV6\n/**\n * @ingroup ipaddr\n * A union struct for both IP version's addresses.\n * ATTENTION: watch out for its size when adding IPv6 address scope!\n */\ntypedef struct ip_addr {\n  union {\n    ip6_addr_t ip6;\n    ip4_addr_t ip4;\n  } u_addr;\n  /** @ref lwip_ip_addr_type */\n  u8_t type;\n} ip_addr_t;\n\nextern const ip_addr_t ip_addr_any_type;\n\n/** @ingroup ip4addr */\n#define IPADDR4_INIT(u32val)          { { { { u32val, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_V4 }\n/** @ingroup ip4addr */\n#define IPADDR4_INIT_BYTES(a,b,c,d)   IPADDR4_INIT(PP_HTONL(LWIP_MAKEU32(a,b,c,d)))\n/** @ingroup ip6addr */\n#define IPADDR6_INIT(a, b, c, d)      { { { { a, b, c, d } } }, IPADDR_TYPE_V6 }\n/** @ingroup ip6addr */\n#define IPADDR6_INIT_HOST(a, b, c, d) { { { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } } }, IPADDR_TYPE_V6 }\n\n/** @ingroup ipaddr */\n#define IP_IS_ANY_TYPE_VAL(ipaddr)    (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_ANY)\n/** @ingroup ipaddr */\n#define IPADDR_ANY_TYPE_INIT          { { { { 0ul, 0ul, 0ul, 0ul } } }, IPADDR_TYPE_ANY }\n\n/** @ingroup ip4addr */\n#define IP_IS_V4_VAL(ipaddr)          (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V4)\n/** @ingroup ip6addr */\n#define IP_IS_V6_VAL(ipaddr)          (IP_GET_TYPE(&ipaddr) == IPADDR_TYPE_V6)\n/** @ingroup ip4addr */\n#define IP_IS_V4(ipaddr)              (((ipaddr) == NULL) || IP_IS_V4_VAL(*(ipaddr)))\n/** @ingroup ip6addr */\n#define IP_IS_V6(ipaddr)              (((ipaddr) != NULL) && IP_IS_V6_VAL(*(ipaddr)))\n\n#define IP_SET_TYPE_VAL(ipaddr, iptype) do { (ipaddr).type = (iptype); }while(0)\n#define IP_SET_TYPE(ipaddr, iptype)     do { if((ipaddr) != NULL) { IP_SET_TYPE_VAL(*(ipaddr), iptype); }}while(0)\n#define IP_GET_TYPE(ipaddr)           ((ipaddr)->type)\n\n#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) (IP_GET_TYPE(&pcb->local_ip) == IP_GET_TYPE(ipaddr))\n#define IP_ADDR_PCB_VERSION_MATCH(pcb, ipaddr) (IP_IS_ANY_TYPE_VAL(pcb->local_ip) || IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr))\n\n/** @ingroup ip6addr\n * Convert generic ip address to specific protocol version\n */\n#define ip_2_ip6(ipaddr)   (&((ipaddr)->u_addr.ip6))\n/** @ingroup ip4addr\n * Convert generic ip address to specific protocol version\n */\n#define ip_2_ip4(ipaddr)   (&((ipaddr)->u_addr.ip4))\n\n/** @ingroup ip4addr */\n#define IP_ADDR4(ipaddr,a,b,c,d)      do { IP4_ADDR(ip_2_ip4(ipaddr),a,b,c,d); \\\n                                           IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V4); } while(0)\n/** @ingroup ip6addr */\n#define IP_ADDR6(ipaddr,i0,i1,i2,i3)  do { IP6_ADDR(ip_2_ip6(ipaddr),i0,i1,i2,i3); \\\n                                           IP_SET_TYPE_VAL(*(ipaddr), IPADDR_TYPE_V6); } while(0)\n/** @ingroup ip6addr */\n#define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3)  IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3))\n\n/** @ingroup ipaddr */\n#define ip_addr_copy(dest, src)      do{ IP_SET_TYPE_VAL(dest, IP_GET_TYPE(&src)); if(IP_IS_V6_VAL(src)){ \\\n  ip6_addr_copy(*ip_2_ip6(&(dest)), *ip_2_ip6(&(src))); }else{ \\\n  ip4_addr_copy(*ip_2_ip4(&(dest)), *ip_2_ip4(&(src))); }}while(0)\n/** @ingroup ip6addr */\n#define ip_addr_copy_from_ip6(dest, src)      do{ \\\n  ip6_addr_copy(*ip_2_ip6(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V6); }while(0)\n/** @ingroup ip4addr */\n#define ip_addr_copy_from_ip4(dest, src)      do{ \\\n  ip4_addr_copy(*ip_2_ip4(&(dest)), src); IP_SET_TYPE_VAL(dest, IPADDR_TYPE_V4); }while(0)\n/** @ingroup ip4addr */\n#define ip_addr_set_ip4_u32(ipaddr, val)  do{if(ipaddr){ip4_addr_set_u32(ip_2_ip4(ipaddr), val); \\\n  IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)\n/** @ingroup ip4addr */\n#define ip_addr_get_ip4_u32(ipaddr)  (((ipaddr) && IP_IS_V4(ipaddr)) ? \\\n  ip4_addr_get_u32(ip_2_ip4(ipaddr)) : 0)\n/** @ingroup ipaddr */\n#define ip_addr_set(dest, src) do{ IP_SET_TYPE(dest, IP_GET_TYPE(src)); if(IP_IS_V6(src)){ \\\n  ip6_addr_set(ip_2_ip6(dest), ip_2_ip6(src)); }else{ \\\n  ip4_addr_set(ip_2_ip4(dest), ip_2_ip4(src)); }}while(0)\n/** @ingroup ipaddr */\n#define ip_addr_set_ipaddr(dest, src) ip_addr_set(dest, src)\n/** @ingroup ipaddr */\n#define ip_addr_set_zero(ipaddr)     do{ \\\n  ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, 0); }while(0)\n/** @ingroup ip5addr */\n#define ip_addr_set_zero_ip4(ipaddr)     do{ \\\n  ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }while(0)\n/** @ingroup ip6addr */\n#define ip_addr_set_zero_ip6(ipaddr)     do{ \\\n  ip6_addr_set_zero(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }while(0)\n/** @ingroup ipaddr */\n#define ip_addr_set_any(is_ipv6, ipaddr)      do{if(is_ipv6){ \\\n  ip6_addr_set_any(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \\\n  ip4_addr_set_any(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)\n/** @ingroup ipaddr */\n#define ip_addr_set_loopback(is_ipv6, ipaddr) do{if(is_ipv6){ \\\n  ip6_addr_set_loopback(ip_2_ip6(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V6); }else{ \\\n  ip4_addr_set_loopback(ip_2_ip4(ipaddr)); IP_SET_TYPE(ipaddr, IPADDR_TYPE_V4); }}while(0)\n/** @ingroup ipaddr */\n#define ip_addr_set_hton(dest, src)  do{if(IP_IS_V6(src)){ \\\n  ip6_addr_set_hton(ip_2_ip6(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V6); }else{ \\\n  ip4_addr_set_hton(ip_2_ip4(ipaddr), (src)); IP_SET_TYPE(dest, IPADDR_TYPE_V4); }}while(0)\n/** @ingroup ipaddr */\n#define ip_addr_get_network(target, host, netmask) do{if(IP_IS_V6(host)){ \\\n  ip4_addr_set_zero(ip_2_ip4(target)); IP_SET_TYPE(target, IPADDR_TYPE_V6); } else { \\\n  ip4_addr_get_network(ip_2_ip4(target), ip_2_ip4(host), ip_2_ip4(netmask)); IP_SET_TYPE(target, IPADDR_TYPE_V4); }}while(0)\n/** @ingroup ipaddr */\n#define ip_addr_netcmp(addr1, addr2, mask) ((IP_IS_V6(addr1) && IP_IS_V6(addr2)) ? \\\n  0 : \\\n  ip4_addr_netcmp(ip_2_ip4(addr1), ip_2_ip4(addr2), mask))\n/** @ingroup ipaddr */\n#define ip_addr_cmp(addr1, addr2)    ((IP_GET_TYPE(addr1) != IP_GET_TYPE(addr2)) ? 0 : (IP_IS_V6_VAL(*(addr1)) ? \\\n  ip6_addr_cmp(ip_2_ip6(addr1), ip_2_ip6(addr2)) : \\\n  ip4_addr_cmp(ip_2_ip4(addr1), ip_2_ip4(addr2))))\n/** @ingroup ipaddr */\n#define ip_addr_isany(ipaddr)        ((IP_IS_V6(ipaddr)) ? \\\n  ip6_addr_isany(ip_2_ip6(ipaddr)) : \\\n  ip4_addr_isany(ip_2_ip4(ipaddr)))\n/** @ingroup ipaddr */\n#define ip_addr_isany_val(ipaddr)        ((IP_IS_V6_VAL(ipaddr)) ? \\\n  ip6_addr_isany_val(*ip_2_ip6(&(ipaddr))) : \\\n  ip4_addr_isany_val(*ip_2_ip4(&(ipaddr))))\n/** @ingroup ipaddr */\n#define ip_addr_isbroadcast(ipaddr, netif) ((IP_IS_V6(ipaddr)) ? \\\n  0 : \\\n  ip4_addr_isbroadcast(ip_2_ip4(ipaddr), netif))\n/** @ingroup ipaddr */\n#define ip_addr_ismulticast(ipaddr)  ((IP_IS_V6(ipaddr)) ? \\\n  ip6_addr_ismulticast(ip_2_ip6(ipaddr)) : \\\n  ip4_addr_ismulticast(ip_2_ip4(ipaddr)))\n/** @ingroup ipaddr */\n#define ip_addr_isloopback(ipaddr)  ((IP_IS_V6(ipaddr)) ? \\\n  ip6_addr_isloopback(ip_2_ip6(ipaddr)) : \\\n  ip4_addr_isloopback(ip_2_ip4(ipaddr)))\n/** @ingroup ipaddr */\n#define ip_addr_islinklocal(ipaddr)  ((IP_IS_V6(ipaddr)) ? \\\n  ip6_addr_islinklocal(ip_2_ip6(ipaddr)) : \\\n  ip4_addr_islinklocal(ip_2_ip4(ipaddr)))\n#define ip_addr_debug_print(debug, ipaddr) do { if(IP_IS_V6(ipaddr)) { \\\n  ip6_addr_debug_print(debug, ip_2_ip6(ipaddr)); } else { \\\n  ip4_addr_debug_print(debug, ip_2_ip4(ipaddr)); }}while(0)\n#define ip_addr_debug_print_val(debug, ipaddr) do { if(IP_IS_V6_VAL(ipaddr)) { \\\n  ip6_addr_debug_print_val(debug, *ip_2_ip6(&(ipaddr))); } else { \\\n  ip4_addr_debug_print_val(debug, *ip_2_ip4(&(ipaddr))); }}while(0)\n/** @ingroup ipaddr */\n#define ipaddr_ntoa(addr)   (((addr) == NULL) ? \"NULL\" : \\\n  ((IP_IS_V6(addr)) ? ip6addr_ntoa(ip_2_ip6(addr)) : ip4addr_ntoa(ip_2_ip4(addr))))\n/** @ingroup ipaddr */\n#define ipaddr_ntoa_r(addr, buf, buflen)   (((addr) == NULL) ? \"NULL\" : \\\n  ((IP_IS_V6(addr)) ? ip6addr_ntoa_r(ip_2_ip6(addr), buf, buflen) : ip4addr_ntoa_r(ip_2_ip4(addr), buf, buflen)))\nint ipaddr_aton(const char *cp, ip_addr_t *addr);\n\n/** @ingroup ipaddr */\n#define IPADDR_STRLEN_MAX   IP6ADDR_STRLEN_MAX\n\n/** @ingroup ipaddr */\n#define ip4_2_ipv4_mapped_ipv6(ip6addr, ip4addr) do { \\\n  (ip6addr)->addr[3] = (ip4addr)->addr; \\\n  (ip6addr)->addr[2] = PP_HTONL(0x0000FFFFUL); \\\n  (ip6addr)->addr[1] = 0; \\\n  (ip6addr)->addr[0] = 0; } while(0);\n\n/** @ingroup ipaddr */\n#define unmap_ipv4_mapped_ipv6(ip4addr, ip6addr) \\\n  (ip4addr)->addr = (ip6addr)->addr[3];\n\n#define IP46_ADDR_ANY(type) (((type) == IPADDR_TYPE_V6)? IP6_ADDR_ANY : IP4_ADDR_ANY)\n\n#else /* LWIP_IPV4 && LWIP_IPV6 */\n\n#define IP_ADDR_PCB_VERSION_MATCH(addr, pcb)         1\n#define IP_ADDR_PCB_VERSION_MATCH_EXACT(pcb, ipaddr) 1\n\n#if LWIP_IPV4\n\ntypedef ip4_addr_t ip_addr_t;\n#define IPADDR4_INIT(u32val)                    { u32val }\n#define IPADDR4_INIT_BYTES(a,b,c,d)             IPADDR4_INIT(PP_HTONL(LWIP_MAKEU32(a,b,c,d)))\n#define IP_IS_V4_VAL(ipaddr)                    1\n#define IP_IS_V6_VAL(ipaddr)                    0\n#define IP_IS_V4(ipaddr)                        1\n#define IP_IS_V6(ipaddr)                        0\n#define IP_IS_ANY_TYPE_VAL(ipaddr)              0\n#define IP_SET_TYPE_VAL(ipaddr, iptype)\n#define IP_SET_TYPE(ipaddr, iptype)\n#define IP_GET_TYPE(ipaddr)                     IPADDR_TYPE_V4\n#define ip_2_ip4(ipaddr)                        (ipaddr)\n#define IP_ADDR4(ipaddr,a,b,c,d)                IP4_ADDR(ipaddr,a,b,c,d)\n\n#define ip_addr_copy(dest, src)                 ip4_addr_copy(dest, src)\n#define ip_addr_copy_from_ip4(dest, src)        ip4_addr_copy(dest, src)\n#define ip_addr_set_ip4_u32(ipaddr, val)        ip4_addr_set_u32(ip_2_ip4(ipaddr), val)\n#define ip_addr_get_ip4_u32(ipaddr)             ip4_addr_get_u32(ip_2_ip4(ipaddr))\n#define ip_addr_set(dest, src)                  ip4_addr_set(dest, src)\n#define ip_addr_set_ipaddr(dest, src)           ip4_addr_set(dest, src)\n#define ip_addr_set_zero(ipaddr)                ip4_addr_set_zero(ipaddr)\n#define ip_addr_set_zero_ip4(ipaddr)            ip4_addr_set_zero(ipaddr)\n#define ip_addr_set_any(is_ipv6, ipaddr)        ip4_addr_set_any(ipaddr)\n#define ip_addr_set_loopback(is_ipv6, ipaddr)   ip4_addr_set_loopback(ipaddr)\n#define ip_addr_set_hton(dest, src)             ip4_addr_set_hton(dest, src)\n#define ip_addr_get_network(target, host, mask) ip4_addr_get_network(target, host, mask)\n#define ip_addr_netcmp(addr1, addr2, mask)      ip4_addr_netcmp(addr1, addr2, mask)\n#define ip_addr_cmp(addr1, addr2)               ip4_addr_cmp(addr1, addr2)\n#define ip_addr_isany(ipaddr)                   ip4_addr_isany(ipaddr)\n#define ip_addr_isany_val(ipaddr)               ip4_addr_isany_val(ipaddr)\n#define ip_addr_isloopback(ipaddr)              ip4_addr_isloopback(ipaddr)\n#define ip_addr_islinklocal(ipaddr)             ip4_addr_islinklocal(ipaddr)\n#define ip_addr_isbroadcast(addr, netif)        ip4_addr_isbroadcast(addr, netif)\n#define ip_addr_ismulticast(ipaddr)             ip4_addr_ismulticast(ipaddr)\n#define ip_addr_debug_print(debug, ipaddr)      ip4_addr_debug_print(debug, ipaddr)\n#define ip_addr_debug_print_val(debug, ipaddr)  ip4_addr_debug_print_val(debug, ipaddr)\n#define ipaddr_ntoa(ipaddr)                     ip4addr_ntoa(ipaddr)\n#define ipaddr_ntoa_r(ipaddr, buf, buflen)      ip4addr_ntoa_r(ipaddr, buf, buflen)\n#define ipaddr_aton(cp, addr)                   ip4addr_aton(cp, addr)\n\n#define IPADDR_STRLEN_MAX   IP4ADDR_STRLEN_MAX\n\n#define IP46_ADDR_ANY(type) (IP4_ADDR_ANY)\n\n#else /* LWIP_IPV4 */\n\ntypedef ip6_addr_t ip_addr_t;\n#define IPADDR6_INIT(a, b, c, d)                { { a, b, c, d } }\n#define IPADDR6_INIT_HOST(a, b, c, d)           { { PP_HTONL(a), PP_HTONL(b), PP_HTONL(c), PP_HTONL(d) } }\n#define IP_IS_V4_VAL(ipaddr)                    0\n#define IP_IS_V6_VAL(ipaddr)                    1\n#define IP_IS_V4(ipaddr)                        0\n#define IP_IS_V6(ipaddr)                        1\n#define IP_IS_ANY_TYPE_VAL(ipaddr)              0\n#define IP_SET_TYPE_VAL(ipaddr, iptype)\n#define IP_SET_TYPE(ipaddr, iptype)\n#define IP_GET_TYPE(ipaddr)                     IPADDR_TYPE_V6\n#define ip_2_ip6(ipaddr)                        (ipaddr)\n#define IP_ADDR6(ipaddr,i0,i1,i2,i3)            IP6_ADDR(ipaddr,i0,i1,i2,i3)\n#define IP_ADDR6_HOST(ipaddr,i0,i1,i2,i3)       IP_ADDR6(ipaddr,PP_HTONL(i0),PP_HTONL(i1),PP_HTONL(i2),PP_HTONL(i3))\n\n#define ip_addr_copy(dest, src)                 ip6_addr_copy(dest, src)\n#define ip_addr_copy_from_ip6(dest, src)        ip6_addr_copy(dest, src)\n#define ip_addr_set(dest, src)                  ip6_addr_set(dest, src)\n#define ip_addr_set_ipaddr(dest, src)           ip6_addr_set(dest, src)\n#define ip_addr_set_zero(ipaddr)                ip6_addr_set_zero(ipaddr)\n#define ip_addr_set_zero_ip6(ipaddr)            ip6_addr_set_zero(ipaddr)\n#define ip_addr_set_any(is_ipv6, ipaddr)        ip6_addr_set_any(ipaddr)\n#define ip_addr_set_loopback(is_ipv6, ipaddr)   ip6_addr_set_loopback(ipaddr)\n#define ip_addr_set_hton(dest, src)             ip6_addr_set_hton(dest, src)\n#define ip_addr_get_network(target, host, mask) ip6_addr_set_zero(target)\n#define ip_addr_netcmp(addr1, addr2, mask)      0\n#define ip_addr_cmp(addr1, addr2)               ip6_addr_cmp(addr1, addr2)\n#define ip_addr_isany(ipaddr)                   ip6_addr_isany(ipaddr)\n#define ip_addr_isany_val(ipaddr)               ip6_addr_isany_val(ipaddr)\n#define ip_addr_isloopback(ipaddr)              ip6_addr_isloopback(ipaddr)\n#define ip_addr_islinklocal(ipaddr)             ip6_addr_islinklocal(ipaddr)\n#define ip_addr_isbroadcast(addr, netif)        0\n#define ip_addr_ismulticast(ipaddr)             ip6_addr_ismulticast(ipaddr)\n#define ip_addr_debug_print(debug, ipaddr)      ip6_addr_debug_print(debug, ipaddr)\n#define ip_addr_debug_print_val(debug, ipaddr)  ip6_addr_debug_print_val(debug, ipaddr)\n#define ipaddr_ntoa(ipaddr)                     ip6addr_ntoa(ipaddr)\n#define ipaddr_ntoa_r(ipaddr, buf, buflen)      ip6addr_ntoa_r(ipaddr, buf, buflen)\n#define ipaddr_aton(cp, addr)                   ip6addr_aton(cp, addr)\n\n#define IPADDR_STRLEN_MAX   IP6ADDR_STRLEN_MAX\n\n#define IP46_ADDR_ANY(type) (IP6_ADDR_ANY)\n\n#endif /* LWIP_IPV4 */\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n#if LWIP_IPV4\n\nextern const ip_addr_t ip_addr_any;\nextern const ip_addr_t ip_addr_broadcast;\n\n/**\n * @ingroup ip4addr\n * Can be used as a fixed/const ip_addr_t\n * for the IP wildcard.\n * Defined to @ref IP4_ADDR_ANY when IPv4 is enabled.\n * Defined to @ref IP6_ADDR_ANY in IPv6 only systems.\n * Use this if you can handle IPv4 _AND_ IPv6 addresses.\n * Use @ref IP4_ADDR_ANY or @ref IP6_ADDR_ANY when the IP\n * type matters.\n */\n#define IP_ADDR_ANY         IP4_ADDR_ANY\n/**\n * @ingroup ip4addr\n * Can be used as a fixed/const ip_addr_t\n * for the IPv4 wildcard and the broadcast address\n */\n#define IP4_ADDR_ANY        (&ip_addr_any)\n/**\n * @ingroup ip4addr\n * Can be used as a fixed/const ip4_addr_t\n * for the wildcard and the broadcast address\n */\n#define IP4_ADDR_ANY4       (ip_2_ip4(&ip_addr_any))\n\n/** @ingroup ip4addr */\n#define IP_ADDR_BROADCAST   (&ip_addr_broadcast)\n/** @ingroup ip4addr */\n#define IP4_ADDR_BROADCAST  (ip_2_ip4(&ip_addr_broadcast))\n\n#endif /* LWIP_IPV4*/\n\n#if LWIP_IPV6\n\nextern const ip_addr_t ip6_addr_any;\n\n/** \n * @ingroup ip6addr\n * IP6_ADDR_ANY can be used as a fixed ip_addr_t\n * for the IPv6 wildcard address\n */\n#define IP6_ADDR_ANY   (&ip6_addr_any)\n/**\n * @ingroup ip6addr\n * IP6_ADDR_ANY6 can be used as a fixed ip6_addr_t\n * for the IPv6 wildcard address\n */\n#define IP6_ADDR_ANY6  (ip_2_ip6(&ip6_addr_any))\n\n#if !LWIP_IPV4\n/** IPv6-only configurations */\n#define IP_ADDR_ANY IP6_ADDR_ANY\n#endif /* !LWIP_IPV4 */\n\n#endif\n\n#if LWIP_IPV4 && LWIP_IPV6\n/** @ingroup ipaddr */\n#define IP_ANY_TYPE    (&ip_addr_any_type)\n#else\n#define IP_ANY_TYPE    IP_ADDR_ANY\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_IP_ADDR_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/mem.h",
    "content": "/**\n * @file\n * Heap API\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_MEM_H\n#define LWIP_HDR_MEM_H\n\n#include \"lwip/opt.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if MEM_LIBC_MALLOC\n\n#include \"lwip/arch.h\"\n\ntypedef size_t mem_size_t;\n#define MEM_SIZE_F SZT_F\n\n#elif MEM_USE_POOLS\n\ntypedef u16_t mem_size_t;\n#define MEM_SIZE_F U16_F\n\n#else\n\n/* MEM_SIZE would have to be aligned, but using 64000 here instead of\n * 65535 leaves some room for alignment...\n */\n#if MEM_SIZE > 64000L\ntypedef u32_t mem_size_t;\n#define MEM_SIZE_F U32_F\n#else\ntypedef u16_t mem_size_t;\n#define MEM_SIZE_F U16_F\n#endif /* MEM_SIZE > 64000 */\n#endif\n\nvoid  mem_init(void);\nvoid *mem_trim(void *mem, mem_size_t size);\nvoid *mem_malloc(mem_size_t size);\nvoid *mem_calloc(mem_size_t count, mem_size_t size);\nvoid  mem_free(void *mem);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_MEM_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/memp.h",
    "content": "/**\n * @file\n * Memory pool API\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#ifndef LWIP_HDR_MEMP_H\n#define LWIP_HDR_MEMP_H\n\n#include \"lwip/opt.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* run once with empty definition to handle all custom includes in lwippools.h */\n#define LWIP_MEMPOOL(name,num,size,desc)\n#include \"lwip/priv/memp_std.h\"\n\n/** Create the list of all memory pools managed by memp. MEMP_MAX represents a NULL pool at the end */\ntypedef enum {\n#define LWIP_MEMPOOL(name,num,size,desc)  MEMP_##name,\n#include \"lwip/priv/memp_std.h\"\n  MEMP_MAX\n} memp_t;\n\n#include \"lwip/priv/memp_priv.h\"\n#include \"lwip/stats.h\"\n\nextern const struct memp_desc* const memp_pools[MEMP_MAX];\n\n/**\n * @ingroup mempool\n * Declare prototype for private memory pool if it is used in multiple files\n */\n#define LWIP_MEMPOOL_PROTOTYPE(name) extern const struct memp_desc memp_ ## name\n\n#if MEMP_MEM_MALLOC\n\n#define LWIP_MEMPOOL_DECLARE(name,num,size,desc) \\\n  LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(memp_stats_ ## name) \\\n  const struct memp_desc memp_ ## name = { \\\n    DECLARE_LWIP_MEMPOOL_DESC(desc) \\\n    LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(memp_stats_ ## name) \\\n    LWIP_MEM_ALIGN_SIZE(size) \\\n  };\n\n#else /* MEMP_MEM_MALLOC */\n\n/**\n * @ingroup mempool\n * Declare a private memory pool\n * Private mempools example:\n * .h: only when pool is used in multiple .c files: LWIP_MEMPOOL_PROTOTYPE(my_private_pool);\n * .c:\n *   - in global variables section: LWIP_MEMPOOL_DECLARE(my_private_pool, 10, sizeof(foo), \"Some description\")\n *   - call ONCE before using pool (e.g. in some init() function): LWIP_MEMPOOL_INIT(my_private_pool);\n *   - allocate: void* my_new_mem = LWIP_MEMPOOL_ALLOC(my_private_pool);\n *   - free: LWIP_MEMPOOL_FREE(my_private_pool, my_new_mem);\n *\n * To relocate a pool, declare it as extern in cc.h. Example for GCC:\n *   extern u8_t __attribute__((section(\".onchip_mem\"))) memp_memory_my_private_pool[];\n */\n#define LWIP_MEMPOOL_DECLARE(name,num,size,desc) \\\n  LWIP_DECLARE_MEMORY_ALIGNED(memp_memory_ ## name ## _base, ((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size)))); \\\n    \\\n  LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(memp_stats_ ## name) \\\n    \\\n  static struct memp *memp_tab_ ## name; \\\n    \\\n  const struct memp_desc memp_ ## name = { \\\n    DECLARE_LWIP_MEMPOOL_DESC(desc) \\\n    LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(memp_stats_ ## name) \\\n    LWIP_MEM_ALIGN_SIZE(size), \\\n    (num), \\\n    memp_memory_ ## name ## _base, \\\n    &memp_tab_ ## name \\\n  };\n\n#endif /* MEMP_MEM_MALLOC */\n\n/**\n * @ingroup mempool\n * Initialize a private memory pool\n */\n#define LWIP_MEMPOOL_INIT(name)    memp_init_pool(&memp_ ## name)\n/**\n * @ingroup mempool\n * Allocate from a private memory pool\n */\n#define LWIP_MEMPOOL_ALLOC(name)   memp_malloc_pool(&memp_ ## name)\n/**\n * @ingroup mempool\n * Free element from a private memory pool\n */\n#define LWIP_MEMPOOL_FREE(name, x) memp_free_pool(&memp_ ## name, (x))\n\n#if MEM_USE_POOLS\n/** This structure is used to save the pool one element came from.\n * This has to be defined here as it is required for pool size calculation. */\nstruct memp_malloc_helper\n{\n   memp_t poolnr;\n#if MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS)\n   u16_t size;\n#endif /* MEMP_OVERFLOW_CHECK || (LWIP_STATS && MEM_STATS) */\n};\n#endif /* MEM_USE_POOLS */\n\nvoid  memp_init(void);\n\n#if MEMP_OVERFLOW_CHECK\nvoid *memp_malloc_fn(memp_t type, const char* file, const int line);\n#define memp_malloc(t) memp_malloc_fn((t), __FILE__, __LINE__)\n#else\nvoid *memp_malloc(memp_t type);\n#endif\nvoid  memp_free(memp_t type, void *mem);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_MEMP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/mld6.h",
    "content": "/**\n * @file\n *\n * Multicast listener discovery for IPv6. Aims to be compliant with RFC 2710.\n * No support for MLDv2.\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#ifndef LWIP_HDR_MLD6_H\n#define LWIP_HDR_MLD6_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6_MLD && LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/netif.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** MLD group */\nstruct mld_group {\n  /** next link */\n  struct mld_group *next;\n  /** multicast address */\n  ip6_addr_t         group_address;\n  /** signifies we were the last person to report */\n  u8_t               last_reporter_flag;\n  /** current state of the group */\n  u8_t               group_state;\n  /** timer for reporting */\n  u16_t              timer;\n  /** counter of simultaneous uses */\n  u8_t               use;\n};\n\n#define MLD6_TMR_INTERVAL              100 /* Milliseconds */\n\nerr_t  mld6_stop(struct netif *netif);\nvoid   mld6_report_groups(struct netif *netif);\nvoid   mld6_tmr(void);\nstruct mld_group *mld6_lookfor_group(struct netif *ifp, const ip6_addr_t *addr);\nvoid   mld6_input(struct pbuf *p, struct netif *inp);\nerr_t  mld6_joingroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr);\nerr_t  mld6_joingroup_netif(struct netif *netif, const ip6_addr_t *groupaddr);\nerr_t  mld6_leavegroup(const ip6_addr_t *srcaddr, const ip6_addr_t *groupaddr);\nerr_t  mld6_leavegroup_netif(struct netif *netif, const ip6_addr_t *groupaddr);\n\n/** @ingroup mld6\n * Get list head of MLD6 groups for netif.\n * Note: The allnodes group IP is NOT in the list, since it must always \n * be received for correct IPv6 operation.\n * @see @ref netif_set_mld_mac_filter()\n */\n#define netif_mld6_data(netif) ((struct mld_group *)netif_get_client_data(netif, LWIP_NETIF_CLIENT_DATA_INDEX_MLD6))\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV6_MLD && LWIP_IPV6 */\n\n#endif /* LWIP_HDR_MLD6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/nd6.h",
    "content": "/**\n * @file\n *\n * Neighbor discovery and stateless address autoconfiguration for IPv6.\n * Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862\n * (Address autoconfiguration).\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#ifndef LWIP_HDR_ND6_H\n#define LWIP_HDR_ND6_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/err.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** 1 second period */\n#define ND6_TMR_INTERVAL 1000\n\nstruct pbuf;\nstruct netif;\n\nvoid nd6_tmr(void);\nvoid nd6_input(struct pbuf *p, struct netif *inp);\nvoid nd6_clear_destination_cache(void);\nstruct netif *nd6_find_route(const ip6_addr_t *ip6addr);\nerr_t nd6_get_next_hop_addr_or_queue(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr, const u8_t **hwaddrp);\nu16_t nd6_get_destination_mtu(const ip6_addr_t *ip6addr, struct netif *netif);\n#if LWIP_ND6_TCP_REACHABILITY_HINTS\nvoid nd6_reachability_hint(const ip6_addr_t *ip6addr);\n#endif /* LWIP_ND6_TCP_REACHABILITY_HINTS */\nvoid nd6_cleanup_netif(struct netif *netif);\n#if LWIP_IPV6_MLD\nvoid nd6_adjust_mld_membership(struct netif *netif, s8_t addr_idx, u8_t new_state);\n#endif /* LWIP_IPV6_MLD */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV6 */\n\n#endif /* LWIP_HDR_ND6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/netbuf.h",
    "content": "/**\n * @file\n * netbuf API (for netconn API)\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_NETBUF_H\n#define LWIP_HDR_NETBUF_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_NETCONN || LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */\n/* Note: Netconn API is always available when sockets are enabled -\n * sockets are implemented on top of them */\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/ip6_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** This netbuf has dest-addr/port set */\n#define NETBUF_FLAG_DESTADDR    0x01\n/** This netbuf includes a checksum */\n#define NETBUF_FLAG_CHKSUM      0x02\n\n/** \"Network buffer\" - contains data and addressing info */\nstruct netbuf {\n  struct pbuf *p, *ptr;\n  ip_addr_t addr;\n  u16_t port;\n#if LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY\n#if LWIP_CHECKSUM_ON_COPY\n  u8_t flags;\n#endif /* LWIP_CHECKSUM_ON_COPY */\n  u16_t toport_chksum;\n#if LWIP_NETBUF_RECVINFO\n  ip_addr_t toaddr;\n#endif /* LWIP_NETBUF_RECVINFO */\n#endif /* LWIP_NETBUF_RECVINFO || LWIP_CHECKSUM_ON_COPY */\n};\n\n/* Network buffer functions: */\nstruct netbuf *   netbuf_new      (void);\nvoid              netbuf_delete   (struct netbuf *buf);\nvoid *            netbuf_alloc    (struct netbuf *buf, u16_t size);\nvoid              netbuf_free     (struct netbuf *buf);\nerr_t             netbuf_ref      (struct netbuf *buf,\n                                   const void *dataptr, u16_t size);\nvoid              netbuf_chain    (struct netbuf *head, struct netbuf *tail);\n\nerr_t             netbuf_data     (struct netbuf *buf,\n                                   void **dataptr, u16_t *len);\ns8_t              netbuf_next     (struct netbuf *buf);\nvoid              netbuf_first    (struct netbuf *buf);\n\n\n#define netbuf_copy_partial(buf, dataptr, len, offset) \\\n  pbuf_copy_partial((buf)->p, (dataptr), (len), (offset))\n#define netbuf_copy(buf,dataptr,len) netbuf_copy_partial(buf, dataptr, len, 0)\n#define netbuf_take(buf, dataptr, len) pbuf_take((buf)->p, dataptr, len)\n#define netbuf_len(buf)              ((buf)->p->tot_len)\n#define netbuf_fromaddr(buf)         (&((buf)->addr))\n#define netbuf_set_fromaddr(buf, fromaddr) ip_addr_set(&((buf)->addr), fromaddr)\n#define netbuf_fromport(buf)         ((buf)->port)\n#if LWIP_NETBUF_RECVINFO\n#define netbuf_destaddr(buf)         (&((buf)->toaddr))\n#define netbuf_set_destaddr(buf, destaddr) ip_addr_set(&((buf)->toaddr), destaddr)\n#if LWIP_CHECKSUM_ON_COPY\n#define netbuf_destport(buf)         (((buf)->flags & NETBUF_FLAG_DESTADDR) ? (buf)->toport_chksum : 0)\n#else /* LWIP_CHECKSUM_ON_COPY */\n#define netbuf_destport(buf)         ((buf)->toport_chksum)\n#endif /* LWIP_CHECKSUM_ON_COPY */\n#endif /* LWIP_NETBUF_RECVINFO */\n#if LWIP_CHECKSUM_ON_COPY\n#define netbuf_set_chksum(buf, chksum) do { (buf)->flags = NETBUF_FLAG_CHKSUM; \\\n                                            (buf)->toport_chksum = chksum; } while(0)\n#endif /* LWIP_CHECKSUM_ON_COPY */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_NETCONN || LWIP_SOCKET */\n\n#endif /* LWIP_HDR_NETBUF_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/netdb.h",
    "content": "/**\n * @file\n * NETDB API (sockets)\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Simon Goldschmidt\n *\n */\n#ifndef LWIP_HDR_NETDB_H\n#define LWIP_HDR_NETDB_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_DNS && LWIP_SOCKET\n\n#include \"lwip/arch.h\"\n#include \"lwip/inet.h\"\n#include \"lwip/sockets.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* some rarely used options */\n#ifndef LWIP_DNS_API_DECLARE_H_ERRNO\n#define LWIP_DNS_API_DECLARE_H_ERRNO  1\n#endif\n\n#ifndef LWIP_DNS_API_DEFINE_ERRORS\n#define LWIP_DNS_API_DEFINE_ERRORS    1\n#endif\n\n#ifndef LWIP_DNS_API_DEFINE_FLAGS\n#define LWIP_DNS_API_DEFINE_FLAGS     1\n#endif\n\n#ifndef LWIP_DNS_API_DECLARE_STRUCTS\n#define LWIP_DNS_API_DECLARE_STRUCTS  1\n#endif\n\n#if LWIP_DNS_API_DEFINE_ERRORS\n/** Errors used by the DNS API functions, h_errno can be one of them */\n#define EAI_NONAME      200\n#define EAI_SERVICE     201\n#define EAI_FAIL        202\n#define EAI_MEMORY      203\n#define EAI_FAMILY      204\n\n#define HOST_NOT_FOUND  210\n#define NO_DATA         211\n#define NO_RECOVERY     212\n#define TRY_AGAIN       213\n#endif /* LWIP_DNS_API_DEFINE_ERRORS */\n\n#if LWIP_DNS_API_DEFINE_FLAGS\n/* input flags for struct addrinfo */\n#define AI_PASSIVE      0x01\n#define AI_CANONNAME    0x02\n#define AI_NUMERICHOST  0x04\n#define AI_NUMERICSERV  0x08\n#define AI_V4MAPPED     0x10\n#define AI_ALL          0x20\n#define AI_ADDRCONFIG   0x40\n#endif /* LWIP_DNS_API_DEFINE_FLAGS */\n\n#if LWIP_DNS_API_DECLARE_STRUCTS\nstruct hostent {\n    char  *h_name;      /* Official name of the host. */\n    char **h_aliases;   /* A pointer to an array of pointers to alternative host names,\n                           terminated by a null pointer. */\n    int    h_addrtype;  /* Address type. */\n    int    h_length;    /* The length, in bytes, of the address. */\n    char **h_addr_list; /* A pointer to an array of pointers to network addresses (in\n                           network byte order) for the host, terminated by a null pointer. */\n#define h_addr h_addr_list[0] /* for backward compatibility */\n};\n\nstruct addrinfo {\n    int               ai_flags;      /* Input flags. */\n    int               ai_family;     /* Address family of socket. */\n    int               ai_socktype;   /* Socket type. */\n    int               ai_protocol;   /* Protocol of socket. */\n    socklen_t         ai_addrlen;    /* Length of socket address. */\n    struct sockaddr  *ai_addr;       /* Socket address of socket. */\n    char             *ai_canonname;  /* Canonical name of service location. */\n    struct addrinfo  *ai_next;       /* Pointer to next in list. */\n};\n#endif /* LWIP_DNS_API_DECLARE_STRUCTS */\n\n#define NETDB_ELEM_SIZE           (sizeof(struct addrinfo) + sizeof(struct sockaddr_storage) + DNS_MAX_NAME_LENGTH + 1)\n\n#if LWIP_DNS_API_DECLARE_H_ERRNO\n/* application accessible error code set by the DNS API functions */\nextern int h_errno;\n#endif /* LWIP_DNS_API_DECLARE_H_ERRNO*/\n\nstruct hostent *lwip_gethostbyname(const char *name);\nint lwip_gethostbyname_r(const char *name, struct hostent *ret, char *buf,\n                size_t buflen, struct hostent **result, int *h_errnop);\nvoid lwip_freeaddrinfo(struct addrinfo *ai);\nint lwip_getaddrinfo(const char *nodename,\n       const char *servname,\n       const struct addrinfo *hints,\n       struct addrinfo **res);\n\n#if LWIP_COMPAT_SOCKETS\n/** @ingroup netdbapi */\n#define gethostbyname(name) lwip_gethostbyname(name)\n/** @ingroup netdbapi */\n#define gethostbyname_r(name, ret, buf, buflen, result, h_errnop) \\\n       lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop)\n/** @ingroup netdbapi */\n#define freeaddrinfo(addrinfo) lwip_freeaddrinfo(addrinfo)\n/** @ingroup netdbapi */\n#define getaddrinfo(nodname, servname, hints, res) \\\n       lwip_getaddrinfo(nodname, servname, hints, res)\n#endif /* LWIP_COMPAT_SOCKETS */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_DNS && LWIP_SOCKET */\n\n#endif /* LWIP_HDR_NETDB_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/netif.h",
    "content": "/**\n * @file\n * netif API (to be used from TCPIP thread)\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_NETIF_H\n#define LWIP_HDR_NETIF_H\n\n#include \"lwip/opt.h\"\n\n#define ENABLE_LOOPBACK (LWIP_NETIF_LOOPBACK || LWIP_HAVE_LOOPIF)\n\n#include \"lwip/err.h\"\n\n#include \"lwip/ip_addr.h\"\n\n#include \"lwip/def.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/stats.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Throughout this file, IP addresses are expected to be in\n * the same byte order as in IP_PCB. */\n\n/** Must be the maximum of all used hardware address lengths\n    across all types of interfaces in use.\n    This does not have to be changed, normally. */\n#ifndef NETIF_MAX_HWADDR_LEN\n#define NETIF_MAX_HWADDR_LEN 6U\n#endif\n\n/**\n * @defgroup netif_flags Flags\n * @ingroup netif\n * @{\n */\n\n/** Whether the network interface is 'up'. This is\n * a software flag used to control whether this network\n * interface is enabled and processes traffic.\n * It must be set by the startup code before this netif can be used\n * (also for dhcp/autoip).\n */\n#define NETIF_FLAG_UP           0x01U\n/** If set, the netif has broadcast capability.\n * Set by the netif driver in its init function. */\n#define NETIF_FLAG_BROADCAST    0x02U\n/** If set, the interface has an active link\n *  (set by the network interface driver).\n * Either set by the netif driver in its init function (if the link\n * is up at that time) or at a later point once the link comes up\n * (if link detection is supported by the hardware). */\n#define NETIF_FLAG_LINK_UP      0x04U\n/** If set, the netif is an ethernet device using ARP.\n * Set by the netif driver in its init function.\n * Used to check input packet types and use of DHCP. */\n#define NETIF_FLAG_ETHARP       0x08U\n/** If set, the netif is an ethernet device. It might not use\n * ARP or TCP/IP if it is used for PPPoE only.\n */\n#define NETIF_FLAG_ETHERNET     0x10U\n/** If set, the netif has IGMP capability.\n * Set by the netif driver in its init function. */\n#define NETIF_FLAG_IGMP         0x20U\n/** If set, the netif has MLD6 capability.\n * Set by the netif driver in its init function. */\n#define NETIF_FLAG_MLD6         0x40U\n\n/**\n * @}\n */\n\nenum lwip_internal_netif_client_data_index\n{\n#if LWIP_DHCP\n   LWIP_NETIF_CLIENT_DATA_INDEX_DHCP,\n#endif\n#if LWIP_AUTOIP\n   LWIP_NETIF_CLIENT_DATA_INDEX_AUTOIP,\n#endif\n#if LWIP_IGMP\n   LWIP_NETIF_CLIENT_DATA_INDEX_IGMP,\n#endif\n#if LWIP_IPV6_MLD\n   LWIP_NETIF_CLIENT_DATA_INDEX_MLD6,\n#endif\n   LWIP_NETIF_CLIENT_DATA_INDEX_MAX\n};\n\n#if LWIP_CHECKSUM_CTRL_PER_NETIF\n#define NETIF_CHECKSUM_GEN_IP       0x0001\n#define NETIF_CHECKSUM_GEN_UDP      0x0002\n#define NETIF_CHECKSUM_GEN_TCP      0x0004\n#define NETIF_CHECKSUM_GEN_ICMP     0x0008\n#define NETIF_CHECKSUM_GEN_ICMP6    0x0010\n#define NETIF_CHECKSUM_CHECK_IP     0x0100\n#define NETIF_CHECKSUM_CHECK_UDP    0x0200\n#define NETIF_CHECKSUM_CHECK_TCP    0x0400\n#define NETIF_CHECKSUM_CHECK_ICMP   0x0800\n#define NETIF_CHECKSUM_CHECK_ICMP6  0x1000\n#define NETIF_CHECKSUM_ENABLE_ALL   0xFFFF\n#define NETIF_CHECKSUM_DISABLE_ALL  0x0000\n#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */\n\nstruct netif;\n\n/** MAC Filter Actions, these are passed to a netif's igmp_mac_filter or\n * mld_mac_filter callback function. */\nenum netif_mac_filter_action {\n  /** Delete a filter entry */\n  NETIF_DEL_MAC_FILTER = 0,\n  /** Add a filter entry */\n  NETIF_ADD_MAC_FILTER = 1\n};\n\n/** Function prototype for netif init functions. Set up flags and output/linkoutput\n * callback functions in this function.\n *\n * @param netif The netif to initialize\n */\ntypedef err_t (*netif_init_fn)(struct netif *netif);\n/** Function prototype for netif->input functions. This function is saved as 'input'\n * callback function in the netif struct. Call it when a packet has been received.\n *\n * @param p The received packet, copied into a pbuf\n * @param inp The netif which received the packet\n */\ntypedef err_t (*netif_input_fn)(struct pbuf *p, struct netif *inp);\n\n#if LWIP_IPV4\n/** Function prototype for netif->output functions. Called by lwIP when a packet\n * shall be sent. For ethernet netif, set this to 'etharp_output' and set\n * 'linkoutput'.\n *\n * @param netif The netif which shall send a packet\n * @param p The packet to send (p->payload points to IP header)\n * @param ipaddr The IP address to which the packet shall be sent\n */\ntypedef err_t (*netif_output_fn)(struct netif *netif, struct pbuf *p,\n       const ip4_addr_t *ipaddr);\n#endif /* LWIP_IPV4*/\n\n#if LWIP_IPV6\n/** Function prototype for netif->output_ip6 functions. Called by lwIP when a packet\n * shall be sent. For ethernet netif, set this to 'ethip6_output' and set\n * 'linkoutput'.\n *\n * @param netif The netif which shall send a packet\n * @param p The packet to send (p->payload points to IP header)\n * @param ipaddr The IPv6 address to which the packet shall be sent\n */\ntypedef err_t (*netif_output_ip6_fn)(struct netif *netif, struct pbuf *p,\n       const ip6_addr_t *ipaddr);\n#endif /* LWIP_IPV6 */\n\n/** Function prototype for netif->linkoutput functions. Only used for ethernet\n * netifs. This function is called by ARP when a packet shall be sent.\n *\n * @param netif The netif which shall send a packet\n * @param p The packet to send (raw ethernet packet)\n */\ntypedef err_t (*netif_linkoutput_fn)(struct netif *netif, struct pbuf *p);\n/** Function prototype for netif status- or link-callback functions. */\ntypedef void (*netif_status_callback_fn)(struct netif *netif);\n#if LWIP_IPV4 && LWIP_IGMP\n/** Function prototype for netif igmp_mac_filter functions */\ntypedef err_t (*netif_igmp_mac_filter_fn)(struct netif *netif,\n       const ip4_addr_t *group, enum netif_mac_filter_action action);\n#endif /* LWIP_IPV4 && LWIP_IGMP */\n#if LWIP_IPV6 && LWIP_IPV6_MLD\n/** Function prototype for netif mld_mac_filter functions */\ntypedef err_t (*netif_mld_mac_filter_fn)(struct netif *netif,\n       const ip6_addr_t *group, enum netif_mac_filter_action action);\n#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */\n\n#if LWIP_DHCP || LWIP_AUTOIP || LWIP_IGMP || LWIP_IPV6_MLD || (LWIP_NUM_NETIF_CLIENT_DATA > 0)\nu8_t netif_alloc_client_data_id(void);\n/** @ingroup netif_cd\n * Set client data. Obtain ID from netif_alloc_client_data_id().\n */\n#define netif_set_client_data(netif, id, data) netif_get_client_data(netif, id) = (data)\n/** @ingroup netif_cd\n * Get client data. Obtain ID from netif_alloc_client_data_id().\n */\n#define netif_get_client_data(netif, id)       (netif)->client_data[(id)]\n#endif /* LWIP_DHCP || LWIP_AUTOIP || (LWIP_NUM_NETIF_CLIENT_DATA > 0) */\n\n/** Generic data structure used for all lwIP network interfaces.\n *  The following fields should be filled in by the initialization\n *  function for the device driver: hwaddr_len, hwaddr[], mtu, flags */\nstruct netif {\n  /** pointer to next in linked list */\n  struct netif *next;\n\n#if LWIP_IPV4\n  /** IP address configuration in network byte order */\n  ip_addr_t ip_addr;\n  ip_addr_t netmask;\n  ip_addr_t gw;\n#endif /* LWIP_IPV4 */\n#if LWIP_IPV6\n  /** Array of IPv6 addresses for this netif. */\n  ip_addr_t ip6_addr[LWIP_IPV6_NUM_ADDRESSES];\n  /** The state of each IPv6 address (Tentative, Preferred, etc).\n   * @see ip6_addr.h */\n  u8_t ip6_addr_state[LWIP_IPV6_NUM_ADDRESSES];\n#endif /* LWIP_IPV6 */\n  /** This function is called by the network device driver\n   *  to pass a packet up the TCP/IP stack. */\n  netif_input_fn input;\n#if LWIP_IPV4\n  /** This function is called by the IP module when it wants\n   *  to send a packet on the interface. This function typically\n   *  first resolves the hardware address, then sends the packet.\n   *  For ethernet physical layer, this is usually etharp_output() */\n  netif_output_fn output;\n#endif /* LWIP_IPV4 */\n  /** This function is called by ethernet_output() when it wants\n   *  to send a packet on the interface. This function outputs\n   *  the pbuf as-is on the link medium. */\n  netif_linkoutput_fn linkoutput;\n#if LWIP_IPV6\n  /** This function is called by the IPv6 module when it wants\n   *  to send a packet on the interface. This function typically\n   *  first resolves the hardware address, then sends the packet.\n   *  For ethernet physical layer, this is usually ethip6_output() */\n  netif_output_ip6_fn output_ip6;\n#endif /* LWIP_IPV6 */\n#if LWIP_NETIF_STATUS_CALLBACK\n  /** This function is called when the netif state is set to up or down\n   */\n  netif_status_callback_fn status_callback;\n#endif /* LWIP_NETIF_STATUS_CALLBACK */\n#if LWIP_NETIF_LINK_CALLBACK\n  /** This function is called when the netif link is set to up or down\n   */\n  netif_status_callback_fn link_callback;\n#endif /* LWIP_NETIF_LINK_CALLBACK */\n#if LWIP_NETIF_REMOVE_CALLBACK\n  /** This function is called when the netif has been removed */\n  netif_status_callback_fn remove_callback;\n#endif /* LWIP_NETIF_REMOVE_CALLBACK */\n  /** This field can be set by the device driver and could point\n   *  to state information for the device. */\n  void *state;\n#ifdef netif_get_client_data\n  void* client_data[LWIP_NETIF_CLIENT_DATA_INDEX_MAX + LWIP_NUM_NETIF_CLIENT_DATA];\n#endif\n#if LWIP_IPV6_AUTOCONFIG\n  /** is this netif enabled for IPv6 autoconfiguration */\n  u8_t ip6_autoconfig_enabled;\n#endif /* LWIP_IPV6_AUTOCONFIG */\n#if LWIP_IPV6_SEND_ROUTER_SOLICIT\n  /** Number of Router Solicitation messages that remain to be sent. */\n  u8_t rs_count;\n#endif /* LWIP_IPV6_SEND_ROUTER_SOLICIT */\n#if LWIP_NETIF_HOSTNAME\n  /* the hostname for this netif, NULL is a valid value */\n  const char*  hostname;\n#endif /* LWIP_NETIF_HOSTNAME */\n#if LWIP_CHECKSUM_CTRL_PER_NETIF\n  u16_t chksum_flags;\n#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF*/\n  /** maximum transfer unit (in bytes) */\n  u16_t mtu;\n  /** number of bytes used in hwaddr */\n  u8_t hwaddr_len;\n  /** link level hardware address of this interface */\n  u8_t hwaddr[NETIF_MAX_HWADDR_LEN];\n  /** flags (@see @ref netif_flags) */\n  u8_t flags;\n  /** descriptive abbreviation */\n  char name[2];\n  /** number of this interface */\n  u8_t num;\n#if MIB2_STATS\n  /** link type (from \"snmp_ifType\" enum from snmp_mib2.h) */\n  u8_t link_type;\n  /** (estimate) link speed */\n  u32_t link_speed;\n  /** timestamp at last change made (up/down) */\n  u32_t ts;\n  /** counters */\n  struct stats_mib2_netif_ctrs mib2_counters;\n#endif /* MIB2_STATS */\n#if LWIP_IPV4 && LWIP_IGMP\n  /** This function could be called to add or delete an entry in the multicast\n      filter table of the ethernet MAC.*/\n  netif_igmp_mac_filter_fn igmp_mac_filter;\n#endif /* LWIP_IPV4 && LWIP_IGMP */\n#if LWIP_IPV6 && LWIP_IPV6_MLD\n  /** This function could be called to add or delete an entry in the IPv6 multicast\n      filter table of the ethernet MAC. */\n  netif_mld_mac_filter_fn mld_mac_filter;\n#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */\n#if LWIP_NETIF_HWADDRHINT\n  u8_t *addr_hint;\n#endif /* LWIP_NETIF_HWADDRHINT */\n#if ENABLE_LOOPBACK\n  /* List of packets to be queued for ourselves. */\n  struct pbuf *loop_first;\n  struct pbuf *loop_last;\n#if LWIP_LOOPBACK_MAX_PBUFS\n  u16_t loop_cnt_current;\n#endif /* LWIP_LOOPBACK_MAX_PBUFS */\n#endif /* ENABLE_LOOPBACK */\n};\n\n#if LWIP_CHECKSUM_CTRL_PER_NETIF\n#define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags) do { \\\n  (netif)->chksum_flags = chksumflags; } while(0)\n#define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag) if (((netif) == NULL) || (((netif)->chksum_flags & (chksumflag)) != 0))\n#else /* LWIP_CHECKSUM_CTRL_PER_NETIF */\n#define NETIF_SET_CHECKSUM_CTRL(netif, chksumflags)\n#define IF__NETIF_CHECKSUM_ENABLED(netif, chksumflag)\n#endif /* LWIP_CHECKSUM_CTRL_PER_NETIF */\n\n/** The list of network interfaces. */\nextern struct netif *netif_list;\n/** The default network interface. */\nextern struct netif *netif_default;\n\nvoid netif_init(void);\n\nstruct netif *netif_add(struct netif *netif,\n#if LWIP_IPV4\n                        const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,\n#endif /* LWIP_IPV4 */\n                        void *state, netif_init_fn init, netif_input_fn input);\n#if LWIP_IPV4\nvoid netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr, const ip4_addr_t *netmask,\n                    const ip4_addr_t *gw);\n#endif /* LWIP_IPV4 */\nvoid netif_remove(struct netif * netif);\n\n/* Returns a network interface given its name. The name is of the form\n   \"et0\", where the first two letters are the \"name\" field in the\n   netif structure, and the digit is in the num field in the same\n   structure. */\nstruct netif *netif_find(const char *name);\n\nvoid netif_set_default(struct netif *netif);\n\n#if LWIP_IPV4\nvoid netif_set_ipaddr(struct netif *netif, const ip4_addr_t *ipaddr);\nvoid netif_set_netmask(struct netif *netif, const ip4_addr_t *netmask);\nvoid netif_set_gw(struct netif *netif, const ip4_addr_t *gw);\n/** @ingroup netif_ip4 */\n#define netif_ip4_addr(netif)    ((const ip4_addr_t*)ip_2_ip4(&((netif)->ip_addr)))\n/** @ingroup netif_ip4 */\n#define netif_ip4_netmask(netif) ((const ip4_addr_t*)ip_2_ip4(&((netif)->netmask)))\n/** @ingroup netif_ip4 */\n#define netif_ip4_gw(netif)      ((const ip4_addr_t*)ip_2_ip4(&((netif)->gw)))\n/** @ingroup netif_ip4 */\n#define netif_ip_addr4(netif)    ((const ip_addr_t*)&((netif)->ip_addr))\n/** @ingroup netif_ip4 */\n#define netif_ip_netmask4(netif) ((const ip_addr_t*)&((netif)->netmask))\n/** @ingroup netif_ip4 */\n#define netif_ip_gw4(netif)      ((const ip_addr_t*)&((netif)->gw))\n#endif /* LWIP_IPV4 */\n\nvoid netif_set_up(struct netif *netif);\nvoid netif_set_down(struct netif *netif);\n/** @ingroup netif\n * Ask if an interface is up\n */\n#define netif_is_up(netif) (((netif)->flags & NETIF_FLAG_UP) ? (u8_t)1 : (u8_t)0)\n\n#if LWIP_NETIF_STATUS_CALLBACK\nvoid netif_set_status_callback(struct netif *netif, netif_status_callback_fn status_callback);\n#endif /* LWIP_NETIF_STATUS_CALLBACK */\n#if LWIP_NETIF_REMOVE_CALLBACK\nvoid netif_set_remove_callback(struct netif *netif, netif_status_callback_fn remove_callback);\n#endif /* LWIP_NETIF_REMOVE_CALLBACK */\n\nvoid netif_set_link_up(struct netif *netif);\nvoid netif_set_link_down(struct netif *netif);\n/** Ask if a link is up */\n#define netif_is_link_up(netif) (((netif)->flags & NETIF_FLAG_LINK_UP) ? (u8_t)1 : (u8_t)0)\n\n#if LWIP_NETIF_LINK_CALLBACK\nvoid netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback);\n#endif /* LWIP_NETIF_LINK_CALLBACK */\n\n#if LWIP_NETIF_HOSTNAME\n/** @ingroup netif */\n#define netif_set_hostname(netif, name) do { if((netif) != NULL) { (netif)->hostname = name; }}while(0)\n/** @ingroup netif */\n#define netif_get_hostname(netif) (((netif) != NULL) ? ((netif)->hostname) : NULL)\n#endif /* LWIP_NETIF_HOSTNAME */\n\n#if LWIP_IGMP\n/** @ingroup netif */\n#define netif_set_igmp_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->igmp_mac_filter = function; }}while(0)\n#define netif_get_igmp_mac_filter(netif) (((netif) != NULL) ? ((netif)->igmp_mac_filter) : NULL)\n#endif /* LWIP_IGMP */\n\n#if LWIP_IPV6 && LWIP_IPV6_MLD\n/** @ingroup netif */\n#define netif_set_mld_mac_filter(netif, function) do { if((netif) != NULL) { (netif)->mld_mac_filter = function; }}while(0)\n#define netif_get_mld_mac_filter(netif) (((netif) != NULL) ? ((netif)->mld_mac_filter) : NULL)\n#define netif_mld_mac_filter(netif, addr, action) do { if((netif) && (netif)->mld_mac_filter) { (netif)->mld_mac_filter((netif), (addr), (action)); }}while(0)\n#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */\n\n#if ENABLE_LOOPBACK\nerr_t netif_loop_output(struct netif *netif, struct pbuf *p);\nvoid netif_poll(struct netif *netif);\n#if !LWIP_NETIF_LOOPBACK_MULTITHREADING\nvoid netif_poll_all(void);\n#endif /* !LWIP_NETIF_LOOPBACK_MULTITHREADING */\n#endif /* ENABLE_LOOPBACK */\n\nerr_t netif_input(struct pbuf *p, struct netif *inp);\n\n#if LWIP_IPV6\n/** @ingroup netif_ip6 */\n#define netif_ip_addr6(netif, i)  ((const ip_addr_t*)(&((netif)->ip6_addr[i])))\n/** @ingroup netif_ip6 */\n#define netif_ip6_addr(netif, i)  ((const ip6_addr_t*)ip_2_ip6(&((netif)->ip6_addr[i])))\nvoid netif_ip6_addr_set(struct netif *netif, s8_t addr_idx, const ip6_addr_t *addr6);\nvoid netif_ip6_addr_set_parts(struct netif *netif, s8_t addr_idx, u32_t i0, u32_t i1, u32_t i2, u32_t i3);\n#define netif_ip6_addr_state(netif, i)  ((netif)->ip6_addr_state[i])\nvoid netif_ip6_addr_set_state(struct netif* netif, s8_t addr_idx, u8_t state);\ns8_t netif_get_ip6_addr_match(struct netif *netif, const ip6_addr_t *ip6addr);\nvoid netif_create_ip6_linklocal_address(struct netif *netif, u8_t from_mac_48bit);\nerr_t netif_add_ip6_address(struct netif *netif, const ip6_addr_t *ip6addr, s8_t *chosen_idx);\n#define netif_set_ip6_autoconfig_enabled(netif, action) do { if(netif) { (netif)->ip6_autoconfig_enabled = (action); }}while(0)\n#endif /* LWIP_IPV6 */\n\n#if LWIP_NETIF_HWADDRHINT\n#define NETIF_SET_HWADDRHINT(netif, hint) ((netif)->addr_hint = (hint))\n#else /* LWIP_NETIF_HWADDRHINT */\n#define NETIF_SET_HWADDRHINT(netif, hint)\n#endif /* LWIP_NETIF_HWADDRHINT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_NETIF_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/netifapi.h",
    "content": "/**\n * @file\n * netif API (to be used from non-TCPIP threads)\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n#ifndef LWIP_HDR_NETIFAPI_H\n#define LWIP_HDR_NETIFAPI_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_NETIF_API /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/sys.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/dhcp.h\"\n#include \"lwip/autoip.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_MPU_COMPATIBLE\n#define NETIFAPI_IPADDR_DEF(type, m)  type m\n#else /* LWIP_MPU_COMPATIBLE */\n#define NETIFAPI_IPADDR_DEF(type, m)  const type * m\n#endif /* LWIP_MPU_COMPATIBLE */\n\ntypedef void (*netifapi_void_fn)(struct netif *netif);\ntypedef err_t (*netifapi_errt_fn)(struct netif *netif);\n\nstruct netifapi_msg {\n  struct tcpip_api_call_data call;\n  struct netif *netif;\n  union {\n    struct {\n#if LWIP_IPV4\n      NETIFAPI_IPADDR_DEF(ip4_addr_t, ipaddr);\n      NETIFAPI_IPADDR_DEF(ip4_addr_t, netmask);\n      NETIFAPI_IPADDR_DEF(ip4_addr_t, gw);\n#endif /* LWIP_IPV4 */\n      void *state;\n      netif_init_fn init;\n      netif_input_fn input;\n    } add;\n    struct {\n      netifapi_void_fn voidfunc;\n      netifapi_errt_fn errtfunc;\n    } common;\n  } msg;\n};\n\n\n/* API for application */\nerr_t netifapi_netif_add(struct netif *netif,\n#if LWIP_IPV4\n                         const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw,\n#endif /* LWIP_IPV4 */\n                         void *state, netif_init_fn init, netif_input_fn input);\n\n#if LWIP_IPV4\nerr_t netifapi_netif_set_addr(struct netif *netif, const ip4_addr_t *ipaddr,\n                              const ip4_addr_t *netmask, const ip4_addr_t *gw);\n#endif /* LWIP_IPV4*/\n\nerr_t netifapi_netif_common(struct netif *netif, netifapi_void_fn voidfunc,\n                            netifapi_errt_fn errtfunc);\n\n/** @ingroup netifapi_netif */\n#define netifapi_netif_remove(n)        netifapi_netif_common(n, netif_remove, NULL)\n/** @ingroup netifapi_netif */\n#define netifapi_netif_set_up(n)        netifapi_netif_common(n, netif_set_up, NULL)\n/** @ingroup netifapi_netif */\n#define netifapi_netif_set_down(n)      netifapi_netif_common(n, netif_set_down, NULL)\n/** @ingroup netifapi_netif */\n#define netifapi_netif_set_default(n)   netifapi_netif_common(n, netif_set_default, NULL)\n/** @ingroup netifapi_netif */\n#define netifapi_netif_set_link_up(n)   netifapi_netif_common(n, netif_set_link_up, NULL)\n/** @ingroup netifapi_netif */\n#define netifapi_netif_set_link_down(n) netifapi_netif_common(n, netif_set_link_down, NULL)\n\n/**\n * @defgroup netifapi_dhcp4 DHCPv4\n * @ingroup netifapi\n * To be called from non-TCPIP threads\n */\n/** @ingroup netifapi_dhcp4 */\n#define netifapi_dhcp_start(n)        netifapi_netif_common(n, NULL, dhcp_start)\n/** @ingroup netifapi_dhcp4 */\n#define netifapi_dhcp_stop(n)         netifapi_netif_common(n, dhcp_stop, NULL)\n/** @ingroup netifapi_dhcp4 */\n#define netifapi_dhcp_inform(n)       netifapi_netif_common(n, dhcp_inform, NULL)\n/** @ingroup netifapi_dhcp4 */\n#define netifapi_dhcp_renew(n)        netifapi_netif_common(n, NULL, dhcp_renew)\n/** @ingroup netifapi_dhcp4 */\n#define netifapi_dhcp_release(n)      netifapi_netif_common(n, NULL, dhcp_release)\n\n/**\n * @defgroup netifapi_autoip AUTOIP\n * @ingroup netifapi\n * To be called from non-TCPIP threads\n */\n/** @ingroup netifapi_autoip */\n#define netifapi_autoip_start(n)      netifapi_netif_common(n, NULL, autoip_start)\n/** @ingroup netifapi_autoip */\n#define netifapi_autoip_stop(n)       netifapi_netif_common(n, NULL, autoip_stop)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_NETIF_API */\n\n#endif /* LWIP_HDR_NETIFAPI_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/opt.h",
    "content": "/**\n * @file\n *\n * lwIP Options Configuration\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n/*\n * NOTE: || defined __DOXYGEN__ is a workaround for doxygen bug -\n * without this, doxygen does not see the actual #define\n */\n\n#if !defined LWIP_HDR_OPT_H\n#define LWIP_HDR_OPT_H\n\n/*\n * Include user defined options first. Anything not defined in these files\n * will be set to standard values. Override anything you don't like!\n */\n#include \"lwipopts.h\"\n#include \"lwip/debug.h\"\n\n/**\n * @defgroup lwip_opts Options (lwipopts.h)\n * @ingroup lwip\n *\n * @defgroup lwip_opts_debug Debugging\n * @ingroup lwip_opts\n *\n * @defgroup lwip_opts_infrastructure Infrastructure\n * @ingroup lwip_opts\n *\n * @defgroup lwip_opts_callback Callback-style APIs\n * @ingroup lwip_opts\n *\n * @defgroup lwip_opts_threadsafe_apis Thread-safe APIs\n * @ingroup lwip_opts\n */\n\n /*\n   ------------------------------------\n   -------------- NO SYS --------------\n   ------------------------------------\n*/\n/**\n * @defgroup lwip_opts_nosys NO_SYS\n * @ingroup lwip_opts_infrastructure\n * @{\n */\n/**\n * NO_SYS==1: Use lwIP without OS-awareness (no thread, semaphores, mutexes or\n * mboxes). This means threaded APIs cannot be used (socket, netconn,\n * i.e. everything in the 'api' folder), only the callback-style raw API is\n * available (and you have to watch out for yourself that you don't access\n * lwIP functions/structures from more than one context at a time!)\n */\n#if !defined NO_SYS || defined __DOXYGEN__\n#define NO_SYS                          0\n#endif\n/**\n * @}\n */\n\n/**\n * @defgroup lwip_opts_timers Timers\n * @ingroup lwip_opts_infrastructure\n * @{\n */\n/**\n * LWIP_TIMERS==0: Drop support for sys_timeout and lwip-internal cyclic timers.\n * (the array of lwip-internal cyclic timers is still provided)\n * (check NO_SYS_NO_TIMERS for compatibility to old versions)\n */\n#if !defined LWIP_TIMERS || defined __DOXYGEN__\n#ifdef NO_SYS_NO_TIMERS\n#define LWIP_TIMERS                     (!NO_SYS || (NO_SYS && !NO_SYS_NO_TIMERS))\n#else\n#define LWIP_TIMERS                     1\n#endif\n#endif\n\n/**\n * LWIP_TIMERS_CUSTOM==1: Provide your own timer implementation.\n * Function prototypes in timeouts.h and the array of lwip-internal cyclic timers\n * are still included, but the implementation is not. The following functions\n * will be required: sys_timeouts_init(), sys_timeout(), sys_untimeout(),\n *                   sys_timeouts_mbox_fetch()\n */\n#if !defined LWIP_TIMERS_CUSTOM || defined __DOXYGEN__\n#define LWIP_TIMERS_CUSTOM              0\n#endif\n/**\n * @}\n */\n\n/**\n * @defgroup lwip_opts_memcpy memcpy\n * @ingroup lwip_opts_infrastructure\n * @{\n */\n/**\n * MEMCPY: override this if you have a faster implementation at hand than the\n * one included in your C library\n */\n#if !defined MEMCPY || defined __DOXYGEN__\n#define MEMCPY(dst,src,len)             memcpy(dst,src,len)\n#endif\n\n/**\n * SMEMCPY: override this with care! Some compilers (e.g. gcc) can inline a\n * call to memcpy() if the length is known at compile time and is small.\n */\n#if !defined SMEMCPY || defined __DOXYGEN__\n#define SMEMCPY(dst,src,len)            memcpy(dst,src,len)\n#endif\n/**\n * @}\n */\n\n/**\n * @defgroup lwip_opts_security security interface\n * @ingroup lwip_opts_infrastructure\n * @{\n */\n/**\n * secure callback function for the random number generator.\n */\ntypedef int (*PTlwIPFuncRand)(void);\n/**\n * struct for secure callback functions\n */\ntypedef struct lwip_impl\n{\n    PTlwIPFuncRand pfRand;\n} STlwIPFuncSsp;\n\nextern STlwIPFuncSsp g_stlwIPSspCallbacks;\nvoid lwIPRegSspCbk(const STlwIPFuncSsp* pstFuncSsp);\n/**\n * @}\n */\n\n/*\n   ------------------------------------\n   ----------- Core locking -----------\n   ------------------------------------\n*/\n/**\n * @defgroup lwip_opts_lock Core locking and MPU\n * @ingroup lwip_opts_infrastructure\n * @{\n */\n/**\n * LWIP_MPU_COMPATIBLE: enables special memory management mechanism\n * which makes lwip able to work on MPU (Memory Protection Unit) system\n * by not passing stack-pointers to other threads\n * (this decreases performance as memory is allocated from pools instead\n * of keeping it on the stack)\n */\n#if !defined LWIP_MPU_COMPATIBLE || defined __DOXYGEN__\n#define LWIP_MPU_COMPATIBLE             0\n#endif\n\n/**\n * LWIP_TCPIP_CORE_LOCKING\n * Creates a global mutex that is held during TCPIP thread operations.\n * Can be locked by client code to perform lwIP operations without changing\n * into TCPIP thread using callbacks. See LOCK_TCPIP_CORE() and\n * UNLOCK_TCPIP_CORE().\n * Your system should provide mutexes supporting priority inversion to use this.\n */\n#if !defined LWIP_TCPIP_CORE_LOCKING || defined __DOXYGEN__\n#define LWIP_TCPIP_CORE_LOCKING         1\n#endif\n\n/**\n * LWIP_TCPIP_CORE_LOCKING_INPUT: when LWIP_TCPIP_CORE_LOCKING is enabled,\n * this lets tcpip_input() grab the mutex for input packets as well,\n * instead of allocating a message and passing it to tcpip_thread.\n *\n * ATTENTION: this does not work when tcpip_input() is called from\n * interrupt context!\n */\n#if !defined LWIP_TCPIP_CORE_LOCKING_INPUT || defined __DOXYGEN__\n#define LWIP_TCPIP_CORE_LOCKING_INPUT   0\n#endif\n\n/**\n * SYS_LIGHTWEIGHT_PROT==1: enable inter-task protection (and task-vs-interrupt\n * protection) for certain critical regions during buffer allocation, deallocation\n * and memory allocation and deallocation.\n * ATTENTION: This is required when using lwIP from more than one context! If\n * you disable this, you must be sure what you are doing!\n */\n#if !defined SYS_LIGHTWEIGHT_PROT || defined __DOXYGEN__\n#define SYS_LIGHTWEIGHT_PROT            1\n#endif\n/**\n * @}\n */\n\n/*\n   ------------------------------------\n   ---------- Memory options ----------\n   ------------------------------------\n*/\n/**\n * @defgroup lwip_opts_mem Heap and memory pools\n * @ingroup lwip_opts_infrastructure\n * @{\n */\n/**\n * MEM_LIBC_MALLOC==1: Use malloc/free/realloc provided by your C-library\n * instead of the lwip internal allocator. Can save code size if you\n * already use it.\n */\n#if !defined MEM_LIBC_MALLOC || defined __DOXYGEN__\n#define MEM_LIBC_MALLOC                 0\n#endif\n\n/**\n * MEMP_MEM_MALLOC==1: Use mem_malloc/mem_free instead of the lwip pool allocator.\n * Especially useful with MEM_LIBC_MALLOC but handle with care regarding execution\n * speed (heap alloc can be much slower than pool alloc) and usage from interrupts\n * (especially if your netif driver allocates PBUF_POOL pbufs for received frames\n * from interrupt)!\n * ATTENTION: Currently, this uses the heap for ALL pools (also for private pools,\n * not only for internal pools defined in memp_std.h)!\n */\n#if !defined MEMP_MEM_MALLOC || defined __DOXYGEN__\n#define MEMP_MEM_MALLOC                 0\n#endif\n\n/**\n * MEM_ALIGNMENT: should be set to the alignment of the CPU\n *    4 byte alignment -> \\#define MEM_ALIGNMENT 4\n *    2 byte alignment -> \\#define MEM_ALIGNMENT 2\n */\n#if !defined MEM_ALIGNMENT || defined __DOXYGEN__\n#define MEM_ALIGNMENT                   1\n#endif\n\n/**\n * MEM_SIZE: the size of the heap memory. If the application will send\n * a lot of data that needs to be copied, this should be set high.\n */\n#if !defined MEM_SIZE || defined __DOXYGEN__\n#define MEM_SIZE                        1600\n#endif\n\n/**\n * MEMP_OVERFLOW_CHECK: memp overflow protection reserves a configurable\n * amount of bytes before and after each memp element in every pool and fills\n * it with a prominent default value.\n *    MEMP_OVERFLOW_CHECK == 0 no checking\n *    MEMP_OVERFLOW_CHECK == 1 checks each element when it is freed\n *    MEMP_OVERFLOW_CHECK >= 2 checks each element in every pool every time\n *      memp_malloc() or memp_free() is called (useful but slow!)\n */\n#if !defined MEMP_OVERFLOW_CHECK || defined __DOXYGEN__\n#define MEMP_OVERFLOW_CHECK             0\n#endif\n\n/**\n * MEMP_SANITY_CHECK==1: run a sanity check after each memp_free() to make\n * sure that there are no cycles in the linked lists.\n */\n#if !defined MEMP_SANITY_CHECK || defined __DOXYGEN__\n#define MEMP_SANITY_CHECK               0\n#endif\n\n/**\n * MEM_USE_POOLS==1: Use an alternative to malloc() by allocating from a set\n * of memory pools of various sizes. When mem_malloc is called, an element of\n * the smallest pool that can provide the length needed is returned.\n * To use this, MEMP_USE_CUSTOM_POOLS also has to be enabled.\n */\n#if !defined MEM_USE_POOLS || defined __DOXYGEN__\n#define MEM_USE_POOLS                   0\n#endif\n\n/**\n * MEM_USE_POOLS_TRY_BIGGER_POOL==1: if one malloc-pool is empty, try the next\n * bigger pool - WARNING: THIS MIGHT WASTE MEMORY but it can make a system more\n * reliable. */\n#if !defined MEM_USE_POOLS_TRY_BIGGER_POOL || defined __DOXYGEN__\n#define MEM_USE_POOLS_TRY_BIGGER_POOL   0\n#endif\n\n/**\n * MEMP_USE_CUSTOM_POOLS==1: whether to include a user file lwippools.h\n * that defines additional pools beyond the \"standard\" ones required\n * by lwIP. If you set this to 1, you must have lwippools.h in your\n * include path somewhere.\n */\n#if !defined MEMP_USE_CUSTOM_POOLS || defined __DOXYGEN__\n#define MEMP_USE_CUSTOM_POOLS           0\n#endif\n\n/**\n * Set this to 1 if you want to free PBUF_RAM pbufs (or call mem_free()) from\n * interrupt context (or another context that doesn't allow waiting for a\n * semaphore).\n * If set to 1, mem_malloc will be protected by a semaphore and SYS_ARCH_PROTECT,\n * while mem_free will only use SYS_ARCH_PROTECT. mem_malloc SYS_ARCH_UNPROTECTs\n * with each loop so that mem_free can run.\n *\n * ATTENTION: As you can see from the above description, this leads to dis-/\n * enabling interrupts often, which can be slow! Also, on low memory, mem_malloc\n * can need longer.\n *\n * If you don't want that, at least for NO_SYS=0, you can still use the following\n * functions to enqueue a deallocation call which then runs in the tcpip_thread\n * context:\n * - pbuf_free_callback(p);\n * - mem_free_callback(m);\n */\n#if !defined LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT || defined __DOXYGEN__\n#define LWIP_ALLOW_MEM_FREE_FROM_OTHER_CONTEXT 0\n#endif\n/**\n * @}\n */\n\n/*\n   ------------------------------------------------\n   ---------- Internal Memory Pool Sizes ----------\n   ------------------------------------------------\n*/\n/**\n * @defgroup lwip_opts_memp Internal memory pools\n * @ingroup lwip_opts_infrastructure\n * @{\n */\n/**\n * MEMP_NUM_PBUF: the number of memp struct pbufs (used for PBUF_ROM and PBUF_REF).\n * If the application sends a lot of data out of ROM (or other static memory),\n * this should be set high.\n */\n#if !defined MEMP_NUM_PBUF || defined __DOXYGEN__\n#define MEMP_NUM_PBUF                   16\n#endif\n\n/**\n * MEMP_NUM_RAW_PCB: Number of raw connection PCBs\n * (requires the LWIP_RAW option)\n */\n#if !defined MEMP_NUM_RAW_PCB || defined __DOXYGEN__\n#define MEMP_NUM_RAW_PCB                4\n#endif\n\n/**\n * MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One\n * per active UDP \"connection\".\n * (requires the LWIP_UDP option)\n */\n#if !defined MEMP_NUM_UDP_PCB || defined __DOXYGEN__\n#define MEMP_NUM_UDP_PCB                4\n#endif\n\n/**\n * MEMP_NUM_TCP_PCB: the number of simultaneously active TCP connections.\n * (requires the LWIP_TCP option)\n */\n#if !defined MEMP_NUM_TCP_PCB || defined __DOXYGEN__\n#define MEMP_NUM_TCP_PCB                5\n#endif\n\n/**\n * MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections.\n * (requires the LWIP_TCP option)\n */\n#if !defined MEMP_NUM_TCP_PCB_LISTEN || defined __DOXYGEN__\n#define MEMP_NUM_TCP_PCB_LISTEN         8\n#endif\n\n/**\n * MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments.\n * (requires the LWIP_TCP option)\n */\n#if !defined MEMP_NUM_TCP_SEG || defined __DOXYGEN__\n#define MEMP_NUM_TCP_SEG                16\n#endif\n\n/**\n * MEMP_NUM_REASSDATA: the number of IP packets simultaneously queued for\n * reassembly (whole packets, not fragments!)\n */\n#if !defined MEMP_NUM_REASSDATA || defined __DOXYGEN__\n#define MEMP_NUM_REASSDATA              5\n#endif\n\n/**\n * MEMP_NUM_FRAG_PBUF: the number of IP fragments simultaneously sent\n * (fragments, not whole packets!).\n * This is only used with LWIP_NETIF_TX_SINGLE_PBUF==0 and only has to be > 1\n * with DMA-enabled MACs where the packet is not yet sent when netif->output\n * returns.\n */\n#if !defined MEMP_NUM_FRAG_PBUF || defined __DOXYGEN__\n#define MEMP_NUM_FRAG_PBUF              15\n#endif\n\n/**\n * MEMP_NUM_ARP_QUEUE: the number of simultaneously queued outgoing\n * packets (pbufs) that are waiting for an ARP request (to resolve\n * their destination address) to finish.\n * (requires the ARP_QUEUEING option)\n */\n#if !defined MEMP_NUM_ARP_QUEUE || defined __DOXYGEN__\n#define MEMP_NUM_ARP_QUEUE              30\n#endif\n\n/**\n * MEMP_NUM_IGMP_GROUP: The number of multicast groups whose network interfaces\n * can be members at the same time (one per netif - allsystems group -, plus one\n * per netif membership).\n * (requires the LWIP_IGMP option)\n */\n#if !defined MEMP_NUM_IGMP_GROUP || defined __DOXYGEN__\n#define MEMP_NUM_IGMP_GROUP             8\n#endif\n\n/**\n * MEMP_NUM_SYS_TIMEOUT: the number of simultaneously active timeouts.\n * The default number of timeouts is calculated here for all enabled modules.\n * The formula expects settings to be either '0' or '1'.\n */\n#if !defined MEMP_NUM_SYS_TIMEOUT || defined __DOXYGEN__\n#define MEMP_NUM_SYS_TIMEOUT            (LWIP_TCP + IP_REASSEMBLY + LWIP_ARP + (2*LWIP_DHCP) + LWIP_AUTOIP + LWIP_IGMP + LWIP_DNS + (PPP_SUPPORT*6*MEMP_NUM_PPP_PCB) + (LWIP_IPV6 ? (1 + LWIP_IPV6_REASS + LWIP_IPV6_MLD) : 0))\n#endif\n\n/**\n * MEMP_NUM_NETBUF: the number of struct netbufs.\n * (only needed if you use the sequential API, like api_lib.c)\n */\n#if !defined MEMP_NUM_NETBUF || defined __DOXYGEN__\n#define MEMP_NUM_NETBUF                 2\n#endif\n\n/**\n * MEMP_NUM_NETCONN: the number of struct netconns.\n * (only needed if you use the sequential API, like api_lib.c)\n */\n#if !defined MEMP_NUM_NETCONN || defined __DOXYGEN__\n#define MEMP_NUM_NETCONN                4\n#endif\n\n/**\n * MEMP_NUM_TCPIP_MSG_API: the number of struct tcpip_msg, which are used\n * for callback/timeout API communication.\n * (only needed if you use tcpip.c)\n */\n#if !defined MEMP_NUM_TCPIP_MSG_API || defined __DOXYGEN__\n#define MEMP_NUM_TCPIP_MSG_API          8\n#endif\n\n/**\n * MEMP_NUM_TCPIP_MSG_INPKT: the number of struct tcpip_msg, which are used\n * for incoming packets.\n * (only needed if you use tcpip.c)\n */\n#if !defined MEMP_NUM_TCPIP_MSG_INPKT || defined __DOXYGEN__\n#define MEMP_NUM_TCPIP_MSG_INPKT        8\n#endif\n\n/**\n * MEMP_NUM_NETDB: the number of concurrently running lwip_addrinfo() calls\n * (before freeing the corresponding memory using lwip_freeaddrinfo()).\n */\n#if !defined MEMP_NUM_NETDB || defined __DOXYGEN__\n#define MEMP_NUM_NETDB                  1\n#endif\n\n/**\n * MEMP_NUM_LOCALHOSTLIST: the number of host entries in the local host list\n * if DNS_LOCAL_HOSTLIST_IS_DYNAMIC==1.\n */\n#if !defined MEMP_NUM_LOCALHOSTLIST || defined __DOXYGEN__\n#define MEMP_NUM_LOCALHOSTLIST          1\n#endif\n\n/**\n * PBUF_POOL_SIZE: the number of buffers in the pbuf pool.\n */\n#if !defined PBUF_POOL_SIZE || defined __DOXYGEN__\n#define PBUF_POOL_SIZE                  16\n#endif\n\n/** MEMP_NUM_API_MSG: the number of concurrently active calls to various\n * socket, netconn, and tcpip functions\n */\n#if !defined MEMP_NUM_API_MSG || defined __DOXYGEN__\n#define MEMP_NUM_API_MSG                MEMP_NUM_TCPIP_MSG_API\n#endif\n\n/** MEMP_NUM_DNS_API_MSG: the number of concurrently active calls to netconn_gethostbyname\n */\n#if !defined MEMP_NUM_DNS_API_MSG || defined __DOXYGEN__\n#define MEMP_NUM_DNS_API_MSG            MEMP_NUM_TCPIP_MSG_API\n#endif\n\n/** MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA: the number of concurrently active calls\n * to getsockopt/setsockopt\n */\n#if !defined MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA || defined __DOXYGEN__\n#define MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA MEMP_NUM_TCPIP_MSG_API\n#endif\n\n/** MEMP_NUM_NETIFAPI_MSG: the number of concurrently active calls to the\n * netifapi functions\n */\n#if !defined MEMP_NUM_NETIFAPI_MSG || defined __DOXYGEN__\n#define MEMP_NUM_NETIFAPI_MSG           MEMP_NUM_TCPIP_MSG_API\n#endif\n/**\n * @}\n */\n\n/*\n   ---------------------------------\n   ---------- ARP options ----------\n   ---------------------------------\n*/\n/**\n * @defgroup lwip_opts_arp ARP\n * @ingroup lwip_opts_ipv4\n * @{\n */\n/**\n * LWIP_ARP==1: Enable ARP functionality.\n */\n#if !defined LWIP_ARP || defined __DOXYGEN__\n#define LWIP_ARP                        1\n#endif\n\n/**\n * ARP_TABLE_SIZE: Number of active MAC-IP address pairs cached.\n */\n#if !defined ARP_TABLE_SIZE || defined __DOXYGEN__\n#define ARP_TABLE_SIZE                  10\n#endif\n\n/** the time an ARP entry stays valid after its last update,\n *  for ARP_TMR_INTERVAL = 1000, this is\n *  (60 * 5) seconds = 5 minutes.\n */\n#if !defined ARP_MAXAGE || defined __DOXYGEN__\n#define ARP_MAXAGE                      300\n#endif\n\n/**\n * ARP_QUEUEING==1: Multiple outgoing packets are queued during hardware address\n * resolution. By default, only the most recent packet is queued per IP address.\n * This is sufficient for most protocols and mainly reduces TCP connection\n * startup time. Set this to 1 if you know your application sends more than one\n * packet in a row to an IP address that is not in the ARP cache.\n */\n#if !defined ARP_QUEUEING || defined __DOXYGEN__\n#define ARP_QUEUEING                    0\n#endif\n\n/** The maximum number of packets which may be queued for each\n *  unresolved address by other network layers. Defaults to 3, 0 means disabled.\n *  Old packets are dropped, new packets are queued.\n */\n#if !defined ARP_QUEUE_LEN || defined __DOXYGEN__\n#define ARP_QUEUE_LEN                   3\n#endif\n\n/**\n * ETHARP_SUPPORT_VLAN==1: support receiving and sending ethernet packets with\n * VLAN header. See the description of LWIP_HOOK_VLAN_CHECK and\n * LWIP_HOOK_VLAN_SET hooks to check/set VLAN headers.\n * Additionally, you can define ETHARP_VLAN_CHECK to an u16_t VLAN ID to check.\n * If ETHARP_VLAN_CHECK is defined, only VLAN-traffic for this VLAN is accepted.\n * If ETHARP_VLAN_CHECK is not defined, all traffic is accepted.\n * Alternatively, define a function/define ETHARP_VLAN_CHECK_FN(eth_hdr, vlan)\n * that returns 1 to accept a packet or 0 to drop a packet.\n */\n#if !defined ETHARP_SUPPORT_VLAN || defined __DOXYGEN__\n#define ETHARP_SUPPORT_VLAN             0\n#endif\n\n/** LWIP_ETHERNET==1: enable ethernet support even though ARP might be disabled\n */\n#if !defined LWIP_ETHERNET || defined __DOXYGEN__\n#define LWIP_ETHERNET                   LWIP_ARP\n#endif\n\n/** ETH_PAD_SIZE: number of bytes added before the ethernet header to ensure\n * alignment of payload after that header. Since the header is 14 bytes long,\n * without this padding e.g. addresses in the IP header will not be aligned\n * on a 32-bit boundary, so setting this to 2 can speed up 32-bit-platforms.\n */\n#if !defined ETH_PAD_SIZE || defined __DOXYGEN__\n#define ETH_PAD_SIZE                    0\n#endif\n\n/** ETHARP_SUPPORT_STATIC_ENTRIES==1: enable code to support static ARP table\n * entries (using etharp_add_static_entry/etharp_remove_static_entry).\n */\n#if !defined ETHARP_SUPPORT_STATIC_ENTRIES || defined __DOXYGEN__\n#define ETHARP_SUPPORT_STATIC_ENTRIES   0\n#endif\n\n/** ETHARP_TABLE_MATCH_NETIF==1: Match netif for ARP table entries.\n * If disabled, duplicate IP address on multiple netifs are not supported\n * (but this should only occur for AutoIP).\n */\n#if !defined ETHARP_TABLE_MATCH_NETIF || defined __DOXYGEN__\n#define ETHARP_TABLE_MATCH_NETIF        0\n#endif\n/**\n * @}\n */\n\n/*\n   --------------------------------\n   ---------- IP options ----------\n   --------------------------------\n*/\n/**\n * @defgroup lwip_opts_ipv4 IPv4\n * @ingroup lwip_opts\n * @{\n */\n/**\n * LWIP_IPV4==1: Enable IPv4\n */\n#if !defined LWIP_IPV4 || defined __DOXYGEN__\n#define LWIP_IPV4                       1\n#endif\n\n/**\n * IP_FORWARD==1: Enables the ability to forward IP packets across network\n * interfaces. If you are going to run lwIP on a device with only one network\n * interface, define this to 0.\n */\n#if !defined IP_FORWARD || defined __DOXYGEN__\n#define IP_FORWARD                      0\n#endif\n\n/**\n * IP_REASSEMBLY==1: Reassemble incoming fragmented IP packets. Note that\n * this option does not affect outgoing packet sizes, which can be controlled\n * via IP_FRAG.\n */\n#if !defined IP_REASSEMBLY || defined __DOXYGEN__\n#define IP_REASSEMBLY                   1\n#endif\n\n/**\n * IP_FRAG==1: Fragment outgoing IP packets if their size exceeds MTU. Note\n * that this option does not affect incoming packet sizes, which can be\n * controlled via IP_REASSEMBLY.\n */\n#if !defined IP_FRAG || defined __DOXYGEN__\n#define IP_FRAG                         1\n#endif\n\n#if !LWIP_IPV4\n/* disable IPv4 extensions when IPv4 is disabled */\n#undef IP_FORWARD\n#define IP_FORWARD                      0\n#undef IP_REASSEMBLY\n#define IP_REASSEMBLY                   0\n#undef IP_FRAG\n#define IP_FRAG                         0\n#endif /* !LWIP_IPV4 */\n\n/**\n * IP_OPTIONS_ALLOWED: Defines the behavior for IP options.\n *      IP_OPTIONS_ALLOWED==0: All packets with IP options are dropped.\n *      IP_OPTIONS_ALLOWED==1: IP options are allowed (but not parsed).\n */\n#if !defined IP_OPTIONS_ALLOWED || defined __DOXYGEN__\n#define IP_OPTIONS_ALLOWED              1\n#endif\n\n/**\n * IP_REASS_MAXAGE: Maximum time (in multiples of IP_TMR_INTERVAL - so seconds, normally)\n * a fragmented IP packet waits for all fragments to arrive. If not all fragments arrived\n * in this time, the whole packet is discarded.\n */\n#if !defined IP_REASS_MAXAGE || defined __DOXYGEN__\n#define IP_REASS_MAXAGE                 3\n#endif\n\n/**\n * IP_REASS_MAX_PBUFS: Total maximum amount of pbufs waiting to be reassembled.\n * Since the received pbufs are enqueued, be sure to configure\n * PBUF_POOL_SIZE > IP_REASS_MAX_PBUFS so that the stack is still able to receive\n * packets even if the maximum amount of fragments is enqueued for reassembly!\n */\n#if !defined IP_REASS_MAX_PBUFS || defined __DOXYGEN__\n#define IP_REASS_MAX_PBUFS              10\n#endif\n\n/**\n * IP_DEFAULT_TTL: Default value for Time-To-Live used by transport layers.\n */\n#if !defined IP_DEFAULT_TTL || defined __DOXYGEN__\n#define IP_DEFAULT_TTL                  255\n#endif\n\n/**\n * IP_SOF_BROADCAST=1: Use the SOF_BROADCAST field to enable broadcast\n * filter per pcb on udp and raw send operations. To enable broadcast filter\n * on recv operations, you also have to set IP_SOF_BROADCAST_RECV=1.\n */\n#if !defined IP_SOF_BROADCAST || defined __DOXYGEN__\n#define IP_SOF_BROADCAST                0\n#endif\n\n/**\n * IP_SOF_BROADCAST_RECV (requires IP_SOF_BROADCAST=1) enable the broadcast\n * filter on recv operations.\n */\n#if !defined IP_SOF_BROADCAST_RECV || defined __DOXYGEN__\n#define IP_SOF_BROADCAST_RECV           0\n#endif\n\n/**\n * IP_FORWARD_ALLOW_TX_ON_RX_NETIF==1: allow ip_forward() to send packets back\n * out on the netif where it was received. This should only be used for\n * wireless networks.\n * ATTENTION: When this is 1, make sure your netif driver correctly marks incoming\n * link-layer-broadcast/multicast packets as such using the corresponding pbuf flags!\n */\n#if !defined IP_FORWARD_ALLOW_TX_ON_RX_NETIF || defined __DOXYGEN__\n#define IP_FORWARD_ALLOW_TX_ON_RX_NETIF 0\n#endif\n\n/**\n * LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS==1: randomize the local port for the first\n * local TCP/UDP pcb (default==0). This can prevent creating predictable port\n * numbers after booting a device.\n */\n#if !defined LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS || defined __DOXYGEN__\n#define LWIP_RANDOMIZE_INITIAL_LOCAL_PORTS 1\n#endif\n/**\n * @}\n */\n\n/*\n   ----------------------------------\n   ---------- ICMP options ----------\n   ----------------------------------\n*/\n/**\n * @defgroup lwip_opts_icmp ICMP\n * @ingroup lwip_opts_ipv4\n * @{\n */\n/**\n * LWIP_ICMP==1: Enable ICMP module inside the IP stack.\n * Be careful, disable that make your product non-compliant to RFC1122\n */\n#if !defined LWIP_ICMP || defined __DOXYGEN__\n#define LWIP_ICMP                       1\n#endif\n\n/**\n * ICMP_TTL: Default value for Time-To-Live used by ICMP packets.\n */\n#if !defined ICMP_TTL || defined __DOXYGEN__\n#define ICMP_TTL                       (IP_DEFAULT_TTL)\n#endif\n\n/**\n * LWIP_BROADCAST_PING==1: respond to broadcast pings (default is unicast only)\n */\n#if !defined LWIP_BROADCAST_PING || defined __DOXYGEN__\n#define LWIP_BROADCAST_PING             0\n#endif\n\n/**\n * LWIP_MULTICAST_PING==1: respond to multicast pings (default is unicast only)\n */\n#if !defined LWIP_MULTICAST_PING || defined __DOXYGEN__\n#define LWIP_MULTICAST_PING             0\n#endif\n/**\n * @}\n */\n\n/*\n   ---------------------------------\n   ---------- RAW options ----------\n   ---------------------------------\n*/\n/**\n * @defgroup lwip_opts_raw RAW\n * @ingroup lwip_opts_callback\n * @{\n */\n/**\n * LWIP_RAW==1: Enable application layer to hook into the IP layer itself.\n */\n#if !defined LWIP_RAW || defined __DOXYGEN__\n#define LWIP_RAW                        0\n#endif\n\n/**\n * LWIP_RAW==1: Enable application layer to hook into the IP layer itself.\n */\n#if !defined RAW_TTL || defined __DOXYGEN__\n#define RAW_TTL                        (IP_DEFAULT_TTL)\n#endif\n/**\n * @}\n */\n\n/*\n   ----------------------------------\n   ---------- DHCP options ----------\n   ----------------------------------\n*/\n/**\n * @defgroup lwip_opts_dhcp DHCP\n * @ingroup lwip_opts_ipv4\n * @{\n */\n/**\n * LWIP_DHCP==1: Enable DHCP module.\n */\n#if !defined LWIP_DHCP || defined __DOXYGEN__\n#define LWIP_DHCP                       0\n#endif\n#if !LWIP_IPV4\n/* disable DHCP when IPv4 is disabled */\n#undef LWIP_DHCP\n#define LWIP_DHCP                       0\n#endif /* !LWIP_IPV4 */\n\n/**\n * DHCP_DOES_ARP_CHECK==1: Do an ARP check on the offered address.\n */\n#if !defined DHCP_DOES_ARP_CHECK || defined __DOXYGEN__\n#define DHCP_DOES_ARP_CHECK             ((LWIP_DHCP) && (LWIP_ARP))\n#endif\n\n/**\n * LWIP_DHCP_CHECK_LINK_UP==1: dhcp_start() only really starts if the netif has\n * NETIF_FLAG_LINK_UP set in its flags. As this is only an optimization and\n * netif drivers might not set this flag, the default is off. If enabled,\n * netif_set_link_up() must be called to continue dhcp starting.\n */\n#if !defined LWIP_DHCP_CHECK_LINK_UP\n#define LWIP_DHCP_CHECK_LINK_UP         0\n#endif\n\n/**\n * LWIP_DHCP_BOOTP_FILE==1: Store offered_si_addr and boot_file_name.\n */\n#if !defined LWIP_DHCP_BOOTP_FILE || defined __DOXYGEN__\n#define LWIP_DHCP_BOOTP_FILE            0\n#endif\n\n/**\n * LWIP_DHCP_GETS_NTP==1: Request NTP servers with discover/select. For each\n * response packet, an callback is called, which has to be provided by the port:\n * void dhcp_set_ntp_servers(u8_t num_ntp_servers, ip_addr_t* ntp_server_addrs);\n*/\n#if !defined LWIP_DHCP_GET_NTP_SRV || defined __DOXYGEN__\n#define LWIP_DHCP_GET_NTP_SRV           0\n#endif\n\n/**\n * The maximum of NTP servers requested\n */\n#if !defined LWIP_DHCP_MAX_NTP_SERVERS || defined __DOXYGEN__\n#define LWIP_DHCP_MAX_NTP_SERVERS       1\n#endif\n\n/**\n * LWIP_DHCP_MAX_DNS_SERVERS > 0: Request DNS servers with discover/select.\n * DHCP servers received in the response are passed to DNS via @ref dns_setserver()\n * (up to the maximum limit defined here).\n */\n#if !defined LWIP_DHCP_MAX_DNS_SERVERS || defined __DOXYGEN__\n#define LWIP_DHCP_MAX_DNS_SERVERS       DNS_MAX_SERVERS\n#endif\n/**\n * @}\n */\n\n/*\n   ------------------------------------\n   ---------- AUTOIP options ----------\n   ------------------------------------\n*/\n/**\n * @defgroup lwip_opts_autoip AUTOIP\n * @ingroup lwip_opts_ipv4\n * @{\n */\n/**\n * LWIP_AUTOIP==1: Enable AUTOIP module.\n */\n#if !defined LWIP_AUTOIP || defined __DOXYGEN__\n#define LWIP_AUTOIP                     0\n#endif\n#if !LWIP_IPV4\n/* disable AUTOIP when IPv4 is disabled */\n#undef LWIP_AUTOIP\n#define LWIP_AUTOIP                     0\n#endif /* !LWIP_IPV4 */\n\n/**\n * LWIP_DHCP_AUTOIP_COOP==1: Allow DHCP and AUTOIP to be both enabled on\n * the same interface at the same time.\n */\n#if !defined LWIP_DHCP_AUTOIP_COOP || defined __DOXYGEN__\n#define LWIP_DHCP_AUTOIP_COOP           0\n#endif\n\n/**\n * LWIP_DHCP_AUTOIP_COOP_TRIES: Set to the number of DHCP DISCOVER probes\n * that should be sent before falling back on AUTOIP (the DHCP client keeps\n * running in this case). This can be set as low as 1 to get an AutoIP address\n * very  quickly, but you should be prepared to handle a changing IP address\n * when DHCP overrides AutoIP.\n */\n#if !defined LWIP_DHCP_AUTOIP_COOP_TRIES || defined __DOXYGEN__\n#define LWIP_DHCP_AUTOIP_COOP_TRIES     9\n#endif\n/**\n * @}\n */\n\n/*\n   ----------------------------------\n   ----- SNMP MIB2 support      -----\n   ----------------------------------\n*/\n/**\n * @defgroup lwip_opts_mib2 SNMP MIB2 callbacks\n * @ingroup lwip_opts_infrastructure\n * @{\n */\n/**\n * LWIP_MIB2_CALLBACKS==1: Turn on SNMP MIB2 callbacks.\n * Turn this on to get callbacks needed to implement MIB2.\n * Usually MIB2_STATS should be enabled, too.\n */\n#if !defined LWIP_MIB2_CALLBACKS || defined __DOXYGEN__\n#define LWIP_MIB2_CALLBACKS             0\n#endif\n/**\n * @}\n */\n\n/*\n   ----------------------------------\n   ----- Multicast/IGMP options -----\n   ----------------------------------\n*/\n/**\n * @defgroup lwip_opts_igmp IGMP\n * @ingroup lwip_opts_ipv4\n * @{\n */\n/**\n * LWIP_IGMP==1: Turn on IGMP module.\n */\n#if !defined LWIP_IGMP || defined __DOXYGEN__\n#define LWIP_IGMP                       0\n#endif\n#if !LWIP_IPV4\n#undef LWIP_IGMP\n#define LWIP_IGMP                       0\n#endif\n\n/**\n * LWIP_MULTICAST_TX_OPTIONS==1: Enable multicast TX support like the socket options\n * IP_MULTICAST_TTL/IP_MULTICAST_IF/IP_MULTICAST_LOOP\n */\n#if !defined LWIP_MULTICAST_TX_OPTIONS || defined __DOXYGEN__\n#define LWIP_MULTICAST_TX_OPTIONS       (LWIP_IGMP && LWIP_UDP)\n#endif\n/**\n * @}\n */\n\n/*\n   ----------------------------------\n   ---------- DNS options -----------\n   ----------------------------------\n*/\n/**\n * @defgroup lwip_opts_dns DNS\n * @ingroup lwip_opts_callback\n * @{\n */\n/**\n * LWIP_DNS==1: Turn on DNS module. UDP must be available for DNS\n * transport.\n */\n#if !defined LWIP_DNS || defined __DOXYGEN__\n#define LWIP_DNS                        0\n#endif\n\n/** DNS maximum number of entries to maintain locally. */\n#if !defined DNS_TABLE_SIZE || defined __DOXYGEN__\n#define DNS_TABLE_SIZE                  4\n#endif\n\n/** DNS maximum host name length supported in the name table. */\n#if !defined DNS_MAX_NAME_LENGTH || defined __DOXYGEN__\n#define DNS_MAX_NAME_LENGTH             256\n#endif\n\n/** The maximum of DNS servers\n * The first server can be initialized automatically by defining\n * DNS_SERVER_ADDRESS(ipaddr), where 'ipaddr' is an 'ip_addr_t*'\n */\n#if !defined DNS_MAX_SERVERS || defined __DOXYGEN__\n#define DNS_MAX_SERVERS                 2\n#endif\n\n/** DNS do a name checking between the query and the response. */\n#if !defined DNS_DOES_NAME_CHECK || defined __DOXYGEN__\n#define DNS_DOES_NAME_CHECK             1\n#endif\n\n/** LWIP_DNS_SECURE: controls the security level of the DNS implementation\n * Use all DNS security features by default.\n * This is overridable but should only be needed by very small targets\n * or when using against non standard DNS servers. */\n#if !defined LWIP_DNS_SECURE || defined __DOXYGEN__\n#define LWIP_DNS_SECURE (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT)\n#endif\n\n/* A list of DNS security features follows */\n#define LWIP_DNS_SECURE_RAND_XID                1\n#define LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING 2\n#define LWIP_DNS_SECURE_RAND_SRC_PORT           4\n\n/** DNS_LOCAL_HOSTLIST: Implements a local host-to-address list. If enabled, you have to define an initializer:\n *  \\#define DNS_LOCAL_HOSTLIST_INIT {DNS_LOCAL_HOSTLIST_ELEM(\"host_ip4\", IPADDR4_INIT_BYTES(1,2,3,4)), \\\n *                                    DNS_LOCAL_HOSTLIST_ELEM(\"host_ip6\", IPADDR6_INIT_HOST(123, 234, 345, 456)}\n *\n *  Instead, you can also use an external function:\n *  \\#define DNS_LOOKUP_LOCAL_EXTERN(x) extern err_t my_lookup_function(const char *name, ip_addr_t *addr, u8_t dns_addrtype)\n *  that looks up the IP address and returns ERR_OK if found (LWIP_DNS_ADDRTYPE_xxx is passed in dns_addrtype).\n */\n#if !defined DNS_LOCAL_HOSTLIST || defined __DOXYGEN__\n#define DNS_LOCAL_HOSTLIST              0\n#endif /* DNS_LOCAL_HOSTLIST */\n\n/** If this is turned on, the local host-list can be dynamically changed\n *  at runtime. */\n#if !defined DNS_LOCAL_HOSTLIST_IS_DYNAMIC || defined __DOXYGEN__\n#define DNS_LOCAL_HOSTLIST_IS_DYNAMIC   0\n#endif /* DNS_LOCAL_HOSTLIST_IS_DYNAMIC */\n\n/** Set this to 1 to enable querying \".local\" names via mDNS\n *  using a One-Shot Multicast DNS Query */\n#if !defined LWIP_DNS_SUPPORT_MDNS_QUERIES || defined __DOXYGEN__\n#define LWIP_DNS_SUPPORT_MDNS_QUERIES  0\n#endif\n/**\n * @}\n */\n\n/*\n   ---------------------------------\n   ---------- UDP options ----------\n   ---------------------------------\n*/\n/**\n * @defgroup lwip_opts_udp UDP\n * @ingroup lwip_opts_callback\n * @{\n */\n/**\n * LWIP_UDP==1: Turn on UDP.\n */\n#if !defined LWIP_UDP || defined __DOXYGEN__\n#define LWIP_UDP                        1\n#endif\n\n/**\n * LWIP_UDPLITE==1: Turn on UDP-Lite. (Requires LWIP_UDP)\n */\n#if !defined LWIP_UDPLITE || defined __DOXYGEN__\n#define LWIP_UDPLITE                    0\n#endif\n\n/**\n * UDP_TTL: Default Time-To-Live value.\n */\n#if !defined UDP_TTL || defined __DOXYGEN__\n#define UDP_TTL                         (IP_DEFAULT_TTL)\n#endif\n\n/**\n * LWIP_NETBUF_RECVINFO==1: append destination addr and port to every netbuf.\n */\n#if !defined LWIP_NETBUF_RECVINFO || defined __DOXYGEN__\n#define LWIP_NETBUF_RECVINFO            0\n#endif\n/**\n * @}\n */\n\n/*\n   ---------------------------------\n   ---------- TCP options ----------\n   ---------------------------------\n*/\n/**\n * @defgroup lwip_opts_tcp TCP\n * @ingroup lwip_opts_callback\n * @{\n */\n/**\n * LWIP_TCP==1: Turn on TCP.\n */\n#if !defined LWIP_TCP || defined __DOXYGEN__\n#define LWIP_TCP                        1\n#endif\n\n/**\n * TCP_TTL: Default Time-To-Live value.\n */\n#if !defined TCP_TTL || defined __DOXYGEN__\n#define TCP_TTL                         (IP_DEFAULT_TTL)\n#endif\n\n/**\n * TCP_WND: The size of a TCP window.  This must be at least\n * (2 * TCP_MSS) for things to work well.\n * ATTENTION: when using TCP_RCV_SCALE, TCP_WND is the total size\n * with scaling applied. Maximum window value in the TCP header\n * will be TCP_WND >> TCP_RCV_SCALE\n */\n#if !defined TCP_WND || defined __DOXYGEN__\n#define TCP_WND                         (4 * TCP_MSS)\n#endif\n\n/**\n * TCP_MAXRTX: Maximum number of retransmissions of data segments.\n */\n#if !defined TCP_MAXRTX || defined __DOXYGEN__\n#define TCP_MAXRTX                      12\n#endif\n\n/**\n * TCP_SYNMAXRTX: Maximum number of retransmissions of SYN segments.\n */\n#if !defined TCP_SYNMAXRTX || defined __DOXYGEN__\n#define TCP_SYNMAXRTX                   6\n#endif\n\n/**\n * TCP_QUEUE_OOSEQ==1: TCP will queue segments that arrive out of order.\n * Define to 0 if your device is low on memory.\n */\n#if !defined TCP_QUEUE_OOSEQ || defined __DOXYGEN__\n#define TCP_QUEUE_OOSEQ                 (LWIP_TCP)\n#endif\n\n/**\n * TCP_MSS: TCP Maximum segment size. (default is 536, a conservative default,\n * you might want to increase this.)\n * For the receive side, this MSS is advertised to the remote side\n * when opening a connection. For the transmit size, this MSS sets\n * an upper limit on the MSS advertised by the remote host.\n */\n#if !defined TCP_MSS || defined __DOXYGEN__\n#define TCP_MSS                         536\n#endif\n\n/**\n * TCP_CALCULATE_EFF_SEND_MSS: \"The maximum size of a segment that TCP really\n * sends, the 'effective send MSS,' MUST be the smaller of the send MSS (which\n * reflects the available reassembly buffer size at the remote host) and the\n * largest size permitted by the IP layer\" (RFC 1122)\n * Setting this to 1 enables code that checks TCP_MSS against the MTU of the\n * netif used for a connection and limits the MSS if it would be too big otherwise.\n */\n#if !defined TCP_CALCULATE_EFF_SEND_MSS || defined __DOXYGEN__\n#define TCP_CALCULATE_EFF_SEND_MSS      1\n#endif\n\n\n/**\n * TCP_SND_BUF: TCP sender buffer space (bytes).\n * To achieve good performance, this should be at least 2 * TCP_MSS.\n */\n#if !defined TCP_SND_BUF || defined __DOXYGEN__\n#define TCP_SND_BUF                     (2 * TCP_MSS)\n#endif\n\n/**\n * TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least\n * as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work.\n */\n#if !defined TCP_SND_QUEUELEN || defined __DOXYGEN__\n#define TCP_SND_QUEUELEN                ((4 * (TCP_SND_BUF) + (TCP_MSS - 1))/(TCP_MSS))\n#endif\n\n/**\n * TCP_SNDLOWAT: TCP writable space (bytes). This must be less than\n * TCP_SND_BUF. It is the amount of space which must be available in the\n * TCP snd_buf for select to return writable (combined with TCP_SNDQUEUELOWAT).\n */\n#if !defined TCP_SNDLOWAT || defined __DOXYGEN__\n#define TCP_SNDLOWAT                    LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1)\n#endif\n\n/**\n * TCP_SNDQUEUELOWAT: TCP writable bufs (pbuf count). This must be less\n * than TCP_SND_QUEUELEN. If the number of pbufs queued on a pcb drops below\n * this number, select returns writable (combined with TCP_SNDLOWAT).\n */\n#if !defined TCP_SNDQUEUELOWAT || defined __DOXYGEN__\n#define TCP_SNDQUEUELOWAT               LWIP_MAX(((TCP_SND_QUEUELEN)/2), 5)\n#endif\n\n/**\n * TCP_OOSEQ_MAX_BYTES: The maximum number of bytes queued on ooseq per pcb.\n * Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==1.\n */\n#if !defined TCP_OOSEQ_MAX_BYTES || defined __DOXYGEN__\n#define TCP_OOSEQ_MAX_BYTES             0\n#endif\n\n/**\n * TCP_OOSEQ_MAX_PBUFS: The maximum number of pbufs queued on ooseq per pcb.\n * Default is 0 (no limit). Only valid for TCP_QUEUE_OOSEQ==1.\n */\n#if !defined TCP_OOSEQ_MAX_PBUFS || defined __DOXYGEN__\n#define TCP_OOSEQ_MAX_PBUFS             0\n#endif\n\n/**\n * TCP_LISTEN_BACKLOG: Enable the backlog option for tcp listen pcb.\n */\n#if !defined TCP_LISTEN_BACKLOG || defined __DOXYGEN__\n#define TCP_LISTEN_BACKLOG              0\n#endif\n\n/**\n * The maximum allowed backlog for TCP listen netconns.\n * This backlog is used unless another is explicitly specified.\n * 0xff is the maximum (u8_t).\n */\n#if !defined TCP_DEFAULT_LISTEN_BACKLOG || defined __DOXYGEN__\n#define TCP_DEFAULT_LISTEN_BACKLOG      0xff\n#endif\n\n/**\n * TCP_OVERSIZE: The maximum number of bytes that tcp_write may\n * allocate ahead of time in an attempt to create shorter pbuf chains\n * for transmission. The meaningful range is 0 to TCP_MSS. Some\n * suggested values are:\n *\n * 0:         Disable oversized allocation. Each tcp_write() allocates a new\n              pbuf (old behaviour).\n * 1:         Allocate size-aligned pbufs with minimal excess. Use this if your\n *            scatter-gather DMA requires aligned fragments.\n * 128:       Limit the pbuf/memory overhead to 20%.\n * TCP_MSS:   Try to create unfragmented TCP packets.\n * TCP_MSS/4: Try to create 4 fragments or less per TCP packet.\n */\n#if !defined TCP_OVERSIZE || defined __DOXYGEN__\n#define TCP_OVERSIZE                    TCP_MSS\n#endif\n\n/**\n * LWIP_TCP_TIMESTAMPS==1: support the TCP timestamp option.\n * The timestamp option is currently only used to help remote hosts, it is not\n * really used locally. Therefore, it is only enabled when a TS option is\n * received in the initial SYN packet from a remote host.\n */\n#if !defined LWIP_TCP_TIMESTAMPS || defined __DOXYGEN__\n#define LWIP_TCP_TIMESTAMPS             0\n#endif\n\n/**\n * TCP_WND_UPDATE_THRESHOLD: difference in window to trigger an\n * explicit window update\n */\n#if !defined TCP_WND_UPDATE_THRESHOLD || defined __DOXYGEN__\n#define TCP_WND_UPDATE_THRESHOLD   LWIP_MIN((TCP_WND / 4), (TCP_MSS * 4))\n#endif\n\n/**\n * LWIP_EVENT_API and LWIP_CALLBACK_API: Only one of these should be set to 1.\n *     LWIP_EVENT_API==1: The user defines lwip_tcp_event() to receive all\n *         events (accept, sent, etc) that happen in the system.\n *     LWIP_CALLBACK_API==1: The PCB callback function is called directly\n *         for the event. This is the default.\n */\n#if !defined(LWIP_EVENT_API) && !defined(LWIP_CALLBACK_API) || defined __DOXYGEN__\n#define LWIP_EVENT_API                  0\n#define LWIP_CALLBACK_API               1\n#else\n#ifndef LWIP_EVENT_API\n#define LWIP_EVENT_API                  0\n#endif\n#ifndef LWIP_CALLBACK_API\n#define LWIP_CALLBACK_API               0\n#endif\n#endif\n\n/**\n * LWIP_WND_SCALE and TCP_RCV_SCALE:\n * Set LWIP_WND_SCALE to 1 to enable window scaling.\n * Set TCP_RCV_SCALE to the desired scaling factor (shift count in the\n * range of [0..14]).\n * When LWIP_WND_SCALE is enabled but TCP_RCV_SCALE is 0, we can use a large\n * send window while having a small receive window only.\n */\n#if !defined LWIP_WND_SCALE || defined __DOXYGEN__\n#define LWIP_WND_SCALE                  0\n#define TCP_RCV_SCALE                   0\n#endif\n/**\n * @}\n */\n\n/*\n   ----------------------------------\n   ---------- Pbuf options ----------\n   ----------------------------------\n*/\n/**\n * @defgroup lwip_opts_pbuf PBUF\n * @ingroup lwip_opts\n * @{\n */\n/**\n * PBUF_LINK_HLEN: the number of bytes that should be allocated for a\n * link level header. The default is 14, the standard value for\n * Ethernet.\n */\n#if !defined PBUF_LINK_HLEN || defined __DOXYGEN__\n#if defined LWIP_HOOK_VLAN_SET && !defined __DOXYGEN__\n#define PBUF_LINK_HLEN                  (18 + ETH_PAD_SIZE)\n#else /* LWIP_HOOK_VLAN_SET */\n#define PBUF_LINK_HLEN                  (14 + ETH_PAD_SIZE)\n#endif /* LWIP_HOOK_VLAN_SET */\n#endif\n\n/**\n * PBUF_LINK_ENCAPSULATION_HLEN: the number of bytes that should be allocated\n * for an additional encapsulation header before ethernet headers (e.g. 802.11)\n */\n#if !defined PBUF_LINK_ENCAPSULATION_HLEN || defined __DOXYGEN__\n#define PBUF_LINK_ENCAPSULATION_HLEN    0u\n#endif\n\n/**\n * PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. The default is\n * designed to accommodate single full size TCP frame in one pbuf, including\n * TCP_MSS, IP header, and link header.\n */\n#if !defined PBUF_POOL_BUFSIZE || defined __DOXYGEN__\n#define PBUF_POOL_BUFSIZE               LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_ENCAPSULATION_HLEN+PBUF_LINK_HLEN)\n#endif\n/**\n * @}\n */\n\n/*\n   ------------------------------------------------\n   ---------- Network Interfaces options ----------\n   ------------------------------------------------\n*/\n/**\n * @defgroup lwip_opts_netif NETIF\n * @ingroup lwip_opts\n * @{\n */\n/**\n * LWIP_NETIF_HOSTNAME==1: use DHCP_OPTION_HOSTNAME with netif's hostname\n * field.\n */\n#if !defined LWIP_NETIF_HOSTNAME || defined __DOXYGEN__\n#define LWIP_NETIF_HOSTNAME             0\n#endif\n\n/**\n * LWIP_NETIF_API==1: Support netif api (in netifapi.c)\n */\n#if !defined LWIP_NETIF_API || defined __DOXYGEN__\n#define LWIP_NETIF_API                  0\n#endif\n\n/**\n * LWIP_NETIF_STATUS_CALLBACK==1: Support a callback function whenever an interface\n * changes its up/down status (i.e., due to DHCP IP acquisition)\n */\n#if !defined LWIP_NETIF_STATUS_CALLBACK || defined __DOXYGEN__\n#define LWIP_NETIF_STATUS_CALLBACK      0\n#endif\n\n/**\n * LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface\n * whenever the link changes (i.e., link down)\n */\n#if !defined LWIP_NETIF_LINK_CALLBACK || defined __DOXYGEN__\n#define LWIP_NETIF_LINK_CALLBACK        0\n#endif\n\n/**\n * LWIP_NETIF_REMOVE_CALLBACK==1: Support a callback function that is called\n * when a netif has been removed\n */\n#if !defined LWIP_NETIF_REMOVE_CALLBACK || defined __DOXYGEN__\n#define LWIP_NETIF_REMOVE_CALLBACK      0\n#endif\n\n/**\n * LWIP_NETIF_HWADDRHINT==1: Cache link-layer-address hints (e.g. table\n * indices) in struct netif. TCP and UDP can make use of this to prevent\n * scanning the ARP table for every sent packet. While this is faster for big\n * ARP tables or many concurrent connections, it might be counterproductive\n * if you have a tiny ARP table or if there never are concurrent connections.\n */\n#if !defined LWIP_NETIF_HWADDRHINT || defined __DOXYGEN__\n#define LWIP_NETIF_HWADDRHINT           0\n#endif\n\n/**\n * LWIP_NETIF_TX_SINGLE_PBUF: if this is set to 1, lwIP tries to put all data\n * to be sent into one single pbuf. This is for compatibility with DMA-enabled\n * MACs that do not support scatter-gather.\n * Beware that this might involve CPU-memcpy before transmitting that would not\n * be needed without this flag! Use this only if you need to!\n *\n * @todo: TCP and IP-frag do not work with this, yet:\n */\n#if !defined LWIP_NETIF_TX_SINGLE_PBUF || defined __DOXYGEN__\n#define LWIP_NETIF_TX_SINGLE_PBUF             0\n#endif /* LWIP_NETIF_TX_SINGLE_PBUF */\n\n/**\n * LWIP_NUM_NETIF_CLIENT_DATA: Number of clients that may store\n * data in client_data member array of struct netif.\n */\n#if !defined LWIP_NUM_NETIF_CLIENT_DATA || defined __DOXYGEN__\n#define LWIP_NUM_NETIF_CLIENT_DATA            0\n#endif\n/**\n * @}\n */\n\n/*\n   ------------------------------------\n   ---------- LOOPIF options ----------\n   ------------------------------------\n*/\n/**\n * @defgroup lwip_opts_loop Loopback interface\n * @ingroup lwip_opts_netif\n * @{\n */\n/**\n * LWIP_HAVE_LOOPIF==1: Support loop interface (127.0.0.1).\n * This is only needed when no real netifs are available. If at least one other\n * netif is available, loopback traffic uses this netif.\n */\n#if !defined LWIP_HAVE_LOOPIF || defined __DOXYGEN__\n#define LWIP_HAVE_LOOPIF                LWIP_NETIF_LOOPBACK\n#endif\n\n/**\n * LWIP_LOOPIF_MULTICAST==1: Support multicast/IGMP on loop interface (127.0.0.1).\n */\n#if !defined LWIP_LOOPIF_MULTICAST || defined __DOXYGEN__\n#define LWIP_LOOPIF_MULTICAST               0\n#endif\n\n/**\n * LWIP_NETIF_LOOPBACK==1: Support sending packets with a destination IP\n * address equal to the netif IP address, looping them back up the stack.\n */\n#if !defined LWIP_NETIF_LOOPBACK || defined __DOXYGEN__\n#define LWIP_NETIF_LOOPBACK             0\n#endif\n\n/**\n * LWIP_LOOPBACK_MAX_PBUFS: Maximum number of pbufs on queue for loopback\n * sending for each netif (0 = disabled)\n */\n#if !defined LWIP_LOOPBACK_MAX_PBUFS || defined __DOXYGEN__\n#define LWIP_LOOPBACK_MAX_PBUFS         0\n#endif\n\n/**\n * LWIP_NETIF_LOOPBACK_MULTITHREADING: Indicates whether threading is enabled in\n * the system, as netifs must change how they behave depending on this setting\n * for the LWIP_NETIF_LOOPBACK option to work.\n * Setting this is needed to avoid reentering non-reentrant functions like\n * tcp_input().\n *    LWIP_NETIF_LOOPBACK_MULTITHREADING==1: Indicates that the user is using a\n *       multithreaded environment like tcpip.c. In this case, netif->input()\n *       is called directly.\n *    LWIP_NETIF_LOOPBACK_MULTITHREADING==0: Indicates a polling (or NO_SYS) setup.\n *       The packets are put on a list and netif_poll() must be called in\n *       the main application loop.\n */\n#if !defined LWIP_NETIF_LOOPBACK_MULTITHREADING || defined __DOXYGEN__\n#define LWIP_NETIF_LOOPBACK_MULTITHREADING    (!NO_SYS)\n#endif\n/**\n * @}\n */\n\n/*\n   ------------------------------------\n   ---------- Thread options ----------\n   ------------------------------------\n*/\n/**\n * @defgroup lwip_opts_thread Threading\n * @ingroup lwip_opts_infrastructure\n * @{\n */\n/**\n * TCPIP_THREAD_NAME: The name assigned to the main tcpip thread.\n */\n#if !defined TCPIP_THREAD_NAME || defined __DOXYGEN__\n#define TCPIP_THREAD_NAME              \"tcpip_thread\"\n#endif\n\n/**\n * TCPIP_THREAD_STACKSIZE: The stack size used by the main tcpip thread.\n * The stack size value itself is platform-dependent, but is passed to\n * sys_thread_new() when the thread is created.\n */\n#if !defined TCPIP_THREAD_STACKSIZE || defined __DOXYGEN__\n#define TCPIP_THREAD_STACKSIZE          0\n#endif\n\n/**\n * TCPIP_THREAD_PRIO: The priority assigned to the main tcpip thread.\n * The priority value itself is platform-dependent, but is passed to\n * sys_thread_new() when the thread is created.\n */\n#if !defined TCPIP_THREAD_PRIO || defined __DOXYGEN__\n#define TCPIP_THREAD_PRIO               1\n#endif\n\n/**\n * TCPIP_MBOX_SIZE: The mailbox size for the tcpip thread messages\n * The queue size value itself is platform-dependent, but is passed to\n * sys_mbox_new() when tcpip_init is called.\n */\n#if !defined TCPIP_MBOX_SIZE || defined __DOXYGEN__\n#define TCPIP_MBOX_SIZE                 0\n#endif\n\n/**\n * Define this to something that triggers a watchdog. This is called from\n * tcpip_thread after processing a message.\n */\n#if !defined LWIP_TCPIP_THREAD_ALIVE || defined __DOXYGEN__\n#define LWIP_TCPIP_THREAD_ALIVE()\n#endif\n\n/**\n * SLIPIF_THREAD_NAME: The name assigned to the slipif_loop thread.\n */\n#if !defined SLIPIF_THREAD_NAME || defined __DOXYGEN__\n#define SLIPIF_THREAD_NAME             \"slipif_loop\"\n#endif\n\n/**\n * SLIP_THREAD_STACKSIZE: The stack size used by the slipif_loop thread.\n * The stack size value itself is platform-dependent, but is passed to\n * sys_thread_new() when the thread is created.\n */\n#if !defined SLIPIF_THREAD_STACKSIZE || defined __DOXYGEN__\n#define SLIPIF_THREAD_STACKSIZE         0\n#endif\n\n/**\n * SLIPIF_THREAD_PRIO: The priority assigned to the slipif_loop thread.\n * The priority value itself is platform-dependent, but is passed to\n * sys_thread_new() when the thread is created.\n */\n#if !defined SLIPIF_THREAD_PRIO || defined __DOXYGEN__\n#define SLIPIF_THREAD_PRIO              1\n#endif\n\n/**\n * DEFAULT_THREAD_NAME: The name assigned to any other lwIP thread.\n */\n#if !defined DEFAULT_THREAD_NAME || defined __DOXYGEN__\n#define DEFAULT_THREAD_NAME            \"lwIP\"\n#endif\n\n/**\n * DEFAULT_THREAD_STACKSIZE: The stack size used by any other lwIP thread.\n * The stack size value itself is platform-dependent, but is passed to\n * sys_thread_new() when the thread is created.\n */\n#if !defined DEFAULT_THREAD_STACKSIZE || defined __DOXYGEN__\n#define DEFAULT_THREAD_STACKSIZE        0\n#endif\n\n/**\n * DEFAULT_THREAD_PRIO: The priority assigned to any other lwIP thread.\n * The priority value itself is platform-dependent, but is passed to\n * sys_thread_new() when the thread is created.\n */\n#if !defined DEFAULT_THREAD_PRIO || defined __DOXYGEN__\n#define DEFAULT_THREAD_PRIO             1\n#endif\n\n/**\n * DEFAULT_RAW_RECVMBOX_SIZE: The mailbox size for the incoming packets on a\n * NETCONN_RAW. The queue size value itself is platform-dependent, but is passed\n * to sys_mbox_new() when the recvmbox is created.\n */\n#if !defined DEFAULT_RAW_RECVMBOX_SIZE || defined __DOXYGEN__\n#define DEFAULT_RAW_RECVMBOX_SIZE       0\n#endif\n\n/**\n * DEFAULT_UDP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a\n * NETCONN_UDP. The queue size value itself is platform-dependent, but is passed\n * to sys_mbox_new() when the recvmbox is created.\n */\n#if !defined DEFAULT_UDP_RECVMBOX_SIZE || defined __DOXYGEN__\n#define DEFAULT_UDP_RECVMBOX_SIZE       0\n#endif\n\n/**\n * DEFAULT_TCP_RECVMBOX_SIZE: The mailbox size for the incoming packets on a\n * NETCONN_TCP. The queue size value itself is platform-dependent, but is passed\n * to sys_mbox_new() when the recvmbox is created.\n */\n#if !defined DEFAULT_TCP_RECVMBOX_SIZE || defined __DOXYGEN__\n#define DEFAULT_TCP_RECVMBOX_SIZE       0\n#endif\n\n/**\n * DEFAULT_ACCEPTMBOX_SIZE: The mailbox size for the incoming connections.\n * The queue size value itself is platform-dependent, but is passed to\n * sys_mbox_new() when the acceptmbox is created.\n */\n#if !defined DEFAULT_ACCEPTMBOX_SIZE || defined __DOXYGEN__\n#define DEFAULT_ACCEPTMBOX_SIZE         0\n#endif\n/**\n * @}\n */\n\n/*\n   ----------------------------------------------\n   ---------- Sequential layer options ----------\n   ----------------------------------------------\n*/\n/**\n * @defgroup lwip_opts_netconn Netconn\n * @ingroup lwip_opts_threadsafe_apis\n * @{\n */\n/**\n * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)\n */\n#if !defined LWIP_NETCONN || defined __DOXYGEN__\n#define LWIP_NETCONN                    1\n#endif\n\n/** LWIP_TCPIP_TIMEOUT==1: Enable tcpip_timeout/tcpip_untimeout to create\n * timers running in tcpip_thread from another thread.\n */\n#if !defined LWIP_TCPIP_TIMEOUT || defined __DOXYGEN__\n#define LWIP_TCPIP_TIMEOUT              0\n#endif\n\n/** LWIP_NETCONN_SEM_PER_THREAD==1: Use one (thread-local) semaphore per\n * thread calling socket/netconn functions instead of allocating one\n * semaphore per netconn (and per select etc.)\n * ATTENTION: a thread-local semaphore for API calls is needed:\n * - LWIP_NETCONN_THREAD_SEM_GET() returning a sys_sem_t*\n * - LWIP_NETCONN_THREAD_SEM_ALLOC() creating the semaphore\n * - LWIP_NETCONN_THREAD_SEM_FREE() freeing the semaphore\n * The latter 2 can be invoked up by calling netconn_thread_init()/netconn_thread_cleanup().\n * Ports may call these for threads created with sys_thread_new().\n */\n#if !defined LWIP_NETCONN_SEM_PER_THREAD || defined __DOXYGEN__\n#define LWIP_NETCONN_SEM_PER_THREAD     0\n#endif\n\n/** LWIP_NETCONN_FULLDUPLEX==1: Enable code that allows reading from one thread,\n * writing from a 2nd thread and closing from a 3rd thread at the same time.\n * ATTENTION: This is currently really alpha! Some requirements:\n * - LWIP_NETCONN_SEM_PER_THREAD==1 is required to use one socket/netconn from\n *   multiple threads at once\n * - sys_mbox_free() has to unblock receive tasks waiting on recvmbox/acceptmbox\n *   and prevent a task pending on this during/after deletion\n */\n#if !defined LWIP_NETCONN_FULLDUPLEX || defined __DOXYGEN__\n#define LWIP_NETCONN_FULLDUPLEX         0\n#endif\n/**\n * @}\n */\n\n/*\n   ------------------------------------\n   ---------- Socket options ----------\n   ------------------------------------\n*/\n/**\n * @defgroup lwip_opts_socket Sockets\n * @ingroup lwip_opts_threadsafe_apis\n * @{\n */\n/**\n * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)\n */\n#if !defined LWIP_SOCKET || defined __DOXYGEN__\n#define LWIP_SOCKET                     1\n#endif\n\n/* LWIP_SOCKET_SET_ERRNO==1: Set errno when socket functions cannot complete\n * successfully, as required by POSIX. Default is POSIX-compliant.\n */\n#if !defined LWIP_SOCKET_SET_ERRNO || defined __DOXYGEN__\n#define LWIP_SOCKET_SET_ERRNO           1\n#endif\n\n/**\n * LWIP_COMPAT_SOCKETS==1: Enable BSD-style sockets functions names through defines.\n * LWIP_COMPAT_SOCKETS==2: Same as ==1 but correctly named functions are created.\n * While this helps code completion, it might conflict with existing libraries.\n * (only used if you use sockets.c)\n */\n#if !defined LWIP_COMPAT_SOCKETS || defined __DOXYGEN__\n#define LWIP_COMPAT_SOCKETS             1\n#endif\n\n/**\n * LWIP_POSIX_SOCKETS_IO_NAMES==1: Enable POSIX-style sockets functions names.\n * Disable this option if you use a POSIX operating system that uses the same\n * names (read, write & close). (only used if you use sockets.c)\n */\n#if !defined LWIP_POSIX_SOCKETS_IO_NAMES || defined __DOXYGEN__\n#define LWIP_POSIX_SOCKETS_IO_NAMES     1\n#endif\n\n/**\n * LWIP_SOCKET_OFFSET==n: Increases the file descriptor number created by LwIP with n.\n * This can be useful when there are multiple APIs which create file descriptors.\n * When they all start with a different offset and you won't make them overlap you can\n * re implement read/write/close/ioctl/fnctl to send the requested action to the right\n * library (sharing select will need more work though).\n */\n#if !defined LWIP_SOCKET_OFFSET || defined __DOXYGEN__\n#define LWIP_SOCKET_OFFSET              0\n#endif\n\n/**\n * LWIP_TCP_KEEPALIVE==1: Enable TCP_KEEPIDLE, TCP_KEEPINTVL and TCP_KEEPCNT\n * options processing. Note that TCP_KEEPIDLE and TCP_KEEPINTVL have to be set\n * in seconds. (does not require sockets.c, and will affect tcp.c)\n */\n#if !defined LWIP_TCP_KEEPALIVE || defined __DOXYGEN__\n#define LWIP_TCP_KEEPALIVE              0\n#endif\n\n/**\n * LWIP_SO_SNDTIMEO==1: Enable send timeout for sockets/netconns and\n * SO_SNDTIMEO processing.\n */\n#if !defined LWIP_SO_SNDTIMEO || defined __DOXYGEN__\n#define LWIP_SO_SNDTIMEO                0\n#endif\n\n/**\n * LWIP_SO_RCVTIMEO==1: Enable receive timeout for sockets/netconns and\n * SO_RCVTIMEO processing.\n */\n#if !defined LWIP_SO_RCVTIMEO || defined __DOXYGEN__\n#define LWIP_SO_RCVTIMEO                0\n#endif\n\n/**\n * LWIP_SO_SNDRCVTIMEO_NONSTANDARD==1: SO_RCVTIMEO/SO_SNDTIMEO take an int\n * (milliseconds, much like winsock does) instead of a struct timeval (default).\n */\n#if !defined LWIP_SO_SNDRCVTIMEO_NONSTANDARD || defined __DOXYGEN__\n#define LWIP_SO_SNDRCVTIMEO_NONSTANDARD 0\n#endif\n\n/**\n * LWIP_SO_RCVBUF==1: Enable SO_RCVBUF processing.\n */\n#if !defined LWIP_SO_RCVBUF || defined __DOXYGEN__\n#define LWIP_SO_RCVBUF                  0\n#endif\n\n/**\n * LWIP_SO_LINGER==1: Enable SO_LINGER processing.\n */\n#if !defined LWIP_SO_LINGER || defined __DOXYGEN__\n#define LWIP_SO_LINGER                  0\n#endif\n\n/**\n * If LWIP_SO_RCVBUF is used, this is the default value for recv_bufsize.\n */\n#if !defined RECV_BUFSIZE_DEFAULT || defined __DOXYGEN__\n#define RECV_BUFSIZE_DEFAULT            INT_MAX\n#endif\n\n/**\n * By default, TCP socket/netconn close waits 20 seconds max to send the FIN\n */\n#if !defined LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT || defined __DOXYGEN__\n#define LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT 20000\n#endif\n\n/**\n * SO_REUSE==1: Enable SO_REUSEADDR option.\n */\n#if !defined SO_REUSE || defined __DOXYGEN__\n#define SO_REUSE                        0\n#endif\n\n/**\n * SO_REUSE_RXTOALL==1: Pass a copy of incoming broadcast/multicast packets\n * to all local matches if SO_REUSEADDR is turned on.\n * WARNING: Adds a memcpy for every packet if passing to more than one pcb!\n */\n#if !defined SO_REUSE_RXTOALL || defined __DOXYGEN__\n#define SO_REUSE_RXTOALL                0\n#endif\n\n/**\n * LWIP_FIONREAD_LINUXMODE==0 (default): ioctl/FIONREAD returns the amount of\n * pending data in the network buffer. This is the way windows does it. It's\n * the default for lwIP since it is smaller.\n * LWIP_FIONREAD_LINUXMODE==1: ioctl/FIONREAD returns the size of the next\n * pending datagram in bytes. This is the way linux does it. This code is only\n * here for compatibility.\n */\n#if !defined LWIP_FIONREAD_LINUXMODE || defined __DOXYGEN__\n#define LWIP_FIONREAD_LINUXMODE         0\n#endif\n/**\n * @}\n */\n\n/*\n   ----------------------------------------\n   ---------- Statistics options ----------\n   ----------------------------------------\n*/\n/**\n * @defgroup lwip_opts_stats Statistics\n * @ingroup lwip_opts_debug\n * @{\n */\n/**\n * LWIP_STATS==1: Enable statistics collection in lwip_stats.\n */\n#if !defined LWIP_STATS || defined __DOXYGEN__\n#define LWIP_STATS                      1\n#endif\n\n#if LWIP_STATS\n\n/**\n * LWIP_STATS_DISPLAY==1: Compile in the statistics output functions.\n */\n#if !defined LWIP_STATS_DISPLAY || defined __DOXYGEN__\n#define LWIP_STATS_DISPLAY              0\n#endif\n\n/**\n * LINK_STATS==1: Enable link stats.\n */\n#if !defined LINK_STATS || defined __DOXYGEN__\n#define LINK_STATS                      1\n#endif\n\n/**\n * ETHARP_STATS==1: Enable etharp stats.\n */\n#if !defined ETHARP_STATS || defined __DOXYGEN__\n#define ETHARP_STATS                    (LWIP_ARP)\n#endif\n\n/**\n * IP_STATS==1: Enable IP stats.\n */\n#if !defined IP_STATS || defined __DOXYGEN__\n#define IP_STATS                        1\n#endif\n\n/**\n * IPFRAG_STATS==1: Enable IP fragmentation stats. Default is\n * on if using either frag or reass.\n */\n#if !defined IPFRAG_STATS || defined __DOXYGEN__\n#define IPFRAG_STATS                    (IP_REASSEMBLY || IP_FRAG)\n#endif\n\n/**\n * ICMP_STATS==1: Enable ICMP stats.\n */\n#if !defined ICMP_STATS || defined __DOXYGEN__\n#define ICMP_STATS                      1\n#endif\n\n/**\n * IGMP_STATS==1: Enable IGMP stats.\n */\n#if !defined IGMP_STATS || defined __DOXYGEN__\n#define IGMP_STATS                      (LWIP_IGMP)\n#endif\n\n/**\n * UDP_STATS==1: Enable UDP stats. Default is on if\n * UDP enabled, otherwise off.\n */\n#if !defined UDP_STATS || defined __DOXYGEN__\n#define UDP_STATS                       (LWIP_UDP)\n#endif\n\n/**\n * TCP_STATS==1: Enable TCP stats. Default is on if TCP\n * enabled, otherwise off.\n */\n#if !defined TCP_STATS || defined __DOXYGEN__\n#define TCP_STATS                       (LWIP_TCP)\n#endif\n\n/**\n * MEM_STATS==1: Enable mem.c stats.\n */\n#if !defined MEM_STATS || defined __DOXYGEN__\n#define MEM_STATS                       ((MEM_LIBC_MALLOC == 0) && (MEM_USE_POOLS == 0))\n#endif\n\n/**\n * MEMP_STATS==1: Enable memp.c pool stats.\n */\n#if !defined MEMP_STATS || defined __DOXYGEN__\n#define MEMP_STATS                      (MEMP_MEM_MALLOC == 0)\n#endif\n\n/**\n * SYS_STATS==1: Enable system stats (sem and mbox counts, etc).\n */\n#if !defined SYS_STATS || defined __DOXYGEN__\n#define SYS_STATS                       (NO_SYS == 0)\n#endif\n\n/**\n * IP6_STATS==1: Enable IPv6 stats.\n */\n#if !defined IP6_STATS || defined __DOXYGEN__\n#define IP6_STATS                       (LWIP_IPV6)\n#endif\n\n/**\n * ICMP6_STATS==1: Enable ICMP for IPv6 stats.\n */\n#if !defined ICMP6_STATS || defined __DOXYGEN__\n#define ICMP6_STATS                     (LWIP_IPV6 && LWIP_ICMP6)\n#endif\n\n/**\n * IP6_FRAG_STATS==1: Enable IPv6 fragmentation stats.\n */\n#if !defined IP6_FRAG_STATS || defined __DOXYGEN__\n#define IP6_FRAG_STATS                  (LWIP_IPV6 && (LWIP_IPV6_FRAG || LWIP_IPV6_REASS))\n#endif\n\n/**\n * MLD6_STATS==1: Enable MLD for IPv6 stats.\n */\n#if !defined MLD6_STATS || defined __DOXYGEN__\n#define MLD6_STATS                      (LWIP_IPV6 && LWIP_IPV6_MLD)\n#endif\n\n/**\n * ND6_STATS==1: Enable Neighbor discovery for IPv6 stats.\n */\n#if !defined ND6_STATS || defined __DOXYGEN__\n#define ND6_STATS                       (LWIP_IPV6)\n#endif\n\n/**\n * MIB2_STATS==1: Stats for SNMP MIB2.\n */\n#if !defined MIB2_STATS || defined __DOXYGEN__\n#define MIB2_STATS                      0\n#endif\n\n#else\n\n#define LINK_STATS                      0\n#define ETHARP_STATS                    0\n#define IP_STATS                        0\n#define IPFRAG_STATS                    0\n#define ICMP_STATS                      0\n#define IGMP_STATS                      0\n#define UDP_STATS                       0\n#define TCP_STATS                       0\n#define MEM_STATS                       0\n#define MEMP_STATS                      0\n#define SYS_STATS                       0\n#define LWIP_STATS_DISPLAY              0\n#define IP6_STATS                       0\n#define ICMP6_STATS                     0\n#define IP6_FRAG_STATS                  0\n#define MLD6_STATS                      0\n#define ND6_STATS                       0\n#define MIB2_STATS                      0\n\n#endif /* LWIP_STATS */\n/**\n * @}\n */\n\n/*\n   --------------------------------------\n   ---------- Checksum options ----------\n   --------------------------------------\n*/\n/**\n * @defgroup lwip_opts_checksum Checksum\n * @ingroup lwip_opts_infrastructure\n * @{\n */\n/**\n * LWIP_CHECKSUM_CTRL_PER_NETIF==1: Checksum generation/check can be enabled/disabled\n * per netif.\n * ATTENTION: if enabled, the CHECKSUM_GEN_* and CHECKSUM_CHECK_* defines must be enabled!\n */\n#if !defined LWIP_CHECKSUM_CTRL_PER_NETIF || defined __DOXYGEN__\n#define LWIP_CHECKSUM_CTRL_PER_NETIF    0\n#endif\n\n/**\n * CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.\n */\n#if !defined CHECKSUM_GEN_IP || defined __DOXYGEN__\n#define CHECKSUM_GEN_IP                 1\n#endif\n\n/**\n * CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.\n */\n#if !defined CHECKSUM_GEN_UDP || defined __DOXYGEN__\n#define CHECKSUM_GEN_UDP                1\n#endif\n\n/**\n * CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.\n */\n#if !defined CHECKSUM_GEN_TCP || defined __DOXYGEN__\n#define CHECKSUM_GEN_TCP                1\n#endif\n\n/**\n * CHECKSUM_GEN_ICMP==1: Generate checksums in software for outgoing ICMP packets.\n */\n#if !defined CHECKSUM_GEN_ICMP || defined __DOXYGEN__\n#define CHECKSUM_GEN_ICMP               1\n#endif\n\n/**\n * CHECKSUM_GEN_ICMP6==1: Generate checksums in software for outgoing ICMP6 packets.\n */\n#if !defined CHECKSUM_GEN_ICMP6 || defined __DOXYGEN__\n#define CHECKSUM_GEN_ICMP6              1\n#endif\n\n/**\n * CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.\n */\n#if !defined CHECKSUM_CHECK_IP || defined __DOXYGEN__\n#define CHECKSUM_CHECK_IP               1\n#endif\n\n/**\n * CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.\n */\n#if !defined CHECKSUM_CHECK_UDP || defined __DOXYGEN__\n#define CHECKSUM_CHECK_UDP              1\n#endif\n\n/**\n * CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.\n */\n#if !defined CHECKSUM_CHECK_TCP || defined __DOXYGEN__\n#define CHECKSUM_CHECK_TCP              1\n#endif\n\n/**\n * CHECKSUM_CHECK_ICMP==1: Check checksums in software for incoming ICMP packets.\n */\n#if !defined CHECKSUM_CHECK_ICMP || defined __DOXYGEN__\n#define CHECKSUM_CHECK_ICMP             1\n#endif\n\n/**\n * CHECKSUM_CHECK_ICMP6==1: Check checksums in software for incoming ICMPv6 packets\n */\n#if !defined CHECKSUM_CHECK_ICMP6 || defined __DOXYGEN__\n#define CHECKSUM_CHECK_ICMP6            1\n#endif\n\n/**\n * LWIP_CHECKSUM_ON_COPY==1: Calculate checksum when copying data from\n * application buffers to pbufs.\n */\n#if !defined LWIP_CHECKSUM_ON_COPY || defined __DOXYGEN__\n#define LWIP_CHECKSUM_ON_COPY           0\n#endif\n/**\n * @}\n */\n\n/*\n   ---------------------------------------\n   ---------- IPv6 options ---------------\n   ---------------------------------------\n*/\n/**\n * @defgroup lwip_opts_ipv6 IPv6\n * @ingroup lwip_opts\n * @{\n */\n/**\n * LWIP_IPV6==1: Enable IPv6\n */\n#if !defined LWIP_IPV6 || defined __DOXYGEN__\n#define LWIP_IPV6                       0\n#endif\n\n/**\n * LWIP_IPV6_NUM_ADDRESSES: Number of IPv6 addresses per netif.\n */\n#if !defined LWIP_IPV6_NUM_ADDRESSES || defined __DOXYGEN__\n#define LWIP_IPV6_NUM_ADDRESSES         3\n#endif\n\n/**\n * LWIP_IPV6_FORWARD==1: Forward IPv6 packets across netifs\n */\n#if !defined LWIP_IPV6_FORWARD || defined __DOXYGEN__\n#define LWIP_IPV6_FORWARD               0\n#endif\n\n/**\n * LWIP_IPV6_FRAG==1: Fragment outgoing IPv6 packets that are too big.\n */\n#if !defined LWIP_IPV6_FRAG || defined __DOXYGEN__\n#define LWIP_IPV6_FRAG                  0\n#endif\n\n/**\n * LWIP_IPV6_REASS==1: reassemble incoming IPv6 packets that fragmented\n */\n#if !defined LWIP_IPV6_REASS || defined __DOXYGEN__\n#define LWIP_IPV6_REASS                 (LWIP_IPV6)\n#endif\n\n/**\n * LWIP_IPV6_SEND_ROUTER_SOLICIT==1: Send router solicitation messages during\n * network startup.\n */\n#if !defined LWIP_IPV6_SEND_ROUTER_SOLICIT || defined __DOXYGEN__\n#define LWIP_IPV6_SEND_ROUTER_SOLICIT   1\n#endif\n\n/**\n * LWIP_IPV6_AUTOCONFIG==1: Enable stateless address autoconfiguration as per RFC 4862.\n */\n#if !defined LWIP_IPV6_AUTOCONFIG || defined __DOXYGEN__\n#define LWIP_IPV6_AUTOCONFIG            (LWIP_IPV6)\n#endif\n\n/**\n * LWIP_IPV6_DUP_DETECT_ATTEMPTS=[0..7]: Number of duplicate address detection attempts.\n */\n#if !defined LWIP_IPV6_DUP_DETECT_ATTEMPTS || defined __DOXYGEN__\n#define LWIP_IPV6_DUP_DETECT_ATTEMPTS   1\n#endif\n/**\n * @}\n */\n\n/**\n * @defgroup lwip_opts_icmp6 ICMP6\n * @ingroup lwip_opts_ipv6\n * @{\n */\n/**\n * LWIP_ICMP6==1: Enable ICMPv6 (mandatory per RFC)\n */\n#if !defined LWIP_ICMP6 || defined __DOXYGEN__\n#define LWIP_ICMP6                      (LWIP_IPV6)\n#endif\n\n/**\n * LWIP_ICMP6_DATASIZE: bytes from original packet to send back in\n * ICMPv6 error messages.\n */\n#if !defined LWIP_ICMP6_DATASIZE || defined __DOXYGEN__\n#define LWIP_ICMP6_DATASIZE             8\n#endif\n\n/**\n * LWIP_ICMP6_HL: default hop limit for ICMPv6 messages\n */\n#if !defined LWIP_ICMP6_HL || defined __DOXYGEN__\n#define LWIP_ICMP6_HL                   255\n#endif\n/**\n * @}\n */\n\n/**\n * @defgroup lwip_opts_mld6 Multicast listener discovery\n * @ingroup lwip_opts_ipv6\n * @{\n */\n/**\n * LWIP_IPV6_MLD==1: Enable multicast listener discovery protocol.\n * If LWIP_IPV6 is enabled but this setting is disabled, the MAC layer must\n * indiscriminately pass all inbound IPv6 multicast traffic to lwIP.\n */\n#if !defined LWIP_IPV6_MLD || defined __DOXYGEN__\n#define LWIP_IPV6_MLD                   (LWIP_IPV6)\n#endif\n\n/**\n * MEMP_NUM_MLD6_GROUP: Max number of IPv6 multicast groups that can be joined.\n * There must be enough groups so that each netif can join the solicited-node\n * multicast group for each of its local addresses, plus one for MDNS if\n * applicable, plus any number of groups to be joined on UDP sockets.\n */\n#if !defined MEMP_NUM_MLD6_GROUP || defined __DOXYGEN__\n#define MEMP_NUM_MLD6_GROUP             4\n#endif\n/**\n * @}\n */\n\n/**\n * @defgroup lwip_opts_nd6 Neighbor discovery\n * @ingroup lwip_opts_ipv6\n * @{\n */\n/**\n * LWIP_ND6_QUEUEING==1: queue outgoing IPv6 packets while MAC address\n * is being resolved.\n */\n#if !defined LWIP_ND6_QUEUEING || defined __DOXYGEN__\n#define LWIP_ND6_QUEUEING               (LWIP_IPV6)\n#endif\n\n/**\n * MEMP_NUM_ND6_QUEUE: Max number of IPv6 packets to queue during MAC resolution.\n */\n#if !defined MEMP_NUM_ND6_QUEUE || defined __DOXYGEN__\n#define MEMP_NUM_ND6_QUEUE              20\n#endif\n\n/**\n * LWIP_ND6_NUM_NEIGHBORS: Number of entries in IPv6 neighbor cache\n */\n#if !defined LWIP_ND6_NUM_NEIGHBORS || defined __DOXYGEN__\n#define LWIP_ND6_NUM_NEIGHBORS          10\n#endif\n\n/**\n * LWIP_ND6_NUM_DESTINATIONS: number of entries in IPv6 destination cache\n */\n#if !defined LWIP_ND6_NUM_DESTINATIONS || defined __DOXYGEN__\n#define LWIP_ND6_NUM_DESTINATIONS       10\n#endif\n\n/**\n * LWIP_ND6_NUM_PREFIXES: number of entries in IPv6 on-link prefixes cache\n */\n#if !defined LWIP_ND6_NUM_PREFIXES || defined __DOXYGEN__\n#define LWIP_ND6_NUM_PREFIXES           5\n#endif\n\n/**\n * LWIP_ND6_NUM_ROUTERS: number of entries in IPv6 default router cache\n */\n#if !defined LWIP_ND6_NUM_ROUTERS || defined __DOXYGEN__\n#define LWIP_ND6_NUM_ROUTERS            3\n#endif\n\n/**\n * LWIP_ND6_MAX_MULTICAST_SOLICIT: max number of multicast solicit messages to send\n * (neighbor solicit and router solicit)\n */\n#if !defined LWIP_ND6_MAX_MULTICAST_SOLICIT || defined __DOXYGEN__\n#define LWIP_ND6_MAX_MULTICAST_SOLICIT  3\n#endif\n\n/**\n * LWIP_ND6_MAX_UNICAST_SOLICIT: max number of unicast neighbor solicitation messages\n * to send during neighbor reachability detection.\n */\n#if !defined LWIP_ND6_MAX_UNICAST_SOLICIT || defined __DOXYGEN__\n#define LWIP_ND6_MAX_UNICAST_SOLICIT    3\n#endif\n\n/**\n * Unused: See ND RFC (time in milliseconds).\n */\n#if !defined LWIP_ND6_MAX_ANYCAST_DELAY_TIME || defined __DOXYGEN__\n#define LWIP_ND6_MAX_ANYCAST_DELAY_TIME 1000\n#endif\n\n/**\n * Unused: See ND RFC\n */\n#if !defined LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT || defined __DOXYGEN__\n#define LWIP_ND6_MAX_NEIGHBOR_ADVERTISEMENT  3\n#endif\n\n/**\n * LWIP_ND6_REACHABLE_TIME: default neighbor reachable time (in milliseconds).\n * May be updated by router advertisement messages.\n */\n#if !defined LWIP_ND6_REACHABLE_TIME || defined __DOXYGEN__\n#define LWIP_ND6_REACHABLE_TIME         30000\n#endif\n\n/**\n * LWIP_ND6_RETRANS_TIMER: default retransmission timer for solicitation messages\n */\n#if !defined LWIP_ND6_RETRANS_TIMER || defined __DOXYGEN__\n#define LWIP_ND6_RETRANS_TIMER          1000\n#endif\n\n/**\n * LWIP_ND6_DELAY_FIRST_PROBE_TIME: Delay before first unicast neighbor solicitation\n * message is sent, during neighbor reachability detection.\n */\n#if !defined LWIP_ND6_DELAY_FIRST_PROBE_TIME || defined __DOXYGEN__\n#define LWIP_ND6_DELAY_FIRST_PROBE_TIME 5000\n#endif\n\n/**\n * LWIP_ND6_ALLOW_RA_UPDATES==1: Allow Router Advertisement messages to update\n * Reachable time and retransmission timers, and netif MTU.\n */\n#if !defined LWIP_ND6_ALLOW_RA_UPDATES || defined __DOXYGEN__\n#define LWIP_ND6_ALLOW_RA_UPDATES       1\n#endif\n\n/**\n * LWIP_ND6_TCP_REACHABILITY_HINTS==1: Allow TCP to provide Neighbor Discovery\n * with reachability hints for connected destinations. This helps avoid sending\n * unicast neighbor solicitation messages.\n */\n#if !defined LWIP_ND6_TCP_REACHABILITY_HINTS || defined __DOXYGEN__\n#define LWIP_ND6_TCP_REACHABILITY_HINTS 1\n#endif\n\n/**\n * LWIP_ND6_RDNSS_MAX_DNS_SERVERS > 0: Use IPv6 Router Advertisement Recursive\n * DNS Server Option (as per RFC 6106) to copy a defined maximum number of DNS\n * servers to the DNS module.\n */\n#if !defined LWIP_ND6_RDNSS_MAX_DNS_SERVERS || defined __DOXYGEN__\n#define LWIP_ND6_RDNSS_MAX_DNS_SERVERS  0\n#endif\n/**\n * @}\n */\n\n/**\n * LWIP_IPV6_DHCP6==1: enable DHCPv6 stateful address autoconfiguration.\n */\n#if !defined LWIP_IPV6_DHCP6 || defined __DOXYGEN__\n#define LWIP_IPV6_DHCP6                 0\n#endif\n\n/*\n   ---------------------------------------\n   ---------- Hook options ---------------\n   ---------------------------------------\n*/\n\n/**\n * @defgroup lwip_opts_hooks Hooks\n * @ingroup lwip_opts_infrastructure\n * Hooks are undefined by default, define them to a function if you need them.\n * @{\n */\n\n/**\n * LWIP_HOOK_FILENAME: Custom filename to #include in files that provide hooks.\n * Declare your hook function prototypes in there, you may also #include all headers\n * providing data types that are need in this file.\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_FILENAME \"path/to/my/lwip_hooks.h\"\n#endif\n\n/**\n * LWIP_HOOK_TCP_ISN:\n * Hook for generation of the Initial Sequence Number (ISN) for a new TCP\n * connection. The default lwIP ISN generation algorithm is very basic and may\n * allow for TCP spoofing attacks. This hook provides the means to implement\n * the standardized ISN generation algorithm from RFC 6528 (see contrib/adons/tcp_isn),\n * or any other desired algorithm as a replacement.\n * Called from tcp_connect() and tcp_listen_input() when an ISN is needed for\n * a new TCP connection, if TCP support (@ref LWIP_TCP) is enabled.\\n\n * Signature: u32_t my_hook_tcp_isn(const ip_addr_t* local_ip, u16_t local_port, const ip_addr_t* remote_ip, u16_t remote_port);\n * - it may be necessary to use \"struct ip_addr\" (ip4_addr, ip6_addr) instead of \"ip_addr_t\" in function declarations\\n\n * Arguments:\n * - local_ip: pointer to the local IP address of the connection\n * - local_port: local port number of the connection (host-byte order)\n * - remote_ip: pointer to the remote IP address of the connection\n * - remote_port: remote port number of the connection (host-byte order)\\n\n * Return value:\n * - the 32-bit Initial Sequence Number to use for the new TCP connection.\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_TCP_ISN(local_ip, local_port, remote_ip, remote_port)\n#endif\n\n/**\n * LWIP_HOOK_IP4_INPUT(pbuf, input_netif):\n * - called from ip_input() (IPv4)\n * - pbuf: received struct pbuf passed to ip_input()\n * - input_netif: struct netif on which the packet has been received\n * Return values:\n * - 0: Hook has not consumed the packet, packet is processed as normal\n * - != 0: Hook has consumed the packet.\n * If the hook consumed the packet, 'pbuf' is in the responsibility of the hook\n * (i.e. free it when done).\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_IP4_INPUT(pbuf, input_netif)\n#endif\n\n/**\n * LWIP_HOOK_IP4_ROUTE(dest):\n * - called from ip_route() (IPv4)\n * - dest: destination IPv4 address\n * Returns the destination netif or NULL if no destination netif is found. In\n * that case, ip_route() continues as normal.\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_IP4_ROUTE()\n#endif\n\n/**\n * LWIP_HOOK_IP4_ROUTE_SRC(dest, src):\n * - source-based routing for IPv4 (see LWIP_HOOK_IP4_ROUTE(), src may be NULL)\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_IP4_ROUTE_SRC(dest, src)\n#endif\n\n/**\n * LWIP_HOOK_ETHARP_GET_GW(netif, dest):\n * - called from etharp_output() (IPv4)\n * - netif: the netif used for sending\n * - dest: the destination IPv4 address\n * Returns the IPv4 address of the gateway to handle the specified destination\n * IPv4 address. If NULL is returned, the netif's default gateway is used.\n * The returned address MUST be directly reachable on the specified netif!\n * This function is meant to implement advanced IPv4 routing together with\n * LWIP_HOOK_IP4_ROUTE(). The actual routing/gateway table implementation is\n * not part of lwIP but can e.g. be hidden in the netif's state argument.\n*/\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_ETHARP_GET_GW(netif, dest)\n#endif\n\n/**\n * LWIP_HOOK_IP6_INPUT(pbuf, input_netif):\n * - called from ip6_input() (IPv6)\n * - pbuf: received struct pbuf passed to ip6_input()\n * - input_netif: struct netif on which the packet has been received\n * Return values:\n * - 0: Hook has not consumed the packet, packet is processed as normal\n * - != 0: Hook has consumed the packet.\n * If the hook consumed the packet, 'pbuf' is in the responsibility of the hook\n * (i.e. free it when done).\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_IP6_INPUT(pbuf, input_netif)\n#endif\n\n/**\n * LWIP_HOOK_IP6_ROUTE(src, dest):\n * - called from ip6_route() (IPv6)\n * - src: sourc IPv6 address\n * - dest: destination IPv6 address\n * Returns the destination netif or NULL if no destination netif is found. In\n * that case, ip6_route() continues as normal.\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_IP6_ROUTE(src, dest)\n#endif\n\n/**\n * LWIP_HOOK_ND6_GET_GW(netif, dest):\n * - called from nd6_get_next_hop_entry() (IPv6)\n * - netif: the netif used for sending\n * - dest: the destination IPv6 address\n * Returns the IPv6 address of the next hop to handle the specified destination\n * IPv6 address. If NULL is returned, a NDP-discovered router is used instead.\n * The returned address MUST be directly reachable on the specified netif!\n * This function is meant to implement advanced IPv6 routing together with\n * LWIP_HOOK_IP6_ROUTE(). The actual routing/gateway table implementation is\n * not part of lwIP but can e.g. be hidden in the netif's state argument.\n*/\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_ND6_GET_GW(netif, dest)\n#endif\n\n/**\n * LWIP_HOOK_VLAN_CHECK(netif, eth_hdr, vlan_hdr):\n * - called from ethernet_input() if VLAN support is enabled\n * - netif: struct netif on which the packet has been received\n * - eth_hdr: struct eth_hdr of the packet\n * - vlan_hdr: struct eth_vlan_hdr of the packet\n * Return values:\n * - 0: Packet must be dropped.\n * - != 0: Packet must be accepted.\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_VLAN_CHECK(netif, eth_hdr, vlan_hdr)\n#endif\n\n/**\n * LWIP_HOOK_VLAN_SET:\n * Hook can be used to set prio_vid field of vlan_hdr. If you need to store data\n * on per-netif basis to implement this callback, see @ref netif_cd.\n * Called from ethernet_output() if VLAN support (@ref ETHARP_SUPPORT_VLAN) is enabled.\\n\n * Signature: s32_t my_hook_vlan_set(struct netif* netif, struct pbuf* pbuf, const struct eth_addr* src, const struct eth_addr* dst, u16_t eth_type);\\n\n * Arguments:\n * - netif: struct netif that the packet will be sent through\n * - p: struct pbuf packet to be sent\n * - src: source eth address\n * - dst: destination eth address\n * - eth_type: ethernet type to packet to be sent\\n\n * \n * \n * Return values:\n * - &lt;0: Packet shall not contain VLAN header.\n * - 0 &lt;= return value &lt;= 0xFFFF: Packet shall contain VLAN header. Return value is prio_vid in host byte order.\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_VLAN_SET(netif, p, src, dst, eth_type)\n#endif\n\n/**\n * LWIP_HOOK_MEMP_AVAILABLE(memp_t_type):\n * - called from memp_free() when a memp pool was empty and an item is now available\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_MEMP_AVAILABLE(memp_t_type)\n#endif\n\n/**\n * LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif):\n * Called from ethernet_input() when an unknown eth type is encountered.\n * Return ERR_OK if packet is accepted, any error code otherwise.\n * Payload points to ethernet header!\n */\n#ifdef __DOXYGEN__\n#define LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(pbuf, netif)\n#endif\n/**\n * @}\n */\n\n/*\n   ---------------------------------------\n   ---------- Debugging options ----------\n   ---------------------------------------\n*/\n/**\n * @defgroup lwip_opts_debugmsg Debug messages\n * @ingroup lwip_opts_debug\n * @{\n */\n/**\n * LWIP_DBG_MIN_LEVEL: After masking, the value of the debug is\n * compared against this value. If it is smaller, then debugging\n * messages are written.\n * @see debugging_levels\n */\n#if !defined LWIP_DBG_MIN_LEVEL || defined __DOXYGEN__\n#define LWIP_DBG_MIN_LEVEL              LWIP_DBG_LEVEL_ALL\n#endif\n\n/**\n * LWIP_DBG_TYPES_ON: A mask that can be used to globally enable/disable\n * debug messages of certain types.\n * @see debugging_levels\n */\n#if !defined LWIP_DBG_TYPES_ON || defined __DOXYGEN__\n#define LWIP_DBG_TYPES_ON               LWIP_DBG_ON\n#endif\n\n/**\n * ETHARP_DEBUG: Enable debugging in etharp.c.\n */\n#if !defined ETHARP_DEBUG || defined __DOXYGEN__\n#define ETHARP_DEBUG                    LWIP_DBG_OFF\n#endif\n\n/**\n * NETIF_DEBUG: Enable debugging in netif.c.\n */\n#if !defined NETIF_DEBUG || defined __DOXYGEN__\n#define NETIF_DEBUG                     LWIP_DBG_OFF\n#endif\n\n/**\n * PBUF_DEBUG: Enable debugging in pbuf.c.\n */\n#if !defined PBUF_DEBUG || defined __DOXYGEN__\n#define PBUF_DEBUG                      LWIP_DBG_OFF\n#endif\n\n/**\n * API_LIB_DEBUG: Enable debugging in api_lib.c.\n */\n#if !defined API_LIB_DEBUG || defined __DOXYGEN__\n#define API_LIB_DEBUG                   LWIP_DBG_OFF\n#endif\n\n/**\n * API_MSG_DEBUG: Enable debugging in api_msg.c.\n */\n#if !defined API_MSG_DEBUG || defined __DOXYGEN__\n#define API_MSG_DEBUG                   LWIP_DBG_OFF\n#endif\n\n/**\n * SOCKETS_DEBUG: Enable debugging in sockets.c.\n */\n#if !defined SOCKETS_DEBUG || defined __DOXYGEN__\n#define SOCKETS_DEBUG                   LWIP_DBG_OFF\n#endif\n\n/**\n * ICMP_DEBUG: Enable debugging in icmp.c.\n */\n#if !defined ICMP_DEBUG || defined __DOXYGEN__\n#define ICMP_DEBUG                      LWIP_DBG_OFF\n#endif\n\n/**\n * IGMP_DEBUG: Enable debugging in igmp.c.\n */\n#if !defined IGMP_DEBUG || defined __DOXYGEN__\n#define IGMP_DEBUG                      LWIP_DBG_OFF\n#endif\n\n/**\n * INET_DEBUG: Enable debugging in inet.c.\n */\n#if !defined INET_DEBUG || defined __DOXYGEN__\n#define INET_DEBUG                      LWIP_DBG_OFF\n#endif\n\n/**\n * IP_DEBUG: Enable debugging for IP.\n */\n#if !defined IP_DEBUG || defined __DOXYGEN__\n#define IP_DEBUG                        LWIP_DBG_OFF\n#endif\n\n/**\n * IP_REASS_DEBUG: Enable debugging in ip_frag.c for both frag & reass.\n */\n#if !defined IP_REASS_DEBUG || defined __DOXYGEN__\n#define IP_REASS_DEBUG                  LWIP_DBG_OFF\n#endif\n\n/**\n * RAW_DEBUG: Enable debugging in raw.c.\n */\n#if !defined RAW_DEBUG || defined __DOXYGEN__\n#define RAW_DEBUG                       LWIP_DBG_OFF\n#endif\n\n/**\n * MEM_DEBUG: Enable debugging in mem.c.\n */\n#if !defined MEM_DEBUG || defined __DOXYGEN__\n#define MEM_DEBUG                       LWIP_DBG_OFF\n#endif\n\n/**\n * MEMP_DEBUG: Enable debugging in memp.c.\n */\n#if !defined MEMP_DEBUG || defined __DOXYGEN__\n#define MEMP_DEBUG                      LWIP_DBG_OFF\n#endif\n\n/**\n * SYS_DEBUG: Enable debugging in sys.c.\n */\n#if !defined SYS_DEBUG || defined __DOXYGEN__\n#define SYS_DEBUG                       LWIP_DBG_OFF\n#endif\n\n/**\n * TIMERS_DEBUG: Enable debugging in timers.c.\n */\n#if !defined TIMERS_DEBUG || defined __DOXYGEN__\n#define TIMERS_DEBUG                    LWIP_DBG_OFF\n#endif\n\n/**\n * TCP_DEBUG: Enable debugging for TCP.\n */\n#if !defined TCP_DEBUG || defined __DOXYGEN__\n#define TCP_DEBUG                       LWIP_DBG_OFF\n#endif\n\n/**\n * TCP_INPUT_DEBUG: Enable debugging in tcp_in.c for incoming debug.\n */\n#if !defined TCP_INPUT_DEBUG || defined __DOXYGEN__\n#define TCP_INPUT_DEBUG                 LWIP_DBG_OFF\n#endif\n\n/**\n * TCP_FR_DEBUG: Enable debugging in tcp_in.c for fast retransmit.\n */\n#if !defined TCP_FR_DEBUG || defined __DOXYGEN__\n#define TCP_FR_DEBUG                    LWIP_DBG_OFF\n#endif\n\n/**\n * TCP_RTO_DEBUG: Enable debugging in TCP for retransmit\n * timeout.\n */\n#if !defined TCP_RTO_DEBUG || defined __DOXYGEN__\n#define TCP_RTO_DEBUG                   LWIP_DBG_OFF\n#endif\n\n/**\n * TCP_CWND_DEBUG: Enable debugging for TCP congestion window.\n */\n#if !defined TCP_CWND_DEBUG || defined __DOXYGEN__\n#define TCP_CWND_DEBUG                  LWIP_DBG_OFF\n#endif\n\n/**\n * TCP_WND_DEBUG: Enable debugging in tcp_in.c for window updating.\n */\n#if !defined TCP_WND_DEBUG || defined __DOXYGEN__\n#define TCP_WND_DEBUG                   LWIP_DBG_OFF\n#endif\n\n/**\n * TCP_OUTPUT_DEBUG: Enable debugging in tcp_out.c output functions.\n */\n#if !defined TCP_OUTPUT_DEBUG || defined __DOXYGEN__\n#define TCP_OUTPUT_DEBUG                LWIP_DBG_OFF\n#endif\n\n/**\n * TCP_RST_DEBUG: Enable debugging for TCP with the RST message.\n */\n#if !defined TCP_RST_DEBUG || defined __DOXYGEN__\n#define TCP_RST_DEBUG                   LWIP_DBG_OFF\n#endif\n\n/**\n * TCP_QLEN_DEBUG: Enable debugging for TCP queue lengths.\n */\n#if !defined TCP_QLEN_DEBUG || defined __DOXYGEN__\n#define TCP_QLEN_DEBUG                  LWIP_DBG_OFF\n#endif\n\n/**\n * UDP_DEBUG: Enable debugging in UDP.\n */\n#if !defined UDP_DEBUG || defined __DOXYGEN__\n#define UDP_DEBUG                       LWIP_DBG_OFF\n#endif\n\n/**\n * TCPIP_DEBUG: Enable debugging in tcpip.c.\n */\n#if !defined TCPIP_DEBUG || defined __DOXYGEN__\n#define TCPIP_DEBUG                     LWIP_DBG_OFF\n#endif\n\n/**\n * SLIP_DEBUG: Enable debugging in slipif.c.\n */\n#if !defined SLIP_DEBUG || defined __DOXYGEN__\n#define SLIP_DEBUG                      LWIP_DBG_OFF\n#endif\n\n/**\n * DHCP_DEBUG: Enable debugging in dhcp.c.\n */\n#if !defined DHCP_DEBUG || defined __DOXYGEN__\n#define DHCP_DEBUG                      LWIP_DBG_OFF\n#endif\n\n/**\n * AUTOIP_DEBUG: Enable debugging in autoip.c.\n */\n#if !defined AUTOIP_DEBUG || defined __DOXYGEN__\n#define AUTOIP_DEBUG                    LWIP_DBG_OFF\n#endif\n\n/**\n * DNS_DEBUG: Enable debugging for DNS.\n */\n#if !defined DNS_DEBUG || defined __DOXYGEN__\n#define DNS_DEBUG                       LWIP_DBG_OFF\n#endif\n\n/**\n * IP6_DEBUG: Enable debugging for IPv6.\n */\n#if !defined IP6_DEBUG || defined __DOXYGEN__\n#define IP6_DEBUG                       LWIP_DBG_OFF\n#endif\n/**\n * @}\n */\n\n/*\n   --------------------------------------------------\n   ---------- Performance tracking options ----------\n   --------------------------------------------------\n*/\n/**\n * @defgroup lwip_opts_perf Performance\n * @ingroup lwip_opts_debug\n * @{\n */\n/**\n * LWIP_PERF: Enable performance testing for lwIP\n * (if enabled, arch/perf.h is included)\n */\n#if !defined LWIP_PERF || defined __DOXYGEN__\n#define LWIP_PERF                       0\n#endif\n/**\n * @}\n */\n\n#endif /* LWIP_HDR_OPT_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/pbuf.h",
    "content": "/**\n * @file\n * pbuf API\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#ifndef LWIP_HDR_PBUF_H\n#define LWIP_HDR_PBUF_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/err.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** LWIP_SUPPORT_CUSTOM_PBUF==1: Custom pbufs behave much like their pbuf type\n * but they are allocated by external code (initialised by calling\n * pbuf_alloced_custom()) and when pbuf_free gives up their last reference, they\n * are freed by calling pbuf_custom->custom_free_function().\n * Currently, the pbuf_custom code is only needed for one specific configuration\n * of IP_FRAG, unless required by external driver/application code. */\n#ifndef LWIP_SUPPORT_CUSTOM_PBUF\n#define LWIP_SUPPORT_CUSTOM_PBUF ((IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG))\n#endif\n\n/* @todo: We need a mechanism to prevent wasting memory in every pbuf\n   (TCP vs. UDP, IPv4 vs. IPv6: UDP/IPv4 packets may waste up to 28 bytes) */\n\n#define PBUF_TRANSPORT_HLEN 20\n#if LWIP_IPV6\n#define PBUF_IP_HLEN        40\n#else\n#define PBUF_IP_HLEN        20\n#endif\n\n/**\n * @ingroup pbuf\n * Enumeration of pbuf layers\n */\ntypedef enum {\n  /** Includes spare room for transport layer header, e.g. UDP header.\n   * Use this if you intend to pass the pbuf to functions like udp_send().\n   */\n  PBUF_TRANSPORT,\n  /** Includes spare room for IP header.\n   * Use this if you intend to pass the pbuf to functions like raw_send().\n   */\n  PBUF_IP,\n  /** Includes spare room for link layer header (ethernet header).\n   * Use this if you intend to pass the pbuf to functions like ethernet_output().\n   * @see PBUF_LINK_HLEN\n   */\n  PBUF_LINK,\n  /** Includes spare room for additional encapsulation header before ethernet\n   * headers (e.g. 802.11).\n   * Use this if you intend to pass the pbuf to functions like netif->linkoutput().\n   * @see PBUF_LINK_ENCAPSULATION_HLEN\n   */\n  PBUF_RAW_TX,\n  /** Use this for input packets in a netif driver when calling netif->input()\n   * in the most common case - ethernet-layer netif driver. */\n  PBUF_RAW\n} pbuf_layer;\n\n/**\n * @ingroup pbuf\n * Enumeration of pbuf types\n */\ntypedef enum {\n  /** pbuf data is stored in RAM, used for TX mostly, struct pbuf and its payload\n      are allocated in one piece of contiguous memory (so the first payload byte\n      can be calculated from struct pbuf).\n      pbuf_alloc() allocates PBUF_RAM pbufs as unchained pbufs (although that might\n      change in future versions).\n      This should be used for all OUTGOING packets (TX).*/\n  PBUF_RAM,\n  /** pbuf data is stored in ROM, i.e. struct pbuf and its payload are located in\n      totally different memory areas. Since it points to ROM, payload does not\n      have to be copied when queued for transmission. */\n  PBUF_ROM,\n  /** pbuf comes from the pbuf pool. Much like PBUF_ROM but payload might change\n      so it has to be duplicated when queued before transmitting, depending on\n      who has a 'ref' to it. */\n  PBUF_REF,\n  /** pbuf payload refers to RAM. This one comes from a pool and should be used\n      for RX. Payload can be chained (scatter-gather RX) but like PBUF_RAM, struct\n      pbuf and its payload are allocated in one piece of contiguous memory (so\n      the first payload byte can be calculated from struct pbuf).\n      Don't use this for TX, if the pool becomes empty e.g. because of TCP queuing,\n      you are unable to receive TCP acks! */\n  PBUF_POOL\n} pbuf_type;\n\n\n/** indicates this packet's data should be immediately passed to the application */\n#define PBUF_FLAG_PUSH      0x01U\n/** indicates this is a custom pbuf: pbuf_free calls pbuf_custom->custom_free_function()\n    when the last reference is released (plus custom PBUF_RAM cannot be trimmed) */\n#define PBUF_FLAG_IS_CUSTOM 0x02U\n/** indicates this pbuf is UDP multicast to be looped back */\n#define PBUF_FLAG_MCASTLOOP 0x04U\n/** indicates this pbuf was received as link-level broadcast */\n#define PBUF_FLAG_LLBCAST   0x08U\n/** indicates this pbuf was received as link-level multicast */\n#define PBUF_FLAG_LLMCAST   0x10U\n/** indicates this pbuf includes a TCP FIN flag */\n#define PBUF_FLAG_TCP_FIN   0x20U\n\n/** Main packet buffer struct */\nstruct pbuf {\n  /** next pbuf in singly linked pbuf chain */\n  struct pbuf *next;\n\n  /** pointer to the actual data in the buffer */\n  void *payload;\n\n  /**\n   * total length of this buffer and all next buffers in chain\n   * belonging to the same packet.\n   *\n   * For non-queue packet chains this is the invariant:\n   * p->tot_len == p->len + (p->next? p->next->tot_len: 0)\n   */\n  u16_t tot_len;\n\n  /** length of this buffer */\n  u16_t len;\n\n  /** pbuf_type as u8_t instead of enum to save space */\n  u8_t /*pbuf_type*/ type;\n\n  /** misc flags */\n  u8_t flags;\n\n  /**\n   * the reference count always equals the number of pointers\n   * that refer to this pbuf. This can be pointers from an application,\n   * the stack itself, or pbuf->next pointers from a chain.\n   */\n  u16_t ref;\n};\n\n\n/** Helper struct for const-correctness only.\n * The only meaning of this one is to provide a const payload pointer\n * for PBUF_ROM type.\n */\nstruct pbuf_rom {\n  /** next pbuf in singly linked pbuf chain */\n  struct pbuf *next;\n\n  /** pointer to the actual data in the buffer */\n  const void *payload;\n};\n\n#if LWIP_SUPPORT_CUSTOM_PBUF\n/** Prototype for a function to free a custom pbuf */\ntypedef void (*pbuf_free_custom_fn)(struct pbuf *p);\n\n/** A custom pbuf: like a pbuf, but following a function pointer to free it. */\nstruct pbuf_custom {\n  /** The actual pbuf */\n  struct pbuf pbuf;\n  /** This function is called when pbuf_free deallocates this pbuf(_custom) */\n  pbuf_free_custom_fn custom_free_function;\n};\n#endif /* LWIP_SUPPORT_CUSTOM_PBUF */\n\n/** Define this to 0 to prevent freeing ooseq pbufs when the PBUF_POOL is empty */\n#ifndef PBUF_POOL_FREE_OOSEQ\n#define PBUF_POOL_FREE_OOSEQ 1\n#endif /* PBUF_POOL_FREE_OOSEQ */\n#if LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ\nextern volatile u8_t pbuf_free_ooseq_pending;\nvoid pbuf_free_ooseq(void);\n/** When not using sys_check_timeouts(), call PBUF_CHECK_FREE_OOSEQ()\n    at regular intervals from main level to check if ooseq pbufs need to be\n    freed! */\n#define PBUF_CHECK_FREE_OOSEQ() do { if(pbuf_free_ooseq_pending) { \\\n  /* pbuf_alloc() reported PBUF_POOL to be empty -> try to free some \\\n     ooseq queued pbufs now */ \\\n  pbuf_free_ooseq(); }}while(0)\n#else /* LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ */\n  /* Otherwise declare an empty PBUF_CHECK_FREE_OOSEQ */\n  #define PBUF_CHECK_FREE_OOSEQ()\n#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && NO_SYS && PBUF_POOL_FREE_OOSEQ*/\n\n/* Initializes the pbuf module. This call is empty for now, but may not be in future. */\n#define pbuf_init()\n\nstruct pbuf *pbuf_alloc(pbuf_layer l, u16_t length, pbuf_type type);\n#if LWIP_SUPPORT_CUSTOM_PBUF\nstruct pbuf *pbuf_alloced_custom(pbuf_layer l, u16_t length, pbuf_type type,\n                                 struct pbuf_custom *p, void *payload_mem,\n                                 u16_t payload_mem_len);\n#endif /* LWIP_SUPPORT_CUSTOM_PBUF */\nvoid pbuf_realloc(struct pbuf *p, u16_t size);\nu8_t pbuf_header(struct pbuf *p, s16_t header_size);\nu8_t pbuf_header_force(struct pbuf *p, s16_t header_size);\nvoid pbuf_ref(struct pbuf *p);\nu8_t pbuf_free(struct pbuf *p);\nu16_t pbuf_clen(const struct pbuf *p);\nvoid pbuf_cat(struct pbuf *head, struct pbuf *tail);\nvoid pbuf_chain(struct pbuf *head, struct pbuf *tail);\nstruct pbuf *pbuf_dechain(struct pbuf *p);\nerr_t pbuf_copy(struct pbuf *p_to, const struct pbuf *p_from);\nu16_t pbuf_copy_partial(const struct pbuf *p, void *dataptr, u16_t len, u16_t offset);\nerr_t pbuf_take(struct pbuf *buf, const void *dataptr, u16_t len);\nerr_t pbuf_take_at(struct pbuf *buf, const void *dataptr, u16_t len, u16_t offset);\nstruct pbuf *pbuf_skip(struct pbuf* in, u16_t in_offset, u16_t* out_offset);\nstruct pbuf *pbuf_coalesce(struct pbuf *p, pbuf_layer layer);\n#if LWIP_CHECKSUM_ON_COPY\nerr_t pbuf_fill_chksum(struct pbuf *p, u16_t start_offset, const void *dataptr,\n                       u16_t len, u16_t *chksum);\n#endif /* LWIP_CHECKSUM_ON_COPY */\n#if LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE\nvoid pbuf_split_64k(struct pbuf *p, struct pbuf **rest);\n#endif /* LWIP_TCP && TCP_QUEUE_OOSEQ && LWIP_WND_SCALE */\n\nu8_t pbuf_get_at(const struct pbuf* p, u16_t offset);\nint pbuf_try_get_at(const struct pbuf* p, u16_t offset);\nvoid pbuf_put_at(struct pbuf* p, u16_t offset, u8_t data);\nu16_t pbuf_memcmp(const struct pbuf* p, u16_t offset, const void* s2, u16_t n);\nu16_t pbuf_memfind(const struct pbuf* p, const void* mem, u16_t mem_len, u16_t start_offset);\nu16_t pbuf_strstr(const struct pbuf* p, const char* substr);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PBUF_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/priv/api_msg.h",
    "content": "/**\n * @file\n * netconn API lwIP internal implementations (do not use in application code)\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_API_MSG_H\n#define LWIP_HDR_API_MSG_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_NETCONN || LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */\n/* Note: Netconn API is always available when sockets are enabled -\n * sockets are implemented on top of them */\n\n#include \"lwip/arch.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/err.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/igmp.h\"\n#include \"lwip/api.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_MPU_COMPATIBLE\n#if LWIP_NETCONN_SEM_PER_THREAD\n#define API_MSG_M_DEF_SEM(m)  *m\n#else\n#define API_MSG_M_DEF_SEM(m)  API_MSG_M_DEF(m)\n#endif\n#else /* LWIP_MPU_COMPATIBLE */\n#define API_MSG_M_DEF_SEM(m)  API_MSG_M_DEF(m)\n#endif /* LWIP_MPU_COMPATIBLE */\n\n/* For the netconn API, these values are use as a bitmask! */\n#define NETCONN_SHUT_RD   1\n#define NETCONN_SHUT_WR   2\n#define NETCONN_SHUT_RDWR (NETCONN_SHUT_RD | NETCONN_SHUT_WR)\n\n/* IP addresses and port numbers are expected to be in\n * the same byte order as in the corresponding pcb.\n */\n/** This struct includes everything that is necessary to execute a function\n    for a netconn in another thread context (mainly used to process netconns\n    in the tcpip_thread context to be thread safe). */\nstruct api_msg {\n  /** The netconn which to process - always needed: it includes the semaphore\n      which is used to block the application thread until the function finished. */\n  struct netconn *conn;\n  /** The return value of the function executed in tcpip_thread. */\n  err_t err;\n  /** Depending on the executed function, one of these union members is used */\n  union {\n    /** used for lwip_netconn_do_send */\n    struct netbuf *b;\n    /** used for lwip_netconn_do_newconn */\n    struct {\n      u8_t proto;\n    } n;\n    /** used for lwip_netconn_do_bind and lwip_netconn_do_connect */\n    struct {\n      API_MSG_M_DEF_C(ip_addr_t, ipaddr);\n      u16_t port;\n    } bc;\n    /** used for lwip_netconn_do_getaddr */\n    struct {\n      ip_addr_t API_MSG_M_DEF(ipaddr);\n      u16_t API_MSG_M_DEF(port);\n      u8_t local;\n    } ad;\n    /** used for lwip_netconn_do_write */\n    struct {\n      const void *dataptr;\n      size_t len;\n      u8_t apiflags;\n#if LWIP_SO_SNDTIMEO\n      u32_t time_started;\n#endif /* LWIP_SO_SNDTIMEO */\n    } w;\n    /** used for lwip_netconn_do_recv */\n    struct {\n      u32_t len;\n    } r;\n#if LWIP_TCP\n    /** used for lwip_netconn_do_close (/shutdown) */\n    struct {\n      u8_t shut;\n#if LWIP_SO_SNDTIMEO || LWIP_SO_LINGER\n      u32_t time_started;\n#else /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */\n      u8_t polls_left;\n#endif /* LWIP_SO_SNDTIMEO || LWIP_SO_LINGER */\n    } sd;\n#endif /* LWIP_TCP */\n#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)\n    /** used for lwip_netconn_do_join_leave_group */\n    struct {\n      API_MSG_M_DEF_C(ip_addr_t, multiaddr);\n      API_MSG_M_DEF_C(ip_addr_t, netif_addr);\n      enum netconn_igmp join_or_leave;\n    } jl;\n#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */\n#if TCP_LISTEN_BACKLOG\n    struct {\n      u8_t backlog;\n    } lb;\n#endif /* TCP_LISTEN_BACKLOG */\n  } msg;\n#if LWIP_NETCONN_SEM_PER_THREAD\n  sys_sem_t* op_completed_sem;\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n};\n\n#if LWIP_NETCONN_SEM_PER_THREAD\n#define LWIP_API_MSG_SEM(msg)          ((msg)->op_completed_sem)\n#else /* LWIP_NETCONN_SEM_PER_THREAD */\n#define LWIP_API_MSG_SEM(msg)          (&(msg)->conn->op_completed)\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n\n\n#if LWIP_DNS\n/** As lwip_netconn_do_gethostbyname requires more arguments but doesn't require a netconn,\n    it has its own struct (to avoid struct api_msg getting bigger than necessary).\n    lwip_netconn_do_gethostbyname must be called using tcpip_callback instead of tcpip_apimsg\n    (see netconn_gethostbyname). */\nstruct dns_api_msg {\n  /** Hostname to query or dotted IP address string */\n#if LWIP_MPU_COMPATIBLE\n  char name[DNS_MAX_NAME_LENGTH];\n#else /* LWIP_MPU_COMPATIBLE */\n  const char *name;\n#endif /* LWIP_MPU_COMPATIBLE */\n  /** The resolved address is stored here */\n  ip_addr_t API_MSG_M_DEF(addr);\n#if LWIP_IPV4 && LWIP_IPV6\n  /** Type of resolve call */\n  u8_t dns_addrtype;\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n  /** This semaphore is posted when the name is resolved, the application thread\n      should wait on it. */\n  sys_sem_t API_MSG_M_DEF_SEM(sem);\n  /** Errors are given back here */\n  err_t API_MSG_M_DEF(err);\n};\n#endif /* LWIP_DNS */\n\n#if LWIP_TCP\nextern u8_t netconn_aborted;\n#endif /* LWIP_TCP */\n\nvoid lwip_netconn_do_newconn         (void *m);\nvoid lwip_netconn_do_delconn         (void *m);\nvoid lwip_netconn_do_bind            (void *m);\nvoid lwip_netconn_do_connect         (void *m);\nvoid lwip_netconn_do_disconnect      (void *m);\nvoid lwip_netconn_do_listen          (void *m);\nvoid lwip_netconn_do_send            (void *m);\nvoid lwip_netconn_do_recv            (void *m);\n#if TCP_LISTEN_BACKLOG\nvoid lwip_netconn_do_accepted        (void *m);\n#endif /* TCP_LISTEN_BACKLOG */\nvoid lwip_netconn_do_write           (void *m);\nvoid lwip_netconn_do_getaddr         (void *m);\nvoid lwip_netconn_do_close           (void *m);\nvoid lwip_netconn_do_shutdown        (void *m);\n#if LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD)\nvoid lwip_netconn_do_join_leave_group(void *m);\n#endif /* LWIP_IGMP || (LWIP_IPV6 && LWIP_IPV6_MLD) */\n\n#if LWIP_DNS\nvoid lwip_netconn_do_gethostbyname(void *arg);\n#endif /* LWIP_DNS */\n\nstruct netconn* netconn_alloc(enum netconn_type t, netconn_callback callback);\nvoid netconn_free(struct netconn *conn);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_NETCONN || LWIP_SOCKET */\n\n#endif /* LWIP_HDR_API_MSG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/priv/memp_priv.h",
    "content": "/**\n * @file\n * memory pools lwIP internal implementations (do not use in application code)\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#ifndef LWIP_HDR_MEMP_PRIV_H\n#define LWIP_HDR_MEMP_PRIV_H\n\n#include \"lwip/opt.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"lwip/mem.h\"\n\n#if MEMP_OVERFLOW_CHECK\n/* if MEMP_OVERFLOW_CHECK is turned on, we reserve some bytes at the beginning\n * and at the end of each element, initialize them as 0xcd and check\n * them later. */\n/* If MEMP_OVERFLOW_CHECK is >= 2, on every call to memp_malloc or memp_free,\n * every single element in each pool is checked!\n * This is VERY SLOW but also very helpful. */\n/* MEMP_SANITY_REGION_BEFORE and MEMP_SANITY_REGION_AFTER can be overridden in\n * lwipopts.h to change the amount reserved for checking. */\n#ifndef MEMP_SANITY_REGION_BEFORE\n#define MEMP_SANITY_REGION_BEFORE  16\n#endif /* MEMP_SANITY_REGION_BEFORE*/\n#if MEMP_SANITY_REGION_BEFORE > 0\n#define MEMP_SANITY_REGION_BEFORE_ALIGNED    LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_BEFORE)\n#else\n#define MEMP_SANITY_REGION_BEFORE_ALIGNED    0\n#endif /* MEMP_SANITY_REGION_BEFORE*/\n#ifndef MEMP_SANITY_REGION_AFTER\n#define MEMP_SANITY_REGION_AFTER   16\n#endif /* MEMP_SANITY_REGION_AFTER*/\n#if MEMP_SANITY_REGION_AFTER > 0\n#define MEMP_SANITY_REGION_AFTER_ALIGNED     LWIP_MEM_ALIGN_SIZE(MEMP_SANITY_REGION_AFTER)\n#else\n#define MEMP_SANITY_REGION_AFTER_ALIGNED     0\n#endif /* MEMP_SANITY_REGION_AFTER*/\n\n/* MEMP_SIZE: save space for struct memp and for sanity check */\n#define MEMP_SIZE          (LWIP_MEM_ALIGN_SIZE(sizeof(struct memp)) + MEMP_SANITY_REGION_BEFORE_ALIGNED)\n#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x) + MEMP_SANITY_REGION_AFTER_ALIGNED)\n\n#else /* MEMP_OVERFLOW_CHECK */\n\n/* No sanity checks\n * We don't need to preserve the struct memp while not allocated, so we\n * can save a little space and set MEMP_SIZE to 0.\n */\n#define MEMP_SIZE           0\n#define MEMP_ALIGN_SIZE(x) (LWIP_MEM_ALIGN_SIZE(x))\n\n#endif /* MEMP_OVERFLOW_CHECK */\n\n#if !MEMP_MEM_MALLOC || MEMP_OVERFLOW_CHECK\nstruct memp {\n  struct memp *next;\n#if MEMP_OVERFLOW_CHECK\n  const char *file;\n  int line;\n#endif /* MEMP_OVERFLOW_CHECK */\n};\n#endif /* !MEMP_MEM_MALLOC || MEMP_OVERFLOW_CHECK */\n\n#if MEM_USE_POOLS && MEMP_USE_CUSTOM_POOLS\n/* Use a helper type to get the start and end of the user \"memory pools\" for mem_malloc */\ntypedef enum {\n    /* Get the first (via:\n       MEMP_POOL_HELPER_START = ((u8_t) 1*MEMP_POOL_A + 0*MEMP_POOL_B + 0*MEMP_POOL_C + 0)*/\n    MEMP_POOL_HELPER_FIRST = ((u8_t)\n#define LWIP_MEMPOOL(name,num,size,desc)\n#define LWIP_MALLOC_MEMPOOL_START 1\n#define LWIP_MALLOC_MEMPOOL(num, size) * MEMP_POOL_##size + 0\n#define LWIP_MALLOC_MEMPOOL_END\n#include \"lwip/priv/memp_std.h\"\n    ) ,\n    /* Get the last (via:\n       MEMP_POOL_HELPER_END = ((u8_t) 0 + MEMP_POOL_A*0 + MEMP_POOL_B*0 + MEMP_POOL_C*1) */\n    MEMP_POOL_HELPER_LAST = ((u8_t)\n#define LWIP_MEMPOOL(name,num,size,desc)\n#define LWIP_MALLOC_MEMPOOL_START\n#define LWIP_MALLOC_MEMPOOL(num, size) 0 + MEMP_POOL_##size *\n#define LWIP_MALLOC_MEMPOOL_END 1\n#include \"lwip/priv/memp_std.h\"\n    )\n} memp_pool_helper_t;\n\n/* The actual start and stop values are here (cast them over)\n   We use this helper type and these defines so we can avoid using const memp_t values */\n#define MEMP_POOL_FIRST ((memp_t) MEMP_POOL_HELPER_FIRST)\n#define MEMP_POOL_LAST   ((memp_t) MEMP_POOL_HELPER_LAST)\n#endif /* MEM_USE_POOLS && MEMP_USE_CUSTOM_POOLS */\n\n/** Memory pool descriptor */\nstruct memp_desc {\n#if defined(LWIP_DEBUG) || MEMP_OVERFLOW_CHECK || LWIP_STATS_DISPLAY\n  /** Textual description */\n  const char *desc;\n#endif /* LWIP_DEBUG || MEMP_OVERFLOW_CHECK || LWIP_STATS_DISPLAY */\n#if MEMP_STATS\n  /** Statistics */\n  struct stats_mem *stats;\n#endif\n\n  /** Element size */\n  u16_t size;\n\n#if !MEMP_MEM_MALLOC\n  /** Number of elements */\n  u16_t num;\n\n  /** Base address */\n  u8_t *base;\n\n  /** First free element of each pool. Elements form a linked list. */\n  struct memp **tab;\n#endif /* MEMP_MEM_MALLOC */\n};\n\n#if defined(LWIP_DEBUG) || MEMP_OVERFLOW_CHECK || LWIP_STATS_DISPLAY\n#define DECLARE_LWIP_MEMPOOL_DESC(desc) (desc),\n#else\n#define DECLARE_LWIP_MEMPOOL_DESC(desc)\n#endif\n\n#if MEMP_STATS\n#define LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(name) static struct stats_mem name;\n#define LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(name) &name,\n#else\n#define LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(name)\n#define LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(name)\n#endif\n\nvoid memp_init_pool(const struct memp_desc *desc);\n\n#if MEMP_OVERFLOW_CHECK\nvoid *memp_malloc_pool_fn(const struct memp_desc* desc, const char* file, const int line);\n#define memp_malloc_pool(d) memp_malloc_pool_fn((d), __FILE__, __LINE__)\n#else\nvoid *memp_malloc_pool(const struct memp_desc *desc);\n#endif\nvoid  memp_free_pool(const struct memp_desc* desc, void *mem);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_MEMP_PRIV_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/priv/memp_std.h",
    "content": "/**\n * @file\n * lwIP internal memory pools (do not use in application code)\n * This file is deliberately included multiple times: once with empty\n * definition of LWIP_MEMPOOL() to handle all includes and multiple times\n * to build up various lists of mem pools.\n */\n\n/*\n * SETUP: Make sure we define everything we will need.\n *\n * We have create three types of pools:\n *   1) MEMPOOL - standard pools\n *   2) MALLOC_MEMPOOL - to be used by mem_malloc in mem.c\n *   3) PBUF_MEMPOOL - a mempool of pbuf's, so include space for the pbuf struct\n *\n * If the include'r doesn't require any special treatment of each of the types\n * above, then will declare #2 & #3 to be just standard mempools.\n */\n#ifndef LWIP_MALLOC_MEMPOOL\n/* This treats \"malloc pools\" just like any other pool.\n   The pools are a little bigger to provide 'size' as the amount of user data. */\n#define LWIP_MALLOC_MEMPOOL(num, size) LWIP_MEMPOOL(POOL_##size, num, (size + LWIP_MEM_ALIGN_SIZE(sizeof(struct memp_malloc_helper))), \"MALLOC_\"#size)\n#define LWIP_MALLOC_MEMPOOL_START\n#define LWIP_MALLOC_MEMPOOL_END\n#endif /* LWIP_MALLOC_MEMPOOL */\n\n#ifndef LWIP_PBUF_MEMPOOL\n/* This treats \"pbuf pools\" just like any other pool.\n * Allocates buffers for a pbuf struct AND a payload size */\n#define LWIP_PBUF_MEMPOOL(name, num, payload, desc) LWIP_MEMPOOL(name, num, (MEMP_ALIGN_SIZE(sizeof(struct pbuf)) + MEMP_ALIGN_SIZE(payload)), desc)\n#endif /* LWIP_PBUF_MEMPOOL */\n\n\n/*\n * A list of internal pools used by LWIP.\n *\n * LWIP_MEMPOOL(pool_name, number_elements, element_size, pool_description)\n *     creates a pool name MEMP_pool_name. description is used in stats.c\n */\n#if LWIP_RAW\nLWIP_MEMPOOL(RAW_PCB,        MEMP_NUM_RAW_PCB,         sizeof(struct raw_pcb),        \"RAW_PCB\")\n#endif /* LWIP_RAW */\n\n#if LWIP_UDP\nLWIP_MEMPOOL(UDP_PCB,        MEMP_NUM_UDP_PCB,         sizeof(struct udp_pcb),        \"UDP_PCB\")\n#endif /* LWIP_UDP */\n\n#if LWIP_TCP\nLWIP_MEMPOOL(TCP_PCB,        MEMP_NUM_TCP_PCB,         sizeof(struct tcp_pcb),        \"TCP_PCB\")\nLWIP_MEMPOOL(TCP_PCB_LISTEN, MEMP_NUM_TCP_PCB_LISTEN,  sizeof(struct tcp_pcb_listen), \"TCP_PCB_LISTEN\")\nLWIP_MEMPOOL(TCP_SEG,        MEMP_NUM_TCP_SEG,         sizeof(struct tcp_seg),        \"TCP_SEG\")\n#endif /* LWIP_TCP */\n\n#if LWIP_IPV4 && IP_REASSEMBLY\nLWIP_MEMPOOL(REASSDATA,      MEMP_NUM_REASSDATA,       sizeof(struct ip_reassdata),   \"REASSDATA\")\n#endif /* LWIP_IPV4 && IP_REASSEMBLY */\n#if (IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF) || (LWIP_IPV6 && LWIP_IPV6_FRAG)\nLWIP_MEMPOOL(FRAG_PBUF,      MEMP_NUM_FRAG_PBUF,       sizeof(struct pbuf_custom_ref),\"FRAG_PBUF\")\n#endif /* IP_FRAG && !LWIP_NETIF_TX_SINGLE_PBUF || (LWIP_IPV6 && LWIP_IPV6_FRAG) */\n\n#if LWIP_NETCONN || LWIP_SOCKET\nLWIP_MEMPOOL(NETBUF,         MEMP_NUM_NETBUF,          sizeof(struct netbuf),         \"NETBUF\")\nLWIP_MEMPOOL(NETCONN,        MEMP_NUM_NETCONN,         sizeof(struct netconn),        \"NETCONN\")\n#endif /* LWIP_NETCONN || LWIP_SOCKET */\n\n#if NO_SYS==0\nLWIP_MEMPOOL(TCPIP_MSG_API,  MEMP_NUM_TCPIP_MSG_API,   sizeof(struct tcpip_msg),      \"TCPIP_MSG_API\")\n#if LWIP_MPU_COMPATIBLE\nLWIP_MEMPOOL(API_MSG,        MEMP_NUM_API_MSG,         sizeof(struct api_msg),        \"API_MSG\")\n#if LWIP_DNS\nLWIP_MEMPOOL(DNS_API_MSG,    MEMP_NUM_DNS_API_MSG,     sizeof(struct dns_api_msg),    \"DNS_API_MSG\")\n#endif\n#if LWIP_SOCKET && !LWIP_TCPIP_CORE_LOCKING\nLWIP_MEMPOOL(SOCKET_SETGETSOCKOPT_DATA, MEMP_NUM_SOCKET_SETGETSOCKOPT_DATA, sizeof(struct lwip_setgetsockopt_data), \"SOCKET_SETGETSOCKOPT_DATA\")\n#endif\n#if LWIP_NETIF_API\nLWIP_MEMPOOL(NETIFAPI_MSG,   MEMP_NUM_NETIFAPI_MSG,    sizeof(struct netifapi_msg),   \"NETIFAPI_MSG\")\n#endif\n#endif /* LWIP_MPU_COMPATIBLE */\n#if !LWIP_TCPIP_CORE_LOCKING_INPUT\nLWIP_MEMPOOL(TCPIP_MSG_INPKT,MEMP_NUM_TCPIP_MSG_INPKT, sizeof(struct tcpip_msg),      \"TCPIP_MSG_INPKT\")\n#endif /* !LWIP_TCPIP_CORE_LOCKING_INPUT */\n#endif /* NO_SYS==0 */\n\n#if LWIP_IPV4 && LWIP_ARP && ARP_QUEUEING\nLWIP_MEMPOOL(ARP_QUEUE,      MEMP_NUM_ARP_QUEUE,       sizeof(struct etharp_q_entry), \"ARP_QUEUE\")\n#endif /* LWIP_IPV4 && LWIP_ARP && ARP_QUEUEING */\n\n#if LWIP_IGMP\nLWIP_MEMPOOL(IGMP_GROUP,     MEMP_NUM_IGMP_GROUP,      sizeof(struct igmp_group),     \"IGMP_GROUP\")\n#endif /* LWIP_IGMP */\n\n#if LWIP_TIMERS && !LWIP_TIMERS_CUSTOM\nLWIP_MEMPOOL(SYS_TIMEOUT,    MEMP_NUM_SYS_TIMEOUT,     sizeof(struct sys_timeo),      \"SYS_TIMEOUT\")\n#endif /* LWIP_TIMERS && !LWIP_TIMERS_CUSTOM */\n\n#if LWIP_DNS && LWIP_SOCKET\nLWIP_MEMPOOL(NETDB,          MEMP_NUM_NETDB,           NETDB_ELEM_SIZE,               \"NETDB\")\n#endif /* LWIP_DNS && LWIP_SOCKET */\n#if LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC\nLWIP_MEMPOOL(LOCALHOSTLIST,  MEMP_NUM_LOCALHOSTLIST,   LOCALHOSTLIST_ELEM_SIZE,       \"LOCALHOSTLIST\")\n#endif /* LWIP_DNS && DNS_LOCAL_HOSTLIST && DNS_LOCAL_HOSTLIST_IS_DYNAMIC */\n\n#if LWIP_IPV6 && LWIP_ND6_QUEUEING\nLWIP_MEMPOOL(ND6_QUEUE,      MEMP_NUM_ND6_QUEUE,       sizeof(struct nd6_q_entry), \"ND6_QUEUE\")\n#endif /* LWIP_IPV6 && LWIP_ND6_QUEUEING */\n\n#if LWIP_IPV6 && LWIP_IPV6_REASS\nLWIP_MEMPOOL(IP6_REASSDATA,      MEMP_NUM_REASSDATA,       sizeof(struct ip6_reassdata),   \"IP6_REASSDATA\")\n#endif /* LWIP_IPV6 && LWIP_IPV6_REASS */\n\n#if LWIP_IPV6 && LWIP_IPV6_MLD\nLWIP_MEMPOOL(MLD6_GROUP,     MEMP_NUM_MLD6_GROUP,      sizeof(struct mld_group),     \"MLD6_GROUP\")\n#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */\n\n\n/*\n * A list of pools of pbuf's used by LWIP.\n *\n * LWIP_PBUF_MEMPOOL(pool_name, number_elements, pbuf_payload_size, pool_description)\n *     creates a pool name MEMP_pool_name. description is used in stats.c\n *     This allocates enough space for the pbuf struct and a payload.\n *     (Example: pbuf_payload_size=0 allocates only size for the struct)\n */\nLWIP_PBUF_MEMPOOL(PBUF,      MEMP_NUM_PBUF,            0,                             \"PBUF_REF/ROM\")\nLWIP_PBUF_MEMPOOL(PBUF_POOL, PBUF_POOL_SIZE,           PBUF_POOL_BUFSIZE,             \"PBUF_POOL\")\n\n\n/*\n * Allow for user-defined pools; this must be explicitly set in lwipopts.h\n * since the default is to NOT look for lwippools.h\n */\n#if MEMP_USE_CUSTOM_POOLS\n#include \"lwippools.h\"\n#endif /* MEMP_USE_CUSTOM_POOLS */\n\n/*\n * REQUIRED CLEANUP: Clear up so we don't get \"multiply defined\" error later\n * (#undef is ignored for something that is not defined)\n */\n#undef LWIP_MEMPOOL\n#undef LWIP_MALLOC_MEMPOOL\n#undef LWIP_MALLOC_MEMPOOL_START\n#undef LWIP_MALLOC_MEMPOOL_END\n#undef LWIP_PBUF_MEMPOOL\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/priv/nd6_priv.h",
    "content": "/**\n * @file\n *\n * Neighbor discovery and stateless address autoconfiguration for IPv6.\n * Aims to be compliant with RFC 4861 (Neighbor discovery) and RFC 4862\n * (Address autoconfiguration).\n */\n\n/*\n * Copyright (c) 2010 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#ifndef LWIP_HDR_ND6_PRIV_H\n#define LWIP_HDR_ND6_PRIV_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_IPV6  /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/netif.h\"\n\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_ND6_QUEUEING\n/** struct for queueing outgoing packets for unknown address\n  * defined here to be accessed by memp.h\n  */\nstruct nd6_q_entry {\n  struct nd6_q_entry *next;\n  struct pbuf *p;\n};\n#endif /* LWIP_ND6_QUEUEING */\n\n/** Struct for tables. */\nstruct nd6_neighbor_cache_entry {\n  ip6_addr_t next_hop_address;\n  struct netif *netif;\n  u8_t lladdr[NETIF_MAX_HWADDR_LEN];\n  /*u32_t pmtu;*/\n#if LWIP_ND6_QUEUEING\n  /** Pointer to queue of pending outgoing packets on this entry. */\n  struct nd6_q_entry *q;\n#else /* LWIP_ND6_QUEUEING */\n  /** Pointer to a single pending outgoing packet on this entry. */\n  struct pbuf *q;\n#endif /* LWIP_ND6_QUEUEING */\n  u8_t state;\n  u8_t isrouter;\n  union {\n    u32_t reachable_time; /* in ms since value may originate from network packet */\n    u32_t delay_time;     /* ticks (ND6_TMR_INTERVAL) */\n    u32_t probes_sent;\n    u32_t stale_time;     /* ticks (ND6_TMR_INTERVAL) */\n  } counter;\n};\n\nstruct nd6_destination_cache_entry {\n  ip6_addr_t destination_addr;\n  ip6_addr_t next_hop_addr;\n  u16_t pmtu;\n  u32_t age;\n};\n\nstruct nd6_prefix_list_entry {\n  ip6_addr_t prefix;\n  struct netif *netif;\n  u32_t invalidation_timer; /* in ms since value may originate from network packet */\n#if LWIP_IPV6_AUTOCONFIG\n  u8_t flags;\n#define ND6_PREFIX_AUTOCONFIG_AUTONOMOUS 0x01\n#define ND6_PREFIX_AUTOCONFIG_ADDRESS_GENERATED 0x02\n#define ND6_PREFIX_AUTOCONFIG_ADDRESS_DUPLICATE 0x04\n#endif /* LWIP_IPV6_AUTOCONFIG */\n};\n\nstruct nd6_router_list_entry {\n  struct nd6_neighbor_cache_entry *neighbor_entry;\n  u32_t invalidation_timer; /* in ms since value may originate from network packet */\n  u8_t flags;\n};\n\nenum nd6_neighbor_cache_entry_state {\n  ND6_NO_ENTRY = 0,\n  ND6_INCOMPLETE,\n  ND6_REACHABLE,\n  ND6_STALE,\n  ND6_DELAY,\n  ND6_PROBE\n};\n\n/* Router tables. */\n/* @todo make these static? and entries accessible through API? */\nextern struct nd6_neighbor_cache_entry neighbor_cache[];\nextern struct nd6_destination_cache_entry destination_cache[];\nextern struct nd6_prefix_list_entry prefix_list[];\nextern struct nd6_router_list_entry default_router_list[];\n\n/* Default values, can be updated by a RA message. */\nextern u32_t reachable_time;\nextern u32_t retrans_timer;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV6 */\n\n#endif /* LWIP_HDR_ND6_PRIV_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/priv/tcp_priv.h",
    "content": "/**\n * @file\n * TCP internal implementations (do not use in application code)\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_TCP_PRIV_H\n#define LWIP_HDR_TCP_PRIV_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/tcp.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/icmp.h\"\n#include \"lwip/err.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/prot/tcp.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Functions for interfacing with TCP: */\n\n/* Lower layer interface to TCP: */\nvoid             tcp_init    (void);  /* Initialize this module. */\nvoid             tcp_tmr     (void);  /* Must be called every\n                                         TCP_TMR_INTERVAL\n                                         ms. (Typically 250 ms). */\n/* It is also possible to call these two functions at the right\n   intervals (instead of calling tcp_tmr()). */\nvoid             tcp_slowtmr (void);\nvoid             tcp_fasttmr (void);\n\n/* Call this from a netif driver (watch out for threading issues!) that has\n   returned a memory error on transmit and now has free buffers to send more.\n   This iterates all active pcbs that had an error and tries to call\n   tcp_output, so use this with care as it might slow down the system. */\nvoid             tcp_txnow   (void);\n\n/* Only used by IP to pass a TCP segment to TCP: */\nvoid             tcp_input   (struct pbuf *p, struct netif *inp);\n/* Used within the TCP code only: */\nstruct tcp_pcb * tcp_alloc   (u8_t prio);\nvoid             tcp_abandon (struct tcp_pcb *pcb, int reset);\nerr_t            tcp_send_empty_ack(struct tcp_pcb *pcb);\nvoid             tcp_rexmit  (struct tcp_pcb *pcb);\nvoid             tcp_rexmit_rto  (struct tcp_pcb *pcb);\nvoid             tcp_rexmit_fast (struct tcp_pcb *pcb);\nu32_t            tcp_update_rcv_ann_wnd(struct tcp_pcb *pcb);\nerr_t            tcp_process_refused_data(struct tcp_pcb *pcb);\n\n/**\n * This is the Nagle algorithm: try to combine user data to send as few TCP\n * segments as possible. Only send if\n * - no previously transmitted data on the connection remains unacknowledged or\n * - the TF_NODELAY flag is set (nagle algorithm turned off for this pcb) or\n * - the only unsent segment is at least pcb->mss bytes long (or there is more\n *   than one unsent segment - with lwIP, this can happen although unsent->len < mss)\n * - or if we are in fast-retransmit (TF_INFR)\n */\n#define tcp_do_output_nagle(tpcb) ((((tpcb)->unacked == NULL) || \\\n                            ((tpcb)->flags & (TF_NODELAY | TF_INFR)) || \\\n                            (((tpcb)->unsent != NULL) && (((tpcb)->unsent->next != NULL) || \\\n                              ((tpcb)->unsent->len >= (tpcb)->mss))) || \\\n                            ((tcp_sndbuf(tpcb) == 0) || (tcp_sndqueuelen(tpcb) >= TCP_SND_QUEUELEN)) \\\n                            ) ? 1 : 0)\n#define tcp_output_nagle(tpcb) (tcp_do_output_nagle(tpcb) ? tcp_output(tpcb) : ERR_OK)\n\n\n#define TCP_SEQ_LT(a,b)     ((s32_t)((u32_t)(a) - (u32_t)(b)) < 0)\n#define TCP_SEQ_LEQ(a,b)    ((s32_t)((u32_t)(a) - (u32_t)(b)) <= 0)\n#define TCP_SEQ_GT(a,b)     ((s32_t)((u32_t)(a) - (u32_t)(b)) > 0)\n#define TCP_SEQ_GEQ(a,b)    ((s32_t)((u32_t)(a) - (u32_t)(b)) >= 0)\n/* is b<=a<=c? */\n#if 0 /* see bug #10548 */\n#define TCP_SEQ_BETWEEN(a,b,c) ((c)-(b) >= (a)-(b))\n#endif\n#define TCP_SEQ_BETWEEN(a,b,c) (TCP_SEQ_GEQ(a,b) && TCP_SEQ_LEQ(a,c))\n\n#ifndef TCP_TMR_INTERVAL\n#define TCP_TMR_INTERVAL       250  /* The TCP timer interval in milliseconds. */\n#endif /* TCP_TMR_INTERVAL */\n\n#ifndef TCP_FAST_INTERVAL\n#define TCP_FAST_INTERVAL      TCP_TMR_INTERVAL /* the fine grained timeout in milliseconds */\n#endif /* TCP_FAST_INTERVAL */\n\n#ifndef TCP_SLOW_INTERVAL\n#define TCP_SLOW_INTERVAL      (2*TCP_TMR_INTERVAL)  /* the coarse grained timeout in milliseconds */\n#endif /* TCP_SLOW_INTERVAL */\n\n#define TCP_FIN_WAIT_TIMEOUT 20000 /* milliseconds */\n#define TCP_SYN_RCVD_TIMEOUT 20000 /* milliseconds */\n\n#define TCP_OOSEQ_TIMEOUT        6U /* x RTO */\n\n#ifndef TCP_MSL\n#define TCP_MSL 60000UL /* The maximum segment lifetime in milliseconds */\n#endif\n\n/* Keepalive values, compliant with RFC 1122. Don't change this unless you know what you're doing */\n#ifndef  TCP_KEEPIDLE_DEFAULT\n#define  TCP_KEEPIDLE_DEFAULT     7200000UL /* Default KEEPALIVE timer in milliseconds */\n#endif\n\n#ifndef  TCP_KEEPINTVL_DEFAULT\n#define  TCP_KEEPINTVL_DEFAULT    75000UL   /* Default Time between KEEPALIVE probes in milliseconds */\n#endif\n\n#ifndef  TCP_KEEPCNT_DEFAULT\n#define  TCP_KEEPCNT_DEFAULT      9U        /* Default Counter for KEEPALIVE probes */\n#endif\n\n#define  TCP_MAXIDLE              TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT  /* Maximum KEEPALIVE probe time */\n\n#define TCP_TCPLEN(seg) ((seg)->len + (((TCPH_FLAGS((seg)->tcphdr) & (TCP_FIN | TCP_SYN)) != 0) ? 1U : 0U))\n\n/** Flags used on input processing, not on pcb->flags\n*/\n#define TF_RESET     (u8_t)0x08U   /* Connection was reset. */\n#define TF_CLOSED    (u8_t)0x10U   /* Connection was successfully closed. */\n#define TF_GOT_FIN   (u8_t)0x20U   /* Connection was closed by the remote end. */\n\n\n#if LWIP_EVENT_API\n\n#define TCP_EVENT_ACCEPT(lpcb,pcb,arg,err,ret) ret = lwip_tcp_event(arg, (pcb),\\\n                LWIP_EVENT_ACCEPT, NULL, 0, err)\n#define TCP_EVENT_SENT(pcb,space,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\\\n                   LWIP_EVENT_SENT, NULL, space, ERR_OK)\n#define TCP_EVENT_RECV(pcb,p,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\\\n                LWIP_EVENT_RECV, (p), 0, (err))\n#define TCP_EVENT_CLOSED(pcb,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\\\n                LWIP_EVENT_RECV, NULL, 0, ERR_OK)\n#define TCP_EVENT_CONNECTED(pcb,err,ret) ret = lwip_tcp_event((pcb)->callback_arg, (pcb),\\\n                LWIP_EVENT_CONNECTED, NULL, 0, (err))\n#define TCP_EVENT_POLL(pcb,ret)       do { if ((pcb)->state != SYN_RCVD) {                          \\\n                ret = lwip_tcp_event((pcb)->callback_arg, (pcb), LWIP_EVENT_POLL, NULL, 0, ERR_OK); \\\n                } else {                                                                            \\\n                ret = ERR_ARG; } } while(0)\n#define TCP_EVENT_ERR(last_state,errf,arg,err)  do { if (last_state != SYN_RCVD) {                \\\n                lwip_tcp_event((arg), NULL, LWIP_EVENT_ERR, NULL, 0, (err)); } } while(0)\n\n#else /* LWIP_EVENT_API */\n\n#define TCP_EVENT_ACCEPT(lpcb,pcb,arg,err,ret)                 \\\n  do {                                                         \\\n    if((lpcb)->accept != NULL)                                 \\\n      (ret) = (lpcb)->accept((arg),(pcb),(err));               \\\n    else (ret) = ERR_ARG;                                      \\\n  } while (0)\n\n#define TCP_EVENT_SENT(pcb,space,ret)                          \\\n  do {                                                         \\\n    if((pcb)->sent != NULL)                                    \\\n      (ret) = (pcb)->sent((pcb)->callback_arg,(pcb),(space));  \\\n    else (ret) = ERR_OK;                                       \\\n  } while (0)\n\n#define TCP_EVENT_RECV(pcb,p,err,ret)                          \\\n  do {                                                         \\\n    if((pcb)->recv != NULL) {                                  \\\n      (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),(p),(err));\\\n    } else {                                                   \\\n      (ret) = tcp_recv_null(NULL, (pcb), (p), (err));          \\\n    }                                                          \\\n  } while (0)\n\n#define TCP_EVENT_CLOSED(pcb,ret)                                \\\n  do {                                                           \\\n    if(((pcb)->recv != NULL)) {                                  \\\n      (ret) = (pcb)->recv((pcb)->callback_arg,(pcb),NULL,ERR_OK);\\\n    } else {                                                     \\\n      (ret) = ERR_OK;                                            \\\n    }                                                            \\\n  } while (0)\n\n#define TCP_EVENT_CONNECTED(pcb,err,ret)                         \\\n  do {                                                           \\\n    if((pcb)->connected != NULL)                                 \\\n      (ret) = (pcb)->connected((pcb)->callback_arg,(pcb),(err)); \\\n    else (ret) = ERR_OK;                                         \\\n  } while (0)\n\n#define TCP_EVENT_POLL(pcb,ret)                                \\\n  do {                                                         \\\n    if((pcb)->poll != NULL)                                    \\\n      (ret) = (pcb)->poll((pcb)->callback_arg,(pcb));          \\\n    else (ret) = ERR_OK;                                       \\\n  } while (0)\n\n#define TCP_EVENT_ERR(last_state,errf,arg,err)                 \\\n  do {                                                         \\\n    LWIP_UNUSED_ARG(last_state);                               \\\n    if((errf) != NULL)                                         \\\n      (errf)((arg),(err));                                     \\\n  } while (0)\n\n#endif /* LWIP_EVENT_API */\n\n/** Enabled extra-check for TCP_OVERSIZE if LWIP_DEBUG is enabled */\n#if TCP_OVERSIZE && defined(LWIP_DEBUG)\n#define TCP_OVERSIZE_DBGCHECK 1\n#else\n#define TCP_OVERSIZE_DBGCHECK 0\n#endif\n\n/** Don't generate checksum on copy if CHECKSUM_GEN_TCP is disabled */\n#define TCP_CHECKSUM_ON_COPY  (LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_TCP)\n\n/* This structure represents a TCP segment on the unsent, unacked and ooseq queues */\nstruct tcp_seg {\n  struct tcp_seg *next;    /* used when putting segments on a queue */\n  struct pbuf *p;          /* buffer containing data + TCP header */\n  u16_t len;               /* the TCP length of this segment */\n#if TCP_OVERSIZE_DBGCHECK\n  u16_t oversize_left;     /* Extra bytes available at the end of the last\n                              pbuf in unsent (used for asserting vs.\n                              tcp_pcb.unsent_oversize only) */\n#endif /* TCP_OVERSIZE_DBGCHECK */\n#if TCP_CHECKSUM_ON_COPY\n  u16_t chksum;\n  u8_t  chksum_swapped;\n#endif /* TCP_CHECKSUM_ON_COPY */\n  u8_t  flags;\n#define TF_SEG_OPTS_MSS         (u8_t)0x01U /* Include MSS option. */\n#define TF_SEG_OPTS_TS          (u8_t)0x02U /* Include timestamp option. */\n#define TF_SEG_DATA_CHECKSUMMED (u8_t)0x04U /* ALL data (not the header) is\n                                               checksummed into 'chksum' */\n#define TF_SEG_OPTS_WND_SCALE   (u8_t)0x08U /* Include WND SCALE option */\n  struct tcp_hdr *tcphdr;  /* the TCP header */\n};\n\n#define LWIP_TCP_OPT_EOL        0\n#define LWIP_TCP_OPT_NOP        1\n#define LWIP_TCP_OPT_MSS        2\n#define LWIP_TCP_OPT_WS         3\n#define LWIP_TCP_OPT_TS         8\n\n#define LWIP_TCP_OPT_LEN_MSS    4\n#if LWIP_TCP_TIMESTAMPS\n#define LWIP_TCP_OPT_LEN_TS     10\n#define LWIP_TCP_OPT_LEN_TS_OUT 12 /* aligned for output (includes NOP padding) */\n#else\n#define LWIP_TCP_OPT_LEN_TS_OUT 0\n#endif\n#if LWIP_WND_SCALE\n#define LWIP_TCP_OPT_LEN_WS     3\n#define LWIP_TCP_OPT_LEN_WS_OUT 4 /* aligned for output (includes NOP padding) */\n#else\n#define LWIP_TCP_OPT_LEN_WS_OUT 0\n#endif\n\n#define LWIP_TCP_OPT_LENGTH(flags) \\\n  (flags & TF_SEG_OPTS_MSS       ? LWIP_TCP_OPT_LEN_MSS    : 0) + \\\n  (flags & TF_SEG_OPTS_TS        ? LWIP_TCP_OPT_LEN_TS_OUT : 0) + \\\n  (flags & TF_SEG_OPTS_WND_SCALE ? LWIP_TCP_OPT_LEN_WS_OUT : 0)\n\n/** This returns a TCP header option for MSS in an u32_t */\n#define TCP_BUILD_MSS_OPTION(mss) lwip_htonl(0x02040000 | ((mss) & 0xFFFF))\n\n#if LWIP_WND_SCALE\n#define TCPWNDSIZE_F       U32_F\n#define TCPWND_MAX         0xFFFFFFFFU\n#define TCPWND_CHECK16(x)  LWIP_ASSERT(\"window size > 0xFFFF\", (x) <= 0xFFFF)\n#define TCPWND_MIN16(x)    ((u16_t)LWIP_MIN((x), 0xFFFF))\n#else /* LWIP_WND_SCALE */\n#define TCPWNDSIZE_F       U16_F\n#define TCPWND_MAX         0xFFFFU\n#define TCPWND_CHECK16(x)\n#define TCPWND_MIN16(x)    x\n#endif /* LWIP_WND_SCALE */\n\n/* Global variables: */\nextern struct tcp_pcb *tcp_input_pcb;\nextern u32_t tcp_ticks;\nextern u8_t tcp_active_pcbs_changed;\n\n/* The TCP PCB lists. */\nunion tcp_listen_pcbs_t { /* List of all TCP PCBs in LISTEN state. */\n  struct tcp_pcb_listen *listen_pcbs;\n  struct tcp_pcb *pcbs;\n};\nextern struct tcp_pcb *tcp_bound_pcbs;\nextern union tcp_listen_pcbs_t tcp_listen_pcbs;\nextern struct tcp_pcb *tcp_active_pcbs;  /* List of all TCP PCBs that are in a\n              state in which they accept or send\n              data. */\nextern struct tcp_pcb *tcp_tw_pcbs;      /* List of all TCP PCBs in TIME-WAIT. */\n\n#define NUM_TCP_PCB_LISTS_NO_TIME_WAIT  3\n#define NUM_TCP_PCB_LISTS               4\nextern struct tcp_pcb ** const tcp_pcb_lists[NUM_TCP_PCB_LISTS];\n\n/* Axioms about the above lists:\n   1) Every TCP PCB that is not CLOSED is in one of the lists.\n   2) A PCB is only in one of the lists.\n   3) All PCBs in the tcp_listen_pcbs list is in LISTEN state.\n   4) All PCBs in the tcp_tw_pcbs list is in TIME-WAIT state.\n*/\n/* Define two macros, TCP_REG and TCP_RMV that registers a TCP PCB\n   with a PCB list or removes a PCB from a list, respectively. */\n#ifndef TCP_DEBUG_PCB_LISTS\n#define TCP_DEBUG_PCB_LISTS 0\n#endif\n#if TCP_DEBUG_PCB_LISTS\n#define TCP_REG(pcbs, npcb) do {\\\n                            struct tcp_pcb *tcp_tmp_pcb; \\\n                            LWIP_DEBUGF(TCP_DEBUG, (\"TCP_REG %p local port %d\\n\", (npcb), (npcb)->local_port)); \\\n                            for (tcp_tmp_pcb = *(pcbs); \\\n          tcp_tmp_pcb != NULL; \\\n        tcp_tmp_pcb = tcp_tmp_pcb->next) { \\\n                                LWIP_ASSERT(\"TCP_REG: already registered\\n\", tcp_tmp_pcb != (npcb)); \\\n                            } \\\n                            LWIP_ASSERT(\"TCP_REG: pcb->state != CLOSED\", ((pcbs) == &tcp_bound_pcbs) || ((npcb)->state != CLOSED)); \\\n                            (npcb)->next = *(pcbs); \\\n                            LWIP_ASSERT(\"TCP_REG: npcb->next != npcb\", (npcb)->next != (npcb)); \\\n                            *(pcbs) = (npcb); \\\n                            LWIP_ASSERT(\"TCP_RMV: tcp_pcbs sane\", tcp_pcbs_sane()); \\\n              tcp_timer_needed(); \\\n                            } while(0)\n#define TCP_RMV(pcbs, npcb) do { \\\n                            struct tcp_pcb *tcp_tmp_pcb; \\\n                            LWIP_ASSERT(\"TCP_RMV: pcbs != NULL\", *(pcbs) != NULL); \\\n                            LWIP_DEBUGF(TCP_DEBUG, (\"TCP_RMV: removing %p from %p\\n\", (npcb), *(pcbs))); \\\n                            if(*(pcbs) == (npcb)) { \\\n                               *(pcbs) = (*pcbs)->next; \\\n                            } else for (tcp_tmp_pcb = *(pcbs); tcp_tmp_pcb != NULL; tcp_tmp_pcb = tcp_tmp_pcb->next) { \\\n                               if(tcp_tmp_pcb->next == (npcb)) { \\\n                                  tcp_tmp_pcb->next = (npcb)->next; \\\n                                  break; \\\n                               } \\\n                            } \\\n                            (npcb)->next = NULL; \\\n                            LWIP_ASSERT(\"TCP_RMV: tcp_pcbs sane\", tcp_pcbs_sane()); \\\n                            LWIP_DEBUGF(TCP_DEBUG, (\"TCP_RMV: removed %p from %p\\n\", (npcb), *(pcbs))); \\\n                            } while(0)\n\n#else /* LWIP_DEBUG */\n\n#define TCP_REG(pcbs, npcb)                        \\\n  do {                                             \\\n    (npcb)->next = *pcbs;                          \\\n    *(pcbs) = (npcb);                              \\\n    tcp_timer_needed();                            \\\n  } while (0)\n\n#define TCP_RMV(pcbs, npcb)                        \\\n  do {                                             \\\n    if(*(pcbs) == (npcb)) {                        \\\n      (*(pcbs)) = (*pcbs)->next;                   \\\n    }                                              \\\n    else {                                         \\\n      struct tcp_pcb *tcp_tmp_pcb;                 \\\n      for (tcp_tmp_pcb = *pcbs;                    \\\n          tcp_tmp_pcb != NULL;                     \\\n          tcp_tmp_pcb = tcp_tmp_pcb->next) {       \\\n        if(tcp_tmp_pcb->next == (npcb)) {          \\\n          tcp_tmp_pcb->next = (npcb)->next;        \\\n          break;                                   \\\n        }                                          \\\n      }                                            \\\n    }                                              \\\n    (npcb)->next = NULL;                           \\\n  } while(0)\n\n#endif /* LWIP_DEBUG */\n\n#define TCP_REG_ACTIVE(npcb)                       \\\n  do {                                             \\\n    TCP_REG(&tcp_active_pcbs, npcb);               \\\n    tcp_active_pcbs_changed = 1;                   \\\n  } while (0)\n\n#define TCP_RMV_ACTIVE(npcb)                       \\\n  do {                                             \\\n    TCP_RMV(&tcp_active_pcbs, npcb);               \\\n    tcp_active_pcbs_changed = 1;                   \\\n  } while (0)\n\n#define TCP_PCB_REMOVE_ACTIVE(pcb)                 \\\n  do {                                             \\\n    tcp_pcb_remove(&tcp_active_pcbs, pcb);         \\\n    tcp_active_pcbs_changed = 1;                   \\\n  } while (0)\n\n\n/* Internal functions: */\nstruct tcp_pcb *tcp_pcb_copy(struct tcp_pcb *pcb);\nvoid tcp_pcb_purge(struct tcp_pcb *pcb);\nvoid tcp_pcb_remove(struct tcp_pcb **pcblist, struct tcp_pcb *pcb);\n\nvoid tcp_segs_free(struct tcp_seg *seg);\nvoid tcp_seg_free(struct tcp_seg *seg);\nstruct tcp_seg *tcp_seg_copy(struct tcp_seg *seg);\n\n#define tcp_ack(pcb)                               \\\n  do {                                             \\\n    if((pcb)->flags & TF_ACK_DELAY) {              \\\n      (pcb)->flags &= ~TF_ACK_DELAY;               \\\n      (pcb)->flags |= TF_ACK_NOW;                  \\\n    }                                              \\\n    else {                                         \\\n      (pcb)->flags |= TF_ACK_DELAY;                \\\n    }                                              \\\n  } while (0)\n\n#define tcp_ack_now(pcb)                           \\\n  do {                                             \\\n    (pcb)->flags |= TF_ACK_NOW;                    \\\n  } while (0)\n\nerr_t tcp_send_fin(struct tcp_pcb *pcb);\nerr_t tcp_enqueue_flags(struct tcp_pcb *pcb, u8_t flags);\n\nvoid tcp_rexmit_seg(struct tcp_pcb *pcb, struct tcp_seg *seg);\n\nvoid tcp_rst(u32_t seqno, u32_t ackno,\n       const ip_addr_t *local_ip, const ip_addr_t *remote_ip,\n       u16_t local_port, u16_t remote_port);\n\nu32_t tcp_next_iss(struct tcp_pcb *pcb);\n\nerr_t tcp_keepalive(struct tcp_pcb *pcb);\nerr_t tcp_zero_window_probe(struct tcp_pcb *pcb);\nvoid  tcp_trigger_input_pcb_close(void);\n\n#if TCP_CALCULATE_EFF_SEND_MSS\nu16_t tcp_eff_send_mss_impl(u16_t sendmss, const ip_addr_t *dest\n#if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING\n                           , const ip_addr_t *src\n#endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */\n                           );\n#if LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING\n#define tcp_eff_send_mss(sendmss, src, dest) tcp_eff_send_mss_impl(sendmss, dest, src)\n#else /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */\n#define tcp_eff_send_mss(sendmss, src, dest) tcp_eff_send_mss_impl(sendmss, dest)\n#endif /* LWIP_IPV6 || LWIP_IPV4_SRC_ROUTING */\n#endif /* TCP_CALCULATE_EFF_SEND_MSS */\n\n#if LWIP_CALLBACK_API\nerr_t tcp_recv_null(void *arg, struct tcp_pcb *pcb, struct pbuf *p, err_t err);\n#endif /* LWIP_CALLBACK_API */\n\n#if TCP_DEBUG || TCP_INPUT_DEBUG || TCP_OUTPUT_DEBUG\nvoid tcp_debug_print(struct tcp_hdr *tcphdr);\nvoid tcp_debug_print_flags(u8_t flags);\nvoid tcp_debug_print_state(enum tcp_state s);\nvoid tcp_debug_print_pcbs(void);\ns16_t tcp_pcbs_sane(void);\n#else\n#  define tcp_debug_print(tcphdr)\n#  define tcp_debug_print_flags(flags)\n#  define tcp_debug_print_state(s)\n#  define tcp_debug_print_pcbs()\n#  define tcp_pcbs_sane() 1\n#endif /* TCP_DEBUG */\n\n/** External function (implemented in timers.c), called when TCP detects\n * that a timer is needed (i.e. active- or time-wait-pcb found). */\nvoid tcp_timer_needed(void);\n\nvoid tcp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_TCP */\n\n#endif /* LWIP_HDR_TCP_PRIV_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/priv/tcpip_priv.h",
    "content": "/**\n * @file\n * TCPIP API internal implementations (do not use in application code)\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_TCPIP_PRIV_H\n#define LWIP_HDR_TCPIP_PRIV_H\n\n#include \"lwip/opt.h\"\n\n#if !NO_SYS /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/tcpip.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/timeouts.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct pbuf;\nstruct netif;\n\n#if LWIP_MPU_COMPATIBLE\n#define API_VAR_REF(name)               (*(name))\n#define API_VAR_DECLARE(type, name)     type * name\n#define API_VAR_ALLOC(type, pool, name, errorval) do { \\\n                                          name = (type *)memp_malloc(pool); \\\n                                          if (name == NULL) { \\\n                                            return errorval; \\\n                                          } \\\n                                        } while(0)\n#define API_VAR_ALLOC_POOL(type, pool, name, errorval) do { \\\n                                          name = (type *)LWIP_MEMPOOL_ALLOC(pool); \\\n                                          if (name == NULL) { \\\n                                            return errorval; \\\n                                          } \\\n                                        } while(0)\n#define API_VAR_FREE(pool, name)        memp_free(pool, name)\n#define API_VAR_FREE_POOL(pool, name)   LWIP_MEMPOOL_FREE(pool, name)\n#define API_EXPR_REF(expr)              (&(expr))\n#if LWIP_NETCONN_SEM_PER_THREAD\n#define API_EXPR_REF_SEM(expr)          (expr)\n#else\n#define API_EXPR_REF_SEM(expr)          API_EXPR_REF(expr)\n#endif\n#define API_EXPR_DEREF(expr)            expr\n#define API_MSG_M_DEF(m)                m\n#define API_MSG_M_DEF_C(t, m)           t m\n#else /* LWIP_MPU_COMPATIBLE */\n#define API_VAR_REF(name)               name\n#define API_VAR_DECLARE(type, name)     type name\n#define API_VAR_ALLOC(type, pool, name, errorval)\n#define API_VAR_ALLOC_POOL(type, pool, name, errorval)\n#define API_VAR_FREE(pool, name)\n#define API_VAR_FREE_POOL(pool, name)\n#define API_EXPR_REF(expr)              expr\n#define API_EXPR_REF_SEM(expr)          API_EXPR_REF(expr)\n#define API_EXPR_DEREF(expr)            (*(expr))\n#define API_MSG_M_DEF(m)                *m\n#define API_MSG_M_DEF_C(t, m)           const t * m\n#endif /* LWIP_MPU_COMPATIBLE */\n\nerr_t tcpip_send_msg_wait_sem(tcpip_callback_fn fn, void *apimsg, sys_sem_t* sem);\n\nstruct tcpip_api_call_data\n{\n#if !LWIP_TCPIP_CORE_LOCKING\n  err_t err;\n#if !LWIP_NETCONN_SEM_PER_THREAD\n  sys_sem_t sem;\n#endif /* LWIP_NETCONN_SEM_PER_THREAD */\n#else /* !LWIP_TCPIP_CORE_LOCKING */\n  u8_t dummy; /* avoid empty struct :-( */\n#endif /* !LWIP_TCPIP_CORE_LOCKING */\n};\ntypedef err_t (*tcpip_api_call_fn)(struct tcpip_api_call_data* call);\nerr_t tcpip_api_call(tcpip_api_call_fn fn, struct tcpip_api_call_data *call);\n\nenum tcpip_msg_type {\n  TCPIP_MSG_API,\n  TCPIP_MSG_API_CALL,\n  TCPIP_MSG_INPKT,\n#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS\n  TCPIP_MSG_TIMEOUT,\n  TCPIP_MSG_UNTIMEOUT,\n#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */\n  TCPIP_MSG_CALLBACK,\n  TCPIP_MSG_CALLBACK_STATIC\n};\n\nstruct tcpip_msg {\n  enum tcpip_msg_type type;\n  union {\n    struct {\n      tcpip_callback_fn function;\n      void* msg;\n    } api_msg;\n    struct {\n      tcpip_api_call_fn function;\n      struct tcpip_api_call_data *arg;\n      sys_sem_t *sem;\n    } api_call;\n    struct {\n      struct pbuf *p;\n      struct netif *netif;\n      netif_input_fn input_fn;\n    } inp;\n    struct {\n      tcpip_callback_fn function;\n      void *ctx;\n    } cb;\n#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS\n    struct {\n      u32_t msecs;\n      sys_timeout_handler h;\n      void *arg;\n    } tmo;\n#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */\n  } msg;\n};\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* !NO_SYS */\n\n#endif /* LWIP_HDR_TCPIP_PRIV_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/autoip.h",
    "content": "/**\n * @file\n * AutoIP protocol definitions\n */\n\n/*\n *\n * Copyright (c) 2007 Dominik Spies <kontakt@dspies.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * Author: Dominik Spies <kontakt@dspies.de>\n *\n * This is a AutoIP implementation for the lwIP TCP/IP stack. It aims to conform\n * with RFC 3927.\n *\n */\n\n#ifndef LWIP_HDR_PROT_AUTOIP_H\n#define LWIP_HDR_PROT_AUTOIP_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* 169.254.0.0 */\n#define AUTOIP_NET              0xA9FE0000\n/* 169.254.1.0 */\n#define AUTOIP_RANGE_START      (AUTOIP_NET | 0x0100)\n/* 169.254.254.255 */\n#define AUTOIP_RANGE_END        (AUTOIP_NET | 0xFEFF)\n\n/* RFC 3927 Constants */\n#define PROBE_WAIT              1   /* second   (initial random delay)                 */\n#define PROBE_MIN               1   /* second   (minimum delay till repeated probe)    */\n#define PROBE_MAX               2   /* seconds  (maximum delay till repeated probe)    */\n#define PROBE_NUM               3   /*          (number of probe packets)              */\n#define ANNOUNCE_NUM            2   /*          (number of announcement packets)       */\n#define ANNOUNCE_INTERVAL       2   /* seconds  (time between announcement packets)    */\n#define ANNOUNCE_WAIT           2   /* seconds  (delay before announcing)              */\n#define MAX_CONFLICTS           10  /*          (max conflicts before rate limiting)   */\n#define RATE_LIMIT_INTERVAL     60  /* seconds  (delay between successive attempts)    */\n#define DEFEND_INTERVAL         10  /* seconds  (min. wait between defensive ARPs)     */\n\n/* AutoIP client states */\ntypedef enum {\n  AUTOIP_STATE_OFF        = 0,\n  AUTOIP_STATE_PROBING    = 1,\n  AUTOIP_STATE_ANNOUNCING = 2,\n  AUTOIP_STATE_BOUND      = 3\n} autoip_state_enum_t;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_AUTOIP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/dhcp.h",
    "content": "/**\n * @file\n * DHCP protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Leon Woestenberg <leon.woestenberg@gmx.net>\n * Copyright (c) 2001-2004 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Leon Woestenberg <leon.woestenberg@gmx.net>\n *\n */\n#ifndef LWIP_HDR_PROT_DHCP_H\n#define LWIP_HDR_PROT_DHCP_H\n\n#include \"lwip/opt.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define DHCP_CLIENT_PORT  68\n#define DHCP_SERVER_PORT  67\n\n\n /* DHCP message item offsets and length */\n#define DHCP_CHADDR_LEN   16U\n#define DHCP_SNAME_OFS    44U\n#define DHCP_SNAME_LEN    64U\n#define DHCP_FILE_OFS     108U\n#define DHCP_FILE_LEN     128U\n#define DHCP_MSG_LEN      236U\n#define DHCP_OPTIONS_OFS  (DHCP_MSG_LEN + 4U) /* 4 byte: cookie */\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\n/** minimum set of fields of any DHCP message */\nstruct dhcp_msg\n{\n  PACK_STRUCT_FLD_8(u8_t op);\n  PACK_STRUCT_FLD_8(u8_t htype);\n  PACK_STRUCT_FLD_8(u8_t hlen);\n  PACK_STRUCT_FLD_8(u8_t hops);\n  PACK_STRUCT_FIELD(u32_t xid);\n  PACK_STRUCT_FIELD(u16_t secs);\n  PACK_STRUCT_FIELD(u16_t flags);\n  PACK_STRUCT_FLD_S(ip4_addr_p_t ciaddr);\n  PACK_STRUCT_FLD_S(ip4_addr_p_t yiaddr);\n  PACK_STRUCT_FLD_S(ip4_addr_p_t siaddr);\n  PACK_STRUCT_FLD_S(ip4_addr_p_t giaddr);\n  PACK_STRUCT_FLD_8(u8_t chaddr[DHCP_CHADDR_LEN]);\n  PACK_STRUCT_FLD_8(u8_t sname[DHCP_SNAME_LEN]);\n  PACK_STRUCT_FLD_8(u8_t file[DHCP_FILE_LEN]);\n  PACK_STRUCT_FIELD(u32_t cookie);\n#define DHCP_MIN_OPTIONS_LEN 68U\n/** make sure user does not configure this too small */\n#if ((defined(DHCP_OPTIONS_LEN)) && (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN))\n#  undef DHCP_OPTIONS_LEN\n#endif\n/** allow this to be configured in lwipopts.h, but not too small */\n#if (!defined(DHCP_OPTIONS_LEN))\n/** set this to be sufficient for your options in outgoing DHCP msgs */\n#  define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN\n#endif\n  PACK_STRUCT_FLD_8(u8_t options[DHCP_OPTIONS_LEN]);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n\n/* DHCP client states */\ntypedef enum {\n  DHCP_STATE_OFF             = 0,\n  DHCP_STATE_REQUESTING      = 1,\n  DHCP_STATE_INIT            = 2,\n  DHCP_STATE_REBOOTING       = 3,\n  DHCP_STATE_REBINDING       = 4,\n  DHCP_STATE_RENEWING        = 5,\n  DHCP_STATE_SELECTING       = 6,\n  DHCP_STATE_INFORMING       = 7,\n  DHCP_STATE_CHECKING        = 8,\n  DHCP_STATE_PERMANENT       = 9,  /* not yet implemented */\n  DHCP_STATE_BOUND           = 10,\n  DHCP_STATE_RELEASING       = 11, /* not yet implemented */\n  DHCP_STATE_BACKING_OFF     = 12\n} dhcp_state_enum_t;\n\n/* DHCP op codes */\n#define DHCP_BOOTREQUEST            1\n#define DHCP_BOOTREPLY              2\n\n/* DHCP message types */\n#define DHCP_DISCOVER               1\n#define DHCP_OFFER                  2\n#define DHCP_REQUEST                3\n#define DHCP_DECLINE                4\n#define DHCP_ACK                    5\n#define DHCP_NAK                    6\n#define DHCP_RELEASE                7\n#define DHCP_INFORM                 8\n\n/** DHCP hardware type, currently only ethernet is supported */\n#define DHCP_HTYPE_ETH              1\n\n#define DHCP_MAGIC_COOKIE           0x63825363UL\n\n/* This is a list of options for BOOTP and DHCP, see RFC 2132 for descriptions */\n\n/* BootP options */\n#define DHCP_OPTION_PAD             0\n#define DHCP_OPTION_SUBNET_MASK     1 /* RFC 2132 3.3 */\n#define DHCP_OPTION_ROUTER          3\n#define DHCP_OPTION_DNS_SERVER      6\n#define DHCP_OPTION_HOSTNAME        12\n#define DHCP_OPTION_IP_TTL          23\n#define DHCP_OPTION_MTU             26\n#define DHCP_OPTION_BROADCAST       28\n#define DHCP_OPTION_TCP_TTL         37\n#define DHCP_OPTION_NTP             42\n#define DHCP_OPTION_END             255\n\n/* DHCP options */\n#define DHCP_OPTION_REQUESTED_IP    50 /* RFC 2132 9.1, requested IP address */\n#define DHCP_OPTION_LEASE_TIME      51 /* RFC 2132 9.2, time in seconds, in 4 bytes */\n#define DHCP_OPTION_OVERLOAD        52 /* RFC2132 9.3, use file and/or sname field for options */\n\n#define DHCP_OPTION_MESSAGE_TYPE    53 /* RFC 2132 9.6, important for DHCP */\n#define DHCP_OPTION_MESSAGE_TYPE_LEN 1\n\n#define DHCP_OPTION_SERVER_ID       54 /* RFC 2132 9.7, server IP address */\n#define DHCP_OPTION_PARAMETER_REQUEST_LIST  55 /* RFC 2132 9.8, requested option types */\n\n#define DHCP_OPTION_MAX_MSG_SIZE    57 /* RFC 2132 9.10, message size accepted >= 576 */\n#define DHCP_OPTION_MAX_MSG_SIZE_LEN 2\n\n#define DHCP_OPTION_T1              58 /* T1 renewal time */\n#define DHCP_OPTION_T2              59 /* T2 rebinding time */\n#define DHCP_OPTION_US              60\n#define DHCP_OPTION_CLIENT_ID       61\n#define DHCP_OPTION_TFTP_SERVERNAME 66\n#define DHCP_OPTION_BOOTFILE        67\n\n/* possible combinations of overloading the file and sname fields with options */\n#define DHCP_OVERLOAD_NONE          0\n#define DHCP_OVERLOAD_FILE          1\n#define DHCP_OVERLOAD_SNAME         2\n#define DHCP_OVERLOAD_SNAME_FILE    3\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /*LWIP_HDR_PROT_DHCP_H*/\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/dns.h",
    "content": "/**\n * @file\n * DNS - host name to IP address resolver.\n */\n\n/*\n * Port to lwIP from uIP\n * by Jim Pettinato April 2007\n *\n * security fixes and more by Simon Goldschmidt\n *\n * uIP version Copyright (c) 2002-2003, Adam Dunkels.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote\n *    products derived from this software without specific prior\n *    written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef LWIP_HDR_PROT_DNS_H\n#define LWIP_HDR_PROT_DNS_H\n\n#include \"lwip/arch.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** DNS server port address */\n#ifndef DNS_SERVER_PORT\n#define DNS_SERVER_PORT           53\n#endif\n\n/* DNS field TYPE used for \"Resource Records\" */\n#define DNS_RRTYPE_A              1     /* a host address */\n#define DNS_RRTYPE_NS             2     /* an authoritative name server */\n#define DNS_RRTYPE_MD             3     /* a mail destination (Obsolete - use MX) */\n#define DNS_RRTYPE_MF             4     /* a mail forwarder (Obsolete - use MX) */\n#define DNS_RRTYPE_CNAME          5     /* the canonical name for an alias */\n#define DNS_RRTYPE_SOA            6     /* marks the start of a zone of authority */\n#define DNS_RRTYPE_MB             7     /* a mailbox domain name (EXPERIMENTAL) */\n#define DNS_RRTYPE_MG             8     /* a mail group member (EXPERIMENTAL) */\n#define DNS_RRTYPE_MR             9     /* a mail rename domain name (EXPERIMENTAL) */\n#define DNS_RRTYPE_NULL           10    /* a null RR (EXPERIMENTAL) */\n#define DNS_RRTYPE_WKS            11    /* a well known service description */\n#define DNS_RRTYPE_PTR            12    /* a domain name pointer */\n#define DNS_RRTYPE_HINFO          13    /* host information */\n#define DNS_RRTYPE_MINFO          14    /* mailbox or mail list information */\n#define DNS_RRTYPE_MX             15    /* mail exchange */\n#define DNS_RRTYPE_TXT            16    /* text strings */\n#define DNS_RRTYPE_AAAA           28    /* IPv6 address */\n#define DNS_RRTYPE_SRV            33    /* service location */\n#define DNS_RRTYPE_ANY            255   /* any type */\n\n/* DNS field CLASS used for \"Resource Records\" */\n#define DNS_RRCLASS_IN            1     /* the Internet */\n#define DNS_RRCLASS_CS            2     /* the CSNET class (Obsolete - used only for examples in some obsolete RFCs) */\n#define DNS_RRCLASS_CH            3     /* the CHAOS class */\n#define DNS_RRCLASS_HS            4     /* Hesiod [Dyer 87] */\n#define DNS_RRCLASS_ANY           255   /* any class */\n#define DNS_RRCLASS_FLUSH         0x800 /* Flush bit */\n\n/* DNS protocol flags */\n#define DNS_FLAG1_RESPONSE        0x80\n#define DNS_FLAG1_OPCODE_STATUS   0x10\n#define DNS_FLAG1_OPCODE_INVERSE  0x08\n#define DNS_FLAG1_OPCODE_STANDARD 0x00\n#define DNS_FLAG1_AUTHORATIVE     0x04\n#define DNS_FLAG1_TRUNC           0x02\n#define DNS_FLAG1_RD              0x01\n#define DNS_FLAG2_RA              0x80\n#define DNS_FLAG2_ERR_MASK        0x0f\n#define DNS_FLAG2_ERR_NONE        0x00\n#define DNS_FLAG2_ERR_NAME        0x03\n\n#define DNS_HDR_GET_OPCODE(hdr) ((((hdr)->flags1) >> 3) & 0xF)\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\n/** DNS message header */\nstruct dns_hdr {\n  PACK_STRUCT_FIELD(u16_t id);\n  PACK_STRUCT_FLD_8(u8_t flags1);\n  PACK_STRUCT_FLD_8(u8_t flags2);\n  PACK_STRUCT_FIELD(u16_t numquestions);\n  PACK_STRUCT_FIELD(u16_t numanswers);\n  PACK_STRUCT_FIELD(u16_t numauthrr);\n  PACK_STRUCT_FIELD(u16_t numextrarr);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n#define SIZEOF_DNS_HDR 12\n\n\n/* Multicast DNS definitions */\n\n/** UDP port for multicast DNS queries */\n#ifndef DNS_MQUERY_PORT\n#define DNS_MQUERY_PORT             5353\n#endif\n\n/* IPv4 group for multicast DNS queries: 224.0.0.251 */\n#ifndef DNS_MQUERY_IPV4_GROUP_INIT\n#define DNS_MQUERY_IPV4_GROUP_INIT  IPADDR4_INIT_BYTES(224,0,0,251)\n#endif\n\n/* IPv6 group for multicast DNS queries: FF02::FB */\n#ifndef DNS_MQUERY_IPV6_GROUP_INIT\n#define DNS_MQUERY_IPV6_GROUP_INIT  IPADDR6_INIT_HOST(0xFF020000,0,0,0xFB)\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_DNS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/etharp.h",
    "content": "/**\n * @file\n * ARP protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_ETHARP_H\n#define LWIP_HDR_PROT_ETHARP_H\n\n#include \"lwip/arch.h\"\n#include \"lwip/prot/ethernet.h\"\n#include \"lwip/ip4_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef ETHARP_HWADDR_LEN\n#define ETHARP_HWADDR_LEN     ETH_HWADDR_LEN\n#endif\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\n/** the ARP message, see RFC 826 (\"Packet format\") */\nstruct etharp_hdr {\n  PACK_STRUCT_FIELD(u16_t hwtype);\n  PACK_STRUCT_FIELD(u16_t proto);\n  PACK_STRUCT_FLD_8(u8_t  hwlen);\n  PACK_STRUCT_FLD_8(u8_t  protolen);\n  PACK_STRUCT_FIELD(u16_t opcode);\n  PACK_STRUCT_FLD_S(struct eth_addr shwaddr);\n  PACK_STRUCT_FLD_S(struct ip4_addr2 sipaddr);\n  PACK_STRUCT_FLD_S(struct eth_addr dhwaddr);\n  PACK_STRUCT_FLD_S(struct ip4_addr2 dipaddr);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#define SIZEOF_ETHARP_HDR 28\n\n/* ARP hwtype values */\nenum etharp_hwtype {\n  HWTYPE_ETHERNET = 1\n  /* others not used */\n};\n\n/* ARP message types (opcodes) */\nenum etharp_opcode {\n  ARP_REQUEST = 1,\n  ARP_REPLY   = 2\n};\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_ETHARP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/ethernet.h",
    "content": "/**\n * @file\n * Ethernet protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_ETHERNET_H\n#define LWIP_HDR_PROT_ETHERNET_H\n\n#include \"lwip/arch.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef ETH_HWADDR_LEN\n#ifdef ETHARP_HWADDR_LEN\n#define ETH_HWADDR_LEN    ETHARP_HWADDR_LEN /* compatibility mode */\n#else\n#define ETH_HWADDR_LEN    6\n#endif\n#endif\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct eth_addr {\n  PACK_STRUCT_FLD_8(u8_t addr[ETH_HWADDR_LEN]);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\n/** Ethernet header */\nstruct eth_hdr {\n#if ETH_PAD_SIZE\n  PACK_STRUCT_FLD_8(u8_t padding[ETH_PAD_SIZE]);\n#endif\n  PACK_STRUCT_FLD_S(struct eth_addr dest);\n  PACK_STRUCT_FLD_S(struct eth_addr src);\n  PACK_STRUCT_FIELD(u16_t type);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#define SIZEOF_ETH_HDR (14 + ETH_PAD_SIZE)\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\n/** VLAN header inserted between ethernet header and payload\n * if 'type' in ethernet header is ETHTYPE_VLAN.\n * See IEEE802.Q */\nstruct eth_vlan_hdr {\n  PACK_STRUCT_FIELD(u16_t prio_vid);\n  PACK_STRUCT_FIELD(u16_t tpid);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#define SIZEOF_VLAN_HDR 4\n#define VLAN_ID(vlan_hdr) (lwip_htons((vlan_hdr)->prio_vid) & 0xFFF)\n\n/**\n * @ingroup ethernet\n * A list of often ethtypes (although lwIP does not use all of them): */\nenum eth_type {\n  /** Internet protocol v4 */\n  ETHTYPE_IP        = 0x0800U,\n  /** Address resolution protocol */\n  ETHTYPE_ARP       = 0x0806U, \n  /** Wake on lan */\n  ETHTYPE_WOL       = 0x0842U,\n  /** RARP */\n  ETHTYPE_RARP      = 0x8035U,\n  /** Virtual local area network */\n  ETHTYPE_VLAN      = 0x8100U,\n  /** Internet protocol v6 */\n  ETHTYPE_IPV6      = 0x86DDU,\n  /** PPP Over Ethernet Discovery Stage */\n  ETHTYPE_PPPOEDISC = 0x8863U,\n  /** PPP Over Ethernet Session Stage */\n  ETHTYPE_PPPOE     = 0x8864U,\n  /** Jumbo Frames */\n  ETHTYPE_JUMBO     = 0x8870U,\n  /** Process field network */\n  ETHTYPE_PROFINET  = 0x8892U,\n  /** Ethernet for control automation technology */\n  ETHTYPE_ETHERCAT  = 0x88A4U,\n  /** Link layer discovery protocol */\n  ETHTYPE_LLDP      = 0x88CCU,\n  /** Serial real-time communication system */\n  ETHTYPE_SERCOS    = 0x88CDU,\n  /** Media redundancy protocol */\n  ETHTYPE_MRP       = 0x88E3U,\n  /** Precision time protocol */\n  ETHTYPE_PTP       = 0x88F7U,\n  /** Q-in-Q, 802.1ad */\n  ETHTYPE_QINQ      = 0x9100U\n};\n\n/** The 24-bit IANA IPv4-multicast OUI is 01-00-5e: */\n#define LL_IP4_MULTICAST_ADDR_0 0x01\n#define LL_IP4_MULTICAST_ADDR_1 0x00\n#define LL_IP4_MULTICAST_ADDR_2 0x5e\n\n/** IPv6 multicast uses this prefix */\n#define LL_IP6_MULTICAST_ADDR_0 0x33\n#define LL_IP6_MULTICAST_ADDR_1 0x33\n\n/** MEMCPY-like macro to copy to/from struct eth_addr's that are local variables\n * or known to be 32-bit aligned within the protocol header. */\n#ifndef ETHADDR32_COPY\n#define ETHADDR32_COPY(dst, src)  SMEMCPY(dst, src, ETH_HWADDR_LEN)\n#endif\n\n/** MEMCPY-like macro to copy to/from struct eth_addr's that are no local\n * variables and known to be 16-bit aligned within the protocol header. */\n#ifndef ETHADDR16_COPY\n#define ETHADDR16_COPY(dst, src)  SMEMCPY(dst, src, ETH_HWADDR_LEN)\n#endif\n\n#define eth_addr_cmp(addr1, addr2) (memcmp((addr1)->addr, (addr2)->addr, ETH_HWADDR_LEN) == 0)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_ETHERNET_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/icmp.h",
    "content": "/**\n * @file\n * ICMP protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_ICMP_H\n#define LWIP_HDR_PROT_ICMP_H\n\n#include \"lwip/arch.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define ICMP_ER   0    /* echo reply */\n#define ICMP_DUR  3    /* destination unreachable */\n#define ICMP_SQ   4    /* source quench */\n#define ICMP_RD   5    /* redirect */\n#define ICMP_ECHO 8    /* echo */\n#define ICMP_TE  11    /* time exceeded */\n#define ICMP_PP  12    /* parameter problem */\n#define ICMP_TS  13    /* timestamp */\n#define ICMP_TSR 14    /* timestamp reply */\n#define ICMP_IRQ 15    /* information request */\n#define ICMP_IR  16    /* information reply */\n#define ICMP_AM  17    /* address mask request */\n#define ICMP_AMR 18    /* address mask reply */\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\n/** This is the standard ICMP header only that the u32_t data\n *  is split to two u16_t like ICMP echo needs it.\n *  This header is also used for other ICMP types that do not\n *  use the data part.\n */\nPACK_STRUCT_BEGIN\nstruct icmp_echo_hdr {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t code);\n  PACK_STRUCT_FIELD(u16_t chksum);\n  PACK_STRUCT_FIELD(u16_t id);\n  PACK_STRUCT_FIELD(u16_t seqno);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/* Compatibility defines, old versions used to combine type and code to an u16_t */\n#define ICMPH_TYPE(hdr) ((hdr)->type)\n#define ICMPH_CODE(hdr) ((hdr)->code)\n#define ICMPH_TYPE_SET(hdr, t) ((hdr)->type = (t))\n#define ICMPH_CODE_SET(hdr, c) ((hdr)->code = (c))\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_ICMP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/icmp6.h",
    "content": "/**\n * @file\n * ICMP6 protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_ICMP6_H\n#define LWIP_HDR_PROT_ICMP6_H\n\n#include \"lwip/arch.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** ICMP type */\nenum icmp6_type {\n  /** Destination unreachable */\n  ICMP6_TYPE_DUR = 1,\n  /** Packet too big */\n  ICMP6_TYPE_PTB = 2,\n  /** Time exceeded */\n  ICMP6_TYPE_TE = 3,\n  /** Parameter problem */\n  ICMP6_TYPE_PP = 4,\n  /** Private experimentation */\n  ICMP6_TYPE_PE1 = 100,\n  /** Private experimentation */\n  ICMP6_TYPE_PE2 = 101,\n  /** Reserved for expansion of error messages */\n  ICMP6_TYPE_RSV_ERR = 127,\n\n  /** Echo request */\n  ICMP6_TYPE_EREQ = 128,\n  /** Echo reply */\n  ICMP6_TYPE_EREP = 129,\n  /** Multicast listener query */\n  ICMP6_TYPE_MLQ = 130,\n  /** Multicast listener report */\n  ICMP6_TYPE_MLR = 131,\n  /** Multicast listener done */\n  ICMP6_TYPE_MLD = 132,\n  /** Router solicitation */\n  ICMP6_TYPE_RS = 133,\n  /** Router advertisement */\n  ICMP6_TYPE_RA = 134,\n  /** Neighbor solicitation */\n  ICMP6_TYPE_NS = 135,\n  /** Neighbor advertisement */\n  ICMP6_TYPE_NA = 136,\n  /** Redirect */\n  ICMP6_TYPE_RD = 137,\n  /** Multicast router advertisement */\n  ICMP6_TYPE_MRA = 151,\n  /** Multicast router solicitation */\n  ICMP6_TYPE_MRS = 152,\n  /** Multicast router termination */\n  ICMP6_TYPE_MRT = 153,\n  /** Private experimentation */\n  ICMP6_TYPE_PE3 = 200,\n  /** Private experimentation */\n  ICMP6_TYPE_PE4 = 201,\n  /** Reserved for expansion of informational messages */\n  ICMP6_TYPE_RSV_INF = 255\n};\n\n/** ICMP destination unreachable codes */\nenum icmp6_dur_code {\n  /** No route to destination */\n  ICMP6_DUR_NO_ROUTE = 0,\n  /** Communication with destination administratively prohibited */\n  ICMP6_DUR_PROHIBITED = 1,\n  /** Beyond scope of source address */\n  ICMP6_DUR_SCOPE = 2,\n  /** Address unreachable */\n  ICMP6_DUR_ADDRESS = 3,\n  /** Port unreachable */\n  ICMP6_DUR_PORT = 4,\n  /** Source address failed ingress/egress policy */\n  ICMP6_DUR_POLICY = 5,\n  /** Reject route to destination */\n  ICMP6_DUR_REJECT_ROUTE = 6\n};\n\n/** ICMP time exceeded codes */\nenum icmp6_te_code {\n  /** Hop limit exceeded in transit */\n  ICMP6_TE_HL = 0,\n  /** Fragment reassembly time exceeded */\n  ICMP6_TE_FRAG = 1\n};\n\n/** ICMP parameter code */\nenum icmp6_pp_code {\n  /** Erroneous header field encountered */\n  ICMP6_PP_FIELD = 0,\n  /** Unrecognized next header type encountered */\n  ICMP6_PP_HEADER = 1,\n  /** Unrecognized IPv6 option encountered */\n  ICMP6_PP_OPTION = 2\n};\n\n/** This is the standard ICMP6 header. */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct icmp6_hdr {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t code);\n  PACK_STRUCT_FIELD(u16_t chksum);\n  PACK_STRUCT_FIELD(u32_t data);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** This is the ICMP6 header adapted for echo req/resp. */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct icmp6_echo_hdr {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t code);\n  PACK_STRUCT_FIELD(u16_t chksum);\n  PACK_STRUCT_FIELD(u16_t id);\n  PACK_STRUCT_FIELD(u16_t seqno);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_ICMP6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/igmp.h",
    "content": "/**\n * @file\n * IGMP protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_IGMP_H\n#define LWIP_HDR_PROT_IGMP_H\n\n#include \"lwip/arch.h\"\n#include \"lwip/ip4_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * IGMP constants\n */\n#define IGMP_TTL                       1\n#define IGMP_MINLEN                    8\n#define ROUTER_ALERT                   0x9404U\n#define ROUTER_ALERTLEN                4\n\n/*\n * IGMP message types, including version number.\n */\n#define IGMP_MEMB_QUERY                0x11 /* Membership query         */\n#define IGMP_V1_MEMB_REPORT            0x12 /* Ver. 1 membership report */\n#define IGMP_V2_MEMB_REPORT            0x16 /* Ver. 2 membership report */\n#define IGMP_LEAVE_GROUP               0x17 /* Leave-group message      */\n\n/* Group  membership states */\n#define IGMP_GROUP_NON_MEMBER          0\n#define IGMP_GROUP_DELAYING_MEMBER     1\n#define IGMP_GROUP_IDLE_MEMBER         2\n\n/**\n * IGMP packet format.\n */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct igmp_msg {\n  PACK_STRUCT_FLD_8(u8_t         igmp_msgtype);\n  PACK_STRUCT_FLD_8(u8_t         igmp_maxresp);\n  PACK_STRUCT_FIELD(u16_t        igmp_checksum);\n  PACK_STRUCT_FLD_S(ip4_addr_p_t igmp_group_address);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_IGMP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/ip.h",
    "content": "/**\n * @file\n * IP protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_IP_H\n#define LWIP_HDR_PROT_IP_H\n\n#include \"lwip/arch.h\"\n\n#define IP_PROTO_ICMP    1\n#define IP_PROTO_IGMP    2\n#define IP_PROTO_UDP     17\n#define IP_PROTO_UDPLITE 136\n#define IP_PROTO_TCP     6\n\n/** This operates on a void* by loading the first byte */\n#define IP_HDR_GET_VERSION(ptr)   ((*(u8_t*)(ptr)) >> 4)\n\n#endif /* LWIP_HDR_PROT_IP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/ip4.h",
    "content": "/**\n * @file\n * IPv4 protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_IP4_H\n#define LWIP_HDR_PROT_IP4_H\n\n#include \"lwip/arch.h\"\n#include \"lwip/ip4_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** This is the packed version of ip4_addr_t,\n    used in network headers that are itself packed */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct ip4_addr_packed {\n  PACK_STRUCT_FIELD(u32_t addr);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\ntypedef struct ip4_addr_packed ip4_addr_p_t;\n\n/* Size of the IPv4 header. Same as 'sizeof(struct ip_hdr)'. */\n#define IP_HLEN 20\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\n/* The IPv4 header */\nstruct ip_hdr {\n  /* version / header length */\n  PACK_STRUCT_FLD_8(u8_t _v_hl);\n  /* type of service */\n  PACK_STRUCT_FLD_8(u8_t _tos);\n  /* total length */\n  PACK_STRUCT_FIELD(u16_t _len);\n  /* identification */\n  PACK_STRUCT_FIELD(u16_t _id);\n  /* fragment offset field */\n  PACK_STRUCT_FIELD(u16_t _offset);\n#define IP_RF 0x8000U        /* reserved fragment flag */\n#define IP_DF 0x4000U        /* don't fragment flag */\n#define IP_MF 0x2000U        /* more fragments flag */\n#define IP_OFFMASK 0x1fffU   /* mask for fragmenting bits */\n  /* time to live */\n  PACK_STRUCT_FLD_8(u8_t _ttl);\n  /* protocol*/\n  PACK_STRUCT_FLD_8(u8_t _proto);\n  /* checksum */\n  PACK_STRUCT_FIELD(u16_t _chksum);\n  /* source and destination IP addresses */\n  PACK_STRUCT_FLD_S(ip4_addr_p_t src);\n  PACK_STRUCT_FLD_S(ip4_addr_p_t dest);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/* Macros to get struct ip_hdr fields: */\n#define IPH_V(hdr)  ((hdr)->_v_hl >> 4)\n#define IPH_HL(hdr) ((hdr)->_v_hl & 0x0f)\n#define IPH_TOS(hdr) ((hdr)->_tos)\n#define IPH_LEN(hdr) ((hdr)->_len)\n#define IPH_ID(hdr) ((hdr)->_id)\n#define IPH_OFFSET(hdr) ((hdr)->_offset)\n#define IPH_TTL(hdr) ((hdr)->_ttl)\n#define IPH_PROTO(hdr) ((hdr)->_proto)\n#define IPH_CHKSUM(hdr) ((hdr)->_chksum)\n\n/* Macros to set struct ip_hdr fields: */\n#define IPH_VHL_SET(hdr, v, hl) (hdr)->_v_hl = (u8_t)((((v) << 4) | (hl)))\n#define IPH_TOS_SET(hdr, tos) (hdr)->_tos = (tos)\n#define IPH_LEN_SET(hdr, len) (hdr)->_len = (len)\n#define IPH_ID_SET(hdr, id) (hdr)->_id = (id)\n#define IPH_OFFSET_SET(hdr, off) (hdr)->_offset = (off)\n#define IPH_TTL_SET(hdr, ttl) (hdr)->_ttl = (u8_t)(ttl)\n#define IPH_PROTO_SET(hdr, proto) (hdr)->_proto = (u8_t)(proto)\n#define IPH_CHKSUM_SET(hdr, chksum) (hdr)->_chksum = (chksum)\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_IP4_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/ip6.h",
    "content": "/**\n * @file\n * IPv6 protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_IP6_H\n#define LWIP_HDR_PROT_IP6_H\n\n#include \"lwip/arch.h\"\n#include \"lwip/ip6_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n   \n/** This is the packed version of ip6_addr_t,\n    used in network headers that are itself packed */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct ip6_addr_packed {\n  PACK_STRUCT_FIELD(u32_t addr[4]);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\ntypedef struct ip6_addr_packed ip6_addr_p_t;\n\n#define IP6_HLEN 40\n\n#define IP6_NEXTH_HOPBYHOP  0\n#define IP6_NEXTH_TCP       6\n#define IP6_NEXTH_UDP       17\n#define IP6_NEXTH_ENCAPS    41\n#define IP6_NEXTH_ROUTING   43\n#define IP6_NEXTH_FRAGMENT  44\n#define IP6_NEXTH_ICMP6     58\n#define IP6_NEXTH_NONE      59\n#define IP6_NEXTH_DESTOPTS  60\n#define IP6_NEXTH_UDPLITE   136\n\n/** The IPv6 header. */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct ip6_hdr {\n  /** version / traffic class / flow label */\n  PACK_STRUCT_FIELD(u32_t _v_tc_fl);\n  /** payload length */\n  PACK_STRUCT_FIELD(u16_t _plen);\n  /** next header */\n  PACK_STRUCT_FLD_8(u8_t _nexth);\n  /** hop limit */\n  PACK_STRUCT_FLD_8(u8_t _hoplim);\n  /** source and destination IP addresses */\n  PACK_STRUCT_FLD_S(ip6_addr_p_t src);\n  PACK_STRUCT_FLD_S(ip6_addr_p_t dest);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/* Hop-by-hop router alert option. */\n#define IP6_HBH_HLEN    8\n#define IP6_PAD1_OPTION         0\n#define IP6_PADN_ALERT_OPTION   1\n#define IP6_ROUTER_ALERT_OPTION 5\n#define IP6_ROUTER_ALERT_VALUE_MLD 0\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct ip6_hbh_hdr {\n  /* next header */\n  PACK_STRUCT_FLD_8(u8_t _nexth);\n  /* header length */\n  PACK_STRUCT_FLD_8(u8_t _hlen);\n  /* router alert option type */\n  PACK_STRUCT_FLD_8(u8_t _ra_opt_type);\n  /* router alert option data len */\n  PACK_STRUCT_FLD_8(u8_t _ra_opt_dlen);\n  /* router alert option data */\n  PACK_STRUCT_FIELD(u16_t _ra_opt_data);\n  /* PadN option type */\n  PACK_STRUCT_FLD_8(u8_t _padn_opt_type);\n  /* PadN option data len */\n  PACK_STRUCT_FLD_8(u8_t _padn_opt_dlen);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/* Fragment header. */\n#define IP6_FRAG_HLEN    8\n#define IP6_FRAG_OFFSET_MASK    0xfff8\n#define IP6_FRAG_MORE_FLAG      0x0001\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct ip6_frag_hdr {\n  /* next header */\n  PACK_STRUCT_FLD_8(u8_t _nexth);\n  /* reserved */\n  PACK_STRUCT_FLD_8(u8_t reserved);\n  /* fragment offset */\n  PACK_STRUCT_FIELD(u16_t _fragment_offset);\n  /* fragmented packet identification */\n  PACK_STRUCT_FIELD(u32_t _identification);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#define IP6H_V(hdr)  ((lwip_ntohl((hdr)->_v_tc_fl) >> 28) & 0x0f)\n#define IP6H_TC(hdr) ((lwip_ntohl((hdr)->_v_tc_fl) >> 20) & 0xff)\n#define IP6H_FL(hdr) (lwip_ntohl((hdr)->_v_tc_fl) & 0x000fffff)\n#define IP6H_PLEN(hdr) (lwip_ntohs((hdr)->_plen))\n#define IP6H_NEXTH(hdr) ((hdr)->_nexth)\n#define IP6H_NEXTH_P(hdr) ((u8_t *)(hdr) + 6)\n#define IP6H_HOPLIM(hdr) ((hdr)->_hoplim)\n\n#define IP6H_VTCFL_SET(hdr, v, tc, fl) (hdr)->_v_tc_fl = (lwip_htonl((((u32_t)(v)) << 28) | (((u32_t)(tc)) << 20) | (fl)))\n#define IP6H_PLEN_SET(hdr, plen) (hdr)->_plen = lwip_htons(plen)\n#define IP6H_NEXTH_SET(hdr, nexth) (hdr)->_nexth = (nexth)\n#define IP6H_HOPLIM_SET(hdr, hl) (hdr)->_hoplim = (u8_t)(hl)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_IP6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/mld6.h",
    "content": "/**\n * @file\n * MLD6 protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_MLD6_H\n#define LWIP_HDR_PROT_MLD6_H\n\n#include \"lwip/arch.h\"\n#include \"lwip/prot/ip6.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** Multicast listener report/query/done message header. */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct mld_header {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t code);\n  PACK_STRUCT_FIELD(u16_t chksum);\n  PACK_STRUCT_FIELD(u16_t max_resp_delay);\n  PACK_STRUCT_FIELD(u16_t reserved);\n  PACK_STRUCT_FLD_S(ip6_addr_p_t multicast_address);\n  /* Options follow. */\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_MLD6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/nd6.h",
    "content": "/**\n * @file\n * ND6 protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_ND6_H\n#define LWIP_HDR_PROT_ND6_H\n\n#include \"lwip/arch.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/prot/ip6.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** Neighbor solicitation message header. */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct ns_header {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t code);\n  PACK_STRUCT_FIELD(u16_t chksum);\n  PACK_STRUCT_FIELD(u32_t reserved);\n  PACK_STRUCT_FLD_S(ip6_addr_p_t target_address);\n  /* Options follow. */\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** Neighbor advertisement message header. */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct na_header {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t code);\n  PACK_STRUCT_FIELD(u16_t chksum);\n  PACK_STRUCT_FLD_8(u8_t flags);\n  PACK_STRUCT_FLD_8(u8_t reserved[3]);\n  PACK_STRUCT_FLD_S(ip6_addr_p_t target_address);\n  /* Options follow. */\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n#define ND6_FLAG_ROUTER      (0x80)\n#define ND6_FLAG_SOLICITED   (0x40)\n#define ND6_FLAG_OVERRIDE    (0x20)\n\n/** Router solicitation message header. */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct rs_header {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t code);\n  PACK_STRUCT_FIELD(u16_t chksum);\n  PACK_STRUCT_FIELD(u32_t reserved);\n  /* Options follow. */\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** Router advertisement message header. */\n#define ND6_RA_FLAG_MANAGED_ADDR_CONFIG (0x80)\n#define ND6_RA_FLAG_OTHER_CONFIG (0x40)\n#define ND6_RA_FLAG_HOME_AGENT (0x20)\n#define ND6_RA_PREFERENCE_MASK (0x18)\n#define ND6_RA_PREFERENCE_HIGH (0x08)\n#define ND6_RA_PREFERENCE_MEDIUM (0x00)\n#define ND6_RA_PREFERENCE_LOW (0x18)\n#define ND6_RA_PREFERENCE_DISABLED (0x10)\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct ra_header {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t code);\n  PACK_STRUCT_FIELD(u16_t chksum);\n  PACK_STRUCT_FLD_8(u8_t current_hop_limit);\n  PACK_STRUCT_FLD_8(u8_t flags);\n  PACK_STRUCT_FIELD(u16_t router_lifetime);\n  PACK_STRUCT_FIELD(u32_t reachable_time);\n  PACK_STRUCT_FIELD(u32_t retrans_timer);\n  /* Options follow. */\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** Redirect message header. */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct redirect_header {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t code);\n  PACK_STRUCT_FIELD(u16_t chksum);\n  PACK_STRUCT_FIELD(u32_t reserved);\n  PACK_STRUCT_FLD_S(ip6_addr_p_t target_address);\n  PACK_STRUCT_FLD_S(ip6_addr_p_t destination_address);\n  /* Options follow. */\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** Link-layer address option. */\n#define ND6_OPTION_TYPE_SOURCE_LLADDR (0x01)\n#define ND6_OPTION_TYPE_TARGET_LLADDR (0x02)\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct lladdr_option {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t length);\n  PACK_STRUCT_FLD_8(u8_t addr[NETIF_MAX_HWADDR_LEN]);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** Prefix information option. */\n#define ND6_OPTION_TYPE_PREFIX_INFO (0x03)\n#define ND6_PREFIX_FLAG_ON_LINK (0x80)\n#define ND6_PREFIX_FLAG_AUTONOMOUS (0x40)\n#define ND6_PREFIX_FLAG_ROUTER_ADDRESS (0x20)\n#define ND6_PREFIX_FLAG_SITE_PREFIX (0x10)\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct prefix_option {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t length);\n  PACK_STRUCT_FLD_8(u8_t prefix_length);\n  PACK_STRUCT_FLD_8(u8_t flags);\n  PACK_STRUCT_FIELD(u32_t valid_lifetime);\n  PACK_STRUCT_FIELD(u32_t preferred_lifetime);\n  PACK_STRUCT_FLD_8(u8_t reserved2[3]);\n  PACK_STRUCT_FLD_8(u8_t site_prefix_length);\n  PACK_STRUCT_FLD_S(ip6_addr_p_t prefix);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** Redirected header option. */\n#define ND6_OPTION_TYPE_REDIR_HDR (0x04)\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct redirected_header_option {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t length);\n  PACK_STRUCT_FLD_8(u8_t reserved[6]);\n  /* Portion of redirected packet follows. */\n  /* PACK_STRUCT_FLD_8(u8_t redirected[8]); */\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** MTU option. */\n#define ND6_OPTION_TYPE_MTU (0x05)\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct mtu_option {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t length);\n  PACK_STRUCT_FIELD(u16_t reserved);\n  PACK_STRUCT_FIELD(u32_t mtu);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** Route information option. */\n#define ND6_OPTION_TYPE_ROUTE_INFO (24)\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct route_option {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t length);\n  PACK_STRUCT_FLD_8(u8_t prefix_length);\n  PACK_STRUCT_FLD_8(u8_t preference);\n  PACK_STRUCT_FIELD(u32_t route_lifetime);\n  PACK_STRUCT_FLD_S(ip6_addr_p_t prefix);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/** Recursive DNS Server Option. */\n#if LWIP_ND6_RDNSS_MAX_DNS_SERVERS\n#define LWIP_RDNSS_OPTION_MAX_SERVERS LWIP_ND6_RDNSS_MAX_DNS_SERVERS\n#else\n#define LWIP_RDNSS_OPTION_MAX_SERVERS 1\n#endif\n#define ND6_OPTION_TYPE_RDNSS (25)\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct rdnss_option {\n  PACK_STRUCT_FLD_8(u8_t type);\n  PACK_STRUCT_FLD_8(u8_t length);\n  PACK_STRUCT_FIELD(u16_t reserved);\n  PACK_STRUCT_FIELD(u32_t lifetime);\n  PACK_STRUCT_FLD_S(ip6_addr_p_t rdnss_address[LWIP_RDNSS_OPTION_MAX_SERVERS]);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_ND6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/tcp.h",
    "content": "/**\n * @file\n * TCP protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_TCP_H\n#define LWIP_HDR_PROT_TCP_H\n\n#include \"lwip/arch.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Length of the TCP header, excluding options. */\n#define TCP_HLEN 20\n\n/* Fields are (of course) in network byte order.\n * Some fields are converted to host byte order in tcp_input().\n */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct tcp_hdr {\n  PACK_STRUCT_FIELD(u16_t src);\n  PACK_STRUCT_FIELD(u16_t dest);\n  PACK_STRUCT_FIELD(u32_t seqno);\n  PACK_STRUCT_FIELD(u32_t ackno);\n  PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags);\n  PACK_STRUCT_FIELD(u16_t wnd);\n  PACK_STRUCT_FIELD(u16_t chksum);\n  PACK_STRUCT_FIELD(u16_t urgp);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/* TCP header flags bits */\n#define TCP_FIN 0x01U\n#define TCP_SYN 0x02U\n#define TCP_RST 0x04U\n#define TCP_PSH 0x08U\n#define TCP_ACK 0x10U\n#define TCP_URG 0x20U\n#define TCP_ECE 0x40U\n#define TCP_CWR 0x80U\n/* Valid TCP header flags */\n#define TCP_FLAGS 0x3fU\n\n#define TCPH_HDRLEN(phdr) ((u16_t)(lwip_ntohs((phdr)->_hdrlen_rsvd_flags) >> 12))\n#define TCPH_FLAGS(phdr)  ((u16_t)(lwip_ntohs((phdr)->_hdrlen_rsvd_flags) & TCP_FLAGS))\n\n#define TCPH_HDRLEN_SET(phdr, len) (phdr)->_hdrlen_rsvd_flags = lwip_htons(((len) << 12) | TCPH_FLAGS(phdr))\n#define TCPH_FLAGS_SET(phdr, flags) (phdr)->_hdrlen_rsvd_flags = (((phdr)->_hdrlen_rsvd_flags & PP_HTONS(~TCP_FLAGS)) | lwip_htons(flags))\n#define TCPH_HDRLEN_FLAGS_SET(phdr, len, flags) (phdr)->_hdrlen_rsvd_flags = (u16_t)(lwip_htons((u16_t)((len) << 12) | (flags)))\n\n#define TCPH_SET_FLAG(phdr, flags ) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags | lwip_htons(flags))\n#define TCPH_UNSET_FLAG(phdr, flags) (phdr)->_hdrlen_rsvd_flags = ((phdr)->_hdrlen_rsvd_flags & ~lwip_htons(flags))\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_TCP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/prot/udp.h",
    "content": "/**\n * @file\n * UDP protocol definitions\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_PROT_UDP_H\n#define LWIP_HDR_PROT_UDP_H\n\n#include \"lwip/arch.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define UDP_HLEN 8\n\n/* Fields are (of course) in network byte order. */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct udp_hdr {\n  PACK_STRUCT_FIELD(u16_t src);\n  PACK_STRUCT_FIELD(u16_t dest);  /* src/dest UDP ports */\n  PACK_STRUCT_FIELD(u16_t len);\n  PACK_STRUCT_FIELD(u16_t chksum);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_PROT_UDP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/raw.h",
    "content": "/**\n * @file\n * raw API (to be used from TCPIP thread)\\n\n * See also @ref raw_raw\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_RAW_H\n#define LWIP_HDR_RAW_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_RAW /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/def.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/ip6_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct raw_pcb;\n\n/** Function prototype for raw pcb receive callback functions.\n * @param arg user supplied argument (raw_pcb.recv_arg)\n * @param pcb the raw_pcb which received data\n * @param p the packet buffer that was received\n * @param addr the remote IP address from which the packet was received\n * @return 1 if the packet was 'eaten' (aka. deleted),\n *         0 if the packet lives on\n * If returning 1, the callback is responsible for freeing the pbuf\n * if it's not used any more.\n */\ntypedef u8_t (*raw_recv_fn)(void *arg, struct raw_pcb *pcb, struct pbuf *p,\n    const ip_addr_t *addr);\n\n/** the RAW protocol control block */\nstruct raw_pcb {\n  /* Common members of all PCB types */\n  IP_PCB;\n\n  struct raw_pcb *next;\n\n  u8_t protocol;\n\n  /** receive callback function */\n  raw_recv_fn recv;\n  /* user-supplied argument for the recv callback */\n  void *recv_arg;\n#if LWIP_IPV6\n  /* fields for handling checksum computations as per RFC3542. */\n  u16_t chksum_offset;\n  u8_t  chksum_reqd;\n#endif\n};\n\n/* The following functions is the application layer interface to the\n   RAW code. */\nstruct raw_pcb * raw_new        (u8_t proto);\nstruct raw_pcb * raw_new_ip_type(u8_t type, u8_t proto);\nvoid             raw_remove     (struct raw_pcb *pcb);\nerr_t            raw_bind       (struct raw_pcb *pcb, const ip_addr_t *ipaddr);\nerr_t            raw_connect    (struct raw_pcb *pcb, const ip_addr_t *ipaddr);\n\nerr_t            raw_sendto     (struct raw_pcb *pcb, struct pbuf *p, const ip_addr_t *ipaddr);\nerr_t            raw_send       (struct raw_pcb *pcb, struct pbuf *p);\n\nvoid             raw_recv       (struct raw_pcb *pcb, raw_recv_fn recv, void *recv_arg);\n\n/* The following functions are the lower layer interface to RAW. */\nu8_t             raw_input      (struct pbuf *p, struct netif *inp);\n#define raw_init() /* Compatibility define, no init needed. */\n\nvoid raw_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr);\n\n/* for compatibility with older implementation */\n#define raw_new_ip6(proto) raw_new_ip_type(IPADDR_TYPE_V6, proto)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_RAW */\n\n#endif /* LWIP_HDR_RAW_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/sio.h",
    "content": "/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n */\n\n/*\n * This is the interface to the platform specific serial IO module\n * It needs to be implemented by those platforms which need SLIP or PPP\n */\n\n#ifndef SIO_H\n#define SIO_H\n\n#include \"lwip/arch.h\"\n#include \"lwip/opt.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* If you want to define sio_fd_t elsewhere or differently,\n   define this in your cc.h file. */\n#ifndef __sio_fd_t_defined\ntypedef void * sio_fd_t;\n#endif\n\n/* The following functions can be defined to something else in your cc.h file\n   or be implemented in your custom sio.c file. */\n\n#ifndef sio_open\n/**\n * Opens a serial device for communication.\n *\n * @param devnum device number\n * @return handle to serial device if successful, NULL otherwise\n */\nsio_fd_t sio_open(u8_t devnum);\n#endif\n\n#ifndef sio_send\n/**\n * Sends a single character to the serial device.\n *\n * @param c character to send\n * @param fd serial device handle\n *\n * @note This function will block until the character can be sent.\n */\nvoid sio_send(u8_t c, sio_fd_t fd);\n#endif\n\n#ifndef sio_recv\n/**\n * Receives a single character from the serial device.\n *\n * @param fd serial device handle\n *\n * @note This function will block until a character is received.\n */\nu8_t sio_recv(sio_fd_t fd);\n#endif\n\n#ifndef sio_read\n/**\n * Reads from the serial device.\n *\n * @param fd serial device handle\n * @param data pointer to data buffer for receiving\n * @param len maximum length (in bytes) of data to receive\n * @return number of bytes actually received - may be 0 if aborted by sio_read_abort\n *\n * @note This function will block until data can be received. The blocking\n * can be cancelled by calling sio_read_abort().\n */\nu32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len);\n#endif\n\n#ifndef sio_tryread\n/**\n * Tries to read from the serial device. Same as sio_read but returns\n * immediately if no data is available and never blocks.\n *\n * @param fd serial device handle\n * @param data pointer to data buffer for receiving\n * @param len maximum length (in bytes) of data to receive\n * @return number of bytes actually received\n */\nu32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len);\n#endif\n\n#ifndef sio_write\n/**\n * Writes to the serial device.\n *\n * @param fd serial device handle\n * @param data pointer to data to send\n * @param len length (in bytes) of data to send\n * @return number of bytes actually sent\n *\n * @note This function will block until all data can be sent.\n */\nu32_t sio_write(sio_fd_t fd, u8_t *data, u32_t len);\n#endif\n\n#ifndef sio_read_abort\n/**\n * Aborts a blocking sio_read() call.\n *\n * @param fd serial device handle\n */\nvoid sio_read_abort(sio_fd_t fd);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* SIO_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/snmp.h",
    "content": "/**\n * @file\n * SNMP support API for implementing netifs and statitics for MIB2\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Dirk Ziegelmeier <dziegel@gmx.de>\n *\n */\n#ifndef LWIP_HDR_SNMP_H\n#define LWIP_HDR_SNMP_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/ip_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct udp_pcb;\nstruct netif;\n\n/**\n * @defgroup netif_mib2 MIB2 statistics\n * @ingroup netif\n */\n\n/* MIB2 statistics functions */\n#if MIB2_STATS  /* don't build if not configured for use in lwipopts.h */\n/**\n * @ingroup netif_mib2\n * @see RFC1213, \"MIB-II, 6. Definitions\"\n */\nenum snmp_ifType {\n  snmp_ifType_other=1,                /* none of the following */\n  snmp_ifType_regular1822,\n  snmp_ifType_hdh1822,\n  snmp_ifType_ddn_x25,\n  snmp_ifType_rfc877_x25,\n  snmp_ifType_ethernet_csmacd,\n  snmp_ifType_iso88023_csmacd,\n  snmp_ifType_iso88024_tokenBus,\n  snmp_ifType_iso88025_tokenRing,\n  snmp_ifType_iso88026_man,\n  snmp_ifType_starLan,\n  snmp_ifType_proteon_10Mbit,\n  snmp_ifType_proteon_80Mbit,\n  snmp_ifType_hyperchannel,\n  snmp_ifType_fddi,\n  snmp_ifType_lapb,\n  snmp_ifType_sdlc,\n  snmp_ifType_ds1,                    /* T-1 */\n  snmp_ifType_e1,                     /* european equiv. of T-1 */\n  snmp_ifType_basicISDN,\n  snmp_ifType_primaryISDN,            /* proprietary serial */\n  snmp_ifType_propPointToPointSerial,\n  snmp_ifType_ppp,\n  snmp_ifType_softwareLoopback,\n  snmp_ifType_eon,                    /* CLNP over IP [11] */\n  snmp_ifType_ethernet_3Mbit,\n  snmp_ifType_nsip,                   /* XNS over IP */\n  snmp_ifType_slip,                   /* generic SLIP */\n  snmp_ifType_ultra,                  /* ULTRA technologies */\n  snmp_ifType_ds3,                    /* T-3 */\n  snmp_ifType_sip,                    /* SMDS */\n  snmp_ifType_frame_relay\n};\n\n/** This macro has a precision of ~49 days because sys_now returns u32_t. \\#define your own if you want ~490 days. */\n#ifndef MIB2_COPY_SYSUPTIME_TO\n#define MIB2_COPY_SYSUPTIME_TO(ptrToVal) (*(ptrToVal) = (sys_now() / 10))\n#endif\n\n/**\n * @ingroup netif_mib2\n * Increment stats member for SNMP MIB2 stats (struct stats_mib2_netif_ctrs)\n */\n#define MIB2_STATS_NETIF_INC(n, x)      do { ++(n)->mib2_counters.x; } while(0)\n/**\n * @ingroup netif_mib2\n * Add value to stats member for SNMP MIB2 stats (struct stats_mib2_netif_ctrs)\n */\n#define MIB2_STATS_NETIF_ADD(n, x, val) do { (n)->mib2_counters.x += (val); } while(0)\n\n/**\n * @ingroup netif_mib2\n * Init MIB2 statistic counters in netif\n * @param netif Netif to init\n * @param type one of enum @ref snmp_ifType\n * @param speed your link speed here (units: bits per second)\n */\n#define MIB2_INIT_NETIF(netif, type, speed) do { \\\n  (netif)->link_type = (type);  \\\n  (netif)->link_speed = (speed);\\\n  (netif)->ts = 0;              \\\n  (netif)->mib2_counters.ifinoctets = 0;      \\\n  (netif)->mib2_counters.ifinucastpkts = 0;   \\\n  (netif)->mib2_counters.ifinnucastpkts = 0;  \\\n  (netif)->mib2_counters.ifindiscards = 0;    \\\n  (netif)->mib2_counters.ifinerrors = 0;    \\\n  (netif)->mib2_counters.ifinunknownprotos = 0;    \\\n  (netif)->mib2_counters.ifoutoctets = 0;     \\\n  (netif)->mib2_counters.ifoutucastpkts = 0;  \\\n  (netif)->mib2_counters.ifoutnucastpkts = 0; \\\n  (netif)->mib2_counters.ifoutdiscards = 0; \\\n  (netif)->mib2_counters.ifouterrors = 0; } while(0)\n#else /* MIB2_STATS */\n#ifndef MIB2_COPY_SYSUPTIME_TO\n#define MIB2_COPY_SYSUPTIME_TO(ptrToVal)\n#endif\n#define MIB2_INIT_NETIF(netif, type, speed)\n#define MIB2_STATS_NETIF_INC(n, x)\n#define MIB2_STATS_NETIF_ADD(n, x, val)\n#endif /* MIB2_STATS */\n\n/* LWIP MIB2 callbacks */\n#if LWIP_MIB2_CALLBACKS /* don't build if not configured for use in lwipopts.h */\n/* network interface */\nvoid mib2_netif_added(struct netif *ni);\nvoid mib2_netif_removed(struct netif *ni);\n\n#if LWIP_IPV4 && LWIP_ARP\n/* ARP (for atTable and ipNetToMediaTable) */\nvoid mib2_add_arp_entry(struct netif *ni, ip4_addr_t *ip);\nvoid mib2_remove_arp_entry(struct netif *ni, ip4_addr_t *ip);\n#else /* LWIP_IPV4 && LWIP_ARP */\n#define mib2_add_arp_entry(ni,ip)\n#define mib2_remove_arp_entry(ni,ip)\n#endif /* LWIP_IPV4 && LWIP_ARP */\n\n/* IP */\n#if LWIP_IPV4\nvoid mib2_add_ip4(struct netif *ni);\nvoid mib2_remove_ip4(struct netif *ni);\nvoid mib2_add_route_ip4(u8_t dflt, struct netif *ni);\nvoid mib2_remove_route_ip4(u8_t dflt, struct netif *ni);\n#endif /* LWIP_IPV4 */\n\n/* UDP */\n#if LWIP_UDP\nvoid mib2_udp_bind(struct udp_pcb *pcb);\nvoid mib2_udp_unbind(struct udp_pcb *pcb);\n#endif /* LWIP_UDP */\n\n#else /* LWIP_MIB2_CALLBACKS */\n/* LWIP_MIB2_CALLBACKS support not available */\n/* define everything to be empty */\n\n/* network interface */\n#define mib2_netif_added(ni)\n#define mib2_netif_removed(ni)\n\n/* ARP */\n#define mib2_add_arp_entry(ni,ip)\n#define mib2_remove_arp_entry(ni,ip)\n\n/* IP */\n#define mib2_add_ip4(ni)\n#define mib2_remove_ip4(ni)\n#define mib2_add_route_ip4(dflt, ni)\n#define mib2_remove_route_ip4(dflt, ni)\n\n/* UDP */\n#define mib2_udp_bind(pcb)\n#define mib2_udp_unbind(pcb)\n#endif /* LWIP_MIB2_CALLBACKS */\n\n/* for source-code compatibility reasons only, can be removed (not used internally) */\n#define NETIF_INIT_SNMP                MIB2_INIT_NETIF\n#define snmp_add_ifinoctets(ni,value)  MIB2_STATS_NETIF_ADD(ni, ifinoctets, value)\n#define snmp_inc_ifinucastpkts(ni)     MIB2_STATS_NETIF_INC(ni, ifinucastpkts)\n#define snmp_inc_ifinnucastpkts(ni)    MIB2_STATS_NETIF_INC(ni, ifinnucastpkts)\n#define snmp_inc_ifindiscards(ni)      MIB2_STATS_NETIF_INC(ni, ifindiscards)\n#define snmp_inc_ifinerrors(ni)        MIB2_STATS_NETIF_INC(ni, ifinerrors)\n#define snmp_inc_ifinunknownprotos(ni) MIB2_STATS_NETIF_INC(ni, ifinunknownprotos)\n#define snmp_add_ifoutoctets(ni,value) MIB2_STATS_NETIF_ADD(ni, ifoutoctets, value)\n#define snmp_inc_ifoutucastpkts(ni)    MIB2_STATS_NETIF_INC(ni, ifoutucastpkts)\n#define snmp_inc_ifoutnucastpkts(ni)   MIB2_STATS_NETIF_INC(ni, ifoutnucastpkts)\n#define snmp_inc_ifoutdiscards(ni)     MIB2_STATS_NETIF_INC(ni, ifoutdiscards)\n#define snmp_inc_ifouterrors(ni)       MIB2_STATS_NETIF_INC(ni, ifouterrors)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_SNMP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/sockets.h",
    "content": "/**\n * @file\n * Socket API (to be used from non-TCPIP threads)\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n\n#ifndef LWIP_HDR_SOCKETS_H\n#define LWIP_HDR_SOCKETS_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_SOCKET /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/ip_addr.h\"\n#include \"lwip/err.h\"\n#include \"lwip/inet.h\"\n#include \"lwip/errno.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* If your port already typedef's sa_family_t, define SA_FAMILY_T_DEFINED\n   to prevent this code from redefining it. */\n#if !defined(sa_family_t) && !defined(SA_FAMILY_T_DEFINED)\ntypedef u8_t sa_family_t;\n#endif\n/* If your port already typedef's in_port_t, define IN_PORT_T_DEFINED\n   to prevent this code from redefining it. */\n#if !defined(in_port_t) && !defined(IN_PORT_T_DEFINED)\ntypedef u16_t in_port_t;\n#endif\n\n#if LWIP_IPV4\n/* members are in network byte order */\nstruct sockaddr_in {\n  u8_t            sin_len;\n  sa_family_t     sin_family;\n  in_port_t       sin_port;\n  struct in_addr  sin_addr;\n#define SIN_ZERO_LEN 8\n  char            sin_zero[SIN_ZERO_LEN];\n};\n#endif /* LWIP_IPV4 */\n\n#if LWIP_IPV6\nstruct sockaddr_in6 {\n  u8_t            sin6_len;      /* length of this structure    */\n  sa_family_t     sin6_family;   /* AF_INET6                    */\n  in_port_t       sin6_port;     /* Transport layer port #      */\n  u32_t           sin6_flowinfo; /* IPv6 flow information       */\n  struct in6_addr sin6_addr;     /* IPv6 address                */\n  u32_t           sin6_scope_id; /* Set of interfaces for scope */\n};\n#endif /* LWIP_IPV6 */\n\nstruct sockaddr {\n  u8_t        sa_len;\n  sa_family_t sa_family;\n  char        sa_data[14];\n};\n\nstruct sockaddr_storage {\n  u8_t        s2_len;\n  sa_family_t ss_family;\n  char        s2_data1[2];\n  u32_t       s2_data2[3];\n#if LWIP_IPV6\n  u32_t       s2_data3[3];\n#endif /* LWIP_IPV6 */\n};\n\n/* If your port already typedef's socklen_t, define SOCKLEN_T_DEFINED\n   to prevent this code from redefining it. */\n#if !defined(socklen_t) && !defined(SOCKLEN_T_DEFINED)\ntypedef u32_t socklen_t;\n#endif\n\nstruct lwip_sock;\n\n#if !LWIP_TCPIP_CORE_LOCKING\n/** Maximum optlen used by setsockopt/getsockopt */\n#define LWIP_SETGETSOCKOPT_MAXOPTLEN 16\n\n/** This struct is used to pass data to the set/getsockopt_internal\n * functions running in tcpip_thread context (only a void* is allowed) */\nstruct lwip_setgetsockopt_data {\n  /** socket index for which to change options */\n  int s;\n  /** level of the option to process */\n  int level;\n  /** name of the option to process */\n  int optname;\n  /** set: value to set the option to\n    * get: value of the option is stored here */\n#if LWIP_MPU_COMPATIBLE\n  u8_t optval[LWIP_SETGETSOCKOPT_MAXOPTLEN];\n#else\n  union {\n     void *p;\n     const void *pc;\n  } optval;\n#endif\n  /** size of *optval */\n  socklen_t optlen;\n  /** if an error occurs, it is temporarily stored here */\n  err_t err;\n  /** semaphore to wake up the calling task */\n  void* completed_sem;\n};\n#endif /* !LWIP_TCPIP_CORE_LOCKING */\n\n#if !defined(iovec)\nstruct iovec {\n  void  *iov_base;\n  size_t iov_len;\n};\n#endif\n\nstruct msghdr {\n  void         *msg_name;\n  socklen_t     msg_namelen;\n  struct iovec *msg_iov;\n  int           msg_iovlen;\n  void         *msg_control;\n  socklen_t     msg_controllen;\n  int           msg_flags;\n};\n\n/* Socket protocol types (TCP/UDP/RAW) */\n#define SOCK_STREAM     1\n#define SOCK_DGRAM      2\n#define SOCK_RAW        3\n\n/*\n * Option flags per-socket. These must match the SOF_ flags in ip.h (checked in init.c)\n */\n#define SO_REUSEADDR   0x0004 /* Allow local address reuse */\n#define SO_KEEPALIVE   0x0008 /* keep connections alive */\n#define SO_BROADCAST   0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */\n\n\n/*\n * Additional options, not kept in so_options.\n */\n#define SO_DEBUG       0x0001 /* Unimplemented: turn on debugging info recording */\n#define SO_ACCEPTCONN  0x0002 /* socket has had listen() */\n#define SO_DONTROUTE   0x0010 /* Unimplemented: just use interface addresses */\n#define SO_USELOOPBACK 0x0040 /* Unimplemented: bypass hardware when possible */\n#define SO_LINGER      0x0080 /* linger on close if data present */\n#define SO_DONTLINGER  ((int)(~SO_LINGER))\n#define SO_OOBINLINE   0x0100 /* Unimplemented: leave received OOB data in line */\n#define SO_REUSEPORT   0x0200 /* Unimplemented: allow local address & port reuse */\n#define SO_SNDBUF      0x1001 /* Unimplemented: send buffer size */\n#define SO_RCVBUF      0x1002 /* receive buffer size */\n#define SO_SNDLOWAT    0x1003 /* Unimplemented: send low-water mark */\n#define SO_RCVLOWAT    0x1004 /* Unimplemented: receive low-water mark */\n#define SO_SNDTIMEO    0x1005 /* send timeout */\n#define SO_RCVTIMEO    0x1006 /* receive timeout */\n#define SO_ERROR       0x1007 /* get error status and clear */\n#define SO_TYPE        0x1008 /* get socket type */\n#define SO_CONTIMEO    0x1009 /* Unimplemented: connect timeout */\n#define SO_NO_CHECK    0x100a /* don't create UDP checksum */\n\n\n/*\n * Structure used for manipulating linger option.\n */\nstruct linger {\n       int l_onoff;                /* option on/off */\n       int l_linger;               /* linger time in seconds */\n};\n\n/*\n * Level number for (get/set)sockopt() to apply to socket itself.\n */\n#define  SOL_SOCKET  0xfff    /* options for socket level */\n\n\n#define AF_UNSPEC       0\n#define AF_INET         2\n#if LWIP_IPV6\n#define AF_INET6        10\n#else /* LWIP_IPV6 */\n#define AF_INET6        AF_UNSPEC\n#endif /* LWIP_IPV6 */\n#define PF_INET         AF_INET\n#define PF_INET6        AF_INET6\n#define PF_UNSPEC       AF_UNSPEC\n\n#define IPPROTO_IP      0\n#define IPPROTO_ICMP    1\n#define IPPROTO_TCP     6\n#define IPPROTO_UDP     17\n#if LWIP_IPV6\n#define IPPROTO_IPV6    41\n#define IPPROTO_ICMPV6  58\n#endif /* LWIP_IPV6 */\n#define IPPROTO_UDPLITE 136\n#define IPPROTO_RAW     255\n\n/* Flags we can use with send and recv. */\n#define MSG_PEEK       0x01    /* Peeks at an incoming message */\n#define MSG_WAITALL    0x02    /* Unimplemented: Requests that the function block until the full amount of data requested can be returned */\n#define MSG_OOB        0x04    /* Unimplemented: Requests out-of-band data. The significance and semantics of out-of-band data are protocol-specific */\n#define MSG_DONTWAIT   0x08    /* Nonblocking i/o for this operation only */\n#define MSG_MORE       0x10    /* Sender will send more */\n\n\n/*\n * Options for level IPPROTO_IP\n */\n#define IP_TOS             1\n#define IP_TTL             2\n\n#if LWIP_TCP\n/*\n * Options for level IPPROTO_TCP\n */\n#define TCP_NODELAY    0x01    /* don't delay send to coalesce packets */\n#define TCP_KEEPALIVE  0x02    /* send KEEPALIVE probes when idle for pcb->keep_idle milliseconds */\n#define TCP_KEEPIDLE   0x03    /* set pcb->keep_idle  - Same as TCP_KEEPALIVE, but use seconds for get/setsockopt */\n#define TCP_KEEPINTVL  0x04    /* set pcb->keep_intvl - Use seconds for get/setsockopt */\n#define TCP_KEEPCNT    0x05    /* set pcb->keep_cnt   - Use number of probes sent for get/setsockopt */\n#endif /* LWIP_TCP */\n\n#if LWIP_IPV6\n/*\n * Options for level IPPROTO_IPV6\n */\n#define IPV6_CHECKSUM       7  /* RFC3542: calculate and insert the ICMPv6 checksum for raw sockets. */\n#define IPV6_V6ONLY         27 /* RFC3493: boolean control to restrict AF_INET6 sockets to IPv6 communications only. */\n#endif /* LWIP_IPV6 */\n\n#if LWIP_UDP && LWIP_UDPLITE\n/*\n * Options for level IPPROTO_UDPLITE\n */\n#define UDPLITE_SEND_CSCOV 0x01 /* sender checksum coverage */\n#define UDPLITE_RECV_CSCOV 0x02 /* minimal receiver checksum coverage */\n#endif /* LWIP_UDP && LWIP_UDPLITE*/\n\n\n#if LWIP_MULTICAST_TX_OPTIONS\n/*\n * Options and types for UDP multicast traffic handling\n */\n#define IP_MULTICAST_TTL   5\n#define IP_MULTICAST_IF    6\n#define IP_MULTICAST_LOOP  7\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n\n#if LWIP_IGMP\n/*\n * Options and types related to multicast membership\n */\n#define IP_ADD_MEMBERSHIP  3\n#define IP_DROP_MEMBERSHIP 4\n\ntypedef struct ip_mreq {\n    struct in_addr imr_multiaddr; /* IP multicast address of group */\n    struct in_addr imr_interface; /* local IP address of interface */\n} ip_mreq;\n#endif /* LWIP_IGMP */\n\n/*\n * The Type of Service provides an indication of the abstract\n * parameters of the quality of service desired.  These parameters are\n * to be used to guide the selection of the actual service parameters\n * when transmitting a datagram through a particular network.  Several\n * networks offer service precedence, which somehow treats high\n * precedence traffic as more important than other traffic (generally\n * by accepting only traffic above a certain precedence at time of high\n * load).  The major choice is a three way tradeoff between low-delay,\n * high-reliability, and high-throughput.\n * The use of the Delay, Throughput, and Reliability indications may\n * increase the cost (in some sense) of the service.  In many networks\n * better performance for one of these parameters is coupled with worse\n * performance on another.  Except for very unusual cases at most two\n * of these three indications should be set.\n */\n#define IPTOS_TOS_MASK          0x1E\n#define IPTOS_TOS(tos)          ((tos) & IPTOS_TOS_MASK)\n#define IPTOS_LOWDELAY          0x10\n#define IPTOS_THROUGHPUT        0x08\n#define IPTOS_RELIABILITY       0x04\n#define IPTOS_LOWCOST           0x02\n#define IPTOS_MINCOST           IPTOS_LOWCOST\n\n/*\n * The Network Control precedence designation is intended to be used\n * within a network only.  The actual use and control of that\n * designation is up to each network. The Internetwork Control\n * designation is intended for use by gateway control originators only.\n * If the actual use of these precedence designations is of concern to\n * a particular network, it is the responsibility of that network to\n * control the access to, and use of, those precedence designations.\n */\n#define IPTOS_PREC_MASK                 0xe0\n#define IPTOS_PREC(tos)                ((tos) & IPTOS_PREC_MASK)\n#define IPTOS_PREC_NETCONTROL           0xe0\n#define IPTOS_PREC_INTERNETCONTROL      0xc0\n#define IPTOS_PREC_CRITIC_ECP           0xa0\n#define IPTOS_PREC_FLASHOVERRIDE        0x80\n#define IPTOS_PREC_FLASH                0x60\n#define IPTOS_PREC_IMMEDIATE            0x40\n#define IPTOS_PREC_PRIORITY             0x20\n#define IPTOS_PREC_ROUTINE              0x00\n\n\n/*\n * Commands for ioctlsocket(),  taken from the BSD file fcntl.h.\n * lwip_ioctl only supports FIONREAD and FIONBIO, for now\n *\n * Ioctl's have the command encoded in the lower word,\n * and the size of any in or out parameters in the upper\n * word.  The high 2 bits of the upper word are used\n * to encode the in/out status of the parameter; for now\n * we restrict parameters to at most 128 bytes.\n */\n#if !defined(FIONREAD) || !defined(FIONBIO)\n#define IOCPARM_MASK    0x7fU           /* parameters must be < 128 bytes */\n#define IOC_VOID        0x20000000UL    /* no parameters */\n#define IOC_OUT         0x40000000UL    /* copy out parameters */\n#define IOC_IN          0x80000000UL    /* copy in parameters */\n#define IOC_INOUT       (IOC_IN|IOC_OUT)\n                                        /* 0x20000000 distinguishes new &\n                                           old ioctl's */\n#define _IO(x,y)        (IOC_VOID|((x)<<8)|(y))\n\n#define _IOR(x,y,t)     (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))\n\n#define _IOW(x,y,t)     (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))\n#endif /* !defined(FIONREAD) || !defined(FIONBIO) */\n\n#ifndef FIONREAD\n#define FIONREAD    _IOR('f', 127, unsigned long) /* get # bytes to read */\n#endif\n#ifndef FIONBIO\n#define FIONBIO     _IOW('f', 126, unsigned long) /* set/clear non-blocking i/o */\n#endif\n\n/* Socket I/O Controls: unimplemented */\n#ifndef SIOCSHIWAT\n#define SIOCSHIWAT  _IOW('s',  0, unsigned long)  /* set high watermark */\n#define SIOCGHIWAT  _IOR('s',  1, unsigned long)  /* get high watermark */\n#define SIOCSLOWAT  _IOW('s',  2, unsigned long)  /* set low watermark */\n#define SIOCGLOWAT  _IOR('s',  3, unsigned long)  /* get low watermark */\n#define SIOCATMARK  _IOR('s',  7, unsigned long)  /* at oob mark? */\n#endif\n\n/* commands for fnctl */\n#ifndef F_GETFL\n#define F_GETFL 3\n#endif\n#ifndef F_SETFL\n#define F_SETFL 4\n#endif\n\n/* File status flags and file access modes for fnctl,\n   these are bits in an int. */\n#ifndef O_NONBLOCK\n#define O_NONBLOCK  1 /* nonblocking I/O */\n#endif\n#ifndef O_NDELAY\n#define O_NDELAY    1 /* same as O_NONBLOCK, for compatibility */\n#endif\n\n#ifndef SHUT_RD\n  #define SHUT_RD   0\n  #define SHUT_WR   1\n  #define SHUT_RDWR 2\n#endif\n\n/* FD_SET used for lwip_select */\n#ifndef FD_SET\n#undef  FD_SETSIZE\n/* Make FD_SETSIZE match NUM_SOCKETS in socket.c */\n#define FD_SETSIZE    MEMP_NUM_NETCONN\n#define FDSETSAFESET(n, code) do { \\\n  if (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0)) { \\\n  code; }} while(0)\n#define FDSETSAFEGET(n, code) (((n) - LWIP_SOCKET_OFFSET < MEMP_NUM_NETCONN) && (((int)(n) - LWIP_SOCKET_OFFSET) >= 0) ?\\\n  (code) : 0)\n#define FD_SET(n, p)  FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] |=  (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))\n#define FD_CLR(n, p)  FDSETSAFESET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &= ~(1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))\n#define FD_ISSET(n,p) FDSETSAFEGET(n, (p)->fd_bits[((n)-LWIP_SOCKET_OFFSET)/8] &   (1 << (((n)-LWIP_SOCKET_OFFSET) & 7)))\n#define FD_ZERO(p)    memset((void*)(p), 0, sizeof(*(p)))\n\ntypedef struct fd_set\n{\n  unsigned char fd_bits [(FD_SETSIZE+7)/8];\n} fd_set;\n\n#elif LWIP_SOCKET_OFFSET\n#error LWIP_SOCKET_OFFSET does not work with external FD_SET!\n#elif FD_SETSIZE < MEMP_NUM_NETCONN\n#error \"external FD_SETSIZE too small for number of sockets\"\n#endif /* FD_SET */\n\n/** LWIP_TIMEVAL_PRIVATE: if you want to use the struct timeval provided\n * by your system, set this to 0 and include <sys/time.h> in cc.h */\n#ifndef LWIP_TIMEVAL_PRIVATE\n#define LWIP_TIMEVAL_PRIVATE 1\n#endif\n\n#if LWIP_TIMEVAL_PRIVATE\nstruct timeval {\n  long    tv_sec;         /* seconds */\n  long    tv_usec;        /* and microseconds */\n};\n#endif /* LWIP_TIMEVAL_PRIVATE */\n\n#define lwip_socket_init() /* Compatibility define, no init needed. */\nvoid lwip_socket_thread_init(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: initialize thread-local semaphore */\nvoid lwip_socket_thread_cleanup(void); /* LWIP_NETCONN_SEM_PER_THREAD==1: destroy thread-local semaphore */\n\n#if LWIP_COMPAT_SOCKETS == 2\n/* This helps code parsers/code completion by not having the COMPAT functions as defines */\n#define lwip_accept       accept\n#define lwip_bind         bind\n#define lwip_shutdown     shutdown\n#define lwip_getpeername  getpeername\n#define lwip_getsockname  getsockname\n#define lwip_setsockopt   setsockopt\n#define lwip_getsockopt   getsockopt\n#define lwip_close        closesocket\n#define lwip_connect      connect\n#define lwip_listen       listen\n#define lwip_recv         recv\n#define lwip_recvfrom     recvfrom\n#define lwip_send         send\n#define lwip_sendmsg      sendmsg\n#define lwip_sendto       sendto\n#define lwip_socket       socket\n#define lwip_select       select\n#define lwip_ioctlsocket  ioctl\n\n#if LWIP_POSIX_SOCKETS_IO_NAMES\n#define lwip_read         read\n#define lwip_write        write\n#define lwip_writev       writev\n#undef lwip_close\n#define lwip_close        close\n#define closesocket(s)    close(s)\n#define lwip_fcntl        fcntl\n#define lwip_ioctl        ioctl\n#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */\n#endif /* LWIP_COMPAT_SOCKETS == 2 */\n\nint lwip_accept(int s, struct sockaddr *addr, socklen_t *addrlen);\nint lwip_bind(int s, const struct sockaddr *name, socklen_t namelen);\nint lwip_shutdown(int s, int how);\nint lwip_getpeername (int s, struct sockaddr *name, socklen_t *namelen);\nint lwip_getsockname (int s, struct sockaddr *name, socklen_t *namelen);\nint lwip_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen);\nint lwip_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen);\nint lwip_close(int s);\nint lwip_connect(int s, const struct sockaddr *name, socklen_t namelen);\nint lwip_listen(int s, int backlog);\nint lwip_recv(int s, void *mem, size_t len, int flags);\nint lwip_read(int s, void *mem, size_t len);\nint lwip_recvfrom(int s, void *mem, size_t len, int flags,\n      struct sockaddr *from, socklen_t *fromlen);\nint lwip_send(int s, const void *dataptr, size_t size, int flags);\nint lwip_sendmsg(int s, const struct msghdr *message, int flags);\nint lwip_sendto(int s, const void *dataptr, size_t size, int flags,\n    const struct sockaddr *to, socklen_t tolen);\nint lwip_socket(int domain, int type, int protocol);\nint lwip_write(int s, const void *dataptr, size_t size);\nint lwip_writev(int s, const struct iovec *iov, int iovcnt);\nint lwip_select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,\n                struct timeval *timeout);\nint lwip_ioctl(int s, long cmd, void *argp);\nint lwip_fcntl(int s, int cmd, int val);\n\n#if LWIP_COMPAT_SOCKETS\n#if LWIP_COMPAT_SOCKETS != 2\n/** @ingroup socket */\n#define accept(s,addr,addrlen)                    lwip_accept(s,addr,addrlen)\n/** @ingroup socket */\n#define bind(s,name,namelen)                      lwip_bind(s,name,namelen)\n/** @ingroup socket */\n#define shutdown(s,how)                           lwip_shutdown(s,how)\n/** @ingroup socket */\n#define getpeername(s,name,namelen)               lwip_getpeername(s,name,namelen)\n/** @ingroup socket */\n#define getsockname(s,name,namelen)               lwip_getsockname(s,name,namelen)\n/** @ingroup socket */\n#define setsockopt(s,level,optname,opval,optlen)  lwip_setsockopt(s,level,optname,opval,optlen)\n/** @ingroup socket */\n#define getsockopt(s,level,optname,opval,optlen)  lwip_getsockopt(s,level,optname,opval,optlen)\n/** @ingroup socket */\n#define closesocket(s)                            lwip_close(s)\n/** @ingroup socket */\n#define connect(s,name,namelen)                   lwip_connect(s,name,namelen)\n/** @ingroup socket */\n#define listen(s,backlog)                         lwip_listen(s,backlog)\n/** @ingroup socket */\n#define recv(s,mem,len,flags)                     lwip_recv(s,mem,len,flags)\n/** @ingroup socket */\n#define recvfrom(s,mem,len,flags,from,fromlen)    lwip_recvfrom(s,mem,len,flags,from,fromlen)\n/** @ingroup socket */\n#define send(s,dataptr,size,flags)                lwip_send(s,dataptr,size,flags)\n/** @ingroup socket */\n#define sendmsg(s,message,flags)                  lwip_sendmsg(s,message,flags)\n/** @ingroup socket */\n#define sendto(s,dataptr,size,flags,to,tolen)     lwip_sendto(s,dataptr,size,flags,to,tolen)\n/** @ingroup socket */\n#define socket(domain,type,protocol)              lwip_socket(domain,type,protocol)\n/** @ingroup socket */\n#define select(maxfdp1,readset,writeset,exceptset,timeout)     lwip_select(maxfdp1,readset,writeset,exceptset,timeout)\n/** @ingroup socket */\n#define ioctlsocket(s,cmd,argp)                   lwip_ioctl(s,cmd,argp)\n\n#if LWIP_POSIX_SOCKETS_IO_NAMES\n/** @ingroup socket */\n#define read(s,mem,len)                           lwip_read(s,mem,len)\n/** @ingroup socket */\n#define write(s,dataptr,len)                      lwip_write(s,dataptr,len)\n/** @ingroup socket */\n#define writev(s,iov,iovcnt)                      lwip_writev(s,iov,iovcnt)\n/** @ingroup socket */\n#define close(s)                                  lwip_close(s)\n/** @ingroup socket */\n#define fcntl(s,cmd,val)                          lwip_fcntl(s,cmd,val)\n/** @ingroup socket */\n#define ioctl(s,cmd,argp)                         lwip_ioctl(s,cmd,argp)\n#endif /* LWIP_POSIX_SOCKETS_IO_NAMES */\n#endif /* LWIP_COMPAT_SOCKETS != 2 */\n\n#if LWIP_IPV4 && LWIP_IPV6\n/** @ingroup socket */\n#define inet_ntop(af,src,dst,size) \\\n    (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) \\\n     : (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL))\n/** @ingroup socket */\n#define inet_pton(af,src,dst) \\\n    (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) \\\n     : (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0))\n#elif LWIP_IPV4 /* LWIP_IPV4 && LWIP_IPV6 */\n#define inet_ntop(af,src,dst,size) \\\n    (((af) == AF_INET) ? ip4addr_ntoa_r((const ip4_addr_t*)(src),(dst),(size)) : NULL)\n#define inet_pton(af,src,dst) \\\n    (((af) == AF_INET) ? ip4addr_aton((src),(ip4_addr_t*)(dst)) : 0)\n#else /* LWIP_IPV4 && LWIP_IPV6 */\n#define inet_ntop(af,src,dst,size) \\\n    (((af) == AF_INET6) ? ip6addr_ntoa_r((const ip6_addr_t*)(src),(dst),(size)) : NULL)\n#define inet_pton(af,src,dst) \\\n    (((af) == AF_INET6) ? ip6addr_aton((src),(ip6_addr_t*)(dst)) : 0)\n#endif /* LWIP_IPV4 && LWIP_IPV6 */\n\n#endif /* LWIP_COMPAT_SOCKETS */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_SOCKET */\n\n#endif /* LWIP_HDR_SOCKETS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/stats.h",
    "content": "/**\n * @file\n * Statistics API (to be used from TCPIP thread)\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_STATS_H\n#define LWIP_HDR_STATS_H\n\n#include \"lwip/opt.h\"\n\n#include \"lwip/mem.h\"\n#include \"lwip/memp.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_STATS\n\n#ifndef LWIP_STATS_LARGE\n#define LWIP_STATS_LARGE 0\n#endif\n\n#if LWIP_STATS_LARGE\n#define STAT_COUNTER     u32_t\n#define STAT_COUNTER_F   U32_F\n#else\n#define STAT_COUNTER     u16_t\n#define STAT_COUNTER_F   U16_F\n#endif\n\n/** Protocol related stats */\nstruct stats_proto {\n  STAT_COUNTER xmit;             /* Transmitted packets. */\n  STAT_COUNTER recv;             /* Received packets. */\n  STAT_COUNTER fw;               /* Forwarded packets. */\n  STAT_COUNTER drop;             /* Dropped packets. */\n  STAT_COUNTER chkerr;           /* Checksum error. */\n  STAT_COUNTER lenerr;           /* Invalid length error. */\n  STAT_COUNTER memerr;           /* Out of memory error. */\n  STAT_COUNTER rterr;            /* Routing error. */\n  STAT_COUNTER proterr;          /* Protocol error. */\n  STAT_COUNTER opterr;           /* Error in options. */\n  STAT_COUNTER err;              /* Misc error. */\n  STAT_COUNTER cachehit;\n};\n\n/** IGMP stats */\nstruct stats_igmp {\n  STAT_COUNTER xmit;             /* Transmitted packets. */\n  STAT_COUNTER recv;             /* Received packets. */\n  STAT_COUNTER drop;             /* Dropped packets. */\n  STAT_COUNTER chkerr;           /* Checksum error. */\n  STAT_COUNTER lenerr;           /* Invalid length error. */\n  STAT_COUNTER memerr;           /* Out of memory error. */\n  STAT_COUNTER proterr;          /* Protocol error. */\n  STAT_COUNTER rx_v1;            /* Received v1 frames. */\n  STAT_COUNTER rx_group;         /* Received group-specific queries. */\n  STAT_COUNTER rx_general;       /* Received general queries. */\n  STAT_COUNTER rx_report;        /* Received reports. */\n  STAT_COUNTER tx_join;          /* Sent joins. */\n  STAT_COUNTER tx_leave;         /* Sent leaves. */\n  STAT_COUNTER tx_report;        /* Sent reports. */\n};\n\n/** Memory stats */\nstruct stats_mem {\n#if defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY\n  const char *name;\n#endif /* defined(LWIP_DEBUG) || LWIP_STATS_DISPLAY */\n  STAT_COUNTER err;\n  mem_size_t avail;\n  mem_size_t used;\n  mem_size_t max;\n  STAT_COUNTER illegal;\n};\n\n/** System element stats */\nstruct stats_syselem {\n  STAT_COUNTER used;\n  STAT_COUNTER max;\n  STAT_COUNTER err;\n};\n\n/** System stats */\nstruct stats_sys {\n  struct stats_syselem sem;\n  struct stats_syselem mutex;\n  struct stats_syselem mbox;\n};\n\n/** SNMP MIB2 stats */\nstruct stats_mib2 {\n  /* IP */\n  u32_t ipinhdrerrors;\n  u32_t ipinaddrerrors;\n  u32_t ipinunknownprotos;\n  u32_t ipindiscards;\n  u32_t ipindelivers;\n  u32_t ipoutrequests;\n  u32_t ipoutdiscards;\n  u32_t ipoutnoroutes;\n  u32_t ipreasmoks;\n  u32_t ipreasmfails;\n  u32_t ipfragoks;\n  u32_t ipfragfails;\n  u32_t ipfragcreates;\n  u32_t ipreasmreqds;\n  u32_t ipforwdatagrams;\n  u32_t ipinreceives;\n\n  /* TCP */\n  u32_t tcpactiveopens;\n  u32_t tcppassiveopens;\n  u32_t tcpattemptfails;\n  u32_t tcpestabresets;\n  u32_t tcpoutsegs;\n  u32_t tcpretranssegs;\n  u32_t tcpinsegs;\n  u32_t tcpinerrs;\n  u32_t tcpoutrsts;\n\n  /* UDP */\n  u32_t udpindatagrams;\n  u32_t udpnoports;\n  u32_t udpinerrors;\n  u32_t udpoutdatagrams;\n\n  /* ICMP */\n  u32_t icmpinmsgs;\n  u32_t icmpinerrors;\n  u32_t icmpindestunreachs;\n  u32_t icmpintimeexcds;\n  u32_t icmpinparmprobs;\n  u32_t icmpinsrcquenchs;\n  u32_t icmpinredirects;\n  u32_t icmpinechos;\n  u32_t icmpinechoreps;\n  u32_t icmpintimestamps;\n  u32_t icmpintimestampreps;\n  u32_t icmpinaddrmasks;\n  u32_t icmpinaddrmaskreps;\n  u32_t icmpoutmsgs;\n  u32_t icmpouterrors;\n  u32_t icmpoutdestunreachs;\n  u32_t icmpouttimeexcds;\n  u32_t icmpoutechos; /* can be incremented by user application ('ping') */\n  u32_t icmpoutechoreps;\n};\n\n/**\n * @ingroup netif_mib2\n * SNMP MIB2 interface stats\n */\nstruct stats_mib2_netif_ctrs {\n  /** The total number of octets received on the interface, including framing characters */\n  u32_t ifinoctets;\n  /** The number of packets, delivered by this sub-layer to a higher (sub-)layer, which were\n   * not addressed to a multicast or broadcast address at this sub-layer */\n  u32_t ifinucastpkts;\n  /** The number of packets, delivered by this sub-layer to a higher (sub-)layer, which were\n   * addressed to a multicast or broadcast address at this sub-layer */\n  u32_t ifinnucastpkts;\n  /** The number of inbound packets which were chosen to be discarded even though no errors had\n   * been detected to prevent their being deliverable to a higher-layer protocol. One possible\n   * reason for discarding such a packet could be to free up buffer space */\n  u32_t ifindiscards;\n  /** For packet-oriented interfaces, the number of inbound packets that contained errors\n   * preventing them from being deliverable to a higher-layer protocol.  For character-\n   * oriented or fixed-length interfaces, the number of inbound transmission units that\n   * contained errors preventing them from being deliverable to a higher-layer protocol. */\n  u32_t ifinerrors;\n  /** For packet-oriented interfaces, the number of packets received via the interface which\n   * were discarded because of an unknown or unsupported protocol.  For character-oriented\n   * or fixed-length interfaces that support protocol multiplexing the number of transmission\n   * units received via the interface which were discarded because of an unknown or unsupported\n   * protocol. For any interface that does not support protocol multiplexing, this counter will\n   * always be 0 */\n  u32_t ifinunknownprotos;\n  /** The total number of octets transmitted out of the interface, including framing characters. */\n  u32_t ifoutoctets;\n  /** The total number of packets that higher-level protocols requested be transmitted, and\n   * which were not addressed to a multicast or broadcast address at this sub-layer, including\n   * those that were discarded or not sent. */\n  u32_t ifoutucastpkts;\n  /** The total number of packets that higher-level protocols requested be transmitted, and which\n   * were addressed to a multicast or broadcast address at this sub-layer, including\n   * those that were discarded or not sent. */\n  u32_t ifoutnucastpkts;\n  /** The number of outbound packets which were chosen to be discarded even though no errors had\n   * been detected to prevent their being transmitted.  One possible reason for discarding\n   * such a packet could be to free up buffer space. */\n  u32_t ifoutdiscards;\n  /** For packet-oriented interfaces, the number of outbound packets that could not be transmitted\n   * because of errors. For character-oriented or fixed-length interfaces, the number of outbound\n   * transmission units that could not be transmitted because of errors. */\n  u32_t ifouterrors;\n};\n\n/** lwIP stats container */\nstruct stats_ {\n#if LINK_STATS\n  /** Link level */\n  struct stats_proto link;\n#endif\n#if ETHARP_STATS\n  /** ARP */\n  struct stats_proto etharp;\n#endif\n#if IPFRAG_STATS\n  /** Fragmentation */\n  struct stats_proto ip_frag;\n#endif\n#if IP_STATS\n  /** IP */\n  struct stats_proto ip;\n#endif\n#if ICMP_STATS\n  /** ICMP */\n  struct stats_proto icmp;\n#endif\n#if IGMP_STATS\n  /** IGMP */\n  struct stats_igmp igmp;\n#endif\n#if UDP_STATS\n  /** UDP */\n  struct stats_proto udp;\n#endif\n#if TCP_STATS\n  /** TCP */\n  struct stats_proto tcp;\n#endif\n#if MEM_STATS\n  /** Heap */\n  struct stats_mem mem;\n#endif\n#if MEMP_STATS\n  /** Internal memory pools */\n  struct stats_mem *memp[MEMP_MAX];\n#endif\n#if SYS_STATS\n  /** System */\n  struct stats_sys sys;\n#endif\n#if IP6_STATS\n  /** IPv6 */\n  struct stats_proto ip6;\n#endif\n#if ICMP6_STATS\n  /** ICMP6 */\n  struct stats_proto icmp6;\n#endif\n#if IP6_FRAG_STATS\n  /** IPv6 fragmentation */\n  struct stats_proto ip6_frag;\n#endif\n#if MLD6_STATS\n  /** Multicast listener discovery */\n  struct stats_igmp mld6;\n#endif\n#if ND6_STATS\n  /** Neighbor discovery */\n  struct stats_proto nd6;\n#endif\n#if MIB2_STATS\n  /** SNMP MIB2 */\n  struct stats_mib2 mib2;\n#endif\n};\n\n/** Global variable containing lwIP internal statistics. Add this to your debugger's watchlist. */\nextern struct stats_ lwip_stats;\n\n/** Init statistics */\nvoid stats_init(void);\n\n#define STATS_INC(x) ++lwip_stats.x\n#define STATS_DEC(x) --lwip_stats.x\n#define STATS_INC_USED(x, y) do { lwip_stats.x.used += y; \\\n                                if (lwip_stats.x.max < lwip_stats.x.used) { \\\n                                    lwip_stats.x.max = lwip_stats.x.used; \\\n                                } \\\n                             } while(0)\n#define STATS_GET(x) lwip_stats.x\n#else /* LWIP_STATS */\n#define stats_init()\n#define STATS_INC(x)\n#define STATS_DEC(x)\n#define STATS_INC_USED(x)\n#endif /* LWIP_STATS */\n\n#if TCP_STATS\n#define TCP_STATS_INC(x) STATS_INC(x)\n#define TCP_STATS_DISPLAY() stats_display_proto(&lwip_stats.tcp, \"TCP\")\n#else\n#define TCP_STATS_INC(x)\n#define TCP_STATS_DISPLAY()\n#endif\n\n#if UDP_STATS\n#define UDP_STATS_INC(x) STATS_INC(x)\n#define UDP_STATS_DISPLAY() stats_display_proto(&lwip_stats.udp, \"UDP\")\n#else\n#define UDP_STATS_INC(x)\n#define UDP_STATS_DISPLAY()\n#endif\n\n#if ICMP_STATS\n#define ICMP_STATS_INC(x) STATS_INC(x)\n#define ICMP_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp, \"ICMP\")\n#else\n#define ICMP_STATS_INC(x)\n#define ICMP_STATS_DISPLAY()\n#endif\n\n#if IGMP_STATS\n#define IGMP_STATS_INC(x) STATS_INC(x)\n#define IGMP_STATS_DISPLAY() stats_display_igmp(&lwip_stats.igmp, \"IGMP\")\n#else\n#define IGMP_STATS_INC(x)\n#define IGMP_STATS_DISPLAY()\n#endif\n\n#if IP_STATS\n#define IP_STATS_INC(x) STATS_INC(x)\n#define IP_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip, \"IP\")\n#else\n#define IP_STATS_INC(x)\n#define IP_STATS_DISPLAY()\n#endif\n\n#if IPFRAG_STATS\n#define IPFRAG_STATS_INC(x) STATS_INC(x)\n#define IPFRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip_frag, \"IP_FRAG\")\n#else\n#define IPFRAG_STATS_INC(x)\n#define IPFRAG_STATS_DISPLAY()\n#endif\n\n#if ETHARP_STATS\n#define ETHARP_STATS_INC(x) STATS_INC(x)\n#define ETHARP_STATS_DISPLAY() stats_display_proto(&lwip_stats.etharp, \"ETHARP\")\n#else\n#define ETHARP_STATS_INC(x)\n#define ETHARP_STATS_DISPLAY()\n#endif\n\n#if LINK_STATS\n#define LINK_STATS_INC(x) STATS_INC(x)\n#define LINK_STATS_DISPLAY() stats_display_proto(&lwip_stats.link, \"LINK\")\n#else\n#define LINK_STATS_INC(x)\n#define LINK_STATS_DISPLAY()\n#endif\n\n#if MEM_STATS\n#define MEM_STATS_AVAIL(x, y) lwip_stats.mem.x = y\n#define MEM_STATS_INC(x) SYS_ARCH_INC(lwip_stats.mem.x, 1)\n#define MEM_STATS_INC_USED(x, y) SYS_ARCH_INC(lwip_stats.mem.x, y)\n#define MEM_STATS_DEC_USED(x, y) SYS_ARCH_DEC(lwip_stats.mem.x, y)\n#define MEM_STATS_DISPLAY() stats_display_mem(&lwip_stats.mem, \"HEAP\")\n#else\n#define MEM_STATS_AVAIL(x, y)\n#define MEM_STATS_INC(x)\n#define MEM_STATS_INC_USED(x, y)\n#define MEM_STATS_DEC_USED(x, y)\n#define MEM_STATS_DISPLAY()\n#endif\n\n #if MEMP_STATS\n#define MEMP_STATS_DEC(x, i) STATS_DEC(memp[i]->x)\n#define MEMP_STATS_DISPLAY(i) stats_display_memp(lwip_stats.memp[i], i)\n#define MEMP_STATS_GET(x, i) STATS_GET(memp[i]->x)\n #else\n#define MEMP_STATS_DEC(x, i)\n#define MEMP_STATS_DISPLAY(i)\n#define MEMP_STATS_GET(x, i) 0\n#endif\n\n#if SYS_STATS\n#define SYS_STATS_INC(x) STATS_INC(sys.x)\n#define SYS_STATS_DEC(x) STATS_DEC(sys.x)\n#define SYS_STATS_INC_USED(x) STATS_INC_USED(sys.x, 1)\n#define SYS_STATS_DISPLAY() stats_display_sys(&lwip_stats.sys)\n#else\n#define SYS_STATS_INC(x)\n#define SYS_STATS_DEC(x)\n#define SYS_STATS_INC_USED(x)\n#define SYS_STATS_DISPLAY()\n#endif\n\n#if IP6_STATS\n#define IP6_STATS_INC(x) STATS_INC(x)\n#define IP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6, \"IPv6\")\n#else\n#define IP6_STATS_INC(x)\n#define IP6_STATS_DISPLAY()\n#endif\n\n#if ICMP6_STATS\n#define ICMP6_STATS_INC(x) STATS_INC(x)\n#define ICMP6_STATS_DISPLAY() stats_display_proto(&lwip_stats.icmp6, \"ICMPv6\")\n#else\n#define ICMP6_STATS_INC(x)\n#define ICMP6_STATS_DISPLAY()\n#endif\n\n#if IP6_FRAG_STATS\n#define IP6_FRAG_STATS_INC(x) STATS_INC(x)\n#define IP6_FRAG_STATS_DISPLAY() stats_display_proto(&lwip_stats.ip6_frag, \"IPv6 FRAG\")\n#else\n#define IP6_FRAG_STATS_INC(x)\n#define IP6_FRAG_STATS_DISPLAY()\n#endif\n\n#if MLD6_STATS\n#define MLD6_STATS_INC(x) STATS_INC(x)\n#define MLD6_STATS_DISPLAY() stats_display_igmp(&lwip_stats.mld6, \"MLDv1\")\n#else\n#define MLD6_STATS_INC(x)\n#define MLD6_STATS_DISPLAY()\n#endif\n\n#if ND6_STATS\n#define ND6_STATS_INC(x) STATS_INC(x)\n#define ND6_STATS_DISPLAY() stats_display_proto(&lwip_stats.nd6, \"ND\")\n#else\n#define ND6_STATS_INC(x)\n#define ND6_STATS_DISPLAY()\n#endif\n\n#if MIB2_STATS\n#define MIB2_STATS_INC(x) STATS_INC(x)\n#else\n#define MIB2_STATS_INC(x)\n#endif\n\n/* Display of statistics */\n#if LWIP_STATS_DISPLAY\nvoid stats_display(void);\nvoid stats_display_proto(struct stats_proto *proto, const char *name);\nvoid stats_display_igmp(struct stats_igmp *igmp, const char *name);\nvoid stats_display_mem(struct stats_mem *mem, const char *name);\nvoid stats_display_memp(struct stats_mem *mem, int index);\nvoid stats_display_sys(struct stats_sys *sys);\n#else /* LWIP_STATS_DISPLAY */\n#define stats_display()\n#define stats_display_proto(proto, name)\n#define stats_display_igmp(igmp, name)\n#define stats_display_mem(mem, name)\n#define stats_display_memp(mem, index)\n#define stats_display_sys(sys)\n#endif /* LWIP_STATS_DISPLAY */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_STATS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/sys.h",
    "content": "/**\n * @file\n * OS abstraction layer\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n */\n\n#ifndef LWIP_HDR_SYS_H\n#define LWIP_HDR_SYS_H\n\n#include \"lwip/opt.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if NO_SYS\n\n/* For a totally minimal and standalone system, we provide null\n   definitions of the sys_ functions. */\ntypedef u8_t sys_sem_t;\ntypedef u8_t sys_mutex_t;\ntypedef u8_t sys_mbox_t;\n\n#define sys_sem_new(s, c) ERR_OK\n#define sys_sem_signal(s)\n#define sys_sem_wait(s)\n#define sys_arch_sem_wait(s,t)\n#define sys_sem_free(s)\n#define sys_sem_valid(s) 0\n#define sys_sem_valid_val(s) 0\n#define sys_sem_set_invalid(s)\n#define sys_sem_set_invalid_val(s)\n#define sys_mutex_new(mu) ERR_OK\n#define sys_mutex_lock(mu)\n#define sys_mutex_unlock(mu)\n#define sys_mutex_free(mu)\n#define sys_mutex_valid(mu) 0\n#define sys_mutex_set_invalid(mu)\n#define sys_mbox_new(m, s) ERR_OK\n#define sys_mbox_fetch(m,d)\n#define sys_mbox_tryfetch(m,d)\n#define sys_mbox_post(m,d)\n#define sys_mbox_trypost(m,d)\n#define sys_mbox_free(m)\n#define sys_mbox_valid(m)\n#define sys_mbox_valid_val(m)\n#define sys_mbox_set_invalid(m)\n#define sys_mbox_set_invalid_val(m)\n\n#define sys_thread_new(n,t,a,s,p)\n\n#define sys_msleep(t)\n\n#else /* NO_SYS */\n\n/** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */\n#define SYS_ARCH_TIMEOUT 0xffffffffUL\n\n/** sys_mbox_tryfetch() returns SYS_MBOX_EMPTY if appropriate.\n * For now we use the same magic value, but we allow this to change in future.\n */\n#define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT\n\n#include \"lwip/err.h\"\n#include \"arch/sys_arch.h\"\n\n/** Function prototype for thread functions */\ntypedef void (*lwip_thread_fn)(void *arg);\n\n/* Function prototypes for functions to be implemented by platform ports\n   (in sys_arch.c) */\n\n/* Mutex functions: */\n\n/** Define LWIP_COMPAT_MUTEX if the port has no mutexes and binary semaphores\n    should be used instead */\n#ifndef LWIP_COMPAT_MUTEX\n#define LWIP_COMPAT_MUTEX 0\n#endif\n\n#if LWIP_COMPAT_MUTEX\n/* for old ports that don't have mutexes: define them to binary semaphores */\n#define sys_mutex_t                   sys_sem_t\n#define sys_mutex_new(mutex)          sys_sem_new(mutex, 1)\n#define sys_mutex_lock(mutex)         sys_sem_wait(mutex)\n#define sys_mutex_unlock(mutex)       sys_sem_signal(mutex)\n#define sys_mutex_free(mutex)         sys_sem_free(mutex)\n#define sys_mutex_valid(mutex)        sys_sem_valid(mutex)\n#define sys_mutex_set_invalid(mutex)  sys_sem_set_invalid(mutex)\n\n#else /* LWIP_COMPAT_MUTEX */\n\n/**\n * @ingroup sys_mutex\n * Create a new mutex.\n * Note that mutexes are expected to not be taken recursively by the lwIP code,\n * so both implementation types (recursive or non-recursive) should work.\n * @param mutex pointer to the mutex to create\n * @return ERR_OK if successful, another err_t otherwise\n */\nerr_t sys_mutex_new(sys_mutex_t *mutex);\n/**\n * @ingroup sys_mutex\n * Lock a mutex\n * @param mutex the mutex to lock\n */\nvoid sys_mutex_lock(sys_mutex_t *mutex);\n/**\n * @ingroup sys_mutex\n * Unlock a mutex\n * @param mutex the mutex to unlock\n */\nvoid sys_mutex_unlock(sys_mutex_t *mutex);\n/**\n * @ingroup sys_mutex\n * Delete a semaphore\n * @param mutex the mutex to delete\n */\nvoid sys_mutex_free(sys_mutex_t *mutex);\n#ifndef sys_mutex_valid\n/**\n * @ingroup sys_mutex\n * Check if a mutex is valid/allocated: return 1 for valid, 0 for invalid\n */\nint sys_mutex_valid(sys_mutex_t *mutex);\n#endif\n#ifndef sys_mutex_set_invalid\n/**\n * @ingroup sys_mutex\n * Set a mutex invalid so that sys_mutex_valid returns 0\n */\nvoid sys_mutex_set_invalid(sys_mutex_t *mutex);\n#endif\n#endif /* LWIP_COMPAT_MUTEX */\n\n/* Semaphore functions: */\n\n/**\n * @ingroup sys_sem\n * Create a new semaphore\n * @param sem pointer to the semaphore to create\n * @param count initial count of the semaphore\n * @return ERR_OK if successful, another err_t otherwise\n */\nerr_t sys_sem_new(sys_sem_t *sem, u8_t count);\n/**\n * @ingroup sys_sem\n * Signals a semaphore\n * @param sem the semaphore to signal\n */\nvoid sys_sem_signal(sys_sem_t *sem);\n/**\n * @ingroup sys_sem\n * Wait for a semaphore for the specified timeout\n * @param sem the semaphore to wait for\n * @param timeout timeout in milliseconds to wait (0 = wait forever)\n * @return time (in milliseconds) waited for the semaphore\n *         or SYS_ARCH_TIMEOUT on timeout\n */\nu32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout);\n/**\n * @ingroup sys_sem\n * Delete a semaphore\n * @param sem semaphore to delete\n */\nvoid sys_sem_free(sys_sem_t *sem);\n/** Wait for a semaphore - forever/no timeout */\n#define sys_sem_wait(sem)                  sys_arch_sem_wait(sem, 0)\n#ifndef sys_sem_valid\n/**\n * @ingroup sys_sem\n * Check if a semaphore is valid/allocated: return 1 for valid, 0 for invalid\n */\nint sys_sem_valid(sys_sem_t *sem);\n#endif\n#ifndef sys_sem_set_invalid\n/**\n * @ingroup sys_sem\n * Set a semaphore invalid so that sys_sem_valid returns 0\n */\nvoid sys_sem_set_invalid(sys_sem_t *sem);\n#endif\n#ifndef sys_sem_valid_val\n/**\n * Same as sys_sem_valid() but taking a value, not a pointer\n */\n#define sys_sem_valid_val(sem)       sys_sem_valid(&(sem))\n#endif\n#ifndef sys_sem_set_invalid_val\n/**\n * Same as sys_sem_set_invalid() but taking a value, not a pointer\n */\n#define sys_sem_set_invalid_val(sem) sys_sem_set_invalid(&(sem))\n#endif\n\n#ifndef sys_msleep\n/**\n * @ingroup sys_misc\n * Sleep for specified number of ms\n */\nvoid sys_msleep(u32_t ms); /* only has a (close to) 1 ms resolution. */\n#endif\n\n/* Mailbox functions. */\n\n/**\n * @ingroup sys_mbox\n * Create a new mbox of specified size\n * @param mbox pointer to the mbox to create\n * @param size (minimum) number of messages in this mbox\n * @return ERR_OK if successful, another err_t otherwise\n */\nerr_t sys_mbox_new(sys_mbox_t *mbox, int size);\n/**\n * @ingroup sys_mbox\n * Post a message to an mbox - may not fail\n * -> blocks if full, only used from tasks not from ISR\n * @param mbox mbox to posts the message\n * @param msg message to post (ATTENTION: can be NULL)\n */\nvoid sys_mbox_post(sys_mbox_t *mbox, void *msg);\n/**\n * @ingroup sys_mbox\n * Try to post a message to an mbox - may fail if full or ISR\n * @param mbox mbox to posts the message\n * @param msg message to post (ATTENTION: can be NULL)\n */\nerr_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg);\n/**\n * @ingroup sys_mbox\n * Wait for a new message to arrive in the mbox\n * @param mbox mbox to get a message from\n * @param msg pointer where the message is stored\n * @param timeout maximum time (in milliseconds) to wait for a message (0 = wait forever)\n * @return time (in milliseconds) waited for a message, may be 0 if not waited\n           or SYS_ARCH_TIMEOUT on timeout\n *         The returned time has to be accurate to prevent timer jitter!\n */\nu32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout);\n/* Allow port to override with a macro, e.g. special timeout for sys_arch_mbox_fetch() */\n#ifndef sys_arch_mbox_tryfetch\n/**\n * @ingroup sys_mbox\n * Wait for a new message to arrive in the mbox\n * @param mbox mbox to get a message from\n * @param msg pointer where the message is stored\n * @return 0 (milliseconds) if a message has been received\n *         or SYS_MBOX_EMPTY if the mailbox is empty\n */\nu32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg);\n#endif\n/**\n * For now, we map straight to sys_arch implementation.\n */\n#define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg)\n/**\n * @ingroup sys_mbox\n * Delete an mbox\n * @param mbox mbox to delete\n */\nvoid sys_mbox_free(sys_mbox_t *mbox);\n#define sys_mbox_fetch(mbox, msg) sys_arch_mbox_fetch(mbox, msg, 0)\n#ifndef sys_mbox_valid\n/**\n * @ingroup sys_mbox\n * Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid\n */\nint sys_mbox_valid(sys_mbox_t *mbox);\n#endif\n#ifndef sys_mbox_set_invalid\n/**\n * @ingroup sys_mbox\n * Set an mbox invalid so that sys_mbox_valid returns 0\n */\nvoid sys_mbox_set_invalid(sys_mbox_t *mbox);\n#endif\n#ifndef sys_mbox_valid_val\n/**\n * Same as sys_mbox_valid() but taking a value, not a pointer\n */\n#define sys_mbox_valid_val(mbox)       sys_mbox_valid(&(mbox))\n#endif\n#ifndef sys_mbox_set_invalid_val\n/**\n * Same as sys_mbox_set_invalid() but taking a value, not a pointer\n */\n#define sys_mbox_set_invalid_val(mbox) sys_mbox_set_invalid(&(mbox))\n#endif\n\n\n/**\n * @ingroup sys_misc\n * The only thread function:\n * Creates a new thread\n * ATTENTION: although this function returns a value, it MUST NOT FAIL (ports have to assert this!)\n * @param name human-readable name for the thread (used for debugging purposes)\n * @param thread thread-function\n * @param arg parameter passed to 'thread'\n * @param stacksize stack size in bytes for the new thread (may be ignored by ports)\n * @param prio priority of the new thread (may be ignored by ports) */\nsys_thread_t sys_thread_new(char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio);\n\n#endif /* NO_SYS */\n\n/* sys_init() must be called before anything else. */\nvoid sys_init(void);\n\n#ifndef sys_jiffies\n/**\n * Ticks/jiffies since power up.\n */\nu32_t sys_jiffies(void);\n#endif\n\n/**\n * @ingroup sys_time\n * Returns the current time in milliseconds,\n * may be the same as sys_jiffies or at least based on it.\n */\nu32_t sys_now(void);\n\n/* Critical Region Protection */\n/* These functions must be implemented in the sys_arch.c file.\n   In some implementations they can provide a more light-weight protection\n   mechanism than using semaphores. Otherwise semaphores can be used for\n   implementation */\n#ifndef SYS_ARCH_PROTECT\n/** SYS_LIGHTWEIGHT_PROT\n * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection\n * for certain critical regions during buffer allocation, deallocation and memory\n * allocation and deallocation.\n */\n#if SYS_LIGHTWEIGHT_PROT\n\n/**\n * @ingroup sys_prot\n * SYS_ARCH_DECL_PROTECT\n * declare a protection variable. This macro will default to defining a variable of\n * type sys_prot_t. If a particular port needs a different implementation, then\n * this macro may be defined in sys_arch.h.\n */\n#define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev\n/**\n * @ingroup sys_prot\n * SYS_ARCH_PROTECT\n * Perform a \"fast\" protect. This could be implemented by\n * disabling interrupts for an embedded system or by using a semaphore or\n * mutex. The implementation should allow calling SYS_ARCH_PROTECT when\n * already protected. The old protection level is returned in the variable\n * \"lev\". This macro will default to calling the sys_arch_protect() function\n * which should be implemented in sys_arch.c. If a particular port needs a\n * different implementation, then this macro may be defined in sys_arch.h\n */\n#define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect()\n/**\n * @ingroup sys_prot\n * SYS_ARCH_UNPROTECT\n * Perform a \"fast\" set of the protection level to \"lev\". This could be\n * implemented by setting the interrupt level to \"lev\" within the MACRO or by\n * using a semaphore or mutex.  This macro will default to calling the\n * sys_arch_unprotect() function which should be implemented in\n * sys_arch.c. If a particular port needs a different implementation, then\n * this macro may be defined in sys_arch.h\n */\n#define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev)\nsys_prot_t sys_arch_protect(void);\nvoid sys_arch_unprotect(sys_prot_t pval);\n\n#else\n\n#define SYS_ARCH_DECL_PROTECT(lev)\n#define SYS_ARCH_PROTECT(lev)\n#define SYS_ARCH_UNPROTECT(lev)\n\n#endif /* SYS_LIGHTWEIGHT_PROT */\n\n#endif /* SYS_ARCH_PROTECT */\n\n/*\n * Macros to set/get and increase/decrease variables in a thread-safe way.\n * Use these for accessing variable that are used from more than one thread.\n */\n\n#ifndef SYS_ARCH_INC\n#define SYS_ARCH_INC(var, val) do { \\\n                                SYS_ARCH_DECL_PROTECT(old_level); \\\n                                SYS_ARCH_PROTECT(old_level); \\\n                                var += val; \\\n                                SYS_ARCH_UNPROTECT(old_level); \\\n                              } while(0)\n#endif /* SYS_ARCH_INC */\n\n#ifndef SYS_ARCH_DEC\n#define SYS_ARCH_DEC(var, val) do { \\\n                                SYS_ARCH_DECL_PROTECT(old_level); \\\n                                SYS_ARCH_PROTECT(old_level); \\\n                                var -= val; \\\n                                SYS_ARCH_UNPROTECT(old_level); \\\n                              } while(0)\n#endif /* SYS_ARCH_DEC */\n\n#ifndef SYS_ARCH_GET\n#define SYS_ARCH_GET(var, ret) do { \\\n                                SYS_ARCH_DECL_PROTECT(old_level); \\\n                                SYS_ARCH_PROTECT(old_level); \\\n                                ret = var; \\\n                                SYS_ARCH_UNPROTECT(old_level); \\\n                              } while(0)\n#endif /* SYS_ARCH_GET */\n\n#ifndef SYS_ARCH_SET\n#define SYS_ARCH_SET(var, val) do { \\\n                                SYS_ARCH_DECL_PROTECT(old_level); \\\n                                SYS_ARCH_PROTECT(old_level); \\\n                                var = val; \\\n                                SYS_ARCH_UNPROTECT(old_level); \\\n                              } while(0)\n#endif /* SYS_ARCH_SET */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_SYS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/tcp.h",
    "content": "/**\n * @file\n * TCP API (to be used from TCPIP thread)\\n\n * See also @ref tcp_raw\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_TCP_H\n#define LWIP_HDR_TCP_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_TCP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/mem.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/icmp.h\"\n#include \"lwip/err.h\"\n#include \"lwip/ip6.h\"\n#include \"lwip/ip6_addr.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct tcp_pcb;\n\n/** Function prototype for tcp accept callback functions. Called when a new\n * connection can be accepted on a listening pcb.\n *\n * @param arg Additional argument to pass to the callback function (@see tcp_arg())\n * @param newpcb The new connection pcb\n * @param err An error code if there has been an error accepting.\n *            Only return ERR_ABRT if you have called tcp_abort from within the\n *            callback function!\n */\ntypedef err_t (*tcp_accept_fn)(void *arg, struct tcp_pcb *newpcb, err_t err);\n\n/** Function prototype for tcp receive callback functions. Called when data has\n * been received.\n *\n * @param arg Additional argument to pass to the callback function (@see tcp_arg())\n * @param tpcb The connection pcb which received data\n * @param p The received data (or NULL when the connection has been closed!)\n * @param err An error code if there has been an error receiving\n *            Only return ERR_ABRT if you have called tcp_abort from within the\n *            callback function!\n */\ntypedef err_t (*tcp_recv_fn)(void *arg, struct tcp_pcb *tpcb,\n                             struct pbuf *p, err_t err);\n\n/** Function prototype for tcp sent callback functions. Called when sent data has\n * been acknowledged by the remote side. Use it to free corresponding resources.\n * This also means that the pcb has now space available to send new data.\n *\n * @param arg Additional argument to pass to the callback function (@see tcp_arg())\n * @param tpcb The connection pcb for which data has been acknowledged\n * @param len The amount of bytes acknowledged\n * @return ERR_OK: try to send some data by calling tcp_output\n *            Only return ERR_ABRT if you have called tcp_abort from within the\n *            callback function!\n */\ntypedef err_t (*tcp_sent_fn)(void *arg, struct tcp_pcb *tpcb,\n                              u16_t len);\n\n/** Function prototype for tcp poll callback functions. Called periodically as\n * specified by @see tcp_poll.\n *\n * @param arg Additional argument to pass to the callback function (@see tcp_arg())\n * @param tpcb tcp pcb\n * @return ERR_OK: try to send some data by calling tcp_output\n *            Only return ERR_ABRT if you have called tcp_abort from within the\n *            callback function!\n */\ntypedef err_t (*tcp_poll_fn)(void *arg, struct tcp_pcb *tpcb);\n\n/** Function prototype for tcp error callback functions. Called when the pcb\n * receives a RST or is unexpectedly closed for any other reason.\n *\n * @note The corresponding pcb is already freed when this callback is called!\n *\n * @param arg Additional argument to pass to the callback function (@see tcp_arg())\n * @param err Error code to indicate why the pcb has been closed\n *            ERR_ABRT: aborted through tcp_abort or by a TCP timer\n *            ERR_RST: the connection was reset by the remote host\n */\ntypedef void  (*tcp_err_fn)(void *arg, err_t err);\n\n/** Function prototype for tcp connected callback functions. Called when a pcb\n * is connected to the remote side after initiating a connection attempt by\n * calling tcp_connect().\n *\n * @param arg Additional argument to pass to the callback function (@see tcp_arg())\n * @param tpcb The connection pcb which is connected\n * @param err An unused error code, always ERR_OK currently ;-) @todo!\n *            Only return ERR_ABRT if you have called tcp_abort from within the\n *            callback function!\n *\n * @note When a connection attempt fails, the error callback is currently called!\n */\ntypedef err_t (*tcp_connected_fn)(void *arg, struct tcp_pcb *tpcb, err_t err);\n\n#if LWIP_WND_SCALE\n#define RCV_WND_SCALE(pcb, wnd) (((wnd) >> (pcb)->rcv_scale))\n#define SND_WND_SCALE(pcb, wnd) (((wnd) << (pcb)->snd_scale))\n#define TCPWND16(x)             ((u16_t)LWIP_MIN((x), 0xFFFF))\n#define TCP_WND_MAX(pcb)        ((tcpwnd_size_t)(((pcb)->flags & TF_WND_SCALE) ? TCP_WND : TCPWND16(TCP_WND)))\ntypedef u32_t tcpwnd_size_t;\n#else\n#define RCV_WND_SCALE(pcb, wnd) (wnd)\n#define SND_WND_SCALE(pcb, wnd) (wnd)\n#define TCPWND16(x)             (x)\n#define TCP_WND_MAX(pcb)        TCP_WND\ntypedef u16_t tcpwnd_size_t;\n#endif\n\n#if LWIP_WND_SCALE || TCP_LISTEN_BACKLOG || LWIP_TCP_TIMESTAMPS\ntypedef u16_t tcpflags_t;\n#else\ntypedef u8_t tcpflags_t;\n#endif\n\nenum tcp_state {\n  CLOSED      = 0,\n  LISTEN      = 1,\n  SYN_SENT    = 2,\n  SYN_RCVD    = 3,\n  ESTABLISHED = 4,\n  FIN_WAIT_1  = 5,\n  FIN_WAIT_2  = 6,\n  CLOSE_WAIT  = 7,\n  CLOSING     = 8,\n  LAST_ACK    = 9,\n  TIME_WAIT   = 10\n};\n\n/**\n * members common to struct tcp_pcb and struct tcp_listen_pcb\n */\n#define TCP_PCB_COMMON(type) \\\n  type *next; /* for the linked list */ \\\n  void *callback_arg; \\\n  enum tcp_state state; /* TCP state */ \\\n  u8_t prio; \\\n  /* ports are in host byte order */ \\\n  u16_t local_port\n\n\n/** the TCP protocol control block for listening pcbs */\nstruct tcp_pcb_listen {\n/** Common members of all PCB types */\n  IP_PCB;\n/** Protocol specific PCB members */\n  TCP_PCB_COMMON(struct tcp_pcb_listen);\n\n#if LWIP_CALLBACK_API\n  /* Function to call when a listener has been connected. */\n  tcp_accept_fn accept;\n#endif /* LWIP_CALLBACK_API */\n\n#if TCP_LISTEN_BACKLOG\n  u8_t backlog;\n  u8_t accepts_pending;\n#endif /* TCP_LISTEN_BACKLOG */\n};\n\n\n/** the TCP protocol control block */\nstruct tcp_pcb {\n/** common PCB members */\n  IP_PCB;\n/** protocol specific PCB members */\n  TCP_PCB_COMMON(struct tcp_pcb);\n\n  /* ports are in host byte order */\n  u16_t remote_port;\n\n  tcpflags_t flags;\n#define TF_ACK_DELAY   0x01U   /* Delayed ACK. */\n#define TF_ACK_NOW     0x02U   /* Immediate ACK. */\n#define TF_INFR        0x04U   /* In fast recovery. */\n#define TF_CLOSEPEND   0x08U   /* If this is set, tcp_close failed to enqueue the FIN (retried in tcp_tmr) */\n#define TF_RXCLOSED    0x10U   /* rx closed by tcp_shutdown */\n#define TF_FIN         0x20U   /* Connection was closed locally (FIN segment enqueued). */\n#define TF_NODELAY     0x40U   /* Disable Nagle algorithm */\n#define TF_NAGLEMEMERR 0x80U   /* nagle enabled, memerr, try to output to prevent delayed ACK to happen */\n#if LWIP_WND_SCALE\n#define TF_WND_SCALE   0x0100U /* Window Scale option enabled */\n#endif\n#if TCP_LISTEN_BACKLOG\n#define TF_BACKLOGPEND 0x0200U /* If this is set, a connection pcb has increased the backlog on its listener */\n#endif\n#if LWIP_TCP_TIMESTAMPS\n#define TF_TIMESTAMP   0x0400U   /* Timestamp option enabled */\n#endif\n\n  /* the rest of the fields are in host byte order\n     as we have to do some math with them */\n\n  /* Timers */\n  u8_t polltmr, pollinterval;\n  u8_t last_timer;\n  u32_t tmr;\n\n  /* receiver variables */\n  u32_t rcv_nxt;   /* next seqno expected */\n  tcpwnd_size_t rcv_wnd;   /* receiver window available */\n  tcpwnd_size_t rcv_ann_wnd; /* receiver window to announce */\n  u32_t rcv_ann_right_edge; /* announced right edge of window */\n\n  /* Retransmission timer. */\n  s16_t rtime;\n\n  u16_t mss;   /* maximum segment size */\n\n  /* RTT (round trip time) estimation variables */\n  u32_t rttest; /* RTT estimate in 500ms ticks */\n  u32_t rtseq;  /* sequence number being timed */\n  s16_t sa, sv; /* @todo document this */\n\n  s16_t rto;    /* retransmission time-out */\n  u8_t nrtx;    /* number of retransmissions */\n\n  /* fast retransmit/recovery */\n  u8_t dupacks;\n  u32_t lastack; /* Highest acknowledged seqno. */\n\n  /* congestion avoidance/control variables */\n  tcpwnd_size_t cwnd;\n  tcpwnd_size_t ssthresh;\n\n  /* sender variables */\n  u32_t snd_nxt;   /* next new seqno to be sent */\n  u32_t snd_wl1, snd_wl2; /* Sequence and acknowledgement numbers of last\n                             window update. */\n  u32_t snd_lbb;       /* Sequence number of next byte to be buffered. */\n  tcpwnd_size_t snd_wnd;   /* sender window */\n  tcpwnd_size_t snd_wnd_max; /* the maximum sender window announced by the remote host */\n\n  tcpwnd_size_t snd_buf;   /* Available buffer space for sending (in bytes). */\n#define TCP_SNDQUEUELEN_OVERFLOW (0xffffU-3)\n  u16_t snd_queuelen; /* Number of pbufs currently in the send buffer. */\n\n#if TCP_OVERSIZE\n  /* Extra bytes available at the end of the last pbuf in unsent. */\n  u16_t unsent_oversize;\n#endif /* TCP_OVERSIZE */\n\n  /* These are ordered by sequence number: */\n  struct tcp_seg *unsent;   /* Unsent (queued) segments. */\n  struct tcp_seg *unacked;  /* Sent but unacknowledged segments. */\n#if TCP_QUEUE_OOSEQ\n  struct tcp_seg *ooseq;    /* Received out of sequence segments. */\n#endif /* TCP_QUEUE_OOSEQ */\n\n  struct pbuf *refused_data; /* Data previously received but not yet taken by upper layer */\n\n#if LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG\n  struct tcp_pcb_listen* listener;\n#endif /* LWIP_CALLBACK_API || TCP_LISTEN_BACKLOG */\n\n#if LWIP_CALLBACK_API\n  /* Function to be called when more send buffer space is available. */\n  tcp_sent_fn sent;\n  /* Function to be called when (in-sequence) data has arrived. */\n  tcp_recv_fn recv;\n  /* Function to be called when a connection has been set up. */\n  tcp_connected_fn connected;\n  /* Function which is called periodically. */\n  tcp_poll_fn poll;\n  /* Function to be called whenever a fatal error occurs. */\n  tcp_err_fn errf;\n#endif /* LWIP_CALLBACK_API */\n\n#if LWIP_TCP_TIMESTAMPS\n  u32_t ts_lastacksent;\n  u32_t ts_recent;\n#endif /* LWIP_TCP_TIMESTAMPS */\n\n  /* idle time before KEEPALIVE is sent */\n  u32_t keep_idle;\n#if LWIP_TCP_KEEPALIVE\n  u32_t keep_intvl;\n  u32_t keep_cnt;\n#endif /* LWIP_TCP_KEEPALIVE */\n\n  /* Persist timer counter */\n  u8_t persist_cnt;\n  /* Persist timer back-off */\n  u8_t persist_backoff;\n\n  /* KEEPALIVE counter */\n  u8_t keep_cnt_sent;\n\n#if LWIP_WND_SCALE\n  u8_t snd_scale;\n  u8_t rcv_scale;\n#endif\n};\n\n#if LWIP_EVENT_API\n\nenum lwip_event {\n  LWIP_EVENT_ACCEPT,\n  LWIP_EVENT_SENT,\n  LWIP_EVENT_RECV,\n  LWIP_EVENT_CONNECTED,\n  LWIP_EVENT_POLL,\n  LWIP_EVENT_ERR\n};\n\nerr_t lwip_tcp_event(void *arg, struct tcp_pcb *pcb,\n         enum lwip_event,\n         struct pbuf *p,\n         u16_t size,\n         err_t err);\n\n#endif /* LWIP_EVENT_API */\n\n/* Application program's interface: */\nstruct tcp_pcb * tcp_new     (void);\nstruct tcp_pcb * tcp_new_ip_type (u8_t type);\n\nvoid             tcp_arg     (struct tcp_pcb *pcb, void *arg);\n#if LWIP_CALLBACK_API\nvoid             tcp_recv    (struct tcp_pcb *pcb, tcp_recv_fn recv);\nvoid             tcp_sent    (struct tcp_pcb *pcb, tcp_sent_fn sent);\nvoid             tcp_err     (struct tcp_pcb *pcb, tcp_err_fn err);\nvoid             tcp_accept  (struct tcp_pcb *pcb, tcp_accept_fn accept);\n#endif /* LWIP_CALLBACK_API */\nvoid             tcp_poll    (struct tcp_pcb *pcb, tcp_poll_fn poll, u8_t interval);\n\n#if LWIP_TCP_TIMESTAMPS\n#define          tcp_mss(pcb)             (((pcb)->flags & TF_TIMESTAMP) ? ((pcb)->mss - 12)  : (pcb)->mss)\n#else /* LWIP_TCP_TIMESTAMPS */\n#define          tcp_mss(pcb)             ((pcb)->mss)\n#endif /* LWIP_TCP_TIMESTAMPS */\n#define          tcp_sndbuf(pcb)          (TCPWND16((pcb)->snd_buf))\n#define          tcp_sndqueuelen(pcb)     ((pcb)->snd_queuelen)\n/** @ingroup tcp_raw */\n#define          tcp_nagle_disable(pcb)   ((pcb)->flags |= TF_NODELAY)\n/** @ingroup tcp_raw */\n#define          tcp_nagle_enable(pcb)    ((pcb)->flags = (tcpflags_t)((pcb)->flags & ~TF_NODELAY))\n/** @ingroup tcp_raw */\n#define          tcp_nagle_disabled(pcb)  (((pcb)->flags & TF_NODELAY) != 0)\n\n#if TCP_LISTEN_BACKLOG\n#define          tcp_backlog_set(pcb, new_backlog) do { \\\n  LWIP_ASSERT(\"pcb->state == LISTEN (called for wrong pcb?)\", (pcb)->state == LISTEN); \\\n  ((struct tcp_pcb_listen *)(pcb))->backlog = ((new_backlog) ? (new_backlog) : 1); } while(0)\nvoid             tcp_backlog_delayed(struct tcp_pcb* pcb);\nvoid             tcp_backlog_accepted(struct tcp_pcb* pcb);\n#else  /* TCP_LISTEN_BACKLOG */\n#define          tcp_backlog_set(pcb, new_backlog)\n#define          tcp_backlog_delayed(pcb)\n#define          tcp_backlog_accepted(pcb)\n#endif /* TCP_LISTEN_BACKLOG */\n#define          tcp_accepted(pcb) /* compatibility define, not needed any more */\n\nvoid             tcp_recved  (struct tcp_pcb *pcb, u16_t len);\nerr_t            tcp_bind    (struct tcp_pcb *pcb, const ip_addr_t *ipaddr,\n                              u16_t port);\nerr_t            tcp_connect (struct tcp_pcb *pcb, const ip_addr_t *ipaddr,\n                              u16_t port, tcp_connected_fn connected);\n\nstruct tcp_pcb * tcp_listen_with_backlog_and_err(struct tcp_pcb *pcb, u8_t backlog, err_t *err);\nstruct tcp_pcb * tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog);\n/** @ingroup tcp_raw */\n#define          tcp_listen(pcb) tcp_listen_with_backlog(pcb, TCP_DEFAULT_LISTEN_BACKLOG)\n\nvoid             tcp_abort (struct tcp_pcb *pcb);\nerr_t            tcp_close   (struct tcp_pcb *pcb);\nerr_t            tcp_shutdown(struct tcp_pcb *pcb, int shut_rx, int shut_tx);\n\n/* Flags for \"apiflags\" parameter in tcp_write */\n#define TCP_WRITE_FLAG_COPY 0x01\n#define TCP_WRITE_FLAG_MORE 0x02\n\nerr_t            tcp_write   (struct tcp_pcb *pcb, const void *dataptr, u16_t len,\n                              u8_t apiflags);\n\nvoid             tcp_setprio (struct tcp_pcb *pcb, u8_t prio);\n\n#define TCP_PRIO_MIN    1\n#define TCP_PRIO_NORMAL 64\n#define TCP_PRIO_MAX    127\n\nerr_t            tcp_output  (struct tcp_pcb *pcb);\n\n\nconst char* tcp_debug_state_str(enum tcp_state s);\n\n/* for compatibility with older implementation */\n#define tcp_new_ip6() tcp_new_ip_type(IPADDR_TYPE_V6)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_TCP */\n\n#endif /* LWIP_HDR_TCP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/tcpip.h",
    "content": "/**\n * @file\n * Functions to sync with TCPIP thread\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_TCPIP_H\n#define LWIP_HDR_TCPIP_H\n\n#include \"lwip/opt.h\"\n\n#if !NO_SYS /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/err.h\"\n#include \"lwip/timeouts.h\"\n#include \"lwip/netif.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_TCPIP_CORE_LOCKING\n/** The global semaphore to lock the stack. */\nextern sys_mutex_t lock_tcpip_core;\n/** Lock lwIP core mutex (needs @ref LWIP_TCPIP_CORE_LOCKING 1) */\n#define LOCK_TCPIP_CORE()     sys_mutex_lock(&lock_tcpip_core)\n/** Unlock lwIP core mutex (needs @ref LWIP_TCPIP_CORE_LOCKING 1) */\n#define UNLOCK_TCPIP_CORE()   sys_mutex_unlock(&lock_tcpip_core)\n#else /* LWIP_TCPIP_CORE_LOCKING */\n#define LOCK_TCPIP_CORE()\n#define UNLOCK_TCPIP_CORE()\n#endif /* LWIP_TCPIP_CORE_LOCKING */\n\nstruct pbuf;\nstruct netif;\n\n/** Function prototype for the init_done function passed to tcpip_init */\ntypedef void (*tcpip_init_done_fn)(void *arg);\n/** Function prototype for functions passed to tcpip_callback() */\ntypedef void (*tcpip_callback_fn)(void *ctx);\n\n/* Forward declarations */\nstruct tcpip_callback_msg;\n\nvoid   tcpip_init(tcpip_init_done_fn tcpip_init_done, void *arg);\n\nerr_t  tcpip_inpkt(struct pbuf *p, struct netif *inp, netif_input_fn input_fn);\nerr_t  tcpip_input(struct pbuf *p, struct netif *inp);\n\nerr_t  tcpip_callback_with_block(tcpip_callback_fn function, void *ctx, u8_t block);\n/**\n * @ingroup lwip_os\n * @see tcpip_callback_with_block\n */\n#define tcpip_callback(f, ctx)  tcpip_callback_with_block(f, ctx, 1)\n\nstruct tcpip_callback_msg* tcpip_callbackmsg_new(tcpip_callback_fn function, void *ctx);\nvoid   tcpip_callbackmsg_delete(struct tcpip_callback_msg* msg);\nerr_t  tcpip_trycallback(struct tcpip_callback_msg* msg);\n\n/* free pbufs or heap memory from another context without blocking */\nerr_t  pbuf_free_callback(struct pbuf *p);\nerr_t  mem_free_callback(void *m);\n\n#if LWIP_TCPIP_TIMEOUT && LWIP_TIMERS\nerr_t  tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg);\nerr_t  tcpip_untimeout(sys_timeout_handler h, void *arg);\n#endif /* LWIP_TCPIP_TIMEOUT && LWIP_TIMERS */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* !NO_SYS */\n\n#endif /* LWIP_HDR_TCPIP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/timeouts.h",
    "content": "/**\n * @file\n * Timer implementations\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *         Simon Goldschmidt\n *\n */\n#ifndef LWIP_HDR_TIMEOUTS_H\n#define LWIP_HDR_TIMEOUTS_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/err.h\"\n#if !NO_SYS\n#include \"lwip/sys.h\"\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifndef LWIP_DEBUG_TIMERNAMES\n#ifdef LWIP_DEBUG\n#define LWIP_DEBUG_TIMERNAMES SYS_DEBUG\n#else /* LWIP_DEBUG */\n#define LWIP_DEBUG_TIMERNAMES 0\n#endif /* LWIP_DEBUG*/\n#endif\n\n/** Function prototype for a stack-internal timer function that has to be\n * called at a defined interval */\ntypedef void (* lwip_cyclic_timer_handler)(void);\n\n/** This struct contains information about a stack-internal timer function\n that has to be called at a defined interval */\nstruct lwip_cyclic_timer {\n  u32_t interval_ms;\n  lwip_cyclic_timer_handler handler;\n#if LWIP_DEBUG_TIMERNAMES\n  const char* handler_name;\n#endif /* LWIP_DEBUG_TIMERNAMES */\n};\n\n/** This array contains all stack-internal cyclic timers. To get the number of\n * timers, use LWIP_ARRAYSIZE() */\nextern const struct lwip_cyclic_timer lwip_cyclic_timers[];\n\n#if LWIP_TIMERS\n\n/** Function prototype for a timeout callback function. Register such a function\n * using sys_timeout().\n *\n * @param arg Additional argument to pass to the function - set up by sys_timeout()\n */\ntypedef void (* sys_timeout_handler)(void *arg);\n\nstruct sys_timeo {\n  struct sys_timeo *next;\n  u32_t time;\n  sys_timeout_handler h;\n  void *arg;\n#if LWIP_DEBUG_TIMERNAMES\n  const char* handler_name;\n#endif /* LWIP_DEBUG_TIMERNAMES */\n};\n\nvoid sys_timeouts_init(void);\n\n#if LWIP_DEBUG_TIMERNAMES\nvoid sys_timeout_debug(u32_t msecs, sys_timeout_handler handler, void *arg, const char* handler_name);\n#define sys_timeout(msecs, handler, arg) sys_timeout_debug(msecs, handler, arg, #handler)\n#else /* LWIP_DEBUG_TIMERNAMES */\nvoid sys_timeout(u32_t msecs, sys_timeout_handler handler, void *arg);\n#endif /* LWIP_DEBUG_TIMERNAMES */\n\nvoid sys_untimeout(sys_timeout_handler handler, void *arg);\nvoid sys_restart_timeouts(void);\n#if NO_SYS\nvoid sys_check_timeouts(void);\nu32_t sys_timeouts_sleeptime(void);\n#else /* NO_SYS */\nvoid sys_timeouts_mbox_fetch(sys_mbox_t *mbox, void **msg);\n#endif /* NO_SYS */\n\n\n#endif /* LWIP_TIMERS */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_TIMEOUTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/lwip/udp.h",
    "content": "/**\n * @file\n * UDP API (to be used from TCPIP thread)\\n\n * See also @ref udp_raw\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_UDP_H\n#define LWIP_HDR_UDP_H\n\n#include \"lwip/opt.h\"\n\n#if LWIP_UDP /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/ip6_addr.h\"\n#include \"lwip/prot/udp.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define UDP_FLAGS_NOCHKSUM       0x01U\n#define UDP_FLAGS_UDPLITE        0x02U\n#define UDP_FLAGS_CONNECTED      0x04U\n#define UDP_FLAGS_MULTICAST_LOOP 0x08U\n\nstruct udp_pcb;\n\n/** Function prototype for udp pcb receive callback functions\n * addr and port are in same byte order as in the pcb\n * The callback is responsible for freeing the pbuf\n * if it's not used any more.\n *\n * ATTENTION: Be aware that 'addr' might point into the pbuf 'p' so freeing this pbuf\n *            can make 'addr' invalid, too.\n *\n * @param arg user supplied argument (udp_pcb.recv_arg)\n * @param pcb the udp_pcb which received data\n * @param p the packet buffer that was received\n * @param addr the remote IP address from which the packet was received\n * @param port the remote port from which the packet was received\n */\ntypedef void (*udp_recv_fn)(void *arg, struct udp_pcb *pcb, struct pbuf *p,\n    const ip_addr_t *addr, u16_t port);\n\n/** the UDP protocol control block */\nstruct udp_pcb {\n/** Common members of all PCB types */\n  IP_PCB;\n\n/* Protocol specific PCB members */\n\n  struct udp_pcb *next;\n\n  u8_t flags;\n  /** ports are in host byte order */\n  u16_t local_port, remote_port;\n\n#if LWIP_MULTICAST_TX_OPTIONS\n  /** outgoing network interface for multicast packets */\n  ip_addr_t multicast_ip;\n  /** TTL for outgoing multicast packets */\n  u8_t mcast_ttl;\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n\n#if LWIP_UDPLITE\n  /** used for UDP_LITE only */\n  u16_t chksum_len_rx, chksum_len_tx;\n#endif /* LWIP_UDPLITE */\n\n  /** receive callback function */\n  udp_recv_fn recv;\n  /** user-supplied argument for the recv callback */\n  void *recv_arg;\n};\n/* udp_pcbs export for external reference (e.g. SNMP agent) */\nextern struct udp_pcb *udp_pcbs;\n\n/* The following functions is the application layer interface to the\n   UDP code. */\nstruct udp_pcb * udp_new        (void);\nstruct udp_pcb * udp_new_ip_type(u8_t type);\nvoid             udp_remove     (struct udp_pcb *pcb);\nerr_t            udp_bind       (struct udp_pcb *pcb, const ip_addr_t *ipaddr,\n                                 u16_t port);\nerr_t            udp_connect    (struct udp_pcb *pcb, const ip_addr_t *ipaddr,\n                                 u16_t port);\nvoid             udp_disconnect (struct udp_pcb *pcb);\nvoid             udp_recv       (struct udp_pcb *pcb, udp_recv_fn recv,\n                                 void *recv_arg);\nerr_t            udp_sendto_if  (struct udp_pcb *pcb, struct pbuf *p,\n                                 const ip_addr_t *dst_ip, u16_t dst_port,\n                                 struct netif *netif);\nerr_t            udp_sendto_if_src(struct udp_pcb *pcb, struct pbuf *p,\n                                 const ip_addr_t *dst_ip, u16_t dst_port,\n                                 struct netif *netif, const ip_addr_t *src_ip);\nerr_t            udp_sendto     (struct udp_pcb *pcb, struct pbuf *p,\n                                 const ip_addr_t *dst_ip, u16_t dst_port);\nerr_t            udp_send       (struct udp_pcb *pcb, struct pbuf *p);\n\n#if LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP\nerr_t            udp_sendto_if_chksum(struct udp_pcb *pcb, struct pbuf *p,\n                                 const ip_addr_t *dst_ip, u16_t dst_port,\n                                 struct netif *netif, u8_t have_chksum,\n                                 u16_t chksum);\nerr_t            udp_sendto_chksum(struct udp_pcb *pcb, struct pbuf *p,\n                                 const ip_addr_t *dst_ip, u16_t dst_port,\n                                 u8_t have_chksum, u16_t chksum);\nerr_t            udp_send_chksum(struct udp_pcb *pcb, struct pbuf *p,\n                                 u8_t have_chksum, u16_t chksum);\nerr_t            udp_sendto_if_src_chksum(struct udp_pcb *pcb, struct pbuf *p,\n                                 const ip_addr_t *dst_ip, u16_t dst_port, struct netif *netif,\n                                 u8_t have_chksum, u16_t chksum, const ip_addr_t *src_ip);\n#endif /* LWIP_CHECKSUM_ON_COPY && CHECKSUM_GEN_UDP */\n\n#define          udp_flags(pcb) ((pcb)->flags)\n#define          udp_setflags(pcb, f)  ((pcb)->flags = (f))\n\n/* The following functions are the lower layer interface to UDP. */\nvoid             udp_input      (struct pbuf *p, struct netif *inp);\n\nvoid             udp_init       (void);\n\n/* for compatibility with older implementation */\n#define udp_new_ip6() udp_new_ip_type(IPADDR_TYPE_V6)\n\n#if LWIP_MULTICAST_TX_OPTIONS\n#define udp_set_multicast_netif_addr(pcb, ip4addr) ip_addr_copy_from_ip4((pcb)->multicast_ip, *(ip4addr))\n#define udp_get_multicast_netif_addr(pcb)          ip_2_ip4(&(pcb)->multicast_ip)\n#define udp_set_multicast_ttl(pcb, value)      do { (pcb)->mcast_ttl = value; } while(0)\n#define udp_get_multicast_ttl(pcb)                 ((pcb)->mcast_ttl)\n#endif /* LWIP_MULTICAST_TX_OPTIONS */\n\n#if UDP_DEBUG\nvoid udp_debug_print(struct udp_hdr *udphdr);\n#else\n#define udp_debug_print(udphdr)\n#endif\n\nvoid udp_netif_ip_addr_changed(const ip_addr_t* old_addr, const ip_addr_t* new_addr);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_UDP */\n\n#endif /* LWIP_HDR_UDP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/etharp.h",
    "content": "/* ARP has been moved to core/ipv4, provide this #include for compatibility only */\n#include \"lwip/etharp.h\"\n#include \"netif/ethernet.h\"\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ethernet.h",
    "content": "/**\n * @file\n * Ethernet input function - handles INCOMING ethernet level traffic\n * To be used in most low-level netif implementations\n */\n\n/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>\n * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#ifndef LWIP_HDR_NETIF_ETHERNET_H\n#define LWIP_HDR_NETIF_ETHERNET_H\n\n#include \"lwip/opt.h\"\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/prot/ethernet.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if LWIP_ARP || LWIP_ETHERNET\n\n/** Define this to 1 and define LWIP_ARP_FILTER_NETIF_FN(pbuf, netif, type)\n * to a filter function that returns the correct netif when using multiple\n * netifs on one hardware interface where the netif's low-level receive\n * routine cannot decide for the correct netif (e.g. when mapping multiple\n * IP addresses to one hardware interface).\n */\n#ifndef LWIP_ARP_FILTER_NETIF\n#define LWIP_ARP_FILTER_NETIF 0\n#endif\n\nerr_t ethernet_input(struct pbuf *p, struct netif *netif);\nerr_t ethernet_output(struct netif* netif, struct pbuf* p, const struct eth_addr* src, const struct eth_addr* dst, u16_t eth_type);\n\nextern const struct eth_addr ethbroadcast, ethzero;\n\n#endif /* LWIP_ARP || LWIP_ETHERNET */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_NETIF_ETHERNET_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/lowpan6.h",
    "content": "/**\n * @file\n *\n * 6LowPAN output for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units.\n */\n\n/*\n * Copyright (c) 2015 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#ifndef LWIP_HDR_LOWPAN6_H\n#define LWIP_HDR_LOWPAN6_H\n\n#include \"netif/lowpan6_opts.h\"\n\n#if LWIP_IPV6 && LWIP_6LOWPAN /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/netif.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** 1 second period */\n#define LOWPAN6_TMR_INTERVAL 1000\n\nvoid lowpan6_tmr(void);\n\nerr_t lowpan6_set_context(u8_t index, const ip6_addr_t * context);\nerr_t lowpan6_set_short_addr(u8_t addr_high, u8_t addr_low);\n\n#if LWIP_IPV4\nerr_t lowpan4_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr);\n#endif /* LWIP_IPV4 */\nerr_t lowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr);\nerr_t lowpan6_input(struct pbuf * p, struct netif *netif);\nerr_t lowpan6_if_init(struct netif *netif);\n\n/* pan_id in network byte order. */\nerr_t lowpan6_set_pan_id(u16_t pan_id);\n\n#if !NO_SYS\nerr_t tcpip_6lowpan_input(struct pbuf *p, struct netif *inp);\n#endif /* !NO_SYS */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_IPV6 && LWIP_6LOWPAN */\n\n#endif /* LWIP_HDR_LOWPAN6_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/lowpan6_opts.h",
    "content": "/**\n * @file\n * 6LowPAN options list\n */\n\n/*\n * Copyright (c) 2015 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n#ifndef LWIP_HDR_LOWPAN6_OPTS_H\n#define LWIP_HDR_LOWPAN6_OPTS_H\n\n#include \"lwip/opt.h\"\n\n#ifndef LWIP_6LOWPAN\n#define LWIP_6LOWPAN                     0\n#endif\n\n#ifndef LWIP_6LOWPAN_NUM_CONTEXTS\n#define LWIP_6LOWPAN_NUM_CONTEXTS        10\n#endif\n\n#ifndef LWIP_6LOWPAN_INFER_SHORT_ADDRESS\n#define LWIP_6LOWPAN_INFER_SHORT_ADDRESS 1\n#endif\n\n#ifndef LWIP_6LOWPAN_IPHC\n#define LWIP_6LOWPAN_IPHC                1\n#endif\n\n#ifndef LWIP_6LOWPAN_HW_CRC\n#define LWIP_6LOWPAN_HW_CRC              1\n#endif\n\n#ifndef LOWPAN6_DEBUG\n#define LOWPAN6_DEBUG                    LWIP_DBG_OFF\n#endif\n\n#endif /* LWIP_HDR_LOWPAN6_OPTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/ccp.h",
    "content": "/*\n * ccp.h - Definitions for PPP Compression Control Protocol.\n *\n * Copyright (c) 1994-2002 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: ccp.h,v 1.12 2004/11/04 10:02:26 paulus Exp $\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && CCP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#ifndef CCP_H\n#define CCP_H\n\n/*\n * CCP codes.\n */\n\n#define CCP_CONFREQ    1\n#define CCP_CONFACK    2\n#define CCP_TERMREQ    5\n#define CCP_TERMACK    6\n#define CCP_RESETREQ    14\n#define CCP_RESETACK    15\n\n/*\n * Max # bytes for a CCP option\n */\n\n#define CCP_MAX_OPTION_LENGTH    32\n\n/*\n * Parts of a CCP packet.\n */\n\n#define CCP_CODE(dp)        ((dp)[0])\n#define CCP_ID(dp)        ((dp)[1])\n#define CCP_LENGTH(dp)        (((dp)[2] << 8) + (dp)[3])\n#define CCP_HDRLEN        4\n\n#define CCP_OPT_CODE(dp)    ((dp)[0])\n#define CCP_OPT_LENGTH(dp)    ((dp)[1])\n#define CCP_OPT_MINLEN        2\n\n#if BSDCOMPRESS_SUPPORT\n/*\n * Definitions for BSD-Compress.\n */\n\n#define CI_BSD_COMPRESS        21    /* config. option for BSD-Compress */\n#define CILEN_BSD_COMPRESS    3    /* length of config. option */\n\n/* Macros for handling the 3rd byte of the BSD-Compress config option. */\n#define BSD_NBITS(x)        ((x) & 0x1F)    /* number of bits requested */\n#define BSD_VERSION(x)        ((x) >> 5)    /* version of option format */\n#define BSD_CURRENT_VERSION    1        /* current version number */\n#define BSD_MAKE_OPT(v, n)    (((v) << 5) | (n))\n\n#define BSD_MIN_BITS        9    /* smallest code size supported */\n#define BSD_MAX_BITS        15    /* largest code size supported */\n#endif /* BSDCOMPRESS_SUPPORT */\n\n#if DEFLATE_SUPPORT\n/*\n * Definitions for Deflate.\n */\n\n#define CI_DEFLATE        26    /* config option for Deflate */\n#define CI_DEFLATE_DRAFT    24    /* value used in original draft RFC */\n#define CILEN_DEFLATE        4    /* length of its config option */\n\n#define DEFLATE_MIN_SIZE    9\n#define DEFLATE_MAX_SIZE    15\n#define DEFLATE_METHOD_VAL    8\n#define DEFLATE_SIZE(x)        (((x) >> 4) + 8)\n#define DEFLATE_METHOD(x)    ((x) & 0x0F)\n#define DEFLATE_MAKE_OPT(w)    ((((w) - 8) << 4) + DEFLATE_METHOD_VAL)\n#define DEFLATE_CHK_SEQUENCE    0\n#endif /* DEFLATE_SUPPORT */\n\n#if MPPE_SUPPORT\n/*\n * Definitions for MPPE.\n */\n\n#define CI_MPPE                18      /* config option for MPPE */\n#define CILEN_MPPE              6      /* length of config option */\n#endif /* MPPE_SUPPORT */\n\n#if PREDICTOR_SUPPORT\n/*\n * Definitions for other, as yet unsupported, compression methods.\n */\n\n#define CI_PREDICTOR_1        1    /* config option for Predictor-1 */\n#define CILEN_PREDICTOR_1    2    /* length of its config option */\n#define CI_PREDICTOR_2        2    /* config option for Predictor-2 */\n#define CILEN_PREDICTOR_2    2    /* length of its config option */\n#endif /* PREDICTOR_SUPPORT */\n\ntypedef struct ccp_options {\n#if DEFLATE_SUPPORT\n    unsigned int deflate          :1; /* do Deflate? */\n    unsigned int deflate_correct  :1; /* use correct code for deflate? */\n    unsigned int deflate_draft    :1; /* use draft RFC code for deflate? */\n#endif /* DEFLATE_SUPPORT */\n#if BSDCOMPRESS_SUPPORT\n    unsigned int bsd_compress     :1; /* do BSD Compress? */\n#endif /* BSDCOMPRESS_SUPPORT */\n#if PREDICTOR_SUPPORT\n    unsigned int predictor_1      :1; /* do Predictor-1? */\n    unsigned int predictor_2      :1; /* do Predictor-2? */\n#endif /* PREDICTOR_SUPPORT */\n\n#if MPPE_SUPPORT\n    u8_t mppe;            /* MPPE bitfield */\n#endif /* MPPE_SUPPORT */\n#if BSDCOMPRESS_SUPPORT\n    u_short bsd_bits;        /* # bits/code for BSD Compress */\n#endif /* BSDCOMPRESS_SUPPORT */\n#if DEFLATE_SUPPORT\n    u_short deflate_size;    /* lg(window size) for Deflate */\n#endif /* DEFLATE_SUPPORT */\n    u8_t method;        /* code for chosen compression method */\n} ccp_options;\n\nextern const struct protent ccp_protent;\n\nvoid ccp_resetrequest(ppp_pcb *pcb);  /* Issue a reset-request. */\n\n#endif /* CCP_H */\n#endif /* PPP_SUPPORT && CCP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/chap-md5.h",
    "content": "/*\n * chap-md5.h - New CHAP/MD5 implementation.\n *\n * Copyright (c) 2003 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && CHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\nextern const struct chap_digest_type md5_digest;\n\n#endif /* PPP_SUPPORT && CHAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/chap-new.h",
    "content": "/*\n * chap-new.c - New CHAP implementation.\n *\n * Copyright (c) 2003 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && CHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#ifndef CHAP_H\n#define CHAP_H\n\n#include \"ppp.h\"\n\n/*\n * CHAP packets begin with a standard header with code, id, len (2 bytes).\n */\n#define CHAP_HDRLEN    4\n\n/*\n * Values for the code field.\n */\n#define CHAP_CHALLENGE    1\n#define CHAP_RESPONSE    2\n#define CHAP_SUCCESS    3\n#define CHAP_FAILURE    4\n\n/*\n * CHAP digest codes.\n */\n#define CHAP_MD5        5\n#if MSCHAP_SUPPORT\n#define CHAP_MICROSOFT        0x80\n#define CHAP_MICROSOFT_V2    0x81\n#endif /* MSCHAP_SUPPORT */\n\n/*\n * Semi-arbitrary limits on challenge and response fields.\n */\n#define MAX_CHALLENGE_LEN    64\n#define MAX_RESPONSE_LEN    64\n\n/*\n * These limits apply to challenge and response packets we send.\n * The +4 is the +1 that we actually need rounded up.\n */\n#define CHAL_MAX_PKTLEN    (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_CHALLENGE_LEN + MAXNAMELEN)\n#define RESP_MAX_PKTLEN    (PPP_HDRLEN + CHAP_HDRLEN + 4 + MAX_RESPONSE_LEN + MAXNAMELEN)\n\n/* bitmask of supported algorithms */\n#if MSCHAP_SUPPORT\n#define MDTYPE_MICROSOFT_V2    0x1\n#define MDTYPE_MICROSOFT    0x2\n#endif /* MSCHAP_SUPPORT */\n#define MDTYPE_MD5        0x4\n#define MDTYPE_NONE        0\n\n#if MSCHAP_SUPPORT\n/* Return the digest alg. ID for the most preferred digest type. */\n#define CHAP_DIGEST(mdtype) \\\n    ((mdtype) & MDTYPE_MD5)? CHAP_MD5: \\\n    ((mdtype) & MDTYPE_MICROSOFT_V2)? CHAP_MICROSOFT_V2: \\\n    ((mdtype) & MDTYPE_MICROSOFT)? CHAP_MICROSOFT: \\\n    0\n#else /* !MSCHAP_SUPPORT */\n#define CHAP_DIGEST(mdtype) \\\n    ((mdtype) & MDTYPE_MD5)? CHAP_MD5: \\\n    0\n#endif /* MSCHAP_SUPPORT */\n\n/* Return the bit flag (lsb set) for our most preferred digest type. */\n#define CHAP_MDTYPE(mdtype) ((mdtype) ^ ((mdtype) - 1)) & (mdtype)\n\n/* Return the bit flag for a given digest algorithm ID. */\n#if MSCHAP_SUPPORT\n#define CHAP_MDTYPE_D(digest) \\\n    ((digest) == CHAP_MICROSOFT_V2)? MDTYPE_MICROSOFT_V2: \\\n    ((digest) == CHAP_MICROSOFT)? MDTYPE_MICROSOFT: \\\n    ((digest) == CHAP_MD5)? MDTYPE_MD5: \\\n    0\n#else /* !MSCHAP_SUPPORT */\n#define CHAP_MDTYPE_D(digest) \\\n    ((digest) == CHAP_MD5)? MDTYPE_MD5: \\\n    0\n#endif /* MSCHAP_SUPPORT */\n\n/* Can we do the requested digest? */\n#if MSCHAP_SUPPORT\n#define CHAP_CANDIGEST(mdtype, digest) \\\n    ((digest) == CHAP_MICROSOFT_V2)? (mdtype) & MDTYPE_MICROSOFT_V2: \\\n    ((digest) == CHAP_MICROSOFT)? (mdtype) & MDTYPE_MICROSOFT: \\\n    ((digest) == CHAP_MD5)? (mdtype) & MDTYPE_MD5: \\\n    0\n#else /* !MSCHAP_SUPPORT */\n#define CHAP_CANDIGEST(mdtype, digest) \\\n    ((digest) == CHAP_MD5)? (mdtype) & MDTYPE_MD5: \\\n    0\n#endif /* MSCHAP_SUPPORT */\n\n/*\n * The code for each digest type has to supply one of these.\n */\nstruct chap_digest_type {\n    int code;\n\n#if PPP_SERVER\n    /*\n     * Note: challenge and response arguments below are formatted as\n     * a length byte followed by the actual challenge/response data.\n     */\n    void (*generate_challenge)(ppp_pcb *pcb, unsigned char *challenge);\n    int (*verify_response)(ppp_pcb *pcb, int id, const char *name,\n        const unsigned char *secret, int secret_len,\n        const unsigned char *challenge, const unsigned char *response,\n        char *message, int message_space);\n#endif /* PPP_SERVER */\n    void (*make_response)(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,\n        const unsigned char *challenge, const char *secret, int secret_len,\n        unsigned char *priv);\n    int (*check_success)(ppp_pcb *pcb, unsigned char *pkt, int len, unsigned char *priv);\n    void (*handle_failure)(ppp_pcb *pcb, unsigned char *pkt, int len);\n};\n\n/*\n * Each interface is described by chap structure.\n */\n#if CHAP_SUPPORT\ntypedef struct chap_client_state {\n    u8_t flags;\n    const char *name;\n    const struct chap_digest_type *digest;\n    unsigned char priv[64];        /* private area for digest's use */\n} chap_client_state;\n\n#if PPP_SERVER\ntypedef struct chap_server_state {\n    u8_t flags;\n    u8_t id;\n    const char *name;\n    const struct chap_digest_type *digest;\n    int challenge_xmits;\n    int challenge_pktlen;\n    unsigned char challenge[CHAL_MAX_PKTLEN];\n} chap_server_state;\n#endif /* PPP_SERVER */\n#endif /* CHAP_SUPPORT */\n\n#if 0 /* UNUSED */\n/* Hook for a plugin to validate CHAP challenge */\nextern int (*chap_verify_hook)(char *name, char *ourname, int id,\n            const struct chap_digest_type *digest,\n            unsigned char *challenge, unsigned char *response,\n            char *message, int message_space);\n#endif /* UNUSED */\n\n#if PPP_SERVER\n/* Called by authentication code to start authenticating the peer. */\nextern void chap_auth_peer(ppp_pcb *pcb, const char *our_name, int digest_code);\n#endif /* PPP_SERVER */\n\n/* Called by auth. code to start authenticating us to the peer. */\nextern void chap_auth_with_peer(ppp_pcb *pcb, const char *our_name, int digest_code);\n\n/* Represents the CHAP protocol to the main pppd code */\nextern const struct protent chap_protent;\n\n#endif /* CHAP_H */\n#endif /* PPP_SUPPORT && CHAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/chap_ms.h",
    "content": "/*\n * chap_ms.h - Challenge Handshake Authentication Protocol definitions.\n *\n * Copyright (c) 1995 Eric Rosenquist.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: chap_ms.h,v 1.13 2004/11/15 22:13:26 paulus Exp $\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && MSCHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#ifndef CHAPMS_INCLUDE\n#define CHAPMS_INCLUDE\n\nextern const struct chap_digest_type chapms_digest;\nextern const struct chap_digest_type chapms2_digest;\n\n#endif /* CHAPMS_INCLUDE */\n\n#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/eap.h",
    "content": "/*\n * eap.h - Extensible Authentication Protocol for PPP (RFC 2284)\n *\n * Copyright (c) 2001 by Sun Microsystems, Inc.\n * All rights reserved.\n *\n * Non-exclusive rights to redistribute, modify, translate, and use\n * this software in source and binary forms, in whole or in part, is\n * hereby granted, provided that the above copyright notice is\n * duplicated in any source form, and that neither the name of the\n * copyright holder nor the author is used to endorse or promote\n * products derived from this software.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\n * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n *\n * Original version by James Carlson\n *\n * $Id: eap.h,v 1.2 2003/06/11 23:56:26 paulus Exp $\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && EAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#ifndef PPP_EAP_H\n#define    PPP_EAP_H\n\n#include \"ppp.h\"\n\n#ifdef    __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * Packet header = Code, id, length.\n */\n#define    EAP_HEADERLEN    4\n\n\n/* EAP message codes. */\n#define    EAP_REQUEST    1\n#define    EAP_RESPONSE    2\n#define    EAP_SUCCESS    3\n#define    EAP_FAILURE    4\n\n/* EAP types */\n#define    EAPT_IDENTITY        1\n#define    EAPT_NOTIFICATION    2\n#define    EAPT_NAK        3    /* (response only) */\n#define    EAPT_MD5CHAP        4\n#define    EAPT_OTP        5    /* One-Time Password; RFC 1938 */\n#define    EAPT_TOKEN        6    /* Generic Token Card */\n/* 7 and 8 are unassigned. */\n#define    EAPT_RSA        9    /* RSA Public Key Authentication */\n#define    EAPT_DSS        10    /* DSS Unilateral */\n#define    EAPT_KEA        11    /* KEA */\n#define    EAPT_KEA_VALIDATE    12    /* KEA-VALIDATE    */\n#define    EAPT_TLS        13    /* EAP-TLS */\n#define    EAPT_DEFENDER        14    /* Defender Token (AXENT) */\n#define    EAPT_W2K        15    /* Windows 2000 EAP */\n#define    EAPT_ARCOT        16    /* Arcot Systems */\n#define    EAPT_CISCOWIRELESS    17    /* Cisco Wireless */\n#define    EAPT_NOKIACARD        18    /* Nokia IP smart card */\n#define    EAPT_SRP        19    /* Secure Remote Password */\n/* 20 is deprecated */\n\n/* EAP SRP-SHA1 Subtypes */\n#define    EAPSRP_CHALLENGE    1    /* Request 1 - Challenge */\n#define    EAPSRP_CKEY        1    /* Response 1 - Client Key */\n#define    EAPSRP_SKEY        2    /* Request 2 - Server Key */\n#define    EAPSRP_CVALIDATOR    2    /* Response 2 - Client Validator */\n#define    EAPSRP_SVALIDATOR    3    /* Request 3 - Server Validator */\n#define    EAPSRP_ACK        3    /* Response 3 - final ack */\n#define    EAPSRP_LWRECHALLENGE    4    /* Req/resp 4 - Lightweight rechal */\n\n#define    SRPVAL_EBIT    0x00000001    /* Use shared key for ECP */\n\n#define    SRP_PSEUDO_ID    \"pseudo_\"\n#define    SRP_PSEUDO_LEN    7\n\n#define MD5_SIGNATURE_SIZE    16\n#define EAP_MIN_CHALLENGE_LENGTH    17\n#define EAP_MAX_CHALLENGE_LENGTH    24\n#define EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH     3   /* 2^3-1 = 7, 17+7 = 24 */\n\n#define    EAP_STATES    \\\n    \"Initial\", \"Pending\", \"Closed\", \"Listen\", \"Identify\", \\\n    \"SRP1\", \"SRP2\", \"SRP3\", \"MD5Chall\", \"Open\", \"SRP4\", \"BadAuth\"\n\n#define    eap_client_active(pcb)    ((pcb)->eap.es_client.ea_state == eapListen)\n#if PPP_SERVER\n#define    eap_server_active(pcb)    \\\n    ((pcb)->eap.es_server.ea_state >= eapIdentify && \\\n     (pcb)->eap.es_server.ea_state <= eapMD5Chall)\n#endif /* PPP_SERVER */\n\n/*\n * Complete EAP state for one PPP session.\n */\nenum eap_state_code {\n    eapInitial = 0,    /* No EAP authentication yet requested */\n    eapPending,    /* Waiting for LCP (no timer) */\n    eapClosed,    /* Authentication not in use */\n    eapListen,    /* Client ready (and timer running) */\n    eapIdentify,    /* EAP Identify sent */\n    eapSRP1,    /* Sent EAP SRP-SHA1 Subtype 1 */\n    eapSRP2,    /* Sent EAP SRP-SHA1 Subtype 2 */\n    eapSRP3,    /* Sent EAP SRP-SHA1 Subtype 3 */\n    eapMD5Chall,    /* Sent MD5-Challenge */\n    eapOpen,    /* Completed authentication */\n    eapSRP4,    /* Sent EAP SRP-SHA1 Subtype 4 */\n    eapBadAuth    /* Failed authentication */\n};\n\nstruct eap_auth {\n    const char *ea_name;    /* Our name */\n    char ea_peer[MAXNAMELEN +1];    /* Peer's name */\n    void *ea_session;    /* Authentication library linkage */\n    u_char *ea_skey;    /* Shared encryption key */\n    u_short ea_namelen;    /* Length of our name */\n    u_short ea_peerlen;    /* Length of peer's name */\n    enum eap_state_code ea_state;\n    u_char ea_id;        /* Current id */\n    u_char ea_requests;    /* Number of Requests sent/received */\n    u_char ea_responses;    /* Number of Responses */\n    u_char ea_type;        /* One of EAPT_* */\n    u32_t ea_keyflags;    /* SRP shared key usage flags */\n};\n\n#ifndef EAP_MAX_CHALLENGE_LENGTH\n#define EAP_MAX_CHALLENGE_LENGTH    24\n#endif\ntypedef struct eap_state {\n    struct eap_auth es_client;    /* Client (authenticatee) data */\n#if PPP_SERVER\n    struct eap_auth es_server;    /* Server (authenticator) data */\n#endif /* PPP_SERVER */\n    int es_savedtime;        /* Saved timeout */\n    int es_rechallenge;        /* EAP rechallenge interval */\n    int es_lwrechallenge;        /* SRP lightweight rechallenge inter */\n    u8_t es_usepseudo;        /* Use SRP Pseudonym if offered one */\n    int es_usedpseudo;        /* Set if we already sent PN */\n    int es_challen;            /* Length of challenge string */\n    u_char es_challenge[EAP_MAX_CHALLENGE_LENGTH];\n} eap_state;\n\n/*\n * Timeouts.\n */\n#if 0 /* moved to ppp_opts.h */\n#define    EAP_DEFTIMEOUT        3    /* Timeout (seconds) for rexmit */\n#define    EAP_DEFTRANSMITS    10    /* max # times to transmit */\n#define    EAP_DEFREQTIME        20    /* Time to wait for peer request */\n#define    EAP_DEFALLOWREQ        20    /* max # times to accept requests */\n#endif /* moved to ppp_opts.h */\n\nvoid eap_authwithpeer(ppp_pcb *pcb, const char *localname);\nvoid eap_authpeer(ppp_pcb *pcb, const char *localname);\n\nextern const struct protent eap_protent;\n\n#ifdef    __cplusplus\n}\n#endif\n\n#endif /* PPP_EAP_H */\n\n#endif /* PPP_SUPPORT && EAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/ecp.h",
    "content": "/*\n * ecp.h - Definitions for PPP Encryption Control Protocol.\n *\n * Copyright (c) 2002 Google, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: ecp.h,v 1.2 2003/01/10 07:12:36 fcusack Exp $\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && ECP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\ntypedef struct ecp_options {\n    bool required;        /* Is ECP required? */\n    unsigned enctype;        /* Encryption type */\n} ecp_options;\n\nextern fsm ecp_fsm[];\nextern ecp_options ecp_wantoptions[];\nextern ecp_options ecp_gotoptions[];\nextern ecp_options ecp_allowoptions[];\nextern ecp_options ecp_hisoptions[];\n\nextern const struct protent ecp_protent;\n\n#endif /* PPP_SUPPORT && ECP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/eui64.h",
    "content": "/*\n * eui64.h - EUI64 routines for IPv6CP.\n *\n * Copyright (c) 1999 Tommi Komulainen.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Tommi Komulainen\n *     <Tommi.Komulainen@iki.fi>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: eui64.h,v 1.6 2002/12/04 23:03:32 paulus Exp $\n*/\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPP_IPV6_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#ifndef EUI64_H\n#define EUI64_H\n\n/*\n * @todo:\n *\n * Maybe this should be done by processing struct in6_addr directly...\n */\ntypedef union\n{\n    u8_t e8[8];\n    u16_t e16[4];\n    u32_t e32[2];\n} eui64_t;\n\n#define eui64_iszero(e)        (((e).e32[0] | (e).e32[1]) == 0)\n#define eui64_equals(e, o)    (((e).e32[0] == (o).e32[0]) && \\\n                ((e).e32[1] == (o).e32[1]))\n#define eui64_zero(e)        (e).e32[0] = (e).e32[1] = 0;\n\n#define eui64_copy(s, d)    memcpy(&(d), &(s), sizeof(eui64_t))\n\n#define eui64_magic(e)        do {            \\\n                (e).e32[0] = magic();    \\\n                (e).e32[1] = magic();    \\\n                (e).e8[0] &= ~2;    \\\n                } while (0)\n#define eui64_magic_nz(x)    do {                \\\n                eui64_magic(x);            \\\n                } while (eui64_iszero(x))\n#define eui64_magic_ne(x, y)    do {                \\\n                eui64_magic(x);            \\\n                } while (eui64_equals(x, y))\n\n#define eui64_get(ll, cp)    do {                \\\n                eui64_copy((*cp), (ll));    \\\n                (cp) += sizeof(eui64_t);    \\\n                } while (0)\n\n#define eui64_put(ll, cp)    do {                \\\n                eui64_copy((ll), (*cp));    \\\n                (cp) += sizeof(eui64_t);    \\\n                } while (0)\n\n#define eui64_set32(e, l)    do {            \\\n                (e).e32[0] = 0;        \\\n                (e).e32[1] = lwip_htonl(l);    \\\n                } while (0)\n#define eui64_setlo32(e, l)    eui64_set32(e, l)\n\nchar *eui64_ntoa(eui64_t);    /* Returns ascii representation of id */\n\n#endif /* EUI64_H */\n#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/fsm.h",
    "content": "/*\n * fsm.h - {Link, IP} Control Protocol Finite State Machine definitions.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: fsm.h,v 1.10 2004/11/13 02:28:15 paulus Exp $\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifndef FSM_H\n#define    FSM_H\n\n#include \"ppp.h\"\n\n/*\n * Packet header = Code, id, length.\n */\n#define HEADERLEN    4\n\n\n/*\n *  CP (LCP, IPCP, etc.) codes.\n */\n#define CONFREQ        1    /* Configuration Request */\n#define CONFACK        2    /* Configuration Ack */\n#define CONFNAK        3    /* Configuration Nak */\n#define CONFREJ        4    /* Configuration Reject */\n#define TERMREQ        5    /* Termination Request */\n#define TERMACK        6    /* Termination Ack */\n#define CODEREJ        7    /* Code Reject */\n\n\n/*\n * Each FSM is described by an fsm structure and fsm callbacks.\n */\ntypedef struct fsm {\n    ppp_pcb *pcb;        /* PPP Interface */\n    const struct fsm_callbacks *callbacks;    /* Callback routines */\n    const char *term_reason;    /* Reason for closing protocol */\n    u8_t seen_ack;        /* Have received valid Ack/Nak/Rej to Req */\n                  /* -- This is our only flag, we might use u_int :1 if we have more flags */\n    u16_t protocol;        /* Data Link Layer Protocol field value */\n    u8_t state;            /* State */\n    u8_t flags;            /* Contains option bits */\n    u8_t id;            /* Current id */\n    u8_t reqid;            /* Current request id */\n    u8_t retransmits;        /* Number of retransmissions left */\n    u8_t nakloops;        /* Number of nak loops since last ack */\n    u8_t rnakloops;        /* Number of naks received */\n    u8_t maxnakloops;        /* Maximum number of nak loops tolerated\n                   (necessary because IPCP require a custom large max nak loops value) */\n    u8_t term_reason_len;    /* Length of term_reason */\n} fsm;\n\n\ntypedef struct fsm_callbacks {\n    void (*resetci)        /* Reset our Configuration Information */\n        (fsm *);\n    int  (*cilen)        /* Length of our Configuration Information */\n        (fsm *);\n    void (*addci)         /* Add our Configuration Information */\n        (fsm *, u_char *, int *);\n    int  (*ackci)        /* ACK our Configuration Information */\n        (fsm *, u_char *, int);\n    int  (*nakci)        /* NAK our Configuration Information */\n        (fsm *, u_char *, int, int);\n    int  (*rejci)        /* Reject our Configuration Information */\n        (fsm *, u_char *, int);\n    int  (*reqci)        /* Request peer's Configuration Information */\n        (fsm *, u_char *, int *, int);\n    void (*up)            /* Called when fsm reaches PPP_FSM_OPENED state */\n        (fsm *);\n    void (*down)        /* Called when fsm leaves PPP_FSM_OPENED state */\n        (fsm *);\n    void (*starting)        /* Called when we want the lower layer */\n        (fsm *);\n    void (*finished)        /* Called when we don't want the lower layer */\n        (fsm *);\n    void (*protreject)        /* Called when Protocol-Reject received */\n        (int);\n    void (*retransmit)        /* Retransmission is necessary */\n        (fsm *);\n    int  (*extcode)        /* Called when unknown code received */\n        (fsm *, int, int, u_char *, int);\n    const char *proto_name;    /* String name for protocol (for messages) */\n} fsm_callbacks;\n\n\n/*\n * Link states.\n */\n#define PPP_FSM_INITIAL        0    /* Down, hasn't been opened */\n#define PPP_FSM_STARTING    1    /* Down, been opened */\n#define PPP_FSM_CLOSED        2    /* Up, hasn't been opened */\n#define PPP_FSM_STOPPED        3    /* Open, waiting for down event */\n#define PPP_FSM_CLOSING        4    /* Terminating the connection, not open */\n#define PPP_FSM_STOPPING    5    /* Terminating, but open */\n#define PPP_FSM_REQSENT        6    /* We've sent a Config Request */\n#define PPP_FSM_ACKRCVD        7    /* We've received a Config Ack */\n#define PPP_FSM_ACKSENT        8    /* We've sent a Config Ack */\n#define PPP_FSM_OPENED        9    /* Connection available */\n\n\n/*\n * Flags - indicate options controlling FSM operation\n */\n#define OPT_PASSIVE    1    /* Don't die if we don't get a response */\n#define OPT_RESTART    2    /* Treat 2nd OPEN as DOWN, UP */\n#define OPT_SILENT    4    /* Wait for peer to speak first */\n\n\n/*\n * Timeouts.\n */\n#if 0 /* moved to ppp_opts.h */\n#define DEFTIMEOUT    3    /* Timeout time in seconds */\n#define DEFMAXTERMREQS    2    /* Maximum Terminate-Request transmissions */\n#define DEFMAXCONFREQS    10    /* Maximum Configure-Request transmissions */\n#define DEFMAXNAKLOOPS    5    /* Maximum number of nak loops */\n#endif /* moved to ppp_opts.h */\n\n\n/*\n * Prototypes\n */\nvoid fsm_init(fsm *f);\nvoid fsm_lowerup(fsm *f);\nvoid fsm_lowerdown(fsm *f);\nvoid fsm_open(fsm *f);\nvoid fsm_close(fsm *f, const char *reason);\nvoid fsm_input(fsm *f, u_char *inpacket, int l);\nvoid fsm_protreject(fsm *f);\nvoid fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen);\n\n\n#endif /* FSM_H */\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/ipcp.h",
    "content": "/*\n * ipcp.h - IP Control Protocol definitions.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: ipcp.h,v 1.14 2002/12/04 23:03:32 paulus Exp $\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPP_IPV4_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifndef IPCP_H\n#define    IPCP_H\n\n/*\n * Options.\n */\n#define CI_ADDRS    1    /* IP Addresses */\n#if VJ_SUPPORT\n#define CI_COMPRESSTYPE    2    /* Compression Type */\n#endif /* VJ_SUPPORT */\n#define    CI_ADDR        3\n\n#if LWIP_DNS\n#define CI_MS_DNS1      129    /* Primary DNS value */\n#define CI_MS_DNS2      131     /* Secondary DNS value */\n#endif /* LWIP_DNS */\n#if 0 /* UNUSED - WINS */\n#define CI_MS_WINS1     130     /* Primary WINS value */\n#define CI_MS_WINS2     132    /* Secondary WINS value */\n#endif /* UNUSED - WINS */\n\n#if VJ_SUPPORT\n#define MAX_STATES 16        /* from slcompress.h */\n\n#define IPCP_VJMODE_OLD 1    /* \"old\" mode (option # = 0x0037) */\n#define IPCP_VJMODE_RFC1172 2    /* \"old-rfc\"mode (option # = 0x002d) */\n#define IPCP_VJMODE_RFC1332 3    /* \"new-rfc\"mode (option # = 0x002d, */\n                                /*  maxslot and slot number compression) */\n\n#define IPCP_VJ_COMP 0x002d    /* current value for VJ compression option*/\n#define IPCP_VJ_COMP_OLD 0x0037    /* \"old\" (i.e, broken) value for VJ */\n                /* compression option*/ \n#endif /* VJ_SUPPORT */\n\ntypedef struct ipcp_options {\n    unsigned int neg_addr               :1; /* Negotiate IP Address? */\n    unsigned int old_addrs              :1; /* Use old (IP-Addresses) option? */\n    unsigned int req_addr               :1; /* Ask peer to send IP address? */\n#if 0 /* UNUSED */\n    unsigned int default_route          :1; /* Assign default route through interface? */\n    unsigned int replace_default_route  :1; /* Replace default route through interface? */\n#endif /* UNUSED */\n#if 0 /* UNUSED - PROXY ARP */\n    unsigned int proxy_arp              :1; /* Make proxy ARP entry for peer? */\n#endif /* UNUSED - PROXY ARP */\n#if VJ_SUPPORT\n    unsigned int neg_vj                 :1; /* Van Jacobson Compression? */\n    unsigned int old_vj                 :1; /* use old (short) form of VJ option? */\n    unsigned int cflag                  :1;\n#endif /* VJ_SUPPORT */\n    unsigned int accept_local           :1; /* accept peer's value for ouraddr */\n    unsigned int accept_remote          :1; /* accept peer's value for hisaddr */\n#if LWIP_DNS\n    unsigned int req_dns1               :1; /* Ask peer to send primary DNS address? */\n    unsigned int req_dns2               :1; /* Ask peer to send secondary DNS address? */\n#endif /* LWIP_DNS */\n\n    u32_t ouraddr, hisaddr;    /* Addresses in NETWORK BYTE ORDER */\n#if LWIP_DNS\n    u32_t dnsaddr[2];    /* Primary and secondary MS DNS entries */\n#endif /* LWIP_DNS */\n#if 0 /* UNUSED - WINS */\n    u32_t winsaddr[2];    /* Primary and secondary MS WINS entries */\n#endif /* UNUSED - WINS */\n\n#if VJ_SUPPORT\n    u16_t vj_protocol;        /* protocol value to use in VJ option */\n    u8_t  maxslotindex;        /* values for RFC1332 VJ compression neg. */\n#endif /* VJ_SUPPORT */\n} ipcp_options;\n\n#if 0 /* UNUSED, already defined by lwIP */\nchar *ip_ntoa (u32_t);\n#endif /* UNUSED, already defined by lwIP */\n\nextern const struct protent ipcp_protent;\n\n#endif /* IPCP_H */\n#endif /* PPP_SUPPORT && PPP_IPV4_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/ipv6cp.h",
    "content": "/*\n * ipv6cp.h - PPP IPV6 Control Protocol.\n *\n * Copyright (c) 1999 Tommi Komulainen.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Tommi Komulainen\n *     <Tommi.Komulainen@iki.fi>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n */\n\n/*  Original version, based on RFC2023 :\n\n    Copyright (c) 1995, 1996, 1997 Francis.Dupont@inria.fr, INRIA Rocquencourt,\n    Alain.Durand@imag.fr, IMAG,\n    Jean-Luc.Richier@imag.fr, IMAG-LSR.\n\n    Copyright (c) 1998, 1999 Francis.Dupont@inria.fr, GIE DYADE,\n    Alain.Durand@imag.fr, IMAG,\n    Jean-Luc.Richier@imag.fr, IMAG-LSR.\n\n    Ce travail a été fait au sein du GIE DYADE (Groupement d'Intérêt\n    Économique ayant pour membres BULL S.A. et l'INRIA).\n\n    Ce logiciel informatique est disponible aux conditions\n    usuelles dans la recherche, c'est-à-dire qu'il peut\n    être utilisé, copié, modifié, distribué à l'unique\n    condition que ce texte soit conservé afin que\n    l'origine de ce logiciel soit reconnue.\n\n    Le nom de l'Institut National de Recherche en Informatique\n    et en Automatique (INRIA), de l'IMAG, ou d'une personne morale\n    ou physique ayant participé à l'élaboration de ce logiciel ne peut\n    être utilisé sans son accord préalable explicite.\n\n    Ce logiciel est fourni tel quel sans aucune garantie,\n    support ou responsabilité d'aucune sorte.\n    Ce logiciel est dérivé de sources d'origine\n    \"University of California at Berkeley\" et\n    \"Digital Equipment Corporation\" couvertes par des copyrights.\n\n    L'Institut d'Informatique et de Mathématiques Appliquées de Grenoble (IMAG)\n    est une fédération d'unités mixtes de recherche du CNRS, de l'Institut National\n    Polytechnique de Grenoble et de l'Université Joseph Fourier regroupant\n    sept laboratoires dont le laboratoire Logiciels, Systèmes, Réseaux (LSR).\n\n    This work has been done in the context of GIE DYADE (joint R & D venture\n    between BULL S.A. and INRIA).\n\n    This software is available with usual \"research\" terms\n    with the aim of retain credits of the software. \n    Permission to use, copy, modify and distribute this software for any\n    purpose and without fee is hereby granted, provided that the above\n    copyright notice and this permission notice appear in all copies,\n    and the name of INRIA, IMAG, or any contributor not be used in advertising\n    or publicity pertaining to this material without the prior explicit\n    permission. The software is provided \"as is\" without any\n    warranties, support or liabilities of any kind.\n    This software is derived from source code from\n    \"University of California at Berkeley\" and\n    \"Digital Equipment Corporation\" protected by copyrights.\n\n    Grenoble's Institute of Computer Science and Applied Mathematics (IMAG)\n    is a federation of seven research units funded by the CNRS, National\n    Polytechnic Institute of Grenoble and University Joseph Fourier.\n    The research unit in Software, Systems, Networks (LSR) is member of IMAG.\n*/\n\n/*\n * Derived from :\n *\n *\n * ipcp.h - IP Control Protocol definitions.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: ipv6cp.h,v 1.7 2002/12/04 23:03:32 paulus Exp $\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPP_IPV6_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#ifndef IPV6CP_H\n#define    IPV6CP_H\n\n#include \"eui64.h\"\n\n/*\n * Options.\n */\n#define CI_IFACEID    1    /* Interface Identifier */\n#ifdef IPV6CP_COMP\n#define CI_COMPRESSTYPE    2    /* Compression Type     */\n#endif /* IPV6CP_COMP */\n\n/* No compression types yet defined.\n *#define IPV6CP_COMP    0x004f\n */\ntypedef struct ipv6cp_options {\n    unsigned int neg_ifaceid    :1;  /* Negotiate interface identifier? */\n    unsigned int req_ifaceid    :1;  /* Ask peer to send interface identifier? */\n    unsigned int accept_local   :1;  /* accept peer's value for iface id? */\n    unsigned int opt_local      :1;  /* ourtoken set by option */\n    unsigned int opt_remote     :1;  /* histoken set by option */\n    unsigned int use_ip         :1;  /* use IP as interface identifier */\n#if 0\n    unsigned int use_persistent :1;  /* use uniquely persistent value for address */\n#endif\n#ifdef IPV6CP_COMP\n    unsigned int neg_vj         :1;  /* Van Jacobson Compression? */\n#endif /* IPV6CP_COMP */\n\n#ifdef IPV6CP_COMP\n    u_short vj_protocol;        /* protocol value to use in VJ option */\n#endif /* IPV6CP_COMP */\n    eui64_t ourid, hisid;       /* Interface identifiers */\n} ipv6cp_options;\n\nextern const struct protent ipv6cp_protent;\n\n#endif /* IPV6CP_H */\n#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/lcp.h",
    "content": "/*\n * lcp.h - Link Control Protocol definitions.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: lcp.h,v 1.20 2004/11/14 22:53:42 carlsonj Exp $\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifndef LCP_H\n#define    LCP_H\n\n#include \"ppp.h\"\n\n/*\n * Options.\n */\n#define CI_VENDOR    0    /* Vendor Specific */\n#define CI_MRU        1    /* Maximum Receive Unit */\n#define CI_ASYNCMAP    2    /* Async Control Character Map */\n#define CI_AUTHTYPE    3    /* Authentication Type */\n#define CI_QUALITY    4    /* Quality Protocol */\n#define CI_MAGICNUMBER    5    /* Magic Number */\n#define CI_PCOMPRESSION    7    /* Protocol Field Compression */\n#define CI_ACCOMPRESSION 8    /* Address/Control Field Compression */\n#define CI_FCSALTERN    9    /* FCS-Alternatives */\n#define CI_SDP        10    /* Self-Describing-Pad */\n#define CI_NUMBERED    11    /* Numbered-Mode */\n#define CI_CALLBACK    13    /* callback */\n#define CI_MRRU        17    /* max reconstructed receive unit; multilink */\n#define CI_SSNHF    18    /* short sequence numbers for multilink */\n#define CI_EPDISC    19    /* endpoint discriminator */\n#define CI_MPPLUS    22    /* Multi-Link-Plus-Procedure */\n#define CI_LDISC    23    /* Link-Discriminator */\n#define CI_LCPAUTH    24    /* LCP Authentication */\n#define CI_COBS        25    /* Consistent Overhead Byte Stuffing */\n#define CI_PREFELIS    26    /* Prefix Elision */\n#define CI_MPHDRFMT    27    /* MP Header Format */\n#define CI_I18N        28    /* Internationalization */\n#define CI_SDL        29    /* Simple Data Link */\n\n/*\n * LCP-specific packet types (code numbers).\n */\n#define PROTREJ        8    /* Protocol Reject */\n#define ECHOREQ        9    /* Echo Request */\n#define ECHOREP        10    /* Echo Reply */\n#define DISCREQ        11    /* Discard Request */\n#define IDENTIF        12    /* Identification */\n#define TIMEREM        13    /* Time Remaining */\n\n/* Value used as data for CI_CALLBACK option */\n#define CBCP_OPT    6    /* Use callback control protocol */\n\n#if 0 /* moved to ppp_opts.h */\n#define DEFMRU    1500        /* Try for this */\n#define MINMRU    128        /* No MRUs below this */\n#define MAXMRU    16384        /* Normally limit MRU to this */\n#endif /* moved to ppp_opts.h */\n\n/* An endpoint discriminator, used with multilink. */\n#define MAX_ENDP_LEN    20    /* maximum length of discriminator value */\nstruct epdisc {\n    unsigned char    class_; /* -- The word \"class\" is reserved in C++. */\n    unsigned char    length;\n    unsigned char    value[MAX_ENDP_LEN];\n};\n\n/*\n * The state of options is described by an lcp_options structure.\n */\ntypedef struct lcp_options {\n    unsigned int passive           :1; /* Don't die if we don't get a response */\n    unsigned int silent            :1; /* Wait for the other end to start first */\n#if 0 /* UNUSED */\n    unsigned int restart           :1; /* Restart vs. exit after close */\n#endif /* UNUSED */\n    unsigned int neg_mru           :1; /* Negotiate the MRU? */\n    unsigned int neg_asyncmap      :1; /* Negotiate the async map? */\n#if PAP_SUPPORT\n    unsigned int neg_upap          :1; /* Ask for UPAP authentication? */\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n    unsigned int neg_chap          :1; /* Ask for CHAP authentication? */\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n    unsigned int neg_eap           :1; /* Ask for EAP authentication? */\n#endif /* EAP_SUPPORT */\n    unsigned int neg_magicnumber   :1; /* Ask for magic number? */\n    unsigned int neg_pcompression  :1; /* HDLC Protocol Field Compression? */\n    unsigned int neg_accompression :1; /* HDLC Address/Control Field Compression? */\n#if LQR_SUPPORT\n    unsigned int neg_lqr           :1; /* Negotiate use of Link Quality Reports */\n#endif /* LQR_SUPPORT */\n    unsigned int neg_cbcp          :1; /* Negotiate use of CBCP */\n#ifdef HAVE_MULTILINK\n    unsigned int neg_mrru          :1; /* negotiate multilink MRRU */\n#endif /* HAVE_MULTILINK */\n    unsigned int neg_ssnhf         :1; /* negotiate short sequence numbers */\n    unsigned int neg_endpoint      :1; /* negotiate endpoint discriminator */\n\n    u16_t mru;            /* Value of MRU */\n#ifdef HAVE_MULTILINK\n    u16_t mrru;            /* Value of MRRU, and multilink enable */\n#endif /* MULTILINK */\n#if CHAP_SUPPORT\n    u8_t chap_mdtype;        /* which MD types (hashing algorithm) */\n#endif /* CHAP_SUPPORT */\n    u32_t asyncmap;        /* Value of async map */\n    u32_t magicnumber;\n    u8_t  numloops;        /* Number of loops during magic number neg. */\n#if LQR_SUPPORT\n    u32_t lqr_period;    /* Reporting period for LQR 1/100ths second */\n#endif /* LQR_SUPPORT */\n    struct epdisc endpoint;    /* endpoint discriminator */\n} lcp_options;\n\nvoid lcp_open(ppp_pcb *pcb);\nvoid lcp_close(ppp_pcb *pcb, const char *reason);\nvoid lcp_lowerup(ppp_pcb *pcb);\nvoid lcp_lowerdown(ppp_pcb *pcb);\nvoid lcp_sprotrej(ppp_pcb *pcb, u_char *p, int len);    /* send protocol reject */\n\nextern const struct protent lcp_protent;\n\n#if 0 /* moved to ppp_opts.h */\n/* Default number of times we receive our magic number from the peer\n   before deciding the link is looped-back. */\n#define DEFLOOPBACKFAIL    10\n#endif /* moved to ppp_opts.h */\n\n#endif /* LCP_H */\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/magic.h",
    "content": "/*\n * magic.h - PPP Magic Number definitions.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: magic.h,v 1.5 2003/06/11 23:56:26 paulus Exp $\n */\n/*****************************************************************************\n* randm.h - Random number generator header file.\n*\n* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.\n* Copyright (c) 1998 Global Election Systems Inc.\n*\n* The authors hereby grant permission to use, copy, modify, distribute,\n* and license this software and its documentation for any purpose, provided\n* that existing copyright notices are retained in all copies and that this\n* notice and the following disclaimer are included verbatim in any\n* distributions. No written agreement, license, or royalty fee is required\n* for any of the authorized uses.\n*\n* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR\n* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n******************************************************************************\n* REVISION HISTORY\n*\n* 03-01-01 Marc Boucher <marc@mbsi.ca>\n*   Ported to lwIP.\n* 98-05-29 Guy Lancaster <glanca@gesn.com>, Global Election Systems Inc.\n*   Extracted from avos.\n*****************************************************************************/\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifndef MAGIC_H\n#define MAGIC_H\n\n/***********************\n*** PUBLIC FUNCTIONS ***\n***********************/\n\n/*\n * Initialize the random number generator.\n */\nvoid magic_init(void);\n\n/*\n * Randomize our random seed value.  To be called for truely random events\n * such as user operations and network traffic.\n */\nvoid magic_randomize(void);\n\n/*\n * Return a new random number.\n */\nu32_t magic(void);    /* Returns the next magic number */\n\n/*\n * Fill buffer with random bytes\n *\n * Use the random pool to generate random data.  This degrades to pseudo\n * random when used faster than randomness is supplied using magic_churnrand().\n * Thus it's important to make sure that the results of this are not\n * published directly because one could predict the next result to at\n * least some degree.  Also, it's important to get a good seed before\n * the first use.\n */\nvoid magic_random_bytes(unsigned char *buf, u32_t buf_len);\n\n/*\n * Return a new random number between 0 and (2^pow)-1 included.\n */\nu32_t magic_pow(u8_t pow);\n\n#endif /* MAGIC_H */\n\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/mppe.h",
    "content": "/*\n * mppe.h - Definitions for MPPE\n *\n * Copyright (c) 2008 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && MPPE_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#ifndef MPPE_H\n#define MPPE_H\n\n#include \"netif/ppp/pppcrypt.h\"\n\n#define MPPE_PAD        4    /* MPPE growth per frame */\n#define MPPE_MAX_KEY_LEN    16    /* largest key length (128-bit) */\n\n/* option bits for ccp_options.mppe */\n#define MPPE_OPT_40        0x01    /* 40 bit */\n#define MPPE_OPT_128        0x02    /* 128 bit */\n#define MPPE_OPT_STATEFUL    0x04    /* stateful mode */\n/* unsupported opts */\n#define MPPE_OPT_56        0x08    /* 56 bit */\n#define MPPE_OPT_MPPC        0x10    /* MPPC compression */\n#define MPPE_OPT_D        0x20    /* Unknown */\n#define MPPE_OPT_UNSUPPORTED (MPPE_OPT_56|MPPE_OPT_MPPC|MPPE_OPT_D)\n#define MPPE_OPT_UNKNOWN    0x40    /* Bits !defined in RFC 3078 were set */\n\n/*\n * This is not nice ... the alternative is a bitfield struct though.\n * And unfortunately, we cannot share the same bits for the option\n * names above since C and H are the same bit.  We could do a u_int32\n * but then we have to do a lwip_htonl() all the time and/or we still need\n * to know which octet is which.\n */\n#define MPPE_C_BIT        0x01    /* MPPC */\n#define MPPE_D_BIT        0x10    /* Obsolete, usage unknown */\n#define MPPE_L_BIT        0x20    /* 40-bit */\n#define MPPE_S_BIT        0x40    /* 128-bit */\n#define MPPE_M_BIT        0x80    /* 56-bit, not supported */\n#define MPPE_H_BIT        0x01    /* Stateless (in a different byte) */\n\n/* Does not include H bit; used for least significant octet only. */\n#define MPPE_ALL_BITS (MPPE_D_BIT|MPPE_L_BIT|MPPE_S_BIT|MPPE_M_BIT|MPPE_H_BIT)\n\n/* Build a CI from mppe opts (see RFC 3078) */\n#define MPPE_OPTS_TO_CI(opts, ci)        \\\n    do {                    \\\n    u_char *ptr = ci; /* u_char[4] */    \\\n                        \\\n    /* H bit */                \\\n    if (opts & MPPE_OPT_STATEFUL)        \\\n        *ptr++ = 0x0;            \\\n    else                    \\\n        *ptr++ = MPPE_H_BIT;        \\\n    *ptr++ = 0;                \\\n    *ptr++ = 0;                \\\n                        \\\n    /* S,L bits */                \\\n    *ptr = 0;                \\\n    if (opts & MPPE_OPT_128)        \\\n        *ptr |= MPPE_S_BIT;            \\\n    if (opts & MPPE_OPT_40)            \\\n        *ptr |= MPPE_L_BIT;            \\\n    /* M,D,C bits not supported */        \\\n    } while (/* CONSTCOND */ 0)\n\n/* The reverse of the above */\n#define MPPE_CI_TO_OPTS(ci, opts)        \\\n    do {                    \\\n    const u_char *ptr = ci; /* u_char[4] */    \\\n                        \\\n    opts = 0;                \\\n                        \\\n    /* H bit */                \\\n    if (!(ptr[0] & MPPE_H_BIT))        \\\n        opts |= MPPE_OPT_STATEFUL;        \\\n                        \\\n    /* S,L bits */                \\\n    if (ptr[3] & MPPE_S_BIT)        \\\n        opts |= MPPE_OPT_128;        \\\n    if (ptr[3] & MPPE_L_BIT)        \\\n        opts |= MPPE_OPT_40;        \\\n                        \\\n    /* M,D,C bits */            \\\n    if (ptr[3] & MPPE_M_BIT)        \\\n        opts |= MPPE_OPT_56;        \\\n    if (ptr[3] & MPPE_D_BIT)        \\\n        opts |= MPPE_OPT_D;            \\\n    if (ptr[3] & MPPE_C_BIT)        \\\n        opts |= MPPE_OPT_MPPC;        \\\n                        \\\n    /* Other bits */            \\\n    if (ptr[0] & ~MPPE_H_BIT)        \\\n        opts |= MPPE_OPT_UNKNOWN;        \\\n    if (ptr[1] || ptr[2])            \\\n        opts |= MPPE_OPT_UNKNOWN;        \\\n    if (ptr[3] & ~MPPE_ALL_BITS)        \\\n        opts |= MPPE_OPT_UNKNOWN;        \\\n    } while (/* CONSTCOND */ 0)\n\n/* Shared MPPE padding between MSCHAP and MPPE */\n#define SHA1_PAD_SIZE 40\n\nstatic const u8_t mppe_sha1_pad1[SHA1_PAD_SIZE] = {\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\nstatic const u8_t mppe_sha1_pad2[SHA1_PAD_SIZE] = {\n  0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,\n  0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,\n  0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,\n  0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2\n};\n\n/*\n * State for an MPPE (de)compressor.\n */\ntypedef struct ppp_mppe_state {\n    lwip_arc4_context arc4;\n    u8_t master_key[MPPE_MAX_KEY_LEN];\n    u8_t session_key[MPPE_MAX_KEY_LEN];\n    u8_t keylen;                /* key length in bytes */\n    /* NB: 128-bit == 16, 40-bit == 8!\n     * If we want to support 56-bit, the unit has to change to bits\n     */\n    u8_t bits;                  /* MPPE control bits */\n    u16_t ccount;               /* 12-bit coherency count (seqno)  */\n    u16_t sanity_errors;        /* take down LCP if too many */\n    unsigned int stateful  :1;  /* stateful mode flag */\n    unsigned int discard   :1;  /* stateful mode packet loss flag */\n} ppp_mppe_state;\n\nvoid mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key);\nvoid mppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options);\nvoid mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state);\nerr_t mppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t protocol);\nvoid mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state);\nerr_t mppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb);\n\n#endif /* MPPE_H */\n#endif /* PPP_SUPPORT && MPPE_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/polarssl/arc4.h",
    "content": "/**\n * \\file arc4.h\n *\n *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine\n *\n *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>\n *\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *    * Neither the names of PolarSSL or XySSL nor the names of its contributors\n *      may be used to endorse or promote products derived from this software\n *      without specific prior written permission.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if LWIP_INCLUDED_POLARSSL_ARC4/*lint -e553*/\n\n#ifndef LWIP_INCLUDED_POLARSSL_ARC4_H\n#define LWIP_INCLUDED_POLARSSL_ARC4_H\n\n/**\n * \\brief          ARC4 context structure\n */\ntypedef struct\n{\n    int x;                      /*!< permutation index */\n    int y;                      /*!< permutation index */\n    unsigned char m[256];       /*!< permutation table */\n}\narc4_context;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          ARC4 key schedule\n *\n * \\param ctx      ARC4 context to be initialized\n * \\param key      the secret key\n * \\param keylen   length of the key\n */\nvoid arc4_setup( arc4_context *ctx, unsigned char *key, int keylen );\n\n/**\n * \\brief          ARC4 cipher function\n *\n * \\param ctx      ARC4 context\n * \\param buf      buffer to be processed\n * \\param buflen   amount of data in buf\n */\nvoid arc4_crypt( arc4_context *ctx, unsigned char *buf, int buflen );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_INCLUDED_POLARSSL_ARC4_H */\n\n#endif /* LWIP_INCLUDED_POLARSSL_ARC4 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/polarssl/des.h",
    "content": "/**\n * \\file des.h\n *\n *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine\n *\n *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>\n *\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *  \n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *    * Neither the names of PolarSSL or XySSL nor the names of its contributors\n *      may be used to endorse or promote products derived from this software\n *      without specific prior written permission.\n *  \n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if LWIP_INCLUDED_POLARSSL_DES\n\n#ifndef LWIP_INCLUDED_POLARSSL_DES_H\n#define LWIP_INCLUDED_POLARSSL_DES_H\n\n#define DES_ENCRYPT     1\n#define DES_DECRYPT     0\n\n/**\n * \\brief          DES context structure\n */\ntypedef struct\n{\n    int mode;                   /*!<  encrypt/decrypt   */\n    unsigned long sk[32];       /*!<  DES subkeys       */\n}\ndes_context;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          DES key schedule (56-bit, encryption)\n *\n * \\param ctx      DES context to be initialized\n * \\param key      8-byte secret key\n */\nvoid des_setkey_enc( des_context *ctx, unsigned char key[8] );\n\n/**\n * \\brief          DES key schedule (56-bit, decryption)\n *\n * \\param ctx      DES context to be initialized\n * \\param key      8-byte secret key\n */\nvoid des_setkey_dec( des_context *ctx, unsigned char key[8] );\n\n/**\n * \\brief          DES-ECB block encryption/decryption\n *\n * \\param ctx      DES context\n * \\param input    64-bit input block\n * \\param output   64-bit output block\n */\nvoid des_crypt_ecb( des_context *ctx,\n                    const unsigned char input[8],\n                    unsigned char output[8] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_INCLUDED_POLARSSL_DES_H */\n\n#endif /* LWIP_INCLUDED_POLARSSL_DES */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/polarssl/md4.h",
    "content": "/**\n * \\file md4.h\n *\n *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine\n *\n *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>\n *\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *  \n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *    * Neither the names of PolarSSL or XySSL nor the names of its contributors\n *      may be used to endorse or promote products derived from this software\n *      without specific prior written permission.\n *  \n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if LWIP_INCLUDED_POLARSSL_MD4\n\n#ifndef LWIP_INCLUDED_POLARSSL_MD4_H\n#define LWIP_INCLUDED_POLARSSL_MD4_H\n\n/**\n * \\brief          MD4 context structure\n */\ntypedef struct\n{\n    unsigned long total[2];     /*!< number of bytes processed  */\n    unsigned long state[4];     /*!< intermediate digest state  */\n    unsigned char buffer[64];   /*!< data block being processed */\n}\nmd4_context;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          MD4 context setup\n *\n * \\param ctx      context to be initialized\n */\nvoid md4_starts( md4_context *ctx );\n\n/**\n * \\brief          MD4 process buffer\n *\n * \\param ctx      MD4 context\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n */\nvoid md4_update( md4_context *ctx, const unsigned char *input, int ilen );\n\n/**\n * \\brief          MD4 final digest\n *\n * \\param ctx      MD4 context\n * \\param output   MD4 checksum result\n */\nvoid md4_finish( md4_context *ctx, unsigned char output[16] );\n\n/**\n * \\brief          Output = MD4( input buffer )\n *\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   MD4 checksum result\n */\nvoid md4( unsigned char *input, int ilen, unsigned char output[16] );\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_INCLUDED_POLARSSL_MD4_H */\n\n#endif /* LWIP_INCLUDED_POLARSSL_MD4 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/polarssl/md5.h",
    "content": "/**\n * \\file md5.h\n *\n *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine\n *\n *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>\n *\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *    * Neither the names of PolarSSL or XySSL nor the names of its contributors\n *      may be used to endorse or promote products derived from this software\n *      without specific prior written permission.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if LWIP_INCLUDED_POLARSSL_MD5/*lint -e553*/\n\n#ifndef LWIP_INCLUDED_POLARSSL_MD5_H\n#define LWIP_INCLUDED_POLARSSL_MD5_H\n\n/**\n * \\brief          MD5 context structure\n */\ntypedef struct\n{\n    unsigned long total[2];     /*!< number of bytes processed  */\n    unsigned long state[4];     /*!< intermediate digest state  */\n    unsigned char buffer[64];   /*!< data block being processed */\n}\nmd5_context;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          MD5 context setup\n *\n * \\param ctx      context to be initialized\n */\nvoid md5_starts( md5_context *ctx );\n\n/**\n * \\brief          MD5 process buffer\n *\n * \\param ctx      MD5 context\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n */\nvoid md5_update( md5_context *ctx, const unsigned char *input, int ilen );\n\n/**\n * \\brief          MD5 final digest\n *\n * \\param ctx      MD5 context\n * \\param output   MD5 checksum result\n */\nvoid md5_finish( md5_context *ctx, unsigned char output[16] );\n\n/**\n * \\brief          Output = MD5( input buffer )\n *\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   MD5 checksum result\n */\nvoid md5( unsigned char *input, int ilen, unsigned char output[16] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_INCLUDED_POLARSSL_MD5_H */\n\n#endif /* LWIP_INCLUDED_POLARSSL_MD5 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/polarssl/sha1.h",
    "content": "/**\n * \\file sha1.h\n *\n *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine\n *\n *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>\n *\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *    * Neither the names of PolarSSL or XySSL nor the names of its contributors\n *      may be used to endorse or promote products derived from this software\n *      without specific prior written permission.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if LWIP_INCLUDED_POLARSSL_SHA1/*lint -e553*/\n\n#ifndef LWIP_INCLUDED_POLARSSL_SHA1_H\n#define LWIP_INCLUDED_POLARSSL_SHA1_H\n\n/**\n * \\brief          SHA-1 context structure\n */\ntypedef struct\n{\n    unsigned long total[2];     /*!< number of bytes processed  */\n    unsigned long state[5];     /*!< intermediate digest state  */\n    unsigned char buffer[64];   /*!< data block being processed */\n}\nsha1_context;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          SHA-1 context setup\n *\n * \\param ctx      context to be initialized\n */\nvoid sha1_starts( sha1_context *ctx );\n\n/**\n * \\brief          SHA-1 process buffer\n *\n * \\param ctx      SHA-1 context\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n */\nvoid sha1_update( sha1_context *ctx, const unsigned char *input, int ilen );\n\n/**\n * \\brief          SHA-1 final digest\n *\n * \\param ctx      SHA-1 context\n * \\param output   SHA-1 checksum result\n */\nvoid sha1_finish( sha1_context *ctx, unsigned char output[20] );\n\n/**\n * \\brief          Output = SHA-1( input buffer )\n *\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   SHA-1 checksum result\n */\nvoid sha1( unsigned char *input, int ilen, unsigned char output[20] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_INCLUDED_POLARSSL_SHA1_H */\n\n#endif /* LWIP_INCLUDED_POLARSSL_SHA1 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/ppp.h",
    "content": "/*****************************************************************************\n* ppp.h - Network Point to Point Protocol header file.\n*\n* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.\n* portions Copyright (c) 1997 Global Election Systems Inc.\n*\n* The authors hereby grant permission to use, copy, modify, distribute,\n* and license this software and its documentation for any purpose, provided\n* that existing copyright notices are retained in all copies and that this\n* notice and the following disclaimer are included verbatim in any \n* distributions. No written agreement, license, or royalty fee is required\n* for any of the authorized uses.\n*\n* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR\n* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n******************************************************************************\n* REVISION HISTORY\n*\n* 03-01-01 Marc Boucher <marc@mbsi.ca>\n*   Ported to lwIP.\n* 97-11-05 Guy Lancaster <glanca@gesn.com>, Global Election Systems Inc.\n*   Original derived from BSD codes.\n*****************************************************************************/\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifndef PPP_H\n#define PPP_H\n\n#include \"lwip/def.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/timeouts.h\"\n#if PPP_IPV6_SUPPORT\n#include \"lwip/ip6_addr.h\"\n#endif /* PPP_IPV6_SUPPORT */\n\n/* Disable non-working or rarely used PPP feature, so rarely that we don't want to bloat ppp_opts.h with them */\n#ifndef PPP_OPTIONS\n#define PPP_OPTIONS         0\n#endif\n\n#ifndef PPP_NOTIFY\n#define PPP_NOTIFY          0\n#endif\n\n#ifndef PPP_REMOTENAME\n#define PPP_REMOTENAME      0\n#endif\n\n#ifndef PPP_IDLETIMELIMIT\n#define PPP_IDLETIMELIMIT   0\n#endif\n\n#ifndef PPP_LCP_ADAPTIVE\n#define PPP_LCP_ADAPTIVE    0\n#endif\n\n#ifndef PPP_MAXCONNECT\n#define PPP_MAXCONNECT      0\n#endif\n\n#ifndef PPP_ALLOWED_ADDRS\n#define PPP_ALLOWED_ADDRS   0\n#endif\n\n#ifndef PPP_PROTOCOLNAME\n#define PPP_PROTOCOLNAME    0\n#endif\n\n#ifndef PPP_STATS_SUPPORT\n#define PPP_STATS_SUPPORT   0\n#endif\n\n#ifndef DEFLATE_SUPPORT\n#define DEFLATE_SUPPORT     0\n#endif\n\n#ifndef BSDCOMPRESS_SUPPORT\n#define BSDCOMPRESS_SUPPORT 0\n#endif\n\n#ifndef PREDICTOR_SUPPORT\n#define PREDICTOR_SUPPORT   0\n#endif\n\n/*************************\n*** PUBLIC DEFINITIONS ***\n*************************/\n\n/*\n * The basic PPP frame.\n */\n#define PPP_HDRLEN    4    /* octets for standard ppp header */\n#define PPP_FCSLEN    2    /* octets for FCS */\n\n/*\n * Values for phase.\n */\n#define PPP_PHASE_DEAD          0\n#define PPP_PHASE_MASTER        1\n#define PPP_PHASE_HOLDOFF       2\n#define PPP_PHASE_INITIALIZE    3\n#define PPP_PHASE_SERIALCONN    4\n#define PPP_PHASE_DORMANT       5\n#define PPP_PHASE_ESTABLISH     6\n#define PPP_PHASE_AUTHENTICATE  7\n#define PPP_PHASE_CALLBACK      8\n#define PPP_PHASE_NETWORK       9\n#define PPP_PHASE_RUNNING       10\n#define PPP_PHASE_TERMINATE     11\n#define PPP_PHASE_DISCONNECT    12\n\n/* Error codes. */\n#define PPPERR_NONE         0  /* No error. */\n#define PPPERR_PARAM        1  /* Invalid parameter. */\n#define PPPERR_OPEN         2  /* Unable to open PPP session. */\n#define PPPERR_DEVICE       3  /* Invalid I/O device for PPP. */\n#define PPPERR_ALLOC        4  /* Unable to allocate resources. */\n#define PPPERR_USER         5  /* User interrupt. */\n#define PPPERR_CONNECT      6  /* Connection lost. */\n#define PPPERR_AUTHFAIL     7  /* Failed authentication challenge. */\n#define PPPERR_PROTOCOL     8  /* Failed to meet protocol. */\n#define PPPERR_PEERDEAD     9  /* Connection timeout */\n#define PPPERR_IDLETIMEOUT  10 /* Idle Timeout */\n#define PPPERR_CONNECTTIME  11 /* Max connect time reached */\n#define PPPERR_LOOPBACK     12 /* Loopback detected */\n\n/* Whether auth support is enabled at all */\n#define PPP_AUTH_SUPPORT (PAP_SUPPORT || CHAP_SUPPORT || EAP_SUPPORT)\n\n/************************\n*** PUBLIC DATA TYPES ***\n************************/\n\n/*\n * Other headers require ppp_pcb definition for prototypes, but ppp_pcb\n * require some structure definition from other headers as well, we are\n * fixing the dependency loop here by declaring the ppp_pcb type then\n * by including headers containing necessary struct definition for ppp_pcb\n */\ntypedef struct ppp_pcb_s ppp_pcb;\n\n/* Type definitions for BSD code. */\n#ifndef __u_char_defined\ntypedef unsigned long  u_long;\ntypedef unsigned int   u_int;\ntypedef unsigned short u_short;\ntypedef unsigned char  u_char;\n#endif\n\n#include \"fsm.h\"\n#include \"lcp.h\"\n#if CCP_SUPPORT\n#include \"ccp.h\"\n#endif /* CCP_SUPPORT */\n#if MPPE_SUPPORT\n#include \"mppe.h\"\n#endif /* MPPE_SUPPORT */\n#if PPP_IPV4_SUPPORT\n#include \"ipcp.h\"\n#endif /* PPP_IPV4_SUPPORT */\n#if PPP_IPV6_SUPPORT\n#include \"ipv6cp.h\"\n#endif /* PPP_IPV6_SUPPORT */\n#if PAP_SUPPORT\n#include \"upap.h\"\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n#include \"chap-new.h\"\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n#include \"eap.h\"\n#endif /* EAP_SUPPORT */\n#if VJ_SUPPORT\n#include \"vj.h\"\n#endif /* VJ_SUPPORT */\n\n/* Link status callback function prototype */\ntypedef void (*ppp_link_status_cb_fn)(ppp_pcb *pcb, int err_code, void *ctx);\n\n/*\n * PPP configuration.\n */\ntypedef struct ppp_settings_s {\n\n#if PPP_SERVER && PPP_AUTH_SUPPORT\n  unsigned int  auth_required       :1;      /* Peer is required to authenticate */\n  unsigned int  null_login          :1;      /* Username of \"\" and a password of \"\" are acceptable */\n#endif /* PPP_SERVER && PPP_AUTH_SUPPORT */\n#if PPP_REMOTENAME\n  unsigned int  explicit_remote     :1;      /* remote_name specified with remotename opt */\n#endif /* PPP_REMOTENAME */\n#if PAP_SUPPORT\n  unsigned int  refuse_pap          :1;      /* Don't proceed auth. with PAP */\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n  unsigned int  refuse_chap         :1;      /* Don't proceed auth. with CHAP */\n#endif /* CHAP_SUPPORT */\n#if MSCHAP_SUPPORT\n  unsigned int  refuse_mschap       :1;      /* Don't proceed auth. with MS-CHAP */\n  unsigned int  refuse_mschap_v2    :1;      /* Don't proceed auth. with MS-CHAPv2 */\n#endif /* MSCHAP_SUPPORT */\n#if EAP_SUPPORT\n  unsigned int  refuse_eap          :1;      /* Don't proceed auth. with EAP */\n#endif /* EAP_SUPPORT */\n#if LWIP_DNS\n  unsigned int  usepeerdns          :1;      /* Ask peer for DNS adds */\n#endif /* LWIP_DNS */\n  unsigned int  persist             :1;      /* Persist mode, always try to open the connection */\n#if PRINTPKT_SUPPORT\n  unsigned int  hide_password       :1;      /* Hide password in dumped packets */\n#endif /* PRINTPKT_SUPPORT */\n  unsigned int  noremoteip          :1;      /* Let him have no IP address */\n  unsigned int  lax_recv            :1;      /* accept control chars in asyncmap */\n  unsigned int  noendpoint          :1;      /* don't send/accept endpoint discriminator */\n#if PPP_LCP_ADAPTIVE\n  unsigned int lcp_echo_adaptive    :1;      /* request echo only if the link was idle */\n#endif /* PPP_LCP_ADAPTIVE */\n#if MPPE_SUPPORT\n  unsigned int require_mppe         :1;      /* Require MPPE (Microsoft Point to Point Encryption) */\n  unsigned int refuse_mppe_40       :1;      /* Allow MPPE 40-bit mode? */\n  unsigned int refuse_mppe_128      :1;      /* Allow MPPE 128-bit mode? */\n  unsigned int refuse_mppe_stateful :1;      /* Allow MPPE stateful mode? */\n#endif /* MPPE_SUPPORT */\n\n  u16_t  listen_time;                 /* time to listen first (ms), waiting for peer to send LCP packet */\n\n#if PPP_IDLETIMELIMIT\n  u16_t  idle_time_limit;             /* Disconnect if idle for this many seconds */\n#endif /* PPP_IDLETIMELIMIT */\n#if PPP_MAXCONNECT\n  u32_t  maxconnect;                  /* Maximum connect time (seconds) */\n#endif /* PPP_MAXCONNECT */\n\n#if PPP_AUTH_SUPPORT\n  /* auth data */\n  const char  *user;                   /* Username for PAP */\n  const char  *passwd;                 /* Password for PAP, secret for CHAP */\n#if PPP_REMOTENAME\n  char  remote_name[MAXNAMELEN   + 1]; /* Peer's name for authentication */\n#endif /* PPP_REMOTENAME */\n\n#if PAP_SUPPORT\n  u8_t  pap_timeout_time;        /* Timeout (seconds) for auth-req retrans. */\n  u8_t  pap_max_transmits;       /* Number of auth-reqs sent */\n#if PPP_SERVER\n  u8_t  pap_req_timeout;         /* Time to wait for auth-req from peer */\n#endif /* PPP_SERVER */\n#endif /* PAP_SUPPPORT */\n\n#if CHAP_SUPPORT\n  u8_t  chap_timeout_time;       /* Timeout (seconds) for retransmitting req */\n  u8_t  chap_max_transmits;      /* max # times to send challenge */\n#if PPP_SERVER\n  u8_t  chap_rechallenge_time;   /* Time to wait for auth-req from peer */\n#endif /* PPP_SERVER */\n#endif /* CHAP_SUPPPORT */\n\n#if EAP_SUPPORT\n  u8_t  eap_req_time;            /* Time to wait (for retransmit/fail) */\n  u8_t  eap_allow_req;           /* Max Requests allowed */\n#if PPP_SERVER\n  u8_t  eap_timeout_time;        /* Time to wait (for retransmit/fail) */\n  u8_t  eap_max_transmits;       /* Max Requests allowed */\n#endif /* PPP_SERVER */\n#endif /* EAP_SUPPORT */\n\n#endif /* PPP_AUTH_SUPPORT */\n\n  u8_t  fsm_timeout_time;            /* Timeout time in seconds */\n  u8_t  fsm_max_conf_req_transmits;  /* Maximum Configure-Request transmissions */\n  u8_t  fsm_max_term_transmits;      /* Maximum Terminate-Request transmissions */\n  u8_t  fsm_max_nak_loops;           /* Maximum number of nak loops tolerated */\n\n  u8_t  lcp_loopbackfail;     /* Number of times we receive our magic number from the peer\n                                 before deciding the link is looped-back. */\n  u8_t  lcp_echo_interval;    /* Interval between LCP echo-requests */\n  u8_t  lcp_echo_fails;       /* Tolerance to unanswered echo-requests */\n\n} ppp_settings;\n\n#if PPP_SERVER\nstruct ppp_addrs {\n#if PPP_IPV4_SUPPORT\n  ip4_addr_t our_ipaddr, his_ipaddr, netmask;\n#if LWIP_DNS\n  ip4_addr_t dns1, dns2;\n#endif /* LWIP_DNS */\n#endif /* PPP_IPV4_SUPPORT */\n#if PPP_IPV6_SUPPORT\n  ip6_addr_t our6_ipaddr, his6_ipaddr;\n#endif /* PPP_IPV6_SUPPORT */\n};\n#endif /* PPP_SERVER */\n\n/*\n * PPP interface control block.\n */\nstruct ppp_pcb_s {\n  ppp_settings settings;\n  const struct link_callbacks *link_cb;\n  void *link_ctx_cb;\n  void (*link_status_cb)(ppp_pcb *pcb, int err_code, void *ctx);  /* Status change callback */\n#if PPP_NOTIFY_PHASE\n  void (*notify_phase_cb)(ppp_pcb *pcb, u8_t phase, void *ctx);   /* Notify phase callback */\n#endif /* PPP_NOTIFY_PHASE */\n  void *ctx_cb;                  /* Callbacks optional pointer */\n  struct netif *netif;           /* PPP interface */\n  u8_t phase;                    /* where the link is at */\n  u8_t err_code;                 /* Code indicating why interface is down. */\n\n  /* flags */\n#if PPP_IPV4_SUPPORT\n  unsigned int ask_for_local           :1; /* request our address from peer */\n  unsigned int ipcp_is_open            :1; /* haven't called np_finished() */\n  unsigned int ipcp_is_up              :1; /* have called ipcp_up() */\n  unsigned int if4_up                  :1; /* True when the IPv4 interface is up. */\n#if 0 /* UNUSED - PROXY ARP */\n  unsigned int proxy_arp_set           :1; /* Have created proxy arp entry */\n#endif /* UNUSED - PROXY ARP */\n#endif /* PPP_IPV4_SUPPORT */\n#if PPP_IPV6_SUPPORT\n  unsigned int ipv6cp_is_up            :1; /* have called ip6cp_up() */\n  unsigned int if6_up                  :1; /* True when the IPv6 interface is up. */\n#endif /* PPP_IPV6_SUPPORT */\n  unsigned int lcp_echo_timer_running  :1; /* set if a timer is running */\n#if VJ_SUPPORT\n  unsigned int vj_enabled              :1; /* Flag indicating VJ compression enabled. */\n#endif /* VJ_SUPPORT */\n#if CCP_SUPPORT\n  unsigned int ccp_all_rejected        :1; /* we rejected all peer's options */\n#endif /* CCP_SUPPORT */\n#if MPPE_SUPPORT\n  unsigned int mppe_keys_set           :1; /* Have the MPPE keys been set? */\n#endif /* MPPE_SUPPORT */\n\n#if PPP_AUTH_SUPPORT\n  /* auth data */\n#if PPP_SERVER && defined(HAVE_MULTILINK)\n  char peer_authname[MAXNAMELEN + 1]; /* The name by which the peer authenticated itself to us. */\n#endif /* PPP_SERVER && defined(HAVE_MULTILINK) */\n  u16_t auth_pending;        /* Records which authentication operations haven't completed yet. */\n  u16_t auth_done;           /* Records which authentication operations have been completed. */\n\n#if PAP_SUPPORT\n  upap_state upap;           /* PAP data */\n#endif /* PAP_SUPPORT */\n\n#if CHAP_SUPPORT\n  chap_client_state chap_client;  /* CHAP client data */\n#if PPP_SERVER\n  chap_server_state chap_server;  /* CHAP server data */\n#endif /* PPP_SERVER */\n#endif /* CHAP_SUPPORT */\n\n#if EAP_SUPPORT\n  eap_state eap;            /* EAP data */\n#endif /* EAP_SUPPORT */\n#endif /* PPP_AUTH_SUPPORT */\n\n  fsm lcp_fsm;                   /* LCP fsm structure */\n  lcp_options lcp_wantoptions;   /* Options that we want to request */\n  lcp_options lcp_gotoptions;    /* Options that peer ack'd */\n  lcp_options lcp_allowoptions;  /* Options we allow peer to request */\n  lcp_options lcp_hisoptions;    /* Options that we ack'd */\n  u16_t peer_mru;                /* currently negotiated peer MRU */\n  u8_t lcp_echos_pending;        /* Number of outstanding echo msgs */\n  u8_t lcp_echo_number;          /* ID number of next echo frame */\n\n  u8_t num_np_open;              /* Number of network protocols which we have opened. */\n  u8_t num_np_up;                /* Number of network protocols which have come up. */\n\n#if VJ_SUPPORT\n  struct vjcompress vj_comp;     /* Van Jacobson compression header. */\n#endif /* VJ_SUPPORT */\n\n#if CCP_SUPPORT\n  fsm ccp_fsm;                   /* CCP fsm structure */\n  ccp_options ccp_wantoptions;   /* what to request the peer to use */\n  ccp_options ccp_gotoptions;    /* what the peer agreed to do */\n  ccp_options ccp_allowoptions;  /* what we'll agree to do */\n  ccp_options ccp_hisoptions;    /* what we agreed to do */\n  u8_t ccp_localstate;           /* Local state (mainly for handling reset-reqs and reset-acks). */\n  u8_t ccp_receive_method;       /* Method chosen on receive path */\n  u8_t ccp_transmit_method;      /* Method chosen on transmit path */\n#if MPPE_SUPPORT\n  ppp_mppe_state mppe_comp;      /* MPPE \"compressor\" structure */\n  ppp_mppe_state mppe_decomp;    /* MPPE \"decompressor\" structure */\n#endif /* MPPE_SUPPORT */\n#endif /* CCP_SUPPORT */\n\n#if PPP_IPV4_SUPPORT\n  fsm ipcp_fsm;                   /* IPCP fsm structure */\n  ipcp_options ipcp_wantoptions;  /* Options that we want to request */\n  ipcp_options ipcp_gotoptions;   /* Options that peer ack'd */\n  ipcp_options ipcp_allowoptions; /* Options we allow peer to request */\n  ipcp_options ipcp_hisoptions;   /* Options that we ack'd */\n#endif /* PPP_IPV4_SUPPORT */\n\n#if PPP_IPV6_SUPPORT\n  fsm ipv6cp_fsm;                     /* IPV6CP fsm structure */\n  ipv6cp_options ipv6cp_wantoptions;  /* Options that we want to request */\n  ipv6cp_options ipv6cp_gotoptions;   /* Options that peer ack'd */\n  ipv6cp_options ipv6cp_allowoptions; /* Options we allow peer to request */\n  ipv6cp_options ipv6cp_hisoptions;   /* Options that we ack'd */\n#endif /* PPP_IPV6_SUPPORT */\n};\n\n/************************\n *** PUBLIC FUNCTIONS ***\n ************************/\n\n/*\n * WARNING: For multi-threads environment, all ppp_set_* functions most\n * only be called while the PPP is in the dead phase (i.e. disconnected).\n */\n\n#if PPP_AUTH_SUPPORT\n/*\n * Set PPP authentication.\n *\n * Warning: Using PPPAUTHTYPE_ANY might have security consequences.\n * RFC 1994 says:\n *\n * In practice, within or associated with each PPP server, there is a\n * database which associates \"user\" names with authentication\n * information (\"secrets\").  It is not anticipated that a particular\n * named user would be authenticated by multiple methods.  This would\n * make the user vulnerable to attacks which negotiate the least secure\n * method from among a set (such as PAP rather than CHAP).  If the same\n * secret was used, PAP would reveal the secret to be used later with\n * CHAP.\n *\n * Instead, for each user name there should be an indication of exactly\n * one method used to authenticate that user name.  If a user needs to\n * make use of different authentication methods under different\n * circumstances, then distinct user names SHOULD be employed, each of\n * which identifies exactly one authentication method.\n *\n * Default is none auth type, unset (NULL) user and passwd.\n */\n#define PPPAUTHTYPE_NONE      0x00\n#define PPPAUTHTYPE_PAP       0x01\n#define PPPAUTHTYPE_CHAP      0x02\n#define PPPAUTHTYPE_MSCHAP    0x04\n#define PPPAUTHTYPE_MSCHAP_V2 0x08\n#define PPPAUTHTYPE_EAP       0x10\n#define PPPAUTHTYPE_ANY       0xff\nvoid ppp_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd);\n\n/*\n * If set, peer is required to authenticate. This is mostly necessary for PPP server support.\n *\n * Default is false.\n */\n#define ppp_set_auth_required(ppp, boolval) (ppp->settings.auth_required = boolval)\n#endif /* PPP_AUTH_SUPPORT */\n\n#if PPP_IPV4_SUPPORT\n/*\n * Set PPP interface \"our\" and \"his\" IPv4 addresses. This is mostly necessary for PPP server\n * support but it can also be used on a PPP link where each side choose its own IP address.\n *\n * Default is unset (0.0.0.0).\n */\n#define ppp_set_ipcp_ouraddr(ppp, addr) do { ppp->ipcp_wantoptions.ouraddr = ip4_addr_get_u32(addr); \\\n                                             ppp->ask_for_local = ppp->ipcp_wantoptions.ouraddr != 0; } while(0)\n#define ppp_set_ipcp_hisaddr(ppp, addr) (ppp->ipcp_wantoptions.hisaddr = ip4_addr_get_u32(addr))\n#if LWIP_DNS\n/*\n * Set DNS server addresses that are sent if the peer asks for them. This is mostly necessary\n * for PPP server support.\n *\n * Default is unset (0.0.0.0).\n */\n#define ppp_set_ipcp_dnsaddr(ppp, index, addr) (ppp->ipcp_allowoptions.dnsaddr[index] = ip4_addr_get_u32(addr))\n\n/*\n * If set, we ask the peer for up to 2 DNS server addresses. Received DNS server addresses are\n * registered using the dns_setserver() function.\n *\n * Default is false.\n */\n#define ppp_set_usepeerdns(ppp, boolval) (ppp->settings.usepeerdns = boolval)\n#endif /* LWIP_DNS */\n#endif /* PPP_IPV4_SUPPORT */\n\n#if MPPE_SUPPORT\n/* Disable MPPE (Microsoft Point to Point Encryption). This parameter is exclusive. */\n#define PPP_MPPE_DISABLE           0x00\n/* Require the use of MPPE (Microsoft Point to Point Encryption). */\n#define PPP_MPPE_ENABLE            0x01\n/* Allow MPPE to use stateful mode. Stateless mode is still attempted first. */\n#define PPP_MPPE_ALLOW_STATEFUL    0x02\n/* Refuse the use of MPPE with 40-bit encryption. Conflict with PPP_MPPE_REFUSE_128. */\n#define PPP_MPPE_REFUSE_40         0x04\n/* Refuse the use of MPPE with 128-bit encryption. Conflict with PPP_MPPE_REFUSE_40. */\n#define PPP_MPPE_REFUSE_128        0x08\n/*\n * Set MPPE configuration\n *\n * Default is disabled.\n */\nvoid ppp_set_mppe(ppp_pcb *pcb, u8_t flags);\n#endif /* MPPE_SUPPORT */\n\n/*\n * Wait for up to intval milliseconds for a valid PPP packet from the peer.\n * At the end of this  time, or when a valid PPP packet is received from the\n * peer, we commence negotiation by sending our first LCP packet.\n *\n * Default is 0.\n */\n#define ppp_set_listen_time(ppp, intval) (ppp->settings.listen_time = intval)\n\n/*\n * If set, we will attempt to initiate a connection but if no reply is received from\n * the peer, we will then just wait passively for a valid LCP packet from the peer.\n *\n * Default is false.\n */\n#define ppp_set_passive(ppp, boolval) (ppp->lcp_wantoptions.passive = boolval)\n\n/*\n * If set, we will not transmit LCP packets to initiate a connection until a valid\n * LCP packet is received from the peer. This is what we usually call the server mode.\n *\n * Default is false.\n */\n#define ppp_set_silent(ppp, boolval) (ppp->lcp_wantoptions.silent = boolval)\n\n/*\n * If set, enable protocol field compression negotiation in both the receive and\n * the transmit direction.\n *\n * Default is true.\n */\n#define ppp_set_neg_pcomp(ppp, boolval) (ppp->lcp_wantoptions.neg_pcompression = \\\n                                         ppp->lcp_allowoptions.neg_pcompression = boolval)\n\n/*\n * If set, enable Address/Control compression in both the receive and the transmit\n * direction.\n *\n * Default is true.\n */\n#define ppp_set_neg_accomp(ppp, boolval) (ppp->lcp_wantoptions.neg_accompression = \\\n                                          ppp->lcp_allowoptions.neg_accompression = boolval)\n\n/*\n * If set, enable asyncmap negotiation. Otherwise forcing all control characters to\n * be escaped for both the transmit and the receive direction.\n *\n * Default is true.\n */\n#define ppp_set_neg_asyncmap(ppp, boolval) (ppp->lcp_wantoptions.neg_asyncmap = \\\n                                            ppp->lcp_allowoptions.neg_asyncmap = boolval)\n\n/*\n * This option sets the Async-Control-Character-Map (ACCM) for this end of the link.\n * The ACCM is a set of 32 bits, one for each of the ASCII control characters with\n * values from 0 to 31, where a 1 bit  indicates that the corresponding control\n * character should not be used in PPP packets sent to this system. The map is\n * an unsigned 32 bits integer where the least significant bit (00000001) represents\n * character 0 and the most significant bit (80000000) represents character 31.\n * We will then ask the peer to send these characters as a 2-byte escape sequence.\n *\n * Default is 0.\n */\n#define ppp_set_asyncmap(ppp, intval) (ppp->lcp_wantoptions.asyncmap = intval)\n\n/*\n * Set a PPP interface as the default network interface\n * (used to output all packets for which no specific route is found).\n */\n#define ppp_set_default(ppp)         netif_set_default(ppp->netif)\n\n#if PPP_NOTIFY_PHASE\n/*\n * Set a PPP notify phase callback.\n *\n * This can be used for example to set a LED pattern depending on the\n * current phase of the PPP session.\n */\ntypedef void (*ppp_notify_phase_cb_fn)(ppp_pcb *pcb, u8_t phase, void *ctx);\nvoid ppp_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb);\n#endif /* PPP_NOTIFY_PHASE */\n\n/*\n * Initiate a PPP connection.\n *\n * This can only be called if PPP is in the dead phase.\n *\n * Holdoff is the time to wait (in seconds) before initiating\n * the connection.\n *\n * If this port connects to a modem, the modem connection must be\n * established before calling this.\n */\nerr_t ppp_connect(ppp_pcb *pcb, u16_t holdoff);\n\n#if PPP_SERVER\n/*\n * Listen for an incoming PPP connection.\n *\n * This can only be called if PPP is in the dead phase.\n *\n * If this port connects to a modem, the modem connection must be\n * established before calling this.\n */\nerr_t ppp_listen(ppp_pcb *pcb);\n#endif /* PPP_SERVER */\n\n/*\n * Initiate the end of a PPP connection.\n * Any outstanding packets in the queues are dropped.\n *\n * Setting nocarrier to 1 close the PPP connection without initiating the\n * shutdown procedure. Always using nocarrier = 0 is still recommended,\n * this is going to take a little longer time if your link is down, but\n * is a safer choice for the PPP state machine.\n *\n * Return 0 on success, an error code on failure.\n */\nerr_t ppp_close(ppp_pcb *pcb, u8_t nocarrier);\n\n/*\n * Release the control block.\n *\n * This can only be called if PPP is in the dead phase.\n *\n * You must use ppp_close() before if you wish to terminate\n * an established PPP session.\n *\n * Return 0 on success, an error code on failure.\n */\nerr_t ppp_free(ppp_pcb *pcb);\n\n/*\n * PPP IOCTL commands.\n *\n * Get the up status - 0 for down, non-zero for up.  The argument must\n * point to an int.\n */\n#define PPPCTLG_UPSTATUS 0\n\n/*\n * Get the PPP error code.  The argument must point to an int.\n * Returns a PPPERR_* value.\n */\n#define PPPCTLG_ERRCODE  1\n\n/*\n * Get the fd associated with a PPP over serial\n */\n#define PPPCTLG_FD       2\n\n/*\n * Get and set parameters for the given connection.\n * Return 0 on success, an error code on failure.\n */\nerr_t ppp_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg);\n\n/* Get the PPP netif interface */\n#define ppp_netif(ppp)               (ppp->netif)\n\n/* Set an lwIP-style status-callback for the selected PPP device */\n#define ppp_set_netif_statuscallback(ppp, status_cb)       \\\n        netif_set_status_callback(ppp->netif, status_cb);\n\n/* Set an lwIP-style link-callback for the selected PPP device */\n#define ppp_set_netif_linkcallback(ppp, link_cb)           \\\n        netif_set_link_callback(ppp->netif, link_cb);\n\n#endif /* PPP_H */\n\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/ppp_impl.h",
    "content": "/*****************************************************************************\n* ppp.h - Network Point to Point Protocol header file.\n*\n* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.\n* portions Copyright (c) 1997 Global Election Systems Inc.\n*\n* The authors hereby grant permission to use, copy, modify, distribute,\n* and license this software and its documentation for any purpose, provided\n* that existing copyright notices are retained in all copies and that this\n* notice and the following disclaimer are included verbatim in any\n* distributions. No written agreement, license, or royalty fee is required\n* for any of the authorized uses.\n*\n* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR\n* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n******************************************************************************\n* REVISION HISTORY\n*\n* 03-01-01 Marc Boucher <marc@mbsi.ca>\n*   Ported to lwIP.\n* 97-11-05 Guy Lancaster <glanca@gesn.com>, Global Election Systems Inc.\n*   Original derived from BSD codes.\n*****************************************************************************/\n#ifndef LWIP_HDR_PPP_IMPL_H\n#define LWIP_HDR_PPP_IMPL_H\n\n#include \"netif/ppp/ppp_opts.h\"\n\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifdef PPP_INCLUDE_SETTINGS_HEADER\n#include \"ppp_settings.h\"\n#endif\n\n#include <stdio.h> /* formats */\n#include <stdarg.h>\n#include <string.h>\n#include <stdlib.h> /* strtol() */\n\n#include \"lwip/netif.h\"\n#include \"lwip/def.h\"\n#include \"lwip/timeouts.h\"\n\n#include \"ppp.h\"\n#include \"pppdebug.h\"\n\n/*\n * Memory used for control packets.\n *\n * PPP_CTRL_PBUF_MAX_SIZE is the amount of memory we allocate when we\n * cannot figure out how much we are going to use before filling the buffer.\n */\n#if PPP_USE_PBUF_RAM\n#define PPP_CTRL_PBUF_TYPE       PBUF_RAM\n#define PPP_CTRL_PBUF_MAX_SIZE   512\n#else /* PPP_USE_PBUF_RAM */\n#define PPP_CTRL_PBUF_TYPE       PBUF_POOL\n#define PPP_CTRL_PBUF_MAX_SIZE   PBUF_POOL_BUFSIZE\n#endif /* PPP_USE_PBUF_RAM */\n\n/*\n * The basic PPP frame.\n */\n#define PPP_ADDRESS(p)    (((u_char *)(p))[0])\n#define PPP_CONTROL(p)    (((u_char *)(p))[1])\n#define PPP_PROTOCOL(p)    ((((u_char *)(p))[2] << 8) + ((u_char *)(p))[3])\n\n/*\n * Significant octet values.\n */\n#define    PPP_ALLSTATIONS    0xff    /* All-Stations broadcast address */\n#define    PPP_UI        0x03    /* Unnumbered Information */\n#define    PPP_FLAG    0x7e    /* Flag Sequence */\n#define    PPP_ESCAPE    0x7d    /* Asynchronous Control Escape */\n#define    PPP_TRANS    0x20    /* Asynchronous transparency modifier */\n\n/*\n * Protocol field values.\n */\n#define PPP_IP        0x21    /* Internet Protocol */\n#if 0 /* UNUSED */\n#define PPP_AT        0x29    /* AppleTalk Protocol */\n#define PPP_IPX        0x2b    /* IPX protocol */\n#endif /* UNUSED */\n#if VJ_SUPPORT\n#define    PPP_VJC_COMP    0x2d    /* VJ compressed TCP */\n#define    PPP_VJC_UNCOMP    0x2f    /* VJ uncompressed TCP */\n#endif /* VJ_SUPPORT */\n#if PPP_IPV6_SUPPORT\n#define PPP_IPV6    0x57    /* Internet Protocol Version 6 */\n#endif /* PPP_IPV6_SUPPORT */\n#if CCP_SUPPORT\n#define PPP_COMP    0xfd    /* compressed packet */\n#endif /* CCP_SUPPORT */\n#define PPP_IPCP    0x8021    /* IP Control Protocol */\n#if 0 /* UNUSED */\n#define PPP_ATCP    0x8029    /* AppleTalk Control Protocol */\n#define PPP_IPXCP    0x802b    /* IPX Control Protocol */\n#endif /* UNUSED */\n#if PPP_IPV6_SUPPORT\n#define PPP_IPV6CP    0x8057    /* IPv6 Control Protocol */\n#endif /* PPP_IPV6_SUPPORT */\n#if CCP_SUPPORT\n#define PPP_CCP        0x80fd    /* Compression Control Protocol */\n#endif /* CCP_SUPPORT */\n#if ECP_SUPPORT\n#define PPP_ECP        0x8053    /* Encryption Control Protocol */\n#endif /* ECP_SUPPORT */\n#define PPP_LCP        0xc021    /* Link Control Protocol */\n#if PAP_SUPPORT\n#define PPP_PAP        0xc023    /* Password Authentication Protocol */\n#endif /* PAP_SUPPORT */\n#if LQR_SUPPORT\n#define PPP_LQR        0xc025    /* Link Quality Report protocol */\n#endif /* LQR_SUPPORT */\n#if CHAP_SUPPORT\n#define PPP_CHAP    0xc223    /* Cryptographic Handshake Auth. Protocol */\n#endif /* CHAP_SUPPORT */\n#if CBCP_SUPPORT\n#define PPP_CBCP    0xc029    /* Callback Control Protocol */\n#endif /* CBCP_SUPPORT */\n#if EAP_SUPPORT\n#define PPP_EAP        0xc227    /* Extensible Authentication Protocol */\n#endif /* EAP_SUPPORT */\n\n/*\n * The following struct gives the addresses of procedures to call\n * for a particular lower link level protocol.\n */\nstruct link_callbacks {\n  /* Start a connection (e.g. Initiate discovery phase) */\n  void (*connect) (ppp_pcb *pcb, void *ctx);\n#if PPP_SERVER\n  /* Listen for an incoming connection (Passive mode) */\n  void (*listen) (ppp_pcb *pcb, void *ctx);\n#endif /* PPP_SERVER */\n  /* End a connection (i.e. initiate disconnect phase) */\n  void (*disconnect) (ppp_pcb *pcb, void *ctx);\n  /* Free lower protocol control block */\n  err_t (*free) (ppp_pcb *pcb, void *ctx);\n  /* Write a pbuf to a ppp link, only used from PPP functions to send PPP packets. */\n  err_t (*write)(ppp_pcb *pcb, void *ctx, struct pbuf *p);\n  /* Send a packet from lwIP core (IPv4 or IPv6) */\n  err_t (*netif_output)(ppp_pcb *pcb, void *ctx, struct pbuf *p, u_short protocol);\n  /* configure the transmit-side characteristics of the PPP interface */\n  void (*send_config)(ppp_pcb *pcb, void *ctx, u32_t accm, int pcomp, int accomp);\n  /* confire the receive-side characteristics of the PPP interface */\n  void (*recv_config)(ppp_pcb *pcb, void *ctx, u32_t accm, int pcomp, int accomp);\n};\n\n/*\n * What to do with network protocol (NP) packets.\n */\nenum NPmode {\n    NPMODE_PASS,        /* pass the packet through */\n    NPMODE_DROP,        /* silently drop the packet */\n    NPMODE_ERROR,        /* return an error */\n    NPMODE_QUEUE        /* save it up for later. */\n};\n\n/*\n * Statistics.\n */\n#if PPP_STATS_SUPPORT\nstruct pppstat    {\n    unsigned int ppp_ibytes;    /* bytes received */\n    unsigned int ppp_ipackets;    /* packets received */\n    unsigned int ppp_ierrors;    /* receive errors */\n    unsigned int ppp_obytes;    /* bytes sent */\n    unsigned int ppp_opackets;    /* packets sent */\n    unsigned int ppp_oerrors;    /* transmit errors */\n};\n\n#if VJ_SUPPORT\nstruct vjstat {\n    unsigned int vjs_packets;    /* outbound packets */\n    unsigned int vjs_compressed; /* outbound compressed packets */\n    unsigned int vjs_searches;    /* searches for connection state */\n    unsigned int vjs_misses;    /* times couldn't find conn. state */\n    unsigned int vjs_uncompressedin; /* inbound uncompressed packets */\n    unsigned int vjs_compressedin; /* inbound compressed packets */\n    unsigned int vjs_errorin;    /* inbound unknown type packets */\n    unsigned int vjs_tossed;    /* inbound packets tossed because of error */\n};\n#endif /* VJ_SUPPORT */\n\nstruct ppp_stats {\n    struct pppstat p;        /* basic PPP statistics */\n#if VJ_SUPPORT\n    struct vjstat vj;        /* VJ header compression statistics */\n#endif /* VJ_SUPPORT */\n};\n\n#if CCP_SUPPORT\nstruct compstat {\n    unsigned int unc_bytes;    /* total uncompressed bytes */\n    unsigned int unc_packets;    /* total uncompressed packets */\n    unsigned int comp_bytes;    /* compressed bytes */\n    unsigned int comp_packets;    /* compressed packets */\n    unsigned int inc_bytes;    /* incompressible bytes */\n    unsigned int inc_packets;    /* incompressible packets */\n    unsigned int ratio;        /* recent compression ratio << 8 */\n};\n\nstruct ppp_comp_stats {\n    struct compstat c;        /* packet compression statistics */\n    struct compstat d;        /* packet decompression statistics */\n};\n#endif /* CCP_SUPPORT */\n\n#endif /* PPP_STATS_SUPPORT */\n\n#if PPP_IDLETIMELIMIT\n/*\n * The following structure records the time in seconds since\n * the last NP packet was sent or received.\n */\nstruct ppp_idle {\n    time_t xmit_idle;        /* time since last NP packet sent */\n    time_t recv_idle;        /* time since last NP packet received */\n};\n#endif /* PPP_IDLETIMELIMIT */\n\n/* values for epdisc.class */\n#define EPD_NULL    0    /* null discriminator, no data */\n#define EPD_LOCAL    1\n#define EPD_IP        2\n#define EPD_MAC        3\n#define EPD_MAGIC    4\n#define EPD_PHONENUM    5\n\n/*\n * Global variables.\n */\n#ifdef HAVE_MULTILINK\nextern u8_t    multilink;    /* enable multilink operation */\nextern u8_t    doing_multilink;\nextern u8_t    multilink_master;\nextern u8_t    bundle_eof;\nextern u8_t    bundle_terminating;\n#endif\n\n#ifdef MAXOCTETS\nextern unsigned int maxoctets;         /* Maximum octetes per session (in bytes) */\nextern int       maxoctets_dir;      /* Direction :\n                      0 - in+out (default)\n                      1 - in\n                      2 - out\n                      3 - max(in,out) */\nextern int       maxoctets_timeout;  /* Timeout for check of octets limit */\n#define PPP_OCTETS_DIRECTION_SUM        0\n#define PPP_OCTETS_DIRECTION_IN         1\n#define PPP_OCTETS_DIRECTION_OUT        2\n#define PPP_OCTETS_DIRECTION_MAXOVERAL  3\n/* same as previos, but little different on RADIUS side */\n#define PPP_OCTETS_DIRECTION_MAXSESSION 4\n#endif\n\n/* Data input may be used by CCP and ECP, remove this entry\n * from struct protent to save some flash\n */\n#define PPP_DATAINPUT 0\n\n/*\n * The following struct gives the addresses of procedures to call\n * for a particular protocol.\n */\nstruct protent {\n    u_short protocol;        /* PPP protocol number */\n    /* Initialization procedure */\n    void (*init) (ppp_pcb *pcb);\n    /* Process a received packet */\n    void (*input) (ppp_pcb *pcb, u_char *pkt, int len);\n    /* Process a received protocol-reject */\n    void (*protrej) (ppp_pcb *pcb);\n    /* Lower layer has come up */\n    void (*lowerup) (ppp_pcb *pcb);\n    /* Lower layer has gone down */\n    void (*lowerdown) (ppp_pcb *pcb);\n    /* Open the protocol */\n    void (*open) (ppp_pcb *pcb);\n    /* Close the protocol */\n    void (*close) (ppp_pcb *pcb, const char *reason);\n#if PRINTPKT_SUPPORT\n    /* Print a packet in readable form */\n    int  (*printpkt) (const u_char *pkt, int len,\n              void (*printer) (void *, const char *, ...),\n              void *arg);\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_DATAINPUT\n    /* Process a received data packet */\n    void (*datainput) (ppp_pcb *pcb, u_char *pkt, int len);\n#endif /* PPP_DATAINPUT */\n#if PRINTPKT_SUPPORT\n    const char *name;        /* Text name of protocol */\n    const char *data_name;    /* Text name of corresponding data protocol */\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_OPTIONS\n    option_t *options;        /* List of command-line options */\n    /* Check requested options, assign defaults */\n    void (*check_options) (void);\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\n    /* Configure interface for demand-dial */\n    int  (*demand_conf) (int unit);\n    /* Say whether to bring up link for this pkt */\n    int  (*active_pkt) (u_char *pkt, int len);\n#endif /* DEMAND_SUPPORT */\n};\n\n/* Table of pointers to supported protocols */\nextern const struct protent* const protocols[];\n\n\n/* Values for auth_pending, auth_done */\n#if PAP_SUPPORT\n#define PAP_WITHPEER    0x1\n#define PAP_PEER    0x2\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n#define CHAP_WITHPEER    0x4\n#define CHAP_PEER    0x8\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n#define EAP_WITHPEER    0x10\n#define EAP_PEER    0x20\n#endif /* EAP_SUPPORT */\n\n/* Values for auth_done only */\n#if CHAP_SUPPORT\n#define CHAP_MD5_WITHPEER    0x40\n#define CHAP_MD5_PEER        0x80\n#if MSCHAP_SUPPORT\n#define CHAP_MS_SHIFT        8    /* LSB position for MS auths */\n#define CHAP_MS_WITHPEER    0x100\n#define CHAP_MS_PEER        0x200\n#define CHAP_MS2_WITHPEER    0x400\n#define CHAP_MS2_PEER        0x800\n#endif /* MSCHAP_SUPPORT */\n#endif /* CHAP_SUPPORT */\n\n/* Supported CHAP protocols */\n#if CHAP_SUPPORT\n\n#if MSCHAP_SUPPORT\n#define CHAP_MDTYPE_SUPPORTED (MDTYPE_MICROSOFT_V2 | MDTYPE_MICROSOFT | MDTYPE_MD5)\n#else /* MSCHAP_SUPPORT */\n#define CHAP_MDTYPE_SUPPORTED (MDTYPE_MD5)\n#endif /* MSCHAP_SUPPORT */\n\n#else /* CHAP_SUPPORT */\n#define CHAP_MDTYPE_SUPPORTED (MDTYPE_NONE)\n#endif /* CHAP_SUPPORT */\n\n#if PPP_STATS_SUPPORT\n/*\n * PPP statistics structure\n */\nstruct pppd_stats {\n    unsigned int    bytes_in;\n    unsigned int    bytes_out;\n    unsigned int    pkts_in;\n    unsigned int    pkts_out;\n};\n#endif /* PPP_STATS_SUPPORT */\n\n\n/*\n * PPP private functions\n */\n\n \n/*\n * Functions called from lwIP core.\n */\n\n/* initialize the PPP subsystem */\nint ppp_init(void);\n\n/*\n * Functions called from PPP link protocols.\n */\n\n/* Create a new PPP control block */\nppp_pcb *ppp_new(struct netif *pppif, const struct link_callbacks *callbacks, void *link_ctx_cb,\n                 ppp_link_status_cb_fn link_status_cb, void *ctx_cb);\n\n/* Initiate LCP open request */\nvoid ppp_start(ppp_pcb *pcb);\n\n/* Called when link failed to setup */\nvoid ppp_link_failed(ppp_pcb *pcb);\n\n/* Called when link is normally down (i.e. it was asked to end) */\nvoid ppp_link_end(ppp_pcb *pcb);\n\n/* function called to process input packet */\nvoid ppp_input(ppp_pcb *pcb, struct pbuf *pb);\n\n/* helper function, merge a pbuf chain into one pbuf */\nstruct pbuf *ppp_singlebuf(struct pbuf *p);\n\n\n/*\n * Functions called by PPP protocols.\n */\n\n/* function called by all PPP subsystems to send packets */\nerr_t ppp_write(ppp_pcb *pcb, struct pbuf *p);\n\n/* functions called by auth.c link_terminated() */\nvoid ppp_link_terminated(ppp_pcb *pcb);\n\nvoid new_phase(ppp_pcb *pcb, int p);\n\nint ppp_send_config(ppp_pcb *pcb, int mtu, u32_t accm, int pcomp, int accomp);\nint ppp_recv_config(ppp_pcb *pcb, int mru, u32_t accm, int pcomp, int accomp);\n\n#if PPP_IPV4_SUPPORT\nint sifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr, u32_t netmask);\nint cifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr);\n#if 0 /* UNUSED - PROXY ARP */\nint sifproxyarp(ppp_pcb *pcb, u32_t his_adr);\nint cifproxyarp(ppp_pcb *pcb, u32_t his_adr);\n#endif /* UNUSED - PROXY ARP */\n#if LWIP_DNS\nint sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2);\nint cdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2);\n#endif /* LWIP_DNS */\n#if VJ_SUPPORT\nint sifvjcomp(ppp_pcb *pcb, int vjcomp, int cidcomp, int maxcid);\n#endif /* VJ_SUPPORT */\nint sifup(ppp_pcb *pcb);\nint sifdown (ppp_pcb *pcb);\nu32_t get_mask(u32_t addr);\n#endif /* PPP_IPV4_SUPPORT */\n\n#if PPP_IPV6_SUPPORT\nint sif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64);\nint cif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64);\nint sif6up(ppp_pcb *pcb);\nint sif6down (ppp_pcb *pcb);\n#endif /* PPP_IPV6_SUPPORT */\n\n#if DEMAND_SUPPORT\nint sifnpmode(ppp_pcb *pcb, int proto, enum NPmode mode);\n#endif /* DEMAND_SUPPORt */\n\nvoid netif_set_mtu(ppp_pcb *pcb, int mtu);\nint netif_get_mtu(ppp_pcb *pcb);\n\n#if CCP_SUPPORT\n#if 0 /* unused */\nint ccp_test(ppp_pcb *pcb, u_char *opt_ptr, int opt_len, int for_transmit);\n#endif /* unused */\nvoid ccp_set(ppp_pcb *pcb, u8_t isopen, u8_t isup, u8_t receive_method, u8_t transmit_method);\nvoid ccp_reset_comp(ppp_pcb *pcb);\nvoid ccp_reset_decomp(ppp_pcb *pcb);\n#if 0 /* unused */\nint ccp_fatal_error(ppp_pcb *pcb);\n#endif /* unused */\n#endif /* CCP_SUPPORT */\n\n#if PPP_IDLETIMELIMIT\nint get_idle_time(ppp_pcb *pcb, struct ppp_idle *ip);\n#endif /* PPP_IDLETIMELIMIT */\n\n#if DEMAND_SUPPORT\nint get_loop_output(void);\n#endif /* DEMAND_SUPPORT */\n\n/* Optional protocol names list, to make our messages a little more informative. */\n#if PPP_PROTOCOLNAME\nconst char * protocol_name(int proto);\n#endif /* PPP_PROTOCOLNAME  */\n\n/* Optional stats support, to get some statistics on the PPP interface */\n#if PPP_STATS_SUPPORT\nvoid print_link_stats(void); /* Print stats, if available */\nvoid reset_link_stats(int u); /* Reset (init) stats when link goes up */\nvoid update_link_stats(int u); /* Get stats at link termination */\n#endif /* PPP_STATS_SUPPORT */\n\n\n\n/*\n * Inline versions of get/put char/short/long.\n * Pointer is advanced; we assume that both arguments\n * are lvalues and will already be in registers.\n * cp MUST be u_char *.\n */\n#define GETCHAR(c, cp) { \\\n    (c) = *(cp)++; \\\n}\n#define PUTCHAR(c, cp) { \\\n    *(cp)++ = (u_char) (c); \\\n}\n#define GETSHORT(s, cp) { \\\n    (s) = *(cp)++ << 8; \\\n    (s) |= *(cp)++; \\\n}\n#define PUTSHORT(s, cp) { \\\n    *(cp)++ = (u_char) ((s) >> 8); \\\n    *(cp)++ = (u_char) (s); \\\n}\n#define GETLONG(l, cp) { \\\n    (l) = *(cp)++ << 8; \\\n    (l) |= *(cp)++; (l) <<= 8; \\\n    (l) |= *(cp)++; (l) <<= 8; \\\n    (l) |= *(cp)++; \\\n}\n#define PUTLONG(l, cp) { \\\n    *(cp)++ = (u_char) ((l) >> 24); \\\n    *(cp)++ = (u_char) ((l) >> 16); \\\n    *(cp)++ = (u_char) ((l) >> 8); \\\n    *(cp)++ = (u_char) (l); \\\n}\n\n#define INCPTR(n, cp)    ((cp) += (n))\n#define DECPTR(n, cp)    ((cp) -= (n))\n\n/*\n * System dependent definitions for user-level 4.3BSD UNIX implementation.\n */\n#define TIMEOUT(f, a, t)        do { sys_untimeout((f), (a)); sys_timeout((t)*1000, (f), (a)); } while(0)\n#define TIMEOUTMS(f, a, t)      do { sys_untimeout((f), (a)); sys_timeout((t), (f), (a)); } while(0)\n#define UNTIMEOUT(f, a)         sys_untimeout((f), (a))\n\n#define BZERO(s, n)        memset(s, 0, n)\n#define    BCMP(s1, s2, l)        memcmp(s1, s2, l)\n\n#define PRINTMSG(m, l)        { ppp_info(\"Remote message: %0.*v\", l, m); }\n\n/*\n * MAKEHEADER - Add Header fields to a packet.\n */\n#define MAKEHEADER(p, t) { \\\n    PUTCHAR(PPP_ALLSTATIONS, p); \\\n    PUTCHAR(PPP_UI, p); \\\n    PUTSHORT(t, p); }\n\n/* Procedures exported from auth.c */\nvoid link_required(ppp_pcb *pcb);     /* we are starting to use the link */\nvoid link_terminated(ppp_pcb *pcb);   /* we are finished with the link */\nvoid link_down(ppp_pcb *pcb);          /* the LCP layer has left the Opened state */\nvoid upper_layers_down(ppp_pcb *pcb); /* take all NCPs down */\nvoid link_established(ppp_pcb *pcb);  /* the link is up; authenticate now */\nvoid start_networks(ppp_pcb *pcb);    /* start all the network control protos */\nvoid continue_networks(ppp_pcb *pcb); /* start network [ip, etc] control protos */\n#if PPP_AUTH_SUPPORT\n#if PPP_SERVER\nint auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen);\n                                /* check the user name and passwd against configuration */\nvoid auth_peer_fail(ppp_pcb *pcb, int protocol);\n                /* peer failed to authenticate itself */\nvoid auth_peer_success(ppp_pcb *pcb, int protocol, int prot_flavor, const char *name, int namelen);\n                /* peer successfully authenticated itself */\n#endif /* PPP_SERVER */\nvoid auth_withpeer_fail(ppp_pcb *pcb, int protocol);\n                /* we failed to authenticate ourselves */\nvoid auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor);\n                /* we successfully authenticated ourselves */\n#endif /* PPP_AUTH_SUPPORT */\nvoid np_up(ppp_pcb *pcb, int proto);    /* a network protocol has come up */\nvoid np_down(ppp_pcb *pcb, int proto);  /* a network protocol has gone down */\nvoid np_finished(ppp_pcb *pcb, int proto); /* a network protocol no longer needs link */\n#if PPP_AUTH_SUPPORT\nint get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server);\n                /* get \"secret\" for chap */\n#endif /* PPP_AUTH_SUPPORT */\n\n/* Procedures exported from ipcp.c */\n/* int parse_dotted_ip (char *, u32_t *); */\n\n/* Procedures exported from demand.c */\n#if DEMAND_SUPPORT\nvoid demand_conf (void);    /* config interface(s) for demand-dial */\nvoid demand_block (void);    /* set all NPs to queue up packets */\nvoid demand_unblock (void); /* set all NPs to pass packets */\nvoid demand_discard (void); /* set all NPs to discard packets */\nvoid demand_rexmit (int, u32_t); /* retransmit saved frames for an NP*/\nint  loop_chars (unsigned char *, int); /* process chars from loopback */\nint  loop_frame (unsigned char *, int); /* should we bring link up? */\n#endif /* DEMAND_SUPPORT */\n\n/* Procedures exported from multilink.c */\n#ifdef HAVE_MULTILINK\nvoid mp_check_options (void); /* Check multilink-related options */\nint  mp_join_bundle (void);  /* join our link to an appropriate bundle */\nvoid mp_exit_bundle (void);  /* have disconnected our link from bundle */\nvoid mp_bundle_terminated (void);\nchar *epdisc_to_str (struct epdisc *); /* string from endpoint discrim. */\nint  str_to_epdisc (struct epdisc *, char *); /* endpt disc. from str */\n#else\n#define mp_bundle_terminated()    /* nothing */\n#define mp_exit_bundle()    /* nothing */\n#define doing_multilink        0\n#define multilink_master    0\n#endif\n\n/* Procedures exported from utils.c. */\nvoid ppp_print_string(const u_char *p, int len, void (*printer) (void *, const char *, ...), void *arg);   /* Format a string for output */\nint ppp_slprintf(char *buf, int buflen, const char *fmt, ...);            /* sprintf++ */\nint ppp_vslprintf(char *buf, int buflen, const char *fmt, va_list args);  /* vsprintf++ */\nsize_t ppp_strlcpy(char *dest, const char *src, size_t len);        /* safe strcpy */\nsize_t ppp_strlcat(char *dest, const char *src, size_t len);        /* safe strncpy */\nvoid ppp_dbglog(const char *fmt, ...);    /* log a debug message */\nvoid ppp_info(const char *fmt, ...);      /* log an informational message */\nvoid ppp_notice(const char *fmt, ...);    /* log a notice-level message */\nvoid ppp_warn(const char *fmt, ...);      /* log a warning message */\nvoid ppp_error(const char *fmt, ...);     /* log an error message */\nvoid ppp_fatal(const char *fmt, ...);     /* log an error message and die(1) */\n#if PRINTPKT_SUPPORT\nvoid ppp_dump_packet(ppp_pcb *pcb, const char *tag, unsigned char *p, int len);\n                                /* dump packet to debug log if interesting */\n#endif /* PRINTPKT_SUPPORT */\n\n\n#endif /* PPP_SUPPORT */\n#endif /* LWIP_HDR_PPP_IMPL_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/ppp_opts.h",
    "content": "/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#ifndef LWIP_PPP_OPTS_H\n#define LWIP_PPP_OPTS_H\n\n#include \"lwip/opt.h\"\n\n/**\n * PPP_SUPPORT==1: Enable PPP.\n */\n#ifndef PPP_SUPPORT\n#define PPP_SUPPORT                     0\n#endif\n\n/**\n * PPPOE_SUPPORT==1: Enable PPP Over Ethernet\n */\n#ifndef PPPOE_SUPPORT\n#define PPPOE_SUPPORT                   0\n#endif\n\n/**\n * PPPOL2TP_SUPPORT==1: Enable PPP Over L2TP\n */\n#ifndef PPPOL2TP_SUPPORT\n#define PPPOL2TP_SUPPORT                0\n#endif\n\n/**\n * PPPOL2TP_AUTH_SUPPORT==1: Enable PPP Over L2TP Auth (enable MD5 support)\n */\n#ifndef PPPOL2TP_AUTH_SUPPORT\n#define PPPOL2TP_AUTH_SUPPORT           PPPOL2TP_SUPPORT\n#endif\n\n/**\n * PPPOS_SUPPORT==1: Enable PPP Over Serial\n */\n#ifndef PPPOS_SUPPORT\n#define PPPOS_SUPPORT                   PPP_SUPPORT\n#endif\n\n/**\n * LWIP_PPP_API==1: Enable PPP API (in pppapi.c)\n */\n#ifndef LWIP_PPP_API\n#define LWIP_PPP_API                    (PPP_SUPPORT && (NO_SYS == 0))\n#endif\n\n/**\n * MEMP_NUM_PPP_PCB: the number of simultaneously active PPP\n * connections (requires the PPP_SUPPORT option)\n */\n#ifndef MEMP_NUM_PPP_PCB\n#define MEMP_NUM_PPP_PCB       1\n#endif\n\n#if PPP_SUPPORT\n\n/**\n * MEMP_NUM_PPPOS_INTERFACES: the number of concurrently active PPPoS\n * interfaces (only used with PPPOS_SUPPORT==1)\n */\n#ifndef MEMP_NUM_PPPOS_INTERFACES\n#define MEMP_NUM_PPPOS_INTERFACES       MEMP_NUM_PPP_PCB\n#endif\n\n/**\n * MEMP_NUM_PPPOE_INTERFACES: the number of concurrently active PPPoE\n * interfaces (only used with PPPOE_SUPPORT==1)\n */\n#ifndef MEMP_NUM_PPPOE_INTERFACES\n#define MEMP_NUM_PPPOE_INTERFACES       1\n#endif\n\n/**\n * MEMP_NUM_PPPOL2TP_INTERFACES: the number of concurrently active PPPoL2TP\n * interfaces (only used with PPPOL2TP_SUPPORT==1)\n */\n#ifndef MEMP_NUM_PPPOL2TP_INTERFACES\n#define MEMP_NUM_PPPOL2TP_INTERFACES       1\n#endif\n\n/**\n * MEMP_NUM_PPP_API_MSG: Number of concurrent PPP API messages (in pppapi.c)\n */\n#ifndef MEMP_NUM_PPP_API_MSG\n#define MEMP_NUM_PPP_API_MSG 5\n#endif\n\n/**\n * PPP_DEBUG: Enable debugging for PPP.\n */\n#ifndef PPP_DEBUG\n#define PPP_DEBUG                       LWIP_DBG_OFF\n#endif\n\n/**\n * PPP_INPROC_IRQ_SAFE==1 call pppos_input() using tcpip_callback().\n *\n * Please read the \"PPPoS input path\" chapter in the PPP documentation about this option.\n */\n#ifndef PPP_INPROC_IRQ_SAFE\n#define PPP_INPROC_IRQ_SAFE             0\n#endif\n\n/**\n * PRINTPKT_SUPPORT==1: Enable PPP print packet support\n *\n * Mandatory for debugging, it displays exchanged packet content in debug trace.\n */\n#ifndef PRINTPKT_SUPPORT\n#define PRINTPKT_SUPPORT                0\n#endif\n\n/**\n * PPP_IPV4_SUPPORT==1: Enable PPP IPv4 support\n */\n#ifndef PPP_IPV4_SUPPORT\n#define PPP_IPV4_SUPPORT                (LWIP_IPV4)\n#endif\n\n/**\n * PPP_IPV6_SUPPORT==1: Enable PPP IPv6 support\n */\n#ifndef PPP_IPV6_SUPPORT\n#define PPP_IPV6_SUPPORT                (LWIP_IPV6)\n#endif\n\n/**\n * PPP_NOTIFY_PHASE==1: Support PPP notify phase support\n *\n * PPP notify phase support allows you to set a callback which is\n * called on change of the internal PPP state machine.\n *\n * This can be used for example to set a LED pattern depending on the\n * current phase of the PPP session.\n */\n#ifndef PPP_NOTIFY_PHASE\n#define PPP_NOTIFY_PHASE                0\n#endif\n\n/**\n * pbuf_type PPP is using for LCP, PAP, CHAP, EAP, CCP, IPCP and IP6CP packets.\n *\n * Memory allocated must be single buffered for PPP to works, it requires pbuf\n * that are not going to be chained when allocated. This requires setting\n * PBUF_POOL_BUFSIZE to at least 512 bytes, which is quite huge for small systems.\n *\n * Setting PPP_USE_PBUF_RAM to 1 makes PPP use memory from heap where continuous\n * buffers are required, allowing you to use a smaller PBUF_POOL_BUFSIZE.\n */\n#ifndef PPP_USE_PBUF_RAM\n#define PPP_USE_PBUF_RAM                0\n#endif\n\n/**\n * PPP_FCS_TABLE: Keep a 256*2 byte table to speed up FCS calculation for PPPoS\n */\n#ifndef PPP_FCS_TABLE\n#define PPP_FCS_TABLE                   1\n#endif\n\n/**\n * PAP_SUPPORT==1: Support PAP.\n */\n#ifndef PAP_SUPPORT\n#define PAP_SUPPORT                     0\n#endif\n\n/**\n * CHAP_SUPPORT==1: Support CHAP.\n */\n#ifndef CHAP_SUPPORT\n#define CHAP_SUPPORT                    0\n#endif\n\n/**\n * MSCHAP_SUPPORT==1: Support MSCHAP.\n */\n#ifndef MSCHAP_SUPPORT\n#define MSCHAP_SUPPORT                  0\n#endif\n#if MSCHAP_SUPPORT\n/* MSCHAP requires CHAP support */\n#undef CHAP_SUPPORT\n#define CHAP_SUPPORT                    1\n#endif /* MSCHAP_SUPPORT */\n\n/**\n * EAP_SUPPORT==1: Support EAP.\n */\n#ifndef EAP_SUPPORT\n#define EAP_SUPPORT                     0\n#endif\n\n/**\n * CCP_SUPPORT==1: Support CCP.\n */\n#ifndef CCP_SUPPORT\n#define CCP_SUPPORT                     0\n#endif\n\n/**\n * MPPE_SUPPORT==1: Support MPPE.\n */\n#ifndef MPPE_SUPPORT\n#define MPPE_SUPPORT                    0\n#endif\n#if MPPE_SUPPORT\n/* MPPE requires CCP support */\n#undef CCP_SUPPORT\n#define CCP_SUPPORT                     1\n/* MPPE requires MSCHAP support */\n#undef MSCHAP_SUPPORT\n#define MSCHAP_SUPPORT                  1\n/* MSCHAP requires CHAP support */\n#undef CHAP_SUPPORT\n#define CHAP_SUPPORT                    1\n#endif /* MPPE_SUPPORT */\n\n/**\n * CBCP_SUPPORT==1: Support CBCP. CURRENTLY NOT SUPPORTED! DO NOT SET!\n */\n#ifndef CBCP_SUPPORT\n#define CBCP_SUPPORT                    0\n#endif\n\n/**\n * ECP_SUPPORT==1: Support ECP. CURRENTLY NOT SUPPORTED! DO NOT SET!\n */\n#ifndef ECP_SUPPORT\n#define ECP_SUPPORT                     0\n#endif\n\n/**\n * DEMAND_SUPPORT==1: Support dial on demand. CURRENTLY NOT SUPPORTED! DO NOT SET!\n */\n#ifndef DEMAND_SUPPORT\n#define DEMAND_SUPPORT                  0\n#endif\n\n/**\n * LQR_SUPPORT==1: Support Link Quality Report. Do nothing except exchanging some LCP packets.\n */\n#ifndef LQR_SUPPORT\n#define LQR_SUPPORT                     0\n#endif\n\n/**\n * PPP_SERVER==1: Enable PPP server support (waiting for incoming PPP session).\n *\n * Currently only supported for PPPoS.\n */\n#ifndef PPP_SERVER\n#define PPP_SERVER                      0\n#endif\n\n#if PPP_SERVER\n/*\n * PPP_OUR_NAME: Our name for authentication purposes\n */\n#ifndef PPP_OUR_NAME\n#define PPP_OUR_NAME                    \"lwIP\"\n#endif\n#endif /* PPP_SERVER */\n\n/**\n * VJ_SUPPORT==1: Support VJ header compression.\n */\n#ifndef VJ_SUPPORT\n#define VJ_SUPPORT                      1\n#endif\n/* VJ compression is only supported for TCP over IPv4 over PPPoS. */\n#if !PPPOS_SUPPORT || !PPP_IPV4_SUPPORT || !LWIP_TCP\n#undef VJ_SUPPORT\n#define VJ_SUPPORT                      0\n#endif /* !PPPOS_SUPPORT */\n\n/**\n * PPP_MD5_RANDM==1: Use MD5 for better randomness.\n * Enabled by default if CHAP, EAP, or L2TP AUTH support is enabled.\n */\n#ifndef PPP_MD5_RANDM\n#define PPP_MD5_RANDM                   (CHAP_SUPPORT || EAP_SUPPORT || PPPOL2TP_AUTH_SUPPORT)\n#endif\n\n/**\n * PolarSSL embedded library\n *\n *\n * lwIP contains some files fetched from the latest BSD release of\n * the PolarSSL project (PolarSSL 0.10.1-bsd) for ciphers and encryption\n * methods we need for lwIP PPP support.\n *\n * The PolarSSL files were cleaned to contain only the necessary struct\n * fields and functions needed for lwIP.\n *\n * The PolarSSL API was not changed at all, so if you are already using\n * PolarSSL you can choose to skip the compilation of the included PolarSSL\n * library into lwIP.\n *\n * If you are not using the embedded copy you must include external\n * libraries into your arch/cc.h port file.\n *\n * Beware of the stack requirements which can be a lot larger if you are not\n * using our cleaned PolarSSL library.\n */\n\n/**\n * LWIP_USE_EXTERNAL_POLARSSL: Use external PolarSSL library\n */\n#ifndef LWIP_USE_EXTERNAL_POLARSSL\n#define LWIP_USE_EXTERNAL_POLARSSL      0\n#endif\n\n/**\n * LWIP_USE_EXTERNAL_MBEDTLS: Use external mbed TLS library\n */\n#ifndef LWIP_USE_EXTERNAL_MBEDTLS\n#define LWIP_USE_EXTERNAL_MBEDTLS       0\n#endif\n\n/*\n * PPP Timeouts\n */\n\n/**\n * FSM_DEFTIMEOUT: Timeout time in seconds\n */\n#ifndef FSM_DEFTIMEOUT\n#define FSM_DEFTIMEOUT                  6\n#endif\n\n/**\n * FSM_DEFMAXTERMREQS: Maximum Terminate-Request transmissions\n */\n#ifndef FSM_DEFMAXTERMREQS\n#define FSM_DEFMAXTERMREQS              2\n#endif\n\n/**\n * FSM_DEFMAXCONFREQS: Maximum Configure-Request transmissions\n */\n#ifndef FSM_DEFMAXCONFREQS\n#define FSM_DEFMAXCONFREQS              10\n#endif\n\n/**\n * FSM_DEFMAXNAKLOOPS: Maximum number of nak loops\n */\n#ifndef FSM_DEFMAXNAKLOOPS\n#define FSM_DEFMAXNAKLOOPS              5\n#endif\n\n/**\n * UPAP_DEFTIMEOUT: Timeout (seconds) for retransmitting req\n */\n#ifndef UPAP_DEFTIMEOUT\n#define UPAP_DEFTIMEOUT                 6\n#endif\n\n/**\n * UPAP_DEFTRANSMITS: Maximum number of auth-reqs to send\n */\n#ifndef UPAP_DEFTRANSMITS\n#define UPAP_DEFTRANSMITS               10\n#endif\n\n#if PPP_SERVER\n/**\n * UPAP_DEFREQTIME: Time to wait for auth-req from peer\n */\n#ifndef UPAP_DEFREQTIME\n#define UPAP_DEFREQTIME                 30\n#endif\n#endif /* PPP_SERVER */\n\n/**\n * CHAP_DEFTIMEOUT: Timeout (seconds) for retransmitting req\n */\n#ifndef CHAP_DEFTIMEOUT\n#define CHAP_DEFTIMEOUT                 6\n#endif\n\n/**\n * CHAP_DEFTRANSMITS: max # times to send challenge\n */\n#ifndef CHAP_DEFTRANSMITS\n#define CHAP_DEFTRANSMITS               10\n#endif\n\n#if PPP_SERVER\n/**\n * CHAP_DEFRECHALLENGETIME: If this option is > 0, rechallenge the peer every n seconds\n */\n#ifndef CHAP_DEFRECHALLENGETIME\n#define CHAP_DEFRECHALLENGETIME         0\n#endif\n#endif /* PPP_SERVER */\n\n/**\n * EAP_DEFREQTIME: Time to wait for peer request\n */\n#ifndef EAP_DEFREQTIME\n#define EAP_DEFREQTIME                  6\n#endif\n\n/**\n * EAP_DEFALLOWREQ: max # times to accept requests\n */\n#ifndef EAP_DEFALLOWREQ\n#define EAP_DEFALLOWREQ                 10\n#endif\n\n#if PPP_SERVER\n/**\n * EAP_DEFTIMEOUT: Timeout (seconds) for rexmit\n */\n#ifndef EAP_DEFTIMEOUT\n#define EAP_DEFTIMEOUT                  6\n#endif\n\n/**\n * EAP_DEFTRANSMITS: max # times to transmit\n */\n#ifndef EAP_DEFTRANSMITS\n#define EAP_DEFTRANSMITS                10\n#endif\n#endif /* PPP_SERVER */\n\n/**\n * LCP_DEFLOOPBACKFAIL: Default number of times we receive our magic number from the peer\n * before deciding the link is looped-back.\n */\n#ifndef LCP_DEFLOOPBACKFAIL\n#define LCP_DEFLOOPBACKFAIL             10\n#endif\n\n/**\n * LCP_ECHOINTERVAL: Interval in seconds between keepalive echo requests, 0 to disable.\n */\n#ifndef LCP_ECHOINTERVAL\n#define LCP_ECHOINTERVAL                0\n#endif\n\n/**\n * LCP_MAXECHOFAILS: Number of unanswered echo requests before failure.\n */\n#ifndef LCP_MAXECHOFAILS\n#define LCP_MAXECHOFAILS                3\n#endif\n\n/**\n * PPP_MAXIDLEFLAG: Max Xmit idle time (in ms) before resend flag char.\n */\n#ifndef PPP_MAXIDLEFLAG\n#define PPP_MAXIDLEFLAG                 100\n#endif\n\n/**\n * PPP Packet sizes\n */\n\n/**\n * PPP_MRU: Default MRU\n */\n#ifndef PPP_MRU\n#define PPP_MRU                         1500\n#endif\n\n/**\n * PPP_DEFMRU: Default MRU to try\n */\n#ifndef PPP_DEFMRU\n#define PPP_DEFMRU                      1500\n#endif\n\n/**\n * PPP_MAXMRU: Normally limit MRU to this (pppd default = 16384)\n */\n#ifndef PPP_MAXMRU\n#define PPP_MAXMRU                      1500\n#endif\n\n/**\n * PPP_MINMRU: No MRUs below this\n */\n#ifndef PPP_MINMRU\n#define PPP_MINMRU                      128\n#endif\n\n/**\n * PPPOL2TP_DEFMRU: Default MTU and MRU for L2TP\n * Default = 1500 - PPPoE(6) - PPP Protocol(2) - IPv4 header(20) - UDP Header(8)\n * - L2TP Header(6) - HDLC Header(2) - PPP Protocol(2) - MPPE Header(2) - PPP Protocol(2)\n */\n#if PPPOL2TP_SUPPORT\n#ifndef PPPOL2TP_DEFMRU\n#define PPPOL2TP_DEFMRU                 1450\n#endif\n#endif /* PPPOL2TP_SUPPORT */\n\n/**\n * MAXNAMELEN: max length of hostname or name for auth\n */\n#ifndef MAXNAMELEN\n#define MAXNAMELEN                      256\n#endif\n\n/**\n * MAXSECRETLEN: max length of password or secret\n */\n#ifndef MAXSECRETLEN\n#define MAXSECRETLEN                    256\n#endif\n\n/* ------------------------------------------------------------------------- */\n\n/*\n * Build triggers for embedded PolarSSL\n */\n#if !LWIP_USE_EXTERNAL_POLARSSL && !LWIP_USE_EXTERNAL_MBEDTLS\n\n/* CHAP, EAP, L2TP AUTH and MD5 Random require MD5 support */\n#if CHAP_SUPPORT || EAP_SUPPORT || PPPOL2TP_AUTH_SUPPORT || PPP_MD5_RANDM\n#define LWIP_INCLUDED_POLARSSL_MD5      1\n#endif /* CHAP_SUPPORT || EAP_SUPPORT || PPPOL2TP_AUTH_SUPPORT || PPP_MD5_RANDM */\n\n#if MSCHAP_SUPPORT\n\n/* MSCHAP require MD4 support */\n#define LWIP_INCLUDED_POLARSSL_MD4      1\n/* MSCHAP require SHA1 support */\n#define LWIP_INCLUDED_POLARSSL_SHA1     1\n/* MSCHAP require DES support */\n#define LWIP_INCLUDED_POLARSSL_DES      1\n\n/* MS-CHAP support is required for MPPE */\n#if MPPE_SUPPORT\n/* MPPE require ARC4 support */\n#define LWIP_INCLUDED_POLARSSL_ARC4     1\n#endif /* MPPE_SUPPORT */\n\n#endif /* MSCHAP_SUPPORT */\n\n#endif /* !LWIP_USE_EXTERNAL_POLARSSL && !LWIP_USE_EXTERNAL_MBEDTLS */\n\n/* Default value if unset */\n#ifndef LWIP_INCLUDED_POLARSSL_MD4\n#define LWIP_INCLUDED_POLARSSL_MD4      0\n#endif /* LWIP_INCLUDED_POLARSSL_MD4 */\n#ifndef LWIP_INCLUDED_POLARSSL_MD5\n#define LWIP_INCLUDED_POLARSSL_MD5      0\n#endif /* LWIP_INCLUDED_POLARSSL_MD5 */\n#ifndef LWIP_INCLUDED_POLARSSL_SHA1\n#define LWIP_INCLUDED_POLARSSL_SHA1     0\n#endif /* LWIP_INCLUDED_POLARSSL_SHA1 */\n#ifndef LWIP_INCLUDED_POLARSSL_DES\n#define LWIP_INCLUDED_POLARSSL_DES      0\n#endif /* LWIP_INCLUDED_POLARSSL_DES */\n#ifndef LWIP_INCLUDED_POLARSSL_ARC4\n#define LWIP_INCLUDED_POLARSSL_ARC4     0\n#endif /* LWIP_INCLUDED_POLARSSL_ARC4 */\n\n#endif /* PPP_SUPPORT */\n\n#endif /* LWIP_PPP_OPTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/pppapi.h",
    "content": "/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#ifndef LWIP_PPPAPI_H\n#define LWIP_PPPAPI_H\n\n#include \"netif/ppp/ppp_opts.h\"\n\n#if LWIP_PPP_API /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/sys.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n#include \"netif/ppp/ppp.h\"\n#if PPPOS_SUPPORT\n#include \"netif/ppp/pppos.h\"\n#endif /* PPPOS_SUPPORT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct pppapi_msg_msg {\n  ppp_pcb *ppp;\n  union {\n#if PPP_NOTIFY_PHASE\n    struct {\n      ppp_notify_phase_cb_fn notify_phase_cb;\n    } setnotifyphasecb;\n#endif /* PPP_NOTIFY_PHASE */\n#if PPPOS_SUPPORT\n    struct {\n      struct netif *pppif;\n      pppos_output_cb_fn output_cb;\n      ppp_link_status_cb_fn link_status_cb;\n      void *ctx_cb;\n    } serialcreate;\n#endif /* PPPOS_SUPPORT */\n#if PPPOE_SUPPORT\n    struct {\n      struct netif *pppif;\n      struct netif *ethif;\n      const char *service_name;\n      const char *concentrator_name;\n      ppp_link_status_cb_fn link_status_cb;\n      void *ctx_cb;\n    } ethernetcreate;\n#endif /* PPPOE_SUPPORT */\n#if PPPOL2TP_SUPPORT\n    struct {\n      struct netif *pppif;\n      struct netif *netif;\n      API_MSG_M_DEF_C(ip_addr_t, ipaddr);\n      u16_t port;\n#if PPPOL2TP_AUTH_SUPPORT\n      const u8_t *secret;\n      u8_t secret_len;\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n      ppp_link_status_cb_fn link_status_cb;\n      void *ctx_cb;\n    } l2tpcreate;\n#endif /* PPPOL2TP_SUPPORT */\n    struct {\n      u16_t holdoff;\n    } connect;\n    struct {\n      u8_t nocarrier;\n    } close;\n    struct {\n      u8_t cmd;\n      void *arg;\n    } ioctl;\n  } msg;\n};\n\nstruct pppapi_msg {\n  struct tcpip_api_call_data call;\n  struct pppapi_msg_msg msg;\n};\n\n/* API for application */\nerr_t pppapi_set_default(ppp_pcb *pcb);\n#if PPP_NOTIFY_PHASE\nerr_t pppapi_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb);\n#endif /* PPP_NOTIFY_PHASE */\n#if PPPOS_SUPPORT\nppp_pcb *pppapi_pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb, ppp_link_status_cb_fn link_status_cb, void *ctx_cb);\n#endif /* PPPOS_SUPPORT */\n#if PPPOE_SUPPORT\nppp_pcb *pppapi_pppoe_create(struct netif *pppif, struct netif *ethif, const char *service_name,\n                                const char *concentrator_name, ppp_link_status_cb_fn link_status_cb,\n                                void *ctx_cb);\n#endif /* PPPOE_SUPPORT */\n#if PPPOL2TP_SUPPORT\nppp_pcb *pppapi_pppol2tp_create(struct netif *pppif, struct netif *netif, ip_addr_t *ipaddr, u16_t port,\n                            const u8_t *secret, u8_t secret_len,\n                            ppp_link_status_cb_fn link_status_cb, void *ctx_cb);\n#endif /* PPPOL2TP_SUPPORT */\nerr_t pppapi_connect(ppp_pcb *pcb, u16_t holdoff);\n#if PPP_SERVER\nerr_t pppapi_listen(ppp_pcb *pcb);\n#endif /* PPP_SERVER */\nerr_t pppapi_close(ppp_pcb *pcb, u8_t nocarrier);\nerr_t pppapi_free(ppp_pcb *pcb);\nerr_t pppapi_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_PPP_API */\n\n#endif /* LWIP_PPPAPI_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/pppcrypt.h",
    "content": "/*\n * pppcrypt.c - PPP/DES linkage for MS-CHAP and EAP SRP-SHA1\n *\n * Extracted from chap_ms.c by James Carlson.\n *\n * Copyright (c) 1995 Eric Rosenquist.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n/* This header file is included in all PPP modules needing hashes and/or ciphers */\n\n#ifndef PPPCRYPT_H\n#define    PPPCRYPT_H\n\n/*\n * If included PolarSSL copy is not used, user is expected to include\n * external libraries in arch/cc.h (which is included by lwip/arch.h).\n */\n#include \"lwip/arch.h\"\n\n/*\n * Map hashes and ciphers functions to PolarSSL\n */\n#if !LWIP_USE_EXTERNAL_MBEDTLS\n\n#include \"netif/ppp/polarssl/md4.h\"\n#define lwip_md4_context md4_context\n#define lwip_md4_init(context)\n#define lwip_md4_starts md4_starts\n#define lwip_md4_update md4_update\n#define lwip_md4_finish md4_finish\n#define lwip_md4_free(context)\n\n#include \"netif/ppp/polarssl/md5.h\"\n#define lwip_md5_context md5_context\n#define lwip_md5_init(context)\n#define lwip_md5_starts md5_starts\n#define lwip_md5_update md5_update\n#define lwip_md5_finish md5_finish\n#define lwip_md5_free(context)\n\n#include \"netif/ppp/polarssl/sha1.h\"\n#define lwip_sha1_context sha1_context\n#define lwip_sha1_init(context)\n#define lwip_sha1_starts sha1_starts\n#define lwip_sha1_update sha1_update\n#define lwip_sha1_finish sha1_finish\n#define lwip_sha1_free(context)\n\n#include \"netif/ppp/polarssl/des.h\"\n#define lwip_des_context des_context\n#define lwip_des_init(context)\n#define lwip_des_setkey_enc des_setkey_enc\n#define lwip_des_crypt_ecb des_crypt_ecb\n#define lwip_des_free(context)\n\n#include \"netif/ppp/polarssl/arc4.h\"\n#define lwip_arc4_context arc4_context\n#define lwip_arc4_init(context)\n#define lwip_arc4_setup arc4_setup\n#define lwip_arc4_crypt arc4_crypt\n#define lwip_arc4_free(context)\n\n#endif /* !LWIP_USE_EXTERNAL_MBEDTLS */\n\n/*\n * Map hashes and ciphers functions to mbed TLS\n */\n#if LWIP_USE_EXTERNAL_MBEDTLS\n\n#define lwip_md4_context mbedtls_md4_context\n#define lwip_md4_init mbedtls_md4_init\n#define lwip_md4_starts mbedtls_md4_starts\n#define lwip_md4_update mbedtls_md4_update\n#define lwip_md4_finish mbedtls_md4_finish\n#define lwip_md4_free mbedtls_md4_free\n\n#define lwip_md5_context mbedtls_md5_context\n#define lwip_md5_init mbedtls_md5_init\n#define lwip_md5_starts mbedtls_md5_starts\n#define lwip_md5_update mbedtls_md5_update\n#define lwip_md5_finish mbedtls_md5_finish\n#define lwip_md5_free mbedtls_md5_free\n\n#define lwip_sha1_context mbedtls_sha1_context\n#define lwip_sha1_init mbedtls_sha1_init\n#define lwip_sha1_starts mbedtls_sha1_starts\n#define lwip_sha1_update mbedtls_sha1_update\n#define lwip_sha1_finish mbedtls_sha1_finish\n#define lwip_sha1_free mbedtls_sha1_free\n\n#define lwip_des_context mbedtls_des_context\n#define lwip_des_init mbedtls_des_init\n#define lwip_des_setkey_enc mbedtls_des_setkey_enc\n#define lwip_des_crypt_ecb mbedtls_des_crypt_ecb\n#define lwip_des_free mbedtls_des_free\n\n#define lwip_arc4_context mbedtls_arc4_context\n#define lwip_arc4_init mbedtls_arc4_init\n#define lwip_arc4_setup mbedtls_arc4_setup\n#define lwip_arc4_crypt(context, buffer, length) mbedtls_arc4_crypt(context, length, buffer, buffer)\n#define lwip_arc4_free mbedtls_arc4_free\n\n#endif /* LWIP_USE_EXTERNAL_MBEDTLS */\n\nvoid pppcrypt_56_to_64_bit_key(u_char *key, u_char *des_key);\n\n#endif /* PPPCRYPT_H */\n\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/pppdebug.h",
    "content": "/*****************************************************************************\n* pppdebug.h - System debugging utilities.\n*\n* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.\n* portions Copyright (c) 1998 Global Election Systems Inc.\n* portions Copyright (c) 2001 by Cognizant Pty Ltd.\n*\n* The authors hereby grant permission to use, copy, modify, distribute,\n* and license this software and its documentation for any purpose, provided\n* that existing copyright notices are retained in all copies and that this\n* notice and the following disclaimer are included verbatim in any \n* distributions. No written agreement, license, or royalty fee is required\n* for any of the authorized uses.\n*\n* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR\n* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n******************************************************************************\n* REVISION HISTORY (please don't use tabs!)\n*\n* 03-01-01 Marc Boucher <marc@mbsi.ca>\n*   Ported to lwIP.\n* 98-07-29 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.\n*   Original.\n*\n*****************************************************************************\n*/\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifndef PPPDEBUG_H\n#define PPPDEBUG_H\n\n/* Trace levels. */\n#define LOG_CRITICAL  (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE)\n#define LOG_ERR       (PPP_DEBUG | LWIP_DBG_LEVEL_SEVERE)\n#define LOG_NOTICE    (PPP_DEBUG | LWIP_DBG_LEVEL_WARNING)\n#define LOG_WARNING   (PPP_DEBUG | LWIP_DBG_LEVEL_WARNING)\n#define LOG_INFO      (PPP_DEBUG)\n#define LOG_DETAIL    (PPP_DEBUG)\n#define LOG_DEBUG     (PPP_DEBUG)\n\n#if PPP_DEBUG\n\n#define MAINDEBUG(a)    LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)\n#define SYSDEBUG(a)     LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)\n#define FSMDEBUG(a)     LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)\n#define LCPDEBUG(a)     LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)\n#define IPCPDEBUG(a)    LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)\n#define IPV6CPDEBUG(a)  LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)\n#define UPAPDEBUG(a)    LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)\n#define CHAPDEBUG(a)    LWIP_DEBUGF(LWIP_DBG_LEVEL_WARNING, a)\n#define PPPDEBUG(a, b)  LWIP_DEBUGF(a, b)\n\n#else /* PPP_DEBUG */\n\n#define MAINDEBUG(a)\n#define SYSDEBUG(a)\n#define FSMDEBUG(a)\n#define LCPDEBUG(a)\n#define IPCPDEBUG(a)\n#define IPV6CPDEBUG(a)\n#define UPAPDEBUG(a)\n#define CHAPDEBUG(a)\n#define PPPDEBUG(a, b)\n\n#endif /* PPP_DEBUG */\n\n#endif /* PPPDEBUG_H */\n\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/pppoe.h",
    "content": "/*****************************************************************************\n* pppoe.h - PPP Over Ethernet implementation for lwIP.\n*\n* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc.\n*\n* The authors hereby grant permission to use, copy, modify, distribute,\n* and license this software and its documentation for any purpose, provided\n* that existing copyright notices are retained in all copies and that this\n* notice and the following disclaimer are included verbatim in any \n* distributions. No written agreement, license, or royalty fee is required\n* for any of the authorized uses.\n*\n* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR\n* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n******************************************************************************\n* REVISION HISTORY\n*\n* 06-01-01 Marc Boucher <marc@mbsi.ca>\n*   Ported to lwIP.\n*****************************************************************************/\n\n\n\n/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */\n\n/*-\n * Copyright (c) 2002 The NetBSD Foundation, Inc.\n * All rights reserved.\n *\n * This code is derived from software contributed to The NetBSD Foundation\n * by Martin Husemann <martin@NetBSD.org>.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. All advertising materials mentioning features or use of this software\n *    must display the following acknowledgement:\n *        This product includes software developed by the NetBSD\n *        Foundation, Inc. and its contributors.\n * 4. Neither the name of The NetBSD Foundation nor the names of its\n *    contributors may be used to endorse or promote products derived\n *    from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS\n * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPPOE_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifndef PPP_OE_H\n#define PPP_OE_H\n\n#include \"ppp.h\"\n#include \"lwip/etharp.h\"\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct pppoehdr {\n  PACK_STRUCT_FLD_8(u8_t vertype);\n  PACK_STRUCT_FLD_8(u8_t code);\n  PACK_STRUCT_FIELD(u16_t session);\n  PACK_STRUCT_FIELD(u16_t plen);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct pppoetag {\n  PACK_STRUCT_FIELD(u16_t tag);\n  PACK_STRUCT_FIELD(u16_t len);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n\n#define PPPOE_STATE_INITIAL   0\n#define PPPOE_STATE_PADI_SENT 1\n#define PPPOE_STATE_PADR_SENT 2\n#define PPPOE_STATE_SESSION   3\n/* passive */\n#define PPPOE_STATE_PADO_SENT 1\n\n#define PPPOE_HEADERLEN       sizeof(struct pppoehdr)\n#define PPPOE_VERTYPE         0x11    /* VER=1, TYPE = 1 */\n\n#define PPPOE_TAG_EOL         0x0000  /* end of list */\n#define PPPOE_TAG_SNAME       0x0101  /* service name */\n#define PPPOE_TAG_ACNAME      0x0102  /* access concentrator name */\n#define PPPOE_TAG_HUNIQUE     0x0103  /* host unique */\n#define PPPOE_TAG_ACCOOKIE    0x0104  /* AC cookie */\n#define PPPOE_TAG_VENDOR      0x0105  /* vendor specific */\n#define PPPOE_TAG_RELAYSID    0x0110  /* relay session id */\n#define PPPOE_TAG_SNAME_ERR   0x0201  /* service name error */\n#define PPPOE_TAG_ACSYS_ERR   0x0202  /* AC system error */\n#define PPPOE_TAG_GENERIC_ERR 0x0203  /* gerneric error */\n\n#define PPPOE_CODE_PADI       0x09    /* Active Discovery Initiation */\n#define PPPOE_CODE_PADO       0x07    /* Active Discovery Offer */\n#define PPPOE_CODE_PADR       0x19    /* Active Discovery Request */\n#define PPPOE_CODE_PADS       0x65    /* Active Discovery Session confirmation */\n#define PPPOE_CODE_PADT       0xA7    /* Active Discovery Terminate */\n\n#ifndef PPPOE_MAX_AC_COOKIE_LEN\n#define PPPOE_MAX_AC_COOKIE_LEN   64\n#endif\n\nstruct pppoe_softc {\n  struct pppoe_softc *next;\n  struct netif *sc_ethif;      /* ethernet interface we are using */\n  ppp_pcb *pcb;                /* PPP PCB */\n\n  struct eth_addr sc_dest;     /* hardware address of concentrator */\n  u16_t sc_session;            /* PPPoE session id */\n  u8_t sc_state;               /* discovery phase or session connected */\n\n#ifdef PPPOE_TODO\n  u8_t *sc_service_name;       /* if != NULL: requested name of service */\n  u8_t *sc_concentrator_name;  /* if != NULL: requested concentrator id */\n#endif /* PPPOE_TODO */\n  u8_t sc_ac_cookie[PPPOE_MAX_AC_COOKIE_LEN]; /* content of AC cookie we must echo back */\n  u8_t sc_ac_cookie_len;       /* length of cookie data */\n#ifdef PPPOE_SERVER\n  u8_t *sc_hunique;            /* content of host unique we must echo back */\n  u8_t sc_hunique_len;         /* length of host unique */\n#endif\n  u8_t sc_padi_retried;        /* number of PADI retries already done */\n  u8_t sc_padr_retried;        /* number of PADR retries already done */\n};\n\n\n#define pppoe_init() /* compatibility define, no initialization needed */\n\nppp_pcb *pppoe_create(struct netif *pppif,\n       struct netif *ethif,\n       const char *service_name, const char *concentrator_name,\n       ppp_link_status_cb_fn link_status_cb, void *ctx_cb);\n\n/*\n * Functions called from lwIP\n * DO NOT CALL FROM lwIP USER APPLICATION.\n */\nvoid pppoe_disc_input(struct netif *netif, struct pbuf *p);\nvoid pppoe_data_input(struct netif *netif, struct pbuf *p);\n\n#endif /* PPP_OE_H */\n\n#endif /* PPP_SUPPORT && PPPOE_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/pppol2tp.h",
    "content": "/**\n * @file\n * Network Point to Point Protocol over Layer 2 Tunneling Protocol header file.\n *\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPPOL2TP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifndef PPPOL2TP_H\n#define PPPOL2TP_H\n\n#include \"ppp.h\"\n\n/* Timeout */\n#define PPPOL2TP_CONTROL_TIMEOUT         (5*1000)  /* base for quick timeout calculation */\n#define PPPOL2TP_SLOW_RETRY              (60*1000) /* persistent retry interval */\n\n#define PPPOL2TP_MAXSCCRQ                4         /* retry SCCRQ four times (quickly) */\n#define PPPOL2TP_MAXICRQ                 4         /* retry IRCQ four times */\n#define PPPOL2TP_MAXICCN                 4         /* retry ICCN four times */\n\n/* L2TP header flags */\n#define PPPOL2TP_HEADERFLAG_CONTROL      0x8000\n#define PPPOL2TP_HEADERFLAG_LENGTH       0x4000\n#define PPPOL2TP_HEADERFLAG_SEQUENCE     0x0800\n#define PPPOL2TP_HEADERFLAG_OFFSET       0x0200\n#define PPPOL2TP_HEADERFLAG_PRIORITY     0x0100\n#define PPPOL2TP_HEADERFLAG_VERSION      0x0002\n\n/* Mandatory bits for control: Control, Length, Sequence, Version 2 */\n#define PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY     (PPPOL2TP_HEADERFLAG_CONTROL|PPPOL2TP_HEADERFLAG_LENGTH|PPPOL2TP_HEADERFLAG_SEQUENCE|PPPOL2TP_HEADERFLAG_VERSION)\n/* Forbidden bits for control: Offset, Priority */\n#define PPPOL2TP_HEADERFLAG_CONTROL_FORBIDDEN     (PPPOL2TP_HEADERFLAG_OFFSET|PPPOL2TP_HEADERFLAG_PRIORITY)\n\n/* Mandatory bits for data: Version 2 */\n#define PPPOL2TP_HEADERFLAG_DATA_MANDATORY        (PPPOL2TP_HEADERFLAG_VERSION)\n\n/* AVP (Attribute Value Pair) header */\n#define PPPOL2TP_AVPHEADERFLAG_MANDATORY  0x8000\n#define PPPOL2TP_AVPHEADERFLAG_HIDDEN     0x4000\n#define PPPOL2TP_AVPHEADERFLAG_LENGTHMASK 0x03ff\n\n/* -- AVP - Message type */\n#define PPPOL2TP_AVPTYPE_MESSAGE      0 /* Message type */\n\n/* Control Connection Management */\n#define PPPOL2TP_MESSAGETYPE_SCCRQ    1 /* Start Control Connection Request */\n#define PPPOL2TP_MESSAGETYPE_SCCRP    2 /* Start Control Connection Reply */\n#define PPPOL2TP_MESSAGETYPE_SCCCN    3 /* Start Control Connection Connected */\n#define PPPOL2TP_MESSAGETYPE_STOPCCN  4 /* Stop Control Connection Notification */\n#define PPPOL2TP_MESSAGETYPE_HELLO    6 /* Hello */\n/* Call Management */\n#define PPPOL2TP_MESSAGETYPE_OCRQ     7 /* Outgoing Call Request */\n#define PPPOL2TP_MESSAGETYPE_OCRP     8 /* Outgoing Call Reply */\n#define PPPOL2TP_MESSAGETYPE_OCCN     9 /* Outgoing Call Connected */\n#define PPPOL2TP_MESSAGETYPE_ICRQ    10 /* Incoming Call Request */\n#define PPPOL2TP_MESSAGETYPE_ICRP    11 /* Incoming Call Reply */\n#define PPPOL2TP_MESSAGETYPE_ICCN    12 /* Incoming Call Connected */\n#define PPPOL2TP_MESSAGETYPE_CDN     14 /* Call Disconnect Notify */\n/* Error reporting */\n#define PPPOL2TP_MESSAGETYPE_WEN     15 /* WAN Error Notify */\n/* PPP Session Control */\n#define PPPOL2TP_MESSAGETYPE_SLI     16 /* Set Link Info */\n\n/* -- AVP - Result code */\n#define PPPOL2TP_AVPTYPE_RESULTCODE   1 /* Result code */\n#define PPPOL2TP_RESULTCODE           1 /* General request to clear control connection */\n\n/* -- AVP - Protocol version (!= L2TP Header version) */\n#define PPPOL2TP_AVPTYPE_VERSION      2\n#define PPPOL2TP_VERSION         0x0100 /* L2TP Protocol version 1, revision 0 */\n\n/* -- AVP - Framing capabilities */\n#define PPPOL2TP_AVPTYPE_FRAMINGCAPABILITIES           3 /* Bearer capabilities */\n#define PPPOL2TP_FRAMINGCAPABILITIES          0x00000003 /* Async + Sync framing */\n\n/* -- AVP - Bearer capabilities */\n#define PPPOL2TP_AVPTYPE_BEARERCAPABILITIES           4 /* Bearer capabilities */\n#define PPPOL2TP_BEARERCAPABILITIES          0x00000003 /* Analog + Digital Access */\n\n/* -- AVP - Tie breaker */\n#define PPPOL2TP_AVPTYPE_TIEBREAKER   5\n\n/* -- AVP - Host name */\n#define PPPOL2TP_AVPTYPE_HOSTNAME     7 /* Host name */\n#define PPPOL2TP_HOSTNAME        \"lwIP\" /* FIXME: make it configurable */\n\n/* -- AVP - Vendor name */\n#define PPPOL2TP_AVPTYPE_VENDORNAME   8 /* Vendor name */\n#define PPPOL2TP_VENDORNAME      \"lwIP\" /* FIXME: make it configurable */\n\n/* -- AVP - Assign tunnel ID */\n#define PPPOL2TP_AVPTYPE_TUNNELID     9 /* Assign Tunnel ID */\n\n/* -- AVP - Receive window size */\n#define PPPOL2TP_AVPTYPE_RECEIVEWINDOWSIZE  10 /* Receive window size */\n#define PPPOL2TP_RECEIVEWINDOWSIZE           8 /* FIXME: make it configurable */\n\n/* -- AVP - Challenge */\n#define PPPOL2TP_AVPTYPE_CHALLENGE   11 /* Challenge */\n\n/* -- AVP - Cause code */\n#define PPPOL2TP_AVPTYPE_CAUSECODE   12 /* Cause code*/\n\n/* -- AVP - Challenge response */\n#define PPPOL2TP_AVPTYPE_CHALLENGERESPONSE   13 /* Challenge response */\n#define PPPOL2TP_AVPTYPE_CHALLENGERESPONSE_SIZE  16\n\n/* -- AVP - Assign session ID */\n#define PPPOL2TP_AVPTYPE_SESSIONID   14 /* Assign Session ID */\n\n/* -- AVP - Call serial number */\n#define PPPOL2TP_AVPTYPE_CALLSERIALNUMBER   15 /* Call Serial Number */\n\n/* -- AVP - Framing type */\n#define PPPOL2TP_AVPTYPE_FRAMINGTYPE         19 /* Framing Type */\n#define PPPOL2TP_FRAMINGTYPE         0x00000001 /* Sync framing */\n\n/* -- AVP - TX Connect Speed */\n#define PPPOL2TP_AVPTYPE_TXCONNECTSPEED      24 /* TX Connect Speed */\n#define PPPOL2TP_TXCONNECTSPEED       100000000 /* Connect speed: 100 Mbits/s */\n\n/* L2TP Session state */\n#define PPPOL2TP_STATE_INITIAL     0\n#define PPPOL2TP_STATE_SCCRQ_SENT  1\n#define PPPOL2TP_STATE_ICRQ_SENT   2\n#define PPPOL2TP_STATE_ICCN_SENT   3\n#define PPPOL2TP_STATE_DATA        4\n\n#define PPPOL2TP_OUTPUT_DATA_HEADER_LEN   6 /* Our data header len */\n\n/*\n * PPPoL2TP interface control block.\n */\ntypedef struct pppol2tp_pcb_s pppol2tp_pcb;\nstruct pppol2tp_pcb_s {\n  ppp_pcb *ppp;                /* PPP PCB */\n  u8_t phase;                  /* L2TP phase */\n  struct udp_pcb *udp;         /* UDP L2TP Socket */\n  struct netif *netif;         /* Output interface, used as a default route */\n  ip_addr_t remote_ip;         /* LNS IP Address */\n  u16_t remote_port;           /* LNS port */\n#if PPPOL2TP_AUTH_SUPPORT\n  const u8_t *secret;          /* Secret string */\n  u8_t secret_len;             /* Secret string length */\n  u8_t secret_rv[16];          /* Random vector */\n  u8_t challenge_hash[16];     /* Challenge response */\n  u8_t send_challenge;         /* Boolean whether the next sent packet should contains a challenge response */\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n\n  u16_t tunnel_port;           /* Tunnel port */\n  u16_t our_ns;                /* NS to peer */\n  u16_t peer_nr;               /* NR from peer */\n  u16_t peer_ns;               /* NS from peer */\n  u16_t source_tunnel_id;      /* Tunnel ID assigned by peer */\n  u16_t remote_tunnel_id;      /* Tunnel ID assigned to peer */\n  u16_t source_session_id;     /* Session ID assigned by peer */\n  u16_t remote_session_id;     /* Session ID assigned to peer */\n\n  u8_t sccrq_retried;          /* number of SCCRQ retries already done */\n  u8_t icrq_retried;           /* number of ICRQ retries already done */\n  u8_t iccn_retried;           /* number of ICCN retries already done */\n};\n\n\n/* Create a new L2TP session. */\nppp_pcb *pppol2tp_create(struct netif *pppif,\n       struct netif *netif, const ip_addr_t *ipaddr, u16_t port,\n       const u8_t *secret, u8_t secret_len,\n       ppp_link_status_cb_fn link_status_cb, void *ctx_cb);\n\n#endif /* PPPOL2TP_H */\n#endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/pppos.h",
    "content": "/**\n * @file\n * Network Point to Point Protocol over Serial header file.\n *\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPPOS_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifndef PPPOS_H\n#define PPPOS_H\n\n#include \"lwip/sys.h\"\n\n#include \"ppp.h\"\n#include \"vj.h\"\n\n/* PPP packet parser states.  Current state indicates operation yet to be\n * completed. */\nenum {\n  PDIDLE = 0,  /* Idle state - waiting. */\n  PDSTART,     /* Process start flag. */\n  PDADDRESS,   /* Process address field. */\n  PDCONTROL,   /* Process control field. */\n  PDPROTOCOL1, /* Process protocol field 1. */\n  PDPROTOCOL2, /* Process protocol field 2. */\n  PDDATA       /* Process data byte. */\n};\n\n/* PPPoS serial output callback function prototype */\ntypedef u32_t (*pppos_output_cb_fn)(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx);\n\n/*\n * Extended asyncmap - allows any character to be escaped.\n */\ntypedef u8_t ext_accm[32];\n\n/*\n * PPPoS interface control block.\n */\ntypedef struct pppos_pcb_s pppos_pcb;\nstruct pppos_pcb_s {\n  /* -- below are data that will NOT be cleared between two sessions */\n  ppp_pcb *ppp;                    /* PPP PCB */\n  pppos_output_cb_fn output_cb;    /* PPP serial output callback */\n\n  /* -- below are data that will be cleared between two sessions\n   *\n   * last_xmit must be the first member of cleared members, because it is\n   * used to know which part must not be cleared.\n   */\n  u32_t last_xmit;                 /* Time of last transmission. */\n  ext_accm out_accm;               /* Async-Ctl-Char-Map for output. */\n\n  /* flags */\n  unsigned int open            :1; /* Set if PPPoS is open */\n  unsigned int pcomp           :1; /* Does peer accept protocol compression? */\n  unsigned int accomp          :1; /* Does peer accept addr/ctl compression? */\n\n  /* PPPoS rx */\n  ext_accm in_accm;                /* Async-Ctl-Char-Map for input. */\n  struct pbuf *in_head, *in_tail;  /* The input packet. */\n  u16_t in_protocol;               /* The input protocol code. */\n  u16_t in_fcs;                    /* Input Frame Check Sequence value. */\n  u8_t in_state;                   /* The input process state. */\n  u8_t in_escaped;                 /* Escape next character. */\n};\n\n/* Create a new PPPoS session. */\nppp_pcb *pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb,\n       ppp_link_status_cb_fn link_status_cb, void *ctx_cb);\n\n#if !NO_SYS && !PPP_INPROC_IRQ_SAFE\n/* Pass received raw characters to PPPoS to be decoded through lwIP TCPIP thread. */\nerr_t pppos_input_tcpip(ppp_pcb *ppp, u8_t *s, int l);\n#endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */\n\n/* PPP over Serial: this is the input function to be called for received data. */\nvoid pppos_input(ppp_pcb *ppp, u8_t* data, int len);\n\n\n/*\n * Functions called from lwIP\n * DO NOT CALL FROM lwIP USER APPLICATION.\n */\n#if !NO_SYS && !PPP_INPROC_IRQ_SAFE\nerr_t pppos_input_sys(struct pbuf *p, struct netif *inp);\n#endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */\n\n#endif /* PPPOS_H */\n#endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/upap.h",
    "content": "/*\n * upap.h - User/Password Authentication Protocol definitions.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: upap.h,v 1.8 2002/12/04 23:03:33 paulus Exp $\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#ifndef UPAP_H\n#define UPAP_H\n\n#include \"ppp.h\"\n\n/*\n * Packet header = Code, id, length.\n */\n#define UPAP_HEADERLEN    4\n\n\n/*\n * UPAP codes.\n */\n#define UPAP_AUTHREQ    1    /* Authenticate-Request */\n#define UPAP_AUTHACK    2    /* Authenticate-Ack */\n#define UPAP_AUTHNAK    3    /* Authenticate-Nak */\n\n\n/*\n * Client states.\n */\n#define UPAPCS_INITIAL    0    /* Connection down */\n#define UPAPCS_CLOSED    1    /* Connection up, haven't requested auth */\n#define UPAPCS_PENDING    2    /* Connection down, have requested auth */\n#define UPAPCS_AUTHREQ    3    /* We've sent an Authenticate-Request */\n#define UPAPCS_OPEN    4    /* We've received an Ack */\n#define UPAPCS_BADAUTH    5    /* We've received a Nak */\n\n/*\n * Server states.\n */\n#define UPAPSS_INITIAL    0    /* Connection down */\n#define UPAPSS_CLOSED    1    /* Connection up, haven't requested auth */\n#define UPAPSS_PENDING    2    /* Connection down, have requested auth */\n#define UPAPSS_LISTEN    3    /* Listening for an Authenticate */\n#define UPAPSS_OPEN    4    /* We've sent an Ack */\n#define UPAPSS_BADAUTH    5    /* We've sent a Nak */\n\n\n/*\n * Timeouts.\n */\n#if 0 /* moved to ppp_opts.h */\n#define UPAP_DEFTIMEOUT    3    /* Timeout (seconds) for retransmitting req */\n#define UPAP_DEFREQTIME    30    /* Time to wait for auth-req from peer */\n#endif /* moved to ppp_opts.h */\n\n/*\n * Each interface is described by upap structure.\n */\n#if PAP_SUPPORT\ntypedef struct upap_state {\n    const char *us_user;    /* User */\n    u8_t us_userlen;        /* User length */\n    const char *us_passwd;    /* Password */\n    u8_t us_passwdlen;        /* Password length */\n    u8_t us_clientstate;    /* Client state */\n#if PPP_SERVER\n    u8_t us_serverstate;    /* Server state */\n#endif /* PPP_SERVER */\n    u8_t us_id;                /* Current id */\n    u8_t us_transmits;        /* Number of auth-reqs sent */\n} upap_state;\n#endif /* PAP_SUPPORT */\n\n\nvoid upap_authwithpeer(ppp_pcb *pcb, const char *user, const char *password);\n#if PPP_SERVER\nvoid upap_authpeer(ppp_pcb *pcb);\n#endif /* PPP_SERVER */\n\nextern const struct protent pap_protent;\n\n#endif /* UPAP_H */\n#endif /* PPP_SUPPORT && PAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/ppp/vj.h",
    "content": "/*\n * Definitions for tcp compression routines.\n *\n * $Id: vj.h,v 1.7 2010/02/22 17:52:09 goldsimon Exp $\n *\n * Copyright (c) 1989 Regents of the University of California.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms are permitted\n * provided that the above copyright notice and this paragraph are\n * duplicated in all such forms and that any documentation,\n * advertising materials, and other materials related to such\n * distribution and use acknowledge that the software was developed\n * by the University of California, Berkeley.  The name of the\n * University may not be used to endorse or promote products derived\n * from this software without specific prior written permission.\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\n * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n *\n * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989:\n * - Initial distribution.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && VJ_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#ifndef VJ_H\n#define VJ_H\n\n#include \"lwip/ip.h\"\n#include \"lwip/priv/tcp_priv.h\"\n\n#define MAX_SLOTS 16 /* must be > 2 and < 256 */\n#define MAX_HDR   128\n\n/*\n * Compressed packet format:\n *\n * The first octet contains the packet type (top 3 bits), TCP\n * 'push' bit, and flags that indicate which of the 4 TCP sequence\n * numbers have changed (bottom 5 bits).  The next octet is a\n * conversation number that associates a saved IP/TCP header with\n * the compressed packet.  The next two octets are the TCP checksum\n * from the original datagram.  The next 0 to 15 octets are\n * sequence number changes, one change per bit set in the header\n * (there may be no changes and there are two special cases where\n * the receiver implicitly knows what changed -- see below).\n *\n * There are 5 numbers which can change (they are always inserted\n * in the following order): TCP urgent pointer, window,\n * acknowlegement, sequence number and IP ID.  (The urgent pointer\n * is different from the others in that its value is sent, not the\n * change in value.)  Since typical use of SLIP links is biased\n * toward small packets (see comments on MTU/MSS below), changes\n * use a variable length coding with one octet for numbers in the\n * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the\n * range 256 - 65535 or 0.  (If the change in sequence number or\n * ack is more than 65535, an uncompressed packet is sent.)\n */\n\n/*\n * Packet types (must not conflict with IP protocol version)\n *\n * The top nibble of the first octet is the packet type.  There are\n * three possible types: IP (not proto TCP or tcp with one of the\n * control flags set); uncompressed TCP (a normal IP/TCP packet but\n * with the 8-bit protocol field replaced by an 8-bit connection id --\n * this type of packet syncs the sender & receiver); and compressed\n * TCP (described above).\n *\n * LSB of 4-bit field is TCP \"PUSH\" bit (a worthless anachronism) and\n * is logically part of the 4-bit \"changes\" field that follows.  Top\n * three bits are actual packet type.  For backward compatibility\n * and in the interest of conserving bits, numbers are chosen so the\n * IP protocol version number (4) which normally appears in this nibble\n * means \"IP packet\".\n */\n\n/* packet types */\n#define TYPE_IP               0x40\n#define TYPE_UNCOMPRESSED_TCP 0x70\n#define TYPE_COMPRESSED_TCP   0x80\n#define TYPE_ERROR            0x00\n\n/* Bits in first octet of compressed packet */\n#define NEW_C 0x40 /* flag bits for what changed in a packet */\n#define NEW_I 0x20\n#define NEW_S 0x08\n#define NEW_A 0x04\n#define NEW_W 0x02\n#define NEW_U 0x01\n\n/* reserved, special-case values of above */\n#define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */\n#define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */\n#define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U)\n\n#define TCP_PUSH_BIT 0x10\n\n\n/*\n * \"state\" data for each active tcp conversation on the wire.  This is\n * basically a copy of the entire IP/TCP header from the last packet\n * we saw from the conversation together with a small identifier\n * the transmit & receive ends of the line use to locate saved header.\n */\nstruct cstate {\n  struct cstate *cs_next; /* next most recently used state (xmit only) */\n  u16_t cs_hlen;        /* size of hdr (receive only) */\n  u8_t cs_id;           /* connection # associated with this state */\n  u8_t cs_filler;\n  union {\n    char csu_hdr[MAX_HDR];\n    struct ip_hdr csu_ip;     /* ip/tcp hdr from most recent packet */\n  } vjcs_u;\n};\n#define cs_ip vjcs_u.csu_ip\n#define cs_hdr vjcs_u.csu_hdr\n\n\nstruct vjstat {\n  u32_t vjs_packets;        /* outbound packets */\n  u32_t vjs_compressed;     /* outbound compressed packets */\n  u32_t vjs_searches;       /* searches for connection state */\n  u32_t vjs_misses;         /* times couldn't find conn. state */\n  u32_t vjs_uncompressedin; /* inbound uncompressed packets */\n  u32_t vjs_compressedin;   /* inbound compressed packets */\n  u32_t vjs_errorin;        /* inbound unknown type packets */\n  u32_t vjs_tossed;         /* inbound packets tossed because of error */\n};\n\n/*\n * all the state data for one serial line (we need one of these per line).\n */\nstruct vjcompress {\n  struct cstate *last_cs;          /* most recently used tstate */\n  u8_t last_recv;                /* last rcvd conn. id */\n  u8_t last_xmit;                /* last sent conn. id */\n  u16_t flags;\n  u8_t maxSlotIndex;\n  u8_t compressSlot;             /* Flag indicating OK to compress slot ID. */\n#if LINK_STATS\n  struct vjstat stats;\n#endif\n  struct cstate tstate[MAX_SLOTS]; /* xmit connection states */\n  struct cstate rstate[MAX_SLOTS]; /* receive connection states */\n};\n\n/* flag values */\n#define VJF_TOSS 1U /* tossing rcvd frames because of input err */\n\nextern void  vj_compress_init    (struct vjcompress *comp);\nextern u8_t  vj_compress_tcp     (struct vjcompress *comp, struct pbuf **pb);\nextern void  vj_uncompress_err   (struct vjcompress *comp);\nextern int   vj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp);\nextern int   vj_uncompress_tcp   (struct pbuf **nb, struct vjcompress *comp);\n\n#endif /* VJ_H */\n\n#endif /* PPP_SUPPORT && VJ_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/netif/slipif.h",
    "content": "/**\n * @file\n *\n * SLIP netif API\n */\n\n/*\n * Copyright (c) 2001, Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the Institute nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef LWIP_HDR_NETIF_SLIPIF_H\n#define LWIP_HDR_NETIF_SLIPIF_H\n\n#include \"lwip/opt.h\"\n#include \"lwip/netif.h\"\n\n/** Set this to 1 to start a thread that blocks reading on the serial line\n * (using sio_read()).\n */\n#ifndef SLIP_USE_RX_THREAD\n#define SLIP_USE_RX_THREAD !NO_SYS\n#endif\n\n/** Set this to 1 to enable functions to pass in RX bytes from ISR context.\n * If enabled, slipif_received_byte[s]() process incoming bytes and put assembled\n * packets on a queue, which is fed into lwIP from slipif_poll().\n * If disabled, slipif_poll() polls the serial line (using sio_tryread()).\n */\n#ifndef SLIP_RX_FROM_ISR\n#define SLIP_RX_FROM_ISR 0\n#endif\n\n/** Set this to 1 (default for SLIP_RX_FROM_ISR) to queue incoming packets\n * received by slipif_received_byte[s]() as long as PBUF_POOL pbufs are available.\n * If disabled, packets will be dropped if more than one packet is received.\n */\n#ifndef SLIP_RX_QUEUE\n#define SLIP_RX_QUEUE SLIP_RX_FROM_ISR\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nerr_t slipif_init(struct netif * netif);\nvoid slipif_poll(struct netif *netif);\n#if SLIP_RX_FROM_ISR\nvoid slipif_process_rxqueue(struct netif *netif);\nvoid slipif_received_byte(struct netif *netif, u8_t data);\nvoid slipif_received_bytes(struct netif *netif, u8_t *data, u8_t len);\n#endif /* SLIP_RX_FROM_ISR */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* LWIP_HDR_NETIF_SLIPIF_H */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/posix/errno.h",
    "content": "/**\n * @file\n * This file is a posix wrapper for lwip/errno.h.\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"lwip/errno.h\"\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/posix/netdb.h",
    "content": "/**\n * @file\n * This file is a posix wrapper for lwip/netdb.h.\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"lwip/netdb.h\"\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/include/posix/sys/socket.h",
    "content": "/**\n * @file\n * This file is a posix wrapper for lwip/sockets.h.\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"lwip/sockets.h\"\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/FILES",
    "content": "This directory contains generic network interface device drivers that\ndo not contain any hardware or architecture specific code. The files\nare:\n\nethernet.c\n          Shared code for Ethernet based interfaces.\n\nethernetif.c\n          An example of how an Ethernet device driver could look. This\n          file can be used as a \"skeleton\" for developing new Ethernet\n          network device drivers. It uses the etharp.c ARP code.\n\nlowpan6.c\n          A 6LoWPAN implementation as a netif.\n\nslipif.c\n          A generic implementation of the SLIP (Serial Line IP)\n          protocol. It requires a sio (serial I/O) module to work.\n\nppp/      Point-to-Point Protocol stack\n          The lwIP PPP support is based from pppd (http://ppp.samba.org) with\n          huge changes to match code size and memory requirements for embedded\n          devices. Please read /doc/ppp.txt and ppp/PPPD_FOLLOWUP for a detailed\n          explanation.\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ethernet.c",
    "content": "/**\n * @file\n * Ethernet common functions\n * \n * @defgroup ethernet Ethernet\n * @ingroup callbackstyle_api\n */\n\n/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * Copyright (c) 2003-2004 Leon Woestenberg <leon.woestenberg@axon.tv>\n * Copyright (c) 2003-2004 Axon Digital Design B.V., The Netherlands.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"lwip/opt.h\"\n\n#if LWIP_ARP || LWIP_ETHERNET\n\n#include \"netif/ethernet.h\"\n#include \"lwip/def.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/etharp.h\"\n#include \"lwip/ip.h\"\n#include \"lwip/snmp.h\"\n\n#include <string.h>\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPPOE_SUPPORT\n#include \"netif/ppp/pppoe.h\"\n#endif /* PPPOE_SUPPORT */\n\n#ifdef LWIP_HOOK_FILENAME\n#include LWIP_HOOK_FILENAME\n#endif\n\nconst struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}};\nconst struct eth_addr ethzero = {{0,0,0,0,0,0}};\n\n/**\n * @ingroup lwip_nosys\n * Process received ethernet frames. Using this function instead of directly\n * calling ip_input and passing ARP frames through etharp in ethernetif_input,\n * the ARP cache is protected from concurrent access.\\n\n * Don't call directly, pass to netif_add() and call netif->input().\n *\n * @param p the received packet, p->payload pointing to the ethernet header\n * @param netif the network interface on which the packet was received\n * \n * @see LWIP_HOOK_UNKNOWN_ETH_PROTOCOL\n * @see ETHARP_SUPPORT_VLAN\n * @see LWIP_HOOK_VLAN_CHECK\n */\nerr_t \nethernet_input(struct pbuf *p, struct netif *netif)\n{\n  struct eth_hdr* ethhdr;\n  u16_t type;\n#if LWIP_ARP || ETHARP_SUPPORT_VLAN || LWIP_IPV6\n  s16_t ip_hdr_offset = SIZEOF_ETH_HDR;\n#endif /* LWIP_ARP || ETHARP_SUPPORT_VLAN */\n\n  if (p->len <= SIZEOF_ETH_HDR) {\n    /* a packet with only an ethernet header (or less) is not valid for us */\n    ETHARP_STATS_INC(etharp.proterr);\n    ETHARP_STATS_INC(etharp.drop);\n    MIB2_STATS_NETIF_INC(netif, ifinerrors);\n    goto free_and_return;\n  }\n\n  /* points to packet payload, which starts with an Ethernet header */\n  ethhdr = (struct eth_hdr *)p->payload;\n  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE,\n    (\"ethernet_input: dest:%\"X8_F\":%\"X8_F\":%\"X8_F\":%\"X8_F\":%\"X8_F\":%\"X8_F\", src:%\"X8_F\":%\"X8_F\":%\"X8_F\":%\"X8_F\":%\"X8_F\":%\"X8_F\", type:%\"X16_F\"\\n\",\n     (unsigned)ethhdr->dest.addr[0], (unsigned)ethhdr->dest.addr[1], (unsigned)ethhdr->dest.addr[2],\n     (unsigned)ethhdr->dest.addr[3], (unsigned)ethhdr->dest.addr[4], (unsigned)ethhdr->dest.addr[5],\n     (unsigned)ethhdr->src.addr[0],  (unsigned)ethhdr->src.addr[1],  (unsigned)ethhdr->src.addr[2],\n     (unsigned)ethhdr->src.addr[3],  (unsigned)ethhdr->src.addr[4],  (unsigned)ethhdr->src.addr[5],\n     lwip_htons(ethhdr->type)));\n\n  type = ethhdr->type;\n#if ETHARP_SUPPORT_VLAN\n  if (type == PP_HTONS(ETHTYPE_VLAN)) {\n    struct eth_vlan_hdr *vlan = (struct eth_vlan_hdr*)(((char*)ethhdr) + SIZEOF_ETH_HDR);\n    if (p->len <= SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) {\n      /* a packet with only an ethernet/vlan header (or less) is not valid for us */\n      ETHARP_STATS_INC(etharp.proterr);\n      ETHARP_STATS_INC(etharp.drop);\n      MIB2_STATS_NETIF_INC(netif, ifinerrors);\n      goto free_and_return;\n    }\n#if defined(LWIP_HOOK_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK_FN) /* if not, allow all VLANs */\n#ifdef LWIP_HOOK_VLAN_CHECK\n    if (!LWIP_HOOK_VLAN_CHECK(netif, ethhdr, vlan)) {\n#elif defined(ETHARP_VLAN_CHECK_FN)\n    if (!ETHARP_VLAN_CHECK_FN(ethhdr, vlan)) {\n#elif defined(ETHARP_VLAN_CHECK)\n    if (VLAN_ID(vlan) != ETHARP_VLAN_CHECK) {\n#endif\n      /* silently ignore this packet: not for our VLAN */\n      pbuf_free(p);\n      return ERR_OK;\n    }\n#endif /* defined(LWIP_HOOK_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK) || defined(ETHARP_VLAN_CHECK_FN) */\n    type = vlan->tpid;\n    ip_hdr_offset = SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR;\n  }\n#endif /* ETHARP_SUPPORT_VLAN */\n\n#if LWIP_ARP_FILTER_NETIF\n  netif = LWIP_ARP_FILTER_NETIF_FN(p, netif, lwip_htons(type));\n#endif /* LWIP_ARP_FILTER_NETIF*/\n\n  if (ethhdr->dest.addr[0] & 1) {\n    /* this might be a multicast or broadcast packet */\n    if (ethhdr->dest.addr[0] == LL_IP4_MULTICAST_ADDR_0) {\n#if LWIP_IPV4\n      if ((ethhdr->dest.addr[1] == LL_IP4_MULTICAST_ADDR_1) &&\n          (ethhdr->dest.addr[2] == LL_IP4_MULTICAST_ADDR_2)) {\n        /* mark the pbuf as link-layer multicast */\n        p->flags |= PBUF_FLAG_LLMCAST;\n      }\n#endif /* LWIP_IPV4 */\n    }\n#if LWIP_IPV6\n    else if ((ethhdr->dest.addr[0] == LL_IP6_MULTICAST_ADDR_0) &&\n             (ethhdr->dest.addr[1] == LL_IP6_MULTICAST_ADDR_1)) {\n        /* mark the pbuf as link-layer multicast */\n        p->flags |= PBUF_FLAG_LLMCAST;\n    }\n#endif /* LWIP_IPV6 */\n    else if (eth_addr_cmp(&ethhdr->dest, &ethbroadcast)) {\n      /* mark the pbuf as link-layer broadcast */\n      p->flags |= PBUF_FLAG_LLBCAST;\n    }\n  }\n\n  switch (type) {\n#if LWIP_IPV4 && LWIP_ARP\n    /* IP packet? */\n    case PP_HTONS(ETHTYPE_IP):\n      if (!(netif->flags & NETIF_FLAG_ETHARP)) {\n        goto free_and_return;\n      }\n      /* skip Ethernet header */\n      if ((p->len < ip_hdr_offset) || pbuf_header(p, (s16_t)-ip_hdr_offset)) {\n        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,\n          (\"ethernet_input: IPv4 packet dropped, too short (%\"S16_F\"/%\"S16_F\")\\n\",\n          p->tot_len, ip_hdr_offset));\n        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"Can't move over header in packet\"));\n        goto free_and_return;\n      } else {\n        /* pass to IP layer */\n        ip4_input(p, netif);\n      }\n      break;\n\n    case PP_HTONS(ETHTYPE_ARP):\n      if (!(netif->flags & NETIF_FLAG_ETHARP)) {\n        goto free_and_return;\n      }\n      /* skip Ethernet header */\n      if ((p->len < ip_hdr_offset) || pbuf_header(p, (s16_t)-ip_hdr_offset)) {\n        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,\n          (\"ethernet_input: ARP response packet dropped, too short (%\"S16_F\"/%\"S16_F\")\\n\",\n          p->tot_len, ip_hdr_offset));\n        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE, (\"Can't move over header in packet\"));\n        ETHARP_STATS_INC(etharp.lenerr);\n        ETHARP_STATS_INC(etharp.drop);\n        goto free_and_return;\n      } else {\n        /* pass p to ARP module */\n        etharp_input(p, netif);\n      }\n      break;\n#endif /* LWIP_IPV4 && LWIP_ARP */\n#if PPPOE_SUPPORT\n    case PP_HTONS(ETHTYPE_PPPOEDISC): /* PPP Over Ethernet Discovery Stage */\n      pppoe_disc_input(netif, p);\n      break;\n\n    case PP_HTONS(ETHTYPE_PPPOE): /* PPP Over Ethernet Session Stage */\n      pppoe_data_input(netif, p);\n      break;\n#endif /* PPPOE_SUPPORT */\n\n#if LWIP_IPV6\n    case PP_HTONS(ETHTYPE_IPV6): /* IPv6 */\n      /* skip Ethernet header */\n      if ((p->len < ip_hdr_offset) || pbuf_header(p, (s16_t)-ip_hdr_offset)) {\n        LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_WARNING,\n          (\"ethernet_input: IPv6 packet dropped, too short (%\"S16_F\"/%\"S16_F\")\\n\",\n          p->tot_len, ip_hdr_offset));\n        goto free_and_return;\n      } else {\n        /* pass to IPv6 layer */\n        ip6_input(p, netif);\n      }\n      break;\n#endif /* LWIP_IPV6 */\n\n    default:\n#ifdef LWIP_HOOK_UNKNOWN_ETH_PROTOCOL\n      if(LWIP_HOOK_UNKNOWN_ETH_PROTOCOL(p, netif) == ERR_OK) {\n        break;\n      }\n#endif\n      ETHARP_STATS_INC(etharp.proterr);\n      ETHARP_STATS_INC(etharp.drop);\n      MIB2_STATS_NETIF_INC(netif, ifinunknownprotos);\n      goto free_and_return;\n  }\n\n  /* This means the pbuf is freed or consumed,\n     so the caller doesn't have to free it again */\n  return ERR_OK;\n\nfree_and_return:\n  pbuf_free(p);\n  return ERR_OK;\n}\n\n/**\n * @ingroup ethernet\n * Send an ethernet packet on the network using netif->linkoutput().\n * The ethernet header is filled in before sending.\n *\n * @see LWIP_HOOK_VLAN_SET\n *\n * @param netif the lwIP network interface on which to send the packet\n * @param p the packet to send. pbuf layer must be @ref PBUF_LINK.\n * @param src the source MAC address to be copied into the ethernet header\n * @param dst the destination MAC address to be copied into the ethernet header\n * @param eth_type ethernet type (@ref eth_type)\n * @return ERR_OK if the packet was sent, any other err_t on failure\n */\nerr_t\nethernet_output(struct netif* netif, struct pbuf* p,\n                const struct eth_addr* src, const struct eth_addr* dst,\n                u16_t eth_type)\n{\n  struct eth_hdr* ethhdr;\n  u16_t eth_type_be = lwip_htons(eth_type);\n\n#if ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET)\n  s32_t vlan_prio_vid = LWIP_HOOK_VLAN_SET(netif, p, src, dst, eth_type);\n  if (vlan_prio_vid >= 0) {\n    struct eth_vlan_hdr* vlanhdr;\n\n    LWIP_ASSERT(\"prio_vid must be <= 0xFFFF\", vlan_prio_vid <= 0xFFFF);\n\n    if (pbuf_header(p, SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR) != 0) {\n      goto pbuf_header_failed;\n    }\n    vlanhdr = (struct eth_vlan_hdr*)(((u8_t*)p->payload) + SIZEOF_ETH_HDR);\n    vlanhdr->tpid     = eth_type_be;\n    vlanhdr->prio_vid = lwip_htons((u16_t)vlan_prio_vid);\n\n    eth_type_be = PP_HTONS(ETHTYPE_VLAN);\n  } else\n#endif /* ETHARP_SUPPORT_VLAN && defined(LWIP_HOOK_VLAN_SET) */\n  {\n    if (pbuf_header(p, SIZEOF_ETH_HDR) != 0) {\n      goto pbuf_header_failed;\n    }\n  }\n\n  ethhdr = (struct eth_hdr*)p->payload;\n  ethhdr->type = eth_type_be;\n  ETHADDR32_COPY(&ethhdr->dest, dst);\n  ETHADDR16_COPY(&ethhdr->src,  src);\n\n  LWIP_ASSERT(\"netif->hwaddr_len must be 6 for ethernet_output!\",\n    (netif->hwaddr_len == ETH_HWADDR_LEN));\n  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE,\n    (\"ethernet_output: sending packet %p\\n\", (void *)p));\n\n  /* send the packet */\n  return netif->linkoutput(netif, p);\n\npbuf_header_failed:\n  LWIP_DEBUGF(ETHARP_DEBUG | LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,\n    (\"ethernet_output: could not allocate room for header.\\n\"));\n  LINK_STATS_INC(link.lenerr);\n  return ERR_BUF;\n}\n\n#endif /* LWIP_ARP || LWIP_ETHERNET */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ethernetif_origin.c",
    "content": "/**\n * @file\n * Ethernet Interface Skeleton\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n/*\n * This file is a skeleton for developing Ethernet network interface\n * drivers for lwIP. Add code to the low_level functions and do a\n * search-and-replace for the word \"ethernetif\" to replace it with\n * something that better describes your network interface.\n */\n\n#include \"lwip/opt.h\"\n\n#if 0 /* don't build, this is only a skeleton, see previous comment */\n\n#include \"lwip/def.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/snmp.h\"\n#include \"lwip/ethip6.h\"\n#include \"lwip/etharp.h\"\n#include \"netif/ppp/pppoe.h\"\n\n/* Define those to better describe your network interface. */\n#define IFNAME0 'e'\n#define IFNAME1 'n'\n\n/**\n * Helper struct to hold private data used to operate your ethernet interface.\n * Keeping the ethernet address of the MAC in this struct is not necessary\n * as it is already kept in the struct netif.\n * But this is only an example, anyway...\n */\nstruct ethernetif {\n  struct eth_addr *ethaddr;\n  /* Add whatever per-interface state that is needed here. */\n};\n\n/* Forward declarations. */\nstatic void  ethernetif_input(struct netif *netif);\n\n/**\n * In this function, the hardware should be initialized.\n * Called from ethernetif_init().\n *\n * @param netif the already initialized lwip network interface structure\n *        for this ethernetif\n */\nstatic void\nlow_level_init(struct netif *netif)\n{\n  struct ethernetif *ethernetif = netif->state;\n\n  /* set MAC hardware address length */\n  netif->hwaddr_len = ETHARP_HWADDR_LEN;\n\n  /* set MAC hardware address */\n  netif->hwaddr[0] = ;\n  ...\n  netif->hwaddr[5] = ;\n\n  /* maximum transfer unit */\n  netif->mtu = 1500;\n\n  /* device capabilities */\n  /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */\n  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;\n\n#if LWIP_IPV6 && LWIP_IPV6_MLD\n  /*\n   * For hardware/netifs that implement MAC filtering.\n   * All-nodes link-local is handled by default, so we must let the hardware know\n   * to allow multicast packets in.\n   * Should set mld_mac_filter previously. */\n  if (netif->mld_mac_filter != NULL) {\n    ip6_addr_t ip6_allnodes_ll;\n    ip6_addr_set_allnodes_linklocal(&ip6_allnodes_ll);\n    netif->mld_mac_filter(netif, &ip6_allnodes_ll, NETIF_ADD_MAC_FILTER);\n  }\n#endif /* LWIP_IPV6 && LWIP_IPV6_MLD */\n\n  /* Do whatever else is needed to initialize interface. */\n}\n\n/**\n * This function should do the actual transmission of the packet. The packet is\n * contained in the pbuf that is passed to the function. This pbuf\n * might be chained.\n *\n * @param netif the lwip network interface structure for this ethernetif\n * @param p the MAC packet to send (e.g. IP packet including MAC addresses and type)\n * @return ERR_OK if the packet could be sent\n *         an err_t value if the packet couldn't be sent\n *\n * @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to\n *       strange results. You might consider waiting for space in the DMA queue\n *       to become available since the stack doesn't retry to send a packet\n *       dropped because of memory failure (except for the TCP timers).\n */\n\nstatic err_t\nlow_level_output(struct netif *netif, struct pbuf *p)\n{\n  struct ethernetif *ethernetif = netif->state;\n  struct pbuf *q;\n\n  initiate transfer();\n\n#if ETH_PAD_SIZE\n  pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */\n#endif\n\n  for (q = p; q != NULL; q = q->next) {\n    /* Send the data from the pbuf to the interface, one pbuf at a\n       time. The size of the data in each pbuf is kept in the ->len\n       variable. */\n    send data from(q->payload, q->len);\n  }\n\n  signal that packet should be sent();\n\n  MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p->tot_len);\n  if (((u8_t*)p->payload)[0] & 1) {\n    /* broadcast or multicast packet*/\n    MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts);\n  } else {\n    /* unicast packet */\n    MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);\n  }\n  /* increase ifoutdiscards or ifouterrors on error */\n\n#if ETH_PAD_SIZE\n  pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */\n#endif\n\n  LINK_STATS_INC(link.xmit);\n\n  return ERR_OK;\n}\n\n/**\n * Should allocate a pbuf and transfer the bytes of the incoming\n * packet from the interface into the pbuf.\n *\n * @param netif the lwip network interface structure for this ethernetif\n * @return a pbuf filled with the received packet (including MAC header)\n *         NULL on memory error\n */\nstatic struct pbuf *\nlow_level_input(struct netif *netif)\n{\n  struct ethernetif *ethernetif = netif->state;\n  struct pbuf *p, *q;\n  u16_t len;\n\n  /* Obtain the size of the packet and put it into the \"len\"\n     variable. */\n  len = ;\n\n#if ETH_PAD_SIZE\n  len += ETH_PAD_SIZE; /* allow room for Ethernet padding */\n#endif\n\n  /* We allocate a pbuf chain of pbufs from the pool. */\n  p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);\n\n  if (p != NULL) {\n\n#if ETH_PAD_SIZE\n    pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */\n#endif\n\n    /* We iterate over the pbuf chain until we have read the entire\n     * packet into the pbuf. */\n    for (q = p; q != NULL; q = q->next) {\n      /* Read enough bytes to fill this pbuf in the chain. The\n       * available data in the pbuf is given by the q->len\n       * variable.\n       * This does not necessarily have to be a memcpy, you can also preallocate\n       * pbufs for a DMA-enabled MAC and after receiving truncate it to the\n       * actually received size. In this case, ensure the tot_len member of the\n       * pbuf is the sum of the chained pbuf len members.\n       */\n      read data into(q->payload, q->len);\n    }\n    acknowledge that packet has been read();\n\n    MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len);\n    if (((u8_t*)p->payload)[0] & 1) {\n      /* broadcast or multicast packet*/\n      MIB2_STATS_NETIF_INC(netif, ifinnucastpkts);\n    } else {\n      /* unicast packet*/\n      MIB2_STATS_NETIF_INC(netif, ifinucastpkts);\n    }\n#if ETH_PAD_SIZE\n    pbuf_header(p, ETH_PAD_SIZE); /* reclaim the padding word */\n#endif\n\n    LINK_STATS_INC(link.recv);\n  } else {\n    drop packet();\n    LINK_STATS_INC(link.memerr);\n    LINK_STATS_INC(link.drop);\n    MIB2_STATS_NETIF_INC(netif, ifindiscards);\n  }\n\n  return p;\n}\n\n/**\n * This function should be called when a packet is ready to be read\n * from the interface. It uses the function low_level_input() that\n * should handle the actual reception of bytes from the network\n * interface. Then the type of the received packet is determined and\n * the appropriate input function is called.\n *\n * @param netif the lwip network interface structure for this ethernetif\n */\nstatic void\nethernetif_input(struct netif *netif)\n{\n  struct ethernetif *ethernetif;\n  struct eth_hdr *ethhdr;\n  struct pbuf *p;\n\n  ethernetif = netif->state;\n\n  /* move received packet into a new pbuf */\n  p = low_level_input(netif);\n  /* if no packet could be read, silently ignore this */\n  if (p != NULL) {\n    /* pass all packets to ethernet_input, which decides what packets it supports */\n    if (netif->input(p, netif) != ERR_OK) {\n      LWIP_DEBUGF(NETIF_DEBUG, (\"ethernetif_input: IP input error\\n\"));\n      pbuf_free(p);\n      p = NULL;\n    }\n  }\n}\n\n/**\n * Should be called at the beginning of the program to set up the\n * network interface. It calls the function low_level_init() to do the\n * actual setup of the hardware.\n *\n * This function should be passed as a parameter to netif_add().\n *\n * @param netif the lwip network interface structure for this ethernetif\n * @return ERR_OK if the loopif is initialized\n *         ERR_MEM if private data couldn't be allocated\n *         any other err_t on error\n */\nerr_t\nethernetif_init(struct netif *netif)\n{\n  struct ethernetif *ethernetif;\n\n  LWIP_ASSERT(\"netif != NULL\", (netif != NULL));\n\n  ethernetif = mem_malloc(sizeof(struct ethernetif));\n  if (ethernetif == NULL) {\n    LWIP_DEBUGF(NETIF_DEBUG, (\"ethernetif_init: out of memory\\n\"));\n    return ERR_MEM;\n  }\n\n#if LWIP_NETIF_HOSTNAME\n  /* Initialize interface hostname */\n  netif->hostname = \"lwip\";\n#endif /* LWIP_NETIF_HOSTNAME */\n\n  /*\n   * Initialize the snmp variables and counters inside the struct netif.\n   * The last argument should be replaced with your link speed, in units\n   * of bits per second.\n   */\n  MIB2_INIT_NETIF(netif, snmp_ifType_ethernet_csmacd, LINK_SPEED_OF_YOUR_NETIF_IN_BPS);\n\n  netif->state = ethernetif;\n  netif->name[0] = IFNAME0;\n  netif->name[1] = IFNAME1;\n  /* We directly use etharp_output() here to save a function call.\n   * You can instead declare your own function an call etharp_output()\n   * from it if you have to do some checks before sending (e.g. if link\n   * is available...) */\n  netif->output = etharp_output;\n#if LWIP_IPV6\n  netif->output_ip6 = ethip6_output;\n#endif /* LWIP_IPV6 */\n  netif->linkoutput = low_level_output;\n\n  ethernetif->ethaddr = (struct eth_addr *)&(netif->hwaddr[0]);\n\n  /* initialize the hardware */\n  low_level_init(netif);\n\n  return ERR_OK;\n}\n\n#endif /* 0 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/lowpan6.c",
    "content": "/**\n  * @file\n *\n * 6LowPAN output for IPv6. Uses ND tables for link-layer addressing. Fragments packets to 6LowPAN units.\n */\n\n/*\n * Copyright (c) 2015 Inico Technologies Ltd.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Ivan Delamer <delamer@inicotech.com>\n *\n *\n * Please coordinate changes and requests with Ivan Delamer\n * <delamer@inicotech.com>\n */\n\n/**\n * @defgroup sixlowpan 6LowPAN netif\n * @ingroup addons\n * 6LowPAN netif implementation\n */\n\n#include \"netif/lowpan6.h\"\n\n#if LWIP_IPV6 && LWIP_6LOWPAN\n\n#include \"lwip/ip.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/ip_addr.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/nd6.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/tcpip.h\"\n#include \"lwip/snmp.h\"\n\n#include <string.h>\n\nstruct ieee_802154_addr {\n  u8_t addr_len;\n  u8_t addr[8];\n};\n\n/** This is a helper struct.\n */\nstruct lowpan6_reass_helper {\n  struct pbuf *pbuf;\n  struct lowpan6_reass_helper *next_packet;\n  u8_t timer;\n  struct ieee_802154_addr sender_addr;\n  u16_t datagram_size;\n  u16_t datagram_tag;\n};\n\nstatic struct lowpan6_reass_helper * reass_list;\n\n#if LWIP_6LOWPAN_NUM_CONTEXTS > 0\nstatic ip6_addr_t lowpan6_context[LWIP_6LOWPAN_NUM_CONTEXTS];\n#endif\n\nstatic u16_t ieee_802154_pan_id;\n\nstatic const struct ieee_802154_addr ieee_802154_broadcast = {2, {0xff, 0xff}};\n\n#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS\nstatic struct ieee_802154_addr short_mac_addr = {2, {0,0}};\n#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */\n\nstatic err_t dequeue_datagram(struct lowpan6_reass_helper *lrh);\n\n/**\n * Periodic timer for 6LowPAN functions:\n *\n * - Remove incomplete/old packets\n */\nvoid\nlowpan6_tmr(void)\n{\n  struct lowpan6_reass_helper *lrh, *lrh_temp;\n\n  lrh = reass_list;\n  while (lrh != NULL) {\n    lrh_temp = lrh->next_packet;\n    if ((--lrh->timer) == 0) {\n      dequeue_datagram(lrh);\n      pbuf_free(lrh->pbuf);\n      mem_free(lrh);\n    }\n    lrh = lrh_temp;\n  }\n}\n\n/**\n * Removes a datagram from the reassembly queue.\n **/\nstatic err_t\ndequeue_datagram(struct lowpan6_reass_helper *lrh)\n{\n  struct lowpan6_reass_helper *lrh_temp;\n\n  if (reass_list == lrh) {\n    reass_list = reass_list->next_packet;\n  } else {\n    lrh_temp = reass_list;\n    while (lrh_temp != NULL) {\n      if (lrh_temp->next_packet == lrh) {\n        lrh_temp->next_packet = lrh->next_packet;\n        break;\n      }\n      lrh_temp = lrh_temp->next_packet;\n    }\n  }\n\n  return ERR_OK;\n}\n\nstatic s8_t\nlowpan6_context_lookup(const ip6_addr_t *ip6addr)\n{\n  s8_t i;\n\n  for (i = 0; i < LWIP_6LOWPAN_NUM_CONTEXTS; i++) {\n    if (ip6_addr_netcmp(&lowpan6_context[i], ip6addr)) {\n      return i;\n    }\n  }\n\n  return -1;\n}\n\n/* Determine compression mode for unicast address. */\nstatic s8_t\nlowpan6_get_address_mode(const ip6_addr_t *ip6addr, const struct ieee_802154_addr *mac_addr)\n{\n  if (mac_addr->addr_len == 2) {\n    if ((ip6addr->addr[2] == (u32_t)PP_HTONL(0x000000ff)) &&\n      ((ip6addr->addr[3]  & PP_HTONL(0xffff0000)) == PP_NTOHL(0xfe000000))) {\n      if ((ip6addr->addr[3]  & PP_HTONL(0x0000ffff)) == lwip_ntohl((mac_addr->addr[0] << 8) | mac_addr->addr[1])) {\n        return 3;\n      }\n    }\n  } else if (mac_addr->addr_len == 8) {\n    if ((ip6addr->addr[2] == lwip_ntohl(((mac_addr->addr[0] ^ 2) << 24) | (mac_addr->addr[1] << 16) | mac_addr->addr[2] << 8 | mac_addr->addr[3])) &&\n      (ip6addr->addr[3] == lwip_ntohl((mac_addr->addr[4] << 24) | (mac_addr->addr[5] << 16) | mac_addr->addr[6] << 8 | mac_addr->addr[7]))) {\n      return 3;\n    }\n  }\n\n  if ((ip6addr->addr[2] == PP_HTONL(0x000000ffUL)) &&\n    ((ip6addr->addr[3]  & PP_HTONL(0xffff0000)) == PP_NTOHL(0xfe000000UL))) {\n    return 2;\n  }\n\n  return 1;\n}\n\n/* Determine compression mode for multicast address. */\nstatic s8_t\nlowpan6_get_address_mode_mc(const ip6_addr_t *ip6addr)\n{\n  if ((ip6addr->addr[0] == PP_HTONL(0xff020000)) &&\n      (ip6addr->addr[1] == 0) &&\n      (ip6addr->addr[2] == 0) &&\n      ((ip6addr->addr[3]  & PP_HTONL(0xffffff00)) == 0)) {\n    return 3;\n  } else if (((ip6addr->addr[0] & PP_HTONL(0xff00ffff)) == PP_HTONL(0xff000000)) &&\n              (ip6addr->addr[1] == 0)) {\n    if ((ip6addr->addr[2] == 0) &&\n        ((ip6addr->addr[3]  & PP_HTONL(0xff000000)) == 0)) {\n      return 2;\n    } else if ((ip6addr->addr[2]  & PP_HTONL(0xffffff00)) == 0) {\n      return 1;\n    }\n  }\n\n  return 0;\n}\n\n/*\n * Encapsulates data into IEEE 802.15.4 frames.\n * Fragments an IPv6 datagram into 6LowPAN units, which fit into IEEE 802.15.4 frames.\n * If configured, will compress IPv6 and or UDP headers.\n * */\nstatic err_t\nlowpan6_frag(struct netif *netif, struct pbuf *p, const struct ieee_802154_addr *src, const struct ieee_802154_addr *dst)\n{\n  struct pbuf * p_frag;\n  u16_t frag_len, remaining_len;\n  u8_t * buffer;\n  u8_t ieee_header_len;\n  u8_t lowpan6_header_len;\n  s8_t i;\n  static u8_t frame_seq_num;\n  static u16_t datagram_tag;\n  u16_t datagram_offset;\n  err_t err = ERR_IF;\n\n  /* We'll use a dedicated pbuf for building 6LowPAN fragments. */\n  p_frag = pbuf_alloc(PBUF_RAW, 127, PBUF_RAM);\n  if (p_frag == NULL) {\n    MIB2_STATS_NETIF_INC(netif, ifoutdiscards);\n    return ERR_MEM;\n  }\n\n  /* Write IEEE 802.15.4 header. */\n  buffer  = (u8_t*)p_frag->payload;\n  ieee_header_len = 0;\n  if (dst == &ieee_802154_broadcast) {\n    buffer[ieee_header_len++] = 0x01; /* data packet, no ack required. */\n  } else {\n    buffer[ieee_header_len++] = 0x21; /* data packet, ack required. */\n  }\n  buffer[ieee_header_len] = (0x00 << 4); /* 2003 frame version */\n  buffer[ieee_header_len] |= (dst->addr_len == 2) ? (0x02 << 2) : (0x03 << 2); /* destination addressing mode  */\n  buffer[ieee_header_len] |= (src->addr_len == 2) ? (0x02 << 6) : (0x03 << 6); /* source addressing mode */\n  ieee_header_len++;\n  buffer[ieee_header_len++] = frame_seq_num++;\n\n  buffer[ieee_header_len++] = ieee_802154_pan_id & 0xff; /* pan id */\n  buffer[ieee_header_len++] = (ieee_802154_pan_id >> 8) & 0xff; /* pan id */\n  i = dst->addr_len;\n  while (i-- > 0) {\n    buffer[ieee_header_len++] = dst->addr[i];\n  }\n\n  buffer[ieee_header_len++] = ieee_802154_pan_id & 0xff; /* pan id */\n  buffer[ieee_header_len++] = (ieee_802154_pan_id >> 8) & 0xff; /* pan id */\n  i = src->addr_len;\n  while (i-- > 0) {\n    buffer[ieee_header_len++] = src->addr[i];\n  }\n\n#if LWIP_6LOWPAN_IPHC\n  /* Perform 6LowPAN IPv6 header compression according to RFC 6282 */\n  {\n    struct ip6_hdr *ip6hdr;\n\n    /* Point to ip6 header and align copies of src/dest addresses. */\n    ip6hdr = (struct ip6_hdr *)p->payload;\n    ip_addr_copy_from_ip6(ip_data.current_iphdr_dest, ip6hdr->dest);\n    ip_addr_copy_from_ip6(ip_data.current_iphdr_src, ip6hdr->src);\n\n    /* Basic length of 6LowPAN header, set dispatch and clear fields. */\n    lowpan6_header_len = 2;\n    buffer[ieee_header_len] = 0x60;\n    buffer[ieee_header_len + 1] = 0;\n\n    /* Determine whether there will be a Context Identifier Extension byte or not.\n    * If so, set it already. */\n#if LWIP_6LOWPAN_NUM_CONTEXTS > 0\n    buffer[ieee_header_len + 2] = 0;\n\n    i = lowpan6_context_lookup(ip_2_ip6(&ip_data.current_iphdr_src));\n    if (i >= 0) {\n      /* Stateful source address compression. */\n      buffer[ieee_header_len + 1] |= 0x40;\n      buffer[ieee_header_len + 2] |= (i & 0x0f) << 4;\n    }\n\n    i = lowpan6_context_lookup(ip_2_ip6(&ip_data.current_iphdr_dest));\n    if (i >= 0) {\n      /* Stateful destination address compression. */\n      buffer[ieee_header_len + 1] |= 0x04;\n      buffer[ieee_header_len + 2] |= i & 0x0f;\n    }\n\n    if (buffer[ieee_header_len + 2] != 0x00) {\n      /* Context identifier extension byte is appended. */\n      buffer[ieee_header_len + 1] |= 0x80;\n      lowpan6_header_len++;\n    }\n#endif /* LWIP_6LOWPAN_NUM_CONTEXTS > 0 */\n\n    /* Determine TF field: Traffic Class, Flow Label */\n    if (IP6H_FL(ip6hdr) == 0) {\n      /* Flow label is elided. */\n      buffer[ieee_header_len] |= 0x10;\n      if (IP6H_TC(ip6hdr) == 0) {\n        /* Traffic class (ECN+DSCP) elided too. */\n        buffer[ieee_header_len] |= 0x08;\n      } else {\n        /* Traffic class (ECN+DSCP) appended. */\n        buffer[ieee_header_len + lowpan6_header_len++] = IP6H_TC(ip6hdr);\n      }\n    } else {\n      if (((IP6H_TC(ip6hdr) & 0x3f) == 0)) {\n        /* DSCP portion of Traffic Class is elided, ECN and FL are appended (3 bytes) */\n        buffer[ieee_header_len] |= 0x08;\n\n        buffer[ieee_header_len + lowpan6_header_len] = IP6H_TC(ip6hdr) & 0xc0;\n        buffer[ieee_header_len + lowpan6_header_len++] |= (IP6H_FL(ip6hdr) >> 16) & 0x0f;\n        buffer[ieee_header_len + lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 8) & 0xff;\n        buffer[ieee_header_len + lowpan6_header_len++] = IP6H_FL(ip6hdr) & 0xff;\n      } else {\n        /* Traffic class and flow label are appended (4 bytes) */\n        buffer[ieee_header_len + lowpan6_header_len++] = IP6H_TC(ip6hdr);\n        buffer[ieee_header_len + lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 16) & 0x0f;\n        buffer[ieee_header_len + lowpan6_header_len++] = (IP6H_FL(ip6hdr) >> 8) & 0xff;\n        buffer[ieee_header_len + lowpan6_header_len++] = IP6H_FL(ip6hdr) & 0xff;\n      }\n    }\n\n    /* Compress NH?\n    * Only if UDP for now. @todo support other NH compression. */\n    if (IP6H_NEXTH(ip6hdr) == IP6_NEXTH_UDP) {\n      buffer[ieee_header_len] |= 0x04;\n    } else {\n      /* append nexth. */\n      buffer[ieee_header_len + lowpan6_header_len++] = IP6H_NEXTH(ip6hdr);\n    }\n\n    /* Compress hop limit? */\n    if (IP6H_HOPLIM(ip6hdr) == 255) {\n      buffer[ieee_header_len] |= 0x03;\n    } else if (IP6H_HOPLIM(ip6hdr) == 64) {\n      buffer[ieee_header_len] |= 0x02;\n    } else if (IP6H_HOPLIM(ip6hdr) == 1) {\n      buffer[ieee_header_len] |= 0x01;\n    } else {\n      /* append hop limit */\n      buffer[ieee_header_len + lowpan6_header_len++] = IP6H_HOPLIM(ip6hdr);\n    }\n\n    /* Compress source address */\n    if (((buffer[ieee_header_len + 1] & 0x40) != 0) ||\n        (ip6_addr_islinklocal(ip_2_ip6(&ip_data.current_iphdr_src)))) {\n      /* Context-based or link-local source address compression. */\n      i = lowpan6_get_address_mode(ip_2_ip6(&ip_data.current_iphdr_src), src);\n      buffer[ieee_header_len + 1] |= (i & 0x03) << 4;\n      if (i == 1) {\n        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 16, 8);\n        lowpan6_header_len += 8;\n      } else if (i == 2) {\n        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 22, 2);\n        lowpan6_header_len += 2;\n      }\n    } else if (ip6_addr_isany(ip_2_ip6(&ip_data.current_iphdr_src))) {\n      /* Special case: mark SAC and leave SAM=0 */\n      buffer[ieee_header_len + 1] |= 0x40;\n    } else {\n      /* Append full address. */\n      MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 8, 16);\n      lowpan6_header_len += 16;\n    }\n\n    /* Compress destination address */\n    if (ip6_addr_ismulticast(ip_2_ip6(&ip_data.current_iphdr_dest))) {\n      /* @todo support stateful multicast address compression */\n\n      buffer[ieee_header_len + 1] |= 0x08;\n\n      i = lowpan6_get_address_mode_mc(ip_2_ip6(&ip_data.current_iphdr_dest));\n      buffer[ieee_header_len + 1] |= i & 0x03;\n      if (i == 0) {\n        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 24, 16);\n        lowpan6_header_len += 16;\n      } else if (i == 1) {\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[25];\n        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 35, 5);\n        lowpan6_header_len += 5;\n      } else if (i == 2) {\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[25];\n        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 37, 3);\n        lowpan6_header_len += 3;\n      } else if (i == 3) {\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[39];\n      }\n    } else if (((buffer[ieee_header_len + 1] & 0x04) != 0) ||\n               (ip6_addr_islinklocal(ip_2_ip6(&ip_data.current_iphdr_dest)))) {\n      /* Context-based or link-local destination address compression. */\n      i = lowpan6_get_address_mode(ip_2_ip6(&ip_data.current_iphdr_dest), dst);\n      buffer[ieee_header_len + 1] |= i & 0x03;\n      if (i == 1) {\n        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 32, 8);\n        lowpan6_header_len += 8;\n      } else if (i == 2) {\n        MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 38, 2);\n        lowpan6_header_len += 2;\n      }\n    } else {\n      /* Append full address. */\n      MEMCPY(buffer + ieee_header_len + lowpan6_header_len, (u8_t*)p->payload + 24, 16);\n      lowpan6_header_len += 16;\n    }\n\n    /* Move to payload. */\n    pbuf_header(p, -IP6_HLEN);\n\n    /* Compress UDP header? */\n    if (IP6H_NEXTH(ip6hdr) == IP6_NEXTH_UDP) {\n      /* @todo support optional checksum compression */\n\n      buffer[ieee_header_len + lowpan6_header_len] = 0xf0;\n\n      /* determine port compression mode. */\n      if ((((u8_t *)p->payload)[0] == 0xf0) && ((((u8_t *)p->payload)[1] & 0xf0) == 0xb0) &&\n          (((u8_t *)p->payload)[2] == 0xf0) && ((((u8_t *)p->payload)[3] & 0xf0) == 0xb0)) {\n        /* Compress source and dest ports. */\n        buffer[ieee_header_len + lowpan6_header_len++] |= 0x03;\n        buffer[ieee_header_len + lowpan6_header_len++] = ((((u8_t *)p->payload)[1] & 0x0f) << 4) | (((u8_t *)p->payload)[3] & 0x0f);\n      } else if (((u8_t *)p->payload)[0] == 0xf0) {\n        /* Compress source port. */\n        buffer[ieee_header_len + lowpan6_header_len++] |= 0x02;\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[1];\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[2];\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[3];\n      } else if (((u8_t *)p->payload)[2] == 0xf0) {\n        /* Compress dest port. */\n        buffer[ieee_header_len + lowpan6_header_len++] |= 0x01;\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[0];\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[1];\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[3];\n      } else {\n        /* append full ports. */\n        lowpan6_header_len++;\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[0];\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[1];\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[2];\n        buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[3];\n      }\n\n      /* elide length and copy checksum */\n      buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[6];\n      buffer[ieee_header_len + lowpan6_header_len++] = ((u8_t *)p->payload)[7];\n\n      pbuf_header(p, -UDP_HLEN);\n    }\n  }\n\n#else /* LWIP_6LOWPAN_HC */\n  /* Send uncompressed IPv6 header with appropriate dispatch byte. */\n  lowpan6_header_len = 1;\n  buffer[ieee_header_len] = 0x41; /* IPv6 dispatch */\n#endif /* LWIP_6LOWPAN_HC */\n\n  /* Calculate remaining packet length */\n  remaining_len = p->tot_len;\n\n  if (remaining_len > 0x7FF) {\n    MIB2_STATS_NETIF_INC(netif, ifoutdiscards);\n    /* datagram_size must fit into 11 bit */\n    pbuf_free(p_frag);\n    return ERR_VAL;\n  }\n\n  /* Fragment, or 1 packet? */\n  if (remaining_len > (127 - ieee_header_len - lowpan6_header_len - 3)) { /* 127 - header - 1 byte dispatch - 2 bytes CRC */\n    /* We must move the 6LowPAN header to make room for the FRAG header. */\n    i = lowpan6_header_len;\n    while (i-- != 0) {\n      buffer[ieee_header_len + i + 4] = buffer[ieee_header_len + i];\n    }\n\n    /* Now we need to fragment the packet. FRAG1 header first */\n    buffer[ieee_header_len] = 0xc0 | (((p->tot_len + lowpan6_header_len) >> 8) & 0x7);\n    buffer[ieee_header_len + 1] = (p->tot_len + lowpan6_header_len) & 0xff;\n\n    datagram_tag++;\n    buffer[ieee_header_len + 2] = datagram_tag & 0xff;\n    buffer[ieee_header_len + 3] = (datagram_tag >> 8) & 0xff;\n\n    /* Fragment follows. */\n    frag_len = (127 - ieee_header_len - 4 - 2) & 0xf8;\n\n    pbuf_copy_partial(p, buffer + ieee_header_len + lowpan6_header_len + 4, frag_len - lowpan6_header_len, 0);\n    remaining_len -= frag_len - lowpan6_header_len;\n    datagram_offset = frag_len;\n\n    /* 2 bytes CRC */\n#if LWIP_6LOWPAN_HW_CRC\n    /* Leave blank, will be filled by HW. */\n#else /* LWIP_6LOWPAN_HW_CRC */\n    /* @todo calculate CRC */\n#endif /* LWIP_6LOWPAN_HW_CRC */\n\n    /* Calculate frame length */\n    p_frag->len = p_frag->tot_len = ieee_header_len + 4 + frag_len + 2; /* add 2 dummy bytes for crc*/\n\n    /* send the packet */\n    MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len);\n    LWIP_DEBUGF(LOWPAN6_DEBUG | LWIP_DBG_TRACE, (\"lowpan6_send: sending packet %p\\n\", (void *)p));\n    err = netif->linkoutput(netif, p_frag);\n\n    while ((remaining_len > 0) && (err == ERR_OK)) {\n      /* new frame, new seq num for ACK */\n      buffer[2] = frame_seq_num++;\n\n      buffer[ieee_header_len] |= 0x20; /* Change FRAG1 to FRAGN */\n\n      buffer[ieee_header_len + 4] = (u8_t)(datagram_offset >> 3); /* datagram offset in FRAGN header (datagram_offset is max. 11 bit) */\n\n      frag_len = (127 - ieee_header_len - 5 - 2) & 0xf8;\n      if (frag_len > remaining_len) {\n        frag_len = remaining_len;\n      }\n\n      pbuf_copy_partial(p, buffer + ieee_header_len + 5, frag_len, p->tot_len - remaining_len);\n      remaining_len -= frag_len;\n      datagram_offset += frag_len;\n\n      /* 2 bytes CRC */\n#if LWIP_6LOWPAN_HW_CRC\n      /* Leave blank, will be filled by HW. */\n#else /* LWIP_6LOWPAN_HW_CRC */\n      /* @todo calculate CRC */\n#endif /* LWIP_6LOWPAN_HW_CRC */\n\n      /* Calculate frame length */\n      p_frag->len = p_frag->tot_len = frag_len + 5 + ieee_header_len + 2;\n\n      /* send the packet */\n      MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len);\n      LWIP_DEBUGF(LOWPAN6_DEBUG | LWIP_DBG_TRACE, (\"lowpan6_send: sending packet %p\\n\", (void *)p));\n      err = netif->linkoutput(netif, p_frag);\n    }\n  } else {\n    /* It fits in one frame. */\n    frag_len = remaining_len;\n\n    /* Copy IPv6 packet */\n    pbuf_copy_partial(p, buffer + ieee_header_len + lowpan6_header_len, frag_len, 0);\n    remaining_len = 0;\n\n    /* 2 bytes CRC */\n#if LWIP_6LOWPAN_HW_CRC\n    /* Leave blank, will be filled by HW. */\n#else /* LWIP_6LOWPAN_HW_CRC */\n    /* @todo calculate CRC */\n#endif /* LWIP_6LOWPAN_HW_CRC */\n\n    /* Calculate frame length */\n    p_frag->len = p_frag->tot_len = frag_len + lowpan6_header_len + ieee_header_len + 2;\n\n    /* send the packet */\n    MIB2_STATS_NETIF_ADD(netif, ifoutoctets, p_frag->tot_len);\n    LWIP_DEBUGF(LOWPAN6_DEBUG | LWIP_DBG_TRACE, (\"lowpan6_send: sending packet %p\\n\", (void *)p));\n    err = netif->linkoutput(netif, p_frag);\n  }\n\n  pbuf_free(p_frag);\n\n  return err;\n}\n\nerr_t\nlowpan6_set_context(u8_t idx, const ip6_addr_t * context)\n{\n  if (idx >= LWIP_6LOWPAN_NUM_CONTEXTS) {\n    return ERR_ARG;\n  }\n\n  ip6_addr_set(&lowpan6_context[idx], context);\n\n  return ERR_OK;\n}\n\n#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS\nerr_t\nlowpan6_set_short_addr(u8_t addr_high, u8_t addr_low)\n{\n  short_mac_addr.addr[0] = addr_high;\n  short_mac_addr.addr[1] = addr_low;\n\n  return ERR_OK;\n}\n#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */\n\n#if LWIP_IPV4\nerr_t\nlowpan4_output(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr)\n{\n  (void)netif;\n  (void)q;\n  (void)ipaddr;\n\n  return ERR_IF;\n}\n#endif /* LWIP_IPV4 */\n\n/**\n * Resolve and fill-in IEEE 802.15.4 address header for outgoing IPv6 packet.\n *\n * Perform Header Compression and fragment if necessary.\n *\n * @param netif The lwIP network interface which the IP packet will be sent on.\n * @param q The pbuf(s) containing the IP packet to be sent.\n * @param ip6addr The IP address of the packet destination.\n *\n * @return err_t\n */\nerr_t\nlowpan6_output(struct netif *netif, struct pbuf *q, const ip6_addr_t *ip6addr)\n{\n  err_t result;\n  const u8_t *hwaddr;\n  struct ieee_802154_addr src, dest;\n#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS\n  ip6_addr_t ip6_src;\n  struct ip6_hdr * ip6_hdr;\n#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */\n\n#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS\n  /* Check if we can compress source address (use aligned copy) */\n  ip6_hdr = (struct ip6_hdr *)q->payload;\n  ip6_addr_set(&ip6_src, &ip6_hdr->src);\n  if (lowpan6_get_address_mode(&ip6_src, &short_mac_addr) == 3) {\n    src.addr_len = 2;\n    src.addr[0] = short_mac_addr.addr[0];\n    src.addr[1] = short_mac_addr.addr[1];\n  } else\n#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */\n  {\n    src.addr_len = netif->hwaddr_len;\n    SMEMCPY(src.addr, netif->hwaddr, netif->hwaddr_len);\n  }\n\n  /* multicast destination IP address? */\n  if (ip6_addr_ismulticast(ip6addr)) {\n    MIB2_STATS_NETIF_INC(netif, ifoutnucastpkts);\n    /* We need to send to the broadcast address.*/\n    return lowpan6_frag(netif, q, &src, &ieee_802154_broadcast);\n  }\n\n  /* We have a unicast destination IP address */\n  /* @todo anycast? */\n\n#if LWIP_6LOWPAN_INFER_SHORT_ADDRESS\n  if (src.addr_len == 2) {\n    /* If source address was compressable to short_mac_addr, and dest has same subnet and\n    * is also compressable to 2-bytes, assume we can infer dest as a short address too. */\n    dest.addr_len = 2;\n    dest.addr[0] = ((u8_t *)q->payload)[38];\n    dest.addr[1] = ((u8_t *)q->payload)[39];\n    if ((src.addr_len == 2) && (ip6_addr_netcmp(&ip6_hdr->src, &ip6_hdr->dest)) &&\n        (lowpan6_get_address_mode(ip6addr, &dest) == 3)) {\n      MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);\n      return lowpan6_frag(netif, q, &src, &dest);\n    }\n  }\n#endif /* LWIP_6LOWPAN_INFER_SHORT_ADDRESS */\n\n  /* Ask ND6 what to do with the packet. */\n  result = nd6_get_next_hop_addr_or_queue(netif, q, ip6addr, &hwaddr);\n  if (result != ERR_OK) {\n    MIB2_STATS_NETIF_INC(netif, ifoutdiscards);\n    return result;\n  }\n\n  /* If no hardware address is returned, nd6 has queued the packet for later. */\n  if (hwaddr == NULL) {\n    return ERR_OK;\n  }\n\n  /* Send out the packet using the returned hardware address. */\n  dest.addr_len = netif->hwaddr_len;\n  SMEMCPY(dest.addr, hwaddr, netif->hwaddr_len);\n  MIB2_STATS_NETIF_INC(netif, ifoutucastpkts);\n  return lowpan6_frag(netif, q, &src, &dest);\n}\n\nstatic struct pbuf *\nlowpan6_decompress(struct pbuf * p, struct ieee_802154_addr * src, struct ieee_802154_addr * dest)\n{\n  struct pbuf * q;\n  u8_t * lowpan6_buffer;\n  s8_t lowpan6_offset;\n  struct ip6_hdr *ip6hdr;\n  s8_t i;\n  s8_t ip6_offset = IP6_HLEN;\n\n\n  q = pbuf_alloc(PBUF_IP, p->len + IP6_HLEN + UDP_HLEN, PBUF_POOL);\n  if (q == NULL) {\n    pbuf_free(p);\n    return NULL;\n  }\n\n  lowpan6_buffer = (u8_t *)p->payload;\n  ip6hdr = (struct ip6_hdr *)q->payload;\n\n  lowpan6_offset = 2;\n  if (lowpan6_buffer[1] & 0x80) {\n    lowpan6_offset++;\n  }\n\n  /* Set IPv6 version, traffic class and flow label. */\n  if ((lowpan6_buffer[0] & 0x18) == 0x00) {\n    IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset], ((lowpan6_buffer[lowpan6_offset+1] & 0x0f) << 16) | (lowpan6_buffer[lowpan6_offset + 2] << 8) | lowpan6_buffer[lowpan6_offset+3]);\n    lowpan6_offset += 4;\n  } else if ((lowpan6_buffer[0] & 0x18) == 0x08) {\n    IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset] & 0xc0, ((lowpan6_buffer[lowpan6_offset] & 0x0f) << 16) | (lowpan6_buffer[lowpan6_offset + 1] << 8) | lowpan6_buffer[lowpan6_offset+2]);\n    lowpan6_offset += 3;\n  } else if ((lowpan6_buffer[0] & 0x18) == 0x10) {\n    IP6H_VTCFL_SET(ip6hdr, 6, lowpan6_buffer[lowpan6_offset],0);\n    lowpan6_offset += 1;\n  } else if ((lowpan6_buffer[0] & 0x18) == 0x18) {\n    IP6H_VTCFL_SET(ip6hdr, 6, 0, 0);\n  }\n\n  /* Set Next Header */\n  if ((lowpan6_buffer[0] & 0x04) == 0x00) {\n    IP6H_NEXTH_SET(ip6hdr, lowpan6_buffer[lowpan6_offset++]);\n  } else {\n    /* We should fill this later with NHC decoding */\n    IP6H_NEXTH_SET(ip6hdr, 0);\n  }\n\n  /* Set Hop Limit */\n  if ((lowpan6_buffer[0] & 0x03) == 0x00) {\n    IP6H_HOPLIM_SET(ip6hdr, lowpan6_buffer[lowpan6_offset++]);\n  } else if ((lowpan6_buffer[0] & 0x03) == 0x01) {\n    IP6H_HOPLIM_SET(ip6hdr, 1);\n  } else if ((lowpan6_buffer[0] & 0x03) == 0x02) {\n    IP6H_HOPLIM_SET(ip6hdr, 64);\n  } else if ((lowpan6_buffer[0] & 0x03) == 0x03) {\n    IP6H_HOPLIM_SET(ip6hdr, 255);\n  }\n\n  /* Source address decoding. */\n  if ((lowpan6_buffer[1] & 0x40) == 0x00) {\n    /* Stateless compression */\n    if ((lowpan6_buffer[1] & 0x30) == 0x00) {\n      /* copy full address */\n      MEMCPY(&ip6hdr->src.addr[0], lowpan6_buffer + lowpan6_offset, 16);\n      lowpan6_offset += 16;\n    } else if ((lowpan6_buffer[1] & 0x30) == 0x10) {\n      ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL);\n      ip6hdr->src.addr[1] = 0;\n      MEMCPY(&ip6hdr->src.addr[2], lowpan6_buffer + lowpan6_offset, 8);\n      lowpan6_offset += 8;\n    } else if ((lowpan6_buffer[1] & 0x30) == 0x20) {\n      ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL);\n      ip6hdr->src.addr[1] = 0;\n      ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);\n      ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) |\n                                  lowpan6_buffer[lowpan6_offset+1]);\n      lowpan6_offset += 2;\n    } else if ((lowpan6_buffer[1] & 0x30) == 0x30) {\n      ip6hdr->src.addr[0] = PP_HTONL(0xfe800000UL);\n      ip6hdr->src.addr[1] = 0;\n      if (src->addr_len == 2) {\n        ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);\n        ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]);\n      } else {\n        ip6hdr->src.addr[2] = lwip_htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) |\n                                    (src->addr[2] << 8) | src->addr[3]);\n        ip6hdr->src.addr[3] = lwip_htonl((src->addr[4] << 24) | (src->addr[5] << 16) |\n                                    (src->addr[6] << 8) | src->addr[7]);\n      }\n    }\n  } else {\n    /* Stateful compression */\n    if ((lowpan6_buffer[1] & 0x30) == 0x00) {\n      /* ANY address */\n      ip6hdr->src.addr[0] = 0;\n      ip6hdr->src.addr[1] = 0;\n      ip6hdr->src.addr[2] = 0;\n      ip6hdr->src.addr[3] = 0;\n    } else {\n      /* Set prefix from context info */\n      if (lowpan6_buffer[1] & 0x80) {\n        i = (lowpan6_buffer[2] >> 4) & 0x0f;\n      } else {\n        i = 0;\n      }\n      if (i >= LWIP_6LOWPAN_NUM_CONTEXTS) {\n        /* Error */\n        pbuf_free(p);\n        pbuf_free(q);\n        return NULL;\n      }\n\n      ip6hdr->src.addr[0] = lowpan6_context[i].addr[0];\n      ip6hdr->src.addr[1] = lowpan6_context[i].addr[1];\n    }\n\n    if ((lowpan6_buffer[1] & 0x30) == 0x10) {\n      MEMCPY(&ip6hdr->src.addr[2], lowpan6_buffer + lowpan6_offset, 8);\n      lowpan6_offset += 8;\n    } else if ((lowpan6_buffer[1] & 0x30) == 0x20) {\n      ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);\n      ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | lowpan6_buffer[lowpan6_offset+1]);\n      lowpan6_offset += 2;\n    } else if ((lowpan6_buffer[1] & 0x30) == 0x30) {\n      if (src->addr_len == 2) {\n        ip6hdr->src.addr[2] = PP_HTONL(0x000000ffUL);\n        ip6hdr->src.addr[3] = lwip_htonl(0xfe000000UL | (src->addr[0] << 8) | src->addr[1]);\n      } else {\n        ip6hdr->src.addr[2] = lwip_htonl(((src->addr[0] ^ 2) << 24) | (src->addr[1] << 16) | (src->addr[2] << 8) | src->addr[3]);\n        ip6hdr->src.addr[3] = lwip_htonl((src->addr[4] << 24) | (src->addr[5] << 16) | (src->addr[6] << 8) | src->addr[7]);\n      }\n    }\n  }\n\n  /* Destination address decoding. */\n  if (lowpan6_buffer[1] & 0x08) {\n    /* Multicast destination */\n    if (lowpan6_buffer[1] & 0x04) {\n      /* @todo support stateful multicast addressing */\n      pbuf_free(p);\n      pbuf_free(q);\n      return NULL;\n    }\n\n    if ((lowpan6_buffer[1] & 0x03) == 0x00) {\n      /* copy full address */\n      MEMCPY(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16);\n      lowpan6_offset += 16;\n    } else if ((lowpan6_buffer[1] & 0x03) == 0x01) {\n      ip6hdr->dest.addr[0] = lwip_htonl(0xff000000UL | (lowpan6_buffer[lowpan6_offset++] << 16));\n      ip6hdr->dest.addr[1] = 0;\n      ip6hdr->dest.addr[2] = lwip_htonl(lowpan6_buffer[lowpan6_offset++]);\n      ip6hdr->dest.addr[3] = lwip_htonl((lowpan6_buffer[lowpan6_offset] << 24) | (lowpan6_buffer[lowpan6_offset + 1] << 16) | (lowpan6_buffer[lowpan6_offset + 2] << 8) | lowpan6_buffer[lowpan6_offset + 3]);\n      lowpan6_offset += 4;\n    } else if ((lowpan6_buffer[1] & 0x03) == 0x02) {\n      ip6hdr->dest.addr[0] = lwip_htonl(0xff000000UL | lowpan6_buffer[lowpan6_offset++]);\n      ip6hdr->dest.addr[1] = 0;\n      ip6hdr->dest.addr[2] = 0;\n      ip6hdr->dest.addr[3] = lwip_htonl((lowpan6_buffer[lowpan6_offset] << 16) | (lowpan6_buffer[lowpan6_offset + 1] << 8) | lowpan6_buffer[lowpan6_offset + 2]);\n      lowpan6_offset += 3;\n    } else if ((lowpan6_buffer[1] & 0x03) == 0x03) {\n      ip6hdr->dest.addr[0] = PP_HTONL(0xff020000UL);\n      ip6hdr->dest.addr[1] = 0;\n      ip6hdr->dest.addr[2] = 0;\n      ip6hdr->dest.addr[3] = lwip_htonl(lowpan6_buffer[lowpan6_offset++]);\n    }\n\n  } else {\n    if (lowpan6_buffer[1] & 0x04) {\n      /* Stateful destination compression */\n      /* Set prefix from context info */\n      if (lowpan6_buffer[1] & 0x80) {\n        i = lowpan6_buffer[2] & 0x0f;\n      } else {\n        i = 0;\n      }\n      if (i >= LWIP_6LOWPAN_NUM_CONTEXTS) {\n        /* Error */\n        pbuf_free(p);\n        pbuf_free(q);\n        return NULL;\n      }\n\n      ip6hdr->dest.addr[0] = lowpan6_context[i].addr[0];\n      ip6hdr->dest.addr[1] = lowpan6_context[i].addr[1];\n    } else {\n      /* Link local address compression */\n      ip6hdr->dest.addr[0] = PP_HTONL(0xfe800000UL);\n      ip6hdr->dest.addr[1] = 0;\n    }\n\n    if ((lowpan6_buffer[1] & 0x03) == 0x00) {\n      /* copy full address */\n      MEMCPY(&ip6hdr->dest.addr[0], lowpan6_buffer + lowpan6_offset, 16);\n      lowpan6_offset += 16;\n    } else if ((lowpan6_buffer[1] & 0x03) == 0x01) {\n      MEMCPY(&ip6hdr->dest.addr[2], lowpan6_buffer + lowpan6_offset, 8);\n      lowpan6_offset += 8;\n    } else if ((lowpan6_buffer[1] & 0x03) == 0x02) {\n      ip6hdr->dest.addr[2] = PP_HTONL(0x000000ffUL);\n      ip6hdr->dest.addr[3] = lwip_htonl(0xfe000000UL | (lowpan6_buffer[lowpan6_offset] << 8) | lowpan6_buffer[lowpan6_offset + 1]);\n      lowpan6_offset += 2;\n    } else if ((lowpan6_buffer[1] & 0x03) == 0x03) {\n      if (dest->addr_len == 2) {\n        ip6hdr->dest.addr[2] = PP_HTONL(0x000000ffUL);\n        ip6hdr->dest.addr[3] = lwip_htonl(0xfe000000UL | (dest->addr[0] << 8) | dest->addr[1]);\n      } else {\n        ip6hdr->dest.addr[2] = lwip_htonl(((dest->addr[0] ^ 2) << 24) | (dest->addr[1] << 16) | dest->addr[2] << 8 | dest->addr[3]);\n        ip6hdr->dest.addr[3] = lwip_htonl((dest->addr[4] << 24) | (dest->addr[5] << 16) | dest->addr[6] << 8 | dest->addr[7]);\n      }\n    }\n  }\n\n\n  /* Next Header Compression (NHC) decoding? */\n  if (lowpan6_buffer[0] & 0x04) {\n    if ((lowpan6_buffer[lowpan6_offset] & 0xf8) == 0xf0) {\n      struct udp_hdr *udphdr;\n\n      /* UDP compression */\n      IP6H_NEXTH_SET(ip6hdr, IP6_NEXTH_UDP);\n      udphdr = (struct udp_hdr *)((u8_t *)q->payload + ip6_offset);\n\n      if (lowpan6_buffer[lowpan6_offset] & 0x04) {\n        /* @todo support checksum decompress */\n        pbuf_free(p);\n        pbuf_free(q);\n        return NULL;\n      }\n\n      /* Decompress ports */\n      i = lowpan6_buffer[lowpan6_offset++] & 0x03;\n      if (i == 0) {\n        udphdr->src = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);\n        udphdr->dest = lwip_htons(lowpan6_buffer[lowpan6_offset + 2] << 8 | lowpan6_buffer[lowpan6_offset + 3]);\n        lowpan6_offset += 4;\n      } else if (i == 0x01) {\n        udphdr->src = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);\n        udphdr->dest = lwip_htons(0xf000 | lowpan6_buffer[lowpan6_offset + 2]);\n        lowpan6_offset += 3;\n      } else if (i == 0x02) {\n        udphdr->src = lwip_htons(0xf000 | lowpan6_buffer[lowpan6_offset]);\n        udphdr->dest = lwip_htons(lowpan6_buffer[lowpan6_offset + 1] << 8 | lowpan6_buffer[lowpan6_offset + 2]);\n        lowpan6_offset += 3;\n      } else if (i == 0x03) {\n        udphdr->src = lwip_htons(0xf0b0 | ((lowpan6_buffer[lowpan6_offset] >> 4) & 0x0f));\n        udphdr->dest = lwip_htons(0xf0b0 | (lowpan6_buffer[lowpan6_offset] & 0x0f));\n        lowpan6_offset += 1;\n      }\n\n      udphdr->chksum = lwip_htons(lowpan6_buffer[lowpan6_offset] << 8 | lowpan6_buffer[lowpan6_offset + 1]);\n      lowpan6_offset += 2;\n      udphdr->len = lwip_htons(p->tot_len - lowpan6_offset + UDP_HLEN);\n\n      ip6_offset += UDP_HLEN;\n    } else {\n      /* @todo support NHC other than UDP */\n      pbuf_free(p);\n      pbuf_free(q);\n      return NULL;\n    }\n  }\n\n  /* Now we copy leftover contents from p to q, so we have all L2 and L3 headers (and L4?) in a single PBUF.\n  * Replace p with q, and free p */\n  pbuf_header(p, -lowpan6_offset);\n  MEMCPY((u8_t*)q->payload + ip6_offset, p->payload, p->len);\n  q->len = q->tot_len = ip6_offset + p->len;\n  if (p->next != NULL) {\n    pbuf_cat(q, p->next);\n  }\n  p->next = NULL;\n  pbuf_free(p);\n\n  /* Infer IPv6 payload length for header */\n  IP6H_PLEN_SET(ip6hdr, q->tot_len - IP6_HLEN);\n\n  /* all done */\n  return q;\n}\n\nerr_t\nlowpan6_input(struct pbuf * p, struct netif *netif)\n{\n  u8_t * puc;\n  s8_t i;\n  struct ieee_802154_addr src, dest;\n  u16_t datagram_size, datagram_offset, datagram_tag;\n  struct lowpan6_reass_helper *lrh, *lrh_temp;\n\n  MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len);\n\n  /* Analyze header. @todo validate. */\n  puc = (u8_t*)p->payload;\n  datagram_offset = 5;\n  if ((puc[1] & 0x0c) == 0x0c) {\n    dest.addr_len = 8;\n    for (i = 0; i < 8; i++) {\n      dest.addr[i] = puc[datagram_offset + 7 - i];\n    }\n    datagram_offset += 8;\n  } else {\n    dest.addr_len = 2;\n    dest.addr[0] = puc[datagram_offset + 1];\n    dest.addr[1] = puc[datagram_offset];\n    datagram_offset += 2;\n  }\n\n  datagram_offset += 2; /* skip PAN ID. */\n\n  if ((puc[1] & 0xc0) == 0xc0) {\n    src.addr_len = 8;\n    for (i = 0; i < 8; i++) {\n      src.addr[i] = puc[datagram_offset + 7 - i];\n    }\n    datagram_offset += 8;\n  } else {\n    src.addr_len = 2;\n    src.addr[0] = puc[datagram_offset + 1];\n    src.addr[1] = puc[datagram_offset];\n    datagram_offset += 2;\n  }\n\n  pbuf_header(p, -datagram_offset); /* hide IEEE802.15.4 header. */\n\n  /* Check dispatch. */\n  puc = (u8_t*)p->payload;\n\n  if ((*puc & 0xf8) == 0xc0) {\n    /* FRAG1 dispatch. add this packet to reassembly list. */\n    datagram_size = ((u16_t)(puc[0] & 0x07) << 8) | (u16_t)puc[1];\n    datagram_tag = ((u16_t)puc[2] << 8) | (u16_t)puc[3];\n\n    /* check for duplicate */\n    lrh = reass_list;\n    while (lrh != NULL) {\n      if ((lrh->sender_addr.addr_len == src.addr_len) &&\n          (memcmp(lrh->sender_addr.addr, src.addr, src.addr_len) == 0)) {\n        /* address match with packet in reassembly. */\n        if ((datagram_tag == lrh->datagram_tag) && (datagram_size == lrh->datagram_size)) {\n          MIB2_STATS_NETIF_INC(netif, ifindiscards);\n          /* duplicate fragment. */\n          pbuf_free(p);\n          return ERR_OK;\n        } else {\n          /* We are receiving the start of a new datagram. Discard old one (incomplete). */\n          lrh_temp = lrh->next_packet;\n          dequeue_datagram(lrh);\n          pbuf_free(lrh->pbuf);\n          mem_free(lrh);\n\n          /* Check next datagram in queue. */\n          lrh = lrh_temp;\n        }\n      } else {\n        /* Check next datagram in queue. */\n        lrh = lrh->next_packet;\n      }\n    }\n\n    pbuf_header(p, -4); /* hide frag1 dispatch */\n\n    lrh = (struct lowpan6_reass_helper *) mem_malloc(sizeof(struct lowpan6_reass_helper));\n    if (lrh == NULL) {\n      MIB2_STATS_NETIF_INC(netif, ifindiscards);\n      pbuf_free(p);\n      return ERR_MEM;\n    }\n\n    lrh->sender_addr.addr_len = src.addr_len;\n    for (i = 0; i < src.addr_len; i++) {\n      lrh->sender_addr.addr[i] = src.addr[i];\n    }\n    lrh->datagram_size = datagram_size;\n    lrh->datagram_tag = datagram_tag;\n    lrh->pbuf = p;\n    lrh->next_packet = reass_list;\n    lrh->timer = 2;\n    reass_list = lrh;\n\n    return ERR_OK;\n  } else if ((*puc & 0xf8) == 0xe0) {\n    /* FRAGN dispatch, find packet being reassembled. */\n    datagram_size = ((u16_t)(puc[0] & 0x07) << 8) | (u16_t)puc[1];\n    datagram_tag = ((u16_t)puc[2] << 8) | (u16_t)puc[3];\n    datagram_offset = (u16_t)puc[4] << 3;\n    pbuf_header(p, -5); /* hide frag1 dispatch */\n\n    for (lrh = reass_list; lrh != NULL; lrh = lrh->next_packet) {\n      if ((lrh->sender_addr.addr_len == src.addr_len) &&\n          (memcmp(lrh->sender_addr.addr, src.addr, src.addr_len) == 0) &&\n          (datagram_tag == lrh->datagram_tag) &&\n          (datagram_size == lrh->datagram_size)) {\n        break;\n      }\n    }\n    if (lrh == NULL) {\n      /* rogue fragment */\n      MIB2_STATS_NETIF_INC(netif, ifindiscards);\n      pbuf_free(p);\n      return ERR_OK;\n    }\n\n    if (lrh->pbuf->tot_len < datagram_offset) {\n      /* duplicate, ignore. */\n      pbuf_free(p);\n      return ERR_OK;\n    } else if (lrh->pbuf->tot_len > datagram_offset) {\n      MIB2_STATS_NETIF_INC(netif, ifindiscards);\n      /* We have missed a fragment. Delete whole reassembly. */\n      dequeue_datagram(lrh);\n      pbuf_free(lrh->pbuf);\n      mem_free(lrh);\n      pbuf_free(p);\n      return ERR_OK;\n    }\n    pbuf_cat(lrh->pbuf, p);\n    p = NULL;\n\n    /* is packet now complete?*/\n    if (lrh->pbuf->tot_len >= lrh->datagram_size) {\n      /* dequeue from reass list. */\n      dequeue_datagram(lrh);\n\n      /* get pbuf */\n      p = lrh->pbuf;\n\n      /* release helper */\n      mem_free(lrh);\n    } else {\n      return ERR_OK;\n    }\n  }\n\n  if (p == NULL) {\n    return ERR_OK;\n  }\n\n  /* We have a complete packet, check dispatch for headers. */\n  puc = (u8_t*)p->payload;\n\n  if (*puc == 0x41) {\n    /* This is a complete IPv6 packet, just skip dispatch byte. */\n    pbuf_header(p, -1); /* hide dispatch byte. */\n  } else if ((*puc & 0xe0 )== 0x60) {\n    /* IPv6 headers are compressed using IPHC. */\n    p = lowpan6_decompress(p, &src, &dest);\n    if (p == NULL) {\n      MIB2_STATS_NETIF_INC(netif, ifindiscards);\n      return ERR_OK;\n    }\n  } else {\n    MIB2_STATS_NETIF_INC(netif, ifindiscards);\n    pbuf_free(p);\n    return ERR_OK;\n  }\n\n  /* @todo: distinguish unicast/multicast */\n  MIB2_STATS_NETIF_INC(netif, ifinucastpkts);\n\n  return ip6_input(p, netif);\n}\n\nerr_t\nlowpan6_if_init(struct netif *netif)\n{\n  netif->name[0] = 'L';\n  netif->name[1] = '6';\n#if LWIP_IPV4\n  netif->output = lowpan4_output;\n#endif /* LWIP_IPV4 */\n  netif->output_ip6 = lowpan6_output;\n\n  MIB2_INIT_NETIF(netif, snmp_ifType_other, 0);\n\n  /* maximum transfer unit */\n  netif->mtu = 1280;\n\n  /* broadcast capability */\n  netif->flags = NETIF_FLAG_BROADCAST /* | NETIF_FLAG_LOWPAN6 */;\n\n  return ERR_OK;\n}\n\nerr_t\nlowpan6_set_pan_id(u16_t pan_id)\n{\n  ieee_802154_pan_id = pan_id;\n\n  return ERR_OK;\n}\n\n#if !NO_SYS\n/**\n * Pass a received packet to tcpip_thread for input processing\n *\n * @param p the received packet, p->payload pointing to the\n *          IEEE 802.15.4 header.\n * @param inp the network interface on which the packet was received\n */\nerr_t\ntcpip_6lowpan_input(struct pbuf *p, struct netif *inp)\n{\n  return tcpip_inpkt(p, inp, lowpan6_input);\n}\n#endif /* !NO_SYS */\n\n#endif /* LWIP_IPV6 && LWIP_6LOWPAN */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/PPPD_FOLLOWUP",
    "content": "The lwIP PPP support is based from pppd 2.4.5 (http://ppp.samba.org) with\nhuge changes to match code size and memory requirements for embedded devices.\n\nAnyway, pppd has a mature codebase for years and the average commit count\nis getting low on their Git repository, meaning that we can follow what\nis happening on their side and merge what is relevant for lwIP.\n\nSo, here is the pppd follow up, so that we don't get away too far from pppd.\n\n\n== Patch fetched from from pppd Debian packages ==\n\nThis has nothing to do with pppd, but we merged some good patch from\nDebian and this is a good place to be.\n\n- LCP adaptive echo, so that we don't send LCP echo request if we\n  are receiving data from peer, can be enabled by setting PPP_LCP_ADAPTIVE\n  to true.\n \n- IPCP no/replace default route option, were added in the early stage of\n  the ppp port, but it wasn't really helpful and was disabled when adding\n  the new API ppp_set_default() call, which gives the lwIP user control over\n  which one is the default interface, it was actually a requirement if you\n  are doing PPP over PPP (i.e. PPPoL2TP, VPN link, over PPPoE, ADSL link).\n\n- using rp-pppoe pppd exits with EXIT_OK after receiving a timeout waiting\n  for PADO due to no modem attached, bug reported to pppd bug tracker, fixed\n  in Debian but not in the latest (at the time when the port were started)\n  pppd release.\n\n\n== Commits on pppd ==\n\n2010-03-06 - Document +ipv6 and ipv6cp-accept-local\n  e7537958aee79b3f653c601e903cb31d78fb7dcc\n\nDon't care.\n\n\n2010-03-06 - Install pppol2tp plugins with sane permissions\n  406215672cfadc03017341fe03802d1c7294b903\n\nDon't care.\n\n\n2010-03-07 - pppd: Terminate correctly if lcp_lowerup delayed calling\n             fsm_lowerup\n  3eb9e810cfa515543655659b72dde30c54fea0a5\n\nMerged 2012-05-17.\n\n\n2010-03-07 - rp_pppoe: Copy acName and pppd_pppoe_service after option parsing\n  cab58617fd9d328029fffabc788020264b4fa91f\n\nDon't care, is a patch for pppd/plugins/rp-pppoe/plugin.c which is not part\nof the port.\n\n\n2010-08-23 - set and reset options to control environment variables\n             for scripts.\n  2b6310fd24dba8e0fca8999916a162f0a1842a84\n\nWe can't fork processes in embedded, therefore all the pppd process run\nfeature is disabled in the port, so we don't care about the new\n\"environment variables\" pppd feature.\n\n\n2010-08-23 - Nit: use _exit when exec fails and restrict values to 0-255\n             per POSIX.\n  2b4ea140432eeba5a007c0d4e6236bd0e0c12ba4\n\nAgain, we are not running as a heavy process, so all exit() or _exit() calls\nwere removed.\n\n\n2010-08-23 - Fix quote handling in configuration files to be more like shell\n             quoting.\n  3089132cdf5b58dbdfc2daf08ec5c08eb47f8aca\n\nWe are not parsing config file, all the filesystem I/O stuff were disabled\nin our port.\n\n\n2010-08-24 - rp-pppoe: allow MTU to be increased up to 1500\n  fd1dcdf758418f040da3ed801ab001b5e46854e7\n\nOnly concern changes on RP-PPPoE plugin, which we don't use.\n\n\n2010-09-11 - chat: Allow TIMEOUT value to come from environment variable\n  ae80bf833e48a6202f44a935a68083ae52ad3824\n\nSee 2b6310fd24dba8e0fca8999916a162f0a1842a84.\n\n\n2011-03-05 - pppdump: Fix printfs with insufficient arguments\n  7b8db569642c83ba3283745034f2e2c95e459423\n\npppdump is a ppp tool outside pppd source tree.\n\n\n2012-05-06 - pppd: Don't unconditionally disable VJ compression under Linux\n  d8a66adf98a0e525cf38031b42098d539da6eeb6\n\nPatch for sys-linux.c, which we don't use.\n\n\n2012-05-20 - Remove old version of Linux if_pppol2tp.h\n  c41092dd4c49267f232f6cba3d31c6c68bfdf68d\n\nNot in the port.\n\n\n2012-05-20 - pppd: Make MSCHAP-v2 cope better with packet loss\n  08ef47ca532294eb428238c831616748940e24a2\n\nThis is an interesting patch. However it consumes much more memory for\nMSCHAP and I am not sure if the benefit worth it. The PPP client can\nalways start the authentication again if it failed for whatever reason.\n\n\n2012-05-20 - scripts: Make poff ignore extra arguments to pppd\n  18f515f32c9f5723a9c2c912601e04335106534b\n\nAgain, we are not running scripts.\n\n\n2012-05-20 - rp-pppoe plugin: Print leading zeros in MAC address\n  f5dda0cfc220c4b52e26144096d729e27b30f0f7\n\nAgain, we are not using the RP-PPPoE plugin.\n\n\n2012-05-20 - pppd: Notify IPv6 up/down as we do for IPv4\n  845cda8fa18939cf56e60b073f63a7efa65336fc\n\nThis is just a patch that adds plugins hooks for IPv6, the plugin interface\nwas disabled because we don't have .so plugins in embedded.\n\n\n2012-05-20 - pppd: Enable IPV6 by default and fix some warnings\n  0b6118239615e98959f7e0b4e746bdd197533248\n\nChange on Makefile for IPv6, warnings were already cleared during port.\n\n\n2012-05-20 - contrib: Fix pppgetpass.gtk compilation\n  80a8e2ce257ca12cce723519a0f20ea1d663b14a\n\nChange on Makefile, don't care.\n\n\n2012-05-20 - pppd: Don't crash if crypt() returns NULL\n  04c4348108d847e034dd91066cc6843f60d71731\n\nWe are using the PolarSSL DES implementation that does not return NULL.\n\n\n2012-05-20 - pppd: Eliminate some warnings\n  c44ae5e6a7338c96eb463881fe709b2dfaffe568\n\nAgain, we are handling compilation warnings on our own.\n\n\n2012-05-20 - rp-pppoe plugin: Import some fixes from rp-pppoe-3.10\n  1817d83e51a411044e730ba89ebdb0480e1c8cd4\n\nOnce more, we are not using the RP-PPPoE plugin.\n\n\n2013-01-23 - pppd: Clarify circumstances where DNS1/DNS2 environment variables are set\n  cf2f5c9538b9400ade23446a194729b0a4113b3a\n\nDocumentation only.\n\n\n2013-02-03 - ppp: ignore unrecognised radiusclient configuration directives\n  7f736dde0da3c19855997d9e67370e351e15e923\n\nRadius plugin, not in the port.\n\n\n2013-02-03 - pppd: Take out unused %r conversion completely\n  356d8d558d844412119aa18c8e5a113bc6459c7b\n\nMerged 2014-04-15.\n\n\n2013-02-03 - pppd: Arrange to use logwtmp from libutil on Linux\n  9617a7eb137f4fee62799a677a9ecf8d834db3f5\n\nPatch for sys-linux.c, which we don't use.\n\n\n2013-02-03 - pppdump: Eliminate some compiler warnings\n  3e3acf1ba2b3046c072a42c19164788a9e419bd1\n\npppdump is a ppp tool outside pppd source tree.\n\n\n2013-02-03 - chat: Correct spelling errors in the man page\n  8dea1b969d266ccbf6f3a8c5474eb6dcd8838e3b\n\nDocumentation only.\n\n\n2013-02-03 - pppd: Fix spelling errors in man page\n  9e05a25d76b3f83096c661678010320df673df6b\n\nDocumentation only.\n\n\n2013-02-03 - plugins/passprompt: Fix potential out-of-bounds array reference\n  8edb889b753056a691a3e4b217a110a35f9fdedb\n\nPlugin patch, we do not have plugins.\n\n\n2013-02-03 - chat: Fix *roff errors in the man page\n  a7c3489eeaf44e83ce592143c7c8a5b5c29f4c48\n\nDocumentation only.\n\n\n2013-03-02 - pppd: Fix man page description of case when remote IP address isn't known\n  224841f4799f4f1e2e71bc490c54448d66740f4f\n\nDocumentation only.\n\n\n2013-03-02 - pppd: Add master_detach option\n  398ed2585640d198c53e736ee5bbd67f7ce8168e\n\nOption for multilink support, we do not support multilink and this option\nis about detaching from the terminal, which is out of the embedded scope.\n\n\n2013-03-11 - pppd: Default exit status to EXIT_CONNECT_FAILED during connection phase\n  225361d64ae737afdc8cb57579a2f33525461bc9\n\nCommented out in our port, and already fixed by a previously applied Debian patch.\n\n\n2013-03-11 - pppstats: Fix undefined macro in man page\n  d16a3985eade5280b8e171f5dd0670a91cba0d39\n\nDocumentation only.\n\n\n2013-05-11 - plugins/radius: Handle bindaddr keyword in radiusclient.conf\n  d883b2dbafeed3ebd9d7a56ab1469373bd001a3b\n\nRadius plugin, not in the port.\n\n\n2013-06-09 - pppoatm: Remove explicit loading of pppoatm kernel module\n  52cd43a84bea524033b918b603698104f221bbb7\n\nPPPoATM plugin, not in the port.\n\n\n2013-06-09 - pppd: Fix segfault in update_db_entry()\n  37476164f15a45015310b9d4b197c2d7db1f7f8f\n\nWe do not use the samba db.\n\n\n2013-06-09 - chat: Fix some text that was intended to be literal\n  cd9683676618adcee8add2c3cfa3382341b5a1f6\n\nDocumentation only.\n\n\n2013-06-09 - README.pppoe: Minor semantic fix\n  b5b8898af6fd3d44e873cfc66810ace5f1f47e17\n\nDocumentation only.\n\n\n2013-06-10 - radius: Handle additional attributes\n  2f581cd986a56f2ec4a95abad4f8297a1b10d7e2\n\nRadius plugin, not in the port.\n\n\n2013-06-10 - chat, pppd: Use \\e instead of \\\\ in man pages\n  8d6942415d22f6ca4377340ca26e345c3f5fa5db\n\nDocumentation only.\n\n\n2014-01-02 - pppd: Don't crash if NULL pointer passed to vslprintf for %q or %v\n  906814431bddeb2061825fa1ebad1a967b6d87a9\n\nMerged 2014-04-15.\n\n\n2014-01-02 - pppd: Accept IPCP ConfAck packets containing MS-WINS options\n  a243f217f1c6ac1aa7793806bc88590d077f490a\n\nMerged 2014-04-15.\n\n\n2014-01-02 - config: Update Solaris compiler options and enable CHAPMS and IPV6\n  99c46caaed01b7edba87962aa52b77fad61bfd7b\n\nSolaris port, don't care.\n\n\n2014-01-02 - Update README and patchlevel for 2.4.6 release\n  4043750fca36e7e0eb90d702e048ad1da4929418\n\nJust release stuff.\n\n\n2014-02-18 - pppd: Add option \"stop-bits\" to set number of serial port stop bits.\n  ad993a20ee485f0d0e2ac4105221641b200da6e2\n\nLow level serial port, not in the port.\n\n\n2014-03-09 - pppd: Separate IPv6 handling for sifup/sifdown\n  b04d2dc6df5c6b5650fea44250d58757ee3dac4a\n\nReimplemented.\n\n\n2014-03-09 - pppol2tp: Connect up/down events to notifiers and add IPv6 ones\n  fafbe50251efc7d6b4a8be652d085316e112b34f\n\nNot in the port.\n\n\n2014-03-09 - pppd: Add declarations to eliminate compile warnings\n  50967962addebe15c7a7e63116ff46a0441dc464\n\nWe are handling compilation warnings on our own\n\n\n2014-03-09 - pppd: Eliminate some unnecessary ifdefs\n  de8da14d845ee6db9236ccfddabf1d8ebf045ddb\n\nWe mostly did that previously. Anyway, merged 2014-12-24.\n\n\n2014-08-01 - radius: Fix realms-config-file option\n  880a81be7c8e0fe8567227bc17a1bff3ea035943\n\nRadius plugin, not in the port.\n\n\n2014-08-01 - pppd: Eliminate potential integer overflow in option parsing\n  7658e8257183f062dc01f87969c140707c7e52cb\n\npppd config file parser, not in the port.\n\n\n2014-08-01 - pppd: Eliminate memory leak with multiple instances of a string option\n  b94b7fbbaa0589aa6ec5fdc733aeb9ff294d2656\n\npppd config file parser, not in the port.\n\n\n2014-08-01 - pppd: Fix a stack variable overflow in MSCHAP-v2\n  36733a891fb56594fcee580f667b33a64b990981\n\nThis fixes a bug introduced in 08ef47ca (\"pppd: Make MSCHAP-v2 cope better with packet loss\").\n\nWe didn't merge 08ef47ca ;-)\n\n\n2014-08-01 - winbind plugin: Add -DMPPE=1 to eliminate compiler warnings\n  2b05e22c62095e97dd0a97e4b5588402c2185071\n\nLinux plugin, not in the port.\n\n\n2014-08-09 - Update README and patchlevel for 2.4.7 release\n  6e8eaa7a78b31cdab2edf140a9c8afdb02ffaca5\n\nJust release stuff.\n\n\n2014-08-10 - abort on errors in subdir builds\n  5e90783d11a59268e05f4cfb29ce2343b13e8ab2\n\nLinux Makefile, not in the port.\n\n\n2014-06-03 - pppd: add support for defaultroute-metric option\n  35e5a569c988b1ff865b02a24d9a727a00db4da9\n\nOnly necessary for Linux, lwIP does not support route metrics.\n\n\n2014-12-13 - scripts: Avoid killing wrong pppd\n  67811a647d399db5d188a242827760615a0f86b5\n\npppd helper script, not in the port.\n\n\n2014-12-20 - pppd: Fix sign-extension when displaying bytes in octal\n  5e8c3cb256a7e86e3572a82a75d51c6850efdbdc\n\nMerged 2016-07-02.\n\n\n2015-03-01 - Suppress false error message on PPPoE disconnect\n  219aac3b53d0827549377f1bfe22853ee52d4405\n\nPPPoE plugin, not in the port.\n\n\n2015-03-01 - Send PADT on PPPoE disconnect\n  cd2c14f998c57bbe6a01dc5854f2763c0d7f31fb\n\nPPPoE plugin, not in the port. And our PPPoE implementation already does\nthat: pppoe_disconnect() calls pppoe_send_padt().\n\n\n2015-08-14 - pppd: ipxcp: Prevent buffer overrun on remote router name\n  fe149de624f96629a7f46732055d8f718c74b856\n\nWe never ported IPX support. lwIP does not support IPX.\n\n\n2015-03-25 - pppd: Fix ccp_options.mppe type\n  234edab99a6bb250cc9ecd384cca27b0c8b475ce\n\nWe found that while working on MPPE support in lwIP, that's our patch ;-)\n\n\n2015-03-24 - pppd: Fix ccp_cilen calculated size if both deflate_correct and deflate_draft are enabled\n  094cb8ae4c61db225e67fedadb4964f846dd0c27\n\nWe found that while working on MPPE support in lwIP, that's our patch ;-)\n\n\n2015-08-14 - Merge branch 'master' of https://github.com/ncopa/ppp\n  3a5c9a8fbc8970375cd881151d44e4b6fe249c6a\n\nMerge commit, we don't care.\n\n\n2015-08-14 - Merge branch 'master' of git://github.com/vapier/ppp\n  912e4fc6665aca188dced7ea7fdc663ce5a2dd24\n\nMerge commit, we don't care.\n\n\n2015-08-14 - Merge branch 'bug_fix' of git://github.com/radaiming/ppp\n  dfd33d7f526ecd7b39dd1bba8101260d02af5ebb\n\nMerge commit, we don't care.\n\n\n2015-08-14 - Merge branch 'master' of git://github.com/pprindeville/ppp\n  aa4a985f6114d08cf4e47634fb6325da71016473\n\nMerge commit, we don't care.\n\n\n2015-08-14 - Merge branch 'no-error-on-already-closed' of git://github.com/farnz/ppp\n  6edf252483b30dbcdcc5059f01831455365d5b6e\n\nMerge commit, we don't care.\n\n\n2015-08-14 - Merge branch 'send-padt-on-disconnect' of git://github.com/farnz/ppp\n  84684243d651f55f6df69d2a6707b52fbbe62bb9\n\nMerge commit, we don't care.\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/auth.c",
    "content": "/*\n * auth.c - PPP authentication and phase control.\n *\n * Copyright (c) 1993-2002 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * Derived from main.c, which is:\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#if 0 /* UNUSED */\n#include <stdio.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <errno.h>\n#include <pwd.h>\n#include <grp.h>\n#include <string.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <sys/socket.h>\n#include <utmp.h>\n#include <fcntl.h>\n#if defined(_PATH_LASTLOG) && defined(__linux__)\n#include <lastlog.h>\n#endif\n\n#include <netdb.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n\n#ifdef HAS_SHADOW\n#include <shadow.h>\n#ifndef PW_PPP\n#define PW_PPP PW_LOGIN\n#endif\n#endif\n\n#include <time.h>\n#endif /* UNUSED */\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/fsm.h\"\n#include \"netif/ppp/lcp.h\"\n#if CCP_SUPPORT\n#include \"netif/ppp/ccp.h\"\n#endif /* CCP_SUPPORT */\n#if ECP_SUPPORT\n#include \"netif/ppp/ecp.h\"\n#endif /* ECP_SUPPORT */\n#include \"netif/ppp/ipcp.h\"\n#if PAP_SUPPORT\n#include \"netif/ppp/upap.h\"\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n#include \"netif/ppp/chap-new.h\"\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n#include \"netif/ppp/eap.h\"\n#endif /* EAP_SUPPORT */\n#if CBCP_SUPPORT\n#include \"netif/ppp/cbcp.h\"\n#endif\n\n#if 0 /* UNUSED */\n#include \"session.h\"\n#endif /* UNUSED */\n\n#if 0 /* UNUSED */\n/* Bits in scan_authfile return value */\n#define NONWILD_SERVER    1\n#define NONWILD_CLIENT    2\n\n#define ISWILD(word)    (word[0] == '*' && word[1] == 0)\n#endif /* UNUSED */\n\n#if 0 /* UNUSED */\n/* List of addresses which the peer may use. */\nstatic struct permitted_ip *addresses[NUM_PPP];\n\n/* Wordlist giving addresses which the peer may use\n   without authenticating itself. */\nstatic struct wordlist *noauth_addrs;\n\n/* Remote telephone number, if available */\nchar remote_number[MAXNAMELEN];\n\n/* Wordlist giving remote telephone numbers which may connect. */\nstatic struct wordlist *permitted_numbers;\n\n/* Extra options to apply, from the secrets file entry for the peer. */\nstatic struct wordlist *extra_options;\n#endif /* UNUSED */\n\n#if 0 /* UNUSED */\n/* Set if we require authentication only because we have a default route. */\nstatic bool default_auth;\n\n/* Hook to enable a plugin to control the idle time limit */\nint (*idle_time_hook) (struct ppp_idle *) = NULL;\n\n/* Hook for a plugin to say whether we can possibly authenticate any peer */\nint (*pap_check_hook) (void) = NULL;\n\n/* Hook for a plugin to check the PAP user and password */\nint (*pap_auth_hook) (char *user, char *passwd, char **msgp,\n              struct wordlist **paddrs,\n              struct wordlist **popts) = NULL;\n\n/* Hook for a plugin to know about the PAP user logout */\nvoid (*pap_logout_hook) (void) = NULL;\n\n/* Hook for a plugin to get the PAP password for authenticating us */\nint (*pap_passwd_hook) (char *user, char *passwd) = NULL;\n\n/* Hook for a plugin to say if we can possibly authenticate a peer using CHAP */\nint (*chap_check_hook) (void) = NULL;\n\n/* Hook for a plugin to get the CHAP password for authenticating us */\nint (*chap_passwd_hook) (char *user, char *passwd) = NULL;\n\n/* Hook for a plugin to say whether it is OK if the peer\n   refuses to authenticate. */\nint (*null_auth_hook) (struct wordlist **paddrs,\n               struct wordlist **popts) = NULL;\n\nint (*allowed_address_hook) (u32_t addr) = NULL;\n#endif /* UNUSED */\n\n#ifdef HAVE_MULTILINK\n/* Hook for plugin to hear when an interface joins a multilink bundle */\nvoid (*multilink_join_hook) (void) = NULL;\n#endif\n\n#if PPP_NOTIFY\n/* A notifier for when the peer has authenticated itself,\n   and we are proceeding to the network phase. */\nstruct notifier *auth_up_notifier = NULL;\n\n/* A notifier for when the link goes down. */\nstruct notifier *link_down_notifier = NULL;\n#endif /* PPP_NOTIFY */\n\n/*\n * Option variables.\n */\n#if 0 /* MOVED TO ppp_settings */\nbool uselogin = 0;        /* Use /etc/passwd for checking PAP */\nbool session_mgmt = 0;        /* Do session management (login records) */\nbool cryptpap = 0;        /* Passwords in pap-secrets are encrypted */\nbool refuse_pap = 0;        /* Don't wanna auth. ourselves with PAP */\nbool refuse_chap = 0;        /* Don't wanna auth. ourselves with CHAP */\nbool refuse_eap = 0;        /* Don't wanna auth. ourselves with EAP */\n#if MSCHAP_SUPPORT\nbool refuse_mschap = 0;        /* Don't wanna auth. ourselves with MS-CHAP */\nbool refuse_mschap_v2 = 0;    /* Don't wanna auth. ourselves with MS-CHAPv2 */\n#else /* MSCHAP_SUPPORT */\nbool refuse_mschap = 1;        /* Don't wanna auth. ourselves with MS-CHAP */\nbool refuse_mschap_v2 = 1;    /* Don't wanna auth. ourselves with MS-CHAPv2 */\n#endif /* MSCHAP_SUPPORT */\nbool usehostname = 0;        /* Use hostname for our_name */\nbool auth_required = 0;        /* Always require authentication from peer */\nbool allow_any_ip = 0;        /* Allow peer to use any IP address */\nbool explicit_remote = 0;    /* User specified explicit remote name */\nbool explicit_user = 0;        /* Set if \"user\" option supplied */\nbool explicit_passwd = 0;    /* Set if \"password\" option supplied */\nchar remote_name[MAXNAMELEN];    /* Peer's name for authentication */\nstatic char *uafname;        /* name of most recent +ua file */\n\nextern char *crypt (const char *, const char *);\n#endif /* UNUSED */\n/* Prototypes for procedures local to this file. */\n\nstatic void network_phase(ppp_pcb *pcb);\n#if PPP_IDLETIMELIMIT\nstatic void check_idle(void *arg);\n#endif /* PPP_IDLETIMELIMIT */\n#if PPP_MAXCONNECT\nstatic void connect_time_expired(void *arg);\n#endif /* PPP_MAXCONNECT */\n#if 0 /* UNUSED */\nstatic int  null_login (int);\n/* static int  get_pap_passwd (char *); */\nstatic int  have_pap_secret (int *);\nstatic int  have_chap_secret (char *, char *, int, int *);\nstatic int  have_srp_secret (char *client, char *server, int need_ip,\n    int *lacks_ipp);\nstatic int  ip_addr_check (u32_t, struct permitted_ip *);\nstatic int  scan_authfile (FILE *, char *, char *, char *,\n                   struct wordlist **, struct wordlist **,\n                   char *, int);\nstatic void free_wordlist (struct wordlist *);\nstatic void set_allowed_addrs (int, struct wordlist *, struct wordlist *);\nstatic int  some_ip_ok (struct wordlist *);\nstatic int  setupapfile (char **);\nstatic int  privgroup (char **);\nstatic int  set_noauth_addr (char **);\nstatic int  set_permitted_number (char **);\nstatic void check_access (FILE *, char *);\nstatic int  wordlist_count (struct wordlist *);\n#endif /* UNUSED */\n\n#ifdef MAXOCTETS\nstatic void check_maxoctets (void *);\n#endif\n\n#if PPP_OPTIONS\n/*\n * Authentication-related options.\n */\noption_t auth_options[] = {\n    { \"auth\", o_bool, &auth_required,\n      \"Require authentication from peer\", OPT_PRIO | 1 },\n    { \"noauth\", o_bool, &auth_required,\n      \"Don't require peer to authenticate\", OPT_PRIOSUB | OPT_PRIV,\n      &allow_any_ip },\n    { \"require-pap\", o_bool, &lcp_wantoptions[0].neg_upap,\n      \"Require PAP authentication from peer\",\n      OPT_PRIOSUB | 1, &auth_required },\n    { \"+pap\", o_bool, &lcp_wantoptions[0].neg_upap,\n      \"Require PAP authentication from peer\",\n      OPT_ALIAS | OPT_PRIOSUB | 1, &auth_required },\n    { \"require-chap\", o_bool, &auth_required,\n      \"Require CHAP authentication from peer\",\n      OPT_PRIOSUB | OPT_A2OR | MDTYPE_MD5,\n      &lcp_wantoptions[0].chap_mdtype },\n    { \"+chap\", o_bool, &auth_required,\n      \"Require CHAP authentication from peer\",\n      OPT_ALIAS | OPT_PRIOSUB | OPT_A2OR | MDTYPE_MD5,\n      &lcp_wantoptions[0].chap_mdtype },\n#if MSCHAP_SUPPORT\n    { \"require-mschap\", o_bool, &auth_required,\n      \"Require MS-CHAP authentication from peer\",\n      OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT,\n      &lcp_wantoptions[0].chap_mdtype },\n    { \"+mschap\", o_bool, &auth_required,\n      \"Require MS-CHAP authentication from peer\",\n      OPT_ALIAS | OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT,\n      &lcp_wantoptions[0].chap_mdtype },\n    { \"require-mschap-v2\", o_bool, &auth_required,\n      \"Require MS-CHAPv2 authentication from peer\",\n      OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT_V2,\n      &lcp_wantoptions[0].chap_mdtype },\n    { \"+mschap-v2\", o_bool, &auth_required,\n      \"Require MS-CHAPv2 authentication from peer\",\n      OPT_ALIAS | OPT_PRIOSUB | OPT_A2OR | MDTYPE_MICROSOFT_V2,\n      &lcp_wantoptions[0].chap_mdtype },\n#endif /* MSCHAP_SUPPORT */\n#if 0\n    { \"refuse-pap\", o_bool, &refuse_pap,\n      \"Don't agree to auth to peer with PAP\", 1 },\n    { \"-pap\", o_bool, &refuse_pap,\n      \"Don't allow PAP authentication with peer\", OPT_ALIAS | 1 },\n    { \"refuse-chap\", o_bool, &refuse_chap,\n      \"Don't agree to auth to peer with CHAP\",\n      OPT_A2CLRB | MDTYPE_MD5,\n      &lcp_allowoptions[0].chap_mdtype },\n    { \"-chap\", o_bool, &refuse_chap,\n      \"Don't allow CHAP authentication with peer\",\n      OPT_ALIAS | OPT_A2CLRB | MDTYPE_MD5,\n      &lcp_allowoptions[0].chap_mdtype },\n#endif\n#if MSCHAP_SUPPORT\n#if 0\n    { \"refuse-mschap\", o_bool, &refuse_mschap,\n      \"Don't agree to auth to peer with MS-CHAP\",\n      OPT_A2CLRB | MDTYPE_MICROSOFT,\n      &lcp_allowoptions[0].chap_mdtype },\n    { \"-mschap\", o_bool, &refuse_mschap,\n      \"Don't allow MS-CHAP authentication with peer\",\n      OPT_ALIAS | OPT_A2CLRB | MDTYPE_MICROSOFT,\n      &lcp_allowoptions[0].chap_mdtype },\n    { \"refuse-mschap-v2\", o_bool, &refuse_mschap_v2,\n      \"Don't agree to auth to peer with MS-CHAPv2\",\n      OPT_A2CLRB | MDTYPE_MICROSOFT_V2,\n      &lcp_allowoptions[0].chap_mdtype },\n    { \"-mschap-v2\", o_bool, &refuse_mschap_v2,\n      \"Don't allow MS-CHAPv2 authentication with peer\",\n      OPT_ALIAS | OPT_A2CLRB | MDTYPE_MICROSOFT_V2,\n      &lcp_allowoptions[0].chap_mdtype },\n#endif\n#endif /* MSCHAP_SUPPORT*/\n#if EAP_SUPPORT\n    { \"require-eap\", o_bool, &lcp_wantoptions[0].neg_eap,\n      \"Require EAP authentication from peer\", OPT_PRIOSUB | 1,\n      &auth_required },\n#if 0\n    { \"refuse-eap\", o_bool, &refuse_eap,\n      \"Don't agree to authenticate to peer with EAP\", 1 },\n#endif\n#endif /* EAP_SUPPORT */\n    { \"name\", o_string, our_name,\n      \"Set local name for authentication\",\n      OPT_PRIO | OPT_PRIV | OPT_STATIC, NULL, MAXNAMELEN },\n\n    { \"+ua\", o_special, (void *)setupapfile,\n      \"Get PAP user and password from file\",\n      OPT_PRIO | OPT_A2STRVAL, &uafname },\n\n#if 0\n    { \"user\", o_string, user,\n      \"Set name for auth with peer\", OPT_PRIO | OPT_STATIC,\n      &explicit_user, MAXNAMELEN },\n\n    { \"password\", o_string, passwd,\n      \"Password for authenticating us to the peer\",\n      OPT_PRIO | OPT_STATIC | OPT_HIDE,\n      &explicit_passwd, MAXSECRETLEN },\n#endif\n\n    { \"usehostname\", o_bool, &usehostname,\n      \"Must use hostname for authentication\", 1 },\n\n    { \"remotename\", o_string, remote_name,\n      \"Set remote name for authentication\", OPT_PRIO | OPT_STATIC,\n      &explicit_remote, MAXNAMELEN },\n\n    { \"login\", o_bool, &uselogin,\n      \"Use system password database for PAP\", OPT_A2COPY | 1 ,\n      &session_mgmt },\n    { \"enable-session\", o_bool, &session_mgmt,\n      \"Enable session accounting for remote peers\", OPT_PRIV | 1 },\n\n    { \"papcrypt\", o_bool, &cryptpap,\n      \"PAP passwords are encrypted\", 1 },\n\n    { \"privgroup\", o_special, (void *)privgroup,\n      \"Allow group members to use privileged options\", OPT_PRIV | OPT_A2LIST },\n\n    { \"allow-ip\", o_special, (void *)set_noauth_addr,\n      \"Set IP address(es) which can be used without authentication\",\n      OPT_PRIV | OPT_A2LIST },\n\n    { \"remotenumber\", o_string, remote_number,\n      \"Set remote telephone number for authentication\", OPT_PRIO | OPT_STATIC,\n      NULL, MAXNAMELEN },\n\n    { \"allow-number\", o_special, (void *)set_permitted_number,\n      \"Set telephone number(s) which are allowed to connect\",\n      OPT_PRIV | OPT_A2LIST },\n\n    { NULL }\n};\n#endif /* PPP_OPTIONS */\n\n#if 0 /* UNUSED */\n/*\n * setupapfile - specifies UPAP info for authenticating with peer.\n */\nstatic int\nsetupapfile(argv)\n    char **argv;\n{\n    FILE *ufile;\n    int l;\n    uid_t euid;\n    char u[MAXNAMELEN], p[MAXSECRETLEN];\n    char *fname;\n\n    lcp_allowoptions[0].neg_upap = 1;\n\n    /* open user info file */\n    fname = strdup(*argv);\n    if (fname == NULL)\n    novm(\"+ua file name\");\n    euid = geteuid();\n    if (seteuid(getuid()) == -1) {\n    option_error(\"unable to reset uid before opening %s: %m\", fname);\n    return 0;\n    }\n    ufile = fopen(fname, \"r\");\n    if (seteuid(euid) == -1)\n    fatal(\"unable to regain privileges: %m\");\n    if (ufile == NULL) {\n    option_error(\"unable to open user login data file %s\", fname);\n    return 0;\n    }\n    check_access(ufile, fname);\n    uafname = fname;\n\n    /* get username */\n    if (fgets(u, MAXNAMELEN - 1, ufile) == NULL\n    || fgets(p, MAXSECRETLEN - 1, ufile) == NULL) {\n    fclose(ufile);\n    option_error(\"unable to read user login data file %s\", fname);\n    return 0;\n    }\n    fclose(ufile);\n\n    /* get rid of newlines */\n    l = strlen(u);\n    if (l > 0 && u[l-1] == '\\n')\n    u[l-1] = 0;\n    l = strlen(p);\n    if (l > 0 && p[l-1] == '\\n')\n    p[l-1] = 0;\n\n    if (override_value(\"user\", option_priority, fname)) {\n    strlcpy(ppp_settings.user, u, sizeof(ppp_settings.user));\n    explicit_user = 1;\n    }\n    if (override_value(\"passwd\", option_priority, fname)) {\n    strlcpy(ppp_settings.passwd, p, sizeof(ppp_settings.passwd));\n    explicit_passwd = 1;\n    }\n\n    return (1);\n}\n\n/*\n * privgroup - allow members of the group to have privileged access.\n */\nstatic int\nprivgroup(argv)\n    char **argv;\n{\n    struct group *g;\n    int i;\n\n    g = getgrnam(*argv);\n    if (g == 0) {\n    option_error(\"group %s is unknown\", *argv);\n    return 0;\n    }\n    for (i = 0; i < ngroups; ++i) {\n    if (groups[i] == g->gr_gid) {\n        privileged = 1;\n        break;\n    }\n    }\n    return 1;\n}\n\n\n/*\n * set_noauth_addr - set address(es) that can be used without authentication.\n * Equivalent to specifying an entry like `\"\" * \"\" addr' in pap-secrets.\n */\nstatic int\nset_noauth_addr(argv)\n    char **argv;\n{\n    char *addr = *argv;\n    int l = strlen(addr) + 1;\n    struct wordlist *wp;\n\n    wp = (struct wordlist *) malloc(sizeof(struct wordlist) + l);\n    if (wp == NULL)\n    novm(\"allow-ip argument\");\n    wp->word = (char *) (wp + 1);\n    wp->next = noauth_addrs;\n    MEMCPY(wp->word, addr, l);\n    noauth_addrs = wp;\n    return 1;\n}\n\n\n/*\n * set_permitted_number - set remote telephone number(s) that may connect.\n */\nstatic int\nset_permitted_number(argv)\n    char **argv;\n{\n    char *number = *argv;\n    int l = strlen(number) + 1;\n    struct wordlist *wp;\n\n    wp = (struct wordlist *) malloc(sizeof(struct wordlist) + l);\n    if (wp == NULL)\n    novm(\"allow-number argument\");\n    wp->word = (char *) (wp + 1);\n    wp->next = permitted_numbers;\n    MEMCPY(wp->word, number, l);\n    permitted_numbers = wp;\n    return 1;\n}\n#endif\n\n/*\n * An Open on LCP has requested a change from Dead to Establish phase.\n */\nvoid link_required(ppp_pcb *pcb) {\n    LWIP_UNUSED_ARG(pcb);\n}\n\n#if 0\n/*\n * Bring the link up to the point of being able to do ppp.\n */\nvoid start_link(unit)\n    int unit;\n{\n    ppp_pcb *pcb = &ppp_pcb_list[unit];\n    char *msg;\n\n    status = EXIT_NEGOTIATION_FAILED;\n    new_phase(pcb, PPP_PHASE_SERIALCONN);\n\n    hungup = 0;\n    devfd = the_channel->connect();\n    msg = \"Connect script failed\";\n    if (devfd < 0)\n    goto fail;\n\n    /* set up the serial device as a ppp interface */\n    /*\n     * N.B. we used to do tdb_writelock/tdb_writeunlock around this\n     * (from establish_ppp to set_ifunit).  However, we won't be\n     * doing the set_ifunit in multilink mode, which is the only time\n     * we need the atomicity that the tdb_writelock/tdb_writeunlock\n     * gives us.  Thus we don't need the tdb_writelock/tdb_writeunlock.\n     */\n    fd_ppp = the_channel->establish_ppp(devfd);\n    msg = \"ppp establishment failed\";\n    if (fd_ppp < 0) {\n    status = EXIT_FATAL_ERROR;\n    goto disconnect;\n    }\n\n    if (!demand && ifunit >= 0)\n    set_ifunit(1);\n\n    /*\n     * Start opening the connection and wait for\n     * incoming events (reply, timeout, etc.).\n     */\n    if (ifunit >= 0)\n    ppp_notice(\"Connect: %s <--> %s\", ifname, ppp_devnam);\n    else\n    ppp_notice(\"Starting negotiation on %s\", ppp_devnam);\n    add_fd(fd_ppp);\n\n    new_phase(pcb, PPP_PHASE_ESTABLISH);\n\n    lcp_lowerup(pcb);\n    return;\n\n disconnect:\n    new_phase(pcb, PPP_PHASE_DISCONNECT);\n    if (the_channel->disconnect)\n    the_channel->disconnect();\n\n fail:\n    new_phase(pcb, PPP_PHASE_DEAD);\n    if (the_channel->cleanup)\n    (*the_channel->cleanup)();\n}\n#endif\n\n/*\n * LCP has terminated the link; go to the Dead phase and take the\n * physical layer down.\n */\nvoid link_terminated(ppp_pcb *pcb) {\n    if (pcb->phase == PPP_PHASE_DEAD\n#ifdef HAVE_MULTILINK\n    || pcb->phase == PPP_PHASE_MASTER\n#endif /* HAVE_MULTILINK */\n    )\n    return;\n    new_phase(pcb, PPP_PHASE_DISCONNECT);\n\n#if 0 /* UNUSED */\n    if (pap_logout_hook) {\n    pap_logout_hook();\n    }\n    session_end(devnam);\n#endif /* UNUSED */\n\n    if (!doing_multilink) {\n    ppp_notice(\"Connection terminated.\");\n#if PPP_STATS_SUPPORT\n    print_link_stats();\n#endif /* PPP_STATS_SUPPORT */\n    } else\n    ppp_notice(\"Link terminated.\");\n\n    lcp_lowerdown(pcb);\n\n    ppp_link_terminated(pcb);\n#if 0\n    /*\n     * Delete pid files before disestablishing ppp.  Otherwise it\n     * can happen that another pppd gets the same unit and then\n     * we delete its pid file.\n     */\n    if (!doing_multilink && !demand)\n    remove_pidfiles();\n\n    /*\n     * If we may want to bring the link up again, transfer\n     * the ppp unit back to the loopback.  Set the\n     * real serial device back to its normal mode of operation.\n     */\n    if (fd_ppp >= 0) {\n    remove_fd(fd_ppp);\n    clean_check();\n    the_channel->disestablish_ppp(devfd);\n    if (doing_multilink)\n        mp_exit_bundle();\n    fd_ppp = -1;\n    }\n    if (!hungup)\n    lcp_lowerdown(pcb);\n    if (!doing_multilink && !demand)\n    script_unsetenv(\"IFNAME\");\n\n    /*\n     * Run disconnector script, if requested.\n     * XXX we may not be able to do this if the line has hung up!\n     */\n    if (devfd >= 0 && the_channel->disconnect) {\n    the_channel->disconnect();\n    devfd = -1;\n    }\n    if (the_channel->cleanup)\n    (*the_channel->cleanup)();\n\n    if (doing_multilink && multilink_master) {\n    if (!bundle_terminating)\n        new_phase(pcb, PPP_PHASE_MASTER);\n    else\n        mp_bundle_terminated();\n    } else\n    new_phase(pcb, PPP_PHASE_DEAD);\n#endif\n}\n\n/*\n * LCP has gone down; it will either die or try to re-establish.\n */\nvoid link_down(ppp_pcb *pcb) {\n#if PPP_NOTIFY\n    notify(link_down_notifier, 0);\n#endif /* PPP_NOTIFY */\n\n    if (!doing_multilink) {\n    upper_layers_down(pcb);\n    if (pcb->phase != PPP_PHASE_DEAD\n#ifdef HAVE_MULTILINK\n    && pcb->phase != PPP_PHASE_MASTER\n#endif /* HAVE_MULTILINK */\n    )\n        new_phase(pcb, PPP_PHASE_ESTABLISH);\n    }\n    /* XXX if doing_multilink, should do something to stop\n       network-layer traffic on the link */\n}\n\nvoid upper_layers_down(ppp_pcb *pcb) {\n    int i;\n    const struct protent *protp;\n\n    for (i = 0; (protp = protocols[i]) != NULL; ++i) {\n        if (protp->protocol != PPP_LCP && protp->lowerdown != NULL)\n        (*protp->lowerdown)(pcb);\n        if (protp->protocol < 0xC000 && protp->close != NULL)\n        (*protp->close)(pcb, \"LCP down\");\n    }\n    pcb->num_np_open = 0;\n    pcb->num_np_up = 0;\n}\n\n/*\n * The link is established.\n * Proceed to the Dead, Authenticate or Network phase as appropriate.\n */\nvoid link_established(ppp_pcb *pcb) {\n#if PPP_AUTH_SUPPORT\n    int auth;\n#if PPP_SERVER\n#if PAP_SUPPORT\n    lcp_options *wo = &pcb->lcp_wantoptions;\n#endif /* PAP_SUPPORT */\n    lcp_options *go = &pcb->lcp_gotoptions;\n#endif /* PPP_SERVER */\n    lcp_options *ho = &pcb->lcp_hisoptions;\n#endif /* PPP_AUTH_SUPPORT */\n    int i;\n    const struct protent *protp;\n\n    /*\n     * Tell higher-level protocols that LCP is up.\n     */\n    if (!doing_multilink) {\n    for (i = 0; (protp = protocols[i]) != NULL; ++i)\n        if (protp->protocol != PPP_LCP\n        && protp->lowerup != NULL)\n        (*protp->lowerup)(pcb);\n    }\n\n#if PPP_AUTH_SUPPORT\n#if PPP_SERVER\n#if PPP_ALLOWED_ADDRS\n    if (!auth_required && noauth_addrs != NULL)\n    set_allowed_addrs(unit, NULL, NULL);\n#endif /* PPP_ALLOWED_ADDRS */\n\n    if (pcb->settings.auth_required && !(0\n#if PAP_SUPPORT\n    || go->neg_upap\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n    || go->neg_chap\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n    || go->neg_eap\n#endif /* EAP_SUPPORT */\n    )) {\n\n#if PPP_ALLOWED_ADDRS\n    /*\n     * We wanted the peer to authenticate itself, and it refused:\n     * if we have some address(es) it can use without auth, fine,\n     * otherwise treat it as though it authenticated with PAP using\n     * a username of \"\" and a password of \"\".  If that's not OK,\n     * boot it out.\n     */\n    if (noauth_addrs != NULL) {\n        set_allowed_addrs(unit, NULL, NULL);\n    } else\n#endif /* PPP_ALLOWED_ADDRS */\n    if (!pcb->settings.null_login\n#if PAP_SUPPORT\n        || !wo->neg_upap\n#endif /* PAP_SUPPORT */\n        ) {\n        ppp_warn(\"peer refused to authenticate: terminating link\");\n#if 0 /* UNUSED */\n        status = EXIT_PEER_AUTH_FAILED;\n#endif /* UNUSED */\n        pcb->err_code = PPPERR_AUTHFAIL;\n        lcp_close(pcb, \"peer refused to authenticate\");\n        return;\n    }\n    }\n#endif /* PPP_SERVER */\n\n    new_phase(pcb, PPP_PHASE_AUTHENTICATE);\n    auth = 0;\n#if PPP_SERVER\n#if EAP_SUPPORT\n    if (go->neg_eap) {\n    eap_authpeer(pcb, PPP_OUR_NAME);\n    auth |= EAP_PEER;\n    } else\n#endif /* EAP_SUPPORT */\n#if CHAP_SUPPORT\n    if (go->neg_chap) {\n    chap_auth_peer(pcb, PPP_OUR_NAME, CHAP_DIGEST(go->chap_mdtype));\n    auth |= CHAP_PEER;\n    } else\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n    if (go->neg_upap) {\n    upap_authpeer(pcb);\n    auth |= PAP_PEER;\n    } else\n#endif /* PAP_SUPPORT */\n    {}\n#endif /* PPP_SERVER */\n\n#if EAP_SUPPORT\n    if (ho->neg_eap) {\n    eap_authwithpeer(pcb, pcb->settings.user);\n    auth |= EAP_WITHPEER;\n    } else\n#endif /* EAP_SUPPORT */\n#if CHAP_SUPPORT\n    if (ho->neg_chap) {\n    chap_auth_with_peer(pcb, pcb->settings.user, CHAP_DIGEST(ho->chap_mdtype));\n    auth |= CHAP_WITHPEER;\n    } else\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n    if (ho->neg_upap) {\n    upap_authwithpeer(pcb, pcb->settings.user, pcb->settings.passwd);\n    auth |= PAP_WITHPEER;\n    } else\n#endif /* PAP_SUPPORT */\n    {}\n\n    pcb->auth_pending = auth;\n    pcb->auth_done = 0;\n\n    if (!auth)\n#endif /* PPP_AUTH_SUPPORT */\n    network_phase(pcb);\n}\n\n/*\n * Proceed to the network phase.\n */\nstatic void network_phase(ppp_pcb *pcb) {\n#if CBCP_SUPPORT\n    ppp_pcb *pcb = &ppp_pcb_list[unit];\n#endif\n#if 0 /* UNUSED */\n    lcp_options *go = &lcp_gotoptions[unit];\n#endif /* UNUSED */\n\n#if 0 /* UNUSED */\n    /* Log calling number. */\n    if (*remote_number)\n    ppp_notice(\"peer from calling number %q authorized\", remote_number);\n#endif /* UNUSED */\n\n#if PPP_NOTIFY\n    /*\n     * If the peer had to authenticate, notify it now.\n     */\n    if (0\n#if CHAP_SUPPORT\n    || go->neg_chap\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n    || go->neg_upap\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n    || go->neg_eap\n#endif /* EAP_SUPPORT */\n    ) {\n    notify(auth_up_notifier, 0);\n    }\n#endif /* PPP_NOTIFY */\n\n#if CBCP_SUPPORT\n    /*\n     * If we negotiated callback, do it now.\n     */\n    if (go->neg_cbcp) {\n    new_phase(pcb, PPP_PHASE_CALLBACK);\n    (*cbcp_protent.open)(pcb);\n    return;\n    }\n#endif\n\n#if PPP_OPTIONS\n    /*\n     * Process extra options from the secrets file\n     */\n    if (extra_options) {\n    options_from_list(extra_options, 1);\n    free_wordlist(extra_options);\n    extra_options = 0;\n    }\n#endif /* PPP_OPTIONS */\n    start_networks(pcb);\n}\n\nvoid start_networks(ppp_pcb *pcb) {\n#if CCP_SUPPORT || ECP_SUPPORT\n    int i;\n    const struct protent *protp;\n#endif /* CCP_SUPPORT || ECP_SUPPORT */\n\n    new_phase(pcb, PPP_PHASE_NETWORK);\n\n#ifdef HAVE_MULTILINK\n    if (multilink) {\n    if (mp_join_bundle()) {\n        if (multilink_join_hook)\n        (*multilink_join_hook)();\n        if (updetach && !nodetach)\n        detach();\n        return;\n    }\n    }\n#endif /* HAVE_MULTILINK */\n\n#ifdef PPP_FILTER\n    if (!demand)\n    set_filters(&pass_filter, &active_filter);\n#endif\n#if CCP_SUPPORT || ECP_SUPPORT\n    /* Start CCP and ECP */\n    for (i = 0; (protp = protocols[i]) != NULL; ++i)\n    if (\n        (0\n#if ECP_SUPPORT\n        || protp->protocol == PPP_ECP\n#endif /* ECP_SUPPORT */\n#if CCP_SUPPORT\n        || protp->protocol == PPP_CCP\n#endif /* CCP_SUPPORT */\n        )\n        && protp->open != NULL)\n        (*protp->open)(pcb);\n#endif /* CCP_SUPPORT || ECP_SUPPORT */\n\n    /*\n     * Bring up other network protocols iff encryption is not required.\n     */\n    if (1\n#if ECP_SUPPORT\n        && !ecp_gotoptions[unit].required\n#endif /* ECP_SUPPORT */\n#if MPPE_SUPPORT\n        && !pcb->ccp_gotoptions.mppe\n#endif /* MPPE_SUPPORT */\n        )\n    continue_networks(pcb);\n}\n\nvoid continue_networks(ppp_pcb *pcb) {\n    int i;\n    const struct protent *protp;\n\n    /*\n     * Start the \"real\" network protocols.\n     */\n    for (i = 0; (protp = protocols[i]) != NULL; ++i)\n    if (protp->protocol < 0xC000\n#if CCP_SUPPORT\n        && protp->protocol != PPP_CCP\n#endif /* CCP_SUPPORT */\n#if ECP_SUPPORT\n        && protp->protocol != PPP_ECP\n#endif /* ECP_SUPPORT */\n        && protp->open != NULL) {\n        (*protp->open)(pcb);\n        ++pcb->num_np_open;\n    }\n\n    if (pcb->num_np_open == 0)\n    /* nothing to do */\n    lcp_close(pcb, \"No network protocols running\");\n}\n\n#if PPP_AUTH_SUPPORT\n#if PPP_SERVER\n/*\n * auth_check_passwd - Check the user name and passwd against configuration.\n *\n * returns:\n *      0: Authentication failed.\n *      1: Authentication succeeded.\n * In either case, msg points to an appropriate message and msglen to the message len.\n */\nint auth_check_passwd(ppp_pcb *pcb, char *auser, int userlen, char *apasswd, int passwdlen, const char **msg, int *msglen) {\n  int secretuserlen;\n  int secretpasswdlen;\n\n  if (pcb->settings.user && pcb->settings.passwd) {\n    secretuserlen = (int)strlen(pcb->settings.user);\n    secretpasswdlen = (int)strlen(pcb->settings.passwd);\n    if (secretuserlen == userlen\n        && secretpasswdlen == passwdlen\n        && !memcmp(auser, pcb->settings.user, userlen)\n        && !memcmp(apasswd, pcb->settings.passwd, passwdlen) ) {\n      *msg = \"Login ok\";\n      *msglen = sizeof(\"Login ok\")-1;\n      return 1;\n    }\n  }\n\n  *msg = \"Login incorrect\";\n  *msglen = sizeof(\"Login incorrect\")-1;\n  return 0;\n}\n\n/*\n * The peer has failed to authenticate himself using `protocol'.\n */\nvoid auth_peer_fail(ppp_pcb *pcb, int protocol) {\n    LWIP_UNUSED_ARG(protocol);\n    /*\n     * Authentication failure: take the link down\n     */\n#if 0 /* UNUSED */\n    status = EXIT_PEER_AUTH_FAILED;\n#endif /* UNUSED */\n    pcb->err_code = PPPERR_AUTHFAIL;\n    lcp_close(pcb, \"Authentication failed\");\n}\n\n/*\n * The peer has been successfully authenticated using `protocol'.\n */\nvoid auth_peer_success(ppp_pcb *pcb, int protocol, int prot_flavor, const char *name, int namelen) {\n    int bit;\n#ifndef HAVE_MULTILINK\n    LWIP_UNUSED_ARG(name);\n    LWIP_UNUSED_ARG(namelen);\n#endif /* HAVE_MULTILINK */\n\n    switch (protocol) {\n#if CHAP_SUPPORT\n    case PPP_CHAP:\n    bit = CHAP_PEER;\n    switch (prot_flavor) {\n    case CHAP_MD5:\n        bit |= CHAP_MD5_PEER;\n        break;\n#if MSCHAP_SUPPORT\n    case CHAP_MICROSOFT:\n        bit |= CHAP_MS_PEER;\n        break;\n    case CHAP_MICROSOFT_V2:\n        bit |= CHAP_MS2_PEER;\n        break;\n#endif /* MSCHAP_SUPPORT */\n    default:\n        break;\n    }\n    break;\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n    case PPP_PAP:\n    bit = PAP_PEER;\n    break;\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n    case PPP_EAP:\n    bit = EAP_PEER;\n    break;\n#endif /* EAP_SUPPORT */\n    default:\n    ppp_warn(\"auth_peer_success: unknown protocol %x\", protocol);\n    return;\n    }\n\n#ifdef HAVE_MULTILINK\n    /*\n     * Save the authenticated name of the peer for later.\n     */\n    if (namelen > (int)sizeof(pcb->peer_authname) - 1)\n    namelen = (int)sizeof(pcb->peer_authname) - 1;\n    MEMCPY(pcb->peer_authname, name, namelen);\n    pcb->peer_authname[namelen] = 0;\n#endif /* HAVE_MULTILINK */\n#if 0 /* UNUSED */\n    script_setenv(\"PEERNAME\", , 0);\n#endif /* UNUSED */\n\n    /* Save the authentication method for later. */\n    pcb->auth_done |= bit;\n\n    /*\n     * If there is no more authentication still to be done,\n     * proceed to the network (or callback) phase.\n     */\n    if ((pcb->auth_pending &= ~bit) == 0)\n        network_phase(pcb);\n}\n#endif /* PPP_SERVER */\n\n/*\n * We have failed to authenticate ourselves to the peer using `protocol'.\n */\nvoid auth_withpeer_fail(ppp_pcb *pcb, int protocol) {\n    LWIP_UNUSED_ARG(protocol);\n    /*\n     * We've failed to authenticate ourselves to our peer.\n     *\n     * Some servers keep sending CHAP challenges, but there\n     * is no point in persisting without any way to get updated\n     * authentication secrets.\n     *\n     * He'll probably take the link down, and there's not much\n     * we can do except wait for that.\n     */\n    pcb->err_code = PPPERR_AUTHFAIL;\n    lcp_close(pcb, \"Failed to authenticate ourselves to peer\");\n}\n\n/*\n * We have successfully authenticated ourselves with the peer using `protocol'.\n */\nvoid auth_withpeer_success(ppp_pcb *pcb, int protocol, int prot_flavor) {\n    int bit;\n    const char *prot = \"\";\n\n    switch (protocol) {\n#if CHAP_SUPPORT\n    case PPP_CHAP:\n    bit = CHAP_WITHPEER;\n    prot = \"CHAP\";\n    switch (prot_flavor) {\n    case CHAP_MD5:\n        bit |= CHAP_MD5_WITHPEER;\n        break;\n#if MSCHAP_SUPPORT\n    case CHAP_MICROSOFT:\n        bit |= CHAP_MS_WITHPEER;\n        break;\n    case CHAP_MICROSOFT_V2:\n        bit |= CHAP_MS2_WITHPEER;\n        break;\n#endif /* MSCHAP_SUPPORT */\n    default:\n        break;\n    }\n    break;\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n    case PPP_PAP:\n    bit = PAP_WITHPEER;\n    prot = \"PAP\";\n    break;\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n    case PPP_EAP:\n    bit = EAP_WITHPEER;\n    prot = \"EAP\";\n    break;\n#endif /* EAP_SUPPORT */\n    default:\n    ppp_warn(\"auth_withpeer_success: unknown protocol %x\", protocol);\n    bit = 0;\n    /* no break */\n    }\n\n    ppp_notice(\"%s authentication succeeded\", prot);\n\n    /* Save the authentication method for later. */\n    pcb->auth_done |= bit;\n\n    /*\n     * If there is no more authentication still being done,\n     * proceed to the network (or callback) phase.\n     */\n    if ((pcb->auth_pending &= ~bit) == 0)\n    network_phase(pcb);\n}\n#endif /* PPP_AUTH_SUPPORT */\n\n\n/*\n * np_up - a network protocol has come up.\n */\nvoid np_up(ppp_pcb *pcb, int proto) {\n#if PPP_IDLETIMELIMIT\n    int tlim;\n#endif /* PPP_IDLETIMELIMIT */\n    LWIP_UNUSED_ARG(proto);\n\n    if (pcb->num_np_up == 0) {\n    /*\n     * At this point we consider that the link has come up successfully.\n     */\n    new_phase(pcb, PPP_PHASE_RUNNING);\n\n#if PPP_IDLETIMELIMIT\n#if 0 /* UNUSED */\n    if (idle_time_hook != 0)\n        tlim = (*idle_time_hook)(NULL);\n    else\n#endif /* UNUSED */\n        tlim = pcb->settings.idle_time_limit;\n    if (tlim > 0)\n        TIMEOUT(check_idle, (void*)pcb, tlim);\n#endif /* PPP_IDLETIMELIMIT */\n\n#if PPP_MAXCONNECT\n    /*\n     * Set a timeout to close the connection once the maximum\n     * connect time has expired.\n     */\n    if (pcb->settings.maxconnect > 0)\n        TIMEOUT(connect_time_expired, (void*)pcb, pcb->settings.maxconnect);\n#endif /* PPP_MAXCONNECT */\n\n#ifdef MAXOCTETS\n    if (maxoctets > 0)\n        TIMEOUT(check_maxoctets, NULL, maxoctets_timeout);\n#endif\n\n#if 0 /* Unused */\n    /*\n     * Detach now, if the updetach option was given.\n     */\n    if (updetach && !nodetach)\n        detach();\n#endif /* Unused */\n    }\n    ++pcb->num_np_up;\n}\n\n/*\n * np_down - a network protocol has gone down.\n */\nvoid np_down(ppp_pcb *pcb, int proto) {\n    LWIP_UNUSED_ARG(proto);\n    if (--pcb->num_np_up == 0) {\n#if PPP_IDLETIMELIMIT\n    UNTIMEOUT(check_idle, (void*)pcb);\n#endif /* PPP_IDLETIMELIMIT */\n#if PPP_MAXCONNECT\n    UNTIMEOUT(connect_time_expired, NULL);\n#endif /* PPP_MAXCONNECT */\n#ifdef MAXOCTETS\n    UNTIMEOUT(check_maxoctets, NULL);\n#endif\n    new_phase(pcb, PPP_PHASE_NETWORK);\n    }\n}\n\n/*\n * np_finished - a network protocol has finished using the link.\n */\nvoid np_finished(ppp_pcb *pcb, int proto) {\n    LWIP_UNUSED_ARG(proto);\n    if (--pcb->num_np_open <= 0) {\n    /* no further use for the link: shut up shop. */\n    lcp_close(pcb, \"No network protocols running\");\n    }\n}\n\n#ifdef MAXOCTETS\nstatic void\ncheck_maxoctets(arg)\n    void *arg;\n{\n#if PPP_STATS_SUPPORT\n    unsigned int used;\n\n    update_link_stats(ifunit);\n    link_stats_valid=0;\n\n    switch(maxoctets_dir) {\n    case PPP_OCTETS_DIRECTION_IN:\n        used = link_stats.bytes_in;\n        break;\n    case PPP_OCTETS_DIRECTION_OUT:\n        used = link_stats.bytes_out;\n        break;\n    case PPP_OCTETS_DIRECTION_MAXOVERAL:\n    case PPP_OCTETS_DIRECTION_MAXSESSION:\n        used = (link_stats.bytes_in > link_stats.bytes_out) ? link_stats.bytes_in : link_stats.bytes_out;\n        break;\n    default:\n        used = link_stats.bytes_in+link_stats.bytes_out;\n        break;\n    }\n    if (used > maxoctets) {\n    ppp_notice(\"Traffic limit reached. Limit: %u Used: %u\", maxoctets, used);\n    status = EXIT_TRAFFIC_LIMIT;\n    lcp_close(pcb, \"Traffic limit\");\n#if 0 /* UNUSED */\n    need_holdoff = 0;\n#endif /* UNUSED */\n    } else {\n        TIMEOUT(check_maxoctets, NULL, maxoctets_timeout);\n    }\n#endif /* PPP_STATS_SUPPORT */\n}\n#endif /* MAXOCTETS */\n\n#if PPP_IDLETIMELIMIT\n/*\n * check_idle - check whether the link has been idle for long\n * enough that we can shut it down.\n */\nstatic void check_idle(void *arg) {\n    ppp_pcb *pcb = (ppp_pcb*)arg;\n    struct ppp_idle idle;\n    time_t itime;\n    int tlim;\n\n    if (!get_idle_time(pcb, &idle))\n    return;\n#if 0 /* UNUSED */\n    if (idle_time_hook != 0) {\n    tlim = idle_time_hook(&idle);\n    } else {\n#endif /* UNUSED */\n    itime = LWIP_MIN(idle.xmit_idle, idle.recv_idle);\n    tlim = pcb->settings.idle_time_limit - itime;\n#if 0 /* UNUSED */\n    }\n#endif /* UNUSED */\n    if (tlim <= 0) {\n    /* link is idle: shut it down. */\n    ppp_notice(\"Terminating connection due to lack of activity.\");\n    pcb->err_code = PPPERR_IDLETIMEOUT;\n    lcp_close(pcb, \"Link inactive\");\n#if 0 /* UNUSED */\n    need_holdoff = 0;\n#endif /* UNUSED */\n    } else {\n    TIMEOUT(check_idle, (void*)pcb, tlim);\n    }\n}\n#endif /* PPP_IDLETIMELIMIT */\n\n#if PPP_MAXCONNECT\n/*\n * connect_time_expired - log a message and close the connection.\n */\nstatic void connect_time_expired(void *arg) {\n    ppp_pcb *pcb = (ppp_pcb*)arg;\n    ppp_info(\"Connect time expired\");\n    pcb->err_code = PPPERR_CONNECTTIME;\n    lcp_close(pcb, \"Connect time expired\");    /* Close connection */\n}\n#endif /* PPP_MAXCONNECT */\n\n#if PPP_OPTIONS\n/*\n * auth_check_options - called to check authentication options.\n */\nvoid\nauth_check_options()\n{\n    lcp_options *wo = &lcp_wantoptions[0];\n    int can_auth;\n    int lacks_ip;\n\n    /* Default our_name to hostname, and user to our_name */\n    if (our_name[0] == 0 || usehostname)\n    strlcpy(our_name, hostname, sizeof(our_name));\n    /* If a blank username was explicitly given as an option, trust\n       the user and don't use our_name */\n    if (ppp_settings.user[0] == 0 && !explicit_user)\n    strlcpy(ppp_settings.user, our_name, sizeof(ppp_settings.user));\n\n    /*\n     * If we have a default route, require the peer to authenticate\n     * unless the noauth option was given or the real user is root.\n     */\n    if (!auth_required && !allow_any_ip && have_route_to(0) && !privileged) {\n    auth_required = 1;\n    default_auth = 1;\n    }\n\n#if CHAP_SUPPORT\n    /* If we selected any CHAP flavors, we should probably negotiate it. :-) */\n    if (wo->chap_mdtype)\n    wo->neg_chap = 1;\n#endif /* CHAP_SUPPORT */\n\n    /* If authentication is required, ask peer for CHAP, PAP, or EAP. */\n    if (auth_required) {\n    allow_any_ip = 0;\n    if (1\n#if CHAP_SUPPORT\n        && !wo->neg_chap\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n        && !wo->neg_upap\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n        && !wo->neg_eap\n#endif /* EAP_SUPPORT */\n        ) {\n#if CHAP_SUPPORT\n        wo->neg_chap = CHAP_MDTYPE_SUPPORTED != MDTYPE_NONE;\n        wo->chap_mdtype = CHAP_MDTYPE_SUPPORTED;\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n        wo->neg_upap = 1;\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n        wo->neg_eap = 1;\n#endif /* EAP_SUPPORT */\n    }\n    } else {\n#if CHAP_SUPPORT\n    wo->neg_chap = 0;\n    wo->chap_mdtype = MDTYPE_NONE;\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n    wo->neg_upap = 0;\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n    wo->neg_eap = 0;\n#endif /* EAP_SUPPORT */\n    }\n\n    /*\n     * Check whether we have appropriate secrets to use\n     * to authenticate the peer.  Note that EAP can authenticate by way\n     * of a CHAP-like exchanges as well as SRP.\n     */\n    lacks_ip = 0;\n#if PAP_SUPPORT\n    can_auth = wo->neg_upap && (uselogin || have_pap_secret(&lacks_ip));\n#else\n    can_auth = 0;\n#endif /* PAP_SUPPORT */\n    if (!can_auth && (0\n#if CHAP_SUPPORT\n    || wo->neg_chap\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n    || wo->neg_eap\n#endif /* EAP_SUPPORT */\n    )) {\n#if CHAP_SUPPORT\n    can_auth = have_chap_secret((explicit_remote? remote_name: NULL),\n                    our_name, 1, &lacks_ip);\n#else\n    can_auth = 0;\n#endif\n    }\n    if (!can_auth\n#if EAP_SUPPORT\n    && wo->neg_eap\n#endif /* EAP_SUPPORT */\n    ) {\n    can_auth = have_srp_secret((explicit_remote? remote_name: NULL),\n                    our_name, 1, &lacks_ip);\n    }\n\n    if (auth_required && !can_auth && noauth_addrs == NULL) {\n    if (default_auth) {\n        option_error(\n\"By default the remote system is required to authenticate itself\");\n        option_error(\n\"(because this system has a default route to the internet)\");\n    } else if (explicit_remote)\n        option_error(\n\"The remote system (%s) is required to authenticate itself\",\n             remote_name);\n    else\n        option_error(\n\"The remote system is required to authenticate itself\");\n    option_error(\n\"but I couldn't find any suitable secret (password) for it to use to do so.\");\n    if (lacks_ip)\n        option_error(\n\"(None of the available passwords would let it use an IP address.)\");\n\n    exit(1);\n    }\n\n    /*\n     * Early check for remote number authorization.\n     */\n    if (!auth_number()) {\n    ppp_warn(\"calling number %q is not authorized\", remote_number);\n    exit(EXIT_CNID_AUTH_FAILED);\n    }\n}\n#endif /* PPP_OPTIONS */\n\n#if 0 /* UNUSED */\n/*\n * auth_reset - called when LCP is starting negotiations to recheck\n * authentication options, i.e. whether we have appropriate secrets\n * to use for authenticating ourselves and/or the peer.\n */\nvoid\nauth_reset(unit)\n    int unit;\n{\n    lcp_options *go = &lcp_gotoptions[unit];\n    lcp_options *ao = &lcp_allowoptions[unit];\n    int hadchap;\n\n    hadchap = -1;\n    ao->neg_upap = !refuse_pap && (passwd[0] != 0 || get_pap_passwd(NULL));\n    ao->neg_chap = (!refuse_chap || !refuse_mschap || !refuse_mschap_v2)\n    && (passwd[0] != 0 ||\n        (hadchap = have_chap_secret(user, (explicit_remote? remote_name:\n                           NULL), 0, NULL)));\n    ao->neg_eap = !refuse_eap && (\n    passwd[0] != 0 ||\n    (hadchap == 1 || (hadchap == -1 && have_chap_secret(user,\n        (explicit_remote? remote_name: NULL), 0, NULL))) ||\n    have_srp_secret(user, (explicit_remote? remote_name: NULL), 0, NULL));\n\n    hadchap = -1;\n    if (go->neg_upap && !uselogin && !have_pap_secret(NULL))\n    go->neg_upap = 0;\n    if (go->neg_chap) {\n    if (!(hadchap = have_chap_secret((explicit_remote? remote_name: NULL),\n                  our_name, 1, NULL)))\n        go->neg_chap = 0;\n    }\n    if (go->neg_eap &&\n    (hadchap == 0 || (hadchap == -1 &&\n        !have_chap_secret((explicit_remote? remote_name: NULL), our_name,\n        1, NULL))) &&\n    !have_srp_secret((explicit_remote? remote_name: NULL), our_name, 1,\n        NULL))\n    go->neg_eap = 0;\n}\n\n/*\n * check_passwd - Check the user name and passwd against the PAP secrets\n * file.  If requested, also check against the system password database,\n * and login the user if OK.\n *\n * returns:\n *    UPAP_AUTHNAK: Authentication failed.\n *    UPAP_AUTHACK: Authentication succeeded.\n * In either case, msg points to an appropriate message.\n */\nint\ncheck_passwd(unit, auser, userlen, apasswd, passwdlen, msg)\n    int unit;\n    char *auser;\n    int userlen;\n    char *apasswd;\n    int passwdlen;\n    char **msg;\n{\n  return UPAP_AUTHNAK;\n    int ret;\n    char *filename;\n    FILE *f;\n    struct wordlist *addrs = NULL, *opts = NULL;\n    char passwd[256], user[256];\n    char secret[MAXWORDLEN];\n    static int attempts = 0;\n\n    /*\n     * Make copies of apasswd and auser, then null-terminate them.\n     * If there are unprintable characters in the password, make\n     * them visible.\n     */\n    slprintf(ppp_settings.passwd, sizeof(ppp_settings.passwd), \"%.*v\", passwdlen, apasswd);\n    slprintf(ppp_settings.user, sizeof(ppp_settings.user), \"%.*v\", userlen, auser);\n    *msg = \"\";\n\n    /*\n     * Check if a plugin wants to handle this.\n     */\n    if (pap_auth_hook) {\n    ret = (*pap_auth_hook)(ppp_settings.user, ppp_settings.passwd, msg, &addrs, &opts);\n    if (ret >= 0) {\n        /* note: set_allowed_addrs() saves opts (but not addrs):\n           don't free it! */\n        if (ret)\n        set_allowed_addrs(unit, addrs, opts);\n        else if (opts != 0)\n        free_wordlist(opts);\n        if (addrs != 0)\n        free_wordlist(addrs);\n        BZERO(ppp_settings.passwd, sizeof(ppp_settings.passwd));\n        return ret? UPAP_AUTHACK: UPAP_AUTHNAK;\n    }\n    }\n\n    /*\n     * Open the file of pap secrets and scan for a suitable secret\n     * for authenticating this user.\n     */\n    filename = _PATH_UPAPFILE;\n    addrs = opts = NULL;\n    ret = UPAP_AUTHNAK;\n    f = fopen(filename, \"r\");\n    if (f == NULL) {\n    ppp_error(\"Can't open PAP password file %s: %m\", filename);\n\n    } else {\n    check_access(f, filename);\n    if (scan_authfile(f, ppp_settings.user, our_name, secret, &addrs, &opts, filename, 0) < 0) {\n        ppp_warn(\"no PAP secret found for %s\", user);\n    } else {\n        /*\n         * If the secret is \"@login\", it means to check\n         * the password against the login database.\n         */\n        int login_secret = strcmp(secret, \"@login\") == 0;\n        ret = UPAP_AUTHACK;\n        if (uselogin || login_secret) {\n        /* login option or secret is @login */\n        if (session_full(ppp_settings.user, ppp_settings.passwd, devnam, msg) == 0) {\n            ret = UPAP_AUTHNAK;\n        }\n        } else if (session_mgmt) {\n        if (session_check(ppp_settings.user, NULL, devnam, NULL) == 0) {\n            ppp_warn(\"Peer %q failed PAP Session verification\", user);\n            ret = UPAP_AUTHNAK;\n        }\n        }\n        if (secret[0] != 0 && !login_secret) {\n        /* password given in pap-secrets - must match */\n        if ((cryptpap || strcmp(ppp_settings.passwd, secret) != 0)\n            && strcmp(crypt(ppp_settings.passwd, secret), secret) != 0)\n            ret = UPAP_AUTHNAK;\n        }\n    }\n    fclose(f);\n    }\n\n    if (ret == UPAP_AUTHNAK) {\n        if (**msg == 0)\n        *msg = \"Login incorrect\";\n    /*\n     * XXX can we ever get here more than once??\n     * Frustrate passwd stealer programs.\n     * Allow 10 tries, but start backing off after 3 (stolen from login).\n     * On 10'th, drop the connection.\n     */\n    if (attempts++ >= 10) {\n        ppp_warn(\"%d LOGIN FAILURES ON %s, %s\", attempts, devnam, user);\n        lcp_close(pcb, \"login failed\");\n    }\n    if (attempts > 3)\n        sleep((u_int) (attempts - 3) * 5);\n    if (opts != NULL)\n        free_wordlist(opts);\n\n    } else {\n    attempts = 0;            /* Reset count */\n    if (**msg == 0)\n        *msg = \"Login ok\";\n    set_allowed_addrs(unit, addrs, opts);\n    }\n\n    if (addrs != NULL)\n    free_wordlist(addrs);\n    BZERO(ppp_settings.passwd, sizeof(ppp_settings.passwd));\n    BZERO(secret, sizeof(secret));\n\n    return ret;\n}\n\n/*\n * null_login - Check if a username of \"\" and a password of \"\" are\n * acceptable, and iff so, set the list of acceptable IP addresses\n * and return 1.\n */\nstatic int\nnull_login(unit)\n    int unit;\n{\n    char *filename;\n    FILE *f;\n    int i, ret;\n    struct wordlist *addrs, *opts;\n    char secret[MAXWORDLEN];\n\n    /*\n     * Check if a plugin wants to handle this.\n     */\n    ret = -1;\n    if (null_auth_hook)\n    ret = (*null_auth_hook)(&addrs, &opts);\n\n    /*\n     * Open the file of pap secrets and scan for a suitable secret.\n     */\n    if (ret <= 0) {\n    filename = _PATH_UPAPFILE;\n    addrs = NULL;\n    f = fopen(filename, \"r\");\n    if (f == NULL)\n        return 0;\n    check_access(f, filename);\n\n    i = scan_authfile(f, \"\", our_name, secret, &addrs, &opts, filename, 0);\n    ret = i >= 0 && secret[0] == 0;\n    BZERO(secret, sizeof(secret));\n    fclose(f);\n    }\n\n    if (ret)\n    set_allowed_addrs(unit, addrs, opts);\n    else if (opts != 0)\n    free_wordlist(opts);\n    if (addrs != 0)\n    free_wordlist(addrs);\n\n    return ret;\n}\n\n/*\n * get_pap_passwd - get a password for authenticating ourselves with\n * our peer using PAP.  Returns 1 on success, 0 if no suitable password\n * could be found.\n * Assumes passwd points to MAXSECRETLEN bytes of space (if non-null).\n */\nstatic int\nget_pap_passwd(passwd)\n    char *passwd;\n{\n    char *filename;\n    FILE *f;\n    int ret;\n    char secret[MAXWORDLEN];\n\n    /*\n     * Check whether a plugin wants to supply this.\n     */\n    if (pap_passwd_hook) {\n    ret = (*pap_passwd_hook)(ppp_settings,user, ppp_settings.passwd);\n    if (ret >= 0)\n        return ret;\n    }\n\n    filename = _PATH_UPAPFILE;\n    f = fopen(filename, \"r\");\n    if (f == NULL)\n    return 0;\n    check_access(f, filename);\n    ret = scan_authfile(f, user,\n            (remote_name[0]? remote_name: NULL),\n            secret, NULL, NULL, filename, 0);\n    fclose(f);\n    if (ret < 0)\n    return 0;\n    if (passwd != NULL)\n    strlcpy(passwd, secret, MAXSECRETLEN);\n    BZERO(secret, sizeof(secret));\n    return 1;\n}\n\n/*\n * have_pap_secret - check whether we have a PAP file with any\n * secrets that we could possibly use for authenticating the peer.\n */\nstatic int\nhave_pap_secret(lacks_ipp)\n    int *lacks_ipp;\n{\n    FILE *f;\n    int ret;\n    char *filename;\n    struct wordlist *addrs;\n\n    /* let the plugin decide, if there is one */\n    if (pap_check_hook) {\n    ret = (*pap_check_hook)();\n    if (ret >= 0)\n        return ret;\n    }\n\n    filename = _PATH_UPAPFILE;\n    f = fopen(filename, \"r\");\n    if (f == NULL)\n    return 0;\n\n    ret = scan_authfile(f, (explicit_remote? remote_name: NULL), our_name,\n            NULL, &addrs, NULL, filename, 0);\n    fclose(f);\n    if (ret >= 0 && !some_ip_ok(addrs)) {\n    if (lacks_ipp != 0)\n        *lacks_ipp = 1;\n    ret = -1;\n    }\n    if (addrs != 0)\n    free_wordlist(addrs);\n\n    return ret >= 0;\n}\n\n/*\n * have_chap_secret - check whether we have a CHAP file with a\n * secret that we could possibly use for authenticating `client'\n * on `server'.  Either can be the null string, meaning we don't\n * know the identity yet.\n */\nstatic int\nhave_chap_secret(client, server, need_ip, lacks_ipp)\n    char *client;\n    char *server;\n    int need_ip;\n    int *lacks_ipp;\n{\n    FILE *f;\n    int ret;\n    char *filename;\n    struct wordlist *addrs;\n\n    if (chap_check_hook) {\n    ret = (*chap_check_hook)();\n    if (ret >= 0) {\n        return ret;\n    }\n    }\n\n    filename = _PATH_CHAPFILE;\n    f = fopen(filename, \"r\");\n    if (f == NULL)\n    return 0;\n\n    if (client != NULL && client[0] == 0)\n    client = NULL;\n    else if (server != NULL && server[0] == 0)\n    server = NULL;\n\n    ret = scan_authfile(f, client, server, NULL, &addrs, NULL, filename, 0);\n    fclose(f);\n    if (ret >= 0 && need_ip && !some_ip_ok(addrs)) {\n    if (lacks_ipp != 0)\n        *lacks_ipp = 1;\n    ret = -1;\n    }\n    if (addrs != 0)\n    free_wordlist(addrs);\n\n    return ret >= 0;\n}\n\n/*\n * have_srp_secret - check whether we have a SRP file with a\n * secret that we could possibly use for authenticating `client'\n * on `server'.  Either can be the null string, meaning we don't\n * know the identity yet.\n */\nstatic int\nhave_srp_secret(client, server, need_ip, lacks_ipp)\n    char *client;\n    char *server;\n    int need_ip;\n    int *lacks_ipp;\n{\n    FILE *f;\n    int ret;\n    char *filename;\n    struct wordlist *addrs;\n\n    filename = _PATH_SRPFILE;\n    f = fopen(filename, \"r\");\n    if (f == NULL)\n    return 0;\n\n    if (client != NULL && client[0] == 0)\n    client = NULL;\n    else if (server != NULL && server[0] == 0)\n    server = NULL;\n\n    ret = scan_authfile(f, client, server, NULL, &addrs, NULL, filename, 0);\n    fclose(f);\n    if (ret >= 0 && need_ip && !some_ip_ok(addrs)) {\n    if (lacks_ipp != 0)\n        *lacks_ipp = 1;\n    ret = -1;\n    }\n    if (addrs != 0)\n    free_wordlist(addrs);\n\n    return ret >= 0;\n}\n#endif /* UNUSED */\n\n#if PPP_AUTH_SUPPORT\n/*\n * get_secret - open the CHAP secret file and return the secret\n * for authenticating the given client on the given server.\n * (We could be either client or server).\n */\nint get_secret(ppp_pcb *pcb, const char *client, const char *server, char *secret, int *secret_len, int am_server) {\n  int len;\n  LWIP_UNUSED_ARG(server);\n  LWIP_UNUSED_ARG(am_server);\n\n  if (!client || !client[0] || !pcb->settings.user || !pcb->settings.passwd || strcmp(client, pcb->settings.user)) {\n    return 0;\n  }\n\n  len = (int)strlen(pcb->settings.passwd);\n  if (len > MAXSECRETLEN) {\n    ppp_error(\"Secret for %s on %s is too long\", client, server);\n    len = MAXSECRETLEN;\n  }\n\n  MEMCPY(secret, pcb->settings.passwd, len);\n  *secret_len = len;\n  return 1;\n\n#if 0 /* UNUSED */\n    FILE *f;\n    int ret, len;\n    char *filename;\n    struct wordlist *addrs, *opts;\n    char secbuf[MAXWORDLEN];\n    struct wordlist *addrs;\n    addrs = NULL;\n\n    if (!am_server && ppp_settings.passwd[0] != 0) {\n    strlcpy(secbuf, ppp_settings.passwd, sizeof(secbuf));\n    } else if (!am_server && chap_passwd_hook) {\n    if ( (*chap_passwd_hook)(client, secbuf) < 0) {\n        ppp_error(\"Unable to obtain CHAP password for %s on %s from plugin\",\n          client, server);\n        return 0;\n    }\n    } else {\n    filename = _PATH_CHAPFILE;\n    addrs = NULL;\n    secbuf[0] = 0;\n\n    f = fopen(filename, \"r\");\n    if (f == NULL) {\n        ppp_error(\"Can't open chap secret file %s: %m\", filename);\n        return 0;\n    }\n    check_access(f, filename);\n\n    ret = scan_authfile(f, client, server, secbuf, &addrs, &opts, filename, 0);\n    fclose(f);\n    if (ret < 0)\n        return 0;\n\n    if (am_server)\n        set_allowed_addrs(unit, addrs, opts);\n    else if (opts != 0)\n        free_wordlist(opts);\n    if (addrs != 0)\n        free_wordlist(addrs);\n    }\n\n    len = strlen(secbuf);\n    if (len > MAXSECRETLEN) {\n    ppp_error(\"Secret for %s on %s is too long\", client, server);\n    len = MAXSECRETLEN;\n    }\n    MEMCPY(secret, secbuf, len);\n    BZERO(secbuf, sizeof(secbuf));\n    *secret_len = len;\n\n    return 1;\n#endif /* UNUSED */\n}\n#endif /* PPP_AUTH_SUPPORT */\n\n\n#if 0 /* UNUSED */\n/*\n * get_srp_secret - open the SRP secret file and return the secret\n * for authenticating the given client on the given server.\n * (We could be either client or server).\n */\nint\nget_srp_secret(unit, client, server, secret, am_server)\n    int unit;\n    char *client;\n    char *server;\n    char *secret;\n    int am_server;\n{\n    FILE *fp;\n    int ret;\n    char *filename;\n    struct wordlist *addrs, *opts;\n\n    if (!am_server && ppp_settings.passwd[0] != '\\0') {\n    strlcpy(secret, ppp_settings.passwd, MAXWORDLEN);\n    } else {\n    filename = _PATH_SRPFILE;\n    addrs = NULL;\n\n    fp = fopen(filename, \"r\");\n    if (fp == NULL) {\n        ppp_error(\"Can't open srp secret file %s: %m\", filename);\n        return 0;\n    }\n    check_access(fp, filename);\n\n    secret[0] = '\\0';\n    ret = scan_authfile(fp, client, server, secret, &addrs, &opts,\n        filename, am_server);\n    fclose(fp);\n    if (ret < 0)\n        return 0;\n\n    if (am_server)\n        set_allowed_addrs(unit, addrs, opts);\n    else if (opts != NULL)\n        free_wordlist(opts);\n    if (addrs != NULL)\n        free_wordlist(addrs);\n    }\n\n    return 1;\n}\n\n/*\n * set_allowed_addrs() - set the list of allowed addresses.\n * Also looks for `--' indicating options to apply for this peer\n * and leaves the following words in extra_options.\n */\nstatic void\nset_allowed_addrs(unit, addrs, opts)\n    int unit;\n    struct wordlist *addrs;\n    struct wordlist *opts;\n{\n    int n;\n    struct wordlist *ap, **plink;\n    struct permitted_ip *ip;\n    char *ptr_word, *ptr_mask;\n    struct hostent *hp;\n    struct netent *np;\n    u32_t a, mask, ah, offset;\n    struct ipcp_options *wo = &ipcp_wantoptions[unit];\n    u32_t suggested_ip = 0;\n\n    if (addresses[unit] != NULL)\n    free(addresses[unit]);\n    addresses[unit] = NULL;\n    if (extra_options != NULL)\n    free_wordlist(extra_options);\n    extra_options = opts;\n\n    /*\n     * Count the number of IP addresses given.\n     */\n    n = wordlist_count(addrs) + wordlist_count(noauth_addrs);\n    if (n == 0)\n    return;\n    ip = (struct permitted_ip *) malloc((n + 1) * sizeof(struct permitted_ip));\n    if (ip == 0)\n    return;\n\n    /* temporarily append the noauth_addrs list to addrs */\n    for (plink = &addrs; *plink != NULL; plink = &(*plink)->next)\n    ;\n    *plink = noauth_addrs;\n\n    n = 0;\n    for (ap = addrs; ap != NULL; ap = ap->next) {\n    /* \"-\" means no addresses authorized, \"*\" means any address allowed */\n    ptr_word = ap->word;\n    if (strcmp(ptr_word, \"-\") == 0)\n        break;\n    if (strcmp(ptr_word, \"*\") == 0) {\n        ip[n].permit = 1;\n        ip[n].base = ip[n].mask = 0;\n        ++n;\n        break;\n    }\n\n    ip[n].permit = 1;\n    if (*ptr_word == '!') {\n        ip[n].permit = 0;\n        ++ptr_word;\n    }\n\n    mask = ~ (u32_t) 0;\n    offset = 0;\n    ptr_mask = strchr (ptr_word, '/');\n    if (ptr_mask != NULL) {\n        int bit_count;\n        char *endp;\n\n        bit_count = (int) strtol (ptr_mask+1, &endp, 10);\n        if (bit_count <= 0 || bit_count > 32) {\n        ppp_warn(\"invalid address length %v in auth. address list\",\n             ptr_mask+1);\n        continue;\n        }\n        bit_count = 32 - bit_count;    /* # bits in host part */\n        if (*endp == '+') {\n        offset = ifunit + 1;\n        ++endp;\n        }\n        if (*endp != 0) {\n        ppp_warn(\"invalid address length syntax: %v\", ptr_mask+1);\n        continue;\n        }\n        *ptr_mask = '\\0';\n        mask <<= bit_count;\n    }\n\n    hp = gethostbyname(ptr_word);\n    if (hp != NULL && hp->h_addrtype == AF_INET) {\n        a = *(u32_t *)hp->h_addr;\n    } else {\n        np = getnetbyname (ptr_word);\n        if (np != NULL && np->n_addrtype == AF_INET) {\n        a = lwip_htonl ((u32_t)np->n_net);\n        if (ptr_mask == NULL) {\n            /* calculate appropriate mask for net */\n            ah = lwip_ntohl(a);\n            if (IN_CLASSA(ah))\n            mask = IN_CLASSA_NET;\n            else if (IN_CLASSB(ah))\n            mask = IN_CLASSB_NET;\n            else if (IN_CLASSC(ah))\n            mask = IN_CLASSC_NET;\n        }\n        } else {\n        a = inet_addr (ptr_word);\n        }\n    }\n\n    if (ptr_mask != NULL)\n        *ptr_mask = '/';\n\n    if (a == (u32_t)-1L) {\n        ppp_warn(\"unknown host %s in auth. address list\", ap->word);\n        continue;\n    }\n    if (offset != 0) {\n        if (offset >= ~mask) {\n        ppp_warn(\"interface unit %d too large for subnet %v\",\n             ifunit, ptr_word);\n        continue;\n        }\n        a = lwip_htonl((lwip_ntohl(a) & mask) + offset);\n        mask = ~(u32_t)0;\n    }\n    ip[n].mask = lwip_htonl(mask);\n    ip[n].base = a & ip[n].mask;\n    ++n;\n    if (~mask == 0 && suggested_ip == 0)\n        suggested_ip = a;\n    }\n    *plink = NULL;\n\n    ip[n].permit = 0;        /* make the last entry forbid all addresses */\n    ip[n].base = 0;        /* to terminate the list */\n    ip[n].mask = 0;\n\n    addresses[unit] = ip;\n\n    /*\n     * If the address given for the peer isn't authorized, or if\n     * the user hasn't given one, AND there is an authorized address\n     * which is a single host, then use that if we find one.\n     */\n    if (suggested_ip != 0\n    && (wo->hisaddr == 0 || !auth_ip_addr(unit, wo->hisaddr))) {\n    wo->hisaddr = suggested_ip;\n    /*\n     * Do we insist on this address?  No, if there are other\n     * addresses authorized than the suggested one.\n     */\n    if (n > 1)\n        wo->accept_remote = 1;\n    }\n}\n\n/*\n * auth_ip_addr - check whether the peer is authorized to use\n * a given IP address.  Returns 1 if authorized, 0 otherwise.\n */\nint\nauth_ip_addr(unit, addr)\n    int unit;\n    u32_t addr;\n{\n    int ok;\n\n    /* don't allow loopback or multicast address */\n    if (bad_ip_adrs(addr))\n    return 0;\n\n    if (allowed_address_hook) {\n    ok = allowed_address_hook(addr);\n    if (ok >= 0) return ok;\n    }\n\n    if (addresses[unit] != NULL) {\n    ok = ip_addr_check(addr, addresses[unit]);\n    if (ok >= 0)\n        return ok;\n    }\n\n    if (auth_required)\n    return 0;        /* no addresses authorized */\n    return allow_any_ip || privileged || !have_route_to(addr);\n}\n\nstatic int\nip_addr_check(addr, addrs)\n    u32_t addr;\n    struct permitted_ip *addrs;\n{\n    for (; ; ++addrs)\n    if ((addr & addrs->mask) == addrs->base)\n        return addrs->permit;\n}\n\n/*\n * bad_ip_adrs - return 1 if the IP address is one we don't want\n * to use, such as an address in the loopback net or a multicast address.\n * addr is in network byte order.\n */\nint\nbad_ip_adrs(addr)\n    u32_t addr;\n{\n    addr = lwip_ntohl(addr);\n    return (addr >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET\n    || IN_MULTICAST(addr) || IN_BADCLASS(addr);\n}\n\n/*\n * some_ip_ok - check a wordlist to see if it authorizes any\n * IP address(es).\n */\nstatic int\nsome_ip_ok(addrs)\n    struct wordlist *addrs;\n{\n    for (; addrs != 0; addrs = addrs->next) {\n    if (addrs->word[0] == '-')\n        break;\n    if (addrs->word[0] != '!')\n        return 1;        /* some IP address is allowed */\n    }\n    return 0;\n}\n\n/*\n * auth_number - check whether the remote number is allowed to connect.\n * Returns 1 if authorized, 0 otherwise.\n */\nint\nauth_number()\n{\n    struct wordlist *wp = permitted_numbers;\n    int l;\n\n    /* Allow all if no authorization list. */\n    if (!wp)\n    return 1;\n\n    /* Allow if we have a match in the authorization list. */\n    while (wp) {\n    /* trailing '*' wildcard */\n    l = strlen(wp->word);\n    if ((wp->word)[l - 1] == '*')\n        l--;\n    if (!strncasecmp(wp->word, remote_number, l))\n        return 1;\n    wp = wp->next;\n    }\n\n    return 0;\n}\n\n/*\n * check_access - complain if a secret file has too-liberal permissions.\n */\nstatic void\ncheck_access(f, filename)\n    FILE *f;\n    char *filename;\n{\n    struct stat sbuf;\n\n    if (fstat(fileno(f), &sbuf) < 0) {\n    ppp_warn(\"cannot stat secret file %s: %m\", filename);\n    } else if ((sbuf.st_mode & (S_IRWXG | S_IRWXO)) != 0) {\n    ppp_warn(\"Warning - secret file %s has world and/or group access\",\n         filename);\n    }\n}\n\n/*\n * scan_authfile - Scan an authorization file for a secret suitable\n * for authenticating `client' on `server'.  The return value is -1\n * if no secret is found, otherwise >= 0.  The return value has\n * NONWILD_CLIENT set if the secret didn't have \"*\" for the client, and\n * NONWILD_SERVER set if the secret didn't have \"*\" for the server.\n * Any following words on the line up to a \"--\" (i.e. address authorization\n * info) are placed in a wordlist and returned in *addrs.  Any\n * following words (extra options) are placed in a wordlist and\n * returned in *opts.\n * We assume secret is NULL or points to MAXWORDLEN bytes of space.\n * Flags are non-zero if we need two colons in the secret in order to\n * match.\n */\nstatic int\nscan_authfile(f, client, server, secret, addrs, opts, filename, flags)\n    FILE *f;\n    char *client;\n    char *server;\n    char *secret;\n    struct wordlist **addrs;\n    struct wordlist **opts;\n    char *filename;\n    int flags;\n{\n    int newline, xxx;\n    int got_flag, best_flag;\n    FILE *sf;\n    struct wordlist *ap, *addr_list, *alist, **app;\n    char word[MAXWORDLEN];\n    char atfile[MAXWORDLEN];\n    char lsecret[MAXWORDLEN];\n    char *cp;\n\n    if (addrs != NULL)\n    *addrs = NULL;\n    if (opts != NULL)\n    *opts = NULL;\n    addr_list = NULL;\n    if (!getword(f, word, &newline, filename))\n    return -1;        /* file is empty??? */\n    newline = 1;\n    best_flag = -1;\n    for (;;) {\n    /*\n     * Skip until we find a word at the start of a line.\n     */\n    while (!newline && getword(f, word, &newline, filename))\n        ;\n    if (!newline)\n        break;        /* got to end of file */\n\n    /*\n     * Got a client - check if it's a match or a wildcard.\n     */\n    got_flag = 0;\n    if (client != NULL && strcmp(word, client) != 0 && !ISWILD(word)) {\n        newline = 0;\n        continue;\n    }\n    if (!ISWILD(word))\n        got_flag = NONWILD_CLIENT;\n\n    /*\n     * Now get a server and check if it matches.\n     */\n    if (!getword(f, word, &newline, filename))\n        break;\n    if (newline)\n        continue;\n    if (!ISWILD(word)) {\n        if (server != NULL && strcmp(word, server) != 0)\n        continue;\n        got_flag |= NONWILD_SERVER;\n    }\n\n    /*\n     * Got some sort of a match - see if it's better than what\n     * we have already.\n     */\n    if (got_flag <= best_flag)\n        continue;\n\n    /*\n     * Get the secret.\n     */\n    if (!getword(f, word, &newline, filename))\n        break;\n    if (newline)\n        continue;\n\n    /*\n     * SRP-SHA1 authenticator should never be reading secrets from\n     * a file.  (Authenticatee may, though.)\n     */\n    if (flags && ((cp = strchr(word, ':')) == NULL ||\n        strchr(cp + 1, ':') == NULL))\n        continue;\n\n    if (secret != NULL) {\n        /*\n         * Special syntax: @/pathname means read secret from file.\n         */\n        if (word[0] == '@' && word[1] == '/') {\n        strlcpy(atfile, word+1, sizeof(atfile));\n        if ((sf = fopen(atfile, \"r\")) == NULL) {\n            ppp_warn(\"can't open indirect secret file %s\", atfile);\n            continue;\n        }\n        check_access(sf, atfile);\n        if (!getword(sf, word, &xxx, atfile)) {\n            ppp_warn(\"no secret in indirect secret file %s\", atfile);\n            fclose(sf);\n            continue;\n        }\n        fclose(sf);\n        }\n        strlcpy(lsecret, word, sizeof(lsecret));\n    }\n\n    /*\n     * Now read address authorization info and make a wordlist.\n     */\n    app = &alist;\n    for (;;) {\n        if (!getword(f, word, &newline, filename) || newline)\n        break;\n        ap = (struct wordlist *)\n            malloc(sizeof(struct wordlist) + strlen(word) + 1);\n        if (ap == NULL)\n        novm(\"authorized addresses\");\n        ap->word = (char *) (ap + 1);\n        strcpy(ap->word, word);\n        *app = ap;\n        app = &ap->next;\n    }\n    *app = NULL;\n\n    /*\n     * This is the best so far; remember it.\n     */\n    best_flag = got_flag;\n    if (addr_list)\n        free_wordlist(addr_list);\n    addr_list = alist;\n    if (secret != NULL)\n        strlcpy(secret, lsecret, MAXWORDLEN);\n\n    if (!newline)\n        break;\n    }\n\n    /* scan for a -- word indicating the start of options */\n    for (app = &addr_list; (ap = *app) != NULL; app = &ap->next)\n    if (strcmp(ap->word, \"--\") == 0)\n        break;\n    /* ap = start of options */\n    if (ap != NULL) {\n    ap = ap->next;        /* first option */\n    free(*app);            /* free the \"--\" word */\n    *app = NULL;        /* terminate addr list */\n    }\n    if (opts != NULL)\n    *opts = ap;\n    else if (ap != NULL)\n    free_wordlist(ap);\n    if (addrs != NULL)\n    *addrs = addr_list;\n    else if (addr_list != NULL)\n    free_wordlist(addr_list);\n\n    return best_flag;\n}\n\n/*\n * wordlist_count - return the number of items in a wordlist\n */\nstatic int\nwordlist_count(wp)\n    struct wordlist *wp;\n{\n    int n;\n\n    for (n = 0; wp != NULL; wp = wp->next)\n    ++n;\n    return n;\n}\n\n/*\n * free_wordlist - release memory allocated for a wordlist.\n */\nstatic void\nfree_wordlist(wp)\n    struct wordlist *wp;\n{\n    struct wordlist *next;\n\n    while (wp != NULL) {\n    next = wp->next;\n    free(wp);\n    wp = next;\n    }\n}\n#endif /* UNUSED */\n\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/ccp.c",
    "content": "/*\n * ccp.c - PPP Compression Control Protocol.\n *\n * Copyright (c) 1994-2002 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && CCP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/fsm.h\"\n#include \"netif/ppp/ccp.h\"\n\n#if MPPE_SUPPORT\n#include \"netif/ppp/lcp.h\"    /* lcp_close(), lcp_fsm */\n#include \"netif/ppp/mppe.h\"    /* mppe_init() */\n#endif /* MPPE_SUPPORT */\n\n/*\n * Unfortunately there is a bug in zlib which means that using a\n * size of 8 (window size = 256) for Deflate compression will cause\n * buffer overruns and kernel crashes in the deflate module.\n * Until this is fixed we only accept sizes in the range 9 .. 15.\n * Thanks to James Carlson for pointing this out.\n */\n#define DEFLATE_MIN_WORKS    9\n\n/*\n * Command-line options.\n */\n#if PPP_OPTIONS\nstatic int setbsdcomp (char **);\nstatic int setdeflate (char **);\nstatic char bsd_value[8];\nstatic char deflate_value[8];\n\n/*\n * Option variables.\n */\n#if MPPE_SUPPORT\nbool refuse_mppe_stateful = 1;        /* Allow stateful mode? */\n#endif /* MPPE_SUPPORT */\n\nstatic option_t ccp_option_list[] = {\n    { \"noccp\", o_bool, &ccp_protent.enabled_flag,\n      \"Disable CCP negotiation\" },\n    { \"-ccp\", o_bool, &ccp_protent.enabled_flag,\n      \"Disable CCP negotiation\", OPT_ALIAS },\n\n    { \"bsdcomp\", o_special, (void *)setbsdcomp,\n      \"Request BSD-Compress packet compression\",\n      OPT_PRIO | OPT_A2STRVAL | OPT_STATIC, bsd_value },\n    { \"nobsdcomp\", o_bool, &ccp_wantoptions[0].bsd_compress,\n      \"don't allow BSD-Compress\", OPT_PRIOSUB | OPT_A2CLR,\n      &ccp_allowoptions[0].bsd_compress },\n    { \"-bsdcomp\", o_bool, &ccp_wantoptions[0].bsd_compress,\n      \"don't allow BSD-Compress\", OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR,\n      &ccp_allowoptions[0].bsd_compress },\n\n    { \"deflate\", o_special, (void *)setdeflate,\n      \"request Deflate compression\",\n      OPT_PRIO | OPT_A2STRVAL | OPT_STATIC, deflate_value },\n    { \"nodeflate\", o_bool, &ccp_wantoptions[0].deflate,\n      \"don't allow Deflate compression\", OPT_PRIOSUB | OPT_A2CLR,\n      &ccp_allowoptions[0].deflate },\n    { \"-deflate\", o_bool, &ccp_wantoptions[0].deflate,\n      \"don't allow Deflate compression\", OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR,\n      &ccp_allowoptions[0].deflate },\n\n    { \"nodeflatedraft\", o_bool, &ccp_wantoptions[0].deflate_draft,\n      \"don't use draft deflate #\", OPT_A2COPY,\n      &ccp_allowoptions[0].deflate_draft },\n\n    { \"predictor1\", o_bool, &ccp_wantoptions[0].predictor_1,\n      \"request Predictor-1\", OPT_PRIO | 1 },\n    { \"nopredictor1\", o_bool, &ccp_wantoptions[0].predictor_1,\n      \"don't allow Predictor-1\", OPT_PRIOSUB | OPT_A2CLR,\n      &ccp_allowoptions[0].predictor_1 },\n    { \"-predictor1\", o_bool, &ccp_wantoptions[0].predictor_1,\n      \"don't allow Predictor-1\", OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR,\n      &ccp_allowoptions[0].predictor_1 },\n\n#if MPPE_SUPPORT\n    /* MPPE options are symmetrical ... we only set wantoptions here */\n    { \"require-mppe\", o_bool, &ccp_wantoptions[0].mppe,\n      \"require MPPE encryption\",\n      OPT_PRIO | MPPE_OPT_40 | MPPE_OPT_128 },\n    { \"+mppe\", o_bool, &ccp_wantoptions[0].mppe,\n      \"require MPPE encryption\",\n      OPT_ALIAS | OPT_PRIO | MPPE_OPT_40 | MPPE_OPT_128 },\n    { \"nomppe\", o_bool, &ccp_wantoptions[0].mppe,\n      \"don't allow MPPE encryption\", OPT_PRIO },\n    { \"-mppe\", o_bool, &ccp_wantoptions[0].mppe,\n      \"don't allow MPPE encryption\", OPT_ALIAS | OPT_PRIO },\n\n    /* We use ccp_allowoptions[0].mppe as a junk var ... it is reset later */\n    { \"require-mppe-40\", o_bool, &ccp_allowoptions[0].mppe,\n      \"require MPPE 40-bit encryption\", OPT_PRIO | OPT_A2OR | MPPE_OPT_40,\n      &ccp_wantoptions[0].mppe },\n    { \"+mppe-40\", o_bool, &ccp_allowoptions[0].mppe,\n      \"require MPPE 40-bit encryption\", OPT_PRIO | OPT_A2OR | MPPE_OPT_40,\n      &ccp_wantoptions[0].mppe },\n    { \"nomppe-40\", o_bool, &ccp_allowoptions[0].mppe,\n      \"don't allow MPPE 40-bit encryption\",\n      OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_40, &ccp_wantoptions[0].mppe },\n    { \"-mppe-40\", o_bool, &ccp_allowoptions[0].mppe,\n      \"don't allow MPPE 40-bit encryption\",\n      OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_40,\n      &ccp_wantoptions[0].mppe },\n\n    { \"require-mppe-128\", o_bool, &ccp_allowoptions[0].mppe,\n      \"require MPPE 128-bit encryption\", OPT_PRIO | OPT_A2OR | MPPE_OPT_128,\n      &ccp_wantoptions[0].mppe },\n    { \"+mppe-128\", o_bool, &ccp_allowoptions[0].mppe,\n      \"require MPPE 128-bit encryption\",\n      OPT_ALIAS | OPT_PRIO | OPT_A2OR | MPPE_OPT_128,\n      &ccp_wantoptions[0].mppe },\n    { \"nomppe-128\", o_bool, &ccp_allowoptions[0].mppe,\n      \"don't allow MPPE 128-bit encryption\",\n      OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_128, &ccp_wantoptions[0].mppe },\n    { \"-mppe-128\", o_bool, &ccp_allowoptions[0].mppe,\n      \"don't allow MPPE 128-bit encryption\",\n      OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLRB | MPPE_OPT_128,\n      &ccp_wantoptions[0].mppe },\n\n    /* strange one; we always request stateless, but will we allow stateful? */\n    { \"mppe-stateful\", o_bool, &refuse_mppe_stateful,\n      \"allow MPPE stateful mode\", OPT_PRIO },\n    { \"nomppe-stateful\", o_bool, &refuse_mppe_stateful,\n      \"disallow MPPE stateful mode\", OPT_PRIO | 1 },\n#endif /* MPPE_SUPPORT */\n\n    { NULL }\n};\n#endif /* PPP_OPTIONS */\n\n/*\n * Protocol entry points from main code.\n */\nstatic void ccp_init(ppp_pcb *pcb);\nstatic void ccp_open(ppp_pcb *pcb);\nstatic void ccp_close(ppp_pcb *pcb, const char *reason);\nstatic void ccp_lowerup(ppp_pcb *pcb);\nstatic void ccp_lowerdown(ppp_pcb *pcb);\nstatic void ccp_input(ppp_pcb *pcb, u_char *pkt, int len);\nstatic void ccp_protrej(ppp_pcb *pcb);\n#if PRINTPKT_SUPPORT\nstatic int ccp_printpkt(const u_char *p, int plen, void (*printer) (void *, const char *, ...), void *arg);\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_DATAINPUT\nstatic void ccp_datainput(ppp_pcb *pcb, u_char *pkt, int len);\n#endif /* PPP_DATAINPUT */\n\nconst struct protent ccp_protent = {\n    PPP_CCP,\n    ccp_init,\n    ccp_input,\n    ccp_protrej,\n    ccp_lowerup,\n    ccp_lowerdown,\n    ccp_open,\n    ccp_close,\n#if PRINTPKT_SUPPORT\n    ccp_printpkt,\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_DATAINPUT\n    ccp_datainput,\n#endif /* PPP_DATAINPUT */\n#if PRINTPKT_SUPPORT\n    \"CCP\",\n    \"Compressed\",\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_OPTIONS\n    ccp_option_list,\n    NULL,\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\n    NULL,\n    NULL\n#endif /* DEMAND_SUPPORT */\n};\n\n/*\n * Callbacks for fsm code.\n */\nstatic void ccp_resetci (fsm *);\nstatic int  ccp_cilen (fsm *);\nstatic void ccp_addci (fsm *, u_char *, int *);\nstatic int  ccp_ackci (fsm *, u_char *, int);\nstatic int  ccp_nakci (fsm *, u_char *, int, int);\nstatic int  ccp_rejci (fsm *, u_char *, int);\nstatic int  ccp_reqci (fsm *, u_char *, int *, int);\nstatic void ccp_up (fsm *);\nstatic void ccp_down (fsm *);\nstatic int  ccp_extcode (fsm *, int, int, u_char *, int);\nstatic void ccp_rack_timeout (void *);\nstatic const char *method_name (ccp_options *, ccp_options *);\n\nstatic const fsm_callbacks ccp_callbacks = {\n    ccp_resetci,\n    ccp_cilen,\n    ccp_addci,\n    ccp_ackci,\n    ccp_nakci,\n    ccp_rejci,\n    ccp_reqci,\n    ccp_up,\n    ccp_down,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    ccp_extcode,\n    \"CCP\"\n};\n\n/*\n * Do we want / did we get any compression?\n */\nstatic int ccp_anycompress(ccp_options *opt) {\n    return (0\n#if DEFLATE_SUPPORT\n    || (opt)->deflate\n#endif /* DEFLATE_SUPPORT */\n#if BSDCOMPRESS_SUPPORT\n    || (opt)->bsd_compress\n#endif /* BSDCOMPRESS_SUPPORT */\n#if PREDICTOR_SUPPORT\n    || (opt)->predictor_1 || (opt)->predictor_2\n#endif /* PREDICTOR_SUPPORT */\n#if MPPE_SUPPORT\n    || (opt)->mppe\n#endif /* MPPE_SUPPORT */\n    );\n}\n\n/*\n * Local state (mainly for handling reset-reqs and reset-acks).\n */\n#define RACK_PENDING    1    /* waiting for reset-ack */\n#define RREQ_REPEAT    2    /* send another reset-req if no reset-ack */\n\n#define RACKTIMEOUT    1    /* second */\n\n#if PPP_OPTIONS\n/*\n * Option parsing\n */\nstatic int\nsetbsdcomp(argv)\n    char **argv;\n{\n    int rbits, abits;\n    char *str, *endp;\n\n    str = *argv;\n    abits = rbits = strtol(str, &endp, 0);\n    if (endp != str && *endp == ',') {\n    str = endp + 1;\n    abits = strtol(str, &endp, 0);\n    }\n    if (*endp != 0 || endp == str) {\n    option_error(\"invalid parameter '%s' for bsdcomp option\", *argv);\n    return 0;\n    }\n    if ((rbits != 0 && (rbits < BSD_MIN_BITS || rbits > BSD_MAX_BITS))\n    || (abits != 0 && (abits < BSD_MIN_BITS || abits > BSD_MAX_BITS))) {\n    option_error(\"bsdcomp option values must be 0 or %d .. %d\",\n             BSD_MIN_BITS, BSD_MAX_BITS);\n    return 0;\n    }\n    if (rbits > 0) {\n    ccp_wantoptions[0].bsd_compress = 1;\n    ccp_wantoptions[0].bsd_bits = rbits;\n    } else\n    ccp_wantoptions[0].bsd_compress = 0;\n    if (abits > 0) {\n    ccp_allowoptions[0].bsd_compress = 1;\n    ccp_allowoptions[0].bsd_bits = abits;\n    } else\n    ccp_allowoptions[0].bsd_compress = 0;\n    ppp_slprintf(bsd_value, sizeof(bsd_value),\n         rbits == abits? \"%d\": \"%d,%d\", rbits, abits);\n\n    return 1;\n}\n\nstatic int\nsetdeflate(argv)\n    char **argv;\n{\n    int rbits, abits;\n    char *str, *endp;\n\n    str = *argv;\n    abits = rbits = strtol(str, &endp, 0);\n    if (endp != str && *endp == ',') {\n    str = endp + 1;\n    abits = strtol(str, &endp, 0);\n    }\n    if (*endp != 0 || endp == str) {\n    option_error(\"invalid parameter '%s' for deflate option\", *argv);\n    return 0;\n    }\n    if ((rbits != 0 && (rbits < DEFLATE_MIN_SIZE || rbits > DEFLATE_MAX_SIZE))\n    || (abits != 0 && (abits < DEFLATE_MIN_SIZE\n              || abits > DEFLATE_MAX_SIZE))) {\n    option_error(\"deflate option values must be 0 or %d .. %d\",\n             DEFLATE_MIN_SIZE, DEFLATE_MAX_SIZE);\n    return 0;\n    }\n    if (rbits == DEFLATE_MIN_SIZE || abits == DEFLATE_MIN_SIZE) {\n    if (rbits == DEFLATE_MIN_SIZE)\n        rbits = DEFLATE_MIN_WORKS;\n    if (abits == DEFLATE_MIN_SIZE)\n        abits = DEFLATE_MIN_WORKS;\n    warn(\"deflate option value of %d changed to %d to avoid zlib bug\",\n         DEFLATE_MIN_SIZE, DEFLATE_MIN_WORKS);\n    }\n    if (rbits > 0) {\n    ccp_wantoptions[0].deflate = 1;\n    ccp_wantoptions[0].deflate_size = rbits;\n    } else\n    ccp_wantoptions[0].deflate = 0;\n    if (abits > 0) {\n    ccp_allowoptions[0].deflate = 1;\n    ccp_allowoptions[0].deflate_size = abits;\n    } else\n    ccp_allowoptions[0].deflate = 0;\n    ppp_slprintf(deflate_value, sizeof(deflate_value),\n         rbits == abits? \"%d\": \"%d,%d\", rbits, abits);\n\n    return 1;\n}\n#endif /* PPP_OPTIONS */\n\n/*\n * ccp_init - initialize CCP.\n */\nstatic void ccp_init(ppp_pcb *pcb) {\n    fsm *f = &pcb->ccp_fsm;\n\n    f->pcb = pcb;\n    f->protocol = PPP_CCP;\n    f->callbacks = &ccp_callbacks;\n    fsm_init(f);\n\n#if 0 /* Not necessary, everything is cleared in ppp_new() */\n    memset(wo, 0, sizeof(*wo));\n    memset(go, 0, sizeof(*go));\n    memset(ao, 0, sizeof(*ao));\n    memset(ho, 0, sizeof(*ho));\n#endif /* 0 */\n\n#if DEFLATE_SUPPORT\n    wo->deflate = 1;\n    wo->deflate_size = DEFLATE_MAX_SIZE;\n    wo->deflate_correct = 1;\n    wo->deflate_draft = 1;\n    ao->deflate = 1;\n    ao->deflate_size = DEFLATE_MAX_SIZE;\n    ao->deflate_correct = 1;\n    ao->deflate_draft = 1;\n#endif /* DEFLATE_SUPPORT */\n\n#if BSDCOMPRESS_SUPPORT\n    wo->bsd_compress = 1;\n    wo->bsd_bits = BSD_MAX_BITS;\n    ao->bsd_compress = 1;\n    ao->bsd_bits = BSD_MAX_BITS;\n#endif /* BSDCOMPRESS_SUPPORT */\n\n#if PREDICTOR_SUPPORT\n    ao->predictor_1 = 1;\n#endif /* PREDICTOR_SUPPORT */\n}\n\n/*\n * ccp_open - CCP is allowed to come up.\n */\nstatic void ccp_open(ppp_pcb *pcb) {\n    fsm *f = &pcb->ccp_fsm;\n    ccp_options *go = &pcb->ccp_gotoptions;\n\n    if (f->state != PPP_FSM_OPENED)\n    ccp_set(pcb, 1, 0, 0, 0);\n\n    /*\n     * Find out which compressors the kernel supports before\n     * deciding whether to open in silent mode.\n     */\n    ccp_resetci(f);\n    if (!ccp_anycompress(go))\n    f->flags |= OPT_SILENT;\n\n    fsm_open(f);\n}\n\n/*\n * ccp_close - Terminate CCP.\n */\nstatic void ccp_close(ppp_pcb *pcb, const char *reason) {\n    fsm *f = &pcb->ccp_fsm;\n    ccp_set(pcb, 0, 0, 0, 0);\n    fsm_close(f, reason);\n}\n\n/*\n * ccp_lowerup - we may now transmit CCP packets.\n */\nstatic void ccp_lowerup(ppp_pcb *pcb) {\n    fsm *f = &pcb->ccp_fsm;\n    fsm_lowerup(f);\n}\n\n/*\n * ccp_lowerdown - we may not transmit CCP packets.\n */\nstatic void ccp_lowerdown(ppp_pcb *pcb) {\n    fsm *f = &pcb->ccp_fsm;\n    fsm_lowerdown(f);\n}\n\n/*\n * ccp_input - process a received CCP packet.\n */\nstatic void ccp_input(ppp_pcb *pcb, u_char *p, int len) {\n    fsm *f = &pcb->ccp_fsm;\n    ccp_options *go = &pcb->ccp_gotoptions;\n    int oldstate;\n\n    /*\n     * Check for a terminate-request so we can print a message.\n     */\n    oldstate = f->state;\n    fsm_input(f, p, len);\n    if (oldstate == PPP_FSM_OPENED && p[0] == TERMREQ && f->state != PPP_FSM_OPENED) {\n    ppp_notice(\"Compression disabled by peer.\");\n#if MPPE_SUPPORT\n    if (go->mppe) {\n        ppp_error(\"MPPE disabled, closing LCP\");\n        lcp_close(pcb, \"MPPE disabled by peer\");\n    }\n#endif /* MPPE_SUPPORT */\n    }\n\n    /*\n     * If we get a terminate-ack and we're not asking for compression,\n     * close CCP.\n     */\n    if (oldstate == PPP_FSM_REQSENT && p[0] == TERMACK\n    && !ccp_anycompress(go))\n    ccp_close(pcb, \"No compression negotiated\");\n}\n\n/*\n * Handle a CCP-specific code.\n */\nstatic int ccp_extcode(fsm *f, int code, int id, u_char *p, int len) {\n    ppp_pcb *pcb = f->pcb;\n    LWIP_UNUSED_ARG(p);\n    LWIP_UNUSED_ARG(len);\n\n    switch (code) {\n    case CCP_RESETREQ:\n    if (f->state != PPP_FSM_OPENED)\n        break;\n    ccp_reset_comp(pcb);\n    /* send a reset-ack, which the transmitter will see and\n       reset its compression state. */\n    fsm_sdata(f, CCP_RESETACK, id, NULL, 0);\n    break;\n\n    case CCP_RESETACK:\n    if ((pcb->ccp_localstate & RACK_PENDING) && id == f->reqid) {\n        pcb->ccp_localstate &= ~(RACK_PENDING | RREQ_REPEAT);\n        UNTIMEOUT(ccp_rack_timeout, f);\n        ccp_reset_decomp(pcb);\n    }\n    break;\n\n    default:\n    return 0;\n    }\n\n    return 1;\n}\n\n/*\n * ccp_protrej - peer doesn't talk CCP.\n */\nstatic void ccp_protrej(ppp_pcb *pcb) {\n    fsm *f = &pcb->ccp_fsm;\n#if MPPE_SUPPORT\n    ccp_options *go = &pcb->ccp_gotoptions;\n#endif /* MPPE_SUPPORT */\n\n    ccp_set(pcb, 0, 0, 0, 0);\n    fsm_lowerdown(f);\n\n#if MPPE_SUPPORT\n    if (go->mppe) {\n    ppp_error(\"MPPE required but peer negotiation failed\");\n    lcp_close(pcb, \"MPPE required but peer negotiation failed\");\n    }\n#endif /* MPPE_SUPPORT */\n\n}\n\n/*\n * ccp_resetci - initialize at start of negotiation.\n */\nstatic void ccp_resetci(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    ccp_options *go = &pcb->ccp_gotoptions;\n    ccp_options *wo = &pcb->ccp_wantoptions;\n#if MPPE_SUPPORT\n    ccp_options *ao = &pcb->ccp_allowoptions;\n#endif /* MPPE_SUPPORT */\n#if DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT || PREDICTOR_SUPPORT\n    u_char opt_buf[CCP_MAX_OPTION_LENGTH];\n#endif /* DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT || PREDICTOR_SUPPORT */\n#if DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT\n    int res;\n#endif /* DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT */\n\n#if MPPE_SUPPORT\n    if (pcb->settings.require_mppe) {\n    wo->mppe = ao->mppe =\n            (pcb->settings.refuse_mppe_40 ? 0 : MPPE_OPT_40)\n          | (pcb->settings.refuse_mppe_128 ? 0 : MPPE_OPT_128);\n    }\n#endif /* MPPE_SUPPORT */\n\n    *go = *wo;\n    pcb->ccp_all_rejected = 0;\n\n#if MPPE_SUPPORT\n    if (go->mppe) {\n    int auth_mschap_bits = pcb->auth_done;\n    int numbits;\n\n    /*\n     * Start with a basic sanity check: mschap[v2] auth must be in\n     * exactly one direction.  RFC 3079 says that the keys are\n     * 'derived from the credentials of the peer that initiated the call',\n     * however the PPP protocol doesn't have such a concept, and pppd\n     * cannot get this info externally.  Instead we do the best we can.\n     * NB: If MPPE is required, all other compression opts are invalid.\n     *     So, we return right away if we can't do it.\n     */\n\n    /* Leave only the mschap auth bits set */\n    auth_mschap_bits &= (CHAP_MS_WITHPEER  | CHAP_MS_PEER |\n                 CHAP_MS2_WITHPEER | CHAP_MS2_PEER);\n    /* Count the mschap auths */\n    auth_mschap_bits >>= CHAP_MS_SHIFT;\n    numbits = 0;\n    do {\n        numbits += auth_mschap_bits & 1;\n        auth_mschap_bits >>= 1;\n    } while (auth_mschap_bits);\n    if (numbits > 1) {\n        ppp_error(\"MPPE required, but auth done in both directions.\");\n        lcp_close(pcb, \"MPPE required but not available\");\n        return;\n    }\n    if (!numbits) {\n        ppp_error(\"MPPE required, but MS-CHAP[v2] auth not performed.\");\n        lcp_close(pcb, \"MPPE required but not available\");\n        return;\n    }\n\n    /* A plugin (eg radius) may not have obtained key material. */\n    if (!pcb->mppe_keys_set) {\n        ppp_error(\"MPPE required, but keys are not available.  \"\n          \"Possible plugin problem?\");\n        lcp_close(pcb, \"MPPE required but not available\");\n        return;\n    }\n\n    /* LM auth not supported for MPPE */\n    if (pcb->auth_done & (CHAP_MS_WITHPEER | CHAP_MS_PEER)) {\n        /* This might be noise */\n        if (go->mppe & MPPE_OPT_40) {\n        ppp_notice(\"Disabling 40-bit MPPE; MS-CHAP LM not supported\");\n        go->mppe &= ~MPPE_OPT_40;\n        wo->mppe &= ~MPPE_OPT_40;\n        }\n    }\n\n    /* Last check: can we actually negotiate something? */\n    if (!(go->mppe & (MPPE_OPT_40 | MPPE_OPT_128))) {\n        /* Could be misconfig, could be 40-bit disabled above. */\n        ppp_error(\"MPPE required, but both 40-bit and 128-bit disabled.\");\n        lcp_close(pcb, \"MPPE required but not available\");\n        return;\n    }\n\n    /* sync options */\n    ao->mppe = go->mppe;\n    /* MPPE is not compatible with other compression types */\n#if BSDCOMPRESS_SUPPORT\n    ao->bsd_compress = go->bsd_compress = 0;\n#endif /* BSDCOMPRESS_SUPPORT */\n#if PREDICTOR_SUPPORT\n    ao->predictor_1  = go->predictor_1  = 0;\n    ao->predictor_2  = go->predictor_2  = 0;\n#endif /* PREDICTOR_SUPPORT */\n#if DEFLATE_SUPPORT\n    ao->deflate      = go->deflate      = 0;\n#endif /* DEFLATE_SUPPORT */\n    }\n#endif /* MPPE_SUPPORT */\n\n    /*\n     * Check whether the kernel knows about the various\n     * compression methods we might request.\n     */\n#if BSDCOMPRESS_SUPPORT\n    /* FIXME: we don't need to test if BSD compress is available\n     * if BSDCOMPRESS_SUPPORT is set, it is.\n     */\n    if (go->bsd_compress) {\n    opt_buf[0] = CI_BSD_COMPRESS;\n    opt_buf[1] = CILEN_BSD_COMPRESS;\n    for (;;) {\n        if (go->bsd_bits < BSD_MIN_BITS) {\n        go->bsd_compress = 0;\n        break;\n        }\n        opt_buf[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits);\n        res = ccp_test(pcb, opt_buf, CILEN_BSD_COMPRESS, 0);\n        if (res > 0) {\n        break;\n        } else if (res < 0) {\n        go->bsd_compress = 0;\n        break;\n        }\n        go->bsd_bits--;\n    }\n    }\n#endif /* BSDCOMPRESS_SUPPORT */\n#if DEFLATE_SUPPORT\n    /* FIXME: we don't need to test if deflate is available\n     * if DEFLATE_SUPPORT is set, it is.\n     */\n    if (go->deflate) {\n    if (go->deflate_correct) {\n        opt_buf[0] = CI_DEFLATE;\n        opt_buf[1] = CILEN_DEFLATE;\n        opt_buf[3] = DEFLATE_CHK_SEQUENCE;\n        for (;;) {\n        if (go->deflate_size < DEFLATE_MIN_WORKS) {\n            go->deflate_correct = 0;\n            break;\n        }\n        opt_buf[2] = DEFLATE_MAKE_OPT(go->deflate_size);\n        res = ccp_test(pcb, opt_buf, CILEN_DEFLATE, 0);\n        if (res > 0) {\n            break;\n        } else if (res < 0) {\n            go->deflate_correct = 0;\n            break;\n        }\n        go->deflate_size--;\n        }\n    }\n    if (go->deflate_draft) {\n        opt_buf[0] = CI_DEFLATE_DRAFT;\n        opt_buf[1] = CILEN_DEFLATE;\n        opt_buf[3] = DEFLATE_CHK_SEQUENCE;\n        for (;;) {\n        if (go->deflate_size < DEFLATE_MIN_WORKS) {\n            go->deflate_draft = 0;\n            break;\n        }\n        opt_buf[2] = DEFLATE_MAKE_OPT(go->deflate_size);\n        res = ccp_test(pcb, opt_buf, CILEN_DEFLATE, 0);\n        if (res > 0) {\n            break;\n        } else if (res < 0) {\n            go->deflate_draft = 0;\n            break;\n        }\n        go->deflate_size--;\n        }\n    }\n    if (!go->deflate_correct && !go->deflate_draft)\n        go->deflate = 0;\n    }\n#endif /* DEFLATE_SUPPORT */\n#if PREDICTOR_SUPPORT\n    /* FIXME: we don't need to test if predictor is available,\n     * if PREDICTOR_SUPPORT is set, it is.\n     */\n    if (go->predictor_1) {\n    opt_buf[0] = CI_PREDICTOR_1;\n    opt_buf[1] = CILEN_PREDICTOR_1;\n    if (ccp_test(pcb, opt_buf, CILEN_PREDICTOR_1, 0) <= 0)\n        go->predictor_1 = 0;\n    }\n    if (go->predictor_2) {\n    opt_buf[0] = CI_PREDICTOR_2;\n    opt_buf[1] = CILEN_PREDICTOR_2;\n    if (ccp_test(pcb, opt_buf, CILEN_PREDICTOR_2, 0) <= 0)\n        go->predictor_2 = 0;\n    }\n#endif /* PREDICTOR_SUPPORT */\n}\n\n/*\n * ccp_cilen - Return total length of our configuration info.\n */\nstatic int ccp_cilen(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    ccp_options *go = &pcb->ccp_gotoptions;\n\n    return 0\n#if BSDCOMPRESS_SUPPORT\n    + (go->bsd_compress? CILEN_BSD_COMPRESS: 0)\n#endif /* BSDCOMPRESS_SUPPORT */\n#if DEFLATE_SUPPORT\n    + (go->deflate && go->deflate_correct? CILEN_DEFLATE: 0)\n    + (go->deflate && go->deflate_draft? CILEN_DEFLATE: 0)\n#endif /* DEFLATE_SUPPORT */\n#if PREDICTOR_SUPPORT\n    + (go->predictor_1? CILEN_PREDICTOR_1: 0)\n    + (go->predictor_2? CILEN_PREDICTOR_2: 0)\n#endif /* PREDICTOR_SUPPORT */\n#if MPPE_SUPPORT\n    + (go->mppe? CILEN_MPPE: 0)\n#endif /* MPPE_SUPPORT */\n    ;\n}\n\n/*\n * ccp_addci - put our requests in a packet.\n */\nstatic void ccp_addci(fsm *f, u_char *p, int *lenp) {\n    ppp_pcb *pcb = f->pcb;\n    ccp_options *go = &pcb->ccp_gotoptions;\n    u_char *p0 = p;\n\n    /*\n     * Add the compression types that we can receive, in decreasing\n     * preference order.\n     */\n#if MPPE_SUPPORT\n    if (go->mppe) {\n    p[0] = CI_MPPE;\n    p[1] = CILEN_MPPE;\n    MPPE_OPTS_TO_CI(go->mppe, &p[2]);\n    mppe_init(pcb, &pcb->mppe_decomp, go->mppe);\n    p += CILEN_MPPE;\n    }\n#endif /* MPPE_SUPPORT */\n#if DEFLATE_SUPPORT\n    if (go->deflate) {\n    if (go->deflate_correct) {\n        p[0] = CI_DEFLATE;\n        p[1] = CILEN_DEFLATE;\n        p[2] = DEFLATE_MAKE_OPT(go->deflate_size);\n        p[3] = DEFLATE_CHK_SEQUENCE;\n        p += CILEN_DEFLATE;\n    }\n    if (go->deflate_draft) {\n        p[0] = CI_DEFLATE_DRAFT;\n        p[1] = CILEN_DEFLATE;\n        p[2] = p[2 - CILEN_DEFLATE];\n        p[3] = DEFLATE_CHK_SEQUENCE;\n        p += CILEN_DEFLATE;\n    }\n    }\n#endif /* DEFLATE_SUPPORT */\n#if BSDCOMPRESS_SUPPORT\n    if (go->bsd_compress) {\n    p[0] = CI_BSD_COMPRESS;\n    p[1] = CILEN_BSD_COMPRESS;\n    p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits);\n    p += CILEN_BSD_COMPRESS;\n    }\n#endif /* BSDCOMPRESS_SUPPORT */\n#if PREDICTOR_SUPPORT\n    /* XXX Should Predictor 2 be preferable to Predictor 1? */\n    if (go->predictor_1) {\n    p[0] = CI_PREDICTOR_1;\n    p[1] = CILEN_PREDICTOR_1;\n    p += CILEN_PREDICTOR_1;\n    }\n    if (go->predictor_2) {\n    p[0] = CI_PREDICTOR_2;\n    p[1] = CILEN_PREDICTOR_2;\n    p += CILEN_PREDICTOR_2;\n    }\n#endif /* PREDICTOR_SUPPORT */\n\n    go->method = (p > p0)? p0[0]: 0;\n\n    *lenp = p - p0;\n}\n\n/*\n * ccp_ackci - process a received configure-ack, and return\n * 1 iff the packet was OK.\n */\nstatic int ccp_ackci(fsm *f, u_char *p, int len) {\n    ppp_pcb *pcb = f->pcb;\n    ccp_options *go = &pcb->ccp_gotoptions;\n#if BSDCOMPRESS_SUPPORT || PREDICTOR_SUPPORT\n    u_char *p0 = p;\n#endif /* BSDCOMPRESS_SUPPORT || PREDICTOR_SUPPORT */\n\n#if MPPE_SUPPORT\n    if (go->mppe) {\n    u_char opt_buf[CILEN_MPPE];\n\n    opt_buf[0] = CI_MPPE;\n    opt_buf[1] = CILEN_MPPE;\n    MPPE_OPTS_TO_CI(go->mppe, &opt_buf[2]);\n    if (len < CILEN_MPPE || memcmp(opt_buf, p, CILEN_MPPE))\n        return 0;\n    p += CILEN_MPPE;\n    len -= CILEN_MPPE;\n    /* XXX Cope with first/fast ack */\n    if (len == 0)\n        return 1;\n    }\n#endif /* MPPE_SUPPORT */\n#if DEFLATE_SUPPORT\n    if (go->deflate) {\n    if (len < CILEN_DEFLATE\n        || p[0] != (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)\n        || p[1] != CILEN_DEFLATE\n        || p[2] != DEFLATE_MAKE_OPT(go->deflate_size)\n        || p[3] != DEFLATE_CHK_SEQUENCE)\n        return 0;\n    p += CILEN_DEFLATE;\n    len -= CILEN_DEFLATE;\n    /* XXX Cope with first/fast ack */\n    if (len == 0)\n        return 1;\n    if (go->deflate_correct && go->deflate_draft) {\n        if (len < CILEN_DEFLATE\n        || p[0] != CI_DEFLATE_DRAFT\n        || p[1] != CILEN_DEFLATE\n        || p[2] != DEFLATE_MAKE_OPT(go->deflate_size)\n        || p[3] != DEFLATE_CHK_SEQUENCE)\n        return 0;\n        p += CILEN_DEFLATE;\n        len -= CILEN_DEFLATE;\n    }\n    }\n#endif /* DEFLATE_SUPPORT */\n#if BSDCOMPRESS_SUPPORT\n    if (go->bsd_compress) {\n    if (len < CILEN_BSD_COMPRESS\n        || p[0] != CI_BSD_COMPRESS || p[1] != CILEN_BSD_COMPRESS\n        || p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits))\n        return 0;\n    p += CILEN_BSD_COMPRESS;\n    len -= CILEN_BSD_COMPRESS;\n    /* XXX Cope with first/fast ack */\n    if (p == p0 && len == 0)\n        return 1;\n    }\n#endif /* BSDCOMPRESS_SUPPORT */\n#if PREDICTOR_SUPPORT\n    if (go->predictor_1) {\n    if (len < CILEN_PREDICTOR_1\n        || p[0] != CI_PREDICTOR_1 || p[1] != CILEN_PREDICTOR_1)\n        return 0;\n    p += CILEN_PREDICTOR_1;\n    len -= CILEN_PREDICTOR_1;\n    /* XXX Cope with first/fast ack */\n    if (p == p0 && len == 0)\n        return 1;\n    }\n    if (go->predictor_2) {\n    if (len < CILEN_PREDICTOR_2\n        || p[0] != CI_PREDICTOR_2 || p[1] != CILEN_PREDICTOR_2)\n        return 0;\n    p += CILEN_PREDICTOR_2;\n    len -= CILEN_PREDICTOR_2;\n    /* XXX Cope with first/fast ack */\n    if (p == p0 && len == 0)\n        return 1;\n    }\n#endif /* PREDICTOR_SUPPORT */\n\n    if (len != 0)\n    return 0;\n    return 1;\n}\n\n/*\n * ccp_nakci - process received configure-nak.\n * Returns 1 iff the nak was OK.\n */\nstatic int ccp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) {\n    ppp_pcb *pcb = f->pcb;\n    ccp_options *go = &pcb->ccp_gotoptions;\n    ccp_options no;        /* options we've seen already */\n    ccp_options try_;        /* options to ask for next time */\n    LWIP_UNUSED_ARG(treat_as_reject);\n#if !MPPE_SUPPORT && !DEFLATE_SUPPORT && !BSDCOMPRESS_SUPPORT\n    LWIP_UNUSED_ARG(p);\n    LWIP_UNUSED_ARG(len);\n#endif /* !MPPE_SUPPORT && !DEFLATE_SUPPORT && !BSDCOMPRESS_SUPPORT */\n\n    memset(&no, 0, sizeof(no));\n    try_ = *go;\n\n#if MPPE_SUPPORT\n    if (go->mppe && len >= CILEN_MPPE\n    && p[0] == CI_MPPE && p[1] == CILEN_MPPE) {\n    no.mppe = 1;\n    /*\n     * Peer wants us to use a different strength or other setting.\n     * Fail if we aren't willing to use his suggestion.\n     */\n    MPPE_CI_TO_OPTS(&p[2], try_.mppe);\n    if ((try_.mppe & MPPE_OPT_STATEFUL) && pcb->settings.refuse_mppe_stateful) {\n        ppp_error(\"Refusing MPPE stateful mode offered by peer\");\n        try_.mppe = 0;\n    } else if (((go->mppe | MPPE_OPT_STATEFUL) & try_.mppe) != try_.mppe) {\n        /* Peer must have set options we didn't request (suggest) */\n        try_.mppe = 0;\n    }\n\n    if (!try_.mppe) {\n        ppp_error(\"MPPE required but peer negotiation failed\");\n        lcp_close(pcb, \"MPPE required but peer negotiation failed\");\n    }\n    }\n#endif /* MPPE_SUPPORT */\n#if DEFLATE_SUPPORT\n    if (go->deflate && len >= CILEN_DEFLATE\n    && p[0] == (go->deflate_correct? CI_DEFLATE: CI_DEFLATE_DRAFT)\n    && p[1] == CILEN_DEFLATE) {\n    no.deflate = 1;\n    /*\n     * Peer wants us to use a different code size or something.\n     * Stop asking for Deflate if we don't understand his suggestion.\n     */\n    if (DEFLATE_METHOD(p[2]) != DEFLATE_METHOD_VAL\n        || DEFLATE_SIZE(p[2]) < DEFLATE_MIN_WORKS\n        || p[3] != DEFLATE_CHK_SEQUENCE)\n        try_.deflate = 0;\n    else if (DEFLATE_SIZE(p[2]) < go->deflate_size)\n        try_.deflate_size = DEFLATE_SIZE(p[2]);\n    p += CILEN_DEFLATE;\n    len -= CILEN_DEFLATE;\n    if (go->deflate_correct && go->deflate_draft\n        && len >= CILEN_DEFLATE && p[0] == CI_DEFLATE_DRAFT\n        && p[1] == CILEN_DEFLATE) {\n        p += CILEN_DEFLATE;\n        len -= CILEN_DEFLATE;\n    }\n    }\n#endif /* DEFLATE_SUPPORT */\n#if BSDCOMPRESS_SUPPORT\n    if (go->bsd_compress && len >= CILEN_BSD_COMPRESS\n    && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) {\n    no.bsd_compress = 1;\n    /*\n     * Peer wants us to use a different number of bits\n     * or a different version.\n     */\n    if (BSD_VERSION(p[2]) != BSD_CURRENT_VERSION)\n        try_.bsd_compress = 0;\n    else if (BSD_NBITS(p[2]) < go->bsd_bits)\n        try_.bsd_bits = BSD_NBITS(p[2]);\n    p += CILEN_BSD_COMPRESS;\n    len -= CILEN_BSD_COMPRESS;\n    }\n#endif /* BSDCOMPRESS_SUPPORT */\n\n    /*\n     * Predictor-1 and 2 have no options, so they can't be Naked.\n     *\n     * There may be remaining options but we ignore them.\n     */\n\n    if (f->state != PPP_FSM_OPENED)\n    *go = try_;\n    return 1;\n}\n\n/*\n * ccp_rejci - reject some of our suggested compression methods.\n */\nstatic int ccp_rejci(fsm *f, u_char *p, int len) {\n    ppp_pcb *pcb = f->pcb;\n    ccp_options *go = &pcb->ccp_gotoptions;\n    ccp_options try_;        /* options to request next time */\n\n    try_ = *go;\n\n    /*\n     * Cope with empty configure-rejects by ceasing to send\n     * configure-requests.\n     */\n    if (len == 0 && pcb->ccp_all_rejected)\n    return -1;\n\n#if MPPE_SUPPORT\n    if (go->mppe && len >= CILEN_MPPE\n    && p[0] == CI_MPPE && p[1] == CILEN_MPPE) {\n    ppp_error(\"MPPE required but peer refused\");\n    lcp_close(pcb, \"MPPE required but peer refused\");\n    p += CILEN_MPPE;\n    len -= CILEN_MPPE;\n    }\n#endif /* MPPE_SUPPORT */\n#if DEFLATE_SUPPORT\n    if (go->deflate_correct && len >= CILEN_DEFLATE\n    && p[0] == CI_DEFLATE && p[1] == CILEN_DEFLATE) {\n    if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size)\n        || p[3] != DEFLATE_CHK_SEQUENCE)\n        return 0;        /* Rej is bad */\n    try_.deflate_correct = 0;\n    p += CILEN_DEFLATE;\n    len -= CILEN_DEFLATE;\n    }\n    if (go->deflate_draft && len >= CILEN_DEFLATE\n    && p[0] == CI_DEFLATE_DRAFT && p[1] == CILEN_DEFLATE) {\n    if (p[2] != DEFLATE_MAKE_OPT(go->deflate_size)\n        || p[3] != DEFLATE_CHK_SEQUENCE)\n        return 0;        /* Rej is bad */\n    try_.deflate_draft = 0;\n    p += CILEN_DEFLATE;\n    len -= CILEN_DEFLATE;\n    }\n    if (!try_.deflate_correct && !try_.deflate_draft)\n    try_.deflate = 0;\n#endif /* DEFLATE_SUPPORT */\n#if BSDCOMPRESS_SUPPORT\n    if (go->bsd_compress && len >= CILEN_BSD_COMPRESS\n    && p[0] == CI_BSD_COMPRESS && p[1] == CILEN_BSD_COMPRESS) {\n    if (p[2] != BSD_MAKE_OPT(BSD_CURRENT_VERSION, go->bsd_bits))\n        return 0;\n    try_.bsd_compress = 0;\n    p += CILEN_BSD_COMPRESS;\n    len -= CILEN_BSD_COMPRESS;\n    }\n#endif /* BSDCOMPRESS_SUPPORT */\n#if PREDICTOR_SUPPORT\n    if (go->predictor_1 && len >= CILEN_PREDICTOR_1\n    && p[0] == CI_PREDICTOR_1 && p[1] == CILEN_PREDICTOR_1) {\n    try_.predictor_1 = 0;\n    p += CILEN_PREDICTOR_1;\n    len -= CILEN_PREDICTOR_1;\n    }\n    if (go->predictor_2 && len >= CILEN_PREDICTOR_2\n    && p[0] == CI_PREDICTOR_2 && p[1] == CILEN_PREDICTOR_2) {\n    try_.predictor_2 = 0;\n    p += CILEN_PREDICTOR_2;\n    len -= CILEN_PREDICTOR_2;\n    }\n#endif /* PREDICTOR_SUPPORT */\n\n    if (len != 0)\n    return 0;\n\n    if (f->state != PPP_FSM_OPENED)\n    *go = try_;\n\n    return 1;\n}\n\n/*\n * ccp_reqci - processed a received configure-request.\n * Returns CONFACK, CONFNAK or CONFREJ and the packet modified\n * appropriately.\n */\nstatic int ccp_reqci(fsm *f, u_char *p, int *lenp, int dont_nak) {\n    ppp_pcb *pcb = f->pcb;\n    ccp_options *ho = &pcb->ccp_hisoptions;\n    ccp_options *ao = &pcb->ccp_allowoptions;\n    int ret, newret;\n#if DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT\n    int res;\n    int nb;\n#endif /* DEFLATE_SUPPORT || BSDCOMPRESS_SUPPORT */\n    u_char *p0, *retp;\n    int len, clen, type;\n#if MPPE_SUPPORT\n    u8_t rej_for_ci_mppe = 1;    /* Are we rejecting based on a bad/missing */\n                /* CI_MPPE, or due to other options?       */\n#endif /* MPPE_SUPPORT */\n\n    ret = CONFACK;\n    retp = p0 = p;\n    len = *lenp;\n\n    memset(ho, 0, sizeof(ccp_options));\n    ho->method = (len > 0)? p[0]: 0;\n\n    while (len > 0) {\n    newret = CONFACK;\n    if (len < 2 || p[1] < 2 || p[1] > len) {\n        /* length is bad */\n        clen = len;\n        newret = CONFREJ;\n\n    } else {\n        type = p[0];\n        clen = p[1];\n\n        switch (type) {\n#if MPPE_SUPPORT\n        case CI_MPPE:\n        if (!ao->mppe || clen != CILEN_MPPE) {\n            newret = CONFREJ;\n            break;\n        }\n        MPPE_CI_TO_OPTS(&p[2], ho->mppe);\n\n        /* Nak if anything unsupported or unknown are set. */\n        if (ho->mppe & MPPE_OPT_UNSUPPORTED) {\n            newret = CONFNAK;\n            ho->mppe &= ~MPPE_OPT_UNSUPPORTED;\n        }\n        if (ho->mppe & MPPE_OPT_UNKNOWN) {\n            newret = CONFNAK;\n            ho->mppe &= ~MPPE_OPT_UNKNOWN;\n        }\n\n        /* Check state opt */\n        if (ho->mppe & MPPE_OPT_STATEFUL) {\n            /*\n             * We can Nak and request stateless, but it's a\n             * lot easier to just assume the peer will request\n             * it if he can do it; stateful mode is bad over\n             * the Internet -- which is where we expect MPPE.\n             */\n           if (pcb->settings.refuse_mppe_stateful) {\n            ppp_error(\"Refusing MPPE stateful mode offered by peer\");\n            newret = CONFREJ;\n            break;\n            }\n        }\n\n        /* Find out which of {S,L} are set. */\n        if ((ho->mppe & MPPE_OPT_128)\n             && (ho->mppe & MPPE_OPT_40)) {\n            /* Both are set, negotiate the strongest. */\n            newret = CONFNAK;\n            if (ao->mppe & MPPE_OPT_128)\n            ho->mppe &= ~MPPE_OPT_40;\n            else if (ao->mppe & MPPE_OPT_40)\n            ho->mppe &= ~MPPE_OPT_128;\n            else {\n            newret = CONFREJ;\n            break;\n            }\n        } else if (ho->mppe & MPPE_OPT_128) {\n            if (!(ao->mppe & MPPE_OPT_128)) {\n            newret = CONFREJ;\n            break;\n            }\n        } else if (ho->mppe & MPPE_OPT_40) {\n            if (!(ao->mppe & MPPE_OPT_40)) {\n            newret = CONFREJ;\n            break;\n            }\n        } else {\n            /* Neither are set. */\n            /* We cannot accept this.  */\n            newret = CONFNAK;\n            /* Give the peer our idea of what can be used,\n               so it can choose and confirm */\n            ho->mppe = ao->mppe;\n        }\n\n        /* rebuild the opts */\n        MPPE_OPTS_TO_CI(ho->mppe, &p[2]);\n        if (newret == CONFACK) {\n            int mtu;\n\n            mppe_init(pcb, &pcb->mppe_comp, ho->mppe);\n            /*\n             * We need to decrease the interface MTU by MPPE_PAD\n             * because MPPE frames **grow**.  The kernel [must]\n             * allocate MPPE_PAD extra bytes in xmit buffers.\n             */\n            mtu = netif_get_mtu(pcb);\n            if (mtu)\n            netif_set_mtu(pcb, mtu - MPPE_PAD);\n            else\n            newret = CONFREJ;\n        }\n\n        /*\n         * We have accepted MPPE or are willing to negotiate\n         * MPPE parameters.  A CONFREJ is due to subsequent\n         * (non-MPPE) processing.\n         */\n        rej_for_ci_mppe = 0;\n        break;\n#endif /* MPPE_SUPPORT */\n#if DEFLATE_SUPPORT\n        case CI_DEFLATE:\n        case CI_DEFLATE_DRAFT:\n        if (!ao->deflate || clen != CILEN_DEFLATE\n            || (!ao->deflate_correct && type == CI_DEFLATE)\n            || (!ao->deflate_draft && type == CI_DEFLATE_DRAFT)) {\n            newret = CONFREJ;\n            break;\n        }\n\n        ho->deflate = 1;\n        ho->deflate_size = nb = DEFLATE_SIZE(p[2]);\n        if (DEFLATE_METHOD(p[2]) != DEFLATE_METHOD_VAL\n            || p[3] != DEFLATE_CHK_SEQUENCE\n            || nb > ao->deflate_size || nb < DEFLATE_MIN_WORKS) {\n            newret = CONFNAK;\n            if (!dont_nak) {\n            p[2] = DEFLATE_MAKE_OPT(ao->deflate_size);\n            p[3] = DEFLATE_CHK_SEQUENCE;\n            /* fall through to test this #bits below */\n            } else\n            break;\n        }\n\n        /*\n         * Check whether we can do Deflate with the window\n         * size they want.  If the window is too big, reduce\n         * it until the kernel can cope and nak with that.\n         * We only check this for the first option.\n         */\n        if (p == p0) {\n            for (;;) {\n            res = ccp_test(pcb, p, CILEN_DEFLATE, 1);\n            if (res > 0)\n                break;        /* it's OK now */\n            if (res < 0 || nb == DEFLATE_MIN_WORKS || dont_nak) {\n                newret = CONFREJ;\n                p[2] = DEFLATE_MAKE_OPT(ho->deflate_size);\n                break;\n            }\n            newret = CONFNAK;\n            --nb;\n            p[2] = DEFLATE_MAKE_OPT(nb);\n            }\n        }\n        break;\n#endif /* DEFLATE_SUPPORT */\n#if BSDCOMPRESS_SUPPORT\n        case CI_BSD_COMPRESS:\n        if (!ao->bsd_compress || clen != CILEN_BSD_COMPRESS) {\n            newret = CONFREJ;\n            break;\n        }\n\n        ho->bsd_compress = 1;\n        ho->bsd_bits = nb = BSD_NBITS(p[2]);\n        if (BSD_VERSION(p[2]) != BSD_CURRENT_VERSION\n            || nb > ao->bsd_bits || nb < BSD_MIN_BITS) {\n            newret = CONFNAK;\n            if (!dont_nak) {\n            p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, ao->bsd_bits);\n            /* fall through to test this #bits below */\n            } else\n            break;\n        }\n\n        /*\n         * Check whether we can do BSD-Compress with the code\n         * size they want.  If the code size is too big, reduce\n         * it until the kernel can cope and nak with that.\n         * We only check this for the first option.\n         */\n        if (p == p0) {\n            for (;;) {\n            res = ccp_test(pcb, p, CILEN_BSD_COMPRESS, 1);\n            if (res > 0)\n                break;\n            if (res < 0 || nb == BSD_MIN_BITS || dont_nak) {\n                newret = CONFREJ;\n                p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION,\n                        ho->bsd_bits);\n                break;\n            }\n            newret = CONFNAK;\n            --nb;\n            p[2] = BSD_MAKE_OPT(BSD_CURRENT_VERSION, nb);\n            }\n        }\n        break;\n#endif /* BSDCOMPRESS_SUPPORT */\n#if PREDICTOR_SUPPORT\n        case CI_PREDICTOR_1:\n        if (!ao->predictor_1 || clen != CILEN_PREDICTOR_1) {\n            newret = CONFREJ;\n            break;\n        }\n\n        ho->predictor_1 = 1;\n        if (p == p0\n            && ccp_test(pcb, p, CILEN_PREDICTOR_1, 1) <= 0) {\n            newret = CONFREJ;\n        }\n        break;\n\n        case CI_PREDICTOR_2:\n        if (!ao->predictor_2 || clen != CILEN_PREDICTOR_2) {\n            newret = CONFREJ;\n            break;\n        }\n\n        ho->predictor_2 = 1;\n        if (p == p0\n            && ccp_test(pcb, p, CILEN_PREDICTOR_2, 1) <= 0) {\n            newret = CONFREJ;\n        }\n        break;\n#endif /* PREDICTOR_SUPPORT */\n\n        default:\n        newret = CONFREJ;\n        }\n    }\n\n    if (newret == CONFNAK && dont_nak)\n        newret = CONFREJ;\n    if (!(newret == CONFACK || (newret == CONFNAK && ret == CONFREJ))) {\n        /* we're returning this option */\n        if (newret == CONFREJ && ret == CONFNAK)\n        retp = p0;\n        ret = newret;\n        if (p != retp)\n        MEMCPY(retp, p, clen);\n        retp += clen;\n    }\n\n    p += clen;\n    len -= clen;\n    }\n\n    if (ret != CONFACK) {\n    if (ret == CONFREJ && *lenp == retp - p0)\n        pcb->ccp_all_rejected = 1;\n    else\n        *lenp = retp - p0;\n    }\n#if MPPE_SUPPORT\n    if (ret == CONFREJ && ao->mppe && rej_for_ci_mppe) {\n    ppp_error(\"MPPE required but peer negotiation failed\");\n    lcp_close(pcb, \"MPPE required but peer negotiation failed\");\n    }\n#endif /* MPPE_SUPPORT */\n    return ret;\n}\n\n/*\n * Make a string name for a compression method (or 2).\n */\nstatic const char *method_name(ccp_options *opt, ccp_options *opt2) {\n    static char result[64];\n#if !DEFLATE_SUPPORT && !BSDCOMPRESS_SUPPORT\n    LWIP_UNUSED_ARG(opt2);\n#endif /* !DEFLATE_SUPPORT && !BSDCOMPRESS_SUPPORT */\n\n    if (!ccp_anycompress(opt))\n    return \"(none)\";\n    switch (opt->method) {\n#if MPPE_SUPPORT\n    case CI_MPPE:\n    {\n    char *p = result;\n    char *q = result + sizeof(result); /* 1 past result */\n\n    ppp_slprintf(p, q - p, \"MPPE \");\n    p += 5;\n    if (opt->mppe & MPPE_OPT_128) {\n        ppp_slprintf(p, q - p, \"128-bit \");\n        p += 8;\n    }\n    if (opt->mppe & MPPE_OPT_40) {\n        ppp_slprintf(p, q - p, \"40-bit \");\n        p += 7;\n    }\n    if (opt->mppe & MPPE_OPT_STATEFUL)\n        ppp_slprintf(p, q - p, \"stateful\");\n    else\n        ppp_slprintf(p, q - p, \"stateless\");\n\n    break;\n    }\n#endif /* MPPE_SUPPORT */\n#if DEFLATE_SUPPORT\n    case CI_DEFLATE:\n    case CI_DEFLATE_DRAFT:\n    if (opt2 != NULL && opt2->deflate_size != opt->deflate_size)\n        ppp_slprintf(result, sizeof(result), \"Deflate%s (%d/%d)\",\n             (opt->method == CI_DEFLATE_DRAFT? \"(old#)\": \"\"),\n             opt->deflate_size, opt2->deflate_size);\n    else\n        ppp_slprintf(result, sizeof(result), \"Deflate%s (%d)\",\n             (opt->method == CI_DEFLATE_DRAFT? \"(old#)\": \"\"),\n             opt->deflate_size);\n    break;\n#endif /* DEFLATE_SUPPORT */\n#if BSDCOMPRESS_SUPPORT\n    case CI_BSD_COMPRESS:\n    if (opt2 != NULL && opt2->bsd_bits != opt->bsd_bits)\n        ppp_slprintf(result, sizeof(result), \"BSD-Compress (%d/%d)\",\n             opt->bsd_bits, opt2->bsd_bits);\n    else\n        ppp_slprintf(result, sizeof(result), \"BSD-Compress (%d)\",\n             opt->bsd_bits);\n    break;\n#endif /* BSDCOMPRESS_SUPPORT */\n#if PREDICTOR_SUPPORT\n    case CI_PREDICTOR_1:\n    return \"Predictor 1\";\n    case CI_PREDICTOR_2:\n    return \"Predictor 2\";\n#endif /* PREDICTOR_SUPPORT */\n    default:\n    ppp_slprintf(result, sizeof(result), \"Method %d\", opt->method);\n    }\n    return result;\n}\n\n/*\n * CCP has come up - inform the kernel driver and log a message.\n */\nstatic void ccp_up(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    ccp_options *go = &pcb->ccp_gotoptions;\n    ccp_options *ho = &pcb->ccp_hisoptions;\n    char method1[64];\n\n    ccp_set(pcb, 1, 1, go->method, ho->method);\n    if (ccp_anycompress(go)) {\n    if (ccp_anycompress(ho)) {\n        if (go->method == ho->method) {\n        ppp_notice(\"%s compression enabled\", method_name(go, ho));\n        } else {\n        ppp_strlcpy(method1, method_name(go, NULL), sizeof(method1));\n        ppp_notice(\"%s / %s compression enabled\",\n               method1, method_name(ho, NULL));\n        }\n    } else\n        ppp_notice(\"%s receive compression enabled\", method_name(go, NULL));\n    } else if (ccp_anycompress(ho))\n    ppp_notice(\"%s transmit compression enabled\", method_name(ho, NULL));\n#if MPPE_SUPPORT\n    if (go->mppe) {\n    continue_networks(pcb);        /* Bring up IP et al */\n    }\n#endif /* MPPE_SUPPORT */\n}\n\n/*\n * CCP has gone down - inform the kernel driver.\n */\nstatic void ccp_down(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n#if MPPE_SUPPORT\n    ccp_options *go = &pcb->ccp_gotoptions;\n#endif /* MPPE_SUPPORT */\n\n    if (pcb->ccp_localstate & RACK_PENDING)\n    UNTIMEOUT(ccp_rack_timeout, f);\n    pcb->ccp_localstate = 0;\n    ccp_set(pcb, 1, 0, 0, 0);\n#if MPPE_SUPPORT\n    if (go->mppe) {\n    go->mppe = 0;\n    if (pcb->lcp_fsm.state == PPP_FSM_OPENED) {\n        /* If LCP is not already going down, make sure it does. */\n        ppp_error(\"MPPE disabled\");\n        lcp_close(pcb, \"MPPE disabled\");\n    }\n    }\n#endif /* MPPE_SUPPORT */\n}\n\n#if PRINTPKT_SUPPORT\n/*\n * Print the contents of a CCP packet.\n */\nstatic const char* const ccp_codenames[] = {\n    \"ConfReq\", \"ConfAck\", \"ConfNak\", \"ConfRej\",\n    \"TermReq\", \"TermAck\", \"CodeRej\",\n    NULL, NULL, NULL, NULL, NULL, NULL,\n    \"ResetReq\", \"ResetAck\",\n};\n\nstatic int ccp_printpkt(const u_char *p, int plen, void (*printer) (void *, const char *, ...), void *arg) {\n    const u_char *p0, *optend;\n    int code, id, len;\n    int optlen;\n\n    p0 = p;\n    if (plen < HEADERLEN)\n    return 0;\n    code = p[0];\n    id = p[1];\n    len = (p[2] << 8) + p[3];\n    if (len < HEADERLEN || len > plen)\n    return 0;\n\n    if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(ccp_codenames) && ccp_codenames[code-1] != NULL)\n    printer(arg, \" %s\", ccp_codenames[code-1]);\n    else\n    printer(arg, \" code=0x%x\", code);\n    printer(arg, \" id=0x%x\", id);\n    len -= HEADERLEN;\n    p += HEADERLEN;\n\n    switch (code) {\n    case CONFREQ:\n    case CONFACK:\n    case CONFNAK:\n    case CONFREJ:\n    /* print list of possible compression methods */\n    while (len >= 2) {\n        code = p[0];\n        optlen = p[1];\n        if (optlen < 2 || optlen > len)\n        break;\n        printer(arg, \" <\");\n        len -= optlen;\n        optend = p + optlen;\n        switch (code) {\n#if MPPE_SUPPORT\n        case CI_MPPE:\n        if (optlen >= CILEN_MPPE) {\n            u_char mppe_opts;\n\n            MPPE_CI_TO_OPTS(&p[2], mppe_opts);\n            printer(arg, \"mppe %s %s %s %s %s %s%s\",\n                (p[2] & MPPE_H_BIT)? \"+H\": \"-H\",\n                (p[5] & MPPE_M_BIT)? \"+M\": \"-M\",\n                (p[5] & MPPE_S_BIT)? \"+S\": \"-S\",\n                (p[5] & MPPE_L_BIT)? \"+L\": \"-L\",\n                (p[5] & MPPE_D_BIT)? \"+D\": \"-D\",\n                (p[5] & MPPE_C_BIT)? \"+C\": \"-C\",\n                (mppe_opts & MPPE_OPT_UNKNOWN)? \" +U\": \"\");\n            if (mppe_opts & MPPE_OPT_UNKNOWN)\n            printer(arg, \" (%.2x %.2x %.2x %.2x)\",\n                p[2], p[3], p[4], p[5]);\n            p += CILEN_MPPE;\n        }\n        break;\n#endif /* MPPE_SUPPORT */\n#if DEFLATE_SUPPORT\n        case CI_DEFLATE:\n        case CI_DEFLATE_DRAFT:\n        if (optlen >= CILEN_DEFLATE) {\n            printer(arg, \"deflate%s %d\",\n                (code == CI_DEFLATE_DRAFT? \"(old#)\": \"\"),\n                DEFLATE_SIZE(p[2]));\n            if (DEFLATE_METHOD(p[2]) != DEFLATE_METHOD_VAL)\n            printer(arg, \" method %d\", DEFLATE_METHOD(p[2]));\n            if (p[3] != DEFLATE_CHK_SEQUENCE)\n            printer(arg, \" check %d\", p[3]);\n            p += CILEN_DEFLATE;\n        }\n        break;\n#endif /* DEFLATE_SUPPORT */\n#if BSDCOMPRESS_SUPPORT\n        case CI_BSD_COMPRESS:\n        if (optlen >= CILEN_BSD_COMPRESS) {\n            printer(arg, \"bsd v%d %d\", BSD_VERSION(p[2]),\n                BSD_NBITS(p[2]));\n            p += CILEN_BSD_COMPRESS;\n        }\n        break;\n#endif /* BSDCOMPRESS_SUPPORT */\n#if PREDICTOR_SUPPORT\n        case CI_PREDICTOR_1:\n        if (optlen >= CILEN_PREDICTOR_1) {\n            printer(arg, \"predictor 1\");\n            p += CILEN_PREDICTOR_1;\n        }\n        break;\n        case CI_PREDICTOR_2:\n        if (optlen >= CILEN_PREDICTOR_2) {\n            printer(arg, \"predictor 2\");\n            p += CILEN_PREDICTOR_2;\n        }\n        break;\n#endif /* PREDICTOR_SUPPORT */\n        default:\n                break;\n        }\n        while (p < optend)\n        printer(arg, \" %.2x\", *p++);\n        printer(arg, \">\");\n    }\n    break;\n\n    case TERMACK:\n    case TERMREQ:\n    if (len > 0 && *p >= ' ' && *p < 0x7f) {\n        ppp_print_string(p, len, printer, arg);\n        p += len;\n        len = 0;\n    }\n    break;\n    default:\n        break;\n    }\n\n    /* dump out the rest of the packet in hex */\n    while (--len >= 0)\n    printer(arg, \" %.2x\", *p++);\n\n    return p - p0;\n}\n#endif /* PRINTPKT_SUPPORT */\n\n#if PPP_DATAINPUT\n/*\n * We have received a packet that the decompressor failed to\n * decompress.  Here we would expect to issue a reset-request, but\n * Motorola has a patent on resetting the compressor as a result of\n * detecting an error in the decompressed data after decompression.\n * (See US patent 5,130,993; international patent publication number\n * WO 91/10289; Australian patent 73296/91.)\n *\n * So we ask the kernel whether the error was detected after\n * decompression; if it was, we take CCP down, thus disabling\n * compression :-(, otherwise we issue the reset-request.\n */\nstatic void ccp_datainput(ppp_pcb *pcb, u_char *pkt, int len) {\n    fsm *f;\n#if MPPE_SUPPORT\n    ccp_options *go = &pcb->ccp_gotoptions;\n#endif /* MPPE_SUPPORT */\n    LWIP_UNUSED_ARG(pkt);\n    LWIP_UNUSED_ARG(len);\n\n    f = &pcb->ccp_fsm;\n    if (f->state == PPP_FSM_OPENED) {\n    if (ccp_fatal_error(pcb)) {\n        /*\n         * Disable compression by taking CCP down.\n         */\n        ppp_error(\"Lost compression sync: disabling compression\");\n        ccp_close(pcb, \"Lost compression sync\");\n#if MPPE_SUPPORT\n        /*\n         * If we were doing MPPE, we must also take the link down.\n         */\n        if (go->mppe) {\n        ppp_error(\"Too many MPPE errors, closing LCP\");\n        lcp_close(pcb, \"Too many MPPE errors\");\n        }\n#endif /* MPPE_SUPPORT */\n    } else {\n        /*\n         * Send a reset-request to reset the peer's compressor.\n         * We don't do that if we are still waiting for an\n         * acknowledgement to a previous reset-request.\n         */\n        if (!(pcb->ccp_localstate & RACK_PENDING)) {\n        fsm_sdata(f, CCP_RESETREQ, f->reqid = ++f->id, NULL, 0);\n        TIMEOUT(ccp_rack_timeout, f, RACKTIMEOUT);\n        pcb->ccp_localstate |= RACK_PENDING;\n        } else\n        pcb->ccp_localstate |= RREQ_REPEAT;\n    }\n    }\n}\n#endif /* PPP_DATAINPUT */\n\n/*\n * We have received a packet that the decompressor failed to\n * decompress. Issue a reset-request.\n */\nvoid ccp_resetrequest(ppp_pcb *pcb) {\n    fsm *f = &pcb->ccp_fsm;\n\n    if (f->state != PPP_FSM_OPENED)\n    return;\n\n    /*\n     * Send a reset-request to reset the peer's compressor.\n     * We don't do that if we are still waiting for an\n     * acknowledgement to a previous reset-request.\n     */\n    if (!(pcb->ccp_localstate & RACK_PENDING)) {\n    fsm_sdata(f, CCP_RESETREQ, f->reqid = ++f->id, NULL, 0);\n    TIMEOUT(ccp_rack_timeout, f, RACKTIMEOUT);\n    pcb->ccp_localstate |= RACK_PENDING;\n    } else\n    pcb->ccp_localstate |= RREQ_REPEAT;\n}\n\n/*\n * Timeout waiting for reset-ack.\n */\nstatic void ccp_rack_timeout(void *arg) {\n    fsm *f = (fsm*)arg;\n    ppp_pcb *pcb = f->pcb;\n\n    if (f->state == PPP_FSM_OPENED && (pcb->ccp_localstate & RREQ_REPEAT)) {\n    fsm_sdata(f, CCP_RESETREQ, f->reqid, NULL, 0);\n    TIMEOUT(ccp_rack_timeout, f, RACKTIMEOUT);\n    pcb->ccp_localstate &= ~RREQ_REPEAT;\n    } else\n    pcb->ccp_localstate &= ~RACK_PENDING;\n}\n\n#endif /* PPP_SUPPORT && CCP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/chap-md5.c",
    "content": "/*\n * chap-md5.c - New CHAP/MD5 implementation.\n *\n * Copyright (c) 2003 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && CHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#if 0 /* UNUSED */\n#include <stdlib.h>\n#include <string.h>\n#endif /* UNUSED */\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/chap-new.h\"\n#include \"netif/ppp/chap-md5.h\"\n#include \"netif/ppp/magic.h\"\n#include \"netif/ppp/pppcrypt.h\"\n\n#define MD5_HASH_SIZE        16\n#define MD5_MIN_CHALLENGE    17\n#define MD5_MAX_CHALLENGE    24\n#define MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE     3   /* 2^3-1 = 7, 17+7 = 24 */\n\n#if PPP_SERVER\nstatic void chap_md5_generate_challenge(ppp_pcb *pcb, unsigned char *cp) {\n    int clen;\n    LWIP_UNUSED_ARG(pcb);\n\n    clen = MD5_MIN_CHALLENGE + magic_pow(MD5_MIN_MAX_POWER_OF_TWO_CHALLENGE);\n    *cp++ = clen;\n    magic_random_bytes(cp, clen);\n}\n\nstatic int chap_md5_verify_response(ppp_pcb *pcb, int id, const char *name,\n             const unsigned char *secret, int secret_len,\n             const unsigned char *challenge, const unsigned char *response,\n             char *message, int message_space) {\n    lwip_md5_context ctx;\n    unsigned char idbyte = id;\n    unsigned char hash[MD5_HASH_SIZE];\n    int challenge_len, response_len;\n    LWIP_UNUSED_ARG(name);\n    LWIP_UNUSED_ARG(pcb);\n\n    challenge_len = *challenge++;\n    response_len = *response++;\n    if (response_len == MD5_HASH_SIZE) {\n        /* Generate hash of ID, secret, challenge */\n        lwip_md5_init(&ctx);\n        lwip_md5_starts(&ctx);\n        lwip_md5_update(&ctx, &idbyte, 1);\n        lwip_md5_update(&ctx, secret, secret_len);\n        lwip_md5_update(&ctx, challenge, challenge_len);\n        lwip_md5_finish(&ctx, hash);\n        lwip_md5_free(&ctx);\n\n        /* Test if our hash matches the peer's response */\n        if (memcmp(hash, response, MD5_HASH_SIZE) == 0) {\n            ppp_slprintf(message, message_space, \"Access granted\");\n            return 1;\n        }\n    }\n    ppp_slprintf(message, message_space, \"Access denied\");\n    return 0;\n}\n#endif /* PPP_SERVER */\n\nstatic void chap_md5_make_response(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,\n               const unsigned char *challenge, const char *secret, int secret_len,\n               unsigned char *private_) {\n    lwip_md5_context ctx;\n    unsigned char idbyte = id;\n    int challenge_len = *challenge++;\n    LWIP_UNUSED_ARG(our_name);\n    LWIP_UNUSED_ARG(private_);\n    LWIP_UNUSED_ARG(pcb);\n\n    lwip_md5_init(&ctx);\n    lwip_md5_starts(&ctx);\n    lwip_md5_update(&ctx, &idbyte, 1);\n    lwip_md5_update(&ctx, (const u_char *)secret, secret_len);\n    lwip_md5_update(&ctx, challenge, challenge_len);\n    lwip_md5_finish(&ctx, &response[1]);\n    lwip_md5_free(&ctx);\n    response[0] = MD5_HASH_SIZE;\n}\n\nconst struct chap_digest_type md5_digest = {\n    CHAP_MD5,        /* code */\n#if PPP_SERVER\n    chap_md5_generate_challenge,\n    chap_md5_verify_response,\n#endif /* PPP_SERVER */\n    chap_md5_make_response,\n    NULL,            /* check_success */\n    NULL,            /* handle_failure */\n};\n\n#endif /* PPP_SUPPORT && CHAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/chap-new.c",
    "content": "/*\n * chap-new.c - New CHAP implementation.\n *\n * Copyright (c) 2003 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && CHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#if 0 /* UNUSED */\n#include <stdlib.h>\n#include <string.h>\n#endif /* UNUSED */\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#if 0 /* UNUSED */\n#include \"session.h\"\n#endif /* UNUSED */\n\n#include \"netif/ppp/chap-new.h\"\n#include \"netif/ppp/chap-md5.h\"\n#if MSCHAP_SUPPORT\n#include \"netif/ppp/chap_ms.h\"\n#endif\n#include \"netif/ppp/magic.h\"\n\n#if 0 /* UNUSED */\n/* Hook for a plugin to validate CHAP challenge */\nint (*chap_verify_hook)(const char *name, const char *ourname, int id,\n            const struct chap_digest_type *digest,\n            const unsigned char *challenge, const unsigned char *response,\n            char *message, int message_space) = NULL;\n#endif /* UNUSED */\n\n#if PPP_OPTIONS\n/*\n * Command-line options.\n */\nstatic option_t chap_option_list[] = {\n    { \"chap-restart\", o_int, &chap_timeout_time,\n      \"Set timeout for CHAP\", OPT_PRIO },\n    { \"chap-max-challenge\", o_int, &pcb->settings.chap_max_transmits,\n      \"Set max #xmits for challenge\", OPT_PRIO },\n    { \"chap-interval\", o_int, &pcb->settings.chap_rechallenge_time,\n      \"Set interval for rechallenge\", OPT_PRIO },\n    { NULL }\n};\n#endif /* PPP_OPTIONS */\n\n\n/* Values for flags in chap_client_state and chap_server_state */\n#define LOWERUP            1\n#define AUTH_STARTED        2\n#define AUTH_DONE        4\n#define AUTH_FAILED        8\n#define TIMEOUT_PENDING        0x10\n#define CHALLENGE_VALID        0x20\n\n/*\n * Prototypes.\n */\nstatic void chap_init(ppp_pcb *pcb);\nstatic void chap_lowerup(ppp_pcb *pcb);\nstatic void chap_lowerdown(ppp_pcb *pcb);\n#if PPP_SERVER\nstatic void chap_timeout(void *arg);\nstatic void chap_generate_challenge(ppp_pcb *pcb);\nstatic void chap_handle_response(ppp_pcb *pcb, int code,\n        unsigned char *pkt, int len);\nstatic int chap_verify_response(ppp_pcb *pcb, const char *name, const char *ourname, int id,\n        const struct chap_digest_type *digest,\n        const unsigned char *challenge, const unsigned char *response,\n        char *message, int message_space);\n#endif /* PPP_SERVER */\nstatic void chap_respond(ppp_pcb *pcb, int id,\n        unsigned char *pkt, int len);\nstatic void chap_handle_status(ppp_pcb *pcb, int code, int id,\n        unsigned char *pkt, int len);\nstatic void chap_protrej(ppp_pcb *pcb);\nstatic void chap_input(ppp_pcb *pcb, unsigned char *pkt, int pktlen);\n#if PRINTPKT_SUPPORT\nstatic int chap_print_pkt(const unsigned char *p, int plen,\n        void (*printer) (void *, const char *, ...), void *arg);\n#endif /* PRINTPKT_SUPPORT */\n\n/* List of digest types that we know about */\nstatic const struct chap_digest_type* const chap_digests[] = {\n    &md5_digest,\n#if MSCHAP_SUPPORT\n    &chapms_digest,\n    &chapms2_digest,\n#endif /* MSCHAP_SUPPORT */\n    NULL\n};\n\n/*\n * chap_init - reset to initial state.\n */\nstatic void chap_init(ppp_pcb *pcb) {\n    LWIP_UNUSED_ARG(pcb);\n\n#if 0 /* Not necessary, everything is cleared in ppp_new() */\n    memset(&pcb->chap_client, 0, sizeof(chap_client_state));\n#if PPP_SERVER\n    memset(&pcb->chap_server, 0, sizeof(chap_server_state));\n#endif /* PPP_SERVER */\n#endif /* 0 */\n}\n\n/*\n * chap_lowerup - we can start doing stuff now.\n */\nstatic void chap_lowerup(ppp_pcb *pcb) {\n\n    pcb->chap_client.flags |= LOWERUP;\n#if PPP_SERVER\n    pcb->chap_server.flags |= LOWERUP;\n    if (pcb->chap_server.flags & AUTH_STARTED)\n        chap_timeout(pcb);\n#endif /* PPP_SERVER */\n}\n\nstatic void chap_lowerdown(ppp_pcb *pcb) {\n\n    pcb->chap_client.flags = 0;\n#if PPP_SERVER\n    if (pcb->chap_server.flags & TIMEOUT_PENDING)\n        UNTIMEOUT(chap_timeout, pcb);\n    pcb->chap_server.flags = 0;\n#endif /* PPP_SERVER */\n}\n\n#if PPP_SERVER\n/*\n * chap_auth_peer - Start authenticating the peer.\n * If the lower layer is already up, we start sending challenges,\n * otherwise we wait for the lower layer to come up.\n */\nvoid chap_auth_peer(ppp_pcb *pcb, const char *our_name, int digest_code) {\n    const struct chap_digest_type *dp;\n    int i;\n\n    if (pcb->chap_server.flags & AUTH_STARTED) {\n        ppp_error(\"CHAP: peer authentication already started!\");\n        return;\n    }\n    for (i = 0; (dp = chap_digests[i]) != NULL; ++i)\n        if (dp->code == digest_code)\n            break;\n    if (dp == NULL)\n        ppp_fatal(\"CHAP digest 0x%x requested but not available\",\n              digest_code);\n\n    pcb->chap_server.digest = dp;\n    pcb->chap_server.name = our_name;\n    /* Start with a random ID value */\n    pcb->chap_server.id = magic();\n    pcb->chap_server.flags |= AUTH_STARTED;\n    if (pcb->chap_server.flags & LOWERUP)\n        chap_timeout(pcb);\n}\n#endif /* PPP_SERVER */\n\n/*\n * chap_auth_with_peer - Prepare to authenticate ourselves to the peer.\n * There isn't much to do until we receive a challenge.\n */\nvoid chap_auth_with_peer(ppp_pcb *pcb, const char *our_name, int digest_code) {\n    const struct chap_digest_type *dp;\n    int i;\n\n    if(NULL == our_name)\n        return;\n\n    if (pcb->chap_client.flags & AUTH_STARTED) {\n        ppp_error(\"CHAP: authentication with peer already started!\");\n        return;\n    }\n    for (i = 0; (dp = chap_digests[i]) != NULL; ++i)\n        if (dp->code == digest_code)\n            break;\n\n    if (dp == NULL)\n        ppp_fatal(\"CHAP digest 0x%x requested but not available\",\n              digest_code);\n\n    pcb->chap_client.digest = dp;\n    pcb->chap_client.name = our_name;\n    pcb->chap_client.flags |= AUTH_STARTED;\n}\n\n#if PPP_SERVER\n/*\n * chap_timeout - It's time to send another challenge to the peer.\n * This could be either a retransmission of a previous challenge,\n * or a new challenge to start re-authentication.\n */\nstatic void chap_timeout(void *arg) {\n    ppp_pcb *pcb = (ppp_pcb*)arg;\n    struct pbuf *p;\n\n    pcb->chap_server.flags &= ~TIMEOUT_PENDING;\n    if ((pcb->chap_server.flags & CHALLENGE_VALID) == 0) {\n        pcb->chap_server.challenge_xmits = 0;\n        chap_generate_challenge(pcb);\n        pcb->chap_server.flags |= CHALLENGE_VALID;\n    } else if (pcb->chap_server.challenge_xmits >= pcb->settings.chap_max_transmits) {\n        pcb->chap_server.flags &= ~CHALLENGE_VALID;\n        pcb->chap_server.flags |= AUTH_DONE | AUTH_FAILED;\n        auth_peer_fail(pcb, PPP_CHAP);\n        return;\n    }\n\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(pcb->chap_server.challenge_pktlen), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n    MEMCPY(p->payload, pcb->chap_server.challenge, pcb->chap_server.challenge_pktlen);\n    ppp_write(pcb, p);\n    ++pcb->chap_server.challenge_xmits;\n    pcb->chap_server.flags |= TIMEOUT_PENDING;\n    TIMEOUT(chap_timeout, arg, pcb->settings.chap_timeout_time);\n}\n\n/*\n * chap_generate_challenge - generate a challenge string and format\n * the challenge packet in pcb->chap_server.challenge_pkt.\n */\nstatic void chap_generate_challenge(ppp_pcb *pcb) {\n    int clen = 1, nlen, len;\n    unsigned char *p;\n\n    p = pcb->chap_server.challenge;\n    MAKEHEADER(p, PPP_CHAP);\n    p += CHAP_HDRLEN;\n    pcb->chap_server.digest->generate_challenge(pcb, p);\n    clen = *p;\n    nlen = strlen(pcb->chap_server.name);\n    memcpy(p + 1 + clen, pcb->chap_server.name, nlen);\n\n    len = CHAP_HDRLEN + 1 + clen + nlen;\n    pcb->chap_server.challenge_pktlen = PPP_HDRLEN + len;\n\n    p = pcb->chap_server.challenge + PPP_HDRLEN;\n    p[0] = CHAP_CHALLENGE;\n    p[1] = ++pcb->chap_server.id;\n    p[2] = len >> 8;\n    p[3] = len;\n}\n\n/*\n * chap_handle_response - check the response to our challenge.\n */\nstatic void  chap_handle_response(ppp_pcb *pcb, int id,\n             unsigned char *pkt, int len) {\n    int response_len, ok, mlen;\n    const unsigned char *response;\n    unsigned char *outp;\n    struct pbuf *p;\n    const char *name = NULL;    /* initialized to shut gcc up */\n#if 0 /* UNUSED */\n    int (*verifier)(const char *, const char *, int, const struct chap_digest_type *,\n        const unsigned char *, const unsigned char *, char *, int);\n#endif /* UNUSED */\n    char rname[MAXNAMELEN+1];\n    char message[256];\n\n    if ((pcb->chap_server.flags & LOWERUP) == 0)\n        return;\n    if (id != pcb->chap_server.challenge[PPP_HDRLEN+1] || len < 2)\n        return;\n    if (pcb->chap_server.flags & CHALLENGE_VALID) {\n        response = pkt;\n        GETCHAR(response_len, pkt);\n        len -= response_len + 1;    /* length of name */\n        name = (char *)pkt + response_len;\n        if (len < 0)\n            return;\n\n        if (pcb->chap_server.flags & TIMEOUT_PENDING) {\n            pcb->chap_server.flags &= ~TIMEOUT_PENDING;\n            UNTIMEOUT(chap_timeout, pcb);\n        }\n#if PPP_REMOTENAME\n        if (pcb->settings.explicit_remote) {\n            name = pcb->remote_name;\n        } else\n#endif /* PPP_REMOTENAME */\n        {\n            /* Null terminate and clean remote name. */\n            ppp_slprintf(rname, sizeof(rname), \"%.*v\", len, name);\n            name = rname;\n        }\n\n#if 0 /* UNUSED */\n        if (chap_verify_hook)\n            verifier = chap_verify_hook;\n        else\n            verifier = chap_verify_response;\n        ok = (*verifier)(name, pcb->chap_server.name, id, pcb->chap_server.digest,\n                 pcb->chap_server.challenge + PPP_HDRLEN + CHAP_HDRLEN,\n                 response, pcb->chap_server.message, sizeof(pcb->chap_server.message));\n#endif /* UNUSED */\n        ok = chap_verify_response(pcb, name, pcb->chap_server.name, id, pcb->chap_server.digest,\n                    pcb->chap_server.challenge + PPP_HDRLEN + CHAP_HDRLEN,\n                    response, message, sizeof(message));\n#if 0 /* UNUSED */\n        if (!ok || !auth_number()) {\n#endif /* UNUSED */\n        if (!ok) {\n            pcb->chap_server.flags |= AUTH_FAILED;\n            ppp_warn(\"Peer %q failed CHAP authentication\", name);\n        }\n    } else if ((pcb->chap_server.flags & AUTH_DONE) == 0)\n        return;\n\n    /* send the response */\n    mlen = strlen(message);\n    len = CHAP_HDRLEN + mlen;\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +len), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = (unsigned char *)p->payload;\n    MAKEHEADER(outp, PPP_CHAP);\n\n    outp[0] = (pcb->chap_server.flags & AUTH_FAILED)? CHAP_FAILURE: CHAP_SUCCESS;\n    outp[1] = id;\n    outp[2] = len >> 8;\n    outp[3] = len;\n    if (mlen > 0)\n        memcpy(outp + CHAP_HDRLEN, message, mlen);\n    ppp_write(pcb, p);\n\n    if (pcb->chap_server.flags & CHALLENGE_VALID) {\n        pcb->chap_server.flags &= ~CHALLENGE_VALID;\n        if (!(pcb->chap_server.flags & AUTH_DONE) && !(pcb->chap_server.flags & AUTH_FAILED)) {\n\n#if 0 /* UNUSED */\n            /*\n             * Auth is OK, so now we need to check session restrictions\n             * to ensure everything is OK, but only if we used a\n             * plugin, and only if we're configured to check.  This\n             * allows us to do PAM checks on PPP servers that\n             * authenticate against ActiveDirectory, and use AD for\n             * account info (like when using Winbind integrated with\n             * PAM).\n             */\n            if (session_mgmt &&\n            session_check(name, NULL, devnam, NULL) == 0) {\n            pcb->chap_server.flags |= AUTH_FAILED;\n            ppp_warn(\"Peer %q failed CHAP Session verification\", name);\n            }\n#endif /* UNUSED */\n\n        }\n        if (pcb->chap_server.flags & AUTH_FAILED) {\n            auth_peer_fail(pcb, PPP_CHAP);\n        } else {\n            if ((pcb->chap_server.flags & AUTH_DONE) == 0)\n                auth_peer_success(pcb, PPP_CHAP,\n                          pcb->chap_server.digest->code,\n                          name, strlen(name));\n            if (pcb->settings.chap_rechallenge_time) {\n                pcb->chap_server.flags |= TIMEOUT_PENDING;\n                TIMEOUT(chap_timeout, pcb,\n                    pcb->settings.chap_rechallenge_time);\n            }\n        }\n        pcb->chap_server.flags |= AUTH_DONE;\n    }\n}\n\n/*\n * chap_verify_response - check whether the peer's response matches\n * what we think it should be.  Returns 1 if it does (authentication\n * succeeded), or 0 if it doesn't.\n */\nstatic int chap_verify_response(ppp_pcb *pcb, const char *name, const char *ourname, int id,\n             const struct chap_digest_type *digest,\n             const unsigned char *challenge, const unsigned char *response,\n             char *message, int message_space) {\n    int ok;\n    unsigned char secret[MAXSECRETLEN];\n    int secret_len;\n\n    /* Get the secret that the peer is supposed to know */\n    if (!get_secret(pcb, name, ourname, (char *)secret, &secret_len, 1)) {\n        ppp_error(\"No CHAP secret found for authenticating %q\", name);\n        return 0;\n    }\n    ok = digest->verify_response(pcb, id, name, secret, secret_len, challenge,\n                     response, message, message_space);\n    memset(secret, 0, sizeof(secret));\n\n    return ok;\n}\n#endif /* PPP_SERVER */\n\n/*\n * chap_respond - Generate and send a response to a challenge.\n */\nstatic void chap_respond(ppp_pcb *pcb, int id,\n         unsigned char *pkt, int len) {\n    int clen, nlen;\n    int secret_len;\n    struct pbuf *p;\n    u_char *outp;\n    char rname[MAXNAMELEN+1];\n    char secret[MAXSECRETLEN+1];\n\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(RESP_MAX_PKTLEN), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    if ((pcb->chap_client.flags & (LOWERUP | AUTH_STARTED)) != (LOWERUP | AUTH_STARTED))\n        return;        /* not ready */\n    if (len < 2 || len < pkt[0] + 1)\n        return;        /* too short */\n    clen = pkt[0];\n    nlen = len - (clen + 1);\n\n    /* Null terminate and clean remote name. */\n    ppp_slprintf(rname, sizeof(rname), \"%.*v\", nlen, pkt + clen + 1);\n\n#if PPP_REMOTENAME\n    /* Microsoft doesn't send their name back in the PPP packet */\n    if (pcb->settings.explicit_remote || (pcb->settings.remote_name[0] != 0 && rname[0] == 0))\n        strlcpy(rname, pcb->settings.remote_name, sizeof(rname));\n#endif /* PPP_REMOTENAME */\n\n    /* get secret for authenticating ourselves with the specified host */\n    if (!get_secret(pcb, pcb->chap_client.name, rname, secret, &secret_len, 0)) {\n        secret_len = 0;    /* assume null secret if can't find one */\n        ppp_warn(\"No CHAP secret found for authenticating us to %q\", rname);\n    }\n\n    outp = (u_char*)p->payload;\n    MAKEHEADER(outp, PPP_CHAP);\n    outp += CHAP_HDRLEN;\n\n    pcb->chap_client.digest->make_response(pcb, outp, id, pcb->chap_client.name, pkt,\n                  secret, secret_len, pcb->chap_client.priv);\n    memset(secret, 0, secret_len);\n\n    clen = *outp;\n    nlen = strlen(pcb->chap_client.name);\n    memcpy(outp + clen + 1, pcb->chap_client.name, nlen);\n\n    outp = (u_char*)p->payload + PPP_HDRLEN;\n    len = CHAP_HDRLEN + clen + 1 + nlen;\n    outp[0] = CHAP_RESPONSE;\n    outp[1] = id;\n    outp[2] = len >> 8;\n    outp[3] = len;\n\n    pbuf_realloc(p, PPP_HDRLEN + len);\n    ppp_write(pcb, p);\n}\n\nstatic void chap_handle_status(ppp_pcb *pcb, int code, int id,\n           unsigned char *pkt, int len) {\n    const char *msg = NULL;\n    LWIP_UNUSED_ARG(id);\n\n    if ((pcb->chap_client.flags & (AUTH_DONE|AUTH_STARTED|LOWERUP))\n        != (AUTH_STARTED|LOWERUP))\n        return;\n    pcb->chap_client.flags |= AUTH_DONE;\n\n    if (code == CHAP_SUCCESS) {\n        /* used for MS-CHAP v2 mutual auth, yuck */\n        if (pcb->chap_client.digest->check_success != NULL) {\n            if (!(*pcb->chap_client.digest->check_success)(pcb, pkt, len, pcb->chap_client.priv))\n                code = CHAP_FAILURE;\n        } else\n            msg = \"CHAP authentication succeeded\";\n    } else {\n        if (pcb->chap_client.digest->handle_failure != NULL)\n            (*pcb->chap_client.digest->handle_failure)(pcb, pkt, len);\n        else\n            msg = \"CHAP authentication failed\";\n    }\n    if (msg) {\n        if (len > 0)\n            ppp_info(\"%s: %.*v\", msg, len, pkt);\n        else\n            ppp_info(\"%s\", msg);\n    }\n    if (code == CHAP_SUCCESS)\n        auth_withpeer_success(pcb, PPP_CHAP, pcb->chap_client.digest->code);\n    else {\n        pcb->chap_client.flags |= AUTH_FAILED;\n        ppp_error(\"CHAP authentication failed\");\n        auth_withpeer_fail(pcb, PPP_CHAP);\n    }\n}\n\nstatic void chap_input(ppp_pcb *pcb, unsigned char *pkt, int pktlen) {\n    unsigned char code, id;\n    int len;\n\n    if (pktlen < CHAP_HDRLEN)\n        return;\n    GETCHAR(code, pkt);\n    GETCHAR(id, pkt);\n    GETSHORT(len, pkt);\n    if (len < CHAP_HDRLEN || len > pktlen)\n        return;\n    len -= CHAP_HDRLEN;\n\n    switch (code) {\n    case CHAP_CHALLENGE:\n        chap_respond(pcb, id, pkt, len);\n        break;\n#if PPP_SERVER\n    case CHAP_RESPONSE:\n        chap_handle_response(pcb, id, pkt, len);\n        break;\n#endif /* PPP_SERVER */\n    case CHAP_FAILURE:\n    case CHAP_SUCCESS:\n        chap_handle_status(pcb, code, id, pkt, len);\n        break;\n    default:\n        break;\n    }\n}\n\nstatic void chap_protrej(ppp_pcb *pcb) {\n\n#if PPP_SERVER\n    if (pcb->chap_server.flags & TIMEOUT_PENDING) {\n        pcb->chap_server.flags &= ~TIMEOUT_PENDING;\n        UNTIMEOUT(chap_timeout, pcb);\n    }\n    if (pcb->chap_server.flags & AUTH_STARTED) {\n        pcb->chap_server.flags = 0;\n        auth_peer_fail(pcb, PPP_CHAP);\n    }\n#endif /* PPP_SERVER */\n    if ((pcb->chap_client.flags & (AUTH_STARTED|AUTH_DONE)) == AUTH_STARTED) {\n        pcb->chap_client.flags &= ~AUTH_STARTED;\n        ppp_error(\"CHAP authentication failed due to protocol-reject\");\n        auth_withpeer_fail(pcb, PPP_CHAP);\n    }\n}\n\n#if PRINTPKT_SUPPORT\n/*\n * chap_print_pkt - print the contents of a CHAP packet.\n */\nstatic const char* const chap_code_names[] = {\n    \"Challenge\", \"Response\", \"Success\", \"Failure\"\n};\n\nstatic int chap_print_pkt(const unsigned char *p, int plen,\n           void (*printer) (void *, const char *, ...), void *arg) {\n    int code, id, len;\n    int clen, nlen;\n    unsigned char x;\n\n    if (plen < CHAP_HDRLEN)\n        return 0;\n    GETCHAR(code, p);\n    GETCHAR(id, p);\n    GETSHORT(len, p);\n    if (len < CHAP_HDRLEN || len > plen)\n        return 0;\n\n    if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(chap_code_names))\n        printer(arg, \" %s\", chap_code_names[code-1]);\n    else\n        printer(arg, \" code=0x%x\", code);\n    printer(arg, \" id=0x%x\", id);\n    len -= CHAP_HDRLEN;\n    switch (code) {\n    case CHAP_CHALLENGE:\n    case CHAP_RESPONSE:\n        if (len < 1)\n            break;\n        clen = p[0];\n        if (len < clen + 1)\n            break;\n        ++p;\n        nlen = len - clen - 1;\n        printer(arg, \" <\");\n        for (; clen > 0; --clen) {\n            GETCHAR(x, p);\n            printer(arg, \"%.2x\", x);\n        }\n        printer(arg, \">, name = \");\n        ppp_print_string(p, nlen, printer, arg);\n        break;\n    case CHAP_FAILURE:\n    case CHAP_SUCCESS:\n        printer(arg, \" \");\n        ppp_print_string(p, len, printer, arg);\n        break;\n    default:\n        for (clen = len; clen > 0; --clen) {\n            GETCHAR(x, p);\n            printer(arg, \" %.2x\", x);\n        }\n        /* no break */\n    }\n\n    return len + CHAP_HDRLEN;\n}\n#endif /* PRINTPKT_SUPPORT */\n\nconst struct protent chap_protent = {\n    PPP_CHAP,\n    chap_init,\n    chap_input,\n    chap_protrej,\n    chap_lowerup,\n    chap_lowerdown,\n    NULL,        /* open */\n    NULL,        /* close */\n#if PRINTPKT_SUPPORT\n    chap_print_pkt,\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_DATAINPUT\n    NULL,        /* datainput */\n#endif /* PPP_DATAINPUT */\n#if PRINTPKT_SUPPORT\n    \"CHAP\",        /* name */\n    NULL,        /* data_name */\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_OPTIONS\n    chap_option_list,\n    NULL,        /* check_options */\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\n    NULL,\n    NULL\n#endif /* DEMAND_SUPPORT */\n};\n\n#endif /* PPP_SUPPORT && CHAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/chap_ms.c",
    "content": "/*\n * chap_ms.c - Microsoft MS-CHAP compatible implementation.\n *\n * Copyright (c) 1995 Eric Rosenquist.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n/*\n * Modifications by Lauri Pesonen / lpesonen@clinet.fi, april 1997\n *\n *   Implemented LANManager type password response to MS-CHAP challenges.\n *   Now pppd provides both NT style and LANMan style blocks, and the\n *   prefered is set by option \"ms-lanman\". Default is to use NT.\n *   The hash text (StdText) was taken from Win95 RASAPI32.DLL.\n *\n *   You should also use DOMAIN\\\\USERNAME as described in README.MSCHAP80\n */\n\n/*\n * Modifications by Frank Cusack, frank@google.com, March 2002.\n *\n *   Implemented MS-CHAPv2 functionality, heavily based on sample\n *   implementation in RFC 2759.  Implemented MPPE functionality,\n *   heavily based on sample implementation in RFC 3079.\n *\n * Copyright (c) 2002 Google, Inc.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && MSCHAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#if 0 /* UNUSED */\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <sys/types.h>\n#include <sys/time.h>\n#include <unistd.h>\n#endif /* UNUSED */\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/chap-new.h\"\n#include \"netif/ppp/chap_ms.h\"\n#include \"netif/ppp/pppcrypt.h\"\n#include \"netif/ppp/magic.h\"\n#if MPPE_SUPPORT\n#include \"netif/ppp/mppe.h\" /* For mppe_sha1_pad*, mppe_set_key() */\n#endif /* MPPE_SUPPORT */\n\n#define SHA1_SIGNATURE_SIZE    20\n#define MD4_SIGNATURE_SIZE    16    /* 16 bytes in a MD4 message digest */\n#define MAX_NT_PASSWORD        256    /* Max (Unicode) chars in an NT pass */\n\n#define MS_CHAP_RESPONSE_LEN    49    /* Response length for MS-CHAP */\n#define MS_CHAP2_RESPONSE_LEN    49    /* Response length for MS-CHAPv2 */\n#define MS_AUTH_RESPONSE_LENGTH    40    /* MS-CHAPv2 authenticator response, */\n                    /* as ASCII */\n\n/* Error codes for MS-CHAP failure messages. */\n#define MS_CHAP_ERROR_RESTRICTED_LOGON_HOURS    646\n#define MS_CHAP_ERROR_ACCT_DISABLED        647\n#define MS_CHAP_ERROR_PASSWD_EXPIRED        648\n#define MS_CHAP_ERROR_NO_DIALIN_PERMISSION    649\n#define MS_CHAP_ERROR_AUTHENTICATION_FAILURE    691\n#define MS_CHAP_ERROR_CHANGING_PASSWORD        709\n\n/*\n * Offsets within the response field for MS-CHAP\n */\n#define MS_CHAP_LANMANRESP    0\n#define MS_CHAP_LANMANRESP_LEN    24\n#define MS_CHAP_NTRESP        24\n#define MS_CHAP_NTRESP_LEN    24\n#define MS_CHAP_USENT        48\n\n/*\n * Offsets within the response field for MS-CHAP2\n */\n#define MS_CHAP2_PEER_CHALLENGE    0\n#define MS_CHAP2_PEER_CHAL_LEN    16\n#define MS_CHAP2_RESERVED_LEN    8\n#define MS_CHAP2_NTRESP        24\n#define MS_CHAP2_NTRESP_LEN    24\n#define MS_CHAP2_FLAGS        48\n\n#if MPPE_SUPPORT\n#if 0 /* UNUSED */\n/* These values are the RADIUS attribute values--see RFC 2548. */\n#define MPPE_ENC_POL_ENC_ALLOWED 1\n#define MPPE_ENC_POL_ENC_REQUIRED 2\n#define MPPE_ENC_TYPES_RC4_40 2\n#define MPPE_ENC_TYPES_RC4_128 4\n\n/* used by plugins (using above values) */\nextern void set_mppe_enc_types(int, int);\n#endif /* UNUSED */\n#endif /* MPPE_SUPPORT */\n\n/* Are we the authenticator or authenticatee?  For MS-CHAPv2 key derivation. */\n#define MS_CHAP2_AUTHENTICATEE 0\n#define MS_CHAP2_AUTHENTICATOR 1\n\nstatic void    ascii2unicode (const char[], int, u_char[]);\nstatic void    NTPasswordHash (u_char *, int, u_char[MD4_SIGNATURE_SIZE]);\nstatic void    ChallengeResponse (const u_char *, const u_char *, u_char[24]);\nstatic void    ChallengeHash (const u_char[16], const u_char *, const char *, u_char[8]);\nstatic void    ChapMS_NT (const u_char *, const char *, int, u_char[24]);\nstatic void    ChapMS2_NT (const u_char *, const u_char[16], const char *, const char *, int,\n                u_char[24]);\nstatic void    GenerateAuthenticatorResponsePlain\n            (const char*, int, u_char[24], const u_char[16], const u_char *,\n                 const char *, u_char[41]);\n#ifdef MSLANMAN\nstatic void    ChapMS_LANMan (u_char *, char *, int, u_char *);\n#endif\n\nstatic void GenerateAuthenticatorResponse(const u_char PasswordHashHash[MD4_SIGNATURE_SIZE],\n            u_char NTResponse[24], const u_char PeerChallenge[16],\n            const u_char *rchallenge, const char *username,\n            u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]);\n\n#if MPPE_SUPPORT\nstatic void    Set_Start_Key (ppp_pcb *pcb, const u_char *, const char *, int);\nstatic void    SetMasterKeys (ppp_pcb *pcb, const char *, int, u_char[24], int);\n#endif /* MPPE_SUPPORT */\n\nstatic void ChapMS (ppp_pcb *pcb, const u_char *, const char *, int, u_char *);\nstatic void ChapMS2 (ppp_pcb *pcb, const u_char *, const u_char *, const char *, const char *, int,\n          u_char *, u_char[MS_AUTH_RESPONSE_LENGTH+1], int);\n\n#ifdef MSLANMAN\nbool    ms_lanman = 0;        /* Use LanMan password instead of NT */\n                  /* Has meaning only with MS-CHAP challenges */\n#endif\n\n#if MPPE_SUPPORT\n#ifdef DEBUGMPPEKEY\n/* For MPPE debug */\n/* Use \"[]|}{?/><,`!2&&(\" (sans quotes) for RFC 3079 MS-CHAPv2 test value */\nstatic char *mschap_challenge = NULL;\n/* Use \"!@\\#$%^&*()_+:3|~\" (sans quotes, backslash is to escape #) for ... */\nstatic char *mschap2_peer_challenge = NULL;\n#endif\n\n#include \"netif/ppp/fsm.h\"        /* Need to poke MPPE options */\n#include \"netif/ppp/ccp.h\"\n#endif /* MPPE_SUPPORT */\n\n#if PPP_OPTIONS\n/*\n * Command-line options.\n */\nstatic option_t chapms_option_list[] = {\n#ifdef MSLANMAN\n    { \"ms-lanman\", o_bool, &ms_lanman,\n      \"Use LanMan passwd when using MS-CHAP\", 1 },\n#endif\n#ifdef DEBUGMPPEKEY\n    { \"mschap-challenge\", o_string, &mschap_challenge,\n      \"specify CHAP challenge\" },\n    { \"mschap2-peer-challenge\", o_string, &mschap2_peer_challenge,\n      \"specify CHAP peer challenge\" },\n#endif\n    { NULL }\n};\n#endif /* PPP_OPTIONS */\n\n#if PPP_SERVER\n/*\n * chapms_generate_challenge - generate a challenge for MS-CHAP.\n * For MS-CHAP the challenge length is fixed at 8 bytes.\n * The length goes in challenge[0] and the actual challenge starts\n * at challenge[1].\n */\nstatic void chapms_generate_challenge(ppp_pcb *pcb, unsigned char *challenge) {\n    LWIP_UNUSED_ARG(pcb);\n\n    *challenge++ = 8;\n#ifdef DEBUGMPPEKEY\n    if (mschap_challenge && strlen(mschap_challenge) == 8)\n        memcpy(challenge, mschap_challenge, 8);\n    else\n#endif\n        magic_random_bytes(challenge, 8);\n}\n\nstatic void chapms2_generate_challenge(ppp_pcb *pcb, unsigned char *challenge) {\n    LWIP_UNUSED_ARG(pcb);\n\n    *challenge++ = 16;\n#ifdef DEBUGMPPEKEY\n    if (mschap_challenge && strlen(mschap_challenge) == 16)\n        memcpy(challenge, mschap_challenge, 16);\n    else\n#endif\n        magic_random_bytes(challenge, 16);\n}\n\nstatic int chapms_verify_response(ppp_pcb *pcb, int id, const char *name,\n               const unsigned char *secret, int secret_len,\n               const unsigned char *challenge, const unsigned char *response,\n               char *message, int message_space) {\n    unsigned char md[MS_CHAP_RESPONSE_LEN];\n    int diff;\n    int challenge_len, response_len;\n    LWIP_UNUSED_ARG(id);\n    LWIP_UNUSED_ARG(name);\n\n    challenge_len = *challenge++;    /* skip length, is 8 */\n    response_len = *response++;\n    if (response_len != MS_CHAP_RESPONSE_LEN)\n        goto bad;\n\n#ifndef MSLANMAN\n    if (!response[MS_CHAP_USENT]) {\n        /* Should really propagate this into the error packet. */\n        ppp_notice(\"Peer request for LANMAN auth not supported\");\n        goto bad;\n    }\n#endif\n\n    /* Generate the expected response. */\n    ChapMS(pcb, (const u_char *)challenge, (const char *)secret, secret_len, md);\n\n#ifdef MSLANMAN\n    /* Determine which part of response to verify against */\n    if (!response[MS_CHAP_USENT])\n        diff = memcmp(&response[MS_CHAP_LANMANRESP],\n                  &md[MS_CHAP_LANMANRESP], MS_CHAP_LANMANRESP_LEN);\n    else\n#endif\n        diff = memcmp(&response[MS_CHAP_NTRESP], &md[MS_CHAP_NTRESP],\n                  MS_CHAP_NTRESP_LEN);\n\n    if (diff == 0) {\n        ppp_slprintf(message, message_space, \"Access granted\");\n        return 1;\n    }\n\n bad:\n    /* See comments below for MS-CHAP V2 */\n    ppp_slprintf(message, message_space, \"E=691 R=1 C=%0.*B V=0\",\n         challenge_len, challenge);\n    return 0;\n}\n\nstatic int chapms2_verify_response(ppp_pcb *pcb, int id, const char *name,\n            const unsigned char *secret, int secret_len,\n            const unsigned char *challenge, const unsigned char *response,\n            char *message, int message_space) {\n    unsigned char md[MS_CHAP2_RESPONSE_LEN];\n    char saresponse[MS_AUTH_RESPONSE_LENGTH+1];\n    int challenge_len, response_len;\n    LWIP_UNUSED_ARG(id);\n\n    challenge_len = *challenge++;    /* skip length, is 16 */\n    response_len = *response++;\n    if (response_len != MS_CHAP2_RESPONSE_LEN)\n        goto bad;    /* not even the right length */\n\n    /* Generate the expected response and our mutual auth. */\n    ChapMS2(pcb, (const u_char*)challenge, (const u_char*)&response[MS_CHAP2_PEER_CHALLENGE], name,\n        (const char *)secret, secret_len, md,\n        (unsigned char *)saresponse, MS_CHAP2_AUTHENTICATOR);\n\n    /* compare MDs and send the appropriate status */\n    /*\n     * Per RFC 2759, success message must be formatted as\n     *     \"S=<auth_string> M=<message>\"\n     * where\n     *     <auth_string> is the Authenticator Response (mutual auth)\n     *     <message> is a text message\n     *\n     * However, some versions of Windows (win98 tested) do not know\n     * about the M=<message> part (required per RFC 2759) and flag\n     * it as an error (reported incorrectly as an encryption error\n     * to the user).  Since the RFC requires it, and it can be\n     * useful information, we supply it if the peer is a conforming\n     * system.  Luckily (?), win98 sets the Flags field to 0x04\n     * (contrary to RFC requirements) so we can use that to\n     * distinguish between conforming and non-conforming systems.\n     *\n     * Special thanks to Alex Swiridov <say@real.kharkov.ua> for\n     * help debugging this.\n     */\n    if (memcmp(&md[MS_CHAP2_NTRESP], &response[MS_CHAP2_NTRESP],\n           MS_CHAP2_NTRESP_LEN) == 0) {\n        if (response[MS_CHAP2_FLAGS])\n            ppp_slprintf(message, message_space, \"S=%s\", saresponse);\n        else\n            ppp_slprintf(message, message_space, \"S=%s M=%s\",\n                 saresponse, \"Access granted\");\n        return 1;\n    }\n\n bad:\n    /*\n     * Failure message must be formatted as\n     *     \"E=e R=r C=c V=v M=m\"\n     * where\n     *     e = error code (we use 691, ERROR_AUTHENTICATION_FAILURE)\n     *     r = retry (we use 1, ok to retry)\n     *     c = challenge to use for next response, we reuse previous\n     *     v = Change Password version supported, we use 0\n     *     m = text message\n     *\n     * The M=m part is only for MS-CHAPv2.  Neither win2k nor\n     * win98 (others untested) display the message to the user anyway.\n     * They also both ignore the E=e code.\n     *\n     * Note that it's safe to reuse the same challenge as we don't\n     * actually accept another response based on the error message\n     * (and no clients try to resend a response anyway).\n     *\n     * Basically, this whole bit is useless code, even the small\n     * implementation here is only because of overspecification.\n     */\n    ppp_slprintf(message, message_space, \"E=691 R=1 C=%0.*B V=0 M=%s\",\n         challenge_len, challenge, \"Access denied\");\n    return 0;\n}\n#endif /* PPP_SERVER */\n\nstatic void chapms_make_response(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,\n             const unsigned char *challenge, const char *secret, int secret_len,\n             unsigned char *private_) {\n    LWIP_UNUSED_ARG(id);\n    LWIP_UNUSED_ARG(our_name);\n    LWIP_UNUSED_ARG(private_);\n    challenge++;    /* skip length, should be 8 */\n    *response++ = MS_CHAP_RESPONSE_LEN;\n    ChapMS(pcb, challenge, secret, secret_len, response);\n}\n\nstatic void chapms2_make_response(ppp_pcb *pcb, unsigned char *response, int id, const char *our_name,\n              const unsigned char *challenge, const char *secret, int secret_len,\n              unsigned char *private_) {\n    LWIP_UNUSED_ARG(id);\n    challenge++;    /* skip length, should be 16 */\n    *response++ = MS_CHAP2_RESPONSE_LEN;\n    ChapMS2(pcb, challenge,\n#ifdef DEBUGMPPEKEY\n        mschap2_peer_challenge,\n#else\n        NULL,\n#endif\n        our_name, secret, secret_len, response, private_,\n        MS_CHAP2_AUTHENTICATEE);\n}\n\nstatic int chapms2_check_success(ppp_pcb *pcb, unsigned char *msg, int len, unsigned char *private_) {\n    LWIP_UNUSED_ARG(pcb);\n\n    if ((len < MS_AUTH_RESPONSE_LENGTH + 2) ||\n        strncmp((char *)msg, \"S=\", 2) != 0) {\n        /* Packet does not start with \"S=\" */\n        ppp_error(\"MS-CHAPv2 Success packet is badly formed.\");\n        return 0;\n    }\n    msg += 2;\n    len -= 2;\n    if (len < MS_AUTH_RESPONSE_LENGTH\n        || memcmp(msg, private_, MS_AUTH_RESPONSE_LENGTH)) {\n        /* Authenticator Response did not match expected. */\n        ppp_error(\"MS-CHAPv2 mutual authentication failed.\");\n        return 0;\n    }\n    /* Authenticator Response matches. */\n    msg += MS_AUTH_RESPONSE_LENGTH; /* Eat it */\n    len -= MS_AUTH_RESPONSE_LENGTH;\n    if ((len >= 3) && !strncmp((char *)msg, \" M=\", 3)) {\n        msg += 3; /* Eat the delimiter */\n    } else if (len) {\n        /* Packet has extra text which does not begin \" M=\" */\n        ppp_error(\"MS-CHAPv2 Success packet is badly formed.\");\n        return 0;\n    }\n    return 1;\n}\n\nstatic void chapms_handle_failure(ppp_pcb *pcb, unsigned char *inp, int len) {\n    int err;\n    const char *p;\n    char msg[64];\n    LWIP_UNUSED_ARG(pcb);\n\n    /* We want a null-terminated string for strxxx(). */\n    len = LWIP_MIN(len, 63);\n    MEMCPY(msg, inp, len);\n    msg[len] = 0;\n    p = msg;\n\n    /*\n     * Deal with MS-CHAP formatted failure messages; just print the\n     * M=<message> part (if any).  For MS-CHAP we're not really supposed\n     * to use M=<message>, but it shouldn't hurt.  See\n     * chapms[2]_verify_response.\n     */\n    if (!strncmp(p, \"E=\", 2))\n        err = strtol(p+2, NULL, 10); /* Remember the error code. */\n    else\n        goto print_msg; /* Message is badly formatted. */\n\n    if (len && ((p = strstr(p, \" M=\")) != NULL)) {\n        /* M=<message> field found. */\n        p += 3;\n    } else {\n        /* No M=<message>; use the error code. */\n        switch (err) {\n        case MS_CHAP_ERROR_RESTRICTED_LOGON_HOURS:\n            p = \"E=646 Restricted logon hours\";\n            break;\n\n        case MS_CHAP_ERROR_ACCT_DISABLED:\n            p = \"E=647 Account disabled\";\n            break;\n\n        case MS_CHAP_ERROR_PASSWD_EXPIRED:\n            p = \"E=648 Password expired\";\n            break;\n\n        case MS_CHAP_ERROR_NO_DIALIN_PERMISSION:\n            p = \"E=649 No dialin permission\";\n            break;\n\n        case MS_CHAP_ERROR_AUTHENTICATION_FAILURE:\n            p = \"E=691 Authentication failure\";\n            break;\n\n        case MS_CHAP_ERROR_CHANGING_PASSWORD:\n            /* Should never see this, we don't support Change Password. */\n            p = \"E=709 Error changing password\";\n            break;\n\n        default:\n            ppp_error(\"Unknown MS-CHAP authentication failure: %.*v\",\n                  len, inp);\n            return;\n        }\n    }\nprint_msg:\n    if (p != NULL)\n        ppp_error(\"MS-CHAP authentication failed: %v\", p);\n}\n\nstatic void ChallengeResponse(const u_char *challenge,\n          const u_char PasswordHash[MD4_SIGNATURE_SIZE],\n          u_char response[24]) {\n    u_char    ZPasswordHash[21];\n    lwip_des_context des;\n    u_char des_key[8];\n\n    BZERO(ZPasswordHash, sizeof(ZPasswordHash));\n    MEMCPY(ZPasswordHash, PasswordHash, MD4_SIGNATURE_SIZE);\n\n#if 0\n    dbglog(\"ChallengeResponse - ZPasswordHash %.*B\",\n       sizeof(ZPasswordHash), ZPasswordHash);\n#endif\n\n    pppcrypt_56_to_64_bit_key(ZPasswordHash + 0, des_key);\n    lwip_des_init(&des);\n    lwip_des_setkey_enc(&des, des_key);\n    lwip_des_crypt_ecb(&des, challenge, response +0);\n    lwip_des_free(&des);\n\n    pppcrypt_56_to_64_bit_key(ZPasswordHash + 7, des_key);\n    lwip_des_init(&des);\n    lwip_des_setkey_enc(&des, des_key);\n    lwip_des_crypt_ecb(&des, challenge, response +8);\n    lwip_des_free(&des);\n\n    pppcrypt_56_to_64_bit_key(ZPasswordHash + 14, des_key);\n    lwip_des_init(&des);\n    lwip_des_setkey_enc(&des, des_key);\n    lwip_des_crypt_ecb(&des, challenge, response +16);\n    lwip_des_free(&des);\n\n#if 0\n    dbglog(\"ChallengeResponse - response %.24B\", response);\n#endif\n}\n\nstatic void ChallengeHash(const u_char PeerChallenge[16], const u_char *rchallenge,\n          const char *username, u_char Challenge[8]) {\n    lwip_sha1_context    sha1Context;\n    u_char    sha1Hash[SHA1_SIGNATURE_SIZE];\n    const char    *user;\n\n    /* remove domain from \"domain\\username\" */\n    if ((user = strrchr(username, '\\\\')) != NULL)\n    ++user;\n    else\n    user = username;\n\n    lwip_sha1_init(&sha1Context);\n    lwip_sha1_starts(&sha1Context);\n    lwip_sha1_update(&sha1Context, PeerChallenge, 16);\n    lwip_sha1_update(&sha1Context, rchallenge, 16);\n    lwip_sha1_update(&sha1Context, (const unsigned char*)user, strlen(user));\n    lwip_sha1_finish(&sha1Context, sha1Hash);\n    lwip_sha1_free(&sha1Context);\n\n    MEMCPY(Challenge, sha1Hash, 8);\n}\n\n/*\n * Convert the ASCII version of the password to Unicode.\n * This implicitly supports 8-bit ISO8859/1 characters.\n * This gives us the little-endian representation, which\n * is assumed by all M$ CHAP RFCs.  (Unicode byte ordering\n * is machine-dependent.)\n */\nstatic void ascii2unicode(const char ascii[], int ascii_len, u_char unicode[]) {\n    int i;\n\n    BZERO(unicode, ascii_len * 2);\n    for (i = 0; i < ascii_len; i++)\n    unicode[i * 2] = (u_char) ascii[i];\n}\n\nstatic void NTPasswordHash(u_char *secret, int secret_len, u_char hash[MD4_SIGNATURE_SIZE]) {\n    lwip_md4_context        md4Context;\n\n    lwip_md4_init(&md4Context);\n    lwip_md4_starts(&md4Context);\n    lwip_md4_update(&md4Context, secret, secret_len);\n    lwip_md4_finish(&md4Context, hash);\n    lwip_md4_free(&md4Context);\n}\n\nstatic void ChapMS_NT(const u_char *rchallenge, const char *secret, int secret_len,\n      u_char NTResponse[24]) {\n    u_char    unicodePassword[MAX_NT_PASSWORD * 2];\n    u_char    PasswordHash[MD4_SIGNATURE_SIZE];\n\n    /* Hash the Unicode version of the secret (== password). */\n    ascii2unicode(secret, secret_len, unicodePassword);\n    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);\n\n    ChallengeResponse(rchallenge, PasswordHash, NTResponse);\n}\n\nstatic void ChapMS2_NT(const u_char *rchallenge, const u_char PeerChallenge[16], const char *username,\n       const char *secret, int secret_len, u_char NTResponse[24]) {\n    u_char    unicodePassword[MAX_NT_PASSWORD * 2];\n    u_char    PasswordHash[MD4_SIGNATURE_SIZE];\n    u_char    Challenge[8];\n\n    ChallengeHash(PeerChallenge, rchallenge, username, Challenge);\n\n    /* Hash the Unicode version of the secret (== password). */\n    ascii2unicode(secret, secret_len, unicodePassword);\n    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);\n\n    ChallengeResponse(Challenge, PasswordHash, NTResponse);\n}\n\n#ifdef MSLANMAN\nstatic u_char *StdText = (u_char *)\"KGS!@#$%\"; /* key from rasapi32.dll */\n\nstatic void ChapMS_LANMan(u_char *rchallenge, char *secret, int secret_len,\n          unsigned char *response) {\n    int            i;\n    u_char        UcasePassword[MAX_NT_PASSWORD]; /* max is actually 14 */\n    u_char        PasswordHash[MD4_SIGNATURE_SIZE];\n    lwip_des_context des;\n    u_char des_key[8];\n\n    /* LANMan password is case insensitive */\n    BZERO(UcasePassword, sizeof(UcasePassword));\n    for (i = 0; i < secret_len; i++)\n       UcasePassword[i] = (u_char)toupper(secret[i]);\n\n    pppcrypt_56_to_64_bit_key(UcasePassword +0, des_key);\n    lwip_des_init(&des);\n    lwip_des_setkey_enc(&des, des_key);\n    lwip_des_crypt_ecb(&des, StdText, PasswordHash +0);\n    lwip_des_free(&des);\n\n    pppcrypt_56_to_64_bit_key(UcasePassword +7, des_key);\n    lwip_des_init(&des);\n    lwip_des_setkey_enc(&des, des_key);\n    lwip_des_crypt_ecb(&des, StdText, PasswordHash +8);\n    lwip_des_free(&des);\n\n    ChallengeResponse(rchallenge, PasswordHash, &response[MS_CHAP_LANMANRESP]);\n}\n#endif\n\n\nstatic void GenerateAuthenticatorResponse(const u_char PasswordHashHash[MD4_SIGNATURE_SIZE],\n                  u_char NTResponse[24], const u_char PeerChallenge[16],\n                  const u_char *rchallenge, const char *username,\n                  u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]) {\n    /*\n     * \"Magic\" constants used in response generation, from RFC 2759.\n     */\n    static const u_char Magic1[39] = /* \"Magic server to client signing constant\" */\n    { 0x4D, 0x61, 0x67, 0x69, 0x63, 0x20, 0x73, 0x65, 0x72, 0x76,\n      0x65, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x63, 0x6C, 0x69, 0x65,\n      0x6E, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x69, 0x6E, 0x67,\n      0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x74 };\n    static const u_char Magic2[41] = /* \"Pad to make it do more than one iteration\" */\n    { 0x50, 0x61, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x6D, 0x61, 0x6B,\n      0x65, 0x20, 0x69, 0x74, 0x20, 0x64, 0x6F, 0x20, 0x6D, 0x6F,\n      0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6E, 0x20, 0x6F, 0x6E,\n      0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6F,\n      0x6E };\n\n    int        i;\n    lwip_sha1_context    sha1Context;\n    u_char    Digest[SHA1_SIGNATURE_SIZE];\n    u_char    Challenge[8];\n\n    lwip_sha1_init(&sha1Context);\n    lwip_sha1_starts(&sha1Context);\n    lwip_sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);\n    lwip_sha1_update(&sha1Context, NTResponse, 24);\n    lwip_sha1_update(&sha1Context, Magic1, sizeof(Magic1));\n    lwip_sha1_finish(&sha1Context, Digest);\n    lwip_sha1_free(&sha1Context);\n\n    ChallengeHash(PeerChallenge, rchallenge, username, Challenge);\n\n    lwip_sha1_init(&sha1Context);\n    lwip_sha1_starts(&sha1Context);\n    lwip_sha1_update(&sha1Context, Digest, sizeof(Digest));\n    lwip_sha1_update(&sha1Context, Challenge, sizeof(Challenge));\n    lwip_sha1_update(&sha1Context, Magic2, sizeof(Magic2));\n    lwip_sha1_finish(&sha1Context, Digest);\n    lwip_sha1_free(&sha1Context);\n\n    /* Convert to ASCII hex string. */\n    for (i = 0; i < LWIP_MAX((MS_AUTH_RESPONSE_LENGTH / 2), (int)sizeof(Digest)); i++)\n    sprintf((char *)&authResponse[i * 2], \"%02X\", Digest[i]);\n}\n\n\nstatic void GenerateAuthenticatorResponsePlain(\n         const char *secret, int secret_len,\n         u_char NTResponse[24], const u_char PeerChallenge[16],\n         const u_char *rchallenge, const char *username,\n         u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]) {\n    u_char    unicodePassword[MAX_NT_PASSWORD * 2];\n    u_char    PasswordHash[MD4_SIGNATURE_SIZE];\n    u_char    PasswordHashHash[MD4_SIGNATURE_SIZE];\n\n    /* Hash (x2) the Unicode version of the secret (== password). */\n    ascii2unicode(secret, secret_len, unicodePassword);\n    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);\n    NTPasswordHash(PasswordHash, sizeof(PasswordHash),\n           PasswordHashHash);\n\n    GenerateAuthenticatorResponse(PasswordHashHash, NTResponse, PeerChallenge,\n                  rchallenge, username, authResponse);\n}\n\n\n#if MPPE_SUPPORT\n/*\n * Set mppe_xxxx_key from MS-CHAP credentials. (see RFC 3079)\n */\nstatic void Set_Start_Key(ppp_pcb *pcb, const u_char *rchallenge, const char *secret, int secret_len) {\n    u_char    unicodePassword[MAX_NT_PASSWORD * 2];\n    u_char    PasswordHash[MD4_SIGNATURE_SIZE];\n    u_char    PasswordHashHash[MD4_SIGNATURE_SIZE];\n    lwip_sha1_context    sha1Context;\n    u_char    Digest[SHA1_SIGNATURE_SIZE];    /* >= MPPE_MAX_KEY_LEN */\n\n    /* Hash (x2) the Unicode version of the secret (== password). */\n    ascii2unicode(secret, secret_len, unicodePassword);\n    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);\n    NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash);\n\n    lwip_sha1_init(&sha1Context);\n    lwip_sha1_starts(&sha1Context);\n    lwip_sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);\n    lwip_sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);\n    lwip_sha1_update(&sha1Context, rchallenge, 8);\n    lwip_sha1_finish(&sha1Context, Digest);\n    lwip_sha1_free(&sha1Context);\n\n    /* Same key in both directions. */\n    mppe_set_key(pcb, &pcb->mppe_comp, Digest);\n    mppe_set_key(pcb, &pcb->mppe_decomp, Digest);\n\n    pcb->mppe_keys_set = 1;\n}\n\n/*\n * Set mppe_xxxx_key from MS-CHAPv2 credentials. (see RFC 3079)\n */\nstatic void SetMasterKeys(ppp_pcb *pcb, const char *secret, int secret_len, u_char NTResponse[24], int IsServer) {\n    u_char    unicodePassword[MAX_NT_PASSWORD * 2];\n    u_char    PasswordHash[MD4_SIGNATURE_SIZE];\n    u_char    PasswordHashHash[MD4_SIGNATURE_SIZE];\n    lwip_sha1_context    sha1Context;\n    u_char    MasterKey[SHA1_SIGNATURE_SIZE];    /* >= MPPE_MAX_KEY_LEN */\n    u_char    Digest[SHA1_SIGNATURE_SIZE];    /* >= MPPE_MAX_KEY_LEN */\n    const u_char *s;\n\n    /* \"This is the MPPE Master Key\" */\n    static const u_char Magic1[27] =\n    { 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74,\n      0x68, 0x65, 0x20, 0x4d, 0x50, 0x50, 0x45, 0x20, 0x4d,\n      0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x65, 0x79 };\n    /* \"On the client side, this is the send key; \"\n       \"on the server side, it is the receive key.\" */\n    static const u_char Magic2[84] =\n    { 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,\n      0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,\n      0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,\n      0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79,\n      0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,\n      0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65,\n      0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,\n      0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,\n      0x6b, 0x65, 0x79, 0x2e };\n    /* \"On the client side, this is the receive key; \"\n       \"on the server side, it is the send key.\" */\n    static const u_char Magic3[84] =\n    { 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,\n      0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,\n      0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,\n      0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,\n      0x6b, 0x65, 0x79, 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,\n      0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73,\n      0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73,\n      0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20,\n      0x6b, 0x65, 0x79, 0x2e };\n\n    /* Hash (x2) the Unicode version of the secret (== password). */\n    ascii2unicode(secret, secret_len, unicodePassword);\n    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);\n    NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash);\n\n    lwip_sha1_init(&sha1Context);\n    lwip_sha1_starts(&sha1Context);\n    lwip_sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);\n    lwip_sha1_update(&sha1Context, NTResponse, 24);\n    lwip_sha1_update(&sha1Context, Magic1, sizeof(Magic1));\n    lwip_sha1_finish(&sha1Context, MasterKey);\n    lwip_sha1_free(&sha1Context);\n\n    /*\n     * generate send key\n     */\n    if (IsServer)\n    s = Magic3;\n    else\n    s = Magic2;\n    lwip_sha1_init(&sha1Context);\n    lwip_sha1_starts(&sha1Context);\n    lwip_sha1_update(&sha1Context, MasterKey, 16);\n    lwip_sha1_update(&sha1Context, mppe_sha1_pad1, SHA1_PAD_SIZE);\n    lwip_sha1_update(&sha1Context, s, 84);\n    lwip_sha1_update(&sha1Context, mppe_sha1_pad2, SHA1_PAD_SIZE);\n    lwip_sha1_finish(&sha1Context, Digest);\n    lwip_sha1_free(&sha1Context);\n\n    mppe_set_key(pcb, &pcb->mppe_comp, Digest);\n\n    /*\n     * generate recv key\n     */\n    if (IsServer)\n    s = Magic2;\n    else\n    s = Magic3;\n    lwip_sha1_init(&sha1Context);\n    lwip_sha1_starts(&sha1Context);\n    lwip_sha1_update(&sha1Context, MasterKey, 16);\n    lwip_sha1_update(&sha1Context, mppe_sha1_pad1, SHA1_PAD_SIZE);\n    lwip_sha1_update(&sha1Context, s, 84);\n    lwip_sha1_update(&sha1Context, mppe_sha1_pad2, SHA1_PAD_SIZE);\n    lwip_sha1_finish(&sha1Context, Digest);\n    lwip_sha1_free(&sha1Context);\n\n    mppe_set_key(pcb, &pcb->mppe_decomp, Digest);\n\n    pcb->mppe_keys_set = 1;\n}\n\n#endif /* MPPE_SUPPORT */\n\n\nstatic void ChapMS(ppp_pcb *pcb, const u_char *rchallenge, const char *secret, int secret_len,\n       unsigned char *response) {\n#if !MPPE_SUPPORT\n    LWIP_UNUSED_ARG(pcb);\n#endif /* !MPPE_SUPPORT */\n    BZERO(response, MS_CHAP_RESPONSE_LEN);\n\n    ChapMS_NT(rchallenge, secret, secret_len, &response[MS_CHAP_NTRESP]);\n\n#ifdef MSLANMAN\n    ChapMS_LANMan(rchallenge, secret, secret_len,\n          &response[MS_CHAP_LANMANRESP]);\n\n    /* preferred method is set by option  */\n    response[MS_CHAP_USENT] = !ms_lanman;\n#else\n    response[MS_CHAP_USENT] = 1;\n#endif\n\n#if MPPE_SUPPORT\n    Set_Start_Key(pcb, rchallenge, secret, secret_len);\n#endif /* MPPE_SUPPORT */\n}\n\n\n/*\n * If PeerChallenge is NULL, one is generated and the PeerChallenge\n * field of response is filled in.  Call this way when generating a response.\n * If PeerChallenge is supplied, it is copied into the PeerChallenge field.\n * Call this way when verifying a response (or debugging).\n * Do not call with PeerChallenge = response.\n *\n * The PeerChallenge field of response is then used for calculation of the\n * Authenticator Response.\n */\nstatic void ChapMS2(ppp_pcb *pcb, const u_char *rchallenge, const u_char *PeerChallenge,\n    const char *user, const char *secret, int secret_len, unsigned char *response,\n    u_char authResponse[], int authenticator) {\n    /* ARGSUSED */\n    LWIP_UNUSED_ARG(authenticator);\n#if !MPPE_SUPPORT\n    LWIP_UNUSED_ARG(pcb);\n#endif /* !MPPE_SUPPORT */\n\n    BZERO(response, MS_CHAP2_RESPONSE_LEN);\n\n    /* Generate the Peer-Challenge if requested, or copy it if supplied. */\n    if (!PeerChallenge)\n    magic_random_bytes(&response[MS_CHAP2_PEER_CHALLENGE], MS_CHAP2_PEER_CHAL_LEN);\n    else\n    MEMCPY(&response[MS_CHAP2_PEER_CHALLENGE], PeerChallenge,\n          MS_CHAP2_PEER_CHAL_LEN);\n\n    /* Generate the NT-Response */\n    ChapMS2_NT(rchallenge, &response[MS_CHAP2_PEER_CHALLENGE], user,\n           secret, secret_len, &response[MS_CHAP2_NTRESP]);\n\n    /* Generate the Authenticator Response. */\n    GenerateAuthenticatorResponsePlain(secret, secret_len,\n                       &response[MS_CHAP2_NTRESP],\n                       &response[MS_CHAP2_PEER_CHALLENGE],\n                       rchallenge, user, authResponse);\n\n#if MPPE_SUPPORT\n    SetMasterKeys(pcb, secret, secret_len,\n          &response[MS_CHAP2_NTRESP], authenticator);\n#endif /* MPPE_SUPPORT */\n}\n\n#if 0 /* UNUSED */\n#if MPPE_SUPPORT\n/*\n * Set MPPE options from plugins.\n */\nvoid set_mppe_enc_types(int policy, int types) {\n    /* Early exit for unknown policies. */\n    if (policy != MPPE_ENC_POL_ENC_ALLOWED ||\n    policy != MPPE_ENC_POL_ENC_REQUIRED)\n    return;\n\n    /* Don't modify MPPE if it's optional and wasn't already configured. */\n    if (policy == MPPE_ENC_POL_ENC_ALLOWED && !ccp_wantoptions[0].mppe)\n    return;\n\n    /*\n     * Disable undesirable encryption types.  Note that we don't ENABLE\n     * any encryption types, to avoid overriding manual configuration.\n     */\n    switch(types) {\n    case MPPE_ENC_TYPES_RC4_40:\n        ccp_wantoptions[0].mppe &= ~MPPE_OPT_128;    /* disable 128-bit */\n        break;\n    case MPPE_ENC_TYPES_RC4_128:\n        ccp_wantoptions[0].mppe &= ~MPPE_OPT_40;    /* disable 40-bit */\n        break;\n    default:\n        break;\n    }\n}\n#endif /* MPPE_SUPPORT */\n#endif /* UNUSED */\n\nconst struct chap_digest_type chapms_digest = {\n    CHAP_MICROSOFT,        /* code */\n#if PPP_SERVER\n    chapms_generate_challenge,\n    chapms_verify_response,\n#endif /* PPP_SERVER */\n    chapms_make_response,\n    NULL,            /* check_success */\n    chapms_handle_failure,\n};\n\nconst struct chap_digest_type chapms2_digest = {\n    CHAP_MICROSOFT_V2,    /* code */\n#if PPP_SERVER\n    chapms2_generate_challenge,\n    chapms2_verify_response,\n#endif /* PPP_SERVER */\n    chapms2_make_response,\n    chapms2_check_success,\n    chapms_handle_failure,\n};\n\n#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/demand.c",
    "content": "/*\n * demand.c - Support routines for demand-dialling.\n *\n * Copyright (c) 1996-2002 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && DEMAND_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <netdb.h>\n#include <unistd.h>\n#include <syslog.h>\n#include <sys/param.h>\n#include <sys/types.h>\n#include <sys/wait.h>\n#include <sys/time.h>\n#include <sys/resource.h>\n#include <sys/stat.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#ifdef PPP_FILTER\n#include <pcap-bpf.h>\n#endif\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/fsm.h\"\n#include \"netif/ppp/ipcp.h\"\n#include \"netif/ppp/lcp.h\"\n\nchar *frame;\nint framelen;\nint framemax;\nint escape_flag;\nint flush_flag;\nint fcs;\n\nstruct packet {\n    int length;\n    struct packet *next;\n    unsigned char data[1];\n};\n\nstruct packet *pend_q;\nstruct packet *pend_qtail;\n\nstatic int active_packet (unsigned char *, int);\n\n/*\n * demand_conf - configure the interface for doing dial-on-demand.\n */\nvoid\ndemand_conf()\n{\n    int i;\n    const struct protent *protp;\n\n/*    framemax = lcp_allowoptions[0].mru;\n    if (framemax < PPP_MRU) */\n    framemax = PPP_MRU;\n    framemax += PPP_HDRLEN + PPP_FCSLEN;\n    frame = malloc(framemax);\n    if (frame == NULL)\n    novm(\"demand frame\");\n    framelen = 0;\n    pend_q = NULL;\n    escape_flag = 0;\n    flush_flag = 0;\n    fcs = PPP_INITFCS;\n\n    netif_set_mtu(pcb, LWIP_MIN(lcp_allowoptions[0].mru, PPP_MRU));\n    if (ppp_send_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0\n    || ppp_recv_config(pcb, PPP_MRU, (u32_t) 0, 0, 0) < 0)\n        fatal(\"Couldn't set up demand-dialled PPP interface: %m\");\n\n#ifdef PPP_FILTER\n    set_filters(&pass_filter, &active_filter);\n#endif\n\n    /*\n     * Call the demand_conf procedure for each protocol that's got one.\n     */\n    for (i = 0; (protp = protocols[i]) != NULL; ++i)\n    if (protp->demand_conf != NULL)\n        ((*protp->demand_conf)(pcb));\n/* FIXME: find a way to die() here */\n#if 0\n        if (!((*protp->demand_conf)(pcb)))\n        die(1);\n#endif\n}\n\n\n/*\n * demand_block - set each network protocol to block further packets.\n */\nvoid\ndemand_block()\n{\n    int i;\n    const struct protent *protp;\n\n    for (i = 0; (protp = protocols[i]) != NULL; ++i)\n    if (protp->demand_conf != NULL)\n        sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_QUEUE);\n    get_loop_output();\n}\n\n/*\n * demand_discard - set each network protocol to discard packets\n * with an error.\n */\nvoid\ndemand_discard()\n{\n    struct packet *pkt, *nextpkt;\n    int i;\n    const struct protent *protp;\n\n    for (i = 0; (protp = protocols[i]) != NULL; ++i)\n    if (protp->demand_conf != NULL)\n        sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_ERROR);\n    get_loop_output();\n\n    /* discard all saved packets */\n    for (pkt = pend_q; pkt != NULL; pkt = nextpkt) {\n    nextpkt = pkt->next;\n    free(pkt);\n    }\n    pend_q = NULL;\n    framelen = 0;\n    flush_flag = 0;\n    escape_flag = 0;\n    fcs = PPP_INITFCS;\n}\n\n/*\n * demand_unblock - set each enabled network protocol to pass packets.\n */\nvoid\ndemand_unblock()\n{\n    int i;\n    const struct protent *protp;\n\n    for (i = 0; (protp = protocols[i]) != NULL; ++i)\n    if (protp->demand_conf != NULL)\n        sifnpmode(pcb, protp->protocol & ~0x8000, NPMODE_PASS);\n}\n\n/*\n * FCS lookup table as calculated by genfcstab.\n */\nstatic u_short fcstab[256] = {\n    0x0000,    0x1189,    0x2312,    0x329b,    0x4624,    0x57ad,    0x6536,    0x74bf,\n    0x8c48,    0x9dc1,    0xaf5a,    0xbed3,    0xca6c,    0xdbe5,    0xe97e,    0xf8f7,\n    0x1081,    0x0108,    0x3393,    0x221a,    0x56a5,    0x472c,    0x75b7,    0x643e,\n    0x9cc9,    0x8d40,    0xbfdb,    0xae52,    0xdaed,    0xcb64,    0xf9ff,    0xe876,\n    0x2102,    0x308b,    0x0210,    0x1399,    0x6726,    0x76af,    0x4434,    0x55bd,\n    0xad4a,    0xbcc3,    0x8e58,    0x9fd1,    0xeb6e,    0xfae7,    0xc87c,    0xd9f5,\n    0x3183,    0x200a,    0x1291,    0x0318,    0x77a7,    0x662e,    0x54b5,    0x453c,\n    0xbdcb,    0xac42,    0x9ed9,    0x8f50,    0xfbef,    0xea66,    0xd8fd,    0xc974,\n    0x4204,    0x538d,    0x6116,    0x709f,    0x0420,    0x15a9,    0x2732,    0x36bb,\n    0xce4c,    0xdfc5,    0xed5e,    0xfcd7,    0x8868,    0x99e1,    0xab7a,    0xbaf3,\n    0x5285,    0x430c,    0x7197,    0x601e,    0x14a1,    0x0528,    0x37b3,    0x263a,\n    0xdecd,    0xcf44,    0xfddf,    0xec56,    0x98e9,    0x8960,    0xbbfb,    0xaa72,\n    0x6306,    0x728f,    0x4014,    0x519d,    0x2522,    0x34ab,    0x0630,    0x17b9,\n    0xef4e,    0xfec7,    0xcc5c,    0xddd5,    0xa96a,    0xb8e3,    0x8a78,    0x9bf1,\n    0x7387,    0x620e,    0x5095,    0x411c,    0x35a3,    0x242a,    0x16b1,    0x0738,\n    0xffcf,    0xee46,    0xdcdd,    0xcd54,    0xb9eb,    0xa862,    0x9af9,    0x8b70,\n    0x8408,    0x9581,    0xa71a,    0xb693,    0xc22c,    0xd3a5,    0xe13e,    0xf0b7,\n    0x0840,    0x19c9,    0x2b52,    0x3adb,    0x4e64,    0x5fed,    0x6d76,    0x7cff,\n    0x9489,    0x8500,    0xb79b,    0xa612,    0xd2ad,    0xc324,    0xf1bf,    0xe036,\n    0x18c1,    0x0948,    0x3bd3,    0x2a5a,    0x5ee5,    0x4f6c,    0x7df7,    0x6c7e,\n    0xa50a,    0xb483,    0x8618,    0x9791,    0xe32e,    0xf2a7,    0xc03c,    0xd1b5,\n    0x2942,    0x38cb,    0x0a50,    0x1bd9,    0x6f66,    0x7eef,    0x4c74,    0x5dfd,\n    0xb58b,    0xa402,    0x9699,    0x8710,    0xf3af,    0xe226,    0xd0bd,    0xc134,\n    0x39c3,    0x284a,    0x1ad1,    0x0b58,    0x7fe7,    0x6e6e,    0x5cf5,    0x4d7c,\n    0xc60c,    0xd785,    0xe51e,    0xf497,    0x8028,    0x91a1,    0xa33a,    0xb2b3,\n    0x4a44,    0x5bcd,    0x6956,    0x78df,    0x0c60,    0x1de9,    0x2f72,    0x3efb,\n    0xd68d,    0xc704,    0xf59f,    0xe416,    0x90a9,    0x8120,    0xb3bb,    0xa232,\n    0x5ac5,    0x4b4c,    0x79d7,    0x685e,    0x1ce1,    0x0d68,    0x3ff3,    0x2e7a,\n    0xe70e,    0xf687,    0xc41c,    0xd595,    0xa12a,    0xb0a3,    0x8238,    0x93b1,\n    0x6b46,    0x7acf,    0x4854,    0x59dd,    0x2d62,    0x3ceb,    0x0e70,    0x1ff9,\n    0xf78f,    0xe606,    0xd49d,    0xc514,    0xb1ab,    0xa022,    0x92b9,    0x8330,\n    0x7bc7,    0x6a4e,    0x58d5,    0x495c,    0x3de3,    0x2c6a,    0x1ef1,    0x0f78\n};\n\n/*\n * loop_chars - process characters received from the loopback.\n * Calls loop_frame when a complete frame has been accumulated.\n * Return value is 1 if we need to bring up the link, 0 otherwise.\n */\nint\nloop_chars(p, n)\n    unsigned char *p;\n    int n;\n{\n    int c, rv;\n\n    rv = 0;\n\n/* check for synchronous connection... */\n\n    if ( (p[0] == 0xFF) && (p[1] == 0x03) ) {\n        rv = loop_frame(p,n);\n        return rv;\n    }\n\n    for (; n > 0; --n) {\n    c = *p++;\n    if (c == PPP_FLAG) {\n        if (!escape_flag && !flush_flag\n        && framelen > 2 && fcs == PPP_GOODFCS) {\n        framelen -= 2;\n        if (loop_frame((unsigned char *)frame, framelen))\n            rv = 1;\n        }\n        framelen = 0;\n        flush_flag = 0;\n        escape_flag = 0;\n        fcs = PPP_INITFCS;\n        continue;\n    }\n    if (flush_flag)\n        continue;\n    if (escape_flag) {\n        c ^= PPP_TRANS;\n        escape_flag = 0;\n    } else if (c == PPP_ESCAPE) {\n        escape_flag = 1;\n        continue;\n    }\n    if (framelen >= framemax) {\n        flush_flag = 1;\n        continue;\n    }\n    frame[framelen++] = c;\n    fcs = PPP_FCS(fcs, c);\n    }\n    return rv;\n}\n\n/*\n * loop_frame - given a frame obtained from the loopback,\n * decide whether to bring up the link or not, and, if we want\n * to transmit this frame later, put it on the pending queue.\n * Return value is 1 if we need to bring up the link, 0 otherwise.\n * We assume that the kernel driver has already applied the\n * pass_filter, so we won't get packets it rejected.\n * We apply the active_filter to see if we want this packet to\n * bring up the link.\n */\nint\nloop_frame(frame, len)\n    unsigned char *frame;\n    int len;\n{\n    struct packet *pkt;\n\n    /* dbglog(\"from loop: %P\", frame, len); */\n    if (len < PPP_HDRLEN)\n    return 0;\n    if ((PPP_PROTOCOL(frame) & 0x8000) != 0)\n    return 0;        /* shouldn't get any of these anyway */\n    if (!active_packet(frame, len))\n    return 0;\n\n    pkt = (struct packet *) malloc(sizeof(struct packet) + len);\n    if (pkt != NULL) {\n    pkt->length = len;\n    pkt->next = NULL;\n    memcpy(pkt->data, frame, len);\n    if (pend_q == NULL)\n        pend_q = pkt;\n    else\n        pend_qtail->next = pkt;\n    pend_qtail = pkt;\n    }\n    return 1;\n}\n\n/*\n * demand_rexmit - Resend all those frames which we got via the\n * loopback, now that the real serial link is up.\n */\nvoid\ndemand_rexmit(proto, newip)\n    int proto;\n    u32_t newip;\n{\n    struct packet *pkt, *prev, *nextpkt;\n    unsigned short checksum;\n    unsigned short pkt_checksum = 0;\n    unsigned iphdr;\n    struct timeval tv;\n    char cv = 0;\n    char ipstr[16];\n\n    prev = NULL;\n    pkt = pend_q;\n    pend_q = NULL;\n    tv.tv_sec = 1;\n    tv.tv_usec = 0;\n    select(0,NULL,NULL,NULL,&tv);    /* Sleep for 1 Seconds */\n    for (; pkt != NULL; pkt = nextpkt) {\n    nextpkt = pkt->next;\n    if (PPP_PROTOCOL(pkt->data) == proto) {\n            if ( (proto == PPP_IP) && newip ) {\n        /* Get old checksum */\n\n        iphdr = (pkt->data[4] & 15) << 2;\n        checksum = *((unsigned short *) (pkt->data+14));\n                if (checksum == 0xFFFF) {\n                    checksum = 0;\n                }\n\n \n                if (pkt->data[13] == 17) {\n                    pkt_checksum =  *((unsigned short *) (pkt->data+10+iphdr));\n            if (pkt_checksum) {\n                        cv = 1;\n                        if (pkt_checksum == 0xFFFF) {\n                            pkt_checksum = 0;\n                        }\n                    }\n                    else {\n                       cv = 0;\n                    }\n                }\n\n        if (pkt->data[13] == 6) {\n            pkt_checksum = *((unsigned short *) (pkt->data+20+iphdr));\n            cv = 1;\n                    if (pkt_checksum == 0xFFFF) {\n                        pkt_checksum = 0;\n                    }\n        }\n\n        /* Delete old Source-IP-Address */\n                checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;\n                checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;\n\n        pkt_checksum -= *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;\n        pkt_checksum -= *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;\n\n        /* Change Source-IP-Address */\n                * ((u32_t *) (pkt->data + 16)) = newip;\n\n        /* Add new Source-IP-Address */\n                checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;\n                checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;\n\n                pkt_checksum += *((unsigned short *) (pkt->data+16)) ^ 0xFFFF;\n                pkt_checksum += *((unsigned short *) (pkt->data+18)) ^ 0xFFFF;\n\n        /* Write new checksum */\n                if (!checksum) {\n                    checksum = 0xFFFF;\n                }\n                *((unsigned short *) (pkt->data+14)) = checksum;\n        if (pkt->data[13] == 6) {\n            *((unsigned short *) (pkt->data+20+iphdr)) = pkt_checksum;\n        }\n        if (cv && (pkt->data[13] == 17) ) {\n            *((unsigned short *) (pkt->data+10+iphdr)) = pkt_checksum;\n        }\n\n        /* Log Packet */\n        strcpy(ipstr,inet_ntoa(*( (struct in_addr *) (pkt->data+16))));\n        if (pkt->data[13] == 1) {\n            syslog(LOG_INFO,\"Open ICMP %s -> %s\\n\",\n            ipstr,\n            inet_ntoa(*( (struct in_addr *) (pkt->data+20))));\n        } else {\n            syslog(LOG_INFO,\"Open %s %s:%d -> %s:%d\\n\",\n            pkt->data[13] == 6 ? \"TCP\" : \"UDP\",\n            ipstr,\n            ntohs(*( (short *) (pkt->data+iphdr+4))),\n            inet_ntoa(*( (struct in_addr *) (pkt->data+20))),\n            ntohs(*( (short *) (pkt->data+iphdr+6))));\n                }\n            }\n        output(pcb, pkt->data, pkt->length);\n        free(pkt);\n    } else {\n        if (prev == NULL)\n        pend_q = pkt;\n        else\n        prev->next = pkt;\n        prev = pkt;\n    }\n    }\n    pend_qtail = prev;\n    if (prev != NULL)\n    prev->next = NULL;\n}\n\n/*\n * Scan a packet to decide whether it is an \"active\" packet,\n * that is, whether it is worth bringing up the link for.\n */\nstatic int\nactive_packet(p, len)\n    unsigned char *p;\n    int len;\n{\n    int proto, i;\n    const struct protent *protp;\n\n    if (len < PPP_HDRLEN)\n    return 0;\n    proto = PPP_PROTOCOL(p);\n#ifdef PPP_FILTER\n    p[0] = 1;        /* outbound packet indicator */\n    if ((pass_filter.bf_len != 0\n     && bpf_filter(pass_filter.bf_insns, p, len, len) == 0)\n    || (active_filter.bf_len != 0\n        && bpf_filter(active_filter.bf_insns, p, len, len) == 0)) {\n    p[0] = 0xff;\n    return 0;\n    }\n    p[0] = 0xff;\n#endif\n    for (i = 0; (protp = protocols[i]) != NULL; ++i) {\n    if (protp->protocol < 0xC000 && (protp->protocol & ~0x8000) == proto) {\n        if (protp->active_pkt == NULL)\n        return 1;\n        return (*protp->active_pkt)(p, len);\n    }\n    }\n    return 0;            /* not a supported protocol !!?? */\n}\n\n#endif /* PPP_SUPPORT && DEMAND_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/eap.c",
    "content": "/*\n * eap.c - Extensible Authentication Protocol for PPP (RFC 2284)\n *\n * Copyright (c) 2001 by Sun Microsystems, Inc.\n * All rights reserved.\n *\n * Non-exclusive rights to redistribute, modify, translate, and use\n * this software in source and binary forms, in whole or in part, is\n * hereby granted, provided that the above copyright notice is\n * duplicated in any source form, and that neither the name of the\n * copyright holder nor the author is used to endorse or promote\n * products derived from this software.\n *\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\n * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n *\n * Original version by James Carlson\n *\n * This implementation of EAP supports MD5-Challenge and SRP-SHA1\n * authentication styles.  Note that support of MD5-Challenge is a\n * requirement of RFC 2284, and that it's essentially just a\n * reimplementation of regular RFC 1994 CHAP using EAP messages.\n *\n * As an authenticator (\"server\"), there are multiple phases for each\n * style.  In the first phase of each style, the unauthenticated peer\n * name is queried using the EAP Identity request type.  If the\n * \"remotename\" option is used, then this phase is skipped, because\n * the peer's name is presumed to be known.\n *\n * For MD5-Challenge, there are two phases, and the second phase\n * consists of sending the challenge itself and handling the\n * associated response.\n *\n * For SRP-SHA1, there are four phases.  The second sends 's', 'N',\n * and 'g'.  The reply contains 'A'.  The third sends 'B', and the\n * reply contains 'M1'.  The forth sends the 'M2' value.\n *\n * As an authenticatee (\"client\"), there's just a single phase --\n * responding to the queries generated by the peer.  EAP is an\n * authenticator-driven protocol.\n *\n * Based on draft-ietf-pppext-eap-srp-03.txt.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && EAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#include \"netif/ppp/ppp_impl.h\"\n#include \"netif/ppp/eap.h\"\n#include \"netif/ppp/magic.h\"\n#include \"netif/ppp/pppcrypt.h\"\n\n#ifdef USE_SRP\n#include <t_pwd.h>\n#include <t_server.h>\n#include <t_client.h>\n#endif /* USE_SRP */\n\n#ifndef SHA_DIGESTSIZE\n#define    SHA_DIGESTSIZE 20\n#endif\n\n#ifdef USE_SRP\nstatic char *pn_secret = NULL;        /* Pseudonym generating secret */\n#endif\n\n#if PPP_OPTIONS\n/*\n * Command-line options.\n */\nstatic option_t eap_option_list[] = {\n    { \"eap-restart\", o_int, &eap_states[0].es_server.ea_timeout,\n      \"Set retransmit timeout for EAP Requests (server)\" },\n    { \"eap-max-sreq\", o_int, &eap_states[0].es_server.ea_maxrequests,\n      \"Set max number of EAP Requests sent (server)\" },\n    { \"eap-timeout\", o_int, &eap_states[0].es_client.ea_timeout,\n      \"Set time limit for peer EAP authentication\" },\n    { \"eap-max-rreq\", o_int, &eap_states[0].es_client.ea_maxrequests,\n      \"Set max number of EAP Requests allows (client)\" },\n    { \"eap-interval\", o_int, &eap_states[0].es_rechallenge,\n      \"Set interval for EAP rechallenge\" },\n#ifdef USE_SRP\n    { \"srp-interval\", o_int, &eap_states[0].es_lwrechallenge,\n      \"Set interval for SRP lightweight rechallenge\" },\n    { \"srp-pn-secret\", o_string, &pn_secret,\n      \"Long term pseudonym generation secret\" },\n    { \"srp-use-pseudonym\", o_bool, &eap_states[0].es_usepseudo,\n      \"Use pseudonym if offered one by server\", 1 },\n#endif\n    { NULL }\n};\n#endif /* PPP_OPTIONS */\n\n/*\n * Protocol entry points.\n */\nstatic void eap_init(ppp_pcb *pcb);\nstatic void eap_input(ppp_pcb *pcb, u_char *inp, int inlen);\nstatic void eap_protrej(ppp_pcb *pcb);\nstatic void eap_lowerup(ppp_pcb *pcb);\nstatic void eap_lowerdown(ppp_pcb *pcb);\n#if PRINTPKT_SUPPORT\nstatic int  eap_printpkt(const u_char *inp, int inlen,\n    void (*)(void *arg, const char *fmt, ...), void *arg);\n#endif /* PRINTPKT_SUPPORT */\n\nconst struct protent eap_protent = {\n    PPP_EAP,        /* protocol number */\n    eap_init,        /* initialization procedure */\n    eap_input,        /* process a received packet */\n    eap_protrej,        /* process a received protocol-reject */\n    eap_lowerup,        /* lower layer has gone up */\n    eap_lowerdown,        /* lower layer has gone down */\n    NULL,            /* open the protocol */\n    NULL,            /* close the protocol */\n#if PRINTPKT_SUPPORT\n    eap_printpkt,        /* print a packet in readable form */\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_DATAINPUT\n    NULL,            /* process a received data packet */\n#endif /* PPP_DATAINPUT */\n#if PRINTPKT_SUPPORT\n    \"EAP\",            /* text name of protocol */\n    NULL,            /* text name of corresponding data protocol */\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_OPTIONS\n    eap_option_list,    /* list of command-line options */\n    NULL,            /* check requested options; assign defaults */\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\n    NULL,            /* configure interface for demand-dial */\n    NULL            /* say whether to bring up link for this pkt */\n#endif /* DEMAND_SUPPORT */\n};\n\n#ifdef USE_SRP\n/*\n * A well-known 2048 bit modulus.\n */\nstatic const u_char wkmodulus[] = {\n    0xAC, 0x6B, 0xDB, 0x41, 0x32, 0x4A, 0x9A, 0x9B,\n    0xF1, 0x66, 0xDE, 0x5E, 0x13, 0x89, 0x58, 0x2F,\n    0xAF, 0x72, 0xB6, 0x65, 0x19, 0x87, 0xEE, 0x07,\n    0xFC, 0x31, 0x92, 0x94, 0x3D, 0xB5, 0x60, 0x50,\n    0xA3, 0x73, 0x29, 0xCB, 0xB4, 0xA0, 0x99, 0xED,\n    0x81, 0x93, 0xE0, 0x75, 0x77, 0x67, 0xA1, 0x3D,\n    0xD5, 0x23, 0x12, 0xAB, 0x4B, 0x03, 0x31, 0x0D,\n    0xCD, 0x7F, 0x48, 0xA9, 0xDA, 0x04, 0xFD, 0x50,\n    0xE8, 0x08, 0x39, 0x69, 0xED, 0xB7, 0x67, 0xB0,\n    0xCF, 0x60, 0x95, 0x17, 0x9A, 0x16, 0x3A, 0xB3,\n    0x66, 0x1A, 0x05, 0xFB, 0xD5, 0xFA, 0xAA, 0xE8,\n    0x29, 0x18, 0xA9, 0x96, 0x2F, 0x0B, 0x93, 0xB8,\n    0x55, 0xF9, 0x79, 0x93, 0xEC, 0x97, 0x5E, 0xEA,\n    0xA8, 0x0D, 0x74, 0x0A, 0xDB, 0xF4, 0xFF, 0x74,\n    0x73, 0x59, 0xD0, 0x41, 0xD5, 0xC3, 0x3E, 0xA7,\n    0x1D, 0x28, 0x1E, 0x44, 0x6B, 0x14, 0x77, 0x3B,\n    0xCA, 0x97, 0xB4, 0x3A, 0x23, 0xFB, 0x80, 0x16,\n    0x76, 0xBD, 0x20, 0x7A, 0x43, 0x6C, 0x64, 0x81,\n    0xF1, 0xD2, 0xB9, 0x07, 0x87, 0x17, 0x46, 0x1A,\n    0x5B, 0x9D, 0x32, 0xE6, 0x88, 0xF8, 0x77, 0x48,\n    0x54, 0x45, 0x23, 0xB5, 0x24, 0xB0, 0xD5, 0x7D,\n    0x5E, 0xA7, 0x7A, 0x27, 0x75, 0xD2, 0xEC, 0xFA,\n    0x03, 0x2C, 0xFB, 0xDB, 0xF5, 0x2F, 0xB3, 0x78,\n    0x61, 0x60, 0x27, 0x90, 0x04, 0xE5, 0x7A, 0xE6,\n    0xAF, 0x87, 0x4E, 0x73, 0x03, 0xCE, 0x53, 0x29,\n    0x9C, 0xCC, 0x04, 0x1C, 0x7B, 0xC3, 0x08, 0xD8,\n    0x2A, 0x56, 0x98, 0xF3, 0xA8, 0xD0, 0xC3, 0x82,\n    0x71, 0xAE, 0x35, 0xF8, 0xE9, 0xDB, 0xFB, 0xB6,\n    0x94, 0xB5, 0xC8, 0x03, 0xD8, 0x9F, 0x7A, 0xE4,\n    0x35, 0xDE, 0x23, 0x6D, 0x52, 0x5F, 0x54, 0x75,\n    0x9B, 0x65, 0xE3, 0x72, 0xFC, 0xD6, 0x8E, 0xF2,\n    0x0F, 0xA7, 0x11, 0x1F, 0x9E, 0x4A, 0xFF, 0x73\n};\n#endif\n\n#if PPP_SERVER\n/* Local forward declarations. */\nstatic void eap_server_timeout(void *arg);\n#endif /* PPP_SERVER */\n\n/*\n * Convert EAP state code to printable string for debug.\n */\nstatic const char * eap_state_name(enum eap_state_code esc)\n{\n    static const char *state_names[] = { EAP_STATES };\n\n    return (state_names[(int)esc]);\n}\n\n/*\n * eap_init - Initialize state for an EAP user.  This is currently\n * called once by main() during start-up.\n */\nstatic void eap_init(ppp_pcb *pcb) {\n\n    BZERO(&pcb->eap, sizeof(eap_state));\n#if PPP_SERVER\n    pcb->eap.es_server.ea_id = magic();\n#endif /* PPP_SERVER */\n}\n\n/*\n * eap_client_timeout - Give up waiting for the peer to send any\n * Request messages.\n */\nstatic void eap_client_timeout(void *arg) {\n    ppp_pcb *pcb = (ppp_pcb*)arg;\n\n    if (!eap_client_active(pcb))\n        return;\n\n    ppp_error(\"EAP: timeout waiting for Request from peer\");\n    auth_withpeer_fail(pcb, PPP_EAP);\n    pcb->eap.es_client.ea_state = eapBadAuth;\n}\n\n/*\n * eap_authwithpeer - Authenticate to our peer (behave as client).\n *\n * Start client state and wait for requests.  This is called only\n * after eap_lowerup.\n */\nvoid eap_authwithpeer(ppp_pcb *pcb, const char *localname) {\n\n    if(NULL == localname)\n        return;\n\n    /* Save the peer name we're given */\n    pcb->eap.es_client.ea_name = localname;\n    pcb->eap.es_client.ea_namelen = strlen(localname);\n\n    pcb->eap.es_client.ea_state = eapListen;\n\n    /*\n     * Start a timer so that if the other end just goes\n     * silent, we don't sit here waiting forever.\n     */\n    if (pcb->settings.eap_req_time > 0)\n        TIMEOUT(eap_client_timeout, pcb,\n            pcb->settings.eap_req_time);\n}\n\n#if PPP_SERVER\n/*\n * Format a standard EAP Failure message and send it to the peer.\n * (Server operation)\n */\nstatic void eap_send_failure(ppp_pcb *pcb) {\n    struct pbuf *p;\n    u_char *outp;\n\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + EAP_HEADERLEN), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = (u_char*)p->payload;\n\n    MAKEHEADER(outp, PPP_EAP);\n\n    PUTCHAR(EAP_FAILURE, outp);\n    pcb->eap.es_server.ea_id++;\n    PUTCHAR(pcb->eap.es_server.ea_id, outp);\n    PUTSHORT(EAP_HEADERLEN, outp);\n\n    ppp_write(pcb, p);\n\n    pcb->eap.es_server.ea_state = eapBadAuth;\n    auth_peer_fail(pcb, PPP_EAP);\n}\n\n/*\n * Format a standard EAP Success message and send it to the peer.\n * (Server operation)\n */\nstatic void eap_send_success(ppp_pcb *pcb) {\n    struct pbuf *p;\n    u_char *outp;\n\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + EAP_HEADERLEN), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = (u_char*)p->payload;\n    \n    MAKEHEADER(outp, PPP_EAP);\n\n    PUTCHAR(EAP_SUCCESS, outp);\n    pcb->eap.es_server.ea_id++;\n    PUTCHAR(pcb->eap.es_server.ea_id, outp);\n    PUTSHORT(EAP_HEADERLEN, outp);\n\n    ppp_write(pcb, p);\n\n    auth_peer_success(pcb, PPP_EAP, 0,\n        pcb->eap.es_server.ea_peer, pcb->eap.es_server.ea_peerlen);\n}\n#endif /* PPP_SERVER */\n\n#ifdef USE_SRP\n/*\n * Set DES key according to pseudonym-generating secret and current\n * date.\n */\nstatic bool\npncrypt_setkey(int timeoffs)\n{\n    struct tm *tp;\n    char tbuf[9];\n    SHA1_CTX ctxt;\n    u_char dig[SHA_DIGESTSIZE];\n    time_t reftime;\n\n    if (pn_secret == NULL)\n        return (0);\n    reftime = time(NULL) + timeoffs;\n    tp = localtime(&reftime);\n    SHA1Init(&ctxt);\n    SHA1Update(&ctxt, pn_secret, strlen(pn_secret));\n    strftime(tbuf, sizeof (tbuf), \"%Y%m%d\", tp);\n    SHA1Update(&ctxt, tbuf, strlen(tbuf));\n    SHA1Final(dig, &ctxt);\n    /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */\n    return (DesSetkey(dig));\n}\n\nstatic char base64[] =\n\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nstruct b64state {\n    u32_t bs_bits;\n    int bs_offs;\n};\n\nstatic int\nb64enc(bs, inp, inlen, outp)\nstruct b64state *bs;\nu_char *inp;\nint inlen;\nu_char *outp;\n{\n    int outlen = 0;\n\n    while (inlen > 0) {\n        bs->bs_bits = (bs->bs_bits << 8) | *inp++;\n        inlen--;\n        bs->bs_offs += 8;\n        if (bs->bs_offs >= 24) {\n            *outp++ = base64[(bs->bs_bits >> 18) & 0x3F];\n            *outp++ = base64[(bs->bs_bits >> 12) & 0x3F];\n            *outp++ = base64[(bs->bs_bits >> 6) & 0x3F];\n            *outp++ = base64[bs->bs_bits & 0x3F];\n            outlen += 4;\n            bs->bs_offs = 0;\n            bs->bs_bits = 0;\n        }\n    }\n    return (outlen);\n}\n\nstatic int\nb64flush(bs, outp)\nstruct b64state *bs;\nu_char *outp;\n{\n    int outlen = 0;\n\n    if (bs->bs_offs == 8) {\n        *outp++ = base64[(bs->bs_bits >> 2) & 0x3F];\n        *outp++ = base64[(bs->bs_bits << 4) & 0x3F];\n        outlen = 2;\n    } else if (bs->bs_offs == 16) {\n        *outp++ = base64[(bs->bs_bits >> 10) & 0x3F];\n        *outp++ = base64[(bs->bs_bits >> 4) & 0x3F];\n        *outp++ = base64[(bs->bs_bits << 2) & 0x3F];\n        outlen = 3;\n    }\n    bs->bs_offs = 0;\n    bs->bs_bits = 0;\n    return (outlen);\n}\n\nstatic int\nb64dec(bs, inp, inlen, outp)\nstruct b64state *bs;\nu_char *inp;\nint inlen;\nu_char *outp;\n{\n    int outlen = 0;\n    char *cp;\n\n    while (inlen > 0) {\n        if ((cp = strchr(base64, *inp++)) == NULL)\n            break;\n        bs->bs_bits = (bs->bs_bits << 6) | (cp - base64);\n        inlen--;\n        bs->bs_offs += 6;\n        if (bs->bs_offs >= 8) {\n            *outp++ = bs->bs_bits >> (bs->bs_offs - 8);\n            outlen++;\n            bs->bs_offs -= 8;\n        }\n    }\n    return (outlen);\n}\n#endif /* USE_SRP */\n\n#if PPP_SERVER\n/*\n * Assume that current waiting server state is complete and figure\n * next state to use based on available authentication data.  'status'\n * indicates if there was an error in handling the last query.  It is\n * 0 for success and non-zero for failure.\n */\nstatic void eap_figure_next_state(ppp_pcb *pcb, int status) {\n#ifdef USE_SRP\n    unsigned char secbuf[MAXSECRETLEN], clear[8], *sp, *dp;\n    struct t_pw tpw;\n    struct t_confent *tce, mytce;\n    char *cp, *cp2;\n    struct t_server *ts;\n    int id, i, plen, toffs;\n    u_char vals[2];\n    struct b64state bs;\n#endif /* USE_SRP */\n\n    pcb->settings.eap_timeout_time = pcb->eap.es_savedtime;\n    switch (pcb->eap.es_server.ea_state) {\n    case eapBadAuth:\n        return;\n\n    case eapIdentify:\n#ifdef USE_SRP\n        /* Discard any previous session. */\n        ts = (struct t_server *)pcb->eap.es_server.ea_session;\n        if (ts != NULL) {\n            t_serverclose(ts);\n            pcb->eap.es_server.ea_session = NULL;\n            pcb->eap.es_server.ea_skey = NULL;\n        }\n#endif /* USE_SRP */\n        if (status != 0) {\n            pcb->eap.es_server.ea_state = eapBadAuth;\n            break;\n        }\n#ifdef USE_SRP\n        /* If we've got a pseudonym, try to decode to real name. */\n        if (pcb->eap.es_server.ea_peerlen > SRP_PSEUDO_LEN &&\n            strncmp(pcb->eap.es_server.ea_peer, SRP_PSEUDO_ID,\n            SRP_PSEUDO_LEN) == 0 &&\n            (pcb->eap.es_server.ea_peerlen - SRP_PSEUDO_LEN) * 3 / 4 <\n            sizeof (secbuf)) {\n            BZERO(&bs, sizeof (bs));\n            plen = b64dec(&bs,\n                pcb->eap.es_server.ea_peer + SRP_PSEUDO_LEN,\n                pcb->eap.es_server.ea_peerlen - SRP_PSEUDO_LEN,\n                secbuf);\n            toffs = 0;\n            for (i = 0; i < 5; i++) {\n                pncrypt_setkey(toffs);\n                toffs -= 86400;\n                /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */\n                if (!DesDecrypt(secbuf, clear)) {\n                    ppp_dbglog(\"no DES here; cannot decode \"\n                        \"pseudonym\");\n                    return;\n                }\n                id = *(unsigned char *)clear;\n                if (id + 1 <= plen && id + 9 > plen)\n                    break;\n            }\n            if (plen % 8 == 0 && i < 5) {\n                /*\n                 * Note that this is always shorter than the\n                 * original stored string, so there's no need\n                 * to realloc.\n                 */\n                if ((i = plen = *(unsigned char *)clear) > 7)\n                    i = 7;\n                pcb->eap.es_server.ea_peerlen = plen;\n                dp = (unsigned char *)pcb->eap.es_server.ea_peer;\n                MEMCPY(dp, clear + 1, i);\n                plen -= i;\n                dp += i;\n                sp = secbuf + 8;\n                while (plen > 0) {\n                    /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */\n                    (void) DesDecrypt(sp, dp);\n                    sp += 8;\n                    dp += 8;\n                    plen -= 8;\n                }\n                pcb->eap.es_server.ea_peer[\n                    pcb->eap.es_server.ea_peerlen] = '\\0';\n                ppp_dbglog(\"decoded pseudonym to \\\"%.*q\\\"\",\n                    pcb->eap.es_server.ea_peerlen,\n                    pcb->eap.es_server.ea_peer);\n            } else {\n                ppp_dbglog(\"failed to decode real name\");\n                /* Stay in eapIdentfy state; requery */\n                break;\n            }\n        }\n        /* Look up user in secrets database. */\n        if (get_srp_secret(pcb->eap.es_unit, pcb->eap.es_server.ea_peer,\n            pcb->eap.es_server.ea_name, (char *)secbuf, 1) != 0) {\n            /* Set up default in case SRP entry is bad */\n            pcb->eap.es_server.ea_state = eapMD5Chall;\n            /* Get t_confent based on index in srp-secrets */\n            id = strtol((char *)secbuf, &cp, 10);\n            if (*cp++ != ':' || id < 0)\n                break;\n            if (id == 0) {\n                mytce.index = 0;\n                mytce.modulus.data = (u_char *)wkmodulus;\n                mytce.modulus.len = sizeof (wkmodulus);\n                mytce.generator.data = (u_char *)\"\\002\";\n                mytce.generator.len = 1;\n                tce = &mytce;\n            } else if ((tce = gettcid(id)) != NULL) {\n                /*\n                 * Client will have to verify this modulus/\n                 * generator combination, and that will take\n                 * a while.  Lengthen the timeout here.\n                 */\n                if (pcb->settings.eap_timeout_time > 0 &&\n                    pcb->settings.eap_timeout_time < 30)\n                    pcb->settings.eap_timeout_time = 30;\n            } else {\n                break;\n            }\n            if ((cp2 = strchr(cp, ':')) == NULL)\n                break;\n            *cp2++ = '\\0';\n            tpw.pebuf.name = pcb->eap.es_server.ea_peer;\n            tpw.pebuf.password.len = t_fromb64((char *)tpw.pwbuf,\n                cp);\n            tpw.pebuf.password.data = tpw.pwbuf;\n            tpw.pebuf.salt.len = t_fromb64((char *)tpw.saltbuf,\n                cp2);\n            tpw.pebuf.salt.data = tpw.saltbuf;\n            if ((ts = t_serveropenraw(&tpw.pebuf, tce)) == NULL)\n                break;\n            pcb->eap.es_server.ea_session = (void *)ts;\n            pcb->eap.es_server.ea_state = eapSRP1;\n            vals[0] = pcb->eap.es_server.ea_id + 1;\n            vals[1] = EAPT_SRP;\n            t_serveraddexdata(ts, vals, 2);\n            /* Generate B; must call before t_servergetkey() */\n            t_servergenexp(ts);\n            break;\n        }\n#endif /* USE_SRP */\n        pcb->eap.es_server.ea_state = eapMD5Chall;\n        break;\n\n    case eapSRP1:\n#ifdef USE_SRP\n        ts = (struct t_server *)pcb->eap.es_server.ea_session;\n        if (ts != NULL && status != 0) {\n            t_serverclose(ts);\n            pcb->eap.es_server.ea_session = NULL;\n            pcb->eap.es_server.ea_skey = NULL;\n        }\n#endif /* USE_SRP */\n        if (status == 1) {\n            pcb->eap.es_server.ea_state = eapMD5Chall;\n        } else if (status != 0 || pcb->eap.es_server.ea_session == NULL) {\n            pcb->eap.es_server.ea_state = eapBadAuth;\n        } else {\n            pcb->eap.es_server.ea_state = eapSRP2;\n        }\n        break;\n\n    case eapSRP2:\n#ifdef USE_SRP\n        ts = (struct t_server *)pcb->eap.es_server.ea_session;\n        if (ts != NULL && status != 0) {\n            t_serverclose(ts);\n            pcb->eap.es_server.ea_session = NULL;\n            pcb->eap.es_server.ea_skey = NULL;\n        }\n#endif /* USE_SRP */\n        if (status != 0 || pcb->eap.es_server.ea_session == NULL) {\n            pcb->eap.es_server.ea_state = eapBadAuth;\n        } else {\n            pcb->eap.es_server.ea_state = eapSRP3;\n        }\n        break;\n\n    case eapSRP3:\n    case eapSRP4:\n#ifdef USE_SRP\n        ts = (struct t_server *)pcb->eap.es_server.ea_session;\n        if (ts != NULL && status != 0) {\n            t_serverclose(ts);\n            pcb->eap.es_server.ea_session = NULL;\n            pcb->eap.es_server.ea_skey = NULL;\n        }\n#endif /* USE_SRP */\n        if (status != 0 || pcb->eap.es_server.ea_session == NULL) {\n            pcb->eap.es_server.ea_state = eapBadAuth;\n        } else {\n            pcb->eap.es_server.ea_state = eapOpen;\n        }\n        break;\n\n    case eapMD5Chall:\n        if (status != 0) {\n            pcb->eap.es_server.ea_state = eapBadAuth;\n        } else {\n            pcb->eap.es_server.ea_state = eapOpen;\n        }\n        break;\n\n    default:\n        pcb->eap.es_server.ea_state = eapBadAuth;\n        break;\n    }\n    if (pcb->eap.es_server.ea_state == eapBadAuth)\n        eap_send_failure(pcb);\n}\n\n/*\n * Format an EAP Request message and send it to the peer.  Message\n * type depends on current state.  (Server operation)\n */\nstatic void eap_send_request(ppp_pcb *pcb) {\n    struct pbuf *p;\n    u_char *outp;\n    u_char *lenloc;\n    int outlen;\n    int len;\n    const char *str;\n#ifdef USE_SRP\n    struct t_server *ts;\n    u_char clear[8], cipher[8], dig[SHA_DIGESTSIZE], *optr, *cp;\n    int i, j;\n    struct b64state b64;\n    SHA1_CTX ctxt;\n#endif /* USE_SRP */\n\n    /* Handle both initial auth and restart */\n    if (pcb->eap.es_server.ea_state < eapIdentify &&\n        pcb->eap.es_server.ea_state != eapInitial) {\n        pcb->eap.es_server.ea_state = eapIdentify;\n#if PPP_REMOTENAME\n        if (pcb->settings.explicit_remote && pcb->remote_name) {\n            /*\n             * If we already know the peer's\n             * unauthenticated name, then there's no\n             * reason to ask.  Go to next state instead.\n             */\n            int len = (int)strlen(pcb->remote_name);\n            if (len > MAXNAMELEN) {\n                len = MAXNAMELEN;\n            }\n            MEMCPY(pcb->eap.es_server.ea_peer, pcb->remote_name, len);\n            pcb->eap.es_server.ea_peer[len] = '\\0';\n            pcb->eap.es_server.ea_peerlen = len;\n            eap_figure_next_state(pcb, 0);\n        }\n#endif /* PPP_REMOTENAME */\n    }\n\n    if (pcb->settings.eap_max_transmits > 0 &&\n        pcb->eap.es_server.ea_requests >= pcb->settings.eap_max_transmits) {\n        if (pcb->eap.es_server.ea_responses > 0)\n            ppp_error(\"EAP: too many Requests sent\");\n        else\n            ppp_error(\"EAP: no response to Requests\");\n        eap_send_failure(pcb);\n        return;\n    }\n\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_CTRL_PBUF_MAX_SIZE), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = (u_char*)p->payload;\n    \n    MAKEHEADER(outp, PPP_EAP);\n\n    PUTCHAR(EAP_REQUEST, outp);\n    PUTCHAR(pcb->eap.es_server.ea_id, outp);\n    lenloc = outp;\n    INCPTR(2, outp);\n\n    switch (pcb->eap.es_server.ea_state) {\n    case eapIdentify:\n        PUTCHAR(EAPT_IDENTITY, outp);\n        str = \"Name\";\n        len = strlen(str);\n        MEMCPY(outp, str, len);\n        INCPTR(len, outp);\n        break;\n\n    case eapMD5Chall:\n        PUTCHAR(EAPT_MD5CHAP, outp);\n        /*\n         * pick a random challenge length between\n         * EAP_MIN_CHALLENGE_LENGTH and EAP_MAX_CHALLENGE_LENGTH\n         */\n        pcb->eap.es_challen = EAP_MIN_CHALLENGE_LENGTH +\n            magic_pow(EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH);\n        PUTCHAR(pcb->eap.es_challen, outp);\n        magic_random_bytes(pcb->eap.es_challenge, pcb->eap.es_challen);\n        MEMCPY(outp, pcb->eap.es_challenge, pcb->eap.es_challen);\n        INCPTR(pcb->eap.es_challen, outp);\n        MEMCPY(outp, pcb->eap.es_server.ea_name, pcb->eap.es_server.ea_namelen);\n        INCPTR(pcb->eap.es_server.ea_namelen, outp);\n        break;\n\n#ifdef USE_SRP\n    case eapSRP1:\n        PUTCHAR(EAPT_SRP, outp);\n        PUTCHAR(EAPSRP_CHALLENGE, outp);\n\n        PUTCHAR(pcb->eap.es_server.ea_namelen, outp);\n        MEMCPY(outp, pcb->eap.es_server.ea_name, pcb->eap.es_server.ea_namelen);\n        INCPTR(pcb->eap.es_server.ea_namelen, outp);\n\n        ts = (struct t_server *)pcb->eap.es_server.ea_session;\n        assert(ts != NULL);\n        PUTCHAR(ts->s.len, outp);\n        MEMCPY(outp, ts->s.data, ts->s.len);\n        INCPTR(ts->s.len, outp);\n\n        if (ts->g.len == 1 && ts->g.data[0] == 2) {\n            PUTCHAR(0, outp);\n        } else {\n            PUTCHAR(ts->g.len, outp);\n            MEMCPY(outp, ts->g.data, ts->g.len);\n            INCPTR(ts->g.len, outp);\n        }\n\n        if (ts->n.len != sizeof (wkmodulus) ||\n            BCMP(ts->n.data, wkmodulus, sizeof (wkmodulus)) != 0) {\n            MEMCPY(outp, ts->n.data, ts->n.len);\n            INCPTR(ts->n.len, outp);\n        }\n        break;\n\n    case eapSRP2:\n        PUTCHAR(EAPT_SRP, outp);\n        PUTCHAR(EAPSRP_SKEY, outp);\n\n        ts = (struct t_server *)pcb->eap.es_server.ea_session;\n        assert(ts != NULL);\n        MEMCPY(outp, ts->B.data, ts->B.len);\n        INCPTR(ts->B.len, outp);\n        break;\n\n    case eapSRP3:\n        PUTCHAR(EAPT_SRP, outp);\n        PUTCHAR(EAPSRP_SVALIDATOR, outp);\n        PUTLONG(SRPVAL_EBIT, outp);\n        ts = (struct t_server *)pcb->eap.es_server.ea_session;\n        assert(ts != NULL);\n        MEMCPY(outp, t_serverresponse(ts), SHA_DIGESTSIZE);\n        INCPTR(SHA_DIGESTSIZE, outp);\n\n        if (pncrypt_setkey(0)) {\n            /* Generate pseudonym */\n            optr = outp;\n            cp = (unsigned char *)pcb->eap.es_server.ea_peer;\n            if ((j = i = pcb->eap.es_server.ea_peerlen) > 7)\n                j = 7;\n            clear[0] = i;\n            MEMCPY(clear + 1, cp, j);\n            i -= j;\n            cp += j;\n            /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */\n            if (!DesEncrypt(clear, cipher)) {\n                ppp_dbglog(\"no DES here; not generating pseudonym\");\n                break;\n            }\n            BZERO(&b64, sizeof (b64));\n            outp++;        /* space for pseudonym length */\n            outp += b64enc(&b64, cipher, 8, outp);\n            while (i >= 8) {\n                /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */\n                (void) DesEncrypt(cp, cipher);\n                outp += b64enc(&b64, cipher, 8, outp);\n                cp += 8;\n                i -= 8;\n            }\n            if (i > 0) {\n                MEMCPY(clear, cp, i);\n                cp += i;\n                magic_random_bytes(cp, 8-i);\n                /* FIXME: if we want to do SRP, we need to find a way to pass the PolarSSL des_context instead of using static memory */\n                (void) DesEncrypt(clear, cipher);\n                outp += b64enc(&b64, cipher, 8, outp);\n            }\n            outp += b64flush(&b64, outp);\n\n            /* Set length and pad out to next 20 octet boundary */\n            i = outp - optr - 1;\n            *optr = i;\n            i %= SHA_DIGESTSIZE;\n            if (i != 0) {\n                magic_random_bytes(outp, SHA_DIGESTSIZE-i);\n                INCPTR(SHA_DIGESTSIZE-i, outp);\n            }\n\n            /* Obscure the pseudonym with SHA1 hash */\n            SHA1Init(&ctxt);\n            SHA1Update(&ctxt, &pcb->eap.es_server.ea_id, 1);\n            SHA1Update(&ctxt, pcb->eap.es_server.ea_skey,\n                SESSION_KEY_LEN);\n            SHA1Update(&ctxt, pcb->eap.es_server.ea_peer,\n                pcb->eap.es_server.ea_peerlen);\n            while (optr < outp) {\n                SHA1Final(dig, &ctxt);\n                cp = dig;\n                while (cp < dig + SHA_DIGESTSIZE)\n                    *optr++ ^= *cp++;\n                SHA1Init(&ctxt);\n                SHA1Update(&ctxt, &pcb->eap.es_server.ea_id, 1);\n                SHA1Update(&ctxt, pcb->eap.es_server.ea_skey,\n                    SESSION_KEY_LEN);\n                SHA1Update(&ctxt, optr - SHA_DIGESTSIZE,\n                    SHA_DIGESTSIZE);\n            }\n        }\n        break;\n\n    case eapSRP4:\n        PUTCHAR(EAPT_SRP, outp);\n        PUTCHAR(EAPSRP_LWRECHALLENGE, outp);\n        pcb->eap.es_challen = EAP_MIN_CHALLENGE_LENGTH +\n            magic_pow(EAP_MIN_MAX_POWER_OF_TWO_CHALLENGE_LENGTH);\n        magic_random_bytes(pcb->eap.es_challenge, pcb->eap.es_challen);\n        MEMCPY(outp, pcb->eap.es_challenge, pcb->eap.es_challen);\n        INCPTR(pcb->eap.es_challen, outp);\n        break;\n#endif /* USE_SRP */\n\n    default:\n        return;\n    }\n\n    outlen = (outp - (unsigned char*)p->payload) - PPP_HDRLEN;\n    PUTSHORT(outlen, lenloc);\n\n    pbuf_realloc(p, outlen + PPP_HDRLEN);\n    ppp_write(pcb, p);\n\n    pcb->eap.es_server.ea_requests++;\n\n    if (pcb->settings.eap_timeout_time > 0)\n        TIMEOUT(eap_server_timeout, pcb, pcb->settings.eap_timeout_time);\n}\n\n/*\n * eap_authpeer - Authenticate our peer (behave as server).\n *\n * Start server state and send first request.  This is called only\n * after eap_lowerup.\n */\nvoid eap_authpeer(ppp_pcb *pcb, const char *localname) {\n\n    /* Save the name we're given. */\n    pcb->eap.es_server.ea_name = localname;\n    pcb->eap.es_server.ea_namelen = strlen(localname);\n\n    pcb->eap.es_savedtime = pcb->settings.eap_timeout_time;\n\n    /* Lower layer up yet? */\n    if (pcb->eap.es_server.ea_state == eapInitial ||\n        pcb->eap.es_server.ea_state == eapPending) {\n        pcb->eap.es_server.ea_state = eapPending;\n        return;\n    }\n\n    pcb->eap.es_server.ea_state = eapPending;\n\n    /* ID number not updated here intentionally; hashed into M1 */\n    eap_send_request(pcb);\n}\n\n/*\n * eap_server_timeout - Retransmission timer for sending Requests\n * expired.\n */\nstatic void eap_server_timeout(void *arg) {\n    ppp_pcb *pcb = (ppp_pcb*)arg;\n\n    if (!eap_server_active(pcb))\n        return;\n\n    /* EAP ID number must not change on timeout. */\n    eap_send_request(pcb);\n}\n\n/*\n * When it's time to send rechallenge the peer, this timeout is\n * called.  Once the rechallenge is successful, the response handler\n * will restart the timer.  If it fails, then the link is dropped.\n */\nstatic void eap_rechallenge(void *arg) {\n    ppp_pcb *pcb = (ppp_pcb*)arg;\n\n    if (pcb->eap.es_server.ea_state != eapOpen &&\n        pcb->eap.es_server.ea_state != eapSRP4)\n        return;\n\n    pcb->eap.es_server.ea_requests = 0;\n    pcb->eap.es_server.ea_state = eapIdentify;\n    eap_figure_next_state(pcb, 0);\n    pcb->eap.es_server.ea_id++;\n    eap_send_request(pcb);\n}\n\nstatic void srp_lwrechallenge(void *arg) {\n    ppp_pcb *pcb = (ppp_pcb*)arg;\n\n    if (pcb->eap.es_server.ea_state != eapOpen ||\n        pcb->eap.es_server.ea_type != EAPT_SRP)\n        return;\n\n    pcb->eap.es_server.ea_requests = 0;\n    pcb->eap.es_server.ea_state = eapSRP4;\n    pcb->eap.es_server.ea_id++;\n    eap_send_request(pcb);\n}\n#endif /* PPP_SERVER */\n\n/*\n * eap_lowerup - The lower layer is now up.\n *\n * This is called before either eap_authpeer or eap_authwithpeer.  See\n * link_established() in auth.c.  All that's necessary here is to\n * return to closed state so that those two routines will do the right\n * thing.\n */\nstatic void eap_lowerup(ppp_pcb *pcb) {\n    pcb->eap.es_client.ea_state = eapClosed;\n#if PPP_SERVER\n    pcb->eap.es_server.ea_state = eapClosed;\n#endif /* PPP_SERVER */\n}\n\n/*\n * eap_lowerdown - The lower layer is now down.\n *\n * Cancel all timeouts and return to initial state.\n */\nstatic void eap_lowerdown(ppp_pcb *pcb) {\n\n    if (eap_client_active(pcb) && pcb->settings.eap_req_time > 0) {\n        UNTIMEOUT(eap_client_timeout, pcb);\n    }\n#if PPP_SERVER\n    if (eap_server_active(pcb)) {\n        if (pcb->settings.eap_timeout_time > 0) {\n            UNTIMEOUT(eap_server_timeout, pcb);\n        }\n    } else {\n        if ((pcb->eap.es_server.ea_state == eapOpen ||\n            pcb->eap.es_server.ea_state == eapSRP4) &&\n            pcb->eap.es_rechallenge > 0) {\n            UNTIMEOUT(eap_rechallenge, (void *)pcb);\n        }\n        if (pcb->eap.es_server.ea_state == eapOpen &&\n            pcb->eap.es_lwrechallenge > 0) {\n            UNTIMEOUT(srp_lwrechallenge, (void *)pcb);\n        }\n    }\n\n    pcb->eap.es_client.ea_state = pcb->eap.es_server.ea_state = eapInitial;\n    pcb->eap.es_client.ea_requests = pcb->eap.es_server.ea_requests = 0;\n#endif /* PPP_SERVER */\n}\n\n/*\n * eap_protrej - Peer doesn't speak this protocol.\n *\n * This shouldn't happen.  If it does, it represents authentication\n * failure.\n */\nstatic void eap_protrej(ppp_pcb *pcb) {\n\n    if (eap_client_active(pcb)) {\n        ppp_error(\"EAP authentication failed due to Protocol-Reject\");\n        auth_withpeer_fail(pcb, PPP_EAP);\n    }\n#if PPP_SERVER\n    if (eap_server_active(pcb)) {\n        ppp_error(\"EAP authentication of peer failed on Protocol-Reject\");\n        auth_peer_fail(pcb, PPP_EAP);\n    }\n#endif /* PPP_SERVER */\n    eap_lowerdown(pcb);\n}\n\n/*\n * Format and send a regular EAP Response message.\n */\nstatic void eap_send_response(ppp_pcb *pcb, u_char id, u_char typenum, const u_char *str, int lenstr) {\n    struct pbuf *p;\n    u_char *outp;\n    int msglen;\n\n    msglen = EAP_HEADERLEN + sizeof (u_char) + lenstr;\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = (u_char*)p->payload;\n\n    MAKEHEADER(outp, PPP_EAP);\n\n    PUTCHAR(EAP_RESPONSE, outp);\n    PUTCHAR(id, outp);\n    pcb->eap.es_client.ea_id = id;\n    PUTSHORT(msglen, outp);\n    PUTCHAR(typenum, outp);\n    if (lenstr > 0) {\n        MEMCPY(outp, str, lenstr);\n    }\n\n    ppp_write(pcb, p);\n}\n\n/*\n * Format and send an MD5-Challenge EAP Response message.\n */\nstatic void eap_chap_response(ppp_pcb *pcb, u_char id, u_char *hash, const char *name, int namelen) {\n    struct pbuf *p;\n    u_char *outp;\n    int msglen;\n\n    msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + MD5_SIGNATURE_SIZE +\n        namelen;\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = (u_char*)p->payload;\n    \n    MAKEHEADER(outp, PPP_EAP);\n\n    PUTCHAR(EAP_RESPONSE, outp);\n    PUTCHAR(id, outp);\n    pcb->eap.es_client.ea_id = id;\n    PUTSHORT(msglen, outp);\n    PUTCHAR(EAPT_MD5CHAP, outp);\n    PUTCHAR(MD5_SIGNATURE_SIZE, outp);\n    MEMCPY(outp, hash, MD5_SIGNATURE_SIZE);\n    INCPTR(MD5_SIGNATURE_SIZE, outp);\n    if (namelen > 0) {\n        MEMCPY(outp, name, namelen);\n    }\n\n    ppp_write(pcb, p);\n}\n\n#ifdef USE_SRP\n/*\n * Format and send a SRP EAP Response message.\n */\nstatic void\neap_srp_response(esp, id, subtypenum, str, lenstr)\neap_state *esp;\nu_char id;\nu_char subtypenum;\nu_char *str;\nint lenstr;\n{\n    ppp_pcb *pcb = &ppp_pcb_list[pcb->eap.es_unit];\n    struct pbuf *p;\n    u_char *outp;\n    int msglen;\n\n    msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + lenstr;\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = p->payload;\n\n    MAKEHEADER(outp, PPP_EAP);\n\n    PUTCHAR(EAP_RESPONSE, outp);\n    PUTCHAR(id, outp);\n    pcb->eap.es_client.ea_id = id;\n    PUTSHORT(msglen, outp);\n    PUTCHAR(EAPT_SRP, outp);\n    PUTCHAR(subtypenum, outp);\n    if (lenstr > 0) {\n        MEMCPY(outp, str, lenstr);\n    }\n\n    ppp_write(pcb, p);\n}\n\n/*\n * Format and send a SRP EAP Client Validator Response message.\n */\nstatic void\neap_srpval_response(esp, id, flags, str)\neap_state *esp;\nu_char id;\nu32_t flags;\nu_char *str;\n{\n    ppp_pcb *pcb = &ppp_pcb_list[pcb->eap.es_unit];\n    struct pbuf *p;\n    u_char *outp;\n    int msglen;\n\n    msglen = EAP_HEADERLEN + 2 * sizeof (u_char) + sizeof (u32_t) +\n        SHA_DIGESTSIZE;\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = p->payload;\n\n    MAKEHEADER(outp, PPP_EAP);\n\n    PUTCHAR(EAP_RESPONSE, outp);\n    PUTCHAR(id, outp);\n    pcb->eap.es_client.ea_id = id;\n    PUTSHORT(msglen, outp);\n    PUTCHAR(EAPT_SRP, outp);\n    PUTCHAR(EAPSRP_CVALIDATOR, outp);\n    PUTLONG(flags, outp);\n    MEMCPY(outp, str, SHA_DIGESTSIZE);\n\n    ppp_write(pcb, p);\n}\n#endif /* USE_SRP */\n\nstatic void eap_send_nak(ppp_pcb *pcb, u_char id, u_char type) {\n    struct pbuf *p;\n    u_char *outp;\n    int msglen;\n\n    msglen = EAP_HEADERLEN + 2 * sizeof (u_char);\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN + msglen), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = (u_char*)p->payload;\n\n    MAKEHEADER(outp, PPP_EAP);\n\n    PUTCHAR(EAP_RESPONSE, outp);\n    PUTCHAR(id, outp);\n    pcb->eap.es_client.ea_id = id;\n    PUTSHORT(msglen, outp);\n    PUTCHAR(EAPT_NAK, outp);\n    PUTCHAR(type, outp);\n\n    ppp_write(pcb, p);\n}\n\n#ifdef USE_SRP\nstatic char *\nname_of_pn_file()\n{\n    char *user, *path, *file;\n    struct passwd *pw;\n    size_t pl;\n    static bool pnlogged = 0;\n\n    pw = getpwuid(getuid());\n    if (pw == NULL || (user = pw->pw_dir) == NULL || user[0] == 0) {\n        errno = EINVAL;\n        return (NULL);\n    }\n    file = _PATH_PSEUDONYM;\n    pl = strlen(user) + strlen(file) + 2;\n    path = malloc(pl);\n    if (path == NULL)\n        return (NULL);\n    (void) slprintf(path, pl, \"%s/%s\", user, file);\n    if (!pnlogged) {\n        ppp_dbglog(\"pseudonym file: %s\", path);\n        pnlogged = 1;\n    }\n    return (path);\n}\n\nstatic int\nopen_pn_file(modebits)\nmode_t modebits;\n{\n    char *path;\n    int fd, err;\n\n    if ((path = name_of_pn_file()) == NULL)\n        return (-1);\n    fd = open(path, modebits, S_IRUSR | S_IWUSR);\n    err = errno;\n    free(path);\n    errno = err;\n    return (fd);\n}\n\nstatic void\nremove_pn_file()\n{\n    char *path;\n\n    if ((path = name_of_pn_file()) != NULL) {\n        (void) unlink(path);\n        (void) free(path);\n    }\n}\n\nstatic void\nwrite_pseudonym(esp, inp, len, id)\neap_state *esp;\nu_char *inp;\nint len, id;\n{\n    u_char val;\n    u_char *datp, *digp;\n    SHA1_CTX ctxt;\n    u_char dig[SHA_DIGESTSIZE];\n    int dsize, fd, olen = len;\n\n    /*\n     * Do the decoding by working backwards.  This eliminates the need\n     * to save the decoded output in a separate buffer.\n     */\n    val = id;\n    while (len > 0) {\n        if ((dsize = len % SHA_DIGESTSIZE) == 0)\n            dsize = SHA_DIGESTSIZE;\n        len -= dsize;\n        datp = inp + len;\n        SHA1Init(&ctxt);\n        SHA1Update(&ctxt, &val, 1);\n        SHA1Update(&ctxt, pcb->eap.es_client.ea_skey, SESSION_KEY_LEN);\n        if (len > 0) {\n            SHA1Update(&ctxt, datp, SHA_DIGESTSIZE);\n        } else {\n            SHA1Update(&ctxt, pcb->eap.es_client.ea_name,\n                pcb->eap.es_client.ea_namelen);\n        }\n        SHA1Final(dig, &ctxt);\n        for (digp = dig; digp < dig + SHA_DIGESTSIZE; digp++)\n            *datp++ ^= *digp;\n    }\n\n    /* Now check that the result is sane */\n    if (olen <= 0 || *inp + 1 > olen) {\n        ppp_dbglog(\"EAP: decoded pseudonym is unusable <%.*B>\", olen, inp);\n        return;\n    }\n\n    /* Save it away */\n    fd = open_pn_file(O_WRONLY | O_CREAT | O_TRUNC);\n    if (fd < 0) {\n        ppp_dbglog(\"EAP: error saving pseudonym: %m\");\n        return;\n    }\n    len = write(fd, inp + 1, *inp);\n    if (close(fd) != -1 && len == *inp) {\n        ppp_dbglog(\"EAP: saved pseudonym\");\n        pcb->eap.es_usedpseudo = 0;\n    } else {\n        ppp_dbglog(\"EAP: failed to save pseudonym\");\n        remove_pn_file();\n    }\n}\n#endif /* USE_SRP */\n\n/*\n * eap_request - Receive EAP Request message (client mode).\n */\nstatic void eap_request(ppp_pcb *pcb, u_char *inp, int id, int len) {\n    u_char typenum;\n    u_char vallen;\n    int secret_len;\n    char secret[MAXSECRETLEN];\n    char rhostname[MAXNAMELEN];\n    lwip_md5_context mdContext;\n    u_char hash[MD5_SIGNATURE_SIZE];\n#ifdef USE_SRP\n    struct t_client *tc;\n    struct t_num sval, gval, Nval, *Ap, Bval;\n    u_char vals[2];\n    SHA1_CTX ctxt;\n    u_char dig[SHA_DIGESTSIZE];\n    int fd;\n#endif /* USE_SRP */\n\n    /*\n     * Note: we update es_client.ea_id *only if* a Response\n     * message is being generated.  Otherwise, we leave it the\n     * same for duplicate detection purposes.\n     */\n\n    pcb->eap.es_client.ea_requests++;\n    if (pcb->settings.eap_allow_req != 0 &&\n        pcb->eap.es_client.ea_requests > pcb->settings.eap_allow_req) {\n        ppp_info(\"EAP: received too many Request messages\");\n        if (pcb->settings.eap_req_time > 0) {\n            UNTIMEOUT(eap_client_timeout, pcb);\n        }\n        auth_withpeer_fail(pcb, PPP_EAP);\n        return;\n    }\n\n    if (len <= 0) {\n        ppp_error(\"EAP: empty Request message discarded\");\n        return;\n    }\n\n    GETCHAR(typenum, inp);\n    len--;\n\n    switch (typenum) {\n    case EAPT_IDENTITY:\n        if (len > 0)\n            ppp_info(\"EAP: Identity prompt \\\"%.*q\\\"\", len, inp);\n#ifdef USE_SRP\n        if (pcb->eap.es_usepseudo &&\n            (pcb->eap.es_usedpseudo == 0 ||\n            (pcb->eap.es_usedpseudo == 1 &&\n                id == pcb->eap.es_client.ea_id))) {\n            pcb->eap.es_usedpseudo = 1;\n            /* Try to get a pseudonym */\n            if ((fd = open_pn_file(O_RDONLY)) >= 0) {\n                strcpy(rhostname, SRP_PSEUDO_ID);\n                len = read(fd, rhostname + SRP_PSEUDO_LEN,\n                    sizeof (rhostname) - SRP_PSEUDO_LEN);\n                /* XXX NAI unsupported */\n                if (len > 0) {\n                    eap_send_response(pcb, id, typenum,\n                        rhostname, len + SRP_PSEUDO_LEN);\n                }\n                (void) close(fd);\n                if (len > 0)\n                    break;\n            }\n        }\n        /* Stop using pseudonym now. */\n        if (pcb->eap.es_usepseudo && pcb->eap.es_usedpseudo != 2) {\n            remove_pn_file();\n            pcb->eap.es_usedpseudo = 2;\n        }\n#endif /* USE_SRP */\n        eap_send_response(pcb, id, typenum, (const u_char*)pcb->eap.es_client.ea_name,\n            pcb->eap.es_client.ea_namelen);\n        break;\n\n    case EAPT_NOTIFICATION:\n        if (len > 0)\n            ppp_info(\"EAP: Notification \\\"%.*q\\\"\", len, inp);\n        eap_send_response(pcb, id, typenum, NULL, 0);\n        break;\n\n    case EAPT_NAK:\n        /*\n         * Avoid the temptation to send Response Nak in reply\n         * to Request Nak here.  It can only lead to trouble.\n         */\n        ppp_warn(\"EAP: unexpected Nak in Request; ignored\");\n        /* Return because we're waiting for something real. */\n        return;\n\n    case EAPT_MD5CHAP:\n        if (len < 1) {\n            ppp_error(\"EAP: received MD5-Challenge with no data\");\n            /* Bogus request; wait for something real. */\n            return;\n        }\n        GETCHAR(vallen, inp);\n        len--;\n        if (vallen < 8 || vallen > len) {\n            ppp_error(\"EAP: MD5-Challenge with bad length %d (8..%d)\",\n                vallen, len);\n            /* Try something better. */\n            eap_send_nak(pcb, id, EAPT_SRP);\n            break;\n        }\n\n        /* Not so likely to happen. */\n        if (vallen >= len + sizeof (rhostname)) {\n            ppp_dbglog(\"EAP: trimming really long peer name down\");\n            MEMCPY(rhostname, inp + vallen, sizeof (rhostname) - 1);\n            rhostname[sizeof (rhostname) - 1] = '\\0';\n        } else {\n            MEMCPY(rhostname, inp + vallen, len - vallen);\n            rhostname[len - vallen] = '\\0';\n        }\n\n#if PPP_REMOTENAME\n        /* In case the remote doesn't give us his name. */\n        if (pcb->settings.explicit_remote ||\n            (pcb->settings.remote_name[0] != '\\0' && vallen == len))\n            strlcpy(rhostname, pcb->settings.remote_name, sizeof (rhostname));\n#endif /* PPP_REMOTENAME */\n\n        /*\n         * Get the secret for authenticating ourselves with\n         * the specified host.\n         */\n        if (!get_secret(pcb, pcb->eap.es_client.ea_name,\n            rhostname, secret, &secret_len, 0)) {\n            ppp_dbglog(\"EAP: no MD5 secret for auth to %q\", rhostname);\n            eap_send_nak(pcb, id, EAPT_SRP);\n            break;\n        }\n        lwip_md5_init(&mdContext);\n        lwip_md5_starts(&mdContext);\n        typenum = id;\n        lwip_md5_update(&mdContext, &typenum, 1);\n        lwip_md5_update(&mdContext, (u_char *)secret, secret_len);\n        BZERO(secret, sizeof (secret));\n        lwip_md5_update(&mdContext, inp, vallen);\n        lwip_md5_finish(&mdContext, hash);\n        lwip_md5_free(&mdContext);\n        eap_chap_response(pcb, id, hash, pcb->eap.es_client.ea_name,\n            pcb->eap.es_client.ea_namelen);\n        break;\n\n#ifdef USE_SRP\n    case EAPT_SRP:\n        if (len < 1) {\n            ppp_error(\"EAP: received empty SRP Request\");\n            /* Bogus request; wait for something real. */\n            return;\n        }\n\n        /* Get subtype */\n        GETCHAR(vallen, inp);\n        len--;\n        switch (vallen) {\n        case EAPSRP_CHALLENGE:\n            tc = NULL;\n            if (pcb->eap.es_client.ea_session != NULL) {\n                tc = (struct t_client *)pcb->eap.es_client.\n                    ea_session;\n                /*\n                 * If this is a new challenge, then start\n                 * over with a new client session context.\n                 * Otherwise, just resend last response.\n                 */\n                if (id != pcb->eap.es_client.ea_id) {\n                    t_clientclose(tc);\n                    pcb->eap.es_client.ea_session = NULL;\n                    tc = NULL;\n                }\n            }\n            /* No session key just yet */\n            pcb->eap.es_client.ea_skey = NULL;\n            if (tc == NULL) {\n                int rhostnamelen;\n\n                GETCHAR(vallen, inp);\n                len--;\n                if (vallen >= len) {\n                    ppp_error(\"EAP: badly-formed SRP Challenge\"\n                        \" (name)\");\n                    /* Ignore badly-formed messages */\n                    return;\n                }\n                MEMCPY(rhostname, inp, vallen);\n                rhostname[vallen] = '\\0';\n                INCPTR(vallen, inp);\n                len -= vallen;\n\n                /*\n                 * In case the remote doesn't give us his name,\n                 * use configured name.\n                 */\n                if (explicit_remote ||\n                    (remote_name[0] != '\\0' && vallen == 0)) {\n                    strlcpy(rhostname, remote_name,\n                        sizeof (rhostname));\n                }\n\n                rhostnamelen = (int)strlen(rhostname);\n                if (rhostnamelen > MAXNAMELEN) {\n                    rhostnamelen = MAXNAMELEN;\n                }\n                MEMCPY(pcb->eap.es_client.ea_peer, rhostname, rhostnamelen);\n                pcb->eap.es_client.ea_peer[rhostnamelen] = '\\0';\n                pcb->eap.es_client.ea_peerlen = rhostnamelen;\n\n                GETCHAR(vallen, inp);\n                len--;\n                if (vallen >= len) {\n                    ppp_error(\"EAP: badly-formed SRP Challenge\"\n                        \" (s)\");\n                    /* Ignore badly-formed messages */\n                    return;\n                }\n                sval.data = inp;\n                sval.len = vallen;\n                INCPTR(vallen, inp);\n                len -= vallen;\n\n                GETCHAR(vallen, inp);\n                len--;\n                if (vallen > len) {\n                    ppp_error(\"EAP: badly-formed SRP Challenge\"\n                        \" (g)\");\n                    /* Ignore badly-formed messages */\n                    return;\n                }\n                /* If no generator present, then use value 2 */\n                if (vallen == 0) {\n                    gval.data = (u_char *)\"\\002\";\n                    gval.len = 1;\n                } else {\n                    gval.data = inp;\n                    gval.len = vallen;\n                }\n                INCPTR(vallen, inp);\n                len -= vallen;\n\n                /*\n                 * If no modulus present, then use well-known\n                 * value.\n                 */\n                if (len == 0) {\n                    Nval.data = (u_char *)wkmodulus;\n                    Nval.len = sizeof (wkmodulus);\n                } else {\n                    Nval.data = inp;\n                    Nval.len = len;\n                }\n                tc = t_clientopen(pcb->eap.es_client.ea_name,\n                    &Nval, &gval, &sval);\n                if (tc == NULL) {\n                    eap_send_nak(pcb, id, EAPT_MD5CHAP);\n                    break;\n                }\n                pcb->eap.es_client.ea_session = (void *)tc;\n\n                /* Add Challenge ID & type to verifier */\n                vals[0] = id;\n                vals[1] = EAPT_SRP;\n                t_clientaddexdata(tc, vals, 2);\n            }\n            Ap = t_clientgenexp(tc);\n            eap_srp_response(esp, id, EAPSRP_CKEY, Ap->data,\n                Ap->len);\n            break;\n\n        case EAPSRP_SKEY:\n            tc = (struct t_client *)pcb->eap.es_client.ea_session;\n            if (tc == NULL) {\n                ppp_warn(\"EAP: peer sent Subtype 2 without 1\");\n                eap_send_nak(pcb, id, EAPT_MD5CHAP);\n                break;\n            }\n            if (pcb->eap.es_client.ea_skey != NULL) {\n                /*\n                 * ID number should not change here.  Warn\n                 * if it does (but otherwise ignore).\n                 */\n                if (id != pcb->eap.es_client.ea_id) {\n                    ppp_warn(\"EAP: ID changed from %d to %d \"\n                        \"in SRP Subtype 2 rexmit\",\n                        pcb->eap.es_client.ea_id, id);\n                }\n            } else {\n                if (get_srp_secret(pcb->eap.es_unit,\n                    pcb->eap.es_client.ea_name,\n                    pcb->eap.es_client.ea_peer, secret, 0) == 0) {\n                    /*\n                     * Can't work with this peer because\n                     * the secret is missing.  Just give\n                     * up.\n                     */\n                    eap_send_nak(pcb, id, EAPT_MD5CHAP);\n                    break;\n                }\n                Bval.data = inp;\n                Bval.len = len;\n                t_clientpasswd(tc, secret);\n                BZERO(secret, sizeof (secret));\n                pcb->eap.es_client.ea_skey =\n                    t_clientgetkey(tc, &Bval);\n                if (pcb->eap.es_client.ea_skey == NULL) {\n                    /* Server is rogue; stop now */\n                    ppp_error(\"EAP: SRP server is rogue\");\n                    goto client_failure;\n                }\n            }\n            eap_srpval_response(esp, id, SRPVAL_EBIT,\n                t_clientresponse(tc));\n            break;\n\n        case EAPSRP_SVALIDATOR:\n            tc = (struct t_client *)pcb->eap.es_client.ea_session;\n            if (tc == NULL || pcb->eap.es_client.ea_skey == NULL) {\n                ppp_warn(\"EAP: peer sent Subtype 3 without 1/2\");\n                eap_send_nak(pcb, id, EAPT_MD5CHAP);\n                break;\n            }\n            /*\n             * If we're already open, then this ought to be a\n             * duplicate.  Otherwise, check that the server is\n             * who we think it is.\n             */\n            if (pcb->eap.es_client.ea_state == eapOpen) {\n                if (id != pcb->eap.es_client.ea_id) {\n                    ppp_warn(\"EAP: ID changed from %d to %d \"\n                        \"in SRP Subtype 3 rexmit\",\n                        pcb->eap.es_client.ea_id, id);\n                }\n            } else {\n                len -= sizeof (u32_t) + SHA_DIGESTSIZE;\n                if (len < 0 || t_clientverify(tc, inp +\n                    sizeof (u32_t)) != 0) {\n                    ppp_error(\"EAP: SRP server verification \"\n                        \"failed\");\n                    goto client_failure;\n                }\n                GETLONG(pcb->eap.es_client.ea_keyflags, inp);\n                /* Save pseudonym if user wants it. */\n                if (len > 0 && pcb->eap.es_usepseudo) {\n                    INCPTR(SHA_DIGESTSIZE, inp);\n                    write_pseudonym(esp, inp, len, id);\n                }\n            }\n            /*\n             * We've verified our peer.  We're now mostly done,\n             * except for waiting on the regular EAP Success\n             * message.\n             */\n            eap_srp_response(esp, id, EAPSRP_ACK, NULL, 0);\n            break;\n\n        case EAPSRP_LWRECHALLENGE:\n            if (len < 4) {\n                ppp_warn(\"EAP: malformed Lightweight rechallenge\");\n                return;\n            }\n            SHA1Init(&ctxt);\n            vals[0] = id;\n            SHA1Update(&ctxt, vals, 1);\n            SHA1Update(&ctxt, pcb->eap.es_client.ea_skey,\n                SESSION_KEY_LEN);\n            SHA1Update(&ctxt, inp, len);\n            SHA1Update(&ctxt, pcb->eap.es_client.ea_name,\n                pcb->eap.es_client.ea_namelen);\n            SHA1Final(dig, &ctxt);\n            eap_srp_response(esp, id, EAPSRP_LWRECHALLENGE, dig,\n                SHA_DIGESTSIZE);\n            break;\n\n        default:\n            ppp_error(\"EAP: unknown SRP Subtype %d\", vallen);\n            eap_send_nak(pcb, id, EAPT_MD5CHAP);\n            break;\n        }\n        break;\n#endif /* USE_SRP */\n\n    default:\n        ppp_info(\"EAP: unknown authentication type %d; Naking\", typenum);\n        eap_send_nak(pcb, id, EAPT_SRP);\n        break;\n    }\n\n    if (pcb->settings.eap_req_time > 0) {\n        UNTIMEOUT(eap_client_timeout, pcb);\n        TIMEOUT(eap_client_timeout, pcb,\n            pcb->settings.eap_req_time);\n    }\n    return;\n\n#ifdef USE_SRP\nclient_failure:\n    pcb->eap.es_client.ea_state = eapBadAuth;\n    if (pcb->settings.eap_req_time > 0) {\n        UNTIMEOUT(eap_client_timeout, (void *)esp);\n    }\n    pcb->eap.es_client.ea_session = NULL;\n    t_clientclose(tc);\n    auth_withpeer_fail(pcb, PPP_EAP);\n#endif /* USE_SRP */\n}\n\n#if PPP_SERVER\n/*\n * eap_response - Receive EAP Response message (server mode).\n */\nstatic void eap_response(ppp_pcb *pcb, u_char *inp, int id, int len) {\n    u_char typenum;\n    u_char vallen;\n    int secret_len;\n    char secret[MAXSECRETLEN];\n    char rhostname[MAXNAMELEN];\n    lwip_md5_context mdContext;\n    u_char hash[MD5_SIGNATURE_SIZE];\n#ifdef USE_SRP\n    struct t_server *ts;\n    struct t_num A;\n    SHA1_CTX ctxt;\n    u_char dig[SHA_DIGESTSIZE];\n#endif /* USE_SRP */\n\n    if (pcb->eap.es_server.ea_id != id) {\n        ppp_dbglog(\"EAP: discarding Response %d; expected ID %d\", id,\n            pcb->eap.es_server.ea_id);\n        return;\n    }\n\n    pcb->eap.es_server.ea_responses++;\n\n    if (len <= 0) {\n        ppp_error(\"EAP: empty Response message discarded\");\n        return;\n    }\n\n    GETCHAR(typenum, inp);\n    len--;\n\n    switch (typenum) {\n    case EAPT_IDENTITY:\n        if (pcb->eap.es_server.ea_state != eapIdentify) {\n            ppp_dbglog(\"EAP discarding unwanted Identify \\\"%.q\\\"\", len,\n                inp);\n            break;\n        }\n        ppp_info(\"EAP: unauthenticated peer name \\\"%.*q\\\"\", len, inp);\n        if (len > MAXNAMELEN) {\n          len = MAXNAMELEN;\n        }\n        MEMCPY(pcb->eap.es_server.ea_peer, inp, len);\n        pcb->eap.es_server.ea_peer[len] = '\\0';\n        pcb->eap.es_server.ea_peerlen = len;\n        eap_figure_next_state(pcb, 0);\n        break;\n\n    case EAPT_NOTIFICATION:\n        ppp_dbglog(\"EAP unexpected Notification; response discarded\");\n        break;\n\n    case EAPT_NAK:\n        if (len < 1) {\n            ppp_info(\"EAP: Nak Response with no suggested protocol\");\n            eap_figure_next_state(pcb, 1);\n            break;\n        }\n\n        GETCHAR(vallen, inp);\n        len--;\n\n        if (\n#if PPP_REMOTENAME\n        !pcb->explicit_remote &&\n#endif /* PPP_REMOTENAME */\n        pcb->eap.es_server.ea_state == eapIdentify){\n            /* Peer cannot Nak Identify Request */\n            eap_figure_next_state(pcb, 1);\n            break;\n        }\n\n        switch (vallen) {\n        case EAPT_SRP:\n            /* Run through SRP validator selection again. */\n            pcb->eap.es_server.ea_state = eapIdentify;\n            eap_figure_next_state(pcb, 0);\n            break;\n\n        case EAPT_MD5CHAP:\n            pcb->eap.es_server.ea_state = eapMD5Chall;\n            break;\n\n        default:\n            ppp_dbglog(\"EAP: peer requesting unknown Type %d\", vallen);\n            switch (pcb->eap.es_server.ea_state) {\n            case eapSRP1:\n            case eapSRP2:\n            case eapSRP3:\n                pcb->eap.es_server.ea_state = eapMD5Chall;\n                break;\n            case eapMD5Chall:\n            case eapSRP4:\n                pcb->eap.es_server.ea_state = eapIdentify;\n                eap_figure_next_state(pcb, 0);\n                break;\n            default:\n                break;\n            }\n            break;\n        }\n        break;\n\n    case EAPT_MD5CHAP:\n        if (pcb->eap.es_server.ea_state != eapMD5Chall) {\n            ppp_error(\"EAP: unexpected MD5-Response\");\n            eap_figure_next_state(pcb, 1);\n            break;\n        }\n        if (len < 1) {\n            ppp_error(\"EAP: received MD5-Response with no data\");\n            eap_figure_next_state(pcb, 1);\n            break;\n        }\n        GETCHAR(vallen, inp);\n        len--;\n        if (vallen != 16 || vallen > len) {\n            ppp_error(\"EAP: MD5-Response with bad length %d\", vallen);\n            eap_figure_next_state(pcb, 1);\n            break;\n        }\n\n        /* Not so likely to happen. */\n        if (vallen >= len + sizeof (rhostname)) {\n            ppp_dbglog(\"EAP: trimming really long peer name down\");\n            MEMCPY(rhostname, inp + vallen, sizeof (rhostname) - 1);\n            rhostname[sizeof (rhostname) - 1] = '\\0';\n        } else {\n            MEMCPY(rhostname, inp + vallen, len - vallen);\n            rhostname[len - vallen] = '\\0';\n        }\n\n#if PPP_REMOTENAME\n        /* In case the remote doesn't give us his name. */\n        if (explicit_remote ||\n            (remote_name[0] != '\\0' && vallen == len))\n            strlcpy(rhostname, remote_name, sizeof (rhostname));\n#endif /* PPP_REMOTENAME */\n\n        /*\n         * Get the secret for authenticating the specified\n         * host.\n         */\n        if (!get_secret(pcb, rhostname,\n            pcb->eap.es_server.ea_name, secret, &secret_len, 1)) {\n            ppp_dbglog(\"EAP: no MD5 secret for auth of %q\", rhostname);\n            eap_send_failure(pcb);\n            break;\n        }\n        lwip_md5_init(&mdContext);\n        lwip_md5_starts(&mdContext);\n        lwip_md5_update(&mdContext, &pcb->eap.es_server.ea_id, 1);\n        lwip_md5_update(&mdContext, (u_char *)secret, secret_len);\n        BZERO(secret, sizeof (secret));\n        lwip_md5_update(&mdContext, pcb->eap.es_challenge, pcb->eap.es_challen);\n        lwip_md5_finish(&mdContext, hash);\n        lwip_md5_free(&mdContext);\n        if (BCMP(hash, inp, MD5_SIGNATURE_SIZE) != 0) {\n            eap_send_failure(pcb);\n            break;\n        }\n        pcb->eap.es_server.ea_type = EAPT_MD5CHAP;\n        eap_send_success(pcb);\n        eap_figure_next_state(pcb, 0);\n        if (pcb->eap.es_rechallenge != 0)\n            TIMEOUT(eap_rechallenge, pcb, pcb->eap.es_rechallenge);\n        break;\n\n#ifdef USE_SRP\n    case EAPT_SRP:\n        if (len < 1) {\n            ppp_error(\"EAP: empty SRP Response\");\n            eap_figure_next_state(pcb, 1);\n            break;\n        }\n        GETCHAR(typenum, inp);\n        len--;\n        switch (typenum) {\n        case EAPSRP_CKEY:\n            if (pcb->eap.es_server.ea_state != eapSRP1) {\n                ppp_error(\"EAP: unexpected SRP Subtype 1 Response\");\n                eap_figure_next_state(pcb, 1);\n                break;\n            }\n            A.data = inp;\n            A.len = len;\n            ts = (struct t_server *)pcb->eap.es_server.ea_session;\n            assert(ts != NULL);\n            pcb->eap.es_server.ea_skey = t_servergetkey(ts, &A);\n            if (pcb->eap.es_server.ea_skey == NULL) {\n                /* Client's A value is bogus; terminate now */\n                ppp_error(\"EAP: bogus A value from client\");\n                eap_send_failure(pcb);\n            } else {\n                eap_figure_next_state(pcb, 0);\n            }\n            break;\n\n        case EAPSRP_CVALIDATOR:\n            if (pcb->eap.es_server.ea_state != eapSRP2) {\n                ppp_error(\"EAP: unexpected SRP Subtype 2 Response\");\n                eap_figure_next_state(pcb, 1);\n                break;\n            }\n            if (len < sizeof (u32_t) + SHA_DIGESTSIZE) {\n                ppp_error(\"EAP: M1 length %d < %d\", len,\n                    sizeof (u32_t) + SHA_DIGESTSIZE);\n                eap_figure_next_state(pcb, 1);\n                break;\n            }\n            GETLONG(pcb->eap.es_server.ea_keyflags, inp);\n            ts = (struct t_server *)pcb->eap.es_server.ea_session;\n            assert(ts != NULL);\n            if (t_serververify(ts, inp)) {\n                ppp_info(\"EAP: unable to validate client identity\");\n                eap_send_failure(pcb);\n                break;\n            }\n            eap_figure_next_state(pcb, 0);\n            break;\n\n        case EAPSRP_ACK:\n            if (pcb->eap.es_server.ea_state != eapSRP3) {\n                ppp_error(\"EAP: unexpected SRP Subtype 3 Response\");\n                eap_send_failure(esp);\n                break;\n            }\n            pcb->eap.es_server.ea_type = EAPT_SRP;\n            eap_send_success(pcb, esp);\n            eap_figure_next_state(pcb, 0);\n            if (pcb->eap.es_rechallenge != 0)\n                TIMEOUT(eap_rechallenge, pcb,\n                    pcb->eap.es_rechallenge);\n            if (pcb->eap.es_lwrechallenge != 0)\n                TIMEOUT(srp_lwrechallenge, pcb,\n                    pcb->eap.es_lwrechallenge);\n            break;\n\n        case EAPSRP_LWRECHALLENGE:\n            if (pcb->eap.es_server.ea_state != eapSRP4) {\n                ppp_info(\"EAP: unexpected SRP Subtype 4 Response\");\n                return;\n            }\n            if (len != SHA_DIGESTSIZE) {\n                ppp_error(\"EAP: bad Lightweight rechallenge \"\n                    \"response\");\n                return;\n            }\n            SHA1Init(&ctxt);\n            vallen = id;\n            SHA1Update(&ctxt, &vallen, 1);\n            SHA1Update(&ctxt, pcb->eap.es_server.ea_skey,\n                SESSION_KEY_LEN);\n            SHA1Update(&ctxt, pcb->eap.es_challenge, pcb->eap.es_challen);\n            SHA1Update(&ctxt, pcb->eap.es_server.ea_peer,\n                pcb->eap.es_server.ea_peerlen);\n            SHA1Final(dig, &ctxt);\n            if (BCMP(dig, inp, SHA_DIGESTSIZE) != 0) {\n                ppp_error(\"EAP: failed Lightweight rechallenge\");\n                eap_send_failure(pcb);\n                break;\n            }\n            pcb->eap.es_server.ea_state = eapOpen;\n            if (pcb->eap.es_lwrechallenge != 0)\n                TIMEOUT(srp_lwrechallenge, esp,\n                    pcb->eap.es_lwrechallenge);\n            break;\n        }\n        break;\n#endif /* USE_SRP */\n\n    default:\n        /* This can't happen. */\n        ppp_error(\"EAP: unknown Response type %d; ignored\", typenum);\n        return;\n    }\n\n    if (pcb->settings.eap_timeout_time > 0) {\n        UNTIMEOUT(eap_server_timeout, pcb);\n    }\n\n    if (pcb->eap.es_server.ea_state != eapBadAuth &&\n        pcb->eap.es_server.ea_state != eapOpen) {\n        pcb->eap.es_server.ea_id++;\n        eap_send_request(pcb);\n    }\n}\n#endif /* PPP_SERVER */\n\n/*\n * eap_success - Receive EAP Success message (client mode).\n */\nstatic void eap_success(ppp_pcb *pcb, u_char *inp, int id, int len) {\n    LWIP_UNUSED_ARG(id);\n\n    if (pcb->eap.es_client.ea_state != eapOpen && !eap_client_active(pcb)) {\n        ppp_dbglog(\"EAP unexpected success message in state %s (%d)\",\n            eap_state_name(pcb->eap.es_client.ea_state),\n            pcb->eap.es_client.ea_state);\n        return;\n    }\n\n    if (pcb->settings.eap_req_time > 0) {\n        UNTIMEOUT(eap_client_timeout, pcb);\n    }\n\n    if (len > 0) {\n        /* This is odd.  The spec doesn't allow for this. */\n        PRINTMSG(inp, len);\n    }\n\n    pcb->eap.es_client.ea_state = eapOpen;\n    auth_withpeer_success(pcb, PPP_EAP, 0);\n}\n\n/*\n * eap_failure - Receive EAP Failure message (client mode).\n */\nstatic void eap_failure(ppp_pcb *pcb, u_char *inp, int id, int len) {\n    LWIP_UNUSED_ARG(id);\n\n    if (!eap_client_active(pcb)) {\n        ppp_dbglog(\"EAP unexpected failure message in state %s (%d)\",\n            eap_state_name(pcb->eap.es_client.ea_state),\n            pcb->eap.es_client.ea_state);\n    }\n\n    if (pcb->settings.eap_req_time > 0) {\n        UNTIMEOUT(eap_client_timeout, pcb);\n    }\n\n    if (len > 0) {\n        /* This is odd.  The spec doesn't allow for this. */\n        PRINTMSG(inp, len);\n    }\n\n    pcb->eap.es_client.ea_state = eapBadAuth;\n\n    ppp_error(\"EAP: peer reports authentication failure\");\n    auth_withpeer_fail(pcb, PPP_EAP);\n}\n\n/*\n * eap_input - Handle received EAP message.\n */\nstatic void eap_input(ppp_pcb *pcb, u_char *inp, int inlen) {\n    u_char code, id;\n    int len;\n\n    /*\n     * Parse header (code, id and length).  If packet too short,\n     * drop it.\n     */\n    if (inlen < EAP_HEADERLEN) {\n        ppp_error(\"EAP: packet too short: %d < %d\", inlen, EAP_HEADERLEN);\n        return;\n    }\n    GETCHAR(code, inp);\n    GETCHAR(id, inp);\n    GETSHORT(len, inp);\n    if (len < EAP_HEADERLEN || len > inlen) {\n        ppp_error(\"EAP: packet has illegal length field %d (%d..%d)\", len,\n            EAP_HEADERLEN, inlen);\n        return;\n    }\n    len -= EAP_HEADERLEN;\n\n    /* Dispatch based on message code */\n    switch (code) {\n    case EAP_REQUEST:\n        eap_request(pcb, inp, id, len);\n        break;\n\n#if PPP_SERVER\n    case EAP_RESPONSE:\n        eap_response(pcb, inp, id, len);\n        break;\n#endif /* PPP_SERVER */\n\n    case EAP_SUCCESS:\n        eap_success(pcb, inp, id, len);\n        break;\n\n    case EAP_FAILURE:\n        eap_failure(pcb, inp, id, len);\n        break;\n\n    default:                /* XXX Need code reject */\n        /* Note: it's not legal to send EAP Nak here. */\n        ppp_warn(\"EAP: unknown code %d received\", code);\n        break;\n    }\n}\n\n#if PRINTPKT_SUPPORT\n/*\n * eap_printpkt - print the contents of an EAP packet.\n */\nstatic const char* const eap_codenames[] = {\n    \"Request\", \"Response\", \"Success\", \"Failure\"\n};\n\nstatic const char* const eap_typenames[] = {\n    \"Identity\", \"Notification\", \"Nak\", \"MD5-Challenge\",\n    \"OTP\", \"Generic-Token\", NULL, NULL,\n    \"RSA\", \"DSS\", \"KEA\", \"KEA-Validate\",\n    \"TLS\", \"Defender\", \"Windows 2000\", \"Arcot\",\n    \"Cisco\", \"Nokia\", \"SRP\"\n};\n\nstatic int eap_printpkt(const u_char *inp, int inlen, void (*printer) (void *, const char *, ...), void *arg) {\n    int code, id, len, rtype, vallen;\n    const u_char *pstart;\n    u32_t uval;\n\n    if (inlen < EAP_HEADERLEN)\n        return (0);\n    pstart = inp;\n    GETCHAR(code, inp);\n    GETCHAR(id, inp);\n    GETSHORT(len, inp);\n    if (len < EAP_HEADERLEN || len > inlen)\n        return (0);\n\n    if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(eap_codenames))\n        printer(arg, \" %s\", eap_codenames[code-1]);\n    else\n        printer(arg, \" code=0x%x\", code);\n    printer(arg, \" id=0x%x\", id);\n    len -= EAP_HEADERLEN;\n    switch (code) {\n    case EAP_REQUEST:\n        if (len < 1) {\n            printer(arg, \" <missing type>\");\n            break;\n        }\n        GETCHAR(rtype, inp);\n        len--;\n        if (rtype >= 1 && rtype <= (int)LWIP_ARRAYSIZE(eap_typenames))\n            printer(arg, \" %s\", eap_typenames[rtype-1]);\n        else\n            printer(arg, \" type=0x%x\", rtype);\n        switch (rtype) {\n        case EAPT_IDENTITY:\n        case EAPT_NOTIFICATION:\n            if (len > 0) {\n                printer(arg, \" <Message \");\n                ppp_print_string(inp, len, printer, arg);\n                printer(arg, \">\");\n                INCPTR(len, inp);\n                len = 0;\n            } else {\n                printer(arg, \" <No message>\");\n            }\n            break;\n\n        case EAPT_MD5CHAP:\n            if (len <= 0)\n                break;\n            GETCHAR(vallen, inp);\n            len--;\n            if (vallen > len)\n                goto truncated;\n            printer(arg, \" <Value%.*B>\", vallen, inp);\n            INCPTR(vallen, inp);\n            len -= vallen;\n            if (len > 0) {\n                printer(arg, \" <Name \");\n                ppp_print_string(inp, len, printer, arg);\n                printer(arg, \">\");\n                INCPTR(len, inp);\n                len = 0;\n            } else {\n                printer(arg, \" <No name>\");\n            }\n            break;\n\n        case EAPT_SRP:\n            if (len < 3)\n                goto truncated;\n            GETCHAR(vallen, inp);\n            len--;\n            printer(arg, \"-%d\", vallen);\n            switch (vallen) {\n            case EAPSRP_CHALLENGE:\n                GETCHAR(vallen, inp);\n                len--;\n                if (vallen >= len)\n                    goto truncated;\n                if (vallen > 0) {\n                    printer(arg, \" <Name \");\n                    ppp_print_string(inp, vallen, printer,\n                        arg);\n                    printer(arg, \">\");\n                } else {\n                    printer(arg, \" <No name>\");\n                }\n                INCPTR(vallen, inp);\n                len -= vallen;\n                GETCHAR(vallen, inp);\n                len--;\n                if (vallen >= len)\n                    goto truncated;\n                printer(arg, \" <s%.*B>\", vallen, inp);\n                INCPTR(vallen, inp);\n                len -= vallen;\n                GETCHAR(vallen, inp);\n                len--;\n                if (vallen > len)\n                    goto truncated;\n                if (vallen == 0) {\n                    printer(arg, \" <Default g=2>\");\n                } else {\n                    printer(arg, \" <g%.*B>\", vallen, inp);\n                }\n                INCPTR(vallen, inp);\n                len -= vallen;\n                if (len == 0) {\n                    printer(arg, \" <Default N>\");\n                } else {\n                    printer(arg, \" <N%.*B>\", len, inp);\n                    INCPTR(len, inp);\n                    len = 0;\n                }\n                break;\n\n            case EAPSRP_SKEY:\n                printer(arg, \" <B%.*B>\", len, inp);\n                INCPTR(len, inp);\n                len = 0;\n                break;\n\n            case EAPSRP_SVALIDATOR:\n                if (len < (int)sizeof (u32_t))\n                    break;\n                GETLONG(uval, inp);\n                len -= sizeof (u32_t);\n                if (uval & SRPVAL_EBIT) {\n                    printer(arg, \" E\");\n                    uval &= ~SRPVAL_EBIT;\n                }\n                if (uval != 0) {\n                    printer(arg, \" f<%X>\", uval);\n                }\n                if ((vallen = len) > SHA_DIGESTSIZE)\n                    vallen = SHA_DIGESTSIZE;\n                printer(arg, \" <M2%.*B%s>\", len, inp,\n                    len < SHA_DIGESTSIZE ? \"?\" : \"\");\n                INCPTR(vallen, inp);\n                len -= vallen;\n                if (len > 0) {\n                    printer(arg, \" <PN%.*B>\", len, inp);\n                    INCPTR(len, inp);\n                    len = 0;\n                }\n                break;\n\n            case EAPSRP_LWRECHALLENGE:\n                printer(arg, \" <Challenge%.*B>\", len, inp);\n                INCPTR(len, inp);\n                len = 0;\n                break;\n            default:\n                break;\n            }\n            break;\n        default:\n            break;\n        }\n        break;\n\n    case EAP_RESPONSE:\n        if (len < 1)\n            break;\n        GETCHAR(rtype, inp);\n        len--;\n        if (rtype >= 1 && rtype <= (int)LWIP_ARRAYSIZE(eap_typenames))\n            printer(arg, \" %s\", eap_typenames[rtype-1]);\n        else\n            printer(arg, \" type=0x%x\", rtype);\n        switch (rtype) {\n        case EAPT_IDENTITY:\n            if (len > 0) {\n                printer(arg, \" <Name \");\n                ppp_print_string(inp, len, printer, arg);\n                printer(arg, \">\");\n                INCPTR(len, inp);\n                len = 0;\n            }\n            break;\n\n        case EAPT_NAK:\n            if (len <= 0) {\n                printer(arg, \" <missing hint>\");\n                break;\n            }\n            GETCHAR(rtype, inp);\n            len--;\n            printer(arg, \" <Suggested-type %02X\", rtype);\n            if (rtype >= 1 && rtype < (int)LWIP_ARRAYSIZE(eap_typenames))\n                printer(arg, \" (%s)\", eap_typenames[rtype-1]);\n            printer(arg, \">\");\n            break;\n\n        case EAPT_MD5CHAP:\n            if (len <= 0) {\n                printer(arg, \" <missing length>\");\n                break;\n            }\n            GETCHAR(vallen, inp);\n            len--;\n            if (vallen > len)\n                goto truncated;\n            printer(arg, \" <Value%.*B>\", vallen, inp);\n            INCPTR(vallen, inp);\n            len -= vallen;\n            if (len > 0) {\n                printer(arg, \" <Name \");\n                ppp_print_string(inp, len, printer, arg);\n                printer(arg, \">\");\n                INCPTR(len, inp);\n                len = 0;\n            } else {\n                printer(arg, \" <No name>\");\n            }\n            break;\n\n        case EAPT_SRP:\n            if (len < 1)\n                goto truncated;\n            GETCHAR(vallen, inp);\n            len--;\n            printer(arg, \"-%d\", vallen);\n            switch (vallen) {\n            case EAPSRP_CKEY:\n                printer(arg, \" <A%.*B>\", len, inp);\n                INCPTR(len, inp);\n                len = 0;\n                break;\n\n            case EAPSRP_CVALIDATOR:\n                if (len < (int)sizeof (u32_t))\n                    break;\n                GETLONG(uval, inp);\n                len -= sizeof (u32_t);\n                if (uval & SRPVAL_EBIT) {\n                    printer(arg, \" E\");\n                    uval &= ~SRPVAL_EBIT;\n                }\n                if (uval != 0) {\n                    printer(arg, \" f<%X>\", uval);\n                }\n                printer(arg, \" <M1%.*B%s>\", len, inp,\n                    len == SHA_DIGESTSIZE ? \"\" : \"?\");\n                INCPTR(len, inp);\n                len = 0;\n                break;\n\n            case EAPSRP_ACK:\n                break;\n\n            case EAPSRP_LWRECHALLENGE:\n                printer(arg, \" <Response%.*B%s>\", len, inp,\n                    len == SHA_DIGESTSIZE ? \"\" : \"?\");\n                if ((vallen = len) > SHA_DIGESTSIZE)\n                    vallen = SHA_DIGESTSIZE;\n                INCPTR(vallen, inp);\n                len -= vallen;\n                break;\n            default:\n                break;\n            }\n            break;\n        default:\n            break;\n        }\n        break;\n\n    case EAP_SUCCESS:    /* No payload expected for these! */\n    case EAP_FAILURE:\n    default:\n        break;\n\n    truncated:\n        printer(arg, \" <truncated>\");\n        break;\n    }\n\n    if (len > 8)\n        printer(arg, \"%8B...\", inp);\n    else if (len > 0)\n        printer(arg, \"%.*B\", len, inp);\n    INCPTR(len, inp);\n\n    return (inp - pstart);\n}\n#endif /* PRINTPKT_SUPPORT */\n\n#endif /* PPP_SUPPORT && EAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/ecp.c",
    "content": "/*\n * ecp.c - PPP Encryption Control Protocol.\n *\n * Copyright (c) 2002 Google, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * Derived from ccp.c, which is:\n *\n * Copyright (c) 1994-2002 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && ECP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#include <string.h>\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/fsm.h\"\n#include \"netif/ppp/ecp.h\"\n\n#if PPP_OPTIONS\nstatic option_t ecp_option_list[] = {\n    { \"noecp\", o_bool, &ecp_protent.enabled_flag,\n      \"Disable ECP negotiation\" },\n    { \"-ecp\", o_bool, &ecp_protent.enabled_flag,\n      \"Disable ECP negotiation\", OPT_ALIAS },\n\n    { NULL }\n};\n#endif /* PPP_OPTIONS */\n\n/*\n * Protocol entry points from main code.\n */\nstatic void ecp_init (int unit);\n/*\nstatic void ecp_open (int unit);\nstatic void ecp_close (int unit, char *);\nstatic void ecp_lowerup (int unit);\nstatic void ecp_lowerdown (int);\nstatic void ecp_input (int unit, u_char *pkt, int len);\nstatic void ecp_protrej (int unit);\n*/\n#if PRINTPKT_SUPPORT\nstatic int  ecp_printpkt (const u_char *pkt, int len,\n                  void (*printer) (void *, char *, ...),\n                  void *arg);\n#endif /* PRINTPKT_SUPPORT */\n/*\nstatic void ecp_datainput (int unit, u_char *pkt, int len);\n*/\n\nconst struct protent ecp_protent = {\n    PPP_ECP,\n    ecp_init,\n    NULL, /* ecp_input, */\n    NULL, /* ecp_protrej, */\n    NULL, /* ecp_lowerup, */\n    NULL, /* ecp_lowerdown, */\n    NULL, /* ecp_open, */\n    NULL, /* ecp_close, */\n#if PRINTPKT_SUPPORT\n    ecp_printpkt,\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_DATAINPUT\n    NULL, /* ecp_datainput, */\n#endif /* PPP_DATAINPUT */\n#if PRINTPKT_SUPPORT\n    \"ECP\",\n    \"Encrypted\",\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_OPTIONS\n    ecp_option_list,\n    NULL,\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\n    NULL,\n    NULL\n#endif /* DEMAND_SUPPORT */\n};\n\nfsm ecp_fsm[NUM_PPP];\necp_options ecp_wantoptions[NUM_PPP];    /* what to request the peer to use */\necp_options ecp_gotoptions[NUM_PPP];    /* what the peer agreed to do */\necp_options ecp_allowoptions[NUM_PPP];    /* what we'll agree to do */\necp_options ecp_hisoptions[NUM_PPP];    /* what we agreed to do */\n\nstatic const fsm_callbacks ecp_callbacks = {\n    NULL, /* ecp_resetci, */\n    NULL, /* ecp_cilen, */\n    NULL, /* ecp_addci, */\n    NULL, /* ecp_ackci, */\n    NULL, /* ecp_nakci, */\n    NULL, /* ecp_rejci, */\n    NULL, /* ecp_reqci, */\n    NULL, /* ecp_up, */\n    NULL, /* ecp_down, */\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    NULL, /* ecp_extcode, */\n    \"ECP\"\n};\n\n/*\n * ecp_init - initialize ECP.\n */\nstatic void\necp_init(unit)\n    int unit;\n{\n    fsm *f = &ecp_fsm[unit];\n\n    f->unit = unit;\n    f->protocol = PPP_ECP;\n    f->callbacks = &ecp_callbacks;\n    fsm_init(f);\n\n#if 0 /* Not necessary, everything is cleared in ppp_new() */\n    memset(&ecp_wantoptions[unit],  0, sizeof(ecp_options));\n    memset(&ecp_gotoptions[unit],   0, sizeof(ecp_options));\n    memset(&ecp_allowoptions[unit], 0, sizeof(ecp_options));\n    memset(&ecp_hisoptions[unit],   0, sizeof(ecp_options));\n#endif /* 0 */\n\n}\n\n\n#if PRINTPKT_SUPPORT\nstatic int\necp_printpkt(p, plen, printer, arg)\n    const u_char *p;\n    int plen;\n    void (*printer) (void *, char *, ...);\n    void *arg;\n{\n    return 0;\n}\n#endif /* PRINTPKT_SUPPORT */\n\n#endif /* PPP_SUPPORT && ECP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/eui64.c",
    "content": "/*\n * eui64.c - EUI64 routines for IPv6CP.\n *\n * Copyright (c) 1999 Tommi Komulainen.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Tommi Komulainen\n *     <Tommi.Komulainen@iki.fi>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: eui64.c,v 1.6 2002/12/04 23:03:32 paulus Exp $\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPP_IPV6_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#include \"netif/ppp/ppp_impl.h\"\n#include \"netif/ppp/eui64.h\"\n\n/*\n * eui64_ntoa - Make an ascii representation of an interface identifier\n */\nchar *eui64_ntoa(eui64_t e) {\n    static char buf[20];\n\n    sprintf(buf, \"%02x%02x:%02x%02x:%02x%02x:%02x%02x\",\n         e.e8[0], e.e8[1], e.e8[2], e.e8[3], \n         e.e8[4], e.e8[5], e.e8[6], e.e8[7]);\n    return buf;\n}\n\n#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/fsm.c",
    "content": "/*\n * fsm.c - {Link, IP} Control Protocol Finite State Machine.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n/*\n * @todo:\n * Randomize fsm id on link/init.\n * Deal with variable outgoing MTU.\n */\n\n#if 0 /* UNUSED */\n#include <stdio.h>\n#include <string.h>\n#include <sys/types.h>\n#endif /* UNUSED */\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/fsm.h\"\n\nstatic void fsm_timeout (void *);\nstatic void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len);\nstatic void fsm_rconfack(fsm *f, int id, u_char *inp, int len);\nstatic void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len);\nstatic void fsm_rtermreq(fsm *f, int id, u_char *p, int len);\nstatic void fsm_rtermack(fsm *f);\nstatic void fsm_rcoderej(fsm *f, u_char *inp, int len);\nstatic void fsm_sconfreq(fsm *f, int retransmit);\n\n#define PROTO_NAME(f)    ((f)->callbacks->proto_name)\n\n/*\n * fsm_init - Initialize fsm.\n *\n * Initialize fsm state.\n */\nvoid fsm_init(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    f->state = PPP_FSM_INITIAL;\n    f->flags = 0;\n    f->id = 0;                /* XXX Start with random id? */\n    f->maxnakloops = pcb->settings.fsm_max_nak_loops;\n    f->term_reason_len = 0;\n}\n\n\n/*\n * fsm_lowerup - The lower layer is up.\n */\nvoid fsm_lowerup(fsm *f) {\n    switch( f->state ){\n    case PPP_FSM_INITIAL:\n    f->state = PPP_FSM_CLOSED;\n    break;\n\n    case PPP_FSM_STARTING:\n    if( f->flags & OPT_SILENT )\n        f->state = PPP_FSM_STOPPED;\n    else {\n        /* Send an initial configure-request */\n        fsm_sconfreq(f, 0);\n        f->state = PPP_FSM_REQSENT;\n    }\n    break;\n\n    default:\n    FSMDEBUG((\"%s: Up event in state %d!\", PROTO_NAME(f), f->state));\n    /* no break */\n    }\n}\n\n\n/*\n * fsm_lowerdown - The lower layer is down.\n *\n * Cancel all timeouts and inform upper layers.\n */\nvoid fsm_lowerdown(fsm *f) {\n    switch( f->state ){\n    case PPP_FSM_CLOSED:\n    f->state = PPP_FSM_INITIAL;\n    break;\n\n    case PPP_FSM_STOPPED:\n    f->state = PPP_FSM_STARTING;\n    if( f->callbacks->starting )\n        (*f->callbacks->starting)(f);\n    break;\n\n    case PPP_FSM_CLOSING:\n    f->state = PPP_FSM_INITIAL;\n    UNTIMEOUT(fsm_timeout, f);    /* Cancel timeout */\n    break;\n\n    case PPP_FSM_STOPPING:\n    case PPP_FSM_REQSENT:\n    case PPP_FSM_ACKRCVD:\n    case PPP_FSM_ACKSENT:\n    f->state = PPP_FSM_STARTING;\n    UNTIMEOUT(fsm_timeout, f);    /* Cancel timeout */\n    break;\n\n    case PPP_FSM_OPENED:\n    if( f->callbacks->down )\n        (*f->callbacks->down)(f);\n    f->state = PPP_FSM_STARTING;\n    break;\n\n    default:\n    FSMDEBUG((\"%s: Down event in state %d!\", PROTO_NAME(f), f->state));\n    /* no break */\n    }\n}\n\n\n/*\n * fsm_open - Link is allowed to come up.\n */\nvoid fsm_open(fsm *f) {\n    switch( f->state ){\n    case PPP_FSM_INITIAL:\n    f->state = PPP_FSM_STARTING;\n    if( f->callbacks->starting )\n        (*f->callbacks->starting)(f);\n    break;\n\n    case PPP_FSM_CLOSED:\n    if( f->flags & OPT_SILENT )\n        f->state = PPP_FSM_STOPPED;\n    else {\n        /* Send an initial configure-request */\n        fsm_sconfreq(f, 0);\n        f->state = PPP_FSM_REQSENT;\n    }\n    break;\n\n    case PPP_FSM_CLOSING:\n    f->state = PPP_FSM_STOPPING;\n    /* fall through */\n    /* no break */\n    case PPP_FSM_STOPPED:\n    case PPP_FSM_OPENED:\n    if( f->flags & OPT_RESTART ){\n        fsm_lowerdown(f);\n        fsm_lowerup(f);\n    }\n    break;\n    default:\n    break;\n    }\n}\n\n/*\n * terminate_layer - Start process of shutting down the FSM\n *\n * Cancel any timeout running, notify upper layers we're done, and\n * send a terminate-request message as configured.\n */\nstatic void terminate_layer(fsm *f, int nextstate) {\n    ppp_pcb *pcb = f->pcb;\n\n    if( f->state != PPP_FSM_OPENED )\n    UNTIMEOUT(fsm_timeout, f);    /* Cancel timeout */\n    else if( f->callbacks->down )\n    (*f->callbacks->down)(f);    /* Inform upper layers we're down */\n\n    /* Init restart counter and send Terminate-Request */\n    f->retransmits = pcb->settings.fsm_max_term_transmits;\n    fsm_sdata(f, TERMREQ, f->reqid = ++f->id,\n          (const u_char *) f->term_reason, f->term_reason_len);\n\n    if (f->retransmits == 0) {\n    /*\n     * User asked for no terminate requests at all; just close it.\n     * We've already fired off one Terminate-Request just to be nice\n     * to the peer, but we're not going to wait for a reply.\n     */\n    f->state = nextstate == PPP_FSM_CLOSING ? PPP_FSM_CLOSED : PPP_FSM_STOPPED;\n    if( f->callbacks->finished )\n        (*f->callbacks->finished)(f);\n    return;\n    }\n\n    TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);\n    --f->retransmits;\n\n    f->state = nextstate;\n}\n\n/*\n * fsm_close - Start closing connection.\n *\n * Cancel timeouts and either initiate close or possibly go directly to\n * the PPP_FSM_CLOSED state.\n */\nvoid fsm_close(fsm *f, const char *reason) {\n    f->term_reason = reason;\n    f->term_reason_len = (reason == NULL? 0: LWIP_MIN(strlen(reason), 0xFF) );\n    switch( f->state ){\n    case PPP_FSM_STARTING:\n    f->state = PPP_FSM_INITIAL;\n    break;\n    case PPP_FSM_STOPPED:\n    f->state = PPP_FSM_CLOSED;\n    break;\n    case PPP_FSM_STOPPING:\n    f->state = PPP_FSM_CLOSING;\n    break;\n\n    case PPP_FSM_REQSENT:\n    case PPP_FSM_ACKRCVD:\n    case PPP_FSM_ACKSENT:\n    case PPP_FSM_OPENED:\n    terminate_layer(f, PPP_FSM_CLOSING);\n    break;\n    default:\n    break;\n    }\n}\n\n\n/*\n * fsm_timeout - Timeout expired.\n */\nstatic void fsm_timeout(void *arg) {\n    fsm *f = (fsm *) arg;\n    ppp_pcb *pcb = f->pcb;\n\n    switch (f->state) {\n    case PPP_FSM_CLOSING:\n    case PPP_FSM_STOPPING:\n    if( f->retransmits <= 0 ){\n        /*\n         * We've waited for an ack long enough.  Peer probably heard us.\n         */\n        f->state = (f->state == PPP_FSM_CLOSING)? PPP_FSM_CLOSED: PPP_FSM_STOPPED;\n        if( f->callbacks->finished )\n        (*f->callbacks->finished)(f);\n    } else {\n        /* Send Terminate-Request */\n        fsm_sdata(f, TERMREQ, f->reqid = ++f->id,\n              (const u_char *) f->term_reason, f->term_reason_len);\n        TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);\n        --f->retransmits;\n    }\n    break;\n\n    case PPP_FSM_REQSENT:\n    case PPP_FSM_ACKRCVD:\n    case PPP_FSM_ACKSENT:\n    if (f->retransmits <= 0) {\n        ppp_warn(\"%s: timeout sending Config-Requests\", PROTO_NAME(f));\n        f->state = PPP_FSM_STOPPED;\n        if( (f->flags & OPT_PASSIVE) == 0 && f->callbacks->finished )\n        (*f->callbacks->finished)(f);\n\n    } else {\n        /* Retransmit the configure-request */\n        if (f->callbacks->retransmit)\n        (*f->callbacks->retransmit)(f);\n        fsm_sconfreq(f, 1);        /* Re-send Configure-Request */\n        if( f->state == PPP_FSM_ACKRCVD )\n        f->state = PPP_FSM_REQSENT;\n    }\n    break;\n\n    default:\n    FSMDEBUG((\"%s: Timeout event in state %d!\", PROTO_NAME(f), f->state));\n    /* no break */\n    }\n}\n\n\n/*\n * fsm_input - Input packet.\n */\nvoid fsm_input(fsm *f, u_char *inpacket, int l) {\n    u_char *inp;\n    u_char code, id;\n    int len;\n\n    /*\n     * Parse header (code, id and length).\n     * If packet too short, drop it.\n     */\n    inp = inpacket;\n    if (l < HEADERLEN) {\n    FSMDEBUG((\"fsm_input(%x): Rcvd short header.\", f->protocol));\n    return;\n    }\n    GETCHAR(code, inp);\n    GETCHAR(id, inp);\n    GETSHORT(len, inp);\n    if (len < HEADERLEN) {\n    FSMDEBUG((\"fsm_input(%x): Rcvd illegal length.\", f->protocol));\n    return;\n    }\n    if (len > l) {\n    FSMDEBUG((\"fsm_input(%x): Rcvd short packet.\", f->protocol));\n    return;\n    }\n    len -= HEADERLEN;        /* subtract header length */\n\n    if( f->state == PPP_FSM_INITIAL || f->state == PPP_FSM_STARTING ){\n    FSMDEBUG((\"fsm_input(%x): Rcvd packet in state %d.\",\n          f->protocol, f->state));\n    return;\n    }\n\n    /*\n     * Action depends on code.\n     */\n    switch (code) {\n    case CONFREQ:\n    fsm_rconfreq(f, id, inp, len);\n    break;\n    \n    case CONFACK:\n    fsm_rconfack(f, id, inp, len);\n    break;\n    \n    case CONFNAK:\n    case CONFREJ:\n    fsm_rconfnakrej(f, code, id, inp, len);\n    break;\n    \n    case TERMREQ:\n    fsm_rtermreq(f, id, inp, len);\n    break;\n    \n    case TERMACK:\n    fsm_rtermack(f);\n    break;\n    \n    case CODEREJ:\n    fsm_rcoderej(f, inp, len);\n    break;\n    \n    default:\n    if( !f->callbacks->extcode\n       || !(*f->callbacks->extcode)(f, code, id, inp, len) )\n        fsm_sdata(f, CODEREJ, ++f->id, inpacket, len + HEADERLEN);\n    break;\n    }\n}\n\n\n/*\n * fsm_rconfreq - Receive Configure-Request.\n */\nstatic void fsm_rconfreq(fsm *f, u_char id, u_char *inp, int len) {\n    int code, reject_if_disagree;\n\n    switch( f->state ){\n    case PPP_FSM_CLOSED:\n    /* Go away, we're closed */\n    fsm_sdata(f, TERMACK, id, NULL, 0);\n    return;\n    case PPP_FSM_CLOSING:\n    case PPP_FSM_STOPPING:\n    return;\n\n    case PPP_FSM_OPENED:\n    /* Go down and restart negotiation */\n    if( f->callbacks->down )\n        (*f->callbacks->down)(f);    /* Inform upper layers */\n    fsm_sconfreq(f, 0);        /* Send initial Configure-Request */\n    f->state = PPP_FSM_REQSENT;\n    break;\n\n    case PPP_FSM_STOPPED:\n    /* Negotiation started by our peer */\n    fsm_sconfreq(f, 0);        /* Send initial Configure-Request */\n    f->state = PPP_FSM_REQSENT;\n    break;\n    default:\n    break;\n    }\n\n    /*\n     * Pass the requested configuration options\n     * to protocol-specific code for checking.\n     */\n    if (f->callbacks->reqci){        /* Check CI */\n    reject_if_disagree = (f->nakloops >= f->maxnakloops);\n    code = (*f->callbacks->reqci)(f, inp, &len, reject_if_disagree);\n    } else if (len)\n    code = CONFREJ;            /* Reject all CI */\n    else\n    code = CONFACK;\n\n    /* send the Ack, Nak or Rej to the peer */\n    fsm_sdata(f, code, id, inp, len);\n\n    if (code == CONFACK) {\n    if (f->state == PPP_FSM_ACKRCVD) {\n        UNTIMEOUT(fsm_timeout, f);    /* Cancel timeout */\n        f->state = PPP_FSM_OPENED;\n        if (f->callbacks->up)\n        (*f->callbacks->up)(f);    /* Inform upper layers */\n    } else\n        f->state = PPP_FSM_ACKSENT;\n    f->nakloops = 0;\n\n    } else {\n    /* we sent CONFACK or CONFREJ */\n    if (f->state != PPP_FSM_ACKRCVD)\n        f->state = PPP_FSM_REQSENT;\n    if( code == CONFNAK )\n        ++f->nakloops;\n    }\n}\n\n\n/*\n * fsm_rconfack - Receive Configure-Ack.\n */\nstatic void fsm_rconfack(fsm *f, int id, u_char *inp, int len) {\n    ppp_pcb *pcb = f->pcb;\n\n    if (id != f->reqid || f->seen_ack)        /* Expected id? */\n    return;                    /* Nope, toss... */\n    if( !(f->callbacks->ackci? (*f->callbacks->ackci)(f, inp, len):\n      (len == 0)) ){\n    /* Ack is bad - ignore it */\n    ppp_error(\"Received bad configure-ack: %P\", inp, len);\n    return;\n    }\n    f->seen_ack = 1;\n    f->rnakloops = 0;\n\n    switch (f->state) {\n    case PPP_FSM_CLOSED:\n    case PPP_FSM_STOPPED:\n    fsm_sdata(f, TERMACK, id, NULL, 0);\n    break;\n\n    case PPP_FSM_REQSENT:\n    f->state = PPP_FSM_ACKRCVD;\n    f->retransmits = pcb->settings.fsm_max_conf_req_transmits;\n    break;\n\n    case PPP_FSM_ACKRCVD:\n    /* Huh? an extra valid Ack? oh well... */\n    UNTIMEOUT(fsm_timeout, f);    /* Cancel timeout */\n    fsm_sconfreq(f, 0);\n    f->state = PPP_FSM_REQSENT;\n    break;\n\n    case PPP_FSM_ACKSENT:\n    UNTIMEOUT(fsm_timeout, f);    /* Cancel timeout */\n    f->state = PPP_FSM_OPENED;\n    f->retransmits = pcb->settings.fsm_max_conf_req_transmits;\n    if (f->callbacks->up)\n        (*f->callbacks->up)(f);    /* Inform upper layers */\n    break;\n\n    case PPP_FSM_OPENED:\n    /* Go down and restart negotiation */\n    if (f->callbacks->down)\n        (*f->callbacks->down)(f);    /* Inform upper layers */\n    fsm_sconfreq(f, 0);        /* Send initial Configure-Request */\n    f->state = PPP_FSM_REQSENT;\n    break;\n    default:\n    break;\n    }\n}\n\n\n/*\n * fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.\n */\nstatic void fsm_rconfnakrej(fsm *f, int code, int id, u_char *inp, int len) {\n    int ret;\n    int treat_as_reject;\n\n    if (id != f->reqid || f->seen_ack)    /* Expected id? */\n    return;                /* Nope, toss... */\n\n    if (code == CONFNAK) {\n    ++f->rnakloops;\n    treat_as_reject = (f->rnakloops >= f->maxnakloops);\n    if (f->callbacks->nakci == NULL\n        || !(ret = f->callbacks->nakci(f, inp, len, treat_as_reject))) {\n        ppp_error(\"Received bad configure-nak: %P\", inp, len);\n        return;\n    }\n    } else {\n    f->rnakloops = 0;\n    if (f->callbacks->rejci == NULL\n        || !(ret = f->callbacks->rejci(f, inp, len))) {\n        ppp_error(\"Received bad configure-rej: %P\", inp, len);\n        return;\n    }\n    }\n\n    f->seen_ack = 1;\n\n    switch (f->state) {\n    case PPP_FSM_CLOSED:\n    case PPP_FSM_STOPPED:\n    fsm_sdata(f, TERMACK, id, NULL, 0);\n    break;\n\n    case PPP_FSM_REQSENT:\n    case PPP_FSM_ACKSENT:\n    /* They didn't agree to what we wanted - try another request */\n    UNTIMEOUT(fsm_timeout, f);    /* Cancel timeout */\n    if (ret < 0)\n        f->state = PPP_FSM_STOPPED;        /* kludge for stopping CCP */\n    else\n        fsm_sconfreq(f, 0);        /* Send Configure-Request */\n    break;\n\n    case PPP_FSM_ACKRCVD:\n    /* Got a Nak/reject when we had already had an Ack?? oh well... */\n    UNTIMEOUT(fsm_timeout, f);    /* Cancel timeout */\n    fsm_sconfreq(f, 0);\n    f->state = PPP_FSM_REQSENT;\n    break;\n\n    case PPP_FSM_OPENED:\n    /* Go down and restart negotiation */\n    if (f->callbacks->down)\n        (*f->callbacks->down)(f);    /* Inform upper layers */\n    fsm_sconfreq(f, 0);        /* Send initial Configure-Request */\n    f->state = PPP_FSM_REQSENT;\n    break;\n    default:\n    break;\n    }\n}\n\n\n/*\n * fsm_rtermreq - Receive Terminate-Req.\n */\nstatic void fsm_rtermreq(fsm *f, int id, u_char *p, int len) {\n    ppp_pcb *pcb = f->pcb;\n\n    switch (f->state) {\n    case PPP_FSM_ACKRCVD:\n    case PPP_FSM_ACKSENT:\n    f->state = PPP_FSM_REQSENT;        /* Start over but keep trying */\n    break;\n\n    case PPP_FSM_OPENED:\n    if (len > 0) {\n        ppp_info(\"%s terminated by peer (%0.*v)\", PROTO_NAME(f), len, p);\n    } else\n        ppp_info(\"%s terminated by peer\", PROTO_NAME(f));\n    f->retransmits = 0;\n    f->state = PPP_FSM_STOPPING;\n    if (f->callbacks->down)\n        (*f->callbacks->down)(f);    /* Inform upper layers */\n    TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);\n    break;\n    default:\n    break;\n    }\n\n    fsm_sdata(f, TERMACK, id, NULL, 0);\n}\n\n\n/*\n * fsm_rtermack - Receive Terminate-Ack.\n */\nstatic void fsm_rtermack(fsm *f) {\n    switch (f->state) {\n    case PPP_FSM_CLOSING:\n    UNTIMEOUT(fsm_timeout, f);\n    f->state = PPP_FSM_CLOSED;\n    if( f->callbacks->finished )\n        (*f->callbacks->finished)(f);\n    break;\n    case PPP_FSM_STOPPING:\n    UNTIMEOUT(fsm_timeout, f);\n    f->state = PPP_FSM_STOPPED;\n    if( f->callbacks->finished )\n        (*f->callbacks->finished)(f);\n    break;\n\n    case PPP_FSM_ACKRCVD:\n    f->state = PPP_FSM_REQSENT;\n    break;\n\n    case PPP_FSM_OPENED:\n    if (f->callbacks->down)\n        (*f->callbacks->down)(f);    /* Inform upper layers */\n    fsm_sconfreq(f, 0);\n    f->state = PPP_FSM_REQSENT;\n    break;\n    default:\n    break;\n    }\n}\n\n\n/*\n * fsm_rcoderej - Receive an Code-Reject.\n */\nstatic void fsm_rcoderej(fsm *f, u_char *inp, int len) {\n    u_char code, id;\n\n    if (len < HEADERLEN) {\n    FSMDEBUG((\"fsm_rcoderej: Rcvd short Code-Reject packet!\"));\n    return;\n    }\n    GETCHAR(code, inp);\n    GETCHAR(id, inp);\n    ppp_warn(\"%s: Rcvd Code-Reject for code %d, id %d\", PROTO_NAME(f), code, id);\n\n    if( f->state == PPP_FSM_ACKRCVD )\n    f->state = PPP_FSM_REQSENT;\n}\n\n\n/*\n * fsm_protreject - Peer doesn't speak this protocol.\n *\n * Treat this as a catastrophic error (RXJ-).\n */\nvoid fsm_protreject(fsm *f) {\n    switch( f->state ){\n    case PPP_FSM_CLOSING:\n    UNTIMEOUT(fsm_timeout, f);    /* Cancel timeout */\n    /* fall through */\n    /* no break */\n    case PPP_FSM_CLOSED:\n    f->state = PPP_FSM_CLOSED;\n    if( f->callbacks->finished )\n        (*f->callbacks->finished)(f);\n    break;\n\n    case PPP_FSM_STOPPING:\n    case PPP_FSM_REQSENT:\n    case PPP_FSM_ACKRCVD:\n    case PPP_FSM_ACKSENT:\n    UNTIMEOUT(fsm_timeout, f);    /* Cancel timeout */\n    /* fall through */\n    /* no break */\n    case PPP_FSM_STOPPED:\n    f->state = PPP_FSM_STOPPED;\n    if( f->callbacks->finished )\n        (*f->callbacks->finished)(f);\n    break;\n\n    case PPP_FSM_OPENED:\n    terminate_layer(f, PPP_FSM_STOPPING);\n    break;\n\n    default:\n    FSMDEBUG((\"%s: Protocol-reject event in state %d!\",\n          PROTO_NAME(f), f->state));\n    /* no break */\n    }\n}\n\n\n/*\n * fsm_sconfreq - Send a Configure-Request.\n */\nstatic void fsm_sconfreq(fsm *f, int retransmit) {\n    ppp_pcb *pcb = f->pcb;\n    struct pbuf *p;\n    u_char *outp;\n    int cilen;\n\n    if( f->state != PPP_FSM_REQSENT && f->state != PPP_FSM_ACKRCVD && f->state != PPP_FSM_ACKSENT ){\n    /* Not currently negotiating - reset options */\n    if( f->callbacks->resetci )\n        (*f->callbacks->resetci)(f);\n    f->nakloops = 0;\n    f->rnakloops = 0;\n    }\n\n    if( !retransmit ){\n    /* New request - reset retransmission counter, use new ID */\n    f->retransmits = pcb->settings.fsm_max_conf_req_transmits;\n    f->reqid = ++f->id;\n    }\n\n    f->seen_ack = 0;\n\n    /*\n     * Make up the request packet\n     */\n    if( f->callbacks->cilen && f->callbacks->addci ){\n    cilen = (*f->callbacks->cilen)(f);\n    if( cilen > pcb->peer_mru - HEADERLEN )\n        cilen = pcb->peer_mru - HEADERLEN;\n    } else\n    cilen = 0;\n\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(cilen + HEADERLEN + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    /* send the request to our peer */\n    outp = (u_char*)p->payload;\n    MAKEHEADER(outp, f->protocol);\n    PUTCHAR(CONFREQ, outp);\n    PUTCHAR(f->reqid, outp);\n    PUTSHORT(cilen + HEADERLEN, outp);\n    if (cilen != 0) {\n    (*f->callbacks->addci)(f, outp, &cilen);\n    LWIP_ASSERT(\"cilen == p->len - HEADERLEN - PPP_HDRLEN\", cilen == p->len - HEADERLEN - PPP_HDRLEN);\n    }\n\n    ppp_write(pcb, p);\n\n    /* start the retransmit timer */\n    --f->retransmits;\n    TIMEOUT(fsm_timeout, f, pcb->settings.fsm_timeout_time);\n}\n\n\n/*\n * fsm_sdata - Send some data.\n *\n * Used for all packets sent to our peer by this module.\n */\nvoid fsm_sdata(fsm *f, u_char code, u_char id, const u_char *data, int datalen) {\n    ppp_pcb *pcb = f->pcb;\n    struct pbuf *p;\n    u_char *outp;\n    int outlen;\n\n    /* Adjust length to be smaller than MTU */\n    if (datalen > pcb->peer_mru - HEADERLEN)\n    datalen = pcb->peer_mru - HEADERLEN;\n    outlen = datalen + HEADERLEN;\n\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(outlen + PPP_HDRLEN), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = (u_char*)p->payload;\n    if (datalen) /* && data != outp + PPP_HDRLEN + HEADERLEN)  -- was only for fsm_sconfreq() */\n    MEMCPY(outp + PPP_HDRLEN + HEADERLEN, data, datalen);\n    MAKEHEADER(outp, f->protocol);\n    PUTCHAR(code, outp);\n    PUTCHAR(id, outp);\n    PUTSHORT(outlen, outp);\n    ppp_write(pcb, p);\n}\n\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/ipcp.c",
    "content": "/*\n * ipcp.c - PPP IP Control Protocol.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPP_IPV4_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n/*\n * @todo:\n */\n\n#if 0 /* UNUSED */\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <netdb.h>\n#include <sys/param.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif /* UNUSED */\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/fsm.h\"\n#include \"netif/ppp/ipcp.h\"\n\n#if 0 /* UNUSED */\n/* global vars */\nu32_t netmask = 0;        /* IP netmask to set on interface */\n#endif /* UNUSED */\n\n#if 0 /* UNUSED */\nbool    disable_defaultip = 0;    /* Don't use hostname for default IP adrs */\n#endif /* UNUSED */\n\n#if 0 /* moved to ppp_settings */\nbool    noremoteip = 0;        /* Let him have no IP address */\n#endif /* moved to ppp_setting */\n\n#if 0 /* UNUSED */\n/* Hook for a plugin to know when IP protocol has come up */\nvoid (*ip_up_hook) (void) = NULL;\n\n/* Hook for a plugin to know when IP protocol has come down */\nvoid (*ip_down_hook) (void) = NULL;\n\n/* Hook for a plugin to choose the remote IP address */\nvoid (*ip_choose_hook) (u32_t *) = NULL;\n#endif /* UNUSED */\n\n#if PPP_NOTIFY\n/* Notifiers for when IPCP goes up and down */\nstruct notifier *ip_up_notifier = NULL;\nstruct notifier *ip_down_notifier = NULL;\n#endif /* PPP_NOTIFY */\n\n/* local vars */\n#if 0 /* moved to ppp_pcb */\nstatic int default_route_set[NUM_PPP];    /* Have set up a default route */\nstatic int proxy_arp_set[NUM_PPP];    /* Have created proxy arp entry */\nstatic int ipcp_is_up;            /* have called np_up() */\nstatic int ipcp_is_open;        /* haven't called np_finished() */\nstatic bool ask_for_local;        /* request our address from peer */\n#endif /* moved to ppp_pcb */\n#if 0 /* UNUSED */\nstatic char vj_value[8];        /* string form of vj option value */\nstatic char netmask_str[20];        /* string form of netmask value */\n#endif /* UNUSED */\n\n/*\n * Callbacks for fsm code.  (CI = Configuration Information)\n */\nstatic void ipcp_resetci(fsm *f);    /* Reset our CI */\nstatic int  ipcp_cilen(fsm *f);            /* Return length of our CI */\nstatic void ipcp_addci(fsm *f, u_char *ucp, int *lenp); /* Add our CI */\nstatic int  ipcp_ackci(fsm *f, u_char *p, int len);    /* Peer ack'd our CI */\nstatic int  ipcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject);/* Peer nak'd our CI */\nstatic int  ipcp_rejci(fsm *f, u_char *p, int len);    /* Peer rej'd our CI */\nstatic int  ipcp_reqci(fsm *f, u_char *inp, int *len, int reject_if_disagree); /* Rcv CI */\nstatic void ipcp_up(fsm *f);        /* We're UP */\nstatic void ipcp_down(fsm *f);        /* We're DOWN */\nstatic void ipcp_finished(fsm *f);    /* Don't need lower layer */\n\nstatic const fsm_callbacks ipcp_callbacks = { /* IPCP callback routines */\n    ipcp_resetci,        /* Reset our Configuration Information */\n    ipcp_cilen,            /* Length of our Configuration Information */\n    ipcp_addci,            /* Add our Configuration Information */\n    ipcp_ackci,            /* ACK our Configuration Information */\n    ipcp_nakci,            /* NAK our Configuration Information */\n    ipcp_rejci,            /* Reject our Configuration Information */\n    ipcp_reqci,            /* Request peer's Configuration Information */\n    ipcp_up,            /* Called when fsm reaches OPENED state */\n    ipcp_down,            /* Called when fsm leaves OPENED state */\n    NULL,            /* Called when we want the lower layer up */\n    ipcp_finished,        /* Called when we want the lower layer down */\n    NULL,            /* Called when Protocol-Reject received */\n    NULL,            /* Retransmission is necessary */\n    NULL,            /* Called to handle protocol-specific codes */\n    \"IPCP\"            /* String name of protocol */\n};\n\n/*\n * Command-line options.\n */\n#if PPP_OPTIONS\nstatic int setvjslots (char **);\nstatic int setdnsaddr (char **);\nstatic int setwinsaddr (char **);\nstatic int setnetmask (char **);\nint setipaddr (char *, char **, int);\n\nstatic void printipaddr (option_t *, void (*)(void *, char *,...),void *);\n\nstatic option_t ipcp_option_list[] = {\n    { \"noip\", o_bool, &ipcp_protent.enabled_flag,\n      \"Disable IP and IPCP\" },\n    { \"-ip\", o_bool, &ipcp_protent.enabled_flag,\n      \"Disable IP and IPCP\", OPT_ALIAS },\n\n    { \"novj\", o_bool, &ipcp_wantoptions[0].neg_vj,\n      \"Disable VJ compression\", OPT_A2CLR, &ipcp_allowoptions[0].neg_vj },\n    { \"-vj\", o_bool, &ipcp_wantoptions[0].neg_vj,\n      \"Disable VJ compression\", OPT_ALIAS | OPT_A2CLR,\n      &ipcp_allowoptions[0].neg_vj },\n\n    { \"novjccomp\", o_bool, &ipcp_wantoptions[0].cflag,\n      \"Disable VJ connection-ID compression\", OPT_A2CLR,\n      &ipcp_allowoptions[0].cflag },\n    { \"-vjccomp\", o_bool, &ipcp_wantoptions[0].cflag,\n      \"Disable VJ connection-ID compression\", OPT_ALIAS | OPT_A2CLR,\n      &ipcp_allowoptions[0].cflag },\n\n    { \"vj-max-slots\", o_special, (void *)setvjslots,\n      \"Set maximum VJ header slots\",\n      OPT_PRIO | OPT_A2STRVAL | OPT_STATIC, vj_value },\n\n    { \"ipcp-accept-local\", o_bool, &ipcp_wantoptions[0].accept_local,\n      \"Accept peer's address for us\", 1 },\n    { \"ipcp-accept-remote\", o_bool, &ipcp_wantoptions[0].accept_remote,\n      \"Accept peer's address for it\", 1 },\n\n    { \"ipparam\", o_string, &ipparam,\n      \"Set ip script parameter\", OPT_PRIO },\n\n    { \"noipdefault\", o_bool, &disable_defaultip,\n      \"Don't use name for default IP adrs\", 1 },\n\n    { \"ms-dns\", 1, (void *)setdnsaddr,\n      \"DNS address for the peer's use\" },\n    { \"ms-wins\", 1, (void *)setwinsaddr,\n      \"Nameserver for SMB over TCP/IP for peer\" },\n\n    { \"ipcp-restart\", o_int, &ipcp_fsm[0].timeouttime,\n      \"Set timeout for IPCP\", OPT_PRIO },\n    { \"ipcp-max-terminate\", o_int, &ipcp_fsm[0].maxtermtransmits,\n      \"Set max #xmits for term-reqs\", OPT_PRIO },\n    { \"ipcp-max-configure\", o_int, &ipcp_fsm[0].maxconfreqtransmits,\n      \"Set max #xmits for conf-reqs\", OPT_PRIO },\n    { \"ipcp-max-failure\", o_int, &ipcp_fsm[0].maxnakloops,\n      \"Set max #conf-naks for IPCP\", OPT_PRIO },\n\n    { \"defaultroute\", o_bool, &ipcp_wantoptions[0].default_route,\n      \"Add default route\", OPT_ENABLE|1, &ipcp_allowoptions[0].default_route },\n    { \"nodefaultroute\", o_bool, &ipcp_allowoptions[0].default_route,\n      \"disable defaultroute option\", OPT_A2CLR,\n      &ipcp_wantoptions[0].default_route },\n    { \"-defaultroute\", o_bool, &ipcp_allowoptions[0].default_route,\n      \"disable defaultroute option\", OPT_ALIAS | OPT_A2CLR,\n      &ipcp_wantoptions[0].default_route },\n\n    { \"replacedefaultroute\", o_bool,\n                &ipcp_wantoptions[0].replace_default_route,\n      \"Replace default route\", 1\n    },\n    { \"noreplacedefaultroute\", o_bool,\n                &ipcp_allowoptions[0].replace_default_route,\n      \"Never replace default route\", OPT_A2COPY,\n                &ipcp_wantoptions[0].replace_default_route },\n    { \"proxyarp\", o_bool, &ipcp_wantoptions[0].proxy_arp,\n      \"Add proxy ARP entry\", OPT_ENABLE|1, &ipcp_allowoptions[0].proxy_arp },\n    { \"noproxyarp\", o_bool, &ipcp_allowoptions[0].proxy_arp,\n      \"disable proxyarp option\", OPT_A2CLR,\n      &ipcp_wantoptions[0].proxy_arp },\n    { \"-proxyarp\", o_bool, &ipcp_allowoptions[0].proxy_arp,\n      \"disable proxyarp option\", OPT_ALIAS | OPT_A2CLR,\n      &ipcp_wantoptions[0].proxy_arp },\n\n    { \"usepeerdns\", o_bool, &usepeerdns,\n      \"Ask peer for DNS address(es)\", 1 },\n\n    { \"netmask\", o_special, (void *)setnetmask,\n      \"set netmask\", OPT_PRIO | OPT_A2STRVAL | OPT_STATIC, netmask_str },\n\n    { \"ipcp-no-addresses\", o_bool, &ipcp_wantoptions[0].old_addrs,\n      \"Disable old-style IP-Addresses usage\", OPT_A2CLR,\n      &ipcp_allowoptions[0].old_addrs },\n    { \"ipcp-no-address\", o_bool, &ipcp_wantoptions[0].neg_addr,\n      \"Disable IP-Address usage\", OPT_A2CLR,\n      &ipcp_allowoptions[0].neg_addr },\n\n    { \"noremoteip\", o_bool, &noremoteip,\n      \"Allow peer to have no IP address\", 1 },\n\n    { \"nosendip\", o_bool, &ipcp_wantoptions[0].neg_addr,\n      \"Don't send our IP address to peer\", OPT_A2CLR,\n      &ipcp_wantoptions[0].old_addrs},\n\n    { \"IP addresses\", o_wild, (void *) &setipaddr,\n      \"set local and remote IP addresses\",\n      OPT_NOARG | OPT_A2PRINTER, (void *) &printipaddr },\n\n    { NULL }\n};\n#endif /* PPP_OPTIONS */\n\n/*\n * Protocol entry points from main code.\n */\nstatic void ipcp_init(ppp_pcb *pcb);\nstatic void ipcp_open(ppp_pcb *pcb);\nstatic void ipcp_close(ppp_pcb *pcb, const char *reason);\nstatic void ipcp_lowerup(ppp_pcb *pcb);\nstatic void ipcp_lowerdown(ppp_pcb *pcb);\nstatic void ipcp_input(ppp_pcb *pcb, u_char *p, int len);\nstatic void ipcp_protrej(ppp_pcb *pcb);\n#if PRINTPKT_SUPPORT\nstatic int ipcp_printpkt(const u_char *p, int plen,\n        void (*printer) (void *, const char *, ...), void *arg);\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_OPTIONS\nstatic void ip_check_options (void);\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\nstatic int  ip_demand_conf (int);\nstatic int  ip_active_pkt (u_char *, int);\n#endif /* DEMAND_SUPPORT */\n#if 0 /* UNUSED */\nstatic void create_resolv (u32_t, u32_t);\n#endif /* UNUSED */\n\nconst struct protent ipcp_protent = {\n    PPP_IPCP,\n    ipcp_init,\n    ipcp_input,\n    ipcp_protrej,\n    ipcp_lowerup,\n    ipcp_lowerdown,\n    ipcp_open,\n    ipcp_close,\n#if PRINTPKT_SUPPORT\n    ipcp_printpkt,\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_DATAINPUT\n    NULL,\n#endif /* PPP_DATAINPUT */\n#if PRINTPKT_SUPPORT\n    \"IPCP\",\n    \"IP\",\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_OPTIONS\n    ipcp_option_list,\n    ip_check_options,\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\n    ip_demand_conf,\n    ip_active_pkt\n#endif /* DEMAND_SUPPORT */\n};\n\nstatic void ipcp_clear_addrs(ppp_pcb *pcb, u32_t ouraddr, u32_t hisaddr, u8_t replacedefaultroute);\n\n/*\n * Lengths of configuration options.\n */\n#define CILEN_VOID    2\n#define CILEN_COMPRESS    4    /* min length for compression protocol opt. */\n#define CILEN_VJ    6    /* length for RFC1332 Van-Jacobson opt. */\n#define CILEN_ADDR    6    /* new-style single address option */\n#define CILEN_ADDRS    10    /* old-style dual address option */\n\n\n#define CODENAME(x)    ((x) == CONFACK ? \"ACK\" : \\\n             (x) == CONFNAK ? \"NAK\" : \"REJ\")\n\n#if 0 /* UNUSED, already defined by lwIP */\n/*\n * Make a string representation of a network IP address.\n */\nchar *\nip_ntoa(ipaddr)\nu32_t ipaddr;\n{\n    static char b[64];\n\n    slprintf(b, sizeof(b), \"%I\", ipaddr);\n    return b;\n}\n#endif /* UNUSED, already defined by lwIP */\n\n/*\n * Option parsing.\n */\n#if PPP_OPTIONS\n/*\n * setvjslots - set maximum number of connection slots for VJ compression\n */\nstatic int\nsetvjslots(argv)\n    char **argv;\n{\n    int value;\n\n    if (!int_option(*argv, &value))\n    return 0;\n\n    if (value < 2 || value > 16) {\n    option_error(\"vj-max-slots value must be between 2 and 16\");\n    return 0;\n    }\n    ipcp_wantoptions [0].maxslotindex =\n        ipcp_allowoptions[0].maxslotindex = value - 1;\n    slprintf(vj_value, sizeof(vj_value), \"%d\", value);\n    return 1;\n}\n\n/*\n * setdnsaddr - set the dns address(es)\n */\nstatic int\nsetdnsaddr(argv)\n    char **argv;\n{\n    u32_t dns;\n    struct hostent *hp;\n\n    dns = inet_addr(*argv);\n    if (dns == (u32_t) -1) {\n    if ((hp = gethostbyname(*argv)) == NULL) {\n        option_error(\"invalid address parameter '%s' for ms-dns option\",\n             *argv);\n        return 0;\n    }\n    dns = *(u32_t *)hp->h_addr;\n    }\n\n    /* We take the last 2 values given, the 2nd-last as the primary\n       and the last as the secondary.  If only one is given it\n       becomes both primary and secondary. */\n    if (ipcp_allowoptions[0].dnsaddr[1] == 0)\n    ipcp_allowoptions[0].dnsaddr[0] = dns;\n    else\n    ipcp_allowoptions[0].dnsaddr[0] = ipcp_allowoptions[0].dnsaddr[1];\n\n    /* always set the secondary address value. */\n    ipcp_allowoptions[0].dnsaddr[1] = dns;\n\n    return (1);\n}\n\n/*\n * setwinsaddr - set the wins address(es)\n * This is primrarly used with the Samba package under UNIX or for pointing\n * the caller to the existing WINS server on a Windows NT platform.\n */\nstatic int\nsetwinsaddr(argv)\n    char **argv;\n{\n    u32_t wins;\n    struct hostent *hp;\n\n    wins = inet_addr(*argv);\n    if (wins == (u32_t) -1) {\n    if ((hp = gethostbyname(*argv)) == NULL) {\n        option_error(\"invalid address parameter '%s' for ms-wins option\",\n             *argv);\n        return 0;\n    }\n    wins = *(u32_t *)hp->h_addr;\n    }\n\n    /* We take the last 2 values given, the 2nd-last as the primary\n       and the last as the secondary.  If only one is given it\n       becomes both primary and secondary. */\n    if (ipcp_allowoptions[0].winsaddr[1] == 0)\n    ipcp_allowoptions[0].winsaddr[0] = wins;\n    else\n    ipcp_allowoptions[0].winsaddr[0] = ipcp_allowoptions[0].winsaddr[1];\n\n    /* always set the secondary address value. */\n    ipcp_allowoptions[0].winsaddr[1] = wins;\n\n    return (1);\n}\n\n/*\n * setipaddr - Set the IP address\n * If doit is 0, the call is to check whether this option is\n * potentially an IP address specification.\n * Not static so that plugins can call it to set the addresses\n */\nint\nsetipaddr(arg, argv, doit)\n    char *arg;\n    char **argv;\n    int doit;\n{\n    struct hostent *hp;\n    char *colon;\n    u32_t local, remote;\n    ipcp_options *wo = &ipcp_wantoptions[0];\n    static int prio_local = 0, prio_remote = 0;\n\n    /*\n     * IP address pair separated by \":\".\n     */\n    if ((colon = strchr(arg, ':')) == NULL)\n    return 0;\n    if (!doit)\n    return 1;\n  \n    /*\n     * If colon first character, then no local addr.\n     */\n    if (colon != arg && option_priority >= prio_local) {\n    *colon = '\\0';\n    if ((local = inet_addr(arg)) == (u32_t) -1) {\n        if ((hp = gethostbyname(arg)) == NULL) {\n        option_error(\"unknown host: %s\", arg);\n        return 0;\n        }\n        local = *(u32_t *)hp->h_addr;\n    }\n    if (bad_ip_adrs(local)) {\n        option_error(\"bad local IP address %s\", ip_ntoa(local));\n        return 0;\n    }\n    if (local != 0)\n        wo->ouraddr = local;\n    *colon = ':';\n    prio_local = option_priority;\n    }\n  \n    /*\n     * If colon last character, then no remote addr.\n     */\n    if (*++colon != '\\0' && option_priority >= prio_remote) {\n    if ((remote = inet_addr(colon)) == (u32_t) -1) {\n        if ((hp = gethostbyname(colon)) == NULL) {\n        option_error(\"unknown host: %s\", colon);\n        return 0;\n        }\n        remote = *(u32_t *)hp->h_addr;\n        if (remote_name[0] == 0)\n        strlcpy(remote_name, colon, sizeof(remote_name));\n    }\n    if (bad_ip_adrs(remote)) {\n        option_error(\"bad remote IP address %s\", ip_ntoa(remote));\n        return 0;\n    }\n    if (remote != 0)\n        wo->hisaddr = remote;\n    prio_remote = option_priority;\n    }\n\n    return 1;\n}\n\nstatic void\nprintipaddr(opt, printer, arg)\n    option_t *opt;\n    void (*printer) (void *, char *, ...);\n    void *arg;\n{\n    ipcp_options *wo = &ipcp_wantoptions[0];\n\n    if (wo->ouraddr != 0)\n        printer(arg, \"%I\", wo->ouraddr);\n    printer(arg, \":\");\n    if (wo->hisaddr != 0)\n        printer(arg, \"%I\", wo->hisaddr);\n}\n\n/*\n * setnetmask - set the netmask to be used on the interface.\n */\nstatic int\nsetnetmask(argv)\n    char **argv;\n{\n    u32_t mask;\n    int n;\n    char *p;\n\n    /*\n     * Unfortunately, if we use inet_addr, we can't tell whether\n     * a result of all 1s is an error or a valid 255.255.255.255.\n     */\n    p = *argv;\n    n = parse_dotted_ip(p, &mask);\n\n    mask = lwip_htonl(mask);\n\n    if (n == 0 || p[n] != 0 || (netmask & ~mask) != 0) {\n    option_error(\"invalid netmask value '%s'\", *argv);\n    return 0;\n    }\n\n    netmask = mask;\n    slprintf(netmask_str, sizeof(netmask_str), \"%I\", mask);\n\n    return (1);\n}\n\nint\nparse_dotted_ip(p, vp)\n    char *p;\n    u32_t *vp;\n{\n    int n;\n    u32_t v, b;\n    char *endp, *p0 = p;\n\n    v = 0;\n    for (n = 3;; --n) {\n    b = strtoul(p, &endp, 0);\n    if (endp == p)\n        return 0;\n    if (b > 255) {\n        if (n < 3)\n        return 0;\n        /* accept e.g. 0xffffff00 */\n        *vp = b;\n        return endp - p0;\n    }\n    v |= b << (n * 8);\n    p = endp;\n    if (n == 0)\n        break;\n    if (*p != '.')\n        return 0;\n    ++p;\n    }\n    *vp = v;\n    return p - p0;\n}\n#endif /* PPP_OPTIONS */\n\n/*\n * ipcp_init - Initialize IPCP.\n */\nstatic void ipcp_init(ppp_pcb *pcb) {\n    fsm *f = &pcb->ipcp_fsm;\n\n    ipcp_options *wo = &pcb->ipcp_wantoptions;\n    ipcp_options *ao = &pcb->ipcp_allowoptions;\n\n    f->pcb = pcb;\n    f->protocol = PPP_IPCP;\n    f->callbacks = &ipcp_callbacks;\n    fsm_init(f);\n\n    /*\n     * Some 3G modems use repeated IPCP NAKs as a way of stalling\n     * until they can contact a server on the network, so we increase\n     * the default number of NAKs we accept before we start treating\n     * them as rejects.\n     */\n    f->maxnakloops = 100;\n\n#if 0 /* Not necessary, everything is cleared in ppp_new() */\n    memset(wo, 0, sizeof(*wo));\n    memset(ao, 0, sizeof(*ao));\n#endif /* 0 */\n\n    wo->neg_addr = wo->old_addrs = 1;\n#if VJ_SUPPORT\n    wo->neg_vj = 1;\n    wo->vj_protocol = IPCP_VJ_COMP;\n    wo->maxslotindex = MAX_STATES - 1; /* really max index */\n    wo->cflag = 1;\n#endif /* VJ_SUPPORT */\n\n#if 0 /* UNUSED */\n    /* wanting default route by default */\n    wo->default_route = 1;\n#endif /* UNUSED */\n\n    ao->neg_addr = ao->old_addrs = 1;\n#if VJ_SUPPORT\n    /* max slots and slot-id compression are currently hardwired in */\n    /* ppp_if.c to 16 and 1, this needs to be changed (among other */\n    /* things) gmc */\n\n    ao->neg_vj = 1;\n    ao->maxslotindex = MAX_STATES - 1;\n    ao->cflag = 1;\n#endif /* #if VJ_SUPPORT */\n\n#if 0 /* UNUSED */\n    /*\n     * XXX These control whether the user may use the proxyarp\n     * and defaultroute options.\n     */\n    ao->proxy_arp = 1;\n    ao->default_route = 1;\n#endif /* UNUSED */\n}\n\n\n/*\n * ipcp_open - IPCP is allowed to come up.\n */\nstatic void ipcp_open(ppp_pcb *pcb) {\n    fsm *f = &pcb->ipcp_fsm;\n    fsm_open(f);\n    pcb->ipcp_is_open = 1;\n}\n\n\n/*\n * ipcp_close - Take IPCP down.\n */\nstatic void ipcp_close(ppp_pcb *pcb, const char *reason) {\n    fsm *f = &pcb->ipcp_fsm;\n    fsm_close(f, reason);\n}\n\n\n/*\n * ipcp_lowerup - The lower layer is up.\n */\nstatic void ipcp_lowerup(ppp_pcb *pcb) {\n    fsm *f = &pcb->ipcp_fsm;\n    fsm_lowerup(f);\n}\n\n\n/*\n * ipcp_lowerdown - The lower layer is down.\n */\nstatic void ipcp_lowerdown(ppp_pcb *pcb) {\n    fsm *f = &pcb->ipcp_fsm;\n    fsm_lowerdown(f);\n}\n\n\n/*\n * ipcp_input - Input IPCP packet.\n */\nstatic void ipcp_input(ppp_pcb *pcb, u_char *p, int len) {\n    fsm *f = &pcb->ipcp_fsm;\n    fsm_input(f, p, len);\n}\n\n\n/*\n * ipcp_protrej - A Protocol-Reject was received for IPCP.\n *\n * Pretend the lower layer went down, so we shut up.\n */\nstatic void ipcp_protrej(ppp_pcb *pcb) {\n    fsm *f = &pcb->ipcp_fsm;\n    fsm_lowerdown(f);\n}\n\n\n/*\n * ipcp_resetci - Reset our CI.\n * Called by fsm_sconfreq, Send Configure Request.\n */\nstatic void ipcp_resetci(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    ipcp_options *wo = &pcb->ipcp_wantoptions;\n    ipcp_options *go = &pcb->ipcp_gotoptions;\n    ipcp_options *ao = &pcb->ipcp_allowoptions;\n\n    wo->req_addr = (wo->neg_addr || wo->old_addrs) &&\n    (ao->neg_addr || ao->old_addrs);\n    if (wo->ouraddr == 0)\n    wo->accept_local = 1;\n    if (wo->hisaddr == 0)\n    wo->accept_remote = 1;\n#if LWIP_DNS\n    wo->req_dns1 = wo->req_dns2 = pcb->settings.usepeerdns;    /* Request DNS addresses from the peer */\n#endif /* LWIP_DNS */\n    *go = *wo;\n    if (!pcb->ask_for_local)\n    go->ouraddr = 0;\n#if 0 /* UNUSED */\n    if (ip_choose_hook) {\n    ip_choose_hook(&wo->hisaddr);\n    if (wo->hisaddr) {\n        wo->accept_remote = 0;\n    }\n    }\n#endif /* UNUSED */\n    BZERO(&pcb->ipcp_hisoptions, sizeof(ipcp_options));\n}\n\n\n/*\n * ipcp_cilen - Return length of our CI.\n * Called by fsm_sconfreq, Send Configure Request.\n */\nstatic int ipcp_cilen(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    ipcp_options *go = &pcb->ipcp_gotoptions;\n#if VJ_SUPPORT\n    ipcp_options *wo = &pcb->ipcp_wantoptions;\n#endif /* VJ_SUPPORT */\n    ipcp_options *ho = &pcb->ipcp_hisoptions;\n\n#define LENCIADDRS(neg)        (neg ? CILEN_ADDRS : 0)\n#if VJ_SUPPORT\n#define LENCIVJ(neg, old)    (neg ? (old? CILEN_COMPRESS : CILEN_VJ) : 0)\n#endif /* VJ_SUPPORT */\n#define LENCIADDR(neg)        (neg ? CILEN_ADDR : 0)\n#if LWIP_DNS\n#define LENCIDNS(neg)        LENCIADDR(neg)\n#endif /* LWIP_DNS */\n#if 0 /* UNUSED - WINS */\n#define LENCIWINS(neg)        LENCIADDR(neg)\n#endif /* UNUSED - WINS */\n\n    /*\n     * First see if we want to change our options to the old\n     * forms because we have received old forms from the peer.\n     */\n    if (go->neg_addr && go->old_addrs && !ho->neg_addr && ho->old_addrs)\n    go->neg_addr = 0;\n\n#if VJ_SUPPORT\n    if (wo->neg_vj && !go->neg_vj && !go->old_vj) {\n    /* try an older style of VJ negotiation */\n    /* use the old style only if the peer did */\n    if (ho->neg_vj && ho->old_vj) {\n        go->neg_vj = 1;\n        go->old_vj = 1;\n        go->vj_protocol = ho->vj_protocol;\n    }\n    }\n#endif /* VJ_SUPPORT */\n\n    return (LENCIADDRS(!go->neg_addr && go->old_addrs) +\n#if VJ_SUPPORT\n        LENCIVJ(go->neg_vj, go->old_vj) +\n#endif /* VJ_SUPPORT */\n        LENCIADDR(go->neg_addr) +\n#if LWIP_DNS\n        LENCIDNS(go->req_dns1) +\n        LENCIDNS(go->req_dns2) +\n#endif /* LWIP_DNS */\n#if 0 /* UNUSED - WINS */\n        LENCIWINS(go->winsaddr[0]) +\n        LENCIWINS(go->winsaddr[1]) +\n#endif /* UNUSED - WINS */\n        0);\n}\n\n\n/*\n * ipcp_addci - Add our desired CIs to a packet.\n * Called by fsm_sconfreq, Send Configure Request.\n */\nstatic void ipcp_addci(fsm *f, u_char *ucp, int *lenp) {\n    ppp_pcb *pcb = f->pcb;\n    ipcp_options *go = &pcb->ipcp_gotoptions;\n    int len = *lenp;\n\n#define ADDCIADDRS(opt, neg, val1, val2) \\\n    if (neg) { \\\n    if (len >= CILEN_ADDRS) { \\\n        u32_t l; \\\n        PUTCHAR(opt, ucp); \\\n        PUTCHAR(CILEN_ADDRS, ucp); \\\n        l = lwip_ntohl(val1); \\\n        PUTLONG(l, ucp); \\\n        l = lwip_ntohl(val2); \\\n        PUTLONG(l, ucp); \\\n        len -= CILEN_ADDRS; \\\n    } else \\\n        go->old_addrs = 0; \\\n    }\n\n#if VJ_SUPPORT\n#define ADDCIVJ(opt, neg, val, old, maxslotindex, cflag) \\\n    if (neg) { \\\n    int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \\\n    if (len >= vjlen) { \\\n        PUTCHAR(opt, ucp); \\\n        PUTCHAR(vjlen, ucp); \\\n        PUTSHORT(val, ucp); \\\n        if (!old) { \\\n        PUTCHAR(maxslotindex, ucp); \\\n        PUTCHAR(cflag, ucp); \\\n        } \\\n        len -= vjlen; \\\n    } else \\\n        neg = 0; \\\n    }\n#endif /* VJ_SUPPORT */\n\n#define ADDCIADDR(opt, neg, val) \\\n    if (neg) { \\\n    if (len >= CILEN_ADDR) { \\\n        u32_t l; \\\n        PUTCHAR(opt, ucp); \\\n        PUTCHAR(CILEN_ADDR, ucp); \\\n        l = lwip_ntohl(val); \\\n        PUTLONG(l, ucp); \\\n        len -= CILEN_ADDR; \\\n    } else \\\n        neg = 0; \\\n    }\n\n#if LWIP_DNS\n#define ADDCIDNS(opt, neg, addr) \\\n    if (neg) { \\\n    if (len >= CILEN_ADDR) { \\\n        u32_t l; \\\n        PUTCHAR(opt, ucp); \\\n        PUTCHAR(CILEN_ADDR, ucp); \\\n        l = lwip_ntohl(addr); \\\n        PUTLONG(l, ucp); \\\n        len -= CILEN_ADDR; \\\n    } else \\\n        neg = 0; \\\n    }\n#endif /* LWIP_DNS */\n\n#if 0 /* UNUSED - WINS */\n#define ADDCIWINS(opt, addr) \\\n    if (addr) { \\\n    if (len >= CILEN_ADDR) { \\\n        u32_t l; \\\n        PUTCHAR(opt, ucp); \\\n        PUTCHAR(CILEN_ADDR, ucp); \\\n        l = lwip_ntohl(addr); \\\n        PUTLONG(l, ucp); \\\n        len -= CILEN_ADDR; \\\n    } else \\\n        addr = 0; \\\n    }\n#endif /* UNUSED - WINS */\n\n    ADDCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, go->ouraddr,\n           go->hisaddr);\n\n#if VJ_SUPPORT\n    ADDCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,\n        go->maxslotindex, go->cflag);\n#endif /* VJ_SUPPORT */\n\n    ADDCIADDR(CI_ADDR, go->neg_addr, go->ouraddr);\n\n#if LWIP_DNS\n    ADDCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);\n\n    ADDCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);\n#endif /* LWIP_DNS */\n\n#if 0 /* UNUSED - WINS */\n    ADDCIWINS(CI_MS_WINS1, go->winsaddr[0]);\n\n    ADDCIWINS(CI_MS_WINS2, go->winsaddr[1]);\n#endif /* UNUSED - WINS */\n    \n    *lenp -= len;\n}\n\n\n/*\n * ipcp_ackci - Ack our CIs.\n * Called by fsm_rconfack, Receive Configure ACK.\n *\n * Returns:\n *    0 - Ack was bad.\n *    1 - Ack was good.\n */\nstatic int ipcp_ackci(fsm *f, u_char *p, int len) {\n    ppp_pcb *pcb = f->pcb;\n    ipcp_options *go = &pcb->ipcp_gotoptions;\n    u_short cilen, citype;\n    u32_t cilong;\n#if VJ_SUPPORT\n    u_short cishort;\n    u_char cimaxslotindex, cicflag;\n#endif /* VJ_SUPPORT */\n\n    /*\n     * CIs must be in exactly the same order that we sent...\n     * Check packet length and CI length at each step.\n     * If we find any deviations, then this packet is bad.\n     */\n\n#define ACKCIADDRS(opt, neg, val1, val2) \\\n    if (neg) { \\\n    u32_t l; \\\n    if ((len -= CILEN_ADDRS) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_ADDRS || \\\n        citype != opt) \\\n        goto bad; \\\n    GETLONG(l, p); \\\n    cilong = lwip_htonl(l); \\\n    if (val1 != cilong) \\\n        goto bad; \\\n    GETLONG(l, p); \\\n    cilong = lwip_htonl(l); \\\n    if (val2 != cilong) \\\n        goto bad; \\\n    }\n\n#if VJ_SUPPORT\n#define ACKCIVJ(opt, neg, val, old, maxslotindex, cflag) \\\n    if (neg) { \\\n    int vjlen = old? CILEN_COMPRESS : CILEN_VJ; \\\n    if ((len -= vjlen) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != vjlen || \\\n        citype != opt)  \\\n        goto bad; \\\n    GETSHORT(cishort, p); \\\n    if (cishort != val) \\\n        goto bad; \\\n    if (!old) { \\\n        GETCHAR(cimaxslotindex, p); \\\n        if (cimaxslotindex != maxslotindex) \\\n        goto bad; \\\n        GETCHAR(cicflag, p); \\\n        if (cicflag != cflag) \\\n        goto bad; \\\n    } \\\n    }\n#endif /* VJ_SUPPORT */\n\n#define ACKCIADDR(opt, neg, val) \\\n    if (neg) { \\\n    u32_t l; \\\n    if ((len -= CILEN_ADDR) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_ADDR || \\\n        citype != opt) \\\n        goto bad; \\\n    GETLONG(l, p); \\\n    cilong = lwip_htonl(l); \\\n    if (val != cilong) \\\n        goto bad; \\\n    }\n\n#if LWIP_DNS\n#define ACKCIDNS(opt, neg, addr) \\\n    if (neg) { \\\n    u32_t l; \\\n    if ((len -= CILEN_ADDR) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_ADDR || citype != opt) \\\n        goto bad; \\\n    GETLONG(l, p); \\\n    cilong = lwip_htonl(l); \\\n    if (addr != cilong) \\\n        goto bad; \\\n    }\n#endif /* LWIP_DNS */\n\n#if 0 /* UNUSED - WINS */\n#define ACKCIWINS(opt, addr) \\\n    if (addr) { \\\n    u32_t l; \\\n    if ((len -= CILEN_ADDR) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_ADDR || citype != opt) \\\n        goto bad; \\\n    GETLONG(l, p); \\\n    cilong = lwip_htonl(l); \\\n    if (addr != cilong) \\\n        goto bad; \\\n    }\n#endif /* UNUSED - WINS */\n\n    ACKCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs, go->ouraddr,\n           go->hisaddr);\n\n#if VJ_SUPPORT\n    ACKCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol, go->old_vj,\n        go->maxslotindex, go->cflag);\n#endif /* VJ_SUPPORT */\n\n    ACKCIADDR(CI_ADDR, go->neg_addr, go->ouraddr);\n\n#if LWIP_DNS\n    ACKCIDNS(CI_MS_DNS1, go->req_dns1, go->dnsaddr[0]);\n\n    ACKCIDNS(CI_MS_DNS2, go->req_dns2, go->dnsaddr[1]);\n#endif /* LWIP_DNS */\n\n#if 0 /* UNUSED - WINS */\n    ACKCIWINS(CI_MS_WINS1, go->winsaddr[0]);\n\n    ACKCIWINS(CI_MS_WINS2, go->winsaddr[1]);\n#endif /* UNUSED - WINS */\n\n    /*\n     * If there are any remaining CIs, then this packet is bad.\n     */\n    if (len != 0)\n    goto bad;\n    return (1);\n\nbad:\n    IPCPDEBUG((\"ipcp_ackci: received bad Ack!\"));\n    return (0);\n}\n\n/*\n * ipcp_nakci - Peer has sent a NAK for some of our CIs.\n * This should not modify any state if the Nak is bad\n * or if IPCP is in the OPENED state.\n * Calback from fsm_rconfnakrej - Receive Configure-Nak or Configure-Reject.\n *\n * Returns:\n *    0 - Nak was bad.\n *    1 - Nak was good.\n */\nstatic int ipcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) {\n    ppp_pcb *pcb = f->pcb;\n    ipcp_options *go = &pcb->ipcp_gotoptions;\n    u_char citype, cilen, *next;\n#if VJ_SUPPORT\n    u_char cimaxslotindex, cicflag;\n    u_short cishort;\n#endif /* VJ_SUPPORT */\n    u32_t ciaddr1, ciaddr2, l;\n#if LWIP_DNS\n    u32_t cidnsaddr;\n#endif /* LWIP_DNS */\n    ipcp_options no;        /* options we've seen Naks for */\n    ipcp_options try_;        /* options to request next time */\n\n    BZERO(&no, sizeof(no));\n    try_ = *go;\n\n    /*\n     * Any Nak'd CIs must be in exactly the same order that we sent.\n     * Check packet length and CI length at each step.\n     * If we find any deviations, then this packet is bad.\n     */\n#define NAKCIADDRS(opt, neg, code) \\\n    if ((neg) && \\\n    (cilen = p[1]) == CILEN_ADDRS && \\\n    len >= cilen && \\\n    p[0] == opt) { \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    GETLONG(l, p); \\\n    ciaddr1 = lwip_htonl(l); \\\n    GETLONG(l, p); \\\n    ciaddr2 = lwip_htonl(l); \\\n    no.old_addrs = 1; \\\n    code \\\n    }\n\n#if VJ_SUPPORT\n#define NAKCIVJ(opt, neg, code) \\\n    if (go->neg && \\\n    ((cilen = p[1]) == CILEN_COMPRESS || cilen == CILEN_VJ) && \\\n    len >= cilen && \\\n    p[0] == opt) { \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    no.neg = 1; \\\n        code \\\n    }\n#endif /* VJ_SUPPORT */\n\n#define NAKCIADDR(opt, neg, code) \\\n    if (go->neg && \\\n    (cilen = p[1]) == CILEN_ADDR && \\\n    len >= cilen && \\\n    p[0] == opt) { \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    GETLONG(l, p); \\\n    ciaddr1 = lwip_htonl(l); \\\n    no.neg = 1; \\\n    code \\\n    }\n\n#if LWIP_DNS\n#define NAKCIDNS(opt, neg, code) \\\n    if (go->neg && \\\n    ((cilen = p[1]) == CILEN_ADDR) && \\\n    len >= cilen && \\\n    p[0] == opt) { \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    GETLONG(l, p); \\\n    cidnsaddr = lwip_htonl(l); \\\n    no.neg = 1; \\\n    code \\\n    }\n#endif /* LWIP_DNS */\n\n    /*\n     * Accept the peer's idea of {our,his} address, if different\n     * from our idea, only if the accept_{local,remote} flag is set.\n     */\n    NAKCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs,\n           if (treat_as_reject) {\n           try_.old_addrs = 0;\n           } else {\n           if (go->accept_local && ciaddr1) {\n               /* take his idea of our address */\n               try_.ouraddr = ciaddr1;\n           }\n           if (go->accept_remote && ciaddr2) {\n               /* take his idea of his address */\n               try_.hisaddr = ciaddr2;\n           }\n           }\n    );\n\n#if VJ_SUPPORT\n    /*\n     * Accept the peer's value of maxslotindex provided that it\n     * is less than what we asked for.  Turn off slot-ID compression\n     * if the peer wants.  Send old-style compress-type option if\n     * the peer wants.\n     */\n    NAKCIVJ(CI_COMPRESSTYPE, neg_vj,\n        if (treat_as_reject) {\n        try_.neg_vj = 0;\n        } else if (cilen == CILEN_VJ) {\n        GETCHAR(cimaxslotindex, p);\n        GETCHAR(cicflag, p);\n        if (cishort == IPCP_VJ_COMP) {\n            try_.old_vj = 0;\n            if (cimaxslotindex < go->maxslotindex)\n            try_.maxslotindex = cimaxslotindex;\n            if (!cicflag)\n            try_.cflag = 0;\n        } else {\n            try_.neg_vj = 0;\n        }\n        } else {\n        if (cishort == IPCP_VJ_COMP || cishort == IPCP_VJ_COMP_OLD) {\n            try_.old_vj = 1;\n            try_.vj_protocol = cishort;\n        } else {\n            try_.neg_vj = 0;\n        }\n        }\n        );\n#endif /* VJ_SUPPORT */\n\n    NAKCIADDR(CI_ADDR, neg_addr,\n          if (treat_as_reject) {\n          try_.neg_addr = 0;\n          try_.old_addrs = 0;\n          } else if (go->accept_local && ciaddr1) {\n          /* take his idea of our address */\n          try_.ouraddr = ciaddr1;\n          }\n          );\n\n#if LWIP_DNS\n    NAKCIDNS(CI_MS_DNS1, req_dns1,\n         if (treat_as_reject) {\n         try_.req_dns1 = 0;\n         } else {\n         try_.dnsaddr[0] = cidnsaddr;\n         }\n         );\n\n    NAKCIDNS(CI_MS_DNS2, req_dns2,\n         if (treat_as_reject) {\n         try_.req_dns2 = 0;\n         } else {\n         try_.dnsaddr[1] = cidnsaddr;\n         }\n         );\n#endif /* #if LWIP_DNS */\n\n    /*\n     * There may be remaining CIs, if the peer is requesting negotiation\n     * on an option that we didn't include in our request packet.\n     * If they want to negotiate about IP addresses, we comply.\n     * If they want us to ask for compression, we refuse.\n     * If they want us to ask for ms-dns, we do that, since some\n     * peers get huffy if we don't.\n     */\n    while (len >= CILEN_VOID) {\n    GETCHAR(citype, p);\n    GETCHAR(cilen, p);\n    if ( cilen < CILEN_VOID || (len -= cilen) < 0 )\n        goto bad;\n    next = p + cilen - 2;\n\n    switch (citype) {\n#if VJ_SUPPORT\n    case CI_COMPRESSTYPE:\n        if (go->neg_vj || no.neg_vj ||\n        (cilen != CILEN_VJ && cilen != CILEN_COMPRESS))\n        goto bad;\n        no.neg_vj = 1;\n        break;\n#endif /* VJ_SUPPORT */\n    case CI_ADDRS:\n        if ((!go->neg_addr && go->old_addrs) || no.old_addrs\n        || cilen != CILEN_ADDRS)\n        goto bad;\n        try_.neg_addr = 0;\n        GETLONG(l, p);\n        ciaddr1 = lwip_htonl(l);\n        if (ciaddr1 && go->accept_local)\n        try_.ouraddr = ciaddr1;\n        GETLONG(l, p);\n        ciaddr2 = lwip_htonl(l);\n        if (ciaddr2 && go->accept_remote)\n        try_.hisaddr = ciaddr2;\n        no.old_addrs = 1;\n        break;\n    case CI_ADDR:\n        if (go->neg_addr || no.neg_addr || cilen != CILEN_ADDR)\n        goto bad;\n        try_.old_addrs = 0;\n        GETLONG(l, p);\n        ciaddr1 = lwip_htonl(l);\n        if (ciaddr1 && go->accept_local)\n        try_.ouraddr = ciaddr1;\n        if (try_.ouraddr != 0)\n        try_.neg_addr = 1;\n        no.neg_addr = 1;\n        break;\n#if LWIP_DNS\n    case CI_MS_DNS1:\n        if (go->req_dns1 || no.req_dns1 || cilen != CILEN_ADDR)\n        goto bad;\n        GETLONG(l, p);\n        try_.dnsaddr[0] = lwip_htonl(l);\n        try_.req_dns1 = 1;\n        no.req_dns1 = 1;\n        break;\n    case CI_MS_DNS2:\n        if (go->req_dns2 || no.req_dns2 || cilen != CILEN_ADDR)\n        goto bad;\n        GETLONG(l, p);\n        try_.dnsaddr[1] = lwip_htonl(l);\n        try_.req_dns2 = 1;\n        no.req_dns2 = 1;\n        break;\n#endif /* LWIP_DNS */\n#if 0 /* UNUSED - WINS */\n    case CI_MS_WINS1:\n    case CI_MS_WINS2:\n        if (cilen != CILEN_ADDR)\n        goto bad;\n        GETLONG(l, p);\n        ciaddr1 = lwip_htonl(l);\n        if (ciaddr1)\n        try_.winsaddr[citype == CI_MS_WINS2] = ciaddr1;\n        break;\n#endif /* UNUSED - WINS */\n    default:\n        break;\n    }\n    p = next;\n    }\n\n    /*\n     * OK, the Nak is good.  Now we can update state.\n     * If there are any remaining options, we ignore them.\n     */\n    if (f->state != PPP_FSM_OPENED)\n    *go = try_;\n\n    return 1;\n\nbad:\n    IPCPDEBUG((\"ipcp_nakci: received bad Nak!\"));\n    return 0;\n}\n\n\n/*\n * ipcp_rejci - Reject some of our CIs.\n * Callback from fsm_rconfnakrej.\n */\nstatic int ipcp_rejci(fsm *f, u_char *p, int len) {\n    ppp_pcb *pcb = f->pcb;\n    ipcp_options *go = &pcb->ipcp_gotoptions;\n    u_char cilen;\n#if VJ_SUPPORT\n    u_char cimaxslotindex, ciflag;\n    u_short cishort;\n#endif /* VJ_SUPPORT */\n    u32_t cilong;\n    ipcp_options try_;        /* options to request next time */\n\n    try_ = *go;\n    /*\n     * Any Rejected CIs must be in exactly the same order that we sent.\n     * Check packet length and CI length at each step.\n     * If we find any deviations, then this packet is bad.\n     */\n#define REJCIADDRS(opt, neg, val1, val2) \\\n    if ((neg) && \\\n    (cilen = p[1]) == CILEN_ADDRS && \\\n    len >= cilen && \\\n    p[0] == opt) { \\\n    u32_t l; \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    GETLONG(l, p); \\\n    cilong = lwip_htonl(l); \\\n    /* Check rejected value. */ \\\n    if (cilong != val1) \\\n        goto bad; \\\n    GETLONG(l, p); \\\n    cilong = lwip_htonl(l); \\\n    /* Check rejected value. */ \\\n    if (cilong != val2) \\\n        goto bad; \\\n    try_.old_addrs = 0; \\\n    }\n\n#if VJ_SUPPORT\n#define REJCIVJ(opt, neg, val, old, maxslot, cflag) \\\n    if (go->neg && \\\n    p[1] == (old? CILEN_COMPRESS : CILEN_VJ) && \\\n    len >= p[1] && \\\n    p[0] == opt) { \\\n    len -= p[1]; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    /* Check rejected value. */  \\\n    if (cishort != val) \\\n        goto bad; \\\n    if (!old) { \\\n       GETCHAR(cimaxslotindex, p); \\\n       if (cimaxslotindex != maxslot) \\\n         goto bad; \\\n       GETCHAR(ciflag, p); \\\n       if (ciflag != cflag) \\\n         goto bad; \\\n        } \\\n    try_.neg = 0; \\\n     }\n#endif /* VJ_SUPPORT */\n\n#define REJCIADDR(opt, neg, val) \\\n    if (go->neg && \\\n    (cilen = p[1]) == CILEN_ADDR && \\\n    len >= cilen && \\\n    p[0] == opt) { \\\n    u32_t l; \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    GETLONG(l, p); \\\n    cilong = lwip_htonl(l); \\\n    /* Check rejected value. */ \\\n    if (cilong != val) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    }\n\n#if LWIP_DNS\n#define REJCIDNS(opt, neg, dnsaddr) \\\n    if (go->neg && \\\n    ((cilen = p[1]) == CILEN_ADDR) && \\\n    len >= cilen && \\\n    p[0] == opt) { \\\n    u32_t l; \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    GETLONG(l, p); \\\n    cilong = lwip_htonl(l); \\\n    /* Check rejected value. */ \\\n    if (cilong != dnsaddr) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    }\n#endif /* LWIP_DNS */\n\n#if 0 /* UNUSED - WINS */\n#define REJCIWINS(opt, addr) \\\n    if (addr && \\\n    ((cilen = p[1]) == CILEN_ADDR) && \\\n    len >= cilen && \\\n    p[0] == opt) { \\\n    u32_t l; \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    GETLONG(l, p); \\\n    cilong = lwip_htonl(l); \\\n    /* Check rejected value. */ \\\n    if (cilong != addr) \\\n        goto bad; \\\n    try_.winsaddr[opt == CI_MS_WINS2] = 0; \\\n    }\n#endif /* UNUSED - WINS */\n\n    REJCIADDRS(CI_ADDRS, !go->neg_addr && go->old_addrs,\n           go->ouraddr, go->hisaddr);\n\n#if VJ_SUPPORT\n    REJCIVJ(CI_COMPRESSTYPE, neg_vj, go->vj_protocol, go->old_vj,\n        go->maxslotindex, go->cflag);\n#endif /* VJ_SUPPORT */\n\n    REJCIADDR(CI_ADDR, neg_addr, go->ouraddr);\n\n#if LWIP_DNS\n    REJCIDNS(CI_MS_DNS1, req_dns1, go->dnsaddr[0]);\n\n    REJCIDNS(CI_MS_DNS2, req_dns2, go->dnsaddr[1]);\n#endif /* LWIP_DNS */\n\n#if 0 /* UNUSED - WINS */\n    REJCIWINS(CI_MS_WINS1, go->winsaddr[0]);\n\n    REJCIWINS(CI_MS_WINS2, go->winsaddr[1]);\n#endif /* UNUSED - WINS */\n\n    /*\n     * If there are any remaining CIs, then this packet is bad.\n     */\n    if (len != 0)\n    goto bad;\n    /*\n     * Now we can update state.\n     */\n    if (f->state != PPP_FSM_OPENED)\n    *go = try_;\n    return 1;\n\nbad:\n    IPCPDEBUG((\"ipcp_rejci: received bad Reject!\"));\n    return 0;\n}\n\n\n/*\n * ipcp_reqci - Check the peer's requested CIs and send appropriate response.\n * Callback from fsm_rconfreq, Receive Configure Request\n *\n * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified\n * appropriately.  If reject_if_disagree is non-zero, doesn't return\n * CONFNAK; returns CONFREJ if it can't return CONFACK.\n *\n * inp = Requested CIs\n * len = Length of requested CIs\n */\nstatic int ipcp_reqci(fsm *f, u_char *inp, int *len, int reject_if_disagree) {\n    ppp_pcb *pcb = f->pcb;\n    ipcp_options *wo = &pcb->ipcp_wantoptions;\n    ipcp_options *ho = &pcb->ipcp_hisoptions;\n    ipcp_options *ao = &pcb->ipcp_allowoptions;\n    u_char *cip, *next;        /* Pointer to current and next CIs */\n    u_short cilen, citype;    /* Parsed len, type */\n#if VJ_SUPPORT\n    u_short cishort;        /* Parsed short value */\n#endif /* VJ_SUPPORT */\n    u32_t tl, ciaddr1, ciaddr2;/* Parsed address values */\n    int rc = CONFACK;        /* Final packet return code */\n    int orc;            /* Individual option return code */\n    u_char *p;            /* Pointer to next char to parse */\n    u_char *ucp = inp;        /* Pointer to current output char */\n    int l = *len;        /* Length left */\n#if VJ_SUPPORT\n    u_char maxslotindex, cflag;\n#endif /* VJ_SUPPORT */\n#if LWIP_DNS\n    int d;\n#endif /* LWIP_DNS */\n\n    /*\n     * Reset all his options.\n     */\n    BZERO(ho, sizeof(*ho));\n    \n    /*\n     * Process all his options.\n     */\n    next = inp;\n    while (l) {\n    orc = CONFACK;            /* Assume success */\n    cip = p = next;            /* Remember begining of CI */\n    if (l < 2 ||            /* Not enough data for CI header or */\n        p[1] < 2 ||            /*  CI length too small or */\n        p[1] > l) {            /*  CI length too big? */\n        IPCPDEBUG((\"ipcp_reqci: bad CI length!\"));\n        orc = CONFREJ;        /* Reject bad CI */\n        cilen = l;            /* Reject till end of packet */\n        l = 0;            /* Don't loop again */\n        goto endswitch;\n    }\n    GETCHAR(citype, p);        /* Parse CI type */\n    GETCHAR(cilen, p);        /* Parse CI length */\n    l -= cilen;            /* Adjust remaining length */\n    next += cilen;            /* Step to next CI */\n\n    switch (citype) {        /* Check CI type */\n    case CI_ADDRS:\n        if (!ao->old_addrs || ho->neg_addr ||\n        cilen != CILEN_ADDRS) {    /* Check CI length */\n        orc = CONFREJ;        /* Reject CI */\n        break;\n        }\n\n        /*\n         * If he has no address, or if we both have his address but\n         * disagree about it, then NAK it with our idea.\n         * In particular, if we don't know his address, but he does,\n         * then accept it.\n         */\n        GETLONG(tl, p);        /* Parse source address (his) */\n        ciaddr1 = lwip_htonl(tl);\n        if (ciaddr1 != wo->hisaddr\n        && (ciaddr1 == 0 || !wo->accept_remote)) {\n        orc = CONFNAK;\n        if (!reject_if_disagree) {\n            DECPTR(sizeof(u32_t), p);\n            tl = lwip_ntohl(wo->hisaddr);\n            PUTLONG(tl, p);\n        }\n        } else if (ciaddr1 == 0 && wo->hisaddr == 0) {\n        /*\n         * If neither we nor he knows his address, reject the option.\n         */\n        orc = CONFREJ;\n        wo->req_addr = 0;    /* don't NAK with 0.0.0.0 later */\n        break;\n        }\n\n        /*\n         * If he doesn't know our address, or if we both have our address\n         * but disagree about it, then NAK it with our idea.\n         */\n        GETLONG(tl, p);        /* Parse desination address (ours) */\n        ciaddr2 = lwip_htonl(tl);\n        if (ciaddr2 != wo->ouraddr) {\n        if (ciaddr2 == 0 || !wo->accept_local) {\n            orc = CONFNAK;\n            if (!reject_if_disagree) {\n            DECPTR(sizeof(u32_t), p);\n            tl = lwip_ntohl(wo->ouraddr);\n            PUTLONG(tl, p);\n            }\n        } else {\n            wo->ouraddr = ciaddr2;    /* accept peer's idea */\n        }\n        }\n\n        ho->old_addrs = 1;\n        ho->hisaddr = ciaddr1;\n        ho->ouraddr = ciaddr2;\n        break;\n\n    case CI_ADDR:\n        if (!ao->neg_addr || ho->old_addrs ||\n        cilen != CILEN_ADDR) {    /* Check CI length */\n        orc = CONFREJ;        /* Reject CI */\n        break;\n        }\n\n        /*\n         * If he has no address, or if we both have his address but\n         * disagree about it, then NAK it with our idea.\n         * In particular, if we don't know his address, but he does,\n         * then accept it.\n         */\n        GETLONG(tl, p);    /* Parse source address (his) */\n        ciaddr1 = lwip_htonl(tl);\n        if (ciaddr1 != wo->hisaddr\n        && (ciaddr1 == 0 || !wo->accept_remote)) {\n        orc = CONFNAK;\n        if (!reject_if_disagree) {\n            DECPTR(sizeof(u32_t), p);\n            tl = lwip_ntohl(wo->hisaddr);\n            PUTLONG(tl, p);\n        }\n        } else if (ciaddr1 == 0 && wo->hisaddr == 0) {\n        /*\n         * Don't ACK an address of 0.0.0.0 - reject it instead.\n         */\n        orc = CONFREJ;\n        wo->req_addr = 0;    /* don't NAK with 0.0.0.0 later */\n        break;\n        }\n    \n        ho->neg_addr = 1;\n        ho->hisaddr = ciaddr1;\n        break;\n\n#if LWIP_DNS\n    case CI_MS_DNS1:\n    case CI_MS_DNS2:\n        /* Microsoft primary or secondary DNS request */\n        d = citype == CI_MS_DNS2;\n\n        /* If we do not have a DNS address then we cannot send it */\n        if (ao->dnsaddr[d] == 0 ||\n        cilen != CILEN_ADDR) {    /* Check CI length */\n        orc = CONFREJ;        /* Reject CI */\n        break;\n        }\n        GETLONG(tl, p);\n        if (lwip_htonl(tl) != ao->dnsaddr[d]) {\n                DECPTR(sizeof(u32_t), p);\n        tl = lwip_ntohl(ao->dnsaddr[d]);\n        PUTLONG(tl, p);\n        orc = CONFNAK;\n            }\n            break;\n#endif /* LWIP_DNS */\n\n#if 0 /* UNUSED - WINS */\n    case CI_MS_WINS1:\n    case CI_MS_WINS2:\n        /* Microsoft primary or secondary WINS request */\n        d = citype == CI_MS_WINS2;\n\n        /* If we do not have a DNS address then we cannot send it */\n        if (ao->winsaddr[d] == 0 ||\n        cilen != CILEN_ADDR) {    /* Check CI length */\n        orc = CONFREJ;        /* Reject CI */\n        break;\n        }\n        GETLONG(tl, p);\n        if (lwip_htonl(tl) != ao->winsaddr[d]) {\n                DECPTR(sizeof(u32_t), p);\n        tl = lwip_ntohl(ao->winsaddr[d]);\n        PUTLONG(tl, p);\n        orc = CONFNAK;\n            }\n            break;\n#endif /* UNUSED - WINS */\n\n#if VJ_SUPPORT\n    case CI_COMPRESSTYPE:\n        if (!ao->neg_vj ||\n        (cilen != CILEN_VJ && cilen != CILEN_COMPRESS)) {\n        orc = CONFREJ;\n        break;\n        }\n        GETSHORT(cishort, p);\n\n        if (!(cishort == IPCP_VJ_COMP ||\n          (cishort == IPCP_VJ_COMP_OLD && cilen == CILEN_COMPRESS))) {\n        orc = CONFREJ;\n        break;\n        }\n\n        ho->neg_vj = 1;\n        ho->vj_protocol = cishort;\n        if (cilen == CILEN_VJ) {\n        GETCHAR(maxslotindex, p);\n        if (maxslotindex > ao->maxslotindex) { \n            orc = CONFNAK;\n            if (!reject_if_disagree){\n            DECPTR(1, p);\n            PUTCHAR(ao->maxslotindex, p);\n            }\n        }\n        GETCHAR(cflag, p);\n        if (cflag && !ao->cflag) {\n            orc = CONFNAK;\n            if (!reject_if_disagree){\n            DECPTR(1, p);\n            PUTCHAR(wo->cflag, p);\n            }\n        }\n        ho->maxslotindex = maxslotindex;\n        ho->cflag = cflag;\n        } else {\n        ho->old_vj = 1;\n        ho->maxslotindex = MAX_STATES - 1;\n        ho->cflag = 1;\n        }\n        break;\n#endif /* VJ_SUPPORT */\n\n    default:\n        orc = CONFREJ;\n        break;\n    }\nendswitch:\n    if (orc == CONFACK &&        /* Good CI */\n        rc != CONFACK)        /*  but prior CI wasnt? */\n        continue;            /* Don't send this one */\n\n    if (orc == CONFNAK) {        /* Nak this CI? */\n        if (reject_if_disagree)    /* Getting fed up with sending NAKs? */\n        orc = CONFREJ;        /* Get tough if so */\n        else {\n        if (rc == CONFREJ)    /* Rejecting prior CI? */\n            continue;        /* Don't send this one */\n        if (rc == CONFACK) {    /* Ack'd all prior CIs? */\n            rc = CONFNAK;    /* Not anymore... */\n            ucp = inp;        /* Backup */\n        }\n        }\n    }\n\n    if (orc == CONFREJ &&        /* Reject this CI */\n        rc != CONFREJ) {        /*  but no prior ones? */\n        rc = CONFREJ;\n        ucp = inp;            /* Backup */\n    }\n\n    /* Need to move CI? */\n    if (ucp != cip)\n        MEMCPY(ucp, cip, cilen);    /* Move it */\n\n    /* Update output pointer */\n    INCPTR(cilen, ucp);\n    }\n\n    /*\n     * If we aren't rejecting this packet, and we want to negotiate\n     * their address, and they didn't send their address, then we\n     * send a NAK with a CI_ADDR option appended.  We assume the\n     * input buffer is long enough that we can append the extra\n     * option safely.\n     */\n    if (rc != CONFREJ && !ho->neg_addr && !ho->old_addrs &&\n    wo->req_addr && !reject_if_disagree && !pcb->settings.noremoteip) {\n    if (rc == CONFACK) {\n        rc = CONFNAK;\n        ucp = inp;            /* reset pointer */\n        wo->req_addr = 0;        /* don't ask again */\n    }\n    PUTCHAR(CI_ADDR, ucp);\n    PUTCHAR(CILEN_ADDR, ucp);\n    tl = lwip_ntohl(wo->hisaddr);\n    PUTLONG(tl, ucp);\n    }\n\n    *len = ucp - inp;            /* Compute output length */\n    IPCPDEBUG((\"ipcp: returning Configure-%s\", CODENAME(rc)));\n    return (rc);            /* Return final code */\n}\n\n\n#if 0 /* UNUSED */\n/*\n * ip_check_options - check that any IP-related options are OK,\n * and assign appropriate defaults.\n */\nstatic void\nip_check_options()\n{\n    struct hostent *hp;\n    u32_t local;\n    ipcp_options *wo = &ipcp_wantoptions[0];\n\n    /*\n     * Default our local IP address based on our hostname.\n     * If local IP address already given, don't bother.\n     */\n    if (wo->ouraddr == 0 && !disable_defaultip) {\n    /*\n     * Look up our hostname (possibly with domain name appended)\n     * and take the first IP address as our local IP address.\n     * If there isn't an IP address for our hostname, too bad.\n     */\n    wo->accept_local = 1;    /* don't insist on this default value */\n    if ((hp = gethostbyname(hostname)) != NULL) {\n        local = *(u32_t *)hp->h_addr;\n        if (local != 0 && !bad_ip_adrs(local))\n        wo->ouraddr = local;\n    }\n    }\n    ask_for_local = wo->ouraddr != 0 || !disable_defaultip;\n}\n#endif /* UNUSED */\n\n#if DEMAND_SUPPORT\n/*\n * ip_demand_conf - configure the interface as though\n * IPCP were up, for use with dial-on-demand.\n */\nstatic int\nip_demand_conf(u)\n    int u;\n{\n    ppp_pcb *pcb = &ppp_pcb_list[u];\n    ipcp_options *wo = &ipcp_wantoptions[u];\n\n    if (wo->hisaddr == 0 && !pcb->settings.noremoteip) {\n    /* make up an arbitrary address for the peer */\n    wo->hisaddr = lwip_htonl(0x0a707070 + ifunit);\n    wo->accept_remote = 1;\n    }\n    if (wo->ouraddr == 0) {\n    /* make up an arbitrary address for us */\n    wo->ouraddr = lwip_htonl(0x0a404040 + ifunit);\n    wo->accept_local = 1;\n    ask_for_local = 0;    /* don't tell the peer this address */\n    }\n    if (!sifaddr(pcb, wo->ouraddr, wo->hisaddr, get_mask(wo->ouraddr)))\n    return 0;\n    if (!sifup(pcb))\n    return 0;\n    if (!sifnpmode(pcb, PPP_IP, NPMODE_QUEUE))\n    return 0;\n#if 0 /* UNUSED */\n    if (wo->default_route)\n    if (sifdefaultroute(pcb, wo->ouraddr, wo->hisaddr,\n        wo->replace_default_route))\n        default_route_set[u] = 1;\n#endif /* UNUSED */\n#if 0 /* UNUSED - PROXY ARP */\n    if (wo->proxy_arp)\n    if (sifproxyarp(pcb, wo->hisaddr))\n        proxy_arp_set[u] = 1;\n#endif /* UNUSED - PROXY ARP */\n\n    ppp_notice(\"local  IP address %I\", wo->ouraddr);\n    if (wo->hisaddr)\n    ppp_notice(\"remote IP address %I\", wo->hisaddr);\n\n    return 1;\n}\n#endif /* DEMAND_SUPPORT */\n\n/*\n * ipcp_up - IPCP has come UP.\n *\n * Configure the IP network interface appropriately and bring it up.\n */\nstatic void ipcp_up(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    u32_t mask;\n    ipcp_options *ho = &pcb->ipcp_hisoptions;\n    ipcp_options *go = &pcb->ipcp_gotoptions;\n    ipcp_options *wo = &pcb->ipcp_wantoptions;\n\n    IPCPDEBUG((\"ipcp: up\"));\n\n    /*\n     * We must have a non-zero IP address for both ends of the link.\n     */\n    if (!ho->neg_addr && !ho->old_addrs)\n    ho->hisaddr = wo->hisaddr;\n\n    if (!(go->neg_addr || go->old_addrs) && (wo->neg_addr || wo->old_addrs)\n    && wo->ouraddr != 0) {\n    ppp_error(\"Peer refused to agree to our IP address\");\n    ipcp_close(f->pcb, \"Refused our IP address\");\n    return;\n    }\n    if (go->ouraddr == 0) {\n    ppp_error(\"Could not determine local IP address\");\n    ipcp_close(f->pcb, \"Could not determine local IP address\");\n    return;\n    }\n    if (ho->hisaddr == 0 && !pcb->settings.noremoteip) {\n    ho->hisaddr = lwip_htonl(0x0a404040);\n    ppp_warn(\"Could not determine remote IP address: defaulting to %I\",\n         ho->hisaddr);\n    }\n#if 0 /* UNUSED */\n    script_setenv(\"IPLOCAL\", ip_ntoa(go->ouraddr), 0);\n    if (ho->hisaddr != 0)\n    script_setenv(\"IPREMOTE\", ip_ntoa(ho->hisaddr), 1);\n#endif /* UNUSED */\n\n#if LWIP_DNS\n    if (!go->req_dns1)\n        go->dnsaddr[0] = 0;\n    if (!go->req_dns2)\n        go->dnsaddr[1] = 0;\n#if 0 /* UNUSED */\n    if (go->dnsaddr[0])\n    script_setenv(\"DNS1\", ip_ntoa(go->dnsaddr[0]), 0);\n    if (go->dnsaddr[1])\n    script_setenv(\"DNS2\", ip_ntoa(go->dnsaddr[1]), 0);\n#endif /* UNUSED */\n    if (pcb->settings.usepeerdns && (go->dnsaddr[0] || go->dnsaddr[1])) {\n    sdns(pcb, go->dnsaddr[0], go->dnsaddr[1]);\n#if 0 /* UNUSED */\n    script_setenv(\"USEPEERDNS\", \"1\", 0);\n    create_resolv(go->dnsaddr[0], go->dnsaddr[1]);\n#endif /* UNUSED */\n    }\n#endif /* LWIP_DNS */\n\n    /*\n     * Check that the peer is allowed to use the IP address it wants.\n     */\n    if (ho->hisaddr != 0) {\n    u32_t addr = lwip_ntohl(ho->hisaddr);\n    if ((addr >> IP_CLASSA_NSHIFT) == IP_LOOPBACKNET\n        || IP_MULTICAST(addr) || IP_BADCLASS(addr)\n        /*\n         * For now, consider that PPP in server mode with peer required\n         * to authenticate must provide the peer IP address, reject any\n         * IP address wanted by peer different than the one we wanted.\n         */\n#if PPP_SERVER && PPP_AUTH_SUPPORT\n        || (pcb->settings.auth_required && wo->hisaddr != ho->hisaddr)\n#endif /* PPP_SERVER && PPP_AUTH_SUPPORT */\n        ) {\n        ppp_error(\"Peer is not authorized to use remote address %I\", ho->hisaddr);\n        ipcp_close(pcb, \"Unauthorized remote IP address\");\n        return;\n    }\n    }\n#if 0 /* Unused */\n    /* Upstream checking code */\n    if (ho->hisaddr != 0 && !auth_ip_addr(f->unit, ho->hisaddr)) {\n    ppp_error(\"Peer is not authorized to use remote address %I\", ho->hisaddr);\n    ipcp_close(f->unit, \"Unauthorized remote IP address\");\n    return;\n    }\n#endif /* Unused */\n\n#if VJ_SUPPORT\n    /* set tcp compression */\n    sifvjcomp(pcb, ho->neg_vj, ho->cflag, ho->maxslotindex);\n#endif /* VJ_SUPPORT */\n\n#if DEMAND_SUPPORT\n    /*\n     * If we are doing dial-on-demand, the interface is already\n     * configured, so we put out any saved-up packets, then set the\n     * interface to pass IP packets.\n     */\n    if (demand) {\n    if (go->ouraddr != wo->ouraddr || ho->hisaddr != wo->hisaddr) {\n        ipcp_clear_addrs(f->unit, wo->ouraddr, wo->hisaddr,\n                      wo->replace_default_route);\n        if (go->ouraddr != wo->ouraddr) {\n        ppp_warn(\"Local IP address changed to %I\", go->ouraddr);\n        script_setenv(\"OLDIPLOCAL\", ip_ntoa(wo->ouraddr), 0);\n        wo->ouraddr = go->ouraddr;\n        } else\n        script_unsetenv(\"OLDIPLOCAL\");\n        if (ho->hisaddr != wo->hisaddr && wo->hisaddr != 0) {\n        ppp_warn(\"Remote IP address changed to %I\", ho->hisaddr);\n        script_setenv(\"OLDIPREMOTE\", ip_ntoa(wo->hisaddr), 0);\n        wo->hisaddr = ho->hisaddr;\n        } else\n        script_unsetenv(\"OLDIPREMOTE\");\n\n        /* Set the interface to the new addresses */\n        mask = get_mask(go->ouraddr);\n        if (!sifaddr(pcb, go->ouraddr, ho->hisaddr, mask)) {\n#if PPP_DEBUG\n        ppp_warn(\"Interface configuration failed\");\n#endif /* PPP_DEBUG */\n        ipcp_close(f->unit, \"Interface configuration failed\");\n        return;\n        }\n\n        /* assign a default route through the interface if required */\n        if (ipcp_wantoptions[f->unit].default_route) \n        if (sifdefaultroute(pcb, go->ouraddr, ho->hisaddr,\n            wo->replace_default_route))\n            default_route_set[f->unit] = 1;\n\n#if 0 /* UNUSED - PROXY ARP */\n        /* Make a proxy ARP entry if requested. */\n        if (ho->hisaddr != 0 && ipcp_wantoptions[f->unit].proxy_arp)\n        if (sifproxyarp(pcb, ho->hisaddr))\n            proxy_arp_set[f->unit] = 1;\n#endif /* UNUSED - PROXY ARP */\n\n    }\n    demand_rexmit(PPP_IP,go->ouraddr);\n    sifnpmode(pcb, PPP_IP, NPMODE_PASS);\n\n    } else\n#endif /* DEMAND_SUPPORT */\n    {\n    /*\n     * Set IP addresses and (if specified) netmask.\n     */\n    mask = get_mask(go->ouraddr);\n\n#if !(defined(SVR4) && (defined(SNI) || defined(__USLC__)))\n    if (!sifaddr(pcb, go->ouraddr, ho->hisaddr, mask)) {\n#if PPP_DEBUG\n        ppp_warn(\"Interface configuration failed\");\n#endif /* PPP_DEBUG */\n        ipcp_close(f->pcb, \"Interface configuration failed\");\n        return;\n    }\n#endif\n\n    /* bring the interface up for IP */\n    if (!sifup(pcb)) {\n#if PPP_DEBUG\n        ppp_warn(\"Interface failed to come up\");\n#endif /* PPP_DEBUG */\n        ipcp_close(f->pcb, \"Interface configuration failed\");\n        return;\n    }\n\n#if (defined(SVR4) && (defined(SNI) || defined(__USLC__)))\n    if (!sifaddr(pcb, go->ouraddr, ho->hisaddr, mask)) {\n#if PPP_DEBUG\n        ppp_warn(\"Interface configuration failed\");\n#endif /* PPP_DEBUG */\n        ipcp_close(f->unit, \"Interface configuration failed\");\n        return;\n    }\n#endif\n#if DEMAND_SUPPORT\n    sifnpmode(pcb, PPP_IP, NPMODE_PASS);\n#endif /* DEMAND_SUPPORT */\n\n#if 0 /* UNUSED */\n    /* assign a default route through the interface if required */\n    if (wo->default_route)\n        if (sifdefaultroute(pcb, go->ouraddr, ho->hisaddr,\n            wo->replace_default_route))\n            pcb->default_route_set = 1;\n#endif /* UNUSED */\n\n#if 0 /* UNUSED - PROXY ARP */\n    /* Make a proxy ARP entry if requested. */\n    if (ho->hisaddr != 0 && wo->proxy_arp)\n        if (sifproxyarp(pcb, ho->hisaddr))\n        pcb->proxy_arp_set = 1;\n#endif /* UNUSED - PROXY ARP */\n\n    wo->ouraddr = go->ouraddr;\n\n    ppp_notice(\"local  IP address %I\", go->ouraddr);\n    if (ho->hisaddr != 0)\n        ppp_notice(\"remote IP address %I\", ho->hisaddr);\n#if LWIP_DNS\n    if (go->dnsaddr[0])\n        ppp_notice(\"primary   DNS address %I\", go->dnsaddr[0]);\n    if (go->dnsaddr[1])\n        ppp_notice(\"secondary DNS address %I\", go->dnsaddr[1]);\n#endif /* LWIP_DNS */\n    }\n\n#if PPP_STATS_SUPPORT\n    reset_link_stats(f->unit);\n#endif /* PPP_STATS_SUPPORT */\n\n    np_up(pcb, PPP_IP);\n    pcb->ipcp_is_up = 1;\n\n#if PPP_NOTIFY\n    notify(ip_up_notifier, 0);\n#endif /* PPP_NOTIFY */\n#if 0 /* UNUSED */\n    if (ip_up_hook)\n    ip_up_hook();\n#endif /* UNUSED */\n}\n\n\n/*\n * ipcp_down - IPCP has gone DOWN.\n *\n * Take the IP network interface down, clear its addresses\n * and delete routes through it.\n */\nstatic void ipcp_down(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    ipcp_options *ho = &pcb->ipcp_hisoptions;\n    ipcp_options *go = &pcb->ipcp_gotoptions;\n\n    IPCPDEBUG((\"ipcp: down\"));\n#if PPP_STATS_SUPPORT\n    /* XXX a bit IPv4-centric here, we only need to get the stats\n     * before the interface is marked down. */\n    /* XXX more correct: we must get the stats before running the notifiers,\n     * at least for the radius plugin */\n    update_link_stats(f->unit);\n#endif /* PPP_STATS_SUPPORT */\n#if PPP_NOTIFY\n    notify(ip_down_notifier, 0);\n#endif /* PPP_NOTIFY */\n#if 0 /* UNUSED */\n    if (ip_down_hook)\n    ip_down_hook();\n#endif /* UNUSED */\n    if (pcb->ipcp_is_up) {\n    pcb->ipcp_is_up = 0;\n    np_down(pcb, PPP_IP);\n    }\n#if VJ_SUPPORT\n    sifvjcomp(pcb, 0, 0, 0);\n#endif /* VJ_SUPPORT */\n\n#if PPP_STATS_SUPPORT\n    print_link_stats(); /* _after_ running the notifiers and ip_down_hook(),\n             * because print_link_stats() sets link_stats_valid\n             * to 0 (zero) */\n#endif /* PPP_STATS_SUPPORT */\n\n#if DEMAND_SUPPORT\n    /*\n     * If we are doing dial-on-demand, set the interface\n     * to queue up outgoing packets (for now).\n     */\n    if (demand) {\n    sifnpmode(pcb, PPP_IP, NPMODE_QUEUE);\n    } else\n#endif /* DEMAND_SUPPORT */\n    {\n#if DEMAND_SUPPORT\n    sifnpmode(pcb, PPP_IP, NPMODE_DROP);\n#endif /* DEMAND_SUPPORT */\n    sifdown(pcb);\n    ipcp_clear_addrs(pcb, go->ouraddr,\n             ho->hisaddr, 0);\n#if LWIP_DNS\n    cdns(pcb, go->dnsaddr[0], go->dnsaddr[1]);\n#endif /* LWIP_DNS */\n    }\n}\n\n\n/*\n * ipcp_clear_addrs() - clear the interface addresses, routes,\n * proxy arp entries, etc.\n */\nstatic void ipcp_clear_addrs(ppp_pcb *pcb, u32_t ouraddr, u32_t hisaddr, u8_t replacedefaultroute) {\n    LWIP_UNUSED_ARG(replacedefaultroute);\n\n#if 0 /* UNUSED - PROXY ARP */\n    if (pcb->proxy_arp_set) {\n    cifproxyarp(pcb, hisaddr);\n    pcb->proxy_arp_set = 0;\n    }\n#endif /* UNUSED - PROXY ARP */\n#if 0 /* UNUSED */\n    /* If replacedefaultroute, sifdefaultroute will be called soon\n     * with replacedefaultroute set and that will overwrite the current\n     * default route. This is the case only when doing demand, otherwise\n     * during demand, this cifdefaultroute would restore the old default\n     * route which is not what we want in this case. In the non-demand\n     * case, we'll delete the default route and restore the old if there\n     * is one saved by an sifdefaultroute with replacedefaultroute.\n     */\n    if (!replacedefaultroute && pcb->default_route_set) {\n    cifdefaultroute(pcb, ouraddr, hisaddr);\n    pcb->default_route_set = 0;\n    }\n#endif /* UNUSED */\n    cifaddr(pcb, ouraddr, hisaddr);\n}\n\n\n/*\n * ipcp_finished - possibly shut down the lower layers.\n */\nstatic void ipcp_finished(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    if (pcb->ipcp_is_open) {\n        pcb->ipcp_is_open = 0;\n        np_finished(pcb, PPP_IP);\n    }\n}\n\n\n#if 0 /* UNUSED */\n/*\n * create_resolv - create the replacement resolv.conf file\n */\nstatic void\ncreate_resolv(peerdns1, peerdns2)\n    u32_t peerdns1, peerdns2;\n{\n\n}\n#endif /* UNUSED */\n\n#if PRINTPKT_SUPPORT\n/*\n * ipcp_printpkt - print the contents of an IPCP packet.\n */\nstatic const char* const ipcp_codenames[] = {\n    \"ConfReq\", \"ConfAck\", \"ConfNak\", \"ConfRej\",\n    \"TermReq\", \"TermAck\", \"CodeRej\"\n};\n\nstatic int ipcp_printpkt(const u_char *p, int plen,\n        void (*printer) (void *, const char *, ...), void *arg) {\n    int code, id, len, olen;\n    const u_char *pstart, *optend;\n#if VJ_SUPPORT\n    u_short cishort;\n#endif /* VJ_SUPPORT */\n    u32_t cilong;\n\n    if (plen < HEADERLEN)\n    return 0;\n    pstart = p;\n    GETCHAR(code, p);\n    GETCHAR(id, p);\n    GETSHORT(len, p);\n    if (len < HEADERLEN || len > plen)\n    return 0;\n\n    if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(ipcp_codenames))\n    printer(arg, \" %s\", ipcp_codenames[code-1]);\n    else\n    printer(arg, \" code=0x%x\", code);\n    printer(arg, \" id=0x%x\", id);\n    len -= HEADERLEN;\n    switch (code) {\n    case CONFREQ:\n    case CONFACK:\n    case CONFNAK:\n    case CONFREJ:\n    /* print option list */\n    while (len >= 2) {\n        GETCHAR(code, p);\n        GETCHAR(olen, p);\n        p -= 2;\n        if (olen < 2 || olen > len) {\n        break;\n        }\n        printer(arg, \" <\");\n        len -= olen;\n        optend = p + olen;\n        switch (code) {\n        case CI_ADDRS:\n        if (olen == CILEN_ADDRS) {\n            p += 2;\n            GETLONG(cilong, p);\n            printer(arg, \"addrs %I\", lwip_htonl(cilong));\n            GETLONG(cilong, p);\n            printer(arg, \" %I\", lwip_htonl(cilong));\n        }\n        break;\n#if VJ_SUPPORT\n        case CI_COMPRESSTYPE:\n        if (olen >= CILEN_COMPRESS) {\n            p += 2;\n            GETSHORT(cishort, p);\n            printer(arg, \"compress \");\n            switch (cishort) {\n            case IPCP_VJ_COMP:\n            printer(arg, \"VJ\");\n            break;\n            case IPCP_VJ_COMP_OLD:\n            printer(arg, \"old-VJ\");\n            break;\n            default:\n            printer(arg, \"0x%x\", cishort);\n            }\n        }\n        break;\n#endif /* VJ_SUPPORT */\n        case CI_ADDR:\n        if (olen == CILEN_ADDR) {\n            p += 2;\n            GETLONG(cilong, p);\n            printer(arg, \"addr %I\", lwip_htonl(cilong));\n        }\n        break;\n#if LWIP_DNS\n        case CI_MS_DNS1:\n        case CI_MS_DNS2:\n            p += 2;\n        GETLONG(cilong, p);\n        printer(arg, \"ms-dns%d %I\", (code == CI_MS_DNS1? 1: 2),\n            htonl(cilong));\n        break;\n#endif /* LWIP_DNS */\n#if 0 /* UNUSED - WINS */\n        case CI_MS_WINS1:\n        case CI_MS_WINS2:\n            p += 2;\n        GETLONG(cilong, p);\n        printer(arg, \"ms-wins %I\", lwip_htonl(cilong));\n        break;\n#endif /* UNUSED - WINS */\n        default:\n        break;\n        }\n        while (p < optend) {\n        GETCHAR(code, p);\n        printer(arg, \" %.2x\", code);\n        }\n        printer(arg, \">\");\n    }\n    break;\n\n    case TERMACK:\n    case TERMREQ:\n    if (len > 0 && *p >= ' ' && *p < 0x7f) {\n        printer(arg, \" \");\n        ppp_print_string(p, len, printer, arg);\n        p += len;\n        len = 0;\n    }\n    break;\n    default:\n    break;\n    }\n\n    /* print the rest of the bytes in the packet */\n    for (; len > 0; --len) {\n    GETCHAR(code, p);\n    printer(arg, \" %.2x\", code);\n    }\n\n    return p - pstart;\n}\n#endif /* PRINTPKT_SUPPORT */\n\n#if DEMAND_SUPPORT\n/*\n * ip_active_pkt - see if this IP packet is worth bringing the link up for.\n * We don't bring the link up for IP fragments or for TCP FIN packets\n * with no data.\n */\n#define IP_HDRLEN    20    /* bytes */\n#define IP_OFFMASK    0x1fff\n#ifndef IPPROTO_TCP\n#define IPPROTO_TCP    6\n#endif\n#define TCP_HDRLEN    20\n#define TH_FIN        0x01\n\n/*\n * We use these macros because the IP header may be at an odd address,\n * and some compilers might use word loads to get th_off or ip_hl.\n */\n\n#define net_short(x)    (((x)[0] << 8) + (x)[1])\n#define get_iphl(x)    (((unsigned char *)(x))[0] & 0xF)\n#define get_ipoff(x)    net_short((unsigned char *)(x) + 6)\n#define get_ipproto(x)    (((unsigned char *)(x))[9])\n#define get_tcpoff(x)    (((unsigned char *)(x))[12] >> 4)\n#define get_tcpflags(x)    (((unsigned char *)(x))[13])\n\nstatic int\nip_active_pkt(pkt, len)\n    u_char *pkt;\n    int len;\n{\n    u_char *tcp;\n    int hlen;\n\n    len -= PPP_HDRLEN;\n    pkt += PPP_HDRLEN;\n    if (len < IP_HDRLEN)\n    return 0;\n    if ((get_ipoff(pkt) & IP_OFFMASK) != 0)\n    return 0;\n    if (get_ipproto(pkt) != IPPROTO_TCP)\n    return 1;\n    hlen = get_iphl(pkt) * 4;\n    if (len < hlen + TCP_HDRLEN)\n    return 0;\n    tcp = pkt + hlen;\n    if ((get_tcpflags(tcp) & TH_FIN) != 0 && len == hlen + get_tcpoff(tcp) * 4)\n    return 0;\n    return 1;\n}\n#endif /* DEMAND_SUPPORT */\n\n#endif /* PPP_SUPPORT && PPP_IPV4_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/ipv6cp.c",
    "content": "/*\n * ipv6cp.c - PPP IPV6 Control Protocol.\n *\n * Copyright (c) 1999 Tommi Komulainen.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Tommi Komulainen\n *     <Tommi.Komulainen@iki.fi>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n */\n\n/*  Original version, based on RFC2023 :\n\n    Copyright (c) 1995, 1996, 1997 Francis.Dupont@inria.fr, INRIA Rocquencourt,\n    Alain.Durand@imag.fr, IMAG,\n    Jean-Luc.Richier@imag.fr, IMAG-LSR.\n\n    Copyright (c) 1998, 1999 Francis.Dupont@inria.fr, GIE DYADE,\n    Alain.Durand@imag.fr, IMAG,\n    Jean-Luc.Richier@imag.fr, IMAG-LSR.\n\n    Ce travail a été fait au sein du GIE DYADE (Groupement d'Intérêt\n    Économique ayant pour membres BULL S.A. et l'INRIA).\n\n    Ce logiciel informatique est disponible aux conditions\n    usuelles dans la recherche, c'est-à-dire qu'il peut\n    être utilisé, copié, modifié, distribué à l'unique\n    condition que ce texte soit conservé afin que\n    l'origine de ce logiciel soit reconnue.\n\n    Le nom de l'Institut National de Recherche en Informatique\n    et en Automatique (INRIA), de l'IMAG, ou d'une personne morale\n    ou physique ayant participé à l'élaboration de ce logiciel ne peut\n    être utilisé sans son accord préalable explicite.\n\n    Ce logiciel est fourni tel quel sans aucune garantie,\n    support ou responsabilité d'aucune sorte.\n    Ce logiciel est dérivé de sources d'origine\n    \"University of California at Berkeley\" et\n    \"Digital Equipment Corporation\" couvertes par des copyrights.\n\n    L'Institut d'Informatique et de Mathématiques Appliquées de Grenoble (IMAG)\n    est une fédération d'unités mixtes de recherche du CNRS, de l'Institut National\n    Polytechnique de Grenoble et de l'Université Joseph Fourier regroupant\n    sept laboratoires dont le laboratoire Logiciels, Systèmes, Réseaux (LSR).\n\n    This work has been done in the context of GIE DYADE (joint R & D venture\n    between BULL S.A. and INRIA).\n\n    This software is available with usual \"research\" terms\n    with the aim of retain credits of the software. \n    Permission to use, copy, modify and distribute this software for any\n    purpose and without fee is hereby granted, provided that the above\n    copyright notice and this permission notice appear in all copies,\n    and the name of INRIA, IMAG, or any contributor not be used in advertising\n    or publicity pertaining to this material without the prior explicit\n    permission. The software is provided \"as is\" without any\n    warranties, support or liabilities of any kind.\n    This software is derived from source code from\n    \"University of California at Berkeley\" and\n    \"Digital Equipment Corporation\" protected by copyrights.\n\n    Grenoble's Institute of Computer Science and Applied Mathematics (IMAG)\n    is a federation of seven research units funded by the CNRS, National\n    Polytechnic Institute of Grenoble and University Joseph Fourier.\n    The research unit in Software, Systems, Networks (LSR) is member of IMAG.\n*/\n\n/*\n * Derived from :\n *\n *\n * ipcp.c - PPP IP Control Protocol.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n *\n * $Id: ipv6cp.c,v 1.21 2005/08/25 23:59:34 paulus Exp $ \n */\n\n/*\n * @todo: \n *\n * Proxy Neighbour Discovery.\n *\n * Better defines for selecting the ordering of\n *   interface up / set address.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPP_IPV6_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#if 0 /* UNUSED */\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n#include <netdb.h>\n#include <sys/param.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif /* UNUSED */\n\n#include \"netif/ppp/ppp_impl.h\"\n#include \"netif/ppp/fsm.h\"\n#include \"netif/ppp/ipcp.h\"\n#include \"netif/ppp/ipv6cp.h\"\n#include \"netif/ppp/magic.h\"\n\n/* global vars */\n#if 0 /* UNUSED */\nint no_ifaceid_neg = 0;\n#endif /* UNUSED */\n\n/*\n * Callbacks for fsm code.  (CI = Configuration Information)\n */\nstatic void ipv6cp_resetci(fsm *f); /* Reset our CI */\nstatic int  ipv6cp_cilen(fsm *f); /* Return length of our CI */\nstatic void ipv6cp_addci(fsm *f, u_char *ucp, int *lenp); /* Add our CI */\nstatic int  ipv6cp_ackci(fsm *f, u_char *p, int len); /* Peer ack'd our CI */\nstatic int  ipv6cp_nakci(fsm *f, u_char *p, int len, int treat_as_reject); /* Peer nak'd our CI */\nstatic int  ipv6cp_rejci(fsm *f, u_char *p, int len); /* Peer rej'd our CI */\nstatic int  ipv6cp_reqci(fsm *f, u_char *inp, int *len, int reject_if_disagree); /* Rcv CI */\nstatic void ipv6cp_up(fsm *f); /* We're UP */\nstatic void ipv6cp_down(fsm *f); /* We're DOWN */\nstatic void ipv6cp_finished(fsm *f); /* Don't need lower layer */\n\nstatic const fsm_callbacks ipv6cp_callbacks = { /* IPV6CP callback routines */\n    ipv6cp_resetci,        /* Reset our Configuration Information */\n    ipv6cp_cilen,        /* Length of our Configuration Information */\n    ipv6cp_addci,        /* Add our Configuration Information */\n    ipv6cp_ackci,        /* ACK our Configuration Information */\n    ipv6cp_nakci,        /* NAK our Configuration Information */\n    ipv6cp_rejci,        /* Reject our Configuration Information */\n    ipv6cp_reqci,        /* Request peer's Configuration Information */\n    ipv6cp_up,            /* Called when fsm reaches OPENED state */\n    ipv6cp_down,        /* Called when fsm leaves OPENED state */\n    NULL,            /* Called when we want the lower layer up */\n    ipv6cp_finished,        /* Called when we want the lower layer down */\n    NULL,            /* Called when Protocol-Reject received */\n    NULL,            /* Retransmission is necessary */\n    NULL,            /* Called to handle protocol-specific codes */\n    \"IPV6CP\"            /* String name of protocol */\n};\n\n#if PPP_OPTIONS\n/*\n * Command-line options.\n */\nstatic int setifaceid(char **arg));\nstatic void printifaceid(option_t *,\n                  void (*)(void *, char *, ...), void *));\n\nstatic option_t ipv6cp_option_list[] = {\n    { \"ipv6\", o_special, (void *)setifaceid,\n      \"Set interface identifiers for IPV6\",\n      OPT_A2PRINTER, (void *)printifaceid },\n\n    { \"+ipv6\", o_bool, &ipv6cp_protent.enabled_flag,\n      \"Enable IPv6 and IPv6CP\", OPT_PRIO | 1 },\n    { \"noipv6\", o_bool, &ipv6cp_protent.enabled_flag,\n      \"Disable IPv6 and IPv6CP\", OPT_PRIOSUB },\n    { \"-ipv6\", o_bool, &ipv6cp_protent.enabled_flag,\n      \"Disable IPv6 and IPv6CP\", OPT_PRIOSUB | OPT_ALIAS },\n\n    { \"ipv6cp-accept-local\", o_bool, &ipv6cp_allowoptions[0].accept_local,\n      \"Accept peer's interface identifier for us\", 1 },\n\n    { \"ipv6cp-use-ipaddr\", o_bool, &ipv6cp_allowoptions[0].use_ip,\n      \"Use (default) IPv4 address as interface identifier\", 1 },\n\n    { \"ipv6cp-use-persistent\", o_bool, &ipv6cp_wantoptions[0].use_persistent,\n      \"Use uniquely-available persistent value for link local address\", 1 },\n\n    { \"ipv6cp-restart\", o_int, &ipv6cp_fsm[0].timeouttime,\n      \"Set timeout for IPv6CP\", OPT_PRIO },\n    { \"ipv6cp-max-terminate\", o_int, &ipv6cp_fsm[0].maxtermtransmits,\n      \"Set max #xmits for term-reqs\", OPT_PRIO },\n    { \"ipv6cp-max-configure\", o_int, &ipv6cp_fsm[0].maxconfreqtransmits,\n      \"Set max #xmits for conf-reqs\", OPT_PRIO },\n    { \"ipv6cp-max-failure\", o_int, &ipv6cp_fsm[0].maxnakloops,\n      \"Set max #conf-naks for IPv6CP\", OPT_PRIO },\n\n   { NULL }\n};\n#endif /* PPP_OPTIONS */\n\n/*\n * Protocol entry points from main code.\n */\nstatic void ipv6cp_init(ppp_pcb *pcb);\nstatic void ipv6cp_open(ppp_pcb *pcb);\nstatic void ipv6cp_close(ppp_pcb *pcb, const char *reason);\nstatic void ipv6cp_lowerup(ppp_pcb *pcb);\nstatic void ipv6cp_lowerdown(ppp_pcb *pcb);\nstatic void ipv6cp_input(ppp_pcb *pcb, u_char *p, int len);\nstatic void ipv6cp_protrej(ppp_pcb *pcb);\n#if PPP_OPTIONS\nstatic void ipv6_check_options(void);\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\nstatic int  ipv6_demand_conf(int u);\n#endif /* DEMAND_SUPPORT */\n#if PRINTPKT_SUPPORT\nstatic int ipv6cp_printpkt(const u_char *p, int plen,\n        void (*printer)(void *, const char *, ...), void *arg);\n#endif /* PRINTPKT_SUPPORT */\n#if DEMAND_SUPPORT\nstatic int ipv6_active_pkt(u_char *pkt, int len);\n#endif /* DEMAND_SUPPORT */\n\nconst struct protent ipv6cp_protent = {\n    PPP_IPV6CP,\n    ipv6cp_init,\n    ipv6cp_input,\n    ipv6cp_protrej,\n    ipv6cp_lowerup,\n    ipv6cp_lowerdown,\n    ipv6cp_open,\n    ipv6cp_close,\n#if PRINTPKT_SUPPORT\n    ipv6cp_printpkt,\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_DATAINPUT\n    NULL,\n#endif /* PPP_DATAINPUT */\n#if PRINTPKT_SUPPORT\n    \"IPV6CP\",\n    \"IPV6\",\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_OPTIONS\n    ipv6cp_option_list,\n    ipv6_check_options,\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\n    ipv6_demand_conf,\n    ipv6_active_pkt\n#endif /* DEMAND_SUPPORT */\n};\n\nstatic void ipv6cp_clear_addrs(ppp_pcb *pcb, eui64_t ourid, eui64_t hisid);\n#if 0 /* UNUSED */\nstatic void ipv6cp_script(char *));\nstatic void ipv6cp_script_done(void *));\n#endif /* UNUSED */\n\n/*\n * Lengths of configuration options.\n */\n#define CILEN_VOID    2\n#define CILEN_COMPRESS    4    /* length for RFC2023 compress opt. */\n#define CILEN_IFACEID   10    /* RFC2472, interface identifier    */\n\n#define CODENAME(x)    ((x) == CONFACK ? \"ACK\" : \\\n             (x) == CONFNAK ? \"NAK\" : \"REJ\")\n\n#if 0 /* UNUSED */\n/*\n * This state variable is used to ensure that we don't\n * run an ipcp-up/down script while one is already running.\n */\nstatic enum script_state {\n    s_down,\n    s_up,\n} ipv6cp_script_state;\nstatic pid_t ipv6cp_script_pid;\n#endif /* UNUSED */\n\nstatic char *llv6_ntoa(eui64_t ifaceid);\n\n#if PPP_OPTIONS\n/*\n * setifaceid - set the interface identifiers manually\n */\nstatic int\nsetifaceid(argv)\n    char **argv;\n{\n    char *comma, *arg, c;\n    ipv6cp_options *wo = &ipv6cp_wantoptions[0];\n    struct in6_addr addr;\n    static int prio_local, prio_remote;\n\n#define VALIDID(a) ( (((a).s6_addr32[0] == 0) && ((a).s6_addr32[1] == 0)) && \\\n            (((a).s6_addr32[2] != 0) || ((a).s6_addr32[3] != 0)) )\n    \n    arg = *argv;\n    if ((comma = strchr(arg, ',')) == NULL)\n    comma = arg + strlen(arg);\n    \n    /* \n     * If comma first character, then no local identifier\n     */\n    if (comma != arg) {\n    c = *comma;\n    *comma = '\\0';\n\n    if (inet_pton(AF_INET6, arg, &addr) == 0 || !VALIDID(addr)) {\n        option_error(\"Illegal interface identifier (local): %s\", arg);\n        return 0;\n    }\n\n    if (option_priority >= prio_local) {\n        eui64_copy(addr.s6_addr32[2], wo->ourid);\n        wo->opt_local = 1;\n        prio_local = option_priority;\n    }\n    *comma = c;\n    }\n    \n    /*\n     * If comma last character, the no remote identifier\n     */\n    if (*comma != 0 && *++comma != '\\0') {\n    if (inet_pton(AF_INET6, comma, &addr) == 0 || !VALIDID(addr)) {\n        option_error(\"Illegal interface identifier (remote): %s\", comma);\n        return 0;\n    }\n    if (option_priority >= prio_remote) {\n        eui64_copy(addr.s6_addr32[2], wo->hisid);\n        wo->opt_remote = 1;\n        prio_remote = option_priority;\n    }\n    }\n\n    if (override_value(\"+ipv6\", option_priority, option_source))\n    ipv6cp_protent.enabled_flag = 1;\n    return 1;\n}\n\nstatic void\nprintifaceid(opt, printer, arg)\n    option_t *opt;\n    void (*printer)(void *, char *, ...));\n    void *arg;\n{\n    ipv6cp_options *wo = &ipv6cp_wantoptions[0];\n\n    if (wo->opt_local)\n        printer(arg, \"%s\", llv6_ntoa(wo->ourid));\n    printer(arg, \",\");\n    if (wo->opt_remote)\n        printer(arg, \"%s\", llv6_ntoa(wo->hisid));\n}\n#endif /* PPP_OPTIONS */\n\n/*\n * Make a string representation of a network address.\n */\nstatic char *\nllv6_ntoa(eui64_t ifaceid)\n{\n    static char b[26];\n\n    sprintf(b, \"fe80::%02x%02x:%02x%02x:%02x%02x:%02x%02x\",\n      ifaceid.e8[0], ifaceid.e8[1], ifaceid.e8[2], ifaceid.e8[3],\n      ifaceid.e8[4], ifaceid.e8[5], ifaceid.e8[6], ifaceid.e8[7]);\n\n    return b;\n}\n\n\n/*\n * ipv6cp_init - Initialize IPV6CP.\n */\nstatic void ipv6cp_init(ppp_pcb *pcb) {\n    fsm *f = &pcb->ipv6cp_fsm;\n    ipv6cp_options *wo = &pcb->ipv6cp_wantoptions;\n    ipv6cp_options *ao = &pcb->ipv6cp_allowoptions;\n\n    f->pcb = pcb;\n    f->protocol = PPP_IPV6CP;\n    f->callbacks = &ipv6cp_callbacks;\n    fsm_init(f);\n\n#if 0 /* Not necessary, everything is cleared in ppp_new() */\n    memset(wo, 0, sizeof(*wo));\n    memset(ao, 0, sizeof(*ao));\n#endif /* 0 */\n\n    wo->accept_local = 1;\n    wo->neg_ifaceid = 1;\n    ao->neg_ifaceid = 1;\n\n#ifdef IPV6CP_COMP\n    wo->neg_vj = 1;\n    ao->neg_vj = 1;\n    wo->vj_protocol = IPV6CP_COMP;\n#endif\n\n}\n\n\n/*\n * ipv6cp_open - IPV6CP is allowed to come up.\n */\nstatic void ipv6cp_open(ppp_pcb *pcb) {\n    fsm_open(&pcb->ipv6cp_fsm);\n}\n\n\n/*\n * ipv6cp_close - Take IPV6CP down.\n */\nstatic void ipv6cp_close(ppp_pcb *pcb, const char *reason) {\n    fsm_close(&pcb->ipv6cp_fsm, reason);\n}\n\n\n/*\n * ipv6cp_lowerup - The lower layer is up.\n */\nstatic void ipv6cp_lowerup(ppp_pcb *pcb) {\n    fsm_lowerup(&pcb->ipv6cp_fsm);\n}\n\n\n/*\n * ipv6cp_lowerdown - The lower layer is down.\n */\nstatic void ipv6cp_lowerdown(ppp_pcb *pcb) {\n    fsm_lowerdown(&pcb->ipv6cp_fsm);\n}\n\n\n/*\n * ipv6cp_input - Input IPV6CP packet.\n */\nstatic void ipv6cp_input(ppp_pcb *pcb, u_char *p, int len) {\n    fsm_input(&pcb->ipv6cp_fsm, p, len);\n}\n\n\n/*\n * ipv6cp_protrej - A Protocol-Reject was received for IPV6CP.\n *\n * Pretend the lower layer went down, so we shut up.\n */\nstatic void ipv6cp_protrej(ppp_pcb *pcb) {\n    fsm_lowerdown(&pcb->ipv6cp_fsm);\n}\n\n\n/*\n * ipv6cp_resetci - Reset our CI.\n */\nstatic void ipv6cp_resetci(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    ipv6cp_options *wo = &pcb->ipv6cp_wantoptions;\n    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;\n    ipv6cp_options *ao = &pcb->ipv6cp_allowoptions;\n\n    wo->req_ifaceid = wo->neg_ifaceid && ao->neg_ifaceid;\n    \n    if (!wo->opt_local) {\n    eui64_magic_nz(wo->ourid);\n    }\n    \n    *go = *wo;\n    eui64_zero(go->hisid);    /* last proposed interface identifier */\n}\n\n\n/*\n * ipv6cp_cilen - Return length of our CI.\n */\nstatic int ipv6cp_cilen(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;\n\n#ifdef IPV6CP_COMP\n#define LENCIVJ(neg)        (neg ? CILEN_COMPRESS : 0)\n#endif /* IPV6CP_COMP */\n#define LENCIIFACEID(neg)    (neg ? CILEN_IFACEID : 0)\n\n    return (LENCIIFACEID(go->neg_ifaceid) +\n#ifdef IPV6CP_COMP\n        LENCIVJ(go->neg_vj) +\n#endif /* IPV6CP_COMP */\n        0);\n}\n\n\n/*\n * ipv6cp_addci - Add our desired CIs to a packet.\n */\nstatic void ipv6cp_addci(fsm *f, u_char *ucp, int *lenp) {\n    ppp_pcb *pcb = f->pcb;\n    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;\n    int len = *lenp;\n\n#ifdef IPV6CP_COMP\n#define ADDCIVJ(opt, neg, val) \\\n    if (neg) { \\\n    int vjlen = CILEN_COMPRESS; \\\n    if (len >= vjlen) { \\\n        PUTCHAR(opt, ucp); \\\n        PUTCHAR(vjlen, ucp); \\\n        PUTSHORT(val, ucp); \\\n        len -= vjlen; \\\n    } else \\\n        neg = 0; \\\n    }\n#endif /* IPV6CP_COMP */\n\n#define ADDCIIFACEID(opt, neg, val1) \\\n    if (neg) { \\\n    int idlen = CILEN_IFACEID; \\\n    if (len >= idlen) { \\\n        PUTCHAR(opt, ucp); \\\n        PUTCHAR(idlen, ucp); \\\n        eui64_put(val1, ucp); \\\n        len -= idlen; \\\n    } else \\\n        neg = 0; \\\n    }\n\n    ADDCIIFACEID(CI_IFACEID, go->neg_ifaceid, go->ourid);\n\n#ifdef IPV6CP_COMP\n    ADDCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol);\n#endif /* IPV6CP_COMP */\n\n    *lenp -= len;\n}\n\n\n/*\n * ipv6cp_ackci - Ack our CIs.\n *\n * Returns:\n *    0 - Ack was bad.\n *    1 - Ack was good.\n */\nstatic int ipv6cp_ackci(fsm *f, u_char *p, int len) {\n    ppp_pcb *pcb = f->pcb;\n    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;\n    u_short cilen, citype;\n#ifdef IPV6CP_COMP\n    u_short cishort;\n#endif /* IPV6CP_COMP */\n    eui64_t ifaceid;\n\n    /*\n     * CIs must be in exactly the same order that we sent...\n     * Check packet length and CI length at each step.\n     * If we find any deviations, then this packet is bad.\n     */\n\n#ifdef IPV6CP_COMP\n#define ACKCIVJ(opt, neg, val) \\\n    if (neg) { \\\n    int vjlen = CILEN_COMPRESS; \\\n    if ((len -= vjlen) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != vjlen || \\\n        citype != opt)  \\\n        goto bad; \\\n    GETSHORT(cishort, p); \\\n    if (cishort != val) \\\n        goto bad; \\\n    }\n#endif /* IPV6CP_COMP */\n\n#define ACKCIIFACEID(opt, neg, val1) \\\n    if (neg) { \\\n    int idlen = CILEN_IFACEID; \\\n    if ((len -= idlen) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != idlen || \\\n        citype != opt) \\\n        goto bad; \\\n    eui64_get(ifaceid, p); \\\n    if (! eui64_equals(val1, ifaceid)) \\\n        goto bad; \\\n    }\n\n    ACKCIIFACEID(CI_IFACEID, go->neg_ifaceid, go->ourid);\n\n#ifdef IPV6CP_COMP\n    ACKCIVJ(CI_COMPRESSTYPE, go->neg_vj, go->vj_protocol);\n#endif /* IPV6CP_COMP */\n\n    /*\n     * If there are any remaining CIs, then this packet is bad.\n     */\n    if (len != 0)\n    goto bad;\n    return (1);\n\nbad:\n    IPV6CPDEBUG((\"ipv6cp_ackci: received bad Ack!\"));\n    return (0);\n}\n\n/*\n * ipv6cp_nakci - Peer has sent a NAK for some of our CIs.\n * This should not modify any state if the Nak is bad\n * or if IPV6CP is in the OPENED state.\n *\n * Returns:\n *    0 - Nak was bad.\n *    1 - Nak was good.\n */\nstatic int ipv6cp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) {\n    ppp_pcb *pcb = f->pcb;\n    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;\n    u_char citype, cilen, *next;\n#ifdef IPV6CP_COMP\n    u_short cishort;\n#endif /* IPV6CP_COMP */\n    eui64_t ifaceid;\n    ipv6cp_options no;        /* options we've seen Naks for */\n    ipv6cp_options try_;    /* options to request next time */\n\n    BZERO(&no, sizeof(no));\n    try_ = *go;\n\n    /*\n     * Any Nak'd CIs must be in exactly the same order that we sent.\n     * Check packet length and CI length at each step.\n     * If we find any deviations, then this packet is bad.\n     */\n#define NAKCIIFACEID(opt, neg, code) \\\n    if (go->neg && \\\n    len >= (cilen = CILEN_IFACEID) && \\\n    p[1] == cilen && \\\n    p[0] == opt) { \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    eui64_get(ifaceid, p); \\\n    no.neg = 1; \\\n    code \\\n    }\n\n#ifdef IPV6CP_COMP\n#define NAKCIVJ(opt, neg, code) \\\n    if (go->neg && \\\n    ((cilen = p[1]) == CILEN_COMPRESS) && \\\n    len >= cilen && \\\n    p[0] == opt) { \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    no.neg = 1; \\\n        code \\\n    }\n#endif /* IPV6CP_COMP */\n\n    /*\n     * Accept the peer's idea of {our,his} interface identifier, if different\n     * from our idea, only if the accept_{local,remote} flag is set.\n     */\n    NAKCIIFACEID(CI_IFACEID, neg_ifaceid,\n         if (treat_as_reject) {\n             try_.neg_ifaceid = 0;\n         } else if (go->accept_local) {\n             while (eui64_iszero(ifaceid) || \n                eui64_equals(ifaceid, go->hisid)) /* bad luck */\n             eui64_magic(ifaceid);\n             try_.ourid = ifaceid;\n             IPV6CPDEBUG((\"local LL address %s\", llv6_ntoa(ifaceid)));\n         }\n         );\n\n#ifdef IPV6CP_COMP\n    NAKCIVJ(CI_COMPRESSTYPE, neg_vj,\n        {\n        if (cishort == IPV6CP_COMP && !treat_as_reject) {\n            try_.vj_protocol = cishort;\n        } else {\n            try_.neg_vj = 0;\n        }\n        }\n        );\n#endif /* IPV6CP_COMP */\n\n    /*\n     * There may be remaining CIs, if the peer is requesting negotiation\n     * on an option that we didn't include in our request packet.\n     * If they want to negotiate about interface identifier, we comply.\n     * If they want us to ask for compression, we refuse.\n     */\n    while (len >= CILEN_VOID) {\n    GETCHAR(citype, p);\n    GETCHAR(cilen, p);\n    if ( cilen < CILEN_VOID || (len -= cilen) < 0 )\n        goto bad;\n    next = p + cilen - 2;\n\n    switch (citype) {\n#ifdef IPV6CP_COMP\n    case CI_COMPRESSTYPE:\n        if (go->neg_vj || no.neg_vj ||\n        (cilen != CILEN_COMPRESS))\n        goto bad;\n        no.neg_vj = 1;\n        break;\n#endif /* IPV6CP_COMP */\n    case CI_IFACEID:\n        if (go->neg_ifaceid || no.neg_ifaceid || cilen != CILEN_IFACEID)\n        goto bad;\n        try_.neg_ifaceid = 1;\n        eui64_get(ifaceid, p);\n        if (go->accept_local) {\n        while (eui64_iszero(ifaceid) || \n               eui64_equals(ifaceid, go->hisid)) /* bad luck */\n            eui64_magic(ifaceid);\n        try_.ourid = ifaceid;\n        }\n        no.neg_ifaceid = 1;\n        break;\n    default:\n        break;\n    }\n    p = next;\n    }\n\n    /* If there is still anything left, this packet is bad. */\n    if (len != 0)\n    goto bad;\n\n    /*\n     * OK, the Nak is good.  Now we can update state.\n     */\n    if (f->state != PPP_FSM_OPENED)\n    *go = try_;\n\n    return 1;\n\nbad:\n    IPV6CPDEBUG((\"ipv6cp_nakci: received bad Nak!\"));\n    return 0;\n}\n\n\n/*\n * ipv6cp_rejci - Reject some of our CIs.\n */\nstatic int ipv6cp_rejci(fsm *f, u_char *p, int len) {\n    ppp_pcb *pcb = f->pcb;\n    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;\n    u_char cilen;\n#ifdef IPV6CP_COMP\n    u_short cishort;\n#endif /* IPV6CP_COMP */\n    eui64_t ifaceid;\n    ipv6cp_options try_;        /* options to request next time */\n\n    try_ = *go;\n    /*\n     * Any Rejected CIs must be in exactly the same order that we sent.\n     * Check packet length and CI length at each step.\n     * If we find any deviations, then this packet is bad.\n     */\n#define REJCIIFACEID(opt, neg, val1) \\\n    if (go->neg && \\\n    len >= (cilen = CILEN_IFACEID) && \\\n    p[1] == cilen && \\\n    p[0] == opt) { \\\n    len -= cilen; \\\n    INCPTR(2, p); \\\n    eui64_get(ifaceid, p); \\\n    /* Check rejected value. */ \\\n    if (! eui64_equals(ifaceid, val1)) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    }\n\n#ifdef IPV6CP_COMP\n#define REJCIVJ(opt, neg, val) \\\n    if (go->neg && \\\n    p[1] == CILEN_COMPRESS && \\\n    len >= p[1] && \\\n    p[0] == opt) { \\\n    len -= p[1]; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    /* Check rejected value. */  \\\n    if (cishort != val) \\\n        goto bad; \\\n    try_.neg = 0; \\\n     }\n#endif /* IPV6CP_COMP */\n\n    REJCIIFACEID(CI_IFACEID, neg_ifaceid, go->ourid);\n\n#ifdef IPV6CP_COMP\n    REJCIVJ(CI_COMPRESSTYPE, neg_vj, go->vj_protocol);\n#endif /* IPV6CP_COMP */\n\n    /*\n     * If there are any remaining CIs, then this packet is bad.\n     */\n    if (len != 0)\n    goto bad;\n    /*\n     * Now we can update state.\n     */\n    if (f->state != PPP_FSM_OPENED)\n    *go = try_;\n    return 1;\n\nbad:\n    IPV6CPDEBUG((\"ipv6cp_rejci: received bad Reject!\"));\n    return 0;\n}\n\n\n/*\n * ipv6cp_reqci - Check the peer's requested CIs and send appropriate response.\n *\n * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified\n * appropriately.  If reject_if_disagree is non-zero, doesn't return\n * CONFNAK; returns CONFREJ if it can't return CONFACK.\n *\n * inp = Requested CIs\n * len = Length of requested CIs\n *\n */\nstatic int ipv6cp_reqci(fsm *f, u_char *inp, int *len, int reject_if_disagree) {\n    ppp_pcb *pcb = f->pcb;\n    ipv6cp_options *wo = &pcb->ipv6cp_wantoptions;\n    ipv6cp_options *ho = &pcb->ipv6cp_hisoptions;\n    ipv6cp_options *ao = &pcb->ipv6cp_allowoptions;\n    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;\n    u_char *cip, *next;        /* Pointer to current and next CIs */\n    u_short cilen, citype;    /* Parsed len, type */\n#ifdef IPV6CP_COMP\n    u_short cishort;        /* Parsed short value */\n#endif /* IPV6CP_COMP */\n    eui64_t ifaceid;        /* Parsed interface identifier */\n    int rc = CONFACK;        /* Final packet return code */\n    int orc;            /* Individual option return code */\n    u_char *p;            /* Pointer to next char to parse */\n    u_char *ucp = inp;        /* Pointer to current output char */\n    int l = *len;        /* Length left */\n\n    /*\n     * Reset all his options.\n     */\n    BZERO(ho, sizeof(*ho));\n    \n    /*\n     * Process all his options.\n     */\n    next = inp;\n    while (l) {\n    orc = CONFACK;            /* Assume success */\n    cip = p = next;            /* Remember begining of CI */\n    if (l < 2 ||            /* Not enough data for CI header or */\n        p[1] < 2 ||            /*  CI length too small or */\n        p[1] > l) {            /*  CI length too big? */\n        IPV6CPDEBUG((\"ipv6cp_reqci: bad CI length!\"));\n        orc = CONFREJ;        /* Reject bad CI */\n        cilen = l;            /* Reject till end of packet */\n        l = 0;            /* Don't loop again */\n        goto endswitch;\n    }\n    GETCHAR(citype, p);        /* Parse CI type */\n    GETCHAR(cilen, p);        /* Parse CI length */\n    l -= cilen;            /* Adjust remaining length */\n    next += cilen;            /* Step to next CI */\n\n    switch (citype) {        /* Check CI type */\n    case CI_IFACEID:\n        IPV6CPDEBUG((\"ipv6cp: received interface identifier \"));\n\n        if (!ao->neg_ifaceid ||\n        cilen != CILEN_IFACEID) {    /* Check CI length */\n        orc = CONFREJ;        /* Reject CI */\n        break;\n        }\n\n        /*\n         * If he has no interface identifier, or if we both have same \n         * identifier then NAK it with new idea.\n         * In particular, if we don't know his identifier, but he does,\n         * then accept it.\n         */\n        eui64_get(ifaceid, p);\n        IPV6CPDEBUG((\"(%s)\", llv6_ntoa(ifaceid)));\n        if (eui64_iszero(ifaceid) && eui64_iszero(go->ourid)) {\n        orc = CONFREJ;        /* Reject CI */\n        break;\n        }\n        if (!eui64_iszero(wo->hisid) && \n        !eui64_equals(ifaceid, wo->hisid) && \n        eui64_iszero(go->hisid)) {\n            \n        orc = CONFNAK;\n        ifaceid = wo->hisid;\n        go->hisid = ifaceid;\n        DECPTR(sizeof(ifaceid), p);\n        eui64_put(ifaceid, p);\n        } else\n        if (eui64_iszero(ifaceid) || eui64_equals(ifaceid, go->ourid)) {\n        orc = CONFNAK;\n        if (eui64_iszero(go->hisid))    /* first time, try option */\n            ifaceid = wo->hisid;\n        while (eui64_iszero(ifaceid) || \n               eui64_equals(ifaceid, go->ourid)) /* bad luck */\n            eui64_magic(ifaceid);\n        go->hisid = ifaceid;\n        DECPTR(sizeof(ifaceid), p);\n        eui64_put(ifaceid, p);\n        }\n\n        ho->neg_ifaceid = 1;\n        ho->hisid = ifaceid;\n        break;\n\n#ifdef IPV6CP_COMP\n    case CI_COMPRESSTYPE:\n        IPV6CPDEBUG((\"ipv6cp: received COMPRESSTYPE \"));\n        if (!ao->neg_vj ||\n        (cilen != CILEN_COMPRESS)) {\n        orc = CONFREJ;\n        break;\n        }\n        GETSHORT(cishort, p);\n        IPV6CPDEBUG((\"(%d)\", cishort));\n\n        if (!(cishort == IPV6CP_COMP)) {\n        orc = CONFREJ;\n        break;\n        }\n\n        ho->neg_vj = 1;\n        ho->vj_protocol = cishort;\n        break;\n#endif /* IPV6CP_COMP */\n\n    default:\n        orc = CONFREJ;\n        break;\n    }\n\nendswitch:\n    IPV6CPDEBUG((\" (%s)\\n\", CODENAME(orc)));\n\n    if (orc == CONFACK &&        /* Good CI */\n        rc != CONFACK)        /*  but prior CI wasnt? */\n        continue;            /* Don't send this one */\n\n    if (orc == CONFNAK) {        /* Nak this CI? */\n        if (reject_if_disagree)    /* Getting fed up with sending NAKs? */\n        orc = CONFREJ;        /* Get tough if so */\n        else {\n        if (rc == CONFREJ)    /* Rejecting prior CI? */\n            continue;        /* Don't send this one */\n        if (rc == CONFACK) {    /* Ack'd all prior CIs? */\n            rc = CONFNAK;    /* Not anymore... */\n            ucp = inp;        /* Backup */\n        }\n        }\n    }\n\n    if (orc == CONFREJ &&        /* Reject this CI */\n        rc != CONFREJ) {        /*  but no prior ones? */\n        rc = CONFREJ;\n        ucp = inp;            /* Backup */\n    }\n\n    /* Need to move CI? */\n    if (ucp != cip)\n        MEMCPY(ucp, cip, cilen);    /* Move it */\n\n    /* Update output pointer */\n    INCPTR(cilen, ucp);\n    }\n\n    /*\n     * If we aren't rejecting this packet, and we want to negotiate\n     * their identifier and they didn't send their identifier, then we\n     * send a NAK with a CI_IFACEID option appended.  We assume the\n     * input buffer is long enough that we can append the extra\n     * option safely.\n     */\n    if (rc != CONFREJ && !ho->neg_ifaceid &&\n    wo->req_ifaceid && !reject_if_disagree) {\n    if (rc == CONFACK) {\n        rc = CONFNAK;\n        ucp = inp;                /* reset pointer */\n        wo->req_ifaceid = 0;        /* don't ask again */\n    }\n    PUTCHAR(CI_IFACEID, ucp);\n    PUTCHAR(CILEN_IFACEID, ucp);\n    eui64_put(wo->hisid, ucp);\n    }\n\n    *len = ucp - inp;            /* Compute output length */\n    IPV6CPDEBUG((\"ipv6cp: returning Configure-%s\", CODENAME(rc)));\n    return (rc);            /* Return final code */\n}\n\n#if PPP_OPTIONS\n/*\n * ipv6_check_options - check that any IP-related options are OK,\n * and assign appropriate defaults.\n */\nstatic void ipv6_check_options() {\n    ipv6cp_options *wo = &ipv6cp_wantoptions[0];\n\n    if (!ipv6cp_protent.enabled_flag)\n    return;\n\n    /*\n     * Persistent link-local id is only used when user has not explicitly\n     * configure/hard-code the id\n     */\n    if ((wo->use_persistent) && (!wo->opt_local) && (!wo->opt_remote)) {\n\n    /* \n     * On systems where there are no Ethernet interfaces used, there\n     * may be other ways to obtain a persistent id. Right now, it\n     * will fall back to using magic [see eui64_magic] below when\n     * an EUI-48 from MAC address can't be obtained. Other possibilities\n     * include obtaining EEPROM serial numbers, or some other unique\n     * yet persistent number. On Sparc platforms, this is possible,\n     * but too bad there's no standards yet for x86 machines.\n     */\n    if (ether_to_eui64(&wo->ourid)) {\n        wo->opt_local = 1;\n    }\n    }\n\n    if (!wo->opt_local) {    /* init interface identifier */\n    if (wo->use_ip && eui64_iszero(wo->ourid)) {\n        eui64_setlo32(wo->ourid, lwip_ntohl(ipcp_wantoptions[0].ouraddr));\n        if (!eui64_iszero(wo->ourid))\n        wo->opt_local = 1;\n    }\n    \n    while (eui64_iszero(wo->ourid))\n        eui64_magic(wo->ourid);\n    }\n\n    if (!wo->opt_remote) {\n    if (wo->use_ip && eui64_iszero(wo->hisid)) {\n        eui64_setlo32(wo->hisid, lwip_ntohl(ipcp_wantoptions[0].hisaddr));\n        if (!eui64_iszero(wo->hisid))\n        wo->opt_remote = 1;\n    }\n    }\n\n    if (demand && (eui64_iszero(wo->ourid) || eui64_iszero(wo->hisid))) {\n    option_error(\"local/remote LL address required for demand-dialling\\n\");\n    exit(1);\n    }\n}\n#endif /* PPP_OPTIONS */\n\n#if DEMAND_SUPPORT\n/*\n * ipv6_demand_conf - configure the interface as though\n * IPV6CP were up, for use with dial-on-demand.\n */\nstatic int ipv6_demand_conf(int u) {\n    ipv6cp_options *wo = &ipv6cp_wantoptions[u];\n\n    if (!sif6up(u))\n    return 0;\n\n    if (!sif6addr(u, wo->ourid, wo->hisid))\n    return 0;\n\n    if (!sifnpmode(u, PPP_IPV6, NPMODE_QUEUE))\n    return 0;\n\n    ppp_notice(\"ipv6_demand_conf\");\n    ppp_notice(\"local  LL address %s\", llv6_ntoa(wo->ourid));\n    ppp_notice(\"remote LL address %s\", llv6_ntoa(wo->hisid));\n\n    return 1;\n}\n#endif /* DEMAND_SUPPORT */\n\n\n/*\n * ipv6cp_up - IPV6CP has come UP.\n *\n * Configure the IPv6 network interface appropriately and bring it up.\n */\nstatic void ipv6cp_up(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    ipv6cp_options *wo = &pcb->ipv6cp_wantoptions;\n    ipv6cp_options *ho = &pcb->ipv6cp_hisoptions;\n    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;\n\n    IPV6CPDEBUG((\"ipv6cp: up\"));\n\n    /*\n     * We must have a non-zero LL address for both ends of the link.\n     */\n    if (!ho->neg_ifaceid)\n    ho->hisid = wo->hisid;\n\n#if 0 /* UNUSED */\n    if(!no_ifaceid_neg) {\n#endif /* UNUSED */\n    if (eui64_iszero(ho->hisid)) {\n        ppp_error(\"Could not determine remote LL address\");\n        ipv6cp_close(f->pcb, \"Could not determine remote LL address\");\n        return;\n    }\n    if (eui64_iszero(go->ourid)) {\n        ppp_error(\"Could not determine local LL address\");\n        ipv6cp_close(f->pcb, \"Could not determine local LL address\");\n        return;\n    }\n    if (eui64_equals(go->ourid, ho->hisid)) {\n        ppp_error(\"local and remote LL addresses are equal\");\n        ipv6cp_close(f->pcb, \"local and remote LL addresses are equal\");\n        return;\n    }\n#if 0 /* UNUSED */\n    }\n#endif /* UNUSED */\n#if 0 /* UNUSED */\n    script_setenv(\"LLLOCAL\", llv6_ntoa(go->ourid), 0);\n    script_setenv(\"LLREMOTE\", llv6_ntoa(ho->hisid), 0);\n#endif /* UNUSED */\n\n#ifdef IPV6CP_COMP\n    /* set tcp compression */\n    sif6comp(f->unit, ho->neg_vj);\n#endif\n\n#if DEMAND_SUPPORT\n    /*\n     * If we are doing dial-on-demand, the interface is already\n     * configured, so we put out any saved-up packets, then set the\n     * interface to pass IPv6 packets.\n     */\n    if (demand) {\n    if (! eui64_equals(go->ourid, wo->ourid) || \n        ! eui64_equals(ho->hisid, wo->hisid)) {\n        if (! eui64_equals(go->ourid, wo->ourid))\n        warn(\"Local LL address changed to %s\", \n             llv6_ntoa(go->ourid));\n        if (! eui64_equals(ho->hisid, wo->hisid))\n        warn(\"Remote LL address changed to %s\", \n             llv6_ntoa(ho->hisid));\n        ipv6cp_clear_addrs(f->pcb, go->ourid, ho->hisid);\n\n        /* Set the interface to the new addresses */\n        if (!sif6addr(f->pcb, go->ourid, ho->hisid)) {\n        if (debug)\n            warn(\"sif6addr failed\");\n        ipv6cp_close(f->unit, \"Interface configuration failed\");\n        return;\n        }\n\n    }\n    demand_rexmit(PPP_IPV6);\n    sifnpmode(f->unit, PPP_IPV6, NPMODE_PASS);\n\n    } else\n#endif /* DEMAND_SUPPORT */\n    {\n    /*\n     * Set LL addresses\n     */\n    if (!sif6addr(f->pcb, go->ourid, ho->hisid)) {\n        PPPDEBUG(LOG_DEBUG, (\"sif6addr failed\"));\n        ipv6cp_close(f->pcb, \"Interface configuration failed\");\n        return;\n    }\n\n    /* bring the interface up for IPv6 */\n    if (!sif6up(f->pcb)) {\n        PPPDEBUG(LOG_DEBUG, (\"sif6up failed (IPV6)\"));\n        ipv6cp_close(f->pcb, \"Interface configuration failed\");\n        return;\n    }\n#if DEMAND_SUPPORT\n    sifnpmode(f->pcb, PPP_IPV6, NPMODE_PASS);\n#endif /* DEMAND_SUPPORT */\n\n    ppp_notice(\"local  LL address %s\", llv6_ntoa(go->ourid));\n    ppp_notice(\"remote LL address %s\", llv6_ntoa(ho->hisid));\n    }\n\n    np_up(f->pcb, PPP_IPV6);\n    pcb->ipv6cp_is_up = 1;\n\n#if 0 /* UNUSED */\n    /*\n     * Execute the ipv6-up script, like this:\n     *    /etc/ppp/ipv6-up interface tty speed local-LL remote-LL\n     */\n    if (ipv6cp_script_state == s_down && ipv6cp_script_pid == 0) {\n    ipv6cp_script_state = s_up;\n    ipv6cp_script(_PATH_IPV6UP);\n    }\n#endif /* UNUSED */\n}\n\n\n/*\n * ipv6cp_down - IPV6CP has gone DOWN.\n *\n * Take the IPv6 network interface down, clear its addresses\n * and delete routes through it.\n */\nstatic void ipv6cp_down(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    ipv6cp_options *go = &pcb->ipv6cp_gotoptions;\n    ipv6cp_options *ho = &pcb->ipv6cp_hisoptions;\n\n    IPV6CPDEBUG((\"ipv6cp: down\"));\n#if PPP_STATS_SUPPORT\n    update_link_stats(f->unit);\n#endif /* PPP_STATS_SUPPORT */\n    if (pcb->ipv6cp_is_up) {\n    pcb->ipv6cp_is_up = 0;\n    np_down(f->pcb, PPP_IPV6);\n    }\n#ifdef IPV6CP_COMP\n    sif6comp(f->unit, 0);\n#endif\n\n#if DEMAND_SUPPORT\n    /*\n     * If we are doing dial-on-demand, set the interface\n     * to queue up outgoing packets (for now).\n     */\n    if (demand) {\n    sifnpmode(f->pcb, PPP_IPV6, NPMODE_QUEUE);\n    } else\n#endif /* DEMAND_SUPPORT */\n    {\n#if DEMAND_SUPPORT\n    sifnpmode(f->pcb, PPP_IPV6, NPMODE_DROP);\n#endif /* DEMAND_SUPPORT */\n    ipv6cp_clear_addrs(f->pcb,\n               go->ourid,\n               ho->hisid);\n    sif6down(f->pcb);\n    }\n\n#if 0 /* UNUSED */\n    /* Execute the ipv6-down script */\n    if (ipv6cp_script_state == s_up && ipv6cp_script_pid == 0) {\n    ipv6cp_script_state = s_down;\n    ipv6cp_script(_PATH_IPV6DOWN);\n    }\n#endif /* UNUSED */\n}\n\n\n/*\n * ipv6cp_clear_addrs() - clear the interface addresses, routes,\n * proxy neighbour discovery entries, etc.\n */\nstatic void ipv6cp_clear_addrs(ppp_pcb *pcb, eui64_t ourid, eui64_t hisid) {\n    cif6addr(pcb, ourid, hisid);\n}\n\n\n/*\n * ipv6cp_finished - possibly shut down the lower layers.\n */\nstatic void ipv6cp_finished(fsm *f) {\n    np_finished(f->pcb, PPP_IPV6);\n}\n\n\n#if 0 /* UNUSED */\n/*\n * ipv6cp_script_done - called when the ipv6-up or ipv6-down script\n * has finished.\n */\nstatic void\nipv6cp_script_done(arg)\n    void *arg;\n{\n    ipv6cp_script_pid = 0;\n    switch (ipv6cp_script_state) {\n    case s_up:\n    if (ipv6cp_fsm[0].state != PPP_FSM_OPENED) {\n        ipv6cp_script_state = s_down;\n        ipv6cp_script(_PATH_IPV6DOWN);\n    }\n    break;\n    case s_down:\n    if (ipv6cp_fsm[0].state == PPP_FSM_OPENED) {\n        ipv6cp_script_state = s_up;\n        ipv6cp_script(_PATH_IPV6UP);\n    }\n    break;\n    }\n}\n\n\n/*\n * ipv6cp_script - Execute a script with arguments\n * interface-name tty-name speed local-LL remote-LL.\n */\nstatic void\nipv6cp_script(script)\n    char *script;\n{\n    char strspeed[32], strlocal[32], strremote[32];\n    char *argv[8];\n\n    sprintf(strspeed, \"%d\", baud_rate);\n    strcpy(strlocal, llv6_ntoa(ipv6cp_gotoptions[0].ourid));\n    strcpy(strremote, llv6_ntoa(ipv6cp_hisoptions[0].hisid));\n\n    argv[0] = script;\n    argv[1] = ifname;\n    argv[2] = devnam;\n    argv[3] = strspeed;\n    argv[4] = strlocal;\n    argv[5] = strremote;\n    argv[6] = ipparam;\n    argv[7] = NULL;\n\n    ipv6cp_script_pid = run_program(script, argv, 0, ipv6cp_script_done,\n                    NULL, 0);\n}\n#endif /* UNUSED */\n\n#if PRINTPKT_SUPPORT\n/*\n * ipv6cp_printpkt - print the contents of an IPV6CP packet.\n */\nstatic const char* const ipv6cp_codenames[] = {\n    \"ConfReq\", \"ConfAck\", \"ConfNak\", \"ConfRej\",\n    \"TermReq\", \"TermAck\", \"CodeRej\"\n};\n\nstatic int ipv6cp_printpkt(const u_char *p, int plen,\n        void (*printer)(void *, const char *, ...), void *arg) {\n    int code, id, len, olen;\n    const u_char *pstart, *optend;\n#ifdef IPV6CP_COMP\n    u_short cishort;\n#endif /* IPV6CP_COMP */\n    eui64_t ifaceid;\n\n    if (plen < HEADERLEN)\n    return 0;\n    pstart = p;\n    GETCHAR(code, p);\n    GETCHAR(id, p);\n    GETSHORT(len, p);\n    if (len < HEADERLEN || len > plen)\n    return 0;\n\n    if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(ipv6cp_codenames))\n    printer(arg, \" %s\", ipv6cp_codenames[code-1]);\n    else\n    printer(arg, \" code=0x%x\", code);\n    printer(arg, \" id=0x%x\", id);\n    len -= HEADERLEN;\n    switch (code) {\n    case CONFREQ:\n    case CONFACK:\n    case CONFNAK:\n    case CONFREJ:\n    /* print option list */\n    while (len >= 2) {\n        GETCHAR(code, p);\n        GETCHAR(olen, p);\n        p -= 2;\n        if (olen < 2 || olen > len) {\n        break;\n        }\n        printer(arg, \" <\");\n        len -= olen;\n        optend = p + olen;\n        switch (code) {\n#ifdef IPV6CP_COMP\n        case CI_COMPRESSTYPE:\n        if (olen >= CILEN_COMPRESS) {\n            p += 2;\n            GETSHORT(cishort, p);\n            printer(arg, \"compress \");\n            printer(arg, \"0x%x\", cishort);\n        }\n        break;\n#endif /* IPV6CP_COMP */\n        case CI_IFACEID:\n        if (olen == CILEN_IFACEID) {\n            p += 2;\n            eui64_get(ifaceid, p);\n            printer(arg, \"addr %s\", llv6_ntoa(ifaceid));\n        }\n        break;\n        default:\n        break;\n        }\n        while (p < optend) {\n        GETCHAR(code, p);\n        printer(arg, \" %.2x\", code);\n        }\n        printer(arg, \">\");\n    }\n    break;\n\n    case TERMACK:\n    case TERMREQ:\n    if (len > 0 && *p >= ' ' && *p < 0x7f) {\n        printer(arg, \" \");\n        ppp_print_string(p, len, printer, arg);\n        p += len;\n        len = 0;\n    }\n    break;\n    default:\n    break;\n    }\n\n    /* print the rest of the bytes in the packet */\n    for (; len > 0; --len) {\n    GETCHAR(code, p);\n    printer(arg, \" %.2x\", code);\n    }\n\n    return p - pstart;\n}\n#endif /* PRINTPKT_SUPPORT */\n\n#if DEMAND_SUPPORT\n/*\n * ipv6_active_pkt - see if this IP packet is worth bringing the link up for.\n * We don't bring the link up for IP fragments or for TCP FIN packets\n * with no data.\n */\n#define IP6_HDRLEN    40    /* bytes */\n#define IP6_NHDR_FRAG    44    /* fragment IPv6 header */\n#define TCP_HDRLEN    20\n#define TH_FIN        0x01\n\n/*\n * We use these macros because the IP header may be at an odd address,\n * and some compilers might use word loads to get th_off or ip_hl.\n */\n\n#define get_ip6nh(x)    (((unsigned char *)(x))[6])\n#define get_tcpoff(x)    (((unsigned char *)(x))[12] >> 4)\n#define get_tcpflags(x)    (((unsigned char *)(x))[13])\n\nstatic int ipv6_active_pkt(u_char *pkt, int len) {\n    u_char *tcp;\n\n    len -= PPP_HDRLEN;\n    pkt += PPP_HDRLEN;\n    if (len < IP6_HDRLEN)\n    return 0;\n    if (get_ip6nh(pkt) == IP6_NHDR_FRAG)\n    return 0;\n    if (get_ip6nh(pkt) != IPPROTO_TCP)\n    return 1;\n    if (len < IP6_HDRLEN + TCP_HDRLEN)\n    return 0;\n    tcp = pkt + IP6_HDRLEN;\n    if ((get_tcpflags(tcp) & TH_FIN) != 0 && len == IP6_HDRLEN + get_tcpoff(tcp) * 4)\n    return 0;\n    return 1;\n}\n#endif /* DEMAND_SUPPORT */\n\n#endif /* PPP_SUPPORT && PPP_IPV6_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/lcp.c",
    "content": "/*\n * lcp.c - PPP Link Control Protocol.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n/*\n * @todo:\n */\n\n#if 0 /* UNUSED */\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#endif /* UNUSED */\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/fsm.h\"\n#include \"netif/ppp/lcp.h\"\n#if CHAP_SUPPORT\n#include \"netif/ppp/chap-new.h\"\n#endif /* CHAP_SUPPORT */\n#include \"netif/ppp/magic.h\"\n\n/*\n * When the link comes up we want to be able to wait for a short while,\n * or until seeing some input from the peer, before starting to send\n * configure-requests.  We do this by delaying the fsm_lowerup call.\n */\n/* steal a bit in fsm flags word */\n#define DELAYED_UP    0x80\n\nstatic void lcp_delayed_up(void *arg);\n\n/*\n * LCP-related command-line options.\n */\n#if 0 /* UNUSED */\nint    lcp_echo_interval = 0;     /* Interval between LCP echo-requests */\nint    lcp_echo_fails = 0;    /* Tolerance to unanswered echo-requests */\n#endif /* UNUSED */\n\n#if 0 /* UNUSED */\n/* options */\nstatic u_int lcp_echo_interval      = LCP_ECHOINTERVAL; /* Interval between LCP echo-requests */\nstatic u_int lcp_echo_fails         = LCP_MAXECHOFAILS; /* Tolerance to unanswered echo-requests */\n#endif /* UNUSED */\n\n#if 0 /* UNUSED */\n#if PPP_LCP_ADAPTIVE\nbool    lcp_echo_adaptive = 0;    /* request echo only if the link was idle */\n#endif\nbool    lax_recv = 0;        /* accept control chars in asyncmap */\nbool    noendpoint = 0;        /* don't send/accept endpoint discriminator */\n#endif /* UNUSED */\n\n#if PPP_OPTIONS\nstatic int noopt (char **);\n#endif /* PPP_OPTIONS */\n\n#ifdef HAVE_MULTILINK\nstatic int setendpoint (char **);\nstatic void printendpoint (option_t *, void (*)(void *, char *, ...),\n                   void *);\n#endif /* HAVE_MULTILINK */\n\n#if PPP_OPTIONS\nstatic option_t lcp_option_list[] = {\n    /* LCP options */\n    { \"-all\", o_special_noarg, (void *)noopt,\n      \"Don't request/allow any LCP options\" },\n\n    { \"noaccomp\", o_bool, &lcp_wantoptions[0].neg_accompression,\n      \"Disable address/control compression\",\n      OPT_A2CLR, &lcp_allowoptions[0].neg_accompression },\n    { \"-ac\", o_bool, &lcp_wantoptions[0].neg_accompression,\n      \"Disable address/control compression\",\n      OPT_ALIAS | OPT_A2CLR, &lcp_allowoptions[0].neg_accompression },\n\n    { \"asyncmap\", o_uint32, &lcp_wantoptions[0].asyncmap,\n      \"Set asyncmap (for received packets)\",\n      OPT_OR, &lcp_wantoptions[0].neg_asyncmap },\n    { \"-as\", o_uint32, &lcp_wantoptions[0].asyncmap,\n      \"Set asyncmap (for received packets)\",\n      OPT_ALIAS | OPT_OR, &lcp_wantoptions[0].neg_asyncmap },\n    { \"default-asyncmap\", o_uint32, &lcp_wantoptions[0].asyncmap,\n      \"Disable asyncmap negotiation\",\n      OPT_OR | OPT_NOARG | OPT_VAL(~0U) | OPT_A2CLR,\n      &lcp_allowoptions[0].neg_asyncmap },\n    { \"-am\", o_uint32, &lcp_wantoptions[0].asyncmap,\n      \"Disable asyncmap negotiation\",\n      OPT_ALIAS | OPT_OR | OPT_NOARG | OPT_VAL(~0U) | OPT_A2CLR,\n      &lcp_allowoptions[0].neg_asyncmap },\n\n    { \"nomagic\", o_bool, &lcp_wantoptions[0].neg_magicnumber,\n      \"Disable magic number negotiation (looped-back line detection)\",\n      OPT_A2CLR, &lcp_allowoptions[0].neg_magicnumber },\n    { \"-mn\", o_bool, &lcp_wantoptions[0].neg_magicnumber,\n      \"Disable magic number negotiation (looped-back line detection)\",\n      OPT_ALIAS | OPT_A2CLR, &lcp_allowoptions[0].neg_magicnumber },\n\n    { \"mru\", o_int, &lcp_wantoptions[0].mru,\n      \"Set MRU (maximum received packet size) for negotiation\",\n      OPT_PRIO, &lcp_wantoptions[0].neg_mru },\n    { \"default-mru\", o_bool, &lcp_wantoptions[0].neg_mru,\n      \"Disable MRU negotiation (use default 1500)\",\n      OPT_PRIOSUB | OPT_A2CLR, &lcp_allowoptions[0].neg_mru },\n    { \"-mru\", o_bool, &lcp_wantoptions[0].neg_mru,\n      \"Disable MRU negotiation (use default 1500)\",\n      OPT_ALIAS | OPT_PRIOSUB | OPT_A2CLR, &lcp_allowoptions[0].neg_mru },\n\n    { \"mtu\", o_int, &lcp_allowoptions[0].mru,\n      \"Set our MTU\", OPT_LIMITS, NULL, MAXMRU, MINMRU },\n\n    { \"nopcomp\", o_bool, &lcp_wantoptions[0].neg_pcompression,\n      \"Disable protocol field compression\",\n      OPT_A2CLR, &lcp_allowoptions[0].neg_pcompression },\n    { \"-pc\", o_bool, &lcp_wantoptions[0].neg_pcompression,\n      \"Disable protocol field compression\",\n      OPT_ALIAS | OPT_A2CLR, &lcp_allowoptions[0].neg_pcompression },\n\n    { \"passive\", o_bool, &lcp_wantoptions[0].passive,\n      \"Set passive mode\", 1 },\n    { \"-p\", o_bool, &lcp_wantoptions[0].passive,\n      \"Set passive mode\", OPT_ALIAS | 1 },\n\n    { \"silent\", o_bool, &lcp_wantoptions[0].silent,\n      \"Set silent mode\", 1 },\n\n    { \"lcp-echo-failure\", o_int, &lcp_echo_fails,\n      \"Set number of consecutive echo failures to indicate link failure\",\n      OPT_PRIO },\n    { \"lcp-echo-interval\", o_int, &lcp_echo_interval,\n      \"Set time in seconds between LCP echo requests\", OPT_PRIO },\n#if PPP_LCP_ADAPTIVE\n    { \"lcp-echo-adaptive\", o_bool, &lcp_echo_adaptive,\n      \"Suppress LCP echo requests if traffic was received\", 1 },\n#endif\n    { \"lcp-restart\", o_int, &lcp_fsm[0].timeouttime,\n      \"Set time in seconds between LCP retransmissions\", OPT_PRIO },\n    { \"lcp-max-terminate\", o_int, &lcp_fsm[0].maxtermtransmits,\n      \"Set maximum number of LCP terminate-request transmissions\", OPT_PRIO },\n    { \"lcp-max-configure\", o_int, &lcp_fsm[0].maxconfreqtransmits,\n      \"Set maximum number of LCP configure-request transmissions\", OPT_PRIO },\n    { \"lcp-max-failure\", o_int, &lcp_fsm[0].maxnakloops,\n      \"Set limit on number of LCP configure-naks\", OPT_PRIO },\n\n    { \"receive-all\", o_bool, &lax_recv,\n      \"Accept all received control characters\", 1 },\n\n#ifdef HAVE_MULTILINK\n    { \"mrru\", o_int, &lcp_wantoptions[0].mrru,\n      \"Maximum received packet size for multilink bundle\",\n      OPT_PRIO, &lcp_wantoptions[0].neg_mrru },\n\n    { \"mpshortseq\", o_bool, &lcp_wantoptions[0].neg_ssnhf,\n      \"Use short sequence numbers in multilink headers\",\n      OPT_PRIO | 1, &lcp_allowoptions[0].neg_ssnhf },\n    { \"nompshortseq\", o_bool, &lcp_wantoptions[0].neg_ssnhf,\n      \"Don't use short sequence numbers in multilink headers\",\n      OPT_PRIOSUB | OPT_A2CLR, &lcp_allowoptions[0].neg_ssnhf },\n\n    { \"endpoint\", o_special, (void *) setendpoint,\n      \"Endpoint discriminator for multilink\",\n      OPT_PRIO | OPT_A2PRINTER, (void *) printendpoint },\n#endif /* HAVE_MULTILINK */\n\n    { \"noendpoint\", o_bool, &noendpoint,\n      \"Don't send or accept multilink endpoint discriminator\", 1 },\n\n    {NULL}\n};\n#endif /* PPP_OPTIONS */\n\n/*\n * Callbacks for fsm code.  (CI = Configuration Information)\n */\nstatic void lcp_resetci(fsm *f);    /* Reset our CI */\nstatic int  lcp_cilen(fsm *f);        /* Return length of our CI */\nstatic void lcp_addci(fsm *f, u_char *ucp, int *lenp); /* Add our CI to pkt */\nstatic int  lcp_ackci(fsm *f, u_char *p, int len); /* Peer ack'd our CI */\nstatic int  lcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject); /* Peer nak'd our CI */\nstatic int  lcp_rejci(fsm *f, u_char *p, int len); /* Peer rej'd our CI */\nstatic int  lcp_reqci(fsm *f, u_char *inp, int *lenp, int reject_if_disagree); /* Rcv peer CI */\nstatic void lcp_up(fsm *f);        /* We're UP */\nstatic void lcp_down(fsm *f);        /* We're DOWN */\nstatic void lcp_starting (fsm *);    /* We need lower layer up */\nstatic void lcp_finished (fsm *);    /* We need lower layer down */\nstatic int  lcp_extcode(fsm *f, int code, int id, u_char *inp, int len);\nstatic void lcp_rprotrej(fsm *f, u_char *inp, int len);\n\n/*\n * routines to send LCP echos to peer\n */\n\nstatic void lcp_echo_lowerup(ppp_pcb *pcb);\nstatic void lcp_echo_lowerdown(ppp_pcb *pcb);\nstatic void LcpEchoTimeout(void *arg);\nstatic void lcp_received_echo_reply(fsm *f, int id, u_char *inp, int len);\nstatic void LcpSendEchoRequest(fsm *f);\nstatic void LcpLinkFailure(fsm *f);\nstatic void LcpEchoCheck(fsm *f);\n\nstatic const fsm_callbacks lcp_callbacks = {    /* LCP callback routines */\n    lcp_resetci,        /* Reset our Configuration Information */\n    lcp_cilen,            /* Length of our Configuration Information */\n    lcp_addci,            /* Add our Configuration Information */\n    lcp_ackci,            /* ACK our Configuration Information */\n    lcp_nakci,            /* NAK our Configuration Information */\n    lcp_rejci,            /* Reject our Configuration Information */\n    lcp_reqci,            /* Request peer's Configuration Information */\n    lcp_up,            /* Called when fsm reaches OPENED state */\n    lcp_down,            /* Called when fsm leaves OPENED state */\n    lcp_starting,        /* Called when we want the lower layer up */\n    lcp_finished,        /* Called when we want the lower layer down */\n    NULL,            /* Called when Protocol-Reject received */\n    NULL,            /* Retransmission is necessary */\n    lcp_extcode,        /* Called to handle LCP-specific codes */\n    \"LCP\"            /* String name of protocol */\n};\n\n/*\n * Protocol entry points.\n * Some of these are called directly.\n */\n\nstatic void lcp_init(ppp_pcb *pcb);\nstatic void lcp_input(ppp_pcb *pcb, u_char *p, int len);\nstatic void lcp_protrej(ppp_pcb *pcb);\n#if PRINTPKT_SUPPORT\nstatic int lcp_printpkt(const u_char *p, int plen,\n        void (*printer) (void *, const char *, ...), void *arg);\n#endif /* PRINTPKT_SUPPORT */\n\nconst struct protent lcp_protent = {\n    PPP_LCP,\n    lcp_init,\n    lcp_input,\n    lcp_protrej,\n    lcp_lowerup,\n    lcp_lowerdown,\n    lcp_open,\n    lcp_close,\n#if PRINTPKT_SUPPORT\n    lcp_printpkt,\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_DATAINPUT\n    NULL,\n#endif /* PPP_DATAINPUT */\n#if PRINTPKT_SUPPORT\n    \"LCP\",\n    NULL,\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_OPTIONS\n    lcp_option_list,\n    NULL,\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\n    NULL,\n    NULL\n#endif /* DEMAND_SUPPORT */\n};\n\n/*\n * Length of each type of configuration option (in octets)\n */\n#define CILEN_VOID    2\n#define CILEN_CHAR    3\n#define CILEN_SHORT    4    /* CILEN_VOID + 2 */\n#if CHAP_SUPPORT\n#define CILEN_CHAP    5    /* CILEN_VOID + 2 + 1 */\n#endif /* CHAP_SUPPORT */\n#define CILEN_LONG    6    /* CILEN_VOID + 4 */\n#if LQR_SUPPORT\n#define CILEN_LQR    8    /* CILEN_VOID + 2 + 4 */\n#endif /* LQR_SUPPORT */\n#define CILEN_CBCP    3\n\n#define CODENAME(x)    ((x) == CONFACK ? \"ACK\" : \\\n             (x) == CONFNAK ? \"NAK\" : \"REJ\")\n\n#if PPP_OPTIONS\n/*\n * noopt - Disable all options (why?).\n */\nstatic int\nnoopt(argv)\n    char **argv;\n{\n    BZERO((char *) &lcp_wantoptions[0], sizeof (struct lcp_options));\n    BZERO((char *) &lcp_allowoptions[0], sizeof (struct lcp_options));\n\n    return (1);\n}\n#endif /* PPP_OPTIONS */\n\n#ifdef HAVE_MULTILINK\nstatic int\nsetendpoint(argv)\n    char **argv;\n{\n    if (str_to_epdisc(&lcp_wantoptions[0].endpoint, *argv)) {\n    lcp_wantoptions[0].neg_endpoint = 1;\n    return 1;\n    }\n    option_error(\"Can't parse '%s' as an endpoint discriminator\", *argv);\n    return 0;\n}\n\nstatic void\nprintendpoint(opt, printer, arg)\n    option_t *opt;\n    void (*printer) (void *, char *, ...);\n    void *arg;\n{\n    printer(arg, \"%s\", epdisc_to_str(&lcp_wantoptions[0].endpoint));\n}\n#endif /* HAVE_MULTILINK */\n\n/*\n * lcp_init - Initialize LCP.\n */\nstatic void lcp_init(ppp_pcb *pcb) {\n    fsm *f = &pcb->lcp_fsm;\n    lcp_options *wo = &pcb->lcp_wantoptions;\n    lcp_options *ao = &pcb->lcp_allowoptions;\n\n    f->pcb = pcb;\n    f->protocol = PPP_LCP;\n    f->callbacks = &lcp_callbacks;\n\n    fsm_init(f);\n\n    BZERO(wo, sizeof(*wo));\n    wo->neg_mru = 1;\n    wo->mru = PPP_DEFMRU;\n    wo->neg_asyncmap = 1;\n    wo->neg_magicnumber = 1;\n    wo->neg_pcompression = 1;\n    wo->neg_accompression = 1;\n\n    BZERO(ao, sizeof(*ao));\n    ao->neg_mru = 1;\n    ao->mru = PPP_MAXMRU;\n    ao->neg_asyncmap = 1;\n#if CHAP_SUPPORT\n    ao->neg_chap = 1;\n    ao->chap_mdtype = CHAP_MDTYPE_SUPPORTED;\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n    ao->neg_upap = 1;\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n    ao->neg_eap = 1;\n#endif /* EAP_SUPPORT */\n    ao->neg_magicnumber = 1;\n    ao->neg_pcompression = 1;\n    ao->neg_accompression = 1;\n    ao->neg_endpoint = 1;\n}\n\n\n/*\n * lcp_open - LCP is allowed to come up.\n */\nvoid lcp_open(ppp_pcb *pcb) {\n    fsm *f = &pcb->lcp_fsm;\n    lcp_options *wo = &pcb->lcp_wantoptions;\n\n    f->flags &= ~(OPT_PASSIVE | OPT_SILENT);\n    if (wo->passive)\n    f->flags |= OPT_PASSIVE;\n    if (wo->silent)\n    f->flags |= OPT_SILENT;\n    fsm_open(f);\n}\n\n\n/*\n * lcp_close - Take LCP down.\n */\nvoid lcp_close(ppp_pcb *pcb, const char *reason) {\n    fsm *f = &pcb->lcp_fsm;\n    int oldstate;\n\n    if (pcb->phase != PPP_PHASE_DEAD\n#ifdef HAVE_MULTILINK\n    && pcb->phase != PPP_PHASE_MASTER\n#endif /* HAVE_MULTILINK */\n    )\n    new_phase(pcb, PPP_PHASE_TERMINATE);\n\n    if (f->flags & DELAYED_UP) {\n    UNTIMEOUT(lcp_delayed_up, f);\n    f->state = PPP_FSM_STOPPED;\n    }\n    oldstate = f->state;\n\n    fsm_close(f, reason);\n    if (oldstate == PPP_FSM_STOPPED && (f->flags & (OPT_PASSIVE|OPT_SILENT|DELAYED_UP))) {\n    /*\n     * This action is not strictly according to the FSM in RFC1548,\n     * but it does mean that the program terminates if you do a\n     * lcp_close() when a connection hasn't been established\n     * because we are in passive/silent mode or because we have\n     * delayed the fsm_lowerup() call and it hasn't happened yet.\n     */\n    f->flags &= ~DELAYED_UP;\n    lcp_finished(f);\n    }\n}\n\n\n/*\n * lcp_lowerup - The lower layer is up.\n */\nvoid lcp_lowerup(ppp_pcb *pcb) {\n    lcp_options *wo = &pcb->lcp_wantoptions;\n    fsm *f = &pcb->lcp_fsm;\n    /*\n     * Don't use A/C or protocol compression on transmission,\n     * but accept A/C and protocol compressed packets\n     * if we are going to ask for A/C and protocol compression.\n     */\n    if (ppp_send_config(pcb, PPP_MRU, 0xffffffff, 0, 0) < 0\n    || ppp_recv_config(pcb, PPP_MRU, (pcb->settings.lax_recv? 0: 0xffffffff),\n               wo->neg_pcompression, wo->neg_accompression) < 0)\n        return;\n    pcb->peer_mru = PPP_MRU;\n\n    if (pcb->settings.listen_time != 0) {\n    f->flags |= DELAYED_UP;\n    TIMEOUTMS(lcp_delayed_up, f, pcb->settings.listen_time);\n    } else\n    fsm_lowerup(f);\n}\n\n\n/*\n * lcp_lowerdown - The lower layer is down.\n */\nvoid lcp_lowerdown(ppp_pcb *pcb) {\n    fsm *f = &pcb->lcp_fsm;\n\n    if (f->flags & DELAYED_UP) {\n    f->flags &= ~DELAYED_UP;\n    UNTIMEOUT(lcp_delayed_up, f);\n    } else\n    fsm_lowerdown(f);\n}\n\n\n/*\n * lcp_delayed_up - Bring the lower layer up now.\n */\nstatic void lcp_delayed_up(void *arg) {\n    fsm *f = (fsm*)arg;\n\n    if (f->flags & DELAYED_UP) {\n    f->flags &= ~DELAYED_UP;\n    fsm_lowerup(f);\n    }\n}\n\n\n/*\n * lcp_input - Input LCP packet.\n */\nstatic void lcp_input(ppp_pcb *pcb, u_char *p, int len) {\n    fsm *f = &pcb->lcp_fsm;\n\n    if (f->flags & DELAYED_UP) {\n    f->flags &= ~DELAYED_UP;\n    UNTIMEOUT(lcp_delayed_up, f);\n    fsm_lowerup(f);\n    }\n    fsm_input(f, p, len);\n}\n\n/*\n * lcp_extcode - Handle a LCP-specific code.\n */\nstatic int lcp_extcode(fsm *f, int code, int id, u_char *inp, int len) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *go = &pcb->lcp_gotoptions;\n    u_char *magp;\n\n    switch( code ){\n    case PROTREJ:\n    lcp_rprotrej(f, inp, len);\n    break;\n    \n    case ECHOREQ:\n    if (f->state != PPP_FSM_OPENED)\n        break;\n    magp = inp;\n    PUTLONG(go->magicnumber, magp);\n    fsm_sdata(f, ECHOREP, id, inp, len);\n    break;\n    \n    case ECHOREP:\n    lcp_received_echo_reply(f, id, inp, len);\n    break;\n\n    case DISCREQ:\n    case IDENTIF:\n    case TIMEREM:\n    break;\n\n    default:\n    return 0;\n    }\n    return 1;\n}\n\n    \n/*\n * lcp_rprotrej - Receive an Protocol-Reject.\n *\n * Figure out which protocol is rejected and inform it.\n */\nstatic void lcp_rprotrej(fsm *f, u_char *inp, int len) {\n    int i;\n    const struct protent *protp;\n    u_short prot;\n#if PPP_PROTOCOLNAME\n    const char *pname;\n#endif /* PPP_PROTOCOLNAME */\n\n    if (len < 2) {\n    LCPDEBUG((\"lcp_rprotrej: Rcvd short Protocol-Reject packet!\"));\n    return;\n    }\n\n    GETSHORT(prot, inp);\n\n    /*\n     * Protocol-Reject packets received in any state other than the LCP\n     * OPENED state SHOULD be silently discarded.\n     */\n    if( f->state != PPP_FSM_OPENED ){\n    LCPDEBUG((\"Protocol-Reject discarded: LCP in state %d\", f->state));\n    return;\n    }\n\n#if PPP_PROTOCOLNAME\n    pname = protocol_name(prot);\n#endif /* PPP_PROTOCOLNAME */\n\n    /*\n     * Upcall the proper Protocol-Reject routine.\n     */\n    for (i = 0; (protp = protocols[i]) != NULL; ++i)\n    if (protp->protocol == prot) {\n#if PPP_PROTOCOLNAME\n        if (pname != NULL)\n        ppp_dbglog(\"Protocol-Reject for '%s' (0x%x) received\", pname,\n               prot);\n        else\n#endif /* PPP_PROTOCOLNAME */\n        ppp_dbglog(\"Protocol-Reject for 0x%x received\", prot);\n        (*protp->protrej)(f->pcb);\n        return;\n    }\n\n#if PPP_PROTOCOLNAME\n    if (pname != NULL)\n    ppp_warn(\"Protocol-Reject for unsupported protocol '%s' (0x%x)\", pname,\n         prot);\n    else\n#endif /* #if PPP_PROTOCOLNAME */\n    ppp_warn(\"Protocol-Reject for unsupported protocol 0x%x\", prot);\n}\n\n\n/*\n * lcp_protrej - A Protocol-Reject was received.\n */\n/*ARGSUSED*/\nstatic void lcp_protrej(ppp_pcb *pcb) {\n    /*\n     * Can't reject LCP!\n     */\n    ppp_error(\"Received Protocol-Reject for LCP!\");\n    fsm_protreject(&pcb->lcp_fsm);\n}\n\n\n/*\n * lcp_sprotrej - Send a Protocol-Reject for some protocol.\n */\nvoid lcp_sprotrej(ppp_pcb *pcb, u_char *p, int len) {\n    fsm *f = &pcb->lcp_fsm;\n    /*\n     * Send back the protocol and the information field of the\n     * rejected packet.  We only get here if LCP is in the OPENED state.\n     */\n#if 0\n    p += 2;\n    len -= 2;\n#endif\n\n    fsm_sdata(f, PROTREJ, ++f->id,\n          p, len);\n}\n\n\n/*\n * lcp_resetci - Reset our CI.\n */\nstatic void lcp_resetci(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *wo = &pcb->lcp_wantoptions;\n    lcp_options *go = &pcb->lcp_gotoptions;\n    lcp_options *ao = &pcb->lcp_allowoptions;\n\n#if PPP_AUTH_SUPPORT\n\n    /* note: default value is true for allow options */\n    if (pcb->settings.user && pcb->settings.passwd) {\n#if PAP_SUPPORT\n      if (pcb->settings.refuse_pap) {\n        ao->neg_upap = 0;\n      }\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n      if (pcb->settings.refuse_chap) {\n        ao->chap_mdtype &= ~MDTYPE_MD5;\n      }\n#if MSCHAP_SUPPORT\n      if (pcb->settings.refuse_mschap) {\n        ao->chap_mdtype &= ~MDTYPE_MICROSOFT;\n      }\n      if (pcb->settings.refuse_mschap_v2) {\n        ao->chap_mdtype &= ~MDTYPE_MICROSOFT_V2;\n      }\n#endif /* MSCHAP_SUPPORT */\n      ao->neg_chap = (ao->chap_mdtype != MDTYPE_NONE);\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n      if (pcb->settings.refuse_eap) {\n        ao->neg_eap = 0;\n      }\n#endif /* EAP_SUPPORT */\n\n#if PPP_SERVER\n      /* note: default value is false for wanted options */\n      if (pcb->settings.auth_required) {\n#if PAP_SUPPORT\n        if (!pcb->settings.refuse_pap) {\n          wo->neg_upap = 1;\n        }\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n        if (!pcb->settings.refuse_chap) {\n          wo->chap_mdtype |= MDTYPE_MD5;\n        }\n#if MSCHAP_SUPPORT\n        if (!pcb->settings.refuse_mschap) {\n          wo->chap_mdtype |= MDTYPE_MICROSOFT;\n        }\n        if (!pcb->settings.refuse_mschap_v2) {\n          wo->chap_mdtype |= MDTYPE_MICROSOFT_V2;\n        }\n#endif /* MSCHAP_SUPPORT */\n        wo->neg_chap = (wo->chap_mdtype != MDTYPE_NONE);\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n        if (!pcb->settings.refuse_eap) {\n          wo->neg_eap = 1;\n        }\n#endif /* EAP_SUPPORT */\n      }\n#endif /* PPP_SERVER */\n\n    } else {\n#if PAP_SUPPORT\n      ao->neg_upap = 0;\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n      ao->neg_chap = 0;\n      ao->chap_mdtype = MDTYPE_NONE;\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n      ao->neg_eap = 0;\n#endif /* EAP_SUPPORT */\n    }\n\n    PPPDEBUG(LOG_DEBUG, (\"ppp: auth protocols:\"));\n#if PAP_SUPPORT\n    PPPDEBUG(LOG_DEBUG, (\" PAP=%d\", ao->neg_upap));\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n    PPPDEBUG(LOG_DEBUG, (\" CHAP=%d CHAP_MD5=%d\", ao->neg_chap, !!(ao->chap_mdtype&MDTYPE_MD5)));\n#if MSCHAP_SUPPORT\n    PPPDEBUG(LOG_DEBUG, (\" CHAP_MS=%d CHAP_MS2=%d\", !!(ao->chap_mdtype&MDTYPE_MICROSOFT), !!(ao->chap_mdtype&MDTYPE_MICROSOFT_V2)));\n#endif /* MSCHAP_SUPPORT */\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n    PPPDEBUG(LOG_DEBUG, (\" EAP=%d\", ao->neg_eap));\n#endif /* EAP_SUPPORT */\n    PPPDEBUG(LOG_DEBUG, (\"\\n\"));\n\n#endif /* PPP_AUTH_SUPPORT */\n\n    wo->magicnumber = magic();\n    wo->numloops = 0;\n    *go = *wo;\n#ifdef HAVE_MULTILINK\n    if (!multilink) {\n    go->neg_mrru = 0;\n#endif /* HAVE_MULTILINK */\n    go->neg_ssnhf = 0;\n    go->neg_endpoint = 0;\n#ifdef HAVE_MULTILINK\n    }\n#endif /* HAVE_MULTILINK */\n    if (pcb->settings.noendpoint)\n    ao->neg_endpoint = 0;\n    pcb->peer_mru = PPP_MRU;\n#if 0 /* UNUSED */\n    auth_reset(pcb);\n#endif /* UNUSED */\n}\n\n\n/*\n * lcp_cilen - Return length of our CI.\n */\nstatic int lcp_cilen(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *go = &pcb->lcp_gotoptions;\n\n#define LENCIVOID(neg)    ((neg) ? CILEN_VOID : 0)\n#if CHAP_SUPPORT\n#define LENCICHAP(neg)    ((neg) ? CILEN_CHAP : 0)\n#endif /* CHAP_SUPPORT */\n#define LENCISHORT(neg)    ((neg) ? CILEN_SHORT : 0)\n#define LENCILONG(neg)    ((neg) ? CILEN_LONG : 0)\n#if LQR_SUPPORT\n#define LENCILQR(neg)    ((neg) ? CILEN_LQR: 0)\n#endif /* LQR_SUPPORT */\n#define LENCICBCP(neg)    ((neg) ? CILEN_CBCP: 0)\n    /*\n     * NB: we only ask for one of CHAP, UPAP, or EAP, even if we will\n     * accept more than one.  We prefer EAP first, then CHAP, then\n     * PAP.\n     */\n    return (LENCISHORT(go->neg_mru && go->mru != PPP_DEFMRU) +\n        LENCILONG(go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF) +\n#if EAP_SUPPORT\n        LENCISHORT(go->neg_eap) +\n#endif /* EAP_SUPPORT */\n#if CHAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */\n#if EAP_SUPPORT\n        LENCICHAP(!go->neg_eap && go->neg_chap) +\n#endif /* EAP_SUPPORT */\n#if !EAP_SUPPORT\n        LENCICHAP(go->neg_chap) +\n#endif /* !EAP_SUPPORT */\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */\n#if EAP_SUPPORT && CHAP_SUPPORT\n        LENCISHORT(!go->neg_eap && !go->neg_chap && go->neg_upap) +\n#endif /* EAP_SUPPORT && CHAP_SUPPORT */\n#if EAP_SUPPORT && !CHAP_SUPPORT\n        LENCISHORT(!go->neg_eap && go->neg_upap) +\n#endif /* EAP_SUPPORT && !CHAP_SUPPORT */\n#if !EAP_SUPPORT && CHAP_SUPPORT\n        LENCISHORT(!go->neg_chap && go->neg_upap) +\n#endif /* !EAP_SUPPORT && CHAP_SUPPORT */\n#if !EAP_SUPPORT && !CHAP_SUPPORT\n        LENCISHORT(go->neg_upap) +\n#endif /* !EAP_SUPPORT && !CHAP_SUPPORT */\n#endif /* PAP_SUPPORT */\n#if LQR_SUPPORT\n        LENCILQR(go->neg_lqr) +\n#endif /* LQR_SUPPORT */\n        LENCICBCP(go->neg_cbcp) +\n        LENCILONG(go->neg_magicnumber) +\n        LENCIVOID(go->neg_pcompression) +\n        LENCIVOID(go->neg_accompression) +\n#ifdef HAVE_MULTILINK\n        LENCISHORT(go->neg_mrru) +\n#endif /* HAVE_MULTILINK */\n        LENCIVOID(go->neg_ssnhf) +\n        (go->neg_endpoint? CILEN_CHAR + go->endpoint.length: 0));\n}\n\n\n/*\n * lcp_addci - Add our desired CIs to a packet.\n */\nstatic void lcp_addci(fsm *f, u_char *ucp, int *lenp) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *go = &pcb->lcp_gotoptions;\n    u_char *start_ucp = ucp;\n\n#define ADDCIVOID(opt, neg) \\\n    if (neg) { \\\n    PUTCHAR(opt, ucp); \\\n    PUTCHAR(CILEN_VOID, ucp); \\\n    }\n#define ADDCISHORT(opt, neg, val) \\\n    if (neg) { \\\n    PUTCHAR(opt, ucp); \\\n    PUTCHAR(CILEN_SHORT, ucp); \\\n    PUTSHORT(val, ucp); \\\n    }\n#if CHAP_SUPPORT\n#define ADDCICHAP(opt, neg, val) \\\n    if (neg) { \\\n    PUTCHAR((opt), ucp); \\\n    PUTCHAR(CILEN_CHAP, ucp); \\\n    PUTSHORT(PPP_CHAP, ucp); \\\n    PUTCHAR((CHAP_DIGEST(val)), ucp); \\\n    }\n#endif /* CHAP_SUPPORT */\n#define ADDCILONG(opt, neg, val) \\\n    if (neg) { \\\n    PUTCHAR(opt, ucp); \\\n    PUTCHAR(CILEN_LONG, ucp); \\\n    PUTLONG(val, ucp); \\\n    }\n#if LQR_SUPPORT\n#define ADDCILQR(opt, neg, val) \\\n    if (neg) { \\\n    PUTCHAR(opt, ucp); \\\n    PUTCHAR(CILEN_LQR, ucp); \\\n    PUTSHORT(PPP_LQR, ucp); \\\n    PUTLONG(val, ucp); \\\n    }\n#endif /* LQR_SUPPORT */\n#define ADDCICHAR(opt, neg, val) \\\n    if (neg) { \\\n    PUTCHAR(opt, ucp); \\\n    PUTCHAR(CILEN_CHAR, ucp); \\\n    PUTCHAR(val, ucp); \\\n    }\n#define ADDCIENDP(opt, neg, class, val, len) \\\n    if (neg) { \\\n    int i; \\\n    PUTCHAR(opt, ucp); \\\n    PUTCHAR(CILEN_CHAR + len, ucp); \\\n    PUTCHAR(class, ucp); \\\n    for (i = 0; i < len; ++i) \\\n        PUTCHAR(val[i], ucp); \\\n    }\n\n    ADDCISHORT(CI_MRU, go->neg_mru && go->mru != PPP_DEFMRU, go->mru);\n    ADDCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF,\n          go->asyncmap);\n#if EAP_SUPPORT\n    ADDCISHORT(CI_AUTHTYPE, go->neg_eap, PPP_EAP);\n#endif /* EAP_SUPPORT */\n#if CHAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */\n#if EAP_SUPPORT\n    ADDCICHAP(CI_AUTHTYPE, !go->neg_eap && go->neg_chap, go->chap_mdtype);\n#endif /* EAP_SUPPORT */\n#if !EAP_SUPPORT\n    ADDCICHAP(CI_AUTHTYPE, go->neg_chap, go->chap_mdtype);\n#endif /* !EAP_SUPPORT */\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */\n#if EAP_SUPPORT && CHAP_SUPPORT\n    ADDCISHORT(CI_AUTHTYPE, !go->neg_eap && !go->neg_chap && go->neg_upap, PPP_PAP);\n#endif /* EAP_SUPPORT && CHAP_SUPPORT */\n#if EAP_SUPPORT && !CHAP_SUPPORT\n    ADDCISHORT(CI_AUTHTYPE, !go->neg_eap && go->neg_upap, PPP_PAP);\n#endif /* EAP_SUPPORT && !CHAP_SUPPORT */\n#if !EAP_SUPPORT && CHAP_SUPPORT\n    ADDCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);\n#endif /* !EAP_SUPPORT && CHAP_SUPPORT */\n#if !EAP_SUPPORT && !CHAP_SUPPORT\n    ADDCISHORT(CI_AUTHTYPE, go->neg_upap, PPP_PAP);\n#endif /* !EAP_SUPPORT && !CHAP_SUPPORT */\n#endif /* PAP_SUPPORT */\n#if LQR_SUPPORT\n    ADDCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);\n#endif /* LQR_SUPPORT */\n    ADDCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);\n    ADDCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber);\n    ADDCIVOID(CI_PCOMPRESSION, go->neg_pcompression);\n    ADDCIVOID(CI_ACCOMPRESSION, go->neg_accompression);\n#ifdef HAVE_MULTILINK\n    ADDCISHORT(CI_MRRU, go->neg_mrru, go->mrru);\n#endif\n    ADDCIVOID(CI_SSNHF, go->neg_ssnhf);\n    ADDCIENDP(CI_EPDISC, go->neg_endpoint, go->endpoint.class_,\n          go->endpoint.value, go->endpoint.length);\n\n    if (ucp - start_ucp != *lenp) {\n    /* this should never happen, because peer_mtu should be 1500 */\n    ppp_error(\"Bug in lcp_addci: wrong length\");\n    }\n}\n\n\n/*\n * lcp_ackci - Ack our CIs.\n * This should not modify any state if the Ack is bad.\n *\n * Returns:\n *    0 - Ack was bad.\n *    1 - Ack was good.\n */\nstatic int lcp_ackci(fsm *f, u_char *p, int len) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *go = &pcb->lcp_gotoptions;\n    u_char cilen, citype, cichar;\n    u_short cishort;\n    u32_t cilong;\n\n    /*\n     * CIs must be in exactly the same order that we sent.\n     * Check packet length and CI length at each step.\n     * If we find any deviations, then this packet is bad.\n     */\n#define ACKCIVOID(opt, neg) \\\n    if (neg) { \\\n    if ((len -= CILEN_VOID) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_VOID || \\\n        citype != opt) \\\n        goto bad; \\\n    }\n#define ACKCISHORT(opt, neg, val) \\\n    if (neg) { \\\n    if ((len -= CILEN_SHORT) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_SHORT || \\\n        citype != opt) \\\n        goto bad; \\\n    GETSHORT(cishort, p); \\\n    if (cishort != val) \\\n        goto bad; \\\n    }\n#define ACKCICHAR(opt, neg, val) \\\n    if (neg) { \\\n    if ((len -= CILEN_CHAR) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_CHAR || \\\n        citype != opt) \\\n        goto bad; \\\n    GETCHAR(cichar, p); \\\n    if (cichar != val) \\\n        goto bad; \\\n    }\n#if CHAP_SUPPORT\n#define ACKCICHAP(opt, neg, val) \\\n    if (neg) { \\\n    if ((len -= CILEN_CHAP) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_CHAP || \\\n        citype != (opt)) \\\n        goto bad; \\\n    GETSHORT(cishort, p); \\\n    if (cishort != PPP_CHAP) \\\n        goto bad; \\\n    GETCHAR(cichar, p); \\\n    if (cichar != (CHAP_DIGEST(val))) \\\n      goto bad; \\\n    }\n#endif /* CHAP_SUPPORT */\n#define ACKCILONG(opt, neg, val) \\\n    if (neg) { \\\n    if ((len -= CILEN_LONG) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_LONG || \\\n        citype != opt) \\\n        goto bad; \\\n    GETLONG(cilong, p); \\\n    if (cilong != val) \\\n        goto bad; \\\n    }\n#if LQR_SUPPORT\n#define ACKCILQR(opt, neg, val) \\\n    if (neg) { \\\n    if ((len -= CILEN_LQR) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_LQR || \\\n        citype != opt) \\\n        goto bad; \\\n    GETSHORT(cishort, p); \\\n    if (cishort != PPP_LQR) \\\n        goto bad; \\\n    GETLONG(cilong, p); \\\n    if (cilong != val) \\\n      goto bad; \\\n    }\n#endif /* LQR_SUPPORT */\n#define ACKCIENDP(opt, neg, class, val, vlen) \\\n    if (neg) { \\\n    int i; \\\n    if ((len -= CILEN_CHAR + vlen) < 0) \\\n        goto bad; \\\n    GETCHAR(citype, p); \\\n    GETCHAR(cilen, p); \\\n    if (cilen != CILEN_CHAR + vlen || \\\n        citype != opt) \\\n        goto bad; \\\n    GETCHAR(cichar, p); \\\n    if (cichar != class) \\\n        goto bad; \\\n    for (i = 0; i < vlen; ++i) { \\\n        GETCHAR(cichar, p); \\\n        if (cichar != val[i]) \\\n        goto bad; \\\n    } \\\n    }\n\n    ACKCISHORT(CI_MRU, go->neg_mru && go->mru != PPP_DEFMRU, go->mru);\n    ACKCILONG(CI_ASYNCMAP, go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF,\n          go->asyncmap);\n#if EAP_SUPPORT\n    ACKCISHORT(CI_AUTHTYPE, go->neg_eap, PPP_EAP);\n#endif /* EAP_SUPPORT */\n#if CHAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */\n#if EAP_SUPPORT\n    ACKCICHAP(CI_AUTHTYPE, !go->neg_eap && go->neg_chap, go->chap_mdtype);\n#endif /* EAP_SUPPORT */\n#if !EAP_SUPPORT\n    ACKCICHAP(CI_AUTHTYPE, go->neg_chap, go->chap_mdtype);\n#endif /* !EAP_SUPPORT */\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT /* cannot be improved, embedding a directive within macro arguments is not portable */\n#if EAP_SUPPORT && CHAP_SUPPORT\n    ACKCISHORT(CI_AUTHTYPE, !go->neg_eap && !go->neg_chap && go->neg_upap, PPP_PAP);\n#endif /* EAP_SUPPORT && CHAP_SUPPORT */\n#if EAP_SUPPORT && !CHAP_SUPPORT\n    ACKCISHORT(CI_AUTHTYPE, !go->neg_eap && go->neg_upap, PPP_PAP);\n#endif /* EAP_SUPPORT && !CHAP_SUPPORT */\n#if !EAP_SUPPORT && CHAP_SUPPORT\n    ACKCISHORT(CI_AUTHTYPE, !go->neg_chap && go->neg_upap, PPP_PAP);\n#endif /* !EAP_SUPPORT && CHAP_SUPPORT */\n#if !EAP_SUPPORT && !CHAP_SUPPORT\n    ACKCISHORT(CI_AUTHTYPE, go->neg_upap, PPP_PAP);\n#endif /* !EAP_SUPPORT && !CHAP_SUPPORT */\n#endif /* PAP_SUPPORT */\n#if LQR_SUPPORT\n    ACKCILQR(CI_QUALITY, go->neg_lqr, go->lqr_period);\n#endif /* LQR_SUPPORT */\n    ACKCICHAR(CI_CALLBACK, go->neg_cbcp, CBCP_OPT);\n    ACKCILONG(CI_MAGICNUMBER, go->neg_magicnumber, go->magicnumber);\n    ACKCIVOID(CI_PCOMPRESSION, go->neg_pcompression);\n    ACKCIVOID(CI_ACCOMPRESSION, go->neg_accompression);\n#ifdef HAVE_MULTILINK\n    ACKCISHORT(CI_MRRU, go->neg_mrru, go->mrru);\n#endif /* HAVE_MULTILINK */\n    ACKCIVOID(CI_SSNHF, go->neg_ssnhf);\n    ACKCIENDP(CI_EPDISC, go->neg_endpoint, go->endpoint.class_,\n          go->endpoint.value, go->endpoint.length);\n\n    /*\n     * If there are any remaining CIs, then this packet is bad.\n     */\n    if (len != 0)\n    goto bad;\n    return (1);\nbad:\n    LCPDEBUG((\"lcp_acki: received bad Ack!\"));\n    return (0);\n}\n\n\n/*\n * lcp_nakci - Peer has sent a NAK for some of our CIs.\n * This should not modify any state if the Nak is bad\n * or if LCP is in the OPENED state.\n *\n * Returns:\n *    0 - Nak was bad.\n *    1 - Nak was good.\n */\nstatic int lcp_nakci(fsm *f, u_char *p, int len, int treat_as_reject) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *go = &pcb->lcp_gotoptions;\n    lcp_options *wo = &pcb->lcp_wantoptions;\n    u_char citype, cichar, *next;\n    u_short cishort;\n    u32_t cilong;\n    lcp_options no;        /* options we've seen Naks for */\n    lcp_options try_;        /* options to request next time */\n    int looped_back = 0;\n    int cilen;\n\n    BZERO(&no, sizeof(no));\n    try_ = *go;\n\n    /*\n     * Any Nak'd CIs must be in exactly the same order that we sent.\n     * Check packet length and CI length at each step.\n     * If we find any deviations, then this packet is bad.\n     */\n#define NAKCIVOID(opt, neg) \\\n    if (go->neg && \\\n    len >= CILEN_VOID && \\\n    p[1] == CILEN_VOID && \\\n    p[0] == opt) { \\\n    len -= CILEN_VOID; \\\n    INCPTR(CILEN_VOID, p); \\\n    no.neg = 1; \\\n    try_.neg = 0; \\\n    }\n#if CHAP_SUPPORT\n#define NAKCICHAP(opt, neg, code) \\\n    if (go->neg && \\\n    len >= CILEN_CHAP && \\\n    p[1] == CILEN_CHAP && \\\n    p[0] == opt) { \\\n    len -= CILEN_CHAP; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    GETCHAR(cichar, p); \\\n    no.neg = 1; \\\n    code \\\n    }\n#endif /* CHAP_SUPPORT */\n#define NAKCICHAR(opt, neg, code) \\\n    if (go->neg && \\\n    len >= CILEN_CHAR && \\\n    p[1] == CILEN_CHAR && \\\n    p[0] == opt) { \\\n    len -= CILEN_CHAR; \\\n    INCPTR(2, p); \\\n    GETCHAR(cichar, p); \\\n    no.neg = 1; \\\n    code \\\n    }\n#define NAKCISHORT(opt, neg, code) \\\n    if (go->neg && \\\n    len >= CILEN_SHORT && \\\n    p[1] == CILEN_SHORT && \\\n    p[0] == opt) { \\\n    len -= CILEN_SHORT; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    no.neg = 1; \\\n    code \\\n    }\n#define NAKCILONG(opt, neg, code) \\\n    if (go->neg && \\\n    len >= CILEN_LONG && \\\n    p[1] == CILEN_LONG && \\\n    p[0] == opt) { \\\n    len -= CILEN_LONG; \\\n    INCPTR(2, p); \\\n    GETLONG(cilong, p); \\\n    no.neg = 1; \\\n    code \\\n    }\n#if LQR_SUPPORT\n#define NAKCILQR(opt, neg, code) \\\n    if (go->neg && \\\n    len >= CILEN_LQR && \\\n    p[1] == CILEN_LQR && \\\n    p[0] == opt) { \\\n    len -= CILEN_LQR; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    GETLONG(cilong, p); \\\n    no.neg = 1; \\\n    code \\\n    }\n#endif /* LQR_SUPPORT */\n#define NAKCIENDP(opt, neg) \\\n    if (go->neg && \\\n    len >= CILEN_CHAR && \\\n    p[0] == opt && \\\n    p[1] >= CILEN_CHAR && \\\n    p[1] <= len) { \\\n    len -= p[1]; \\\n    INCPTR(p[1], p); \\\n    no.neg = 1; \\\n    try_.neg = 0; \\\n    }\n\n    /*\n     * NOTE!  There must be no assignments to individual fields of *go in\n     * the code below.  Any such assignment is a BUG!\n     */\n    /*\n     * We don't care if they want to send us smaller packets than\n     * we want.  Therefore, accept any MRU less than what we asked for,\n     * but then ignore the new value when setting the MRU in the kernel.\n     * If they send us a bigger MRU than what we asked, accept it, up to\n     * the limit of the default MRU we'd get if we didn't negotiate.\n     */\n    if (go->neg_mru && go->mru != PPP_DEFMRU) {\n    NAKCISHORT(CI_MRU, neg_mru,\n           if (cishort <= wo->mru || cishort <= PPP_DEFMRU)\n               try_.mru = cishort;\n           );\n    }\n\n    /*\n     * Add any characters they want to our (receive-side) asyncmap.\n     */\n    if (go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF) {\n    NAKCILONG(CI_ASYNCMAP, neg_asyncmap,\n          try_.asyncmap = go->asyncmap | cilong;\n          );\n    }\n\n    /*\n     * If they've nak'd our authentication-protocol, check whether\n     * they are proposing a different protocol, or a different\n     * hash algorithm for CHAP.\n     */\n    if ((0\n#if CHAP_SUPPORT\n        || go->neg_chap\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n        || go->neg_upap\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n        || go->neg_eap\n#endif /* EAP_SUPPORT */\n        )\n    && len >= CILEN_SHORT\n    && p[0] == CI_AUTHTYPE && p[1] >= CILEN_SHORT && p[1] <= len) {\n    cilen = p[1];\n    len -= cilen;\n#if CHAP_SUPPORT\n    no.neg_chap = go->neg_chap;\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n    no.neg_upap = go->neg_upap;\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n    no.neg_eap = go->neg_eap;\n#endif /* EAP_SUPPORT */\n    INCPTR(2, p);\n    GETSHORT(cishort, p);\n\n#if PAP_SUPPORT\n    if (cishort == PPP_PAP && cilen == CILEN_SHORT) {\n#if EAP_SUPPORT\n        /* If we were asking for EAP, then we need to stop that. */\n        if (go->neg_eap)\n        try_.neg_eap = 0;\n        else\n#endif /* EAP_SUPPORT */\n\n#if CHAP_SUPPORT\n        /* If we were asking for CHAP, then we need to stop that. */\n        if (go->neg_chap)\n        try_.neg_chap = 0;\n        else\n#endif /* CHAP_SUPPORT */\n\n        /*\n         * If we weren't asking for CHAP or EAP, then we were asking for\n         * PAP, in which case this Nak is bad.\n         */\n        goto bad;\n    } else\n#endif /* PAP_SUPPORT */\n\n#if CHAP_SUPPORT\n    if (cishort == PPP_CHAP && cilen == CILEN_CHAP) {\n        GETCHAR(cichar, p);\n#if EAP_SUPPORT\n        /* Stop asking for EAP, if we were. */\n        if (go->neg_eap) {\n        try_.neg_eap = 0;\n        /* Try to set up to use their suggestion, if possible */\n        if (CHAP_CANDIGEST(go->chap_mdtype, cichar))\n            try_.chap_mdtype = CHAP_MDTYPE_D(cichar);\n        } else\n#endif /* EAP_SUPPORT */\n        if (go->neg_chap) {\n        /*\n         * We were asking for our preferred algorithm, they must\n         * want something different.\n         */\n        if (cichar != CHAP_DIGEST(go->chap_mdtype)) {\n            if (CHAP_CANDIGEST(go->chap_mdtype, cichar)) {\n            /* Use their suggestion if we support it ... */\n            try_.chap_mdtype = CHAP_MDTYPE_D(cichar);\n            } else {\n            /* ... otherwise, try our next-preferred algorithm. */\n            try_.chap_mdtype &= ~(CHAP_MDTYPE(try_.chap_mdtype));\n            if (try_.chap_mdtype == MDTYPE_NONE) /* out of algos */\n                try_.neg_chap = 0;\n            }\n        } else {\n            /*\n             * Whoops, they Nak'd our algorithm of choice\n             * but then suggested it back to us.\n             */\n            goto bad;\n        }\n        } else {\n        /*\n         * Stop asking for PAP if we were asking for it.\n         */\n#if PAP_SUPPORT\n        try_.neg_upap = 0;\n#endif /* PAP_SUPPORT */\n        }\n\n    } else\n#endif /* CHAP_SUPPORT */\n    {\n\n#if EAP_SUPPORT\n        /*\n         * If we were asking for EAP, and they're Conf-Naking EAP,\n         * well, that's just strange.  Nobody should do that.\n         */\n        if (cishort == PPP_EAP && cilen == CILEN_SHORT && go->neg_eap)\n        ppp_dbglog(\"Unexpected Conf-Nak for EAP\");\n\n        /*\n         * We don't recognize what they're suggesting.\n         * Stop asking for what we were asking for.\n         */\n        if (go->neg_eap)\n        try_.neg_eap = 0;\n        else\n#endif /* EAP_SUPPORT */\n\n#if CHAP_SUPPORT\n        if (go->neg_chap)\n        try_.neg_chap = 0;\n        else\n#endif /* CHAP_SUPPORT */\n\n#if PAP_SUPPORT\n        if(1)\n        try_.neg_upap = 0;\n        else\n#endif /* PAP_SUPPORT */\n        {}\n\n        p += cilen - CILEN_SHORT;\n    }\n    }\n\n#if LQR_SUPPORT\n    /*\n     * If they can't cope with our link quality protocol, we'll have\n     * to stop asking for LQR.  We haven't got any other protocol.\n     * If they Nak the reporting period, take their value XXX ?\n     */\n    NAKCILQR(CI_QUALITY, neg_lqr,\n         if (cishort != PPP_LQR)\n         try_.neg_lqr = 0;\n         else\n         try_.lqr_period = cilong;\n         );\n#endif /* LQR_SUPPORT */\n\n    /*\n     * Only implementing CBCP...not the rest of the callback options\n     */\n    NAKCICHAR(CI_CALLBACK, neg_cbcp,\n              try_.neg_cbcp = 0;\n              (void)cichar; /* if CHAP support is not compiled, cichar is set but not used, which makes some compilers complaining */\n              );\n\n    /*\n     * Check for a looped-back line.\n     */\n    NAKCILONG(CI_MAGICNUMBER, neg_magicnumber,\n          try_.magicnumber = magic();\n          looped_back = 1;\n          );\n\n    /*\n     * Peer shouldn't send Nak for protocol compression or\n     * address/control compression requests; they should send\n     * a Reject instead.  If they send a Nak, treat it as a Reject.\n     */\n    NAKCIVOID(CI_PCOMPRESSION, neg_pcompression);\n    NAKCIVOID(CI_ACCOMPRESSION, neg_accompression);\n\n#ifdef HAVE_MULTILINK\n    /*\n     * Nak for MRRU option - accept their value if it is smaller\n     * than the one we want.\n     */\n    if (go->neg_mrru) {\n    NAKCISHORT(CI_MRRU, neg_mrru,\n           if (treat_as_reject)\n               try_.neg_mrru = 0;\n           else if (cishort <= wo->mrru)\n               try_.mrru = cishort;\n           );\n    }\n#else /* HAVE_MULTILINK */\n    LWIP_UNUSED_ARG(treat_as_reject);\n#endif /* HAVE_MULTILINK */\n\n    /*\n     * Nak for short sequence numbers shouldn't be sent, treat it\n     * like a reject.\n     */\n    NAKCIVOID(CI_SSNHF, neg_ssnhf);\n\n    /*\n     * Nak of the endpoint discriminator option is not permitted,\n     * treat it like a reject.\n     */\n    NAKCIENDP(CI_EPDISC, neg_endpoint);\n\n    /*\n     * There may be remaining CIs, if the peer is requesting negotiation\n     * on an option that we didn't include in our request packet.\n     * If we see an option that we requested, or one we've already seen\n     * in this packet, then this packet is bad.\n     * If we wanted to respond by starting to negotiate on the requested\n     * option(s), we could, but we don't, because except for the\n     * authentication type and quality protocol, if we are not negotiating\n     * an option, it is because we were told not to.\n     * For the authentication type, the Nak from the peer means\n     * `let me authenticate myself with you' which is a bit pointless.\n     * For the quality protocol, the Nak means `ask me to send you quality\n     * reports', but if we didn't ask for them, we don't want them.\n     * An option we don't recognize represents the peer asking to\n     * negotiate some option we don't support, so ignore it.\n     */\n    while (len >= CILEN_VOID) {\n    GETCHAR(citype, p);\n    GETCHAR(cilen, p);\n    if (cilen < CILEN_VOID || (len -= cilen) < 0)\n        goto bad;\n    next = p + cilen - 2;\n\n    switch (citype) {\n    case CI_MRU:\n        if ((go->neg_mru && go->mru != PPP_DEFMRU)\n        || no.neg_mru || cilen != CILEN_SHORT)\n        goto bad;\n        GETSHORT(cishort, p);\n        if (cishort < PPP_DEFMRU) {\n        try_.neg_mru = 1;\n        try_.mru = cishort;\n        }\n        break;\n    case CI_ASYNCMAP:\n        if ((go->neg_asyncmap && go->asyncmap != 0xFFFFFFFF)\n        || no.neg_asyncmap || cilen != CILEN_LONG)\n        goto bad;\n        break;\n    case CI_AUTHTYPE:\n        if (0\n#if CHAP_SUPPORT\n                || go->neg_chap || no.neg_chap\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n                || go->neg_upap || no.neg_upap\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n        || go->neg_eap || no.neg_eap\n#endif /* EAP_SUPPORT */\n        )\n        goto bad;\n        break;\n    case CI_MAGICNUMBER:\n        if (go->neg_magicnumber || no.neg_magicnumber ||\n        cilen != CILEN_LONG)\n        goto bad;\n        break;\n    case CI_PCOMPRESSION:\n        if (go->neg_pcompression || no.neg_pcompression\n        || cilen != CILEN_VOID)\n        goto bad;\n        break;\n    case CI_ACCOMPRESSION:\n        if (go->neg_accompression || no.neg_accompression\n        || cilen != CILEN_VOID)\n        goto bad;\n        break;\n#if LQR_SUPPORT\n    case CI_QUALITY:\n        if (go->neg_lqr || no.neg_lqr || cilen != CILEN_LQR)\n        goto bad;\n        break;\n#endif /* LQR_SUPPORT */\n#ifdef HAVE_MULTILINK\n    case CI_MRRU:\n        if (go->neg_mrru || no.neg_mrru || cilen != CILEN_SHORT)\n        goto bad;\n        break;\n#endif /* HAVE_MULTILINK */\n    case CI_SSNHF:\n        if (go->neg_ssnhf || no.neg_ssnhf || cilen != CILEN_VOID)\n        goto bad;\n        try_.neg_ssnhf = 1;\n        break;\n    case CI_EPDISC:\n        if (go->neg_endpoint || no.neg_endpoint || cilen < CILEN_CHAR)\n        goto bad;\n        break;\n    default:\n        break;\n    }\n    p = next;\n    }\n\n    /*\n     * OK, the Nak is good.  Now we can update state.\n     * If there are any options left we ignore them.\n     */\n    if (f->state != PPP_FSM_OPENED) {\n    if (looped_back) {\n        if (++try_.numloops >= pcb->settings.lcp_loopbackfail) {\n        ppp_notice(\"Serial line is looped back.\");\n        pcb->err_code = PPPERR_LOOPBACK;\n        lcp_close(f->pcb, \"Loopback detected\");\n        }\n    } else\n        try_.numloops = 0;\n    *go = try_;\n    }\n\n    return 1;\n\nbad:\n    LCPDEBUG((\"lcp_nakci: received bad Nak!\"));\n    return 0;\n}\n\n\n/*\n * lcp_rejci - Peer has Rejected some of our CIs.\n * This should not modify any state if the Reject is bad\n * or if LCP is in the OPENED state.\n *\n * Returns:\n *    0 - Reject was bad.\n *    1 - Reject was good.\n */\nstatic int lcp_rejci(fsm *f, u_char *p, int len) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *go = &pcb->lcp_gotoptions;\n    u_char cichar;\n    u_short cishort;\n    u32_t cilong;\n    lcp_options try_;        /* options to request next time */\n\n    try_ = *go;\n\n    /*\n     * Any Rejected CIs must be in exactly the same order that we sent.\n     * Check packet length and CI length at each step.\n     * If we find any deviations, then this packet is bad.\n     */\n#define REJCIVOID(opt, neg) \\\n    if (go->neg && \\\n    len >= CILEN_VOID && \\\n    p[1] == CILEN_VOID && \\\n    p[0] == opt) { \\\n    len -= CILEN_VOID; \\\n    INCPTR(CILEN_VOID, p); \\\n    try_.neg = 0; \\\n    }\n#define REJCISHORT(opt, neg, val) \\\n    if (go->neg && \\\n    len >= CILEN_SHORT && \\\n    p[1] == CILEN_SHORT && \\\n    p[0] == opt) { \\\n    len -= CILEN_SHORT; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    /* Check rejected value. */ \\\n    if (cishort != val) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    }\n\n#if CHAP_SUPPORT && EAP_SUPPORT && PAP_SUPPORT\n#define REJCICHAP(opt, neg, val) \\\n    if (go->neg && \\\n    len >= CILEN_CHAP && \\\n    p[1] == CILEN_CHAP && \\\n    p[0] == opt) { \\\n    len -= CILEN_CHAP; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    GETCHAR(cichar, p); \\\n    /* Check rejected value. */ \\\n    if ((cishort != PPP_CHAP) || (cichar != (CHAP_DIGEST(val)))) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    try_.neg_eap = try_.neg_upap = 0; \\\n    }\n#endif /* CHAP_SUPPORT && EAP_SUPPORT && PAP_SUPPORT */\n\n#if CHAP_SUPPORT && !EAP_SUPPORT && PAP_SUPPORT\n#define REJCICHAP(opt, neg, val) \\\n    if (go->neg && \\\n    len >= CILEN_CHAP && \\\n    p[1] == CILEN_CHAP && \\\n    p[0] == opt) { \\\n    len -= CILEN_CHAP; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    GETCHAR(cichar, p); \\\n    /* Check rejected value. */ \\\n    if ((cishort != PPP_CHAP) || (cichar != (CHAP_DIGEST(val)))) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    try_.neg_upap = 0; \\\n    }\n#endif /* CHAP_SUPPORT && !EAP_SUPPORT && PAP_SUPPORT */\n\n#if CHAP_SUPPORT && EAP_SUPPORT && !PAP_SUPPORT\n#define REJCICHAP(opt, neg, val) \\\n    if (go->neg && \\\n    len >= CILEN_CHAP && \\\n    p[1] == CILEN_CHAP && \\\n    p[0] == opt) { \\\n    len -= CILEN_CHAP; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    GETCHAR(cichar, p); \\\n    /* Check rejected value. */ \\\n    if ((cishort != PPP_CHAP) || (cichar != (CHAP_DIGEST(val)))) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    try_.neg_eap = 0; \\\n    }\n#endif /* CHAP_SUPPORT && EAP_SUPPORT && !PAP_SUPPORT */\n\n#if CHAP_SUPPORT && !EAP_SUPPORT && !PAP_SUPPORT\n#define REJCICHAP(opt, neg, val) \\\n    if (go->neg && \\\n    len >= CILEN_CHAP && \\\n    p[1] == CILEN_CHAP && \\\n    p[0] == opt) { \\\n    len -= CILEN_CHAP; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    GETCHAR(cichar, p); \\\n    /* Check rejected value. */ \\\n    if ((cishort != PPP_CHAP) || (cichar != (CHAP_DIGEST(val)))) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    }\n#endif /* CHAP_SUPPORT && !EAP_SUPPORT && !PAP_SUPPORT */\n\n#define REJCILONG(opt, neg, val) \\\n    if (go->neg && \\\n    len >= CILEN_LONG && \\\n    p[1] == CILEN_LONG && \\\n    p[0] == opt) { \\\n    len -= CILEN_LONG; \\\n    INCPTR(2, p); \\\n    GETLONG(cilong, p); \\\n    /* Check rejected value. */ \\\n    if (cilong != val) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    }\n#if LQR_SUPPORT\n#define REJCILQR(opt, neg, val) \\\n    if (go->neg && \\\n    len >= CILEN_LQR && \\\n    p[1] == CILEN_LQR && \\\n    p[0] == opt) { \\\n    len -= CILEN_LQR; \\\n    INCPTR(2, p); \\\n    GETSHORT(cishort, p); \\\n    GETLONG(cilong, p); \\\n    /* Check rejected value. */ \\\n    if (cishort != PPP_LQR || cilong != val) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    }\n#endif /* LQR_SUPPORT */\n#define REJCICBCP(opt, neg, val) \\\n    if (go->neg && \\\n    len >= CILEN_CBCP && \\\n    p[1] == CILEN_CBCP && \\\n    p[0] == opt) { \\\n    len -= CILEN_CBCP; \\\n    INCPTR(2, p); \\\n    GETCHAR(cichar, p); \\\n    /* Check rejected value. */ \\\n    if (cichar != val) \\\n        goto bad; \\\n    try_.neg = 0; \\\n    }\n#define REJCIENDP(opt, neg, class, val, vlen) \\\n    if (go->neg && \\\n    len >= CILEN_CHAR + vlen && \\\n    p[0] == opt && \\\n    p[1] == CILEN_CHAR + vlen) { \\\n    int i; \\\n    len -= CILEN_CHAR + vlen; \\\n    INCPTR(2, p); \\\n    GETCHAR(cichar, p); \\\n    if (cichar != class) \\\n        goto bad; \\\n    for (i = 0; i < vlen; ++i) { \\\n        GETCHAR(cichar, p); \\\n        if (cichar != val[i]) \\\n        goto bad; \\\n    } \\\n    try_.neg = 0; \\\n    }\n\n    REJCISHORT(CI_MRU, neg_mru, go->mru);\n    REJCILONG(CI_ASYNCMAP, neg_asyncmap, go->asyncmap);\n#if EAP_SUPPORT\n    REJCISHORT(CI_AUTHTYPE, neg_eap, PPP_EAP);\n    if (!go->neg_eap) {\n#endif /* EAP_SUPPORT */\n#if CHAP_SUPPORT\n    REJCICHAP(CI_AUTHTYPE, neg_chap, go->chap_mdtype);\n    if (!go->neg_chap) {\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n        REJCISHORT(CI_AUTHTYPE, neg_upap, PPP_PAP);\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n    }\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n    }\n#endif /* EAP_SUPPORT */\n#if LQR_SUPPORT\n    REJCILQR(CI_QUALITY, neg_lqr, go->lqr_period);\n#endif /* LQR_SUPPORT */\n    REJCICBCP(CI_CALLBACK, neg_cbcp, CBCP_OPT);\n    REJCILONG(CI_MAGICNUMBER, neg_magicnumber, go->magicnumber);\n    REJCIVOID(CI_PCOMPRESSION, neg_pcompression);\n    REJCIVOID(CI_ACCOMPRESSION, neg_accompression);\n#ifdef HAVE_MULTILINK\n    REJCISHORT(CI_MRRU, neg_mrru, go->mrru);\n#endif /* HAVE_MULTILINK */\n    REJCIVOID(CI_SSNHF, neg_ssnhf);\n    REJCIENDP(CI_EPDISC, neg_endpoint, go->endpoint.class_,\n          go->endpoint.value, go->endpoint.length);\n\n    /*\n     * If there are any remaining CIs, then this packet is bad.\n     */\n    if (len != 0)\n    goto bad;\n    /*\n     * Now we can update state.\n     */\n    if (f->state != PPP_FSM_OPENED)\n    *go = try_;\n    return 1;\n\nbad:\n    LCPDEBUG((\"lcp_rejci: received bad Reject!\"));\n    return 0;\n}\n\n\n/*\n * lcp_reqci - Check the peer's requested CIs and send appropriate response.\n *\n * Returns: CONFACK, CONFNAK or CONFREJ and input packet modified\n * appropriately.  If reject_if_disagree is non-zero, doesn't return\n * CONFNAK; returns CONFREJ if it can't return CONFACK.\n *\n * inp = Requested CIs\n * lenp = Length of requested CIs\n */\nstatic int lcp_reqci(fsm *f, u_char *inp, int *lenp, int reject_if_disagree) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *go = &pcb->lcp_gotoptions;\n    lcp_options *ho = &pcb->lcp_hisoptions;\n    lcp_options *ao = &pcb->lcp_allowoptions;\n    u_char *cip, *next;        /* Pointer to current and next CIs */\n    int cilen, citype, cichar;    /* Parsed len, type, char value */\n    u_short cishort;        /* Parsed short value */\n    u32_t cilong;        /* Parse long value */\n    int rc = CONFACK;        /* Final packet return code */\n    int orc;            /* Individual option return code */\n    u_char *p;            /* Pointer to next char to parse */\n    u_char *rejp;        /* Pointer to next char in reject frame */\n    struct pbuf *nakp;          /* Nak buffer */\n    u_char *nakoutp;        /* Pointer to next char in Nak frame */\n    int l = *lenp;        /* Length left */\n\n    /*\n     * Reset all his options.\n     */\n    BZERO(ho, sizeof(*ho));\n\n    /*\n     * Process all his options.\n     */\n    next = inp;\n    nakp = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_CTRL_PBUF_MAX_SIZE), PPP_CTRL_PBUF_TYPE);\n    if(NULL == nakp)\n        return 0;\n    if(nakp->tot_len != nakp->len) {\n        pbuf_free(nakp);\n        return 0;\n    }\n\n    nakoutp = (u_char*)nakp->payload;\n    rejp = inp;\n    while (l) {\n    orc = CONFACK;            /* Assume success */\n    cip = p = next;            /* Remember begining of CI */\n    if (l < 2 ||            /* Not enough data for CI header or */\n        p[1] < 2 ||            /*  CI length too small or */\n        p[1] > l) {            /*  CI length too big? */\n        LCPDEBUG((\"lcp_reqci: bad CI length!\"));\n        orc = CONFREJ;        /* Reject bad CI */\n        cilen = l;            /* Reject till end of packet */\n        l = 0;            /* Don't loop again */\n        citype = 0;\n        goto endswitch;\n    }\n    GETCHAR(citype, p);        /* Parse CI type */\n    GETCHAR(cilen, p);        /* Parse CI length */\n    l -= cilen;            /* Adjust remaining length */\n    next += cilen;            /* Step to next CI */\n\n    switch (citype) {        /* Check CI type */\n    case CI_MRU:\n        if (!ao->neg_mru ||        /* Allow option? */\n        cilen != CILEN_SHORT) {    /* Check CI length */\n        orc = CONFREJ;        /* Reject CI */\n        break;\n        }\n        GETSHORT(cishort, p);    /* Parse MRU */\n\n        /*\n         * He must be able to receive at least our minimum.\n         * No need to check a maximum.  If he sends a large number,\n         * we'll just ignore it.\n         */\n        if (cishort < PPP_MINMRU) {\n        orc = CONFNAK;        /* Nak CI */\n        PUTCHAR(CI_MRU, nakoutp);\n        PUTCHAR(CILEN_SHORT, nakoutp);\n        PUTSHORT(PPP_MINMRU, nakoutp);    /* Give him a hint */\n        break;\n        }\n        ho->neg_mru = 1;        /* Remember he sent MRU */\n        ho->mru = cishort;        /* And remember value */\n        break;\n\n    case CI_ASYNCMAP:\n        if (!ao->neg_asyncmap ||\n        cilen != CILEN_LONG) {\n        orc = CONFREJ;\n        break;\n        }\n        GETLONG(cilong, p);\n\n        /*\n         * Asyncmap must have set at least the bits\n         * which are set in lcp_allowoptions[unit].asyncmap.\n         */\n        if ((ao->asyncmap & ~cilong) != 0) {\n        orc = CONFNAK;\n        PUTCHAR(CI_ASYNCMAP, nakoutp);\n        PUTCHAR(CILEN_LONG, nakoutp);\n        PUTLONG(ao->asyncmap | cilong, nakoutp);\n        break;\n        }\n        ho->neg_asyncmap = 1;\n        ho->asyncmap = cilong;\n        break;\n\n    case CI_AUTHTYPE:\n        if (cilen < CILEN_SHORT ||\n        !(0\n#if PAP_SUPPORT\n        || ao->neg_upap\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n        || ao->neg_chap\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n        || ao->neg_eap\n#endif /* EAP_SUPPORT */\n        )) {\n        /*\n         * Reject the option if we're not willing to authenticate.\n         */\n        ppp_dbglog(\"No auth is possible\");\n        orc = CONFREJ;\n        break;\n        }\n        GETSHORT(cishort, p);\n\n        /*\n         * Authtype must be PAP, CHAP, or EAP.\n         *\n         * Note: if more than one of ao->neg_upap, ao->neg_chap, and\n         * ao->neg_eap are set, and the peer sends a Configure-Request\n         * with two or more authenticate-protocol requests, then we will\n         * reject the second request.\n         * Whether we end up doing CHAP, UPAP, or EAP depends then on\n         * the ordering of the CIs in the peer's Configure-Request.\n             */\n\n#if PAP_SUPPORT\n        if (cishort == PPP_PAP) {\n        /* we've already accepted CHAP or EAP */\n        if (0\n#if CHAP_SUPPORT\n            || ho->neg_chap\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n            || ho->neg_eap\n#endif /* EAP_SUPPORT */\n            || cilen != CILEN_SHORT) {\n            LCPDEBUG((\"lcp_reqci: rcvd AUTHTYPE PAP, rejecting...\"));\n            orc = CONFREJ;\n            break;\n        }\n        if (!ao->neg_upap) {    /* we don't want to do PAP */\n            orc = CONFNAK;    /* NAK it and suggest CHAP or EAP */\n            PUTCHAR(CI_AUTHTYPE, nakoutp);\n#if EAP_SUPPORT\n            if (ao->neg_eap) {\n            PUTCHAR(CILEN_SHORT, nakoutp);\n            PUTSHORT(PPP_EAP, nakoutp);\n            } else {\n#endif /* EAP_SUPPORT */\n#if CHAP_SUPPORT\n            PUTCHAR(CILEN_CHAP, nakoutp);\n            PUTSHORT(PPP_CHAP, nakoutp);\n            PUTCHAR(CHAP_DIGEST(ao->chap_mdtype), nakoutp);\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n            }\n#endif /* EAP_SUPPORT */\n            break;\n        }\n        ho->neg_upap = 1;\n        break;\n        }\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n        if (cishort == PPP_CHAP) {\n        /* we've already accepted PAP or EAP */\n        if (\n#if PAP_SUPPORT\n            ho->neg_upap ||\n#endif /* PAP_SUPPORT */\n#if EAP_SUPPORT\n            ho->neg_eap ||\n#endif /* EAP_SUPPORT */\n            cilen != CILEN_CHAP) {\n            LCPDEBUG((\"lcp_reqci: rcvd AUTHTYPE CHAP, rejecting...\"));\n            orc = CONFREJ;\n            break;\n        }\n        if (!ao->neg_chap) {    /* we don't want to do CHAP */\n            orc = CONFNAK;    /* NAK it and suggest EAP or PAP */\n            PUTCHAR(CI_AUTHTYPE, nakoutp);\n            PUTCHAR(CILEN_SHORT, nakoutp);\n#if EAP_SUPPORT\n            if (ao->neg_eap) {\n            PUTSHORT(PPP_EAP, nakoutp);\n            } else\n#endif /* EAP_SUPPORT */\n#if PAP_SUPPORT\n            if(1) {\n            PUTSHORT(PPP_PAP, nakoutp);\n            }\n            else\n#endif /* PAP_SUPPORT */\n            {}\n            break;\n        }\n        GETCHAR(cichar, p);    /* get digest type */\n        if (!(CHAP_CANDIGEST(ao->chap_mdtype, cichar))) {\n            /*\n             * We can't/won't do the requested type,\n             * suggest something else.\n             */\n            orc = CONFNAK;\n            PUTCHAR(CI_AUTHTYPE, nakoutp);\n            PUTCHAR(CILEN_CHAP, nakoutp);\n            PUTSHORT(PPP_CHAP, nakoutp);\n            PUTCHAR(CHAP_DIGEST(ao->chap_mdtype), nakoutp);\n            break;\n        }\n        ho->chap_mdtype = CHAP_MDTYPE_D(cichar); /* save md type */\n        ho->neg_chap = 1;\n        break;\n        }\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n        if (cishort == PPP_EAP) {\n        /* we've already accepted CHAP or PAP */\n        if (\n#if CHAP_SUPPORT\n            ho->neg_chap ||\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n            ho->neg_upap ||\n#endif /* PAP_SUPPORT */\n            cilen != CILEN_SHORT) {\n            LCPDEBUG((\"lcp_reqci: rcvd AUTHTYPE EAP, rejecting...\"));\n            orc = CONFREJ;\n            break;\n        }\n        if (!ao->neg_eap) {    /* we don't want to do EAP */\n            orc = CONFNAK;    /* NAK it and suggest CHAP or PAP */\n            PUTCHAR(CI_AUTHTYPE, nakoutp);\n#if CHAP_SUPPORT\n            if (ao->neg_chap) {\n            PUTCHAR(CILEN_CHAP, nakoutp);\n            PUTSHORT(PPP_CHAP, nakoutp);\n            PUTCHAR(CHAP_DIGEST(ao->chap_mdtype), nakoutp);\n            } else\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n            if(1) {\n            PUTCHAR(CILEN_SHORT, nakoutp);\n            PUTSHORT(PPP_PAP, nakoutp);\n            } else\n#endif /* PAP_SUPPORT */\n            {}\n            break;\n        }\n        ho->neg_eap = 1;\n        break;\n        }\n#endif /* EAP_SUPPORT */\n\n        /*\n         * We don't recognize the protocol they're asking for.\n         * Nak it with something we're willing to do.\n         * (At this point we know ao->neg_upap || ao->neg_chap ||\n         * ao->neg_eap.)\n         */\n        orc = CONFNAK;\n        PUTCHAR(CI_AUTHTYPE, nakoutp);\n\n#if EAP_SUPPORT\n        if (ao->neg_eap) {\n        PUTCHAR(CILEN_SHORT, nakoutp);\n        PUTSHORT(PPP_EAP, nakoutp);\n        } else\n#endif /* EAP_SUPPORT */\n#if CHAP_SUPPORT\n        if (ao->neg_chap) {\n        PUTCHAR(CILEN_CHAP, nakoutp);\n        PUTSHORT(PPP_CHAP, nakoutp);\n        PUTCHAR(CHAP_DIGEST(ao->chap_mdtype), nakoutp);\n        } else\n#endif /* CHAP_SUPPORT */\n#if PAP_SUPPORT\n        if(1) {\n        PUTCHAR(CILEN_SHORT, nakoutp);\n        PUTSHORT(PPP_PAP, nakoutp);\n        } else\n#endif /* PAP_SUPPORT */\n        {}\n        break;\n\n#if LQR_SUPPORT\n    case CI_QUALITY:\n        if (!ao->neg_lqr ||\n        cilen != CILEN_LQR) {\n        orc = CONFREJ;\n        break;\n        }\n\n        GETSHORT(cishort, p);\n        GETLONG(cilong, p);\n\n        /*\n         * Check the protocol and the reporting period.\n         * XXX When should we Nak this, and what with?\n         */\n        if (cishort != PPP_LQR) {\n        orc = CONFNAK;\n        PUTCHAR(CI_QUALITY, nakoutp);\n        PUTCHAR(CILEN_LQR, nakoutp);\n        PUTSHORT(PPP_LQR, nakoutp);\n        PUTLONG(ao->lqr_period, nakoutp);\n        break;\n        }\n        break;\n#endif /* LQR_SUPPORT */\n\n    case CI_MAGICNUMBER:\n        if (!(ao->neg_magicnumber || go->neg_magicnumber) ||\n        cilen != CILEN_LONG) {\n        orc = CONFREJ;\n        break;\n        }\n        GETLONG(cilong, p);\n\n        /*\n         * He must have a different magic number.\n         */\n        if (go->neg_magicnumber &&\n        cilong == go->magicnumber) {\n        cilong = magic();    /* Don't put magic() inside macro! */\n        orc = CONFNAK;\n        PUTCHAR(CI_MAGICNUMBER, nakoutp);\n        PUTCHAR(CILEN_LONG, nakoutp);\n        PUTLONG(cilong, nakoutp);\n        break;\n        }\n        ho->neg_magicnumber = 1;\n        ho->magicnumber = cilong;\n        break;\n\n\n    case CI_PCOMPRESSION:\n        if (!ao->neg_pcompression ||\n        cilen != CILEN_VOID) {\n        orc = CONFREJ;\n        break;\n        }\n        ho->neg_pcompression = 1;\n        break;\n\n    case CI_ACCOMPRESSION:\n        if (!ao->neg_accompression ||\n        cilen != CILEN_VOID) {\n        orc = CONFREJ;\n        break;\n        }\n        ho->neg_accompression = 1;\n        break;\n\n#ifdef HAVE_MULTILINK\n    case CI_MRRU:\n        if (!ao->neg_mrru\n        || !multilink\n        || cilen != CILEN_SHORT) {\n        orc = CONFREJ;\n        break;\n        }\n\n        GETSHORT(cishort, p);\n        /* possibly should insist on a minimum/maximum MRRU here */\n        ho->neg_mrru = 1;\n        ho->mrru = cishort;\n        break;\n#endif /* HAVE_MULTILINK */\n\n    case CI_SSNHF:\n        if (!ao->neg_ssnhf\n#ifdef HAVE_MULTILINK\n        || !multilink\n#endif /* HAVE_MULTILINK */\n        || cilen != CILEN_VOID) {\n        orc = CONFREJ;\n        break;\n        }\n        ho->neg_ssnhf = 1;\n        break;\n\n    case CI_EPDISC:\n        if (!ao->neg_endpoint ||\n        cilen < CILEN_CHAR ||\n        cilen > CILEN_CHAR + MAX_ENDP_LEN) {\n        orc = CONFREJ;\n        break;\n        }\n        GETCHAR(cichar, p);\n        cilen -= CILEN_CHAR;\n        ho->neg_endpoint = 1;\n        ho->endpoint.class_ = cichar;\n        ho->endpoint.length = cilen;\n        MEMCPY(ho->endpoint.value, p, cilen);\n        INCPTR(cilen, p);\n        break;\n\n    default:\n        LCPDEBUG((\"lcp_reqci: rcvd unknown option %d\", citype));\n        orc = CONFREJ;\n        break;\n    }\n\nendswitch:\n    if (orc == CONFACK &&        /* Good CI */\n        rc != CONFACK)        /*  but prior CI wasnt? */\n        continue;            /* Don't send this one */\n\n    if (orc == CONFNAK) {        /* Nak this CI? */\n        if (reject_if_disagree    /* Getting fed up with sending NAKs? */\n        && citype != CI_MAGICNUMBER) {\n        orc = CONFREJ;        /* Get tough if so */\n        } else {\n        if (rc == CONFREJ)    /* Rejecting prior CI? */\n            continue;        /* Don't send this one */\n        rc = CONFNAK;\n        }\n    }\n    if (orc == CONFREJ) {        /* Reject this CI */\n        rc = CONFREJ;\n        if (cip != rejp)        /* Need to move rejected CI? */\n        MEMCPY(rejp, cip, cilen); /* Move it */\n        INCPTR(cilen, rejp);    /* Update output pointer */\n    }\n    }\n\n    /*\n     * If we wanted to send additional NAKs (for unsent CIs), the\n     * code would go here.  The extra NAKs would go at *nakoutp.\n     * At present there are no cases where we want to ask the\n     * peer to negotiate an option.\n     */\n\n    switch (rc) {\n    case CONFACK:\n    *lenp = next - inp;\n    break;\n    case CONFNAK:\n    /*\n     * Copy the Nak'd options from the nak buffer to the caller's buffer.\n     */\n    *lenp = nakoutp - (u_char*)nakp->payload;\n    MEMCPY(inp, nakp->payload, *lenp);\n    break;\n    case CONFREJ:\n    *lenp = rejp - inp;\n    break;\n    default:\n    break;\n    }\n\n    pbuf_free(nakp);\n    LCPDEBUG((\"lcp_reqci: returning CONF%s.\", CODENAME(rc)));\n    return (rc);            /* Return final code */\n}\n\n\n/*\n * lcp_up - LCP has come UP.\n */\nstatic void lcp_up(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *wo = &pcb->lcp_wantoptions;\n    lcp_options *ho = &pcb->lcp_hisoptions;\n    lcp_options *go = &pcb->lcp_gotoptions;\n    lcp_options *ao = &pcb->lcp_allowoptions;\n    int mtu, mru;\n\n    if (!go->neg_magicnumber)\n    go->magicnumber = 0;\n    if (!ho->neg_magicnumber)\n    ho->magicnumber = 0;\n\n    /*\n     * Set our MTU to the smaller of the MTU we wanted and\n     * the MRU our peer wanted.  If we negotiated an MRU,\n     * set our MRU to the larger of value we wanted and\n     * the value we got in the negotiation.\n     * Note on the MTU: the link MTU can be the MRU the peer wanted,\n     * the interface MTU is set to the lowest of that, the\n     * MTU we want to use, and our link MRU.\n     */\n    mtu = ho->neg_mru? ho->mru: PPP_MRU;\n    mru = go->neg_mru? LWIP_MAX(wo->mru, go->mru): PPP_MRU;\n#ifdef HAVE_MULTILINK\n    if (!(multilink && go->neg_mrru && ho->neg_mrru))\n#endif /* HAVE_MULTILINK */\n    netif_set_mtu(pcb, LWIP_MIN(LWIP_MIN(mtu, mru), ao->mru));\n    ppp_send_config(pcb, mtu,\n            (ho->neg_asyncmap? ho->asyncmap: 0xffffffff),\n            ho->neg_pcompression, ho->neg_accompression);\n    ppp_recv_config(pcb, mru,\n            (pcb->settings.lax_recv? 0: go->neg_asyncmap? go->asyncmap: 0xffffffff),\n            go->neg_pcompression, go->neg_accompression);\n\n    if (ho->neg_mru)\n    pcb->peer_mru = ho->mru;\n\n    lcp_echo_lowerup(f->pcb);  /* Enable echo messages */\n\n    link_established(pcb);\n}\n\n\n/*\n * lcp_down - LCP has gone DOWN.\n *\n * Alert other protocols.\n */\nstatic void lcp_down(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *go = &pcb->lcp_gotoptions;\n\n    lcp_echo_lowerdown(f->pcb);\n\n    link_down(pcb);\n\n    ppp_send_config(pcb, PPP_MRU, 0xffffffff, 0, 0);\n    ppp_recv_config(pcb, PPP_MRU,\n            (go->neg_asyncmap? go->asyncmap: 0xffffffff),\n            go->neg_pcompression, go->neg_accompression);\n    pcb->peer_mru = PPP_MRU;\n}\n\n\n/*\n * lcp_starting - LCP needs the lower layer up.\n */\nstatic void lcp_starting(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    link_required(pcb);\n}\n\n\n/*\n * lcp_finished - LCP has finished with the lower layer.\n */\nstatic void lcp_finished(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    link_terminated(pcb);\n}\n\n\n#if PRINTPKT_SUPPORT\n/*\n * lcp_printpkt - print the contents of an LCP packet.\n */\nstatic const char* const lcp_codenames[] = {\n    \"ConfReq\", \"ConfAck\", \"ConfNak\", \"ConfRej\",\n    \"TermReq\", \"TermAck\", \"CodeRej\", \"ProtRej\",\n    \"EchoReq\", \"EchoRep\", \"DiscReq\", \"Ident\",\n    \"TimeRem\"\n};\n\nstatic int lcp_printpkt(const u_char *p, int plen,\n        void (*printer) (void *, const char *, ...), void *arg) {\n    int code, id, len, olen, i;\n    const u_char *pstart, *optend;\n    u_short cishort;\n    u32_t cilong;\n\n    if (plen < HEADERLEN)\n    return 0;\n    pstart = p;\n    GETCHAR(code, p);\n    GETCHAR(id, p);\n    GETSHORT(len, p);\n    if (len < HEADERLEN || len > plen)\n    return 0;\n\n   if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(lcp_codenames))\n    printer(arg, \" %s\", lcp_codenames[code-1]);\n    else\n    printer(arg, \" code=0x%x\", code);\n    printer(arg, \" id=0x%x\", id);\n    len -= HEADERLEN;\n    switch (code) {\n    case CONFREQ:\n    case CONFACK:\n    case CONFNAK:\n    case CONFREJ:\n    /* print option list */\n    while (len >= 2) {\n        GETCHAR(code, p);\n        GETCHAR(olen, p);\n        p -= 2;\n        if (olen < 2 || olen > len) {\n        break;\n        }\n        printer(arg, \" <\");\n        len -= olen;\n        optend = p + olen;\n        switch (code) {\n        case CI_MRU:\n        if (olen == CILEN_SHORT) {\n            p += 2;\n            GETSHORT(cishort, p);\n            printer(arg, \"mru %d\", cishort);\n        }\n        break;\n        case CI_ASYNCMAP:\n        if (olen == CILEN_LONG) {\n            p += 2;\n            GETLONG(cilong, p);\n            printer(arg, \"asyncmap 0x%x\", cilong);\n        }\n        break;\n        case CI_AUTHTYPE:\n        if (olen >= CILEN_SHORT) {\n            p += 2;\n            printer(arg, \"auth \");\n            GETSHORT(cishort, p);\n            switch (cishort) {\n#if PAP_SUPPORT\n            case PPP_PAP:\n            printer(arg, \"pap\");\n            break;\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n            case PPP_CHAP:\n            printer(arg, \"chap\");\n            if (p < optend) {\n                switch (*p) {\n                case CHAP_MD5:\n                printer(arg, \" MD5\");\n                ++p;\n                break;\n#if MSCHAP_SUPPORT\n                case CHAP_MICROSOFT:\n                printer(arg, \" MS\");\n                ++p;\n                break;\n\n                case CHAP_MICROSOFT_V2:\n                printer(arg, \" MS-v2\");\n                ++p;\n                break;\n#endif /* MSCHAP_SUPPORT */\n                default:\n                break;\n                }\n            }\n            break;\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n            case PPP_EAP:\n            printer(arg, \"eap\");\n            break;\n#endif /* EAP_SUPPORT */\n            default:\n            printer(arg, \"0x%x\", cishort);\n            }\n        }\n        break;\n#if LQR_SUPPORT\n        case CI_QUALITY:\n        if (olen >= CILEN_SHORT) {\n            p += 2;\n            printer(arg, \"quality \");\n            GETSHORT(cishort, p);\n            switch (cishort) {\n            case PPP_LQR:\n            printer(arg, \"lqr\");\n            break;\n            default:\n            printer(arg, \"0x%x\", cishort);\n            }\n        }\n        break;\n#endif /* LQR_SUPPORT */\n        case CI_CALLBACK:\n        if (olen >= CILEN_CHAR) {\n            p += 2;\n            printer(arg, \"callback \");\n            GETCHAR(cishort, p);\n            switch (cishort) {\n            case CBCP_OPT:\n            printer(arg, \"CBCP\");\n            break;\n            default:\n            printer(arg, \"0x%x\", cishort);\n            }\n        }\n        break;\n        case CI_MAGICNUMBER:\n        if (olen == CILEN_LONG) {\n            p += 2;\n            GETLONG(cilong, p);\n            printer(arg, \"magic 0x%x\", cilong);\n        }\n        break;\n        case CI_PCOMPRESSION:\n        if (olen == CILEN_VOID) {\n            p += 2;\n            printer(arg, \"pcomp\");\n        }\n        break;\n        case CI_ACCOMPRESSION:\n        if (olen == CILEN_VOID) {\n            p += 2;\n            printer(arg, \"accomp\");\n        }\n        break;\n        case CI_MRRU:\n        if (olen == CILEN_SHORT) {\n            p += 2;\n            GETSHORT(cishort, p);\n            printer(arg, \"mrru %d\", cishort);\n        }\n        break;\n        case CI_SSNHF:\n        if (olen == CILEN_VOID) {\n            p += 2;\n            printer(arg, \"ssnhf\");\n        }\n        break;\n        case CI_EPDISC:\n#ifdef HAVE_MULTILINK\n        if (olen >= CILEN_CHAR) {\n            struct epdisc epd;\n            p += 2;\n            GETCHAR(epd.class, p);\n            epd.length = olen - CILEN_CHAR;\n            if (epd.length > MAX_ENDP_LEN)\n            epd.length = MAX_ENDP_LEN;\n            if (epd.length > 0) {\n            MEMCPY(epd.value, p, epd.length);\n            p += epd.length;\n            }\n            printer(arg, \"endpoint [%s]\", epdisc_to_str(&epd));\n        }\n#else\n        printer(arg, \"endpoint\");\n#endif\n        break;\n        default:\n        break;\n        }\n        while (p < optend) {\n        GETCHAR(code, p);\n        printer(arg, \" %.2x\", code);\n        }\n        printer(arg, \">\");\n    }\n    break;\n\n    case TERMACK:\n    case TERMREQ:\n    if (len > 0 && *p >= ' ' && *p < 0x7f) {\n        printer(arg, \" \");\n        ppp_print_string(p, len, printer, arg);\n        p += len;\n        len = 0;\n    }\n    break;\n\n    case ECHOREQ:\n    case ECHOREP:\n    case DISCREQ:\n    if (len >= 4) {\n        GETLONG(cilong, p);\n        printer(arg, \" magic=0x%x\", cilong);\n        len -= 4;\n    }\n    break;\n\n    case IDENTIF:\n    case TIMEREM:\n    if (len >= 4) {\n        GETLONG(cilong, p);\n        printer(arg, \" magic=0x%x\", cilong);\n        len -= 4;\n    }\n    if (code == TIMEREM) {\n        if (len < 4)\n        break;\n        GETLONG(cilong, p);\n        printer(arg, \" seconds=%u\", cilong);\n        len -= 4;\n    }\n    if (len > 0) {\n        printer(arg, \" \");\n        ppp_print_string(p, len, printer, arg);\n        p += len;\n        len = 0;\n    }\n    break;\n    default:\n    break;\n    }\n\n    /* print the rest of the bytes in the packet */\n    for (i = 0; i < len && i < 32; ++i) {\n    GETCHAR(code, p);\n    printer(arg, \" %.2x\", code);\n    }\n    if (i < len) {\n    printer(arg, \" ...\");\n    p += len - i;\n    }\n\n    return p - pstart;\n}\n#endif /* PRINTPKT_SUPPORT */\n\n/*\n * Time to shut down the link because there is nothing out there.\n */\n\nstatic void LcpLinkFailure(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    if (f->state == PPP_FSM_OPENED) {\n    ppp_info(\"No response to %d echo-requests\", pcb->lcp_echos_pending);\n        ppp_notice(\"Serial link appears to be disconnected.\");\n    pcb->err_code = PPPERR_PEERDEAD;\n    lcp_close(pcb, \"Peer not responding\");\n    }\n}\n\n/*\n * Timer expired for the LCP echo requests from this process.\n */\n\nstatic void LcpEchoCheck(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n\n    LcpSendEchoRequest (f);\n    if (f->state != PPP_FSM_OPENED)\n    return;\n\n    /*\n     * Start the timer for the next interval.\n     */\n    if (pcb->lcp_echo_timer_running)\n    ppp_warn(\"assertion lcp_echo_timer_running==0 failed\");\n    TIMEOUT (LcpEchoTimeout, f, pcb->settings.lcp_echo_interval);\n    pcb->lcp_echo_timer_running = 1;\n}\n\n/*\n * LcpEchoTimeout - Timer expired on the LCP echo\n */\n\nstatic void LcpEchoTimeout(void *arg) {\n    fsm *f = (fsm*)arg;\n    ppp_pcb *pcb = f->pcb;\n    if (pcb->lcp_echo_timer_running != 0) {\n        pcb->lcp_echo_timer_running = 0;\n        LcpEchoCheck ((fsm *) arg);\n    }\n}\n\n/*\n * LcpEchoReply - LCP has received a reply to the echo\n */\n\nstatic void lcp_received_echo_reply(fsm *f, int id, u_char *inp, int len) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *go = &pcb->lcp_gotoptions;\n    u32_t magic_val;\n    LWIP_UNUSED_ARG(id);\n\n    /* Check the magic number - don't count replies from ourselves. */\n    if (len < 4) {\n    ppp_dbglog(\"lcp: received short Echo-Reply, length %d\", len);\n    return;\n    }\n    GETLONG(magic_val, inp);\n    if (go->neg_magicnumber\n    && magic_val == go->magicnumber) {\n    ppp_warn(\"appear to have received our own echo-reply!\");\n    return;\n    }\n\n    /* Reset the number of outstanding echo frames */\n    pcb->lcp_echos_pending = 0;\n}\n\n/*\n * LcpSendEchoRequest - Send an echo request frame to the peer\n */\n\nstatic void LcpSendEchoRequest(fsm *f) {\n    ppp_pcb *pcb = f->pcb;\n    lcp_options *go = &pcb->lcp_gotoptions;\n    u32_t lcp_magic;\n    u_char pkt[4], *pktp;\n\n    /*\n     * Detect the failure of the peer at this point.\n     */\n    if (pcb->settings.lcp_echo_fails != 0) {\n        if (pcb->lcp_echos_pending >= pcb->settings.lcp_echo_fails) {\n            LcpLinkFailure(f);\n            pcb->lcp_echos_pending = 0;\n    }\n    }\n\n#if PPP_LCP_ADAPTIVE\n    /*\n     * If adaptive echos have been enabled, only send the echo request if\n     * no traffic was received since the last one.\n     */\n    if (pcb->settings.lcp_echo_adaptive) {\n    static unsigned int last_pkts_in = 0;\n\n#if PPP_STATS_SUPPORT\n    update_link_stats(f->unit);\n    link_stats_valid = 0;\n#endif /* PPP_STATS_SUPPORT */\n\n    if (link_stats.pkts_in != last_pkts_in) {\n        last_pkts_in = link_stats.pkts_in;\n        return;\n    }\n    }\n#endif\n\n    /*\n     * Make and send the echo request frame.\n     */\n    if (f->state == PPP_FSM_OPENED) {\n        lcp_magic = go->magicnumber;\n    pktp = pkt;\n    PUTLONG(lcp_magic, pktp);\n        fsm_sdata(f, ECHOREQ, pcb->lcp_echo_number++, pkt, pktp - pkt);\n    ++pcb->lcp_echos_pending;\n    }\n}\n\n/*\n * lcp_echo_lowerup - Start the timer for the LCP frame\n */\n\nstatic void lcp_echo_lowerup(ppp_pcb *pcb) {\n    fsm *f = &pcb->lcp_fsm;\n\n    /* Clear the parameters for generating echo frames */\n    pcb->lcp_echos_pending      = 0;\n    pcb->lcp_echo_number        = 0;\n    pcb->lcp_echo_timer_running = 0;\n  \n    /* If a timeout interval is specified then start the timer */\n    if (pcb->settings.lcp_echo_interval != 0)\n        LcpEchoCheck (f);\n}\n\n/*\n * lcp_echo_lowerdown - Stop the timer for the LCP frame\n */\n\nstatic void lcp_echo_lowerdown(ppp_pcb *pcb) {\n    fsm *f = &pcb->lcp_fsm;\n\n    if (pcb->lcp_echo_timer_running != 0) {\n        UNTIMEOUT (LcpEchoTimeout, f);\n        pcb->lcp_echo_timer_running = 0;\n    }\n}\n\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/magic.c",
    "content": "/*\n * magic.c - PPP Magic Number routines.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n/*****************************************************************************\n* randm.c - Random number generator program file.\n*\n* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.\n* Copyright (c) 1998 by Global Election Systems Inc.\n*\n* The authors hereby grant permission to use, copy, modify, distribute,\n* and license this software and its documentation for any purpose, provided\n* that existing copyright notices are retained in all copies and that this\n* notice and the following disclaimer are included verbatim in any\n* distributions. No written agreement, license, or royalty fee is required\n* for any of the authorized uses.\n*\n* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR\n* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n******************************************************************************\n* REVISION HISTORY\n*\n* 03-01-01 Marc Boucher <marc@mbsi.ca>\n*   Ported to lwIP.\n* 98-06-03 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.\n*   Extracted from avos.\n*****************************************************************************/\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#include \"netif/ppp/ppp_impl.h\"\n#include \"netif/ppp/magic.h\"\n\n#if PPP_MD5_RANDM /* Using MD5 for better randomness if enabled */\n\n#include \"netif/ppp/pppcrypt.h\"\n\n#define MD5_HASH_SIZE 16\nstatic char magic_randpool[MD5_HASH_SIZE];   /* Pool of randomness. */\nstatic long magic_randcount;      /* Pseudo-random incrementer */\nstatic u32_t magic_randomseed;    /* Seed used for random number generation. */\n\n/*\n * Churn the randomness pool on a random event.  Call this early and often\n *  on random and semi-random system events to build randomness in time for\n *  usage.  For randomly timed events, pass a null pointer and a zero length\n *  and this will use the system timer and other sources to add randomness.\n *  If new random data is available, pass a pointer to that and it will be\n *  included.\n *\n * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427\n */\nstatic void magic_churnrand(char *rand_data, u32_t rand_len) {\n  lwip_md5_context md5_ctx;\n\n  /* LWIP_DEBUGF(LOG_INFO, (\"magic_churnrand: %u@%P\\n\", rand_len, rand_data)); */\n  lwip_md5_init(&md5_ctx);\n  lwip_md5_starts(&md5_ctx);\n  lwip_md5_update(&md5_ctx, (u_char *)magic_randpool, sizeof(magic_randpool));\n  if (rand_data) {\n    lwip_md5_update(&md5_ctx, (u_char *)rand_data, rand_len);\n  } else {\n    struct {\n      /* INCLUDE fields for any system sources of randomness */\n      u32_t jiffies;\n#ifdef LWIP_RAND\n      u32_t rand;\n#endif /* LWIP_RAND */\n    } sys_data;\n    magic_randomseed += sys_jiffies();\n    sys_data.jiffies = magic_randomseed;\n#ifdef LWIP_RAND\n    sys_data.rand = LWIP_RAND();\n#endif /* LWIP_RAND */\n    /* Load sys_data fields here. */\n    lwip_md5_update(&md5_ctx, (u_char *)&sys_data, sizeof(sys_data));\n  }\n  lwip_md5_finish(&md5_ctx, (u_char *)magic_randpool);\n  lwip_md5_free(&md5_ctx);\n/*  LWIP_DEBUGF(LOG_INFO, (\"magic_churnrand: -> 0\\n\")); */\n}\n\n/*\n * Initialize the random number generator.\n */\nvoid magic_init(void) {\n  magic_churnrand(NULL, 0);\n}\n\n/*\n * Randomize our random seed value.\n */\nvoid magic_randomize(void) {\n  magic_churnrand(NULL, 0);\n}\n\n/*\n * magic_random_bytes - Fill a buffer with random bytes.\n *\n * Use the random pool to generate random data.  This degrades to pseudo\n *  random when used faster than randomness is supplied using magic_churnrand().\n * Note: It's important that there be sufficient randomness in magic_randpool\n *  before this is called for otherwise the range of the result may be\n *  narrow enough to make a search feasible.\n *\n * Ref: Applied Cryptography 2nd Ed. by Bruce Schneier p. 427\n *\n * XXX Why does he not just call magic_churnrand() for each block?  Probably\n *  so that you don't ever publish the seed which could possibly help\n *  predict future values.\n * XXX Why don't we preserve md5 between blocks and just update it with\n *  magic_randcount each time?  Probably there is a weakness but I wish that\n *  it was documented.\n */\nvoid magic_random_bytes(unsigned char *buf, u32_t buf_len) {\n  lwip_md5_context md5_ctx;\n  u_char tmp[MD5_HASH_SIZE];\n  u32_t n;\n\n  while (buf_len > 0) {\n    lwip_md5_init(&md5_ctx);\n    lwip_md5_starts(&md5_ctx);\n    lwip_md5_update(&md5_ctx, (u_char *)magic_randpool, sizeof(magic_randpool));\n    lwip_md5_update(&md5_ctx, (u_char *)&magic_randcount, sizeof(magic_randcount));\n    lwip_md5_finish(&md5_ctx, tmp);\n    lwip_md5_free(&md5_ctx);\n    magic_randcount++;\n    n = LWIP_MIN(buf_len, MD5_HASH_SIZE);\n    MEMCPY(buf, tmp, n);\n    buf += n;\n    buf_len -= n;\n  }\n}\n\n/*\n * Return a new random number.\n */\nu32_t magic(void) {\n  u32_t new_rand;\n\n  magic_random_bytes((unsigned char *)&new_rand, sizeof(new_rand));\n\n  return new_rand;\n}\n\n#else /* PPP_MD5_RANDM */\n\n/*****************************/\n/*** LOCAL DATA STRUCTURES ***/\n/*****************************/\n#ifndef LWIP_RAND\nstatic int  magic_randomized;       /* Set when truely randomized. */\n#endif /* LWIP_RAND */\nstatic u32_t magic_randomseed;      /* Seed used for random number generation. */\n\n\n/***********************************/\n/*** PUBLIC FUNCTION DEFINITIONS ***/\n/***********************************/\n\n/*\n * Initialize the random number generator.\n *\n * Here we attempt to compute a random number seed but even if\n * it isn't random, we'll randomize it later.\n *\n * The current method uses the fields from the real time clock,\n * the idle process counter, the millisecond counter, and the\n * hardware timer tick counter.  When this is invoked\n * in startup(), then the idle counter and timer values may\n * repeat after each boot and the real time clock may not be\n * operational.  Thus we call it again on the first random\n * event.\n */\nvoid magic_init(void) {\n  magic_randomseed += sys_jiffies();\n#ifndef LWIP_RAND\n  /* Initialize the Borland random number generator. */\n  srand((unsigned)magic_randomseed);\n#endif /* LWIP_RAND */\n}\n\n/*\n * magic_init - Initialize the magic number generator.\n *\n * Randomize our random seed value.  Here we use the fact that\n * this function is called at *truely random* times by the polling\n * and network functions.  Here we only get 16 bits of new random\n * value but we use the previous value to randomize the other 16\n * bits.\n */\nvoid magic_randomize(void) {\n#ifndef LWIP_RAND\n  if (!magic_randomized) {\n    magic_randomized = !0;\n    magic_init();\n    /* The initialization function also updates the seed. */\n  } else {\n#endif /* LWIP_RAND */\n    magic_randomseed += sys_jiffies();\n#ifndef LWIP_RAND\n  }\n#endif /* LWIP_RAND */\n}\n\n/*\n * Return a new random number.\n *\n * Here we use the Borland rand() function to supply a pseudo random\n * number which we make truely random by combining it with our own\n * seed which is randomized by truely random events.\n * Thus the numbers will be truely random unless there have been no\n * operator or network events in which case it will be pseudo random\n * seeded by the real time clock.\n */\nu32_t magic(void) {\n#ifdef LWIP_RAND\n  return LWIP_RAND() + magic_randomseed;\n#else /* LWIP_RAND */\n  return ((u32_t)rand() << 16) + (u32_t)rand() + magic_randomseed;\n#endif /* LWIP_RAND */\n}\n\n/*\n * magic_random_bytes - Fill a buffer with random bytes.\n */\nvoid magic_random_bytes(unsigned char *buf, u32_t buf_len) {\n  u32_t new_rand, n;\n\n  while (buf_len > 0) {\n    new_rand = magic();\n    n = LWIP_MIN(buf_len, sizeof(new_rand));\n    MEMCPY(buf, &new_rand, n);\n    buf += n;\n    buf_len -= n;\n  }\n}\n#endif /* PPP_MD5_RANDM */\n\n/*\n * Return a new random number between 0 and (2^pow)-1 included.\n */\nu32_t magic_pow(u8_t pow) {\n  return magic() & ~(~0UL<<pow);\n}\n\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/mppe.c",
    "content": "/*\n * mppe.c - interface MPPE to the PPP code.\n *\n * By Frank Cusack <fcusack@fcusack.com>.\n * Copyright (c) 2002,2003,2004 Google, Inc.\n * All rights reserved.\n *\n * License:\n * Permission to use, copy, modify, and distribute this software and its\n * documentation is hereby granted, provided that the above copyright\n * notice appears in all copies.  This software is provided without any\n * warranty, express or implied.\n *\n * Changelog:\n *      08/12/05 - Matt Domsch <Matt_Domsch@dell.com>\n *                 Only need extra skb padding on transmit, not receive.\n *      06/18/04 - Matt Domsch <Matt_Domsch@dell.com>, Oleg Makarenko <mole@quadra.ru>\n *                 Use Linux kernel 2.6 arc4 and sha1 routines rather than\n *                 providing our own.\n *      2/15/04 - TS: added #include <version.h> and testing for Kernel\n *                    version before using\n *                    MOD_DEC_USAGE_COUNT/MOD_INC_USAGE_COUNT which are\n *                    deprecated in 2.6\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && MPPE_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n#include <string.h>\n\n#include \"lwip/err.h\"\n\n#include \"netif/ppp/ppp_impl.h\"\n#include \"netif/ppp/ccp.h\"\n#include \"netif/ppp/mppe.h\"\n#include \"netif/ppp/pppdebug.h\"\n#include \"netif/ppp/pppcrypt.h\"\n\n#define SHA1_SIGNATURE_SIZE 20\n\n/* ppp_mppe_state.bits definitions */\n#define MPPE_BIT_A    0x80    /* Encryption table were (re)inititalized */\n#define MPPE_BIT_B    0x40    /* MPPC only (not implemented) */\n#define MPPE_BIT_C    0x20    /* MPPC only (not implemented) */\n#define MPPE_BIT_D    0x10    /* This is an encrypted frame */\n\n#define MPPE_BIT_FLUSHED    MPPE_BIT_A\n#define MPPE_BIT_ENCRYPTED    MPPE_BIT_D\n\n#define MPPE_BITS(p) ((p)[0] & 0xf0)\n#define MPPE_CCOUNT(p) ((((p)[0] & 0x0f) << 8) + (p)[1])\n#define MPPE_CCOUNT_SPACE 0x1000    /* The size of the ccount space */\n\n#define MPPE_OVHD    2    /* MPPE overhead/packet */\n#define SANITY_MAX    1600    /* Max bogon factor we will tolerate */\n\n/*\n * Perform the MPPE rekey algorithm, from RFC 3078, sec. 7.3.\n * Well, not what's written there, but rather what they meant.\n */\nstatic void mppe_rekey(ppp_mppe_state * state, int initial_key)\n{\n    lwip_sha1_context sha1_ctx;\n    u8_t sha1_digest[SHA1_SIGNATURE_SIZE];\n\n    /*\n     * Key Derivation, from RFC 3078, RFC 3079.\n     * Equivalent to Get_Key() for MS-CHAP as described in RFC 3079.\n     */\n    lwip_sha1_init(&sha1_ctx);\n    lwip_sha1_starts(&sha1_ctx);\n    lwip_sha1_update(&sha1_ctx, state->master_key, state->keylen);\n    lwip_sha1_update(&sha1_ctx, mppe_sha1_pad1, SHA1_PAD_SIZE);\n    lwip_sha1_update(&sha1_ctx, state->session_key, state->keylen);\n    lwip_sha1_update(&sha1_ctx, mppe_sha1_pad2, SHA1_PAD_SIZE);\n    lwip_sha1_finish(&sha1_ctx, sha1_digest);\n    lwip_sha1_free(&sha1_ctx);\n    MEMCPY(state->session_key, sha1_digest, state->keylen);\n\n    if (!initial_key) {\n        lwip_arc4_init(&state->arc4);\n        lwip_arc4_setup(&state->arc4, sha1_digest, state->keylen);\n        lwip_arc4_crypt(&state->arc4, state->session_key, state->keylen);\n        lwip_arc4_free(&state->arc4);\n    }\n    if (state->keylen == 8) {\n        /* See RFC 3078 */\n        state->session_key[0] = 0xd1;\n        state->session_key[1] = 0x26;\n        state->session_key[2] = 0x9e;\n    }\n    lwip_arc4_init(&state->arc4);\n    lwip_arc4_setup(&state->arc4, state->session_key, state->keylen);\n}\n\n/*\n * Set key, used by MSCHAP before mppe_init() is actually called by CCP so we\n * don't have to keep multiple copies of keys.\n */\nvoid mppe_set_key(ppp_pcb *pcb, ppp_mppe_state *state, u8_t *key) {\n    LWIP_UNUSED_ARG(pcb);\n    MEMCPY(state->master_key, key, MPPE_MAX_KEY_LEN);\n}\n\n/*\n * Initialize (de)compressor state.\n */\nvoid\nmppe_init(ppp_pcb *pcb, ppp_mppe_state *state, u8_t options)\n{\n#if PPP_DEBUG\n    const u8_t *debugstr = (const u8_t*)\"mppe_comp_init\";\n    if (&pcb->mppe_decomp == state) {\n        debugstr = (const u8_t*)\"mppe_decomp_init\";\n    }\n#endif /* PPP_DEBUG */\n\n    /* Save keys. */\n    MEMCPY(state->session_key, state->master_key, sizeof(state->master_key));\n\n    if (options & MPPE_OPT_128)\n        state->keylen = 16;\n    else if (options & MPPE_OPT_40)\n        state->keylen = 8;\n    else {\n        PPPDEBUG(LOG_DEBUG, (\"%s[%d]: unknown key length\\n\", debugstr,\n            pcb->netif->num));\n        lcp_close(pcb, \"MPPE required but peer negotiation failed\");\n        return;\n    }\n    if (options & MPPE_OPT_STATEFUL)\n        state->stateful = 1;\n\n    /* Generate the initial session key. */\n    mppe_rekey(state, 1);\n\n#if PPP_DEBUG\n    {\n        int i;\n        char mkey[sizeof(state->master_key) * 2 + 1];\n        char skey[sizeof(state->session_key) * 2 + 1];\n\n        PPPDEBUG(LOG_DEBUG, (\"%s[%d]: initialized with %d-bit %s mode\\n\",\n               debugstr, pcb->netif->num, (state->keylen == 16) ? 128 : 40,\n               (state->stateful) ? \"stateful\" : \"stateless\"));\n\n        for (i = 0; i < (int)sizeof(state->master_key); i++)\n            sprintf(mkey + i * 2, \"%02x\", state->master_key[i]);\n        for (i = 0; i < (int)sizeof(state->session_key); i++)\n            sprintf(skey + i * 2, \"%02x\", state->session_key[i]);\n        PPPDEBUG(LOG_DEBUG,\n               (\"%s[%d]: keys: master: %s initial session: %s\\n\",\n               debugstr, pcb->netif->num, mkey, skey));\n    }\n#endif /* PPP_DEBUG */\n\n    /*\n     * Initialize the coherency count.  The initial value is not specified\n     * in RFC 3078, but we can make a reasonable assumption that it will\n     * start at 0.  Setting it to the max here makes the comp/decomp code\n     * do the right thing (determined through experiment).\n     */\n    state->ccount = MPPE_CCOUNT_SPACE - 1;\n\n    /*\n     * Note that even though we have initialized the key table, we don't\n     * set the FLUSHED bit.  This is contrary to RFC 3078, sec. 3.1.\n     */\n    state->bits = MPPE_BIT_ENCRYPTED;\n}\n\n/*\n * We received a CCP Reset-Request (actually, we are sending a Reset-Ack),\n * tell the compressor to rekey.  Note that we MUST NOT rekey for\n * every CCP Reset-Request; we only rekey on the next xmit packet.\n * We might get multiple CCP Reset-Requests if our CCP Reset-Ack is lost.\n * So, rekeying for every CCP Reset-Request is broken as the peer will not\n * know how many times we've rekeyed.  (If we rekey and THEN get another\n * CCP Reset-Request, we must rekey again.)\n */\nvoid mppe_comp_reset(ppp_pcb *pcb, ppp_mppe_state *state)\n{\n    LWIP_UNUSED_ARG(pcb);\n    state->bits |= MPPE_BIT_FLUSHED;\n}\n\n/*\n * Compress (encrypt) a packet.\n * It's strange to call this a compressor, since the output is always\n * MPPE_OVHD + 2 bytes larger than the input.\n */\nerr_t\nmppe_compress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb, u16_t protocol)\n{\n    struct pbuf *n, *np;\n    u8_t *pl;\n    err_t err;\n\n    LWIP_UNUSED_ARG(pcb);\n\n    /* TCP stack requires that we don't change the packet payload, therefore we copy\n     * the whole packet before encryption.\n     */\n    np = pbuf_alloc(PBUF_RAW, MPPE_OVHD + sizeof(protocol) + (*pb)->tot_len, PBUF_POOL);\n    if (!np) {\n        return ERR_MEM;\n    }\n\n    /* Hide MPPE header + protocol */\n    pbuf_header(np, -(s16_t)(MPPE_OVHD + sizeof(protocol)));\n\n    if ((err = pbuf_copy(np, *pb)) != ERR_OK) {\n        pbuf_free(np);\n        return err;\n    }\n\n    /* Reveal MPPE header + protocol */\n    pbuf_header(np, (s16_t)(MPPE_OVHD + sizeof(protocol)));\n\n    *pb = np;\n    pl = (u8_t*)np->payload;\n\n    state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;\n    PPPDEBUG(LOG_DEBUG, (\"mppe_compress[%d]: ccount %d\\n\", pcb->netif->num, state->ccount));\n    /* FIXME: use PUT* macros */\n    pl[0] = state->ccount>>8;\n    pl[1] = state->ccount;\n\n    if (!state->stateful ||    /* stateless mode     */\n        ((state->ccount & 0xff) == 0xff) ||    /* \"flag\" packet      */\n        (state->bits & MPPE_BIT_FLUSHED)) {    /* CCP Reset-Request  */\n        /* We must rekey */\n        if (state->stateful) {\n            PPPDEBUG(LOG_DEBUG, (\"mppe_compress[%d]: rekeying\\n\", pcb->netif->num));\n        }\n        mppe_rekey(state, 0);\n        state->bits |= MPPE_BIT_FLUSHED;\n    }\n    pl[0] |= state->bits;\n    state->bits &= ~MPPE_BIT_FLUSHED;    /* reset for next xmit */\n    pl += MPPE_OVHD;\n\n    /* Add protocol */\n    /* FIXME: add PFC support */\n    pl[0] = protocol >> 8;\n    pl[1] = protocol;\n\n    /* Hide MPPE header */\n    pbuf_header(np, -(s16_t)MPPE_OVHD);\n\n    /* Encrypt packet */\n    for (n = np; n != NULL; n = n->next) {\n        lwip_arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len);\n        if (n->tot_len == n->len) {\n            break;\n        }\n    }\n\n    /* Reveal MPPE header */\n    pbuf_header(np, (s16_t)MPPE_OVHD);\n\n    return ERR_OK;\n}\n\n/*\n * We received a CCP Reset-Ack.  Just ignore it.\n */\nvoid mppe_decomp_reset(ppp_pcb *pcb, ppp_mppe_state *state)\n{\n    LWIP_UNUSED_ARG(pcb);\n    LWIP_UNUSED_ARG(state);\n    return;\n}\n\n/*\n * Decompress (decrypt) an MPPE packet.\n */\nerr_t\nmppe_decompress(ppp_pcb *pcb, ppp_mppe_state *state, struct pbuf **pb)\n{\n    struct pbuf *n0 = *pb, *n;\n    u8_t *pl;\n    u16_t ccount;\n    u8_t flushed;\n\n    /* MPPE Header */\n    if (n0->len < MPPE_OVHD) {\n        PPPDEBUG(LOG_DEBUG,\n               (\"mppe_decompress[%d]: short pkt (%d)\\n\",\n               pcb->netif->num, n0->len));\n        state->sanity_errors += 100;\n        goto sanity_error;\n    }\n\n    pl = (u8_t*)n0->payload;\n    flushed = MPPE_BITS(pl) & MPPE_BIT_FLUSHED;\n    ccount = MPPE_CCOUNT(pl);\n    PPPDEBUG(LOG_DEBUG, (\"mppe_decompress[%d]: ccount %d\\n\",\n           pcb->netif->num, ccount));\n\n    /* sanity checks -- terminate with extreme prejudice */\n    if (!(MPPE_BITS(pl) & MPPE_BIT_ENCRYPTED)) {\n        PPPDEBUG(LOG_DEBUG,\n               (\"mppe_decompress[%d]: ENCRYPTED bit not set!\\n\",\n               pcb->netif->num));\n        state->sanity_errors += 100;\n        goto sanity_error;\n    }\n    if (!state->stateful && !flushed) {\n        PPPDEBUG(LOG_DEBUG, (\"mppe_decompress[%d]: FLUSHED bit not set in \"\n               \"stateless mode!\\n\", pcb->netif->num));\n        state->sanity_errors += 100;\n        goto sanity_error;\n    }\n    if (state->stateful && ((ccount & 0xff) == 0xff) && !flushed) {\n        PPPDEBUG(LOG_DEBUG, (\"mppe_decompress[%d]: FLUSHED bit not set on \"\n               \"flag packet!\\n\", pcb->netif->num));\n        state->sanity_errors += 100;\n        goto sanity_error;\n    }\n\n    /*\n     * Check the coherency count.\n     */\n\n    if (!state->stateful) {\n        /* Discard late packet */\n        if ((ccount - state->ccount) % MPPE_CCOUNT_SPACE > MPPE_CCOUNT_SPACE / 2) {\n            state->sanity_errors++;\n            goto sanity_error;\n        }\n\n        /* RFC 3078, sec 8.1.  Rekey for every packet. */\n        while (state->ccount != ccount) {\n            mppe_rekey(state, 0);\n            state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;\n        }\n    } else {\n        /* RFC 3078, sec 8.2. */\n        if (!state->discard) {\n            /* normal state */\n            state->ccount = (state->ccount + 1) % MPPE_CCOUNT_SPACE;\n            if (ccount != state->ccount) {\n                /*\n                 * (ccount > state->ccount)\n                 * Packet loss detected, enter the discard state.\n                 * Signal the peer to rekey (by sending a CCP Reset-Request).\n                 */\n                state->discard = 1;\n                ccp_resetrequest(pcb);\n                return ERR_BUF;\n            }\n        } else {\n            /* discard state */\n            if (!flushed) {\n                /* ccp.c will be silent (no additional CCP Reset-Requests). */\n                return ERR_BUF;\n            } else {\n                /* Rekey for every missed \"flag\" packet. */\n                while ((ccount & ~0xff) !=\n                       (state->ccount & ~0xff)) {\n                    mppe_rekey(state, 0);\n                    state->ccount =\n                        (state->ccount +\n                         256) % MPPE_CCOUNT_SPACE;\n                }\n\n                /* reset */\n                state->discard = 0;\n                state->ccount = ccount;\n                /*\n                 * Another problem with RFC 3078 here.  It implies that the\n                 * peer need not send a Reset-Ack packet.  But RFC 1962\n                 * requires it.  Hopefully, M$ does send a Reset-Ack; even\n                 * though it isn't required for MPPE synchronization, it is\n                 * required to reset CCP state.\n                 */\n            }\n        }\n        if (flushed)\n            mppe_rekey(state, 0);\n    }\n\n    /* Hide MPPE header */\n    pbuf_header(n0, -(s16_t)(MPPE_OVHD));\n\n    /* Decrypt the packet. */\n    for (n = n0; n != NULL; n = n->next) {\n        lwip_arc4_crypt(&state->arc4, (u8_t*)n->payload, n->len);\n        if (n->tot_len == n->len) {\n            break;\n        }\n    }\n\n    /* good packet credit */\n    state->sanity_errors >>= 1;\n\n    return ERR_OK;\n\nsanity_error:\n    if (state->sanity_errors >= SANITY_MAX) {\n        /*\n         * Take LCP down if the peer is sending too many bogons.\n         * We don't want to do this for a single or just a few\n         * instances since it could just be due to packet corruption.\n         */\n        lcp_close(pcb, \"Too many MPPE errors\");\n    }\n    return ERR_BUF;\n}\n\n#endif /* PPP_SUPPORT && MPPE_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/multilink.c",
    "content": "/*\n * multilink.c - support routines for multilink.\n *\n * Copyright (c) 2000-2002 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && defined(HAVE_MULTILINK) /* don't build if not configured for use in lwipopts.h */\n\n/* Multilink support\n *\n * Multilink uses Samba TDB (Trivial Database Library), which\n * we cannot port, because it needs a filesystem.\n *\n * We have to choose between doing a memory-shared TDB-clone,\n * or dropping multilink support at all.\n */\n\n#include <string.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <netdb.h>\n#include <errno.h>\n#include <signal.h>\n#include <netinet/in.h>\n#include <unistd.h>\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/fsm.h\"\n#include \"netif/ppp/lcp.h\"\n#include \"netif/ppp/tdb.h\"\n\nbool endpoint_specified;    /* user gave explicit endpoint discriminator */\nchar *bundle_id;        /* identifier for our bundle */\nchar *blinks_id;        /* key for the list of links */\nbool doing_multilink;        /* multilink was enabled and agreed to */\nbool multilink_master;        /* we own the multilink bundle */\n\nextern TDB_CONTEXT *pppdb;\nextern char db_key[];\n\nstatic void make_bundle_links (int append);\nstatic void remove_bundle_link (void);\nstatic void iterate_bundle_links (void (*func) (char *));\n\nstatic int get_default_epdisc (struct epdisc *);\nstatic int parse_num (char *str, const char *key, int *valp);\nstatic int owns_unit (TDB_DATA pid, int unit);\n\n#define set_ip_epdisc(ep, addr) do {    \\\n    ep->length = 4;            \\\n    ep->value[0] = addr >> 24;    \\\n    ep->value[1] = addr >> 16;    \\\n    ep->value[2] = addr >> 8;    \\\n    ep->value[3] = addr;        \\\n} while (0)\n\n#define LOCAL_IP_ADDR(addr)                          \\\n    (((addr) & 0xff000000) == 0x0a000000        /* 10.x.x.x */      \\\n     || ((addr) & 0xfff00000) == 0xac100000        /* 172.16.x.x */  \\\n     || ((addr) & 0xffff0000) == 0xc0a80000)    /* 192.168.x.x */\n\n#define process_exists(n)    (kill((n), 0) == 0 || errno != ESRCH)\n\nvoid\nmp_check_options()\n{\n    lcp_options *wo = &lcp_wantoptions[0];\n    lcp_options *ao = &lcp_allowoptions[0];\n\n    doing_multilink = 0;\n    if (!multilink)\n        return;\n    /* if we're doing multilink, we have to negotiate MRRU */\n    if (!wo->neg_mrru) {\n        /* mrru not specified, default to mru */\n        wo->mrru = wo->mru;\n        wo->neg_mrru = 1;\n    }\n    ao->mrru = ao->mru;\n    ao->neg_mrru = 1;\n\n    if (!wo->neg_endpoint && !noendpoint) {\n        /* get a default endpoint value */\n        wo->neg_endpoint = get_default_epdisc(&wo->endpoint);\n    }\n}\n\n/*\n * Make a new bundle or join us to an existing bundle\n * if we are doing multilink.\n */\nint\nmp_join_bundle()\n{\n    lcp_options *go = &lcp_gotoptions[0];\n    lcp_options *ho = &lcp_hisoptions[0];\n    lcp_options *ao = &lcp_allowoptions[0];\n    int unit, pppd_pid;\n    int l, mtu;\n    char *p;\n    TDB_DATA key, pid, rec;\n\n    if (doing_multilink) {\n        /* have previously joined a bundle */\n        if (!go->neg_mrru || !ho->neg_mrru) {\n            notice(\"oops, didn't get multilink on renegotiation\");\n            lcp_close(pcb, \"multilink required\");\n            return 0;\n        }\n        /* XXX should check the peer_authname and ho->endpoint\n           are the same as previously */\n        return 0;\n    }\n\n    if (!go->neg_mrru || !ho->neg_mrru) {\n        /* not doing multilink */\n        if (go->neg_mrru)\n            notice(\"oops, multilink negotiated only for receive\");\n        mtu = ho->neg_mru? ho->mru: PPP_MRU;\n        if (mtu > ao->mru)\n            mtu = ao->mru;\n        if (demand) {\n            /* already have a bundle */\n            cfg_bundle(0, 0, 0, 0);\n            netif_set_mtu(pcb, mtu);\n            return 0;\n        }\n        make_new_bundle(0, 0, 0, 0);\n        set_ifunit(1);\n        netif_set_mtu(pcb, mtu);\n        return 0;\n    }\n\n    doing_multilink = 1;\n\n    /*\n     * Find the appropriate bundle or join a new one.\n     * First we make up a name for the bundle.\n     * The length estimate is worst-case assuming every\n     * character has to be quoted.\n     */\n    l = 4 * strlen(peer_authname) + 10;\n    if (ho->neg_endpoint)\n        l += 3 * ho->endpoint.length + 8;\n    if (bundle_name)\n        l += 3 * strlen(bundle_name) + 2;\n    bundle_id = malloc(l);\n    if (bundle_id == 0)\n        novm(\"bundle identifier\");\n\n    p = bundle_id;\n    p += slprintf(p, l-1, \"BUNDLE=\\\"%q\\\"\", peer_authname);\n    if (ho->neg_endpoint || bundle_name)\n        *p++ = '/';\n    if (ho->neg_endpoint)\n        p += slprintf(p, bundle_id+l-p, \"%s\",\n                  epdisc_to_str(&ho->endpoint));\n    if (bundle_name)\n        p += slprintf(p, bundle_id+l-p, \"/%v\", bundle_name);\n\n    /* Make the key for the list of links belonging to the bundle */\n    l = p - bundle_id;\n    blinks_id = malloc(l + 7);\n    if (blinks_id == NULL)\n        novm(\"bundle links key\");\n    slprintf(blinks_id, l + 7, \"BUNDLE_LINKS=%s\", bundle_id + 7);\n\n    /*\n     * For demand mode, we only need to configure the bundle\n     * and attach the link.\n     */\n    mtu = LWIP_MIN(ho->mrru, ao->mru);\n    if (demand) {\n        cfg_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);\n        netif_set_mtu(pcb, mtu);\n        script_setenv(\"BUNDLE\", bundle_id + 7, 1);\n        return 0;\n    }\n\n    /*\n     * Check if the bundle ID is already in the database.\n     */\n    unit = -1;\n    lock_db();\n    key.dptr = bundle_id;\n    key.dsize = p - bundle_id;\n    pid = tdb_fetch(pppdb, key);\n    if (pid.dptr != NULL) {\n        /* bundle ID exists, see if the pppd record exists */\n        rec = tdb_fetch(pppdb, pid);\n        if (rec.dptr != NULL && rec.dsize > 0) {\n            /* make sure the string is null-terminated */\n            rec.dptr[rec.dsize-1] = 0;\n            /* parse the interface number */\n            parse_num(rec.dptr, \"IFNAME=ppp\", &unit);\n            /* check the pid value */\n            if (!parse_num(rec.dptr, \"PPPD_PID=\", &pppd_pid)\n                || !process_exists(pppd_pid)\n                || !owns_unit(pid, unit))\n                unit = -1;\n            free(rec.dptr);\n        }\n        free(pid.dptr);\n    }\n\n    if (unit >= 0) {\n        /* attach to existing unit */\n        if (bundle_attach(unit)) {\n            set_ifunit(0);\n            script_setenv(\"BUNDLE\", bundle_id + 7, 0);\n            make_bundle_links(1);\n            unlock_db();\n            info(\"Link attached to %s\", ifname);\n            return 1;\n        }\n        /* attach failed because bundle doesn't exist */\n    }\n\n    /* we have to make a new bundle */\n    make_new_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);\n    set_ifunit(1);\n    netif_set_mtu(pcb, mtu);\n    script_setenv(\"BUNDLE\", bundle_id + 7, 1);\n    make_bundle_links(pcb);\n    unlock_db();\n    info(\"New bundle %s created\", ifname);\n    multilink_master = 1;\n    return 0;\n}\n\nvoid mp_exit_bundle()\n{\n    lock_db();\n    remove_bundle_link();\n    unlock_db();\n}\n\nstatic void sendhup(char *str)\n{\n    int pid;\n\n    if (parse_num(str, \"PPPD_PID=\", &pid) && pid != getpid()) {\n        if (debug)\n            dbglog(\"sending SIGHUP to process %d\", pid);\n        kill(pid, SIGHUP);\n    }\n}\n\nvoid mp_bundle_terminated()\n{\n    TDB_DATA key;\n\n    bundle_terminating = 1;\n    upper_layers_down(pcb);\n    notice(\"Connection terminated.\");\n#if PPP_STATS_SUPPORT\n    print_link_stats();\n#endif /* PPP_STATS_SUPPORT */\n    if (!demand) {\n        remove_pidfiles();\n        script_unsetenv(\"IFNAME\");\n    }\n\n    lock_db();\n    destroy_bundle();\n    iterate_bundle_links(sendhup);\n    key.dptr = blinks_id;\n    key.dsize = strlen(blinks_id);\n    tdb_delete(pppdb, key);\n    unlock_db();\n\n    new_phase(PPP_PHASE_DEAD);\n\n    doing_multilink = 0;\n    multilink_master = 0;\n}\n\nstatic void make_bundle_links(int append)\n{\n    TDB_DATA key, rec;\n    char *p;\n    char entry[32];\n    int l;\n\n    key.dptr = blinks_id;\n    key.dsize = strlen(blinks_id);\n    slprintf(entry, sizeof(entry), \"%s;\", db_key);\n    p = entry;\n    if (append) {\n        rec = tdb_fetch(pppdb, key);\n        if (rec.dptr != NULL && rec.dsize > 0) {\n            rec.dptr[rec.dsize-1] = 0;\n            if (strstr(rec.dptr, db_key) != NULL) {\n                /* already in there? strange */\n                warn(\"link entry already exists in tdb\");\n                return;\n            }\n            l = rec.dsize + strlen(entry);\n            p = malloc(l);\n            if (p == NULL)\n                novm(\"bundle link list\");\n            slprintf(p, l, \"%s%s\", rec.dptr, entry);\n        } else {\n            warn(\"bundle link list not found\");\n        }\n        if (rec.dptr != NULL)\n            free(rec.dptr);\n    }\n    rec.dptr = p;\n    rec.dsize = strlen(p) + 1;\n    if (tdb_store(pppdb, key, rec, TDB_REPLACE))\n        error(\"couldn't %s bundle link list\",\n              append? \"update\": \"create\");\n    if (p != entry)\n        free(p);\n}\n\nstatic void remove_bundle_link()\n{\n    TDB_DATA key, rec;\n    char entry[32];\n    char *p, *q;\n    int l;\n\n    key.dptr = blinks_id;\n    key.dsize = strlen(blinks_id);\n    slprintf(entry, sizeof(entry), \"%s;\", db_key);\n\n    rec = tdb_fetch(pppdb, key);\n    if (rec.dptr == NULL || rec.dsize <= 0) {\n        if (rec.dptr != NULL)\n            free(rec.dptr);\n        return;\n    }\n    rec.dptr[rec.dsize-1] = 0;\n    p = strstr(rec.dptr, entry);\n    if (p != NULL) {\n        q = p + strlen(entry);\n        l = strlen(q) + 1;\n        memmove(p, q, l);\n        rec.dsize = p - rec.dptr + l;\n        if (tdb_store(pppdb, key, rec, TDB_REPLACE))\n            error(\"couldn't update bundle link list (removal)\");\n    }\n    free(rec.dptr);\n}\n\nstatic void iterate_bundle_links(void (*func)(char *))\n{\n    TDB_DATA key, rec, pp;\n    char *p, *q;\n\n    key.dptr = blinks_id;\n    key.dsize = strlen(blinks_id);\n    rec = tdb_fetch(pppdb, key);\n    if (rec.dptr == NULL || rec.dsize <= 0) {\n        error(\"bundle link list not found (iterating list)\");\n        if (rec.dptr != NULL)\n            free(rec.dptr);\n        return;\n    }\n    p = rec.dptr;\n    p[rec.dsize-1] = 0;\n    while ((q = strchr(p, ';')) != NULL) {\n        *q = 0;\n        key.dptr = p;\n        key.dsize = q - p;\n        pp = tdb_fetch(pppdb, key);\n        if (pp.dptr != NULL && pp.dsize > 0) {\n            pp.dptr[pp.dsize-1] = 0;\n            func(pp.dptr);\n        }\n        if (pp.dptr != NULL)\n            free(pp.dptr);\n        p = q + 1;\n    }\n    free(rec.dptr);\n}\n\nstatic int\nparse_num(str, key, valp)\n     char *str;\n     const char *key;\n     int *valp;\n{\n    char *p, *endp;\n    int i;\n\n    p = strstr(str, key);\n    if (p != 0) {\n        p += strlen(key);\n        i = strtol(p, &endp, 10);\n        if (endp != p && (*endp == 0 || *endp == ';')) {\n            *valp = i;\n            return 1;\n        }\n    }\n    return 0;\n}\n\n/*\n * Check whether the pppd identified by `key' still owns ppp unit `unit'.\n */\nstatic int\nowns_unit(key, unit)\n     TDB_DATA key;\n     int unit;\n{\n    char ifkey[32];\n    TDB_DATA kd, vd;\n    int ret = 0;\n\n    slprintf(ifkey, sizeof(ifkey), \"IFNAME=ppp%d\", unit);\n    kd.dptr = ifkey;\n    kd.dsize = strlen(ifkey);\n    vd = tdb_fetch(pppdb, kd);\n    if (vd.dptr != NULL) {\n        ret = vd.dsize == key.dsize\n            && memcmp(vd.dptr, key.dptr, vd.dsize) == 0;\n        free(vd.dptr);\n    }\n    return ret;\n}\n\nstatic int\nget_default_epdisc(ep)\n     struct epdisc *ep;\n{\n    char *p;\n    struct hostent *hp;\n    u32_t addr;\n\n    /* First try for an ethernet MAC address */\n    p = get_first_ethernet();\n    if (p != 0 && get_if_hwaddr(ep->value, p) >= 0) {\n        ep->class = EPD_MAC;\n        ep->length = 6;\n        return 1;\n    }\n\n    /* see if our hostname corresponds to a reasonable IP address */\n    hp = gethostbyname(hostname);\n    if (hp != NULL) {\n        addr = *(u32_t *)hp->h_addr;\n        if (!bad_ip_adrs(addr)) {\n            addr = lwip_ntohl(addr);\n            if (!LOCAL_IP_ADDR(addr)) {\n                ep->class = EPD_IP;\n                set_ip_epdisc(ep, addr);\n                return 1;\n            }\n        }\n    }\n\n    return 0;\n}\n\n/*\n * epdisc_to_str - make a printable string from an endpoint discriminator.\n */\n\nstatic char *endp_class_names[] = {\n    \"null\", \"local\", \"IP\", \"MAC\", \"magic\", \"phone\"\n};\n\nchar *\nepdisc_to_str(ep)\n     struct epdisc *ep;\n{\n    static char str[MAX_ENDP_LEN*3+8];\n    u_char *p = ep->value;\n    int i, mask = 0;\n    char *q, c, c2;\n\n    if (ep->class == EPD_NULL && ep->length == 0)\n        return \"null\";\n    if (ep->class == EPD_IP && ep->length == 4) {\n        u32_t addr;\n\n        GETLONG(addr, p);\n        slprintf(str, sizeof(str), \"IP:%I\", lwip_htonl(addr));\n        return str;\n    }\n\n    c = ':';\n    c2 = '.';\n    if (ep->class == EPD_MAC && ep->length == 6)\n        c2 = ':';\n    else if (ep->class == EPD_MAGIC && (ep->length % 4) == 0)\n        mask = 3;\n    q = str;\n    if (ep->class <= EPD_PHONENUM)\n        q += slprintf(q, sizeof(str)-1, \"%s\",\n                  endp_class_names[ep->class]);\n    else\n        q += slprintf(q, sizeof(str)-1, \"%d\", ep->class);\n    c = ':';\n    for (i = 0; i < ep->length && i < MAX_ENDP_LEN; ++i) {\n        if ((i & mask) == 0) {\n            *q++ = c;\n            c = c2;\n        }\n        q += slprintf(q, str + sizeof(str) - q, \"%.2x\", ep->value[i]);\n    }\n    return str;\n}\n\nstatic int hexc_val(int c)\n{\n    if (c >= 'a')\n        return c - 'a' + 10;\n    if (c >= 'A')\n        return c - 'A' + 10;\n    return c - '0';\n}\n\nint\nstr_to_epdisc(ep, str)\n     struct epdisc *ep;\n     char *str;\n{\n    int i, l;\n    char *p, *endp;\n\n    for (i = EPD_NULL; i <= EPD_PHONENUM; ++i) {\n        int sl = strlen(endp_class_names[i]);\n        if (strncasecmp(str, endp_class_names[i], sl) == 0) {\n            str += sl;\n            break;\n        }\n    }\n    if (i > EPD_PHONENUM) {\n        /* not a class name, try a decimal class number */\n        i = strtol(str, &endp, 10);\n        if (endp == str)\n            return 0;    /* can't parse class number */\n        str = endp;\n    }\n    ep->class = i;\n    if (*str == 0) {\n        ep->length = 0;\n        return 1;\n    }\n    if (*str != ':' && *str != '.')\n        return 0;\n    ++str;\n\n    if (i == EPD_IP) {\n        u32_t addr;\n        i = parse_dotted_ip(str, &addr);\n        if (i == 0 || str[i] != 0)\n            return 0;\n        set_ip_epdisc(ep, addr);\n        return 1;\n    }\n    if (i == EPD_MAC && get_if_hwaddr(ep->value, str) >= 0) {\n        ep->length = 6;\n        return 1;\n    }\n\n    p = str;\n    for (l = 0; l < MAX_ENDP_LEN; ++l) {\n        if (*str == 0)\n            break;\n        if (p <= str)\n            for (p = str; isxdigit(*p); ++p)\n                ;\n        i = p - str;\n        if (i == 0)\n            return 0;\n        ep->value[l] = hexc_val(*str++);\n        if ((i & 1) == 0)\n            ep->value[l] = (ep->value[l] << 4) + hexc_val(*str++);\n        if (*str == ':' || *str == '.')\n            ++str;\n    }\n    if (*str != 0 || (ep->class == EPD_MAC && l != 6))\n        return 0;\n    ep->length = l;\n    return 1;\n}\n\n#endif /* PPP_SUPPORT && HAVE_MULTILINK */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/polarssl/README",
    "content": "About PolarSSL files into lwIP PPP support\n------------------------------------------\n\nThis folder contains some files fetched from the latest BSD release of\nthe PolarSSL project (PolarSSL 0.10.1-bsd) for ciphers and encryption\nmethods we need for lwIP PPP support.\n\nThe PolarSSL files were cleaned to contain only the necessary struct\nfields and functions needed for lwIP.\n\nThe PolarSSL API was not changed at all, so if you are already using\nPolarSSL you can choose to skip the compilation of the included PolarSSL\nlibrary into lwIP.\n\nIf you are not using the embedded copy you must include external\nlibraries into your arch/cc.h port file.\n\nBeware of the stack requirements which can be a lot larger if you are not\nusing our cleaned PolarSSL library.\n\n\nPolarSSL project website: http://polarssl.org/\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/polarssl/arc4.c",
    "content": "/*\n *  An implementation of the ARCFOUR algorithm\n *\n *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine\n *\n *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>\n *\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *  \n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *    * Neither the names of PolarSSL or XySSL nor the names of its contributors\n *      may be used to endorse or promote products derived from this software\n *      without specific prior written permission.\n *  \n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n/*\n *  The ARCFOUR algorithm was publicly disclosed on 94/09.\n *\n *  http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_ARC4\n\n#include \"netif/ppp/polarssl/arc4.h\"\n/*\n * ARC4 key schedule\n */\nvoid arc4_setup( arc4_context *ctx, unsigned char *key, int keylen )\n{\n    int i, j, k, a;\n    unsigned char *m;\n\n    ctx->x = 0;\n    ctx->y = 0;\n    m = ctx->m;\n\n    for( i = 0; i < 256; i++ )\n        m[i] = (unsigned char) i;\n\n    j = k = 0;\n\n    for( i = 0; i < 256; i++, k++ )\n    {\n        if( k >= keylen ) k = 0;\n\n        a = m[i];\n        j = ( j + a + key[k] ) & 0xFF;\n        m[i] = m[j];\n        m[j] = (unsigned char) a;\n    }\n}\n\n/*\n * ARC4 cipher function\n */\nvoid arc4_crypt( arc4_context *ctx, unsigned char *buf, int buflen )\n{\n    int i, x, y, a, b;\n    unsigned char *m;\n\n    x = ctx->x;\n    y = ctx->y;\n    m = ctx->m;\n\n    for( i = 0; i < buflen; i++ )\n    {\n        x = ( x + 1 ) & 0xFF; a = m[x];\n        y = ( y + a ) & 0xFF; b = m[y];\n\n        m[x] = (unsigned char) b;\n        m[y] = (unsigned char) a;\n\n        buf[i] = (unsigned char)\n            ( buf[i] ^ m[(unsigned char)( a + b )] );\n    }\n\n    ctx->x = x;\n    ctx->y = y;\n}\n\n#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_DES */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/polarssl/des.c",
    "content": "/*\n *  FIPS-46-3 compliant Triple-DES implementation\n *\n *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine\n *\n *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>\n *\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *  \n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *    * Neither the names of PolarSSL or XySSL nor the names of its contributors\n *      may be used to endorse or promote products derived from this software\n *      without specific prior written permission.\n *  \n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n/*\n *  DES, on which TDES is based, was originally designed by Horst Feistel\n *  at IBM in 1974, and was adopted as a standard by NIST (formerly NBS).\n *\n *  http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_DES\n\n#include \"netif/ppp/polarssl/des.h\"\n\n/*\n * 32-bit integer manipulation macros (big endian)\n */\n#ifndef GET_ULONG_BE\n#define GET_ULONG_BE(n,b,i)                             \\\n{                                                       \\\n    (n) = ( (unsigned long) (b)[(i)    ] << 24 )        \\\n        | ( (unsigned long) (b)[(i) + 1] << 16 )        \\\n        | ( (unsigned long) (b)[(i) + 2] <<  8 )        \\\n        | ( (unsigned long) (b)[(i) + 3]       );       \\\n}\n#endif\n\n#ifndef PUT_ULONG_BE\n#define PUT_ULONG_BE(n,b,i)                             \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n)       );       \\\n}\n#endif\n\n/*\n * Expanded DES S-boxes\n */\nstatic const unsigned long SB1[64] =\n{\n    0x01010400, 0x00000000, 0x00010000, 0x01010404,\n    0x01010004, 0x00010404, 0x00000004, 0x00010000,\n    0x00000400, 0x01010400, 0x01010404, 0x00000400,\n    0x01000404, 0x01010004, 0x01000000, 0x00000004,\n    0x00000404, 0x01000400, 0x01000400, 0x00010400,\n    0x00010400, 0x01010000, 0x01010000, 0x01000404,\n    0x00010004, 0x01000004, 0x01000004, 0x00010004,\n    0x00000000, 0x00000404, 0x00010404, 0x01000000,\n    0x00010000, 0x01010404, 0x00000004, 0x01010000,\n    0x01010400, 0x01000000, 0x01000000, 0x00000400,\n    0x01010004, 0x00010000, 0x00010400, 0x01000004,\n    0x00000400, 0x00000004, 0x01000404, 0x00010404,\n    0x01010404, 0x00010004, 0x01010000, 0x01000404,\n    0x01000004, 0x00000404, 0x00010404, 0x01010400,\n    0x00000404, 0x01000400, 0x01000400, 0x00000000,\n    0x00010004, 0x00010400, 0x00000000, 0x01010004\n};\n\nstatic const unsigned long SB2[64] =\n{\n    0x80108020, 0x80008000, 0x00008000, 0x00108020,\n    0x00100000, 0x00000020, 0x80100020, 0x80008020,\n    0x80000020, 0x80108020, 0x80108000, 0x80000000,\n    0x80008000, 0x00100000, 0x00000020, 0x80100020,\n    0x00108000, 0x00100020, 0x80008020, 0x00000000,\n    0x80000000, 0x00008000, 0x00108020, 0x80100000,\n    0x00100020, 0x80000020, 0x00000000, 0x00108000,\n    0x00008020, 0x80108000, 0x80100000, 0x00008020,\n    0x00000000, 0x00108020, 0x80100020, 0x00100000,\n    0x80008020, 0x80100000, 0x80108000, 0x00008000,\n    0x80100000, 0x80008000, 0x00000020, 0x80108020,\n    0x00108020, 0x00000020, 0x00008000, 0x80000000,\n    0x00008020, 0x80108000, 0x00100000, 0x80000020,\n    0x00100020, 0x80008020, 0x80000020, 0x00100020,\n    0x00108000, 0x00000000, 0x80008000, 0x00008020,\n    0x80000000, 0x80100020, 0x80108020, 0x00108000\n};\n\nstatic const unsigned long SB3[64] =\n{\n    0x00000208, 0x08020200, 0x00000000, 0x08020008,\n    0x08000200, 0x00000000, 0x00020208, 0x08000200,\n    0x00020008, 0x08000008, 0x08000008, 0x00020000,\n    0x08020208, 0x00020008, 0x08020000, 0x00000208,\n    0x08000000, 0x00000008, 0x08020200, 0x00000200,\n    0x00020200, 0x08020000, 0x08020008, 0x00020208,\n    0x08000208, 0x00020200, 0x00020000, 0x08000208,\n    0x00000008, 0x08020208, 0x00000200, 0x08000000,\n    0x08020200, 0x08000000, 0x00020008, 0x00000208,\n    0x00020000, 0x08020200, 0x08000200, 0x00000000,\n    0x00000200, 0x00020008, 0x08020208, 0x08000200,\n    0x08000008, 0x00000200, 0x00000000, 0x08020008,\n    0x08000208, 0x00020000, 0x08000000, 0x08020208,\n    0x00000008, 0x00020208, 0x00020200, 0x08000008,\n    0x08020000, 0x08000208, 0x00000208, 0x08020000,\n    0x00020208, 0x00000008, 0x08020008, 0x00020200\n};\n\nstatic const unsigned long SB4[64] =\n{\n    0x00802001, 0x00002081, 0x00002081, 0x00000080,\n    0x00802080, 0x00800081, 0x00800001, 0x00002001,\n    0x00000000, 0x00802000, 0x00802000, 0x00802081,\n    0x00000081, 0x00000000, 0x00800080, 0x00800001,\n    0x00000001, 0x00002000, 0x00800000, 0x00802001,\n    0x00000080, 0x00800000, 0x00002001, 0x00002080,\n    0x00800081, 0x00000001, 0x00002080, 0x00800080,\n    0x00002000, 0x00802080, 0x00802081, 0x00000081,\n    0x00800080, 0x00800001, 0x00802000, 0x00802081,\n    0x00000081, 0x00000000, 0x00000000, 0x00802000,\n    0x00002080, 0x00800080, 0x00800081, 0x00000001,\n    0x00802001, 0x00002081, 0x00002081, 0x00000080,\n    0x00802081, 0x00000081, 0x00000001, 0x00002000,\n    0x00800001, 0x00002001, 0x00802080, 0x00800081,\n    0x00002001, 0x00002080, 0x00800000, 0x00802001,\n    0x00000080, 0x00800000, 0x00002000, 0x00802080\n};\n\nstatic const unsigned long SB5[64] =\n{\n    0x00000100, 0x02080100, 0x02080000, 0x42000100,\n    0x00080000, 0x00000100, 0x40000000, 0x02080000,\n    0x40080100, 0x00080000, 0x02000100, 0x40080100,\n    0x42000100, 0x42080000, 0x00080100, 0x40000000,\n    0x02000000, 0x40080000, 0x40080000, 0x00000000,\n    0x40000100, 0x42080100, 0x42080100, 0x02000100,\n    0x42080000, 0x40000100, 0x00000000, 0x42000000,\n    0x02080100, 0x02000000, 0x42000000, 0x00080100,\n    0x00080000, 0x42000100, 0x00000100, 0x02000000,\n    0x40000000, 0x02080000, 0x42000100, 0x40080100,\n    0x02000100, 0x40000000, 0x42080000, 0x02080100,\n    0x40080100, 0x00000100, 0x02000000, 0x42080000,\n    0x42080100, 0x00080100, 0x42000000, 0x42080100,\n    0x02080000, 0x00000000, 0x40080000, 0x42000000,\n    0x00080100, 0x02000100, 0x40000100, 0x00080000,\n    0x00000000, 0x40080000, 0x02080100, 0x40000100\n};\n\nstatic const unsigned long SB6[64] =\n{\n    0x20000010, 0x20400000, 0x00004000, 0x20404010,\n    0x20400000, 0x00000010, 0x20404010, 0x00400000,\n    0x20004000, 0x00404010, 0x00400000, 0x20000010,\n    0x00400010, 0x20004000, 0x20000000, 0x00004010,\n    0x00000000, 0x00400010, 0x20004010, 0x00004000,\n    0x00404000, 0x20004010, 0x00000010, 0x20400010,\n    0x20400010, 0x00000000, 0x00404010, 0x20404000,\n    0x00004010, 0x00404000, 0x20404000, 0x20000000,\n    0x20004000, 0x00000010, 0x20400010, 0x00404000,\n    0x20404010, 0x00400000, 0x00004010, 0x20000010,\n    0x00400000, 0x20004000, 0x20000000, 0x00004010,\n    0x20000010, 0x20404010, 0x00404000, 0x20400000,\n    0x00404010, 0x20404000, 0x00000000, 0x20400010,\n    0x00000010, 0x00004000, 0x20400000, 0x00404010,\n    0x00004000, 0x00400010, 0x20004010, 0x00000000,\n    0x20404000, 0x20000000, 0x00400010, 0x20004010\n};\n\nstatic const unsigned long SB7[64] =\n{\n    0x00200000, 0x04200002, 0x04000802, 0x00000000,\n    0x00000800, 0x04000802, 0x00200802, 0x04200800,\n    0x04200802, 0x00200000, 0x00000000, 0x04000002,\n    0x00000002, 0x04000000, 0x04200002, 0x00000802,\n    0x04000800, 0x00200802, 0x00200002, 0x04000800,\n    0x04000002, 0x04200000, 0x04200800, 0x00200002,\n    0x04200000, 0x00000800, 0x00000802, 0x04200802,\n    0x00200800, 0x00000002, 0x04000000, 0x00200800,\n    0x04000000, 0x00200800, 0x00200000, 0x04000802,\n    0x04000802, 0x04200002, 0x04200002, 0x00000002,\n    0x00200002, 0x04000000, 0x04000800, 0x00200000,\n    0x04200800, 0x00000802, 0x00200802, 0x04200800,\n    0x00000802, 0x04000002, 0x04200802, 0x04200000,\n    0x00200800, 0x00000000, 0x00000002, 0x04200802,\n    0x00000000, 0x00200802, 0x04200000, 0x00000800,\n    0x04000002, 0x04000800, 0x00000800, 0x00200002\n};\n\nstatic const unsigned long SB8[64] =\n{\n    0x10001040, 0x00001000, 0x00040000, 0x10041040,\n    0x10000000, 0x10001040, 0x00000040, 0x10000000,\n    0x00040040, 0x10040000, 0x10041040, 0x00041000,\n    0x10041000, 0x00041040, 0x00001000, 0x00000040,\n    0x10040000, 0x10000040, 0x10001000, 0x00001040,\n    0x00041000, 0x00040040, 0x10040040, 0x10041000,\n    0x00001040, 0x00000000, 0x00000000, 0x10040040,\n    0x10000040, 0x10001000, 0x00041040, 0x00040000,\n    0x00041040, 0x00040000, 0x10041000, 0x00001000,\n    0x00000040, 0x10040040, 0x00001000, 0x00041040,\n    0x10001000, 0x00000040, 0x10000040, 0x10040000,\n    0x10040040, 0x10000000, 0x00040000, 0x10001040,\n    0x00000000, 0x10041040, 0x00040040, 0x10000040,\n    0x10040000, 0x10001000, 0x10001040, 0x00000000,\n    0x10041040, 0x00041000, 0x00041000, 0x00001040,\n    0x00001040, 0x00040040, 0x10000000, 0x10041000\n};\n\n/*\n * PC1: left and right halves bit-swap\n */\nstatic const unsigned long LHs[16] =\n{\n    0x00000000, 0x00000001, 0x00000100, 0x00000101,\n    0x00010000, 0x00010001, 0x00010100, 0x00010101,\n    0x01000000, 0x01000001, 0x01000100, 0x01000101,\n    0x01010000, 0x01010001, 0x01010100, 0x01010101\n};\n\nstatic const unsigned long RHs[16] =\n{\n    0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000001, 0x01000001, 0x00010001, 0x01010001,\n    0x00000101, 0x01000101, 0x00010101, 0x01010101,\n};\n\n/*\n * Initial Permutation macro\n */\n#define DES_IP(X,Y)                                             \\\n{                                                               \\\n    T = ((X >>  4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T <<  4);   \\\n    T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16);   \\\n    T = ((Y >>  2) ^ X) & 0x33333333; X ^= T; Y ^= (T <<  2);   \\\n    T = ((Y >>  8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T <<  8);   \\\n    Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF;                    \\\n    T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T;                   \\\n    X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF;                    \\\n}\n\n/*\n * Final Permutation macro\n */\n#define DES_FP(X,Y)                                             \\\n{                                                               \\\n    X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF;                    \\\n    T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T;                   \\\n    Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF;                    \\\n    T = ((Y >>  8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T <<  8);   \\\n    T = ((Y >>  2) ^ X) & 0x33333333; X ^= T; Y ^= (T <<  2);   \\\n    T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16);   \\\n    T = ((X >>  4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T <<  4);   \\\n}\n\n/*\n * DES round macro\n */\n#define DES_ROUND(X,Y)                          \\\n{                                               \\\n    T = *SK++ ^ X;                              \\\n    Y ^= SB8[ (T      ) & 0x3F ] ^              \\\n         SB6[ (T >>  8) & 0x3F ] ^              \\\n         SB4[ (T >> 16) & 0x3F ] ^              \\\n         SB2[ (T >> 24) & 0x3F ];               \\\n                                                \\\n    T = *SK++ ^ ((X << 28) | (X >> 4));         \\\n    Y ^= SB7[ (T      ) & 0x3F ] ^              \\\n         SB5[ (T >>  8) & 0x3F ] ^              \\\n         SB3[ (T >> 16) & 0x3F ] ^              \\\n         SB1[ (T >> 24) & 0x3F ];               \\\n}\n\n#define SWAP(a,b) { unsigned long t = a; a = b; b = t; t = 0; }\n\nstatic void des_setkey( unsigned long SK[32], unsigned char key[8] )\n{\n    int i;\n    unsigned long X, Y, T;\n\n    GET_ULONG_BE( X, key, 0 );\n    GET_ULONG_BE( Y, key, 4 );\n\n    /*\n     * Permuted Choice 1\n     */\n    T =  ((Y >>  4) ^ X) & 0x0F0F0F0F;  X ^= T; Y ^= (T <<  4);\n    T =  ((Y      ) ^ X) & 0x10101010;  X ^= T; Y ^= (T      );\n\n    X =   (LHs[ (X      ) & 0xF] << 3) | (LHs[ (X >>  8) & 0xF ] << 2)\n        | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ]     )\n        | (LHs[ (X >>  5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6)\n        | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4);\n\n    Y =   (RHs[ (Y >>  1) & 0xF] << 3) | (RHs[ (Y >>  9) & 0xF ] << 2)\n        | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ]     )\n        | (RHs[ (Y >>  4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6)\n        | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4);\n\n    X &= 0x0FFFFFFF;\n    Y &= 0x0FFFFFFF;\n\n    /*\n     * calculate subkeys\n     */\n    for( i = 0; i < 16; i++ )\n    {\n        if( i < 2 || i == 8 || i == 15 )\n        {\n            X = ((X <<  1) | (X >> 27)) & 0x0FFFFFFF;\n            Y = ((Y <<  1) | (Y >> 27)) & 0x0FFFFFFF;\n        }\n        else\n        {\n            X = ((X <<  2) | (X >> 26)) & 0x0FFFFFFF;\n            Y = ((Y <<  2) | (Y >> 26)) & 0x0FFFFFFF;\n        }\n\n        *SK++ =   ((X <<  4) & 0x24000000) | ((X << 28) & 0x10000000)\n                | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000)\n                | ((X <<  6) & 0x01000000) | ((X <<  9) & 0x00200000)\n                | ((X >>  1) & 0x00100000) | ((X << 10) & 0x00040000)\n                | ((X <<  2) & 0x00020000) | ((X >> 10) & 0x00010000)\n                | ((Y >> 13) & 0x00002000) | ((Y >>  4) & 0x00001000)\n                | ((Y <<  6) & 0x00000800) | ((Y >>  1) & 0x00000400)\n                | ((Y >> 14) & 0x00000200) | ((Y      ) & 0x00000100)\n                | ((Y >>  5) & 0x00000020) | ((Y >> 10) & 0x00000010)\n                | ((Y >>  3) & 0x00000008) | ((Y >> 18) & 0x00000004)\n                | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001);\n\n        *SK++ =   ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000)\n                | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000)\n                | ((X >>  2) & 0x02000000) | ((X <<  1) & 0x01000000)\n                | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000)\n                | ((X <<  3) & 0x00080000) | ((X >>  6) & 0x00040000)\n                | ((X << 15) & 0x00020000) | ((X >>  4) & 0x00010000)\n                | ((Y >>  2) & 0x00002000) | ((Y <<  8) & 0x00001000)\n                | ((Y >> 14) & 0x00000808) | ((Y >>  9) & 0x00000400)\n                | ((Y      ) & 0x00000200) | ((Y <<  7) & 0x00000100)\n                | ((Y >>  7) & 0x00000020) | ((Y >>  3) & 0x00000011)\n                | ((Y <<  2) & 0x00000004) | ((Y >> 21) & 0x00000002);\n    }\n}\n\n/*\n * DES key schedule (56-bit, encryption)\n */\nvoid des_setkey_enc( des_context *ctx, unsigned char key[8] )\n{\n    des_setkey( ctx->sk, key );\n}\n\n/*\n * DES key schedule (56-bit, decryption)\n */\nvoid des_setkey_dec( des_context *ctx, unsigned char key[8] )\n{\n    int i;\n\n    des_setkey( ctx->sk, key );\n\n    for( i = 0; i < 16; i += 2 )\n    {\n        SWAP( ctx->sk[i    ], ctx->sk[30 - i] );\n        SWAP( ctx->sk[i + 1], ctx->sk[31 - i] );\n    }\n}\n\n/*\n * DES-ECB block encryption/decryption\n */\nvoid des_crypt_ecb( des_context *ctx,\n                    const unsigned char input[8],\n                    unsigned char output[8] )\n{\n    int i;\n    unsigned long X, Y, T, *SK;\n\n    SK = ctx->sk;\n\n    GET_ULONG_BE( X, input, 0 );\n    GET_ULONG_BE( Y, input, 4 );\n\n    DES_IP( X, Y );\n\n    for( i = 0; i < 8; i++ )\n    {\n        DES_ROUND( Y, X );\n        DES_ROUND( X, Y );\n    }\n\n    DES_FP( Y, X );\n\n    PUT_ULONG_BE( Y, output, 0 );\n    PUT_ULONG_BE( X, output, 4 );\n}\n\n#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_DES */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/polarssl/md4.c",
    "content": "/*\n *  RFC 1186/1320 compliant MD4 implementation\n *\n *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine\n *\n *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>\n *\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *  \n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *    * Neither the names of PolarSSL or XySSL nor the names of its contributors\n *      may be used to endorse or promote products derived from this software\n *      without specific prior written permission.\n *  \n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n/*\n *  The MD4 algorithm was designed by Ron Rivest in 1990.\n *\n *  http://www.ietf.org/rfc/rfc1186.txt\n *  http://www.ietf.org/rfc/rfc1320.txt\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_MD4\n\n#include \"netif/ppp/polarssl/md4.h\"\n\n#include <string.h>\n\n/*\n * 32-bit integer manipulation macros (little endian)\n */\n#ifndef GET_ULONG_LE\n#define GET_ULONG_LE(n,b,i)                             \\\n{                                                       \\\n    (n) = ( (unsigned long) (b)[(i)    ]       )        \\\n        | ( (unsigned long) (b)[(i) + 1] <<  8 )        \\\n        | ( (unsigned long) (b)[(i) + 2] << 16 )        \\\n        | ( (unsigned long) (b)[(i) + 3] << 24 );       \\\n}\n#endif\n\n#ifndef PUT_ULONG_LE\n#define PUT_ULONG_LE(n,b,i)                             \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n)       );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n) >> 24 );       \\\n}\n#endif\n\n/*\n * MD4 context setup\n */\nvoid md4_starts( md4_context *ctx )\n{\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n\n    ctx->state[0] = 0x67452301;\n    ctx->state[1] = 0xEFCDAB89;\n    ctx->state[2] = 0x98BADCFE;\n    ctx->state[3] = 0x10325476;\n}\n\nstatic void md4_process( md4_context *ctx, const unsigned char data[64] )\n{\n    unsigned long X[16], A, B, C, D;\n\n    GET_ULONG_LE( X[ 0], data,  0 );\n    GET_ULONG_LE( X[ 1], data,  4 );\n    GET_ULONG_LE( X[ 2], data,  8 );\n    GET_ULONG_LE( X[ 3], data, 12 );\n    GET_ULONG_LE( X[ 4], data, 16 );\n    GET_ULONG_LE( X[ 5], data, 20 );\n    GET_ULONG_LE( X[ 6], data, 24 );\n    GET_ULONG_LE( X[ 7], data, 28 );\n    GET_ULONG_LE( X[ 8], data, 32 );\n    GET_ULONG_LE( X[ 9], data, 36 );\n    GET_ULONG_LE( X[10], data, 40 );\n    GET_ULONG_LE( X[11], data, 44 );\n    GET_ULONG_LE( X[12], data, 48 );\n    GET_ULONG_LE( X[13], data, 52 );\n    GET_ULONG_LE( X[14], data, 56 );\n    GET_ULONG_LE( X[15], data, 60 );\n\n#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))\n\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n\n#define F(x, y, z) ((x & y) | ((~x) & z))\n#define P(a,b,c,d,x,s) { a += F(b,c,d) + x; a = S(a,s); }\n\n    P( A, B, C, D, X[ 0],  3 );\n    P( D, A, B, C, X[ 1],  7 );\n    P( C, D, A, B, X[ 2], 11 );\n    P( B, C, D, A, X[ 3], 19 );\n    P( A, B, C, D, X[ 4],  3 );\n    P( D, A, B, C, X[ 5],  7 );\n    P( C, D, A, B, X[ 6], 11 );\n    P( B, C, D, A, X[ 7], 19 );\n    P( A, B, C, D, X[ 8],  3 );\n    P( D, A, B, C, X[ 9],  7 );\n    P( C, D, A, B, X[10], 11 );\n    P( B, C, D, A, X[11], 19 );\n    P( A, B, C, D, X[12],  3 );\n    P( D, A, B, C, X[13],  7 );\n    P( C, D, A, B, X[14], 11 );\n    P( B, C, D, A, X[15], 19 );\n\n#undef P\n#undef F\n\n#define F(x,y,z) ((x & y) | (x & z) | (y & z))\n#define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x5A827999; a = S(a,s); }\n\n    P( A, B, C, D, X[ 0],  3 );\n    P( D, A, B, C, X[ 4],  5 );\n    P( C, D, A, B, X[ 8],  9 );\n    P( B, C, D, A, X[12], 13 );\n    P( A, B, C, D, X[ 1],  3 );\n    P( D, A, B, C, X[ 5],  5 );\n    P( C, D, A, B, X[ 9],  9 );\n    P( B, C, D, A, X[13], 13 );\n    P( A, B, C, D, X[ 2],  3 );\n    P( D, A, B, C, X[ 6],  5 );\n    P( C, D, A, B, X[10],  9 );\n    P( B, C, D, A, X[14], 13 );\n    P( A, B, C, D, X[ 3],  3 );\n    P( D, A, B, C, X[ 7],  5 );\n    P( C, D, A, B, X[11],  9 );\n    P( B, C, D, A, X[15], 13 );\n\n#undef P\n#undef F\n\n#define F(x,y,z) (x ^ y ^ z)\n#define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x6ED9EBA1; a = S(a,s); }\n\n    P( A, B, C, D, X[ 0],  3 );\n    P( D, A, B, C, X[ 8],  9 );\n    P( C, D, A, B, X[ 4], 11 );\n    P( B, C, D, A, X[12], 15 );\n    P( A, B, C, D, X[ 2],  3 );\n    P( D, A, B, C, X[10],  9 );\n    P( C, D, A, B, X[ 6], 11 );\n    P( B, C, D, A, X[14], 15 );\n    P( A, B, C, D, X[ 1],  3 );\n    P( D, A, B, C, X[ 9],  9 );\n    P( C, D, A, B, X[ 5], 11 );\n    P( B, C, D, A, X[13], 15 );\n    P( A, B, C, D, X[ 3],  3 );\n    P( D, A, B, C, X[11],  9 );\n    P( C, D, A, B, X[ 7], 11 );\n    P( B, C, D, A, X[15], 15 );\n\n#undef F\n#undef P\n\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n}\n\n/*\n * MD4 process buffer\n */\nvoid md4_update( md4_context *ctx, const unsigned char *input, int ilen )\n{\n    int fill;\n    unsigned long left;\n\n    if( ilen <= 0 )\n        return;\n\n    left = ctx->total[0] & 0x3F;\n    fill = 64 - left;\n\n    ctx->total[0] += ilen;\n    ctx->total[0] &= 0xFFFFFFFF;\n\n    if( ctx->total[0] < (unsigned long) ilen )\n        ctx->total[1]++;\n\n    if( left && ilen >= fill )\n    {\n        MEMCPY( (void *) (ctx->buffer + left),\n                input, fill );\n        md4_process( ctx, ctx->buffer );\n        input += fill;\n        ilen  -= fill;\n        left = 0;\n    }\n\n    while( ilen >= 64 )\n    {\n        md4_process( ctx, input );\n        input += 64;\n        ilen  -= 64;\n    }\n\n    if( ilen > 0 )\n    {\n        MEMCPY( (void *) (ctx->buffer + left),\n                input, ilen );\n    }\n}\n\nstatic const unsigned char md4_padding[64] =\n{\n 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/*\n * MD4 final digest\n */\nvoid md4_finish( md4_context *ctx, unsigned char output[16] )\n{\n    unsigned long last, padn;\n    unsigned long high, low;\n    unsigned char msglen[8];\n\n    high = ( ctx->total[0] >> 29 )\n         | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n\n    PUT_ULONG_LE( low,  msglen, 0 );\n    PUT_ULONG_LE( high, msglen, 4 );\n\n    last = ctx->total[0] & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n\n    md4_update( ctx, md4_padding, padn );\n    md4_update( ctx, msglen, 8 );\n\n    PUT_ULONG_LE( ctx->state[0], output,  0 );\n    PUT_ULONG_LE( ctx->state[1], output,  4 );\n    PUT_ULONG_LE( ctx->state[2], output,  8 );\n    PUT_ULONG_LE( ctx->state[3], output, 12 );\n}\n\n/*\n * output = MD4( input buffer )\n */\nvoid md4( unsigned char *input, int ilen, unsigned char output[16] )\n{\n    md4_context ctx;\n\n    md4_starts( &ctx );\n    md4_update( &ctx, input, ilen );\n    md4_finish( &ctx, output );\n}\n\n#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_MD4 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/polarssl/md5.c",
    "content": "/*\n *  RFC 1321 compliant MD5 implementation\n *\n *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine\n *\n *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>\n *\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *  \n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *    * Neither the names of PolarSSL or XySSL nor the names of its contributors\n *      may be used to endorse or promote products derived from this software\n *      without specific prior written permission.\n *  \n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n/*\n *  The MD5 algorithm was designed by Ron Rivest in 1991.\n *\n *  http://www.ietf.org/rfc/rfc1321.txt\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_MD5\n\n#include \"netif/ppp/polarssl/md5.h\"\n\n#include <string.h>\n\n/*\n * 32-bit integer manipulation macros (little endian)\n */\n#ifndef GET_ULONG_LE\n#define GET_ULONG_LE(n,b,i)                             \\\n{                                                       \\\n    (n) = ( (unsigned long) (b)[(i)    ]       )        \\\n        | ( (unsigned long) (b)[(i) + 1] <<  8 )        \\\n        | ( (unsigned long) (b)[(i) + 2] << 16 )        \\\n        | ( (unsigned long) (b)[(i) + 3] << 24 );       \\\n}\n#endif\n\n#ifndef PUT_ULONG_LE\n#define PUT_ULONG_LE(n,b,i)                             \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n)       );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n) >> 24 );       \\\n}\n#endif\n\n/*\n * MD5 context setup\n */\nvoid md5_starts( md5_context *ctx )\n{\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n\n    ctx->state[0] = 0x67452301;\n    ctx->state[1] = 0xEFCDAB89;\n    ctx->state[2] = 0x98BADCFE;\n    ctx->state[3] = 0x10325476;\n}\n\nstatic void md5_process( md5_context *ctx, const unsigned char data[64] )\n{\n    unsigned long X[16], A, B, C, D;\n\n    GET_ULONG_LE( X[ 0], data,  0 );\n    GET_ULONG_LE( X[ 1], data,  4 );\n    GET_ULONG_LE( X[ 2], data,  8 );\n    GET_ULONG_LE( X[ 3], data, 12 );\n    GET_ULONG_LE( X[ 4], data, 16 );\n    GET_ULONG_LE( X[ 5], data, 20 );\n    GET_ULONG_LE( X[ 6], data, 24 );\n    GET_ULONG_LE( X[ 7], data, 28 );\n    GET_ULONG_LE( X[ 8], data, 32 );\n    GET_ULONG_LE( X[ 9], data, 36 );\n    GET_ULONG_LE( X[10], data, 40 );\n    GET_ULONG_LE( X[11], data, 44 );\n    GET_ULONG_LE( X[12], data, 48 );\n    GET_ULONG_LE( X[13], data, 52 );\n    GET_ULONG_LE( X[14], data, 56 );\n    GET_ULONG_LE( X[15], data, 60 );\n\n#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))\n\n#define P(a,b,c,d,k,s,t)                                \\\n{                                                       \\\n    a += F(b,c,d) + X[k] + t; a = S(a,s) + b;           \\\n}\n\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n\n#define F(x,y,z) (z ^ (x & (y ^ z)))\n\n    P( A, B, C, D,  0,  7, 0xD76AA478 );\n    P( D, A, B, C,  1, 12, 0xE8C7B756 );\n    P( C, D, A, B,  2, 17, 0x242070DB );\n    P( B, C, D, A,  3, 22, 0xC1BDCEEE );\n    P( A, B, C, D,  4,  7, 0xF57C0FAF );\n    P( D, A, B, C,  5, 12, 0x4787C62A );\n    P( C, D, A, B,  6, 17, 0xA8304613 );\n    P( B, C, D, A,  7, 22, 0xFD469501 );\n    P( A, B, C, D,  8,  7, 0x698098D8 );\n    P( D, A, B, C,  9, 12, 0x8B44F7AF );\n    P( C, D, A, B, 10, 17, 0xFFFF5BB1 );\n    P( B, C, D, A, 11, 22, 0x895CD7BE );\n    P( A, B, C, D, 12,  7, 0x6B901122 );\n    P( D, A, B, C, 13, 12, 0xFD987193 );\n    P( C, D, A, B, 14, 17, 0xA679438E );\n    P( B, C, D, A, 15, 22, 0x49B40821 );\n\n#undef F\n\n#define F(x,y,z) (y ^ (z & (x ^ y)))\n\n    P( A, B, C, D,  1,  5, 0xF61E2562 );\n    P( D, A, B, C,  6,  9, 0xC040B340 );\n    P( C, D, A, B, 11, 14, 0x265E5A51 );\n    P( B, C, D, A,  0, 20, 0xE9B6C7AA );\n    P( A, B, C, D,  5,  5, 0xD62F105D );\n    P( D, A, B, C, 10,  9, 0x02441453 );\n    P( C, D, A, B, 15, 14, 0xD8A1E681 );\n    P( B, C, D, A,  4, 20, 0xE7D3FBC8 );\n    P( A, B, C, D,  9,  5, 0x21E1CDE6 );\n    P( D, A, B, C, 14,  9, 0xC33707D6 );\n    P( C, D, A, B,  3, 14, 0xF4D50D87 );\n    P( B, C, D, A,  8, 20, 0x455A14ED );\n    P( A, B, C, D, 13,  5, 0xA9E3E905 );\n    P( D, A, B, C,  2,  9, 0xFCEFA3F8 );\n    P( C, D, A, B,  7, 14, 0x676F02D9 );\n    P( B, C, D, A, 12, 20, 0x8D2A4C8A );\n\n#undef F\n    \n#define F(x,y,z) (x ^ y ^ z)\n\n    P( A, B, C, D,  5,  4, 0xFFFA3942 );\n    P( D, A, B, C,  8, 11, 0x8771F681 );\n    P( C, D, A, B, 11, 16, 0x6D9D6122 );\n    P( B, C, D, A, 14, 23, 0xFDE5380C );\n    P( A, B, C, D,  1,  4, 0xA4BEEA44 );\n    P( D, A, B, C,  4, 11, 0x4BDECFA9 );\n    P( C, D, A, B,  7, 16, 0xF6BB4B60 );\n    P( B, C, D, A, 10, 23, 0xBEBFBC70 );\n    P( A, B, C, D, 13,  4, 0x289B7EC6 );\n    P( D, A, B, C,  0, 11, 0xEAA127FA );\n    P( C, D, A, B,  3, 16, 0xD4EF3085 );\n    P( B, C, D, A,  6, 23, 0x04881D05 );\n    P( A, B, C, D,  9,  4, 0xD9D4D039 );\n    P( D, A, B, C, 12, 11, 0xE6DB99E5 );\n    P( C, D, A, B, 15, 16, 0x1FA27CF8 );\n    P( B, C, D, A,  2, 23, 0xC4AC5665 );\n\n#undef F\n\n#define F(x,y,z) (y ^ (x | ~z))\n\n    P( A, B, C, D,  0,  6, 0xF4292244 );\n    P( D, A, B, C,  7, 10, 0x432AFF97 );\n    P( C, D, A, B, 14, 15, 0xAB9423A7 );\n    P( B, C, D, A,  5, 21, 0xFC93A039 );\n    P( A, B, C, D, 12,  6, 0x655B59C3 );\n    P( D, A, B, C,  3, 10, 0x8F0CCC92 );\n    P( C, D, A, B, 10, 15, 0xFFEFF47D );\n    P( B, C, D, A,  1, 21, 0x85845DD1 );\n    P( A, B, C, D,  8,  6, 0x6FA87E4F );\n    P( D, A, B, C, 15, 10, 0xFE2CE6E0 );\n    P( C, D, A, B,  6, 15, 0xA3014314 );\n    P( B, C, D, A, 13, 21, 0x4E0811A1 );\n    P( A, B, C, D,  4,  6, 0xF7537E82 );\n    P( D, A, B, C, 11, 10, 0xBD3AF235 );\n    P( C, D, A, B,  2, 15, 0x2AD7D2BB );\n    P( B, C, D, A,  9, 21, 0xEB86D391 );\n\n#undef F\n\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n}\n\n/*\n * MD5 process buffer\n */\nvoid md5_update( md5_context *ctx, const unsigned char *input, int ilen )\n{\n    int fill;\n    unsigned long left;\n\n    if( ilen <= 0 )\n        return;\n\n    left = ctx->total[0] & 0x3F;\n    fill = 64 - left;\n\n    ctx->total[0] += ilen;\n    ctx->total[0] &= 0xFFFFFFFF;\n\n    if( ctx->total[0] < (unsigned long) ilen )\n        ctx->total[1]++;\n\n    if( left && ilen >= fill )\n    {\n        MEMCPY( (void *) (ctx->buffer + left),\n                input, fill );\n        md5_process( ctx, ctx->buffer );\n        input += fill;\n        ilen  -= fill;\n        left = 0;\n    }\n\n    while( ilen >= 64 )\n    {\n        md5_process( ctx, input );\n        input += 64;\n        ilen  -= 64;\n    }\n\n    if( ilen > 0 )\n    {\n        MEMCPY( (void *) (ctx->buffer + left),\n                input, ilen );\n    }\n}\n\nstatic const unsigned char md5_padding[64] =\n{\n 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/*\n * MD5 final digest\n */\nvoid md5_finish( md5_context *ctx, unsigned char output[16] )\n{\n    unsigned long last, padn;\n    unsigned long high, low;\n    unsigned char msglen[8];\n\n    high = ( ctx->total[0] >> 29 )\n         | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n\n    PUT_ULONG_LE( low,  msglen, 0 );\n    PUT_ULONG_LE( high, msglen, 4 );\n\n    last = ctx->total[0] & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n\n    md5_update( ctx, md5_padding, padn );\n    md5_update( ctx, msglen, 8 );\n\n    PUT_ULONG_LE( ctx->state[0], output,  0 );\n    PUT_ULONG_LE( ctx->state[1], output,  4 );\n    PUT_ULONG_LE( ctx->state[2], output,  8 );\n    PUT_ULONG_LE( ctx->state[3], output, 12 );\n}\n\n/*\n * output = MD5( input buffer )\n */\nvoid md5( unsigned char *input, int ilen, unsigned char output[16] )\n{\n    md5_context ctx;\n\n    md5_starts( &ctx );\n    md5_update( &ctx, input, ilen );\n    md5_finish( &ctx, output );\n}\n\n#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_MD5 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/polarssl/sha1.c",
    "content": "/*\n *  FIPS-180-1 compliant SHA-1 implementation\n *\n *  Based on XySSL: Copyright (C) 2006-2008  Christophe Devine\n *\n *  Copyright (C) 2009  Paul Bakker <polarssl_maintainer at polarssl dot org>\n *\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *  \n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above copyright\n *      notice, this list of conditions and the following disclaimer in the\n *      documentation and/or other materials provided with the distribution.\n *    * Neither the names of PolarSSL or XySSL nor the names of its contributors\n *      may be used to endorse or promote products derived from this software\n *      without specific prior written permission.\n *  \n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\n *  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n *  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n/*\n *  The SHA-1 standard was published by NIST in 1993.\n *\n *  http://www.itl.nist.gov/fipspubs/fip180-1.htm\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_SHA1\n\n#include \"netif/ppp/polarssl/sha1.h\"\n\n#include <string.h>\n\n/*\n * 32-bit integer manipulation macros (big endian)\n */\n#ifndef GET_ULONG_BE\n#define GET_ULONG_BE(n,b,i)                             \\\n{                                                       \\\n    (n) = ( (unsigned long) (b)[(i)    ] << 24 )        \\\n        | ( (unsigned long) (b)[(i) + 1] << 16 )        \\\n        | ( (unsigned long) (b)[(i) + 2] <<  8 )        \\\n        | ( (unsigned long) (b)[(i) + 3]       );       \\\n}\n#endif\n\n#ifndef PUT_ULONG_BE\n#define PUT_ULONG_BE(n,b,i)                             \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n)       );       \\\n}\n#endif\n\n/*\n * SHA-1 context setup\n */\nvoid sha1_starts( sha1_context *ctx )\n{\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n\n    ctx->state[0] = 0x67452301;\n    ctx->state[1] = 0xEFCDAB89;\n    ctx->state[2] = 0x98BADCFE;\n    ctx->state[3] = 0x10325476;\n    ctx->state[4] = 0xC3D2E1F0;\n}\n\nstatic void sha1_process( sha1_context *ctx, const unsigned char data[64] )\n{\n    unsigned long temp, W[16], A, B, C, D, E;\n\n    GET_ULONG_BE( W[ 0], data,  0 );\n    GET_ULONG_BE( W[ 1], data,  4 );\n    GET_ULONG_BE( W[ 2], data,  8 );\n    GET_ULONG_BE( W[ 3], data, 12 );\n    GET_ULONG_BE( W[ 4], data, 16 );\n    GET_ULONG_BE( W[ 5], data, 20 );\n    GET_ULONG_BE( W[ 6], data, 24 );\n    GET_ULONG_BE( W[ 7], data, 28 );\n    GET_ULONG_BE( W[ 8], data, 32 );\n    GET_ULONG_BE( W[ 9], data, 36 );\n    GET_ULONG_BE( W[10], data, 40 );\n    GET_ULONG_BE( W[11], data, 44 );\n    GET_ULONG_BE( W[12], data, 48 );\n    GET_ULONG_BE( W[13], data, 52 );\n    GET_ULONG_BE( W[14], data, 56 );\n    GET_ULONG_BE( W[15], data, 60 );\n\n#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))\n\n#define R(t)                                            \\\n(                                                       \\\n    temp = W[(t -  3) & 0x0F] ^ W[(t - 8) & 0x0F] ^     \\\n           W[(t - 14) & 0x0F] ^ W[ t      & 0x0F],      \\\n    ( W[t & 0x0F] = S(temp,1) )                         \\\n)\n\n#define P(a,b,c,d,e,x)                                  \\\n{                                                       \\\n    e += S(a,5) + F(b,c,d) + K + x; b = S(b,30);        \\\n}\n\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n    E = ctx->state[4];\n\n#define F(x,y,z) (z ^ (x & (y ^ z)))\n#define K 0x5A827999\n\n    P( A, B, C, D, E, W[0]  );\n    P( E, A, B, C, D, W[1]  );\n    P( D, E, A, B, C, W[2]  );\n    P( C, D, E, A, B, W[3]  );\n    P( B, C, D, E, A, W[4]  );\n    P( A, B, C, D, E, W[5]  );\n    P( E, A, B, C, D, W[6]  );\n    P( D, E, A, B, C, W[7]  );\n    P( C, D, E, A, B, W[8]  );\n    P( B, C, D, E, A, W[9]  );\n    P( A, B, C, D, E, W[10] );\n    P( E, A, B, C, D, W[11] );\n    P( D, E, A, B, C, W[12] );\n    P( C, D, E, A, B, W[13] );\n    P( B, C, D, E, A, W[14] );\n    P( A, B, C, D, E, W[15] );\n    P( E, A, B, C, D, R(16) );\n    P( D, E, A, B, C, R(17) );\n    P( C, D, E, A, B, R(18) );\n    P( B, C, D, E, A, R(19) );\n\n#undef K\n#undef F\n\n#define F(x,y,z) (x ^ y ^ z)\n#define K 0x6ED9EBA1\n\n    P( A, B, C, D, E, R(20) );\n    P( E, A, B, C, D, R(21) );\n    P( D, E, A, B, C, R(22) );\n    P( C, D, E, A, B, R(23) );\n    P( B, C, D, E, A, R(24) );\n    P( A, B, C, D, E, R(25) );\n    P( E, A, B, C, D, R(26) );\n    P( D, E, A, B, C, R(27) );\n    P( C, D, E, A, B, R(28) );\n    P( B, C, D, E, A, R(29) );\n    P( A, B, C, D, E, R(30) );\n    P( E, A, B, C, D, R(31) );\n    P( D, E, A, B, C, R(32) );\n    P( C, D, E, A, B, R(33) );\n    P( B, C, D, E, A, R(34) );\n    P( A, B, C, D, E, R(35) );\n    P( E, A, B, C, D, R(36) );\n    P( D, E, A, B, C, R(37) );\n    P( C, D, E, A, B, R(38) );\n    P( B, C, D, E, A, R(39) );\n\n#undef K\n#undef F\n\n#define F(x,y,z) ((x & y) | (z & (x | y)))\n#define K 0x8F1BBCDC\n\n    P( A, B, C, D, E, R(40) );\n    P( E, A, B, C, D, R(41) );\n    P( D, E, A, B, C, R(42) );\n    P( C, D, E, A, B, R(43) );\n    P( B, C, D, E, A, R(44) );\n    P( A, B, C, D, E, R(45) );\n    P( E, A, B, C, D, R(46) );\n    P( D, E, A, B, C, R(47) );\n    P( C, D, E, A, B, R(48) );\n    P( B, C, D, E, A, R(49) );\n    P( A, B, C, D, E, R(50) );\n    P( E, A, B, C, D, R(51) );\n    P( D, E, A, B, C, R(52) );\n    P( C, D, E, A, B, R(53) );\n    P( B, C, D, E, A, R(54) );\n    P( A, B, C, D, E, R(55) );\n    P( E, A, B, C, D, R(56) );\n    P( D, E, A, B, C, R(57) );\n    P( C, D, E, A, B, R(58) );\n    P( B, C, D, E, A, R(59) );\n\n#undef K\n#undef F\n\n#define F(x,y,z) (x ^ y ^ z)\n#define K 0xCA62C1D6\n\n    P( A, B, C, D, E, R(60) );\n    P( E, A, B, C, D, R(61) );\n    P( D, E, A, B, C, R(62) );\n    P( C, D, E, A, B, R(63) );\n    P( B, C, D, E, A, R(64) );\n    P( A, B, C, D, E, R(65) );\n    P( E, A, B, C, D, R(66) );\n    P( D, E, A, B, C, R(67) );\n    P( C, D, E, A, B, R(68) );\n    P( B, C, D, E, A, R(69) );\n    P( A, B, C, D, E, R(70) );\n    P( E, A, B, C, D, R(71) );\n    P( D, E, A, B, C, R(72) );\n    P( C, D, E, A, B, R(73) );\n    P( B, C, D, E, A, R(74) );\n    P( A, B, C, D, E, R(75) );\n    P( E, A, B, C, D, R(76) );\n    P( D, E, A, B, C, R(77) );\n    P( C, D, E, A, B, R(78) );\n    P( B, C, D, E, A, R(79) );\n\n#undef K\n#undef F\n\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n    ctx->state[4] += E;\n}\n\n/*\n * SHA-1 process buffer\n */\nvoid sha1_update( sha1_context *ctx, const unsigned char *input, int ilen )\n{\n    int fill;\n    unsigned long left;\n\n    if( ilen <= 0 )\n        return;\n\n    left = ctx->total[0] & 0x3F;\n    fill = 64 - left;\n\n    ctx->total[0] += ilen;\n    ctx->total[0] &= 0xFFFFFFFF;\n\n    if( ctx->total[0] < (unsigned long) ilen )\n        ctx->total[1]++;\n\n    if( left && ilen >= fill )\n    {\n        MEMCPY( (void *) (ctx->buffer + left),\n                input, fill );\n        sha1_process( ctx, ctx->buffer );\n        input += fill;\n        ilen  -= fill;\n        left = 0;\n    }\n\n    while( ilen >= 64 )\n    {\n        sha1_process( ctx, input );\n        input += 64;\n        ilen  -= 64;\n    }\n\n    if( ilen > 0 )\n    {\n        MEMCPY( (void *) (ctx->buffer + left),\n                input, ilen );\n    }\n}\n\nstatic const unsigned char sha1_padding[64] =\n{\n 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/*\n * SHA-1 final digest\n */\nvoid sha1_finish( sha1_context *ctx, unsigned char output[20] )\n{\n    unsigned long last, padn;\n    unsigned long high, low;\n    unsigned char msglen[8];\n\n    high = ( ctx->total[0] >> 29 )\n         | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n\n    PUT_ULONG_BE( high, msglen, 0 );\n    PUT_ULONG_BE( low,  msglen, 4 );\n\n    last = ctx->total[0] & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n\n    sha1_update( ctx, sha1_padding, padn );\n    sha1_update( ctx, msglen, 8 );\n\n    PUT_ULONG_BE( ctx->state[0], output,  0 );\n    PUT_ULONG_BE( ctx->state[1], output,  4 );\n    PUT_ULONG_BE( ctx->state[2], output,  8 );\n    PUT_ULONG_BE( ctx->state[3], output, 12 );\n    PUT_ULONG_BE( ctx->state[4], output, 16 );\n}\n\n/*\n * output = SHA-1( input buffer )\n */\nvoid sha1( unsigned char *input, int ilen, unsigned char output[20] )\n{\n    sha1_context ctx;\n\n    sha1_starts( &ctx );\n    sha1_update( &ctx, input, ilen );\n    sha1_finish( &ctx, output );\n}\n\n#endif /* PPP_SUPPORT && LWIP_INCLUDED_POLARSSL_SHA1 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/ppp.c",
    "content": "/*****************************************************************************\n* ppp.c - Network Point to Point Protocol program file.\n*\n* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.\n* portions Copyright (c) 1997 by Global Election Systems Inc.\n*\n* The authors hereby grant permission to use, copy, modify, distribute,\n* and license this software and its documentation for any purpose, provided\n* that existing copyright notices are retained in all copies and that this\n* notice and the following disclaimer are included verbatim in any\n* distributions. No written agreement, license, or royalty fee is required\n* for any of the authorized uses.\n*\n* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR\n* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n******************************************************************************\n* REVISION HISTORY\n*\n* 03-01-01 Marc Boucher <marc@mbsi.ca>\n*   Ported to lwIP.\n* 97-11-05 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.\n*   Original.\n*****************************************************************************/\n\n/*\n * ppp_defs.h - PPP definitions.\n *\n * if_pppvar.h - private structures and declarations for PPP.\n *\n * Copyright (c) 1994 The Australian National University.\n * All rights reserved.\n *\n * Permission to use, copy, modify, and distribute this software and its\n * documentation is hereby granted, provided that the above copyright\n * notice appears in all copies.  This software is provided without any\n * warranty, express or implied. The Australian National University\n * makes no representations about the suitability of this software for\n * any purpose.\n *\n * IN NO EVENT SHALL THE AUSTRALIAN NATIONAL UNIVERSITY BE LIABLE TO ANY\n * PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES\n * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF\n * THE AUSTRALIAN NATIONAL UNIVERSITY HAVE BEEN ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * THE AUSTRALIAN NATIONAL UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES,\n * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS\n * ON AN \"AS IS\" BASIS, AND THE AUSTRALIAN NATIONAL UNIVERSITY HAS NO\n * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,\n * OR MODIFICATIONS.\n */\n\n/*\n * if_ppp.h - Point-to-Point Protocol definitions.\n *\n * Copyright (c) 1989 Carnegie Mellon University.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms are permitted\n * provided that the above copyright notice and this paragraph are\n * duplicated in all such forms and that any documentation,\n * advertising materials, and other materials related to such\n * distribution and use acknowledge that the software was developed\n * by Carnegie Mellon University.  The name of the\n * University may not be used to endorse or promote products derived\n * from this software without specific prior written permission.\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n */\n\n/**\n * @defgroup ppp PPP netif\n * @ingroup addons\n * @verbinclude \"ppp.txt\"\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/tcpip.h\"\n#include \"lwip/api.h\"\n#include \"lwip/snmp.h\"\n#include \"lwip/ip4.h\" /* for ip4_input() */\n#if PPP_IPV6_SUPPORT\n#include \"lwip/ip6.h\" /* for ip6_input() */\n#endif /* PPP_IPV6_SUPPORT */\n#include \"lwip/dns.h\"\n\n#include \"netif/ppp/ppp_impl.h\"\n#include \"netif/ppp/pppos.h\"\n\n#include \"netif/ppp/fsm.h\"\n#include \"netif/ppp/lcp.h\"\n#include \"netif/ppp/magic.h\"\n\n#if PAP_SUPPORT\n#include \"netif/ppp/upap.h\"\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n#include \"netif/ppp/chap-new.h\"\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n#include \"netif/ppp/eap.h\"\n#endif /* EAP_SUPPORT */\n#if CCP_SUPPORT\n#include \"netif/ppp/ccp.h\"\n#endif /* CCP_SUPPORT */\n#if MPPE_SUPPORT\n#include \"netif/ppp/mppe.h\"\n#endif /* MPPE_SUPPORT */\n#if ECP_SUPPORT\n#include \"netif/ppp/ecp.h\"\n#endif /* EAP_SUPPORT */\n#if VJ_SUPPORT\n#include \"netif/ppp/vj.h\"\n#endif /* VJ_SUPPORT */\n#if PPP_IPV4_SUPPORT\n#include \"netif/ppp/ipcp.h\"\n#endif /* PPP_IPV4_SUPPORT */\n#if PPP_IPV6_SUPPORT\n#include \"netif/ppp/ipv6cp.h\"\n#endif /* PPP_IPV6_SUPPORT */\n\n/*************************/\n/*** LOCAL DEFINITIONS ***/\n/*************************/\n\n/* Memory pools */\n#if PPPOS_SUPPORT\nLWIP_MEMPOOL_PROTOTYPE(PPPOS_PCB);\n#endif\n#if PPPOE_SUPPORT\nLWIP_MEMPOOL_PROTOTYPE(PPPOE_IF);\n#endif\n#if PPPOL2TP_SUPPORT\nLWIP_MEMPOOL_PROTOTYPE(PPPOL2TP_PCB);\n#endif\n#if LWIP_PPP_API && LWIP_MPU_COMPATIBLE\nLWIP_MEMPOOL_PROTOTYPE(PPPAPI_MSG);\n#endif\nLWIP_MEMPOOL_DECLARE(PPP_PCB, MEMP_NUM_PPP_PCB, sizeof(ppp_pcb), \"PPP_PCB\")\n\n/* FIXME: add stats per PPP session */\n#if PPP_STATS_SUPPORT\nstatic struct timeval start_time; /* Time when link was started. */\nstatic struct pppd_stats old_link_stats;\nstruct pppd_stats link_stats;\nunsigned link_connect_time;\nint link_stats_valid;\n#endif /* PPP_STATS_SUPPORT */\n\n/*\n * PPP Data Link Layer \"protocol\" table.\n * One entry per supported protocol.\n * The last entry must be NULL.\n */\nconst struct protent* const protocols[] = {\n    &lcp_protent,\n#if PAP_SUPPORT\n    &pap_protent,\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n    &chap_protent,\n#endif /* CHAP_SUPPORT */\n#if CBCP_SUPPORT\n    &cbcp_protent,\n#endif /* CBCP_SUPPORT */\n#if PPP_IPV4_SUPPORT\n    &ipcp_protent,\n#endif /* PPP_IPV4_SUPPORT */\n#if PPP_IPV6_SUPPORT\n    &ipv6cp_protent,\n#endif /* PPP_IPV6_SUPPORT */\n#if CCP_SUPPORT\n    &ccp_protent,\n#endif /* CCP_SUPPORT */\n#if ECP_SUPPORT\n    &ecp_protent,\n#endif /* ECP_SUPPORT */\n#ifdef AT_CHANGE\n    &atcp_protent,\n#endif /* AT_CHANGE */\n#if EAP_SUPPORT\n    &eap_protent,\n#endif /* EAP_SUPPORT */\n    NULL\n};\n\n/* Prototypes for procedures local to this file. */\nstatic void ppp_do_connect(void *arg);\nstatic err_t ppp_netif_init_cb(struct netif *netif);\n#if LWIP_IPV4\nstatic err_t ppp_netif_output_ip4(struct netif *netif, struct pbuf *pb, const ip4_addr_t *ipaddr);\n#endif /* LWIP_IPV4 */\n#if PPP_IPV6_SUPPORT\nstatic err_t ppp_netif_output_ip6(struct netif *netif, struct pbuf *pb, const ip6_addr_t *ipaddr);\n#endif /* PPP_IPV6_SUPPORT */\nstatic err_t ppp_netif_output(struct netif *netif, struct pbuf *pb, u16_t protocol);\n\n/***********************************/\n/*** PUBLIC FUNCTION DEFINITIONS ***/\n/***********************************/\n#if PPP_AUTH_SUPPORT\nvoid ppp_set_auth(ppp_pcb *pcb, u8_t authtype, const char *user, const char *passwd) {\n#if PAP_SUPPORT\n  pcb->settings.refuse_pap = !(authtype & PPPAUTHTYPE_PAP);\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n  pcb->settings.refuse_chap = !(authtype & PPPAUTHTYPE_CHAP);\n#if MSCHAP_SUPPORT\n  pcb->settings.refuse_mschap = !(authtype & PPPAUTHTYPE_MSCHAP);\n  pcb->settings.refuse_mschap_v2 = !(authtype & PPPAUTHTYPE_MSCHAP_V2);\n#endif /* MSCHAP_SUPPORT */\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n  pcb->settings.refuse_eap = !(authtype & PPPAUTHTYPE_EAP);\n#endif /* EAP_SUPPORT */\n  pcb->settings.user = user;\n  pcb->settings.passwd = passwd;\n}\n#endif /* PPP_AUTH_SUPPORT */\n\n#if MPPE_SUPPORT\n/* Set MPPE configuration */\nvoid ppp_set_mppe(ppp_pcb *pcb, u8_t flags) {\n  if (flags == PPP_MPPE_DISABLE) {\n    pcb->settings.require_mppe = 0;\n    return;\n  }\n\n  pcb->settings.require_mppe = 1;\n  pcb->settings.refuse_mppe_stateful = !(flags & PPP_MPPE_ALLOW_STATEFUL);\n  pcb->settings.refuse_mppe_40 = !!(flags & PPP_MPPE_REFUSE_40);\n  pcb->settings.refuse_mppe_128 = !!(flags & PPP_MPPE_REFUSE_128);\n}\n#endif /* MPPE_SUPPORT */\n\n#if PPP_NOTIFY_PHASE\nvoid ppp_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb) {\n  pcb->notify_phase_cb = notify_phase_cb;\n  notify_phase_cb(pcb, pcb->phase, pcb->ctx_cb);\n}\n#endif /* PPP_NOTIFY_PHASE */\n\n/*\n * Initiate a PPP connection.\n *\n * This can only be called if PPP is in the dead phase.\n *\n * Holdoff is the time to wait (in seconds) before initiating\n * the connection.\n *\n * If this port connects to a modem, the modem connection must be\n * established before calling this.\n */\nerr_t ppp_connect(ppp_pcb *pcb, u16_t holdoff) {\n  if (pcb->phase != PPP_PHASE_DEAD) {\n    return ERR_ALREADY;\n  }\n\n  PPPDEBUG(LOG_DEBUG, (\"ppp_connect[%d]: holdoff=%d\\n\", pcb->netif->num, holdoff));\n\n  if (holdoff == 0) {\n    ppp_do_connect(pcb);\n    return ERR_OK;\n  }\n\n  new_phase(pcb, PPP_PHASE_HOLDOFF);\n  sys_timeout((u32_t)(holdoff*1000), ppp_do_connect, pcb);\n  return ERR_OK;\n}\n\n#if PPP_SERVER\n/*\n * Listen for an incoming PPP connection.\n *\n * This can only be called if PPP is in the dead phase.\n *\n * If this port connects to a modem, the modem connection must be\n * established before calling this.\n */\nerr_t ppp_listen(ppp_pcb *pcb) {\n  if (pcb->phase != PPP_PHASE_DEAD) {\n    return ERR_ALREADY;\n  }\n\n  PPPDEBUG(LOG_DEBUG, (\"ppp_listen[%d]\\n\", pcb->netif->num));\n\n  if (pcb->link_cb->listen) {\n    new_phase(pcb, PPP_PHASE_INITIALIZE);\n    pcb->link_cb->listen(pcb, pcb->link_ctx_cb);\n    return ERR_OK;\n  }\n  return ERR_IF;\n}\n#endif /* PPP_SERVER */\n\n/*\n * Initiate the end of a PPP connection.\n * Any outstanding packets in the queues are dropped.\n *\n * Setting nocarrier to 1 close the PPP connection without initiating the\n * shutdown procedure. Always using nocarrier = 0 is still recommended,\n * this is going to take a little longer time if your link is down, but\n * is a safer choice for the PPP state machine.\n *\n * Return 0 on success, an error code on failure.\n */\nerr_t\nppp_close(ppp_pcb *pcb, u8_t nocarrier)\n{\n  pcb->err_code = PPPERR_USER;\n\n  /* holdoff phase, cancel the reconnection */\n  if (pcb->phase == PPP_PHASE_HOLDOFF) {\n    sys_untimeout(ppp_do_connect, pcb);\n    new_phase(pcb, PPP_PHASE_DEAD);\n  }\n\n  /* dead phase, nothing to do, call the status callback to be consistent */\n  if (pcb->phase == PPP_PHASE_DEAD) {\n    pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);\n    return ERR_OK;\n  }\n\n  /* Already terminating, nothing to do */\n  if (pcb->phase >= PPP_PHASE_TERMINATE) {\n    return ERR_INPROGRESS;\n  }\n\n  /* LCP not open, close link protocol */\n  if (pcb->phase < PPP_PHASE_ESTABLISH) {\n    new_phase(pcb, PPP_PHASE_DISCONNECT);\n    ppp_link_terminated(pcb);\n    return ERR_OK;\n  }\n\n  /*\n   * Only accept carrier lost signal on the stable running phase in order\n   * to prevent changing the PPP phase FSM in transition phases.\n   *\n   * Always using nocarrier = 0 is still recommended, this is going to\n   * take a little longer time, but is a safer choice from FSM point of view.\n   */\n  if (nocarrier && pcb->phase == PPP_PHASE_RUNNING) {\n    PPPDEBUG(LOG_DEBUG, (\"ppp_close[%d]: carrier lost -> lcp_lowerdown\\n\", pcb->netif->num));\n    lcp_lowerdown(pcb);\n    /* forced link termination, this will force link protocol to disconnect. */\n    link_terminated(pcb);\n    return ERR_OK;\n  }\n\n  /* Disconnect */\n  PPPDEBUG(LOG_DEBUG, (\"ppp_close[%d]: kill_link -> lcp_close\\n\", pcb->netif->num));\n  /* LCP soft close request. */\n  lcp_close(pcb, \"User request\");\n  return ERR_OK;\n}\n\n/*\n * Release the control block.\n *\n * This can only be called if PPP is in the dead phase.\n *\n * You must use ppp_close() before if you wish to terminate\n * an established PPP session.\n *\n * Return 0 on success, an error code on failure.\n */\nerr_t ppp_free(ppp_pcb *pcb) {\n  err_t err;\n  if (pcb->phase != PPP_PHASE_DEAD) {\n    return ERR_CONN;\n  }\n\n  PPPDEBUG(LOG_DEBUG, (\"ppp_free[%d]\\n\", pcb->netif->num));\n\n  netif_remove(pcb->netif);\n\n  err = pcb->link_cb->free(pcb, pcb->link_ctx_cb);\n\n  LWIP_MEMPOOL_FREE(PPP_PCB, pcb);\n  return err;\n}\n\n/* Get and set parameters for the given connection.\n * Return 0 on success, an error code on failure. */\nerr_t\nppp_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg)\n{\n  if (pcb == NULL) {\n    return ERR_VAL;\n  }\n\n  switch(cmd) {\n    case PPPCTLG_UPSTATUS:      /* Get the PPP up status. */\n      if (!arg) {\n        goto fail;\n      }\n      *(int *)arg = (int)(0\n#if PPP_IPV4_SUPPORT\n           || pcb->if4_up\n#endif /* PPP_IPV4_SUPPORT */\n#if PPP_IPV6_SUPPORT\n           || pcb->if6_up\n#endif /* PPP_IPV6_SUPPORT */\n           );\n      return ERR_OK;\n\n    case PPPCTLG_ERRCODE:       /* Get the PPP error code. */\n      if (!arg) {\n        goto fail;\n      }\n      *(int *)arg = (int)(pcb->err_code);\n      return ERR_OK;\n\n    default:\n      goto fail;\n  }\n\nfail:\n  return ERR_VAL;\n}\n\n\n/**********************************/\n/*** LOCAL FUNCTION DEFINITIONS ***/\n/**********************************/\n\nstatic void ppp_do_connect(void *arg) {\n  ppp_pcb *pcb = (ppp_pcb*)arg;\n\n  LWIP_ASSERT(\"pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_HOLDOFF\", pcb->phase == PPP_PHASE_DEAD || pcb->phase == PPP_PHASE_HOLDOFF);\n\n  new_phase(pcb, PPP_PHASE_INITIALIZE);\n  pcb->link_cb->connect(pcb, pcb->link_ctx_cb);\n}\n\n/*\n * ppp_netif_init_cb - netif init callback\n */\nstatic err_t ppp_netif_init_cb(struct netif *netif) {\n  netif->name[0] = 'p';\n  netif->name[1] = 'p';\n#if LWIP_IPV4\n  /* FIXME: change that when netif_null_output_ip4() will materialize */\n  netif->output = ppp_netif_output_ip4;\n#endif /* LWIP_IPV4 */\n#if PPP_IPV6_SUPPORT\n  netif->output_ip6 = ppp_netif_output_ip6;\n#endif /* PPP_IPV6_SUPPORT */\n  netif->flags = NETIF_FLAG_UP;\n#if LWIP_NETIF_HOSTNAME\n  /* @todo: Initialize interface hostname */\n  /* netif_set_hostname(netif, \"lwip\"); */\n#endif /* LWIP_NETIF_HOSTNAME */\n  return ERR_OK;\n}\n\n#if LWIP_IPV4\n/*\n * Send an IPv4 packet on the given connection.\n */\nstatic err_t ppp_netif_output_ip4(struct netif *netif, struct pbuf *pb, const ip4_addr_t *ipaddr) {\n  LWIP_UNUSED_ARG(ipaddr);\n#if PPP_IPV4_SUPPORT\n  return ppp_netif_output(netif, pb, PPP_IP);\n#else /* PPP_IPV4_SUPPORT */\n  LWIP_UNUSED_ARG(netif);\n  LWIP_UNUSED_ARG(pb);\n  return ERR_IF;\n#endif /* PPP_IPV4_SUPPORT */\n}\n#endif /* LWIP_IPV4 */\n\n#if PPP_IPV6_SUPPORT\n/*\n * Send an IPv6 packet on the given connection.\n */\nstatic err_t ppp_netif_output_ip6(struct netif *netif, struct pbuf *pb, const ip6_addr_t *ipaddr) {\n  LWIP_UNUSED_ARG(ipaddr);\n  return ppp_netif_output(netif, pb, PPP_IPV6);\n}\n#endif /* PPP_IPV6_SUPPORT */\n\nstatic err_t ppp_netif_output(struct netif *netif, struct pbuf *pb, u16_t protocol) {\n  ppp_pcb *pcb = (ppp_pcb*)netif->state;\n  err_t err;\n  struct pbuf *fpb = NULL;\n\n  /* Check that the link is up. */\n  if (0\n#if PPP_IPV4_SUPPORT\n      || (protocol == PPP_IP && !pcb->if4_up)\n#endif /* PPP_IPV4_SUPPORT */\n#if PPP_IPV6_SUPPORT\n      || (protocol == PPP_IPV6 && !pcb->if6_up)\n#endif /* PPP_IPV6_SUPPORT */\n      ) {\n    PPPDEBUG(LOG_ERR, (\"ppp_netif_output[%d]: link not up\\n\", pcb->netif->num));\n    goto err_rte_drop;\n  }\n\n#if MPPE_SUPPORT\n  /* If MPPE is required, refuse any IP packet until we are able to crypt them. */\n  if (pcb->settings.require_mppe && pcb->ccp_transmit_method != CI_MPPE) {\n    PPPDEBUG(LOG_ERR, (\"ppp_netif_output[%d]: MPPE required, not up\\n\", pcb->netif->num));\n    goto err_rte_drop;\n  }\n#endif /* MPPE_SUPPORT */\n\n#if VJ_SUPPORT\n  /*\n   * Attempt Van Jacobson header compression if VJ is configured and\n   * this is an IP packet.\n   */\n  if (protocol == PPP_IP && pcb->vj_enabled) {\n    switch (vj_compress_tcp(&pcb->vj_comp, &pb)) {\n      case TYPE_IP:\n        /* No change...\n           protocol = PPP_IP; */\n        break;\n      case TYPE_COMPRESSED_TCP:\n        /* vj_compress_tcp() returns a new allocated pbuf, indicate we should free\n         * our duplicated pbuf later */\n        fpb = pb;\n        protocol = PPP_VJC_COMP;\n        break;\n      case TYPE_UNCOMPRESSED_TCP:\n        /* vj_compress_tcp() returns a new allocated pbuf, indicate we should free\n         * our duplicated pbuf later */\n        fpb = pb;\n        protocol = PPP_VJC_UNCOMP;\n        break;\n      default:\n        PPPDEBUG(LOG_WARNING, (\"ppp_netif_output[%d]: bad IP packet\\n\", pcb->netif->num));\n        LINK_STATS_INC(link.proterr);\n        LINK_STATS_INC(link.drop);\n        MIB2_STATS_NETIF_INC(pcb->netif, ifoutdiscards);\n        return ERR_VAL;\n    }\n  }\n#endif /* VJ_SUPPORT */\n\n#if CCP_SUPPORT\n  switch (pcb->ccp_transmit_method) {\n  case 0:\n    break; /* Don't compress */\n#if MPPE_SUPPORT\n  case CI_MPPE:\n    if ((err = mppe_compress(pcb, &pcb->mppe_comp, &pb, protocol)) != ERR_OK) {\n      LINK_STATS_INC(link.memerr);\n      LINK_STATS_INC(link.drop);\n      MIB2_STATS_NETIF_INC(netif, ifoutdiscards);\n      goto err;\n    }\n    /* if VJ compressor returned a new allocated pbuf, free it */\n    if (fpb) {\n      pbuf_free(fpb);\n    }\n    /* mppe_compress() returns a new allocated pbuf, indicate we should free\n     * our duplicated pbuf later */\n    fpb = pb;\n    protocol = PPP_COMP;\n    break;\n#endif /* MPPE_SUPPORT */\n  default:\n    PPPDEBUG(LOG_ERR, (\"ppp_netif_output[%d]: bad CCP transmit method\\n\", pcb->netif->num));\n    goto err_rte_drop; /* Cannot really happen, we only negotiate what we are able to do */\n  }\n#endif /* CCP_SUPPORT */\n\n  err = pcb->link_cb->netif_output(pcb, pcb->link_ctx_cb, pb, protocol);\n  goto err;\n\nerr_rte_drop:\n  err = ERR_RTE;\n  LINK_STATS_INC(link.rterr);\n  LINK_STATS_INC(link.drop);\n  MIB2_STATS_NETIF_INC(netif, ifoutdiscards);\nerr:\n  if (fpb) {\n    pbuf_free(fpb);\n  }\n  return err;\n}\n\n/************************************/\n/*** PRIVATE FUNCTION DEFINITIONS ***/\n/************************************/\n\n/* Initialize the PPP subsystem. */\nint ppp_init(void)\n{\n#if PPPOS_SUPPORT\n  LWIP_MEMPOOL_INIT(PPPOS_PCB);\n#endif\n#if PPPOE_SUPPORT\n  LWIP_MEMPOOL_INIT(PPPOE_IF);\n#endif\n#if PPPOL2TP_SUPPORT\n  LWIP_MEMPOOL_INIT(PPPOL2TP_PCB);\n#endif\n#if LWIP_PPP_API && LWIP_MPU_COMPATIBLE\n  LWIP_MEMPOOL_INIT(PPPAPI_MSG);\n#endif\n\n  LWIP_MEMPOOL_INIT(PPP_PCB);\n\n  /*\n   * Initialize magic number generator now so that protocols may\n   * use magic numbers in initialization.\n   */\n  magic_init();\n\n  return 0;\n}\n \n/*\n * Create a new PPP control block.\n *\n * This initializes the PPP control block but does not\n * attempt to negotiate the LCP session.\n *\n * Return a new PPP connection control block pointer\n * on success or a null pointer on failure.\n */\nppp_pcb *ppp_new(struct netif *pppif, const struct link_callbacks *callbacks, void *link_ctx_cb, ppp_link_status_cb_fn link_status_cb, void *ctx_cb) {\n  ppp_pcb *pcb;\n  const struct protent *protp;\n  int i;\n\n  /* PPP is single-threaded: without a callback,\n   * there is no way to know when the link is up. */\n  if (link_status_cb == NULL) {\n    return NULL;\n  }\n\n  pcb = (ppp_pcb*)LWIP_MEMPOOL_ALLOC(PPP_PCB);\n  if (pcb == NULL) {\n    return NULL;\n  }\n\n  memset(pcb, 0, sizeof(ppp_pcb));\n\n  /* default configuration */\n#if PAP_SUPPORT\n  pcb->settings.pap_timeout_time = UPAP_DEFTIMEOUT;\n  pcb->settings.pap_max_transmits = UPAP_DEFTRANSMITS;\n#if PPP_SERVER\n  pcb->settings.pap_req_timeout = UPAP_DEFREQTIME;\n#endif /* PPP_SERVER */\n#endif /* PAP_SUPPORT */\n\n#if CHAP_SUPPORT\n  pcb->settings.chap_timeout_time = CHAP_DEFTIMEOUT;\n  pcb->settings.chap_max_transmits = CHAP_DEFTRANSMITS;\n#if PPP_SERVER\n  pcb->settings.chap_rechallenge_time = CHAP_DEFRECHALLENGETIME;\n#endif /* PPP_SERVER */\n#endif /* CHAP_SUPPPORT */\n\n#if EAP_SUPPORT\n  pcb->settings.eap_req_time = EAP_DEFREQTIME;\n  pcb->settings.eap_allow_req = EAP_DEFALLOWREQ;\n#if PPP_SERVER\n  pcb->settings.eap_timeout_time = EAP_DEFTIMEOUT;\n  pcb->settings.eap_max_transmits = EAP_DEFTRANSMITS;\n#endif /* PPP_SERVER */\n#endif /* EAP_SUPPORT */\n\n  pcb->settings.lcp_loopbackfail = LCP_DEFLOOPBACKFAIL;\n  pcb->settings.lcp_echo_interval = LCP_ECHOINTERVAL;\n  pcb->settings.lcp_echo_fails = LCP_MAXECHOFAILS;\n\n  pcb->settings.fsm_timeout_time = FSM_DEFTIMEOUT;\n  pcb->settings.fsm_max_conf_req_transmits = FSM_DEFMAXCONFREQS;\n  pcb->settings.fsm_max_term_transmits = FSM_DEFMAXTERMREQS;\n  pcb->settings.fsm_max_nak_loops = FSM_DEFMAXNAKLOOPS;\n\n  pcb->netif = pppif;\n  MIB2_INIT_NETIF(pppif, snmp_ifType_ppp, 0);\n  if (!netif_add(pcb->netif,\n#if LWIP_IPV4\n                 IP4_ADDR_ANY4, IP4_ADDR_BROADCAST, IP4_ADDR_ANY4,\n#endif /* LWIP_IPV4 */\n                 (void *)pcb, ppp_netif_init_cb, NULL)) {\n    LWIP_MEMPOOL_FREE(PPP_PCB, pcb);\n    PPPDEBUG(LOG_ERR, (\"ppp_new: netif_add failed\\n\"));\n    return NULL;\n  }\n\n  pcb->link_cb = callbacks;\n  pcb->link_ctx_cb = link_ctx_cb;\n  pcb->link_status_cb = link_status_cb;\n  pcb->ctx_cb = ctx_cb;\n\n  /*\n   * Initialize each protocol.\n   */\n  for (i = 0; (protp = protocols[i]) != NULL; ++i) {\n      (*protp->init)(pcb);\n  }\n\n  new_phase(pcb, PPP_PHASE_DEAD);\n  return pcb;\n}\n\n/** Initiate LCP open request */\nvoid ppp_start(ppp_pcb *pcb) {\n  PPPDEBUG(LOG_DEBUG, (\"ppp_start[%d]\\n\", pcb->netif->num));\n\n  /* Clean data not taken care by anything else, mostly shared data. */\n#if PPP_STATS_SUPPORT\n  link_stats_valid = 0;\n#endif /* PPP_STATS_SUPPORT */\n#if MPPE_SUPPORT\n  pcb->mppe_keys_set = 0;\n  memset(&pcb->mppe_comp, 0, sizeof(pcb->mppe_comp));\n  memset(&pcb->mppe_decomp, 0, sizeof(pcb->mppe_decomp));\n#endif /* MPPE_SUPPORT */\n#if VJ_SUPPORT\n  vj_compress_init(&pcb->vj_comp);\n#endif /* VJ_SUPPORT */\n\n  /* Start protocol */\n  new_phase(pcb, PPP_PHASE_ESTABLISH);\n  lcp_open(pcb);\n  lcp_lowerup(pcb);\n  PPPDEBUG(LOG_DEBUG, (\"ppp_start[%d]: finished\\n\", pcb->netif->num));\n}\n\n/** Called when link failed to setup */\nvoid ppp_link_failed(ppp_pcb *pcb) {\n  PPPDEBUG(LOG_DEBUG, (\"ppp_link_failed[%d]\\n\", pcb->netif->num));\n  new_phase(pcb, PPP_PHASE_DEAD);\n  pcb->err_code = PPPERR_OPEN;\n  pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);\n}\n\n/** Called when link is normally down (i.e. it was asked to end) */\nvoid ppp_link_end(ppp_pcb *pcb) {\n  PPPDEBUG(LOG_DEBUG, (\"ppp_link_end[%d]\\n\", pcb->netif->num));\n  new_phase(pcb, PPP_PHASE_DEAD);\n  if (pcb->err_code == PPPERR_NONE) {\n    pcb->err_code = PPPERR_CONNECT;\n  }\n  pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);\n}\n\n/*\n * Pass the processed input packet to the appropriate handler.\n * This function and all handlers run in the context of the tcpip_thread\n */\nvoid ppp_input(ppp_pcb *pcb, struct pbuf *pb) {\n  u16_t protocol;\n#if PPP_DEBUG && PPP_PROTOCOLNAME\n    const char *pname;\n#endif /* PPP_DEBUG && PPP_PROTOCOLNAME */\n\n  magic_randomize();\n\n  if (pb->len < 2) {\n    PPPDEBUG(LOG_ERR, (\"ppp_input[%d]: packet too short\\n\", pcb->netif->num));\n    goto drop;\n  }\n  protocol = (((u8_t *)pb->payload)[0] << 8) | ((u8_t*)pb->payload)[1];\n\n#if PRINTPKT_SUPPORT\n  ppp_dump_packet(pcb, \"rcvd\", (unsigned char *)pb->payload, pb->len);\n#endif /* PRINTPKT_SUPPORT */\n\n  pbuf_header(pb, -(s16_t)sizeof(protocol));\n\n  LINK_STATS_INC(link.recv);\n  MIB2_STATS_NETIF_INC(pcb->netif, ifinucastpkts);\n  MIB2_STATS_NETIF_ADD(pcb->netif, ifinoctets, pb->tot_len);\n\n  /*\n   * Toss all non-LCP packets unless LCP is OPEN.\n   */\n  if (protocol != PPP_LCP && pcb->lcp_fsm.state != PPP_FSM_OPENED) {\n    ppp_dbglog(\"Discarded non-LCP packet when LCP not open\");\n    goto drop;\n  }\n\n  /*\n   * Until we get past the authentication phase, toss all packets\n   * except LCP, LQR and authentication packets.\n   */\n  if (pcb->phase <= PPP_PHASE_AUTHENTICATE\n   && !(protocol == PPP_LCP\n#if LQR_SUPPORT\n   || protocol == PPP_LQR\n#endif /* LQR_SUPPORT */\n#if PAP_SUPPORT\n   || protocol == PPP_PAP\n#endif /* PAP_SUPPORT */\n#if CHAP_SUPPORT\n   || protocol == PPP_CHAP\n#endif /* CHAP_SUPPORT */\n#if EAP_SUPPORT\n   || protocol == PPP_EAP\n#endif /* EAP_SUPPORT */\n   )) {\n    ppp_dbglog(\"discarding proto 0x%x in phase %d\", protocol, pcb->phase);\n    goto drop;\n  }\n\n#if CCP_SUPPORT\n#if MPPE_SUPPORT\n  /*\n   * MPPE is required and unencrypted data has arrived (this\n   * should never happen!). We should probably drop the link if\n   * the protocol is in the range of what should be encrypted.\n   * At the least, we drop this packet.\n   */\n  if (pcb->settings.require_mppe && protocol != PPP_COMP && protocol < 0x8000) {\n    PPPDEBUG(LOG_ERR, (\"ppp_input[%d]: MPPE required, received unencrypted data!\\n\", pcb->netif->num));\n    goto drop;\n  }\n#endif /* MPPE_SUPPORT */\n\n  if (protocol == PPP_COMP) {\n    u8_t *pl;\n\n    switch (pcb->ccp_receive_method) {\n#if MPPE_SUPPORT\n    case CI_MPPE:\n      if (mppe_decompress(pcb, &pcb->mppe_decomp, &pb) != ERR_OK) {\n        goto drop;\n      }\n      break;\n#endif /* MPPE_SUPPORT */\n    default:\n      PPPDEBUG(LOG_ERR, (\"ppp_input[%d]: bad CCP receive method\\n\", pcb->netif->num));\n      goto drop; /* Cannot really happen, we only negotiate what we are able to do */\n    }\n\n    /* Assume no PFC */\n    if (pb->len < 2) {\n      goto drop;\n    }\n\n    /* Extract and hide protocol (do PFC decompression if necessary) */\n    pl = (u8_t*)pb->payload;\n    if (pl[0] & 0x01) {\n      protocol = pl[0];\n      pbuf_header(pb, -(s16_t)1);\n    } else {\n      protocol = (pl[0] << 8) | pl[1];\n      pbuf_header(pb, -(s16_t)2);\n    }\n  }\n#endif /* CCP_SUPPORT */\n\n  switch(protocol) {\n\n#if PPP_IPV4_SUPPORT\n    case PPP_IP:            /* Internet Protocol */\n      PPPDEBUG(LOG_INFO, (\"ppp_input[%d]: ip in pbuf len=%d\\n\", pcb->netif->num, pb->tot_len));\n      ip4_input(pb, pcb->netif);\n      return;\n#endif /* PPP_IPV4_SUPPORT */\n\n#if PPP_IPV6_SUPPORT\n    case PPP_IPV6:          /* Internet Protocol Version 6 */\n      PPPDEBUG(LOG_INFO, (\"ppp_input[%d]: ip6 in pbuf len=%d\\n\", pcb->netif->num, pb->tot_len));\n      ip6_input(pb, pcb->netif);\n      return;\n#endif /* PPP_IPV6_SUPPORT */\n\n#if VJ_SUPPORT\n    case PPP_VJC_COMP:      /* VJ compressed TCP */\n      /*\n       * Clip off the VJ header and prepend the rebuilt TCP/IP header and\n       * pass the result to IP.\n       */\n      PPPDEBUG(LOG_INFO, (\"ppp_input[%d]: vj_comp in pbuf len=%d\\n\", pcb->netif->num, pb->tot_len));\n      if (pcb->vj_enabled && vj_uncompress_tcp(&pb, &pcb->vj_comp) >= 0) {\n        ip4_input(pb, pcb->netif);\n        return;\n      }\n      /* Something's wrong so drop it. */\n      PPPDEBUG(LOG_WARNING, (\"ppp_input[%d]: Dropping VJ compressed\\n\", pcb->netif->num));\n      break;\n\n    case PPP_VJC_UNCOMP:    /* VJ uncompressed TCP */\n      /*\n       * Process the TCP/IP header for VJ header compression and then pass\n       * the packet to IP.\n       */\n      PPPDEBUG(LOG_INFO, (\"ppp_input[%d]: vj_un in pbuf len=%d\\n\", pcb->netif->num, pb->tot_len));\n      if (pcb->vj_enabled && vj_uncompress_uncomp(pb, &pcb->vj_comp) >= 0) {\n        ip4_input(pb, pcb->netif);\n        return;\n      }\n      /* Something's wrong so drop it. */\n      PPPDEBUG(LOG_WARNING, (\"ppp_input[%d]: Dropping VJ uncompressed\\n\", pcb->netif->num));\n      break;\n#endif /* VJ_SUPPORT */\n\n    default: {\n      int i;\n      const struct protent *protp;\n\n      /*\n       * Upcall the proper protocol input routine.\n       */\n      for (i = 0; (protp = protocols[i]) != NULL; ++i) {\n        if (protp->protocol == protocol) {\n          pb = ppp_singlebuf(pb);\n          (*protp->input)(pcb, (u8_t*)pb->payload, pb->len);\n          goto out;\n        }\n#if 0   /* UNUSED\n         *\n         * This is actually a (hacked?) way for the Linux kernel to pass a data\n         * packet to pppd. pppd in normal condition only do signaling\n         * (LCP, PAP, CHAP, IPCP, ...) and does not handle any data packet at all.\n         *\n         * We don't even need this interface, which is only there because of PPP\n         * interface limitation between Linux kernel and pppd. For MPPE, which uses\n         * CCP to negotiate although it is not really a (de)compressor, we added\n         * ccp_resetrequest() in CCP and MPPE input data flow is calling either\n         * ccp_resetrequest() or lcp_close() if the issue is, respectively, non-fatal\n         * or fatal, this is what ccp_datainput() really do.\n         */\n        if (protocol == (protp->protocol & ~0x8000)\n          && protp->datainput != NULL) {\n          (*protp->datainput)(pcb, pb->payload, pb->len);\n          goto out;\n        }\n#endif /* UNUSED */\n      }\n\n#if PPP_DEBUG\n#if PPP_PROTOCOLNAME\n      pname = protocol_name(protocol);\n      if (pname != NULL) {\n        ppp_warn(\"Unsupported protocol '%s' (0x%x) received\", pname, protocol);\n      } else\n#endif /* PPP_PROTOCOLNAME */\n        ppp_warn(\"Unsupported protocol 0x%x received\", protocol);\n#endif /* PPP_DEBUG */\n        pbuf_header(pb, (s16_t)sizeof(protocol));\n        lcp_sprotrej(pcb, (u8_t*)pb->payload, pb->len);\n      }\n      break;\n  }\n\ndrop:\n  LINK_STATS_INC(link.drop);\n  MIB2_STATS_NETIF_INC(pcb->netif, ifindiscards);\n\nout:\n  pbuf_free(pb);\n}\n\n/* merge a pbuf chain into one pbuf */\nstruct pbuf *ppp_singlebuf(struct pbuf *p) {\n  struct pbuf *q, *b;\n  u8_t *pl;\n\n  if(p->tot_len == p->len) {\n    return p;\n  }\n\n  q = pbuf_alloc(PBUF_RAW, p->tot_len, PBUF_RAM);\n  if(!q) {\n    PPPDEBUG(LOG_ERR,\n             (\"ppp_singlebuf: unable to alloc new buf (%d)\\n\", p->tot_len));\n    return p; /* live dangerously */\n  }\n\n  for(b = p, pl = (u8_t*)q->payload; b != NULL; b = b->next) {\n    MEMCPY(pl, b->payload, b->len);\n    pl += b->len;\n  }\n\n  pbuf_free(p);\n\n  return q;\n}\n\n/*\n * Write a pbuf to a ppp link, only used from PPP functions\n * to send PPP packets.\n *\n * IPv4 and IPv6 packets from lwIP are sent, respectively,\n * with ppp_netif_output_ip4() and ppp_netif_output_ip6()\n * functions (which are callbacks of the netif PPP interface).\n */\nerr_t ppp_write(ppp_pcb *pcb, struct pbuf *p) {\n#if PRINTPKT_SUPPORT\n  ppp_dump_packet(pcb, \"sent\", (unsigned char *)p->payload+2, p->len-2);\n#endif /* PRINTPKT_SUPPORT */\n  return pcb->link_cb->write(pcb, pcb->link_ctx_cb, p);\n}\n\nvoid ppp_link_terminated(ppp_pcb *pcb) {\n  PPPDEBUG(LOG_DEBUG, (\"ppp_link_terminated[%d]\\n\", pcb->netif->num));\n  pcb->link_cb->disconnect(pcb, pcb->link_ctx_cb);\n  PPPDEBUG(LOG_DEBUG, (\"ppp_link_terminated[%d]: finished.\\n\", pcb->netif->num));\n}\n\n\n/************************************************************************\n * Functions called by various PPP subsystems to configure\n * the PPP interface or change the PPP phase.\n */\n\n/*\n * new_phase - signal the start of a new phase of pppd's operation.\n */\nvoid new_phase(ppp_pcb *pcb, int p) {\n  pcb->phase = p;\n  PPPDEBUG(LOG_DEBUG, (\"ppp phase changed[%d]: phase=%d\\n\", pcb->netif->num, pcb->phase));\n#if PPP_NOTIFY_PHASE\n  if (pcb->notify_phase_cb != NULL) {\n    pcb->notify_phase_cb(pcb, p, pcb->ctx_cb);\n  }\n#endif /* PPP_NOTIFY_PHASE */\n}\n\n/*\n * ppp_send_config - configure the transmit-side characteristics of\n * the ppp interface.\n */\nint ppp_send_config(ppp_pcb *pcb, int mtu, u32_t accm, int pcomp, int accomp) {\n  LWIP_UNUSED_ARG(mtu);\n  /* pcb->mtu = mtu; -- set correctly with netif_set_mtu */\n\n  if (pcb->link_cb->send_config) {\n    pcb->link_cb->send_config(pcb, pcb->link_ctx_cb, accm, pcomp, accomp);\n  }\n\n  PPPDEBUG(LOG_INFO, (\"ppp_send_config[%d]\\n\", pcb->netif->num) );\n  return 0;\n}\n\n/*\n * ppp_recv_config - configure the receive-side characteristics of\n * the ppp interface.\n */\nint ppp_recv_config(ppp_pcb *pcb, int mru, u32_t accm, int pcomp, int accomp) {\n  LWIP_UNUSED_ARG(mru);\n\n  if (pcb->link_cb->recv_config) {\n    pcb->link_cb->recv_config(pcb, pcb->link_ctx_cb, accm, pcomp, accomp);\n  }\n\n  PPPDEBUG(LOG_INFO, (\"ppp_recv_config[%d]\\n\", pcb->netif->num));\n  return 0;\n}\n\n#if PPP_IPV4_SUPPORT\n/*\n * sifaddr - Config the interface IP addresses and netmask.\n */\nint sifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr, u32_t netmask) {\n  ip4_addr_t ip, nm, gw;\n\n  ip4_addr_set_u32(&ip, our_adr);\n  ip4_addr_set_u32(&nm, netmask);\n  ip4_addr_set_u32(&gw, his_adr);\n  netif_set_addr(pcb->netif, &ip, &nm, &gw);\n  return 1;\n}\n\n/********************************************************************\n *\n * cifaddr - Clear the interface IP addresses, and delete routes\n * through the interface if possible.\n */\nint cifaddr(ppp_pcb *pcb, u32_t our_adr, u32_t his_adr) {\n  LWIP_UNUSED_ARG(our_adr);\n  LWIP_UNUSED_ARG(his_adr);\n\n  netif_set_addr(pcb->netif, IP4_ADDR_ANY4, IP4_ADDR_BROADCAST, IP4_ADDR_ANY4);\n  return 1;\n}\n\n#if 0 /* UNUSED - PROXY ARP */\n/********************************************************************\n *\n * sifproxyarp - Make a proxy ARP entry for the peer.\n */\n\nint sifproxyarp(ppp_pcb *pcb, u32_t his_adr) {\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_UNUSED_ARG(his_adr);\n  return 0;\n}\n\n/********************************************************************\n *\n * cifproxyarp - Delete the proxy ARP entry for the peer.\n */\n\nint cifproxyarp(ppp_pcb *pcb, u32_t his_adr) {\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_UNUSED_ARG(his_adr);\n  return 0;\n}\n#endif /* UNUSED - PROXY ARP */\n\n#if LWIP_DNS\n/*\n * sdns - Config the DNS servers\n */\nint sdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) {\n  ip_addr_t ns;\n  LWIP_UNUSED_ARG(pcb);\n\n  ip_addr_set_ip4_u32(&ns, ns1);\n  dns_setserver(0, &ns);\n  ip_addr_set_ip4_u32(&ns, ns2);\n  dns_setserver(1, &ns);\n  return 1;\n}\n\n/********************************************************************\n *\n * cdns - Clear the DNS servers\n */\nint cdns(ppp_pcb *pcb, u32_t ns1, u32_t ns2) {\n  const ip_addr_t *nsa;\n  ip_addr_t nsb;\n  LWIP_UNUSED_ARG(pcb);\n\n  nsa = dns_getserver(0);\n  ip_addr_set_ip4_u32(&nsb, ns1);\n  if (ip_addr_cmp(nsa, &nsb)) {\n    dns_setserver(0, IP_ADDR_ANY);\n  }\n  nsa = dns_getserver(1);\n  ip_addr_set_ip4_u32(&nsb, ns2);\n  if (ip_addr_cmp(nsa, &nsb)) {\n    dns_setserver(1, IP_ADDR_ANY);\n  }\n  return 1;\n}\n#endif /* LWIP_DNS */\n\n#if VJ_SUPPORT\n/********************************************************************\n *\n * sifvjcomp - config tcp header compression\n */\nint sifvjcomp(ppp_pcb *pcb, int vjcomp, int cidcomp, int maxcid) {\n  pcb->vj_enabled = vjcomp;\n  pcb->vj_comp.compressSlot = cidcomp;\n  pcb->vj_comp.maxSlotIndex = maxcid;\n  PPPDEBUG(LOG_INFO, (\"sifvjcomp[%d]: VJ compress enable=%d slot=%d max slot=%d\\n\",\n            pcb->netif->num, vjcomp, cidcomp, maxcid));\n  return 0;\n}\n#endif /* VJ_SUPPORT */\n\n/*\n * sifup - Config the interface up and enable IP packets to pass.\n */\nint sifup(ppp_pcb *pcb) {\n  pcb->if4_up = 1;\n  pcb->err_code = PPPERR_NONE;\n  netif_set_link_up(pcb->netif);\n\n  PPPDEBUG(LOG_DEBUG, (\"sifup[%d]: err_code=%d\\n\", pcb->netif->num, pcb->err_code));\n  pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);\n  return 1;\n}\n\n/********************************************************************\n *\n * sifdown - Disable the indicated protocol and config the interface\n *           down if there are no remaining protocols.\n */\nint sifdown(ppp_pcb *pcb) {\n\n  pcb->if4_up = 0;\n\n  if (1\n#if PPP_IPV6_SUPPORT\n   /* set the interface down if IPv6 is down as well */\n   && !pcb->if6_up\n#endif /* PPP_IPV6_SUPPORT */\n  ) {\n    /* make sure the netif link callback is called */\n    netif_set_link_down(pcb->netif);\n  }\n  PPPDEBUG(LOG_DEBUG, (\"sifdown[%d]: err_code=%d\\n\", pcb->netif->num, pcb->err_code));\n  return 1;\n}\n\n/********************************************************************\n *\n * Return user specified netmask, modified by any mask we might determine\n * for address `addr' (in network byte order).\n * Here we scan through the system's list of interfaces, looking for\n * any non-point-to-point interfaces which might appear to be on the same\n * network as `addr'.  If we find any, we OR in their netmask to the\n * user-specified netmask.\n */\nu32_t get_mask(u32_t addr) {\n#if 0\n  u32_t mask, nmask;\n\n  addr = lwip_htonl(addr);\n  if (IP_CLASSA(addr)) { /* determine network mask for address class */\n    nmask = IP_CLASSA_NET;\n  } else if (IP_CLASSB(addr)) {\n    nmask = IP_CLASSB_NET;\n  } else {\n    nmask = IP_CLASSC_NET;\n  }\n\n  /* class D nets are disallowed by bad_ip_adrs */\n  mask = PP_HTONL(0xffffff00UL) | lwip_htonl(nmask);\n\n  /* XXX\n   * Scan through the system's network interfaces.\n   * Get each netmask and OR them into our mask.\n   */\n  /* return mask; */\n  return mask;\n#endif /* 0 */\n  LWIP_UNUSED_ARG(addr);\n  return IPADDR_BROADCAST;\n}\n#endif /* PPP_IPV4_SUPPORT */\n\n#if PPP_IPV6_SUPPORT\n#define IN6_LLADDR_FROM_EUI64(ip6, eui64) do {    \\\n  ip6.addr[0] = PP_HTONL(0xfe800000);             \\\n  ip6.addr[1] = 0;                                \\\n  eui64_copy(eui64, ip6.addr[2]);                 \\\n  } while (0)\n\n/********************************************************************\n *\n * sif6addr - Config the interface with an IPv6 link-local address\n */\nint sif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64) {\n  ip6_addr_t ip6;\n  LWIP_UNUSED_ARG(his_eui64);\n\n  IN6_LLADDR_FROM_EUI64(ip6, our_eui64);\n  netif_ip6_addr_set(pcb->netif, 0, &ip6);\n  netif_ip6_addr_set_state(pcb->netif, 0, IP6_ADDR_PREFERRED);\n  /* FIXME: should we add an IPv6 static neighbor using his_eui64 ? */\n  return 1;\n}\n\n/********************************************************************\n *\n * cif6addr - Remove IPv6 address from interface\n */\nint cif6addr(ppp_pcb *pcb, eui64_t our_eui64, eui64_t his_eui64) {\n  LWIP_UNUSED_ARG(our_eui64);\n  LWIP_UNUSED_ARG(his_eui64);\n\n  netif_ip6_addr_set(pcb->netif, 0, IP6_ADDR_ANY6);\n  netif_ip6_addr_set_state(pcb->netif, 0, IP6_ADDR_INVALID);\n  return 1;\n}\n\n/*\n * sif6up - Config the interface up and enable IPv6 packets to pass.\n */\nint sif6up(ppp_pcb *pcb) {\n\n  pcb->if6_up = 1;\n  pcb->err_code = PPPERR_NONE;\n  netif_set_link_up(pcb->netif);\n\n  PPPDEBUG(LOG_DEBUG, (\"sif6up[%d]: err_code=%d\\n\", pcb->netif->num, pcb->err_code));\n  pcb->link_status_cb(pcb, pcb->err_code, pcb->ctx_cb);\n  return 1;\n}\n\n/********************************************************************\n *\n * sif6down - Disable the indicated protocol and config the interface\n *            down if there are no remaining protocols.\n */\nint sif6down(ppp_pcb *pcb) {\n\n  pcb->if6_up = 0;\n\n  if (1\n#if PPP_IPV4_SUPPORT\n   /* set the interface down if IPv4 is down as well */\n   && !pcb->if4_up\n#endif /* PPP_IPV4_SUPPORT */\n  ) {\n    /* make sure the netif link callback is called */\n    netif_set_link_down(pcb->netif);\n  }\n  PPPDEBUG(LOG_DEBUG, (\"sif6down[%d]: err_code=%d\\n\", pcb->netif->num, pcb->err_code));\n  return 1;\n}\n#endif /* PPP_IPV6_SUPPORT */\n\n#if DEMAND_SUPPORT\n/*\n * sifnpmode - Set the mode for handling packets for a given NP.\n */\nint sifnpmode(ppp_pcb *pcb, int proto, enum NPmode mode) {\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_UNUSED_ARG(proto);\n  LWIP_UNUSED_ARG(mode);\n  return 0;\n}\n#endif /* DEMAND_SUPPORT */\n\n/*\n * netif_set_mtu - set the MTU on the PPP network interface.\n */\nvoid netif_set_mtu(ppp_pcb *pcb, int mtu) {\n\n  pcb->netif->mtu = mtu;\n  PPPDEBUG(LOG_INFO, (\"netif_set_mtu[%d]: mtu=%d\\n\", pcb->netif->num, mtu));\n}\n\n/*\n * netif_get_mtu - get PPP interface MTU\n */\nint netif_get_mtu(ppp_pcb *pcb) {\n\n  return pcb->netif->mtu;\n}\n\n#if CCP_SUPPORT\n#if 0 /* unused */\n/*\n * ccp_test - whether a given compression method is acceptable for use.\n */\nint\nccp_test(ppp_pcb *pcb, u_char *opt_ptr, int opt_len, int for_transmit)\n{\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_UNUSED_ARG(opt_ptr);\n  LWIP_UNUSED_ARG(opt_len);\n  LWIP_UNUSED_ARG(for_transmit);\n  return -1;\n}\n#endif /* unused */\n\n/*\n * ccp_set - inform about the current state of CCP.\n */\nvoid\nccp_set(ppp_pcb *pcb, u8_t isopen, u8_t isup, u8_t receive_method, u8_t transmit_method)\n{\n  LWIP_UNUSED_ARG(isopen);\n  LWIP_UNUSED_ARG(isup);\n  pcb->ccp_receive_method = receive_method;\n  pcb->ccp_transmit_method = transmit_method;\n  PPPDEBUG(LOG_DEBUG, (\"ccp_set[%d]: is_open=%d, is_up=%d, receive_method=%u, transmit_method=%u\\n\",\n           pcb->netif->num, isopen, isup, receive_method, transmit_method));\n}\n\nvoid\nccp_reset_comp(ppp_pcb *pcb)\n{\n  switch (pcb->ccp_transmit_method) {\n#if MPPE_SUPPORT\n  case CI_MPPE:\n    mppe_comp_reset(pcb, &pcb->mppe_comp);\n    break;\n#endif /* MPPE_SUPPORT */\n  default:\n    break;\n  }\n}\n\nvoid\nccp_reset_decomp(ppp_pcb *pcb)\n{\n  switch (pcb->ccp_receive_method) {\n#if MPPE_SUPPORT\n  case CI_MPPE:\n    mppe_decomp_reset(pcb, &pcb->mppe_decomp);\n    break;\n#endif /* MPPE_SUPPORT */\n  default:\n    break;\n  }\n}\n\n#if 0 /* unused */\n/*\n * ccp_fatal_error - returns 1 if decompression was disabled as a\n * result of an error detected after decompression of a packet,\n * 0 otherwise.  This is necessary because of patent nonsense.\n */\nint\nccp_fatal_error(ppp_pcb *pcb)\n{\n  LWIP_UNUSED_ARG(pcb);\n  return 1;\n}\n#endif /* unused */\n#endif /* CCP_SUPPORT */\n\n#if PPP_IDLETIMELIMIT\n/********************************************************************\n *\n * get_idle_time - return how long the link has been idle.\n */\nint get_idle_time(ppp_pcb *pcb, struct ppp_idle *ip) {\n  /* FIXME: add idle time support and make it optional */\n  LWIP_UNUSED_ARG(pcb);\n  LWIP_UNUSED_ARG(ip);\n  return 1;\n}\n#endif /* PPP_IDLETIMELIMIT */\n\n#if DEMAND_SUPPORT\n/********************************************************************\n *\n * get_loop_output - get outgoing packets from the ppp device,\n * and detect when we want to bring the real link up.\n * Return value is 1 if we need to bring up the link, 0 otherwise.\n */\nint get_loop_output(void) {\n  return 0;\n}\n#endif /* DEMAND_SUPPORT */\n\n#if PPP_PROTOCOLNAME\n/* List of protocol names, to make our messages a little more informative. */\nstruct protocol_list {\n  u_short proto;\n  const char *name;\n} const protocol_list[] = {\n  { 0x21, \"IP\" },\n  { 0x23, \"OSI Network Layer\" },\n  { 0x25, \"Xerox NS IDP\" },\n  { 0x27, \"DECnet Phase IV\" },\n  { 0x29, \"Appletalk\" },\n  { 0x2b, \"Novell IPX\" },\n  { 0x2d, \"VJ compressed TCP/IP\" },\n  { 0x2f, \"VJ uncompressed TCP/IP\" },\n  { 0x31, \"Bridging PDU\" },\n  { 0x33, \"Stream Protocol ST-II\" },\n  { 0x35, \"Banyan Vines\" },\n  { 0x39, \"AppleTalk EDDP\" },\n  { 0x3b, \"AppleTalk SmartBuffered\" },\n  { 0x3d, \"Multi-Link\" },\n  { 0x3f, \"NETBIOS Framing\" },\n  { 0x41, \"Cisco Systems\" },\n  { 0x43, \"Ascom Timeplex\" },\n  { 0x45, \"Fujitsu Link Backup and Load Balancing (LBLB)\" },\n  { 0x47, \"DCA Remote Lan\" },\n  { 0x49, \"Serial Data Transport Protocol (PPP-SDTP)\" },\n  { 0x4b, \"SNA over 802.2\" },\n  { 0x4d, \"SNA\" },\n  { 0x4f, \"IP6 Header Compression\" },\n  { 0x51, \"KNX Bridging Data\" },\n  { 0x53, \"Encryption\" },\n  { 0x55, \"Individual Link Encryption\" },\n  { 0x57, \"IPv6\" },\n  { 0x59, \"PPP Muxing\" },\n  { 0x5b, \"Vendor-Specific Network Protocol\" },\n  { 0x61, \"RTP IPHC Full Header\" },\n  { 0x63, \"RTP IPHC Compressed TCP\" },\n  { 0x65, \"RTP IPHC Compressed non-TCP\" },\n  { 0x67, \"RTP IPHC Compressed UDP 8\" },\n  { 0x69, \"RTP IPHC Compressed RTP 8\" },\n  { 0x6f, \"Stampede Bridging\" },\n  { 0x73, \"MP+\" },\n  { 0xc1, \"NTCITS IPI\" },\n  { 0xfb, \"single-link compression\" },\n  { 0xfd, \"Compressed Datagram\" },\n  { 0x0201, \"802.1d Hello Packets\" },\n  { 0x0203, \"IBM Source Routing BPDU\" },\n  { 0x0205, \"DEC LANBridge100 Spanning Tree\" },\n  { 0x0207, \"Cisco Discovery Protocol\" },\n  { 0x0209, \"Netcs Twin Routing\" },\n  { 0x020b, \"STP - Scheduled Transfer Protocol\" },\n  { 0x020d, \"EDP - Extreme Discovery Protocol\" },\n  { 0x0211, \"Optical Supervisory Channel Protocol\" },\n  { 0x0213, \"Optical Supervisory Channel Protocol\" },\n  { 0x0231, \"Luxcom\" },\n  { 0x0233, \"Sigma Network Systems\" },\n  { 0x0235, \"Apple Client Server Protocol\" },\n  { 0x0281, \"MPLS Unicast\" },\n  { 0x0283, \"MPLS Multicast\" },\n  { 0x0285, \"IEEE p1284.4 standard - data packets\" },\n  { 0x0287, \"ETSI TETRA Network Protocol Type 1\" },\n  { 0x0289, \"Multichannel Flow Treatment Protocol\" },\n  { 0x2063, \"RTP IPHC Compressed TCP No Delta\" },\n  { 0x2065, \"RTP IPHC Context State\" },\n  { 0x2067, \"RTP IPHC Compressed UDP 16\" },\n  { 0x2069, \"RTP IPHC Compressed RTP 16\" },\n  { 0x4001, \"Cray Communications Control Protocol\" },\n  { 0x4003, \"CDPD Mobile Network Registration Protocol\" },\n  { 0x4005, \"Expand accelerator protocol\" },\n  { 0x4007, \"ODSICP NCP\" },\n  { 0x4009, \"DOCSIS DLL\" },\n  { 0x400B, \"Cetacean Network Detection Protocol\" },\n  { 0x4021, \"Stacker LZS\" },\n  { 0x4023, \"RefTek Protocol\" },\n  { 0x4025, \"Fibre Channel\" },\n  { 0x4027, \"EMIT Protocols\" },\n  { 0x405b, \"Vendor-Specific Protocol (VSP)\" },\n  { 0x8021, \"Internet Protocol Control Protocol\" },\n  { 0x8023, \"OSI Network Layer Control Protocol\" },\n  { 0x8025, \"Xerox NS IDP Control Protocol\" },\n  { 0x8027, \"DECnet Phase IV Control Protocol\" },\n  { 0x8029, \"Appletalk Control Protocol\" },\n  { 0x802b, \"Novell IPX Control Protocol\" },\n  { 0x8031, \"Bridging NCP\" },\n  { 0x8033, \"Stream Protocol Control Protocol\" },\n  { 0x8035, \"Banyan Vines Control Protocol\" },\n  { 0x803d, \"Multi-Link Control Protocol\" },\n  { 0x803f, \"NETBIOS Framing Control Protocol\" },\n  { 0x8041, \"Cisco Systems Control Protocol\" },\n  { 0x8043, \"Ascom Timeplex\" },\n  { 0x8045, \"Fujitsu LBLB Control Protocol\" },\n  { 0x8047, \"DCA Remote Lan Network Control Protocol (RLNCP)\" },\n  { 0x8049, \"Serial Data Control Protocol (PPP-SDCP)\" },\n  { 0x804b, \"SNA over 802.2 Control Protocol\" },\n  { 0x804d, \"SNA Control Protocol\" },\n  { 0x804f, \"IP6 Header Compression Control Protocol\" },\n  { 0x8051, \"KNX Bridging Control Protocol\" },\n  { 0x8053, \"Encryption Control Protocol\" },\n  { 0x8055, \"Individual Link Encryption Control Protocol\" },\n  { 0x8057, \"IPv6 Control Protocol\" },\n  { 0x8059, \"PPP Muxing Control Protocol\" },\n  { 0x805b, \"Vendor-Specific Network Control Protocol (VSNCP)\" },\n  { 0x806f, \"Stampede Bridging Control Protocol\" },\n  { 0x8073, \"MP+ Control Protocol\" },\n  { 0x80c1, \"NTCITS IPI Control Protocol\" },\n  { 0x80fb, \"Single Link Compression Control Protocol\" },\n  { 0x80fd, \"Compression Control Protocol\" },\n  { 0x8207, \"Cisco Discovery Protocol Control\" },\n  { 0x8209, \"Netcs Twin Routing\" },\n  { 0x820b, \"STP - Control Protocol\" },\n  { 0x820d, \"EDPCP - Extreme Discovery Protocol Ctrl Prtcl\" },\n  { 0x8235, \"Apple Client Server Protocol Control\" },\n  { 0x8281, \"MPLSCP\" },\n  { 0x8285, \"IEEE p1284.4 standard - Protocol Control\" },\n  { 0x8287, \"ETSI TETRA TNP1 Control Protocol\" },\n  { 0x8289, \"Multichannel Flow Treatment Protocol\" },\n  { 0xc021, \"Link Control Protocol\" },\n  { 0xc023, \"Password Authentication Protocol\" },\n  { 0xc025, \"Link Quality Report\" },\n  { 0xc027, \"Shiva Password Authentication Protocol\" },\n  { 0xc029, \"CallBack Control Protocol (CBCP)\" },\n  { 0xc02b, \"BACP Bandwidth Allocation Control Protocol\" },\n  { 0xc02d, \"BAP\" },\n  { 0xc05b, \"Vendor-Specific Authentication Protocol (VSAP)\" },\n  { 0xc081, \"Container Control Protocol\" },\n  { 0xc223, \"Challenge Handshake Authentication Protocol\" },\n  { 0xc225, \"RSA Authentication Protocol\" },\n  { 0xc227, \"Extensible Authentication Protocol\" },\n  { 0xc229, \"Mitsubishi Security Info Exch Ptcl (SIEP)\" },\n  { 0xc26f, \"Stampede Bridging Authorization Protocol\" },\n  { 0xc281, \"Proprietary Authentication Protocol\" },\n  { 0xc283, \"Proprietary Authentication Protocol\" },\n  { 0xc481, \"Proprietary Node ID Authentication Protocol\" },\n  { 0, NULL },\n};\n\n/*\n * protocol_name - find a name for a PPP protocol.\n */\nconst char * protocol_name(int proto) {\n  const struct protocol_list *lp;\n\n  for (lp = protocol_list; lp->proto != 0; ++lp) {\n    if (proto == lp->proto) {\n      return lp->name;\n    }\n  }\n  return NULL;\n}\n#endif /* PPP_PROTOCOLNAME */\n\n#if PPP_STATS_SUPPORT\n\n/* ---- Note on PPP Stats support ----\n *\n * The one willing link stats support should add the get_ppp_stats()\n * to fetch statistics from lwIP.\n */\n\n/*\n * reset_link_stats - \"reset\" stats when link goes up.\n */\nvoid reset_link_stats(int u) {\n  if (!get_ppp_stats(u, &old_link_stats)) {\n    return;\n  }\n  gettimeofday(&start_time, NULL);\n}\n\n/*\n * update_link_stats - get stats at link termination.\n */\nvoid update_link_stats(int u) {\n  struct timeval now;\n  char numbuf[32];\n\n  if (!get_ppp_stats(u, &link_stats) || gettimeofday(&now, NULL) < 0) {\n    return;\n  }\n  link_connect_time = now.tv_sec - start_time.tv_sec;\n  link_stats_valid = 1;\n\n  link_stats.bytes_in  -= old_link_stats.bytes_in;\n  link_stats.bytes_out -= old_link_stats.bytes_out;\n  link_stats.pkts_in   -= old_link_stats.pkts_in;\n  link_stats.pkts_out  -= old_link_stats.pkts_out;\n}\n\nvoid print_link_stats() {\n  /*\n   * Print connect time and statistics.\n   */\n  if (link_stats_valid) {\n    int t = (link_connect_time + 5) / 6;    /* 1/10ths of minutes */\n    info(\"Connect time %d.%d minutes.\", t/10, t%10);\n    info(\"Sent %u bytes, received %u bytes.\", link_stats.bytes_out, link_stats.bytes_in);\n    link_stats_valid = 0;\n  }\n}\n#endif /* PPP_STATS_SUPPORT */\n\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/pppapi.c",
    "content": "/**\n * @file\n * Point To Point Protocol Sequential API module\n *\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n\n#if LWIP_PPP_API /* don't build if not configured for use in lwipopts.h */\n\n#include \"netif/ppp/pppapi.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n#include \"netif/ppp/pppoe.h\"\n#include \"netif/ppp/pppol2tp.h\"\n#include \"netif/ppp/pppos.h\"\n\n#if LWIP_MPU_COMPATIBLE\nLWIP_MEMPOOL_DECLARE(PPPAPI_MSG, MEMP_NUM_PPP_API_MSG, sizeof(struct pppapi_msg), \"PPPAPI_MSG\")\n#endif\n\n#define PPPAPI_VAR_REF(name)               API_VAR_REF(name)\n#define PPPAPI_VAR_DECLARE(name)           API_VAR_DECLARE(struct pppapi_msg, name)\n#define PPPAPI_VAR_ALLOC(name)             API_VAR_ALLOC_POOL(struct pppapi_msg, PPPAPI_MSG, name, ERR_MEM)\n#define PPPAPI_VAR_ALLOC_RETURN_NULL(name) API_VAR_ALLOC_POOL(struct pppapi_msg, PPPAPI_MSG, name, NULL)\n#define PPPAPI_VAR_FREE(name)              API_VAR_FREE_POOL(PPPAPI_MSG, name)\n\n/**\n * Call ppp_set_default() inside the tcpip_thread context.\n */\nstatic err_t\npppapi_do_ppp_set_default(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct pppapi_msg */\n  struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;\n  \n  ppp_set_default(msg->msg.ppp);\n  return ERR_OK;\n}\n\n/**\n * Call ppp_set_default() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n */\nerr_t\npppapi_set_default(ppp_pcb *pcb)\n{\n  err_t err;\n  PPPAPI_VAR_DECLARE(msg);\n  PPPAPI_VAR_ALLOC(msg);\n\n  PPPAPI_VAR_REF(msg).msg.ppp = pcb;\n  err = tcpip_api_call(pppapi_do_ppp_set_default, &PPPAPI_VAR_REF(msg).call);\n  PPPAPI_VAR_FREE(msg);\n  return err;\n}\n\n\n#if PPP_NOTIFY_PHASE\n/**\n * Call ppp_set_notify_phase_callback() inside the tcpip_thread context.\n */\nstatic err_t\npppapi_do_ppp_set_notify_phase_callback(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct pppapi_msg */\n   struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;\n\n  ppp_set_notify_phase_callback(msg->msg.ppp, msg->msg.msg.setnotifyphasecb.notify_phase_cb);\n  return ERR_OK;\n}\n\n/**\n * Call ppp_set_notify_phase_callback() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n */\nerr_t\npppapi_set_notify_phase_callback(ppp_pcb *pcb, ppp_notify_phase_cb_fn notify_phase_cb)\n{\n  err_t err;\n  PPPAPI_VAR_DECLARE(msg);\n  PPPAPI_VAR_ALLOC(msg);\n\n  PPPAPI_VAR_REF(msg).msg.ppp = pcb;\n  PPPAPI_VAR_REF(msg).msg.msg.setnotifyphasecb.notify_phase_cb = notify_phase_cb;\n  err = tcpip_api_call(pppapi_do_ppp_set_notify_phase_callback, &PPPAPI_VAR_REF(msg).call);\n  PPPAPI_VAR_FREE(msg);\n  return err;\n}\n#endif /* PPP_NOTIFY_PHASE */\n\n\n#if PPPOS_SUPPORT\n/**\n * Call pppos_create() inside the tcpip_thread context.\n */\nstatic err_t\npppapi_do_pppos_create(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct pppapi_msg */\n  struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;\n\n  msg->msg.ppp = pppos_create(msg->msg.msg.serialcreate.pppif, msg->msg.msg.serialcreate.output_cb,\n    msg->msg.msg.serialcreate.link_status_cb, msg->msg.msg.serialcreate.ctx_cb);\n  return ERR_OK;\n}\n\n/**\n * Call pppos_create() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n */\nppp_pcb*\npppapi_pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb,\n               ppp_link_status_cb_fn link_status_cb, void *ctx_cb)\n{\n  ppp_pcb* result;\n  PPPAPI_VAR_DECLARE(msg);\n  PPPAPI_VAR_ALLOC_RETURN_NULL(msg);\n\n  PPPAPI_VAR_REF(msg).msg.ppp = NULL;\n  PPPAPI_VAR_REF(msg).msg.msg.serialcreate.pppif = pppif;\n  PPPAPI_VAR_REF(msg).msg.msg.serialcreate.output_cb = output_cb;\n  PPPAPI_VAR_REF(msg).msg.msg.serialcreate.link_status_cb = link_status_cb;\n  PPPAPI_VAR_REF(msg).msg.msg.serialcreate.ctx_cb = ctx_cb;\n  tcpip_api_call(pppapi_do_pppos_create, &PPPAPI_VAR_REF(msg).call);\n  result = PPPAPI_VAR_REF(msg).msg.ppp;\n  PPPAPI_VAR_FREE(msg);\n  return result;\n}\n#endif /* PPPOS_SUPPORT */\n\n\n#if PPPOE_SUPPORT\n/**\n * Call pppoe_create() inside the tcpip_thread context.\n */\nstatic err_t\npppapi_do_pppoe_create(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct pppapi_msg */\n  struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;\n\n  msg->msg.ppp = pppoe_create(msg->msg.msg.ethernetcreate.pppif, msg->msg.msg.ethernetcreate.ethif,\n    msg->msg.msg.ethernetcreate.service_name, msg->msg.msg.ethernetcreate.concentrator_name,\n    msg->msg.msg.ethernetcreate.link_status_cb, msg->msg.msg.ethernetcreate.ctx_cb);\n  return ERR_OK;\n}\n\n/**\n * Call pppoe_create() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n */\nppp_pcb*\npppapi_pppoe_create(struct netif *pppif, struct netif *ethif, const char *service_name,\n                            const char *concentrator_name, ppp_link_status_cb_fn link_status_cb,\n                            void *ctx_cb)\n{\n  ppp_pcb* result;\n  PPPAPI_VAR_DECLARE(msg);\n  PPPAPI_VAR_ALLOC_RETURN_NULL(msg);\n\n  PPPAPI_VAR_REF(msg).msg.ppp = NULL;\n  PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.pppif = pppif;\n  PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.ethif = ethif;\n  PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.service_name = service_name;\n  PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.concentrator_name = concentrator_name;\n  PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.link_status_cb = link_status_cb;\n  PPPAPI_VAR_REF(msg).msg.msg.ethernetcreate.ctx_cb = ctx_cb;\n  tcpip_api_call(pppapi_do_pppoe_create, &PPPAPI_VAR_REF(msg).call);\n  result = PPPAPI_VAR_REF(msg).msg.ppp;\n  PPPAPI_VAR_FREE(msg);\n  return result;\n}\n#endif /* PPPOE_SUPPORT */\n\n\n#if PPPOL2TP_SUPPORT\n/**\n * Call pppol2tp_create() inside the tcpip_thread context.\n */\nstatic err_t\npppapi_do_pppol2tp_create(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct pppapi_msg */\n  struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;\n\n  msg->msg.ppp = pppol2tp_create(msg->msg.msg.l2tpcreate.pppif,\n    msg->msg.msg.l2tpcreate.netif, API_EXPR_REF(msg->msg.msg.l2tpcreate.ipaddr), msg->msg.msg.l2tpcreate.port,\n#if PPPOL2TP_AUTH_SUPPORT\n    msg->msg.msg.l2tpcreate.secret,\n    msg->msg.msg.l2tpcreate.secret_len,\n#else /* PPPOL2TP_AUTH_SUPPORT */\n    NULL,\n    0,\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n    msg->msg.msg.l2tpcreate.link_status_cb, msg->msg.msg.l2tpcreate.ctx_cb);\n  return ERR_OK;\n}\n\n/**\n * Call pppol2tp_create() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n */\nppp_pcb*\npppapi_pppol2tp_create(struct netif *pppif, struct netif *netif, ip_addr_t *ipaddr, u16_t port,\n                        const u8_t *secret, u8_t secret_len,\n                        ppp_link_status_cb_fn link_status_cb, void *ctx_cb)\n{\n  ppp_pcb* result;\n  PPPAPI_VAR_DECLARE(msg);\n  PPPAPI_VAR_ALLOC_RETURN_NULL(msg);\n#if !PPPOL2TP_AUTH_SUPPORT\n  LWIP_UNUSED_ARG(secret);\n  LWIP_UNUSED_ARG(secret_len);\n#endif /* !PPPOL2TP_AUTH_SUPPORT */\n\n  PPPAPI_VAR_REF(msg).msg.ppp = NULL;\n  PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.pppif = pppif;\n  PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.netif = netif;\n  PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.ipaddr = PPPAPI_VAR_REF(ipaddr);\n  PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.port = port;\n#if PPPOL2TP_AUTH_SUPPORT\n  PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.secret = secret;\n  PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.secret_len = secret_len;\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n  PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.link_status_cb = link_status_cb;\n  PPPAPI_VAR_REF(msg).msg.msg.l2tpcreate.ctx_cb = ctx_cb;\n  tcpip_api_call(pppapi_do_pppol2tp_create, &PPPAPI_VAR_REF(msg).call);\n  result = PPPAPI_VAR_REF(msg).msg.ppp;\n  PPPAPI_VAR_FREE(msg);\n  return result;\n}\n#endif /* PPPOL2TP_SUPPORT */\n\n\n/**\n * Call ppp_connect() inside the tcpip_thread context.\n */\nstatic err_t\npppapi_do_ppp_connect(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct pppapi_msg */\n  struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;\n\n  return ppp_connect(msg->msg.ppp, msg->msg.msg.connect.holdoff);\n}\n\n/**\n * Call ppp_connect() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n */\nerr_t\npppapi_connect(ppp_pcb *pcb, u16_t holdoff)\n{\n  err_t err;\n  PPPAPI_VAR_DECLARE(msg);\n  PPPAPI_VAR_ALLOC(msg);\n\n  PPPAPI_VAR_REF(msg).msg.ppp = pcb;\n  PPPAPI_VAR_REF(msg).msg.msg.connect.holdoff = holdoff;\n  err = tcpip_api_call(pppapi_do_ppp_connect, &PPPAPI_VAR_REF(msg).call);\n  PPPAPI_VAR_FREE(msg);\n  return err;\n}\n\n\n#if PPP_SERVER\n/**\n * Call ppp_listen() inside the tcpip_thread context.\n */\nstatic err_t\npppapi_do_ppp_listen(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct pppapi_msg */\n  struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;\n\n  return ppp_listen(msg->msg.ppp);\n}\n\n/**\n * Call ppp_listen() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n */\nerr_t\npppapi_listen(ppp_pcb *pcb)\n{\n  err_t err;\n  PPPAPI_VAR_DECLARE(msg);\n  PPPAPI_VAR_ALLOC(msg);\n\n  PPPAPI_VAR_REF(msg).msg.ppp = pcb;\n  err = tcpip_api_call(pppapi_do_ppp_listen, &PPPAPI_VAR_REF(msg).call);\n  PPPAPI_VAR_FREE(msg);\n  return err;\n}\n#endif /* PPP_SERVER */\n\n\n/**\n * Call ppp_close() inside the tcpip_thread context.\n */\nstatic err_t\npppapi_do_ppp_close(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct pppapi_msg */\n  struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;\n\n  return ppp_close(msg->msg.ppp, msg->msg.msg.close.nocarrier);\n}\n\n/**\n * Call ppp_close() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n */\nerr_t\npppapi_close(ppp_pcb *pcb, u8_t nocarrier)\n{\n  err_t err;\n  PPPAPI_VAR_DECLARE(msg);\n  PPPAPI_VAR_ALLOC(msg);\n\n  PPPAPI_VAR_REF(msg).msg.ppp = pcb;\n  PPPAPI_VAR_REF(msg).msg.msg.close.nocarrier = nocarrier;\n  err = tcpip_api_call(pppapi_do_ppp_close, &PPPAPI_VAR_REF(msg).call);\n  PPPAPI_VAR_FREE(msg);\n  return err;\n}\n\n\n/**\n * Call ppp_free() inside the tcpip_thread context.\n */\nstatic err_t\npppapi_do_ppp_free(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct pppapi_msg */\n  struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;\n\n  return ppp_free(msg->msg.ppp);\n}\n\n/**\n * Call ppp_free() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n */\nerr_t\npppapi_free(ppp_pcb *pcb)\n{\n  err_t err;\n  PPPAPI_VAR_DECLARE(msg);\n  PPPAPI_VAR_ALLOC(msg);\n\n  PPPAPI_VAR_REF(msg).msg.ppp = pcb;\n  err = tcpip_api_call(pppapi_do_ppp_free, &PPPAPI_VAR_REF(msg).call);\n  PPPAPI_VAR_FREE(msg);\n  return err;\n}\n\n\n/**\n * Call ppp_ioctl() inside the tcpip_thread context.\n */\nstatic err_t\npppapi_do_ppp_ioctl(struct tcpip_api_call_data *m)\n{\n  /* cast through void* to silence alignment warnings. \n   * We know it works because the structs have been instantiated as struct pppapi_msg */\n  struct pppapi_msg *msg = (struct pppapi_msg *)(void*)m;\n\n  return ppp_ioctl(msg->msg.ppp, msg->msg.msg.ioctl.cmd, msg->msg.msg.ioctl.arg);\n}\n\n/**\n * Call ppp_ioctl() in a thread-safe way by running that function inside the\n * tcpip_thread context.\n */\nerr_t\npppapi_ioctl(ppp_pcb *pcb, u8_t cmd, void *arg)\n{\n  err_t err;\n  PPPAPI_VAR_DECLARE(msg);\n  PPPAPI_VAR_ALLOC(msg);\n\n  PPPAPI_VAR_REF(msg).msg.ppp = pcb;\n  PPPAPI_VAR_REF(msg).msg.msg.ioctl.cmd = cmd;\n  PPPAPI_VAR_REF(msg).msg.msg.ioctl.arg = arg;\n  err = tcpip_api_call(pppapi_do_ppp_ioctl, &PPPAPI_VAR_REF(msg).call);\n  PPPAPI_VAR_FREE(msg);\n  return err;\n}\n\n#endif /* LWIP_PPP_API */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/pppcrypt.c",
    "content": "/*\n * pppcrypt.c - PPP/DES linkage for MS-CHAP and EAP SRP-SHA1\n *\n * Extracted from chap_ms.c by James Carlson.\n *\n * Copyright (c) 1995 Eric Rosenquist.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && MSCHAP_SUPPORT /* don't build if not necessary */\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/pppcrypt.h\"\n\n\nstatic u_char pppcrypt_get_7bits(u_char *input, int startBit) {\n    unsigned int word;\n\n    word  = (unsigned)input[startBit / 8] << 8;\n    word |= (unsigned)input[startBit / 8 + 1];\n\n    word >>= 15 - (startBit % 8 + 7);\n\n    return word & 0xFE;\n}\n\n/* IN  56 bit DES key missing parity bits\n * OUT 64 bit DES key with parity bits added\n */\nvoid pppcrypt_56_to_64_bit_key(u_char *key, u_char * des_key) {\n    des_key[0] = pppcrypt_get_7bits(key,  0);\n    des_key[1] = pppcrypt_get_7bits(key,  7);\n    des_key[2] = pppcrypt_get_7bits(key, 14);\n    des_key[3] = pppcrypt_get_7bits(key, 21);\n    des_key[4] = pppcrypt_get_7bits(key, 28);\n    des_key[5] = pppcrypt_get_7bits(key, 35);\n    des_key[6] = pppcrypt_get_7bits(key, 42);\n    des_key[7] = pppcrypt_get_7bits(key, 49);\n}\n\n#endif /* PPP_SUPPORT && MSCHAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/pppoe.c",
    "content": "/*****************************************************************************\n* pppoe.c - PPP Over Ethernet implementation for lwIP.\n*\n* Copyright (c) 2006 by Marc Boucher, Services Informatiques (MBSI) inc.\n*\n* The authors hereby grant permission to use, copy, modify, distribute,\n* and license this software and its documentation for any purpose, provided\n* that existing copyright notices are retained in all copies and that this\n* notice and the following disclaimer are included verbatim in any \n* distributions. No written agreement, license, or royalty fee is required\n* for any of the authorized uses.\n*\n* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR\n* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \n* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n******************************************************************************\n* REVISION HISTORY\n*\n* 06-01-01 Marc Boucher <marc@mbsi.ca>\n*   Ported to lwIP.\n*****************************************************************************/\n\n\n\n/* based on NetBSD: if_pppoe.c,v 1.64 2006/01/31 23:50:15 martin Exp */\n\n/*-\n * Copyright (c) 2002 The NetBSD Foundation, Inc.\n * All rights reserved.\n *\n * This code is derived from software contributed to The NetBSD Foundation\n * by Martin Husemann <martin@NetBSD.org>.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. All advertising materials mentioning features or use of this software\n *    must display the following acknowledgement:\n *        This product includes software developed by the NetBSD\n *        Foundation, Inc. and its contributors.\n * 4. Neither the name of The NetBSD Foundation nor the names of its\n *    contributors may be used to endorse or promote products derived\n *    from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS\n * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPPOE_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#if 0 /* UNUSED */\n#include <string.h>\n#include <stdio.h>\n#endif /* UNUSED */\n\n#include \"lwip/timeouts.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/snmp.h\"\n\n#include \"netif/ethernet.h\"\n#include \"netif/ppp/ppp_impl.h\"\n#include \"netif/ppp/lcp.h\"\n#include \"netif/ppp/ipcp.h\"\n#include \"netif/ppp/pppoe.h\"\n\n/* Memory pool */\nLWIP_MEMPOOL_DECLARE(PPPOE_IF, MEMP_NUM_PPPOE_INTERFACES, sizeof(struct pppoe_softc), \"PPPOE_IF\")\n\n/* Add a 16 bit unsigned value to a buffer pointed to by PTR */\n#define PPPOE_ADD_16(PTR, VAL) \\\n    *(PTR)++ = (u8_t)((VAL) / 256);    \\\n    *(PTR)++ = (u8_t)((VAL) % 256)\n\n/* Add a complete PPPoE header to the buffer pointed to by PTR */\n#define PPPOE_ADD_HEADER(PTR, CODE, SESS, LEN)  \\\n    *(PTR)++ = PPPOE_VERTYPE;  \\\n    *(PTR)++ = (CODE);         \\\n    PPPOE_ADD_16(PTR, SESS);   \\\n    PPPOE_ADD_16(PTR, LEN)\n\n#define PPPOE_DISC_TIMEOUT (5*1000)  /* base for quick timeout calculation */\n#define PPPOE_SLOW_RETRY   (60*1000) /* persistent retry interval */\n#define PPPOE_DISC_MAXPADI  4        /* retry PADI four times (quickly) */\n#define PPPOE_DISC_MAXPADR  2        /* retry PADR twice */\n\n#ifdef PPPOE_SERVER\n#error \"PPPOE_SERVER is not yet supported under lwIP!\"\n/* from if_spppsubr.c */\n#define IFF_PASSIVE IFF_LINK0 /* wait passively for connection */\n#endif\n\n#define PPPOE_ERRORSTRING_LEN     64\n\n\n/* callbacks called from PPP core */\nstatic err_t pppoe_write(ppp_pcb *ppp, void *ctx, struct pbuf *p);\nstatic err_t pppoe_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol);\nstatic void pppoe_connect(ppp_pcb *ppp, void *ctx);\nstatic void pppoe_disconnect(ppp_pcb *ppp, void *ctx);\nstatic err_t pppoe_destroy(ppp_pcb *ppp, void *ctx);\n\n/* management routines */\nstatic void pppoe_abort_connect(struct pppoe_softc *);\n#if 0 /* UNUSED */\nstatic void pppoe_clear_softc(struct pppoe_softc *, const char *);\n#endif /* UNUSED */\n\n/* internal timeout handling */\nstatic void pppoe_timeout(void *);\n\n/* sending actual protocol controll packets */\nstatic err_t pppoe_send_padi(struct pppoe_softc *);\nstatic err_t pppoe_send_padr(struct pppoe_softc *);\n#ifdef PPPOE_SERVER\nstatic err_t pppoe_send_pado(struct pppoe_softc *);\nstatic err_t pppoe_send_pads(struct pppoe_softc *);\n#endif\nstatic err_t pppoe_send_padt(struct netif *, u_int, const u8_t *);\n\n/* internal helper functions */\nstatic err_t pppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb);\nstatic struct pppoe_softc* pppoe_find_softc_by_session(u_int session, struct netif *rcvif);\nstatic struct pppoe_softc* pppoe_find_softc_by_hunique(u8_t *token, size_t len, struct netif *rcvif);\n\n/** linked list of created pppoe interfaces */\nstatic struct pppoe_softc *pppoe_softc_list;\n\n/* Callbacks structure for PPP core */\nstatic const struct link_callbacks pppoe_callbacks = {\n  pppoe_connect,\n#if PPP_SERVER\n  NULL,\n#endif /* PPP_SERVER */\n  pppoe_disconnect,\n  pppoe_destroy,\n  pppoe_write,\n  pppoe_netif_output,\n  NULL,\n  NULL\n};\n\n/*\n * Create a new PPP Over Ethernet (PPPoE) connection.\n *\n * Return 0 on success, an error code on failure.\n */\nppp_pcb *pppoe_create(struct netif *pppif,\n       struct netif *ethif,\n       const char *service_name, const char *concentrator_name,\n       ppp_link_status_cb_fn link_status_cb, void *ctx_cb)\n{\n  ppp_pcb *ppp;\n  struct pppoe_softc *sc;\n  LWIP_UNUSED_ARG(service_name);\n  LWIP_UNUSED_ARG(concentrator_name);\n\n  sc = (struct pppoe_softc *)LWIP_MEMPOOL_ALLOC(PPPOE_IF);\n  if (sc == NULL) {\n    return NULL;\n  }\n\n  ppp = ppp_new(pppif, &pppoe_callbacks, sc, link_status_cb, ctx_cb);\n  if (ppp == NULL) {\n    LWIP_MEMPOOL_FREE(PPPOE_IF, sc);\n    return NULL;\n  }\n\n  memset(sc, 0, sizeof(struct pppoe_softc));\n  sc->pcb = ppp;\n  sc->sc_ethif = ethif;\n  /* put the new interface at the head of the list */\n  sc->next = pppoe_softc_list;\n  pppoe_softc_list = sc;\n  return ppp;\n}\n\n/* Called by PPP core */\nstatic err_t pppoe_write(ppp_pcb *ppp, void *ctx, struct pbuf *p) {\n  struct pppoe_softc *sc = (struct pppoe_softc *)ctx;\n  struct pbuf *ph; /* Ethernet + PPPoE header */\n  err_t ret;\n#if MIB2_STATS\n  u16_t tot_len;\n#else /* MIB2_STATS */\n  LWIP_UNUSED_ARG(ppp);\n#endif /* MIB2_STATS */\n\n  /* skip address & flags */\n  pbuf_header(p, -(s16_t)2);\n\n  ph = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN), PBUF_RAM);\n  if(!ph) {\n    LINK_STATS_INC(link.memerr);\n    LINK_STATS_INC(link.proterr);\n    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n    pbuf_free(p);\n    return ERR_MEM;\n  }\n\n  pbuf_header(ph, -(s16_t)PPPOE_HEADERLEN); /* hide PPPoE header */\n  pbuf_cat(ph, p);\n#if MIB2_STATS\n  tot_len = ph->tot_len;\n#endif /* MIB2_STATS */\n\n  ret = pppoe_xmit(sc, ph);\n  if (ret != ERR_OK) {\n    LINK_STATS_INC(link.err);\n    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n    return ret;\n  }\n\n  MIB2_STATS_NETIF_ADD(ppp->netif, ifoutoctets, (u16_t)tot_len);\n  MIB2_STATS_NETIF_INC(ppp->netif, ifoutucastpkts);\n  LINK_STATS_INC(link.xmit);\n  return ERR_OK;\n}\n\n/* Called by PPP core */\nstatic err_t pppoe_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol) {\n  struct pppoe_softc *sc = (struct pppoe_softc *)ctx;\n  struct pbuf *pb;\n  u8_t *pl;\n  err_t err;\n#if MIB2_STATS\n  u16_t tot_len;\n#else /* MIB2_STATS */\n  LWIP_UNUSED_ARG(ppp);\n#endif /* MIB2_STATS */\n\n  /* @todo: try to use pbuf_header() here! */\n  pb = pbuf_alloc(PBUF_LINK, PPPOE_HEADERLEN + sizeof(protocol), PBUF_RAM);\n  if(!pb) {\n    LINK_STATS_INC(link.memerr);\n    LINK_STATS_INC(link.proterr);\n    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n    return ERR_MEM;\n  }\n\n  pbuf_header(pb, -(s16_t)PPPOE_HEADERLEN);\n\n  pl = (u8_t*)pb->payload;\n  PUTSHORT(protocol, pl);\n\n  pbuf_chain(pb, p);\n#if MIB2_STATS\n  tot_len = pb->tot_len;\n#endif /* MIB2_STATS */\n\n  if( (err = pppoe_xmit(sc, pb)) != ERR_OK) {\n    LINK_STATS_INC(link.err);\n    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n    return err;\n  }\n\n  MIB2_STATS_NETIF_ADD(ppp->netif, ifoutoctets, tot_len);\n  MIB2_STATS_NETIF_INC(ppp->netif, ifoutucastpkts);\n  LINK_STATS_INC(link.xmit);\n  return ERR_OK;\n}\n\nstatic err_t\npppoe_destroy(ppp_pcb *ppp, void *ctx)\n{\n  struct pppoe_softc *sc = (struct pppoe_softc *)ctx;\n  struct pppoe_softc **copp, *freep;\n  LWIP_UNUSED_ARG(ppp);\n\n  sys_untimeout(pppoe_timeout, sc);\n\n  /* remove interface from list */\n  for (copp = &pppoe_softc_list; (freep = *copp); copp = &freep->next) {\n    if (freep == sc) {\n       *copp = freep->next;\n       break;\n    }\n  }\n\n#ifdef PPPOE_TODO\n  if (sc->sc_concentrator_name) {\n    mem_free(sc->sc_concentrator_name);\n  }\n  if (sc->sc_service_name) {\n    mem_free(sc->sc_service_name);\n  }\n#endif /* PPPOE_TODO */\n  LWIP_MEMPOOL_FREE(PPPOE_IF, sc);\n\n  return ERR_OK;\n}\n\n/*\n * Find the interface handling the specified session.\n * Note: O(number of sessions open), this is a client-side only, mean\n * and lean implementation, so number of open sessions typically should\n * be 1.\n */\nstatic struct pppoe_softc* pppoe_find_softc_by_session(u_int session, struct netif *rcvif) {\n  struct pppoe_softc *sc;\n\n  for (sc = pppoe_softc_list; sc != NULL; sc = sc->next) {\n    if (sc->sc_state == PPPOE_STATE_SESSION\n        && sc->sc_session == session\n         && sc->sc_ethif == rcvif) {\n           return sc;\n      }\n  }\n  return NULL;\n}\n\n/* Check host unique token passed and return appropriate softc pointer,\n * or NULL if token is bogus. */\nstatic struct pppoe_softc* pppoe_find_softc_by_hunique(u8_t *token, size_t len, struct netif *rcvif) {\n  struct pppoe_softc *sc, *t;\n\n  if (len != sizeof sc) {\n    return NULL;\n  }\n  MEMCPY(&t, token, len);\n\n  for (sc = pppoe_softc_list; sc != NULL; sc = sc->next) {\n    if (sc == t) {\n      break;\n    }\n  }\n\n  if (sc == NULL) {\n    PPPDEBUG(LOG_DEBUG, (\"pppoe: alien host unique tag, no session found\\n\"));\n    return NULL;\n  }\n\n  /* should be safe to access *sc now */\n  if (sc->sc_state < PPPOE_STATE_PADI_SENT || sc->sc_state >= PPPOE_STATE_SESSION) {\n    PPPDEBUG(LOG_DEBUG, (\"%c%c%\"U16_F\": host unique tag found, but it belongs to a connection in state %d\\n\",\n      sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, sc->sc_state));\n    return NULL;\n  }\n  if (sc->sc_ethif != rcvif) {\n    PPPDEBUG(LOG_DEBUG, (\"%c%c%\"U16_F\": wrong interface, not accepting host unique\\n\",\n      sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));\n    return NULL;\n  }\n  return sc;\n}\n\n/* analyze and handle a single received packet while not in session state */\nvoid\npppoe_disc_input(struct netif *netif, struct pbuf *pb)\n{\n  u16_t tag, len;\n  u16_t session, plen;\n  struct pppoe_softc *sc;\n#if PPP_DEBUG\n  const char *err_msg = NULL;\n#endif /* PPP_DEBUG */\n  u8_t *ac_cookie;\n  u16_t ac_cookie_len;\n#ifdef PPPOE_SERVER\n  u8_t *hunique;\n  size_t hunique_len;\n#endif\n  struct pppoehdr *ph;\n  struct pppoetag pt;\n  int off, err;\n  struct eth_hdr *ethhdr;\n\n  /* don't do anything if there is not a single PPPoE instance */\n  if (pppoe_softc_list == NULL) {\n    pbuf_free(pb);\n    return;\n  }\n\n  pb = ppp_singlebuf(pb);\n\n  if (pb->len < sizeof(*ethhdr)) {\n    goto done;\n  }\n  ethhdr = (struct eth_hdr *)pb->payload;\n  off = sizeof(*ethhdr);\n\n  ac_cookie = NULL;\n  ac_cookie_len = 0;\n#ifdef PPPOE_SERVER\n  hunique = NULL;\n  hunique_len = 0;\n#endif\n  session = 0;\n  if (pb->len - off < (u16_t)PPPOE_HEADERLEN) {\n    PPPDEBUG(LOG_DEBUG, (\"pppoe: packet too short: %d\\n\", pb->len));\n    goto done;\n  }\n\n  ph = (struct pppoehdr *) (ethhdr + 1);\n  if (ph->vertype != PPPOE_VERTYPE) {\n    PPPDEBUG(LOG_DEBUG, (\"pppoe: unknown version/type packet: 0x%x\\n\", ph->vertype));\n    goto done;\n  }\n  session = lwip_ntohs(ph->session);\n  plen = lwip_ntohs(ph->plen);\n  off += sizeof(*ph);\n\n  if (plen + off > pb->len) {\n    PPPDEBUG(LOG_DEBUG, (\"pppoe: packet content does not fit: data available = %d, packet size = %u\\n\",\n        pb->len - off, plen));\n    goto done;\n  }\n  if(pb->tot_len == pb->len) {\n    pb->tot_len = pb->len = (u16_t)off + plen; /* ignore trailing garbage */\n  }\n  tag = 0;\n  len = 0;\n  sc = NULL;\n  while (off + sizeof(pt) <= pb->len) {\n    MEMCPY(&pt, (u8_t*)pb->payload + off, sizeof(pt));\n    tag = lwip_ntohs(pt.tag);\n    len = lwip_ntohs(pt.len);\n    if (off + sizeof(pt) + len > pb->len) {\n      PPPDEBUG(LOG_DEBUG, (\"pppoe: tag 0x%x len 0x%x is too long\\n\", tag, len));\n      goto done;\n    }\n    switch (tag) {\n      case PPPOE_TAG_EOL:\n        goto breakbreak;\n      case PPPOE_TAG_SNAME:\n        break;  /* ignored */\n      case PPPOE_TAG_ACNAME:\n        break;  /* ignored */\n      case PPPOE_TAG_HUNIQUE:\n        if (sc != NULL) {\n          break;\n        }\n#ifdef PPPOE_SERVER\n        hunique = (u8_t*)pb->payload + off + sizeof(pt);\n        hunique_len = len;\n#endif\n        sc = pppoe_find_softc_by_hunique((u8_t*)pb->payload + off + sizeof(pt), len, netif);\n        break;\n      case PPPOE_TAG_ACCOOKIE:\n        if (ac_cookie == NULL) {\n          if (len > PPPOE_MAX_AC_COOKIE_LEN) {\n            PPPDEBUG(LOG_DEBUG, (\"pppoe: AC cookie is too long: len = %d, max = %d\\n\", len, PPPOE_MAX_AC_COOKIE_LEN));\n            goto done;\n          }\n          ac_cookie = (u8_t*)pb->payload + off + sizeof(pt);\n          ac_cookie_len = len;\n        }\n        break;\n#if PPP_DEBUG\n      case PPPOE_TAG_SNAME_ERR:\n        err_msg = \"SERVICE NAME ERROR\";\n        break;\n      case PPPOE_TAG_ACSYS_ERR:\n        err_msg = \"AC SYSTEM ERROR\";\n        break;\n      case PPPOE_TAG_GENERIC_ERR:\n        err_msg = \"GENERIC ERROR\";\n        break;\n#endif /* PPP_DEBUG */\n      default:\n        break;\n    }\n#if PPP_DEBUG\n    if (err_msg != NULL) {\n      char error_tmp[PPPOE_ERRORSTRING_LEN];\n      u16_t error_len = LWIP_MIN(len, sizeof(error_tmp)-1);\n      strncpy(error_tmp, (char*)pb->payload + off + sizeof(pt), error_len);\n      error_tmp[error_len] = '\\0';\n      if (sc) {\n        PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\": %s: %s\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err_msg, error_tmp));\n      } else {\n        PPPDEBUG(LOG_DEBUG, (\"pppoe: %s: %s\\n\", err_msg, error_tmp));\n      }\n    }\n#endif /* PPP_DEBUG */\n    off += sizeof(pt) + len;\n  }\n\nbreakbreak:;\n  switch (ph->code) {\n    case PPPOE_CODE_PADI:\n#ifdef PPPOE_SERVER\n      /*\n       * got service name, concentrator name, and/or host unique.\n       * ignore if we have no interfaces with IFF_PASSIVE|IFF_UP.\n       */\n      if (LIST_EMPTY(&pppoe_softc_list)) {\n        goto done;\n      }\n      LIST_FOREACH(sc, &pppoe_softc_list, sc_list) {\n        if (!(sc->sc_sppp.pp_if.if_flags & IFF_UP)) {\n          continue;\n        }\n        if (!(sc->sc_sppp.pp_if.if_flags & IFF_PASSIVE)) {\n          continue;\n        }\n        if (sc->sc_state == PPPOE_STATE_INITIAL) {\n          break;\n        }\n      }\n      if (sc == NULL) {\n        /* PPPDEBUG(LOG_DEBUG, (\"pppoe: free passive interface is not found\\n\")); */\n        goto done;\n      }\n      if (hunique) {\n        if (sc->sc_hunique) {\n          mem_free(sc->sc_hunique);\n        }\n        sc->sc_hunique = mem_malloc(hunique_len);\n        if (sc->sc_hunique == NULL) {\n          goto done;\n        }\n        sc->sc_hunique_len = hunique_len;\n        MEMCPY(sc->sc_hunique, hunique, hunique_len);\n      }\n      MEMCPY(&sc->sc_dest, eh->ether_shost, sizeof sc->sc_dest);\n      sc->sc_state = PPPOE_STATE_PADO_SENT;\n      pppoe_send_pado(sc);\n      break;\n#endif /* PPPOE_SERVER */\n    case PPPOE_CODE_PADR:\n#ifdef PPPOE_SERVER\n      /*\n       * get sc from ac_cookie if IFF_PASSIVE\n       */\n      if (ac_cookie == NULL) {\n        /* be quiet if there is not a single pppoe instance */\n        PPPDEBUG(LOG_DEBUG, (\"pppoe: received PADR but not includes ac_cookie\\n\"));\n        goto done;\n      }\n      sc = pppoe_find_softc_by_hunique(ac_cookie, ac_cookie_len, netif);\n      if (sc == NULL) {\n        /* be quiet if there is not a single pppoe instance */\n        if (!LIST_EMPTY(&pppoe_softc_list)) {\n          PPPDEBUG(LOG_DEBUG, (\"pppoe: received PADR but could not find request for it\\n\"));\n        }\n        goto done;\n      }\n      if (sc->sc_state != PPPOE_STATE_PADO_SENT) {\n        PPPDEBUG(LOG_DEBUG, (\"%c%c%\"U16_F\": received unexpected PADR\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));\n        goto done;\n      }\n      if (hunique) {\n        if (sc->sc_hunique) {\n          mem_free(sc->sc_hunique);\n        }\n        sc->sc_hunique = mem_malloc(hunique_len);\n        if (sc->sc_hunique == NULL) {\n          goto done;\n        }\n        sc->sc_hunique_len = hunique_len;\n        MEMCPY(sc->sc_hunique, hunique, hunique_len);\n      }\n      pppoe_send_pads(sc);\n      sc->sc_state = PPPOE_STATE_SESSION;\n      ppp_start(sc->pcb); /* notify upper layers */\n      break;\n#else\n      /* ignore, we are no access concentrator */\n      goto done;\n#endif /* PPPOE_SERVER */\n    case PPPOE_CODE_PADO:\n      if (sc == NULL) {\n        /* be quiet if there is not a single pppoe instance */\n        if (pppoe_softc_list != NULL) {\n          PPPDEBUG(LOG_DEBUG, (\"pppoe: received PADO but could not find request for it\\n\"));\n        }\n        goto done;\n      }\n      if (sc->sc_state != PPPOE_STATE_PADI_SENT) {\n        PPPDEBUG(LOG_DEBUG, (\"%c%c%\"U16_F\": received unexpected PADO\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));\n        goto done;\n      }\n      if (ac_cookie) {\n        sc->sc_ac_cookie_len = ac_cookie_len;\n        MEMCPY(sc->sc_ac_cookie, ac_cookie, ac_cookie_len);\n      }\n      MEMCPY(&sc->sc_dest, ethhdr->src.addr, sizeof(sc->sc_dest.addr));\n      sys_untimeout(pppoe_timeout, sc);\n      sc->sc_padr_retried = 0;\n      sc->sc_state = PPPOE_STATE_PADR_SENT;\n      if ((err = pppoe_send_padr(sc)) != 0) {\n        PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\": failed to send PADR, error=%d\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err));\n      }\n      sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried), pppoe_timeout, sc);\n      break;\n    case PPPOE_CODE_PADS:\n      if (sc == NULL) {\n        goto done;\n      }\n      sc->sc_session = session;\n      sys_untimeout(pppoe_timeout, sc);\n      PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\": session 0x%x connected\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, session));\n      sc->sc_state = PPPOE_STATE_SESSION;\n      ppp_start(sc->pcb); /* notify upper layers */\n      break;\n    case PPPOE_CODE_PADT:\n      /* Don't disconnect here, we let the LCP Echo/Reply find the fact\n       * that PPP session is down. Asking the PPP stack to end the session\n       * require strict checking about the PPP phase to prevent endless\n       * disconnection loops.\n       */\n#if 0 /* UNUSED */\n      if (sc == NULL) { /* PADT frames are rarely sent with a hunique tag, this is actually almost always true */\n        goto done;\n      }\n      pppoe_clear_softc(sc, \"received PADT\");\n#endif /* UNUSED */\n      break;\n    default:\n      if(sc) {\n        PPPDEBUG(LOG_DEBUG, (\"%c%c%\"U16_F\": unknown code (0x%\"X16_F\") session = 0x%\"X16_F\"\\n\",\n            sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num,\n            (u16_t)ph->code, session));\n      } else {\n        PPPDEBUG(LOG_DEBUG, (\"pppoe: unknown code (0x%\"X16_F\") session = 0x%\"X16_F\"\\n\", (u16_t)ph->code, session));\n      }\n      break;\n  }\n\ndone:\n  pbuf_free(pb);\n  return;\n}\n\nvoid\npppoe_data_input(struct netif *netif, struct pbuf *pb)\n{\n  u16_t session, plen;\n  struct pppoe_softc *sc;\n  struct pppoehdr *ph;\n#ifdef PPPOE_TERM_UNKNOWN_SESSIONS\n  u8_t shost[ETHER_ADDR_LEN];\n#endif\n\n#ifdef PPPOE_TERM_UNKNOWN_SESSIONS\n  MEMCPY(shost, ((struct eth_hdr *)pb->payload)->src.addr, sizeof(shost));\n#endif\n  if (pbuf_header(pb, -(s16_t)sizeof(struct eth_hdr)) != 0) {\n    /* bail out */\n    PPPDEBUG(LOG_ERR, (\"pppoe_data_input: pbuf_header failed\\n\"));\n    LINK_STATS_INC(link.lenerr);\n    goto drop;\n  } \n\n  if (pb->len < sizeof(*ph)) {\n    PPPDEBUG(LOG_DEBUG, (\"pppoe_data_input: could not get PPPoE header\\n\"));\n    goto drop;\n  }\n  ph = (struct pppoehdr *)pb->payload;\n\n  if (ph->vertype != PPPOE_VERTYPE) {\n    PPPDEBUG(LOG_DEBUG, (\"pppoe (data): unknown version/type packet: 0x%x\\n\", ph->vertype));\n    goto drop;\n  }\n  if (ph->code != 0) {\n    goto drop;\n  }\n\n  session = lwip_ntohs(ph->session);\n  sc = pppoe_find_softc_by_session(session, netif);\n  if (sc == NULL) {\n#ifdef PPPOE_TERM_UNKNOWN_SESSIONS\n    PPPDEBUG(LOG_DEBUG, (\"pppoe: input for unknown session 0x%x, sending PADT\\n\", session));\n    pppoe_send_padt(netif, session, shost);\n#endif\n    goto drop;\n  }\n\n  plen = lwip_ntohs(ph->plen);\n\n  if (pbuf_header(pb, -(s16_t)(PPPOE_HEADERLEN)) != 0) {\n    /* bail out */\n    PPPDEBUG(LOG_ERR, (\"pppoe_data_input: pbuf_header PPPOE_HEADERLEN failed\\n\"));\n    LINK_STATS_INC(link.lenerr);\n    goto drop;\n  } \n\n  PPPDEBUG(LOG_DEBUG, (\"pppoe_data_input: %c%c%\"U16_F\": pkthdr.len=%d, pppoe.len=%d\\n\",\n        sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num,\n        pb->len, plen));\n\n  if (pb->tot_len < plen) {\n    goto drop;\n  }\n\n  /* Dispatch the packet thereby consuming it. */\n  ppp_input(sc->pcb, pb);\n  return;\n\ndrop:\n  pbuf_free(pb);\n}\n\nstatic err_t\npppoe_output(struct pppoe_softc *sc, struct pbuf *pb)\n{\n  struct eth_hdr *ethhdr;\n  u16_t etype;\n  err_t res;\n\n  /* make room for Ethernet header - should not fail */\n  if (pbuf_header(pb, (s16_t)(sizeof(struct eth_hdr))) != 0) {\n    /* bail out */\n    PPPDEBUG(LOG_ERR, (\"pppoe: %c%c%\"U16_F\": pppoe_output: could not allocate room for Ethernet header\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));\n    LINK_STATS_INC(link.lenerr);\n    pbuf_free(pb);\n    return ERR_BUF;\n  }\n  ethhdr = (struct eth_hdr *)pb->payload;\n  etype = sc->sc_state == PPPOE_STATE_SESSION ? ETHTYPE_PPPOE : ETHTYPE_PPPOEDISC;\n  ethhdr->type = lwip_htons(etype);\n  MEMCPY(&ethhdr->dest.addr, &sc->sc_dest.addr, sizeof(ethhdr->dest.addr));\n  MEMCPY(&ethhdr->src.addr, &sc->sc_ethif->hwaddr, sizeof(ethhdr->src.addr));\n\n  PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\" (%x) state=%d, session=0x%x output -> %02\"X16_F\":%02\"X16_F\":%02\"X16_F\":%02\"X16_F\":%02\"X16_F\":%02\"X16_F\", len=%d\\n\",\n      sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, etype,\n      sc->sc_state, sc->sc_session,\n      sc->sc_dest.addr[0], sc->sc_dest.addr[1], sc->sc_dest.addr[2], sc->sc_dest.addr[3], sc->sc_dest.addr[4], sc->sc_dest.addr[5],\n      pb->tot_len));\n\n  res = sc->sc_ethif->linkoutput(sc->sc_ethif, pb);\n\n  pbuf_free(pb);\n\n  return res;\n}\n\nstatic err_t\npppoe_send_padi(struct pppoe_softc *sc)\n{\n  struct pbuf *pb;\n  u8_t *p;\n  int len;\n#ifdef PPPOE_TODO\n  int l1 = 0, l2 = 0; /* XXX: gcc */\n#endif /* PPPOE_TODO */\n\n  /* calculate length of frame (excluding ethernet header + pppoe header) */\n  len = 2 + 2 + 2 + 2 + sizeof sc;  /* service name tag is required, host unique is send too */\n#ifdef PPPOE_TODO\n  if (sc->sc_service_name != NULL) {\n    l1 = (int)strlen(sc->sc_service_name);\n    len += l1;\n  }\n  if (sc->sc_concentrator_name != NULL) {\n    l2 = (int)strlen(sc->sc_concentrator_name);\n    len += 2 + 2 + l2;\n  }\n#endif /* PPPOE_TODO */\n  LWIP_ASSERT(\"sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff\",\n    sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff);\n\n  /* allocate a buffer */\n  pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN + len), PBUF_RAM);\n  if (!pb) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n\n  p = (u8_t*)pb->payload;\n  /* fill in pkt */\n  PPPOE_ADD_HEADER(p, PPPOE_CODE_PADI, 0, (u16_t)len);\n  PPPOE_ADD_16(p, PPPOE_TAG_SNAME);\n#ifdef PPPOE_TODO\n  if (sc->sc_service_name != NULL) {\n    PPPOE_ADD_16(p, l1);\n    MEMCPY(p, sc->sc_service_name, l1);\n    p += l1;\n  } else\n#endif /* PPPOE_TODO */\n  {\n    PPPOE_ADD_16(p, 0);\n  }\n#ifdef PPPOE_TODO\n  if (sc->sc_concentrator_name != NULL) {\n    PPPOE_ADD_16(p, PPPOE_TAG_ACNAME);\n    PPPOE_ADD_16(p, l2);\n    MEMCPY(p, sc->sc_concentrator_name, l2);\n    p += l2;\n  }\n#endif /* PPPOE_TODO */\n  PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);\n  PPPOE_ADD_16(p, sizeof(sc));\n  MEMCPY(p, &sc, sizeof sc);\n\n  /* send pkt */\n  return pppoe_output(sc, pb);\n}\n\nstatic void\npppoe_timeout(void *arg)\n{\n  u32_t retry_wait;\n  int err;\n  struct pppoe_softc *sc = (struct pppoe_softc*)arg;\n\n  PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\": timeout\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));\n\n  switch (sc->sc_state) {\n    case PPPOE_STATE_PADI_SENT:\n      /*\n       * We have two basic ways of retrying:\n       *  - Quick retry mode: try a few times in short sequence\n       *  - Slow retry mode: we already had a connection successfully\n       *    established and will try infinitely (without user\n       *    intervention)\n       * We only enter slow retry mode if IFF_LINK1 (aka autodial)\n       * is not set.\n       */\n      if (sc->sc_padi_retried < 0xff) {\n        sc->sc_padi_retried++;\n      }\n      if (!sc->pcb->settings.persist && sc->sc_padi_retried >= PPPOE_DISC_MAXPADI) {\n#if 0\n        if ((sc->sc_sppp.pp_if.if_flags & IFF_LINK1) == 0) {\n          /* slow retry mode */\n          retry_wait = PPPOE_SLOW_RETRY;\n        } else\n#endif\n        {\n          pppoe_abort_connect(sc);\n          return;\n        }\n      }\n      /* initialize for quick retry mode */\n      retry_wait = LWIP_MIN(PPPOE_DISC_TIMEOUT * sc->sc_padi_retried, PPPOE_SLOW_RETRY);\n      if ((err = pppoe_send_padi(sc)) != 0) {\n        sc->sc_padi_retried--;\n        PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\": failed to transmit PADI, error=%d\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err));\n      }\n      sys_timeout(retry_wait, pppoe_timeout, sc);\n      break;\n\n    case PPPOE_STATE_PADR_SENT:\n      sc->sc_padr_retried++;\n      if (sc->sc_padr_retried >= PPPOE_DISC_MAXPADR) {\n        MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest));\n        sc->sc_state = PPPOE_STATE_PADI_SENT;\n        sc->sc_padr_retried = 0;\n        if ((err = pppoe_send_padi(sc)) != 0) {\n          PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\": failed to send PADI, error=%d\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err));\n        }\n        sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padi_retried), pppoe_timeout, sc);\n        return;\n      }\n      if ((err = pppoe_send_padr(sc)) != 0) {\n        sc->sc_padr_retried--;\n        PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\": failed to send PADR, error=%d\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err));\n      }\n      sys_timeout(PPPOE_DISC_TIMEOUT * (1 + sc->sc_padr_retried), pppoe_timeout, sc);\n      break;\n    default:\n      return;  /* all done, work in peace */\n  }\n}\n\n/* Start a connection (i.e. initiate discovery phase) */\nstatic void\npppoe_connect(ppp_pcb *ppp, void *ctx)\n{\n  err_t err;\n  struct pppoe_softc *sc = (struct pppoe_softc *)ctx;\n  lcp_options *lcp_wo;\n  lcp_options *lcp_ao;\n#if PPP_IPV4_SUPPORT && VJ_SUPPORT\n  ipcp_options *ipcp_wo;\n  ipcp_options *ipcp_ao;\n#endif /* PPP_IPV4_SUPPORT && VJ_SUPPORT */\n\n  sc->sc_session = 0;\n  sc->sc_ac_cookie_len = 0;\n  sc->sc_padi_retried = 0;\n  sc->sc_padr_retried = 0;\n  /* changed to real address later */\n  MEMCPY(&sc->sc_dest, ethbroadcast.addr, sizeof(sc->sc_dest));\n#ifdef PPPOE_SERVER\n  /* wait PADI if IFF_PASSIVE */\n  if ((sc->sc_sppp.pp_if.if_flags & IFF_PASSIVE)) {\n    return 0;\n  }\n#endif\n\n  lcp_wo = &ppp->lcp_wantoptions;\n  lcp_wo->mru = sc->sc_ethif->mtu-PPPOE_HEADERLEN-2; /* two byte PPP protocol discriminator, then IP data */\n  lcp_wo->neg_asyncmap = 0;\n  lcp_wo->neg_pcompression = 0;\n  lcp_wo->neg_accompression = 0;\n  lcp_wo->passive = 0;\n  lcp_wo->silent = 0;\n\n  lcp_ao = &ppp->lcp_allowoptions;\n  lcp_ao->mru = sc->sc_ethif->mtu-PPPOE_HEADERLEN-2; /* two byte PPP protocol discriminator, then IP data */\n  lcp_ao->neg_asyncmap = 0;\n  lcp_ao->neg_pcompression = 0;\n  lcp_ao->neg_accompression = 0;\n\n#if PPP_IPV4_SUPPORT && VJ_SUPPORT\n  ipcp_wo = &ppp->ipcp_wantoptions;\n  ipcp_wo->neg_vj = 0;\n  ipcp_wo->old_vj = 0;\n\n  ipcp_ao = &ppp->ipcp_allowoptions;\n  ipcp_ao->neg_vj = 0;\n  ipcp_ao->old_vj = 0;\n#endif /* PPP_IPV4_SUPPORT && VJ_SUPPORT */\n\n  /* save state, in case we fail to send PADI */\n  sc->sc_state = PPPOE_STATE_PADI_SENT;\n  if ((err = pppoe_send_padi(sc)) != 0) {\n    PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\": failed to send PADI, error=%d\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, err));\n  }\n  sys_timeout(PPPOE_DISC_TIMEOUT, pppoe_timeout, sc);\n}\n\n/* disconnect */\nstatic void\npppoe_disconnect(ppp_pcb *ppp, void *ctx)\n{\n  struct pppoe_softc *sc = (struct pppoe_softc *)ctx;\n\n  PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\": disconnecting\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));\n  if (sc->sc_state == PPPOE_STATE_SESSION) {\n    pppoe_send_padt(sc->sc_ethif, sc->sc_session, (const u8_t *)&sc->sc_dest);\n  }\n\n  /* stop any timer, disconnect can be called while initiating is in progress */\n  sys_untimeout(pppoe_timeout, sc);\n  sc->sc_state = PPPOE_STATE_INITIAL;\n#ifdef PPPOE_SERVER\n  if (sc->sc_hunique) {\n    mem_free(sc->sc_hunique);\n    sc->sc_hunique = NULL; /* probably not necessary, if state is initial we shouldn't have to access hunique anyway  */\n  }\n  sc->sc_hunique_len = 0; /* probably not necessary, if state is initial we shouldn't have to access hunique anyway  */\n#endif\n  ppp_link_end(ppp); /* notify upper layers */\n  return;\n}\n\n/* Connection attempt aborted */\nstatic void\npppoe_abort_connect(struct pppoe_softc *sc)\n{\n  PPPDEBUG(LOG_DEBUG, (\"%c%c%\"U16_F\": could not establish connection\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));\n  sc->sc_state = PPPOE_STATE_INITIAL;\n  ppp_link_failed(sc->pcb); /* notify upper layers */\n}\n\n/* Send a PADR packet */\nstatic err_t\npppoe_send_padr(struct pppoe_softc *sc)\n{\n  struct pbuf *pb;\n  u8_t *p;\n  size_t len;\n#ifdef PPPOE_TODO\n  size_t l1 = 0; /* XXX: gcc */\n#endif /* PPPOE_TODO */\n\n  len = 2 + 2 + 2 + 2 + sizeof(sc);    /* service name, host unique */\n#ifdef PPPOE_TODO\n  if (sc->sc_service_name != NULL) {    /* service name tag maybe empty */\n    l1 = strlen(sc->sc_service_name);\n    len += l1;\n  }\n#endif /* PPPOE_TODO */\n  if (sc->sc_ac_cookie_len > 0) {\n    len += 2 + 2 + sc->sc_ac_cookie_len;  /* AC cookie */\n  }\n  LWIP_ASSERT(\"sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff\",\n    sizeof(struct eth_hdr) + PPPOE_HEADERLEN + len <= 0xffff);\n  pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN + len), PBUF_RAM);\n  if (!pb) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n  p = (u8_t*)pb->payload;\n  PPPOE_ADD_HEADER(p, PPPOE_CODE_PADR, 0, len);\n  PPPOE_ADD_16(p, PPPOE_TAG_SNAME);\n#ifdef PPPOE_TODO\n  if (sc->sc_service_name != NULL) {\n    PPPOE_ADD_16(p, l1);\n    MEMCPY(p, sc->sc_service_name, l1);\n    p += l1;\n  } else\n#endif /* PPPOE_TODO */\n  {\n    PPPOE_ADD_16(p, 0);\n  }\n  if (sc->sc_ac_cookie_len > 0) {\n    PPPOE_ADD_16(p, PPPOE_TAG_ACCOOKIE);\n    PPPOE_ADD_16(p, sc->sc_ac_cookie_len);\n    MEMCPY(p, sc->sc_ac_cookie, sc->sc_ac_cookie_len);\n    p += sc->sc_ac_cookie_len;\n  }\n  PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);\n  PPPOE_ADD_16(p, sizeof(sc));\n  MEMCPY(p, &sc, sizeof sc);\n\n  return pppoe_output(sc, pb);\n}\n\n/* send a PADT packet */\nstatic err_t\npppoe_send_padt(struct netif *outgoing_if, u_int session, const u8_t *dest)\n{\n  struct pbuf *pb;\n  struct eth_hdr *ethhdr;\n  err_t res;\n  u8_t *p;\n\n  pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN), PBUF_RAM);\n  if (!pb) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n\n  pbuf_header(pb, (s16_t)sizeof(struct eth_hdr));\n  ethhdr = (struct eth_hdr *)pb->payload;\n  ethhdr->type = PP_HTONS(ETHTYPE_PPPOEDISC);\n  MEMCPY(&ethhdr->dest.addr, dest, sizeof(ethhdr->dest.addr));\n  MEMCPY(&ethhdr->src.addr, &outgoing_if->hwaddr, sizeof(ethhdr->src.addr));\n\n  p = (u8_t*)(ethhdr + 1);\n  PPPOE_ADD_HEADER(p, PPPOE_CODE_PADT, session, 0);\n\n  res = outgoing_if->linkoutput(outgoing_if, pb);\n\n  pbuf_free(pb);\n\n  return res;\n}\n\n#ifdef PPPOE_SERVER\nstatic err_t\npppoe_send_pado(struct pppoe_softc *sc)\n{\n  struct pbuf *pb;\n  u8_t *p;\n  size_t len;\n\n  /* calc length */\n  len = 0;\n  /* include ac_cookie */\n  len += 2 + 2 + sizeof(sc);\n  /* include hunique */\n  len += 2 + 2 + sc->sc_hunique_len;\n  pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN + len), PBUF_RAM);\n  if (!pb) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n  p = (u8_t*)pb->payload;\n  PPPOE_ADD_HEADER(p, PPPOE_CODE_PADO, 0, len);\n  PPPOE_ADD_16(p, PPPOE_TAG_ACCOOKIE);\n  PPPOE_ADD_16(p, sizeof(sc));\n  MEMCPY(p, &sc, sizeof(sc));\n  p += sizeof(sc);\n  PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);\n  PPPOE_ADD_16(p, sc->sc_hunique_len);\n  MEMCPY(p, sc->sc_hunique, sc->sc_hunique_len);\n  return pppoe_output(sc, pb);\n}\n\nstatic err_t\npppoe_send_pads(struct pppoe_softc *sc)\n{\n  struct pbuf *pb;\n  u8_t *p;\n  size_t len, l1 = 0;  /* XXX: gcc */\n\n  sc->sc_session = mono_time.tv_sec % 0xff + 1;\n  /* calc length */\n  len = 0;\n  /* include hunique */\n  len += 2 + 2 + 2 + 2 + sc->sc_hunique_len;  /* service name, host unique*/\n  if (sc->sc_service_name != NULL) {    /* service name tag maybe empty */\n    l1 = strlen(sc->sc_service_name);\n    len += l1;\n  }\n  pb = pbuf_alloc(PBUF_LINK, (u16_t)(PPPOE_HEADERLEN + len), PBUF_RAM);\n  if (!pb) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n  p = (u8_t*)pb->payload;\n  PPPOE_ADD_HEADER(p, PPPOE_CODE_PADS, sc->sc_session, len);\n  PPPOE_ADD_16(p, PPPOE_TAG_SNAME);\n  if (sc->sc_service_name != NULL) {\n    PPPOE_ADD_16(p, l1);\n    MEMCPY(p, sc->sc_service_name, l1);\n    p += l1;\n  } else {\n    PPPOE_ADD_16(p, 0);\n  }\n  PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);\n  PPPOE_ADD_16(p, sc->sc_hunique_len);\n  MEMCPY(p, sc->sc_hunique, sc->sc_hunique_len);\n  return pppoe_output(sc, pb);\n}\n#endif\n\nstatic err_t\npppoe_xmit(struct pppoe_softc *sc, struct pbuf *pb)\n{\n  u8_t *p;\n  size_t len;\n\n  len = pb->tot_len;\n\n  /* make room for PPPoE header - should not fail */\n  if (pbuf_header(pb, (s16_t)(PPPOE_HEADERLEN)) != 0) {\n    /* bail out */\n    PPPDEBUG(LOG_ERR, (\"pppoe: %c%c%\"U16_F\": pppoe_xmit: could not allocate room for PPPoE header\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));\n    LINK_STATS_INC(link.lenerr);\n    pbuf_free(pb);\n    return ERR_BUF;\n  }\n\n  p = (u8_t*)pb->payload;\n  PPPOE_ADD_HEADER(p, 0, sc->sc_session, len);\n\n  return pppoe_output(sc, pb);\n}\n\n#if 0 /*def PFIL_HOOKS*/\nstatic int\npppoe_ifattach_hook(void *arg, struct pbuf **mp, struct netif *ifp, int dir)\n{\n  struct pppoe_softc *sc;\n  int s;\n\n  if (mp != (struct pbuf **)PFIL_IFNET_DETACH) {\n    return 0;\n  }\n\n  LIST_FOREACH(sc, &pppoe_softc_list, sc_list) {\n    if (sc->sc_ethif != ifp) {\n      continue;\n    }\n    if (sc->sc_sppp.pp_if.if_flags & IFF_UP) {\n      sc->sc_sppp.pp_if.if_flags &= ~(IFF_UP|IFF_RUNNING);\n      PPPDEBUG(LOG_DEBUG, (\"%c%c%\"U16_F\": ethernet interface detached, going down\\n\",\n          sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num));\n    }\n    sc->sc_ethif = NULL;\n    pppoe_clear_softc(sc, \"ethernet interface detached\");\n  }\n\n  return 0;\n}\n#endif\n\n#if 0 /* UNUSED */\nstatic void\npppoe_clear_softc(struct pppoe_softc *sc, const char *message)\n{\n  LWIP_UNUSED_ARG(message);\n\n  /* stop timer */\n  sys_untimeout(pppoe_timeout, sc);\n  PPPDEBUG(LOG_DEBUG, (\"pppoe: %c%c%\"U16_F\": session 0x%x terminated, %s\\n\", sc->sc_ethif->name[0], sc->sc_ethif->name[1], sc->sc_ethif->num, sc->sc_session, message));\n  sc->sc_state = PPPOE_STATE_INITIAL;\n  ppp_link_end(sc->pcb);  /* notify upper layers - /!\\ dangerous /!\\ - see pppoe_disc_input() */\n}\n#endif /* UNUSED */\n#endif /* PPP_SUPPORT && PPPOE_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/pppol2tp.c",
    "content": "/**\n * @file\n * Network Point to Point Protocol over Layer 2 Tunneling Protocol program file.\n *\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n/*\n * L2TP Support status:\n *\n * Supported:\n * - L2TPv2 (PPP over L2TP, a.k.a. UDP tunnels)\n * - LAC\n *\n * Not supported:\n * - LNS (require PPP server support)\n * - L2TPv3 ethernet pseudowires\n * - L2TPv3 VLAN pseudowire\n * - L2TPv3 PPP pseudowires\n * - L2TPv3 IP encapsulation\n * - L2TPv3 IP pseudowire\n * - L2TP tunnel switching - http://tools.ietf.org/html/draft-ietf-l2tpext-tunnel-switching-08\n * - Multiple tunnels per UDP socket, as well as multiple sessions per tunnel\n * - Hidden AVPs\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPPOL2TP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#include \"lwip/err.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/udp.h\"\n#include \"lwip/snmp.h\"\n\n#include \"netif/ppp/ppp_impl.h\"\n#include \"netif/ppp/lcp.h\"\n#include \"netif/ppp/ipcp.h\"\n#include \"netif/ppp/pppol2tp.h\"\n#include \"netif/ppp/pppcrypt.h\"\n#include \"netif/ppp/magic.h\"\n\n/* Memory pool */\nLWIP_MEMPOOL_DECLARE(PPPOL2TP_PCB, MEMP_NUM_PPPOL2TP_INTERFACES, sizeof(pppol2tp_pcb), \"PPPOL2TP_PCB\")\n\n/* callbacks called from PPP core */\nstatic err_t pppol2tp_write(ppp_pcb *ppp, void *ctx, struct pbuf *p);\nstatic err_t pppol2tp_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol);\nstatic err_t pppol2tp_destroy(ppp_pcb *ppp, void *ctx);    /* Destroy a L2TP control block */\nstatic void pppol2tp_connect(ppp_pcb *ppp, void *ctx);    /* Be a LAC, connect to a LNS. */\nstatic void pppol2tp_disconnect(ppp_pcb *ppp, void *ctx);  /* Disconnect */\n\n /* Prototypes for procedures local to this file. */\nstatic void pppol2tp_input(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port);\nstatic void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp, u16_t port, struct pbuf *p, u16_t ns, u16_t nr);\nstatic void pppol2tp_timeout(void *arg);\nstatic void pppol2tp_abort_connect(pppol2tp_pcb *l2tp);\nstatic err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp);\nstatic err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp, u16_t ns);\nstatic err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp, u16_t ns);\nstatic err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp, u16_t ns);\nstatic err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns);\nstatic err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns);\nstatic err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb);\nstatic err_t pppol2tp_udp_send(pppol2tp_pcb *l2tp, struct pbuf *pb);\n\n/* Callbacks structure for PPP core */\nstatic const struct link_callbacks pppol2tp_callbacks = {\n  pppol2tp_connect,\n#if PPP_SERVER\n  NULL,\n#endif /* PPP_SERVER */\n  pppol2tp_disconnect,\n  pppol2tp_destroy,\n  pppol2tp_write,\n  pppol2tp_netif_output,\n  NULL,\n  NULL\n};\n\n\n/* Create a new L2TP session. */\nppp_pcb *pppol2tp_create(struct netif *pppif,\n       struct netif *netif, const ip_addr_t *ipaddr, u16_t port,\n       const u8_t *secret, u8_t secret_len,\n       ppp_link_status_cb_fn link_status_cb, void *ctx_cb) {\n  ppp_pcb *ppp;\n  pppol2tp_pcb *l2tp;\n  struct udp_pcb *udp;\n#if !PPPOL2TP_AUTH_SUPPORT\n  LWIP_UNUSED_ARG(secret);\n  LWIP_UNUSED_ARG(secret_len);\n#endif /* !PPPOL2TP_AUTH_SUPPORT */\n\n  if (ipaddr == NULL) {\n    goto ipaddr_check_failed;\n  }\n\n  l2tp = (pppol2tp_pcb *)LWIP_MEMPOOL_ALLOC(PPPOL2TP_PCB);\n  if (l2tp == NULL) {\n    goto memp_malloc_l2tp_failed;\n  }\n\n  udp = udp_new_ip_type(IP_GET_TYPE(ipaddr));\n  if (udp == NULL) {\n    goto udp_new_failed;\n  }\n  udp_recv(udp, pppol2tp_input, l2tp);\n\n  ppp = ppp_new(pppif, &pppol2tp_callbacks, l2tp, link_status_cb, ctx_cb);\n  if (ppp == NULL) {\n    goto ppp_new_failed;\n  }\n\n  memset(l2tp, 0, sizeof(pppol2tp_pcb));\n  l2tp->phase = PPPOL2TP_STATE_INITIAL;\n  l2tp->ppp = ppp;\n  l2tp->udp = udp;\n  l2tp->netif = netif;\n  ip_addr_copy(l2tp->remote_ip, *ipaddr);\n  l2tp->remote_port = port;\n#if PPPOL2TP_AUTH_SUPPORT\n  l2tp->secret = secret;\n  l2tp->secret_len = secret_len;\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n\n  return ppp;\n\nppp_new_failed:\n  udp_remove(udp);\nudp_new_failed:\n  LWIP_MEMPOOL_FREE(PPPOL2TP_PCB, l2tp);\nmemp_malloc_l2tp_failed:\nipaddr_check_failed:\n  return NULL;\n}\n\n/* Called by PPP core */\nstatic err_t pppol2tp_write(ppp_pcb *ppp, void *ctx, struct pbuf *p) {\n  pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;\n  struct pbuf *ph; /* UDP + L2TP header */\n  err_t ret;\n#if MIB2_STATS\n  u16_t tot_len;\n#else /* MIB2_STATS */\n  LWIP_UNUSED_ARG(ppp);\n#endif /* MIB2_STATS */\n\n  ph = pbuf_alloc(PBUF_TRANSPORT, (u16_t)(PPPOL2TP_OUTPUT_DATA_HEADER_LEN), PBUF_RAM);\n  if(!ph) {\n    LINK_STATS_INC(link.memerr);\n    LINK_STATS_INC(link.proterr);\n    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n    pbuf_free(p);\n    return ERR_MEM;\n  }\n\n  pbuf_header(ph, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN); /* hide L2TP header */\n  pbuf_cat(ph, p);\n#if MIB2_STATS\n  tot_len = ph->tot_len;\n#endif /* MIB2_STATS */\n\n  ret = pppol2tp_xmit(l2tp, ph);\n  if (ret != ERR_OK) {\n    LINK_STATS_INC(link.err);\n    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n    return ret;\n  }\n\n  MIB2_STATS_NETIF_ADD(ppp->netif, ifoutoctets, (u16_t)tot_len);\n  MIB2_STATS_NETIF_INC(ppp->netif, ifoutucastpkts);\n  LINK_STATS_INC(link.xmit);\n  return ERR_OK;\n}\n\n/* Called by PPP core */\nstatic err_t pppol2tp_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *p, u_short protocol) {\n  pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;\n  struct pbuf *pb;\n  u8_t *pl;\n  err_t err;\n#if MIB2_STATS\n  u16_t tot_len;\n#else /* MIB2_STATS */\n  LWIP_UNUSED_ARG(ppp);\n#endif /* MIB2_STATS */\n\n  /* @todo: try to use pbuf_header() here! */\n  pb = pbuf_alloc(PBUF_TRANSPORT, PPPOL2TP_OUTPUT_DATA_HEADER_LEN + sizeof(protocol), PBUF_RAM);\n  if(!pb) {\n    LINK_STATS_INC(link.memerr);\n    LINK_STATS_INC(link.proterr);\n    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n    return ERR_MEM;\n  }\n\n  pbuf_header(pb, -(s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN);\n\n  pl = (u8_t*)pb->payload;\n  PUTSHORT(protocol, pl);\n\n  pbuf_chain(pb, p);\n#if MIB2_STATS\n  tot_len = pb->tot_len;\n#endif /* MIB2_STATS */\n\n  if( (err = pppol2tp_xmit(l2tp, pb)) != ERR_OK) {\n    LINK_STATS_INC(link.err);\n    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n    return err;\n  }\n\n  MIB2_STATS_NETIF_ADD(ppp->netif, ifoutoctets, tot_len);\n  MIB2_STATS_NETIF_INC(ppp->netif, ifoutucastpkts);\n  LINK_STATS_INC(link.xmit);\n  return ERR_OK;\n}\n\n/* Destroy a L2TP control block */\nstatic err_t pppol2tp_destroy(ppp_pcb *ppp, void *ctx) {\n  pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;\n  LWIP_UNUSED_ARG(ppp);\n\n  sys_untimeout(pppol2tp_timeout, l2tp);\n  udp_remove(l2tp->udp);\n  LWIP_MEMPOOL_FREE(PPPOL2TP_PCB, l2tp);\n  return ERR_OK;\n}\n\n/* Be a LAC, connect to a LNS. */\nstatic void pppol2tp_connect(ppp_pcb *ppp, void *ctx) {\n  err_t err;\n  pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;\n  lcp_options *lcp_wo;\n  lcp_options *lcp_ao;\n#if PPP_IPV4_SUPPORT && VJ_SUPPORT\n  ipcp_options *ipcp_wo;\n  ipcp_options *ipcp_ao;\n#endif /* PPP_IPV4_SUPPORT && VJ_SUPPORT */\n\n  l2tp->tunnel_port = l2tp->remote_port;\n  l2tp->our_ns = 0;\n  l2tp->peer_nr = 0;\n  l2tp->peer_ns = 0;\n  l2tp->source_tunnel_id = 0;\n  l2tp->remote_tunnel_id = 0;\n  l2tp->source_session_id = 0;\n  l2tp->remote_session_id = 0;\n  /* l2tp->*_retried are cleared when used */\n\n  lcp_wo = &ppp->lcp_wantoptions;\n  lcp_wo->mru = PPPOL2TP_DEFMRU;\n  lcp_wo->neg_asyncmap = 0;\n  lcp_wo->neg_pcompression = 0;\n  lcp_wo->neg_accompression = 0;\n  lcp_wo->passive = 0;\n  lcp_wo->silent = 0;\n\n  lcp_ao = &ppp->lcp_allowoptions;\n  lcp_ao->mru = PPPOL2TP_DEFMRU;\n  lcp_ao->neg_asyncmap = 0;\n  lcp_ao->neg_pcompression = 0;\n  lcp_ao->neg_accompression = 0;\n\n#if PPP_IPV4_SUPPORT && VJ_SUPPORT\n  ipcp_wo = &ppp->ipcp_wantoptions;\n  ipcp_wo->neg_vj = 0;\n  ipcp_wo->old_vj = 0;\n\n  ipcp_ao = &ppp->ipcp_allowoptions;\n  ipcp_ao->neg_vj = 0;\n  ipcp_ao->old_vj = 0;\n#endif /* PPP_IPV4_SUPPORT && VJ_SUPPORT */\n\n  /* Listen to a random source port, we need to do that instead of using udp_connect()\n   * because the L2TP LNS might answer with its own random source port (!= 1701)\n   */\n#if LWIP_IPV6\n  if (IP_IS_V6_VAL(l2tp->udp->local_ip)) {\n    udp_bind(l2tp->udp, IP6_ADDR_ANY, 0);\n  } else\n#endif /* LWIP_IPV6 */\n  udp_bind(l2tp->udp, IP_ADDR_ANY, 0);\n\n#if PPPOL2TP_AUTH_SUPPORT\n  /* Generate random vector */\n  if (l2tp->secret != NULL) {\n    magic_random_bytes(l2tp->secret_rv, sizeof(l2tp->secret_rv));\n  }\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n\n  do {\n    l2tp->remote_tunnel_id = magic();\n  } while(l2tp->remote_tunnel_id == 0);\n  /* save state, in case we fail to send SCCRQ */\n  l2tp->sccrq_retried = 0;\n  l2tp->phase = PPPOL2TP_STATE_SCCRQ_SENT;\n  if ((err = pppol2tp_send_sccrq(l2tp)) != 0) {\n    PPPDEBUG(LOG_DEBUG, (\"pppol2tp: failed to send SCCRQ, error=%d\\n\", err));\n  }\n  sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);\n}\n\n/* Disconnect */\nstatic void pppol2tp_disconnect(ppp_pcb *ppp, void *ctx) {\n  pppol2tp_pcb *l2tp = (pppol2tp_pcb *)ctx;\n\n  l2tp->our_ns++;\n  pppol2tp_send_stopccn(l2tp, l2tp->our_ns);\n\n  /* stop any timer, disconnect can be called while initiating is in progress */\n  sys_untimeout(pppol2tp_timeout, l2tp);\n  l2tp->phase = PPPOL2TP_STATE_INITIAL;\n  ppp_link_end(ppp); /* notify upper layers */\n}\n\n/* UDP Callback for incoming IPv4 L2TP frames */\nstatic void pppol2tp_input(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t *addr, u16_t port) {\n  pppol2tp_pcb *l2tp = (pppol2tp_pcb*)arg;\n  u16_t hflags, hlen, len=0, tunnel_id=0, session_id=0, ns=0, nr=0, offset=0;\n  u8_t *inp;\n  LWIP_UNUSED_ARG(pcb);\n\n  /* we can't unbound a UDP pcb, thus we can still receive UDP frames after the link is closed */\n  if (l2tp->phase < PPPOL2TP_STATE_SCCRQ_SENT) {\n    goto free_and_return;\n  }\n\n  if (!ip_addr_cmp(&l2tp->remote_ip, addr)) {\n    goto free_and_return;\n  }\n\n  /* discard packet if port mismatch, but only if we received a SCCRP */\n  if (l2tp->phase > PPPOL2TP_STATE_SCCRQ_SENT && l2tp->tunnel_port != port) {\n    goto free_and_return;\n  }\n\n  /* printf(\"-----------\\nL2TP INPUT, %d\\n\", p->len); */\n\n  /* L2TP header */\n  if (p->len < sizeof(hflags) + sizeof(tunnel_id) + sizeof(session_id) ) {\n    goto packet_too_short;\n  }\n\n  inp = (u8_t*)p->payload;\n  GETSHORT(hflags, inp);\n\n  if (hflags & PPPOL2TP_HEADERFLAG_CONTROL) {\n    /* check mandatory flags for a control packet */\n    if ( (hflags & PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY) != PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY ) {\n      PPPDEBUG(LOG_DEBUG, (\"pppol2tp: mandatory header flags for control packet not set\\n\"));\n      goto free_and_return;\n    }\n    /* check forbidden flags for a control packet */\n    if (hflags & PPPOL2TP_HEADERFLAG_CONTROL_FORBIDDEN) {\n      PPPDEBUG(LOG_DEBUG, (\"pppol2tp: forbidden header flags for control packet found\\n\"));\n      goto free_and_return;\n    }\n  } else {\n    /* check mandatory flags for a data packet */\n    if ( (hflags & PPPOL2TP_HEADERFLAG_DATA_MANDATORY) != PPPOL2TP_HEADERFLAG_DATA_MANDATORY) {\n      PPPDEBUG(LOG_DEBUG, (\"pppol2tp: mandatory header flags for data packet not set\\n\"));\n      goto free_and_return;\n    }\n  }\n\n  /* Expected header size  */\n  hlen = sizeof(hflags) + sizeof(tunnel_id) + sizeof(session_id);\n  if (hflags & PPPOL2TP_HEADERFLAG_LENGTH) {\n    hlen += sizeof(len);\n  }\n  if (hflags & PPPOL2TP_HEADERFLAG_SEQUENCE) {\n    hlen += sizeof(ns) + sizeof(nr);\n  }\n  if (hflags & PPPOL2TP_HEADERFLAG_OFFSET) {\n    hlen += sizeof(offset);\n  }\n  if (p->len < hlen) {\n    goto packet_too_short;\n  }\n\n  if (hflags & PPPOL2TP_HEADERFLAG_LENGTH) {\n    GETSHORT(len, inp);\n    if (p->len < len || len < hlen) {\n      goto packet_too_short;\n    }\n  }\n  GETSHORT(tunnel_id, inp);\n  GETSHORT(session_id, inp);\n  if (hflags & PPPOL2TP_HEADERFLAG_SEQUENCE) {\n    GETSHORT(ns, inp);\n    GETSHORT(nr, inp);\n  }\n  if (hflags & PPPOL2TP_HEADERFLAG_OFFSET) {\n    GETSHORT(offset, inp)\n    if (offset > 4096) { /* don't be fooled with large offset which might overflow hlen */\n      PPPDEBUG(LOG_DEBUG, (\"pppol2tp: strange packet received, offset=%d\\n\", offset));\n      goto free_and_return;\n    }\n    hlen += offset;\n    if (p->len < hlen) {\n      goto packet_too_short;\n    }\n    INCPTR(offset, inp);\n  }\n\n  /* printf(\"HLEN = %d\\n\", hlen); */\n\n  /* skip L2TP header */\n  if (pbuf_header(p, -(s16_t)hlen) != 0) {\n    goto free_and_return;\n  }\n\n  /* printf(\"LEN=%d, TUNNEL_ID=%d, SESSION_ID=%d, NS=%d, NR=%d, OFFSET=%d\\n\", len, tunnel_id, session_id, ns, nr, offset); */\n  PPPDEBUG(LOG_DEBUG, (\"pppol2tp: input packet, len=%\"U16_F\", tunnel=%\"U16_F\", session=%\"U16_F\", ns=%\"U16_F\", nr=%\"U16_F\"\\n\",\n    len, tunnel_id, session_id, ns, nr));\n\n  /* Control packet */\n  if (hflags & PPPOL2TP_HEADERFLAG_CONTROL) {\n    pppol2tp_dispatch_control_packet(l2tp, port, p, ns, nr);\n    goto free_and_return;\n  }\n\n  /* Data packet */\n  if(l2tp->phase != PPPOL2TP_STATE_DATA) {\n    goto free_and_return;\n  }\n  if(tunnel_id != l2tp->remote_tunnel_id) {\n     PPPDEBUG(LOG_DEBUG, (\"pppol2tp: tunnel ID mismatch, assigned=%d, received=%d\\n\", l2tp->remote_tunnel_id, tunnel_id));\n     goto free_and_return;\n  }\n  if(session_id != l2tp->remote_session_id) {\n     PPPDEBUG(LOG_DEBUG, (\"pppol2tp: session ID mismatch, assigned=%d, received=%d\\n\", l2tp->remote_session_id, session_id));\n     goto free_and_return;\n  }\n  /*\n   * skip address & flags if necessary\n   *\n   * RFC 2661 does not specify whether the PPP frame in the L2TP payload should\n   * have a HDLC header or not. We handle both cases for compatibility.\n   */\n  if (p->len >= 2) {\n    GETSHORT(hflags, inp);\n    if (hflags == 0xff03) {\n      pbuf_header(p, -(s16_t)2);\n    }\n  }\n  /* Dispatch the packet thereby consuming it. */\n  ppp_input(l2tp->ppp, p);\n  return;\n\npacket_too_short:\n  PPPDEBUG(LOG_DEBUG, (\"pppol2tp: packet too short: %d\\n\", p->len));\nfree_and_return:\n  pbuf_free(p);\n}\n\n/* L2TP Control packet entry point */\nstatic void pppol2tp_dispatch_control_packet(pppol2tp_pcb *l2tp, u16_t port, struct pbuf *p, u16_t ns, u16_t nr) {\n  u8_t *inp;\n  u16_t avplen, avpflags, vendorid, attributetype, messagetype=0;\n  err_t err;\n#if PPPOL2TP_AUTH_SUPPORT\n  lwip_md5_context md5_ctx;\n  u8_t md5_hash[16];\n  u8_t challenge_id = 0;\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n\n  l2tp->peer_nr = nr;\n  l2tp->peer_ns = ns;\n  /* printf(\"L2TP CTRL INPUT, ns=%d, nr=%d, len=%d\\n\", ns, nr, p->len); */\n\n  /* Handle the special case of the ICCN acknowledge */\n  if (l2tp->phase == PPPOL2TP_STATE_ICCN_SENT && l2tp->peer_nr > l2tp->our_ns) {\n    l2tp->phase = PPPOL2TP_STATE_DATA;\n  }\n\n  /* ZLB packets */\n  if (p->tot_len == 0) {\n    return;\n  }\n\n  p = ppp_singlebuf(p);\n  inp = (u8_t*)p->payload;\n  /* Decode AVPs */\n  while (p->len > 0) {\n    if (p->len < sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype) ) {\n      goto packet_too_short;\n    }\n    GETSHORT(avpflags, inp);\n    avplen = avpflags & PPPOL2TP_AVPHEADERFLAG_LENGTHMASK;\n    /* printf(\"AVPLEN = %d\\n\", avplen); */\n    if (p->len < avplen || avplen < sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype)) {\n      goto packet_too_short;\n    }\n    GETSHORT(vendorid, inp);\n    GETSHORT(attributetype, inp);\n    avplen -= sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype);\n\n    /* Message type must be the first AVP */\n    if (messagetype == 0) {\n      if (attributetype != 0 || vendorid != 0 || avplen != sizeof(messagetype) ) {\n        PPPDEBUG(LOG_DEBUG, (\"pppol2tp: message type must be the first AVP\\n\"));\n        return;\n      }\n      GETSHORT(messagetype, inp);\n      /* printf(\"Message type = %d\\n\", messagetype); */\n      switch(messagetype) {\n        /* Start Control Connection Reply */\n        case PPPOL2TP_MESSAGETYPE_SCCRP:\n          /* Only accept SCCRP packet if we sent a SCCRQ */\n          if (l2tp->phase != PPPOL2TP_STATE_SCCRQ_SENT) {\n            goto send_zlb;\n          }\n          break;\n        /* Incoming Call Reply */\n        case PPPOL2TP_MESSAGETYPE_ICRP:\n          /* Only accept ICRP packet if we sent a IRCQ */\n          if (l2tp->phase != PPPOL2TP_STATE_ICRQ_SENT) {\n            goto send_zlb;\n          }\n          break;\n        /* Stop Control Connection Notification */\n        case PPPOL2TP_MESSAGETYPE_STOPCCN:\n          pppol2tp_send_zlb(l2tp, l2tp->our_ns); /* Ack the StopCCN before we switch to down state */\n          if (l2tp->phase < PPPOL2TP_STATE_DATA) {\n            pppol2tp_abort_connect(l2tp);\n          } else if (l2tp->phase == PPPOL2TP_STATE_DATA) {\n            /* Don't disconnect here, we let the LCP Echo/Reply find the fact\n             * that PPP session is down. Asking the PPP stack to end the session\n             * require strict checking about the PPP phase to prevent endless\n             * disconnection loops.\n             */\n          }\n          return;\n        default:\n          break;\n      }\n      goto nextavp;\n    }\n\n    /* Skip proprietary L2TP extensions */\n    if (vendorid != 0) {\n      goto skipavp;\n    }\n\n    switch (messagetype) {\n      /* Start Control Connection Reply */\n      case PPPOL2TP_MESSAGETYPE_SCCRP:\n       switch (attributetype) {\n          case PPPOL2TP_AVPTYPE_TUNNELID:\n            if (avplen != sizeof(l2tp->source_tunnel_id) ) {\n               PPPDEBUG(LOG_DEBUG, (\"pppol2tp: AVP Assign tunnel ID length check failed\\n\"));\n               return;\n            }\n            GETSHORT(l2tp->source_tunnel_id, inp);\n            PPPDEBUG(LOG_DEBUG, (\"pppol2tp: Assigned tunnel ID %\"U16_F\"\\n\", l2tp->source_tunnel_id));\n            goto nextavp;\n#if PPPOL2TP_AUTH_SUPPORT\n          case PPPOL2TP_AVPTYPE_CHALLENGE:\n            if (avplen == 0) {\n               PPPDEBUG(LOG_DEBUG, (\"pppol2tp: Challenge length check failed\\n\"));\n               return;\n            }\n            if (l2tp->secret == NULL) {\n              PPPDEBUG(LOG_DEBUG, (\"pppol2tp: Received challenge from peer and no secret key available\\n\"));\n              pppol2tp_abort_connect(l2tp);\n              return;\n            }\n            /* Generate hash of ID, secret, challenge */\n            lwip_md5_init(&md5_ctx);\n            lwip_md5_starts(&md5_ctx);\n            challenge_id = PPPOL2TP_MESSAGETYPE_SCCCN;\n            lwip_md5_update(&md5_ctx, &challenge_id, 1);\n            lwip_md5_update(&md5_ctx, l2tp->secret, l2tp->secret_len);\n            lwip_md5_update(&md5_ctx, inp, avplen);\n            lwip_md5_finish(&md5_ctx, l2tp->challenge_hash);\n            lwip_md5_free(&md5_ctx);\n            l2tp->send_challenge = 1;\n            goto skipavp;\n          case PPPOL2TP_AVPTYPE_CHALLENGERESPONSE:\n            if (avplen != PPPOL2TP_AVPTYPE_CHALLENGERESPONSE_SIZE) {\n               PPPDEBUG(LOG_DEBUG, (\"pppol2tp: AVP Challenge Response length check failed\\n\"));\n               return;\n            }\n            /* Generate hash of ID, secret, challenge */\n            lwip_md5_init(&md5_ctx);\n            lwip_md5_starts(&md5_ctx);\n            challenge_id = PPPOL2TP_MESSAGETYPE_SCCRP;\n            lwip_md5_update(&md5_ctx, &challenge_id, 1);\n            lwip_md5_update(&md5_ctx, l2tp->secret, l2tp->secret_len);\n            lwip_md5_update(&md5_ctx, l2tp->secret_rv, sizeof(l2tp->secret_rv));\n            lwip_md5_finish(&md5_ctx, md5_hash);\n            lwip_md5_free(&md5_ctx);\n            if ( memcmp(inp, md5_hash, sizeof(md5_hash)) ) {\n              PPPDEBUG(LOG_DEBUG, (\"pppol2tp: Received challenge response from peer and secret key do not match\\n\"));\n              pppol2tp_abort_connect(l2tp);\n              return;\n            }\n            goto skipavp;\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n          default:\n            break;\n        }\n        break;\n      /* Incoming Call Reply */\n      case PPPOL2TP_MESSAGETYPE_ICRP:\n        switch (attributetype) {\n         case PPPOL2TP_AVPTYPE_SESSIONID:\n            if (avplen != sizeof(l2tp->source_session_id) ) {\n               PPPDEBUG(LOG_DEBUG, (\"pppol2tp: AVP Assign session ID length check failed\\n\"));\n               return;\n            }\n            GETSHORT(l2tp->source_session_id, inp);\n            PPPDEBUG(LOG_DEBUG, (\"pppol2tp: Assigned session ID %\"U16_F\"\\n\", l2tp->source_session_id));\n            goto nextavp;\n          default:\n            break;\n        }\n        break;\n      default:\n        break;\n    }\n\nskipavp:\n    INCPTR(avplen, inp);\nnextavp:\n    /* printf(\"AVP Found, vendor=%d, attribute=%d, len=%d\\n\", vendorid, attributetype, avplen); */\n    /* next AVP */\n    if (pbuf_header(p, -(s16_t)(avplen + sizeof(avpflags) + sizeof(vendorid) + sizeof(attributetype)) ) != 0) {\n      return;\n    }\n  }\n\n  switch(messagetype) {\n    /* Start Control Connection Reply */\n    case PPPOL2TP_MESSAGETYPE_SCCRP:\n      do {\n        l2tp->remote_session_id = magic();\n      } while(l2tp->remote_session_id == 0);\n      l2tp->tunnel_port = port; /* LNS server might have chosen its own local port */\n      l2tp->icrq_retried = 0;\n      l2tp->phase = PPPOL2TP_STATE_ICRQ_SENT;\n      l2tp->our_ns++;\n      if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns)) != 0) {\n        PPPDEBUG(LOG_DEBUG, (\"pppol2tp: failed to send SCCCN, error=%d\\n\", err));\n      }\n      l2tp->our_ns++;\n      if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {\n        PPPDEBUG(LOG_DEBUG, (\"pppol2tp: failed to send ICRQ, error=%d\\n\", err));\n      }\n      sys_untimeout(pppol2tp_timeout, l2tp);\n      sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);\n      break;\n    /* Incoming Call Reply */\n    case PPPOL2TP_MESSAGETYPE_ICRP:\n      l2tp->iccn_retried = 0;\n      l2tp->phase = PPPOL2TP_STATE_ICCN_SENT;\n      l2tp->our_ns++;\n      ppp_start(l2tp->ppp); /* notify upper layers */\n      if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {\n        PPPDEBUG(LOG_DEBUG, (\"pppol2tp: failed to send ICCN, error=%d\\n\", err));\n      }\n      sys_untimeout(pppol2tp_timeout, l2tp);\n      sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);\n      break;\n    /* Unhandled packet, send ZLB ACK */\n    default:\n      goto send_zlb;\n  }\n  return;\n\nsend_zlb:\n  pppol2tp_send_zlb(l2tp, l2tp->our_ns);\n  return;\npacket_too_short:\n  PPPDEBUG(LOG_DEBUG, (\"pppol2tp: packet too short: %d\\n\", p->len));\n}\n\n/* L2TP Timeout handler */\nstatic void pppol2tp_timeout(void *arg) {\n  pppol2tp_pcb *l2tp = (pppol2tp_pcb*)arg;\n  err_t err;\n  u32_t retry_wait;\n\n  PPPDEBUG(LOG_DEBUG, (\"pppol2tp: timeout\\n\"));\n\n  switch (l2tp->phase) {\n    case PPPOL2TP_STATE_SCCRQ_SENT:\n      /* backoff wait */\n      if (l2tp->sccrq_retried < 0xff) {\n        l2tp->sccrq_retried++;\n      }\n      if (!l2tp->ppp->settings.persist && l2tp->sccrq_retried >= PPPOL2TP_MAXSCCRQ) {\n        pppol2tp_abort_connect(l2tp);\n        return;\n      }\n      retry_wait = LWIP_MIN(PPPOL2TP_CONTROL_TIMEOUT * l2tp->sccrq_retried, PPPOL2TP_SLOW_RETRY);\n      PPPDEBUG(LOG_DEBUG, (\"pppol2tp: sccrq_retried=%d\\n\", l2tp->sccrq_retried));\n      if ((err = pppol2tp_send_sccrq(l2tp)) != 0) {\n        l2tp->sccrq_retried--;\n        PPPDEBUG(LOG_DEBUG, (\"pppol2tp: failed to send SCCRQ, error=%d\\n\", err));\n      }\n      sys_timeout(retry_wait, pppol2tp_timeout, l2tp);\n      break;\n\n    case PPPOL2TP_STATE_ICRQ_SENT:\n      l2tp->icrq_retried++;\n      if (l2tp->icrq_retried >= PPPOL2TP_MAXICRQ) {\n        pppol2tp_abort_connect(l2tp);\n        return;\n      }\n      PPPDEBUG(LOG_DEBUG, (\"pppol2tp: icrq_retried=%d\\n\", l2tp->icrq_retried));\n      if (l2tp->peer_nr <= l2tp->our_ns -1) { /* the SCCCN was not acknowledged */\n        if ((err = pppol2tp_send_scccn(l2tp, l2tp->our_ns -1)) != 0) {\n      l2tp->icrq_retried--;\n      PPPDEBUG(LOG_DEBUG, (\"pppol2tp: failed to send SCCCN, error=%d\\n\", err));\n      sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);\n      break;\n    }\n      }\n      if ((err = pppol2tp_send_icrq(l2tp, l2tp->our_ns)) != 0) {\n    l2tp->icrq_retried--;\n    PPPDEBUG(LOG_DEBUG, (\"pppol2tp: failed to send ICRQ, error=%d\\n\", err));\n      }\n      sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);\n      break;\n\n    case PPPOL2TP_STATE_ICCN_SENT:\n      l2tp->iccn_retried++;\n      if (l2tp->iccn_retried >= PPPOL2TP_MAXICCN) {\n        pppol2tp_abort_connect(l2tp);\n        return;\n      }\n      PPPDEBUG(LOG_DEBUG, (\"pppol2tp: iccn_retried=%d\\n\", l2tp->iccn_retried));\n      if ((err = pppol2tp_send_iccn(l2tp, l2tp->our_ns)) != 0) {\n    l2tp->iccn_retried--;\n    PPPDEBUG(LOG_DEBUG, (\"pppol2tp: failed to send ICCN, error=%d\\n\", err));\n      }\n      sys_timeout(PPPOL2TP_CONTROL_TIMEOUT, pppol2tp_timeout, l2tp);\n      break;\n\n    default:\n      return;  /* all done, work in peace */\n  }\n}\n\n/* Connection attempt aborted */\nstatic void pppol2tp_abort_connect(pppol2tp_pcb *l2tp) {\n  PPPDEBUG(LOG_DEBUG, (\"pppol2tp: could not establish connection\\n\"));\n  l2tp->phase = PPPOL2TP_STATE_INITIAL;\n  ppp_link_failed(l2tp->ppp); /* notify upper layers */\n}\n\n/* Initiate a new tunnel */\nstatic err_t pppol2tp_send_sccrq(pppol2tp_pcb *l2tp) {\n  struct pbuf *pb;\n  u8_t *p;\n  u16_t len;\n\n  /* calculate UDP packet length */\n  len = 12 +8 +8 +10 +10 +6+sizeof(PPPOL2TP_HOSTNAME)-1 +6+sizeof(PPPOL2TP_VENDORNAME)-1 +8 +8;\n#if PPPOL2TP_AUTH_SUPPORT\n  if (l2tp->secret != NULL) {\n    len += 6 + sizeof(l2tp->secret_rv);\n  }\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n\n  /* allocate a buffer */\n  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);\n  if (pb == NULL) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n\n  p = (u8_t*)pb->payload;\n  /* fill in pkt */\n  /* L2TP control header */\n  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);\n  PUTSHORT(len, p); /* Length */\n  PUTSHORT(0, p); /* Tunnel Id */\n  PUTSHORT(0, p); /* Session Id */\n  PUTSHORT(0, p); /* NS Sequence number - to peer */\n  PUTSHORT(0, p); /* NR Sequence number - expected for peer */\n\n  /* AVP - Message type */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p); /* Attribute type: Message Type */\n  PUTSHORT(PPPOL2TP_MESSAGETYPE_SCCRQ, p); /* Attribute value: Message type: SCCRQ */\n\n  /* AVP - L2TP Version */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_VERSION, p); /* Attribute type: Version */\n  PUTSHORT(PPPOL2TP_VERSION, p); /* Attribute value: L2TP Version */\n\n  /* AVP - Framing capabilities */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_FRAMINGCAPABILITIES, p); /* Attribute type: Framing capabilities */\n  PUTLONG(PPPOL2TP_FRAMINGCAPABILITIES, p); /* Attribute value: Framing capabilities */\n\n  /* AVP - Bearer capabilities */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_BEARERCAPABILITIES, p); /* Attribute type: Bearer capabilities */\n  PUTLONG(PPPOL2TP_BEARERCAPABILITIES, p); /* Attribute value: Bearer capabilities */\n\n  /* AVP - Host name */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6+sizeof(PPPOL2TP_HOSTNAME)-1, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_HOSTNAME, p); /* Attribute type: Hostname */\n  MEMCPY(p, PPPOL2TP_HOSTNAME, sizeof(PPPOL2TP_HOSTNAME)-1); /* Attribute value: Hostname */\n  INCPTR(sizeof(PPPOL2TP_HOSTNAME)-1, p);\n\n  /* AVP - Vendor name */\n  PUTSHORT(6+sizeof(PPPOL2TP_VENDORNAME)-1, p); /* len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_VENDORNAME, p); /* Attribute type: Vendor name */\n  MEMCPY(p, PPPOL2TP_VENDORNAME, sizeof(PPPOL2TP_VENDORNAME)-1); /* Attribute value: Vendor name */\n  INCPTR(sizeof(PPPOL2TP_VENDORNAME)-1, p);\n\n  /* AVP - Assign tunnel ID */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_TUNNELID, p); /* Attribute type: Tunnel ID */\n  PUTSHORT(l2tp->remote_tunnel_id, p); /* Attribute value: Tunnel ID */\n\n  /* AVP - Receive window size */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_RECEIVEWINDOWSIZE, p); /* Attribute type: Receive window size */\n  PUTSHORT(PPPOL2TP_RECEIVEWINDOWSIZE, p); /* Attribute value: Receive window size */\n\n#if PPPOL2TP_AUTH_SUPPORT\n  /* AVP - Challenge */\n  if (l2tp->secret != NULL) {\n    PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6 + sizeof(l2tp->secret_rv), p); /* Mandatory flag + len field */\n    PUTSHORT(0, p); /* Vendor ID */\n    PUTSHORT(PPPOL2TP_AVPTYPE_CHALLENGE, p); /* Attribute type: Challenge */\n    MEMCPY(p, l2tp->secret_rv, sizeof(l2tp->secret_rv)); /* Attribute value: Random vector */\n    INCPTR(sizeof(l2tp->secret_rv), p);\n  }\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n\n  return pppol2tp_udp_send(l2tp, pb);\n}\n\n/* Complete tunnel establishment */\nstatic err_t pppol2tp_send_scccn(pppol2tp_pcb *l2tp, u16_t ns) {\n  struct pbuf *pb;\n  u8_t *p;\n  u16_t len;\n\n  /* calculate UDP packet length */\n  len = 12 +8;\n#if PPPOL2TP_AUTH_SUPPORT\n  if (l2tp->send_challenge) {\n    len += 6 + sizeof(l2tp->challenge_hash);\n  }\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n\n  /* allocate a buffer */\n  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);\n  if (pb == NULL) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n\n  p = (u8_t*)pb->payload;\n  /* fill in pkt */\n  /* L2TP control header */\n  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);\n  PUTSHORT(len, p); /* Length */\n  PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */\n  PUTSHORT(0, p); /* Session Id */\n  PUTSHORT(ns, p); /* NS Sequence number - to peer */\n  PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */\n\n  /* AVP - Message type */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p); /* Attribute type: Message Type */\n  PUTSHORT(PPPOL2TP_MESSAGETYPE_SCCCN, p); /* Attribute value: Message type: SCCCN */\n\n#if PPPOL2TP_AUTH_SUPPORT\n  /* AVP - Challenge response */\n  if (l2tp->send_challenge) {\n    PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 6 + sizeof(l2tp->challenge_hash), p); /* Mandatory flag + len field */\n    PUTSHORT(0, p); /* Vendor ID */\n    PUTSHORT(PPPOL2TP_AVPTYPE_CHALLENGERESPONSE, p); /* Attribute type: Challenge response */\n    MEMCPY(p, l2tp->challenge_hash, sizeof(l2tp->challenge_hash)); /* Attribute value: Computed challenge */\n    INCPTR(sizeof(l2tp->challenge_hash), p);\n  }\n#endif /* PPPOL2TP_AUTH_SUPPORT */\n\n  return pppol2tp_udp_send(l2tp, pb);\n}\n\n/* Initiate a new session */\nstatic err_t pppol2tp_send_icrq(pppol2tp_pcb *l2tp, u16_t ns) {\n  struct pbuf *pb;\n  u8_t *p;\n  u16_t len;\n  u32_t serialnumber;\n\n  /* calculate UDP packet length */\n  len = 12 +8 +8 +10;\n\n  /* allocate a buffer */\n  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);\n  if (pb == NULL) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n\n  p = (u8_t*)pb->payload;\n  /* fill in pkt */\n  /* L2TP control header */\n  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);\n  PUTSHORT(len, p); /* Length */\n  PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */\n  PUTSHORT(0, p); /* Session Id */\n  PUTSHORT(ns, p); /* NS Sequence number - to peer */\n  PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */\n\n  /* AVP - Message type */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p); /* Attribute type: Message Type */\n  PUTSHORT(PPPOL2TP_MESSAGETYPE_ICRQ, p); /* Attribute value: Message type: ICRQ */\n\n  /* AVP - Assign session ID */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_SESSIONID, p); /* Attribute type: Session ID */\n  PUTSHORT(l2tp->remote_session_id, p); /* Attribute value: Session ID */\n\n  /* AVP - Call Serial Number */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_CALLSERIALNUMBER, p); /* Attribute type: Serial number */\n  serialnumber = magic();\n  PUTLONG(serialnumber, p); /* Attribute value: Serial number */\n\n  return pppol2tp_udp_send(l2tp, pb);\n}\n\n/* Complete tunnel establishment */\nstatic err_t pppol2tp_send_iccn(pppol2tp_pcb *l2tp, u16_t ns) {\n  struct pbuf *pb;\n  u8_t *p;\n  u16_t len;\n\n  /* calculate UDP packet length */\n  len = 12 +8 +10 +10;\n\n  /* allocate a buffer */\n  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);\n  if (pb == NULL) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n\n  p = (u8_t*)pb->payload;\n  /* fill in pkt */\n  /* L2TP control header */\n  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);\n  PUTSHORT(len, p); /* Length */\n  PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */\n  PUTSHORT(l2tp->source_session_id, p); /* Session Id */\n  PUTSHORT(ns, p); /* NS Sequence number - to peer */\n  PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */\n\n  /* AVP - Message type */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p); /* Attribute type: Message Type */\n  PUTSHORT(PPPOL2TP_MESSAGETYPE_ICCN, p); /* Attribute value: Message type: ICCN */\n\n  /* AVP - Framing type */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_FRAMINGTYPE, p); /* Attribute type: Framing type */\n  PUTLONG(PPPOL2TP_FRAMINGTYPE, p); /* Attribute value: Framing type */\n\n  /* AVP - TX Connect speed */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 10, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_TXCONNECTSPEED, p); /* Attribute type: TX Connect speed */\n  PUTLONG(PPPOL2TP_TXCONNECTSPEED, p); /* Attribute value: TX Connect speed */\n\n  return pppol2tp_udp_send(l2tp, pb);\n}\n\n/* Send a ZLB ACK packet */\nstatic err_t pppol2tp_send_zlb(pppol2tp_pcb *l2tp, u16_t ns) {\n  struct pbuf *pb;\n  u8_t *p;\n  u16_t len;\n\n  /* calculate UDP packet length */\n  len = 12;\n\n  /* allocate a buffer */\n  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);\n  if (pb == NULL) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n\n  p = (u8_t*)pb->payload;\n  /* fill in pkt */\n  /* L2TP control header */\n  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);\n  PUTSHORT(len, p); /* Length */\n  PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */\n  PUTSHORT(0, p); /* Session Id */\n  PUTSHORT(ns, p); /* NS Sequence number - to peer */\n  PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */\n\n  return pppol2tp_udp_send(l2tp, pb);\n}\n\n/* Send a StopCCN packet */\nstatic err_t pppol2tp_send_stopccn(pppol2tp_pcb *l2tp, u16_t ns) {\n  struct pbuf *pb;\n  u8_t *p;\n  u16_t len;\n\n  /* calculate UDP packet length */\n  len = 12 +8 +8 +8;\n\n  /* allocate a buffer */\n  pb = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_RAM);\n  if (pb == NULL) {\n    return ERR_MEM;\n  }\n  LWIP_ASSERT(\"pb->tot_len == pb->len\", pb->tot_len == pb->len);\n\n  p = (u8_t*)pb->payload;\n  /* fill in pkt */\n  /* L2TP control header */\n  PUTSHORT(PPPOL2TP_HEADERFLAG_CONTROL_MANDATORY, p);\n  PUTSHORT(len, p); /* Length */\n  PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */\n  PUTSHORT(0, p); /* Session Id */\n  PUTSHORT(ns, p); /* NS Sequence number - to peer */\n  PUTSHORT(l2tp->peer_ns+1, p); /* NR Sequence number - expected for peer */\n\n  /* AVP - Message type */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_MESSAGE, p); /* Attribute type: Message Type */\n  PUTSHORT(PPPOL2TP_MESSAGETYPE_STOPCCN, p); /* Attribute value: Message type: StopCCN */\n\n  /* AVP - Assign tunnel ID */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_TUNNELID, p); /* Attribute type: Tunnel ID */\n  PUTSHORT(l2tp->remote_tunnel_id, p); /* Attribute value: Tunnel ID */\n\n  /* AVP - Result code */\n  PUTSHORT(PPPOL2TP_AVPHEADERFLAG_MANDATORY + 8, p); /* Mandatory flag + len field */\n  PUTSHORT(0, p); /* Vendor ID */\n  PUTSHORT(PPPOL2TP_AVPTYPE_RESULTCODE, p); /* Attribute type: Result code */\n  PUTSHORT(PPPOL2TP_RESULTCODE, p); /* Attribute value: Result code */\n\n  return pppol2tp_udp_send(l2tp, pb);\n}\n\nstatic err_t pppol2tp_xmit(pppol2tp_pcb *l2tp, struct pbuf *pb) {\n  u8_t *p;\n\n  /* make room for L2TP header - should not fail */\n  if (pbuf_header(pb, (s16_t)PPPOL2TP_OUTPUT_DATA_HEADER_LEN) != 0) {\n    /* bail out */\n    PPPDEBUG(LOG_ERR, (\"pppol2tp: pppol2tp_pcb: could not allocate room for L2TP header\\n\"));\n    LINK_STATS_INC(link.lenerr);\n    pbuf_free(pb);\n    return ERR_BUF;\n  }\n\n  p = (u8_t*)pb->payload;\n  PUTSHORT(PPPOL2TP_HEADERFLAG_DATA_MANDATORY, p);\n  PUTSHORT(l2tp->source_tunnel_id, p); /* Tunnel Id */\n  PUTSHORT(l2tp->source_session_id, p); /* Session Id */\n\n  return pppol2tp_udp_send(l2tp, pb);\n}\n\nstatic err_t pppol2tp_udp_send(pppol2tp_pcb *l2tp, struct pbuf *pb) {\n  err_t err;\n  if (l2tp->netif) {\n    err = udp_sendto_if(l2tp->udp, pb, &l2tp->remote_ip, l2tp->tunnel_port, l2tp->netif);\n  } else {\n    err = udp_sendto(l2tp->udp, pb, &l2tp->remote_ip, l2tp->tunnel_port);\n  }\n  pbuf_free(pb);\n  return err;\n}\n\n#endif /* PPP_SUPPORT && PPPOL2TP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/pppos.c",
    "content": "/**\n * @file\n * Network Point to Point Protocol over Serial file.\n *\n */\n\n/*\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PPPOS_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#include <string.h>\n\n#include \"lwip/arch.h\"\n#include \"lwip/err.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/memp.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/snmp.h\"\n#include \"lwip/priv/tcpip_priv.h\"\n#include \"lwip/api.h\"\n#include \"lwip/ip4.h\" /* for ip4_input() */\n\n#include \"netif/ppp/ppp_impl.h\"\n#include \"netif/ppp/pppos.h\"\n#include \"netif/ppp/vj.h\"\n\n/* Memory pool */\nLWIP_MEMPOOL_DECLARE(PPPOS_PCB, MEMP_NUM_PPPOS_INTERFACES, sizeof(pppos_pcb), \"PPPOS_PCB\")\n\n/* callbacks called from PPP core */\nstatic err_t pppos_write(ppp_pcb *ppp, void *ctx, struct pbuf *p);\nstatic err_t pppos_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *pb, u16_t protocol);\nstatic void pppos_connect(ppp_pcb *ppp, void *ctx);\n#if PPP_SERVER\nstatic void pppos_listen(ppp_pcb *ppp, void *ctx);\n#endif /* PPP_SERVER */\nstatic void pppos_disconnect(ppp_pcb *ppp, void *ctx);\nstatic err_t pppos_destroy(ppp_pcb *ppp, void *ctx);\nstatic void pppos_send_config(ppp_pcb *ppp, void *ctx, u32_t accm, int pcomp, int accomp);\nstatic void pppos_recv_config(ppp_pcb *ppp, void *ctx, u32_t accm, int pcomp, int accomp);\n\n/* Prototypes for procedures local to this file. */\n#if PPP_INPROC_IRQ_SAFE\nstatic void pppos_input_callback(void *arg);\n#endif /* PPP_INPROC_IRQ_SAFE */\nstatic void pppos_input_free_current_packet(pppos_pcb *pppos);\nstatic void pppos_input_drop(pppos_pcb *pppos);\nstatic err_t pppos_output_append(pppos_pcb *pppos, err_t err, struct pbuf *nb, u8_t c, u8_t accm, u16_t *fcs);\nstatic err_t pppos_output_last(pppos_pcb *pppos, err_t err, struct pbuf *nb, u16_t *fcs);\n\n/* Callbacks structure for PPP core */\nstatic const struct link_callbacks pppos_callbacks = {\n  pppos_connect,\n#if PPP_SERVER\n  pppos_listen,\n#endif /* PPP_SERVER */\n  pppos_disconnect,\n  pppos_destroy,\n  pppos_write,\n  pppos_netif_output,\n  pppos_send_config,\n  pppos_recv_config\n};\n\n/* PPP's Asynchronous-Control-Character-Map.  The mask array is used\n * to select the specific bit for a character. */\n#define ESCAPE_P(accm, c) ((accm)[(c) >> 3] & 1 << (c & 0x07))\n\n#if PPP_FCS_TABLE\n/*\n * FCS lookup table as calculated by genfcstab.\n */\nstatic const u16_t fcstab[256] = {\n  0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,\n  0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,\n  0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,\n  0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,\n  0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,\n  0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,\n  0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,\n  0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,\n  0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,\n  0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,\n  0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,\n  0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,\n  0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,\n  0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,\n  0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,\n  0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,\n  0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,\n  0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,\n  0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,\n  0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,\n  0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,\n  0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,\n  0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,\n  0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,\n  0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,\n  0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,\n  0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,\n  0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,\n  0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,\n  0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,\n  0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,\n  0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78\n};\n#define PPP_FCS(fcs, c) (((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])\n#else /* PPP_FCS_TABLE */\n/* The HDLC polynomial: X**0 + X**5 + X**12 + X**16 (0x8408) */\n#define PPP_FCS_POLYNOMIAL 0x8408\nstatic u16_t\nppp_get_fcs(u8_t byte)\n{\n  unsigned int octet;\n  int bit;\n  octet = byte;\n  for (bit = 8; bit-- > 0; ) {\n    octet = (octet & 0x01) ? ((octet >> 1) ^ PPP_FCS_POLYNOMIAL) : (octet >> 1);\n  }\n  return octet & 0xffff;\n}\n#define PPP_FCS(fcs, c) (((fcs) >> 8) ^ ppp_get_fcs(((fcs) ^ (c)) & 0xff))\n#endif /* PPP_FCS_TABLE */\n\n/*\n * Values for FCS calculations.\n */\n#define PPP_INITFCS     0xffff  /* Initial FCS value */\n#define PPP_GOODFCS     0xf0b8  /* Good final FCS value */\n\n#if PPP_INPROC_IRQ_SAFE\n#define PPPOS_DECL_PROTECT(lev) SYS_ARCH_DECL_PROTECT(lev)\n#define PPPOS_PROTECT(lev) SYS_ARCH_PROTECT(lev)\n#define PPPOS_UNPROTECT(lev) SYS_ARCH_UNPROTECT(lev)\n#else\n#define PPPOS_DECL_PROTECT(lev)\n#define PPPOS_PROTECT(lev)\n#define PPPOS_UNPROTECT(lev)\n#endif /* PPP_INPROC_IRQ_SAFE */\n\n\n/*\n * Create a new PPP connection using the given serial I/O device.\n *\n * Return 0 on success, an error code on failure.\n */\nppp_pcb *pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb,\n       ppp_link_status_cb_fn link_status_cb, void *ctx_cb)\n{\n  pppos_pcb *pppos;\n  ppp_pcb *ppp;\n\n  pppos = (pppos_pcb *)LWIP_MEMPOOL_ALLOC(PPPOS_PCB);\n  if (pppos == NULL) {\n    return NULL;\n  }\n\n  ppp = ppp_new(pppif, &pppos_callbacks, pppos, link_status_cb, ctx_cb);\n  if (ppp == NULL) {\n    LWIP_MEMPOOL_FREE(PPPOS_PCB, pppos);\n    return NULL;\n  }\n\n  memset(pppos, 0, sizeof(pppos_pcb));\n  pppos->ppp = ppp;\n  pppos->output_cb = output_cb;\n  return ppp;\n}\n\n/* Called by PPP core */\nstatic err_t\npppos_write(ppp_pcb *ppp, void *ctx, struct pbuf *p)\n{\n  pppos_pcb *pppos = (pppos_pcb *)ctx;\n  u8_t *s;\n  struct pbuf *nb;\n  u16_t n;\n  u16_t fcs_out;\n  err_t err;\n  LWIP_UNUSED_ARG(ppp);\n\n  /* Grab an output buffer. */\n  nb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);\n  if (nb == NULL) {\n    PPPDEBUG(LOG_WARNING, (\"pppos_write[%d]: alloc fail\\n\", ppp->netif->num));\n    LINK_STATS_INC(link.memerr);\n    LINK_STATS_INC(link.drop);\n    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n    pbuf_free(p);\n    return ERR_MEM;\n  }\n\n  /* If the link has been idle, we'll send a fresh flag character to\n   * flush any noise. */\n  err = ERR_OK;\n  if ((sys_now() - pppos->last_xmit) >= PPP_MAXIDLEFLAG) {\n    err = pppos_output_append(pppos, err,  nb, PPP_FLAG, 0, NULL);\n  }\n\n  /* Load output buffer. */\n  fcs_out = PPP_INITFCS;\n  s = (u8_t*)p->payload;\n  n = p->len;\n  while (n-- > 0) {\n    err = pppos_output_append(pppos, err,  nb, *s++, 1, &fcs_out);\n  }\n\n  err = pppos_output_last(pppos, err, nb, &fcs_out);\n  if (err == ERR_OK) {\n    PPPDEBUG(LOG_INFO, (\"pppos_write[%d]: len=%d\\n\", ppp->netif->num, p->len));\n  } else {\n    PPPDEBUG(LOG_WARNING, (\"pppos_write[%d]: output failed len=%d\\n\", ppp->netif->num, p->len));\n  }\n  pbuf_free(p);\n  return err;\n}\n\n/* Called by PPP core */\nstatic err_t\npppos_netif_output(ppp_pcb *ppp, void *ctx, struct pbuf *pb, u16_t protocol)\n{\n  pppos_pcb *pppos = (pppos_pcb *)ctx;\n  struct pbuf *nb, *p;\n  u16_t fcs_out;\n  err_t err;\n  LWIP_UNUSED_ARG(ppp);\n\n  /* Grab an output buffer. */\n  nb = pbuf_alloc(PBUF_RAW, 0, PBUF_POOL);\n  if (nb == NULL) {\n    PPPDEBUG(LOG_WARNING, (\"pppos_netif_output[%d]: alloc fail\\n\", ppp->netif->num));\n    LINK_STATS_INC(link.memerr);\n    LINK_STATS_INC(link.drop);\n    MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n    return ERR_MEM;\n  }\n\n  /* If the link has been idle, we'll send a fresh flag character to\n   * flush any noise. */\n  err = ERR_OK;\n  if ((sys_now() - pppos->last_xmit) >= PPP_MAXIDLEFLAG) {\n    err = pppos_output_append(pppos, err,  nb, PPP_FLAG, 0, NULL);\n  }\n\n  fcs_out = PPP_INITFCS;\n  if (!pppos->accomp) {\n    err = pppos_output_append(pppos, err,  nb, PPP_ALLSTATIONS, 1, &fcs_out);\n    err = pppos_output_append(pppos, err,  nb, PPP_UI, 1, &fcs_out);\n  }\n  if (!pppos->pcomp || protocol > 0xFF) {\n    err = pppos_output_append(pppos, err,  nb, (protocol >> 8) & 0xFF, 1, &fcs_out);\n  }\n  err = pppos_output_append(pppos, err,  nb, protocol & 0xFF, 1, &fcs_out);\n\n  /* Load packet. */\n  for(p = pb; p; p = p->next) {\n    u16_t n = p->len;\n    u8_t *s = (u8_t*)p->payload;\n\n    while (n-- > 0) {\n      err = pppos_output_append(pppos, err,  nb, *s++, 1, &fcs_out);\n    }\n  }\n\n  err = pppos_output_last(pppos, err, nb, &fcs_out);\n  if (err == ERR_OK) {\n    PPPDEBUG(LOG_INFO, (\"pppos_netif_output[%d]: proto=0x%\"X16_F\", len = %d\\n\", ppp->netif->num, protocol, pb->tot_len));\n  } else {\n    PPPDEBUG(LOG_WARNING, (\"pppos_netif_output[%d]: output failed proto=0x%\"X16_F\", len = %d\\n\", ppp->netif->num, protocol, pb->tot_len));\n  }\n  return err;\n}\n\nstatic void\npppos_connect(ppp_pcb *ppp, void *ctx)\n{\n  pppos_pcb *pppos = (pppos_pcb *)ctx;\n  PPPOS_DECL_PROTECT(lev);\n\n#if PPP_INPROC_IRQ_SAFE\n  /* input pbuf left over from last session? */\n  pppos_input_free_current_packet(pppos);\n#endif /* PPP_INPROC_IRQ_SAFE */\n\n  /* reset PPPoS control block to its initial state */\n  memset(&pppos->last_xmit, 0, sizeof(pppos_pcb) - offsetof(pppos_pcb, last_xmit));\n\n  /*\n   * Default the in and out accm so that escape and flag characters\n   * are always escaped.\n   */\n  pppos->in_accm[15] = 0x60; /* no need to protect since RX is not running */\n  pppos->out_accm[15] = 0x60;\n  PPPOS_PROTECT(lev);\n  pppos->open = 1;\n  PPPOS_UNPROTECT(lev);\n\n  /*\n   * Start the connection and handle incoming events (packet or timeout).\n   */\n  PPPDEBUG(LOG_INFO, (\"pppos_connect: unit %d: connecting\\n\", ppp->netif->num));\n  ppp_start(ppp); /* notify upper layers */\n}\n\n#if PPP_SERVER\nstatic void\npppos_listen(ppp_pcb *ppp, void *ctx)\n{\n  pppos_pcb *pppos = (pppos_pcb *)ctx;\n  PPPOS_DECL_PROTECT(lev);\n\n#if PPP_INPROC_IRQ_SAFE\n  /* input pbuf left over from last session? */\n  pppos_input_free_current_packet(pppos);\n#endif /* PPP_INPROC_IRQ_SAFE */\n\n  /* reset PPPoS control block to its initial state */\n  memset(&pppos->last_xmit, 0, sizeof(pppos_pcb) - offsetof(pppos_pcb, last_xmit));\n\n  /*\n   * Default the in and out accm so that escape and flag characters\n   * are always escaped.\n   */\n  pppos->in_accm[15] = 0x60; /* no need to protect since RX is not running */\n  pppos->out_accm[15] = 0x60;\n  PPPOS_PROTECT(lev);\n  pppos->open = 1;\n  PPPOS_UNPROTECT(lev);\n\n  /*\n   * Wait for something to happen.\n   */\n  PPPDEBUG(LOG_INFO, (\"pppos_listen: unit %d: listening\\n\", ppp->netif->num));\n  ppp_start(ppp); /* notify upper layers */\n}\n#endif /* PPP_SERVER */\n\nstatic void\npppos_disconnect(ppp_pcb *ppp, void *ctx)\n{\n  pppos_pcb *pppos = (pppos_pcb *)ctx;\n  PPPOS_DECL_PROTECT(lev);\n\n  PPPOS_PROTECT(lev);\n  pppos->open = 0;\n  PPPOS_UNPROTECT(lev);\n\n  /* If PPP_INPROC_IRQ_SAFE is used we cannot call\n   * pppos_input_free_current_packet() here because\n   * rx IRQ might still call pppos_input().\n   */\n#if !PPP_INPROC_IRQ_SAFE\n  /* input pbuf left ? */\n  pppos_input_free_current_packet(pppos);\n#endif /* !PPP_INPROC_IRQ_SAFE */\n\n  ppp_link_end(ppp); /* notify upper layers */\n}\n\nstatic err_t\npppos_destroy(ppp_pcb *ppp, void *ctx)\n{\n  pppos_pcb *pppos = (pppos_pcb *)ctx;\n  LWIP_UNUSED_ARG(ppp);\n\n#if PPP_INPROC_IRQ_SAFE\n  /* input pbuf left ? */\n  pppos_input_free_current_packet(pppos);\n#endif /* PPP_INPROC_IRQ_SAFE */\n\n  LWIP_MEMPOOL_FREE(PPPOS_PCB, pppos);\n  return ERR_OK;\n}\n\n#if !NO_SYS && !PPP_INPROC_IRQ_SAFE\n/** Pass received raw characters to PPPoS to be decoded through lwIP TCPIP thread.\n *\n * @param ppp PPP descriptor index, returned by pppos_create()\n * @param s received data\n * @param l length of received data\n */\nerr_t\npppos_input_tcpip(ppp_pcb *ppp, u8_t *s, int l)\n{\n  struct pbuf *p;\n  err_t err;\n\n  p = pbuf_alloc(PBUF_RAW, l, PBUF_POOL);\n  if (!p) {\n    return ERR_MEM;\n  }\n  pbuf_take(p, s, l);\n\n  err = tcpip_inpkt(p, ppp_netif(ppp), pppos_input_sys);\n  if (err != ERR_OK) {\n     pbuf_free(p);\n  }\n  return err;\n}\n\n/* called from TCPIP thread */\nerr_t pppos_input_sys(struct pbuf *p, struct netif *inp) {\n  ppp_pcb *ppp = (ppp_pcb*)inp->state;\n  struct pbuf *n;\n\n  for (n = p; n; n = n->next) {\n    pppos_input(ppp, (u8_t*)n->payload, n->len);\n  }\n  pbuf_free(p);\n  return ERR_OK;\n}\n#endif /* !NO_SYS && !PPP_INPROC_IRQ_SAFE */\n\n/** PPPoS input helper struct, must be packed since it is stored\n * to pbuf->payload, which might be unaligned. */\n#if PPP_INPROC_IRQ_SAFE\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct pppos_input_header {\n  PACK_STRUCT_FIELD(ppp_pcb *ppp);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n#endif /* PPP_INPROC_IRQ_SAFE */\n\n/** Pass received raw characters to PPPoS to be decoded.\n *\n * @param ppp PPP descriptor index, returned by pppos_create()\n * @param s received data\n * @param l length of received data\n */\nvoid\npppos_input(ppp_pcb *ppp, u8_t *s, int l)\n{\n  pppos_pcb *pppos = (pppos_pcb *)ppp->link_ctx_cb;\n  struct pbuf *next_pbuf;\n  u8_t cur_char;\n  u8_t escaped;\n  PPPOS_DECL_PROTECT(lev);\n\n  PPPDEBUG(LOG_DEBUG, (\"pppos_input[%d]: got %d bytes\\n\", ppp->netif->num, l));\n  while (l-- > 0) {\n    cur_char = *s++;\n\n    PPPOS_PROTECT(lev);\n    /* ppp_input can disconnect the interface, we need to abort to prevent a memory\n     * leak if there are remaining bytes because pppos_connect and pppos_listen\n     * functions expect input buffer to be free. Furthermore there are no real\n     * reason to continue reading bytes if we are disconnected.\n     */\n    if (!pppos->open) {\n      PPPOS_UNPROTECT(lev);\n      return;\n    }\n    escaped = ESCAPE_P(pppos->in_accm, cur_char);\n    PPPOS_UNPROTECT(lev);\n    /* Handle special characters. */\n    if (escaped) {\n      /* Check for escape sequences. */\n      /* XXX Note that this does not handle an escaped 0x5d character which\n       * would appear as an escape character.  Since this is an ASCII ']'\n       * and there is no reason that I know of to escape it, I won't complicate\n       * the code to handle this case. GLL */\n      if (cur_char == PPP_ESCAPE) {\n        pppos->in_escaped = 1;\n      /* Check for the flag character. */\n      } else if (cur_char == PPP_FLAG) {\n        /* If this is just an extra flag character, ignore it. */\n        if (pppos->in_state <= PDADDRESS) {\n          /* ignore it */;\n        /* If we haven't received the packet header, drop what has come in. */\n        } else if (pppos->in_state < PDDATA) {\n          PPPDEBUG(LOG_WARNING,\n                   (\"pppos_input[%d]: Dropping incomplete packet %d\\n\",\n                    ppp->netif->num, pppos->in_state));\n          LINK_STATS_INC(link.lenerr);\n          pppos_input_drop(pppos);\n        /* If the fcs is invalid, drop the packet. */\n        } else if (pppos->in_fcs != PPP_GOODFCS) {\n          PPPDEBUG(LOG_INFO,\n                   (\"pppos_input[%d]: Dropping bad fcs 0x%\"X16_F\" proto=0x%\"X16_F\"\\n\",\n                    ppp->netif->num, pppos->in_fcs, pppos->in_protocol));\n          /* Note: If you get lots of these, check for UART frame errors or try different baud rate */\n          LINK_STATS_INC(link.chkerr);\n          pppos_input_drop(pppos);\n        /* Otherwise it's a good packet so pass it on. */\n        } else {\n          struct pbuf *inp;\n          /* Trim off the checksum. */\n          if(pppos->in_tail->len > 2) {\n            pppos->in_tail->len -= 2;\n\n            pppos->in_tail->tot_len = pppos->in_tail->len;\n            if (pppos->in_tail != pppos->in_head) {\n              pbuf_cat(pppos->in_head, pppos->in_tail);\n            }\n          } else {\n            pppos->in_tail->tot_len = pppos->in_tail->len;\n            if (pppos->in_tail != pppos->in_head) {\n              pbuf_cat(pppos->in_head, pppos->in_tail);\n            }\n\n            pbuf_realloc(pppos->in_head, pppos->in_head->tot_len - 2);\n          }\n\n          /* Dispatch the packet thereby consuming it. */\n          inp = pppos->in_head;\n          /* Packet consumed, release our references. */\n          pppos->in_head = NULL;\n          pppos->in_tail = NULL;\n#if IP_FORWARD || LWIP_IPV6_FORWARD\n          /* hide the room for Ethernet forwarding header */\n          pbuf_header(inp, -(s16_t)(PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN));\n#endif /* IP_FORWARD || LWIP_IPV6_FORWARD */\n#if PPP_INPROC_IRQ_SAFE\n          if(tcpip_callback_with_block(pppos_input_callback, inp, 0) != ERR_OK) {\n            PPPDEBUG(LOG_ERR, (\"pppos_input[%d]: tcpip_callback() failed, dropping packet\\n\", ppp->netif->num));\n            pbuf_free(inp);\n            LINK_STATS_INC(link.drop);\n            MIB2_STATS_NETIF_INC(ppp->netif, ifindiscards);\n          }\n#else /* PPP_INPROC_IRQ_SAFE */\n          ppp_input(ppp, inp);\n#endif /* PPP_INPROC_IRQ_SAFE */\n        }\n\n        /* Prepare for a new packet. */\n        pppos->in_fcs = PPP_INITFCS;\n        pppos->in_state = PDADDRESS;\n        pppos->in_escaped = 0;\n      /* Other characters are usually control characters that may have\n       * been inserted by the physical layer so here we just drop them. */\n      } else {\n        PPPDEBUG(LOG_WARNING,\n                 (\"pppos_input[%d]: Dropping ACCM char <%d>\\n\", ppp->netif->num, cur_char));\n      }\n    /* Process other characters. */\n    } else {\n      /* Unencode escaped characters. */\n      if (pppos->in_escaped) {\n        pppos->in_escaped = 0;\n        cur_char ^= PPP_TRANS;\n      }\n\n      /* Process character relative to current state. */\n      switch(pppos->in_state) {\n        case PDIDLE:                    /* Idle state - waiting. */\n          /* Drop the character if it's not 0xff\n           * we would have processed a flag character above. */\n          if (cur_char != PPP_ALLSTATIONS) {\n            break;\n          }\n          /* no break */\n          /* Fall through */\n\n        case PDSTART:                   /* Process start flag. */\n          /* Prepare for a new packet. */\n          pppos->in_fcs = PPP_INITFCS;\n          /* no break */\n          /* Fall through */\n\n        case PDADDRESS:                 /* Process address field. */\n          if (cur_char == PPP_ALLSTATIONS) {\n            pppos->in_state = PDCONTROL;\n            break;\n          }\n          /* no break */\n\n          /* Else assume compressed address and control fields so\n           * fall through to get the protocol... */\n        case PDCONTROL:                 /* Process control field. */\n          /* If we don't get a valid control code, restart. */\n          if (cur_char == PPP_UI) {\n            pppos->in_state = PDPROTOCOL1;\n            break;\n          }\n          /* no break */\n\n#if 0\n          else {\n            PPPDEBUG(LOG_WARNING,\n                     (\"pppos_input[%d]: Invalid control <%d>\\n\", ppp->netif->num, cur_char));\n            pppos->in_state = PDSTART;\n          }\n#endif\n        case PDPROTOCOL1:               /* Process protocol field 1. */\n          /* If the lower bit is set, this is the end of the protocol\n           * field. */\n          if (cur_char & 1) {\n            pppos->in_protocol = cur_char;\n            pppos->in_state = PDDATA;\n          } else {\n            pppos->in_protocol = (u16_t)cur_char << 8;\n            pppos->in_state = PDPROTOCOL2;\n          }\n          break;\n        case PDPROTOCOL2:               /* Process protocol field 2. */\n          pppos->in_protocol |= cur_char;\n          pppos->in_state = PDDATA;\n          break;\n        case PDDATA:                    /* Process data byte. */\n          /* Make space to receive processed data. */\n          if (pppos->in_tail == NULL || pppos->in_tail->len == PBUF_POOL_BUFSIZE) {\n            u16_t pbuf_alloc_len;\n            if (pppos->in_tail != NULL) {\n              pppos->in_tail->tot_len = pppos->in_tail->len;\n              if (pppos->in_tail != pppos->in_head) {\n                pbuf_cat(pppos->in_head, pppos->in_tail);\n                /* give up the in_tail reference now */\n                pppos->in_tail = NULL;\n              }\n            }\n            /* If we haven't started a packet, we need a packet header. */\n            pbuf_alloc_len = 0;\n#if IP_FORWARD || LWIP_IPV6_FORWARD\n            /* If IP forwarding is enabled we are reserving PBUF_LINK_ENCAPSULATION_HLEN\n             * + PBUF_LINK_HLEN bytes so the packet is being allocated with enough header\n             * space to be forwarded (to Ethernet for example).\n             */\n            if (pppos->in_head == NULL) {\n              pbuf_alloc_len = PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN;\n            }\n#endif /* IP_FORWARD || LWIP_IPV6_FORWARD */\n            next_pbuf = pbuf_alloc(PBUF_RAW, pbuf_alloc_len, PBUF_POOL);\n            if (next_pbuf == NULL) {\n              /* No free buffers.  Drop the input packet and let the\n               * higher layers deal with it.  Continue processing\n               * the received pbuf chain in case a new packet starts. */\n              PPPDEBUG(LOG_ERR, (\"pppos_input[%d]: NO FREE PBUFS!\\n\", ppp->netif->num));\n              LINK_STATS_INC(link.memerr);\n              pppos_input_drop(pppos);\n              pppos->in_state = PDSTART;  /* Wait for flag sequence. */\n              break;\n            }\n            if (pppos->in_head == NULL) {\n              u8_t *payload = ((u8_t*)next_pbuf->payload) + pbuf_alloc_len;\n#if PPP_INPROC_IRQ_SAFE\n              ((struct pppos_input_header*)payload)->ppp = ppp;\n              payload += sizeof(struct pppos_input_header);\n              next_pbuf->len += sizeof(struct pppos_input_header);\n#endif /* PPP_INPROC_IRQ_SAFE */\n              next_pbuf->len += sizeof(pppos->in_protocol);\n              *(payload++) = pppos->in_protocol >> 8;\n              *(payload) = pppos->in_protocol & 0xFF;\n              pppos->in_head = next_pbuf;\n            }\n            pppos->in_tail = next_pbuf;\n          }\n          /* Load character into buffer. */\n          ((u8_t*)pppos->in_tail->payload)[pppos->in_tail->len++] = cur_char;\n          break;\n        default:\n          break;\n      }\n\n      /* update the frame check sequence number. */\n      pppos->in_fcs = PPP_FCS(pppos->in_fcs, cur_char);\n    }\n  } /* while (l-- > 0), all bytes processed */\n}\n\n#if PPP_INPROC_IRQ_SAFE\n/* PPPoS input callback using one input pointer\n */\nstatic void pppos_input_callback(void *arg) {\n  struct pbuf *pb = (struct pbuf*)arg;\n  ppp_pcb *ppp;\n\n  ppp = ((struct pppos_input_header*)pb->payload)->ppp;\n  if(pbuf_header(pb, -(s16_t)sizeof(struct pppos_input_header))) {\n    LWIP_ASSERT(\"pbuf_header failed\\n\", 0);\n    goto drop;\n  }\n\n  /* Dispatch the packet thereby consuming it. */\n  ppp_input(ppp, pb);\n  return;\n\ndrop:\n  LINK_STATS_INC(link.drop);\n  MIB2_STATS_NETIF_INC(ppp->netif, ifindiscards);\n  pbuf_free(pb);\n}\n#endif /* PPP_INPROC_IRQ_SAFE */\n\nstatic void\npppos_send_config(ppp_pcb *ppp, void *ctx, u32_t accm, int pcomp, int accomp)\n{\n  int i;\n  pppos_pcb *pppos = (pppos_pcb *)ctx;\n  LWIP_UNUSED_ARG(ppp);\n\n  pppos->pcomp = pcomp;\n  pppos->accomp = accomp;\n\n  /* Load the ACCM bits for the 32 control codes. */\n  for (i = 0; i < 32/8; i++) {\n    pppos->out_accm[i] = (u8_t)((accm >> (8 * i)) & 0xFF);\n  }\n\n  PPPDEBUG(LOG_INFO, (\"pppos_send_config[%d]: out_accm=%X %X %X %X\\n\",\n            pppos->ppp->netif->num,\n            pppos->out_accm[0], pppos->out_accm[1], pppos->out_accm[2], pppos->out_accm[3]));\n}\n\nstatic void\npppos_recv_config(ppp_pcb *ppp, void *ctx, u32_t accm, int pcomp, int accomp)\n{\n  int i;\n  pppos_pcb *pppos = (pppos_pcb *)ctx;\n  PPPOS_DECL_PROTECT(lev);\n  LWIP_UNUSED_ARG(ppp);\n  LWIP_UNUSED_ARG(pcomp);\n  LWIP_UNUSED_ARG(accomp);\n\n  /* Load the ACCM bits for the 32 control codes. */\n  PPPOS_PROTECT(lev);\n  for (i = 0; i < 32 / 8; i++) {\n    pppos->in_accm[i] = (u8_t)(accm >> (i * 8));\n  }\n  PPPOS_UNPROTECT(lev);\n\n  PPPDEBUG(LOG_INFO, (\"pppos_recv_config[%d]: in_accm=%X %X %X %X\\n\",\n            pppos->ppp->netif->num,\n            pppos->in_accm[0], pppos->in_accm[1], pppos->in_accm[2], pppos->in_accm[3]));\n}\n\n/*\n * Drop the input packet.\n */\nstatic void\npppos_input_free_current_packet(pppos_pcb *pppos)\n{\n  if (pppos->in_head != NULL) {\n    if (pppos->in_tail && (pppos->in_tail != pppos->in_head)) {\n      pbuf_free(pppos->in_tail);\n    }\n    pbuf_free(pppos->in_head);\n    pppos->in_head = NULL;\n  }\n  pppos->in_tail = NULL;\n}\n\n/*\n * Drop the input packet and increase error counters.\n */\nstatic void\npppos_input_drop(pppos_pcb *pppos)\n{\n  if (pppos->in_head != NULL) {\n#if 0\n    PPPDEBUG(LOG_INFO, (\"pppos_input_drop: %d:%.*H\\n\", pppos->in_head->len, min(60, pppos->in_head->len * 2), pppos->in_head->payload));\n#endif\n    PPPDEBUG(LOG_INFO, (\"pppos_input_drop: pbuf len=%d, addr %p\\n\", pppos->in_head->len, (void*)pppos->in_head));\n  }\n  pppos_input_free_current_packet(pppos);\n#if VJ_SUPPORT\n  vj_uncompress_err(&pppos->ppp->vj_comp);\n#endif /* VJ_SUPPORT */\n\n  LINK_STATS_INC(link.drop);\n  MIB2_STATS_NETIF_INC(pppos->ppp->netif, ifindiscards);\n}\n\n/*\n * pppos_output_append - append given character to end of given pbuf.\n * If out_accm is not 0 and the character needs to be escaped, do so.\n * If pbuf is full, send the pbuf and reuse it.\n * Return the current pbuf.\n */\nstatic err_t\npppos_output_append(pppos_pcb *pppos, err_t err, struct pbuf *nb, u8_t c, u8_t accm, u16_t *fcs)\n{\n  if (err != ERR_OK) {\n    return err;\n  }\n\n  /* Make sure there is room for the character and an escape code.\n   * Sure we don't quite fill the buffer if the character doesn't\n   * get escaped but is one character worth complicating this? */\n  if ((PBUF_POOL_BUFSIZE - nb->len) < 2) {\n    u32_t l = pppos->output_cb(pppos->ppp, (u8_t*)nb->payload, nb->len, pppos->ppp->ctx_cb);\n    if (l != nb->len) {\n      return ERR_IF;\n    }\n    nb->len = 0;\n  }\n\n  /* Update FCS before checking for special characters. */\n  if (fcs) {\n    *fcs = PPP_FCS(*fcs, c);\n  }\n\n  /* Copy to output buffer escaping special characters. */\n  if (accm && ESCAPE_P(pppos->out_accm, c)) {\n    *((u8_t*)nb->payload + nb->len++) = PPP_ESCAPE;\n    *((u8_t*)nb->payload + nb->len++) = c ^ PPP_TRANS;\n  } else {\n    *((u8_t*)nb->payload + nb->len++) = c;\n  }\n\n  return ERR_OK;\n}\n\nstatic err_t\npppos_output_last(pppos_pcb *pppos, err_t err, struct pbuf *nb, u16_t *fcs)\n{\n  ppp_pcb *ppp = pppos->ppp;\n\n  /* Add FCS and trailing flag. */\n  err = pppos_output_append(pppos, err,  nb, ~(*fcs) & 0xFF, 1, NULL);\n  err = pppos_output_append(pppos, err,  nb, (~(*fcs) >> 8) & 0xFF, 1, NULL);\n  err = pppos_output_append(pppos, err,  nb, PPP_FLAG, 0, NULL);\n\n  if (err != ERR_OK) {\n    goto failed;\n  }\n\n  /* Send remaining buffer if not empty */\n  if (nb->len > 0) {\n    u32_t l = pppos->output_cb(ppp, (u8_t*)nb->payload, nb->len, ppp->ctx_cb);\n    if (l != nb->len) {\n      err = ERR_IF;\n      goto failed;\n    }\n  }\n\n  pppos->last_xmit = sys_now();\n  MIB2_STATS_NETIF_ADD(ppp->netif, ifoutoctets, nb->tot_len);\n  MIB2_STATS_NETIF_INC(ppp->netif, ifoutucastpkts);\n  LINK_STATS_INC(link.xmit);\n  pbuf_free(nb);\n  return ERR_OK;\n\nfailed:\n  pppos->last_xmit = 0; /* prepend PPP_FLAG to next packet */\n  LINK_STATS_INC(link.err);\n  LINK_STATS_INC(link.drop);\n  MIB2_STATS_NETIF_INC(ppp->netif, ifoutdiscards);\n  pbuf_free(nb);\n  return err;\n}\n\n#endif /* PPP_SUPPORT && PPPOS_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/upap.c",
    "content": "/*\n * upap.c - User/Password Authentication Protocol.\n *\n * Copyright (c) 1984-2000 Carnegie Mellon University. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n *\n * 3. The name \"Carnegie Mellon University\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For permission or any legal\n *    details, please contact\n *      Office of Technology Transfer\n *      Carnegie Mellon University\n *      5000 Forbes Avenue\n *      Pittsburgh, PA  15213-3890\n *      (412) 268-4387, fax: (412) 268-7395\n *      tech-transfer@andrew.cmu.edu\n *\n * 4. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Computing Services\n *     at Carnegie Mellon University (http://www.cmu.edu/computing/).\"\n *\n * CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE\n * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && PAP_SUPPORT  /* don't build if not configured for use in lwipopts.h */\n\n/*\n * @todo:\n */\n\n#if 0 /* UNUSED */\n#include <stdio.h>\n#include <string.h>\n#endif /* UNUSED */\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/upap.h\"\n\n#if PPP_OPTIONS\n/*\n * Command-line options.\n */\nstatic option_t pap_option_list[] = {\n    { \"hide-password\", o_bool, &hide_password,\n      \"Don't output passwords to log\", OPT_PRIO | 1 },\n    { \"show-password\", o_bool, &hide_password,\n      \"Show password string in debug log messages\", OPT_PRIOSUB | 0 },\n\n    { \"pap-restart\", o_int, &upap[0].us_timeouttime,\n      \"Set retransmit timeout for PAP\", OPT_PRIO },\n    { \"pap-max-authreq\", o_int, &upap[0].us_maxtransmits,\n      \"Set max number of transmissions for auth-reqs\", OPT_PRIO },\n    { \"pap-timeout\", o_int, &upap[0].us_reqtimeout,\n      \"Set time limit for peer PAP authentication\", OPT_PRIO },\n\n    { NULL }\n};\n#endif /* PPP_OPTIONS */\n\n/*\n * Protocol entry points.\n */\nstatic void upap_init(ppp_pcb *pcb);\nstatic void upap_lowerup(ppp_pcb *pcb);\nstatic void upap_lowerdown(ppp_pcb *pcb);\nstatic void upap_input(ppp_pcb *pcb, u_char *inpacket, int l);\nstatic void upap_protrej(ppp_pcb *pcb);\n#if PRINTPKT_SUPPORT\nstatic int upap_printpkt(const u_char *p, int plen, void (*printer) (void *, const char *, ...), void *arg);\n#endif /* PRINTPKT_SUPPORT */\n\nconst struct protent pap_protent = {\n    PPP_PAP,\n    upap_init,\n    upap_input,\n    upap_protrej,\n    upap_lowerup,\n    upap_lowerdown,\n    NULL,\n    NULL,\n#if PRINTPKT_SUPPORT\n    upap_printpkt,\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_DATAINPUT\n    NULL,\n#endif /* PPP_DATAINPUT */\n#if PRINTPKT_SUPPORT\n    \"PAP\",\n    NULL,\n#endif /* PRINTPKT_SUPPORT */\n#if PPP_OPTIONS\n    pap_option_list,\n    NULL,\n#endif /* PPP_OPTIONS */\n#if DEMAND_SUPPORT\n    NULL,\n    NULL\n#endif /* DEMAND_SUPPORT */\n};\n\nstatic void upap_timeout(void *arg);\n#if PPP_SERVER\nstatic void upap_reqtimeout(void *arg);\nstatic void upap_rauthreq(ppp_pcb *pcb, u_char *inp, int id, int len);\n#endif /* PPP_SERVER */\nstatic void upap_rauthack(ppp_pcb *pcb, u_char *inp, int id, int len);\nstatic void upap_rauthnak(ppp_pcb *pcb, u_char *inp, int id, int len);\nstatic void upap_sauthreq(ppp_pcb *pcb);\n#if PPP_SERVER\nstatic void upap_sresp(ppp_pcb *pcb, u_char code, u_char id, const char *msg, int msglen);\n#endif /* PPP_SERVER */\n\n\n/*\n * upap_init - Initialize a UPAP unit.\n */\nstatic void upap_init(ppp_pcb *pcb) {\n    pcb->upap.us_user = NULL;\n    pcb->upap.us_userlen = 0;\n    pcb->upap.us_passwd = NULL;\n    pcb->upap.us_passwdlen = 0;\n    pcb->upap.us_clientstate = UPAPCS_INITIAL;\n#if PPP_SERVER\n    pcb->upap.us_serverstate = UPAPSS_INITIAL;\n#endif /* PPP_SERVER */\n    pcb->upap.us_id = 0;\n}\n\n\n/*\n * upap_authwithpeer - Authenticate us with our peer (start client).\n *\n * Set new state and send authenticate's.\n */\nvoid upap_authwithpeer(ppp_pcb *pcb, const char *user, const char *password) {\n\n    if(!user || !password)\n        return;\n\n    /* Save the username and password we're given */\n    pcb->upap.us_user = user;\n    pcb->upap.us_userlen = LWIP_MIN(strlen(user), 0xff);\n    pcb->upap.us_passwd = password;\n    pcb->upap.us_passwdlen = LWIP_MIN(strlen(password), 0xff);\n    pcb->upap.us_transmits = 0;\n\n    /* Lower layer up yet? */\n    if (pcb->upap.us_clientstate == UPAPCS_INITIAL ||\n    pcb->upap.us_clientstate == UPAPCS_PENDING) {\n    pcb->upap.us_clientstate = UPAPCS_PENDING;\n    return;\n    }\n\n    upap_sauthreq(pcb);        /* Start protocol */\n}\n\n#if PPP_SERVER\n/*\n * upap_authpeer - Authenticate our peer (start server).\n *\n * Set new state.\n */\nvoid upap_authpeer(ppp_pcb *pcb) {\n\n    /* Lower layer up yet? */\n    if (pcb->upap.us_serverstate == UPAPSS_INITIAL ||\n    pcb->upap.us_serverstate == UPAPSS_PENDING) {\n    pcb->upap.us_serverstate = UPAPSS_PENDING;\n    return;\n    }\n\n    pcb->upap.us_serverstate = UPAPSS_LISTEN;\n    if (pcb->settings.pap_req_timeout > 0)\n    TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout);\n}\n#endif /* PPP_SERVER */\n\n/*\n * upap_timeout - Retransmission timer for sending auth-reqs expired.\n */\nstatic void upap_timeout(void *arg) {\n    ppp_pcb *pcb = (ppp_pcb*)arg;\n\n    if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ)\n    return;\n\n    if (pcb->upap.us_transmits >= pcb->settings.pap_max_transmits) {\n    /* give up in disgust */\n    ppp_error(\"No response to PAP authenticate-requests\");\n    pcb->upap.us_clientstate = UPAPCS_BADAUTH;\n    auth_withpeer_fail(pcb, PPP_PAP);\n    return;\n    }\n\n    upap_sauthreq(pcb);        /* Send Authenticate-Request */\n}\n\n\n#if PPP_SERVER\n/*\n * upap_reqtimeout - Give up waiting for the peer to send an auth-req.\n */\nstatic void upap_reqtimeout(void *arg) {\n    ppp_pcb *pcb = (ppp_pcb*)arg;\n\n    if (pcb->upap.us_serverstate != UPAPSS_LISTEN)\n    return;            /* huh?? */\n\n    auth_peer_fail(pcb, PPP_PAP);\n    pcb->upap.us_serverstate = UPAPSS_BADAUTH;\n}\n#endif /* PPP_SERVER */\n\n\n/*\n * upap_lowerup - The lower layer is up.\n *\n * Start authenticating if pending.\n */\nstatic void upap_lowerup(ppp_pcb *pcb) {\n\n    if (pcb->upap.us_clientstate == UPAPCS_INITIAL)\n    pcb->upap.us_clientstate = UPAPCS_CLOSED;\n    else if (pcb->upap.us_clientstate == UPAPCS_PENDING) {\n    upap_sauthreq(pcb);    /* send an auth-request */\n    }\n\n#if PPP_SERVER\n    if (pcb->upap.us_serverstate == UPAPSS_INITIAL)\n    pcb->upap.us_serverstate = UPAPSS_CLOSED;\n    else if (pcb->upap.us_serverstate == UPAPSS_PENDING) {\n    pcb->upap.us_serverstate = UPAPSS_LISTEN;\n    if (pcb->settings.pap_req_timeout > 0)\n        TIMEOUT(upap_reqtimeout, pcb, pcb->settings.pap_req_timeout);\n    }\n#endif /* PPP_SERVER */\n}\n\n\n/*\n * upap_lowerdown - The lower layer is down.\n *\n * Cancel all timeouts.\n */\nstatic void upap_lowerdown(ppp_pcb *pcb) {\n\n    if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ)    /* Timeout pending? */\n    UNTIMEOUT(upap_timeout, pcb);        /* Cancel timeout */\n#if PPP_SERVER\n    if (pcb->upap.us_serverstate == UPAPSS_LISTEN && pcb->settings.pap_req_timeout > 0)\n    UNTIMEOUT(upap_reqtimeout, pcb);\n#endif /* PPP_SERVER */\n\n    pcb->upap.us_clientstate = UPAPCS_INITIAL;\n#if PPP_SERVER\n    pcb->upap.us_serverstate = UPAPSS_INITIAL;\n#endif /* PPP_SERVER */\n}\n\n\n/*\n * upap_protrej - Peer doesn't speak this protocol.\n *\n * This shouldn't happen.  In any case, pretend lower layer went down.\n */\nstatic void upap_protrej(ppp_pcb *pcb) {\n\n    if (pcb->upap.us_clientstate == UPAPCS_AUTHREQ) {\n    ppp_error(\"PAP authentication failed due to protocol-reject\");\n    auth_withpeer_fail(pcb, PPP_PAP);\n    }\n#if PPP_SERVER\n    if (pcb->upap.us_serverstate == UPAPSS_LISTEN) {\n    ppp_error(\"PAP authentication of peer failed (protocol-reject)\");\n    auth_peer_fail(pcb, PPP_PAP);\n    }\n#endif /* PPP_SERVER */\n    upap_lowerdown(pcb);\n}\n\n\n/*\n * upap_input - Input UPAP packet.\n */\nstatic void upap_input(ppp_pcb *pcb, u_char *inpacket, int l) {\n    u_char *inp;\n    u_char code, id;\n    int len;\n\n    /*\n     * Parse header (code, id and length).\n     * If packet too short, drop it.\n     */\n    inp = inpacket;\n    if (l < UPAP_HEADERLEN) {\n    UPAPDEBUG((\"pap_input: rcvd short header.\"));\n    return;\n    }\n    GETCHAR(code, inp);\n    GETCHAR(id, inp);\n    GETSHORT(len, inp);\n    if (len < UPAP_HEADERLEN) {\n    UPAPDEBUG((\"pap_input: rcvd illegal length.\"));\n    return;\n    }\n    if (len > l) {\n    UPAPDEBUG((\"pap_input: rcvd short packet.\"));\n    return;\n    }\n    len -= UPAP_HEADERLEN;\n\n    /*\n     * Action depends on code.\n     */\n    switch (code) {\n    case UPAP_AUTHREQ:\n#if PPP_SERVER\n    upap_rauthreq(pcb, inp, id, len);\n#endif /* PPP_SERVER */\n    break;\n\n    case UPAP_AUTHACK:\n    upap_rauthack(pcb, inp, id, len);\n    break;\n\n    case UPAP_AUTHNAK:\n    upap_rauthnak(pcb, inp, id, len);\n    break;\n\n    default:                /* XXX Need code reject */\n    break;\n    }\n}\n\n#if PPP_SERVER\n/*\n * upap_rauth - Receive Authenticate.\n */\nstatic void upap_rauthreq(ppp_pcb *pcb, u_char *inp, int id, int len) {\n    u_char ruserlen, rpasswdlen;\n    char *ruser;\n    char *rpasswd;\n    char rhostname[256];\n    int retcode;\n    const char *msg;\n    int msglen;\n\n    if (pcb->upap.us_serverstate < UPAPSS_LISTEN)\n    return;\n\n    /*\n     * If we receive a duplicate authenticate-request, we are\n     * supposed to return the same status as for the first request.\n     */\n    if (pcb->upap.us_serverstate == UPAPSS_OPEN) {\n    upap_sresp(pcb, UPAP_AUTHACK, id, \"\", 0);    /* return auth-ack */\n    return;\n    }\n    if (pcb->upap.us_serverstate == UPAPSS_BADAUTH) {\n    upap_sresp(pcb, UPAP_AUTHNAK, id, \"\", 0);    /* return auth-nak */\n    return;\n    }\n\n    /*\n     * Parse user/passwd.\n     */\n    if (len < 1) {\n    UPAPDEBUG((\"pap_rauth: rcvd short packet.\"));\n    return;\n    }\n    GETCHAR(ruserlen, inp);\n    len -= sizeof (u_char) + ruserlen + sizeof (u_char);\n    if (len < 0) {\n    UPAPDEBUG((\"pap_rauth: rcvd short packet.\"));\n    return;\n    }\n    ruser = (char *) inp;\n    INCPTR(ruserlen, inp);\n    GETCHAR(rpasswdlen, inp);\n    if (len < rpasswdlen) {\n    UPAPDEBUG((\"pap_rauth: rcvd short packet.\"));\n    return;\n    }\n\n    rpasswd = (char *) inp;\n\n    /*\n     * Check the username and password given.\n     */\n    retcode = UPAP_AUTHNAK;\n    if (auth_check_passwd(pcb, ruser, ruserlen, rpasswd, rpasswdlen, &msg, &msglen)) {\n      retcode = UPAP_AUTHACK;\n    }\n    BZERO(rpasswd, rpasswdlen);\n\n#if 0 /* UNUSED */\n    /*\n     * Check remote number authorization.  A plugin may have filled in\n     * the remote number or added an allowed number, and rather than\n     * return an authenticate failure, is leaving it for us to verify.\n     */\n    if (retcode == UPAP_AUTHACK) {\n    if (!auth_number()) {\n        /* We do not want to leak info about the pap result. */\n        retcode = UPAP_AUTHNAK; /* XXX exit value will be \"wrong\" */\n        warn(\"calling number %q is not authorized\", remote_number);\n    }\n    }\n\n    msglen = strlen(msg);\n    if (msglen > 255)\n    msglen = 255;\n#endif /* UNUSED */\n\n    upap_sresp(pcb, retcode, id, msg, msglen);\n\n    /* Null terminate and clean remote name. */\n    ppp_slprintf(rhostname, sizeof(rhostname), \"%.*v\", ruserlen, ruser);\n\n    if (retcode == UPAP_AUTHACK) {\n    pcb->upap.us_serverstate = UPAPSS_OPEN;\n    ppp_notice(\"PAP peer authentication succeeded for %q\", rhostname);\n    auth_peer_success(pcb, PPP_PAP, 0, ruser, ruserlen);\n    } else {\n    pcb->upap.us_serverstate = UPAPSS_BADAUTH;\n    ppp_warn(\"PAP peer authentication failed for %q\", rhostname);\n    auth_peer_fail(pcb, PPP_PAP);\n    }\n\n    if (pcb->settings.pap_req_timeout > 0)\n    UNTIMEOUT(upap_reqtimeout, pcb);\n}\n#endif /* PPP_SERVER */\n\n/*\n * upap_rauthack - Receive Authenticate-Ack.\n */\nstatic void upap_rauthack(ppp_pcb *pcb, u_char *inp, int id, int len) {\n    u_char msglen;\n    char *msg;\n    LWIP_UNUSED_ARG(id);\n\n    if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */\n    return;\n\n    /*\n     * Parse message.\n     */\n    if (len < 1) {\n    UPAPDEBUG((\"pap_rauthack: ignoring missing msg-length.\"));\n    } else {\n    GETCHAR(msglen, inp);\n    if (msglen > 0) {\n        len -= sizeof (u_char);\n        if (len < msglen) {\n        UPAPDEBUG((\"pap_rauthack: rcvd short packet.\"));\n        return;\n        }\n        msg = (char *) inp;\n        PRINTMSG(msg, msglen);\n    }\n    }\n\n    pcb->upap.us_clientstate = UPAPCS_OPEN;\n\n    auth_withpeer_success(pcb, PPP_PAP, 0);\n}\n\n\n/*\n * upap_rauthnak - Receive Authenticate-Nak.\n */\nstatic void upap_rauthnak(ppp_pcb *pcb, u_char *inp, int id, int len) {\n    u_char msglen;\n    char *msg;\n    LWIP_UNUSED_ARG(id);\n\n    if (pcb->upap.us_clientstate != UPAPCS_AUTHREQ) /* XXX */\n    return;\n\n    /*\n     * Parse message.\n     */\n    if (len < 1) {\n    UPAPDEBUG((\"pap_rauthnak: ignoring missing msg-length.\"));\n    } else {\n    GETCHAR(msglen, inp);\n    if (msglen > 0) {\n        len -= sizeof (u_char);\n        if (len < msglen) {\n        UPAPDEBUG((\"pap_rauthnak: rcvd short packet.\"));\n        return;\n        }\n        msg = (char *) inp;\n        PRINTMSG(msg, msglen);\n    }\n    }\n\n    pcb->upap.us_clientstate = UPAPCS_BADAUTH;\n\n    ppp_error(\"PAP authentication failed\");\n    auth_withpeer_fail(pcb, PPP_PAP);\n}\n\n\n/*\n * upap_sauthreq - Send an Authenticate-Request.\n */\nstatic void upap_sauthreq(ppp_pcb *pcb) {\n    struct pbuf *p;\n    u_char *outp;\n    int outlen;\n\n    outlen = UPAP_HEADERLEN + 2 * sizeof (u_char) +\n    pcb->upap.us_userlen + pcb->upap.us_passwdlen;\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = (u_char*)p->payload;\n    MAKEHEADER(outp, PPP_PAP);\n\n    PUTCHAR(UPAP_AUTHREQ, outp);\n    PUTCHAR(++pcb->upap.us_id, outp);\n    PUTSHORT(outlen, outp);\n    PUTCHAR(pcb->upap.us_userlen, outp);\n    MEMCPY(outp, pcb->upap.us_user, pcb->upap.us_userlen);\n    INCPTR(pcb->upap.us_userlen, outp);\n    PUTCHAR(pcb->upap.us_passwdlen, outp);\n    MEMCPY(outp, pcb->upap.us_passwd, pcb->upap.us_passwdlen);\n\n    ppp_write(pcb, p);\n\n    TIMEOUT(upap_timeout, pcb, pcb->settings.pap_timeout_time);\n    ++pcb->upap.us_transmits;\n    pcb->upap.us_clientstate = UPAPCS_AUTHREQ;\n}\n\n#if PPP_SERVER\n/*\n * upap_sresp - Send a response (ack or nak).\n */\nstatic void upap_sresp(ppp_pcb *pcb, u_char code, u_char id, const char *msg, int msglen) {\n    struct pbuf *p;\n    u_char *outp;\n    int outlen;\n\n    outlen = UPAP_HEADERLEN + sizeof (u_char) + msglen;\n    p = pbuf_alloc(PBUF_RAW, (u16_t)(PPP_HDRLEN +outlen), PPP_CTRL_PBUF_TYPE);\n    if(NULL == p)\n        return;\n    if(p->tot_len != p->len) {\n        pbuf_free(p);\n        return;\n    }\n\n    outp = (u_char*)p->payload;\n    MAKEHEADER(outp, PPP_PAP);\n\n    PUTCHAR(code, outp);\n    PUTCHAR(id, outp);\n    PUTSHORT(outlen, outp);\n    PUTCHAR(msglen, outp);\n    MEMCPY(outp, msg, msglen);\n\n    ppp_write(pcb, p);\n}\n#endif /* PPP_SERVER */\n\n#if PRINTPKT_SUPPORT\n/*\n * upap_printpkt - print the contents of a PAP packet.\n */\nstatic const char* const upap_codenames[] = {\n    \"AuthReq\", \"AuthAck\", \"AuthNak\"\n};\n\nstatic int upap_printpkt(const u_char *p, int plen, void (*printer) (void *, const char *, ...), void *arg) {\n    int code, id, len;\n    int mlen, ulen, wlen;\n    const u_char *user, *pwd, *msg;\n    const u_char *pstart;\n\n    if (plen < UPAP_HEADERLEN)\n    return 0;\n    pstart = p;\n    GETCHAR(code, p);\n    GETCHAR(id, p);\n    GETSHORT(len, p);\n    if (len < UPAP_HEADERLEN || len > plen)\n    return 0;\n\n    if (code >= 1 && code <= (int)LWIP_ARRAYSIZE(upap_codenames))\n    printer(arg, \" %s\", upap_codenames[code-1]);\n    else\n    printer(arg, \" code=0x%x\", code);\n    printer(arg, \" id=0x%x\", id);\n    len -= UPAP_HEADERLEN;\n    switch (code) {\n    case UPAP_AUTHREQ:\n    if (len < 1)\n        break;\n    ulen = p[0];\n    if (len < ulen + 2)\n        break;\n    wlen = p[ulen + 1];\n    if (len < ulen + wlen + 2)\n        break;\n    user = (const u_char *) (p + 1);\n    pwd = (const u_char *) (p + ulen + 2);\n    p += ulen + wlen + 2;\n    len -= ulen + wlen + 2;\n    printer(arg, \" user=\");\n    ppp_print_string(user, ulen, printer, arg);\n    printer(arg, \" password=\");\n/* FIXME: require ppp_pcb struct as printpkt() argument */\n#if 0\n    if (!pcb->settings.hide_password)\n#endif\n        ppp_print_string(pwd, wlen, printer, arg);\n#if 0\n    else\n        printer(arg, \"<hidden>\");\n#endif\n    break;\n    case UPAP_AUTHACK:\n    case UPAP_AUTHNAK:\n    if (len < 1)\n        break;\n    mlen = p[0];\n    if (len < mlen + 1)\n        break;\n    msg = (const u_char *) (p + 1);\n    p += mlen + 1;\n    len -= mlen + 1;\n    printer(arg, \" \");\n    ppp_print_string(msg, mlen, printer, arg);\n    break;\n    default:\n    break;\n    }\n\n    /* print the rest of the bytes in the packet */\n    for (; len > 0; --len) {\n    GETCHAR(code, p);\n    printer(arg, \" %.2x\", code);\n    }\n\n    return p - pstart;\n}\n#endif /* PRINTPKT_SUPPORT */\n\n#endif /* PPP_SUPPORT && PAP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/utils.c",
    "content": "/*\n * utils.c - various utility functions used in pppd.\n *\n * Copyright (c) 1999-2002 Paul Mackerras. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. The name(s) of the authors of this software must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission.\n *\n * 3. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by Paul Mackerras\n *     <paulus@samba.org>\".\n *\n * THE AUTHORS OF THIS SOFTWARE DISCLAIM ALL WARRANTIES WITH REGARD TO\n * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n * AND FITNESS, IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY\n * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN\n * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING\n * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#if 0 /* UNUSED */\n#include <stdio.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <signal.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <syslog.h>\n#include <netdb.h>\n#include <time.h>\n#include <utmp.h>\n#include <pwd.h>\n#include <sys/param.h>\n#include <sys/types.h>\n#include <sys/wait.h>\n#include <sys/time.h>\n#include <sys/resource.h>\n#include <sys/stat.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#ifdef SVR4\n#include <sys/mkdev.h>\n#endif\n#endif /* UNUSED */\n\n#include <ctype.h>  /* isdigit() */\n\n#include \"netif/ppp/ppp_impl.h\"\n\n#include \"netif/ppp/fsm.h\"\n#include \"netif/ppp/lcp.h\"\n\n#if defined(SUNOS4)\nextern char *strerror();\n#endif\n\nstatic void ppp_logit(int level, const char *fmt, va_list args);\nstatic void ppp_log_write(int level, char *buf);\n#if PRINTPKT_SUPPORT\nstatic void ppp_vslp_printer(void *arg, const char *fmt, ...);\nstatic void ppp_format_packet(const u_char *p, int len,\n        void (*printer) (void *, const char *, ...), void *arg);\n\nstruct buffer_info {\n    char *ptr;\n    int len;\n};\n#endif /* PRINTPKT_SUPPORT */\n\n/*\n * ppp_strlcpy - like strcpy/strncpy, doesn't overflow destination buffer,\n * always leaves destination null-terminated (for len > 0).\n */\nsize_t ppp_strlcpy(char *dest, const char *src, size_t len) {\n    size_t ret = strlen(src);\n\n    if (len != 0) {\n    if (ret < len)\n        strcpy(dest, src);\n    else {\n        strncpy(dest, src, len - 1);\n        dest[len-1] = 0;\n    }\n    }\n    return ret;\n}\n\n/*\n * ppp_strlcat - like strcat/strncat, doesn't overflow destination buffer,\n * always leaves destination null-terminated (for len > 0).\n */\nsize_t ppp_strlcat(char *dest, const char *src, size_t len) {\n    size_t dlen = strlen(dest);\n\n    return dlen + ppp_strlcpy(dest + dlen, src, (len > dlen? len - dlen: 0));\n}\n\n\n/*\n * ppp_slprintf - format a message into a buffer.  Like sprintf except we\n * also specify the length of the output buffer, and we handle\n * %m (error message), %v (visible string),\n * %q (quoted string), %t (current time) and %I (IP address) formats.\n * Doesn't do floating-point formats.\n * Returns the number of chars put into buf.\n */\nint ppp_slprintf(char *buf, int buflen, const char *fmt, ...) {\n    va_list args;\n    int n;\n\n    va_start(args, fmt);\n    n = ppp_vslprintf(buf, buflen, fmt, args);\n    va_end(args);\n    return n;\n}\n\n/*\n * ppp_vslprintf - like ppp_slprintf, takes a va_list instead of a list of args.\n */\n#define OUTCHAR(c)    (buflen > 0? (--buflen, *buf++ = (c)): 0)\n\nint ppp_vslprintf(char *buf, int buflen, const char *fmt, va_list args) {\n    int c, i, n;\n    int width, prec, fillch;\n    int base, len, neg, quoted;\n    unsigned long val = 0;\n    const char *f;\n    char *str, *buf0;\n    const unsigned char *p;\n    char num[32];\n#if 0 /* need port */\n    time_t t;\n#endif /* need port */\n    u32_t ip;\n    static char hexchars[] = \"0123456789abcdef\";\n#if PRINTPKT_SUPPORT\n    struct buffer_info bufinfo;\n#endif /* PRINTPKT_SUPPORT */\n\n    buf0 = buf;\n    --buflen;\n    while (buflen > 0) {\n    for (f = fmt; *f != '%' && *f != 0; ++f)\n        ;\n    if (f > fmt) {\n        len = f - fmt;\n        if (len > buflen)\n        len = buflen;\n        memcpy(buf, fmt, len);\n        buf += len;\n        buflen -= len;\n        fmt = f;\n    }\n    if (*fmt == 0)\n        break;\n    c = *++fmt;\n    width = 0;\n    prec = -1;\n    fillch = ' ';\n    if (c == '0') {\n        fillch = '0';\n        c = *++fmt;\n    }\n    if (c == '*') {\n        width = va_arg(args, int);\n        c = *++fmt;\n    } else {\n        while (isdigit(c)) {\n        width = width * 10 + c - '0';\n        c = *++fmt;\n        }\n    }\n    if (c == '.') {\n        c = *++fmt;\n        if (c == '*') {\n        prec = va_arg(args, int);\n        c = *++fmt;\n        } else {\n        prec = 0;\n        while (isdigit(c)) {\n            prec = prec * 10 + c - '0';\n            c = *++fmt;\n        }\n        }\n    }\n    str = 0;\n    base = 0;\n    neg = 0;\n    ++fmt;\n    switch (c) {\n    case 'l':\n        c = *fmt++;\n        switch (c) {\n        case 'd':\n        val = va_arg(args, long);\n        if ((long)val < 0) {\n            neg = 1;\n            val = (unsigned long)-(long)val;\n        }\n        base = 10;\n        break;\n        case 'u':\n        val = va_arg(args, unsigned long);\n        base = 10;\n        break;\n        default:\n        OUTCHAR('%');\n        OUTCHAR('l');\n        --fmt;        /* so %lz outputs %lz etc. */\n        continue;\n        }\n        break;\n    case 'd':\n        i = va_arg(args, int);\n        if (i < 0) {\n        neg = 1;\n        val = -i;\n        } else\n        val = i;\n        base = 10;\n        break;\n    case 'u':\n        val = va_arg(args, unsigned int);\n        base = 10;\n        break;\n    case 'o':\n        val = va_arg(args, unsigned int);\n        base = 8;\n        break;\n    case 'x':\n    case 'X':\n        val = va_arg(args, unsigned int);\n        base = 16;\n        break;\n#if 0 /* unused (and wrong on LLP64 systems) */\n    case 'p':\n        val = (unsigned long) va_arg(args, void *);\n        base = 16;\n        neg = 2;\n        break;\n#endif /* unused (and wrong on LLP64 systems) */\n    case 's':\n        str = va_arg(args, char *);\n        break;\n    case 'c':\n        num[0] = va_arg(args, int);\n        num[1] = 0;\n        str = num;\n        break;\n#if 0 /* do we always have strerror() in embedded ? */\n    case 'm':\n        str = strerror(errno);\n        break;\n#endif /* do we always have strerror() in embedded ? */\n    case 'I':\n        ip = va_arg(args, u32_t);\n        ip = lwip_ntohl(ip);\n        ppp_slprintf(num, sizeof(num), \"%d.%d.%d.%d\", (ip >> 24) & 0xff,\n             (ip >> 16) & 0xff, (ip >> 8) & 0xff, ip & 0xff);\n        str = num;\n        break;\n#if 0 /* need port */\n    case 't':\n        time(&t);\n        str = ctime(&t);\n        str += 4;        /* chop off the day name */\n        str[15] = 0;    /* chop off year and newline */\n        break;\n#endif /* need port */\n    case 'v':        /* \"visible\" string */\n    case 'q':        /* quoted string */\n        quoted = c == 'q';\n        p = va_arg(args, unsigned char *);\n        if (p == NULL)\n        p = (const unsigned char *)\"<NULL>\";\n        if (fillch == '0' && prec >= 0) {\n        n = prec;\n        } else {\n        n = strlen((const char *)p);\n        if (prec >= 0 && n > prec)\n            n = prec;\n        }\n        while (n > 0 && buflen > 0) {\n        c = *p++;\n        --n;\n        if (!quoted && c >= 0x80) {\n            OUTCHAR('M');\n            OUTCHAR('-');\n            c -= 0x80;\n        }\n        if (quoted && (c == '\"' || c == '\\\\'))\n            OUTCHAR('\\\\');\n        if (c < 0x20 || (0x7f <= c && c < 0xa0)) {\n            if (quoted) {\n            OUTCHAR('\\\\');\n            switch (c) {\n            case '\\t':    OUTCHAR('t');    break;\n            case '\\n':    OUTCHAR('n');    break;\n            case '\\b':    OUTCHAR('b');    break;\n            case '\\f':    OUTCHAR('f');    break;\n            default:\n                OUTCHAR('x');\n                OUTCHAR(hexchars[c >> 4]);\n                OUTCHAR(hexchars[c & 0xf]);\n            }\n            } else {\n            if (c == '\\t')\n                OUTCHAR(c);\n            else {\n                OUTCHAR('^');\n                OUTCHAR(c ^ 0x40);\n            }\n            }\n        } else\n            OUTCHAR(c);\n        }\n        continue;\n#if PRINTPKT_SUPPORT\n    case 'P':        /* print PPP packet */\n        bufinfo.ptr = buf;\n        bufinfo.len = buflen + 1;\n        p = va_arg(args, unsigned char *);\n        n = va_arg(args, int);\n        ppp_format_packet(p, n, ppp_vslp_printer, &bufinfo);\n        buf = bufinfo.ptr;\n        buflen = bufinfo.len - 1;\n        continue;\n#endif /* PRINTPKT_SUPPORT */\n    case 'B':\n        p = va_arg(args, unsigned char *);\n        for (n = prec; n > 0; --n) {\n        c = *p++;\n        if (fillch == ' ')\n            OUTCHAR(' ');\n        OUTCHAR(hexchars[(c >> 4) & 0xf]);\n        OUTCHAR(hexchars[c & 0xf]);\n        }\n        continue;\n    default:\n        *buf++ = '%';\n        if (c != '%')\n        --fmt;        /* so %z outputs %z etc. */\n        --buflen;\n        continue;\n    }\n    if (base != 0) {\n        str = num + sizeof(num);\n        *--str = 0;\n        while (str > num + neg) {\n        *--str = hexchars[val % base];\n        val = val / base;\n        if (--prec <= 0 && val == 0)\n            break;\n        }\n        switch (neg) {\n        case 1:\n        *--str = '-';\n        break;\n        case 2:\n        *--str = 'x';\n        *--str = '0';\n        break;\n        default:\n        break;\n        }\n        len = num + sizeof(num) - 1 - str;\n    } else {\n        len = strlen(str);\n        if (prec >= 0 && len > prec)\n        len = prec;\n    }\n    if (width > 0) {\n        if (width > buflen)\n        width = buflen;\n        if ((n = width - len) > 0) {\n        buflen -= n;\n        for (; n > 0; --n)\n            *buf++ = fillch;\n        }\n    }\n    if (len > buflen)\n        len = buflen;\n    memcpy(buf, str, len);\n    buf += len;\n    buflen -= len;\n    }\n    *buf = 0;\n    return buf - buf0;\n}\n\n#if PRINTPKT_SUPPORT\n/*\n * vslp_printer - used in processing a %P format\n */\nstatic void ppp_vslp_printer(void *arg, const char *fmt, ...) {\n    int n;\n    va_list pvar;\n    struct buffer_info *bi;\n\n    va_start(pvar, fmt);\n    bi = (struct buffer_info *) arg;\n    n = ppp_vslprintf(bi->ptr, bi->len, fmt, pvar);\n    va_end(pvar);\n\n    bi->ptr += n;\n    bi->len -= n;\n}\n#endif /* PRINTPKT_SUPPORT */\n\n#if 0 /* UNUSED */\n/*\n * log_packet - format a packet and log it.\n */\n\nvoid\nlog_packet(p, len, prefix, level)\n    u_char *p;\n    int len;\n    char *prefix;\n    int level;\n{\n    init_pr_log(prefix, level);\n    ppp_format_packet(p, len, pr_log, &level);\n    end_pr_log();\n}\n#endif /* UNUSED */\n\n#if PRINTPKT_SUPPORT\n/*\n * ppp_format_packet - make a readable representation of a packet,\n * calling `printer(arg, format, ...)' to output it.\n */\nstatic void ppp_format_packet(const u_char *p, int len,\n        void (*printer) (void *, const char *, ...), void *arg) {\n    int i, n;\n    u_short proto;\n    const struct protent *protp;\n\n    if (len >= 2) {\n    GETSHORT(proto, p);\n    len -= 2;\n    for (i = 0; (protp = protocols[i]) != NULL; ++i)\n        if (proto == protp->protocol)\n        break;\n    if (protp != NULL) {\n        printer(arg, \"[%s\", protp->name);\n        n = (*protp->printpkt)(p, len, printer, arg);\n        printer(arg, \"]\");\n        p += n;\n        len -= n;\n    } else {\n        for (i = 0; (protp = protocols[i]) != NULL; ++i)\n        if (proto == (protp->protocol & ~0x8000))\n            break;\n        if (protp != 0 && protp->data_name != 0) {\n        printer(arg, \"[%s data]\", protp->data_name);\n        if (len > 8)\n            printer(arg, \"%.8B ...\", p);\n        else\n            printer(arg, \"%.*B\", len, p);\n        len = 0;\n        } else\n        printer(arg, \"[proto=0x%x]\", proto);\n    }\n    }\n\n    if (len > 32)\n    printer(arg, \"%.32B ...\", p);\n    else\n    printer(arg, \"%.*B\", len, p);\n}\n#endif /* PRINTPKT_SUPPORT */\n\n#if 0 /* UNUSED */\n/*\n * init_pr_log, end_pr_log - initialize and finish use of pr_log.\n */\n\nstatic char line[256];        /* line to be logged accumulated here */\nstatic char *linep;        /* current pointer within line */\nstatic int llevel;        /* level for logging */\n\nvoid\ninit_pr_log(prefix, level)\n     const char *prefix;\n     int level;\n{\n    linep = line;\n    if (prefix != NULL) {\n        ppp_strlcpy(line, prefix, sizeof(line));\n        linep = line + strlen(line);\n    }\n    llevel = level;\n}\n\nvoid\nend_pr_log()\n{\n    if (linep != line) {\n        *linep = 0;\n        ppp_log_write(llevel, line);\n    }\n}\n\n/*\n * pr_log - printer routine for outputting to log\n */\nvoid\npr_log (void *arg, const char *fmt, ...)\n{\n    int l, n;\n    va_list pvar;\n    char *p, *eol;\n    char buf[256];\n\n    va_start(pvar, fmt);\n    n = ppp_vslprintf(buf, sizeof(buf), fmt, pvar);\n    va_end(pvar);\n\n    p = buf;\n    eol = strchr(buf, '\\n');\n    if (linep != line) {\n        l = (eol == NULL)? n: eol - buf;\n        if (linep + l < line + sizeof(line)) {\n            if (l > 0) {\n                memcpy(linep, buf, l);\n                linep += l;\n            }\n            if (eol == NULL)\n                return;\n            p = eol + 1;\n            eol = strchr(p, '\\n');\n        }\n        *linep = 0;\n        ppp_log_write(llevel, line);\n        linep = line;\n    }\n\n    while (eol != NULL) {\n        *eol = 0;\n        ppp_log_write(llevel, p);\n        p = eol + 1;\n        eol = strchr(p, '\\n');\n    }\n\n    /* assumes sizeof(buf) <= sizeof(line) */\n    l = buf + n - p;\n    if (l > 0) {\n        memcpy(line, p, n);\n        linep = line + l;\n    }\n}\n#endif /* UNUSED */\n\n/*\n * ppp_print_string - print a readable representation of a string using\n * printer.\n */\nvoid ppp_print_string(const u_char *p, int len, void (*printer) (void *, const char *, ...), void *arg) {\n    int c;\n\n    printer(arg, \"\\\"\");\n    for (; len > 0; --len) {\n    c = *p++;\n    if (' ' <= c && c <= '~') {\n        if (c == '\\\\' || c == '\"')\n        printer(arg, \"\\\\\");\n        printer(arg, \"%c\", c);\n    } else {\n        switch (c) {\n        case '\\n':\n        printer(arg, \"\\\\n\");\n        break;\n        case '\\r':\n        printer(arg, \"\\\\r\");\n        break;\n        case '\\t':\n        printer(arg, \"\\\\t\");\n        break;\n        default:\n        printer(arg, \"\\\\%.3o\", (u8_t)c);\n        /* no break */\n        }\n    }\n    }\n    printer(arg, \"\\\"\");\n}\n\n/*\n * ppp_logit - does the hard work for fatal et al.\n */\nstatic void ppp_logit(int level, const char *fmt, va_list args) {\n    char buf[1024];\n\n    ppp_vslprintf(buf, sizeof(buf), fmt, args);\n    ppp_log_write(level, buf);\n}\n\nstatic void ppp_log_write(int level, char *buf) {\n    LWIP_UNUSED_ARG(level); /* necessary if PPPDEBUG is defined to an empty function */\n    LWIP_UNUSED_ARG(buf);\n    PPPDEBUG(level, (\"%s\\n\", buf) );\n#if 0\n    if (log_to_fd >= 0 && (level != LOG_DEBUG || debug)) {\n    int n = strlen(buf);\n\n    if (n > 0 && buf[n-1] == '\\n')\n        --n;\n    if (write(log_to_fd, buf, n) != n\n        || write(log_to_fd, \"\\n\", 1) != 1)\n        log_to_fd = -1;\n    }\n#endif\n}\n\n/*\n * ppp_fatal - log an error message and die horribly.\n */\nvoid ppp_fatal(const char *fmt, ...) {\n    va_list pvar;\n\n    va_start(pvar, fmt);\n    ppp_logit(LOG_ERR, fmt, pvar);\n    va_end(pvar);\n\n    LWIP_ASSERT(\"ppp_fatal\", 0);   /* as promised */\n}\n\n/*\n * ppp_error - log an error message.\n */\nvoid ppp_error(const char *fmt, ...) {\n    va_list pvar;\n\n    va_start(pvar, fmt);\n    ppp_logit(LOG_ERR, fmt, pvar);\n    va_end(pvar);\n#if 0 /* UNUSED */\n    ++error_count;\n#endif /* UNUSED */\n}\n\n/*\n * ppp_warn - log a warning message.\n */\nvoid ppp_warn(const char *fmt, ...) {\n    va_list pvar;\n\n    va_start(pvar, fmt);\n    ppp_logit(LOG_WARNING, fmt, pvar);\n    va_end(pvar);\n}\n\n/*\n * ppp_notice - log a notice-level message.\n */\nvoid ppp_notice(const char *fmt, ...) {\n    va_list pvar;\n\n    va_start(pvar, fmt);\n    ppp_logit(LOG_NOTICE, fmt, pvar);\n    va_end(pvar);\n}\n\n/*\n * ppp_info - log an informational message.\n */\nvoid ppp_info(const char *fmt, ...) {\n    va_list pvar;\n\n    va_start(pvar, fmt);\n    ppp_logit(LOG_INFO, fmt, pvar);\n    va_end(pvar);\n}\n\n/*\n * ppp_dbglog - log a debug message.\n */\nvoid ppp_dbglog(const char *fmt, ...) {\n    va_list pvar;\n\n    va_start(pvar, fmt);\n    ppp_logit(LOG_DEBUG, fmt, pvar);\n    va_end(pvar);\n}\n\n#if PRINTPKT_SUPPORT\n/*\n * ppp_dump_packet - print out a packet in readable form if it is interesting.\n * Assumes len >= PPP_HDRLEN.\n */\nvoid ppp_dump_packet(ppp_pcb *pcb, const char *tag, unsigned char *p, int len) {\n    int proto;\n\n    /*\n     * don't print data packets, i.e. IPv4, IPv6, VJ, and compressed packets.\n     */\n    proto = (p[0] << 8) + p[1];\n    if (proto < 0xC000 && (proto & ~0x8000) == proto)\n    return;\n\n    /*\n     * don't print valid LCP echo request/reply packets if the link is up.\n     */\n    if (proto == PPP_LCP && pcb->phase == PPP_PHASE_RUNNING && len >= 2 + HEADERLEN) {\n    unsigned char *lcp = p + 2;\n    int l = (lcp[2] << 8) + lcp[3];\n\n    if ((lcp[0] == ECHOREQ || lcp[0] == ECHOREP)\n        && l >= HEADERLEN && l <= len - 2)\n        return;\n    }\n\n    ppp_dbglog(\"%s %P\", tag, p, len);\n}\n#endif /* PRINTPKT_SUPPORT */\n\n#if 0 /* Unused */\n\n/*\n * complete_read - read a full `count' bytes from fd,\n * unless end-of-file or an error other than EINTR is encountered.\n */\nssize_t\ncomplete_read(int fd, void *buf, size_t count)\n{\n    size_t done;\n    ssize_t nb;\n    char *ptr = buf;\n\n    for (done = 0; done < count; ) {\n        nb = read(fd, ptr, count - done);\n        if (nb < 0) {\n            if (errno == EINTR)\n                continue;\n            return -1;\n        }\n        if (nb == 0)\n            break;\n        done += nb;\n        ptr += nb;\n    }\n    return done;\n}\n\n/* Procedures for locking the serial device using a lock file. */\n#ifndef LOCK_DIR\n#ifdef __linux__\n#define LOCK_DIR    \"/var/lock\"\n#else\n#ifdef SVR4\n#define LOCK_DIR    \"/var/spool/locks\"\n#else\n#define LOCK_DIR    \"/var/spool/lock\"\n#endif\n#endif\n#endif /* LOCK_DIR */\n\nstatic char lock_file[MAXPATHLEN];\n\n/*\n * lock - create a lock file for the named device\n */\nint\nlock(dev)\n    char *dev;\n{\n#ifdef LOCKLIB\n    int result;\n\n    result = mklock (dev, (void *) 0);\n    if (result == 0) {\n    ppp_strlcpy(lock_file, dev, sizeof(lock_file));\n    return 0;\n    }\n\n    if (result > 0)\n        ppp_notice(\"Device %s is locked by pid %d\", dev, result);\n    else\n    ppp_error(\"Can't create lock file %s\", lock_file);\n    return -1;\n\n#else /* LOCKLIB */\n\n    char lock_buffer[12];\n    int fd, pid, n;\n\n#ifdef SVR4\n    struct stat sbuf;\n\n    if (stat(dev, &sbuf) < 0) {\n    ppp_error(\"Can't get device number for %s: %m\", dev);\n    return -1;\n    }\n    if ((sbuf.st_mode & S_IFMT) != S_IFCHR) {\n    ppp_error(\"Can't lock %s: not a character device\", dev);\n    return -1;\n    }\n    ppp_slprintf(lock_file, sizeof(lock_file), \"%s/LK.%03d.%03d.%03d\",\n         LOCK_DIR, major(sbuf.st_dev),\n         major(sbuf.st_rdev), minor(sbuf.st_rdev));\n#else\n    char *p;\n    char lockdev[MAXPATHLEN];\n\n    if ((p = strstr(dev, \"dev/\")) != NULL) {\n    dev = p + 4;\n    strncpy(lockdev, dev, MAXPATHLEN-1);\n    lockdev[MAXPATHLEN-1] = 0;\n    while ((p = strrchr(lockdev, '/')) != NULL) {\n        *p = '_';\n    }\n    dev = lockdev;\n    } else\n    if ((p = strrchr(dev, '/')) != NULL)\n        dev = p + 1;\n\n    ppp_slprintf(lock_file, sizeof(lock_file), \"%s/LCK..%s\", LOCK_DIR, dev);\n#endif\n\n    while ((fd = open(lock_file, O_EXCL | O_CREAT | O_RDWR, 0644)) < 0) {\n    if (errno != EEXIST) {\n        ppp_error(\"Can't create lock file %s: %m\", lock_file);\n        break;\n    }\n\n    /* Read the lock file to find out who has the device locked. */\n    fd = open(lock_file, O_RDONLY, 0);\n    if (fd < 0) {\n        if (errno == ENOENT) /* This is just a timing problem. */\n        continue;\n        ppp_error(\"Can't open existing lock file %s: %m\", lock_file);\n        break;\n    }\n#ifndef LOCK_BINARY\n    n = read(fd, lock_buffer, 11);\n#else\n    n = read(fd, &pid, sizeof(pid));\n#endif /* LOCK_BINARY */\n    close(fd);\n    fd = -1;\n    if (n <= 0) {\n        ppp_error(\"Can't read pid from lock file %s\", lock_file);\n        break;\n    }\n\n    /* See if the process still exists. */\n#ifndef LOCK_BINARY\n    lock_buffer[n] = 0;\n    pid = atoi(lock_buffer);\n#endif /* LOCK_BINARY */\n    if (pid == getpid())\n        return 1;        /* somebody else locked it for us */\n    if (pid == 0\n        || (kill(pid, 0) == -1 && errno == ESRCH)) {\n        if (unlink (lock_file) == 0) {\n        ppp_notice(\"Removed stale lock on %s (pid %d)\", dev, pid);\n        continue;\n        }\n        ppp_warn(\"Couldn't remove stale lock on %s\", dev);\n    } else\n        ppp_notice(\"Device %s is locked by pid %d\", dev, pid);\n    break;\n    }\n\n    if (fd < 0) {\n    lock_file[0] = 0;\n    return -1;\n    }\n\n    pid = getpid();\n#ifndef LOCK_BINARY\n    ppp_slprintf(lock_buffer, sizeof(lock_buffer), \"%10d\\n\", pid);\n    write (fd, lock_buffer, 11);\n#else\n    write(fd, &pid, sizeof (pid));\n#endif\n    close(fd);\n    return 0;\n\n#endif\n}\n\n/*\n * relock - called to update our lockfile when we are about to detach,\n * thus changing our pid (we fork, the child carries on, and the parent dies).\n * Note that this is called by the parent, with pid equal to the pid\n * of the child.  This avoids a potential race which would exist if\n * we had the child rewrite the lockfile (the parent might die first,\n * and another process could think the lock was stale if it checked\n * between when the parent died and the child rewrote the lockfile).\n */\nint\nrelock(pid)\n    int pid;\n{\n#ifdef LOCKLIB\n    /* XXX is there a way to do this? */\n    return -1;\n#else /* LOCKLIB */\n\n    int fd;\n    char lock_buffer[12];\n\n    if (lock_file[0] == 0)\n    return -1;\n    fd = open(lock_file, O_WRONLY, 0);\n    if (fd < 0) {\n    ppp_error(\"Couldn't reopen lock file %s: %m\", lock_file);\n    lock_file[0] = 0;\n    return -1;\n    }\n\n#ifndef LOCK_BINARY\n    ppp_slprintf(lock_buffer, sizeof(lock_buffer), \"%10d\\n\", pid);\n    write (fd, lock_buffer, 11);\n#else\n    write(fd, &pid, sizeof(pid));\n#endif /* LOCK_BINARY */\n    close(fd);\n    return 0;\n\n#endif /* LOCKLIB */\n}\n\n/*\n * unlock - remove our lockfile\n */\nvoid\nunlock()\n{\n    if (lock_file[0]) {\n#ifdef LOCKLIB\n    (void) rmlock(lock_file, (void *) 0);\n#else\n    unlink(lock_file);\n#endif\n    lock_file[0] = 0;\n    }\n}\n\n#endif /* Unused */\n\n#endif /* PPP_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/ppp/vj.c",
    "content": "/*\n * Routines to compress and uncompess tcp packets (for transmission\n * over low speed serial lines.\n *\n * Copyright (c) 1989 Regents of the University of California.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms are permitted\n * provided that the above copyright notice and this paragraph are\n * duplicated in all such forms and that any documentation,\n * advertising materials, and other materials related to such\n * distribution and use acknowledge that the software was developed\n * by the University of California, Berkeley.  The name of the\n * University may not be used to endorse or promote products derived\n * from this software without specific prior written permission.\n * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED\n * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.\n *\n * Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989:\n *   Initial distribution.\n *\n * Modified June 1993 by Paul Mackerras, paulus@cs.anu.edu.au,\n * so that the entire packet being decompressed doesn't have\n * to be in contiguous memory (just the compressed header).\n *\n * Modified March 1998 by Guy Lancaster, glanca@gesn.com,\n * for a 16 bit processor.\n */\n\n#include \"netif/ppp/ppp_opts.h\"\n#if PPP_SUPPORT && VJ_SUPPORT /* don't build if not configured for use in lwipopts.h */\n\n#include \"netif/ppp/ppp_impl.h\"\n#include \"netif/ppp/pppdebug.h\"\n\n#include \"netif/ppp/vj.h\"\n\n#include <string.h>\n\n#if LINK_STATS\n#define INCR(counter) ++comp->stats.counter\n#else\n#define INCR(counter)\n#endif\n\nvoid\nvj_compress_init(struct vjcompress *comp)\n{\n  u8_t i;\n  struct cstate *tstate = comp->tstate;\n\n#if MAX_SLOTS == 0\n  memset((char *)comp, 0, sizeof(*comp));\n#endif\n  comp->maxSlotIndex = MAX_SLOTS - 1;\n  comp->compressSlot = 0;    /* Disable slot ID compression by default. */\n  for (i = MAX_SLOTS - 1; i > 0; --i) {\n    tstate[i].cs_id = i;\n    tstate[i].cs_next = &tstate[i - 1];\n  }\n  tstate[0].cs_next = &tstate[MAX_SLOTS - 1];\n  tstate[0].cs_id = 0;\n  comp->last_cs = &tstate[0];\n  comp->last_recv = 255;\n  comp->last_xmit = 255;\n  comp->flags = VJF_TOSS;\n}\n\n\n/* ENCODE encodes a number that is known to be non-zero.  ENCODEZ\n * checks for zero (since zero has to be encoded in the long, 3 byte\n * form).\n */\n#define ENCODE(n) { \\\n  if ((u16_t)(n) >= 256) { \\\n    *cp++ = 0; \\\n    cp[1] = (u8_t)(n); \\\n    cp[0] = (u8_t)((n) >> 8); \\\n    cp += 2; \\\n  } else { \\\n    *cp++ = (u8_t)(n); \\\n  } \\\n}\n#define ENCODEZ(n) { \\\n  if ((u16_t)(n) >= 256 || (u16_t)(n) == 0) { \\\n    *cp++ = 0; \\\n    cp[1] = (u8_t)(n); \\\n    cp[0] = (u8_t)((n) >> 8); \\\n    cp += 2; \\\n  } else { \\\n    *cp++ = (u8_t)(n); \\\n  } \\\n}\n\n#define DECODEL(f) { \\\n  if (*cp == 0) {\\\n    u32_t tmp_ = lwip_ntohl(f) + ((cp[1] << 8) | cp[2]); \\\n    (f) = lwip_htonl(tmp_); \\\n    cp += 3; \\\n  } else { \\\n    u32_t tmp_ = lwip_ntohl(f) + (u32_t)*cp++; \\\n    (f) = lwip_htonl(tmp_); \\\n  } \\\n}\n\n#define DECODES(f) { \\\n  if (*cp == 0) {\\\n    u16_t tmp_ = lwip_ntohs(f) + (((u16_t)cp[1] << 8) | cp[2]); \\\n    (f) = lwip_htons(tmp_); \\\n    cp += 3; \\\n  } else { \\\n    u16_t tmp_ = lwip_ntohs(f) + (u16_t)*cp++; \\\n    (f) = lwip_htons(tmp_); \\\n  } \\\n}\n\n#define DECODEU(f) { \\\n  if (*cp == 0) {\\\n    (f) = lwip_htons(((u16_t)cp[1] << 8) | cp[2]); \\\n    cp += 3; \\\n  } else { \\\n    (f) = lwip_htons((u16_t)*cp++); \\\n  } \\\n}\n\n/* Helper structures for unaligned *u32_t and *u16_t accesses */\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct vj_u32_t {\n  PACK_STRUCT_FIELD(u32_t v);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/bpstruct.h\"\n#endif\nPACK_STRUCT_BEGIN\nstruct vj_u16_t {\n  PACK_STRUCT_FIELD(u16_t v);\n} PACK_STRUCT_STRUCT;\nPACK_STRUCT_END\n#ifdef PACK_STRUCT_USE_INCLUDES\n#  include \"arch/epstruct.h\"\n#endif\n\n/*\n * vj_compress_tcp - Attempt to do Van Jacobson header compression on a\n * packet.  This assumes that nb and comp are not null and that the first\n * buffer of the chain contains a valid IP header.\n * Return the VJ type code indicating whether or not the packet was\n * compressed.\n */\nu8_t\nvj_compress_tcp(struct vjcompress *comp, struct pbuf **pb)\n{\n  struct pbuf *np = *pb;\n  struct ip_hdr *ip = (struct ip_hdr *)np->payload;\n  struct cstate *cs = comp->last_cs->cs_next;\n  u16_t ilen = IPH_HL(ip);\n  u16_t hlen;\n  struct tcp_hdr *oth;\n  struct tcp_hdr *th;\n  u16_t deltaS, deltaA = 0;\n  u32_t deltaL;\n  u32_t changes = 0;\n  u8_t new_seq[16];\n  u8_t *cp = new_seq;\n\n  /*\n   * Check that the packet is IP proto TCP.\n   */\n  if (IPH_PROTO(ip) != IP_PROTO_TCP) {\n    return (TYPE_IP);\n  }\n\n  /*\n   * Bail if this is an IP fragment or if the TCP packet isn't\n   * `compressible' (i.e., ACK isn't set or some other control bit is\n   * set).\n   */\n  if ((IPH_OFFSET(ip) & PP_HTONS(0x3fff)) || np->tot_len < 40) {\n    return (TYPE_IP);\n  }\n  th = (struct tcp_hdr *)&((struct vj_u32_t*)ip)[ilen];\n  if ((TCPH_FLAGS(th) & (TCP_SYN|TCP_FIN|TCP_RST|TCP_ACK)) != TCP_ACK) {\n    return (TYPE_IP);\n  }\n\n  /* Check that the TCP/IP headers are contained in the first buffer. */\n  hlen = ilen + TCPH_HDRLEN(th);\n  hlen <<= 2;\n  if (np->len < hlen) {\n    PPPDEBUG(LOG_INFO, (\"vj_compress_tcp: header len %d spans buffers\\n\", hlen));\n    return (TYPE_IP);\n  }\n\n  /* TCP stack requires that we don't change the packet payload, therefore we copy\n   * the whole packet before compression. */\n  np = pbuf_alloc(PBUF_RAW, np->tot_len, PBUF_POOL);\n  if (!np) {\n    return (TYPE_IP);\n  }\n\n  if (pbuf_copy(np, *pb) != ERR_OK) {\n    pbuf_free(np);\n    return (TYPE_IP);\n  }\n\n  *pb = np;\n  ip = (struct ip_hdr *)np->payload;\n\n  /*\n   * Packet is compressible -- we're going to send either a\n   * COMPRESSED_TCP or UNCOMPRESSED_TCP packet.  Either way we need\n   * to locate (or create) the connection state.  Special case the\n   * most recently used connection since it's most likely to be used\n   * again & we don't have to do any reordering if it's used.\n   */\n  INCR(vjs_packets);\n  if (!ip4_addr_cmp(&ip->src, &cs->cs_ip.src)\n      || !ip4_addr_cmp(&ip->dest, &cs->cs_ip.dest)\n      || (*(struct vj_u32_t*)th).v != (((struct vj_u32_t*)&cs->cs_ip)[IPH_HL(&cs->cs_ip)]).v) {\n    /*\n     * Wasn't the first -- search for it.\n     *\n     * States are kept in a circularly linked list with\n     * last_cs pointing to the end of the list.  The\n     * list is kept in lru order by moving a state to the\n     * head of the list whenever it is referenced.  Since\n     * the list is short and, empirically, the connection\n     * we want is almost always near the front, we locate\n     * states via linear search.  If we don't find a state\n     * for the datagram, the oldest state is (re-)used.\n     */\n    struct cstate *lcs;\n    struct cstate *lastcs = comp->last_cs;\n\n    do {\n      lcs = cs; cs = cs->cs_next;\n      INCR(vjs_searches);\n      if (ip4_addr_cmp(&ip->src, &cs->cs_ip.src)\n          && ip4_addr_cmp(&ip->dest, &cs->cs_ip.dest)\n          && (*(struct vj_u32_t*)th).v == (((struct vj_u32_t*)&cs->cs_ip)[IPH_HL(&cs->cs_ip)]).v) {\n        goto found;\n      }\n    } while (cs != lastcs);\n\n    /*\n     * Didn't find it -- re-use oldest cstate.  Send an\n     * uncompressed packet that tells the other side what\n     * connection number we're using for this conversation.\n     * Note that since the state list is circular, the oldest\n     * state points to the newest and we only need to set\n     * last_cs to update the lru linkage.\n     */\n    INCR(vjs_misses);\n    comp->last_cs = lcs;\n    goto uncompressed;\n\n    found:\n    /*\n     * Found it -- move to the front on the connection list.\n     */\n    if (cs == lastcs) {\n      comp->last_cs = lcs;\n    } else {\n      lcs->cs_next = cs->cs_next;\n      cs->cs_next = lastcs->cs_next;\n      lastcs->cs_next = cs;\n    }\n  }\n\n  oth = (struct tcp_hdr *)&((struct vj_u32_t*)&cs->cs_ip)[ilen];\n  deltaS = ilen;\n\n  /*\n   * Make sure that only what we expect to change changed. The first\n   * line of the `if' checks the IP protocol version, header length &\n   * type of service.  The 2nd line checks the \"Don't fragment\" bit.\n   * The 3rd line checks the time-to-live and protocol (the protocol\n   * check is unnecessary but costless).  The 4th line checks the TCP\n   * header length.  The 5th line checks IP options, if any.  The 6th\n   * line checks TCP options, if any.  If any of these things are\n   * different between the previous & current datagram, we send the\n   * current datagram `uncompressed'.\n   */\n  if ((((struct vj_u16_t*)ip)[0]).v != (((struct vj_u16_t*)&cs->cs_ip)[0]).v\n      || (((struct vj_u16_t*)ip)[3]).v != (((struct vj_u16_t*)&cs->cs_ip)[3]).v\n      || (((struct vj_u16_t*)ip)[4]).v != (((struct vj_u16_t*)&cs->cs_ip)[4]).v\n      || TCPH_HDRLEN(th) != TCPH_HDRLEN(oth)\n      || (deltaS > 5 && BCMP(ip + 1, &cs->cs_ip + 1, (deltaS - 5) << 2))\n      || (TCPH_HDRLEN(th) > 5 && BCMP(th + 1, oth + 1, (TCPH_HDRLEN(th) - 5) << 2))) {\n    goto uncompressed;\n  }\n\n  /*\n   * Figure out which of the changing fields changed.  The\n   * receiver expects changes in the order: urgent, window,\n   * ack, seq (the order minimizes the number of temporaries\n   * needed in this section of code).\n   */\n  if (TCPH_FLAGS(th) & TCP_URG) {\n    deltaS = lwip_ntohs(th->urgp);\n    ENCODEZ(deltaS);\n    changes |= NEW_U;\n  } else if (th->urgp != oth->urgp) {\n    /* argh! URG not set but urp changed -- a sensible\n     * implementation should never do this but RFC793\n     * doesn't prohibit the change so we have to deal\n     * with it. */\n    goto uncompressed;\n  }\n\n  if ((deltaS = (u16_t)(lwip_ntohs(th->wnd) - lwip_ntohs(oth->wnd))) != 0) {\n    ENCODE(deltaS);\n    changes |= NEW_W;\n  }\n\n  if ((deltaL = lwip_ntohl(th->ackno) - lwip_ntohl(oth->ackno)) != 0) {\n    if (deltaL > 0xffff) {\n      goto uncompressed;\n    }\n    deltaA = (u16_t)deltaL;\n    ENCODE(deltaA);\n    changes |= NEW_A;\n  }\n\n  if ((deltaL = lwip_ntohl(th->seqno) - lwip_ntohl(oth->seqno)) != 0) {\n    if (deltaL > 0xffff) {\n      goto uncompressed;\n    }\n    deltaS = (u16_t)deltaL;\n    ENCODE(deltaS);\n    changes |= NEW_S;\n  }\n\n  switch(changes) {\n  case 0:\n    /*\n     * Nothing changed. If this packet contains data and the\n     * last one didn't, this is probably a data packet following\n     * an ack (normal on an interactive connection) and we send\n     * it compressed.  Otherwise it's probably a retransmit,\n     * retransmitted ack or window probe.  Send it uncompressed\n     * in case the other side missed the compressed version.\n     */\n    if (IPH_LEN(ip) != IPH_LEN(&cs->cs_ip) &&\n      lwip_ntohs(IPH_LEN(&cs->cs_ip)) == hlen) {\n      break;\n    }\n    /* no break */\n    /* fall through */\n\n  case SPECIAL_I:\n  case SPECIAL_D:\n    /*\n     * actual changes match one of our special case encodings --\n     * send packet uncompressed.\n     */\n    goto uncompressed;\n\n  case NEW_S|NEW_A:\n    if (deltaS == deltaA && deltaS == lwip_ntohs(IPH_LEN(&cs->cs_ip)) - hlen) {\n      /* special case for echoed terminal traffic */\n      changes = SPECIAL_I;\n      cp = new_seq;\n    }\n    break;\n\n  case NEW_S:\n    if (deltaS == lwip_ntohs(IPH_LEN(&cs->cs_ip)) - hlen) {\n      /* special case for data xfer */\n      changes = SPECIAL_D;\n      cp = new_seq;\n    }\n    break;\n  default:\n     break;\n  }\n\n  deltaS = (u16_t)(lwip_ntohs(IPH_ID(ip)) - lwip_ntohs(IPH_ID(&cs->cs_ip)));\n  if (deltaS != 1) {\n    ENCODEZ(deltaS);\n    changes |= NEW_I;\n  }\n  if (TCPH_FLAGS(th) & TCP_PSH) {\n    changes |= TCP_PUSH_BIT;\n  }\n  /*\n   * Grab the cksum before we overwrite it below.  Then update our\n   * state with this packet's header.\n   */\n  deltaA = lwip_ntohs(th->chksum);\n  MEMCPY(&cs->cs_ip, ip, hlen);\n\n  /*\n   * We want to use the original packet as our compressed packet.\n   * (cp - new_seq) is the number of bytes we need for compressed\n   * sequence numbers.  In addition we need one byte for the change\n   * mask, one for the connection id and two for the tcp checksum.\n   * So, (cp - new_seq) + 4 bytes of header are needed.  hlen is how\n   * many bytes of the original packet to toss so subtract the two to\n   * get the new packet size.\n   */\n  deltaS = (u16_t)(cp - new_seq);\n  if (!comp->compressSlot || comp->last_xmit != cs->cs_id) {\n    comp->last_xmit = cs->cs_id;\n    hlen -= deltaS + 4;\n    if (pbuf_header(np, -(s16_t)hlen)){\n      /* Can we cope with this failing?  Just assert for now */\n      LWIP_ASSERT(\"pbuf_header failed\\n\", 0);\n    }\n    cp = (u8_t*)np->payload;\n    *cp++ = (u8_t)(changes | NEW_C);\n    *cp++ = cs->cs_id;\n  } else {\n    hlen -= deltaS + 3;\n    if (pbuf_header(np, -(s16_t)hlen)) {\n      /* Can we cope with this failing?  Just assert for now */\n      LWIP_ASSERT(\"pbuf_header failed\\n\", 0);\n    }\n    cp = (u8_t*)np->payload;\n    *cp++ = (u8_t)changes;\n  }\n  *cp++ = (u8_t)(deltaA >> 8);\n  *cp++ = (u8_t)deltaA;\n  MEMCPY(cp, new_seq, deltaS);\n  INCR(vjs_compressed);\n  return (TYPE_COMPRESSED_TCP);\n\n  /*\n   * Update connection state cs & send uncompressed packet (that is,\n   * a regular ip/tcp packet but with the 'conversation id' we hope\n   * to use on future compressed packets in the protocol field).\n   */\nuncompressed:\n  MEMCPY(&cs->cs_ip, ip, hlen);\n  IPH_PROTO_SET(ip, cs->cs_id);\n  comp->last_xmit = cs->cs_id;\n  return (TYPE_UNCOMPRESSED_TCP);\n}\n\n/*\n * Called when we may have missed a packet.\n */\nvoid\nvj_uncompress_err(struct vjcompress *comp)\n{\n  comp->flags |= VJF_TOSS;\n  INCR(vjs_errorin);\n}\n\n/*\n * \"Uncompress\" a packet of type TYPE_UNCOMPRESSED_TCP.\n * Return 0 on success, -1 on failure.\n */\nint\nvj_uncompress_uncomp(struct pbuf *nb, struct vjcompress *comp)\n{\n  u32_t hlen;\n  struct cstate *cs;\n  struct ip_hdr *ip;\n\n  ip = (struct ip_hdr *)nb->payload;\n  hlen = IPH_HL(ip) << 2;\n  if (IPH_PROTO(ip) >= MAX_SLOTS\n      || hlen + sizeof(struct tcp_hdr) > nb->len\n      || (hlen += TCPH_HDRLEN(((struct tcp_hdr *)&((char *)ip)[hlen])) << 2)\n          > nb->len\n      || hlen > MAX_HDR) {\n    PPPDEBUG(LOG_INFO, (\"vj_uncompress_uncomp: bad cid=%d, hlen=%d buflen=%d\\n\",\n      IPH_PROTO(ip), hlen, nb->len));\n    comp->flags |= VJF_TOSS;\n    INCR(vjs_errorin);\n    return -1;\n  }\n  cs = &comp->rstate[comp->last_recv = IPH_PROTO(ip)];\n  comp->flags &=~ VJF_TOSS;\n  IPH_PROTO_SET(ip, IP_PROTO_TCP);\n  MEMCPY(&cs->cs_ip, ip, hlen);\n  cs->cs_hlen = (u16_t)hlen;\n  INCR(vjs_uncompressedin);\n  return 0;\n}\n\n/*\n * Uncompress a packet of type TYPE_COMPRESSED_TCP.\n * The packet is composed of a buffer chain and the first buffer\n * must contain an accurate chain length.\n * The first buffer must include the entire compressed TCP/IP header.\n * This procedure replaces the compressed header with the uncompressed\n * header and returns the length of the VJ header.\n */\nint\nvj_uncompress_tcp(struct pbuf **nb, struct vjcompress *comp)\n{\n  u8_t *cp;\n  struct tcp_hdr *th;\n  struct cstate *cs;\n  struct vj_u16_t *bp;\n  struct pbuf *n0 = *nb;\n  u32_t tmp;\n  u32_t vjlen, hlen, changes;\n\n  INCR(vjs_compressedin);\n  cp = (u8_t*)n0->payload;\n  changes = *cp++;\n  if (changes & NEW_C) {\n    /*\n     * Make sure the state index is in range, then grab the state.\n     * If we have a good state index, clear the 'discard' flag.\n     */\n    if (*cp >= MAX_SLOTS) {\n      PPPDEBUG(LOG_INFO, (\"vj_uncompress_tcp: bad cid=%d\\n\", *cp));\n      goto bad;\n    }\n\n    comp->flags &=~ VJF_TOSS;\n    comp->last_recv = *cp++;\n  } else {\n    /*\n     * this packet has an implicit state index.  If we've\n     * had a line error since the last time we got an\n     * explicit state index, we have to toss the packet.\n     */\n    if (comp->flags & VJF_TOSS) {\n      PPPDEBUG(LOG_INFO, (\"vj_uncompress_tcp: tossing\\n\"));\n      INCR(vjs_tossed);\n      return (-1);\n    }\n  }\n  cs = &comp->rstate[comp->last_recv];\n  hlen = IPH_HL(&cs->cs_ip) << 2;\n  th = (struct tcp_hdr *)&((u8_t*)&cs->cs_ip)[hlen];\n  th->chksum = lwip_htons((*cp << 8) | cp[1]);\n  cp += 2;\n  if (changes & TCP_PUSH_BIT) {\n    TCPH_SET_FLAG(th, TCP_PSH);\n  } else {\n    TCPH_UNSET_FLAG(th, TCP_PSH);\n  }\n\n  switch (changes & SPECIALS_MASK) {\n  case SPECIAL_I:\n    {\n      u32_t i = lwip_ntohs(IPH_LEN(&cs->cs_ip)) - cs->cs_hlen;\n      /* some compilers can't nest inline assembler.. */\n      tmp = lwip_ntohl(th->ackno) + i;\n      th->ackno = lwip_htonl(tmp);\n      tmp = lwip_ntohl(th->seqno) + i;\n      th->seqno = lwip_htonl(tmp);\n    }\n    break;\n\n  case SPECIAL_D:\n    /* some compilers can't nest inline assembler.. */\n    tmp = lwip_ntohl(th->seqno) + lwip_ntohs(IPH_LEN(&cs->cs_ip)) - cs->cs_hlen;\n    th->seqno = lwip_htonl(tmp);\n    break;\n\n  default:\n    if (changes & NEW_U) {\n      TCPH_SET_FLAG(th, TCP_URG);\n      DECODEU(th->urgp);\n    } else {\n      TCPH_UNSET_FLAG(th, TCP_URG);\n    }\n    if (changes & NEW_W) {\n      DECODES(th->wnd);\n    }\n    if (changes & NEW_A) {\n      DECODEL(th->ackno);\n    }\n    if (changes & NEW_S) {\n      DECODEL(th->seqno);\n    }\n    break;\n  }\n  if (changes & NEW_I) {\n    DECODES(cs->cs_ip._id);\n  } else {\n    IPH_ID_SET(&cs->cs_ip, lwip_ntohs(IPH_ID(&cs->cs_ip)) + 1);\n    IPH_ID_SET(&cs->cs_ip, lwip_htons(IPH_ID(&cs->cs_ip)));\n  }\n\n  /*\n   * At this point, cp points to the first byte of data in the\n   * packet.  Fill in the IP total length and update the IP\n   * header checksum.\n   */\n  vjlen = (u16_t)(cp - (u8_t*)n0->payload);\n  if (n0->len < vjlen) {\n    /*\n     * We must have dropped some characters (crc should detect\n     * this but the old slip framing won't)\n     */\n    PPPDEBUG(LOG_INFO, (\"vj_uncompress_tcp: head buffer %d too short %d\\n\",\n          n0->len, vjlen));\n    goto bad;\n  }\n\n#if BYTE_ORDER == LITTLE_ENDIAN\n  tmp = n0->tot_len - vjlen + cs->cs_hlen;\n  IPH_LEN_SET(&cs->cs_ip, lwip_htons((u16_t)tmp));\n#else\n  IPH_LEN_SET(&cs->cs_ip, lwip_htons(n0->tot_len - vjlen + cs->cs_hlen));\n#endif\n\n  /* recompute the ip header checksum */\n  bp = (struct vj_u16_t*) &cs->cs_ip;\n  IPH_CHKSUM_SET(&cs->cs_ip, 0);\n  for (tmp = 0; hlen > 0; hlen -= 2) {\n    tmp += (*bp++).v;\n  }\n  tmp = (tmp & 0xffff) + (tmp >> 16);\n  tmp = (tmp & 0xffff) + (tmp >> 16);\n  IPH_CHKSUM_SET(&cs->cs_ip,  (u16_t)(~tmp));\n\n  /* Remove the compressed header and prepend the uncompressed header. */\n  if (pbuf_header(n0, -(s16_t)vjlen)) {\n    /* Can we cope with this failing?  Just assert for now */\n    LWIP_ASSERT(\"pbuf_header failed\\n\", 0);\n    goto bad;\n  }\n\n  if(LWIP_MEM_ALIGN(n0->payload) != n0->payload) {\n    struct pbuf *np, *q;\n    u8_t *bufptr;\n\n#if IP_FORWARD\n    /* If IP forwarding is enabled we are using a PBUF_LINK packet type so\n     * the packet is being allocated with enough header space to be\n     * forwarded (to Ethernet for example).\n     */\n    np = pbuf_alloc(PBUF_LINK, n0->len + cs->cs_hlen, PBUF_POOL);\n#else /* IP_FORWARD */\n    np = pbuf_alloc(PBUF_RAW, n0->len + cs->cs_hlen, PBUF_POOL);\n#endif /* IP_FORWARD */\n    if(!np) {\n      PPPDEBUG(LOG_WARNING, (\"vj_uncompress_tcp: realign failed\\n\"));\n      goto bad;\n    }\n\n    if (pbuf_header(np, -(s16_t)cs->cs_hlen)) {\n      /* Can we cope with this failing?  Just assert for now */\n      LWIP_ASSERT(\"pbuf_header failed\\n\", 0);\n      goto bad;\n    }\n\n    bufptr = (u8_t*)n0->payload;\n    for(q = np; q != NULL; q = q->next) {\n      MEMCPY(q->payload, bufptr, q->len);\n      bufptr += q->len;\n    }\n\n    if(n0->next) {\n      pbuf_chain(np, n0->next);\n      pbuf_dechain(n0);\n    }\n    pbuf_free(n0);\n    n0 = np;\n  }\n\n  if (pbuf_header(n0, (s16_t)cs->cs_hlen)) {\n    struct pbuf *np;\n\n    LWIP_ASSERT(\"vj_uncompress_tcp: cs->cs_hlen <= PBUF_POOL_BUFSIZE\", cs->cs_hlen <= PBUF_POOL_BUFSIZE);\n    np = pbuf_alloc(PBUF_RAW, cs->cs_hlen, PBUF_POOL);\n    if(!np) {\n      PPPDEBUG(LOG_WARNING, (\"vj_uncompress_tcp: prepend failed\\n\"));\n      goto bad;\n    }\n    pbuf_cat(np, n0);\n    n0 = np;\n  }\n  LWIP_ASSERT(\"n0->len >= cs->cs_hlen\", n0->len >= cs->cs_hlen);\n  MEMCPY(n0->payload, &cs->cs_ip, cs->cs_hlen);\n\n  *nb = n0;\n\n  return vjlen;\n\nbad:\n  comp->flags |= VJF_TOSS;\n  INCR(vjs_errorin);\n  return (-1);\n}\n\n#endif /* PPP_SUPPORT && VJ_SUPPORT */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/src/netif/slipif.c",
    "content": "/**\n * @file\n * SLIP Interface\n *\n */\n\n/*\n * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. Neither the name of the Institute nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file is built upon the file: src/arch/rtxc/netif/sioslip.c\n *\n * Author: Magnus Ivarsson <magnus.ivarsson(at)volvo.com>\n *         Simon Goldschmidt\n */\n\n\n/**\n * @defgroup slipif SLIP netif\n * @ingroup addons\n *\n * This is an arch independent SLIP netif. The specific serial hooks must be\n * provided by another file. They are sio_open, sio_read/sio_tryread and sio_send\n *\n * Usage: This netif can be used in three ways:\\n\n *        1) For NO_SYS==0, an RX thread can be used which blocks on sio_read()\n *           until data is received.\\n\n *        2) In your main loop, call slipif_poll() to check for new RX bytes,\n *           completed packets are fed into netif->input().\\n\n *        3) Call slipif_received_byte[s]() from your serial RX ISR and\n *           slipif_process_rxqueue() from your main loop. ISR level decodes\n *           packets and puts completed packets on a queue which is fed into\n *           the stack from the main loop (needs SYS_LIGHTWEIGHT_PROT for\n *           pbuf_alloc to work on ISR level!).\n *\n */\n\n#include \"netif/slipif.h\"\n#include \"lwip/opt.h\"\n\n#include \"lwip/def.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/snmp.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/sio.h\"\n\n#define SLIP_END     0xC0 /* 0300: start and end of every packet */\n#define SLIP_ESC     0xDB /* 0333: escape start (one byte escaped data follows) */\n#define SLIP_ESC_END 0xDC /* 0334: following escape: original byte is 0xC0 (END) */\n#define SLIP_ESC_ESC 0xDD /* 0335: following escape: original byte is 0xDB (ESC) */\n\n/** Maximum packet size that is received by this netif */\n#ifndef SLIP_MAX_SIZE\n#define SLIP_MAX_SIZE 1500\n#endif\n\n/** Define this to the interface speed for SNMP\n * (sio_fd is the sio_fd_t returned by sio_open).\n * The default value of zero means 'unknown'.\n */\n#ifndef SLIP_SIO_SPEED\n#define SLIP_SIO_SPEED(sio_fd) 0\n#endif\n\nenum slipif_recv_state {\n    SLIP_RECV_NORMAL,\n    SLIP_RECV_ESCAPE\n};\n\nstruct slipif_priv {\n  sio_fd_t sd;\n  /* q is the whole pbuf chain for a packet, p is the current pbuf in the chain */\n  struct pbuf *p, *q;\n  u8_t state;\n  u16_t i, recved;\n#if SLIP_RX_FROM_ISR\n  struct pbuf *rxpackets;\n#endif\n};\n\n/**\n * Send a pbuf doing the necessary SLIP encapsulation\n *\n * Uses the serial layer's sio_send()\n *\n * @param netif the lwip network interface structure for this slipif\n * @param p the pbuf chain packet to send\n * @return always returns ERR_OK since the serial layer does not provide return values\n */\nstatic err_t\nslipif_output(struct netif *netif, struct pbuf *p)\n{\n  struct slipif_priv *priv;\n  struct pbuf *q;\n  u16_t i;\n  u8_t c;\n\n  LWIP_ASSERT(\"netif != NULL\", (netif != NULL));\n  LWIP_ASSERT(\"netif->state != NULL\", (netif->state != NULL));\n  LWIP_ASSERT(\"p != NULL\", (p != NULL));\n\n  LWIP_DEBUGF(SLIP_DEBUG, (\"slipif_output(%\"U16_F\"): sending %\"U16_F\" bytes\\n\", (u16_t)netif->num, p->tot_len));\n  priv = (struct slipif_priv *)netif->state;\n\n  /* Send pbuf out on the serial I/O device. */\n  /* Start with packet delimiter. */\n  sio_send(SLIP_END, priv->sd);\n\n  for (q = p; q != NULL; q = q->next) {\n    for (i = 0; i < q->len; i++) {\n      c = ((u8_t *)q->payload)[i];\n      switch (c) {\n      case SLIP_END:\n        /* need to escape this byte (0xC0 -> 0xDB, 0xDC) */\n        sio_send(SLIP_ESC, priv->sd);\n        sio_send(SLIP_ESC_END, priv->sd);\n        break;\n      case SLIP_ESC:\n        /* need to escape this byte (0xDB -> 0xDB, 0xDD) */\n        sio_send(SLIP_ESC, priv->sd);\n        sio_send(SLIP_ESC_ESC, priv->sd);\n        break;\n      default:\n        /* normal byte - no need for escaping */\n        sio_send(c, priv->sd);\n        break;\n      }\n    }\n  }\n  /* End with packet delimiter. */\n  sio_send(SLIP_END, priv->sd);\n  return ERR_OK;\n}\n\n#if LWIP_IPV4\n/**\n * Send a pbuf doing the necessary SLIP encapsulation\n *\n * Uses the serial layer's sio_send()\n *\n * @param netif the lwip network interface structure for this slipif\n * @param p the pbuf chain packet to send\n * @param ipaddr the ip address to send the packet to (not used for slipif)\n * @return always returns ERR_OK since the serial layer does not provide return values\n */\nstatic err_t\nslipif_output_v4(struct netif *netif, struct pbuf *p, const ip4_addr_t *ipaddr)\n{\n  LWIP_UNUSED_ARG(ipaddr);\n  return slipif_output(netif, p);\n}\n#endif /* LWIP_IPV4 */\n\n#if LWIP_IPV6\n/**\n * Send a pbuf doing the necessary SLIP encapsulation\n *\n * Uses the serial layer's sio_send()\n *\n * @param netif the lwip network interface structure for this slipif\n * @param p the pbuf chain packet to send\n * @param ipaddr the ip address to send the packet to (not used for slipif)\n * @return always returns ERR_OK since the serial layer does not provide return values\n */\nstatic err_t\nslipif_output_v6(struct netif *netif, struct pbuf *p, const ip6_addr_t *ipaddr)\n{\n  LWIP_UNUSED_ARG(ipaddr);\n  return slipif_output(netif, p);\n}\n#endif /* LWIP_IPV6 */\n\n/**\n * Handle the incoming SLIP stream character by character\n *\n * @param netif the lwip network interface structure for this slipif\n * @param c received character (multiple calls to this function will\n *        return a complete packet, NULL is returned before - used for polling)\n * @return The IP packet when SLIP_END is received\n */\nstatic struct pbuf*\nslipif_rxbyte(struct netif *netif, u8_t c)\n{\n  struct slipif_priv *priv;\n  struct pbuf *t;\n\n  LWIP_ASSERT(\"netif != NULL\", (netif != NULL));\n  LWIP_ASSERT(\"netif->state != NULL\", (netif->state != NULL));\n\n  priv = (struct slipif_priv *)netif->state;\n\n  switch (priv->state) {\n  case SLIP_RECV_NORMAL:\n    switch (c) {\n    case SLIP_END:\n      if (priv->recved > 0) {\n        /* Received whole packet. */\n        /* Trim the pbuf to the size of the received packet. */\n        pbuf_realloc(priv->q, priv->recved);\n\n        LINK_STATS_INC(link.recv);\n\n        LWIP_DEBUGF(SLIP_DEBUG, (\"slipif: Got packet (%\"U16_F\" bytes)\\n\", priv->recved));\n        t = priv->q;\n        priv->p = priv->q = NULL;\n        priv->i = priv->recved = 0;\n        return t;\n      }\n      return NULL;\n    case SLIP_ESC:\n      priv->state = SLIP_RECV_ESCAPE;\n      return NULL;\n    default:\n      break;\n    } /* end switch (c) */\n    break;\n  case SLIP_RECV_ESCAPE:\n    /* un-escape END or ESC bytes, leave other bytes\n       (although that would be a protocol error) */\n    switch (c) {\n    case SLIP_ESC_END:\n      c = SLIP_END;\n      break;\n    case SLIP_ESC_ESC:\n      c = SLIP_ESC;\n      break;\n    default:\n      break;\n    }\n    priv->state = SLIP_RECV_NORMAL;\n    break;\n  default:\n    break;\n  } /* end switch (priv->state) */\n\n  /* byte received, packet not yet completely received */\n  if (priv->p == NULL) {\n    /* allocate a new pbuf */\n    LWIP_DEBUGF(SLIP_DEBUG, (\"slipif_input: alloc\\n\"));\n    priv->p = pbuf_alloc(PBUF_LINK, (PBUF_POOL_BUFSIZE - PBUF_LINK_HLEN - PBUF_LINK_ENCAPSULATION_HLEN), PBUF_POOL);\n\n    if (priv->p == NULL) {\n      LINK_STATS_INC(link.drop);\n      LWIP_DEBUGF(SLIP_DEBUG, (\"slipif_input: no new pbuf! (DROP)\\n\"));\n      /* don't process any further since we got no pbuf to receive to */\n      return NULL;\n    }\n\n    if (priv->q != NULL) {\n      /* 'chain' the pbuf to the existing chain */\n      pbuf_cat(priv->q, priv->p);\n    } else {\n      /* p is the first pbuf in the chain */\n      priv->q = priv->p;\n    }\n  }\n\n  /* this automatically drops bytes if > SLIP_MAX_SIZE */\n  if ((priv->p != NULL) && (priv->recved <= SLIP_MAX_SIZE)) {\n    ((u8_t *)priv->p->payload)[priv->i] = c;\n    priv->recved++;\n    priv->i++;\n    if (priv->i >= priv->p->len) {\n      /* on to the next pbuf */\n      priv->i = 0;\n      if (priv->p->next != NULL && priv->p->next->len > 0) {\n        /* p is a chain, on to the next in the chain */\n          priv->p = priv->p->next;\n      } else {\n        /* p is a single pbuf, set it to NULL so next time a new\n         * pbuf is allocated */\n          priv->p = NULL;\n      }\n    }\n  }\n  return NULL;\n}\n\n/** Like slipif_rxbyte, but passes completed packets to netif->input\n *\n * @param netif The lwip network interface structure for this slipif\n * @param c received character\n */\nstatic void\nslipif_rxbyte_input(struct netif *netif, u8_t c)\n{\n  struct pbuf *p;\n  p = slipif_rxbyte(netif, c);\n  if (p != NULL) {\n    if (netif->input(p, netif) != ERR_OK) {\n      pbuf_free(p);\n    }\n  }\n}\n\n#if SLIP_USE_RX_THREAD\n/**\n * The SLIP input thread.\n *\n * Feed the IP layer with incoming packets\n *\n * @param nf the lwip network interface structure for this slipif\n */\nstatic void\nslipif_loop_thread(void *nf)\n{\n  u8_t c;\n  struct netif *netif = (struct netif *)nf;\n  struct slipif_priv *priv = (struct slipif_priv *)netif->state;\n\n  while (1) {\n    if (sio_read(priv->sd, &c, 1) > 0) {\n      slipif_rxbyte_input(netif, c);\n    }\n  }\n}\n#endif /* SLIP_USE_RX_THREAD */\n\n/**\n * SLIP netif initialization\n *\n * Call the arch specific sio_open and remember\n * the opened device in the state field of the netif.\n *\n * @param netif the lwip network interface structure for this slipif\n * @return ERR_OK if serial line could be opened,\n *         ERR_MEM if no memory could be allocated,\n *         ERR_IF is serial line couldn't be opened\n *\n * @note netif->num must contain the number of the serial port to open\n *       (0 by default). If netif->state is != NULL, it is interpreted as an\n *       u8_t pointer pointing to the serial port number instead of netif->num.\n *\n */\nerr_t\nslipif_init(struct netif *netif)\n{\n  struct slipif_priv *priv;\n  u8_t sio_num;\n\n  LWIP_DEBUGF(SLIP_DEBUG, (\"slipif_init: netif->num=%\"U16_F\"\\n\", (u16_t)netif->num));\n\n  /* Allocate private data */\n  priv = (struct slipif_priv *)mem_malloc(sizeof(struct slipif_priv));\n  if (!priv) {\n    return ERR_MEM;\n  }\n\n  netif->name[0] = 's';\n  netif->name[1] = 'l';\n#if LWIP_IPV4\n  netif->output = slipif_output_v4;\n#endif /* LWIP_IPV4 */\n#if LWIP_IPV6\n  netif->output_ip6 = slipif_output_v6;\n#endif /* LWIP_IPV6 */\n  netif->mtu = SLIP_MAX_SIZE;\n\n  /* netif->state or netif->num contain the port number */\n  if (netif->state != NULL) {\n    sio_num = *(u8_t*)netif->state;\n  } else {\n    sio_num = netif->num;\n  }\n  /* Try to open the serial port. */\n  priv->sd = sio_open(sio_num);\n  if (!priv->sd) {\n    /* Opening the serial port failed. */\n    mem_free(priv);\n    return ERR_IF;\n  }\n\n  /* Initialize private data */\n  priv->p = NULL;\n  priv->q = NULL;\n  priv->state = SLIP_RECV_NORMAL;\n  priv->i = 0;\n  priv->recved = 0;\n#if SLIP_RX_FROM_ISR\n  priv->rxpackets = NULL;\n#endif\n\n  netif->state = priv;\n\n  /* initialize the snmp variables and counters inside the struct netif */\n  MIB2_INIT_NETIF(netif, snmp_ifType_slip, SLIP_SIO_SPEED(priv->sd));\n\n#if SLIP_USE_RX_THREAD\n  /* Create a thread to poll the serial line. */\n  sys_thread_new(SLIPIF_THREAD_NAME, slipif_loop_thread, netif,\n    SLIPIF_THREAD_STACKSIZE, SLIPIF_THREAD_PRIO);\n#endif /* SLIP_USE_RX_THREAD */\n  return ERR_OK;\n}\n\n/**\n * Polls the serial device and feeds the IP layer with incoming packets.\n *\n * @param netif The lwip network interface structure for this slipif\n */\nvoid\nslipif_poll(struct netif *netif)\n{\n  u8_t c;\n  struct slipif_priv *priv;\n\n  LWIP_ASSERT(\"netif != NULL\", (netif != NULL));\n  LWIP_ASSERT(\"netif->state != NULL\", (netif->state != NULL));\n\n  priv = (struct slipif_priv *)netif->state;\n\n  while (sio_tryread(priv->sd, &c, 1) > 0) {\n    slipif_rxbyte_input(netif, c);\n  }\n}\n\n#if SLIP_RX_FROM_ISR\n/**\n * Feeds the IP layer with incoming packets that were receive\n *\n * @param netif The lwip network interface structure for this slipif\n */\nvoid\nslipif_process_rxqueue(struct netif *netif)\n{\n  struct slipif_priv *priv;\n  SYS_ARCH_DECL_PROTECT(old_level);\n\n  LWIP_ASSERT(\"netif != NULL\", (netif != NULL));\n  LWIP_ASSERT(\"netif->state != NULL\", (netif->state != NULL));\n\n  priv = (struct slipif_priv *)netif->state;\n\n  SYS_ARCH_PROTECT(old_level);\n  while (priv->rxpackets != NULL) {\n    struct pbuf *p = priv->rxpackets;\n#if SLIP_RX_QUEUE\n    /* dequeue packet */\n    struct pbuf *q = p;\n    while ((q->len != q->tot_len) && (q->next != NULL)) {\n      q = q->next;\n    }\n    priv->rxpackets = q->next;\n    q->next = NULL;\n#else /* SLIP_RX_QUEUE */\n    priv->rxpackets = NULL;\n#endif /* SLIP_RX_QUEUE */\n    SYS_ARCH_UNPROTECT(old_level);\n    if (netif->input(p, netif) != ERR_OK) {\n      pbuf_free(p);\n    }\n    SYS_ARCH_PROTECT(old_level);\n  }\n}\n\n/** Like slipif_rxbyte, but queues completed packets.\n *\n * @param netif The lwip network interface structure for this slipif\n * @param data Received serial byte\n */\nstatic void\nslipif_rxbyte_enqueue(struct netif *netif, u8_t data)\n{\n  struct pbuf *p;\n  struct slipif_priv *priv = (struct slipif_priv *)netif->state;\n  SYS_ARCH_DECL_PROTECT(old_level);\n\n  p = slipif_rxbyte(netif, data);\n  if (p != NULL) {\n    SYS_ARCH_PROTECT(old_level);\n    if (priv->rxpackets != NULL) {\n#if SLIP_RX_QUEUE\n      /* queue multiple pbufs */\n      struct pbuf *q = p;\n      while (q->next != NULL) {\n        q = q->next;\n      }\n      q->next = p;\n    } else {\n#else /* SLIP_RX_QUEUE */\n      pbuf_free(priv->rxpackets);\n    }\n    {\n#endif /* SLIP_RX_QUEUE */\n      priv->rxpackets = p;\n    }\n    SYS_ARCH_UNPROTECT(old_level);\n  }\n}\n\n/**\n * Process a received byte, completed packets are put on a queue that is\n * fed into IP through slipif_process_rxqueue().\n *\n * This function can be called from ISR if SYS_LIGHTWEIGHT_PROT is enabled.\n *\n * @param netif The lwip network interface structure for this slipif\n * @param data received character\n */\nvoid\nslipif_received_byte(struct netif *netif, u8_t data)\n{\n  LWIP_ASSERT(\"netif != NULL\", (netif != NULL));\n  LWIP_ASSERT(\"netif->state != NULL\", (netif->state != NULL));\n  slipif_rxbyte_enqueue(netif, data);\n}\n\n/**\n * Process multiple received byte, completed packets are put on a queue that is\n * fed into IP through slipif_process_rxqueue().\n *\n * This function can be called from ISR if SYS_LIGHTWEIGHT_PROT is enabled.\n *\n * @param netif The lwip network interface structure for this slipif\n * @param data received character\n * @param len Number of received characters\n */\nvoid\nslipif_received_bytes(struct netif *netif, u8_t *data, u8_t len)\n{\n  u8_t i;\n  u8_t *rxdata = data;\n  LWIP_ASSERT(\"netif != NULL\", (netif != NULL));\n  LWIP_ASSERT(\"netif->state != NULL\", (netif->state != NULL));\n\n  for (i = 0; i < len; i++, rxdata++) {\n    slipif_rxbyte_enqueue(netif, *rxdata);\n  }\n}\n#endif /* SLIP_RX_FROM_ISR */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/fuzz/Makefile",
    "content": "#\n# Copyright (c) 2001, 2002 Swedish Institute of Computer Science.\n# All rights reserved. \n# \n# Redistribution and use in source and binary forms, with or without modification, \n# are permitted provided that the following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice,\n#    this list of conditions and the following disclaimer.\n# 2. Redistributions in binary form must reproduce the above copyright notice,\n#    this list of conditions and the following disclaimer in the documentation\n#    and/or other materials provided with the distribution.\n# 3. The name of the author may not be used to endorse or promote products\n#    derived from this software without specific prior written permission. \n#\n# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n# SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n# OF SUCH DAMAGE.\n#\n# This file is part of the lwIP TCP/IP stack.\n# \n# Author: Adam Dunkels <adam@sics.se>\n#\n\nall compile: lwip_fuzz\n.PHONY: all clean\n\nCC=afl-gcc\nLDFLAGS=-lm\nCFLAGS=-O0\n\nCONTRIBDIR=../../../lwip-contrib\ninclude $(CONTRIBDIR)/ports/unix/Common.mk\n\nclean:\n\trm -f *.o $(LWIPLIBCOMMON) lwip_fuzz *.s .depend* *.core core\n\ndepend dep: .depend\n\ninclude .depend\n\n.depend: fuzz.c $(LWIPFILES) $(APPFILES)\n\t$(CCDEP) $(CFLAGS) -MM $^ > .depend || rm -f .depend\n\nlwip_fuzz: .depend $(LWIPLIBCOMMON) fuzz.o\n\t$(CC) $(CFLAGS) -o lwip_fuzz fuzz.o $(LWIPLIBCOMMON) $(LDFLAGS)\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/fuzz/README",
    "content": "\nFuzzing the lwIP stack (afl-fuzz requires linux/unix or similar)\n\nThis directory contains a small app that reads Ethernet frames from stdin and\nprocesses them. It is used together with the 'american fuzzy lop' tool (found\nat http://lcamtuf.coredump.cx/afl/) and the sample inputs to test how\nunexpected inputs are handled. The afl tool will read the known inputs, and\ntry to modify them to exercise as many code paths as possible, by instrumenting\nthe code and keeping track of which code is executed.\n\nJust running make will produce the test program.\n\nThen run afl with:\n\nafl-fuzz -i inputs/<INPUT> -o output ./lwip_fuzz\n\nand it should start working. It will probably complain about CPU scheduler,\nset AFL_SKIP_CPUFREQ=1 to ignore it.\nIf it complains about invalid \"/proc/sys/kernel/core_pattern\" setting, try\nexecuting \"sudo bash -c 'echo core > /proc/sys/kernel/core_pattern'\".\n\nThe input is split into different subdirectories since they test different\nparts of the code, and since you want to run one instance of afl-fuzz on each\ncore.\n\nWhen afl finds a crash or a hang, the input that caused it will be placed in\nthe output directory. If you have hexdump and text2pcap tools installed,\nrunning output_to_pcap.sh <outputdir> will create pcap files for each input\nfile to simplify viewing in wireshark.\n\nThe lwipopts.h file needs to have checksum checking off, otherwise almost every\npacket will be discarded because of that. The other options can be tuned to\nexpose different parts of the code.\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/fuzz/config.h",
    "content": ""
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/fuzz/fuzz.c",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Erik Ekman <erik@kryo.se>\n *\n */\n\n#include \"lwip/init.h\"\n#include \"lwip/netif.h\"\n#include \"netif/etharp.h\"\n#if LWIP_IPV6\n#include \"lwip/ethip6.h\"\n#include \"lwip/nd6.h\"\n#endif\n#include <string.h>\n#include <stdio.h>\n\n/* no-op send function */\nstatic err_t lwip_tx_func(struct netif *netif, struct pbuf *p)\n{\n  LWIP_UNUSED_ARG(netif);\n  LWIP_UNUSED_ARG(p);\n  return ERR_OK;\n}\n\nstatic err_t testif_init(struct netif *netif)\n{\n  netif->name[0] = 'f';\n  netif->name[1] = 'z';\n  netif->output = etharp_output;\n  netif->linkoutput = lwip_tx_func;\n  netif->mtu = 1500;\n  netif->hwaddr_len = 6;\n  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;\n\n  netif->hwaddr[0] = 0x00;\n  netif->hwaddr[1] = 0x23;\n  netif->hwaddr[2] = 0xC1;\n  netif->hwaddr[3] = 0xDE;\n  netif->hwaddr[4] = 0xD0;\n  netif->hwaddr[5] = 0x0D;\n\n#if LWIP_IPV6\n  netif->output_ip6 = ethip6_output;\n  netif->ip6_autoconfig_enabled = 1;\n  netif_create_ip6_linklocal_address(netif, 1);\n  netif->flags |= NETIF_FLAG_MLD6;\n#endif\n\n  return ERR_OK;\n}\n\nstatic void input_pkt(struct netif *netif, const u8_t *data, size_t len)\n{\n  struct pbuf *p, *q;\n  err_t err;\n\n  LWIP_ASSERT(\"pkt too big\", len <= 0xFFFF);\n  p = pbuf_alloc(PBUF_RAW, (u16_t)len, PBUF_POOL);\n  LWIP_ASSERT(\"alloc failed\", p);\n  for(q = p; q != NULL; q = q->next) {\n    MEMCPY(q->payload, data, q->len);\n    data += q->len;\n  }\n  err = netif->input(p, netif);\n  if (err != ERR_OK) {\n    pbuf_free(p);\n  }\n}\n\nint main(int argc, char** argv)\n{\n  struct netif net_test;\n  ip4_addr_t addr;\n  ip4_addr_t netmask;\n  ip4_addr_t gw;\n  u8_t pktbuf[2000];\n  size_t len;\n\n  lwip_init();\n\n  IP4_ADDR(&addr, 172, 30, 115, 84);\n  IP4_ADDR(&netmask, 255, 255, 255, 0);\n  IP4_ADDR(&gw, 172, 30, 115, 1);\n\n  netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);\n  netif_set_up(&net_test);\n\n#if LWIP_IPV6\n  nd6_tmr(); /* tick nd to join multicast groups */\n#endif\n\n  if(argc > 1) {\n    FILE* f;\n    const char* filename;\n    printf(\"reading input from file... \");\n    fflush(stdout);\n    filename = argv[1];\n    LWIP_ASSERT(\"invalid filename\", filename != NULL);\n    f = fopen(filename, \"rb\");\n    LWIP_ASSERT(\"open failed\", f != NULL);\n    len = fread(pktbuf, 1, sizeof(pktbuf), f);\n    fclose(f);\n    printf(\"testing file: \\\"%s\\\"...\\r\\n\", filename);\n  } else {\n    len = fread(pktbuf, 1, sizeof(pktbuf), stdin);\n  }\n  input_pkt(&net_test, pktbuf, len);\n\n  return 0;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/fuzz/lwipopts.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Simon Goldschmidt\n *\n */\n#ifndef LWIP_HDR_LWIPOPTS_H__\n#define LWIP_HDR_LWIPOPTS_H__\n\n/* Prevent having to link sys_arch.c (we don't test the API layers in unit tests) */\n#define NO_SYS                          1\n#define LWIP_NETCONN                    0\n#define LWIP_SOCKET                     0\n#define SYS_LIGHTWEIGHT_PROT            0\n\n#define LWIP_IPV6                       1\n#define IPV6_FRAG_COPYHEADER            1\n#define LWIP_IPV6_DUP_DETECT_ATTEMPTS   0\n\n/* Enable DHCP to test it */\n#define LWIP_DHCP                       1\n\n/* Turn off checksum verification of fuzzed data */\n#define CHECKSUM_CHECK_IP               0\n#define CHECKSUM_CHECK_UDP              0\n#define CHECKSUM_CHECK_TCP              0\n#define CHECKSUM_CHECK_ICMP             0\n#define CHECKSUM_CHECK_ICMP6            0\n\n/* Minimal changes to opt.h required for tcp unit tests: */\n#define MEM_SIZE                        16000\n#define TCP_SND_QUEUELEN                40\n#define MEMP_NUM_TCP_SEG                TCP_SND_QUEUELEN\n#define TCP_SND_BUF                     (12 * TCP_MSS)\n#define TCP_WND                         (10 * TCP_MSS)\n#define LWIP_WND_SCALE                  1\n#define TCP_RCV_SCALE                   0\n#define PBUF_POOL_SIZE                  400 /* pbuf tests need ~200KByte */\n\n/* Minimal changes to opt.h required for etharp unit tests: */\n#define ETHARP_SUPPORT_STATIC_ENTRIES   1\n\n#endif /* LWIP_HDR_LWIPOPTS_H__ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/fuzz/output_to_pcap.sh",
    "content": "#!/bin/bash\n\nif [ -z \"$1\" ]\nthen\n\techo \"This script will make pcap files from the afl-fuzz crash/hang files\"\n\techo \"It needs hexdump and text2pcap\"\n\techo \"Please give output directory as argument\"\n\texit 2\nfi\n\nfor i in `ls $1/crashes/id*`\ndo\n\tPCAPNAME=`echo $i | grep pcap`\n\tif [ -z \"$PCAPNAME\" ]; then\n\t\thexdump -C $i > $1/$$.tmp\n\t\ttext2pcap $1/$$.tmp ${i}.pcap\n\tfi\ndone\nfor i in `ls $1/hangs/id*`\ndo\n\tPCAPNAME=`echo $i | grep pcap`\n\tif [ -z \"$PCAPNAME\" ]; then\n\t\thexdump -C $i > $1/$$.tmp\n\t\ttext2pcap $1/$$.tmp ${i}.pcap\n\tfi\ndone\nrm -f $1/$$.tmp\n\necho\necho \"Created pcap files:\"\nls $1/*/*.pcap\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/core/test_mem.c",
    "content": "#include \"test_mem.h\"\n\n#include \"lwip/mem.h\"\n#include \"lwip/stats.h\"\n\n#if !LWIP_STATS || !MEM_STATS\n#error \"This tests needs MEM-statistics enabled\"\n#endif\n#if LWIP_DNS\n#error \"This test needs DNS turned off (as it mallocs on init)\"\n#endif\n\n/* Setups/teardown functions */\n\nstatic void\nmem_setup(void)\n{\n}\n\nstatic void\nmem_teardown(void)\n{\n}\n\n\n/* Test functions */\n\n/** Call mem_malloc, mem_free and mem_trim and check stats */\nSTART_TEST(test_mem_one)\n{\n#define SIZE1   16\n#define SIZE1_2 12\n#define SIZE2   16\n  void *p1, *p2;\n  mem_size_t s1, s2;\n  LWIP_UNUSED_ARG(_i);\n\n  fail_unless(lwip_stats.mem.used == 0);\n\n  p1 = mem_malloc(SIZE1);\n  fail_unless(p1 != NULL);\n  fail_unless(lwip_stats.mem.used >= SIZE1);\n  s1 = lwip_stats.mem.used;\n\n  p2 = mem_malloc(SIZE2);\n  fail_unless(p2 != NULL);\n  fail_unless(lwip_stats.mem.used >= SIZE2 + s1);\n  s2 = lwip_stats.mem.used;\n\n  mem_trim(p1, SIZE1_2);\n\n  mem_free(p2);\n  fail_unless(lwip_stats.mem.used <= s2 - SIZE2);\n\n  mem_free(p1);\n  fail_unless(lwip_stats.mem.used == 0);\n}\nEND_TEST\n\nstatic void malloc_keep_x(int x, int num, int size, int freestep)\n{\n   int i;\n   void* p[16];\n   LWIP_ASSERT(\"invalid size\", size >= 0 && size < (mem_size_t)-1);\n   memset(p, 0, sizeof(p));\n   for(i = 0; i < num && i < 16; i++) {\n      p[i] = mem_malloc((mem_size_t)size);\n      fail_unless(p[i] != NULL);\n   }\n   for(i = 0; i < num && i < 16; i += freestep) {\n      if (i == x) {\n         continue;\n      }\n      mem_free(p[i]);\n      p[i] = NULL;\n   }\n   for(i = 0; i < num && i < 16; i++) {\n      if (i == x) {\n         continue;\n      }\n      if (p[i] != NULL) {\n         mem_free(p[i]);\n         p[i] = NULL;\n      }\n   }\n   fail_unless(p[x] != NULL);\n   mem_free(p[x]);\n}\n\nSTART_TEST(test_mem_random)\n{\n  const int num = 16;\n  int x;\n  int size;\n  int freestep;\n  LWIP_UNUSED_ARG(_i);\n\n  fail_unless(lwip_stats.mem.used == 0);\n\n  for (x = 0; x < num; x++) {\n     for (size = 1; size < 32; size++) {\n        for (freestep = 1; freestep <= 3; freestep++) {\n          fail_unless(lwip_stats.mem.used == 0);\n          malloc_keep_x(x, num, size, freestep);\n          fail_unless(lwip_stats.mem.used == 0);\n        }\n     }\n  }\n}\nEND_TEST\n\n/** Create the suite including all tests for this module */\nSuite *\nmem_suite(void)\n{\n  testfunc tests[] = {\n    TESTFUNC(test_mem_one),\n    TESTFUNC(test_mem_random)\n  };\n  return create_suite(\"MEM\", tests, sizeof(tests)/sizeof(testfunc), mem_setup, mem_teardown);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/core/test_mem.h",
    "content": "#ifndef LWIP_HDR_TEST_MEM_H\n#define LWIP_HDR_TEST_MEM_H\n\n#include \"../lwip_check.h\"\n\nSuite *mem_suite(void);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/core/test_pbuf.c",
    "content": "#include \"test_pbuf.h\"\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/stats.h\"\n\n#if !LWIP_STATS || !MEM_STATS ||!MEMP_STATS\n#error \"This tests needs MEM- and MEMP-statistics enabled\"\n#endif\n#if LWIP_DNS\n#error \"This test needs DNS turned off (as it mallocs on init)\"\n#endif\n#if !LWIP_TCP || !TCP_QUEUE_OOSEQ || !LWIP_WND_SCALE\n#error \"This test needs TCP OOSEQ queueing and window scaling enabled\"\n#endif\n\n/* Setups/teardown functions */\n\nstatic void\npbuf_setup(void)\n{\n}\n\nstatic void\npbuf_teardown(void)\n{\n}\n\n\n#define TESTBUFSIZE_1 65535\n#define TESTBUFSIZE_2 65530\n#define TESTBUFSIZE_3 50050\nstatic u8_t testbuf_1[TESTBUFSIZE_1];\nstatic u8_t testbuf_1a[TESTBUFSIZE_1];\nstatic u8_t testbuf_2[TESTBUFSIZE_2];\nstatic u8_t testbuf_2a[TESTBUFSIZE_2];\nstatic u8_t testbuf_3[TESTBUFSIZE_3];\nstatic u8_t testbuf_3a[TESTBUFSIZE_3];\n\n/* Test functions */\n\n/** Call pbuf_copy on a pbuf with zero length */\nSTART_TEST(test_pbuf_copy_zero_pbuf)\n{\n  struct pbuf *p1, *p2, *p3;\n  err_t err;\n  LWIP_UNUSED_ARG(_i);\n\n  fail_unless(lwip_stats.mem.used == 0);\n  fail_unless(MEMP_STATS_GET(used, MEMP_PBUF_POOL) == 0);\n\n  p1 = pbuf_alloc(PBUF_RAW, 1024, PBUF_RAM);\n  fail_unless(p1 != NULL);\n  fail_unless(p1->ref == 1);\n\n  p2 = pbuf_alloc(PBUF_RAW, 2, PBUF_POOL);\n  fail_unless(p2 != NULL);\n  fail_unless(p2->ref == 1);\n  p2->len = p2->tot_len = 0;\n\n  pbuf_cat(p1, p2);\n  fail_unless(p1->ref == 1);\n  fail_unless(p2->ref == 1);\n\n  p3 = pbuf_alloc(PBUF_RAW, p1->tot_len, PBUF_POOL);\n  err = pbuf_copy(p3, p1);\n  fail_unless(err == ERR_VAL);\n\n  pbuf_free(p1);\n  pbuf_free(p3);\n  fail_unless(lwip_stats.mem.used == 0);\n\n  fail_unless(lwip_stats.mem.used == 0);\n  fail_unless(MEMP_STATS_GET(used, MEMP_PBUF_POOL) == 0);\n}\nEND_TEST\n\nSTART_TEST(test_pbuf_split_64k_on_small_pbufs)\n{\n  struct pbuf *p, *rest=NULL;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, 1, PBUF_POOL);\n  pbuf_split_64k(p, &rest);\n  fail_unless(p->tot_len == 1);\n  pbuf_free(p);\n}\nEND_TEST\n\nSTART_TEST(test_pbuf_queueing_bigger_than_64k)\n{\n  int i;\n  err_t err;\n  struct pbuf *p1, *p2, *p3, *rest2=NULL, *rest3=NULL;\n  LWIP_UNUSED_ARG(_i);\n\n  for(i = 0; i < TESTBUFSIZE_1; i++) {\n    testbuf_1[i] = (u8_t)rand();\n  }\n  for(i = 0; i < TESTBUFSIZE_2; i++) {\n    testbuf_2[i] = (u8_t)rand();\n  }\n  for(i = 0; i < TESTBUFSIZE_3; i++) {\n    testbuf_3[i] = (u8_t)rand();\n  }\n\n  p1 = pbuf_alloc(PBUF_RAW, TESTBUFSIZE_1, PBUF_POOL);\n  fail_unless(p1 != NULL);\n  p2 = pbuf_alloc(PBUF_RAW, TESTBUFSIZE_2, PBUF_POOL);\n  fail_unless(p2 != NULL);\n  p3 = pbuf_alloc(PBUF_RAW, TESTBUFSIZE_3, PBUF_POOL);\n  fail_unless(p3 != NULL);\n  err = pbuf_take(p1, testbuf_1, TESTBUFSIZE_1);\n  fail_unless(err == ERR_OK);\n  err = pbuf_take(p2, testbuf_2, TESTBUFSIZE_2);\n  fail_unless(err == ERR_OK);\n  err = pbuf_take(p3, testbuf_3, TESTBUFSIZE_3);\n  fail_unless(err == ERR_OK);\n\n  pbuf_cat(p1, p2);\n  pbuf_cat(p1, p3);\n\n  pbuf_split_64k(p1, &rest2);\n  fail_unless(p1->tot_len == TESTBUFSIZE_1);\n  fail_unless(rest2->tot_len == (u16_t)((TESTBUFSIZE_2+TESTBUFSIZE_3) & 0xFFFF));\n  pbuf_split_64k(rest2, &rest3);\n  fail_unless(rest2->tot_len == TESTBUFSIZE_2);\n  fail_unless(rest3->tot_len == TESTBUFSIZE_3);\n\n  pbuf_copy_partial(p1, testbuf_1a, TESTBUFSIZE_1, 0);\n  pbuf_copy_partial(rest2, testbuf_2a, TESTBUFSIZE_2, 0);\n  pbuf_copy_partial(rest3, testbuf_3a, TESTBUFSIZE_3, 0);\n  for(i = 0; i < TESTBUFSIZE_1; i++)\n    fail_unless(testbuf_1[i] == testbuf_1a[i]);\n  for(i = 0; i < TESTBUFSIZE_2; i++)\n    fail_unless(testbuf_2[i] == testbuf_2a[i]);\n  for(i = 0; i < TESTBUFSIZE_3; i++)\n    fail_unless(testbuf_3[i] == testbuf_3a[i]);\n\n  pbuf_free(p1);\n  pbuf_free(rest2);\n  pbuf_free(rest3);\n}\nEND_TEST\n\n/* Test for bug that writing with pbuf_take_at() did nothing\n * and returned ERR_OK when writing at beginning of a pbuf\n * in the chain.\n */\nSTART_TEST(test_pbuf_take_at_edge)\n{\n  err_t res;\n  u8_t *out;\n  int i;\n  u8_t testdata[] = { 0x01, 0x08, 0x82, 0x02 };\n  struct pbuf *p = pbuf_alloc(PBUF_RAW, 1024, PBUF_POOL);\n  struct pbuf *q = p->next;\n  LWIP_UNUSED_ARG(_i);\n  /* alloc big enough to get a chain of pbufs */\n  fail_if(p->tot_len == p->len);\n  memset(p->payload, 0, p->len);\n  memset(q->payload, 0, q->len);\n\n  /* copy data to the beginning of first pbuf */\n  res = pbuf_take_at(p, &testdata, sizeof(testdata), 0);\n  fail_unless(res == ERR_OK);\n\n  out = (u8_t*)p->payload;\n  for (i = 0; i < (int)sizeof(testdata); i++) {\n    fail_unless(out[i] == testdata[i],\n      \"Bad data at pos %d, was %02X, expected %02X\", i, out[i], testdata[i]);\n  }\n\n  /* copy data to the just before end of first pbuf */\n  res = pbuf_take_at(p, &testdata, sizeof(testdata), p->len - 1);\n  fail_unless(res == ERR_OK);\n\n  out = (u8_t*)p->payload;\n  fail_unless(out[p->len - 1] == testdata[0],\n    \"Bad data at pos %d, was %02X, expected %02X\", p->len - 1, out[p->len - 1], testdata[0]);\n  out = (u8_t*)q->payload;\n  for (i = 1; i < (int)sizeof(testdata); i++) {\n    fail_unless(out[i-1] == testdata[i],\n      \"Bad data at pos %d, was %02X, expected %02X\", p->len - 1 + i, out[i-1], testdata[i]);\n  }\n\n  /* copy data to the beginning of second pbuf */\n  res = pbuf_take_at(p, &testdata, sizeof(testdata), p->len);\n  fail_unless(res == ERR_OK);\n\n  out = (u8_t*)p->payload;\n  for (i = 0; i < (int)sizeof(testdata); i++) {\n    fail_unless(out[i] == testdata[i],\n      \"Bad data at pos %d, was %02X, expected %02X\", p->len+i, out[i], testdata[i]);\n  }\n}\nEND_TEST\n\n/* Verify pbuf_put_at()/pbuf_get_at() when using\n * offsets equal to beginning of new pbuf in chain\n */\nSTART_TEST(test_pbuf_get_put_at_edge)\n{\n  u8_t *out;\n  u8_t testdata = 0x01;\n  u8_t getdata;\n  struct pbuf *p = pbuf_alloc(PBUF_RAW, 1024, PBUF_POOL);\n  struct pbuf *q = p->next;\n  LWIP_UNUSED_ARG(_i);\n  /* alloc big enough to get a chain of pbufs */\n  fail_if(p->tot_len == p->len);\n  memset(p->payload, 0, p->len);\n  memset(q->payload, 0, q->len);\n\n  /* put byte at the beginning of second pbuf */\n  pbuf_put_at(p, p->len, testdata);\n\n  out = (u8_t*)q->payload;\n  fail_unless(*out == testdata,\n    \"Bad data at pos %d, was %02X, expected %02X\", p->len, *out, testdata);\n\n  getdata = pbuf_get_at(p, p->len);\n  fail_unless(*out == getdata,\n    \"pbuf_get_at() returned bad data at pos %d, was %02X, expected %02X\", p->len, getdata, *out);\n}\nEND_TEST\n\n/** Create the suite including all tests for this module */\nSuite *\npbuf_suite(void)\n{\n  testfunc tests[] = {\n    TESTFUNC(test_pbuf_copy_zero_pbuf),\n    TESTFUNC(test_pbuf_split_64k_on_small_pbufs),\n    TESTFUNC(test_pbuf_queueing_bigger_than_64k),\n    TESTFUNC(test_pbuf_take_at_edge),\n    TESTFUNC(test_pbuf_get_put_at_edge)\n  };\n  return create_suite(\"PBUF\", tests, sizeof(tests)/sizeof(testfunc), pbuf_setup, pbuf_teardown);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/core/test_pbuf.h",
    "content": "#ifndef LWIP_HDR_TEST_PBUF_H\n#define LWIP_HDR_TEST_PBUF_H\n\n#include \"../lwip_check.h\"\n\nSuite *pbuf_suite(void);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/dhcp/test_dhcp.c",
    "content": "#include \"test_dhcp.h\"\n\n#include \"lwip/netif.h\"\n#include \"lwip/dhcp.h\"\n#include \"lwip/prot/dhcp.h\"\n#include \"lwip/etharp.h\"\n#include \"netif/ethernet.h\"\n\nstruct netif net_test;\n\nstatic const u8_t broadcast[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };\n\nstatic const u8_t magic_cookie[] = { 0x63, 0x82, 0x53, 0x63 };\n\nstatic u8_t dhcp_offer[] = {\n    0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, /* To unit */\n    0x00, 0x0F, 0xEE, 0x30, 0xAB, 0x22, /* From Remote host */\n    0x08, 0x00, /* Protocol: IP */\n    0x45, 0x10, 0x01, 0x48, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x36, 0xcc, 0xc3, 0xaa, 0xbd, 0xab, 0xc3, 0xaa, 0xbd, 0xc8, /* IP header */\n    0x00, 0x43, 0x00, 0x44, 0x01, 0x34, 0x00, 0x00, /* UDP header */\n\n    0x02, /* Type == Boot reply */\n    0x01, 0x06, /* Hw Ethernet, 6 bytes addrlen */\n    0x00, /* 0 hops */\n    0xAA, 0xAA, 0xAA, 0xAA, /* Transaction id, will be overwritten */\n    0x00, 0x00, /* 0 seconds elapsed */\n    0x00, 0x00, /* Flags (unicast) */\n    0x00, 0x00, 0x00, 0x00, /* Client ip */\n    0xc3, 0xaa, 0xbd, 0xc8, /* Your IP */\n    0xc3, 0xaa, 0xbd, 0xab, /* DHCP server ip */\n    0x00, 0x00, 0x00, 0x00, /* relay agent */\n    0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* MAC addr + padding */\n\n    /* Empty server name and boot file name */\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00,\n\n    0x63, 0x82, 0x53, 0x63, /* Magic cookie */\n    0x35, 0x01, 0x02, /* Message type: Offer */\n    0x36, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* Server identifier (IP) */\n    0x33, 0x04, 0x00, 0x00, 0x00, 0x78, /* Lease time 2 minutes */\n    0x03, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* Router IP */\n    0x01, 0x04, 0xff, 0xff, 0xff, 0x00, /* Subnet mask */\n    0xff, /* End option */\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Padding */\n};\n\nstatic u8_t dhcp_ack[] = {\n    0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, /* To unit */\n    0x00, 0x0f, 0xEE, 0x30, 0xAB, 0x22, /* From remote host */\n    0x08, 0x00, /* Proto IP */\n    0x45, 0x10, 0x01, 0x48, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x36, 0xcc, 0xc3, 0xaa, 0xbd, 0xab, 0xc3, 0xaa, 0xbd, 0xc8, /* IP header */\n    0x00, 0x43, 0x00, 0x44, 0x01, 0x34, 0x00, 0x00, /* UDP header */\n    0x02, /* Bootp reply */\n    0x01, 0x06, /* Hw type Eth, len 6 */\n    0x00, /* 0 hops */\n    0xAA, 0xAA, 0xAA, 0xAA,\n    0x00, 0x00, /* 0 seconds elapsed */\n    0x00, 0x00, /* Flags (unicast) */\n    0x00, 0x00, 0x00, 0x00, /* Client IP */\n    0xc3, 0xaa, 0xbd, 0xc8, /* Your IP */\n    0xc3, 0xaa, 0xbd, 0xab, /* DHCP server IP */\n    0x00, 0x00, 0x00, 0x00, /* Relay agent */\n    0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Macaddr + padding */\n\n    /* Empty server name and boot file name */\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00,\n\n    0x63, 0x82, 0x53, 0x63, /* Magic cookie */\n    0x35, 0x01, 0x05, /* Dhcp message type ack */\n    0x36, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* DHCP server identifier */\n    0x33, 0x04, 0x00, 0x00, 0x00, 0x78, /* Lease time 2 minutes */\n    0x03, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* Router IP */\n    0x01, 0x04, 0xff, 0xff, 0xff, 0x00, /* Netmask */\n    0xff, /* End marker */\n\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Padding */\n};\n\nstatic const u8_t arpreply[] = {\n    0x00, 0x23, 0xC1, 0xDE, 0xD0, 0x0D, /* dst mac */\n    0x00, 0x32, 0x44, 0x20, 0x01, 0x02, /* src mac */\n    0x08, 0x06, /* proto arp */\n    0x00, 0x01, /* hw eth */\n    0x08, 0x00, /* proto ip */\n    0x06, /* hw addr len 6 */\n    0x04, /* proto addr len 4 */\n    0x00, 0x02, /* arp reply */\n    0x00, 0x32, 0x44, 0x20, 0x01, 0x02, /* sender mac */\n    0xc3, 0xaa, 0xbd, 0xc8, /* sender ip */\n    0x00, 0x23, 0xC1, 0xDE, 0xD0, 0x0D, /* target mac */\n    0x00, 0x00, 0x00, 0x00, /* target ip */\n};\n\nstatic int txpacket;\nstatic enum tcase {\n  TEST_LWIP_DHCP,\n  TEST_LWIP_DHCP_NAK,\n  TEST_LWIP_DHCP_RELAY,\n  TEST_LWIP_DHCP_NAK_NO_ENDMARKER,\n  TEST_LWIP_DHCP_INVALID_OVERLOAD\n} tcase;\n\nstatic int debug = 0;\nstatic void setdebug(int a) {debug = a;}\n\nstatic int tick = 0;\nstatic void tick_lwip(void)\n{\n  tick++;\n  if (tick % 5 == 0) {\n    dhcp_fine_tmr();\n  }\n  if (tick % 600 == 0) {\n    dhcp_coarse_tmr();\n  }\n}\n\nstatic void send_pkt(struct netif *netif, const u8_t *data, size_t len)\n{\n  struct pbuf *p, *q;\n  LWIP_ASSERT(\"pkt too big\", len <= 0xFFFF);\n  p = pbuf_alloc(PBUF_RAW, (u16_t)len, PBUF_POOL);\n\n  if (debug) {\n    /* Dump data */\n    u32_t i;\n    printf(\"RX data (len %d)\", p->tot_len);\n    for (i = 0; i < len; i++) {\n      printf(\" %02X\", data[i]);\n    }\n    printf(\"\\n\");\n  }\n\n  fail_unless(p != NULL);\n  for(q = p; q != NULL; q = q->next) {\n    memcpy(q->payload, data, q->len);\n    data += q->len;\n  }\n  netif->input(p, netif);\n}\n\nstatic err_t lwip_tx_func(struct netif *netif, struct pbuf *p);\n\nstatic err_t testif_init(struct netif *netif)\n{\n  netif->name[0] = 'c';\n  netif->name[1] = 'h';\n  netif->output = etharp_output;\n  netif->linkoutput = lwip_tx_func;\n  netif->mtu = 1500;\n  netif->hwaddr_len = 6;\n  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;\n\n  netif->hwaddr[0] = 0x00;\n  netif->hwaddr[1] = 0x23;\n  netif->hwaddr[2] = 0xC1;\n  netif->hwaddr[3] = 0xDE;\n  netif->hwaddr[4] = 0xD0;\n  netif->hwaddr[5] = 0x0D;\n\n  return ERR_OK;\n}\n\nstatic void dhcp_setup(void)\n{\n  txpacket = 0;\n}\n\nstatic void dhcp_teardown(void)\n{\n}\n\nstatic void check_pkt(struct pbuf *p, u32_t pos, const u8_t *mem, u32_t len)\n{\n  u8_t *data;\n\n  fail_if((pos + len) > p->tot_len);\n  while (pos > p->len && p->next) {\n    pos -= p->len;\n    p = p->next;\n  }\n  fail_if(p == NULL);\n  fail_unless(pos + len <= p->len); /* All data we seek within same pbuf */\n\n  data = (u8_t*)p->payload;\n  fail_if(memcmp(&data[pos], mem, len), \"data at pos %d, len %d in packet %d did not match\", pos, len, txpacket);\n}\n\nstatic void check_pkt_fuzzy(struct pbuf *p, u32_t startpos, const u8_t *mem, u32_t len)\n{\n  int found;\n  u32_t i;\n  u8_t *data;\n\n  fail_if((startpos + len) > p->tot_len);\n  while (startpos > p->len && p->next) {\n    startpos -= p->len;\n    p = p->next;\n  }\n  fail_if(p == NULL);\n  fail_unless(startpos + len <= p->len); /* All data we seek within same pbuf */\n\n  found = 0;\n  data = (u8_t*)p->payload;\n  for (i = startpos; i <= (p->len - len); i++) {\n    if (memcmp(&data[i], mem, len) == 0) {\n      found = 1;\n      break;\n    }\n  }\n  fail_unless(found);\n}\n\nstatic err_t lwip_tx_func(struct netif *netif, struct pbuf *p)\n{\n  fail_unless(netif == &net_test);\n  txpacket++;\n\n  if (debug) {\n    struct pbuf *pp = p;\n    /* Dump data */\n    printf(\"TX data (pkt %d, len %d, tick %d)\", txpacket, p->tot_len, tick);\n    do {\n      int i;\n      for (i = 0; i < pp->len; i++) {\n        printf(\" %02X\", ((u8_t *) pp->payload)[i]);\n      }\n      if (pp->next) {\n        pp = pp->next;\n      }\n    } while (pp->next);\n    printf(\"\\n\");\n  }\n\n  switch (tcase) {\n  case TEST_LWIP_DHCP:\n    switch (txpacket) {\n    case 1:\n    case 2:\n      {\n        const u8_t ipproto[] = { 0x08, 0x00 };\n        const u8_t bootp_start[] = { 0x01, 0x01, 0x06, 0x00}; /* bootp request, eth, hwaddr len 6, 0 hops */\n        const u8_t ipaddrs[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };\n\n        check_pkt(p, 0, broadcast, 6); /* eth level dest: broadcast */\n        check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */\n\n        check_pkt(p, 12, ipproto, sizeof(ipproto)); /* eth level proto: ip */\n\n        check_pkt(p, 42, bootp_start, sizeof(bootp_start));\n\n        check_pkt(p, 53, ipaddrs, sizeof(ipaddrs));\n\n        check_pkt(p, 70, netif->hwaddr, 6); /* mac addr inside bootp */\n\n        check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));\n\n        /* Check dchp message type, can be at different positions */\n        if (txpacket == 1) {\n          u8_t dhcp_discover_opt[] = { 0x35, 0x01, 0x01 };\n          check_pkt_fuzzy(p, 282, dhcp_discover_opt, sizeof(dhcp_discover_opt));\n        } else if (txpacket == 2) {\n          u8_t dhcp_request_opt[] = { 0x35, 0x01, 0x03 };\n          u8_t requested_ipaddr[] = { 0x32, 0x04, 0xc3, 0xaa, 0xbd, 0xc8 }; /* Ask for offered IP */\n\n          check_pkt_fuzzy(p, 282, dhcp_request_opt, sizeof(dhcp_request_opt));\n          check_pkt_fuzzy(p, 282, requested_ipaddr, sizeof(requested_ipaddr));\n        }\n        break;\n      }\n    case 3:\n    case 4:\n    case 5:\n      {\n        const u8_t arpproto[] = { 0x08, 0x06 };\n\n        check_pkt(p, 0, broadcast, 6); /* eth level dest: broadcast */\n        check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */\n\n        check_pkt(p, 12, arpproto, sizeof(arpproto)); /* eth level proto: ip */\n        break;\n      }\n      default:\n        fail();\n        break;\n    }\n    break;\n\n  case TEST_LWIP_DHCP_NAK:\n    {\n      const u8_t ipproto[] = { 0x08, 0x00 };\n      const u8_t bootp_start[] = { 0x01, 0x01, 0x06, 0x00}; /* bootp request, eth, hwaddr len 6, 0 hops */\n      const u8_t ipaddrs[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };\n      const u8_t dhcp_nak_opt[] = { 0x35, 0x01, 0x04 };\n      const u8_t requested_ipaddr[] = { 0x32, 0x04, 0xc3, 0xaa, 0xbd, 0xc8 }; /* offered IP */\n\n      fail_unless(txpacket == 4);\n      check_pkt(p, 0, broadcast, 6); /* eth level dest: broadcast */\n      check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */\n\n      check_pkt(p, 12, ipproto, sizeof(ipproto)); /* eth level proto: ip */\n\n      check_pkt(p, 42, bootp_start, sizeof(bootp_start));\n\n      check_pkt(p, 53, ipaddrs, sizeof(ipaddrs));\n\n      check_pkt(p, 70, netif->hwaddr, 6); /* mac addr inside bootp */\n\n      check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));\n\n      check_pkt_fuzzy(p, 282, dhcp_nak_opt, sizeof(dhcp_nak_opt)); /* NAK the ack */\n\n      check_pkt_fuzzy(p, 282, requested_ipaddr, sizeof(requested_ipaddr));\n      break;\n    }\n\n  case TEST_LWIP_DHCP_RELAY:\n    switch (txpacket) {\n    case 1:\n    case 2:\n      {\n        const u8_t ipproto[] = { 0x08, 0x00 };\n        const u8_t bootp_start[] = { 0x01, 0x01, 0x06, 0x00}; /* bootp request, eth, hwaddr len 6, 0 hops */\n        const u8_t ipaddrs[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };\n\n        check_pkt(p, 0, broadcast, 6); /* eth level dest: broadcast */\n        check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */\n\n        check_pkt(p, 12, ipproto, sizeof(ipproto)); /* eth level proto: ip */\n\n        check_pkt(p, 42, bootp_start, sizeof(bootp_start));\n\n        check_pkt(p, 53, ipaddrs, sizeof(ipaddrs));\n\n        check_pkt(p, 70, netif->hwaddr, 6); /* mac addr inside bootp */\n\n        check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));\n\n        /* Check dchp message type, can be at different positions */\n        if (txpacket == 1) {\n          u8_t dhcp_discover_opt[] = { 0x35, 0x01, 0x01 };\n          check_pkt_fuzzy(p, 282, dhcp_discover_opt, sizeof(dhcp_discover_opt));\n        } else if (txpacket == 2) {\n          u8_t dhcp_request_opt[] = { 0x35, 0x01, 0x03 };\n          u8_t requested_ipaddr[] = { 0x32, 0x04, 0x4f, 0x8a, 0x33, 0x05 }; /* Ask for offered IP */\n\n          check_pkt_fuzzy(p, 282, dhcp_request_opt, sizeof(dhcp_request_opt));\n          check_pkt_fuzzy(p, 282, requested_ipaddr, sizeof(requested_ipaddr));\n        }\n        break;\n      }\n    case 3:\n    case 4:\n    case 5:\n    case 6:\n      {\n        const u8_t arpproto[] = { 0x08, 0x06 };\n\n        check_pkt(p, 0, broadcast, 6); /* eth level dest: broadcast */\n        check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */\n\n        check_pkt(p, 12, arpproto, sizeof(arpproto)); /* eth level proto: ip */\n        break;\n      }\n    case 7:\n      {\n        const u8_t fake_arp[6] = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xab };\n        const u8_t ipproto[] = { 0x08, 0x00 };\n        const u8_t bootp_start[] = { 0x01, 0x01, 0x06, 0x00}; /* bootp request, eth, hwaddr len 6, 0 hops */\n        const u8_t ipaddrs[] = { 0x00, 0x4f, 0x8a, 0x33, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };\n        const u8_t dhcp_request_opt[] = { 0x35, 0x01, 0x03 };\n\n        check_pkt(p, 0, fake_arp, 6); /* eth level dest: broadcast */\n        check_pkt(p, 6, netif->hwaddr, 6); /* eth level src: unit mac */\n\n        check_pkt(p, 12, ipproto, sizeof(ipproto)); /* eth level proto: ip */\n\n        check_pkt(p, 42, bootp_start, sizeof(bootp_start));\n\n        check_pkt(p, 53, ipaddrs, sizeof(ipaddrs));\n\n        check_pkt(p, 70, netif->hwaddr, 6); /* mac addr inside bootp */\n\n        check_pkt(p, 278, magic_cookie, sizeof(magic_cookie));\n\n        /* Check dchp message type, can be at different positions */\n        check_pkt_fuzzy(p, 282, dhcp_request_opt, sizeof(dhcp_request_opt));\n        break;\n      }\n    default:\n      fail();\n      break;\n    }\n    break;\n\n  default:\n    break;\n  }\n\n  return ERR_OK;\n}\n\n/*\n * Test basic happy flow DHCP session.\n * Validate that xid is checked.\n */\nSTART_TEST(test_dhcp)\n{\n  ip4_addr_t addr;\n  ip4_addr_t netmask;\n  ip4_addr_t gw;\n  int i;\n  u32_t xid;\n  LWIP_UNUSED_ARG(_i);\n\n  tcase = TEST_LWIP_DHCP;\n  setdebug(0);\n\n  IP4_ADDR(&addr, 0, 0, 0, 0);\n  IP4_ADDR(&netmask, 0, 0, 0, 0);\n  IP4_ADDR(&gw, 0, 0, 0, 0);\n\n  netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);\n  netif_set_up(&net_test);\n\n  dhcp_start(&net_test);\n\n  fail_unless(txpacket == 1); /* DHCP discover sent */\n  xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */\n  memcpy(&dhcp_offer[46], &xid, 4);\n  send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));\n\n  /* IP addresses should be zero */\n  fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));\n\n  fail_unless(txpacket == 1, \"TX %d packets, expected 1\", txpacket); /* Nothing more sent */\n  xid = htonl(netif_dhcp_data(&net_test)->xid);\n  memcpy(&dhcp_offer[46], &xid, 4); /* insert correct transaction id */\n  send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));\n\n  fail_unless(txpacket == 2, \"TX %d packets, expected 2\", txpacket); /* DHCP request sent */\n  xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */\n  memcpy(&dhcp_ack[46], &xid, 4);\n  send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));\n\n  fail_unless(txpacket == 2, \"TX %d packets, still expected 2\", txpacket); /* No more sent */\n  xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */\n  memcpy(&dhcp_ack[46], &xid, 4); /* insert transaction id */\n  send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));\n\n  for (i = 0; i < 20; i++) {\n    tick_lwip();\n  }\n  fail_unless(txpacket == 5, \"TX %d packets, expected 5\", txpacket); /* ARP requests sent */\n\n  /* Interface up */\n  fail_unless(netif_is_up(&net_test));\n\n  /* Now it should have taken the IP */\n  IP4_ADDR(&addr, 195, 170, 189, 200);\n  IP4_ADDR(&netmask, 255, 255, 255, 0);\n  IP4_ADDR(&gw, 195, 170, 189, 171);\n  fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));\n\n  netif_remove(&net_test);\n}\nEND_TEST\n\n/*\n * Test that IP address is not taken and NAK is sent if someone\n * replies to ARP requests for the offered address.\n */\nSTART_TEST(test_dhcp_nak)\n{\n  ip4_addr_t addr;\n  ip4_addr_t netmask;\n  ip4_addr_t gw;\n  u32_t xid;\n  LWIP_UNUSED_ARG(_i);\n\n  tcase = TEST_LWIP_DHCP;\n  setdebug(0);\n\n  IP4_ADDR(&addr, 0, 0, 0, 0);\n  IP4_ADDR(&netmask, 0, 0, 0, 0);\n  IP4_ADDR(&gw, 0, 0, 0, 0);\n\n  netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);\n  netif_set_up(&net_test);\n\n  dhcp_start(&net_test);\n\n  fail_unless(txpacket == 1); /* DHCP discover sent */\n  xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */\n  memcpy(&dhcp_offer[46], &xid, 4);\n  send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));\n\n  /* IP addresses should be zero */\n  fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));\n\n  fail_unless(txpacket == 1); /* Nothing more sent */\n  xid = htonl(netif_dhcp_data(&net_test)->xid);\n  memcpy(&dhcp_offer[46], &xid, 4); /* insert correct transaction id */\n  send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));\n\n  fail_unless(txpacket == 2); /* DHCP request sent */\n  xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */\n  memcpy(&dhcp_ack[46], &xid, 4);\n  send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));\n\n  fail_unless(txpacket == 2); /* No more sent */\n  xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */\n  memcpy(&dhcp_ack[46], &xid, 4); /* insert transaction id */\n  send_pkt(&net_test, dhcp_ack, sizeof(dhcp_ack));\n\n  fail_unless(txpacket == 3); /* ARP request sent */\n\n  tcase = TEST_LWIP_DHCP_NAK; /* Switch testcase */\n\n  /* Send arp reply, mark offered IP as taken */\n  send_pkt(&net_test, arpreply, sizeof(arpreply));\n\n  fail_unless(txpacket == 4); /* DHCP nak sent */\n\n  netif_remove(&net_test);\n}\nEND_TEST\n\n/*\n * Test case based on captured data where\n * replies are sent from a different IP than the\n * one the client unicasted to.\n */\nSTART_TEST(test_dhcp_relayed)\n{\n  u8_t relay_offer[] = {\n  0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d,\n  0x00, 0x22, 0x93, 0x5a, 0xf7, 0x60,\n  0x08, 0x00, 0x45, 0x00,\n  0x01, 0x38, 0xfd, 0x53, 0x00, 0x00, 0x40, 0x11,\n  0x78, 0x46, 0x4f, 0x8a, 0x32, 0x02, 0x4f, 0x8a,\n  0x33, 0x05, 0x00, 0x43, 0x00, 0x44, 0x01, 0x24,\n  0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x51, 0x35,\n  0xb6, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x4f, 0x8a, 0x33, 0x05, 0x00, 0x00,\n  0x00, 0x00, 0x0a, 0xb5, 0x04, 0x01, 0x00, 0x23,\n  0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82,\n  0x53, 0x63, 0x01, 0x04, 0xff, 0xff, 0xfe, 0x00,\n  0x03, 0x04, 0x4f, 0x8a, 0x32, 0x01, 0x06, 0x08,\n  0x4f, 0x8a, 0x00, 0xb4, 0x55, 0x08, 0x1f, 0xd1,\n  0x1c, 0x04, 0x4f, 0x8a, 0x33, 0xff, 0x33, 0x04,\n  0x00, 0x00, 0x54, 0x49, 0x35, 0x01, 0x02, 0x36,\n  0x04, 0x0a, 0xb5, 0x04, 0x01, 0xff\n  };\n\n  u8_t relay_ack1[] = {\n  0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x22,\n  0x93, 0x5a, 0xf7, 0x60, 0x08, 0x00, 0x45, 0x00,\n  0x01, 0x38, 0xfd, 0x55, 0x00, 0x00, 0x40, 0x11,\n  0x78, 0x44, 0x4f, 0x8a, 0x32, 0x02, 0x4f, 0x8a,\n  0x33, 0x05, 0x00, 0x43, 0x00, 0x44, 0x01, 0x24,\n  0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x51, 0x35,\n  0xb6, 0xa1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x4f, 0x8a, 0x33, 0x05, 0x00, 0x00,\n  0x00, 0x00, 0x0a, 0xb5, 0x04, 0x01, 0x00, 0x23,\n  0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82,\n  0x53, 0x63, 0x01, 0x04, 0xff, 0xff, 0xfe, 0x00,\n  0x03, 0x04, 0x4f, 0x8a, 0x32, 0x01, 0x06, 0x08,\n  0x4f, 0x8a, 0x00, 0xb4, 0x55, 0x08, 0x1f, 0xd1,\n  0x1c, 0x04, 0x4f, 0x8a, 0x33, 0xff, 0x33, 0x04,\n  0x00, 0x00, 0x54, 0x49, 0x35, 0x01, 0x05, 0x36,\n  0x04, 0x0a, 0xb5, 0x04, 0x01, 0xff\n  };\n\n  u8_t relay_ack2[] = {\n  0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d,\n  0x00, 0x22, 0x93, 0x5a, 0xf7, 0x60,\n  0x08, 0x00, 0x45, 0x00,\n  0x01, 0x38, 0xfa, 0x18, 0x00, 0x00, 0x40, 0x11,\n  0x7b, 0x81, 0x4f, 0x8a, 0x32, 0x02, 0x4f, 0x8a,\n  0x33, 0x05, 0x00, 0x43, 0x00, 0x44, 0x01, 0x24,\n  0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x49, 0x8b,\n  0x6e, 0xab, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x8a,\n  0x33, 0x05, 0x4f, 0x8a, 0x33, 0x05, 0x00, 0x00,\n  0x00, 0x00, 0x0a, 0xb5, 0x04, 0x01, 0x00, 0x23,\n  0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82,\n  0x53, 0x63, 0x01, 0x04, 0xff, 0xff, 0xfe, 0x00,\n  0x03, 0x04, 0x4f, 0x8a, 0x32, 0x01, 0x06, 0x08,\n  0x4f, 0x8a, 0x00, 0xb4, 0x55, 0x08, 0x1f, 0xd1,\n  0x1c, 0x04, 0x4f, 0x8a, 0x33, 0xff, 0x33, 0x04,\n  0x00, 0x00, 0x54, 0x60, 0x35, 0x01, 0x05, 0x36,\n  0x04, 0x0a, 0xb5, 0x04, 0x01, 0xff };\n\n  const u8_t arp_resp[] = {\n  0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, /* DEST */\n  0x00, 0x22, 0x93, 0x5a, 0xf7, 0x60, /* SRC */\n  0x08, 0x06, /* Type: ARP */\n  0x00, 0x01, /* HW: Ethernet */\n  0x08, 0x00, /* PROTO: IP */\n  0x06, /* HW size */\n  0x04, /* PROTO size */\n  0x00, 0x02, /* OPCODE: Reply */\n\n  0x12, 0x34, 0x56, 0x78, 0x9a, 0xab, /* Target MAC */\n  0x4f, 0x8a, 0x32, 0x01, /* Target IP */\n\n  0x00, 0x23, 0xc1, 0x00, 0x06, 0x50, /* src mac */\n  0x4f, 0x8a, 0x33, 0x05, /* src ip */\n\n  /* Padding follows.. */\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00 };\n\n  ip4_addr_t addr;\n  ip4_addr_t netmask;\n  ip4_addr_t gw;\n  int i;\n  u32_t xid;\n  LWIP_UNUSED_ARG(_i);\n\n  tcase = TEST_LWIP_DHCP_RELAY;\n  setdebug(0);\n\n  IP4_ADDR(&addr, 0, 0, 0, 0);\n  IP4_ADDR(&netmask, 0, 0, 0, 0);\n  IP4_ADDR(&gw, 0, 0, 0, 0);\n\n  netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);\n  netif_set_up(&net_test);\n\n  dhcp_start(&net_test);\n\n  fail_unless(txpacket == 1); /* DHCP discover sent */\n\n  /* IP addresses should be zero */\n  fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));\n\n  fail_unless(txpacket == 1); /* Nothing more sent */\n  xid = htonl(netif_dhcp_data(&net_test)->xid);\n  memcpy(&relay_offer[46], &xid, 4); /* insert correct transaction id */\n  send_pkt(&net_test, relay_offer, sizeof(relay_offer));\n\n  /* request sent? */\n  fail_unless(txpacket == 2, \"txpkt = %d, should be 2\", txpacket);\n  xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */\n  memcpy(&relay_ack1[46], &xid, 4); /* insert transaction id */\n  send_pkt(&net_test, relay_ack1, sizeof(relay_ack1));\n\n  for (i = 0; i < 25; i++) {\n    tick_lwip();\n  }\n  fail_unless(txpacket == 5, \"txpkt should be 5, is %d\", txpacket); /* ARP requests sent */\n\n  /* Interface up */\n  fail_unless(netif_is_up(&net_test));\n\n  /* Now it should have taken the IP */\n  IP4_ADDR(&addr, 79, 138, 51, 5);\n  IP4_ADDR(&netmask, 255, 255, 254, 0);\n  IP4_ADDR(&gw, 79, 138, 50, 1);\n  fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));\n\n  fail_unless(txpacket == 5, \"txpacket = %d\", txpacket);\n\n  for (i = 0; i < 108000 - 25; i++) {\n    tick_lwip();\n  }\n\n  fail_unless(netif_is_up(&net_test));\n  fail_unless(txpacket == 6, \"txpacket = %d\", txpacket);\n\n  /* We need to send arp response here.. */\n\n  send_pkt(&net_test, arp_resp, sizeof(arp_resp));\n\n  fail_unless(txpacket == 7, \"txpacket = %d\", txpacket);\n  fail_unless(netif_is_up(&net_test));\n\n  xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */\n  memcpy(&relay_ack2[46], &xid, 4); /* insert transaction id */\n  send_pkt(&net_test, relay_ack2, sizeof(relay_ack2));\n\n  for (i = 0; i < 100000; i++) {\n    tick_lwip();\n  }\n\n  fail_unless(txpacket == 7, \"txpacket = %d\", txpacket);\n\n  netif_remove(&net_test);\n\n}\nEND_TEST\n\nSTART_TEST(test_dhcp_nak_no_endmarker)\n{\n  ip4_addr_t addr;\n  ip4_addr_t netmask;\n  ip4_addr_t gw;\n\n  u8_t dhcp_nack_no_endmarker[] = {\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x54, 0x75,\n    0xd0, 0x26, 0xd0, 0x0d, 0x08, 0x00, 0x45, 0x00,\n    0x01, 0x15, 0x38, 0x86, 0x00, 0x00, 0xff, 0x11,\n    0xc0, 0xa8, 0xc0, 0xa8, 0x01, 0x01, 0xff, 0xff,\n    0xff, 0xff, 0x00, 0x43, 0x00, 0x44, 0x01, 0x01,\n    0x00, 0x00, 0x02, 0x01, 0x06, 0x00, 0x7a, 0xcb,\n    0xba, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23,\n    0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x82,\n    0x53, 0x63, 0x35, 0x01, 0x06, 0x36, 0x04, 0xc0,\n    0xa8, 0x01, 0x01, 0x31, 0xef, 0xad, 0x72, 0x31,\n    0x43, 0x4e, 0x44, 0x30, 0x32, 0x35, 0x30, 0x43,\n    0x52, 0x47, 0x44, 0x38, 0x35, 0x36, 0x3c, 0x08,\n    0x4d, 0x53, 0x46, 0x54, 0x20, 0x35, 0x2e, 0x30,\n    0x37, 0x0d, 0x01, 0x0f, 0x03, 0x06, 0x2c, 0x2e,\n    0x2f, 0x1f, 0x21, 0x79, 0xf9, 0x2b, 0xfc, 0xff,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x71,\n    0xf3, 0x5b, 0xe2, 0x71, 0x2e, 0x01, 0x08, 0x03,\n    0x04, 0xc0, 0xa8, 0x01, 0x01, 0xff, 0xeb, 0x1e,\n    0x44, 0xec, 0xeb, 0x1e, 0x30, 0x37, 0x0c, 0x01,\n    0x0f, 0x03, 0x06, 0x2c, 0x2e, 0x2f, 0x1f, 0x21,\n    0x79, 0xf9, 0x2b, 0xff, 0x25, 0xc0, 0x09, 0xd6,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n  };\n  u32_t xid;\n  LWIP_UNUSED_ARG(_i);\n\n  tcase = TEST_LWIP_DHCP_NAK_NO_ENDMARKER;\n  setdebug(0);\n\n  IP4_ADDR(&addr, 0, 0, 0, 0);\n  IP4_ADDR(&netmask, 0, 0, 0, 0);\n  IP4_ADDR(&gw, 0, 0, 0, 0);\n\n  netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);\n  netif_set_up(&net_test);\n\n  dhcp_start(&net_test);\n\n  fail_unless(txpacket == 1); /* DHCP discover sent */\n  xid = netif_dhcp_data(&net_test)->xid; /* Write bad xid, not using htonl! */\n  memcpy(&dhcp_offer[46], &xid, 4);\n  send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));\n\n  /* IP addresses should be zero */\n  fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));\n\n  fail_unless(txpacket == 1); /* Nothing more sent */\n  xid = htonl(netif_dhcp_data(&net_test)->xid);\n  memcpy(&dhcp_offer[46], &xid, 4); /* insert correct transaction id */\n  send_pkt(&net_test, dhcp_offer, sizeof(dhcp_offer));\n  \n  fail_unless(netif_dhcp_data(&net_test)->state == DHCP_STATE_REQUESTING);\n\n  fail_unless(txpacket == 2); /* No more sent */\n  xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */\n  memcpy(&dhcp_nack_no_endmarker[46], &xid, 4); /* insert transaction id */\n  send_pkt(&net_test, dhcp_nack_no_endmarker, sizeof(dhcp_nack_no_endmarker));\n\n  /* NAK should put us in another state for a while, no other way detecting it */\n  fail_unless(netif_dhcp_data(&net_test)->state != DHCP_STATE_REQUESTING);\n\n  netif_remove(&net_test);\n}\nEND_TEST\n\nSTART_TEST(test_dhcp_invalid_overload)\n{\n  u8_t dhcp_offer_invalid_overload[] = {\n      0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, /* To unit */\n      0x00, 0x0F, 0xEE, 0x30, 0xAB, 0x22, /* From Remote host */\n      0x08, 0x00, /* Protocol: IP */\n      0x45, 0x10, 0x01, 0x48, 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, 0x36, 0xcc, 0xc3, 0xaa, 0xbd, 0xab, 0xc3, 0xaa, 0xbd, 0xc8, /* IP header */\n      0x00, 0x43, 0x00, 0x44, 0x01, 0x34, 0x00, 0x00, /* UDP header */\n\n      0x02, /* Type == Boot reply */\n      0x01, 0x06, /* Hw Ethernet, 6 bytes addrlen */\n      0x00, /* 0 hops */\n      0xAA, 0xAA, 0xAA, 0xAA, /* Transaction id, will be overwritten */\n      0x00, 0x00, /* 0 seconds elapsed */\n      0x00, 0x00, /* Flags (unicast) */\n      0x00, 0x00, 0x00, 0x00, /* Client ip */\n      0xc3, 0xaa, 0xbd, 0xc8, /* Your IP */\n      0xc3, 0xaa, 0xbd, 0xab, /* DHCP server ip */\n      0x00, 0x00, 0x00, 0x00, /* relay agent */\n      0x00, 0x23, 0xc1, 0xde, 0xd0, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* MAC addr + padding */\n\n      /* Empty server name */\n      0x34, 0x01, 0x02, 0xff, /* Overload: SNAME + END */\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      /* Empty boot file name */\n      0x34, 0x01, 0x01, 0xff, /* Overload FILE + END */\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x63, 0x82, 0x53, 0x63, /* Magic cookie */\n      0x35, 0x01, 0x02, /* Message type: Offer */\n      0x36, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* Server identifier (IP) */\n      0x33, 0x04, 0x00, 0x00, 0x00, 0x78, /* Lease time 2 minutes */\n      0x03, 0x04, 0xc3, 0xaa, 0xbd, 0xab, /* Router IP */\n      0x01, 0x04, 0xff, 0xff, 0xff, 0x00, /* Subnet mask */\n      0x34, 0x01, 0x03, /* Overload: FILE + SNAME */\n      0xff, /* End option */\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Padding */\n  };\n  ip4_addr_t addr;\n  ip4_addr_t netmask;\n  ip4_addr_t gw;\n  u32_t xid;\n  LWIP_UNUSED_ARG(_i);\n\n  tcase = TEST_LWIP_DHCP_INVALID_OVERLOAD;\n  setdebug(0);\n\n  IP4_ADDR(&addr, 0, 0, 0, 0);\n  IP4_ADDR(&netmask, 0, 0, 0, 0);\n  IP4_ADDR(&gw, 0, 0, 0, 0);\n\n  netif_add(&net_test, &addr, &netmask, &gw, &net_test, testif_init, ethernet_input);\n  netif_set_up(&net_test);\n\n  dhcp_start(&net_test);\n\n  fail_unless(txpacket == 1); /* DHCP discover sent */\n  xid = htonl(netif_dhcp_data(&net_test)->xid);\n  memcpy(&dhcp_offer_invalid_overload[46], &xid, 4); /* insert correct transaction id */\n  dhcp_offer_invalid_overload[311] = 3;\n  send_pkt(&net_test, dhcp_offer_invalid_overload, sizeof(dhcp_offer_invalid_overload));\n  /* IP addresses should be zero */\n  fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));\n  fail_unless(txpacket == 1); /* Nothing more sent */\n\n  dhcp_offer_invalid_overload[311] = 2;\n  send_pkt(&net_test, dhcp_offer_invalid_overload, sizeof(dhcp_offer_invalid_overload));\n  /* IP addresses should be zero */\n  fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));\n  fail_unless(txpacket == 1); /* Nothing more sent */\n\n  dhcp_offer_invalid_overload[311] = 1;\n  send_pkt(&net_test, dhcp_offer_invalid_overload, sizeof(dhcp_offer_invalid_overload));\n  /* IP addresses should be zero */\n  fail_if(memcmp(&addr, &net_test.ip_addr, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&netmask, &net_test.netmask, sizeof(ip4_addr_t)));\n  fail_if(memcmp(&gw, &net_test.gw, sizeof(ip4_addr_t)));\n  fail_unless(txpacket == 1); /* Nothing more sent */\n\n  dhcp_offer_invalid_overload[311] = 0;\n  send_pkt(&net_test, dhcp_offer_invalid_overload, sizeof(dhcp_offer));\n\n  fail_unless(netif_dhcp_data(&net_test)->state == DHCP_STATE_REQUESTING);\n\n  fail_unless(txpacket == 2); /* No more sent */\n  xid = htonl(netif_dhcp_data(&net_test)->xid); /* xid updated */\n\n  netif_remove(&net_test);\n}\nEND_TEST\n\n/** Create the suite including all tests for this module */\nSuite *\ndhcp_suite(void)\n{\n  testfunc tests[] = {\n    TESTFUNC(test_dhcp),\n    TESTFUNC(test_dhcp_nak),\n    TESTFUNC(test_dhcp_relayed),\n    TESTFUNC(test_dhcp_nak_no_endmarker),\n    TESTFUNC(test_dhcp_invalid_overload)\n  };\n  return create_suite(\"DHCP\", tests, sizeof(tests)/sizeof(testfunc), dhcp_setup, dhcp_teardown);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/dhcp/test_dhcp.h",
    "content": "#ifndef LWIP_HDR_TEST_DHCP_H\n#define LWIP_HDR_TEST_DHCP_H\n\n#include \"../lwip_check.h\"\n\nSuite* dhcp_suite(void);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/etharp/test_etharp.c",
    "content": "#include \"test_etharp.h\"\n\n#include \"lwip/udp.h\"\n#include \"lwip/etharp.h\"\n#include \"netif/ethernet.h\"\n#include \"lwip/stats.h\"\n\n#if !LWIP_STATS || !UDP_STATS || !MEMP_STATS || !ETHARP_STATS\n#error \"This tests needs UDP-, MEMP- and ETHARP-statistics enabled\"\n#endif\n#if !ETHARP_SUPPORT_STATIC_ENTRIES\n#error \"This test needs ETHARP_SUPPORT_STATIC_ENTRIES enabled\"\n#endif\n\nstatic struct netif test_netif;\nstatic ip4_addr_t test_ipaddr, test_netmask, test_gw;\nstruct eth_addr test_ethaddr =  {{1,1,1,1,1,1}};\nstruct eth_addr test_ethaddr2 = {{1,1,1,1,1,2}};\nstruct eth_addr test_ethaddr3 = {{1,1,1,1,1,3}};\nstruct eth_addr test_ethaddr4 = {{1,1,1,1,1,4}};\nstatic int linkoutput_ctr;\n\n/* Helper functions */\nstatic void\netharp_remove_all(void)\n{\n  int i;\n  /* call etharp_tmr often enough to have all entries cleaned */\n  for(i = 0; i < 0xff; i++) {\n    etharp_tmr();\n  }\n}\n\nstatic err_t\ndefault_netif_linkoutput(struct netif *netif, struct pbuf *p)\n{\n  fail_unless(netif == &test_netif);\n  fail_unless(p != NULL);\n  linkoutput_ctr++;\n  return ERR_OK;\n}\n\nstatic err_t\ndefault_netif_init(struct netif *netif)\n{\n  fail_unless(netif != NULL);\n  netif->linkoutput = default_netif_linkoutput;\n  netif->output = etharp_output;\n  netif->mtu = 1500;\n  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP;\n  netif->hwaddr_len = ETHARP_HWADDR_LEN;\n  return ERR_OK;\n}\n\nstatic void\ndefault_netif_add(void)\n{\n  IP4_ADDR(&test_gw, 192,168,0,1);\n  IP4_ADDR(&test_ipaddr, 192,168,0,1);\n  IP4_ADDR(&test_netmask, 255,255,0,0);\n\n  fail_unless(netif_default == NULL);\n  netif_set_default(netif_add(&test_netif, &test_ipaddr, &test_netmask,\n                              &test_gw, NULL, default_netif_init, NULL));\n  netif_set_up(&test_netif);\n}\n\nstatic void\ndefault_netif_remove(void)\n{\n  fail_unless(netif_default == &test_netif);\n  netif_remove(&test_netif);\n}\n\nstatic void\ncreate_arp_response(ip4_addr_t *adr)\n{\n  int k;\n  struct eth_hdr *ethhdr;\n  struct etharp_hdr *etharphdr;\n  struct pbuf *p = pbuf_alloc(PBUF_RAW, sizeof(struct eth_hdr) + sizeof(struct etharp_hdr), PBUF_RAM);\n  if(p == NULL) {\n    FAIL_RET();\n  }\n  ethhdr = (struct eth_hdr*)p->payload;\n  etharphdr = (struct etharp_hdr*)(ethhdr + 1);\n\n  ethhdr->dest = test_ethaddr;\n  ethhdr->src = test_ethaddr2;\n  ethhdr->type = htons(ETHTYPE_ARP);\n\n  etharphdr->hwtype = htons(/*HWTYPE_ETHERNET*/ 1);\n  etharphdr->proto = htons(ETHTYPE_IP);\n  etharphdr->hwlen = ETHARP_HWADDR_LEN;\n  etharphdr->protolen = sizeof(ip4_addr_t);\n  etharphdr->opcode = htons(ARP_REPLY);\n\n  SMEMCPY(&etharphdr->sipaddr, adr, sizeof(ip4_addr_t));\n  SMEMCPY(&etharphdr->dipaddr, &test_ipaddr, sizeof(ip4_addr_t));\n\n  k = 6;\n  while(k > 0) {\n    k--;\n    /* Write the ARP MAC-Addresses */\n    etharphdr->shwaddr.addr[k] = test_ethaddr2.addr[k];\n    etharphdr->dhwaddr.addr[k] = test_ethaddr.addr[k];\n    /* Write the Ethernet MAC-Addresses */\n    ethhdr->dest.addr[k] = test_ethaddr.addr[k];\n    ethhdr->src.addr[k]  = test_ethaddr2.addr[k];\n  }\n\n  ethernet_input(p, &test_netif);\n}\n\n/* Setups/teardown functions */\n\nstatic void\netharp_setup(void)\n{\n  etharp_remove_all();\n  default_netif_add();\n}\n\nstatic void\netharp_teardown(void)\n{\n  etharp_remove_all();\n  default_netif_remove();\n}\n\n\n/* Test functions */\n\nSTART_TEST(test_etharp_table)\n{\n#if ETHARP_SUPPORT_STATIC_ENTRIES\n  err_t err;\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n  s8_t idx;\n  const ip4_addr_t *unused_ipaddr;\n  struct eth_addr *unused_ethaddr;\n  struct udp_pcb* pcb;\n  LWIP_UNUSED_ARG(_i);\n\n  if (netif_default != &test_netif) {\n    fail(\"This test needs a default netif\");\n  }\n\n  linkoutput_ctr = 0;\n\n  pcb = udp_new();\n  fail_unless(pcb != NULL);\n  if (pcb != NULL) {\n    ip4_addr_t adrs[ARP_TABLE_SIZE + 2];\n    int i;\n    for(i = 0; i < ARP_TABLE_SIZE + 2; i++) {\n      IP4_ADDR(&adrs[i], 192,168,0,i+2);\n    }\n    /* fill ARP-table with dynamic entries */\n    for(i = 0; i < ARP_TABLE_SIZE; i++) {\n      struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 10, PBUF_RAM);\n      fail_unless(p != NULL);\n      if (p != NULL) {\n        err_t err2;\n        ip_addr_t dst;\n        ip_addr_copy_from_ip4(dst, adrs[i]);\n        err2 = udp_sendto(pcb, p, &dst, 123);\n        fail_unless(err2 == ERR_OK);\n        /* etharp request sent? */\n        fail_unless(linkoutput_ctr == (2*i) + 1);\n        pbuf_free(p);\n\n        /* create an ARP response */\n        create_arp_response(&adrs[i]);\n        /* queued UDP packet sent? */\n        fail_unless(linkoutput_ctr == (2*i) + 2);\n\n        idx = etharp_find_addr(NULL, &adrs[i], &unused_ethaddr, &unused_ipaddr);\n        fail_unless(idx == i);\n        etharp_tmr();\n      }\n    }\n    linkoutput_ctr = 0;\n#if ETHARP_SUPPORT_STATIC_ENTRIES\n    /* create one static entry */\n    err = etharp_add_static_entry(&adrs[ARP_TABLE_SIZE], &test_ethaddr3);\n    fail_unless(err == ERR_OK);\n    idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr);\n    fail_unless(idx == 0);\n    fail_unless(linkoutput_ctr == 0);\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n\n    linkoutput_ctr = 0;\n    /* fill ARP-table with dynamic entries */\n    for(i = 0; i < ARP_TABLE_SIZE; i++) {\n      struct pbuf *p = pbuf_alloc(PBUF_TRANSPORT, 10, PBUF_RAM);\n      fail_unless(p != NULL);\n      if (p != NULL) {\n        err_t err2;\n        ip_addr_t dst;\n        ip_addr_copy_from_ip4(dst, adrs[i]);\n        err2 = udp_sendto(pcb, p, &dst, 123);\n        fail_unless(err2 == ERR_OK);\n        /* etharp request sent? */\n        fail_unless(linkoutput_ctr == (2*i) + 1);\n        pbuf_free(p);\n\n        /* create an ARP response */\n        create_arp_response(&adrs[i]);\n        /* queued UDP packet sent? */\n        fail_unless(linkoutput_ctr == (2*i) + 2);\n\n        idx = etharp_find_addr(NULL, &adrs[i], &unused_ethaddr, &unused_ipaddr);\n        if (i < ARP_TABLE_SIZE - 1) {\n          fail_unless(idx == i+1);\n        } else {\n          /* the last entry must not overwrite the static entry! */\n          fail_unless(idx == 1);\n        }\n        etharp_tmr();\n      }\n    }\n#if ETHARP_SUPPORT_STATIC_ENTRIES\n    /* create a second static entry */\n    err = etharp_add_static_entry(&adrs[ARP_TABLE_SIZE+1], &test_ethaddr4);\n    fail_unless(err == ERR_OK);\n    idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr);\n    fail_unless(idx == 0);\n    idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE+1], &unused_ethaddr, &unused_ipaddr);\n    fail_unless(idx == 2);\n    /* and remove it again */\n    err = etharp_remove_static_entry(&adrs[ARP_TABLE_SIZE+1]);\n    fail_unless(err == ERR_OK);\n    idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr);\n    fail_unless(idx == 0);\n    idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE+1], &unused_ethaddr, &unused_ipaddr);\n    fail_unless(idx == -1);\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n\n    /* check that static entries don't time out */\n    etharp_remove_all();\n    idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr);\n    fail_unless(idx == 0);\n\n#if ETHARP_SUPPORT_STATIC_ENTRIES\n    /* remove the first static entry */\n    err = etharp_remove_static_entry(&adrs[ARP_TABLE_SIZE]);\n    fail_unless(err == ERR_OK);\n    idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE], &unused_ethaddr, &unused_ipaddr);\n    fail_unless(idx == -1);\n    idx = etharp_find_addr(NULL, &adrs[ARP_TABLE_SIZE+1], &unused_ethaddr, &unused_ipaddr);\n    fail_unless(idx == -1);\n#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */\n\n    udp_remove(pcb);\n  }\n}\nEND_TEST\n\n\n/** Create the suite including all tests for this module */\nSuite *\netharp_suite(void)\n{\n  testfunc tests[] = {\n    TESTFUNC(test_etharp_table)\n  };\n  return create_suite(\"ETHARP\", tests, sizeof(tests)/sizeof(testfunc), etharp_setup, etharp_teardown);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/etharp/test_etharp.h",
    "content": "#ifndef LWIP_HDR_TEST_ETHARP_H\n#define LWIP_HDR_TEST_ETHARP_H\n\n#include \"../lwip_check.h\"\n\nSuite* etharp_suite(void);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/ip4/test_ip4.c",
    "content": "#include \"test_ip4.h\"\n\n#include \"lwip/ip4.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/prot/ip.h\"\n#include \"lwip/prot/ip4.h\"\n\n#if !LWIP_IPV4 || !IP_REASSEMBLY || !MIB2_STATS || !IPFRAG_STATS\n#error \"This tests needs LWIP_IPV4, IP_REASSEMBLY; MIB2- and IPFRAG-statistics enabled\"\n#endif\n\n/* Helper functions */\nstatic void\ncreate_ip4_input_fragment(u16_t ip_id, u16_t start, u16_t len, int last)\n{\n  struct pbuf *p;\n  struct netif *input_netif = netif_list; /* just use any netif */\n  fail_unless((start & 7) == 0);\n  fail_unless(((len & 7) == 0) || last);\n  fail_unless(input_netif != NULL);\n\n  p = pbuf_alloc(PBUF_RAW, len + sizeof(struct ip_hdr), PBUF_RAM);\n  fail_unless(p != NULL);\n  if (p != NULL) {\n    err_t err;\n    struct ip_hdr *iphdr = (struct ip_hdr *)p->payload;\n    IPH_VHL_SET(iphdr, 4, sizeof(struct ip_hdr) / 4);\n    IPH_TOS_SET(iphdr, 0);\n    IPH_LEN_SET(iphdr, lwip_htons(p->tot_len));\n    IPH_ID_SET(iphdr, lwip_htons(ip_id));\n    if (last) {\n      IPH_OFFSET_SET(iphdr, lwip_htons(start / 8));\n    } else {\n      IPH_OFFSET_SET(iphdr, lwip_htons((start / 8) | IP_MF));\n    }\n    IPH_TTL_SET(iphdr, 5);\n    IPH_PROTO_SET(iphdr, IP_PROTO_UDP);\n    IPH_CHKSUM_SET(iphdr, 0);\n    ip4_addr_copy(iphdr->src, *netif_ip4_addr(input_netif));\n    iphdr->src.addr = lwip_htonl(lwip_htonl(iphdr->src.addr) + 1);\n    ip4_addr_copy(iphdr->dest, *netif_ip4_addr(input_netif));\n    IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, sizeof(struct ip_hdr)));\n\n    err = ip4_input(p, input_netif);\n    if (err != ERR_OK) {\n      pbuf_free(p);\n    }\n    fail_unless(err == ERR_OK);\n  }\n}\n\n/* Setups/teardown functions */\n\nstatic void\nip4_setup(void)\n{\n}\n\nstatic void\nip4_teardown(void)\n{\n  if (netif_list->loop_first != NULL) {\n    pbuf_free(netif_list->loop_first);\n    netif_list->loop_first = NULL;\n  }\n  netif_list->loop_last = NULL;\n}\n\n\n/* Test functions */\n\nSTART_TEST(test_ip4_reass)\n{\n  const u16_t ip_id = 128;\n  LWIP_UNUSED_ARG(_i);\n\n  memset(&lwip_stats.mib2, 0, sizeof(lwip_stats.mib2));\n\n  create_ip4_input_fragment(ip_id, 8*200, 200, 1);\n  fail_unless(lwip_stats.ip_frag.recv == 1);\n  fail_unless(lwip_stats.ip_frag.err == 0);\n  fail_unless(lwip_stats.ip_frag.memerr == 0);\n  fail_unless(lwip_stats.ip_frag.drop == 0);\n  fail_unless(lwip_stats.mib2.ipreasmoks == 0);\n\n  create_ip4_input_fragment(ip_id, 0*200, 200, 0);\n  fail_unless(lwip_stats.ip_frag.recv == 2);\n  fail_unless(lwip_stats.ip_frag.err == 0);\n  fail_unless(lwip_stats.ip_frag.memerr == 0);\n  fail_unless(lwip_stats.ip_frag.drop == 0);\n  fail_unless(lwip_stats.mib2.ipreasmoks == 0);\n\n  create_ip4_input_fragment(ip_id, 1*200, 200, 0);\n  fail_unless(lwip_stats.ip_frag.recv == 3);\n  fail_unless(lwip_stats.ip_frag.err == 0);\n  fail_unless(lwip_stats.ip_frag.memerr == 0);\n  fail_unless(lwip_stats.ip_frag.drop == 0);\n  fail_unless(lwip_stats.mib2.ipreasmoks == 0);\n\n  create_ip4_input_fragment(ip_id, 2*200, 200, 0);\n  fail_unless(lwip_stats.ip_frag.recv == 4);\n  fail_unless(lwip_stats.ip_frag.err == 0);\n  fail_unless(lwip_stats.ip_frag.memerr == 0);\n  fail_unless(lwip_stats.ip_frag.drop == 0);\n  fail_unless(lwip_stats.mib2.ipreasmoks == 0);\n\n  create_ip4_input_fragment(ip_id, 3*200, 200, 0);\n  fail_unless(lwip_stats.ip_frag.recv == 5);\n  fail_unless(lwip_stats.ip_frag.err == 0);\n  fail_unless(lwip_stats.ip_frag.memerr == 0);\n  fail_unless(lwip_stats.ip_frag.drop == 0);\n  fail_unless(lwip_stats.mib2.ipreasmoks == 0);\n\n  create_ip4_input_fragment(ip_id, 4*200, 200, 0);\n  fail_unless(lwip_stats.ip_frag.recv == 6);\n  fail_unless(lwip_stats.ip_frag.err == 0);\n  fail_unless(lwip_stats.ip_frag.memerr == 0);\n  fail_unless(lwip_stats.ip_frag.drop == 0);\n  fail_unless(lwip_stats.mib2.ipreasmoks == 0);\n\n  create_ip4_input_fragment(ip_id, 7*200, 200, 0);\n  fail_unless(lwip_stats.ip_frag.recv == 7);\n  fail_unless(lwip_stats.ip_frag.err == 0);\n  fail_unless(lwip_stats.ip_frag.memerr == 0);\n  fail_unless(lwip_stats.ip_frag.drop == 0);\n  fail_unless(lwip_stats.mib2.ipreasmoks == 0);\n\n  create_ip4_input_fragment(ip_id, 6*200, 200, 0);\n  fail_unless(lwip_stats.ip_frag.recv == 8);\n  fail_unless(lwip_stats.ip_frag.err == 0);\n  fail_unless(lwip_stats.ip_frag.memerr == 0);\n  fail_unless(lwip_stats.ip_frag.drop == 0);\n  fail_unless(lwip_stats.mib2.ipreasmoks == 0);\n\n  create_ip4_input_fragment(ip_id, 5*200, 200, 0);\n  fail_unless(lwip_stats.ip_frag.recv == 9);\n  fail_unless(lwip_stats.ip_frag.err == 0);\n  fail_unless(lwip_stats.ip_frag.memerr == 0);\n  fail_unless(lwip_stats.ip_frag.drop == 0);\n  fail_unless(lwip_stats.mib2.ipreasmoks == 1);\n}\nEND_TEST\n\n\n/** Create the suite including all tests for this module */\nSuite *\nip4_suite(void)\n{\n  testfunc tests[] = {\n    TESTFUNC(test_ip4_reass),\n  };\n  return create_suite(\"IPv4\", tests, sizeof(tests)/sizeof(testfunc), ip4_setup, ip4_teardown);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/ip4/test_ip4.h",
    "content": "#ifndef LWIP_HDR_TEST_IP4_H\n#define LWIP_HDR_TEST_IP4_H\n\n#include \"../lwip_check.h\"\n\nSuite* ip4_suite(void);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/lwip_check.h",
    "content": "#ifndef LWIP_HDR_LWIP_CHECK_H\n#define LWIP_HDR_LWIP_CHECK_H\n\n/* Common header file for lwIP unit tests using the check framework */\n\n#include <config.h>\n#include <check.h>\n#include <stdlib.h>\n\n#define FAIL_RET() do { fail(); return; } while(0)\n#define EXPECT(x) fail_unless(x)\n#define EXPECT_RET(x) do { fail_unless(x); if(!(x)) { return; }} while(0)\n#define EXPECT_RETX(x, y) do { fail_unless(x); if(!(x)) { return y; }} while(0)\n#define EXPECT_RETNULL(x) EXPECT_RETX(x, NULL)\n\ntypedef struct {\n  TFun func;\n  const char *name;\n} testfunc;\n\n#define TESTFUNC(x) {(x), \"\" # x \"\" }\n\n/* Modified function from check.h, supplying function name */\n#define tcase_add_named_test(tc,tf) \\\n   _tcase_add_test((tc),(tf).func,(tf).name,0, 0, 0, 1)\n\n/** typedef for a function returning a test suite */\ntypedef Suite* (suite_getter_fn)(void);\n\n/** Create a test suite */\nSuite* create_suite(const char* name, testfunc *tests, size_t num_tests, SFun setup, SFun teardown);\n\n#ifdef LWIP_UNITTESTS_LIB\nint lwip_unittests_run(void)\n#endif\n\n#endif /* LWIP_HDR_LWIP_CHECK_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/lwip_unittests.c",
    "content": "#include \"lwip_check.h\"\n\n#include \"ip4/test_ip4.h\"\n#include \"udp/test_udp.h\"\n#include \"tcp/test_tcp.h\"\n#include \"tcp/test_tcp_oos.h\"\n#include \"core/test_mem.h\"\n#include \"core/test_pbuf.h\"\n#include \"etharp/test_etharp.h\"\n#include \"dhcp/test_dhcp.h\"\n#include \"mdns/test_mdns.h\"\n\n#include \"lwip/init.h\"\n\nSuite* create_suite(const char* name, testfunc *tests, size_t num_tests, SFun setup, SFun teardown)\n{\n  size_t i;\n  Suite *s = suite_create(name);\n\n  for(i = 0; i < num_tests; i++) {\n    TCase *tc_core = tcase_create(name);\n    if ((setup != NULL) || (teardown != NULL)) {\n      tcase_add_checked_fixture(tc_core, setup, teardown);\n    }\n    tcase_add_named_test(tc_core, tests[i]);\n    suite_add_tcase(s, tc_core);\n  }\n  return s;\n}\n\n#ifdef LWIP_UNITTESTS_LIB\nint lwip_unittests_run(void)\n#else\nint main(void)\n#endif\n{\n  int number_failed;\n  SRunner *sr;\n  size_t i;\n  suite_getter_fn* suites[] = {\n    ip4_suite,\n    udp_suite,\n    tcp_suite,\n    tcp_oos_suite,\n    mem_suite,\n    pbuf_suite,\n    etharp_suite,\n    dhcp_suite,\n    mdns_suite\n  };\n  size_t num = sizeof(suites)/sizeof(void*);\n  LWIP_ASSERT(\"No suites defined\", num > 0);\n\n  lwip_init();\n\n  sr = srunner_create((suites[0])());\n  for(i = 1; i < num; i++) {\n    srunner_add_suite(sr, ((suite_getter_fn*)suites[i])());\n  }\n\n#ifdef LWIP_UNITTESTS_NOFORK\n  srunner_set_fork_status(sr, CK_NOFORK);\n#endif\n#ifdef LWIP_UNITTESTS_FORK\n  srunner_set_fork_status(sr, CK_FORK);\n#endif\n\n  srunner_run_all(sr, CK_NORMAL);\n  number_failed = srunner_ntests_failed(sr);\n  srunner_free(sr);\n  return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/lwipopts.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Simon Goldschmidt\n *\n */\n#ifndef LWIP_HDR_LWIPOPTS_H\n#define LWIP_HDR_LWIPOPTS_H\n\n/* Prevent having to link sys_arch.c (we don't test the API layers in unit tests) */\n#define NO_SYS                          1\n#define SYS_LIGHTWEIGHT_PROT            0\n#define LWIP_NETCONN                    0\n#define LWIP_SOCKET                     0\n\n/* Enable DHCP to test it, disable UDP checksum to easier inject packets */\n#define LWIP_DHCP                       1\n\n/* Minimal changes to opt.h required for tcp unit tests: */\n#define MEM_SIZE                        16000\n#define TCP_SND_QUEUELEN                40\n#define MEMP_NUM_TCP_SEG                TCP_SND_QUEUELEN\n#define TCP_SND_BUF                     (12 * TCP_MSS)\n#define TCP_WND                         (10 * TCP_MSS)\n#define LWIP_WND_SCALE                  1\n#define TCP_RCV_SCALE                   0\n#define PBUF_POOL_SIZE                  400 /* pbuf tests need ~200KByte */\n\n/* Enable IGMP and MDNS for MDNS tests */\n#define LWIP_IGMP                       1\n#define LWIP_MDNS_RESPONDER             1\n#define LWIP_NUM_NETIF_CLIENT_DATA      (LWIP_MDNS_RESPONDER)\n\n/* Minimal changes to opt.h required for etharp unit tests: */\n#define ETHARP_SUPPORT_STATIC_ENTRIES   1\n\n/* MIB2 stats are required to check IPv4 reassembly results */\n#define MIB2_STATS                      1\n\n#endif /* LWIP_HDR_LWIPOPTS_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/mdns/test_mdns.c",
    "content": "/*\n * Copyright (c) 2015 Verisure Innovation AB\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Erik Ekman <erik@kryo.se>\n *\n */\n\n#include \"test_mdns.h\"\n\n#include \"lwip/pbuf.h\"\n#include \"lwip/apps/mdns.h\"\n#include \"lwip/apps/mdns_priv.h\"\n\nSTART_TEST(readname_basic)\n{\n  static const u8_t data[] = { 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00 };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 0, &domain);\n  pbuf_free(p);\n  fail_unless(offset == sizeof(data));\n  fail_unless(domain.length == sizeof(data));\n  fail_if(memcmp(&domain.name, data, sizeof(data)));\n}\nEND_TEST\n\nSTART_TEST(readname_anydata)\n{\n  static const u8_t data[] = { 0x05, 0x00, 0xFF, 0x08, 0xc0, 0x0f, 0x04, 0x7f, 0x80, 0x82, 0x88, 0x00 };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 0, &domain);\n  pbuf_free(p);\n  fail_unless(offset == sizeof(data));\n  fail_unless(domain.length == sizeof(data));\n  fail_if(memcmp(&domain.name, data, sizeof(data)));\n}\nEND_TEST\n\nSTART_TEST(readname_short_buf)\n{\n  static const u8_t data[] = { 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a' };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 0, &domain);\n  pbuf_free(p);\n  fail_unless(offset == MDNS_READNAME_ERROR);\n}\nEND_TEST\n\nSTART_TEST(readname_long_label)\n{\n  static const u8_t data[] = {\n      0x05, 'm', 'u', 'l', 't', 'i',\n      0x52, 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',\n      'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',\n      'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',\n      'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',\n      'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a',\n      'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 0, &domain);\n  pbuf_free(p);\n  fail_unless(offset == MDNS_READNAME_ERROR);\n}\nEND_TEST\n\nSTART_TEST(readname_overflow)\n{\n  static const u8_t data[] = {\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 0, &domain);\n  pbuf_free(p);\n  fail_unless(offset == MDNS_READNAME_ERROR);\n}\nEND_TEST\n\nSTART_TEST(readname_jump_earlier)\n{\n  static const u8_t data[] = {\n      /* Some padding needed, not supported to jump to bytes containing dns header */\n      /*  0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      /* 10 */ 0x0f, 0x0e, 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xab,\n      /* 20 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x0c\n  };\n  static const u8_t fullname[] = {\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 20, &domain);\n  pbuf_free(p);\n  fail_unless(offset == sizeof(data));\n  fail_unless(domain.length == sizeof(fullname));\n\n  fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));\n}\nEND_TEST\n\nSTART_TEST(readname_jump_earlier_jump)\n{\n  static const u8_t data[] = {\n      /* Some padding needed, not supported to jump to bytes containing dns header */\n      /* 0x00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      /* 0x08 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x0b, 0x0a, 0xf2,\n      /* 0x10 */ 0x04, 'c', 'a', 's', 't', 0x00, 0xc0, 0x10,\n      /* 0x18 */ 0x05, 'm', 'u', 'l', 't', 'i', 0xc0, 0x16\n  };\n  static const u8_t fullname[] = {\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 0x18, &domain);\n  pbuf_free(p);\n  fail_unless(offset == sizeof(data));\n  fail_unless(domain.length == sizeof(fullname));\n\n  fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));\n}\nEND_TEST\n\nSTART_TEST(readname_jump_maxdepth)\n{\n  static const u8_t data[] = {\n      /* Some padding needed, not supported to jump to bytes containing dns header */\n      /* 0x00 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      /* 0x08 */ 0x00, 0x00, 0x00, 0x00, 0x03, 0x0b, 0x0a, 0xf2,\n      /* 0x10 */ 0x04, 'n', 'a', 'm', 'e', 0xc0, 0x27, 0x03,\n      /* 0x18 */ 0x03, 'd', 'n', 's', 0xc0, 0x10, 0xc0, 0x10,\n      /* 0x20 */ 0x04, 'd', 'e', 'e', 'p', 0xc0, 0x18, 0x00,\n      /* 0x28 */ 0x04, 'c', 'a', 's', 't', 0xc0, 0x20, 0xb0,\n      /* 0x30 */ 0x05, 'm', 'u', 'l', 't', 'i', 0xc0, 0x28\n  };\n  static const u8_t fullname[] = {\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't',\n      0x04, 'd', 'e', 'e', 'p', 0x03, 'd', 'n', 's',\n      0x04, 'n', 'a', 'm', 'e', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 0x30, &domain);\n  pbuf_free(p);\n  fail_unless(offset == sizeof(data));\n  fail_unless(domain.length == sizeof(fullname));\n\n  fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));\n}\nEND_TEST\n\nSTART_TEST(readname_jump_later)\n{\n  static const u8_t data[] = {\n      /* 0x00 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x10, 0x00, 0x01, 0x40,\n      /* 0x10 */ 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xab\n  };\n  static const u8_t fullname[] = {\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 0, &domain);\n  pbuf_free(p);\n  fail_unless(offset == 13);\n  fail_unless(domain.length == sizeof(fullname));\n\n  fail_if(memcmp(&domain.name, fullname, sizeof(fullname)));\n}\nEND_TEST\n\nSTART_TEST(readname_half_jump)\n{\n  static const u8_t data[] = {\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 0, &domain);\n  pbuf_free(p);\n  fail_unless(offset == MDNS_READNAME_ERROR);\n}\nEND_TEST\n\nSTART_TEST(readname_jump_toolong)\n{\n  static const u8_t data[] = {\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc2, 0x10, 0x00, 0x01, 0x40\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 0, &domain);\n  pbuf_free(p);\n  fail_unless(offset == MDNS_READNAME_ERROR);\n}\nEND_TEST\n\nSTART_TEST(readname_jump_loop_label)\n{\n  static const u8_t data[] = {\n      /*  0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      /* 10 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x10\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 10, &domain);\n  pbuf_free(p);\n  fail_unless(offset == MDNS_READNAME_ERROR);\n}\nEND_TEST\n\nSTART_TEST(readname_jump_loop_jump)\n{\n  static const u8_t data[] = {\n      /*  0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      /* 10 */ 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0xc0, 0x15\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n  offset = mdns_readname(p, 10, &domain);\n  pbuf_free(p);\n  fail_unless(offset == MDNS_READNAME_ERROR);\n}\nEND_TEST\n\nSTART_TEST(add_label_basic)\n{\n  static const u8_t data[] = { 0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00 };\n  struct mdns_domain domain;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, \"multi\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, \"cast\", 4);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_OK);\n  fail_unless(domain.length == sizeof(data));\n  fail_if(memcmp(&domain.name, data, sizeof(data)));\n}\nEND_TEST\n\nSTART_TEST(add_label_long_label)\n{\n  static const char *toolong = \"abcdefghijklmnopqrstuvwxyz0123456789-abcdefghijklmnopqrstuvwxyz0123456789-abcdefghijklmnopqrstuvwxyz0123456789-\";\n  struct mdns_domain domain;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, \"multi\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, toolong, (u8_t)strlen(toolong));\n  fail_unless(res == ERR_VAL);\n}\nEND_TEST\n\nSTART_TEST(add_label_full)\n{\n  static const char *label = \"0123456789abcdef0123456789abcdef\";\n  struct mdns_domain domain;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));\n  fail_unless(res == ERR_OK);\n  fail_unless(domain.length == 33);\n  res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));\n  fail_unless(res == ERR_OK);\n  fail_unless(domain.length == 66);\n  res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));\n  fail_unless(res == ERR_OK);\n  fail_unless(domain.length == 99);\n  res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));\n  fail_unless(res == ERR_OK);\n  fail_unless(domain.length == 132);\n  res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));\n  fail_unless(res == ERR_OK);\n  fail_unless(domain.length == 165);\n  res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));\n  fail_unless(res == ERR_OK);\n  fail_unless(domain.length == 198);\n  res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));\n  fail_unless(res == ERR_OK);\n  fail_unless(domain.length == 231);\n  res = mdns_domain_add_label(&domain, label, (u8_t)strlen(label));\n  fail_unless(res == ERR_VAL);\n  fail_unless(domain.length == 231);\n  res = mdns_domain_add_label(&domain, label, 25);\n  fail_unless(res == ERR_VAL);\n  fail_unless(domain.length == 231);\n  res = mdns_domain_add_label(&domain, label, 24);\n  fail_unless(res == ERR_VAL);\n  fail_unless(domain.length == 231);\n  res = mdns_domain_add_label(&domain, label, 23);\n  fail_unless(res == ERR_OK);\n  fail_unless(domain.length == 255);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_OK);\n  fail_unless(domain.length == 256);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_VAL);\n  fail_unless(domain.length == 256);\n}\nEND_TEST\n\nSTART_TEST(domain_eq_basic)\n{\n  static const u8_t data[] = {\n      0x05, 'm', 'u', 'l', 't', 'i', 0x04, 'c', 'a', 's', 't', 0x00\n  };\n  struct mdns_domain domain1, domain2;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  memset(&domain1, 0, sizeof(domain1));\n  res = mdns_domain_add_label(&domain1, \"multi\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain1, \"cast\", 4);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain1, NULL, 0);\n  fail_unless(res == ERR_OK);\n  fail_unless(domain1.length == sizeof(data));\n\n  memset(&domain2, 0, sizeof(domain2));\n  res = mdns_domain_add_label(&domain2, \"multi\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain2, \"cast\", 4);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain2, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  fail_unless(mdns_domain_eq(&domain1, &domain2));\n}\nEND_TEST\n\nSTART_TEST(domain_eq_diff)\n{\n  struct mdns_domain domain1, domain2;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  memset(&domain1, 0, sizeof(domain1));\n  res = mdns_domain_add_label(&domain1, \"multi\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain1, \"base\", 4);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain1, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  memset(&domain2, 0, sizeof(domain2));\n  res = mdns_domain_add_label(&domain2, \"multi\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain2, \"cast\", 4);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain2, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  fail_if(mdns_domain_eq(&domain1, &domain2));\n}\nEND_TEST\n\nSTART_TEST(domain_eq_case)\n{\n  struct mdns_domain domain1, domain2;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  memset(&domain1, 0, sizeof(domain1));\n  res = mdns_domain_add_label(&domain1, \"multi\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain1, \"cast\", 4);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain1, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  memset(&domain2, 0, sizeof(domain2));\n  res = mdns_domain_add_label(&domain2, \"MulTI\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain2, \"casT\", 4);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain2, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  fail_unless(mdns_domain_eq(&domain1, &domain2));\n}\nEND_TEST\n\nSTART_TEST(domain_eq_anydata)\n{\n  static const u8_t data1[] = { 0x05, 0xcc, 0xdc, 0x00, 0xa0 };\n  static const u8_t data2[] = { 0x7f, 0x8c, 0x01, 0xff, 0xcf };\n  struct mdns_domain domain1, domain2;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  memset(&domain1, 0, sizeof(domain1));\n  res = mdns_domain_add_label(&domain1, (const char*)data1, sizeof(data1));\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain1, \"cast\", 4);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain1, (const char*)data2, sizeof(data2));\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain1, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  memset(&domain2, 0, sizeof(domain2));\n  res = mdns_domain_add_label(&domain2, (const char*)data1, sizeof(data1));\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain2, \"casT\", 4);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain2, (const char*)data2, sizeof(data2));\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain2, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  fail_unless(mdns_domain_eq(&domain1, &domain2));\n}\nEND_TEST\n\nSTART_TEST(domain_eq_length)\n{\n  struct mdns_domain domain1, domain2;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  memset(&domain1, 0, sizeof(domain1));\n  memset(domain1.name, 0xAA, sizeof(MDNS_DOMAIN_MAXLEN));\n  res = mdns_domain_add_label(&domain1, \"multi\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain1, \"cast\", 4);\n  fail_unless(res == ERR_OK);\n\n  memset(&domain2, 0, sizeof(domain2));\n  memset(domain2.name, 0xBB, sizeof(MDNS_DOMAIN_MAXLEN));\n  res = mdns_domain_add_label(&domain2, \"multi\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain2, \"cast\", 4);\n  fail_unless(res == ERR_OK);\n\n  fail_unless(mdns_domain_eq(&domain1, &domain2));\n}\nEND_TEST\n\nSTART_TEST(compress_full_match)\n{\n  static const u8_t data[] = {\n      0x00, 0x00,\n      0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  u16_t length;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, \"foobar\", 6);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, \"local\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  offset = 2;\n  length = mdns_compress_domain(p, &offset, &domain);\n  /* Write 0 bytes, then a jump to addr 2 */\n  fail_unless(length == 0);\n  fail_unless(offset == 2);\n\n  pbuf_free(p);\n}\nEND_TEST\n\nSTART_TEST(compress_full_match_subset)\n{\n  static const u8_t data[] = {\n      0x00, 0x00,\n      0x02, 'g', 'o', 0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  u16_t length;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, \"foobar\", 6);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, \"local\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  offset = 2;\n  length = mdns_compress_domain(p, &offset, &domain);\n  /* Write 0 bytes, then a jump to addr 5 */\n  fail_unless(length == 0);\n  fail_unless(offset == 5);\n\n  pbuf_free(p);\n}\nEND_TEST\n\nSTART_TEST(compress_full_match_jump)\n{\n  static const u8_t data[] = {\n    /* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n               0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n    /* 0x10 */ 0x04, 'l', 'w', 'i', 'p', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xc0, 0x00, 0x02, 0x00,\n    /* 0x20 */ 0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0xc0, 0x15\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  u16_t length;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, \"foobar\", 6);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, \"local\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  offset = 0x20;\n  length = mdns_compress_domain(p, &offset, &domain);\n  /* Write 0 bytes, then a jump to addr 0x20 */\n  fail_unless(length == 0);\n  fail_unless(offset == 0x20);\n\n  pbuf_free(p);\n}\nEND_TEST\n\nSTART_TEST(compress_no_match)\n{\n  static const u8_t data[] = {\n      0x00, 0x00,\n      0x04, 'l', 'w', 'i', 'p', 0x05, 'w', 'i', 'k', 'i', 'a', 0x03, 'c', 'o', 'm', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  u16_t length;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, \"foobar\", 6);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, \"local\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  offset = 2;\n  length = mdns_compress_domain(p, &offset, &domain);\n  /* Write all bytes, no jump */\n  fail_unless(length == domain.length);\n\n  pbuf_free(p);\n}\nEND_TEST\n\nSTART_TEST(compress_2nd_label)\n{\n  static const u8_t data[] = {\n      0x00, 0x00,\n      0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  u16_t length;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, \"lwip\", 4);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, \"local\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  offset = 2;\n  length = mdns_compress_domain(p, &offset, &domain);\n  /* Write 5 bytes, then a jump to addr 9 */\n  fail_unless(length == 5);\n  fail_unless(offset == 9);\n\n  pbuf_free(p);\n}\nEND_TEST\n\nSTART_TEST(compress_2nd_label_short)\n{\n  static const u8_t data[] = {\n      0x00, 0x00,\n      0x04, 'l', 'w', 'i', 'p', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  u16_t length;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, \"foobar\", 6);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, \"local\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  offset = 2;\n  length = mdns_compress_domain(p, &offset, &domain);\n  /* Write 5 bytes, then a jump to addr 7 */\n  fail_unless(length == 7);\n  fail_unless(offset == 7);\n\n  pbuf_free(p);\n}\nEND_TEST\n\nSTART_TEST(compress_jump_to_jump)\n{\n  static const u8_t data[] = {\n      /* 0x00 */ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n                 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n      /* 0x10 */ 0x04, 'l', 'w', 'i', 'p', 0x05, 'l', 'o', 'c', 'a', 'l', 0x00, 0xc0, 0x00, 0x02, 0x00,\n      /* 0x20 */ 0x07, 'b', 'a', 'n', 'a', 'n', 'a', 's', 0xc0, 0x15\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  u16_t length;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, \"foobar\", 6);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, \"local\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  offset = 0x20;\n  length = mdns_compress_domain(p, &offset, &domain);\n  /* Dont compress if jump would be to a jump */\n  fail_unless(length == domain.length);\n\n  offset = 0x10;\n  length = mdns_compress_domain(p, &offset, &domain);\n  /* Write 7 bytes, then a jump to addr 0x15 */\n  fail_unless(length == 7);\n  fail_unless(offset == 0x15);\n\n  pbuf_free(p);\n}\nEND_TEST\n\nSTART_TEST(compress_long_match)\n{\n  static const u8_t data[] = {\n      0x00, 0x00,\n      0x06, 'f', 'o', 'o', 'b', 'a', 'r', 0x05, 'l', 'o', 'c', 'a', 'l', 0x03, 'c', 'o', 'm', 0x00\n  };\n  struct pbuf *p;\n  struct mdns_domain domain;\n  u16_t offset;\n  u16_t length;\n  err_t res;\n  LWIP_UNUSED_ARG(_i);\n\n  p = pbuf_alloc(PBUF_RAW, sizeof(data), PBUF_ROM);\n  p->payload = (void *)(size_t)data;\n  fail_if(p == NULL);\n\n  memset(&domain, 0, sizeof(domain));\n  res = mdns_domain_add_label(&domain, \"foobar\", 6);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, \"local\", 5);\n  fail_unless(res == ERR_OK);\n  res = mdns_domain_add_label(&domain, NULL, 0);\n  fail_unless(res == ERR_OK);\n\n  offset = 2;\n  length = mdns_compress_domain(p, &offset, &domain);\n  fail_unless(length == domain.length);\n\n  pbuf_free(p);\n}\nEND_TEST\n\nSuite* mdns_suite(void)\n{\n  testfunc tests[] = {\n    TESTFUNC(readname_basic),\n    TESTFUNC(readname_anydata),\n    TESTFUNC(readname_short_buf),\n    TESTFUNC(readname_long_label),\n    TESTFUNC(readname_overflow),\n    TESTFUNC(readname_jump_earlier),\n    TESTFUNC(readname_jump_earlier_jump),\n    TESTFUNC(readname_jump_maxdepth),\n    TESTFUNC(readname_jump_later),\n    TESTFUNC(readname_half_jump),\n    TESTFUNC(readname_jump_toolong),\n    TESTFUNC(readname_jump_loop_label),\n    TESTFUNC(readname_jump_loop_jump),\n\n    TESTFUNC(add_label_basic),\n    TESTFUNC(add_label_long_label),\n    TESTFUNC(add_label_full),\n\n    TESTFUNC(domain_eq_basic),\n    TESTFUNC(domain_eq_diff),\n    TESTFUNC(domain_eq_case),\n    TESTFUNC(domain_eq_anydata),\n    TESTFUNC(domain_eq_length),\n\n    TESTFUNC(compress_full_match),\n    TESTFUNC(compress_full_match_subset),\n    TESTFUNC(compress_full_match_jump),\n    TESTFUNC(compress_no_match),\n    TESTFUNC(compress_2nd_label),\n    TESTFUNC(compress_2nd_label_short),\n    TESTFUNC(compress_jump_to_jump),\n    TESTFUNC(compress_long_match),\n  };\n  return create_suite(\"MDNS\", tests, sizeof(tests)/sizeof(testfunc), NULL, NULL);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/mdns/test_mdns.h",
    "content": "#ifndef LWIP_HDR_TEST_MDNS_H__\n#define LWIP_HDR_TEST_MDNS_H__\n\n#include \"../lwip_check.h\"\n\nSuite* mdns_suite(void);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/tcp/tcp_helper.c",
    "content": "#include \"tcp_helper.h\"\n\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/stats.h\"\n#include \"lwip/pbuf.h\"\n#include \"lwip/inet_chksum.h\"\n#include \"lwip/ip_addr.h\"\n\n#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS\n#error \"This tests needs TCP- and MEMP-statistics enabled\"\n#endif\n\n/** Remove all pcbs on the given list. */\nstatic void\ntcp_remove(struct tcp_pcb* pcb_list)\n{\n  struct tcp_pcb *pcb = pcb_list;\n  struct tcp_pcb *pcb2;\n\n  while(pcb != NULL) {\n    pcb2 = pcb;\n    pcb = pcb->next;\n    tcp_abort(pcb2);\n  }\n}\n\n/** Remove all pcbs on listen-, active- and time-wait-list (bound- isn't exported). */\nvoid\ntcp_remove_all(void)\n{\n  tcp_remove(tcp_listen_pcbs.pcbs);\n  tcp_remove(tcp_active_pcbs);\n  tcp_remove(tcp_tw_pcbs);\n  fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n  fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB_LISTEN) == 0);\n  fail_unless(MEMP_STATS_GET(used, MEMP_TCP_SEG) == 0);\n  fail_unless(MEMP_STATS_GET(used, MEMP_PBUF_POOL) == 0);\n}\n\n/** Create a TCP segment usable for passing to tcp_input */\nstatic struct pbuf*\ntcp_create_segment_wnd(ip_addr_t* src_ip, ip_addr_t* dst_ip,\n                   u16_t src_port, u16_t dst_port, void* data, size_t data_len,\n                   u32_t seqno, u32_t ackno, u8_t headerflags, u16_t wnd)\n{\n  struct pbuf *p, *q;\n  struct ip_hdr* iphdr;\n  struct tcp_hdr* tcphdr;\n  u16_t pbuf_len = (u16_t)(sizeof(struct ip_hdr) + sizeof(struct tcp_hdr) + data_len);\n  LWIP_ASSERT(\"data_len too big\", data_len <= 0xFFFF);\n\n  p = pbuf_alloc(PBUF_RAW, pbuf_len, PBUF_POOL);\n  EXPECT_RETNULL(p != NULL);\n  /* first pbuf must be big enough to hold the headers */\n  EXPECT_RETNULL(p->len >= (sizeof(struct ip_hdr) + sizeof(struct tcp_hdr)));\n  if (data_len > 0) {\n    /* first pbuf must be big enough to hold at least 1 data byte, too */\n    EXPECT_RETNULL(p->len > (sizeof(struct ip_hdr) + sizeof(struct tcp_hdr)));\n  }\n\n  for(q = p; q != NULL; q = q->next) {\n    memset(q->payload, 0, q->len);\n  }\n\n  iphdr = (struct ip_hdr*)p->payload;\n  /* fill IP header */\n  iphdr->dest.addr = ip_2_ip4(dst_ip)->addr;\n  iphdr->src.addr = ip_2_ip4(src_ip)->addr;\n  IPH_VHL_SET(iphdr, 4, IP_HLEN / 4);\n  IPH_TOS_SET(iphdr, 0);\n  IPH_LEN_SET(iphdr, htons(p->tot_len));\n  IPH_CHKSUM_SET(iphdr, inet_chksum(iphdr, IP_HLEN));\n\n  /* let p point to TCP header */\n  pbuf_header(p, -(s16_t)sizeof(struct ip_hdr));\n\n  tcphdr = (struct tcp_hdr*)p->payload;\n  tcphdr->src   = htons(src_port);\n  tcphdr->dest  = htons(dst_port);\n  tcphdr->seqno = htonl(seqno);\n  tcphdr->ackno = htonl(ackno);\n  TCPH_HDRLEN_SET(tcphdr, sizeof(struct tcp_hdr)/4);\n  TCPH_FLAGS_SET(tcphdr, headerflags);\n  tcphdr->wnd   = htons(wnd);\n\n  if (data_len > 0) {\n    /* let p point to TCP data */\n    pbuf_header(p, -(s16_t)sizeof(struct tcp_hdr));\n    /* copy data */\n    pbuf_take(p, data, (u16_t)data_len);\n    /* let p point to TCP header again */\n    pbuf_header(p, sizeof(struct tcp_hdr));\n  }\n\n  /* calculate checksum */\n\n  tcphdr->chksum = ip_chksum_pseudo(p,\n          IP_PROTO_TCP, p->tot_len, src_ip, dst_ip);\n\n  pbuf_header(p, sizeof(struct ip_hdr));\n\n  return p;\n}\n\n/** Create a TCP segment usable for passing to tcp_input */\nstruct pbuf*\ntcp_create_segment(ip_addr_t* src_ip, ip_addr_t* dst_ip,\n                   u16_t src_port, u16_t dst_port, void* data, size_t data_len,\n                   u32_t seqno, u32_t ackno, u8_t headerflags)\n{\n  return tcp_create_segment_wnd(src_ip, dst_ip, src_port, dst_port, data,\n    data_len, seqno, ackno, headerflags, TCP_WND);\n}\n\n/** Create a TCP segment usable for passing to tcp_input\n * - IP-addresses, ports, seqno and ackno are taken from pcb\n * - seqno and ackno can be altered with an offset\n */\nstruct pbuf*\ntcp_create_rx_segment(struct tcp_pcb* pcb, void* data, size_t data_len, u32_t seqno_offset,\n                      u32_t ackno_offset, u8_t headerflags)\n{\n  return tcp_create_segment(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port, pcb->local_port,\n    data, data_len, pcb->rcv_nxt + seqno_offset, pcb->lastack + ackno_offset, headerflags);\n}\n\n/** Create a TCP segment usable for passing to tcp_input\n * - IP-addresses, ports, seqno and ackno are taken from pcb\n * - seqno and ackno can be altered with an offset\n * - TCP window can be adjusted\n */\nstruct pbuf* tcp_create_rx_segment_wnd(struct tcp_pcb* pcb, void* data, size_t data_len,\n                   u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags, u16_t wnd)\n{\n  return tcp_create_segment_wnd(&pcb->remote_ip, &pcb->local_ip, pcb->remote_port, pcb->local_port,\n    data, data_len, pcb->rcv_nxt + seqno_offset, pcb->lastack + ackno_offset, headerflags, wnd);\n}\n\n/** Safely bring a tcp_pcb into the requested state */\nvoid\ntcp_set_state(struct tcp_pcb* pcb, enum tcp_state state, ip_addr_t* local_ip,\n                   ip_addr_t* remote_ip, u16_t local_port, u16_t remote_port)\n{\n  u32_t iss;\n\n  /* @todo: are these all states? */\n  /* @todo: remove from previous list */\n  pcb->state = state;\n  \n  iss = tcp_next_iss(pcb);\n  pcb->snd_wl2 = iss;\n  pcb->snd_nxt = iss;\n  pcb->lastack = iss;\n  pcb->snd_lbb = iss;\n  \n  if (state == ESTABLISHED) {\n    TCP_REG(&tcp_active_pcbs, pcb);\n    ip_addr_copy(pcb->local_ip, *local_ip);\n    pcb->local_port = local_port;\n    ip_addr_copy(pcb->remote_ip, *remote_ip);\n    pcb->remote_port = remote_port;\n  } else if(state == LISTEN) {\n    TCP_REG(&tcp_listen_pcbs.pcbs, pcb);\n    ip_addr_copy(pcb->local_ip, *local_ip);\n    pcb->local_port = local_port;\n  } else if(state == TIME_WAIT) {\n    TCP_REG(&tcp_tw_pcbs, pcb);\n    ip_addr_copy(pcb->local_ip, *local_ip);\n    pcb->local_port = local_port;\n    ip_addr_copy(pcb->remote_ip, *remote_ip);\n    pcb->remote_port = remote_port;\n  } else {\n    fail();\n  }\n}\n\nvoid\ntest_tcp_counters_err(void* arg, err_t err)\n{\n  struct test_tcp_counters* counters = (struct test_tcp_counters*)arg;\n  EXPECT_RET(arg != NULL);\n  counters->err_calls++;\n  counters->last_err = err;\n}\n\nstatic void\ntest_tcp_counters_check_rxdata(struct test_tcp_counters* counters, struct pbuf* p)\n{\n  struct pbuf* q;\n  u32_t i, received;\n  if(counters->expected_data == NULL) {\n    /* no data to compare */\n    return;\n  }\n  EXPECT_RET(counters->recved_bytes + p->tot_len <= counters->expected_data_len);\n  received = counters->recved_bytes;\n  for(q = p; q != NULL; q = q->next) {\n    char *data = (char*)q->payload;\n    for(i = 0; i < q->len; i++) {\n      EXPECT_RET(data[i] == counters->expected_data[received]);\n      received++;\n    }\n  }\n  EXPECT(received == counters->recved_bytes + p->tot_len);\n}\n\nerr_t\ntest_tcp_counters_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err)\n{\n  struct test_tcp_counters* counters = (struct test_tcp_counters*)arg;\n  EXPECT_RETX(arg != NULL, ERR_OK);\n  EXPECT_RETX(pcb != NULL, ERR_OK);\n  EXPECT_RETX(err == ERR_OK, ERR_OK);\n\n  if (p != NULL) {\n    if (counters->close_calls == 0) {\n      counters->recv_calls++;\n      test_tcp_counters_check_rxdata(counters, p);\n      counters->recved_bytes += p->tot_len;\n    } else {\n      counters->recv_calls_after_close++;\n      counters->recved_bytes_after_close += p->tot_len;\n    }\n    pbuf_free(p);\n  } else {\n    counters->close_calls++;\n  }\n  EXPECT(counters->recv_calls_after_close == 0 && counters->recved_bytes_after_close == 0);\n  return ERR_OK;\n}\n\n/** Allocate a pcb and set up the test_tcp_counters_* callbacks */\nstruct tcp_pcb*\ntest_tcp_new_counters_pcb(struct test_tcp_counters* counters)\n{\n  struct tcp_pcb* pcb = tcp_new();\n  if (pcb != NULL) {\n    /* set up args and callbacks */\n    tcp_arg(pcb, counters);\n    tcp_recv(pcb, test_tcp_counters_recv);\n    tcp_err(pcb, test_tcp_counters_err);\n    pcb->snd_wnd = TCP_WND;\n    pcb->snd_wnd_max = TCP_WND;\n  }\n  return pcb;\n}\n\n/** Calls tcp_input() after adjusting current_iphdr_dest */\nvoid test_tcp_input(struct pbuf *p, struct netif *inp)\n{\n  struct ip_hdr *iphdr = (struct ip_hdr*)p->payload;\n  /* these lines are a hack, don't use them as an example :-) */\n  ip_addr_copy_from_ip4(*ip_current_dest_addr(), iphdr->dest);\n  ip_addr_copy_from_ip4(*ip_current_src_addr(), iphdr->src);\n  ip_current_netif() = inp;\n  ip_data.current_ip4_header = iphdr;\n\n  /* since adding IPv6, p->payload must point to tcp header, not ip header */\n  pbuf_header(p, -(s16_t)sizeof(struct ip_hdr));\n\n  tcp_input(p, inp);\n\n  ip_addr_set_zero(ip_current_dest_addr());\n  ip_addr_set_zero(ip_current_src_addr());\n  ip_current_netif() = NULL;\n  ip_data.current_ip4_header = NULL;\n}\n\nstatic err_t test_tcp_netif_output(struct netif *netif, struct pbuf *p,\n       const ip4_addr_t *ipaddr)\n{\n  struct test_tcp_txcounters *txcounters = (struct test_tcp_txcounters*)netif->state;\n  LWIP_UNUSED_ARG(ipaddr);\n  if (txcounters != NULL)\n  {\n    txcounters->num_tx_calls++;\n    txcounters->num_tx_bytes += p->tot_len;\n    if (txcounters->copy_tx_packets) {\n      struct pbuf *p_copy = pbuf_alloc(PBUF_LINK, p->tot_len, PBUF_RAM);\n      err_t err;\n      EXPECT(p_copy != NULL);\n      err = pbuf_copy(p_copy, p);\n      EXPECT(err == ERR_OK);\n      if (txcounters->tx_packets == NULL) {\n        txcounters->tx_packets = p_copy;\n      } else {\n        pbuf_cat(txcounters->tx_packets, p_copy);\n      }\n    }\n  }\n  return ERR_OK;\n}\n\nvoid test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters,\n                         ip_addr_t *ip_addr, ip_addr_t *netmask)\n{\n  struct netif *n;\n  memset(netif, 0, sizeof(struct netif));\n  if (txcounters != NULL) {\n    memset(txcounters, 0, sizeof(struct test_tcp_txcounters));\n    netif->state = txcounters;\n  }\n  netif->output = test_tcp_netif_output;\n  netif->flags |= NETIF_FLAG_UP | NETIF_FLAG_LINK_UP;\n  ip_addr_copy_from_ip4(netif->netmask, *ip_2_ip4(netmask));\n  ip_addr_copy_from_ip4(netif->ip_addr, *ip_2_ip4(ip_addr));\n  for (n = netif_list; n != NULL; n = n->next) {\n    if (n == netif) {\n      return;\n    }\n  }\n  netif->next = NULL;\n  netif_list = netif;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/tcp/tcp_helper.h",
    "content": "#ifndef LWIP_HDR_TCP_HELPER_H\n#define LWIP_HDR_TCP_HELPER_H\n\n#include \"../lwip_check.h\"\n#include \"lwip/arch.h\"\n#include \"lwip/tcp.h\"\n#include \"lwip/netif.h\"\n\n/* counters used for test_tcp_counters_* callback functions */\nstruct test_tcp_counters {\n  u32_t recv_calls;\n  u32_t recved_bytes;\n  u32_t recv_calls_after_close;\n  u32_t recved_bytes_after_close;\n  u32_t close_calls;\n  u32_t err_calls;\n  err_t last_err;\n  char* expected_data;\n  u32_t expected_data_len;\n};\n\nstruct test_tcp_txcounters {\n  u32_t num_tx_calls;\n  u32_t num_tx_bytes;\n  u8_t  copy_tx_packets;\n  struct pbuf *tx_packets;\n};\n\n/* Helper functions */\nvoid tcp_remove_all(void);\n\nstruct pbuf* tcp_create_segment(ip_addr_t* src_ip, ip_addr_t* dst_ip,\n                   u16_t src_port, u16_t dst_port, void* data, size_t data_len,\n                   u32_t seqno, u32_t ackno, u8_t headerflags);\nstruct pbuf* tcp_create_rx_segment(struct tcp_pcb* pcb, void* data, size_t data_len,\n                   u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags);\nstruct pbuf* tcp_create_rx_segment_wnd(struct tcp_pcb* pcb, void* data, size_t data_len,\n                   u32_t seqno_offset, u32_t ackno_offset, u8_t headerflags, u16_t wnd);\nvoid tcp_set_state(struct tcp_pcb* pcb, enum tcp_state state, ip_addr_t* local_ip,\n                   ip_addr_t* remote_ip, u16_t local_port, u16_t remote_port);\nvoid test_tcp_counters_err(void* arg, err_t err);\nerr_t test_tcp_counters_recv(void* arg, struct tcp_pcb* pcb, struct pbuf* p, err_t err);\n\nstruct tcp_pcb* test_tcp_new_counters_pcb(struct test_tcp_counters* counters);\n\nvoid test_tcp_input(struct pbuf *p, struct netif *inp);\n\nvoid test_tcp_init_netif(struct netif *netif, struct test_tcp_txcounters *txcounters,\n                         ip_addr_t *ip_addr, ip_addr_t *netmask);\n\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/tcp/test_tcp.c",
    "content": "#include \"test_tcp.h\"\n\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/stats.h\"\n#include \"tcp_helper.h\"\n#include \"lwip/inet_chksum.h\"\n\n#ifdef _MSC_VER\n#pragma warning(disable: 4307) /* we explicitly wrap around TCP seqnos */\n#endif\n\n#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS\n#error \"This tests needs TCP- and MEMP-statistics enabled\"\n#endif\n#if TCP_SND_BUF <= TCP_WND\n#error \"This tests needs TCP_SND_BUF to be > TCP_WND\"\n#endif\n\nstatic u8_t test_tcp_timer;\n\n/* our own version of tcp_tmr so we can reset fast/slow timer state */\nstatic void\ntest_tcp_tmr(void)\n{\n  tcp_fasttmr();\n  if (++test_tcp_timer & 1) {\n    tcp_slowtmr();\n  }\n}\n\n/* Setups/teardown functions */\n\nstatic void\ntcp_setup(void)\n{\n  /* reset iss to default (6510) */\n  tcp_ticks = 0;\n  tcp_ticks = 0 - (tcp_next_iss(NULL) - 6510);\n  tcp_next_iss(NULL);\n  tcp_ticks = 0;\n\n  test_tcp_timer = 0;\n  tcp_remove_all();\n}\n\nstatic void\ntcp_teardown(void)\n{\n  netif_list = NULL;\n  netif_default = NULL;\n  tcp_remove_all();\n}\n\n\n/* Test functions */\n\n/** Call tcp_new() and tcp_abort() and test memp stats */\nSTART_TEST(test_tcp_new_abort)\n{\n  struct tcp_pcb* pcb;\n  LWIP_UNUSED_ARG(_i);\n\n  fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n\n  pcb = tcp_new();\n  fail_unless(pcb != NULL);\n  if (pcb != NULL) {\n    fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n    tcp_abort(pcb);\n    fail_unless(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n  }\n}\nEND_TEST\n\n/** Create an ESTABLISHED pcb and check if receive callback is called */\nSTART_TEST(test_tcp_recv_inseq)\n{\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf* p;\n  char data[] = {1, 2, 3, 4};\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t data_len;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  struct netif netif;\n  struct test_tcp_txcounters txcounters;\n  LWIP_UNUSED_ARG(_i);\n\n  /* initialize local vars */\n  memset(&netif, 0, sizeof(netif));\n  IP_ADDR4(&local_ip, 192, 168, 1, 1);\n  IP_ADDR4(&remote_ip, 192, 168, 1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);\n  data_len = sizeof(data);\n  /* initialize counter struct */\n  memset(&counters, 0, sizeof(counters));\n  counters.expected_data_len = data_len;\n  counters.expected_data = data;\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n\n  /* create a segment */\n  p = tcp_create_rx_segment(pcb, counters.expected_data, data_len, 0, 0, 0);\n  EXPECT(p != NULL);\n  if (p != NULL) {\n    /* pass the segment to tcp_input */\n    test_tcp_input(p, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 1);\n    EXPECT(counters.recved_bytes == data_len);\n    EXPECT(counters.err_calls == 0);\n  }\n\n  /* make sure the pcb is freed */\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n}\nEND_TEST\n\n/** Check that we handle malformed tcp headers, and discard the pbuf(s) */\nSTART_TEST(test_tcp_malformed_header)\n{\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf* p;\n  char data[] = {1, 2, 3, 4};\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t data_len, chksum;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  struct netif netif;\n  struct test_tcp_txcounters txcounters;\n  struct tcp_hdr *hdr;\n  LWIP_UNUSED_ARG(_i);\n\n  /* initialize local vars */\n  memset(&netif, 0, sizeof(netif));\n  IP_ADDR4(&local_ip, 192, 168, 1, 1);\n  IP_ADDR4(&remote_ip, 192, 168, 1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);\n  data_len = sizeof(data);\n  /* initialize counter struct */\n  memset(&counters, 0, sizeof(counters));\n  counters.expected_data_len = data_len;\n  counters.expected_data = data;\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n\n  /* create a segment */\n  p = tcp_create_rx_segment(pcb, counters.expected_data, data_len, 0, 0, 0);\n\n  pbuf_header(p, -(s16_t)sizeof(struct ip_hdr));\n\n  hdr = (struct tcp_hdr *)p->payload;\n  TCPH_HDRLEN_FLAGS_SET(hdr, 15, 0x3d1);\n\n  hdr->chksum = 0;\n\n  chksum = ip_chksum_pseudo(p, IP_PROTO_TCP, p->tot_len,\n                             &remote_ip, &local_ip);\n\n  hdr->chksum = chksum;\n\n  pbuf_header(p, sizeof(struct ip_hdr));\n\n  EXPECT(p != NULL);\n  EXPECT(p->next == NULL);\n  if (p != NULL) {\n    /* pass the segment to tcp_input */\n    test_tcp_input(p, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n  }\n\n  /* make sure the pcb is freed */\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n}\nEND_TEST\n\n\n/** Provoke fast retransmission by duplicate ACKs and then recover by ACKing all sent data.\n * At the end, send more data. */\nSTART_TEST(test_tcp_fast_retx_recover)\n{\n  struct netif netif;\n  struct test_tcp_txcounters txcounters;\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf* p;\n  char data1[] = { 1,  2,  3,  4};\n  char data2[] = { 5,  6,  7,  8};\n  char data3[] = { 9, 10, 11, 12};\n  char data4[] = {13, 14, 15, 16};\n  char data5[] = {17, 18, 19, 20};\n  char data6[TCP_MSS] = {21, 22, 23, 24};\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  err_t err;\n  LWIP_UNUSED_ARG(_i);\n\n  /* initialize local vars */\n  IP_ADDR4(&local_ip,  192, 168,   1, 1);\n  IP_ADDR4(&remote_ip, 192, 168,   1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);\n  memset(&counters, 0, sizeof(counters));\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n  pcb->mss = TCP_MSS;\n  /* disable initial congestion window (we don't send a SYN here...) */\n  pcb->cwnd = pcb->snd_wnd;\n\n  /* send data1 */\n  err = tcp_write(pcb, data1, sizeof(data1), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n  EXPECT_RET(txcounters.num_tx_calls == 1);\n  EXPECT_RET(txcounters.num_tx_bytes == sizeof(data1) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr));\n  memset(&txcounters, 0, sizeof(txcounters));\n /* \"recv\" ACK for data1 */\n  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 4, TCP_ACK);\n  EXPECT_RET(p != NULL);\n  test_tcp_input(p, &netif);\n  EXPECT_RET(txcounters.num_tx_calls == 0);\n  EXPECT_RET(pcb->unacked == NULL);\n  /* send data2 */\n  err = tcp_write(pcb, data2, sizeof(data2), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n  EXPECT_RET(txcounters.num_tx_calls == 1);\n  EXPECT_RET(txcounters.num_tx_bytes == sizeof(data2) + sizeof(struct tcp_hdr) + sizeof(struct ip_hdr));\n  memset(&txcounters, 0, sizeof(txcounters));\n  /* duplicate ACK for data1 (data2 is lost) */\n  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK);\n  EXPECT_RET(p != NULL);\n  test_tcp_input(p, &netif);\n  EXPECT_RET(txcounters.num_tx_calls == 0);\n  EXPECT_RET(pcb->dupacks == 1);\n  /* send data3 */\n  err = tcp_write(pcb, data3, sizeof(data3), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n  /* nagle enabled, no tx calls */\n  EXPECT_RET(txcounters.num_tx_calls == 0);\n  EXPECT_RET(txcounters.num_tx_bytes == 0);\n  memset(&txcounters, 0, sizeof(txcounters));\n  /* 2nd duplicate ACK for data1 (data2 and data3 are lost) */\n  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK);\n  EXPECT_RET(p != NULL);\n  test_tcp_input(p, &netif);\n  EXPECT_RET(txcounters.num_tx_calls == 0);\n  EXPECT_RET(pcb->dupacks == 2);\n  /* queue data4, don't send it (unsent-oversize is != 0) */\n  err = tcp_write(pcb, data4, sizeof(data4), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  /* 3nd duplicate ACK for data1 (data2 and data3 are lost) -> fast retransmission */\n  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK);\n  EXPECT_RET(p != NULL);\n  test_tcp_input(p, &netif);\n  /*EXPECT_RET(txcounters.num_tx_calls == 1);*/\n  EXPECT_RET(pcb->dupacks == 3);\n  memset(&txcounters, 0, sizeof(txcounters));\n  /* @todo: check expected data?*/\n  \n  /* send data5, not output yet */\n  err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  /*err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);*/\n  EXPECT_RET(txcounters.num_tx_calls == 0);\n  EXPECT_RET(txcounters.num_tx_bytes == 0);\n  memset(&txcounters, 0, sizeof(txcounters));\n  {\n    int i = 0;\n    do\n    {\n      err = tcp_write(pcb, data6, TCP_MSS, TCP_WRITE_FLAG_COPY);\n      i++;\n    }while(err == ERR_OK);\n    EXPECT_RET(err != ERR_OK);\n  }\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n  /*EXPECT_RET(txcounters.num_tx_calls == 0);\n  EXPECT_RET(txcounters.num_tx_bytes == 0);*/\n  memset(&txcounters, 0, sizeof(txcounters));\n\n  /* send even more data */\n  err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n  /* ...and even more data */\n  err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n  /* ...and even more data */\n  err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n  /* ...and even more data */\n  err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n\n  /* send ACKs for data2 and data3 */\n  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 12, TCP_ACK);\n  EXPECT_RET(p != NULL);\n  test_tcp_input(p, &netif);\n  /*EXPECT_RET(txcounters.num_tx_calls == 0);*/\n\n  /* ...and even more data */\n  err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n  /* ...and even more data */\n  err = tcp_write(pcb, data5, sizeof(data5), TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n\n#if 0\n  /* create expected segment */\n  p1 = tcp_create_rx_segment(pcb, counters.expected_data, data_len, 0, 0, 0);\n  EXPECT_RET(p != NULL);\n  if (p != NULL) {\n    /* pass the segment to tcp_input */\n    test_tcp_input(p, &netif);\n    /* check if counters are as expected */\n    EXPECT_RET(counters.close_calls == 0);\n    EXPECT_RET(counters.recv_calls == 1);\n    EXPECT_RET(counters.recved_bytes == data_len);\n    EXPECT_RET(counters.err_calls == 0);\n  }\n#endif\n  /* make sure the pcb is freed */\n  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n}\nEND_TEST\n\nstatic u8_t tx_data[TCP_WND*2];\n\nstatic void\ncheck_seqnos(struct tcp_seg *segs, int num_expected, u32_t *seqnos_expected)\n{\n  struct tcp_seg *s = segs;\n  int i;\n  for (i = 0; i < num_expected; i++, s = s->next) {\n    EXPECT_RET(s != NULL);\n    EXPECT(s->tcphdr->seqno == htonl(seqnos_expected[i]));\n  }\n  EXPECT(s == NULL);\n}\n\n/** Send data with sequence numbers that wrap around the u32_t range.\n * Then, provoke fast retransmission by duplicate ACKs and check that all\n * segment lists are still properly sorted. */\nSTART_TEST(test_tcp_fast_rexmit_wraparound)\n{\n  struct netif netif;\n  struct test_tcp_txcounters txcounters;\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf* p;\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  err_t err;\n#define SEQNO1 (0xFFFFFF00 - TCP_MSS)\n#define ISS    6510\n  u16_t i, sent_total = 0;\n  u32_t seqnos[] = {\n    SEQNO1,\n    SEQNO1 + (1 * TCP_MSS),\n    SEQNO1 + (2 * TCP_MSS),\n    SEQNO1 + (3 * TCP_MSS),\n    SEQNO1 + (4 * TCP_MSS),\n    SEQNO1 + (5 * TCP_MSS)};\n  LWIP_UNUSED_ARG(_i);\n\n  for (i = 0; i < sizeof(tx_data); i++) {\n    tx_data[i] = (u8_t)i;\n  }\n\n  /* initialize local vars */\n  IP_ADDR4(&local_ip,  192, 168,   1, 1);\n  IP_ADDR4(&remote_ip, 192, 168,   1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);\n  memset(&counters, 0, sizeof(counters));\n\n  /* create and initialize the pcb */\n  tcp_ticks = SEQNO1 - ISS;\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n  pcb->mss = TCP_MSS;\n  /* disable initial congestion window (we don't send a SYN here...) */\n  pcb->cwnd = 2*TCP_MSS;\n  /* start in congestion advoidance */\n  pcb->ssthresh = pcb->cwnd;\n\n  /* send 6 mss-sized segments */\n  for (i = 0; i < 6; i++) {\n    err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY);\n    EXPECT_RET(err == ERR_OK);\n    sent_total += TCP_MSS;\n  }\n  check_seqnos(pcb->unsent, 6, seqnos);\n  EXPECT(pcb->unacked == NULL);\n  err = tcp_output(pcb);\n  EXPECT(txcounters.num_tx_calls == 2);\n  EXPECT(txcounters.num_tx_bytes == 2 * (TCP_MSS + 40U));\n  memset(&txcounters, 0, sizeof(txcounters));\n\n  check_seqnos(pcb->unacked, 2, seqnos);\n  check_seqnos(pcb->unsent, 4, &seqnos[2]);\n\n  /* ACK the first segment */\n  p = tcp_create_rx_segment(pcb, NULL, 0, 0, TCP_MSS, TCP_ACK);\n  test_tcp_input(p, &netif);\n  /* ensure this didn't trigger a retransmission. Only one\n  segment should be transmitted because cwnd opened up by\n  TCP_MSS and a fraction since we are in congestion avoidance */\n  EXPECT(txcounters.num_tx_calls == 1);\n  EXPECT(txcounters.num_tx_bytes == TCP_MSS + 40U);\n  memset(&txcounters, 0, sizeof(txcounters));\n  check_seqnos(pcb->unacked, 2, &seqnos[1]);\n  check_seqnos(pcb->unsent, 3, &seqnos[3]);\n\n  /* 3 dupacks */\n  EXPECT(pcb->dupacks == 0);\n  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK);\n  test_tcp_input(p, &netif);\n  EXPECT(txcounters.num_tx_calls == 0);\n  EXPECT(pcb->dupacks == 1);\n  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK);\n  test_tcp_input(p, &netif);\n  EXPECT(txcounters.num_tx_calls == 0);\n  EXPECT(pcb->dupacks == 2);\n  /* 3rd dupack -> fast rexmit */\n  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK);\n  test_tcp_input(p, &netif);\n  EXPECT(pcb->dupacks == 3);\n  EXPECT(txcounters.num_tx_calls == 4);\n  memset(&txcounters, 0, sizeof(txcounters));\n  EXPECT(pcb->unsent == NULL);\n  check_seqnos(pcb->unacked, 5, &seqnos[1]);\n\n  /* make sure the pcb is freed */\n  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n}\nEND_TEST\n\n/** Send data with sequence numbers that wrap around the u32_t range.\n * Then, provoke RTO retransmission and check that all\n * segment lists are still properly sorted. */\nSTART_TEST(test_tcp_rto_rexmit_wraparound)\n{\n  struct netif netif;\n  struct test_tcp_txcounters txcounters;\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  err_t err;\n#define SEQNO1 (0xFFFFFF00 - TCP_MSS)\n#define ISS    6510\n  u16_t i, sent_total = 0;\n  u32_t seqnos[] = {\n    SEQNO1,\n    SEQNO1 + (1 * TCP_MSS),\n    SEQNO1 + (2 * TCP_MSS),\n    SEQNO1 + (3 * TCP_MSS),\n    SEQNO1 + (4 * TCP_MSS),\n    SEQNO1 + (5 * TCP_MSS)};\n  LWIP_UNUSED_ARG(_i);\n\n  for (i = 0; i < sizeof(tx_data); i++) {\n    tx_data[i] = (u8_t)i;\n  }\n\n  /* initialize local vars */\n  IP_ADDR4(&local_ip,  192, 168,   1, 1);\n  IP_ADDR4(&remote_ip, 192, 168,   1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);\n  memset(&counters, 0, sizeof(counters));\n\n  /* create and initialize the pcb */\n  tcp_ticks = 0;\n  tcp_ticks = 0 - tcp_next_iss(NULL);\n  tcp_ticks = SEQNO1 - tcp_next_iss(NULL);\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n  pcb->mss = TCP_MSS;\n  /* disable initial congestion window (we don't send a SYN here...) */\n  pcb->cwnd = 2*TCP_MSS;\n\n  /* send 6 mss-sized segments */\n  for (i = 0; i < 6; i++) {\n    err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY);\n    EXPECT_RET(err == ERR_OK);\n    sent_total += TCP_MSS;\n  }\n  check_seqnos(pcb->unsent, 6, seqnos);\n  EXPECT(pcb->unacked == NULL);\n  err = tcp_output(pcb);\n  EXPECT(txcounters.num_tx_calls == 2);\n  EXPECT(txcounters.num_tx_bytes == 2 * (TCP_MSS + 40U));\n  memset(&txcounters, 0, sizeof(txcounters));\n\n  check_seqnos(pcb->unacked, 2, seqnos);\n  check_seqnos(pcb->unsent, 4, &seqnos[2]);\n\n  /* call the tcp timer some times */\n  for (i = 0; i < 10; i++) {\n    test_tcp_tmr();\n    EXPECT(txcounters.num_tx_calls == 0);\n  }\n  /* 11th call to tcp_tmr: RTO rexmit fires */\n  test_tcp_tmr();\n  EXPECT(txcounters.num_tx_calls == 1);\n  check_seqnos(pcb->unacked, 1, seqnos);\n  check_seqnos(pcb->unsent, 5, &seqnos[1]);\n\n  /* fake greater cwnd */\n  pcb->cwnd = pcb->snd_wnd;\n  /* send more data */\n  err = tcp_output(pcb);\n  EXPECT(err == ERR_OK);\n  /* check queues are sorted */\n  EXPECT(pcb->unsent == NULL);\n  check_seqnos(pcb->unacked, 6, seqnos);\n\n  /* make sure the pcb is freed */\n  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n}\nEND_TEST\n\n/** Provoke fast retransmission by duplicate ACKs and then recover by ACKing all sent data.\n * At the end, send more data. */\nstatic void test_tcp_tx_full_window_lost(u8_t zero_window_probe_from_unsent)\n{\n  struct netif netif;\n  struct test_tcp_txcounters txcounters;\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf *p;\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  err_t err;\n  u16_t sent_total, i;\n  u8_t expected = 0xFE;\n\n  for (i = 0; i < sizeof(tx_data); i++) {\n    u8_t d = (u8_t)i;\n    if (d == 0xFE) {\n      d = 0xF0;\n    }\n    tx_data[i] = d;\n  }\n  if (zero_window_probe_from_unsent) {\n    tx_data[TCP_WND] = expected;\n  } else {\n    tx_data[0] = expected;\n  }\n\n  /* initialize local vars */\n  IP_ADDR4(&local_ip,  192, 168,   1, 1);\n  IP_ADDR4(&remote_ip, 192, 168,   1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, &txcounters, &local_ip, &netmask);\n  memset(&counters, 0, sizeof(counters));\n  memset(&txcounters, 0, sizeof(txcounters));\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n  pcb->mss = TCP_MSS;\n  /* disable initial congestion window (we don't send a SYN here...) */\n  pcb->cwnd = pcb->snd_wnd;\n\n  /* send a full window (minus 1 packets) of TCP data in MSS-sized chunks */\n  sent_total = 0;\n  if ((TCP_WND - TCP_MSS) % TCP_MSS != 0) {\n    u16_t initial_data_len = (TCP_WND - TCP_MSS) % TCP_MSS;\n    err = tcp_write(pcb, &tx_data[sent_total], initial_data_len, TCP_WRITE_FLAG_COPY);\n    EXPECT_RET(err == ERR_OK);\n    err = tcp_output(pcb);\n    EXPECT_RET(err == ERR_OK);\n    EXPECT(txcounters.num_tx_calls == 1);\n    EXPECT(txcounters.num_tx_bytes == initial_data_len + 40U);\n    memset(&txcounters, 0, sizeof(txcounters));\n    sent_total += initial_data_len;\n  }\n  for (; sent_total < (TCP_WND - TCP_MSS); sent_total += TCP_MSS) {\n    err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY);\n    EXPECT_RET(err == ERR_OK);\n    err = tcp_output(pcb);\n    EXPECT_RET(err == ERR_OK);\n    EXPECT(txcounters.num_tx_calls == 1);\n    EXPECT(txcounters.num_tx_bytes == TCP_MSS + 40U);\n    memset(&txcounters, 0, sizeof(txcounters));\n  }\n  EXPECT(sent_total == (TCP_WND - TCP_MSS));\n\n  /* now ACK the packet before the first */\n  p = tcp_create_rx_segment(pcb, NULL, 0, 0, 0, TCP_ACK);\n  test_tcp_input(p, &netif);\n  /* ensure this didn't trigger a retransmission */\n  EXPECT(txcounters.num_tx_calls == 0);\n  EXPECT(txcounters.num_tx_bytes == 0);\n\n  EXPECT(pcb->persist_backoff == 0);\n  /* send the last packet, now a complete window has been sent */\n  err = tcp_write(pcb, &tx_data[sent_total], TCP_MSS, TCP_WRITE_FLAG_COPY);\n  sent_total += TCP_MSS;\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n  EXPECT(txcounters.num_tx_calls == 1);\n  EXPECT(txcounters.num_tx_bytes == TCP_MSS + 40U);\n  memset(&txcounters, 0, sizeof(txcounters));\n  EXPECT(pcb->persist_backoff == 0);\n\n  if (zero_window_probe_from_unsent) {\n    /* ACK all data but close the TX window */\n    p = tcp_create_rx_segment_wnd(pcb, NULL, 0, 0, TCP_WND, TCP_ACK, 0);\n    test_tcp_input(p, &netif);\n    /* ensure this didn't trigger any transmission */\n    EXPECT(txcounters.num_tx_calls == 0);\n    EXPECT(txcounters.num_tx_bytes == 0);\n    EXPECT(pcb->persist_backoff == 1);\n  }\n\n  /* send one byte more (out of window) -> persist timer starts */\n  err = tcp_write(pcb, &tx_data[sent_total], 1, TCP_WRITE_FLAG_COPY);\n  EXPECT_RET(err == ERR_OK);\n  err = tcp_output(pcb);\n  EXPECT_RET(err == ERR_OK);\n  EXPECT(txcounters.num_tx_calls == 0);\n  EXPECT(txcounters.num_tx_bytes == 0);\n  memset(&txcounters, 0, sizeof(txcounters));\n  if (!zero_window_probe_from_unsent) {\n    /* no persist timer unless a zero window announcement has been received */\n    EXPECT(pcb->persist_backoff == 0);\n  } else {\n    EXPECT(pcb->persist_backoff == 1);\n\n    /* call tcp_timer some more times to let persist timer count up */\n    for (i = 0; i < 4; i++) {\n      test_tcp_tmr();\n      EXPECT(txcounters.num_tx_calls == 0);\n      EXPECT(txcounters.num_tx_bytes == 0);\n    }\n\n    /* this should trigger the zero-window-probe */\n    txcounters.copy_tx_packets = 1;\n    test_tcp_tmr();\n    txcounters.copy_tx_packets = 0;\n    EXPECT(txcounters.num_tx_calls == 1);\n    EXPECT(txcounters.num_tx_bytes == 1 + 40U);\n    EXPECT(txcounters.tx_packets != NULL);\n    if (txcounters.tx_packets != NULL) {\n      u8_t sent;\n      u16_t ret;\n      ret = pbuf_copy_partial(txcounters.tx_packets, &sent, 1, 40U);\n      EXPECT(ret == 1);\n      EXPECT(sent == expected);\n    }\n    if (txcounters.tx_packets != NULL) {\n      pbuf_free(txcounters.tx_packets);\n      txcounters.tx_packets = NULL;\n    }\n  }\n\n  /* make sure the pcb is freed */\n  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT_RET(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n}\n\nSTART_TEST(test_tcp_tx_full_window_lost_from_unsent)\n{\n  LWIP_UNUSED_ARG(_i);\n  test_tcp_tx_full_window_lost(1);\n}\nEND_TEST\n\nSTART_TEST(test_tcp_tx_full_window_lost_from_unacked)\n{\n  LWIP_UNUSED_ARG(_i);\n  test_tcp_tx_full_window_lost(0);\n}\nEND_TEST\n\n/** Create the suite including all tests for this module */\nSuite *\ntcp_suite(void)\n{\n  testfunc tests[] = {\n    TESTFUNC(test_tcp_new_abort),\n    TESTFUNC(test_tcp_recv_inseq),\n    TESTFUNC(test_tcp_malformed_header),\n    TESTFUNC(test_tcp_fast_retx_recover),\n    TESTFUNC(test_tcp_fast_rexmit_wraparound),\n    TESTFUNC(test_tcp_rto_rexmit_wraparound),\n    TESTFUNC(test_tcp_tx_full_window_lost_from_unacked),\n    TESTFUNC(test_tcp_tx_full_window_lost_from_unsent)\n  };\n  return create_suite(\"TCP\", tests, sizeof(tests)/sizeof(testfunc), tcp_setup, tcp_teardown);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/tcp/test_tcp.h",
    "content": "#ifndef LWIP_HDR_TEST_TCP_H\n#define LWIP_HDR_TEST_TCP_H\n\n#include \"../lwip_check.h\"\n\nSuite *tcp_suite(void);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/tcp/test_tcp_oos.c",
    "content": "#include \"test_tcp_oos.h\"\n\n#include \"lwip/priv/tcp_priv.h\"\n#include \"lwip/stats.h\"\n#include \"tcp_helper.h\"\n\n#if !LWIP_STATS || !TCP_STATS || !MEMP_STATS\n#error \"This tests needs TCP- and MEMP-statistics enabled\"\n#endif\n#if !TCP_QUEUE_OOSEQ\n#error \"This tests needs TCP_QUEUE_OOSEQ enabled\"\n#endif\n\n/** CHECK_SEGMENTS_ON_OOSEQ:\n * 1: check count, seqno and len of segments on pcb->ooseq (strict)\n * 0: only check that bytes are received in correct order (less strict) */\n#define CHECK_SEGMENTS_ON_OOSEQ 1\n\n#if CHECK_SEGMENTS_ON_OOSEQ\n#define EXPECT_OOSEQ(x) EXPECT(x)\n#else\n#define EXPECT_OOSEQ(x)\n#endif\n\n/* helper functions */\n\n/** Get the numbers of segments on the ooseq list */\nstatic int tcp_oos_count(struct tcp_pcb* pcb)\n{\n  int num = 0;\n  struct tcp_seg* seg = pcb->ooseq;\n  while(seg != NULL) {\n    num++;\n    seg = seg->next;\n  }\n  return num;\n}\n\n#if TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_PBUFS < ((TCP_WND / TCP_MSS) + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))\n/** Get the numbers of pbufs on the ooseq list */\nstatic int tcp_oos_pbuf_count(struct tcp_pcb* pcb)\n{\n  int num = 0;\n  struct tcp_seg* seg = pcb->ooseq;\n  while(seg != NULL) {\n    num += pbuf_clen(seg->p);\n    seg = seg->next;\n  }\n  return num;\n}\n#endif\n\n/** Get the seqno of a segment (by index) on the ooseq list\n *\n * @param pcb the pcb to check for ooseq segments\n * @param seg_index index of the segment on the ooseq list\n * @return seqno of the segment\n */\nstatic u32_t\ntcp_oos_seg_seqno(struct tcp_pcb* pcb, int seg_index)\n{\n  int num = 0;\n  struct tcp_seg* seg = pcb->ooseq;\n\n  /* then check the actual segment */\n  while(seg != NULL) {\n    if(num == seg_index) {\n      return seg->tcphdr->seqno;\n    }\n    num++;\n    seg = seg->next;\n  }\n  fail();\n  return 0;\n}\n\n/** Get the tcplen (datalen + SYN/FIN) of a segment (by index) on the ooseq list\n *\n * @param pcb the pcb to check for ooseq segments\n * @param seg_index index of the segment on the ooseq list\n * @return tcplen of the segment\n */\nstatic int\ntcp_oos_seg_tcplen(struct tcp_pcb* pcb, int seg_index)\n{\n  int num = 0;\n  struct tcp_seg* seg = pcb->ooseq;\n\n  /* then check the actual segment */\n  while(seg != NULL) {\n    if(num == seg_index) {\n      return TCP_TCPLEN(seg);\n    }\n    num++;\n    seg = seg->next;\n  }\n  fail();\n  return -1;\n}\n\n/** Get the tcplen (datalen + SYN/FIN) of all segments on the ooseq list\n *\n * @param pcb the pcb to check for ooseq segments\n * @return tcplen of all segment\n */\nstatic int\ntcp_oos_tcplen(struct tcp_pcb* pcb)\n{\n  int len = 0;\n  struct tcp_seg* seg = pcb->ooseq;\n\n  /* then check the actual segment */\n  while(seg != NULL) {\n    len += TCP_TCPLEN(seg);\n    seg = seg->next;\n  }\n  return len;\n}\n\n/* Setup/teardown functions */\n\nstatic void\ntcp_oos_setup(void)\n{\n  tcp_remove_all();\n}\n\nstatic void\ntcp_oos_teardown(void)\n{\n  tcp_remove_all();\n  netif_list = NULL;\n  netif_default = NULL;\n}\n\n\n\n/* Test functions */\n\n/** create multiple segments and pass them to tcp_input in a wrong\n * order to see if ooseq-caching works correctly\n * FIN is received in out-of-sequence segments only */\nSTART_TEST(test_tcp_recv_ooseq_FIN_OOSEQ)\n{\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf *p_8_9, *p_4_8, *p_4_10, *p_2_14, *p_fin, *pinseq;\n  char data[] = {\n     1,  2,  3,  4,\n     5,  6,  7,  8,\n     9, 10, 11, 12,\n    13, 14, 15, 16};\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t data_len;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  struct netif netif;\n  LWIP_UNUSED_ARG(_i);\n\n  /* initialize local vars */\n  memset(&netif, 0, sizeof(netif));\n  IP_ADDR4(&local_ip, 192, 168, 1, 1);\n  IP_ADDR4(&remote_ip, 192, 168, 1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);\n  data_len = sizeof(data);\n  /* initialize counter struct */\n  memset(&counters, 0, sizeof(counters));\n  counters.expected_data_len = data_len;\n  counters.expected_data = data;\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n\n  /* create segments */\n  /* pinseq is sent as last segment! */\n  pinseq = tcp_create_rx_segment(pcb, &data[0],  4, 0, 0, TCP_ACK);\n  /* p1: 8 bytes before FIN */\n  /*     seqno: 8..16 */\n  p_8_9  = tcp_create_rx_segment(pcb, &data[8],  8, 8, 0, TCP_ACK|TCP_FIN);\n  /* p2: 4 bytes before p1, including the first 4 bytes of p1 (partly duplicate) */\n  /*     seqno: 4..11 */\n  p_4_8  = tcp_create_rx_segment(pcb, &data[4],  8, 4, 0, TCP_ACK);\n  /* p3: same as p2 but 2 bytes longer */\n  /*     seqno: 4..13 */\n  p_4_10 = tcp_create_rx_segment(pcb, &data[4], 10, 4, 0, TCP_ACK);\n  /* p4: 14 bytes before FIN, includes data from p1 and p2, plus partly from pinseq */\n  /*     seqno: 2..15 */\n  p_2_14 = tcp_create_rx_segment(pcb, &data[2], 14, 2, 0, TCP_ACK);\n  /* FIN, seqno 16 */\n  p_fin  = tcp_create_rx_segment(pcb,     NULL,  0,16, 0, TCP_ACK|TCP_FIN);\n  EXPECT(pinseq != NULL);\n  EXPECT(p_8_9 != NULL);\n  EXPECT(p_4_8 != NULL);\n  EXPECT(p_4_10 != NULL);\n  EXPECT(p_2_14 != NULL);\n  EXPECT(p_fin != NULL);\n  if ((pinseq != NULL) && (p_8_9 != NULL) && (p_4_8 != NULL) && (p_4_10 != NULL) && (p_2_14 != NULL) && (p_fin != NULL)) {\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_8_9, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 8);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 9); /* includes FIN */\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_4_8, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 2);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 4);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 4);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 8);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 9); /* includes FIN */\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_4_10, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* ooseq queue: unchanged */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 2);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 4);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 4);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 8);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 9); /* includes FIN */\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_2_14, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 2);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 15); /* includes FIN */\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_fin, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* ooseq queue: unchanged */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 2);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 15); /* includes FIN */\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(pinseq, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 1);\n    EXPECT(counters.recv_calls == 1);\n    EXPECT(counters.recved_bytes == data_len);\n    EXPECT(counters.err_calls == 0);\n    EXPECT(pcb->ooseq == NULL);\n  }\n\n  /* make sure the pcb is freed */\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n}\nEND_TEST\n\n\n/** create multiple segments and pass them to tcp_input in a wrong\n * order to see if ooseq-caching works correctly\n * FIN is received IN-SEQUENCE at the end */\nSTART_TEST(test_tcp_recv_ooseq_FIN_INSEQ)\n{\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf *p_1_2, *p_4_8, *p_3_11, *p_2_12, *p_15_1, *p_15_1a, *pinseq, *pinseqFIN;\n  char data[] = {\n     1,  2,  3,  4,\n     5,  6,  7,  8,\n     9, 10, 11, 12,\n    13, 14, 15, 16};\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t data_len;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  struct netif netif;\n  LWIP_UNUSED_ARG(_i);\n\n  /* initialize local vars */\n  memset(&netif, 0, sizeof(netif));\n  IP_ADDR4(&local_ip, 192, 168, 1, 1);\n  IP_ADDR4(&remote_ip, 192, 168, 1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);\n  data_len = sizeof(data);\n  /* initialize counter struct */\n  memset(&counters, 0, sizeof(counters));\n  counters.expected_data_len = data_len;\n  counters.expected_data = data;\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n\n  /* create segments */\n  /* p1: 7 bytes - 2 before FIN */\n  /*     seqno: 1..2 */\n  p_1_2  = tcp_create_rx_segment(pcb, &data[1],  2, 1, 0, TCP_ACK);\n  /* p2: 4 bytes before p1, including the first 4 bytes of p1 (partly duplicate) */\n  /*     seqno: 4..11 */\n  p_4_8  = tcp_create_rx_segment(pcb, &data[4],  8, 4, 0, TCP_ACK);\n  /* p3: same as p2 but 2 bytes longer and one byte more at the front */\n  /*     seqno: 3..13 */\n  p_3_11 = tcp_create_rx_segment(pcb, &data[3], 11, 3, 0, TCP_ACK);\n  /* p4: 13 bytes - 2 before FIN - should be ignored as contained in p1 and p3 */\n  /*     seqno: 2..13 */\n  p_2_12 = tcp_create_rx_segment(pcb, &data[2], 12, 2, 0, TCP_ACK);\n  /* pinseq is the first segment that is held back to create ooseq! */\n  /*     seqno: 0..3 */\n  pinseq = tcp_create_rx_segment(pcb, &data[0],  4, 0, 0, TCP_ACK);\n  /* p5: last byte before FIN */\n  /*     seqno: 15 */\n  p_15_1 = tcp_create_rx_segment(pcb, &data[15], 1, 15, 0, TCP_ACK);\n  /* p6: same as p5, should be ignored */\n  p_15_1a= tcp_create_rx_segment(pcb, &data[15], 1, 15, 0, TCP_ACK);\n  /* pinseqFIN: last 2 bytes plus FIN */\n  /*     only segment containing seqno 14 and FIN */\n  pinseqFIN = tcp_create_rx_segment(pcb,  &data[14], 2, 14, 0, TCP_ACK|TCP_FIN);\n  EXPECT(pinseq != NULL);\n  EXPECT(p_1_2 != NULL);\n  EXPECT(p_4_8 != NULL);\n  EXPECT(p_3_11 != NULL);\n  EXPECT(p_2_12 != NULL);\n  EXPECT(p_15_1 != NULL);\n  EXPECT(p_15_1a != NULL);\n  EXPECT(pinseqFIN != NULL);\n  if ((pinseq != NULL) && (p_1_2 != NULL) && (p_4_8 != NULL) && (p_3_11 != NULL) && (p_2_12 != NULL)\n    && (p_15_1 != NULL) && (p_15_1a != NULL) && (pinseqFIN != NULL)) {\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_1_2, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2);\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_4_8, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 2);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 4);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 8);\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_3_11, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 2);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 2);\n    /* p_3_11 has removed p_4_8 from ooseq */\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 3);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 11);\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_2_12, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 2);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 1) == 2);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 1) == 12);\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(pinseq, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 1);\n    EXPECT(counters.recved_bytes == 14);\n    EXPECT(counters.err_calls == 0);\n    EXPECT(pcb->ooseq == NULL);\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_15_1, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 1);\n    EXPECT(counters.recved_bytes == 14);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 15);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1);\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(p_15_1a, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 1);\n    EXPECT(counters.recved_bytes == 14);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue: unchanged */\n    EXPECT_OOSEQ(tcp_oos_count(pcb) == 1);\n    EXPECT_OOSEQ(tcp_oos_seg_seqno(pcb, 0) == 15);\n    EXPECT_OOSEQ(tcp_oos_seg_tcplen(pcb, 0) == 1);\n\n    /* pass the segment to tcp_input */\n    test_tcp_input(pinseqFIN, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 1);\n    EXPECT(counters.recv_calls == 2);\n    EXPECT(counters.recved_bytes == data_len);\n    EXPECT(counters.err_calls == 0);\n    EXPECT(pcb->ooseq == NULL);\n  }\n\n  /* make sure the pcb is freed */\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n}\nEND_TEST\n\nstatic char data_full_wnd[TCP_WND + TCP_MSS];\n\n/** create multiple segments and pass them to tcp_input with the first segment missing\n * to simulate overruning the rxwin with ooseq queueing enabled */\nSTART_TEST(test_tcp_recv_ooseq_overrun_rxwin)\n{\n#if !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS\n  int i, k;\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf *pinseq, *p_ovr;\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  struct netif netif;\n  int datalen = 0;\n  int datalen2;\n\n  for(i = 0; i < (int)sizeof(data_full_wnd); i++) {\n    data_full_wnd[i] = (char)i;\n  }\n\n  /* initialize local vars */\n  memset(&netif, 0, sizeof(netif));\n  IP_ADDR4(&local_ip, 192, 168, 1, 1);\n  IP_ADDR4(&remote_ip, 192, 168, 1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);\n  /* initialize counter struct */\n  memset(&counters, 0, sizeof(counters));\n  counters.expected_data_len = TCP_WND;\n  counters.expected_data = data_full_wnd;\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n  pcb->rcv_nxt = 0x8000;\n\n  /* create segments */\n  /* pinseq is sent as last segment! */\n  pinseq = tcp_create_rx_segment(pcb, &data_full_wnd[0],  TCP_MSS, 0, 0, TCP_ACK);\n\n  for(i = TCP_MSS, k = 0; i < TCP_WND; i += TCP_MSS, k++) {\n    int count, expected_datalen;\n    struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)],\n                                           TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK);\n    EXPECT_RET(p != NULL);\n    /* pass the segment to tcp_input */\n    test_tcp_input(p, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    count = tcp_oos_count(pcb);\n    EXPECT_OOSEQ(count == k+1);\n    datalen = tcp_oos_tcplen(pcb);\n    if (i + TCP_MSS < TCP_WND) {\n      expected_datalen = (k+1)*TCP_MSS;\n    } else {\n      expected_datalen = TCP_WND - TCP_MSS;\n    }\n    if (datalen != expected_datalen) {\n      EXPECT_OOSEQ(datalen == expected_datalen);\n    }\n  }\n\n  /* pass in one more segment, cleary overrunning the rxwin */\n  p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK);\n  EXPECT_RET(p_ovr != NULL);\n  /* pass the segment to tcp_input */\n  test_tcp_input(p_ovr, &netif);\n  /* check if counters are as expected */\n  EXPECT(counters.close_calls == 0);\n  EXPECT(counters.recv_calls == 0);\n  EXPECT(counters.recved_bytes == 0);\n  EXPECT(counters.err_calls == 0);\n  /* check ooseq queue */\n  EXPECT_OOSEQ(tcp_oos_count(pcb) == k);\n  datalen2 = tcp_oos_tcplen(pcb);\n  EXPECT_OOSEQ(datalen == datalen2);\n\n  /* now pass inseq */\n  test_tcp_input(pinseq, &netif);\n  EXPECT(pcb->ooseq == NULL);\n\n  /* make sure the pcb is freed */\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n#endif /* !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS */\n  LWIP_UNUSED_ARG(_i);\n}\nEND_TEST\n\n/** similar to above test, except seqno starts near the max rxwin */\nSTART_TEST(test_tcp_recv_ooseq_overrun_rxwin_edge)\n{\n#if !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS\n  int i, k;\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf *pinseq, *p_ovr;\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  struct netif netif;\n  int datalen = 0;\n  int datalen2;\n\n  for(i = 0; i < (int)sizeof(data_full_wnd); i++) {\n    data_full_wnd[i] = (char)i;\n  }\n\n  /* initialize local vars */\n  memset(&netif, 0, sizeof(netif));\n  IP_ADDR4(&local_ip, 192, 168, 1, 1);\n  IP_ADDR4(&remote_ip, 192, 168, 1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);\n  /* initialize counter struct */\n  memset(&counters, 0, sizeof(counters));\n  counters.expected_data_len = TCP_WND;\n  counters.expected_data = data_full_wnd;\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n  pcb->rcv_nxt = 0xffffffff - (TCP_WND / 2);\n\n  /* create segments */\n  /* pinseq is sent as last segment! */\n  pinseq = tcp_create_rx_segment(pcb, &data_full_wnd[0],  TCP_MSS, 0, 0, TCP_ACK);\n\n  for(i = TCP_MSS, k = 0; i < TCP_WND; i += TCP_MSS, k++) {\n    int count, expected_datalen;\n    struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)],\n                                           TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK);\n    EXPECT_RET(p != NULL);\n    /* pass the segment to tcp_input */\n    test_tcp_input(p, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    count = tcp_oos_count(pcb);\n    EXPECT_OOSEQ(count == k+1);\n    datalen = tcp_oos_tcplen(pcb);\n    if (i + TCP_MSS < TCP_WND) {\n      expected_datalen = (k+1)*TCP_MSS;\n    } else {\n      expected_datalen = TCP_WND - TCP_MSS;\n    }\n    if (datalen != expected_datalen) {\n      EXPECT_OOSEQ(datalen == expected_datalen);\n    }\n  }\n\n  /* pass in one more segment, cleary overrunning the rxwin */\n  p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS*(k+1)], TCP_MSS, TCP_MSS*(k+1), 0, TCP_ACK);\n  EXPECT_RET(p_ovr != NULL);\n  /* pass the segment to tcp_input */\n  test_tcp_input(p_ovr, &netif);\n  /* check if counters are as expected */\n  EXPECT(counters.close_calls == 0);\n  EXPECT(counters.recv_calls == 0);\n  EXPECT(counters.recved_bytes == 0);\n  EXPECT(counters.err_calls == 0);\n  /* check ooseq queue */\n  EXPECT_OOSEQ(tcp_oos_count(pcb) == k);\n  datalen2 = tcp_oos_tcplen(pcb);\n  EXPECT_OOSEQ(datalen == datalen2);\n\n  /* now pass inseq */\n  test_tcp_input(pinseq, &netif);\n  EXPECT(pcb->ooseq == NULL);\n\n  /* make sure the pcb is freed */\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n#endif /* !TCP_OOSEQ_MAX_BYTES && !TCP_OOSEQ_MAX_PBUFS */\n  LWIP_UNUSED_ARG(_i);\n}\nEND_TEST\n\nSTART_TEST(test_tcp_recv_ooseq_max_bytes)\n{\n#if TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))\n  int i, k;\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf *p_ovr;\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  struct netif netif;\n  int datalen = 0;\n  int datalen2;\n\n  for(i = 0; i < sizeof(data_full_wnd); i++) {\n    data_full_wnd[i] = (char)i;\n  }\n\n  /* initialize local vars */\n  memset(&netif, 0, sizeof(netif));\n  IP_ADDR4(&local_ip, 192, 168, 1, 1);\n  IP_ADDR4(&remote_ip, 192, 168, 1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);\n  /* initialize counter struct */\n  memset(&counters, 0, sizeof(counters));\n  counters.expected_data_len = TCP_WND;\n  counters.expected_data = data_full_wnd;\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n  pcb->rcv_nxt = 0x8000;\n\n  /* don't 'recv' the first segment (1 byte) so that all other segments will be ooseq */\n\n  /* create segments and 'recv' them */\n  for(k = 1, i = 1; k < TCP_OOSEQ_MAX_BYTES; k += TCP_MSS, i++) {\n    int count;\n    struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[k],\n                                           TCP_MSS, k, 0, TCP_ACK);\n    EXPECT_RET(p != NULL);\n    EXPECT_RET(p->next == NULL);\n    /* pass the segment to tcp_input */\n    test_tcp_input(p, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    count = tcp_oos_pbuf_count(pcb);\n    EXPECT_OOSEQ(count == i);\n    datalen = tcp_oos_tcplen(pcb);\n    EXPECT_OOSEQ(datalen == (i * TCP_MSS));\n  }\n\n  /* pass in one more segment, overrunning the limit */\n  p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[k+1], 1, k+1, 0, TCP_ACK);\n  EXPECT_RET(p_ovr != NULL);\n  /* pass the segment to tcp_input */\n  test_tcp_input(p_ovr, &netif);\n  /* check if counters are as expected */\n  EXPECT(counters.close_calls == 0);\n  EXPECT(counters.recv_calls == 0);\n  EXPECT(counters.recved_bytes == 0);\n  EXPECT(counters.err_calls == 0);\n  /* check ooseq queue (ensure the new segment was not accepted) */\n  EXPECT_OOSEQ(tcp_oos_count(pcb) == (i-1));\n  datalen2 = tcp_oos_tcplen(pcb);\n  EXPECT_OOSEQ(datalen2 == ((i-1) * TCP_MSS));\n\n  /* make sure the pcb is freed */\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n#endif /* TCP_OOSEQ_MAX_BYTES && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) */\n  LWIP_UNUSED_ARG(_i);\n}\nEND_TEST\n\nSTART_TEST(test_tcp_recv_ooseq_max_pbufs)\n{\n#if TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_PBUFS < ((TCP_WND / TCP_MSS) + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN))\n  int i;\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf *p_ovr;\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  struct netif netif;\n  int datalen = 0;\n  int datalen2;\n\n  for(i = 0; i < sizeof(data_full_wnd); i++) {\n    data_full_wnd[i] = (char)i;\n  }\n\n  /* initialize local vars */\n  memset(&netif, 0, sizeof(netif));\n  IP_ADDR4(&local_ip, 192, 168, 1, 1);\n  IP_ADDR4(&remote_ip, 192, 168, 1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);\n  /* initialize counter struct */\n  memset(&counters, 0, sizeof(counters));\n  counters.expected_data_len = TCP_WND;\n  counters.expected_data = data_full_wnd;\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n  pcb->rcv_nxt = 0x8000;\n\n  /* don't 'recv' the first segment (1 byte) so that all other segments will be ooseq */\n\n  /* create segments and 'recv' them */\n  for(i = 1; i <= TCP_OOSEQ_MAX_PBUFS; i++) {\n    int count;\n    struct pbuf *p = tcp_create_rx_segment(pcb, &data_full_wnd[i],\n                                           1, i, 0, TCP_ACK);\n    EXPECT_RET(p != NULL);\n    EXPECT_RET(p->next == NULL);\n    /* pass the segment to tcp_input */\n    test_tcp_input(p, &netif);\n    /* check if counters are as expected */\n    EXPECT(counters.close_calls == 0);\n    EXPECT(counters.recv_calls == 0);\n    EXPECT(counters.recved_bytes == 0);\n    EXPECT(counters.err_calls == 0);\n    /* check ooseq queue */\n    count = tcp_oos_pbuf_count(pcb);\n    EXPECT_OOSEQ(count == i);\n    datalen = tcp_oos_tcplen(pcb);\n    EXPECT_OOSEQ(datalen == i);\n  }\n\n  /* pass in one more segment, overrunning the limit */\n  p_ovr = tcp_create_rx_segment(pcb, &data_full_wnd[i+1], 1, i+1, 0, TCP_ACK);\n  EXPECT_RET(p_ovr != NULL);\n  /* pass the segment to tcp_input */\n  test_tcp_input(p_ovr, &netif);\n  /* check if counters are as expected */\n  EXPECT(counters.close_calls == 0);\n  EXPECT(counters.recv_calls == 0);\n  EXPECT(counters.recved_bytes == 0);\n  EXPECT(counters.err_calls == 0);\n  /* check ooseq queue (ensure the new segment was not accepted) */\n  EXPECT_OOSEQ(tcp_oos_count(pcb) == (i-1));\n  datalen2 = tcp_oos_tcplen(pcb);\n  EXPECT_OOSEQ(datalen2 == (i-1));\n\n  /* make sure the pcb is freed */\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n#endif /* TCP_OOSEQ_MAX_PBUFS && (TCP_OOSEQ_MAX_BYTES < (TCP_WND + 1)) && (PBUF_POOL_BUFSIZE >= (TCP_MSS + PBUF_LINK_ENCAPSULATION_HLEN + PBUF_LINK_HLEN + PBUF_IP_HLEN + PBUF_TRANSPORT_HLEN)) */\n  LWIP_UNUSED_ARG(_i);\n}\nEND_TEST\n\nstatic void\ncheck_rx_counters(struct tcp_pcb *pcb, struct test_tcp_counters *counters, u32_t exp_close_calls, u32_t exp_rx_calls,\n                  u32_t exp_rx_bytes, u32_t exp_err_calls, int exp_oos_count, int exp_oos_len)\n{\n  int oos_len;\n  EXPECT(counters->close_calls == exp_close_calls);\n  EXPECT(counters->recv_calls == exp_rx_calls);\n  EXPECT(counters->recved_bytes == exp_rx_bytes);\n  EXPECT(counters->err_calls == exp_err_calls);\n  /* check that pbuf is queued in ooseq */\n  EXPECT_OOSEQ(tcp_oos_count(pcb) == exp_oos_count);\n  oos_len = tcp_oos_tcplen(pcb);\n  EXPECT_OOSEQ(exp_oos_len == oos_len);\n}\n\n/* this test uses 4 packets:\n * - data (len=TCP_MSS)\n * - FIN\n * - data after FIN (len=1) (invalid)\n * - 2nd FIN (invalid)\n *\n * the parameter 'delay_packet' is a bitmask that choses which on these packets is ooseq\n */\nstatic void test_tcp_recv_ooseq_double_FINs(int delay_packet)\n{\n  int i, k;\n  struct test_tcp_counters counters;\n  struct tcp_pcb* pcb;\n  struct pbuf *p_normal_fin, *p_data_after_fin, *p, *p_2nd_fin_ooseq;\n  ip_addr_t remote_ip, local_ip, netmask;\n  u16_t remote_port = 0x100, local_port = 0x101;\n  struct netif netif;\n  u32_t exp_rx_calls = 0, exp_rx_bytes = 0, exp_close_calls = 0, exp_oos_pbufs = 0, exp_oos_tcplen = 0;\n  int first_dropped = 0xff;\n\n  for(i = 0; i < (int)sizeof(data_full_wnd); i++) {\n    data_full_wnd[i] = (char)i;\n  }\n\n  /* initialize local vars */\n  memset(&netif, 0, sizeof(netif));\n  IP_ADDR4(&local_ip, 192, 168, 1, 1);\n  IP_ADDR4(&remote_ip, 192, 168, 1, 2);\n  IP_ADDR4(&netmask,   255, 255, 255, 0);\n  test_tcp_init_netif(&netif, NULL, &local_ip, &netmask);\n  /* initialize counter struct */\n  memset(&counters, 0, sizeof(counters));\n  counters.expected_data_len = TCP_WND;\n  counters.expected_data = data_full_wnd;\n\n  /* create and initialize the pcb */\n  pcb = test_tcp_new_counters_pcb(&counters);\n  EXPECT_RET(pcb != NULL);\n  tcp_set_state(pcb, ESTABLISHED, &local_ip, &remote_ip, local_port, remote_port);\n  pcb->rcv_nxt = 0x8000;\n\n  /* create segments */\n  p = tcp_create_rx_segment(pcb, &data_full_wnd[0], TCP_MSS, 0, 0, TCP_ACK);\n  p_normal_fin = tcp_create_rx_segment(pcb, NULL, 0, TCP_MSS, 0, TCP_ACK|TCP_FIN);\n  k = 1;\n  p_data_after_fin = tcp_create_rx_segment(pcb, &data_full_wnd[TCP_MSS+1], k, TCP_MSS+1, 0, TCP_ACK);\n  p_2nd_fin_ooseq = tcp_create_rx_segment(pcb, NULL, 0, TCP_MSS+1+k, 0, TCP_ACK|TCP_FIN);\n\n  if(delay_packet & 1) {\n    /* drop normal data */\n    first_dropped = 1;\n  } else {\n    /* send normal data */\n    test_tcp_input(p, &netif);\n    exp_rx_calls++;\n    exp_rx_bytes += TCP_MSS;\n  }\n  /* check if counters are as expected */\n  check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);\n\n  if(delay_packet & 2) {\n    /* drop FIN */\n    if(first_dropped > 2) {\n      first_dropped = 2;\n    }\n  } else {\n    /* send FIN */\n    test_tcp_input(p_normal_fin, &netif);\n    if (first_dropped < 2) {\n      /* already dropped packets, this one is ooseq */\n      exp_oos_pbufs++;\n      exp_oos_tcplen++;\n    } else {\n      /* inseq */\n      exp_close_calls++;\n    }\n  }\n  /* check if counters are as expected */\n  check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);\n\n  if(delay_packet & 4) {\n    /* drop data-after-FIN */\n    if(first_dropped > 3) {\n      first_dropped = 3;\n    }\n  } else {\n    /* send data-after-FIN */\n    test_tcp_input(p_data_after_fin, &netif);\n    if (first_dropped < 3) {\n      /* already dropped packets, this one is ooseq */\n      if (delay_packet & 2) {\n        /* correct FIN was ooseq */\n        exp_oos_pbufs++;\n        exp_oos_tcplen += k;\n      }\n    } else {\n      /* inseq: no change */\n    }\n  }\n  /* check if counters are as expected */\n  check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);\n\n  if(delay_packet & 8) {\n    /* drop 2nd-FIN */\n    if(first_dropped > 4) {\n      first_dropped = 4;\n    }\n  } else {\n    /* send 2nd-FIN */\n    test_tcp_input(p_2nd_fin_ooseq, &netif);\n    if (first_dropped < 3) {\n      /* already dropped packets, this one is ooseq */\n      if (delay_packet & 2) {\n        /* correct FIN was ooseq */\n        exp_oos_pbufs++;\n        exp_oos_tcplen++;\n      }\n    } else {\n      /* inseq: no change */\n    }\n  }\n  /* check if counters are as expected */\n  check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);\n\n  if(delay_packet & 1) {\n    /* dropped normal data before */\n    test_tcp_input(p, &netif);\n    exp_rx_calls++;\n    exp_rx_bytes += TCP_MSS;\n    if((delay_packet & 2) == 0) {\n      /* normal FIN was NOT delayed */\n      exp_close_calls++;\n      exp_oos_pbufs = exp_oos_tcplen = 0;\n    }\n  }\n  /* check if counters are as expected */\n  check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);\n\n  if(delay_packet & 2) {\n    /* dropped normal FIN before */\n    test_tcp_input(p_normal_fin, &netif);\n    exp_close_calls++;\n    exp_oos_pbufs = exp_oos_tcplen = 0;\n  }\n  /* check if counters are as expected */\n  check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);\n\n  if(delay_packet & 4) {\n    /* dropped data-after-FIN before */\n    test_tcp_input(p_data_after_fin, &netif);\n  }\n  /* check if counters are as expected */\n  check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);\n\n  if(delay_packet & 8) {\n    /* dropped 2nd-FIN before */\n    test_tcp_input(p_2nd_fin_ooseq, &netif);\n  }\n  /* check if counters are as expected */\n  check_rx_counters(pcb, &counters, exp_close_calls, exp_rx_calls, exp_rx_bytes, 0, exp_oos_pbufs, exp_oos_tcplen);\n\n  /* check that ooseq data has been dumped */\n  EXPECT(pcb->ooseq == NULL);\n\n  /* make sure the pcb is freed */\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 1);\n  tcp_abort(pcb);\n  EXPECT(MEMP_STATS_GET(used, MEMP_TCP_PCB) == 0);\n}\n\n/** create multiple segments and pass them to tcp_input with the first segment missing\n * to simulate overruning the rxwin with ooseq queueing enabled */\n#define FIN_TEST(name, num) \\\n  START_TEST(name) \\\n  { \\\n    LWIP_UNUSED_ARG(_i); \\\n    test_tcp_recv_ooseq_double_FINs(num); \\\n  } \\\n  END_TEST\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_0, 0)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_1, 1)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_2, 2)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_3, 3)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_4, 4)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_5, 5)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_6, 6)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_7, 7)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_8, 8)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_9, 9)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_10, 10)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_11, 11)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_12, 12)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_13, 13)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_14, 14)\nFIN_TEST(test_tcp_recv_ooseq_double_FIN_15, 15)\n\n\n/** Create the suite including all tests for this module */\nSuite *\ntcp_oos_suite(void)\n{\n  testfunc tests[] = {\n    TESTFUNC(test_tcp_recv_ooseq_FIN_OOSEQ),\n    TESTFUNC(test_tcp_recv_ooseq_FIN_INSEQ),\n    TESTFUNC(test_tcp_recv_ooseq_overrun_rxwin),\n    TESTFUNC(test_tcp_recv_ooseq_overrun_rxwin_edge),\n    TESTFUNC(test_tcp_recv_ooseq_max_bytes),\n    TESTFUNC(test_tcp_recv_ooseq_max_pbufs),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_0),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_1),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_2),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_3),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_4),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_5),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_6),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_7),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_8),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_9),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_10),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_11),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_12),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_13),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_14),\n    TESTFUNC(test_tcp_recv_ooseq_double_FIN_15)\n  };\n  return create_suite(\"TCP_OOS\", tests, sizeof(tests)/sizeof(testfunc), tcp_oos_setup, tcp_oos_teardown);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/tcp/test_tcp_oos.h",
    "content": "#ifndef LWIP_HDR_TEST_TCP_OOS_H\n#define LWIP_HDR_TEST_TCP_OOS_H\n\n#include \"../lwip_check.h\"\n\nSuite *tcp_oos_suite(void);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/udp/test_udp.c",
    "content": "#include \"test_udp.h\"\n\n#include \"lwip/udp.h\"\n#include \"lwip/stats.h\"\n\n#if !LWIP_STATS || !UDP_STATS || !MEMP_STATS\n#error \"This tests needs UDP- and MEMP-statistics enabled\"\n#endif\n\n/* Helper functions */\nstatic void\nudp_remove_all(void)\n{\n  struct udp_pcb *pcb = udp_pcbs;\n  struct udp_pcb *pcb2;\n\n  while(pcb != NULL) {\n    pcb2 = pcb;\n    pcb = pcb->next;\n    udp_remove(pcb2);\n  }\n  fail_unless(MEMP_STATS_GET(used, MEMP_UDP_PCB) == 0);\n}\n\n/* Setups/teardown functions */\n\nstatic void\nudp_setup(void)\n{\n  udp_remove_all();\n}\n\nstatic void\nudp_teardown(void)\n{\n  udp_remove_all();\n}\n\n\n/* Test functions */\n\nSTART_TEST(test_udp_new_remove)\n{\n  struct udp_pcb* pcb;\n  LWIP_UNUSED_ARG(_i);\n\n  fail_unless(MEMP_STATS_GET(used, MEMP_UDP_PCB) == 0);\n\n  pcb = udp_new();\n  fail_unless(pcb != NULL);\n  if (pcb != NULL) {\n    fail_unless(MEMP_STATS_GET(used, MEMP_UDP_PCB) == 1);\n    udp_remove(pcb);\n    fail_unless(MEMP_STATS_GET(used, MEMP_UDP_PCB) == 0);\n  }\n}\nEND_TEST\n\n\n/** Create the suite including all tests for this module */\nSuite *\nudp_suite(void)\n{\n  testfunc tests[] = {\n    TESTFUNC(test_udp_new_remove),\n  };\n  return create_suite(\"UDP\", tests, sizeof(tests)/sizeof(testfunc), udp_setup, udp_teardown);\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip-2.0.3/test/unit/udp/test_udp.h",
    "content": "#ifndef LWIP_HDR_TEST_UDP_H\n#define LWIP_HDR_TEST_UDP_H\n\n#include \"../lwip_check.h\"\n\nSuite* udp_suite(void);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/OS/ethernetif.c",
    "content": "/**\n* @file\n* Ethernet Interface Skeleton\n*\n*/\n\n/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *--------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*\n* Copyright (c) 2001-2004 Swedish Institute of Computer Science.\n* All rights reserved.\n*\n* Redistribution and use in source and binary forms, with or without modification,\n* are permitted provided that the following conditions are met:\n*\n* 1. Redistributions of source code must retain the above copyright notice,\n*    this list of conditions and the following disclaimer.\n* 2. Redistributions in binary form must reproduce the above copyright notice,\n*    this list of conditions and the following disclaimer in the documentation\n*    and/or other materials provided with the distribution.\n* 3. The name of the author may not be used to endorse or promote products\n*    derived from this software without specific prior written permission.\n*\n* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n* SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n* OF SUCH DAMAGE.\n*\n* This file is part of the lwIP TCP/IP stack.\n*\n* Author: Adam Dunkels <adam@sics.se>\n*\n*/\n\n/*\n* This file is a skeleton for developing Ethernet network interface\n* drivers for lwIP. Add code to the low_level functions and do a\n* search-and-replace for the word \"ethernetif\" to replace it with\n* something that better describes your network interface.\n*/\n\n\n#include \"lwip/def.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/timeouts.h\"\n#if LWIP_IPV4 && LWIP_IPV6\n#elif LWIP_IPV6\n#include \"lwip/ethip6.h\"\n#else\n#include \"netif/etharp.h\"\n#endif\n#include \"ethernetif.h\"\n#include <string.h>\n#include \"lwip/tcpip.h\"\n\n\n/* Define those to better describe your network interface. */\n#define IFNAME0 's'\n#define IFNAME1 't'\n\n\nstatic struct netif *s_pxNetIf = NULL;\nstatic struct ethernet_api s_eth_api;\n\n//void ethernetif_input( void * pvParameters );\n#if LWIP_IPV4 && LWIP_IPV6\n#elif LWIP_IPV6\n#else\nstatic void arp_timer(void *arg);\n#endif\nint8_t ethernetif_api_register(struct ethernet_api *api)\n{\n    if(api == NULL)\n    {\n        return ERR_ARG;\n    }\n    memcpy(&s_eth_api, api, sizeof(struct ethernet_api));\n\n    return ERR_OK;\n}\n\n/**\n* In this function, the hardware should be initialized.\n* Called from ethernetif_init().\n*\n* @param netif the already initialized lwip network interface structure\n*        for this ethernetif\n*/\nstatic void low_level_init(struct netif *netif)\n{\n    if(s_eth_api.init)\n    {\n        (void)s_eth_api.init(netif);\n        s_pxNetIf = netif;\n    }\n}\n\n/**\n* This function should do the actual transmission of the packet. The packet is\n* contained in the pbuf that is passed to the function. This pbuf\n* might be chained.\n*\n* @param netif the lwip network interface structure for this ethernetif\n* @param p the MAC packet to send (e.g. IP packet including MAC addresses and type)\n* @return ERR_OK if the packet could be sent\n*         an err_t value if the packet couldn't be sent\n*\n* @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to\n*       strange results. You might consider waiting for space in the DMA queue\n*       to become availale since the stack doesn't retry to send a packet\n*       dropped because of memory failure (except for the TCP timers).\n*/\nstatic err_t low_level_output(struct netif *netif, struct pbuf *p)\n{\n    err_t err = ERR_IF;\n\n    if(s_eth_api.output)\n    {\n        err = s_eth_api.output(netif, p);\n    }\n\n    return err;\n}\n\n/**\n* Should allocate a pbuf and transfer the bytes of the incoming\n* packet from the interface into the pbuf.\n*\n* @param netif the lwip network interface structure for this ethernetif\n* @return a pbuf filled with the received packet (including MAC header)\n*         NULL on memory error\n*/\nstatic struct pbuf *low_level_input(struct netif *netif)\n{\n    struct pbuf *p = NULL;\n\n    if(s_eth_api.input)\n    {\n        p = s_eth_api.input(netif);\n    }\n    return p;\n}\n\n/**\n* This function is the ethernetif_input task, it is processed when a packet\n* is ready to be read from the interface. It uses the function low_level_input()\n* that should handle the actual reception of bytes from the network\n* interface. Then the type of the received packet is determined and\n* the appropriate input function is called.\n*\n* @param netif the lwip network interface structure for this ethernetif\n*/\nvoid ethernetif_input( void *pvParameters )\n{\n    struct pbuf *p;\n    err_t err;\n\n    //LWIP_ASSERT(\"s_pxNetIf != NULL\", (s_pxNetIf != NULL));\n    /* move received packet into a new pbuf */\n    do\n    {\n        SYS_ARCH_DECL_PROTECT(sr);\n\n        SYS_ARCH_PROTECT(sr);\n        p = low_level_input(s_pxNetIf);\n        SYS_ARCH_UNPROTECT(sr);\n\n        if (p == NULL)\n        {\n            return;\n        }\n        /*netif_add func now use tcpip_input, sys_init.c\n        netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ethernetif_init, tcpip_input);\n        */\n        /*err = s_pxNetIf->input(p, s_pxNetIf);*/\n        err = tcpip_input(p, s_pxNetIf);\n        if (err != ERR_OK)\n        {\n            LWIP_DEBUGF(NETIF_DEBUG, (\"ethernetif_input: IP input error\\n\"));\n            pbuf_free(p);\n            p = NULL;\n        }\n    }\n    while(p != NULL);\n}\n\n/**\n* Should be called at the beginning of the program to set up the\n* network interface. It calls the function low_level_init() to do the\n* actual setup of the hardware.\n*\n* This function should be passed as a parameter to netif_add().\n*\n* @param netif the lwip network interface structure for this ethernetif\n* @return ERR_OK if the loopif is initialized\n*         ERR_MEM if private data couldn't be allocated\n*         any other err_t on error\n*/\nerr_t ethernetif_init(struct netif *netif)\n{\n    LWIP_ASSERT(\"netif != NULL\", (netif != NULL));\n\n#if LWIP_NETIF_HOSTNAME\n    /* Initialize interface hostname */\n    netif->hostname = \"lwip\";\n#endif /* LWIP_NETIF_HOSTNAME */\n\n    netif->name[0] = IFNAME0;\n    netif->name[1] = IFNAME1;\n#if LWIP_IPV4 && LWIP_IPV6\n#elif LWIP_IPV6\n    netif->output_ip6 = ethip6_output;\n#else\n    netif->output = etharp_output;\n#endif\n\n    netif->linkoutput = low_level_output;\n\n\n    /* initialize the hardware */\n    low_level_init(netif);\n#if LWIP_IPV4 && LWIP_IPV6\n#elif LWIP_IPV6\n#else\n    etharp_init();\n    sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);\n#endif\n\n    return ERR_OK;\n}\n\n#if LWIP_IPV4 && LWIP_IPV6\n#elif LWIP_IPV6\n#else\nstatic void arp_timer(void *arg)\n{\n    etharp_tmr();\n    sys_timeout(ARP_TMR_INTERVAL, arp_timer, NULL);\n}\n#endif\n\n#if LWIP_IPV6\nstatic ip6_addr_t g_lwip_ipv6_gw;\nip6_addr_t *get_lwip_ipv6_default_gw(const struct netif *netif, const ip6_addr_t *ip6addr)\n{\n    (void)ip6addr;\n    (void)netif;\n    return &g_lwip_ipv6_gw;\n}\n\nvoid set_lwip_ipv6_default_gw(struct netif *netif, const ip6_addr_t *gw)\n{\n    (void)netif;\n    if (gw == NULL)\n    {\n        return;\n    }\n    memcpy( &g_lwip_ipv6_gw, gw, sizeof(g_lwip_ipv6_gw));\n}\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/OS/ethernetif.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef __ETHERNETIF_H__\n#define __ETHERNETIF_H__\n\n#include \"lwip/opt.h\"\n#include \"lwip/err.h\"\n#include \"lwip/netif.h\"\n#include \"lwip/pbuf.h\"\n\nstruct ethernet_api\n{\n    int8_t          (*init)(struct netif* netif);\n    int8_t          (*output)(struct netif* netif, struct pbuf *p);\n    struct pbuf*    (*input)(struct netif* netif);\n};\n\nint8_t ethernetif_api_register(struct ethernet_api *api);\n\nerr_t ethernetif_init(struct netif *netif);\nvoid ethernetif_input( void * pvParameters );\n\n#if LWIP_IPV6\nip6_addr_t *get_lwip_ipv6_default_gw(const struct netif *netif, const ip6_addr_t *ip6addr);\nvoid set_lwip_ipv6_default_gw(struct netif *netif, const ip6_addr_t *gw);\n#endif\n\n#endif /* __ETHERNETIF_H__ */\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/OS/lwipopts.h",
    "content": "/**\n  ******************************************************************************\n  * @file    lwipopts.h\n  * @author  MCD Application Team\n  * @version V1.1.0\n  * @date    31-July-2013\n  * @brief   lwIP Options Configuration.\n  *          This file is based on Utilities\\lwip_v1.4.1\\src\\include\\lwip\\opt.h\n  *          and contains the lwIP configuration for the STM32F4x7 demonstration.\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\n  *\n  * Licensed under MCD-ST Liberty SW License Agreement V2, (the \"License\");\n  * You may not use this file except in compliance with the License.\n  * You may obtain a copy of the License at:\n  *\n  *        http://www.st.com/software_license_agreement_liberty_v2\n  *\n  * Unless required by applicable law or agreed to in writing, software\n  * distributed under the License is distributed on an \"AS IS\" BASIS,\n  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  * See the License for the specific language governing permissions and\n  * limitations under the License.\n  *\n  ******************************************************************************\n  */\n\n#ifndef __LWIPOPTS_H__\n#define __LWIPOPTS_H__\n\n\n//#define LWIP_IPV6                       1\n//#define IPV6_FRAG_COPYHEADER            1\n//#define LWIP_IPV6_DUP_DETECT_ATTEMPTS   0\n\n//#define LWIP_IPV4           0\n#define ETHARP_TRUST_IP_MAC 0\n#define IP_REASSEMBLY  1\n#define IP_FRAG        1\n#define ARP_QUEUEING   0\n#define TCP_LISTEN_BACKLOG  1\n\n\n\n/**\n * SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain\n * critical regions during buffer allocation, deallocation and memory\n * allocation and deallocation.\n */\n#define SYS_LIGHTWEIGHT_PROT    0\n\n/**\n * NO_SYS==1: Provides VERY minimal functionality. Otherwise,\n * use lwIP facilities.\n */\n#define NO_SYS                  0\n\n/**\n * NO_SYS_NO_TIMERS==1: Drop support for sys_timeout when NO_SYS==1\n * Mainly for compatibility to old versions.\n */\n#define NO_SYS_NO_TIMERS        1\n\n/* ---------- Memory options ---------- */\n/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which\n   lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2\n   byte alignment -> define MEM_ALIGNMENT to 2. */\n#define MEM_ALIGNMENT           4\n\n/* MEM_SIZE: the size of the heap memory. If the application will send\na lot of data that needs to be copied, this should be set high. */\n#define MEM_SIZE                (10*1024)\n\n/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application\n   sends a lot of data out of ROM (or other static memory), this\n   should be set high. */\n#define MEMP_NUM_PBUF           100\n/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One\n   per active UDP \"connection\". */\n#define MEMP_NUM_UDP_PCB        6\n/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP\n   connections. */\n#define MEMP_NUM_TCP_PCB        10\n/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP\n   connections. */\n#define MEMP_NUM_TCP_PCB_LISTEN 6\n/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP\n   segments. */\n#define MEMP_NUM_TCP_SEG        12\n/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active\n   timeouts. */\n#define MEMP_NUM_SYS_TIMEOUT    10\n\n\n/* ---------- Pbuf options ---------- */\n/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */\n#define PBUF_POOL_SIZE          20\n\n/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */\n#define PBUF_POOL_BUFSIZE       500\n\n\n/* ---------- TCP options ---------- */\n#if !defined ( __GNUC__ )  /* GCC*/\n#define LWIP_TCP                1\n#endif\n#define TCP_TTL                 255\n\n/* Controls if TCP should queue segments that arrive out of\n   order. Define to 0 if your device is low on memory. */\n#define TCP_QUEUE_OOSEQ         0\n\n/* TCP Maximum segment size. */\n#define TCP_MSS                 (1500 - 40)/* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */\n\n/* TCP sender buffer space (bytes). */\n#define TCP_SND_BUF             (4*TCP_MSS)\n\n/*  TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least\n  as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */\n\n#define TCP_SND_QUEUELEN        (2* TCP_SND_BUF/TCP_MSS)\n\n/* TCP receive window. */\n#define TCP_WND                 (2*TCP_MSS)\n\n\n/* ---------- ICMP options ---------- */\n#define LWIP_ICMP                       1\n\n\n/* ---------- DHCP options ---------- */\n/* Define LWIP_DHCP to 1 if you want DHCP configuration of\n   interfaces. DHCP is not implemented in lwIP 0.5.1, however, so\n   turning this on does currently not work. */\n#define LWIP_DHCP               1\n\n\n/* ---------- UDP options ---------- */\n#define LWIP_UDP                1\n#define UDP_TTL                 255\n\n\n/* ---------- Statistics options ---------- */\n#define LWIP_STATS 0\n#define LWIP_PROVIDE_ERRNO 1\n\n/* ---------- link callback options ---------- */\n/* LWIP_NETIF_LINK_CALLBACK==1: Support a callback function from an interface\n * whenever the link changes (i.e., link down)\n */\n#define LWIP_NETIF_LINK_CALLBACK        1\n\n/*\n   --------------------------------------\n   ---------- Checksum options ----------\n   --------------------------------------\n*/\n\n/*\nThe STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums by hardware:\n - To use this feature let the following define uncommented.\n - To disable it and process by CPU comment the  the checksum.\n*/\n#if defined(USE_PPPOS) && (USE_PPPOS == 1)\n//for the ppp support\n#define  PPP_SUPPORT       1\n#define  PAP_SUPPORT       1\n#define  PPP_IPV4_SUPPORT  1\n#else\n#define CHECKSUM_BY_HARDWARE\n\n#endif\n\n\n\n#ifdef CHECKSUM_BY_HARDWARE\n  /* CHECKSUM_GEN_IP==0: Generate checksums by hardware for outgoing IP packets.*/\n  #define CHECKSUM_GEN_IP                 0\n  /* CHECKSUM_GEN_UDP==0: Generate checksums by hardware for outgoing UDP packets.*/\n  #define CHECKSUM_GEN_UDP                0\n  /* CHECKSUM_GEN_TCP==0: Generate checksums by hardware for outgoing TCP packets.*/\n  #define CHECKSUM_GEN_TCP                0\n  /* CHECKSUM_CHECK_IP==0: Check checksums by hardware for incoming IP packets.*/\n  #define CHECKSUM_CHECK_IP               0\n  /* CHECKSUM_CHECK_UDP==0: Check checksums by hardware for incoming UDP packets.*/\n  #define CHECKSUM_CHECK_UDP              0\n  /* CHECKSUM_CHECK_TCP==0: Check checksums by hardware for incoming TCP packets.*/\n  #define CHECKSUM_CHECK_TCP              0\n  /* CHECKSUM_CHECK_ICMP==0: Check checksums by hardware for incoming ICMP packets.*/\n  #define CHECKSUM_GEN_ICMP               0\n#else\n  /* CHECKSUM_GEN_IP==1: Generate checksums in software for outgoing IP packets.*/\n  #define CHECKSUM_GEN_IP                 1\n  /* CHECKSUM_GEN_UDP==1: Generate checksums in software for outgoing UDP packets.*/\n  #define CHECKSUM_GEN_UDP                1\n  /* CHECKSUM_GEN_TCP==1: Generate checksums in software for outgoing TCP packets.*/\n  #define CHECKSUM_GEN_TCP                1\n  /* CHECKSUM_CHECK_IP==1: Check checksums in software for incoming IP packets.*/\n  #define CHECKSUM_CHECK_IP               1\n  /* CHECKSUM_CHECK_UDP==1: Check checksums in software for incoming UDP packets.*/\n  #define CHECKSUM_CHECK_UDP              1\n  /* CHECKSUM_CHECK_TCP==1: Check checksums in software for incoming TCP packets.*/\n  #define CHECKSUM_CHECK_TCP              1\n  /* CHECKSUM_CHECK_ICMP==1: Check checksums by hardware for incoming ICMP packets.*/\n  #define CHECKSUM_GEN_ICMP               1\n#endif\n\n\n/*\n   ----------------------------------------------\n   ---------- Sequential layer options ----------\n   ----------------------------------------------\n*/\n/**\n * LWIP_NETCONN==1: Enable Netconn API (require to use api_lib.c)\n */\n#define LWIP_NETCONN                    1\n\n/*\n   ------------------------------------\n   ---------- Socket options ----------\n   ------------------------------------\n*/\n/**\n * LWIP_SOCKET==1: Enable Socket API (require to use sockets.c)\n */\n#define LWIP_SOCKET                     1\n\n/**\n * LWIP_DNS==1: Enable Domain Name System\n */\n#define LWIP_DNS                        1\n\n/*\n   ----------------------------------------\n   ---------- Lwip Debug options ----------\n   ----------------------------------------\n*/\n//#define LWIP_DEBUG                      1\n\n#define TCPIP_THREAD_STACKSIZE 0x1000\n#define TCPIP_MBOX_SIZE 12\n#define DEFAULT_UDP_RECVMBOX_SIZE 12\n#define DEFAULT_TCP_RECVMBOX_SIZE 6\n#define DEFAULT_ACCEPTMBOX_SIZE 6\n#define DEFALUT_THREAD_STACKSIZE 500\n#define TCPIP_THREAD_PRIO  6\n\n#define LWIP_COMPAT_MUTEX_ALLOWED 1\n#define LWIP_COMPAT_MUTEX  1\n\n//for dtls server\n#define SO_REUSE 1\n\n#define LWIP_HOOK_ND6_GET_GW get_lwip_ipv6_default_gw\n\n#endif /* __LWIPOPTS_H__ */\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/OS/sys_arch.c",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/**********************************************************************************\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which\n * might include those applicable to Huawei LiteOS of U.S. and the country in which you\n * are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance\n * with such applicable export control laws and regulations.\n **********************************************************************************/\n\n/* lwIP includes. */\n#include \"lwip/opt.h\"\n#include \"lwip/debug.h\"\n#include \"lwip/def.h\"\n#include \"lwip/sys.h\"\n#include \"lwip/mem.h\"\n#include \"lwip/stats.h\"\n\n#include \"los_config.h\"\n#include \"arch/sys_arch.h\"\n\n//#include \"linux/wait.h\"\n#include \"los_sys.ph\"\n#include \"los_sem.ph\"\n#include \"string.h\"\n\n/*lint -e**/\n/*-----------------------------------------------------------------------------------*/\n/*---------------------------------------------------------------------------*\n * Routine:  sys_mbox_new\n *---------------------------------------------------------------------------*\n * Description:\n *      Creates a new mailbox\n * Inputs:\n *      sys_mbox_t mbox         -- Handle of mailbox\n *      int queue_sz            -- Size of elements in the mailbox\n * Outputs:\n *      err_t                   -- ERR_OK if message posted, else ERR_MEM\n *---------------------------------------------------------------------------*/\n\nerr_t sys_mbox_new(struct sys_mbox **mb, int size)\n{\n    struct sys_mbox *mbox;\n    unsigned int ret;\n\n    if (size <= 0)\n    {\n        LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_new: mbox size must bigger than 0\\n\"));\n        return ERR_MEM;\n    }\n\n    mbox = (struct sys_mbox *)mem_malloc(sizeof(struct sys_mbox));\n\n    if (mbox == NULL)\n    {\n        goto err_handler;\n    }\n\n    (void)memset(mbox, 0, sizeof(struct sys_mbox)); //CSEC_FIX_2302\n\n    mbox->msgs = (void **)mem_malloc(sizeof(void *) * size);\n\n    if (mbox->msgs == NULL)\n    {\n        goto err_handler;\n    }\n\n    (void)memset(mbox->msgs, 0, (sizeof(void *) * size)); //CSEC_FIX_2302\n\n    mbox->mbox_size = size;\n\n    mbox->first = 0;\n    mbox->last = 0;\n    mbox->isFull = 0;\n    mbox->isEmpty = 1;\n\n    mbox->mutex = (unsigned int) - 1;\n    mbox->not_empty = (unsigned int) - 1;\n    mbox->not_full = (unsigned int) - 1;\n\n    ret = LOS_SemCreate(1, &(mbox->mutex));\n\n    if (ret != LOS_OK)\n    {\n        goto err_handler;\n    }\n\n    ret = LOS_SemCreate(0, &(mbox->not_empty));\n\n    if (ret != LOS_OK)\n    {\n        goto err_handler;\n    }\n\n    ret = LOS_SemCreate(0, &(mbox->not_full));\n\n    if (ret != LOS_OK)\n    {\n        goto err_handler;\n    }\n\n    SYS_STATS_INC_USED(mbox);\n    *mb = mbox;\n    LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_new: mbox created successfully 0x%p\\n\", (void *)mbox));\n    return ERR_OK;\n\nerr_handler:\n\n    if (mbox != NULL)\n    {\n        if (mbox->msgs != NULL)\n        {\n            mem_free(mbox->msgs);\n        }\n\n        mem_free(mbox);\n    }\n\n    if (mbox->mutex != (unsigned int) - 1)\n    {\n        (void)LOS_SemDelete(mbox->mutex);\n    }\n\n    if (mbox->not_empty != (unsigned int) - 1)\n    {\n        (void)LOS_SemDelete(mbox->not_empty);\n    }\n\n    if (mbox->not_full != (unsigned int) - 1)\n    {\n        (void)LOS_SemDelete(mbox->not_full);\n    }\n\n    return ERR_MEM;\n}\n\n/*-----------------------------------------------------------------------------------*/\nvoid\nsys_mbox_free(struct sys_mbox **mb)\n{\n    if ((mb != NULL) && (*mb != SYS_MBOX_NULL))\n    {\n        struct sys_mbox *mbox = *mb;\n        SYS_STATS_DEC(mbox.used);\n\n        LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_free: going to free mbox 0x%p\\n\", (void *)mbox));\n\n        (void)LOS_SemPend(mbox->mutex, LOS_WAIT_FOREVER);\n\n        (void)LOS_SemDelete(mbox->not_empty);\n        (void)LOS_SemDelete(mbox->not_full);\n\n        (void)LOS_SemPost(mbox->mutex);\n        (void)LOS_SemDelete(mbox->mutex);\n\n        mem_free(mbox->msgs);\n        mem_free(mbox);\n        *mb = NULL;\n\n        LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_free: freed mbox\\n\"));\n    }\n}\n\n/*---------------------------------------------------------------------------*\n * Routine:  sys_mbox_post\n *---------------------------------------------------------------------------*\n * Description:\n *      Post the \"msg\" to the mailbox.\n * Inputs:\n *      sys_mbox_t mbox        -- Handle of mailbox\n *      void *msg              -- Pointer to data to post\n *---------------------------------------------------------------------------*/\nvoid\nsys_mbox_post(struct sys_mbox **mb, void *msg)\n{\n    struct sys_mbox *mbox;\n    mbox = *mb;\n    LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_post: mbox 0x%p msg 0x%p\\n\", (void *)mbox, (void *)msg));\n\n    (void)LOS_SemPend(mbox->mutex, LOS_WAIT_FOREVER);\n\n    while (mbox->isFull)\n    {\n        LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_post : mbox 0x%p mbox 0x%p, queue is full\\n\", (void *)mbox, (void *)msg));\n        (void)LOS_SemPost(mbox->mutex);\n        (void)LOS_SemPend(mbox->not_full, LOS_WAIT_FOREVER);\n        (void)LOS_SemPend(mbox->mutex, LOS_WAIT_FOREVER);\n    }\n\n    mbox->msgs[mbox->last] = msg;\n\n    mbox->last = (mbox->last + 1) % mbox->mbox_size;\n\n    if (mbox->first == mbox->last)\n    {\n        mbox->isFull = 1;\n    }\n\n    if (mbox->isEmpty)\n    {\n        mbox->isEmpty = 0;\n        (void)LOS_SemPost(mbox->not_empty);\n        LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_post : mbox 0x%p msg 0x%p, signalling not empty\\n\", (void *)mbox, (void *)msg));\n    }\n\n    LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_post: mbox 0x%p msg 0%p posted\\n\", (void *)mbox, (void *)msg));\n    (void)LOS_SemPost(mbox->mutex);\n}\n\n/*---------------------------------------------------------------------------*\n * Routine:  sys_mbox_trypost\n *---------------------------------------------------------------------------*\n * Description:\n *      Try to post the \"msg\" to the mailbox.  Returns immediately with\n *      error if cannot.\n * Inputs:\n *      sys_mbox_t mbox         -- Handle of mailbox\n *      void *msg               -- Pointer to data to post\n * Outputs:\n *      err_t                   -- ERR_OK if message posted, else ERR_MEM\n *                                  if not.\n *---------------------------------------------------------------------------*/\nerr_t\nsys_mbox_trypost(struct sys_mbox **mb, void *msg)\n{\n    struct sys_mbox *mbox;\n    mbox = *mb;\n    LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_trypost: mbox 0x%p msg 0x%p \\n\", (void *)mbox, (void *)msg));\n    (void)LOS_SemPend(mbox->mutex, LOS_WAIT_FOREVER);\n\n    if (mbox->isFull)\n    {\n        LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_trypost : mbox 0x%p msgx 0x%p,queue is full\\n\", (void *)mbox, (void *)msg));\n        (void)LOS_SemPost(mbox->mutex);\n        return ERR_MEM;\n    }\n\n    mbox->msgs[mbox->last] = msg;\n\n    mbox->last = (mbox->last + 1) % mbox->mbox_size;\n\n    if (mbox->first == mbox->last)\n    {\n        mbox->isFull = 1;\n    }\n\n    if (mbox->isEmpty)\n    {\n        mbox->isEmpty = 0;\n        (void)LOS_SemPost(mbox->not_empty);\n    }\n\n    LWIP_DEBUGF(SYS_DEBUG, (\"sys_mbox_trypost: mbox 0x%p msg 0x%p posted\\n\", (void *)mbox, (void *)msg));\n    (void)LOS_SemPost(mbox->mutex);\n    return ERR_OK;\n}\n\n\n\nu32_t\nsys_arch_mbox_fetch_ext(struct sys_mbox **mb, void **msg, u32_t timeout, u8_t ignore_timeout)\n{\n    u32_t time_needed = 0;\n    struct sys_mbox *mbox;\n    unsigned long long u64StartTick;\n    unsigned long long u64EndTick;\n    unsigned int ret;\n\n    mbox = *mb;\n    LWIP_DEBUGF(SYS_DEBUG, (\"sys_arch_mbox_fetch: mbox 0x%p msg 0x%p\\n\", (void *)mbox, (void *)msg));\n\n    /* The mutex lock is quick so we don't bother with the timeout\n       stuff here. */\n    (void)LOS_SemPend(mbox->mutex, LOS_WAIT_FOREVER);\n\n    while (mbox->isEmpty && !ignore_timeout)\n    {\n        (void)LOS_SemPost(mbox->mutex);\n\n        if (timeout == 0)\n        {\n            timeout = LOS_WAIT_FOREVER;\n        }\n        else\n        {\n            timeout = LOS_MS2Tick(timeout);\n            timeout = (timeout > 0) ? timeout : 1;\n        }\n\n        u64StartTick = LOS_TickCountGet();\n        LWIP_DEBUGF(SYS_DEBUG, (\"sys_arch_mbox_fetch: mbox 0x%p, timed cond wait\\n\", (void *)mbox));\n        ret = LOS_SemPend(mbox->not_empty, timeout);\n\n        if (ret != 0)\n        {\n            LWIP_DEBUGF(SYS_DEBUG, (\"sys_arch_mbox_fetch: mbox 0x%p,timeout in cond wait\\n\", (void *)mbox));\n            return SYS_ARCH_TIMEOUT;\n        }\n\n        u64EndTick = LOS_TickCountGet();\n        time_needed = (u32_t)(((u64EndTick - u64StartTick) * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND);\n        (void)LOS_SemPend(mbox->mutex, LOS_WAIT_FOREVER);\n    }\n\n    if (msg != NULL)\n    {\n        *msg = mbox->msgs[mbox->first];\n        LWIP_DEBUGF(SYS_DEBUG, (\"sys_arch_mbox_fetch: mbox 0x%p msg 0x%p\\n\", (void *)mbox, (void *)*msg));\n    }\n    else\n    {\n        LWIP_DEBUGF(SYS_DEBUG, (\"sys_arch_mbox_fetch: mbox 0x%p, null msg\\n\", (void *)mbox));\n    }\n\n    mbox->first = (mbox->first + 1) % mbox->mbox_size;\n\n    if (mbox->first == mbox->last)\n    {\n        mbox->isEmpty = 1;\n    }\n\n    if (mbox->isFull)\n    {\n        mbox->isFull = 0;\n        (void)LOS_SemPost(mbox->not_full);\n    }\n\n    LWIP_DEBUGF(SYS_DEBUG, (\"sys_arch_mbox_fetch: mbox 0x%p msg 0x%p fetched\\n\", (void *)mbox, (void *)msg));\n    (void)LOS_SemPost(mbox->mutex);\n\n    return time_needed;\n}\n\n\n/*---------------------------------------------------------------------------*\n * Routine:  sys_arch_mbox_fetch\n *---------------------------------------------------------------------------*\n * Description:\n *      Blocks the thread until a message arrives in the mailbox, but does\n *      not block the thread longer than \"timeout\" milliseconds (similar to\n *      the sys_arch_sem_wait() function). The \"msg\" argument is a result\n *      parameter that is set by the function (i.e., by doing \"*msg =\n *      ptr\"). The \"msg\" parameter maybe NULL to indicate that the message\n *      should be dropped.\n *\n *      The return values are the same as for the sys_arch_sem_wait() function:\n *      Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a\n *      timeout.\n *\n *      Note that a function with a similar name, sys_mbox_fetch(), is\n *      implemented by lwIP.\n * Inputs:\n *      sys_mbox_t mbox         -- Handle of mailbox\n *      void **msg              -- Pointer to pointer to msg received\n *      u32_t timeout           -- Number of milliseconds until timeout\n * Outputs:\n *      u32_t                   -- SYS_ARCH_TIMEOUT if timeout, else number\n *                                  of milliseconds until received.\n *---------------------------------------------------------------------------*/\nu32_t\nsys_arch_mbox_fetch(struct sys_mbox **mb, void **msg, u32_t timeout)\n{\n    return sys_arch_mbox_fetch_ext(mb, msg, timeout, 0);\n}\n\n\n/*---------------------------------------------------------------------------*\n * Routine:  sys_init\n *---------------------------------------------------------------------------*\n * Description:\n *      Initialize sys arch\n *---------------------------------------------------------------------------*/\nvoid sys_init(void)\n{\n\n}\n\n\n/*---------------------------------------------------------------------------*\n * Routine:  sys_arch_protect\n *---------------------------------------------------------------------------*\n * Description:\n *      This optional function does a \"fast\" critical region protection and\n *      returns the previous protection level. This function is only called\n *      during very short critical regions. An embedded system which supports\n *      ISR-based drivers might want to implement this function by disabling\n *      interrupts. Task-based systems might want to implement this by using\n *      a mutex or disabling tasking. This function should support recursive\n *      calls from the same task or interrupt. In other words,\n *      sys_arch_protect() could be called while already protected. In\n *      that case the return value indicates that it is already protected.\n *\n *      sys_arch_protect() is only required if your port is supporting an\n *      OS.\n * Outputs:\n *      sys_prot_t              -- Previous protection level (not used here)\n *---------------------------------------------------------------------------*/\nsys_prot_t\nsys_arch_protect(void)\n{\n    LOS_TaskLock();\n    return 0;\n}\n\n\n/*---------------------------------------------------------------------------*\n * Routine:  sys_arch_unprotect\n *---------------------------------------------------------------------------*\n * Description:\n *      This optional function does a \"fast\" set of critical region\n *      protection to the value specified by pval. See the documentation for\n *      sys_arch_protect() for more information. This function is only\n *      required if your port is supporting an OS.\n * Inputs:\n *      sys_prot_t              -- Previous protection level (not used here)\n *---------------------------------------------------------------------------*/\nvoid\nsys_arch_unprotect(sys_prot_t pval)\n{\n    LWIP_UNUSED_ARG(pval);\n    LOS_TaskUnlock();\n}\n\nu32_t sys_now(void)\n{\n    /* Lwip docs mentioned like wraparound is not a problem in this funtion */\n    return (u32_t)((LOS_TickCountGet() * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND);\n}\n\nsys_thread_t\nsys_thread_new(char *name, lwip_thread_fn function, void *arg, int stacksize, int prio)\n{\n    TSK_INIT_PARAM_S task;\n    UINT32 taskid, ret;\n    memset(&task, 0, sizeof(task));\n\n    /* Create host Task */\n    task.pfnTaskEntry = (TSK_ENTRY_FUNC)function;\n    task.uwStackSize  = stacksize;\n    task.pcName = (char *)name;\n    task.usTaskPrio = prio;\n    task.uwArg = (UINT32)arg;\n    ret = LOS_TaskCreate(&taskid, &task);\n\n    if (LOS_OK != ret )\n    {\n        LWIP_DEBUGF(SYS_DEBUG, (\"sys_thread_new: LOS_TaskCreate error %u\\n\", (unsigned int)ret));\n        return  (unsigned int) - 1;\n    }\n\n    return taskid;\n}\n\n#ifdef LWIP_DEBUG\n\n/** \\brief  Displays an error message on assertion\n\n    This function will display an error message on an assertion\n    to the dbg output.\n\n    \\param[in]    msg   Error message to display\n    \\param[in]    line  Line number in file with error\n    \\param[in]    file  Filename with error\n */\nvoid assert_printf(char *msg, int line, char *file)\n{\n    if (msg)\n    {\n        LWIP_DEBUGF(LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,\n                    (\"%s:%d in file %s\", msg, line, file));\n        return;\n    }\n    else\n    {\n        LWIP_DEBUGF( LWIP_DBG_TRACE | LWIP_DBG_LEVEL_SERIOUS,\n                     (\"LWIP ASSERT\"));\n        return;\n    }\n}\n#endif /* LWIP_DEBUG */\n\n\n/*---------------------------------------------------------------------------*\n * Routine:  sys_sem_new\n *---------------------------------------------------------------------------*\n * Description:\n *      Creates and returns a new semaphore. The \"ucCount\" argument specifies\n *      the initial state of the semaphore.\n *      NOTE: Currently this routine only creates counts of 1 or 0\n * Inputs:\n *      sys_sem_t sem         -- Handle of semaphore\n *      u8_t count            -- Initial count of semaphore\n * Outputs:\n *      err_t                 -- ERR_OK if semaphore created\n *---------------------------------------------------------------------------*/\nerr_t sys_sem_new(sys_sem_t *sem,  u8_t count)\n{\n    UINT32 puwSemHandle;\n    UINT32 uwRet;\n\n    if (NULL == sem)\n    {\n        return -1;\n    }\n\n    LWIP_ASSERT(\"in sys_sem_new count exceeds the limit\", (count < 0xFF));\n\n    uwRet = LOS_SemCreate(count, &puwSemHandle);\n\n    if (uwRet != ERR_OK)\n    {\n        return -1;\n    }\n\n    sem->sem = GET_SEM(puwSemHandle);\n\n    return ERR_OK;\n}\n\n\n/*---------------------------------------------------------------------------*\n * Routine:  sys_arch_sem_wait\n *---------------------------------------------------------------------------*\n * Description:\n *      Blocks the thread while waiting for the semaphore to be\n *      signaled. If the \"timeout\" argument is non-zero, the thread should\n *      only be blocked for the specified time (measured in\n *      milliseconds).\n *\n *      If the timeout argument is non-zero, the return value is the number of\n *      milliseconds spent waiting for the semaphore to be signaled. If the\n *      semaphore wasn't signaled within the specified time, the return value is\n *      SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore\n *      (i.e., it was already signaled), the function may return zero.\n *\n *      Notice that lwIP implements a function with a similar name,\n *      sys_sem_wait(), that uses the sys_arch_sem_wait() function.\n * Inputs:\n *      sys_sem_t sem           -- Semaphore to wait on\n *      u32_t timeout           -- Number of milliseconds until timeout\n * Outputs:\n *      u32_t                   -- Time elapsed or SYS_ARCH_TIMEOUT.\n *---------------------------------------------------------------------------*/\nu32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout)\n{\n    int retval = 0;\n    uint64_t u64StartTick;\n    uint64_t u64EndTick;\n\n    if (!sem)\n    {\n        return SYS_ARCH_TIMEOUT;\n    }\n\n    u64StartTick = LOS_TickCountGet();\n\n    if (timeout == 0)\n    {\n        timeout = LOS_WAIT_FOREVER;\n    }\n    else\n    {\n        timeout = LOS_MS2Tick(timeout);\n        if (!timeout)\n        {\n            timeout = 1;\n        }\n    }\n\n    retval = LOS_SemPend(sem->sem->usSemID, timeout);\n\n    if (retval != ERR_OK)\n    {\n        return SYS_ARCH_TIMEOUT;\n    }\n\n    u64EndTick = LOS_TickCountGet();\n    /* Here milli second will not come more than 32 bit because timeout received as 32 bit millisecond only */\n    return (u32_t)(((u64EndTick - u64StartTick) * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND);\n}\n\n\n/*---------------------------------------------------------------------------*\n * Routine:  sys_sem_signal\n *---------------------------------------------------------------------------*\n * Description:\n *      Signals (releases) a semaphore\n * Inputs:\n *      sys_sem_t sem           -- Semaphore to signal\n *---------------------------------------------------------------------------*/\nvoid sys_sem_signal(sys_sem_t *sem)\n{\n    UINT32    uwRet;\n\n    if (!sem)\n    {\n        return;\n    }\n\n    uwRet = LOS_SemPost(sem->sem->usSemID);\n\n    if (uwRet != ERR_OK)\n    {\n        return;\n    }\n\n    return;\n}\n\n\n/*---------------------------------------------------------------------------*\n * Routine:  sys_sem_free\n *---------------------------------------------------------------------------*\n * Description:\n *      Deallocates a semaphore\n * Inputs:\n *      sys_sem_t sem           -- Semaphore to free\n *---------------------------------------------------------------------------*/\n\nvoid sys_sem_free(sys_sem_t *sem)\n{\n    UINT32    uwRet;\n\n    if (!sem)\n    {\n        return;\n    }\n\n    uwRet = LOS_SemDelete(sem->sem->usSemID);\n    LWIP_ASSERT(\"LOS_SemDelete failed\", (uwRet == 0));\n\n    ((void)(uwRet));\n\n    return;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/arch/bpstruct.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#if defined(__IAR_SYSTEMS_ICC__)\n#pragma pack(1)\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/arch/cc.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef __CC_H__\n#define __CC_H__\n\n#include \"cpu.h\"\n\ntypedef unsigned   char    u8_t;\ntypedef signed     char    s8_t;\ntypedef unsigned   short   u16_t;\ntypedef signed     short   s16_t;\ntypedef unsigned   long    u32_t;\ntypedef signed     long    s32_t;\ntypedef u32_t mem_ptr_t;\n//typedef int sys_prot_t;\n\n//#define U16_F \"hu\"\n//#define S16_F \"d\"\n//#define X16_F \"hx\"\n//#define U32_F \"u\"\n//#define S32_F \"d\"\n//#define X32_F \"x\"\n//#define SZT_F \"uz\"\n\n#define U16_F \"4d\"\n#define S16_F \"4d\"\n#define X16_F \"4x\"\n#define U32_F \"8ld\"\n#define S32_F \"8ld\"\n#define X32_F \"8lx\"\n\n\n/* define compiler specific symbols */\n#if defined (__ICCARM__)\n\n#define PACK_STRUCT_BEGIN\n#define PACK_STRUCT_STRUCT\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n#define PACK_STRUCT_USE_INCLUDES\n\n#elif defined (__CC_ARM)\n\n#define PACK_STRUCT_BEGIN __packed\n#define PACK_STRUCT_STRUCT\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n\n#elif defined (__GNUC__)\n\n#define PACK_STRUCT_BEGIN\n#define PACK_STRUCT_STRUCT __attribute__ ((__packed__))\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n\n#elif defined (__TASKING__)\n\n#define PACK_STRUCT_BEGIN\n#define PACK_STRUCT_STRUCT\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n\n#endif\n\n#include <stdio.h>  //use the printf\n#include <stdlib.h>\n\n#define LWIP_RAND() ((u32_t)rand())\n#define LWIP_PLATFORM_DIAG(x)  {printf x;}\n\n#define LWIP_PLATFORM_ASSERT(x) do { printf(\"Assertion \\\"%s\\\" failed at  \\\n    line %d in %s\\n\",x, __LINE__, __FILE__);} while(0)\n\n#define LWIP_ERROR(message, expression, handler) do { if (!(expression)) { \\\n  printf(\"Assertion \\\"%s\\\" failed at line %d in %s\\n\", message, \\\n    __LINE__, __FILE__); fflush(NULL);handler;} } while(0)\n\n#endif /* __CC_H__ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/arch/cpu.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef __CPU_H__\n#define __CPU_H__\n\n#ifndef BYTE_ORDER\n#define BYTE_ORDER LITTLE_ENDIAN\n#endif\n\n#endif /* __CPU_H__ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/arch/epstruct.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#if defined(__IAR_SYSTEMS_ICC__)\n#pragma pack()\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/arch/init.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef __ARCH_INIT_H__\n#define __ARCH_INIT_H__\n\n#define TCPIP_INIT_DONE(arg)  tcpip_init_done(arg)\n\nvoid tcpip_init_done(void *);\nint wait_for_tcpip_init(void);\n\n#endif /* __ARCH_INIT_H__ */\n\n\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/arch/lib.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved. \n * \n * Redistribution and use in source and binary forms, with or without modification, \n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission. \n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED \n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF \n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT \n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, \n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT \n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS \n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN \n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING \n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY \n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n * \n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef __LIB_H__\n#define __LIB_H__\n\n#include <string.h>\n\n\n#endif /* __LIB_H__ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/arch/perf.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n/**********************************************************************************\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which\n * might include those applicable to Huawei LiteOS of U.S. and the country in which you\n * are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance\n * with such applicable export control laws and regulations.\n **********************************************************************************/\n\n#ifndef __LWIP_PERF_H__\n#define __LWIP_PERF_H__\n\n#include \"lwip/arch.h\"\n#include \"lwip/opt.h\"\n#include \"lwip/def.h\"\n\n#ifdef  __cplusplus\nextern \"C\" {\n#endif\n\n/* PERF_START and PERF_STOP are called in code so its kept as empty here always */\n\n#define PERF_START    /* null definition */\n#define PERF_STOP(x)  /* null definition */\n\n#if LWIP_PERF\n\nvoid\nperf_print(u32_t start_ms, u32_t end_ms, char *key);\n\n#define LWIP_PERF_DECLARATION u32_t start_ms, end_ms\n#define LWIP_PERF_START  start_ms = sys_now()\n#define LWIP_PERF_STOP(x)  end_ms = sys_now(); \\\n                       perf_print(start_ms, end_ms, x)\n\nvoid\nperf_init(void *data);\n\nvoid\nperf_fini(void *data);\n\n#endif /* LWIP_PERF */\n\n#ifdef  __cplusplus\n}\n#endif\n\n#endif /* __LWIP_PERF_H__ */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/lwip_port/arch/sys_arch.h",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/**********************************************************************************\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which\n * might include those applicable to Huawei LiteOS of U.S. and the country in which you\n * are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance\n * with such applicable export control laws and regulations.\n **********************************************************************************/\n\n#ifndef __ARCH_SYS_ARCH_H__\n#define __ARCH_SYS_ARCH_H__\n\n#include \"lwip/opt.h\"\n#include \"lwip/err.h\"\n#include \"los_sem.h\"\n#include \"los_sem.ph\"\n#include \"los_typedef.h\"\n#include \"los_memory.h\"\n\ntypedef struct los_sem\n{\n    SEM_CB_S* sem;        /**< Semaphore attribute structure*/\n} sem_t;\n\ntypedef struct los_sem sys_sem_t;\n\nstruct sys_mbox\n{\n    int first, last;\n    void** msgs;\n    int mbox_size;\n    int isFull;\n    int isEmpty;\n    unsigned int  not_empty;\n    unsigned int  not_full;\n    unsigned int  mutex;\n};\n\ntypedef struct sys_mbox* sys_mbox_t;\n\nstruct sys_thread\n{\n    struct sys_thread* next;\n    UINT32 pthread;\n};\n\ntypedef unsigned int sys_thread_t;\n\n#define sys_sem_valid(x)        (((*x).sem == NULL) ? 0 : 1)\n#define sys_sem_set_invalid(x)  ( (*x).sem = NULL)\n\n#define sys_arch_mbox_tryfetch(mbox,msg)   sys_arch_mbox_fetch(mbox,msg,1)\n#define SYS_MBOX_NULL               (NULL)\n#define sys_mbox_valid(mbox)  (*(mbox) != NULL)\n#define sys_mbox_set_invalid(mbox) do { if((mbox) != NULL) { *(mbox) = NULL; }}while(0)\n\n// === PROTECTION ===\ntypedef int sys_prot_t;\n\ntypedef u32_t sys_mutex_t;\n\n#if (MEM_MALLOC_DMA_ALIGN != 1)\nextern UINT8* m_aucSysMem0;\n\nstatic inline void* sys_align_malloc(u16_t length)\n{\n    return LOS_MemAllocAlign(m_aucSysMem0, length, 4);\n}\n\nstatic inline void sys_align_free(void* mem)\n{\n    (void)LOS_MemFree(m_aucSysMem0, mem);\n}\n#endif\n\n/** \\brief  Get the current systick time in milliSeconds\n *\n *  Returns the current systick time in milliSeconds. This function is only\n *  used in standalone systems.\n *\n *  /returns current systick time in milliSeconds\n */\nu32_t sys_now(void);\n\n\n\n#endif /* __ARCH_SYS_ARCH_H__ */\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/ppp_port/osport/iodev.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#include \"osport.h\"\n\n\ntypedef struct\n{\n    u32_t  debugrxmode: 2;  //1means ascii 2 hex while others means no debug\n    u32_t  debugtxmode: 2;  //1means ascii 2 hex while others means no debug\n} tagIOCB;\n\nstatic tagIOCB  gIOCB;\n//import the uart here\nextern s32_t uart_read(u8_t *buf, s32_t len, s32_t timeout);\nextern s32_t uart_write(u8_t *buf, s32_t len, s32_t timeout);\n\n\n#pragma weak uart_read\ns32_t uart_read(u8_t *buf, s32_t len, s32_t timeout)\n{\n    return 0;\n}\n#pragma weak uart_write\ns32_t uart_write(u8_t *buf, s32_t len, s32_t timeout)\n{\n    return 0;\n}\n\n\n//we do some port here:we port the uart\ns32_t iodev_open(const char *name, s32_t flags, s32_t mode)\n{\n    s32_t fd = 1;\n    return fd;\n}\n\ns32_t iodev_read(s32_t fd, u8_t *buf, s32_t len, s32_t timeout)\n{\n    s32_t i = 0;\n    s32_t ret;\n    ret = uart_read(buf, len, timeout);\n    if(ret > 0)\n    {\n        printf(\"RCV:%02x Bytes:\", ret);\n        for(i = 0; i < ret; i++)\n        {\n            if(gIOCB.debugrxmode == 1)\n            {\n                printf(\"%c\", buf[i]);\n            }\n            else if(gIOCB.debugrxmode  == 2)\n            {\n                printf(\" %02x\", buf[i]);\n            }\n            else\n            {\n\n            }\n        }\n        printf(\"\\n\\r\");\n    }\n    return ret;\n}\ns32_t iodev_write(s32_t fd, u8_t *buf, s32_t len, s32_t timeout)\n{\n    s32_t ret;\n    s32_t i;\n    printf(\"SND:%02x Bytes:\", len);\n    for(i = 0; i < len; i++)\n    {\n        if(gIOCB.debugtxmode == 1)\n        {\n            printf(\"%c\", buf[i]);\n        }\n        else if(gIOCB.debugtxmode == 2)\n        {\n            printf(\" %02x\", buf[i]);\n        }\n        else\n        {\n\n        }\n    }\n    printf(\"\\n\\r\");\n    ret = uart_write(buf, len, timeout);\n    return ret;\n}\ns32_t iodev_close(s32_t fd)\n{\n    return 0;\n}\ns32_t iodev_flush(s32_t fd)\n{\n    unsigned char buf;\n    s32_t ret;\n    do\n    {\n        ret = iodev_read(fd, &buf, 1, 0);\n    }\n    while(ret > 0);\n    return 0;\n}\nvoid  iodev_debugmode(s32_t rxtx, u32_t mode)\n{\n    if(rxtx == 0)\n    {\n        gIOCB.debugrxmode = mode;\n    }\n    else if(rxtx == 1)\n    {\n        gIOCB.debugtxmode = mode;\n    }\n    else if(rxtx == 2)\n    {\n        gIOCB.debugrxmode = mode;\n        gIOCB.debugtxmode = mode;\n    }\n    else  //do nothing here\n    {\n    }\n    return;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/ppp_port/osport/kernel.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"los_task.h\"\n\n#include \"osport.h\"\nvoid task_sleepms(s32_t ms)\n{\n    LOS_TaskDelay(ms);//which tick is ms\n    return;\n}\ns32_t task_create(const char *name, fnTaskEntry fnTask, s32_t stackisize, void *stack, void *args, s32_t prior)\n{\n    int ret = -1;\n    UINT32 uwRet = LOS_OK;\n    UINT32  handle;\n    TSK_INIT_PARAM_S task_init_param;\n\n    task_init_param.uwArg = (unsigned int)args;\n    task_init_param.usTaskPrio = prior;\n    task_init_param.pcName = (char *) name;\n    task_init_param.pfnTaskEntry = fnTask;\n    task_init_param.uwStackSize = stackisize;\n    uwRet = LOS_TaskCreate(&handle, &task_init_param);\n    if(LOS_OK != uwRet)\n    {\n        return ret;\n    }\n    ret = handle;\n    return ret;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/ppp_port/osport/osport.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#include <stdint.h>\n#include <stddef.h>\n#include <stdio.h>\n\n#ifndef u8_t\n#define u8_t   unsigned char    \n#endif\n#ifndef u16_t\n#define u16_t  unsigned short    \n#endif\n#ifndef u32_t\n#define u32_t  unsigned  int   \n#endif\n#ifndef s8_t\n#define s8_t   signed char    \n#endif\n#ifndef s16_t\n#define s16_t  signed short    \n#endif\n#ifndef s32_t\n#define s32_t  signed int   \n#endif\n\n//we need nothing here except the standard struct here\n//kernel port here\n//create a task:return the task handle here while -1 means create failed\ntypedef void *(*fnTaskEntry)(u32_t arg);\ns32_t task_create(const char *name,fnTaskEntry fnTask,s32_t stackisize,void *stack,void *args,s32_t prior);\n//task sleep here:unit ms\nvoid task_sleepms(s32_t ms);\n\n//ring buffer implement here:used for the driver\ntypedef struct\n{\n    u8_t          *buf;  //which means the buffer\n    s32_t          buflen; //which means the buffer limit\n    s32_t          datalen; //which means how many data in the buffer\n    s32_t          dataoff; //which means the valid data offset in the buffer\n}tagRingBuf;\n//ring:which to be initialized\n//buf:you supplied for the ring\n//len:the buf length\n//return:0 means ok while -1 failed\ns32_t ring_init(tagRingBuf *ring,u8_t *buf, s32_t buflen,s32_t offset,s32_t datalen);\n//write len bytes data to the ring\n//return:how many bytes has been written while -1 means something err\n//write only changes the datalen and  data in  the ring\ns32_t ring_write(tagRingBuf *ring,u8_t *buf,s32_t len);\n//read len bytes data from the ring\n//return:how many bytes has been read while -1 means something err\n//read effect the offset datalen and data in the ring\ns32_t ring_read(tagRingBuf *ring,u8_t *buf,s32_t len);\ns32_t ring_reset(tagRingBuf *ring);  //clear the ring data\ns32_t ring_datalen(tagRingBuf *ring);//show me how many data in the ring\ns32_t ring_deinit(tagRingBuf *ring);//deinit the ring:-1 means something error while 0 ok\n//io device for some component ported\ns32_t iodev_open(const char *name,s32_t flags,s32_t mode);\ns32_t iodev_read(s32_t fd,u8_t *buf,s32_t len,s32_t timeout);\ns32_t iodev_write(s32_t fd,u8_t *buf,s32_t len,s32_t timeout);\ns32_t iodev_close(s32_t fd);\ns32_t iodev_flush(s32_t fd);\nvoid  iodev_debugmode(s32_t rxtx,u32_t mode);  //rxtx:0 rx while 1tx 2 rxtx mode 0 nodebug 1 ascii 2 hex\n\n\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/ppp_port/osport/ring.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#include <string.h>\n#include \"osport.h\"\n//ring:which to be initialized\n//buf:you supplied for the ring\n//len:the buf length\n//return:0 means ok while -1 failed\ns32_t ring_init(tagRingBuf *ring, u8_t *buf, s32_t buflen, s32_t offset, s32_t datalen)\n{\n    int ret = -1;\n    if((NULL == ret))\n    {\n        return ret;\n    }\n    ring->buf     = buf;\n    ring->buflen  = buflen;\n    ring->datalen = datalen;\n    ring->dataoff = offset;\n    ret = 0;\n    return ret;\n}\n//write len bytes data to the ring\n//return:how many bytes has been written while -1 means something err\n//write only changes the datalen and  data in  the ring\ns32_t ring_write(tagRingBuf *ring, u8_t *buf, s32_t len)\n{\n    int ret = -1;\n    int cpylen;  //the current time we should move\n    int lenleft;  //and how many data still left to move\n    int offset;\n    unsigned char *src;\n    unsigned char *dst;\n    if((NULL == ring) || (NULL == buf) || (0 == len))\n    {\n        return ret;//which means parameters error\n    }\n    if(ring->datalen == ring->buflen)\n    {\n        ret = 0;\n        return  ret;//which means you could copy nothing here\n    }\n    ret = len > (ring->buflen - ring->datalen) ? (ring->buflen - ring->datalen) : len;\n    //now let us think the method to fill the data,take care of the roll back\n    lenleft = ret;\n    src = buf;\n    if((ring->dataoff + ring->datalen) > ring->buflen) //which means the data has roll back\n    {\n        offset = (ring->dataoff + ring->datalen) % ring->buflen; //we could move it one time\n        cpylen = lenleft;\n        dst = ring->buf + offset;\n        memcpy(dst, src, cpylen);\n        ring->datalen += cpylen;\n        lenleft -= cpylen;\n    }\n    else if((ring->dataoff + ring->datalen + lenleft) > ring->buflen) //which means the data will be roll back\n    {\n        //which means roll back,we should copy some here to the tail\n        offset = ring->dataoff + ring->datalen;\n        cpylen = ring->buflen - offset;\n        dst = ring->buf + offset;\n        memcpy(dst, src, cpylen);\n        src += cpylen;\n        ring->datalen += cpylen;\n        lenleft -= cpylen;\n    }\n    //here means we could move it by one time\n    if(lenleft > 0)\n    {\n        offset = (ring->dataoff + ring->datalen) % ring->buflen; //we could move it one time\n        cpylen = lenleft;\n        dst = ring->buf + offset;\n        memcpy(dst, src, cpylen);\n        ring->datalen += cpylen;\n    }\n    return ret;\n}\n//read len bytes data from the ring\n//return:how many bytes has been read while -1 means something err\n//read effect the offset datalen and data in the ring\ns32_t ring_read(tagRingBuf *ring, u8_t *buf, s32_t len)\n{\n    int ret = -1;\n    int cpylen;  //the current time we should move\n    int lenleft;  //and how many data still left to move\n    int offset;\n    unsigned char *src;\n    unsigned char *dst;\n    if((NULL == ring) || (NULL == buf) || (0 == len))\n    {\n        return ret;//which means parameters error\n    }\n    if(ring->datalen == 0)\n    {\n        ret = 0;\n        return  ret;//which means you could copy nothing here\n    }\n    ret = len > ring->datalen ? ring->datalen : len;\n    //now let us think the method to fill the data,take care of the roll back\n    lenleft = ret;\n    dst = buf;\n    if((ring->dataoff + lenleft) >= ring->buflen) //which means the data has roll back\n    {\n        offset = ring->dataoff; //we cpy part\n        cpylen = ring->buflen - ring->dataoff;\n        src = ring->buf + offset;\n        memcpy(dst, src, cpylen);\n        ring->dataoff = (ring->dataoff + cpylen) % ring->buflen;\n        ring->datalen -= cpylen;\n        lenleft -= cpylen;\n        dst += cpylen;\n    }\n    //here means we could move it by one time\n    if(lenleft > 0)\n    {\n        offset = ring->dataoff; //we cpy part\n        cpylen = lenleft;\n        src = ring->buf + offset;\n        memcpy(dst, src, cpylen);\n        ring->dataoff = ring->dataoff + cpylen;\n        ring->datalen -= cpylen;\n    }\n    return ret;\n}\n//check how many data in the ring while -1 means someting error\ns32_t ring_datalen(tagRingBuf *ring)\n{\n    int ret = -1;\n    if(NULL != ring)\n    {\n        ret = ring->datalen;\n    }\n    return ret;\n}\n//reset the ring\ns32_t ring_reset(tagRingBuf *ring)\n{\n    int ret = -1;\n    if(NULL != ring)\n    {\n        ring->datalen = 0;\n        ring->dataoff = 0;\n        ret = 0;\n    }\n    return ret;\n}\n//deinit the ring:-1 means something error while 0 ok\ns32_t ring_deinit(tagRingBuf *ring)\n{\n    int ret = -1;\n    if(NULL != ring)\n    {\n        memset(ring, 0, sizeof(tagRingBuf));\n        ret = 0;\n    }\n    return ret;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/ppp_port/ppppos/atcmd.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#include <stdint.h>\n#include <stddef.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"osport.h\"\n\n#define CN_IODEV_WTIMEOUT   100\n#define CN_IODEV_RTIMEOUT   100\n#ifndef bool_t\n#define bool_t int\n#define false 0\n#define true  1\n#endif\n\n#define CN_AT_LEN  128\n\n//we use this for the at command\n//usage:we use this function to deal the at result as the args format\nstatic int __getpara(char *text, char *seperate, char *argv[], int argc)\n{\n    int result;\n    char *s;\n    int len, i;\n    s = seperate;\n    len = strlen(text);\n    while(*s != '\\0') //make all the charactor in text matching the seperate to 0\n    {\n        for(i = 0; i < len; i++)\n        {\n            if(text[i] == *s)\n            {\n                text[i] = '\\0';\n            }\n        }\n        s++;\n    }\n    //ok now check the para start\n    result = 0;\n    s = text;\n    while(result < argc)\n    {\n        //jump the NULL\n        while(*s == '\\0')\n        {\n            s++;\n        }\n        //the s is the start\n        if(s < (text + len))\n        {\n            argv[result] = s;\n            result++;\n            s = s + strlen(s);\n        }\n        else\n        {\n            break;\n        }\n    }\n    return result;\n}\n\n////////////////////////////////DO THE AT COMMAND HERE//////////////////////////////////////\n//-----------------------------------------------------------------------------\n//??:use this function to do the at command and analyze\n//??:devname, the at device name,cmd:at command buf/buflen:storage the reply result(argc and argv in args mode)\n//??:\n//??:\n//??:zhangqf@??10:51:51/2017?3?23?\n//-----------------------------------------------------------------------------\n//usage:send the at command to the serial device\nint AtCmd(const char *devname, char *cmd, char *buf, int buflen, int argc, char *argv[])\n{\n    char   cmdbuf[CN_AT_LEN];\n    int    result = 0;\n    int    len = 0;\n    int    lenleft;\n    int    offset;\n    int    dev;\n    //open the at command device\n    dev = iodev_open(devname, 0, 0);\n    if(-1 == dev)\n    {\n        printf(\"%s:open %s dev failed \\n\\r\", __FUNCTION__, devname);\n        goto EXIT_OPENFAILED;\n    }\n    //flush the device\n    iodev_flush(dev);\n    //initialize the buf with the specified at command\n    memset(cmdbuf, 0, CN_AT_LEN);\n    snprintf(cmdbuf, CN_AT_LEN, \"%s\\r\\n\", cmd);//AT+CGMI\n    //write the command to the device\n    len = strlen(cmdbuf);\n    result = iodev_write(dev, (unsigned char *)cmdbuf, len, CN_IODEV_WTIMEOUT);\n    if(result != len)\n    {\n        printf(\"%s:only write %d/%d to %s \\n\\r\", __FUNCTION__, result, len, devname);\n        goto EXIT_WRITEFAILED;\n    }\n\n    //if need the result,then we will wait for the timeout\n    if((NULL != buf) && (buflen > 0))\n    {\n        //initialize the buf\n        memset(buf, 0, buflen);\n        offset = 0;\n        lenleft = buflen;\n        while(1)\n        {\n            len = iodev_read(dev, (unsigned char *)&buf[offset], lenleft, CN_IODEV_RTIMEOUT);\n            if(len > 0)\n            {\n                offset += len;\n                lenleft -= len;\n                if(offset == buflen)\n                {\n                    break;\n                }\n                else if(offset > buflen)\n                {\n                    printf(\"%s:read error--driver error\\n\\r\", __FUNCTION__);\n                }\n                else\n                {\n                    //do nothing\n                }\n            }\n            else\n            {\n                break;\n            }\n        }\n        result = offset;\n        if(offset == 0)\n        {\n            printf(\"%s:read %s error\\n\\r\", __FUNCTION__, devname);\n            goto EXIT_READFAILED;\n        }\n        else\n        {\n            memset(&buf[offset], 0, lenleft); //make the bufleft to zero\n        }\n        if((argc > 0) && (NULL != argv))\n        {\n            result = __getpara((char *)buf, \"\\n\\r\", argv, argc);\n            if(result <= 0)\n            {\n                printf(\"%s:get para failed\\n\\r\", __FUNCTION__);\n                goto EXIT_GETPARA;\n            }\n        }\n    }\n    //close the device and return\n    iodev_close(dev);\n    return result;\n\nEXIT_GETPARA:\nEXIT_READFAILED:\nEXIT_WRITEFAILED:\n    iodev_close(dev);\nEXIT_OPENFAILED:\n    return  result;\n}\n\n\n//usage:use this function to check if the string is in the argv\n//      if exit then return the position it in\nstatic int strinargs(int argc, char *argv[], char *str)\n{\n    int result = -1;\n    int i = 0;\n    while(i < argc)\n    {\n        if(strstr(argv[i], str))\n        {\n            result = i;\n            break;\n        }\n        else\n        {\n            i++;\n        }\n    }\n    return result;\n}\n\ntypedef struct\n{\n    const char *mcc_mnc;\n    const char *apndefault;\n} tagImsi;\n\ntagImsi gAtcimi[]={\\\n    {\"46000\",\"CMNET\"},\\\n    {\"46002\",\"CMNET\"},\\\n    {\"46004\",\"CMNET\"},\\\n    {\"46007\",\"CMNET\"},\\\n    {\"46001\",\"3gnet\"},\\\n    {\"46006\",\"3gnet\"},\\\n    {\"46009\",\"3gnet\"},\\\n    {\"46003\",\"ctnet\"},\\\n    {\"46005\",\"ctnet\"},\\\n    {\"46011\",\"ctlte\"},\\\n//\t\t{\"46020\",\"cmnet\"},  //not support the tietong\n};\n#define CN_CIMI_SIZE  (sizeof(gAtcimi)/sizeof(tagImsi))\n\n//usage:used to check the lte module\nstatic bool_t checkmi(char *devname, int times)\n{\n    bool_t result = false;\n    char atrcvbuf[CN_AT_LEN];\n\n    char *argv[6];\n    int   argc;\n    int   i = 0;\n    int  position;\n\n    //first we should check if the sim card inserted:at+cpin?\n    printf(\"checkcgmi:\");\n    for(i = 0; i < times; i++)\n    {\n        printf(\"%d->\", i);\n        memset(argv, 0, sizeof(argv));\n        memset(atrcvbuf, 0, sizeof(atrcvbuf));\n        argc = AtCmd(devname,\"AT+CGMI\" , atrcvbuf, CN_AT_LEN, 6, argv);\n        if(argc > 0)\n        {\n            position = strinargs(argc, argv, \"OK\");\n            if((position != 0) && (position != -1))\n            {\n                result = true;\n                break;\n            }\n        }\n        task_sleepms(1000);\n    }\n    if(result)\n    {\n        printf(\".:OK:%s\\n\\r\", argv[position - 1]);\n    }\n    else\n    {\n        printf(\".timeout!\\n\\r\");\n    }\n    return result;\n}\n//usage:used to check the module type\nstatic bool_t checkmm(char *devname, int times)\n{\n    bool_t result = false;\n    char *argv[6];\n    int   argc;\n    int   i = 0;\n    int  position;\n    char atrcvbuf[CN_AT_LEN];\n\n    //first we should check if the sim card inserted:at+cpin?\n    printf(\"checkcgmm:\");\n    for(i = 0; i < times; i++)\n    {\n        printf(\"%d->\", i);\n        memset(argv, 0, sizeof(argv));\n        memset(atrcvbuf, 0, sizeof(atrcvbuf));\n        argc = AtCmd(devname,\"AT+CGMM\",atrcvbuf,CN_AT_LEN,6,argv);\n        if(argc > 0)\n        {\n            position = strinargs(argc, argv, \"OK\");\n            if((position != 0) && (position != -1))\n            {\n                result = true;\n                break;\n            }\n        }\n        task_sleepms(1000);\n    }\n    if(result)\n    {\n        printf(\".:OK:%s\\n\\r\", argv[position - 1]);\n    }\n    else\n    {\n        printf(\".timeout!\\n\\r\");\n    }\n    return result;\n}\n//usage:used to check the module sn\nstatic bool_t checksn(char *devname, int times)\n{\n    bool_t result = false;\n    char *argv[6];\n    int   argc;\n    int   i = 0;\n    int  position;\n    char atrcvbuf[CN_AT_LEN];\n    //first we should check if the sim card inserted:at+cpin?\n    printf(\"checkcgsn:\");\n    for(i = 0; i < times; i++)\n    {\n        printf(\"%d->\", i);\n        memset(argv, 0, sizeof(argv));\n        memset(atrcvbuf, 0, sizeof(atrcvbuf));\n        argc = AtCmd(devname,\"AT+CGSN\",atrcvbuf,CN_AT_LEN,6,argv);\n        if(argc > 0)\n        {\n            position = strinargs(argc, argv, \"OK\");\n            if((position != 0) && (position != -1))\n            {\n                result = true;\n                break;\n            }\n        }\n        task_sleepms(1000);\n\n    }\n    if(result)\n    {\n        printf(\".:OK:%s\\n\\r\", argv[position - 1]);\n    }\n    else\n    {\n        printf(\".timeout!\\n\\r\");\n    }\n    return result;\n}\n//usage:used to check the module sn\nstatic bool_t checkmr(char *devname, int times)\n{\n    bool_t result = false;\n    char *argv[6];\n    int   argc;\n    int   i = 0;\n    int  position;\n    char atrcvbuf[CN_AT_LEN];\n    //first we should check if the sim card inserted:at+cpin?\n    printf(\"checkcgmr:\");\n    for(i = 0; i < times; i++)\n    {\n        printf(\"%d->\", i);\n        memset(argv, 0, sizeof(argv));\n        memset(atrcvbuf, 0, sizeof(atrcvbuf));\n        argc = AtCmd(devname,\"AT+CGMR\",atrcvbuf,CN_AT_LEN,6,argv);\n        if(argc > 0)\n        {\n            position = strinargs(argc, argv, \"OK\");\n            if((position != 0) && (position != -1))\n            {\n                result = true;\n                break;\n            }\n        }\n        task_sleepms(1000);\n\n    }\n    if(result)\n    {\n        printf(\".:OK:%s\\n\\r\", argv[position - 1]);\n    }\n    else\n    {\n        printf(\".timeout!\\n\\r\");\n    }\n    return result;\n}\n//usage:used to check sim card mnc\nstatic tagImsi *checkcimi(char *devname, int times, char *simapn)\n{\n    char *argv[6];\n    int   argc;\n    int   i = 0, tmp = 0;\n    int  position = -1;\n    char atrcvbuf[CN_AT_LEN];\n    //find the mnc here\n    tagImsi *result = NULL;\n    //first we should check if the sim card inserted:at+cpin?\n    printf(\"checkcimi:\");\n    for(i = 0; i < times; i++)\n    {\n        printf(\"%d->\", i);\n        memset(argv, 0, sizeof(argv));\n        memset(atrcvbuf, 0, sizeof(atrcvbuf));\n        argc = AtCmd(devname,\"AT+CIMI\",atrcvbuf,CN_AT_LEN,6,argv);\n        if(argc > 0)\n        {\n            position = strinargs(argc, argv, \"OK\");\n            if((position != 0) && (position != -1))\n            {\n                char mnc[6];\n                memset(mnc, 0, 6);\n                memcpy(mnc, argv[position - 1], 5);\n                for(tmp = 0; tmp < CN_CIMI_SIZE; tmp++)\n                {\n                    if(0 == strcmp(mnc, gAtcimi[tmp].mcc_mnc))\n                    {\n                        result = &gAtcimi[tmp];\n                        if( (simapn == NULL) || (simapn[0] == '\\0') )\n                            printf(\".:OK:cimi:%s apn:%s\\n\\r\", argv[position - 1], result->apndefault);\n                        else\n                            printf(\".:OK:cimi:%s apn:%s\\n\\r\", argv[position - 1], simapn);\n                        break;\n                    }\n                }\n                if(NULL == result)\n                {\n                    printf(\".:OK:cimi:%s apn:%s\\n\\r\", argv[position - 1], \"unknown\");\n                }\n                break;\n            }\n        }\n        task_sleepms(1000);\n\n    }\n    if((position == 0) || (position == -1))\n    {\n        printf(\".timeout!\\n\\r\");\n    }\n    return result;\n}\n//usage:used to check if the simcard is inserted\nstatic bool_t checkcpin(char *devname, int times)\n{\n    bool_t result = false;\n    char *argv[6];\n    int   argc;\n    int   i = 0;\n    char atrcvbuf[CN_AT_LEN];\n    //first we should check if the sim card inserted:at+cpin?\n    printf(\"checkcpin:\");\n    for(i = 0; i < times; i++)\n    {\n        printf(\"%d->\", i);\n        memset(argv, 0, sizeof(argv));\n        memset(atrcvbuf, 0, sizeof(atrcvbuf));\n        argc = AtCmd(devname,\"AT+CPIN?\",atrcvbuf,CN_AT_LEN,6,argv);\n        if(argc > 0)\n        {\n            if(-1 != strinargs(argc, argv, \"READY\"))\n            {\n                result = true;\n                break;\n            }\n        }\n        task_sleepms(1000);\n    }\n    if(result)\n    {\n        printf(\".:OK\\n\\r\");\n    }\n    else\n    {\n        printf(\".timeout!\\n\\r\");\n    }\n    return result;\n}\n\n//usage:used to check if the net is registered\nstatic bool_t  checkcgreg(char *devname, int times)\n{\n    bool_t result = false;\n    char *argv[6];\n    int   argc;\n    int   i = 0;\n    char atrcvbuf[CN_AT_LEN];\n    //first we should check if the sim card inserted:at+cpin?\n    printf(\"checkcreg:\");\n    for(i = 0; i < times; i++)\n    {\n        printf(\"%d->\", i);\n        memset(argv, 0, sizeof(argv));\n        memset(atrcvbuf, 0, sizeof(atrcvbuf));\n        argc = AtCmd(devname,\"AT+CGREG?\",atrcvbuf,CN_AT_LEN,6,argv);\n        if(argc > 0)\n        {\n            if((-1 != strinargs(argc, argv, \",1\")) || (-1 != strinargs(argc, argv, \",5\")))\n            {\n                result = true;\n                break;\n            }\n        }\n    }\n    if(result)\n    {\n        printf(\".:OK\\n\\r\");\n    }\n    else\n    {\n        printf(\".timeout!\\n\\r\");\n    }\n    return result;\n}\n//usage:used to set the apn:set the apn\nstatic bool_t  setnetapn(char *devname, char *apn, int times)\n{\n    bool_t result = false;\n    char *argv[6];\n    int   argc;\n    int   i = 0;\n    char atrcvbuf[CN_AT_LEN];\n    printf(\"setapn:\");\n    for(i = 0; i < times; i++)\n    {\n        printf(\"%d->\", i);\n        memset(argv, 0, sizeof(argv));\n        memset(atrcvbuf, 0, sizeof(atrcvbuf));\n        char cgdcont[64];\n        memset(cgdcont, 0, 64);\n        snprintf(cgdcont,63,\"%s%s%s%s\",\"AT+CGDCONT=1,\\\"IP\\\",\",\"\\\"\",apn,\"\\\"\");\n        argc = AtCmd(devname, cgdcont, atrcvbuf, CN_AT_LEN, 6, argv);\n        if(argc > 0)\n        {\n            if((-1 != strinargs(argc, argv, \"OK\")) || (-1 != strinargs(argc, argv, \"ok\")))\n            {\n                result = true;\n                break;\n            }\n        }\n        task_sleepms(1000);\n    }\n    if(result)\n    {\n        printf(\".ready!\\n\\r\");\n    }\n    else\n    {\n        printf(\".timeout!\\n\\r\");\n    }\n    return result;\n}\n\n//usage:used to call the data connection,form now on, we will change to data mode,any at command will be invalid\nstatic bool_t  atdcall(char *devname, int times)\n{\n    bool_t result = false;\n    char *argv[6];\n    int   argc;\n    int   i = 0;\n    char atrcvbuf[CN_AT_LEN];\n    printf(\"atdcall:\");\n    for(i = 0; i < times; i++)\n    {\n        printf(\"%d->\", i);\n        memset(argv, 0, sizeof(argv));\n        memset(atrcvbuf, 0, sizeof(atrcvbuf));\n        argc = AtCmd(devname,\"ATD*99***1#\",atrcvbuf,CN_AT_LEN,6,argv);\n        if(argc > 0)\n        {\n            if((-1 != strinargs(argc, argv, \"CONNECT\")) || (-1 != strinargs(argc, argv, \"connect\")))\n            {\n                result = true;\n                break;\n            }\n        }\n        task_sleepms(1000);\n    }\n    if(result)\n    {\n        printf(\".ready!\\n\\r\");\n    }\n    else\n    {\n        printf(\".timeout!\\n\\r\");\n    }\n    return result;\n}\n\nstatic bool_t atgetsignal(char *devname, int *signal)\n{\n    bool_t ret = false;\n    char *argv[6];\n    int   argc;\n    int   position = -1;\n    char atrcvbuf[CN_AT_LEN];\n    int   result = -1;\n    memset(argv, 0, sizeof(argv));\n    memset(atrcvbuf, 0, sizeof(atrcvbuf));\n    argc = AtCmd(devname,\"AT+CSQ\",atrcvbuf,CN_AT_LEN,6,argv);\n    if(argc > 0)\n    {\n        position = strinargs(argc, argv, \"OK\");\n        if((position != 0) && (position != -1))\n        {\n            sscanf(argv[position - 1], \"+CSQ: %d\", &result);\n        }\n        else\n        {\n            result = -1;\n        }\n    }\n    if(NULL != signal)\n    {\n        *signal = result;\n    }\n    if(result > 0)\n    {\n        ret = true;\n    }\n    return ret;\n}\n//usage:this function used to check the modem state and change the modem state from at to data\nint AtDial(char *devname, char *apn)\n{\n    bool_t result = false;\n    int  ret = -1;\n    char  *simapn;\n    simapn = apn;\n    printf(\"ATCMD CALL BEGIN:\\n\\r\");\n    //first we should check the module type\n    result = checkmi(devname, 32);\n    if(result == false)\n    {\n        return ret;\n    }\n    //check the signal\n    result = atgetsignal(devname, NULL);\n    if(result == false)\n    {\n        return ret;\n    }\n\n    //check the mm\n    result = checkmm(devname, 32);\n    if(result == false)\n    {\n        return ret;\n    }\n    //check the mr\n    result = checkmr(devname, 32);\n    if(result == false)\n    {\n        return ret;\n    }\n    //check the sn\n    result = checksn(devname, 32);\n    if(result == false)\n    {\n        return ret;\n    }\n    //first we should check if the sim card inserted:at+cpin?\n    result = checkcpin(devname, 32);\n    if(result == false)\n    {\n        return ret;\n    }\n    //check the apn here\n    if((NULL == simapn) || (simapn[0] == '\\0'))\n    {\n        //do check our self\n        tagImsi *imsi;\n        imsi = checkcimi(devname, 32, NULL);\n        if(NULL == imsi)\n        {\n            result = false ;\n            return ret;\n        }\n        else\n        {\n            simapn = (char *)imsi->apndefault;\n        }\n    }\n    else\n    {\n        checkcimi(devname, 32, simapn);\n    }\n    //check if we has register the sim card to the carrieroperator\n    result = checkcgreg(devname, 32);\n    if(result == false)\n    {\n        return result;\n    }\n    //OK,now set the apn to the carrieroperator\n    result = setnetapn(devname, simapn, 32);\n    if(result == false)\n    {\n        return result;\n    }\n    //now we begin to atd(call the data service)\n    result = atdcall(devname, 32);\n    if(result == false)\n    {\n        return ret;\n    }\n    //for the end\n    ret = 0;\n    return ret;\n}\n\n\n\n\n\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/lwip/ppp_port/ppppos/demo.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n/*\nPPP interface for lwIP\n\nAuthor: Sylvain Rochet\n\nTable of Contents:\n- Supported PPP protocols and features\n- Raw API PPP example for all protocols\n- PPPoS input path (raw API, IRQ safe API, TCPIP API)\n- Thread safe PPP API (PPPAPI)\n- Notify phase callback (PPP_NOTIFY_PHASE)\n- Upgrading from lwIP <= 1.4.x to lwIP >= 2.0.x\nSupported PPP protocols and features\n======================================\n\nSupported Low level protocols:\n* PPP over serial using HDLC-like framing, such as wired dialup modems\n  or mobile telecommunications GPRS/EDGE/UMTS/HSPA+/LTE modems\n* PPP over Ethernet, such as xDSL modems\n* PPP over L2TP (Layer 2 Tunneling Protocol) LAC (L2TP Access Concentrator),\n  IP tunnel over UDP, such as VPN access\n\nSupported auth protocols:\n* PAP, Password Authentication Protocol\n* CHAP, Challenge-Handshake Authentication Protocol, also known as CHAP-MD5\n* MSCHAPv1, Microsoft version of CHAP, version 1\n* MSCHAPv2, Microsoft version of CHAP, version 2\n* EAP, Extensible Authentication Protocol\n\nSupported address protocols:\n* IPCP, IP Control Protocol, IPv4 addresses negotiation\n* IP6CP, IPv6 Control Protocol, IPv6 link-local addresses negotiation\n\nSupported encryption protocols:\n* MPPE, Microsoft Point-to-Point Encryption\n\nSupported compression or miscellaneous protocols, for serial links only:\n* PFC, Protocol Field Compression\n* ACFC, Address-and-Control-Field-Compression\n* ACCM, Asynchronous-Control-Character-Map\n* VJ, Van Jacobson TCP/IP Header Compression\n\n*/\n\n#if USE_PPPOS\n\n#include \"netif/ppp/ppp.h\"\n#include \"netif/ppp/pppapi.h\"\n#include \"netif/ppp/pppos.h\"\n\n\nint gPppRcvMode = 0;\nint gConnect = 0;\n\nu32_t sys_jiffies(void)\n{\n    UINT32 ret;\n    extern UINT64      g_ullTickCount;\n\n    ret = (UINT32)g_ullTickCount;\n    return ret;\n}\n#include \"osport.h\"\n\n\n/* The PPP control block */\nppp_pcb *ppp;\n\n/* The PPP IP interface */\nstruct netif ppp_netif;\n\n/* //PPP status callback  ??????\n * PPP status callback  ??????\n * ===================\n *\n * PPP status callback is called on PPP status change (up, down, ? from lwIP\n * core thread\n */\nextern const ip_addr_t *dns_getserver(u8_t numdns);\n/* PPP status callback example */\nstatic void status_cb(ppp_pcb *pcb, int err_code, void *ctx)\n{\n    struct netif *pppif = ppp_netif(pcb);\n    LWIP_UNUSED_ARG(ctx);\n\n    switch(err_code)\n    {\n    case PPPERR_NONE:\n    {\n#if LWIP_DNS\n        const ip_addr_t *ns;\n#endif /* LWIP_DNS */\n        printf(\"status_cb: Connected\\n\");\n#if PPP_IPV4_SUPPORT\n        printf(\"   our_ipaddr  = %s\\n\", ipaddr_ntoa(&pppif->ip_addr));\n        printf(\"   his_ipaddr  = %s\\n\", ipaddr_ntoa(&pppif->gw));\n        printf(\"   netmask     = %s\\n\", ipaddr_ntoa(&pppif->netmask));\n#if LWIP_DNS\n        ns = dns_getserver(0);\n        printf(\"   dns1        = %s\\n\", ipaddr_ntoa(ns));\n        ns = dns_getserver(1);\n        printf(\"   dns2        = %s\\n\", ipaddr_ntoa(ns));\n        gConnect = 1;\n#endif /* LWIP_DNS */\n#endif /* PPP_IPV4_SUPPORT */\n#if PPP_IPV6_SUPPORT\n        printf(\"   our6_ipaddr = %s\\n\", ip6addr_ntoa(netif_ip6_addr(\n                    pppif, 0)));\n#endif /* PPP_IPV6_SUPPORT */\n        break;\n    }\n    case PPPERR_PARAM:\n    {\n        printf(\"status_cb: Invalid parameter\\n\");\n        break;\n    }\n    case PPPERR_OPEN:\n    {\n        printf(\"status_cb: Unable to open PPP session\\n\");\n        break;\n    }\n    case PPPERR_DEVICE:\n    {\n        printf(\"status_cb: Invalid I/O device for PPP\\n\");\n        break;\n    }\n    case PPPERR_ALLOC:\n    {\n        printf(\"status_cb: Unable to allocate resources\\n\");\n        break;\n    }\n    case PPPERR_USER:\n    {\n        printf(\"status_cb: User interrupt\\n\");\n        break;\n    }\n    case PPPERR_CONNECT:\n    {\n        printf(\"status_cb: Connection lost\\n\");\n        break;\n    }\n    case PPPERR_AUTHFAIL:\n    {\n        printf(\"status_cb: Failed authentication challenge\\n\");\n        break;\n    }\n    case PPPERR_PROTOCOL:\n    {\n        printf(\"status_cb: Failed to meet protocol\\n\");\n        break;\n    }\n    case PPPERR_PEERDEAD:\n    {\n        printf(\"status_cb: Connection timeout\\n\");\n        break;\n    }\n    case PPPERR_IDLETIMEOUT:\n    {\n        printf(\"status_cb: Idle Timeout\\n\");\n        break;\n    }\n    case PPPERR_CONNECTTIME:\n    {\n        printf(\"status_cb: Max connect time reached\\n\");\n        break;\n    }\n    case PPPERR_LOOPBACK:\n    {\n        printf(\"status_cb: Loopback detected\\n\");\n        break;\n    }\n    default:\n    {\n        printf(\"status_cb: Unknown error code %d\\n\", err_code);\n        break;\n    }\n    }\n\n    /*\n     * This should be in the switch case, this is put outside of the switch\n     * case for example readability.\n     */\n\n    if (err_code == PPPERR_NONE)\n    {\n        return;\n    }\n\n    /* ppp_close() was previously called, don't reconnect */\n    if (err_code == PPPERR_USER)\n    {\n        /* ppp_free(); -- can be called here */\n        return;\n    }\n\n    /*\n     * Try to reconnect in 30 seconds, if you need a modem chatscript you have\n     * to do a much better signaling here ;-)\n     */\n    ppp_connect(pcb, 30);\n    /* OR ppp_listen(pcb); */\n}\nstatic u32_t output_cb(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx)\n{\n    return iodev_write(0, data, len, 100);\n}\n\n\nvoid *main_pppinput(unsigned int args)\n{\n    int ret;\n    unsigned char buf[256];\n    while(1)\n    {\n        if(gPppRcvMode)\n        {\n            iodev_debugmode(2, 2);\n            ret = iodev_read(0, buf, 256, 10);\n            if(ret > 0)\n            {\n                pppos_input(ppp, (unsigned char *)buf, ret);\n            }\n        }\n    }\n}\nVOID *main_ppp(UINT32  args)\n{\n    /* Initilialize the LwIP stack without RTOS */\n    tcpip_init(NULL, NULL);\n\n    //here we make the modem to data mode\n    iodev_debugmode(2, 1);\n    extern int AtDial(char *devname, char *apn);\n    while(0 != AtDial(\"uart3\", NULL))\n    {\n    }\n    ppp = pppos_create(&ppp_netif, (pppos_output_cb_fn)output_cb, status_cb, NULL);\n    if(NULL != ppp)\n    {\n        extern void *main_pppinput(unsigned int args);\n        task_create(\"main_pppinput\", main_pppinput, 0x800, NULL, NULL, 0);\n\n        /* Set this interface as default route */\n        ppp_set_default(ppp);\n        /* Ask the peer for up to 2 DNS server addresses. */\n        ppp_set_usepeerdns(ppp, 1);\n\n        /* Auth configuration, this is pretty self-explanatory */\n        ppp_set_auth(ppp, PPPAUTHTYPE_ANY, \"login\", \"password\");\n        gPppRcvMode = 1;\n        u16_t holdoff = 0;\n        ppp_connect(ppp, holdoff);\n        while(gConnect == 0) //wait to do the connect\n        {\n            LOS_TaskDelay(10);\n        }\n        extern void agent_tiny_entry(void);\n        agent_tiny_entry();\n        ppp_free(ppp);\n    }\n\n\n    return NULL;\n}\n#endif\n\n\n\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/net/sal/atiny_socket.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"sal/atiny_socket.h\"\n#include \"osdepends/atiny_osdep.h\"\n\n\n#if defined(WITH_LINUX)\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <netdb.h>\n#include <errno.h>\n#elif defined(WITH_LWIP)\n#include \"lwip/sockets.h\"\n#include \"lwip/netdb.h\"\n#include \"lwip/errno.h\"\n#elif defined(WITH_AT_FRAMEWORK)\n#include \"at_frame/at_api.h\"\n\n#else\n// TODO\n#endif\n\n#define SOCKET_DEBUG\n\n#if defined(SOCKET_DEBUG)\n#define SOCKET_LOG(fmt, ...) \\\n    do \\\n    { \\\n        (void)atiny_printf(\"[SOCKET][%s:%d] \" fmt \"\\r\\n\", \\\n        __FUNCTION__, __LINE__, ##__VA_ARGS__); \\\n    } while(0)\n#else\n#define SOCKET_LOG(fmt, ...) ((void)0)\n#endif\n\n\ntypedef struct\n{\n    int fd;\n} atiny_net_context;\n\nvoid *atiny_net_bind(const char *host, const char *port, int proto)\n{\n#if defined (WITH_LWIP) || defined (WITH_LINUX)\n    (void)host;\n    (void)port;\n    (void)proto;\n    return NULL;\n/*\n    struct sockaddr_in sock_addr;\n    int port_i;\n    int ret = ATINY_NET_ERR;\n\n    if (NULL == port || (proto != ATINY_PROTO_UDP && proto != ATINY_PROTO_TCP))\n        return NULL;\n\n    ctx = atiny_malloc(sizeof(atiny_net_context));\n\n    sscanf(port , \"%d\", &port_i);\n    sock_addr.sin_family = AF_INET;\n    sock_addr.sin_port = lwip_htons(port_i);\n    sock_addr.sin_addr.s_addr = (host == NULL ? IPADDR_ANY : inet_addr(host));\n    sock_addr.sin_len = sizeof(struct sockaddr_in);\n\n    ctx->fd = socket(AF_INET,\n        proto == ATINY_PROTO_TCP ? SOCK_STREAM : SOCK_DGRAM,\n        proto == ATINY_PROTO_TCP ? IPPROTO_TCP : IPPROTO_UDP);\n\n    if (ctx->fd < 0)\n    {\n        ret = ATINY_NET_SOCKET_FAILED;\n        atiny_free(ctx);\n        return NULL;\n    }\n\n\tint n = 1;\n\tif( (ret = setsockopt( ctx->fd, SOL_SOCKET, SO_REUSEADDR,\n\t\t\t\t\t(const char *) &n, sizeof( n )) ) != 0 )\n\t{\n\t\tret = ATINY_NET_SOCKET_FAILED;\n\t\tgoto exit_failed;\n\t}\n\n    ret = bind(ctx->fd, (struct sockaddr*)&sock_addr, sizeof(struct sockaddr));\n    if (ret < 0)\n    {\n       ret = ATINY_NET_BIND_FAILED;\n       goto exit_failed;\n    }\n\n    if (proto == ATINY_PROTO_TCP)\n    {\n        ret = listen(ctx->fd, 20);\n        if (ret < 0)\n        {\n            ret = ATINY_NET_LISTEN_FAILED;\n            goto exit_failed;\n        }\n    }\n\n    return ctx;\n\nexit_failed:\n       close(ctx->fd);\n       atiny_free(ctx);\n       return NULL;\n       */\n\n\n#elif defined(WITH_AT_FRAMEWORK)\n    atiny_net_context *ctx;\n    ctx = atiny_malloc(sizeof(atiny_net_context));\n    if (NULL == ctx)\n    {\n    \tSOCKET_LOG(\"malloc failed for socket context\");\n    \treturn NULL;\n    }\n\n    ctx->fd = at_api_bind(host, port, proto);\n    if (ctx->fd < 0)\n    {\n    \tSOCKET_LOG(\"unkown host or port\");\n    \tatiny_free(ctx);\n    \tctx = NULL;\n    }\n\t\treturn ctx;\n#endif\n\n}\nint atiny_net_accept( void *bind_ctx, void *client_ctx, void *client_ip, size_t buf_size, size_t *ip_len )\n{\n#if defined (WITH_LWIP) || defined (WITH_LINUX)\n    int bind_fd = ((atiny_net_context*)bind_ctx)->fd;\n    int client_fd = ((atiny_net_context*)client_ctx)->fd;\n    int type;\n    int ret = ATINY_NET_ERR;\n#if LWIP_IPV4 && LWIP_IPV6\n#elif LWIP_IPV6\n    struct sockaddr_in6 client_addr;\n#else\n    struct sockaddr_in client_addr;\n#endif\n    socklen_t type_len, client_addr_len;\n\n    type_len = sizeof(type);\n    if (getsockopt(bind_fd, SOL_SOCKET, SO_TYPE, (void*)&type, &type_len) != 0 ||\n        (type != SOCK_STREAM && type != SOCK_DGRAM))\n    {\n        return ATINY_NET_ACCEPT_FAILED;\n    }\n#if LWIP_IPV4 && LWIP_IPV6\n#elif LWIP_IPV6\n    client_addr_len = sizeof(struct sockaddr_in6);\n#else\n    client_addr_len = sizeof(struct sockaddr_in);\n#endif\n    if (type == SOCK_STREAM)\n    {\n        ret = client_fd = accept(bind_fd, (struct sockaddr*)&client_addr, &client_addr_len);\n    }\n    else\n    {\n        //udp\n        char buf[1] = {0};\n        ret = recvfrom(bind_fd, buf, sizeof(buf), MSG_PEEK, (struct sockaddr*)&client_addr, &client_addr_len);\n    }\n\n    if (ret < 0)\n        return ATINY_NET_ACCEPT_FAILED;\n    if (type != SOCK_STREAM)\n    {\n#if LWIP_IPV4 && LWIP_IPV6\n#elif LWIP_IPV6\n        struct sockaddr_in6  local_addr;\n        socklen_t n = sizeof(struct sockaddr_in6);\n#else\n        struct sockaddr_in  local_addr;\n        socklen_t n = sizeof(struct sockaddr_in);\n#endif\n        char port_s[6] = {0};\n        int one = 1; \n        \n        ((atiny_net_context*)client_ctx)->fd = client_fd = bind_fd;\n        ((atiny_net_context*)bind_ctx)->fd = bind_fd = -1;\n\n        if (connect(client_fd, (struct sockaddr *)&client_addr, client_addr_len) != 0)\n            return ATINY_NET_ACCEPT_FAILED;\n\n        ret = getsockname(client_fd, (struct sockaddr*)&local_addr, &n);\n#if LWIP_IPV4 && LWIP_IPV6\n#elif LWIP_IPV6\n        snprintf(port_s, sizeof(port_s), \"%d\", ntohs(local_addr.sin6_port));\n        ((atiny_net_context*)bind_ctx)->fd = socket(local_addr.sin6_family, SOCK_DGRAM, IPPROTO_UDP);\n#else\n        snprintf(port_s, sizeof(port_s), \"%d\", ntohs(local_addr.sin_port));\n        ((atiny_net_context*)bind_ctx)->fd = socket(local_addr.sin_family, SOCK_DGRAM, IPPROTO_UDP);\n#endif \n        if( (ret = setsockopt( ((atiny_net_context*)bind_ctx)->fd, SOL_SOCKET, SO_REUSEADDR,\n\t\t\t\t\t(const char *) &one, sizeof( one )) ) != 0 )\n    \t{\n    \t\tret = ATINY_NET_SOCKET_FAILED;\n    \t}\n\n        if (ret != 0)\n            return ret;\n    }\n\n    if (client_ip != NULL)\n    {\n#if LWIP_IPV4 && LWIP_IPV6\n#elif LWIP_IPV6\n        if( client_addr.sin6_family == AF_INET6 )\n        {\n            struct sockaddr_in6 *addr = (struct sockaddr_in6 *) &client_addr;\n            *ip_len = sizeof( addr->sin6_addr.s6_addr );\n\n            if( buf_size < *ip_len )\n                return( ATINY_NET_BUF_SMALL_FAILED );\n\n            memcpy( client_ip, &addr->sin6_addr.s6_addr, *ip_len );\n        }\n#else\n        if( client_addr.sin_family == AF_INET )\n        {\n            struct sockaddr_in *addr = (struct sockaddr_in *) &client_addr;\n            *ip_len = sizeof( addr->sin_addr.s_addr );\n\n            if( buf_size < *ip_len )\n                return( ATINY_NET_BUF_SMALL_FAILED );\n\n            memcpy( client_ip, &addr->sin_addr.s_addr, *ip_len );\n        }\n#endif\n    }\n#else\n    ((atiny_net_context*)client_ctx)->fd = ((atiny_net_context*)bind_ctx)->fd;\n#endif\n    return 0;\n}\n\nvoid *atiny_net_connect(const char *host, const char *port, int proto)\n{\n    atiny_net_context *ctx = NULL;\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\n    int flags;\n    int ret;\n    struct addrinfo hints;\n    struct addrinfo *addr_list;\n    struct addrinfo *cur;\n#endif\n\n    //if (NULL == host || NULL == port ||\n    if (NULL == port ||\n            (proto != ATINY_PROTO_UDP && proto != ATINY_PROTO_TCP))\n    {\n        SOCKET_LOG(\"ilegal incoming parameters,(%p,%p,%d)\",host,port,proto);\n        return NULL;\n    }\n\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\n\n    /* Do name resolution with both IPv6 and IPv4 */\n    memset(&hints, 0, sizeof(hints));\n    hints.ai_family = AF_UNSPEC;\n    hints.ai_socktype = proto == ATINY_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;\n    hints.ai_protocol = proto == ATINY_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;\n\n    SOCKET_LOG(\"try to do name resolution now...\");\n\n    if ((ret = getaddrinfo(host, port, &hints, &addr_list)) != 0)\n    {\n        SOCKET_LOG(\"getaddrinfo failed: 0x%x\", ret);\n        return NULL;\n    }\n\n    SOCKET_LOG(\"do name resolution succeed\");\n\n    ctx = atiny_malloc(sizeof(atiny_net_context));\n\n    if (NULL == ctx)\n    {\n        SOCKET_LOG(\"malloc failed for socket context\");\n        freeaddrinfo(addr_list);\n        return NULL;\n    }\n\n    ctx->fd = -1;\n\n    /* Try the sockaddrs until a connection succeeds */\n    for (cur = addr_list; cur != NULL; cur = cur->ai_next)\n    {\n        ctx->fd = socket(cur->ai_family, cur->ai_socktype, cur->ai_protocol);\n\n        if (ctx->fd < 0)\n        {\n            continue;\n        }\n\n        if (proto == ATINY_PROTO_UDP)\n        {\n            flags = fcntl(ctx->fd, F_GETFL, 0);\n\n            if (flags < 0 || fcntl(ctx->fd, F_SETFL, flags | O_NONBLOCK) < 0)\n            {\n                close(ctx->fd);\n                ctx->fd = -1;\n                continue;\n            }\n        }\n\n        if (connect(ctx->fd, cur->ai_addr, cur->ai_addrlen) == 0)\n        {\n            break;\n        }\n\n        close(ctx->fd);\n        ctx->fd = -1;\n    }\n\n    freeaddrinfo(addr_list);\n\n    if (ctx->fd < 0)\n    {\n        SOCKET_LOG(\"unkown host or port\");\n        atiny_free(ctx);\n        return NULL;\n    }\n\n    if (proto == ATINY_PROTO_UDP)\n    {\n        SOCKET_LOG(\"UDP create socket and bind to server finished\");\n    }\n    else /* proto == ATINY_PROTO_TCP */\n    {\n        SOCKET_LOG(\"TCP connect to server succeed\");\n    }\n#elif defined(WITH_AT_FRAMEWORK)\n    ctx = atiny_malloc(sizeof(atiny_net_context));\n    if (NULL == ctx)\n    {\n        SOCKET_LOG(\"malloc failed for socket context\");\n        return NULL;\n    }\n\n    ctx->fd = at_api_connect(host, port, proto);\n    if (ctx->fd < 0)\n    {\n        SOCKET_LOG(\"unkown host or port\");\n        atiny_free(ctx);\n        ctx = NULL;\n    }\n#elif defined(WITH_WIZNET)\n    ctx = atiny_malloc(sizeof(atiny_net_context));\n    if (NULL == ctx)\n    {\n        SOCKET_LOG(\"malloc failed for socket context\");\n        return NULL;\n    }\n\n    ctx->fd = wiznet_connect(host, port, proto);\n    if (ctx->fd < 0)\n    {\n        SOCKET_LOG(\"unkown host or port\");\n        atiny_free(ctx);\n        ctx = NULL;\n    }\n#else\n#endif\n    return ctx;\n}\n\nint atiny_net_recv(void *ctx, unsigned char *buf, size_t len)\n{\n    int ret = -1;\n    int fd = ((atiny_net_context *)ctx)->fd;\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\n    ret = recv(fd, buf, len, 0);\n#elif defined(WITH_AT_FRAMEWORK)\n    ret = at_api_recv(fd, buf, len);\n#elif defined(WITH_WIZNET)\n    ret = wiznet_recv(fd, buf, len);\n#else\n    (void)fd; //clear unuse warning\n#endif\n\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\n    if (ret < 0)\n    {\n        if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)\n        {\n            SOCKET_LOG(\"no data available for now\");\n            return 0;\n        }\n        else\n        {\n            SOCKET_LOG(\"error accured when recv: 0x%x\", errno);\n            return -1;\n        }\n    }\n\n    else if (ret == 0)\n    {\n        SOCKET_LOG(\"socket was closed by peer\");\n        return -1;\n    }\n#endif\n    return ret;\n}\n\nint atiny_net_recv_timeout(void *ctx, unsigned char *buf, size_t len,\n                           uint32_t timeout)\n{\n    int ret = -1;\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\n    struct timeval tv;\n    fd_set read_fds;\n#endif\n\n    int fd = ((atiny_net_context *)ctx)->fd;\n\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\n    if (fd < 0)\n    {\n        SOCKET_LOG(\"ilegal socket(%d)\", fd);\n        return ATINY_NET_ERR;\n    }\n\n    FD_ZERO(&read_fds);\n    FD_SET(fd, &read_fds);\n\n    tv.tv_sec  = timeout / 1000;\n    tv.tv_usec = (timeout % 1000) * 1000;\n\n   ret = select(fd + 1, &read_fds, NULL, NULL, &tv);\n\n    if (ret == 0)\n    {\n       // SOCKET_LOG(\"recv timeout\");\n        return ATINY_NET_TIMEOUT;\n    }\n\n    if(ret < 0)\n    {\n        SOCKET_LOG(\"select error ret=%d,err 0x%x\", ret, errno);\n        return ATINY_NET_ERR;\n    }\n\n    ret = atiny_net_recv(ctx, buf, len);\n\n#elif defined(WITH_AT_FRAMEWORK)\n    ret = at_api_recv_timeout(fd, buf, len, NULL,NULL,timeout);\n#elif defined(WITH_WIZNET)\n    ret = wiznet_recv_timeout(fd, buf, len, timeout);\n#else\n    (void)fd; //clear unuse warning\n#endif\n    return ret;\n}\n\nint atiny_net_send(void *ctx, const unsigned char *buf, size_t len)\n{\n    int ret = -1;\n    int fd = ((atiny_net_context *)ctx)->fd;\n\n    if (fd < 0)\n    {\n        SOCKET_LOG(\"ilegal socket(%d)\", fd);\n        return -1;\n    }\n\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\n    ret = send(fd, buf, len, 0);\n#elif defined(WITH_AT_FRAMEWORK)\n    ret = at_api_send(fd, buf, len);\n#elif defined(WITH_WIZNET)\n    ret = wiznet_send(fd, buf, len);\n#else\n#endif\n\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\n    if (ret < 0)\n    {\n        /* no data available for now */\n        if (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)\n        {\n            return 0;\n        }\n        else\n        {\n            SOCKET_LOG(\"error accured when send: 0x%x\", errno);\n            return -1;\n        }\n    }\n#endif\n\n    return ret;\n}\n\nvoid atiny_net_close(void *ctx)\n{\n    int fd = ((atiny_net_context *)ctx)->fd;\n\n    if (fd >= 0)\n    {\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\n        close(fd);\n#elif defined(WITH_AT_FRAMEWORK)\n        at_api_close(fd);\n#elif defined(WITH_WIZNET)\n        wiznet_close(fd);\n#endif\n    }\n\n    atiny_free(ctx);\n}\n\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\nstatic int atiny_net_write_sock(void *ctx, const unsigned char *buffer, int len, uint32_t timeout_ms)\n{\n    int fd;\n    struct timeval interval = {timeout_ms / 1000, (timeout_ms % 1000) * 1000};\n\n    fd = ((atiny_net_context *)ctx)->fd;\n    if (interval.tv_sec < 0 || (interval.tv_sec == 0 && interval.tv_usec <= 0))\n    {\n        interval.tv_sec = 0;\n        interval.tv_usec = 100;\n    }\n\n    setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&interval, sizeof(struct timeval));\n    return write(fd, buffer, len);\n}\n#endif\n\nint atiny_net_send_timeout(void *ctx, const unsigned char *buf, size_t len,\n                          uint32_t timeout)\n{\n#if defined(WITH_LINUX) || defined(WITH_LWIP)\n    return atiny_net_write_sock(ctx, buf, len, timeout);\n#elif defined(WITH_AT_FRAMEWORK)\n        int fd;\n        fd = ((atiny_net_context *)ctx)->fd;\n        return at_api_send(fd , buf, (uint32_t)len);\n#endif\n\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/flag_operate/flag_manager.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include <stddef.h>\n#include <string.h>\n#include \"flag_manager.h\"\n\nstatic flag_op_s g_flag_op;\n\n#define FLASH_UNIT_SIZE (256)\n#define FLASH_FLAG_SIZE (512)\n\nint flag_init(flag_op_s *flag)\n{\n    if (NULL == flag\n        || NULL == flag->func_flag_read\n        || NULL == flag->func_flag_write)\n    return -1;\n\n    g_flag_op.func_flag_read = flag->func_flag_read;\n    g_flag_op.func_flag_write = flag->func_flag_write;\n\n    return 0;\n}\n\nint flag_read(flag_type_e flag_type, void *buf, int32_t len)\n{\n    uint8_t flag_buf[FLASH_FLAG_SIZE];\n\n    if (NULL == buf\n        || len < 0\n        || len > FLASH_UNIT_SIZE\n        || g_flag_op.func_flag_read(flag_buf, FLASH_FLAG_SIZE) != 0)\n        return -1;\n\n    switch (flag_type)\n    {\n    case FLAG_BOOTLOADER:\n        memcpy(buf, flag_buf, len);\n        break;\n    case FLAG_APP:\n        memcpy(buf, flag_buf + FLASH_UNIT_SIZE, len);\n        break;\n    default:\n        break;\n    }\n\n    return 0;\n}\n\nint flag_write(flag_type_e flag_type, const void *buf, int32_t len)\n{\n    uint8_t flag_buf[FLASH_FLAG_SIZE];\n\n    if (NULL == buf\n        || len < 0\n        || len > FLASH_UNIT_SIZE\n        || g_flag_op.func_flag_read(flag_buf, FLASH_FLAG_SIZE) != 0)\n        return -1;\n\n    switch (flag_type)\n    {\n    case FLAG_BOOTLOADER:\n        memcpy(flag_buf, buf, len);\n        break;\n    case FLAG_APP:\n        memcpy(flag_buf + FLASH_UNIT_SIZE, buf, len);\n        break;\n    default:\n        break;\n    }\n\n    return g_flag_op.func_flag_write(flag_buf, FLASH_FLAG_SIZE);\n}"
  },
  {
    "path": "Huawei_LiteOS/components/ota/flag_operate/flag_manager.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef FLAG_MANAGER_H\n#define FLAG_MANAGER_H\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum\n{\n    FLAG_BOOTLOADER = 0,\n    FLAG_APP,\n    FLAG_INVALID,\n} flag_type_e;\n\ntypedef struct\n{\n    int (*func_flag_read)(void *buf, int32_t len);\n    int (*func_flag_write)(const void *buf, int32_t len);\n} flag_op_s;\n\nint flag_init(flag_op_s *flag);\n\nint flag_read(flag_type_e flag_type, void *buf, int32_t len);\n\nint flag_write(flag_type_e flag_type, const void *buf, int32_t len);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* FLAG_MANAGER_H */"
  },
  {
    "path": "Huawei_LiteOS/components/ota/flag_operate/upgrade_flag.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include <stddef.h>\n#include \"upgrade_flag.h\"\n#include \"flag_manager.h\"\n#include \"ota_crc.h\"\n\ntypedef struct\n{\n    upgrade_type_e upgrade_type;\n    upgrade_state_e upgrade_state;\n    uint32_t image_size;\n    uint32_t old_image_size;\n    uint32_t recover_verify;\n    uint32_t verify_length;\n    uint32_t crc_flag;\n} upgrade_flag_s;\n\nstatic upgrade_flag_s g_flag;\n\nstatic int save_flag(void)\n{\n    g_flag.crc_flag = calc_crc32(0, &g_flag, sizeof(upgrade_flag_s) - sizeof(uint32_t));\n\n    return flag_write(FLAG_BOOTLOADER, &g_flag, sizeof(upgrade_flag_s));\n}\n\nint flag_upgrade_init(void)\n{\n    int ret;\n    uint32_t crc;\n\n    ret = flag_read(FLAG_BOOTLOADER, &g_flag, sizeof(upgrade_flag_s));\n    if (ret != 0) return ret;\n\n    crc = calc_crc32(0, &g_flag, sizeof(upgrade_flag_s) - sizeof(uint32_t));\n    if (crc != g_flag.crc_flag)\n    {\n        g_flag.upgrade_state = OTA_IDLE;\n        g_flag.upgrade_type = UPGRADE_NONE;\n        g_flag.recover_verify = 0;\n        g_flag.image_size = 0;\n        g_flag.old_image_size = 0;\n        return save_flag();\n    }\n\n    return 0;\n}\n\nint flag_set_info(upgrade_type_e upgrade_type, uint32_t image_size)\n{\n    g_flag.upgrade_type = upgrade_type;\n    g_flag.image_size = image_size;\n    g_flag.upgrade_state = OTA_NEED_UPGRADE;\n\n    return save_flag();\n}\n\nvoid flag_get_info(upgrade_type_e *upgrade_type, uint32_t *image_size,\n                   uint32_t *old_image_size, upgrade_state_e *upgrade_state)\n{\n    if (NULL != upgrade_type)\n        *upgrade_type = g_flag.upgrade_type;\n    if (NULL != image_size)\n        *image_size = g_flag.image_size;\n    if (NULL != old_image_size)\n        *old_image_size = g_flag.old_image_size;\n    if (NULL != upgrade_state)\n        *upgrade_state = g_flag.upgrade_state;\n}\n\nint flag_upgrade_set_result(upgrade_state_e state, uint32_t image_size)\n{\n    g_flag.upgrade_state = state;\n    g_flag.image_size = image_size;\n\n    return save_flag();\n}\n\nint flag_upgrade_get_result(upgrade_state_e *state)\n{\n    if (NULL != state)\n        *state = g_flag.upgrade_state;\n    if (g_flag.upgrade_state == OTA_SUCCEED)\n        g_flag.old_image_size = g_flag.image_size;\n    g_flag.upgrade_state = OTA_IDLE;\n    g_flag.upgrade_type = UPGRADE_NONE;\n\n    return save_flag();\n}\n\nint flag_set_recover_verify(uint32_t recover_verify, uint32_t verify_length)\n{\n    g_flag.recover_verify = recover_verify;\n    g_flag.verify_length = verify_length;\n\n    return save_flag();\n}\n\nvoid flag_get_recover_verify(uint32_t *recover_verify, uint32_t *verify_length)\n{\n    if (NULL != recover_verify)\n        *recover_verify = g_flag.recover_verify;\n    if (NULL != verify_length)\n        *verify_length = g_flag.verify_length;\n}\n\nint recover_set_update_fail(void)\n{\n    g_flag.upgrade_state = OTA_FAILED;\n\n    return save_flag();\n}"
  },
  {
    "path": "Huawei_LiteOS/components/ota/flag_operate/upgrade_flag.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef UPGRADE_FLAG_H\n#define UPGRADE_FLAG_H\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum\n{\n    UPGRADE_FULL = 0,\n    UPGRADE_DIFF,\n    UPGRADE_NONE,\n} upgrade_type_e;\n\ntypedef enum\n{\n    OTA_IDLE = 0,\n    OTA_NEED_UPGRADE,\n    OTA_SUCCEED,\n    OTA_FAILED,\n} upgrade_state_e;\n\nint flag_upgrade_init(void);\n\nint flag_set_info(upgrade_type_e upgrade_type, uint32_t image_size);\n\nvoid flag_get_info(upgrade_type_e *upgrade_type, uint32_t *image_size,\n                   uint32_t *old_image_size, upgrade_state_e *upgrade_state);\n\nint flag_upgrade_set_result(upgrade_state_e state, uint32_t image_size);\n\nint flag_upgrade_get_result(upgrade_state_e *state);\n\nint flag_set_recover_verify(uint32_t recover_verify, uint32_t verify_length);\n\nvoid flag_get_recover_verify(uint32_t *recover_verify, uint32_t *verify_length);\n\nint flag_enable_hwpatch(const uint8_t *patch_head, int32_t patch_len);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* UPGRADE_FLAG_H */"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/opt/package_sha256.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#ifdef INCLUDE_PACK_OPTION_FILE\n#include \"package_sha256.h\"\n#include <string.h>\n#include \"../package_head.h\"/*lint !e451*/\n\nstatic void pack_sha256_reset(pack_checksum_alg_s *thi)\n{\n    pack_sha256_s *sha256 = (pack_sha256_s *)thi;\n    mbedtls_sha256_init(&sha256->sha256_context);\n    mbedtls_sha256_starts(&sha256->sha256_context, false);\n}\nstatic int pack_sha256_update(pack_checksum_alg_s *thi, const uint8_t *buff, uint16_t len)\n{\n    pack_sha256_s *sha256 = (pack_sha256_s *)thi;\n    mbedtls_sha256_update(&sha256->sha256_context, buff, len);\n    return PACK_OK;\n}\nstatic int pack_sha256_check(pack_checksum_alg_s *thi, const uint8_t  *checksum, uint16_t checksum_len)\n{\n    uint8_t real_value[32];\n    pack_sha256_s *sha256 = (pack_sha256_s *)thi;\n\n    ASSERT_THIS(return PACK_ERR);\n\n    if(sizeof(real_value) != checksum_len)\n    {\n        PACK_LOG(\"len %d not the same\", checksum_len);\n        return PACK_ERR;\n    }\n    mbedtls_sha256_finish(&sha256->sha256_context, real_value);\n    if(memcmp(real_value, checksum, checksum_len) != 0)\n    {\n        PACK_LOG(\"checksum err\");\n        return PACK_ERR;\n    }\n    return PACK_OK;\n}\n\nstatic void pack_sha256_destroy(struct pack_checksum_alg_tag_s *thi)\n{\n    pack_sha256_s *sha256 = (pack_sha256_s *)thi;\n    mbedtls_sha256_free(&sha256->sha256_context);\n}\n\nint pack_sha256_init(pack_sha256_s *thi)\n{\n    thi->base.reset = pack_sha256_reset;\n    thi->base.update = pack_sha256_update;\n    thi->base.check = pack_sha256_check;\n    thi->base.destroy = pack_sha256_destroy;\n    pack_sha256_reset(&thi->base);\n    return PACK_OK;\n}\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/opt/package_sha256.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/**@defgroup atiny_adapter Agenttiny Adapter\n * @ingroup agent\n */\n\n#ifndef PACKAGE_SHA256_H\n#define PACKAGE_SHA256_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n\n#include \"ota/package.h\"\n#include \"mbedtls/sha256.h\"\n\n\n\ntypedef struct\n{\n    pack_checksum_alg_s base;\n    mbedtls_sha256_context sha256_context;\n}pack_sha256_s;\n\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\nint pack_sha256_init(pack_sha256_s *thi);\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif //PACKAGE_SHA256_H\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/opt/package_sha256_rsa2048.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#ifdef INCLUDE_PACK_OPTION_FILE\n#include \"package_sha256_rsa2048.h\"\n#include <string.h>\n#include \"mbedtls/rsa.h\"\n\n#define PACK_SHA256_RSA2048_CHECKSUM_LEN 256\n#define PACK_SHA256_CHECKSUM_LEN 32\n\n\nstatic int pack_sha256_rsa2048_check(pack_checksum_alg_s *thi, const uint8_t  *checksum, uint16_t checksum_len)\n{\n    pack_sha256_rsa2048_s *rsa = (pack_sha256_rsa2048_s *)thi;\n    mbedtls_rsa_context *dtls_rsa = NULL;\n    ota_key_s *key = NULL;\n    uint8_t real_sha256[PACK_SHA256_CHECKSUM_LEN];\n    int ret = PACK_ERR;\n\n    if(checksum_len != PACK_SHA256_RSA2048_CHECKSUM_LEN)\n    {\n        PACK_LOG(\"checksum_len err %d\", checksum_len);\n        return PACK_ERR;\n    }\n\n    key = pack_head_get_key(rsa->head);\n    if(NULL == key\n            || (NULL == key->rsa_E)\n            || (NULL == key->rsa_N))\n    {\n        PACK_LOG(\"key null\");\n        return PACK_ERR;\n    }\n\n    dtls_rsa = (mbedtls_rsa_context *)PACK_MALLOC(sizeof(*dtls_rsa));\n    if(NULL == dtls_rsa)\n    {\n        PACK_LOG(\"PACK_MALLOC null\");\n        return PACK_ERR;\n    }\n\n    mbedtls_rsa_init(dtls_rsa, MBEDTLS_RSA_PKCS_V21, 0);\n    dtls_rsa->len = PACK_SHA256_RSA2048_CHECKSUM_LEN;\n    if(mbedtls_mpi_read_string(&dtls_rsa->N, 16, key->rsa_N) != PACK_OK)\n    {\n        PACK_LOG(\"mbedtls_mpi_read_string fail\");\n        goto EXIT;\n    }\n\n    if(mbedtls_mpi_read_string(&dtls_rsa->E, 16, key->rsa_E) != PACK_OK)\n    {\n        PACK_LOG(\"mbedtls_mpi_read_string fail\");\n        goto EXIT;\n    }\n\n    if(mbedtls_rsa_check_pubkey(dtls_rsa) != PACK_OK)\n    {\n        PACK_LOG(\"mbedtls_rsa_check_pubkey fail\");\n        goto EXIT;\n    }\n\n    mbedtls_sha256_finish(&rsa->sha256.sha256_context, real_sha256);\n\n    if( mbedtls_rsa_pkcs1_verify(dtls_rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA256, 0,\n                                 real_sha256, checksum) != PACK_OK)\n    {\n        PACK_LOG(\"mbedtls_rsa_pkcs1_verify fail\");\n        goto EXIT;\n    }\n\n    ret = PACK_OK;\nEXIT:\n\n    mbedtls_rsa_free(dtls_rsa);\n    PACK_FREE(dtls_rsa);\n    return ret;\n\n}\n\n\n\nint pack_sha256_rsa2048_init(pack_sha256_rsa2048_s *thi, pack_head_s *head)\n{\n    (void)pack_sha256_init(&thi->sha256);\n    thi->sha256.base.check = pack_sha256_rsa2048_check;\n    thi->head = head;\n    return PACK_OK;\n}\n#endif\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/opt/package_sha256_rsa2048.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/**@defgroup atiny_adapter Agenttiny Adapter\n * @ingroup agent\n */\n\n#ifndef PACKAGE_SHA256_RSA2048_H\n#define PACKAGE_SHA256_RSA2048_H\n\n#include \"package_sha256.h\"\n#include \"../package_head.h\"\n\ntypedef struct\n{\n    pack_sha256_s sha256;\n    pack_head_s *head;\n}pack_sha256_rsa2048_s;\n\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\nint pack_sha256_rsa2048_init(pack_sha256_rsa2048_s *thi, pack_head_s *head);\n\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif //PACKAGE_SHA256_RSA2048_H\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/package.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"ota/package.h\"\n#include \"package_device.h\"\n#if (PACK_CHECKSUM != PACK_NO_CHECKSUM)\n#include \"mbedtls/platform.h\"\n#endif\n\nstatic inline pack_storage_device_s *pack_storage_get_storage_device(pack_storage_device_api_s *this)\n{\n    return (pack_storage_device_s *)this;\n}\n\nstatic int pack_storage_write_software_end(pack_storage_device_api_s *this, pack_download_result_e result, uint32_t total_len)\n{\n    pack_storage_device_s *device;\n    int ret = PACK_OK;\n\n    if(NULL == this)\n    {\n        PACK_LOG(\"null pointer\");\n        return PACK_ERR;\n    }\n\n    device = pack_storage_get_storage_device(this);\n\n    do\n    {\n\n        if(pack_wr_write_end(&device->writer) != PACK_OK)\n        {\n            ret = PACK_ERR;\n            break;\n        }\n\n        if(result != PACK_DOWNLOAD_OK)\n        {\n            break;\n        }\n\n        if(pack_head_check(&device->head, total_len) != PACK_OK)\n        {\n            ret = PACK_ERR;\n            PACK_LOG(\"check err,len %u\", total_len);\n            break;\n        }\n\n    }\n    while(0);\n\n    device->total_len = total_len;\n\n    //current download finish, clear the save data\n    if(PACK_DOWNLOAD_OK == result)\n    {\n        pack_head_destroy(&device->head);\n        pack_wr_destroy(&device->writer);\n    }\n\n    return ret;\n}\n\n\nstatic int pack_storage_write_software(pack_storage_device_api_s *this,\n        uint32_t offset, const uint8_t *buffer, uint32_t len)\n{\n    pack_storage_device_s *device;\n    uint16_t used_len = 0;\n    int ret;\n\n    if(NULL == this)\n    {\n        PACK_LOG(\"null pointer\");\n        return PACK_ERR;\n    }\n    if(0 == len || buffer == NULL)\n    {\n        PACK_LOG(\"write 0 len\");\n        return PACK_ERR;\n    }\n\n\n    device = pack_storage_get_storage_device(this);\n\n    ret = pack_head_parse(&device->head, offset, buffer, (uint16_t)len, &used_len);\n    if(ret != PACK_OK)\n    {\n        PACK_LOG(\"pack_head_parse fail %d\", ret);\n        return ret;\n    }\n\n    if(used_len == len)\n    {\n        return PACK_OK;\n    }\n\n    len -= used_len;\n    offset += used_len;\n    buffer += used_len;\n\n    ret = pack_wr_write(&device->writer, offset - pack_head_get_head_len(&device->head), buffer, len);\n    if(ret != PACK_OK)\n    {\n        PACK_LOG(\"pack_wr_write fail %d\", ret);\n        return ret;\n    }\n\n    if (pack_head_get_checksum(&device->head))\n    {\n        ret = pack_checksum_update_data(pack_head_get_checksum(&device->head), offset,\n                                             buffer, len, &device->hardware);\n        if(ret != PACK_OK)\n        {\n            PACK_LOG(\"pack_checksum_update_data fail %d\", ret);\n        }\n    }\n\n    return PACK_OK;\n\n}\n\nint pack_storage_active_software(pack_storage_device_api_s *thi)\n{\n    pack_storage_device_s *device = pack_storage_get_storage_device(thi);\n\n    if(NULL == thi)\n    {\n        PACK_LOG(\"null err\");\n        return PACK_ERR;\n    }\n\n    return flag_set_info((OTA_FULL_SOFTWARE == device->type) ? UPGRADE_FULL : UPGRADE_DIFF,\n                        device->total_len);\n    }\n\nstatic void pack_init_pack_device(pack_storage_device_s *device)\n{\n    if(device->init_flag)\n    {\n        return;\n    }\n\n    (void)memset(device, 0, sizeof(*device));\n    pack_wr_init(&device->writer);\n    pack_head_init(&device->head);\n\n    device->interface.write_software = pack_storage_write_software;\n    device->interface.write_software_end = pack_storage_write_software_end;\n    device->interface.active_software = pack_storage_active_software;\n    device->init_flag = true;\n}\n\n\nstatic pack_storage_device_s g_pack_storage_device;\n\npack_storage_device_api_s *pack_get_device(void)\n{\n\n    pack_storage_device_s *device  = &g_pack_storage_device;\n    pack_init_pack_device(device);\n    return &device->interface;\n}\n\n\nstatic int pack_read_software(struct pack_hardware_tag_s *thi, uint32_t offset, uint8_t *buffer, uint32_t len)\n{\n    pack_storage_device_s *device = (pack_storage_device_s *)pack_get_device();\n\n    (void)thi;\n    if (device->params.ota_opt.read_flash)\n    {\n        return device->params.ota_opt.read_flash(device->type, buffer, len, offset);\n    }\n    PACK_LOG(\"read_flash null\");\n\n    return PACK_ERR;\n}\n\nstatic int pack_write_software(struct pack_hardware_tag_s *thi, uint32_t offset, const uint8_t *buffer, uint32_t len)\n{\n    pack_storage_device_s *device = (pack_storage_device_s *)pack_get_device();\n\n    (void)thi;\n    if (device->params.ota_opt.write_flash)\n    {\n        return device->params.ota_opt.write_flash(device->type, buffer, len, offset);\n    }\n    PACK_LOG(\"write_flash null\");\n\n    return PACK_ERR;\n}\n\nstatic void pack_set_flash_type(struct pack_hardware_tag_s *thi, ota_flash_type_e type)\n{\n    pack_storage_device_s *device = (pack_storage_device_s *)pack_get_device();\n\n    device->type = type;\n    PACK_LOG(\"pack_set_flash_type type %d\", type);\n}\n\nstatic uint32_t pack_get_block_size(struct pack_hardware_tag_s *thi)\n{\n    pack_storage_device_s *device = (pack_storage_device_s *)pack_get_device();\n    return device->params.ota_opt.flash_block_size;\n}\n\nstatic void* local_calloc(size_t n, size_t size)\n{\n    void *p = pack_malloc(n * size);\n    if (NULL != p)\n    {\n        memset(p, 0, n * size);\n    }\n    return p;\n}\n\nint pack_init_device(const pack_params_s *params)\n{\n    pack_storage_device_s *device = (pack_storage_device_s *)pack_get_device();\n    pack_device_info_s device_info;\n\n    if ((params == NULL) || (params->malloc == NULL)\n        || (params->free == NULL))\n    {\n        PACK_LOG(\"params null\");\n        return PACK_ERR;\n    }\n\n    memcpy(&device->params, params, sizeof(device->params));\n\n    device->hardware.read_software = pack_read_software;\n    device->hardware.write_software = pack_write_software;\n    device->hardware.set_flash_type = pack_set_flash_type;\n    device->hardware.get_block_size = pack_get_block_size;\n\n    device_info.hardware = &device->hardware;\n    memcpy(&device_info.key, &device->params.ota_opt.key, sizeof(device_info.key));\n\n    if(pack_head_set_head_info(&device->head,  &device_info) != PACK_OK)\n    {\n        return PACK_ERR;\n    }\n\n    pack_wr_set_device(&device->writer, device_info.hardware);\n\n#if (PACK_CHECKSUM != PACK_NO_CHECKSUM)\n    (void)mbedtls_platform_set_calloc_free(local_calloc, params->free);\n#endif\n\n    return PACK_OK;\n}\n\npack_params_s * pack_get_params(void)\n{\n    pack_storage_device_s *device = (pack_storage_device_s *)pack_get_device();\n    return &device->params;\n}\n\nvoid * pack_malloc(size_t size)\n{\n    pack_params_s *params = pack_get_params();\n\n    return (params->malloc == NULL) ? NULL : params->malloc(size);\n}\n\nvoid pack_free(void *ptr)\n{\n    pack_params_s *params = pack_get_params();\n    if(params->free != NULL)\n    {\n        params->free(ptr);\n    }\n}\n\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/package_checksum.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"package_checksum.h\"\n#include \"package_head.h\"\n\n#if (PACK_CHECKSUM != PACK_NO_CHECKSUM)\n#include <string.h>\n\n#if (PACK_CHECKSUM == PACK_SHA256_RSA2048)\n#include \"opt/package_sha256_rsa2048.h\"\n#elif (PACK_CHECKSUM == PACK_SHA256)\n#include \"opt/package_sha256.h\"\n#else\n#error PACK_CHECKSUM not define\n#endif\n\n\n\n\nstruct pack_checksum_tag_s\n{\n    uint32_t offset;\n    bool offset_flag;\n    pack_head_s *head;\n#if (PACK_CHECKSUM == PACK_SHA256_RSA2048)\n    pack_sha256_rsa2048_s alg;\n#elif (PACK_CHECKSUM == PACK_SHA256)\n    pack_sha256_s alg;\n#endif\n\n};\n\nstatic inline pack_checksum_alg_s *pack_checksum_get_alg(pack_checksum_s *thi)\n{\n#if (PACK_CHECKSUM == PACK_SHA256_RSA2048)\n    return &thi->alg.sha256.base;\n#elif (PACK_CHECKSUM == PACK_SHA256)\n    return &thi->alg.base;\n#endif\n}\n\nstatic void pack_checksum_init(pack_checksum_s *thi, pack_head_s *head)\n{\n    memset(thi, 0, sizeof(*thi));\n    thi->head = head;\n#if (PACK_CHECKSUM == PACK_SHA256_RSA2048)\n    (void)pack_sha256_rsa2048_init(&thi->alg, thi->head);\n#elif (PACK_CHECKSUM == PACK_SHA256)\n    (void)pack_sha256_init(&thi->alg);\n#endif\n}\n\n\n\n\nvoid pack_checksum_delete(pack_checksum_s *thi)\n{\n    if(NULL == thi)\n    {\n        return;\n    }\n    pack_checksum_get_alg(thi)->destroy(pack_checksum_get_alg(thi));\n    PACK_FREE(thi);\n}\n\nstatic int pack_checksum_init_head_data(pack_checksum_s *thi)\n{\n    int32_t len;\n    const uint8_t *buff;\n\n    pack_checksum_get_alg(thi)->reset(pack_checksum_get_alg(thi));\n    len = pack_head_get_head_len(thi->head);\n    if(0 == len)\n    {\n        return PACK_OK;\n    }\n\n    buff = pack_head_get_head_info(thi->head);\n    if(NULL == buff)\n    {\n        PACK_LOG(\"buff null\");\n        return PACK_ERR;\n    }\n\n    return pack_checksum_get_alg(thi)->update(pack_checksum_get_alg(thi), buff, len);\n}\npack_checksum_s *pack_checksum_create(pack_head_s *head)\n{\n    pack_checksum_s *thi = PACK_MALLOC(sizeof(pack_checksum_s));\n    if(NULL == thi)\n    {\n        PACK_LOG(\"PACK_MALLOC fail\");\n        return NULL;\n    }\n    pack_checksum_init(thi, head);\n    (void)pack_checksum_init_head_data(thi);\n    return thi;\n}\n\nstatic int pack_checksum_restore_checksum(pack_checksum_s *thi, uint32_t offset, pack_hardware_s *hardware)\n{\n    uint8_t *buff  = NULL;\n    const uint32_t max_size = hardware->get_block_size(hardware);\n    uint32_t total_size = 0;\n    uint32_t left_size;\n    uint32_t read_size;\n    int ret = PACK_ERR;\n\n    buff = PACK_MALLOC(max_size);\n    if(NULL == buff)\n    {\n        PACK_LOG(\"malloc null\");\n        return PACK_ERR;\n    }\n    do\n    {\n        ret = PACK_ERR;\n        left_size = offset - total_size;\n        read_size = MIN(left_size, max_size);\n        ret = hardware->read_software(hardware, total_size, buff, read_size);\n        if(ret != PACK_OK)\n        {\n            PACK_LOG(\"read_software fail, ret %d, offset %d, read_size %d\", ret, total_size, read_size);\n            break;\n        }\n        ret = pack_checksum_get_alg(thi)->update(pack_checksum_get_alg(thi), buff, read_size);\n        if(ret != PACK_OK)\n        {\n            break;\n        }\n        total_size += read_size;\n    }\n    while(total_size < offset);\n\n    if(buff)\n    {\n        PACK_FREE(buff);\n    }\n\n    return ret;\n}\n\nint pack_checksum_update_data(pack_checksum_s *thi, uint32_t offset, const uint8_t *buff,\n                                   uint16_t len, pack_hardware_s *hardware)\n{\n    int ret;\n\n    ASSERT_THIS(return PACK_ERR);\n\n    if(0 == len)\n    {\n        return PACK_OK;\n    }\n\n    if(NULL == buff)\n    {\n        PACK_LOG(\"buff null\");\n        return PACK_ERR;\n    }\n\n    if(((thi->offset_flag) && (thi->offset == offset))\n            || (pack_head_get_head_len(thi->head) == offset))\n    {\n        if(pack_checksum_get_alg(thi)->update(pack_checksum_get_alg(thi), buff, len) != PACK_OK)\n        {\n            return PACK_ERR;\n        }\n        thi->offset_flag = true;\n        thi->offset = offset + len;\n        return PACK_OK;\n    }\n    /*lint -e525*/\n    if((NULL == hardware) || (NULL == hardware->read_software))\n    {\n        PACK_LOG(\"hardware null\");\n        return PACK_ERR;\n    }\n    /*lint +e525*/\n\n    ret = pack_checksum_init_head_data(thi);\n    if(ret != PACK_OK)\n    {\n        return ret;\n    }\n\n    ret = pack_checksum_restore_checksum(thi, offset, hardware);\n    if(ret != PACK_OK)\n    {\n        return ret;\n    }\n\n    if(pack_checksum_get_alg(thi)->update(pack_checksum_get_alg(thi), buff, len) != PACK_OK)\n    {\n        return PACK_ERR;\n    }\n\n    thi->offset_flag = true;\n    thi->offset = offset + len;\n    return PACK_OK;\n}\n\nint pack_checksum_check(pack_checksum_s *thi, const uint8_t *expected_value, uint16_t len)\n{\n    ASSERT_THIS(return PACK_ERR);\n    return pack_checksum_get_alg(thi)->check(pack_checksum_get_alg(thi), expected_value, len);\n}\n#define INCLUDE_PACK_OPTION_FILE\n#if (PACK_CHECKSUM == PACK_SHA256_RSA2048)\n#include \"opt/package_sha256.c\"\n#include \"opt/package_sha256_rsa2048.c\"\n#elif (PACK_CHECKSUM == PACK_SHA256)\n#include \"opt/package_sha256.c\"\n#endif\n\n#else\npack_checksum_s * pack_checksum_create(struct pack_head_tag_s *head)\n{\n    (void)head;\n    return NULL;\n}\nvoid pack_checksum_delete(pack_checksum_s * thi)\n{\n    (void)thi;\n}\nint pack_checksum_update_data(pack_checksum_s *thi, uint32_t offset, const uint8_t *buff, uint16_t len,  pack_hardware_s *hardware)\n{\n    (void)thi;\n    (void)offset;\n    (void)buff;\n    (void)len;\n    (void)hardware;\n    return PACK_ERR;\n}\nint pack_checksum_check(pack_checksum_s *thi, const uint8_t *expected_value, uint16_t len)\n{\n    (void)thi;\n    (void)expected_value;\n    (void)len;\n    return PACK_ERR;\n}\n\n#endif\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/package_checksum.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/**@defgroup atiny_adapter Agenttiny Adapter\n * @ingroup agent\n */\n\n#ifndef PACKAGE_CHECKSUM_H\n#define PACKAGE_CHECKSUM_H\n\n#include \"ota/package.h\"\n\n\ntypedef struct pack_hardware_tag_s\n{\n    int (*read_software)(struct pack_hardware_tag_s *thi, uint32_t offset, uint8_t *buffer, uint32_t len);\n    int (*write_software)(struct pack_hardware_tag_s *thi, uint32_t offset, const uint8_t *buffer, uint32_t len);\n    void (*set_flash_type)(struct pack_hardware_tag_s *thi, ota_flash_type_e type);\n    uint32_t (*get_block_size)(struct pack_hardware_tag_s *thi);\n    uint32_t (*get_max_size)(struct pack_hardware_tag_s *thi);\n}pack_hardware_s;\n\ntypedef struct pack_checksum_tag_s pack_checksum_s;\n\nstruct pack_head_tag_s;\n\ntypedef struct pack_checksum_alg_tag_s\n{\n    void (*reset)(struct pack_checksum_alg_tag_s *thi);\n    int (*update)(struct pack_checksum_alg_tag_s *thi, const uint8_t *buff, uint16_t len);\n    int (*check)(struct pack_checksum_alg_tag_s *thi, const uint8_t  *checksum, uint16_t checksum_len);\n    void (*destroy)(struct pack_checksum_alg_tag_s *thi);\n}pack_checksum_alg_s;\n\n\n\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n\npack_checksum_s * pack_checksum_create(struct pack_head_tag_s *head);\nvoid pack_checksum_delete(pack_checksum_s * thi);\nint pack_checksum_update_data(pack_checksum_s *thi, uint32_t offset, const uint8_t *buff, uint16_t len,  pack_hardware_s *hardware);\nint pack_checksum_check(pack_checksum_s *thi, const uint8_t *expected_value, uint16_t len);\n\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif //PACKAGE_CHECKSUM_H\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/package_device.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/**@defgroup atiny_adapter Agenttiny Adapter\n * @ingroup agent\n */\n\n#ifndef PACKAGE_DEVICE_H\n#define PACKAGE_DEVICE_H\n\n#include \"ota/package.h\"\n#include \"package_checksum.h\"\n#include \"package_head.h\"\n#include \"package_writer.h\"\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\ntypedef struct\n{\n    pack_storage_device_api_s interface;\n    pack_hardware_s hardware;\n    pack_params_s params;\n    pack_head_s head;\n    pack_writer_s writer;\n    uint32_t total_len;\n    ota_flash_type_e type;\n    int32_t init_flag;\n} pack_storage_device_s;\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif //PACKAGE_DEVICE_H\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/package_head.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"package_head.h\"\n#include \"package_writer.h\"\n#include \"stddef.h\"\n\n#define MAKE_DWORD(a, b, c, d) ((((uint32_t)(a)) << 24) | (((uint32_t)(b)) << 16) | (((uint32_t)(c)) <<8) | ((uint32_t)(d)))\n#define MAKE_WORD(a, b)  ((((uint32_t)(a)) <<8) | ((uint32_t)(b)))\n\n#define GET_DWORD(buf, pos) MAKE_DWORD(buf[pos], buf[pos + 1], buf[pos + 2], buf[pos + 3])\n#define GET_WORD(buf, pos) MAKE_WORD(buf[pos], buf[pos + 1])\n\n\n#define PACK_HEADER_MIN_LEN 12\n#define PACK_TLV_START_POS PACK_HEADER_MIN_LEN\n\n#define PACK_VERSION_POS 0\n#define PACK_HEADER_HEAD_LEN_POS 4\n#define PACK_HEADER_TOTAL_LEN_POS 8\n\n#define PACK_TLV_T_LEN 2\n#define PACK_TLV_L_LEN 2\n\n#define PACK_TLV_T_SHA256 1\n#define PACK_TLV_T_SHA256_RSA2048 3\n#define PACK_INVALID_TLV_T 0xffff\n#define PACK_TLV_T_BIN_TYPE 4\n\n\n\n#define VERSION_NO 0\n\n\n\n\nvoid pack_head_init(pack_head_s *head)\n{\n    (void)memset(head, 0 , sizeof(*head));\n}\n\n\nvoid pack_head_destroy(pack_head_s *head)\n{\n    if(head->buff)\n    {\n        PACK_FREE(head->buff);\n        head->buff = NULL;\n    }\n\n    if(head->checksum_pos)\n    {\n        PACK_FREE(head->checksum_pos);\n        head->checksum_pos = NULL;\n    }\n\n    if(head->checksum)\n    {\n        pack_checksum_delete(head->checksum);\n        head->checksum = NULL;\n    }\n\n    memset(&(head->buff), 0, sizeof(*head) - (((uint8_t *) & (head->buff)) - ((uint8_t *)head)));\n}\n\nint pack_head_parse_head_len(pack_head_s *head, uint32_t offset, const uint8_t *buff,\n                                  uint16_t len, uint16_t *used_len)\n{\n    *used_len = 0;\n    if(offset < PACK_HEADER_MIN_LEN)\n    {\n        uint32_t copy_len;\n        uint32_t head_len;\n        uint32_t total_len;\n        uint32_t version;\n        if(offset > head->stored_len)\n        {\n            PACK_LOG(\"head not continuous, len %u offset %u\", head->stored_len, offset);\n            return PACK_ERR;\n        }\n\n        if(NULL == head->buff)\n        {\n            head->buff = PACK_MALLOC(PACK_HEADER_MIN_LEN);\n            if(NULL == head->buff)\n            {\n                PACK_LOG(\"PACK_MALLOC fail\");\n                return PACK_ERR;\n            }\n            head->head_len = PACK_HEADER_MIN_LEN;\n        }\n        copy_len = MIN(PACK_HEADER_MIN_LEN - offset, len);\n        memcpy(head->buff + offset, buff, copy_len);\n        head->stored_len = offset + copy_len;\n        *used_len = copy_len;\n        if(head->stored_len < PACK_HEADER_MIN_LEN)\n        {\n            return PACK_OK;\n        }\n\n        version = GET_DWORD(head->buff, PACK_VERSION_POS);\n        if(version != VERSION_NO)\n        {\n            PACK_LOG(\"invalid version %d\", version);\n            head->stored_len = 0;\n            return PACK_ERR;\n        }\n\n        head_len = GET_DWORD(head->buff, PACK_HEADER_HEAD_LEN_POS);\n        total_len = GET_DWORD(head->buff, PACK_HEADER_TOTAL_LEN_POS);\n        if(head_len < PACK_HEADER_MIN_LEN || (head_len >= total_len)\n            || (head_len > PACK_MAX_HEAD_LEN))\n        {\n            PACK_LOG(\"invalid head len %d, total len %d\", head_len, total_len);\n            head->stored_len = 0;\n            return PACK_ERR;\n        }\n\n        if(head_len > head->head_len)\n        {\n            uint8_t *new_buff = PACK_MALLOC(head_len);\n            if(NULL == new_buff)\n            {\n                PACK_LOG(\"PACK_MALLOC fail\");\n                return PACK_ERR;\n            }\n            memcpy(new_buff, head->buff, head->stored_len);\n            PACK_FREE(head->buff);\n            head->buff = new_buff;\n            head->head_len = head_len;\n        }\n\n    }\n    return PACK_OK;\n}\n\n\nstatic uint32_t pack_head_get_checksum_attribute(void)\n{\n#if (PACK_CHECKSUM == PACK_SHA256_RSA2048)\n    return PACK_TLV_T_SHA256_RSA2048;\n#elif (PACK_CHECKSUM == PACK_SHA256)\n    return PACK_TLV_T_SHA256;\n#else\n    return PACK_INVALID_TLV_T;\n#endif\n}\n\nstatic int pack_head_handle_checksum_tlv(pack_head_s *head, uint8_t *value, uint32_t len)\n{\n    if(head->checksum_pos)\n    {\n        PACK_FREE(head->checksum_pos);\n        head->checksum_pos = NULL;\n        head->checksum_len = 0;\n    }\n\n    if(len > 0)\n    {\n\n        head->checksum_pos = PACK_MALLOC(len);\n        if(NULL == head->checksum_pos)\n        {\n            PACK_LOG(\"PACK_MALLOC %d fail\", len);\n            return PACK_ERR;\n        }\n        memcpy(head->checksum_pos, value, len);\n    }\n\n    head->checksum_len = len;\n    memset(value, 0, len);\n\n    return PACK_OK;\n}\n\nstatic int pack_head_handle_bin_type_tlv(pack_head_s *head, uint8_t *value, uint32_t len)\n{\n    if (head->hardware->set_flash_type)\n    {\n        uint32_t flash_type =  GET_DWORD(value, 0);\n        if (flash_type >= OTA_UPDATE_INFO)\n        {\n            PACK_LOG(\"flash_type %d invalid\", flash_type);\n            return PACK_ERR;\n        }\n        head->hardware->set_flash_type(head->hardware, (ota_flash_type_e)flash_type);\n    }\n\n    return PACK_OK;\n}\n\n\nstatic int pack_head_parse_tlvs(pack_head_s *head, uint8_t *buff, uint32_t len)\n{\n    uint32_t attribute;\n    uint32_t tlv_len;\n    uint8_t *cur = buff + PACK_TLV_START_POS;\n    uint32_t left_len = len - PACK_TLV_START_POS;\n\n    int (*tlv_handles[2])(pack_head_s *head, uint8_t *value, uint32_t len) =\n                                {pack_head_handle_checksum_tlv, pack_head_handle_bin_type_tlv};\n    uint32_t attributes[array_size(tlv_handles)] = {PACK_INVALID_TLV_T, PACK_TLV_T_BIN_TYPE};\n\n    attributes[0] = pack_head_get_checksum_attribute();\n    while(left_len > 0)\n    {\n        uint32_t i;\n\n        attribute = GET_WORD(cur, 0);\n        cur += PACK_TLV_T_LEN;\n        tlv_len = GET_WORD(cur, 0);\n        cur += PACK_TLV_L_LEN;\n        if(left_len < (PACK_TLV_T_LEN  + PACK_TLV_L_LEN + tlv_len))\n        {\n            PACK_LOG(\"tvl err attribute %d, tlv_len %d\", attribute, tlv_len);\n            return PACK_ERR;\n        }\n\n        for (i = 0; i < array_size(tlv_handles); i++)\n        {\n            if (attributes[i] == attribute)\n            {\n                if(tlv_handles[i](head, cur, tlv_len) != PACK_OK)\n                {\n                    return PACK_ERR;\n                }\n                break;\n            }\n        }\n\n        cur += tlv_len ;\n        left_len -= (PACK_TLV_T_LEN  + PACK_TLV_L_LEN + tlv_len);\n    }\n\n    if(NULL == head->checksum_pos)\n    {\n        PACK_LOG(\"head empty checksum info\");\n#if (PACK_CHECKSUM != PACK_NO_CHECKSUM)\n        return PACK_ERR;\n#else\n        return PACK_OK;\n#endif\n    }\n\n\n    if(head->checksum)\n    {\n        pack_checksum_delete(head->checksum);\n        head->checksum = NULL;\n    }\n    head->checksum = pack_checksum_create(head);\n    if(head->checksum == NULL)\n    {\n        PACK_LOG(\"pack_checksum_create fail\");\n        return PACK_ERR;\n    }\n    return PACK_OK;\n\n}\n\n\nint pack_head_parse(pack_head_s *head, uint32_t offset, const uint8_t *buff,\n                         uint16_t len, uint16_t *used_len)\n{\n    int ret;\n    uint16_t tmp_len = 0;\n\n    *used_len = 0;\n    ret = pack_head_parse_head_len(head, offset, buff, len, &tmp_len);\n    if(ret != PACK_OK)\n    {\n        return ret;\n    }\n\n    len -= tmp_len;\n    if((0 == len) && (head->stored_len < head->head_len))\n    {\n        *used_len = tmp_len;\n        return PACK_OK;\n    }\n\n    offset += tmp_len;\n    buff += tmp_len;\n\n    if((head->head_len < PACK_HEADER_MIN_LEN)\n            || (NULL == head->buff)\n            || ((head->stored_len < head->head_len) && (offset > head->stored_len)))\n    {\n        PACK_LOG(\"head not continuous, len %u offset %u\", head->stored_len, offset);\n        return PACK_ERR;\n    }\n\n    if(offset < head->head_len)\n    {\n        uint16_t copy_len;\n\n        copy_len = MIN(len, head->head_len - offset);\n        (void)memcpy(head->buff + offset, buff, copy_len);\n        *used_len = copy_len + tmp_len;\n        head->stored_len = offset + copy_len;\n        if(head->stored_len >= head->head_len)\n        {\n            uint32_t save_len;\n            save_len = GET_DWORD(head->buff, PACK_HEADER_TOTAL_LEN_POS);\n            if(save_len <= head->head_len)\n            {\n                PACK_LOG(\"head len err, save len %d head len %u\", save_len, head->head_len);\n                return PACK_ERR;\n            }\n\n            if(head->hardware && head->hardware->get_max_size)\n            {\n                uint32_t max_len = head->hardware->get_max_size(head->hardware);\n                if(max_len < save_len - head->head_len)\n                {\n                    PACK_LOG(\"size exceed, save len %u head len %u max_len %u\", save_len, head->head_len, max_len);\n                    return PACK_ERR;\n                }\n            }\n\n            if(head->update_check)\n            {\n                if(head->update_check(head->buff, head->head_len, head->param) != PACK_OK)\n                {\n                    return PACK_ERR;\n                }\n            }\n\n            return pack_head_parse_tlvs(head, head->buff, head->head_len);\n        }\n    }\n\n    return PACK_OK;\n}\n\nstatic bool pack_head_is_done(const pack_head_s *head)\n{\n    return ((head->head_len >= PACK_HEADER_MIN_LEN) && (head->stored_len == head->head_len));\n}\n\nint pack_head_check(const pack_head_s *head, uint32_t len)\n{\n    uint32_t save_len;\n\n    if(!pack_head_is_done(head))\n    {\n        PACK_LOG(\"head invalid get len, stored len %u, head len %u\", head->stored_len, head->head_len);\n        return PACK_ERR;\n    }\n\n    save_len = GET_DWORD(head->buff, PACK_HEADER_TOTAL_LEN_POS);\n    if(len != save_len)\n    {\n        PACK_LOG(\"len err save len %u, rcv len %u\", save_len, len);\n        return PACK_ERR;\n    }\n\n    if((head->checksum_pos == NULL) || (head->checksum_len == 0))\n    {\n        PACK_LOG(\"fota no checksum exist\");\n        return PACK_OK;\n    }\n\n    if (head->checksum)\n    {\n        return pack_checksum_check(head->checksum, head->checksum_pos, head->checksum_len);\n    }\n    return PACK_OK;\n}\n\nuint32_t pack_head_get_head_len(const pack_head_s *head)\n{\n    return pack_head_is_done(head) ? (uint32_t)head->head_len : 0;\n}\n\nconst uint8_t *pack_head_get_head_info(const pack_head_s *head)\n{\n    return pack_head_is_done(head) ? head->buff : 0;\n}\n\n\nint pack_head_set_head_info(pack_head_s *head, pack_device_info_s *device_info)\n{\n    head->hardware = device_info->hardware;\n    head->update_check = NULL;\n    head->param = NULL;\n    (void)memcpy(&head->key, &device_info->key, sizeof(head->key));\n    return PACK_OK;\n}\n\npack_checksum_s *pack_head_get_checksum(pack_head_s *head)\n{\n    return head->checksum;\n}\n\nota_key_s  *pack_head_get_key(pack_head_s *head)\n{\n    return &head->key;\n}\n\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/package_head.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/**@defgroup atiny_adapter Agenttiny Adapter\n * @ingroup agent\n */\n\n#ifndef PACKAGE_HEAD_H\n#define PACKAGE_HEAD_H\n#include \"ota/package.h\"\n#include <stddef.h>\n#include <string.h>\n#include <stdlib.h>\n#include \"package_checksum.h\"\n#include \"upgrade_flag.h\"\n\n\n#define PACK_MALLOC(size) pack_malloc(size)\n#define PACK_FREE(ptr) pack_free(ptr)\n\n#define PACK_LOG_ENABLE\n#ifdef PACK_LOG_ENABLE\n#define PACK_LOG(fmt, ...) \\\ndo\\\n{\\\n    pack_params_s *__pack_params__ = pack_get_params();\\\n    if (__pack_params__->printf != NULL)\\\n    {\\\n        (void)__pack_params__->printf(\"[%s:%d]\" fmt \"\\r\\n\",  __FUNCTION__, __LINE__,  ##__VA_ARGS__);\\\n    }\\\n}while(0)\n#else\n#define PACK_LOG(fmt, ...) ((void)0)\n#endif\n\n\n#define ASSERT_THIS(do_something) \\\n        if(NULL == thi)\\\n        {\\\n            PACK_LOG(\"this null pointer\");\\\n            do_something;\\\n        }\n\n#ifndef MIN\n#define MIN(a, b) (((a) <= (b)) ? (a) : (b))\n#endif\n\n#ifndef array_size\n#define array_size(a) (sizeof(a)/sizeof(*(a)))\n#endif\n\nenum\n{\n    PACK_OK,\n    PACK_ERR\n};\n\n\ntypedef struct\n{\n    pack_hardware_s *hardware;\n    ota_key_s key;\n}pack_device_info_s;\n\nstruct pack_head_tag_s;\ntypedef int (*head_update_check)(const uint8_t *head_buff , uint16_t len, void *param);\n\ntypedef struct pack_head_tag_s\n{\n    pack_hardware_s *hardware;\n    head_update_check update_check;\n    void *param;\n    ota_key_s key;\n\n    /* following data will be memset  when destroy */\n    uint8_t *buff;\n    uint16_t stored_len;\n    uint16_t head_len;\n    pack_checksum_s *checksum;\n    uint8_t *checksum_pos;\n    uint32_t checksum_len;\n}pack_head_s;\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n\nvoid pack_head_init(pack_head_s *head);\nvoid pack_head_destroy(pack_head_s *head);\nint pack_head_parse(pack_head_s *head, uint32_t offset, const uint8_t *buff, uint16_t len,\n                    uint16_t *used_len);\nint pack_head_check(const pack_head_s *head, uint32_t len);\nuint32_t pack_head_get_head_len(const pack_head_s *head);\nconst uint8_t* pack_head_get_head_info(const pack_head_s *head);\n\nint pack_head_set_head_info(pack_head_s *head, pack_device_info_s *device_info);\npack_checksum_s *pack_head_get_checksum(pack_head_s *head);\nota_key_s  *pack_head_get_key(pack_head_s *head);\n\n\npack_params_s * pack_get_params(void);\nvoid * pack_malloc(size_t size);\nvoid pack_free(void *ptr);\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif //PACKAGE_HEAD_H\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/package_writer.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include \"package_writer.h\"\n#include \"package_head.h\"\n#include \"upgrade_flag.h\"\n\n\nvoid pack_wr_init(pack_writer_s *writer)\n{\n    (void)memset(writer, 0, sizeof(*writer));\n}\nvoid pack_wr_free_save_buffer(pack_writer_s *writer)\n{\n    if(writer->buffer)\n    {\n        PACK_FREE(writer->buffer);\n        writer->buffer = NULL;\n    }\n    writer->buffer_stored_len = 0;\n    writer->block_size = 0;\n}\n\nvoid pack_wr_destroy(pack_writer_s *writer)\n{\n    writer->offset_flag = false;\n    pack_wr_free_save_buffer(writer);\n\n}\n\n\nvoid pack_wr_set_device(pack_writer_s *writer, pack_hardware_s *hardware)\n{\n    writer->hardware = hardware;\n}\n\nint pack_wr_check(pack_writer_s *writer)\n{\n    if(NULL == writer->hardware)\n    {\n        PACK_LOG(\"null poiter\");\n        return PACK_ERR;\n    }\n    return PACK_OK;\n}\n\nstatic int pack_write_data(pack_writer_s *writer, uint32_t offset, const uint8_t *buffer, uint32_t len)\n{\n\n    int ret = writer->hardware->write_software(writer->hardware,  offset, buffer, len);\n\n    if (0 == offset)\n    {\n        (void)flag_enable_hwpatch(buffer, len);\n    }\n    return ret;\n}\nint pack_wr_write_stored_data(pack_writer_s *writer)\n{\n    int ret;\n\n#if (PACK_COMBINE_TO_WRITE_LAST_BLOCK == PACK_YES)\n    if (writer->buffer_stored_len < writer->block_size)\n    {\n        ret = writer->hardware->read_software(writer->hardware,  writer->offset,\n                    writer->buffer + writer->buffer_stored_len, writer->block_size - writer->buffer_stored_len);\n        if (ret != PACK_OK)\n        {\n            PACK_LOG(\"read_software fail offset %ld, size %ld ret %d\", writer->offset,\n                                writer->block_size - writer->buffer_stored_len, ret);\n            return ret;\n        }\n\n        writer->buffer_stored_len = writer->block_size;\n    }\n#endif\n\n    ret = pack_write_data(writer,  writer->offset, writer->buffer, writer->buffer_stored_len);\n    if(ret != PACK_OK)\n    {\n        PACK_LOG(\"write_software err ret %d, offset %u, len %u\", ret, writer->offset, writer->buffer_stored_len);\n        return PACK_ERR;\n    }\n\n    writer->offset_flag = false;\n    return PACK_OK;\n}\n\n\n\nstatic int pack_wr_begin_not_aligned(pack_writer_s *writer, uint32_t block_begin_offset, uint32_t block_size,\n                                uint32_t offset, const uint8_t *buff, uint16_t len , uint16_t *out_len)\n{\n       uint32_t block_left_len = (block_begin_offset + block_size) - offset;\n       uint32_t write_len = MIN(len, block_left_len);\n       int ret;\n\n        if (writer->offset_flag && writer->buffer)\n        {\n            memcpy(writer->buffer + writer->buffer_stored_len, buff, write_len);\n            writer->buffer_stored_len += write_len;\n        }\n        else\n        {\n            if (writer->buffer == NULL)\n            {\n                writer->buffer = PACK_MALLOC(block_size);\n                if (writer->buffer == NULL)\n                {\n                    PACK_LOG(\"malloc null %d\", block_size);\n                    return PACK_ERR;\n                }\n                writer->block_size = block_size;\n            }\n\n            writer->buffer_stored_len = (offset - block_begin_offset);\n            ret = writer->hardware->read_software(writer->hardware, block_begin_offset, writer->buffer,\n                    writer->buffer_stored_len);\n            if (ret != PACK_OK)\n            {\n                PACK_LOG(\"read_software fail offset %ld, size %ld ret %d\", block_begin_offset, writer->buffer_stored_len, ret);\n                return ret;\n            }\n            memcpy(writer->buffer + writer->buffer_stored_len, buff, write_len);\n            writer->offset_flag = true;\n            writer->offset = block_begin_offset;\n            writer->buffer_stored_len += write_len;\n        }\n\n\n        if (writer->buffer_stored_len >= block_size)\n        {\n            ret = pack_write_data(writer, writer->offset, writer->buffer, block_size);\n            if (ret != PACK_OK)\n            {\n                PACK_LOG(\"pack_write_data fail,offset %ld, size %ld, ret %ld\",\n                        writer->offset, block_size, ret);\n                return ret;\n            }\n            writer->offset_flag = false;\n        }\n\n        *out_len = (uint16_t)write_len;\n\n        return PACK_OK;\n}\n\nstatic int pack_wr_entire_blocks(pack_writer_s *writer, uint32_t block_begin_offset,\n                                    uint32_t block_size, const uint8_t *buff, uint16_t len, uint16_t *out_len)\n{\n    int ret;\n\n    *out_len = 0;\n\n    for (; len >= block_size; len -= block_size, block_begin_offset += block_size,\n                                buff += block_size, *out_len += block_size)\n    {\n        ret = pack_write_data(writer, block_begin_offset, buff, block_size);\n        if (ret != PACK_OK)\n        {\n            PACK_LOG(\"pack_write_data fail,offset %ld, size %ld, ret %ld\",\n                    writer->offset, block_size, ret);\n            return ret;\n        }\n    }\n\n    return PACK_OK;\n}\n\n\nstatic int pack_wr_end_not_aligned_block(pack_writer_s *writer, uint32_t block_begin_offset,\n                                            uint32_t block_size, const uint8_t *buff, uint16_t len)\n{\n    if (writer->buffer == NULL)\n    {\n        writer->buffer = PACK_MALLOC(block_size);\n        if (writer->buffer == NULL)\n        {\n            PACK_LOG(\"malloc null %d\", block_size);\n            return PACK_ERR;\n        }\n        writer->block_size = block_size;\n    }\n\n    memcpy(writer->buffer, buff, len);\n    writer->buffer_stored_len = len;\n    writer->offset_flag = true;\n    writer->offset = block_begin_offset;\n    return PACK_OK;\n}\n\nint pack_wr_write(pack_writer_s *writer, uint32_t offset, const uint8_t *buff, uint16_t len)\n{\n    uint16_t write_len = 0;\n    int ret;\n    uint32_t block_size;\n\n    if(pack_wr_check(writer) != PACK_OK)\n    {\n        return PACK_ERR;\n    }\n\n\n    if(writer->offset_flag && (writer->offset + writer->buffer_stored_len != offset)\n        && (writer->buffer_stored_len > 0))\n    {\n\n        ret = pack_wr_write_stored_data(writer);\n        if (ret != PACK_OK)\n        {\n            return ret;\n        }\n    }\n\n    block_size = writer->hardware->get_block_size(writer->hardware);\n    if (block_size == 0)\n    {\n        PACK_LOG(\"err block_size is 0\");\n        return PACK_ERR;\n    }\n\n    if (offset % block_size)\n    {\n        uint32_t block_begin;\n\n        block_begin = ((offset / block_size) * block_size);\n        ret = pack_wr_begin_not_aligned(writer, block_begin, block_size, offset, buff, len, &write_len);\n        if (ret != PACK_OK)\n        {\n            return ret;\n        }\n\n        buff += write_len;\n        len -= write_len;\n        offset += write_len;\n    }\n\n    if (len <= 0)\n    {\n        return PACK_OK;\n    }\n\n    ret = pack_wr_entire_blocks(writer, offset, block_size, buff, len, &write_len);\n    if (ret != PACK_OK)\n    {\n        return ret;\n    }\n\n    buff += write_len;\n    len -= write_len;\n    offset += write_len;\n\n    if (len <= 0)\n    {\n        return PACK_OK;\n    }\n\n    return pack_wr_end_not_aligned_block(writer, offset, block_size, buff, len);\n\n}\n\nint pack_wr_write_end(pack_writer_s *writer)\n{\n    if(0 == writer->buffer_stored_len)\n    {\n        return PACK_OK;\n    }\n\n    return pack_wr_write_stored_data(writer);\n}\n\n\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/package/package_writer.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n/**@defgroup atiny_adapter Agenttiny Adapter\n * @ingroup agent\n */\n\n#ifndef PACKAGE_WRITER_H\n#define PACKAGE_WRITER_H\n\n#include \"ota/package.h\"\n#include \"package_head.h\"\n\n\ntypedef struct\n{\n    uint32_t offset;\n    int32_t offset_flag;\n\n    uint8_t * buffer;\n    uint16_t block_size;\n    uint16_t buffer_stored_len;\n    pack_hardware_s *hardware;\n}pack_writer_s;\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\nvoid pack_wr_init(pack_writer_s *writer);\nvoid pack_wr_destroy(pack_writer_s *writer);\nvoid pack_wr_set_device(pack_writer_s *writer, pack_hardware_s *hardware);\nint pack_wr_write(pack_writer_s *writer, uint32_t offset, const uint8_t *buff, uint16_t len);\nint pack_wr_write_end(pack_writer_s *writer);\n\n\n\n\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif //PACKAGE_WRITER_H\n\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/script/config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<config>\n\t   <version>0x0</version>\n\t   <!--checksum>sha256/none/sha256_rsa2048</checksum-->\n\t   <checksum>sha256_rsa2048</checksum>\n\t   <tlv name=\"bin_type\"  attribute=\"4\">\n\t\t<!--value name=\"value\" type=\"integer\"  value_len=\"4\">0:full_bin_data,1:diff_data</value-->\n\t\t<value name=\"value\" type=\"integer\"  value_len=\"4\">0</value>\t\n\t   </tlv>\n\t   <!-- tlv name=\"user defined name\" attribute=\"greater or equal than 100,should be a different id\">\n\t\t<value name=\"user defined name\" type=\"string/integer\"  value_len=\"less or equal than 8, only used for integer type\">value</value>\n\t   </tlv-->\n\t   <!-- tlv name=\"software_info\"  attribute=\"100\">\t\t\n\t\t<value name=\"software_version\" type=\"string\">LiteOSV1R2C510SPC00</value>\n\t\t<value name=\"software_type\" type=\"integer\"  value_len=\"2\">0xffee</value>\n\t   </tlv>\n\t   <tlv name=\"test_vaule\"  attribute=\"101\">\n\t\t<value name=\"test_vaule\" type=\"integer\" attribute=\"102\" value_len=\"1\">100</value>\n\t\t<value name=\"test_vaule\" type=\"integer\" attribute=\"103\" value_len=\"1\">156</value>\n\t\t<value name=\"test_vaule\" type=\"integer\" attribute=\"104\" value_len=\"4\">0x12345678</value>  \n\t   </tlv-->\t      \n</config>"
  },
  {
    "path": "Huawei_LiteOS/components/ota/script/gen_key.py",
    "content": "from Crypto import Random\nfrom Crypto.PublicKey import RSA\n\nDEFAULT_PRIAVTE_KEY_FILE_NAME = 'private_key.pem'\nDEFAULT_PUBLIC_KEY_FILE_NAME = 'public_key.pem'\n\ndef main():\n\trandom_generator = Random.new().read\n\trsa = RSA.generate(2048, random_generator)\n\tprivate_pem = rsa.exportKey()\n\t\n\twith open(DEFAULT_PRIAVTE_KEY_FILE_NAME, 'w') as f:\n\t\tf.write(private_pem)\n\t\t\n\tpublic_pem = rsa.publickey().exportKey()\n\twith open(DEFAULT_PUBLIC_KEY_FILE_NAME, 'w') as f:\n\t\tf.write(public_pem)\n\nif __name__ == \"__main__\":\n\tmain()"
  },
  {
    "path": "Huawei_LiteOS/components/ota/script/package_software.py",
    "content": "import zlib\nimport os\nimport sys\nimport getopt\nimport  xml.dom.minidom as minidom\n#import hashlib\nimport traceback\nfrom Crypto import Random\nfrom Crypto.Hash import SHA256\nfrom Crypto.Signature import pss as pss\nfrom Crypto.PublicKey import RSA\nimport binascii\nimport base64\n\n'''\n'''\n\nOK = 0\nERR = 1\nSTOP = 2\nRET_INVALID_ARG = 3\nRET_FILE_NOT_EXIST = 4\nRET_FILE_PATH_ERR = 5\nRET_FILE_OPERATION_ERR = 6\nRET_XML_CONFIG_ERR=7\n\n\nFILE_OPERATE_SIZE = 4 * 1024\n\nTLV_SHA256_CHECKSUM = 1\nTLV_CRC_CHECKSUM = TLV_SHA256_CHECKSUM + 1\nTLV_SHA256_RSA2048_CHECKSUM = TLV_SHA256_CHECKSUM + 2\n\nINVALID_OFFSET = -1\nTLV_T_LEN = 2\nTLV_L_LEN = 2\n\nTLV_HEAD_LEN_POS = 4\nTLV_TOTAL_LEN_POS = 8\nDEFAULT_CONFIG_FILE_NAME = 'config.xml'\nDEFAULT_KEY_FILE_NAME = 'private_key.pem'\n\ndef min(a, b):\n\tif a <= b:\n\t\treturn a\n\telse:\n\t\treturn b\t\n\ndef append_buffer(buffer, pos, value):\n\tbuffer.append(value)\n\t\ndef serialize_byte(buffer, value, byte_number = 4, pos = 0, callback = append_buffer):\n\tmax_num = 4\n\tif byte_number > max_num:\n\t\tprint 'write byte_number %d err'%(byte_number)\n\t\traise Exception()\n\t\treturn ERR\n\t\n\tmask = 0xff000000\n\tshift_num = 24\n\tfor i in range(0, max_num - byte_number):\n\t\tmask = (mask >> 8)\n\t\tshift_num -= 8\n\n\tfor i in range(0, byte_number):\n\t\tcallback(buffer, i + pos, ((mask & value) >> shift_num))\n\t\tmask = (mask >> 8)\n\t\tshift_num -= 8\n\t\t\n\treturn OK\n\nclass file_writer(object):\n\tdef __init__(self, file_name):\n\t\tself.fd = open(file_name, 'w+b')\n\t\t\n\tdef __del__(self):\n\t\tself.fd.close()\n\t\t\n\tdef write(self, value, byte_num = 4, offset = INVALID_OFFSET):\n\t\tif offset != INVALID_OFFSET:\n\t\t\tself.fd.seek(offset)\t\n\t\t\t\n\t\tif isinstance(value, int) or isinstance(value, long):\n\t\t\tbuffer = bytearray()\n\t\t\tserialize_byte(buffer, value, byte_num)\n\t\telif isinstance(value, str):\n\t\t\tbuffer=bytearray(value)\n\t\telse:\n\t\t\tbuffer = value\n\t\tself.fd.seek(self.fd.tell())\n\t\tself.fd.write(buffer)\n\t\t\n\tdef read(self, size, offset = INVALID_OFFSET):\n\t\tif offset != INVALID_OFFSET:\n\t\t\tself.fd.seek(offset)\t\t\n\t\treturn self.fd.read(size)\n\t\t\n\tdef tell(self):\n\t\treturn self.fd.tell()\n\t\t\n\tdef seek(self, offset):\n\t\tself.fd.seek(offset)\n\n\n\t\nclass config_info(object):\n\tdef __init__(self):\n\t\tself.input_file=\"\"\n\t\tself.output_file=\"\"\n\t\tself.config_file=\"\"\t\n\t\tself.key_file = \"\"\n\t\t\n\tdef parse_args(self):\n\t\ttry:\n\t\t\topts, args = getopt.getopt(sys.argv[1:], 'c:i:o:k')\n\t\texcept getopt.GetoptError as err:\n\t\t\tprint str(err)\t\t\t\n\t\t\treturn RET_INVALID_ARG\t\t\t\n\t\t\n\t\tself.config_file = \"config.xml\"\n\t\tfor opt, arg in opts:\n\t\t\tif opt == \"-c\":\n\t\t\t\tself.config_file = arg\n\t\t\telif opt == \"-i\":\n\t\t\t\tself.input_file = arg\n\t\t\telif opt == \"-o\":\n\t\t\t\tself.output_file = arg\n\t\t\telif opt == \"-k\":\n\t\t\t\tself.key_file = arg\n\t\t\telse:\n\t\t\t\tpass\n\t\t\n\t\tif not os.path.isfile(self.input_file):\n\t\t\tprint \"{0} is not a file!\".format(self.input_file)\n\t\t\treturn RET_INVALID_ARG\n\t\t\t\n\t\tif self.output_file == '':\n\t\t\tself.output_file = os.path.join(os.getcwd(), os.path.basename(self.input_file) + \".out_bin\")\n\t\t\n\t\tif self.config_file == '':\n\t\t\tself.config_file = DEFAULT_CONFIG_FILE_NAME\n\t\t\n\t\tif self.key_file == '':\n\t\t\tself.key_file = DEFAULT_KEY_FILE_NAME\n\t\t\n\t\tif not os.path.isfile(self.config_file):\n\t\t\tprint \"config xml file \\\"{}\\\" not exist\".format(self.config_file)\n\t\t\treturn RET_INVALID_ARG\t\n\t\t\n\t\treturn OK\n\t\n\tdef get_input_file(self):\n\t\treturn self.input_file\n\t\n\tdef get_output_file(self):\n\t\treturn self.output_file\n\t\n\tdef get_config_file(self):\n\t\treturn self.config_file\n\t\n\t\t\t\nclass checksum(object):\n\tdef name(self):\n\t\treturn ''\n\t\t\n\tdef size(self):\n\t\treturn 0\n\t\n\tdef attribute(self):\n\t\treturn -1\n\t\t\n\tdef update(self, buffer):\n\t\tpass\n\t\n\tdef get_checksum(self):\n\t\treturn \"\"\n\t\t\n\tdef reset(self):\n\t\tpass\n\nclass sha256_checksum(checksum):\n\tdef __init__(self):\n\t\tself.reset()\n\t\t\n\tdef name(self):\n\t\treturn 'sha256'\n\t\n\tdef attribute(self):\n\t\treturn TLV_SHA256_CHECKSUM\n\t\t\n\tdef size(self):\n\t\treturn 32\n\t\t\n\tdef update(self, buffer):\n\t\tself.sha256.update(buffer)\n\t\n\tdef get_checksum(self):\n\t\tprint 'sha256 checksum:%s'%(self.sha256.hexdigest())\n\t\treturn self.sha256.digest()\n\t\n\tdef reset(self):\n\t\t#self.sha256 = hashlib.sha256('')\n\t\tself.sha256 = SHA256.new()\n\t\t\nclass sha256_rsa2048_checksum(sha256_checksum):\n\tdef __init__(self, priave_key_file_name):\n\t\tsha256_checksum.__init__(self)\n\t\tself.priave_key_file_name = priave_key_file_name\n\t\t\n\tdef name(self):\n\t\treturn 'sha256_rsa2048'\n\t\n\tdef attribute(self):\n\t\treturn TLV_SHA256_RSA2048_CHECKSUM\n\t\t\n\tdef size(self):\n\t\treturn 256\n\t\n\tdef get_checksum(self):\n\t\tprint 'sha256:%s'%(self.sha256.hexdigest())\n\t\twith open(self.priave_key_file_name) as f:\n\t\t\tkey = f.read()\n\t\t\trsakey = RSA.importKey(key)\n\t\t\tsigner = pss.new(rsakey)\n\t\t\tsign = signer.sign(self.sha256)\t\t\t\n\t\tprint 'sha256-rsa2048 checksum:%s'%(binascii.hexlify(sign))\n\t\t#print 'base 64:%s' %(base64.b64encode(sign))\n\t\treturn sign\n\t\t\nclass crc256_checksum(checksum):\n\tdef name(self):\n\t\treturn 'crc256'\n\t\t\nclass none_checksum(checksum):\n\tdef name(self):\n\t\treturn 'none'\n\n\t\nclass tlv_type(object):\n\tdef set_writer(self, writer):\n\t\tself.writer = writer\n\t\t\n\tdef name(self):\n\t\treturn ''\n\t\t\n\tdef get_value(self, value, tlv):\n\t\treturn [len(value), value]\n\t\t\n\tdef write(self, tlv):\n\t\t[l, v] = self.get_value(tlv.firstChild.data, tlv)\n\t\tif 0 == l:\n\t\t\treturn [OK, 0]\n\t\tif l < 0:\n\t\t\treturn [RET_XML_CONFIG_ERR, 0]\n\t\tself.writer.write(v, l)\n\t\treturn [OK, l]\n\t\t\nclass string_type(tlv_type):\n\tdef name(self):\n\t\treturn 'string'\n\t\t\nclass integer_type(tlv_type):\n\tdef name(self):\n\t\treturn 'integer'\n\t\t\n\tdef get_value(self, value, tlv):\n\t\tvalue_len = tlv.getAttribute('value_len')\n\t\tif value_len == '' or long(value_len, 0) > 4:\n\t\t\tprint 'value_len error'\n\t\t\treturn [RET_XML_CONFIG_ERR, '']\t\t\n\t\t\n\t\treturn [long(value_len, 0), long(value, 0)]\n\nclass software_header(object):\t\n\tdef __init__(self, config, writer):\n\t\tself.writer = writer\n\t\tself.config = config\n\t\tself.software_checksum_offset = INVALID_OFFSET\n\t\tself.head_len = 0\t\n\t\tself.software_checksum = ''\n\t\tret = self.__write_config()\n\t\tif ret != OK:\n\t\t\treturn\n\t\tself.__update_head_checksum()\n\n\t\n\tdef __write_version(self, dom):\n\t\tver = dom.getElementsByTagName(\"version\")\n\t\tversion_no = 0\t\t\n\t\tif 0 == len(ver):\n\t\t\tprint \"version tag not exist,using version No.0\"\n\t\telse:\n\t\t\tversion_no = int(ver[0].firstChild.data, 0)\n\t\t\n\t\tself.writer.write(version_no)\n\t\t\n\tdef __write_tlvs(self, dom):\n\t\ttlvs = dom.getElementsByTagName(\"tlv\")\n\t\ttypes = [string_type(), integer_type()]\n\t\tfor type in types:\n\t\t\ttype.set_writer(self.writer)\n\t\t\n\t\tfor tlv in tlvs:\n\t\t\tvalues = tlv.getElementsByTagName(\"value\")\n\t\t\tif len(values) == 0:\n\t\t\t\tprint '%s has no value'%(tlv.nodeName)\n\t\t\t\tcontinue\n\t\t\t\t\n\t\t\tattribute = tlv.getAttribute(\"attribute\")\n\t\t\tif attribute == '':\n\t\t\t\tprint 'attribute empty'\n\t\t\t\treturn RET_XML_CONFIG_ERR\n\t\t\t\n\t\t\tself.writer.write(long(attribute, 0), TLV_T_LEN)\n\t\t\tlen_pos = self.writer.tell()\n\t\t\tself.writer.write(0, TLV_L_LEN)\t\n\t\t\tvalues_len = 0\n\t\t\tfor value in values:\n\t\t\t\tret = ERR\n\t\t\t\tname = ''\n\t\t\t\tvalue_len = 0\n\t\t\t\t\n\t\t\t\tfor type in types:\n\t\t\t\t\tname = value.getAttribute(\"type\")\n\t\t\t\t\tif name == type.name():\n\t\t\t\t\t\t[ret, value_len] = type.write(value)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\n\t\t\t\tif ret != OK:\n\t\t\t\t\tprint 'value type %s err'%(name)\n\t\t\t\t\treturn ret\n\t\t\t\tvalues_len += value_len\n\t\t\tpos = self.writer.tell()\n\t\t\tself.writer.write(values_len, TLV_L_LEN, len_pos)\n\t\t\tself.writer.seek(pos)\n\t\treturn OK\n\t\n\tdef __init_checksum(self, dom):\t\n\t\tchecksum = dom.getElementsByTagName(\"checksum\")\n\t\tif len(checksum) == 0:\n\t\t\tprint \"no checksum tag in config file\"\n\t\t\treturn RET_XML_CONFIG_ERR\n\t\talgs = [sha256_checksum(), crc256_checksum(), sha256_rsa2048_checksum(self.config.key_file), none_checksum()]\n\t\tfor alg in algs:\n\t\t\tif alg.name() == checksum[0].firstChild.data:\n\t\t\t\tself.checksum_alg = alg\n\t\t\t\treturn OK\n\t\t\t\n\t\tprint 'no checksum alg selected'\n\t\treturn RET_XML_CONFIG_ERR\t\n\t\t\n\t\t\t\t\n\t\t\n\tdef __write_config(self):\n\t\tdom = minidom.parse(self.config.config_file)\n\t\t\n\t\t#version No.\n\t\tself.__write_version(dom);\n\t\t\n\t\t#reserve header length\n\t\tself.writer.write(0)\n\t\t\n\t\t#reserve total length\n\t\tself.writer.write(0)\t\n\n\t\t#tlvs \n\t\tself.__write_tlvs(dom)\n\t\t\n\t\tret = self.__init_checksum(dom)\n\t\tif ret != OK:\n\t\t\treturn ret\n\t\t\n\t\tsize = self.checksum_alg.size()\n\t\tif size > 0:\t\t\t\n\t\t\tself.writer.write(self.checksum_alg.attribute(), TLV_T_LEN)\t\t\t\n\t\t\tself.writer.write(size, TLV_L_LEN)\n\t\t\tself.software_checksum_offset = self.writer.tell()\t\n\t\t\tself.writer.write(bytearray(size))\t\t\t\n\t\tself.head_len = self.writer.tell()\n\t\tself.writer.write(self.head_len, 4, TLV_HEAD_LEN_POS)\n\t\tself.writer.write(self.head_len + os.path.getsize(self.config.input_file), 4, TLV_TOTAL_LEN_POS)\n\t\tself.writer.seek(self.head_len)\n\t\t\n\t\treturn OK\n\t\t\n\tdef write_software(self, buffer):\n\t\tif self.software_checksum_offset == INVALID_OFFSET:\n\t\t\treturn\n\t\tself.checksum_alg.update(buffer)\n\t\n\tdef write_software_end(self):\n\t#write head and software sha256\n\t\tif self.software_checksum_offset == INVALID_OFFSET:\n\t\t\treturn\n\t\tsoftware_checksum = self.checksum_alg.get_checksum()\n\t\tself.writer.write(software_checksum, len(software_checksum), self.software_checksum_offset)\n\t\t\n\tdef __update_head_checksum(self):\n\t\tread_len = self.head_len\n\t\twhile read_len > 0:\n\t\t\ttmp_len = min(read_len, FILE_OPERATE_SIZE)\n\t\t\tif read_len == self.head_len:\n\t\t\t\tbuffer = self.writer.read(tmp_len, 0)\n\t\t\telse:\t\t\t\t\n\t\t\t\tbuffer = self.writer.read(tmp_len)\n\t\t\tself.checksum_alg.update(buffer)\n\t\t\tread_len -= tmp_len\n\t\t\nclass software_maker(object):\n\tdef __init__(self):\n\t\tpass\n\n\tdef make_software(self, config):\n\t\tret = OK\n\t\tinput_fd = None\n\t\theader = None\t\t\n\t\ttry:\t\t\t\n\t\t\twriter = file_writer(config.get_output_file())\t\t\t\n\t\t\theader = software_header(config, writer)\t\t\t\t\t\n\t\t\tinput_fd = open(config.input_file, 'rb')\n\t\t\twhile True:\n\t\t\t\tbuffer = input_fd.read(FILE_OPERATE_SIZE)\n\t\t\t\tif len(buffer) == 0: # EOF or file empty. return hashes\t\n\t\t\t\t\theader.write_software_end()\n\t\t\t\t\tbreak\n\t\t\t\theader.write_software(buffer)\n\t\t\t\twriter.write(buffer)\n\t\t\t\t\n\t\texcept IOError as e:\n\t\t\tprint \"IOError {0}\".format(str(e))\t\n\t\t\tret = RET_FILE_OPERATION_ERR\n\t\t\ttraceback.print_exc()\n\t\t\t\n\t\texcept  Exception as err:\n\t\t\tprint 'except hanppen!' + str(err)\n\t\t\tret = RET_FILE_OPERATION_ERR\n\t\t\ttraceback.print_exc()\n\n\t\tfinally:\n\t\t\tif not input_fd is None:\n\t\t\t\tinput_fd.close()\t\t\t\n\n\t\tprint 'make software %s to %s ,length %d, ret %d'%(config.input_file, config.output_file, os.path.getsize(config.input_file), ret)\n\t\t\n\t\treturn ret\n\ndef print_usage():\n\tprint \"Usage: {} [-c config_xml_file]  [-o output_file] -i input_file [-k key_file]\".format(sys.argv[0])\n\t\n\n\t\ndef main():\n\tconfig = config_info()\t\n\tret = config.parse_args()\t\n\tif ret != OK:\n\t\tprint \"parse args err ret %d\"%(ret)\n\t\tprint_usage()\n\t\treturn ret\n\t\n\tmaker = software_maker()\n\tret = maker.make_software(config)\n\tif ret != OK:\n\t\tprint_usage()\n\treturn ret\n\t\nif __name__ == \"__main__\":\n\tmain()\n\t\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/script/private_key.pem",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAyUvst7y/9Fm5px8Sw8wGA7EfDTo2aiJv0+c9RT+W77vNTf7W\n2fd/14w6sYBeG9OFgTGstTA/Ya9ST0OXG01CnLhHkF5ok1wXSNAJbBoJ3VOc50hX\n+f3wsOphV0xddr2aZ2gaxqnbG7IvFxILHb8+MmM9zjT1RG9S3XM1ZxrDofIdxVf6\nTOmk4OPpn+0zoLqhxvbuU+3XQihNZYK1HkvwGXh7jDPC8qCVvu0R1v5oYRvQCCWv\nl9uYXGLDrg3Gm9fQEY5tYgtSr9UUrVv6i6uZgzIhPX2/XJjchsuNT5ikFoAriSuN\na+5dVbfmiDNLKB5L7dsRvXs3Q1XFkZulqaHJHwIDAQABAoIBACbsB1l/pZ4Zu0wV\nNgul54PPO7HTD7J19imDDNXW9dhk982c+O4sbQvAkZjAuXGn9KiGcl6Wdartu3yY\nFR+yUK788tl3Z8EWjWoGz8uXPVEOWchetKQh9eg/aZL3sRrEjpZwCr1fGn7AdVqA\noqWd1OjpR4oXs1UIMX2gSTMmea1WS1Nipf36btMHIuZn5c8xqfZAK9k8EVgfpwDw\nn/Dq46uMcc7TFRsFZ47o4VKoSi8doj1SXuqd3im9RegXGd0u+wbYyvalJbCLTltV\ndmt4DfrLLj5GLcKFVvJPRK2duTDj2gMrKSBjnCU1CPjwHg1PpNdKUQwDU3yj4/Hj\nVfVyOAECgYEA0NOqfJOUtEqzc1+ja/iQazanqCI5Q+H539DF24ceaipU9Z0NSFOp\nY5ueKZOJELudy7GKmSXygnhuMK0DE1eLMPx6p6sQzYAFgBehaiDXJXceJV6gjVyH\n5B3yDlYmvUBtARQIjn5WYezSgq+09VBNTub3tyt4L65q/cjiChjP4TkCgYEA9sTK\nEcBvL6sUOJA7T5gs7/BtnZmgUlJDIe7D8XqDu8ir+woz+bCH86q71PWwPAWoVT+Q\nLHxRoqqDIHiyvdjOt9p+ucQ6mCR6RO+CnAjr279JdTcEYvSwx3Jrx3D+DAk0j8+J\niQnH4/V6b9iiEqmkA/94hMkyO0yv8LfFFeSx9RcCgYEAsc6oaW5XvbOlXGVghryc\na02cL6MEU3KECjh/X86K7SaiNIfHGYByyGdmokwG9wJo91lyg7g15zWXzUZjSgLO\nd6Vi4oTbx75r8IcuX2kbB8GHH5aU6giRhICi6+YbEiVbKwHdz0ZvUu4MyE3HrOD1\nEmvDHGmc6ix+2RxEqwg5aLECgYEA4DAgtMfzO4dds5W1jLZf/QydSZUMhj2eJ/HX\nqkb37158gHHgjnPGz6TJSMx888rgB7LbtM6tC++FebauDLQv+fBTOUoBQb/CJWbD\nbibcwKOkhQ0auxw6jrhxGpyY8S5bxltyREHSjFO0jHBvrizYiZlLULfJHv6oyTTr\npNxEoLkCgYBUZ6KS2qy6/3LFVwJQ/ISoUYbVdVHJniLaOGF2zeCe0hJa8XufT56s\nPDyQcc5Im3Bbub5+22O1rRS+lnarS+rU4YiCorLbJ5FFdmAo/iJ7idiWrqDLSKJF\nzewX9hnG3a5o60OmztYSh+c6LRqpdmL8jFNz27mzwO6/1bYFCKP89Q==\n-----END RSA PRIVATE KEY-----"
  },
  {
    "path": "Huawei_LiteOS/components/ota/script/public_key.pem",
    "content": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyUvst7y/9Fm5px8Sw8wG\nA7EfDTo2aiJv0+c9RT+W77vNTf7W2fd/14w6sYBeG9OFgTGstTA/Ya9ST0OXG01C\nnLhHkF5ok1wXSNAJbBoJ3VOc50hX+f3wsOphV0xddr2aZ2gaxqnbG7IvFxILHb8+\nMmM9zjT1RG9S3XM1ZxrDofIdxVf6TOmk4OPpn+0zoLqhxvbuU+3XQihNZYK1Hkvw\nGXh7jDPC8qCVvu0R1v5oYRvQCCWvl9uYXGLDrg3Gm9fQEY5tYgtSr9UUrVv6i6uZ\ngzIhPX2/XJjchsuNT5ikFoAriSuNa+5dVbfmiDNLKB5L7dsRvXs3Q1XFkZulqaHJ\nHwIDAQAB\n-----END PUBLIC KEY-----"
  },
  {
    "path": "Huawei_LiteOS/components/ota/sota/sota.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#include \"sota/sota.h\"\n#include \"sota_hal.h\"\n#include \"flag_manager.h\"\n\n#include<stdio.h>\n#include<string.h>\n#include<stdint.h>\n\n#include \"ota/package.h\"\n#include \"upgrade_flag.h\"\n\n#define VER_LEN      16\n#define SEND_BUF_LEN 128\n\ntypedef  uint8_t   BYTE;\ntypedef  uint16_t  WORD;\n\n#ifdef SOTA_DEBUG\n#define SOTA_LOG(fmt, ...) \\\n    do \\\n    { \\\n        if (NULL != g_flash_op.sota_printf) \\\n        { \\\n            (void)g_flash_op.sota_printf(\"[%s:%d][I]\"fmt\"\\n\", \\\n                                  __func__, __LINE__, ##__VA_ARGS__); \\\n        } \\\n    } while (0)\n#else\n#define SOTA_LOG(fmt, ...) ((void)0)\n#endif\n\ntypedef enum\n{\n    MSG_GET_VER = 19,\n    MSG_NOTIFY_NEW_VER,\n    MSG_GET_BLOCK,\n    MSG_DOWNLOAD_STATE,\n    MSG_EXC_UPDATE,\n    MSG_NOTIFY_STATE = 24\n}msg_code_e;\n\ntypedef enum\n{\n    IDLE = 0,\n    DOWNLOADING,\n    UPDATING,\n    UPDATED,\n}sota_state;\n\ntypedef enum\n{\n    DEV_OK = 0x0,\n    DEV_BUSYING = 0x1,\n    DEV_WEAK_SIGNAL = 0x2,\n    DEV_LATEST_VER = 0x3,\n    DEV_LOW_BATTERY = 0x4,\n    DEV_NO_SPACE = 0x5,\n    DOWNLOAD_TIME_OUT = 0x6,\n    FIRMWARE_CHECK_ERROR = 0x7,\n    FIRMWARE_NOT_MATCH = 0x8,\n    DEV_MEMORY_EXHAUSTED = 0x9,\n    DEV_INNER_ERROR = 0x7f,\n    UPDATE_TASK_EXIT = 0x80,\n    REQUEST_BLOCK_INVALID = 0x81\n}response_code_e;\n\ntypedef struct ota_pcp_head_t\n{\n    WORD ori_id;\n    BYTE ver_num;\n    BYTE msg_code;\n    WORD chk_code;\n    WORD data_len;\n}ota_pcp_head_s;\n\ntypedef struct ota_ver_notify\n{\n    BYTE ver[VER_LEN];\n    WORD block_size;\n    WORD block_totalnum;\n    WORD ver_chk_code;\n}ota_ver_notify_t;\n\ntypedef struct sota_update_info\n{\n    uint16_t block_size;\n    uint32_t block_num;\n    uint32_t block_offset;\n    uint32_t block_totalnum;\n    uint32_t block_tolen;\n    uint32_t ver_chk_code;\n    char     ver[VER_LEN];\n    uint8_t  state;\n} sota_update_info_t;\n\nsota_arg_s                         g_flash_op;\nstatic sota_update_info_t          g_at_update_record;\nstatic pack_storage_device_api_s * g_storage_device;\n\n#define LITTLE_DNEIAN\n#ifdef LITTLE_DNEIAN\n#define htons_ota(x) ((((x) & 0x00ff) << 8) | (((x) & 0xff00) >> 8))\n#else\n#define htons_ota(x) (x)\n#endif\n#define PCP_HEAD 0xFFFE\n#define BLOCK_HEAD 3\n\nstatic int chartoint(const char* port)\n{\n\tint tmp=0;\n\twhile (*port >= '0' && *port <= '9')\n\t{\n\t\ttmp = tmp*10+*port-'0';\n\t\tport++;\n\t}\n\treturn tmp;\n}\n\nint32_t sota_parse(const int8_t *in_buf, int32_t in_len, int8_t * out_buf,  int32_t out_len)\n{\n    ota_pcp_head_s *phead;\n    char *databuf;\n    char *rlen;\n    int buflen;\n    int ret,cmd_crc_num;\n    char *buf;\n\n    if (in_buf == NULL || in_len < (sizeof(ota_pcp_head_s) - sizeof(WORD)) || out_buf == NULL)\n    {\n        SOTA_LOG(\"in_buf:%p len:%d, out_buf:%p\",in_buf,(int)in_len, out_buf);\n        goto END;\n    }\n\n    rlen = strstr((const char*)in_buf,\":\");/*lint !e158*/\n    if (rlen == NULL)/*lint !e158*/\n    {\n        SOTA_LOG(\"buflen invalid\");\n        goto END;\n    }\n    buflen = chartoint(rlen+1);\n    if (out_len < buflen)\n    {\n        SOTA_LOG(\"out buf not enough\");\n        goto END; \n    }\n    \n    buflen = buflen * 2;\n    databuf = strstr(rlen,\",\");\n    if (databuf == NULL)\n    {\n        SOTA_LOG(\"buf invalid\");\n        goto END;\n    }\n    buf = databuf + 1;\n\n    memset(out_buf, 0, out_len);\n    HexStrToByte((const unsigned char *)buf, (unsigned char *)out_buf, buflen);\n    phead = (ota_pcp_head_s *)out_buf;\n\n    cmd_crc_num = htons_ota(phead->chk_code);\n    phead->chk_code = 0;\n    ret = crc_check((const unsigned char *)out_buf, buflen/2);\n    phead->ori_id = htons_ota(phead->ori_id);\n    if (phead->data_len > BLOCK_HEAD && phead->msg_code == MSG_GET_BLOCK)\n    {\n        phead->data_len = htons_ota(phead->data_len) - BLOCK_HEAD;\n    }\n    if (phead->ori_id != PCP_HEAD || (ret != cmd_crc_num) || \\\n            (phead->msg_code < MSG_GET_VER || phead->msg_code > MSG_NOTIFY_STATE))\n    {\n        SOTA_LOG(\"head wrong! head magic:%X msg_code:%X ver_num:%X ret:%X crc:%X\",\n            phead->ori_id,phead->msg_code,phead->ver_num, ret, cmd_crc_num);\n        goto END;\n    }\n\n    return SOTA_OK;\nEND:\n    return SOTA_FAILED;\n}\n\nstatic int ver_to_hex(const char *bufin, int len, char *bufout)\n{\n    int i = 0;\n    if (NULL == bufin || len <= 0 || NULL == bufout)\n    {\n        return -1;\n    }\n    for (i = 0; i < len; i++)\n    {\n        sprintf(bufout + i * 2, \"%02X\", bufin[i]);\n    }\n    return 0;\n}\n\nstatic int sota_at_send(msg_code_e msg_code, char *buf, int len)\n{\n    uint32_t ret;\n    char crcretbuf[5] = {0};\n    char tmpbuf[SEND_BUF_LEN + VER_LEN] = {0};\n    ota_pcp_head_s pcp_head = {0};\n    unsigned char atwbuf[SEND_BUF_LEN + VER_LEN] = {0};\n    unsigned char hbuf[64] = {0};\n    if (len >= SEND_BUF_LEN)\n    {\n        SOTA_LOG(\"payload too long\");\n        return SOTA_FAILED;\n    }\n    pcp_head.ori_id = htons_ota(PCP_HEAD);\n    pcp_head.ver_num = 1;\n    pcp_head.msg_code = msg_code;\n    pcp_head.data_len = htons_ota(len / 2);\n    (void)ver_to_hex((const char *)&pcp_head, sizeof(ota_pcp_head_s), (char *)hbuf);\n\n    memcpy(atwbuf, hbuf, VER_LEN);\n    memcpy(atwbuf + VER_LEN, buf, len);\n\n    HexStrToByte(atwbuf, (unsigned char*)tmpbuf, len + VER_LEN); //strlen(atwbuf)\n    ret = (uint32_t)crc_check((unsigned char*)tmpbuf, (len + VER_LEN) / 2);\n    (void)snprintf(crcretbuf, sizeof(crcretbuf), \"%04X\", (unsigned int)ret);\n\n    memcpy(atwbuf + 8, crcretbuf, 4);\n    return g_flash_op.sota_send((char *)atwbuf, len + VER_LEN);\n}\n\nstatic void sota_send_request_block(char *ver)\n{\n     char ver_ret[VER_LEN + 2] = {0};\n     char sbuf[64] = {0};\n \n     if (g_flash_op.firmware_download_stage == BOOTLOADER\n        && g_flash_op.current_run_stage == APPLICATION)\n     {\n        return;\n     }\n        \n     memcpy(ver_ret, ver, VER_LEN);\n     ver_ret[VER_LEN] = (g_at_update_record.block_num >> 8) & 0XFF;\n     ver_ret[VER_LEN + 1] = g_at_update_record.block_num & 0XFF;\n     (void)ver_to_hex(ver_ret, (VER_LEN + 2), sbuf);\n     (void)sota_at_send(MSG_GET_BLOCK, sbuf, (VER_LEN + 2) * 2);\n}\n\nstatic void sota_send_response_code(msg_code_e msg_code, response_code_e code)\n{\n    char ret_buf[1];\n    char sbuf[2];\n    \n    ret_buf[0] = code;\n    (void)ver_to_hex(ret_buf, 1, (char *)sbuf);\n    (void)sota_at_send(msg_code, (char *)sbuf, 2);\n}\n\nstatic void sota_reset_record_info(ota_ver_notify_t *notify)\n{\n    g_at_update_record.block_offset = 0;\n    g_at_update_record.block_size = htons_ota(notify->block_size);\n    g_at_update_record.block_totalnum = htons_ota(notify->block_totalnum);\n    g_at_update_record.block_num = 0;\n    g_at_update_record.block_tolen = 0;\n    g_at_update_record.ver_chk_code = notify->ver_chk_code;\n    memcpy(g_at_update_record.ver, notify->ver, VER_LEN);\n    g_at_update_record.state = DOWNLOADING;\n    (void)flag_write(FLAG_APP, (void*)&g_at_update_record, sizeof(sota_update_info_t));  \n}\n\nstatic int32_t sota_new_ver_process(const ota_pcp_head_s *head, const uint8_t *pbuf)\n{\n    char ver[VER_LEN];\n    ota_ver_notify_t *notify = (ota_ver_notify_t *)pbuf;\n    \n    (void)g_flash_op.get_ver(ver, VER_LEN);\n    if (strncmp(ver, (const char*)notify->ver, VER_LEN) == 0)\n    {\n        SOTA_LOG(\"Already latest version %s\", notify->ver);\n        sota_send_response_code(MSG_NOTIFY_NEW_VER, DEV_LATEST_VER);\n        g_at_update_record.state = IDLE;\n        return SOTA_OK;\n    }\n\n    SOTA_LOG(\"Notify ver %s,%x, record ver:%s,%x\", notify->ver, notify->ver_chk_code, \n        g_at_update_record.ver,g_at_update_record.ver_chk_code);\n    if ((strncmp(g_at_update_record.ver, (const char *)notify->ver, VER_LEN) == 0)\n        && (notify->ver_chk_code == g_at_update_record.ver_chk_code))\n    {\n        SOTA_LOG(\"state %d, downloaded %d blocks\", g_at_update_record.state, g_at_update_record.block_num);\n        if (g_at_update_record.block_num < g_at_update_record.block_totalnum\n            && g_at_update_record.state == DOWNLOADING)\n        {\n            sota_send_request_block((char*)notify->ver);\n            return SOTA_DOWNLOADING;\n        }\n        else if (g_at_update_record.block_num == g_at_update_record.block_totalnum\n            && g_at_update_record.state == UPDATING)\n        {\n            sota_send_response_code(MSG_DOWNLOAD_STATE, DEV_OK);\n            return SOTA_UPDATING;\n        }\n        else if (g_at_update_record.block_num == g_at_update_record.block_totalnum\n            && g_at_update_record.state == UPDATED)\n        {\n            return SOTA_UPDATED;\n        }\n    }\n    \n    sota_reset_record_info(notify);\n    sota_send_request_block((char*)notify->ver);\n    return SOTA_DOWNLOADING;\n}\n\nstatic int32_t sota_data_block_process(const ota_pcp_head_s *head, const uint8_t *pbuf)\n{\n    uint16_t block_seq = 0;\n    int ret = SOTA_OK;\n    \n    if (g_at_update_record.state != DOWNLOADING)\n    {\n       return SOTA_UNEXPECT_PACKET;\n    }\n    \n    if (*pbuf == UPDATE_TASK_EXIT)\n    {\n        g_at_update_record.state = IDLE;\n        return SOTA_EXIT;\n    }\n\n    block_seq = ((*(pbuf + 1) << 8) & 0XFF00) | (*(pbuf + 2) & 0XFF);\n    if (g_at_update_record.block_num != block_seq)\n    {\n        SOTA_LOG(\"Download wrong,we need block %X, but rx %X:\",(int)g_at_update_record.block_num, (int)block_seq);\n        return SOTA_UNEXPECT_PACKET;\n    }\n    SOTA_LOG(\"off:%lx size:%x \",g_at_update_record.block_offset,head->data_len);\n    ret = g_storage_device->write_software(g_storage_device, g_at_update_record.block_offset,(const uint8_t *)(pbuf + BLOCK_HEAD), head->data_len);\n    if (ret != SOTA_OK)\n    {\n        SOTA_LOG(\"write software failed. ret:%d\", ret);\n        sota_send_response_code(MSG_DOWNLOAD_STATE, DEV_NO_SPACE);\n        return SOTA_WRITE_FLASH_FAILED;\n    }\n    \n    g_at_update_record.block_offset += g_at_update_record.block_size;\n    g_at_update_record.block_tolen += head->data_len;\n    g_at_update_record.block_num++;\n    \n    if ((g_at_update_record.block_num) < g_at_update_record.block_totalnum)\n    {\n    \tSOTA_LOG(\"Rx total %d bytes downloading\\r\\n\", g_at_update_record.block_tolen);\n    \tsota_send_request_block(g_at_update_record.ver);\n        return SOTA_DOWNLOADING;\n    } \n    else\n    { \n        SOTA_LOG(\"Rx total %d bytes, UPDATING...\\r\\n\", g_at_update_record.block_tolen);\n        ret = g_storage_device->write_software_end(g_storage_device, PACK_DOWNLOAD_OK, g_at_update_record.block_tolen);\n        if (ret != SOTA_OK)\n        {\n            SOTA_LOG(\"write software end ret:%d\", ret);\n            sota_send_response_code(MSG_DOWNLOAD_STATE, FIRMWARE_CHECK_ERROR);\n            return SOTA_WRITE_FLASH_FAILED;\n        }\n        else\n        {\n            g_at_update_record.state = UPDATING;\n            sota_send_response_code(MSG_DOWNLOAD_STATE, DEV_OK);\n            return SOTA_UPDATING;\n        }\n    } \n}\n\nstatic int32_t sota_update_exc_process(const ota_pcp_head_s *head, const uint8_t *pbuf)\n{\n    int ret = SOTA_OK;\n\n    SOTA_LOG(\"Begin excute update\");\n    if (g_at_update_record.state != UPDATING)\n    {\n        return SOTA_UNEXPECT_PACKET;\n    }\n   \n    ret = g_storage_device->active_software(g_storage_device);\n    if (ret != SOTA_OK)\n    {\n        SOTA_LOG(\"Active software failed ret:%d.\", ret);\n        sota_send_response_code(MSG_EXC_UPDATE, DEV_INNER_ERROR);\n        return SOTA_WRITE_FLASH_FAILED;\n    }\n    else\n    {\n        g_at_update_record.state = UPDATED;\n       (void)flag_write(FLAG_APP, (void*)&g_at_update_record, sizeof(sota_update_info_t));\n        sota_send_response_code(MSG_EXC_UPDATE, DEV_OK);\n        return SOTA_UPDATED;\n    }\n}\nint32_t sota_process(void *arg, const int8_t *buf, int32_t buflen)\n{\n    char sbuf[64] = {0};\n    const uint8_t *pbuf = NULL;\n    int ret = SOTA_OK;\n    ota_pcp_head_s *phead;\n    unsigned char  msg_code;\n\n    phead =(ota_pcp_head_s *)buf;\n    msg_code = phead->msg_code;\n\n    if (phead->data_len > 0)\n    {\n        pbuf = (uint8_t *)buf + VER_LEN/2;\n    }\n\n    SOTA_LOG(\"process sota msg %d\", msg_code);\n    \n    switch (msg_code)\n    {\n        case MSG_GET_VER:\n        { \n            char ver_ret[VER_LEN + 1] = {0};\n            (void)g_flash_op.get_ver(ver_ret+1, VER_LEN);\n            (void)ver_to_hex(ver_ret, (VER_LEN + 1), (char *)sbuf);\n            (void)sota_at_send(MSG_GET_VER, (char *)sbuf, (VER_LEN + 1) * 2);\n            ret = SOTA_OK;\n            break;\n        }\n        case MSG_NOTIFY_NEW_VER:\n        {\n            if (phead->data_len > sizeof(ota_ver_notify_t))\n            {\n               ret = sota_new_ver_process(phead, pbuf);\n            }\n            else\n            {\n                ret = SOTA_INVALID_PACKET;\n            }\n            break;\n        }  \n        case MSG_GET_BLOCK:\n        {\n            if (phead->data_len > 0)\n            {\n               ret = sota_data_block_process(phead, pbuf);\n            }\n            else\n            {\n                ret = SOTA_INVALID_PACKET;\n            }\n            break;\n        }\n        case MSG_EXC_UPDATE:\n        {\n             ret = sota_update_exc_process(phead, pbuf);\n             break;\n        }\n        default:\n        {\n            SOTA_LOG(\"Rx invalid packet\");\n            ret = SOTA_INVALID_PACKET;\n            break;\n        }\n    }\n    return ret;\n}\n\nvoid sota_timeout_handler(void)\n{\n    if (g_at_update_record.state == DOWNLOADING)\n    {\n        SOTA_LOG(\"Download block %d over time\", g_at_update_record.block_num);\n        sota_send_response_code(MSG_EXC_UPDATE, DOWNLOAD_TIME_OUT);\n        sota_send_request_block(g_at_update_record.ver);\n    }\n    else if (g_at_update_record.state == UPDATING)\n    {\n        SOTA_LOG(\"Download finish. excute over time\");\n        sota_send_response_code(MSG_EXC_UPDATE, DOWNLOAD_TIME_OUT);\n        sota_send_response_code(MSG_DOWNLOAD_STATE, DEV_OK);\n    }\n}\n\nstatic int sota_status_check(void)\n{\n    upgrade_state_e state;\n    char sbuf[64] = {0};\n    char tmpbuf[VER_LEN+1] = {0};\n\n    memset(&g_at_update_record, 0, sizeof(sota_update_info_t));\n    if (flag_read(FLAG_APP, (char*)&g_at_update_record, sizeof(sota_update_info_t)))\n    {\n        SOTA_LOG(\"flag read err\");\n        return SOTA_FAILED;\n    }\n    SOTA_LOG(\"state:%d flash ver:%s\",g_at_update_record.state, g_at_update_record.ver);\n\n    if (g_flash_op.firmware_download_stage == BOOTLOADER\n        && g_flash_op.current_run_stage == BOOTLOADER)\n    {\n        if (g_at_update_record.state == DOWNLOADING)\n        {\n            sota_send_request_block(g_at_update_record.ver);\n            return SOTA_DOWNLOADING;\n        }\n    }\n    else\n    {\n\t    (void)flag_upgrade_get_result(&state);\n        SOTA_LOG(\"upgrade result: %d\", state);\n        if (state == OTA_SUCCEED)\n        {\n            SOTA_LOG(\"Update version %s success\", g_at_update_record.ver);\n            memcpy(tmpbuf + 1, g_at_update_record.ver, VER_LEN);\n            (void)ver_to_hex(tmpbuf, VER_LEN+1, sbuf);\n            (void)sota_at_send(MSG_NOTIFY_STATE, sbuf, (VER_LEN+1) * 2);\n        }\n    }\n\n    memset(&g_at_update_record, 0, sizeof(sota_update_info_t));\n    (void)flag_write(FLAG_APP, (const void*)&g_at_update_record, sizeof(sota_update_info_t));\n    return SOTA_OK;\n}\n\nstatic int func_flag_read(void *buf, int32_t len)\n{\n    return g_flash_op.ota_info.read_flash(OTA_UPDATE_INFO,buf, len, 0);\n}\n\nstatic int func_flag_write(const void *buf, int32_t len)\n{\n    return g_flash_op.ota_info.write_flash(OTA_UPDATE_INFO,buf, len, 0);\n}\n\nint32_t sota_init(const sota_arg_s* sota_arg)\n{\n    int  ret;\n    flag_op_s flag_op;\n    pack_params_s pack_param;\n\n    if (sota_arg == NULL || sota_arg->sota_malloc == NULL || sota_arg->sota_free == NULL)\n    {\n        return SOTA_FAILED;\n    }\n\n    memcpy(&pack_param.ota_opt, &sota_arg->ota_info, sizeof(pack_param.ota_opt));\n    pack_param.malloc = sota_arg->sota_malloc;\n    pack_param.free = sota_arg->sota_free;\n    pack_param.printf = sota_arg->sota_printf;\n    ret = pack_init_device(&pack_param);\n    if (ret != SOTA_OK)\n    {\n        return SOTA_FAILED;\n    }\n\n    g_storage_device = pack_get_device();\n\n    memcpy(&g_flash_op, sota_arg, sizeof(sota_arg_s));\n\n    flag_op.func_flag_read = func_flag_read;\n    flag_op.func_flag_write = func_flag_write;\n    (void)flag_init(&flag_op);\n    (void)flag_upgrade_init();\n\n    return sota_status_check();\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/sota/sota_hal.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n//#include <board.h>\n#include <stdio.h>\n#include <stdint.h>\n#include <string.h>\n#include <ctype.h>\n#include <stdbool.h>\n//#include \"hal_spi_flash.h\"\n//#include \"at_frame/at_main.h\"\n\nint32_t crc16_ccitt_table[] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a,\n                            0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,\n                            0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528,\n                            0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719,\n                            0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e,\n                            0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf,\n                            0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec,\n                            0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd,\n                            0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2,\n                            0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3,\n                            0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,\n                            0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691,\n                            0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806,\n                            0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37,\n                            0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64,\n                            0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55,\n                            0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n                          };\n\nint32_t do_crc(int32_t reg_init, const unsigned char *massage, int len)\n{\n    int32_t crc_reg = 0;\n    int i = 0;\n    crc_reg = reg_init;\n\n    for(i = 0; i < len; i++)\n    {\n        crc_reg = (crc_reg >> 8) ^ crc16_ccitt_table[(crc_reg ^ massage[i]) & 0xff];\n    }\n    return crc_reg;\n}\n\nint32_t crc_check(const unsigned char *message, int len)\n{\n    int32_t crc_reg = 0x0000;\n    return do_crc(crc_reg, message, len);\n}\n\nint HexStrToByte(const unsigned char *bufin, unsigned char *bufout, int sourceLen)\n{\n    int i = 0;\n    unsigned char tmp2 = 0x0;\n    unsigned int tmp = 0;\n    if (NULL == bufin || sourceLen <= 0 || NULL == bufout)\n    {\n        return -1;\n    }\n    for(i = 0; i < sourceLen; i = i + 2)\n    {\n        tmp2 =  bufin[i];\n        tmp2 =  tmp2 <= '9' ? tmp2 - 0x30 : tmp2 - 0x37;\n        tmp =  bufin[i + 1];\n        tmp =  tmp <= '9' ? tmp - 0x30 : tmp - 0x37;\n        bufout[i / 2] = (tmp2 << 4) | (tmp & 0x0F);\n    }\n    return 0;\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/sota/sota_hal.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n#ifndef __AT_FOTA_HAL_H__\n#define __AT_FOTA_HAL_H__\nint32_t crc_check(const unsigned char *message,int len);\nvoid HexStrToByte(const unsigned char* source, unsigned char* dest, int sourceLen);\nint do_crc(int reg_init,unsigned char *massage,int len);\n\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/utility/ota_crc.c",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#include <stdio.h>\n#include \"ota_crc.h\"\n\nstatic const uint32_t crc_table[256] =\n{\n    0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,\n    0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,\n    0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,\n    0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,\n    0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,\n    0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,\n    0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,\n    0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,\n    0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,\n    0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,\n    0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,\n    0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,\n    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,\n    0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,\n    0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,\n    0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,\n    0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,\n    0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,\n    0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,\n    0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,\n    0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,\n    0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,\n    0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,\n    0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,\n    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,\n    0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,\n    0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,\n    0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,\n    0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,\n    0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,\n    0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,\n    0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,\n    0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,\n    0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,\n    0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,\n    0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,\n    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,\n    0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,\n    0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,\n    0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,\n    0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,\n    0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\n    0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,\n    0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,\n    0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,\n    0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,\n    0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,\n    0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,\n    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,\n    0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,\n    0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,\n    0x2d02ef8d\n};\n\nuint32_t calc_crc32(uint32_t origin, const void *buf, int32_t len)\n{\n    int i;\n    uint32_t crc;\n    const uint8_t *pbuf;\n\n    if (NULL == buf || len < 0)\n    {\n        return 0;\n    }\n\n    pbuf = (const uint8_t *)buf;\n    crc = ~origin;\n\n    for (i = 0; i < len; ++i)\n    {\n        crc = (crc >> 8) ^ crc_table[((crc & 0xff) ^ pbuf[i]) & 0xff];\n    }\n\n    return ~crc;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/ota/utility/ota_crc.h",
    "content": "/*----------------------------------------------------------------------------\n * Copyright (c) <2016-2018>, <Huawei Technologies Co., Ltd>\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n * 1. Redistributions of source code must retain the above copyright notice, this list of\n * conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice, this list\n * of conditions and the following disclaimer in the documentation and/or other materials\n * provided with the distribution.\n * 3. Neither the name of the copyright holder nor the names of its contributors may be used\n * to endorse or promote products derived from this software without specific prior written\n * permission.\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,\n * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *---------------------------------------------------------------------------*/\n/*----------------------------------------------------------------------------\n * Notice of Export Control Law\n * ===============================================\n * Huawei LiteOS may be subject to applicable export control laws and regulations, which might\n * include those applicable to Huawei LiteOS of U.S. and the country in which you are located.\n * Import, export and usage of Huawei LiteOS in any manner by you shall be in compliance with such\n * applicable export control laws and regulations.\n *---------------------------------------------------------------------------*/\n\n#ifndef CRC_H\n#define CRC_H\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nuint32_t calc_crc32(uint32_t origin, const void *buf, int32_t len);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* CRC_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/.github/issue_template.md",
    "content": "Note: This is just a template, so feel free to use/remove the unnecessary things\n\n### Description\n- Type: Bug | Enhancement\\Feature Request | Question\n- Priority: Blocker | Major | Minor\n\n---------------------------------------------------------------\n## Bug\n\n**OS**  \nmbed-OS|linux|windows|\n\n**mbed TLS build:**  \nVersion: x.x.x or git commit id  \nOS version: x.x.x  \nConfiguration: please attach config.h file where possible  \nCompiler and options (if you used a pre-built binary, please indicate how you obtained it):  \nAdditional environment information:  \n\n**Peer device TLS stack and version**  \nOpenSSL|GnuTls|Chrome|NSS(Firefox)|SecureChannel (IIS/Internet Explorer/Edge)|Other  \nVersion:  \n\n**Expected behavior**   \n\n**Actual behavior**  \n\n**Steps to reproduce**  \n\n----------------------------------------------------------------\n## Enhancement\\Feature Request\n\n**Justification - why does the library need this feature?**  \n\n**Suggested enhancement**  \n\n-----------------------------------------------------------------\n\n## Question\n\n**Please first check for answers in the [mbed TLS knowledge Base](https://tls.mbed.org/kb), and preferebly file an issue in the [mbed TLS support forum](https://tls.mbed.org/discussions)**  \n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/.github/pull_request_template.md",
    "content": "Notes:\n* Pull requests cannot be accepted until:\n-  The submitter has [accepted the online agreement here with a click through](https://developer.mbed.org/contributor_agreement/) \n   or for companies or those that do not wish to create an mbed account, a slightly different agreement can be found [here](https://www.mbed.com/en/about-mbed/contributor-license-agreements/)\n- The PR follows the [mbed TLS coding standards](https://tls.mbed.org/kb/development/mbedtls-coding-standards)\n* This is just a template, so feel free to use/remove the unnecessary things\n## Description\nA few sentences describing the overall goals of the pull request's commits.\n\n\n## Status\n**READY/IN DEVELOPMENT/HOLD**\n\n## Requires Backporting\nWhen there is a bug fix, it should be backported to all maintained and supported branches.\nChanges do not have to be backported if:\n- This PR is a new feature\\enhancement\n- This PR contains changes in the API. If this is true, and there is a need for the fix to be backported, the fix should be handled differently in the legacy branch\n\nYes | NO  \nWhich branch?\n\n## Migrations\nIf there is any API change, what's the incentive and logic for it.\n\nYES | NO\n\n## Additional comments\nAny additional information that could be of interest\n\n## Todos\n- [ ] Tests\n- [ ] Documentation\n- [ ] Changelog updated\n- [ ] Backported\n\n\n## Steps to test or reproduce\nOutline the steps to test or reproduce the PR here.\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/.gitignore",
    "content": "CMakeCache.txt\nCMakeFiles\nCTestTestfile.cmake\ncmake_install.cmake\nTesting\nCoverage\n*.gcno\n*.gcda\n\n# generated by scripts/memory.sh\nmassif-*\n\n# MSVC files generated by CMake:\n/*.sln\n/*.vcxproj\n/*.filters\n\n# MSVC build artifacts:\n*.exe\n*.pdb\n*.ilk\n*.lib\n\n# CMake generates *.dir/ folders for in-tree builds (used by MSVC projects), ignore all of those:\n*.dir/\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/.travis.yml",
    "content": "language: c\ncompiler:\n- clang\n- gcc\nsudo: false\ncache: ccache\nscript:\n- tests/scripts/recursion.pl library/*.c\n- tests/scripts/check-generated-files.sh\n- tests/scripts/check-doxy-blocks.pl\n- tests/scripts/check-names.sh\n- tests/scripts/doxygen.sh\n- cmake -D CMAKE_BUILD_TYPE:String=\"Check\" .\n- make\n- make test\n- programs/test/selftest\n- OSSL_NO_DTLS=1 tests/compat.sh\n- tests/ssl-opt.sh -e '\\(DTLS\\|SCSV\\).*openssl'\n- tests/scripts/test-ref-configs.pl\n- tests/scripts/curves.pl\n- tests/scripts/key-exchanges.pl\nafter_failure:\n- tests/scripts/travis-log-failure.sh\nenv:\n  global:\n    secure: \"barHldniAfXyoWOD/vcO+E6/Xm4fmcaUoC9BeKW+LwsHqlDMLvugaJnmLXkSpkbYhVL61Hzf3bo0KPJn88AFc5Rkf8oYHPjH4adMnVXkf3B9ghHCgznqHsAH3choo6tnPxaFgOwOYmLGb382nQxfE5lUdvnM/W/psQjWt66A1+k=\"\n\naddons:\n  apt:\n    packages:\n    - doxygen\n    - graphviz\n  coverity_scan:\n    project:\n      name: \"ARMmbed/mbedtls\"\n    notification_email: p.j.bakker@polarssl.org\n    build_command_prepend:\n    build_command: make\n    branch_pattern: coverity_scan\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.6)\nproject(\"mbed TLS\" C)\n\noption(USE_PKCS11_HELPER_LIBRARY \"Build mbed TLS with the pkcs11-helper library.\" OFF)\noption(ENABLE_ZLIB_SUPPORT \"Build mbed TLS with zlib library.\" OFF)\n\noption(ENABLE_PROGRAMS \"Build mbed TLS programs.\" ON)\n\noption(UNSAFE_BUILD \"Allow unsafe builds. These builds ARE NOT SECURE.\" OFF)\n\n# the test suites currently have compile errors with MSVC\nif(MSVC)\n    option(ENABLE_TESTING \"Build mbed TLS tests.\" OFF)\nelse()\n    option(ENABLE_TESTING \"Build mbed TLS tests.\" ON)\nendif()\n\n# Warning string - created as a list for compatibility with CMake 2.8\nset(WARNING_BORDER \"*******************************************************\\n\")\nset(NULL_ENTROPY_WARN_L1 \"****  WARNING!  MBEDTLS_TEST_NULL_ENTROPY defined!\\n\")\nset(NULL_ENTROPY_WARN_L2 \"****  THIS BUILD HAS NO DEFINED ENTROPY SOURCES\\n\")\nset(NULL_ENTROPY_WARN_L3 \"****  AND IS *NOT* SUITABLE FOR PRODUCTION USE\\n\")\n\nset(NULL_ENTROPY_WARNING \"${WARNING_BORDER}\"\n                         \"${NULL_ENTROPY_WARN_L1}\"\n                         \"${NULL_ENTROPY_WARN_L2}\"\n                         \"${NULL_ENTROPY_WARN_L3}\"\n                         \"${WARNING_BORDER}\")\n\nfind_package(Perl)\nif(PERL_FOUND)\n\n    # If NULL Entropy is configured, display an appropriate warning\n    execute_process(COMMAND ${PERL_EXECUTABLE} ${CMAKE_SOURCE_DIR}/scripts/config.pl -f ${CMAKE_SOURCE_DIR}/include/mbedtls/config.h get MBEDTLS_TEST_NULL_ENTROPY\n                        RESULT_VARIABLE result)\n    if(${result} EQUAL 0)\n        message(WARNING ${NULL_ENTROPY_WARNING})\n\n        if(NOT UNSAFE_BUILD)\n            message(FATAL_ERROR \"\\\n\\n\\\nWarning! You have enabled MBEDTLS_TEST_NULL_ENTROPY. \\\nThis option is not safe for production use and negates all security \\\nIt is intended for development use only. \\\n\\n\\\nTo confirm you want to build with this option, re-run cmake with the \\\noption: \\n\\\n  cmake -DUNSAFE_BUILD=ON \")\n\n            return()\n        endif()\n    endif()\nendif()\n\nset(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE}\n    CACHE STRING \"Choose the type of build: None Debug Release Coverage ASan ASanDbg MemSan MemSanDbg Check CheckFull\"\n    FORCE)\n\nstring(REGEX MATCH \"Clang\" CMAKE_COMPILER_IS_CLANG \"${CMAKE_C_COMPILER_ID}\")\n\nif(CMAKE_COMPILER_IS_GNUCC)\n    # some warnings we want are not available with old GCC versions\n    # note: starting with CMake 2.8 we could use CMAKE_C_COMPILER_VERSION\n    execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion\n                    OUTPUT_VARIABLE GCC_VERSION)\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall -Wextra -W -Wdeclaration-after-statement -Wwrite-strings\")\n    if (GCC_VERSION VERSION_GREATER 4.5 OR GCC_VERSION VERSION_EQUAL 4.5)\n        set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wlogical-op\")\n    endif()\n    if (GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)\n        set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wshadow\")\n    endif()\n    set(CMAKE_C_FLAGS_RELEASE     \"-O2\")\n    set(CMAKE_C_FLAGS_DEBUG       \"-O0 -g3\")\n    set(CMAKE_C_FLAGS_COVERAGE    \"-O0 -g3 --coverage\")\n    set(CMAKE_C_FLAGS_ASAN        \"-Werror -fsanitize=address -fno-common -O3\")\n    set(CMAKE_C_FLAGS_ASANDBG     \"-Werror -fsanitize=address -fno-common -O1 -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls \")\n    set(CMAKE_C_FLAGS_CHECK       \"-Werror -Os\")\n    set(CMAKE_C_FLAGS_CHECKFULL   \"${CMAKE_C_FLAGS_CHECK} -Wcast-qual\")\nendif(CMAKE_COMPILER_IS_GNUCC)\n\nif(CMAKE_COMPILER_IS_CLANG)\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wall -Wextra -W -Wdeclaration-after-statement -Wwrite-strings -Wpointer-arith -Wimplicit-fallthrough -Wshadow\")\n    set(CMAKE_C_FLAGS_RELEASE     \"-O2\")\n    set(CMAKE_C_FLAGS_DEBUG       \"-O0 -g3\")\n    set(CMAKE_C_FLAGS_COVERAGE    \"-O0 -g3 --coverage\")\n    set(CMAKE_C_FLAGS_ASAN        \"-Werror -fsanitize=address -fno-common -fsanitize=undefined -fno-sanitize-recover -O3\")\n    set(CMAKE_C_FLAGS_ASANDBG     \"-Werror -fsanitize=address -fno-common -fsanitize=undefined -fno-sanitize-recover -O1 -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls \")\n    set(CMAKE_C_FLAGS_MEMSAN      \"-Werror -fsanitize=memory -O3\")\n    set(CMAKE_C_FLAGS_MEMSANDBG   \"-Werror -fsanitize=memory -O1 -g3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fsanitize-memory-track-origins=2\")\n    set(CMAKE_C_FLAGS_CHECK       \"-Werror -Os\")\nendif(CMAKE_COMPILER_IS_CLANG)\n\nif(MSVC)\n    # Strictest warnings, and treat as errors\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /W3\")\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /WX\")\nendif(MSVC)\n\nif(CMAKE_BUILD_TYPE STREQUAL \"Coverage\")\n    if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)\n        set(CMAKE_SHARED_LINKER_FLAGS \"--coverage\")\n    endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)\nendif(CMAKE_BUILD_TYPE STREQUAL \"Coverage\")\n\nif(LIB_INSTALL_DIR)\nelse()\n    set(LIB_INSTALL_DIR lib)\nendif()\n\ninclude_directories(include/)\n\nif(ENABLE_ZLIB_SUPPORT)\n    find_package(ZLIB)\n\n    if(ZLIB_FOUND)\n        include_directories(${ZLIB_INCLUDE_DIR})\n    endif(ZLIB_FOUND)\nendif(ENABLE_ZLIB_SUPPORT)\n\nadd_subdirectory(library)\nadd_subdirectory(include)\n\nif(ENABLE_PROGRAMS)\n    add_subdirectory(programs)\nendif()\n\nADD_CUSTOM_TARGET(apidoc\n    COMMAND doxygen doxygen/mbedtls.doxyfile\n    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})\n\nif(ENABLE_TESTING)\n    enable_testing()\n\n    add_subdirectory(tests)\n\n    # additional convenience targets for Unix only\n    if(UNIX)\n\n        ADD_CUSTOM_TARGET(covtest\n            COMMAND make test\n            COMMAND programs/test/selftest\n            COMMAND tests/compat.sh\n            COMMAND tests/ssl-opt.sh\n        )\n\n        ADD_CUSTOM_TARGET(lcov\n            COMMAND rm -rf Coverage\n            COMMAND lcov --capture --initial --directory library/CMakeFiles/mbedtls.dir -o files.info\n            COMMAND lcov --capture --directory library/CMakeFiles/mbedtls.dir -o tests.info\n            COMMAND lcov --add-tracefile files.info --add-tracefile tests.info -o all.info\n            COMMAND lcov --remove all.info -o final.info '*.h'\n            COMMAND gendesc tests/Descriptions.txt -o descriptions\n            COMMAND genhtml --title \"mbed TLS\" --description-file descriptions --keep-descriptions --legend --no-branch-coverage -o Coverage final.info\n            COMMAND rm -f files.info tests.info all.info final.info descriptions\n        )\n\n        ADD_CUSTOM_TARGET(memcheck\n            COMMAND sed -i.bak s+/usr/bin/valgrind+`which valgrind`+ DartConfiguration.tcl\n            COMMAND ctest -O memcheck.log -D ExperimentalMemCheck\n            COMMAND tail -n1 memcheck.log | grep 'Memory checking results:' > /dev/null\n            COMMAND rm -f memcheck.log\n            COMMAND mv DartConfiguration.tcl.bak DartConfiguration.tcl\n        )\n    endif(UNIX)\nendif()\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/ChangeLog",
    "content": "mbed TLS ChangeLog (Sorted per branch, date)\n\n= mbed TLS 2.6.0 branch released 2017-08-10\n\nSecurity\n   * Fix authentication bypass in SSL/TLS: when authmode is set to optional,\n     mbedtls_ssl_get_verify_result() would incorrectly return 0 when the peer's\n     X.509 certificate chain had more than MBEDTLS_X509_MAX_INTERMEDIATE_CA\n     (default: 8) intermediates, even when it was not trusted. This could be\n     triggered remotely from either side. (With authmode set to 'required'\n     (the default), the handshake was correctly aborted).\n   * Reliably wipe sensitive data after use in the AES example applications\n     programs/aes/aescrypt2 and programs/aes/crypt_and_hash.\n     Found by Laurent Simon.\n\nFeatures\n   * Add the functions mbedtls_platform_setup() and mbedtls_platform_teardown()\n     and the context struct mbedtls_platform_context to perform\n     platform-specific setup and teardown operations. The macro\n     MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT allows the functions to be overridden\n     by the user in a platform_alt.h file. These new functions are required in\n     some embedded environments to provide a means of initialising underlying\n     cryptographic acceleration hardware.\n\nAPI Changes\n   * Reverted API/ABI breaking changes introduced in mbed TLS 2.5.1, to make the\n     API consistent with mbed TLS 2.5.0. Specifically removed the inline\n     qualifier from the functions mbedtls_aes_decrypt, mbedtls_aes_encrypt,\n     mbedtls_ssl_ciphersuite_uses_ec and mbedtls_ssl_ciphersuite_uses_psk. Found\n     by James Cowgill. #978\n   * Certificate verification functions now set flags to -1 in case the full\n     chain was not verified due to an internal error (including in the verify\n     callback) or chain length limitations.\n   * With authmode set to optional, the TLS handshake is now aborted if the\n     verification of the peer's certificate failed due to an overlong chain or\n     a fatal error in the verify callback.\n\nBugfix\n   * Add a check if iv_len is zero in GCM, and return an error if it is zero.\n     Reported by roberto. #716\n   * Replace preprocessor condition from #if defined(MBEDTLS_THREADING_PTHREAD)\n     to #if defined(MBEDTLS_THREADING_C) as the library cannot assume they will\n     always be implemented by pthread support. #696\n   * Fix a resource leak on Windows platforms in mbedtls_x509_crt_parse_path(),\n     in the case of an error. Found by redplait. #590\n   * Add MBEDTLS_MPI_CHK to check for error value of mbedtls_mpi_fill_random.\n     Reported and fix suggested by guidovranken. #740\n   * Fix conditional preprocessor directives in bignum.h to enable 64-bit\n     compilation when using ARM Compiler 6.\n   * Fix a potential integer overflow in the version verification for DER\n     encoded X.509 CRLs. The overflow could enable maliciously constructed CRLs\n     to bypass the version verification check. Found by Peng Li/Yueh-Hsun Lin,\n     KNOX Security, Samsung Research America\n   * Fix potential integer overflow in the version verification for DER\n     encoded X.509 CSRs. The overflow could enable maliciously constructed CSRs\n     to bypass the version verification check. Found by Peng Li/Yueh-Hsun Lin,\n     KNOX Security, Samsung Research America\n   * Fix a potential integer overflow in the version verification for DER\n     encoded X.509 certificates. The overflow could enable maliciously\n     constructed certificates to bypass the certificate verification check.\n   * Fix a call to the libc function time() to call the platform abstraction\n     function mbedtls_time() instead. Found by wairua. #666\n   * Avoid shadowing of time and index functions through mbed TLS function\n     arguments. Found by inestlerode. #557.\n\nChanges\n   * Added config.h option MBEDTLS_NO_UDBL_DIVISION, to prevent the use of\n     64-bit division. This is useful on embedded platforms where 64-bit division\n     created a dependency on external libraries. #708\n   * Removed mutexes from ECP hardware accelerator code. Now all hardware\n     accelerator code in the library leaves concurrency handling to the\n     platform. Reported by Steven Cooreman. #863\n   * Define the macro MBEDTLS_AES_ROM_TABLES in the configuration file\n     config-no-entropy.h to reduce the RAM footprint.\n   * Added a test script that can be hooked into git that verifies commits\n     before they are pushed.\n   * Improve documentation of PKCS1 decryption functions.\n\n= mbed TLS 2.5.1 released 2017-06-21\n\nSecurity\n   * Fixed unlimited overread of heap-based buffer in mbedtls_ssl_read().\n     The issue could only happen client-side with renegotiation enabled.\n     Could result in DoS (application crash) or information leak\n     (if the application layer sent data read from mbedtls_ssl_read()\n     back to the server or to a third party). Can be triggered remotely.\n   * Removed SHA-1 and RIPEMD-160 from the default hash algorithms for\n     certificate verification. SHA-1 can be turned back on with a compile-time\n     option if needed.\n   * Fixed offset in FALLBACK_SCSV parsing that caused TLS server to fail to\n     detect it sometimes. Reported by Hugo Leisink. #810\n   * Tighten parsing of RSA PKCS#1 v1.5 signatures, to avoid a\n     potential Bleichenbacher/BERserk-style attack.\n\nBugfix\n   * Remove size zero arrays from ECJPAKE test suite. Size zero arrays are not\n     valid C and they prevented the test from compiling in Visual Studio 2015\n     and with GCC using the -Wpedantic compilation option.\n   * Fix insufficient support for signature-hash-algorithm extension,\n     resulting in compatibility problems with Chrome. Found by hfloyrd. #823\n   * Fix behaviour that hid the original cause of fatal alerts in some cases\n     when sending the alert failed. The fix makes sure not to hide the error\n     that triggered the alert.\n   * Fix SSLv3 renegotiation behaviour and stop processing data received from\n     peer after sending a fatal alert to refuse a renegotiation attempt.\n     Previous behaviour was to keep processing data even after the alert has\n     been sent.\n   * Accept empty trusted CA chain in authentication mode\n     MBEDTLS_SSL_VERIFY_OPTIONAL.\n     Found by jethrogb. #864\n   * Fix implementation of mbedtls_ssl_parse_certificate() to not annihilate\n     fatal errors in authentication mode MBEDTLS_SSL_VERIFY_OPTIONAL and to\n     reflect bad EC curves within verification result.\n   * Fix bug that caused the modular inversion function to accept the invalid\n     modulus 1 and therefore to hang. Found by blaufish. #641.\n   * Fix incorrect sign computation in modular exponentiation when the base is\n     a negative MPI. Previously the result was always negative. Found by Guido\n     Vranken.\n   * Fix a numerical underflow leading to stack overflow in mpi_read_file()\n     that was triggered uppon reading an empty line. Found by Guido Vranken.\n\nChanges\n   * Send fatal alerts in more cases. The previous behaviour was to skip\n     sending the fatal alert and just drop the connection.\n   * Clarify ECDSA documentation and improve the sample code to avoid\n     misunderstanding and potentially dangerous use of the API. Pointed out\n     by Jean-Philippe Aumasson.\n\n= mbed TLS 2.5.0 branch released 2017-05-17\n\nSecurity\n   * Wipe stack buffers in RSA private key operations\n     (rsa_rsaes_pkcs1_v15_decrypt(), rsa_rsaes_oaep_decrypt). Found by Laurent\n     Simon.\n   * Add exponent blinding to RSA private operations as a countermeasure\n     against side-channel attacks like the cache attack described in\n     https://arxiv.org/abs/1702.08719v2.\n     Found and fix proposed by Michael Schwarz, Samuel Weiser, Daniel Gruss,\n     Clémentine Maurice and Stefan Mangard.\n\nFeatures\n   * Add hardware acceleration support for the Elliptic Curve Point module.\n     This involved exposing parts of the internal interface to enable\n     replacing the core functions and adding and alternative, module level\n     replacement support for enabling the extension of the interface.\n   * Add a new configuration option to 'mbedtls_ssl_config' to enable\n     suppressing the CA list in Certificate Request messages. The default\n     behaviour has not changed, namely every configured CAs name is included.\n\nAPI Changes\n   * The following functions in the AES module have been deprecated and replaced\n     by the functions shown below. The new functions change the return type from\n     void to int to allow returning error codes when using MBEDTLS_AES_ALT,\n     MBEDTLS_AES_DECRYPT_ALT or MBEDTLS_AES_ENCRYPT_ALT.\n     mbedtls_aes_decrypt() -> mbedtls_internal_aes_decrypt()\n     mbedtls_aes_encrypt() -> mbedtls_internal_aes_encrypt()\n\nBugfix\n   * Remove macros from compat-1.3.h that correspond to deleted items from most\n     recent versions of the library. Found by Kyle Keen.\n   * Fixed issue in the Threading module that prevented mutexes from\n     initialising. Found by sznaider. #667 #843\n   * Add checks in the PK module for the RSA functions on 64-bit systems.\n     The PK and RSA modules use different types for passing hash length and\n     without these checks the type cast could lead to data loss. Found by Guido\n     Vranken.\n\n= mbed TLS 2.4.2 branch released 2017-03-08\n\nSecurity\n   * Add checks to prevent signature forgeries for very large messages while\n     using RSA through the PK module in 64-bit systems. The issue was caused by\n     some data loss when casting a size_t to an unsigned int value in the\n     functions rsa_verify_wrap(), rsa_sign_wrap(), rsa_alt_sign_wrap() and\n     mbedtls_pk_sign(). Found by Jean-Philippe Aumasson.\n   * Fixed potential livelock during the parsing of a CRL in PEM format in\n     mbedtls_x509_crl_parse(). A string containing a CRL followed by trailing\n     characters after the footer could result in the execution of an infinite\n     loop. The issue can be triggered remotely. Found by Greg Zaverucha,\n     Microsoft.\n   * Removed MD5 from the allowed hash algorithms for CertificateRequest and\n     CertificateVerify messages, to prevent SLOTH attacks against TLS 1.2.\n     Introduced by interoperability fix for #513.\n   * Fixed a bug that caused freeing a buffer that was allocated on the stack,\n     when verifying the validity of a key on secp224k1. This could be\n     triggered remotely for example with a maliciously constructed certificate\n     and potentially could lead to remote code execution on some platforms.\n     Reported independently by rongsaws and Aleksandar Nikolic, Cisco Talos\n     team. #569 CVE-2017-2784\n\nBugfix\n   * Fix output certificate verification flags set by x509_crt_verify_top() when\n     traversing a chain of trusted CA. The issue would cause both flags,\n     MBEDTLS_X509_BADCERT_NOT_TRUSTED and MBEDTLS_X509_BADCERT_EXPIRED, to be\n     set when the verification conditions are not met regardless of the cause.\n     Found by Harm Verhagen and inestlerode. #665 #561\n   * Fix the redefinition of macro ssl_set_bio to an undefined symbol\n     mbedtls_ssl_set_bio_timeout in compat-1.3.h, by removing it.\n     Found by omlib-lin. #673\n   * Fix unused variable/function compilation warnings in pem.c, x509_crt.c and\n     x509_csr.c that are reported when building mbed TLS with a config.h that\n     does not define MBEDTLS_PEM_PARSE_C. Found by omnium21. #562\n   * Fix incorrect renegotiation condition in ssl_check_ctr_renegotiate() that\n     would compare 64 bits of the record counter instead of 48 bits as indicated\n     in RFC 6347 Section 4.3.1. This could cause the execution of the\n     renegotiation routines at unexpected times when the protocol is DTLS. Found\n     by wariua. #687\n   * Fixed multiple buffer overreads in mbedtls_pem_read_buffer() when parsing\n     the input string in PEM format to extract the different components. Found\n     by Eyal Itkin.\n   * Fixed potential arithmetic overflow in mbedtls_ctr_drbg_reseed() that could\n     cause buffer bound checks to be bypassed. Found by Eyal Itkin.\n   * Fixed potential arithmetic overflows in mbedtls_cipher_update() that could\n     cause buffer bound checks to be bypassed. Found by Eyal Itkin.\n   * Fixed potential arithmetic overflow in mbedtls_md2_update() that could\n     cause buffer bound checks to be bypassed. Found by Eyal Itkin.\n   * Fixed potential arithmetic overflow in mbedtls_base64_decode() that could\n     cause buffer bound checks to be bypassed. Found by Eyal Itkin.\n   * Fixed heap overreads in mbedtls_x509_get_time(). Found by Peng\n     Li/Yueh-Hsun Lin, KNOX Security, Samsung Research America.\n   * Fix potential memory leak in mbedtls_x509_crl_parse(). The leak was caused\n     by missing calls to mbedtls_pem_free() in cases when a\n     MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT error was encountered. Found and\n     fix proposed by Guido Vranken. #722\n   * Fixed the templates used to generate project and solution files for Visual\n     Studio 2015 as well as the files themselves, to remove a build warning\n     generated in Visual Studio 2015. Reported by Steve Valliere. #742\n   * Fix a resource leak in ssl_cookie, when using MBEDTLS_THREADING_C.\n     Raised and fix suggested by Alan Gillingham in the mbed TLS forum. #771\n   * Fix 1 byte buffer overflow in mbedtls_mpi_write_string() when the MPI\n     number to write in hexadecimal is negative and requires an odd number of\n     digits. Found and fixed by Guido Vranken.\n   * Fix unlisted DES configuration dependency in some pkparse test cases. Found\n     by inestlerode. #555\n\n= mbed TLS 2.4.1 branch released 2016-12-13\n\nChanges\n   * Update to CMAC test data, taken from - NIST Special Publication 800-38B -\n     Recommendation for Block Cipher Modes of Operation: The CMAC Mode for\n     Authentication – October  2016\n\n= mbed TLS 2.4.0 branch released 2016-10-17\n\nSecurity\n   * Removed the MBEDTLS_SSL_AEAD_RANDOM_IV option, because it was not compliant\n     with RFC-5116 and could lead to session key recovery in very long TLS\n     sessions. \"Nonce-Disrespecting Adversaries Practical Forgery Attacks on GCM in\n     TLS\" - H. Bock, A. Zauner, S. Devlin, J. Somorovsky, P. Jovanovic.\n     https://eprint.iacr.org/2016/475.pdf\n   * Fixed potential stack corruption in mbedtls_x509write_crt_der() and\n     mbedtls_x509write_csr_der() when the signature is copied to the buffer\n     without checking whether there is enough space in the destination. The\n     issue cannot be triggered remotely. Found by Jethro Beekman.\n\nFeatures\n   * Added support for CMAC for AES and 3DES and AES-CMAC-PRF-128, as defined by\n     NIST SP 800-38B, RFC-4493 and RFC-4615.\n   * Added hardware entropy selftest to verify that the hardware entropy source\n     is functioning correctly.\n   * Added a script to print build environment info for diagnostic use in test\n     scripts, which is also now called by all.sh.\n   * Added the macro MBEDTLS_X509_MAX_FILE_PATH_LEN that enables the user to\n     configure the maximum length of a file path that can be buffered when\n     calling mbedtls_x509_crt_parse_path().\n   * Added a configuration file config-no-entropy.h that configures the subset of\n     library features that do not require an entropy source.\n   * Added the macro MBEDTLS_ENTROPY_MIN_HARDWARE in config.h. This allows users\n     to configure the minimum number of bytes for entropy sources using the\n     mbedtls_hardware_poll() function.\n\nBugfix\n   * Fix for platform time abstraction to avoid dependency issues where a build\n     may need time but not the standard C library abstraction, and added\n     configuration consistency checks to check_config.h\n   * Fix dependency issue in Makefile to allow parallel builds.\n   * Fix incorrect handling of block lengths in crypt_and_hash.c sample program,\n     when GCM is used. Found by udf2457. #441\n   * Fix for key exchanges based on ECDH-RSA or ECDH-ECDSA which weren't\n     enabled unless others were also present. Found by David Fernandez. #428\n   * Fix for out-of-tree builds using CMake. Found by jwurzer, and fix based on\n     a contribution from Tobias Tangemann. #541\n   * Fixed cert_app.c sample program for debug output and for use when no root\n     certificates are provided.\n   * Fix conditional statement that would cause a 1 byte overread in\n     mbedtls_asn1_get_int(). Found and fixed by Guido Vranken. #599\n   * Fixed pthread implementation to avoid unintended double initialisations\n     and double frees. Found by Niklas Amnebratt.\n   * Fixed the sample applications gen_key.c, cert_req.c and cert_write.c for\n     builds where the configuration MBEDTLS_PEM_WRITE_C is not defined. Found\n     by inestlerode. #559.\n   * Fix mbedtls_x509_get_sig() to update the ASN1 type in the mbedtls_x509_buf\n     data structure until after error checks are successful. Found by\n     subramanyam-c. #622\n   * Fix documentation and implementation missmatch for function arguments of\n     mbedtls_gcm_finish(). Found by cmiatpaar. #602\n   * Guarantee that P>Q at RSA key generation. Found by inestlerode. #558\n   * Fix potential byte overread when verifying malformed SERVER_HELLO in\n     ssl_parse_hello_verify_request() for DTLS. Found by Guido Vranken.\n   * Fix check for validity of date when parsing in mbedtls_x509_get_time().\n     Found by subramanyam-c. #626\n   * Fix compatibility issue with Internet Explorer client authentication,\n     where the limited hash choices prevented the client from sending its\n     certificate. Found by teumas. #513\n   * Fix compilation without MBEDTLS_SELF_TEST enabled.\n\nChanges\n   * Extended test coverage of special cases, and added new timing test suite.\n   * Removed self-tests from the basic-built-test.sh script, and added all\n     missing self-tests to the test suites, to ensure self-tests are only\n     executed once.\n   * Added support for 3 and 4 byte lengths to mbedtls_asn1_write_len().\n   * Added support for a Yotta specific configuration file -\n     through the symbol YOTTA_CFG_MBEDTLS_TARGET_CONFIG_FILE.\n   * Added optimization for code space for X.509/OID based on configured\n     features. Contributed by Aviv Palivoda.\n   * Renamed source file library/net.c to library/net_sockets.c to avoid\n     naming collision in projects which also have files with the common name\n     net.c. For consistency, the corresponding header file, net.h, is marked as\n     deprecated, and its contents moved to net_sockets.h.\n   * Changed the strategy for X.509 certificate parsing and validation, to no\n     longer disregard certificates with unrecognised fields.\n\n= mbed TLS 2.3.0 branch released 2016-06-28\n\nSecurity\n   * Fix missing padding length check in mbedtls_rsa_rsaes_pkcs1_v15_decrypt\n     required by PKCS1 v2.2\n   * Fix potential integer overflow to buffer overflow in\n     mbedtls_rsa_rsaes_pkcs1_v15_encrypt and mbedtls_rsa_rsaes_oaep_encrypt\n     (not triggerable remotely in (D)TLS).\n   * Fix a potential integer underflow to buffer overread in\n     mbedtls_rsa_rsaes_oaep_decrypt. It is not triggerable remotely in\n     SSL/TLS.\n\nFeatures\n   * Support for platform abstraction of the standard C library time()\n     function.\n\nBugfix\n   * Fix bug in mbedtls_mpi_add_mpi() that caused wrong results when the three\n     arguments where the same (in-place doubling). Found and fixed by Janos\n     Follath. #309\n   * Fix potential build failures related to the 'apidoc' target, introduced\n     in the previous patch release. Found by Robert Scheck. #390 #391\n   * Fix issue in Makefile that prevented building using armar. #386\n   * Fix memory leak that occured only when ECJPAKE was enabled and ECDHE and\n     ECDSA was disabled in config.h . The leak didn't occur by default.\n   * Fix an issue that caused valid certificates to be rejected whenever an\n     expired or not yet valid certificate was parsed before a valid certificate\n     in the trusted certificate list.\n   * Fix bug in mbedtls_x509_crt_parse that caused trailing extra data in the\n     buffer after DER certificates to be included in the raw representation.\n   * Fix issue that caused a hang when generating RSA keys of odd bitlength\n   * Fix bug in mbedtls_rsa_rsaes_pkcs1_v15_encrypt that made null pointer\n     dereference possible.\n   * Fix issue that caused a crash if invalid curves were passed to\n     mbedtls_ssl_conf_curves. #373\n   * Fix issue in ssl_fork_server which was preventing it from functioning. #429\n   * Fix memory leaks in test framework\n   * Fix test in ssl-opt.sh that does not run properly with valgrind\n   * Fix unchecked calls to mmbedtls_md_setup(). Fix by Brian Murray. #502\n\nChanges\n   * On ARM platforms, when compiling with -O0 with GCC, Clang or armcc5,\n     don't use the optimized assembly for bignum multiplication. This removes\n     the need to pass -fomit-frame-pointer to avoid a build error with -O0.\n   * Disabled SSLv3 in the default configuration.\n   * Optimized mbedtls_mpi_zeroize() for MPI integer size. (Fix by Alexey\n     Skalozub).\n   * Fix non-compliance server extension handling. Extensions for SSLv3 are now\n     ignored, as required by RFC6101.\n\n= mbed TLS 2.2.1 released 2016-01-05\n\nSecurity\n   * Fix potential double free when mbedtls_asn1_store_named_data() fails to\n     allocate memory. Only used for certificate generation, not triggerable\n     remotely in SSL/TLS. Found by Rafał Przywara. #367\n   * Disable MD5 handshake signatures in TLS 1.2 by default to prevent the\n     SLOTH attack on TLS 1.2 server authentication (other attacks from the\n     SLOTH paper do not apply to any version of mbed TLS or PolarSSL).\n     https://www.mitls.org/pages/attacks/SLOTH\n\nBugfix\n   * Fix over-restrictive length limit in GCM. Found by Andreas-N. #362\n   * Fix bug in certificate validation that caused valid chains to be rejected\n     when the first intermediate certificate has pathLenConstraint=0. Found by\n     Nicholas Wilson. Introduced in mbed TLS 2.2.0. #280\n   * Removed potential leak in mbedtls_rsa_rsassa_pkcs1_v15_sign(), found by\n     JayaraghavendranK. #372\n   * Fix suboptimal handling of unexpected records that caused interop issues\n     with some peers over unreliable links. Avoid dropping an entire DTLS\n     datagram if a single record in a datagram is unexpected, instead only\n     drop the record and look at subsequent records (if any are present) in\n     the same datagram. Found by jeannotlapin. #345\n\n= mbed TLS 2.2.0 released 2015-11-04\n\nSecurity\n   * Fix potential double free if mbedtls_ssl_conf_psk() is called more than\n     once and some allocation fails. Cannot be forced remotely. Found by Guido\n     Vranken, Intelworks.\n   * Fix potential heap corruption on Windows when\n     mbedtls_x509_crt_parse_path() is passed a path longer than 2GB. Cannot be\n     triggered remotely. Found by Guido Vranken, Intelworks.\n   * Fix potential buffer overflow in some asn1_write_xxx() functions.\n     Cannot be triggered remotely unless you create X.509 certificates based\n     on untrusted input or write keys of untrusted origin. Found by Guido\n     Vranken, Intelworks.\n   * The X509 max_pathlen constraint was not enforced on intermediate\n     certificates. Found by Nicholas Wilson, fix and tests provided by\n     Janos Follath. #280 and #319\n\nFeatures\n   * Experimental support for EC J-PAKE as defined in Thread 1.0.0.\n     Disabled by default as the specification might still change.\n   * Added a key extraction callback to accees the master secret and key\n     block. (Potential uses include EAP-TLS and Thread.)\n\nBugfix\n   * Self-signed certificates were not excluded from pathlen counting,\n     resulting in some valid X.509 being incorrectly rejected. Found and fix\n     provided by Janos Follath. #319\n   * Fix build error with configurations where ECDHE-PSK is the only key\n     exchange. Found and fix provided by Chris Hammond. #270\n   * Fix build error with configurations where RSA, RSA-PSK, ECDH-RSA or\n     ECHD-ECDSA if the only key exchange. Multiple reports. #310\n   * Fixed a bug causing some handshakes to fail due to some non-fatal alerts\n     not being properly ignored. Found by mancha and Kasom Koht-arsa, #308\n   * mbedtls_x509_crt_verify(_with_profile)() now also checks the key type and\n     size/curve against the profile. Before that, there was no way to set a\n     minimum key size for end-entity certificates with RSA keys. Found by\n     Matthew Page of Scannex Electronics Ltd.\n   * Fix failures in MPI on Sparc(64) due to use of bad assembly code.\n     Found by Kurt Danielson. #292\n   * Fix typo in name of the extKeyUsage OID. Found by inestlerode, #314\n   * Fix bug in ASN.1 encoding of booleans that caused generated CA\n     certificates to be rejected by some applications, including OS X\n     Keychain. Found and fixed by Jonathan Leroy, Inikup.\n\nChanges\n   * Improved performance of mbedtls_ecp_muladd() when one of the scalars is 1\n     or -1.\n\n= mbed TLS 2.1.2 released 2015-10-06\n\nSecurity\n   * Added fix for CVE-2015-5291 to prevent heap corruption due to buffer\n     overflow of the hostname or session ticket. Found by Guido Vranken,\n     Intelworks.\n   * Fix potential double-free if mbedtls_ssl_set_hs_psk() is called more than\n     once in the same handhake and mbedtls_ssl_conf_psk() was used.\n     Found and patch provided by Guido Vranken, Intelworks. Cannot be forced\n     remotely.\n   * Fix stack buffer overflow in pkcs12 decryption (used by\n     mbedtls_pk_parse_key(file)() when the password is > 129 bytes.\n     Found by Guido Vranken, Intelworks. Not triggerable remotely.\n   * Fix potential buffer overflow in mbedtls_mpi_read_string().\n     Found by Guido Vranken, Intelworks. Not exploitable remotely in the context\n     of TLS, but might be in other uses. On 32 bit machines, requires reading a\n     string of close to or larger than 1GB to exploit; on 64 bit machines, would\n     require reading a string of close to or larger than 2^62 bytes.\n   * Fix potential random memory allocation in mbedtls_pem_read_buffer()\n     on crafted PEM input data. Found and fix provided by Guido Vranken,\n     Intelworks. Not triggerable remotely in TLS. Triggerable remotely if you\n     accept PEM data from an untrusted source.\n   * Fix possible heap buffer overflow in base64_encoded() when the input\n     buffer is 512MB or larger on 32-bit platforms. Found by Guido Vranken,\n     Intelworks. Not trigerrable remotely in TLS.\n   * Fix potential double-free if mbedtls_conf_psk() is called repeatedly on\n     the same mbedtls_ssl_config object and memory allocation fails. Found by\n     Guido Vranken, Intelworks. Cannot be forced remotely.\n   * Fix potential heap buffer overflow in servers that perform client\n     authentication against a crafted CA cert. Cannot be triggered remotely\n     unless you allow third parties to pick trust CAs for client auth.\n     Found by Guido Vranken, Intelworks.\n\nBugfix\n   * Fix compile error in net.c with musl libc. Found and patch provided by\n     zhasha (#278).\n   * Fix macroization of 'inline' keyword when building as C++. (#279)\n\nChanges\n   * Added checking of hostname length in mbedtls_ssl_set_hostname() to ensure\n     domain names are compliant with RFC 1035.\n   * Fixed paths for check_config.h in example config files. (Found by bachp)\n     (#291)\n\n= mbed TLS 2.1.1 released 2015-09-17\n\nSecurity\n   * Add countermeasure against Lenstra's RSA-CRT attack for PKCS#1 v1.5\n     signatures. (Found by Florian Weimer, Red Hat.)\n     https://securityblog.redhat.com/2015/09/02/factoring-rsa-keys-with-tls-perfect-forward-secrecy/\n   * Fix possible client-side NULL pointer dereference (read) when the client\n     tries to continue the handshake after it failed (a misuse of the API).\n     (Found and patch provided by Fabian Foerg, Gotham Digital Science using\n     afl-fuzz.)\n\nBugfix\n   * Fix warning when using a 64bit platform. (found by embedthis) (#275)\n   * Fix off-by-one error in parsing Supported Point Format extension that\n     caused some handshakes to fail.\n\nChanges\n   * Made X509 profile pointer const in mbedtls_ssl_conf_cert_profile() to allow\n     use of mbedtls_x509_crt_profile_next. (found by NWilson)\n   * When a client initiates a reconnect from the same port as a live\n     connection, if cookie verification is available\n     (MBEDTLS_SSL_DTLS_HELLO_VERIFY defined in config.h, and usable cookie\n     callbacks set with mbedtls_ssl_conf_dtls_cookies()), this will be\n     detected and mbedtls_ssl_read() will return\n     MBEDTLS_ERR_SSL_CLIENT_RECONNECT - it is then possible to start a new\n     handshake with the same context. (See RFC 6347 section 4.2.8.)\n\n= mbed TLS 2.1.0 released 2015-09-04\n\nFeatures\n   * Added support for yotta as a build system.\n   * Primary open source license changed to Apache 2.0 license.\n\nBugfix\n   * Fix segfault in the benchmark program when benchmarking DHM.\n   * Fix build error with CMake and pre-4.5 versions of GCC (found by Hugo\n     Leisink).\n   * Fix bug when parsing a ServerHello without extensions (found by David\n     Sears).\n   * Fix bug in CMake lists that caused libmbedcrypto.a not to be installed\n     (found by Benoit Lecocq).\n   * Fix bug in Makefile that caused libmbedcrypto and libmbedx509 not to be\n     installed (found by Rawi666).\n   * Fix compile error with armcc 5 with --gnu option.\n   * Fix bug in Makefile that caused programs not to be installed correctly\n     (found by robotanarchy) (#232).\n   * Fix bug in Makefile that prevented from installing without building the\n     tests (found by robotanarchy) (#232).\n   * Fix missing -static-libgcc when building shared libraries for Windows\n     with make.\n   * Fix link error when building shared libraries for Windows with make.\n   * Fix error when loading libmbedtls.so.\n   * Fix bug in mbedtls_ssl_conf_default() that caused the default preset to\n     be always used (found by dcb314) (#235)\n   * Fix bug in mbedtls_rsa_public() and mbedtls_rsa_private() that could\n     result trying to unlock an unlocked mutex on invalid input (found by\n     Fredrik Axelsson) (#257)\n   * Fix -Wshadow warnings (found by hnrkp) (#240)\n   * Fix memory corruption on client with overlong PSK identity, around\n     SSL_MAX_CONTENT_LEN or higher - not triggerrable remotely (found by\n     Aleksandrs Saveljevs) (#238)\n   * Fix unused function warning when using MBEDTLS_MDx_ALT or\n     MBEDTLS_SHAxxx_ALT (found by Henrik) (#239)\n   * Fix memory corruption in pkey programs (found by yankuncheng) (#210)\n\nChanges\n   * The PEM parser now accepts a trailing space at end of lines (#226).\n   * It is now possible to #include a user-provided configuration file at the\n     end of the default config.h by defining MBEDTLS_USER_CONFIG_FILE on the\n     compiler's command line.\n   * When verifying a certificate chain, if an intermediate certificate is\n     trusted, no later cert is checked. (suggested by hannes-landeholm)\n     (#220).\n   * Prepend a \"thread identifier\" to debug messages (issue pointed out by\n     Hugo Leisink) (#210).\n   * Add mbedtls_ssl_get_max_frag_len() to query the current maximum fragment\n     length.\n\n= mbed TLS 2.0.0 released 2015-07-13\n\nFeatures\n   * Support for DTLS 1.0 and 1.2 (RFC 6347).\n   * Ability to override core functions from MDx, SHAx, AES and DES modules\n     with custom implementation (eg hardware accelerated), complementing the\n     ability to override the whole module.\n   * New server-side implementation of session tickets that rotate keys to\n     preserve forward secrecy, and allows sharing across multiple contexts.\n   * Added a concept of X.509 cerificate verification profile that controls\n     which algorithms and key sizes (curves for ECDSA) are acceptable.\n   * Expanded configurability of security parameters in the SSL module with\n     mbedtls_ssl_conf_dhm_min_bitlen() and mbedtls_ssl_conf_sig_hashes().\n   * Introduced a concept of presets for SSL security-relevant configuration\n     parameters.\n\nAPI Changes\n   * The library has been split into libmbedcrypto, libmbedx509, libmbedtls.\n     You now need to link to all of them if you use TLS for example.\n   * All public identifiers moved to the mbedtls_* or MBEDTLS_* namespace.\n     Some names have been further changed to make them more consistent.\n     Migration helpers scripts/rename.pl and include/mbedlts/compat-1.3.h are\n     provided. Full list of renamings in scripts/data_files/rename-1.3-2.0.txt\n   * Renamings of fields inside structures, not covered by the previous list:\n     mbedtls_cipher_info_t.key_length -> key_bitlen\n     mbedtls_cipher_context_t.key_length -> key_bitlen\n     mbedtls_ecp_curve_info.size -> bit_size\n   * Headers are now found in the 'mbedtls' directory (previously 'polarssl').\n   * The following _init() functions that could return errors have\n     been split into an _init() that returns void and another function that\n     should generally be the first function called on this context after init:\n     mbedtls_ssl_init() -> mbedtls_ssl_setup()\n     mbedtls_ccm_init() -> mbedtls_ccm_setkey()\n     mbedtls_gcm_init() -> mbedtls_gcm_setkey()\n     mbedtls_hmac_drbg_init() -> mbedtls_hmac_drbg_seed(_buf)()\n     mbedtls_ctr_drbg_init()  -> mbedtls_ctr_drbg_seed()\n     Note that for mbedtls_ssl_setup(), you need to be done setting up the\n     ssl_config structure before calling it.\n   * Most ssl_set_xxx() functions (all except ssl_set_bio(), ssl_set_hostname(),\n     ssl_set_session() and ssl_set_client_transport_id(), plus\n     ssl_legacy_renegotiation()) have been renamed to mbedtls_ssl_conf_xxx()\n     (see rename.pl and compat-1.3.h above) and their first argument's type\n     changed from ssl_context to ssl_config.\n   * ssl_set_bio() changed signature (contexts merged, order switched, one\n     additional callback for read-with-timeout).\n   * The following functions have been introduced and must be used in callback\n     implementations (SNI, PSK) instead of their *conf counterparts:\n     mbedtls_ssl_set_hs_own_cert()\n     mbedtls_ssl_set_hs_ca_chain()\n     mbedtls_ssl_set_hs_psk()\n   * mbedtls_ssl_conf_ca_chain() lost its last argument (peer_cn), now set\n     using mbedtls_ssl_set_hostname().\n   * mbedtls_ssl_conf_session_cache() changed prototype (only one context\n     pointer, parameters reordered).\n   * On server, mbedtls_ssl_conf_session_tickets_cb() must now be used in\n     place of mbedtls_ssl_conf_session_tickets() to enable session tickets.\n   * The SSL debug callback gained two new arguments (file name, line number).\n   * Debug modes were removed.\n   * mbedtls_ssl_conf_truncated_hmac() now returns void.\n   * mbedtls_memory_buffer_alloc_init() now returns void.\n   * X.509 verification flags are now an uint32_t. Affect the signature of:\n     mbedtls_ssl_get_verify_result()\n     mbedtls_x509_ctr_verify_info()\n     mbedtls_x509_crt_verify() (flags, f_vrfy -> needs to be updated)\n     mbedtls_ssl_conf_verify() (f_vrfy -> needs to be updated)\n   * The following functions changed prototype to avoid an in-out length\n     parameter:\n     mbedtls_base64_encode()\n     mbedtls_base64_decode()\n     mbedtls_mpi_write_string()\n     mbedtls_dhm_calc_secret()\n   * In the NET module, all \"int\" and \"int *\" arguments for file descriptors\n     changed type to \"mbedtls_net_context *\".\n   * net_accept() gained new arguments for the size of the client_ip buffer.\n   * In the threading layer, mbedtls_mutex_init() and mbedtls_mutex_free() now\n     return void.\n   * ecdsa_write_signature() gained an addtional md_alg argument and\n     ecdsa_write_signature_det() was deprecated.\n   * pk_sign() no longer accepts md_alg == POLARSSL_MD_NONE with ECDSA.\n   * Last argument of x509_crt_check_key_usage() and\n     mbedtls_x509write_crt_set_key_usage() changed from int to unsigned.\n   * test_ca_list (from certs.h) is renamed to test_cas_pem and is only\n     available if POLARSSL_PEM_PARSE_C is defined (it never worked without).\n   * Test certificates in certs.c are no longer guaranteed to be nul-terminated\n     strings; use the new *_len variables instead of strlen().\n   * Functions mbedtls_x509_xxx_parse(), mbedtls_pk_parse_key(),\n     mbedtls_pk_parse_public_key() and mbedtls_dhm_parse_dhm() now expect the\n     length parameter to include the terminating null byte for PEM input.\n   * Signature of mpi_mul_mpi() changed to make the last argument unsigned\n   * calloc() is now used instead of malloc() everywhere. API of platform\n     layer and the memory_buffer_alloc module changed accordingly.\n     (Thanks to Mansour Moufid for helping with the replacement.)\n   * Change SSL_DISABLE_RENEGOTIATION config.h flag to SSL_RENEGOTIATION\n     (support for renegotiation now needs explicit enabling in config.h).\n   * Split MBEDTLS_HAVE_TIME into MBEDTLS_HAVE_TIME and MBEDTLS_HAVE_TIME_DATE\n     in config.h\n   * net_connect() and net_bind() have a new 'proto' argument to choose\n     between TCP and UDP, using the macros NET_PROTO_TCP or NET_PROTO_UDP.\n     Their 'port' argument type is changed to a string.\n   * Some constness fixes\n\nRemovals\n   * Removed mbedtls_ecp_group_read_string(). Only named groups are supported.\n   * Removed mbedtls_ecp_sub() and mbedtls_ecp_add(), use\n     mbedtls_ecp_muladd().\n   * Removed individual mdX_hmac, shaX_hmac, mdX_file and shaX_file functions\n     (use generic functions from md.h)\n   * Removed mbedtls_timing_msleep(). Use mbedtls_net_usleep() or a custom\n     waiting function.\n   * Removed test DHM parameters from the test certs module.\n   * Removed the PBKDF2 module (use PKCS5).\n   * Removed POLARSSL_ERROR_STRERROR_BC (use mbedtls_strerror()).\n   * Removed compat-1.2.h (helper for migrating from 1.2 to 1.3).\n   * Removed openssl.h (very partial OpenSSL compatibility layer).\n   * Configuration options POLARSSL_HAVE_LONGLONG was removed (now always on).\n   * Configuration options POLARSSL_HAVE_INT8 and POLARSSL_HAVE_INT16 have\n     been removed (compiler is required to support 32-bit operations).\n   * Configuration option POLARSSL_HAVE_IPV6 was removed (always enabled).\n   * Removed test program o_p_test, the script compat.sh does more.\n   * Removed test program ssl_test, superseded by ssl-opt.sh.\n   * Removed helper script active-config.pl\n\nNew deprecations\n   * md_init_ctx() is deprecated in favour of md_setup(), that adds a third\n     argument (allowing memory savings if HMAC is not used)\n\nSemi-API changes (technically public, morally private)\n   * Renamed a few headers to include _internal in the name. Those headers are\n     not supposed to be included by users.\n   * Changed md_info_t into an opaque structure (use md_get_xxx() accessors).\n   * Changed pk_info_t into an opaque structure.\n   * Changed cipher_base_t into an opaque structure.\n   * Removed sig_oid2 and rename sig_oid1 to sig_oid in x509_crt and x509_crl.\n   * x509_crt.key_usage changed from unsigned char to unsigned int.\n   * Removed r and s from ecdsa_context\n   * Removed mode from des_context and des3_context\n\nDefault behavior changes\n   * The default minimum TLS version is now TLS 1.0.\n   * RC4 is now blacklisted by default in the SSL/TLS layer, and excluded from the\n     default ciphersuite list returned by ssl_list_ciphersuites()\n   * Support for receiving SSLv2 ClientHello is now disabled by default at\n     compile time.\n   * The default authmode for SSL/TLS clients is now REQUIRED.\n   * Support for RSA_ALT contexts in the PK layer is now optional. Since is is\n     enabled in the default configuration, this is only noticeable if using a\n     custom config.h\n   * Default DHM parameters server-side upgraded from 1024 to 2048 bits.\n   * A minimum RSA key size of 2048 bits is now enforced during ceritificate\n     chain verification.\n   * Negotiation of truncated HMAC is now disabled by default on server too.\n   * The following functions are now case-sensitive:\n     mbedtls_cipher_info_from_string()\n     mbedtls_ecp_curve_info_from_name()\n     mbedtls_md_info_from_string()\n     mbedtls_ssl_ciphersuite_from_string()\n     mbedtls_version_check_feature()\n\nRequirement changes\n   * The minimum MSVC version required is now 2010 (better C99 support).\n   * The NET layer now unconditionnaly relies on getaddrinfo() and select().\n   * Compiler is required to support C99 types such as long long and uint32_t.\n\nAPI changes from the 1.4 preview branch\n   * ssl_set_bio_timeout() was removed, split into mbedtls_ssl_set_bio() with\n     new prototype, and mbedtls_ssl_set_read_timeout().\n   * The following functions now return void:\n     mbedtls_ssl_conf_transport()\n     mbedtls_ssl_conf_max_version()\n     mbedtls_ssl_conf_min_version()\n   * DTLS no longer hard-depends on TIMING_C, but uses a callback interface\n     instead, see mbedtls_ssl_set_timer_cb(), with the Timing module providing\n     an example implementation, see mbedtls_timing_delay_context and\n     mbedtls_timing_set/get_delay().\n   * With UDP sockets, it is no longer necessary to call net_bind() again\n     after a successful net_accept().\n\nChanges\n   * mbedtls_ctr_drbg_random() and mbedtls_hmac_drbg_random() are now\n     thread-safe if MBEDTLS_THREADING_C is enabled.\n   * Reduced ROM fooprint of SHA-256 and added an option to reduce it even\n     more (at the expense of performance) MBEDTLS_SHA256_SMALLER.\n\n= mbed TLS 1.3 branch\n\nSecurity\n   * With authmode set to SSL_VERIFY_OPTIONAL, verification of keyUsage and\n     extendedKeyUsage on the leaf certificate was lost (results not accessible\n     via ssl_get_verify_results()).\n   * Add countermeasure against \"Lucky 13 strikes back\" cache-based attack,\n     https://dl.acm.org/citation.cfm?id=2714625\n\nFeatures\n   * Improve ECC performance by using more efficient doubling formulas\n     (contributed by Peter Dettman).\n   * Add x509_crt_verify_info() to display certificate verification results.\n   * Add support for reading DH parameters with privateValueLength included\n     (contributed by Daniel Kahn Gillmor).\n   * Add support for bit strings in X.509 names (request by Fredrik Axelsson).\n   * Add support for id-at-uniqueIdentifier in X.509 names.\n   * Add support for overriding snprintf() (except on Windows) and exit() in\n     the platform layer.\n   * Add an option to use macros instead of function pointers in the platform\n     layer (helps get rid of unwanted references).\n   * Improved Makefiles for Windows targets by fixing library targets and making\n     cross-compilation easier (thanks to Alon Bar-Lev).\n   * The benchmark program also prints heap usage for public-key primitives\n     if POLARSSL_MEMORY_BUFFER_ALLOC_C and POLARSSL_MEMORY_DEBUG are defined.\n   * New script ecc-heap.sh helps measuring the impact of ECC parameters on\n     speed and RAM (heap only for now) usage.\n   * New script memory.sh helps measuring the ROM and RAM requirements of two\n     reduced configurations (PSK-CCM and NSA suite B).\n   * Add config flag POLARSSL_DEPRECATED_WARNING (off by default) to produce\n     warnings on use of deprecated functions (with GCC and Clang only).\n   * Add config flag POLARSSL_DEPRECATED_REMOVED (off by default) to produce\n     errors on use of deprecated functions.\n\nBugfix\n   * Fix compile errors with PLATFORM_NO_STD_FUNCTIONS.\n   * Fix compile error with PLATFORM_EXIT_ALT (thanks to Rafał Przywara).\n   * Fix bug in entropy.c when THREADING_C is also enabled that caused\n     entropy_free() to crash (thanks to Rafał Przywara).\n   * Fix memory leak when gcm_setkey() and ccm_setkey() are used more than\n     once on the same context.\n   * Fix bug in ssl_mail_client when password is longer that username (found\n     by Bruno Pape).\n   * Fix undefined behaviour (memcmp( NULL, NULL, 0 );) in X.509 modules\n     (detected by Clang's 3.6 UBSan).\n   * mpi_size() and mpi_msb() would segfault when called on an mpi that is\n     initialized but not set (found by pravic).\n   * Fix detection of support for getrandom() on Linux (reported by syzzer) by\n     doing it at runtime (using uname) rather that compile time.\n   * Fix handling of symlinks by \"make install\" (found by Gaël PORTAY).\n   * Fix potential NULL pointer dereference (not trigerrable remotely) when\n     ssl_write() is called before the handshake is finished (introduced in\n     1.3.10) (first reported by Martin Blumenstingl).\n   * Fix bug in pk_parse_key() that caused some valid private EC keys to be\n     rejected.\n   * Fix bug in Via Padlock support (found by Nikos Mavrogiannopoulos).\n   * Fix thread safety bug in RSA operations (found by Fredrik Axelsson).\n   * Fix hardclock() (only used in the benchmarking program) with some\n     versions of mingw64 (found by kxjhlele).\n   * Fix warnings from mingw64 in timing.c (found by kxjklele).\n   * Fix potential unintended sign extension in asn1_get_len() on 64-bit\n     platforms.\n   * Fix potential memory leak in ssl_set_psk() (found by Mansour Moufid).\n   * Fix compile error when POLARSSL_SSL_DISABLE_RENEGOTATION and\n     POLARSSL_SSL_SSESSION_TICKETS where both enabled in config.h (introduced\n     in 1.3.10).\n   * Add missing extern \"C\" guard in aesni.h (reported by amir zamani).\n   * Add missing dependency on SHA-256 in some x509 programs (reported by\n     Gergely Budai).\n   * Fix bug related to ssl_set_curves(): the client didn't check that the\n     curve picked by the server was actually allowed.\n\nChanges\n   * Remove bias in mpi_gen_prime (contributed by Pascal Junod).\n   * Remove potential sources of timing variations (some contributed by Pascal\n     Junod).\n   * Options POLARSSL_HAVE_INT8 and POLARSSL_HAVE_INT16 are deprecated.\n   * Enabling POLARSSL_NET_C without POLARSSL_HAVE_IPV6 is deprecated.\n   * compat-1.2.h and openssl.h are deprecated.\n   * Adjusting/overriding CFLAGS and LDFLAGS with the make build system is now\n     more flexible (warning: OFLAGS is not used any more) (see the README)\n     (contributed by Alon Bar-Lev).\n   * ssl_set_own_cert() no longer calls pk_check_pair() since the\n     performance impact was bad for some users (this was introduced in 1.3.10).\n   * Move from SHA-1 to SHA-256 in example programs using signatures\n     (suggested by Thorsten Mühlfelder).\n   * Remove some unneeded inclusions of header files from the standard library\n     \"minimize\" others (eg use stddef.h if only size_t is needed).\n   * Change #include lines in test files to use double quotes instead of angle\n     brackets for uniformity with the rest of the code.\n   * Remove dependency on sscanf() in X.509 parsing modules.\n\n= mbed TLS 1.3.10 released 2015-02-09\nSecurity\n   * NULL pointer dereference in the buffer-based allocator when the buffer is\n     full and polarssl_free() is called (found by Mark Hasemeyer)\n     (only possible if POLARSSL_MEMORY_BUFFER_ALLOC_C is enabled, which it is\n     not by default).\n   * Fix remotely-triggerable uninitialised pointer dereference caused by\n     crafted X.509 certificate (TLS server is not affected if it doesn't ask for a\n     client certificate) (found using Codenomicon Defensics).\n   * Fix remotely-triggerable memory leak caused by crafted X.509 certificates\n     (TLS server is not affected if it doesn't ask for a client certificate)\n     (found using Codenomicon Defensics).\n   * Fix potential stack overflow while parsing crafted X.509 certificates\n     (TLS server is not affected if it doesn't ask for a client certificate)\n     (found using Codenomicon Defensics).\n   * Fix timing difference that could theoretically lead to a\n     Bleichenbacher-style attack in the RSA and RSA-PSK key exchanges\n     (reported by Sebastian Schinzel).\n\nFeatures\n   * Add support for FALLBACK_SCSV (draft-ietf-tls-downgrade-scsv).\n   * Add support for Extended Master Secret (draft-ietf-tls-session-hash).\n   * Add support for Encrypt-then-MAC (RFC 7366).\n   * Add function pk_check_pair() to test if public and private keys match.\n   * Add x509_crl_parse_der().\n   * Add compile-time option POLARSSL_X509_MAX_INTERMEDIATE_CA to limit the\n     length of an X.509 verification chain.\n   * Support for renegotiation can now be disabled at compile-time\n   * Support for 1/n-1 record splitting, a countermeasure against BEAST.\n   * Certificate selection based on signature hash, preferring SHA-1 over SHA-2\n     for pre-1.2 clients when multiple certificates are available.\n   * Add support for getrandom() syscall on recent Linux kernels with Glibc or\n     a compatible enough libc (eg uClibc).\n   * Add ssl_set_arc4_support() to make it easier to disable RC4 at runtime\n     while using the default ciphersuite list.\n   * Added new error codes and debug messages about selection of\n     ciphersuite/certificate.\n\nBugfix\n   * Stack buffer overflow if ctr_drbg_update() is called with too large\n     add_len (found by Jean-Philippe Aumasson) (not triggerable remotely).\n   * Possible buffer overflow of length at most POLARSSL_MEMORY_ALIGN_MULTIPLE\n     if memory_buffer_alloc_init() was called with buf not aligned and len not\n     a multiple of POLARSSL_MEMORY_ALIGN_MULTIPLE (not triggerable remotely).\n   * User set CFLAGS were ignored by Cmake with gcc (introduced in 1.3.9, found\n     by Julian Ospald).\n   * Fix potential undefined behaviour in Camellia.\n   * Fix potential failure in ECDSA signatures when POLARSSL_ECP_MAX_BITS is a\n     multiple of 8 (found by Gergely Budai).\n   * Fix unchecked return code in x509_crt_parse_path() on Windows (found by\n     Peter Vaskovic).\n   * Fix assembly selection for MIPS64 (thanks to James Cowgill).\n   * ssl_get_verify_result() now works even if the handshake was aborted due\n     to a failed verification (found by Fredrik Axelsson).\n   * Skip writing and parsing signature_algorithm extension if none of the\n     key exchanges enabled needs certificates. This fixes a possible interop\n     issue with some servers when a zero-length extension was sent. (Reported\n     by Peter Dettman.)\n   * On a 0-length input, base64_encode() did not correctly set output length\n     (found by Hendrik van den Boogaard).\n\nChanges\n   * Use deterministic nonces for AEAD ciphers in TLS by default (possible to\n     switch back to random with POLARSSL_SSL_AEAD_RANDOM_IV in config.h).\n   * Blind RSA private operations even when POLARSSL_RSA_NO_CRT is defined.\n   * ssl_set_own_cert() now returns an error on key-certificate mismatch.\n   * Forbid repeated extensions in X.509 certificates.\n   * debug_print_buf() now prints a text view in addition to hexadecimal.\n   * A specific error is now returned when there are ciphersuites in common\n     but none of them is usable due to external factors such as no certificate\n     with a suitable (extended)KeyUsage or curve or no PSK set.\n   * It is now possible to disable negotiation of truncated HMAC server-side\n     at runtime with ssl_set_truncated_hmac().\n   * Example programs for SSL client and server now disable SSLv3 by default.\n   * Example programs for SSL client and server now disable RC4 by default.\n   * Use platform.h in all test suites and programs.\n\n= PolarSSL 1.3.9 released 2014-10-20\nSecurity\n   * Lowest common hash was selected from signature_algorithms extension in\n     TLS 1.2 (found by Darren Bane) (introduced in 1.3.8).\n   * Remotely-triggerable memory leak when parsing some X.509 certificates\n     (server is not affected if it doesn't ask for a client certificate)\n     (found using Codenomicon Defensics).\n   * Remotely-triggerable memory leak when parsing crafted ClientHello\n     (not affected if ECC support was compiled out) (found using Codenomicon\n     Defensics).\n\nBugfix\n   * Support escaping of commas in x509_string_to_names()\n   * Fix compile error in ssl_pthread_server (found by Julian Ospald).\n   * Fix net_accept() regarding non-blocking sockets (found by Luca Pesce).\n   * Don't print uninitialised buffer in ssl_mail_client (found by Marc Abel).\n   * Fix warnings from Clang's scan-build (contributed by Alfred Klomp).\n   * Fix compile error in timing.c when POLARSSL_NET_C and POLARSSL_SELFTEST\n     are defined but not POLARSSL_HAVE_TIME (found by Stephane Di Vito).\n   * Remove non-existent file from VS projects (found by Peter Vaskovic).\n   * ssl_read() could return non-application data records on server while\n     renegotation was pending, and on client when a HelloRequest was received.\n   * Server-initiated renegotiation would fail with non-blocking I/O if the\n     write callback returned WANT_WRITE when requesting renegotiation.\n   * ssl_close_notify() could send more than one message in some circumstances\n     with non-blocking I/O.\n   * Fix compiler warnings on iOS (found by Sander Niemeijer).\n   * x509_crt_parse() did not increase total_failed on PEM error\n   * Fix compile error with armcc in mpi_is_prime()\n   * Fix potential bad read in parsing ServerHello (found by Adrien\n     Vialletelle).\n\nChanges\n   * Ciphersuites using SHA-256 or SHA-384 now require TLS 1.x (there is no\n     standard defining how to use SHA-2 with SSL 3.0).\n   * Ciphersuites using RSA-PSK key exchange new require TLS 1.x (the spec is\n     ambiguous on how to encode some packets with SSL 3.0).\n   * Made buffer size in pk_write_(pub)key_pem() more dynamic, eg smaller if\n     RSA is disabled, larger if POLARSSL_MPI_MAX_SIZE is larger.\n   * ssl_read() now returns POLARSSL_ERR_NET_WANT_READ rather than\n     POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE on harmless alerts.\n   * POLARSSL_MPI_MAX_SIZE now defaults to 1024 in order to allow 8192 bits\n     RSA keys.\n   * Accept spaces at end of line or end of buffer in base64_decode().\n   * X.509 certificates with more than one AttributeTypeAndValue per\n     RelativeDistinguishedName are not accepted any more.\n\n= PolarSSL 1.3.8 released 2014-07-11\nSecurity\n   * Fix length checking for AEAD ciphersuites (found by Codenomicon).\n     It was possible to crash the server (and client) using crafted messages\n     when a GCM suite was chosen.\n\nFeatures\n   * Add CCM module and cipher mode to Cipher Layer\n   * Support for CCM and CCM_8 ciphersuites\n   * Support for parsing and verifying RSASSA-PSS signatures in the X.509\n     modules (certificates, CRLs and CSRs).\n   * Blowfish in the cipher layer now supports variable length keys.\n   * Add example config.h for PSK with CCM, optimized for low RAM usage.\n   * Optimize for RAM usage in example config.h for NSA Suite B profile.\n   * Add POLARSSL_REMOVE_ARC4_CIPHERSUITES to allow removing RC4 ciphersuites\n     from the default list (inactive by default).\n   * Add server-side enforcement of sent renegotiation requests\n     (ssl_set_renegotiation_enforced())\n   * Add SSL_CIPHERSUITES config.h flag to allow specifying a list of\n     ciphersuites to use and save some memory if the list is small.\n\nChanges\n   * Add LINK_WITH_PTHREAD option in CMake for explicit linking that is\n     required on some platforms (e.g. OpenBSD)\n   * Migrate zeroizing of data to polarssl_zeroize() instead of memset()\n     against unwanted compiler optimizations\n   * md_list() now returns hashes strongest first\n   * Selection of hash for signing ServerKeyExchange in TLS 1.2 now picks\n     strongest offered by client.\n   * All public contexts have _init() and _free() functions now for simpler\n     usage pattern\n\nBugfix\n   * Fix in debug_print_msg()\n   * Enforce alignment in the buffer allocator even if buffer is not aligned\n   * Remove less-than-zero checks on unsigned numbers\n   * Stricter check on SSL ClientHello internal sizes compared to actual packet\n     size (found by TrustInSoft)\n   * Fix WSAStartup() return value check (found by Peter Vaskovic)\n   * Other minor issues (found by Peter Vaskovic)\n   * Fix symlink command for cross compiling with CMake (found by Andre\n     Heinecke)\n   * Fix DER output of gen_key app (found by Gergely Budai)\n   * Very small records were incorrectly rejected when truncated HMAC was in\n     use with some ciphersuites and versions (RC4 in all versions, CBC with\n     versions < TLS 1.1).\n   * Very large records using more than 224 bytes of padding were incorrectly\n     rejected with CBC-based ciphersuites and TLS >= 1.1\n   * Very large records using less padding could cause a buffer overread of up\n     to 32 bytes with CBC-based ciphersuites and TLS >= 1.1\n   * Restore ability to use a v1 cert as a CA if trusted locally. (This had\n     been removed in 1.3.6.)\n   * Restore ability to locally trust a self-signed cert that is not a proper\n     CA for use as an end entity certificate. (This had been removed in\n     1.3.6.)\n   * Fix preprocessor checks for bn_mul PPC asm (found by Barry K. Nathan).\n   * Use \\n\\t rather than semicolons for bn_mul asm, since some assemblers\n     interpret semicolons as comment delimiters (found by Barry K. Nathan).\n   * Fix off-by-one error in parsing Supported Point Format extension that\n     caused some handshakes to fail.\n   * Fix possible miscomputation of the premaster secret with DHE-PSK key\n     exchange that caused some handshakes to fail with other implementations.\n     (Failure rate <= 1/255 with common DHM moduli.)\n   * Disable broken Sparc64 bn_mul assembly (found by Florian Obser).\n   * Fix base64_decode() to return and check length correctly (in case of\n     tight buffers)\n   * Fix mpi_write_string() to write \"00\" as hex output for empty MPI (found\n     by Hui Dong)\n\n= PolarSSL 1.3.7 released on 2014-05-02\nFeatures\n   * debug_set_log_mode() added to determine raw or full logging\n   * debug_set_threshold() added to ignore messages over threshold level\n   * version_check_feature() added to check for compile-time options at\n     run-time\n\nChanges\n   * POLARSSL_CONFIG_OPTIONS has been removed. All values are individually\n     checked and filled in the relevant module headers\n   * Debug module only outputs full lines instead of parts\n   * Better support for the different Attribute Types from IETF PKIX (RFC 5280)\n   * AES-NI now compiles with \"old\" assemblers too\n   * Ciphersuites based on RC4 now have the lowest priority by default\n\nBugfix\n   * Only iterate over actual certificates in ssl_write_certificate_request()\n     (found by Matthew Page)\n   * Typos in platform.c and pkcs11.c (found by Daniel Phillips and Steffan\n     Karger)\n   * cert_write app should use subject of issuer certificate as issuer of cert\n   * Fix false reject in padding check in ssl_decrypt_buf() for CBC\n     ciphersuites, for full SSL frames of data.\n   * Improve interoperability by not writing extension length in ClientHello /\n     ServerHello when no extensions are present (found by Matthew Page)\n   * rsa_check_pubkey() now allows an E up to N\n   * On OpenBSD, use arc4random_buf() instead of rand() to prevent warnings\n   * mpi_fill_random() was creating numbers larger than requested on\n     big-endian platform when size was not an integer number of limbs\n   * Fix dependencies issues in X.509 test suite.\n   * Some parts of ssl_tls.c were compiled even when the module was disabled.\n   * Fix detection of DragonflyBSD in net.c (found by Markus Pfeiffer)\n   * Fix detection of Clang on some Apple platforms with CMake\n     (found by Barry K. Nathan)\n\n= PolarSSL 1.3.6 released on 2014-04-11\n\nFeatures\n   * Support for the ALPN SSL extension\n   * Add option 'use_dev_random' to gen_key application\n   * Enable verification of the keyUsage extension for CA and leaf\n     certificates (POLARSSL_X509_CHECK_KEY_USAGE)\n   * Enable verification of the extendedKeyUsage extension\n     (POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE)\n\nChanges\n   * x509_crt_info() now prints information about parsed extensions as well\n   * pk_verify() now returns a specific error code when the signature is valid\n     but shorter than the supplied length.\n   * Use UTC time to check certificate validity.\n   * Reject certificates with times not in UTC, per RFC 5280.\n\nSecurity\n   * Avoid potential timing leak in ecdsa_sign() by blinding modular division.\n     (Found by Watson Ladd.)\n   * The notAfter date of some certificates was no longer checked since 1.3.5.\n     This affects certificates in the user-supplied chain except the top\n     certificate. If the user-supplied chain contains only one certificates,\n     it is not affected (ie, its notAfter date is properly checked).\n   * Prevent potential NULL pointer dereference in ssl_read_record() (found by\n     TrustInSoft)\n\nBugfix\n   * The length of various ClientKeyExchange messages was not properly checked.\n   * Some example server programs were not sending the close_notify alert.\n   * Potential memory leak in mpi_exp_mod() when error occurs during\n     calculation of RR.\n   * Fixed malloc/free default #define in platform.c (found by Gergely Budai).\n   * Fixed type which made POLARSSL_ENTROPY_FORCE_SHA256 uneffective (found by\n     Gergely Budai).\n   * Fix #include path in ecdsa.h which wasn't accepted by some compilers.\n     (found by Gergely Budai)\n   * Fix compile errors when POLARSSL_ERROR_STRERROR_BC is undefined (found by\n     Shuo Chen).\n   * oid_get_numeric_string() used to truncate the output without returning an\n     error if the output buffer was just 1 byte too small.\n   * dhm_parse_dhm() (hence dhm_parse_dhmfile()) did not set dhm->len.\n   * Calling pk_debug() on an RSA-alt key would segfault.\n   * pk_get_size() and pk_get_len() were off by a factor 8 for RSA-alt keys.\n   * Potential buffer overwrite in pem_write_buffer() because of low length\n     indication (found by Thijs Alkemade)\n   * EC curves constants, which should be only in ROM since 1.3.3, were also\n     stored in RAM due to missing 'const's (found by Gergely Budai).\n\n= PolarSSL 1.3.5 released on 2014-03-26\nFeatures\n   * HMAC-DRBG as a separate module\n   * Option to set the Curve preference order (disabled by default)\n   * Single Platform compatilibity layer (for memory / printf / fprintf)\n   * Ability to provide alternate timing implementation\n   * Ability to force the entropy module to use SHA-256 as its basis\n     (POLARSSL_ENTROPY_FORCE_SHA256)\n   * Testing script ssl-opt.sh added for testing 'live' ssl option\n     interoperability against OpenSSL and PolarSSL\n   * Support for reading EC keys that use SpecifiedECDomain in some cases.\n   * Entropy module now supports seed writing and reading\n\nChanges\n   * Deprecated the Memory layer\n   * entropy_add_source(), entropy_update_manual() and entropy_gather()\n     now thread-safe if POLARSSL_THREADING_C defined\n   * Improvements to the CMake build system, contributed by Julian Ospald.\n   * Work around a bug of the version of Clang shipped by Apple with Mavericks\n     that prevented bignum.c from compiling. (Reported by Rafael Baptista.)\n   * Revamped the compat.sh interoperatibility script to include support for\n     testing against GnuTLS\n   * Deprecated ssl_set_own_cert_rsa() and ssl_set_own_cert_rsa_alt()\n   * Improvements to tests/Makefile, contributed by Oden Eriksson.\n\nSecurity\n   * Forbid change of server certificate during renegotiation to prevent\n     \"triple handshake\" attack when authentication mode is 'optional' (the\n     attack was already impossible when authentication is required).\n   * Check notBefore timestamp of certificates and CRLs from the future.\n   * Forbid sequence number wrapping\n   * Fixed possible buffer overflow with overlong PSK\n   * Possible remotely-triggered out-of-bounds memory access fixed (found by\n     TrustInSoft)\n\nBugfix\n   * ecp_gen_keypair() does more tries to prevent failure because of\n     statistics\n   * Fixed bug in RSA PKCS#1 v1.5 \"reversed\" operations\n   * Fixed testing with out-of-source builds using cmake\n   * Fixed version-major intolerance in server\n   * Fixed CMake symlinking on out-of-source builds\n   * Fixed dependency issues in test suite\n   * Programs rsa_sign_pss and rsa_verify_pss were not using PSS since 1.3.0\n   * Bignum's MIPS-32 assembly was used on MIPS-64, causing chaos. (Found by\n     Alex Wilson.)\n   * ssl_cache was creating entries when max_entries=0 if TIMING_C was enabled.\n   * m_sleep() was sleeping twice too long on most Unix platforms.\n   * Fixed bug with session tickets and non-blocking I/O in the unlikely case\n     send() would return an EAGAIN error when sending the ticket.\n   * ssl_cache was leaking memory when reusing a timed out entry containing a\n     client certificate.\n   * ssl_srv was leaking memory when client presented a timed out ticket\n     containing a client certificate\n   * ssl_init() was leaving a dirty pointer in ssl_context if malloc of\n     out_ctr failed\n   * ssl_handshake_init() was leaving dirty pointers in subcontexts if malloc\n     of one of them failed\n   * Fix typo in rsa_copy() that impacted PKCS#1 v2 contexts\n   * x509_get_current_time() uses localtime_r() to prevent thread issues\n\n= PolarSSL 1.3.4 released on 2014-01-27\nFeatures\n   * Support for the Koblitz curves: secp192k1, secp224k1, secp256k1\n   * Support for RIPEMD-160\n   * Support for AES CFB8 mode\n   * Support for deterministic ECDSA (RFC 6979)\n\nBugfix\n   * Potential memory leak in bignum_selftest()\n   * Replaced expired test certificate\n   * ssl_mail_client now terminates lines with CRLF, instead of LF\n   * net module handles timeouts on blocking sockets better (found by Tilman\n     Sauerbeck)\n   * Assembly format fixes in bn_mul.h\n\nSecurity\n   * Missing MPI_CHK calls added around unguarded mpi calls (found by\n     TrustInSoft)\n\n= PolarSSL 1.3.3 released on 2013-12-31\nFeatures\n   * EC key generation support in gen_key app\n   * Support for adhering to client ciphersuite order preference\n     (POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE)\n   * Support for Curve25519\n   * Support for ECDH-RSA and ECDH-ECDSA key exchanges and ciphersuites\n   * Support for IPv6 in the NET module\n   * AES-NI support for AES, AES-GCM and AES key scheduling\n   * SSL Pthread-based server example added (ssl_pthread_server)\n\nChanges\n   * gen_prime() speedup\n   * Speedup of ECP multiplication operation\n   * Relaxed some SHA2 ciphersuite's version requirements\n   * Dropped use of readdir_r() instead of readdir() with threading support\n   * More constant-time checks in the RSA module\n   * Split off curves from ecp.c into ecp_curves.c\n   * Curves are now stored fully in ROM\n   * Memory usage optimizations in ECP module\n   * Removed POLARSSL_THREADING_DUMMY\n\nBugfix\n   * Fixed bug in mpi_set_bit() on platforms where t_uint is wider than int\n   * Fixed X.509 hostname comparison (with non-regular characters)\n   * SSL now gracefully handles missing RNG\n   * Missing defines / cases for RSA_PSK key exchange\n   * crypt_and_hash app checks MAC before final decryption\n   * Potential memory leak in ssl_ticket_keys_init()\n   * Memory leak in benchmark application\n   * Fixed x509_crt_parse_path() bug on Windows platforms\n   * Added missing MPI_CHK() around some statements in mpi_div_mpi() (found by\n     TrustInSoft)\n   * Fixed potential overflow in certificate size verification in\n     ssl_write_certificate() (found by TrustInSoft)\n\nSecurity\n   * Possible remotely-triggered out-of-bounds memory access fixed (found by\n     TrustInSoft)\n\n= PolarSSL 1.3.2 released on 2013-11-04\nFeatures\n   * PK tests added to test framework\n   * Added optional optimization for NIST MODP curves (POLARSSL_ECP_NIST_OPTIM)\n   * Support for Camellia-GCM mode and ciphersuites\n\nChanges\n   * Padding checks in cipher layer are now constant-time\n   * Value comparisons in SSL layer are now constant-time\n   * Support for serialNumber, postalAddress and postalCode in X509 names\n   * SSL Renegotiation was refactored\n\nBugfix\n   * More stringent checks in cipher layer\n   * Server does not send out extensions not advertised by client\n   * Prevent possible alignment warnings on casting from char * to 'aligned *'\n   * Misc fixes and additions to dependency checks\n   * Const correctness\n   * cert_write with selfsign should use issuer_name as subject_name\n   * Fix ECDSA corner case: missing reduction mod N (found by DualTachyon)\n   * Defines to handle UEFI environment under MSVC\n   * Server-side initiated renegotiations send HelloRequest\n\n= PolarSSL 1.3.1 released on 2013-10-15\nFeatures\n   * Support for Brainpool curves and TLS ciphersuites (RFC 7027)\n   * Support for ECDHE-PSK key-exchange and ciphersuites\n   * Support for RSA-PSK key-exchange and ciphersuites\n\nChanges\n   * RSA blinding locks for a smaller amount of time\n   * TLS compression only allocates working buffer once\n   * Introduced POLARSSL_HAVE_READDIR_R for systems without it\n   * config.h is more script-friendly\n\nBugfix\n   * Missing MSVC defines added\n   * Compile errors with POLARSSL_RSA_NO_CRT\n   * Header files with 'polarssl/'\n   * Const correctness\n   * Possible naming collision in dhm_context\n   * Better support for MSVC\n   * threading_set_alt() name\n   * Added missing x509write_crt_set_version()\n\n= PolarSSL 1.3.0 released on 2013-10-01\nFeatures\n   * Elliptic Curve Cryptography module added\n   * Elliptic Curve Diffie Hellman module added\n   * Ephemeral Elliptic Curve Diffie Hellman support for SSL/TLS\n    (ECDHE-based ciphersuites)\n   * Ephemeral Elliptic Curve Digital Signature Algorithm support for SSL/TLS\n    (ECDSA-based ciphersuites)\n   * Ability to specify allowed ciphersuites based on the protocol version.\n   * PSK and DHE-PSK based ciphersuites added\n   * Memory allocation abstraction layer added\n   * Buffer-based memory allocator added (no malloc() / free() / HEAP usage)\n   * Threading abstraction layer added (dummy / pthread / alternate)\n   * Public Key abstraction layer added\n   * Parsing Elliptic Curve keys\n   * Parsing Elliptic Curve certificates\n   * Support for max_fragment_length extension (RFC 6066)\n   * Support for truncated_hmac extension (RFC 6066)\n   * Support for zeros-and-length (ANSI X.923) padding, one-and-zeros\n     (ISO/IEC 7816-4) padding and zero padding in the cipher layer\n   * Support for session tickets (RFC 5077)\n   * Certificate Request (CSR) generation with extensions (key_usage,\n     ns_cert_type)\n   * X509 Certificate writing with extensions (basic_constraints,\n     issuer_key_identifier, etc)\n   * Optional blinding for RSA, DHM and EC\n   * Support for multiple active certificate / key pairs in SSL servers for\n   \t the same host (Not to be confused with SNI!)\n\nChanges\n   * Ability to enable / disable SSL v3 / TLS 1.0 / TLS 1.1 / TLS 1.2\n     individually\n   * Introduced separate SSL Ciphersuites module that is based on\n     Cipher and MD information\n   * Internals for SSL module adapted to have separate IV pointer that is\n     dynamically set (Better support for hardware acceleration)\n   * Moved all OID functionality to a separate module. RSA function\n     prototypes for the RSA sign and verify functions changed as a result\n   * Split up the GCM module into a starts/update/finish cycle\n   * Client and server now filter sent and accepted ciphersuites on minimum\n     and maximum protocol version\n   * Ability to disable server_name extension (RFC 6066)\n   * Renamed error_strerror() to the less conflicting polarssl_strerror()\n     (Ability to keep old as well with POLARSSL_ERROR_STRERROR_BC)\n   * SHA2 renamed to SHA256, SHA4 renamed to SHA512 and functions accordingly\n   * All RSA operations require a random generator for blinding purposes\n   * X509 core refactored\n   * x509_crt_verify() now case insensitive for cn (RFC 6125 6.4)\n   * Also compiles / runs without time-based functions (!POLARSSL_HAVE_TIME)\n   * Support faulty X509 v1 certificates with extensions\n     (POLARSSL_X509_ALLOW_EXTENSIONS_NON_V3)\n\nBugfix\n   * Fixed parse error in ssl_parse_certificate_request()\n   * zlib compression/decompression skipped on empty blocks\n   * Support for AIX header locations in net.c module\n   * Fixed file descriptor leaks\n\nSecurity\n   * RSA blinding on CRT operations to counter timing attacks\n     (found by Cyril Arnaud and Pierre-Alain Fouque)\n\n\n= Version 1.2.14 released 2015-05-??\n\nSecurity\n   * Fix potential invalid memory read in the server, that allows a client to\n     crash it remotely (found by Caj Larsson).\n   * Fix potential invalid memory read in certificate parsing, that allows a\n     client to crash the server remotely if client authentication is enabled\n     (found using Codenomicon Defensics).\n   * Add countermeasure against \"Lucky 13 strikes back\" cache-based attack,\n     https://dl.acm.org/citation.cfm?id=2714625\n\nBugfix\n   * Fix bug in Via Padlock support (found by Nikos Mavrogiannopoulos).\n   * Fix hardclock() (only used in the benchmarking program) with some\n     versions of mingw64 (found by kxjhlele).\n   * Fix warnings from mingw64 in timing.c (found by kxjklele).\n   * Fix potential unintended sign extension in asn1_get_len() on 64-bit\n     platforms (found with Coverity Scan).\n\n= Version 1.2.13 released 2015-02-16\nNote: Although PolarSSL has been renamed to mbed TLS, no changes reflecting\n      this will be made in the 1.2 branch at this point.\n\nSecurity\n   * Fix remotely-triggerable uninitialised pointer dereference caused by\n     crafted X.509 certificate (TLS server is not affected if it doesn't ask\n     for a client certificate) (found using Codenomicon Defensics).\n   * Fix remotely-triggerable memory leak caused by crafted X.509 certificates\n     (TLS server is not affected if it doesn't ask for a client certificate)\n     (found using Codenomicon Defensics).\n   * Fix potential stack overflow while parsing crafted X.509 certificates\n     (TLS server is not affected if it doesn't ask for a client certificate)\n     found using Codenomicon Defensics).\n   * Fix buffer overread of size 1 when parsing crafted X.509 certificates\n     (TLS server is not affected if it doesn't ask for a client certificate).\n\nBugfix\n   * Fix potential undefined behaviour in Camellia.\n   * Fix memory leaks in PKCS#5 and PKCS#12.\n   * Stack buffer overflow if ctr_drbg_update() is called with too large\n     add_len (found by Jean-Philippe Aumasson) (not triggerable remotely).\n   * Fix bug in MPI/bignum on s390/s390x (reported by Dan Horák) (introduced\n     in 1.2.12).\n   * Fix unchecked return code in x509_crt_parse_path() on Windows (found by\n     Peter Vaskovic).\n   * Fix assembly selection for MIPS64 (thanks to James Cowgill).\n   * ssl_get_verify_result() now works even if the handshake was aborted due\n     to a failed verification (found by Fredrik Axelsson).\n   * Skip writing and parsing signature_algorithm extension if none of the\n     key exchanges enabled needs certificates. This fixes a possible interop\n     issue with some servers when a zero-length extension was sent. (Reported\n     by Peter Dettman.)\n   * On a 0-length input, base64_encode() did not correctly set output length\n     (found by Hendrik van den Boogaard).\n\nChanges\n   * Blind RSA private operations even when POLARSSL_RSA_NO_CRT is defined.\n   * Forbid repeated extensions in X.509 certificates.\n   * Add compile-time option POLARSSL_X509_MAX_INTERMEDIATE_CA to limit the\n     length of an X.509 verification chain (default = 8).\n= Version 1.2.12 released 2014-10-24\n\nSecurity\n   * Remotely-triggerable memory leak when parsing some X.509 certificates\n     (server is not affected if it doesn't ask for a client certificate).\n     (Found using Codenomicon Defensics.)\n\nBugfix\n   * Fix potential bad read in parsing ServerHello (found by Adrien\n     Vialletelle).\n   * ssl_close_notify() could send more than one message in some circumstances\n     with non-blocking I/O.\n   * x509_crt_parse() did not increase total_failed on PEM error\n   * Fix compiler warnings on iOS (found by Sander Niemeijer).\n   * Don't print uninitialised buffer in ssl_mail_client (found by Marc Abel).\n   * Fix net_accept() regarding non-blocking sockets (found by Luca Pesce).\n   * ssl_read() could return non-application data records on server while\n     renegotation was pending, and on client when a HelloRequest was received.\n   * Fix warnings from Clang's scan-build (contributed by Alfred Klomp).\n\nChanges\n   * X.509 certificates with more than one AttributeTypeAndValue per\n     RelativeDistinguishedName are not accepted any more.\n   * ssl_read() now returns POLARSSL_ERR_NET_WANT_READ rather than\n     POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE on harmless alerts.\n   * Accept spaces at end of line or end of buffer in base64_decode().\n\n= Version 1.2.11 released 2014-07-11\nFeatures\n   * Entropy module now supports seed writing and reading\n\nChanges\n   * Introduced POLARSSL_HAVE_READDIR_R for systems without it\n   * Improvements to the CMake build system, contributed by Julian Ospald.\n   * Work around a bug of the version of Clang shipped by Apple with Mavericks\n     that prevented bignum.c from compiling. (Reported by Rafael Baptista.)\n   * Improvements to tests/Makefile, contributed by Oden Eriksson.\n   * Use UTC time to check certificate validity.\n   * Reject certificates with times not in UTC, per RFC 5280.\n   * Migrate zeroizing of data to polarssl_zeroize() instead of memset()\n     against unwanted compiler optimizations\n\nSecurity\n   * Forbid change of server certificate during renegotiation to prevent\n     \"triple handshake\" attack when authentication mode is optional (the\n     attack was already impossible when authentication is required).\n   * Check notBefore timestamp of certificates and CRLs from the future.\n   * Forbid sequence number wrapping\n   * Prevent potential NULL pointer dereference in ssl_read_record() (found by\n     TrustInSoft)\n   * Fix length checking for AEAD ciphersuites (found by Codenomicon).\n     It was possible to crash the server (and client) using crafted messages\n     when a GCM suite was chosen.\n\nBugfix\n   * Fixed X.509 hostname comparison (with non-regular characters)\n   * SSL now gracefully handles missing RNG\n   * crypt_and_hash app checks MAC before final decryption\n   * Fixed x509_crt_parse_path() bug on Windows platforms\n   * Added missing MPI_CHK() around some statements in mpi_div_mpi() (found by\n     TrustInSoft)\n   * Fixed potential overflow in certificate size verification in\n     ssl_write_certificate() (found by TrustInSoft)\n   * Fix ASM format in bn_mul.h\n   * Potential memory leak in bignum_selftest()\n   * Replaced expired test certificate\n   * ssl_mail_client now terminates lines with CRLF, instead of LF\n   * Fix bug in RSA PKCS#1 v1.5 \"reversed\" operations\n   * Fixed testing with out-of-source builds using cmake\n   * Fixed version-major intolerance in server\n   * Fixed CMake symlinking on out-of-source builds\n   * Bignum's MIPS-32 assembly was used on MIPS-64, causing chaos. (Found by\n     Alex Wilson.)\n   * ssl_init() was leaving a dirty pointer in ssl_context if malloc of\n     out_ctr failed\n   * ssl_handshake_init() was leaving dirty pointers in subcontexts if malloc\n     of one of them failed\n   * x509_get_current_time() uses localtime_r() to prevent thread issues\n   * Some example server programs were not sending the close_notify alert.\n   * Potential memory leak in mpi_exp_mod() when error occurs during\n     calculation of RR.\n   * Improve interoperability by not writing extension length in ClientHello\n     when no extensions are present (found by Matthew Page)\n   * rsa_check_pubkey() now allows an E up to N\n   * On OpenBSD, use arc4random_buf() instead of rand() to prevent warnings\n   * mpi_fill_random() was creating numbers larger than requested on\n     big-endian platform when size was not an integer number of limbs\n   * Fix detection of DragonflyBSD in net.c (found by Markus Pfeiffer)\n   * Stricter check on SSL ClientHello internal sizes compared to actual packet\n     size (found by TrustInSoft)\n   * Fix preprocessor checks for bn_mul PPC asm (found by Barry K. Nathan).\n   * Use \\n\\t rather than semicolons for bn_mul asm, since some assemblers\n     interpret semicolons as comment delimiters (found by Barry K. Nathan).\n   * Disable broken Sparc64 bn_mul assembly (found by Florian Obser).\n   * Fix base64_decode() to return and check length correctly (in case of\n     tight buffers)\n\n= Version 1.2.10 released 2013-10-07\nChanges\n   * Changed RSA blinding to a slower but thread-safe version\n\nBugfix\n   * Fixed memory leak in RSA as a result of introduction of blinding\n   * Fixed ssl_pkcs11_decrypt() prototype\n   * Fixed MSVC project files\n\n= Version 1.2.9 released 2013-10-01\nChanges\n   * x509_verify() now case insensitive for cn (RFC 6125 6.4)\n\nBugfix\n   * Fixed potential memory leak when failing to resume a session\n   * Fixed potential file descriptor leaks (found by Remi Gacogne)\n   * Minor fixes\n\nSecurity\n   * Fixed potential heap buffer overflow on large hostname setting\n   * Fixed potential negative value misinterpretation in load_file()\n   * RSA blinding on CRT operations to counter timing attacks\n     (found by Cyril Arnaud and Pierre-Alain Fouque)\n\n= Version 1.2.8 released 2013-06-19\nFeatures\n   * Parsing of PKCS#8 encrypted private key files\n   * PKCS#12 PBE and derivation functions\n   * Centralized module option values in config.h to allow user-defined\n     settings without editing header files by using POLARSSL_CONFIG_OPTIONS\n\nChanges\n   * HAVEGE random generator disabled by default\n   * Internally split up x509parse_key() into a (PEM) handler function\n     and specific DER parser functions for the PKCS#1 and unencrypted\n     PKCS#8 private key formats\n   * Added mechanism to provide alternative implementations for all\n     symmetric cipher and hash algorithms (e.g. POLARSSL_AES_ALT in\n\t config.h)\n   * PKCS#5 module added. Moved PBKDF2 functionality inside and deprecated\n     old PBKDF2 module\n\nBugfix\n   * Secure renegotiation extension should only be sent in case client\n     supports secure renegotiation\n   * Fixed offset for cert_type list in ssl_parse_certificate_request()\n   * Fixed const correctness issues that have no impact on the ABI\n   * x509parse_crt() now better handles PEM error situations\n   * ssl_parse_certificate() now calls x509parse_crt_der() directly\n     instead of the x509parse_crt() wrapper that can also parse PEM\n\t certificates\n   * x509parse_crtpath() is now reentrant and uses more portable stat()\n   * Fixed bignum.c and bn_mul.h to support Thumb2 and LLVM compiler\n   * Fixed values for 2-key Triple DES in cipher layer\n   * ssl_write_certificate_request() can handle empty ca_chain\n\nSecurity\n   * A possible DoS during the SSL Handshake, due to faulty parsing of\n     PEM-encoded certificates has been fixed (found by Jack Lloyd)\n\n= Version 1.2.7 released 2013-04-13\nFeatures\n   * Ability to specify allowed ciphersuites based on the protocol version.\n\nChanges\n   * Default Blowfish keysize is now 128-bits\n   * Test suites made smaller to accommodate Raspberry Pi\n\nBugfix\n   * Fix for MPI assembly for ARM\n   * GCM adapted to support sizes > 2^29\n\n= Version 1.2.6 released 2013-03-11\nBugfix\n   * Fixed memory leak in ssl_free() and ssl_reset() for active session\n   * Corrected GCM counter incrementation to use only 32-bits instead of\n     128-bits (found by Yawning Angel)\n   * Fixes for 64-bit compilation with MS Visual Studio\n   * Fixed net_bind() for specified IP addresses on little endian systems\n   * Fixed assembly code for ARM (Thumb and regular) for some compilers\n\nChanges\n   * Internally split up rsa_pkcs1_encrypt(), rsa_pkcs1_decrypt(),\n     rsa_pkcs1_sign() and rsa_pkcs1_verify() to separate PKCS#1 v1.5 and\n     PKCS#1 v2.1 functions\n   * Added support for custom labels when using rsa_rsaes_oaep_encrypt()\n     or rsa_rsaes_oaep_decrypt()\n   * Re-added handling for SSLv2 Client Hello when the define\n     POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO is set\n   * The SSL session cache module (ssl_cache) now also retains peer_cert\n     information (not the entire chain)\n\nSecurity\n   * Removed further timing differences during SSL message decryption in\n     ssl_decrypt_buf()\n   * Removed timing differences due to bad padding from\n     rsa_rsaes_pkcs1_v15_decrypt() and rsa_pkcs1_decrypt() for PKCS#1 v1.5\n     operations\n\n= Version 1.2.5 released 2013-02-02\nChanges\n   * Allow enabling of dummy error_strerror() to support some use-cases\n   * Debug messages about padding errors during SSL message decryption are\n     disabled by default and can be enabled with POLARSSL_SSL_DEBUG_ALL\n   * Sending of security-relevant alert messages that do not break\n     interoperability can be switched on/off with the flag\n     POLARSSL_SSL_ALL_ALERT_MESSAGES\n\nSecurity\n   * Removed timing differences during SSL message decryption in\n     ssl_decrypt_buf() due to badly formatted padding\n\n= Version 1.2.4 released 2013-01-25\nChanges\n   * More advanced SSL ciphersuite representation and moved to more dynamic\n     SSL core\n   * Added ssl_handshake_step() to allow single stepping the handshake process\n\nBugfix\n   * Memory leak when using RSA_PKCS_V21 operations fixed\n   * Handle future version properly in ssl_write_certificate_request()\n   * Correctly handle CertificateRequest message in client for <= TLS 1.1\n     without DN list\n\n= Version 1.2.3 released 2012-11-26\nBugfix\n   * Server not always sending correct CertificateRequest message\n\n= Version 1.2.2 released 2012-11-24\nChanges\n   * Added p_hw_data to ssl_context for context specific hardware acceleration\n     data\n   * During verify trust-CA is only checked for expiration and CRL presence\n\nBugfixes\n   * Fixed client authentication compatibility\n   * Fixed dependency on POLARSSL_SHA4_C in SSL modules\n\n= Version 1.2.1 released 2012-11-20\nChanges\n   * Depth that the certificate verify callback receives is now numbered\n     bottom-up (Peer cert depth is 0)\n\nBugfixes\n   * Fixes for MSVC6\n   * Moved mpi_inv_mod() outside POLARSSL_GENPRIME\n   * Allow R and A to point to same mpi in mpi_div_mpi (found by Manuel\n     Pégourié-Gonnard)\n   * Fixed possible segfault in mpi_shift_r() (found by Manuel\n     Pégourié-Gonnard)\n   * Added max length check for rsa_pkcs1_sign with PKCS#1 v2.1\n\n= Version 1.2.0 released 2012-10-31\nFeatures\n   * Added support for NULL cipher (POLARSSL_CIPHER_NULL_CIPHER) and weak\n     ciphersuites (POLARSSL_ENABLE_WEAK_CIPHERSUITES). They are disabled by\n     default!\n   * Added support for wildcard certificates\n   * Added support for multi-domain certificates through the X509 Subject\n     Alternative Name extension\n   * Added preliminary ASN.1 buffer writing support\n   * Added preliminary X509 Certificate Request writing support\n   * Added key_app_writer example application\n   * Added cert_req example application\n   * Added base Galois Counter Mode (GCM) for AES\n   * Added TLS 1.2 support (RFC 5246)\n   * Added GCM suites to TLS 1.2 (RFC 5288)\n   * Added commandline error code convertor (util/strerror)\n   * Added support for Hardware Acceleration hooking in SSL/TLS\n   * Added OpenSSL / PolarSSL compatibility script (tests/compat.sh) and\n     example application (programs/ssl/o_p_test) (requires OpenSSL)\n   * Added X509 CA Path support\n   * Added Thumb assembly optimizations\n   * Added DEFLATE compression support as per RFC3749 (requires zlib)\n   * Added blowfish algorithm (Generic and cipher layer)\n   * Added PKCS#5 PBKDF2 key derivation function\n   * Added Secure Renegotiation (RFC 5746)\n   * Added predefined DHM groups from RFC 5114\n   * Added simple SSL session cache implementation\n   * Added ServerName extension parsing (SNI) at server side\n   * Added option to add minimum accepted SSL/TLS protocol version\n\nChanges\n   * Removed redundant POLARSSL_DEBUG_MSG define\n   * AES code only check for Padlock once\n   * Fixed const-correctness mpi_get_bit()\n   * Documentation for mpi_lsb() and mpi_msb()\n   * Moved out_msg to out_hdr + 32 to support hardware acceleration\n   * Changed certificate verify behaviour to comply with RFC 6125 section 6.3\n     to not match CN if subjectAltName extension is present (Closes ticket #56)\n   * Cipher layer cipher_mode_t POLARSSL_MODE_CFB128 is renamed to\n     POLARSSL_MODE_CFB, to also handle different block size CFB modes.\n   * Removed handling for SSLv2 Client Hello (as per RFC 5246 recommendation)\n   * Revamped session resumption handling\n   * Generalized external private key implementation handling (like PKCS#11)\n     in SSL/TLS\n   * Revamped x509_verify() and the SSL f_vrfy callback implementations\n   * Moved from unsigned long to fixed width uint32_t types throughout code\n   * Renamed ciphersuites naming scheme to IANA reserved names\n\nBugfix\n   * Fixed handling error in mpi_cmp_mpi() on longer B values (found by\n     Hui Dong)\n   * Fixed potential heap corruption in x509_name allocation\n   * Fixed single RSA test that failed on Big Endian systems (Closes ticket #54)\n   * mpi_exp_mod() now correctly handles negative base numbers (Closes ticket\n     #52)\n   * Handle encryption with private key and decryption with public key as per\n   \t RFC 2313\n   * Handle empty certificate subject names\n   * Prevent reading over buffer boundaries on X509 certificate parsing\n   * mpi_add_abs() now correctly handles adding short numbers to long numbers\n     with carry rollover (found by Ruslan Yushchenko)\n   * Handle existence of OpenSSL Trust Extensions at end of X.509 DER blob\n   * Fixed MPI assembly for SPARC64 platform\n\nSecurity\n   * Fixed potential memory zeroization on miscrafted RSA key (found by Eloi\n     Vanderbeken)\n\n= Version 1.1.8 released on 2013-10-01\nBugfix\n   * Fixed potential memory leak when failing to resume a session\n   * Fixed potential file descriptor leaks\n\nSecurity\n   * Potential buffer-overflow for ssl_read_record() (independently found by\n     both TrustInSoft and Paul Brodeur of Leviathan Security Group)\n   * Potential negative value misinterpretation in load_file()\n   * Potential heap buffer overflow on large hostname setting\n\n= Version 1.1.7 released on 2013-06-19\nChanges\n   * HAVEGE random generator disabled by default\n\nBugfix\n   * x509parse_crt() now better handles PEM error situations\n   * ssl_parse_certificate() now calls x509parse_crt_der() directly\n     instead of the x509parse_crt() wrapper that can also parse PEM\n\t certificates\n   * Fixed values for 2-key Triple DES in cipher layer\n   * ssl_write_certificate_request() can handle empty ca_chain\n\nSecurity\n   * A possible DoS during the SSL Handshake, due to faulty parsing of\n     PEM-encoded certificates has been fixed (found by Jack Lloyd)\n\n= Version 1.1.6 released on 2013-03-11\nBugfix\n   * Fixed net_bind() for specified IP addresses on little endian systems\n\nChanges\n   * Allow enabling of dummy error_strerror() to support some use-cases\n   * Debug messages about padding errors during SSL message decryption are\n     disabled by default and can be enabled with POLARSSL_SSL_DEBUG_ALL\n\nSecurity\n   * Removed timing differences during SSL message decryption in\n     ssl_decrypt_buf()\n   * Removed timing differences due to bad padding from\n     rsa_rsaes_pkcs1_v15_decrypt() and rsa_pkcs1_decrypt() for PKCS#1 v1.5\n     operations\n\n= Version 1.1.5 released on 2013-01-16\nBugfix\n   * Fixed MPI assembly for SPARC64 platform\n   * Handle existence of OpenSSL Trust Extensions at end of X.509 DER blob\n   * mpi_add_abs() now correctly handles adding short numbers to long numbers\n     with carry rollover\n   * Moved mpi_inv_mod() outside POLARSSL_GENPRIME\n   * Prevent reading over buffer boundaries on X509 certificate parsing\n   * mpi_exp_mod() now correctly handles negative base numbers (Closes ticket\n     #52)\n   * Fixed possible segfault in mpi_shift_r() (found by Manuel\n     Pégourié-Gonnard)\n   * Allow R and A to point to same mpi in mpi_div_mpi (found by Manuel\n     Pégourié-Gonnard)\n   * Added max length check for rsa_pkcs1_sign with PKCS#1 v2.1\n   * Memory leak when using RSA_PKCS_V21 operations fixed\n   * Handle encryption with private key and decryption with public key as per\n     RFC 2313\n   * Fixes for MSVC6\n\nSecurity\n   * Fixed potential memory zeroization on miscrafted RSA key (found by Eloi\n     Vanderbeken)\n\n= Version 1.1.4 released on 2012-05-31\nBugfix\n   * Correctly handle empty SSL/TLS packets (Found by James Yonan)\n   * Fixed potential heap corruption in x509_name allocation\n   * Fixed single RSA test that failed on Big Endian systems (Closes ticket #54)\n\n= Version 1.1.3 released on 2012-04-29\nBugfix\n   * Fixed random MPI generation to not generate more size than requested.\n\n= Version 1.1.2 released on 2012-04-26\nBugfix\n   * Fixed handling error in mpi_cmp_mpi() on longer B values (found by\n     Hui Dong)\n\nSecurity\n   * Fixed potential memory corruption on miscrafted client messages (found by\n     Frama-C team at CEA LIST)\n   * Fixed generation of DHM parameters to correct length (found by Ruslan\n     Yushchenko)\n\n= Version 1.1.1 released on 2012-01-23\nBugfix\n   * Check for failed malloc() in ssl_set_hostname() and x509_get_entries()\n     (Closes ticket #47, found by Hugo Leisink)\n   * Fixed issues with Intel compiler on 64-bit systems (Closes ticket #50)\n   * Fixed multiple compiler warnings for VS6 and armcc\n   * Fixed bug in CTR_CRBG selftest\n\n= Version 1.1.0 released on 2011-12-22\nFeatures\n   * Added ssl_session_reset() to allow better multi-connection pools of\n     SSL contexts without needing to set all non-connection-specific\n\t data and pointers again. Adapted ssl_server to use this functionality.\n   * Added ssl_set_max_version() to allow clients to offer a lower maximum\n     supported version to a server to help buggy server implementations.\n\t (Closes ticket #36)\n   * Added cipher_get_cipher_mode() and cipher_get_cipher_operation()\n     introspection functions (Closes ticket #40)\n   * Added CTR_DRBG based on AES-256-CTR (NIST SP 800-90) random generator\n   * Added a generic entropy accumulator that provides support for adding\n     custom entropy sources and added some generic and platform dependent\n\t entropy sources\n\nChanges\n   * Documentation for AES and Camellia in modes CTR and CFB128 clarified.\n   * Fixed rsa_encrypt and rsa_decrypt examples to use public key for\n     encryption and private key for decryption. (Closes ticket #34)\n   * Inceased maximum size of ASN1 length reads to 32-bits.\n   * Added an EXPLICIT tag number parameter to x509_get_ext()\n   * Added a separate CRL entry extension parsing function\n   * Separated the ASN.1 parsing code from the X.509 specific parsing code.\n     So now there is a module that is controlled with POLARSSL_ASN1_PARSE_C.\n   * Changed the defined key-length of DES ciphers in cipher.h to include the\n     parity bits, to prevent mistakes in copying data. (Closes ticket #33)\n   * Loads of minimal changes to better support WINCE as a build target\n     (Credits go to Marco Lizza)\n   * Added POLARSSL_MPI_WINDOW_SIZE definition to allow easier time to memory\n     trade-off\n   * Introduced POLARSSL_MPI_MAX_SIZE and POLARSSL_MPI_MAX_BITS for MPI size\n     management (Closes ticket #44)\n   * Changed the used random function pointer to more flexible format. Renamed\n     havege_rand() to havege_random() to prevent mistakes. Lots of changes as\n     a consequence in library code and programs\n   * Moved all examples programs to use the new entropy and CTR_DRBG\n   * Added permissive certificate parsing to x509parse_crt() and\n     x509parse_crtfile(). With permissive parsing the parsing does not stop on\n     encountering a parse-error. Beware that the meaning of return values has\n     changed!\n   * All error codes are now negative. Even on mermory failures and IO errors.\n\nBugfix\n   * Fixed faulty HMAC-MD2 implementation. Found by dibac. (Closes\n     ticket #37)\n   * Fixed a bug where the CRL parser expected an EXPLICIT ASN.1 tag\n     before version numbers\n   * Allowed X509 key usage parsing to accept 4 byte values instead of the\n     standard 1 byte version sometimes used by Microsoft. (Closes ticket #38)\n   * Fixed incorrect behaviour in case of RSASSA-PSS with a salt length\n     smaller than the hash length. (Closes ticket #41)\n   * If certificate serial is longer than 32 octets, serial number is now\n     appended with '....' after first 28 octets\n   * Improved build support for s390x and sparc64 in bignum.h\n   * Fixed MS Visual C++ name clash with int64 in sha4.h\n   * Corrected removal of leading \"00:\" in printing serial numbers in\n     certificates and CRLs\n\n= Version 1.0.0 released on 2011-07-27\nFeatures\n   * Expanded cipher layer with support for CFB128 and CTR mode\n   * Added rsa_encrypt and rsa_decrypt simple example programs.\n\nChanges\n   * The generic cipher and message digest layer now have normal error\n     codes instead of integers\n\nBugfix\n   * Undid faulty bug fix in ssl_write() when flushing old data (Ticket\n     #18)\n\n= Version 0.99-pre5 released on 2011-05-26\nFeatures\n   * Added additional Cipher Block Modes to symmetric ciphers\n     (AES CTR, Camellia CTR, XTEA CBC) including the option to\n     enable and disable individual modes when needed\n   * Functions requiring File System functions can now be disabled\n     by undefining POLARSSL_FS_IO\n   * A error_strerror function() has been added to translate between\n     error codes and their description.\n   * Added mpi_get_bit() and mpi_set_bit() individual bit setter/getter\n     functions.\n   * Added ssl_mail_client and ssl_fork_server as example programs.\n\nChanges\n   * Major argument / variable rewrite. Introduced use of size_t\n     instead of int for buffer lengths and loop variables for\n     better unsigned / signed use. Renamed internal bigint types\n     t_int and t_dbl to t_uint and t_udbl in the process\n   * mpi_init() and mpi_free() now only accept a single MPI\n     argument and do not accept variable argument lists anymore.\n   * The error codes have been remapped and combining error codes\n     is now done with a PLUS instead of an OR as error codes\n     used are negative.\n   * Changed behaviour of net_read(), ssl_fetch_input() and ssl_recv().\n     net_recv() now returns 0 on EOF instead of\n     POLARSSL_ERR_NET_CONN_RESET. ssl_fetch_input() returns\n     POLARSSL_ERR_SSL_CONN_EOF on an EOF from its f_recv() function.\n     ssl_read() returns 0 if a POLARSSL_ERR_SSL_CONN_EOF is received\n     after the handshake.\n   * Network functions now return POLARSSL_ERR_NET_WANT_READ or\n     POLARSSL_ERR_NET_WANT_WRITE instead of the ambiguous\n     POLARSSL_ERR_NET_TRY_AGAIN\n\n= Version 0.99-pre4 released on 2011-04-01\nFeatures\n   * Added support for PKCS#1 v2.1 encoding and thus support\n     for the RSAES-OAEP and RSASSA-PSS operations.\n   * Reading of Public Key files incorporated into default x509\n     functionality as well.\n   * Added mpi_fill_random() for centralized filling of big numbers\n     with random data (Fixed ticket #10)\n\nChanges\n   * Debug print of MPI now removes leading zero octets and\n     displays actual bit size of the value.\n   * x509parse_key() (and as a consequence x509parse_keyfile())\n     does not zeroize memory in advance anymore. Use rsa_init()\n     before parsing a key or keyfile!\n\nBugfix\n   * Debug output of MPI's now the same independent of underlying\n     platform (32-bit / 64-bit) (Fixes ticket #19, found by Mads\n     Kiilerich and Mihai Militaru)\n   * Fixed bug in ssl_write() when flushing old data (Fixed ticket\n     #18, found by Nikolay Epifanov)\n   * Fixed proper handling of RSASSA-PSS verification with variable\n     length salt lengths\n\n= Version 0.99-pre3 released on 2011-02-28\nThis release replaces version 0.99-pre2 which had possible copyright issues.\nFeatures\n   * Parsing PEM private keys encrypted with DES and AES\n     are now supported as well (Fixes ticket #5)\n   * Added crl_app program to allow easy reading and\n     printing of X509 CRLs from file\n\nChanges\n   * Parsing of PEM files moved to separate module (Fixes\n     ticket #13). Also possible to remove PEM support for\n     systems only using DER encoding\n\nBugfixes\n   * Corrected parsing of UTCTime dates before 1990 and\n     after 1950\n   * Support more exotic OID's when parsing certificates\n   \t (found by Mads Kiilerich)\n   * Support more exotic name representations when parsing\n     certificates (found by Mads Kiilerich)\n   * Replaced the expired test certificates\n   * Do not bail out if no client certificate specified. Try\n     to negotiate anonymous connection (Fixes ticket #12,\n     found by Boris Krasnovskiy)\n\nSecurity fixes\n   * Fixed a possible Man-in-the-Middle attack on the\n     Diffie Hellman key exchange (thanks to Larry Highsmith,\n     Subreption LLC)\n\n= Version 0.99-pre1 released on 2011-01-30\nFeatures\nNote: Most of these features have been donated by Fox-IT\n   * Added Doxygen source code documentation parts\n   * Added reading of DHM context from memory and file\n   * Improved X509 certificate parsing to include extended\n     certificate fields, including Key Usage\n   * Improved certificate verification and verification\n     against the available CRLs\n   * Detection for DES weak keys and parity bits added\n   * Improvements to support integration in other\n     applications:\n       + Added generic message digest and cipher wrapper\n       + Improved information about current capabilities,\n         status, objects and configuration\n       + Added verification callback on certificate chain\n         verification to allow external blacklisting\n\t   + Additional example programs to show usage\n   * Added support for PKCS#11 through the use of the\n     libpkcs11-helper library\n\nChanges\n   * x509parse_time_expired() checks time in addition to\n     the existing date check\n   * The ciphers member of ssl_context and the cipher member\n     of ssl_session have been renamed to ciphersuites and\n     ciphersuite respectively. This clarifies the difference\n     with the generic cipher layer and is better naming\n     altogether\n\n= Version 0.14.0 released on 2010-08-16\nFeatures\n   * Added support for SSL_EDH_RSA_AES_128_SHA and\n     SSL_EDH_RSA_CAMELLIA_128_SHA ciphersuites\n   * Added compile-time and run-time version information\n   * Expanded ssl_client2 arguments for more flexibility\n   * Added support for TLS v1.1\n\nChanges\n   * Made Makefile cleaner\n   * Removed dependency on rand() in rsa_pkcs1_encrypt().\n     Now using random fuction provided to function and\n     changed the prototype of rsa_pkcs1_encrypt(),\n     rsa_init() and rsa_gen_key().\n   * Some SSL defines were renamed in order to avoid\n     future confusion\n\nBug fixes\n   * Fixed CMake out of source build for tests (found by\n     kkert)\n   * rsa_check_private() now supports PKCS1v2 keys as well\n   * Fixed deadlock in rsa_pkcs1_encrypt() on failing random\n     generator\n\n= Version 0.13.1 released on 2010-03-24\nBug fixes\n   * Fixed Makefile in library that was mistakenly merged\n   * Added missing const string fixes\n\n= Version 0.13.0 released on 2010-03-21\nFeatures\n   * Added option parsing for host and port selection to\n     ssl_client2\n   * Added support for GeneralizedTime in X509 parsing\n   * Added cert_app program to allow easy reading and\n     printing of X509 certificates from file or SSL\n     connection.\n\nChanges\n   * Added const correctness for main code base\n   * X509 signature algorithm determination is now\n     in a function to allow easy future expansion\n   * Changed symmetric cipher functions to\n     identical interface (returning int result values)\n   * Changed ARC4 to use separate input/output buffer\n   * Added reset function for HMAC context as speed-up\n     for specific use-cases\n\nBug fixes\n   * Fixed bug resulting in failure to send the last\n     certificate in the chain in ssl_write_certificate() and\n     ssl_write_certificate_request() (found by fatbob)\n   * Added small fixes for compiler warnings on a Mac\n     (found by Frank de Brabander)\n   * Fixed algorithmic bug in mpi_is_prime() (found by\n     Smbat Tonoyan)\n\n= Version 0.12.1 released on 2009-10-04\nChanges\n   * Coverage test definitions now support 'depends_on'\n     tagging system.\n   * Tests requiring specific hashing algorithms now honor\n     the defines.\n\nBug fixes\n   * Changed typo in #ifdef in x509parse.c (found\n     by Eduardo)\n\n= Version 0.12.0 released on 2009-07-28\nFeatures\n   * Added CMake makefiles as alternative to regular Makefiles.\n   * Added preliminary Code Coverage tests for AES, ARC4,\n     Base64, MPI, SHA-family, MD-family, HMAC-SHA-family,\n     Camellia, DES, 3-DES, RSA PKCS#1, XTEA, Diffie-Hellman\n     and X509parse.\n\nChanges\n   * Error codes are not (necessarily) negative. Keep\n     this is mind when checking for errors.\n   * RSA_RAW renamed to SIG_RSA_RAW for consistency.\n   * Fixed typo in name of POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE.\n   * Changed interface for AES and Camellia setkey functions\n     to indicate invalid key lengths.\n\nBug fixes\n   * Fixed include location of endian.h on FreeBSD (found by\n     Gabriel)\n   * Fixed include location of endian.h and name clash on\n     Apples (found by Martin van Hensbergen)\n   * Fixed HMAC-MD2 by modifying md2_starts(), so that the\n     required HMAC ipad and opad variables are not cleared.\n     (found by code coverage tests)\n   * Prevented use of long long in bignum if\n     POLARSSL_HAVE_LONGLONG not defined (found by Giles\n     Bathgate).\n   * Fixed incorrect handling of negative strings in\n     mpi_read_string() (found by code coverage tests).\n   * Fixed segfault on handling empty rsa_context in\n     rsa_check_pubkey() and rsa_check_privkey() (found by\n     code coverage tests).\n   * Fixed incorrect handling of one single negative input\n     value in mpi_add_abs() (found by code coverage tests).\n   * Fixed incorrect handling of negative first input\n     value in mpi_sub_abs() (found by code coverage tests).\n   * Fixed incorrect handling of negative first input\n     value in mpi_mod_mpi() and mpi_mod_int(). Resulting\n     change also affects mpi_write_string() (found by code\n     coverage tests).\n   * Corrected is_prime() results for 0, 1 and 2 (found by\n     code coverage tests).\n   * Fixed Camellia and XTEA for 64-bit Windows systems.\n\n= Version 0.11.1 released on 2009-05-17\n   * Fixed missing functionality for SHA-224, SHA-256, SHA384,\n     SHA-512 in rsa_pkcs1_sign()\n\n= Version 0.11.0 released on 2009-05-03\n   * Fixed a bug in mpi_gcd() so that it also works when both\n     input numbers are even and added testcases to check\n     (found by Pierre Habouzit).\n   * Added support for SHA-224, SHA-256, SHA-384 and SHA-512\n     one way hash functions with the PKCS#1 v1.5 signing and\n     verification.\n   * Fixed minor bug regarding mpi_gcd located within the\n     POLARSSL_GENPRIME block.\n   * Fixed minor memory leak in x509parse_crt() and added better\n     handling of 'full' certificate chains (found by Mathias\n     Olsson).\n   * Centralized file opening and reading for x509 files into\n     load_file()\n   * Made definition of net_htons() endian-clean for big endian\n     systems (Found by Gernot).\n   * Undefining POLARSSL_HAVE_ASM now also handles prevents asm in\n     padlock and timing code.\n   * Fixed an off-by-one buffer allocation in ssl_set_hostname()\n     responsible for crashes and unwanted behaviour.\n   * Added support for Certificate Revocation List (CRL) parsing.\n   * Added support for CRL revocation to x509parse_verify() and\n     SSL/TLS code.\n   * Fixed compatibility of XTEA and Camellia on a 64-bit system\n     (found by Felix von Leitner).\n\n= Version 0.10.0 released on 2009-01-12\n   * Migrated XySSL to PolarSSL\n   * Added XTEA symmetric cipher\n   * Added Camellia symmetric cipher\n   * Added support for ciphersuites: SSL_RSA_CAMELLIA_128_SHA,\n     SSL_RSA_CAMELLIA_256_SHA and SSL_EDH_RSA_CAMELLIA_256_SHA\n   * Fixed dangerous bug that can cause a heap overflow in\n     rsa_pkcs1_decrypt (found by Christophe Devine)\n\n================================================================\nXySSL ChangeLog\n\n= Version 0.9 released on 2008-03-16\n\n    * Added support for ciphersuite: SSL_RSA_AES_128_SHA\n    * Enabled support for large files by default in aescrypt2.c\n    * Preliminary openssl wrapper contributed by David Barrett\n    * Fixed a bug in ssl_write() that caused the same payload to\n      be sent twice in non-blocking mode when send returns EAGAIN\n    * Fixed ssl_parse_client_hello(): session id and challenge must\n      not be swapped in the SSLv2 ClientHello (found by Greg Robson)\n    * Added user-defined callback debug function (Krystian Kolodziej)\n    * Before freeing a certificate, properly zero out all cert. data\n    * Fixed the \"mode\" parameter so that encryption/decryption are\n      not swapped on PadLock; also fixed compilation on older versions\n      of gcc (bug reported by David Barrett)\n    * Correctly handle the case in padlock_xcryptcbc() when input or\n      ouput data is non-aligned by falling back to the software\n      implementation, as VIA Nehemiah cannot handle non-aligned buffers\n    * Fixed a memory leak in x509parse_crt() which was reported by Greg\n      Robson-Garth; some x509write.c fixes by Pascal Vizeli, thanks to\n      Matthew Page who reported several bugs\n    * Fixed x509_get_ext() to accept some rare certificates which have\n      an INTEGER instead of a BOOLEAN for BasicConstraints::cA.\n    * Added support on the client side for the TLS \"hostname\" extension\n      (patch contributed by David Patino)\n    * Make x509parse_verify() return BADCERT_CN_MISMATCH when an empty\n      string is passed as the CN (bug reported by spoofy)\n    * Added an option to enable/disable the BN assembly code\n    * Updated rsa_check_privkey() to verify that (D*E) = 1 % (P-1)*(Q-1)\n    * Disabled obsolete hash functions by default (MD2, MD4); updated\n      selftest and benchmark to not test ciphers that have been disabled\n    * Updated x509parse_cert_info() to correctly display byte 0 of the\n      serial number, setup correct server port in the ssl client example\n    * Fixed a critical denial-of-service with X.509 cert. verification:\n      peer may cause xyssl to loop indefinitely by sending a certificate\n      for which the RSA signature check fails (bug reported by Benoit)\n    * Added test vectors for: AES-CBC, AES-CFB, DES-CBC and 3DES-CBC,\n      HMAC-MD5, HMAC-SHA1, HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512\n    * Fixed HMAC-SHA-384 and HMAC-SHA-512 (thanks to Josh Sinykin)\n    * Modified ssl_parse_client_key_exchange() to protect against\n      Daniel Bleichenbacher attack on PKCS#1 v1.5 padding, as well\n      as the Klima-Pokorny-Rosa extension of Bleichenbacher's attack\n    * Updated rsa_gen_key() so that ctx->N is always nbits in size\n    * Fixed assembly PPC compilation errors on Mac OS X, thanks to\n      David Barrett and Dusan Semen\n\n= Version 0.8 released on 2007-10-20\n\n    * Modified the HMAC functions to handle keys larger\n      than 64 bytes, thanks to Stephane Desneux and gary ng\n    * Fixed ssl_read_record() to properly update the handshake\n      message digests, which fixes IE6/IE7 client authentication\n    * Cleaned up the XYSSL* #defines, suggested by Azriel Fasten\n    * Fixed net_recv(), thanks to Lorenz Schori and Egon Kocjan\n    * Added user-defined callbacks for handling I/O and sessions\n    * Added lots of debugging output in the SSL/TLS functions\n    * Added preliminary X.509 cert. writing by Pascal Vizeli\n    * Added preliminary support for the VIA PadLock routines\n    * Added AES-CFB mode of operation, contributed by chmike\n    * Added an SSL/TLS stress testing program (ssl_test.c)\n    * Updated the RSA PKCS#1 code to allow choosing between\n      RSA_PUBLIC and RSA_PRIVATE, as suggested by David Barrett\n    * Updated ssl_read() to skip 0-length records from OpenSSL\n    * Fixed the make install target to comply with *BSD make\n    * Fixed a bug in mpi_read_binary() on 64-bit platforms\n    * mpi_is_prime() speedups, thanks to Kevin McLaughlin\n    * Fixed a long standing memory leak in mpi_is_prime()\n    * Replaced realloc with malloc in mpi_grow(), and set\n      the sign of zero as positive in mpi_init() (reported\n      by Jonathan M. McCune)\n\n= Version 0.7 released on 2007-07-07\n\n    * Added support for the MicroBlaze soft-core processor\n    * Fixed a bug in ssl_tls.c which sometimes prevented SSL\n      connections from being established with non-blocking I/O\n    * Fixed a couple bugs in the VS6 and UNIX Makefiles\n    * Fixed the \"PIC register ebx clobbered in asm\" bug\n    * Added HMAC starts/update/finish support functions\n    * Added the SHA-224, SHA-384 and SHA-512 hash functions\n    * Fixed the net_set_*block routines, thanks to Andreas\n    * Added a few demonstration programs: md5sum, sha1sum,\n      dh_client, dh_server, rsa_genkey, rsa_sign, rsa_verify\n    * Added new bignum import and export helper functions\n    * Rewrote README.txt in program/ssl/ca to better explain\n      how to create a test PKI\n\n= Version 0.6 released on 2007-04-01\n\n    * Ciphers used in SSL/TLS can now be disabled at compile\n      time, to reduce the memory footprint on embedded systems\n    * Added multiply assembly code for the TriCore and modified\n      havege_struct for this processor, thanks to David Patiño\n    * Added multiply assembly code for 64-bit PowerPCs,\n      thanks to Peking University and the OSU Open Source Lab\n    * Added experimental support of Quantum Cryptography\n    * Added support for autoconf, contributed by Arnaud Cornet\n    * Fixed \"long long\" compilation issues on IA-64 and PPC64\n    * Fixed a bug introduced in xyssl-0.5/timing.c: hardclock\n      was not being correctly defined on ARM and MIPS\n\n= Version 0.5 released on 2007-03-01\n\n    * Added multiply assembly code for SPARC and Alpha\n    * Added (beta) support for non-blocking I/O operations\n    * Implemented session resuming and client authentication\n    * Fixed some portability issues on WinCE, MINIX 3, Plan9\n      (thanks to Benjamin Newman), HP-UX, FreeBSD and Solaris\n    * Improved the performance of the EDH key exchange\n    * Fixed a bug that caused valid packets with a payload\n      size of 16384 bytes to be rejected\n\n= Version 0.4 released on 2007-02-01\n\n    * Added support for Ephemeral Diffie-Hellman key exchange\n    * Added multiply asm code for SSE2, ARM, PPC, MIPS and M68K\n    * Various improvement to the modular exponentiation code\n    * Rewrote the headers to generate the API docs with doxygen\n    * Fixed a bug in ssl_encrypt_buf (incorrect padding was\n      generated) and in ssl_parse_client_hello (max. client\n      version was not properly set), thanks to Didier Rebeix\n    * Fixed another bug in ssl_parse_client_hello: clients with\n      cipherlists larger than 96 bytes were incorrectly rejected\n    * Fixed a couple memory leak in x509_read.c\n\n= Version 0.3 released on 2007-01-01\n\n    * Added server-side SSLv3 and TLSv1.0 support\n    * Multiple fixes to enhance the compatibility with g++,\n      thanks to Xosé Antón Otero Ferreira\n    * Fixed a bug in the CBC code, thanks to dowst; also,\n      the bignum code is no longer dependent on long long\n    * Updated rsa_pkcs1_sign to handle arbitrary large inputs\n    * Updated timing.c for improved compatibility with i386\n      and 486 processors, thanks to Arnaud Cornet\n\n= Version 0.2 released on 2006-12-01\n\n    * Updated timing.c to support ARM and MIPS arch\n    * Updated the MPI code to support 8086 on MSVC 1.5\n    * Added the copyright notice at the top of havege.h\n    * Fixed a bug in sha2_hmac, thanks to newsoft/Wenfang Zhang\n    * Fixed a bug reported by Adrian Rüegsegger in x509_read_key\n    * Fixed a bug reported by Torsten Lauter in ssl_read_record\n    * Fixed a bug in rsa_check_privkey that would wrongly cause\n      valid RSA keys to be dismissed (thanks to oldwolf)\n    * Fixed a bug in mpi_is_prime that caused some primes to fail\n      the Miller-Rabin primality test\n\n    I'd also like to thank Younès Hafri for the CRUX linux port,\n    Khalil Petit who added XySSL into pkgsrc and Arnaud Cornet\n    who maintains the Debian package :-)\n\n= Version 0.1 released on 2006-11-01\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/DartConfiguration.tcl",
    "content": "Site: localhost\nBuildName: mbed TLS-test\nCoverageCommand: /usr/bin/gcov\nMemoryCheckCommand: /usr/bin/valgrind\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/LICENSE",
    "content": "Unless specifically indicated otherwise in a file, files are licensed\nunder the Apache 2.0 license, as can be found in: apache-2.0.txt\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/Makefile",
    "content": "\nDESTDIR=/usr/local\nPREFIX=mbedtls_\n\n.SILENT:\n\n.PHONY: all no_test programs lib tests install uninstall clean test check covtest lcov apidoc apidoc_clean\n\nall: programs tests\n\t$(MAKE) post_build\n\nno_test: programs\n\nprograms: lib\n\t$(MAKE) -C programs\n\nlib:\n\t$(MAKE) -C library\n\ntests: lib\n\t$(MAKE) -C tests\n\nifndef WINDOWS\ninstall: no_test\n\tmkdir -p $(DESTDIR)/include/mbedtls\n\tcp -r include/mbedtls $(DESTDIR)/include\n\t\n\tmkdir -p $(DESTDIR)/lib\n\tcp -RP library/libmbedtls.*    $(DESTDIR)/lib\n\tcp -RP library/libmbedx509.*   $(DESTDIR)/lib\n\tcp -RP library/libmbedcrypto.* $(DESTDIR)/lib\n\t\n\tmkdir -p $(DESTDIR)/bin\n\tfor p in programs/*/* ; do              \\\n\t    if [ -x $$p ] && [ ! -d $$p ] ;     \\\n\t    then                                \\\n\t        f=$(PREFIX)`basename $$p` ;     \\\n\t        cp $$p $(DESTDIR)/bin/$$f ;     \\\n\t    fi                                  \\\n\tdone\n\nuninstall:\n\trm -rf $(DESTDIR)/include/mbedtls\n\trm -f $(DESTDIR)/lib/libmbedtls.*\n\trm -f $(DESTDIR)/lib/libmbedx509.*\n\trm -f $(DESTDIR)/lib/libmbedcrypto.*\n\t\n\tfor p in programs/*/* ; do              \\\n\t    if [ -x $$p ] && [ ! -d $$p ] ;     \\\n\t    then                                \\\n\t        f=$(PREFIX)`basename $$p` ;     \\\n\t        rm -f $(DESTDIR)/bin/$$f ;      \\\n\t    fi                                  \\\n\tdone\nendif\n\nWARNING_BORDER      =*******************************************************\\n\nNULL_ENTROPY_WARN_L1=****  WARNING!  MBEDTLS_TEST_NULL_ENTROPY defined! ****\\n\nNULL_ENTROPY_WARN_L2=****  THIS BUILD HAS NO DEFINED ENTROPY SOURCES    ****\\n\nNULL_ENTROPY_WARN_L3=****  AND IS *NOT* SUITABLE FOR PRODUCTION USE     ****\\n\n\nNULL_ENTROPY_WARNING=\\n$(WARNING_BORDER)$(NULL_ENTROPY_WARN_L1)$(NULL_ENTROPY_WARN_L2)$(NULL_ENTROPY_WARN_L3)$(WARNING_BORDER)\n\n# Post build steps\npost_build:\nifndef WINDOWS\n\t# If NULL Entropy is configured, display an appropriate warning\n\t-scripts/config.pl get MBEDTLS_TEST_NULL_ENTROPY && ([ $$? -eq 0 ]) && \\\n\t    echo '$(NULL_ENTROPY_WARNING)'\nendif\n\nclean:\n\t$(MAKE) -C library clean\n\t$(MAKE) -C programs clean\n\t$(MAKE) -C tests clean\nifndef WINDOWS\n\tfind . \\( -name \\*.gcno -o -name \\*.gcda -o -name \\*.info \\) -exec rm {} +\nendif\n\ncheck: lib tests\n\t$(MAKE) -C tests check\n\ntest: check\n\nifndef WINDOWS\n# note: for coverage testing, build with:\n# make CFLAGS='--coverage -g3 -O0'\ncovtest:\n\t$(MAKE) check\n\tprograms/test/selftest\n\ttests/compat.sh\n\ttests/ssl-opt.sh\n\nlcov:\n\trm -rf Coverage\n\tlcov --capture --initial --directory library -o files.info\n\tlcov --capture --directory library -o tests.info\n\tlcov --add-tracefile files.info --add-tracefile tests.info -o all.info\n\tlcov --remove all.info -o final.info '*.h'\n\tgendesc tests/Descriptions.txt -o descriptions\n\tgenhtml --title \"mbed TLS\" --description-file descriptions --keep-descriptions --legend --no-branch-coverage -o Coverage final.info\n\trm -f files.info tests.info all.info final.info descriptions\n\napidoc:\n\tmkdir -p apidoc\n\tdoxygen doxygen/mbedtls.doxyfile\n\napidoc_clean:\n\trm -rf apidoc\nendif\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/README.md",
    "content": "README for mbed TLS\n===================\n\nConfiguration\n-------------\n\nmbed TLS should build out of the box on most systems. Some platform specific options are available in the fully documented configuration file `include/mbedtls/config.h`, which is also the place where features can be selected. This file can be edited manually, or in a more programmatic way using the Perl script `scripts/config.pl` (use `--help` for usage instructions).\n\nCompiler options can be set using conventional environment variables such as `CC` and `CFLAGS` when using the Make and CMake build system (see below).\n\nCompiling\n---------\n\nThere are currently four active build systems used within mbed TLS releases:\n\n-   yotta\n-   Make\n-   CMake\n-   Microsoft Visual Studio (Visual Studio 6 and Visual Studio 2010)\n\nThe main systems used for development are CMake and Make. Those systems are always complete and up-to-date. The others should reflect all changes present in the CMake and Make build system, although features may not be ported there automatically.\n\nYotta, as a build system, is slightly different from the other build systems:\n\n-   it provides a minimalistic configuration file by default\n-   depending on the yotta target, features of mbed OS may be used in examples and tests\n\nThe Make and CMake build systems create three libraries: libmbedcrypto, libmbedx509, and libmbedtls. Note that libmbedtls depends on libmbedx509 and libmbedcrypto, and libmbedx509 depends on libmbedcrypto. As a result, some linkers will expect flags to be in a specific order, for example the GNU linker wants `-lmbedtls -lmbedx509 -lmbedcrypto`. Also, when loading shared libraries using dlopen(), you'll need to load libmbedcrypto first, then libmbedx509, before you can load libmbedtls.\n\n### Yotta\n\n[yotta](http://yottabuild.org) is a package manager and build system developed by mbed, and is the build system of mbed OS 16.03. To install it on your platform, please follow the yotta [installation instructions](http://docs.yottabuild.org/#installing).\n\nOnce yotta is installed, you can use it to download the latest version of mbed TLS from the yotta registry with:\n\n    yotta install mbedtls\n\nand build it with:\n\n    yotta build\n\nIf, on the other hand, you already have a copy of mbed TLS from a source other than the yotta registry, for example from cloning our GitHub repository, or from downloading a tarball of the standalone edition, then you'll first need to generate the yotta module by running:\n\n    yotta/create-module.sh\n\nThis should be executed from the root mbed TLS project directory. This will create the yotta module in the `yotta/module` directory within it. You can then change to that directory and build as usual:\n\n    cd yotta/module\n    yotta build\n\nIn any case, you'll probably want to set the yotta target before building unless it has already been set globally. For more information on using yotta, please consult the [yotta documentation](http://docs.yottabuild.org/).\n\nFor more details on the yotta/mbed OS edition of mbed TLS, including example programs, please consult the [Readme at the root of the yotta module](https://github.com/ARMmbed/mbedtls/blob/development/yotta/data/README.md).\n\n### Make\n\nWe intentionally only use the minimum of `Make` functionality, as a lot of `Make` features are not supported on all different implementations of Make or on different platforms. As such, the Makefiles sometimes require some manual changes or export statements in order to work for your platform.\n\nIn order to build from the source code using Make, just enter at the command line:\n\n    make\n\nIn order to run the tests, enter:\n\n    make check\n\nThe tests need Perl to be built and run. If you don't have Perl installed, you can skip building the tests with:\n\n    make no_test\n\nYou'll still be able to run a much smaller set of tests with:\n\n    programs/test/selftest\n\nIn order to build for a Windows platform, you should use `WINDOWS_BUILD=1` if the target is Windows but the build environment is Unix-like (for instance when cross-compiling, or compiling from an MSYS shell), and `WINDOWS=1` if the build environment is a Windows shell (for instance using mingw32-make) (in that case some targets will not be available).\n\nSetting the variable `SHARED` in your environment will build shared libraries in addition to the static libraries. Setting `DEBUG` gives you a debug build. You can override `CFLAGS` and `LDFLAGS` by setting them in your environment or on the make command line; if you do so, essential parts such as `-I` will still be preserved. Warning options may be overridden separately using `WARNING_CFLAGS`.\n\nDepending on your platform, you might run into some issues. Please check the Makefiles in `library/`, `programs/` and `tests/` for options to manually add or remove for specific platforms. You can also check [the mbed TLS Knowledge Base](https://tls.mbed.org/kb) for articles on your platform or issue.\n\nIn case you find that you need to do something else as well, please let us know what, so we can add it to the [mbed TLS knowledge base](https://tls.mbed.org/kb).\n\n### CMake\n\nIn order to build the source using CMake, just enter at the command line:\n\n    cmake .\n    make\n\nIn order to run the tests, enter:\n\n    make test\n\nThe test suites need Perl to be built. If you don't have Perl installed, you'll want to disable the test suites with:\n\n    cmake -DENABLE_TESTING=Off .\n\nIf you disabled the test suites, but kept the programs enabled, you can still run a much smaller set of tests with:\n\n    programs/test/selftest\n\nTo configure CMake for building shared libraries, use:\n\n    cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On .\n\nThere are many different build modes available within the CMake buildsystem. Most of them are available for gcc and clang, though some are compiler-specific:\n\n-   Release. This generates the default code without any unnecessary information in the binary files.\n-   Debug. This generates debug information and disables optimization of the code.\n-   Coverage. This generates code coverage information in addition to debug information.\n-   ASan. This instruments the code with AddressSanitizer to check for memory errors. (This includes LeakSanitizer, with recent version of gcc and clang.) (With recent version of clang, this mode also instruments the code with UndefinedSanitizer to check for undefined behaviour.)\n-   ASanDbg. Same as ASan but slower, with debug information and better stack traces.\n-   MemSan. This instruments the code with MemorySanitizer to check for uninitialised memory reads. Experimental, needs recent clang on Linux/x86\\_64.\n-   MemSanDbg. Same as MemSan but slower, with debug information, better stack traces and origin tracking.\n-   Check. This activates the compiler warnings that depend on optimization and treats all warnings as errors.\n\nSwitching build modes in CMake is simple. For debug mode, enter at the command line:\n\n    cmake -D CMAKE_BUILD_TYPE=Debug .\n\nTo list other available CMake options, use:\n\n    cmake -LH\n\nNote that, with CMake, if you want to change the compiler or its options after you already ran CMake, you need to clear its cache first, e.g. (using GNU find):\n\n    find . -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} +\n    CC=gcc CFLAGS='-fstack-protector-strong -Wa,--noexecstack' cmake .\n\n### Microsoft Visual Studio\n\nThe build files for Microsoft Visual Studio are generated for Visual Studio 2010.\n\nThe solution file `mbedTLS.sln` contains all the basic projects needed to build the library and all the programs. The files in tests are not generated and compiled, as these need a perl environment as well. However, the selftest program in `programs/test/` is still available.\n\nExample programs\n----------------\n\nWe've included example programs for a lot of different features and uses in `programs/`. Most programs only focus on a single feature or usage scenario, so keep that in mind when copying parts of the code.\n\nTests\n-----\n\nmbed TLS includes an elaborate test suite in `tests/` that initially requires Perl to generate the tests files (e.g. `test\\_suite\\_mpi.c`). These files are generated from a `function file` (e.g. `suites/test\\_suite\\_mpi.function`) and a `data file` (e.g. `suites/test\\_suite\\_mpi.data`). The `function file` contains the test functions. The `data file` contains the test cases, specified as parameters that will be passed to the test function.\n\nFor machines with a Unix shell and OpenSSL (and optionally GnuTLS) installed, additional test scripts are available:\n\n-   `tests/ssl-opt.sh` runs integration tests for various TLS options (renegotiation, resumption, etc.) and tests interoperability of these options with other implementations.\n-   `tests/compat.sh` tests interoperability of every ciphersuite with other implementations.\n-   `tests/scripts/test-ref-configs.pl` test builds in various reduced configurations.\n-   `tests/scripts/key-exchanges.pl` test builds in configurations with a single key exchange enabled\n-   `tests/scripts/all.sh` runs a combination of the above tests, plus some more, with various build options (such as ASan, full `config.h`, etc).\n\nConfigurations\n--------------\n\nWe provide some non-standard configurations focused on specific use cases in the `configs/` directory. You can read more about those in `configs/README.txt`\n\nPorting mbed TLS\n----------------\n\nmbed TLS can be ported to many different architectures, OS's and platforms. Before starting a port, you may find the following knowledge base articles useful:\n\n-   [Porting mbed TLS to a new environment or OS](https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS)\n-   [What external dependencies does mbed TLS rely on?](https://tls.mbed.org/kb/development/what-external-dependencies-does-mbedtls-rely-on)\n-   [How do I configure mbed TLS](https://tls.mbed.org/kb/compiling-and-building/how-do-i-configure-mbedtls)\n\nContributing\n------------\n\nWe gratefully accept bug reports and contributions from the community. There are some requirements we need to fulfill in order to be able to integrate contributions:\n\n-   All contributions, whether large or small require a Contributor's License Agreement (CLA) to be accepted. This is because source code can possibly fall under copyright law and we need your consent to share in the ownership of the copyright.\n-   We would ask that contributions conform to [our coding standards](https://tls.mbed.org/kb/development/mbedtls-coding-standards), and that contributions should be fully tested before submission.\n-   As with any open source project, contributions will be reviewed by the project team and community and may need some modifications to be accepted.\n\nTo accept the Contributor’s Licence Agreement (CLA), individual contributors can do this by creating an mbed account and [accepting the online agreement here with a click through](https://developer.mbed.org/contributor_agreement/). Alternatively, for contributions from corporations, or those that do not wish to create an mbed account, a slightly different agreement can be found [here](https://www.mbed.com/en/about-mbed/contributor-license-agreements/). This agreement should be signed and returned to ARM as described in the instructions given.\n\n### Making a Contribution\n\n1.  [Check for open issues](https://github.com/ARMmbed/mbedtls/issues) or [start a discussion](https://tls.mbed.org/discussions) around a feature idea or a bug.\n2.  Fork the [mbed TLS repository on GitHub](https://github.com/ARMmbed/mbedtls) to start making your changes. As a general rule, you should use the \"development\" branch as a basis.\n3.  Write a test which shows that the bug was fixed or that the feature works as expected.\n4.  Send a pull request and bug us until it gets merged and published. Contributions may need some modifications, so work with us to get your change accepted. We will include your name in the ChangeLog :)\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/apache-2.0.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/circle.yml",
    "content": "# Purpose:\n# - To test and prove that a new commit in  the mbed TLS repository builds\n# and integrates with mbed-os properly.\n#           AND\n# - To test and prove that the current development head of mbed TLS builds\n# and integrates with the current mbed-os master branch.\n#\n# The script fetches all the prerequisites and builds the mbed TLS 'tls-client'\n# example. This script is triggered by every commit and once each night and the\n# exact behaviour depends on how it was triggered:\n# - If it is a nightly build then it builds the mbed TLS development head with\n#   mbed-os master.\n# - If it was triggered by the commit, then it builds the example with mbed TLS\n#   at that commit and mbed-os at the commit pointed by mbed-os.lib in the\n#   example repository.\n\ntest:\n    override:\n        - cd ../mbed-os-example-tls/tls-client/ && mbed compile -m K64F -t GCC_ARM -c\n\ndependencies:\n    pre:\n        # Install gcc-arm\n        - cd .. && wget \"https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update/+download/gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2\"\n        - cd .. && tar -xvjf gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2\n        - ln -s ../gcc-arm-none-eabi-4_9-2015q3/bin/* ../bin/\n        # Install mbed-cli\n        - cd ../ && git clone https://github.com/ARMmbed/mbed-cli.git\n        - cd ../mbed-cli && sudo -H pip install -e .\n        # Get the sample application\n        - cd ../ && git clone git@github.com:ARMmbed/mbed-os-example-tls.git\n        # Get mbed-os\n        - cd ../mbed-os-example-tls/tls-client && mbed deploy\n        # Update mbed-os to master only if it is a nightly build\n        - >\n            if [ -n \"${RUN_NIGHTLY_BUILD}\" ]; then\n                cd ../mbed-os-example-tls/tls-client/mbed-os/ && mbed update master;\n            fi\n        # Import mbedtls current revision\n        - ln -s ../../../../../../../mbedtls/ ../mbed-os-example-tls/tls-client/mbed-os/features/mbedtls/importer/TARGET_IGNORE/mbedtls\n        - cd ../mbed-os-example-tls/tls-client/mbed-os/features/mbedtls/importer/ && make\n    override:\n        # Install the missing python packages\n        - cd ../mbed-os-example-tls/tls-client/mbed-os/ && sudo -H pip install -r requirements.txt\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/configs/README.txt",
    "content": "This directory contains example configuration files.\n\nThe examples are generally focused on a particular usage case (eg, support for\na restricted number of ciphersuites) and aim at minimizing resource usage for\nthis target. They can be used as a basis for custom configurations.\n\nThese files are complete replacements for the default config.h. To use one of\nthem, you can pick one of the following methods:\n\n1. Replace the default file include/mbedtls/config.h with the chosen one.\n   (Depending on your compiler, you may need to ajust the line with\n   #include \"mbedtls/check_config.h\" then.)\n\n2. Define MBEDTLS_CONFIG_FILE and adjust the include path accordingly.\n   For example, using make:\n\n    CFLAGS=\"-I$PWD/configs -DMBEDTLS_CONFIG_FILE='<foo.h>'\" make\n\n   Or, using cmake:\n\n    find . -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} +\n    CFLAGS=\"-I$PWD/configs -DMBEDTLS_CONFIG_FILE='<foo.h>'\" cmake .\n    make\n\nNote that the second method also works if you want to keep your custom\nconfiguration file outside the mbed TLS tree.\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/configs/config-ccm-psk-tls1_2.h",
    "content": "/*\n *  Minimal configuration for TLS 1.2 with PSK and AES-CCM ciphersuites\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * Minimal configuration for TLS 1.2 with PSK and AES-CCM ciphersuites\n * Distinguishing features:\n * - no bignum, no PK, no X509\n * - fully modern and secure (provided the pre-shared keys have high entropy)\n * - very low record overhead with CCM-8\n * - optimized for low RAM usage\n *\n * See README.txt for usage instructions.\n */\n#ifndef MBEDTLS_CONFIG_H\n#define MBEDTLS_CONFIG_H\n\n/* System support */\n//#define MBEDTLS_HAVE_TIME /* Optionally used in Hello messages */\n/* Other MBEDTLS_HAVE_XXX flags irrelevant for this configuration */\n\n/* mbed TLS feature support */\n#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED\n#define MBEDTLS_SSL_PROTO_TLS1_2\n\n/* mbed TLS modules */\n#define MBEDTLS_AES_C\n#define MBEDTLS_CCM_C\n#define MBEDTLS_CIPHER_C\n#define MBEDTLS_CTR_DRBG_C\n#define MBEDTLS_ENTROPY_C\n#define MBEDTLS_MD_C\n#define MBEDTLS_NET_C\n#define MBEDTLS_SHA256_C\n#define MBEDTLS_SSL_CLI_C\n#define MBEDTLS_SSL_SRV_C\n#define MBEDTLS_SSL_TLS_C\n\n/* Save RAM at the expense of ROM */\n#define MBEDTLS_AES_ROM_TABLES\n\n/* Save some RAM by adjusting to your exact needs */\n#define MBEDTLS_PSK_MAX_LEN    16 /* 128-bits keys are generally enough */\n\n/*\n * You should adjust this to the exact number of sources you're using: default\n * is the \"platform_entropy_poll\" source, but you may want to add other ones\n * Minimum is 2 for the entropy test suite.\n */\n#define MBEDTLS_ENTROPY_MAX_SOURCES 2\n\n/*\n * Use only CCM_8 ciphersuites, and\n * save ROM and a few bytes of RAM by specifying our own ciphersuite list\n */\n#define MBEDTLS_SSL_CIPHERSUITES                        \\\n        MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8,             \\\n        MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8\n\n/*\n * Save RAM at the expense of interoperability: do this only if you control\n * both ends of the connection!  (See comments in \"mbedtls/ssl.h\".)\n * The optimal size here depends on the typical size of records.\n */\n#define MBEDTLS_SSL_MAX_CONTENT_LEN             512\n\n#include \"mbedtls/check_config.h\"\n\n#endif /* MBEDTLS_CONFIG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/configs/config-mini-tls1_1.h",
    "content": "/*\n *  Minimal configuration for TLS 1.1 (RFC 4346)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * Minimal configuration for TLS 1.1 (RFC 4346), implementing only the\n * required ciphersuite: MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA\n *\n * See README.txt for usage instructions.\n */\n\n#ifndef MBEDTLS_CONFIG_H\n#define MBEDTLS_CONFIG_H\n\n/* System support */\n#define MBEDTLS_HAVE_ASM\n#define MBEDTLS_HAVE_TIME\n\n/* mbed TLS feature support */\n#define MBEDTLS_CIPHER_MODE_CBC\n#define MBEDTLS_PKCS1_V15\n#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED\n#define MBEDTLS_SSL_PROTO_TLS1_1\n\n/* mbed TLS modules */\n#define MBEDTLS_AES_C\n#define MBEDTLS_ASN1_PARSE_C\n#define MBEDTLS_ASN1_WRITE_C\n#define MBEDTLS_BIGNUM_C\n#define MBEDTLS_CIPHER_C\n#define MBEDTLS_CTR_DRBG_C\n#define MBEDTLS_DES_C\n#define MBEDTLS_ENTROPY_C\n#define MBEDTLS_MD_C\n#define MBEDTLS_MD5_C\n#define MBEDTLS_NET_C\n#define MBEDTLS_OID_C\n#define MBEDTLS_PK_C\n#define MBEDTLS_PK_PARSE_C\n#define MBEDTLS_RSA_C\n#define MBEDTLS_SHA1_C\n#define MBEDTLS_SHA256_C\n#define MBEDTLS_SSL_CLI_C\n#define MBEDTLS_SSL_SRV_C\n#define MBEDTLS_SSL_TLS_C\n#define MBEDTLS_X509_CRT_PARSE_C\n#define MBEDTLS_X509_USE_C\n\n/* For test certificates */\n#define MBEDTLS_BASE64_C\n#define MBEDTLS_CERTS_C\n#define MBEDTLS_PEM_PARSE_C\n\n/* For testing with compat.sh */\n#define MBEDTLS_FS_IO\n\n#include \"mbedtls/check_config.h\"\n\n#endif /* MBEDTLS_CONFIG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/configs/config-no-entropy.h",
    "content": "/**\n *  Minimal configuration of features that do not require an entropy source\n *\n *  Copyright (C) 2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * Minimal configuration of features that do not require an entropy source\n * Distinguishing reatures:\n * - no entropy module\n * - no TLS protocol implementation available due to absence of an entropy\n *   source\n *\n * See README.txt for usage instructions.\n */\n\n#ifndef MBEDTLS_CONFIG_H\n#define MBEDTLS_CONFIG_H\n\n/* System support */\n#define MBEDTLS_HAVE_ASM\n#define MBEDTLS_HAVE_TIME\n\n/* mbed TLS feature support */\n#define MBEDTLS_CIPHER_MODE_CBC\n#define MBEDTLS_CIPHER_PADDING_PKCS7\n#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES\n#define MBEDTLS_ECP_DP_SECP256R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP384R1_ENABLED\n#define MBEDTLS_ECP_DP_CURVE25519_ENABLED\n#define MBEDTLS_ECP_NIST_OPTIM\n#define MBEDTLS_ECDSA_DETERMINISTIC\n#define MBEDTLS_PK_RSA_ALT_SUPPORT\n#define MBEDTLS_PKCS1_V15\n#define MBEDTLS_PKCS1_V21\n#define MBEDTLS_SELF_TEST\n#define MBEDTLS_VERSION_FEATURES\n#define MBEDTLS_X509_CHECK_KEY_USAGE\n#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE\n\n/* mbed TLS modules */\n#define MBEDTLS_AES_C\n#define MBEDTLS_ASN1_PARSE_C\n#define MBEDTLS_ASN1_WRITE_C\n#define MBEDTLS_BASE64_C\n#define MBEDTLS_BIGNUM_C\n#define MBEDTLS_CCM_C\n#define MBEDTLS_CIPHER_C\n#define MBEDTLS_ECDSA_C\n#define MBEDTLS_ECP_C\n#define MBEDTLS_ERROR_C\n#define MBEDTLS_GCM_C\n#define MBEDTLS_HMAC_DRBG_C\n#define MBEDTLS_MD_C\n#define MBEDTLS_OID_C\n#define MBEDTLS_PEM_PARSE_C\n#define MBEDTLS_PK_C\n#define MBEDTLS_PK_PARSE_C\n#define MBEDTLS_PK_WRITE_C\n#define MBEDTLS_PLATFORM_C\n#define MBEDTLS_RSA_C\n#define MBEDTLS_SHA256_C\n#define MBEDTLS_SHA512_C\n#define MBEDTLS_VERSION_C\n#define MBEDTLS_X509_USE_C\n#define MBEDTLS_X509_CRT_PARSE_C\n#define MBEDTLS_X509_CRL_PARSE_C\n\n/* Miscellaneous options */\n#define MBEDTLS_AES_ROM_TABLES\n\n#include \"check_config.h\"\n\n#endif /* MBEDTLS_CONFIG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/configs/config-picocoin.h",
    "content": "/*\n *  Reduced configuration used by Picocoin.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * Reduced configuration used by Picocoin.\n *\n * See README.txt for usage instructions.\n *\n * Distinguishing features:\n * - no SSL/TLS;\n * - no X.509;\n * - ECDSA/PK and some other chosen crypto bits.\n */\n\n#ifndef MBEDTLS_CONFIG_H\n#define MBEDTLS_CONFIG_H\n\n/* System support */\n#define MBEDTLS_HAVE_ASM\n#define MBEDTLS_HAVE_TIME\n\n/* mbed TLS feature support */\n#define MBEDTLS_CIPHER_MODE_CBC\n#define MBEDTLS_CIPHER_PADDING_PKCS7\n#define MBEDTLS_ECP_DP_SECP256K1_ENABLED\n#define MBEDTLS_ECDSA_DETERMINISTIC\n#define MBEDTLS_PK_PARSE_EC_EXTENDED\n#define MBEDTLS_ERROR_STRERROR_DUMMY\n#define MBEDTLS_FS_IO\n\n/* mbed TLS modules */\n#define MBEDTLS_AESNI_C\n#define MBEDTLS_AES_C\n#define MBEDTLS_ASN1_PARSE_C\n#define MBEDTLS_ASN1_WRITE_C\n#define MBEDTLS_BASE64_C\n#define MBEDTLS_BIGNUM_C\n#define MBEDTLS_ECDSA_C\n#define MBEDTLS_ECP_C\n#define MBEDTLS_ENTROPY_C\n#define MBEDTLS_HMAC_DRBG_C\n#define MBEDTLS_MD_C\n#define MBEDTLS_OID_C\n#define MBEDTLS_PADLOCK_C\n#define MBEDTLS_PK_C\n#define MBEDTLS_PK_PARSE_C\n#define MBEDTLS_PK_WRITE_C\n#define MBEDTLS_RIPEMD160_C\n#define MBEDTLS_SHA1_C\n#define MBEDTLS_SHA256_C\n\n#include \"mbedtls/check_config.h\"\n\n#endif /* MBEDTLS_CONFIG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/configs/config-suite-b.h",
    "content": "/*\n *  Minimal configuration for TLS NSA Suite B Profile (RFC 6460)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * Minimal configuration for TLS NSA Suite B Profile (RFC 6460)\n *\n * Distinguishing features:\n * - no RSA or classic DH, fully based on ECC\n * - optimized for low RAM usage\n *\n * Possible improvements:\n * - if 128-bit security is enough, disable secp384r1 and SHA-512\n * - use embedded certs in DER format and disable PEM_PARSE_C and BASE64_C\n *\n * See README.txt for usage instructions.\n */\n\n#ifndef MBEDTLS_CONFIG_H\n#define MBEDTLS_CONFIG_H\n\n/* System support */\n#define MBEDTLS_HAVE_ASM\n#define MBEDTLS_HAVE_TIME\n\n/* mbed TLS feature support */\n#define MBEDTLS_ECP_DP_SECP256R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP384R1_ENABLED\n#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED\n#define MBEDTLS_SSL_PROTO_TLS1_2\n\n/* mbed TLS modules */\n#define MBEDTLS_AES_C\n#define MBEDTLS_ASN1_PARSE_C\n#define MBEDTLS_ASN1_WRITE_C\n#define MBEDTLS_BIGNUM_C\n#define MBEDTLS_CIPHER_C\n#define MBEDTLS_CTR_DRBG_C\n#define MBEDTLS_ECDH_C\n#define MBEDTLS_ECDSA_C\n#define MBEDTLS_ECP_C\n#define MBEDTLS_ENTROPY_C\n#define MBEDTLS_GCM_C\n#define MBEDTLS_MD_C\n#define MBEDTLS_NET_C\n#define MBEDTLS_OID_C\n#define MBEDTLS_PK_C\n#define MBEDTLS_PK_PARSE_C\n#define MBEDTLS_SHA256_C\n#define MBEDTLS_SHA512_C\n#define MBEDTLS_SSL_CLI_C\n#define MBEDTLS_SSL_SRV_C\n#define MBEDTLS_SSL_TLS_C\n#define MBEDTLS_X509_CRT_PARSE_C\n#define MBEDTLS_X509_USE_C\n\n/* For test certificates */\n#define MBEDTLS_BASE64_C\n#define MBEDTLS_CERTS_C\n#define MBEDTLS_PEM_PARSE_C\n\n/* Save RAM at the expense of ROM */\n#define MBEDTLS_AES_ROM_TABLES\n\n/* Save RAM by adjusting to our exact needs */\n#define MBEDTLS_ECP_MAX_BITS   384\n#define MBEDTLS_MPI_MAX_SIZE    48 // 384 bits is 48 bytes\n\n/* Save RAM at the expense of speed, see ecp.h */\n#define MBEDTLS_ECP_WINDOW_SIZE        2\n#define MBEDTLS_ECP_FIXED_POINT_OPTIM  0\n\n/* Significant speed benefit at the expense of some ROM */\n#define MBEDTLS_ECP_NIST_OPTIM\n\n/*\n * You should adjust this to the exact number of sources you're using: default\n * is the \"mbedtls_platform_entropy_poll\" source, but you may want to add other ones.\n * Minimum is 2 for the entropy test suite.\n */\n#define MBEDTLS_ENTROPY_MAX_SOURCES 2\n\n/* Save ROM and a few bytes of RAM by specifying our own ciphersuite list */\n#define MBEDTLS_SSL_CIPHERSUITES                        \\\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,    \\\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\n\n/*\n * Save RAM at the expense of interoperability: do this only if you control\n * both ends of the connection!  (See coments in \"mbedtls/ssl.h\".)\n * The minimum size here depends on the certificate chain used as well as the\n * typical size of records.\n */\n#define MBEDTLS_SSL_MAX_CONTENT_LEN             1024\n\n#include \"mbedtls/check_config.h\"\n\n#endif /* MBEDTLS_CONFIG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/configs/config-thread.h",
    "content": "/*\n *  Minimal configuration for using TLS as part of Thread\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * Minimal configuration for using TLS a part of Thread\n * http://threadgroup.org/\n *\n * Distinguishing features:\n * - no RSA or classic DH, fully based on ECC\n * - no X.509\n * - support for experimental EC J-PAKE key exchange\n *\n * See README.txt for usage instructions.\n */\n\n#ifndef MBEDTLS_CONFIG_H\n#define MBEDTLS_CONFIG_H\n\n/* System support */\n#define MBEDTLS_HAVE_ASM\n\n/* mbed TLS feature support */\n#define MBEDTLS_AES_ROM_TABLES\n#define MBEDTLS_ECP_DP_SECP256R1_ENABLED\n#define MBEDTLS_ECP_NIST_OPTIM\n#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED\n#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH\n#define MBEDTLS_SSL_PROTO_TLS1_2\n#define MBEDTLS_SSL_PROTO_DTLS\n#define MBEDTLS_SSL_DTLS_ANTI_REPLAY\n#define MBEDTLS_SSL_DTLS_HELLO_VERIFY\n#define MBEDTLS_SSL_EXPORT_KEYS\n\n/* mbed TLS modules */\n#define MBEDTLS_AES_C\n#define MBEDTLS_ASN1_PARSE_C\n#define MBEDTLS_ASN1_WRITE_C\n#define MBEDTLS_BIGNUM_C\n#define MBEDTLS_CCM_C\n#define MBEDTLS_CIPHER_C\n#define MBEDTLS_CTR_DRBG_C\n#define MBEDTLS_CMAC_C\n#define MBEDTLS_ECJPAKE_C\n#define MBEDTLS_ECP_C\n#define MBEDTLS_ENTROPY_C\n#define MBEDTLS_HMAC_DRBG_C\n#define MBEDTLS_MD_C\n#define MBEDTLS_OID_C\n#define MBEDTLS_PK_C\n#define MBEDTLS_PK_PARSE_C\n#define MBEDTLS_SHA256_C\n#define MBEDTLS_SSL_COOKIE_C\n#define MBEDTLS_SSL_CLI_C\n#define MBEDTLS_SSL_SRV_C\n#define MBEDTLS_SSL_TLS_C\n\n/* For tests using ssl-opt.sh */\n#define MBEDTLS_NET_C\n#define MBEDTLS_TIMING_C\n\n/* Save RAM at the expense of ROM */\n#define MBEDTLS_AES_ROM_TABLES\n\n/* Save RAM by adjusting to our exact needs */\n#define MBEDTLS_ECP_MAX_BITS             256\n#define MBEDTLS_MPI_MAX_SIZE              32 // 256 bits is 32 bytes\n\n/* Save ROM and a few bytes of RAM by specifying our own ciphersuite list */\n#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8\n\n#include \"mbedtls/check_config.h\"\n\n#endif /* MBEDTLS_CONFIG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/doxygen/input/doc_encdec.h",
    "content": "/**\n * @file\n * Encryption/decryption module documentation file.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/**\n * @addtogroup encdec_module Encryption/decryption module\n *\n * The Encryption/decryption module provides encryption/decryption functions.\n * One can differentiate between symmetric and asymmetric algorithms; the\n * symmetric ones are mostly used for message confidentiality and the asymmetric\n * ones for key exchange and message integrity.\n * Some symmetric algorithms provide different block cipher modes, mainly\n * Electronic Code Book (ECB) which is used for short (64-bit) messages and\n * Cipher Block Chaining (CBC) which provides the structure needed for longer\n * messages. In addition the Cipher Feedback Mode (CFB-128) stream cipher mode,\n * Counter mode (CTR) and Galois Counter Mode (GCM) are implemented for\n * specific algorithms.\n *\n * All symmetric encryption algorithms are accessible via the generic cipher layer\n * (see \\c mbedtls_cipher_setup()).\n *\n * The asymmetric encryptrion algorithms are accessible via the generic public\n * key layer (see \\c mbedtls_pk_init()).\n *\n * The following algorithms are provided:\n * - Symmetric:\n *   - AES (see \\c mbedtls_aes_crypt_ecb(), \\c mbedtls_aes_crypt_cbc(), \\c mbedtls_aes_crypt_cfb128() and\n *     \\c mbedtls_aes_crypt_ctr()).\n *   - ARCFOUR (see \\c mbedtls_arc4_crypt()).\n *   - Blowfish / BF (see \\c mbedtls_blowfish_crypt_ecb(), \\c mbedtls_blowfish_crypt_cbc(),\n *     \\c mbedtls_blowfish_crypt_cfb64() and \\c mbedtls_blowfish_crypt_ctr())\n *   - Camellia (see \\c mbedtls_camellia_crypt_ecb(), \\c mbedtls_camellia_crypt_cbc(),\n *     \\c mbedtls_camellia_crypt_cfb128() and \\c mbedtls_camellia_crypt_ctr()).\n *   - DES/3DES (see \\c mbedtls_des_crypt_ecb(), \\c mbedtls_des_crypt_cbc(), \\c mbedtls_des3_crypt_ecb()\n *     and \\c mbedtls_des3_crypt_cbc()).\n *   - GCM (AES-GCM and CAMELLIA-GCM) (see \\c mbedtls_gcm_init())\n *   - XTEA (see \\c mbedtls_xtea_crypt_ecb()).\n * - Asymmetric:\n *   - Diffie-Hellman-Merkle (see \\c mbedtls_dhm_read_public(), \\c mbedtls_dhm_make_public()\n *     and \\c mbedtls_dhm_calc_secret()).\n *   - RSA (see \\c mbedtls_rsa_public() and \\c mbedtls_rsa_private()).\n *   - Elliptic Curves over GF(p) (see \\c mbedtls_ecp_point_init()).\n *   - Elliptic Curve Digital Signature Algorithm (ECDSA) (see \\c mbedtls_ecdsa_init()).\n *   - Elliptic Curve Diffie Hellman (ECDH) (see \\c mbedtls_ecdh_init()).\n *\n * This module provides encryption/decryption which can be used to provide\n * secrecy.\n *\n * It also provides asymmetric key functions which can be used for\n * confidentiality, integrity, authentication and non-repudiation.\n */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/doxygen/input/doc_hashing.h",
    "content": "/**\n * @file\n * Hashing module documentation file.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/**\n * @addtogroup hashing_module Hashing module\n *\n * The Message Digest (MD) or Hashing module provides one-way hashing\n * functions. Such functions can be used for creating a hash message\n * authentication code (HMAC) when sending a message. Such a HMAC can be used\n * in combination with a private key for authentication, which is a message\n * integrity control.\n *\n * All hash algorithms can be accessed via the generic MD layer (see\n * \\c mbedtls_md_setup())\n *\n * The following hashing-algorithms are provided:\n * - MD2, MD4, MD5 128-bit one-way hash functions by Ron Rivest.\n * - SHA-1, SHA-256, SHA-384/512 160-bit or more one-way hash functions by\n *   NIST and NSA.\n *\n * This module provides one-way hashing which can be used for authentication.\n */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/doxygen/input/doc_mainpage.h",
    "content": "/**\n * @file\n * Main page documentation file.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/**\n * @mainpage mbed TLS v2.6.0 source code documentation\n *\n * This documentation describes the internal structure of mbed TLS.  It was\n * automatically generated from specially formatted comment blocks in\n * mbed TLS's source code using Doxygen.  (See\n * http://www.stack.nl/~dimitri/doxygen/ for more information on Doxygen)\n *\n * mbed TLS has a simple setup: it provides the ingredients for an SSL/TLS\n * implementation. These ingredients are listed as modules in the\n * \\ref mainpage_modules \"Modules section\". This \"Modules section\" introduces\n * the high-level module concepts used throughout this documentation.\\n\n * Some examples of mbed TLS usage can be found in the \\ref mainpage_examples\n * \"Examples section\".\n *\n * @section mainpage_modules Modules\n *\n * mbed TLS supports SSLv3 up to TLSv1.2 communication by providing the\n * following:\n * - TCP/IP communication functions: listen, connect, accept, read/write.\n * - SSL/TLS communication functions: init, handshake, read/write.\n * - X.509 functions: CRT, CRL and key handling\n * - Random number generation\n * - Hashing\n * - Encryption/decryption\n *\n * Above functions are split up neatly into logical interfaces. These can be\n * used separately to provide any of the above functions or to mix-and-match\n * into an SSL server/client solution that utilises a X.509 PKI. Examples of\n * such implementations are amply provided with the source code.\n *\n * Note that mbed TLS does not provide a control channel or (multiple) session\n * handling without additional work from the developer.\n *\n * @section mainpage_examples Examples\n *\n * Example server setup:\n *\n * \\b Prerequisites:\n * - X.509 certificate and private key\n * - session handling functions\n *\n * \\b Setup:\n * - Load your certificate and your private RSA key (X.509 interface)\n * - Setup the listening TCP socket (TCP/IP interface)\n * - Accept incoming client connection (TCP/IP interface)\n * - Initialise as an SSL-server (SSL/TLS interface)\n *   - Set parameters, e.g. authentication, ciphers, CA-chain, key exchange\n *   - Set callback functions RNG, IO, session handling\n * - Perform an SSL-handshake (SSL/TLS interface)\n * - Read/write data (SSL/TLS interface)\n * - Close and cleanup (all interfaces)\n *\n * Example client setup:\n *\n * \\b Prerequisites:\n * - X.509 certificate and private key\n * - X.509 trusted CA certificates\n *\n * \\b Setup:\n * - Load the trusted CA certificates (X.509 interface)\n * - Load your certificate and your private RSA key (X.509 interface)\n * - Setup a TCP/IP connection (TCP/IP interface)\n * - Initialise as an SSL-client (SSL/TLS interface)\n *   - Set parameters, e.g. authentication mode, ciphers, CA-chain, session\n *   - Set callback functions RNG, IO\n * - Perform an SSL-handshake (SSL/TLS interface)\n * - Verify the server certificate (SSL/TLS interface)\n * - Write/read data (SSL/TLS interface)\n * - Close and cleanup (all interfaces)\n */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/doxygen/input/doc_rng.h",
    "content": "/**\n * @file\n * Random number generator (RNG) module documentation file.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/**\n * @addtogroup rng_module Random number generator (RNG) module\n *\n * The Random number generator (RNG) module provides random number\n * generation, see \\c mbedtls_ctr_drbg_random().\n *\n * The block-cipher counter-mode based deterministic random\n * bit generator (CTR_DBRG) as specified in NIST SP800-90. It needs an external\n * source of entropy. For these purposes \\c mbedtls_entropy_func() can be used.\n * This is an implementation based on a simple entropy accumulator design.\n *\n * The other number generator that is included is less strong and uses the\n * HAVEGE (HArdware Volatile Entropy Gathering and Expansion) software heuristic\n * which considered unsafe for primary usage, but provides additional random\n * to the entropy pool if enables.\n *\n * Meaning that there seems to be no practical algorithm that can guess\n * the next bit with a probability larger than 1/2 in an output sequence.\n *\n * This module can be used to generate random numbers.\n */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/doxygen/input/doc_ssltls.h",
    "content": "/**\n * @file\n * SSL/TLS communication module documentation file.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/**\n * @addtogroup ssltls_communication_module SSL/TLS communication module\n *\n * The SSL/TLS communication module provides the means to create an SSL/TLS\n * communication channel.\n *\n * The basic provisions are:\n * - initialise an SSL/TLS context (see \\c mbedtls_ssl_init()).\n * - perform an SSL/TLS handshake (see \\c mbedtls_ssl_handshake()).\n * - read/write (see \\c mbedtls_ssl_read() and \\c mbedtls_ssl_write()).\n * - notify a peer that connection is being closed (see \\c mbedtls_ssl_close_notify()).\n *\n * Many aspects of such a channel are set through parameters and callback\n * functions:\n * - the endpoint role: client or server.\n * - the authentication mode. Should verification take place.\n * - the Host-to-host communication channel. A TCP/IP module is provided.\n * - the random number generator (RNG).\n * - the ciphers to use for encryption/decryption.\n * - session control functions.\n * - X.509 parameters for certificate-handling and key exchange.\n *\n * This module can be used to create an SSL/TLS server and client and to provide a basic\n * framework to setup and communicate through an SSL/TLS communication channel.\\n\n * Note that you need to provide for several aspects yourself as mentioned above.\n */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/doxygen/input/doc_tcpip.h",
    "content": "/**\n * @file\n * TCP/IP communication module documentation file.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/**\n * @addtogroup tcpip_communication_module TCP/IP communication module\n *\n * The TCP/IP communication module provides for a channel of\n * communication for the \\link ssltls_communication_module SSL/TLS communication\n * module\\endlink to use.\n * In the TCP/IP-model it provides for communication up to the Transport\n * (or Host-to-host) layer.\n * SSL/TLS resides on top of that, in the Application layer, and makes use of\n * its basic provisions:\n * - listening on a port (see \\c mbedtls_net_bind()).\n * - accepting a connection (through \\c mbedtls_net_accept()).\n * - read/write (through \\c mbedtls_net_recv()/\\c mbedtls_net_send()).\n * - close a connection (through \\c mbedtls_net_close()).\n *\n * This way you have the means to, for example, implement and use an UDP or\n * IPSec communication solution as a basis.\n *\n * This module can be used at server- and clientside to provide a basic\n * means of communication over the internet.\n */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/doxygen/input/doc_x509.h",
    "content": "/**\n * @file\n * X.509 module documentation file.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/**\n * @addtogroup x509_module X.509 module\n *\n * The X.509 module provides X.509 support for reading, writing and verification\n * of certificates.\n * In summary:\n *   - X.509 certificate (CRT) reading (see \\c mbedtls_x509_crt_parse(),\n *     \\c mbedtls_x509_crt_parse_der(), \\c mbedtls_x509_crt_parse_file()).\n *   - X.509 certificate revocation list (CRL) reading (see\n *     \\c mbedtls_x509_crl_parse(), \\c mbedtls_x509_crl_parse_der(),\n *     and \\c mbedtls_x509_crl_parse_file()).\n *   - X.509 certificate signature verification (see \\c\n *     mbedtls_x509_crt_verify() and \\c mbedtls_x509_crt_verify_with_profile().\n *   - X.509 certificate writing and certificate request writing (see\n *     \\c mbedtls_x509write_crt_der() and \\c mbedtls_x509write_csr_der()).\n *\n * This module can be used to build a certificate authority (CA) chain and\n * verify its signature. It is also used to generate Certificate Signing\n * Requests and X.509 certificates just as a CA would do.\n */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/doxygen/mbedtls.doxyfile",
    "content": "# Doxyfile 1.8.4\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project.\n#\n# All text after a double hash (##) is considered a comment and is placed\n# in front of the TAG it is preceding .\n# All text after a hash (#) is considered a comment and will be ignored.\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \").\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file\n# that follow. The default is UTF-8 which is also the encoding used for all\n# text before the first occurrence of this tag. Doxygen uses libiconv (or the\n# iconv built into libc) for the transcoding. See\n# http://www.gnu.org/software/libiconv for the list of possible encodings.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or sequence of words) that should\n# identify the project. Note that if you do not use Doxywizard you need\n# to put quotes around the project name if it contains spaces.\n\nPROJECT_NAME           = \"mbed TLS v2.6.0\"\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number.\n# This could be handy for archiving the generated documentation or\n# if some version control system is used.\n\nPROJECT_NUMBER         =\n\n# Using the PROJECT_BRIEF tag one can provide an optional one line description\n# for a project that appears at the top of each page and should give viewer\n# a quick idea about the purpose of the project. Keep the description short.\n\nPROJECT_BRIEF          =\n\n# With the PROJECT_LOGO tag one can specify an logo or icon that is\n# included in the documentation. The maximum height of the logo should not\n# exceed 55 pixels and the maximum width should not exceed 200 pixels.\n# Doxygen will copy the logo to the output directory.\n\nPROJECT_LOGO           =\n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)\n# base path where the generated documentation will be put.\n# If a relative path is entered, it will be relative to the location\n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = apidoc/\n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create\n# 4096 sub-directories (in 2 levels) under the output directory of each output\n# format and will distribute the generated files over these directories.\n# Enabling this option can be useful when feeding doxygen a huge amount of\n# source files, where putting all generated files in the same directory would\n# otherwise cause performance problems for the file system.\n\nCREATE_SUBDIRS         = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all\n# documentation generated by doxygen is written. Doxygen will use this\n# information to generate all constant output in the proper language.\n# The default language is English, other supported languages are:\n# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,\n# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,\n# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English\n# messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian,\n# Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic,\n# Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will\n# include brief member descriptions after the members that are listed in\n# the file and class documentation (similar to JavaDoc).\n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend\n# the brief description of a member or function before the detailed description.\n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the\n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator\n# that is used to form the text in various listings. Each string\n# in this list, if found as the leading text of the brief description, will be\n# stripped from the text and the result after processing the whole list, is\n# used as the annotated text. Otherwise, the brief description is used as-is.\n# If left blank, the following values are used (\"$name\" is automatically\n# replaced with the name of the entity): \"The $name class\" \"The $name widget\"\n# \"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\"\n# \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       = \"The $name class\" \\\n                         \"The $name widget\" \\\n                         \"The $name file\" \\\n                         is \\\n                         provides \\\n                         specifies \\\n                         contains \\\n                         represents \\\n                         a \\\n                         an \\\n                         the\n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then\n# Doxygen will generate a detailed section even if there is only a brief\n# description.\n\nALWAYS_DETAILED_SEC    = NO\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all\n# inherited members of a class in the documentation of that class as if those\n# members were ordinary class members. Constructors, destructors and assignment\n# operators of the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full\n# path before files name in the file list and in the header files. If set\n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag\n# can be used to strip a user-defined part of the path. Stripping is\n# only done if one of the specified strings matches the left-hand part of\n# the path. The tag can be used to show relative paths in the file list.\n# If left blank the directory from which doxygen is run is used as the\n# path to strip. Note that you specify absolute paths here, but also\n# relative paths, which will be relative from the directory where doxygen is\n# started.\n\nSTRIP_FROM_PATH        =\n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of\n# the path mentioned in the documentation of a class, which tells\n# the reader which header file to include in order to use a class.\n# If left blank only the name of the header file containing the class\n# definition is used. Otherwise one should specify the include paths that\n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    =\n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter\n# (but less readable) file names. This can be useful if your file system\n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen\n# will interpret the first line (until the first dot) of a JavaDoc-style\n# comment as the brief description. If set to NO, the JavaDoc\n# comments will behave just like regular Qt-style comments\n# (thus requiring an explicit @brief command for a brief description.)\n\nJAVADOC_AUTOBRIEF      = YES\n\n# If the QT_AUTOBRIEF tag is set to YES then Doxygen will\n# interpret the first line (until the first dot) of a Qt-style\n# comment as the brief description. If set to NO, the comments\n# will behave just like regular Qt-style comments (thus requiring\n# an explicit \\brief command for a brief description.)\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen\n# treat a multi-line C++ special comment block (i.e. a block of //! or ///\n# comments) as a brief description. This used to be the default behaviour.\n# The new default is to treat a multi-line C++ comment block as a detailed\n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented\n# member inherits the documentation from any documented member that it\n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce\n# a new page for each member. If set to NO, the documentation of a member will\n# be part of the file/class/namespace that contains it.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab.\n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 8\n\n# This tag can be used to specify a number of aliases that acts\n# as commands in the documentation. An alias has the form \"name=value\".\n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to\n# put the command \\sideeffect (or @sideeffect) in the documentation, which\n# will result in a user-defined paragraph with heading \"Side Effects:\".\n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                =\n\n# This tag can be used to specify a number of word-keyword mappings (TCL only).\n# A mapping has the form \"name=value\". For example adding\n# \"class=itcl::class\" will allow you to use the command class in the\n# itcl::class meaning.\n\nTCL_SUBST              =\n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C\n# sources only. Doxygen will then generate output that is more tailored for C.\n# For instance, some of the names that are used will be different. The list\n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = YES\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java\n# sources only. Doxygen will then generate output that is more tailored for\n# Java. For instance, namespaces will be presented as packages, qualified\n# scopes will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran\n# sources only. Doxygen will then generate output that is more tailored for\n# Fortran.\n\nOPTIMIZE_FOR_FORTRAN   = NO\n\n# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL\n# sources. Doxygen will then generate output that is tailored for\n# VHDL.\n\nOPTIMIZE_OUTPUT_VHDL   = NO\n\n# Doxygen selects the parser to use depending on the extension of the files it\n# parses. With this tag you can assign which parser to use for a given\n# extension. Doxygen has a built-in mapping, but you can override or extend it\n# using this tag. The format is ext=language, where ext is a file extension,\n# and language is one of the parsers supported by doxygen: IDL, Java,\n# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C,\n# C++. For instance to make doxygen treat .inc files as Fortran files (default\n# is PHP), and .f files as C (default is Fortran), use: inc=Fortran f=C. Note\n# that for custom extensions you also need to set FILE_PATTERNS otherwise the\n# files are not read by doxygen.\n\nEXTENSION_MAPPING      =\n\n# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all\n# comments according to the Markdown format, which allows for more readable\n# documentation. See http://daringfireball.net/projects/markdown/ for details.\n# The output of markdown processing is further processed by doxygen, so you\n# can mix doxygen, HTML, and XML commands with Markdown formatting.\n# Disable only in case of backward compatibilities issues.\n\nMARKDOWN_SUPPORT       = YES\n\n# When enabled doxygen tries to link words that correspond to documented\n# classes, or namespaces to their corresponding documentation. Such a link can\n# be prevented in individual cases by by putting a % sign in front of the word\n# or globally by setting AUTOLINK_SUPPORT to NO.\n\nAUTOLINK_SUPPORT       = YES\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want\n# to include (a tag file for) the STL sources as input, then you should\n# set this tag to YES in order to let doxygen match functions declarations and\n# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.\n# func(std::string) {}). This also makes the inheritance and collaboration\n# diagrams that involve STL classes more complete and accurate.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n\nCPP_CLI_SUPPORT        = NO\n\n# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.\n# Doxygen will parse them like normal C++ but will assume all classes use public\n# instead of private inheritance when no explicit protection keyword is present.\n\nSIP_SUPPORT            = NO\n\n# For Microsoft's IDL there are propget and propput attributes to indicate\n# getter and setter methods for a property. Setting this option to YES (the\n# default) will make doxygen replace the get and set methods by a property in\n# the documentation. This will only work if the methods are indeed getting or\n# setting a simple type. If this is not the case, or you want to show the\n# methods anyway, you should set this option to NO.\n\nIDL_PROPERTY_SUPPORT   = YES\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC\n# tag is set to YES, then doxygen will reuse the documentation of the first\n# member in the group (if any) for the other members of the group. By default\n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = NO\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of\n# the same type (for instance a group of public functions) to be put as a\n# subgroup of that type (e.g. under the Public Functions section). Set it to\n# NO to prevent subgrouping. Alternatively, this can be done per class using\n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and\n# unions are shown inside the group in which they are included (e.g. using\n# @ingroup) instead of on a separate page (for HTML and Man pages) or\n# section (for LaTeX and RTF).\n\nINLINE_GROUPED_CLASSES = NO\n\n# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and\n# unions with only public data fields or simple typedef fields will be shown\n# inline in the documentation of the scope in which they are defined (i.e. file,\n# namespace, or group documentation), provided this scope is documented. If set\n# to NO (the default), structs, classes, and unions are shown on a separate\n# page (for HTML and Man pages) or section (for LaTeX and RTF).\n\nINLINE_SIMPLE_STRUCTS  = NO\n\n# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum\n# is documented as struct, union, or enum with the name of the typedef. So\n# typedef struct TypeS {} TypeT, will appear in the documentation as a struct\n# with name TypeT. When disabled the typedef will appear as a member of a file,\n# namespace, or class. And the struct will be named TypeS. This can typically\n# be useful for C code in case the coding convention dictates that all compound\n# types are typedef'ed and only the typedef is referenced, never the tag name.\n\nTYPEDEF_HIDES_STRUCT   = NO\n\n# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This\n# cache is used to resolve symbols given their name and scope. Since this can\n# be an expensive process and often the same symbol appear multiple times in\n# the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too\n# small doxygen will become slower. If the cache is too large, memory is wasted.\n# The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid\n# range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536\n# symbols.\n\nLOOKUP_CACHE_SIZE      = 0\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n# documentation are documented, even if no documentation was available.\n# Private class members and static file members will be hidden unless\n# the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = YES\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class\n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = YES\n\n# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal\n# scope will be included in the documentation.\n\nEXTRACT_PACKAGE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file\n# will be included in the documentation.\n\nEXTRACT_STATIC         = YES\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)\n# defined locally in source files will be included in the documentation.\n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. When set to YES local\n# methods, which are defined in the implementation section but not in\n# the interface are included in the documentation.\n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = YES\n\n# If this flag is set to YES, the members of anonymous namespaces will be\n# extracted and appear in the documentation as a namespace called\n# 'anonymous_namespace{file}', where file will be replaced with the base\n# name of the file that contains the anonymous namespace. By default\n# anonymous namespaces are hidden.\n\nEXTRACT_ANON_NSPACES   = YES\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all\n# undocumented members of documented classes, files or namespaces.\n# If set to NO (the default) these members will be included in the\n# various overviews, but no documentation section is generated.\n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all\n# undocumented classes that are normally visible in the class hierarchy.\n# If set to NO (the default) these classes will be included in the various\n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all\n# friend (class|struct|union) declarations.\n# If set to NO (the default) these declarations will be included in the\n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any\n# documentation blocks found inside the body of a function.\n# If set to NO (the default) these blocks will be appended to the\n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation\n# that is typed after a \\internal command is included. If the tag is set\n# to NO (the default) then the documentation will be excluded.\n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate\n# file names in lower-case letters. If set to YES upper-case letters are also\n# allowed. This is useful if you have classes or files whose names only differ\n# in case and if your file system supports case sensitive file names. Windows\n# and Mac users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = NO\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen\n# will show members with their full class and namespace scopes in the\n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen\n# will put a list of the files that are included by a file in the documentation\n# of that file.\n\nSHOW_INCLUDE_FILES     = YES\n\n# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen\n# will list include files with double quotes in the documentation\n# rather than with sharp brackets.\n\nFORCE_LOCAL_INCLUDES   = NO\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]\n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen\n# will sort the (detailed) documentation of file and class members\n# alphabetically by member name. If set to NO the members will appear in\n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the\n# brief documentation of file, namespace and class members alphabetically\n# by member name. If set to NO (the default) the members will appear in\n# declaration order.\n\nSORT_BRIEF_DOCS        = NO\n\n# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen\n# will sort the (brief and detailed) documentation of class members so that\n# constructors and destructors are listed first. If set to NO (the default)\n# the constructors will appear in the respective orders defined by\n# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS.\n# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO\n# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.\n\nSORT_MEMBERS_CTORS_1ST = NO\n\n# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the\n# hierarchy of group names into alphabetical order. If set to NO (the default)\n# the group names will appear in their defined order.\n\nSORT_GROUP_NAMES       = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be\n# sorted by fully-qualified names, including namespaces. If set to\n# NO (the default), the class list will be sorted only by class name,\n# not including the namespace part.\n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the\n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to\n# do proper type resolution of all parameters of a function it will reject a\n# match between the prototype and the implementation of a member function even\n# if there is only one candidate or it is obvious which candidate to choose\n# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\n# will still accept a match between prototype and implementation in such cases.\n\nSTRICT_PROTO_MATCHING  = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or\n# disable (NO) the todo list. This list is created by putting \\todo\n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or\n# disable (NO) the test list. This list is created by putting \\test\n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or\n# disable (NO) the bug list. This list is created by putting \\bug\n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or\n# disable (NO) the deprecated list. This list is created by putting\n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional\n# documentation sections, marked by \\if section-label ... \\endif\n# and \\cond section-label ... \\endcond blocks.\n\nENABLED_SECTIONS       =\n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines\n# the initial value of a variable or macro consists of for it to appear in\n# the documentation. If the initializer consists of more lines than specified\n# here it will be hidden. Use a value of 0 to hide initializers completely.\n# The appearance of the initializer of individual variables and macros in the\n# documentation can be controlled using \\showinitializer or \\hideinitializer\n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n# at the bottom of the documentation of classes and structs. If set to YES the\n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n# Set the SHOW_FILES tag to NO to disable the generation of the Files page.\n# This will remove the Files entry from the Quick Index and from the\n# Folder Tree View (if specified). The default is YES.\n\nSHOW_FILES             = YES\n\n# Set the SHOW_NAMESPACES tag to NO to disable the generation of the\n# Namespaces page.\n# This will remove the Namespaces entry from the Quick Index\n# and from the Folder Tree View (if specified). The default is YES.\n\nSHOW_NAMESPACES        = YES\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that\n# doxygen should invoke to get the current version for each file (typically from\n# the version control system). Doxygen will invoke the program by executing (via\n# popen()) the command <command> <input-file>, where <command> is the value of\n# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file\n# provided by doxygen. Whatever the program writes to standard output\n# is used as the file version. See the manual for examples.\n\nFILE_VERSION_FILTER    =\n\n# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed\n# by doxygen. The layout file controls the global structure of the generated\n# output files in an output format independent way. To create the layout file\n# that represents doxygen's defaults, run doxygen with the -l option.\n# You can optionally specify a file name after the option, if omitted\n# DoxygenLayout.xml will be used as the name of the layout file.\n\nLAYOUT_FILE            =\n\n# The CITE_BIB_FILES tag can be used to specify one or more bib files\n# containing the references data. This must be a list of .bib files. The\n# .bib extension is automatically appended if omitted. Using this command\n# requires the bibtex tool to be installed. See also\n# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style\n# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this\n# feature you need bibtex and perl available in the search path. Do not use\n# file names with spaces, bibtex cannot handle them.\n\nCITE_BIB_FILES         =\n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated\n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = NO\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are\n# generated by doxygen. Possible values are YES and NO. If left blank\n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings\n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will\n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for\n# potential errors in the documentation, such as not documenting some\n# parameters in a documented function, or documenting parameters that\n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# The WARN_NO_PARAMDOC option can be enabled to get warnings for\n# functions that are documented, but have no documentation for their parameters\n# or return value. If set to NO (the default) doxygen will only warn about\n# wrong or incomplete parameter documentation, but not about the absence of\n# documentation.\n\nWARN_NO_PARAMDOC       = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that\n# doxygen can produce. The string should contain the $file, $line, and $text\n# tags, which will be replaced by the file and line number from which the\n# warning originated and the warning text. Optionally the format may contain\n# $version, which will be replaced by the version of the file (if it could\n# be obtained via FILE_VERSION_FILTER)\n\nWARN_FORMAT            = \"$file:$line: $text\"\n\n# The WARN_LOGFILE tag can be used to specify a file to which warning\n# and error messages should be written. If left blank the output is written\n# to stderr.\n\nWARN_LOGFILE           =\n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain\n# documented source files. You may enter file names like \"myfile.cpp\" or\n# directories like \"/usr/src/myproject\". Separate the files or directories\n# with spaces.\n\nINPUT                  = .\n\n# This tag can be used to specify the character encoding of the source files\n# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is\n# also the default input encoding. Doxygen uses libiconv (or the iconv built\n# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for\n# the list of possible encodings.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the\n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank the following patterns are tested:\n# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh\n# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py\n# *.f90 *.f *.for *.vhd *.vhdl\n\nFILE_PATTERNS          = *.h\n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories\n# should be searched for input files as well. Possible values are YES and NO.\n# If left blank NO is used.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should be\n# excluded from the INPUT source files. This way you can easily exclude a\n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n# Note that relative paths are relative to the directory from which doxygen is\n# run.\n\nEXCLUDE                = configs yotta/module\n\n# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or\n# directories that are symbolic links (a Unix file system feature) are excluded\n# from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the\n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude\n# certain files from those directories. Note that the wildcards are matched\n# against the file with absolute path, so to exclude all test directories\n# for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       = *_internal.h *_wrap.h\n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names\n# (namespaces, classes, functions, etc.) that should be excluded from the\n# output. The symbol name can be a fully qualified name, a word, or if the\n# wildcard * is used, a substring. Examples: ANamespace, AClass,\n# AClass::ANamespace, ANamespace::*Test\n\nEXCLUDE_SYMBOLS        =\n\n# The EXAMPLE_PATH tag can be used to specify one or more files or\n# directories that contain example code fragments that are included (see\n# the \\include command).\n\nEXAMPLE_PATH           =\n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the\n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp\n# and *.h) to filter out the source-files in the directories. If left\n# blank all files are included.\n\nEXAMPLE_PATTERNS       = *\n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be\n# searched for input files to be used with the \\include or \\dontinclude\n# commands irrespective of the value of the RECURSIVE tag.\n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or\n# directories that contain image that are included in the documentation (see\n# the \\image command).\n\nIMAGE_PATH             =\n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should\n# invoke to filter for each input file. Doxygen will invoke the filter program\n# by executing (via popen()) the command <filter> <input-file>, where <filter>\n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an\n# input file. Doxygen will then use the output that the filter program writes\n# to standard output.\n# If FILTER_PATTERNS is specified, this tag will be ignored.\n# Note that the filter must not add or remove lines; it is applied before the\n# code is scanned, but not when the output code is generated. If lines are added\n# or removed, the anchors will not be placed correctly.\n\nINPUT_FILTER           =\n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern\n# basis.\n# Doxygen will compare the file name with each pattern and apply the\n# filter if there is a match.\n# The filters are a list of the form:\n# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\n# info on how filters are used. If FILTER_PATTERNS is empty or if\n# non of the patterns match the file name, INPUT_FILTER is applied.\n\nFILTER_PATTERNS        =\n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using\n# INPUT_FILTER) will be used to filter the input files when producing source\n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n# pattern. A pattern will override the setting for FILTER_PATTERN (if any)\n# and it is also possible to disable source filtering for a specific pattern\n# using *.ext= (so without naming a filter). This option only has effect when\n# FILTER_SOURCE_FILES is enabled.\n\nFILTER_SOURCE_PATTERNS =\n\n# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that\n# is part of the input, its contents will be placed on the main page\n# (index.html). This can be useful if you have a project on for instance GitHub\n# and want reuse the introduction page also for the doxygen output.\n\nUSE_MDFILE_AS_MAINPAGE =\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will\n# be generated. Documented entities will be cross-referenced with these sources.\n# Note: To get rid of all source code in the generated output, make sure also\n# VERBATIM_HEADERS is set to NO.\n\nSOURCE_BROWSER         = YES\n\n# Setting the INLINE_SOURCES tag to YES will include the body\n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct\n# doxygen to hide any special comment blocks from generated source code\n# fragments. Normal C, C++ and Fortran comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES\n# then for each documented function all documented\n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = YES\n\n# If the REFERENCES_RELATION tag is set to YES\n# then for each documented function all documented entities\n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = YES\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n# link to the source code.\n# Otherwise they will link to the documentation.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code\n# will point to the HTML generated by the htags(1) tool instead of doxygen\n# built-in source browser. The htags tool is part of GNU's global source\n# tagging system (see http://www.gnu.org/software/global/global.html). You\n# will need version 4.8.6 or higher.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen\n# will generate a verbatim copy of the header file for each class for\n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index\n# of all compounds will be generated. Enable this if the project\n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = NO\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then\n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns\n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all\n# classes will be put under the same header in the alphabetical index.\n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          =\n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will\n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = .\n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for\n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank\n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = .html\n\n# The HTML_HEADER tag can be used to specify a personal HTML header for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard header. Note that when using a custom header you are responsible\n#  for the proper inclusion of any scripts and style sheets that doxygen\n# needs, which is dependent on the configuration options used.\n# It is advised to generate a default header using \"doxygen -w html\n# header.html footer.html stylesheet.css YourConfigFile\" and then modify\n# that header. Note that the header is subject to change so you typically\n# have to redo this when upgrading to a newer version of doxygen or when\n# changing the value of configuration settings such as GENERATE_TREEVIEW!\n\nHTML_HEADER            =\n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for\n# each generated HTML page. If it is left blank doxygen will generate a\n# standard footer.\n\nHTML_FOOTER            =\n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading\n# style sheet that is used by each HTML page. It can be used to\n# fine-tune the look of the HTML output. If left blank doxygen will\n# generate a default style sheet. Note that it is recommended to use\n# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this\n# tag will in the future become obsolete.\n\nHTML_STYLESHEET        =\n\n# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional\n# user-defined cascading style sheet that is included after the standard\n# style sheets created by doxygen. Using this option one can overrule\n# certain style aspects. This is preferred over using HTML_STYLESHEET\n# since it does not replace the standard style sheet and is therefor more\n# robust against future updates. Doxygen will copy the style sheet file to\n# the output directory.\n\nHTML_EXTRA_STYLESHEET  =\n\n# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or\n# other source files which should be copied to the HTML output directory. Note\n# that these files will be copied to the base HTML output directory. Use the\n# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these\n# files. In the HTML_STYLESHEET file, use the file name only. Also note that\n# the files will be copied as-is; there are no commands or markers available.\n\nHTML_EXTRA_FILES       =\n\n# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output.\n# Doxygen will adjust the colors in the style sheet and background images\n# according to this color. Hue is specified as an angle on a colorwheel,\n# see http://en.wikipedia.org/wiki/Hue for more information.\n# For instance the value 0 represents red, 60 is yellow, 120 is green,\n# 180 is cyan, 240 is blue, 300 purple, and 360 is red again.\n# The allowed range is 0 to 359.\n\nHTML_COLORSTYLE_HUE    = 220\n\n# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of\n# the colors in the HTML output. For a value of 0 the output will use\n# grayscales only. A value of 255 will produce the most vivid colors.\n\nHTML_COLORSTYLE_SAT    = 100\n\n# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to\n# the luminance component of the colors in the HTML output. Values below\n# 100 gradually make the output lighter, whereas values above 100 make\n# the output darker. The value divided by 100 is the actual gamma applied,\n# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2,\n# and 100 does not change the gamma.\n\nHTML_COLORSTYLE_GAMMA  = 80\n\n# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML\n# page will contain the date and time when the page was generated. Setting\n# this to NO can help when comparing the output of multiple runs.\n\nHTML_TIMESTAMP         = YES\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML\n# documentation will contain sections that can be hidden and shown after the\n# page has loaded.\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of\n# entries shown in the various tree structured indices initially; the user\n# can expand and collapse entries dynamically later on. Doxygen will expand\n# the tree to such a level that at most the specified number of entries are\n# visible (unless a fully collapsed tree already exceeds this amount).\n# So setting the number of entries 1 will produce a full collapsed tree by\n# default. 0 is a special value representing an infinite number of entries\n# and will result in a full expanded tree by default.\n\nHTML_INDEX_NUM_ENTRIES = 100\n\n# If the GENERATE_DOCSET tag is set to YES, additional index files\n# will be generated that can be used as input for Apple's Xcode 3\n# integrated development environment, introduced with OSX 10.5 (Leopard).\n# To create a documentation set, doxygen will generate a Makefile in the\n# HTML output directory. Running make will produce the docset in that\n# directory and running \"make install\" will install the docset in\n# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find\n# it at startup.\n# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html\n# for more information.\n\nGENERATE_DOCSET        = NO\n\n# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the\n# feed. A documentation feed provides an umbrella under which multiple\n# documentation sets from a single provider (such as a company or product suite)\n# can be grouped.\n\nDOCSET_FEEDNAME        = \"Doxygen generated docs\"\n\n# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that\n# should uniquely identify the documentation set bundle. This should be a\n# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen\n# will append .docset to the name.\n\nDOCSET_BUNDLE_ID       = org.doxygen.Project\n\n# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely\n# identify the documentation publisher. This should be a reverse domain-name\n# style string, e.g. com.mycompany.MyDocSet.documentation.\n\nDOCSET_PUBLISHER_ID    = org.doxygen.Publisher\n\n# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.\n\nDOCSET_PUBLISHER_NAME  = Publisher\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files\n# will be generated that can be used as input for tools like the\n# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)\n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can\n# be used to specify the file name of the resulting .chm file. You\n# can add a path in front of the file if the result should not be\n# written to the html output directory.\n\nCHM_FILE               =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can\n# be used to specify the location (absolute path including file name) of\n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run\n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag\n# controls if a separate .chi index file is generated (YES) or that\n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING\n# is used to encode HtmlHelp index (hhk), content (hhc) and project file\n# content.\n\nCHM_INDEX_ENCODING     =\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag\n# controls whether a binary table of contents is generated (YES) or a\n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members\n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and\n# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated\n# that can be used as input for Qt's qhelpgenerator to generate a\n# Qt Compressed Help (.qch) of the generated HTML documentation.\n\nGENERATE_QHP           = NO\n\n# If the QHG_LOCATION tag is specified, the QCH_FILE tag can\n# be used to specify the file name of the resulting .qch file.\n# The path specified is relative to the HTML output folder.\n\nQCH_FILE               =\n\n# The QHP_NAMESPACE tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#namespace\n\nQHP_NAMESPACE          = org.doxygen.Project\n\n# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating\n# Qt Help Project output. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#virtual-folders\n\nQHP_VIRTUAL_FOLDER     = doc\n\n# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to\n# add. For more information please see\n# http://doc.trolltech.com/qthelpproject.html#custom-filters\n\nQHP_CUST_FILTER_NAME   =\n\n# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the\n# custom filter to add. For more information please see\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#custom-filters\">\n# Qt Help Project / Custom Filters</a>.\n\nQHP_CUST_FILTER_ATTRS  =\n\n# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this\n# project's\n# filter section matches.\n# <a href=\"http://doc.trolltech.com/qthelpproject.html#filter-attributes\">\n# Qt Help Project / Filter Attributes</a>.\n\nQHP_SECT_FILTER_ATTRS  =\n\n# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can\n# be used to specify the location of Qt's qhelpgenerator.\n# If non-empty doxygen will try to run qhelpgenerator on the generated\n# .qhp file.\n\nQHG_LOCATION           =\n\n# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files\n#  will be generated, which together with the HTML files, form an Eclipse help\n# plugin. To install this plugin and make it available under the help contents\n# menu in Eclipse, the contents of the directory containing the HTML and XML\n# files needs to be copied into the plugins directory of eclipse. The name of\n# the directory within the plugins directory should be the same as\n# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before\n# the help appears.\n\nGENERATE_ECLIPSEHELP   = NO\n\n# A unique identifier for the eclipse help plugin. When installing the plugin\n# the directory name containing the HTML and XML files should also have\n# this name.\n\nECLIPSE_DOC_ID         = org.doxygen.Project\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs)\n# at top of each HTML page. The value NO (the default) enables the index and\n# the value YES disables it. Since the tabs have the same information as the\n# navigation tree you can set this option to NO if you already set\n# GENERATE_TREEVIEW to YES.\n\nDISABLE_INDEX          = NO\n\n# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n# structure should be generated to display hierarchical information.\n# If the tag value is set to YES, a side panel will be generated\n# containing a tree-like index structure (just like the one that\n# is generated for HTML Help). For this to work a browser that supports\n# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\n# Windows users are probably better off using the HTML help feature.\n# Since the tree basically has the same information as the tab index you\n# could consider to set DISABLE_INDEX to NO when enabling this option.\n\nGENERATE_TREEVIEW      = NO\n\n# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values\n# (range [0,1..20]) that doxygen will group on one line in the generated HTML\n# documentation. Note that a value of 0 will completely suppress the enum\n# values from appearing in the overview section.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be\n# used to set the initial width (in pixels) of the frame in which the tree\n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open\n# links to external symbols imported via tag files in a separate window.\n\nEXT_LINKS_IN_WINDOW    = NO\n\n# Use this tag to change the font size of Latex formulas included\n# as images in the HTML documentation. The default is 10. Note that\n# when you change the font size after a successful doxygen run you need\n# to manually remove any form_*.png images from the HTML output directory\n# to force them to be regenerated.\n\nFORMULA_FONTSIZE       = 10\n\n# Use the FORMULA_TRANPARENT tag to determine whether or not the images\n# generated for formulas are transparent PNGs. Transparent PNGs are\n# not supported properly for IE 6.0, but are supported on all modern browsers.\n# Note that when changing this option you need to delete any form_*.png files\n# in the HTML output before the changes have effect.\n\nFORMULA_TRANSPARENT    = YES\n\n# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax\n# (see http://www.mathjax.org) which uses client side Javascript for the\n# rendering instead of using prerendered bitmaps. Use this if you do not\n# have LaTeX installed or if you want to formulas look prettier in the HTML\n# output. When enabled you may also need to install MathJax separately and\n# configure the path to it using the MATHJAX_RELPATH option.\n\nUSE_MATHJAX            = NO\n\n# When MathJax is enabled you can set the default output format to be used for\n# the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and\n# SVG. The default value is HTML-CSS, which is slower, but has the best\n# compatibility.\n\nMATHJAX_FORMAT         = HTML-CSS\n\n# When MathJax is enabled you need to specify the location relative to the\n# HTML output directory using the MATHJAX_RELPATH option. The destination\n# directory should contain the MathJax.js script. For instance, if the mathjax\n# directory is located at the same level as the HTML output directory, then\n# MATHJAX_RELPATH should be ../mathjax. The default value points to\n# the MathJax Content Delivery Network so you can quickly see the result without\n# installing MathJax.\n# However, it is strongly recommended to install a local\n# copy of MathJax from http://www.mathjax.org before deployment.\n\nMATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest\n\n# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension\n# names that should be enabled during MathJax rendering.\n\nMATHJAX_EXTENSIONS     =\n\n# The MATHJAX_CODEFILE tag can be used to specify a file with javascript\n# pieces of code that will be used on startup of the MathJax code.\n\nMATHJAX_CODEFILE       =\n\n# When the SEARCHENGINE tag is enabled doxygen will generate a search box\n# for the HTML output. The underlying search engine uses javascript\n# and DHTML and should work on any modern browser. Note that when using\n# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets\n# (GENERATE_DOCSET) there is already a search function so this one should\n# typically be disabled. For large projects the javascript based search engine\n# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.\n\nSEARCHENGINE           = NO\n\n# When the SERVER_BASED_SEARCH tag is enabled the search engine will be\n# implemented using a web server instead of a web client using Javascript.\n# There are two flavours of web server based search depending on the\n# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for\n# searching and an index file used by the script. When EXTERNAL_SEARCH is\n# enabled the indexing and searching needs to be provided by external tools.\n# See the manual for details.\n\nSERVER_BASED_SEARCH    = NO\n\n# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP\n# script for searching. Instead the search results are written to an XML file\n# which needs to be processed by an external indexer. Doxygen will invoke an\n# external search engine pointed to by the SEARCHENGINE_URL option to obtain\n# the search results. Doxygen ships with an example indexer (doxyindexer) and\n# search engine (doxysearch.cgi) which are based on the open source search\n# engine library Xapian. See the manual for configuration details.\n\nEXTERNAL_SEARCH        = NO\n\n# The SEARCHENGINE_URL should point to a search engine hosted by a web server\n# which will returned the search results when EXTERNAL_SEARCH is enabled.\n# Doxygen ships with an example search engine (doxysearch) which is based on\n# the open source search engine library Xapian. See the manual for configuration\n# details.\n\nSEARCHENGINE_URL       =\n\n# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed\n# search data is written to a file for indexing by an external tool. With the\n# SEARCHDATA_FILE tag the name of this file can be specified.\n\nSEARCHDATA_FILE        = searchdata.xml\n\n# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the\n# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is\n# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n# projects and redirect the results back to the right project.\n\nEXTERNAL_SEARCH_ID     =\n\n# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen\n# projects other than the one defined by this configuration file, but that are\n# all added to the same external search index. Each project needs to have a\n# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id\n# of to a relative location where the documentation can be found.\n# The format is: EXTRA_SEARCH_MAPPINGS = id1=loc1 id2=loc2 ...\n\nEXTRA_SEARCH_MAPPINGS  =\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will\n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = latex\n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be\n# invoked. If left blank `latex' will be used as the default command name.\n# Note that when enabling USE_PDFLATEX this option is only used for\n# generating bitmaps for formulas in the HTML output, but not in the\n# Makefile that is written to the output directory.\n\nLATEX_CMD_NAME         = latex\n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to\n# generate index for LaTeX. If left blank `makeindex' will be used as the\n# default command name.\n\nMAKEINDEX_CMD_NAME     = makeindex\n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact\n# LaTeX documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_LATEX          = YES\n\n# The PAPER_TYPE tag can be used to set the paper type that is used\n# by the printer. Possible values are: a4, letter, legal and\n# executive. If left blank a4 will be used.\n\nPAPER_TYPE             = a4wide\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX\n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         =\n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for\n# the generated latex document. The header should contain everything until\n# the first chapter. If it is left blank doxygen will generate a\n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           =\n\n# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for\n# the generated latex document. The footer should contain everything after\n# the last chapter. If it is left blank doxygen will generate a\n# standard footer. Notice: only use this tag if you know what you are doing!\n\nLATEX_FOOTER           =\n\n# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images\n# or other source files which should be copied to the LaTeX output directory.\n# Note that the files will be copied as-is; there are no commands or markers\n# available.\n\nLATEX_EXTRA_FILES      =\n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated\n# is prepared for conversion to pdf (using ps2pdf). The pdf file will\n# contain links (just like the HTML output) instead of page references\n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = YES\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of\n# plain latex in the generated Makefile. Set this option to YES to get a\n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode.\n# command to the generated LaTeX files. This will instruct LaTeX to keep\n# running if errors occur, instead of asking the user for help.\n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not\n# include the index chapters (such as File Index, Compound Index, etc.)\n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n# If LATEX_SOURCE_CODE is set to YES then doxygen will include\n# source code with syntax highlighting in the LaTeX output.\n# Note that which sources are shown also depends on other settings\n# such as SOURCE_BROWSER.\n\nLATEX_SOURCE_CODE      = NO\n\n# The LATEX_BIB_STYLE tag can be used to specify the style to use for the\n# bibliography, e.g. plainnat, or ieeetr. The default style is \"plain\". See\n# http://en.wikipedia.org/wiki/BibTeX for more info.\n\nLATEX_BIB_STYLE        = plain\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output\n# The RTF output is optimized for Word 97 and may not look very pretty with\n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = rtf\n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact\n# RTF documents. This may be useful for small projects and may help to\n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated\n# will contain hyperlink fields. The RTF file will\n# contain links (just like the HTML output) instead of page references.\n# This makes the output suitable for online browsing using WORD or other\n# programs which support those fields.\n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load style sheet definitions from file. Syntax is similar to doxygen's\n# config file, i.e. a series of assignments. You only have to provide\n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    =\n\n# Set optional variables used in the generation of an rtf document.\n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    =\n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will\n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = man\n\n# The MAN_EXTENSION tag determines the extension that is added to\n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = .3\n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output,\n# then it will generate one additional man file for each entity\n# documented in the real man page(s). These additional files\n# only source the real man page, but without them the man command\n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will\n# generate an XML file that captures the structure of\n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be\n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# The XML_SCHEMA tag can be used to specify an XML schema,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\n#XML_SCHEMA             =\n\n# The XML_DTD tag can be used to specify an XML DTD,\n# which can be used by a validating XML parser to check the\n# syntax of the XML files.\n\n#XML_DTD                =\n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will\n# dump the program listings (including syntax highlighting\n# and cross-referencing information) to the XML output. Note that\n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the DOCBOOK output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files\n# that can be used to generate PDF.\n\nGENERATE_DOCBOOK       = NO\n\n# The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put.\n# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in\n# front of it. If left blank docbook will be used as the default path.\n\nDOCBOOK_OUTPUT         = docbook\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will\n# generate an AutoGen Definitions (see autogen.sf.net) file\n# that captures the structure of the code including all\n# documentation. Note that this feature is still experimental\n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will\n# generate a Perl module file that captures the structure of\n# the code including all documentation. Note that this\n# feature is still experimental and incomplete at the\n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate\n# the necessary Makefile rules, Perl scripts and LaTeX code to be able\n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be\n# nicely formatted so it can be parsed by a human reader.\n# This is useful\n# if you want to understand what is going on.\n# On the other hand, if this\n# tag is set to NO the size of the Perl module output will be much smaller\n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file\n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.\n# This is useful so different doxyrules.make files included by the same\n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX =\n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor\n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will\n# evaluate all C-preprocessor directives found in the sources and include\n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro\n# names in the source code. If set to NO (the default) only conditional\n# compilation will be performed. Macro expansion can be done in a controlled\n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES\n# then the macro expansion is limited to the macros specified with the\n# PREDEFINED and EXPAND_AS_DEFINED tags.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files\n# pointed to by INCLUDE_PATH will be searched when a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that\n# contain include files that are not input files but should be processed by\n# the preprocessor.\n\nINCLUDE_PATH           =\n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard\n# patterns (like *.h and *.hpp) to filter out the header-files in the\n# directories. If left blank, the patterns specified with FILE_PATTERNS will\n# be used.\n\nINCLUDE_FILE_PATTERNS  =\n\n# The PREDEFINED tag can be used to specify one or more macro names that\n# are defined before the preprocessor is started (similar to the -D option of\n# gcc). The argument of the tag is a list of macros of the form: name\n# or name=definition (no spaces). If the definition and the = are\n# omitted =1 is assumed. To prevent a macro definition from being\n# undefined via #undef or recursively expanded use the := operator\n# instead of the = operator.\n\nPREDEFINED             = WIN32 \\\n                         NTLM \\\n                         USE_LZO \\\n                         ENABLE_FRAGMENT \\\n                         P2MP \\\n                         P2MP_SERVER \\\n                         USE_CRYPTO \\\n                         USE_SSL \\\n                         ENABLE_PLUGIN \\\n                         ENABLE_MANAGEMENT \\\n                         ENABLE_OCC \\\n                         HAVE_GETTIMEOFDAY\n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then\n# this tag can be used to specify a list of macro names that should be expanded.\n# The macro definition that is found in the sources will be used.\n# Use the PREDEFINED tag if you want to use a different macro definition that\n# overrules the definition found in the source code.\n\nEXPAND_AS_DEFINED      =\n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then\n# doxygen's preprocessor will remove all references to function-like macros\n# that are alone on a line, have an all uppercase name, and do not end with a\n# semicolon, because these will confuse the parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references\n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles. For each\n# tag file the location of the external documentation should be added. The\n# format of a tag file without this location is as follows:\n#\n# TAGFILES = file1 file2 ...\n# Adding location for the tag files is done as follows:\n#\n# TAGFILES = file1=loc1 \"file2 = loc2\" ...\n# where \"loc1\" and \"loc2\" can be relative or absolute paths\n# or URLs. Note that each tag file must have a unique name (where the name does\n# NOT include the path). If a tag file is not located in the directory in which\n# doxygen is run, you must also specify the path to the tagfile here.\n\nTAGFILES               =\n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create\n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       =\n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed\n# in the class index. If set to NO only the inherited external classes\n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed\n# in the modules index. If set to NO, only the current project's groups will\n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed\n# in the related pages index. If set to NO, only the current project's\n# pages will be listed.\n\nEXTERNAL_PAGES         = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script\n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = /usr/bin/perl\n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool\n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will\n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base\n# or super classes. Setting the tag to NO turns the diagrams off. Note that\n# this option also works with HAVE_DOT disabled, but it is recommended to\n# install and use dot, since it yields more powerful graphs.\n\nCLASS_DIAGRAMS         = NO\n\n# You can define message sequence charts within doxygen comments using the \\msc\n# command. Doxygen will then run the mscgen tool (see\n# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the\n# documentation. The MSCGEN_PATH tag allows you to specify the directory where\n# the mscgen tool resides. If left empty the tool is assumed to be found in the\n# default search path.\n\nMSCGEN_PATH            =\n\n# If set to YES, the inheritance and collaboration graphs will hide\n# inheritance and usage relations if the target is undocumented\n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is\n# available from the path. This tool is part of Graphviz, a graph visualization\n# toolkit from AT&T and Lucent Bell Labs. The other options in this section\n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = YES\n\n# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is\n# allowed to run in parallel. When set to 0 (the default) doxygen will\n# base this on the number of processors available in the system. You can set it\n# explicitly to a value larger than 0 to get control over the balance\n# between CPU load and processing speed.\n\nDOT_NUM_THREADS        = 0\n\n# By default doxygen will use the Helvetica font for all dot files that\n# doxygen generates. When you want a differently looking font you can specify\n# the font name using DOT_FONTNAME. You need to make sure dot is able to find\n# the font, which can be done by putting it in a standard location or by setting\n# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the\n# directory containing the font.\n\nDOT_FONTNAME           = Helvetica\n\n# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.\n# The default size is 10pt.\n\nDOT_FONTSIZE           = 10\n\n# By default doxygen will tell dot to use the Helvetica font.\n# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to\n# set the path where dot can find it.\n\nDOT_FONTPATH           =\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect inheritance relations. Setting this tag to YES will force the\n# CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for each documented class showing the direct and\n# indirect implementation dependencies (inheritance, containment, and\n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen\n# will generate a graph for groups, showing the direct groups dependencies\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and\n# collaboration diagrams in a style similar to the OMG's Unified Modeling\n# Language.\n\nUML_LOOK               = NO\n\n# If the UML_LOOK tag is enabled, the fields and methods are shown inside\n# the class node. If there are many fields or methods and many nodes the\n# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS\n# threshold limits the number of items for each type to make the size more\n# manageable. Set this to 0 for no limit. Note that the threshold may be\n# exceeded by 50% before the limit is enforced.\n\nUML_LIMIT_NUM_FIELDS   = 10\n\n# If set to YES, the inheritance and collaboration graphs will show the\n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = NO\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT\n# tags are set to YES then doxygen will generate a graph for each documented\n# file showing the direct and indirect include dependencies of the file with\n# other documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and\n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each\n# documented header file showing the documented files that directly or\n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH and HAVE_DOT options are set to YES then\n# doxygen will generate a call dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable call graphs\n# for selected functions only using the \\callgraph command.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then\n# doxygen will generate a caller dependency graph for every global function\n# or class method. Note that enabling this option will significantly increase\n# the time of a run. So in most cases it will be better to enable caller\n# graphs for selected functions only using the \\callergraph command.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen\n# will generate a graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES\n# then doxygen will show the dependencies a directory has on other directories\n# in a graphical way. The dependency relations are determined by the #include\n# relations between the files in the directories.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images\n# generated by dot. Possible values are svg, png, jpg, or gif.\n# If left blank png will be used. If you choose svg you need to set\n# HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible in IE 9+ (other browsers do not have this requirement).\n\nDOT_IMAGE_FORMAT       = png\n\n# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to\n# enable generation of interactive SVG images that allow zooming and panning.\n# Note that this requires a modern browser other than Internet Explorer.\n# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you\n# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files\n# visible. Older versions of IE do not have SVG support.\n\nINTERACTIVE_SVG        = NO\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be\n# found. If left blank, it is assumed the dot tool can be found in the path.\n\nDOT_PATH               =\n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that\n# contain dot files that are included in the documentation (see the\n# \\dotfile command).\n\nDOTFILE_DIRS           =\n\n# The MSCFILE_DIRS tag can be used to specify one or more directories that\n# contain msc files that are included in the documentation (see the\n# \\mscfile command).\n\nMSCFILE_DIRS           =\n\n# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of\n# nodes that will be shown in the graph. If the number of nodes in a graph\n# becomes larger than this value, doxygen will truncate the graph, which is\n# visualized by representing a node as a red box. Note that doxygen if the\n# number of direct children of the root node in a graph is already larger than\n# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note\n# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n\nDOT_GRAPH_MAX_NODES    = 200\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the\n# graphs generated by dot. A depth value of 3 means that only nodes reachable\n# from the root by following a path via at most 3 edges will be shown. Nodes\n# that lay further from the root node will be omitted. Note that setting this\n# option to 1 or 2 may greatly reduce the computation time needed for large\n# code bases. Also note that the size of a graph can be further restricted by\n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n\nMAX_DOT_GRAPH_DEPTH    = 1000\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent\n# background. This is disabled by default, because dot on Windows does not\n# seem to support this out of the box. Warning: Depending on the platform used,\n# enabling this option may lead to badly anti-aliased labels on the edges of\n# a graph (i.e. they become hard to read).\n\nDOT_TRANSPARENT        = YES\n\n# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output\n# files in one run (i.e. multiple -o and -T options on the command line). This\n# makes dot run faster, but since only newer versions of dot (>1.8.10)\n# support this, this feature is disabled by default.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will\n# generate a legend page explaining the meaning of the various boxes and\n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will\n# remove the intermediate dot files that are used to generate\n# the various graphs.\n\nDOT_CLEANUP            = YES\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/.gitignore",
    "content": "Makefile\n*.sln\n*.vcxproj\nmbedtls/check_config\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/CMakeLists.txt",
    "content": "option(INSTALL_MBEDTLS_HEADERS \"Install mbed TLS headers.\" ON)\n\nif(INSTALL_MBEDTLS_HEADERS)\n\n    file(GLOB headers \"mbedtls/*.h\")\n\n    install(FILES ${headers}\n        DESTINATION include/mbedtls\n        PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)\n\nendif(INSTALL_MBEDTLS_HEADERS)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/aes.h",
    "content": "/**\n * \\file aes.h\n *\n * \\brief AES block cipher\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_AES_H\n#define MBEDTLS_AES_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n/* padlock.c and aesni.c rely on these values! */\n#define MBEDTLS_AES_ENCRYPT     1\n#define MBEDTLS_AES_DECRYPT     0\n\n#define MBEDTLS_ERR_AES_INVALID_KEY_LENGTH                -0x0020  /**< Invalid key length. */\n#define MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH              -0x0022  /**< Invalid data input length. */\n\n#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \\\n    !defined(inline) && !defined(__cplusplus)\n#define inline __inline\n#endif\n\n#if !defined(MBEDTLS_AES_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          AES context structure\n *\n * \\note           buf is able to hold 32 extra bytes, which can be used:\n *                 - for alignment purposes if VIA padlock is used, and/or\n *                 - to simplify key expansion in the 256-bit case by\n *                 generating an extra round key\n */\ntypedef struct\n{\n    int nr;                     /*!<  number of rounds  */\n    uint32_t *rk;               /*!<  AES round keys    */\n    uint32_t buf[68];           /*!<  unaligned data    */\n}\nmbedtls_aes_context;\n\n/**\n * \\brief          Initialize AES context\n *\n * \\param ctx      AES context to be initialized\n */\nvoid mbedtls_aes_init( mbedtls_aes_context *ctx );\n\n/**\n * \\brief          Clear AES context\n *\n * \\param ctx      AES context to be cleared\n */\nvoid mbedtls_aes_free( mbedtls_aes_context *ctx );\n\n/**\n * \\brief          AES key schedule (encryption)\n *\n * \\param ctx      AES context to be initialized\n * \\param key      encryption key\n * \\param keybits  must be 128, 192 or 256\n *\n * \\return         0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH\n */\nint mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,\n                    unsigned int keybits );\n\n/**\n * \\brief          AES key schedule (decryption)\n *\n * \\param ctx      AES context to be initialized\n * \\param key      decryption key\n * \\param keybits  must be 128, 192 or 256\n *\n * \\return         0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH\n */\nint mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,\n                    unsigned int keybits );\n\n/**\n * \\brief          AES-ECB block encryption/decryption\n *\n * \\param ctx      AES context\n * \\param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT\n * \\param input    16-byte input block\n * \\param output   16-byte output block\n *\n * \\return         0 if successful\n */\nint mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,\n                    int mode,\n                    const unsigned char input[16],\n                    unsigned char output[16] );\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/**\n * \\brief          AES-CBC buffer encryption/decryption\n *                 Length should be a multiple of the block\n *                 size (16 bytes)\n *\n * \\note           Upon exit, the content of the IV is updated so that you can\n *                 call the function same function again on the following\n *                 block(s) of data and get the same result as if it was\n *                 encrypted in one call. This allows a \"streaming\" usage.\n *                 If on the other hand you need to retain the contents of the\n *                 IV, you should either save it manually or use the cipher\n *                 module instead.\n *\n * \\param ctx      AES context\n * \\param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT\n * \\param length   length of the input data\n * \\param iv       initialization vector (updated after use)\n * \\param input    buffer holding the input data\n * \\param output   buffer holding the output data\n *\n * \\return         0 if successful, or MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH\n */\nint mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,\n                    int mode,\n                    size_t length,\n                    unsigned char iv[16],\n                    const unsigned char *input,\n                    unsigned char *output );\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n/**\n * \\brief          AES-CFB128 buffer encryption/decryption.\n *\n * Note: Due to the nature of CFB you should use the same key schedule for\n * both encryption and decryption. So a context initialized with\n * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT.\n *\n * \\note           Upon exit, the content of the IV is updated so that you can\n *                 call the function same function again on the following\n *                 block(s) of data and get the same result as if it was\n *                 encrypted in one call. This allows a \"streaming\" usage.\n *                 If on the other hand you need to retain the contents of the\n *                 IV, you should either save it manually or use the cipher\n *                 module instead.\n *\n * \\param ctx      AES context\n * \\param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT\n * \\param length   length of the input data\n * \\param iv_off   offset in IV (updated after use)\n * \\param iv       initialization vector (updated after use)\n * \\param input    buffer holding the input data\n * \\param output   buffer holding the output data\n *\n * \\return         0 if successful\n */\nint mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,\n                       int mode,\n                       size_t length,\n                       size_t *iv_off,\n                       unsigned char iv[16],\n                       const unsigned char *input,\n                       unsigned char *output );\n\n/**\n * \\brief          AES-CFB8 buffer encryption/decryption.\n *\n * Note: Due to the nature of CFB you should use the same key schedule for\n * both encryption and decryption. So a context initialized with\n * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT.\n *\n * \\note           Upon exit, the content of the IV is updated so that you can\n *                 call the function same function again on the following\n *                 block(s) of data and get the same result as if it was\n *                 encrypted in one call. This allows a \"streaming\" usage.\n *                 If on the other hand you need to retain the contents of the\n *                 IV, you should either save it manually or use the cipher\n *                 module instead.\n *\n * \\param ctx      AES context\n * \\param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT\n * \\param length   length of the input data\n * \\param iv       initialization vector (updated after use)\n * \\param input    buffer holding the input data\n * \\param output   buffer holding the output data\n *\n * \\return         0 if successful\n */\nint mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,\n                    int mode,\n                    size_t length,\n                    unsigned char iv[16],\n                    const unsigned char *input,\n                    unsigned char *output );\n#endif /*MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n/**\n * \\brief               AES-CTR buffer encryption/decryption\n *\n * Warning: You have to keep the maximum use of your counter in mind!\n *\n * Note: Due to the nature of CTR you should use the same key schedule for\n * both encryption and decryption. So a context initialized with\n * mbedtls_aes_setkey_enc() for both MBEDTLS_AES_ENCRYPT and MBEDTLS_AES_DECRYPT.\n *\n * \\param ctx           AES context\n * \\param length        The length of the data\n * \\param nc_off        The offset in the current stream_block (for resuming\n *                      within current cipher stream). The offset pointer to\n *                      should be 0 at the start of a stream.\n * \\param nonce_counter The 128-bit nonce and counter.\n * \\param stream_block  The saved stream-block for resuming. Is overwritten\n *                      by the function.\n * \\param input         The input data stream\n * \\param output        The output data stream\n *\n * \\return         0 if successful\n */\nint mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,\n                       size_t length,\n                       size_t *nc_off,\n                       unsigned char nonce_counter[16],\n                       unsigned char stream_block[16],\n                       const unsigned char *input,\n                       unsigned char *output );\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n/**\n * \\brief           Internal AES block encryption function\n *                  (Only exposed to allow overriding it,\n *                  see MBEDTLS_AES_ENCRYPT_ALT)\n *\n * \\param ctx       AES context\n * \\param input     Plaintext block\n * \\param output    Output (ciphertext) block\n *\n * \\return          0 if successful\n */\nint mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,\n                                  const unsigned char input[16],\n                                  unsigned char output[16] );\n\n/**\n * \\brief           Internal AES block decryption function\n *                  (Only exposed to allow overriding it,\n *                  see MBEDTLS_AES_DECRYPT_ALT)\n *\n * \\param ctx       AES context\n * \\param input     Ciphertext block\n * \\param output    Output (plaintext) block\n *\n * \\return          0 if successful\n */\nint mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,\n                                  const unsigned char input[16],\n                                  unsigned char output[16] );\n\n#if !defined(MBEDTLS_DEPRECATED_REMOVED)\n#if defined(MBEDTLS_DEPRECATED_WARNING)\n#define MBEDTLS_DEPRECATED      __attribute__((deprecated))\n#else\n#define MBEDTLS_DEPRECATED\n#endif\n/**\n * \\brief           Deprecated internal AES block encryption function\n *                  without return value.\n *\n * \\deprecated      Superseded by mbedtls_aes_encrypt_ext() in 2.5.0\n *\n * \\param ctx       AES context\n * \\param input     Plaintext block\n * \\param output    Output (ciphertext) block\n */\nMBEDTLS_DEPRECATED void mbedtls_aes_encrypt( mbedtls_aes_context *ctx,\n                                             const unsigned char input[16],\n                                             unsigned char output[16] );\n\n/**\n * \\brief           Deprecated internal AES block decryption function\n *                  without return value.\n *\n * \\deprecated      Superseded by mbedtls_aes_decrypt_ext() in 2.5.0\n *\n * \\param ctx       AES context\n * \\param input     Ciphertext block\n * \\param output    Output (plaintext) block\n */\nMBEDTLS_DEPRECATED void mbedtls_aes_decrypt( mbedtls_aes_context *ctx,\n                                             const unsigned char input[16],\n                                             unsigned char output[16] );\n\n#undef MBEDTLS_DEPRECATED\n#endif /* !MBEDTLS_DEPRECATED_REMOVED */\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_AES_ALT */\n#include \"aes_alt.h\"\n#endif /* MBEDTLS_AES_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_aes_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* aes.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/aesni.h",
    "content": "/**\n * \\file aesni.h\n *\n * \\brief AES-NI for hardware AES acceleration on some Intel processors\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_AESNI_H\n#define MBEDTLS_AESNI_H\n\n#include \"aes.h\"\n\n#define MBEDTLS_AESNI_AES      0x02000000u\n#define MBEDTLS_AESNI_CLMUL    0x00000002u\n\n#if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) &&  \\\n    ( defined(__amd64__) || defined(__x86_64__) )   &&  \\\n    ! defined(MBEDTLS_HAVE_X86_64)\n#define MBEDTLS_HAVE_X86_64\n#endif\n\n#if defined(MBEDTLS_HAVE_X86_64)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          AES-NI features detection routine\n *\n * \\param what     The feature to detect\n *                 (MBEDTLS_AESNI_AES or MBEDTLS_AESNI_CLMUL)\n *\n * \\return         1 if CPU has support for the feature, 0 otherwise\n */\nint mbedtls_aesni_has_support( unsigned int what );\n\n/**\n * \\brief          AES-NI AES-ECB block en(de)cryption\n *\n * \\param ctx      AES context\n * \\param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT\n * \\param input    16-byte input block\n * \\param output   16-byte output block\n *\n * \\return         0 on success (cannot fail)\n */\nint mbedtls_aesni_crypt_ecb( mbedtls_aes_context *ctx,\n                     int mode,\n                     const unsigned char input[16],\n                     unsigned char output[16] );\n\n/**\n * \\brief          GCM multiplication: c = a * b in GF(2^128)\n *\n * \\param c        Result\n * \\param a        First operand\n * \\param b        Second operand\n *\n * \\note           Both operands and result are bit strings interpreted as\n *                 elements of GF(2^128) as per the GCM spec.\n */\nvoid mbedtls_aesni_gcm_mult( unsigned char c[16],\n                     const unsigned char a[16],\n                     const unsigned char b[16] );\n\n/**\n * \\brief           Compute decryption round keys from encryption round keys\n *\n * \\param invkey    Round keys for the equivalent inverse cipher\n * \\param fwdkey    Original round keys (for encryption)\n * \\param nr        Number of rounds (that is, number of round keys minus one)\n */\nvoid mbedtls_aesni_inverse_key( unsigned char *invkey,\n                        const unsigned char *fwdkey, int nr );\n\n/**\n * \\brief           Perform key expansion (for encryption)\n *\n * \\param rk        Destination buffer where the round keys are written\n * \\param key       Encryption key\n * \\param bits      Key size in bits (must be 128, 192 or 256)\n *\n * \\return          0 if successful, or MBEDTLS_ERR_AES_INVALID_KEY_LENGTH\n */\nint mbedtls_aesni_setkey_enc( unsigned char *rk,\n                      const unsigned char *key,\n                      size_t bits );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_HAVE_X86_64 */\n\n#endif /* MBEDTLS_AESNI_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/arc4.h",
    "content": "/**\n * \\file arc4.h\n *\n * \\brief The ARCFOUR stream cipher\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_ARC4_H\n#define MBEDTLS_ARC4_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n\n#if !defined(MBEDTLS_ARC4_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          ARC4 context structure\n */\ntypedef struct\n{\n    int x;                      /*!< permutation index */\n    int y;                      /*!< permutation index */\n    unsigned char m[256];       /*!< permutation table */\n}\nmbedtls_arc4_context;\n\n/**\n * \\brief          Initialize ARC4 context\n *\n * \\param ctx      ARC4 context to be initialized\n */\nvoid mbedtls_arc4_init( mbedtls_arc4_context *ctx );\n\n/**\n * \\brief          Clear ARC4 context\n *\n * \\param ctx      ARC4 context to be cleared\n */\nvoid mbedtls_arc4_free( mbedtls_arc4_context *ctx );\n\n/**\n * \\brief          ARC4 key schedule\n *\n * \\param ctx      ARC4 context to be setup\n * \\param key      the secret key\n * \\param keylen   length of the key, in bytes\n */\nvoid mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key,\n                 unsigned int keylen );\n\n/**\n * \\brief          ARC4 cipher function\n *\n * \\param ctx      ARC4 context\n * \\param length   length of the input data\n * \\param input    buffer holding the input data\n * \\param output   buffer for the output data\n *\n * \\return         0 if successful\n */\nint mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input,\n                unsigned char *output );\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_ARC4_ALT */\n#include \"arc4_alt.h\"\n#endif /* MBEDTLS_ARC4_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_arc4_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* arc4.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/asn1.h",
    "content": "/**\n * \\file asn1.h\n *\n * \\brief Generic ASN.1 parsing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_ASN1_H\n#define MBEDTLS_ASN1_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n\n#if defined(MBEDTLS_BIGNUM_C)\n#include \"bignum.h\"\n#endif\n\n/**\n * \\addtogroup asn1_module\n * \\{\n */\n\n/**\n * \\name ASN1 Error codes\n * These error codes are OR'ed to X509 error codes for\n * higher error granularity.\n * ASN1 is a standard to specify data structures.\n * \\{\n */\n#define MBEDTLS_ERR_ASN1_OUT_OF_DATA                      -0x0060  /**< Out of data when parsing an ASN1 data structure. */\n#define MBEDTLS_ERR_ASN1_UNEXPECTED_TAG                   -0x0062  /**< ASN1 tag was of an unexpected value. */\n#define MBEDTLS_ERR_ASN1_INVALID_LENGTH                   -0x0064  /**< Error when trying to determine the length or invalid length. */\n#define MBEDTLS_ERR_ASN1_LENGTH_MISMATCH                  -0x0066  /**< Actual length differs from expected length. */\n#define MBEDTLS_ERR_ASN1_INVALID_DATA                     -0x0068  /**< Data is invalid. (not used) */\n#define MBEDTLS_ERR_ASN1_ALLOC_FAILED                     -0x006A  /**< Memory allocation failed */\n#define MBEDTLS_ERR_ASN1_BUF_TOO_SMALL                    -0x006C  /**< Buffer too small when writing ASN.1 data structure. */\n\n/* \\} name */\n\n/**\n * \\name DER constants\n * These constants comply with DER encoded the ANS1 type tags.\n * DER encoding uses hexadecimal representation.\n * An example DER sequence is:\\n\n * - 0x02 -- tag indicating INTEGER\n * - 0x01 -- length in octets\n * - 0x05 -- value\n * Such sequences are typically read into \\c ::mbedtls_x509_buf.\n * \\{\n */\n#define MBEDTLS_ASN1_BOOLEAN                 0x01\n#define MBEDTLS_ASN1_INTEGER                 0x02\n#define MBEDTLS_ASN1_BIT_STRING              0x03\n#define MBEDTLS_ASN1_OCTET_STRING            0x04\n#define MBEDTLS_ASN1_NULL                    0x05\n#define MBEDTLS_ASN1_OID                     0x06\n#define MBEDTLS_ASN1_UTF8_STRING             0x0C\n#define MBEDTLS_ASN1_SEQUENCE                0x10\n#define MBEDTLS_ASN1_SET                     0x11\n#define MBEDTLS_ASN1_PRINTABLE_STRING        0x13\n#define MBEDTLS_ASN1_T61_STRING              0x14\n#define MBEDTLS_ASN1_IA5_STRING              0x16\n#define MBEDTLS_ASN1_UTC_TIME                0x17\n#define MBEDTLS_ASN1_GENERALIZED_TIME        0x18\n#define MBEDTLS_ASN1_UNIVERSAL_STRING        0x1C\n#define MBEDTLS_ASN1_BMP_STRING              0x1E\n#define MBEDTLS_ASN1_PRIMITIVE               0x00\n#define MBEDTLS_ASN1_CONSTRUCTED             0x20\n#define MBEDTLS_ASN1_CONTEXT_SPECIFIC        0x80\n/* \\} name */\n/* \\} addtogroup asn1_module */\n\n/** Returns the size of the binary string, without the trailing \\\\0 */\n#define MBEDTLS_OID_SIZE(x) (sizeof(x) - 1)\n\n/**\n * Compares an mbedtls_asn1_buf structure to a reference OID.\n *\n * Only works for 'defined' oid_str values (MBEDTLS_OID_HMAC_SHA1), you cannot use a\n * 'unsigned char *oid' here!\n */\n#define MBEDTLS_OID_CMP(oid_str, oid_buf)                                   \\\n        ( ( MBEDTLS_OID_SIZE(oid_str) != (oid_buf)->len ) ||                \\\n          memcmp( (oid_str), (oid_buf)->p, (oid_buf)->len) != 0 )\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\name Functions to parse ASN.1 data structures\n * \\{\n */\n\n/**\n * Type-length-value structure that allows for ASN1 using DER.\n */\ntypedef struct mbedtls_asn1_buf\n{\n    int tag;                /**< ASN1 type, e.g. MBEDTLS_ASN1_UTF8_STRING. */\n    size_t len;             /**< ASN1 length, in octets. */\n    unsigned char *p;       /**< ASN1 data, e.g. in ASCII. */\n}\nmbedtls_asn1_buf;\n\n/**\n * Container for ASN1 bit strings.\n */\ntypedef struct mbedtls_asn1_bitstring\n{\n    size_t len;                 /**< ASN1 length, in octets. */\n    unsigned char unused_bits;  /**< Number of unused bits at the end of the string */\n    unsigned char *p;           /**< Raw ASN1 data for the bit string */\n}\nmbedtls_asn1_bitstring;\n\n/**\n * Container for a sequence of ASN.1 items\n */\ntypedef struct mbedtls_asn1_sequence\n{\n    mbedtls_asn1_buf buf;                   /**< Buffer containing the given ASN.1 item. */\n    struct mbedtls_asn1_sequence *next;    /**< The next entry in the sequence. */\n}\nmbedtls_asn1_sequence;\n\n/**\n * Container for a sequence or list of 'named' ASN.1 data items\n */\ntypedef struct mbedtls_asn1_named_data\n{\n    mbedtls_asn1_buf oid;                   /**< The object identifier. */\n    mbedtls_asn1_buf val;                   /**< The named value. */\n    struct mbedtls_asn1_named_data *next;  /**< The next entry in the sequence. */\n    unsigned char next_merged;      /**< Merge next item into the current one? */\n}\nmbedtls_asn1_named_data;\n\n/**\n * \\brief       Get the length of an ASN.1 element.\n *              Updates the pointer to immediately behind the length.\n *\n * \\param p     The position in the ASN.1 data\n * \\param end   End of data\n * \\param len   The variable that will receive the value\n *\n * \\return      0 if successful, MBEDTLS_ERR_ASN1_OUT_OF_DATA on reaching\n *              end of data, MBEDTLS_ERR_ASN1_INVALID_LENGTH if length is\n *              unparseable.\n */\nint mbedtls_asn1_get_len( unsigned char **p,\n                  const unsigned char *end,\n                  size_t *len );\n\n/**\n * \\brief       Get the tag and length of the tag. Check for the requested tag.\n *              Updates the pointer to immediately behind the tag and length.\n *\n * \\param p     The position in the ASN.1 data\n * \\param end   End of data\n * \\param len   The variable that will receive the length\n * \\param tag   The expected tag\n *\n * \\return      0 if successful, MBEDTLS_ERR_ASN1_UNEXPECTED_TAG if tag did\n *              not match requested tag, or another specific ASN.1 error code.\n */\nint mbedtls_asn1_get_tag( unsigned char **p,\n                  const unsigned char *end,\n                  size_t *len, int tag );\n\n/**\n * \\brief       Retrieve a boolean ASN.1 tag and its value.\n *              Updates the pointer to immediately behind the full tag.\n *\n * \\param p     The position in the ASN.1 data\n * \\param end   End of data\n * \\param val   The variable that will receive the value\n *\n * \\return      0 if successful or a specific ASN.1 error code.\n */\nint mbedtls_asn1_get_bool( unsigned char **p,\n                   const unsigned char *end,\n                   int *val );\n\n/**\n * \\brief       Retrieve an integer ASN.1 tag and its value.\n *              Updates the pointer to immediately behind the full tag.\n *\n * \\param p     The position in the ASN.1 data\n * \\param end   End of data\n * \\param val   The variable that will receive the value\n *\n * \\return      0 if successful or a specific ASN.1 error code.\n */\nint mbedtls_asn1_get_int( unsigned char **p,\n                  const unsigned char *end,\n                  int *val );\n\n/**\n * \\brief       Retrieve a bitstring ASN.1 tag and its value.\n *              Updates the pointer to immediately behind the full tag.\n *\n * \\param p     The position in the ASN.1 data\n * \\param end   End of data\n * \\param bs    The variable that will receive the value\n *\n * \\return      0 if successful or a specific ASN.1 error code.\n */\nint mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end,\n                        mbedtls_asn1_bitstring *bs);\n\n/**\n * \\brief       Retrieve a bitstring ASN.1 tag without unused bits and its\n *              value.\n *              Updates the pointer to the beginning of the bit/octet string.\n *\n * \\param p     The position in the ASN.1 data\n * \\param end   End of data\n * \\param len   Length of the actual bit/octect string in bytes\n *\n * \\return      0 if successful or a specific ASN.1 error code.\n */\nint mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end,\n                             size_t *len );\n\n/**\n * \\brief       Parses and splits an ASN.1 \"SEQUENCE OF <tag>\"\n *              Updated the pointer to immediately behind the full sequence tag.\n *\n * \\param p     The position in the ASN.1 data\n * \\param end   End of data\n * \\param cur   First variable in the chain to fill\n * \\param tag   Type of sequence\n *\n * \\return      0 if successful or a specific ASN.1 error code.\n */\nint mbedtls_asn1_get_sequence_of( unsigned char **p,\n                          const unsigned char *end,\n                          mbedtls_asn1_sequence *cur,\n                          int tag);\n\n#if defined(MBEDTLS_BIGNUM_C)\n/**\n * \\brief       Retrieve a MPI value from an integer ASN.1 tag.\n *              Updates the pointer to immediately behind the full tag.\n *\n * \\param p     The position in the ASN.1 data\n * \\param end   End of data\n * \\param X     The MPI that will receive the value\n *\n * \\return      0 if successful or a specific ASN.1 or MPI error code.\n */\nint mbedtls_asn1_get_mpi( unsigned char **p,\n                  const unsigned char *end,\n                  mbedtls_mpi *X );\n#endif /* MBEDTLS_BIGNUM_C */\n\n/**\n * \\brief       Retrieve an AlgorithmIdentifier ASN.1 sequence.\n *              Updates the pointer to immediately behind the full\n *              AlgorithmIdentifier.\n *\n * \\param p     The position in the ASN.1 data\n * \\param end   End of data\n * \\param alg   The buffer to receive the OID\n * \\param params The buffer to receive the params (if any)\n *\n * \\return      0 if successful or a specific ASN.1 or MPI error code.\n */\nint mbedtls_asn1_get_alg( unsigned char **p,\n                  const unsigned char *end,\n                  mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params );\n\n/**\n * \\brief       Retrieve an AlgorithmIdentifier ASN.1 sequence with NULL or no\n *              params.\n *              Updates the pointer to immediately behind the full\n *              AlgorithmIdentifier.\n *\n * \\param p     The position in the ASN.1 data\n * \\param end   End of data\n * \\param alg   The buffer to receive the OID\n *\n * \\return      0 if successful or a specific ASN.1 or MPI error code.\n */\nint mbedtls_asn1_get_alg_null( unsigned char **p,\n                       const unsigned char *end,\n                       mbedtls_asn1_buf *alg );\n\n/**\n * \\brief       Find a specific named_data entry in a sequence or list based on\n *              the OID.\n *\n * \\param list  The list to seek through\n * \\param oid   The OID to look for\n * \\param len   Size of the OID\n *\n * \\return      NULL if not found, or a pointer to the existing entry.\n */\nmbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list,\n                                       const char *oid, size_t len );\n\n/**\n * \\brief       Free a mbedtls_asn1_named_data entry\n *\n * \\param entry The named data entry to free\n */\nvoid mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *entry );\n\n/**\n * \\brief       Free all entries in a mbedtls_asn1_named_data list\n *              Head will be set to NULL\n *\n * \\param head  Pointer to the head of the list of named data entries to free\n */\nvoid mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* asn1.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/asn1write.h",
    "content": "/**\n * \\file asn1write.h\n *\n * \\brief ASN.1 buffer writing functionality\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_ASN1_WRITE_H\n#define MBEDTLS_ASN1_WRITE_H\n\n#include \"asn1.h\"\n\n#define MBEDTLS_ASN1_CHK_ADD(g, f) do { if( ( ret = f ) < 0 ) return( ret ); else   \\\n                                g += ret; } while( 0 )\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief           Write a length field in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param len       the length to write\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len );\n\n/**\n * \\brief           Write a ASN.1 tag in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param tag       the tag to write\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start,\n                    unsigned char tag );\n\n/**\n * \\brief           Write raw buffer data\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param buf       data buffer to write\n * \\param size      length of the data buffer\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start,\n                           const unsigned char *buf, size_t size );\n\n#if defined(MBEDTLS_BIGNUM_C)\n/**\n * \\brief           Write a big number (MBEDTLS_ASN1_INTEGER) in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param X         the MPI to write\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_mpi( unsigned char **p, unsigned char *start, const mbedtls_mpi *X );\n#endif /* MBEDTLS_BIGNUM_C */\n\n/**\n * \\brief           Write a NULL tag (MBEDTLS_ASN1_NULL) with zero data in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_null( unsigned char **p, unsigned char *start );\n\n/**\n * \\brief           Write an OID tag (MBEDTLS_ASN1_OID) and data in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param oid       the OID to write\n * \\param oid_len   length of the OID\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_oid( unsigned char **p, unsigned char *start,\n                    const char *oid, size_t oid_len );\n\n/**\n * \\brief           Write an AlgorithmIdentifier sequence in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param oid       the OID of the algorithm\n * \\param oid_len   length of the OID\n * \\param par_len   length of parameters, which must be already written.\n *                  If 0, NULL parameters are added\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start,\n                                     const char *oid, size_t oid_len,\n                                     size_t par_len );\n\n/**\n * \\brief           Write a boolean tag (MBEDTLS_ASN1_BOOLEAN) and value in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param boolean   0 or 1\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_bool( unsigned char **p, unsigned char *start, int boolean );\n\n/**\n * \\brief           Write an int tag (MBEDTLS_ASN1_INTEGER) and value in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param val       the integer value\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_int( unsigned char **p, unsigned char *start, int val );\n\n/**\n * \\brief           Write a printable string tag (MBEDTLS_ASN1_PRINTABLE_STRING) and\n *                  value in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param text      the text to write\n * \\param text_len  length of the text\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_printable_string( unsigned char **p, unsigned char *start,\n                                 const char *text, size_t text_len );\n\n/**\n * \\brief           Write an IA5 string tag (MBEDTLS_ASN1_IA5_STRING) and\n *                  value in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param text      the text to write\n * \\param text_len  length of the text\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start,\n                           const char *text, size_t text_len );\n\n/**\n * \\brief           Write a bitstring tag (MBEDTLS_ASN1_BIT_STRING) and\n *                  value in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param buf       the bitstring\n * \\param bits      the total number of bits in the bitstring\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start,\n                          const unsigned char *buf, size_t bits );\n\n/**\n * \\brief           Write an octet string tag (MBEDTLS_ASN1_OCTET_STRING) and\n *                  value in ASN.1 format\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param buf       data buffer to write\n * \\param size      length of the data buffer\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_asn1_write_octet_string( unsigned char **p, unsigned char *start,\n                             const unsigned char *buf, size_t size );\n\n/**\n * \\brief           Create or find a specific named_data entry for writing in a\n *                  sequence or list based on the OID. If not already in there,\n *                  a new entry is added to the head of the list.\n *                  Warning: Destructive behaviour for the val data!\n *\n * \\param list      Pointer to the location of the head of the list to seek\n *                  through (will be updated in case of a new entry)\n * \\param oid       The OID to look for\n * \\param oid_len   Size of the OID\n * \\param val       Data to store (can be NULL if you want to fill it by hand)\n * \\param val_len   Minimum length of the data buffer needed\n *\n * \\return      NULL if if there was a memory allocation error, or a pointer\n *              to the new / existing entry.\n */\nmbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data **list,\n                                        const char *oid, size_t oid_len,\n                                        const unsigned char *val,\n                                        size_t val_len );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_ASN1_WRITE_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/base64.h",
    "content": "/**\n * \\file base64.h\n *\n * \\brief RFC 1521 base64 encoding/decoding\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_BASE64_H\n#define MBEDTLS_BASE64_H\n\n#include <stddef.h>\n\n#define MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL               -0x002A  /**< Output buffer too small. */\n#define MBEDTLS_ERR_BASE64_INVALID_CHARACTER              -0x002C  /**< Invalid character in input. */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Encode a buffer into base64 format\n *\n * \\param dst      destination buffer\n * \\param dlen     size of the destination buffer\n * \\param olen     number of bytes written\n * \\param src      source buffer\n * \\param slen     amount of data to be encoded\n *\n * \\return         0 if successful, or MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL.\n *                 *olen is always updated to reflect the amount\n *                 of data that has (or would have) been written.\n *                 If that length cannot be represented, then no data is\n *                 written to the buffer and *olen is set to the maximum\n *                 length representable as a size_t.\n *\n * \\note           Call this function with dlen = 0 to obtain the\n *                 required buffer size in *olen\n */\nint mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen,\n                   const unsigned char *src, size_t slen );\n\n/**\n * \\brief          Decode a base64-formatted buffer\n *\n * \\param dst      destination buffer (can be NULL for checking size)\n * \\param dlen     size of the destination buffer\n * \\param olen     number of bytes written\n * \\param src      source buffer\n * \\param slen     amount of data to be decoded\n *\n * \\return         0 if successful, MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL, or\n *                 MBEDTLS_ERR_BASE64_INVALID_CHARACTER if the input data is\n *                 not correct. *olen is always updated to reflect the amount\n *                 of data that has (or would have) been written.\n *\n * \\note           Call this function with *dst = NULL or dlen = 0 to obtain\n *                 the required buffer size in *olen\n */\nint mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,\n                   const unsigned char *src, size_t slen );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_base64_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* base64.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/bignum.h",
    "content": "/**\n * \\file bignum.h\n *\n * \\brief  Multi-precision integer library\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_BIGNUM_H\n#define MBEDTLS_BIGNUM_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if defined(MBEDTLS_FS_IO)\n#include <stdio.h>\n#endif\n\n#define MBEDTLS_ERR_MPI_FILE_IO_ERROR                     -0x0002  /**< An error occurred while reading from or writing to a file. */\n#define MBEDTLS_ERR_MPI_BAD_INPUT_DATA                    -0x0004  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_MPI_INVALID_CHARACTER                 -0x0006  /**< There is an invalid character in the digit string. */\n#define MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL                  -0x0008  /**< The buffer is too small to write to. */\n#define MBEDTLS_ERR_MPI_NEGATIVE_VALUE                    -0x000A  /**< The input arguments are negative or result in illegal output. */\n#define MBEDTLS_ERR_MPI_DIVISION_BY_ZERO                  -0x000C  /**< The input argument for division is zero, which is not allowed. */\n#define MBEDTLS_ERR_MPI_NOT_ACCEPTABLE                    -0x000E  /**< The input arguments are not acceptable. */\n#define MBEDTLS_ERR_MPI_ALLOC_FAILED                      -0x0010  /**< Memory allocation failed. */\n\n#define MBEDTLS_MPI_CHK(f) do { if( ( ret = f ) != 0 ) goto cleanup; } while( 0 )\n\n/*\n * Maximum size MPIs are allowed to grow to in number of limbs.\n */\n#define MBEDTLS_MPI_MAX_LIMBS                             10000\n\n#if !defined(MBEDTLS_MPI_WINDOW_SIZE)\n/*\n * Maximum window size used for modular exponentiation. Default: 6\n * Minimum value: 1. Maximum value: 6.\n *\n * Result is an array of ( 2 << MBEDTLS_MPI_WINDOW_SIZE ) MPIs used\n * for the sliding window calculation. (So 64 by default)\n *\n * Reduction in size, reduces speed.\n */\n#define MBEDTLS_MPI_WINDOW_SIZE                           6        /**< Maximum windows size used. */\n#endif /* !MBEDTLS_MPI_WINDOW_SIZE */\n\n#if !defined(MBEDTLS_MPI_MAX_SIZE)\n/*\n * Maximum size of MPIs allowed in bits and bytes for user-MPIs.\n * ( Default: 512 bytes => 4096 bits, Maximum tested: 2048 bytes => 16384 bits )\n *\n * Note: Calculations can results temporarily in larger MPIs. So the number\n * of limbs required (MBEDTLS_MPI_MAX_LIMBS) is higher.\n */\n#define MBEDTLS_MPI_MAX_SIZE                              1024     /**< Maximum number of bytes for usable MPIs. */\n#endif /* !MBEDTLS_MPI_MAX_SIZE */\n\n#define MBEDTLS_MPI_MAX_BITS                              ( 8 * MBEDTLS_MPI_MAX_SIZE )    /**< Maximum number of bits for usable MPIs. */\n\n/*\n * When reading from files with mbedtls_mpi_read_file() and writing to files with\n * mbedtls_mpi_write_file() the buffer should have space\n * for a (short) label, the MPI (in the provided radix), the newline\n * characters and the '\\0'.\n *\n * By default we assume at least a 10 char label, a minimum radix of 10\n * (decimal) and a maximum of 4096 bit numbers (1234 decimal chars).\n * Autosized at compile time for at least a 10 char label, a minimum radix\n * of 10 (decimal) for a number of MBEDTLS_MPI_MAX_BITS size.\n *\n * This used to be statically sized to 1250 for a maximum of 4096 bit\n * numbers (1234 decimal chars).\n *\n * Calculate using the formula:\n *  MBEDTLS_MPI_RW_BUFFER_SIZE = ceil(MBEDTLS_MPI_MAX_BITS / ln(10) * ln(2)) +\n *                                LabelSize + 6\n */\n#define MBEDTLS_MPI_MAX_BITS_SCALE100          ( 100 * MBEDTLS_MPI_MAX_BITS )\n#define MBEDTLS_LN_2_DIV_LN_10_SCALE100                 332\n#define MBEDTLS_MPI_RW_BUFFER_SIZE             ( ((MBEDTLS_MPI_MAX_BITS_SCALE100 + MBEDTLS_LN_2_DIV_LN_10_SCALE100 - 1) / MBEDTLS_LN_2_DIV_LN_10_SCALE100) + 10 + 6 )\n\n/*\n * Define the base integer type, architecture-wise.\n *\n * 32 or 64-bit integer types can be forced regardless of the underlying\n * architecture by defining MBEDTLS_HAVE_INT32 or MBEDTLS_HAVE_INT64\n * respectively and undefining MBEDTLS_HAVE_ASM.\n *\n * Double-width integers (e.g. 128-bit in 64-bit architectures) can be\n * disabled by defining MBEDTLS_NO_UDBL_DIVISION.\n */\n#if !defined(MBEDTLS_HAVE_INT32)\n    #if defined(_MSC_VER) && defined(_M_AMD64)\n        /* Always choose 64-bit when using MSC */\n        #if !defined(MBEDTLS_HAVE_INT64)\n            #define MBEDTLS_HAVE_INT64\n        #endif /* !MBEDTLS_HAVE_INT64 */\n        typedef  int64_t mbedtls_mpi_sint;\n        typedef uint64_t mbedtls_mpi_uint;\n    #elif defined(__GNUC__) && (                         \\\n        defined(__amd64__) || defined(__x86_64__)     || \\\n        defined(__ppc64__) || defined(__powerpc64__)  || \\\n        defined(__ia64__)  || defined(__alpha__)      || \\\n        ( defined(__sparc__) && defined(__arch64__) ) || \\\n        defined(__s390x__) || defined(__mips64) )\n        #if !defined(MBEDTLS_HAVE_INT64)\n            #define MBEDTLS_HAVE_INT64\n        #endif /* MBEDTLS_HAVE_INT64 */\n        typedef  int64_t mbedtls_mpi_sint;\n        typedef uint64_t mbedtls_mpi_uint;\n        #if !defined(MBEDTLS_NO_UDBL_DIVISION)\n            /* mbedtls_t_udbl defined as 128-bit unsigned int */\n            typedef unsigned int mbedtls_t_udbl __attribute__((mode(TI)));\n            #define MBEDTLS_HAVE_UDBL\n        #endif /* !MBEDTLS_NO_UDBL_DIVISION */\n    #elif defined(__ARMCC_VERSION) && defined(__aarch64__)\n        /*\n         * __ARMCC_VERSION is defined for both armcc and armclang and\n         * __aarch64__ is only defined by armclang when compiling 64-bit code\n         */\n        #if !defined(MBEDTLS_HAVE_INT64)\n            #define MBEDTLS_HAVE_INT64\n        #endif /* !MBEDTLS_HAVE_INT64 */\n        typedef  int64_t mbedtls_mpi_sint;\n        typedef uint64_t mbedtls_mpi_uint;\n        #if !defined(MBEDTLS_NO_UDBL_DIVISION)\n            /* mbedtls_t_udbl defined as 128-bit unsigned int */\n            typedef __uint128_t mbedtls_t_udbl;\n            #define MBEDTLS_HAVE_UDBL\n        #endif /* !MBEDTLS_NO_UDBL_DIVISION */\n    #elif defined(MBEDTLS_HAVE_INT64)\n        /* Force 64-bit integers with unknown compiler */\n        typedef  int64_t mbedtls_mpi_sint;\n        typedef uint64_t mbedtls_mpi_uint;\n    #endif\n#endif /* !MBEDTLS_HAVE_INT32 */\n\n#if !defined(MBEDTLS_HAVE_INT64)\n    /* Default to 32-bit compilation */\n    #if !defined(MBEDTLS_HAVE_INT32)\n        #define MBEDTLS_HAVE_INT32\n    #endif /* !MBEDTLS_HAVE_INT32 */\n    typedef  int32_t mbedtls_mpi_sint;\n    typedef uint32_t mbedtls_mpi_uint;\n    #if !defined(MBEDTLS_NO_UDBL_DIVISION)\n        typedef uint64_t mbedtls_t_udbl;\n        #define MBEDTLS_HAVE_UDBL\n    #endif /* !MBEDTLS_NO_UDBL_DIVISION */\n#endif /* !MBEDTLS_HAVE_INT64 */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          MPI structure\n */\ntypedef struct\n{\n    int s;              /*!<  integer sign      */\n    size_t n;           /*!<  total # of limbs  */\n    mbedtls_mpi_uint *p;          /*!<  pointer to limbs  */\n}\nmbedtls_mpi;\n\n/**\n * \\brief           Initialize one MPI (make internal references valid)\n *                  This just makes it ready to be set or freed,\n *                  but does not define a value for the MPI.\n *\n * \\param X         One MPI to initialize.\n */\nvoid mbedtls_mpi_init( mbedtls_mpi *X );\n\n/**\n * \\brief          Unallocate one MPI\n *\n * \\param X        One MPI to unallocate.\n */\nvoid mbedtls_mpi_free( mbedtls_mpi *X );\n\n/**\n * \\brief          Enlarge to the specified number of limbs\n *\n * \\param X        MPI to grow\n * \\param nblimbs  The target number of limbs\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs );\n\n/**\n * \\brief          Resize down, keeping at least the specified number of limbs\n *\n * \\param X        MPI to shrink\n * \\param nblimbs  The minimum number of limbs to keep\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs );\n\n/**\n * \\brief          Copy the contents of Y into X\n *\n * \\param X        Destination MPI\n * \\param Y        Source MPI\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y );\n\n/**\n * \\brief          Swap the contents of X and Y\n *\n * \\param X        First MPI value\n * \\param Y        Second MPI value\n */\nvoid mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y );\n\n/**\n * \\brief          Safe conditional assignement X = Y if assign is 1\n *\n * \\param X        MPI to conditionally assign to\n * \\param Y        Value to be assigned\n * \\param assign   1: perform the assignment, 0: keep X's original value\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *\n * \\note           This function is equivalent to\n *                      if( assign ) mbedtls_mpi_copy( X, Y );\n *                 except that it avoids leaking any information about whether\n *                 the assignment was done or not (the above code may leak\n *                 information through branch prediction and/or memory access\n *                 patterns analysis).\n */\nint mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign );\n\n/**\n * \\brief          Safe conditional swap X <-> Y if swap is 1\n *\n * \\param X        First mbedtls_mpi value\n * \\param Y        Second mbedtls_mpi value\n * \\param assign   1: perform the swap, 0: keep X and Y's original values\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *\n * \\note           This function is equivalent to\n *                      if( assign ) mbedtls_mpi_swap( X, Y );\n *                 except that it avoids leaking any information about whether\n *                 the assignment was done or not (the above code may leak\n *                 information through branch prediction and/or memory access\n *                 patterns analysis).\n */\nint mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign );\n\n/**\n * \\brief          Set value from integer\n *\n * \\param X        MPI to set\n * \\param z        Value to use\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z );\n\n/**\n * \\brief          Get a specific bit from X\n *\n * \\param X        MPI to use\n * \\param pos      Zero-based index of the bit in X\n *\n * \\return         Either a 0 or a 1\n */\nint mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos );\n\n/**\n * \\brief          Set a bit of X to a specific value of 0 or 1\n *\n * \\note           Will grow X if necessary to set a bit to 1 in a not yet\n *                 existing limb. Will not grow if bit should be set to 0\n *\n * \\param X        MPI to use\n * \\param pos      Zero-based index of the bit in X\n * \\param val      The value to set the bit to (0 or 1)\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_MPI_BAD_INPUT_DATA if val is not 0 or 1\n */\nint mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val );\n\n/**\n * \\brief          Return the number of zero-bits before the least significant\n *                 '1' bit\n *\n * Note: Thus also the zero-based index of the least significant '1' bit\n *\n * \\param X        MPI to use\n */\nsize_t mbedtls_mpi_lsb( const mbedtls_mpi *X );\n\n/**\n * \\brief          Return the number of bits up to and including the most\n *                 significant '1' bit'\n *\n * Note: Thus also the one-based index of the most significant '1' bit\n *\n * \\param X        MPI to use\n */\nsize_t mbedtls_mpi_bitlen( const mbedtls_mpi *X );\n\n/**\n * \\brief          Return the total size in bytes\n *\n * \\param X        MPI to use\n */\nsize_t mbedtls_mpi_size( const mbedtls_mpi *X );\n\n/**\n * \\brief          Import from an ASCII string\n *\n * \\param X        Destination MPI\n * \\param radix    Input numeric base\n * \\param s        Null-terminated string buffer\n *\n * \\return         0 if successful, or a MBEDTLS_ERR_MPI_XXX error code\n */\nint mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s );\n\n/**\n * \\brief          Export into an ASCII string\n *\n * \\param X        Source MPI\n * \\param radix    Output numeric base\n * \\param buf      Buffer to write the string to\n * \\param buflen   Length of buf\n * \\param olen     Length of the string written, including final NUL byte\n *\n * \\return         0 if successful, or a MBEDTLS_ERR_MPI_XXX error code.\n *                 *olen is always updated to reflect the amount\n *                 of data that has (or would have) been written.\n *\n * \\note           Call this function with buflen = 0 to obtain the\n *                 minimum required buffer size in *olen.\n */\nint mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix,\n                              char *buf, size_t buflen, size_t *olen );\n\n#if defined(MBEDTLS_FS_IO)\n/**\n * \\brief          Read MPI from a line in an opened file\n *\n * \\param X        Destination MPI\n * \\param radix    Input numeric base\n * \\param fin      Input file handle\n *\n * \\return         0 if successful, MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if\n *                 the file read buffer is too small or a\n *                 MBEDTLS_ERR_MPI_XXX error code\n *\n * \\note           On success, this function advances the file stream\n *                 to the end of the current line or to EOF.\n *\n *                 The function returns 0 on an empty line.\n *\n *                 Leading whitespaces are ignored, as is a\n *                 '0x' prefix for radix 16.\n *\n */\nint mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin );\n\n/**\n * \\brief          Write X into an opened file, or stdout if fout is NULL\n *\n * \\param p        Prefix, can be NULL\n * \\param X        Source MPI\n * \\param radix    Output numeric base\n * \\param fout     Output file handle (can be NULL)\n *\n * \\return         0 if successful, or a MBEDTLS_ERR_MPI_XXX error code\n *\n * \\note           Set fout == NULL to print X on the console.\n */\nint mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout );\n#endif /* MBEDTLS_FS_IO */\n\n/**\n * \\brief          Import X from unsigned binary data, big endian\n *\n * \\param X        Destination MPI\n * \\param buf      Input buffer\n * \\param buflen   Input buffer size\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen );\n\n/**\n * \\brief          Export X into unsigned binary data, big endian.\n *                 Always fills the whole buffer, which will start with zeros\n *                 if the number is smaller.\n *\n * \\param X        Source MPI\n * \\param buf      Output buffer\n * \\param buflen   Output buffer size\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL if buf isn't large enough\n */\nint mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen );\n\n/**\n * \\brief          Left-shift: X <<= count\n *\n * \\param X        MPI to shift\n * \\param count    Amount to shift\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count );\n\n/**\n * \\brief          Right-shift: X >>= count\n *\n * \\param X        MPI to shift\n * \\param count    Amount to shift\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count );\n\n/**\n * \\brief          Compare unsigned values\n *\n * \\param X        Left-hand MPI\n * \\param Y        Right-hand MPI\n *\n * \\return         1 if |X| is greater than |Y|,\n *                -1 if |X| is lesser  than |Y| or\n *                 0 if |X| is equal to |Y|\n */\nint mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y );\n\n/**\n * \\brief          Compare signed values\n *\n * \\param X        Left-hand MPI\n * \\param Y        Right-hand MPI\n *\n * \\return         1 if X is greater than Y,\n *                -1 if X is lesser  than Y or\n *                 0 if X is equal to Y\n */\nint mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y );\n\n/**\n * \\brief          Compare signed values\n *\n * \\param X        Left-hand MPI\n * \\param z        The integer value to compare to\n *\n * \\return         1 if X is greater than z,\n *                -1 if X is lesser  than z or\n *                 0 if X is equal to z\n */\nint mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z );\n\n/**\n * \\brief          Unsigned addition: X = |A| + |B|\n *\n * \\param X        Destination MPI\n * \\param A        Left-hand MPI\n * \\param B        Right-hand MPI\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );\n\n/**\n * \\brief          Unsigned subtraction: X = |A| - |B|\n *\n * \\param X        Destination MPI\n * \\param A        Left-hand MPI\n * \\param B        Right-hand MPI\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_NEGATIVE_VALUE if B is greater than A\n */\nint mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );\n\n/**\n * \\brief          Signed addition: X = A + B\n *\n * \\param X        Destination MPI\n * \\param A        Left-hand MPI\n * \\param B        Right-hand MPI\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );\n\n/**\n * \\brief          Signed subtraction: X = A - B\n *\n * \\param X        Destination MPI\n * \\param A        Left-hand MPI\n * \\param B        Right-hand MPI\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );\n\n/**\n * \\brief          Signed addition: X = A + b\n *\n * \\param X        Destination MPI\n * \\param A        Left-hand MPI\n * \\param b        The integer value to add\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b );\n\n/**\n * \\brief          Signed subtraction: X = A - b\n *\n * \\param X        Destination MPI\n * \\param A        Left-hand MPI\n * \\param b        The integer value to subtract\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b );\n\n/**\n * \\brief          Baseline multiplication: X = A * B\n *\n * \\param X        Destination MPI\n * \\param A        Left-hand MPI\n * \\param B        Right-hand MPI\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B );\n\n/**\n * \\brief          Baseline multiplication: X = A * b\n *\n * \\param X        Destination MPI\n * \\param A        Left-hand MPI\n * \\param b        The unsigned integer value to multiply with\n *\n * \\note           b is unsigned\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b );\n\n/**\n * \\brief          Division by mbedtls_mpi: A = Q * B + R\n *\n * \\param Q        Destination MPI for the quotient\n * \\param R        Destination MPI for the rest value\n * \\param A        Left-hand MPI\n * \\param B        Right-hand MPI\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if B == 0\n *\n * \\note           Either Q or R can be NULL.\n */\nint mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B );\n\n/**\n * \\brief          Division by int: A = Q * b + R\n *\n * \\param Q        Destination MPI for the quotient\n * \\param R        Destination MPI for the rest value\n * \\param A        Left-hand MPI\n * \\param b        Integer to divide by\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if b == 0\n *\n * \\note           Either Q or R can be NULL.\n */\nint mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b );\n\n/**\n * \\brief          Modulo: R = A mod B\n *\n * \\param R        Destination MPI for the rest value\n * \\param A        Left-hand MPI\n * \\param B        Right-hand MPI\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if B == 0,\n *                 MBEDTLS_ERR_MPI_NEGATIVE_VALUE if B < 0\n */\nint mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B );\n\n/**\n * \\brief          Modulo: r = A mod b\n *\n * \\param r        Destination mbedtls_mpi_uint\n * \\param A        Left-hand MPI\n * \\param b        Integer to divide by\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_MPI_DIVISION_BY_ZERO if b == 0,\n *                 MBEDTLS_ERR_MPI_NEGATIVE_VALUE if b < 0\n */\nint mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b );\n\n/**\n * \\brief          Sliding-window exponentiation: X = A^E mod N\n *\n * \\param X        Destination MPI\n * \\param A        Left-hand MPI\n * \\param E        Exponent MPI\n * \\param N        Modular MPI\n * \\param _RR      Speed-up MPI used for recalculations\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_MPI_BAD_INPUT_DATA if N is negative or even or\n *                 if E is negative\n *\n * \\note           _RR is used to avoid re-computing R*R mod N across\n *                 multiple calls, which speeds up things a bit. It can\n *                 be set to NULL if the extra performance is unneeded.\n */\nint mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR );\n\n/**\n * \\brief          Fill an MPI X with size bytes of random\n *\n * \\param X        Destination MPI\n * \\param size     Size in bytes\n * \\param f_rng    RNG function\n * \\param p_rng    RNG parameter\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng );\n\n/**\n * \\brief          Greatest common divisor: G = gcd(A, B)\n *\n * \\param G        Destination MPI\n * \\param A        Left-hand MPI\n * \\param B        Right-hand MPI\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B );\n\n/**\n * \\brief          Modular inverse: X = A^-1 mod N\n *\n * \\param X        Destination MPI\n * \\param A        Left-hand MPI\n * \\param N        Right-hand MPI\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_MPI_BAD_INPUT_DATA if N is <= 1,\n                   MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if A has no inverse mod N.\n */\nint mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N );\n\n/**\n * \\brief          Miller-Rabin primality test\n *\n * \\param X        MPI to check\n * \\param f_rng    RNG function\n * \\param p_rng    RNG parameter\n *\n * \\return         0 if successful (probably prime),\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if X is not prime\n */\nint mbedtls_mpi_is_prime( const mbedtls_mpi *X,\n                  int (*f_rng)(void *, unsigned char *, size_t),\n                  void *p_rng );\n\n/**\n * \\brief          Prime number generation\n *\n * \\param X        Destination MPI\n * \\param nbits    Required size of X in bits\n *                 ( 3 <= nbits <= MBEDTLS_MPI_MAX_BITS )\n * \\param dh_flag  If 1, then (X-1)/2 will be prime too\n * \\param f_rng    RNG function\n * \\param p_rng    RNG parameter\n *\n * \\return         0 if successful (probably prime),\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_MPI_BAD_INPUT_DATA if nbits is < 3\n */\nint mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int dh_flag,\n                   int (*f_rng)(void *, unsigned char *, size_t),\n                   void *p_rng );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_mpi_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* bignum.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/blowfish.h",
    "content": "/**\n * \\file blowfish.h\n *\n * \\brief Blowfish block cipher\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_BLOWFISH_H\n#define MBEDTLS_BLOWFISH_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#define MBEDTLS_BLOWFISH_ENCRYPT     1\n#define MBEDTLS_BLOWFISH_DECRYPT     0\n#define MBEDTLS_BLOWFISH_MAX_KEY_BITS     448\n#define MBEDTLS_BLOWFISH_MIN_KEY_BITS     32\n#define MBEDTLS_BLOWFISH_ROUNDS      16         /**< Rounds to use. When increasing this value, make sure to extend the initialisation vectors */\n#define MBEDTLS_BLOWFISH_BLOCKSIZE   8          /* Blowfish uses 64 bit blocks */\n\n#define MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH                -0x0016  /**< Invalid key length. */\n#define MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH              -0x0018  /**< Invalid data input length. */\n\n#if !defined(MBEDTLS_BLOWFISH_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Blowfish context structure\n */\ntypedef struct\n{\n    uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2];    /*!<  Blowfish round keys    */\n    uint32_t S[4][256];                 /*!<  key dependent S-boxes  */\n}\nmbedtls_blowfish_context;\n\n/**\n * \\brief          Initialize Blowfish context\n *\n * \\param ctx      Blowfish context to be initialized\n */\nvoid mbedtls_blowfish_init( mbedtls_blowfish_context *ctx );\n\n/**\n * \\brief          Clear Blowfish context\n *\n * \\param ctx      Blowfish context to be cleared\n */\nvoid mbedtls_blowfish_free( mbedtls_blowfish_context *ctx );\n\n/**\n * \\brief          Blowfish key schedule\n *\n * \\param ctx      Blowfish context to be initialized\n * \\param key      encryption key\n * \\param keybits  must be between 32 and 448 bits\n *\n * \\return         0 if successful, or MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH\n */\nint mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx, const unsigned char *key,\n                     unsigned int keybits );\n\n/**\n * \\brief          Blowfish-ECB block encryption/decryption\n *\n * \\param ctx      Blowfish context\n * \\param mode     MBEDTLS_BLOWFISH_ENCRYPT or MBEDTLS_BLOWFISH_DECRYPT\n * \\param input    8-byte input block\n * \\param output   8-byte output block\n *\n * \\return         0 if successful\n */\nint mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx,\n                        int mode,\n                        const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE],\n                        unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] );\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/**\n * \\brief          Blowfish-CBC buffer encryption/decryption\n *                 Length should be a multiple of the block\n *                 size (8 bytes)\n *\n * \\note           Upon exit, the content of the IV is updated so that you can\n *                 call the function same function again on the following\n *                 block(s) of data and get the same result as if it was\n *                 encrypted in one call. This allows a \"streaming\" usage.\n *                 If on the other hand you need to retain the contents of the\n *                 IV, you should either save it manually or use the cipher\n *                 module instead.\n *\n * \\param ctx      Blowfish context\n * \\param mode     MBEDTLS_BLOWFISH_ENCRYPT or MBEDTLS_BLOWFISH_DECRYPT\n * \\param length   length of the input data\n * \\param iv       initialization vector (updated after use)\n * \\param input    buffer holding the input data\n * \\param output   buffer holding the output data\n *\n * \\return         0 if successful, or\n *                 MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH\n */\nint mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx,\n                        int mode,\n                        size_t length,\n                        unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE],\n                        const unsigned char *input,\n                        unsigned char *output );\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n/**\n * \\brief          Blowfish CFB buffer encryption/decryption.\n *\n * \\note           Upon exit, the content of the IV is updated so that you can\n *                 call the function same function again on the following\n *                 block(s) of data and get the same result as if it was\n *                 encrypted in one call. This allows a \"streaming\" usage.\n *                 If on the other hand you need to retain the contents of the\n *                 IV, you should either save it manually or use the cipher\n *                 module instead.\n *\n * \\param ctx      Blowfish context\n * \\param mode     MBEDTLS_BLOWFISH_ENCRYPT or MBEDTLS_BLOWFISH_DECRYPT\n * \\param length   length of the input data\n * \\param iv_off   offset in IV (updated after use)\n * \\param iv       initialization vector (updated after use)\n * \\param input    buffer holding the input data\n * \\param output   buffer holding the output data\n *\n * \\return         0 if successful\n */\nint mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx,\n                          int mode,\n                          size_t length,\n                          size_t *iv_off,\n                          unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE],\n                          const unsigned char *input,\n                          unsigned char *output );\n#endif /*MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n/**\n * \\brief               Blowfish-CTR buffer encryption/decryption\n *\n * Warning: You have to keep the maximum use of your counter in mind!\n *\n * \\param ctx           Blowfish context\n * \\param length        The length of the data\n * \\param nc_off        The offset in the current stream_block (for resuming\n *                      within current cipher stream). The offset pointer to\n *                      should be 0 at the start of a stream.\n * \\param nonce_counter The 64-bit nonce and counter.\n * \\param stream_block  The saved stream-block for resuming. Is overwritten\n *                      by the function.\n * \\param input         The input data stream\n * \\param output        The output data stream\n *\n * \\return         0 if successful\n */\nint mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx,\n                        size_t length,\n                        size_t *nc_off,\n                        unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE],\n                        unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE],\n                        const unsigned char *input,\n                        unsigned char *output );\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_BLOWFISH_ALT */\n#include \"blowfish_alt.h\"\n#endif /* MBEDTLS_BLOWFISH_ALT */\n\n#endif /* blowfish.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/bn_mul.h",
    "content": "/**\n * \\file bn_mul.h\n *\n * \\brief  Multi-precision integer library\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *      Multiply source vector [s] with b, add result\n *       to destination vector [d] and set carry c.\n *\n *      Currently supports:\n *\n *         . IA-32 (386+)         . AMD64 / EM64T\n *         . IA-32 (SSE2)         . Motorola 68000\n *         . PowerPC, 32-bit      . MicroBlaze\n *         . PowerPC, 64-bit      . TriCore\n *         . SPARC v8             . ARM v3+\n *         . Alpha                . MIPS32\n *         . C, longlong          . C, generic\n */\n#ifndef MBEDTLS_BN_MUL_H\n#define MBEDTLS_BN_MUL_H\n\n#include \"bignum.h\"\n\n#if defined(MBEDTLS_HAVE_ASM)\n\n#ifndef asm\n#define asm __asm\n#endif\n\n/* armcc5 --gnu defines __GNUC__ but doesn't support GNU's extended asm */\n#if defined(__GNUC__) && \\\n    ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 )\n#if defined(__i386__)\n\n#define MULADDC_INIT                        \\\n    asm(                                    \\\n        \"movl   %%ebx, %0           \\n\\t\"   \\\n        \"movl   %5, %%esi           \\n\\t\"   \\\n        \"movl   %6, %%edi           \\n\\t\"   \\\n        \"movl   %7, %%ecx           \\n\\t\"   \\\n        \"movl   %8, %%ebx           \\n\\t\"\n\n#define MULADDC_CORE                        \\\n        \"lodsl                      \\n\\t\"   \\\n        \"mull   %%ebx               \\n\\t\"   \\\n        \"addl   %%ecx,   %%eax      \\n\\t\"   \\\n        \"adcl   $0,      %%edx      \\n\\t\"   \\\n        \"addl   (%%edi), %%eax      \\n\\t\"   \\\n        \"adcl   $0,      %%edx      \\n\\t\"   \\\n        \"movl   %%edx,   %%ecx      \\n\\t\"   \\\n        \"stosl                      \\n\\t\"\n\n#if defined(MBEDTLS_HAVE_SSE2)\n\n#define MULADDC_HUIT                            \\\n        \"movd     %%ecx,     %%mm1      \\n\\t\"   \\\n        \"movd     %%ebx,     %%mm0      \\n\\t\"   \\\n        \"movd     (%%edi),   %%mm3      \\n\\t\"   \\\n        \"paddq    %%mm3,     %%mm1      \\n\\t\"   \\\n        \"movd     (%%esi),   %%mm2      \\n\\t\"   \\\n        \"pmuludq  %%mm0,     %%mm2      \\n\\t\"   \\\n        \"movd     4(%%esi),  %%mm4      \\n\\t\"   \\\n        \"pmuludq  %%mm0,     %%mm4      \\n\\t\"   \\\n        \"movd     8(%%esi),  %%mm6      \\n\\t\"   \\\n        \"pmuludq  %%mm0,     %%mm6      \\n\\t\"   \\\n        \"movd     12(%%esi), %%mm7      \\n\\t\"   \\\n        \"pmuludq  %%mm0,     %%mm7      \\n\\t\"   \\\n        \"paddq    %%mm2,     %%mm1      \\n\\t\"   \\\n        \"movd     4(%%edi),  %%mm3      \\n\\t\"   \\\n        \"paddq    %%mm4,     %%mm3      \\n\\t\"   \\\n        \"movd     8(%%edi),  %%mm5      \\n\\t\"   \\\n        \"paddq    %%mm6,     %%mm5      \\n\\t\"   \\\n        \"movd     12(%%edi), %%mm4      \\n\\t\"   \\\n        \"paddq    %%mm4,     %%mm7      \\n\\t\"   \\\n        \"movd     %%mm1,     (%%edi)    \\n\\t\"   \\\n        \"movd     16(%%esi), %%mm2      \\n\\t\"   \\\n        \"pmuludq  %%mm0,     %%mm2      \\n\\t\"   \\\n        \"psrlq    $32,       %%mm1      \\n\\t\"   \\\n        \"movd     20(%%esi), %%mm4      \\n\\t\"   \\\n        \"pmuludq  %%mm0,     %%mm4      \\n\\t\"   \\\n        \"paddq    %%mm3,     %%mm1      \\n\\t\"   \\\n        \"movd     24(%%esi), %%mm6      \\n\\t\"   \\\n        \"pmuludq  %%mm0,     %%mm6      \\n\\t\"   \\\n        \"movd     %%mm1,     4(%%edi)   \\n\\t\"   \\\n        \"psrlq    $32,       %%mm1      \\n\\t\"   \\\n        \"movd     28(%%esi), %%mm3      \\n\\t\"   \\\n        \"pmuludq  %%mm0,     %%mm3      \\n\\t\"   \\\n        \"paddq    %%mm5,     %%mm1      \\n\\t\"   \\\n        \"movd     16(%%edi), %%mm5      \\n\\t\"   \\\n        \"paddq    %%mm5,     %%mm2      \\n\\t\"   \\\n        \"movd     %%mm1,     8(%%edi)   \\n\\t\"   \\\n        \"psrlq    $32,       %%mm1      \\n\\t\"   \\\n        \"paddq    %%mm7,     %%mm1      \\n\\t\"   \\\n        \"movd     20(%%edi), %%mm5      \\n\\t\"   \\\n        \"paddq    %%mm5,     %%mm4      \\n\\t\"   \\\n        \"movd     %%mm1,     12(%%edi)  \\n\\t\"   \\\n        \"psrlq    $32,       %%mm1      \\n\\t\"   \\\n        \"paddq    %%mm2,     %%mm1      \\n\\t\"   \\\n        \"movd     24(%%edi), %%mm5      \\n\\t\"   \\\n        \"paddq    %%mm5,     %%mm6      \\n\\t\"   \\\n        \"movd     %%mm1,     16(%%edi)  \\n\\t\"   \\\n        \"psrlq    $32,       %%mm1      \\n\\t\"   \\\n        \"paddq    %%mm4,     %%mm1      \\n\\t\"   \\\n        \"movd     28(%%edi), %%mm5      \\n\\t\"   \\\n        \"paddq    %%mm5,     %%mm3      \\n\\t\"   \\\n        \"movd     %%mm1,     20(%%edi)  \\n\\t\"   \\\n        \"psrlq    $32,       %%mm1      \\n\\t\"   \\\n        \"paddq    %%mm6,     %%mm1      \\n\\t\"   \\\n        \"movd     %%mm1,     24(%%edi)  \\n\\t\"   \\\n        \"psrlq    $32,       %%mm1      \\n\\t\"   \\\n        \"paddq    %%mm3,     %%mm1      \\n\\t\"   \\\n        \"movd     %%mm1,     28(%%edi)  \\n\\t\"   \\\n        \"addl     $32,       %%edi      \\n\\t\"   \\\n        \"addl     $32,       %%esi      \\n\\t\"   \\\n        \"psrlq    $32,       %%mm1      \\n\\t\"   \\\n        \"movd     %%mm1,     %%ecx      \\n\\t\"\n\n#define MULADDC_STOP                    \\\n        \"emms                   \\n\\t\"   \\\n        \"movl   %4, %%ebx       \\n\\t\"   \\\n        \"movl   %%ecx, %1       \\n\\t\"   \\\n        \"movl   %%edi, %2       \\n\\t\"   \\\n        \"movl   %%esi, %3       \\n\\t\"   \\\n        : \"=m\" (t), \"=m\" (c), \"=m\" (d), \"=m\" (s)        \\\n        : \"m\" (t), \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)   \\\n        : \"eax\", \"ecx\", \"edx\", \"esi\", \"edi\"             \\\n    );\n\n#else\n\n#define MULADDC_STOP                    \\\n        \"movl   %4, %%ebx       \\n\\t\"   \\\n        \"movl   %%ecx, %1       \\n\\t\"   \\\n        \"movl   %%edi, %2       \\n\\t\"   \\\n        \"movl   %%esi, %3       \\n\\t\"   \\\n        : \"=m\" (t), \"=m\" (c), \"=m\" (d), \"=m\" (s)        \\\n        : \"m\" (t), \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)   \\\n        : \"eax\", \"ecx\", \"edx\", \"esi\", \"edi\"             \\\n    );\n#endif /* SSE2 */\n#endif /* i386 */\n\n#if defined(__amd64__) || defined (__x86_64__)\n\n#define MULADDC_INIT                        \\\n    asm(                                    \\\n        \"xorq   %%r8, %%r8          \\n\\t\"\n\n#define MULADDC_CORE                        \\\n        \"movq   (%%rsi), %%rax      \\n\\t\"   \\\n        \"mulq   %%rbx               \\n\\t\"   \\\n        \"addq   $8,      %%rsi      \\n\\t\"   \\\n        \"addq   %%rcx,   %%rax      \\n\\t\"   \\\n        \"movq   %%r8,    %%rcx      \\n\\t\"   \\\n        \"adcq   $0,      %%rdx      \\n\\t\"   \\\n        \"nop                        \\n\\t\"   \\\n        \"addq   %%rax,   (%%rdi)    \\n\\t\"   \\\n        \"adcq   %%rdx,   %%rcx      \\n\\t\"   \\\n        \"addq   $8,      %%rdi      \\n\\t\"\n\n#define MULADDC_STOP                        \\\n        : \"+c\" (c), \"+D\" (d), \"+S\" (s)      \\\n        : \"b\" (b)                           \\\n        : \"rax\", \"rdx\", \"r8\"                \\\n    );\n\n#endif /* AMD64 */\n\n#if defined(__mc68020__) || defined(__mcpu32__)\n\n#define MULADDC_INIT                    \\\n    asm(                                \\\n        \"movl   %3, %%a2        \\n\\t\"   \\\n        \"movl   %4, %%a3        \\n\\t\"   \\\n        \"movl   %5, %%d3        \\n\\t\"   \\\n        \"movl   %6, %%d2        \\n\\t\"   \\\n        \"moveq  #0, %%d0        \\n\\t\"\n\n#define MULADDC_CORE                    \\\n        \"movel  %%a2@+, %%d1    \\n\\t\"   \\\n        \"mulul  %%d2, %%d4:%%d1 \\n\\t\"   \\\n        \"addl   %%d3, %%d1      \\n\\t\"   \\\n        \"addxl  %%d0, %%d4      \\n\\t\"   \\\n        \"moveq  #0,   %%d3      \\n\\t\"   \\\n        \"addl   %%d1, %%a3@+    \\n\\t\"   \\\n        \"addxl  %%d4, %%d3      \\n\\t\"\n\n#define MULADDC_STOP                    \\\n        \"movl   %%d3, %0        \\n\\t\"   \\\n        \"movl   %%a3, %1        \\n\\t\"   \\\n        \"movl   %%a2, %2        \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)              \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)        \\\n        : \"d0\", \"d1\", \"d2\", \"d3\", \"d4\", \"a2\", \"a3\"  \\\n    );\n\n#define MULADDC_HUIT                        \\\n        \"movel  %%a2@+,  %%d1       \\n\\t\"   \\\n        \"mulul  %%d2,    %%d4:%%d1  \\n\\t\"   \\\n        \"addxl  %%d3,    %%d1       \\n\\t\"   \\\n        \"addxl  %%d0,    %%d4       \\n\\t\"   \\\n        \"addl   %%d1,    %%a3@+     \\n\\t\"   \\\n        \"movel  %%a2@+,  %%d1       \\n\\t\"   \\\n        \"mulul  %%d2,    %%d3:%%d1  \\n\\t\"   \\\n        \"addxl  %%d4,    %%d1       \\n\\t\"   \\\n        \"addxl  %%d0,    %%d3       \\n\\t\"   \\\n        \"addl   %%d1,    %%a3@+     \\n\\t\"   \\\n        \"movel  %%a2@+,  %%d1       \\n\\t\"   \\\n        \"mulul  %%d2,    %%d4:%%d1  \\n\\t\"   \\\n        \"addxl  %%d3,    %%d1       \\n\\t\"   \\\n        \"addxl  %%d0,    %%d4       \\n\\t\"   \\\n        \"addl   %%d1,    %%a3@+     \\n\\t\"   \\\n        \"movel  %%a2@+,  %%d1       \\n\\t\"   \\\n        \"mulul  %%d2,    %%d3:%%d1  \\n\\t\"   \\\n        \"addxl  %%d4,    %%d1       \\n\\t\"   \\\n        \"addxl  %%d0,    %%d3       \\n\\t\"   \\\n        \"addl   %%d1,    %%a3@+     \\n\\t\"   \\\n        \"movel  %%a2@+,  %%d1       \\n\\t\"   \\\n        \"mulul  %%d2,    %%d4:%%d1  \\n\\t\"   \\\n        \"addxl  %%d3,    %%d1       \\n\\t\"   \\\n        \"addxl  %%d0,    %%d4       \\n\\t\"   \\\n        \"addl   %%d1,    %%a3@+     \\n\\t\"   \\\n        \"movel  %%a2@+,  %%d1       \\n\\t\"   \\\n        \"mulul  %%d2,    %%d3:%%d1  \\n\\t\"   \\\n        \"addxl  %%d4,    %%d1       \\n\\t\"   \\\n        \"addxl  %%d0,    %%d3       \\n\\t\"   \\\n        \"addl   %%d1,    %%a3@+     \\n\\t\"   \\\n        \"movel  %%a2@+,  %%d1       \\n\\t\"   \\\n        \"mulul  %%d2,    %%d4:%%d1  \\n\\t\"   \\\n        \"addxl  %%d3,    %%d1       \\n\\t\"   \\\n        \"addxl  %%d0,    %%d4       \\n\\t\"   \\\n        \"addl   %%d1,    %%a3@+     \\n\\t\"   \\\n        \"movel  %%a2@+,  %%d1       \\n\\t\"   \\\n        \"mulul  %%d2,    %%d3:%%d1  \\n\\t\"   \\\n        \"addxl  %%d4,    %%d1       \\n\\t\"   \\\n        \"addxl  %%d0,    %%d3       \\n\\t\"   \\\n        \"addl   %%d1,    %%a3@+     \\n\\t\"   \\\n        \"addxl  %%d0,    %%d3       \\n\\t\"\n\n#endif /* MC68000 */\n\n#if defined(__powerpc64__) || defined(__ppc64__)\n\n#if defined(__MACH__) && defined(__APPLE__)\n\n#define MULADDC_INIT                        \\\n    asm(                                    \\\n        \"ld     r3, %3              \\n\\t\"   \\\n        \"ld     r4, %4              \\n\\t\"   \\\n        \"ld     r5, %5              \\n\\t\"   \\\n        \"ld     r6, %6              \\n\\t\"   \\\n        \"addi   r3, r3, -8          \\n\\t\"   \\\n        \"addi   r4, r4, -8          \\n\\t\"   \\\n        \"addic  r5, r5,  0          \\n\\t\"\n\n#define MULADDC_CORE                        \\\n        \"ldu    r7, 8(r3)           \\n\\t\"   \\\n        \"mulld  r8, r7, r6          \\n\\t\"   \\\n        \"mulhdu r9, r7, r6          \\n\\t\"   \\\n        \"adde   r8, r8, r5          \\n\\t\"   \\\n        \"ld     r7, 8(r4)           \\n\\t\"   \\\n        \"addze  r5, r9              \\n\\t\"   \\\n        \"addc   r8, r8, r7          \\n\\t\"   \\\n        \"stdu   r8, 8(r4)           \\n\\t\"\n\n#define MULADDC_STOP                        \\\n        \"addze  r5, r5              \\n\\t\"   \\\n        \"addi   r4, r4, 8           \\n\\t\"   \\\n        \"addi   r3, r3, 8           \\n\\t\"   \\\n        \"std    r5, %0              \\n\\t\"   \\\n        \"std    r4, %1              \\n\\t\"   \\\n        \"std    r3, %2              \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)              \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)        \\\n        : \"r3\", \"r4\", \"r5\", \"r6\", \"r7\", \"r8\", \"r9\"  \\\n    );\n\n\n#else /* __MACH__ && __APPLE__ */\n\n#define MULADDC_INIT                        \\\n    asm(                                    \\\n        \"ld     %%r3, %3            \\n\\t\"   \\\n        \"ld     %%r4, %4            \\n\\t\"   \\\n        \"ld     %%r5, %5            \\n\\t\"   \\\n        \"ld     %%r6, %6            \\n\\t\"   \\\n        \"addi   %%r3, %%r3, -8      \\n\\t\"   \\\n        \"addi   %%r4, %%r4, -8      \\n\\t\"   \\\n        \"addic  %%r5, %%r5,  0      \\n\\t\"\n\n#define MULADDC_CORE                        \\\n        \"ldu    %%r7, 8(%%r3)       \\n\\t\"   \\\n        \"mulld  %%r8, %%r7, %%r6    \\n\\t\"   \\\n        \"mulhdu %%r9, %%r7, %%r6    \\n\\t\"   \\\n        \"adde   %%r8, %%r8, %%r5    \\n\\t\"   \\\n        \"ld     %%r7, 8(%%r4)       \\n\\t\"   \\\n        \"addze  %%r5, %%r9          \\n\\t\"   \\\n        \"addc   %%r8, %%r8, %%r7    \\n\\t\"   \\\n        \"stdu   %%r8, 8(%%r4)       \\n\\t\"\n\n#define MULADDC_STOP                        \\\n        \"addze  %%r5, %%r5          \\n\\t\"   \\\n        \"addi   %%r4, %%r4, 8       \\n\\t\"   \\\n        \"addi   %%r3, %%r3, 8       \\n\\t\"   \\\n        \"std    %%r5, %0            \\n\\t\"   \\\n        \"std    %%r4, %1            \\n\\t\"   \\\n        \"std    %%r3, %2            \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)              \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)        \\\n        : \"r3\", \"r4\", \"r5\", \"r6\", \"r7\", \"r8\", \"r9\"  \\\n    );\n\n#endif /* __MACH__ && __APPLE__ */\n\n#elif defined(__powerpc__) || defined(__ppc__) /* end PPC64/begin PPC32  */\n\n#if defined(__MACH__) && defined(__APPLE__)\n\n#define MULADDC_INIT                    \\\n    asm(                                \\\n        \"lwz    r3, %3          \\n\\t\"   \\\n        \"lwz    r4, %4          \\n\\t\"   \\\n        \"lwz    r5, %5          \\n\\t\"   \\\n        \"lwz    r6, %6          \\n\\t\"   \\\n        \"addi   r3, r3, -4      \\n\\t\"   \\\n        \"addi   r4, r4, -4      \\n\\t\"   \\\n        \"addic  r5, r5,  0      \\n\\t\"\n\n#define MULADDC_CORE                    \\\n        \"lwzu   r7, 4(r3)       \\n\\t\"   \\\n        \"mullw  r8, r7, r6      \\n\\t\"   \\\n        \"mulhwu r9, r7, r6      \\n\\t\"   \\\n        \"adde   r8, r8, r5      \\n\\t\"   \\\n        \"lwz    r7, 4(r4)       \\n\\t\"   \\\n        \"addze  r5, r9          \\n\\t\"   \\\n        \"addc   r8, r8, r7      \\n\\t\"   \\\n        \"stwu   r8, 4(r4)       \\n\\t\"\n\n#define MULADDC_STOP                    \\\n        \"addze  r5, r5          \\n\\t\"   \\\n        \"addi   r4, r4, 4       \\n\\t\"   \\\n        \"addi   r3, r3, 4       \\n\\t\"   \\\n        \"stw    r5, %0          \\n\\t\"   \\\n        \"stw    r4, %1          \\n\\t\"   \\\n        \"stw    r3, %2          \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)              \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)        \\\n        : \"r3\", \"r4\", \"r5\", \"r6\", \"r7\", \"r8\", \"r9\"  \\\n    );\n\n#else /* __MACH__ && __APPLE__ */\n\n#define MULADDC_INIT                        \\\n    asm(                                    \\\n        \"lwz    %%r3, %3            \\n\\t\"   \\\n        \"lwz    %%r4, %4            \\n\\t\"   \\\n        \"lwz    %%r5, %5            \\n\\t\"   \\\n        \"lwz    %%r6, %6            \\n\\t\"   \\\n        \"addi   %%r3, %%r3, -4      \\n\\t\"   \\\n        \"addi   %%r4, %%r4, -4      \\n\\t\"   \\\n        \"addic  %%r5, %%r5,  0      \\n\\t\"\n\n#define MULADDC_CORE                        \\\n        \"lwzu   %%r7, 4(%%r3)       \\n\\t\"   \\\n        \"mullw  %%r8, %%r7, %%r6    \\n\\t\"   \\\n        \"mulhwu %%r9, %%r7, %%r6    \\n\\t\"   \\\n        \"adde   %%r8, %%r8, %%r5    \\n\\t\"   \\\n        \"lwz    %%r7, 4(%%r4)       \\n\\t\"   \\\n        \"addze  %%r5, %%r9          \\n\\t\"   \\\n        \"addc   %%r8, %%r8, %%r7    \\n\\t\"   \\\n        \"stwu   %%r8, 4(%%r4)       \\n\\t\"\n\n#define MULADDC_STOP                        \\\n        \"addze  %%r5, %%r5          \\n\\t\"   \\\n        \"addi   %%r4, %%r4, 4       \\n\\t\"   \\\n        \"addi   %%r3, %%r3, 4       \\n\\t\"   \\\n        \"stw    %%r5, %0            \\n\\t\"   \\\n        \"stw    %%r4, %1            \\n\\t\"   \\\n        \"stw    %%r3, %2            \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)              \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)        \\\n        : \"r3\", \"r4\", \"r5\", \"r6\", \"r7\", \"r8\", \"r9\"  \\\n    );\n\n#endif /* __MACH__ && __APPLE__ */\n\n#endif /* PPC32 */\n\n/*\n * The Sparc(64) assembly is reported to be broken.\n * Disable it for now, until we're able to fix it.\n */\n#if 0 && defined(__sparc__)\n#if defined(__sparc64__)\n\n#define MULADDC_INIT                                    \\\n    asm(                                                \\\n                \"ldx     %3, %%o0               \\n\\t\"   \\\n                \"ldx     %4, %%o1               \\n\\t\"   \\\n                \"ld      %5, %%o2               \\n\\t\"   \\\n                \"ld      %6, %%o3               \\n\\t\"\n\n#define MULADDC_CORE                                    \\\n                \"ld      [%%o0], %%o4           \\n\\t\"   \\\n                \"inc     4, %%o0                \\n\\t\"   \\\n                \"ld      [%%o1], %%o5           \\n\\t\"   \\\n                \"umul    %%o3, %%o4, %%o4       \\n\\t\"   \\\n                \"addcc   %%o4, %%o2, %%o4       \\n\\t\"   \\\n                \"rd      %%y, %%g1              \\n\\t\"   \\\n                \"addx    %%g1, 0, %%g1          \\n\\t\"   \\\n                \"addcc   %%o4, %%o5, %%o4       \\n\\t\"   \\\n                \"st      %%o4, [%%o1]           \\n\\t\"   \\\n                \"addx    %%g1, 0, %%o2          \\n\\t\"   \\\n                \"inc     4, %%o1                \\n\\t\"\n\n        #define MULADDC_STOP                            \\\n                \"st      %%o2, %0               \\n\\t\"   \\\n                \"stx     %%o1, %1               \\n\\t\"   \\\n                \"stx     %%o0, %2               \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)          \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)    \\\n        : \"g1\", \"o0\", \"o1\", \"o2\", \"o3\", \"o4\",   \\\n          \"o5\"                                  \\\n        );\n\n#else /* __sparc64__ */\n\n#define MULADDC_INIT                                    \\\n    asm(                                                \\\n                \"ld      %3, %%o0               \\n\\t\"   \\\n                \"ld      %4, %%o1               \\n\\t\"   \\\n                \"ld      %5, %%o2               \\n\\t\"   \\\n                \"ld      %6, %%o3               \\n\\t\"\n\n#define MULADDC_CORE                                    \\\n                \"ld      [%%o0], %%o4           \\n\\t\"   \\\n                \"inc     4, %%o0                \\n\\t\"   \\\n                \"ld      [%%o1], %%o5           \\n\\t\"   \\\n                \"umul    %%o3, %%o4, %%o4       \\n\\t\"   \\\n                \"addcc   %%o4, %%o2, %%o4       \\n\\t\"   \\\n                \"rd      %%y, %%g1              \\n\\t\"   \\\n                \"addx    %%g1, 0, %%g1          \\n\\t\"   \\\n                \"addcc   %%o4, %%o5, %%o4       \\n\\t\"   \\\n                \"st      %%o4, [%%o1]           \\n\\t\"   \\\n                \"addx    %%g1, 0, %%o2          \\n\\t\"   \\\n                \"inc     4, %%o1                \\n\\t\"\n\n#define MULADDC_STOP                                    \\\n                \"st      %%o2, %0               \\n\\t\"   \\\n                \"st      %%o1, %1               \\n\\t\"   \\\n                \"st      %%o0, %2               \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)          \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)    \\\n        : \"g1\", \"o0\", \"o1\", \"o2\", \"o3\", \"o4\",   \\\n          \"o5\"                                  \\\n        );\n\n#endif /* __sparc64__ */\n#endif /* __sparc__ */\n\n#if defined(__microblaze__) || defined(microblaze)\n\n#define MULADDC_INIT                    \\\n    asm(                                \\\n        \"lwi   r3,   %3         \\n\\t\"   \\\n        \"lwi   r4,   %4         \\n\\t\"   \\\n        \"lwi   r5,   %5         \\n\\t\"   \\\n        \"lwi   r6,   %6         \\n\\t\"   \\\n        \"andi  r7,   r6, 0xffff \\n\\t\"   \\\n        \"bsrli r6,   r6, 16     \\n\\t\"\n\n#define MULADDC_CORE                    \\\n        \"lhui  r8,   r3,   0    \\n\\t\"   \\\n        \"addi  r3,   r3,   2    \\n\\t\"   \\\n        \"lhui  r9,   r3,   0    \\n\\t\"   \\\n        \"addi  r3,   r3,   2    \\n\\t\"   \\\n        \"mul   r10,  r9,  r6    \\n\\t\"   \\\n        \"mul   r11,  r8,  r7    \\n\\t\"   \\\n        \"mul   r12,  r9,  r7    \\n\\t\"   \\\n        \"mul   r13,  r8,  r6    \\n\\t\"   \\\n        \"bsrli  r8, r10,  16    \\n\\t\"   \\\n        \"bsrli  r9, r11,  16    \\n\\t\"   \\\n        \"add   r13, r13,  r8    \\n\\t\"   \\\n        \"add   r13, r13,  r9    \\n\\t\"   \\\n        \"bslli r10, r10,  16    \\n\\t\"   \\\n        \"bslli r11, r11,  16    \\n\\t\"   \\\n        \"add   r12, r12, r10    \\n\\t\"   \\\n        \"addc  r13, r13,  r0    \\n\\t\"   \\\n        \"add   r12, r12, r11    \\n\\t\"   \\\n        \"addc  r13, r13,  r0    \\n\\t\"   \\\n        \"lwi   r10,  r4,   0    \\n\\t\"   \\\n        \"add   r12, r12, r10    \\n\\t\"   \\\n        \"addc  r13, r13,  r0    \\n\\t\"   \\\n        \"add   r12, r12,  r5    \\n\\t\"   \\\n        \"addc   r5, r13,  r0    \\n\\t\"   \\\n        \"swi   r12,  r4,   0    \\n\\t\"   \\\n        \"addi   r4,  r4,   4    \\n\\t\"\n\n#define MULADDC_STOP                    \\\n        \"swi   r5,   %0         \\n\\t\"   \\\n        \"swi   r4,   %1         \\n\\t\"   \\\n        \"swi   r3,   %2         \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)              \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)        \\\n        : \"r3\", \"r4\"  \"r5\", \"r6\", \"r7\", \"r8\",       \\\n          \"r9\", \"r10\", \"r11\", \"r12\", \"r13\"          \\\n    );\n\n#endif /* MicroBlaze */\n\n#if defined(__tricore__)\n\n#define MULADDC_INIT                            \\\n    asm(                                        \\\n        \"ld.a   %%a2, %3                \\n\\t\"   \\\n        \"ld.a   %%a3, %4                \\n\\t\"   \\\n        \"ld.w   %%d4, %5                \\n\\t\"   \\\n        \"ld.w   %%d1, %6                \\n\\t\"   \\\n        \"xor    %%d5, %%d5              \\n\\t\"\n\n#define MULADDC_CORE                            \\\n        \"ld.w   %%d0,   [%%a2+]         \\n\\t\"   \\\n        \"madd.u %%e2, %%e4, %%d0, %%d1  \\n\\t\"   \\\n        \"ld.w   %%d0,   [%%a3]          \\n\\t\"   \\\n        \"addx   %%d2,    %%d2,  %%d0    \\n\\t\"   \\\n        \"addc   %%d3,    %%d3,    0     \\n\\t\"   \\\n        \"mov    %%d4,    %%d3           \\n\\t\"   \\\n        \"st.w  [%%a3+],  %%d2           \\n\\t\"\n\n#define MULADDC_STOP                            \\\n        \"st.w   %0, %%d4                \\n\\t\"   \\\n        \"st.a   %1, %%a3                \\n\\t\"   \\\n        \"st.a   %2, %%a2                \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)          \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)    \\\n        : \"d0\", \"d1\", \"e2\", \"d4\", \"a2\", \"a3\"    \\\n    );\n\n#endif /* TriCore */\n\n/*\n * gcc -O0 by default uses r7 for the frame pointer, so it complains about our\n * use of r7 below, unless -fomit-frame-pointer is passed. Unfortunately,\n * passing that option is not easy when building with yotta.\n *\n * On the other hand, -fomit-frame-pointer is implied by any -Ox options with\n * x !=0, which we can detect using __OPTIMIZE__ (which is also defined by\n * clang and armcc5 under the same conditions).\n *\n * So, only use the optimized assembly below for optimized build, which avoids\n * the build error and is pretty reasonable anyway.\n */\n#if defined(__GNUC__) && !defined(__OPTIMIZE__)\n#define MULADDC_CANNOT_USE_R7\n#endif\n\n#if defined(__arm__) && !defined(MULADDC_CANNOT_USE_R7)\n\n#if defined(__thumb__) && !defined(__thumb2__)\n\n#define MULADDC_INIT                                    \\\n    asm(                                                \\\n            \"ldr    r0, %3                      \\n\\t\"   \\\n            \"ldr    r1, %4                      \\n\\t\"   \\\n            \"ldr    r2, %5                      \\n\\t\"   \\\n            \"ldr    r3, %6                      \\n\\t\"   \\\n            \"lsr    r7, r3, #16                 \\n\\t\"   \\\n            \"mov    r9, r7                      \\n\\t\"   \\\n            \"lsl    r7, r3, #16                 \\n\\t\"   \\\n            \"lsr    r7, r7, #16                 \\n\\t\"   \\\n            \"mov    r8, r7                      \\n\\t\"\n\n#define MULADDC_CORE                                    \\\n            \"ldmia  r0!, {r6}                   \\n\\t\"   \\\n            \"lsr    r7, r6, #16                 \\n\\t\"   \\\n            \"lsl    r6, r6, #16                 \\n\\t\"   \\\n            \"lsr    r6, r6, #16                 \\n\\t\"   \\\n            \"mov    r4, r8                      \\n\\t\"   \\\n            \"mul    r4, r6                      \\n\\t\"   \\\n            \"mov    r3, r9                      \\n\\t\"   \\\n            \"mul    r6, r3                      \\n\\t\"   \\\n            \"mov    r5, r9                      \\n\\t\"   \\\n            \"mul    r5, r7                      \\n\\t\"   \\\n            \"mov    r3, r8                      \\n\\t\"   \\\n            \"mul    r7, r3                      \\n\\t\"   \\\n            \"lsr    r3, r6, #16                 \\n\\t\"   \\\n            \"add    r5, r5, r3                  \\n\\t\"   \\\n            \"lsr    r3, r7, #16                 \\n\\t\"   \\\n            \"add    r5, r5, r3                  \\n\\t\"   \\\n            \"add    r4, r4, r2                  \\n\\t\"   \\\n            \"mov    r2, #0                      \\n\\t\"   \\\n            \"adc    r5, r2                      \\n\\t\"   \\\n            \"lsl    r3, r6, #16                 \\n\\t\"   \\\n            \"add    r4, r4, r3                  \\n\\t\"   \\\n            \"adc    r5, r2                      \\n\\t\"   \\\n            \"lsl    r3, r7, #16                 \\n\\t\"   \\\n            \"add    r4, r4, r3                  \\n\\t\"   \\\n            \"adc    r5, r2                      \\n\\t\"   \\\n            \"ldr    r3, [r1]                    \\n\\t\"   \\\n            \"add    r4, r4, r3                  \\n\\t\"   \\\n            \"adc    r2, r5                      \\n\\t\"   \\\n            \"stmia  r1!, {r4}                   \\n\\t\"\n\n#define MULADDC_STOP                                    \\\n            \"str    r2, %0                      \\n\\t\"   \\\n            \"str    r1, %1                      \\n\\t\"   \\\n            \"str    r0, %2                      \\n\\t\"   \\\n         : \"=m\" (c),  \"=m\" (d), \"=m\" (s)        \\\n         : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)   \\\n         : \"r0\", \"r1\", \"r2\", \"r3\", \"r4\", \"r5\",  \\\n           \"r6\", \"r7\", \"r8\", \"r9\", \"cc\"         \\\n         );\n\n#else\n\n#define MULADDC_INIT                                    \\\n    asm(                                                \\\n            \"ldr    r0, %3                      \\n\\t\"   \\\n            \"ldr    r1, %4                      \\n\\t\"   \\\n            \"ldr    r2, %5                      \\n\\t\"   \\\n            \"ldr    r3, %6                      \\n\\t\"\n\n#define MULADDC_CORE                                    \\\n            \"ldr    r4, [r0], #4                \\n\\t\"   \\\n            \"mov    r5, #0                      \\n\\t\"   \\\n            \"ldr    r6, [r1]                    \\n\\t\"   \\\n            \"umlal  r2, r5, r3, r4              \\n\\t\"   \\\n            \"adds   r7, r6, r2                  \\n\\t\"   \\\n            \"adc    r2, r5, #0                  \\n\\t\"   \\\n            \"str    r7, [r1], #4                \\n\\t\"\n\n#define MULADDC_STOP                                    \\\n            \"str    r2, %0                      \\n\\t\"   \\\n            \"str    r1, %1                      \\n\\t\"   \\\n            \"str    r0, %2                      \\n\\t\"   \\\n         : \"=m\" (c),  \"=m\" (d), \"=m\" (s)        \\\n         : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)   \\\n         : \"r0\", \"r1\", \"r2\", \"r3\", \"r4\", \"r5\",  \\\n           \"r6\", \"r7\", \"cc\"                     \\\n         );\n\n#endif /* Thumb */\n\n#endif /* ARMv3 */\n\n#if defined(__alpha__)\n\n#define MULADDC_INIT                    \\\n    asm(                                \\\n        \"ldq    $1, %3          \\n\\t\"   \\\n        \"ldq    $2, %4          \\n\\t\"   \\\n        \"ldq    $3, %5          \\n\\t\"   \\\n        \"ldq    $4, %6          \\n\\t\"\n\n#define MULADDC_CORE                    \\\n        \"ldq    $6,  0($1)      \\n\\t\"   \\\n        \"addq   $1,  8, $1      \\n\\t\"   \\\n        \"mulq   $6, $4, $7      \\n\\t\"   \\\n        \"umulh  $6, $4, $6      \\n\\t\"   \\\n        \"addq   $7, $3, $7      \\n\\t\"   \\\n        \"cmpult $7, $3, $3      \\n\\t\"   \\\n        \"ldq    $5,  0($2)      \\n\\t\"   \\\n        \"addq   $7, $5, $7      \\n\\t\"   \\\n        \"cmpult $7, $5, $5      \\n\\t\"   \\\n        \"stq    $7,  0($2)      \\n\\t\"   \\\n        \"addq   $2,  8, $2      \\n\\t\"   \\\n        \"addq   $6, $3, $3      \\n\\t\"   \\\n        \"addq   $5, $3, $3      \\n\\t\"\n\n#define MULADDC_STOP                                    \\\n        \"stq    $3, %0          \\n\\t\"   \\\n        \"stq    $2, %1          \\n\\t\"   \\\n        \"stq    $1, %2          \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)              \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)        \\\n        : \"$1\", \"$2\", \"$3\", \"$4\", \"$5\", \"$6\", \"$7\"  \\\n    );\n#endif /* Alpha */\n\n#if defined(__mips__) && !defined(__mips64)\n\n#define MULADDC_INIT                    \\\n    asm(                                \\\n        \"lw     $10, %3         \\n\\t\"   \\\n        \"lw     $11, %4         \\n\\t\"   \\\n        \"lw     $12, %5         \\n\\t\"   \\\n        \"lw     $13, %6         \\n\\t\"\n\n#define MULADDC_CORE                    \\\n        \"lw     $14, 0($10)     \\n\\t\"   \\\n        \"multu  $13, $14        \\n\\t\"   \\\n        \"addi   $10, $10, 4     \\n\\t\"   \\\n        \"mflo   $14             \\n\\t\"   \\\n        \"mfhi   $9              \\n\\t\"   \\\n        \"addu   $14, $12, $14   \\n\\t\"   \\\n        \"lw     $15, 0($11)     \\n\\t\"   \\\n        \"sltu   $12, $14, $12   \\n\\t\"   \\\n        \"addu   $15, $14, $15   \\n\\t\"   \\\n        \"sltu   $14, $15, $14   \\n\\t\"   \\\n        \"addu   $12, $12, $9    \\n\\t\"   \\\n        \"sw     $15, 0($11)     \\n\\t\"   \\\n        \"addu   $12, $12, $14   \\n\\t\"   \\\n        \"addi   $11, $11, 4     \\n\\t\"\n\n#define MULADDC_STOP                    \\\n        \"sw     $12, %0         \\n\\t\"   \\\n        \"sw     $11, %1         \\n\\t\"   \\\n        \"sw     $10, %2         \\n\\t\"   \\\n        : \"=m\" (c), \"=m\" (d), \"=m\" (s)                      \\\n        : \"m\" (s), \"m\" (d), \"m\" (c), \"m\" (b)                \\\n        : \"$9\", \"$10\", \"$11\", \"$12\", \"$13\", \"$14\", \"$15\"    \\\n    );\n\n#endif /* MIPS */\n#endif /* GNUC */\n\n#if (defined(_MSC_VER) && defined(_M_IX86)) || defined(__WATCOMC__)\n\n#define MULADDC_INIT                            \\\n    __asm   mov     esi, s                      \\\n    __asm   mov     edi, d                      \\\n    __asm   mov     ecx, c                      \\\n    __asm   mov     ebx, b\n\n#define MULADDC_CORE                            \\\n    __asm   lodsd                               \\\n    __asm   mul     ebx                         \\\n    __asm   add     eax, ecx                    \\\n    __asm   adc     edx, 0                      \\\n    __asm   add     eax, [edi]                  \\\n    __asm   adc     edx, 0                      \\\n    __asm   mov     ecx, edx                    \\\n    __asm   stosd\n\n#if defined(MBEDTLS_HAVE_SSE2)\n\n#define EMIT __asm _emit\n\n#define MULADDC_HUIT                            \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0xC9             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0xC3             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x1F             \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xCB             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x16             \\\n    EMIT 0x0F  EMIT 0xF4  EMIT 0xD0             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x66  EMIT 0x04  \\\n    EMIT 0x0F  EMIT 0xF4  EMIT 0xE0             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x76  EMIT 0x08  \\\n    EMIT 0x0F  EMIT 0xF4  EMIT 0xF0             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x7E  EMIT 0x0C  \\\n    EMIT 0x0F  EMIT 0xF4  EMIT 0xF8             \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xCA             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x5F  EMIT 0x04  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xDC             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x6F  EMIT 0x08  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xEE             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x67  EMIT 0x0C  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xFC             \\\n    EMIT 0x0F  EMIT 0x7E  EMIT 0x0F             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x56  EMIT 0x10  \\\n    EMIT 0x0F  EMIT 0xF4  EMIT 0xD0             \\\n    EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x66  EMIT 0x14  \\\n    EMIT 0x0F  EMIT 0xF4  EMIT 0xE0             \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xCB             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x76  EMIT 0x18  \\\n    EMIT 0x0F  EMIT 0xF4  EMIT 0xF0             \\\n    EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x04  \\\n    EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x5E  EMIT 0x1C  \\\n    EMIT 0x0F  EMIT 0xF4  EMIT 0xD8             \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xCD             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x6F  EMIT 0x10  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xD5             \\\n    EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x08  \\\n    EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xCF             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x6F  EMIT 0x14  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xE5             \\\n    EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x0C  \\\n    EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xCA             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x6F  EMIT 0x18  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xF5             \\\n    EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x10  \\\n    EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xCC             \\\n    EMIT 0x0F  EMIT 0x6E  EMIT 0x6F  EMIT 0x1C  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xDD             \\\n    EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x14  \\\n    EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xCE             \\\n    EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x18  \\\n    EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \\\n    EMIT 0x0F  EMIT 0xD4  EMIT 0xCB             \\\n    EMIT 0x0F  EMIT 0x7E  EMIT 0x4F  EMIT 0x1C  \\\n    EMIT 0x83  EMIT 0xC7  EMIT 0x20             \\\n    EMIT 0x83  EMIT 0xC6  EMIT 0x20             \\\n    EMIT 0x0F  EMIT 0x73  EMIT 0xD1  EMIT 0x20  \\\n    EMIT 0x0F  EMIT 0x7E  EMIT 0xC9\n\n#define MULADDC_STOP                            \\\n    EMIT 0x0F  EMIT 0x77                        \\\n    __asm   mov     c, ecx                      \\\n    __asm   mov     d, edi                      \\\n    __asm   mov     s, esi                      \\\n\n#else\n\n#define MULADDC_STOP                            \\\n    __asm   mov     c, ecx                      \\\n    __asm   mov     d, edi                      \\\n    __asm   mov     s, esi                      \\\n\n#endif /* SSE2 */\n#endif /* MSVC */\n\n#endif /* MBEDTLS_HAVE_ASM */\n\n#if !defined(MULADDC_CORE)\n#if defined(MBEDTLS_HAVE_UDBL)\n\n#define MULADDC_INIT                    \\\n{                                       \\\n    mbedtls_t_udbl r;                           \\\n    mbedtls_mpi_uint r0, r1;\n\n#define MULADDC_CORE                    \\\n    r   = *(s++) * (mbedtls_t_udbl) b;          \\\n    r0  = (mbedtls_mpi_uint) r;                   \\\n    r1  = (mbedtls_mpi_uint)( r >> biL );         \\\n    r0 += c;  r1 += (r0 <  c);          \\\n    r0 += *d; r1 += (r0 < *d);          \\\n    c = r1; *(d++) = r0;\n\n#define MULADDC_STOP                    \\\n}\n\n#else\n#define MULADDC_INIT                    \\\n{                                       \\\n    mbedtls_mpi_uint s0, s1, b0, b1;              \\\n    mbedtls_mpi_uint r0, r1, rx, ry;              \\\n    b0 = ( b << biH ) >> biH;           \\\n    b1 = ( b >> biH );\n\n#define MULADDC_CORE                    \\\n    s0 = ( *s << biH ) >> biH;          \\\n    s1 = ( *s >> biH ); s++;            \\\n    rx = s0 * b1; r0 = s0 * b0;         \\\n    ry = s1 * b0; r1 = s1 * b1;         \\\n    r1 += ( rx >> biH );                \\\n    r1 += ( ry >> biH );                \\\n    rx <<= biH; ry <<= biH;             \\\n    r0 += rx; r1 += (r0 < rx);          \\\n    r0 += ry; r1 += (r0 < ry);          \\\n    r0 +=  c; r1 += (r0 <  c);          \\\n    r0 += *d; r1 += (r0 < *d);          \\\n    c = r1; *(d++) = r0;\n\n#define MULADDC_STOP                    \\\n}\n\n#endif /* C (generic)  */\n#endif /* C (longlong) */\n\n#endif /* bn_mul.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/camellia.h",
    "content": "/**\n * \\file camellia.h\n *\n * \\brief Camellia block cipher\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_CAMELLIA_H\n#define MBEDTLS_CAMELLIA_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#define MBEDTLS_CAMELLIA_ENCRYPT     1\n#define MBEDTLS_CAMELLIA_DECRYPT     0\n\n#define MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH           -0x0024  /**< Invalid key length. */\n#define MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH         -0x0026  /**< Invalid data input length. */\n\n#if !defined(MBEDTLS_CAMELLIA_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          CAMELLIA context structure\n */\ntypedef struct\n{\n    int nr;                     /*!<  number of rounds  */\n    uint32_t rk[68];            /*!<  CAMELLIA round keys    */\n}\nmbedtls_camellia_context;\n\n/**\n * \\brief          Initialize CAMELLIA context\n *\n * \\param ctx      CAMELLIA context to be initialized\n */\nvoid mbedtls_camellia_init( mbedtls_camellia_context *ctx );\n\n/**\n * \\brief          Clear CAMELLIA context\n *\n * \\param ctx      CAMELLIA context to be cleared\n */\nvoid mbedtls_camellia_free( mbedtls_camellia_context *ctx );\n\n/**\n * \\brief          CAMELLIA key schedule (encryption)\n *\n * \\param ctx      CAMELLIA context to be initialized\n * \\param key      encryption key\n * \\param keybits  must be 128, 192 or 256\n *\n * \\return         0 if successful, or MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH\n */\nint mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key,\n                         unsigned int keybits );\n\n/**\n * \\brief          CAMELLIA key schedule (decryption)\n *\n * \\param ctx      CAMELLIA context to be initialized\n * \\param key      decryption key\n * \\param keybits  must be 128, 192 or 256\n *\n * \\return         0 if successful, or MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH\n */\nint mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key,\n                         unsigned int keybits );\n\n/**\n * \\brief          CAMELLIA-ECB block encryption/decryption\n *\n * \\param ctx      CAMELLIA context\n * \\param mode     MBEDTLS_CAMELLIA_ENCRYPT or MBEDTLS_CAMELLIA_DECRYPT\n * \\param input    16-byte input block\n * \\param output   16-byte output block\n *\n * \\return         0 if successful\n */\nint mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,\n                    int mode,\n                    const unsigned char input[16],\n                    unsigned char output[16] );\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/**\n * \\brief          CAMELLIA-CBC buffer encryption/decryption\n *                 Length should be a multiple of the block\n *                 size (16 bytes)\n *\n * \\note           Upon exit, the content of the IV is updated so that you can\n *                 call the function same function again on the following\n *                 block(s) of data and get the same result as if it was\n *                 encrypted in one call. This allows a \"streaming\" usage.\n *                 If on the other hand you need to retain the contents of the\n *                 IV, you should either save it manually or use the cipher\n *                 module instead.\n *\n * \\param ctx      CAMELLIA context\n * \\param mode     MBEDTLS_CAMELLIA_ENCRYPT or MBEDTLS_CAMELLIA_DECRYPT\n * \\param length   length of the input data\n * \\param iv       initialization vector (updated after use)\n * \\param input    buffer holding the input data\n * \\param output   buffer holding the output data\n *\n * \\return         0 if successful, or\n *                 MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH\n */\nint mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,\n                    int mode,\n                    size_t length,\n                    unsigned char iv[16],\n                    const unsigned char *input,\n                    unsigned char *output );\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n/**\n * \\brief          CAMELLIA-CFB128 buffer encryption/decryption\n *\n * Note: Due to the nature of CFB you should use the same key schedule for\n * both encryption and decryption. So a context initialized with\n * mbedtls_camellia_setkey_enc() for both MBEDTLS_CAMELLIA_ENCRYPT and CAMELLIE_DECRYPT.\n *\n * \\note           Upon exit, the content of the IV is updated so that you can\n *                 call the function same function again on the following\n *                 block(s) of data and get the same result as if it was\n *                 encrypted in one call. This allows a \"streaming\" usage.\n *                 If on the other hand you need to retain the contents of the\n *                 IV, you should either save it manually or use the cipher\n *                 module instead.\n *\n * \\param ctx      CAMELLIA context\n * \\param mode     MBEDTLS_CAMELLIA_ENCRYPT or MBEDTLS_CAMELLIA_DECRYPT\n * \\param length   length of the input data\n * \\param iv_off   offset in IV (updated after use)\n * \\param iv       initialization vector (updated after use)\n * \\param input    buffer holding the input data\n * \\param output   buffer holding the output data\n *\n * \\return         0 if successful, or\n *                 MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH\n */\nint mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,\n                       int mode,\n                       size_t length,\n                       size_t *iv_off,\n                       unsigned char iv[16],\n                       const unsigned char *input,\n                       unsigned char *output );\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n/**\n * \\brief               CAMELLIA-CTR buffer encryption/decryption\n *\n * Warning: You have to keep the maximum use of your counter in mind!\n *\n * Note: Due to the nature of CTR you should use the same key schedule for\n * both encryption and decryption. So a context initialized with\n * mbedtls_camellia_setkey_enc() for both MBEDTLS_CAMELLIA_ENCRYPT and MBEDTLS_CAMELLIA_DECRYPT.\n *\n * \\param ctx           CAMELLIA context\n * \\param length        The length of the data\n * \\param nc_off        The offset in the current stream_block (for resuming\n *                      within current cipher stream). The offset pointer to\n *                      should be 0 at the start of a stream.\n * \\param nonce_counter The 128-bit nonce and counter.\n * \\param stream_block  The saved stream-block for resuming. Is overwritten\n *                      by the function.\n * \\param input         The input data stream\n * \\param output        The output data stream\n *\n * \\return         0 if successful\n */\nint mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,\n                       size_t length,\n                       size_t *nc_off,\n                       unsigned char nonce_counter[16],\n                       unsigned char stream_block[16],\n                       const unsigned char *input,\n                       unsigned char *output );\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_CAMELLIA_ALT */\n#include \"camellia_alt.h\"\n#endif /* MBEDTLS_CAMELLIA_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_camellia_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* camellia.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ccm.h",
    "content": "/**\n * \\file ccm.h\n *\n * \\brief Counter with CBC-MAC (CCM) for 128-bit block ciphers\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_CCM_H\n#define MBEDTLS_CCM_H\n\n#include \"cipher.h\"\n\n#define MBEDTLS_ERR_CCM_BAD_INPUT      -0x000D /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_CCM_AUTH_FAILED    -0x000F /**< Authenticated decryption failed. */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          CCM context structure\n */\ntypedef struct {\n    mbedtls_cipher_context_t cipher_ctx;    /*!< cipher context used */\n}\nmbedtls_ccm_context;\n\n/**\n * \\brief           Initialize CCM context (just makes references valid)\n *                  Makes the context ready for mbedtls_ccm_setkey() or\n *                  mbedtls_ccm_free().\n *\n * \\param ctx       CCM context to initialize\n */\nvoid mbedtls_ccm_init( mbedtls_ccm_context *ctx );\n\n/**\n * \\brief           CCM initialization (encryption and decryption)\n *\n * \\param ctx       CCM context to be initialized\n * \\param cipher    cipher to use (a 128-bit block cipher)\n * \\param key       encryption key\n * \\param keybits   key size in bits (must be acceptable by the cipher)\n *\n * \\return          0 if successful, or a cipher specific error code\n */\nint mbedtls_ccm_setkey( mbedtls_ccm_context *ctx,\n                        mbedtls_cipher_id_t cipher,\n                        const unsigned char *key,\n                        unsigned int keybits );\n\n/**\n * \\brief           Free a CCM context and underlying cipher sub-context\n *\n * \\param ctx       CCM context to free\n */\nvoid mbedtls_ccm_free( mbedtls_ccm_context *ctx );\n\n/**\n * \\brief           CCM buffer encryption\n *\n * \\param ctx       CCM context\n * \\param length    length of the input data in bytes\n * \\param iv        nonce (initialization vector)\n * \\param iv_len    length of IV in bytes\n *                  must be 2, 3, 4, 5, 6, 7 or 8\n * \\param add       additional data\n * \\param add_len   length of additional data in bytes\n *                  must be less than 2^16 - 2^8\n * \\param input     buffer holding the input data\n * \\param output    buffer for holding the output data\n *                  must be at least 'length' bytes wide\n * \\param tag       buffer for holding the tag\n * \\param tag_len   length of the tag to generate in bytes\n *                  must be 4, 6, 8, 10, 14 or 16\n *\n * \\note            The tag is written to a separate buffer. To get the tag\n *                  concatenated with the output as in the CCM spec, use\n *                  tag = output + length and make sure the output buffer is\n *                  at least length + tag_len wide.\n *\n * \\return          0 if successful\n */\nint mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length,\n                         const unsigned char *iv, size_t iv_len,\n                         const unsigned char *add, size_t add_len,\n                         const unsigned char *input, unsigned char *output,\n                         unsigned char *tag, size_t tag_len );\n\n/**\n * \\brief           CCM buffer authenticated decryption\n *\n * \\param ctx       CCM context\n * \\param length    length of the input data\n * \\param iv        initialization vector\n * \\param iv_len    length of IV\n * \\param add       additional data\n * \\param add_len   length of additional data\n * \\param input     buffer holding the input data\n * \\param output    buffer for holding the output data\n * \\param tag       buffer holding the tag\n * \\param tag_len   length of the tag\n *\n * \\return         0 if successful and authenticated,\n *                 MBEDTLS_ERR_CCM_AUTH_FAILED if tag does not match\n */\nint mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length,\n                      const unsigned char *iv, size_t iv_len,\n                      const unsigned char *add, size_t add_len,\n                      const unsigned char *input, unsigned char *output,\n                      const unsigned char *tag, size_t tag_len );\n\n#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_ccm_self_test( int verbose );\n#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_CCM_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/certs.h",
    "content": "/**\n * \\file certs.h\n *\n * \\brief Sample certificates and DHM parameters for testing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_CERTS_H\n#define MBEDTLS_CERTS_H\n\n#include <stddef.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n/* Concatenation of all CA certificates in PEM format if available */\nextern const char   mbedtls_test_cas_pem[];\nextern const size_t mbedtls_test_cas_pem_len;\n#endif\n\n/* List of all CA certificates, terminated by NULL */\nextern const char * mbedtls_test_cas[];\nextern const size_t mbedtls_test_cas_len[];\n\n/*\n * Convenience for users who just want a certificate:\n * RSA by default, or ECDSA if RSA is not available\n */\nextern const char * mbedtls_test_ca_crt;\nextern const size_t mbedtls_test_ca_crt_len;\nextern const char * mbedtls_test_ca_key;\nextern const size_t mbedtls_test_ca_key_len;\nextern const char * mbedtls_test_ca_pwd;\nextern const size_t mbedtls_test_ca_pwd_len;\nextern const char * mbedtls_test_srv_crt;\nextern const size_t mbedtls_test_srv_crt_len;\nextern const char * mbedtls_test_srv_key;\nextern const size_t mbedtls_test_srv_key_len;\nextern const char * mbedtls_test_cli_crt;\nextern const size_t mbedtls_test_cli_crt_len;\nextern const char * mbedtls_test_cli_key;\nextern const size_t mbedtls_test_cli_key_len;\n\n#if defined(MBEDTLS_ECDSA_C)\nextern const char   mbedtls_test_ca_crt_ec[];\nextern const size_t mbedtls_test_ca_crt_ec_len;\nextern const char   mbedtls_test_ca_key_ec[];\nextern const size_t mbedtls_test_ca_key_ec_len;\nextern const char   mbedtls_test_ca_pwd_ec[];\nextern const size_t mbedtls_test_ca_pwd_ec_len;\nextern const char   mbedtls_test_srv_crt_ec[];\nextern const size_t mbedtls_test_srv_crt_ec_len;\nextern const char   mbedtls_test_srv_key_ec[];\nextern const size_t mbedtls_test_srv_key_ec_len;\nextern const char   mbedtls_test_cli_crt_ec[];\nextern const size_t mbedtls_test_cli_crt_ec_len;\nextern const char   mbedtls_test_cli_key_ec[];\nextern const size_t mbedtls_test_cli_key_ec_len;\n#endif\n\n#if defined(MBEDTLS_RSA_C)\nextern const char   mbedtls_test_ca_crt_rsa[];\nextern const size_t mbedtls_test_ca_crt_rsa_len;\nextern const char   mbedtls_test_ca_key_rsa[];\nextern const size_t mbedtls_test_ca_key_rsa_len;\nextern const char   mbedtls_test_ca_pwd_rsa[];\nextern const size_t mbedtls_test_ca_pwd_rsa_len;\nextern const char   mbedtls_test_srv_crt_rsa[];\nextern const size_t mbedtls_test_srv_crt_rsa_len;\nextern const char   mbedtls_test_srv_key_rsa[];\nextern const size_t mbedtls_test_srv_key_rsa_len;\nextern const char   mbedtls_test_cli_crt_rsa[];\nextern const size_t mbedtls_test_cli_crt_rsa_len;\nextern const char   mbedtls_test_cli_key_rsa[];\nextern const size_t mbedtls_test_cli_key_rsa_len;\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* certs.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/check_config.h",
    "content": "/**\n * \\file check_config.h\n *\n * \\brief Consistency checks for configuration options\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * It is recommended to include this file from your config.h\n * in order to catch dependency issues early.\n */\n\n#ifndef MBEDTLS_CHECK_CONFIG_H\n#define MBEDTLS_CHECK_CONFIG_H\n\n/*\n * We assume CHAR_BIT is 8 in many places. In practice, this is true on our\n * target platforms, so not an issue, but let's just be extra sure.\n */\n#include <limits.h>\n#if CHAR_BIT != 8\n#error \"mbed TLS requires a platform with 8-bit chars\"\n#endif\n\n#if defined(_WIN32)\n#if !defined(MBEDTLS_PLATFORM_C)\n#error \"MBEDTLS_PLATFORM_C is required on Windows\"\n#endif\n\n/* Fix the config here. Not convenient to put an #ifdef _WIN32 in config.h as\n * it would confuse config.pl. */\n#if !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && \\\n    !defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO)\n#define MBEDTLS_PLATFORM_SNPRINTF_ALT\n#endif\n#endif /* _WIN32 */\n\n#if defined(TARGET_LIKE_MBED) && \\\n    ( defined(MBEDTLS_NET_C) || defined(MBEDTLS_TIMING_C) )\n#error \"The NET and TIMING modules are not available for mbed OS - please use the network and timing functions provided by mbed OS\"\n#endif\n\n#if defined(MBEDTLS_DEPRECATED_WARNING) && \\\n    !defined(__GNUC__) && !defined(__clang__)\n#error \"MBEDTLS_DEPRECATED_WARNING only works with GCC and Clang\"\n#endif\n\n#if defined(MBEDTLS_HAVE_TIME_DATE) && !defined(MBEDTLS_HAVE_TIME)\n#error \"MBEDTLS_HAVE_TIME_DATE without MBEDTLS_HAVE_TIME does not make sense\"\n#endif\n\n#if defined(MBEDTLS_AESNI_C) && !defined(MBEDTLS_HAVE_ASM)\n#error \"MBEDTLS_AESNI_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_CTR_DRBG_C) && !defined(MBEDTLS_AES_C)\n#error \"MBEDTLS_CTR_DRBG_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_DHM_C) && !defined(MBEDTLS_BIGNUM_C)\n#error \"MBEDTLS_DHM_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_CMAC_C) && \\\n    !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_DES_C)\n#error \"MBEDTLS_CMAC_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECDH_C) && !defined(MBEDTLS_ECP_C)\n#error \"MBEDTLS_ECDH_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECDSA_C) &&            \\\n    ( !defined(MBEDTLS_ECP_C) ||           \\\n      !defined(MBEDTLS_ASN1_PARSE_C) ||    \\\n      !defined(MBEDTLS_ASN1_WRITE_C) )\n#error \"MBEDTLS_ECDSA_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECJPAKE_C) &&           \\\n    ( !defined(MBEDTLS_ECP_C) || !defined(MBEDTLS_MD_C) )\n#error \"MBEDTLS_ECJPAKE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECDSA_DETERMINISTIC) && !defined(MBEDTLS_HMAC_DRBG_C)\n#error \"MBEDTLS_ECDSA_DETERMINISTIC defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECP_C) && ( !defined(MBEDTLS_BIGNUM_C) || (   \\\n    !defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) &&                  \\\n    !defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) &&                  \\\n    !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) &&                  \\\n    !defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) &&                  \\\n    !defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) &&                  \\\n    !defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)   &&                  \\\n    !defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)   &&                  \\\n    !defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)   &&                  \\\n    !defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) &&                  \\\n    !defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) &&                  \\\n    !defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED) ) )\n#error \"MBEDTLS_ECP_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ENTROPY_C) && (!defined(MBEDTLS_SHA512_C) &&      \\\n                                    !defined(MBEDTLS_SHA256_C))\n#error \"MBEDTLS_ENTROPY_C defined, but not all prerequisites\"\n#endif\n#if defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_SHA512_C) &&         \\\n    defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 64)\n#error \"MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high\"\n#endif\n#if defined(MBEDTLS_ENTROPY_C) &&                                            \\\n    ( !defined(MBEDTLS_SHA512_C) || defined(MBEDTLS_ENTROPY_FORCE_SHA256) ) \\\n    && defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN) && (MBEDTLS_CTR_DRBG_ENTROPY_LEN > 32)\n#error \"MBEDTLS_CTR_DRBG_ENTROPY_LEN value too high\"\n#endif\n#if defined(MBEDTLS_ENTROPY_C) && \\\n    defined(MBEDTLS_ENTROPY_FORCE_SHA256) && !defined(MBEDTLS_SHA256_C)\n#error \"MBEDTLS_ENTROPY_FORCE_SHA256 defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_TEST_NULL_ENTROPY) && \\\n    ( !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES) )\n#error \"MBEDTLS_TEST_NULL_ENTROPY defined, but not all prerequisites\"\n#endif\n#if defined(MBEDTLS_TEST_NULL_ENTROPY) && \\\n     ( defined(MBEDTLS_ENTROPY_NV_SEED) || defined(MBEDTLS_ENTROPY_HARDWARE_ALT) || \\\n    defined(MBEDTLS_HAVEGE_C) )\n#error \"MBEDTLS_TEST_NULL_ENTROPY defined, but entropy sources too\"\n#endif\n\n#if defined(MBEDTLS_GCM_C) && (                                        \\\n        !defined(MBEDTLS_AES_C) && !defined(MBEDTLS_CAMELLIA_C) )\n#error \"MBEDTLS_GCM_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT)\n#error \"MBEDTLS_ECP_RANDOMIZE_JAC_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECP_ADD_MIXED_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT)\n#error \"MBEDTLS_ECP_ADD_MIXED_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT)\n#error \"MBEDTLS_ECP_DOUBLE_JAC_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT)\n#error \"MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT)\n#error \"MBEDTLS_ECP_NORMALIZE_JAC_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT)\n#error \"MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT)\n#error \"MBEDTLS_ECP_RANDOMIZE_MXZ_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT) && !defined(MBEDTLS_ECP_INTERNAL_ALT)\n#error \"MBEDTLS_ECP_NORMALIZE_MXZ_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_HAVEGE_C) && !defined(MBEDTLS_TIMING_C)\n#error \"MBEDTLS_HAVEGE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_HMAC_DRBG_C) && !defined(MBEDTLS_MD_C)\n#error \"MBEDTLS_HMAC_DRBG_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED) &&                 \\\n    ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) )\n#error \"MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) &&                 \\\n    ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) )\n#error \"MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED) && !defined(MBEDTLS_DHM_C)\n#error \"MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) &&                     \\\n    !defined(MBEDTLS_ECDH_C)\n#error \"MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) &&                   \\\n    ( !defined(MBEDTLS_DHM_C) || !defined(MBEDTLS_RSA_C) ||           \\\n      !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) )\n#error \"MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) &&                 \\\n    ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_RSA_C) ||          \\\n      !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_PKCS1_V15) )\n#error \"MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) &&                 \\\n    ( !defined(MBEDTLS_ECDH_C) || !defined(MBEDTLS_ECDSA_C) ||          \\\n      !defined(MBEDTLS_X509_CRT_PARSE_C) )\n#error \"MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED) &&                   \\\n    ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \\\n      !defined(MBEDTLS_PKCS1_V15) )\n#error \"MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) &&                       \\\n    ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \\\n      !defined(MBEDTLS_PKCS1_V15) )\n#error \"MBEDTLS_KEY_EXCHANGE_RSA_ENABLED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED) &&                    \\\n    ( !defined(MBEDTLS_ECJPAKE_C) || !defined(MBEDTLS_SHA256_C) ||      \\\n      !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) )\n#error \"MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) &&                          \\\n    ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) )\n#error \"MBEDTLS_MEMORY_BUFFER_ALLOC_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PADLOCK_C) && !defined(MBEDTLS_HAVE_ASM)\n#error \"MBEDTLS_PADLOCK_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PEM_PARSE_C) && !defined(MBEDTLS_BASE64_C)\n#error \"MBEDTLS_PEM_PARSE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PEM_WRITE_C) && !defined(MBEDTLS_BASE64_C)\n#error \"MBEDTLS_PEM_WRITE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PK_C) && \\\n    ( !defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_ECP_C) )\n#error \"MBEDTLS_PK_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PK_PARSE_C) && !defined(MBEDTLS_PK_C)\n#error \"MBEDTLS_PK_PARSE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PK_WRITE_C) && !defined(MBEDTLS_PK_C)\n#error \"MBEDTLS_PK_WRITE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PKCS11_C) && !defined(MBEDTLS_PK_C)\n#error \"MBEDTLS_PKCS11_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_EXIT_ALT) && !defined(MBEDTLS_PLATFORM_C)\n#error \"MBEDTLS_PLATFORM_EXIT_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) && !defined(MBEDTLS_PLATFORM_C)\n#error \"MBEDTLS_PLATFORM_EXIT_MACRO defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_EXIT_MACRO) &&\\\n    ( defined(MBEDTLS_PLATFORM_STD_EXIT) ||\\\n        defined(MBEDTLS_PLATFORM_EXIT_ALT) )\n#error \"MBEDTLS_PLATFORM_EXIT_MACRO and MBEDTLS_PLATFORM_STD_EXIT/MBEDTLS_PLATFORM_EXIT_ALT cannot be defined simultaneously\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_TIME_ALT) &&\\\n    ( !defined(MBEDTLS_PLATFORM_C) ||\\\n        !defined(MBEDTLS_HAVE_TIME) )\n#error \"MBEDTLS_PLATFORM_TIME_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_TIME_MACRO) &&\\\n    ( !defined(MBEDTLS_PLATFORM_C) ||\\\n        !defined(MBEDTLS_HAVE_TIME) )\n#error \"MBEDTLS_PLATFORM_TIME_MACRO defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\\\n    ( !defined(MBEDTLS_PLATFORM_C) ||\\\n        !defined(MBEDTLS_HAVE_TIME) )\n#error \"MBEDTLS_PLATFORM_TIME_TYPE_MACRO defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_TIME_MACRO) &&\\\n    ( defined(MBEDTLS_PLATFORM_STD_TIME) ||\\\n        defined(MBEDTLS_PLATFORM_TIME_ALT) )\n#error \"MBEDTLS_PLATFORM_TIME_MACRO and MBEDTLS_PLATFORM_STD_TIME/MBEDTLS_PLATFORM_TIME_ALT cannot be defined simultaneously\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO) &&\\\n    ( defined(MBEDTLS_PLATFORM_STD_TIME) ||\\\n        defined(MBEDTLS_PLATFORM_TIME_ALT) )\n#error \"MBEDTLS_PLATFORM_TIME_TYPE_MACRO and MBEDTLS_PLATFORM_STD_TIME/MBEDTLS_PLATFORM_TIME_ALT cannot be defined simultaneously\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C)\n#error \"MBEDTLS_PLATFORM_FPRINTF_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C)\n#error \"MBEDTLS_PLATFORM_FPRINTF_MACRO defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO) &&\\\n    ( defined(MBEDTLS_PLATFORM_STD_FPRINTF) ||\\\n        defined(MBEDTLS_PLATFORM_FPRINTF_ALT) )\n#error \"MBEDTLS_PLATFORM_FPRINTF_MACRO and MBEDTLS_PLATFORM_STD_FPRINTF/MBEDTLS_PLATFORM_FPRINTF_ALT cannot be defined simultaneously\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\\\n    ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) )\n#error \"MBEDTLS_PLATFORM_FREE_MACRO defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_FREE_MACRO) &&\\\n    defined(MBEDTLS_PLATFORM_STD_FREE)\n#error \"MBEDTLS_PLATFORM_FREE_MACRO and MBEDTLS_PLATFORM_STD_FREE cannot be defined simultaneously\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_FREE_MACRO) && !defined(MBEDTLS_PLATFORM_CALLOC_MACRO)\n#error \"MBEDTLS_PLATFORM_CALLOC_MACRO must be defined if MBEDTLS_PLATFORM_FREE_MACRO is\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\\\n    ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_PLATFORM_MEMORY) )\n#error \"MBEDTLS_PLATFORM_CALLOC_MACRO defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) &&\\\n    defined(MBEDTLS_PLATFORM_STD_CALLOC)\n#error \"MBEDTLS_PLATFORM_CALLOC_MACRO and MBEDTLS_PLATFORM_STD_CALLOC cannot be defined simultaneously\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_CALLOC_MACRO) && !defined(MBEDTLS_PLATFORM_FREE_MACRO)\n#error \"MBEDTLS_PLATFORM_FREE_MACRO must be defined if MBEDTLS_PLATFORM_CALLOC_MACRO is\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_MEMORY) && !defined(MBEDTLS_PLATFORM_C)\n#error \"MBEDTLS_PLATFORM_MEMORY defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_PRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C)\n#error \"MBEDTLS_PLATFORM_PRINTF_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C)\n#error \"MBEDTLS_PLATFORM_PRINTF_MACRO defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO) &&\\\n    ( defined(MBEDTLS_PLATFORM_STD_PRINTF) ||\\\n        defined(MBEDTLS_PLATFORM_PRINTF_ALT) )\n#error \"MBEDTLS_PLATFORM_PRINTF_MACRO and MBEDTLS_PLATFORM_STD_PRINTF/MBEDTLS_PLATFORM_PRINTF_ALT cannot be defined simultaneously\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C)\n#error \"MBEDTLS_PLATFORM_SNPRINTF_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C)\n#error \"MBEDTLS_PLATFORM_SNPRINTF_MACRO defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO) &&\\\n    ( defined(MBEDTLS_PLATFORM_STD_SNPRINTF) ||\\\n        defined(MBEDTLS_PLATFORM_SNPRINTF_ALT) )\n#error \"MBEDTLS_PLATFORM_SNPRINTF_MACRO and MBEDTLS_PLATFORM_STD_SNPRINTF/MBEDTLS_PLATFORM_SNPRINTF_ALT cannot be defined simultaneously\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) &&\\\n    !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS)\n#error \"MBEDTLS_PLATFORM_STD_MEM_HDR defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY)\n#error \"MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_CALLOC) && !defined(MBEDTLS_PLATFORM_MEMORY)\n#error \"MBEDTLS_PLATFORM_STD_CALLOC defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_FREE) && !defined(MBEDTLS_PLATFORM_MEMORY)\n#error \"MBEDTLS_PLATFORM_STD_FREE defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_EXIT) &&\\\n    !defined(MBEDTLS_PLATFORM_EXIT_ALT)\n#error \"MBEDTLS_PLATFORM_STD_EXIT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_TIME) &&\\\n    ( !defined(MBEDTLS_PLATFORM_TIME_ALT) ||\\\n        !defined(MBEDTLS_HAVE_TIME) )\n#error \"MBEDTLS_PLATFORM_STD_TIME defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_FPRINTF) &&\\\n    !defined(MBEDTLS_PLATFORM_FPRINTF_ALT)\n#error \"MBEDTLS_PLATFORM_STD_FPRINTF defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_PRINTF) &&\\\n    !defined(MBEDTLS_PLATFORM_PRINTF_ALT)\n#error \"MBEDTLS_PLATFORM_STD_PRINTF defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_SNPRINTF) &&\\\n    !defined(MBEDTLS_PLATFORM_SNPRINTF_ALT)\n#error \"MBEDTLS_PLATFORM_STD_SNPRINTF defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_ENTROPY_NV_SEED) &&\\\n    ( !defined(MBEDTLS_PLATFORM_C) || !defined(MBEDTLS_ENTROPY_C) )\n#error \"MBEDTLS_ENTROPY_NV_SEED defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_NV_SEED_ALT) &&\\\n    !defined(MBEDTLS_ENTROPY_NV_SEED)\n#error \"MBEDTLS_PLATFORM_NV_SEED_ALT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) &&\\\n    !defined(MBEDTLS_PLATFORM_NV_SEED_ALT)\n#error \"MBEDTLS_PLATFORM_STD_NV_SEED_READ defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) &&\\\n    !defined(MBEDTLS_PLATFORM_NV_SEED_ALT)\n#error \"MBEDTLS_PLATFORM_STD_NV_SEED_WRITE defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_NV_SEED_READ_MACRO) &&\\\n    ( defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ) ||\\\n      defined(MBEDTLS_PLATFORM_NV_SEED_ALT) )\n#error \"MBEDTLS_PLATFORM_NV_SEED_READ_MACRO and MBEDTLS_PLATFORM_STD_NV_SEED_READ cannot be defined simultaneously\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO) &&\\\n    ( defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE) ||\\\n      defined(MBEDTLS_PLATFORM_NV_SEED_ALT) )\n#error \"MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO and MBEDTLS_PLATFORM_STD_NV_SEED_WRITE cannot be defined simultaneously\"\n#endif\n\n#if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_BIGNUM_C) ||         \\\n    !defined(MBEDTLS_OID_C) )\n#error \"MBEDTLS_RSA_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_PKCS1_V21) &&         \\\n    !defined(MBEDTLS_PKCS1_V15) )\n#error \"MBEDTLS_RSA_C defined, but none of the PKCS1 versions enabled\"\n#endif\n\n#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT) &&                        \\\n    ( !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_PKCS1_V21) )\n#error \"MBEDTLS_X509_RSASSA_PSS_SUPPORT defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) && ( !defined(MBEDTLS_MD5_C) ||     \\\n    !defined(MBEDTLS_SHA1_C) )\n#error \"MBEDTLS_SSL_PROTO_SSL3 defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1) && ( !defined(MBEDTLS_MD5_C) ||     \\\n    !defined(MBEDTLS_SHA1_C) )\n#error \"MBEDTLS_SSL_PROTO_TLS1 defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_1) && ( !defined(MBEDTLS_MD5_C) ||     \\\n    !defined(MBEDTLS_SHA1_C) )\n#error \"MBEDTLS_SSL_PROTO_TLS1_1 defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && ( !defined(MBEDTLS_SHA1_C) &&     \\\n    !defined(MBEDTLS_SHA256_C) && !defined(MBEDTLS_SHA512_C) )\n#error \"MBEDTLS_SSL_PROTO_TLS1_2 defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)     && \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1_1)  && \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#error \"MBEDTLS_SSL_PROTO_DTLS defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_CLI_C) && !defined(MBEDTLS_SSL_TLS_C)\n#error \"MBEDTLS_SSL_CLI_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_TLS_C) && ( !defined(MBEDTLS_CIPHER_C) ||     \\\n    !defined(MBEDTLS_MD_C) )\n#error \"MBEDTLS_SSL_TLS_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_SRV_C) && !defined(MBEDTLS_SSL_TLS_C)\n#error \"MBEDTLS_SSL_SRV_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_TLS_C) && (!defined(MBEDTLS_SSL_PROTO_SSL3) && \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1) && !defined(MBEDTLS_SSL_PROTO_TLS1_1) && \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1_2))\n#error \"MBEDTLS_SSL_TLS_C defined, but no protocols are active\"\n#endif\n\n#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1) && !defined(MBEDTLS_SSL_PROTO_TLS1))\n#error \"Illegal protocol selection\"\n#endif\n\n#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_TLS1) && \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2) && !defined(MBEDTLS_SSL_PROTO_TLS1_1))\n#error \"Illegal protocol selection\"\n#endif\n\n#if defined(MBEDTLS_SSL_TLS_C) && (defined(MBEDTLS_SSL_PROTO_SSL3) && \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2) && (!defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1_1)))\n#error \"Illegal protocol selection\"\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && !defined(MBEDTLS_SSL_PROTO_DTLS)\n#error \"MBEDTLS_SSL_DTLS_HELLO_VERIFY  defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && \\\n    !defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)\n#error \"MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE  defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) &&                              \\\n    ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) )\n#error \"MBEDTLS_SSL_DTLS_ANTI_REPLAY  defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT) &&                              \\\n    ( !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) )\n#error \"MBEDTLS_SSL_DTLS_BADMAC_LIMIT  defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC) &&   \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1)   &&      \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1_1) &&      \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#error \"MBEDTLS_SSL_ENCRYPT_THEN_MAC defined, but not all prerequsites\"\n#endif\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET) && \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1)   &&          \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1_1) &&          \\\n    !defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#error \"MBEDTLS_SSL_EXTENDED_MASTER_SECRET defined, but not all prerequsites\"\n#endif\n\n#if defined(MBEDTLS_SSL_TICKET_C) && !defined(MBEDTLS_CIPHER_C)\n#error \"MBEDTLS_SSL_TICKET_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) && \\\n    !defined(MBEDTLS_SSL_PROTO_SSL3) && !defined(MBEDTLS_SSL_PROTO_TLS1)\n#error \"MBEDTLS_SSL_CBC_RECORD_SPLITTING defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && \\\n        !defined(MBEDTLS_X509_CRT_PARSE_C)\n#error \"MBEDTLS_SSL_SERVER_NAME_INDICATION defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_THREADING_PTHREAD)\n#if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL)\n#error \"MBEDTLS_THREADING_PTHREAD defined, but not all prerequisites\"\n#endif\n#define MBEDTLS_THREADING_IMPL\n#endif\n\n#if defined(MBEDTLS_THREADING_ALT)\n#if !defined(MBEDTLS_THREADING_C) || defined(MBEDTLS_THREADING_IMPL)\n#error \"MBEDTLS_THREADING_ALT defined, but not all prerequisites\"\n#endif\n#define MBEDTLS_THREADING_IMPL\n#endif\n\n#if defined(MBEDTLS_THREADING_C) && !defined(MBEDTLS_THREADING_IMPL)\n#error \"MBEDTLS_THREADING_C defined, single threading implementation required\"\n#endif\n#undef MBEDTLS_THREADING_IMPL\n\n#if defined(MBEDTLS_VERSION_FEATURES) && !defined(MBEDTLS_VERSION_C)\n#error \"MBEDTLS_VERSION_FEATURES defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_X509_USE_C) && ( !defined(MBEDTLS_BIGNUM_C) ||  \\\n    !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_PARSE_C) ||      \\\n    !defined(MBEDTLS_PK_PARSE_C) )\n#error \"MBEDTLS_X509_USE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_X509_CREATE_C) && ( !defined(MBEDTLS_BIGNUM_C) ||  \\\n    !defined(MBEDTLS_OID_C) || !defined(MBEDTLS_ASN1_WRITE_C) ||       \\\n    !defined(MBEDTLS_PK_WRITE_C) )\n#error \"MBEDTLS_X509_CREATE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) )\n#error \"MBEDTLS_X509_CRT_PARSE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_X509_CRL_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) )\n#error \"MBEDTLS_X509_CRL_PARSE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_X509_CSR_PARSE_C) && ( !defined(MBEDTLS_X509_USE_C) )\n#error \"MBEDTLS_X509_CSR_PARSE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_X509_CRT_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) )\n#error \"MBEDTLS_X509_CRT_WRITE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_X509_CSR_WRITE_C) && ( !defined(MBEDTLS_X509_CREATE_C) )\n#error \"MBEDTLS_X509_CSR_WRITE_C defined, but not all prerequisites\"\n#endif\n\n#if defined(MBEDTLS_HAVE_INT32) && defined(MBEDTLS_HAVE_INT64)\n#error \"MBEDTLS_HAVE_INT32 and MBEDTLS_HAVE_INT64 cannot be defined simultaneously\"\n#endif /* MBEDTLS_HAVE_INT32 && MBEDTLS_HAVE_INT64 */\n\n#if ( defined(MBEDTLS_HAVE_INT32) || defined(MBEDTLS_HAVE_INT64) ) && \\\n    defined(MBEDTLS_HAVE_ASM)\n#error \"MBEDTLS_HAVE_INT32/MBEDTLS_HAVE_INT64 and MBEDTLS_HAVE_ASM cannot be defined simultaneously\"\n#endif /* (MBEDTLS_HAVE_INT32 || MBEDTLS_HAVE_INT64) && MBEDTLS_HAVE_ASM */\n\n/*\n * Avoid warning from -pedantic. This is a convenient place for this\n * workaround since this is included by every single file before the\n * #if defined(MBEDTLS_xxx_C) that results in emtpy translation units.\n */\ntypedef int mbedtls_iso_c_forbids_empty_translation_units;\n\n#endif /* MBEDTLS_CHECK_CONFIG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/cipher.h",
    "content": "/**\n * \\file cipher.h\n *\n * \\brief Generic cipher wrapper.\n *\n * \\author Adriaan de Jong <dejong@fox-it.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#ifndef MBEDTLS_CIPHER_H\n#define MBEDTLS_CIPHER_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n\n#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C)\n#define MBEDTLS_CIPHER_MODE_AEAD\n#endif\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#define MBEDTLS_CIPHER_MODE_WITH_PADDING\n#endif\n\n#if defined(MBEDTLS_ARC4_C)\n#define MBEDTLS_CIPHER_MODE_STREAM\n#endif\n\n#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \\\n    !defined(inline) && !defined(__cplusplus)\n#define inline __inline\n#endif\n\n#define MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE            -0x6080  /**< The selected feature is not available. */\n#define MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA                 -0x6100  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_CIPHER_ALLOC_FAILED                   -0x6180  /**< Failed to allocate memory. */\n#define MBEDTLS_ERR_CIPHER_INVALID_PADDING                -0x6200  /**< Input data contains invalid padding and is rejected. */\n#define MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED            -0x6280  /**< Decryption of block requires a full block. */\n#define MBEDTLS_ERR_CIPHER_AUTH_FAILED                    -0x6300  /**< Authentication failed (for AEAD modes). */\n#define MBEDTLS_ERR_CIPHER_INVALID_CONTEXT              -0x6380  /**< The context is invalid, eg because it was free()ed. */\n\n#define MBEDTLS_CIPHER_VARIABLE_IV_LEN     0x01    /**< Cipher accepts IVs of variable length */\n#define MBEDTLS_CIPHER_VARIABLE_KEY_LEN    0x02    /**< Cipher accepts keys of variable length */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    MBEDTLS_CIPHER_ID_NONE = 0,\n    MBEDTLS_CIPHER_ID_NULL,\n    MBEDTLS_CIPHER_ID_AES,\n    MBEDTLS_CIPHER_ID_DES,\n    MBEDTLS_CIPHER_ID_3DES,\n    MBEDTLS_CIPHER_ID_CAMELLIA,\n    MBEDTLS_CIPHER_ID_BLOWFISH,\n    MBEDTLS_CIPHER_ID_ARC4,\n} mbedtls_cipher_id_t;\n\ntypedef enum {\n    MBEDTLS_CIPHER_NONE = 0,\n    MBEDTLS_CIPHER_NULL,\n    MBEDTLS_CIPHER_AES_128_ECB,\n    MBEDTLS_CIPHER_AES_192_ECB,\n    MBEDTLS_CIPHER_AES_256_ECB,\n    MBEDTLS_CIPHER_AES_128_CBC,\n    MBEDTLS_CIPHER_AES_192_CBC,\n    MBEDTLS_CIPHER_AES_256_CBC,\n    MBEDTLS_CIPHER_AES_128_CFB128,\n    MBEDTLS_CIPHER_AES_192_CFB128,\n    MBEDTLS_CIPHER_AES_256_CFB128,\n    MBEDTLS_CIPHER_AES_128_CTR,\n    MBEDTLS_CIPHER_AES_192_CTR,\n    MBEDTLS_CIPHER_AES_256_CTR,\n    MBEDTLS_CIPHER_AES_128_GCM,\n    MBEDTLS_CIPHER_AES_192_GCM,\n    MBEDTLS_CIPHER_AES_256_GCM,\n    MBEDTLS_CIPHER_CAMELLIA_128_ECB,\n    MBEDTLS_CIPHER_CAMELLIA_192_ECB,\n    MBEDTLS_CIPHER_CAMELLIA_256_ECB,\n    MBEDTLS_CIPHER_CAMELLIA_128_CBC,\n    MBEDTLS_CIPHER_CAMELLIA_192_CBC,\n    MBEDTLS_CIPHER_CAMELLIA_256_CBC,\n    MBEDTLS_CIPHER_CAMELLIA_128_CFB128,\n    MBEDTLS_CIPHER_CAMELLIA_192_CFB128,\n    MBEDTLS_CIPHER_CAMELLIA_256_CFB128,\n    MBEDTLS_CIPHER_CAMELLIA_128_CTR,\n    MBEDTLS_CIPHER_CAMELLIA_192_CTR,\n    MBEDTLS_CIPHER_CAMELLIA_256_CTR,\n    MBEDTLS_CIPHER_CAMELLIA_128_GCM,\n    MBEDTLS_CIPHER_CAMELLIA_192_GCM,\n    MBEDTLS_CIPHER_CAMELLIA_256_GCM,\n    MBEDTLS_CIPHER_DES_ECB,\n    MBEDTLS_CIPHER_DES_CBC,\n    MBEDTLS_CIPHER_DES_EDE_ECB,\n    MBEDTLS_CIPHER_DES_EDE_CBC,\n    MBEDTLS_CIPHER_DES_EDE3_ECB,\n    MBEDTLS_CIPHER_DES_EDE3_CBC,\n    MBEDTLS_CIPHER_BLOWFISH_ECB,\n    MBEDTLS_CIPHER_BLOWFISH_CBC,\n    MBEDTLS_CIPHER_BLOWFISH_CFB64,\n    MBEDTLS_CIPHER_BLOWFISH_CTR,\n    MBEDTLS_CIPHER_ARC4_128,\n    MBEDTLS_CIPHER_AES_128_CCM,\n    MBEDTLS_CIPHER_AES_192_CCM,\n    MBEDTLS_CIPHER_AES_256_CCM,\n    MBEDTLS_CIPHER_CAMELLIA_128_CCM,\n    MBEDTLS_CIPHER_CAMELLIA_192_CCM,\n    MBEDTLS_CIPHER_CAMELLIA_256_CCM,\n} mbedtls_cipher_type_t;\n\ntypedef enum {\n    MBEDTLS_MODE_NONE = 0,\n    MBEDTLS_MODE_ECB,\n    MBEDTLS_MODE_CBC,\n    MBEDTLS_MODE_CFB,\n    MBEDTLS_MODE_OFB, /* Unused! */\n    MBEDTLS_MODE_CTR,\n    MBEDTLS_MODE_GCM,\n    MBEDTLS_MODE_STREAM,\n    MBEDTLS_MODE_CCM,\n} mbedtls_cipher_mode_t;\n\ntypedef enum {\n    MBEDTLS_PADDING_PKCS7 = 0,     /**< PKCS7 padding (default)        */\n    MBEDTLS_PADDING_ONE_AND_ZEROS, /**< ISO/IEC 7816-4 padding         */\n    MBEDTLS_PADDING_ZEROS_AND_LEN, /**< ANSI X.923 padding             */\n    MBEDTLS_PADDING_ZEROS,         /**< zero padding (not reversible!) */\n    MBEDTLS_PADDING_NONE,          /**< never pad (full blocks only)   */\n} mbedtls_cipher_padding_t;\n\ntypedef enum {\n    MBEDTLS_OPERATION_NONE = -1,\n    MBEDTLS_DECRYPT = 0,\n    MBEDTLS_ENCRYPT,\n} mbedtls_operation_t;\n\nenum {\n    /** Undefined key length */\n    MBEDTLS_KEY_LENGTH_NONE = 0,\n    /** Key length, in bits (including parity), for DES keys */\n    MBEDTLS_KEY_LENGTH_DES  = 64,\n    /** Key length, in bits (including parity), for DES in two key EDE */\n    MBEDTLS_KEY_LENGTH_DES_EDE = 128,\n    /** Key length, in bits (including parity), for DES in three-key EDE */\n    MBEDTLS_KEY_LENGTH_DES_EDE3 = 192,\n};\n\n/** Maximum length of any IV, in bytes */\n#define MBEDTLS_MAX_IV_LENGTH      16\n/** Maximum block size of any cipher, in bytes */\n#define MBEDTLS_MAX_BLOCK_LENGTH   16\n\n/**\n * Base cipher information (opaque struct).\n */\ntypedef struct mbedtls_cipher_base_t mbedtls_cipher_base_t;\n\n/**\n * CMAC context (opaque struct).\n */\ntypedef struct mbedtls_cmac_context_t mbedtls_cmac_context_t;\n\n/**\n * Cipher information. Allows cipher functions to be called in a generic way.\n */\ntypedef struct {\n    /** Full cipher identifier (e.g. MBEDTLS_CIPHER_AES_256_CBC) */\n    mbedtls_cipher_type_t type;\n\n    /** Cipher mode (e.g. MBEDTLS_MODE_CBC) */\n    mbedtls_cipher_mode_t mode;\n\n    /** Cipher key length, in bits (default length for variable sized ciphers)\n     *  (Includes parity bits for ciphers like DES) */\n    unsigned int key_bitlen;\n\n    /** Name of the cipher */\n    const char * name;\n\n    /** IV/NONCE size, in bytes.\n     *  For cipher that accept many sizes: recommended size */\n    unsigned int iv_size;\n\n    /** Flags for variable IV size, variable key size, etc. */\n    int flags;\n\n    /** block size, in bytes */\n    unsigned int block_size;\n\n    /** Base cipher information and functions */\n    const mbedtls_cipher_base_t *base;\n\n} mbedtls_cipher_info_t;\n\n/**\n * Generic cipher context.\n */\ntypedef struct {\n    /** Information about the associated cipher */\n    const mbedtls_cipher_info_t *cipher_info;\n\n    /** Key length to use */\n    int key_bitlen;\n\n    /** Operation that the context's key has been initialised for */\n    mbedtls_operation_t operation;\n\n#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)\n    /** Padding functions to use, if relevant for cipher mode */\n    void (*add_padding)( unsigned char *output, size_t olen, size_t data_len );\n    int (*get_padding)( unsigned char *input, size_t ilen, size_t *data_len );\n#endif\n\n    /** Buffer for data that hasn't been encrypted yet */\n    unsigned char unprocessed_data[MBEDTLS_MAX_BLOCK_LENGTH];\n\n    /** Number of bytes that still need processing */\n    size_t unprocessed_len;\n\n    /** Current IV or NONCE_COUNTER for CTR-mode */\n    unsigned char iv[MBEDTLS_MAX_IV_LENGTH];\n\n    /** IV size in bytes (for ciphers with variable-length IVs) */\n    size_t iv_size;\n\n    /** Cipher-specific context */\n    void *cipher_ctx;\n\n#if defined(MBEDTLS_CMAC_C)\n    /** CMAC Specific context */\n    mbedtls_cmac_context_t *cmac_ctx;\n#endif\n} mbedtls_cipher_context_t;\n\n/**\n * \\brief Returns the list of ciphers supported by the generic cipher module.\n *\n * \\return              a statically allocated array of ciphers, the last entry\n *                      is 0.\n */\nconst int *mbedtls_cipher_list( void );\n\n/**\n * \\brief               Returns the cipher information structure associated\n *                      with the given cipher name.\n *\n * \\param cipher_name   Name of the cipher to search for.\n *\n * \\return              the cipher information structure associated with the\n *                      given cipher_name, or NULL if not found.\n */\nconst mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( const char *cipher_name );\n\n/**\n * \\brief               Returns the cipher information structure associated\n *                      with the given cipher type.\n *\n * \\param cipher_type   Type of the cipher to search for.\n *\n * \\return              the cipher information structure associated with the\n *                      given cipher_type, or NULL if not found.\n */\nconst mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( const mbedtls_cipher_type_t cipher_type );\n\n/**\n * \\brief               Returns the cipher information structure associated\n *                      with the given cipher id, key size and mode.\n *\n * \\param cipher_id     Id of the cipher to search for\n *                      (e.g. MBEDTLS_CIPHER_ID_AES)\n * \\param key_bitlen    Length of the key in bits\n * \\param mode          Cipher mode (e.g. MBEDTLS_MODE_CBC)\n *\n * \\return              the cipher information structure associated with the\n *                      given cipher_type, or NULL if not found.\n */\nconst mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( const mbedtls_cipher_id_t cipher_id,\n                                              int key_bitlen,\n                                              const mbedtls_cipher_mode_t mode );\n\n/**\n * \\brief               Initialize a cipher_context (as NONE)\n */\nvoid mbedtls_cipher_init( mbedtls_cipher_context_t *ctx );\n\n/**\n * \\brief               Free and clear the cipher-specific context of ctx.\n *                      Freeing ctx itself remains the responsibility of the\n *                      caller.\n */\nvoid mbedtls_cipher_free( mbedtls_cipher_context_t *ctx );\n\n/**\n * \\brief               Initialises and fills the cipher context structure with\n *                      the appropriate values.\n *\n * \\note                Currently also clears structure. In future versions you\n *                      will be required to call mbedtls_cipher_init() on the structure\n *                      first.\n *\n * \\param ctx           context to initialise. May not be NULL.\n * \\param cipher_info   cipher to use.\n *\n * \\return              0 on success,\n *                      MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA on parameter failure,\n *                      MBEDTLS_ERR_CIPHER_ALLOC_FAILED if allocation of the\n *                      cipher-specific context failed.\n */\nint mbedtls_cipher_setup( mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info );\n\n/**\n * \\brief               Returns the block size of the given cipher.\n *\n * \\param ctx           cipher's context. Must have been initialised.\n *\n * \\return              size of the cipher's blocks, or 0 if ctx has not been\n *                      initialised.\n */\nstatic inline unsigned int mbedtls_cipher_get_block_size( const mbedtls_cipher_context_t *ctx )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info )\n        return 0;\n\n    return ctx->cipher_info->block_size;\n}\n\n/**\n * \\brief               Returns the mode of operation for the cipher.\n *                      (e.g. MBEDTLS_MODE_CBC)\n *\n * \\param ctx           cipher's context. Must have been initialised.\n *\n * \\return              mode of operation, or MBEDTLS_MODE_NONE if ctx\n *                      has not been initialised.\n */\nstatic inline mbedtls_cipher_mode_t mbedtls_cipher_get_cipher_mode( const mbedtls_cipher_context_t *ctx )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info )\n        return MBEDTLS_MODE_NONE;\n\n    return ctx->cipher_info->mode;\n}\n\n/**\n * \\brief               Returns the size of the cipher's IV/NONCE in bytes.\n *\n * \\param ctx           cipher's context. Must have been initialised.\n *\n * \\return              If IV has not been set yet: (recommended) IV size\n *                      (0 for ciphers not using IV/NONCE).\n *                      If IV has already been set: actual size.\n */\nstatic inline int mbedtls_cipher_get_iv_size( const mbedtls_cipher_context_t *ctx )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info )\n        return 0;\n\n    if( ctx->iv_size != 0 )\n        return (int) ctx->iv_size;\n\n    return (int) ctx->cipher_info->iv_size;\n}\n\n/**\n * \\brief               Returns the type of the given cipher.\n *\n * \\param ctx           cipher's context. Must have been initialised.\n *\n * \\return              type of the cipher, or MBEDTLS_CIPHER_NONE if ctx has\n *                      not been initialised.\n */\nstatic inline mbedtls_cipher_type_t mbedtls_cipher_get_type( const mbedtls_cipher_context_t *ctx )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info )\n        return MBEDTLS_CIPHER_NONE;\n\n    return ctx->cipher_info->type;\n}\n\n/**\n * \\brief               Returns the name of the given cipher, as a string.\n *\n * \\param ctx           cipher's context. Must have been initialised.\n *\n * \\return              name of the cipher, or NULL if ctx was not initialised.\n */\nstatic inline const char *mbedtls_cipher_get_name( const mbedtls_cipher_context_t *ctx )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info )\n        return 0;\n\n    return ctx->cipher_info->name;\n}\n\n/**\n * \\brief               Returns the key length of the cipher.\n *\n * \\param ctx           cipher's context. Must have been initialised.\n *\n * \\return              cipher's key length, in bits, or\n *                      MBEDTLS_KEY_LENGTH_NONE if ctx has not been\n *                      initialised.\n */\nstatic inline int mbedtls_cipher_get_key_bitlen( const mbedtls_cipher_context_t *ctx )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info )\n        return MBEDTLS_KEY_LENGTH_NONE;\n\n    return (int) ctx->cipher_info->key_bitlen;\n}\n\n/**\n * \\brief               Returns the operation of the given cipher.\n *\n * \\param ctx           cipher's context. Must have been initialised.\n *\n * \\return              operation (MBEDTLS_ENCRYPT or MBEDTLS_DECRYPT),\n *                      or MBEDTLS_OPERATION_NONE if ctx has not been\n *                      initialised.\n */\nstatic inline mbedtls_operation_t mbedtls_cipher_get_operation( const mbedtls_cipher_context_t *ctx )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info )\n        return MBEDTLS_OPERATION_NONE;\n\n    return ctx->operation;\n}\n\n/**\n * \\brief               Set the key to use with the given context.\n *\n * \\param ctx           generic cipher context. May not be NULL. Must have been\n *                      initialised using cipher_context_from_type or\n *                      cipher_context_from_string.\n * \\param key           The key to use.\n * \\param key_bitlen    key length to use, in bits.\n * \\param operation     Operation that the key will be used for, either\n *                      MBEDTLS_ENCRYPT or MBEDTLS_DECRYPT.\n *\n * \\returns             0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if\n *                      parameter verification fails or a cipher specific\n *                      error code.\n */\nint mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *key,\n                   int key_bitlen, const mbedtls_operation_t operation );\n\n#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)\n/**\n * \\brief               Set padding mode, for cipher modes that use padding.\n *                      (Default: PKCS7 padding.)\n *\n * \\param ctx           generic cipher context\n * \\param mode          padding mode\n *\n * \\returns             0 on success, MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE\n *                      if selected padding mode is not supported, or\n *                      MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if the cipher mode\n *                      does not support padding.\n */\nint mbedtls_cipher_set_padding_mode( mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode );\n#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */\n\n/**\n * \\brief               Set the initialization vector (IV) or nonce\n *\n * \\param ctx           generic cipher context\n * \\param iv            IV to use (or NONCE_COUNTER for CTR-mode ciphers)\n * \\param iv_len        IV length for ciphers with variable-size IV;\n *                      discarded by ciphers with fixed-size IV.\n *\n * \\returns             0 on success, or MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA\n *\n * \\note                Some ciphers don't use IVs nor NONCE. For these\n *                      ciphers, this function has no effect.\n */\nint mbedtls_cipher_set_iv( mbedtls_cipher_context_t *ctx,\n                   const unsigned char *iv, size_t iv_len );\n\n/**\n * \\brief               Finish preparation of the given context\n *\n * \\param ctx           generic cipher context\n *\n * \\returns             0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA\n *                      if parameter verification fails.\n */\nint mbedtls_cipher_reset( mbedtls_cipher_context_t *ctx );\n\n#if defined(MBEDTLS_GCM_C)\n/**\n * \\brief               Add additional data (for AEAD ciphers).\n *                      Currently only supported with GCM.\n *                      Must be called exactly once, after mbedtls_cipher_reset().\n *\n * \\param ctx           generic cipher context\n * \\param ad            Additional data to use.\n * \\param ad_len        Length of ad.\n *\n * \\return              0 on success, or a specific error code.\n */\nint mbedtls_cipher_update_ad( mbedtls_cipher_context_t *ctx,\n                      const unsigned char *ad, size_t ad_len );\n#endif /* MBEDTLS_GCM_C */\n\n/**\n * \\brief               Generic cipher update function. Encrypts/decrypts\n *                      using the given cipher context. Writes as many block\n *                      size'd blocks of data as possible to output. Any data\n *                      that cannot be written immediately will either be added\n *                      to the next block, or flushed when cipher_final is\n *                      called.\n *                      Exception: for MBEDTLS_MODE_ECB, expects single block\n *                                 in size (e.g. 16 bytes for AES)\n *\n * \\param ctx           generic cipher context\n * \\param input         buffer holding the input data\n * \\param ilen          length of the input data\n * \\param output        buffer for the output data. Should be able to hold at\n *                      least ilen + block_size. Cannot be the same buffer as\n *                      input!\n * \\param olen          length of the output data, will be filled with the\n *                      actual number of bytes written.\n *\n * \\returns             0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if\n *                      parameter verification fails,\n *                      MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE on an\n *                      unsupported mode for a cipher or a cipher specific\n *                      error code.\n *\n * \\note                If the underlying cipher is GCM, all calls to this\n *                      function, except the last one before mbedtls_cipher_finish(),\n *                      must have ilen a multiple of the block size.\n */\nint mbedtls_cipher_update( mbedtls_cipher_context_t *ctx, const unsigned char *input,\n                   size_t ilen, unsigned char *output, size_t *olen );\n\n/**\n * \\brief               Generic cipher finalisation function. If data still\n *                      needs to be flushed from an incomplete block, data\n *                      contained within it will be padded with the size of\n *                      the last block, and written to the output buffer.\n *\n * \\param ctx           Generic cipher context\n * \\param output        buffer to write data to. Needs block_size available.\n * \\param olen          length of the data written to the output buffer.\n *\n * \\returns             0 on success, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA if\n *                      parameter verification fails,\n *                      MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption\n *                      expected a full block but was not provided one,\n *                      MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding\n *                      while decrypting or a cipher specific error code.\n */\nint mbedtls_cipher_finish( mbedtls_cipher_context_t *ctx,\n                   unsigned char *output, size_t *olen );\n\n#if defined(MBEDTLS_GCM_C)\n/**\n * \\brief               Write tag for AEAD ciphers.\n *                      Currently only supported with GCM.\n *                      Must be called after mbedtls_cipher_finish().\n *\n * \\param ctx           Generic cipher context\n * \\param tag           buffer to write the tag\n * \\param tag_len       Length of the tag to write\n *\n * \\return              0 on success, or a specific error code.\n */\nint mbedtls_cipher_write_tag( mbedtls_cipher_context_t *ctx,\n                      unsigned char *tag, size_t tag_len );\n\n/**\n * \\brief               Check tag for AEAD ciphers.\n *                      Currently only supported with GCM.\n *                      Must be called after mbedtls_cipher_finish().\n *\n * \\param ctx           Generic cipher context\n * \\param tag           Buffer holding the tag\n * \\param tag_len       Length of the tag to check\n *\n * \\return              0 on success, or a specific error code.\n */\nint mbedtls_cipher_check_tag( mbedtls_cipher_context_t *ctx,\n                      const unsigned char *tag, size_t tag_len );\n#endif /* MBEDTLS_GCM_C */\n\n/**\n * \\brief               Generic all-in-one encryption/decryption\n *                      (for all ciphers except AEAD constructs).\n *\n * \\param ctx           generic cipher context\n * \\param iv            IV to use (or NONCE_COUNTER for CTR-mode ciphers)\n * \\param iv_len        IV length for ciphers with variable-size IV;\n *                      discarded by ciphers with fixed-size IV.\n * \\param input         buffer holding the input data\n * \\param ilen          length of the input data\n * \\param output        buffer for the output data. Should be able to hold at\n *                      least ilen + block_size. Cannot be the same buffer as\n *                      input!\n * \\param olen          length of the output data, will be filled with the\n *                      actual number of bytes written.\n *\n * \\note                Some ciphers don't use IVs nor NONCE. For these\n *                      ciphers, use iv = NULL and iv_len = 0.\n *\n * \\returns             0 on success, or\n *                      MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or\n *                      MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED if decryption\n *                      expected a full block but was not provided one, or\n *                      MBEDTLS_ERR_CIPHER_INVALID_PADDING on invalid padding\n *                      while decrypting, or\n *                      a cipher specific error code.\n */\nint mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx,\n                  const unsigned char *iv, size_t iv_len,\n                  const unsigned char *input, size_t ilen,\n                  unsigned char *output, size_t *olen );\n\n#if defined(MBEDTLS_CIPHER_MODE_AEAD)\n/**\n * \\brief               Generic autenticated encryption (AEAD ciphers).\n *\n * \\param ctx           generic cipher context\n * \\param iv            IV to use (or NONCE_COUNTER for CTR-mode ciphers)\n * \\param iv_len        IV length for ciphers with variable-size IV;\n *                      discarded by ciphers with fixed-size IV.\n * \\param ad            Additional data to authenticate.\n * \\param ad_len        Length of ad.\n * \\param input         buffer holding the input data\n * \\param ilen          length of the input data\n * \\param output        buffer for the output data.\n *                      Should be able to hold at least ilen.\n * \\param olen          length of the output data, will be filled with the\n *                      actual number of bytes written.\n * \\param tag           buffer for the authentication tag\n * \\param tag_len       desired tag length\n *\n * \\returns             0 on success, or\n *                      MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or\n *                      a cipher specific error code.\n */\nint mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx,\n                         const unsigned char *iv, size_t iv_len,\n                         const unsigned char *ad, size_t ad_len,\n                         const unsigned char *input, size_t ilen,\n                         unsigned char *output, size_t *olen,\n                         unsigned char *tag, size_t tag_len );\n\n/**\n * \\brief               Generic autenticated decryption (AEAD ciphers).\n *\n * \\param ctx           generic cipher context\n * \\param iv            IV to use (or NONCE_COUNTER for CTR-mode ciphers)\n * \\param iv_len        IV length for ciphers with variable-size IV;\n *                      discarded by ciphers with fixed-size IV.\n * \\param ad            Additional data to be authenticated.\n * \\param ad_len        Length of ad.\n * \\param input         buffer holding the input data\n * \\param ilen          length of the input data\n * \\param output        buffer for the output data.\n *                      Should be able to hold at least ilen.\n * \\param olen          length of the output data, will be filled with the\n *                      actual number of bytes written.\n * \\param tag           buffer holding the authentication tag\n * \\param tag_len       length of the authentication tag\n *\n * \\returns             0 on success, or\n *                      MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA, or\n *                      MBEDTLS_ERR_CIPHER_AUTH_FAILED if data isn't authentic,\n *                      or a cipher specific error code.\n *\n * \\note                If the data is not authentic, then the output buffer\n *                      is zeroed out to prevent the unauthentic plaintext to\n *                      be used by mistake, making this interface safer.\n */\nint mbedtls_cipher_auth_decrypt( mbedtls_cipher_context_t *ctx,\n                         const unsigned char *iv, size_t iv_len,\n                         const unsigned char *ad, size_t ad_len,\n                         const unsigned char *input, size_t ilen,\n                         unsigned char *output, size_t *olen,\n                         const unsigned char *tag, size_t tag_len );\n#endif /* MBEDTLS_CIPHER_MODE_AEAD */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_CIPHER_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/cipher_internal.h",
    "content": "/**\n * \\file cipher_internal.h\n *\n * \\brief Cipher wrappers.\n *\n * \\author Adriaan de Jong <dejong@fox-it.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_CIPHER_WRAP_H\n#define MBEDTLS_CIPHER_WRAP_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"cipher.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * Base cipher information. The non-mode specific functions and values.\n */\nstruct mbedtls_cipher_base_t\n{\n    /** Base Cipher type (e.g. MBEDTLS_CIPHER_ID_AES) */\n    mbedtls_cipher_id_t cipher;\n\n    /** Encrypt using ECB */\n    int (*ecb_func)( void *ctx, mbedtls_operation_t mode,\n                     const unsigned char *input, unsigned char *output );\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    /** Encrypt using CBC */\n    int (*cbc_func)( void *ctx, mbedtls_operation_t mode, size_t length,\n                     unsigned char *iv, const unsigned char *input,\n                     unsigned char *output );\n#endif\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    /** Encrypt using CFB (Full length) */\n    int (*cfb_func)( void *ctx, mbedtls_operation_t mode, size_t length, size_t *iv_off,\n                     unsigned char *iv, const unsigned char *input,\n                     unsigned char *output );\n#endif\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    /** Encrypt using CTR */\n    int (*ctr_func)( void *ctx, size_t length, size_t *nc_off,\n                     unsigned char *nonce_counter, unsigned char *stream_block,\n                     const unsigned char *input, unsigned char *output );\n#endif\n\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    /** Encrypt using STREAM */\n    int (*stream_func)( void *ctx, size_t length,\n                        const unsigned char *input, unsigned char *output );\n#endif\n\n    /** Set key for encryption purposes */\n    int (*setkey_enc_func)( void *ctx, const unsigned char *key,\n                            unsigned int key_bitlen );\n\n    /** Set key for decryption purposes */\n    int (*setkey_dec_func)( void *ctx, const unsigned char *key,\n                            unsigned int key_bitlen);\n\n    /** Allocate a new context */\n    void * (*ctx_alloc_func)( void );\n\n    /** Free the given context */\n    void (*ctx_free_func)( void *ctx );\n\n};\n\ntypedef struct\n{\n    mbedtls_cipher_type_t type;\n    const mbedtls_cipher_info_t *info;\n} mbedtls_cipher_definition_t;\n\nextern const mbedtls_cipher_definition_t mbedtls_cipher_definitions[];\n\nextern int mbedtls_cipher_supported[];\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_CIPHER_WRAP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/cmac.h",
    "content": "/**\n * \\file cmac.h\n *\n * \\brief Cipher-based Message Authentication Code (CMAC) Mode for\n *        Authentication\n *\n *  Copyright (C) 2015-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_CMAC_H\n#define MBEDTLS_CMAC_H\n\n#include \"mbedtls/cipher.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define MBEDTLS_AES_BLOCK_SIZE          16\n#define MBEDTLS_DES3_BLOCK_SIZE         8\n\n#if defined(MBEDTLS_AES_C)\n#define MBEDTLS_CIPHER_BLKSIZE_MAX      16  /* longest used by CMAC is AES */\n#else\n#define MBEDTLS_CIPHER_BLKSIZE_MAX      8   /* longest used by CMAC is 3DES */\n#endif\n\n/**\n * CMAC context structure - Contains internal state information only\n */\nstruct mbedtls_cmac_context_t\n{\n    /** Internal state of the CMAC algorithm  */\n    unsigned char       state[MBEDTLS_CIPHER_BLKSIZE_MAX];\n\n    /** Unprocessed data - either data that was not block aligned and is still\n     *  pending to be processed, or the final block */\n    unsigned char       unprocessed_block[MBEDTLS_CIPHER_BLKSIZE_MAX];\n\n    /** Length of data pending to be processed */\n    size_t              unprocessed_len;\n};\n\n/**\n * \\brief               Set the CMAC key and prepare to authenticate the input\n *                      data.\n *                      Should be called with an initialized cipher context.\n *\n * \\param ctx           Cipher context. This should be a cipher context,\n *                      initialized to be one of the following types:\n *                      MBEDTLS_CIPHER_AES_128_ECB, MBEDTLS_CIPHER_AES_192_ECB,\n *                      MBEDTLS_CIPHER_AES_256_ECB or\n *                      MBEDTLS_CIPHER_DES_EDE3_ECB.\n * \\param key           CMAC key\n * \\param keybits       length of the CMAC key in bits\n *                      (must be acceptable by the cipher)\n *\n * \\return              0 if successful, or a cipher specific error code\n */\nint mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx,\n                                const unsigned char *key, size_t keybits );\n\n/**\n * \\brief               Generic CMAC process buffer.\n *                      Called between mbedtls_cipher_cmac_starts() or\n *                      mbedtls_cipher_cmac_reset() and\n *                      mbedtls_cipher_cmac_finish().\n *                      May be called repeatedly.\n *\n * \\param ctx           CMAC context\n * \\param input         buffer holding the  data\n * \\param ilen          length of the input data\n *\n * \\returns             0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                      verification fails.\n */\nint mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx,\n                                const unsigned char *input, size_t ilen );\n\n/**\n * \\brief               Output CMAC.\n *                      Called after mbedtls_cipher_cmac_update().\n *                      Usually followed by mbedtls_cipher_cmac_reset(), then\n *                      mbedtls_cipher_cmac_starts(), or mbedtls_cipher_free().\n *\n * \\param ctx           CMAC context\n * \\param output        Generic CMAC checksum result\n *\n * \\returns             0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                      verification fails.\n */\nint mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx,\n                                unsigned char *output );\n\n/**\n * \\brief               Prepare to authenticate a new message with the same key.\n *                      Called after mbedtls_cipher_cmac_finish() and before\n *                      mbedtls_cipher_cmac_update().\n *\n * \\param ctx           CMAC context to be reset\n *\n * \\returns             0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                      verification fails.\n */\nint mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx );\n\n/**\n * \\brief               Output = Generic_CMAC( cmac key, input buffer )\n *\n * \\param cipher_info   message digest info\n * \\param key           CMAC key\n * \\param keylen        length of the CMAC key in bits\n * \\param input         buffer holding the  data\n * \\param ilen          length of the input data\n * \\param output        Generic CMAC-result\n *\n * \\returns             0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                      verification fails.\n */\nint mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info,\n                         const unsigned char *key, size_t keylen,\n                         const unsigned char *input, size_t ilen,\n                         unsigned char *output );\n\n#if defined(MBEDTLS_AES_C)\n/**\n * \\brief           AES-CMAC-128-PRF\n *                  Implementation of (AES-CMAC-PRF-128), as defined in RFC 4615\n *\n * \\param key       PRF key\n * \\param key_len   PRF key length in bytes\n * \\param input     buffer holding the input data\n * \\param in_len    length of the input data in bytes\n * \\param output    buffer holding the generated pseudorandom output (16 bytes)\n *\n * \\return          0 if successful\n */\nint mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_len,\n                              const unsigned char *input, size_t in_len,\n                              unsigned char output[16] );\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_SELF_TEST) && ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C) )\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_cmac_self_test( int verbose );\n#endif /* MBEDTLS_SELF_TEST && ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_CMAC_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/compat-1.3.h",
    "content": "/**\n * \\file compat-1.3.h\n *\n * \\brief Compatibility definitions for using mbed TLS with client code written\n *  for the PolarSSL naming conventions.\n *\n * \\deprecated Use the new names directly instead\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if ! defined(MBEDTLS_DEPRECATED_REMOVED)\n\n#if defined(MBEDTLS_DEPRECATED_WARNING)\n#warning \"Including compat-1.3.h is deprecated\"\n#endif\n\n#ifndef MBEDTLS_COMPAT13_H\n#define MBEDTLS_COMPAT13_H\n\n/*\n * config.h options\n */\n#if defined MBEDTLS_AESNI_C\n#define POLARSSL_AESNI_C MBEDTLS_AESNI_C\n#endif\n#if defined MBEDTLS_AES_ALT\n#define POLARSSL_AES_ALT MBEDTLS_AES_ALT\n#endif\n#if defined MBEDTLS_AES_C\n#define POLARSSL_AES_C MBEDTLS_AES_C\n#endif\n#if defined MBEDTLS_AES_ROM_TABLES\n#define POLARSSL_AES_ROM_TABLES MBEDTLS_AES_ROM_TABLES\n#endif\n#if defined MBEDTLS_ARC4_ALT\n#define POLARSSL_ARC4_ALT MBEDTLS_ARC4_ALT\n#endif\n#if defined MBEDTLS_ARC4_C\n#define POLARSSL_ARC4_C MBEDTLS_ARC4_C\n#endif\n#if defined MBEDTLS_ASN1_PARSE_C\n#define POLARSSL_ASN1_PARSE_C MBEDTLS_ASN1_PARSE_C\n#endif\n#if defined MBEDTLS_ASN1_WRITE_C\n#define POLARSSL_ASN1_WRITE_C MBEDTLS_ASN1_WRITE_C\n#endif\n#if defined MBEDTLS_BASE64_C\n#define POLARSSL_BASE64_C MBEDTLS_BASE64_C\n#endif\n#if defined MBEDTLS_BIGNUM_C\n#define POLARSSL_BIGNUM_C MBEDTLS_BIGNUM_C\n#endif\n#if defined MBEDTLS_BLOWFISH_ALT\n#define POLARSSL_BLOWFISH_ALT MBEDTLS_BLOWFISH_ALT\n#endif\n#if defined MBEDTLS_BLOWFISH_C\n#define POLARSSL_BLOWFISH_C MBEDTLS_BLOWFISH_C\n#endif\n#if defined MBEDTLS_CAMELLIA_ALT\n#define POLARSSL_CAMELLIA_ALT MBEDTLS_CAMELLIA_ALT\n#endif\n#if defined MBEDTLS_CAMELLIA_C\n#define POLARSSL_CAMELLIA_C MBEDTLS_CAMELLIA_C\n#endif\n#if defined MBEDTLS_CAMELLIA_SMALL_MEMORY\n#define POLARSSL_CAMELLIA_SMALL_MEMORY MBEDTLS_CAMELLIA_SMALL_MEMORY\n#endif\n#if defined MBEDTLS_CCM_C\n#define POLARSSL_CCM_C MBEDTLS_CCM_C\n#endif\n#if defined MBEDTLS_CERTS_C\n#define POLARSSL_CERTS_C MBEDTLS_CERTS_C\n#endif\n#if defined MBEDTLS_CIPHER_C\n#define POLARSSL_CIPHER_C MBEDTLS_CIPHER_C\n#endif\n#if defined MBEDTLS_CIPHER_MODE_CBC\n#define POLARSSL_CIPHER_MODE_CBC MBEDTLS_CIPHER_MODE_CBC\n#endif\n#if defined MBEDTLS_CIPHER_MODE_CFB\n#define POLARSSL_CIPHER_MODE_CFB MBEDTLS_CIPHER_MODE_CFB\n#endif\n#if defined MBEDTLS_CIPHER_MODE_CTR\n#define POLARSSL_CIPHER_MODE_CTR MBEDTLS_CIPHER_MODE_CTR\n#endif\n#if defined MBEDTLS_CIPHER_NULL_CIPHER\n#define POLARSSL_CIPHER_NULL_CIPHER MBEDTLS_CIPHER_NULL_CIPHER\n#endif\n#if defined MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS\n#define POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS\n#endif\n#if defined MBEDTLS_CIPHER_PADDING_PKCS7\n#define POLARSSL_CIPHER_PADDING_PKCS7 MBEDTLS_CIPHER_PADDING_PKCS7\n#endif\n#if defined MBEDTLS_CIPHER_PADDING_ZEROS\n#define POLARSSL_CIPHER_PADDING_ZEROS MBEDTLS_CIPHER_PADDING_ZEROS\n#endif\n#if defined MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN\n#define POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN\n#endif\n#if defined MBEDTLS_CTR_DRBG_C\n#define POLARSSL_CTR_DRBG_C MBEDTLS_CTR_DRBG_C\n#endif\n#if defined MBEDTLS_DEBUG_C\n#define POLARSSL_DEBUG_C MBEDTLS_DEBUG_C\n#endif\n#if defined MBEDTLS_DEPRECATED_REMOVED\n#define POLARSSL_DEPRECATED_REMOVED MBEDTLS_DEPRECATED_REMOVED\n#endif\n#if defined MBEDTLS_DEPRECATED_WARNING\n#define POLARSSL_DEPRECATED_WARNING MBEDTLS_DEPRECATED_WARNING\n#endif\n#if defined MBEDTLS_DES_ALT\n#define POLARSSL_DES_ALT MBEDTLS_DES_ALT\n#endif\n#if defined MBEDTLS_DES_C\n#define POLARSSL_DES_C MBEDTLS_DES_C\n#endif\n#if defined MBEDTLS_DHM_C\n#define POLARSSL_DHM_C MBEDTLS_DHM_C\n#endif\n#if defined MBEDTLS_ECDH_C\n#define POLARSSL_ECDH_C MBEDTLS_ECDH_C\n#endif\n#if defined MBEDTLS_ECDSA_C\n#define POLARSSL_ECDSA_C MBEDTLS_ECDSA_C\n#endif\n#if defined MBEDTLS_ECDSA_DETERMINISTIC\n#define POLARSSL_ECDSA_DETERMINISTIC MBEDTLS_ECDSA_DETERMINISTIC\n#endif\n#if defined MBEDTLS_ECP_C\n#define POLARSSL_ECP_C MBEDTLS_ECP_C\n#endif\n#if defined MBEDTLS_ECP_DP_BP256R1_ENABLED\n#define POLARSSL_ECP_DP_BP256R1_ENABLED MBEDTLS_ECP_DP_BP256R1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_BP384R1_ENABLED\n#define POLARSSL_ECP_DP_BP384R1_ENABLED MBEDTLS_ECP_DP_BP384R1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_BP512R1_ENABLED\n#define POLARSSL_ECP_DP_BP512R1_ENABLED MBEDTLS_ECP_DP_BP512R1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_CURVE25519_ENABLED\n#define POLARSSL_ECP_DP_M255_ENABLED MBEDTLS_ECP_DP_CURVE25519_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_SECP192K1_ENABLED\n#define POLARSSL_ECP_DP_SECP192K1_ENABLED MBEDTLS_ECP_DP_SECP192K1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_SECP192R1_ENABLED\n#define POLARSSL_ECP_DP_SECP192R1_ENABLED MBEDTLS_ECP_DP_SECP192R1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_SECP224K1_ENABLED\n#define POLARSSL_ECP_DP_SECP224K1_ENABLED MBEDTLS_ECP_DP_SECP224K1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_SECP224R1_ENABLED\n#define POLARSSL_ECP_DP_SECP224R1_ENABLED MBEDTLS_ECP_DP_SECP224R1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_SECP256K1_ENABLED\n#define POLARSSL_ECP_DP_SECP256K1_ENABLED MBEDTLS_ECP_DP_SECP256K1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_SECP256R1_ENABLED\n#define POLARSSL_ECP_DP_SECP256R1_ENABLED MBEDTLS_ECP_DP_SECP256R1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_SECP384R1_ENABLED\n#define POLARSSL_ECP_DP_SECP384R1_ENABLED MBEDTLS_ECP_DP_SECP384R1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_DP_SECP521R1_ENABLED\n#define POLARSSL_ECP_DP_SECP521R1_ENABLED MBEDTLS_ECP_DP_SECP521R1_ENABLED\n#endif\n#if defined MBEDTLS_ECP_FIXED_POINT_OPTIM\n#define POLARSSL_ECP_FIXED_POINT_OPTIM MBEDTLS_ECP_FIXED_POINT_OPTIM\n#endif\n#if defined MBEDTLS_ECP_MAX_BITS\n#define POLARSSL_ECP_MAX_BITS MBEDTLS_ECP_MAX_BITS\n#endif\n#if defined MBEDTLS_ECP_NIST_OPTIM\n#define POLARSSL_ECP_NIST_OPTIM MBEDTLS_ECP_NIST_OPTIM\n#endif\n#if defined MBEDTLS_ECP_WINDOW_SIZE\n#define POLARSSL_ECP_WINDOW_SIZE MBEDTLS_ECP_WINDOW_SIZE\n#endif\n#if defined MBEDTLS_ENABLE_WEAK_CIPHERSUITES\n#define POLARSSL_ENABLE_WEAK_CIPHERSUITES MBEDTLS_ENABLE_WEAK_CIPHERSUITES\n#endif\n#if defined MBEDTLS_ENTROPY_C\n#define POLARSSL_ENTROPY_C MBEDTLS_ENTROPY_C\n#endif\n#if defined MBEDTLS_ENTROPY_FORCE_SHA256\n#define POLARSSL_ENTROPY_FORCE_SHA256 MBEDTLS_ENTROPY_FORCE_SHA256\n#endif\n#if defined MBEDTLS_ERROR_C\n#define POLARSSL_ERROR_C MBEDTLS_ERROR_C\n#endif\n#if defined MBEDTLS_ERROR_STRERROR_DUMMY\n#define POLARSSL_ERROR_STRERROR_DUMMY MBEDTLS_ERROR_STRERROR_DUMMY\n#endif\n#if defined MBEDTLS_FS_IO\n#define POLARSSL_FS_IO MBEDTLS_FS_IO\n#endif\n#if defined MBEDTLS_GCM_C\n#define POLARSSL_GCM_C MBEDTLS_GCM_C\n#endif\n#if defined MBEDTLS_GENPRIME\n#define POLARSSL_GENPRIME MBEDTLS_GENPRIME\n#endif\n#if defined MBEDTLS_HAVEGE_C\n#define POLARSSL_HAVEGE_C MBEDTLS_HAVEGE_C\n#endif\n#if defined MBEDTLS_HAVE_ASM\n#define POLARSSL_HAVE_ASM MBEDTLS_HAVE_ASM\n#endif\n#if defined MBEDTLS_HAVE_SSE2\n#define POLARSSL_HAVE_SSE2 MBEDTLS_HAVE_SSE2\n#endif\n#if defined MBEDTLS_HAVE_TIME\n#define POLARSSL_HAVE_TIME MBEDTLS_HAVE_TIME\n#endif\n#if defined MBEDTLS_HMAC_DRBG_C\n#define POLARSSL_HMAC_DRBG_C MBEDTLS_HMAC_DRBG_C\n#endif\n#if defined MBEDTLS_HMAC_DRBG_MAX_INPUT\n#define POLARSSL_HMAC_DRBG_MAX_INPUT MBEDTLS_HMAC_DRBG_MAX_INPUT\n#endif\n#if defined MBEDTLS_HMAC_DRBG_MAX_REQUEST\n#define POLARSSL_HMAC_DRBG_MAX_REQUEST MBEDTLS_HMAC_DRBG_MAX_REQUEST\n#endif\n#if defined MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT\n#define POLARSSL_HMAC_DRBG_MAX_SEED_INPUT MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT\n#endif\n#if defined MBEDTLS_HMAC_DRBG_RESEED_INTERVAL\n#define POLARSSL_HMAC_DRBG_RESEED_INTERVAL MBEDTLS_HMAC_DRBG_RESEED_INTERVAL\n#endif\n#if defined MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED\n#define POLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED\n#endif\n#if defined MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED\n#define POLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED\n#endif\n#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED\n#define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED\n#endif\n#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED\n#define POLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED\n#endif\n#if defined MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED\n#define POLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED\n#endif\n#if defined MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED\n#define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED\n#endif\n#if defined MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED\n#define POLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED\n#endif\n#if defined MBEDTLS_KEY_EXCHANGE_PSK_ENABLED\n#define POLARSSL_KEY_EXCHANGE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_PSK_ENABLED\n#endif\n#if defined MBEDTLS_KEY_EXCHANGE_RSA_ENABLED\n#define POLARSSL_KEY_EXCHANGE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_ENABLED\n#endif\n#if defined MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED\n#define POLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED\n#endif\n#if defined MBEDTLS_MD2_ALT\n#define POLARSSL_MD2_ALT MBEDTLS_MD2_ALT\n#endif\n#if defined MBEDTLS_MD2_C\n#define POLARSSL_MD2_C MBEDTLS_MD2_C\n#endif\n#if defined MBEDTLS_MD2_PROCESS_ALT\n#define POLARSSL_MD2_PROCESS_ALT MBEDTLS_MD2_PROCESS_ALT\n#endif\n#if defined MBEDTLS_MD4_ALT\n#define POLARSSL_MD4_ALT MBEDTLS_MD4_ALT\n#endif\n#if defined MBEDTLS_MD4_C\n#define POLARSSL_MD4_C MBEDTLS_MD4_C\n#endif\n#if defined MBEDTLS_MD4_PROCESS_ALT\n#define POLARSSL_MD4_PROCESS_ALT MBEDTLS_MD4_PROCESS_ALT\n#endif\n#if defined MBEDTLS_MD5_ALT\n#define POLARSSL_MD5_ALT MBEDTLS_MD5_ALT\n#endif\n#if defined MBEDTLS_MD5_C\n#define POLARSSL_MD5_C MBEDTLS_MD5_C\n#endif\n#if defined MBEDTLS_MD5_PROCESS_ALT\n#define POLARSSL_MD5_PROCESS_ALT MBEDTLS_MD5_PROCESS_ALT\n#endif\n#if defined MBEDTLS_MD_C\n#define POLARSSL_MD_C MBEDTLS_MD_C\n#endif\n#if defined MBEDTLS_MEMORY_ALIGN_MULTIPLE\n#define POLARSSL_MEMORY_ALIGN_MULTIPLE MBEDTLS_MEMORY_ALIGN_MULTIPLE\n#endif\n#if defined MBEDTLS_MEMORY_BACKTRACE\n#define POLARSSL_MEMORY_BACKTRACE MBEDTLS_MEMORY_BACKTRACE\n#endif\n#if defined MBEDTLS_MEMORY_BUFFER_ALLOC_C\n#define POLARSSL_MEMORY_BUFFER_ALLOC_C MBEDTLS_MEMORY_BUFFER_ALLOC_C\n#endif\n#if defined MBEDTLS_MEMORY_DEBUG\n#define POLARSSL_MEMORY_DEBUG MBEDTLS_MEMORY_DEBUG\n#endif\n#if defined MBEDTLS_MPI_MAX_SIZE\n#define POLARSSL_MPI_MAX_SIZE MBEDTLS_MPI_MAX_SIZE\n#endif\n#if defined MBEDTLS_MPI_WINDOW_SIZE\n#define POLARSSL_MPI_WINDOW_SIZE MBEDTLS_MPI_WINDOW_SIZE\n#endif\n#if defined MBEDTLS_NET_C\n#define POLARSSL_NET_C MBEDTLS_NET_C\n#endif\n#if defined MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES\n#define POLARSSL_NO_DEFAULT_ENTROPY_SOURCES MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES\n#endif\n#if defined MBEDTLS_NO_PLATFORM_ENTROPY\n#define POLARSSL_NO_PLATFORM_ENTROPY MBEDTLS_NO_PLATFORM_ENTROPY\n#endif\n#if defined MBEDTLS_OID_C\n#define POLARSSL_OID_C MBEDTLS_OID_C\n#endif\n#if defined MBEDTLS_PADLOCK_C\n#define POLARSSL_PADLOCK_C MBEDTLS_PADLOCK_C\n#endif\n#if defined MBEDTLS_PEM_PARSE_C\n#define POLARSSL_PEM_PARSE_C MBEDTLS_PEM_PARSE_C\n#endif\n#if defined MBEDTLS_PEM_WRITE_C\n#define POLARSSL_PEM_WRITE_C MBEDTLS_PEM_WRITE_C\n#endif\n#if defined MBEDTLS_PKCS11_C\n#define POLARSSL_PKCS11_C MBEDTLS_PKCS11_C\n#endif\n#if defined MBEDTLS_PKCS12_C\n#define POLARSSL_PKCS12_C MBEDTLS_PKCS12_C\n#endif\n#if defined MBEDTLS_PKCS1_V15\n#define POLARSSL_PKCS1_V15 MBEDTLS_PKCS1_V15\n#endif\n#if defined MBEDTLS_PKCS1_V21\n#define POLARSSL_PKCS1_V21 MBEDTLS_PKCS1_V21\n#endif\n#if defined MBEDTLS_PKCS5_C\n#define POLARSSL_PKCS5_C MBEDTLS_PKCS5_C\n#endif\n#if defined MBEDTLS_PK_C\n#define POLARSSL_PK_C MBEDTLS_PK_C\n#endif\n#if defined MBEDTLS_PK_PARSE_C\n#define POLARSSL_PK_PARSE_C MBEDTLS_PK_PARSE_C\n#endif\n#if defined MBEDTLS_PK_PARSE_EC_EXTENDED\n#define POLARSSL_PK_PARSE_EC_EXTENDED MBEDTLS_PK_PARSE_EC_EXTENDED\n#endif\n#if defined MBEDTLS_PK_RSA_ALT_SUPPORT\n#define POLARSSL_PK_RSA_ALT_SUPPORT MBEDTLS_PK_RSA_ALT_SUPPORT\n#endif\n#if defined MBEDTLS_PK_WRITE_C\n#define POLARSSL_PK_WRITE_C MBEDTLS_PK_WRITE_C\n#endif\n#if defined MBEDTLS_PLATFORM_C\n#define POLARSSL_PLATFORM_C MBEDTLS_PLATFORM_C\n#endif\n#if defined MBEDTLS_PLATFORM_EXIT_ALT\n#define POLARSSL_PLATFORM_EXIT_ALT MBEDTLS_PLATFORM_EXIT_ALT\n#endif\n#if defined MBEDTLS_PLATFORM_EXIT_MACRO\n#define POLARSSL_PLATFORM_EXIT_MACRO MBEDTLS_PLATFORM_EXIT_MACRO\n#endif\n#if defined MBEDTLS_PLATFORM_FPRINTF_ALT\n#define POLARSSL_PLATFORM_FPRINTF_ALT MBEDTLS_PLATFORM_FPRINTF_ALT\n#endif\n#if defined MBEDTLS_PLATFORM_FPRINTF_MACRO\n#define POLARSSL_PLATFORM_FPRINTF_MACRO MBEDTLS_PLATFORM_FPRINTF_MACRO\n#endif\n#if defined MBEDTLS_PLATFORM_FREE_MACRO\n#define POLARSSL_PLATFORM_FREE_MACRO MBEDTLS_PLATFORM_FREE_MACRO\n#endif\n#if defined MBEDTLS_PLATFORM_MEMORY\n#define POLARSSL_PLATFORM_MEMORY MBEDTLS_PLATFORM_MEMORY\n#endif\n#if defined MBEDTLS_PLATFORM_NO_STD_FUNCTIONS\n#define POLARSSL_PLATFORM_NO_STD_FUNCTIONS MBEDTLS_PLATFORM_NO_STD_FUNCTIONS\n#endif\n#if defined MBEDTLS_PLATFORM_PRINTF_ALT\n#define POLARSSL_PLATFORM_PRINTF_ALT MBEDTLS_PLATFORM_PRINTF_ALT\n#endif\n#if defined MBEDTLS_PLATFORM_PRINTF_MACRO\n#define POLARSSL_PLATFORM_PRINTF_MACRO MBEDTLS_PLATFORM_PRINTF_MACRO\n#endif\n#if defined MBEDTLS_PLATFORM_SNPRINTF_ALT\n#define POLARSSL_PLATFORM_SNPRINTF_ALT MBEDTLS_PLATFORM_SNPRINTF_ALT\n#endif\n#if defined MBEDTLS_PLATFORM_SNPRINTF_MACRO\n#define POLARSSL_PLATFORM_SNPRINTF_MACRO MBEDTLS_PLATFORM_SNPRINTF_MACRO\n#endif\n#if defined MBEDTLS_PLATFORM_STD_EXIT\n#define POLARSSL_PLATFORM_STD_EXIT MBEDTLS_PLATFORM_STD_EXIT\n#endif\n#if defined MBEDTLS_PLATFORM_STD_FPRINTF\n#define POLARSSL_PLATFORM_STD_FPRINTF MBEDTLS_PLATFORM_STD_FPRINTF\n#endif\n#if defined MBEDTLS_PLATFORM_STD_FREE\n#define POLARSSL_PLATFORM_STD_FREE MBEDTLS_PLATFORM_STD_FREE\n#endif\n#if defined MBEDTLS_PLATFORM_STD_MEM_HDR\n#define POLARSSL_PLATFORM_STD_MEM_HDR MBEDTLS_PLATFORM_STD_MEM_HDR\n#endif\n#if defined MBEDTLS_PLATFORM_STD_PRINTF\n#define POLARSSL_PLATFORM_STD_PRINTF MBEDTLS_PLATFORM_STD_PRINTF\n#endif\n#if defined MBEDTLS_PLATFORM_STD_SNPRINTF\n#define POLARSSL_PLATFORM_STD_SNPRINTF MBEDTLS_PLATFORM_STD_SNPRINTF\n#endif\n#if defined MBEDTLS_PSK_MAX_LEN\n#define POLARSSL_PSK_MAX_LEN MBEDTLS_PSK_MAX_LEN\n#endif\n#if defined MBEDTLS_REMOVE_ARC4_CIPHERSUITES\n#define POLARSSL_REMOVE_ARC4_CIPHERSUITES MBEDTLS_REMOVE_ARC4_CIPHERSUITES\n#endif\n#if defined MBEDTLS_RIPEMD160_ALT\n#define POLARSSL_RIPEMD160_ALT MBEDTLS_RIPEMD160_ALT\n#endif\n#if defined MBEDTLS_RIPEMD160_C\n#define POLARSSL_RIPEMD160_C MBEDTLS_RIPEMD160_C\n#endif\n#if defined MBEDTLS_RIPEMD160_PROCESS_ALT\n#define POLARSSL_RIPEMD160_PROCESS_ALT MBEDTLS_RIPEMD160_PROCESS_ALT\n#endif\n#if defined MBEDTLS_RSA_C\n#define POLARSSL_RSA_C MBEDTLS_RSA_C\n#endif\n#if defined MBEDTLS_RSA_NO_CRT\n#define POLARSSL_RSA_NO_CRT MBEDTLS_RSA_NO_CRT\n#endif\n#if defined MBEDTLS_SELF_TEST\n#define POLARSSL_SELF_TEST MBEDTLS_SELF_TEST\n#endif\n#if defined MBEDTLS_SHA1_ALT\n#define POLARSSL_SHA1_ALT MBEDTLS_SHA1_ALT\n#endif\n#if defined MBEDTLS_SHA1_C\n#define POLARSSL_SHA1_C MBEDTLS_SHA1_C\n#endif\n#if defined MBEDTLS_SHA1_PROCESS_ALT\n#define POLARSSL_SHA1_PROCESS_ALT MBEDTLS_SHA1_PROCESS_ALT\n#endif\n#if defined MBEDTLS_SHA256_ALT\n#define POLARSSL_SHA256_ALT MBEDTLS_SHA256_ALT\n#endif\n#if defined MBEDTLS_SHA256_C\n#define POLARSSL_SHA256_C MBEDTLS_SHA256_C\n#endif\n#if defined MBEDTLS_SHA256_PROCESS_ALT\n#define POLARSSL_SHA256_PROCESS_ALT MBEDTLS_SHA256_PROCESS_ALT\n#endif\n#if defined MBEDTLS_SHA512_ALT\n#define POLARSSL_SHA512_ALT MBEDTLS_SHA512_ALT\n#endif\n#if defined MBEDTLS_SHA512_C\n#define POLARSSL_SHA512_C MBEDTLS_SHA512_C\n#endif\n#if defined MBEDTLS_SHA512_PROCESS_ALT\n#define POLARSSL_SHA512_PROCESS_ALT MBEDTLS_SHA512_PROCESS_ALT\n#endif\n#if defined MBEDTLS_SSL_ALL_ALERT_MESSAGES\n#define POLARSSL_SSL_ALL_ALERT_MESSAGES MBEDTLS_SSL_ALL_ALERT_MESSAGES\n#endif\n#if defined MBEDTLS_SSL_ALPN\n#define POLARSSL_SSL_ALPN MBEDTLS_SSL_ALPN\n#endif\n#if defined MBEDTLS_SSL_CACHE_C\n#define POLARSSL_SSL_CACHE_C MBEDTLS_SSL_CACHE_C\n#endif\n#if defined MBEDTLS_SSL_CBC_RECORD_SPLITTING\n#define POLARSSL_SSL_CBC_RECORD_SPLITTING MBEDTLS_SSL_CBC_RECORD_SPLITTING\n#endif\n#if defined MBEDTLS_SSL_CLI_C\n#define POLARSSL_SSL_CLI_C MBEDTLS_SSL_CLI_C\n#endif\n#if defined MBEDTLS_SSL_COOKIE_C\n#define POLARSSL_SSL_COOKIE_C MBEDTLS_SSL_COOKIE_C\n#endif\n#if defined MBEDTLS_SSL_COOKIE_TIMEOUT\n#define POLARSSL_SSL_COOKIE_TIMEOUT MBEDTLS_SSL_COOKIE_TIMEOUT\n#endif\n#if defined MBEDTLS_SSL_DEBUG_ALL\n#define POLARSSL_SSL_DEBUG_ALL MBEDTLS_SSL_DEBUG_ALL\n#endif\n#if defined MBEDTLS_SSL_DTLS_ANTI_REPLAY\n#define POLARSSL_SSL_DTLS_ANTI_REPLAY MBEDTLS_SSL_DTLS_ANTI_REPLAY\n#endif\n#if defined MBEDTLS_SSL_DTLS_BADMAC_LIMIT\n#define POLARSSL_SSL_DTLS_BADMAC_LIMIT MBEDTLS_SSL_DTLS_BADMAC_LIMIT\n#endif\n#if defined MBEDTLS_SSL_DTLS_HELLO_VERIFY\n#define POLARSSL_SSL_DTLS_HELLO_VERIFY MBEDTLS_SSL_DTLS_HELLO_VERIFY\n#endif\n#if defined MBEDTLS_SSL_ENCRYPT_THEN_MAC\n#define POLARSSL_SSL_ENCRYPT_THEN_MAC MBEDTLS_SSL_ENCRYPT_THEN_MAC\n#endif\n#if defined MBEDTLS_SSL_EXTENDED_MASTER_SECRET\n#define POLARSSL_SSL_EXTENDED_MASTER_SECRET MBEDTLS_SSL_EXTENDED_MASTER_SECRET\n#endif\n#if defined MBEDTLS_SSL_FALLBACK_SCSV\n#define POLARSSL_SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV\n#endif\n#if defined MBEDTLS_SSL_HW_RECORD_ACCEL\n#define POLARSSL_SSL_HW_RECORD_ACCEL MBEDTLS_SSL_HW_RECORD_ACCEL\n#endif\n#if defined MBEDTLS_SSL_MAX_FRAGMENT_LENGTH\n#define POLARSSL_SSL_MAX_FRAGMENT_LENGTH MBEDTLS_SSL_MAX_FRAGMENT_LENGTH\n#endif\n#if defined MBEDTLS_SSL_PROTO_DTLS\n#define POLARSSL_SSL_PROTO_DTLS MBEDTLS_SSL_PROTO_DTLS\n#endif\n#if defined MBEDTLS_SSL_PROTO_SSL3\n#define POLARSSL_SSL_PROTO_SSL3 MBEDTLS_SSL_PROTO_SSL3\n#endif\n#if defined MBEDTLS_SSL_PROTO_TLS1\n#define POLARSSL_SSL_PROTO_TLS1 MBEDTLS_SSL_PROTO_TLS1\n#endif\n#if defined MBEDTLS_SSL_PROTO_TLS1_1\n#define POLARSSL_SSL_PROTO_TLS1_1 MBEDTLS_SSL_PROTO_TLS1_1\n#endif\n#if defined MBEDTLS_SSL_PROTO_TLS1_2\n#define POLARSSL_SSL_PROTO_TLS1_2 MBEDTLS_SSL_PROTO_TLS1_2\n#endif\n#if defined MBEDTLS_SSL_RENEGOTIATION\n#define POLARSSL_SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION\n#endif\n#if defined MBEDTLS_SSL_SERVER_NAME_INDICATION\n#define POLARSSL_SSL_SERVER_NAME_INDICATION MBEDTLS_SSL_SERVER_NAME_INDICATION\n#endif\n#if defined MBEDTLS_SSL_SESSION_TICKETS\n#define POLARSSL_SSL_SESSION_TICKETS MBEDTLS_SSL_SESSION_TICKETS\n#endif\n#if defined MBEDTLS_SSL_SRV_C\n#define POLARSSL_SSL_SRV_C MBEDTLS_SSL_SRV_C\n#endif\n#if defined MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE\n#define POLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE\n#endif\n#if defined MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO\n#define POLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO\n#endif\n#if defined MBEDTLS_SSL_TLS_C\n#define POLARSSL_SSL_TLS_C MBEDTLS_SSL_TLS_C\n#endif\n#if defined MBEDTLS_SSL_TRUNCATED_HMAC\n#define POLARSSL_SSL_TRUNCATED_HMAC MBEDTLS_SSL_TRUNCATED_HMAC\n#endif\n#if defined MBEDTLS_THREADING_ALT\n#define POLARSSL_THREADING_ALT MBEDTLS_THREADING_ALT\n#endif\n#if defined MBEDTLS_THREADING_C\n#define POLARSSL_THREADING_C MBEDTLS_THREADING_C\n#endif\n#if defined MBEDTLS_THREADING_PTHREAD\n#define POLARSSL_THREADING_PTHREAD MBEDTLS_THREADING_PTHREAD\n#endif\n#if defined MBEDTLS_TIMING_ALT\n#define POLARSSL_TIMING_ALT MBEDTLS_TIMING_ALT\n#endif\n#if defined MBEDTLS_TIMING_C\n#define POLARSSL_TIMING_C MBEDTLS_TIMING_C\n#endif\n#if defined MBEDTLS_VERSION_C\n#define POLARSSL_VERSION_C MBEDTLS_VERSION_C\n#endif\n#if defined MBEDTLS_VERSION_FEATURES\n#define POLARSSL_VERSION_FEATURES MBEDTLS_VERSION_FEATURES\n#endif\n#if defined MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3\n#define POLARSSL_X509_ALLOW_EXTENSIONS_NON_V3 MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3\n#endif\n#if defined MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION\n#define POLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION\n#endif\n#if defined MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE\n#define POLARSSL_X509_CHECK_EXTENDED_KEY_USAGE MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE\n#endif\n#if defined MBEDTLS_X509_CHECK_KEY_USAGE\n#define POLARSSL_X509_CHECK_KEY_USAGE MBEDTLS_X509_CHECK_KEY_USAGE\n#endif\n#if defined MBEDTLS_X509_CREATE_C\n#define POLARSSL_X509_CREATE_C MBEDTLS_X509_CREATE_C\n#endif\n#if defined MBEDTLS_X509_CRL_PARSE_C\n#define POLARSSL_X509_CRL_PARSE_C MBEDTLS_X509_CRL_PARSE_C\n#endif\n#if defined MBEDTLS_X509_CRT_PARSE_C\n#define POLARSSL_X509_CRT_PARSE_C MBEDTLS_X509_CRT_PARSE_C\n#endif\n#if defined MBEDTLS_X509_CRT_WRITE_C\n#define POLARSSL_X509_CRT_WRITE_C MBEDTLS_X509_CRT_WRITE_C\n#endif\n#if defined MBEDTLS_X509_CSR_PARSE_C\n#define POLARSSL_X509_CSR_PARSE_C MBEDTLS_X509_CSR_PARSE_C\n#endif\n#if defined MBEDTLS_X509_CSR_WRITE_C\n#define POLARSSL_X509_CSR_WRITE_C MBEDTLS_X509_CSR_WRITE_C\n#endif\n#if defined MBEDTLS_X509_MAX_INTERMEDIATE_CA\n#define POLARSSL_X509_MAX_INTERMEDIATE_CA MBEDTLS_X509_MAX_INTERMEDIATE_CA\n#endif\n#if defined MBEDTLS_X509_RSASSA_PSS_SUPPORT\n#define POLARSSL_X509_RSASSA_PSS_SUPPORT MBEDTLS_X509_RSASSA_PSS_SUPPORT\n#endif\n#if defined MBEDTLS_X509_USE_C\n#define POLARSSL_X509_USE_C MBEDTLS_X509_USE_C\n#endif\n#if defined MBEDTLS_XTEA_ALT\n#define POLARSSL_XTEA_ALT MBEDTLS_XTEA_ALT\n#endif\n#if defined MBEDTLS_XTEA_C\n#define POLARSSL_XTEA_C MBEDTLS_XTEA_C\n#endif\n#if defined MBEDTLS_ZLIB_SUPPORT\n#define POLARSSL_ZLIB_SUPPORT MBEDTLS_ZLIB_SUPPORT\n#endif\n\n/*\n * Misc names (macros, types, functions, enum constants...)\n */\n#define AES_DECRYPT MBEDTLS_AES_DECRYPT\n#define AES_ENCRYPT MBEDTLS_AES_ENCRYPT\n#define ASN1_BIT_STRING MBEDTLS_ASN1_BIT_STRING\n#define ASN1_BMP_STRING MBEDTLS_ASN1_BMP_STRING\n#define ASN1_BOOLEAN MBEDTLS_ASN1_BOOLEAN\n#define ASN1_CHK_ADD MBEDTLS_ASN1_CHK_ADD\n#define ASN1_CONSTRUCTED MBEDTLS_ASN1_CONSTRUCTED\n#define ASN1_CONTEXT_SPECIFIC MBEDTLS_ASN1_CONTEXT_SPECIFIC\n#define ASN1_GENERALIZED_TIME MBEDTLS_ASN1_GENERALIZED_TIME\n#define ASN1_IA5_STRING MBEDTLS_ASN1_IA5_STRING\n#define ASN1_INTEGER MBEDTLS_ASN1_INTEGER\n#define ASN1_NULL MBEDTLS_ASN1_NULL\n#define ASN1_OCTET_STRING MBEDTLS_ASN1_OCTET_STRING\n#define ASN1_OID MBEDTLS_ASN1_OID\n#define ASN1_PRIMITIVE MBEDTLS_ASN1_PRIMITIVE\n#define ASN1_PRINTABLE_STRING MBEDTLS_ASN1_PRINTABLE_STRING\n#define ASN1_SEQUENCE MBEDTLS_ASN1_SEQUENCE\n#define ASN1_SET MBEDTLS_ASN1_SET\n#define ASN1_T61_STRING MBEDTLS_ASN1_T61_STRING\n#define ASN1_UNIVERSAL_STRING MBEDTLS_ASN1_UNIVERSAL_STRING\n#define ASN1_UTC_TIME MBEDTLS_ASN1_UTC_TIME\n#define ASN1_UTF8_STRING MBEDTLS_ASN1_UTF8_STRING\n#define BADCERT_CN_MISMATCH MBEDTLS_X509_BADCERT_CN_MISMATCH\n#define BADCERT_EXPIRED MBEDTLS_X509_BADCERT_EXPIRED\n#define BADCERT_FUTURE MBEDTLS_X509_BADCERT_FUTURE\n#define BADCERT_MISSING MBEDTLS_X509_BADCERT_MISSING\n#define BADCERT_NOT_TRUSTED MBEDTLS_X509_BADCERT_NOT_TRUSTED\n#define BADCERT_OTHER MBEDTLS_X509_BADCERT_OTHER\n#define BADCERT_REVOKED MBEDTLS_X509_BADCERT_REVOKED\n#define BADCERT_SKIP_VERIFY MBEDTLS_X509_BADCERT_SKIP_VERIFY\n#define BADCRL_EXPIRED MBEDTLS_X509_BADCRL_EXPIRED\n#define BADCRL_FUTURE MBEDTLS_X509_BADCRL_FUTURE\n#define BADCRL_NOT_TRUSTED MBEDTLS_X509_BADCRL_NOT_TRUSTED\n#define BLOWFISH_BLOCKSIZE MBEDTLS_BLOWFISH_BLOCKSIZE\n#define BLOWFISH_DECRYPT MBEDTLS_BLOWFISH_DECRYPT\n#define BLOWFISH_ENCRYPT MBEDTLS_BLOWFISH_ENCRYPT\n#define BLOWFISH_MAX_KEY MBEDTLS_BLOWFISH_MAX_KEY_BITS\n#define BLOWFISH_MIN_KEY MBEDTLS_BLOWFISH_MIN_KEY_BITS\n#define BLOWFISH_ROUNDS MBEDTLS_BLOWFISH_ROUNDS\n#define CAMELLIA_DECRYPT MBEDTLS_CAMELLIA_DECRYPT\n#define CAMELLIA_ENCRYPT MBEDTLS_CAMELLIA_ENCRYPT\n#define COLLECT_SIZE MBEDTLS_HAVEGE_COLLECT_SIZE\n#define CTR_DRBG_BLOCKSIZE MBEDTLS_CTR_DRBG_BLOCKSIZE\n#define CTR_DRBG_ENTROPY_LEN MBEDTLS_CTR_DRBG_ENTROPY_LEN\n#define CTR_DRBG_KEYBITS MBEDTLS_CTR_DRBG_KEYBITS\n#define CTR_DRBG_KEYSIZE MBEDTLS_CTR_DRBG_KEYSIZE\n#define CTR_DRBG_MAX_INPUT MBEDTLS_CTR_DRBG_MAX_INPUT\n#define CTR_DRBG_MAX_REQUEST MBEDTLS_CTR_DRBG_MAX_REQUEST\n#define CTR_DRBG_MAX_SEED_INPUT MBEDTLS_CTR_DRBG_MAX_SEED_INPUT\n#define CTR_DRBG_PR_OFF MBEDTLS_CTR_DRBG_PR_OFF\n#define CTR_DRBG_PR_ON MBEDTLS_CTR_DRBG_PR_ON\n#define CTR_DRBG_RESEED_INTERVAL MBEDTLS_CTR_DRBG_RESEED_INTERVAL\n#define CTR_DRBG_SEEDLEN MBEDTLS_CTR_DRBG_SEEDLEN\n#define DEPRECATED MBEDTLS_DEPRECATED\n#define DES_DECRYPT MBEDTLS_DES_DECRYPT\n#define DES_ENCRYPT MBEDTLS_DES_ENCRYPT\n#define DES_KEY_SIZE MBEDTLS_DES_KEY_SIZE\n#define ENTROPY_BLOCK_SIZE MBEDTLS_ENTROPY_BLOCK_SIZE\n#define ENTROPY_MAX_GATHER MBEDTLS_ENTROPY_MAX_GATHER\n#define ENTROPY_MAX_SEED_SIZE MBEDTLS_ENTROPY_MAX_SEED_SIZE\n#define ENTROPY_MAX_SOURCES MBEDTLS_ENTROPY_MAX_SOURCES\n#define ENTROPY_MIN_HARDCLOCK MBEDTLS_ENTROPY_MIN_HARDCLOCK\n#define ENTROPY_MIN_HAVEGE MBEDTLS_ENTROPY_MIN_HAVEGE\n#define ENTROPY_MIN_PLATFORM MBEDTLS_ENTROPY_MIN_PLATFORM\n#define ENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_SOURCE_MANUAL\n#define EXT_AUTHORITY_KEY_IDENTIFIER MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER\n#define EXT_BASIC_CONSTRAINTS MBEDTLS_X509_EXT_BASIC_CONSTRAINTS\n#define EXT_CERTIFICATE_POLICIES MBEDTLS_X509_EXT_CERTIFICATE_POLICIES\n#define EXT_CRL_DISTRIBUTION_POINTS MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS\n#define EXT_EXTENDED_KEY_USAGE MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE\n#define EXT_FRESHEST_CRL MBEDTLS_X509_EXT_FRESHEST_CRL\n#define EXT_INIHIBIT_ANYPOLICY MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY\n#define EXT_ISSUER_ALT_NAME MBEDTLS_X509_EXT_ISSUER_ALT_NAME\n#define EXT_KEY_USAGE MBEDTLS_X509_EXT_KEY_USAGE\n#define EXT_NAME_CONSTRAINTS MBEDTLS_X509_EXT_NAME_CONSTRAINTS\n#define EXT_NS_CERT_TYPE MBEDTLS_X509_EXT_NS_CERT_TYPE\n#define EXT_POLICY_CONSTRAINTS MBEDTLS_X509_EXT_POLICY_CONSTRAINTS\n#define EXT_POLICY_MAPPINGS MBEDTLS_X509_EXT_POLICY_MAPPINGS\n#define EXT_SUBJECT_ALT_NAME MBEDTLS_X509_EXT_SUBJECT_ALT_NAME\n#define EXT_SUBJECT_DIRECTORY_ATTRS MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS\n#define EXT_SUBJECT_KEY_IDENTIFIER MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER\n#define GCM_DECRYPT MBEDTLS_GCM_DECRYPT\n#define GCM_ENCRYPT MBEDTLS_GCM_ENCRYPT\n#define KU_CRL_SIGN MBEDTLS_X509_KU_CRL_SIGN\n#define KU_DATA_ENCIPHERMENT MBEDTLS_X509_KU_DATA_ENCIPHERMENT\n#define KU_DIGITAL_SIGNATURE MBEDTLS_X509_KU_DIGITAL_SIGNATURE\n#define KU_KEY_AGREEMENT MBEDTLS_X509_KU_KEY_AGREEMENT\n#define KU_KEY_CERT_SIGN MBEDTLS_X509_KU_KEY_CERT_SIGN\n#define KU_KEY_ENCIPHERMENT MBEDTLS_X509_KU_KEY_ENCIPHERMENT\n#define KU_NON_REPUDIATION MBEDTLS_X509_KU_NON_REPUDIATION\n#define LN_2_DIV_LN_10_SCALE100 MBEDTLS_LN_2_DIV_LN_10_SCALE100\n#define MEMORY_VERIFY_ALLOC MBEDTLS_MEMORY_VERIFY_ALLOC\n#define MEMORY_VERIFY_ALWAYS MBEDTLS_MEMORY_VERIFY_ALWAYS\n#define MEMORY_VERIFY_FREE MBEDTLS_MEMORY_VERIFY_FREE\n#define MEMORY_VERIFY_NONE MBEDTLS_MEMORY_VERIFY_NONE\n#define MPI_CHK MBEDTLS_MPI_CHK\n#define NET_PROTO_TCP MBEDTLS_NET_PROTO_TCP\n#define NET_PROTO_UDP MBEDTLS_NET_PROTO_UDP\n#define NS_CERT_TYPE_EMAIL MBEDTLS_X509_NS_CERT_TYPE_EMAIL\n#define NS_CERT_TYPE_EMAIL_CA MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA\n#define NS_CERT_TYPE_OBJECT_SIGNING MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING\n#define NS_CERT_TYPE_OBJECT_SIGNING_CA MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA\n#define NS_CERT_TYPE_RESERVED MBEDTLS_X509_NS_CERT_TYPE_RESERVED\n#define NS_CERT_TYPE_SSL_CA MBEDTLS_X509_NS_CERT_TYPE_SSL_CA\n#define NS_CERT_TYPE_SSL_CLIENT MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT\n#define NS_CERT_TYPE_SSL_SERVER MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER\n#define OID_ANSI_X9_62 MBEDTLS_OID_ANSI_X9_62\n#define OID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE\n#define OID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD\n#define OID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62_SIG\n#define OID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2\n#define OID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE\n#define OID_AT MBEDTLS_OID_AT\n#define OID_AT_CN MBEDTLS_OID_AT_CN\n#define OID_AT_COUNTRY MBEDTLS_OID_AT_COUNTRY\n#define OID_AT_DN_QUALIFIER MBEDTLS_OID_AT_DN_QUALIFIER\n#define OID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT_GENERATION_QUALIFIER\n#define OID_AT_GIVEN_NAME MBEDTLS_OID_AT_GIVEN_NAME\n#define OID_AT_INITIALS MBEDTLS_OID_AT_INITIALS\n#define OID_AT_LOCALITY MBEDTLS_OID_AT_LOCALITY\n#define OID_AT_ORGANIZATION MBEDTLS_OID_AT_ORGANIZATION\n#define OID_AT_ORG_UNIT MBEDTLS_OID_AT_ORG_UNIT\n#define OID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT_POSTAL_ADDRESS\n#define OID_AT_POSTAL_CODE MBEDTLS_OID_AT_POSTAL_CODE\n#define OID_AT_PSEUDONYM MBEDTLS_OID_AT_PSEUDONYM\n#define OID_AT_SERIAL_NUMBER MBEDTLS_OID_AT_SERIAL_NUMBER\n#define OID_AT_STATE MBEDTLS_OID_AT_STATE\n#define OID_AT_SUR_NAME MBEDTLS_OID_AT_SUR_NAME\n#define OID_AT_TITLE MBEDTLS_OID_AT_TITLE\n#define OID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT_UNIQUE_IDENTIFIER\n#define OID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER\n#define OID_BASIC_CONSTRAINTS MBEDTLS_OID_BASIC_CONSTRAINTS\n#define OID_CERTICOM MBEDTLS_OID_CERTICOM\n#define OID_CERTIFICATE_POLICIES MBEDTLS_OID_CERTIFICATE_POLICIES\n#define OID_CLIENT_AUTH MBEDTLS_OID_CLIENT_AUTH\n#define OID_CMP MBEDTLS_OID_CMP\n#define OID_CODE_SIGNING MBEDTLS_OID_CODE_SIGNING\n#define OID_COUNTRY_US MBEDTLS_OID_COUNTRY_US\n#define OID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_CRL_DISTRIBUTION_POINTS\n#define OID_CRL_NUMBER MBEDTLS_OID_CRL_NUMBER\n#define OID_DES_CBC MBEDTLS_OID_DES_CBC\n#define OID_DES_EDE3_CBC MBEDTLS_OID_DES_EDE3_CBC\n#define OID_DIGEST_ALG_MD2 MBEDTLS_OID_DIGEST_ALG_MD2\n#define OID_DIGEST_ALG_MD4 MBEDTLS_OID_DIGEST_ALG_MD4\n#define OID_DIGEST_ALG_MD5 MBEDTLS_OID_DIGEST_ALG_MD5\n#define OID_DIGEST_ALG_SHA1 MBEDTLS_OID_DIGEST_ALG_SHA1\n#define OID_DIGEST_ALG_SHA224 MBEDTLS_OID_DIGEST_ALG_SHA224\n#define OID_DIGEST_ALG_SHA256 MBEDTLS_OID_DIGEST_ALG_SHA256\n#define OID_DIGEST_ALG_SHA384 MBEDTLS_OID_DIGEST_ALG_SHA384\n#define OID_DIGEST_ALG_SHA512 MBEDTLS_OID_DIGEST_ALG_SHA512\n#define OID_DOMAIN_COMPONENT MBEDTLS_OID_DOMAIN_COMPONENT\n#define OID_ECDSA_SHA1 MBEDTLS_OID_ECDSA_SHA1\n#define OID_ECDSA_SHA224 MBEDTLS_OID_ECDSA_SHA224\n#define OID_ECDSA_SHA256 MBEDTLS_OID_ECDSA_SHA256\n#define OID_ECDSA_SHA384 MBEDTLS_OID_ECDSA_SHA384\n#define OID_ECDSA_SHA512 MBEDTLS_OID_ECDSA_SHA512\n#define OID_EC_ALG_ECDH MBEDTLS_OID_EC_ALG_ECDH\n#define OID_EC_ALG_UNRESTRICTED MBEDTLS_OID_EC_ALG_UNRESTRICTED\n#define OID_EC_BRAINPOOL_V1 MBEDTLS_OID_EC_BRAINPOOL_V1\n#define OID_EC_GRP_BP256R1 MBEDTLS_OID_EC_GRP_BP256R1\n#define OID_EC_GRP_BP384R1 MBEDTLS_OID_EC_GRP_BP384R1\n#define OID_EC_GRP_BP512R1 MBEDTLS_OID_EC_GRP_BP512R1\n#define OID_EC_GRP_SECP192K1 MBEDTLS_OID_EC_GRP_SECP192K1\n#define OID_EC_GRP_SECP192R1 MBEDTLS_OID_EC_GRP_SECP192R1\n#define OID_EC_GRP_SECP224K1 MBEDTLS_OID_EC_GRP_SECP224K1\n#define OID_EC_GRP_SECP224R1 MBEDTLS_OID_EC_GRP_SECP224R1\n#define OID_EC_GRP_SECP256K1 MBEDTLS_OID_EC_GRP_SECP256K1\n#define OID_EC_GRP_SECP256R1 MBEDTLS_OID_EC_GRP_SECP256R1\n#define OID_EC_GRP_SECP384R1 MBEDTLS_OID_EC_GRP_SECP384R1\n#define OID_EC_GRP_SECP521R1 MBEDTLS_OID_EC_GRP_SECP521R1\n#define OID_EMAIL_PROTECTION MBEDTLS_OID_EMAIL_PROTECTION\n#define OID_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE\n#define OID_FRESHEST_CRL MBEDTLS_OID_FRESHEST_CRL\n#define OID_GOV MBEDTLS_OID_GOV\n#define OID_HMAC_SHA1 MBEDTLS_OID_HMAC_SHA1\n#define OID_ID_CE MBEDTLS_OID_ID_CE\n#define OID_INIHIBIT_ANYPOLICY MBEDTLS_OID_INIHIBIT_ANYPOLICY\n#define OID_ISO_CCITT_DS MBEDTLS_OID_ISO_CCITT_DS\n#define OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ISO_IDENTIFIED_ORG\n#define OID_ISO_ITU_COUNTRY MBEDTLS_OID_ISO_ITU_COUNTRY\n#define OID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_US_ORG\n#define OID_ISO_MEMBER_BODIES MBEDTLS_OID_ISO_MEMBER_BODIES\n#define OID_ISSUER_ALT_NAME MBEDTLS_OID_ISSUER_ALT_NAME\n#define OID_KEY_USAGE MBEDTLS_OID_KEY_USAGE\n#define OID_KP MBEDTLS_OID_KP\n#define OID_MGF1 MBEDTLS_OID_MGF1\n#define OID_NAME_CONSTRAINTS MBEDTLS_OID_NAME_CONSTRAINTS\n#define OID_NETSCAPE MBEDTLS_OID_NETSCAPE\n#define OID_NS_BASE_URL MBEDTLS_OID_NS_BASE_URL\n#define OID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CA_POLICY_URL\n#define OID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CA_REVOCATION_URL\n#define OID_NS_CERT MBEDTLS_OID_NS_CERT\n#define OID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_CERT_SEQUENCE\n#define OID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT_TYPE\n#define OID_NS_COMMENT MBEDTLS_OID_NS_COMMENT\n#define OID_NS_DATA_TYPE MBEDTLS_OID_NS_DATA_TYPE\n#define OID_NS_RENEWAL_URL MBEDTLS_OID_NS_RENEWAL_URL\n#define OID_NS_REVOCATION_URL MBEDTLS_OID_NS_REVOCATION_URL\n#define OID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_SSL_SERVER_NAME\n#define OID_OCSP_SIGNING MBEDTLS_OID_OCSP_SIGNING\n#define OID_OIW_SECSIG MBEDTLS_OID_OIW_SECSIG\n#define OID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG_ALG\n#define OID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_SHA1\n#define OID_ORGANIZATION MBEDTLS_OID_ORGANIZATION\n#define OID_ORG_ANSI_X9_62 MBEDTLS_OID_ORG_ANSI_X9_62\n#define OID_ORG_CERTICOM MBEDTLS_OID_ORG_CERTICOM\n#define OID_ORG_DOD MBEDTLS_OID_ORG_DOD\n#define OID_ORG_GOV MBEDTLS_OID_ORG_GOV\n#define OID_ORG_NETSCAPE MBEDTLS_OID_ORG_NETSCAPE\n#define OID_ORG_OIW MBEDTLS_OID_ORG_OIW\n#define OID_ORG_RSA_DATA_SECURITY MBEDTLS_OID_ORG_RSA_DATA_SECURITY\n#define OID_ORG_TELETRUST MBEDTLS_OID_ORG_TELETRUST\n#define OID_PKCS MBEDTLS_OID_PKCS\n#define OID_PKCS1 MBEDTLS_OID_PKCS1\n#define OID_PKCS12 MBEDTLS_OID_PKCS12\n#define OID_PKCS12_PBE MBEDTLS_OID_PKCS12_PBE\n#define OID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC\n#define OID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC\n#define OID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC\n#define OID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC\n#define OID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128\n#define OID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40\n#define OID_PKCS1_MD2 MBEDTLS_OID_PKCS1_MD2\n#define OID_PKCS1_MD4 MBEDTLS_OID_PKCS1_MD4\n#define OID_PKCS1_MD5 MBEDTLS_OID_PKCS1_MD5\n#define OID_PKCS1_RSA MBEDTLS_OID_PKCS1_RSA\n#define OID_PKCS1_SHA1 MBEDTLS_OID_PKCS1_SHA1\n#define OID_PKCS1_SHA224 MBEDTLS_OID_PKCS1_SHA224\n#define OID_PKCS1_SHA256 MBEDTLS_OID_PKCS1_SHA256\n#define OID_PKCS1_SHA384 MBEDTLS_OID_PKCS1_SHA384\n#define OID_PKCS1_SHA512 MBEDTLS_OID_PKCS1_SHA512\n#define OID_PKCS5 MBEDTLS_OID_PKCS5\n#define OID_PKCS5_PBES2 MBEDTLS_OID_PKCS5_PBES2\n#define OID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC\n#define OID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC\n#define OID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC\n#define OID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC\n#define OID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC\n#define OID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC\n#define OID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5_PBKDF2\n#define OID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5_PBMAC1\n#define OID_PKCS9 MBEDTLS_OID_PKCS9\n#define OID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9_CSR_EXT_REQ\n#define OID_PKCS9_EMAIL MBEDTLS_OID_PKCS9_EMAIL\n#define OID_PKIX MBEDTLS_OID_PKIX\n#define OID_POLICY_CONSTRAINTS MBEDTLS_OID_POLICY_CONSTRAINTS\n#define OID_POLICY_MAPPINGS MBEDTLS_OID_POLICY_MAPPINGS\n#define OID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD\n#define OID_RSASSA_PSS MBEDTLS_OID_RSASSA_PSS\n#define OID_RSA_COMPANY MBEDTLS_OID_RSA_COMPANY\n#define OID_RSA_SHA_OBS MBEDTLS_OID_RSA_SHA_OBS\n#define OID_SERVER_AUTH MBEDTLS_OID_SERVER_AUTH\n#define OID_SIZE MBEDTLS_OID_SIZE\n#define OID_SUBJECT_ALT_NAME MBEDTLS_OID_SUBJECT_ALT_NAME\n#define OID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS\n#define OID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER\n#define OID_TELETRUST MBEDTLS_OID_TELETRUST\n#define OID_TIME_STAMPING MBEDTLS_OID_TIME_STAMPING\n#define PADLOCK_ACE MBEDTLS_PADLOCK_ACE\n#define PADLOCK_ALIGN16 MBEDTLS_PADLOCK_ALIGN16\n#define PADLOCK_PHE MBEDTLS_PADLOCK_PHE\n#define PADLOCK_PMM MBEDTLS_PADLOCK_PMM\n#define PADLOCK_RNG MBEDTLS_PADLOCK_RNG\n#define PKCS12_DERIVE_IV MBEDTLS_PKCS12_DERIVE_IV\n#define PKCS12_DERIVE_KEY MBEDTLS_PKCS12_DERIVE_KEY\n#define PKCS12_DERIVE_MAC_KEY MBEDTLS_PKCS12_DERIVE_MAC_KEY\n#define PKCS12_PBE_DECRYPT MBEDTLS_PKCS12_PBE_DECRYPT\n#define PKCS12_PBE_ENCRYPT MBEDTLS_PKCS12_PBE_ENCRYPT\n#define PKCS5_DECRYPT MBEDTLS_PKCS5_DECRYPT\n#define PKCS5_ENCRYPT MBEDTLS_PKCS5_ENCRYPT\n#define POLARSSL_AESNI_AES MBEDTLS_AESNI_AES\n#define POLARSSL_AESNI_CLMUL MBEDTLS_AESNI_CLMUL\n#define POLARSSL_AESNI_H MBEDTLS_AESNI_H\n#define POLARSSL_AES_H MBEDTLS_AES_H\n#define POLARSSL_ARC4_H MBEDTLS_ARC4_H\n#define POLARSSL_ASN1_H MBEDTLS_ASN1_H\n#define POLARSSL_ASN1_WRITE_H MBEDTLS_ASN1_WRITE_H\n#define POLARSSL_BASE64_H MBEDTLS_BASE64_H\n#define POLARSSL_BIGNUM_H MBEDTLS_BIGNUM_H\n#define POLARSSL_BLOWFISH_H MBEDTLS_BLOWFISH_H\n#define POLARSSL_BN_MUL_H MBEDTLS_BN_MUL_H\n#define POLARSSL_CAMELLIA_H MBEDTLS_CAMELLIA_H\n#define POLARSSL_CCM_H MBEDTLS_CCM_H\n#define POLARSSL_CERTS_H MBEDTLS_CERTS_H\n#define POLARSSL_CHECK_CONFIG_H MBEDTLS_CHECK_CONFIG_H\n#define POLARSSL_CIPHERSUITE_NODTLS MBEDTLS_CIPHERSUITE_NODTLS\n#define POLARSSL_CIPHERSUITE_SHORT_TAG MBEDTLS_CIPHERSUITE_SHORT_TAG\n#define POLARSSL_CIPHERSUITE_WEAK MBEDTLS_CIPHERSUITE_WEAK\n#define POLARSSL_CIPHER_AES_128_CBC MBEDTLS_CIPHER_AES_128_CBC\n#define POLARSSL_CIPHER_AES_128_CCM MBEDTLS_CIPHER_AES_128_CCM\n#define POLARSSL_CIPHER_AES_128_CFB128 MBEDTLS_CIPHER_AES_128_CFB128\n#define POLARSSL_CIPHER_AES_128_CTR MBEDTLS_CIPHER_AES_128_CTR\n#define POLARSSL_CIPHER_AES_128_ECB MBEDTLS_CIPHER_AES_128_ECB\n#define POLARSSL_CIPHER_AES_128_GCM MBEDTLS_CIPHER_AES_128_GCM\n#define POLARSSL_CIPHER_AES_192_CBC MBEDTLS_CIPHER_AES_192_CBC\n#define POLARSSL_CIPHER_AES_192_CCM MBEDTLS_CIPHER_AES_192_CCM\n#define POLARSSL_CIPHER_AES_192_CFB128 MBEDTLS_CIPHER_AES_192_CFB128\n#define POLARSSL_CIPHER_AES_192_CTR MBEDTLS_CIPHER_AES_192_CTR\n#define POLARSSL_CIPHER_AES_192_ECB MBEDTLS_CIPHER_AES_192_ECB\n#define POLARSSL_CIPHER_AES_192_GCM MBEDTLS_CIPHER_AES_192_GCM\n#define POLARSSL_CIPHER_AES_256_CBC MBEDTLS_CIPHER_AES_256_CBC\n#define POLARSSL_CIPHER_AES_256_CCM MBEDTLS_CIPHER_AES_256_CCM\n#define POLARSSL_CIPHER_AES_256_CFB128 MBEDTLS_CIPHER_AES_256_CFB128\n#define POLARSSL_CIPHER_AES_256_CTR MBEDTLS_CIPHER_AES_256_CTR\n#define POLARSSL_CIPHER_AES_256_ECB MBEDTLS_CIPHER_AES_256_ECB\n#define POLARSSL_CIPHER_AES_256_GCM MBEDTLS_CIPHER_AES_256_GCM\n#define POLARSSL_CIPHER_ARC4_128 MBEDTLS_CIPHER_ARC4_128\n#define POLARSSL_CIPHER_BLOWFISH_CBC MBEDTLS_CIPHER_BLOWFISH_CBC\n#define POLARSSL_CIPHER_BLOWFISH_CFB64 MBEDTLS_CIPHER_BLOWFISH_CFB64\n#define POLARSSL_CIPHER_BLOWFISH_CTR MBEDTLS_CIPHER_BLOWFISH_CTR\n#define POLARSSL_CIPHER_BLOWFISH_ECB MBEDTLS_CIPHER_BLOWFISH_ECB\n#define POLARSSL_CIPHER_CAMELLIA_128_CBC MBEDTLS_CIPHER_CAMELLIA_128_CBC\n#define POLARSSL_CIPHER_CAMELLIA_128_CCM MBEDTLS_CIPHER_CAMELLIA_128_CCM\n#define POLARSSL_CIPHER_CAMELLIA_128_CFB128 MBEDTLS_CIPHER_CAMELLIA_128_CFB128\n#define POLARSSL_CIPHER_CAMELLIA_128_CTR MBEDTLS_CIPHER_CAMELLIA_128_CTR\n#define POLARSSL_CIPHER_CAMELLIA_128_ECB MBEDTLS_CIPHER_CAMELLIA_128_ECB\n#define POLARSSL_CIPHER_CAMELLIA_128_GCM MBEDTLS_CIPHER_CAMELLIA_128_GCM\n#define POLARSSL_CIPHER_CAMELLIA_192_CBC MBEDTLS_CIPHER_CAMELLIA_192_CBC\n#define POLARSSL_CIPHER_CAMELLIA_192_CCM MBEDTLS_CIPHER_CAMELLIA_192_CCM\n#define POLARSSL_CIPHER_CAMELLIA_192_CFB128 MBEDTLS_CIPHER_CAMELLIA_192_CFB128\n#define POLARSSL_CIPHER_CAMELLIA_192_CTR MBEDTLS_CIPHER_CAMELLIA_192_CTR\n#define POLARSSL_CIPHER_CAMELLIA_192_ECB MBEDTLS_CIPHER_CAMELLIA_192_ECB\n#define POLARSSL_CIPHER_CAMELLIA_192_GCM MBEDTLS_CIPHER_CAMELLIA_192_GCM\n#define POLARSSL_CIPHER_CAMELLIA_256_CBC MBEDTLS_CIPHER_CAMELLIA_256_CBC\n#define POLARSSL_CIPHER_CAMELLIA_256_CCM MBEDTLS_CIPHER_CAMELLIA_256_CCM\n#define POLARSSL_CIPHER_CAMELLIA_256_CFB128 MBEDTLS_CIPHER_CAMELLIA_256_CFB128\n#define POLARSSL_CIPHER_CAMELLIA_256_CTR MBEDTLS_CIPHER_CAMELLIA_256_CTR\n#define POLARSSL_CIPHER_CAMELLIA_256_ECB MBEDTLS_CIPHER_CAMELLIA_256_ECB\n#define POLARSSL_CIPHER_CAMELLIA_256_GCM MBEDTLS_CIPHER_CAMELLIA_256_GCM\n#define POLARSSL_CIPHER_DES_CBC MBEDTLS_CIPHER_DES_CBC\n#define POLARSSL_CIPHER_DES_ECB MBEDTLS_CIPHER_DES_ECB\n#define POLARSSL_CIPHER_DES_EDE3_CBC MBEDTLS_CIPHER_DES_EDE3_CBC\n#define POLARSSL_CIPHER_DES_EDE3_ECB MBEDTLS_CIPHER_DES_EDE3_ECB\n#define POLARSSL_CIPHER_DES_EDE_CBC MBEDTLS_CIPHER_DES_EDE_CBC\n#define POLARSSL_CIPHER_DES_EDE_ECB MBEDTLS_CIPHER_DES_EDE_ECB\n#define POLARSSL_CIPHER_H MBEDTLS_CIPHER_H\n#define POLARSSL_CIPHER_ID_3DES MBEDTLS_CIPHER_ID_3DES\n#define POLARSSL_CIPHER_ID_AES MBEDTLS_CIPHER_ID_AES\n#define POLARSSL_CIPHER_ID_ARC4 MBEDTLS_CIPHER_ID_ARC4\n#define POLARSSL_CIPHER_ID_BLOWFISH MBEDTLS_CIPHER_ID_BLOWFISH\n#define POLARSSL_CIPHER_ID_CAMELLIA MBEDTLS_CIPHER_ID_CAMELLIA\n#define POLARSSL_CIPHER_ID_DES MBEDTLS_CIPHER_ID_DES\n#define POLARSSL_CIPHER_ID_NONE MBEDTLS_CIPHER_ID_NONE\n#define POLARSSL_CIPHER_ID_NULL MBEDTLS_CIPHER_ID_NULL\n#define POLARSSL_CIPHER_MODE_AEAD MBEDTLS_CIPHER_MODE_AEAD\n#define POLARSSL_CIPHER_MODE_STREAM MBEDTLS_CIPHER_MODE_STREAM\n#define POLARSSL_CIPHER_MODE_WITH_PADDING MBEDTLS_CIPHER_MODE_WITH_PADDING\n#define POLARSSL_CIPHER_NONE MBEDTLS_CIPHER_NONE\n#define POLARSSL_CIPHER_NULL MBEDTLS_CIPHER_NULL\n#define POLARSSL_CIPHER_VARIABLE_IV_LEN MBEDTLS_CIPHER_VARIABLE_IV_LEN\n#define POLARSSL_CIPHER_VARIABLE_KEY_LEN MBEDTLS_CIPHER_VARIABLE_KEY_LEN\n#define POLARSSL_CIPHER_WRAP_H MBEDTLS_CIPHER_WRAP_H\n#define POLARSSL_CONFIG_H MBEDTLS_CONFIG_H\n#define POLARSSL_CTR_DRBG_H MBEDTLS_CTR_DRBG_H\n#define POLARSSL_DEBUG_H MBEDTLS_DEBUG_H\n#define POLARSSL_DECRYPT MBEDTLS_DECRYPT\n#define POLARSSL_DES_H MBEDTLS_DES_H\n#define POLARSSL_DHM_H MBEDTLS_DHM_H\n#define POLARSSL_DHM_RFC3526_MODP_2048_G MBEDTLS_DHM_RFC3526_MODP_2048_G\n#define POLARSSL_DHM_RFC3526_MODP_2048_P MBEDTLS_DHM_RFC3526_MODP_2048_P\n#define POLARSSL_DHM_RFC3526_MODP_3072_G MBEDTLS_DHM_RFC3526_MODP_3072_G\n#define POLARSSL_DHM_RFC3526_MODP_3072_P MBEDTLS_DHM_RFC3526_MODP_3072_P\n#define POLARSSL_DHM_RFC5114_MODP_2048_G MBEDTLS_DHM_RFC5114_MODP_2048_G\n#define POLARSSL_DHM_RFC5114_MODP_2048_P MBEDTLS_DHM_RFC5114_MODP_2048_P\n#define POLARSSL_ECDH_H MBEDTLS_ECDH_H\n#define POLARSSL_ECDH_OURS MBEDTLS_ECDH_OURS\n#define POLARSSL_ECDH_THEIRS MBEDTLS_ECDH_THEIRS\n#define POLARSSL_ECDSA_H MBEDTLS_ECDSA_H\n#define POLARSSL_ECP_DP_BP256R1 MBEDTLS_ECP_DP_BP256R1\n#define POLARSSL_ECP_DP_BP384R1 MBEDTLS_ECP_DP_BP384R1\n#define POLARSSL_ECP_DP_BP512R1 MBEDTLS_ECP_DP_BP512R1\n#define POLARSSL_ECP_DP_M255 MBEDTLS_ECP_DP_CURVE25519\n#define POLARSSL_ECP_DP_MAX MBEDTLS_ECP_DP_MAX\n#define POLARSSL_ECP_DP_NONE MBEDTLS_ECP_DP_NONE\n#define POLARSSL_ECP_DP_SECP192K1 MBEDTLS_ECP_DP_SECP192K1\n#define POLARSSL_ECP_DP_SECP192R1 MBEDTLS_ECP_DP_SECP192R1\n#define POLARSSL_ECP_DP_SECP224K1 MBEDTLS_ECP_DP_SECP224K1\n#define POLARSSL_ECP_DP_SECP224R1 MBEDTLS_ECP_DP_SECP224R1\n#define POLARSSL_ECP_DP_SECP256K1 MBEDTLS_ECP_DP_SECP256K1\n#define POLARSSL_ECP_DP_SECP256R1 MBEDTLS_ECP_DP_SECP256R1\n#define POLARSSL_ECP_DP_SECP384R1 MBEDTLS_ECP_DP_SECP384R1\n#define POLARSSL_ECP_DP_SECP521R1 MBEDTLS_ECP_DP_SECP521R1\n#define POLARSSL_ECP_H MBEDTLS_ECP_H\n#define POLARSSL_ECP_MAX_BYTES MBEDTLS_ECP_MAX_BYTES\n#define POLARSSL_ECP_MAX_PT_LEN MBEDTLS_ECP_MAX_PT_LEN\n#define POLARSSL_ECP_PF_COMPRESSED MBEDTLS_ECP_PF_COMPRESSED\n#define POLARSSL_ECP_PF_UNCOMPRESSED MBEDTLS_ECP_PF_UNCOMPRESSED\n#define POLARSSL_ECP_TLS_NAMED_CURVE MBEDTLS_ECP_TLS_NAMED_CURVE\n#define POLARSSL_ENCRYPT MBEDTLS_ENCRYPT\n#define POLARSSL_ENTROPY_H MBEDTLS_ENTROPY_H\n#define POLARSSL_ENTROPY_POLL_H MBEDTLS_ENTROPY_POLL_H\n#define POLARSSL_ENTROPY_SHA256_ACCUMULATOR MBEDTLS_ENTROPY_SHA256_ACCUMULATOR\n#define POLARSSL_ENTROPY_SHA512_ACCUMULATOR MBEDTLS_ENTROPY_SHA512_ACCUMULATOR\n#define POLARSSL_ERROR_H MBEDTLS_ERROR_H\n#define POLARSSL_ERR_AES_INVALID_INPUT_LENGTH MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH\n#define POLARSSL_ERR_AES_INVALID_KEY_LENGTH MBEDTLS_ERR_AES_INVALID_KEY_LENGTH\n#define POLARSSL_ERR_ASN1_BUF_TOO_SMALL MBEDTLS_ERR_ASN1_BUF_TOO_SMALL\n#define POLARSSL_ERR_ASN1_INVALID_DATA MBEDTLS_ERR_ASN1_INVALID_DATA\n#define POLARSSL_ERR_ASN1_INVALID_LENGTH MBEDTLS_ERR_ASN1_INVALID_LENGTH\n#define POLARSSL_ERR_ASN1_LENGTH_MISMATCH MBEDTLS_ERR_ASN1_LENGTH_MISMATCH\n#define POLARSSL_ERR_ASN1_MALLOC_FAILED MBEDTLS_ERR_ASN1_ALLOC_FAILED\n#define POLARSSL_ERR_ASN1_OUT_OF_DATA MBEDTLS_ERR_ASN1_OUT_OF_DATA\n#define POLARSSL_ERR_ASN1_UNEXPECTED_TAG MBEDTLS_ERR_ASN1_UNEXPECTED_TAG\n#define POLARSSL_ERR_BASE64_BUFFER_TOO_SMALL MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL\n#define POLARSSL_ERR_BASE64_INVALID_CHARACTER MBEDTLS_ERR_BASE64_INVALID_CHARACTER\n#define POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH\n#define POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH\n#define POLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH\n#define POLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH\n#define POLARSSL_ERR_CCM_AUTH_FAILED MBEDTLS_ERR_CCM_AUTH_FAILED\n#define POLARSSL_ERR_CCM_BAD_INPUT MBEDTLS_ERR_CCM_BAD_INPUT\n#define POLARSSL_ERR_CIPHER_ALLOC_FAILED MBEDTLS_ERR_CIPHER_ALLOC_FAILED\n#define POLARSSL_ERR_CIPHER_AUTH_FAILED MBEDTLS_ERR_CIPHER_AUTH_FAILED\n#define POLARSSL_ERR_CIPHER_BAD_INPUT_DATA MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA\n#define POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE\n#define POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED\n#define POLARSSL_ERR_CIPHER_INVALID_PADDING MBEDTLS_ERR_CIPHER_INVALID_PADDING\n#define POLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED\n#define POLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR\n#define POLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG\n#define POLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG\n#define POLARSSL_ERR_DES_INVALID_INPUT_LENGTH MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH\n#define POLARSSL_ERR_DHM_BAD_INPUT_DATA MBEDTLS_ERR_DHM_BAD_INPUT_DATA\n#define POLARSSL_ERR_DHM_CALC_SECRET_FAILED MBEDTLS_ERR_DHM_CALC_SECRET_FAILED\n#define POLARSSL_ERR_DHM_FILE_IO_ERROR MBEDTLS_ERR_DHM_FILE_IO_ERROR\n#define POLARSSL_ERR_DHM_INVALID_FORMAT MBEDTLS_ERR_DHM_INVALID_FORMAT\n#define POLARSSL_ERR_DHM_MAKE_PARAMS_FAILED MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED\n#define POLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED\n#define POLARSSL_ERR_DHM_MALLOC_FAILED MBEDTLS_ERR_DHM_ALLOC_FAILED\n#define POLARSSL_ERR_DHM_READ_PARAMS_FAILED MBEDTLS_ERR_DHM_READ_PARAMS_FAILED\n#define POLARSSL_ERR_DHM_READ_PUBLIC_FAILED MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED\n#define POLARSSL_ERR_ECP_BAD_INPUT_DATA MBEDTLS_ERR_ECP_BAD_INPUT_DATA\n#define POLARSSL_ERR_ECP_BUFFER_TOO_SMALL MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL\n#define POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE\n#define POLARSSL_ERR_ECP_INVALID_KEY MBEDTLS_ERR_ECP_INVALID_KEY\n#define POLARSSL_ERR_ECP_MALLOC_FAILED MBEDTLS_ERR_ECP_ALLOC_FAILED\n#define POLARSSL_ERR_ECP_RANDOM_FAILED MBEDTLS_ERR_ECP_RANDOM_FAILED\n#define POLARSSL_ERR_ECP_SIG_LEN_MISMATCH MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH\n#define POLARSSL_ERR_ECP_VERIFY_FAILED MBEDTLS_ERR_ECP_VERIFY_FAILED\n#define POLARSSL_ERR_ENTROPY_FILE_IO_ERROR MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR\n#define POLARSSL_ERR_ENTROPY_MAX_SOURCES MBEDTLS_ERR_ENTROPY_MAX_SOURCES\n#define POLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED\n#define POLARSSL_ERR_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_ENTROPY_SOURCE_FAILED\n#define POLARSSL_ERR_GCM_AUTH_FAILED MBEDTLS_ERR_GCM_AUTH_FAILED\n#define POLARSSL_ERR_GCM_BAD_INPUT MBEDTLS_ERR_GCM_BAD_INPUT\n#define POLARSSL_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED\n#define POLARSSL_ERR_HMAC_DRBG_FILE_IO_ERROR MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR\n#define POLARSSL_ERR_HMAC_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG\n#define POLARSSL_ERR_HMAC_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG\n#define POLARSSL_ERR_MD_ALLOC_FAILED MBEDTLS_ERR_MD_ALLOC_FAILED\n#define POLARSSL_ERR_MD_BAD_INPUT_DATA MBEDTLS_ERR_MD_BAD_INPUT_DATA\n#define POLARSSL_ERR_MD_FEATURE_UNAVAILABLE MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE\n#define POLARSSL_ERR_MD_FILE_IO_ERROR MBEDTLS_ERR_MD_FILE_IO_ERROR\n#define POLARSSL_ERR_MPI_BAD_INPUT_DATA MBEDTLS_ERR_MPI_BAD_INPUT_DATA\n#define POLARSSL_ERR_MPI_BUFFER_TOO_SMALL MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL\n#define POLARSSL_ERR_MPI_DIVISION_BY_ZERO MBEDTLS_ERR_MPI_DIVISION_BY_ZERO\n#define POLARSSL_ERR_MPI_FILE_IO_ERROR MBEDTLS_ERR_MPI_FILE_IO_ERROR\n#define POLARSSL_ERR_MPI_INVALID_CHARACTER MBEDTLS_ERR_MPI_INVALID_CHARACTER\n#define POLARSSL_ERR_MPI_MALLOC_FAILED MBEDTLS_ERR_MPI_ALLOC_FAILED\n#define POLARSSL_ERR_MPI_NEGATIVE_VALUE MBEDTLS_ERR_MPI_NEGATIVE_VALUE\n#define POLARSSL_ERR_MPI_NOT_ACCEPTABLE MBEDTLS_ERR_MPI_NOT_ACCEPTABLE\n#define POLARSSL_ERR_NET_ACCEPT_FAILED MBEDTLS_ERR_NET_ACCEPT_FAILED\n#define POLARSSL_ERR_NET_BIND_FAILED MBEDTLS_ERR_NET_BIND_FAILED\n#define POLARSSL_ERR_NET_CONNECT_FAILED MBEDTLS_ERR_NET_CONNECT_FAILED\n#define POLARSSL_ERR_NET_CONN_RESET MBEDTLS_ERR_NET_CONN_RESET\n#define POLARSSL_ERR_NET_LISTEN_FAILED MBEDTLS_ERR_NET_LISTEN_FAILED\n#define POLARSSL_ERR_NET_RECV_FAILED MBEDTLS_ERR_NET_RECV_FAILED\n#define POLARSSL_ERR_NET_SEND_FAILED MBEDTLS_ERR_NET_SEND_FAILED\n#define POLARSSL_ERR_NET_SOCKET_FAILED MBEDTLS_ERR_NET_SOCKET_FAILED\n#define POLARSSL_ERR_NET_TIMEOUT MBEDTLS_ERR_SSL_TIMEOUT\n#define POLARSSL_ERR_NET_UNKNOWN_HOST MBEDTLS_ERR_NET_UNKNOWN_HOST\n#define POLARSSL_ERR_NET_WANT_READ MBEDTLS_ERR_SSL_WANT_READ\n#define POLARSSL_ERR_NET_WANT_WRITE MBEDTLS_ERR_SSL_WANT_WRITE\n#define POLARSSL_ERR_OID_BUF_TOO_SMALL MBEDTLS_ERR_OID_BUF_TOO_SMALL\n#define POLARSSL_ERR_OID_NOT_FOUND MBEDTLS_ERR_OID_NOT_FOUND\n#define POLARSSL_ERR_PADLOCK_DATA_MISALIGNED MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED\n#define POLARSSL_ERR_PEM_BAD_INPUT_DATA MBEDTLS_ERR_PEM_BAD_INPUT_DATA\n#define POLARSSL_ERR_PEM_FEATURE_UNAVAILABLE MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE\n#define POLARSSL_ERR_PEM_INVALID_DATA MBEDTLS_ERR_PEM_INVALID_DATA\n#define POLARSSL_ERR_PEM_INVALID_ENC_IV MBEDTLS_ERR_PEM_INVALID_ENC_IV\n#define POLARSSL_ERR_PEM_MALLOC_FAILED MBEDTLS_ERR_PEM_ALLOC_FAILED\n#define POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT\n#define POLARSSL_ERR_PEM_PASSWORD_MISMATCH MBEDTLS_ERR_PEM_PASSWORD_MISMATCH\n#define POLARSSL_ERR_PEM_PASSWORD_REQUIRED MBEDTLS_ERR_PEM_PASSWORD_REQUIRED\n#define POLARSSL_ERR_PEM_UNKNOWN_ENC_ALG MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG\n#define POLARSSL_ERR_PKCS12_BAD_INPUT_DATA MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA\n#define POLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE\n#define POLARSSL_ERR_PKCS12_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH\n#define POLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT\n#define POLARSSL_ERR_PKCS5_BAD_INPUT_DATA MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA\n#define POLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE\n#define POLARSSL_ERR_PKCS5_INVALID_FORMAT MBEDTLS_ERR_PKCS5_INVALID_FORMAT\n#define POLARSSL_ERR_PKCS5_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH\n#define POLARSSL_ERR_PK_BAD_INPUT_DATA MBEDTLS_ERR_PK_BAD_INPUT_DATA\n#define POLARSSL_ERR_PK_FEATURE_UNAVAILABLE MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE\n#define POLARSSL_ERR_PK_FILE_IO_ERROR MBEDTLS_ERR_PK_FILE_IO_ERROR\n#define POLARSSL_ERR_PK_INVALID_ALG MBEDTLS_ERR_PK_INVALID_ALG\n#define POLARSSL_ERR_PK_INVALID_PUBKEY MBEDTLS_ERR_PK_INVALID_PUBKEY\n#define POLARSSL_ERR_PK_KEY_INVALID_FORMAT MBEDTLS_ERR_PK_KEY_INVALID_FORMAT\n#define POLARSSL_ERR_PK_KEY_INVALID_VERSION MBEDTLS_ERR_PK_KEY_INVALID_VERSION\n#define POLARSSL_ERR_PK_MALLOC_FAILED MBEDTLS_ERR_PK_ALLOC_FAILED\n#define POLARSSL_ERR_PK_PASSWORD_MISMATCH MBEDTLS_ERR_PK_PASSWORD_MISMATCH\n#define POLARSSL_ERR_PK_PASSWORD_REQUIRED MBEDTLS_ERR_PK_PASSWORD_REQUIRED\n#define POLARSSL_ERR_PK_SIG_LEN_MISMATCH MBEDTLS_ERR_PK_SIG_LEN_MISMATCH\n#define POLARSSL_ERR_PK_TYPE_MISMATCH MBEDTLS_ERR_PK_TYPE_MISMATCH\n#define POLARSSL_ERR_PK_UNKNOWN_NAMED_CURVE MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE\n#define POLARSSL_ERR_PK_UNKNOWN_PK_ALG MBEDTLS_ERR_PK_UNKNOWN_PK_ALG\n#define POLARSSL_ERR_RSA_BAD_INPUT_DATA MBEDTLS_ERR_RSA_BAD_INPUT_DATA\n#define POLARSSL_ERR_RSA_INVALID_PADDING MBEDTLS_ERR_RSA_INVALID_PADDING\n#define POLARSSL_ERR_RSA_KEY_CHECK_FAILED MBEDTLS_ERR_RSA_KEY_CHECK_FAILED\n#define POLARSSL_ERR_RSA_KEY_GEN_FAILED MBEDTLS_ERR_RSA_KEY_GEN_FAILED\n#define POLARSSL_ERR_RSA_OUTPUT_TOO_LARGE MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE\n#define POLARSSL_ERR_RSA_PRIVATE_FAILED MBEDTLS_ERR_RSA_PRIVATE_FAILED\n#define POLARSSL_ERR_RSA_PUBLIC_FAILED MBEDTLS_ERR_RSA_PUBLIC_FAILED\n#define POLARSSL_ERR_RSA_RNG_FAILED MBEDTLS_ERR_RSA_RNG_FAILED\n#define POLARSSL_ERR_RSA_VERIFY_FAILED MBEDTLS_ERR_RSA_VERIFY_FAILED\n#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE\n#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST\n#define POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY\n#define POLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC\n#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO\n#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE\n#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS\n#define POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP\n#define POLARSSL_ERR_SSL_BAD_HS_FINISHED MBEDTLS_ERR_SSL_BAD_HS_FINISHED\n#define POLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET\n#define POLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION\n#define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO\n#define POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE\n#define POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE\n#define POLARSSL_ERR_SSL_BAD_INPUT_DATA MBEDTLS_ERR_SSL_BAD_INPUT_DATA\n#define POLARSSL_ERR_SSL_BUFFER_TOO_SMALL MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL\n#define POLARSSL_ERR_SSL_CA_CHAIN_REQUIRED MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED\n#define POLARSSL_ERR_SSL_CERTIFICATE_REQUIRED MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED\n#define POLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE\n#define POLARSSL_ERR_SSL_COMPRESSION_FAILED MBEDTLS_ERR_SSL_COMPRESSION_FAILED\n#define POLARSSL_ERR_SSL_CONN_EOF MBEDTLS_ERR_SSL_CONN_EOF\n#define POLARSSL_ERR_SSL_COUNTER_WRAPPING MBEDTLS_ERR_SSL_COUNTER_WRAPPING\n#define POLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE\n#define POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE\n#define POLARSSL_ERR_SSL_HELLO_VERIFY_REQUIRED MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED\n#define POLARSSL_ERR_SSL_HW_ACCEL_FAILED MBEDTLS_ERR_SSL_HW_ACCEL_FAILED\n#define POLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH\n#define POLARSSL_ERR_SSL_INTERNAL_ERROR MBEDTLS_ERR_SSL_INTERNAL_ERROR\n#define POLARSSL_ERR_SSL_INVALID_MAC MBEDTLS_ERR_SSL_INVALID_MAC\n#define POLARSSL_ERR_SSL_INVALID_RECORD MBEDTLS_ERR_SSL_INVALID_RECORD\n#define POLARSSL_ERR_SSL_MALLOC_FAILED MBEDTLS_ERR_SSL_ALLOC_FAILED\n#define POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN\n#define POLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE\n#define POLARSSL_ERR_SSL_NO_RNG MBEDTLS_ERR_SSL_NO_RNG\n#define POLARSSL_ERR_SSL_NO_USABLE_CIPHERSUITE MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE\n#define POLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY\n#define POLARSSL_ERR_SSL_PEER_VERIFY_FAILED MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED\n#define POLARSSL_ERR_SSL_PK_TYPE_MISMATCH MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH\n#define POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED\n#define POLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED\n#define POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE\n#define POLARSSL_ERR_SSL_UNKNOWN_CIPHER MBEDTLS_ERR_SSL_UNKNOWN_CIPHER\n#define POLARSSL_ERR_SSL_UNKNOWN_IDENTITY MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY\n#define POLARSSL_ERR_SSL_WAITING_SERVER_HELLO_RENEGO MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO\n#define POLARSSL_ERR_THREADING_BAD_INPUT_DATA MBEDTLS_ERR_THREADING_BAD_INPUT_DATA\n#define POLARSSL_ERR_THREADING_FEATURE_UNAVAILABLE MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE\n#define POLARSSL_ERR_THREADING_MUTEX_ERROR MBEDTLS_ERR_THREADING_MUTEX_ERROR\n#define POLARSSL_ERR_X509_BAD_INPUT_DATA MBEDTLS_ERR_X509_BAD_INPUT_DATA\n#define POLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT\n#define POLARSSL_ERR_X509_CERT_VERIFY_FAILED MBEDTLS_ERR_X509_CERT_VERIFY_FAILED\n#define POLARSSL_ERR_X509_FEATURE_UNAVAILABLE MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE\n#define POLARSSL_ERR_X509_FILE_IO_ERROR MBEDTLS_ERR_X509_FILE_IO_ERROR\n#define POLARSSL_ERR_X509_INVALID_ALG MBEDTLS_ERR_X509_INVALID_ALG\n#define POLARSSL_ERR_X509_INVALID_DATE MBEDTLS_ERR_X509_INVALID_DATE\n#define POLARSSL_ERR_X509_INVALID_EXTENSIONS MBEDTLS_ERR_X509_INVALID_EXTENSIONS\n#define POLARSSL_ERR_X509_INVALID_FORMAT MBEDTLS_ERR_X509_INVALID_FORMAT\n#define POLARSSL_ERR_X509_INVALID_NAME MBEDTLS_ERR_X509_INVALID_NAME\n#define POLARSSL_ERR_X509_INVALID_SERIAL MBEDTLS_ERR_X509_INVALID_SERIAL\n#define POLARSSL_ERR_X509_INVALID_SIGNATURE MBEDTLS_ERR_X509_INVALID_SIGNATURE\n#define POLARSSL_ERR_X509_INVALID_VERSION MBEDTLS_ERR_X509_INVALID_VERSION\n#define POLARSSL_ERR_X509_MALLOC_FAILED MBEDTLS_ERR_X509_ALLOC_FAILED\n#define POLARSSL_ERR_X509_SIG_MISMATCH MBEDTLS_ERR_X509_SIG_MISMATCH\n#define POLARSSL_ERR_X509_UNKNOWN_OID MBEDTLS_ERR_X509_UNKNOWN_OID\n#define POLARSSL_ERR_X509_UNKNOWN_SIG_ALG MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG\n#define POLARSSL_ERR_X509_UNKNOWN_VERSION MBEDTLS_ERR_X509_UNKNOWN_VERSION\n#define POLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH\n#define POLARSSL_GCM_H MBEDTLS_GCM_H\n#define POLARSSL_HAVEGE_H MBEDTLS_HAVEGE_H\n#define POLARSSL_HAVE_INT32 MBEDTLS_HAVE_INT32\n#define POLARSSL_HAVE_INT64 MBEDTLS_HAVE_INT64\n#define POLARSSL_HAVE_UDBL MBEDTLS_HAVE_UDBL\n#define POLARSSL_HAVE_X86 MBEDTLS_HAVE_X86\n#define POLARSSL_HAVE_X86_64 MBEDTLS_HAVE_X86_64\n#define POLARSSL_HMAC_DRBG_H MBEDTLS_HMAC_DRBG_H\n#define POLARSSL_HMAC_DRBG_PR_OFF MBEDTLS_HMAC_DRBG_PR_OFF\n#define POLARSSL_HMAC_DRBG_PR_ON MBEDTLS_HMAC_DRBG_PR_ON\n#define POLARSSL_KEY_EXCHANGE_DHE_PSK MBEDTLS_KEY_EXCHANGE_DHE_PSK\n#define POLARSSL_KEY_EXCHANGE_DHE_RSA MBEDTLS_KEY_EXCHANGE_DHE_RSA\n#define POLARSSL_KEY_EXCHANGE_ECDHE_ECDSA MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA\n#define POLARSSL_KEY_EXCHANGE_ECDHE_PSK MBEDTLS_KEY_EXCHANGE_ECDHE_PSK\n#define POLARSSL_KEY_EXCHANGE_ECDHE_RSA MBEDTLS_KEY_EXCHANGE_ECDHE_RSA\n#define POLARSSL_KEY_EXCHANGE_ECDH_ECDSA MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA\n#define POLARSSL_KEY_EXCHANGE_ECDH_RSA MBEDTLS_KEY_EXCHANGE_ECDH_RSA\n#define POLARSSL_KEY_EXCHANGE_NONE MBEDTLS_KEY_EXCHANGE_NONE\n#define POLARSSL_KEY_EXCHANGE_PSK MBEDTLS_KEY_EXCHANGE_PSK\n#define POLARSSL_KEY_EXCHANGE_RSA MBEDTLS_KEY_EXCHANGE_RSA\n#define POLARSSL_KEY_EXCHANGE_RSA_PSK MBEDTLS_KEY_EXCHANGE_RSA_PSK\n#define POLARSSL_KEY_EXCHANGE__SOME__ECDHE_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED\n#define POLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED\n#define POLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED\n#define POLARSSL_KEY_LENGTH_DES MBEDTLS_KEY_LENGTH_DES\n#define POLARSSL_KEY_LENGTH_DES_EDE MBEDTLS_KEY_LENGTH_DES_EDE\n#define POLARSSL_KEY_LENGTH_DES_EDE3 MBEDTLS_KEY_LENGTH_DES_EDE3\n#define POLARSSL_KEY_LENGTH_NONE MBEDTLS_KEY_LENGTH_NONE\n#define POLARSSL_MAX_BLOCK_LENGTH MBEDTLS_MAX_BLOCK_LENGTH\n#define POLARSSL_MAX_IV_LENGTH MBEDTLS_MAX_IV_LENGTH\n#define POLARSSL_MD2_H MBEDTLS_MD2_H\n#define POLARSSL_MD4_H MBEDTLS_MD4_H\n#define POLARSSL_MD5_H MBEDTLS_MD5_H\n#define POLARSSL_MD_H MBEDTLS_MD_H\n#define POLARSSL_MD_MAX_SIZE MBEDTLS_MD_MAX_SIZE\n#define POLARSSL_MD_MD2 MBEDTLS_MD_MD2\n#define POLARSSL_MD_MD4 MBEDTLS_MD_MD4\n#define POLARSSL_MD_MD5 MBEDTLS_MD_MD5\n#define POLARSSL_MD_NONE MBEDTLS_MD_NONE\n#define POLARSSL_MD_RIPEMD160 MBEDTLS_MD_RIPEMD160\n#define POLARSSL_MD_SHA1 MBEDTLS_MD_SHA1\n#define POLARSSL_MD_SHA224 MBEDTLS_MD_SHA224\n#define POLARSSL_MD_SHA256 MBEDTLS_MD_SHA256\n#define POLARSSL_MD_SHA384 MBEDTLS_MD_SHA384\n#define POLARSSL_MD_SHA512 MBEDTLS_MD_SHA512\n#define POLARSSL_MD_WRAP_H MBEDTLS_MD_WRAP_H\n#define POLARSSL_MEMORY_BUFFER_ALLOC_H MBEDTLS_MEMORY_BUFFER_ALLOC_H\n#define POLARSSL_MODE_CBC MBEDTLS_MODE_CBC\n#define POLARSSL_MODE_CCM MBEDTLS_MODE_CCM\n#define POLARSSL_MODE_CFB MBEDTLS_MODE_CFB\n#define POLARSSL_MODE_CTR MBEDTLS_MODE_CTR\n#define POLARSSL_MODE_ECB MBEDTLS_MODE_ECB\n#define POLARSSL_MODE_GCM MBEDTLS_MODE_GCM\n#define POLARSSL_MODE_NONE MBEDTLS_MODE_NONE\n#define POLARSSL_MODE_OFB MBEDTLS_MODE_OFB\n#define POLARSSL_MODE_STREAM MBEDTLS_MODE_STREAM\n#define POLARSSL_MPI_MAX_BITS MBEDTLS_MPI_MAX_BITS\n#define POLARSSL_MPI_MAX_BITS_SCALE100 MBEDTLS_MPI_MAX_BITS_SCALE100\n#define POLARSSL_MPI_MAX_LIMBS MBEDTLS_MPI_MAX_LIMBS\n#define POLARSSL_MPI_RW_BUFFER_SIZE MBEDTLS_MPI_RW_BUFFER_SIZE\n#define POLARSSL_NET_H MBEDTLS_NET_SOCKETS_H\n#define POLARSSL_NET_LISTEN_BACKLOG MBEDTLS_NET_LISTEN_BACKLOG\n#define POLARSSL_OID_H MBEDTLS_OID_H\n#define POLARSSL_OPERATION_NONE MBEDTLS_OPERATION_NONE\n#define POLARSSL_PADDING_NONE MBEDTLS_PADDING_NONE\n#define POLARSSL_PADDING_ONE_AND_ZEROS MBEDTLS_PADDING_ONE_AND_ZEROS\n#define POLARSSL_PADDING_PKCS7 MBEDTLS_PADDING_PKCS7\n#define POLARSSL_PADDING_ZEROS MBEDTLS_PADDING_ZEROS\n#define POLARSSL_PADDING_ZEROS_AND_LEN MBEDTLS_PADDING_ZEROS_AND_LEN\n#define POLARSSL_PADLOCK_H MBEDTLS_PADLOCK_H\n#define POLARSSL_PEM_H MBEDTLS_PEM_H\n#define POLARSSL_PKCS11_H MBEDTLS_PKCS11_H\n#define POLARSSL_PKCS12_H MBEDTLS_PKCS12_H\n#define POLARSSL_PKCS5_H MBEDTLS_PKCS5_H\n#define POLARSSL_PK_DEBUG_ECP MBEDTLS_PK_DEBUG_ECP\n#define POLARSSL_PK_DEBUG_MAX_ITEMS MBEDTLS_PK_DEBUG_MAX_ITEMS\n#define POLARSSL_PK_DEBUG_MPI MBEDTLS_PK_DEBUG_MPI\n#define POLARSSL_PK_DEBUG_NONE MBEDTLS_PK_DEBUG_NONE\n#define POLARSSL_PK_ECDSA MBEDTLS_PK_ECDSA\n#define POLARSSL_PK_ECKEY MBEDTLS_PK_ECKEY\n#define POLARSSL_PK_ECKEY_DH MBEDTLS_PK_ECKEY_DH\n#define POLARSSL_PK_H MBEDTLS_PK_H\n#define POLARSSL_PK_NONE MBEDTLS_PK_NONE\n#define POLARSSL_PK_RSA MBEDTLS_PK_RSA\n#define POLARSSL_PK_RSASSA_PSS MBEDTLS_PK_RSASSA_PSS\n#define POLARSSL_PK_RSA_ALT MBEDTLS_PK_RSA_ALT\n#define POLARSSL_PK_WRAP_H MBEDTLS_PK_WRAP_H\n#define POLARSSL_PLATFORM_H MBEDTLS_PLATFORM_H\n#define POLARSSL_PREMASTER_SIZE MBEDTLS_PREMASTER_SIZE\n#define POLARSSL_RIPEMD160_H MBEDTLS_RIPEMD160_H\n#define POLARSSL_RSA_H MBEDTLS_RSA_H\n#define POLARSSL_SHA1_H MBEDTLS_SHA1_H\n#define POLARSSL_SHA256_H MBEDTLS_SHA256_H\n#define POLARSSL_SHA512_H MBEDTLS_SHA512_H\n#define POLARSSL_SSL_CACHE_H MBEDTLS_SSL_CACHE_H\n#define POLARSSL_SSL_CIPHERSUITES_H MBEDTLS_SSL_CIPHERSUITES_H\n#define POLARSSL_SSL_COOKIE_H MBEDTLS_SSL_COOKIE_H\n#define POLARSSL_SSL_H MBEDTLS_SSL_H\n#define POLARSSL_THREADING_H MBEDTLS_THREADING_H\n#define POLARSSL_THREADING_IMPL MBEDTLS_THREADING_IMPL\n#define POLARSSL_TIMING_H MBEDTLS_TIMING_H\n#define POLARSSL_VERSION_H MBEDTLS_VERSION_H\n#define POLARSSL_VERSION_MAJOR MBEDTLS_VERSION_MAJOR\n#define POLARSSL_VERSION_MINOR MBEDTLS_VERSION_MINOR\n#define POLARSSL_VERSION_NUMBER MBEDTLS_VERSION_NUMBER\n#define POLARSSL_VERSION_PATCH MBEDTLS_VERSION_PATCH\n#define POLARSSL_VERSION_STRING MBEDTLS_VERSION_STRING\n#define POLARSSL_VERSION_STRING_FULL MBEDTLS_VERSION_STRING_FULL\n#define POLARSSL_X509_CRL_H MBEDTLS_X509_CRL_H\n#define POLARSSL_X509_CRT_H MBEDTLS_X509_CRT_H\n#define POLARSSL_X509_CSR_H MBEDTLS_X509_CSR_H\n#define POLARSSL_X509_H MBEDTLS_X509_H\n#define POLARSSL_XTEA_H MBEDTLS_XTEA_H\n#define RSA_CRYPT MBEDTLS_RSA_CRYPT\n#define RSA_PKCS_V15 MBEDTLS_RSA_PKCS_V15\n#define RSA_PKCS_V21 MBEDTLS_RSA_PKCS_V21\n#define RSA_PRIVATE MBEDTLS_RSA_PRIVATE\n#define RSA_PUBLIC MBEDTLS_RSA_PUBLIC\n#define RSA_SALT_LEN_ANY MBEDTLS_RSA_SALT_LEN_ANY\n#define RSA_SIGN MBEDTLS_RSA_SIGN\n#define SSL_ALERT_LEVEL_FATAL MBEDTLS_SSL_ALERT_LEVEL_FATAL\n#define SSL_ALERT_LEVEL_WARNING MBEDTLS_SSL_ALERT_LEVEL_WARNING\n#define SSL_ALERT_MSG_ACCESS_DENIED MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED\n#define SSL_ALERT_MSG_BAD_CERT MBEDTLS_SSL_ALERT_MSG_BAD_CERT\n#define SSL_ALERT_MSG_BAD_RECORD_MAC MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC\n#define SSL_ALERT_MSG_CERT_EXPIRED MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED\n#define SSL_ALERT_MSG_CERT_REVOKED MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED\n#define SSL_ALERT_MSG_CERT_UNKNOWN MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN\n#define SSL_ALERT_MSG_CLOSE_NOTIFY MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY\n#define SSL_ALERT_MSG_DECODE_ERROR MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR\n#define SSL_ALERT_MSG_DECOMPRESSION_FAILURE MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE\n#define SSL_ALERT_MSG_DECRYPTION_FAILED MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED\n#define SSL_ALERT_MSG_DECRYPT_ERROR MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR\n#define SSL_ALERT_MSG_EXPORT_RESTRICTION MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION\n#define SSL_ALERT_MSG_HANDSHAKE_FAILURE MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE\n#define SSL_ALERT_MSG_ILLEGAL_PARAMETER MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER\n#define SSL_ALERT_MSG_INAPROPRIATE_FALLBACK MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK\n#define SSL_ALERT_MSG_INSUFFICIENT_SECURITY MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY\n#define SSL_ALERT_MSG_INTERNAL_ERROR MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR\n#define SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL\n#define SSL_ALERT_MSG_NO_CERT MBEDTLS_SSL_ALERT_MSG_NO_CERT\n#define SSL_ALERT_MSG_NO_RENEGOTIATION MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION\n#define SSL_ALERT_MSG_PROTOCOL_VERSION MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION\n#define SSL_ALERT_MSG_RECORD_OVERFLOW MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW\n#define SSL_ALERT_MSG_UNEXPECTED_MESSAGE MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE\n#define SSL_ALERT_MSG_UNKNOWN_CA MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA\n#define SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY\n#define SSL_ALERT_MSG_UNRECOGNIZED_NAME MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME\n#define SSL_ALERT_MSG_UNSUPPORTED_CERT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT\n#define SSL_ALERT_MSG_UNSUPPORTED_EXT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT\n#define SSL_ALERT_MSG_USER_CANCELED MBEDTLS_SSL_ALERT_MSG_USER_CANCELED\n#define SSL_ANTI_REPLAY_DISABLED MBEDTLS_SSL_ANTI_REPLAY_DISABLED\n#define SSL_ANTI_REPLAY_ENABLED MBEDTLS_SSL_ANTI_REPLAY_ENABLED\n#define SSL_ARC4_DISABLED MBEDTLS_SSL_ARC4_DISABLED\n#define SSL_ARC4_ENABLED MBEDTLS_SSL_ARC4_ENABLED\n#define SSL_BUFFER_LEN MBEDTLS_SSL_BUFFER_LEN\n#define SSL_CACHE_DEFAULT_MAX_ENTRIES MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES\n#define SSL_CACHE_DEFAULT_TIMEOUT MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT\n#define SSL_CBC_RECORD_SPLITTING_DISABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED\n#define SSL_CBC_RECORD_SPLITTING_ENABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED\n#define SSL_CERTIFICATE_REQUEST MBEDTLS_SSL_CERTIFICATE_REQUEST\n#define SSL_CERTIFICATE_VERIFY MBEDTLS_SSL_CERTIFICATE_VERIFY\n#define SSL_CERT_TYPE_ECDSA_SIGN MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN\n#define SSL_CERT_TYPE_RSA_SIGN MBEDTLS_SSL_CERT_TYPE_RSA_SIGN\n#define SSL_CHANNEL_INBOUND MBEDTLS_SSL_CHANNEL_INBOUND\n#define SSL_CHANNEL_OUTBOUND MBEDTLS_SSL_CHANNEL_OUTBOUND\n#define SSL_CIPHERSUITES MBEDTLS_SSL_CIPHERSUITES\n#define SSL_CLIENT_CERTIFICATE MBEDTLS_SSL_CLIENT_CERTIFICATE\n#define SSL_CLIENT_CHANGE_CIPHER_SPEC MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC\n#define SSL_CLIENT_FINISHED MBEDTLS_SSL_CLIENT_FINISHED\n#define SSL_CLIENT_HELLO MBEDTLS_SSL_CLIENT_HELLO\n#define SSL_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_CLIENT_KEY_EXCHANGE\n#define SSL_COMPRESSION_ADD MBEDTLS_SSL_COMPRESSION_ADD\n#define SSL_COMPRESS_DEFLATE MBEDTLS_SSL_COMPRESS_DEFLATE\n#define SSL_COMPRESS_NULL MBEDTLS_SSL_COMPRESS_NULL\n#define SSL_DEBUG_BUF MBEDTLS_SSL_DEBUG_BUF\n#define SSL_DEBUG_CRT MBEDTLS_SSL_DEBUG_CRT\n#define SSL_DEBUG_ECP MBEDTLS_SSL_DEBUG_ECP\n#define SSL_DEBUG_MPI MBEDTLS_SSL_DEBUG_MPI\n#define SSL_DEBUG_MSG MBEDTLS_SSL_DEBUG_MSG\n#define SSL_DEBUG_RET MBEDTLS_SSL_DEBUG_RET\n#define SSL_DEFAULT_TICKET_LIFETIME MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME\n#define SSL_DTLS_TIMEOUT_DFL_MAX MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX\n#define SSL_DTLS_TIMEOUT_DFL_MIN MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN\n#define SSL_EMPTY_RENEGOTIATION_INFO MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO\n#define SSL_ETM_DISABLED MBEDTLS_SSL_ETM_DISABLED\n#define SSL_ETM_ENABLED MBEDTLS_SSL_ETM_ENABLED\n#define SSL_EXTENDED_MS_DISABLED MBEDTLS_SSL_EXTENDED_MS_DISABLED\n#define SSL_EXTENDED_MS_ENABLED MBEDTLS_SSL_EXTENDED_MS_ENABLED\n#define SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV\n#define SSL_FLUSH_BUFFERS MBEDTLS_SSL_FLUSH_BUFFERS\n#define SSL_HANDSHAKE_OVER MBEDTLS_SSL_HANDSHAKE_OVER\n#define SSL_HANDSHAKE_WRAPUP MBEDTLS_SSL_HANDSHAKE_WRAPUP\n#define SSL_HASH_MD5 MBEDTLS_SSL_HASH_MD5\n#define SSL_HASH_NONE MBEDTLS_SSL_HASH_NONE\n#define SSL_HASH_SHA1 MBEDTLS_SSL_HASH_SHA1\n#define SSL_HASH_SHA224 MBEDTLS_SSL_HASH_SHA224\n#define SSL_HASH_SHA256 MBEDTLS_SSL_HASH_SHA256\n#define SSL_HASH_SHA384 MBEDTLS_SSL_HASH_SHA384\n#define SSL_HASH_SHA512 MBEDTLS_SSL_HASH_SHA512\n#define SSL_HELLO_REQUEST MBEDTLS_SSL_HELLO_REQUEST\n#define SSL_HS_CERTIFICATE MBEDTLS_SSL_HS_CERTIFICATE\n#define SSL_HS_CERTIFICATE_REQUEST MBEDTLS_SSL_HS_CERTIFICATE_REQUEST\n#define SSL_HS_CERTIFICATE_VERIFY MBEDTLS_SSL_HS_CERTIFICATE_VERIFY\n#define SSL_HS_CLIENT_HELLO MBEDTLS_SSL_HS_CLIENT_HELLO\n#define SSL_HS_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE\n#define SSL_HS_FINISHED MBEDTLS_SSL_HS_FINISHED\n#define SSL_HS_HELLO_REQUEST MBEDTLS_SSL_HS_HELLO_REQUEST\n#define SSL_HS_HELLO_VERIFY_REQUEST MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST\n#define SSL_HS_NEW_SESSION_TICKET MBEDTLS_SSL_HS_NEW_SESSION_TICKET\n#define SSL_HS_SERVER_HELLO MBEDTLS_SSL_HS_SERVER_HELLO\n#define SSL_HS_SERVER_HELLO_DONE MBEDTLS_SSL_HS_SERVER_HELLO_DONE\n#define SSL_HS_SERVER_KEY_EXCHANGE MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE\n#define SSL_INITIAL_HANDSHAKE MBEDTLS_SSL_INITIAL_HANDSHAKE\n#define SSL_IS_CLIENT MBEDTLS_SSL_IS_CLIENT\n#define SSL_IS_FALLBACK MBEDTLS_SSL_IS_FALLBACK\n#define SSL_IS_NOT_FALLBACK MBEDTLS_SSL_IS_NOT_FALLBACK\n#define SSL_IS_SERVER MBEDTLS_SSL_IS_SERVER\n#define SSL_LEGACY_ALLOW_RENEGOTIATION MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION\n#define SSL_LEGACY_BREAK_HANDSHAKE MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE\n#define SSL_LEGACY_NO_RENEGOTIATION MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION\n#define SSL_LEGACY_RENEGOTIATION MBEDTLS_SSL_LEGACY_RENEGOTIATION\n#define SSL_MAC_ADD MBEDTLS_SSL_MAC_ADD\n#define SSL_MAJOR_VERSION_3 MBEDTLS_SSL_MAJOR_VERSION_3\n#define SSL_MAX_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN\n#define SSL_MAX_FRAG_LEN_1024 MBEDTLS_SSL_MAX_FRAG_LEN_1024\n#define SSL_MAX_FRAG_LEN_2048 MBEDTLS_SSL_MAX_FRAG_LEN_2048\n#define SSL_MAX_FRAG_LEN_4096 MBEDTLS_SSL_MAX_FRAG_LEN_4096\n#define SSL_MAX_FRAG_LEN_512 MBEDTLS_SSL_MAX_FRAG_LEN_512\n#define SSL_MAX_FRAG_LEN_INVALID MBEDTLS_SSL_MAX_FRAG_LEN_INVALID\n#define SSL_MAX_FRAG_LEN_NONE MBEDTLS_SSL_MAX_FRAG_LEN_NONE\n#define SSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAX_MAJOR_VERSION\n#define SSL_MAX_MINOR_VERSION MBEDTLS_SSL_MAX_MINOR_VERSION\n#define SSL_MINOR_VERSION_0 MBEDTLS_SSL_MINOR_VERSION_0\n#define SSL_MINOR_VERSION_1 MBEDTLS_SSL_MINOR_VERSION_1\n#define SSL_MINOR_VERSION_2 MBEDTLS_SSL_MINOR_VERSION_2\n#define SSL_MINOR_VERSION_3 MBEDTLS_SSL_MINOR_VERSION_3\n#define SSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MIN_MAJOR_VERSION\n#define SSL_MIN_MINOR_VERSION MBEDTLS_SSL_MIN_MINOR_VERSION\n#define SSL_MSG_ALERT MBEDTLS_SSL_MSG_ALERT\n#define SSL_MSG_APPLICATION_DATA MBEDTLS_SSL_MSG_APPLICATION_DATA\n#define SSL_MSG_CHANGE_CIPHER_SPEC MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC\n#define SSL_MSG_HANDSHAKE MBEDTLS_SSL_MSG_HANDSHAKE\n#define SSL_PADDING_ADD MBEDTLS_SSL_PADDING_ADD\n#define SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION\n#define SSL_RENEGOTIATION_DISABLED MBEDTLS_SSL_RENEGOTIATION_DISABLED\n#define SSL_RENEGOTIATION_DONE MBEDTLS_SSL_RENEGOTIATION_DONE\n#define SSL_RENEGOTIATION_ENABLED MBEDTLS_SSL_RENEGOTIATION_ENABLED\n#define SSL_RENEGOTIATION_NOT_ENFORCED MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED\n#define SSL_RENEGOTIATION_PENDING MBEDTLS_SSL_RENEGOTIATION_PENDING\n#define SSL_RENEGO_MAX_RECORDS_DEFAULT MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT\n#define SSL_RETRANS_FINISHED MBEDTLS_SSL_RETRANS_FINISHED\n#define SSL_RETRANS_PREPARING MBEDTLS_SSL_RETRANS_PREPARING\n#define SSL_RETRANS_SENDING MBEDTLS_SSL_RETRANS_SENDING\n#define SSL_RETRANS_WAITING MBEDTLS_SSL_RETRANS_WAITING\n#define SSL_SECURE_RENEGOTIATION MBEDTLS_SSL_SECURE_RENEGOTIATION\n#define SSL_SERVER_CERTIFICATE MBEDTLS_SSL_SERVER_CERTIFICATE\n#define SSL_SERVER_CHANGE_CIPHER_SPEC MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC\n#define SSL_SERVER_FINISHED MBEDTLS_SSL_SERVER_FINISHED\n#define SSL_SERVER_HELLO MBEDTLS_SSL_SERVER_HELLO\n#define SSL_SERVER_HELLO_DONE MBEDTLS_SSL_SERVER_HELLO_DONE\n#define SSL_SERVER_HELLO_VERIFY_REQUEST_SENT MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT\n#define SSL_SERVER_KEY_EXCHANGE MBEDTLS_SSL_SERVER_KEY_EXCHANGE\n#define SSL_SERVER_NEW_SESSION_TICKET MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET\n#define SSL_SESSION_TICKETS_DISABLED MBEDTLS_SSL_SESSION_TICKETS_DISABLED\n#define SSL_SESSION_TICKETS_ENABLED MBEDTLS_SSL_SESSION_TICKETS_ENABLED\n#define SSL_SIG_ANON MBEDTLS_SSL_SIG_ANON\n#define SSL_SIG_ECDSA MBEDTLS_SSL_SIG_ECDSA\n#define SSL_SIG_RSA MBEDTLS_SSL_SIG_RSA\n#define SSL_TRANSPORT_DATAGRAM MBEDTLS_SSL_TRANSPORT_DATAGRAM\n#define SSL_TRANSPORT_STREAM MBEDTLS_SSL_TRANSPORT_STREAM\n#define SSL_TRUNCATED_HMAC_LEN MBEDTLS_SSL_TRUNCATED_HMAC_LEN\n#define SSL_TRUNC_HMAC_DISABLED MBEDTLS_SSL_TRUNC_HMAC_DISABLED\n#define SSL_TRUNC_HMAC_ENABLED MBEDTLS_SSL_TRUNC_HMAC_ENABLED\n#define SSL_VERIFY_DATA_MAX_LEN MBEDTLS_SSL_VERIFY_DATA_MAX_LEN\n#define SSL_VERIFY_NONE MBEDTLS_SSL_VERIFY_NONE\n#define SSL_VERIFY_OPTIONAL MBEDTLS_SSL_VERIFY_OPTIONAL\n#define SSL_VERIFY_REQUIRED MBEDTLS_SSL_VERIFY_REQUIRED\n#define TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA\n#define TLS_DHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA\n#define TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256\n#define TLS_DHE_PSK_WITH_AES_128_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM\n#define TLS_DHE_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8\n#define TLS_DHE_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256\n#define TLS_DHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA\n#define TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384\n#define TLS_DHE_PSK_WITH_AES_256_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM\n#define TLS_DHE_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8\n#define TLS_DHE_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384\n#define TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256\n#define TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256\n#define TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384\n#define TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384\n#define TLS_DHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA\n#define TLS_DHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256\n#define TLS_DHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384\n#define TLS_DHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA\n#define TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA\n#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA\n#define TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256\n#define TLS_DHE_RSA_WITH_AES_128_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM\n#define TLS_DHE_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8\n#define TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256\n#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA\n#define TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256\n#define TLS_DHE_RSA_WITH_AES_256_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM\n#define TLS_DHE_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8\n#define TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384\n#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA\n#define TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256\n#define TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256\n#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA\n#define TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256\n#define TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384\n#define TLS_DHE_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA\n#define TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA\n#define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA\n#define TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256\n#define TLS_ECDHE_ECDSA_WITH_AES_128_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM\n#define TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8\n#define TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\n#define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA\n#define TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384\n#define TLS_ECDHE_ECDSA_WITH_AES_256_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM\n#define TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8\n#define TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384\n#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256\n#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256\n#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384\n#define TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384\n#define TLS_ECDHE_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA\n#define TLS_ECDHE_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA\n#define TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA\n#define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA\n#define TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256\n#define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA\n#define TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384\n#define TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256\n#define TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384\n#define TLS_ECDHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA\n#define TLS_ECDHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256\n#define TLS_ECDHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384\n#define TLS_ECDHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA\n#define TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA\n#define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA\n#define TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256\n#define TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\n#define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA\n#define TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384\n#define TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\n#define TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256\n#define TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256\n#define TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384\n#define TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384\n#define TLS_ECDHE_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA\n#define TLS_ECDHE_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA\n#define TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA\n#define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA\n#define TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256\n#define TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256\n#define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA\n#define TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384\n#define TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384\n#define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256\n#define TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256\n#define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384\n#define TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384\n#define TLS_ECDH_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA\n#define TLS_ECDH_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA\n#define TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA\n#define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA\n#define TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256\n#define TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256\n#define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA\n#define TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384\n#define TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384\n#define TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256\n#define TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256\n#define TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384\n#define TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384\n#define TLS_ECDH_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA\n#define TLS_ECDH_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA\n#define TLS_EXT_ALPN MBEDTLS_TLS_EXT_ALPN\n#define TLS_EXT_ENCRYPT_THEN_MAC MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC\n#define TLS_EXT_EXTENDED_MASTER_SECRET MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET\n#define TLS_EXT_MAX_FRAGMENT_LENGTH MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH\n#define TLS_EXT_RENEGOTIATION_INFO MBEDTLS_TLS_EXT_RENEGOTIATION_INFO\n#define TLS_EXT_SERVERNAME MBEDTLS_TLS_EXT_SERVERNAME\n#define TLS_EXT_SERVERNAME_HOSTNAME MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME\n#define TLS_EXT_SESSION_TICKET MBEDTLS_TLS_EXT_SESSION_TICKET\n#define TLS_EXT_SIG_ALG MBEDTLS_TLS_EXT_SIG_ALG\n#define TLS_EXT_SUPPORTED_ELLIPTIC_CURVES MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES\n#define TLS_EXT_SUPPORTED_POINT_FORMATS MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS\n#define TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT\n#define TLS_EXT_TRUNCATED_HMAC MBEDTLS_TLS_EXT_TRUNCATED_HMAC\n#define TLS_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA\n#define TLS_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA\n#define TLS_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256\n#define TLS_PSK_WITH_AES_128_CCM MBEDTLS_TLS_PSK_WITH_AES_128_CCM\n#define TLS_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8\n#define TLS_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256\n#define TLS_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA\n#define TLS_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384\n#define TLS_PSK_WITH_AES_256_CCM MBEDTLS_TLS_PSK_WITH_AES_256_CCM\n#define TLS_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8\n#define TLS_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384\n#define TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256\n#define TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256\n#define TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384\n#define TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384\n#define TLS_PSK_WITH_NULL_SHA MBEDTLS_TLS_PSK_WITH_NULL_SHA\n#define TLS_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_PSK_WITH_NULL_SHA256\n#define TLS_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_PSK_WITH_NULL_SHA384\n#define TLS_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_PSK_WITH_RC4_128_SHA\n#define TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA\n#define TLS_RSA_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA\n#define TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256\n#define TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256\n#define TLS_RSA_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA\n#define TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384\n#define TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384\n#define TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256\n#define TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256\n#define TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384\n#define TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384\n#define TLS_RSA_PSK_WITH_NULL_SHA MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA\n#define TLS_RSA_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256\n#define TLS_RSA_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384\n#define TLS_RSA_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA\n#define TLS_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA\n#define TLS_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA\n#define TLS_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256\n#define TLS_RSA_WITH_AES_128_CCM MBEDTLS_TLS_RSA_WITH_AES_128_CCM\n#define TLS_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8\n#define TLS_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256\n#define TLS_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA\n#define TLS_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256\n#define TLS_RSA_WITH_AES_256_CCM MBEDTLS_TLS_RSA_WITH_AES_256_CCM\n#define TLS_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8\n#define TLS_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384\n#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA\n#define TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256\n#define TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256\n#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA\n#define TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256\n#define TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384\n#define TLS_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA\n#define TLS_RSA_WITH_NULL_MD5 MBEDTLS_TLS_RSA_WITH_NULL_MD5\n#define TLS_RSA_WITH_NULL_SHA MBEDTLS_TLS_RSA_WITH_NULL_SHA\n#define TLS_RSA_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_WITH_NULL_SHA256\n#define TLS_RSA_WITH_RC4_128_MD5 MBEDTLS_TLS_RSA_WITH_RC4_128_MD5\n#define TLS_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_WITH_RC4_128_SHA\n#define X509_CRT_VERSION_1 MBEDTLS_X509_CRT_VERSION_1\n#define X509_CRT_VERSION_2 MBEDTLS_X509_CRT_VERSION_2\n#define X509_CRT_VERSION_3 MBEDTLS_X509_CRT_VERSION_3\n#define X509_FORMAT_DER MBEDTLS_X509_FORMAT_DER\n#define X509_FORMAT_PEM MBEDTLS_X509_FORMAT_PEM\n#define X509_MAX_DN_NAME_SIZE MBEDTLS_X509_MAX_DN_NAME_SIZE\n#define X509_RFC5280_MAX_SERIAL_LEN MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN\n#define X509_RFC5280_UTC_TIME_LEN MBEDTLS_X509_RFC5280_UTC_TIME_LEN\n#define XTEA_DECRYPT MBEDTLS_XTEA_DECRYPT\n#define XTEA_ENCRYPT MBEDTLS_XTEA_ENCRYPT\n#define _asn1_bitstring mbedtls_asn1_bitstring\n#define _asn1_buf mbedtls_asn1_buf\n#define _asn1_named_data mbedtls_asn1_named_data\n#define _asn1_sequence mbedtls_asn1_sequence\n#define _ssl_cache_context mbedtls_ssl_cache_context\n#define _ssl_cache_entry mbedtls_ssl_cache_entry\n#define _ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t\n#define _ssl_context mbedtls_ssl_context\n#define _ssl_flight_item mbedtls_ssl_flight_item\n#define _ssl_handshake_params mbedtls_ssl_handshake_params\n#define _ssl_key_cert mbedtls_ssl_key_cert\n#define _ssl_premaster_secret mbedtls_ssl_premaster_secret\n#define _ssl_session mbedtls_ssl_session\n#define _ssl_transform mbedtls_ssl_transform\n#define _x509_crl mbedtls_x509_crl\n#define _x509_crl_entry mbedtls_x509_crl_entry\n#define _x509_crt mbedtls_x509_crt\n#define _x509_csr mbedtls_x509_csr\n#define _x509_time mbedtls_x509_time\n#define _x509write_cert mbedtls_x509write_cert\n#define _x509write_csr mbedtls_x509write_csr\n#define aes_context mbedtls_aes_context\n#define aes_crypt_cbc mbedtls_aes_crypt_cbc\n#define aes_crypt_cfb128 mbedtls_aes_crypt_cfb128\n#define aes_crypt_cfb8 mbedtls_aes_crypt_cfb8\n#define aes_crypt_ctr mbedtls_aes_crypt_ctr\n#define aes_crypt_ecb mbedtls_aes_crypt_ecb\n#define aes_free mbedtls_aes_free\n#define aes_init mbedtls_aes_init\n#define aes_self_test mbedtls_aes_self_test\n#define aes_setkey_dec mbedtls_aes_setkey_dec\n#define aes_setkey_enc mbedtls_aes_setkey_enc\n#define aesni_crypt_ecb mbedtls_aesni_crypt_ecb\n#define aesni_gcm_mult mbedtls_aesni_gcm_mult\n#define aesni_inverse_key mbedtls_aesni_inverse_key\n#define aesni_setkey_enc mbedtls_aesni_setkey_enc\n#define aesni_supports mbedtls_aesni_has_support\n#define alarmed mbedtls_timing_alarmed\n#define arc4_context mbedtls_arc4_context\n#define arc4_crypt mbedtls_arc4_crypt\n#define arc4_free mbedtls_arc4_free\n#define arc4_init mbedtls_arc4_init\n#define arc4_self_test mbedtls_arc4_self_test\n#define arc4_setup mbedtls_arc4_setup\n#define asn1_bitstring mbedtls_asn1_bitstring\n#define asn1_buf mbedtls_asn1_buf\n#define asn1_find_named_data mbedtls_asn1_find_named_data\n#define asn1_free_named_data mbedtls_asn1_free_named_data\n#define asn1_free_named_data_list mbedtls_asn1_free_named_data_list\n#define asn1_get_alg mbedtls_asn1_get_alg\n#define asn1_get_alg_null mbedtls_asn1_get_alg_null\n#define asn1_get_bitstring mbedtls_asn1_get_bitstring\n#define asn1_get_bitstring_null mbedtls_asn1_get_bitstring_null\n#define asn1_get_bool mbedtls_asn1_get_bool\n#define asn1_get_int mbedtls_asn1_get_int\n#define asn1_get_len mbedtls_asn1_get_len\n#define asn1_get_mpi mbedtls_asn1_get_mpi\n#define asn1_get_sequence_of mbedtls_asn1_get_sequence_of\n#define asn1_get_tag mbedtls_asn1_get_tag\n#define asn1_named_data mbedtls_asn1_named_data\n#define asn1_sequence mbedtls_asn1_sequence\n#define asn1_store_named_data mbedtls_asn1_store_named_data\n#define asn1_write_algorithm_identifier mbedtls_asn1_write_algorithm_identifier\n#define asn1_write_bitstring mbedtls_asn1_write_bitstring\n#define asn1_write_bool mbedtls_asn1_write_bool\n#define asn1_write_ia5_string mbedtls_asn1_write_ia5_string\n#define asn1_write_int mbedtls_asn1_write_int\n#define asn1_write_len mbedtls_asn1_write_len\n#define asn1_write_mpi mbedtls_asn1_write_mpi\n#define asn1_write_null mbedtls_asn1_write_null\n#define asn1_write_octet_string mbedtls_asn1_write_octet_string\n#define asn1_write_oid mbedtls_asn1_write_oid\n#define asn1_write_printable_string mbedtls_asn1_write_printable_string\n#define asn1_write_raw_buffer mbedtls_asn1_write_raw_buffer\n#define asn1_write_tag mbedtls_asn1_write_tag\n#define base64_decode mbedtls_base64_decode\n#define base64_encode mbedtls_base64_encode\n#define base64_self_test mbedtls_base64_self_test\n#define blowfish_context mbedtls_blowfish_context\n#define blowfish_crypt_cbc mbedtls_blowfish_crypt_cbc\n#define blowfish_crypt_cfb64 mbedtls_blowfish_crypt_cfb64\n#define blowfish_crypt_ctr mbedtls_blowfish_crypt_ctr\n#define blowfish_crypt_ecb mbedtls_blowfish_crypt_ecb\n#define blowfish_free mbedtls_blowfish_free\n#define blowfish_init mbedtls_blowfish_init\n#define blowfish_setkey mbedtls_blowfish_setkey\n#define camellia_context mbedtls_camellia_context\n#define camellia_crypt_cbc mbedtls_camellia_crypt_cbc\n#define camellia_crypt_cfb128 mbedtls_camellia_crypt_cfb128\n#define camellia_crypt_ctr mbedtls_camellia_crypt_ctr\n#define camellia_crypt_ecb mbedtls_camellia_crypt_ecb\n#define camellia_free mbedtls_camellia_free\n#define camellia_init mbedtls_camellia_init\n#define camellia_self_test mbedtls_camellia_self_test\n#define camellia_setkey_dec mbedtls_camellia_setkey_dec\n#define camellia_setkey_enc mbedtls_camellia_setkey_enc\n#define ccm_auth_decrypt mbedtls_ccm_auth_decrypt\n#define ccm_context mbedtls_ccm_context\n#define ccm_encrypt_and_tag mbedtls_ccm_encrypt_and_tag\n#define ccm_free mbedtls_ccm_free\n#define ccm_init mbedtls_ccm_init\n#define ccm_self_test mbedtls_ccm_self_test\n#define cipher_auth_decrypt mbedtls_cipher_auth_decrypt\n#define cipher_auth_encrypt mbedtls_cipher_auth_encrypt\n#define cipher_base_t mbedtls_cipher_base_t\n#define cipher_check_tag mbedtls_cipher_check_tag\n#define cipher_context_t mbedtls_cipher_context_t\n#define cipher_crypt mbedtls_cipher_crypt\n#define cipher_definition_t mbedtls_cipher_definition_t\n#define cipher_definitions mbedtls_cipher_definitions\n#define cipher_finish mbedtls_cipher_finish\n#define cipher_free mbedtls_cipher_free\n#define cipher_get_block_size mbedtls_cipher_get_block_size\n#define cipher_get_cipher_mode mbedtls_cipher_get_cipher_mode\n#define cipher_get_iv_size mbedtls_cipher_get_iv_size\n#define cipher_get_key_size mbedtls_cipher_get_key_bitlen\n#define cipher_get_name mbedtls_cipher_get_name\n#define cipher_get_operation mbedtls_cipher_get_operation\n#define cipher_get_type mbedtls_cipher_get_type\n#define cipher_id_t mbedtls_cipher_id_t\n#define cipher_info_from_string mbedtls_cipher_info_from_string\n#define cipher_info_from_type mbedtls_cipher_info_from_type\n#define cipher_info_from_values mbedtls_cipher_info_from_values\n#define cipher_info_t mbedtls_cipher_info_t\n#define cipher_init mbedtls_cipher_init\n#define cipher_init_ctx mbedtls_cipher_setup\n#define cipher_list mbedtls_cipher_list\n#define cipher_mode_t mbedtls_cipher_mode_t\n#define cipher_padding_t mbedtls_cipher_padding_t\n#define cipher_reset mbedtls_cipher_reset\n#define cipher_set_iv mbedtls_cipher_set_iv\n#define cipher_set_padding_mode mbedtls_cipher_set_padding_mode\n#define cipher_setkey mbedtls_cipher_setkey\n#define cipher_type_t mbedtls_cipher_type_t\n#define cipher_update mbedtls_cipher_update\n#define cipher_update_ad mbedtls_cipher_update_ad\n#define cipher_write_tag mbedtls_cipher_write_tag\n#define ctr_drbg_context mbedtls_ctr_drbg_context\n#define ctr_drbg_free mbedtls_ctr_drbg_free\n#define ctr_drbg_init mbedtls_ctr_drbg_init\n#define ctr_drbg_random mbedtls_ctr_drbg_random\n#define ctr_drbg_random_with_add mbedtls_ctr_drbg_random_with_add\n#define ctr_drbg_reseed mbedtls_ctr_drbg_reseed\n#define ctr_drbg_self_test mbedtls_ctr_drbg_self_test\n#define ctr_drbg_set_entropy_len mbedtls_ctr_drbg_set_entropy_len\n#define ctr_drbg_set_prediction_resistance mbedtls_ctr_drbg_set_prediction_resistance\n#define ctr_drbg_set_reseed_interval mbedtls_ctr_drbg_set_reseed_interval\n#define ctr_drbg_update mbedtls_ctr_drbg_update\n#define ctr_drbg_update_seed_file mbedtls_ctr_drbg_update_seed_file\n#define ctr_drbg_write_seed_file mbedtls_ctr_drbg_write_seed_file\n#define debug_print_buf mbedtls_debug_print_buf\n#define debug_print_crt mbedtls_debug_print_crt\n#define debug_print_ecp mbedtls_debug_print_ecp\n#define debug_print_mpi mbedtls_debug_print_mpi\n#define debug_print_msg mbedtls_debug_print_msg\n#define debug_print_ret mbedtls_debug_print_ret\n#define debug_set_threshold mbedtls_debug_set_threshold\n#define des3_context mbedtls_des3_context\n#define des3_crypt_cbc mbedtls_des3_crypt_cbc\n#define des3_crypt_ecb mbedtls_des3_crypt_ecb\n#define des3_free mbedtls_des3_free\n#define des3_init mbedtls_des3_init\n#define des3_set2key_dec mbedtls_des3_set2key_dec\n#define des3_set2key_enc mbedtls_des3_set2key_enc\n#define des3_set3key_dec mbedtls_des3_set3key_dec\n#define des3_set3key_enc mbedtls_des3_set3key_enc\n#define des_context mbedtls_des_context\n#define des_crypt_cbc mbedtls_des_crypt_cbc\n#define des_crypt_ecb mbedtls_des_crypt_ecb\n#define des_free mbedtls_des_free\n#define des_init mbedtls_des_init\n#define des_key_check_key_parity mbedtls_des_key_check_key_parity\n#define des_key_check_weak mbedtls_des_key_check_weak\n#define des_key_set_parity mbedtls_des_key_set_parity\n#define des_self_test mbedtls_des_self_test\n#define des_setkey_dec mbedtls_des_setkey_dec\n#define des_setkey_enc mbedtls_des_setkey_enc\n#define dhm_calc_secret mbedtls_dhm_calc_secret\n#define dhm_context mbedtls_dhm_context\n#define dhm_free mbedtls_dhm_free\n#define dhm_init mbedtls_dhm_init\n#define dhm_make_params mbedtls_dhm_make_params\n#define dhm_make_public mbedtls_dhm_make_public\n#define dhm_parse_dhm mbedtls_dhm_parse_dhm\n#define dhm_parse_dhmfile mbedtls_dhm_parse_dhmfile\n#define dhm_read_params mbedtls_dhm_read_params\n#define dhm_read_public mbedtls_dhm_read_public\n#define dhm_self_test mbedtls_dhm_self_test\n#define ecdh_calc_secret mbedtls_ecdh_calc_secret\n#define ecdh_compute_shared mbedtls_ecdh_compute_shared\n#define ecdh_context mbedtls_ecdh_context\n#define ecdh_free mbedtls_ecdh_free\n#define ecdh_gen_public mbedtls_ecdh_gen_public\n#define ecdh_get_params mbedtls_ecdh_get_params\n#define ecdh_init mbedtls_ecdh_init\n#define ecdh_make_params mbedtls_ecdh_make_params\n#define ecdh_make_public mbedtls_ecdh_make_public\n#define ecdh_read_params mbedtls_ecdh_read_params\n#define ecdh_read_public mbedtls_ecdh_read_public\n#define ecdh_side mbedtls_ecdh_side\n#define ecdsa_context mbedtls_ecdsa_context\n#define ecdsa_free mbedtls_ecdsa_free\n#define ecdsa_from_keypair mbedtls_ecdsa_from_keypair\n#define ecdsa_genkey mbedtls_ecdsa_genkey\n#define ecdsa_info mbedtls_ecdsa_info\n#define ecdsa_init mbedtls_ecdsa_init\n#define ecdsa_read_signature mbedtls_ecdsa_read_signature\n#define ecdsa_sign mbedtls_ecdsa_sign\n#define ecdsa_sign_det mbedtls_ecdsa_sign_det\n#define ecdsa_verify mbedtls_ecdsa_verify\n#define ecdsa_write_signature mbedtls_ecdsa_write_signature\n#define ecdsa_write_signature_det mbedtls_ecdsa_write_signature_det\n#define eckey_info mbedtls_eckey_info\n#define eckeydh_info mbedtls_eckeydh_info\n#define ecp_check_privkey mbedtls_ecp_check_privkey\n#define ecp_check_pub_priv mbedtls_ecp_check_pub_priv\n#define ecp_check_pubkey mbedtls_ecp_check_pubkey\n#define ecp_copy mbedtls_ecp_copy\n#define ecp_curve_info mbedtls_ecp_curve_info\n#define ecp_curve_info_from_grp_id mbedtls_ecp_curve_info_from_grp_id\n#define ecp_curve_info_from_name mbedtls_ecp_curve_info_from_name\n#define ecp_curve_info_from_tls_id mbedtls_ecp_curve_info_from_tls_id\n#define ecp_curve_list mbedtls_ecp_curve_list\n#define ecp_gen_key mbedtls_ecp_gen_key\n#define ecp_gen_keypair mbedtls_ecp_gen_keypair\n#define ecp_group mbedtls_ecp_group\n#define ecp_group_copy mbedtls_ecp_group_copy\n#define ecp_group_free mbedtls_ecp_group_free\n#define ecp_group_id mbedtls_ecp_group_id\n#define ecp_group_init mbedtls_ecp_group_init\n#define ecp_grp_id_list mbedtls_ecp_grp_id_list\n#define ecp_is_zero mbedtls_ecp_is_zero\n#define ecp_keypair mbedtls_ecp_keypair\n#define ecp_keypair_free mbedtls_ecp_keypair_free\n#define ecp_keypair_init mbedtls_ecp_keypair_init\n#define ecp_mul mbedtls_ecp_mul\n#define ecp_point mbedtls_ecp_point\n#define ecp_point_free mbedtls_ecp_point_free\n#define ecp_point_init mbedtls_ecp_point_init\n#define ecp_point_read_binary mbedtls_ecp_point_read_binary\n#define ecp_point_read_string mbedtls_ecp_point_read_string\n#define ecp_point_write_binary mbedtls_ecp_point_write_binary\n#define ecp_self_test mbedtls_ecp_self_test\n#define ecp_set_zero mbedtls_ecp_set_zero\n#define ecp_tls_read_group mbedtls_ecp_tls_read_group\n#define ecp_tls_read_point mbedtls_ecp_tls_read_point\n#define ecp_tls_write_group mbedtls_ecp_tls_write_group\n#define ecp_tls_write_point mbedtls_ecp_tls_write_point\n#define ecp_use_known_dp mbedtls_ecp_group_load\n#define entropy_add_source mbedtls_entropy_add_source\n#define entropy_context mbedtls_entropy_context\n#define entropy_free mbedtls_entropy_free\n#define entropy_func mbedtls_entropy_func\n#define entropy_gather mbedtls_entropy_gather\n#define entropy_init mbedtls_entropy_init\n#define entropy_self_test mbedtls_entropy_self_test\n#define entropy_update_manual mbedtls_entropy_update_manual\n#define entropy_update_seed_file mbedtls_entropy_update_seed_file\n#define entropy_write_seed_file mbedtls_entropy_write_seed_file\n#define error_strerror mbedtls_strerror\n#define f_source_ptr mbedtls_entropy_f_source_ptr\n#define gcm_auth_decrypt mbedtls_gcm_auth_decrypt\n#define gcm_context mbedtls_gcm_context\n#define gcm_crypt_and_tag mbedtls_gcm_crypt_and_tag\n#define gcm_finish mbedtls_gcm_finish\n#define gcm_free mbedtls_gcm_free\n#define gcm_init mbedtls_gcm_init\n#define gcm_self_test mbedtls_gcm_self_test\n#define gcm_starts mbedtls_gcm_starts\n#define gcm_update mbedtls_gcm_update\n#define get_timer mbedtls_timing_get_timer\n#define hardclock mbedtls_timing_hardclock\n#define hardclock_poll mbedtls_hardclock_poll\n#define havege_free mbedtls_havege_free\n#define havege_init mbedtls_havege_init\n#define havege_poll mbedtls_havege_poll\n#define havege_random mbedtls_havege_random\n#define havege_state mbedtls_havege_state\n#define hmac_drbg_context mbedtls_hmac_drbg_context\n#define hmac_drbg_free mbedtls_hmac_drbg_free\n#define hmac_drbg_init mbedtls_hmac_drbg_init\n#define hmac_drbg_random mbedtls_hmac_drbg_random\n#define hmac_drbg_random_with_add mbedtls_hmac_drbg_random_with_add\n#define hmac_drbg_reseed mbedtls_hmac_drbg_reseed\n#define hmac_drbg_self_test mbedtls_hmac_drbg_self_test\n#define hmac_drbg_set_entropy_len mbedtls_hmac_drbg_set_entropy_len\n#define hmac_drbg_set_prediction_resistance mbedtls_hmac_drbg_set_prediction_resistance\n#define hmac_drbg_set_reseed_interval mbedtls_hmac_drbg_set_reseed_interval\n#define hmac_drbg_update mbedtls_hmac_drbg_update\n#define hmac_drbg_update_seed_file mbedtls_hmac_drbg_update_seed_file\n#define hmac_drbg_write_seed_file mbedtls_hmac_drbg_write_seed_file\n#define hr_time mbedtls_timing_hr_time\n#define key_exchange_type_t mbedtls_key_exchange_type_t\n#define md mbedtls_md\n#define md2 mbedtls_md2\n#define md2_context mbedtls_md2_context\n#define md2_finish mbedtls_md2_finish\n#define md2_free mbedtls_md2_free\n#define md2_info mbedtls_md2_info\n#define md2_init mbedtls_md2_init\n#define md2_process mbedtls_md2_process\n#define md2_self_test mbedtls_md2_self_test\n#define md2_starts mbedtls_md2_starts\n#define md2_update mbedtls_md2_update\n#define md4 mbedtls_md4\n#define md4_context mbedtls_md4_context\n#define md4_finish mbedtls_md4_finish\n#define md4_free mbedtls_md4_free\n#define md4_info mbedtls_md4_info\n#define md4_init mbedtls_md4_init\n#define md4_process mbedtls_md4_process\n#define md4_self_test mbedtls_md4_self_test\n#define md4_starts mbedtls_md4_starts\n#define md4_update mbedtls_md4_update\n#define md5 mbedtls_md5\n#define md5_context mbedtls_md5_context\n#define md5_finish mbedtls_md5_finish\n#define md5_free mbedtls_md5_free\n#define md5_info mbedtls_md5_info\n#define md5_init mbedtls_md5_init\n#define md5_process mbedtls_md5_process\n#define md5_self_test mbedtls_md5_self_test\n#define md5_starts mbedtls_md5_starts\n#define md5_update mbedtls_md5_update\n#define md_context_t mbedtls_md_context_t\n#define md_file mbedtls_md_file\n#define md_finish mbedtls_md_finish\n#define md_free mbedtls_md_free\n#define md_get_name mbedtls_md_get_name\n#define md_get_size mbedtls_md_get_size\n#define md_get_type mbedtls_md_get_type\n#define md_hmac mbedtls_md_hmac\n#define md_hmac_finish mbedtls_md_hmac_finish\n#define md_hmac_reset mbedtls_md_hmac_reset\n#define md_hmac_starts mbedtls_md_hmac_starts\n#define md_hmac_update mbedtls_md_hmac_update\n#define md_info_from_string mbedtls_md_info_from_string\n#define md_info_from_type mbedtls_md_info_from_type\n#define md_info_t mbedtls_md_info_t\n#define md_init mbedtls_md_init\n#define md_init_ctx mbedtls_md_init_ctx\n#define md_list mbedtls_md_list\n#define md_process mbedtls_md_process\n#define md_starts mbedtls_md_starts\n#define md_type_t mbedtls_md_type_t\n#define md_update mbedtls_md_update\n#define memory_buffer_alloc_cur_get mbedtls_memory_buffer_alloc_cur_get\n#define memory_buffer_alloc_free mbedtls_memory_buffer_alloc_free\n#define memory_buffer_alloc_init mbedtls_memory_buffer_alloc_init\n#define memory_buffer_alloc_max_get mbedtls_memory_buffer_alloc_max_get\n#define memory_buffer_alloc_max_reset mbedtls_memory_buffer_alloc_max_reset\n#define memory_buffer_alloc_self_test mbedtls_memory_buffer_alloc_self_test\n#define memory_buffer_alloc_status mbedtls_memory_buffer_alloc_status\n#define memory_buffer_alloc_verify mbedtls_memory_buffer_alloc_verify\n#define memory_buffer_set_verify mbedtls_memory_buffer_set_verify\n#define mpi mbedtls_mpi\n#define mpi_add_abs mbedtls_mpi_add_abs\n#define mpi_add_int mbedtls_mpi_add_int\n#define mpi_add_mpi mbedtls_mpi_add_mpi\n#define mpi_cmp_abs mbedtls_mpi_cmp_abs\n#define mpi_cmp_int mbedtls_mpi_cmp_int\n#define mpi_cmp_mpi mbedtls_mpi_cmp_mpi\n#define mpi_copy mbedtls_mpi_copy\n#define mpi_div_int mbedtls_mpi_div_int\n#define mpi_div_mpi mbedtls_mpi_div_mpi\n#define mpi_exp_mod mbedtls_mpi_exp_mod\n#define mpi_fill_random mbedtls_mpi_fill_random\n#define mpi_free mbedtls_mpi_free\n#define mpi_gcd mbedtls_mpi_gcd\n#define mpi_gen_prime mbedtls_mpi_gen_prime\n#define mpi_get_bit mbedtls_mpi_get_bit\n#define mpi_grow mbedtls_mpi_grow\n#define mpi_init mbedtls_mpi_init\n#define mpi_inv_mod mbedtls_mpi_inv_mod\n#define mpi_is_prime mbedtls_mpi_is_prime\n#define mpi_lsb mbedtls_mpi_lsb\n#define mpi_lset mbedtls_mpi_lset\n#define mpi_mod_int mbedtls_mpi_mod_int\n#define mpi_mod_mpi mbedtls_mpi_mod_mpi\n#define mpi_msb mbedtls_mpi_bitlen\n#define mpi_mul_int mbedtls_mpi_mul_int\n#define mpi_mul_mpi mbedtls_mpi_mul_mpi\n#define mpi_read_binary mbedtls_mpi_read_binary\n#define mpi_read_file mbedtls_mpi_read_file\n#define mpi_read_string mbedtls_mpi_read_string\n#define mpi_safe_cond_assign mbedtls_mpi_safe_cond_assign\n#define mpi_safe_cond_swap mbedtls_mpi_safe_cond_swap\n#define mpi_self_test mbedtls_mpi_self_test\n#define mpi_set_bit mbedtls_mpi_set_bit\n#define mpi_shift_l mbedtls_mpi_shift_l\n#define mpi_shift_r mbedtls_mpi_shift_r\n#define mpi_shrink mbedtls_mpi_shrink\n#define mpi_size mbedtls_mpi_size\n#define mpi_sub_abs mbedtls_mpi_sub_abs\n#define mpi_sub_int mbedtls_mpi_sub_int\n#define mpi_sub_mpi mbedtls_mpi_sub_mpi\n#define mpi_swap mbedtls_mpi_swap\n#define mpi_write_binary mbedtls_mpi_write_binary\n#define mpi_write_file mbedtls_mpi_write_file\n#define mpi_write_string mbedtls_mpi_write_string\n#define net_accept mbedtls_net_accept\n#define net_bind mbedtls_net_bind\n#define net_close mbedtls_net_free\n#define net_connect mbedtls_net_connect\n#define net_recv mbedtls_net_recv\n#define net_recv_timeout mbedtls_net_recv_timeout\n#define net_send mbedtls_net_send\n#define net_set_block mbedtls_net_set_block\n#define net_set_nonblock mbedtls_net_set_nonblock\n#define net_usleep mbedtls_net_usleep\n#define oid_descriptor_t mbedtls_oid_descriptor_t\n#define oid_get_attr_short_name mbedtls_oid_get_attr_short_name\n#define oid_get_cipher_alg mbedtls_oid_get_cipher_alg\n#define oid_get_ec_grp mbedtls_oid_get_ec_grp\n#define oid_get_extended_key_usage mbedtls_oid_get_extended_key_usage\n#define oid_get_md_alg mbedtls_oid_get_md_alg\n#define oid_get_numeric_string mbedtls_oid_get_numeric_string\n#define oid_get_oid_by_ec_grp mbedtls_oid_get_oid_by_ec_grp\n#define oid_get_oid_by_md mbedtls_oid_get_oid_by_md\n#define oid_get_oid_by_pk_alg mbedtls_oid_get_oid_by_pk_alg\n#define oid_get_oid_by_sig_alg mbedtls_oid_get_oid_by_sig_alg\n#define oid_get_pk_alg mbedtls_oid_get_pk_alg\n#define oid_get_pkcs12_pbe_alg mbedtls_oid_get_pkcs12_pbe_alg\n#define oid_get_sig_alg mbedtls_oid_get_sig_alg\n#define oid_get_sig_alg_desc mbedtls_oid_get_sig_alg_desc\n#define oid_get_x509_ext_type mbedtls_oid_get_x509_ext_type\n#define operation_t mbedtls_operation_t\n#define padlock_supports mbedtls_padlock_has_support\n#define padlock_xcryptcbc mbedtls_padlock_xcryptcbc\n#define padlock_xcryptecb mbedtls_padlock_xcryptecb\n#define pem_context mbedtls_pem_context\n#define pem_free mbedtls_pem_free\n#define pem_init mbedtls_pem_init\n#define pem_read_buffer mbedtls_pem_read_buffer\n#define pem_write_buffer mbedtls_pem_write_buffer\n#define pk_can_do mbedtls_pk_can_do\n#define pk_check_pair mbedtls_pk_check_pair\n#define pk_context mbedtls_pk_context\n#define pk_debug mbedtls_pk_debug\n#define pk_debug_item mbedtls_pk_debug_item\n#define pk_debug_type mbedtls_pk_debug_type\n#define pk_decrypt mbedtls_pk_decrypt\n#define pk_ec mbedtls_pk_ec\n#define pk_encrypt mbedtls_pk_encrypt\n#define pk_free mbedtls_pk_free\n#define pk_get_len mbedtls_pk_get_len\n#define pk_get_name mbedtls_pk_get_name\n#define pk_get_size mbedtls_pk_get_bitlen\n#define pk_get_type mbedtls_pk_get_type\n#define pk_info_from_type mbedtls_pk_info_from_type\n#define pk_info_t mbedtls_pk_info_t\n#define pk_init mbedtls_pk_init\n#define pk_init_ctx mbedtls_pk_setup\n#define pk_init_ctx_rsa_alt mbedtls_pk_setup_rsa_alt\n#define pk_load_file mbedtls_pk_load_file\n#define pk_parse_key mbedtls_pk_parse_key\n#define pk_parse_keyfile mbedtls_pk_parse_keyfile\n#define pk_parse_public_key mbedtls_pk_parse_public_key\n#define pk_parse_public_keyfile mbedtls_pk_parse_public_keyfile\n#define pk_parse_subpubkey mbedtls_pk_parse_subpubkey\n#define pk_rsa mbedtls_pk_rsa\n#define pk_rsa_alt_decrypt_func mbedtls_pk_rsa_alt_decrypt_func\n#define pk_rsa_alt_key_len_func mbedtls_pk_rsa_alt_key_len_func\n#define pk_rsa_alt_sign_func mbedtls_pk_rsa_alt_sign_func\n#define pk_rsassa_pss_options mbedtls_pk_rsassa_pss_options\n#define pk_sign mbedtls_pk_sign\n#define pk_type_t mbedtls_pk_type_t\n#define pk_verify mbedtls_pk_verify\n#define pk_verify_ext mbedtls_pk_verify_ext\n#define pk_write_key_der mbedtls_pk_write_key_der\n#define pk_write_key_pem mbedtls_pk_write_key_pem\n#define pk_write_pubkey mbedtls_pk_write_pubkey\n#define pk_write_pubkey_der mbedtls_pk_write_pubkey_der\n#define pk_write_pubkey_pem mbedtls_pk_write_pubkey_pem\n#define pkcs11_context mbedtls_pkcs11_context\n#define pkcs11_decrypt mbedtls_pkcs11_decrypt\n#define pkcs11_priv_key_free mbedtls_pkcs11_priv_key_free\n#define pkcs11_priv_key_init mbedtls_pkcs11_priv_key_bind\n#define pkcs11_sign mbedtls_pkcs11_sign\n#define pkcs11_x509_cert_init mbedtls_pkcs11_x509_cert_bind\n#define pkcs12_derivation mbedtls_pkcs12_derivation\n#define pkcs12_pbe mbedtls_pkcs12_pbe\n#define pkcs12_pbe_sha1_rc4_128 mbedtls_pkcs12_pbe_sha1_rc4_128\n#define pkcs5_pbes2 mbedtls_pkcs5_pbes2\n#define pkcs5_pbkdf2_hmac mbedtls_pkcs5_pbkdf2_hmac\n#define pkcs5_self_test mbedtls_pkcs5_self_test\n#define platform_entropy_poll mbedtls_platform_entropy_poll\n#define platform_set_exit mbedtls_platform_set_exit\n#define platform_set_fprintf mbedtls_platform_set_fprintf\n#define platform_set_printf mbedtls_platform_set_printf\n#define platform_set_snprintf mbedtls_platform_set_snprintf\n#define polarssl_exit mbedtls_exit\n#define polarssl_fprintf mbedtls_fprintf\n#define polarssl_free mbedtls_free\n#define polarssl_mutex_free mbedtls_mutex_free\n#define polarssl_mutex_init mbedtls_mutex_init\n#define polarssl_mutex_lock mbedtls_mutex_lock\n#define polarssl_mutex_unlock mbedtls_mutex_unlock\n#define polarssl_printf mbedtls_printf\n#define polarssl_snprintf mbedtls_snprintf\n#define polarssl_strerror mbedtls_strerror\n#define ripemd160 mbedtls_ripemd160\n#define ripemd160_context mbedtls_ripemd160_context\n#define ripemd160_finish mbedtls_ripemd160_finish\n#define ripemd160_free mbedtls_ripemd160_free\n#define ripemd160_info mbedtls_ripemd160_info\n#define ripemd160_init mbedtls_ripemd160_init\n#define ripemd160_process mbedtls_ripemd160_process\n#define ripemd160_self_test mbedtls_ripemd160_self_test\n#define ripemd160_starts mbedtls_ripemd160_starts\n#define ripemd160_update mbedtls_ripemd160_update\n#define rsa_alt_context mbedtls_rsa_alt_context\n#define rsa_alt_info mbedtls_rsa_alt_info\n#define rsa_check_privkey mbedtls_rsa_check_privkey\n#define rsa_check_pub_priv mbedtls_rsa_check_pub_priv\n#define rsa_check_pubkey mbedtls_rsa_check_pubkey\n#define rsa_context mbedtls_rsa_context\n#define rsa_copy mbedtls_rsa_copy\n#define rsa_free mbedtls_rsa_free\n#define rsa_gen_key mbedtls_rsa_gen_key\n#define rsa_info mbedtls_rsa_info\n#define rsa_init mbedtls_rsa_init\n#define rsa_pkcs1_decrypt mbedtls_rsa_pkcs1_decrypt\n#define rsa_pkcs1_encrypt mbedtls_rsa_pkcs1_encrypt\n#define rsa_pkcs1_sign mbedtls_rsa_pkcs1_sign\n#define rsa_pkcs1_verify mbedtls_rsa_pkcs1_verify\n#define rsa_private mbedtls_rsa_private\n#define rsa_public mbedtls_rsa_public\n#define rsa_rsaes_oaep_decrypt mbedtls_rsa_rsaes_oaep_decrypt\n#define rsa_rsaes_oaep_encrypt mbedtls_rsa_rsaes_oaep_encrypt\n#define rsa_rsaes_pkcs1_v15_decrypt mbedtls_rsa_rsaes_pkcs1_v15_decrypt\n#define rsa_rsaes_pkcs1_v15_encrypt mbedtls_rsa_rsaes_pkcs1_v15_encrypt\n#define rsa_rsassa_pkcs1_v15_sign mbedtls_rsa_rsassa_pkcs1_v15_sign\n#define rsa_rsassa_pkcs1_v15_verify mbedtls_rsa_rsassa_pkcs1_v15_verify\n#define rsa_rsassa_pss_sign mbedtls_rsa_rsassa_pss_sign\n#define rsa_rsassa_pss_verify mbedtls_rsa_rsassa_pss_verify\n#define rsa_rsassa_pss_verify_ext mbedtls_rsa_rsassa_pss_verify_ext\n#define rsa_self_test mbedtls_rsa_self_test\n#define rsa_set_padding mbedtls_rsa_set_padding\n#define safer_memcmp mbedtls_ssl_safer_memcmp\n#define set_alarm mbedtls_set_alarm\n#define sha1 mbedtls_sha1\n#define sha1_context mbedtls_sha1_context\n#define sha1_finish mbedtls_sha1_finish\n#define sha1_free mbedtls_sha1_free\n#define sha1_info mbedtls_sha1_info\n#define sha1_init mbedtls_sha1_init\n#define sha1_process mbedtls_sha1_process\n#define sha1_self_test mbedtls_sha1_self_test\n#define sha1_starts mbedtls_sha1_starts\n#define sha1_update mbedtls_sha1_update\n#define sha224_info mbedtls_sha224_info\n#define sha256 mbedtls_sha256\n#define sha256_context mbedtls_sha256_context\n#define sha256_finish mbedtls_sha256_finish\n#define sha256_free mbedtls_sha256_free\n#define sha256_info mbedtls_sha256_info\n#define sha256_init mbedtls_sha256_init\n#define sha256_process mbedtls_sha256_process\n#define sha256_self_test mbedtls_sha256_self_test\n#define sha256_starts mbedtls_sha256_starts\n#define sha256_update mbedtls_sha256_update\n#define sha384_info mbedtls_sha384_info\n#define sha512 mbedtls_sha512\n#define sha512_context mbedtls_sha512_context\n#define sha512_finish mbedtls_sha512_finish\n#define sha512_free mbedtls_sha512_free\n#define sha512_info mbedtls_sha512_info\n#define sha512_init mbedtls_sha512_init\n#define sha512_process mbedtls_sha512_process\n#define sha512_self_test mbedtls_sha512_self_test\n#define sha512_starts mbedtls_sha512_starts\n#define sha512_update mbedtls_sha512_update\n#define source_state mbedtls_entropy_source_state\n#define ssl_cache_context mbedtls_ssl_cache_context\n#define ssl_cache_entry mbedtls_ssl_cache_entry\n#define ssl_cache_free mbedtls_ssl_cache_free\n#define ssl_cache_get mbedtls_ssl_cache_get\n#define ssl_cache_init mbedtls_ssl_cache_init\n#define ssl_cache_set mbedtls_ssl_cache_set\n#define ssl_cache_set_max_entries mbedtls_ssl_cache_set_max_entries\n#define ssl_cache_set_timeout mbedtls_ssl_cache_set_timeout\n#define ssl_check_cert_usage mbedtls_ssl_check_cert_usage\n#define ssl_ciphersuite_from_id mbedtls_ssl_ciphersuite_from_id\n#define ssl_ciphersuite_from_string mbedtls_ssl_ciphersuite_from_string\n#define ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t\n#define ssl_ciphersuite_uses_ec mbedtls_ssl_ciphersuite_uses_ec\n#define ssl_ciphersuite_uses_psk mbedtls_ssl_ciphersuite_uses_psk\n#define ssl_close_notify mbedtls_ssl_close_notify\n#define ssl_context mbedtls_ssl_context\n#define ssl_cookie_check mbedtls_ssl_cookie_check\n#define ssl_cookie_check_t mbedtls_ssl_cookie_check_t\n#define ssl_cookie_ctx mbedtls_ssl_cookie_ctx\n#define ssl_cookie_free mbedtls_ssl_cookie_free\n#define ssl_cookie_init mbedtls_ssl_cookie_init\n#define ssl_cookie_set_timeout mbedtls_ssl_cookie_set_timeout\n#define ssl_cookie_setup mbedtls_ssl_cookie_setup\n#define ssl_cookie_write mbedtls_ssl_cookie_write\n#define ssl_cookie_write_t mbedtls_ssl_cookie_write_t\n#define ssl_derive_keys mbedtls_ssl_derive_keys\n#define ssl_dtls_replay_check mbedtls_ssl_dtls_replay_check\n#define ssl_dtls_replay_update mbedtls_ssl_dtls_replay_update\n#define ssl_fetch_input mbedtls_ssl_fetch_input\n#define ssl_flight_item mbedtls_ssl_flight_item\n#define ssl_flush_output mbedtls_ssl_flush_output\n#define ssl_free mbedtls_ssl_free\n#define ssl_get_alpn_protocol mbedtls_ssl_get_alpn_protocol\n#define ssl_get_bytes_avail mbedtls_ssl_get_bytes_avail\n#define ssl_get_ciphersuite mbedtls_ssl_get_ciphersuite\n#define ssl_get_ciphersuite_id mbedtls_ssl_get_ciphersuite_id\n#define ssl_get_ciphersuite_name mbedtls_ssl_get_ciphersuite_name\n#define ssl_get_ciphersuite_sig_pk_alg mbedtls_ssl_get_ciphersuite_sig_pk_alg\n#define ssl_get_peer_cert mbedtls_ssl_get_peer_cert\n#define ssl_get_record_expansion mbedtls_ssl_get_record_expansion\n#define ssl_get_session mbedtls_ssl_get_session\n#define ssl_get_verify_result mbedtls_ssl_get_verify_result\n#define ssl_get_version mbedtls_ssl_get_version\n#define ssl_handshake mbedtls_ssl_handshake\n#define ssl_handshake_client_step mbedtls_ssl_handshake_client_step\n#define ssl_handshake_free mbedtls_ssl_handshake_free\n#define ssl_handshake_params mbedtls_ssl_handshake_params\n#define ssl_handshake_server_step mbedtls_ssl_handshake_server_step\n#define ssl_handshake_step mbedtls_ssl_handshake_step\n#define ssl_handshake_wrapup mbedtls_ssl_handshake_wrapup\n#define ssl_hdr_len mbedtls_ssl_hdr_len\n#define ssl_hs_hdr_len mbedtls_ssl_hs_hdr_len\n#define ssl_hw_record_activate mbedtls_ssl_hw_record_activate\n#define ssl_hw_record_finish mbedtls_ssl_hw_record_finish\n#define ssl_hw_record_init mbedtls_ssl_hw_record_init\n#define ssl_hw_record_read mbedtls_ssl_hw_record_read\n#define ssl_hw_record_reset mbedtls_ssl_hw_record_reset\n#define ssl_hw_record_write mbedtls_ssl_hw_record_write\n#define ssl_init mbedtls_ssl_init\n#define ssl_key_cert mbedtls_ssl_key_cert\n#define ssl_legacy_renegotiation mbedtls_ssl_conf_legacy_renegotiation\n#define ssl_list_ciphersuites mbedtls_ssl_list_ciphersuites\n#define ssl_md_alg_from_hash mbedtls_ssl_md_alg_from_hash\n#define ssl_optimize_checksum mbedtls_ssl_optimize_checksum\n#define ssl_own_cert mbedtls_ssl_own_cert\n#define ssl_own_key mbedtls_ssl_own_key\n#define ssl_parse_certificate mbedtls_ssl_parse_certificate\n#define ssl_parse_change_cipher_spec mbedtls_ssl_parse_change_cipher_spec\n#define ssl_parse_finished mbedtls_ssl_parse_finished\n#define ssl_pk_alg_from_sig mbedtls_ssl_pk_alg_from_sig\n#define ssl_pkcs11_decrypt mbedtls_ssl_pkcs11_decrypt\n#define ssl_pkcs11_key_len mbedtls_ssl_pkcs11_key_len\n#define ssl_pkcs11_sign mbedtls_ssl_pkcs11_sign\n#define ssl_psk_derive_premaster mbedtls_ssl_psk_derive_premaster\n#define ssl_read mbedtls_ssl_read\n#define ssl_read_record mbedtls_ssl_read_record\n#define ssl_read_version mbedtls_ssl_read_version\n#define ssl_recv_flight_completed mbedtls_ssl_recv_flight_completed\n#define ssl_renegotiate mbedtls_ssl_renegotiate\n#define ssl_resend mbedtls_ssl_resend\n#define ssl_reset_checksum mbedtls_ssl_reset_checksum\n#define ssl_send_alert_message mbedtls_ssl_send_alert_message\n#define ssl_send_fatal_handshake_failure mbedtls_ssl_send_fatal_handshake_failure\n#define ssl_send_flight_completed mbedtls_ssl_send_flight_completed\n#define ssl_session mbedtls_ssl_session\n#define ssl_session_free mbedtls_ssl_session_free\n#define ssl_session_init mbedtls_ssl_session_init\n#define ssl_session_reset mbedtls_ssl_session_reset\n#define ssl_set_alpn_protocols mbedtls_ssl_conf_alpn_protocols\n#define ssl_set_arc4_support mbedtls_ssl_conf_arc4_support\n#define ssl_set_authmode mbedtls_ssl_conf_authmode\n#define ssl_set_bio mbedtls_ssl_set_bio\n#define ssl_set_ca_chain mbedtls_ssl_conf_ca_chain\n#define ssl_set_cbc_record_splitting mbedtls_ssl_conf_cbc_record_splitting\n#define ssl_set_ciphersuites mbedtls_ssl_conf_ciphersuites\n#define ssl_set_ciphersuites_for_version mbedtls_ssl_conf_ciphersuites_for_version\n#define ssl_set_client_transport_id mbedtls_ssl_set_client_transport_id\n#define ssl_set_curves mbedtls_ssl_conf_curves\n#define ssl_set_dbg mbedtls_ssl_conf_dbg\n#define ssl_set_dh_param mbedtls_ssl_conf_dh_param\n#define ssl_set_dh_param_ctx mbedtls_ssl_conf_dh_param_ctx\n#define ssl_set_dtls_anti_replay mbedtls_ssl_conf_dtls_anti_replay\n#define ssl_set_dtls_badmac_limit mbedtls_ssl_conf_dtls_badmac_limit\n#define ssl_set_dtls_cookies mbedtls_ssl_conf_dtls_cookies\n#define ssl_set_encrypt_then_mac mbedtls_ssl_conf_encrypt_then_mac\n#define ssl_set_endpoint mbedtls_ssl_conf_endpoint\n#define ssl_set_extended_master_secret mbedtls_ssl_conf_extended_master_secret\n#define ssl_set_fallback mbedtls_ssl_conf_fallback\n#define ssl_set_handshake_timeout mbedtls_ssl_conf_handshake_timeout\n#define ssl_set_hostname mbedtls_ssl_set_hostname\n#define ssl_set_max_frag_len mbedtls_ssl_conf_max_frag_len\n#define ssl_set_max_version mbedtls_ssl_conf_max_version\n#define ssl_set_min_version mbedtls_ssl_conf_min_version\n#define ssl_set_own_cert mbedtls_ssl_conf_own_cert\n#define ssl_set_psk mbedtls_ssl_conf_psk\n#define ssl_set_psk_cb mbedtls_ssl_conf_psk_cb\n#define ssl_set_renegotiation mbedtls_ssl_conf_renegotiation\n#define ssl_set_renegotiation_enforced mbedtls_ssl_conf_renegotiation_enforced\n#define ssl_set_renegotiation_period mbedtls_ssl_conf_renegotiation_period\n#define ssl_set_rng mbedtls_ssl_conf_rng\n#define ssl_set_session mbedtls_ssl_set_session\n#define ssl_set_session_cache mbedtls_ssl_conf_session_cache\n#define ssl_set_session_tickets mbedtls_ssl_conf_session_tickets\n#define ssl_set_sni mbedtls_ssl_conf_sni\n#define ssl_set_transport mbedtls_ssl_conf_transport\n#define ssl_set_truncated_hmac mbedtls_ssl_conf_truncated_hmac\n#define ssl_set_verify mbedtls_ssl_conf_verify\n#define ssl_sig_from_pk mbedtls_ssl_sig_from_pk\n#define ssl_states mbedtls_ssl_states\n#define ssl_transform mbedtls_ssl_transform\n#define ssl_transform_free mbedtls_ssl_transform_free\n#define ssl_write mbedtls_ssl_write\n#define ssl_write_certificate mbedtls_ssl_write_certificate\n#define ssl_write_change_cipher_spec mbedtls_ssl_write_change_cipher_spec\n#define ssl_write_finished mbedtls_ssl_write_finished\n#define ssl_write_record mbedtls_ssl_write_record\n#define ssl_write_version mbedtls_ssl_write_version\n#define supported_ciphers mbedtls_cipher_supported\n#define t_sint mbedtls_mpi_sint\n#define t_udbl mbedtls_t_udbl\n#define t_uint mbedtls_mpi_uint\n#define test_ca_crt mbedtls_test_ca_crt\n#define test_ca_crt_ec mbedtls_test_ca_crt_ec\n#define test_ca_crt_rsa mbedtls_test_ca_crt_rsa\n#define test_ca_key mbedtls_test_ca_key\n#define test_ca_key_ec mbedtls_test_ca_key_ec\n#define test_ca_key_rsa mbedtls_test_ca_key_rsa\n#define test_ca_list mbedtls_test_cas_pem\n#define test_ca_pwd mbedtls_test_ca_pwd\n#define test_ca_pwd_ec mbedtls_test_ca_pwd_ec\n#define test_ca_pwd_rsa mbedtls_test_ca_pwd_rsa\n#define test_cli_crt mbedtls_test_cli_crt\n#define test_cli_crt_ec mbedtls_test_cli_crt_ec\n#define test_cli_crt_rsa mbedtls_test_cli_crt_rsa\n#define test_cli_key mbedtls_test_cli_key\n#define test_cli_key_ec mbedtls_test_cli_key_ec\n#define test_cli_key_rsa mbedtls_test_cli_key_rsa\n#define test_srv_crt mbedtls_test_srv_crt\n#define test_srv_crt_ec mbedtls_test_srv_crt_ec\n#define test_srv_crt_rsa mbedtls_test_srv_crt_rsa\n#define test_srv_key mbedtls_test_srv_key\n#define test_srv_key_ec mbedtls_test_srv_key_ec\n#define test_srv_key_rsa mbedtls_test_srv_key_rsa\n#define threading_mutex_t mbedtls_threading_mutex_t\n#define threading_set_alt mbedtls_threading_set_alt\n#define timing_self_test mbedtls_timing_self_test\n#define version_check_feature mbedtls_version_check_feature\n#define version_get_number mbedtls_version_get_number\n#define version_get_string mbedtls_version_get_string\n#define version_get_string_full mbedtls_version_get_string_full\n#define x509_bitstring mbedtls_x509_bitstring\n#define x509_buf mbedtls_x509_buf\n#define x509_crl mbedtls_x509_crl\n#define x509_crl_entry mbedtls_x509_crl_entry\n#define x509_crl_free mbedtls_x509_crl_free\n#define x509_crl_info mbedtls_x509_crl_info\n#define x509_crl_init mbedtls_x509_crl_init\n#define x509_crl_parse mbedtls_x509_crl_parse\n#define x509_crl_parse_der mbedtls_x509_crl_parse_der\n#define x509_crl_parse_file mbedtls_x509_crl_parse_file\n#define x509_crt mbedtls_x509_crt\n#define x509_crt_check_extended_key_usage mbedtls_x509_crt_check_extended_key_usage\n#define x509_crt_check_key_usage mbedtls_x509_crt_check_key_usage\n#define x509_crt_free mbedtls_x509_crt_free\n#define x509_crt_info mbedtls_x509_crt_info\n#define x509_crt_init mbedtls_x509_crt_init\n#define x509_crt_parse mbedtls_x509_crt_parse\n#define x509_crt_parse_der mbedtls_x509_crt_parse_der\n#define x509_crt_parse_file mbedtls_x509_crt_parse_file\n#define x509_crt_parse_path mbedtls_x509_crt_parse_path\n#define x509_crt_revoked mbedtls_x509_crt_is_revoked\n#define x509_crt_verify mbedtls_x509_crt_verify\n#define x509_csr mbedtls_x509_csr\n#define x509_csr_free mbedtls_x509_csr_free\n#define x509_csr_info mbedtls_x509_csr_info\n#define x509_csr_init mbedtls_x509_csr_init\n#define x509_csr_parse mbedtls_x509_csr_parse\n#define x509_csr_parse_der mbedtls_x509_csr_parse_der\n#define x509_csr_parse_file mbedtls_x509_csr_parse_file\n#define x509_dn_gets mbedtls_x509_dn_gets\n#define x509_get_alg mbedtls_x509_get_alg\n#define x509_get_alg_null mbedtls_x509_get_alg_null\n#define x509_get_ext mbedtls_x509_get_ext\n#define x509_get_name mbedtls_x509_get_name\n#define x509_get_rsassa_pss_params mbedtls_x509_get_rsassa_pss_params\n#define x509_get_serial mbedtls_x509_get_serial\n#define x509_get_sig mbedtls_x509_get_sig\n#define x509_get_sig_alg mbedtls_x509_get_sig_alg\n#define x509_get_time mbedtls_x509_get_time\n#define x509_key_size_helper mbedtls_x509_key_size_helper\n#define x509_name mbedtls_x509_name\n#define x509_self_test mbedtls_x509_self_test\n#define x509_sequence mbedtls_x509_sequence\n#define x509_serial_gets mbedtls_x509_serial_gets\n#define x509_set_extension mbedtls_x509_set_extension\n#define x509_sig_alg_gets mbedtls_x509_sig_alg_gets\n#define x509_string_to_names mbedtls_x509_string_to_names\n#define x509_time mbedtls_x509_time\n#define x509_time_expired mbedtls_x509_time_is_past\n#define x509_time_future mbedtls_x509_time_is_future\n#define x509_write_extensions mbedtls_x509_write_extensions\n#define x509_write_names mbedtls_x509_write_names\n#define x509_write_sig mbedtls_x509_write_sig\n#define x509write_cert mbedtls_x509write_cert\n#define x509write_crt_der mbedtls_x509write_crt_der\n#define x509write_crt_free mbedtls_x509write_crt_free\n#define x509write_crt_init mbedtls_x509write_crt_init\n#define x509write_crt_pem mbedtls_x509write_crt_pem\n#define x509write_crt_set_authority_key_identifier mbedtls_x509write_crt_set_authority_key_identifier\n#define x509write_crt_set_basic_constraints mbedtls_x509write_crt_set_basic_constraints\n#define x509write_crt_set_extension mbedtls_x509write_crt_set_extension\n#define x509write_crt_set_issuer_key mbedtls_x509write_crt_set_issuer_key\n#define x509write_crt_set_issuer_name mbedtls_x509write_crt_set_issuer_name\n#define x509write_crt_set_key_usage mbedtls_x509write_crt_set_key_usage\n#define x509write_crt_set_md_alg mbedtls_x509write_crt_set_md_alg\n#define x509write_crt_set_ns_cert_type mbedtls_x509write_crt_set_ns_cert_type\n#define x509write_crt_set_serial mbedtls_x509write_crt_set_serial\n#define x509write_crt_set_subject_key mbedtls_x509write_crt_set_subject_key\n#define x509write_crt_set_subject_key_identifier mbedtls_x509write_crt_set_subject_key_identifier\n#define x509write_crt_set_subject_name mbedtls_x509write_crt_set_subject_name\n#define x509write_crt_set_validity mbedtls_x509write_crt_set_validity\n#define x509write_crt_set_version mbedtls_x509write_crt_set_version\n#define x509write_csr mbedtls_x509write_csr\n#define x509write_csr_der mbedtls_x509write_csr_der\n#define x509write_csr_free mbedtls_x509write_csr_free\n#define x509write_csr_init mbedtls_x509write_csr_init\n#define x509write_csr_pem mbedtls_x509write_csr_pem\n#define x509write_csr_set_extension mbedtls_x509write_csr_set_extension\n#define x509write_csr_set_key mbedtls_x509write_csr_set_key\n#define x509write_csr_set_key_usage mbedtls_x509write_csr_set_key_usage\n#define x509write_csr_set_md_alg mbedtls_x509write_csr_set_md_alg\n#define x509write_csr_set_ns_cert_type mbedtls_x509write_csr_set_ns_cert_type\n#define x509write_csr_set_subject_name mbedtls_x509write_csr_set_subject_name\n#define xtea_context mbedtls_xtea_context\n#define xtea_crypt_cbc mbedtls_xtea_crypt_cbc\n#define xtea_crypt_ecb mbedtls_xtea_crypt_ecb\n#define xtea_free mbedtls_xtea_free\n#define xtea_init mbedtls_xtea_init\n#define xtea_self_test mbedtls_xtea_self_test\n#define xtea_setup mbedtls_xtea_setup\n\n#endif /* compat-1.3.h */\n#endif /* MBEDTLS_DEPRECATED_REMOVED */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/config.h",
    "content": "/**\n * \\file config.h\n *\n * \\brief Configuration options (set of defines)\n *\n *  This set of compile-time options may be used to enable\n *  or disable features selectively, and reduce the global\n *  memory footprint.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#ifndef MBEDTLS_CONFIG_H\n#define MBEDTLS_CONFIG_H\n\n#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)\n#define _CRT_SECURE_NO_DEPRECATE 1\n#endif\n\n/**\n * \\name SECTION: System support\n *\n * This section sets system specific settings.\n * \\{\n */\n\n/**\n * \\def MBEDTLS_HAVE_ASM\n *\n * The compiler has support for asm().\n *\n * Requires support for asm() in compiler.\n *\n * Used in:\n *      library/timing.c\n *      library/padlock.c\n *      include/mbedtls/bn_mul.h\n *\n * Comment to disable the use of assembly code.\n */\n#define MBEDTLS_HAVE_ASM\n\n/**\n * \\def MBEDTLS_NO_UDBL_DIVISION\n *\n * The platform lacks support for double-width integer division (64-bit\n * division on a 32-bit platform, 128-bit division on a 64-bit platform).\n *\n * Used in:\n *      include/mbedtls/bignum.h\n *      library/bignum.c\n *\n * The bignum code uses double-width division to speed up some operations.\n * Double-width division is often implemented in software that needs to\n * be linked with the program. The presence of a double-width integer\n * type is usually detected automatically through preprocessor macros,\n * but the automatic detection cannot know whether the code needs to\n * and can be linked with an implementation of division for that type.\n * By default division is assumed to be usable if the type is present.\n * Uncomment this option to prevent the use of double-width division.\n *\n * Note that division for the native integer type is always required.\n * Furthermore, a 64-bit type is always required even on a 32-bit\n * platform, but it need not support multiplication or division. In some\n * cases it is also desirable to disable some double-width operations. For\n * example, if double-width division is implemented in software, disabling\n * it can reduce code size in some embedded targets.\n */\n//#define MBEDTLS_NO_UDBL_DIVISION\n\n/**\n * \\def MBEDTLS_HAVE_SSE2\n *\n * CPU supports SSE2 instruction set.\n *\n * Uncomment if the CPU supports SSE2 (IA-32 specific).\n */\n//#define MBEDTLS_HAVE_SSE2\n\n/**\n * \\def MBEDTLS_HAVE_TIME\n *\n * System has time.h and time().\n * The time does not need to be correct, only time differences are used,\n * by contrast with MBEDTLS_HAVE_TIME_DATE\n *\n * Defining MBEDTLS_HAVE_TIME allows you to specify MBEDTLS_PLATFORM_TIME_ALT,\n * MBEDTLS_PLATFORM_TIME_MACRO, MBEDTLS_PLATFORM_TIME_TYPE_MACRO and\n * MBEDTLS_PLATFORM_STD_TIME.\n *\n * Comment if your system does not support time functions\n */\n#define MBEDTLS_HAVE_TIME\n\n/**\n * \\def MBEDTLS_HAVE_TIME_DATE\n *\n * System has time.h and time(), gmtime() and the clock is correct.\n * The time needs to be correct (not necesarily very accurate, but at least\n * the date should be correct). This is used to verify the validity period of\n * X.509 certificates.\n *\n * Comment if your system does not have a correct clock.\n */\n#define MBEDTLS_HAVE_TIME_DATE\n\n/**\n * \\def MBEDTLS_PLATFORM_MEMORY\n *\n * Enable the memory allocation layer.\n *\n * By default mbed TLS uses the system-provided calloc() and free().\n * This allows different allocators (self-implemented or provided) to be\n * provided to the platform abstraction layer.\n *\n * Enabling MBEDTLS_PLATFORM_MEMORY without the\n * MBEDTLS_PLATFORM_{FREE,CALLOC}_MACROs will provide\n * \"mbedtls_platform_set_calloc_free()\" allowing you to set an alternative calloc() and\n * free() function pointer at runtime.\n *\n * Enabling MBEDTLS_PLATFORM_MEMORY and specifying\n * MBEDTLS_PLATFORM_{CALLOC,FREE}_MACROs will allow you to specify the\n * alternate function at compile time.\n *\n * Requires: MBEDTLS_PLATFORM_C\n *\n * Enable this layer to allow use of alternative memory allocators.\n */\n//#define MBEDTLS_PLATFORM_MEMORY\n\n/**\n * \\def MBEDTLS_PLATFORM_NO_STD_FUNCTIONS\n *\n * Do not assign standard functions in the platform layer (e.g. calloc() to\n * MBEDTLS_PLATFORM_STD_CALLOC and printf() to MBEDTLS_PLATFORM_STD_PRINTF)\n *\n * This makes sure there are no linking errors on platforms that do not support\n * these functions. You will HAVE to provide alternatives, either at runtime\n * via the platform_set_xxx() functions or at compile time by setting\n * the MBEDTLS_PLATFORM_STD_XXX defines, or enabling a\n * MBEDTLS_PLATFORM_XXX_MACRO.\n *\n * Requires: MBEDTLS_PLATFORM_C\n *\n * Uncomment to prevent default assignment of standard functions in the\n * platform layer.\n */\n//#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS\n\n/**\n * \\def MBEDTLS_PLATFORM_EXIT_ALT\n *\n * MBEDTLS_PLATFORM_XXX_ALT: Uncomment a macro to let mbed TLS support the\n * function in the platform abstraction layer.\n *\n * Example: In case you uncomment MBEDTLS_PLATFORM_PRINTF_ALT, mbed TLS will\n * provide a function \"mbedtls_platform_set_printf()\" that allows you to set an\n * alternative printf function pointer.\n *\n * All these define require MBEDTLS_PLATFORM_C to be defined!\n *\n * \\note MBEDTLS_PLATFORM_SNPRINTF_ALT is required on Windows;\n * it will be enabled automatically by check_config.h\n *\n * \\warning MBEDTLS_PLATFORM_XXX_ALT cannot be defined at the same time as\n * MBEDTLS_PLATFORM_XXX_MACRO!\n *\n * Requires: MBEDTLS_PLATFORM_TIME_ALT requires MBEDTLS_HAVE_TIME\n *\n * Uncomment a macro to enable alternate implementation of specific base\n * platform function\n */\n//#define MBEDTLS_PLATFORM_EXIT_ALT\n//#define MBEDTLS_PLATFORM_TIME_ALT\n//#define MBEDTLS_PLATFORM_FPRINTF_ALT\n//#define MBEDTLS_PLATFORM_PRINTF_ALT\n//#define MBEDTLS_PLATFORM_SNPRINTF_ALT\n//#define MBEDTLS_PLATFORM_NV_SEED_ALT\n//#define MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT\n\n/**\n * \\def MBEDTLS_DEPRECATED_WARNING\n *\n * Mark deprecated functions so that they generate a warning if used.\n * Functions deprecated in one version will usually be removed in the next\n * version. You can enable this to help you prepare the transition to a new\n * major version by making sure your code is not using these functions.\n *\n * This only works with GCC and Clang. With other compilers, you may want to\n * use MBEDTLS_DEPRECATED_REMOVED\n *\n * Uncomment to get warnings on using deprecated functions.\n */\n//#define MBEDTLS_DEPRECATED_WARNING\n\n/**\n * \\def MBEDTLS_DEPRECATED_REMOVED\n *\n * Remove deprecated functions so that they generate an error if used.\n * Functions deprecated in one version will usually be removed in the next\n * version. You can enable this to help you prepare the transition to a new\n * major version by making sure your code is not using these functions.\n *\n * Uncomment to get errors on using deprecated functions.\n */\n//#define MBEDTLS_DEPRECATED_REMOVED\n\n/* \\} name SECTION: System support */\n\n/**\n * \\name SECTION: mbed TLS feature support\n *\n * This section sets support for features that are or are not needed\n * within the modules that are enabled.\n * \\{\n */\n\n/**\n * \\def MBEDTLS_TIMING_ALT\n *\n * Uncomment to provide your own alternate implementation for mbedtls_timing_hardclock(),\n * mbedtls_timing_get_timer(), mbedtls_set_alarm(), mbedtls_set/get_delay()\n *\n * Only works if you have MBEDTLS_TIMING_C enabled.\n *\n * You will need to provide a header \"timing_alt.h\" and an implementation at\n * compile time.\n */\n//#define MBEDTLS_TIMING_ALT\n\n/**\n * \\def MBEDTLS_AES_ALT\n *\n * MBEDTLS__MODULE_NAME__ALT: Uncomment a macro to let mbed TLS use your\n * alternate core implementation of a symmetric crypto, an arithmetic or hash\n * module (e.g. platform specific assembly optimized implementations). Keep\n * in mind that the function prototypes should remain the same.\n *\n * This replaces the whole module. If you only want to replace one of the\n * functions, use one of the MBEDTLS__FUNCTION_NAME__ALT flags.\n *\n * Example: In case you uncomment MBEDTLS_AES_ALT, mbed TLS will no longer\n * provide the \"struct mbedtls_aes_context\" definition and omit the base\n * function declarations and implementations. \"aes_alt.h\" will be included from\n * \"aes.h\" to include the new function definitions.\n *\n * Uncomment a macro to enable alternate implementation of the corresponding\n * module.\n */\n//#define MBEDTLS_AES_ALT\n//#define MBEDTLS_ARC4_ALT\n//#define MBEDTLS_BLOWFISH_ALT\n//#define MBEDTLS_CAMELLIA_ALT\n//#define MBEDTLS_DES_ALT\n//#define MBEDTLS_XTEA_ALT\n//#define MBEDTLS_MD2_ALT\n//#define MBEDTLS_MD4_ALT\n//#define MBEDTLS_MD5_ALT\n//#define MBEDTLS_RIPEMD160_ALT\n//#define MBEDTLS_SHA1_ALT\n//#define MBEDTLS_SHA256_ALT\n//#define MBEDTLS_SHA512_ALT\n/*\n * When replacing the elliptic curve module, pleace consider, that it is\n * implemented with two .c files:\n *      - ecp.c\n *      - ecp_curves.c\n * You can replace them very much like all the other MBEDTLS__MODULE_NAME__ALT\n * macros as described above. The only difference is that you have to make sure\n * that you provide functionality for both .c files.\n */\n//#define MBEDTLS_ECP_ALT\n\n/**\n * \\def MBEDTLS_MD2_PROCESS_ALT\n *\n * MBEDTLS__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use you\n * alternate core implementation of symmetric crypto or hash function. Keep in\n * mind that function prototypes should remain the same.\n *\n * This replaces only one function. The header file from mbed TLS is still\n * used, in contrast to the MBEDTLS__MODULE_NAME__ALT flags.\n *\n * Example: In case you uncomment MBEDTLS_SHA256_PROCESS_ALT, mbed TLS will\n * no longer provide the mbedtls_sha1_process() function, but it will still provide\n * the other function (using your mbedtls_sha1_process() function) and the definition\n * of mbedtls_sha1_context, so your implementation of mbedtls_sha1_process must be compatible\n * with this definition.\n *\n * \\note Because of a signature change, the core AES encryption and decryption routines are\n *       currently named mbedtls_aes_internal_encrypt and mbedtls_aes_internal_decrypt,\n *       respectively. When setting up alternative implementations, these functions should\n *       be overriden, but the wrapper functions mbedtls_aes_decrypt and mbedtls_aes_encrypt\n *       must stay untouched.\n *\n * \\note If you use the AES_xxx_ALT macros, then is is recommended to also set\n *       MBEDTLS_AES_ROM_TABLES in order to help the linker garbage-collect the AES\n *       tables.\n *\n * Uncomment a macro to enable alternate implementation of the corresponding\n * function.\n */\n//#define MBEDTLS_MD2_PROCESS_ALT\n//#define MBEDTLS_MD4_PROCESS_ALT\n//#define MBEDTLS_MD5_PROCESS_ALT\n//#define MBEDTLS_RIPEMD160_PROCESS_ALT\n//#define MBEDTLS_SHA1_PROCESS_ALT\n//#define MBEDTLS_SHA256_PROCESS_ALT\n//#define MBEDTLS_SHA512_PROCESS_ALT\n//#define MBEDTLS_DES_SETKEY_ALT\n//#define MBEDTLS_DES_CRYPT_ECB_ALT\n//#define MBEDTLS_DES3_CRYPT_ECB_ALT\n//#define MBEDTLS_AES_SETKEY_ENC_ALT\n//#define MBEDTLS_AES_SETKEY_DEC_ALT\n//#define MBEDTLS_AES_ENCRYPT_ALT\n//#define MBEDTLS_AES_DECRYPT_ALT\n\n/**\n * \\def MBEDTLS_ECP_INTERNAL_ALT\n *\n * Expose a part of the internal interface of the Elliptic Curve Point module.\n *\n * MBEDTLS_ECP__FUNCTION_NAME__ALT: Uncomment a macro to let mbed TLS use your\n * alternative core implementation of elliptic curve arithmetic. Keep in mind\n * that function prototypes should remain the same.\n *\n * This partially replaces one function. The header file from mbed TLS is still\n * used, in contrast to the MBEDTLS_ECP_ALT flag. The original implementation\n * is still present and it is used for group structures not supported by the\n * alternative.\n *\n * Any of these options become available by defining MBEDTLS_ECP_INTERNAL_ALT\n * and implementing the following functions:\n *      unsigned char mbedtls_internal_ecp_grp_capable(\n *          const mbedtls_ecp_group *grp )\n *      int  mbedtls_internal_ecp_init( const mbedtls_ecp_group *grp )\n *      void mbedtls_internal_ecp_deinit( const mbedtls_ecp_group *grp )\n * The mbedtls_internal_ecp_grp_capable function should return 1 if the\n * replacement functions implement arithmetic for the given group and 0\n * otherwise.\n * The functions mbedtls_internal_ecp_init and mbedtls_internal_ecp_deinit are\n * called before and after each point operation and provide an opportunity to\n * implement optimized set up and tear down instructions.\n *\n * Example: In case you uncomment MBEDTLS_ECP_INTERNAL_ALT and\n * MBEDTLS_ECP_DOUBLE_JAC_ALT, mbed TLS will still provide the ecp_double_jac\n * function, but will use your mbedtls_internal_ecp_double_jac if the group is\n * supported (your mbedtls_internal_ecp_grp_capable function returns 1 when\n * receives it as an argument). If the group is not supported then the original\n * implementation is used. The other functions and the definition of\n * mbedtls_ecp_group and mbedtls_ecp_point will not change, so your\n * implementation of mbedtls_internal_ecp_double_jac and\n * mbedtls_internal_ecp_grp_capable must be compatible with this definition.\n *\n * Uncomment a macro to enable alternate implementation of the corresponding\n * function.\n */\n/* Required for all the functions in this section */\n//#define MBEDTLS_ECP_INTERNAL_ALT\n/* Support for Weierstrass curves with Jacobi representation */\n//#define MBEDTLS_ECP_RANDOMIZE_JAC_ALT\n//#define MBEDTLS_ECP_ADD_MIXED_ALT\n//#define MBEDTLS_ECP_DOUBLE_JAC_ALT\n//#define MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT\n//#define MBEDTLS_ECP_NORMALIZE_JAC_ALT\n/* Support for curves with Montgomery arithmetic */\n//#define MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT\n//#define MBEDTLS_ECP_RANDOMIZE_MXZ_ALT\n//#define MBEDTLS_ECP_NORMALIZE_MXZ_ALT\n\n/**\n * \\def MBEDTLS_TEST_NULL_ENTROPY\n *\n * Enables testing and use of mbed TLS without any configured entropy sources.\n * This permits use of the library on platforms before an entropy source has\n * been integrated (see for example the MBEDTLS_ENTROPY_HARDWARE_ALT or the\n * MBEDTLS_ENTROPY_NV_SEED switches).\n *\n * WARNING! This switch MUST be disabled in production builds, and is suitable\n * only for development.\n * Enabling the switch negates any security provided by the library.\n *\n * Requires MBEDTLS_ENTROPY_C, MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES\n *\n */\n//#define MBEDTLS_TEST_NULL_ENTROPY\n\n/**\n * \\def MBEDTLS_ENTROPY_HARDWARE_ALT\n *\n * Uncomment this macro to let mbed TLS use your own implementation of a\n * hardware entropy collector.\n *\n * Your function must be called \\c mbedtls_hardware_poll(), have the same\n * prototype as declared in entropy_poll.h, and accept NULL as first argument.\n *\n * Uncomment to use your own hardware entropy collector.\n */\n//#define MBEDTLS_ENTROPY_HARDWARE_ALT\n\n/**\n * \\def MBEDTLS_AES_ROM_TABLES\n *\n * Store the AES tables in ROM.\n *\n * Uncomment this macro to store the AES tables in ROM.\n */\n//#define MBEDTLS_AES_ROM_TABLES\n\n/**\n * \\def MBEDTLS_CAMELLIA_SMALL_MEMORY\n *\n * Use less ROM for the Camellia implementation (saves about 768 bytes).\n *\n * Uncomment this macro to use less memory for Camellia.\n */\n//#define MBEDTLS_CAMELLIA_SMALL_MEMORY\n\n/**\n * \\def MBEDTLS_CIPHER_MODE_CBC\n *\n * Enable Cipher Block Chaining mode (CBC) for symmetric ciphers.\n */\n#define MBEDTLS_CIPHER_MODE_CBC\n\n/**\n * \\def MBEDTLS_CIPHER_MODE_CFB\n *\n * Enable Cipher Feedback mode (CFB) for symmetric ciphers.\n */\n#define MBEDTLS_CIPHER_MODE_CFB\n\n/**\n * \\def MBEDTLS_CIPHER_MODE_CTR\n *\n * Enable Counter Block Cipher mode (CTR) for symmetric ciphers.\n */\n#define MBEDTLS_CIPHER_MODE_CTR\n\n/**\n * \\def MBEDTLS_CIPHER_NULL_CIPHER\n *\n * Enable NULL cipher.\n * Warning: Only do so when you know what you are doing. This allows for\n * encryption or channels without any security!\n *\n * Requires MBEDTLS_ENABLE_WEAK_CIPHERSUITES as well to enable\n * the following ciphersuites:\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA\n *      MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384\n *      MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256\n *      MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA\n *      MBEDTLS_TLS_RSA_WITH_NULL_SHA256\n *      MBEDTLS_TLS_RSA_WITH_NULL_SHA\n *      MBEDTLS_TLS_RSA_WITH_NULL_MD5\n *      MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384\n *      MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256\n *      MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA\n *      MBEDTLS_TLS_PSK_WITH_NULL_SHA384\n *      MBEDTLS_TLS_PSK_WITH_NULL_SHA256\n *      MBEDTLS_TLS_PSK_WITH_NULL_SHA\n *\n * Uncomment this macro to enable the NULL cipher and ciphersuites\n */\n//#define MBEDTLS_CIPHER_NULL_CIPHER\n\n/**\n * \\def MBEDTLS_CIPHER_PADDING_PKCS7\n *\n * MBEDTLS_CIPHER_PADDING_XXX: Uncomment or comment macros to add support for\n * specific padding modes in the cipher layer with cipher modes that support\n * padding (e.g. CBC)\n *\n * If you disable all padding modes, only full blocks can be used with CBC.\n *\n * Enable padding modes in the cipher layer.\n */\n#define MBEDTLS_CIPHER_PADDING_PKCS7\n#define MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS\n#define MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN\n#define MBEDTLS_CIPHER_PADDING_ZEROS\n\n/**\n * \\def MBEDTLS_ENABLE_WEAK_CIPHERSUITES\n *\n * Enable weak ciphersuites in SSL / TLS.\n * Warning: Only do so when you know what you are doing. This allows for\n * channels with virtually no security at all!\n *\n * This enables the following ciphersuites:\n *      MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA\n *      MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA\n *\n * Uncomment this macro to enable weak ciphersuites\n */\n//#define MBEDTLS_ENABLE_WEAK_CIPHERSUITES\n\n/**\n * \\def MBEDTLS_REMOVE_ARC4_CIPHERSUITES\n *\n * Remove RC4 ciphersuites by default in SSL / TLS.\n * This flag removes the ciphersuites based on RC4 from the default list as\n * returned by mbedtls_ssl_list_ciphersuites(). However, it is still possible to\n * enable (some of) them with mbedtls_ssl_conf_ciphersuites() by including them\n * explicitly.\n *\n * Uncomment this macro to remove RC4 ciphersuites by default.\n */\n#define MBEDTLS_REMOVE_ARC4_CIPHERSUITES\n\n/**\n * \\def MBEDTLS_ECP_DP_SECP192R1_ENABLED\n *\n * MBEDTLS_ECP_XXXX_ENABLED: Enables specific curves within the Elliptic Curve\n * module.  By default all supported curves are enabled.\n *\n * Comment macros to disable the curve and functions for it\n */\n#define MBEDTLS_ECP_DP_SECP192R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP224R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP256R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP384R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP521R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP192K1_ENABLED\n#define MBEDTLS_ECP_DP_SECP224K1_ENABLED\n#define MBEDTLS_ECP_DP_SECP256K1_ENABLED\n#define MBEDTLS_ECP_DP_BP256R1_ENABLED\n#define MBEDTLS_ECP_DP_BP384R1_ENABLED\n#define MBEDTLS_ECP_DP_BP512R1_ENABLED\n#define MBEDTLS_ECP_DP_CURVE25519_ENABLED\n\n/**\n * \\def MBEDTLS_ECP_NIST_OPTIM\n *\n * Enable specific 'modulo p' routines for each NIST prime.\n * Depending on the prime and architecture, makes operations 4 to 8 times\n * faster on the corresponding curve.\n *\n * Comment this macro to disable NIST curves optimisation.\n */\n#define MBEDTLS_ECP_NIST_OPTIM\n\n/**\n * \\def MBEDTLS_ECDSA_DETERMINISTIC\n *\n * Enable deterministic ECDSA (RFC 6979).\n * Standard ECDSA is \"fragile\" in the sense that lack of entropy when signing\n * may result in a compromise of the long-term signing key. This is avoided by\n * the deterministic variant.\n *\n * Requires: MBEDTLS_HMAC_DRBG_C\n *\n * Comment this macro to disable deterministic ECDSA.\n */\n#define MBEDTLS_ECDSA_DETERMINISTIC\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_PSK_ENABLED\n *\n * Enable the PSK based ciphersuite modes in SSL / TLS.\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_PSK_WITH_RC4_128_SHA\n */\n#define MBEDTLS_KEY_EXCHANGE_PSK_ENABLED\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED\n *\n * Enable the DHE-PSK based ciphersuite modes in SSL / TLS.\n *\n * Requires: MBEDTLS_DHM_C\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA\n */\n#define MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED\n *\n * Enable the ECDHE-PSK based ciphersuite modes in SSL / TLS.\n *\n * Requires: MBEDTLS_ECDH_C\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA\n */\n#define MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED\n *\n * Enable the RSA-PSK based ciphersuite modes in SSL / TLS.\n *\n * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15,\n *           MBEDTLS_X509_CRT_PARSE_C\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA\n */\n#define MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_RSA_ENABLED\n *\n * Enable the RSA-only based ciphersuite modes in SSL / TLS.\n *\n * Requires: MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15,\n *           MBEDTLS_X509_CRT_PARSE_C\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256\n *      MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA\n *      MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA\n *      MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_RSA_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_RSA_WITH_RC4_128_MD5\n */\n#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED\n *\n * Enable the DHE-RSA based ciphersuite modes in SSL / TLS.\n *\n * Requires: MBEDTLS_DHM_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15,\n *           MBEDTLS_X509_CRT_PARSE_C\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA\n *      MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA\n */\n#define MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED\n *\n * Enable the ECDHE-RSA based ciphersuite modes in SSL / TLS.\n *\n * Requires: MBEDTLS_ECDH_C, MBEDTLS_RSA_C, MBEDTLS_PKCS1_V15,\n *           MBEDTLS_X509_CRT_PARSE_C\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA\n */\n#define MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED\n *\n * Enable the ECDHE-ECDSA based ciphersuite modes in SSL / TLS.\n *\n * Requires: MBEDTLS_ECDH_C, MBEDTLS_ECDSA_C, MBEDTLS_X509_CRT_PARSE_C,\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA\n */\n#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED\n *\n * Enable the ECDH-ECDSA based ciphersuite modes in SSL / TLS.\n *\n * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384\n */\n#define MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED\n *\n * Enable the ECDH-RSA based ciphersuite modes in SSL / TLS.\n *\n * Requires: MBEDTLS_ECDH_C, MBEDTLS_X509_CRT_PARSE_C\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384\n */\n#define MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED\n\n/**\n * \\def MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED\n *\n * Enable the ECJPAKE based ciphersuite modes in SSL / TLS.\n *\n * \\warning This is currently experimental. EC J-PAKE support is based on the\n * Thread v1.0.0 specification; incompatible changes to the specification\n * might still happen. For this reason, this is disabled by default.\n *\n * Requires: MBEDTLS_ECJPAKE_C\n *           MBEDTLS_SHA256_C\n *           MBEDTLS_ECP_DP_SECP256R1_ENABLED\n *\n * This enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8\n */\n//#define MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED\n\n/**\n * \\def MBEDTLS_PK_PARSE_EC_EXTENDED\n *\n * Enhance support for reading EC keys using variants of SEC1 not allowed by\n * RFC 5915 and RFC 5480.\n *\n * Currently this means parsing the SpecifiedECDomain choice of EC\n * parameters (only known groups are supported, not arbitrary domains, to\n * avoid validation issues).\n *\n * Disable if you only need to support RFC 5915 + 5480 key formats.\n */\n#define MBEDTLS_PK_PARSE_EC_EXTENDED\n\n/**\n * \\def MBEDTLS_ERROR_STRERROR_DUMMY\n *\n * Enable a dummy error function to make use of mbedtls_strerror() in\n * third party libraries easier when MBEDTLS_ERROR_C is disabled\n * (no effect when MBEDTLS_ERROR_C is enabled).\n *\n * You can safely disable this if MBEDTLS_ERROR_C is enabled, or if you're\n * not using mbedtls_strerror() or error_strerror() in your application.\n *\n * Disable if you run into name conflicts and want to really remove the\n * mbedtls_strerror()\n */\n#define MBEDTLS_ERROR_STRERROR_DUMMY\n\n/**\n * \\def MBEDTLS_GENPRIME\n *\n * Enable the prime-number generation code.\n *\n * Requires: MBEDTLS_BIGNUM_C\n */\n#define MBEDTLS_GENPRIME\n\n/**\n * \\def MBEDTLS_FS_IO\n *\n * Enable functions that use the filesystem.\n */\n#define MBEDTLS_FS_IO\n\n/**\n * \\def MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES\n *\n * Do not add default entropy sources. These are the platform specific,\n * mbedtls_timing_hardclock and HAVEGE based poll functions.\n *\n * This is useful to have more control over the added entropy sources in an\n * application.\n *\n * Uncomment this macro to prevent loading of default entropy functions.\n */\n//#define MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES\n\n/**\n * \\def MBEDTLS_NO_PLATFORM_ENTROPY\n *\n * Do not use built-in platform entropy functions.\n * This is useful if your platform does not support\n * standards like the /dev/urandom or Windows CryptoAPI.\n *\n * Uncomment this macro to disable the built-in platform entropy functions.\n */\n//#define MBEDTLS_NO_PLATFORM_ENTROPY\n\n/**\n * \\def MBEDTLS_ENTROPY_FORCE_SHA256\n *\n * Force the entropy accumulator to use a SHA-256 accumulator instead of the\n * default SHA-512 based one (if both are available).\n *\n * Requires: MBEDTLS_SHA256_C\n *\n * On 32-bit systems SHA-256 can be much faster than SHA-512. Use this option\n * if you have performance concerns.\n *\n * This option is only useful if both MBEDTLS_SHA256_C and\n * MBEDTLS_SHA512_C are defined. Otherwise the available hash module is used.\n */\n//#define MBEDTLS_ENTROPY_FORCE_SHA256\n\n/**\n * \\def MBEDTLS_ENTROPY_NV_SEED\n *\n * Enable the non-volatile (NV) seed file-based entropy source.\n * (Also enables the NV seed read/write functions in the platform layer)\n *\n * This is crucial (if not required) on systems that do not have a\n * cryptographic entropy source (in hardware or kernel) available.\n *\n * Requires: MBEDTLS_ENTROPY_C, MBEDTLS_PLATFORM_C\n *\n * \\note The read/write functions that are used by the entropy source are\n *       determined in the platform layer, and can be modified at runtime and/or\n *       compile-time depending on the flags (MBEDTLS_PLATFORM_NV_SEED_*) used.\n *\n * \\note If you use the default implementation functions that read a seedfile\n *       with regular fopen(), please make sure you make a seedfile with the\n *       proper name (defined in MBEDTLS_PLATFORM_STD_NV_SEED_FILE) and at\n *       least MBEDTLS_ENTROPY_BLOCK_SIZE bytes in size that can be read from\n *       and written to or you will get an entropy source error! The default\n *       implementation will only use the first MBEDTLS_ENTROPY_BLOCK_SIZE\n *       bytes from the file.\n *\n * \\note The entropy collector will write to the seed file before entropy is\n *       given to an external source, to update it.\n */\n//#define MBEDTLS_ENTROPY_NV_SEED\n\n/**\n * \\def MBEDTLS_MEMORY_DEBUG\n *\n * Enable debugging of buffer allocator memory issues. Automatically prints\n * (to stderr) all (fatal) messages on memory allocation issues. Enables\n * function for 'debug output' of allocated memory.\n *\n * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C\n *\n * Uncomment this macro to let the buffer allocator print out error messages.\n */\n//#define MBEDTLS_MEMORY_DEBUG\n\n/**\n * \\def MBEDTLS_MEMORY_BACKTRACE\n *\n * Include backtrace information with each allocated block.\n *\n * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C\n *           GLIBC-compatible backtrace() an backtrace_symbols() support\n *\n * Uncomment this macro to include backtrace information\n */\n//#define MBEDTLS_MEMORY_BACKTRACE\n\n/**\n * \\def MBEDTLS_PK_RSA_ALT_SUPPORT\n *\n * Support external private RSA keys (eg from a HSM) in the PK layer.\n *\n * Comment this macro to disable support for external private RSA keys.\n */\n#define MBEDTLS_PK_RSA_ALT_SUPPORT\n\n/**\n * \\def MBEDTLS_PKCS1_V15\n *\n * Enable support for PKCS#1 v1.5 encoding.\n *\n * Requires: MBEDTLS_RSA_C\n *\n * This enables support for PKCS#1 v1.5 operations.\n */\n#define MBEDTLS_PKCS1_V15\n\n/**\n * \\def MBEDTLS_PKCS1_V21\n *\n * Enable support for PKCS#1 v2.1 encoding.\n *\n * Requires: MBEDTLS_MD_C, MBEDTLS_RSA_C\n *\n * This enables support for RSAES-OAEP and RSASSA-PSS operations.\n */\n#define MBEDTLS_PKCS1_V21\n\n/**\n * \\def MBEDTLS_RSA_NO_CRT\n *\n * Do not use the Chinese Remainder Theorem for the RSA private operation.\n *\n * Uncomment this macro to disable the use of CRT in RSA.\n *\n */\n//#define MBEDTLS_RSA_NO_CRT\n\n/**\n * \\def MBEDTLS_SELF_TEST\n *\n * Enable the checkup functions (*_self_test).\n */\n#define MBEDTLS_SELF_TEST\n\n/**\n * \\def MBEDTLS_SHA256_SMALLER\n *\n * Enable an implementation of SHA-256 that has lower ROM footprint but also\n * lower performance.\n *\n * The default implementation is meant to be a reasonnable compromise between\n * performance and size. This version optimizes more aggressively for size at\n * the expense of performance. Eg on Cortex-M4 it reduces the size of\n * mbedtls_sha256_process() from ~2KB to ~0.5KB for a performance hit of about\n * 30%.\n *\n * Uncomment to enable the smaller implementation of SHA256.\n */\n//#define MBEDTLS_SHA256_SMALLER\n\n/**\n * \\def MBEDTLS_SSL_ALL_ALERT_MESSAGES\n *\n * Enable sending of alert messages in case of encountered errors as per RFC.\n * If you choose not to send the alert messages, mbed TLS can still communicate\n * with other servers, only debugging of failures is harder.\n *\n * The advantage of not sending alert messages, is that no information is given\n * about reasons for failures thus preventing adversaries of gaining intel.\n *\n * Enable sending of all alert messages\n */\n#define MBEDTLS_SSL_ALL_ALERT_MESSAGES\n\n/**\n * \\def MBEDTLS_SSL_DEBUG_ALL\n *\n * Enable the debug messages in SSL module for all issues.\n * Debug messages have been disabled in some places to prevent timing\n * attacks due to (unbalanced) debugging function calls.\n *\n * If you need all error reporting you should enable this during debugging,\n * but remove this for production servers that should log as well.\n *\n * Uncomment this macro to report all debug messages on errors introducing\n * a timing side-channel.\n *\n */\n//#define MBEDTLS_SSL_DEBUG_ALL\n\n/** \\def MBEDTLS_SSL_ENCRYPT_THEN_MAC\n *\n * Enable support for Encrypt-then-MAC, RFC 7366.\n *\n * This allows peers that both support it to use a more robust protection for\n * ciphersuites using CBC, providing deep resistance against timing attacks\n * on the padding or underlying cipher.\n *\n * This only affects CBC ciphersuites, and is useless if none is defined.\n *\n * Requires: MBEDTLS_SSL_PROTO_TLS1    or\n *           MBEDTLS_SSL_PROTO_TLS1_1  or\n *           MBEDTLS_SSL_PROTO_TLS1_2\n *\n * Comment this macro to disable support for Encrypt-then-MAC\n */\n#define MBEDTLS_SSL_ENCRYPT_THEN_MAC\n\n/** \\def MBEDTLS_SSL_EXTENDED_MASTER_SECRET\n *\n * Enable support for Extended Master Secret, aka Session Hash\n * (draft-ietf-tls-session-hash-02).\n *\n * This was introduced as \"the proper fix\" to the Triple Handshake familiy of\n * attacks, but it is recommended to always use it (even if you disable\n * renegotiation), since it actually fixes a more fundamental issue in the\n * original SSL/TLS design, and has implications beyond Triple Handshake.\n *\n * Requires: MBEDTLS_SSL_PROTO_TLS1    or\n *           MBEDTLS_SSL_PROTO_TLS1_1  or\n *           MBEDTLS_SSL_PROTO_TLS1_2\n *\n * Comment this macro to disable support for Extended Master Secret.\n */\n#define MBEDTLS_SSL_EXTENDED_MASTER_SECRET\n\n/**\n * \\def MBEDTLS_SSL_FALLBACK_SCSV\n *\n * Enable support for FALLBACK_SCSV (draft-ietf-tls-downgrade-scsv-00).\n *\n * For servers, it is recommended to always enable this, unless you support\n * only one version of TLS, or know for sure that none of your clients\n * implements a fallback strategy.\n *\n * For clients, you only need this if you're using a fallback strategy, which\n * is not recommended in the first place, unless you absolutely need it to\n * interoperate with buggy (version-intolerant) servers.\n *\n * Comment this macro to disable support for FALLBACK_SCSV\n */\n#define MBEDTLS_SSL_FALLBACK_SCSV\n\n/**\n * \\def MBEDTLS_SSL_HW_RECORD_ACCEL\n *\n * Enable hooking functions in SSL module for hardware acceleration of\n * individual records.\n *\n * Uncomment this macro to enable hooking functions.\n */\n//#define MBEDTLS_SSL_HW_RECORD_ACCEL\n\n/**\n * \\def MBEDTLS_SSL_CBC_RECORD_SPLITTING\n *\n * Enable 1/n-1 record splitting for CBC mode in SSLv3 and TLS 1.0.\n *\n * This is a countermeasure to the BEAST attack, which also minimizes the risk\n * of interoperability issues compared to sending 0-length records.\n *\n * Comment this macro to disable 1/n-1 record splitting.\n */\n#define MBEDTLS_SSL_CBC_RECORD_SPLITTING\n\n/**\n * \\def MBEDTLS_SSL_RENEGOTIATION\n *\n * Disable support for TLS renegotiation.\n *\n * The two main uses of renegotiation are (1) refresh keys on long-lived\n * connections and (2) client authentication after the initial handshake.\n * If you don't need renegotiation, it's probably better to disable it, since\n * it has been associated with security issues in the past and is easy to\n * misuse/misunderstand.\n *\n * Comment this to disable support for renegotiation.\n */\n#define MBEDTLS_SSL_RENEGOTIATION\n\n/**\n * \\def MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO\n *\n * Enable support for receiving and parsing SSLv2 Client Hello messages for the\n * SSL Server module (MBEDTLS_SSL_SRV_C).\n *\n * Uncomment this macro to enable support for SSLv2 Client Hello messages.\n */\n//#define MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO\n\n/**\n * \\def MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE\n *\n * Pick the ciphersuite according to the client's preferences rather than ours\n * in the SSL Server module (MBEDTLS_SSL_SRV_C).\n *\n * Uncomment this macro to respect client's ciphersuite order\n */\n//#define MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE\n\n/**\n * \\def MBEDTLS_SSL_MAX_FRAGMENT_LENGTH\n *\n * Enable support for RFC 6066 max_fragment_length extension in SSL.\n *\n * Comment this macro to disable support for the max_fragment_length extension\n */\n#define MBEDTLS_SSL_MAX_FRAGMENT_LENGTH\n\n/**\n * \\def MBEDTLS_SSL_PROTO_SSL3\n *\n * Enable support for SSL 3.0.\n *\n * Requires: MBEDTLS_MD5_C\n *           MBEDTLS_SHA1_C\n *\n * Comment this macro to disable support for SSL 3.0\n */\n//#define MBEDTLS_SSL_PROTO_SSL3\n\n/**\n * \\def MBEDTLS_SSL_PROTO_TLS1\n *\n * Enable support for TLS 1.0.\n *\n * Requires: MBEDTLS_MD5_C\n *           MBEDTLS_SHA1_C\n *\n * Comment this macro to disable support for TLS 1.0\n */\n#define MBEDTLS_SSL_PROTO_TLS1\n\n/**\n * \\def MBEDTLS_SSL_PROTO_TLS1_1\n *\n * Enable support for TLS 1.1 (and DTLS 1.0 if DTLS is enabled).\n *\n * Requires: MBEDTLS_MD5_C\n *           MBEDTLS_SHA1_C\n *\n * Comment this macro to disable support for TLS 1.1 / DTLS 1.0\n */\n#define MBEDTLS_SSL_PROTO_TLS1_1\n\n/**\n * \\def MBEDTLS_SSL_PROTO_TLS1_2\n *\n * Enable support for TLS 1.2 (and DTLS 1.2 if DTLS is enabled).\n *\n * Requires: MBEDTLS_SHA1_C or MBEDTLS_SHA256_C or MBEDTLS_SHA512_C\n *           (Depends on ciphersuites)\n *\n * Comment this macro to disable support for TLS 1.2 / DTLS 1.2\n */\n#define MBEDTLS_SSL_PROTO_TLS1_2\n\n/**\n * \\def MBEDTLS_SSL_PROTO_DTLS\n *\n * Enable support for DTLS (all available versions).\n *\n * Enable this and MBEDTLS_SSL_PROTO_TLS1_1 to enable DTLS 1.0,\n * and/or this and MBEDTLS_SSL_PROTO_TLS1_2 to enable DTLS 1.2.\n *\n * Requires: MBEDTLS_SSL_PROTO_TLS1_1\n *        or MBEDTLS_SSL_PROTO_TLS1_2\n *\n * Comment this macro to disable support for DTLS\n */\n#define MBEDTLS_SSL_PROTO_DTLS\n\n/**\n * \\def MBEDTLS_SSL_ALPN\n *\n * Enable support for RFC 7301 Application Layer Protocol Negotiation.\n *\n * Comment this macro to disable support for ALPN.\n */\n#define MBEDTLS_SSL_ALPN\n\n/**\n * \\def MBEDTLS_SSL_DTLS_ANTI_REPLAY\n *\n * Enable support for the anti-replay mechanism in DTLS.\n *\n * Requires: MBEDTLS_SSL_TLS_C\n *           MBEDTLS_SSL_PROTO_DTLS\n *\n * \\warning Disabling this is often a security risk!\n * See mbedtls_ssl_conf_dtls_anti_replay() for details.\n *\n * Comment this to disable anti-replay in DTLS.\n */\n#define MBEDTLS_SSL_DTLS_ANTI_REPLAY\n\n/**\n * \\def MBEDTLS_SSL_DTLS_HELLO_VERIFY\n *\n * Enable support for HelloVerifyRequest on DTLS servers.\n *\n * This feature is highly recommended to prevent DTLS servers being used as\n * amplifiers in DoS attacks against other hosts. It should always be enabled\n * unless you know for sure amplification cannot be a problem in the\n * environment in which your server operates.\n *\n * \\warning Disabling this can ba a security risk! (see above)\n *\n * Requires: MBEDTLS_SSL_PROTO_DTLS\n *\n * Comment this to disable support for HelloVerifyRequest.\n */\n#define MBEDTLS_SSL_DTLS_HELLO_VERIFY\n\n/**\n * \\def MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE\n *\n * Enable server-side support for clients that reconnect from the same port.\n *\n * Some clients unexpectedly close the connection and try to reconnect using the\n * same source port. This needs special support from the server to handle the\n * new connection securely, as described in section 4.2.8 of RFC 6347. This\n * flag enables that support.\n *\n * Requires: MBEDTLS_SSL_DTLS_HELLO_VERIFY\n *\n * Comment this to disable support for clients reusing the source port.\n */\n#define MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE\n\n/**\n * \\def MBEDTLS_SSL_DTLS_BADMAC_LIMIT\n *\n * Enable support for a limit of records with bad MAC.\n *\n * See mbedtls_ssl_conf_dtls_badmac_limit().\n *\n * Requires: MBEDTLS_SSL_PROTO_DTLS\n */\n#define MBEDTLS_SSL_DTLS_BADMAC_LIMIT\n\n/**\n * \\def MBEDTLS_SSL_SESSION_TICKETS\n *\n * Enable support for RFC 5077 session tickets in SSL.\n * Client-side, provides full support for session tickets (maintainance of a\n * session store remains the responsibility of the application, though).\n * Server-side, you also need to provide callbacks for writing and parsing\n * tickets, including authenticated encryption and key management. Example\n * callbacks are provided by MBEDTLS_SSL_TICKET_C.\n *\n * Comment this macro to disable support for SSL session tickets\n */\n#define MBEDTLS_SSL_SESSION_TICKETS\n\n/**\n * \\def MBEDTLS_SSL_EXPORT_KEYS\n *\n * Enable support for exporting key block and master secret.\n * This is required for certain users of TLS, e.g. EAP-TLS.\n *\n * Comment this macro to disable support for key export\n */\n#define MBEDTLS_SSL_EXPORT_KEYS\n\n/**\n * \\def MBEDTLS_SSL_SERVER_NAME_INDICATION\n *\n * Enable support for RFC 6066 server name indication (SNI) in SSL.\n *\n * Requires: MBEDTLS_X509_CRT_PARSE_C\n *\n * Comment this macro to disable support for server name indication in SSL\n */\n#define MBEDTLS_SSL_SERVER_NAME_INDICATION\n\n/**\n * \\def MBEDTLS_SSL_TRUNCATED_HMAC\n *\n * Enable support for RFC 6066 truncated HMAC in SSL.\n *\n * Comment this macro to disable support for truncated HMAC in SSL\n */\n#define MBEDTLS_SSL_TRUNCATED_HMAC\n\n/**\n * \\def MBEDTLS_THREADING_ALT\n *\n * Provide your own alternate threading implementation.\n *\n * Requires: MBEDTLS_THREADING_C\n *\n * Uncomment this to allow your own alternate threading implementation.\n */\n//#define MBEDTLS_THREADING_ALT\n\n/**\n * \\def MBEDTLS_THREADING_PTHREAD\n *\n * Enable the pthread wrapper layer for the threading layer.\n *\n * Requires: MBEDTLS_THREADING_C\n *\n * Uncomment this to enable pthread mutexes.\n */\n//#define MBEDTLS_THREADING_PTHREAD\n\n/**\n * \\def MBEDTLS_VERSION_FEATURES\n *\n * Allow run-time checking of compile-time enabled features. Thus allowing users\n * to check at run-time if the library is for instance compiled with threading\n * support via mbedtls_version_check_feature().\n *\n * Requires: MBEDTLS_VERSION_C\n *\n * Comment this to disable run-time checking and save ROM space\n */\n#define MBEDTLS_VERSION_FEATURES\n\n/**\n * \\def MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3\n *\n * If set, the X509 parser will not break-off when parsing an X509 certificate\n * and encountering an extension in a v1 or v2 certificate.\n *\n * Uncomment to prevent an error.\n */\n//#define MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3\n\n/**\n * \\def MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION\n *\n * If set, the X509 parser will not break-off when parsing an X509 certificate\n * and encountering an unknown critical extension.\n *\n * \\warning Depending on your PKI use, enabling this can be a security risk!\n *\n * Uncomment to prevent an error.\n */\n//#define MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION\n\n/**\n * \\def MBEDTLS_X509_CHECK_KEY_USAGE\n *\n * Enable verification of the keyUsage extension (CA and leaf certificates).\n *\n * Disabling this avoids problems with mis-issued and/or misused\n * (intermediate) CA and leaf certificates.\n *\n * \\warning Depending on your PKI use, disabling this can be a security risk!\n *\n * Comment to skip keyUsage checking for both CA and leaf certificates.\n */\n#define MBEDTLS_X509_CHECK_KEY_USAGE\n\n/**\n * \\def MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE\n *\n * Enable verification of the extendedKeyUsage extension (leaf certificates).\n *\n * Disabling this avoids problems with mis-issued and/or misused certificates.\n *\n * \\warning Depending on your PKI use, disabling this can be a security risk!\n *\n * Comment to skip extendedKeyUsage checking for certificates.\n */\n#define MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE\n\n/**\n * \\def MBEDTLS_X509_RSASSA_PSS_SUPPORT\n *\n * Enable parsing and verification of X.509 certificates, CRLs and CSRS\n * signed with RSASSA-PSS (aka PKCS#1 v2.1).\n *\n * Comment this macro to disallow using RSASSA-PSS in certificates.\n */\n#define MBEDTLS_X509_RSASSA_PSS_SUPPORT\n\n/**\n * \\def MBEDTLS_ZLIB_SUPPORT\n *\n * If set, the SSL/TLS module uses ZLIB to support compression and\n * decompression of packet data.\n *\n * \\warning TLS-level compression MAY REDUCE SECURITY! See for example the\n * CRIME attack. Before enabling this option, you should examine with care if\n * CRIME or similar exploits may be a applicable to your use case.\n *\n * \\note Currently compression can't be used with DTLS.\n *\n * Used in: library/ssl_tls.c\n *          library/ssl_cli.c\n *          library/ssl_srv.c\n *\n * This feature requires zlib library and headers to be present.\n *\n * Uncomment to enable use of ZLIB\n */\n//#define MBEDTLS_ZLIB_SUPPORT\n/* \\} name SECTION: mbed TLS feature support */\n\n/**\n * \\name SECTION: mbed TLS modules\n *\n * This section enables or disables entire modules in mbed TLS\n * \\{\n */\n\n/**\n * \\def MBEDTLS_AESNI_C\n *\n * Enable AES-NI support on x86-64.\n *\n * Module:  library/aesni.c\n * Caller:  library/aes.c\n *\n * Requires: MBEDTLS_HAVE_ASM\n *\n * This modules adds support for the AES-NI instructions on x86-64\n */\n#define MBEDTLS_AESNI_C\n\n/**\n * \\def MBEDTLS_AES_C\n *\n * Enable the AES block cipher.\n *\n * Module:  library/aes.c\n * Caller:  library/ssl_tls.c\n *          library/pem.c\n *          library/ctr_drbg.c\n *\n * This module enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256\n *      MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA\n *      MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384\n *      MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384\n *      MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA\n *      MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256\n *      MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256\n *      MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA\n *\n * PEM_PARSE uses AES for decrypting encrypted keys.\n */\n#define MBEDTLS_AES_C\n\n/**\n * \\def MBEDTLS_ARC4_C\n *\n * Enable the ARCFOUR stream cipher.\n *\n * Module:  library/arc4.c\n * Caller:  library/ssl_tls.c\n *\n * This module enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_RSA_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_RSA_WITH_RC4_128_MD5\n *      MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA\n *      MBEDTLS_TLS_PSK_WITH_RC4_128_SHA\n */\n#define MBEDTLS_ARC4_C\n\n/**\n * \\def MBEDTLS_ASN1_PARSE_C\n *\n * Enable the generic ASN1 parser.\n *\n * Module:  library/asn1.c\n * Caller:  library/x509.c\n *          library/dhm.c\n *          library/pkcs12.c\n *          library/pkcs5.c\n *          library/pkparse.c\n */\n#define MBEDTLS_ASN1_PARSE_C\n\n/**\n * \\def MBEDTLS_ASN1_WRITE_C\n *\n * Enable the generic ASN1 writer.\n *\n * Module:  library/asn1write.c\n * Caller:  library/ecdsa.c\n *          library/pkwrite.c\n *          library/x509_create.c\n *          library/x509write_crt.c\n *          library/x509write_csr.c\n */\n#define MBEDTLS_ASN1_WRITE_C\n\n/**\n * \\def MBEDTLS_BASE64_C\n *\n * Enable the Base64 module.\n *\n * Module:  library/base64.c\n * Caller:  library/pem.c\n *\n * This module is required for PEM support (required by X.509).\n */\n#define MBEDTLS_BASE64_C\n\n/**\n * \\def MBEDTLS_BIGNUM_C\n *\n * Enable the multi-precision integer library.\n *\n * Module:  library/bignum.c\n * Caller:  library/dhm.c\n *          library/ecp.c\n *          library/ecdsa.c\n *          library/rsa.c\n *          library/ssl_tls.c\n *\n * This module is required for RSA, DHM and ECC (ECDH, ECDSA) support.\n */\n#define MBEDTLS_BIGNUM_C\n\n/**\n * \\def MBEDTLS_BLOWFISH_C\n *\n * Enable the Blowfish block cipher.\n *\n * Module:  library/blowfish.c\n */\n#define MBEDTLS_BLOWFISH_C\n\n/**\n * \\def MBEDTLS_CAMELLIA_C\n *\n * Enable the Camellia block cipher.\n *\n * Module:  library/camellia.c\n * Caller:  library/ssl_tls.c\n *\n * This module enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA\n *      MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256\n *      MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384\n *      MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384\n *      MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256\n *      MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256\n */\n#define MBEDTLS_CAMELLIA_C\n\n/**\n * \\def MBEDTLS_CCM_C\n *\n * Enable the Counter with CBC-MAC (CCM) mode for 128-bit block cipher.\n *\n * Module:  library/ccm.c\n *\n * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C\n *\n * This module enables the AES-CCM ciphersuites, if other requisites are\n * enabled as well.\n */\n#define MBEDTLS_CCM_C\n\n/**\n * \\def MBEDTLS_CERTS_C\n *\n * Enable the test certificates.\n *\n * Module:  library/certs.c\n * Caller:\n *\n * This module is used for testing (ssl_client/server).\n */\n#define MBEDTLS_CERTS_C\n\n/**\n * \\def MBEDTLS_CIPHER_C\n *\n * Enable the generic cipher layer.\n *\n * Module:  library/cipher.c\n * Caller:  library/ssl_tls.c\n *\n * Uncomment to enable generic cipher wrappers.\n */\n#define MBEDTLS_CIPHER_C\n\n/**\n * \\def MBEDTLS_CMAC_C\n *\n * Enable the CMAC (Cipher-based Message Authentication Code) mode for block\n * ciphers.\n *\n * Module:  library/cmac.c\n *\n * Requires: MBEDTLS_AES_C or MBEDTLS_DES_C\n *\n */\n//#define MBEDTLS_CMAC_C\n\n/**\n * \\def MBEDTLS_CTR_DRBG_C\n *\n * Enable the CTR_DRBG AES-256-based random generator.\n *\n * Module:  library/ctr_drbg.c\n * Caller:\n *\n * Requires: MBEDTLS_AES_C\n *\n * This module provides the CTR_DRBG AES-256 random number generator.\n */\n#define MBEDTLS_CTR_DRBG_C\n\n/**\n * \\def MBEDTLS_DEBUG_C\n *\n * Enable the debug functions.\n *\n * Module:  library/debug.c\n * Caller:  library/ssl_cli.c\n *          library/ssl_srv.c\n *          library/ssl_tls.c\n *\n * This module provides debugging functions.\n */\n#define MBEDTLS_DEBUG_C\n\n/**\n * \\def MBEDTLS_DES_C\n *\n * Enable the DES block cipher.\n *\n * Module:  library/des.c\n * Caller:  library/pem.c\n *          library/ssl_tls.c\n *\n * This module enables the following ciphersuites (if other requisites are\n * enabled as well):\n *      MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA\n *      MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA\n *\n * PEM_PARSE uses DES/3DES for decrypting encrypted keys.\n */\n#define MBEDTLS_DES_C\n\n/**\n * \\def MBEDTLS_DHM_C\n *\n * Enable the Diffie-Hellman-Merkle module.\n *\n * Module:  library/dhm.c\n * Caller:  library/ssl_cli.c\n *          library/ssl_srv.c\n *\n * This module is used by the following key exchanges:\n *      DHE-RSA, DHE-PSK\n */\n#define MBEDTLS_DHM_C\n\n/**\n * \\def MBEDTLS_ECDH_C\n *\n * Enable the elliptic curve Diffie-Hellman library.\n *\n * Module:  library/ecdh.c\n * Caller:  library/ssl_cli.c\n *          library/ssl_srv.c\n *\n * This module is used by the following key exchanges:\n *      ECDHE-ECDSA, ECDHE-RSA, DHE-PSK\n *\n * Requires: MBEDTLS_ECP_C\n */\n#define MBEDTLS_ECDH_C\n\n/**\n * \\def MBEDTLS_ECDSA_C\n *\n * Enable the elliptic curve DSA library.\n *\n * Module:  library/ecdsa.c\n * Caller:\n *\n * This module is used by the following key exchanges:\n *      ECDHE-ECDSA\n *\n * Requires: MBEDTLS_ECP_C, MBEDTLS_ASN1_WRITE_C, MBEDTLS_ASN1_PARSE_C\n */\n#define MBEDTLS_ECDSA_C\n\n/**\n * \\def MBEDTLS_ECJPAKE_C\n *\n * Enable the elliptic curve J-PAKE library.\n *\n * \\warning This is currently experimental. EC J-PAKE support is based on the\n * Thread v1.0.0 specification; incompatible changes to the specification\n * might still happen. For this reason, this is disabled by default.\n *\n * Module:  library/ecjpake.c\n * Caller:\n *\n * This module is used by the following key exchanges:\n *      ECJPAKE\n *\n * Requires: MBEDTLS_ECP_C, MBEDTLS_MD_C\n */\n//#define MBEDTLS_ECJPAKE_C\n\n/**\n * \\def MBEDTLS_ECP_C\n *\n * Enable the elliptic curve over GF(p) library.\n *\n * Module:  library/ecp.c\n * Caller:  library/ecdh.c\n *          library/ecdsa.c\n *          library/ecjpake.c\n *\n * Requires: MBEDTLS_BIGNUM_C and at least one MBEDTLS_ECP_DP_XXX_ENABLED\n */\n#define MBEDTLS_ECP_C\n\n/**\n * \\def MBEDTLS_ENTROPY_C\n *\n * Enable the platform-specific entropy code.\n *\n * Module:  library/entropy.c\n * Caller:\n *\n * Requires: MBEDTLS_SHA512_C or MBEDTLS_SHA256_C\n *\n * This module provides a generic entropy pool\n */\n#define MBEDTLS_ENTROPY_C\n\n/**\n * \\def MBEDTLS_ERROR_C\n *\n * Enable error code to error string conversion.\n *\n * Module:  library/error.c\n * Caller:\n *\n * This module enables mbedtls_strerror().\n */\n#define MBEDTLS_ERROR_C\n\n/**\n * \\def MBEDTLS_GCM_C\n *\n * Enable the Galois/Counter Mode (GCM) for AES.\n *\n * Module:  library/gcm.c\n *\n * Requires: MBEDTLS_AES_C or MBEDTLS_CAMELLIA_C\n *\n * This module enables the AES-GCM and CAMELLIA-GCM ciphersuites, if other\n * requisites are enabled as well.\n */\n#define MBEDTLS_GCM_C\n\n/**\n * \\def MBEDTLS_HAVEGE_C\n *\n * Enable the HAVEGE random generator.\n *\n * Warning: the HAVEGE random generator is not suitable for virtualized\n *          environments\n *\n * Warning: the HAVEGE random generator is dependent on timing and specific\n *          processor traits. It is therefore not advised to use HAVEGE as\n *          your applications primary random generator or primary entropy pool\n *          input. As a secondary input to your entropy pool, it IS able add\n *          the (limited) extra entropy it provides.\n *\n * Module:  library/havege.c\n * Caller:\n *\n * Requires: MBEDTLS_TIMING_C\n *\n * Uncomment to enable the HAVEGE random generator.\n */\n//#define MBEDTLS_HAVEGE_C\n\n/**\n * \\def MBEDTLS_HMAC_DRBG_C\n *\n * Enable the HMAC_DRBG random generator.\n *\n * Module:  library/hmac_drbg.c\n * Caller:\n *\n * Requires: MBEDTLS_MD_C\n *\n * Uncomment to enable the HMAC_DRBG random number geerator.\n */\n#define MBEDTLS_HMAC_DRBG_C\n\n/**\n * \\def MBEDTLS_MD_C\n *\n * Enable the generic message digest layer.\n *\n * Module:  library/md.c\n * Caller:\n *\n * Uncomment to enable generic message digest wrappers.\n */\n#define MBEDTLS_MD_C\n\n/**\n * \\def MBEDTLS_MD2_C\n *\n * Enable the MD2 hash algorithm.\n *\n * Module:  library/md2.c\n * Caller:\n *\n * Uncomment to enable support for (rare) MD2-signed X.509 certs.\n */\n//#define MBEDTLS_MD2_C\n\n/**\n * \\def MBEDTLS_MD4_C\n *\n * Enable the MD4 hash algorithm.\n *\n * Module:  library/md4.c\n * Caller:\n *\n * Uncomment to enable support for (rare) MD4-signed X.509 certs.\n */\n//#define MBEDTLS_MD4_C\n\n/**\n * \\def MBEDTLS_MD5_C\n *\n * Enable the MD5 hash algorithm.\n *\n * Module:  library/md5.c\n * Caller:  library/md.c\n *          library/pem.c\n *          library/ssl_tls.c\n *\n * This module is required for SSL/TLS and X.509.\n * PEM_PARSE uses MD5 for decrypting encrypted keys.\n */\n#define MBEDTLS_MD5_C\n\n/**\n * \\def MBEDTLS_MEMORY_BUFFER_ALLOC_C\n *\n * Enable the buffer allocator implementation that makes use of a (stack)\n * based buffer to 'allocate' dynamic memory. (replaces calloc() and free()\n * calls)\n *\n * Module:  library/memory_buffer_alloc.c\n *\n * Requires: MBEDTLS_PLATFORM_C\n *           MBEDTLS_PLATFORM_MEMORY (to use it within mbed TLS)\n *\n * Enable this module to enable the buffer memory allocator.\n */\n//#define MBEDTLS_MEMORY_BUFFER_ALLOC_C\n\n/**\n * \\def MBEDTLS_NET_C\n *\n * Enable the TCP and UDP over IPv6/IPv4 networking routines.\n *\n * \\note This module only works on POSIX/Unix (including Linux, BSD and OS X)\n * and Windows. For other platforms, you'll want to disable it, and write your\n * own networking callbacks to be passed to \\c mbedtls_ssl_set_bio().\n *\n * \\note See also our Knowledge Base article about porting to a new\n * environment:\n * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS\n *\n * Module:  library/net_sockets.c\n *\n * This module provides networking routines.\n */\n#define MBEDTLS_NET_C\n\n/**\n * \\def MBEDTLS_OID_C\n *\n * Enable the OID database.\n *\n * Module:  library/oid.c\n * Caller:  library/asn1write.c\n *          library/pkcs5.c\n *          library/pkparse.c\n *          library/pkwrite.c\n *          library/rsa.c\n *          library/x509.c\n *          library/x509_create.c\n *          library/x509_crl.c\n *          library/x509_crt.c\n *          library/x509_csr.c\n *          library/x509write_crt.c\n *          library/x509write_csr.c\n *\n * This modules translates between OIDs and internal values.\n */\n#define MBEDTLS_OID_C\n\n/**\n * \\def MBEDTLS_PADLOCK_C\n *\n * Enable VIA Padlock support on x86.\n *\n * Module:  library/padlock.c\n * Caller:  library/aes.c\n *\n * Requires: MBEDTLS_HAVE_ASM\n *\n * This modules adds support for the VIA PadLock on x86.\n */\n#define MBEDTLS_PADLOCK_C\n\n/**\n * \\def MBEDTLS_PEM_PARSE_C\n *\n * Enable PEM decoding / parsing.\n *\n * Module:  library/pem.c\n * Caller:  library/dhm.c\n *          library/pkparse.c\n *          library/x509_crl.c\n *          library/x509_crt.c\n *          library/x509_csr.c\n *\n * Requires: MBEDTLS_BASE64_C\n *\n * This modules adds support for decoding / parsing PEM files.\n */\n#define MBEDTLS_PEM_PARSE_C\n\n/**\n * \\def MBEDTLS_PEM_WRITE_C\n *\n * Enable PEM encoding / writing.\n *\n * Module:  library/pem.c\n * Caller:  library/pkwrite.c\n *          library/x509write_crt.c\n *          library/x509write_csr.c\n *\n * Requires: MBEDTLS_BASE64_C\n *\n * This modules adds support for encoding / writing PEM files.\n */\n#define MBEDTLS_PEM_WRITE_C\n\n/**\n * \\def MBEDTLS_PK_C\n *\n * Enable the generic public (asymetric) key layer.\n *\n * Module:  library/pk.c\n * Caller:  library/ssl_tls.c\n *          library/ssl_cli.c\n *          library/ssl_srv.c\n *\n * Requires: MBEDTLS_RSA_C or MBEDTLS_ECP_C\n *\n * Uncomment to enable generic public key wrappers.\n */\n#define MBEDTLS_PK_C\n\n/**\n * \\def MBEDTLS_PK_PARSE_C\n *\n * Enable the generic public (asymetric) key parser.\n *\n * Module:  library/pkparse.c\n * Caller:  library/x509_crt.c\n *          library/x509_csr.c\n *\n * Requires: MBEDTLS_PK_C\n *\n * Uncomment to enable generic public key parse functions.\n */\n#define MBEDTLS_PK_PARSE_C\n\n/**\n * \\def MBEDTLS_PK_WRITE_C\n *\n * Enable the generic public (asymetric) key writer.\n *\n * Module:  library/pkwrite.c\n * Caller:  library/x509write.c\n *\n * Requires: MBEDTLS_PK_C\n *\n * Uncomment to enable generic public key write functions.\n */\n#define MBEDTLS_PK_WRITE_C\n\n/**\n * \\def MBEDTLS_PKCS5_C\n *\n * Enable PKCS#5 functions.\n *\n * Module:  library/pkcs5.c\n *\n * Requires: MBEDTLS_MD_C\n *\n * This module adds support for the PKCS#5 functions.\n */\n#define MBEDTLS_PKCS5_C\n\n/**\n * \\def MBEDTLS_PKCS11_C\n *\n * Enable wrapper for PKCS#11 smartcard support.\n *\n * Module:  library/pkcs11.c\n * Caller:  library/pk.c\n *\n * Requires: MBEDTLS_PK_C\n *\n * This module enables SSL/TLS PKCS #11 smartcard support.\n * Requires the presence of the PKCS#11 helper library (libpkcs11-helper)\n */\n//#define MBEDTLS_PKCS11_C\n\n/**\n * \\def MBEDTLS_PKCS12_C\n *\n * Enable PKCS#12 PBE functions.\n * Adds algorithms for parsing PKCS#8 encrypted private keys\n *\n * Module:  library/pkcs12.c\n * Caller:  library/pkparse.c\n *\n * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_CIPHER_C, MBEDTLS_MD_C\n * Can use:  MBEDTLS_ARC4_C\n *\n * This module enables PKCS#12 functions.\n */\n#define MBEDTLS_PKCS12_C\n\n/**\n * \\def MBEDTLS_PLATFORM_C\n *\n * Enable the platform abstraction layer that allows you to re-assign\n * functions like calloc(), free(), snprintf(), printf(), fprintf(), exit().\n *\n * Enabling MBEDTLS_PLATFORM_C enables to use of MBEDTLS_PLATFORM_XXX_ALT\n * or MBEDTLS_PLATFORM_XXX_MACRO directives, allowing the functions mentioned\n * above to be specified at runtime or compile time respectively.\n *\n * \\note This abstraction layer must be enabled on Windows (including MSYS2)\n * as other module rely on it for a fixed snprintf implementation.\n *\n * Module:  library/platform.c\n * Caller:  Most other .c files\n *\n * This module enables abstraction of common (libc) functions.\n */\n#define MBEDTLS_PLATFORM_C\n\n/**\n * \\def MBEDTLS_RIPEMD160_C\n *\n * Enable the RIPEMD-160 hash algorithm.\n *\n * Module:  library/ripemd160.c\n * Caller:  library/md.c\n *\n */\n#define MBEDTLS_RIPEMD160_C\n\n/**\n * \\def MBEDTLS_RSA_C\n *\n * Enable the RSA public-key cryptosystem.\n *\n * Module:  library/rsa.c\n * Caller:  library/ssl_cli.c\n *          library/ssl_srv.c\n *          library/ssl_tls.c\n *          library/x509.c\n *\n * This module is used by the following key exchanges:\n *      RSA, DHE-RSA, ECDHE-RSA, RSA-PSK\n *\n * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C\n */\n#define MBEDTLS_RSA_C\n\n/**\n * \\def MBEDTLS_SHA1_C\n *\n * Enable the SHA1 cryptographic hash algorithm.\n *\n * Module:  library/sha1.c\n * Caller:  library/md.c\n *          library/ssl_cli.c\n *          library/ssl_srv.c\n *          library/ssl_tls.c\n *          library/x509write_crt.c\n *\n * This module is required for SSL/TLS up to version 1.1, for TLS 1.2\n * depending on the handshake parameters, and for SHA1-signed certificates.\n */\n#define MBEDTLS_SHA1_C\n\n/**\n * \\def MBEDTLS_SHA256_C\n *\n * Enable the SHA-224 and SHA-256 cryptographic hash algorithms.\n *\n * Module:  library/sha256.c\n * Caller:  library/entropy.c\n *          library/md.c\n *          library/ssl_cli.c\n *          library/ssl_srv.c\n *          library/ssl_tls.c\n *\n * This module adds support for SHA-224 and SHA-256.\n * This module is required for the SSL/TLS 1.2 PRF function.\n */\n#define MBEDTLS_SHA256_C\n\n/**\n * \\def MBEDTLS_SHA512_C\n *\n * Enable the SHA-384 and SHA-512 cryptographic hash algorithms.\n *\n * Module:  library/sha512.c\n * Caller:  library/entropy.c\n *          library/md.c\n *          library/ssl_cli.c\n *          library/ssl_srv.c\n *\n * This module adds support for SHA-384 and SHA-512.\n */\n#define MBEDTLS_SHA512_C\n\n/**\n * \\def MBEDTLS_SSL_CACHE_C\n *\n * Enable simple SSL cache implementation.\n *\n * Module:  library/ssl_cache.c\n * Caller:\n *\n * Requires: MBEDTLS_SSL_CACHE_C\n */\n#define MBEDTLS_SSL_CACHE_C\n\n/**\n * \\def MBEDTLS_SSL_COOKIE_C\n *\n * Enable basic implementation of DTLS cookies for hello verification.\n *\n * Module:  library/ssl_cookie.c\n * Caller:\n */\n#define MBEDTLS_SSL_COOKIE_C\n\n/**\n * \\def MBEDTLS_SSL_TICKET_C\n *\n * Enable an implementation of TLS server-side callbacks for session tickets.\n *\n * Module:  library/ssl_ticket.c\n * Caller:\n *\n * Requires: MBEDTLS_CIPHER_C\n */\n#define MBEDTLS_SSL_TICKET_C\n\n/**\n * \\def MBEDTLS_SSL_CLI_C\n *\n * Enable the SSL/TLS client code.\n *\n * Module:  library/ssl_cli.c\n * Caller:\n *\n * Requires: MBEDTLS_SSL_TLS_C\n *\n * This module is required for SSL/TLS client support.\n */\n#define MBEDTLS_SSL_CLI_C\n\n/**\n * \\def MBEDTLS_SSL_SRV_C\n *\n * Enable the SSL/TLS server code.\n *\n * Module:  library/ssl_srv.c\n * Caller:\n *\n * Requires: MBEDTLS_SSL_TLS_C\n *\n * This module is required for SSL/TLS server support.\n */\n#define MBEDTLS_SSL_SRV_C\n\n/**\n * \\def MBEDTLS_SSL_TLS_C\n *\n * Enable the generic SSL/TLS code.\n *\n * Module:  library/ssl_tls.c\n * Caller:  library/ssl_cli.c\n *          library/ssl_srv.c\n *\n * Requires: MBEDTLS_CIPHER_C, MBEDTLS_MD_C\n *           and at least one of the MBEDTLS_SSL_PROTO_XXX defines\n *\n * This module is required for SSL/TLS.\n */\n#define MBEDTLS_SSL_TLS_C\n\n/**\n * \\def MBEDTLS_THREADING_C\n *\n * Enable the threading abstraction layer.\n * By default mbed TLS assumes it is used in a non-threaded environment or that\n * contexts are not shared between threads. If you do intend to use contexts\n * between threads, you will need to enable this layer to prevent race\n * conditions. See also our Knowledge Base article about threading:\n * https://tls.mbed.org/kb/development/thread-safety-and-multi-threading\n *\n * Module:  library/threading.c\n *\n * This allows different threading implementations (self-implemented or\n * provided).\n *\n * You will have to enable either MBEDTLS_THREADING_ALT or\n * MBEDTLS_THREADING_PTHREAD.\n *\n * Enable this layer to allow use of mutexes within mbed TLS\n */\n//#define MBEDTLS_THREADING_C\n\n/**\n * \\def MBEDTLS_TIMING_C\n *\n * Enable the semi-portable timing interface.\n *\n * \\note The provided implementation only works on POSIX/Unix (including Linux,\n * BSD and OS X) and Windows. On other platforms, you can either disable that\n * module and provide your own implementations of the callbacks needed by\n * \\c mbedtls_ssl_set_timer_cb() for DTLS, or leave it enabled and provide\n * your own implementation of the whole module by setting\n * \\c MBEDTLS_TIMING_ALT in the current file.\n *\n * \\note See also our Knowledge Base article about porting to a new\n * environment:\n * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS\n *\n * Module:  library/timing.c\n * Caller:  library/havege.c\n *\n * This module is used by the HAVEGE random number generator.\n */\n#define MBEDTLS_TIMING_C\n\n/**\n * \\def MBEDTLS_VERSION_C\n *\n * Enable run-time version information.\n *\n * Module:  library/version.c\n *\n * This module provides run-time version information.\n */\n#define MBEDTLS_VERSION_C\n\n/**\n * \\def MBEDTLS_X509_USE_C\n *\n * Enable X.509 core for using certificates.\n *\n * Module:  library/x509.c\n * Caller:  library/x509_crl.c\n *          library/x509_crt.c\n *          library/x509_csr.c\n *\n * Requires: MBEDTLS_ASN1_PARSE_C, MBEDTLS_BIGNUM_C, MBEDTLS_OID_C,\n *           MBEDTLS_PK_PARSE_C\n *\n * This module is required for the X.509 parsing modules.\n */\n#define MBEDTLS_X509_USE_C\n\n/**\n * \\def MBEDTLS_X509_CRT_PARSE_C\n *\n * Enable X.509 certificate parsing.\n *\n * Module:  library/x509_crt.c\n * Caller:  library/ssl_cli.c\n *          library/ssl_srv.c\n *          library/ssl_tls.c\n *\n * Requires: MBEDTLS_X509_USE_C\n *\n * This module is required for X.509 certificate parsing.\n */\n#define MBEDTLS_X509_CRT_PARSE_C\n\n/**\n * \\def MBEDTLS_X509_CRL_PARSE_C\n *\n * Enable X.509 CRL parsing.\n *\n * Module:  library/x509_crl.c\n * Caller:  library/x509_crt.c\n *\n * Requires: MBEDTLS_X509_USE_C\n *\n * This module is required for X.509 CRL parsing.\n */\n#define MBEDTLS_X509_CRL_PARSE_C\n\n/**\n * \\def MBEDTLS_X509_CSR_PARSE_C\n *\n * Enable X.509 Certificate Signing Request (CSR) parsing.\n *\n * Module:  library/x509_csr.c\n * Caller:  library/x509_crt_write.c\n *\n * Requires: MBEDTLS_X509_USE_C\n *\n * This module is used for reading X.509 certificate request.\n */\n#define MBEDTLS_X509_CSR_PARSE_C\n\n/**\n * \\def MBEDTLS_X509_CREATE_C\n *\n * Enable X.509 core for creating certificates.\n *\n * Module:  library/x509_create.c\n *\n * Requires: MBEDTLS_BIGNUM_C, MBEDTLS_OID_C, MBEDTLS_PK_WRITE_C\n *\n * This module is the basis for creating X.509 certificates and CSRs.\n */\n#define MBEDTLS_X509_CREATE_C\n\n/**\n * \\def MBEDTLS_X509_CRT_WRITE_C\n *\n * Enable creating X.509 certificates.\n *\n * Module:  library/x509_crt_write.c\n *\n * Requires: MBEDTLS_X509_CREATE_C\n *\n * This module is required for X.509 certificate creation.\n */\n#define MBEDTLS_X509_CRT_WRITE_C\n\n/**\n * \\def MBEDTLS_X509_CSR_WRITE_C\n *\n * Enable creating X.509 Certificate Signing Requests (CSR).\n *\n * Module:  library/x509_csr_write.c\n *\n * Requires: MBEDTLS_X509_CREATE_C\n *\n * This module is required for X.509 certificate request writing.\n */\n#define MBEDTLS_X509_CSR_WRITE_C\n\n/**\n * \\def MBEDTLS_XTEA_C\n *\n * Enable the XTEA block cipher.\n *\n * Module:  library/xtea.c\n * Caller:\n */\n#define MBEDTLS_XTEA_C\n\n/* \\} name SECTION: mbed TLS modules */\n\n/**\n * \\name SECTION: Module configuration options\n *\n * This section allows for the setting of module specific sizes and\n * configuration options. The default values are already present in the\n * relevant header files and should suffice for the regular use cases.\n *\n * Our advice is to enable options and change their values here\n * only if you have a good reason and know the consequences.\n *\n * Please check the respective header file for documentation on these\n * parameters (to prevent duplicate documentation).\n * \\{\n */\n\n/* MPI / BIGNUM options */\n//#define MBEDTLS_MPI_WINDOW_SIZE            6 /**< Maximum windows size used. */\n//#define MBEDTLS_MPI_MAX_SIZE            1024 /**< Maximum number of bytes for usable MPIs. */\n\n/* CTR_DRBG options */\n//#define MBEDTLS_CTR_DRBG_ENTROPY_LEN               48 /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */\n//#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL        10000 /**< Interval before reseed is performed by default */\n//#define MBEDTLS_CTR_DRBG_MAX_INPUT                256 /**< Maximum number of additional input bytes */\n//#define MBEDTLS_CTR_DRBG_MAX_REQUEST             1024 /**< Maximum number of requested bytes per call */\n//#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT           384 /**< Maximum size of (re)seed buffer */\n\n/* HMAC_DRBG options */\n//#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL   10000 /**< Interval before reseed is performed by default */\n//#define MBEDTLS_HMAC_DRBG_MAX_INPUT           256 /**< Maximum number of additional input bytes */\n//#define MBEDTLS_HMAC_DRBG_MAX_REQUEST        1024 /**< Maximum number of requested bytes per call */\n//#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT      384 /**< Maximum size of (re)seed buffer */\n\n/* ECP options */\n//#define MBEDTLS_ECP_MAX_BITS             521 /**< Maximum bit size of groups */\n//#define MBEDTLS_ECP_WINDOW_SIZE            6 /**< Maximum window size used */\n//#define MBEDTLS_ECP_FIXED_POINT_OPTIM      1 /**< Enable fixed-point speed-up */\n\n/* Entropy options */\n//#define MBEDTLS_ENTROPY_MAX_SOURCES                20 /**< Maximum number of sources supported */\n//#define MBEDTLS_ENTROPY_MAX_GATHER                128 /**< Maximum amount requested from entropy sources */\n//#define MBEDTLS_ENTROPY_MIN_HARDWARE               32 /**< Default minimum number of bytes required for the hardware entropy source mbedtls_hardware_poll() before entropy is released */\n\n/* Memory buffer allocator options */\n//#define MBEDTLS_MEMORY_ALIGN_MULTIPLE      4 /**< Align on multiples of this value */\n\n/* Platform options */\n//#define MBEDTLS_PLATFORM_STD_MEM_HDR   <stdlib.h> /**< Header to include if MBEDTLS_PLATFORM_NO_STD_FUNCTIONS is defined. Don't define if no header is needed. */\n//#define MBEDTLS_PLATFORM_STD_CALLOC        calloc /**< Default allocator to use, can be undefined */\n//#define MBEDTLS_PLATFORM_STD_FREE            free /**< Default free to use, can be undefined */\n//#define MBEDTLS_PLATFORM_STD_EXIT            exit /**< Default exit to use, can be undefined */\n//#define MBEDTLS_PLATFORM_STD_TIME            time /**< Default time to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */\n//#define MBEDTLS_PLATFORM_STD_FPRINTF      fprintf /**< Default fprintf to use, can be undefined */\n//#define MBEDTLS_PLATFORM_STD_PRINTF        printf /**< Default printf to use, can be undefined */\n/* Note: your snprintf must correclty zero-terminate the buffer! */\n//#define MBEDTLS_PLATFORM_STD_SNPRINTF    snprintf /**< Default snprintf to use, can be undefined */\n//#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS       0 /**< Default exit value to use, can be undefined */\n//#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE       1 /**< Default exit value to use, can be undefined */\n//#define MBEDTLS_PLATFORM_STD_NV_SEED_READ   mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */\n//#define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE  mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */\n//#define MBEDTLS_PLATFORM_STD_NV_SEED_FILE  \"seedfile\" /**< Seed file to read/write with default implementation */\n\n/* To Use Function Macros MBEDTLS_PLATFORM_C must be enabled */\n/* MBEDTLS_PLATFORM_XXX_MACRO and MBEDTLS_PLATFORM_XXX_ALT cannot both be defined */\n//#define MBEDTLS_PLATFORM_CALLOC_MACRO        calloc /**< Default allocator macro to use, can be undefined */\n//#define MBEDTLS_PLATFORM_FREE_MACRO            free /**< Default free macro to use, can be undefined */\n//#define MBEDTLS_PLATFORM_EXIT_MACRO            exit /**< Default exit macro to use, can be undefined */\n//#define MBEDTLS_PLATFORM_TIME_MACRO            time /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */\n//#define MBEDTLS_PLATFORM_TIME_TYPE_MACRO       time_t /**< Default time macro to use, can be undefined. MBEDTLS_HAVE_TIME must be enabled */\n//#define MBEDTLS_PLATFORM_FPRINTF_MACRO      fprintf /**< Default fprintf macro to use, can be undefined */\n//#define MBEDTLS_PLATFORM_PRINTF_MACRO        printf /**< Default printf macro to use, can be undefined */\n/* Note: your snprintf must correclty zero-terminate the buffer! */\n//#define MBEDTLS_PLATFORM_SNPRINTF_MACRO    snprintf /**< Default snprintf macro to use, can be undefined */\n//#define MBEDTLS_PLATFORM_NV_SEED_READ_MACRO   mbedtls_platform_std_nv_seed_read /**< Default nv_seed_read function to use, can be undefined */\n//#define MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO  mbedtls_platform_std_nv_seed_write /**< Default nv_seed_write function to use, can be undefined */\n\n/* SSL Cache options */\n//#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT       86400 /**< 1 day  */\n//#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES      50 /**< Maximum entries in cache */\n\n/* SSL options */\n//#define MBEDTLS_SSL_MAX_CONTENT_LEN             16384 /**< Maxium fragment length in bytes, determines the size of each of the two internal I/O buffers */\n//#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME     86400 /**< Lifetime of session tickets (if enabled) */\n//#define MBEDTLS_PSK_MAX_LEN               32 /**< Max size of TLS pre-shared keys, in bytes (default 256 bits) */\n//#define MBEDTLS_SSL_COOKIE_TIMEOUT        60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */\n\n/**\n * Complete list of ciphersuites to use, in order of preference.\n *\n * \\warning No dependency checking is done on that field! This option can only\n * be used to restrict the set of available ciphersuites. It is your\n * responsibility to make sure the needed modules are active.\n *\n * Use this to save a few hundred bytes of ROM (default ordering of all\n * available ciphersuites) and a few to a few hundred bytes of RAM.\n *\n * The value below is only an example, not the default.\n */\n//#define MBEDTLS_SSL_CIPHERSUITES MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\n\n/* X509 options */\n//#define MBEDTLS_X509_MAX_INTERMEDIATE_CA   8   /**< Maximum number of intermediate CAs in a verification chain. */\n//#define MBEDTLS_X509_MAX_FILE_PATH_LEN     512 /**< Maximum length of a path/filename string in bytes including the null terminator character ('\\0'). */\n\n/**\n * Allow SHA-1 in the default TLS configuration for certificate signing.\n * Without this build-time option, SHA-1 support must be activated explicitly\n * through mbedtls_ssl_conf_cert_profile. Turning on this option is not\n * recommended because of it is possible to generte SHA-1 collisions, however\n * this may be safe for legacy infrastructure where additional controls apply.\n */\n// #define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES\n\n/**\n * Allow SHA-1 in the default TLS configuration for TLS 1.2 handshake\n * signature and ciphersuite selection. Without this build-time option, SHA-1\n * support must be activated explicitly through mbedtls_ssl_conf_sig_hashes.\n * The use of SHA-1 in TLS <= 1.1 and in HMAC-SHA-1 is always allowed by\n * default. At the time of writing, there is no practical attack on the use\n * of SHA-1 in handshake signatures, hence this option is turned on by default\n * for compatibility with existing peers.\n */\n#define MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE\n\n/* \\} name SECTION: Customisation configuration options */\n\n/* Target and application specific configurations */\n//#define YOTTA_CFG_MBEDTLS_TARGET_CONFIG_FILE \"mbedtls/target_config.h\"\n\n#if defined(TARGET_LIKE_MBED) && defined(YOTTA_CFG_MBEDTLS_TARGET_CONFIG_FILE)\n#include YOTTA_CFG_MBEDTLS_TARGET_CONFIG_FILE\n#endif\n\n/*\n * Allow user to override any previous default.\n *\n * Use two macro names for that, as:\n * - with yotta the prefix YOTTA_CFG_ is forced\n * - without yotta is looks weird to have a YOTTA prefix.\n */\n#if defined(YOTTA_CFG_MBEDTLS_USER_CONFIG_FILE)\n#include YOTTA_CFG_MBEDTLS_USER_CONFIG_FILE\n#elif defined(MBEDTLS_USER_CONFIG_FILE)\n#include MBEDTLS_USER_CONFIG_FILE\n#endif\n\n#include \"check_config.h\"\n\n#endif /* MBEDTLS_CONFIG_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ctr_drbg.h",
    "content": "/**\n * \\file ctr_drbg.h\n *\n * \\brief CTR_DRBG based on AES-256 (NIST SP 800-90)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_CTR_DRBG_H\n#define MBEDTLS_CTR_DRBG_H\n\n#include \"aes.h\"\n\n#if defined(MBEDTLS_THREADING_C)\n#include \"mbedtls/threading.h\"\n#endif\n\n#define MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED        -0x0034  /**< The entropy source failed. */\n#define MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG              -0x0036  /**< Too many random requested in single call. */\n#define MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG                -0x0038  /**< Input too large (Entropy + additional). */\n#define MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR                -0x003A  /**< Read/write error in file. */\n\n#define MBEDTLS_CTR_DRBG_BLOCKSIZE          16      /**< Block size used by the cipher                  */\n#define MBEDTLS_CTR_DRBG_KEYSIZE            32      /**< Key size used by the cipher                    */\n#define MBEDTLS_CTR_DRBG_KEYBITS            ( MBEDTLS_CTR_DRBG_KEYSIZE * 8 )\n#define MBEDTLS_CTR_DRBG_SEEDLEN            ( MBEDTLS_CTR_DRBG_KEYSIZE + MBEDTLS_CTR_DRBG_BLOCKSIZE )\n                                            /**< The seed length (counter + AES key)            */\n\n/**\n * \\name SECTION: Module settings\n *\n * The configuration options you can set for this module are in this section.\n * Either change them in config.h or define them on the compiler command line.\n * \\{\n */\n\n#if !defined(MBEDTLS_CTR_DRBG_ENTROPY_LEN)\n#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256)\n#define MBEDTLS_CTR_DRBG_ENTROPY_LEN        48      /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */\n#else\n#define MBEDTLS_CTR_DRBG_ENTROPY_LEN        32      /**< Amount of entropy used per seed by default (48 with SHA-512, 32 with SHA-256) */\n#endif\n#endif\n\n#if !defined(MBEDTLS_CTR_DRBG_RESEED_INTERVAL)\n#define MBEDTLS_CTR_DRBG_RESEED_INTERVAL    10000   /**< Interval before reseed is performed by default */\n#endif\n\n#if !defined(MBEDTLS_CTR_DRBG_MAX_INPUT)\n#define MBEDTLS_CTR_DRBG_MAX_INPUT          256     /**< Maximum number of additional input bytes */\n#endif\n\n#if !defined(MBEDTLS_CTR_DRBG_MAX_REQUEST)\n#define MBEDTLS_CTR_DRBG_MAX_REQUEST        1024    /**< Maximum number of requested bytes per call */\n#endif\n\n#if !defined(MBEDTLS_CTR_DRBG_MAX_SEED_INPUT)\n#define MBEDTLS_CTR_DRBG_MAX_SEED_INPUT     384     /**< Maximum size of (re)seed buffer */\n#endif\n\n/* \\} name SECTION: Module settings */\n\n#define MBEDTLS_CTR_DRBG_PR_OFF             0       /**< No prediction resistance       */\n#define MBEDTLS_CTR_DRBG_PR_ON              1       /**< Prediction resistance enabled  */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          CTR_DRBG context structure\n */\ntypedef struct\n{\n    unsigned char counter[16];  /*!<  counter (V)       */\n    int reseed_counter;         /*!<  reseed counter    */\n    int prediction_resistance;  /*!<  enable prediction resistance (Automatic\n                                      reseed before every random generation)  */\n    size_t entropy_len;         /*!<  amount of entropy grabbed on each\n                                      (re)seed          */\n    int reseed_interval;        /*!<  reseed interval   */\n\n    mbedtls_aes_context aes_ctx;        /*!<  AES context       */\n\n    /*\n     * Callbacks (Entropy)\n     */\n    int (*f_entropy)(void *, unsigned char *, size_t);\n\n    void *p_entropy;            /*!<  context for the entropy function */\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_threading_mutex_t mutex;\n#endif\n}\nmbedtls_ctr_drbg_context;\n\n/**\n * \\brief               CTR_DRBG context initialization\n *                      Makes the context ready for mbedtls_ctr_drbg_seed() or\n *                      mbedtls_ctr_drbg_free().\n *\n * \\param ctx           CTR_DRBG context to be initialized\n */\nvoid mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx );\n\n/**\n * \\brief               CTR_DRBG initial seeding\n *                      Seed and setup entropy source for future reseeds.\n *\n * Note: Personalization data can be provided in addition to the more generic\n *       entropy source to make this instantiation as unique as possible.\n *\n * \\param ctx           CTR_DRBG context to be seeded\n * \\param f_entropy     Entropy callback (p_entropy, buffer to fill, buffer\n *                      length)\n * \\param p_entropy     Entropy context\n * \\param custom        Personalization data (Device specific identifiers)\n *                      (Can be NULL)\n * \\param len           Length of personalization data\n *\n * \\return              0 if successful, or\n *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED\n */\nint mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,\n                   int (*f_entropy)(void *, unsigned char *, size_t),\n                   void *p_entropy,\n                   const unsigned char *custom,\n                   size_t len );\n\n/**\n * \\brief               Clear CTR_CRBG context data\n *\n * \\param ctx           CTR_DRBG context to clear\n */\nvoid mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx );\n\n/**\n * \\brief               Enable / disable prediction resistance (Default: Off)\n *\n * Note: If enabled, entropy is used for ctx->entropy_len before each call!\n *       Only use this if you have ample supply of good entropy!\n *\n * \\param ctx           CTR_DRBG context\n * \\param resistance    MBEDTLS_CTR_DRBG_PR_ON or MBEDTLS_CTR_DRBG_PR_OFF\n */\nvoid mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx,\n                                         int resistance );\n\n/**\n * \\brief               Set the amount of entropy grabbed on each (re)seed\n *                      (Default: MBEDTLS_CTR_DRBG_ENTROPY_LEN)\n *\n * \\param ctx           CTR_DRBG context\n * \\param len           Amount of entropy to grab\n */\nvoid mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx,\n                               size_t len );\n\n/**\n * \\brief               Set the reseed interval\n *                      (Default: MBEDTLS_CTR_DRBG_RESEED_INTERVAL)\n *\n * \\param ctx           CTR_DRBG context\n * \\param interval      Reseed interval\n */\nvoid mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx,\n                                   int interval );\n\n/**\n * \\brief               CTR_DRBG reseeding (extracts data from entropy source)\n *\n * \\param ctx           CTR_DRBG context\n * \\param additional    Additional data to add to state (Can be NULL)\n * \\param len           Length of additional data\n *\n * \\return              0 if successful, or\n *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED\n */\nint mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx,\n                     const unsigned char *additional, size_t len );\n\n/**\n * \\brief               CTR_DRBG update state\n *\n * \\param ctx           CTR_DRBG context\n * \\param additional    Additional data to update state with\n * \\param add_len       Length of additional data\n *\n * \\note                If add_len is greater than MBEDTLS_CTR_DRBG_MAX_SEED_INPUT,\n *                      only the first MBEDTLS_CTR_DRBG_MAX_SEED_INPUT bytes are used,\n *                      the remaining ones are silently discarded.\n */\nvoid mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx,\n                      const unsigned char *additional, size_t add_len );\n\n/**\n * \\brief               CTR_DRBG generate random with additional update input\n *\n * Note: Automatically reseeds if reseed_counter is reached.\n *\n * \\param p_rng         CTR_DRBG context\n * \\param output        Buffer to fill\n * \\param output_len    Length of the buffer\n * \\param additional    Additional data to update with (Can be NULL)\n * \\param add_len       Length of additional data\n *\n * \\return              0 if successful, or\n *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED, or\n *                      MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG\n */\nint mbedtls_ctr_drbg_random_with_add( void *p_rng,\n                              unsigned char *output, size_t output_len,\n                              const unsigned char *additional, size_t add_len );\n\n/**\n * \\brief               CTR_DRBG generate random\n *\n * Note: Automatically reseeds if reseed_counter is reached.\n *\n * \\param p_rng         CTR_DRBG context\n * \\param output        Buffer to fill\n * \\param output_len    Length of the buffer\n *\n * \\return              0 if successful, or\n *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED, or\n *                      MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG\n */\nint mbedtls_ctr_drbg_random( void *p_rng,\n                     unsigned char *output, size_t output_len );\n\n#if defined(MBEDTLS_FS_IO)\n/**\n * \\brief               Write a seed file\n *\n * \\param ctx           CTR_DRBG context\n * \\param path          Name of the file\n *\n * \\return              0 if successful,\n *                      MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error, or\n *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED\n */\nint mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path );\n\n/**\n * \\brief               Read and update a seed file. Seed is added to this\n *                      instance\n *\n * \\param ctx           CTR_DRBG context\n * \\param path          Name of the file\n *\n * \\return              0 if successful,\n *                      MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR on file error,\n *                      MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED or\n *                      MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG\n */\nint mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path );\n#endif /* MBEDTLS_FS_IO */\n\n/**\n * \\brief               Checkup routine\n *\n * \\return              0 if successful, or 1 if the test failed\n */\nint mbedtls_ctr_drbg_self_test( int verbose );\n\n/* Internal functions (do not call directly) */\nint mbedtls_ctr_drbg_seed_entropy_len( mbedtls_ctr_drbg_context *,\n                               int (*)(void *, unsigned char *, size_t), void *,\n                               const unsigned char *, size_t, size_t );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ctr_drbg.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/debug.h",
    "content": "/**\n * \\file debug.h\n *\n * \\brief Functions for controlling and providing debug output from the library.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_DEBUG_H\n#define MBEDTLS_DEBUG_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"ssl.h\"\n\n#if defined(MBEDTLS_ECP_C)\n#include \"ecp.h\"\n#endif\n\n#if defined(MBEDTLS_DEBUG_C)\n\n#define MBEDTLS_DEBUG_STRIP_PARENS( ... )   __VA_ARGS__\n\n#define MBEDTLS_SSL_DEBUG_MSG( level, args )                    \\\n    mbedtls_debug_print_msg( ssl, level, __FILE__, __LINE__,    \\\n                             MBEDTLS_DEBUG_STRIP_PARENS args )\n\n#define MBEDTLS_SSL_DEBUG_RET( level, text, ret )                \\\n    mbedtls_debug_print_ret( ssl, level, __FILE__, __LINE__, text, ret )\n\n#define MBEDTLS_SSL_DEBUG_BUF( level, text, buf, len )           \\\n    mbedtls_debug_print_buf( ssl, level, __FILE__, __LINE__, text, buf, len )\n\n#if defined(MBEDTLS_BIGNUM_C)\n#define MBEDTLS_SSL_DEBUG_MPI( level, text, X )                  \\\n    mbedtls_debug_print_mpi( ssl, level, __FILE__, __LINE__, text, X )\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n#define MBEDTLS_SSL_DEBUG_ECP( level, text, X )                  \\\n    mbedtls_debug_print_ecp( ssl, level, __FILE__, __LINE__, text, X )\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n#define MBEDTLS_SSL_DEBUG_CRT( level, text, crt )                \\\n    mbedtls_debug_print_crt( ssl, level, __FILE__, __LINE__, text, crt )\n#endif\n\n#else /* MBEDTLS_DEBUG_C */\n\n#define MBEDTLS_SSL_DEBUG_MSG( level, args )            do { } while( 0 )\n#define MBEDTLS_SSL_DEBUG_RET( level, text, ret )       do { } while( 0 )\n#define MBEDTLS_SSL_DEBUG_BUF( level, text, buf, len )  do { } while( 0 )\n#define MBEDTLS_SSL_DEBUG_MPI( level, text, X )         do { } while( 0 )\n#define MBEDTLS_SSL_DEBUG_ECP( level, text, X )         do { } while( 0 )\n#define MBEDTLS_SSL_DEBUG_CRT( level, text, crt )       do { } while( 0 )\n\n#endif /* MBEDTLS_DEBUG_C */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief   Set the threshold error level to handle globally all debug output.\n *          Debug messages that have a level over the threshold value are\n *          discarded.\n *          (Default value: 0 = No debug )\n *\n * \\param threshold     theshold level of messages to filter on. Messages at a\n *                      higher level will be discarded.\n *                          - Debug levels\n *                              - 0 No debug\n *                              - 1 Error\n *                              - 2 State change\n *                              - 3 Informational\n *                              - 4 Verbose\n */\nvoid mbedtls_debug_set_threshold( int threshold );\n\n/**\n * \\brief    Print a message to the debug output. This function is always used\n *          through the MBEDTLS_SSL_DEBUG_MSG() macro, which supplies the ssl\n *          context, file and line number parameters.\n *\n * \\param ssl       SSL context\n * \\param level     error level of the debug message\n * \\param file      file the message has occurred in\n * \\param line      line number the message has occurred at\n * \\param format    format specifier, in printf format\n * \\param ...       variables used by the format specifier\n *\n * \\attention       This function is intended for INTERNAL usage within the\n *                  library only.\n */\nvoid mbedtls_debug_print_msg( const mbedtls_ssl_context *ssl, int level,\n                              const char *file, int line,\n                              const char *format, ... );\n\n/**\n * \\brief   Print the return value of a function to the debug output. This\n *          function is always used through the MBEDTLS_SSL_DEBUG_RET() macro,\n *          which supplies the ssl context, file and line number parameters.\n *\n * \\param ssl       SSL context\n * \\param level     error level of the debug message\n * \\param file      file the error has occurred in\n * \\param line      line number the error has occurred in\n * \\param text      the name of the function that returned the error\n * \\param ret       the return code value\n *\n * \\attention       This function is intended for INTERNAL usage within the\n *                  library only.\n */\nvoid mbedtls_debug_print_ret( const mbedtls_ssl_context *ssl, int level,\n                      const char *file, int line,\n                      const char *text, int ret );\n\n/**\n * \\brief   Output a buffer of size len bytes to the debug output. This function\n *          is always used through the MBEDTLS_SSL_DEBUG_BUF() macro,\n *          which supplies the ssl context, file and line number parameters.\n *\n * \\param ssl       SSL context\n * \\param level     error level of the debug message\n * \\param file      file the error has occurred in\n * \\param line      line number the error has occurred in\n * \\param text      a name or label for the buffer being dumped. Normally the\n *                  variable or buffer name\n * \\param buf       the buffer to be outputted\n * \\param len       length of the buffer\n *\n * \\attention       This function is intended for INTERNAL usage within the\n *                  library only.\n */\nvoid mbedtls_debug_print_buf( const mbedtls_ssl_context *ssl, int level,\n                      const char *file, int line, const char *text,\n                      const unsigned char *buf, size_t len );\n\n#if defined(MBEDTLS_BIGNUM_C)\n/**\n * \\brief   Print a MPI variable to the debug output. This function is always\n *          used through the MBEDTLS_SSL_DEBUG_MPI() macro, which supplies the\n *          ssl context, file and line number parameters.\n *\n * \\param ssl       SSL context\n * \\param level     error level of the debug message\n * \\param file      file the error has occurred in\n * \\param line      line number the error has occurred in\n * \\param text      a name or label for the MPI being output. Normally the\n *                  variable name\n * \\param X         the MPI variable\n *\n * \\attention       This function is intended for INTERNAL usage within the\n *                  library only.\n */\nvoid mbedtls_debug_print_mpi( const mbedtls_ssl_context *ssl, int level,\n                      const char *file, int line,\n                      const char *text, const mbedtls_mpi *X );\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n/**\n * \\brief   Print an ECP point to the debug output. This function is always\n *          used through the MBEDTLS_SSL_DEBUG_ECP() macro, which supplies the\n *          ssl context, file and line number parameters.\n *\n * \\param ssl       SSL context\n * \\param level     error level of the debug message\n * \\param file      file the error has occurred in\n * \\param line      line number the error has occurred in\n * \\param text      a name or label for the ECP point being output. Normally the\n *                  variable name\n * \\param X         the ECP point\n *\n * \\attention       This function is intended for INTERNAL usage within the\n *                  library only.\n */\nvoid mbedtls_debug_print_ecp( const mbedtls_ssl_context *ssl, int level,\n                      const char *file, int line,\n                      const char *text, const mbedtls_ecp_point *X );\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n/**\n * \\brief   Print a X.509 certificate structure to the debug output. This\n *          function is always used through the MBEDTLS_SSL_DEBUG_CRT() macro,\n *          which supplies the ssl context, file and line number parameters.\n *\n * \\param ssl       SSL context\n * \\param level     error level of the debug message\n * \\param file      file the error has occurred in\n * \\param line      line number the error has occurred in\n * \\param text      a name or label for the certificate being output\n * \\param crt       X.509 certificate structure\n *\n * \\attention       This function is intended for INTERNAL usage within the\n *                  library only.\n */\nvoid mbedtls_debug_print_crt( const mbedtls_ssl_context *ssl, int level,\n                      const char *file, int line,\n                      const char *text, const mbedtls_x509_crt *crt );\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* debug.h */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/des.h",
    "content": "/**\n * \\file des.h\n *\n * \\brief DES block cipher\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_DES_H\n#define MBEDTLS_DES_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#define MBEDTLS_DES_ENCRYPT     1\n#define MBEDTLS_DES_DECRYPT     0\n\n#define MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH              -0x0032  /**< The data input has an invalid length. */\n\n#define MBEDTLS_DES_KEY_SIZE    8\n\n#if !defined(MBEDTLS_DES_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          DES context structure\n */\ntypedef struct\n{\n    uint32_t sk[32];            /*!<  DES subkeys       */\n}\nmbedtls_des_context;\n\n/**\n * \\brief          Triple-DES context structure\n */\ntypedef struct\n{\n    uint32_t sk[96];            /*!<  3DES subkeys      */\n}\nmbedtls_des3_context;\n\n/**\n * \\brief          Initialize DES context\n *\n * \\param ctx      DES context to be initialized\n */\nvoid mbedtls_des_init( mbedtls_des_context *ctx );\n\n/**\n * \\brief          Clear DES context\n *\n * \\param ctx      DES context to be cleared\n */\nvoid mbedtls_des_free( mbedtls_des_context *ctx );\n\n/**\n * \\brief          Initialize Triple-DES context\n *\n * \\param ctx      DES3 context to be initialized\n */\nvoid mbedtls_des3_init( mbedtls_des3_context *ctx );\n\n/**\n * \\brief          Clear Triple-DES context\n *\n * \\param ctx      DES3 context to be cleared\n */\nvoid mbedtls_des3_free( mbedtls_des3_context *ctx );\n\n/**\n * \\brief          Set key parity on the given key to odd.\n *\n *                 DES keys are 56 bits long, but each byte is padded with\n *                 a parity bit to allow verification.\n *\n * \\param key      8-byte secret key\n */\nvoid mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] );\n\n/**\n * \\brief          Check that key parity on the given key is odd.\n *\n *                 DES keys are 56 bits long, but each byte is padded with\n *                 a parity bit to allow verification.\n *\n * \\param key      8-byte secret key\n *\n * \\return         0 is parity was ok, 1 if parity was not correct.\n */\nint mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] );\n\n/**\n * \\brief          Check that key is not a weak or semi-weak DES key\n *\n * \\param key      8-byte secret key\n *\n * \\return         0 if no weak key was found, 1 if a weak key was identified.\n */\nint mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] );\n\n/**\n * \\brief          DES key schedule (56-bit, encryption)\n *\n * \\param ctx      DES context to be initialized\n * \\param key      8-byte secret key\n *\n * \\return         0\n */\nint mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] );\n\n/**\n * \\brief          DES key schedule (56-bit, decryption)\n *\n * \\param ctx      DES context to be initialized\n * \\param key      8-byte secret key\n *\n * \\return         0\n */\nint mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] );\n\n/**\n * \\brief          Triple-DES key schedule (112-bit, encryption)\n *\n * \\param ctx      3DES context to be initialized\n * \\param key      16-byte secret key\n *\n * \\return         0\n */\nint mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx,\n                      const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] );\n\n/**\n * \\brief          Triple-DES key schedule (112-bit, decryption)\n *\n * \\param ctx      3DES context to be initialized\n * \\param key      16-byte secret key\n *\n * \\return         0\n */\nint mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx,\n                      const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] );\n\n/**\n * \\brief          Triple-DES key schedule (168-bit, encryption)\n *\n * \\param ctx      3DES context to be initialized\n * \\param key      24-byte secret key\n *\n * \\return         0\n */\nint mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx,\n                      const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] );\n\n/**\n * \\brief          Triple-DES key schedule (168-bit, decryption)\n *\n * \\param ctx      3DES context to be initialized\n * \\param key      24-byte secret key\n *\n * \\return         0\n */\nint mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx,\n                      const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] );\n\n/**\n * \\brief          DES-ECB block encryption/decryption\n *\n * \\param ctx      DES context\n * \\param input    64-bit input block\n * \\param output   64-bit output block\n *\n * \\return         0 if successful\n */\nint mbedtls_des_crypt_ecb( mbedtls_des_context *ctx,\n                    const unsigned char input[8],\n                    unsigned char output[8] );\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/**\n * \\brief          DES-CBC buffer encryption/decryption\n *\n * \\note           Upon exit, the content of the IV is updated so that you can\n *                 call the function same function again on the following\n *                 block(s) of data and get the same result as if it was\n *                 encrypted in one call. This allows a \"streaming\" usage.\n *                 If on the other hand you need to retain the contents of the\n *                 IV, you should either save it manually or use the cipher\n *                 module instead.\n *\n * \\param ctx      DES context\n * \\param mode     MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT\n * \\param length   length of the input data\n * \\param iv       initialization vector (updated after use)\n * \\param input    buffer holding the input data\n * \\param output   buffer holding the output data\n */\nint mbedtls_des_crypt_cbc( mbedtls_des_context *ctx,\n                    int mode,\n                    size_t length,\n                    unsigned char iv[8],\n                    const unsigned char *input,\n                    unsigned char *output );\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n/**\n * \\brief          3DES-ECB block encryption/decryption\n *\n * \\param ctx      3DES context\n * \\param input    64-bit input block\n * \\param output   64-bit output block\n *\n * \\return         0 if successful\n */\nint mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx,\n                     const unsigned char input[8],\n                     unsigned char output[8] );\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/**\n * \\brief          3DES-CBC buffer encryption/decryption\n *\n * \\note           Upon exit, the content of the IV is updated so that you can\n *                 call the function same function again on the following\n *                 block(s) of data and get the same result as if it was\n *                 encrypted in one call. This allows a \"streaming\" usage.\n *                 If on the other hand you need to retain the contents of the\n *                 IV, you should either save it manually or use the cipher\n *                 module instead.\n *\n * \\param ctx      3DES context\n * \\param mode     MBEDTLS_DES_ENCRYPT or MBEDTLS_DES_DECRYPT\n * \\param length   length of the input data\n * \\param iv       initialization vector (updated after use)\n * \\param input    buffer holding the input data\n * \\param output   buffer holding the output data\n *\n * \\return         0 if successful, or MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH\n */\nint mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx,\n                     int mode,\n                     size_t length,\n                     unsigned char iv[8],\n                     const unsigned char *input,\n                     unsigned char *output );\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n/**\n * \\brief          Internal function for key expansion.\n *                 (Only exposed to allow overriding it,\n *                 see MBEDTLS_DES_SETKEY_ALT)\n *\n * \\param SK       Round keys\n * \\param key      Base key\n */\nvoid mbedtls_des_setkey( uint32_t SK[32],\n                         const unsigned char key[MBEDTLS_DES_KEY_SIZE] );\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_DES_ALT */\n#include \"des_alt.h\"\n#endif /* MBEDTLS_DES_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_des_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* des.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/dhm.h",
    "content": "/**\n * \\file dhm.h\n *\n * \\brief Diffie-Hellman-Merkle key exchange\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_DHM_H\n#define MBEDTLS_DHM_H\n\n#include \"bignum.h\"\n\n/*\n * DHM Error codes\n */\n#define MBEDTLS_ERR_DHM_BAD_INPUT_DATA                    -0x3080  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_DHM_READ_PARAMS_FAILED                -0x3100  /**< Reading of the DHM parameters failed. */\n#define MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED                -0x3180  /**< Making of the DHM parameters failed. */\n#define MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED                -0x3200  /**< Reading of the public values failed. */\n#define MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED                -0x3280  /**< Making of the public value failed. */\n#define MBEDTLS_ERR_DHM_CALC_SECRET_FAILED                -0x3300  /**< Calculation of the DHM secret failed. */\n#define MBEDTLS_ERR_DHM_INVALID_FORMAT                    -0x3380  /**< The ASN.1 data is not formatted correctly. */\n#define MBEDTLS_ERR_DHM_ALLOC_FAILED                      -0x3400  /**< Allocation of memory failed. */\n#define MBEDTLS_ERR_DHM_FILE_IO_ERROR                     -0x3480  /**< Read/write of file failed. */\n\n/**\n * RFC 3526 defines a number of standardized Diffie-Hellman groups\n * for IKE.\n * RFC 5114 defines a number of standardized Diffie-Hellman groups\n * that can be used.\n *\n * Some are included here for convenience.\n *\n * Included are:\n *  RFC 3526 3.    2048-bit MODP Group\n *  RFC 3526 4.    3072-bit MODP Group\n *  RFC 3526 5.    4096-bit MODP Group\n *  RFC 5114 2.2.  2048-bit MODP Group with 224-bit Prime Order Subgroup\n */\n#define MBEDTLS_DHM_RFC3526_MODP_2048_P               \\\n    \"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\" \\\n    \"29024E088A67CC74020BBEA63B139B22514A08798E3404DD\" \\\n    \"EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\" \\\n    \"E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\" \\\n    \"EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D\" \\\n    \"C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F\" \\\n    \"83655D23DCA3AD961C62F356208552BB9ED529077096966D\" \\\n    \"670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B\" \\\n    \"E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9\" \\\n    \"DE2BCBF6955817183995497CEA956AE515D2261898FA0510\" \\\n    \"15728E5A8AACAA68FFFFFFFFFFFFFFFF\"\n\n#define MBEDTLS_DHM_RFC3526_MODP_2048_G          \"02\"\n\n#define MBEDTLS_DHM_RFC3526_MODP_3072_P               \\\n    \"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\" \\\n    \"29024E088A67CC74020BBEA63B139B22514A08798E3404DD\" \\\n    \"EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\" \\\n    \"E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\" \\\n    \"EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D\" \\\n    \"C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F\" \\\n    \"83655D23DCA3AD961C62F356208552BB9ED529077096966D\" \\\n    \"670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B\" \\\n    \"E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9\" \\\n    \"DE2BCBF6955817183995497CEA956AE515D2261898FA0510\" \\\n    \"15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64\" \\\n    \"ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7\" \\\n    \"ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B\" \\\n    \"F12FFA06D98A0864D87602733EC86A64521F2B18177B200C\" \\\n    \"BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31\" \\\n    \"43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF\"\n\n#define MBEDTLS_DHM_RFC3526_MODP_3072_G          \"02\"\n\n#define MBEDTLS_DHM_RFC3526_MODP_4096_P                \\\n    \"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\" \\\n    \"29024E088A67CC74020BBEA63B139B22514A08798E3404DD\" \\\n    \"EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\" \\\n    \"E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\" \\\n    \"EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D\" \\\n    \"C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F\" \\\n    \"83655D23DCA3AD961C62F356208552BB9ED529077096966D\" \\\n    \"670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B\" \\\n    \"E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9\" \\\n    \"DE2BCBF6955817183995497CEA956AE515D2261898FA0510\" \\\n    \"15728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64\" \\\n    \"ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7\" \\\n    \"ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6B\" \\\n    \"F12FFA06D98A0864D87602733EC86A64521F2B18177B200C\" \\\n    \"BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31\" \\\n    \"43DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7\" \\\n    \"88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA\" \\\n    \"2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6\" \\\n    \"287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED\" \\\n    \"1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9\" \\\n    \"93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199\" \\\n    \"FFFFFFFFFFFFFFFF\"\n\n#define MBEDTLS_DHM_RFC3526_MODP_4096_G          \"02\"\n\n#define MBEDTLS_DHM_RFC5114_MODP_2048_P               \\\n    \"AD107E1E9123A9D0D660FAA79559C51FA20D64E5683B9FD1\" \\\n    \"B54B1597B61D0A75E6FA141DF95A56DBAF9A3C407BA1DF15\" \\\n    \"EB3D688A309C180E1DE6B85A1274A0A66D3F8152AD6AC212\" \\\n    \"9037C9EDEFDA4DF8D91E8FEF55B7394B7AD5B7D0B6C12207\" \\\n    \"C9F98D11ED34DBF6C6BA0B2C8BBC27BE6A00E0A0B9C49708\" \\\n    \"B3BF8A317091883681286130BC8985DB1602E714415D9330\" \\\n    \"278273C7DE31EFDC7310F7121FD5A07415987D9ADC0A486D\" \\\n    \"CDF93ACC44328387315D75E198C641A480CD86A1B9E587E8\" \\\n    \"BE60E69CC928B2B9C52172E413042E9B23F10B0E16E79763\" \\\n    \"C9B53DCF4BA80A29E3FB73C16B8E75B97EF363E2FFA31F71\" \\\n    \"CF9DE5384E71B81C0AC4DFFE0C10E64F\"\n\n#define MBEDTLS_DHM_RFC5114_MODP_2048_G              \\\n    \"AC4032EF4F2D9AE39DF30B5C8FFDAC506CDEBE7B89998CAF\"\\\n    \"74866A08CFE4FFE3A6824A4E10B9A6F0DD921F01A70C4AFA\"\\\n    \"AB739D7700C29F52C57DB17C620A8652BE5E9001A8D66AD7\"\\\n    \"C17669101999024AF4D027275AC1348BB8A762D0521BC98A\"\\\n    \"E247150422EA1ED409939D54DA7460CDB5F6C6B250717CBE\"\\\n    \"F180EB34118E98D119529A45D6F834566E3025E316A330EF\"\\\n    \"BB77A86F0C1AB15B051AE3D428C8F8ACB70A8137150B8EEB\"\\\n    \"10E183EDD19963DDD9E263E4770589EF6AA21E7F5F2FF381\"\\\n    \"B539CCE3409D13CD566AFBB48D6C019181E1BCFE94B30269\"\\\n    \"EDFE72FE9B6AA4BD7B5A0F1C71CFFF4C19C418E1F6EC0179\"\\\n    \"81BC087F2A7065B384B890D3191F2BFA\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          DHM context structure\n */\ntypedef struct\n{\n    size_t len; /*!<  size(P) in chars  */\n    mbedtls_mpi P;      /*!<  prime modulus     */\n    mbedtls_mpi G;      /*!<  generator         */\n    mbedtls_mpi X;      /*!<  secret value      */\n    mbedtls_mpi GX;     /*!<  self = G^X mod P  */\n    mbedtls_mpi GY;     /*!<  peer = G^Y mod P  */\n    mbedtls_mpi K;      /*!<  key = GY^X mod P  */\n    mbedtls_mpi RP;     /*!<  cached R^2 mod P  */\n    mbedtls_mpi Vi;     /*!<  blinding value    */\n    mbedtls_mpi Vf;     /*!<  un-blinding value */\n    mbedtls_mpi pX;     /*!<  previous X        */\n}\nmbedtls_dhm_context;\n\n/**\n * \\brief          Initialize DHM context\n *\n * \\param ctx      DHM context to be initialized\n */\nvoid mbedtls_dhm_init( mbedtls_dhm_context *ctx );\n\n/**\n * \\brief          Parse the ServerKeyExchange parameters\n *\n * \\param ctx      DHM context\n * \\param p        &(start of input buffer)\n * \\param end      end of buffer\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_DHM_XXX error code\n */\nint mbedtls_dhm_read_params( mbedtls_dhm_context *ctx,\n                     unsigned char **p,\n                     const unsigned char *end );\n\n/**\n * \\brief          Setup and write the ServerKeyExchange parameters\n *\n * \\param ctx      DHM context\n * \\param x_size   private value size in bytes\n * \\param output   destination buffer\n * \\param olen     number of chars written\n * \\param f_rng    RNG function\n * \\param p_rng    RNG parameter\n *\n * \\note           This function assumes that ctx->P and ctx->G\n *                 have already been properly set (for example\n *                 using mbedtls_mpi_read_string or mbedtls_mpi_read_binary).\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_DHM_XXX error code\n */\nint mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size,\n                     unsigned char *output, size_t *olen,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng );\n\n/**\n * \\brief          Import the peer's public value G^Y\n *\n * \\param ctx      DHM context\n * \\param input    input buffer\n * \\param ilen     size of buffer\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_DHM_XXX error code\n */\nint mbedtls_dhm_read_public( mbedtls_dhm_context *ctx,\n                     const unsigned char *input, size_t ilen );\n\n/**\n * \\brief          Create own private value X and export G^X\n *\n * \\param ctx      DHM context\n * \\param x_size   private value size in bytes\n * \\param output   destination buffer\n * \\param olen     must be at least equal to the size of P, ctx->len\n * \\param f_rng    RNG function\n * \\param p_rng    RNG parameter\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_DHM_XXX error code\n */\nint mbedtls_dhm_make_public( mbedtls_dhm_context *ctx, int x_size,\n                     unsigned char *output, size_t olen,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng );\n\n/**\n * \\brief          Derive and export the shared secret (G^Y)^X mod P\n *\n * \\param ctx      DHM context\n * \\param output   destination buffer\n * \\param output_size   size of the destination buffer\n * \\param olen     on exit, holds the actual number of bytes written\n * \\param f_rng    RNG function, for blinding purposes\n * \\param p_rng    RNG parameter\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_DHM_XXX error code\n *\n * \\note           If non-NULL, f_rng is used to blind the input as\n *                 countermeasure against timing attacks. Blinding is\n *                 automatically used if and only if our secret value X is\n *                 re-used and costs nothing otherwise, so it is recommended\n *                 to always pass a non-NULL f_rng argument.\n */\nint mbedtls_dhm_calc_secret( mbedtls_dhm_context *ctx,\n                     unsigned char *output, size_t output_size, size_t *olen,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng );\n\n/**\n * \\brief          Free and clear the components of a DHM key\n *\n * \\param ctx      DHM context to free and clear\n */\nvoid mbedtls_dhm_free( mbedtls_dhm_context *ctx );\n\n#if defined(MBEDTLS_ASN1_PARSE_C)\n/** \\ingroup x509_module */\n/**\n * \\brief          Parse DHM parameters in PEM or DER format\n *\n * \\param dhm      DHM context to be initialized\n * \\param dhmin    input buffer\n * \\param dhminlen size of the buffer\n *                 (including the terminating null byte for PEM data)\n *\n * \\return         0 if successful, or a specific DHM or PEM error code\n */\nint mbedtls_dhm_parse_dhm( mbedtls_dhm_context *dhm, const unsigned char *dhmin,\n                   size_t dhminlen );\n\n#if defined(MBEDTLS_FS_IO)\n/** \\ingroup x509_module */\n/**\n * \\brief          Load and parse DHM parameters\n *\n * \\param dhm      DHM context to be initialized\n * \\param path     filename to read the DHM Parameters from\n *\n * \\return         0 if successful, or a specific DHM or PEM error code\n */\nint mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path );\n#endif /* MBEDTLS_FS_IO */\n#endif /* MBEDTLS_ASN1_PARSE_C */\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_dhm_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* dhm.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ecdh.h",
    "content": "/**\n * \\file ecdh.h\n *\n * \\brief Elliptic curve Diffie-Hellman\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_ECDH_H\n#define MBEDTLS_ECDH_H\n\n#include \"ecp.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * When importing from an EC key, select if it is our key or the peer's key\n */\ntypedef enum\n{\n    MBEDTLS_ECDH_OURS,\n    MBEDTLS_ECDH_THEIRS,\n} mbedtls_ecdh_side;\n\n/**\n * \\brief           ECDH context structure\n */\ntypedef struct\n{\n    mbedtls_ecp_group grp;      /*!<  elliptic curve used                           */\n    mbedtls_mpi d;              /*!<  our secret value (private key)                */\n    mbedtls_ecp_point Q;        /*!<  our public value (public key)                 */\n    mbedtls_ecp_point Qp;       /*!<  peer's public value (public key)              */\n    mbedtls_mpi z;              /*!<  shared secret                                 */\n    int point_format;   /*!<  format for point export in TLS messages       */\n    mbedtls_ecp_point Vi;       /*!<  blinding value (for later)                    */\n    mbedtls_ecp_point Vf;       /*!<  un-blinding value (for later)                 */\n    mbedtls_mpi _d;             /*!<  previous d (for later)                        */\n}\nmbedtls_ecdh_context;\n\n/**\n * \\brief           Generate a public key.\n *                  Raw function that only does the core computation.\n *\n * \\param grp       ECP group\n * \\param d         Destination MPI (secret exponent, aka private key)\n * \\param Q         Destination point (public key)\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successful,\n *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code\n */\nint mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng );\n\n/**\n * \\brief           Compute shared secret\n *                  Raw function that only does the core computation.\n *\n * \\param grp       ECP group\n * \\param z         Destination MPI (shared secret)\n * \\param Q         Public key from other party\n * \\param d         Our secret exponent (private key)\n * \\param f_rng     RNG function (see notes)\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successful,\n *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code\n *\n * \\note            If f_rng is not NULL, it is used to implement\n *                  countermeasures against potential elaborate timing\n *                  attacks, see \\c mbedtls_ecp_mul() for details.\n */\nint mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z,\n                         const mbedtls_ecp_point *Q, const mbedtls_mpi *d,\n                         int (*f_rng)(void *, unsigned char *, size_t),\n                         void *p_rng );\n\n/**\n * \\brief           Initialize context\n *\n * \\param ctx       Context to initialize\n */\nvoid mbedtls_ecdh_init( mbedtls_ecdh_context *ctx );\n\n/**\n * \\brief           Free context\n *\n * \\param ctx       Context to free\n */\nvoid mbedtls_ecdh_free( mbedtls_ecdh_context *ctx );\n\n/**\n * \\brief           Generate a public key and a TLS ServerKeyExchange payload.\n *                  (First function used by a TLS server for ECDHE.)\n *\n * \\param ctx       ECDH context\n * \\param olen      number of chars written\n * \\param buf       destination buffer\n * \\param blen      length of buffer\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\note            This function assumes that ctx->grp has already been\n *                  properly set (for example using mbedtls_ecp_group_load).\n *\n * \\return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code\n */\nint mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen,\n                      unsigned char *buf, size_t blen,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng );\n\n/**\n * \\brief           Parse and procress a TLS ServerKeyExhange payload.\n *                  (First function used by a TLS client for ECDHE.)\n *\n * \\param ctx       ECDH context\n * \\param buf       pointer to start of input buffer\n * \\param end       one past end of buffer\n *\n * \\return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code\n */\nint mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx,\n                      const unsigned char **buf, const unsigned char *end );\n\n/**\n * \\brief           Setup an ECDH context from an EC key.\n *                  (Used by clients and servers in place of the\n *                  ServerKeyEchange for static ECDH: import ECDH parameters\n *                  from a certificate's EC key information.)\n *\n * \\param ctx       ECDH constext to set\n * \\param key       EC key to use\n * \\param side      Is it our key (1) or the peer's key (0) ?\n *\n * \\return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code\n */\nint mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key,\n                     mbedtls_ecdh_side side );\n\n/**\n * \\brief           Generate a public key and a TLS ClientKeyExchange payload.\n *                  (Second function used by a TLS client for ECDH(E).)\n *\n * \\param ctx       ECDH context\n * \\param olen      number of bytes actually written\n * \\param buf       destination buffer\n * \\param blen      size of destination buffer\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code\n */\nint mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen,\n                      unsigned char *buf, size_t blen,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng );\n\n/**\n * \\brief           Parse and process a TLS ClientKeyExchange payload.\n *                  (Second function used by a TLS server for ECDH(E).)\n *\n * \\param ctx       ECDH context\n * \\param buf       start of input buffer\n * \\param blen      length of input buffer\n *\n * \\return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code\n */\nint mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx,\n                      const unsigned char *buf, size_t blen );\n\n/**\n * \\brief           Derive and export the shared secret.\n *                  (Last function used by both TLS client en servers.)\n *\n * \\param ctx       ECDH context\n * \\param olen      number of bytes written\n * \\param buf       destination buffer\n * \\param blen      buffer length\n * \\param f_rng     RNG function, see notes for \\c mbedtls_ecdh_compute_shared()\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successful, or an MBEDTLS_ERR_ECP_XXX error code\n */\nint mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen,\n                      unsigned char *buf, size_t blen,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ecdh.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ecdsa.h",
    "content": "/**\n * \\file ecdsa.h\n *\n * \\brief Elliptic curve DSA\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_ECDSA_H\n#define MBEDTLS_ECDSA_H\n\n#include \"ecp.h\"\n#include \"md.h\"\n\n/*\n * RFC 4492 page 20:\n *\n *     Ecdsa-Sig-Value ::= SEQUENCE {\n *         r       INTEGER,\n *         s       INTEGER\n *     }\n *\n * Size is at most\n *    1 (tag) + 1 (len) + 1 (initial 0) + ECP_MAX_BYTES for each of r and s,\n *    twice that + 1 (tag) + 2 (len) for the sequence\n * (assuming ECP_MAX_BYTES is less than 126 for r and s,\n * and less than 124 (total len <= 255) for the sequence)\n */\n#if MBEDTLS_ECP_MAX_BYTES > 124\n#error \"MBEDTLS_ECP_MAX_BYTES bigger than expected, please fix MBEDTLS_ECDSA_MAX_LEN\"\n#endif\n/** Maximum size of an ECDSA signature in bytes */\n#define MBEDTLS_ECDSA_MAX_LEN  ( 3 + 2 * ( 3 + MBEDTLS_ECP_MAX_BYTES ) )\n\n/**\n * \\brief           ECDSA context structure\n */\ntypedef mbedtls_ecp_keypair mbedtls_ecdsa_context;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief           Compute ECDSA signature of a previously hashed message\n *\n * \\note            The deterministic version is usually prefered.\n *\n * \\param grp       ECP group\n * \\param r         First output integer\n * \\param s         Second output integer\n * \\param d         Private signing key\n * \\param buf       Message hash\n * \\param blen      Length of buf\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\note            If the bitlength of the message hash is larger than the\n *                  bitlength of the group order, then the hash is truncated as\n *                  prescribed by SEC1 4.1.3 step 5.\n *\n * \\return          0 if successful,\n *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code\n */\nint mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,\n                const mbedtls_mpi *d, const unsigned char *buf, size_t blen,\n                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );\n\n#if defined(MBEDTLS_ECDSA_DETERMINISTIC)\n/**\n * \\brief           Compute ECDSA signature of a previously hashed message,\n *                  deterministic version (RFC 6979).\n *\n * \\param grp       ECP group\n * \\param r         First output integer\n * \\param s         Second output integer\n * \\param d         Private signing key\n * \\param buf       Message hash\n * \\param blen      Length of buf\n * \\param md_alg    MD algorithm used to hash the message\n *\n * \\note            If the bitlength of the message hash is larger than the\n *                  bitlength of the group order, then the hash is truncated as\n *                  prescribed by SEC1 4.1.3 step 5.\n *\n * \\return          0 if successful,\n *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code\n */\nint mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,\n                    const mbedtls_mpi *d, const unsigned char *buf, size_t blen,\n                    mbedtls_md_type_t md_alg );\n#endif /* MBEDTLS_ECDSA_DETERMINISTIC */\n\n/**\n * \\brief           Verify ECDSA signature of a previously hashed message\n *\n * \\param grp       ECP group\n * \\param buf       Message hash\n * \\param blen      Length of buf\n * \\param Q         Public key to use for verification\n * \\param r         First integer of the signature\n * \\param s         Second integer of the signature\n *\n * \\note            If the bitlength of the message hash is larger than the\n *                  bitlength of the group order, then the hash is truncated as\n *                  prescribed by SEC1 4.1.4 step 3.\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid\n *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code\n */\nint mbedtls_ecdsa_verify( mbedtls_ecp_group *grp,\n                  const unsigned char *buf, size_t blen,\n                  const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s);\n\n/**\n * \\brief           Compute ECDSA signature and write it to buffer,\n *                  serialized as defined in RFC 4492 page 20.\n *                  (Not thread-safe to use same context in multiple threads)\n *\n * \\note            The deterministic version (RFC 6979) is used if\n *                  MBEDTLS_ECDSA_DETERMINISTIC is defined.\n *\n * \\param ctx       ECDSA context\n * \\param md_alg    Algorithm that was used to hash the message\n * \\param hash      Message hash\n * \\param hlen      Length of hash\n * \\param sig       Buffer that will hold the signature\n * \\param slen      Length of the signature written\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\note            The \"sig\" buffer must be at least as large as twice the\n *                  size of the curve used, plus 9 (eg. 73 bytes if a 256-bit\n *                  curve is used). MBEDTLS_ECDSA_MAX_LEN is always safe.\n *\n * \\note            If the bitlength of the message hash is larger than the\n *                  bitlength of the group order, then the hash is truncated as\n *                  prescribed by SEC1 4.1.3 step 5.\n *\n * \\return          0 if successful,\n *                  or a MBEDTLS_ERR_ECP_XXX, MBEDTLS_ERR_MPI_XXX or\n *                  MBEDTLS_ERR_ASN1_XXX error code\n */\nint mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg,\n                           const unsigned char *hash, size_t hlen,\n                           unsigned char *sig, size_t *slen,\n                           int (*f_rng)(void *, unsigned char *, size_t),\n                           void *p_rng );\n\n#if defined(MBEDTLS_ECDSA_DETERMINISTIC)\n#if ! defined(MBEDTLS_DEPRECATED_REMOVED)\n#if defined(MBEDTLS_DEPRECATED_WARNING)\n#define MBEDTLS_DEPRECATED    __attribute__((deprecated))\n#else\n#define MBEDTLS_DEPRECATED\n#endif\n/**\n * \\brief           Compute ECDSA signature and write it to buffer,\n *                  serialized as defined in RFC 4492 page 20.\n *                  Deterministic version, RFC 6979.\n *                  (Not thread-safe to use same context in multiple threads)\n *\n * \\deprecated      Superseded by mbedtls_ecdsa_write_signature() in 2.0.0\n *\n * \\param ctx       ECDSA context\n * \\param hash      Message hash\n * \\param hlen      Length of hash\n * \\param sig       Buffer that will hold the signature\n * \\param slen      Length of the signature written\n * \\param md_alg    MD algorithm used to hash the message\n *\n * \\note            The \"sig\" buffer must be at least as large as twice the\n *                  size of the curve used, plus 9 (eg. 73 bytes if a 256-bit\n *                  curve is used). MBEDTLS_ECDSA_MAX_LEN is always safe.\n *\n * \\note            If the bitlength of the message hash is larger than the\n *                  bitlength of the group order, then the hash is truncated as\n *                  prescribed by SEC1 4.1.3 step 5.\n *\n * \\return          0 if successful,\n *                  or a MBEDTLS_ERR_ECP_XXX, MBEDTLS_ERR_MPI_XXX or\n *                  MBEDTLS_ERR_ASN1_XXX error code\n */\nint mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx,\n                               const unsigned char *hash, size_t hlen,\n                               unsigned char *sig, size_t *slen,\n                               mbedtls_md_type_t md_alg ) MBEDTLS_DEPRECATED;\n#undef MBEDTLS_DEPRECATED\n#endif /* MBEDTLS_DEPRECATED_REMOVED */\n#endif /* MBEDTLS_ECDSA_DETERMINISTIC */\n\n/**\n * \\brief           Read and verify an ECDSA signature\n *\n * \\param ctx       ECDSA context\n * \\param hash      Message hash\n * \\param hlen      Size of hash\n * \\param sig       Signature to read and verify\n * \\param slen      Size of sig\n *\n * \\note            If the bitlength of the message hash is larger than the\n *                  bitlength of the group order, then the hash is truncated as\n *                  prescribed by SEC1 4.1.4 step 3.\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_ECP_BAD_INPUT_DATA if signature is invalid,\n *                  MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH if the signature is\n *                  valid but its actual length is less than siglen,\n *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_ERR_MPI_XXX error code\n */\nint mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx,\n                          const unsigned char *hash, size_t hlen,\n                          const unsigned char *sig, size_t slen );\n\n/**\n * \\brief           Generate an ECDSA keypair on the given curve\n *\n * \\param ctx       ECDSA context in which the keypair should be stored\n * \\param gid       Group (elliptic curve) to use. One of the various\n *                  MBEDTLS_ECP_DP_XXX macros depending on configuration.\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\return          0 on success, or a MBEDTLS_ERR_ECP_XXX code.\n */\nint mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid,\n                  int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );\n\n/**\n * \\brief           Set an ECDSA context from an EC key pair\n *\n * \\param ctx       ECDSA context to set\n * \\param key       EC key to use\n *\n * \\return          0 on success, or a MBEDTLS_ERR_ECP_XXX code.\n */\nint mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key );\n\n/**\n * \\brief           Initialize context\n *\n * \\param ctx       Context to initialize\n */\nvoid mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx );\n\n/**\n * \\brief           Free context\n *\n * \\param ctx       Context to free\n */\nvoid mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ecdsa.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ecjpake.h",
    "content": "/**\n * \\file ecjpake.h\n *\n * \\brief Elliptic curve J-PAKE\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_ECJPAKE_H\n#define MBEDTLS_ECJPAKE_H\n\n/*\n * J-PAKE is a password-authenticated key exchange that allows deriving a\n * strong shared secret from a (potentially low entropy) pre-shared\n * passphrase, with forward secrecy and mutual authentication.\n * https://en.wikipedia.org/wiki/Password_Authenticated_Key_Exchange_by_Juggling\n *\n * This file implements the Elliptic Curve variant of J-PAKE,\n * as defined in Chapter 7.4 of the Thread v1.0 Specification,\n * available to members of the Thread Group http://threadgroup.org/\n *\n * As the J-PAKE algorithm is inherently symmetric, so is our API.\n * Each party needs to send its first round message, in any order, to the\n * other party, then each sends its second round message, in any order.\n * The payloads are serialized in a way suitable for use in TLS, but could\n * also be use outside TLS.\n */\n\n#include \"ecp.h\"\n#include \"md.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * Roles in the EC J-PAKE exchange\n */\ntypedef enum {\n    MBEDTLS_ECJPAKE_CLIENT = 0,         /**< Client                         */\n    MBEDTLS_ECJPAKE_SERVER,             /**< Server                         */\n} mbedtls_ecjpake_role;\n\n/**\n * EC J-PAKE context structure.\n *\n * J-PAKE is a symmetric protocol, except for the identifiers used in\n * Zero-Knowledge Proofs, and the serialization of the second message\n * (KeyExchange) as defined by the Thread spec.\n *\n * In order to benefit from this symmetry, we choose a different naming\n * convetion from the Thread v1.0 spec. Correspondance is indicated in the\n * description as a pair C: client name, S: server name\n */\ntypedef struct\n{\n    const mbedtls_md_info_t *md_info;   /**< Hash to use                    */\n    mbedtls_ecp_group grp;              /**< Elliptic curve                 */\n    mbedtls_ecjpake_role role;          /**< Are we client or server?       */\n    int point_format;                   /**< Format for point export        */\n\n    mbedtls_ecp_point Xm1;              /**< My public key 1   C: X1, S: X3 */\n    mbedtls_ecp_point Xm2;              /**< My public key 2   C: X2, S: X4 */\n    mbedtls_ecp_point Xp1;              /**< Peer public key 1 C: X3, S: X1 */\n    mbedtls_ecp_point Xp2;              /**< Peer public key 2 C: X4, S: X2 */\n    mbedtls_ecp_point Xp;               /**< Peer public key   C: Xs, S: Xc */\n\n    mbedtls_mpi xm1;                    /**< My private key 1  C: x1, S: x3 */\n    mbedtls_mpi xm2;                    /**< My private key 2  C: x2, S: x4 */\n\n    mbedtls_mpi s;                      /**< Pre-shared secret (passphrase) */\n} mbedtls_ecjpake_context;\n\n/**\n * \\brief           Initialize a context\n *                  (just makes it ready for setup() or free()).\n *\n * \\param ctx       context to initialize\n */\nvoid mbedtls_ecjpake_init( mbedtls_ecjpake_context *ctx );\n\n/**\n * \\brief           Set up a context for use\n *\n * \\note            Currently the only values for hash/curve allowed by the\n *                  standard are MBEDTLS_MD_SHA256/MBEDTLS_ECP_DP_SECP256R1.\n *\n * \\param ctx       context to set up\n * \\param role      Our role: client or server\n * \\param hash      hash function to use (MBEDTLS_MD_XXX)\n * \\param curve     elliptic curve identifier (MBEDTLS_ECP_DP_XXX)\n * \\param secret    pre-shared secret (passphrase)\n * \\param len       length of the shared secret\n *\n * \\return          0 if successfull,\n *                  a negative error code otherwise\n */\nint mbedtls_ecjpake_setup( mbedtls_ecjpake_context *ctx,\n                           mbedtls_ecjpake_role role,\n                           mbedtls_md_type_t hash,\n                           mbedtls_ecp_group_id curve,\n                           const unsigned char *secret,\n                           size_t len );\n\n/**\n * \\brief           Check if a context is ready for use\n *\n * \\param ctx       Context to check\n *\n * \\return          0 if the context is ready for use,\n *                  MBEDTLS_ERR_ECP_BAD_INPUT_DATA otherwise\n */\nint mbedtls_ecjpake_check( const mbedtls_ecjpake_context *ctx );\n\n/**\n * \\brief           Generate and write the first round message\n *                  (TLS: contents of the Client/ServerHello extension,\n *                  excluding extension type and length bytes)\n *\n * \\param ctx       Context to use\n * \\param buf       Buffer to write the contents to\n * \\param len       Buffer size\n * \\param olen      Will be updated with the number of bytes written\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successfull,\n *                  a negative error code otherwise\n */\nint mbedtls_ecjpake_write_round_one( mbedtls_ecjpake_context *ctx,\n                            unsigned char *buf, size_t len, size_t *olen,\n                            int (*f_rng)(void *, unsigned char *, size_t),\n                            void *p_rng );\n\n/**\n * \\brief           Read and process the first round message\n *                  (TLS: contents of the Client/ServerHello extension,\n *                  excluding extension type and length bytes)\n *\n * \\param ctx       Context to use\n * \\param buf       Pointer to extension contents\n * \\param len       Extension length\n *\n * \\return          0 if successfull,\n *                  a negative error code otherwise\n */\nint mbedtls_ecjpake_read_round_one( mbedtls_ecjpake_context *ctx,\n                                    const unsigned char *buf,\n                                    size_t len );\n\n/**\n * \\brief           Generate and write the second round message\n *                  (TLS: contents of the Client/ServerKeyExchange)\n *\n * \\param ctx       Context to use\n * \\param buf       Buffer to write the contents to\n * \\param len       Buffer size\n * \\param olen      Will be updated with the number of bytes written\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successfull,\n *                  a negative error code otherwise\n */\nint mbedtls_ecjpake_write_round_two( mbedtls_ecjpake_context *ctx,\n                            unsigned char *buf, size_t len, size_t *olen,\n                            int (*f_rng)(void *, unsigned char *, size_t),\n                            void *p_rng );\n\n/**\n * \\brief           Read and process the second round message\n *                  (TLS: contents of the Client/ServerKeyExchange)\n *\n * \\param ctx       Context to use\n * \\param buf       Pointer to the message\n * \\param len       Message length\n *\n * \\return          0 if successfull,\n *                  a negative error code otherwise\n */\nint mbedtls_ecjpake_read_round_two( mbedtls_ecjpake_context *ctx,\n                                    const unsigned char *buf,\n                                    size_t len );\n\n/**\n * \\brief           Derive the shared secret\n *                  (TLS: Pre-Master Secret)\n *\n * \\param ctx       Context to use\n * \\param buf       Buffer to write the contents to\n * \\param len       Buffer size\n * \\param olen      Will be updated with the number of bytes written\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successfull,\n *                  a negative error code otherwise\n */\nint mbedtls_ecjpake_derive_secret( mbedtls_ecjpake_context *ctx,\n                            unsigned char *buf, size_t len, size_t *olen,\n                            int (*f_rng)(void *, unsigned char *, size_t),\n                            void *p_rng );\n\n/**\n * \\brief           Free a context's content\n *\n * \\param ctx       context to free\n */\nvoid mbedtls_ecjpake_free( mbedtls_ecjpake_context *ctx );\n\n#if defined(MBEDTLS_SELF_TEST)\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if a test failed\n */\nint mbedtls_ecjpake_self_test( int verbose );\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ecjpake.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ecp.h",
    "content": "/**\n * \\file ecp.h\n *\n * \\brief Elliptic curves over GF(p)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_ECP_H\n#define MBEDTLS_ECP_H\n\n#include \"bignum.h\"\n\n/*\n * ECP error codes\n */\n#define MBEDTLS_ERR_ECP_BAD_INPUT_DATA                    -0x4F80  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL                  -0x4F00  /**< The buffer is too small to write to. */\n#define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE               -0x4E80  /**< Requested curve not available. */\n#define MBEDTLS_ERR_ECP_VERIFY_FAILED                     -0x4E00  /**< The signature is not valid. */\n#define MBEDTLS_ERR_ECP_ALLOC_FAILED                      -0x4D80  /**< Memory allocation failed. */\n#define MBEDTLS_ERR_ECP_RANDOM_FAILED                     -0x4D00  /**< Generation of random value, such as (ephemeral) key, failed. */\n#define MBEDTLS_ERR_ECP_INVALID_KEY                       -0x4C80  /**< Invalid private or public key. */\n#define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH                  -0x4C00  /**< Signature is valid but shorter than the user-supplied length. */\n\n#if !defined(MBEDTLS_ECP_ALT)\n/*\n * default mbed TLS elliptic curve arithmetic implementation\n *\n * (in case MBEDTLS_ECP_ALT is defined then the developer has to provide an\n * alternative implementation for the whole module and it will replace this\n * one.)\n */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * Domain parameters (curve, subgroup and generator) identifiers.\n *\n * Only curves over prime fields are supported.\n *\n * \\warning This library does not support validation of arbitrary domain\n * parameters. Therefore, only well-known domain parameters from trusted\n * sources should be used. See mbedtls_ecp_group_load().\n */\ntypedef enum\n{\n    MBEDTLS_ECP_DP_NONE = 0,\n    MBEDTLS_ECP_DP_SECP192R1,      /*!< 192-bits NIST curve  */\n    MBEDTLS_ECP_DP_SECP224R1,      /*!< 224-bits NIST curve  */\n    MBEDTLS_ECP_DP_SECP256R1,      /*!< 256-bits NIST curve  */\n    MBEDTLS_ECP_DP_SECP384R1,      /*!< 384-bits NIST curve  */\n    MBEDTLS_ECP_DP_SECP521R1,      /*!< 521-bits NIST curve  */\n    MBEDTLS_ECP_DP_BP256R1,        /*!< 256-bits Brainpool curve */\n    MBEDTLS_ECP_DP_BP384R1,        /*!< 384-bits Brainpool curve */\n    MBEDTLS_ECP_DP_BP512R1,        /*!< 512-bits Brainpool curve */\n    MBEDTLS_ECP_DP_CURVE25519,           /*!< Curve25519               */\n    MBEDTLS_ECP_DP_SECP192K1,      /*!< 192-bits \"Koblitz\" curve */\n    MBEDTLS_ECP_DP_SECP224K1,      /*!< 224-bits \"Koblitz\" curve */\n    MBEDTLS_ECP_DP_SECP256K1,      /*!< 256-bits \"Koblitz\" curve */\n} mbedtls_ecp_group_id;\n\n/**\n * Number of supported curves (plus one for NONE).\n *\n * (Montgomery curves excluded for now.)\n */\n#define MBEDTLS_ECP_DP_MAX     12\n\n/**\n * Curve information for use by other modules\n */\ntypedef struct\n{\n    mbedtls_ecp_group_id grp_id;    /*!< Internal identifier        */\n    uint16_t tls_id;                /*!< TLS NamedCurve identifier  */\n    uint16_t bit_size;              /*!< Curve size in bits         */\n    const char *name;               /*!< Human-friendly name        */\n} mbedtls_ecp_curve_info;\n\n/**\n * \\brief           ECP point structure (jacobian coordinates)\n *\n * \\note            All functions expect and return points satisfying\n *                  the following condition: Z == 0 or Z == 1. (Other\n *                  values of Z are used by internal functions only.)\n *                  The point is zero, or \"at infinity\", if Z == 0.\n *                  Otherwise, X and Y are its standard (affine) coordinates.\n */\ntypedef struct\n{\n    mbedtls_mpi X;          /*!<  the point's X coordinate  */\n    mbedtls_mpi Y;          /*!<  the point's Y coordinate  */\n    mbedtls_mpi Z;          /*!<  the point's Z coordinate  */\n}\nmbedtls_ecp_point;\n\n/**\n * \\brief           ECP group structure\n *\n * We consider two types of curves equations:\n * 1. Short Weierstrass y^2 = x^3 + A x + B     mod P   (SEC1 + RFC 4492)\n * 2. Montgomery,       y^2 = x^3 + A x^2 + x   mod P   (Curve25519 + draft)\n * In both cases, a generator G for a prime-order subgroup is fixed. In the\n * short weierstrass, this subgroup is actually the whole curve, and its\n * cardinal is denoted by N.\n *\n * In the case of Short Weierstrass curves, our code requires that N is an odd\n * prime. (Use odd in mbedtls_ecp_mul() and prime in mbedtls_ecdsa_sign() for blinding.)\n *\n * In the case of Montgomery curves, we don't store A but (A + 2) / 4 which is\n * the quantity actually used in the formulas. Also, nbits is not the size of N\n * but the required size for private keys.\n *\n * If modp is NULL, reduction modulo P is done using a generic algorithm.\n * Otherwise, it must point to a function that takes an mbedtls_mpi in the range\n * 0..2^(2*pbits)-1 and transforms it in-place in an integer of little more\n * than pbits, so that the integer may be efficiently brought in the 0..P-1\n * range by a few additions or substractions. It must return 0 on success and\n * non-zero on failure.\n */\ntypedef struct\n{\n    mbedtls_ecp_group_id id;    /*!<  internal group identifier                     */\n    mbedtls_mpi P;              /*!<  prime modulus of the base field               */\n    mbedtls_mpi A;              /*!<  1. A in the equation, or 2. (A + 2) / 4       */\n    mbedtls_mpi B;              /*!<  1. B in the equation, or 2. unused            */\n    mbedtls_ecp_point G;        /*!<  generator of the (sub)group used              */\n    mbedtls_mpi N;              /*!<  1. the order of G, or 2. unused               */\n    size_t pbits;       /*!<  number of bits in P                           */\n    size_t nbits;       /*!<  number of bits in 1. P, or 2. private keys    */\n    unsigned int h;     /*!<  internal: 1 if the constants are static       */\n    int (*modp)(mbedtls_mpi *); /*!<  function for fast reduction mod P             */\n    int (*t_pre)(mbedtls_ecp_point *, void *);  /*!< unused                         */\n    int (*t_post)(mbedtls_ecp_point *, void *); /*!< unused                         */\n    void *t_data;                       /*!< unused                         */\n    mbedtls_ecp_point *T;       /*!<  pre-computed points for ecp_mul_comb()        */\n    size_t T_size;      /*!<  number for pre-computed points                */\n}\nmbedtls_ecp_group;\n\n/**\n * \\brief           ECP key pair structure\n *\n * A generic key pair that could be used for ECDSA, fixed ECDH, etc.\n *\n * \\note Members purposefully in the same order as struc mbedtls_ecdsa_context.\n */\ntypedef struct\n{\n    mbedtls_ecp_group grp;      /*!<  Elliptic curve and base point     */\n    mbedtls_mpi d;              /*!<  our secret value                  */\n    mbedtls_ecp_point Q;        /*!<  our public value                  */\n}\nmbedtls_ecp_keypair;\n\n/**\n * \\name SECTION: Module settings\n *\n * The configuration options you can set for this module are in this section.\n * Either change them in config.h or define them on the compiler command line.\n * \\{\n */\n\n#if !defined(MBEDTLS_ECP_MAX_BITS)\n/**\n * Maximum size of the groups (that is, of N and P)\n */\n#define MBEDTLS_ECP_MAX_BITS     521   /**< Maximum bit size of groups */\n#endif\n\n#define MBEDTLS_ECP_MAX_BYTES    ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 )\n#define MBEDTLS_ECP_MAX_PT_LEN   ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 )\n\n#if !defined(MBEDTLS_ECP_WINDOW_SIZE)\n/*\n * Maximum \"window\" size used for point multiplication.\n * Default: 6.\n * Minimum value: 2. Maximum value: 7.\n *\n * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) )\n * points used for point multiplication. This value is directly tied to EC\n * peak memory usage, so decreasing it by one should roughly cut memory usage\n * by two (if large curves are in use).\n *\n * Reduction in size may reduce speed, but larger curves are impacted first.\n * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1):\n *      w-size:     6       5       4       3       2\n *      521       145     141     135     120      97\n *      384       214     209     198     177     146\n *      256       320     320     303     262     226\n\n *      224       475     475     453     398     342\n *      192       640     640     633     587     476\n */\n#define MBEDTLS_ECP_WINDOW_SIZE    6   /**< Maximum window size used */\n#endif /* MBEDTLS_ECP_WINDOW_SIZE */\n\n#if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM)\n/*\n * Trade memory for speed on fixed-point multiplication.\n *\n * This speeds up repeated multiplication of the generator (that is, the\n * multiplication in ECDSA signatures, and half of the multiplications in\n * ECDSA verification and ECDHE) by a factor roughly 3 to 4.\n *\n * The cost is increasing EC peak memory usage by a factor roughly 2.\n *\n * Change this value to 0 to reduce peak memory usage.\n */\n#define MBEDTLS_ECP_FIXED_POINT_OPTIM  1   /**< Enable fixed-point speed-up */\n#endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */\n\n/* \\} name SECTION: Module settings */\n\n/*\n * Point formats, from RFC 4492's enum ECPointFormat\n */\n#define MBEDTLS_ECP_PF_UNCOMPRESSED    0   /**< Uncompressed point format */\n#define MBEDTLS_ECP_PF_COMPRESSED      1   /**< Compressed point format */\n\n/*\n * Some other constants from RFC 4492\n */\n#define MBEDTLS_ECP_TLS_NAMED_CURVE    3   /**< ECCurveType's named_curve */\n\n/**\n * \\brief           Get the list of supported curves in order of preferrence\n *                  (full information)\n *\n * \\return          A statically allocated array, the last entry is 0.\n */\nconst mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void );\n\n/**\n * \\brief           Get the list of supported curves in order of preferrence\n *                  (grp_id only)\n *\n * \\return          A statically allocated array,\n *                  terminated with MBEDTLS_ECP_DP_NONE.\n */\nconst mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void );\n\n/**\n * \\brief           Get curve information from an internal group identifier\n *\n * \\param grp_id    A MBEDTLS_ECP_DP_XXX value\n *\n * \\return          The associated curve information or NULL\n */\nconst mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id );\n\n/**\n * \\brief           Get curve information from a TLS NamedCurve value\n *\n * \\param tls_id    A MBEDTLS_ECP_DP_XXX value\n *\n * \\return          The associated curve information or NULL\n */\nconst mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id );\n\n/**\n * \\brief           Get curve information from a human-readable name\n *\n * \\param name      The name\n *\n * \\return          The associated curve information or NULL\n */\nconst mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name );\n\n/**\n * \\brief           Initialize a point (as zero)\n */\nvoid mbedtls_ecp_point_init( mbedtls_ecp_point *pt );\n\n/**\n * \\brief           Initialize a group (to something meaningless)\n */\nvoid mbedtls_ecp_group_init( mbedtls_ecp_group *grp );\n\n/**\n * \\brief           Initialize a key pair (as an invalid one)\n */\nvoid mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key );\n\n/**\n * \\brief           Free the components of a point\n */\nvoid mbedtls_ecp_point_free( mbedtls_ecp_point *pt );\n\n/**\n * \\brief           Free the components of an ECP group\n */\nvoid mbedtls_ecp_group_free( mbedtls_ecp_group *grp );\n\n/**\n * \\brief           Free the components of a key pair\n */\nvoid mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key );\n\n/**\n * \\brief           Copy the contents of point Q into P\n *\n * \\param P         Destination point\n * \\param Q         Source point\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q );\n\n/**\n * \\brief           Copy the contents of a group object\n *\n * \\param dst       Destination group\n * \\param src       Source group\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src );\n\n/**\n * \\brief           Set a point to zero\n *\n * \\param pt        Destination point\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_ecp_set_zero( mbedtls_ecp_point *pt );\n\n/**\n * \\brief           Tell if a point is zero\n *\n * \\param pt        Point to test\n *\n * \\return          1 if point is zero, 0 otherwise\n */\nint mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );\n\n/**\n * \\brief           Compare two points\n *\n * \\note            This assumes the points are normalized. Otherwise,\n *                  they may compare as \"not equal\" even if they are.\n *\n * \\param P         First point to compare\n * \\param Q         Second point to compare\n *\n * \\return          0 if the points are equal,\n *                  MBEDTLS_ERR_ECP_BAD_INPUT_DATA otherwise\n */\nint mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,\n                           const mbedtls_ecp_point *Q );\n\n/**\n * \\brief           Import a non-zero point from two ASCII strings\n *\n * \\param P         Destination point\n * \\param radix     Input numeric base\n * \\param x         First affine coordinate as a null-terminated string\n * \\param y         Second affine coordinate as a null-terminated string\n *\n * \\return          0 if successful, or a MBEDTLS_ERR_MPI_XXX error code\n */\nint mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,\n                           const char *x, const char *y );\n\n/**\n * \\brief           Export a point into unsigned binary data\n *\n * \\param grp       Group to which the point should belong\n * \\param P         Point to export\n * \\param format    Point format, should be a MBEDTLS_ECP_PF_XXX macro\n * \\param olen      Length of the actual output\n * \\param buf       Output buffer\n * \\param buflen    Length of the output buffer\n *\n * \\return          0 if successful,\n *                  or MBEDTLS_ERR_ECP_BAD_INPUT_DATA\n *                  or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL\n */\nint mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,\n                            int format, size_t *olen,\n                            unsigned char *buf, size_t buflen );\n\n/**\n * \\brief           Import a point from unsigned binary data\n *\n * \\param grp       Group to which the point should belong\n * \\param P         Point to import\n * \\param buf       Input buffer\n * \\param ilen      Actual length of input\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid,\n *                  MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,\n *                  MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the point format\n *                  is not implemented.\n *\n * \\note            This function does NOT check that the point actually\n *                  belongs to the given group, see mbedtls_ecp_check_pubkey() for\n *                  that.\n */\nint mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P,\n                           const unsigned char *buf, size_t ilen );\n\n/**\n * \\brief           Import a point from a TLS ECPoint record\n *\n * \\param grp       ECP group used\n * \\param pt        Destination point\n * \\param buf       $(Start of input buffer)\n * \\param len       Buffer length\n *\n * \\note            buf is updated to point right after the ECPoint on exit\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_MPI_XXX if initialization failed\n *                  MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid\n */\nint mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,\n                        const unsigned char **buf, size_t len );\n\n/**\n * \\brief           Export a point as a TLS ECPoint record\n *\n * \\param grp       ECP group used\n * \\param pt        Point to export\n * \\param format    Export format\n * \\param olen      length of data written\n * \\param buf       Buffer to write to\n * \\param blen      Buffer length\n *\n * \\return          0 if successful,\n *                  or MBEDTLS_ERR_ECP_BAD_INPUT_DATA\n *                  or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL\n */\nint mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt,\n                         int format, size_t *olen,\n                         unsigned char *buf, size_t blen );\n\n/**\n * \\brief           Set a group using well-known domain parameters\n *\n * \\param grp       Destination group\n * \\param id        Index in the list of well-known domain parameters\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_MPI_XXX if initialization failed\n *                  MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE for unkownn groups\n *\n * \\note            Index should be a value of RFC 4492's enum NamedCurve,\n *                  usually in the form of a MBEDTLS_ECP_DP_XXX macro.\n */\nint mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id );\n\n/**\n * \\brief           Set a group from a TLS ECParameters record\n *\n * \\param grp       Destination group\n * \\param buf       &(Start of input buffer)\n * \\param len       Buffer length\n *\n * \\note            buf is updated to point right after ECParameters on exit\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_MPI_XXX if initialization failed\n *                  MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid\n */\nint mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len );\n\n/**\n * \\brief           Write the TLS ECParameters record for a group\n *\n * \\param grp       ECP group used\n * \\param olen      Number of bytes actually written\n * \\param buf       Buffer to write to\n * \\param blen      Buffer length\n *\n * \\return          0 if successful,\n *                  or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL\n */\nint mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,\n                         unsigned char *buf, size_t blen );\n\n/**\n * \\brief           Multiplication by an integer: R = m * P\n *                  (Not thread-safe to use same group in multiple threads)\n *\n * \\note            In order to prevent timing attacks, this function\n *                  executes the exact same sequence of (base field)\n *                  operations for any valid m. It avoids any if-branch or\n *                  array index depending on the value of m.\n *\n * \\note            If f_rng is not NULL, it is used to randomize intermediate\n *                  results in order to prevent potential timing attacks\n *                  targeting these results. It is recommended to always\n *                  provide a non-NULL f_rng (the overhead is negligible).\n *\n * \\param grp       ECP group\n * \\param R         Destination point\n * \\param m         Integer by which to multiply\n * \\param P         Point to multiply\n * \\param f_rng     RNG function (see notes)\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_ECP_INVALID_KEY if m is not a valid privkey\n *                  or P is not a valid pubkey,\n *                  MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n             const mbedtls_mpi *m, const mbedtls_ecp_point *P,\n             int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );\n\n/**\n * \\brief           Multiplication and addition of two points by integers:\n *                  R = m * P + n * Q\n *                  (Not thread-safe to use same group in multiple threads)\n *\n * \\note            In contrast to mbedtls_ecp_mul(), this function does not guarantee\n *                  a constant execution flow and timing.\n *\n * \\param grp       ECP group\n * \\param R         Destination point\n * \\param m         Integer by which to multiply P\n * \\param P         Point to multiply by m\n * \\param n         Integer by which to multiply Q\n * \\param Q         Point to be multiplied by n\n *\n * \\return          0 if successful,\n *                  MBEDTLS_ERR_ECP_INVALID_KEY if m or n is not a valid privkey\n *                  or P or Q is not a valid pubkey,\n *                  MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed\n */\nint mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n             const mbedtls_mpi *m, const mbedtls_ecp_point *P,\n             const mbedtls_mpi *n, const mbedtls_ecp_point *Q );\n\n/**\n * \\brief           Check that a point is a valid public key on this curve\n *\n * \\param grp       Curve/group the point should belong to\n * \\param pt        Point to check\n *\n * \\return          0 if point is a valid public key,\n *                  MBEDTLS_ERR_ECP_INVALID_KEY otherwise.\n *\n * \\note            This function only checks the point is non-zero, has valid\n *                  coordinates and lies on the curve, but not that it is\n *                  indeed a multiple of G. This is additional check is more\n *                  expensive, isn't required by standards, and shouldn't be\n *                  necessary if the group used has a small cofactor. In\n *                  particular, it is useless for the NIST groups which all\n *                  have a cofactor of 1.\n *\n * \\note            Uses bare components rather than an mbedtls_ecp_keypair structure\n *                  in order to ease use with other structures such as\n *                  mbedtls_ecdh_context of mbedtls_ecdsa_context.\n */\nint mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt );\n\n/**\n * \\brief           Check that an mbedtls_mpi is a valid private key for this curve\n *\n * \\param grp       Group used\n * \\param d         Integer to check\n *\n * \\return          0 if point is a valid private key,\n *                  MBEDTLS_ERR_ECP_INVALID_KEY otherwise.\n *\n * \\note            Uses bare components rather than an mbedtls_ecp_keypair structure\n *                  in order to ease use with other structures such as\n *                  mbedtls_ecdh_context of mbedtls_ecdsa_context.\n */\nint mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );\n\n/**\n * \\brief           Generate a keypair with configurable base point\n *\n * \\param grp       ECP group\n * \\param G         Chosen base point\n * \\param d         Destination MPI (secret part)\n * \\param Q         Destination point (public part)\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successful,\n *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code\n *\n * \\note            Uses bare components rather than an mbedtls_ecp_keypair structure\n *                  in order to ease use with other structures such as\n *                  mbedtls_ecdh_context of mbedtls_ecdsa_context.\n */\nint mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,\n                     const mbedtls_ecp_point *G,\n                     mbedtls_mpi *d, mbedtls_ecp_point *Q,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng );\n\n/**\n * \\brief           Generate a keypair\n *\n * \\param grp       ECP group\n * \\param d         Destination MPI (secret part)\n * \\param Q         Destination point (public part)\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successful,\n *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code\n *\n * \\note            Uses bare components rather than an mbedtls_ecp_keypair structure\n *                  in order to ease use with other structures such as\n *                  mbedtls_ecdh_context of mbedtls_ecdsa_context.\n */\nint mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng );\n\n/**\n * \\brief           Generate a keypair\n *\n * \\param grp_id    ECP group identifier\n * \\param key       Destination keypair\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successful,\n *                  or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code\n */\nint mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,\n                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );\n\n/**\n * \\brief           Check a public-private key pair\n *\n * \\param pub       Keypair structure holding a public key\n * \\param prv       Keypair structure holding a private (plus public) key\n *\n * \\return          0 if successful (keys are valid and match), or\n *                  MBEDTLS_ERR_ECP_BAD_INPUT_DATA, or\n *                  a MBEDTLS_ERR_ECP_XXX or MBEDTLS_ERR_MPI_XXX code.\n */\nint mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv );\n\n#if defined(MBEDTLS_SELF_TEST)\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if a test failed\n */\nint mbedtls_ecp_self_test( int verbose );\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_ECP_ALT */\n#include \"ecp_alt.h\"\n#endif /* MBEDTLS_ECP_ALT */\n\n#endif /* ecp.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ecp_internal.h",
    "content": "/**\n * \\file ecp_internal.h\n *\n * \\brief Function declarations for alternative implementation of elliptic curve\n * point arithmetic.\n *\n *  Copyright (C) 2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * References:\n *\n * [1] BERNSTEIN, Daniel J. Curve25519: new Diffie-Hellman speed records.\n *     <http://cr.yp.to/ecdh/curve25519-20060209.pdf>\n *\n * [2] CORON, Jean-S'ebastien. Resistance against differential power analysis\n *     for elliptic curve cryptosystems. In : Cryptographic Hardware and\n *     Embedded Systems. Springer Berlin Heidelberg, 1999. p. 292-302.\n *     <http://link.springer.com/chapter/10.1007/3-540-48059-5_25>\n *\n * [3] HEDABOU, Mustapha, PINEL, Pierre, et B'EN'ETEAU, Lucien. A comb method to\n *     render ECC resistant against Side Channel Attacks. IACR Cryptology\n *     ePrint Archive, 2004, vol. 2004, p. 342.\n *     <http://eprint.iacr.org/2004/342.pdf>\n *\n * [4] Certicom Research. SEC 2: Recommended Elliptic Curve Domain Parameters.\n *     <http://www.secg.org/sec2-v2.pdf>\n *\n * [5] HANKERSON, Darrel, MENEZES, Alfred J., VANSTONE, Scott. Guide to Elliptic\n *     Curve Cryptography.\n *\n * [6] Digital Signature Standard (DSS), FIPS 186-4.\n *     <http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf>\n *\n * [7] Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer \n *     Security (TLS), RFC 4492.\n *     <https://tools.ietf.org/search/rfc4492>\n *\n * [8] <http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html>\n *\n * [9] COHEN, Henri. A Course in Computational Algebraic Number Theory.\n *     Springer Science & Business Media, 1 Aug 2000\n */\n\n#ifndef MBEDTLS_ECP_INTERNAL_H\n#define MBEDTLS_ECP_INTERNAL_H\n\n#if defined(MBEDTLS_ECP_INTERNAL_ALT)\n\n/**\n * \\brief           Indicate if the Elliptic Curve Point module extension can\n *                  handle the group.\n *\n * \\param grp       The pointer to the elliptic curve group that will be the\n *                  basis of the cryptographic computations.\n *\n * \\return          Non-zero if successful.\n */\nunsigned char mbedtls_internal_ecp_grp_capable( const mbedtls_ecp_group *grp );\n\n/**\n * \\brief           Initialise the Elliptic Curve Point module extension.\n *\n *                  If mbedtls_internal_ecp_grp_capable returns true for a\n *                  group, this function has to be able to initialise the\n *                  module for it.\n *\n *                  This module can be a driver to a crypto hardware\n *                  accelerator, for which this could be an initialise function.\n *\n * \\param grp       The pointer to the group the module needs to be\n *                  initialised for.\n *\n * \\return          0 if successful.\n */\nint mbedtls_internal_ecp_init( const mbedtls_ecp_group *grp );\n\n/**\n * \\brief           Frees and deallocates the Elliptic Curve Point module\n *                  extension.\n *\n * \\param grp       The pointer to the group the module was initialised for.\n */\nvoid mbedtls_internal_ecp_free( const mbedtls_ecp_group *grp );\n\n#if defined(ECP_SHORTWEIERSTRASS)\n\n#if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT)\n/**\n * \\brief           Randomize jacobian coordinates:\n *                  (X, Y, Z) -> (l^2 X, l^3 Y, l Z) for random l.\n *\n * \\param grp       Pointer to the group representing the curve.\n *\n * \\param pt        The point on the curve to be randomised, given with Jacobian\n *                  coordinates.\n *\n * \\param f_rng     A function pointer to the random number generator.\n *\n * \\param p_rng     A pointer to the random number generator state.\n *\n * \\return          0 if successful.\n */\nint mbedtls_internal_ecp_randomize_jac( const mbedtls_ecp_group *grp,\n        mbedtls_ecp_point *pt, int (*f_rng)(void *, unsigned char *, size_t),\n        void *p_rng );\n#endif\n\n#if defined(MBEDTLS_ECP_ADD_MIXED_ALT)\n/**\n * \\brief           Addition: R = P + Q, mixed affine-Jacobian coordinates.\n *\n *                  The coordinates of Q must be normalized (= affine),\n *                  but those of P don't need to. R is not normalized.\n *\n *                  This function is used only as a subrutine of\n *                  ecp_mul_comb().\n *\n *                  Special cases: (1) P or Q is zero, (2) R is zero,\n *                      (3) P == Q.\n *                  None of these cases can happen as intermediate step in\n *                  ecp_mul_comb():\n *                      - at each step, P, Q and R are multiples of the base\n *                      point, the factor being less than its order, so none of\n *                      them is zero;\n *                      - Q is an odd multiple of the base point, P an even\n *                      multiple, due to the choice of precomputed points in the\n *                      modified comb method.\n *                  So branches for these cases do not leak secret information.\n *\n *                  We accept Q->Z being unset (saving memory in tables) as\n *                  meaning 1.\n *\n *                  Cost in field operations if done by [5] 3.22:\n *                      1A := 8M + 3S\n *\n * \\param grp       Pointer to the group representing the curve.\n *\n * \\param R         Pointer to a point structure to hold the result.\n *\n * \\param P         Pointer to the first summand, given with Jacobian\n *                  coordinates\n *\n * \\param Q         Pointer to the second summand, given with affine\n *                  coordinates.\n *\n * \\return          0 if successful.\n */\nint mbedtls_internal_ecp_add_mixed( const mbedtls_ecp_group *grp,\n        mbedtls_ecp_point *R, const mbedtls_ecp_point *P,\n        const mbedtls_ecp_point *Q );\n#endif\n\n/**\n * \\brief           Point doubling R = 2 P, Jacobian coordinates.\n *\n *                  Cost:   1D := 3M + 4S    (A ==  0)\n *                          4M + 4S          (A == -3)\n *                          3M + 6S + 1a     otherwise\n *                  when the implementation is based on the \"dbl-1998-cmo-2\"\n *                  doubling formulas in [8] and standard optimizations are\n *                  applied when curve parameter A is one of { 0, -3 }.\n *\n * \\param grp       Pointer to the group representing the curve.\n *\n * \\param R         Pointer to a point structure to hold the result.\n *\n * \\param P         Pointer to the point that has to be doubled, given with\n *                  Jacobian coordinates.\n *\n * \\return          0 if successful.\n */\n#if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT)\nint mbedtls_internal_ecp_double_jac( const mbedtls_ecp_group *grp,\n        mbedtls_ecp_point *R, const mbedtls_ecp_point *P );\n#endif\n\n/**\n * \\brief           Normalize jacobian coordinates of an array of (pointers to)\n *                  points.\n *\n *                  Using Montgomery's trick to perform only one inversion mod P\n *                  the cost is:\n *                      1N(t) := 1I + (6t - 3)M + 1S\n *                  (See for example Algorithm 10.3.4. in [9])\n *\n *                  This function is used only as a subrutine of\n *                  ecp_mul_comb().\n *\n *                  Warning: fails (returning an error) if one of the points is\n *                  zero!\n *                  This should never happen, see choice of w in ecp_mul_comb().\n *\n * \\param grp       Pointer to the group representing the curve.\n *\n * \\param T         Array of pointers to the points to normalise.\n *\n * \\param t_len     Number of elements in the array.\n *\n * \\return          0 if successful,\n *                      an error if one of the points is zero.\n */\n#if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT)\nint mbedtls_internal_ecp_normalize_jac_many( const mbedtls_ecp_group *grp,\n        mbedtls_ecp_point *T[], size_t t_len );\n#endif\n\n/**\n * \\brief           Normalize jacobian coordinates so that Z == 0 || Z == 1.\n *\n *                  Cost in field operations if done by [5] 3.2.1:\n *                      1N := 1I + 3M + 1S\n *\n * \\param grp       Pointer to the group representing the curve.\n *\n * \\param pt        pointer to the point to be normalised. This is an\n *                  input/output parameter.\n *\n * \\return          0 if successful.\n */\n#if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT)\nint mbedtls_internal_ecp_normalize_jac( const mbedtls_ecp_group *grp,\n        mbedtls_ecp_point *pt );\n#endif\n\n#endif /* ECP_SHORTWEIERSTRASS */\n\n#if defined(ECP_MONTGOMERY)\n\n#if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT)\nint mbedtls_internal_ecp_double_add_mxz( const mbedtls_ecp_group *grp,\n        mbedtls_ecp_point *R, mbedtls_ecp_point *S, const mbedtls_ecp_point *P,\n        const mbedtls_ecp_point *Q, const mbedtls_mpi *d );\n#endif\n\n/**\n * \\brief           Randomize projective x/z coordinates:\n *                      (X, Z) -> (l X, l Z) for random l\n *\n * \\param grp       pointer to the group representing the curve\n *\n * \\param P         the point on the curve to be randomised given with\n *                  projective coordinates. This is an input/output parameter.\n *\n * \\param f_rng     a function pointer to the random number generator\n *\n * \\param p_rng     a pointer to the random number generator state\n *\n * \\return          0 if successful\n */\n#if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT)\nint mbedtls_internal_ecp_randomize_mxz( const mbedtls_ecp_group *grp,\n        mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t),\n        void *p_rng );\n#endif\n\n/**\n * \\brief           Normalize Montgomery x/z coordinates: X = X/Z, Z = 1.\n *\n * \\param grp       pointer to the group representing the curve\n *\n * \\param P         pointer to the point to be normalised. This is an\n *                  input/output parameter.\n *\n * \\return          0 if successful\n */\n#if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT)\nint mbedtls_internal_ecp_normalize_mxz( const mbedtls_ecp_group *grp,\n        mbedtls_ecp_point *P );\n#endif\n\n#endif /* ECP_MONTGOMERY */\n\n#endif /* MBEDTLS_ECP_INTERNAL_ALT */\n\n#endif /* ecp_internal.h */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/entropy.h",
    "content": "/**\n * \\file entropy.h\n *\n * \\brief Entropy accumulator implementation\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_ENTROPY_H\n#define MBEDTLS_ENTROPY_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n\n#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_ENTROPY_FORCE_SHA256)\n#include \"sha512.h\"\n#define MBEDTLS_ENTROPY_SHA512_ACCUMULATOR\n#else\n#if defined(MBEDTLS_SHA256_C)\n#define MBEDTLS_ENTROPY_SHA256_ACCUMULATOR\n#include \"sha256.h\"\n#endif\n#endif\n\n#if defined(MBEDTLS_THREADING_C)\n#include \"threading.h\"\n#endif\n\n#if defined(MBEDTLS_HAVEGE_C)\n#include \"havege.h\"\n#endif\n\n#define MBEDTLS_ERR_ENTROPY_SOURCE_FAILED                 -0x003C  /**< Critical entropy source failure. */\n#define MBEDTLS_ERR_ENTROPY_MAX_SOURCES                   -0x003E  /**< No more sources can be added. */\n#define MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED            -0x0040  /**< No sources have been added to poll. */\n#define MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE              -0x003D  /**< No strong sources have been added to poll. */\n#define MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR                 -0x003F  /**< Read/write error in file. */\n\n/**\n * \\name SECTION: Module settings\n *\n * The configuration options you can set for this module are in this section.\n * Either change them in config.h or define them on the compiler command line.\n * \\{\n */\n\n#if !defined(MBEDTLS_ENTROPY_MAX_SOURCES)\n#define MBEDTLS_ENTROPY_MAX_SOURCES     20      /**< Maximum number of sources supported */\n#endif\n\n#if !defined(MBEDTLS_ENTROPY_MAX_GATHER)\n#define MBEDTLS_ENTROPY_MAX_GATHER      128     /**< Maximum amount requested from entropy sources */\n#endif\n\n/* \\} name SECTION: Module settings */\n\n#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)\n#define MBEDTLS_ENTROPY_BLOCK_SIZE      64      /**< Block size of entropy accumulator (SHA-512) */\n#else\n#define MBEDTLS_ENTROPY_BLOCK_SIZE      32      /**< Block size of entropy accumulator (SHA-256) */\n#endif\n\n#define MBEDTLS_ENTROPY_MAX_SEED_SIZE   1024    /**< Maximum size of seed we read from seed file */\n#define MBEDTLS_ENTROPY_SOURCE_MANUAL   MBEDTLS_ENTROPY_MAX_SOURCES\n\n#define MBEDTLS_ENTROPY_SOURCE_STRONG   1       /**< Entropy source is strong   */\n#define MBEDTLS_ENTROPY_SOURCE_WEAK     0       /**< Entropy source is weak     */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief           Entropy poll callback pointer\n *\n * \\param data      Callback-specific data pointer\n * \\param output    Data to fill\n * \\param len       Maximum size to provide\n * \\param olen      The actual amount of bytes put into the buffer (Can be 0)\n *\n * \\return          0 if no critical failures occurred,\n *                  MBEDTLS_ERR_ENTROPY_SOURCE_FAILED otherwise\n */\ntypedef int (*mbedtls_entropy_f_source_ptr)(void *data, unsigned char *output, size_t len,\n                            size_t *olen);\n\n/**\n * \\brief           Entropy source state\n */\ntypedef struct\n{\n    mbedtls_entropy_f_source_ptr    f_source;   /**< The entropy source callback */\n    void *          p_source;   /**< The callback data pointer */\n    size_t          size;       /**< Amount received in bytes */\n    size_t          threshold;  /**< Minimum bytes required before release */\n    int             strong;     /**< Is the source strong? */\n}\nmbedtls_entropy_source_state;\n\n/**\n * \\brief           Entropy context structure\n */\ntypedef struct\n{\n#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)\n    mbedtls_sha512_context  accumulator;\n#else\n    mbedtls_sha256_context  accumulator;\n#endif\n    int             source_count;\n    mbedtls_entropy_source_state    source[MBEDTLS_ENTROPY_MAX_SOURCES];\n#if defined(MBEDTLS_HAVEGE_C)\n    mbedtls_havege_state    havege_data;\n#endif\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_threading_mutex_t mutex;    /*!< mutex                  */\n#endif\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\n    int initial_entropy_run;\n#endif\n}\nmbedtls_entropy_context;\n\n/**\n * \\brief           Initialize the context\n *\n * \\param ctx       Entropy context to initialize\n */\nvoid mbedtls_entropy_init( mbedtls_entropy_context *ctx );\n\n/**\n * \\brief           Free the data in the context\n *\n * \\param ctx       Entropy context to free\n */\nvoid mbedtls_entropy_free( mbedtls_entropy_context *ctx );\n\n/**\n * \\brief           Adds an entropy source to poll\n *                  (Thread-safe if MBEDTLS_THREADING_C is enabled)\n *\n * \\param ctx       Entropy context\n * \\param f_source  Entropy function\n * \\param p_source  Function data\n * \\param threshold Minimum required from source before entropy is released\n *                  ( with mbedtls_entropy_func() ) (in bytes)\n * \\param strong    MBEDTLS_ENTROPY_SOURCE_STRONG or\n *                  MBEDTSL_ENTROPY_SOURCE_WEAK.\n *                  At least one strong source needs to be added.\n *                  Weaker sources (such as the cycle counter) can be used as\n *                  a complement.\n *\n * \\return          0 if successful or MBEDTLS_ERR_ENTROPY_MAX_SOURCES\n */\nint mbedtls_entropy_add_source( mbedtls_entropy_context *ctx,\n                        mbedtls_entropy_f_source_ptr f_source, void *p_source,\n                        size_t threshold, int strong );\n\n/**\n * \\brief           Trigger an extra gather poll for the accumulator\n *                  (Thread-safe if MBEDTLS_THREADING_C is enabled)\n *\n * \\param ctx       Entropy context\n *\n * \\return          0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED\n */\nint mbedtls_entropy_gather( mbedtls_entropy_context *ctx );\n\n/**\n * \\brief           Retrieve entropy from the accumulator\n *                  (Maximum length: MBEDTLS_ENTROPY_BLOCK_SIZE)\n *                  (Thread-safe if MBEDTLS_THREADING_C is enabled)\n *\n * \\param data      Entropy context\n * \\param output    Buffer to fill\n * \\param len       Number of bytes desired, must be at most MBEDTLS_ENTROPY_BLOCK_SIZE\n *\n * \\return          0 if successful, or MBEDTLS_ERR_ENTROPY_SOURCE_FAILED\n */\nint mbedtls_entropy_func( void *data, unsigned char *output, size_t len );\n\n/**\n * \\brief           Add data to the accumulator manually\n *                  (Thread-safe if MBEDTLS_THREADING_C is enabled)\n *\n * \\param ctx       Entropy context\n * \\param data      Data to add\n * \\param len       Length of data\n *\n * \\return          0 if successful\n */\nint mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx,\n                           const unsigned char *data, size_t len );\n\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\n/**\n * \\brief           Trigger an update of the seed file in NV by using the\n *                  current entropy pool.\n *\n * \\param ctx       Entropy context\n *\n * \\return          0 if successful\n */\nint mbedtls_entropy_update_nv_seed( mbedtls_entropy_context *ctx );\n#endif /* MBEDTLS_ENTROPY_NV_SEED */\n\n#if defined(MBEDTLS_FS_IO)\n/**\n * \\brief               Write a seed file\n *\n * \\param ctx           Entropy context\n * \\param path          Name of the file\n *\n * \\return              0 if successful,\n *                      MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error, or\n *                      MBEDTLS_ERR_ENTROPY_SOURCE_FAILED\n */\nint mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path );\n\n/**\n * \\brief               Read and update a seed file. Seed is added to this\n *                      instance. No more than MBEDTLS_ENTROPY_MAX_SEED_SIZE bytes are\n *                      read from the seed file. The rest is ignored.\n *\n * \\param ctx           Entropy context\n * \\param path          Name of the file\n *\n * \\return              0 if successful,\n *                      MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR on file error,\n *                      MBEDTLS_ERR_ENTROPY_SOURCE_FAILED\n */\nint mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path );\n#endif /* MBEDTLS_FS_IO */\n\n#if defined(MBEDTLS_SELF_TEST)\n/**\n * \\brief          Checkup routine\n *\n *                 This module self-test also calls the entropy self-test,\n *                 mbedtls_entropy_source_self_test();\n *\n * \\return         0 if successful, or 1 if a test failed\n */\nint mbedtls_entropy_self_test( int verbose );\n\n#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)\n/**\n * \\brief          Checkup routine\n *\n *                 Verifies the integrity of the hardware entropy source\n *                 provided by the function 'mbedtls_hardware_poll()'.\n *\n *                 Note this is the only hardware entropy source that is known\n *                 at link time, and other entropy sources configured\n *                 dynamically at runtime by the function\n *                 mbedtls_entropy_add_source() will not be tested.\n *\n * \\return         0 if successful, or 1 if a test failed\n */\nint mbedtls_entropy_source_self_test( int verbose );\n#endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */\n#endif /* MBEDTLS_SELF_TEST */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* entropy.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/entropy_poll.h",
    "content": "/**\n * \\file entropy_poll.h\n *\n * \\brief Platform-specific and custom entropy polling functions\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_ENTROPY_POLL_H\n#define MBEDTLS_ENTROPY_POLL_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * Default thresholds for built-in sources, in bytes\n */\n#define MBEDTLS_ENTROPY_MIN_PLATFORM     32     /**< Minimum for platform source    */\n#define MBEDTLS_ENTROPY_MIN_HAVEGE       32     /**< Minimum for HAVEGE             */\n#define MBEDTLS_ENTROPY_MIN_HARDCLOCK     4     /**< Minimum for mbedtls_timing_hardclock()        */\n#if !defined(MBEDTLS_ENTROPY_MIN_HARDWARE)\n#define MBEDTLS_ENTROPY_MIN_HARDWARE     32     /**< Minimum for the hardware source */\n#endif\n\n/**\n * \\brief           Entropy poll callback that provides 0 entropy.\n */\n#if defined(MBEDTLS_TEST_NULL_ENTROPY)\n    int mbedtls_null_entropy_poll( void *data,\n                                unsigned char *output, size_t len, size_t *olen );\n#endif\n\n#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY)\n/**\n * \\brief           Platform-specific entropy poll callback\n */\nint mbedtls_platform_entropy_poll( void *data,\n                           unsigned char *output, size_t len, size_t *olen );\n#endif\n\n#if defined(MBEDTLS_HAVEGE_C)\n/**\n * \\brief           HAVEGE based entropy poll callback\n *\n * Requires an HAVEGE state as its data pointer.\n */\nint mbedtls_havege_poll( void *data,\n                 unsigned char *output, size_t len, size_t *olen );\n#endif\n\n#if defined(MBEDTLS_TIMING_C)\n/**\n * \\brief           mbedtls_timing_hardclock-based entropy poll callback\n */\nint mbedtls_hardclock_poll( void *data,\n                    unsigned char *output, size_t len, size_t *olen );\n#endif\n\n#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)\n/**\n * \\brief           Entropy poll callback for a hardware source\n *\n * \\warning         This is not provided by mbed TLS!\n *                  See \\c MBEDTLS_ENTROPY_HARDWARE_ALT in config.h.\n *\n * \\note            This must accept NULL as its first argument.\n */\nint mbedtls_hardware_poll( void *data,\n                           unsigned char *output, size_t len, size_t *olen );\n#endif\n\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\n/**\n * \\brief           Entropy poll callback for a non-volatile seed file\n *\n * \\note            This must accept NULL as its first argument.\n */\nint mbedtls_nv_seed_poll( void *data,\n                          unsigned char *output, size_t len, size_t *olen );\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* entropy_poll.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/error.h",
    "content": "/**\n * \\file error.h\n *\n * \\brief Error to string translation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_ERROR_H\n#define MBEDTLS_ERROR_H\n\n#include <stddef.h>\n\n/**\n * Error code layout.\n *\n * Currently we try to keep all error codes within the negative space of 16\n * bits signed integers to support all platforms (-0x0001 - -0x7FFF). In\n * addition we'd like to give two layers of information on the error if\n * possible.\n *\n * For that purpose the error codes are segmented in the following manner:\n *\n * 16 bit error code bit-segmentation\n *\n * 1 bit  - Unused (sign bit)\n * 3 bits - High level module ID\n * 5 bits - Module-dependent error code\n * 7 bits - Low level module errors\n *\n * For historical reasons, low-level error codes are divided in even and odd,\n * even codes were assigned first, and -1 is reserved for other errors.\n *\n * Low-level module errors (0x0002-0x007E, 0x0003-0x007F)\n *\n * Module   Nr  Codes assigned\n * MPI       7  0x0002-0x0010\n * GCM       2  0x0012-0x0014\n * BLOWFISH  2  0x0016-0x0018\n * THREADING 3  0x001A-0x001E\n * AES       2  0x0020-0x0022\n * CAMELLIA  2  0x0024-0x0026\n * XTEA      1  0x0028-0x0028\n * BASE64    2  0x002A-0x002C\n * OID       1  0x002E-0x002E   0x000B-0x000B\n * PADLOCK   1  0x0030-0x0030\n * DES       1  0x0032-0x0032\n * CTR_DBRG  4  0x0034-0x003A\n * ENTROPY   3  0x003C-0x0040   0x003D-0x003F\n * NET      11  0x0042-0x0052   0x0043-0x0045\n * ASN1      7  0x0060-0x006C\n * PBKDF2    1  0x007C-0x007C\n * HMAC_DRBG 4  0x0003-0x0009\n * CCM       2                  0x000D-0x000F\n *\n * High-level module nr (3 bits - 0x0...-0x7...)\n * Name      ID  Nr of Errors\n * PEM       1   9\n * PKCS#12   1   4 (Started from top)\n * X509      2   20\n * PKCS5     2   4 (Started from top)\n * DHM       3   9\n * PK        3   14 (Started from top)\n * RSA       4   9\n * ECP       4   8 (Started from top)\n * MD        5   4\n * CIPHER    6   6\n * SSL       6   17 (Started from top)\n * SSL       7   31\n *\n * Module dependent error code (5 bits 0x.00.-0x.F8.)\n */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief Translate a mbed TLS error code into a string representation,\n *        Result is truncated if necessary and always includes a terminating\n *        null byte.\n *\n * \\param errnum    error code\n * \\param buffer    buffer to place representation in\n * \\param buflen    length of the buffer\n */\nvoid mbedtls_strerror( int errnum, char *buffer, size_t buflen );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* error.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/gcm.h",
    "content": "/**\n * \\file gcm.h\n *\n * \\brief Galois/Counter mode for 128-bit block ciphers\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_GCM_H\n#define MBEDTLS_GCM_H\n\n#include \"cipher.h\"\n\n#include <stdint.h>\n\n#define MBEDTLS_GCM_ENCRYPT     1\n#define MBEDTLS_GCM_DECRYPT     0\n\n#define MBEDTLS_ERR_GCM_AUTH_FAILED                       -0x0012  /**< Authenticated decryption failed. */\n#define MBEDTLS_ERR_GCM_BAD_INPUT                         -0x0014  /**< Bad input parameters to function. */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          GCM context structure\n */\ntypedef struct {\n    mbedtls_cipher_context_t cipher_ctx;/*!< cipher context used */\n    uint64_t HL[16];            /*!< Precalculated HTable */\n    uint64_t HH[16];            /*!< Precalculated HTable */\n    uint64_t len;               /*!< Total data length */\n    uint64_t add_len;           /*!< Total add length */\n    unsigned char base_ectr[16];/*!< First ECTR for tag */\n    unsigned char y[16];        /*!< Y working value */\n    unsigned char buf[16];      /*!< buf working value */\n    int mode;                   /*!< Encrypt or Decrypt */\n}\nmbedtls_gcm_context;\n\n/**\n * \\brief           Initialize GCM context (just makes references valid)\n *                  Makes the context ready for mbedtls_gcm_setkey() or\n *                  mbedtls_gcm_free().\n *\n * \\param ctx       GCM context to initialize\n */\nvoid mbedtls_gcm_init( mbedtls_gcm_context *ctx );\n\n/**\n * \\brief           GCM initialization (encryption)\n *\n * \\param ctx       GCM context to be initialized\n * \\param cipher    cipher to use (a 128-bit block cipher)\n * \\param key       encryption key\n * \\param keybits   must be 128, 192 or 256\n *\n * \\return          0 if successful, or a cipher specific error code\n */\nint mbedtls_gcm_setkey( mbedtls_gcm_context *ctx,\n                        mbedtls_cipher_id_t cipher,\n                        const unsigned char *key,\n                        unsigned int keybits );\n\n/**\n * \\brief           GCM buffer encryption/decryption using a block cipher\n *\n * \\note On encryption, the output buffer can be the same as the input buffer.\n *       On decryption, the output buffer cannot be the same as input buffer.\n *       If buffers overlap, the output buffer must trail at least 8 bytes\n *       behind the input buffer.\n *\n * \\param ctx       GCM context\n * \\param mode      MBEDTLS_GCM_ENCRYPT or MBEDTLS_GCM_DECRYPT\n * \\param length    length of the input data\n * \\param iv        initialization vector\n * \\param iv_len    length of IV\n * \\param add       additional data\n * \\param add_len   length of additional data\n * \\param input     buffer holding the input data\n * \\param output    buffer for holding the output data\n * \\param tag_len   length of the tag to generate\n * \\param tag       buffer for holding the tag\n *\n * \\return         0 if successful\n */\nint mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx,\n                       int mode,\n                       size_t length,\n                       const unsigned char *iv,\n                       size_t iv_len,\n                       const unsigned char *add,\n                       size_t add_len,\n                       const unsigned char *input,\n                       unsigned char *output,\n                       size_t tag_len,\n                       unsigned char *tag );\n\n/**\n * \\brief           GCM buffer authenticated decryption using a block cipher\n *\n * \\note On decryption, the output buffer cannot be the same as input buffer.\n *       If buffers overlap, the output buffer must trail at least 8 bytes\n *       behind the input buffer.\n *\n * \\param ctx       GCM context\n * \\param length    length of the input data\n * \\param iv        initialization vector\n * \\param iv_len    length of IV\n * \\param add       additional data\n * \\param add_len   length of additional data\n * \\param tag       buffer holding the tag\n * \\param tag_len   length of the tag\n * \\param input     buffer holding the input data\n * \\param output    buffer for holding the output data\n *\n * \\return         0 if successful and authenticated,\n *                 MBEDTLS_ERR_GCM_AUTH_FAILED if tag does not match\n */\nint mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx,\n                      size_t length,\n                      const unsigned char *iv,\n                      size_t iv_len,\n                      const unsigned char *add,\n                      size_t add_len,\n                      const unsigned char *tag,\n                      size_t tag_len,\n                      const unsigned char *input,\n                      unsigned char *output );\n\n/**\n * \\brief           Generic GCM stream start function\n *\n * \\param ctx       GCM context\n * \\param mode      MBEDTLS_GCM_ENCRYPT or MBEDTLS_GCM_DECRYPT\n * \\param iv        initialization vector\n * \\param iv_len    length of IV\n * \\param add       additional data (or NULL if length is 0)\n * \\param add_len   length of additional data\n *\n * \\return         0 if successful\n */\nint mbedtls_gcm_starts( mbedtls_gcm_context *ctx,\n                int mode,\n                const unsigned char *iv,\n                size_t iv_len,\n                const unsigned char *add,\n                size_t add_len );\n\n/**\n * \\brief           Generic GCM update function. Encrypts/decrypts using the\n *                  given GCM context. Expects input to be a multiple of 16\n *                  bytes! Only the last call before mbedtls_gcm_finish() can be less\n *                  than 16 bytes!\n *\n * \\note On decryption, the output buffer cannot be the same as input buffer.\n *       If buffers overlap, the output buffer must trail at least 8 bytes\n *       behind the input buffer.\n *\n * \\param ctx       GCM context\n * \\param length    length of the input data\n * \\param input     buffer holding the input data\n * \\param output    buffer for holding the output data\n *\n * \\return         0 if successful or MBEDTLS_ERR_GCM_BAD_INPUT\n */\nint mbedtls_gcm_update( mbedtls_gcm_context *ctx,\n                size_t length,\n                const unsigned char *input,\n                unsigned char *output );\n\n/**\n * \\brief           Generic GCM finalisation function. Wraps up the GCM stream\n *                  and generates the tag. The tag can have a maximum length of\n *                  16 bytes.\n *\n * \\param ctx       GCM context\n * \\param tag       buffer for holding the tag\n * \\param tag_len   length of the tag to generate (must be at least 4)\n *\n * \\return          0 if successful or MBEDTLS_ERR_GCM_BAD_INPUT\n */\nint mbedtls_gcm_finish( mbedtls_gcm_context *ctx,\n                unsigned char *tag,\n                size_t tag_len );\n\n/**\n * \\brief           Free a GCM context and underlying cipher sub-context\n *\n * \\param ctx       GCM context to free\n */\nvoid mbedtls_gcm_free( mbedtls_gcm_context *ctx );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_gcm_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* gcm.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/havege.h",
    "content": "/**\n * \\file havege.h\n *\n * \\brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_HAVEGE_H\n#define MBEDTLS_HAVEGE_H\n\n#include <stddef.h>\n\n#define MBEDTLS_HAVEGE_COLLECT_SIZE 1024\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          HAVEGE state structure\n */\ntypedef struct\n{\n    int PT1, PT2, offset[2];\n    int pool[MBEDTLS_HAVEGE_COLLECT_SIZE];\n    int WALK[8192];\n}\nmbedtls_havege_state;\n\n/**\n * \\brief          HAVEGE initialization\n *\n * \\param hs       HAVEGE state to be initialized\n */\nvoid mbedtls_havege_init( mbedtls_havege_state *hs );\n\n/**\n * \\brief          Clear HAVEGE state\n *\n * \\param hs       HAVEGE state to be cleared\n */\nvoid mbedtls_havege_free( mbedtls_havege_state *hs );\n\n/**\n * \\brief          HAVEGE rand function\n *\n * \\param p_rng    A HAVEGE state\n * \\param output   Buffer to fill\n * \\param len      Length of buffer\n *\n * \\return         0\n */\nint mbedtls_havege_random( void *p_rng, unsigned char *output, size_t len );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* havege.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/hmac_drbg.h",
    "content": "/**\n * \\file hmac_drbg.h\n *\n * \\brief HMAC_DRBG (NIST SP 800-90A)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_HMAC_DRBG_H\n#define MBEDTLS_HMAC_DRBG_H\n\n#include \"md.h\"\n\n#if defined(MBEDTLS_THREADING_C)\n#include \"mbedtls/threading.h\"\n#endif\n\n/*\n * Error codes\n */\n#define MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG              -0x0003  /**< Too many random requested in single call. */\n#define MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG                -0x0005  /**< Input too large (Entropy + additional). */\n#define MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR                -0x0007  /**< Read/write error in file. */\n#define MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED        -0x0009  /**< The entropy source failed. */\n\n/**\n * \\name SECTION: Module settings\n *\n * The configuration options you can set for this module are in this section.\n * Either change them in config.h or define them on the compiler command line.\n * \\{\n */\n\n#if !defined(MBEDTLS_HMAC_DRBG_RESEED_INTERVAL)\n#define MBEDTLS_HMAC_DRBG_RESEED_INTERVAL   10000   /**< Interval before reseed is performed by default */\n#endif\n\n#if !defined(MBEDTLS_HMAC_DRBG_MAX_INPUT)\n#define MBEDTLS_HMAC_DRBG_MAX_INPUT         256     /**< Maximum number of additional input bytes */\n#endif\n\n#if !defined(MBEDTLS_HMAC_DRBG_MAX_REQUEST)\n#define MBEDTLS_HMAC_DRBG_MAX_REQUEST       1024    /**< Maximum number of requested bytes per call */\n#endif\n\n#if !defined(MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT)\n#define MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT    384     /**< Maximum size of (re)seed buffer */\n#endif\n\n/* \\} name SECTION: Module settings */\n\n#define MBEDTLS_HMAC_DRBG_PR_OFF   0   /**< No prediction resistance       */\n#define MBEDTLS_HMAC_DRBG_PR_ON    1   /**< Prediction resistance enabled  */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * HMAC_DRBG context.\n */\ntypedef struct\n{\n    /* Working state: the key K is not stored explicitely,\n     * but is implied by the HMAC context */\n    mbedtls_md_context_t md_ctx;                    /*!< HMAC context (inc. K)  */\n    unsigned char V[MBEDTLS_MD_MAX_SIZE];  /*!< V in the spec          */\n    int reseed_counter;                     /*!< reseed counter         */\n\n    /* Administrative state */\n    size_t entropy_len;         /*!< entropy bytes grabbed on each (re)seed */\n    int prediction_resistance;  /*!< enable prediction resistance (Automatic\n                                     reseed before every random generation) */\n    int reseed_interval;        /*!< reseed interval   */\n\n    /* Callbacks */\n    int (*f_entropy)(void *, unsigned char *, size_t); /*!< entropy function */\n    void *p_entropy;            /*!< context for the entropy function        */\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_threading_mutex_t mutex;\n#endif\n} mbedtls_hmac_drbg_context;\n\n/**\n * \\brief               HMAC_DRBG context initialization\n *                      Makes the context ready for mbedtls_hmac_drbg_seed(),\n *                      mbedtls_hmac_drbg_seed_buf() or\n *                      mbedtls_hmac_drbg_free().\n *\n * \\param ctx           HMAC_DRBG context to be initialized\n */\nvoid mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx );\n\n/**\n * \\brief               HMAC_DRBG initial seeding\n *                      Seed and setup entropy source for future reseeds.\n *\n * \\param ctx           HMAC_DRBG context to be seeded\n * \\param md_info       MD algorithm to use for HMAC_DRBG\n * \\param f_entropy     Entropy callback (p_entropy, buffer to fill, buffer\n *                      length)\n * \\param p_entropy     Entropy context\n * \\param custom        Personalization data (Device specific identifiers)\n *                      (Can be NULL)\n * \\param len           Length of personalization data\n *\n * \\note                The \"security strength\" as defined by NIST is set to:\n *                      128 bits if md_alg is SHA-1,\n *                      192 bits if md_alg is SHA-224,\n *                      256 bits if md_alg is SHA-256 or higher.\n *                      Note that SHA-256 is just as efficient as SHA-224.\n *\n * \\return              0 if successful, or\n *                      MBEDTLS_ERR_MD_BAD_INPUT_DATA, or\n *                      MBEDTLS_ERR_MD_ALLOC_FAILED, or\n *                      MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED.\n */\nint mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx,\n                    const mbedtls_md_info_t * md_info,\n                    int (*f_entropy)(void *, unsigned char *, size_t),\n                    void *p_entropy,\n                    const unsigned char *custom,\n                    size_t len );\n\n/**\n * \\brief               Initilisation of simpified HMAC_DRBG (never reseeds).\n *                      (For use with deterministic ECDSA.)\n *\n * \\param ctx           HMAC_DRBG context to be initialised\n * \\param md_info       MD algorithm to use for HMAC_DRBG\n * \\param data          Concatenation of entropy string and additional data\n * \\param data_len      Length of data in bytes\n *\n * \\return              0 if successful, or\n *                      MBEDTLS_ERR_MD_BAD_INPUT_DATA, or\n *                      MBEDTLS_ERR_MD_ALLOC_FAILED.\n */\nint mbedtls_hmac_drbg_seed_buf( mbedtls_hmac_drbg_context *ctx,\n                        const mbedtls_md_info_t * md_info,\n                        const unsigned char *data, size_t data_len );\n\n/**\n * \\brief               Enable / disable prediction resistance (Default: Off)\n *\n * Note: If enabled, entropy is used for ctx->entropy_len before each call!\n *       Only use this if you have ample supply of good entropy!\n *\n * \\param ctx           HMAC_DRBG context\n * \\param resistance    MBEDTLS_HMAC_DRBG_PR_ON or MBEDTLS_HMAC_DRBG_PR_OFF\n */\nvoid mbedtls_hmac_drbg_set_prediction_resistance( mbedtls_hmac_drbg_context *ctx,\n                                          int resistance );\n\n/**\n * \\brief               Set the amount of entropy grabbed on each reseed\n *                      (Default: given by the security strength, which\n *                      depends on the hash used, see \\c mbedtls_hmac_drbg_init() )\n *\n * \\param ctx           HMAC_DRBG context\n * \\param len           Amount of entropy to grab, in bytes\n */\nvoid mbedtls_hmac_drbg_set_entropy_len( mbedtls_hmac_drbg_context *ctx,\n                                size_t len );\n\n/**\n * \\brief               Set the reseed interval\n *                      (Default: MBEDTLS_HMAC_DRBG_RESEED_INTERVAL)\n *\n * \\param ctx           HMAC_DRBG context\n * \\param interval      Reseed interval\n */\nvoid mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx,\n                                    int interval );\n\n/**\n * \\brief               HMAC_DRBG update state\n *\n * \\param ctx           HMAC_DRBG context\n * \\param additional    Additional data to update state with, or NULL\n * \\param add_len       Length of additional data, or 0\n *\n * \\note                Additional data is optional, pass NULL and 0 as second\n *                      third argument if no additional data is being used.\n */\nvoid mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx,\n                       const unsigned char *additional, size_t add_len );\n\n/**\n * \\brief               HMAC_DRBG reseeding (extracts data from entropy source)\n *\n * \\param ctx           HMAC_DRBG context\n * \\param additional    Additional data to add to state (Can be NULL)\n * \\param len           Length of additional data\n *\n * \\return              0 if successful, or\n *                      MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED\n */\nint mbedtls_hmac_drbg_reseed( mbedtls_hmac_drbg_context *ctx,\n                      const unsigned char *additional, size_t len );\n\n/**\n * \\brief               HMAC_DRBG generate random with additional update input\n *\n * Note: Automatically reseeds if reseed_counter is reached or PR is enabled.\n *\n * \\param p_rng         HMAC_DRBG context\n * \\param output        Buffer to fill\n * \\param output_len    Length of the buffer\n * \\param additional    Additional data to update with (can be NULL)\n * \\param add_len       Length of additional data (can be 0)\n *\n * \\return              0 if successful, or\n *                      MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED, or\n *                      MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG, or\n *                      MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG.\n */\nint mbedtls_hmac_drbg_random_with_add( void *p_rng,\n                               unsigned char *output, size_t output_len,\n                               const unsigned char *additional,\n                               size_t add_len );\n\n/**\n * \\brief               HMAC_DRBG generate random\n *\n * Note: Automatically reseeds if reseed_counter is reached or PR is enabled.\n *\n * \\param p_rng         HMAC_DRBG context\n * \\param output        Buffer to fill\n * \\param out_len       Length of the buffer\n *\n * \\return              0 if successful, or\n *                      MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED, or\n *                      MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG\n */\nint mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len );\n\n/**\n * \\brief               Free an HMAC_DRBG context\n *\n * \\param ctx           HMAC_DRBG context to free.\n */\nvoid mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx );\n\n#if defined(MBEDTLS_FS_IO)\n/**\n * \\brief               Write a seed file\n *\n * \\param ctx           HMAC_DRBG context\n * \\param path          Name of the file\n *\n * \\return              0 if successful, 1 on file error, or\n *                      MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED\n */\nint mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path );\n\n/**\n * \\brief               Read and update a seed file. Seed is added to this\n *                      instance\n *\n * \\param ctx           HMAC_DRBG context\n * \\param path          Name of the file\n *\n * \\return              0 if successful, 1 on file error,\n *                      MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED or\n *                      MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG\n */\nint mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path );\n#endif /* MBEDTLS_FS_IO */\n\n\n#if defined(MBEDTLS_SELF_TEST)\n/**\n * \\brief               Checkup routine\n *\n * \\return              0 if successful, or 1 if the test failed\n */\nint mbedtls_hmac_drbg_self_test( int verbose );\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* hmac_drbg.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/md.h",
    "content": "/**\n * \\file md.h\n *\n * \\brief Generic message digest wrapper\n *\n * \\author Adriaan de Jong <dejong@fox-it.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_MD_H\n#define MBEDTLS_MD_H\n\n#include <stddef.h>\n\n#define MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE                -0x5080  /**< The selected feature is not available. */\n#define MBEDTLS_ERR_MD_BAD_INPUT_DATA                     -0x5100  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_MD_ALLOC_FAILED                       -0x5180  /**< Failed to allocate memory. */\n#define MBEDTLS_ERR_MD_FILE_IO_ERROR                      -0x5200  /**< Opening or reading of file failed. */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    MBEDTLS_MD_NONE=0,\n    MBEDTLS_MD_MD2,\n    MBEDTLS_MD_MD4,\n    MBEDTLS_MD_MD5,\n    MBEDTLS_MD_SHA1,\n    MBEDTLS_MD_SHA224,\n    MBEDTLS_MD_SHA256,\n    MBEDTLS_MD_SHA384,\n    MBEDTLS_MD_SHA512,\n    MBEDTLS_MD_RIPEMD160,\n} mbedtls_md_type_t;\n\n#if defined(MBEDTLS_SHA512_C)\n#define MBEDTLS_MD_MAX_SIZE         64  /* longest known is SHA512 */\n#else\n#define MBEDTLS_MD_MAX_SIZE         32  /* longest known is SHA256 or less */\n#endif\n\n/**\n * Opaque struct defined in md_internal.h\n */\ntypedef struct mbedtls_md_info_t mbedtls_md_info_t;\n\n/**\n * Generic message digest context.\n */\ntypedef struct {\n    /** Information about the associated message digest */\n    const mbedtls_md_info_t *md_info;\n\n    /** Digest-specific context */\n    void *md_ctx;\n\n    /** HMAC part of the context */\n    void *hmac_ctx;\n} mbedtls_md_context_t;\n\n/**\n * \\brief Returns the list of digests supported by the generic digest module.\n *\n * \\return          a statically allocated array of digests, the last entry\n *                  is 0.\n */\nconst int *mbedtls_md_list( void );\n\n/**\n * \\brief           Returns the message digest information associated with the\n *                  given digest name.\n *\n * \\param md_name   Name of the digest to search for.\n *\n * \\return          The message digest information associated with md_name or\n *                  NULL if not found.\n */\nconst mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name );\n\n/**\n * \\brief           Returns the message digest information associated with the\n *                  given digest type.\n *\n * \\param md_type   type of digest to search for.\n *\n * \\return          The message digest information associated with md_type or\n *                  NULL if not found.\n */\nconst mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type );\n\n/**\n * \\brief           Initialize a md_context (as NONE)\n *                  This should always be called first.\n *                  Prepares the context for mbedtls_md_setup() or mbedtls_md_free().\n */\nvoid mbedtls_md_init( mbedtls_md_context_t *ctx );\n\n/**\n * \\brief           Free and clear the internal structures of ctx.\n *                  Can be called at any time after mbedtls_md_init().\n *                  Mandatory once mbedtls_md_setup() has been called.\n */\nvoid mbedtls_md_free( mbedtls_md_context_t *ctx );\n\n#if ! defined(MBEDTLS_DEPRECATED_REMOVED)\n#if defined(MBEDTLS_DEPRECATED_WARNING)\n#define MBEDTLS_DEPRECATED    __attribute__((deprecated))\n#else\n#define MBEDTLS_DEPRECATED\n#endif\n/**\n * \\brief           Select MD to use and allocate internal structures.\n *                  Should be called after mbedtls_md_init() or mbedtls_md_free().\n *                  Makes it necessary to call mbedtls_md_free() later.\n *\n * \\deprecated      Superseded by mbedtls_md_setup() in 2.0.0\n *\n * \\param ctx       Context to set up.\n * \\param md_info   Message digest to use.\n *\n * \\returns         \\c 0 on success,\n *                  \\c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure,\n *                  \\c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure.\n */\nint mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info ) MBEDTLS_DEPRECATED;\n#undef MBEDTLS_DEPRECATED\n#endif /* MBEDTLS_DEPRECATED_REMOVED */\n\n/**\n * \\brief           Select MD to use and allocate internal structures.\n *                  Should be called after mbedtls_md_init() or mbedtls_md_free().\n *                  Makes it necessary to call mbedtls_md_free() later.\n *\n * \\param ctx       Context to set up.\n * \\param md_info   Message digest to use.\n * \\param hmac      0 to save some memory if HMAC will not be used,\n *                  non-zero is HMAC is going to be used with this context.\n *\n * \\returns         \\c 0 on success,\n *                  \\c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure,\n *                  \\c MBEDTLS_ERR_MD_ALLOC_FAILED memory allocation failure.\n */\nint mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac );\n\n/**\n * \\brief           Clone the state of an MD context\n *\n * \\note            The two contexts must have been setup to the same type\n *                  (cloning from SHA-256 to SHA-512 make no sense).\n *\n * \\warning         Only clones the MD state, not the HMAC state! (for now)\n *\n * \\param dst       The destination context\n * \\param src       The context to be cloned\n *\n * \\return          \\c 0 on success,\n *                  \\c MBEDTLS_ERR_MD_BAD_INPUT_DATA on parameter failure.\n */\nint mbedtls_md_clone( mbedtls_md_context_t *dst,\n                      const mbedtls_md_context_t *src );\n\n/**\n * \\brief           Returns the size of the message digest output.\n *\n * \\param md_info   message digest info\n *\n * \\return          size of the message digest output in bytes.\n */\nunsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info );\n\n/**\n * \\brief           Returns the type of the message digest output.\n *\n * \\param md_info   message digest info\n *\n * \\return          type of the message digest output.\n */\nmbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info );\n\n/**\n * \\brief           Returns the name of the message digest output.\n *\n * \\param md_info   message digest info\n *\n * \\return          name of the message digest output.\n */\nconst char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info );\n\n/**\n * \\brief           Prepare the context to digest a new message.\n *                  Generally called after mbedtls_md_setup() or mbedtls_md_finish().\n *                  Followed by mbedtls_md_update().\n *\n * \\param ctx       generic message digest context.\n *\n * \\returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                  verification fails.\n */\nint mbedtls_md_starts( mbedtls_md_context_t *ctx );\n\n/**\n * \\brief           Generic message digest process buffer\n *                  Called between mbedtls_md_starts() and mbedtls_md_finish().\n *                  May be called repeatedly.\n *\n * \\param ctx       Generic message digest context\n * \\param input     buffer holding the  datal\n * \\param ilen      length of the input data\n *\n * \\returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                  verification fails.\n */\nint mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen );\n\n/**\n * \\brief           Generic message digest final digest\n *                  Called after mbedtls_md_update().\n *                  Usually followed by mbedtls_md_free() or mbedtls_md_starts().\n *\n * \\param ctx       Generic message digest context\n * \\param output    Generic message digest checksum result\n *\n * \\returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                  verification fails.\n */\nint mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output );\n\n/**\n * \\brief          Output = message_digest( input buffer )\n *\n * \\param md_info  message digest info\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   Generic message digest checksum result\n *\n * \\returns        0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                 verification fails.\n */\nint mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,\n        unsigned char *output );\n\n#if defined(MBEDTLS_FS_IO)\n/**\n * \\brief          Output = message_digest( file contents )\n *\n * \\param md_info  message digest info\n * \\param path     input file name\n * \\param output   generic message digest checksum result\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_MD_FILE_IO_ERROR if file input failed,\n *                 MBEDTLS_ERR_MD_BAD_INPUT_DATA if md_info was NULL.\n */\nint mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path,\n                     unsigned char *output );\n#endif /* MBEDTLS_FS_IO */\n\n/**\n * \\brief           Set HMAC key and prepare to authenticate a new message.\n *                  Usually called after mbedtls_md_setup() or mbedtls_md_hmac_finish().\n *\n * \\param ctx       HMAC context\n * \\param key       HMAC secret key\n * \\param keylen    length of the HMAC key in bytes\n *\n * \\returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                  verification fails.\n */\nint mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key,\n                    size_t keylen );\n\n/**\n * \\brief           Generic HMAC process buffer.\n *                  Called between mbedtls_md_hmac_starts() or mbedtls_md_hmac_reset()\n *                  and mbedtls_md_hmac_finish().\n *                  May be called repeatedly.\n *\n * \\param ctx       HMAC context\n * \\param input     buffer holding the  data\n * \\param ilen      length of the input data\n *\n * \\returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                  verification fails.\n */\nint mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input,\n                    size_t ilen );\n\n/**\n * \\brief           Output HMAC.\n *                  Called after mbedtls_md_hmac_update().\n *                  Usually followed by mbedtls_md_hmac_reset(),\n *                  mbedtls_md_hmac_starts(), or mbedtls_md_free().\n *\n * \\param ctx       HMAC context\n * \\param output    Generic HMAC checksum result\n *\n * \\returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                  verification fails.\n */\nint mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output);\n\n/**\n * \\brief           Prepare to authenticate a new message with the same key.\n *                  Called after mbedtls_md_hmac_finish() and before\n *                  mbedtls_md_hmac_update().\n *\n * \\param ctx       HMAC context to be reset\n *\n * \\returns         0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                  verification fails.\n */\nint mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx );\n\n/**\n * \\brief          Output = Generic_HMAC( hmac key, input buffer )\n *\n * \\param md_info  message digest info\n * \\param key      HMAC secret key\n * \\param keylen   length of the HMAC key in bytes\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   Generic HMAC-result\n *\n * \\returns        0 on success, MBEDTLS_ERR_MD_BAD_INPUT_DATA if parameter\n *                 verification fails.\n */\nint mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen,\n                const unsigned char *input, size_t ilen,\n                unsigned char *output );\n\n/* Internal use */\nint mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_MD_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/md2.h",
    "content": "/**\n * \\file md2.h\n *\n * \\brief MD2 message digest algorithm (hash function)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_MD2_H\n#define MBEDTLS_MD2_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n\n#if !defined(MBEDTLS_MD2_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          MD2 context structure\n */\ntypedef struct\n{\n    unsigned char cksum[16];    /*!< checksum of the data block */\n    unsigned char state[48];    /*!< intermediate digest state  */\n    unsigned char buffer[16];   /*!< data block being processed */\n    size_t left;                /*!< amount of data in buffer   */\n}\nmbedtls_md2_context;\n\n/**\n * \\brief          Initialize MD2 context\n *\n * \\param ctx      MD2 context to be initialized\n */\nvoid mbedtls_md2_init( mbedtls_md2_context *ctx );\n\n/**\n * \\brief          Clear MD2 context\n *\n * \\param ctx      MD2 context to be cleared\n */\nvoid mbedtls_md2_free( mbedtls_md2_context *ctx );\n\n/**\n * \\brief          Clone (the state of) an MD2 context\n *\n * \\param dst      The destination context\n * \\param src      The context to be cloned\n */\nvoid mbedtls_md2_clone( mbedtls_md2_context *dst,\n                        const mbedtls_md2_context *src );\n\n/**\n * \\brief          MD2 context setup\n *\n * \\param ctx      context to be initialized\n */\nvoid mbedtls_md2_starts( mbedtls_md2_context *ctx );\n\n/**\n * \\brief          MD2 process buffer\n *\n * \\param ctx      MD2 context\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n */\nvoid mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen );\n\n/**\n * \\brief          MD2 final digest\n *\n * \\param ctx      MD2 context\n * \\param output   MD2 checksum result\n */\nvoid mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_MD2_ALT */\n#include \"md2_alt.h\"\n#endif /* MBEDTLS_MD2_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Output = MD2( input buffer )\n *\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   MD2 checksum result\n */\nvoid mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_md2_self_test( int verbose );\n\n/* Internal use */\nvoid mbedtls_md2_process( mbedtls_md2_context *ctx );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* mbedtls_md2.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/md4.h",
    "content": "/**\n * \\file md4.h\n *\n * \\brief MD4 message digest algorithm (hash function)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_MD4_H\n#define MBEDTLS_MD4_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if !defined(MBEDTLS_MD4_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          MD4 context structure\n */\ntypedef struct\n{\n    uint32_t total[2];          /*!< number of bytes processed  */\n    uint32_t state[4];          /*!< intermediate digest state  */\n    unsigned char buffer[64];   /*!< data block being processed */\n}\nmbedtls_md4_context;\n\n/**\n * \\brief          Initialize MD4 context\n *\n * \\param ctx      MD4 context to be initialized\n */\nvoid mbedtls_md4_init( mbedtls_md4_context *ctx );\n\n/**\n * \\brief          Clear MD4 context\n *\n * \\param ctx      MD4 context to be cleared\n */\nvoid mbedtls_md4_free( mbedtls_md4_context *ctx );\n\n/**\n * \\brief          Clone (the state of) an MD4 context\n *\n * \\param dst      The destination context\n * \\param src      The context to be cloned\n */\nvoid mbedtls_md4_clone( mbedtls_md4_context *dst,\n                        const mbedtls_md4_context *src );\n\n/**\n * \\brief          MD4 context setup\n *\n * \\param ctx      context to be initialized\n */\nvoid mbedtls_md4_starts( mbedtls_md4_context *ctx );\n\n/**\n * \\brief          MD4 process buffer\n *\n * \\param ctx      MD4 context\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n */\nvoid mbedtls_md4_update( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen );\n\n/**\n * \\brief          MD4 final digest\n *\n * \\param ctx      MD4 context\n * \\param output   MD4 checksum result\n */\nvoid mbedtls_md4_finish( mbedtls_md4_context *ctx, unsigned char output[16] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_MD4_ALT */\n#include \"md4_alt.h\"\n#endif /* MBEDTLS_MD4_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Output = MD4( input buffer )\n *\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   MD4 checksum result\n */\nvoid mbedtls_md4( const unsigned char *input, size_t ilen, unsigned char output[16] );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_md4_self_test( int verbose );\n\n/* Internal use */\nvoid mbedtls_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* mbedtls_md4.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/md5.h",
    "content": "/**\n * \\file md5.h\n *\n * \\brief MD5 message digest algorithm (hash function)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_MD5_H\n#define MBEDTLS_MD5_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if !defined(MBEDTLS_MD5_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          MD5 context structure\n */\ntypedef struct\n{\n    uint32_t total[2];          /*!< number of bytes processed  */\n    uint32_t state[4];          /*!< intermediate digest state  */\n    unsigned char buffer[64];   /*!< data block being processed */\n}\nmbedtls_md5_context;\n\n/**\n * \\brief          Initialize MD5 context\n *\n * \\param ctx      MD5 context to be initialized\n */\nvoid mbedtls_md5_init( mbedtls_md5_context *ctx );\n\n/**\n * \\brief          Clear MD5 context\n *\n * \\param ctx      MD5 context to be cleared\n */\nvoid mbedtls_md5_free( mbedtls_md5_context *ctx );\n\n/**\n * \\brief          Clone (the state of) an MD5 context\n *\n * \\param dst      The destination context\n * \\param src      The context to be cloned\n */\nvoid mbedtls_md5_clone( mbedtls_md5_context *dst,\n                        const mbedtls_md5_context *src );\n\n/**\n * \\brief          MD5 context setup\n *\n * \\param ctx      context to be initialized\n */\nvoid mbedtls_md5_starts( mbedtls_md5_context *ctx );\n\n/**\n * \\brief          MD5 process buffer\n *\n * \\param ctx      MD5 context\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n */\nvoid mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen );\n\n/**\n * \\brief          MD5 final digest\n *\n * \\param ctx      MD5 context\n * \\param output   MD5 checksum result\n */\nvoid mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] );\n\n/* Internal use */\nvoid mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_MD5_ALT */\n#include \"md5_alt.h\"\n#endif /* MBEDTLS_MD5_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Output = MD5( input buffer )\n *\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   MD5 checksum result\n */\nvoid mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_md5_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* mbedtls_md5.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/md_internal.h",
    "content": "/**\n * \\file md_internal.h\n *\n * \\brief Message digest wrappers.\n *\n * \\warning This in an internal header. Do not include directly.\n *\n * \\author Adriaan de Jong <dejong@fox-it.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_MD_WRAP_H\n#define MBEDTLS_MD_WRAP_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"md.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * Message digest information.\n * Allows message digest functions to be called in a generic way.\n */\nstruct mbedtls_md_info_t\n{\n    /** Digest identifier */\n    mbedtls_md_type_t type;\n\n    /** Name of the message digest */\n    const char * name;\n\n    /** Output length of the digest function in bytes */\n    int size;\n\n    /** Block length of the digest function in bytes */\n    int block_size;\n\n    /** Digest initialisation function */\n    void (*starts_func)( void *ctx );\n\n    /** Digest update function */\n    void (*update_func)( void *ctx, const unsigned char *input, size_t ilen );\n\n    /** Digest finalisation function */\n    void (*finish_func)( void *ctx, unsigned char *output );\n\n    /** Generic digest function */\n    void (*digest_func)( const unsigned char *input, size_t ilen,\n                         unsigned char *output );\n\n    /** Allocate a new context */\n    void * (*ctx_alloc_func)( void );\n\n    /** Free the given context */\n    void (*ctx_free_func)( void *ctx );\n\n    /** Clone state from a context */\n    void (*clone_func)( void *dst, const void *src );\n\n    /** Internal use only */\n    void (*process_func)( void *ctx, const unsigned char *input );\n};\n\n#if defined(MBEDTLS_MD2_C)\nextern const mbedtls_md_info_t mbedtls_md2_info;\n#endif\n#if defined(MBEDTLS_MD4_C)\nextern const mbedtls_md_info_t mbedtls_md4_info;\n#endif\n#if defined(MBEDTLS_MD5_C)\nextern const mbedtls_md_info_t mbedtls_md5_info;\n#endif\n#if defined(MBEDTLS_RIPEMD160_C)\nextern const mbedtls_md_info_t mbedtls_ripemd160_info;\n#endif\n#if defined(MBEDTLS_SHA1_C)\nextern const mbedtls_md_info_t mbedtls_sha1_info;\n#endif\n#if defined(MBEDTLS_SHA256_C)\nextern const mbedtls_md_info_t mbedtls_sha224_info;\nextern const mbedtls_md_info_t mbedtls_sha256_info;\n#endif\n#if defined(MBEDTLS_SHA512_C)\nextern const mbedtls_md_info_t mbedtls_sha384_info;\nextern const mbedtls_md_info_t mbedtls_sha512_info;\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_MD_WRAP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/memory_buffer_alloc.h",
    "content": "/**\n * \\file memory_buffer_alloc.h\n *\n * \\brief Buffer-based memory allocator\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_MEMORY_BUFFER_ALLOC_H\n#define MBEDTLS_MEMORY_BUFFER_ALLOC_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n\n/**\n * \\name SECTION: Module settings\n *\n * The configuration options you can set for this module are in this section.\n * Either change them in config.h or define them on the compiler command line.\n * \\{\n */\n\n#if !defined(MBEDTLS_MEMORY_ALIGN_MULTIPLE)\n#define MBEDTLS_MEMORY_ALIGN_MULTIPLE       4 /**< Align on multiples of this value */\n#endif\n\n/* \\} name SECTION: Module settings */\n\n#define MBEDTLS_MEMORY_VERIFY_NONE         0\n#define MBEDTLS_MEMORY_VERIFY_ALLOC        (1 << 0)\n#define MBEDTLS_MEMORY_VERIFY_FREE         (1 << 1)\n#define MBEDTLS_MEMORY_VERIFY_ALWAYS       (MBEDTLS_MEMORY_VERIFY_ALLOC | MBEDTLS_MEMORY_VERIFY_FREE)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief   Initialize use of stack-based memory allocator.\n *          The stack-based allocator does memory management inside the\n *          presented buffer and does not call calloc() and free().\n *          It sets the global mbedtls_calloc() and mbedtls_free() pointers\n *          to its own functions.\n *          (Provided mbedtls_calloc() and mbedtls_free() are thread-safe if\n *           MBEDTLS_THREADING_C is defined)\n *\n * \\note    This code is not optimized and provides a straight-forward\n *          implementation of a stack-based memory allocator.\n *\n * \\param buf   buffer to use as heap\n * \\param len   size of the buffer\n */\nvoid mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len );\n\n/**\n * \\brief   Free the mutex for thread-safety and clear remaining memory\n */\nvoid mbedtls_memory_buffer_alloc_free( void );\n\n/**\n * \\brief   Determine when the allocator should automatically verify the state\n *          of the entire chain of headers / meta-data.\n *          (Default: MBEDTLS_MEMORY_VERIFY_NONE)\n *\n * \\param verify    One of MBEDTLS_MEMORY_VERIFY_NONE, MBEDTLS_MEMORY_VERIFY_ALLOC,\n *                  MBEDTLS_MEMORY_VERIFY_FREE or MBEDTLS_MEMORY_VERIFY_ALWAYS\n */\nvoid mbedtls_memory_buffer_set_verify( int verify );\n\n#if defined(MBEDTLS_MEMORY_DEBUG)\n/**\n * \\brief   Print out the status of the allocated memory (primarily for use\n *          after a program should have de-allocated all memory)\n *          Prints out a list of 'still allocated' blocks and their stack\n *          trace if MBEDTLS_MEMORY_BACKTRACE is defined.\n */\nvoid mbedtls_memory_buffer_alloc_status( void );\n\n/**\n * \\brief   Get the peak heap usage so far\n *\n * \\param max_used      Peak number of bytes in use or committed. This\n *                      includes bytes in allocated blocks too small to split\n *                      into smaller blocks but larger than the requested size.\n * \\param max_blocks    Peak number of blocks in use, including free and used\n */\nvoid mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks );\n\n/**\n * \\brief   Reset peak statistics\n */\nvoid mbedtls_memory_buffer_alloc_max_reset( void );\n\n/**\n * \\brief   Get the current heap usage\n *\n * \\param cur_used      Current number of bytes in use or committed. This\n *                      includes bytes in allocated blocks too small to split\n *                      into smaller blocks but larger than the requested size.\n * \\param cur_blocks    Current number of blocks in use, including free and used\n */\nvoid mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks );\n#endif /* MBEDTLS_MEMORY_DEBUG */\n\n/**\n * \\brief   Verifies that all headers in the memory buffer are correct\n *          and contain sane values. Helps debug buffer-overflow errors.\n *\n *          Prints out first failure if MBEDTLS_MEMORY_DEBUG is defined.\n *          Prints out full header information if MBEDTLS_MEMORY_DEBUG\n *          is defined. (Includes stack trace information for each block if\n *          MBEDTLS_MEMORY_BACKTRACE is defined as well).\n *\n * \\return             0 if verified, 1 otherwise\n */\nint mbedtls_memory_buffer_alloc_verify( void );\n\n#if defined(MBEDTLS_SELF_TEST)\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if a test failed\n */\nint mbedtls_memory_buffer_alloc_self_test( int verbose );\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* memory_buffer_alloc.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/net.h",
    "content": "/**\n * \\file net.h\n *\n * \\brief Deprecated header file that includes mbedtls/net_sockets.h\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n *\n * \\deprecated Superseded by mbedtls/net_sockets.h\n */\n\n#if !defined(MBEDTLS_DEPRECATED_REMOVED)\n#include \"mbedtls/net_sockets.h\"\n#if defined(MBEDTLS_DEPRECATED_WARNING)\n#warning \"Deprecated header file: Superseded by mbedtls/net_sockets.h\"\n#endif /* MBEDTLS_DEPRECATED_WARNING */\n#endif /* !MBEDTLS_DEPRECATED_REMOVED */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/net_sockets.h",
    "content": "/**\n * \\file net_sockets.h\n *\n * \\brief Network communication functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_NET_SOCKETS_H\n#define MBEDTLS_NET_SOCKETS_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"ssl.h\"\n\n#include <stddef.h>\n#include <stdint.h>\n\n#define MBEDTLS_ERR_NET_SOCKET_FAILED                     -0x0042  /**< Failed to open a socket. */\n#define MBEDTLS_ERR_NET_CONNECT_FAILED                    -0x0044  /**< The connection to the given server / port failed. */\n#define MBEDTLS_ERR_NET_BIND_FAILED                       -0x0046  /**< Binding of the socket failed. */\n#define MBEDTLS_ERR_NET_LISTEN_FAILED                     -0x0048  /**< Could not listen on the socket. */\n#define MBEDTLS_ERR_NET_ACCEPT_FAILED                     -0x004A  /**< Could not accept the incoming connection. */\n#define MBEDTLS_ERR_NET_RECV_FAILED                       -0x004C  /**< Reading information from the socket failed. */\n#define MBEDTLS_ERR_NET_SEND_FAILED                       -0x004E  /**< Sending information through the socket failed. */\n#define MBEDTLS_ERR_NET_CONN_RESET                        -0x0050  /**< Connection was reset by peer. */\n#define MBEDTLS_ERR_NET_UNKNOWN_HOST                      -0x0052  /**< Failed to get an IP address for the given hostname. */\n#define MBEDTLS_ERR_NET_BUFFER_TOO_SMALL                  -0x0043  /**< Buffer is too small to hold the data. */\n#define MBEDTLS_ERR_NET_INVALID_CONTEXT                   -0x0045  /**< The context is invalid, eg because it was free()ed. */\n\n#define MBEDTLS_NET_LISTEN_BACKLOG         10 /**< The backlog that listen() should use. */\n\n#define MBEDTLS_NET_PROTO_TCP 0 /**< The TCP transport protocol */\n#define MBEDTLS_NET_PROTO_UDP 1 /**< The UDP transport protocol */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * Wrapper type for sockets.\n *\n * Currently backed by just a file descriptor, but might be more in the future\n * (eg two file descriptors for combined IPv4 + IPv6 support, or additional\n * structures for hand-made UDP demultiplexing).\n */\ntypedef struct\n{\n    int fd;\n}\nmbedtls_net_context;\n\n/**\n * \\brief          Initiate a connection with host:port in the given protocol\n *\n * \\param host     Host to connect to\n * \\param port     Port to connect to\n * \\param proto    Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP\n *\n * \\return         Socket you created if successful, or NULL if failed\n *\n * \\note           Sets the socket in connected mode even with UDP.\n */\nvoid* mbedtls_net_connect( const char *host, const char *port, int proto );\n\n/**\n * \\brief          Create a receiving socket on bind_ip:port in the chosen\n *                 protocol. If bind_ip == NULL, all interfaces are bound.\n *\n * \\param ctx      Socket to use\n * \\param bind_ip  IP to bind to, can be NULL\n * \\param port     Port number to use\n * \\param proto    Protocol: MBEDTLS_NET_PROTO_TCP or MBEDTLS_NET_PROTO_UDP\n *\n * \\return         0 if successful, or one of:\n *                      MBEDTLS_ERR_NET_SOCKET_FAILED,\n *                      MBEDTLS_ERR_NET_BIND_FAILED,\n *                      MBEDTLS_ERR_NET_LISTEN_FAILED\n *\n * \\note           Regardless of the protocol, opens the sockets and binds it.\n *                 In addition, make the socket listening if protocol is TCP.\n */\nint mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto );\n\n/**\n * \\brief           Accept a connection from a remote client\n *\n * \\param bind_ctx  Relevant socket\n * \\param client_ctx Will contain the connected client socket\n * \\param client_ip Will contain the client IP address\n * \\param buf_size  Size of the client_ip buffer\n * \\param ip_len    Will receive the size of the client IP written\n *\n * \\return          0 if successful, or\n *                  MBEDTLS_ERR_NET_ACCEPT_FAILED, or\n *                  MBEDTLS_ERR_NET_BUFFER_TOO_SMALL if buf_size is too small,\n *                  MBEDTLS_ERR_SSL_WANT_READ if bind_fd was set to\n *                  non-blocking and accept() would block.\n */\nint mbedtls_net_accept( mbedtls_net_context *bind_ctx,\n                        mbedtls_net_context *client_ctx,\n                        void *client_ip, size_t buf_size, size_t *ip_len );\n\n/**\n * \\brief          Set the socket blocking\n *\n * \\param ctx      Socket to set\n *\n * \\return         0 if successful, or a non-zero error code\n */\nint mbedtls_net_set_block( mbedtls_net_context *ctx );\n\n/**\n * \\brief          Set the socket non-blocking\n *\n * \\param ctx      Socket to set\n *\n * \\return         0 if successful, or a non-zero error code\n */\nint mbedtls_net_set_nonblock( mbedtls_net_context *ctx );\n\n/**\n * \\brief          Portable usleep helper\n *\n * \\param usec     Amount of microseconds to sleep\n *\n * \\note           Real amount of time slept will not be less than\n *                 select()'s timeout granularity (typically, 10ms).\n */\nvoid mbedtls_net_usleep( unsigned long usec );\n\n/**\n * \\brief          Read at most 'len' characters. If no error occurs,\n *                 the actual amount read is returned.\n *\n * \\param ctx      Socket\n * \\param buf      The buffer to write to\n * \\param len      Maximum length of the buffer\n *\n * \\return         the number of bytes received,\n *                 or a non-zero error code; with a non-blocking socket,\n *                 MBEDTLS_ERR_SSL_WANT_READ indicates read() would block.\n */\nint mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len );\n\n/**\n * \\brief          Write at most 'len' characters. If no error occurs,\n *                 the actual amount read is returned.\n *\n * \\param ctx      Socket\n * \\param buf      The buffer to read from\n * \\param len      The length of the buffer\n *\n * \\return         the number of bytes sent,\n *                 or a non-zero error code; with a non-blocking socket,\n *                 MBEDTLS_ERR_SSL_WANT_WRITE indicates write() would block.\n */\nint mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len );\n\n/**\n * \\brief          Read at most 'len' characters, blocking for at most\n *                 'timeout' seconds. If no error occurs, the actual amount\n *                 read is returned.\n *\n * \\param ctx      Socket\n * \\param buf      The buffer to write to\n * \\param len      Maximum length of the buffer\n * \\param timeout  Maximum number of milliseconds to wait for data\n *                 0 means no timeout (wait forever)\n *\n * \\return         the number of bytes received,\n *                 or a non-zero error code:\n *                 MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out,\n *                 MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal.\n *\n * \\note           This function will block (until data becomes available or\n *                 timeout is reached) even if the socket is set to\n *                 non-blocking. Handling timeouts with non-blocking reads\n *                 requires a different strategy.\n */\nint mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len,\n                      uint32_t timeout );\n\n/**\n * \\brief          Gracefully shutdown the connection and free associated data\n *\n * \\param ctx      The context to free\n */\nvoid mbedtls_net_free( mbedtls_net_context *ctx );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* net_sockets.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/oid.h",
    "content": "/**\n * \\file oid.h\n *\n * \\brief Object Identifier (OID) database\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_OID_H\n#define MBEDTLS_OID_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"asn1.h\"\n#include \"pk.h\"\n\n#include <stddef.h>\n\n#if defined(MBEDTLS_CIPHER_C)\n#include \"cipher.h\"\n#endif\n\n#if defined(MBEDTLS_MD_C)\n#include \"md.h\"\n#endif\n\n#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)\n#include \"x509.h\"\n#endif\n\n#define MBEDTLS_ERR_OID_NOT_FOUND                         -0x002E  /**< OID is not found. */\n#define MBEDTLS_ERR_OID_BUF_TOO_SMALL                     -0x000B  /**< output buffer is too small */\n\n/*\n * Top level OID tuples\n */\n#define MBEDTLS_OID_ISO_MEMBER_BODIES           \"\\x2a\"          /* {iso(1) member-body(2)} */\n#define MBEDTLS_OID_ISO_IDENTIFIED_ORG          \"\\x2b\"          /* {iso(1) identified-organization(3)} */\n#define MBEDTLS_OID_ISO_CCITT_DS                \"\\x55\"          /* {joint-iso-ccitt(2) ds(5)} */\n#define MBEDTLS_OID_ISO_ITU_COUNTRY             \"\\x60\"          /* {joint-iso-itu-t(2) country(16)} */\n\n/*\n * ISO Member bodies OID parts\n */\n#define MBEDTLS_OID_COUNTRY_US                  \"\\x86\\x48\"      /* {us(840)} */\n#define MBEDTLS_OID_ORG_RSA_DATA_SECURITY       \"\\x86\\xf7\\x0d\"  /* {rsadsi(113549)} */\n#define MBEDTLS_OID_RSA_COMPANY                 MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \\\n                                        MBEDTLS_OID_ORG_RSA_DATA_SECURITY /* {iso(1) member-body(2) us(840) rsadsi(113549)} */\n#define MBEDTLS_OID_ORG_ANSI_X9_62              \"\\xce\\x3d\" /* ansi-X9-62(10045) */\n#define MBEDTLS_OID_ANSI_X9_62                  MBEDTLS_OID_ISO_MEMBER_BODIES MBEDTLS_OID_COUNTRY_US \\\n                                        MBEDTLS_OID_ORG_ANSI_X9_62\n\n/*\n * ISO Identified organization OID parts\n */\n#define MBEDTLS_OID_ORG_DOD                     \"\\x06\"          /* {dod(6)} */\n#define MBEDTLS_OID_ORG_OIW                     \"\\x0e\"\n#define MBEDTLS_OID_OIW_SECSIG                  MBEDTLS_OID_ORG_OIW \"\\x03\"\n#define MBEDTLS_OID_OIW_SECSIG_ALG              MBEDTLS_OID_OIW_SECSIG \"\\x02\"\n#define MBEDTLS_OID_OIW_SECSIG_SHA1             MBEDTLS_OID_OIW_SECSIG_ALG \"\\x1a\"\n#define MBEDTLS_OID_ORG_CERTICOM                \"\\x81\\x04\"  /* certicom(132) */\n#define MBEDTLS_OID_CERTICOM                    MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_CERTICOM\n#define MBEDTLS_OID_ORG_TELETRUST               \"\\x24\" /* teletrust(36) */\n#define MBEDTLS_OID_TELETRUST                   MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_TELETRUST\n\n/*\n * ISO ITU OID parts\n */\n#define MBEDTLS_OID_ORGANIZATION                \"\\x01\"          /* {organization(1)} */\n#define MBEDTLS_OID_ISO_ITU_US_ORG              MBEDTLS_OID_ISO_ITU_COUNTRY MBEDTLS_OID_COUNTRY_US MBEDTLS_OID_ORGANIZATION /* {joint-iso-itu-t(2) country(16) us(840) organization(1)} */\n\n#define MBEDTLS_OID_ORG_GOV                     \"\\x65\"          /* {gov(101)} */\n#define MBEDTLS_OID_GOV                         MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_GOV /* {joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101)} */\n\n#define MBEDTLS_OID_ORG_NETSCAPE                \"\\x86\\xF8\\x42\"  /* {netscape(113730)} */\n#define MBEDTLS_OID_NETSCAPE                    MBEDTLS_OID_ISO_ITU_US_ORG MBEDTLS_OID_ORG_NETSCAPE /* Netscape OID {joint-iso-itu-t(2) country(16) us(840) organization(1) netscape(113730)} */\n\n/* ISO arc for standard certificate and CRL extensions */\n#define MBEDTLS_OID_ID_CE                       MBEDTLS_OID_ISO_CCITT_DS \"\\x1D\" /**< id-ce OBJECT IDENTIFIER  ::=  {joint-iso-ccitt(2) ds(5) 29} */\n\n/**\n * Private Internet Extensions\n * { iso(1) identified-organization(3) dod(6) internet(1)\n *                      security(5) mechanisms(5) pkix(7) }\n */\n#define MBEDTLS_OID_PKIX                        MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ORG_DOD \"\\x01\\x05\\x05\\x07\"\n\n/*\n * Arc for standard naming attributes\n */\n#define MBEDTLS_OID_AT                          MBEDTLS_OID_ISO_CCITT_DS \"\\x04\" /**< id-at OBJECT IDENTIFIER ::= {joint-iso-ccitt(2) ds(5) 4} */\n#define MBEDTLS_OID_AT_CN                       MBEDTLS_OID_AT \"\\x03\" /**< id-at-commonName AttributeType:= {id-at 3} */\n#define MBEDTLS_OID_AT_SUR_NAME                 MBEDTLS_OID_AT \"\\x04\" /**< id-at-surName AttributeType:= {id-at 4} */\n#define MBEDTLS_OID_AT_SERIAL_NUMBER            MBEDTLS_OID_AT \"\\x05\" /**< id-at-serialNumber AttributeType:= {id-at 5} */\n#define MBEDTLS_OID_AT_COUNTRY                  MBEDTLS_OID_AT \"\\x06\" /**< id-at-countryName AttributeType:= {id-at 6} */\n#define MBEDTLS_OID_AT_LOCALITY                 MBEDTLS_OID_AT \"\\x07\" /**< id-at-locality AttributeType:= {id-at 7} */\n#define MBEDTLS_OID_AT_STATE                    MBEDTLS_OID_AT \"\\x08\" /**< id-at-state AttributeType:= {id-at 8} */\n#define MBEDTLS_OID_AT_ORGANIZATION             MBEDTLS_OID_AT \"\\x0A\" /**< id-at-organizationName AttributeType:= {id-at 10} */\n#define MBEDTLS_OID_AT_ORG_UNIT                 MBEDTLS_OID_AT \"\\x0B\" /**< id-at-organizationalUnitName AttributeType:= {id-at 11} */\n#define MBEDTLS_OID_AT_TITLE                    MBEDTLS_OID_AT \"\\x0C\" /**< id-at-title AttributeType:= {id-at 12} */\n#define MBEDTLS_OID_AT_POSTAL_ADDRESS           MBEDTLS_OID_AT \"\\x10\" /**< id-at-postalAddress AttributeType:= {id-at 16} */\n#define MBEDTLS_OID_AT_POSTAL_CODE              MBEDTLS_OID_AT \"\\x11\" /**< id-at-postalCode AttributeType:= {id-at 17} */\n#define MBEDTLS_OID_AT_GIVEN_NAME               MBEDTLS_OID_AT \"\\x2A\" /**< id-at-givenName AttributeType:= {id-at 42} */\n#define MBEDTLS_OID_AT_INITIALS                 MBEDTLS_OID_AT \"\\x2B\" /**< id-at-initials AttributeType:= {id-at 43} */\n#define MBEDTLS_OID_AT_GENERATION_QUALIFIER     MBEDTLS_OID_AT \"\\x2C\" /**< id-at-generationQualifier AttributeType:= {id-at 44} */\n#define MBEDTLS_OID_AT_UNIQUE_IDENTIFIER        MBEDTLS_OID_AT \"\\x2D\" /**< id-at-uniqueIdentifier AttributType:= {id-at 45} */\n#define MBEDTLS_OID_AT_DN_QUALIFIER             MBEDTLS_OID_AT \"\\x2E\" /**< id-at-dnQualifier AttributeType:= {id-at 46} */\n#define MBEDTLS_OID_AT_PSEUDONYM                MBEDTLS_OID_AT \"\\x41\" /**< id-at-pseudonym AttributeType:= {id-at 65} */\n\n#define MBEDTLS_OID_DOMAIN_COMPONENT            \"\\x09\\x92\\x26\\x89\\x93\\xF2\\x2C\\x64\\x01\\x19\" /** id-domainComponent AttributeType:= {itu-t(0) data(9) pss(2342) ucl(19200300) pilot(100) pilotAttributeType(1) domainComponent(25)} */\n\n/*\n * OIDs for standard certificate extensions\n */\n#define MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER    MBEDTLS_OID_ID_CE \"\\x23\" /**< id-ce-authorityKeyIdentifier OBJECT IDENTIFIER ::=  { id-ce 35 } */\n#define MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER      MBEDTLS_OID_ID_CE \"\\x0E\" /**< id-ce-subjectKeyIdentifier OBJECT IDENTIFIER ::=  { id-ce 14 } */\n#define MBEDTLS_OID_KEY_USAGE                   MBEDTLS_OID_ID_CE \"\\x0F\" /**< id-ce-keyUsage OBJECT IDENTIFIER ::=  { id-ce 15 } */\n#define MBEDTLS_OID_CERTIFICATE_POLICIES        MBEDTLS_OID_ID_CE \"\\x20\" /**< id-ce-certificatePolicies OBJECT IDENTIFIER ::=  { id-ce 32 } */\n#define MBEDTLS_OID_POLICY_MAPPINGS             MBEDTLS_OID_ID_CE \"\\x21\" /**< id-ce-policyMappings OBJECT IDENTIFIER ::=  { id-ce 33 } */\n#define MBEDTLS_OID_SUBJECT_ALT_NAME            MBEDTLS_OID_ID_CE \"\\x11\" /**< id-ce-subjectAltName OBJECT IDENTIFIER ::=  { id-ce 17 } */\n#define MBEDTLS_OID_ISSUER_ALT_NAME             MBEDTLS_OID_ID_CE \"\\x12\" /**< id-ce-issuerAltName OBJECT IDENTIFIER ::=  { id-ce 18 } */\n#define MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS     MBEDTLS_OID_ID_CE \"\\x09\" /**< id-ce-subjectDirectoryAttributes OBJECT IDENTIFIER ::=  { id-ce 9 } */\n#define MBEDTLS_OID_BASIC_CONSTRAINTS           MBEDTLS_OID_ID_CE \"\\x13\" /**< id-ce-basicConstraints OBJECT IDENTIFIER ::=  { id-ce 19 } */\n#define MBEDTLS_OID_NAME_CONSTRAINTS            MBEDTLS_OID_ID_CE \"\\x1E\" /**< id-ce-nameConstraints OBJECT IDENTIFIER ::=  { id-ce 30 } */\n#define MBEDTLS_OID_POLICY_CONSTRAINTS          MBEDTLS_OID_ID_CE \"\\x24\" /**< id-ce-policyConstraints OBJECT IDENTIFIER ::=  { id-ce 36 } */\n#define MBEDTLS_OID_EXTENDED_KEY_USAGE          MBEDTLS_OID_ID_CE \"\\x25\" /**< id-ce-extKeyUsage OBJECT IDENTIFIER ::= { id-ce 37 } */\n#define MBEDTLS_OID_CRL_DISTRIBUTION_POINTS     MBEDTLS_OID_ID_CE \"\\x1F\" /**< id-ce-cRLDistributionPoints OBJECT IDENTIFIER ::=  { id-ce 31 } */\n#define MBEDTLS_OID_INIHIBIT_ANYPOLICY          MBEDTLS_OID_ID_CE \"\\x36\" /**< id-ce-inhibitAnyPolicy OBJECT IDENTIFIER ::=  { id-ce 54 } */\n#define MBEDTLS_OID_FRESHEST_CRL                MBEDTLS_OID_ID_CE \"\\x2E\" /**< id-ce-freshestCRL OBJECT IDENTIFIER ::=  { id-ce 46 } */\n\n/*\n * Netscape certificate extensions\n */\n#define MBEDTLS_OID_NS_CERT                 MBEDTLS_OID_NETSCAPE \"\\x01\"\n#define MBEDTLS_OID_NS_CERT_TYPE            MBEDTLS_OID_NS_CERT  \"\\x01\"\n#define MBEDTLS_OID_NS_BASE_URL             MBEDTLS_OID_NS_CERT  \"\\x02\"\n#define MBEDTLS_OID_NS_REVOCATION_URL       MBEDTLS_OID_NS_CERT  \"\\x03\"\n#define MBEDTLS_OID_NS_CA_REVOCATION_URL    MBEDTLS_OID_NS_CERT  \"\\x04\"\n#define MBEDTLS_OID_NS_RENEWAL_URL          MBEDTLS_OID_NS_CERT  \"\\x07\"\n#define MBEDTLS_OID_NS_CA_POLICY_URL        MBEDTLS_OID_NS_CERT  \"\\x08\"\n#define MBEDTLS_OID_NS_SSL_SERVER_NAME      MBEDTLS_OID_NS_CERT  \"\\x0C\"\n#define MBEDTLS_OID_NS_COMMENT              MBEDTLS_OID_NS_CERT  \"\\x0D\"\n#define MBEDTLS_OID_NS_DATA_TYPE            MBEDTLS_OID_NETSCAPE \"\\x02\"\n#define MBEDTLS_OID_NS_CERT_SEQUENCE        MBEDTLS_OID_NS_DATA_TYPE \"\\x05\"\n\n/*\n * OIDs for CRL extensions\n */\n#define MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD    MBEDTLS_OID_ID_CE \"\\x10\"\n#define MBEDTLS_OID_CRL_NUMBER                  MBEDTLS_OID_ID_CE \"\\x14\" /**< id-ce-cRLNumber OBJECT IDENTIFIER ::= { id-ce 20 } */\n\n/*\n * X.509 v3 Extended key usage OIDs\n */\n#define MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE      MBEDTLS_OID_EXTENDED_KEY_USAGE \"\\x00\" /**< anyExtendedKeyUsage OBJECT IDENTIFIER ::= { id-ce-extKeyUsage 0 } */\n\n#define MBEDTLS_OID_KP                          MBEDTLS_OID_PKIX \"\\x03\" /**< id-kp OBJECT IDENTIFIER ::= { id-pkix 3 } */\n#define MBEDTLS_OID_SERVER_AUTH                 MBEDTLS_OID_KP \"\\x01\" /**< id-kp-serverAuth OBJECT IDENTIFIER ::= { id-kp 1 } */\n#define MBEDTLS_OID_CLIENT_AUTH                 MBEDTLS_OID_KP \"\\x02\" /**< id-kp-clientAuth OBJECT IDENTIFIER ::= { id-kp 2 } */\n#define MBEDTLS_OID_CODE_SIGNING                MBEDTLS_OID_KP \"\\x03\" /**< id-kp-codeSigning OBJECT IDENTIFIER ::= { id-kp 3 } */\n#define MBEDTLS_OID_EMAIL_PROTECTION            MBEDTLS_OID_KP \"\\x04\" /**< id-kp-emailProtection OBJECT IDENTIFIER ::= { id-kp 4 } */\n#define MBEDTLS_OID_TIME_STAMPING               MBEDTLS_OID_KP \"\\x08\" /**< id-kp-timeStamping OBJECT IDENTIFIER ::= { id-kp 8 } */\n#define MBEDTLS_OID_OCSP_SIGNING                MBEDTLS_OID_KP \"\\x09\" /**< id-kp-OCSPSigning OBJECT IDENTIFIER ::= { id-kp 9 } */\n\n/*\n * PKCS definition OIDs\n */\n\n#define MBEDTLS_OID_PKCS                MBEDTLS_OID_RSA_COMPANY \"\\x01\" /**< pkcs OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) 1 } */\n#define MBEDTLS_OID_PKCS1               MBEDTLS_OID_PKCS \"\\x01\" /**< pkcs-1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } */\n#define MBEDTLS_OID_PKCS5               MBEDTLS_OID_PKCS \"\\x05\" /**< pkcs-5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 5 } */\n#define MBEDTLS_OID_PKCS9               MBEDTLS_OID_PKCS \"\\x09\" /**< pkcs-9 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 9 } */\n#define MBEDTLS_OID_PKCS12              MBEDTLS_OID_PKCS \"\\x0c\" /**< pkcs-12 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 12 } */\n\n/*\n * PKCS#1 OIDs\n */\n#define MBEDTLS_OID_PKCS1_RSA           MBEDTLS_OID_PKCS1 \"\\x01\" /**< rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } */\n#define MBEDTLS_OID_PKCS1_MD2           MBEDTLS_OID_PKCS1 \"\\x02\" /**< md2WithRSAEncryption ::= { pkcs-1 2 } */\n#define MBEDTLS_OID_PKCS1_MD4           MBEDTLS_OID_PKCS1 \"\\x03\" /**< md4WithRSAEncryption ::= { pkcs-1 3 } */\n#define MBEDTLS_OID_PKCS1_MD5           MBEDTLS_OID_PKCS1 \"\\x04\" /**< md5WithRSAEncryption ::= { pkcs-1 4 } */\n#define MBEDTLS_OID_PKCS1_SHA1          MBEDTLS_OID_PKCS1 \"\\x05\" /**< sha1WithRSAEncryption ::= { pkcs-1 5 } */\n#define MBEDTLS_OID_PKCS1_SHA224        MBEDTLS_OID_PKCS1 \"\\x0e\" /**< sha224WithRSAEncryption ::= { pkcs-1 14 } */\n#define MBEDTLS_OID_PKCS1_SHA256        MBEDTLS_OID_PKCS1 \"\\x0b\" /**< sha256WithRSAEncryption ::= { pkcs-1 11 } */\n#define MBEDTLS_OID_PKCS1_SHA384        MBEDTLS_OID_PKCS1 \"\\x0c\" /**< sha384WithRSAEncryption ::= { pkcs-1 12 } */\n#define MBEDTLS_OID_PKCS1_SHA512        MBEDTLS_OID_PKCS1 \"\\x0d\" /**< sha512WithRSAEncryption ::= { pkcs-1 13 } */\n\n#define MBEDTLS_OID_RSA_SHA_OBS         \"\\x2B\\x0E\\x03\\x02\\x1D\"\n\n#define MBEDTLS_OID_PKCS9_EMAIL         MBEDTLS_OID_PKCS9 \"\\x01\" /**< emailAddress AttributeType ::= { pkcs-9 1 } */\n\n/* RFC 4055 */\n#define MBEDTLS_OID_RSASSA_PSS          MBEDTLS_OID_PKCS1 \"\\x0a\" /**< id-RSASSA-PSS ::= { pkcs-1 10 } */\n#define MBEDTLS_OID_MGF1                MBEDTLS_OID_PKCS1 \"\\x08\" /**< id-mgf1 ::= { pkcs-1 8 } */\n\n/*\n * Digest algorithms\n */\n#define MBEDTLS_OID_DIGEST_ALG_MD2              MBEDTLS_OID_RSA_COMPANY \"\\x02\\x02\" /**< id-mbedtls_md2 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 } */\n#define MBEDTLS_OID_DIGEST_ALG_MD4              MBEDTLS_OID_RSA_COMPANY \"\\x02\\x04\" /**< id-mbedtls_md4 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 4 } */\n#define MBEDTLS_OID_DIGEST_ALG_MD5              MBEDTLS_OID_RSA_COMPANY \"\\x02\\x05\" /**< id-mbedtls_md5 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } */\n#define MBEDTLS_OID_DIGEST_ALG_SHA1             MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_SHA1 /**< id-mbedtls_sha1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } */\n#define MBEDTLS_OID_DIGEST_ALG_SHA224           MBEDTLS_OID_GOV \"\\x03\\x04\\x02\\x04\" /**< id-sha224 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 4 } */\n#define MBEDTLS_OID_DIGEST_ALG_SHA256           MBEDTLS_OID_GOV \"\\x03\\x04\\x02\\x01\" /**< id-mbedtls_sha256 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 1 } */\n\n#define MBEDTLS_OID_DIGEST_ALG_SHA384           MBEDTLS_OID_GOV \"\\x03\\x04\\x02\\x02\" /**< id-sha384 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 2 } */\n\n#define MBEDTLS_OID_DIGEST_ALG_SHA512           MBEDTLS_OID_GOV \"\\x03\\x04\\x02\\x03\" /**< id-mbedtls_sha512 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2) 3 } */\n\n#define MBEDTLS_OID_HMAC_SHA1                   MBEDTLS_OID_RSA_COMPANY \"\\x02\\x07\" /**< id-hmacWithSHA1 OBJECT IDENTIFIER ::= { iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 7 } */\n\n/*\n * Encryption algorithms\n */\n#define MBEDTLS_OID_DES_CBC                     MBEDTLS_OID_ISO_IDENTIFIED_ORG MBEDTLS_OID_OIW_SECSIG_ALG \"\\x07\" /**< desCBC OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 7 } */\n#define MBEDTLS_OID_DES_EDE3_CBC                MBEDTLS_OID_RSA_COMPANY \"\\x03\\x07\" /**< des-ede3-cbc OBJECT IDENTIFIER ::= { iso(1) member-body(2) -- us(840) rsadsi(113549) encryptionAlgorithm(3) 7 } */\n\n/*\n * PKCS#5 OIDs\n */\n#define MBEDTLS_OID_PKCS5_PBKDF2                MBEDTLS_OID_PKCS5 \"\\x0c\" /**< id-PBKDF2 OBJECT IDENTIFIER ::= {pkcs-5 12} */\n#define MBEDTLS_OID_PKCS5_PBES2                 MBEDTLS_OID_PKCS5 \"\\x0d\" /**< id-PBES2 OBJECT IDENTIFIER ::= {pkcs-5 13} */\n#define MBEDTLS_OID_PKCS5_PBMAC1                MBEDTLS_OID_PKCS5 \"\\x0e\" /**< id-PBMAC1 OBJECT IDENTIFIER ::= {pkcs-5 14} */\n\n/*\n * PKCS#5 PBES1 algorithms\n */\n#define MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC       MBEDTLS_OID_PKCS5 \"\\x01\" /**< pbeWithMD2AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 1} */\n#define MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC       MBEDTLS_OID_PKCS5 \"\\x04\" /**< pbeWithMD2AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 4} */\n#define MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC       MBEDTLS_OID_PKCS5 \"\\x03\" /**< pbeWithMD5AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 3} */\n#define MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC       MBEDTLS_OID_PKCS5 \"\\x06\" /**< pbeWithMD5AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 6} */\n#define MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC      MBEDTLS_OID_PKCS5 \"\\x0a\" /**< pbeWithSHA1AndDES-CBC OBJECT IDENTIFIER ::= {pkcs-5 10} */\n#define MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC      MBEDTLS_OID_PKCS5 \"\\x0b\" /**< pbeWithSHA1AndRC2-CBC OBJECT IDENTIFIER ::= {pkcs-5 11} */\n\n/*\n * PKCS#8 OIDs\n */\n#define MBEDTLS_OID_PKCS9_CSR_EXT_REQ           MBEDTLS_OID_PKCS9 \"\\x0e\" /**< extensionRequest OBJECT IDENTIFIER ::= {pkcs-9 14} */\n\n/*\n * PKCS#12 PBE OIDs\n */\n#define MBEDTLS_OID_PKCS12_PBE                      MBEDTLS_OID_PKCS12 \"\\x01\" /**< pkcs-12PbeIds OBJECT IDENTIFIER ::= {pkcs-12 1} */\n\n#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128         MBEDTLS_OID_PKCS12_PBE \"\\x01\" /**< pbeWithSHAAnd128BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 1} */\n#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40          MBEDTLS_OID_PKCS12_PBE \"\\x02\" /**< pbeWithSHAAnd40BitRC4 OBJECT IDENTIFIER ::= {pkcs-12PbeIds 2} */\n#define MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC    MBEDTLS_OID_PKCS12_PBE \"\\x03\" /**< pbeWithSHAAnd3-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 3} */\n#define MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC    MBEDTLS_OID_PKCS12_PBE \"\\x04\" /**< pbeWithSHAAnd2-KeyTripleDES-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 4} */\n#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC     MBEDTLS_OID_PKCS12_PBE \"\\x05\" /**< pbeWithSHAAnd128BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 5} */\n#define MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC      MBEDTLS_OID_PKCS12_PBE \"\\x06\" /**< pbeWithSHAAnd40BitRC2-CBC OBJECT IDENTIFIER ::= {pkcs-12PbeIds 6} */\n\n/*\n * EC key algorithms from RFC 5480\n */\n\n/* id-ecPublicKey OBJECT IDENTIFIER ::= {\n *       iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } */\n#define MBEDTLS_OID_EC_ALG_UNRESTRICTED         MBEDTLS_OID_ANSI_X9_62 \"\\x02\\01\"\n\n/*   id-ecDH OBJECT IDENTIFIER ::= {\n *     iso(1) identified-organization(3) certicom(132)\n *     schemes(1) ecdh(12) } */\n#define MBEDTLS_OID_EC_ALG_ECDH                 MBEDTLS_OID_CERTICOM \"\\x01\\x0c\"\n\n/*\n * ECParameters namedCurve identifiers, from RFC 5480, RFC 5639, and SEC2\n */\n\n/* secp192r1 OBJECT IDENTIFIER ::= {\n *   iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 1 } */\n#define MBEDTLS_OID_EC_GRP_SECP192R1        MBEDTLS_OID_ANSI_X9_62 \"\\x03\\x01\\x01\"\n\n/* secp224r1 OBJECT IDENTIFIER ::= {\n *   iso(1) identified-organization(3) certicom(132) curve(0) 33 } */\n#define MBEDTLS_OID_EC_GRP_SECP224R1        MBEDTLS_OID_CERTICOM \"\\x00\\x21\"\n\n/* secp256r1 OBJECT IDENTIFIER ::= {\n *   iso(1) member-body(2) us(840) ansi-X9-62(10045) curves(3) prime(1) 7 } */\n#define MBEDTLS_OID_EC_GRP_SECP256R1        MBEDTLS_OID_ANSI_X9_62 \"\\x03\\x01\\x07\"\n\n/* secp384r1 OBJECT IDENTIFIER ::= {\n *   iso(1) identified-organization(3) certicom(132) curve(0) 34 } */\n#define MBEDTLS_OID_EC_GRP_SECP384R1        MBEDTLS_OID_CERTICOM \"\\x00\\x22\"\n\n/* secp521r1 OBJECT IDENTIFIER ::= {\n *   iso(1) identified-organization(3) certicom(132) curve(0) 35 } */\n#define MBEDTLS_OID_EC_GRP_SECP521R1        MBEDTLS_OID_CERTICOM \"\\x00\\x23\"\n\n/* secp192k1 OBJECT IDENTIFIER ::= {\n *   iso(1) identified-organization(3) certicom(132) curve(0) 31 } */\n#define MBEDTLS_OID_EC_GRP_SECP192K1        MBEDTLS_OID_CERTICOM \"\\x00\\x1f\"\n\n/* secp224k1 OBJECT IDENTIFIER ::= {\n *   iso(1) identified-organization(3) certicom(132) curve(0) 32 } */\n#define MBEDTLS_OID_EC_GRP_SECP224K1        MBEDTLS_OID_CERTICOM \"\\x00\\x20\"\n\n/* secp256k1 OBJECT IDENTIFIER ::= {\n *   iso(1) identified-organization(3) certicom(132) curve(0) 10 } */\n#define MBEDTLS_OID_EC_GRP_SECP256K1        MBEDTLS_OID_CERTICOM \"\\x00\\x0a\"\n\n/* RFC 5639 4.1\n * ecStdCurvesAndGeneration OBJECT IDENTIFIER::= {iso(1)\n * identified-organization(3) teletrust(36) algorithm(3) signature-\n * algorithm(3) ecSign(2) 8}\n * ellipticCurve OBJECT IDENTIFIER ::= {ecStdCurvesAndGeneration 1}\n * versionOne OBJECT IDENTIFIER ::= {ellipticCurve 1} */\n#define MBEDTLS_OID_EC_BRAINPOOL_V1         MBEDTLS_OID_TELETRUST \"\\x03\\x03\\x02\\x08\\x01\\x01\"\n\n/* brainpoolP256r1 OBJECT IDENTIFIER ::= {versionOne 7} */\n#define MBEDTLS_OID_EC_GRP_BP256R1          MBEDTLS_OID_EC_BRAINPOOL_V1 \"\\x07\"\n\n/* brainpoolP384r1 OBJECT IDENTIFIER ::= {versionOne 11} */\n#define MBEDTLS_OID_EC_GRP_BP384R1          MBEDTLS_OID_EC_BRAINPOOL_V1 \"\\x0B\"\n\n/* brainpoolP512r1 OBJECT IDENTIFIER ::= {versionOne 13} */\n#define MBEDTLS_OID_EC_GRP_BP512R1          MBEDTLS_OID_EC_BRAINPOOL_V1 \"\\x0D\"\n\n/*\n * SEC1 C.1\n *\n * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 }\n * id-fieldType OBJECT IDENTIFIER ::= { ansi-X9-62 fieldType(1)}\n */\n#define MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE   MBEDTLS_OID_ANSI_X9_62 \"\\x01\"\n#define MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD  MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE \"\\x01\"\n\n/*\n * ECDSA signature identifiers, from RFC 5480\n */\n#define MBEDTLS_OID_ANSI_X9_62_SIG          MBEDTLS_OID_ANSI_X9_62 \"\\x04\" /* signatures(4) */\n#define MBEDTLS_OID_ANSI_X9_62_SIG_SHA2     MBEDTLS_OID_ANSI_X9_62_SIG \"\\x03\" /* ecdsa-with-SHA2(3) */\n\n/* ecdsa-with-SHA1 OBJECT IDENTIFIER ::= {\n *   iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4) 1 } */\n#define MBEDTLS_OID_ECDSA_SHA1              MBEDTLS_OID_ANSI_X9_62_SIG \"\\x01\"\n\n/* ecdsa-with-SHA224 OBJECT IDENTIFIER ::= {\n *   iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4)\n *   ecdsa-with-SHA2(3) 1 } */\n#define MBEDTLS_OID_ECDSA_SHA224            MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 \"\\x01\"\n\n/* ecdsa-with-SHA256 OBJECT IDENTIFIER ::= {\n *   iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4)\n *   ecdsa-with-SHA2(3) 2 } */\n#define MBEDTLS_OID_ECDSA_SHA256            MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 \"\\x02\"\n\n/* ecdsa-with-SHA384 OBJECT IDENTIFIER ::= {\n *   iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4)\n *   ecdsa-with-SHA2(3) 3 } */\n#define MBEDTLS_OID_ECDSA_SHA384            MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 \"\\x03\"\n\n/* ecdsa-with-SHA512 OBJECT IDENTIFIER ::= {\n *   iso(1) member-body(2) us(840) ansi-X9-62(10045) signatures(4)\n *   ecdsa-with-SHA2(3) 4 } */\n#define MBEDTLS_OID_ECDSA_SHA512            MBEDTLS_OID_ANSI_X9_62_SIG_SHA2 \"\\x04\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief Base OID descriptor structure\n */\ntypedef struct {\n    const char *asn1;               /*!< OID ASN.1 representation       */\n    size_t asn1_len;                /*!< length of asn1                 */\n    const char *name;               /*!< official name (e.g. from RFC)  */\n    const char *description;        /*!< human friendly description     */\n} mbedtls_oid_descriptor_t;\n\n/**\n * \\brief           Translate an ASN.1 OID into its numeric representation\n *                  (e.g. \"\\x2A\\x86\\x48\\x86\\xF7\\x0D\" into \"1.2.840.113549\")\n *\n * \\param buf       buffer to put representation in\n * \\param size      size of the buffer\n * \\param oid       OID to translate\n *\n * \\return          Length of the string written (excluding final NULL) or\n *                  MBEDTLS_ERR_OID_BUF_TOO_SMALL in case of error\n */\nint mbedtls_oid_get_numeric_string( char *buf, size_t size, const mbedtls_asn1_buf *oid );\n\n#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)\n/**\n * \\brief          Translate an X.509 extension OID into local values\n *\n * \\param oid      OID to use\n * \\param ext_type place to store the extension type\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_x509_ext_type( const mbedtls_asn1_buf *oid, int *ext_type );\n#endif\n\n/**\n * \\brief          Translate an X.509 attribute type OID into the short name\n *                 (e.g. the OID for an X520 Common Name into \"CN\")\n *\n * \\param oid      OID to use\n * \\param short_name    place to store the string pointer\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_attr_short_name( const mbedtls_asn1_buf *oid, const char **short_name );\n\n/**\n * \\brief          Translate PublicKeyAlgorithm OID into pk_type\n *\n * \\param oid      OID to use\n * \\param pk_alg   place to store public key algorithm\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_pk_alg( const mbedtls_asn1_buf *oid, mbedtls_pk_type_t *pk_alg );\n\n/**\n * \\brief          Translate pk_type into PublicKeyAlgorithm OID\n *\n * \\param pk_alg   Public key type to look for\n * \\param oid      place to store ASN.1 OID string pointer\n * \\param olen     length of the OID\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_type_t pk_alg,\n                           const char **oid, size_t *olen );\n\n#if defined(MBEDTLS_ECP_C)\n/**\n * \\brief          Translate NamedCurve OID into an EC group identifier\n *\n * \\param oid      OID to use\n * \\param grp_id   place to store group id\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_ec_grp( const mbedtls_asn1_buf *oid, mbedtls_ecp_group_id *grp_id );\n\n/**\n * \\brief          Translate EC group identifier into NamedCurve OID\n *\n * \\param grp_id   EC group identifier\n * \\param oid      place to store ASN.1 OID string pointer\n * \\param olen     length of the OID\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_oid_by_ec_grp( mbedtls_ecp_group_id grp_id,\n                           const char **oid, size_t *olen );\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_MD_C)\n/**\n * \\brief          Translate SignatureAlgorithm OID into md_type and pk_type\n *\n * \\param oid      OID to use\n * \\param md_alg   place to store message digest algorithm\n * \\param pk_alg   place to store public key algorithm\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_sig_alg( const mbedtls_asn1_buf *oid,\n                     mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg );\n\n/**\n * \\brief          Translate SignatureAlgorithm OID into description\n *\n * \\param oid      OID to use\n * \\param desc     place to store string pointer\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_sig_alg_desc( const mbedtls_asn1_buf *oid, const char **desc );\n\n/**\n * \\brief          Translate md_type and pk_type into SignatureAlgorithm OID\n *\n * \\param md_alg   message digest algorithm\n * \\param pk_alg   public key algorithm\n * \\param oid      place to store ASN.1 OID string pointer\n * \\param olen     length of the OID\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_oid_by_sig_alg( mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg,\n                            const char **oid, size_t *olen );\n\n/**\n * \\brief          Translate hash algorithm OID into md_type\n *\n * \\param oid      OID to use\n * \\param md_alg   place to store message digest algorithm\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_md_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg );\n#endif /* MBEDTLS_MD_C */\n\n/**\n * \\brief          Translate Extended Key Usage OID into description\n *\n * \\param oid      OID to use\n * \\param desc     place to store string pointer\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_extended_key_usage( const mbedtls_asn1_buf *oid, const char **desc );\n\n/**\n * \\brief          Translate md_type into hash algorithm OID\n *\n * \\param md_alg   message digest algorithm\n * \\param oid      place to store ASN.1 OID string pointer\n * \\param olen     length of the OID\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_oid_by_md( mbedtls_md_type_t md_alg, const char **oid, size_t *olen );\n\n#if defined(MBEDTLS_CIPHER_C)\n/**\n * \\brief          Translate encryption algorithm OID into cipher_type\n *\n * \\param oid           OID to use\n * \\param cipher_alg    place to store cipher algorithm\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_cipher_alg( const mbedtls_asn1_buf *oid, mbedtls_cipher_type_t *cipher_alg );\n#endif /* MBEDTLS_CIPHER_C */\n\n#if defined(MBEDTLS_PKCS12_C)\n/**\n * \\brief          Translate PKCS#12 PBE algorithm OID into md_type and\n *                 cipher_type\n *\n * \\param oid           OID to use\n * \\param md_alg        place to store message digest algorithm\n * \\param cipher_alg    place to store cipher algorithm\n *\n * \\return         0 if successful, or MBEDTLS_ERR_OID_NOT_FOUND\n */\nint mbedtls_oid_get_pkcs12_pbe_alg( const mbedtls_asn1_buf *oid, mbedtls_md_type_t *md_alg,\n                            mbedtls_cipher_type_t *cipher_alg );\n#endif /* MBEDTLS_PKCS12_C */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* oid.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/padlock.h",
    "content": "/**\n * \\file padlock.h\n *\n * \\brief VIA PadLock ACE for HW encryption/decryption supported by some\n *        processors\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_PADLOCK_H\n#define MBEDTLS_PADLOCK_H\n\n#include \"aes.h\"\n\n#define MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED               -0x0030  /**< Input data should be aligned. */\n\n#if defined(__has_feature)\n#if __has_feature(address_sanitizer)\n#define MBEDTLS_HAVE_ASAN\n#endif\n#endif\n\n/* Some versions of ASan result in errors about not enough registers */\n#if defined(MBEDTLS_HAVE_ASM) && defined(__GNUC__) && defined(__i386__) && \\\n    !defined(MBEDTLS_HAVE_ASAN)\n\n#ifndef MBEDTLS_HAVE_X86\n#define MBEDTLS_HAVE_X86\n#endif\n\n#include <stdint.h>\n\n#define MBEDTLS_PADLOCK_RNG 0x000C\n#define MBEDTLS_PADLOCK_ACE 0x00C0\n#define MBEDTLS_PADLOCK_PHE 0x0C00\n#define MBEDTLS_PADLOCK_PMM 0x3000\n\n#define MBEDTLS_PADLOCK_ALIGN16(x) (uint32_t *) (16 + ((int32_t) x & ~15))\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          PadLock detection routine\n *\n * \\param feature  The feature to detect\n *\n * \\return         1 if CPU has support for the feature, 0 otherwise\n */\nint mbedtls_padlock_has_support( int feature );\n\n/**\n * \\brief          PadLock AES-ECB block en(de)cryption\n *\n * \\param ctx      AES context\n * \\param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT\n * \\param input    16-byte input block\n * \\param output   16-byte output block\n *\n * \\return         0 if success, 1 if operation failed\n */\nint mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx,\n                       int mode,\n                       const unsigned char input[16],\n                       unsigned char output[16] );\n\n/**\n * \\brief          PadLock AES-CBC buffer en(de)cryption\n *\n * \\param ctx      AES context\n * \\param mode     MBEDTLS_AES_ENCRYPT or MBEDTLS_AES_DECRYPT\n * \\param length   length of the input data\n * \\param iv       initialization vector (updated after use)\n * \\param input    buffer holding the input data\n * \\param output   buffer holding the output data\n *\n * \\return         0 if success, 1 if operation failed\n */\nint mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx,\n                       int mode,\n                       size_t length,\n                       unsigned char iv[16],\n                       const unsigned char *input,\n                       unsigned char *output );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* HAVE_X86  */\n\n#endif /* padlock.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/pem.h",
    "content": "/**\n * \\file pem.h\n *\n * \\brief Privacy Enhanced Mail (PEM) decoding\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_PEM_H\n#define MBEDTLS_PEM_H\n\n#include <stddef.h>\n\n/**\n * \\name PEM Error codes\n * These error codes are returned in case of errors reading the\n * PEM data.\n * \\{\n */\n#define MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT          -0x1080  /**< No PEM header or footer found. */\n#define MBEDTLS_ERR_PEM_INVALID_DATA                      -0x1100  /**< PEM string is not as expected. */\n#define MBEDTLS_ERR_PEM_ALLOC_FAILED                      -0x1180  /**< Failed to allocate memory. */\n#define MBEDTLS_ERR_PEM_INVALID_ENC_IV                    -0x1200  /**< RSA IV is not in hex-format. */\n#define MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG                   -0x1280  /**< Unsupported key encryption algorithm. */\n#define MBEDTLS_ERR_PEM_PASSWORD_REQUIRED                 -0x1300  /**< Private key password can't be empty. */\n#define MBEDTLS_ERR_PEM_PASSWORD_MISMATCH                 -0x1380  /**< Given private key password does not allow for correct decryption. */\n#define MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE               -0x1400  /**< Unavailable feature, e.g. hashing/encryption combination. */\n#define MBEDTLS_ERR_PEM_BAD_INPUT_DATA                    -0x1480  /**< Bad input parameters to function. */\n/* \\} name */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n/**\n * \\brief       PEM context structure\n */\ntypedef struct\n{\n    unsigned char *buf;     /*!< buffer for decoded data             */\n    size_t buflen;          /*!< length of the buffer                */\n    unsigned char *info;    /*!< buffer for extra header information */\n}\nmbedtls_pem_context;\n\n/**\n * \\brief       PEM context setup\n *\n * \\param ctx   context to be initialized\n */\nvoid mbedtls_pem_init( mbedtls_pem_context *ctx );\n\n/**\n * \\brief       Read a buffer for PEM information and store the resulting\n *              data into the specified context buffers.\n *\n * \\param ctx       context to use\n * \\param header    header string to seek and expect\n * \\param footer    footer string to seek and expect\n * \\param data      source data to look in (must be nul-terminated)\n * \\param pwd       password for decryption (can be NULL)\n * \\param pwdlen    length of password\n * \\param use_len   destination for total length used (set after header is\n *                  correctly read, so unless you get\n *                  MBEDTLS_ERR_PEM_BAD_INPUT_DATA or\n *                  MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT, use_len is\n *                  the length to skip)\n *\n * \\note            Attempts to check password correctness by verifying if\n *                  the decrypted text starts with an ASN.1 sequence of\n *                  appropriate length\n *\n * \\return          0 on success, or a specific PEM error code\n */\nint mbedtls_pem_read_buffer( mbedtls_pem_context *ctx, const char *header, const char *footer,\n                     const unsigned char *data,\n                     const unsigned char *pwd,\n                     size_t pwdlen, size_t *use_len );\n\n/**\n * \\brief       PEM context memory freeing\n *\n * \\param ctx   context to be freed\n */\nvoid mbedtls_pem_free( mbedtls_pem_context *ctx );\n#endif /* MBEDTLS_PEM_PARSE_C */\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n/**\n * \\brief           Write a buffer of PEM information from a DER encoded\n *                  buffer.\n *\n * \\param header    header string to write\n * \\param footer    footer string to write\n * \\param der_data  DER data to write\n * \\param der_len   length of the DER data\n * \\param buf       buffer to write to\n * \\param buf_len   length of output buffer\n * \\param olen      total length written / required (if buf_len is not enough)\n *\n * \\return          0 on success, or a specific PEM or BASE64 error code. On\n *                  MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL olen is the required\n *                  size.\n */\nint mbedtls_pem_write_buffer( const char *header, const char *footer,\n                      const unsigned char *der_data, size_t der_len,\n                      unsigned char *buf, size_t buf_len, size_t *olen );\n#endif /* MBEDTLS_PEM_WRITE_C */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* pem.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/pk.h",
    "content": "/**\n * \\file pk.h\n *\n * \\brief Public Key abstraction layer\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#ifndef MBEDTLS_PK_H\n#define MBEDTLS_PK_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"md.h\"\n\n#if defined(MBEDTLS_RSA_C)\n#include \"rsa.h\"\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n#include \"ecp.h\"\n#endif\n\n#if defined(MBEDTLS_ECDSA_C)\n#include \"ecdsa.h\"\n#endif\n\n#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \\\n    !defined(inline) && !defined(__cplusplus)\n#define inline __inline\n#endif\n\n#define MBEDTLS_ERR_PK_ALLOC_FAILED        -0x3F80  /**< Memory allocation failed. */\n#define MBEDTLS_ERR_PK_TYPE_MISMATCH       -0x3F00  /**< Type mismatch, eg attempt to encrypt with an ECDSA key */\n#define MBEDTLS_ERR_PK_BAD_INPUT_DATA      -0x3E80  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_PK_FILE_IO_ERROR       -0x3E00  /**< Read/write of file failed. */\n#define MBEDTLS_ERR_PK_KEY_INVALID_VERSION -0x3D80  /**< Unsupported key version */\n#define MBEDTLS_ERR_PK_KEY_INVALID_FORMAT  -0x3D00  /**< Invalid key tag or value. */\n#define MBEDTLS_ERR_PK_UNKNOWN_PK_ALG      -0x3C80  /**< Key algorithm is unsupported (only RSA and EC are supported). */\n#define MBEDTLS_ERR_PK_PASSWORD_REQUIRED   -0x3C00  /**< Private key password can't be empty. */\n#define MBEDTLS_ERR_PK_PASSWORD_MISMATCH   -0x3B80  /**< Given private key password does not allow for correct decryption. */\n#define MBEDTLS_ERR_PK_INVALID_PUBKEY      -0x3B00  /**< The pubkey tag or value is invalid (only RSA and EC are supported). */\n#define MBEDTLS_ERR_PK_INVALID_ALG         -0x3A80  /**< The algorithm tag or value is invalid. */\n#define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00  /**< Elliptic curve is unsupported (only NIST curves are supported). */\n#define MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -0x3980  /**< Unavailable feature, e.g. RSA disabled for RSA key. */\n#define MBEDTLS_ERR_PK_SIG_LEN_MISMATCH    -0x3900  /**< The signature is valid but its length is less than expected. */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Public key types\n */\ntypedef enum {\n    MBEDTLS_PK_NONE=0,\n    MBEDTLS_PK_RSA,\n    MBEDTLS_PK_ECKEY,\n    MBEDTLS_PK_ECKEY_DH,\n    MBEDTLS_PK_ECDSA,\n    MBEDTLS_PK_RSA_ALT,\n    MBEDTLS_PK_RSASSA_PSS,\n} mbedtls_pk_type_t;\n\n/**\n * \\brief           Options for RSASSA-PSS signature verification.\n *                  See \\c mbedtls_rsa_rsassa_pss_verify_ext()\n */\ntypedef struct\n{\n    mbedtls_md_type_t mgf1_hash_id;\n    int expected_salt_len;\n\n} mbedtls_pk_rsassa_pss_options;\n\n/**\n * \\brief           Types for interfacing with the debug module\n */\ntypedef enum\n{\n    MBEDTLS_PK_DEBUG_NONE = 0,\n    MBEDTLS_PK_DEBUG_MPI,\n    MBEDTLS_PK_DEBUG_ECP,\n} mbedtls_pk_debug_type;\n\n/**\n * \\brief           Item to send to the debug module\n */\ntypedef struct\n{\n    mbedtls_pk_debug_type type;\n    const char *name;\n    void *value;\n} mbedtls_pk_debug_item;\n\n/** Maximum number of item send for debugging, plus 1 */\n#define MBEDTLS_PK_DEBUG_MAX_ITEMS 3\n\n/**\n * \\brief           Public key information and operations\n */\ntypedef struct mbedtls_pk_info_t mbedtls_pk_info_t;\n\n/**\n * \\brief           Public key container\n */\ntypedef struct\n{\n    const mbedtls_pk_info_t *   pk_info; /**< Public key informations        */\n    void *                      pk_ctx;  /**< Underlying public key context  */\n} mbedtls_pk_context;\n\n#if defined(MBEDTLS_RSA_C)\n/**\n * Quick access to an RSA context inside a PK context.\n *\n * \\warning You must make sure the PK context actually holds an RSA context\n * before using this function!\n */\nstatic inline mbedtls_rsa_context *mbedtls_pk_rsa( const mbedtls_pk_context pk )\n{\n    return( (mbedtls_rsa_context *) (pk).pk_ctx );\n}\n#endif /* MBEDTLS_RSA_C */\n\n#if defined(MBEDTLS_ECP_C)\n/**\n * Quick access to an EC context inside a PK context.\n *\n * \\warning You must make sure the PK context actually holds an EC context\n * before using this function!\n */\nstatic inline mbedtls_ecp_keypair *mbedtls_pk_ec( const mbedtls_pk_context pk )\n{\n    return( (mbedtls_ecp_keypair *) (pk).pk_ctx );\n}\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)\n/**\n * \\brief           Types for RSA-alt abstraction\n */\ntypedef int (*mbedtls_pk_rsa_alt_decrypt_func)( void *ctx, int mode, size_t *olen,\n                    const unsigned char *input, unsigned char *output,\n                    size_t output_max_len );\ntypedef int (*mbedtls_pk_rsa_alt_sign_func)( void *ctx,\n                    int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,\n                    int mode, mbedtls_md_type_t md_alg, unsigned int hashlen,\n                    const unsigned char *hash, unsigned char *sig );\ntypedef size_t (*mbedtls_pk_rsa_alt_key_len_func)( void *ctx );\n#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */\n\n/**\n * \\brief           Return information associated with the given PK type\n *\n * \\param pk_type   PK type to search for.\n *\n * \\return          The PK info associated with the type or NULL if not found.\n */\nconst mbedtls_pk_info_t *mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type );\n\n/**\n * \\brief           Initialize a mbedtls_pk_context (as NONE)\n */\nvoid mbedtls_pk_init( mbedtls_pk_context *ctx );\n\n/**\n * \\brief           Free a mbedtls_pk_context\n */\nvoid mbedtls_pk_free( mbedtls_pk_context *ctx );\n\n/**\n * \\brief           Initialize a PK context with the information given\n *                  and allocates the type-specific PK subcontext.\n *\n * \\param ctx       Context to initialize. Must be empty (type NONE).\n * \\param info      Information to use\n *\n * \\return          0 on success,\n *                  MBEDTLS_ERR_PK_BAD_INPUT_DATA on invalid input,\n *                  MBEDTLS_ERR_PK_ALLOC_FAILED on allocation failure.\n *\n * \\note            For contexts holding an RSA-alt key, use\n *                  \\c mbedtls_pk_setup_rsa_alt() instead.\n */\nint mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info );\n\n#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)\n/**\n * \\brief           Initialize an RSA-alt context\n *\n * \\param ctx       Context to initialize. Must be empty (type NONE).\n * \\param key       RSA key pointer\n * \\param decrypt_func  Decryption function\n * \\param sign_func     Signing function\n * \\param key_len_func  Function returning key length in bytes\n *\n * \\return          0 on success, or MBEDTLS_ERR_PK_BAD_INPUT_DATA if the\n *                  context wasn't already initialized as RSA_ALT.\n *\n * \\note            This function replaces \\c mbedtls_pk_setup() for RSA-alt.\n */\nint mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key,\n                         mbedtls_pk_rsa_alt_decrypt_func decrypt_func,\n                         mbedtls_pk_rsa_alt_sign_func sign_func,\n                         mbedtls_pk_rsa_alt_key_len_func key_len_func );\n#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */\n\n/**\n * \\brief           Get the size in bits of the underlying key\n *\n * \\param ctx       Context to use\n *\n * \\return          Key size in bits, or 0 on error\n */\nsize_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx );\n\n/**\n * \\brief           Get the length in bytes of the underlying key\n * \\param ctx       Context to use\n *\n * \\return          Key length in bytes, or 0 on error\n */\nstatic inline size_t mbedtls_pk_get_len( const mbedtls_pk_context *ctx )\n{\n    return( ( mbedtls_pk_get_bitlen( ctx ) + 7 ) / 8 );\n}\n\n/**\n * \\brief           Tell if a context can do the operation given by type\n *\n * \\param ctx       Context to test\n * \\param type      Target type\n *\n * \\return          0 if context can't do the operations,\n *                  1 otherwise.\n */\nint mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type );\n\n/**\n * \\brief           Verify signature (including padding if relevant).\n *\n * \\param ctx       PK context to use\n * \\param md_alg    Hash algorithm used (see notes)\n * \\param hash      Hash of the message to sign\n * \\param hash_len  Hash length or 0 (see notes)\n * \\param sig       Signature to verify\n * \\param sig_len   Signature length\n *\n * \\return          0 on success (signature is valid),\n *                  MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if the signature is\n *                  valid but its actual length is less than sig_len,\n *                  or a specific error code.\n *\n * \\note            For RSA keys, the default padding type is PKCS#1 v1.5.\n *                  Use \\c mbedtls_pk_verify_ext( MBEDTLS_PK_RSASSA_PSS, ... )\n *                  to verify RSASSA_PSS signatures.\n *\n * \\note            If hash_len is 0, then the length associated with md_alg\n *                  is used instead, or an error returned if it is invalid.\n *\n * \\note            md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0\n */\nint mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,\n               const unsigned char *hash, size_t hash_len,\n               const unsigned char *sig, size_t sig_len );\n\n/**\n * \\brief           Verify signature, with options.\n *                  (Includes verification of the padding depending on type.)\n *\n * \\param type      Signature type (inc. possible padding type) to verify\n * \\param options   Pointer to type-specific options, or NULL\n * \\param ctx       PK context to use\n * \\param md_alg    Hash algorithm used (see notes)\n * \\param hash      Hash of the message to sign\n * \\param hash_len  Hash length or 0 (see notes)\n * \\param sig       Signature to verify\n * \\param sig_len   Signature length\n *\n * \\return          0 on success (signature is valid),\n *                  MBEDTLS_ERR_PK_TYPE_MISMATCH if the PK context can't be\n *                  used for this type of signatures,\n *                  MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if the signature is\n *                  valid but its actual length is less than sig_len,\n *                  or a specific error code.\n *\n * \\note            If hash_len is 0, then the length associated with md_alg\n *                  is used instead, or an error returned if it is invalid.\n *\n * \\note            md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0\n *\n * \\note            If type is MBEDTLS_PK_RSASSA_PSS, then options must point\n *                  to a mbedtls_pk_rsassa_pss_options structure,\n *                  otherwise it must be NULL.\n */\nint mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options,\n                   mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,\n                   const unsigned char *hash, size_t hash_len,\n                   const unsigned char *sig, size_t sig_len );\n\n/**\n * \\brief           Make signature, including padding if relevant.\n *\n * \\param ctx       PK context to use - must hold a private key\n * \\param md_alg    Hash algorithm used (see notes)\n * \\param hash      Hash of the message to sign\n * \\param hash_len  Hash length or 0 (see notes)\n * \\param sig       Place to write the signature\n * \\param sig_len   Number of bytes written\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\return          0 on success, or a specific error code.\n *\n * \\note            For RSA keys, the default padding type is PKCS#1 v1.5.\n *                  There is no interface in the PK module to make RSASSA-PSS\n *                  signatures yet.\n *\n * \\note            If hash_len is 0, then the length associated with md_alg\n *                  is used instead, or an error returned if it is invalid.\n *\n * \\note            For RSA, md_alg may be MBEDTLS_MD_NONE if hash_len != 0.\n *                  For ECDSA, md_alg may never be MBEDTLS_MD_NONE.\n */\nint mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,\n             const unsigned char *hash, size_t hash_len,\n             unsigned char *sig, size_t *sig_len,\n             int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );\n\n/**\n * \\brief           Decrypt message (including padding if relevant).\n *\n * \\param ctx       PK context to use - must hold a private key\n * \\param input     Input to decrypt\n * \\param ilen      Input size\n * \\param output    Decrypted output\n * \\param olen      Decrypted message length\n * \\param osize     Size of the output buffer\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\note            For RSA keys, the default padding type is PKCS#1 v1.5.\n *\n * \\return          0 on success, or a specific error code.\n */\nint mbedtls_pk_decrypt( mbedtls_pk_context *ctx,\n                const unsigned char *input, size_t ilen,\n                unsigned char *output, size_t *olen, size_t osize,\n                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );\n\n/**\n * \\brief           Encrypt message (including padding if relevant).\n *\n * \\param ctx       PK context to use\n * \\param input     Message to encrypt\n * \\param ilen      Message size\n * \\param output    Encrypted output\n * \\param olen      Encrypted output length\n * \\param osize     Size of the output buffer\n * \\param f_rng     RNG function\n * \\param p_rng     RNG parameter\n *\n * \\note            For RSA keys, the default padding type is PKCS#1 v1.5.\n *\n * \\return          0 on success, or a specific error code.\n */\nint mbedtls_pk_encrypt( mbedtls_pk_context *ctx,\n                const unsigned char *input, size_t ilen,\n                unsigned char *output, size_t *olen, size_t osize,\n                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );\n\n/**\n * \\brief           Check if a public-private pair of keys matches.\n *\n * \\param pub       Context holding a public key.\n * \\param prv       Context holding a private (and public) key.\n *\n * \\return          0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA\n */\nint mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv );\n\n/**\n * \\brief           Export debug information\n *\n * \\param ctx       Context to use\n * \\param items     Place to write debug items\n *\n * \\return          0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA\n */\nint mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items );\n\n/**\n * \\brief           Access the type name\n *\n * \\param ctx       Context to use\n *\n * \\return          Type name on success, or \"invalid PK\"\n */\nconst char * mbedtls_pk_get_name( const mbedtls_pk_context *ctx );\n\n/**\n * \\brief           Get the key type\n *\n * \\param ctx       Context to use\n *\n * \\return          Type on success, or MBEDTLS_PK_NONE\n */\nmbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx );\n\n#if defined(MBEDTLS_PK_PARSE_C)\n/** \\ingroup pk_module */\n/**\n * \\brief           Parse a private key in PEM or DER format\n *\n * \\param ctx       key to be initialized\n * \\param key       input buffer\n * \\param keylen    size of the buffer\n *                  (including the terminating null byte for PEM data)\n * \\param pwd       password for decryption (optional)\n * \\param pwdlen    size of the password\n *\n * \\note            On entry, ctx must be empty, either freshly initialised\n *                  with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a\n *                  specific key type, check the result with mbedtls_pk_can_do().\n *\n * \\note            The key is also checked for correctness.\n *\n * \\return          0 if successful, or a specific PK or PEM error code\n */\nint mbedtls_pk_parse_key( mbedtls_pk_context *ctx,\n                  const unsigned char *key, size_t keylen,\n                  const unsigned char *pwd, size_t pwdlen );\n\n/** \\ingroup pk_module */\n/**\n * \\brief           Parse a public key in PEM or DER format\n *\n * \\param ctx       key to be initialized\n * \\param key       input buffer\n * \\param keylen    size of the buffer\n *                  (including the terminating null byte for PEM data)\n *\n * \\note            On entry, ctx must be empty, either freshly initialised\n *                  with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a\n *                  specific key type, check the result with mbedtls_pk_can_do().\n *\n * \\note            The key is also checked for correctness.\n *\n * \\return          0 if successful, or a specific PK or PEM error code\n */\nint mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx,\n                         const unsigned char *key, size_t keylen );\n\n#if defined(MBEDTLS_FS_IO)\n/** \\ingroup pk_module */\n/**\n * \\brief           Load and parse a private key\n *\n * \\param ctx       key to be initialized\n * \\param path      filename to read the private key from\n * \\param password  password to decrypt the file (can be NULL)\n *\n * \\note            On entry, ctx must be empty, either freshly initialised\n *                  with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a\n *                  specific key type, check the result with mbedtls_pk_can_do().\n *\n * \\note            The key is also checked for correctness.\n *\n * \\return          0 if successful, or a specific PK or PEM error code\n */\nint mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx,\n                      const char *path, const char *password );\n\n/** \\ingroup pk_module */\n/**\n * \\brief           Load and parse a public key\n *\n * \\param ctx       key to be initialized\n * \\param path      filename to read the public key from\n *\n * \\note            On entry, ctx must be empty, either freshly initialised\n *                  with mbedtls_pk_init() or reset with mbedtls_pk_free(). If\n *                  you need a specific key type, check the result with\n *                  mbedtls_pk_can_do().\n *\n * \\note            The key is also checked for correctness.\n *\n * \\return          0 if successful, or a specific PK or PEM error code\n */\nint mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path );\n#endif /* MBEDTLS_FS_IO */\n#endif /* MBEDTLS_PK_PARSE_C */\n\n#if defined(MBEDTLS_PK_WRITE_C)\n/**\n * \\brief           Write a private key to a PKCS#1 or SEC1 DER structure\n *                  Note: data is written at the end of the buffer! Use the\n *                        return value to determine where you should start\n *                        using the buffer\n *\n * \\param ctx       private to write away\n * \\param buf       buffer to write to\n * \\param size      size of the buffer\n *\n * \\return          length of data written if successful, or a specific\n *                  error code\n */\nint mbedtls_pk_write_key_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );\n\n/**\n * \\brief           Write a public key to a SubjectPublicKeyInfo DER structure\n *                  Note: data is written at the end of the buffer! Use the\n *                        return value to determine where you should start\n *                        using the buffer\n *\n * \\param ctx       public key to write away\n * \\param buf       buffer to write to\n * \\param size      size of the buffer\n *\n * \\return          length of data written if successful, or a specific\n *                  error code\n */\nint mbedtls_pk_write_pubkey_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n/**\n * \\brief           Write a public key to a PEM string\n *\n * \\param ctx       public key to write away\n * \\param buf       buffer to write to\n * \\param size      size of the buffer\n *\n * \\return          0 if successful, or a specific error code\n */\nint mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );\n\n/**\n * \\brief           Write a private key to a PKCS#1 or SEC1 PEM string\n *\n * \\param ctx       private to write away\n * \\param buf       buffer to write to\n * \\param size      size of the buffer\n *\n * \\return          0 if successful, or a specific error code\n */\nint mbedtls_pk_write_key_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );\n#endif /* MBEDTLS_PEM_WRITE_C */\n#endif /* MBEDTLS_PK_WRITE_C */\n\n/*\n * WARNING: Low-level functions. You probably do not want to use these unless\n *          you are certain you do ;)\n */\n\n#if defined(MBEDTLS_PK_PARSE_C)\n/**\n * \\brief           Parse a SubjectPublicKeyInfo DER structure\n *\n * \\param p         the position in the ASN.1 data\n * \\param end       end of the buffer\n * \\param pk        the key to fill\n *\n * \\return          0 if successful, or a specific PK error code\n */\nint mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end,\n                        mbedtls_pk_context *pk );\n#endif /* MBEDTLS_PK_PARSE_C */\n\n#if defined(MBEDTLS_PK_WRITE_C)\n/**\n * \\brief           Write a subjectPublicKey to ASN.1 data\n *                  Note: function works backwards in data buffer\n *\n * \\param p         reference to current position pointer\n * \\param start     start of the buffer (for bounds-checking)\n * \\param key       public key to write away\n *\n * \\return          the length written or a negative error code\n */\nint mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start,\n                     const mbedtls_pk_context *key );\n#endif /* MBEDTLS_PK_WRITE_C */\n\n/*\n * Internal module functions. You probably do not want to use these unless you\n * know you do.\n */\n#if defined(MBEDTLS_FS_IO)\nint mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n );\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_PK_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/pk_internal.h",
    "content": "/**\n * \\file pk.h\n *\n * \\brief Public Key abstraction layer: wrapper functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#ifndef MBEDTLS_PK_WRAP_H\n#define MBEDTLS_PK_WRAP_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"pk.h\"\n\nstruct mbedtls_pk_info_t\n{\n    /** Public key type */\n    mbedtls_pk_type_t type;\n\n    /** Type name */\n    const char *name;\n\n    /** Get key size in bits */\n    size_t (*get_bitlen)( const void * );\n\n    /** Tell if the context implements this type (e.g. ECKEY can do ECDSA) */\n    int (*can_do)( mbedtls_pk_type_t type );\n\n    /** Verify signature */\n    int (*verify_func)( void *ctx, mbedtls_md_type_t md_alg,\n                        const unsigned char *hash, size_t hash_len,\n                        const unsigned char *sig, size_t sig_len );\n\n    /** Make signature */\n    int (*sign_func)( void *ctx, mbedtls_md_type_t md_alg,\n                      const unsigned char *hash, size_t hash_len,\n                      unsigned char *sig, size_t *sig_len,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng );\n\n    /** Decrypt message */\n    int (*decrypt_func)( void *ctx, const unsigned char *input, size_t ilen,\n                         unsigned char *output, size_t *olen, size_t osize,\n                         int (*f_rng)(void *, unsigned char *, size_t),\n                         void *p_rng );\n\n    /** Encrypt message */\n    int (*encrypt_func)( void *ctx, const unsigned char *input, size_t ilen,\n                         unsigned char *output, size_t *olen, size_t osize,\n                         int (*f_rng)(void *, unsigned char *, size_t),\n                         void *p_rng );\n\n    /** Check public-private key pair */\n    int (*check_pair_func)( const void *pub, const void *prv );\n\n    /** Allocate a new context */\n    void * (*ctx_alloc_func)( void );\n\n    /** Free the given context */\n    void (*ctx_free_func)( void *ctx );\n\n    /** Interface with the debug module */\n    void (*debug_func)( const void *ctx, mbedtls_pk_debug_item *items );\n\n};\n#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)\n/* Container for RSA-alt */\ntypedef struct\n{\n    void *key;\n    mbedtls_pk_rsa_alt_decrypt_func decrypt_func;\n    mbedtls_pk_rsa_alt_sign_func sign_func;\n    mbedtls_pk_rsa_alt_key_len_func key_len_func;\n} mbedtls_rsa_alt_context;\n#endif\n\n#if defined(MBEDTLS_RSA_C)\nextern const mbedtls_pk_info_t mbedtls_rsa_info;\n#endif\n\n#if defined(MBEDTLS_ECP_C)\nextern const mbedtls_pk_info_t mbedtls_eckey_info;\nextern const mbedtls_pk_info_t mbedtls_eckeydh_info;\n#endif\n\n#if defined(MBEDTLS_ECDSA_C)\nextern const mbedtls_pk_info_t mbedtls_ecdsa_info;\n#endif\n\n#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)\nextern const mbedtls_pk_info_t mbedtls_rsa_alt_info;\n#endif\n\n#endif /* MBEDTLS_PK_WRAP_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/pkcs11.h",
    "content": "/**\n * \\file pkcs11.h\n *\n * \\brief Wrapper for PKCS#11 library libpkcs11-helper\n *\n * \\author Adriaan de Jong <dejong@fox-it.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_PKCS11_H\n#define MBEDTLS_PKCS11_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PKCS11_C)\n\n#include \"x509_crt.h\"\n\n#include <pkcs11-helper-1.0/pkcs11h-certificate.h>\n\n#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \\\n    !defined(inline) && !defined(__cplusplus)\n#define inline __inline\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * Context for PKCS #11 private keys.\n */\ntypedef struct {\n        pkcs11h_certificate_t pkcs11h_cert;\n        int len;\n} mbedtls_pkcs11_context;\n\n/**\n * Initialize a mbedtls_pkcs11_context.\n * (Just making memory references valid.)\n */\nvoid mbedtls_pkcs11_init( mbedtls_pkcs11_context *ctx );\n\n/**\n * Fill in a mbed TLS certificate, based on the given PKCS11 helper certificate.\n *\n * \\param cert          X.509 certificate to fill\n * \\param pkcs11h_cert  PKCS #11 helper certificate\n *\n * \\return              0 on success.\n */\nint mbedtls_pkcs11_x509_cert_bind( mbedtls_x509_crt *cert, pkcs11h_certificate_t pkcs11h_cert );\n\n/**\n * Set up a mbedtls_pkcs11_context storing the given certificate. Note that the\n * mbedtls_pkcs11_context will take over control of the certificate, freeing it when\n * done.\n *\n * \\param priv_key      Private key structure to fill.\n * \\param pkcs11_cert   PKCS #11 helper certificate\n *\n * \\return              0 on success\n */\nint mbedtls_pkcs11_priv_key_bind( mbedtls_pkcs11_context *priv_key,\n        pkcs11h_certificate_t pkcs11_cert );\n\n/**\n * Free the contents of the given private key context. Note that the structure\n * itself is not freed.\n *\n * \\param priv_key      Private key structure to cleanup\n */\nvoid mbedtls_pkcs11_priv_key_free( mbedtls_pkcs11_context *priv_key );\n\n/**\n * \\brief          Do an RSA private key decrypt, then remove the message\n *                 padding\n *\n * \\param ctx      PKCS #11 context\n * \\param mode     must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature\n * \\param input    buffer holding the encrypted data\n * \\param output   buffer that will hold the plaintext\n * \\param olen     will contain the plaintext length\n * \\param output_max_len    maximum length of the output buffer\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The output buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used) otherwise\n *                 an error is thrown.\n */\nint mbedtls_pkcs11_decrypt( mbedtls_pkcs11_context *ctx,\n                       int mode, size_t *olen,\n                       const unsigned char *input,\n                       unsigned char *output,\n                       size_t output_max_len );\n\n/**\n * \\brief          Do a private RSA to sign a message digest\n *\n * \\param ctx      PKCS #11 context\n * \\param mode     must be MBEDTLS_RSA_PRIVATE, for compatibility with rsa.c's signature\n * \\param md_alg   a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data)\n * \\param hashlen  message digest length (for MBEDTLS_MD_NONE only)\n * \\param hash     buffer holding the message digest\n * \\param sig      buffer that will hold the ciphertext\n *\n * \\return         0 if the signing operation was successful,\n *                 or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The \"sig\" buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_pkcs11_sign( mbedtls_pkcs11_context *ctx,\n                    int mode,\n                    mbedtls_md_type_t md_alg,\n                    unsigned int hashlen,\n                    const unsigned char *hash,\n                    unsigned char *sig );\n\n/**\n * SSL/TLS wrappers for PKCS#11 functions\n */\nstatic inline int mbedtls_ssl_pkcs11_decrypt( void *ctx, int mode, size_t *olen,\n                        const unsigned char *input, unsigned char *output,\n                        size_t output_max_len )\n{\n    return mbedtls_pkcs11_decrypt( (mbedtls_pkcs11_context *) ctx, mode, olen, input, output,\n                           output_max_len );\n}\n\nstatic inline int mbedtls_ssl_pkcs11_sign( void *ctx,\n                     int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,\n                     int mode, mbedtls_md_type_t md_alg, unsigned int hashlen,\n                     const unsigned char *hash, unsigned char *sig )\n{\n    ((void) f_rng);\n    ((void) p_rng);\n    return mbedtls_pkcs11_sign( (mbedtls_pkcs11_context *) ctx, mode, md_alg,\n                        hashlen, hash, sig );\n}\n\nstatic inline size_t mbedtls_ssl_pkcs11_key_len( void *ctx )\n{\n    return ( (mbedtls_pkcs11_context *) ctx )->len;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_PKCS11_C */\n\n#endif /* MBEDTLS_PKCS11_H */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/pkcs12.h",
    "content": "/**\n * \\file pkcs12.h\n *\n * \\brief PKCS#12 Personal Information Exchange Syntax\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_PKCS12_H\n#define MBEDTLS_PKCS12_H\n\n#include \"md.h\"\n#include \"cipher.h\"\n#include \"asn1.h\"\n\n#include <stddef.h>\n\n#define MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA                 -0x1F80  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE            -0x1F00  /**< Feature not available, e.g. unsupported encryption scheme. */\n#define MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT             -0x1E80  /**< PBE ASN.1 data not as expected. */\n#define MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH              -0x1E00  /**< Given private key password does not allow for correct decryption. */\n\n#define MBEDTLS_PKCS12_DERIVE_KEY       1   /**< encryption/decryption key */\n#define MBEDTLS_PKCS12_DERIVE_IV        2   /**< initialization vector     */\n#define MBEDTLS_PKCS12_DERIVE_MAC_KEY   3   /**< integrity / MAC key       */\n\n#define MBEDTLS_PKCS12_PBE_DECRYPT      0\n#define MBEDTLS_PKCS12_PBE_ENCRYPT      1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief            PKCS12 Password Based function (encryption / decryption)\n *                   for pbeWithSHAAnd128BitRC4\n *\n * \\param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure\n * \\param mode       either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT\n * \\param pwd        the password used (may be NULL if no password is used)\n * \\param pwdlen     length of the password (may be 0)\n * \\param input      the input data\n * \\param len        data length\n * \\param output     the output buffer\n *\n * \\return           0 if successful, or a MBEDTLS_ERR_XXX code\n */\nint mbedtls_pkcs12_pbe_sha1_rc4_128( mbedtls_asn1_buf *pbe_params, int mode,\n                             const unsigned char *pwd,  size_t pwdlen,\n                             const unsigned char *input, size_t len,\n                             unsigned char *output );\n\n/**\n * \\brief            PKCS12 Password Based function (encryption / decryption)\n *                   for cipher-based and mbedtls_md-based PBE's\n *\n * \\param pbe_params an ASN1 buffer containing the pkcs-12PbeParams structure\n * \\param mode       either MBEDTLS_PKCS12_PBE_ENCRYPT or MBEDTLS_PKCS12_PBE_DECRYPT\n * \\param cipher_type the cipher used\n * \\param md_type     the mbedtls_md used\n * \\param pwd        the password used (may be NULL if no password is used)\n * \\param pwdlen     length of the password (may be 0)\n * \\param input      the input data\n * \\param len        data length\n * \\param output     the output buffer\n *\n * \\return           0 if successful, or a MBEDTLS_ERR_XXX code\n */\nint mbedtls_pkcs12_pbe( mbedtls_asn1_buf *pbe_params, int mode,\n                mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type,\n                const unsigned char *pwd,  size_t pwdlen,\n                const unsigned char *input, size_t len,\n                unsigned char *output );\n\n/**\n * \\brief            The PKCS#12 derivation function uses a password and a salt\n *                   to produce pseudo-random bits for a particular \"purpose\".\n *\n *                   Depending on the given id, this function can produce an\n *                   encryption/decryption key, an nitialization vector or an\n *                   integrity key.\n *\n * \\param data       buffer to store the derived data in\n * \\param datalen    length to fill\n * \\param pwd        password to use (may be NULL if no password is used)\n * \\param pwdlen     length of the password (may be 0)\n * \\param salt       salt buffer to use\n * \\param saltlen    length of the salt\n * \\param mbedtls_md         mbedtls_md type to use during the derivation\n * \\param id         id that describes the purpose (can be MBEDTLS_PKCS12_DERIVE_KEY,\n *                   MBEDTLS_PKCS12_DERIVE_IV or MBEDTLS_PKCS12_DERIVE_MAC_KEY)\n * \\param iterations number of iterations\n *\n * \\return          0 if successful, or a MD, BIGNUM type error.\n */\nint mbedtls_pkcs12_derivation( unsigned char *data, size_t datalen,\n                       const unsigned char *pwd, size_t pwdlen,\n                       const unsigned char *salt, size_t saltlen,\n                       mbedtls_md_type_t mbedtls_md, int id, int iterations );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* pkcs12.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/pkcs5.h",
    "content": "/**\n * \\file pkcs5.h\n *\n * \\brief PKCS#5 functions\n *\n * \\author Mathias Olsson <mathias@kompetensum.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_PKCS5_H\n#define MBEDTLS_PKCS5_H\n\n#include \"asn1.h\"\n#include \"md.h\"\n\n#include <stddef.h>\n#include <stdint.h>\n\n#define MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA                  -0x2f80  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_PKCS5_INVALID_FORMAT                  -0x2f00  /**< Unexpected ASN.1 data. */\n#define MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE             -0x2e80  /**< Requested encryption or digest alg not available. */\n#define MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH               -0x2e00  /**< Given private key password does not allow for correct decryption. */\n\n#define MBEDTLS_PKCS5_DECRYPT      0\n#define MBEDTLS_PKCS5_ENCRYPT      1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          PKCS#5 PBES2 function\n *\n * \\param pbe_params the ASN.1 algorithm parameters\n * \\param mode       either MBEDTLS_PKCS5_DECRYPT or MBEDTLS_PKCS5_ENCRYPT\n * \\param pwd        password to use when generating key\n * \\param pwdlen     length of password\n * \\param data       data to process\n * \\param datalen    length of data\n * \\param output     output buffer\n *\n * \\returns        0 on success, or a MBEDTLS_ERR_XXX code if verification fails.\n */\nint mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode,\n                 const unsigned char *pwd,  size_t pwdlen,\n                 const unsigned char *data, size_t datalen,\n                 unsigned char *output );\n\n/**\n * \\brief          PKCS#5 PBKDF2 using HMAC\n *\n * \\param ctx      Generic HMAC context\n * \\param password Password to use when generating key\n * \\param plen     Length of password\n * \\param salt     Salt to use when generating key\n * \\param slen     Length of salt\n * \\param iteration_count       Iteration count\n * \\param key_length            Length of generated key in bytes\n * \\param output   Generated key. Must be at least as big as key_length\n *\n * \\returns        0 on success, or a MBEDTLS_ERR_XXX code if verification fails.\n */\nint mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *password,\n                       size_t plen, const unsigned char *salt, size_t slen,\n                       unsigned int iteration_count,\n                       uint32_t key_length, unsigned char *output );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_pkcs5_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* pkcs5.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/platform.h",
    "content": "/**\n * \\file platform.h\n *\n * \\brief mbed TLS Platform abstraction layer\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_PLATFORM_H\n#define MBEDTLS_PLATFORM_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_HAVE_TIME)\n#include \"mbedtls/platform_time.h\"\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\name SECTION: Module settings\n *\n * The configuration options you can set for this module are in this section.\n * Either change them in config.h or define them on the compiler command line.\n * \\{\n */\n\n#if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS)\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n#if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF)\n#if defined(_WIN32)\n#define MBEDTLS_PLATFORM_STD_SNPRINTF   mbedtls_platform_win32_snprintf /**< Default snprintf to use  */\n#else\n#define MBEDTLS_PLATFORM_STD_SNPRINTF   snprintf /**< Default snprintf to use  */\n#endif\n#endif\n#if !defined(MBEDTLS_PLATFORM_STD_PRINTF)\n#define MBEDTLS_PLATFORM_STD_PRINTF   printf /**< Default printf to use  */\n#endif\n#if !defined(MBEDTLS_PLATFORM_STD_FPRINTF)\n#define MBEDTLS_PLATFORM_STD_FPRINTF fprintf /**< Default fprintf to use */\n#endif\n#if !defined(MBEDTLS_PLATFORM_STD_CALLOC)\n#define MBEDTLS_PLATFORM_STD_CALLOC   calloc /**< Default allocator to use */\n#endif\n#if !defined(MBEDTLS_PLATFORM_STD_FREE)\n#define MBEDTLS_PLATFORM_STD_FREE       free /**< Default free to use */\n#endif\n#if !defined(MBEDTLS_PLATFORM_STD_EXIT)\n#define MBEDTLS_PLATFORM_STD_EXIT      exit /**< Default exit to use */\n#endif\n#if !defined(MBEDTLS_PLATFORM_STD_TIME)\n#define MBEDTLS_PLATFORM_STD_TIME       time    /**< Default time to use */\n#endif\n#if !defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS)\n#define MBEDTLS_PLATFORM_STD_EXIT_SUCCESS  EXIT_SUCCESS /**< Default exit value to use */\n#endif\n#if !defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE)\n#define MBEDTLS_PLATFORM_STD_EXIT_FAILURE  EXIT_FAILURE /**< Default exit value to use */\n#endif\n#if defined(MBEDTLS_FS_IO)\n#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ)\n#define MBEDTLS_PLATFORM_STD_NV_SEED_READ   mbedtls_platform_std_nv_seed_read\n#endif\n#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE)\n#define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE  mbedtls_platform_std_nv_seed_write\n#endif\n#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_FILE)\n#define MBEDTLS_PLATFORM_STD_NV_SEED_FILE   \"seedfile\"\n#endif\n#endif /* MBEDTLS_FS_IO */\n#else /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */\n#if defined(MBEDTLS_PLATFORM_STD_MEM_HDR)\n#include MBEDTLS_PLATFORM_STD_MEM_HDR\n#endif\n#endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */\n\n\n/* \\} name SECTION: Module settings */\n\n/*\n * The function pointers for calloc and free\n */\n#if defined(MBEDTLS_PLATFORM_MEMORY)\n#if defined(MBEDTLS_PLATFORM_FREE_MACRO) && \\\n    defined(MBEDTLS_PLATFORM_CALLOC_MACRO)\n#define mbedtls_free       MBEDTLS_PLATFORM_FREE_MACRO\n#define mbedtls_calloc     MBEDTLS_PLATFORM_CALLOC_MACRO\n#else\n/* For size_t */\n#include <stddef.h>\nextern void * (*mbedtls_calloc)( size_t n, size_t size );\nextern void (*mbedtls_free)( void *ptr );\n\n/**\n * \\brief   Set your own memory implementation function pointers\n *\n * \\param calloc_func   the calloc function implementation\n * \\param free_func     the free function implementation\n *\n * \\return              0 if successful\n */\nint mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ),\n                              void (*free_func)( void * ) );\n#endif /* MBEDTLS_PLATFORM_FREE_MACRO && MBEDTLS_PLATFORM_CALLOC_MACRO */\n#else /* !MBEDTLS_PLATFORM_MEMORY */\n#define mbedtls_free       free\n#define mbedtls_calloc     calloc\n#endif /* MBEDTLS_PLATFORM_MEMORY && !MBEDTLS_PLATFORM_{FREE,CALLOC}_MACRO */\n\n/*\n * The function pointers for fprintf\n */\n#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT)\n/* We need FILE * */\n#include <stdio.h>\nextern int (*mbedtls_fprintf)( FILE *stream, const char *format, ... );\n\n/**\n * \\brief   Set your own fprintf function pointer\n *\n * \\param fprintf_func   the fprintf function implementation\n *\n * \\return              0\n */\nint mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *stream, const char *,\n                                               ... ) );\n#else\n#if defined(MBEDTLS_PLATFORM_FPRINTF_MACRO)\n#define mbedtls_fprintf    MBEDTLS_PLATFORM_FPRINTF_MACRO\n#else\n#define mbedtls_fprintf    fprintf\n#endif /* MBEDTLS_PLATFORM_FPRINTF_MACRO */\n#endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */\n\n/*\n * The function pointers for printf\n */\n#if defined(MBEDTLS_PLATFORM_PRINTF_ALT)\nextern int (*mbedtls_printf)( const char *format, ... );\n\n/**\n * \\brief   Set your own printf function pointer\n *\n * \\param printf_func   the printf function implementation\n *\n * \\return              0\n */\nint mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) );\n#else /* !MBEDTLS_PLATFORM_PRINTF_ALT */\n#if defined(MBEDTLS_PLATFORM_PRINTF_MACRO)\n#define mbedtls_printf     MBEDTLS_PLATFORM_PRINTF_MACRO\n#else\n#define mbedtls_printf     printf\n#endif /* MBEDTLS_PLATFORM_PRINTF_MACRO */\n#endif /* MBEDTLS_PLATFORM_PRINTF_ALT */\n\n/*\n * The function pointers for snprintf\n *\n * The snprintf implementation should conform to C99:\n * - it *must* always correctly zero-terminate the buffer\n *   (except when n == 0, then it must leave the buffer untouched)\n * - however it is acceptable to return -1 instead of the required length when\n *   the destination buffer is too short.\n */\n#if defined(_WIN32)\n/* For Windows (inc. MSYS2), we provide our own fixed implementation */\nint mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... );\n#endif\n\n#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT)\nextern int (*mbedtls_snprintf)( char * s, size_t n, const char * format, ... );\n\n/**\n * \\brief   Set your own snprintf function pointer\n *\n * \\param snprintf_func   the snprintf function implementation\n *\n * \\return              0\n */\nint mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n,\n                                                 const char * format, ... ) );\n#else /* MBEDTLS_PLATFORM_SNPRINTF_ALT */\n#if defined(MBEDTLS_PLATFORM_SNPRINTF_MACRO)\n#define mbedtls_snprintf   MBEDTLS_PLATFORM_SNPRINTF_MACRO\n#else\n#define mbedtls_snprintf   snprintf\n#endif /* MBEDTLS_PLATFORM_SNPRINTF_MACRO */\n#endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */\n\n/*\n * The function pointers for exit\n */\n#if defined(MBEDTLS_PLATFORM_EXIT_ALT)\nextern void (*mbedtls_exit)( int status );\n\n/**\n * \\brief   Set your own exit function pointer\n *\n * \\param exit_func   the exit function implementation\n *\n * \\return              0\n */\nint mbedtls_platform_set_exit( void (*exit_func)( int status ) );\n#else\n#if defined(MBEDTLS_PLATFORM_EXIT_MACRO)\n#define mbedtls_exit   MBEDTLS_PLATFORM_EXIT_MACRO\n#else\n#define mbedtls_exit   exit\n#endif /* MBEDTLS_PLATFORM_EXIT_MACRO */\n#endif /* MBEDTLS_PLATFORM_EXIT_ALT */\n\n/*\n * The default exit values\n */\n#if defined(MBEDTLS_PLATFORM_STD_EXIT_SUCCESS)\n#define MBEDTLS_EXIT_SUCCESS MBEDTLS_PLATFORM_STD_EXIT_SUCCESS\n#else\n#define MBEDTLS_EXIT_SUCCESS 0\n#endif\n#if defined(MBEDTLS_PLATFORM_STD_EXIT_FAILURE)\n#define MBEDTLS_EXIT_FAILURE MBEDTLS_PLATFORM_STD_EXIT_FAILURE\n#else\n#define MBEDTLS_EXIT_FAILURE 1\n#endif\n\n/*\n * The function pointers for reading from and writing a seed file to\n * Non-Volatile storage (NV) in a platform-independent way\n *\n * Only enabled when the NV seed entropy source is enabled\n */\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\n#if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO)\n/* Internal standard platform definitions */\nint mbedtls_platform_std_nv_seed_read( unsigned char *buf, size_t buf_len );\nint mbedtls_platform_std_nv_seed_write( unsigned char *buf, size_t buf_len );\n#endif\n\n#if defined(MBEDTLS_PLATFORM_NV_SEED_ALT)\nextern int (*mbedtls_nv_seed_read)( unsigned char *buf, size_t buf_len );\nextern int (*mbedtls_nv_seed_write)( unsigned char *buf, size_t buf_len );\n\n/**\n * \\brief   Set your own seed file writing/reading functions\n *\n * \\param   nv_seed_read_func   the seed reading function implementation\n * \\param   nv_seed_write_func  the seed writing function implementation\n *\n * \\return              0\n */\nint mbedtls_platform_set_nv_seed(\n            int (*nv_seed_read_func)( unsigned char *buf, size_t buf_len ),\n            int (*nv_seed_write_func)( unsigned char *buf, size_t buf_len )\n            );\n#else\n#if defined(MBEDTLS_PLATFORM_NV_SEED_READ_MACRO) && \\\n    defined(MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO)\n#define mbedtls_nv_seed_read    MBEDTLS_PLATFORM_NV_SEED_READ_MACRO\n#define mbedtls_nv_seed_write   MBEDTLS_PLATFORM_NV_SEED_WRITE_MACRO\n#else\n#define mbedtls_nv_seed_read    mbedtls_platform_std_nv_seed_read\n#define mbedtls_nv_seed_write   mbedtls_platform_std_nv_seed_write\n#endif\n#endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */\n#endif /* MBEDTLS_ENTROPY_NV_SEED */\n\n#if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT)\n\n/**\n * \\brief   Platform context structure\n *\n * \\note    This structure may be used to assist platform-specific\n *          setup/teardown operations.\n */\ntypedef struct {\n    char dummy; /**< Placeholder member as empty structs are not portable */\n}\nmbedtls_platform_context;\n\n#else\n#include \"platform_alt.h\"\n#endif /* !MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */\n\n/**\n * \\brief   Perform any platform initialisation operations\n *\n * \\param   ctx     mbed TLS context\n *\n * \\return  0 if successful\n *\n * \\note    This function is intended to allow platform specific initialisation,\n *          and should be called before any other library functions. Its\n *          implementation is platform specific, and by default, unless platform\n *          specific code is provided, it does nothing.\n *\n *          Its use and whether its necessary to be called is dependent on the\n *          platform.\n */\nint mbedtls_platform_setup( mbedtls_platform_context *ctx );\n/**\n * \\brief   Perform any platform teardown operations\n *\n * \\param   ctx     mbed TLS context\n *\n * \\note    This function should be called after every other mbed TLS module has\n *          been correctly freed using the appropriate free function.\n *          Its implementation is platform specific, and by default, unless\n *          platform specific code is provided, it does nothing.\n *\n *          Its use and whether its necessary to be called is dependent on the\n *          platform.\n */\nvoid mbedtls_platform_teardown( mbedtls_platform_context *ctx );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* platform.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/platform_time.h",
    "content": "/**\n * \\file platform_time.h\n *\n * \\brief mbed TLS Platform time abstraction\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_PLATFORM_TIME_H\n#define MBEDTLS_PLATFORM_TIME_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\name SECTION: Module settings\n *\n * The configuration options you can set for this module are in this section.\n * Either change them in config.h or define them on the compiler command line.\n * \\{\n */\n\n/*\n * The time_t datatype\n */\n#if defined(MBEDTLS_PLATFORM_TIME_TYPE_MACRO)\ntypedef MBEDTLS_PLATFORM_TIME_TYPE_MACRO mbedtls_time_t;\n#else\n/* For time_t */\n#include <time.h>\ntypedef time_t mbedtls_time_t;\n#endif /* MBEDTLS_PLATFORM_TIME_TYPE_MACRO */\n\n/*\n * The function pointers for time\n */\n#if defined(MBEDTLS_PLATFORM_TIME_ALT)\nextern mbedtls_time_t (*mbedtls_time)( mbedtls_time_t* time );\n\n/**\n * \\brief   Set your own time function pointer\n *\n * \\param   time_func   the time function implementation\n *\n * \\return              0\n */\nint mbedtls_platform_set_time( mbedtls_time_t (*time_func)( mbedtls_time_t* time ) );\n#else\n#if defined(MBEDTLS_PLATFORM_TIME_MACRO)\n#define mbedtls_time    MBEDTLS_PLATFORM_TIME_MACRO\n#else\n#define mbedtls_time   time\n#endif /* MBEDTLS_PLATFORM_TIME_MACRO */\n#endif /* MBEDTLS_PLATFORM_TIME_ALT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* platform_time.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ripemd160.h",
    "content": "/**\n * \\file ripemd160.h\n *\n * \\brief RIPE MD-160 message digest\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_RIPEMD160_H\n#define MBEDTLS_RIPEMD160_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if !defined(MBEDTLS_RIPEMD160_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          RIPEMD-160 context structure\n */\ntypedef struct\n{\n    uint32_t total[2];          /*!< number of bytes processed  */\n    uint32_t state[5];          /*!< intermediate digest state  */\n    unsigned char buffer[64];   /*!< data block being processed */\n}\nmbedtls_ripemd160_context;\n\n/**\n * \\brief          Initialize RIPEMD-160 context\n *\n * \\param ctx      RIPEMD-160 context to be initialized\n */\nvoid mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx );\n\n/**\n * \\brief          Clear RIPEMD-160 context\n *\n * \\param ctx      RIPEMD-160 context to be cleared\n */\nvoid mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx );\n\n/**\n * \\brief          Clone (the state of) an RIPEMD-160 context\n *\n * \\param dst      The destination context\n * \\param src      The context to be cloned\n */\nvoid mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst,\n                        const mbedtls_ripemd160_context *src );\n\n/**\n * \\brief          RIPEMD-160 context setup\n *\n * \\param ctx      context to be initialized\n */\nvoid mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx );\n\n/**\n * \\brief          RIPEMD-160 process buffer\n *\n * \\param ctx      RIPEMD-160 context\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n */\nvoid mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx,\n                       const unsigned char *input, size_t ilen );\n\n/**\n * \\brief          RIPEMD-160 final digest\n *\n * \\param ctx      RIPEMD-160 context\n * \\param output   RIPEMD-160 checksum result\n */\nvoid mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] );\n\n/* Internal use */\nvoid mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_RIPEMD160_ALT */\n#include \"ripemd160.h\"\n#endif /* MBEDTLS_RIPEMD160_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Output = RIPEMD-160( input buffer )\n *\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   RIPEMD-160 checksum result\n */\nvoid mbedtls_ripemd160( const unsigned char *input, size_t ilen,\n                unsigned char output[20] );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_ripemd160_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* mbedtls_ripemd160.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/rsa.h",
    "content": "/**\n * \\file rsa.h\n *\n * \\brief The RSA public-key cryptosystem\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_RSA_H\n#define MBEDTLS_RSA_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"bignum.h\"\n#include \"md.h\"\n\n#if defined(MBEDTLS_THREADING_C)\n#include \"threading.h\"\n#endif\n\n/*\n * RSA Error codes\n */\n#define MBEDTLS_ERR_RSA_BAD_INPUT_DATA                    -0x4080  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_RSA_INVALID_PADDING                   -0x4100  /**< Input data contains invalid padding and is rejected. */\n#define MBEDTLS_ERR_RSA_KEY_GEN_FAILED                    -0x4180  /**< Something failed during generation of a key. */\n#define MBEDTLS_ERR_RSA_KEY_CHECK_FAILED                  -0x4200  /**< Key failed to pass the library's validity check. */\n#define MBEDTLS_ERR_RSA_PUBLIC_FAILED                     -0x4280  /**< The public key operation failed. */\n#define MBEDTLS_ERR_RSA_PRIVATE_FAILED                    -0x4300  /**< The private key operation failed. */\n#define MBEDTLS_ERR_RSA_VERIFY_FAILED                     -0x4380  /**< The PKCS#1 verification failed. */\n#define MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE                  -0x4400  /**< The output buffer for decryption is not large enough. */\n#define MBEDTLS_ERR_RSA_RNG_FAILED                        -0x4480  /**< The random generator failed to generate non-zeros. */\n\n/*\n * RSA constants\n */\n#define MBEDTLS_RSA_PUBLIC      0\n#define MBEDTLS_RSA_PRIVATE     1\n\n#define MBEDTLS_RSA_PKCS_V15    0\n#define MBEDTLS_RSA_PKCS_V21    1\n\n#define MBEDTLS_RSA_SIGN        1\n#define MBEDTLS_RSA_CRYPT       2\n\n#define MBEDTLS_RSA_SALT_LEN_ANY    -1\n\n/*\n * The above constants may be used even if the RSA module is compile out,\n * eg for alternative (PKCS#11) RSA implemenations in the PK layers.\n */\n#if defined(MBEDTLS_RSA_C)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          RSA context structure\n */\ntypedef struct\n{\n    int ver;                    /*!<  always 0          */\n    size_t len;                 /*!<  size(N) in chars  */\n\n    mbedtls_mpi N;                      /*!<  public modulus    */\n    mbedtls_mpi E;                      /*!<  public exponent   */\n\n    mbedtls_mpi D;                      /*!<  private exponent  */\n    mbedtls_mpi P;                      /*!<  1st prime factor  */\n    mbedtls_mpi Q;                      /*!<  2nd prime factor  */\n    mbedtls_mpi DP;                     /*!<  D % (P - 1)       */\n    mbedtls_mpi DQ;                     /*!<  D % (Q - 1)       */\n    mbedtls_mpi QP;                     /*!<  1 / (Q % P)       */\n\n    mbedtls_mpi RN;                     /*!<  cached R^2 mod N  */\n    mbedtls_mpi RP;                     /*!<  cached R^2 mod P  */\n    mbedtls_mpi RQ;                     /*!<  cached R^2 mod Q  */\n\n    mbedtls_mpi Vi;                     /*!<  cached blinding value     */\n    mbedtls_mpi Vf;                     /*!<  cached un-blinding value  */\n\n    int padding;                /*!<  MBEDTLS_RSA_PKCS_V15 for 1.5 padding and\n                                      MBEDTLS_RSA_PKCS_v21 for OAEP/PSS         */\n    int hash_id;                /*!<  Hash identifier of mbedtls_md_type_t as\n                                      specified in the mbedtls_md.h header file\n                                      for the EME-OAEP and EMSA-PSS\n                                      encoding                          */\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_threading_mutex_t mutex;    /*!<  Thread-safety mutex       */\n#endif\n}\nmbedtls_rsa_context;\n\n/**\n * \\brief          Initialize an RSA context\n *\n *                 Note: Set padding to MBEDTLS_RSA_PKCS_V21 for the RSAES-OAEP\n *                 encryption scheme and the RSASSA-PSS signature scheme.\n *\n * \\param ctx      RSA context to be initialized\n * \\param padding  MBEDTLS_RSA_PKCS_V15 or MBEDTLS_RSA_PKCS_V21\n * \\param hash_id  MBEDTLS_RSA_PKCS_V21 hash identifier\n *\n * \\note           The hash_id parameter is actually ignored\n *                 when using MBEDTLS_RSA_PKCS_V15 padding.\n *\n * \\note           Choice of padding mode is strictly enforced for private key\n *                 operations, since there might be security concerns in\n *                 mixing padding modes. For public key operations it's merely\n *                 a default value, which can be overriden by calling specific\n *                 rsa_rsaes_xxx or rsa_rsassa_xxx functions.\n *\n * \\note           The chosen hash is always used for OEAP encryption.\n *                 For PSS signatures, it's always used for making signatures,\n *                 but can be overriden (and always is, if set to\n *                 MBEDTLS_MD_NONE) for verifying them.\n */\nvoid mbedtls_rsa_init( mbedtls_rsa_context *ctx,\n               int padding,\n               int hash_id);\n\n/**\n * \\brief          Set padding for an already initialized RSA context\n *                 See \\c mbedtls_rsa_init() for details.\n *\n * \\param ctx      RSA context to be set\n * \\param padding  MBEDTLS_RSA_PKCS_V15 or MBEDTLS_RSA_PKCS_V21\n * \\param hash_id  MBEDTLS_RSA_PKCS_V21 hash identifier\n */\nvoid mbedtls_rsa_set_padding( mbedtls_rsa_context *ctx, int padding, int hash_id);\n\n/**\n * \\brief          Generate an RSA keypair\n *\n * \\param ctx      RSA context that will hold the key\n * \\param f_rng    RNG function\n * \\param p_rng    RNG parameter\n * \\param nbits    size of the public key in bits\n * \\param exponent public exponent (e.g., 65537)\n *\n * \\note           mbedtls_rsa_init() must be called beforehand to setup\n *                 the RSA context.\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n */\nint mbedtls_rsa_gen_key( mbedtls_rsa_context *ctx,\n                 int (*f_rng)(void *, unsigned char *, size_t),\n                 void *p_rng,\n                 unsigned int nbits, int exponent );\n\n/**\n * \\brief          Check a public RSA key\n *\n * \\param ctx      RSA context to be checked\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n */\nint mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx );\n\n/**\n * \\brief          Check a private RSA key\n *\n * \\param ctx      RSA context to be checked\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n */\nint mbedtls_rsa_check_privkey( const mbedtls_rsa_context *ctx );\n\n/**\n * \\brief          Check a public-private RSA key pair.\n *                 Check each of the contexts, and make sure they match.\n *\n * \\param pub      RSA context holding the public key\n * \\param prv      RSA context holding the private key\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n */\nint mbedtls_rsa_check_pub_priv( const mbedtls_rsa_context *pub, const mbedtls_rsa_context *prv );\n\n/**\n * \\brief          Do an RSA public key operation\n *\n * \\param ctx      RSA context\n * \\param input    input buffer\n * \\param output   output buffer\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           This function does NOT take care of message\n *                 padding. Also, be sure to set input[0] = 0 or ensure that\n *                 input is smaller than N.\n *\n * \\note           The input and output buffers must be large\n *                 enough (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_rsa_public( mbedtls_rsa_context *ctx,\n                const unsigned char *input,\n                unsigned char *output );\n\n/**\n * \\brief          Do an RSA private key operation\n *\n * \\param ctx      RSA context\n * \\param f_rng    RNG function (Needed for blinding)\n * \\param p_rng    RNG parameter\n * \\param input    input buffer\n * \\param output   output buffer\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The input and output buffers must be large\n *                 enough (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_rsa_private( mbedtls_rsa_context *ctx,\n                 int (*f_rng)(void *, unsigned char *, size_t),\n                 void *p_rng,\n                 const unsigned char *input,\n                 unsigned char *output );\n\n/**\n * \\brief          Generic wrapper to perform a PKCS#1 encryption using the\n *                 mode from the context. Add the message padding, then do an\n *                 RSA operation.\n *\n * \\param ctx      RSA context\n * \\param f_rng    RNG function (Needed for padding and PKCS#1 v2.1 encoding\n *                               and MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param ilen     contains the plaintext length\n * \\param input    buffer holding the data to be encrypted\n * \\param output   buffer that will hold the ciphertext\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The output buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_rsa_pkcs1_encrypt( mbedtls_rsa_context *ctx,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng,\n                       int mode, size_t ilen,\n                       const unsigned char *input,\n                       unsigned char *output );\n\n/**\n * \\brief          Perform a PKCS#1 v1.5 encryption (RSAES-PKCS1-v1_5-ENCRYPT)\n *\n * \\param ctx      RSA context\n * \\param f_rng    RNG function (Needed for padding and MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param ilen     contains the plaintext length\n * \\param input    buffer holding the data to be encrypted\n * \\param output   buffer that will hold the ciphertext\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The output buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_rsa_rsaes_pkcs1_v15_encrypt( mbedtls_rsa_context *ctx,\n                                 int (*f_rng)(void *, unsigned char *, size_t),\n                                 void *p_rng,\n                                 int mode, size_t ilen,\n                                 const unsigned char *input,\n                                 unsigned char *output );\n\n/**\n * \\brief          Perform a PKCS#1 v2.1 OAEP encryption (RSAES-OAEP-ENCRYPT)\n *\n * \\param ctx      RSA context\n * \\param f_rng    RNG function (Needed for padding and PKCS#1 v2.1 encoding\n *                               and MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param label    buffer holding the custom label to use\n * \\param label_len contains the label length\n * \\param ilen     contains the plaintext length\n * \\param input    buffer holding the data to be encrypted\n * \\param output   buffer that will hold the ciphertext\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The output buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_rsa_rsaes_oaep_encrypt( mbedtls_rsa_context *ctx,\n                            int (*f_rng)(void *, unsigned char *, size_t),\n                            void *p_rng,\n                            int mode,\n                            const unsigned char *label, size_t label_len,\n                            size_t ilen,\n                            const unsigned char *input,\n                            unsigned char *output );\n\n/**\n * \\brief          Generic wrapper to perform a PKCS#1 decryption using the\n *                 mode from the context. Do an RSA operation, then remove\n *                 the message padding\n *\n * \\param ctx      RSA context\n * \\param f_rng    RNG function (Only needed for MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param olen     will contain the plaintext length\n * \\param input    buffer holding the encrypted data\n * \\param output   buffer that will hold the plaintext\n * \\param output_max_len    maximum length of the output buffer\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The output buffer length \\c output_max_len should be\n *                 as large as the size ctx->len of ctx->N (eg. 128 bytes\n *                 if RSA-1024 is used) to be able to hold an arbitrary\n *                 decrypted message. If it is not large enough to hold\n *                 the decryption of the particular ciphertext provided, \n *                 the function will return MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE.\n *\n * \\note           The input buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_rsa_pkcs1_decrypt( mbedtls_rsa_context *ctx,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng,\n                       int mode, size_t *olen,\n                       const unsigned char *input,\n                       unsigned char *output,\n                       size_t output_max_len );\n\n/**\n * \\brief          Perform a PKCS#1 v1.5 decryption (RSAES-PKCS1-v1_5-DECRYPT)\n *\n * \\param ctx      RSA context\n * \\param f_rng    RNG function (Only needed for MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param olen     will contain the plaintext length\n * \\param input    buffer holding the encrypted data\n * \\param output   buffer that will hold the plaintext\n * \\param output_max_len    maximum length of the output buffer\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The output buffer length \\c output_max_len should be\n *                 as large as the size ctx->len of ctx->N (eg. 128 bytes\n *                 if RSA-1024 is used) to be able to hold an arbitrary\n *                 decrypted message. If it is not large enough to hold\n *                 the decryption of the particular ciphertext provided, \n *                 the function will return MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE.\n *\n * \\note           The input buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_rsa_rsaes_pkcs1_v15_decrypt( mbedtls_rsa_context *ctx,\n                                 int (*f_rng)(void *, unsigned char *, size_t),\n                                 void *p_rng,\n                                 int mode, size_t *olen,\n                                 const unsigned char *input,\n                                 unsigned char *output,\n                                 size_t output_max_len );\n\n/**\n * \\brief          Perform a PKCS#1 v2.1 OAEP decryption (RSAES-OAEP-DECRYPT)\n *\n * \\param ctx      RSA context\n * \\param f_rng    RNG function (Only needed for MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param label    buffer holding the custom label to use\n * \\param label_len contains the label length\n * \\param olen     will contain the plaintext length\n * \\param input    buffer holding the encrypted data\n * \\param output   buffer that will hold the plaintext\n * \\param output_max_len    maximum length of the output buffer\n *\n * \\return         0 if successful, or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The output buffer length \\c output_max_len should be\n *                 as large as the size ctx->len of ctx->N (eg. 128 bytes\n *                 if RSA-1024 is used) to be able to hold an arbitrary\n *                 decrypted message. If it is not large enough to hold\n *                 the decryption of the particular ciphertext provided, \n *                 the function will return MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE.\n *\n * \\note           The input buffer must be as large as the size \n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx,\n                            int (*f_rng)(void *, unsigned char *, size_t),\n                            void *p_rng,\n                            int mode,\n                            const unsigned char *label, size_t label_len,\n                            size_t *olen,\n                            const unsigned char *input,\n                            unsigned char *output,\n                            size_t output_max_len );\n\n/**\n * \\brief          Generic wrapper to perform a PKCS#1 signature using the\n *                 mode from the context. Do a private RSA operation to sign\n *                 a message digest\n *\n * \\param ctx      RSA context\n * \\param f_rng    RNG function (Needed for PKCS#1 v2.1 encoding and for\n *                               MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param md_alg   a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data)\n * \\param hashlen  message digest length (for MBEDTLS_MD_NONE only)\n * \\param hash     buffer holding the message digest\n * \\param sig      buffer that will hold the ciphertext\n *\n * \\return         0 if the signing operation was successful,\n *                 or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The \"sig\" buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n *\n * \\note           In case of PKCS#1 v2.1 encoding, see comments on\n * \\note           \\c mbedtls_rsa_rsassa_pss_sign() for details on md_alg and hash_id.\n */\nint mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx,\n                    int (*f_rng)(void *, unsigned char *, size_t),\n                    void *p_rng,\n                    int mode,\n                    mbedtls_md_type_t md_alg,\n                    unsigned int hashlen,\n                    const unsigned char *hash,\n                    unsigned char *sig );\n\n/**\n * \\brief          Perform a PKCS#1 v1.5 signature (RSASSA-PKCS1-v1_5-SIGN)\n *\n * \\param ctx      RSA context\n * \\param f_rng    RNG function (Only needed for MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param md_alg   a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data)\n * \\param hashlen  message digest length (for MBEDTLS_MD_NONE only)\n * \\param hash     buffer holding the message digest\n * \\param sig      buffer that will hold the ciphertext\n *\n * \\return         0 if the signing operation was successful,\n *                 or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The \"sig\" buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx,\n                               int (*f_rng)(void *, unsigned char *, size_t),\n                               void *p_rng,\n                               int mode,\n                               mbedtls_md_type_t md_alg,\n                               unsigned int hashlen,\n                               const unsigned char *hash,\n                               unsigned char *sig );\n\n/**\n * \\brief          Perform a PKCS#1 v2.1 PSS signature (RSASSA-PSS-SIGN)\n *\n * \\param ctx      RSA context\n * \\param f_rng    RNG function (Needed for PKCS#1 v2.1 encoding and for\n *                               MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param md_alg   a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data)\n * \\param hashlen  message digest length (for MBEDTLS_MD_NONE only)\n * \\param hash     buffer holding the message digest\n * \\param sig      buffer that will hold the ciphertext\n *\n * \\return         0 if the signing operation was successful,\n *                 or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The \"sig\" buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n *\n * \\note           The hash_id in the RSA context is the one used for the\n *                 encoding. md_alg in the function call is the type of hash\n *                 that is encoded. According to RFC 3447 it is advised to\n *                 keep both hashes the same.\n */\nint mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx,\n                         int (*f_rng)(void *, unsigned char *, size_t),\n                         void *p_rng,\n                         int mode,\n                         mbedtls_md_type_t md_alg,\n                         unsigned int hashlen,\n                         const unsigned char *hash,\n                         unsigned char *sig );\n\n/**\n * \\brief          Generic wrapper to perform a PKCS#1 verification using the\n *                 mode from the context. Do a public RSA operation and check\n *                 the message digest\n *\n * \\param ctx      points to an RSA public key\n * \\param f_rng    RNG function (Only needed for MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param md_alg   a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data)\n * \\param hashlen  message digest length (for MBEDTLS_MD_NONE only)\n * \\param hash     buffer holding the message digest\n * \\param sig      buffer holding the ciphertext\n *\n * \\return         0 if the verify operation was successful,\n *                 or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The \"sig\" buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n *\n * \\note           In case of PKCS#1 v2.1 encoding, see comments on\n *                 \\c mbedtls_rsa_rsassa_pss_verify() about md_alg and hash_id.\n */\nint mbedtls_rsa_pkcs1_verify( mbedtls_rsa_context *ctx,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng,\n                      int mode,\n                      mbedtls_md_type_t md_alg,\n                      unsigned int hashlen,\n                      const unsigned char *hash,\n                      const unsigned char *sig );\n\n/**\n * \\brief          Perform a PKCS#1 v1.5 verification (RSASSA-PKCS1-v1_5-VERIFY)\n *\n * \\param ctx      points to an RSA public key\n * \\param f_rng    RNG function (Only needed for MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param md_alg   a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data)\n * \\param hashlen  message digest length (for MBEDTLS_MD_NONE only)\n * \\param hash     buffer holding the message digest\n * \\param sig      buffer holding the ciphertext\n *\n * \\return         0 if the verify operation was successful,\n *                 or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The \"sig\" buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n */\nint mbedtls_rsa_rsassa_pkcs1_v15_verify( mbedtls_rsa_context *ctx,\n                                 int (*f_rng)(void *, unsigned char *, size_t),\n                                 void *p_rng,\n                                 int mode,\n                                 mbedtls_md_type_t md_alg,\n                                 unsigned int hashlen,\n                                 const unsigned char *hash,\n                                 const unsigned char *sig );\n\n/**\n * \\brief          Perform a PKCS#1 v2.1 PSS verification (RSASSA-PSS-VERIFY)\n *                 (This is the \"simple\" version.)\n *\n * \\param ctx      points to an RSA public key\n * \\param f_rng    RNG function (Only needed for MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param md_alg   a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data)\n * \\param hashlen  message digest length (for MBEDTLS_MD_NONE only)\n * \\param hash     buffer holding the message digest\n * \\param sig      buffer holding the ciphertext\n *\n * \\return         0 if the verify operation was successful,\n *                 or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The \"sig\" buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n *\n * \\note           The hash_id in the RSA context is the one used for the\n *                 verification. md_alg in the function call is the type of\n *                 hash that is verified. According to RFC 3447 it is advised to\n *                 keep both hashes the same. If hash_id in the RSA context is\n *                 unset, the md_alg from the function call is used.\n */\nint mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx,\n                           int (*f_rng)(void *, unsigned char *, size_t),\n                           void *p_rng,\n                           int mode,\n                           mbedtls_md_type_t md_alg,\n                           unsigned int hashlen,\n                           const unsigned char *hash,\n                           const unsigned char *sig );\n\n/**\n * \\brief          Perform a PKCS#1 v2.1 PSS verification (RSASSA-PSS-VERIFY)\n *                 (This is the version with \"full\" options.)\n *\n * \\param ctx      points to an RSA public key\n * \\param f_rng    RNG function (Only needed for MBEDTLS_RSA_PRIVATE)\n * \\param p_rng    RNG parameter\n * \\param mode     MBEDTLS_RSA_PUBLIC or MBEDTLS_RSA_PRIVATE\n * \\param md_alg   a MBEDTLS_MD_XXX (use MBEDTLS_MD_NONE for signing raw data)\n * \\param hashlen  message digest length (for MBEDTLS_MD_NONE only)\n * \\param hash     buffer holding the message digest\n * \\param mgf1_hash_id message digest used for mask generation\n * \\param expected_salt_len Length of the salt used in padding, use\n *                 MBEDTLS_RSA_SALT_LEN_ANY to accept any salt length\n * \\param sig      buffer holding the ciphertext\n *\n * \\return         0 if the verify operation was successful,\n *                 or an MBEDTLS_ERR_RSA_XXX error code\n *\n * \\note           The \"sig\" buffer must be as large as the size\n *                 of ctx->N (eg. 128 bytes if RSA-1024 is used).\n *\n * \\note           The hash_id in the RSA context is ignored.\n */\nint mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx,\n                               int (*f_rng)(void *, unsigned char *, size_t),\n                               void *p_rng,\n                               int mode,\n                               mbedtls_md_type_t md_alg,\n                               unsigned int hashlen,\n                               const unsigned char *hash,\n                               mbedtls_md_type_t mgf1_hash_id,\n                               int expected_salt_len,\n                               const unsigned char *sig );\n\n/**\n * \\brief          Copy the components of an RSA context\n *\n * \\param dst      Destination context\n * \\param src      Source context\n *\n * \\return         0 on success,\n *                 MBEDTLS_ERR_MPI_ALLOC_FAILED on memory allocation failure\n */\nint mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src );\n\n/**\n * \\brief          Free the components of an RSA key\n *\n * \\param ctx      RSA Context to free\n */\nvoid mbedtls_rsa_free( mbedtls_rsa_context *ctx );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_rsa_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_RSA_C */\n\n#endif /* rsa.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/sha1.h",
    "content": "/**\n * \\file sha1.h\n *\n * \\brief SHA-1 cryptographic hash function\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_SHA1_H\n#define MBEDTLS_SHA1_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if !defined(MBEDTLS_SHA1_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          SHA-1 context structure\n */\ntypedef struct\n{\n    uint32_t total[2];          /*!< number of bytes processed  */\n    uint32_t state[5];          /*!< intermediate digest state  */\n    unsigned char buffer[64];   /*!< data block being processed */\n}\nmbedtls_sha1_context;\n\n/**\n * \\brief          Initialize SHA-1 context\n *\n * \\param ctx      SHA-1 context to be initialized\n */\nvoid mbedtls_sha1_init( mbedtls_sha1_context *ctx );\n\n/**\n * \\brief          Clear SHA-1 context\n *\n * \\param ctx      SHA-1 context to be cleared\n */\nvoid mbedtls_sha1_free( mbedtls_sha1_context *ctx );\n\n/**\n * \\brief          Clone (the state of) a SHA-1 context\n *\n * \\param dst      The destination context\n * \\param src      The context to be cloned\n */\nvoid mbedtls_sha1_clone( mbedtls_sha1_context *dst,\n                         const mbedtls_sha1_context *src );\n\n/**\n * \\brief          SHA-1 context setup\n *\n * \\param ctx      context to be initialized\n */\nvoid mbedtls_sha1_starts( mbedtls_sha1_context *ctx );\n\n/**\n * \\brief          SHA-1 process buffer\n *\n * \\param ctx      SHA-1 context\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n */\nvoid mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen );\n\n/**\n * \\brief          SHA-1 final digest\n *\n * \\param ctx      SHA-1 context\n * \\param output   SHA-1 checksum result\n */\nvoid mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] );\n\n/* Internal use */\nvoid mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_SHA1_ALT */\n#include \"sha1_alt.h\"\n#endif /* MBEDTLS_SHA1_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Output = SHA-1( input buffer )\n *\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   SHA-1 checksum result\n */\nvoid mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_sha1_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* mbedtls_sha1.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/sha256.h",
    "content": "/**\n * \\file sha256.h\n *\n * \\brief SHA-224 and SHA-256 cryptographic hash function\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_SHA256_H\n#define MBEDTLS_SHA256_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if !defined(MBEDTLS_SHA256_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          SHA-256 context structure\n */\ntypedef struct\n{\n    uint32_t total[2];          /*!< number of bytes processed  */\n    uint32_t state[8];          /*!< intermediate digest state  */\n    unsigned char buffer[64];   /*!< data block being processed */\n    int is224;                  /*!< 0 => SHA-256, else SHA-224 */\n}\nmbedtls_sha256_context;\n\n/**\n * \\brief          Initialize SHA-256 context\n *\n * \\param ctx      SHA-256 context to be initialized\n */\nvoid mbedtls_sha256_init( mbedtls_sha256_context *ctx );\n\n/**\n * \\brief          Clear SHA-256 context\n *\n * \\param ctx      SHA-256 context to be cleared\n */\nvoid mbedtls_sha256_free( mbedtls_sha256_context *ctx );\n\n/**\n * \\brief          Clone (the state of) a SHA-256 context\n *\n * \\param dst      The destination context\n * \\param src      The context to be cloned\n */\nvoid mbedtls_sha256_clone( mbedtls_sha256_context *dst,\n                           const mbedtls_sha256_context *src );\n\n/**\n * \\brief          SHA-256 context setup\n *\n * \\param ctx      context to be initialized\n * \\param is224    0 = use SHA256, 1 = use SHA224\n */\nvoid mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 );\n\n/**\n * \\brief          SHA-256 process buffer\n *\n * \\param ctx      SHA-256 context\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n */\nvoid mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input,\n                    size_t ilen );\n\n/**\n * \\brief          SHA-256 final digest\n *\n * \\param ctx      SHA-256 context\n * \\param output   SHA-224/256 checksum result\n */\nvoid mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] );\n\n/* Internal use */\nvoid mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_SHA256_ALT */\n#include \"sha256_alt.h\"\n#endif /* MBEDTLS_SHA256_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Output = SHA-256( input buffer )\n *\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   SHA-224/256 checksum result\n * \\param is224    0 = use SHA256, 1 = use SHA224\n */\nvoid mbedtls_sha256( const unsigned char *input, size_t ilen,\n           unsigned char output[32], int is224 );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_sha256_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* mbedtls_sha256.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/sha512.h",
    "content": "/**\n * \\file sha512.h\n *\n * \\brief SHA-384 and SHA-512 cryptographic hash function\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_SHA512_H\n#define MBEDTLS_SHA512_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if !defined(MBEDTLS_SHA512_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          SHA-512 context structure\n */\ntypedef struct\n{\n    uint64_t total[2];          /*!< number of bytes processed  */\n    uint64_t state[8];          /*!< intermediate digest state  */\n    unsigned char buffer[128];  /*!< data block being processed */\n    int is384;                  /*!< 0 => SHA-512, else SHA-384 */\n}\nmbedtls_sha512_context;\n\n/**\n * \\brief          Initialize SHA-512 context\n *\n * \\param ctx      SHA-512 context to be initialized\n */\nvoid mbedtls_sha512_init( mbedtls_sha512_context *ctx );\n\n/**\n * \\brief          Clear SHA-512 context\n *\n * \\param ctx      SHA-512 context to be cleared\n */\nvoid mbedtls_sha512_free( mbedtls_sha512_context *ctx );\n\n/**\n * \\brief          Clone (the state of) a SHA-512 context\n *\n * \\param dst      The destination context\n * \\param src      The context to be cloned\n */\nvoid mbedtls_sha512_clone( mbedtls_sha512_context *dst,\n                           const mbedtls_sha512_context *src );\n\n/**\n * \\brief          SHA-512 context setup\n *\n * \\param ctx      context to be initialized\n * \\param is384    0 = use SHA512, 1 = use SHA384\n */\nvoid mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 );\n\n/**\n * \\brief          SHA-512 process buffer\n *\n * \\param ctx      SHA-512 context\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n */\nvoid mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input,\n                    size_t ilen );\n\n/**\n * \\brief          SHA-512 final digest\n *\n * \\param ctx      SHA-512 context\n * \\param output   SHA-384/512 checksum result\n */\nvoid mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_SHA512_ALT */\n#include \"sha512_alt.h\"\n#endif /* MBEDTLS_SHA512_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Output = SHA-512( input buffer )\n *\n * \\param input    buffer holding the  data\n * \\param ilen     length of the input data\n * \\param output   SHA-384/512 checksum result\n * \\param is384    0 = use SHA512, 1 = use SHA384\n */\nvoid mbedtls_sha512( const unsigned char *input, size_t ilen,\n             unsigned char output[64], int is384 );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_sha512_self_test( int verbose );\n\n/* Internal use */\nvoid mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* mbedtls_sha512.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ssl.h",
    "content": "/**\n * \\file ssl.h\n *\n * \\brief SSL/TLS functions.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_SSL_H\n#define MBEDTLS_SSL_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"bignum.h\"\n#include \"ecp.h\"\n\n#include \"ssl_ciphersuites.h\"\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n#include \"x509_crt.h\"\n#include \"x509_crl.h\"\n#endif\n\n#if defined(MBEDTLS_DHM_C)\n#include \"dhm.h\"\n#endif\n\n#if defined(MBEDTLS_ECDH_C)\n#include \"ecdh.h\"\n#endif\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n#include \"zlib.h\"\n#endif\n\n#if defined(MBEDTLS_HAVE_TIME)\n#include \"mbedtls/platform_time.h\"\n#endif\n\n/*\n * SSL Error codes\n */\n#define MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE               -0x7080  /**< The requested feature is not available. */\n#define MBEDTLS_ERR_SSL_BAD_INPUT_DATA                    -0x7100  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_SSL_INVALID_MAC                       -0x7180  /**< Verification of the message MAC failed. */\n#define MBEDTLS_ERR_SSL_INVALID_RECORD                    -0x7200  /**< An invalid SSL record was received. */\n#define MBEDTLS_ERR_SSL_CONN_EOF                          -0x7280  /**< The connection indicated an EOF. */\n#define MBEDTLS_ERR_SSL_UNKNOWN_CIPHER                    -0x7300  /**< An unknown cipher was received. */\n#define MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN                  -0x7380  /**< The server has no ciphersuites in common with the client. */\n#define MBEDTLS_ERR_SSL_NO_RNG                            -0x7400  /**< No RNG was provided to the SSL module. */\n#define MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE             -0x7480  /**< No client certification received from the client, but required by the authentication mode. */\n#define MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE             -0x7500  /**< Our own certificate(s) is/are too large to send in an SSL message. */\n#define MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED              -0x7580  /**< The own certificate is not set, but needed by the server. */\n#define MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED              -0x7600  /**< The own private key or pre-shared key is not set, but needed. */\n#define MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED                 -0x7680  /**< No CA Chain is set, but required to operate. */\n#define MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE                -0x7700  /**< An unexpected message was received from our peer. */\n#define MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE               -0x7780  /**< A fatal alert message was received from our peer. */\n#define MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED                -0x7800  /**< Verification of our peer failed. */\n#define MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY                 -0x7880  /**< The peer notified us that the connection is going to be closed. */\n#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO               -0x7900  /**< Processing of the ClientHello handshake message failed. */\n#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO               -0x7980  /**< Processing of the ServerHello handshake message failed. */\n#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE                -0x7A00  /**< Processing of the Certificate handshake message failed. */\n#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST        -0x7A80  /**< Processing of the CertificateRequest handshake message failed. */\n#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE        -0x7B00  /**< Processing of the ServerKeyExchange handshake message failed. */\n#define MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE          -0x7B80  /**< Processing of the ServerHelloDone handshake message failed. */\n#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE        -0x7C00  /**< Processing of the ClientKeyExchange handshake message failed. */\n#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP     -0x7C80  /**< Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public. */\n#define MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS     -0x7D00  /**< Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret. */\n#define MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY         -0x7D80  /**< Processing of the CertificateVerify handshake message failed. */\n#define MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC         -0x7E00  /**< Processing of the ChangeCipherSpec handshake message failed. */\n#define MBEDTLS_ERR_SSL_BAD_HS_FINISHED                   -0x7E80  /**< Processing of the Finished handshake message failed. */\n#define MBEDTLS_ERR_SSL_ALLOC_FAILED                      -0x7F00  /**< Memory allocation failed */\n#define MBEDTLS_ERR_SSL_HW_ACCEL_FAILED                   -0x7F80  /**< Hardware acceleration function returned with error */\n#define MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH              -0x6F80  /**< Hardware acceleration function skipped / left alone data */\n#define MBEDTLS_ERR_SSL_COMPRESSION_FAILED                -0x6F00  /**< Processing of the compression / decompression failed */\n#define MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION           -0x6E80  /**< Handshake protocol not within min/max boundaries */\n#define MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET         -0x6E00  /**< Processing of the NewSessionTicket handshake message failed. */\n#define MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED            -0x6D80  /**< Session ticket has expired. */\n#define MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH                  -0x6D00  /**< Public key type mismatch (eg, asked for RSA key exchange and presented EC key) */\n#define MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY                  -0x6C80  /**< Unknown identity received (eg, PSK identity) */\n#define MBEDTLS_ERR_SSL_INTERNAL_ERROR                    -0x6C00  /**< Internal error (eg, unexpected failure in lower-level module) */\n#define MBEDTLS_ERR_SSL_COUNTER_WRAPPING                  -0x6B80  /**< A counter would wrap (eg, too many messages exchanged). */\n#define MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO       -0x6B00  /**< Unexpected message at ServerHello in renegotiation. */\n#define MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED             -0x6A80  /**< DTLS client must retry for hello verification */\n#define MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL                  -0x6A00  /**< A buffer is too small to receive or write a message */\n#define MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE             -0x6980  /**< None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages). */\n#define MBEDTLS_ERR_SSL_WANT_READ                         -0x6900  /**< Connection requires a read call. */\n#define MBEDTLS_ERR_SSL_WANT_WRITE                        -0x6880  /**< Connection requires a write call. */\n#define MBEDTLS_ERR_SSL_TIMEOUT                           -0x6800  /**< The operation timed out. */\n#define MBEDTLS_ERR_SSL_CLIENT_RECONNECT                  -0x6780  /**< The client initiated a reconnect from the same port. */\n#define MBEDTLS_ERR_SSL_UNEXPECTED_RECORD                 -0x6700  /**< Record header looks valid but is not expected. */\n#define MBEDTLS_ERR_SSL_NON_FATAL                         -0x6680  /**< The alert message received indicates a non-fatal error. */\n#define MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH               -0x6600  /**< Couldn't set the hash for verifying CertificateVerify */\n\n/*\n * Various constants\n */\n#define MBEDTLS_SSL_MAJOR_VERSION_3             3\n#define MBEDTLS_SSL_MINOR_VERSION_0             0   /*!< SSL v3.0 */\n#define MBEDTLS_SSL_MINOR_VERSION_1             1   /*!< TLS v1.0 */\n#define MBEDTLS_SSL_MINOR_VERSION_2             2   /*!< TLS v1.1 */\n#define MBEDTLS_SSL_MINOR_VERSION_3             3   /*!< TLS v1.2 */\n\n#define MBEDTLS_SSL_TRANSPORT_STREAM            0   /*!< TLS      */\n#define MBEDTLS_SSL_TRANSPORT_DATAGRAM          1   /*!< DTLS     */\n\n#define MBEDTLS_SSL_MAX_HOST_NAME_LEN           255 /*!< Maximum host name defined in RFC 1035 */\n\n/* RFC 6066 section 4, see also mfl_code_to_length in ssl_tls.c\n * NONE must be zero so that memset()ing structure to zero works */\n#define MBEDTLS_SSL_MAX_FRAG_LEN_NONE           0   /*!< don't use this extension   */\n#define MBEDTLS_SSL_MAX_FRAG_LEN_512            1   /*!< MaxFragmentLength 2^9      */\n#define MBEDTLS_SSL_MAX_FRAG_LEN_1024           2   /*!< MaxFragmentLength 2^10     */\n#define MBEDTLS_SSL_MAX_FRAG_LEN_2048           3   /*!< MaxFragmentLength 2^11     */\n#define MBEDTLS_SSL_MAX_FRAG_LEN_4096           4   /*!< MaxFragmentLength 2^12     */\n#define MBEDTLS_SSL_MAX_FRAG_LEN_INVALID        5   /*!< first invalid value        */\n\n#define MBEDTLS_SSL_IS_CLIENT                   0\n#define MBEDTLS_SSL_IS_SERVER                   1\n\n#define MBEDTLS_SSL_IS_NOT_FALLBACK             0\n#define MBEDTLS_SSL_IS_FALLBACK                 1\n\n#define MBEDTLS_SSL_EXTENDED_MS_DISABLED        0\n#define MBEDTLS_SSL_EXTENDED_MS_ENABLED         1\n\n#define MBEDTLS_SSL_ETM_DISABLED                0\n#define MBEDTLS_SSL_ETM_ENABLED                 1\n\n#define MBEDTLS_SSL_COMPRESS_NULL               0\n#define MBEDTLS_SSL_COMPRESS_DEFLATE            1\n\n#define MBEDTLS_SSL_VERIFY_NONE                 0\n#define MBEDTLS_SSL_VERIFY_OPTIONAL             1\n#define MBEDTLS_SSL_VERIFY_REQUIRED             2\n#define MBEDTLS_SSL_VERIFY_UNSET                3 /* Used only for sni_authmode */\n\n#define MBEDTLS_SSL_LEGACY_RENEGOTIATION        0\n#define MBEDTLS_SSL_SECURE_RENEGOTIATION        1\n\n#define MBEDTLS_SSL_RENEGOTIATION_DISABLED      0\n#define MBEDTLS_SSL_RENEGOTIATION_ENABLED       1\n\n#define MBEDTLS_SSL_ANTI_REPLAY_DISABLED        0\n#define MBEDTLS_SSL_ANTI_REPLAY_ENABLED         1\n\n#define MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED  -1\n#define MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT  16\n\n#define MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION     0\n#define MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION  1\n#define MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE      2\n\n#define MBEDTLS_SSL_TRUNC_HMAC_DISABLED         0\n#define MBEDTLS_SSL_TRUNC_HMAC_ENABLED          1\n#define MBEDTLS_SSL_TRUNCATED_HMAC_LEN          10  /* 80 bits, rfc 6066 section 7 */\n\n#define MBEDTLS_SSL_SESSION_TICKETS_DISABLED     0\n#define MBEDTLS_SSL_SESSION_TICKETS_ENABLED      1\n\n#define MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED    0\n#define MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED     1\n\n#define MBEDTLS_SSL_ARC4_ENABLED                0\n#define MBEDTLS_SSL_ARC4_DISABLED               1\n\n#define MBEDTLS_SSL_PRESET_DEFAULT              0\n#define MBEDTLS_SSL_PRESET_SUITEB               2\n\n#define MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED       1\n#define MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED      0\n\n/*\n * Default range for DTLS retransmission timer value, in milliseconds.\n * RFC 6347 4.2.4.1 says from 1 second to 60 seconds.\n */\n#define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MULTI 4\n#define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN    (1000*MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MULTI)\n#define MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX   (60000*MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MULTI)\n\n/**\n * \\name SECTION: Module settings\n *\n * The configuration options you can set for this module are in this section.\n * Either change them in config.h or define them on the compiler command line.\n * \\{\n */\n\n#if !defined(MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME)\n#define MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME     86400 /**< Lifetime of session tickets (if enabled) */\n#endif\n\n/*\n * Maxium fragment length in bytes,\n * determines the size of each of the two internal I/O buffers.\n *\n * Note: the RFC defines the default size of SSL / TLS messages. If you\n * change the value here, other clients / servers may not be able to\n * communicate with you anymore. Only change this value if you control\n * both sides of the connection and have it reduced at both sides, or\n * if you're using the Max Fragment Length extension and you know all your\n * peers are using it too!\n */\n#if !defined(MBEDTLS_SSL_MAX_CONTENT_LEN)\n#define MBEDTLS_SSL_MAX_CONTENT_LEN         16384   /**< Size of the input / output buffer */\n#endif\n\n/* \\} name SECTION: Module settings */\n\n/*\n * Length of the verify data for secure renegotiation\n */\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n#define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 36\n#else\n#define MBEDTLS_SSL_VERIFY_DATA_MAX_LEN 12\n#endif\n\n/*\n * Signaling ciphersuite values (SCSV)\n */\n#define MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO    0xFF   /**< renegotiation info ext */\n#define MBEDTLS_SSL_FALLBACK_SCSV_VALUE         0x5600 /**< RFC 7507 section 2 */\n\n/*\n * Supported Signature and Hash algorithms (For TLS 1.2)\n * RFC 5246 section 7.4.1.4.1\n */\n#define MBEDTLS_SSL_HASH_NONE                0\n#define MBEDTLS_SSL_HASH_MD5                 1\n#define MBEDTLS_SSL_HASH_SHA1                2\n#define MBEDTLS_SSL_HASH_SHA224              3\n#define MBEDTLS_SSL_HASH_SHA256              4\n#define MBEDTLS_SSL_HASH_SHA384              5\n#define MBEDTLS_SSL_HASH_SHA512              6\n\n#define MBEDTLS_SSL_SIG_ANON                 0\n#define MBEDTLS_SSL_SIG_RSA                  1\n#define MBEDTLS_SSL_SIG_ECDSA                3\n\n/*\n * Client Certificate Types\n * RFC 5246 section 7.4.4 plus RFC 4492 section 5.5\n */\n#define MBEDTLS_SSL_CERT_TYPE_RSA_SIGN       1\n#define MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN    64\n\n/*\n * Message, alert and handshake types\n */\n#define MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC     20\n#define MBEDTLS_SSL_MSG_ALERT                  21\n#define MBEDTLS_SSL_MSG_HANDSHAKE              22\n#define MBEDTLS_SSL_MSG_APPLICATION_DATA       23\n\n#define MBEDTLS_SSL_ALERT_LEVEL_WARNING         1\n#define MBEDTLS_SSL_ALERT_LEVEL_FATAL           2\n\n#define MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY           0  /* 0x00 */\n#define MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE    10  /* 0x0A */\n#define MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC        20  /* 0x14 */\n#define MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED     21  /* 0x15 */\n#define MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW       22  /* 0x16 */\n#define MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE 30  /* 0x1E */\n#define MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE     40  /* 0x28 */\n#define MBEDTLS_SSL_ALERT_MSG_NO_CERT               41  /* 0x29 */\n#define MBEDTLS_SSL_ALERT_MSG_BAD_CERT              42  /* 0x2A */\n#define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT      43  /* 0x2B */\n#define MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED          44  /* 0x2C */\n#define MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED          45  /* 0x2D */\n#define MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN          46  /* 0x2E */\n#define MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER     47  /* 0x2F */\n#define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA            48  /* 0x30 */\n#define MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED         49  /* 0x31 */\n#define MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR          50  /* 0x32 */\n#define MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR         51  /* 0x33 */\n#define MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION    60  /* 0x3C */\n#define MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION      70  /* 0x46 */\n#define MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY 71  /* 0x47 */\n#define MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR        80  /* 0x50 */\n#define MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK 86  /* 0x56 */\n#define MBEDTLS_SSL_ALERT_MSG_USER_CANCELED         90  /* 0x5A */\n#define MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION     100  /* 0x64 */\n#define MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT      110  /* 0x6E */\n#define MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME    112  /* 0x70 */\n#define MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY 115  /* 0x73 */\n#define MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL 120 /* 0x78 */\n\n#define MBEDTLS_SSL_HS_HELLO_REQUEST            0\n#define MBEDTLS_SSL_HS_CLIENT_HELLO             1\n#define MBEDTLS_SSL_HS_SERVER_HELLO             2\n#define MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST     3\n#define MBEDTLS_SSL_HS_NEW_SESSION_TICKET       4\n#define MBEDTLS_SSL_HS_CERTIFICATE             11\n#define MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE     12\n#define MBEDTLS_SSL_HS_CERTIFICATE_REQUEST     13\n#define MBEDTLS_SSL_HS_SERVER_HELLO_DONE       14\n#define MBEDTLS_SSL_HS_CERTIFICATE_VERIFY      15\n#define MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE     16\n#define MBEDTLS_SSL_HS_FINISHED                20\n\n/*\n * TLS extensions\n */\n#define MBEDTLS_TLS_EXT_SERVERNAME                   0\n#define MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME          0\n\n#define MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH          1\n\n#define MBEDTLS_TLS_EXT_TRUNCATED_HMAC               4\n\n#define MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES   10\n#define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS     11\n\n#define MBEDTLS_TLS_EXT_SIG_ALG                     13\n\n#define MBEDTLS_TLS_EXT_ALPN                        16\n\n#define MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC            22 /* 0x16 */\n#define MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET  0x0017 /* 23 */\n\n#define MBEDTLS_TLS_EXT_SESSION_TICKET              35\n\n#define MBEDTLS_TLS_EXT_ECJPAKE_KKPP               256 /* experimental */\n\n#define MBEDTLS_TLS_EXT_RENEGOTIATION_INFO      0xFF01\n\n/*\n * Size defines\n */\n#if !defined(MBEDTLS_PSK_MAX_LEN)\n#define MBEDTLS_PSK_MAX_LEN            32 /* 256 bits */\n#endif\n\n/* Dummy type used only for its size */\nunion mbedtls_ssl_premaster_secret\n{\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)\n    unsigned char _pms_rsa[48];                         /* RFC 5246 8.1.1 */\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)\n    unsigned char _pms_dhm[MBEDTLS_MPI_MAX_SIZE];      /* RFC 5246 8.1.2 */\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)    || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)  || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)     || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\n    unsigned char _pms_ecdh[MBEDTLS_ECP_MAX_BYTES];    /* RFC 4492 5.10 */\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)\n    unsigned char _pms_psk[4 + 2 * MBEDTLS_PSK_MAX_LEN];       /* RFC 4279 2 */\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\n    unsigned char _pms_dhe_psk[4 + MBEDTLS_MPI_MAX_SIZE\n                                 + MBEDTLS_PSK_MAX_LEN];       /* RFC 4279 3 */\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)\n    unsigned char _pms_rsa_psk[52 + MBEDTLS_PSK_MAX_LEN];      /* RFC 4279 4 */\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\n    unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES\n                                   + MBEDTLS_PSK_MAX_LEN];     /* RFC 5489 2 */\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    unsigned char _pms_ecjpake[32];     /* Thread spec: SHA-256 output */\n#endif\n};\n\n#define MBEDTLS_PREMASTER_SIZE     sizeof( union mbedtls_ssl_premaster_secret )\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * SSL state machine\n */\ntypedef enum\n{\n    MBEDTLS_SSL_HELLO_REQUEST,\n    MBEDTLS_SSL_CLIENT_HELLO,\n    MBEDTLS_SSL_SERVER_HELLO,\n    MBEDTLS_SSL_SERVER_CERTIFICATE,\n    MBEDTLS_SSL_SERVER_KEY_EXCHANGE,\n    MBEDTLS_SSL_CERTIFICATE_REQUEST,\n    MBEDTLS_SSL_SERVER_HELLO_DONE,\n    MBEDTLS_SSL_CLIENT_CERTIFICATE,\n    MBEDTLS_SSL_CLIENT_KEY_EXCHANGE,\n    MBEDTLS_SSL_CERTIFICATE_VERIFY,\n    MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC,\n    MBEDTLS_SSL_CLIENT_FINISHED,\n    MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC,\n    MBEDTLS_SSL_SERVER_FINISHED,\n    MBEDTLS_SSL_FLUSH_BUFFERS,\n    MBEDTLS_SSL_HANDSHAKE_WRAPUP,\n    MBEDTLS_SSL_HANDSHAKE_OVER,\n    MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET,\n    MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT,\n}\nmbedtls_ssl_states;\n\n/**\n * \\brief          Callback type: send data on the network.\n *\n * \\note           That callback may be either blocking or non-blocking.\n *\n * \\param ctx      Context for the send callback (typically a file descriptor)\n * \\param buf      Buffer holding the data to send\n * \\param len      Length of the data to send\n *\n * \\return         The callback must return the number of bytes sent if any,\n *                 or a non-zero error code.\n *                 If performing non-blocking I/O, \\c MBEDTLS_ERR_SSL_WANT_WRITE\n *                 must be returned when the operation would block.\n *\n * \\note           The callback is allowed to send fewer bytes than requested.\n *                 It must always return the number of bytes actually sent.\n */\ntypedef int mbedtls_ssl_send_t( void *ctx,\n                                const unsigned char *buf,\n                                size_t len );\n\n/**\n * \\brief          Callback type: receive data from the network.\n *\n * \\note           That callback may be either blocking or non-blocking.\n *\n * \\param ctx      Context for the receive callback (typically a file\n *                 descriptor)\n * \\param buf      Buffer to write the received data to\n * \\param len      Length of the receive buffer\n *\n * \\return         The callback must return the number of bytes received,\n *                 or a non-zero error code.\n *                 If performing non-blocking I/O, \\c MBEDTLS_ERR_SSL_WANT_READ\n *                 must be returned when the operation would block.\n *\n * \\note           The callback may receive fewer bytes than the length of the\n *                 buffer. It must always return the number of bytes actually\n *                 received and written to the buffer.\n */\ntypedef int mbedtls_ssl_recv_t( void *ctx,\n                                unsigned char *buf,\n                                size_t len );\n\n/**\n * \\brief          Callback type: receive data from the network, with timeout\n *\n * \\note           That callback must block until data is received, or the\n *                 timeout delay expires, or the operation is interrupted by a\n *                 signal.\n *\n * \\param ctx      Context for the receive callback (typically a file descriptor)\n * \\param buf      Buffer to write the received data to\n * \\param len      Length of the receive buffer\n * \\param timeout  Maximum nomber of millisecondes to wait for data\n *                 0 means no timeout (potentially waiting forever)\n *\n * \\return         The callback must return the number of bytes received,\n *                 or a non-zero error code:\n *                 \\c MBEDTLS_ERR_SSL_TIMEOUT if the operation timed out,\n *                 \\c MBEDTLS_ERR_SSL_WANT_READ if interrupted by a signal.\n *\n * \\note           The callback may receive fewer bytes than the length of the\n *                 buffer. It must always return the number of bytes actually\n *                 received and written to the buffer.\n */\ntypedef int mbedtls_ssl_recv_timeout_t( void *ctx,\n                                        unsigned char *buf,\n                                        size_t len,\n                                        uint32_t timeout );\n/**\n * \\brief          Callback type: set a pair of timers/delays to watch\n *\n * \\param ctx      Context pointer\n * \\param int_ms   Intermediate delay in milliseconds\n * \\param fin_ms   Final delay in milliseconds\n *                 0 cancels the current timer.\n *\n * \\note           This callback must at least store the necessary information\n *                 for the associated \\c mbedtls_ssl_get_timer_t callback to\n *                 return correct information.\n *\n * \\note           If using a event-driven style of programming, an event must\n *                 be generated when the final delay is passed. The event must\n *                 cause a call to \\c mbedtls_ssl_handshake() with the proper\n *                 SSL context to be scheduled. Care must be taken to ensure\n *                 that at most one such call happens at a time.\n *\n * \\note           Only one timer at a time must be running. Calling this\n *                 function while a timer is running must cancel it. Cancelled\n *                 timers must not generate any event.\n */\ntypedef void mbedtls_ssl_set_timer_t( void * ctx,\n                                      uint32_t int_ms,\n                                      uint32_t fin_ms );\n\n/**\n * \\brief          Callback type: get status of timers/delays\n *\n * \\param ctx      Context pointer\n *\n * \\return         This callback must return:\n *                 -1 if cancelled (fin_ms == 0),\n *                  0 if none of the delays have passed,\n *                  1 if only the intermediate delay has passed,\n *                  2 if the final delay has passed.\n */\ntypedef int mbedtls_ssl_get_timer_t( void * ctx );\n\n\n/* Defined below */\ntypedef struct mbedtls_ssl_session mbedtls_ssl_session;\ntypedef struct mbedtls_ssl_context mbedtls_ssl_context;\ntypedef struct mbedtls_ssl_config  mbedtls_ssl_config;\n\n/* Defined in ssl_internal.h */\ntypedef struct mbedtls_ssl_transform mbedtls_ssl_transform;\ntypedef struct mbedtls_ssl_handshake_params mbedtls_ssl_handshake_params;\ntypedef struct mbedtls_ssl_sig_hash_set_t mbedtls_ssl_sig_hash_set_t;\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\ntypedef struct mbedtls_ssl_key_cert mbedtls_ssl_key_cert;\n#endif\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\ntypedef struct mbedtls_ssl_flight_item mbedtls_ssl_flight_item;\n#endif\n\n/*\n * This structure is used for storing current session data.\n */\nstruct mbedtls_ssl_session\n{\n#if defined(MBEDTLS_HAVE_TIME)\n    mbedtls_time_t start;       /*!< starting time      */\n#endif\n    int ciphersuite;            /*!< chosen ciphersuite */\n    int compression;            /*!< chosen compression */\n    size_t id_len;              /*!< session id length  */\n    unsigned char id[32];       /*!< session identifier */\n    unsigned char master[48];   /*!< the master secret  */\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_crt *peer_cert;        /*!< peer X.509 cert chain */\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n    uint32_t verify_result;          /*!<  verification result     */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)\n    unsigned char *ticket;      /*!< RFC 5077 session ticket */\n    size_t ticket_len;          /*!< session ticket length   */\n    uint32_t ticket_lifetime;   /*!< ticket lifetime hint    */\n#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n    unsigned char mfl_code;     /*!< MaxFragmentLength negotiated by peer */\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n    int trunc_hmac;             /*!< flag for truncated hmac activation   */\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n    int encrypt_then_mac;       /*!< flag for EtM activation                */\n#endif\n};\n\n/**\n * SSL/TLS configuration to be shared between mbedtls_ssl_context structures.\n */\nstruct mbedtls_ssl_config\n{\n    /* Group items by size (largest first) to minimize padding overhead */\n\n    /*\n     * Pointers\n     */\n\n    const int *ciphersuite_list[4]; /*!< allowed ciphersuites per version   */\n\n    /** Callback for printing debug output                                  */\n    void (*f_dbg)(void *, int, const char *, int, const char *);\n    void *p_dbg;                    /*!< context for the debug function     */\n\n    /** Callback for getting (pseudo-)random numbers                        */\n    int  (*f_rng)(void *, unsigned char *, size_t);\n    void *p_rng;                    /*!< context for the RNG function       */\n\n    /** Callback to retrieve a session from the cache                       */\n    int (*f_get_cache)(void *, mbedtls_ssl_session *);\n    /** Callback to store a session into the cache                          */\n    int (*f_set_cache)(void *, const mbedtls_ssl_session *);\n    void *p_cache;                  /*!< context for cache callbacks        */\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n    /** Callback for setting cert according to SNI extension                */\n    int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *, size_t);\n    void *p_sni;                    /*!< context for SNI callback           */\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    /** Callback to customize X.509 certificate chain verification          */\n    int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *);\n    void *p_vrfy;                   /*!< context for X.509 verify calllback */\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    /** Callback to retrieve PSK key from identity                          */\n    int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *, size_t);\n    void *p_psk;                    /*!< context for PSK callback           */\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)\n    /** Callback to create & write a cookie for ClientHello veirifcation    */\n    int (*f_cookie_write)( void *, unsigned char **, unsigned char *,\n                           const unsigned char *, size_t );\n    /** Callback to verify validity of a ClientHello cookie                 */\n    int (*f_cookie_check)( void *, const unsigned char *, size_t,\n                           const unsigned char *, size_t );\n    void *p_cookie;                 /*!< context for the cookie callbacks   */\n#endif\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C)\n    /** Callback to create & write a session ticket                         */\n    int (*f_ticket_write)( void *, const mbedtls_ssl_session *,\n            unsigned char *, const unsigned char *, size_t *, uint32_t * );\n    /** Callback to parse a session ticket into a session structure         */\n    int (*f_ticket_parse)( void *, mbedtls_ssl_session *, unsigned char *, size_t);\n    void *p_ticket;                 /*!< context for the ticket callbacks   */\n#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */\n\n#if defined(MBEDTLS_SSL_EXPORT_KEYS)\n    /** Callback to export key block and master secret                      */\n    int (*f_export_keys)( void *, const unsigned char *,\n            const unsigned char *, size_t, size_t, size_t );\n    void *p_export_keys;            /*!< context for key export callback    */\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    const mbedtls_x509_crt_profile *cert_profile; /*!< verification profile */\n    mbedtls_ssl_key_cert *key_cert; /*!< own certificate/key pair(s)        */\n    mbedtls_x509_crt *ca_chain;     /*!< trusted CAs                        */\n    mbedtls_x509_crl *ca_crl;       /*!< trusted CAs CRLs                   */\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n    const int *sig_hashes;          /*!< allowed signature hashes           */\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n    const mbedtls_ecp_group_id *curve_list; /*!< allowed curves             */\n#endif\n\n#if defined(MBEDTLS_DHM_C)\n    mbedtls_mpi dhm_P;              /*!< prime modulus for DHM              */\n    mbedtls_mpi dhm_G;              /*!< generator for DHM                  */\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    unsigned char *psk;             /*!< pre-shared key                     */\n    size_t         psk_len;         /*!< length of the pre-shared key       */\n    unsigned char *psk_identity;    /*!< identity for PSK negotiation       */\n    size_t         psk_identity_len;/*!< length of identity                 */\n#endif\n\n#if defined(MBEDTLS_SSL_ALPN)\n    const char **alpn_list;         /*!< ordered list of protocols          */\n#endif\n\n    /*\n     * Numerical settings (int then char)\n     */\n\n    uint32_t read_timeout;          /*!< timeout for mbedtls_ssl_read (ms)  */\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    uint32_t hs_timeout_min;        /*!< initial value of the handshake\n                                         retransmission timeout (ms)        */\n    uint32_t hs_timeout_max;        /*!< maximum value of the handshake\n                                         retransmission timeout (ms)        */\n#endif\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    int renego_max_records;         /*!< grace period for renegotiation     */\n    unsigned char renego_period[8]; /*!< value of the record counters\n                                         that triggers renegotiation        */\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)\n    unsigned int badmac_limit;      /*!< limit of records with a bad MAC    */\n#endif\n\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)\n    unsigned int dhm_min_bitlen;    /*!< min. bit length of the DHM prime   */\n#endif\n\n    unsigned char max_major_ver;    /*!< max. major version used            */\n    unsigned char max_minor_ver;    /*!< max. minor version used            */\n    unsigned char min_major_ver;    /*!< min. major version used            */\n    unsigned char min_minor_ver;    /*!< min. minor version used            */\n\n    /*\n     * Flags (bitfields)\n     */\n\n    unsigned int endpoint : 1;      /*!< 0: client, 1: server               */\n    unsigned int transport : 1;     /*!< stream (TLS) or datagram (DTLS)    */\n    unsigned int authmode : 2;      /*!< MBEDTLS_SSL_VERIFY_XXX             */\n    /* needed even with renego disabled for LEGACY_BREAK_HANDSHAKE          */\n    unsigned int allow_legacy_renegotiation : 2 ; /*!< MBEDTLS_LEGACY_XXX   */\n#if defined(MBEDTLS_ARC4_C)\n    unsigned int arc4_disabled : 1; /*!< blacklist RC4 ciphersuites?        */\n#endif\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n    unsigned int mfl_code : 3;      /*!< desired fragment length            */\n#endif\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n    unsigned int encrypt_then_mac : 1 ; /*!< negotiate encrypt-then-mac?    */\n#endif\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n    unsigned int extended_ms : 1;   /*!< negotiate extended master secret?  */\n#endif\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n    unsigned int anti_replay : 1;   /*!< detect and prevent replay?         */\n#endif\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\n    unsigned int cbc_record_splitting : 1;  /*!< do cbc record splitting    */\n#endif\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    unsigned int disable_renegotiation : 1; /*!< disable renegotiation?     */\n#endif\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n    unsigned int trunc_hmac : 1;    /*!< negotiate truncated hmac?          */\n#endif\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    unsigned int session_tickets : 1;   /*!< use session tickets?           */\n#endif\n#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C)\n    unsigned int fallback : 1;      /*!< is this a fallback?                */\n#endif\n#if defined(MBEDTLS_SSL_SRV_C)\n    unsigned int cert_req_ca_list : 1;  /*!< enable sending CA list in\n                                          Certificate Request messages?     */\n#endif\n};\n\n\nstruct mbedtls_ssl_context\n{\n    mbedtls_ssl_config *conf; /*!< configuration information          */\n\n    /*\n     * Miscellaneous\n     */\n    int state;                  /*!< SSL handshake: current state     */\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    int renego_status;          /*!< Initial, in progress, pending?   */\n    int renego_records_seen;    /*!< Records since renego request, or with DTLS,\n                                  number of retransmissions of request if\n                                  renego_max_records is < 0           */\n#endif\n\n    int major_ver;              /*!< equal to  MBEDTLS_SSL_MAJOR_VERSION_3    */\n    int minor_ver;              /*!< either 0 (SSL3) or 1 (TLS1.0)    */\n\n#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)\n    unsigned badmac_seen;       /*!< records with a bad MAC received    */\n#endif\n\n    mbedtls_ssl_send_t *f_send; /*!< Callback for network send */\n    mbedtls_ssl_recv_t *f_recv; /*!< Callback for network receive */\n    mbedtls_ssl_recv_timeout_t *f_recv_timeout;\n                                /*!< Callback for network receive with timeout */\n\n    void *p_bio;                /*!< context for I/O operations   */\n\n    /*\n     * Session layer\n     */\n    mbedtls_ssl_session *session_in;            /*!<  current session data (in)   */\n    mbedtls_ssl_session *session_out;           /*!<  current session data (out)  */\n    mbedtls_ssl_session *session;               /*!<  negotiated session data     */\n    mbedtls_ssl_session *session_negotiate;     /*!<  session data in negotiation */\n\n    mbedtls_ssl_handshake_params *handshake;    /*!<  params required only during\n                                              the handshake process        */\n\n    /*\n     * Record layer transformations\n     */\n    mbedtls_ssl_transform *transform_in;        /*!<  current transform params (in)   */\n    mbedtls_ssl_transform *transform_out;       /*!<  current transform params (in)   */\n    mbedtls_ssl_transform *transform;           /*!<  negotiated transform params     */\n    mbedtls_ssl_transform *transform_negotiate; /*!<  transform params in negotiation */\n\n    /*\n     * Timers\n     */\n    void *p_timer;              /*!< context for the timer callbacks */\n\n    mbedtls_ssl_set_timer_t *f_set_timer;       /*!< set timer callback */\n    mbedtls_ssl_get_timer_t *f_get_timer;       /*!< get timer callback */\n\n    /*\n     * Record layer (incoming data)\n     */\n    unsigned char *in_buf;      /*!< input buffer                     */\n    unsigned char *in_ctr;      /*!< 64-bit incoming message counter\n                                     TLS: maintained by us\n                                     DTLS: read from peer             */\n    unsigned char *in_hdr;      /*!< start of record header           */\n    unsigned char *in_len;      /*!< two-bytes message length field   */\n    unsigned char *in_iv;       /*!< ivlen-byte IV                    */\n    unsigned char *in_msg;      /*!< message contents (in_iv+ivlen)   */\n    unsigned char *in_offt;     /*!< read offset in application data  */\n\n    int in_msgtype;             /*!< record header: message type      */\n    size_t in_msglen;           /*!< record header: message length    */\n    size_t in_left;             /*!< amount of data read so far       */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    uint16_t in_epoch;          /*!< DTLS epoch for incoming records  */\n    size_t next_record_offset;  /*!< offset of the next record in datagram\n                                     (equal to in_left if none)       */\n#endif\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n    uint64_t in_window_top;     /*!< last validated record seq_num    */\n    uint64_t in_window;         /*!< bitmask for replay detection     */\n#endif\n\n    size_t in_hslen;            /*!< current handshake message length,\n                                     including the handshake header   */\n    int nb_zero;                /*!< # of 0-length encrypted messages */\n\n    int keep_current_message;   /*!< drop or reuse current message\n                                     on next call to record layer? */\n\n    /*\n     * Record layer (outgoing data)\n     */\n    unsigned char *out_buf;     /*!< output buffer                    */\n    unsigned char *out_ctr;     /*!< 64-bit outgoing message counter  */\n    unsigned char *out_hdr;     /*!< start of record header           */\n    unsigned char *out_len;     /*!< two-bytes message length field   */\n    unsigned char *out_iv;      /*!< ivlen-byte IV                    */\n    unsigned char *out_msg;     /*!< message contents (out_iv+ivlen)  */\n\n    int out_msgtype;            /*!< record header: message type      */\n    size_t out_msglen;          /*!< record header: message length    */\n    size_t out_left;            /*!< amount of data not yet written   */\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    unsigned char *compress_buf;        /*!<  zlib data buffer        */\n#endif\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\n    signed char split_done;     /*!< current record already splitted? */\n#endif\n\n    /*\n     * PKI layer\n     */\n    int client_auth;                    /*!<  flag for client auth.   */\n\n    /*\n     * User settings\n     */\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    char *hostname;             /*!< expected peer CN for verification\n                                     (and SNI if available)                 */\n#endif\n\n#if defined(MBEDTLS_SSL_ALPN)\n    const char *alpn_chosen;    /*!<  negotiated protocol                   */\n#endif\n\n    /*\n     * Information for DTLS hello verify\n     */\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)\n    unsigned char  *cli_id;         /*!<  transport-level ID of the client  */\n    size_t          cli_id_len;     /*!<  length of cli_id                  */\n#endif\n\n    /*\n     * Secure renegotiation\n     */\n    /* needed to know when to send extension on server */\n    int secure_renegotiation;           /*!<  does peer support legacy or\n                                              secure renegotiation           */\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    size_t verify_data_len;             /*!<  length of verify data stored   */\n    char own_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!<  previous handshake verify data */\n    char peer_verify_data[MBEDTLS_SSL_VERIFY_DATA_MAX_LEN]; /*!<  previous handshake verify data */\n#endif\n};\n\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\n\n#define MBEDTLS_SSL_CHANNEL_OUTBOUND    0\n#define MBEDTLS_SSL_CHANNEL_INBOUND     1\n\nextern int (*mbedtls_ssl_hw_record_init)(mbedtls_ssl_context *ssl,\n                const unsigned char *key_enc, const unsigned char *key_dec,\n                size_t keylen,\n                const unsigned char *iv_enc,  const unsigned char *iv_dec,\n                size_t ivlen,\n                const unsigned char *mac_enc, const unsigned char *mac_dec,\n                size_t maclen);\nextern int (*mbedtls_ssl_hw_record_activate)(mbedtls_ssl_context *ssl, int direction);\nextern int (*mbedtls_ssl_hw_record_reset)(mbedtls_ssl_context *ssl);\nextern int (*mbedtls_ssl_hw_record_write)(mbedtls_ssl_context *ssl);\nextern int (*mbedtls_ssl_hw_record_read)(mbedtls_ssl_context *ssl);\nextern int (*mbedtls_ssl_hw_record_finish)(mbedtls_ssl_context *ssl);\n#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */\n\n/**\n * \\brief Returns the list of ciphersuites supported by the SSL/TLS module.\n *\n * \\return              a statically allocated array of ciphersuites, the last\n *                      entry is 0.\n */\nconst int *mbedtls_ssl_list_ciphersuites( void );\n\n/**\n * \\brief               Return the name of the ciphersuite associated with the\n *                      given ID\n *\n * \\param ciphersuite_id SSL ciphersuite ID\n *\n * \\return              a string containing the ciphersuite name\n */\nconst char *mbedtls_ssl_get_ciphersuite_name( const int ciphersuite_id );\n\n/**\n * \\brief               Return the ID of the ciphersuite associated with the\n *                      given name\n *\n * \\param ciphersuite_name SSL ciphersuite name\n *\n * \\return              the ID with the ciphersuite or 0 if not found\n */\nint mbedtls_ssl_get_ciphersuite_id( const char *ciphersuite_name );\n\n/**\n * \\brief          Initialize an SSL context\n *                 Just makes the context ready for mbedtls_ssl_setup() or\n *                 mbedtls_ssl_free()\n *\n * \\param ssl      SSL context\n */\nvoid mbedtls_ssl_init( mbedtls_ssl_context *ssl );\n\n/**\n * \\brief          Set up an SSL context for use\n *\n * \\note           No copy of the configuration context is made, it can be\n *                 shared by many mbedtls_ssl_context structures.\n *\n * \\warning        Modifying the conf structure after it has been used in this\n *                 function is unsupported!\n *\n * \\param ssl      SSL context\n * \\param conf     SSL configuration to use\n *\n * \\return         0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED if\n *                 memory allocation failed\n */\nint mbedtls_ssl_setup( mbedtls_ssl_context *ssl,\n                       mbedtls_ssl_config *conf );\n\n/**\n * \\brief          Reset an already initialized SSL context for re-use\n *                 while retaining application-set variables, function\n *                 pointers and data.\n *\n * \\param ssl      SSL context\n * \\return         0 if successful, or MBEDTLS_ERR_SSL_ALLOC_FAILED,\n                   MBEDTLS_ERR_SSL_HW_ACCEL_FAILED or\n *                 MBEDTLS_ERR_SSL_COMPRESSION_FAILED\n */\nint mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl );\n\n/**\n * \\brief          Set the current endpoint type\n *\n * \\param conf     SSL configuration\n * \\param endpoint must be MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER\n */\nvoid mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint );\n\n/**\n * \\brief           Set the transport type (TLS or DTLS).\n *                  Default: TLS\n *\n * \\note            For DTLS, you must either provide a recv callback that\n *                  doesn't block, or one that handles timeouts, see\n *                  \\c mbedtls_ssl_set_bio(). You also need to provide timer\n *                  callbacks with \\c mbedtls_ssl_set_timer_cb().\n *\n * \\param conf      SSL configuration\n * \\param transport transport type:\n *                  MBEDTLS_SSL_TRANSPORT_STREAM for TLS,\n *                  MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS.\n */\nvoid mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport );\n\n/**\n * \\brief          Set the certificate verification mode\n *                 Default: NONE on server, REQUIRED on client\n *\n * \\param conf     SSL configuration\n * \\param authmode can be:\n *\n *  MBEDTLS_SSL_VERIFY_NONE:      peer certificate is not checked\n *                        (default on server)\n *                        (insecure on client)\n *\n *  MBEDTLS_SSL_VERIFY_OPTIONAL:  peer certificate is checked, however the\n *                        handshake continues even if verification failed;\n *                        mbedtls_ssl_get_verify_result() can be called after the\n *                        handshake is complete.\n *\n *  MBEDTLS_SSL_VERIFY_REQUIRED:  peer *must* present a valid certificate,\n *                        handshake is aborted if verification failed.\n *                        (default on client)\n *\n * \\note On client, MBEDTLS_SSL_VERIFY_REQUIRED is the recommended mode.\n * With MBEDTLS_SSL_VERIFY_OPTIONAL, the user needs to call mbedtls_ssl_get_verify_result() at\n * the right time(s), which may not be obvious, while REQUIRED always perform\n * the verification as soon as possible. For example, REQUIRED was protecting\n * against the \"triple handshake\" attack even before it was found.\n */\nvoid mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n/**\n * \\brief          Set the verification callback (Optional).\n *\n *                 If set, the verify callback is called for each\n *                 certificate in the chain. For implementation\n *                 information, please see \\c mbedtls_x509_crt_verify()\n *\n * \\param conf     SSL configuration\n * \\param f_vrfy   verification function\n * \\param p_vrfy   verification parameter\n */\nvoid mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf,\n                     int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),\n                     void *p_vrfy );\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n/**\n * \\brief          Set the random number generator callback\n *\n * \\param conf     SSL configuration\n * \\param f_rng    RNG function\n * \\param p_rng    RNG parameter\n */\nvoid mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf,\n                  int (*f_rng)(void *, unsigned char *, size_t),\n                  void *p_rng );\n\n/**\n * \\brief          Set the debug callback\n *\n *                 The callback has the following argument:\n *                 void *           opaque context for the callback\n *                 int              debug level\n *                 const char *     file name\n *                 int              line number\n *                 const char *     message\n *\n * \\param conf     SSL configuration\n * \\param f_dbg    debug function\n * \\param p_dbg    debug parameter\n */\nvoid mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf,\n                  void (*f_dbg)(void *, int, const char *, int, const char *),\n                  void  *p_dbg );\n\n/**\n * \\brief          Set the underlying BIO callbacks for write, read and\n *                 read-with-timeout.\n *\n * \\param ssl      SSL context\n * \\param p_bio    parameter (context) shared by BIO callbacks\n * \\param f_send   write callback\n * \\param f_recv   read callback\n * \\param f_recv_timeout blocking read callback with timeout.\n *\n * \\note           One of f_recv or f_recv_timeout can be NULL, in which case\n *                 the other is used. If both are non-NULL, f_recv_timeout is\n *                 used and f_recv is ignored (as if it were NULL).\n *\n * \\note           The two most common use cases are:\n *                 - non-blocking I/O, f_recv != NULL, f_recv_timeout == NULL\n *                 - blocking I/O, f_recv == NULL, f_recv_timout != NULL\n *\n * \\note           For DTLS, you need to provide either a non-NULL\n *                 f_recv_timeout callback, or a f_recv that doesn't block.\n *\n * \\note           See the documentations of \\c mbedtls_ssl_sent_t,\n *                 \\c mbedtls_ssl_recv_t and \\c mbedtls_ssl_recv_timeout_t for\n *                 the conventions those callbacks must follow.\n *\n * \\note           On some platforms, net_sockets.c provides\n *                 \\c mbedtls_net_send(), \\c mbedtls_net_recv() and\n *                 \\c mbedtls_net_recv_timeout() that are suitable to be used\n *                 here.\n */\nvoid mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,\n                          void *p_bio,\n                          mbedtls_ssl_send_t *f_send,\n                          mbedtls_ssl_recv_t *f_recv,\n                          mbedtls_ssl_recv_timeout_t *f_recv_timeout );\n\n/**\n * \\brief          Set the timeout period for mbedtls_ssl_read()\n *                 (Default: no timeout.)\n *\n * \\param conf     SSL configuration context\n * \\param timeout  Timeout value in milliseconds.\n *                 Use 0 for no timeout (default).\n *\n * \\note           With blocking I/O, this will only work if a non-NULL\n *                 \\c f_recv_timeout was set with \\c mbedtls_ssl_set_bio().\n *                 With non-blocking I/O, this will only work if timer\n *                 callbacks were set with \\c mbedtls_ssl_set_timer_cb().\n *\n * \\note           With non-blocking I/O, you may also skip this function\n *                 altogether and handle timeouts at the application layer.\n */\nvoid mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout );\n\n/**\n * \\brief          Set the timer callbacks (Mandatory for DTLS.)\n *\n * \\param ssl      SSL context\n * \\param p_timer  parameter (context) shared by timer callbacks\n * \\param f_set_timer   set timer callback\n * \\param f_get_timer   get timer callback. Must return:\n *\n * \\note           See the documentation of \\c mbedtls_ssl_set_timer_t and\n *                 \\c mbedtls_ssl_get_timer_t for the conventions this pair of\n *                 callbacks must follow.\n *\n * \\note           On some platforms, timing.c provides\n *                 \\c mbedtls_timing_set_delay() and\n *                 \\c mbedtls_timing_get_delay() that are suitable for using\n *                 here, except if using an event-driven style.\n *\n * \\note           See also the \"DTLS tutorial\" article in our knowledge base.\n *                 https://tls.mbed.org/kb/how-to/dtls-tutorial\n */\nvoid mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl,\n                               void *p_timer,\n                               mbedtls_ssl_set_timer_t *f_set_timer,\n                               mbedtls_ssl_get_timer_t *f_get_timer );\n\n/**\n * \\brief           Callback type: generate and write session ticket\n *\n * \\note            This describes what a callback implementation should do.\n *                  This callback should generate an encrypted and\n *                  authenticated ticket for the session and write it to the\n *                  output buffer. Here, ticket means the opaque ticket part\n *                  of the NewSessionTicket structure of RFC 5077.\n *\n * \\param p_ticket  Context for the callback\n * \\param session   SSL session to be written in the ticket\n * \\param start     Start of the output buffer\n * \\param end       End of the output buffer\n * \\param tlen      On exit, holds the length written\n * \\param lifetime  On exit, holds the lifetime of the ticket in seconds\n *\n * \\return          0 if successful, or\n *                  a specific MBEDTLS_ERR_XXX code.\n */\ntypedef int mbedtls_ssl_ticket_write_t( void *p_ticket,\n                                        const mbedtls_ssl_session *session,\n                                        unsigned char *start,\n                                        const unsigned char *end,\n                                        size_t *tlen,\n                                        uint32_t *lifetime );\n\n#if defined(MBEDTLS_SSL_EXPORT_KEYS)\n/**\n * \\brief           Callback type: Export key block and master secret\n *\n * \\note            This is required for certain uses of TLS, e.g. EAP-TLS\n *                  (RFC 5216) and Thread. The key pointers are ephemeral and\n *                  therefore must not be stored. The master secret and keys\n *                  should not be used directly except as an input to a key\n *                  derivation function.\n *\n * \\param p_expkey  Context for the callback\n * \\param ms        Pointer to master secret (fixed length: 48 bytes)\n * \\param kb        Pointer to key block, see RFC 5246 section 6.3\n *                  (variable length: 2 * maclen + 2 * keylen + 2 * ivlen).\n * \\param maclen    MAC length\n * \\param keylen    Key length\n * \\param ivlen     IV length\n *\n * \\return          0 if successful, or\n *                  a specific MBEDTLS_ERR_XXX code.\n */\ntypedef int mbedtls_ssl_export_keys_t( void *p_expkey,\n                                const unsigned char *ms,\n                                const unsigned char *kb,\n                                size_t maclen,\n                                size_t keylen,\n                                size_t ivlen );\n#endif /* MBEDTLS_SSL_EXPORT_KEYS */\n\n/**\n * \\brief           Callback type: parse and load session ticket\n *\n * \\note            This describes what a callback implementation should do.\n *                  This callback should parse a session ticket as generated\n *                  by the corresponding mbedtls_ssl_ticket_write_t function,\n *                  and, if the ticket is authentic and valid, load the\n *                  session.\n *\n * \\note            The implementation is allowed to modify the first len\n *                  bytes of the input buffer, eg to use it as a temporary\n *                  area for the decrypted ticket contents.\n *\n * \\param p_ticket  Context for the callback\n * \\param session   SSL session to be loaded\n * \\param buf       Start of the buffer containing the ticket\n * \\param len       Length of the ticket.\n *\n * \\return          0 if successful, or\n *                  MBEDTLS_ERR_SSL_INVALID_MAC if not authentic, or\n *                  MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED if expired, or\n *                  any other non-zero code for other failures.\n */\ntypedef int mbedtls_ssl_ticket_parse_t( void *p_ticket,\n                                        mbedtls_ssl_session *session,\n                                        unsigned char *buf,\n                                        size_t len );\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_SRV_C)\n/**\n * \\brief           Configure SSL session ticket callbacks (server only).\n *                  (Default: none.)\n *\n * \\note            On server, session tickets are enabled by providing\n *                  non-NULL callbacks.\n *\n * \\note            On client, use \\c mbedtls_ssl_conf_session_tickets().\n *\n * \\param conf      SSL configuration context\n * \\param f_ticket_write    Callback for writing a ticket\n * \\param f_ticket_parse    Callback for parsing a ticket\n * \\param p_ticket          Context shared by the two callbacks\n */\nvoid mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,\n        mbedtls_ssl_ticket_write_t *f_ticket_write,\n        mbedtls_ssl_ticket_parse_t *f_ticket_parse,\n        void *p_ticket );\n#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_SRV_C */\n\n#if defined(MBEDTLS_SSL_EXPORT_KEYS)\n/**\n * \\brief           Configure key export callback.\n *                  (Default: none.)\n *\n * \\note            See \\c mbedtls_ssl_export_keys_t.\n *\n * \\param conf      SSL configuration context\n * \\param f_export_keys     Callback for exporting keys\n * \\param p_export_keys     Context for the callback\n */\nvoid mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf,\n        mbedtls_ssl_export_keys_t *f_export_keys,\n        void *p_export_keys );\n#endif /* MBEDTLS_SSL_EXPORT_KEYS */\n\n/**\n * \\brief          Callback type: generate a cookie\n *\n * \\param ctx      Context for the callback\n * \\param p        Buffer to write to,\n *                 must be updated to point right after the cookie\n * \\param end      Pointer to one past the end of the output buffer\n * \\param info     Client ID info that was passed to\n *                 \\c mbedtls_ssl_set_client_transport_id()\n * \\param ilen     Length of info in bytes\n *\n * \\return         The callback must return 0 on success,\n *                 or a negative error code.\n */\ntypedef int mbedtls_ssl_cookie_write_t( void *ctx,\n                                unsigned char **p, unsigned char *end,\n                                const unsigned char *info, size_t ilen );\n\n/**\n * \\brief          Callback type: verify a cookie\n *\n * \\param ctx      Context for the callback\n * \\param cookie   Cookie to verify\n * \\param clen     Length of cookie\n * \\param info     Client ID info that was passed to\n *                 \\c mbedtls_ssl_set_client_transport_id()\n * \\param ilen     Length of info in bytes\n *\n * \\return         The callback must return 0 if cookie is valid,\n *                 or a negative error code.\n */\ntypedef int mbedtls_ssl_cookie_check_t( void *ctx,\n                                const unsigned char *cookie, size_t clen,\n                                const unsigned char *info, size_t ilen );\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)\n/**\n * \\brief           Register callbacks for DTLS cookies\n *                  (Server only. DTLS only.)\n *\n *                  Default: dummy callbacks that fail, in order to force you to\n *                  register working callbacks (and initialize their context).\n *\n *                  To disable HelloVerifyRequest, register NULL callbacks.\n *\n * \\warning         Disabling hello verification allows your server to be used\n *                  for amplification in DoS attacks against other hosts.\n *                  Only disable if you known this can't happen in your\n *                  particular environment.\n *\n * \\note            See comments on \\c mbedtls_ssl_handshake() about handling\n *                  the MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED that is expected\n *                  on the first handshake attempt when this is enabled.\n *\n * \\note            This is also necessary to handle client reconnection from\n *                  the same port as described in RFC 6347 section 4.2.8 (only\n *                  the variant with cookies is supported currently). See\n *                  comments on \\c mbedtls_ssl_read() for details.\n *\n * \\param conf              SSL configuration\n * \\param f_cookie_write    Cookie write callback\n * \\param f_cookie_check    Cookie check callback\n * \\param p_cookie          Context for both callbacks\n */\nvoid mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf,\n                           mbedtls_ssl_cookie_write_t *f_cookie_write,\n                           mbedtls_ssl_cookie_check_t *f_cookie_check,\n                           void *p_cookie );\n\n/**\n * \\brief          Set client's transport-level identification info.\n *                 (Server only. DTLS only.)\n *\n *                 This is usually the IP address (and port), but could be\n *                 anything identify the client depending on the underlying\n *                 network stack. Used for HelloVerifyRequest with DTLS.\n *                 This is *not* used to route the actual packets.\n *\n * \\param ssl      SSL context\n * \\param info     Transport-level info identifying the client (eg IP + port)\n * \\param ilen     Length of info in bytes\n *\n * \\note           An internal copy is made, so the info buffer can be reused.\n *\n * \\return         0 on success,\n *                 MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used on client,\n *                 MBEDTLS_ERR_SSL_ALLOC_FAILED if out of memory.\n */\nint mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl,\n                                 const unsigned char *info,\n                                 size_t ilen );\n\n#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n/**\n * \\brief          Enable or disable anti-replay protection for DTLS.\n *                 (DTLS only, no effect on TLS.)\n *                 Default: enabled.\n *\n * \\param conf     SSL configuration\n * \\param mode     MBEDTLS_SSL_ANTI_REPLAY_ENABLED or MBEDTLS_SSL_ANTI_REPLAY_DISABLED.\n *\n * \\warning        Disabling this is a security risk unless the application\n *                 protocol handles duplicated packets in a safe way. You\n *                 should not disable this without careful consideration.\n *                 However, if your application already detects duplicated\n *                 packets and needs information about them to adjust its\n *                 transmission strategy, then you'll want to disable this.\n */\nvoid mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode );\n#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */\n\n#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)\n/**\n * \\brief          Set a limit on the number of records with a bad MAC\n *                 before terminating the connection.\n *                 (DTLS only, no effect on TLS.)\n *                 Default: 0 (disabled).\n *\n * \\param conf     SSL configuration\n * \\param limit    Limit, or 0 to disable.\n *\n * \\note           If the limit is N, then the connection is terminated when\n *                 the Nth non-authentic record is seen.\n *\n * \\note           Records with an invalid header are not counted, only the\n *                 ones going through the authentication-decryption phase.\n *\n * \\note           This is a security trade-off related to the fact that it's\n *                 often relatively easy for an active attacker ot inject UDP\n *                 datagrams. On one hand, setting a low limit here makes it\n *                 easier for such an attacker to forcibly terminated a\n *                 connection. On the other hand, a high limit or no limit\n *                 might make us waste resources checking authentication on\n *                 many bogus packets.\n */\nvoid mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit );\n#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n/**\n * \\brief          Set retransmit timeout values for the DTLS handshake.\n *                 (DTLS only, no effect on TLS.)\n *\n * \\param conf     SSL configuration\n * \\param min      Initial timeout value in milliseconds.\n *                 Default: 1000 (1 second).\n * \\param max      Maximum timeout value in milliseconds.\n *                 Default: 60000 (60 seconds).\n *\n * \\note           Default values are from RFC 6347 section 4.2.4.1.\n *\n * \\note           The 'min' value should typically be slightly above the\n *                 expected round-trip time to your peer, plus whatever time\n *                 it takes for the peer to process the message. For example,\n *                 if your RTT is about 600ms and you peer needs up to 1s to\n *                 do the cryptographic operations in the handshake, then you\n *                 should set 'min' slightly above 1600. Lower values of 'min'\n *                 might cause spurious resends which waste network resources,\n *                 while larger value of 'min' will increase overall latency\n *                 on unreliable network links.\n *\n * \\note           The more unreliable your network connection is, the larger\n *                 your max / min ratio needs to be in order to achieve\n *                 reliable handshakes.\n *\n * \\note           Messages are retransmitted up to log2(ceil(max/min)) times.\n *                 For example, if min = 1s and max = 5s, the retransmit plan\n *                 goes: send ... 1s -> resend ... 2s -> resend ... 4s ->\n *                 resend ... 5s -> give up and return a timeout error.\n */\nvoid mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf, uint32_t min, uint32_t max );\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n#if defined(MBEDTLS_SSL_SRV_C)\n/**\n * \\brief          Set the session cache callbacks (server-side only)\n *                 If not set, no session resuming is done (except if session\n *                 tickets are enabled too).\n *\n *                 The session cache has the responsibility to check for stale\n *                 entries based on timeout. See RFC 5246 for recommendations.\n *\n *                 Warning: session.peer_cert is cleared by the SSL/TLS layer on\n *                 connection shutdown, so do not cache the pointer! Either set\n *                 it to NULL or make a full copy of the certificate.\n *\n *                 The get callback is called once during the initial handshake\n *                 to enable session resuming. The get function has the\n *                 following parameters: (void *parameter, mbedtls_ssl_session *session)\n *                 If a valid entry is found, it should fill the master of\n *                 the session object with the cached values and return 0,\n *                 return 1 otherwise. Optionally peer_cert can be set as well\n *                 if it is properly present in cache entry.\n *\n *                 The set callback is called once during the initial handshake\n *                 to enable session resuming after the entire handshake has\n *                 been finished. The set function has the following parameters:\n *                 (void *parameter, const mbedtls_ssl_session *session). The function\n *                 should create a cache entry for future retrieval based on\n *                 the data in the session structure and should keep in mind\n *                 that the mbedtls_ssl_session object presented (and all its referenced\n *                 data) is cleared by the SSL/TLS layer when the connection is\n *                 terminated. It is recommended to add metadata to determine if\n *                 an entry is still valid in the future. Return 0 if\n *                 successfully cached, return 1 otherwise.\n *\n * \\param conf           SSL configuration\n * \\param p_cache        parmater (context) for both callbacks\n * \\param f_get_cache    session get callback\n * \\param f_set_cache    session set callback\n */\nvoid mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf,\n        void *p_cache,\n        int (*f_get_cache)(void *, mbedtls_ssl_session *),\n        int (*f_set_cache)(void *, const mbedtls_ssl_session *) );\n#endif /* MBEDTLS_SSL_SRV_C */\n\n#if defined(MBEDTLS_SSL_CLI_C)\n/**\n * \\brief          Request resumption of session (client-side only)\n *                 Session data is copied from presented session structure.\n *\n * \\param ssl      SSL context\n * \\param session  session context\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or\n *                 arguments are otherwise invalid\n *\n * \\sa             mbedtls_ssl_get_session()\n */\nint mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session );\n#endif /* MBEDTLS_SSL_CLI_C */\n\n/**\n * \\brief               Set the list of allowed ciphersuites and the preference\n *                      order. First in the list has the highest preference.\n *                      (Overrides all version-specific lists)\n *\n *                      The ciphersuites array is not copied, and must remain\n *                      valid for the lifetime of the ssl_config.\n *\n *                      Note: The server uses its own preferences\n *                      over the preference of the client unless\n *                      MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE is defined!\n *\n * \\param conf          SSL configuration\n * \\param ciphersuites  0-terminated list of allowed ciphersuites\n */\nvoid mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf,\n                                   const int *ciphersuites );\n\n/**\n * \\brief               Set the list of allowed ciphersuites and the\n *                      preference order for a specific version of the protocol.\n *                      (Only useful on the server side)\n *\n *                      The ciphersuites array is not copied, and must remain\n *                      valid for the lifetime of the ssl_config.\n *\n * \\param conf          SSL configuration\n * \\param ciphersuites  0-terminated list of allowed ciphersuites\n * \\param major         Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3\n *                      supported)\n * \\param minor         Minor version number (MBEDTLS_SSL_MINOR_VERSION_0,\n *                      MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2,\n *                      MBEDTLS_SSL_MINOR_VERSION_3 supported)\n *\n * \\note                With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0\n *                      and MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2\n */\nvoid mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf,\n                                       const int *ciphersuites,\n                                       int major, int minor );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n/**\n * \\brief          Set the X.509 security profile used for verification\n *\n * \\note           The restrictions are enforced for all certificates in the\n *                 chain. However, signatures in the handshake are not covered\n *                 by this setting but by \\b mbedtls_ssl_conf_sig_hashes().\n *\n * \\param conf     SSL configuration\n * \\param profile  Profile to use\n */\nvoid mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf,\n                                    const mbedtls_x509_crt_profile *profile );\n\n/**\n * \\brief          Set the data required to verify peer certificate\n *\n * \\param conf     SSL configuration\n * \\param ca_chain trusted CA chain (meaning all fully trusted top-level CAs)\n * \\param ca_crl   trusted CA CRLs\n */\nvoid mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,\n                               mbedtls_x509_crt *ca_chain,\n                               mbedtls_x509_crl *ca_crl );\n\n/**\n * \\brief          Set own certificate chain and private key\n *\n * \\note           own_cert should contain in order from the bottom up your\n *                 certificate chain. The top certificate (self-signed)\n *                 can be omitted.\n *\n * \\note           On server, this function can be called multiple times to\n *                 provision more than one cert/key pair (eg one ECDSA, one\n *                 RSA with SHA-256, one RSA with SHA-1). An adequate\n *                 certificate will be selected according to the client's\n *                 advertised capabilities. In case mutliple certificates are\n *                 adequate, preference is given to the one set by the first\n *                 call to this function, then second, etc.\n *\n * \\note           On client, only the first call has any effect. That is,\n *                 only one client certificate can be provisioned. The\n *                 server's preferences in its CertficateRequest message will\n *                 be ignored and our only cert will be sent regardless of\n *                 whether it matches those preferences - the server can then\n *                 decide what it wants to do with it.\n *\n * \\param conf     SSL configuration\n * \\param own_cert own public certificate chain\n * \\param pk_key   own private key\n *\n * \\return         0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED\n */\nint mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf,\n                              mbedtls_x509_crt *own_cert,\n                              mbedtls_pk_context *pk_key );\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n/**\n * \\brief          Set the Pre Shared Key (PSK) and the expected identity name\n *\n * \\note           This is mainly useful for clients. Servers will usually\n *                 want to use \\c mbedtls_ssl_conf_psk_cb() instead.\n *\n * \\note           Currently clients can only register one pre-shared key.\n *                 In other words, the servers' identity hint is ignored.\n *                 Support for setting multiple PSKs on clients and selecting\n *                 one based on the identity hint is not a planned feature but\n *                 feedback is welcomed.\n *\n * \\param conf     SSL configuration\n * \\param psk      pointer to the pre-shared key\n * \\param psk_len  pre-shared key length\n * \\param psk_identity      pointer to the pre-shared key identity\n * \\param psk_identity_len  identity key length\n *\n * \\return         0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED\n */\nint mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,\n                const unsigned char *psk, size_t psk_len,\n                const unsigned char *psk_identity, size_t psk_identity_len );\n\n\n/**\n * \\brief          Set the Pre Shared Key (PSK) for the current handshake\n *\n * \\note           This should only be called inside the PSK callback,\n *                 ie the function passed to \\c mbedtls_ssl_conf_psk_cb().\n *\n * \\param ssl      SSL context\n * \\param psk      pointer to the pre-shared key\n * \\param psk_len  pre-shared key length\n *\n * \\return         0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED\n */\nint mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl,\n                            const unsigned char *psk, size_t psk_len );\n\n/**\n * \\brief          Set the PSK callback (server-side only).\n *\n *                 If set, the PSK callback is called for each\n *                 handshake where a PSK ciphersuite was negotiated.\n *                 The caller provides the identity received and wants to\n *                 receive the actual PSK data and length.\n *\n *                 The callback has the following parameters: (void *parameter,\n *                 mbedtls_ssl_context *ssl, const unsigned char *psk_identity,\n *                 size_t identity_len)\n *                 If a valid PSK identity is found, the callback should use\n *                 \\c mbedtls_ssl_set_hs_psk() on the ssl context to set the\n *                 correct PSK and return 0.\n *                 Any other return value will result in a denied PSK identity.\n *\n * \\note           If you set a PSK callback using this function, then you\n *                 don't need to set a PSK key and identity using\n *                 \\c mbedtls_ssl_conf_psk().\n *\n * \\param conf     SSL configuration\n * \\param f_psk    PSK identity function\n * \\param p_psk    PSK identity parameter\n */\nvoid mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,\n                     int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *,\n                                  size_t),\n                     void *p_psk );\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)\n/**\n * \\brief          Set the Diffie-Hellman public P and G values,\n *                 read as hexadecimal strings (server-side only)\n *                 (Default: MBEDTLS_DHM_RFC5114_MODP_2048_[PG])\n *\n * \\param conf     SSL configuration\n * \\param dhm_P    Diffie-Hellman-Merkle modulus\n * \\param dhm_G    Diffie-Hellman-Merkle generator\n *\n * \\return         0 if successful\n */\nint mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G );\n\n/**\n * \\brief          Set the Diffie-Hellman public P and G values,\n *                 read from existing context (server-side only)\n *\n * \\param conf     SSL configuration\n * \\param dhm_ctx  Diffie-Hellman-Merkle context\n *\n * \\return         0 if successful\n */\nint mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx );\n#endif /* MBEDTLS_DHM_C && defined(MBEDTLS_SSL_SRV_C) */\n\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)\n/**\n * \\brief          Set the minimum length for Diffie-Hellman parameters.\n *                 (Client-side only.)\n *                 (Default: 1024 bits.)\n *\n * \\param conf     SSL configuration\n * \\param bitlen   Minimum bit length of the DHM prime\n */\nvoid mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf,\n                                      unsigned int bitlen );\n#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */\n\n#if defined(MBEDTLS_ECP_C)\n/**\n * \\brief          Set the allowed curves in order of preference.\n *                 (Default: all defined curves.)\n *\n *                 On server: this only affects selection of the ECDHE curve;\n *                 the curves used for ECDH and ECDSA are determined by the\n *                 list of available certificates instead.\n *\n *                 On client: this affects the list of curves offered for any\n *                 use. The server can override our preference order.\n *\n *                 Both sides: limits the set of curves accepted for use in\n *                 ECDHE and in the peer's end-entity certificate.\n *\n * \\note           This has no influence on which curves are allowed inside the\n *                 certificate chains, see \\c mbedtls_ssl_conf_cert_profile()\n *                 for that. For the end-entity certificate however, the key\n *                 will be accepted only if it is allowed both by this list\n *                 and by the cert profile.\n *\n * \\note           This list should be ordered by decreasing preference\n *                 (preferred curve first).\n *\n * \\param conf     SSL configuration\n * \\param curves   Ordered list of allowed curves,\n *                 terminated by MBEDTLS_ECP_DP_NONE.\n */\nvoid mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf,\n                              const mbedtls_ecp_group_id *curves );\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n/**\n * \\brief          Set the allowed hashes for signatures during the handshake.\n *                 (Default: all available hashes except MD5.)\n *\n * \\note           This only affects which hashes are offered and can be used\n *                 for signatures during the handshake. Hashes for message\n *                 authentication and the TLS PRF are controlled by the\n *                 ciphersuite, see \\c mbedtls_ssl_conf_ciphersuites(). Hashes\n *                 used for certificate signature are controlled by the\n *                 verification profile, see \\c mbedtls_ssl_conf_cert_profile().\n *\n * \\note           This list should be ordered by decreasing preference\n *                 (preferred hash first).\n *\n * \\param conf     SSL configuration\n * \\param hashes   Ordered list of allowed signature hashes,\n *                 terminated by \\c MBEDTLS_MD_NONE.\n */\nvoid mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf,\n                                  const int *hashes );\n#endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n/**\n * \\brief          Set the hostname to check against the received server\n *                 certificate. It sets the ServerName TLS extension too,\n *                 if the extension is enabled.\n *                 (client-side only)\n *\n * \\param ssl      SSL context\n * \\param hostname the server hostname\n *\n * \\return         0 if successful or MBEDTLS_ERR_SSL_ALLOC_FAILED\n */\nint mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname );\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n/**\n * \\brief          Set own certificate and key for the current handshake\n *\n * \\note           Same as \\c mbedtls_ssl_conf_own_cert() but for use within\n *                 the SNI callback.\n *\n * \\param ssl      SSL context\n * \\param own_cert own public certificate chain\n * \\param pk_key   own private key\n *\n * \\return         0 on success or MBEDTLS_ERR_SSL_ALLOC_FAILED\n */\nint mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl,\n                                 mbedtls_x509_crt *own_cert,\n                                 mbedtls_pk_context *pk_key );\n\n/**\n * \\brief          Set the data required to verify peer certificate for the\n *                 current handshake\n *\n * \\note           Same as \\c mbedtls_ssl_conf_ca_chain() but for use within\n *                 the SNI callback.\n *\n * \\param ssl      SSL context\n * \\param ca_chain trusted CA chain (meaning all fully trusted top-level CAs)\n * \\param ca_crl   trusted CA CRLs\n */\nvoid mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl,\n                                  mbedtls_x509_crt *ca_chain,\n                                  mbedtls_x509_crl *ca_crl );\n\n/**\n * \\brief          Set authmode for the current handshake.\n *\n * \\note           Same as \\c mbedtls_ssl_conf_authmode() but for use within\n *                 the SNI callback.\n *\n * \\param ssl      SSL context\n * \\param authmode MBEDTLS_SSL_VERIFY_NONE, MBEDTLS_SSL_VERIFY_OPTIONAL or\n *                 MBEDTLS_SSL_VERIFY_REQUIRED\n */\nvoid mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl,\n                                  int authmode );\n\n/**\n * \\brief          Set server side ServerName TLS extension callback\n *                 (optional, server-side only).\n *\n *                 If set, the ServerName callback is called whenever the\n *                 server receives a ServerName TLS extension from the client\n *                 during a handshake. The ServerName callback has the\n *                 following parameters: (void *parameter, mbedtls_ssl_context *ssl,\n *                 const unsigned char *hostname, size_t len). If a suitable\n *                 certificate is found, the callback must set the\n *                 certificate(s) and key(s) to use with \\c\n *                 mbedtls_ssl_set_hs_own_cert() (can be called repeatedly),\n *                 and may optionally adjust the CA and associated CRL with \\c\n *                 mbedtls_ssl_set_hs_ca_chain() as well as the client\n *                 authentication mode with \\c mbedtls_ssl_set_hs_authmode(),\n *                 then must return 0. If no matching name is found, the\n *                 callback must either set a default cert, or\n *                 return non-zero to abort the handshake at this point.\n *\n * \\param conf     SSL configuration\n * \\param f_sni    verification function\n * \\param p_sni    verification parameter\n */\nvoid mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf,\n                  int (*f_sni)(void *, mbedtls_ssl_context *, const unsigned char *,\n                               size_t),\n                  void *p_sni );\n#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n/**\n * \\brief          Set the EC J-PAKE password for current handshake.\n *\n * \\note           An internal copy is made, and destroyed as soon as the\n *                 handshake is completed, or when the SSL context is reset or\n *                 freed.\n *\n * \\note           The SSL context needs to be already set up. The right place\n *                 to call this function is between \\c mbedtls_ssl_setup() or\n *                 \\c mbedtls_ssl_reset() and \\c mbedtls_ssl_handshake().\n *\n * \\param ssl      SSL context\n * \\param pw       EC J-PAKE password (pre-shared secret)\n * \\param pw_len   length of pw in bytes\n *\n * \\return         0 on success, or a negative error code.\n */\nint mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,\n                                         const unsigned char *pw,\n                                         size_t pw_len );\n#endif /*MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_SSL_ALPN)\n/**\n * \\brief          Set the supported Application Layer Protocols.\n *\n * \\param conf     SSL configuration\n * \\param protos   Pointer to a NULL-terminated list of supported protocols,\n *                 in decreasing preference order. The pointer to the list is\n *                 recorded by the library for later reference as required, so\n *                 the lifetime of the table must be atleast as long as the\n *                 lifetime of the SSL configuration structure.\n *\n * \\return         0 on success, or MBEDTLS_ERR_SSL_BAD_INPUT_DATA.\n */\nint mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos );\n\n/**\n * \\brief          Get the name of the negotiated Application Layer Protocol.\n *                 This function should be called after the handshake is\n *                 completed.\n *\n * \\param ssl      SSL context\n *\n * \\return         Protcol name, or NULL if no protocol was negotiated.\n */\nconst char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl );\n#endif /* MBEDTLS_SSL_ALPN */\n\n/**\n * \\brief          Set the maximum supported version sent from the client side\n *                 and/or accepted at the server side\n *                 (Default: MBEDTLS_SSL_MAX_MAJOR_VERSION, MBEDTLS_SSL_MAX_MINOR_VERSION)\n *\n * \\note           This ignores ciphersuites from higher versions.\n *\n * \\note           With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and\n *                 MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2\n *\n * \\param conf     SSL configuration\n * \\param major    Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported)\n * \\param minor    Minor version number (MBEDTLS_SSL_MINOR_VERSION_0,\n *                 MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2,\n *                 MBEDTLS_SSL_MINOR_VERSION_3 supported)\n */\nvoid mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor );\n\n/**\n * \\brief          Set the minimum accepted SSL/TLS protocol version\n *                 (Default: TLS 1.0)\n *\n * \\note           Input outside of the SSL_MAX_XXXXX_VERSION and\n *                 SSL_MIN_XXXXX_VERSION range is ignored.\n *\n * \\note           MBEDTLS_SSL_MINOR_VERSION_0 (SSL v3) should be avoided.\n *\n * \\note           With DTLS, use MBEDTLS_SSL_MINOR_VERSION_2 for DTLS 1.0 and\n *                 MBEDTLS_SSL_MINOR_VERSION_3 for DTLS 1.2\n *\n * \\param conf     SSL configuration\n * \\param major    Major version number (only MBEDTLS_SSL_MAJOR_VERSION_3 supported)\n * \\param minor    Minor version number (MBEDTLS_SSL_MINOR_VERSION_0,\n *                 MBEDTLS_SSL_MINOR_VERSION_1 and MBEDTLS_SSL_MINOR_VERSION_2,\n *                 MBEDTLS_SSL_MINOR_VERSION_3 supported)\n */\nvoid mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor );\n\n#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C)\n/**\n * \\brief          Set the fallback flag (client-side only).\n *                 (Default: MBEDTLS_SSL_IS_NOT_FALLBACK).\n *\n * \\note           Set to MBEDTLS_SSL_IS_FALLBACK when preparing a fallback\n *                 connection, that is a connection with max_version set to a\n *                 lower value than the value you're willing to use. Such\n *                 fallback connections are not recommended but are sometimes\n *                 necessary to interoperate with buggy (version-intolerant)\n *                 servers.\n *\n * \\warning        You should NOT set this to MBEDTLS_SSL_IS_FALLBACK for\n *                 non-fallback connections! This would appear to work for a\n *                 while, then cause failures when the server is upgraded to\n *                 support a newer TLS version.\n *\n * \\param conf     SSL configuration\n * \\param fallback MBEDTLS_SSL_IS_NOT_FALLBACK or MBEDTLS_SSL_IS_FALLBACK\n */\nvoid mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback );\n#endif /* MBEDTLS_SSL_FALLBACK_SCSV && MBEDTLS_SSL_CLI_C */\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n/**\n * \\brief           Enable or disable Encrypt-then-MAC\n *                  (Default: MBEDTLS_SSL_ETM_ENABLED)\n *\n * \\note            This should always be enabled, it is a security\n *                  improvement, and should not cause any interoperability\n *                  issue (used only if the peer supports it too).\n *\n * \\param conf      SSL configuration\n * \\param etm       MBEDTLS_SSL_ETM_ENABLED or MBEDTLS_SSL_ETM_DISABLED\n */\nvoid mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm );\n#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n/**\n * \\brief           Enable or disable Extended Master Secret negotiation.\n *                  (Default: MBEDTLS_SSL_EXTENDED_MS_ENABLED)\n *\n * \\note            This should always be enabled, it is a security fix to the\n *                  protocol, and should not cause any interoperability issue\n *                  (used only if the peer supports it too).\n *\n * \\param conf      SSL configuration\n * \\param ems       MBEDTLS_SSL_EXTENDED_MS_ENABLED or MBEDTLS_SSL_EXTENDED_MS_DISABLED\n */\nvoid mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems );\n#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */\n\n#if defined(MBEDTLS_ARC4_C)\n/**\n * \\brief          Disable or enable support for RC4\n *                 (Default: MBEDTLS_SSL_ARC4_DISABLED)\n *\n * \\warning        Use of RC4 in DTLS/TLS has been prohibited by RFC 7465\n *                 for security reasons. Use at your own risk.\n *\n * \\note           This function is deprecated and will likely be removed in\n *                 a future version of the library.\n *                 RC4 is disabled by default at compile time and needs to be\n *                 actively enabled for use with legacy systems.\n *\n * \\param conf     SSL configuration\n * \\param arc4     MBEDTLS_SSL_ARC4_ENABLED or MBEDTLS_SSL_ARC4_DISABLED\n */\nvoid mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 );\n#endif /* MBEDTLS_ARC4_C */\n\n#if defined(MBEDTLS_SSL_SRV_C)\n/**\n * \\brief          Whether to send a list of acceptable CAs in\n *                 CertificateRequest messages.\n *                 (Default: do send)\n *\n * \\param conf     SSL configuration\n * \\param cert_req_ca_list   MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED or\n *                          MBEDTLS_SSL_CERT_REQ_CA_LIST_DISABLED\n */\nvoid mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf,\n                                          char cert_req_ca_list );\n#endif /* MBEDTLS_SSL_SRV_C */\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n/**\n * \\brief          Set the maximum fragment length to emit and/or negotiate\n *                 (Default: MBEDTLS_SSL_MAX_CONTENT_LEN, usually 2^14 bytes)\n *                 (Server: set maximum fragment length to emit,\n *                 usually negotiated by the client during handshake\n *                 (Client: set maximum fragment length to emit *and*\n *                 negotiate with the server during handshake)\n *\n * \\param conf     SSL configuration\n * \\param mfl_code Code for maximum fragment length (allowed values:\n *                 MBEDTLS_SSL_MAX_FRAG_LEN_512,  MBEDTLS_SSL_MAX_FRAG_LEN_1024,\n *                 MBEDTLS_SSL_MAX_FRAG_LEN_2048, MBEDTLS_SSL_MAX_FRAG_LEN_4096)\n *\n * \\return         0 if successful or MBEDTLS_ERR_SSL_BAD_INPUT_DATA\n */\nint mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code );\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n/**\n * \\brief          Activate negotiation of truncated HMAC\n *                 (Default: MBEDTLS_SSL_TRUNC_HMAC_DISABLED)\n *\n * \\param conf     SSL configuration\n * \\param truncate Enable or disable (MBEDTLS_SSL_TRUNC_HMAC_ENABLED or\n *                                    MBEDTLS_SSL_TRUNC_HMAC_DISABLED)\n */\nvoid mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate );\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\n/**\n * \\brief          Enable / Disable 1/n-1 record splitting\n *                 (Default: MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED)\n *\n * \\note           Only affects SSLv3 and TLS 1.0, not higher versions.\n *                 Does not affect non-CBC ciphersuites in any version.\n *\n * \\param conf     SSL configuration\n * \\param split    MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED or\n *                 MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED\n */\nvoid mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split );\n#endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)\n/**\n * \\brief          Enable / Disable session tickets (client only).\n *                 (Default: MBEDTLS_SSL_SESSION_TICKETS_ENABLED.)\n *\n * \\note           On server, use \\c mbedtls_ssl_conf_session_tickets_cb().\n *\n * \\param conf     SSL configuration\n * \\param use_tickets   Enable or disable (MBEDTLS_SSL_SESSION_TICKETS_ENABLED or\n *                                         MBEDTLS_SSL_SESSION_TICKETS_DISABLED)\n */\nvoid mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets );\n#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n/**\n * \\brief          Enable / Disable renegotiation support for connection when\n *                 initiated by peer\n *                 (Default: MBEDTLS_SSL_RENEGOTIATION_DISABLED)\n *\n * \\warning        It is recommended to always disable renegotation unless you\n *                 know you need it and you know what you're doing. In the\n *                 past, there have been several issues associated with\n *                 renegotiation or a poor understanding of its properties.\n *\n * \\note           Server-side, enabling renegotiation also makes the server\n *                 susceptible to a resource DoS by a malicious client.\n *\n * \\param conf    SSL configuration\n * \\param renegotiation     Enable or disable (MBEDTLS_SSL_RENEGOTIATION_ENABLED or\n *                                             MBEDTLS_SSL_RENEGOTIATION_DISABLED)\n */\nvoid mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation );\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n/**\n * \\brief          Prevent or allow legacy renegotiation.\n *                 (Default: MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION)\n *\n *                 MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION allows connections to\n *                 be established even if the peer does not support\n *                 secure renegotiation, but does not allow renegotiation\n *                 to take place if not secure.\n *                 (Interoperable and secure option)\n *\n *                 MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION allows renegotiations\n *                 with non-upgraded peers. Allowing legacy renegotiation\n *                 makes the connection vulnerable to specific man in the\n *                 middle attacks. (See RFC 5746)\n *                 (Most interoperable and least secure option)\n *\n *                 MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE breaks off connections\n *                 if peer does not support secure renegotiation. Results\n *                 in interoperability issues with non-upgraded peers\n *                 that do not support renegotiation altogether.\n *                 (Most secure option, interoperability issues)\n *\n * \\param conf     SSL configuration\n * \\param allow_legacy  Prevent or allow (SSL_NO_LEGACY_RENEGOTIATION,\n *                                        SSL_ALLOW_LEGACY_RENEGOTIATION or\n *                                        MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE)\n */\nvoid mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy );\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n/**\n * \\brief          Enforce renegotiation requests.\n *                 (Default: enforced, max_records = 16)\n *\n *                 When we request a renegotiation, the peer can comply or\n *                 ignore the request. This function allows us to decide\n *                 whether to enforce our renegotiation requests by closing\n *                 the connection if the peer doesn't comply.\n *\n *                 However, records could already be in transit from the peer\n *                 when the request is emitted. In order to increase\n *                 reliability, we can accept a number of records before the\n *                 expected handshake records.\n *\n *                 The optimal value is highly dependent on the specific usage\n *                 scenario.\n *\n * \\note           With DTLS and server-initiated renegotiation, the\n *                 HelloRequest is retransmited every time mbedtls_ssl_read() times\n *                 out or receives Application Data, until:\n *                 - max_records records have beens seen, if it is >= 0, or\n *                 - the number of retransmits that would happen during an\n *                 actual handshake has been reached.\n *                 Please remember the request might be lost a few times\n *                 if you consider setting max_records to a really low value.\n *\n * \\warning        On client, the grace period can only happen during\n *                 mbedtls_ssl_read(), as opposed to mbedtls_ssl_write() and mbedtls_ssl_renegotiate()\n *                 which always behave as if max_record was 0. The reason is,\n *                 if we receive application data from the server, we need a\n *                 place to write it, which only happens during mbedtls_ssl_read().\n *\n * \\param conf     SSL configuration\n * \\param max_records Use MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED if you don't want to\n *                 enforce renegotiation, or a non-negative value to enforce\n *                 it but allow for a grace period of max_records records.\n */\nvoid mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records );\n\n/**\n * \\brief          Set record counter threshold for periodic renegotiation.\n *                 (Default: 2^48 - 1)\n *\n *                 Renegotiation is automatically triggered when a record\n *                 counter (outgoing or ingoing) crosses the defined\n *                 threshold. The default value is meant to prevent the\n *                 connection from being closed when the counter is about to\n *                 reached its maximal value (it is not allowed to wrap).\n *\n *                 Lower values can be used to enforce policies such as \"keys\n *                 must be refreshed every N packets with cipher X\".\n *\n *                 The renegotiation period can be disabled by setting\n *                 conf->disable_renegotiation to\n *                 MBEDTLS_SSL_RENEGOTIATION_DISABLED.\n *\n * \\note           When the configured transport is\n *                 MBEDTLS_SSL_TRANSPORT_DATAGRAM the maximum renegotiation\n *                 period is 2^48 - 1, and for MBEDTLS_SSL_TRANSPORT_STREAM,\n *                 the maximum renegotiation period is 2^64 - 1.\n *\n * \\param conf     SSL configuration\n * \\param period   The threshold value: a big-endian 64-bit number.\n */\nvoid mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,\n                                   const unsigned char period[8] );\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n/**\n * \\brief          Return the number of data bytes available to read\n *\n * \\param ssl      SSL context\n *\n * \\return         how many bytes are available in the read buffer\n */\nsize_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl );\n\n/**\n * \\brief          Return the result of the certificate verification\n *\n * \\param ssl      SSL context\n *\n * \\return         0 if successful,\n *                 -1 if result is not available (eg because the handshake was\n *                 aborted too early), or\n *                 a combination of BADCERT_xxx and BADCRL_xxx flags, see\n *                 x509.h\n */\nuint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl );\n\n/**\n * \\brief          Return the name of the current ciphersuite\n *\n * \\param ssl      SSL context\n *\n * \\return         a string containing the ciphersuite name\n */\nconst char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl );\n\n/**\n * \\brief          Return the current SSL version (SSLv3/TLSv1/etc)\n *\n * \\param ssl      SSL context\n *\n * \\return         a string containing the SSL version\n */\nconst char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl );\n\n/**\n * \\brief          Return the (maximum) number of bytes added by the record\n *                 layer: header + encryption/MAC overhead (inc. padding)\n *\n * \\param ssl      SSL context\n *\n * \\return         Current maximum record expansion in bytes, or\n *                 MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE if compression is\n *                 enabled, which makes expansion much less predictable\n */\nint mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl );\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n/**\n * \\brief          Return the maximum fragment length (payload, in bytes).\n *                 This is the value negotiated with peer if any,\n *                 or the locally configured value.\n *\n * \\note           With DTLS, \\c mbedtls_ssl_write() will return an error if\n *                 called with a larger length value.\n *                 With TLS, \\c mbedtls_ssl_write() will fragment the input if\n *                 necessary and return the number of bytes written; it is up\n *                 to the caller to call \\c mbedtls_ssl_write() again in\n *                 order to send the remaining bytes if any.\n *\n * \\param ssl      SSL context\n *\n * \\return         Current maximum fragment length.\n */\nsize_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl );\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n/**\n * \\brief          Return the peer certificate from the current connection\n *\n *                 Note: Can be NULL in case no certificate was sent during\n *                 the handshake. Different calls for the same connection can\n *                 return the same or different pointers for the same\n *                 certificate and even a different certificate altogether.\n *                 The peer cert CAN change in a single connection if\n *                 renegotiation is performed.\n *\n * \\param ssl      SSL context\n *\n * \\return         the current peer certificate\n */\nconst mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl );\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_SSL_CLI_C)\n/**\n * \\brief          Save session in order to resume it later (client-side only)\n *                 Session data is copied to presented session structure.\n *\n * \\warning        Currently, peer certificate is lost in the operation.\n *\n * \\param ssl      SSL context\n * \\param session  session context\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_SSL_ALLOC_FAILED if memory allocation failed,\n *                 MBEDTLS_ERR_SSL_BAD_INPUT_DATA if used server-side or\n *                 arguments are otherwise invalid\n *\n * \\sa             mbedtls_ssl_set_session()\n */\nint mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *session );\n#endif /* MBEDTLS_SSL_CLI_C */\n\n/**\n * \\brief          Perform the SSL handshake\n *\n * \\param ssl      SSL context\n *\n * \\return         0 if successful, or\n *                 MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, or\n *                 MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED (see below), or\n *                 a specific SSL error code.\n *\n * \\note           If this function returns something other than 0 or\n *                 MBEDTLS_ERR_SSL_WANT_READ/WRITE, then the ssl context\n *                 becomes unusable, and you should either free it or call\n *                 \\c mbedtls_ssl_session_reset() on it before re-using it for\n *                 a new connection; the current connection must be closed.\n *\n * \\note           If DTLS is in use, then you may choose to handle\n *                 MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED specially for logging\n *                 purposes, as it is an expected return value rather than an\n *                 actual error, but you still need to reset/free the context.\n */\nint mbedtls_ssl_handshake( mbedtls_ssl_context *ssl );\n\n/**\n * \\brief          Perform a single step of the SSL handshake\n *\n * \\note           The state of the context (ssl->state) will be at\n *                 the next state after execution of this function. Do not\n *                 call this function if state is MBEDTLS_SSL_HANDSHAKE_OVER.\n *\n * \\note           If this function returns something other than 0 or\n *                 MBEDTLS_ERR_SSL_WANT_READ/WRITE, then the ssl context\n *                 becomes unusable, and you should either free it or call\n *                 \\c mbedtls_ssl_session_reset() on it before re-using it for\n *                 a new connection; the current connection must be closed.\n *\n * \\param ssl      SSL context\n *\n * \\return         0 if successful, or\n *                 MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, or\n *                 a specific SSL error code.\n */\nint mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl );\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n/**\n * \\brief          Initiate an SSL renegotiation on the running connection.\n *                 Client: perform the renegotiation right now.\n *                 Server: request renegotiation, which will be performed\n *                 during the next call to mbedtls_ssl_read() if honored by\n *                 client.\n *\n * \\param ssl      SSL context\n *\n * \\return         0 if successful, or any mbedtls_ssl_handshake() return\n *                 value.\n *\n * \\note           If this function returns something other than 0 or\n *                 MBEDTLS_ERR_SSL_WANT_READ/WRITE, then the ssl context\n *                 becomes unusable, and you should either free it or call\n *                 \\c mbedtls_ssl_session_reset() on it before re-using it for\n *                 a new connection; the current connection must be closed.\n */\nint mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl );\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n/**\n * \\brief          Read at most 'len' application data bytes\n *\n * \\param ssl      SSL context\n * \\param buf      buffer that will hold the data\n * \\param len      maximum number of bytes to read\n *\n * \\return         the number of bytes read, or\n *                 0 for EOF, or\n *                 MBEDTLS_ERR_SSL_WANT_READ or MBEDTLS_ERR_SSL_WANT_WRITE, or\n *                 MBEDTLS_ERR_SSL_CLIENT_RECONNECT (see below), or\n *                 another negative error code.\n *\n * \\note           If this function returns something other than a positive\n *                 value or MBEDTLS_ERR_SSL_WANT_READ/WRITE or\n *                 MBEDTLS_ERR_SSL_CLIENT_RECONNECT, then the ssl context\n *                 becomes unusable, and you should either free it or call\n *                 \\c mbedtls_ssl_session_reset() on it before re-using it for\n *                 a new connection; the current connection must be closed.\n *\n * \\note           When this function return MBEDTLS_ERR_SSL_CLIENT_RECONNECT\n *                 (which can only happen server-side), it means that a client\n *                 is initiating a new connection using the same source port.\n *                 You can either treat that as a connection close and wait\n *                 for the client to resend a ClientHello, or directly\n *                 continue with \\c mbedtls_ssl_handshake() with the same\n *                 context (as it has beeen reset internally). Either way, you\n *                 should make sure this is seen by the application as a new\n *                 connection: application state, if any, should be reset, and\n *                 most importantly the identity of the client must be checked\n *                 again. WARNING: not validating the identity of the client\n *                 again, or not transmitting the new identity to the\n *                 application layer, would allow authentication bypass!\n */\nint mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len );\n\n/**\n * \\brief          Try to write exactly 'len' application data bytes\n *\n * \\warning        This function will do partial writes in some cases. If the\n *                 return value is non-negative but less than length, the\n *                 function must be called again with updated arguments:\n *                 buf + ret, len - ret (if ret is the return value) until\n *                 it returns a value equal to the last 'len' argument.\n *\n * \\param ssl      SSL context\n * \\param buf      buffer holding the data\n * \\param len      how many bytes must be written\n *\n * \\return         the number of bytes actually written (may be less than len),\n *                 or MBEDTLS_ERR_SSL_WANT_WRITE or MBEDTLS_ERR_SSL_WANT_READ,\n *                 or another negative error code.\n *\n * \\note           If this function returns something other than a positive\n *                 value or MBEDTLS_ERR_SSL_WANT_READ/WRITE, the ssl context\n *                 becomes unusable, and you should either free it or call\n *                 \\c mbedtls_ssl_session_reset() on it before re-using it for\n *                 a new connection; the current connection must be closed.\n *\n * \\note           When this function returns MBEDTLS_ERR_SSL_WANT_WRITE/READ,\n *                 it must be called later with the *same* arguments,\n *                 until it returns a positive value.\n *\n * \\note           If the requested length is greater than the maximum\n *                 fragment length (either the built-in limit or the one set\n *                 or negotiated with the peer), then:\n *                 - with TLS, less bytes than requested are written.\n *                 - with DTLS, MBEDTLS_ERR_SSL_BAD_INPUT_DATA is returned.\n *                 \\c mbedtls_ssl_get_max_frag_len() may be used to query the\n *                 active maximum fragment length.\n */\nint mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len );\n\n/**\n * \\brief           Send an alert message\n *\n * \\param ssl       SSL context\n * \\param level     The alert level of the message\n *                  (MBEDTLS_SSL_ALERT_LEVEL_WARNING or MBEDTLS_SSL_ALERT_LEVEL_FATAL)\n * \\param message   The alert message (SSL_ALERT_MSG_*)\n *\n * \\return          0 if successful, or a specific SSL error code.\n *\n * \\note           If this function returns something other than 0 or\n *                 MBEDTLS_ERR_SSL_WANT_READ/WRITE, then the ssl context\n *                 becomes unusable, and you should either free it or call\n *                 \\c mbedtls_ssl_session_reset() on it before re-using it for\n *                 a new connection; the current connection must be closed.\n */\nint mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl,\n                            unsigned char level,\n                            unsigned char message );\n/**\n * \\brief          Notify the peer that the connection is being closed\n *\n * \\param ssl      SSL context\n *\n * \\return          0 if successful, or a specific SSL error code.\n *\n * \\note           If this function returns something other than 0 or\n *                 MBEDTLS_ERR_SSL_WANT_READ/WRITE, then the ssl context\n *                 becomes unusable, and you should either free it or call\n *                 \\c mbedtls_ssl_session_reset() on it before re-using it for\n *                 a new connection; the current connection must be closed.\n */\nint mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl );\n\n/**\n * \\brief          Free referenced items in an SSL context and clear memory\n *\n * \\param ssl      SSL context\n */\nvoid mbedtls_ssl_free( mbedtls_ssl_context *ssl );\n\n/**\n * \\brief          Initialize an SSL configuration context\n *                 Just makes the context ready for\n *                 mbedtls_ssl_config_defaults() or mbedtls_ssl_config_free().\n *\n * \\note           You need to call mbedtls_ssl_config_defaults() unless you\n *                 manually set all of the relevent fields yourself.\n *\n * \\param conf     SSL configuration context\n */\nvoid mbedtls_ssl_config_init( mbedtls_ssl_config *conf );\n\n/**\n * \\brief          Load reasonnable default SSL configuration values.\n *                 (You need to call mbedtls_ssl_config_init() first.)\n *\n * \\param conf     SSL configuration context\n * \\param endpoint MBEDTLS_SSL_IS_CLIENT or MBEDTLS_SSL_IS_SERVER\n * \\param transport MBEDTLS_SSL_TRANSPORT_STREAM for TLS, or\n *                  MBEDTLS_SSL_TRANSPORT_DATAGRAM for DTLS\n * \\param preset   a MBEDTLS_SSL_PRESET_XXX value\n *\n * \\note           See \\c mbedtls_ssl_conf_transport() for notes on DTLS.\n *\n * \\return         0 if successful, or\n *                 MBEDTLS_ERR_XXX_ALLOC_FAILED on memory allocation error.\n */\nint mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,\n                                 int endpoint, int transport, int preset );\n\n/**\n * \\brief          Free an SSL configuration context\n *\n * \\param conf     SSL configuration context\n */\nvoid mbedtls_ssl_config_free( mbedtls_ssl_config *conf );\n\n/**\n * \\brief          Initialize SSL session structure\n *\n * \\param session  SSL session\n */\nvoid mbedtls_ssl_session_init( mbedtls_ssl_session *session );\n\n/**\n * \\brief          Free referenced items in an SSL session including the\n *                 peer certificate and clear memory\n *\n * \\param session  SSL session\n */\nvoid mbedtls_ssl_session_free( mbedtls_ssl_session *session );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ssl.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ssl_cache.h",
    "content": "/**\n * \\file ssl_cache.h\n *\n * \\brief SSL session cache implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_SSL_CACHE_H\n#define MBEDTLS_SSL_CACHE_H\n\n#include \"ssl.h\"\n\n#if defined(MBEDTLS_THREADING_C)\n#include \"threading.h\"\n#endif\n\n/**\n * \\name SECTION: Module settings\n *\n * The configuration options you can set for this module are in this section.\n * Either change them in config.h or define them on the compiler command line.\n * \\{\n */\n\n#if !defined(MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT)\n#define MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT       86400   /*!< 1 day  */\n#endif\n\n#if !defined(MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES)\n#define MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES      50   /*!< Maximum entries in cache */\n#endif\n\n/* \\} name SECTION: Module settings */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct mbedtls_ssl_cache_context mbedtls_ssl_cache_context;\ntypedef struct mbedtls_ssl_cache_entry mbedtls_ssl_cache_entry;\n\n/**\n * \\brief   This structure is used for storing cache entries\n */\nstruct mbedtls_ssl_cache_entry\n{\n#if defined(MBEDTLS_HAVE_TIME)\n    mbedtls_time_t timestamp;           /*!< entry timestamp    */\n#endif\n    mbedtls_ssl_session session;        /*!< entry session      */\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_buf peer_cert;         /*!< entry peer_cert    */\n#endif\n    mbedtls_ssl_cache_entry *next;      /*!< chain pointer      */\n};\n\n/**\n * \\brief Cache context\n */\nstruct mbedtls_ssl_cache_context\n{\n    mbedtls_ssl_cache_entry *chain;     /*!< start of the chain     */\n    int timeout;                /*!< cache entry timeout    */\n    int max_entries;            /*!< maximum entries        */\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_threading_mutex_t mutex;    /*!< mutex                  */\n#endif\n};\n\n/**\n * \\brief          Initialize an SSL cache context\n *\n * \\param cache    SSL cache context\n */\nvoid mbedtls_ssl_cache_init( mbedtls_ssl_cache_context *cache );\n\n/**\n * \\brief          Cache get callback implementation\n *                 (Thread-safe if MBEDTLS_THREADING_C is enabled)\n *\n * \\param data     SSL cache context\n * \\param session  session to retrieve entry for\n */\nint mbedtls_ssl_cache_get( void *data, mbedtls_ssl_session *session );\n\n/**\n * \\brief          Cache set callback implementation\n *                 (Thread-safe if MBEDTLS_THREADING_C is enabled)\n *\n * \\param data     SSL cache context\n * \\param session  session to store entry for\n */\nint mbedtls_ssl_cache_set( void *data, const mbedtls_ssl_session *session );\n\n#if defined(MBEDTLS_HAVE_TIME)\n/**\n * \\brief          Set the cache timeout\n *                 (Default: MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT (1 day))\n *\n *                 A timeout of 0 indicates no timeout.\n *\n * \\param cache    SSL cache context\n * \\param timeout  cache entry timeout in seconds\n */\nvoid mbedtls_ssl_cache_set_timeout( mbedtls_ssl_cache_context *cache, int timeout );\n#endif /* MBEDTLS_HAVE_TIME */\n\n/**\n * \\brief          Set the maximum number of cache entries\n *                 (Default: MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES (50))\n *\n * \\param cache    SSL cache context\n * \\param max      cache entry maximum\n */\nvoid mbedtls_ssl_cache_set_max_entries( mbedtls_ssl_cache_context *cache, int max );\n\n/**\n * \\brief          Free referenced items in a cache context and clear memory\n *\n * \\param cache    SSL cache context\n */\nvoid mbedtls_ssl_cache_free( mbedtls_ssl_cache_context *cache );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ssl_cache.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ssl_ciphersuites.h",
    "content": "/**\n * \\file ssl_ciphersuites.h\n *\n * \\brief SSL Ciphersuites for mbed TLS\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_SSL_CIPHERSUITES_H\n#define MBEDTLS_SSL_CIPHERSUITES_H\n\n#include \"pk.h\"\n#include \"cipher.h\"\n#include \"md.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * Supported ciphersuites (Official IANA names)\n */\n#define MBEDTLS_TLS_RSA_WITH_NULL_MD5                    0x01   /**< Weak! */\n#define MBEDTLS_TLS_RSA_WITH_NULL_SHA                    0x02   /**< Weak! */\n\n#define MBEDTLS_TLS_RSA_WITH_RC4_128_MD5                 0x04\n#define MBEDTLS_TLS_RSA_WITH_RC4_128_SHA                 0x05\n#define MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA                 0x09   /**< Weak! Not in TLS 1.2 */\n\n#define MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA            0x0A\n\n#define MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA             0x15   /**< Weak! Not in TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA        0x16\n\n#define MBEDTLS_TLS_PSK_WITH_NULL_SHA                    0x2C   /**< Weak! */\n#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA                0x2D   /**< Weak! */\n#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA                0x2E   /**< Weak! */\n#define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA             0x2F\n\n#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA         0x33\n#define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA             0x35\n#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA         0x39\n\n#define MBEDTLS_TLS_RSA_WITH_NULL_SHA256                 0x3B   /**< Weak! */\n#define MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256          0x3C   /**< TLS 1.2 */\n#define MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256          0x3D   /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA        0x41\n#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA    0x45\n\n#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256      0x67   /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256      0x6B   /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA        0x84\n#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA    0x88\n\n#define MBEDTLS_TLS_PSK_WITH_RC4_128_SHA                 0x8A\n#define MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA            0x8B\n#define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA             0x8C\n#define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA             0x8D\n\n#define MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA             0x8E\n#define MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA        0x8F\n#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA         0x90\n#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA         0x91\n\n#define MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA             0x92\n#define MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA        0x93\n#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA         0x94\n#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA         0x95\n\n#define MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256          0x9C   /**< TLS 1.2 */\n#define MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384          0x9D   /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256      0x9E   /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384      0x9F   /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256          0xA8   /**< TLS 1.2 */\n#define MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384          0xA9   /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256      0xAA   /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384      0xAB   /**< TLS 1.2 */\n#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256      0xAC   /**< TLS 1.2 */\n#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384      0xAD   /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256          0xAE\n#define MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384          0xAF\n#define MBEDTLS_TLS_PSK_WITH_NULL_SHA256                 0xB0   /**< Weak! */\n#define MBEDTLS_TLS_PSK_WITH_NULL_SHA384                 0xB1   /**< Weak! */\n\n#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256      0xB2\n#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384      0xB3\n#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256             0xB4   /**< Weak! */\n#define MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384             0xB5   /**< Weak! */\n\n#define MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256      0xB6\n#define MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384      0xB7\n#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256             0xB8   /**< Weak! */\n#define MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384             0xB9   /**< Weak! */\n\n#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256     0xBA   /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 0xBE   /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256     0xC0   /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 0xC4   /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA             0xC001 /**< Weak! */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA          0xC002 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA     0xC003 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA      0xC004 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA      0xC005 /**< Not in SSL3! */\n\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA            0xC006 /**< Weak! */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA         0xC007 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA    0xC008 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA     0xC009 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA     0xC00A /**< Not in SSL3! */\n\n#define MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA               0xC00B /**< Weak! */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA            0xC00C /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA       0xC00D /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA        0xC00E /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA        0xC00F /**< Not in SSL3! */\n\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA              0xC010 /**< Weak! */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA           0xC011 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA      0xC012 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA       0xC013 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA       0xC014 /**< Not in SSL3! */\n\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256  0xC023 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384  0xC024 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256   0xC025 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384   0xC026 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256    0xC027 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384    0xC028 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256     0xC029 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384     0xC02A /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256  0xC02B /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384  0xC02C /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256   0xC02D /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384   0xC02E /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256    0xC02F /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384    0xC030 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256     0xC031 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384     0xC032 /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA           0xC033 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA      0xC034 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA       0xC035 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA       0xC036 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256    0xC037 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384    0xC038 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA              0xC039 /**< Weak! No SSL3! */\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256           0xC03A /**< Weak! No SSL3! */\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384           0xC03B /**< Weak! No SSL3! */\n\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 0xC072 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 0xC073 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256  0xC074 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384  0xC075 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256   0xC076 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384   0xC077 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256    0xC078 /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384    0xC079 /**< Not in SSL3! */\n\n#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256         0xC07A /**< TLS 1.2 */\n#define MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384         0xC07B /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256     0xC07C /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384     0xC07D /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 0xC086 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 0xC087 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256  0xC088 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384  0xC089 /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256   0xC08A /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384   0xC08B /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256    0xC08C /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384    0xC08D /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256       0xC08E /**< TLS 1.2 */\n#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384       0xC08F /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256   0xC090 /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384   0xC091 /**< TLS 1.2 */\n#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256   0xC092 /**< TLS 1.2 */\n#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384   0xC093 /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256       0xC094\n#define MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384       0xC095\n#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256   0xC096\n#define MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384   0xC097\n#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256   0xC098\n#define MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384   0xC099\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 0xC09A /**< Not in SSL3! */\n#define MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 0xC09B /**< Not in SSL3! */\n\n#define MBEDTLS_TLS_RSA_WITH_AES_128_CCM                0xC09C  /**< TLS 1.2 */\n#define MBEDTLS_TLS_RSA_WITH_AES_256_CCM                0xC09D  /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM            0xC09E  /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM            0xC09F  /**< TLS 1.2 */\n#define MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8              0xC0A0  /**< TLS 1.2 */\n#define MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8              0xC0A1  /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8          0xC0A2  /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8          0xC0A3  /**< TLS 1.2 */\n#define MBEDTLS_TLS_PSK_WITH_AES_128_CCM                0xC0A4  /**< TLS 1.2 */\n#define MBEDTLS_TLS_PSK_WITH_AES_256_CCM                0xC0A5  /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM            0xC0A6  /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM            0xC0A7  /**< TLS 1.2 */\n#define MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8              0xC0A8  /**< TLS 1.2 */\n#define MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8              0xC0A9  /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8          0xC0AA  /**< TLS 1.2 */\n#define MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8          0xC0AB  /**< TLS 1.2 */\n/* The last two are named with PSK_DHE in the RFC, which looks like a typo */\n\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM        0xC0AC  /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM        0xC0AD  /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8      0xC0AE  /**< TLS 1.2 */\n#define MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8      0xC0AF  /**< TLS 1.2 */\n\n#define MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8          0xC0FF  /**< experimental */\n\n/* Reminder: update mbedtls_ssl_premaster_secret when adding a new key exchange.\n * Reminder: update MBEDTLS_KEY_EXCHANGE__xxx below\n */\ntypedef enum {\n    MBEDTLS_KEY_EXCHANGE_NONE = 0,\n    MBEDTLS_KEY_EXCHANGE_RSA,\n    MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n    MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n    MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n    MBEDTLS_KEY_EXCHANGE_PSK,\n    MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n    MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n    MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n    MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n    MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n    MBEDTLS_KEY_EXCHANGE_ECJPAKE,\n} mbedtls_key_exchange_type_t;\n\n/* Key exchanges using a certificate */\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)           || \\\n    defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)       || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)     || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)   || \\\n    defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)       || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)      || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\n#define MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED\n#endif\n\n/* Key exchanges allowing client certificate requests */\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)           ||       \\\n    defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)       ||       \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)      ||       \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)     ||       \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)    ||       \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) \n#define MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED\n#endif\n\n/* Key exchanges involving server signature in ServerKeyExchange */\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)       || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)     || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)\n#define MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED\n#endif\n\n/* Key exchanges using ECDH */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)      || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\n#define MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED\n#endif\n\n/* Key exchanges that don't involve ephemeral keys */\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)           || \\\n    defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)           || \\\n    defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)       || \\\n    defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED)\n#define MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED\n#endif\n\n/* Key exchanges that involve ephemeral keys */\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)       || \\\n    defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)       || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)     || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)     || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)   || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n#define MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED\n#endif\n\n/* Key exchanges using a PSK */\n#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)           || \\\n    defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)       || \\\n    defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)       || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\n#define MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED\n#endif\n\n/* Key exchanges using DHE */\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)       || \\\n    defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\n#define MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED\n#endif\n\n/* Key exchanges using ECDHE */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)     || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)   || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\n#define MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED\n#endif\n\ntypedef struct mbedtls_ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t;\n\n#define MBEDTLS_CIPHERSUITE_WEAK       0x01    /**< Weak ciphersuite flag  */\n#define MBEDTLS_CIPHERSUITE_SHORT_TAG  0x02    /**< Short authentication tag,\n                                                     eg for CCM_8 */\n#define MBEDTLS_CIPHERSUITE_NODTLS     0x04    /**< Can't be used with DTLS */\n\n/**\n * \\brief   This structure is used for storing ciphersuite information\n */\nstruct mbedtls_ssl_ciphersuite_t\n{\n    int id;\n    const char * name;\n\n    mbedtls_cipher_type_t cipher;\n    mbedtls_md_type_t mac;\n    mbedtls_key_exchange_type_t key_exchange;\n\n    int min_major_ver;\n    int min_minor_ver;\n    int max_major_ver;\n    int max_minor_ver;\n\n    unsigned char flags;\n};\n\nconst int *mbedtls_ssl_list_ciphersuites( void );\n\nconst mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string( const char *ciphersuite_name );\nconst mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id( int ciphersuite_id );\n\n#if defined(MBEDTLS_PK_C)\nmbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg( const mbedtls_ssl_ciphersuite_t *info );\nmbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_alg( const mbedtls_ssl_ciphersuite_t *info );\n#endif\n\nint mbedtls_ssl_ciphersuite_uses_ec( const mbedtls_ssl_ciphersuite_t *info );\nint mbedtls_ssl_ciphersuite_uses_psk( const mbedtls_ssl_ciphersuite_t *info );\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED)\nstatic inline int mbedtls_ssl_ciphersuite_has_pfs( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_DHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_DHE_PSK:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:\n        case MBEDTLS_KEY_EXCHANGE_ECJPAKE:\n            return( 1 );\n\n        default:\n            return( 0 );\n    }\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED)\nstatic inline int mbedtls_ssl_ciphersuite_no_pfs( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:\n        case MBEDTLS_KEY_EXCHANGE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_PSK:\n        case MBEDTLS_KEY_EXCHANGE_RSA_PSK:\n            return( 1 );\n\n        default:\n            return( 0 );\n    }\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED)\nstatic inline int mbedtls_ssl_ciphersuite_uses_ecdh( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:\n            return( 1 );\n\n        default:\n            return( 0 );\n    }\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED */\n\nstatic inline int mbedtls_ssl_ciphersuite_cert_req_allowed( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_DHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:\n            return( 1 );\n\n        default:\n            return( 0 );\n    }\n}\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED)\nstatic inline int mbedtls_ssl_ciphersuite_uses_dhe( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_DHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_DHE_PSK:\n            return( 1 );\n\n        default:\n            return( 0 );\n    }\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED) */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED)\nstatic inline int mbedtls_ssl_ciphersuite_uses_ecdhe( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:\n            return( 1 );\n\n        default:\n            return( 0 );\n    }\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED) */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)\nstatic inline int mbedtls_ssl_ciphersuite_uses_server_signature( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_DHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:\n            return( 1 );\n\n        default:\n            return( 0 );\n    }\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ssl_ciphersuites.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ssl_cookie.h",
    "content": "/**\n * \\file ssl_cookie.h\n *\n * \\brief DTLS cookie callbacks implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_SSL_COOKIE_H\n#define MBEDTLS_SSL_COOKIE_H\n\n#include \"ssl.h\"\n\n#if defined(MBEDTLS_THREADING_C)\n#include \"threading.h\"\n#endif\n\n/**\n * \\name SECTION: Module settings\n *\n * The configuration options you can set for this module are in this section.\n * Either change them in config.h or define them on the compiler command line.\n * \\{\n */\n#ifndef MBEDTLS_SSL_COOKIE_TIMEOUT\n#define MBEDTLS_SSL_COOKIE_TIMEOUT     60 /**< Default expiration delay of DTLS cookies, in seconds if HAVE_TIME, or in number of cookies issued */\n#endif\n\n/* \\} name SECTION: Module settings */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Context for the default cookie functions.\n */\ntypedef struct\n{\n    mbedtls_md_context_t    hmac_ctx;   /*!< context for the HMAC portion   */\n#if !defined(MBEDTLS_HAVE_TIME)\n    unsigned long   serial;     /*!< serial number for expiration   */\n#endif\n    unsigned long   timeout;    /*!< timeout delay, in seconds if HAVE_TIME,\n                                     or in number of tickets issued */\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_threading_mutex_t mutex;\n#endif\n} mbedtls_ssl_cookie_ctx;\n\n/**\n * \\brief          Initialize cookie context\n */\nvoid mbedtls_ssl_cookie_init( mbedtls_ssl_cookie_ctx *ctx );\n\n/**\n * \\brief          Setup cookie context (generate keys)\n */\nint mbedtls_ssl_cookie_setup( mbedtls_ssl_cookie_ctx *ctx,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng );\n\n/**\n * \\brief          Set expiration delay for cookies\n *                 (Default MBEDTLS_SSL_COOKIE_TIMEOUT)\n *\n * \\param ctx      Cookie contex\n * \\param delay    Delay, in seconds if HAVE_TIME, or in number of cookies\n *                 issued in the meantime.\n *                 0 to disable expiration (NOT recommended)\n */\nvoid mbedtls_ssl_cookie_set_timeout( mbedtls_ssl_cookie_ctx *ctx, unsigned long delay );\n\n/**\n * \\brief          Free cookie context\n */\nvoid mbedtls_ssl_cookie_free( mbedtls_ssl_cookie_ctx *ctx );\n\n/**\n * \\brief          Generate cookie, see \\c mbedtls_ssl_cookie_write_t\n */\nmbedtls_ssl_cookie_write_t mbedtls_ssl_cookie_write;\n\n/**\n * \\brief          Verify cookie, see \\c mbedtls_ssl_cookie_write_t\n */\nmbedtls_ssl_cookie_check_t mbedtls_ssl_cookie_check;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ssl_cookie.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ssl_internal.h",
    "content": "/**\n * \\file ssl_ticket.h\n *\n * \\brief Internal functions shared by the SSL modules\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_SSL_INTERNAL_H\n#define MBEDTLS_SSL_INTERNAL_H\n\n#include \"ssl.h\"\n\n#if defined(MBEDTLS_MD5_C)\n#include \"md5.h\"\n#endif\n\n#if defined(MBEDTLS_SHA1_C)\n#include \"sha1.h\"\n#endif\n\n#if defined(MBEDTLS_SHA256_C)\n#include \"sha256.h\"\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\n#include \"sha512.h\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n#include \"ecjpake.h\"\n#endif\n\n#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \\\n    !defined(inline) && !defined(__cplusplus)\n#define inline __inline\n#endif\n\n/* Determine minimum supported version */\n#define MBEDTLS_SSL_MIN_MAJOR_VERSION           MBEDTLS_SSL_MAJOR_VERSION_3\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n#define MBEDTLS_SSL_MIN_MINOR_VERSION           MBEDTLS_SSL_MINOR_VERSION_0\n#else\n#if defined(MBEDTLS_SSL_PROTO_TLS1)\n#define MBEDTLS_SSL_MIN_MINOR_VERSION           MBEDTLS_SSL_MINOR_VERSION_1\n#else\n#if defined(MBEDTLS_SSL_PROTO_TLS1_1)\n#define MBEDTLS_SSL_MIN_MINOR_VERSION           MBEDTLS_SSL_MINOR_VERSION_2\n#else\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#define MBEDTLS_SSL_MIN_MINOR_VERSION           MBEDTLS_SSL_MINOR_VERSION_3\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n#endif /* MBEDTLS_SSL_PROTO_TLS1_1 */\n#endif /* MBEDTLS_SSL_PROTO_TLS1   */\n#endif /* MBEDTLS_SSL_PROTO_SSL3   */\n\n/* Determine maximum supported version */\n#define MBEDTLS_SSL_MAX_MAJOR_VERSION           MBEDTLS_SSL_MAJOR_VERSION_3\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#define MBEDTLS_SSL_MAX_MINOR_VERSION           MBEDTLS_SSL_MINOR_VERSION_3\n#else\n#if defined(MBEDTLS_SSL_PROTO_TLS1_1)\n#define MBEDTLS_SSL_MAX_MINOR_VERSION           MBEDTLS_SSL_MINOR_VERSION_2\n#else\n#if defined(MBEDTLS_SSL_PROTO_TLS1)\n#define MBEDTLS_SSL_MAX_MINOR_VERSION           MBEDTLS_SSL_MINOR_VERSION_1\n#else\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n#define MBEDTLS_SSL_MAX_MINOR_VERSION           MBEDTLS_SSL_MINOR_VERSION_0\n#endif /* MBEDTLS_SSL_PROTO_SSL3   */\n#endif /* MBEDTLS_SSL_PROTO_TLS1   */\n#endif /* MBEDTLS_SSL_PROTO_TLS1_1 */\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\n#define MBEDTLS_SSL_INITIAL_HANDSHAKE           0\n#define MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS   1   /* In progress */\n#define MBEDTLS_SSL_RENEGOTIATION_DONE          2   /* Done or aborted */\n#define MBEDTLS_SSL_RENEGOTIATION_PENDING       3   /* Requested (server only) */\n\n/*\n * DTLS retransmission states, see RFC 6347 4.2.4\n *\n * The SENDING state is merged in PREPARING for initial sends,\n * but is distinct for resends.\n *\n * Note: initial state is wrong for server, but is not used anyway.\n */\n#define MBEDTLS_SSL_RETRANS_PREPARING       0\n#define MBEDTLS_SSL_RETRANS_SENDING         1\n#define MBEDTLS_SSL_RETRANS_WAITING         2\n#define MBEDTLS_SSL_RETRANS_FINISHED        3\n\n/*\n * Allow extra bytes for record, authentication and encryption overhead:\n * counter (8) + header (5) + IV(16) + MAC (16-48) + padding (0-256)\n * and allow for a maximum of 1024 of compression expansion if\n * enabled.\n */\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n#define MBEDTLS_SSL_COMPRESSION_ADD          1024\n#else\n#define MBEDTLS_SSL_COMPRESSION_ADD             0\n#endif\n\n#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_MODE_CBC)\n/* Ciphersuites using HMAC */\n#if defined(MBEDTLS_SHA512_C)\n#define MBEDTLS_SSL_MAC_ADD                 48  /* SHA-384 used for HMAC */\n#elif defined(MBEDTLS_SHA256_C)\n#define MBEDTLS_SSL_MAC_ADD                 32  /* SHA-256 used for HMAC */\n#else\n#define MBEDTLS_SSL_MAC_ADD                 20  /* SHA-1   used for HMAC */\n#endif\n#else\n/* AEAD ciphersuites: GCM and CCM use a 128 bits tag */\n#define MBEDTLS_SSL_MAC_ADD                 16\n#endif\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#define MBEDTLS_SSL_PADDING_ADD            256\n#else\n#define MBEDTLS_SSL_PADDING_ADD              0\n#endif\n\n#define MBEDTLS_SSL_BUFFER_LEN  ( MBEDTLS_SSL_MAX_CONTENT_LEN               \\\n                        + MBEDTLS_SSL_COMPRESSION_ADD               \\\n                        + 29 /* counter + header + IV */    \\\n                        + MBEDTLS_SSL_MAC_ADD                       \\\n                        + MBEDTLS_SSL_PADDING_ADD                   \\\n                        )\n\n/*\n * TLS extension flags (for extensions with outgoing ServerHello content\n * that need it (e.g. for RENEGOTIATION_INFO the server already knows because\n * of state of the renegotiation flag, so no indicator is required)\n */\n#define MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT (1 << 0)\n#define MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK                 (1 << 1)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n/*\n * Abstraction for a grid of allowed signature-hash-algorithm pairs.\n */\nstruct mbedtls_ssl_sig_hash_set_t\n{\n    /* At the moment, we only need to remember a single suitable\n     * hash algorithm per signature algorithm. As long as that's\n     * the case - and we don't need a general lookup function -\n     * we can implement the sig-hash-set as a map from signatures\n     * to hash algorithms. */\n    mbedtls_md_type_t rsa;\n    mbedtls_md_type_t ecdsa;\n};\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&\n          MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n/*\n * This structure contains the parameters only needed during handshake.\n */\nstruct mbedtls_ssl_handshake_params\n{\n    /*\n     * Handshake specific crypto variables\n     */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n    mbedtls_ssl_sig_hash_set_t hash_algs;             /*!<  Set of suitable sig-hash pairs */\n#endif\n#if defined(MBEDTLS_DHM_C)\n    mbedtls_dhm_context dhm_ctx;                /*!<  DHM key exchange        */\n#endif\n#if defined(MBEDTLS_ECDH_C)\n    mbedtls_ecdh_context ecdh_ctx;              /*!<  ECDH key exchange       */\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    mbedtls_ecjpake_context ecjpake_ctx;        /*!< EC J-PAKE key exchange */\n#if defined(MBEDTLS_SSL_CLI_C)\n    unsigned char *ecjpake_cache;               /*!< Cache for ClientHello ext */\n    size_t ecjpake_cache_len;                   /*!< Length of cached data */\n#endif\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    const mbedtls_ecp_curve_info **curves;      /*!<  Supported elliptic curves */\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    unsigned char *psk;                 /*!<  PSK from the callback         */\n    size_t psk_len;                     /*!<  Length of PSK from callback   */\n#endif\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_ssl_key_cert *key_cert;     /*!< chosen key/cert pair (server)  */\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n    int sni_authmode;                   /*!< authmode from SNI callback     */\n    mbedtls_ssl_key_cert *sni_key_cert; /*!< key/cert list from SNI         */\n    mbedtls_x509_crt *sni_ca_chain;     /*!< trusted CAs from SNI callback  */\n    mbedtls_x509_crl *sni_ca_crl;       /*!< trusted CAs CRLs from SNI      */\n#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    unsigned int out_msg_seq;           /*!<  Outgoing handshake sequence number */\n    unsigned int in_msg_seq;            /*!<  Incoming handshake sequence number */\n\n    unsigned char *verify_cookie;       /*!<  Cli: HelloVerifyRequest cookie\n                                              Srv: unused                    */\n    unsigned char verify_cookie_len;    /*!<  Cli: cookie length\n                                              Srv: flag for sending a cookie */\n\n    unsigned char *hs_msg;              /*!<  Reassembled handshake message  */\n\n    uint32_t retransmit_timeout;        /*!<  Current value of timeout       */\n    unsigned char retransmit_state;     /*!<  Retransmission state           */\n    mbedtls_ssl_flight_item *flight;            /*!<  Current outgoing flight        */\n    mbedtls_ssl_flight_item *cur_msg;           /*!<  Current message in flight      */\n    unsigned int in_flight_start_seq;   /*!<  Minimum message sequence in the\n                                              flight being received          */\n    mbedtls_ssl_transform *alt_transform_out;   /*!<  Alternative transform for\n                                              resending messages             */\n    unsigned char alt_out_ctr[8];       /*!<  Alternative record epoch/counter\n                                              for resending messages         */\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n    /*\n     * Checksum contexts\n     */\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n       mbedtls_md5_context fin_md5;\n      mbedtls_sha1_context fin_sha1;\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA256_C)\n    mbedtls_sha256_context fin_sha256;\n#endif\n#if defined(MBEDTLS_SHA512_C)\n    mbedtls_sha512_context fin_sha512;\n#endif\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\n    void (*update_checksum)(mbedtls_ssl_context *, const unsigned char *, size_t);\n    void (*calc_verify)(mbedtls_ssl_context *, unsigned char *);\n    void (*calc_finished)(mbedtls_ssl_context *, unsigned char *, int);\n    int  (*tls_prf)(const unsigned char *, size_t, const char *,\n                    const unsigned char *, size_t,\n                    unsigned char *, size_t);\n\n    size_t pmslen;                      /*!<  premaster length        */\n\n    unsigned char randbytes[64];        /*!<  random bytes            */\n    unsigned char premaster[MBEDTLS_PREMASTER_SIZE];\n                                        /*!<  premaster secret        */\n\n    int resume;                         /*!<  session resume indicator*/\n    int max_major_ver;                  /*!< max. major version client*/\n    int max_minor_ver;                  /*!< max. minor version client*/\n    int cli_exts;                       /*!< client extension presence*/\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    int new_session_ticket;             /*!< use NewSessionTicket?    */\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n    int extended_ms;                    /*!< use Extended Master Secret? */\n#endif\n};\n\n/*\n * This structure contains a full set of runtime transform parameters\n * either in negotiation or active.\n */\nstruct mbedtls_ssl_transform\n{\n    /*\n     * Session specific crypto layer\n     */\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info;\n                                        /*!<  Chosen cipersuite_info  */\n    unsigned int keylen;                /*!<  symmetric key length (bytes)  */\n    size_t minlen;                      /*!<  min. ciphertext length  */\n    size_t ivlen;                       /*!<  IV length               */\n    size_t fixed_ivlen;                 /*!<  Fixed part of IV (AEAD) */\n    size_t maclen;                      /*!<  MAC length              */\n\n    unsigned char iv_enc[16];           /*!<  IV (encryption)         */\n    unsigned char iv_dec[16];           /*!<  IV (decryption)         */\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n    /* Needed only for SSL v3.0 secret */\n    unsigned char mac_enc[20];          /*!<  SSL v3.0 secret (enc)   */\n    unsigned char mac_dec[20];          /*!<  SSL v3.0 secret (dec)   */\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n\n    mbedtls_md_context_t md_ctx_enc;            /*!<  MAC (encryption)        */\n    mbedtls_md_context_t md_ctx_dec;            /*!<  MAC (decryption)        */\n\n    mbedtls_cipher_context_t cipher_ctx_enc;    /*!<  encryption context      */\n    mbedtls_cipher_context_t cipher_ctx_dec;    /*!<  decryption context      */\n\n    /*\n     * Session specific compression layer\n     */\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    z_stream ctx_deflate;               /*!<  compression context     */\n    z_stream ctx_inflate;               /*!<  decompression context   */\n#endif\n};\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n/*\n * List of certificate + private key pairs\n */\nstruct mbedtls_ssl_key_cert\n{\n    mbedtls_x509_crt *cert;                 /*!< cert                       */\n    mbedtls_pk_context *key;                /*!< private key                */\n    mbedtls_ssl_key_cert *next;             /*!< next key/cert pair         */\n};\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n/*\n * List of handshake messages kept around for resending\n */\nstruct mbedtls_ssl_flight_item\n{\n    unsigned char *p;       /*!< message, including handshake headers   */\n    size_t len;             /*!< length of p                            */\n    unsigned char type;     /*!< type of the message: handshake or CCS  */\n    mbedtls_ssl_flight_item *next;  /*!< next handshake message(s)              */\n};\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n\n/* Find an entry in a signature-hash set matching a given hash algorithm. */\nmbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set,\n                                                 mbedtls_pk_type_t sig_alg );\n/* Add a signature-hash-pair to a signature-hash set */\nvoid mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set,\n                                   mbedtls_pk_type_t sig_alg,\n                                   mbedtls_md_type_t md_alg );\n/* Allow exactly one hash algorithm for each signature. */\nvoid mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set,\n                                          mbedtls_md_type_t md_alg );\n\n/* Setup an empty signature-hash set */\nstatic inline void mbedtls_ssl_sig_hash_set_init( mbedtls_ssl_sig_hash_set_t *set )\n{\n    mbedtls_ssl_sig_hash_set_const_hash( set, MBEDTLS_MD_NONE );\n}\n\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2) &&\n          MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n/**\n * \\brief           Free referenced items in an SSL transform context and clear\n *                  memory\n *\n * \\param transform SSL transform context\n */\nvoid mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform );\n\n/**\n * \\brief           Free referenced items in an SSL handshake context and clear\n *                  memory\n *\n * \\param handshake SSL handshake context\n */\nvoid mbedtls_ssl_handshake_free( mbedtls_ssl_handshake_params *handshake );\n\nint mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl );\nint mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl );\nvoid mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl );\n\nint mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl );\n\nvoid mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl );\nint mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl );\n\nint mbedtls_ssl_read_record_layer( mbedtls_ssl_context *ssl );\nint mbedtls_ssl_handle_message_type( mbedtls_ssl_context *ssl );\nint mbedtls_ssl_prepare_handshake_record( mbedtls_ssl_context *ssl );\nvoid mbedtls_ssl_update_handshake_status( mbedtls_ssl_context *ssl );\n\n/**\n * \\brief       Update record layer\n *\n *              This function roughly separates the implementation\n *              of the logic of (D)TLS from the implementation\n *              of the secure transport.\n *\n * \\param  ssl  SSL context to use\n *\n * \\return      0 or non-zero error code.\n *\n * \\note        A clarification on what is called 'record layer' here\n *              is in order, as many sensible definitions are possible:\n *\n *              The record layer takes as input an untrusted underlying\n *              transport (stream or datagram) and transforms it into\n *              a serially multiplexed, secure transport, which\n *              conceptually provides the following:\n *\n *              (1) Three datagram based, content-agnostic transports\n *                  for handshake, alert and CCS messages.\n *              (2) One stream- or datagram-based transport\n *                  for application data.\n *              (3) Functionality for changing the underlying transform\n *                  securing the contents.\n *\n *              The interface to this functionality is given as follows:\n *\n *              a Updating\n *                [Currently implemented by mbedtls_ssl_read_record]\n *\n *                Check if and on which of the four 'ports' data is pending:\n *                Nothing, a controlling datagram of type (1), or application\n *                data (2). In any case data is present, internal buffers\n *                provide access to the data for the user to process it.\n *                Consumption of type (1) datagrams is done automatically\n *                on the next update, invalidating that the internal buffers\n *                for previous datagrams, while consumption of application\n *                data (2) is user-controlled.\n *\n *              b Reading of application data\n *                [Currently manual adaption of ssl->in_offt pointer]\n *\n *                As mentioned in the last paragraph, consumption of data\n *                is different from the automatic consumption of control\n *                datagrams (1) because application data is treated as a stream.\n *\n *              c Tracking availability of application data\n *                [Currently manually through decreasing ssl->in_msglen]\n *\n *                For efficiency and to retain datagram semantics for\n *                application data in case of DTLS, the record layer\n *                provides functionality for checking how much application\n *                data is still available in the internal buffer.\n *\n *              d Changing the transformation securing the communication.\n *\n *              Given an opaque implementation of the record layer in the\n *              above sense, it should be possible to implement the logic\n *              of (D)TLS on top of it without the need to know anything\n *              about the record layer's internals. This is done e.g.\n *              in all the handshake handling functions, and in the\n *              application data reading function mbedtls_ssl_read.\n *\n * \\note        The above tries to give a conceptual picture of the\n *              record layer, but the current implementation deviates\n *              from it in some places. For example, our implementation of\n *              the update functionality through mbedtls_ssl_read_record\n *              discards datagrams depending on the current state, which\n *              wouldn't fall under the record layer's responsibility\n *              following the above definition.\n *\n */\nint mbedtls_ssl_read_record( mbedtls_ssl_context *ssl );\nint mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want );\n\nint mbedtls_ssl_write_record( mbedtls_ssl_context *ssl );\nint mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl );\n\nint mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl );\nint mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl );\n\nint mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl );\nint mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl );\n\nint mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl );\nint mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl );\n\nvoid mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl,\n                            const mbedtls_ssl_ciphersuite_t *ciphersuite_info );\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\nint mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex );\n#endif\n\n#if defined(MBEDTLS_PK_C)\nunsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk );\nunsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type );\nmbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig );\n#endif\n\nmbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash );\nunsigned char mbedtls_ssl_hash_from_md_alg( int md );\nint mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md );\n\n#if defined(MBEDTLS_ECP_C)\nint mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id );\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\nint mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl,\n                                mbedtls_md_type_t md );\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\nstatic inline mbedtls_pk_context *mbedtls_ssl_own_key( mbedtls_ssl_context *ssl )\n{\n    mbedtls_ssl_key_cert *key_cert;\n\n    if( ssl->handshake != NULL && ssl->handshake->key_cert != NULL )\n        key_cert = ssl->handshake->key_cert;\n    else\n        key_cert = ssl->conf->key_cert;\n\n    return( key_cert == NULL ? NULL : key_cert->key );\n}\n\nstatic inline mbedtls_x509_crt *mbedtls_ssl_own_cert( mbedtls_ssl_context *ssl )\n{\n    mbedtls_ssl_key_cert *key_cert;\n\n    if( ssl->handshake != NULL && ssl->handshake->key_cert != NULL )\n        key_cert = ssl->handshake->key_cert;\n    else\n        key_cert = ssl->conf->key_cert;\n\n    return( key_cert == NULL ? NULL : key_cert->cert );\n}\n\n/*\n * Check usage of a certificate wrt extensions:\n * keyUsage, extendedKeyUsage (later), and nSCertType (later).\n *\n * Warning: cert_endpoint is the endpoint of the cert (ie, of our peer when we\n * check a cert we received from them)!\n *\n * Return 0 if everything is OK, -1 if not.\n */\nint mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,\n                          const mbedtls_ssl_ciphersuite_t *ciphersuite,\n                          int cert_endpoint,\n                          uint32_t *flags );\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\nvoid mbedtls_ssl_write_version( int major, int minor, int transport,\n                        unsigned char ver[2] );\nvoid mbedtls_ssl_read_version( int *major, int *minor, int transport,\n                       const unsigned char ver[2] );\n\nstatic inline size_t mbedtls_ssl_hdr_len( const mbedtls_ssl_context *ssl )\n{\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        return( 13 );\n#else\n    ((void) ssl);\n#endif\n    return( 5 );\n}\n\nstatic inline size_t mbedtls_ssl_hs_hdr_len( const mbedtls_ssl_context *ssl )\n{\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        return( 12 );\n#else\n    ((void) ssl);\n#endif\n    return( 4 );\n}\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\nvoid mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl );\nvoid mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl );\nint mbedtls_ssl_resend( mbedtls_ssl_context *ssl );\n#endif\n\n/* Visible for testing purposes only */\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\nint mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl );\nvoid mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl );\n#endif\n\n/* constant-time buffer comparison */\nstatic inline int mbedtls_ssl_safer_memcmp( const void *a, const void *b, size_t n )\n{\n    size_t i;\n    const unsigned char *A = (const unsigned char *) a;\n    const unsigned char *B = (const unsigned char *) b;\n    unsigned char diff = 0;\n\n    for( i = 0; i < n; i++ )\n        diff |= A[i] ^ B[i];\n\n    return( diff );\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ssl_internal.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/ssl_ticket.h",
    "content": "/**\n * \\file ssl_ticket.h\n *\n * \\brief TLS server ticket callbacks implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_SSL_TICKET_H\n#define MBEDTLS_SSL_TICKET_H\n\n/*\n * This implementation of the session ticket callbacks includes key\n * management, rotating the keys periodically in order to preserve forward\n * secrecy, when MBEDTLS_HAVE_TIME is defined.\n */\n\n#include \"ssl.h\"\n#include \"cipher.h\"\n\n#if defined(MBEDTLS_THREADING_C)\n#include \"threading.h\"\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief   Information for session ticket protection\n */\ntypedef struct\n{\n    unsigned char name[4];          /*!< random key identifier              */\n    uint32_t generation_time;       /*!< key generation timestamp (seconds) */\n    mbedtls_cipher_context_t ctx;   /*!< context for auth enc/decryption    */\n}\nmbedtls_ssl_ticket_key;\n\n/**\n * \\brief   Context for session ticket handling functions\n */\ntypedef struct\n{\n    mbedtls_ssl_ticket_key keys[2]; /*!< ticket protection keys             */\n    unsigned char active;           /*!< index of the currently active key  */\n\n    uint32_t ticket_lifetime;       /*!< lifetime of tickets in seconds     */\n\n    /** Callback for getting (pseudo-)random numbers                        */\n    int  (*f_rng)(void *, unsigned char *, size_t);\n    void *p_rng;                    /*!< context for the RNG function       */\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_threading_mutex_t mutex;\n#endif\n}\nmbedtls_ssl_ticket_context;\n\n/**\n * \\brief           Initialize a ticket context.\n *                  (Just make it ready for mbedtls_ssl_ticket_setup()\n *                  or mbedtls_ssl_ticket_free().)\n *\n * \\param ctx       Context to be initialized\n */\nvoid mbedtls_ssl_ticket_init( mbedtls_ssl_ticket_context *ctx );\n\n/**\n * \\brief           Prepare context to be actually used\n *\n * \\param ctx       Context to be set up\n * \\param f_rng     RNG callback function\n * \\param p_rng     RNG callback context\n * \\param cipher    AEAD cipher to use for ticket protection.\n *                  Recommended value: MBEDTLS_CIPHER_AES_256_GCM.\n * \\param lifetime  Tickets lifetime in seconds\n *                  Recommended value: 86400 (one day).\n *\n * \\note            It is highly recommended to select a cipher that is at\n *                  least as strong as the the strongest ciphersuite\n *                  supported. Usually that means a 256-bit key.\n *\n * \\note            The lifetime of the keys is twice the lifetime of tickets.\n *                  It is recommended to pick a reasonnable lifetime so as not\n *                  to negate the benefits of forward secrecy.\n *\n * \\return          0 if successful,\n *                  or a specific MBEDTLS_ERR_XXX error code\n */\nint mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx,\n    int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,\n    mbedtls_cipher_type_t cipher,\n    uint32_t lifetime );\n\n/**\n * \\brief           Implementation of the ticket write callback\n *\n * \\note            See \\c mbedlts_ssl_ticket_write_t for description\n */\nmbedtls_ssl_ticket_write_t mbedtls_ssl_ticket_write;\n\n/**\n * \\brief           Implementation of the ticket parse callback\n *\n * \\note            See \\c mbedlts_ssl_ticket_parse_t for description\n */\nmbedtls_ssl_ticket_parse_t mbedtls_ssl_ticket_parse;\n\n/**\n * \\brief           Free a context's content and zeroize it.\n *\n * \\param ctx       Context to be cleaned up\n */\nvoid mbedtls_ssl_ticket_free( mbedtls_ssl_ticket_context *ctx );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ssl_ticket.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/threading.h",
    "content": "/**\n * \\file threading.h\n *\n * \\brief Threading abstraction layer\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_THREADING_H\n#define MBEDTLS_THREADING_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stdlib.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE         -0x001A  /**< The selected feature is not available. */\n#define MBEDTLS_ERR_THREADING_BAD_INPUT_DATA              -0x001C  /**< Bad input parameters to function. */\n#define MBEDTLS_ERR_THREADING_MUTEX_ERROR                 -0x001E  /**< Locking / unlocking / free failed with error code. */\n\n#if defined(MBEDTLS_THREADING_PTHREAD)\n#include <pthread.h>\ntypedef struct\n{\n    pthread_mutex_t mutex;\n    char is_valid;\n} mbedtls_threading_mutex_t;\n#endif\n\n#if defined(MBEDTLS_THREADING_ALT)\n/* You should define the mbedtls_threading_mutex_t type in your header */\n#include \"threading_alt.h\"\n\n/**\n * \\brief           Set your alternate threading implementation function\n *                  pointers and initialize global mutexes. If used, this\n *                  function must be called once in the main thread before any\n *                  other mbed TLS function is called, and\n *                  mbedtls_threading_free_alt() must be called once in the main\n *                  thread after all other mbed TLS functions.\n *\n * \\note            mutex_init() and mutex_free() don't return a status code.\n *                  If mutex_init() fails, it should leave its argument (the\n *                  mutex) in a state such that mutex_lock() will fail when\n *                  called with this argument.\n *\n * \\param mutex_init    the init function implementation\n * \\param mutex_free    the free function implementation\n * \\param mutex_lock    the lock function implementation\n * \\param mutex_unlock  the unlock function implementation\n */\nvoid mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * ),\n                       void (*mutex_free)( mbedtls_threading_mutex_t * ),\n                       int (*mutex_lock)( mbedtls_threading_mutex_t * ),\n                       int (*mutex_unlock)( mbedtls_threading_mutex_t * ) );\n\n/**\n * \\brief               Free global mutexes.\n */\nvoid mbedtls_threading_free_alt( void );\n#endif /* MBEDTLS_THREADING_ALT */\n\n#if defined(MBEDTLS_THREADING_C)\n/*\n * The function pointers for mutex_init, mutex_free, mutex_ and mutex_unlock\n *\n * All these functions are expected to work or the result will be undefined.\n */\nextern void (*mbedtls_mutex_init)( mbedtls_threading_mutex_t *mutex );\nextern void (*mbedtls_mutex_free)( mbedtls_threading_mutex_t *mutex );\nextern int (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t *mutex );\nextern int (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t *mutex );\n\n/*\n * Global mutexes\n */\nextern mbedtls_threading_mutex_t mbedtls_threading_readdir_mutex;\nextern mbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex;\n#endif /* MBEDTLS_THREADING_C */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* threading.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/timing.h",
    "content": "/**\n * \\file timing.h\n *\n * \\brief Portable interface to the CPU cycle counter\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_TIMING_H\n#define MBEDTLS_TIMING_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if !defined(MBEDTLS_TIMING_ALT)\n// Regular implementation\n//\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          timer structure\n */\nstruct mbedtls_timing_hr_time\n{\n    unsigned char opaque[32];\n};\n\n/**\n * \\brief          Context for mbedtls_timing_set/get_delay()\n */\ntypedef struct\n{\n    struct mbedtls_timing_hr_time   timer;\n    uint32_t                        int_ms;\n    uint32_t                        fin_ms;\n} mbedtls_timing_delay_context;\n\nextern volatile int mbedtls_timing_alarmed;\n\n/**\n * \\brief          Return the CPU cycle counter value\n *\n * \\warning        This is only a best effort! Do not rely on this!\n *                 In particular, it is known to be unreliable on virtual\n *                 machines.\n */\nunsigned long mbedtls_timing_hardclock( void );\n\n/**\n * \\brief          Return the elapsed time in milliseconds\n *\n * \\param val      points to a timer structure\n * \\param reset    if set to 1, the timer is restarted\n */\nunsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset );\n\n/**\n * \\brief          Setup an alarm clock\n *\n * \\param seconds  delay before the \"mbedtls_timing_alarmed\" flag is set\n *\n * \\warning        Only one alarm at a time  is supported. In a threaded\n *                 context, this means one for the whole process, not one per\n *                 thread.\n */\nvoid mbedtls_set_alarm( int seconds );\n\n/**\n * \\brief          Set a pair of delays to watch\n *                 (See \\c mbedtls_timing_get_delay().)\n *\n * \\param data     Pointer to timing data\n *                 Must point to a valid \\c mbedtls_timing_delay_context struct.\n * \\param int_ms   First (intermediate) delay in milliseconds.\n * \\param fin_ms   Second (final) delay in milliseconds.\n *                 Pass 0 to cancel the current delay.\n */\nvoid mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms );\n\n/**\n * \\brief          Get the status of delays\n *                 (Memory helper: number of delays passed.)\n *\n * \\param data     Pointer to timing data\n *                 Must point to a valid \\c mbedtls_timing_delay_context struct.\n *\n * \\return         -1 if cancelled (fin_ms = 0)\n *                  0 if none of the delays are passed,\n *                  1 if only the intermediate delay is passed,\n *                  2 if the final delay is passed.\n */\nint mbedtls_timing_get_delay( void *data );\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_TIMING_ALT */\n#include \"timing_alt.h\"\n#endif /* MBEDTLS_TIMING_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(MBEDTLS_SELF_TEST)\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if a test failed\n */\nint mbedtls_timing_self_test( int verbose );\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* timing.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/version.h",
    "content": "/**\n * \\file version.h\n *\n * \\brief Run-time version information\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * This set of compile-time defines and run-time variables can be used to\n * determine the version number of the mbed TLS library used.\n */\n#ifndef MBEDTLS_VERSION_H\n#define MBEDTLS_VERSION_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n/**\n * The version number x.y.z is split into three parts.\n * Major, Minor, Patchlevel\n */\n#define MBEDTLS_VERSION_MAJOR  2\n#define MBEDTLS_VERSION_MINOR  6\n#define MBEDTLS_VERSION_PATCH  0\n\n/**\n * The single version number has the following structure:\n *    MMNNPP00\n *    Major version | Minor version | Patch version\n */\n#define MBEDTLS_VERSION_NUMBER         0x02060000\n#define MBEDTLS_VERSION_STRING         \"2.6.0\"\n#define MBEDTLS_VERSION_STRING_FULL    \"mbed TLS 2.6.0\"\n\n#if defined(MBEDTLS_VERSION_C)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * Get the version number.\n *\n * \\return          The constructed version number in the format\n *                  MMNNPP00 (Major, Minor, Patch).\n */\nunsigned int mbedtls_version_get_number( void );\n\n/**\n * Get the version string (\"x.y.z\").\n *\n * \\param string    The string that will receive the value.\n *                  (Should be at least 9 bytes in size)\n */\nvoid mbedtls_version_get_string( char *string );\n\n/**\n * Get the full version string (\"mbed TLS x.y.z\").\n *\n * \\param string    The string that will receive the value. The mbed TLS version\n *                  string will use 18 bytes AT MOST including a terminating\n *                  null byte.\n *                  (So the buffer should be at least 18 bytes to receive this\n *                  version string).\n */\nvoid mbedtls_version_get_string_full( char *string );\n\n/**\n * \\brief           Check if support for a feature was compiled into this\n *                  mbed TLS binary. This allows you to see at runtime if the\n *                  library was for instance compiled with or without\n *                  Multi-threading support.\n *\n * \\note            only checks against defines in the sections \"System\n *                  support\", \"mbed TLS modules\" and \"mbed TLS feature\n *                  support\" in config.h\n *\n * \\param feature   The string for the define to check (e.g. \"MBEDTLS_AES_C\")\n *\n * \\return          0 if the feature is present,\n *                  -1 if the feature is not present and\n *                  -2 if support for feature checking as a whole was not\n *                  compiled in.\n */\nint mbedtls_version_check_feature( const char *feature );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* MBEDTLS_VERSION_C */\n\n#endif /* version.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/x509.h",
    "content": "/**\n * \\file x509.h\n *\n * \\brief X.509 generic defines and structures\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_X509_H\n#define MBEDTLS_X509_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"asn1.h\"\n#include \"pk.h\"\n\n#if defined(MBEDTLS_RSA_C)\n#include \"rsa.h\"\n#endif\n\n/**\n * \\addtogroup x509_module\n * \\{\n */\n\n#if !defined(MBEDTLS_X509_MAX_INTERMEDIATE_CA)\n/**\n * Maximum number of intermediate CAs in a verification chain.\n * That is, maximum length of the chain, excluding the end-entity certificate\n * and the trusted root certificate.\n *\n * Set this to a low value to prevent an adversary from making you waste\n * resources verifying an overlong certificate chain.\n */\n#define MBEDTLS_X509_MAX_INTERMEDIATE_CA   8\n#endif\n\n/**\n * \\name X509 Error codes\n * \\{\n */\n#define MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE              -0x2080  /**< Unavailable feature, e.g. RSA hashing/encryption combination. */\n#define MBEDTLS_ERR_X509_UNKNOWN_OID                      -0x2100  /**< Requested OID is unknown. */\n#define MBEDTLS_ERR_X509_INVALID_FORMAT                   -0x2180  /**< The CRT/CRL/CSR format is invalid, e.g. different type expected. */\n#define MBEDTLS_ERR_X509_INVALID_VERSION                  -0x2200  /**< The CRT/CRL/CSR version element is invalid. */\n#define MBEDTLS_ERR_X509_INVALID_SERIAL                   -0x2280  /**< The serial tag or value is invalid. */\n#define MBEDTLS_ERR_X509_INVALID_ALG                      -0x2300  /**< The algorithm tag or value is invalid. */\n#define MBEDTLS_ERR_X509_INVALID_NAME                     -0x2380  /**< The name tag or value is invalid. */\n#define MBEDTLS_ERR_X509_INVALID_DATE                     -0x2400  /**< The date tag or value is invalid. */\n#define MBEDTLS_ERR_X509_INVALID_SIGNATURE                -0x2480  /**< The signature tag or value invalid. */\n#define MBEDTLS_ERR_X509_INVALID_EXTENSIONS               -0x2500  /**< The extension tag or value is invalid. */\n#define MBEDTLS_ERR_X509_UNKNOWN_VERSION                  -0x2580  /**< CRT/CRL/CSR has an unsupported version number. */\n#define MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG                  -0x2600  /**< Signature algorithm (oid) is unsupported. */\n#define MBEDTLS_ERR_X509_SIG_MISMATCH                     -0x2680  /**< Signature algorithms do not match. (see \\c ::mbedtls_x509_crt sig_oid) */\n#define MBEDTLS_ERR_X509_CERT_VERIFY_FAILED               -0x2700  /**< Certificate verification failed, e.g. CRL, CA or signature check failed. */\n#define MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT              -0x2780  /**< Format not recognized as DER or PEM. */\n#define MBEDTLS_ERR_X509_BAD_INPUT_DATA                   -0x2800  /**< Input invalid. */\n#define MBEDTLS_ERR_X509_ALLOC_FAILED                     -0x2880  /**< Allocation of memory failed. */\n#define MBEDTLS_ERR_X509_FILE_IO_ERROR                    -0x2900  /**< Read/write of file failed. */\n#define MBEDTLS_ERR_X509_BUFFER_TOO_SMALL                 -0x2980  /**< Destination buffer is too small. */\n#define MBEDTLS_ERR_X509_FATAL_ERROR                      -0x3000  /**< A fatal error occured, eg the chain is too long or the vrfy callback failed. */\n/* \\} name */\n\n/**\n * \\name X509 Verify codes\n * \\{\n */\n/* Reminder: update x509_crt_verify_strings[] in library/x509_crt.c */\n#define MBEDTLS_X509_BADCERT_EXPIRED             0x01  /**< The certificate validity has expired. */\n#define MBEDTLS_X509_BADCERT_REVOKED             0x02  /**< The certificate has been revoked (is on a CRL). */\n#define MBEDTLS_X509_BADCERT_CN_MISMATCH         0x04  /**< The certificate Common Name (CN) does not match with the expected CN. */\n#define MBEDTLS_X509_BADCERT_NOT_TRUSTED         0x08  /**< The certificate is not correctly signed by the trusted CA. */\n#define MBEDTLS_X509_BADCRL_NOT_TRUSTED          0x10  /**< The CRL is not correctly signed by the trusted CA. */\n#define MBEDTLS_X509_BADCRL_EXPIRED              0x20  /**< The CRL is expired. */\n#define MBEDTLS_X509_BADCERT_MISSING             0x40  /**< Certificate was missing. */\n#define MBEDTLS_X509_BADCERT_SKIP_VERIFY         0x80  /**< Certificate verification was skipped. */\n#define MBEDTLS_X509_BADCERT_OTHER             0x0100  /**< Other reason (can be used by verify callback) */\n#define MBEDTLS_X509_BADCERT_FUTURE            0x0200  /**< The certificate validity starts in the future. */\n#define MBEDTLS_X509_BADCRL_FUTURE             0x0400  /**< The CRL is from the future */\n#define MBEDTLS_X509_BADCERT_KEY_USAGE         0x0800  /**< Usage does not match the keyUsage extension. */\n#define MBEDTLS_X509_BADCERT_EXT_KEY_USAGE     0x1000  /**< Usage does not match the extendedKeyUsage extension. */\n#define MBEDTLS_X509_BADCERT_NS_CERT_TYPE      0x2000  /**< Usage does not match the nsCertType extension. */\n#define MBEDTLS_X509_BADCERT_BAD_MD            0x4000  /**< The certificate is signed with an unacceptable hash. */\n#define MBEDTLS_X509_BADCERT_BAD_PK            0x8000  /**< The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA). */\n#define MBEDTLS_X509_BADCERT_BAD_KEY         0x010000  /**< The certificate is signed with an unacceptable key (eg bad curve, RSA too short). */\n#define MBEDTLS_X509_BADCRL_BAD_MD           0x020000  /**< The CRL is signed with an unacceptable hash. */\n#define MBEDTLS_X509_BADCRL_BAD_PK           0x040000  /**< The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA). */\n#define MBEDTLS_X509_BADCRL_BAD_KEY          0x080000  /**< The CRL is signed with an unacceptable key (eg bad curve, RSA too short). */\n\n/* \\} name */\n/* \\} addtogroup x509_module */\n\n/*\n * X.509 v3 Key Usage Extension flags\n * Reminder: update x509_info_key_usage() when adding new flags.\n */\n#define MBEDTLS_X509_KU_DIGITAL_SIGNATURE            (0x80)  /* bit 0 */\n#define MBEDTLS_X509_KU_NON_REPUDIATION              (0x40)  /* bit 1 */\n#define MBEDTLS_X509_KU_KEY_ENCIPHERMENT             (0x20)  /* bit 2 */\n#define MBEDTLS_X509_KU_DATA_ENCIPHERMENT            (0x10)  /* bit 3 */\n#define MBEDTLS_X509_KU_KEY_AGREEMENT                (0x08)  /* bit 4 */\n#define MBEDTLS_X509_KU_KEY_CERT_SIGN                (0x04)  /* bit 5 */\n#define MBEDTLS_X509_KU_CRL_SIGN                     (0x02)  /* bit 6 */\n#define MBEDTLS_X509_KU_ENCIPHER_ONLY                (0x01)  /* bit 7 */\n#define MBEDTLS_X509_KU_DECIPHER_ONLY              (0x8000)  /* bit 8 */\n\n/*\n * Netscape certificate types\n * (http://www.mozilla.org/projects/security/pki/nss/tech-notes/tn3.html)\n */\n\n#define MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT         (0x80)  /* bit 0 */\n#define MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER         (0x40)  /* bit 1 */\n#define MBEDTLS_X509_NS_CERT_TYPE_EMAIL              (0x20)  /* bit 2 */\n#define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING     (0x10)  /* bit 3 */\n#define MBEDTLS_X509_NS_CERT_TYPE_RESERVED           (0x08)  /* bit 4 */\n#define MBEDTLS_X509_NS_CERT_TYPE_SSL_CA             (0x04)  /* bit 5 */\n#define MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA           (0x02)  /* bit 6 */\n#define MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA  (0x01)  /* bit 7 */\n\n/*\n * X.509 extension types\n *\n * Comments refer to the status for using certificates. Status can be\n * different for writing certificates or reading CRLs or CSRs.\n */\n#define MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER    (1 << 0)\n#define MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER      (1 << 1)\n#define MBEDTLS_X509_EXT_KEY_USAGE                   (1 << 2)\n#define MBEDTLS_X509_EXT_CERTIFICATE_POLICIES        (1 << 3)\n#define MBEDTLS_X509_EXT_POLICY_MAPPINGS             (1 << 4)\n#define MBEDTLS_X509_EXT_SUBJECT_ALT_NAME            (1 << 5)    /* Supported (DNS) */\n#define MBEDTLS_X509_EXT_ISSUER_ALT_NAME             (1 << 6)\n#define MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS     (1 << 7)\n#define MBEDTLS_X509_EXT_BASIC_CONSTRAINTS           (1 << 8)    /* Supported */\n#define MBEDTLS_X509_EXT_NAME_CONSTRAINTS            (1 << 9)\n#define MBEDTLS_X509_EXT_POLICY_CONSTRAINTS          (1 << 10)\n#define MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE          (1 << 11)\n#define MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS     (1 << 12)\n#define MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY          (1 << 13)\n#define MBEDTLS_X509_EXT_FRESHEST_CRL                (1 << 14)\n\n#define MBEDTLS_X509_EXT_NS_CERT_TYPE                (1 << 16)\n\n/*\n * Storage format identifiers\n * Recognized formats: PEM and DER\n */\n#define MBEDTLS_X509_FORMAT_DER                 1\n#define MBEDTLS_X509_FORMAT_PEM                 2\n\n#define MBEDTLS_X509_MAX_DN_NAME_SIZE         256 /**< Maximum value size of a DN entry */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\addtogroup x509_module\n * \\{ */\n\n/**\n * \\name Structures for parsing X.509 certificates, CRLs and CSRs\n * \\{\n */\n\n/**\n * Type-length-value structure that allows for ASN1 using DER.\n */\ntypedef mbedtls_asn1_buf mbedtls_x509_buf;\n\n/**\n * Container for ASN1 bit strings.\n */\ntypedef mbedtls_asn1_bitstring mbedtls_x509_bitstring;\n\n/**\n * Container for ASN1 named information objects.\n * It allows for Relative Distinguished Names (e.g. cn=localhost,ou=code,etc.).\n */\ntypedef mbedtls_asn1_named_data mbedtls_x509_name;\n\n/**\n * Container for a sequence of ASN.1 items\n */\ntypedef mbedtls_asn1_sequence mbedtls_x509_sequence;\n\n/** Container for date and time (precision in seconds). */\ntypedef struct mbedtls_x509_time\n{\n    int year, mon, day;         /**< Date. */\n    int hour, min, sec;         /**< Time. */\n}\nmbedtls_x509_time;\n\n/** \\} name Structures for parsing X.509 certificates, CRLs and CSRs */\n/** \\} addtogroup x509_module */\n\n/**\n * \\brief          Store the certificate DN in printable form into buf;\n *                 no more than size characters will be written.\n *\n * \\param buf      Buffer to write to\n * \\param size     Maximum size of buffer\n * \\param dn       The X509 name to represent\n *\n * \\return         The length of the string written (not including the\n *                 terminated nul byte), or a negative error code.\n */\nint mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn );\n\n/**\n * \\brief          Store the certificate serial in printable form into buf;\n *                 no more than size characters will be written.\n *\n * \\param buf      Buffer to write to\n * \\param size     Maximum size of buffer\n * \\param serial   The X509 serial to represent\n *\n * \\return         The length of the string written (not including the\n *                 terminated nul byte), or a negative error code.\n */\nint mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial );\n\n/**\n * \\brief          Check a given mbedtls_x509_time against the system time\n *                 and tell if it's in the past.\n *\n * \\note           Intended usage is \"if( is_past( valid_to ) ) ERROR\".\n *                 Hence the return value of 1 if on internal errors.\n *\n * \\param to       mbedtls_x509_time to check\n *\n * \\return         1 if the given time is in the past or an error occured,\n *                 0 otherwise.\n */\nint mbedtls_x509_time_is_past( const mbedtls_x509_time *to );\n\n/**\n * \\brief          Check a given mbedtls_x509_time against the system time\n *                 and tell if it's in the future.\n *\n * \\note           Intended usage is \"if( is_future( valid_from ) ) ERROR\".\n *                 Hence the return value of 1 if on internal errors.\n *\n * \\param from     mbedtls_x509_time to check\n *\n * \\return         1 if the given time is in the future or an error occured,\n *                 0 otherwise.\n */\nint mbedtls_x509_time_is_future( const mbedtls_x509_time *from );\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_x509_self_test( int verbose );\n\n/*\n * Internal module functions. You probably do not want to use these unless you\n * know you do.\n */\nint mbedtls_x509_get_name( unsigned char **p, const unsigned char *end,\n                   mbedtls_x509_name *cur );\nint mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end,\n                       mbedtls_x509_buf *alg );\nint mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end,\n                  mbedtls_x509_buf *alg, mbedtls_x509_buf *params );\n#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)\nint mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params,\n                                mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md,\n                                int *salt_len );\n#endif\nint mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig );\nint mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params,\n                      mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg,\n                      void **sig_opts );\nint mbedtls_x509_get_time( unsigned char **p, const unsigned char *end,\n                   mbedtls_x509_time *t );\nint mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end,\n                     mbedtls_x509_buf *serial );\nint mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end,\n                  mbedtls_x509_buf *ext, int tag );\nint mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid,\n                       mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg,\n                       const void *sig_opts );\nint mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name );\nint mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name );\nint mbedtls_x509_set_extension( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len,\n                        int critical, const unsigned char *val,\n                        size_t val_len );\nint mbedtls_x509_write_extensions( unsigned char **p, unsigned char *start,\n                           mbedtls_asn1_named_data *first );\nint mbedtls_x509_write_names( unsigned char **p, unsigned char *start,\n                      mbedtls_asn1_named_data *first );\nint mbedtls_x509_write_sig( unsigned char **p, unsigned char *start,\n                    const char *oid, size_t oid_len,\n                    unsigned char *sig, size_t size );\n\n#define MBEDTLS_X509_SAFE_SNPRINTF                          \\\n    do {                                                    \\\n        if( ret < 0 || (size_t) ret >= n )                  \\\n            return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL );    \\\n                                                            \\\n        n -= (size_t) ret;                                  \\\n        p += (size_t) ret;                                  \\\n    } while( 0 )\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* x509.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/x509_crl.h",
    "content": "/**\n * \\file x509_crl.h\n *\n * \\brief X.509 certificate revocation list parsing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_X509_CRL_H\n#define MBEDTLS_X509_CRL_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"x509.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\addtogroup x509_module\n * \\{ */\n\n/**\n * \\name Structures and functions for parsing CRLs\n * \\{\n */\n\n/**\n * Certificate revocation list entry.\n * Contains the CA-specific serial numbers and revocation dates.\n */\ntypedef struct mbedtls_x509_crl_entry\n{\n    mbedtls_x509_buf raw;\n\n    mbedtls_x509_buf serial;\n\n    mbedtls_x509_time revocation_date;\n\n    mbedtls_x509_buf entry_ext;\n\n    struct mbedtls_x509_crl_entry *next;\n}\nmbedtls_x509_crl_entry;\n\n/**\n * Certificate revocation list structure.\n * Every CRL may have multiple entries.\n */\ntypedef struct mbedtls_x509_crl\n{\n    mbedtls_x509_buf raw;           /**< The raw certificate data (DER). */\n    mbedtls_x509_buf tbs;           /**< The raw certificate body (DER). The part that is To Be Signed. */\n\n    int version;            /**< CRL version (1=v1, 2=v2) */\n    mbedtls_x509_buf sig_oid;       /**< CRL signature type identifier */\n\n    mbedtls_x509_buf issuer_raw;    /**< The raw issuer data (DER). */\n\n    mbedtls_x509_name issuer;       /**< The parsed issuer data (named information object). */\n\n    mbedtls_x509_time this_update;\n    mbedtls_x509_time next_update;\n\n    mbedtls_x509_crl_entry entry;   /**< The CRL entries containing the certificate revocation times for this CA. */\n\n    mbedtls_x509_buf crl_ext;\n\n    mbedtls_x509_buf sig_oid2;\n    mbedtls_x509_buf sig;\n    mbedtls_md_type_t sig_md;           /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */\n    mbedtls_pk_type_t sig_pk;           /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */\n    void *sig_opts;             /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */\n\n    struct mbedtls_x509_crl *next;\n}\nmbedtls_x509_crl;\n\n/**\n * \\brief          Parse a DER-encoded CRL and append it to the chained list\n *\n * \\param chain    points to the start of the chain\n * \\param buf      buffer holding the CRL data in DER format\n * \\param buflen   size of the buffer\n *                 (including the terminating null byte for PEM data)\n *\n * \\return         0 if successful, or a specific X509 or PEM error code\n */\nint mbedtls_x509_crl_parse_der( mbedtls_x509_crl *chain,\n                        const unsigned char *buf, size_t buflen );\n/**\n * \\brief          Parse one or more CRLs and append them to the chained list\n *\n * \\note           Mutliple CRLs are accepted only if using PEM format\n *\n * \\param chain    points to the start of the chain\n * \\param buf      buffer holding the CRL data in PEM or DER format\n * \\param buflen   size of the buffer\n *                 (including the terminating null byte for PEM data)\n *\n * \\return         0 if successful, or a specific X509 or PEM error code\n */\nint mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen );\n\n#if defined(MBEDTLS_FS_IO)\n/**\n * \\brief          Load one or more CRLs and append them to the chained list\n *\n * \\note           Mutliple CRLs are accepted only if using PEM format\n *\n * \\param chain    points to the start of the chain\n * \\param path     filename to read the CRLs from (in PEM or DER encoding)\n *\n * \\return         0 if successful, or a specific X509 or PEM error code\n */\nint mbedtls_x509_crl_parse_file( mbedtls_x509_crl *chain, const char *path );\n#endif /* MBEDTLS_FS_IO */\n\n/**\n * \\brief          Returns an informational string about the CRL.\n *\n * \\param buf      Buffer to write to\n * \\param size     Maximum size of buffer\n * \\param prefix   A line prefix\n * \\param crl      The X509 CRL to represent\n *\n * \\return         The length of the string written (not including the\n *                 terminated nul byte), or a negative error code.\n */\nint mbedtls_x509_crl_info( char *buf, size_t size, const char *prefix,\n                   const mbedtls_x509_crl *crl );\n\n/**\n * \\brief          Initialize a CRL (chain)\n *\n * \\param crl      CRL chain to initialize\n */\nvoid mbedtls_x509_crl_init( mbedtls_x509_crl *crl );\n\n/**\n * \\brief          Unallocate all CRL data\n *\n * \\param crl      CRL chain to free\n */\nvoid mbedtls_x509_crl_free( mbedtls_x509_crl *crl );\n\n/* \\} name */\n/* \\} addtogroup x509_module */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* mbedtls_x509_crl.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/x509_crt.h",
    "content": "/**\n * \\file x509_crt.h\n *\n * \\brief X.509 certificate parsing and writing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_X509_CRT_H\n#define MBEDTLS_X509_CRT_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"x509.h\"\n#include \"x509_crl.h\"\n\n/**\n * \\addtogroup x509_module\n * \\{\n */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\name Structures and functions for parsing and writing X.509 certificates\n * \\{\n */\n\n/**\n * Container for an X.509 certificate. The certificate may be chained.\n */\ntypedef struct mbedtls_x509_crt\n{\n    mbedtls_x509_buf raw;               /**< The raw certificate data (DER). */\n    mbedtls_x509_buf tbs;               /**< The raw certificate body (DER). The part that is To Be Signed. */\n\n    int version;                /**< The X.509 version. (1=v1, 2=v2, 3=v3) */\n    mbedtls_x509_buf serial;            /**< Unique id for certificate issued by a specific CA. */\n    mbedtls_x509_buf sig_oid;           /**< Signature algorithm, e.g. sha1RSA */\n\n    mbedtls_x509_buf issuer_raw;        /**< The raw issuer data (DER). Used for quick comparison. */\n    mbedtls_x509_buf subject_raw;       /**< The raw subject data (DER). Used for quick comparison. */\n\n    mbedtls_x509_name issuer;           /**< The parsed issuer data (named information object). */\n    mbedtls_x509_name subject;          /**< The parsed subject data (named information object). */\n\n    mbedtls_x509_time valid_from;       /**< Start time of certificate validity. */\n    mbedtls_x509_time valid_to;         /**< End time of certificate validity. */\n\n    mbedtls_pk_context pk;              /**< Container for the public key context. */\n\n    mbedtls_x509_buf issuer_id;         /**< Optional X.509 v2/v3 issuer unique identifier. */\n    mbedtls_x509_buf subject_id;        /**< Optional X.509 v2/v3 subject unique identifier. */\n    mbedtls_x509_buf v3_ext;            /**< Optional X.509 v3 extensions.  */\n    mbedtls_x509_sequence subject_alt_names;    /**< Optional list of Subject Alternative Names (Only dNSName supported). */\n\n    int ext_types;              /**< Bit string containing detected and parsed extensions */\n    int ca_istrue;              /**< Optional Basic Constraint extension value: 1 if this certificate belongs to a CA, 0 otherwise. */\n    int max_pathlen;            /**< Optional Basic Constraint extension value: The maximum path length to the root certificate. Path length is 1 higher than RFC 5280 'meaning', so 1+ */\n\n    unsigned int key_usage;     /**< Optional key usage extension value: See the values in x509.h */\n\n    mbedtls_x509_sequence ext_key_usage; /**< Optional list of extended key usage OIDs. */\n\n    unsigned char ns_cert_type; /**< Optional Netscape certificate type extension value: See the values in x509.h */\n\n    mbedtls_x509_buf sig;               /**< Signature: hash of the tbs part signed with the private key. */\n    mbedtls_md_type_t sig_md;           /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */\n    mbedtls_pk_type_t sig_pk;           /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */\n    void *sig_opts;             /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */\n\n    struct mbedtls_x509_crt *next;     /**< Next certificate in the CA-chain. */\n}\nmbedtls_x509_crt;\n\n/**\n * Build flag from an algorithm/curve identifier (pk, md, ecp)\n * Since 0 is always XXX_NONE, ignore it.\n */\n#define MBEDTLS_X509_ID_FLAG( id )   ( 1 << ( id - 1 ) )\n\n/**\n * Security profile for certificate verification.\n *\n * All lists are bitfields, built by ORing flags from MBEDTLS_X509_ID_FLAG().\n */\ntypedef struct\n{\n    uint32_t allowed_mds;       /**< MDs for signatures         */\n    uint32_t allowed_pks;       /**< PK algs for signatures     */\n    uint32_t allowed_curves;    /**< Elliptic curves for ECDSA  */\n    uint32_t rsa_min_bitlen;    /**< Minimum size for RSA keys  */\n}\nmbedtls_x509_crt_profile;\n\n#define MBEDTLS_X509_CRT_VERSION_1              0\n#define MBEDTLS_X509_CRT_VERSION_2              1\n#define MBEDTLS_X509_CRT_VERSION_3              2\n\n#define MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN 32\n#define MBEDTLS_X509_RFC5280_UTC_TIME_LEN   15\n\n#if !defined( MBEDTLS_X509_MAX_FILE_PATH_LEN )\n#define MBEDTLS_X509_MAX_FILE_PATH_LEN 512\n#endif\n\n/**\n * Container for writing a certificate (CRT)\n */\ntypedef struct mbedtls_x509write_cert\n{\n    int version;\n    mbedtls_mpi serial;\n    mbedtls_pk_context *subject_key;\n    mbedtls_pk_context *issuer_key;\n    mbedtls_asn1_named_data *subject;\n    mbedtls_asn1_named_data *issuer;\n    mbedtls_md_type_t md_alg;\n    char not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1];\n    char not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN + 1];\n    mbedtls_asn1_named_data *extensions;\n}\nmbedtls_x509write_cert;\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n/**\n * Default security profile. Should provide a good balance between security\n * and compatibility with current deployments.\n */\nextern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default;\n\n/**\n * Expected next default profile. Recommended for new deployments.\n * Currently targets a 128-bit security level, except for RSA-2048.\n */\nextern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next;\n\n/**\n * NSA Suite B profile.\n */\nextern const mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb;\n\n/**\n * \\brief          Parse a single DER formatted certificate and add it\n *                 to the chained list.\n *\n * \\param chain    points to the start of the chain\n * \\param buf      buffer holding the certificate DER data\n * \\param buflen   size of the buffer\n *\n * \\return         0 if successful, or a specific X509 or PEM error code\n */\nint mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *buf,\n                        size_t buflen );\n\n/**\n * \\brief          Parse one or more certificates and add them\n *                 to the chained list. Parses permissively. If some\n *                 certificates can be parsed, the result is the number\n *                 of failed certificates it encountered. If none complete\n *                 correctly, the first error is returned.\n *\n * \\param chain    points to the start of the chain\n * \\param buf      buffer holding the certificate data in PEM or DER format\n * \\param buflen   size of the buffer\n *                 (including the terminating null byte for PEM data)\n *\n * \\return         0 if all certificates parsed successfully, a positive number\n *                 if partly successful or a specific X509 or PEM error code\n */\nint mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen );\n\n#if defined(MBEDTLS_FS_IO)\n/**\n * \\brief          Load one or more certificates and add them\n *                 to the chained list. Parses permissively. If some\n *                 certificates can be parsed, the result is the number\n *                 of failed certificates it encountered. If none complete\n *                 correctly, the first error is returned.\n *\n * \\param chain    points to the start of the chain\n * \\param path     filename to read the certificates from\n *\n * \\return         0 if all certificates parsed successfully, a positive number\n *                 if partly successful or a specific X509 or PEM error code\n */\nint mbedtls_x509_crt_parse_file( mbedtls_x509_crt *chain, const char *path );\n\n/**\n * \\brief          Load one or more certificate files from a path and add them\n *                 to the chained list. Parses permissively. If some\n *                 certificates can be parsed, the result is the number\n *                 of failed certificates it encountered. If none complete\n *                 correctly, the first error is returned.\n *\n * \\param chain    points to the start of the chain\n * \\param path     directory / folder to read the certificate files from\n *\n * \\return         0 if all certificates parsed successfully, a positive number\n *                 if partly successful or a specific X509 or PEM error code\n */\nint mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path );\n#endif /* MBEDTLS_FS_IO */\n\n/**\n * \\brief          Returns an informational string about the\n *                 certificate.\n *\n * \\param buf      Buffer to write to\n * \\param size     Maximum size of buffer\n * \\param prefix   A line prefix\n * \\param crt      The X509 certificate to represent\n *\n * \\return         The length of the string written (not including the\n *                 terminated nul byte), or a negative error code.\n */\nint mbedtls_x509_crt_info( char *buf, size_t size, const char *prefix,\n                   const mbedtls_x509_crt *crt );\n\n/**\n * \\brief          Returns an informational string about the\n *                 verification status of a certificate.\n *\n * \\param buf      Buffer to write to\n * \\param size     Maximum size of buffer\n * \\param prefix   A line prefix\n * \\param flags    Verification flags created by mbedtls_x509_crt_verify()\n *\n * \\return         The length of the string written (not including the\n *                 terminated nul byte), or a negative error code.\n */\nint mbedtls_x509_crt_verify_info( char *buf, size_t size, const char *prefix,\n                          uint32_t flags );\n\n/**\n * \\brief          Verify the certificate signature\n *\n *                 The verify callback is a user-supplied callback that\n *                 can clear / modify / add flags for a certificate. If set,\n *                 the verification callback is called for each\n *                 certificate in the chain (from the trust-ca down to the\n *                 presented crt). The parameters for the callback are:\n *                 (void *parameter, mbedtls_x509_crt *crt, int certificate_depth,\n *                 int *flags). With the flags representing current flags for\n *                 that specific certificate and the certificate depth from\n *                 the bottom (Peer cert depth = 0).\n *\n *                 All flags left after returning from the callback\n *                 are also returned to the application. The function should\n *                 return 0 for anything (including invalid certificates)\n *                 other than fatal error, as a non-zero return code\n *                 immediately aborts the verification process. For fatal\n *                 errors, a specific error code should be used (different\n *                 from MBEDTLS_ERR_X509_CERT_VERIFY_FAILED which should not\n *                 be returned at this point), or MBEDTLS_ERR_X509_FATAL_ERROR\n *                 can be used if no better code is available.\n *\n * \\note           In case verification failed, the results can be displayed\n *                 using \\c mbedtls_x509_crt_verify_info()\n *\n * \\note           Same as \\c mbedtls_x509_crt_verify_with_profile() with the\n *                 default security profile.\n *\n * \\note           It is your responsibility to provide up-to-date CRLs for\n *                 all trusted CAs. If no CRL is provided for the CA that was\n *                 used to sign the certificate, CRL verification is skipped\n *                 silently, that is *without* setting any flag.\n *\n * \\param crt      a certificate (chain) to be verified\n * \\param trust_ca the list of trusted CAs\n * \\param ca_crl   the list of CRLs for trusted CAs (see note above)\n * \\param cn       expected Common Name (can be set to\n *                 NULL if the CN must not be verified)\n * \\param flags    result of the verification\n * \\param f_vrfy   verification function\n * \\param p_vrfy   verification parameter\n *\n * \\return         0 (and flags set to 0) if the chain was verified and valid,\n *                 MBEDTLS_ERR_X509_CERT_VERIFY_FAILED if the chain was verified\n *                 but found to be invalid, in which case *flags will have one\n *                 or more MBEDTLS_X509_BADCERT_XXX or MBEDTLS_X509_BADCRL_XXX\n *                 flags set, or another error (and flags set to 0xffffffff)\n *                 in case of a fatal error encountered during the\n *                 verification process.\n */\nint mbedtls_x509_crt_verify( mbedtls_x509_crt *crt,\n                     mbedtls_x509_crt *trust_ca,\n                     mbedtls_x509_crl *ca_crl,\n                     const char *cn, uint32_t *flags,\n                     int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),\n                     void *p_vrfy );\n\n/**\n * \\brief          Verify the certificate signature according to profile\n *\n * \\note           Same as \\c mbedtls_x509_crt_verify(), but with explicit\n *                 security profile.\n *\n * \\note           The restrictions on keys (RSA minimum size, allowed curves\n *                 for ECDSA) apply to all certificates: trusted root,\n *                 intermediate CAs if any, and end entity certificate.\n *\n * \\param crt      a certificate (chain) to be verified\n * \\param trust_ca the list of trusted CAs\n * \\param ca_crl   the list of CRLs for trusted CAs\n * \\param profile  security profile for verification\n * \\param cn       expected Common Name (can be set to\n *                 NULL if the CN must not be verified)\n * \\param flags    result of the verification\n * \\param f_vrfy   verification function\n * \\param p_vrfy   verification parameter\n *\n * \\return         0 if successful or MBEDTLS_ERR_X509_CERT_VERIFY_FAILED\n *                 in which case *flags will have one or more\n *                 MBEDTLS_X509_BADCERT_XXX or MBEDTLS_X509_BADCRL_XXX flags\n *                 set,\n *                 or another error in case of a fatal error encountered\n *                 during the verification process.\n */\nint mbedtls_x509_crt_verify_with_profile( mbedtls_x509_crt *crt,\n                     mbedtls_x509_crt *trust_ca,\n                     mbedtls_x509_crl *ca_crl,\n                     const mbedtls_x509_crt_profile *profile,\n                     const char *cn, uint32_t *flags,\n                     int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),\n                     void *p_vrfy );\n\n#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)\n/**\n * \\brief          Check usage of certificate against keyUsage extension.\n *\n * \\param crt      Leaf certificate used.\n * \\param usage    Intended usage(s) (eg MBEDTLS_X509_KU_KEY_ENCIPHERMENT\n *                 before using the certificate to perform an RSA key\n *                 exchange).\n *\n * \\note           Except for decipherOnly and encipherOnly, a bit set in the\n *                 usage argument means this bit MUST be set in the\n *                 certificate. For decipherOnly and encipherOnly, it means\n *                 that bit MAY be set.\n *\n * \\return         0 is these uses of the certificate are allowed,\n *                 MBEDTLS_ERR_X509_BAD_INPUT_DATA if the keyUsage extension\n *                 is present but does not match the usage argument.\n *\n * \\note           You should only call this function on leaf certificates, on\n *                 (intermediate) CAs the keyUsage extension is automatically\n *                 checked by \\c mbedtls_x509_crt_verify().\n */\nint mbedtls_x509_crt_check_key_usage( const mbedtls_x509_crt *crt,\n                                      unsigned int usage );\n#endif /* MBEDTLS_X509_CHECK_KEY_USAGE) */\n\n#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)\n/**\n * \\brief          Check usage of certificate against extentedJeyUsage.\n *\n * \\param crt      Leaf certificate used.\n * \\param usage_oid Intended usage (eg MBEDTLS_OID_SERVER_AUTH or MBEDTLS_OID_CLIENT_AUTH).\n * \\param usage_len Length of usage_oid (eg given by MBEDTLS_OID_SIZE()).\n *\n * \\return         0 if this use of the certificate is allowed,\n *                 MBEDTLS_ERR_X509_BAD_INPUT_DATA if not.\n *\n * \\note           Usually only makes sense on leaf certificates.\n */\nint mbedtls_x509_crt_check_extended_key_usage( const mbedtls_x509_crt *crt,\n                                       const char *usage_oid,\n                                       size_t usage_len );\n#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE) */\n\n#if defined(MBEDTLS_X509_CRL_PARSE_C)\n/**\n * \\brief          Verify the certificate revocation status\n *\n * \\param crt      a certificate to be verified\n * \\param crl      the CRL to verify against\n *\n * \\return         1 if the certificate is revoked, 0 otherwise\n *\n */\nint mbedtls_x509_crt_is_revoked( const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl );\n#endif /* MBEDTLS_X509_CRL_PARSE_C */\n\n/**\n * \\brief          Initialize a certificate (chain)\n *\n * \\param crt      Certificate chain to initialize\n */\nvoid mbedtls_x509_crt_init( mbedtls_x509_crt *crt );\n\n/**\n * \\brief          Unallocate all certificate data\n *\n * \\param crt      Certificate chain to free\n */\nvoid mbedtls_x509_crt_free( mbedtls_x509_crt *crt );\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n/* \\} name */\n/* \\} addtogroup x509_module */\n\n#if defined(MBEDTLS_X509_CRT_WRITE_C)\n/**\n * \\brief           Initialize a CRT writing context\n *\n * \\param ctx       CRT context to initialize\n */\nvoid mbedtls_x509write_crt_init( mbedtls_x509write_cert *ctx );\n\n/**\n * \\brief           Set the verion for a Certificate\n *                  Default: MBEDTLS_X509_CRT_VERSION_3\n *\n * \\param ctx       CRT context to use\n * \\param version   version to set (MBEDTLS_X509_CRT_VERSION_1, MBEDTLS_X509_CRT_VERSION_2 or\n *                                  MBEDTLS_X509_CRT_VERSION_3)\n */\nvoid mbedtls_x509write_crt_set_version( mbedtls_x509write_cert *ctx, int version );\n\n/**\n * \\brief           Set the serial number for a Certificate.\n *\n * \\param ctx       CRT context to use\n * \\param serial    serial number to set\n *\n * \\return          0 if successful\n */\nint mbedtls_x509write_crt_set_serial( mbedtls_x509write_cert *ctx, const mbedtls_mpi *serial );\n\n/**\n * \\brief           Set the validity period for a Certificate\n *                  Timestamps should be in string format for UTC timezone\n *                  i.e. \"YYYYMMDDhhmmss\"\n *                  e.g. \"20131231235959\" for December 31st 2013\n *                       at 23:59:59\n *\n * \\param ctx       CRT context to use\n * \\param not_before    not_before timestamp\n * \\param not_after     not_after timestamp\n *\n * \\return          0 if timestamp was parsed successfully, or\n *                  a specific error code\n */\nint mbedtls_x509write_crt_set_validity( mbedtls_x509write_cert *ctx, const char *not_before,\n                                const char *not_after );\n\n/**\n * \\brief           Set the issuer name for a Certificate\n *                  Issuer names should contain a comma-separated list\n *                  of OID types and values:\n *                  e.g. \"C=UK,O=ARM,CN=mbed TLS CA\"\n *\n * \\param ctx           CRT context to use\n * \\param issuer_name   issuer name to set\n *\n * \\return          0 if issuer name was parsed successfully, or\n *                  a specific error code\n */\nint mbedtls_x509write_crt_set_issuer_name( mbedtls_x509write_cert *ctx,\n                                   const char *issuer_name );\n\n/**\n * \\brief           Set the subject name for a Certificate\n *                  Subject names should contain a comma-separated list\n *                  of OID types and values:\n *                  e.g. \"C=UK,O=ARM,CN=mbed TLS Server 1\"\n *\n * \\param ctx           CRT context to use\n * \\param subject_name  subject name to set\n *\n * \\return          0 if subject name was parsed successfully, or\n *                  a specific error code\n */\nint mbedtls_x509write_crt_set_subject_name( mbedtls_x509write_cert *ctx,\n                                    const char *subject_name );\n\n/**\n * \\brief           Set the subject public key for the certificate\n *\n * \\param ctx       CRT context to use\n * \\param key       public key to include\n */\nvoid mbedtls_x509write_crt_set_subject_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key );\n\n/**\n * \\brief           Set the issuer key used for signing the certificate\n *\n * \\param ctx       CRT context to use\n * \\param key       private key to sign with\n */\nvoid mbedtls_x509write_crt_set_issuer_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key );\n\n/**\n * \\brief           Set the MD algorithm to use for the signature\n *                  (e.g. MBEDTLS_MD_SHA1)\n *\n * \\param ctx       CRT context to use\n * \\param md_alg    MD algorithm to use\n */\nvoid mbedtls_x509write_crt_set_md_alg( mbedtls_x509write_cert *ctx, mbedtls_md_type_t md_alg );\n\n/**\n * \\brief           Generic function to add to or replace an extension in the\n *                  CRT\n *\n * \\param ctx       CRT context to use\n * \\param oid       OID of the extension\n * \\param oid_len   length of the OID\n * \\param critical  if the extension is critical (per the RFC's definition)\n * \\param val       value of the extension OCTET STRING\n * \\param val_len   length of the value data\n *\n * \\return          0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED\n */\nint mbedtls_x509write_crt_set_extension( mbedtls_x509write_cert *ctx,\n                                 const char *oid, size_t oid_len,\n                                 int critical,\n                                 const unsigned char *val, size_t val_len );\n\n/**\n * \\brief           Set the basicConstraints extension for a CRT\n *\n * \\param ctx       CRT context to use\n * \\param is_ca     is this a CA certificate\n * \\param max_pathlen   maximum length of certificate chains below this\n *                      certificate (only for CA certificates, -1 is\n *                      inlimited)\n *\n * \\return          0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED\n */\nint mbedtls_x509write_crt_set_basic_constraints( mbedtls_x509write_cert *ctx,\n                                         int is_ca, int max_pathlen );\n\n#if defined(MBEDTLS_SHA1_C)\n/**\n * \\brief           Set the subjectKeyIdentifier extension for a CRT\n *                  Requires that mbedtls_x509write_crt_set_subject_key() has been\n *                  called before\n *\n * \\param ctx       CRT context to use\n *\n * \\return          0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED\n */\nint mbedtls_x509write_crt_set_subject_key_identifier( mbedtls_x509write_cert *ctx );\n\n/**\n * \\brief           Set the authorityKeyIdentifier extension for a CRT\n *                  Requires that mbedtls_x509write_crt_set_issuer_key() has been\n *                  called before\n *\n * \\param ctx       CRT context to use\n *\n * \\return          0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED\n */\nint mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *ctx );\n#endif /* MBEDTLS_SHA1_C */\n\n/**\n * \\brief           Set the Key Usage Extension flags\n *                  (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN)\n *\n * \\param ctx       CRT context to use\n * \\param key_usage key usage flags to set\n *\n * \\return          0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED\n */\nint mbedtls_x509write_crt_set_key_usage( mbedtls_x509write_cert *ctx,\n                                         unsigned int key_usage );\n\n/**\n * \\brief           Set the Netscape Cert Type flags\n *                  (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL)\n *\n * \\param ctx           CRT context to use\n * \\param ns_cert_type  Netscape Cert Type flags to set\n *\n * \\return          0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED\n */\nint mbedtls_x509write_crt_set_ns_cert_type( mbedtls_x509write_cert *ctx,\n                                    unsigned char ns_cert_type );\n\n/**\n * \\brief           Free the contents of a CRT write context\n *\n * \\param ctx       CRT context to free\n */\nvoid mbedtls_x509write_crt_free( mbedtls_x509write_cert *ctx );\n\n/**\n * \\brief           Write a built up certificate to a X509 DER structure\n *                  Note: data is written at the end of the buffer! Use the\n *                        return value to determine where you should start\n *                        using the buffer\n *\n * \\param ctx       certificate to write away\n * \\param buf       buffer to write to\n * \\param size      size of the buffer\n * \\param f_rng     RNG function (for signature, see note)\n * \\param p_rng     RNG parameter\n *\n * \\return          length of data written if successful, or a specific\n *                  error code\n *\n * \\note            f_rng may be NULL if RSA is used for signature and the\n *                  signature is made offline (otherwise f_rng is desirable\n *                  for countermeasures against timing attacks).\n *                  ECDSA signatures always require a non-NULL f_rng.\n */\nint mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng );\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n/**\n * \\brief           Write a built up certificate to a X509 PEM string\n *\n * \\param ctx       certificate to write away\n * \\param buf       buffer to write to\n * \\param size      size of the buffer\n * \\param f_rng     RNG function (for signature, see note)\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successful, or a specific error code\n *\n * \\note            f_rng may be NULL if RSA is used for signature and the\n *                  signature is made offline (otherwise f_rng is desirable\n *                  for countermeasures against timing attacks).\n *                  ECDSA signatures always require a non-NULL f_rng.\n */\nint mbedtls_x509write_crt_pem( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng );\n#endif /* MBEDTLS_PEM_WRITE_C */\n#endif /* MBEDTLS_X509_CRT_WRITE_C */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* mbedtls_x509_crt.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/x509_csr.h",
    "content": "/**\n * \\file x509_csr.h\n *\n * \\brief X.509 certificate signing request parsing and writing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_X509_CSR_H\n#define MBEDTLS_X509_CSR_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"x509.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\addtogroup x509_module\n * \\{ */\n\n/**\n * \\name Structures and functions for X.509 Certificate Signing Requests (CSR)\n * \\{\n */\n\n/**\n * Certificate Signing Request (CSR) structure.\n */\ntypedef struct mbedtls_x509_csr\n{\n    mbedtls_x509_buf raw;           /**< The raw CSR data (DER). */\n    mbedtls_x509_buf cri;           /**< The raw CertificateRequestInfo body (DER). */\n\n    int version;            /**< CSR version (1=v1). */\n\n    mbedtls_x509_buf  subject_raw;  /**< The raw subject data (DER). */\n    mbedtls_x509_name subject;      /**< The parsed subject data (named information object). */\n\n    mbedtls_pk_context pk;          /**< Container for the public key context. */\n\n    mbedtls_x509_buf sig_oid;\n    mbedtls_x509_buf sig;\n    mbedtls_md_type_t sig_md;       /**< Internal representation of the MD algorithm of the signature algorithm, e.g. MBEDTLS_MD_SHA256 */\n    mbedtls_pk_type_t sig_pk;       /**< Internal representation of the Public Key algorithm of the signature algorithm, e.g. MBEDTLS_PK_RSA */\n    void *sig_opts;         /**< Signature options to be passed to mbedtls_pk_verify_ext(), e.g. for RSASSA-PSS */\n}\nmbedtls_x509_csr;\n\n/**\n * Container for writing a CSR\n */\ntypedef struct mbedtls_x509write_csr\n{\n    mbedtls_pk_context *key;\n    mbedtls_asn1_named_data *subject;\n    mbedtls_md_type_t md_alg;\n    mbedtls_asn1_named_data *extensions;\n}\nmbedtls_x509write_csr;\n\n#if defined(MBEDTLS_X509_CSR_PARSE_C)\n/**\n * \\brief          Load a Certificate Signing Request (CSR) in DER format\n *\n * \\note           CSR attributes (if any) are currently silently ignored.\n *\n * \\param csr      CSR context to fill\n * \\param buf      buffer holding the CRL data\n * \\param buflen   size of the buffer\n *\n * \\return         0 if successful, or a specific X509 error code\n */\nint mbedtls_x509_csr_parse_der( mbedtls_x509_csr *csr,\n                        const unsigned char *buf, size_t buflen );\n\n/**\n * \\brief          Load a Certificate Signing Request (CSR), DER or PEM format\n *\n * \\note           See notes for \\c mbedtls_x509_csr_parse_der()\n *\n * \\param csr      CSR context to fill\n * \\param buf      buffer holding the CRL data\n * \\param buflen   size of the buffer\n *                 (including the terminating null byte for PEM data)\n *\n * \\return         0 if successful, or a specific X509 or PEM error code\n */\nint mbedtls_x509_csr_parse( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen );\n\n#if defined(MBEDTLS_FS_IO)\n/**\n * \\brief          Load a Certificate Signing Request (CSR)\n *\n * \\note           See notes for \\c mbedtls_x509_csr_parse()\n *\n * \\param csr      CSR context to fill\n * \\param path     filename to read the CSR from\n *\n * \\return         0 if successful, or a specific X509 or PEM error code\n */\nint mbedtls_x509_csr_parse_file( mbedtls_x509_csr *csr, const char *path );\n#endif /* MBEDTLS_FS_IO */\n\n/**\n * \\brief          Returns an informational string about the\n *                 CSR.\n *\n * \\param buf      Buffer to write to\n * \\param size     Maximum size of buffer\n * \\param prefix   A line prefix\n * \\param csr      The X509 CSR to represent\n *\n * \\return         The length of the string written (not including the\n *                 terminated nul byte), or a negative error code.\n */\nint mbedtls_x509_csr_info( char *buf, size_t size, const char *prefix,\n                   const mbedtls_x509_csr *csr );\n\n/**\n * \\brief          Initialize a CSR\n *\n * \\param csr      CSR to initialize\n */\nvoid mbedtls_x509_csr_init( mbedtls_x509_csr *csr );\n\n/**\n * \\brief          Unallocate all CSR data\n *\n * \\param csr      CSR to free\n */\nvoid mbedtls_x509_csr_free( mbedtls_x509_csr *csr );\n#endif /* MBEDTLS_X509_CSR_PARSE_C */\n\n/* \\} name */\n/* \\} addtogroup x509_module */\n\n#if defined(MBEDTLS_X509_CSR_WRITE_C)\n/**\n * \\brief           Initialize a CSR context\n *\n * \\param ctx       CSR context to initialize\n */\nvoid mbedtls_x509write_csr_init( mbedtls_x509write_csr *ctx );\n\n/**\n * \\brief           Set the subject name for a CSR\n *                  Subject names should contain a comma-separated list\n *                  of OID types and values:\n *                  e.g. \"C=UK,O=ARM,CN=mbed TLS Server 1\"\n *\n * \\param ctx           CSR context to use\n * \\param subject_name  subject name to set\n *\n * \\return          0 if subject name was parsed successfully, or\n *                  a specific error code\n */\nint mbedtls_x509write_csr_set_subject_name( mbedtls_x509write_csr *ctx,\n                                    const char *subject_name );\n\n/**\n * \\brief           Set the key for a CSR (public key will be included,\n *                  private key used to sign the CSR when writing it)\n *\n * \\param ctx       CSR context to use\n * \\param key       Asymetric key to include\n */\nvoid mbedtls_x509write_csr_set_key( mbedtls_x509write_csr *ctx, mbedtls_pk_context *key );\n\n/**\n * \\brief           Set the MD algorithm to use for the signature\n *                  (e.g. MBEDTLS_MD_SHA1)\n *\n * \\param ctx       CSR context to use\n * \\param md_alg    MD algorithm to use\n */\nvoid mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg );\n\n/**\n * \\brief           Set the Key Usage Extension flags\n *                  (e.g. MBEDTLS_X509_KU_DIGITAL_SIGNATURE | MBEDTLS_X509_KU_KEY_CERT_SIGN)\n *\n * \\param ctx       CSR context to use\n * \\param key_usage key usage flags to set\n *\n * \\return          0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED\n */\nint mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage );\n\n/**\n * \\brief           Set the Netscape Cert Type flags\n *                  (e.g. MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT | MBEDTLS_X509_NS_CERT_TYPE_EMAIL)\n *\n * \\param ctx           CSR context to use\n * \\param ns_cert_type  Netscape Cert Type flags to set\n *\n * \\return          0 if successful, or MBEDTLS_ERR_X509_ALLOC_FAILED\n */\nint mbedtls_x509write_csr_set_ns_cert_type( mbedtls_x509write_csr *ctx,\n                                    unsigned char ns_cert_type );\n\n/**\n * \\brief           Generic function to add to or replace an extension in the\n *                  CSR\n *\n * \\param ctx       CSR context to use\n * \\param oid       OID of the extension\n * \\param oid_len   length of the OID\n * \\param val       value of the extension OCTET STRING\n * \\param val_len   length of the value data\n *\n * \\return          0 if successful, or a MBEDTLS_ERR_X509_ALLOC_FAILED\n */\nint mbedtls_x509write_csr_set_extension( mbedtls_x509write_csr *ctx,\n                                 const char *oid, size_t oid_len,\n                                 const unsigned char *val, size_t val_len );\n\n/**\n * \\brief           Free the contents of a CSR context\n *\n * \\param ctx       CSR context to free\n */\nvoid mbedtls_x509write_csr_free( mbedtls_x509write_csr *ctx );\n\n/**\n * \\brief           Write a CSR (Certificate Signing Request) to a\n *                  DER structure\n *                  Note: data is written at the end of the buffer! Use the\n *                        return value to determine where you should start\n *                        using the buffer\n *\n * \\param ctx       CSR to write away\n * \\param buf       buffer to write to\n * \\param size      size of the buffer\n * \\param f_rng     RNG function (for signature, see note)\n * \\param p_rng     RNG parameter\n *\n * \\return          length of data written if successful, or a specific\n *                  error code\n *\n * \\note            f_rng may be NULL if RSA is used for signature and the\n *                  signature is made offline (otherwise f_rng is desirable\n *                  for countermeasures against timing attacks).\n *                  ECDSA signatures always require a non-NULL f_rng.\n */\nint mbedtls_x509write_csr_der( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng );\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n/**\n * \\brief           Write a CSR (Certificate Signing Request) to a\n *                  PEM string\n *\n * \\param ctx       CSR to write away\n * \\param buf       buffer to write to\n * \\param size      size of the buffer\n * \\param f_rng     RNG function (for signature, see note)\n * \\param p_rng     RNG parameter\n *\n * \\return          0 if successful, or a specific error code\n *\n * \\note            f_rng may be NULL if RSA is used for signature and the\n *                  signature is made offline (otherwise f_rng is desirable\n *                  for countermeasures against timing attacks).\n *                  ECDSA signatures always require a non-NULL f_rng.\n */\nint mbedtls_x509write_csr_pem( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng );\n#endif /* MBEDTLS_PEM_WRITE_C */\n#endif /* MBEDTLS_X509_CSR_WRITE_C */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* mbedtls_x509_csr.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/include/mbedtls/xtea.h",
    "content": "/**\n * \\file xtea.h\n *\n * \\brief XTEA block cipher (32-bit)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n#ifndef MBEDTLS_XTEA_H\n#define MBEDTLS_XTEA_H\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include <stddef.h>\n#include <stdint.h>\n\n#define MBEDTLS_XTEA_ENCRYPT     1\n#define MBEDTLS_XTEA_DECRYPT     0\n\n#define MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH             -0x0028  /**< The data input has an invalid length. */\n\n#if !defined(MBEDTLS_XTEA_ALT)\n// Regular implementation\n//\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          XTEA context structure\n */\ntypedef struct\n{\n    uint32_t k[4];       /*!< key */\n}\nmbedtls_xtea_context;\n\n/**\n * \\brief          Initialize XTEA context\n *\n * \\param ctx      XTEA context to be initialized\n */\nvoid mbedtls_xtea_init( mbedtls_xtea_context *ctx );\n\n/**\n * \\brief          Clear XTEA context\n *\n * \\param ctx      XTEA context to be cleared\n */\nvoid mbedtls_xtea_free( mbedtls_xtea_context *ctx );\n\n/**\n * \\brief          XTEA key schedule\n *\n * \\param ctx      XTEA context to be initialized\n * \\param key      the secret key\n */\nvoid mbedtls_xtea_setup( mbedtls_xtea_context *ctx, const unsigned char key[16] );\n\n/**\n * \\brief          XTEA cipher function\n *\n * \\param ctx      XTEA context\n * \\param mode     MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT\n * \\param input    8-byte input block\n * \\param output   8-byte output block\n *\n * \\return         0 if successful\n */\nint mbedtls_xtea_crypt_ecb( mbedtls_xtea_context *ctx,\n                    int mode,\n                    const unsigned char input[8],\n                    unsigned char output[8] );\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/**\n * \\brief          XTEA CBC cipher function\n *\n * \\param ctx      XTEA context\n * \\param mode     MBEDTLS_XTEA_ENCRYPT or MBEDTLS_XTEA_DECRYPT\n * \\param length   the length of input, multiple of 8\n * \\param iv       initialization vector for CBC mode\n * \\param input    input block\n * \\param output   output block\n *\n * \\return         0 if successful,\n *                 MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH if the length % 8 != 0\n */\nint mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx,\n                    int mode,\n                    size_t length,\n                    unsigned char iv[8],\n                    const unsigned char *input,\n                    unsigned char *output);\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#ifdef __cplusplus\n}\n#endif\n\n#else  /* MBEDTLS_XTEA_ALT */\n#include \"xtea_alt.h\"\n#endif /* MBEDTLS_XTEA_ALT */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * \\brief          Checkup routine\n *\n * \\return         0 if successful, or 1 if the test failed\n */\nint mbedtls_xtea_self_test( int verbose );\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* xtea.h */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/.gitignore",
    "content": "*.o\nlibmbed*\n*.sln\n*.vcxproj\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/CMakeLists.txt",
    "content": "option(USE_STATIC_MBEDTLS_LIBRARY \"Build mbed TLS static library.\" ON)\noption(USE_SHARED_MBEDTLS_LIBRARY \"Build mbed TLS shared library.\" OFF)\noption(LINK_WITH_PTHREAD \"Explicitly link mbed TLS library to pthread.\" OFF)\n\nset(src_crypto\n    aes.c\n    aesni.c\n    arc4.c\n    asn1parse.c\n    asn1write.c\n    base64.c\n    bignum.c\n    blowfish.c\n    camellia.c\n    ccm.c\n    cipher.c\n    cipher_wrap.c\n    cmac.c\n    ctr_drbg.c\n    des.c\n    dhm.c\n    ecdh.c\n    ecdsa.c\n    ecjpake.c\n    ecp.c\n    ecp_curves.c\n    entropy.c\n    entropy_poll.c\n    error.c\n    gcm.c\n    havege.c\n    hmac_drbg.c\n    md.c\n    md2.c\n    md4.c\n    md5.c\n    md_wrap.c\n    memory_buffer_alloc.c\n    oid.c\n    padlock.c\n    pem.c\n    pk.c\n    pk_wrap.c\n    pkcs12.c\n    pkcs5.c\n    pkparse.c\n    pkwrite.c\n    platform.c\n    ripemd160.c\n    rsa.c\n    sha1.c\n    sha256.c\n    sha512.c\n    threading.c\n    timing.c\n    version.c\n    version_features.c\n    xtea.c\n)\n\nset(src_x509\n    certs.c\n    pkcs11.c\n    x509.c\n    x509_create.c\n    x509_crl.c\n    x509_crt.c\n    x509_csr.c\n    x509write_crt.c\n    x509write_csr.c\n)\n\nset(src_tls\n    debug.c\n    net_sockets.c\n    ssl_cache.c\n    ssl_ciphersuites.c\n    ssl_cli.c\n    ssl_cookie.c\n    ssl_srv.c\n    ssl_ticket.c\n    ssl_tls.c\n)\n\nif(CMAKE_COMPILER_IS_GNUCC)\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes\")\nendif(CMAKE_COMPILER_IS_GNUCC)\n\nif(CMAKE_COMPILER_IS_CLANG)\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wmissing-declarations -Wmissing-prototypes -Wdocumentation -Wno-documentation-deprecated-sync -Wunreachable-code\")\nendif(CMAKE_COMPILER_IS_CLANG)\n\nif(WIN32)\n    set(libs ${libs} ws2_32)\nendif(WIN32)\n\nif(USE_PKCS11_HELPER_LIBRARY)\n    set(libs ${libs} pkcs11-helper)\nendif(USE_PKCS11_HELPER_LIBRARY)\n\nif(ENABLE_ZLIB_SUPPORT)\n    set(libs ${libs} ${ZLIB_LIBRARIES})\nendif(ENABLE_ZLIB_SUPPORT)\n\nif(LINK_WITH_PTHREAD)\n    set(libs ${libs} pthread)\nendif()\n\nif (NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY)\n    message(FATAL_ERROR \"Need to choose static or shared mbedtls build!\")\nendif(NOT USE_STATIC_MBEDTLS_LIBRARY AND NOT USE_SHARED_MBEDTLS_LIBRARY)\n\nif(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY)\n    set(mbedtls_static_target \"mbedtls_static\")\n    set(mbedx509_static_target \"mbedx509_static\")\n    set(mbedcrypto_static_target \"mbedcrypto_static\")\nelseif(USE_STATIC_MBEDTLS_LIBRARY)\n    set(mbedtls_static_target \"mbedtls\")\n    set(mbedx509_static_target \"mbedx509\")\n    set(mbedcrypto_static_target \"mbedcrypto\")\nendif()\n\nif(USE_STATIC_MBEDTLS_LIBRARY)\n    add_library(${mbedcrypto_static_target} STATIC ${src_crypto})\n    set_target_properties(${mbedcrypto_static_target} PROPERTIES OUTPUT_NAME mbedcrypto)\n    target_link_libraries(${mbedcrypto_static_target} ${libs})\n\n    add_library(${mbedx509_static_target} STATIC ${src_x509})\n    set_target_properties(${mbedx509_static_target} PROPERTIES OUTPUT_NAME mbedx509)\n    target_link_libraries(${mbedx509_static_target} ${libs} ${mbedcrypto_static_target})\n\n    add_library(${mbedtls_static_target} STATIC ${src_tls})\n    set_target_properties(${mbedtls_static_target} PROPERTIES OUTPUT_NAME mbedtls)\n    target_link_libraries(${mbedtls_static_target} ${libs} ${mbedx509_static_target})\n\n    install(TARGETS ${mbedtls_static_target} ${mbedx509_static_target} ${mbedcrypto_static_target}\n            DESTINATION ${LIB_INSTALL_DIR}\n            PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\nendif(USE_STATIC_MBEDTLS_LIBRARY)\n\nif(USE_SHARED_MBEDTLS_LIBRARY)\n    add_library(mbedcrypto SHARED ${src_crypto})\n    set_target_properties(mbedcrypto PROPERTIES VERSION 2.6.0 SOVERSION 0)\n    target_link_libraries(mbedcrypto ${libs})\n\n    add_library(mbedx509 SHARED ${src_x509})\n    set_target_properties(mbedx509 PROPERTIES VERSION 2.6.0 SOVERSION 0)\n    target_link_libraries(mbedx509 ${libs} mbedcrypto)\n\n    add_library(mbedtls SHARED ${src_tls})\n    set_target_properties(mbedtls PROPERTIES VERSION 2.6.0 SOVERSION 10)\n    target_link_libraries(mbedtls ${libs} mbedx509)\n\n    install(TARGETS mbedtls mbedx509 mbedcrypto\n            DESTINATION ${LIB_INSTALL_DIR}\n            PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\nendif(USE_SHARED_MBEDTLS_LIBRARY)\n\nadd_custom_target(lib DEPENDS mbedcrypto mbedx509 mbedtls)\nif(USE_STATIC_MBEDTLS_LIBRARY AND USE_SHARED_MBEDTLS_LIBRARY)\n    add_dependencies(lib mbedcrypto_static mbedx509_static mbedtls_static)\nendif()\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/Makefile",
    "content": "\n# Also see \"include/mbedtls/config.h\"\n\nCFLAGS\t?= -O2\nWARNING_CFLAGS ?=  -Wall -W -Wdeclaration-after-statement\nLDFLAGS ?=\n\nLOCAL_CFLAGS = $(WARNING_CFLAGS) -I../include -D_FILE_OFFSET_BITS=64\nLOCAL_LDFLAGS =\n\nifdef DEBUG\nLOCAL_CFLAGS += -g3\nendif\n\n# MicroBlaze specific options:\n# CFLAGS += -mno-xl-soft-mul -mxl-barrel-shift\n\n# To compile on Plan9:\n# CFLAGS += -D_BSD_EXTENSION\n\n# if were running on Windows build for Windows\nifdef WINDOWS\nWINDOWS_BUILD=1\nendif\n\n# To compile as a shared library:\nifdef SHARED\n# all code is position-indep with mingw, avoid warning about useless flag\nifndef WINDOWS_BUILD\nLOCAL_CFLAGS += -fPIC -fpic\nendif\nendif\n\nSOEXT_TLS=so.10\nSOEXT_X509=so.0\nSOEXT_CRYPTO=so.0\n\nDLEXT=so\n# OSX shared library extension:\n# DLEXT=dylib\n\n# Windows shared library extension:\nifdef WINDOWS_BUILD\nDLEXT=dll\nendif\n\nOBJS_CRYPTO=\taes.o\t\taesni.o\t\tarc4.o\t\t\\\n\t\tasn1parse.o\tasn1write.o\tbase64.o\t\\\n\t\tbignum.o\tblowfish.o\tcamellia.o\t\\\n\t\tccm.o\t\tcipher.o\tcipher_wrap.o\t\\\n\t\tcmac.o\t\tctr_drbg.o\tdes.o\t\t\\\n\t\tdhm.o\t\tecdh.o\t\tecdsa.o\t\t\\\n\t\tecjpake.o\tecp.o\t\t\t\t\\\n\t\tecp_curves.o\tentropy.o\tentropy_poll.o\t\\\n\t\terror.o\t\tgcm.o\t\thavege.o\t\\\n\t\thmac_drbg.o\tmd.o\t\tmd2.o\t\t\\\n\t\tmd4.o\t\tmd5.o\t\tmd_wrap.o\t\\\n\t\tmemory_buffer_alloc.o\t\toid.o\t\t\\\n\t\tpadlock.o\tpem.o\t\tpk.o\t\t\\\n\t\tpk_wrap.o\tpkcs12.o\tpkcs5.o\t\t\\\n\t\tpkparse.o\tpkwrite.o\tplatform.o\t\\\n\t\tripemd160.o\trsa.o\t\tsha1.o\t\t\\\n\t\tsha256.o\tsha512.o\tthreading.o\t\\\n\t\ttiming.o\tversion.o\t\t\t\\\n\t\tversion_features.o\t\txtea.o\n\nOBJS_X509=\tcerts.o\t\tpkcs11.o\tx509.o\t\t\\\n\t\tx509_create.o\tx509_crl.o\tx509_crt.o\t\\\n\t\tx509_csr.o\tx509write_crt.o\tx509write_csr.o\n\nOBJS_TLS=\tdebug.o\t\tnet_sockets.o\t\t\\\n\t\tssl_cache.o\tssl_ciphersuites.o\t\\\n\t\tssl_cli.o\tssl_cookie.o\t\t\\\n\t\tssl_srv.o\tssl_ticket.o\t\t\\\n\t\tssl_tls.o\n\n.SILENT:\n\n.PHONY: all static shared clean\n\nifndef SHARED\nall: static\nelse\nall: shared static\nendif\n\nstatic: libmbedcrypto.a libmbedx509.a libmbedtls.a\n\nshared: libmbedcrypto.$(DLEXT) libmbedx509.$(DLEXT) libmbedtls.$(DLEXT)\n\n# tls\nlibmbedtls.a: $(OBJS_TLS)\n\techo \"  AR    $@\"\n\t$(AR) -rc $@ $(OBJS_TLS)\n\techo \"  RL    $@\"\n\t$(AR) -s $@\n\nlibmbedtls.$(SOEXT_TLS): $(OBJS_TLS) libmbedx509.so\n\techo \"  LD    $@\"\n\t$(CC) -shared -Wl,-soname,$@ -L. -lmbedcrypto -lmbedx509 $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@ $(OBJS_TLS)\n\nlibmbedtls.so: libmbedtls.$(SOEXT_TLS)\n\techo \"  LN    $@ -> $<\"\n\tln -sf $< $@\n\nlibmbedtls.dylib: $(OBJS_TLS)\n\techo \"  LD    $@\"\n\t$(CC) -dynamiclib $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@ $(OBJS_TLS)\n\nlibmbedtls.dll: $(OBJS_TLS) libmbedx509.dll\n\techo \"  LD    $@\"\n\t$(CC) -shared -Wl,-soname,$@ -Wl,--out-implib,$@.a -o $@ $(OBJS_TLS) -lws2_32 -lwinmm -lgdi32 -L. -lmbedcrypto -lmbedx509 -static-libgcc $(LOCAL_LDFLAGS) $(LDFLAGS)\n\n# x509\nlibmbedx509.a: $(OBJS_X509)\n\techo \"  AR    $@\"\n\t$(AR) -rc $@ $(OBJS_X509)\n\techo \"  RL    $@\"\n\t$(AR) -s $@\n\nlibmbedx509.$(SOEXT_X509): $(OBJS_X509) libmbedcrypto.so\n\techo \"  LD    $@\"\n\t$(CC) -shared -Wl,-soname,$@ -L. -lmbedcrypto $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@ $(OBJS_X509)\n\nlibmbedx509.so: libmbedx509.$(SOEXT_X509)\n\techo \"  LN    $@ -> $<\"\n\tln -sf $< $@\n\nlibmbedx509.dylib: $(OBJS_X509)\n\techo \"  LD    $@\"\n\t$(CC) -dynamiclib $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@ $(OBJS_X509)\n\nlibmbedx509.dll: $(OBJS_X509) libmbedcrypto.dll\n\techo \"  LD    $@\"\n\t$(CC) -shared -Wl,-soname,$@ -Wl,--out-implib,$@.a -o $@ $(OBJS_X509) -lws2_32 -lwinmm -lgdi32 -L. -lmbedcrypto -static-libgcc $(LOCAL_LDFLAGS) $(LDFLAGS)\n\n# crypto\nlibmbedcrypto.a: $(OBJS_CRYPTO)\n\techo \"  AR    $@\"\n\t$(AR) -rc $@ $(OBJS_CRYPTO)\n\techo \"  RL    $@\"\n\t$(AR) -s $@\n\nlibmbedcrypto.$(SOEXT_CRYPTO): $(OBJS_CRYPTO)\n\techo \"  LD    $@\"\n\t$(CC) -shared -Wl,-soname,$@ $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@ $(OBJS_CRYPTO)\n\nlibmbedcrypto.so: libmbedcrypto.$(SOEXT_CRYPTO)\n\techo \"  LN    $@ -> $<\"\n\tln -sf $< $@\n\nlibmbedcrypto.dylib: $(OBJS_CRYPTO)\n\techo \"  LD    $@\"\n\t$(CC) -dynamiclib $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@ $(OBJS_CRYPTO)\n\nlibmbedcrypto.dll: $(OBJS_CRYPTO)\n\techo \"  LD    $@\"\n\t$(CC) -shared -Wl,-soname,$@ -Wl,--out-implib,$@.a -o $@ $(OBJS_CRYPTO) -lws2_32 -lwinmm -lgdi32 -static-libgcc $(LOCAL_LDFLAGS) $(LDFLAGS)\n\n.c.o:\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) -c $<\n\nclean:\nifndef WINDOWS\n\trm -f *.o libmbed*\nelse\n\tdel /Q /F *.o libmbed*\nendif\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/aes.c",
    "content": "/*\n *  FIPS-197 compliant AES implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The AES block cipher was designed by Vincent Rijmen and Joan Daemen.\n *\n *  http://csrc.nist.gov/encryption/aes/rijndael/Rijndael.pdf\n *  http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_AES_C)\n\n#include <string.h>\n\n#include \"mbedtls/aes.h\"\n#if defined(MBEDTLS_PADLOCK_C)\n#include \"mbedtls/padlock.h\"\n#endif\n#if defined(MBEDTLS_AESNI_C)\n#include \"mbedtls/aesni.h\"\n#endif\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_AES_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\n/*\n * 32-bit integer manipulation macros (little endian)\n */\n#ifndef GET_UINT32_LE\n#define GET_UINT32_LE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint32_t) (b)[(i)    ]       )             \\\n        | ( (uint32_t) (b)[(i) + 1] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 2] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 3] << 24 );            \\\n}\n#endif\n\n#ifndef PUT_UINT32_LE\n#define PUT_UINT32_LE(n,b,i)                                    \\\n{                                                               \\\n    (b)[(i)    ] = (unsigned char) ( ( (n)       ) & 0xFF );    \\\n    (b)[(i) + 1] = (unsigned char) ( ( (n) >>  8 ) & 0xFF );    \\\n    (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF );    \\\n    (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF );    \\\n}\n#endif\n\n#if defined(MBEDTLS_PADLOCK_C) &&                      \\\n    ( defined(MBEDTLS_HAVE_X86) || defined(MBEDTLS_PADLOCK_ALIGN16) )\nstatic int aes_padlock_ace = -1;\n#endif\n\n#if defined(MBEDTLS_AES_ROM_TABLES)\n/*\n * Forward S-box\n */\nstatic const unsigned char FSb[256] =\n{\n    0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,\n    0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,\n    0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,\n    0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,\n    0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,\n    0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,\n    0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,\n    0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,\n    0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,\n    0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,\n    0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,\n    0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,\n    0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,\n    0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,\n    0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,\n    0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,\n    0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,\n    0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,\n    0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,\n    0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,\n    0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,\n    0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,\n    0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,\n    0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,\n    0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,\n    0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,\n    0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,\n    0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,\n    0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,\n    0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,\n    0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,\n    0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16\n};\n\n/*\n * Forward tables\n */\n#define FT \\\n\\\n    V(A5,63,63,C6), V(84,7C,7C,F8), V(99,77,77,EE), V(8D,7B,7B,F6), \\\n    V(0D,F2,F2,FF), V(BD,6B,6B,D6), V(B1,6F,6F,DE), V(54,C5,C5,91), \\\n    V(50,30,30,60), V(03,01,01,02), V(A9,67,67,CE), V(7D,2B,2B,56), \\\n    V(19,FE,FE,E7), V(62,D7,D7,B5), V(E6,AB,AB,4D), V(9A,76,76,EC), \\\n    V(45,CA,CA,8F), V(9D,82,82,1F), V(40,C9,C9,89), V(87,7D,7D,FA), \\\n    V(15,FA,FA,EF), V(EB,59,59,B2), V(C9,47,47,8E), V(0B,F0,F0,FB), \\\n    V(EC,AD,AD,41), V(67,D4,D4,B3), V(FD,A2,A2,5F), V(EA,AF,AF,45), \\\n    V(BF,9C,9C,23), V(F7,A4,A4,53), V(96,72,72,E4), V(5B,C0,C0,9B), \\\n    V(C2,B7,B7,75), V(1C,FD,FD,E1), V(AE,93,93,3D), V(6A,26,26,4C), \\\n    V(5A,36,36,6C), V(41,3F,3F,7E), V(02,F7,F7,F5), V(4F,CC,CC,83), \\\n    V(5C,34,34,68), V(F4,A5,A5,51), V(34,E5,E5,D1), V(08,F1,F1,F9), \\\n    V(93,71,71,E2), V(73,D8,D8,AB), V(53,31,31,62), V(3F,15,15,2A), \\\n    V(0C,04,04,08), V(52,C7,C7,95), V(65,23,23,46), V(5E,C3,C3,9D), \\\n    V(28,18,18,30), V(A1,96,96,37), V(0F,05,05,0A), V(B5,9A,9A,2F), \\\n    V(09,07,07,0E), V(36,12,12,24), V(9B,80,80,1B), V(3D,E2,E2,DF), \\\n    V(26,EB,EB,CD), V(69,27,27,4E), V(CD,B2,B2,7F), V(9F,75,75,EA), \\\n    V(1B,09,09,12), V(9E,83,83,1D), V(74,2C,2C,58), V(2E,1A,1A,34), \\\n    V(2D,1B,1B,36), V(B2,6E,6E,DC), V(EE,5A,5A,B4), V(FB,A0,A0,5B), \\\n    V(F6,52,52,A4), V(4D,3B,3B,76), V(61,D6,D6,B7), V(CE,B3,B3,7D), \\\n    V(7B,29,29,52), V(3E,E3,E3,DD), V(71,2F,2F,5E), V(97,84,84,13), \\\n    V(F5,53,53,A6), V(68,D1,D1,B9), V(00,00,00,00), V(2C,ED,ED,C1), \\\n    V(60,20,20,40), V(1F,FC,FC,E3), V(C8,B1,B1,79), V(ED,5B,5B,B6), \\\n    V(BE,6A,6A,D4), V(46,CB,CB,8D), V(D9,BE,BE,67), V(4B,39,39,72), \\\n    V(DE,4A,4A,94), V(D4,4C,4C,98), V(E8,58,58,B0), V(4A,CF,CF,85), \\\n    V(6B,D0,D0,BB), V(2A,EF,EF,C5), V(E5,AA,AA,4F), V(16,FB,FB,ED), \\\n    V(C5,43,43,86), V(D7,4D,4D,9A), V(55,33,33,66), V(94,85,85,11), \\\n    V(CF,45,45,8A), V(10,F9,F9,E9), V(06,02,02,04), V(81,7F,7F,FE), \\\n    V(F0,50,50,A0), V(44,3C,3C,78), V(BA,9F,9F,25), V(E3,A8,A8,4B), \\\n    V(F3,51,51,A2), V(FE,A3,A3,5D), V(C0,40,40,80), V(8A,8F,8F,05), \\\n    V(AD,92,92,3F), V(BC,9D,9D,21), V(48,38,38,70), V(04,F5,F5,F1), \\\n    V(DF,BC,BC,63), V(C1,B6,B6,77), V(75,DA,DA,AF), V(63,21,21,42), \\\n    V(30,10,10,20), V(1A,FF,FF,E5), V(0E,F3,F3,FD), V(6D,D2,D2,BF), \\\n    V(4C,CD,CD,81), V(14,0C,0C,18), V(35,13,13,26), V(2F,EC,EC,C3), \\\n    V(E1,5F,5F,BE), V(A2,97,97,35), V(CC,44,44,88), V(39,17,17,2E), \\\n    V(57,C4,C4,93), V(F2,A7,A7,55), V(82,7E,7E,FC), V(47,3D,3D,7A), \\\n    V(AC,64,64,C8), V(E7,5D,5D,BA), V(2B,19,19,32), V(95,73,73,E6), \\\n    V(A0,60,60,C0), V(98,81,81,19), V(D1,4F,4F,9E), V(7F,DC,DC,A3), \\\n    V(66,22,22,44), V(7E,2A,2A,54), V(AB,90,90,3B), V(83,88,88,0B), \\\n    V(CA,46,46,8C), V(29,EE,EE,C7), V(D3,B8,B8,6B), V(3C,14,14,28), \\\n    V(79,DE,DE,A7), V(E2,5E,5E,BC), V(1D,0B,0B,16), V(76,DB,DB,AD), \\\n    V(3B,E0,E0,DB), V(56,32,32,64), V(4E,3A,3A,74), V(1E,0A,0A,14), \\\n    V(DB,49,49,92), V(0A,06,06,0C), V(6C,24,24,48), V(E4,5C,5C,B8), \\\n    V(5D,C2,C2,9F), V(6E,D3,D3,BD), V(EF,AC,AC,43), V(A6,62,62,C4), \\\n    V(A8,91,91,39), V(A4,95,95,31), V(37,E4,E4,D3), V(8B,79,79,F2), \\\n    V(32,E7,E7,D5), V(43,C8,C8,8B), V(59,37,37,6E), V(B7,6D,6D,DA), \\\n    V(8C,8D,8D,01), V(64,D5,D5,B1), V(D2,4E,4E,9C), V(E0,A9,A9,49), \\\n    V(B4,6C,6C,D8), V(FA,56,56,AC), V(07,F4,F4,F3), V(25,EA,EA,CF), \\\n    V(AF,65,65,CA), V(8E,7A,7A,F4), V(E9,AE,AE,47), V(18,08,08,10), \\\n    V(D5,BA,BA,6F), V(88,78,78,F0), V(6F,25,25,4A), V(72,2E,2E,5C), \\\n    V(24,1C,1C,38), V(F1,A6,A6,57), V(C7,B4,B4,73), V(51,C6,C6,97), \\\n    V(23,E8,E8,CB), V(7C,DD,DD,A1), V(9C,74,74,E8), V(21,1F,1F,3E), \\\n    V(DD,4B,4B,96), V(DC,BD,BD,61), V(86,8B,8B,0D), V(85,8A,8A,0F), \\\n    V(90,70,70,E0), V(42,3E,3E,7C), V(C4,B5,B5,71), V(AA,66,66,CC), \\\n    V(D8,48,48,90), V(05,03,03,06), V(01,F6,F6,F7), V(12,0E,0E,1C), \\\n    V(A3,61,61,C2), V(5F,35,35,6A), V(F9,57,57,AE), V(D0,B9,B9,69), \\\n    V(91,86,86,17), V(58,C1,C1,99), V(27,1D,1D,3A), V(B9,9E,9E,27), \\\n    V(38,E1,E1,D9), V(13,F8,F8,EB), V(B3,98,98,2B), V(33,11,11,22), \\\n    V(BB,69,69,D2), V(70,D9,D9,A9), V(89,8E,8E,07), V(A7,94,94,33), \\\n    V(B6,9B,9B,2D), V(22,1E,1E,3C), V(92,87,87,15), V(20,E9,E9,C9), \\\n    V(49,CE,CE,87), V(FF,55,55,AA), V(78,28,28,50), V(7A,DF,DF,A5), \\\n    V(8F,8C,8C,03), V(F8,A1,A1,59), V(80,89,89,09), V(17,0D,0D,1A), \\\n    V(DA,BF,BF,65), V(31,E6,E6,D7), V(C6,42,42,84), V(B8,68,68,D0), \\\n    V(C3,41,41,82), V(B0,99,99,29), V(77,2D,2D,5A), V(11,0F,0F,1E), \\\n    V(CB,B0,B0,7B), V(FC,54,54,A8), V(D6,BB,BB,6D), V(3A,16,16,2C)\n\n#define V(a,b,c,d) 0x##a##b##c##d\nstatic const uint32_t FT0[256] = { FT };\n#undef V\n\n#define V(a,b,c,d) 0x##b##c##d##a\nstatic const uint32_t FT1[256] = { FT };\n#undef V\n\n#define V(a,b,c,d) 0x##c##d##a##b\nstatic const uint32_t FT2[256] = { FT };\n#undef V\n\n#define V(a,b,c,d) 0x##d##a##b##c\nstatic const uint32_t FT3[256] = { FT };\n#undef V\n\n#undef FT\n\n/*\n * Reverse S-box\n */\nstatic const unsigned char RSb[256] =\n{\n    0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,\n    0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,\n    0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,\n    0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,\n    0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,\n    0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,\n    0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,\n    0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,\n    0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,\n    0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,\n    0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,\n    0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,\n    0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,\n    0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,\n    0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,\n    0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,\n    0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,\n    0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,\n    0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,\n    0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,\n    0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,\n    0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,\n    0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,\n    0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,\n    0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,\n    0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,\n    0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,\n    0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,\n    0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,\n    0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,\n    0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,\n    0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D\n};\n\n/*\n * Reverse tables\n */\n#define RT \\\n\\\n    V(50,A7,F4,51), V(53,65,41,7E), V(C3,A4,17,1A), V(96,5E,27,3A), \\\n    V(CB,6B,AB,3B), V(F1,45,9D,1F), V(AB,58,FA,AC), V(93,03,E3,4B), \\\n    V(55,FA,30,20), V(F6,6D,76,AD), V(91,76,CC,88), V(25,4C,02,F5), \\\n    V(FC,D7,E5,4F), V(D7,CB,2A,C5), V(80,44,35,26), V(8F,A3,62,B5), \\\n    V(49,5A,B1,DE), V(67,1B,BA,25), V(98,0E,EA,45), V(E1,C0,FE,5D), \\\n    V(02,75,2F,C3), V(12,F0,4C,81), V(A3,97,46,8D), V(C6,F9,D3,6B), \\\n    V(E7,5F,8F,03), V(95,9C,92,15), V(EB,7A,6D,BF), V(DA,59,52,95), \\\n    V(2D,83,BE,D4), V(D3,21,74,58), V(29,69,E0,49), V(44,C8,C9,8E), \\\n    V(6A,89,C2,75), V(78,79,8E,F4), V(6B,3E,58,99), V(DD,71,B9,27), \\\n    V(B6,4F,E1,BE), V(17,AD,88,F0), V(66,AC,20,C9), V(B4,3A,CE,7D), \\\n    V(18,4A,DF,63), V(82,31,1A,E5), V(60,33,51,97), V(45,7F,53,62), \\\n    V(E0,77,64,B1), V(84,AE,6B,BB), V(1C,A0,81,FE), V(94,2B,08,F9), \\\n    V(58,68,48,70), V(19,FD,45,8F), V(87,6C,DE,94), V(B7,F8,7B,52), \\\n    V(23,D3,73,AB), V(E2,02,4B,72), V(57,8F,1F,E3), V(2A,AB,55,66), \\\n    V(07,28,EB,B2), V(03,C2,B5,2F), V(9A,7B,C5,86), V(A5,08,37,D3), \\\n    V(F2,87,28,30), V(B2,A5,BF,23), V(BA,6A,03,02), V(5C,82,16,ED), \\\n    V(2B,1C,CF,8A), V(92,B4,79,A7), V(F0,F2,07,F3), V(A1,E2,69,4E), \\\n    V(CD,F4,DA,65), V(D5,BE,05,06), V(1F,62,34,D1), V(8A,FE,A6,C4), \\\n    V(9D,53,2E,34), V(A0,55,F3,A2), V(32,E1,8A,05), V(75,EB,F6,A4), \\\n    V(39,EC,83,0B), V(AA,EF,60,40), V(06,9F,71,5E), V(51,10,6E,BD), \\\n    V(F9,8A,21,3E), V(3D,06,DD,96), V(AE,05,3E,DD), V(46,BD,E6,4D), \\\n    V(B5,8D,54,91), V(05,5D,C4,71), V(6F,D4,06,04), V(FF,15,50,60), \\\n    V(24,FB,98,19), V(97,E9,BD,D6), V(CC,43,40,89), V(77,9E,D9,67), \\\n    V(BD,42,E8,B0), V(88,8B,89,07), V(38,5B,19,E7), V(DB,EE,C8,79), \\\n    V(47,0A,7C,A1), V(E9,0F,42,7C), V(C9,1E,84,F8), V(00,00,00,00), \\\n    V(83,86,80,09), V(48,ED,2B,32), V(AC,70,11,1E), V(4E,72,5A,6C), \\\n    V(FB,FF,0E,FD), V(56,38,85,0F), V(1E,D5,AE,3D), V(27,39,2D,36), \\\n    V(64,D9,0F,0A), V(21,A6,5C,68), V(D1,54,5B,9B), V(3A,2E,36,24), \\\n    V(B1,67,0A,0C), V(0F,E7,57,93), V(D2,96,EE,B4), V(9E,91,9B,1B), \\\n    V(4F,C5,C0,80), V(A2,20,DC,61), V(69,4B,77,5A), V(16,1A,12,1C), \\\n    V(0A,BA,93,E2), V(E5,2A,A0,C0), V(43,E0,22,3C), V(1D,17,1B,12), \\\n    V(0B,0D,09,0E), V(AD,C7,8B,F2), V(B9,A8,B6,2D), V(C8,A9,1E,14), \\\n    V(85,19,F1,57), V(4C,07,75,AF), V(BB,DD,99,EE), V(FD,60,7F,A3), \\\n    V(9F,26,01,F7), V(BC,F5,72,5C), V(C5,3B,66,44), V(34,7E,FB,5B), \\\n    V(76,29,43,8B), V(DC,C6,23,CB), V(68,FC,ED,B6), V(63,F1,E4,B8), \\\n    V(CA,DC,31,D7), V(10,85,63,42), V(40,22,97,13), V(20,11,C6,84), \\\n    V(7D,24,4A,85), V(F8,3D,BB,D2), V(11,32,F9,AE), V(6D,A1,29,C7), \\\n    V(4B,2F,9E,1D), V(F3,30,B2,DC), V(EC,52,86,0D), V(D0,E3,C1,77), \\\n    V(6C,16,B3,2B), V(99,B9,70,A9), V(FA,48,94,11), V(22,64,E9,47), \\\n    V(C4,8C,FC,A8), V(1A,3F,F0,A0), V(D8,2C,7D,56), V(EF,90,33,22), \\\n    V(C7,4E,49,87), V(C1,D1,38,D9), V(FE,A2,CA,8C), V(36,0B,D4,98), \\\n    V(CF,81,F5,A6), V(28,DE,7A,A5), V(26,8E,B7,DA), V(A4,BF,AD,3F), \\\n    V(E4,9D,3A,2C), V(0D,92,78,50), V(9B,CC,5F,6A), V(62,46,7E,54), \\\n    V(C2,13,8D,F6), V(E8,B8,D8,90), V(5E,F7,39,2E), V(F5,AF,C3,82), \\\n    V(BE,80,5D,9F), V(7C,93,D0,69), V(A9,2D,D5,6F), V(B3,12,25,CF), \\\n    V(3B,99,AC,C8), V(A7,7D,18,10), V(6E,63,9C,E8), V(7B,BB,3B,DB), \\\n    V(09,78,26,CD), V(F4,18,59,6E), V(01,B7,9A,EC), V(A8,9A,4F,83), \\\n    V(65,6E,95,E6), V(7E,E6,FF,AA), V(08,CF,BC,21), V(E6,E8,15,EF), \\\n    V(D9,9B,E7,BA), V(CE,36,6F,4A), V(D4,09,9F,EA), V(D6,7C,B0,29), \\\n    V(AF,B2,A4,31), V(31,23,3F,2A), V(30,94,A5,C6), V(C0,66,A2,35), \\\n    V(37,BC,4E,74), V(A6,CA,82,FC), V(B0,D0,90,E0), V(15,D8,A7,33), \\\n    V(4A,98,04,F1), V(F7,DA,EC,41), V(0E,50,CD,7F), V(2F,F6,91,17), \\\n    V(8D,D6,4D,76), V(4D,B0,EF,43), V(54,4D,AA,CC), V(DF,04,96,E4), \\\n    V(E3,B5,D1,9E), V(1B,88,6A,4C), V(B8,1F,2C,C1), V(7F,51,65,46), \\\n    V(04,EA,5E,9D), V(5D,35,8C,01), V(73,74,87,FA), V(2E,41,0B,FB), \\\n    V(5A,1D,67,B3), V(52,D2,DB,92), V(33,56,10,E9), V(13,47,D6,6D), \\\n    V(8C,61,D7,9A), V(7A,0C,A1,37), V(8E,14,F8,59), V(89,3C,13,EB), \\\n    V(EE,27,A9,CE), V(35,C9,61,B7), V(ED,E5,1C,E1), V(3C,B1,47,7A), \\\n    V(59,DF,D2,9C), V(3F,73,F2,55), V(79,CE,14,18), V(BF,37,C7,73), \\\n    V(EA,CD,F7,53), V(5B,AA,FD,5F), V(14,6F,3D,DF), V(86,DB,44,78), \\\n    V(81,F3,AF,CA), V(3E,C4,68,B9), V(2C,34,24,38), V(5F,40,A3,C2), \\\n    V(72,C3,1D,16), V(0C,25,E2,BC), V(8B,49,3C,28), V(41,95,0D,FF), \\\n    V(71,01,A8,39), V(DE,B3,0C,08), V(9C,E4,B4,D8), V(90,C1,56,64), \\\n    V(61,84,CB,7B), V(70,B6,32,D5), V(74,5C,6C,48), V(42,57,B8,D0)\n\n#define V(a,b,c,d) 0x##a##b##c##d\nstatic const uint32_t RT0[256] = { RT };\n#undef V\n\n#define V(a,b,c,d) 0x##b##c##d##a\nstatic const uint32_t RT1[256] = { RT };\n#undef V\n\n#define V(a,b,c,d) 0x##c##d##a##b\nstatic const uint32_t RT2[256] = { RT };\n#undef V\n\n#define V(a,b,c,d) 0x##d##a##b##c\nstatic const uint32_t RT3[256] = { RT };\n#undef V\n\n#undef RT\n\n/*\n * Round constants\n */\nstatic const uint32_t RCON[10] =\n{\n    0x00000001, 0x00000002, 0x00000004, 0x00000008,\n    0x00000010, 0x00000020, 0x00000040, 0x00000080,\n    0x0000001B, 0x00000036\n};\n\n#else /* MBEDTLS_AES_ROM_TABLES */\n\n/*\n * Forward S-box & tables\n */\nstatic unsigned char FSb[256];\nstatic uint32_t FT0[256];\nstatic uint32_t FT1[256];\nstatic uint32_t FT2[256];\nstatic uint32_t FT3[256];\n\n/*\n * Reverse S-box & tables\n */\nstatic unsigned char RSb[256];\nstatic uint32_t RT0[256];\nstatic uint32_t RT1[256];\nstatic uint32_t RT2[256];\nstatic uint32_t RT3[256];\n\n/*\n * Round constants\n */\nstatic uint32_t RCON[10];\n\n/*\n * Tables generation code\n */\n#define ROTL8(x) ( ( x << 8 ) & 0xFFFFFFFF ) | ( x >> 24 )\n#define XTIME(x) ( ( x << 1 ) ^ ( ( x & 0x80 ) ? 0x1B : 0x00 ) )\n#define MUL(x,y) ( ( x && y ) ? pow[(log[x]+log[y]) % 255] : 0 )\n\nstatic int aes_init_done = 0;\n\nstatic void aes_gen_tables( void )\n{\n    int i, x, y, z;\n    int pow[256];\n    int log[256];\n\n    /*\n     * compute pow and log tables over GF(2^8)\n     */\n    for( i = 0, x = 1; i < 256; i++ )\n    {\n        pow[i] = x;\n        log[x] = i;\n        x = ( x ^ XTIME( x ) ) & 0xFF;\n    }\n\n    /*\n     * calculate the round constants\n     */\n    for( i = 0, x = 1; i < 10; i++ )\n    {\n        RCON[i] = (uint32_t) x;\n        x = XTIME( x ) & 0xFF;\n    }\n\n    /*\n     * generate the forward and reverse S-boxes\n     */\n    FSb[0x00] = 0x63;\n    RSb[0x63] = 0x00;\n\n    for( i = 1; i < 256; i++ )\n    {\n        x = pow[255 - log[i]];\n\n        y  = x; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;\n        x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;\n        x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;\n        x ^= y; y = ( ( y << 1 ) | ( y >> 7 ) ) & 0xFF;\n        x ^= y ^ 0x63;\n\n        FSb[i] = (unsigned char) x;\n        RSb[x] = (unsigned char) i;\n    }\n\n    /*\n     * generate the forward and reverse tables\n     */\n    for( i = 0; i < 256; i++ )\n    {\n        x = FSb[i];\n        y = XTIME( x ) & 0xFF;\n        z =  ( y ^ x ) & 0xFF;\n\n        FT0[i] = ( (uint32_t) y       ) ^\n                 ( (uint32_t) x <<  8 ) ^\n                 ( (uint32_t) x << 16 ) ^\n                 ( (uint32_t) z << 24 );\n\n        FT1[i] = ROTL8( FT0[i] );\n        FT2[i] = ROTL8( FT1[i] );\n        FT3[i] = ROTL8( FT2[i] );\n\n        x = RSb[i];\n\n        RT0[i] = ( (uint32_t) MUL( 0x0E, x )       ) ^\n                 ( (uint32_t) MUL( 0x09, x ) <<  8 ) ^\n                 ( (uint32_t) MUL( 0x0D, x ) << 16 ) ^\n                 ( (uint32_t) MUL( 0x0B, x ) << 24 );\n\n        RT1[i] = ROTL8( RT0[i] );\n        RT2[i] = ROTL8( RT1[i] );\n        RT3[i] = ROTL8( RT2[i] );\n    }\n}\n\n#endif /* MBEDTLS_AES_ROM_TABLES */\n\nvoid mbedtls_aes_init( mbedtls_aes_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_aes_context ) );\n}\n\nvoid mbedtls_aes_free( mbedtls_aes_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_aes_context ) );\n}\n\n/*\n * AES key schedule (encryption)\n */\n#if !defined(MBEDTLS_AES_SETKEY_ENC_ALT)\nint mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,\n                    unsigned int keybits )\n{\n    unsigned int i;\n    uint32_t *RK;\n\n#if !defined(MBEDTLS_AES_ROM_TABLES)\n    if( aes_init_done == 0 )\n    {\n        aes_gen_tables();\n        aes_init_done = 1;\n\n    }\n#endif\n\n    switch( keybits )\n    {\n        case 128: ctx->nr = 10; break;\n        case 192: ctx->nr = 12; break;\n        case 256: ctx->nr = 14; break;\n        default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );\n    }\n\n#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)\n    if( aes_padlock_ace == -1 )\n        aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );\n\n    if( aes_padlock_ace )\n        ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );\n    else\n#endif\n    ctx->rk = RK = ctx->buf;\n\n#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)\n    if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )\n        return( mbedtls_aesni_setkey_enc( (unsigned char *) ctx->rk, key, keybits ) );\n#endif\n\n    for( i = 0; i < ( keybits >> 5 ); i++ )\n    {\n        GET_UINT32_LE( RK[i], key, i << 2 );\n    }\n\n    switch( ctx->nr )\n    {\n        case 10:\n\n            for( i = 0; i < 10; i++, RK += 4 )\n            {\n                RK[4]  = RK[0] ^ RCON[i] ^\n                ( (uint32_t) FSb[ ( RK[3] >>  8 ) & 0xFF ]       ) ^\n                ( (uint32_t) FSb[ ( RK[3] >> 16 ) & 0xFF ] <<  8 ) ^\n                ( (uint32_t) FSb[ ( RK[3] >> 24 ) & 0xFF ] << 16 ) ^\n                ( (uint32_t) FSb[ ( RK[3]       ) & 0xFF ] << 24 );\n\n                RK[5]  = RK[1] ^ RK[4];\n                RK[6]  = RK[2] ^ RK[5];\n                RK[7]  = RK[3] ^ RK[6];\n            }\n            break;\n\n        case 12:\n\n            for( i = 0; i < 8; i++, RK += 6 )\n            {\n                RK[6]  = RK[0] ^ RCON[i] ^\n                ( (uint32_t) FSb[ ( RK[5] >>  8 ) & 0xFF ]       ) ^\n                ( (uint32_t) FSb[ ( RK[5] >> 16 ) & 0xFF ] <<  8 ) ^\n                ( (uint32_t) FSb[ ( RK[5] >> 24 ) & 0xFF ] << 16 ) ^\n                ( (uint32_t) FSb[ ( RK[5]       ) & 0xFF ] << 24 );\n\n                RK[7]  = RK[1] ^ RK[6];\n                RK[8]  = RK[2] ^ RK[7];\n                RK[9]  = RK[3] ^ RK[8];\n                RK[10] = RK[4] ^ RK[9];\n                RK[11] = RK[5] ^ RK[10];\n            }\n            break;\n\n        case 14:\n\n            for( i = 0; i < 7; i++, RK += 8 )\n            {\n                RK[8]  = RK[0] ^ RCON[i] ^\n                ( (uint32_t) FSb[ ( RK[7] >>  8 ) & 0xFF ]       ) ^\n                ( (uint32_t) FSb[ ( RK[7] >> 16 ) & 0xFF ] <<  8 ) ^\n                ( (uint32_t) FSb[ ( RK[7] >> 24 ) & 0xFF ] << 16 ) ^\n                ( (uint32_t) FSb[ ( RK[7]       ) & 0xFF ] << 24 );\n\n                RK[9]  = RK[1] ^ RK[8];\n                RK[10] = RK[2] ^ RK[9];\n                RK[11] = RK[3] ^ RK[10];\n\n                RK[12] = RK[4] ^\n                ( (uint32_t) FSb[ ( RK[11]       ) & 0xFF ]       ) ^\n                ( (uint32_t) FSb[ ( RK[11] >>  8 ) & 0xFF ] <<  8 ) ^\n                ( (uint32_t) FSb[ ( RK[11] >> 16 ) & 0xFF ] << 16 ) ^\n                ( (uint32_t) FSb[ ( RK[11] >> 24 ) & 0xFF ] << 24 );\n\n                RK[13] = RK[5] ^ RK[12];\n                RK[14] = RK[6] ^ RK[13];\n                RK[15] = RK[7] ^ RK[14];\n            }\n            break;\n    }\n\n    return( 0 );\n}\n#endif /* !MBEDTLS_AES_SETKEY_ENC_ALT */\n\n/*\n * AES key schedule (decryption)\n */\n#if !defined(MBEDTLS_AES_SETKEY_DEC_ALT)\nint mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,\n                    unsigned int keybits )\n{\n    int i, j, ret;\n    mbedtls_aes_context cty;\n    uint32_t *RK;\n    uint32_t *SK;\n\n    mbedtls_aes_init( &cty );\n\n#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_PADLOCK_ALIGN16)\n    if( aes_padlock_ace == -1 )\n        aes_padlock_ace = mbedtls_padlock_has_support( MBEDTLS_PADLOCK_ACE );\n\n    if( aes_padlock_ace )\n        ctx->rk = RK = MBEDTLS_PADLOCK_ALIGN16( ctx->buf );\n    else\n#endif\n    ctx->rk = RK = ctx->buf;\n\n    /* Also checks keybits */\n    if( ( ret = mbedtls_aes_setkey_enc( &cty, key, keybits ) ) != 0 )\n        goto exit;\n\n    ctx->nr = cty.nr;\n\n#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)\n    if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )\n    {\n        mbedtls_aesni_inverse_key( (unsigned char *) ctx->rk,\n                           (const unsigned char *) cty.rk, ctx->nr );\n        goto exit;\n    }\n#endif\n\n    SK = cty.rk + cty.nr * 4;\n\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n\n    for( i = ctx->nr - 1, SK -= 8; i > 0; i--, SK -= 8 )\n    {\n        for( j = 0; j < 4; j++, SK++ )\n        {\n            *RK++ = RT0[ FSb[ ( *SK       ) & 0xFF ] ] ^\n                    RT1[ FSb[ ( *SK >>  8 ) & 0xFF ] ] ^\n                    RT2[ FSb[ ( *SK >> 16 ) & 0xFF ] ] ^\n                    RT3[ FSb[ ( *SK >> 24 ) & 0xFF ] ];\n        }\n    }\n\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n\nexit:\n    mbedtls_aes_free( &cty );\n\n    return( ret );\n}\n#endif /* !MBEDTLS_AES_SETKEY_DEC_ALT */\n\n#define AES_FROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)     \\\n{                                               \\\n    X0 = *RK++ ^ FT0[ ( Y0       ) & 0xFF ] ^   \\\n                 FT1[ ( Y1 >>  8 ) & 0xFF ] ^   \\\n                 FT2[ ( Y2 >> 16 ) & 0xFF ] ^   \\\n                 FT3[ ( Y3 >> 24 ) & 0xFF ];    \\\n                                                \\\n    X1 = *RK++ ^ FT0[ ( Y1       ) & 0xFF ] ^   \\\n                 FT1[ ( Y2 >>  8 ) & 0xFF ] ^   \\\n                 FT2[ ( Y3 >> 16 ) & 0xFF ] ^   \\\n                 FT3[ ( Y0 >> 24 ) & 0xFF ];    \\\n                                                \\\n    X2 = *RK++ ^ FT0[ ( Y2       ) & 0xFF ] ^   \\\n                 FT1[ ( Y3 >>  8 ) & 0xFF ] ^   \\\n                 FT2[ ( Y0 >> 16 ) & 0xFF ] ^   \\\n                 FT3[ ( Y1 >> 24 ) & 0xFF ];    \\\n                                                \\\n    X3 = *RK++ ^ FT0[ ( Y3       ) & 0xFF ] ^   \\\n                 FT1[ ( Y0 >>  8 ) & 0xFF ] ^   \\\n                 FT2[ ( Y1 >> 16 ) & 0xFF ] ^   \\\n                 FT3[ ( Y2 >> 24 ) & 0xFF ];    \\\n}\n\n#define AES_RROUND(X0,X1,X2,X3,Y0,Y1,Y2,Y3)     \\\n{                                               \\\n    X0 = *RK++ ^ RT0[ ( Y0       ) & 0xFF ] ^   \\\n                 RT1[ ( Y3 >>  8 ) & 0xFF ] ^   \\\n                 RT2[ ( Y2 >> 16 ) & 0xFF ] ^   \\\n                 RT3[ ( Y1 >> 24 ) & 0xFF ];    \\\n                                                \\\n    X1 = *RK++ ^ RT0[ ( Y1       ) & 0xFF ] ^   \\\n                 RT1[ ( Y0 >>  8 ) & 0xFF ] ^   \\\n                 RT2[ ( Y3 >> 16 ) & 0xFF ] ^   \\\n                 RT3[ ( Y2 >> 24 ) & 0xFF ];    \\\n                                                \\\n    X2 = *RK++ ^ RT0[ ( Y2       ) & 0xFF ] ^   \\\n                 RT1[ ( Y1 >>  8 ) & 0xFF ] ^   \\\n                 RT2[ ( Y0 >> 16 ) & 0xFF ] ^   \\\n                 RT3[ ( Y3 >> 24 ) & 0xFF ];    \\\n                                                \\\n    X3 = *RK++ ^ RT0[ ( Y3       ) & 0xFF ] ^   \\\n                 RT1[ ( Y2 >>  8 ) & 0xFF ] ^   \\\n                 RT2[ ( Y1 >> 16 ) & 0xFF ] ^   \\\n                 RT3[ ( Y0 >> 24 ) & 0xFF ];    \\\n}\n\n/*\n * AES-ECB block encryption\n */\n#if !defined(MBEDTLS_AES_ENCRYPT_ALT)\nint mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,\n                                  const unsigned char input[16],\n                                  unsigned char output[16] )\n{\n    int i;\n    uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;\n\n    RK = ctx->rk;\n\n    GET_UINT32_LE( X0, input,  0 ); X0 ^= *RK++;\n    GET_UINT32_LE( X1, input,  4 ); X1 ^= *RK++;\n    GET_UINT32_LE( X2, input,  8 ); X2 ^= *RK++;\n    GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;\n\n    for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )\n    {\n        AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );\n        AES_FROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );\n    }\n\n    AES_FROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );\n\n    X0 = *RK++ ^ \\\n            ( (uint32_t) FSb[ ( Y0       ) & 0xFF ]       ) ^\n            ( (uint32_t) FSb[ ( Y1 >>  8 ) & 0xFF ] <<  8 ) ^\n            ( (uint32_t) FSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^\n            ( (uint32_t) FSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );\n\n    X1 = *RK++ ^ \\\n            ( (uint32_t) FSb[ ( Y1       ) & 0xFF ]       ) ^\n            ( (uint32_t) FSb[ ( Y2 >>  8 ) & 0xFF ] <<  8 ) ^\n            ( (uint32_t) FSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^\n            ( (uint32_t) FSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );\n\n    X2 = *RK++ ^ \\\n            ( (uint32_t) FSb[ ( Y2       ) & 0xFF ]       ) ^\n            ( (uint32_t) FSb[ ( Y3 >>  8 ) & 0xFF ] <<  8 ) ^\n            ( (uint32_t) FSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^\n            ( (uint32_t) FSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );\n\n    X3 = *RK++ ^ \\\n            ( (uint32_t) FSb[ ( Y3       ) & 0xFF ]       ) ^\n            ( (uint32_t) FSb[ ( Y0 >>  8 ) & 0xFF ] <<  8 ) ^\n            ( (uint32_t) FSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^\n            ( (uint32_t) FSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );\n\n    PUT_UINT32_LE( X0, output,  0 );\n    PUT_UINT32_LE( X1, output,  4 );\n    PUT_UINT32_LE( X2, output,  8 );\n    PUT_UINT32_LE( X3, output, 12 );\n\n    return( 0 );\n}\n#endif /* !MBEDTLS_AES_ENCRYPT_ALT */\n\nvoid mbedtls_aes_encrypt( mbedtls_aes_context *ctx,\n                          const unsigned char input[16],\n                          unsigned char output[16] )\n{\n    mbedtls_internal_aes_encrypt( ctx, input, output );\n}\n\n/*\n * AES-ECB block decryption\n */\n#if !defined(MBEDTLS_AES_DECRYPT_ALT)\nint mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,\n                                  const unsigned char input[16],\n                                  unsigned char output[16] )\n{\n    int i;\n    uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;\n\n    RK = ctx->rk;\n\n    GET_UINT32_LE( X0, input,  0 ); X0 ^= *RK++;\n    GET_UINT32_LE( X1, input,  4 ); X1 ^= *RK++;\n    GET_UINT32_LE( X2, input,  8 ); X2 ^= *RK++;\n    GET_UINT32_LE( X3, input, 12 ); X3 ^= *RK++;\n\n    for( i = ( ctx->nr >> 1 ) - 1; i > 0; i-- )\n    {\n        AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );\n        AES_RROUND( X0, X1, X2, X3, Y0, Y1, Y2, Y3 );\n    }\n\n    AES_RROUND( Y0, Y1, Y2, Y3, X0, X1, X2, X3 );\n\n    X0 = *RK++ ^ \\\n            ( (uint32_t) RSb[ ( Y0       ) & 0xFF ]       ) ^\n            ( (uint32_t) RSb[ ( Y3 >>  8 ) & 0xFF ] <<  8 ) ^\n            ( (uint32_t) RSb[ ( Y2 >> 16 ) & 0xFF ] << 16 ) ^\n            ( (uint32_t) RSb[ ( Y1 >> 24 ) & 0xFF ] << 24 );\n\n    X1 = *RK++ ^ \\\n            ( (uint32_t) RSb[ ( Y1       ) & 0xFF ]       ) ^\n            ( (uint32_t) RSb[ ( Y0 >>  8 ) & 0xFF ] <<  8 ) ^\n            ( (uint32_t) RSb[ ( Y3 >> 16 ) & 0xFF ] << 16 ) ^\n            ( (uint32_t) RSb[ ( Y2 >> 24 ) & 0xFF ] << 24 );\n\n    X2 = *RK++ ^ \\\n            ( (uint32_t) RSb[ ( Y2       ) & 0xFF ]       ) ^\n            ( (uint32_t) RSb[ ( Y1 >>  8 ) & 0xFF ] <<  8 ) ^\n            ( (uint32_t) RSb[ ( Y0 >> 16 ) & 0xFF ] << 16 ) ^\n            ( (uint32_t) RSb[ ( Y3 >> 24 ) & 0xFF ] << 24 );\n\n    X3 = *RK++ ^ \\\n            ( (uint32_t) RSb[ ( Y3       ) & 0xFF ]       ) ^\n            ( (uint32_t) RSb[ ( Y2 >>  8 ) & 0xFF ] <<  8 ) ^\n            ( (uint32_t) RSb[ ( Y1 >> 16 ) & 0xFF ] << 16 ) ^\n            ( (uint32_t) RSb[ ( Y0 >> 24 ) & 0xFF ] << 24 );\n\n    PUT_UINT32_LE( X0, output,  0 );\n    PUT_UINT32_LE( X1, output,  4 );\n    PUT_UINT32_LE( X2, output,  8 );\n    PUT_UINT32_LE( X3, output, 12 );\n\n    return( 0 );\n}\n#endif /* !MBEDTLS_AES_DECRYPT_ALT */\n\nvoid mbedtls_aes_decrypt( mbedtls_aes_context *ctx,\n                          const unsigned char input[16],\n                          unsigned char output[16] )\n{\n    mbedtls_internal_aes_decrypt( ctx, input, output );\n}\n\n/*\n * AES-ECB block encryption/decryption\n */\nint mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,\n                    int mode,\n                    const unsigned char input[16],\n                    unsigned char output[16] )\n{\n#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)\n    if( mbedtls_aesni_has_support( MBEDTLS_AESNI_AES ) )\n        return( mbedtls_aesni_crypt_ecb( ctx, mode, input, output ) );\n#endif\n\n#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)\n    if( aes_padlock_ace )\n    {\n        if( mbedtls_padlock_xcryptecb( ctx, mode, input, output ) == 0 )\n            return( 0 );\n\n        // If padlock data misaligned, we just fall back to\n        // unaccelerated mode\n        //\n    }\n#endif\n\n    if( mode == MBEDTLS_AES_ENCRYPT )\n        return( mbedtls_internal_aes_encrypt( ctx, input, output ) );\n    else\n        return( mbedtls_internal_aes_decrypt( ctx, input, output ) );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/*\n * AES-CBC buffer encryption/decryption\n */\nint mbedtls_aes_crypt_cbc( mbedtls_aes_context *ctx,\n                    int mode,\n                    size_t length,\n                    unsigned char iv[16],\n                    const unsigned char *input,\n                    unsigned char *output )\n{\n    int i;\n    unsigned char temp[16];\n\n    if( length % 16 )\n        return( MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH );\n\n#if defined(MBEDTLS_PADLOCK_C) && defined(MBEDTLS_HAVE_X86)\n    if( aes_padlock_ace )\n    {\n        if( mbedtls_padlock_xcryptcbc( ctx, mode, length, iv, input, output ) == 0 )\n            return( 0 );\n\n        // If padlock data misaligned, we just fall back to\n        // unaccelerated mode\n        //\n    }\n#endif\n\n    if( mode == MBEDTLS_AES_DECRYPT )\n    {\n        while( length > 0 )\n        {\n            memcpy( temp, input, 16 );\n            mbedtls_aes_crypt_ecb( ctx, mode, input, output );\n\n            for( i = 0; i < 16; i++ )\n                output[i] = (unsigned char)( output[i] ^ iv[i] );\n\n            memcpy( iv, temp, 16 );\n\n            input  += 16;\n            output += 16;\n            length -= 16;\n        }\n    }\n    else\n    {\n        while( length > 0 )\n        {\n            for( i = 0; i < 16; i++ )\n                output[i] = (unsigned char)( input[i] ^ iv[i] );\n\n            mbedtls_aes_crypt_ecb( ctx, mode, output, output );\n            memcpy( iv, output, 16 );\n\n            input  += 16;\n            output += 16;\n            length -= 16;\n        }\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n/*\n * AES-CFB128 buffer encryption/decryption\n */\nint mbedtls_aes_crypt_cfb128( mbedtls_aes_context *ctx,\n                       int mode,\n                       size_t length,\n                       size_t *iv_off,\n                       unsigned char iv[16],\n                       const unsigned char *input,\n                       unsigned char *output )\n{\n    int c;\n    size_t n = *iv_off;\n\n    if( mode == MBEDTLS_AES_DECRYPT )\n    {\n        while( length-- )\n        {\n            if( n == 0 )\n                mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );\n\n            c = *input++;\n            *output++ = (unsigned char)( c ^ iv[n] );\n            iv[n] = (unsigned char) c;\n\n            n = ( n + 1 ) & 0x0F;\n        }\n    }\n    else\n    {\n        while( length-- )\n        {\n            if( n == 0 )\n                mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );\n\n            iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );\n\n            n = ( n + 1 ) & 0x0F;\n        }\n    }\n\n    *iv_off = n;\n\n    return( 0 );\n}\n\n/*\n * AES-CFB8 buffer encryption/decryption\n */\nint mbedtls_aes_crypt_cfb8( mbedtls_aes_context *ctx,\n                       int mode,\n                       size_t length,\n                       unsigned char iv[16],\n                       const unsigned char *input,\n                       unsigned char *output )\n{\n    unsigned char c;\n    unsigned char ov[17];\n\n    while( length-- )\n    {\n        memcpy( ov, iv, 16 );\n        mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, iv, iv );\n\n        if( mode == MBEDTLS_AES_DECRYPT )\n            ov[16] = *input;\n\n        c = *output++ = (unsigned char)( iv[0] ^ *input++ );\n\n        if( mode == MBEDTLS_AES_ENCRYPT )\n            ov[16] = c;\n\n        memcpy( iv, ov + 1, 16 );\n    }\n\n    return( 0 );\n}\n#endif /*MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n/*\n * AES-CTR buffer encryption/decryption\n */\nint mbedtls_aes_crypt_ctr( mbedtls_aes_context *ctx,\n                       size_t length,\n                       size_t *nc_off,\n                       unsigned char nonce_counter[16],\n                       unsigned char stream_block[16],\n                       const unsigned char *input,\n                       unsigned char *output )\n{\n    int c, i;\n    size_t n = *nc_off;\n\n    while( length-- )\n    {\n        if( n == 0 ) {\n            mbedtls_aes_crypt_ecb( ctx, MBEDTLS_AES_ENCRYPT, nonce_counter, stream_block );\n\n            for( i = 16; i > 0; i-- )\n                if( ++nonce_counter[i - 1] != 0 )\n                    break;\n        }\n        c = *input++;\n        *output++ = (unsigned char)( c ^ stream_block[n] );\n\n        n = ( n + 1 ) & 0x0F;\n    }\n\n    *nc_off = n;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n#endif /* !MBEDTLS_AES_ALT */\n\n#if defined(MBEDTLS_SELF_TEST)\n/*\n * AES test vectors from:\n *\n * http://csrc.nist.gov/archive/aes/rijndael/rijndael-vals.zip\n */\nstatic const unsigned char aes_test_ecb_dec[3][16] =\n{\n    { 0x44, 0x41, 0x6A, 0xC2, 0xD1, 0xF5, 0x3C, 0x58,\n      0x33, 0x03, 0x91, 0x7E, 0x6B, 0xE9, 0xEB, 0xE0 },\n    { 0x48, 0xE3, 0x1E, 0x9E, 0x25, 0x67, 0x18, 0xF2,\n      0x92, 0x29, 0x31, 0x9C, 0x19, 0xF1, 0x5B, 0xA4 },\n    { 0x05, 0x8C, 0xCF, 0xFD, 0xBB, 0xCB, 0x38, 0x2D,\n      0x1F, 0x6F, 0x56, 0x58, 0x5D, 0x8A, 0x4A, 0xDE }\n};\n\nstatic const unsigned char aes_test_ecb_enc[3][16] =\n{\n    { 0xC3, 0x4C, 0x05, 0x2C, 0xC0, 0xDA, 0x8D, 0x73,\n      0x45, 0x1A, 0xFE, 0x5F, 0x03, 0xBE, 0x29, 0x7F },\n    { 0xF3, 0xF6, 0x75, 0x2A, 0xE8, 0xD7, 0x83, 0x11,\n      0x38, 0xF0, 0x41, 0x56, 0x06, 0x31, 0xB1, 0x14 },\n    { 0x8B, 0x79, 0xEE, 0xCC, 0x93, 0xA0, 0xEE, 0x5D,\n      0xFF, 0x30, 0xB4, 0xEA, 0x21, 0x63, 0x6D, 0xA4 }\n};\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic const unsigned char aes_test_cbc_dec[3][16] =\n{\n    { 0xFA, 0xCA, 0x37, 0xE0, 0xB0, 0xC8, 0x53, 0x73,\n      0xDF, 0x70, 0x6E, 0x73, 0xF7, 0xC9, 0xAF, 0x86 },\n    { 0x5D, 0xF6, 0x78, 0xDD, 0x17, 0xBA, 0x4E, 0x75,\n      0xB6, 0x17, 0x68, 0xC6, 0xAD, 0xEF, 0x7C, 0x7B },\n    { 0x48, 0x04, 0xE1, 0x81, 0x8F, 0xE6, 0x29, 0x75,\n      0x19, 0xA3, 0xE8, 0x8C, 0x57, 0x31, 0x04, 0x13 }\n};\n\nstatic const unsigned char aes_test_cbc_enc[3][16] =\n{\n    { 0x8A, 0x05, 0xFC, 0x5E, 0x09, 0x5A, 0xF4, 0x84,\n      0x8A, 0x08, 0xD3, 0x28, 0xD3, 0x68, 0x8E, 0x3D },\n    { 0x7B, 0xD9, 0x66, 0xD5, 0x3A, 0xD8, 0xC1, 0xBB,\n      0x85, 0xD2, 0xAD, 0xFA, 0xE8, 0x7B, 0xB1, 0x04 },\n    { 0xFE, 0x3C, 0x53, 0x65, 0x3E, 0x2F, 0x45, 0xB5,\n      0x6F, 0xCD, 0x88, 0xB2, 0xCC, 0x89, 0x8F, 0xF0 }\n};\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n/*\n * AES-CFB128 test vectors from:\n *\n * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf\n */\nstatic const unsigned char aes_test_cfb128_key[3][32] =\n{\n    { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,\n      0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C },\n    { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,\n      0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,\n      0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B },\n    { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,\n      0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,\n      0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,\n      0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }\n};\n\nstatic const unsigned char aes_test_cfb128_iv[16] =\n{\n    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n    0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F\n};\n\nstatic const unsigned char aes_test_cfb128_pt[64] =\n{\n    0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,\n    0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A,\n    0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,\n    0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51,\n    0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,\n    0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF,\n    0xF6, 0x9F, 0x24, 0x45, 0xDF, 0x4F, 0x9B, 0x17,\n    0xAD, 0x2B, 0x41, 0x7B, 0xE6, 0x6C, 0x37, 0x10\n};\n\nstatic const unsigned char aes_test_cfb128_ct[3][64] =\n{\n    { 0x3B, 0x3F, 0xD9, 0x2E, 0xB7, 0x2D, 0xAD, 0x20,\n      0x33, 0x34, 0x49, 0xF8, 0xE8, 0x3C, 0xFB, 0x4A,\n      0xC8, 0xA6, 0x45, 0x37, 0xA0, 0xB3, 0xA9, 0x3F,\n      0xCD, 0xE3, 0xCD, 0xAD, 0x9F, 0x1C, 0xE5, 0x8B,\n      0x26, 0x75, 0x1F, 0x67, 0xA3, 0xCB, 0xB1, 0x40,\n      0xB1, 0x80, 0x8C, 0xF1, 0x87, 0xA4, 0xF4, 0xDF,\n      0xC0, 0x4B, 0x05, 0x35, 0x7C, 0x5D, 0x1C, 0x0E,\n      0xEA, 0xC4, 0xC6, 0x6F, 0x9F, 0xF7, 0xF2, 0xE6 },\n    { 0xCD, 0xC8, 0x0D, 0x6F, 0xDD, 0xF1, 0x8C, 0xAB,\n      0x34, 0xC2, 0x59, 0x09, 0xC9, 0x9A, 0x41, 0x74,\n      0x67, 0xCE, 0x7F, 0x7F, 0x81, 0x17, 0x36, 0x21,\n      0x96, 0x1A, 0x2B, 0x70, 0x17, 0x1D, 0x3D, 0x7A,\n      0x2E, 0x1E, 0x8A, 0x1D, 0xD5, 0x9B, 0x88, 0xB1,\n      0xC8, 0xE6, 0x0F, 0xED, 0x1E, 0xFA, 0xC4, 0xC9,\n      0xC0, 0x5F, 0x9F, 0x9C, 0xA9, 0x83, 0x4F, 0xA0,\n      0x42, 0xAE, 0x8F, 0xBA, 0x58, 0x4B, 0x09, 0xFF },\n    { 0xDC, 0x7E, 0x84, 0xBF, 0xDA, 0x79, 0x16, 0x4B,\n      0x7E, 0xCD, 0x84, 0x86, 0x98, 0x5D, 0x38, 0x60,\n      0x39, 0xFF, 0xED, 0x14, 0x3B, 0x28, 0xB1, 0xC8,\n      0x32, 0x11, 0x3C, 0x63, 0x31, 0xE5, 0x40, 0x7B,\n      0xDF, 0x10, 0x13, 0x24, 0x15, 0xE5, 0x4B, 0x92,\n      0xA1, 0x3E, 0xD0, 0xA8, 0x26, 0x7A, 0xE2, 0xF9,\n      0x75, 0xA3, 0x85, 0x74, 0x1A, 0xB9, 0xCE, 0xF8,\n      0x20, 0x31, 0x62, 0x3D, 0x55, 0xB1, 0xE4, 0x71 }\n};\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n/*\n * AES-CTR test vectors from:\n *\n * http://www.faqs.org/rfcs/rfc3686.html\n */\n\nstatic const unsigned char aes_test_ctr_key[3][16] =\n{\n    { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,\n      0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },\n    { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,\n      0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },\n    { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,\n      0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }\n};\n\nstatic const unsigned char aes_test_ctr_nonce_counter[3][16] =\n{\n    { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },\n    { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,\n      0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },\n    { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,\n      0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }\n};\n\nstatic const unsigned char aes_test_ctr_pt[3][48] =\n{\n    { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,\n      0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },\n\n    { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,\n      0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n      0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },\n\n    { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,\n      0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n      0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,\n      0x20, 0x21, 0x22, 0x23 }\n};\n\nstatic const unsigned char aes_test_ctr_ct[3][48] =\n{\n    { 0xE4, 0x09, 0x5D, 0x4F, 0xB7, 0xA7, 0xB3, 0x79,\n      0x2D, 0x61, 0x75, 0xA3, 0x26, 0x13, 0x11, 0xB8 },\n    { 0x51, 0x04, 0xA1, 0x06, 0x16, 0x8A, 0x72, 0xD9,\n      0x79, 0x0D, 0x41, 0xEE, 0x8E, 0xDA, 0xD3, 0x88,\n      0xEB, 0x2E, 0x1E, 0xFC, 0x46, 0xDA, 0x57, 0xC8,\n      0xFC, 0xE6, 0x30, 0xDF, 0x91, 0x41, 0xBE, 0x28 },\n    { 0xC1, 0xCF, 0x48, 0xA8, 0x9F, 0x2F, 0xFD, 0xD9,\n      0xCF, 0x46, 0x52, 0xE9, 0xEF, 0xDB, 0x72, 0xD7,\n      0x45, 0x40, 0xA4, 0x2B, 0xDE, 0x6D, 0x78, 0x36,\n      0xD5, 0x9A, 0x5C, 0xEA, 0xAE, 0xF3, 0x10, 0x53,\n      0x25, 0xB2, 0x07, 0x2F }\n};\n\nstatic const int aes_test_ctr_len[3] =\n    { 16, 32, 36 };\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n/*\n * Checkup routine\n */\nint mbedtls_aes_self_test( int verbose )\n{\n    int ret = 0, i, j, u, v;\n    unsigned char key[32];\n    unsigned char buf[64];\n#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB)\n    unsigned char iv[16];\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    unsigned char prv[16];\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR) || defined(MBEDTLS_CIPHER_MODE_CFB)\n    size_t offset;\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    int len;\n    unsigned char nonce_counter[16];\n    unsigned char stream_block[16];\n#endif\n    mbedtls_aes_context ctx;\n\n    memset( key, 0, 32 );\n    mbedtls_aes_init( &ctx );\n\n    /*\n     * ECB mode\n     */\n    for( i = 0; i < 6; i++ )\n    {\n        u = i >> 1;\n        v = i  & 1;\n\n        if( verbose != 0 )\n            mbedtls_printf( \"  AES-ECB-%3d (%s): \", 128 + u * 64,\n                             ( v == MBEDTLS_AES_DECRYPT ) ? \"dec\" : \"enc\" );\n\n        memset( buf, 0, 16 );\n\n        if( v == MBEDTLS_AES_DECRYPT )\n        {\n            mbedtls_aes_setkey_dec( &ctx, key, 128 + u * 64 );\n\n            for( j = 0; j < 10000; j++ )\n                mbedtls_aes_crypt_ecb( &ctx, v, buf, buf );\n\n            if( memcmp( buf, aes_test_ecb_dec[u], 16 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                ret = 1;\n                goto exit;\n            }\n        }\n        else\n        {\n            mbedtls_aes_setkey_enc( &ctx, key, 128 + u * 64 );\n\n            for( j = 0; j < 10000; j++ )\n                mbedtls_aes_crypt_ecb( &ctx, v, buf, buf );\n\n            if( memcmp( buf, aes_test_ecb_enc[u], 16 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                ret = 1;\n                goto exit;\n            }\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    /*\n     * CBC mode\n     */\n    for( i = 0; i < 6; i++ )\n    {\n        u = i >> 1;\n        v = i  & 1;\n\n        if( verbose != 0 )\n            mbedtls_printf( \"  AES-CBC-%3d (%s): \", 128 + u * 64,\n                             ( v == MBEDTLS_AES_DECRYPT ) ? \"dec\" : \"enc\" );\n\n        memset( iv , 0, 16 );\n        memset( prv, 0, 16 );\n        memset( buf, 0, 16 );\n\n        if( v == MBEDTLS_AES_DECRYPT )\n        {\n            mbedtls_aes_setkey_dec( &ctx, key, 128 + u * 64 );\n\n            for( j = 0; j < 10000; j++ )\n                mbedtls_aes_crypt_cbc( &ctx, v, 16, iv, buf, buf );\n\n            if( memcmp( buf, aes_test_cbc_dec[u], 16 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                ret = 1;\n                goto exit;\n            }\n        }\n        else\n        {\n            mbedtls_aes_setkey_enc( &ctx, key, 128 + u * 64 );\n\n            for( j = 0; j < 10000; j++ )\n            {\n                unsigned char tmp[16];\n\n                mbedtls_aes_crypt_cbc( &ctx, v, 16, iv, buf, buf );\n\n                memcpy( tmp, prv, 16 );\n                memcpy( prv, buf, 16 );\n                memcpy( buf, tmp, 16 );\n            }\n\n            if( memcmp( prv, aes_test_cbc_enc[u], 16 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                ret = 1;\n                goto exit;\n            }\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    /*\n     * CFB128 mode\n     */\n    for( i = 0; i < 6; i++ )\n    {\n        u = i >> 1;\n        v = i  & 1;\n\n        if( verbose != 0 )\n            mbedtls_printf( \"  AES-CFB128-%3d (%s): \", 128 + u * 64,\n                             ( v == MBEDTLS_AES_DECRYPT ) ? \"dec\" : \"enc\" );\n\n        memcpy( iv,  aes_test_cfb128_iv, 16 );\n        memcpy( key, aes_test_cfb128_key[u], 16 + u * 8 );\n\n        offset = 0;\n        mbedtls_aes_setkey_enc( &ctx, key, 128 + u * 64 );\n\n        if( v == MBEDTLS_AES_DECRYPT )\n        {\n            memcpy( buf, aes_test_cfb128_ct[u], 64 );\n            mbedtls_aes_crypt_cfb128( &ctx, v, 64, &offset, iv, buf, buf );\n\n            if( memcmp( buf, aes_test_cfb128_pt, 64 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                ret = 1;\n                goto exit;\n            }\n        }\n        else\n        {\n            memcpy( buf, aes_test_cfb128_pt, 64 );\n            mbedtls_aes_crypt_cfb128( &ctx, v, 64, &offset, iv, buf, buf );\n\n            if( memcmp( buf, aes_test_cfb128_ct[u], 64 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                ret = 1;\n                goto exit;\n            }\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    /*\n     * CTR mode\n     */\n    for( i = 0; i < 6; i++ )\n    {\n        u = i >> 1;\n        v = i  & 1;\n\n        if( verbose != 0 )\n            mbedtls_printf( \"  AES-CTR-128 (%s): \",\n                             ( v == MBEDTLS_AES_DECRYPT ) ? \"dec\" : \"enc\" );\n\n        memcpy( nonce_counter, aes_test_ctr_nonce_counter[u], 16 );\n        memcpy( key, aes_test_ctr_key[u], 16 );\n\n        offset = 0;\n        mbedtls_aes_setkey_enc( &ctx, key, 128 );\n\n        if( v == MBEDTLS_AES_DECRYPT )\n        {\n            len = aes_test_ctr_len[u];\n            memcpy( buf, aes_test_ctr_ct[u], len );\n\n            mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,\n                           buf, buf );\n\n            if( memcmp( buf, aes_test_ctr_pt[u], len ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                ret = 1;\n                goto exit;\n            }\n        }\n        else\n        {\n            len = aes_test_ctr_len[u];\n            memcpy( buf, aes_test_ctr_pt[u], len );\n\n            mbedtls_aes_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,\n                           buf, buf );\n\n            if( memcmp( buf, aes_test_ctr_ct[u], len ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                ret = 1;\n                goto exit;\n            }\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n    ret = 0;\n\nexit:\n    mbedtls_aes_free( &ctx );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_AES_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/aesni.c",
    "content": "/*\n *  AES-NI support functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * [AES-WP] http://software.intel.com/en-us/articles/intel-advanced-encryption-standard-aes-instructions-set\n * [CLMUL-WP] http://software.intel.com/en-us/articles/intel-carry-less-multiplication-instruction-and-its-usage-for-computing-the-gcm-mode/\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_AESNI_C)\n\n#include \"mbedtls/aesni.h\"\n\n#include <string.h>\n\n#ifndef asm\n#define asm __asm\n#endif\n\n#if defined(MBEDTLS_HAVE_X86_64)\n\n/*\n * AES-NI support detection routine\n */\nint mbedtls_aesni_has_support( unsigned int what )\n{\n    static int done = 0;\n    static unsigned int c = 0;\n\n    if( ! done )\n    {\n        asm( \"movl  $1, %%eax   \\n\\t\"\n             \"cpuid             \\n\\t\"\n             : \"=c\" (c)\n             :\n             : \"eax\", \"ebx\", \"edx\" );\n        done = 1;\n    }\n\n    return( ( c & what ) != 0 );\n}\n\n/*\n * Binutils needs to be at least 2.19 to support AES-NI instructions.\n * Unfortunately, a lot of users have a lower version now (2014-04).\n * Emit bytecode directly in order to support \"old\" version of gas.\n *\n * Opcodes from the Intel architecture reference manual, vol. 3.\n * We always use registers, so we don't need prefixes for memory operands.\n * Operand macros are in gas order (src, dst) as opposed to Intel order\n * (dst, src) in order to blend better into the surrounding assembly code.\n */\n#define AESDEC      \".byte 0x66,0x0F,0x38,0xDE,\"\n#define AESDECLAST  \".byte 0x66,0x0F,0x38,0xDF,\"\n#define AESENC      \".byte 0x66,0x0F,0x38,0xDC,\"\n#define AESENCLAST  \".byte 0x66,0x0F,0x38,0xDD,\"\n#define AESIMC      \".byte 0x66,0x0F,0x38,0xDB,\"\n#define AESKEYGENA  \".byte 0x66,0x0F,0x3A,0xDF,\"\n#define PCLMULQDQ   \".byte 0x66,0x0F,0x3A,0x44,\"\n\n#define xmm0_xmm0   \"0xC0\"\n#define xmm0_xmm1   \"0xC8\"\n#define xmm0_xmm2   \"0xD0\"\n#define xmm0_xmm3   \"0xD8\"\n#define xmm0_xmm4   \"0xE0\"\n#define xmm1_xmm0   \"0xC1\"\n#define xmm1_xmm2   \"0xD1\"\n\n/*\n * AES-NI AES-ECB block en(de)cryption\n */\nint mbedtls_aesni_crypt_ecb( mbedtls_aes_context *ctx,\n                     int mode,\n                     const unsigned char input[16],\n                     unsigned char output[16] )\n{\n    asm( \"movdqu    (%3), %%xmm0    \\n\\t\" // load input\n         \"movdqu    (%1), %%xmm1    \\n\\t\" // load round key 0\n         \"pxor      %%xmm1, %%xmm0  \\n\\t\" // round 0\n         \"add       $16, %1         \\n\\t\" // point to next round key\n         \"subl      $1, %0          \\n\\t\" // normal rounds = nr - 1\n         \"test      %2, %2          \\n\\t\" // mode?\n         \"jz        2f              \\n\\t\" // 0 = decrypt\n\n         \"1:                        \\n\\t\" // encryption loop\n         \"movdqu    (%1), %%xmm1    \\n\\t\" // load round key\n         AESENC     xmm1_xmm0      \"\\n\\t\" // do round\n         \"add       $16, %1         \\n\\t\" // point to next round key\n         \"subl      $1, %0          \\n\\t\" // loop\n         \"jnz       1b              \\n\\t\"\n         \"movdqu    (%1), %%xmm1    \\n\\t\" // load round key\n         AESENCLAST xmm1_xmm0      \"\\n\\t\" // last round\n         \"jmp       3f              \\n\\t\"\n\n         \"2:                        \\n\\t\" // decryption loop\n         \"movdqu    (%1), %%xmm1    \\n\\t\"\n         AESDEC     xmm1_xmm0      \"\\n\\t\" // do round\n         \"add       $16, %1         \\n\\t\"\n         \"subl      $1, %0          \\n\\t\"\n         \"jnz       2b              \\n\\t\"\n         \"movdqu    (%1), %%xmm1    \\n\\t\" // load round key\n         AESDECLAST xmm1_xmm0      \"\\n\\t\" // last round\n\n         \"3:                        \\n\\t\"\n         \"movdqu    %%xmm0, (%4)    \\n\\t\" // export output\n         :\n         : \"r\" (ctx->nr), \"r\" (ctx->rk), \"r\" (mode), \"r\" (input), \"r\" (output)\n         : \"memory\", \"cc\", \"xmm0\", \"xmm1\" );\n\n\n    return( 0 );\n}\n\n/*\n * GCM multiplication: c = a times b in GF(2^128)\n * Based on [CLMUL-WP] algorithms 1 (with equation 27) and 5.\n */\nvoid mbedtls_aesni_gcm_mult( unsigned char c[16],\n                     const unsigned char a[16],\n                     const unsigned char b[16] )\n{\n    unsigned char aa[16], bb[16], cc[16];\n    size_t i;\n\n    /* The inputs are in big-endian order, so byte-reverse them */\n    for( i = 0; i < 16; i++ )\n    {\n        aa[i] = a[15 - i];\n        bb[i] = b[15 - i];\n    }\n\n    asm( \"movdqu (%0), %%xmm0               \\n\\t\" // a1:a0\n         \"movdqu (%1), %%xmm1               \\n\\t\" // b1:b0\n\n         /*\n          * Caryless multiplication xmm2:xmm1 = xmm0 * xmm1\n          * using [CLMUL-WP] algorithm 1 (p. 13).\n          */\n         \"movdqa %%xmm1, %%xmm2             \\n\\t\" // copy of b1:b0\n         \"movdqa %%xmm1, %%xmm3             \\n\\t\" // same\n         \"movdqa %%xmm1, %%xmm4             \\n\\t\" // same\n         PCLMULQDQ xmm0_xmm1 \",0x00         \\n\\t\" // a0*b0 = c1:c0\n         PCLMULQDQ xmm0_xmm2 \",0x11         \\n\\t\" // a1*b1 = d1:d0\n         PCLMULQDQ xmm0_xmm3 \",0x10         \\n\\t\" // a0*b1 = e1:e0\n         PCLMULQDQ xmm0_xmm4 \",0x01         \\n\\t\" // a1*b0 = f1:f0\n         \"pxor %%xmm3, %%xmm4               \\n\\t\" // e1+f1:e0+f0\n         \"movdqa %%xmm4, %%xmm3             \\n\\t\" // same\n         \"psrldq $8, %%xmm4                 \\n\\t\" // 0:e1+f1\n         \"pslldq $8, %%xmm3                 \\n\\t\" // e0+f0:0\n         \"pxor %%xmm4, %%xmm2               \\n\\t\" // d1:d0+e1+f1\n         \"pxor %%xmm3, %%xmm1               \\n\\t\" // c1+e0+f1:c0\n\n         /*\n          * Now shift the result one bit to the left,\n          * taking advantage of [CLMUL-WP] eq 27 (p. 20)\n          */\n         \"movdqa %%xmm1, %%xmm3             \\n\\t\" // r1:r0\n         \"movdqa %%xmm2, %%xmm4             \\n\\t\" // r3:r2\n         \"psllq $1, %%xmm1                  \\n\\t\" // r1<<1:r0<<1\n         \"psllq $1, %%xmm2                  \\n\\t\" // r3<<1:r2<<1\n         \"psrlq $63, %%xmm3                 \\n\\t\" // r1>>63:r0>>63\n         \"psrlq $63, %%xmm4                 \\n\\t\" // r3>>63:r2>>63\n         \"movdqa %%xmm3, %%xmm5             \\n\\t\" // r1>>63:r0>>63\n         \"pslldq $8, %%xmm3                 \\n\\t\" // r0>>63:0\n         \"pslldq $8, %%xmm4                 \\n\\t\" // r2>>63:0\n         \"psrldq $8, %%xmm5                 \\n\\t\" // 0:r1>>63\n         \"por %%xmm3, %%xmm1                \\n\\t\" // r1<<1|r0>>63:r0<<1\n         \"por %%xmm4, %%xmm2                \\n\\t\" // r3<<1|r2>>62:r2<<1\n         \"por %%xmm5, %%xmm2                \\n\\t\" // r3<<1|r2>>62:r2<<1|r1>>63\n\n         /*\n          * Now reduce modulo the GCM polynomial x^128 + x^7 + x^2 + x + 1\n          * using [CLMUL-WP] algorithm 5 (p. 20).\n          * Currently xmm2:xmm1 holds x3:x2:x1:x0 (already shifted).\n          */\n         /* Step 2 (1) */\n         \"movdqa %%xmm1, %%xmm3             \\n\\t\" // x1:x0\n         \"movdqa %%xmm1, %%xmm4             \\n\\t\" // same\n         \"movdqa %%xmm1, %%xmm5             \\n\\t\" // same\n         \"psllq $63, %%xmm3                 \\n\\t\" // x1<<63:x0<<63 = stuff:a\n         \"psllq $62, %%xmm4                 \\n\\t\" // x1<<62:x0<<62 = stuff:b\n         \"psllq $57, %%xmm5                 \\n\\t\" // x1<<57:x0<<57 = stuff:c\n\n         /* Step 2 (2) */\n         \"pxor %%xmm4, %%xmm3               \\n\\t\" // stuff:a+b\n         \"pxor %%xmm5, %%xmm3               \\n\\t\" // stuff:a+b+c\n         \"pslldq $8, %%xmm3                 \\n\\t\" // a+b+c:0\n         \"pxor %%xmm3, %%xmm1               \\n\\t\" // x1+a+b+c:x0 = d:x0\n\n         /* Steps 3 and 4 */\n         \"movdqa %%xmm1,%%xmm0              \\n\\t\" // d:x0\n         \"movdqa %%xmm1,%%xmm4              \\n\\t\" // same\n         \"movdqa %%xmm1,%%xmm5              \\n\\t\" // same\n         \"psrlq $1, %%xmm0                  \\n\\t\" // e1:x0>>1 = e1:e0'\n         \"psrlq $2, %%xmm4                  \\n\\t\" // f1:x0>>2 = f1:f0'\n         \"psrlq $7, %%xmm5                  \\n\\t\" // g1:x0>>7 = g1:g0'\n         \"pxor %%xmm4, %%xmm0               \\n\\t\" // e1+f1:e0'+f0'\n         \"pxor %%xmm5, %%xmm0               \\n\\t\" // e1+f1+g1:e0'+f0'+g0'\n         // e0'+f0'+g0' is almost e0+f0+g0, ex\\tcept for some missing\n         // bits carried from d. Now get those\\t bits back in.\n         \"movdqa %%xmm1,%%xmm3              \\n\\t\" // d:x0\n         \"movdqa %%xmm1,%%xmm4              \\n\\t\" // same\n         \"movdqa %%xmm1,%%xmm5              \\n\\t\" // same\n         \"psllq $63, %%xmm3                 \\n\\t\" // d<<63:stuff\n         \"psllq $62, %%xmm4                 \\n\\t\" // d<<62:stuff\n         \"psllq $57, %%xmm5                 \\n\\t\" // d<<57:stuff\n         \"pxor %%xmm4, %%xmm3               \\n\\t\" // d<<63+d<<62:stuff\n         \"pxor %%xmm5, %%xmm3               \\n\\t\" // missing bits of d:stuff\n         \"psrldq $8, %%xmm3                 \\n\\t\" // 0:missing bits of d\n         \"pxor %%xmm3, %%xmm0               \\n\\t\" // e1+f1+g1:e0+f0+g0\n         \"pxor %%xmm1, %%xmm0               \\n\\t\" // h1:h0\n         \"pxor %%xmm2, %%xmm0               \\n\\t\" // x3+h1:x2+h0\n\n         \"movdqu %%xmm0, (%2)               \\n\\t\" // done\n         :\n         : \"r\" (aa), \"r\" (bb), \"r\" (cc)\n         : \"memory\", \"cc\", \"xmm0\", \"xmm1\", \"xmm2\", \"xmm3\", \"xmm4\", \"xmm5\" );\n\n    /* Now byte-reverse the outputs */\n    for( i = 0; i < 16; i++ )\n        c[i] = cc[15 - i];\n\n    return;\n}\n\n/*\n * Compute decryption round keys from encryption round keys\n */\nvoid mbedtls_aesni_inverse_key( unsigned char *invkey,\n                        const unsigned char *fwdkey, int nr )\n{\n    unsigned char *ik = invkey;\n    const unsigned char *fk = fwdkey + 16 * nr;\n\n    memcpy( ik, fk, 16 );\n\n    for( fk -= 16, ik += 16; fk > fwdkey; fk -= 16, ik += 16 )\n        asm( \"movdqu (%0), %%xmm0       \\n\\t\"\n             AESIMC  xmm0_xmm0         \"\\n\\t\"\n             \"movdqu %%xmm0, (%1)       \\n\\t\"\n             :\n             : \"r\" (fk), \"r\" (ik)\n             : \"memory\", \"xmm0\" );\n\n    memcpy( ik, fk, 16 );\n}\n\n/*\n * Key expansion, 128-bit case\n */\nstatic void aesni_setkey_enc_128( unsigned char *rk,\n                                  const unsigned char *key )\n{\n    asm( \"movdqu (%1), %%xmm0               \\n\\t\" // copy the original key\n         \"movdqu %%xmm0, (%0)               \\n\\t\" // as round key 0\n         \"jmp 2f                            \\n\\t\" // skip auxiliary routine\n\n         /*\n          * Finish generating the next round key.\n          *\n          * On entry xmm0 is r3:r2:r1:r0 and xmm1 is X:stuff:stuff:stuff\n          * with X = rot( sub( r3 ) ) ^ RCON.\n          *\n          * On exit, xmm0 is r7:r6:r5:r4\n          * with r4 = X + r0, r5 = r4 + r1, r6 = r5 + r2, r7 = r6 + r3\n          * and those are written to the round key buffer.\n          */\n         \"1:                                \\n\\t\"\n         \"pshufd $0xff, %%xmm1, %%xmm1      \\n\\t\" // X:X:X:X\n         \"pxor %%xmm0, %%xmm1               \\n\\t\" // X+r3:X+r2:X+r1:r4\n         \"pslldq $4, %%xmm0                 \\n\\t\" // r2:r1:r0:0\n         \"pxor %%xmm0, %%xmm1               \\n\\t\" // X+r3+r2:X+r2+r1:r5:r4\n         \"pslldq $4, %%xmm0                 \\n\\t\" // etc\n         \"pxor %%xmm0, %%xmm1               \\n\\t\"\n         \"pslldq $4, %%xmm0                 \\n\\t\"\n         \"pxor %%xmm1, %%xmm0               \\n\\t\" // update xmm0 for next time!\n         \"add $16, %0                       \\n\\t\" // point to next round key\n         \"movdqu %%xmm0, (%0)               \\n\\t\" // write it\n         \"ret                               \\n\\t\"\n\n         /* Main \"loop\" */\n         \"2:                                \\n\\t\"\n         AESKEYGENA xmm0_xmm1 \",0x01        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm0_xmm1 \",0x02        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm0_xmm1 \",0x04        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm0_xmm1 \",0x08        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm0_xmm1 \",0x10        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm0_xmm1 \",0x20        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm0_xmm1 \",0x40        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm0_xmm1 \",0x80        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm0_xmm1 \",0x1B        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm0_xmm1 \",0x36        \\n\\tcall 1b \\n\\t\"\n         :\n         : \"r\" (rk), \"r\" (key)\n         : \"memory\", \"cc\", \"0\" );\n}\n\n/*\n * Key expansion, 192-bit case\n */\nstatic void aesni_setkey_enc_192( unsigned char *rk,\n                                  const unsigned char *key )\n{\n    asm( \"movdqu (%1), %%xmm0   \\n\\t\" // copy original round key\n         \"movdqu %%xmm0, (%0)   \\n\\t\"\n         \"add $16, %0           \\n\\t\"\n         \"movq 16(%1), %%xmm1   \\n\\t\"\n         \"movq %%xmm1, (%0)     \\n\\t\"\n         \"add $8, %0            \\n\\t\"\n         \"jmp 2f                \\n\\t\" // skip auxiliary routine\n\n         /*\n          * Finish generating the next 6 quarter-keys.\n          *\n          * On entry xmm0 is r3:r2:r1:r0, xmm1 is stuff:stuff:r5:r4\n          * and xmm2 is stuff:stuff:X:stuff with X = rot( sub( r3 ) ) ^ RCON.\n          *\n          * On exit, xmm0 is r9:r8:r7:r6 and xmm1 is stuff:stuff:r11:r10\n          * and those are written to the round key buffer.\n          */\n         \"1:                            \\n\\t\"\n         \"pshufd $0x55, %%xmm2, %%xmm2  \\n\\t\" // X:X:X:X\n         \"pxor %%xmm0, %%xmm2           \\n\\t\" // X+r3:X+r2:X+r1:r4\n         \"pslldq $4, %%xmm0             \\n\\t\" // etc\n         \"pxor %%xmm0, %%xmm2           \\n\\t\"\n         \"pslldq $4, %%xmm0             \\n\\t\"\n         \"pxor %%xmm0, %%xmm2           \\n\\t\"\n         \"pslldq $4, %%xmm0             \\n\\t\"\n         \"pxor %%xmm2, %%xmm0           \\n\\t\" // update xmm0 = r9:r8:r7:r6\n         \"movdqu %%xmm0, (%0)           \\n\\t\"\n         \"add $16, %0                   \\n\\t\"\n         \"pshufd $0xff, %%xmm0, %%xmm2  \\n\\t\" // r9:r9:r9:r9\n         \"pxor %%xmm1, %%xmm2           \\n\\t\" // stuff:stuff:r9+r5:r10\n         \"pslldq $4, %%xmm1             \\n\\t\" // r2:r1:r0:0\n         \"pxor %%xmm2, %%xmm1           \\n\\t\" // xmm1 = stuff:stuff:r11:r10\n         \"movq %%xmm1, (%0)             \\n\\t\"\n         \"add $8, %0                    \\n\\t\"\n         \"ret                           \\n\\t\"\n\n         \"2:                            \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x01    \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x02    \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x04    \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x08    \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x10    \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x20    \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x40    \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x80    \\n\\tcall 1b \\n\\t\"\n\n         :\n         : \"r\" (rk), \"r\" (key)\n         : \"memory\", \"cc\", \"0\" );\n}\n\n/*\n * Key expansion, 256-bit case\n */\nstatic void aesni_setkey_enc_256( unsigned char *rk,\n                                  const unsigned char *key )\n{\n    asm( \"movdqu (%1), %%xmm0           \\n\\t\"\n         \"movdqu %%xmm0, (%0)           \\n\\t\"\n         \"add $16, %0                   \\n\\t\"\n         \"movdqu 16(%1), %%xmm1         \\n\\t\"\n         \"movdqu %%xmm1, (%0)           \\n\\t\"\n         \"jmp 2f                        \\n\\t\" // skip auxiliary routine\n\n         /*\n          * Finish generating the next two round keys.\n          *\n          * On entry xmm0 is r3:r2:r1:r0, xmm1 is r7:r6:r5:r4 and\n          * xmm2 is X:stuff:stuff:stuff with X = rot( sub( r7 )) ^ RCON\n          *\n          * On exit, xmm0 is r11:r10:r9:r8 and xmm1 is r15:r14:r13:r12\n          * and those have been written to the output buffer.\n          */\n         \"1:                                \\n\\t\"\n         \"pshufd $0xff, %%xmm2, %%xmm2      \\n\\t\"\n         \"pxor %%xmm0, %%xmm2               \\n\\t\"\n         \"pslldq $4, %%xmm0                 \\n\\t\"\n         \"pxor %%xmm0, %%xmm2               \\n\\t\"\n         \"pslldq $4, %%xmm0                 \\n\\t\"\n         \"pxor %%xmm0, %%xmm2               \\n\\t\"\n         \"pslldq $4, %%xmm0                 \\n\\t\"\n         \"pxor %%xmm2, %%xmm0               \\n\\t\"\n         \"add $16, %0                       \\n\\t\"\n         \"movdqu %%xmm0, (%0)               \\n\\t\"\n\n         /* Set xmm2 to stuff:Y:stuff:stuff with Y = subword( r11 )\n          * and proceed to generate next round key from there */\n         AESKEYGENA xmm0_xmm2 \",0x00        \\n\\t\"\n         \"pshufd $0xaa, %%xmm2, %%xmm2      \\n\\t\"\n         \"pxor %%xmm1, %%xmm2               \\n\\t\"\n         \"pslldq $4, %%xmm1                 \\n\\t\"\n         \"pxor %%xmm1, %%xmm2               \\n\\t\"\n         \"pslldq $4, %%xmm1                 \\n\\t\"\n         \"pxor %%xmm1, %%xmm2               \\n\\t\"\n         \"pslldq $4, %%xmm1                 \\n\\t\"\n         \"pxor %%xmm2, %%xmm1               \\n\\t\"\n         \"add $16, %0                       \\n\\t\"\n         \"movdqu %%xmm1, (%0)               \\n\\t\"\n         \"ret                               \\n\\t\"\n\n         /*\n          * Main \"loop\" - Generating one more key than necessary,\n          * see definition of mbedtls_aes_context.buf\n          */\n         \"2:                                \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x01        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x02        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x04        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x08        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x10        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x20        \\n\\tcall 1b \\n\\t\"\n         AESKEYGENA xmm1_xmm2 \",0x40        \\n\\tcall 1b \\n\\t\"\n         :\n         : \"r\" (rk), \"r\" (key)\n         : \"memory\", \"cc\", \"0\" );\n}\n\n/*\n * Key expansion, wrapper\n */\nint mbedtls_aesni_setkey_enc( unsigned char *rk,\n                      const unsigned char *key,\n                      size_t bits )\n{\n    switch( bits )\n    {\n        case 128: aesni_setkey_enc_128( rk, key ); break;\n        case 192: aesni_setkey_enc_192( rk, key ); break;\n        case 256: aesni_setkey_enc_256( rk, key ); break;\n        default : return( MBEDTLS_ERR_AES_INVALID_KEY_LENGTH );\n    }\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_HAVE_X86_64 */\n\n#endif /* MBEDTLS_AESNI_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/arc4.c",
    "content": "/*\n *  An implementation of the ARCFOUR algorithm\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The ARCFOUR algorithm was publicly disclosed on 94/09.\n *\n *  http://groups.google.com/group/sci.crypt/msg/10a300c9d21afca0\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ARC4_C)\n\n#include \"mbedtls/arc4.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_ARC4_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\nvoid mbedtls_arc4_init( mbedtls_arc4_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_arc4_context ) );\n}\n\nvoid mbedtls_arc4_free( mbedtls_arc4_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_arc4_context ) );\n}\n\n/*\n * ARC4 key schedule\n */\nvoid mbedtls_arc4_setup( mbedtls_arc4_context *ctx, const unsigned char *key,\n                 unsigned int keylen )\n{\n    int i, j, a;\n    unsigned int k;\n    unsigned char *m;\n\n    ctx->x = 0;\n    ctx->y = 0;\n    m = ctx->m;\n\n    for( i = 0; i < 256; i++ )\n        m[i] = (unsigned char) i;\n\n    j = k = 0;\n\n    for( i = 0; i < 256; i++, k++ )\n    {\n        if( k >= keylen ) k = 0;\n\n        a = m[i];\n        j = ( j + a + key[k] ) & 0xFF;\n        m[i] = m[j];\n        m[j] = (unsigned char) a;\n    }\n}\n\n/*\n * ARC4 cipher function\n */\nint mbedtls_arc4_crypt( mbedtls_arc4_context *ctx, size_t length, const unsigned char *input,\n                unsigned char *output )\n{\n    int x, y, a, b;\n    size_t i;\n    unsigned char *m;\n\n    x = ctx->x;\n    y = ctx->y;\n    m = ctx->m;\n\n    for( i = 0; i < length; i++ )\n    {\n        x = ( x + 1 ) & 0xFF; a = m[x];\n        y = ( y + a ) & 0xFF; b = m[y];\n\n        m[x] = (unsigned char) b;\n        m[y] = (unsigned char) a;\n\n        output[i] = (unsigned char)\n            ( input[i] ^ m[(unsigned char)( a + b )] );\n    }\n\n    ctx->x = x;\n    ctx->y = y;\n\n    return( 0 );\n}\n\n#endif /* !MBEDTLS_ARC4_ALT */\n\n#if defined(MBEDTLS_SELF_TEST)\n/*\n * ARC4 tests vectors as posted by Eric Rescorla in sep. 1994:\n *\n * http://groups.google.com/group/comp.security.misc/msg/10a300c9d21afca0\n */\nstatic const unsigned char arc4_test_key[3][8] =\n{\n    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },\n    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },\n    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\n};\n\nstatic const unsigned char arc4_test_pt[3][8] =\n{\n    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF },\n    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },\n    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\n};\n\nstatic const unsigned char arc4_test_ct[3][8] =\n{\n    { 0x75, 0xB7, 0x87, 0x80, 0x99, 0xE0, 0xC5, 0x96 },\n    { 0x74, 0x94, 0xC2, 0xE7, 0x10, 0x4B, 0x08, 0x79 },\n    { 0xDE, 0x18, 0x89, 0x41, 0xA3, 0x37, 0x5D, 0x3A }\n};\n\n/*\n * Checkup routine\n */\nint mbedtls_arc4_self_test( int verbose )\n{\n    int i, ret = 0;\n    unsigned char ibuf[8];\n    unsigned char obuf[8];\n    mbedtls_arc4_context ctx;\n\n    mbedtls_arc4_init( &ctx );\n\n    for( i = 0; i < 3; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  ARC4 test #%d: \", i + 1 );\n\n        memcpy( ibuf, arc4_test_pt[i], 8 );\n\n        mbedtls_arc4_setup( &ctx, arc4_test_key[i], 8 );\n        mbedtls_arc4_crypt( &ctx, 8, ibuf, obuf );\n\n        if( memcmp( obuf, arc4_test_ct[i], 8 ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            ret = 1;\n            goto exit;\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\nexit:\n    mbedtls_arc4_free( &ctx );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_ARC4_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/asn1parse.c",
    "content": "/*\n *  Generic ASN.1 parsing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ASN1_PARSE_C)\n\n#include \"mbedtls/asn1.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_BIGNUM_C)\n#include \"mbedtls/bignum.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\n/*\n * ASN.1 DER decoding routines\n */\nint mbedtls_asn1_get_len( unsigned char **p,\n                  const unsigned char *end,\n                  size_t *len )\n{\n    if( ( end - *p ) < 1 )\n        return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    if( ( **p & 0x80 ) == 0 )\n        *len = *(*p)++;\n    else\n    {\n        switch( **p & 0x7F )\n        {\n        case 1:\n            if( ( end - *p ) < 2 )\n                return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n            *len = (*p)[1];\n            (*p) += 2;\n            break;\n\n        case 2:\n            if( ( end - *p ) < 3 )\n                return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n            *len = ( (size_t)(*p)[1] << 8 ) | (*p)[2];\n            (*p) += 3;\n            break;\n\n        case 3:\n            if( ( end - *p ) < 4 )\n                return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n            *len = ( (size_t)(*p)[1] << 16 ) |\n                   ( (size_t)(*p)[2] << 8  ) | (*p)[3];\n            (*p) += 4;\n            break;\n\n        case 4:\n            if( ( end - *p ) < 5 )\n                return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n            *len = ( (size_t)(*p)[1] << 24 ) | ( (size_t)(*p)[2] << 16 ) |\n                   ( (size_t)(*p)[3] << 8  ) |           (*p)[4];\n            (*p) += 5;\n            break;\n\n        default:\n            return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );\n        }\n    }\n\n    if( *len > (size_t) ( end - *p ) )\n        return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    return( 0 );\n}\n\nint mbedtls_asn1_get_tag( unsigned char **p,\n                  const unsigned char *end,\n                  size_t *len, int tag )\n{\n    if( ( end - *p ) < 1 )\n        return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    if( **p != tag )\n        return( MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n\n    (*p)++;\n\n    return( mbedtls_asn1_get_len( p, end, len ) );\n}\n\nint mbedtls_asn1_get_bool( unsigned char **p,\n                   const unsigned char *end,\n                   int *val )\n{\n    int ret;\n    size_t len;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_BOOLEAN ) ) != 0 )\n        return( ret );\n\n    if( len != 1 )\n        return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );\n\n    *val = ( **p != 0 ) ? 1 : 0;\n    (*p)++;\n\n    return( 0 );\n}\n\nint mbedtls_asn1_get_int( unsigned char **p,\n                  const unsigned char *end,\n                  int *val )\n{\n    int ret;\n    size_t len;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 )\n        return( ret );\n\n    if( len == 0 || len > sizeof( int ) || ( **p & 0x80 ) != 0 )\n        return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );\n\n    *val = 0;\n\n    while( len-- > 0 )\n    {\n        *val = ( *val << 8 ) | **p;\n        (*p)++;\n    }\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_BIGNUM_C)\nint mbedtls_asn1_get_mpi( unsigned char **p,\n                  const unsigned char *end,\n                  mbedtls_mpi *X )\n{\n    int ret;\n    size_t len;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len, MBEDTLS_ASN1_INTEGER ) ) != 0 )\n        return( ret );\n\n    ret = mbedtls_mpi_read_binary( X, *p, len );\n\n    *p += len;\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C */\n\nint mbedtls_asn1_get_bitstring( unsigned char **p, const unsigned char *end,\n                        mbedtls_asn1_bitstring *bs)\n{\n    int ret;\n\n    /* Certificate type is a single byte bitstring */\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &bs->len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 )\n        return( ret );\n\n    /* Check length, subtract one for actual bit string length */\n    if( bs->len < 1 )\n        return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n    bs->len -= 1;\n\n    /* Get number of unused bits, ensure unused bits <= 7 */\n    bs->unused_bits = **p;\n    if( bs->unused_bits > 7 )\n        return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );\n    (*p)++;\n\n    /* Get actual bitstring */\n    bs->p = *p;\n    *p += bs->len;\n\n    if( *p != end )\n        return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n/*\n * Get a bit string without unused bits\n */\nint mbedtls_asn1_get_bitstring_null( unsigned char **p, const unsigned char *end,\n                             size_t *len )\n{\n    int ret;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, len, MBEDTLS_ASN1_BIT_STRING ) ) != 0 )\n        return( ret );\n\n    if( (*len)-- < 2 || *(*p)++ != 0 )\n        return( MBEDTLS_ERR_ASN1_INVALID_DATA );\n\n    return( 0 );\n}\n\n\n\n/*\n *  Parses and splits an ASN.1 \"SEQUENCE OF <tag>\"\n */\nint mbedtls_asn1_get_sequence_of( unsigned char **p,\n                          const unsigned char *end,\n                          mbedtls_asn1_sequence *cur,\n                          int tag)\n{\n    int ret;\n    size_t len;\n    mbedtls_asn1_buf *buf;\n\n    /* Get main sequence tag */\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( ret );\n\n    if( *p + len != end )\n        return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    while( *p < end )\n    {\n        buf = &(cur->buf);\n        buf->tag = **p;\n\n        if( ( ret = mbedtls_asn1_get_tag( p, end, &buf->len, tag ) ) != 0 )\n            return( ret );\n\n        buf->p = *p;\n        *p += buf->len;\n\n        /* Allocate and assign next pointer */\n        if( *p < end )\n        {\n            cur->next = (mbedtls_asn1_sequence*)mbedtls_calloc( 1,\n                                            sizeof( mbedtls_asn1_sequence ) );\n\n            if( cur->next == NULL )\n                return( MBEDTLS_ERR_ASN1_ALLOC_FAILED );\n\n            cur = cur->next;\n        }\n    }\n\n    /* Set final sequence entry's next pointer to NULL */\n    cur->next = NULL;\n\n    if( *p != end )\n        return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\nint mbedtls_asn1_get_alg( unsigned char **p,\n                  const unsigned char *end,\n                  mbedtls_asn1_buf *alg, mbedtls_asn1_buf *params )\n{\n    int ret;\n    size_t len;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( ret );\n\n    if( ( end - *p ) < 1 )\n        return( MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    alg->tag = **p;\n    end = *p + len;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &alg->len, MBEDTLS_ASN1_OID ) ) != 0 )\n        return( ret );\n\n    alg->p = *p;\n    *p += alg->len;\n\n    if( *p == end )\n    {\n        mbedtls_zeroize( params, sizeof(mbedtls_asn1_buf) );\n        return( 0 );\n    }\n\n    params->tag = **p;\n    (*p)++;\n\n    if( ( ret = mbedtls_asn1_get_len( p, end, &params->len ) ) != 0 )\n        return( ret );\n\n    params->p = *p;\n    *p += params->len;\n\n    if( *p != end )\n        return( MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\nint mbedtls_asn1_get_alg_null( unsigned char **p,\n                       const unsigned char *end,\n                       mbedtls_asn1_buf *alg )\n{\n    int ret;\n    mbedtls_asn1_buf params;\n\n    memset( &params, 0, sizeof(mbedtls_asn1_buf) );\n\n    if( ( ret = mbedtls_asn1_get_alg( p, end, alg, &params ) ) != 0 )\n        return( ret );\n\n    if( ( params.tag != MBEDTLS_ASN1_NULL && params.tag != 0 ) || params.len != 0 )\n        return( MBEDTLS_ERR_ASN1_INVALID_DATA );\n\n    return( 0 );\n}\n\nvoid mbedtls_asn1_free_named_data( mbedtls_asn1_named_data *cur )\n{\n    if( cur == NULL )\n        return;\n\n    mbedtls_free( cur->oid.p );\n    mbedtls_free( cur->val.p );\n\n    mbedtls_zeroize( cur, sizeof( mbedtls_asn1_named_data ) );\n}\n\nvoid mbedtls_asn1_free_named_data_list( mbedtls_asn1_named_data **head )\n{\n    mbedtls_asn1_named_data *cur;\n\n    while( ( cur = *head ) != NULL )\n    {\n        *head = cur->next;\n        mbedtls_asn1_free_named_data( cur );\n        mbedtls_free( cur );\n    }\n}\n\nmbedtls_asn1_named_data *mbedtls_asn1_find_named_data( mbedtls_asn1_named_data *list,\n                                       const char *oid, size_t len )\n{\n    while( list != NULL )\n    {\n        if( list->oid.len == len &&\n            memcmp( list->oid.p, oid, len ) == 0 )\n        {\n            break;\n        }\n\n        list = list->next;\n    }\n\n    return( list );\n}\n\n#endif /* MBEDTLS_ASN1_PARSE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/asn1write.c",
    "content": "/*\n * ASN.1 buffer writing functionality\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ASN1_WRITE_C)\n\n#include \"mbedtls/asn1write.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\nint mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len )\n{\n    if( len < 0x80 )\n    {\n        if( *p - start < 1 )\n            return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n        *--(*p) = (unsigned char) len;\n        return( 1 );\n    }\n\n    if( len <= 0xFF )\n    {\n        if( *p - start < 2 )\n            return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n        *--(*p) = (unsigned char) len;\n        *--(*p) = 0x81;\n        return( 2 );\n    }\n\n    if( len <= 0xFFFF )\n    {\n        if( *p - start < 3 )\n            return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n        *--(*p) = ( len       ) & 0xFF;\n        *--(*p) = ( len >>  8 ) & 0xFF;\n        *--(*p) = 0x82;\n        return( 3 );\n    }\n\n    if( len <= 0xFFFFFF )\n    {\n        if( *p - start < 4 )\n            return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n        *--(*p) = ( len       ) & 0xFF;\n        *--(*p) = ( len >>  8 ) & 0xFF;\n        *--(*p) = ( len >> 16 ) & 0xFF;\n        *--(*p) = 0x83;\n        return( 4 );\n    }\n\n    if( len <= 0xFFFFFFFF )\n    {\n        if( *p - start < 5 )\n            return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n        *--(*p) = ( len       ) & 0xFF;\n        *--(*p) = ( len >>  8 ) & 0xFF;\n        *--(*p) = ( len >> 16 ) & 0xFF;\n        *--(*p) = ( len >> 24 ) & 0xFF;\n        *--(*p) = 0x84;\n        return( 5 );\n    }\n\n    return( MBEDTLS_ERR_ASN1_INVALID_LENGTH );\n}\n\nint mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start, unsigned char tag )\n{\n    if( *p - start < 1 )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    *--(*p) = tag;\n\n    return( 1 );\n}\n\nint mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start,\n                           const unsigned char *buf, size_t size )\n{\n    size_t len = 0;\n\n    if( *p < start || (size_t)( *p - start ) < size )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    len = size;\n    (*p) -= len;\n    memcpy( *p, buf, len );\n\n    return( (int) len );\n}\n\n#if defined(MBEDTLS_BIGNUM_C)\nint mbedtls_asn1_write_mpi( unsigned char **p, unsigned char *start, const mbedtls_mpi *X )\n{\n    int ret;\n    size_t len = 0;\n\n    // Write the MPI\n    //\n    len = mbedtls_mpi_size( X );\n\n    if( *p < start || (size_t)( *p - start ) < len )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    (*p) -= len;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( X, *p, len ) );\n\n    // DER format assumes 2s complement for numbers, so the leftmost bit\n    // should be 0 for positive numbers and 1 for negative numbers.\n    //\n    if( X->s ==1 && **p & 0x80 )\n    {\n        if( *p - start < 1 )\n            return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n        *--(*p) = 0x00;\n        len += 1;\n    }\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_INTEGER ) );\n\n    ret = (int) len;\n\ncleanup:\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C */\n\nint mbedtls_asn1_write_null( unsigned char **p, unsigned char *start )\n{\n    int ret;\n    size_t len = 0;\n\n    // Write NULL\n    //\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, 0) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_NULL ) );\n\n    return( (int) len );\n}\n\nint mbedtls_asn1_write_oid( unsigned char **p, unsigned char *start,\n                    const char *oid, size_t oid_len )\n{\n    int ret;\n    size_t len = 0;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,\n                                  (const unsigned char *) oid, oid_len ) );\n    MBEDTLS_ASN1_CHK_ADD( len , mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len , mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OID ) );\n\n    return( (int) len );\n}\n\nint mbedtls_asn1_write_algorithm_identifier( unsigned char **p, unsigned char *start,\n                                     const char *oid, size_t oid_len,\n                                     size_t par_len )\n{\n    int ret;\n    size_t len = 0;\n\n    if( par_len == 0 )\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_null( p, start ) );\n    else\n        len += par_len;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start,\n                                       MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) );\n\n    return( (int) len );\n}\n\nint mbedtls_asn1_write_bool( unsigned char **p, unsigned char *start, int boolean )\n{\n    int ret;\n    size_t len = 0;\n\n    if( *p - start < 1 )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    *--(*p) = (boolean) ? 255 : 0;\n    len++;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BOOLEAN ) );\n\n    return( (int) len );\n}\n\nint mbedtls_asn1_write_int( unsigned char **p, unsigned char *start, int val )\n{\n    int ret;\n    size_t len = 0;\n\n    // TODO negative values and values larger than 128\n    // DER format assumes 2s complement for numbers, so the leftmost bit\n    // should be 0 for positive numbers and 1 for negative numbers.\n    //\n    if( *p - start < 1 )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    len += 1;\n    *--(*p) = val;\n\n    if( val > 0 && **p & 0x80 )\n    {\n        if( *p - start < 1 )\n            return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n        *--(*p) = 0x00;\n        len += 1;\n    }\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_INTEGER ) );\n\n    return( (int) len );\n}\n\nint mbedtls_asn1_write_printable_string( unsigned char **p, unsigned char *start,\n                                 const char *text, size_t text_len )\n{\n    int ret;\n    size_t len = 0;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,\n                  (const unsigned char *) text, text_len ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_PRINTABLE_STRING ) );\n\n    return( (int) len );\n}\n\nint mbedtls_asn1_write_ia5_string( unsigned char **p, unsigned char *start,\n                           const char *text, size_t text_len )\n{\n    int ret;\n    size_t len = 0;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,\n                  (const unsigned char *) text, text_len ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_IA5_STRING ) );\n\n    return( (int) len );\n}\n\nint mbedtls_asn1_write_bitstring( unsigned char **p, unsigned char *start,\n                          const unsigned char *buf, size_t bits )\n{\n    int ret;\n    size_t len = 0, size;\n\n    size = ( bits / 8 ) + ( ( bits % 8 ) ? 1 : 0 );\n\n    // Calculate byte length\n    //\n    if( *p < start || (size_t)( *p - start ) < size + 1 )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    len = size + 1;\n    (*p) -= size;\n    memcpy( *p, buf, size );\n\n    // Write unused bits\n    //\n    *--(*p) = (unsigned char) (size * 8 - bits);\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BIT_STRING ) );\n\n    return( (int) len );\n}\n\nint mbedtls_asn1_write_octet_string( unsigned char **p, unsigned char *start,\n                             const unsigned char *buf, size_t size )\n{\n    int ret;\n    size_t len = 0;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, buf, size ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OCTET_STRING ) );\n\n    return( (int) len );\n}\n\nmbedtls_asn1_named_data *mbedtls_asn1_store_named_data( mbedtls_asn1_named_data **head,\n                                        const char *oid, size_t oid_len,\n                                        const unsigned char *val,\n                                        size_t val_len )\n{\n    mbedtls_asn1_named_data *cur;\n\n    if( ( cur = mbedtls_asn1_find_named_data( *head, oid, oid_len ) ) == NULL )\n    {\n        // Add new entry if not present yet based on OID\n        //\n        cur = (mbedtls_asn1_named_data*)mbedtls_calloc( 1,\n                                            sizeof(mbedtls_asn1_named_data) );\n        if( cur == NULL )\n            return( NULL );\n\n        cur->oid.len = oid_len;\n        cur->oid.p = mbedtls_calloc( 1, oid_len );\n        if( cur->oid.p == NULL )\n        {\n            mbedtls_free( cur );\n            return( NULL );\n        }\n\n        memcpy( cur->oid.p, oid, oid_len );\n\n        cur->val.len = val_len;\n        cur->val.p = mbedtls_calloc( 1, val_len );\n        if( cur->val.p == NULL )\n        {\n            mbedtls_free( cur->oid.p );\n            mbedtls_free( cur );\n            return( NULL );\n        }\n\n        cur->next = *head;\n        *head = cur;\n    }\n    else if( cur->val.len < val_len )\n    {\n        /*\n         * Enlarge existing value buffer if needed\n         * Preserve old data until the allocation succeeded, to leave list in\n         * a consistent state in case allocation fails.\n         */\n        void *p = mbedtls_calloc( 1, val_len );\n        if( p == NULL )\n            return( NULL );\n\n        mbedtls_free( cur->val.p );\n        cur->val.p = p;\n        cur->val.len = val_len;\n    }\n\n    if( val != NULL )\n        memcpy( cur->val.p, val, val_len );\n\n    return( cur );\n}\n#endif /* MBEDTLS_ASN1_WRITE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/base64.c",
    "content": "/*\n *  RFC 1521 base64 encoding/decoding\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_BASE64_C)\n\n#include \"mbedtls/base64.h\"\n\n#include <stdint.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#include <string.h>\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\nstatic const unsigned char base64_enc_map[64] =\n{\n    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',\n    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',\n    'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd',\n    'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',\n    'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',\n    'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7',\n    '8', '9', '+', '/'\n};\n\nstatic const unsigned char base64_dec_map[128] =\n{\n    127, 127, 127, 127, 127, 127, 127, 127, 127, 127,\n    127, 127, 127, 127, 127, 127, 127, 127, 127, 127,\n    127, 127, 127, 127, 127, 127, 127, 127, 127, 127,\n    127, 127, 127, 127, 127, 127, 127, 127, 127, 127,\n    127, 127, 127,  62, 127, 127, 127,  63,  52,  53,\n     54,  55,  56,  57,  58,  59,  60,  61, 127, 127,\n    127,  64, 127, 127, 127,   0,   1,   2,   3,   4,\n      5,   6,   7,   8,   9,  10,  11,  12,  13,  14,\n     15,  16,  17,  18,  19,  20,  21,  22,  23,  24,\n     25, 127, 127, 127, 127, 127, 127,  26,  27,  28,\n     29,  30,  31,  32,  33,  34,  35,  36,  37,  38,\n     39,  40,  41,  42,  43,  44,  45,  46,  47,  48,\n     49,  50,  51, 127, 127, 127, 127, 127\n};\n\n#define BASE64_SIZE_T_MAX   ( (size_t) -1 ) /* SIZE_T_MAX is not standard */\n\n/*\n * Encode a buffer into base64 format\n */\nint mbedtls_base64_encode( unsigned char *dst, size_t dlen, size_t *olen,\n                   const unsigned char *src, size_t slen )\n{\n    size_t i, n;\n    int C1, C2, C3;\n    unsigned char *p;\n\n    if( slen == 0 )\n    {\n        *olen = 0;\n        return( 0 );\n    }\n\n    n = slen / 3 + ( slen % 3 != 0 );\n\n    if( n > ( BASE64_SIZE_T_MAX - 1 ) / 4 )\n    {\n        *olen = BASE64_SIZE_T_MAX;\n        return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );\n    }\n\n    n *= 4;\n\n    if( ( dlen < n + 1 ) || ( NULL == dst ) )\n    {\n        *olen = n + 1;\n        return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );\n    }\n\n    n = ( slen / 3 ) * 3;\n\n    for( i = 0, p = dst; i < n; i += 3 )\n    {\n        C1 = *src++;\n        C2 = *src++;\n        C3 = *src++;\n\n        *p++ = base64_enc_map[(C1 >> 2) & 0x3F];\n        *p++ = base64_enc_map[(((C1 &  3) << 4) + (C2 >> 4)) & 0x3F];\n        *p++ = base64_enc_map[(((C2 & 15) << 2) + (C3 >> 6)) & 0x3F];\n        *p++ = base64_enc_map[C3 & 0x3F];\n    }\n\n    if( i < slen )\n    {\n        C1 = *src++;\n        C2 = ( ( i + 1 ) < slen ) ? *src++ : 0;\n\n        *p++ = base64_enc_map[(C1 >> 2) & 0x3F];\n        *p++ = base64_enc_map[(((C1 & 3) << 4) + (C2 >> 4)) & 0x3F];\n\n        if( ( i + 1 ) < slen )\n             *p++ = base64_enc_map[((C2 & 15) << 2) & 0x3F];\n        else *p++ = '=';\n\n        *p++ = '=';\n    }\n\n    *olen = p - dst;\n    *p = 0;\n\n    return( 0 );\n}\n\n/*\n * Decode a base64-formatted buffer\n */\nint mbedtls_base64_decode( unsigned char *dst, size_t dlen, size_t *olen,\n                   const unsigned char *src, size_t slen )\n{\n    size_t i, n;\n    uint32_t j, x;\n    unsigned char *p;\n\n    /* First pass: check for validity and get output length */\n    for( i = n = j = 0; i < slen; i++ )\n    {\n        /* Skip spaces before checking for EOL */\n        x = 0;\n        while( i < slen && src[i] == ' ' )\n        {\n            ++i;\n            ++x;\n        }\n\n        /* Spaces at end of buffer are OK */\n        if( i == slen )\n            break;\n\n        if( ( slen - i ) >= 2 &&\n            src[i] == '\\r' && src[i + 1] == '\\n' )\n            continue;\n\n        if( src[i] == '\\n' )\n            continue;\n\n        /* Space inside a line is an error */\n        if( x != 0 )\n            return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );\n\n        if( src[i] == '=' && ++j > 2 )\n            return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );\n\n        if( src[i] > 127 || base64_dec_map[src[i]] == 127 )\n            return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );\n\n        if( base64_dec_map[src[i]] < 64 && j != 0 )\n            return( MBEDTLS_ERR_BASE64_INVALID_CHARACTER );\n\n        n++;\n    }\n\n    if( n == 0 )\n    {\n        *olen = 0;\n        return( 0 );\n    }\n\n    /* The following expression is to calculate the following formula without\n     * risk of integer overflow in n:\n     *     n = ( ( n * 6 ) + 7 ) >> 3;\n     */\n    n = ( 6 * ( n >> 3 ) ) + ( ( 6 * ( n & 0x7 ) + 7 ) >> 3 );\n    n -= j;\n\n    if( dst == NULL || dlen < n )\n    {\n        *olen = n;\n        return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );\n    }\n\n   for( j = 3, n = x = 0, p = dst; i > 0; i--, src++ )\n   {\n        if( *src == '\\r' || *src == '\\n' || *src == ' ' )\n            continue;\n\n        j -= ( base64_dec_map[*src] == 64 );\n        x  = ( x << 6 ) | ( base64_dec_map[*src] & 0x3F );\n\n        if( ++n == 4 )\n        {\n            n = 0;\n            if( j > 0 ) *p++ = (unsigned char)( x >> 16 );\n            if( j > 1 ) *p++ = (unsigned char)( x >>  8 );\n            if( j > 2 ) *p++ = (unsigned char)( x       );\n        }\n    }\n\n    *olen = p - dst;\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n\nstatic const unsigned char base64_test_dec[64] =\n{\n    0x24, 0x48, 0x6E, 0x56, 0x87, 0x62, 0x5A, 0xBD,\n    0xBF, 0x17, 0xD9, 0xA2, 0xC4, 0x17, 0x1A, 0x01,\n    0x94, 0xED, 0x8F, 0x1E, 0x11, 0xB3, 0xD7, 0x09,\n    0x0C, 0xB6, 0xE9, 0x10, 0x6F, 0x22, 0xEE, 0x13,\n    0xCA, 0xB3, 0x07, 0x05, 0x76, 0xC9, 0xFA, 0x31,\n    0x6C, 0x08, 0x34, 0xFF, 0x8D, 0xC2, 0x6C, 0x38,\n    0x00, 0x43, 0xE9, 0x54, 0x97, 0xAF, 0x50, 0x4B,\n    0xD1, 0x41, 0xBA, 0x95, 0x31, 0x5A, 0x0B, 0x97\n};\n\nstatic const unsigned char base64_test_enc[] =\n    \"JEhuVodiWr2/F9mixBcaAZTtjx4Rs9cJDLbpEG8i7hPK\"\n    \"swcFdsn6MWwINP+Nwmw4AEPpVJevUEvRQbqVMVoLlw==\";\n\n/*\n * Checkup routine\n */\nint mbedtls_base64_self_test( int verbose )\n{\n    size_t len;\n    const unsigned char *src;\n    unsigned char buffer[128];\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  Base64 encoding test: \" );\n\n    src = base64_test_dec;\n\n    if( mbedtls_base64_encode( buffer, sizeof( buffer ), &len, src, 64 ) != 0 ||\n         memcmp( base64_test_enc, buffer, 88 ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( 1 );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n  Base64 decoding test: \" );\n\n    src = base64_test_enc;\n\n    if( mbedtls_base64_decode( buffer, sizeof( buffer ), &len, src, 88 ) != 0 ||\n         memcmp( base64_test_dec, buffer, 64 ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( 1 );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\\n\" );\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_BASE64_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/bignum.c",
    "content": "/*\n *  Multi-precision integer library\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n *  The following sources were referenced in the design of this Multi-precision\n *  Integer library:\n *\n *  [1] Handbook of Applied Cryptography - 1997\n *      Menezes, van Oorschot and Vanstone\n *\n *  [2] Multi-Precision Math\n *      Tom St Denis\n *      https://github.com/libtom/libtommath/blob/develop/tommath.pdf\n *\n *  [3] GNU Multi-Precision Arithmetic Library\n *      https://gmplib.org/manual/index.html\n *\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_BIGNUM_C)\n\n#include \"mbedtls/bignum.h\"\n#include \"mbedtls/bn_mul.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_printf     printf\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_mpi_zeroize( mbedtls_mpi_uint *v, size_t n ) {\n    volatile mbedtls_mpi_uint *p = v; while( n-- ) *p++ = 0;\n}\n\n#define ciL    (sizeof(mbedtls_mpi_uint))         /* chars in limb  */\n#define biL    (ciL << 3)               /* bits  in limb  */\n#define biH    (ciL << 2)               /* half limb size */\n\n#define MPI_SIZE_T_MAX  ( (size_t) -1 ) /* SIZE_T_MAX is not standard */\n\n/*\n * Convert between bits/chars and number of limbs\n * Divide first in order to avoid potential overflows\n */\n#define BITS_TO_LIMBS(i)  ( (i) / biL + ( (i) % biL != 0 ) )\n#define CHARS_TO_LIMBS(i) ( (i) / ciL + ( (i) % ciL != 0 ) )\n\n/*\n * Initialize one MPI\n */\nvoid mbedtls_mpi_init( mbedtls_mpi *X )\n{\n    if( X == NULL )\n        return;\n\n    X->s = 1;\n    X->n = 0;\n    X->p = NULL;\n}\n\n/*\n * Unallocate one MPI\n */\nvoid mbedtls_mpi_free( mbedtls_mpi *X )\n{\n    if( X == NULL )\n        return;\n\n    if( X->p != NULL )\n    {\n        mbedtls_mpi_zeroize( X->p, X->n );\n        mbedtls_free( X->p );\n    }\n\n    X->s = 1;\n    X->n = 0;\n    X->p = NULL;\n}\n\n/*\n * Enlarge to the specified number of limbs\n */\nint mbedtls_mpi_grow( mbedtls_mpi *X, size_t nblimbs )\n{\n    mbedtls_mpi_uint *p;\n\n    if( nblimbs > MBEDTLS_MPI_MAX_LIMBS )\n        return( MBEDTLS_ERR_MPI_ALLOC_FAILED );\n\n    if( X->n < nblimbs )\n    {\n        if( ( p = (mbedtls_mpi_uint*)mbedtls_calloc( nblimbs, ciL ) ) == NULL )\n            return( MBEDTLS_ERR_MPI_ALLOC_FAILED );\n\n        if( X->p != NULL )\n        {\n            memcpy( p, X->p, X->n * ciL );\n            mbedtls_mpi_zeroize( X->p, X->n );\n            mbedtls_free( X->p );\n        }\n\n        X->n = nblimbs;\n        X->p = p;\n    }\n\n    return( 0 );\n}\n\n/*\n * Resize down as much as possible,\n * while keeping at least the specified number of limbs\n */\nint mbedtls_mpi_shrink( mbedtls_mpi *X, size_t nblimbs )\n{\n    mbedtls_mpi_uint *p;\n    size_t i;\n\n    /* Actually resize up in this case */\n    if( X->n <= nblimbs )\n        return( mbedtls_mpi_grow( X, nblimbs ) );\n\n    for( i = X->n - 1; i > 0; i-- )\n        if( X->p[i] != 0 )\n            break;\n    i++;\n\n    if( i < nblimbs )\n        i = nblimbs;\n\n    if( ( p = (mbedtls_mpi_uint*)mbedtls_calloc( i, ciL ) ) == NULL )\n        return( MBEDTLS_ERR_MPI_ALLOC_FAILED );\n\n    if( X->p != NULL )\n    {\n        memcpy( p, X->p, i * ciL );\n        mbedtls_mpi_zeroize( X->p, X->n );\n        mbedtls_free( X->p );\n    }\n\n    X->n = i;\n    X->p = p;\n\n    return( 0 );\n}\n\n/*\n * Copy the contents of Y into X\n */\nint mbedtls_mpi_copy( mbedtls_mpi *X, const mbedtls_mpi *Y )\n{\n    int ret;\n    size_t i;\n\n    if( X == Y )\n        return( 0 );\n\n    if( Y->p == NULL )\n    {\n        mbedtls_mpi_free( X );\n        return( 0 );\n    }\n\n    for( i = Y->n - 1; i > 0; i-- )\n        if( Y->p[i] != 0 )\n            break;\n    i++;\n\n    X->s = Y->s;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i ) );\n\n    memset( X->p, 0, X->n * ciL );\n    memcpy( X->p, Y->p, i * ciL );\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Swap the contents of X and Y\n */\nvoid mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y )\n{\n    mbedtls_mpi T;\n\n    memcpy( &T,  X, sizeof( mbedtls_mpi ) );\n    memcpy(  X,  Y, sizeof( mbedtls_mpi ) );\n    memcpy(  Y, &T, sizeof( mbedtls_mpi ) );\n}\n\n/*\n * Conditionally assign X = Y, without leaking information\n * about whether the assignment was made or not.\n * (Leaking information about the respective sizes of X and Y is ok however.)\n */\nint mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned char assign )\n{\n    int ret = 0;\n    size_t i;\n\n    /* make sure assign is 0 or 1 in a time-constant manner */\n    assign = (assign | (unsigned char)-assign) >> 7;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) );\n\n    X->s = X->s * ( 1 - assign ) + Y->s * assign;\n\n    for( i = 0; i < Y->n; i++ )\n        X->p[i] = X->p[i] * ( 1 - assign ) + Y->p[i] * assign;\n\n    for( ; i < X->n; i++ )\n        X->p[i] *= ( 1 - assign );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Conditionally swap X and Y, without leaking information\n * about whether the swap was made or not.\n * Here it is not ok to simply swap the pointers, which whould lead to\n * different memory access patterns when X and Y are used afterwards.\n */\nint mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char swap )\n{\n    int ret, s;\n    size_t i;\n    mbedtls_mpi_uint tmp;\n\n    if( X == Y )\n        return( 0 );\n\n    /* make sure swap is 0 or 1 in a time-constant manner */\n    swap = (swap | (unsigned char)-swap) >> 7;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, Y->n ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( Y, X->n ) );\n\n    s = X->s;\n    X->s = X->s * ( 1 - swap ) + Y->s * swap;\n    Y->s = Y->s * ( 1 - swap ) +    s * swap;\n\n\n    for( i = 0; i < X->n; i++ )\n    {\n        tmp = X->p[i];\n        X->p[i] = X->p[i] * ( 1 - swap ) + Y->p[i] * swap;\n        Y->p[i] = Y->p[i] * ( 1 - swap ) +     tmp * swap;\n    }\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Set value from integer\n */\nint mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z )\n{\n    int ret;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, 1 ) );\n    memset( X->p, 0, X->n * ciL );\n\n    X->p[0] = ( z < 0 ) ? -z : z;\n    X->s    = ( z < 0 ) ? -1 : 1;\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Get a specific bit\n */\nint mbedtls_mpi_get_bit( const mbedtls_mpi *X, size_t pos )\n{\n    if( X->n * biL <= pos )\n        return( 0 );\n\n    return( ( X->p[pos / biL] >> ( pos % biL ) ) & 0x01 );\n}\n\n/*\n * Set a bit to a specific value of 0 or 1\n */\nint mbedtls_mpi_set_bit( mbedtls_mpi *X, size_t pos, unsigned char val )\n{\n    int ret = 0;\n    size_t off = pos / biL;\n    size_t idx = pos % biL;\n\n    if( val != 0 && val != 1 )\n        return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n    if( X->n * biL <= pos )\n    {\n        if( val == 0 )\n            return( 0 );\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, off + 1 ) );\n    }\n\n    X->p[off] &= ~( (mbedtls_mpi_uint) 0x01 << idx );\n    X->p[off] |= (mbedtls_mpi_uint) val << idx;\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Return the number of less significant zero-bits\n */\nsize_t mbedtls_mpi_lsb( const mbedtls_mpi *X )\n{\n    size_t i, j, count = 0;\n\n    for( i = 0; i < X->n; i++ )\n        for( j = 0; j < biL; j++, count++ )\n            if( ( ( X->p[i] >> j ) & 1 ) != 0 )\n                return( count );\n\n    return( 0 );\n}\n\n/*\n * Count leading zero bits in a given integer\n */\nstatic size_t mbedtls_clz( const mbedtls_mpi_uint x )\n{\n    size_t j;\n    mbedtls_mpi_uint mask = (mbedtls_mpi_uint) 1 << (biL - 1);\n\n    for( j = 0; j < biL; j++ )\n    {\n        if( x & mask ) break;\n\n        mask >>= 1;\n    }\n\n    return j;\n}\n\n/*\n * Return the number of bits\n */\nsize_t mbedtls_mpi_bitlen( const mbedtls_mpi *X )\n{\n    size_t i, j;\n\n    if( X->n == 0 )\n        return( 0 );\n\n    for( i = X->n - 1; i > 0; i-- )\n        if( X->p[i] != 0 )\n            break;\n\n    j = biL - mbedtls_clz( X->p[i] );\n\n    return( ( i * biL ) + j );\n}\n\n/*\n * Return the total size in bytes\n */\nsize_t mbedtls_mpi_size( const mbedtls_mpi *X )\n{\n    return( ( mbedtls_mpi_bitlen( X ) + 7 ) >> 3 );\n}\n\n/*\n * Convert an ASCII character to digit value\n */\nstatic int mpi_get_digit( mbedtls_mpi_uint *d, int radix, char c )\n{\n    *d = 255;\n\n    if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30;\n    if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37;\n    if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57;\n\n    if( *d >= (mbedtls_mpi_uint) radix )\n        return( MBEDTLS_ERR_MPI_INVALID_CHARACTER );\n\n    return( 0 );\n}\n\n/*\n * Import from an ASCII string\n */\nint mbedtls_mpi_read_string( mbedtls_mpi *X, int radix, const char *s )\n{\n    int ret;\n    size_t i, j, slen, n;\n    mbedtls_mpi_uint d;\n    mbedtls_mpi T;\n\n    if( radix < 2 || radix > 16 )\n        return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n    mbedtls_mpi_init( &T );\n\n    slen = strlen( s );\n\n    if( radix == 16 )\n    {\n        if( slen > MPI_SIZE_T_MAX >> 2 )\n            return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n        n = BITS_TO_LIMBS( slen << 2 );\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, n ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );\n\n        for( i = slen, j = 0; i > 0; i--, j++ )\n        {\n            if( i == 1 && s[i - 1] == '-' )\n            {\n                X->s = -1;\n                break;\n            }\n\n            MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i - 1] ) );\n            X->p[j / ( 2 * ciL )] |= d << ( ( j % ( 2 * ciL ) ) << 2 );\n        }\n    }\n    else\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );\n\n        for( i = 0; i < slen; i++ )\n        {\n            if( i == 0 && s[i] == '-' )\n            {\n                X->s = -1;\n                continue;\n            }\n\n            MBEDTLS_MPI_CHK( mpi_get_digit( &d, radix, s[i] ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T, X, radix ) );\n\n            if( X->s == 1 )\n            {\n                MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, &T, d ) );\n            }\n            else\n            {\n                MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( X, &T, d ) );\n            }\n        }\n    }\n\ncleanup:\n\n    mbedtls_mpi_free( &T );\n\n    return( ret );\n}\n\n/*\n * Helper to write the digits high-order first\n */\nstatic int mpi_write_hlp( mbedtls_mpi *X, int radix, char **p )\n{\n    int ret;\n    mbedtls_mpi_uint r;\n\n    if( radix < 2 || radix > 16 )\n        return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, radix ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_div_int( X, NULL, X, radix ) );\n\n    if( mbedtls_mpi_cmp_int( X, 0 ) != 0 )\n        MBEDTLS_MPI_CHK( mpi_write_hlp( X, radix, p ) );\n\n    if( r < 10 )\n        *(*p)++ = (char)( r + 0x30 );\n    else\n        *(*p)++ = (char)( r + 0x37 );\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Export into an ASCII string\n */\nint mbedtls_mpi_write_string( const mbedtls_mpi *X, int radix,\n                              char *buf, size_t buflen, size_t *olen )\n{\n    int ret = 0;\n    size_t n;\n    char *p;\n    mbedtls_mpi T;\n\n    if( radix < 2 || radix > 16 )\n        return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n    n = mbedtls_mpi_bitlen( X );\n    if( radix >=  4 ) n >>= 1;\n    if( radix >= 16 ) n >>= 1;\n    /*\n     * Round up the buffer length to an even value to ensure that there is\n     * enough room for hexadecimal values that can be represented in an odd\n     * number of digits.\n     */\n    n += 3 + ( ( n + 1 ) & 1 );\n\n    if( buflen < n )\n    {\n        *olen = n;\n        return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );\n    }\n\n    p = buf;\n    mbedtls_mpi_init( &T );\n\n    if( X->s == -1 )\n        *p++ = '-';\n\n    if( radix == 16 )\n    {\n        int c;\n        size_t i, j, k;\n\n        for( i = X->n, k = 0; i > 0; i-- )\n        {\n            for( j = ciL; j > 0; j-- )\n            {\n                c = ( X->p[i - 1] >> ( ( j - 1 ) << 3) ) & 0xFF;\n\n                if( c == 0 && k == 0 && ( i + j ) != 2 )\n                    continue;\n\n                *(p++) = \"0123456789ABCDEF\" [c / 16];\n                *(p++) = \"0123456789ABCDEF\" [c % 16];\n                k = 1;\n            }\n        }\n    }\n    else\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T, X ) );\n\n        if( T.s == -1 )\n            T.s = 1;\n\n        MBEDTLS_MPI_CHK( mpi_write_hlp( &T, radix, &p ) );\n    }\n\n    *p++ = '\\0';\n    *olen = p - buf;\n\ncleanup:\n\n    mbedtls_mpi_free( &T );\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_FS_IO)\n/*\n * Read X from an opened file\n */\nint mbedtls_mpi_read_file( mbedtls_mpi *X, int radix, FILE *fin )\n{\n    mbedtls_mpi_uint d;\n    size_t slen;\n    char *p;\n    /*\n     * Buffer should have space for (short) label and decimal formatted MPI,\n     * newline characters and '\\0'\n     */\n    char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ];\n\n    memset( s, 0, sizeof( s ) );\n    if( fgets( s, sizeof( s ) - 1, fin ) == NULL )\n        return( MBEDTLS_ERR_MPI_FILE_IO_ERROR );\n\n    slen = strlen( s );\n    if( slen == sizeof( s ) - 2 )\n        return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );\n\n    if( slen > 0 && s[slen - 1] == '\\n' ) { slen--; s[slen] = '\\0'; }\n    if( slen > 0 && s[slen - 1] == '\\r' ) { slen--; s[slen] = '\\0'; }\n\n    p = s + slen;\n    while( p-- > s )\n        if( mpi_get_digit( &d, radix, *p ) != 0 )\n            break;\n\n    return( mbedtls_mpi_read_string( X, radix, p + 1 ) );\n}\n\n/*\n * Write X into an opened file (or stdout if fout == NULL)\n */\nint mbedtls_mpi_write_file( const char *p, const mbedtls_mpi *X, int radix, FILE *fout )\n{\n    int ret;\n    size_t n, slen, plen;\n    /*\n     * Buffer should have space for (short) label and decimal formatted MPI,\n     * newline characters and '\\0'\n     */\n    char s[ MBEDTLS_MPI_RW_BUFFER_SIZE ];\n\n    memset( s, 0, sizeof( s ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_string( X, radix, s, sizeof( s ) - 2, &n ) );\n\n    if( p == NULL ) p = \"\";\n\n    plen = strlen( p );\n    slen = strlen( s );\n    s[slen++] = '\\r';\n    s[slen++] = '\\n';\n\n    if( fout != NULL )\n    {\n        if( fwrite( p, 1, plen, fout ) != plen ||\n            fwrite( s, 1, slen, fout ) != slen )\n            return( MBEDTLS_ERR_MPI_FILE_IO_ERROR );\n    }\n    else\n        mbedtls_printf( \"%s%s\", p, s );\n\ncleanup:\n\n    return( ret );\n}\n#endif /* MBEDTLS_FS_IO */\n\n/*\n * Import X from unsigned binary data, big endian\n */\nint mbedtls_mpi_read_binary( mbedtls_mpi *X, const unsigned char *buf, size_t buflen )\n{\n    int ret;\n    size_t i, j, n;\n\n    for( n = 0; n < buflen; n++ )\n        if( buf[n] != 0 )\n            break;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, CHARS_TO_LIMBS( buflen - n ) ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );\n\n    for( i = buflen, j = 0; i > n; i--, j++ )\n        X->p[j / ciL] |= ((mbedtls_mpi_uint) buf[i - 1]) << ((j % ciL) << 3);\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Export X into unsigned binary data, big endian\n */\nint mbedtls_mpi_write_binary( const mbedtls_mpi *X, unsigned char *buf, size_t buflen )\n{\n    size_t i, j, n;\n\n    n = mbedtls_mpi_size( X );\n\n    if( buflen < n )\n        return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL );\n\n    memset( buf, 0, buflen );\n\n    for( i = buflen - 1, j = 0; n > 0; i--, j++, n-- )\n        buf[i] = (unsigned char)( X->p[j / ciL] >> ((j % ciL) << 3) );\n\n    return( 0 );\n}\n\n/*\n * Left-shift: X <<= count\n */\nint mbedtls_mpi_shift_l( mbedtls_mpi *X, size_t count )\n{\n    int ret;\n    size_t i, v0, t1;\n    mbedtls_mpi_uint r0 = 0, r1;\n\n    v0 = count / (biL    );\n    t1 = count & (biL - 1);\n\n    i = mbedtls_mpi_bitlen( X ) + count;\n\n    if( X->n * biL < i )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, BITS_TO_LIMBS( i ) ) );\n\n    ret = 0;\n\n    /*\n     * shift by count / limb_size\n     */\n    if( v0 > 0 )\n    {\n        for( i = X->n; i > v0; i-- )\n            X->p[i - 1] = X->p[i - v0 - 1];\n\n        for( ; i > 0; i-- )\n            X->p[i - 1] = 0;\n    }\n\n    /*\n     * shift by count % limb_size\n     */\n    if( t1 > 0 )\n    {\n        for( i = v0; i < X->n; i++ )\n        {\n            r1 = X->p[i] >> (biL - t1);\n            X->p[i] <<= t1;\n            X->p[i] |= r0;\n            r0 = r1;\n        }\n    }\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Right-shift: X >>= count\n */\nint mbedtls_mpi_shift_r( mbedtls_mpi *X, size_t count )\n{\n    size_t i, v0, v1;\n    mbedtls_mpi_uint r0 = 0, r1;\n\n    v0 = count /  biL;\n    v1 = count & (biL - 1);\n\n    if( v0 > X->n || ( v0 == X->n && v1 > 0 ) )\n        return mbedtls_mpi_lset( X, 0 );\n\n    /*\n     * shift by count / limb_size\n     */\n    if( v0 > 0 )\n    {\n        for( i = 0; i < X->n - v0; i++ )\n            X->p[i] = X->p[i + v0];\n\n        for( ; i < X->n; i++ )\n            X->p[i] = 0;\n    }\n\n    /*\n     * shift by count % limb_size\n     */\n    if( v1 > 0 )\n    {\n        for( i = X->n; i > 0; i-- )\n        {\n            r1 = X->p[i - 1] << (biL - v1);\n            X->p[i - 1] >>= v1;\n            X->p[i - 1] |= r0;\n            r0 = r1;\n        }\n    }\n\n    return( 0 );\n}\n\n/*\n * Compare unsigned values\n */\nint mbedtls_mpi_cmp_abs( const mbedtls_mpi *X, const mbedtls_mpi *Y )\n{\n    size_t i, j;\n\n    for( i = X->n; i > 0; i-- )\n        if( X->p[i - 1] != 0 )\n            break;\n\n    for( j = Y->n; j > 0; j-- )\n        if( Y->p[j - 1] != 0 )\n            break;\n\n    if( i == 0 && j == 0 )\n        return( 0 );\n\n    if( i > j ) return(  1 );\n    if( j > i ) return( -1 );\n\n    for( ; i > 0; i-- )\n    {\n        if( X->p[i - 1] > Y->p[i - 1] ) return(  1 );\n        if( X->p[i - 1] < Y->p[i - 1] ) return( -1 );\n    }\n\n    return( 0 );\n}\n\n/*\n * Compare signed values\n */\nint mbedtls_mpi_cmp_mpi( const mbedtls_mpi *X, const mbedtls_mpi *Y )\n{\n    size_t i, j;\n\n    for( i = X->n; i > 0; i-- )\n        if( X->p[i - 1] != 0 )\n            break;\n\n    for( j = Y->n; j > 0; j-- )\n        if( Y->p[j - 1] != 0 )\n            break;\n\n    if( i == 0 && j == 0 )\n        return( 0 );\n\n    if( i > j ) return(  X->s );\n    if( j > i ) return( -Y->s );\n\n    if( X->s > 0 && Y->s < 0 ) return(  1 );\n    if( Y->s > 0 && X->s < 0 ) return( -1 );\n\n    for( ; i > 0; i-- )\n    {\n        if( X->p[i - 1] > Y->p[i - 1] ) return(  X->s );\n        if( X->p[i - 1] < Y->p[i - 1] ) return( -X->s );\n    }\n\n    return( 0 );\n}\n\n/*\n * Compare signed values\n */\nint mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z )\n{\n    mbedtls_mpi Y;\n    mbedtls_mpi_uint p[1];\n\n    *p  = ( z < 0 ) ? -z : z;\n    Y.s = ( z < 0 ) ? -1 : 1;\n    Y.n = 1;\n    Y.p = p;\n\n    return( mbedtls_mpi_cmp_mpi( X, &Y ) );\n}\n\n/*\n * Unsigned addition: X = |A| + |B|  (HAC 14.7)\n */\nint mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )\n{\n    int ret;\n    size_t i, j;\n    mbedtls_mpi_uint *o, *p, c, tmp;\n\n    if( X == B )\n    {\n        const mbedtls_mpi *T = A; A = X; B = T;\n    }\n\n    if( X != A )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) );\n\n    /*\n     * X should always be positive as a result of unsigned additions.\n     */\n    X->s = 1;\n\n    for( j = B->n; j > 0; j-- )\n        if( B->p[j - 1] != 0 )\n            break;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) );\n\n    o = B->p; p = X->p; c = 0;\n\n    /*\n     * tmp is used because it might happen that p == o\n     */\n    for( i = 0; i < j; i++, o++, p++ )\n    {\n        tmp= *o;\n        *p +=  c; c  = ( *p <  c );\n        *p += tmp; c += ( *p < tmp );\n    }\n\n    while( c != 0 )\n    {\n        if( i >= X->n )\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + 1 ) );\n            p = X->p + i;\n        }\n\n        *p += c; c = ( *p < c ); i++; p++;\n    }\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Helper for mbedtls_mpi subtraction\n */\nstatic void mpi_sub_hlp( size_t n, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d )\n{\n    size_t i;\n    mbedtls_mpi_uint c, z;\n\n    for( i = c = 0; i < n; i++, s++, d++ )\n    {\n        z = ( *d <  c );     *d -=  c;\n        c = ( *d < *s ) + z; *d -= *s;\n    }\n\n    while( c != 0 )\n    {\n        z = ( *d < c ); *d -= c;\n        c = z; i++; d++;\n    }\n}\n\n/*\n * Unsigned subtraction: X = |A| - |B|  (HAC 14.9)\n */\nint mbedtls_mpi_sub_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )\n{\n    mbedtls_mpi TB;\n    int ret;\n    size_t n;\n\n    if( mbedtls_mpi_cmp_abs( A, B ) < 0 )\n        return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );\n\n    mbedtls_mpi_init( &TB );\n\n    if( X == B )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) );\n        B = &TB;\n    }\n\n    if( X != A )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, A ) );\n\n    /*\n     * X should always be positive as a result of unsigned subtractions.\n     */\n    X->s = 1;\n\n    ret = 0;\n\n    for( n = B->n; n > 0; n-- )\n        if( B->p[n - 1] != 0 )\n            break;\n\n    mpi_sub_hlp( n, B->p, X->p );\n\ncleanup:\n\n    mbedtls_mpi_free( &TB );\n\n    return( ret );\n}\n\n/*\n * Signed addition: X = A + B\n */\nint mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )\n{\n    int ret, s = A->s;\n\n    if( A->s * B->s < 0 )\n    {\n        if( mbedtls_mpi_cmp_abs( A, B ) >= 0 )\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) );\n            X->s =  s;\n        }\n        else\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) );\n            X->s = -s;\n        }\n    }\n    else\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) );\n        X->s = s;\n    }\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Signed subtraction: X = A - B\n */\nint mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )\n{\n    int ret, s = A->s;\n\n    if( A->s * B->s > 0 )\n    {\n        if( mbedtls_mpi_cmp_abs( A, B ) >= 0 )\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) );\n            X->s =  s;\n        }\n        else\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) );\n            X->s = -s;\n        }\n    }\n    else\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) );\n        X->s = s;\n    }\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Signed addition: X = A + b\n */\nint mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b )\n{\n    mbedtls_mpi _B;\n    mbedtls_mpi_uint p[1];\n\n    p[0] = ( b < 0 ) ? -b : b;\n    _B.s = ( b < 0 ) ? -1 : 1;\n    _B.n = 1;\n    _B.p = p;\n\n    return( mbedtls_mpi_add_mpi( X, A, &_B ) );\n}\n\n/*\n * Signed subtraction: X = A - b\n */\nint mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint b )\n{\n    mbedtls_mpi _B;\n    mbedtls_mpi_uint p[1];\n\n    p[0] = ( b < 0 ) ? -b : b;\n    _B.s = ( b < 0 ) ? -1 : 1;\n    _B.n = 1;\n    _B.p = p;\n\n    return( mbedtls_mpi_sub_mpi( X, A, &_B ) );\n}\n\n/*\n * Helper for mbedtls_mpi multiplication\n */\nstatic\n#if defined(__APPLE__) && defined(__arm__)\n/*\n * Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)\n * appears to need this to prevent bad ARM code generation at -O3.\n */\n__attribute__ ((noinline))\n#endif\nvoid mpi_mul_hlp( size_t i, mbedtls_mpi_uint *s, mbedtls_mpi_uint *d, mbedtls_mpi_uint b )\n{\n    mbedtls_mpi_uint c = 0, t = 0;\n\n#if defined(MULADDC_HUIT)\n    for( ; i >= 8; i -= 8 )\n    {\n        MULADDC_INIT\n        MULADDC_HUIT\n        MULADDC_STOP\n    }\n\n    for( ; i > 0; i-- )\n    {\n        MULADDC_INIT\n        MULADDC_CORE\n        MULADDC_STOP\n    }\n#else /* MULADDC_HUIT */\n    for( ; i >= 16; i -= 16 )\n    {\n        MULADDC_INIT\n        MULADDC_CORE   MULADDC_CORE\n        MULADDC_CORE   MULADDC_CORE\n        MULADDC_CORE   MULADDC_CORE\n        MULADDC_CORE   MULADDC_CORE\n\n        MULADDC_CORE   MULADDC_CORE\n        MULADDC_CORE   MULADDC_CORE\n        MULADDC_CORE   MULADDC_CORE\n        MULADDC_CORE   MULADDC_CORE\n        MULADDC_STOP\n    }\n\n    for( ; i >= 8; i -= 8 )\n    {\n        MULADDC_INIT\n        MULADDC_CORE   MULADDC_CORE\n        MULADDC_CORE   MULADDC_CORE\n\n        MULADDC_CORE   MULADDC_CORE\n        MULADDC_CORE   MULADDC_CORE\n        MULADDC_STOP\n    }\n\n    for( ; i > 0; i-- )\n    {\n        MULADDC_INIT\n        MULADDC_CORE\n        MULADDC_STOP\n    }\n#endif /* MULADDC_HUIT */\n\n    t++;\n\n    do {\n        *d += c; c = ( *d < c ); d++;\n    }\n    while( c != 0 );\n}\n\n/*\n * Baseline multiplication: X = A * B  (HAC 14.12)\n */\nint mbedtls_mpi_mul_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B )\n{\n    int ret;\n    size_t i, j;\n    mbedtls_mpi TA, TB;\n\n    mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB );\n\n    if( X == A ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) ); A = &TA; }\n    if( X == B ) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) ); B = &TB; }\n\n    for( i = A->n; i > 0; i-- )\n        if( A->p[i - 1] != 0 )\n            break;\n\n    for( j = B->n; j > 0; j-- )\n        if( B->p[j - 1] != 0 )\n            break;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, i + j ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X, 0 ) );\n\n    for( i++; j > 0; j-- )\n        mpi_mul_hlp( i - 1, A->p, X->p + j - 1, B->p[j - 1] );\n\n    X->s = A->s * B->s;\n\ncleanup:\n\n    mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TA );\n\n    return( ret );\n}\n\n/*\n * Baseline multiplication: X = A * b\n */\nint mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_uint b )\n{\n    mbedtls_mpi _B;\n    mbedtls_mpi_uint p[1];\n\n    _B.s = 1;\n    _B.n = 1;\n    _B.p = p;\n    p[0] = b;\n\n    return( mbedtls_mpi_mul_mpi( X, A, &_B ) );\n}\n\n/*\n * Unsigned integer divide - double mbedtls_mpi_uint dividend, u1/u0, and\n * mbedtls_mpi_uint divisor, d\n */\nstatic mbedtls_mpi_uint mbedtls_int_div_int( mbedtls_mpi_uint u1,\n            mbedtls_mpi_uint u0, mbedtls_mpi_uint d, mbedtls_mpi_uint *r )\n{\n#if defined(MBEDTLS_HAVE_UDBL)\n    mbedtls_t_udbl dividend, quotient;\n#else\n    const mbedtls_mpi_uint radix = (mbedtls_mpi_uint) 1 << biH;\n    const mbedtls_mpi_uint uint_halfword_mask = ( (mbedtls_mpi_uint) 1 << biH ) - 1;\n    mbedtls_mpi_uint d0, d1, q0, q1, rAX, r0, quotient;\n    mbedtls_mpi_uint u0_msw, u0_lsw;\n    size_t s;\n#endif\n\n    /*\n     * Check for overflow\n     */\n    if( 0 == d || u1 >= d )\n    {\n        if (r != NULL) *r = ~0;\n\n        return ( ~0 );\n    }\n\n#if defined(MBEDTLS_HAVE_UDBL)\n    dividend  = (mbedtls_t_udbl) u1 << biL;\n    dividend |= (mbedtls_t_udbl) u0;\n    quotient = dividend / d;\n    if( quotient > ( (mbedtls_t_udbl) 1 << biL ) - 1 )\n        quotient = ( (mbedtls_t_udbl) 1 << biL ) - 1;\n\n    if( r != NULL )\n        *r = (mbedtls_mpi_uint)( dividend - (quotient * d ) );\n\n    return (mbedtls_mpi_uint) quotient;\n#else\n\n    /*\n     * Algorithm D, Section 4.3.1 - The Art of Computer Programming\n     *   Vol. 2 - Seminumerical Algorithms, Knuth\n     */\n\n    /*\n     * Normalize the divisor, d, and dividend, u0, u1\n     */\n    s = mbedtls_clz( d );\n    d = d << s;\n\n    u1 = u1 << s;\n    u1 |= ( u0 >> ( biL - s ) ) & ( -(mbedtls_mpi_sint)s >> ( biL - 1 ) );\n    u0 =  u0 << s;\n\n    d1 = d >> biH;\n    d0 = d & uint_halfword_mask;\n\n    u0_msw = u0 >> biH;\n    u0_lsw = u0 & uint_halfword_mask;\n\n    /*\n     * Find the first quotient and remainder\n     */\n    q1 = u1 / d1;\n    r0 = u1 - d1 * q1;\n\n    while( q1 >= radix || ( q1 * d0 > radix * r0 + u0_msw ) )\n    {\n        q1 -= 1;\n        r0 += d1;\n\n        if ( r0 >= radix ) break;\n    }\n\n    rAX = ( u1 * radix ) + ( u0_msw - q1 * d );\n    q0 = rAX / d1;\n    r0 = rAX - q0 * d1;\n\n    while( q0 >= radix || ( q0 * d0 > radix * r0 + u0_lsw ) )\n    {\n        q0 -= 1;\n        r0 += d1;\n\n        if ( r0 >= radix ) break;\n    }\n\n    if (r != NULL)\n        *r = ( rAX * radix + u0_lsw - q0 * d ) >> s;\n\n    quotient = q1 * radix + q0;\n\n    return quotient;\n#endif\n}\n\n/*\n * Division by mbedtls_mpi: A = Q * B + R  (HAC 14.20)\n */\nint mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B )\n{\n    int ret;\n    size_t i, n, t, k;\n    mbedtls_mpi X, Y, Z, T1, T2;\n\n    if( mbedtls_mpi_cmp_int( B, 0 ) == 0 )\n        return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO );\n\n    mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );\n    mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 );\n\n    if( mbedtls_mpi_cmp_abs( A, B ) < 0 )\n    {\n        if( Q != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_lset( Q, 0 ) );\n        if( R != NULL ) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, A ) );\n        return( 0 );\n    }\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &X, A ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, B ) );\n    X.s = Y.s = 1;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &Z, A->n + 2 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Z,  0 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T1, 2 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T2, 3 ) );\n\n    k = mbedtls_mpi_bitlen( &Y ) % biL;\n    if( k < biL - 1 )\n    {\n        k = biL - 1 - k;\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &X, k ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, k ) );\n    }\n    else k = 0;\n\n    n = X.n - 1;\n    t = Y.n - 1;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y, biL * ( n - t ) ) );\n\n    while( mbedtls_mpi_cmp_mpi( &X, &Y ) >= 0 )\n    {\n        Z.p[n - t]++;\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &Y ) );\n    }\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, biL * ( n - t ) ) );\n\n    for( i = n; i > t ; i-- )\n    {\n        if( X.p[i] >= Y.p[t] )\n            Z.p[i - t - 1] = ~0;\n        else\n        {\n            Z.p[i - t - 1] = mbedtls_int_div_int( X.p[i], X.p[i - 1],\n                                                            Y.p[t], NULL);\n        }\n\n        Z.p[i - t - 1]++;\n        do\n        {\n            Z.p[i - t - 1]--;\n\n            MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T1, 0 ) );\n            T1.p[0] = ( t < 1 ) ? 0 : Y.p[t - 1];\n            T1.p[1] = Y.p[t];\n            MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) );\n\n            MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T2, 0 ) );\n            T2.p[0] = ( i < 2 ) ? 0 : X.p[i - 2];\n            T2.p[1] = ( i < 1 ) ? 0 : X.p[i - 1];\n            T2.p[2] = X.p[i];\n        }\n        while( mbedtls_mpi_cmp_mpi( &T1, &T2 ) > 0 );\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1,  biL * ( i - t - 1 ) ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X, &X, &T1 ) );\n\n        if( mbedtls_mpi_cmp_int( &X, 0 ) < 0 )\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T1, &Y ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1, biL * ( i - t - 1 ) ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &X, &X, &T1 ) );\n            Z.p[i - t - 1]--;\n        }\n    }\n\n    if( Q != NULL )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( Q, &Z ) );\n        Q->s = A->s * B->s;\n    }\n\n    if( R != NULL )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &X, k ) );\n        X.s = A->s;\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R, &X ) );\n\n        if( mbedtls_mpi_cmp_int( R, 0 ) == 0 )\n            R->s = 1;\n    }\n\ncleanup:\n\n    mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );\n    mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 );\n\n    return( ret );\n}\n\n/*\n * Division by int: A = Q * b + R\n */\nint mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, mbedtls_mpi_sint b )\n{\n    mbedtls_mpi _B;\n    mbedtls_mpi_uint p[1];\n\n    p[0] = ( b < 0 ) ? -b : b;\n    _B.s = ( b < 0 ) ? -1 : 1;\n    _B.n = 1;\n    _B.p = p;\n\n    return( mbedtls_mpi_div_mpi( Q, R, A, &_B ) );\n}\n\n/*\n * Modulo: R = A mod B\n */\nint mbedtls_mpi_mod_mpi( mbedtls_mpi *R, const mbedtls_mpi *A, const mbedtls_mpi *B )\n{\n    int ret;\n\n    if( mbedtls_mpi_cmp_int( B, 0 ) < 0 )\n        return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( NULL, R, A, B ) );\n\n    while( mbedtls_mpi_cmp_int( R, 0 ) < 0 )\n      MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( R, R, B ) );\n\n    while( mbedtls_mpi_cmp_mpi( R, B ) >= 0 )\n      MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( R, R, B ) );\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Modulo: r = A mod b\n */\nint mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, mbedtls_mpi_sint b )\n{\n    size_t i;\n    mbedtls_mpi_uint x, y, z;\n\n    if( b == 0 )\n        return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO );\n\n    if( b < 0 )\n        return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE );\n\n    /*\n     * handle trivial cases\n     */\n    if( b == 1 )\n    {\n        *r = 0;\n        return( 0 );\n    }\n\n    if( b == 2 )\n    {\n        *r = A->p[0] & 1;\n        return( 0 );\n    }\n\n    /*\n     * general case\n     */\n    for( i = A->n, y = 0; i > 0; i-- )\n    {\n        x  = A->p[i - 1];\n        y  = ( y << biH ) | ( x >> biH );\n        z  = y / b;\n        y -= z * b;\n\n        x <<= biH;\n        y  = ( y << biH ) | ( x >> biH );\n        z  = y / b;\n        y -= z * b;\n    }\n\n    /*\n     * If A is negative, then the current y represents a negative value.\n     * Flipping it to the positive side.\n     */\n    if( A->s < 0 && y != 0 )\n        y = b - y;\n\n    *r = y;\n\n    return( 0 );\n}\n\n/*\n * Fast Montgomery initialization (thanks to Tom St Denis)\n */\nstatic void mpi_montg_init( mbedtls_mpi_uint *mm, const mbedtls_mpi *N )\n{\n    mbedtls_mpi_uint x, m0 = N->p[0];\n    unsigned int i;\n\n    x  = m0;\n    x += ( ( m0 + 2 ) & 4 ) << 1;\n\n    for( i = biL; i >= 8; i /= 2 )\n        x *= ( 2 - ( m0 * x ) );\n\n    *mm = ~x + 1;\n}\n\n/*\n * Montgomery multiplication: A = A * B * R^-1 mod N  (HAC 14.36)\n */\nstatic int mpi_montmul( mbedtls_mpi *A, const mbedtls_mpi *B, const mbedtls_mpi *N, mbedtls_mpi_uint mm,\n                         const mbedtls_mpi *T )\n{\n    size_t i, n, m;\n    mbedtls_mpi_uint u0, u1, *d;\n\n    if( T->n < N->n + 1 || T->p == NULL )\n        return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n    memset( T->p, 0, T->n * ciL );\n\n    d = T->p;\n    n = N->n;\n    m = ( B->n < n ) ? B->n : n;\n\n    for( i = 0; i < n; i++ )\n    {\n        /*\n         * T = (T + u0*B + u1*N) / 2^biL\n         */\n        u0 = A->p[i];\n        u1 = ( d[0] + u0 * B->p[0] ) * mm;\n\n        mpi_mul_hlp( m, B->p, d, u0 );\n        mpi_mul_hlp( n, N->p, d, u1 );\n\n        *d++ = u0; d[n + 1] = 0;\n    }\n\n    memcpy( A->p, d, ( n + 1 ) * ciL );\n\n    if( mbedtls_mpi_cmp_abs( A, N ) >= 0 )\n        mpi_sub_hlp( n, N->p, A->p );\n    else\n        /* prevent timing attacks */\n        mpi_sub_hlp( n, A->p, T->p );\n\n    return( 0 );\n}\n\n/*\n * Montgomery reduction: A = A * R^-1 mod N\n */\nstatic int mpi_montred( mbedtls_mpi *A, const mbedtls_mpi *N, mbedtls_mpi_uint mm, const mbedtls_mpi *T )\n{\n    mbedtls_mpi_uint z = 1;\n    mbedtls_mpi U;\n\n    U.n = U.s = (int) z;\n    U.p = &z;\n\n    return( mpi_montmul( A, &U, N, mm, T ) );\n}\n\n/*\n * Sliding-window exponentiation: X = A^E mod N  (HAC 14.85)\n */\nint mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *E, const mbedtls_mpi *N, mbedtls_mpi *_RR )\n{\n    int ret;\n    size_t wbits, wsize, one = 1;\n    size_t i, j, nblimbs;\n    size_t bufsize, nbits;\n    mbedtls_mpi_uint ei, mm, state;\n    mbedtls_mpi RR, T, W[ 2 << MBEDTLS_MPI_WINDOW_SIZE ], Apos;\n    int neg;\n\n    if( mbedtls_mpi_cmp_int( N, 0 ) < 0 || ( N->p[0] & 1 ) == 0 )\n        return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n    if( mbedtls_mpi_cmp_int( E, 0 ) < 0 )\n        return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n    /*\n     * Init temps and window size\n     */\n    mpi_montg_init( &mm, N );\n    mbedtls_mpi_init( &RR ); mbedtls_mpi_init( &T );\n    mbedtls_mpi_init( &Apos );\n    memset( W, 0, sizeof( W ) );\n\n    i = mbedtls_mpi_bitlen( E );\n\n    wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 :\n            ( i >  79 ) ? 4 : ( i >  23 ) ? 3 : 1;\n\n    if( wsize > MBEDTLS_MPI_WINDOW_SIZE )\n        wsize = MBEDTLS_MPI_WINDOW_SIZE;\n\n    j = N->n + 1;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[1],  j ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T, j * 2 ) );\n\n    /*\n     * Compensate for negative A (and correct at the end)\n     */\n    neg = ( A->s == -1 );\n    if( neg )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Apos, A ) );\n        Apos.s = 1;\n        A = &Apos;\n    }\n\n    /*\n     * If 1st call, pre-compute R^2 mod N\n     */\n    if( _RR == NULL || _RR->p == NULL )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &RR, 1 ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &RR, N->n * 2 * biL ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &RR, &RR, N ) );\n\n        if( _RR != NULL )\n            memcpy( _RR, &RR, sizeof( mbedtls_mpi ) );\n    }\n    else\n        memcpy( &RR, _RR, sizeof( mbedtls_mpi ) );\n\n    /*\n     * W[1] = A * R^2 * R^-1 mod N = A * R mod N\n     */\n    if( mbedtls_mpi_cmp_mpi( A, N ) >= 0 )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &W[1], A, N ) );\n    else\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[1], A ) );\n\n    MBEDTLS_MPI_CHK( mpi_montmul( &W[1], &RR, N, mm, &T ) );\n\n    /*\n     * X = R^2 * R^-1 mod N = R mod N\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &RR ) );\n    MBEDTLS_MPI_CHK( mpi_montred( X, N, mm, &T ) );\n\n    if( wsize > 1 )\n    {\n        /*\n         * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1)\n         */\n        j =  one << ( wsize - 1 );\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[j], N->n + 1 ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[j], &W[1]    ) );\n\n        for( i = 0; i < wsize - 1; i++ )\n            MBEDTLS_MPI_CHK( mpi_montmul( &W[j], &W[j], N, mm, &T ) );\n\n        /*\n         * W[i] = W[i - 1] * W[1]\n         */\n        for( i = j + 1; i < ( one << wsize ); i++ )\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[i], N->n + 1 ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[i], &W[i - 1] ) );\n\n            MBEDTLS_MPI_CHK( mpi_montmul( &W[i], &W[1], N, mm, &T ) );\n        }\n    }\n\n    nblimbs = E->n;\n    bufsize = 0;\n    nbits   = 0;\n    wbits   = 0;\n    state   = 0;\n\n    while( 1 )\n    {\n        if( bufsize == 0 )\n        {\n            if( nblimbs == 0 )\n                break;\n\n            nblimbs--;\n\n            bufsize = sizeof( mbedtls_mpi_uint ) << 3;\n        }\n\n        bufsize--;\n\n        ei = (E->p[nblimbs] >> bufsize) & 1;\n\n        /*\n         * skip leading 0s\n         */\n        if( ei == 0 && state == 0 )\n            continue;\n\n        if( ei == 0 && state == 1 )\n        {\n            /*\n             * out of window, square X\n             */\n            MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) );\n            continue;\n        }\n\n        /*\n         * add ei to current window\n         */\n        state = 2;\n\n        nbits++;\n        wbits |= ( ei << ( wsize - nbits ) );\n\n        if( nbits == wsize )\n        {\n            /*\n             * X = X^wsize R^-1 mod N\n             */\n            for( i = 0; i < wsize; i++ )\n                MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) );\n\n            /*\n             * X = X * W[wbits] R^-1 mod N\n             */\n            MBEDTLS_MPI_CHK( mpi_montmul( X, &W[wbits], N, mm, &T ) );\n\n            state--;\n            nbits = 0;\n            wbits = 0;\n        }\n    }\n\n    /*\n     * process the remaining bits\n     */\n    for( i = 0; i < nbits; i++ )\n    {\n        MBEDTLS_MPI_CHK( mpi_montmul( X, X, N, mm, &T ) );\n\n        wbits <<= 1;\n\n        if( ( wbits & ( one << wsize ) ) != 0 )\n            MBEDTLS_MPI_CHK( mpi_montmul( X, &W[1], N, mm, &T ) );\n    }\n\n    /*\n     * X = A^E * R * R^-1 mod N = A^E mod N\n     */\n    MBEDTLS_MPI_CHK( mpi_montred( X, N, mm, &T ) );\n\n    if( neg && E->n != 0 && ( E->p[0] & 1 ) != 0 )\n    {\n        X->s = -1;\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( X, N, X ) );\n    }\n\ncleanup:\n\n    for( i = ( one << ( wsize - 1 ) ); i < ( one << wsize ); i++ )\n        mbedtls_mpi_free( &W[i] );\n\n    mbedtls_mpi_free( &W[1] ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &Apos );\n\n    if( _RR == NULL || _RR->p == NULL )\n        mbedtls_mpi_free( &RR );\n\n    return( ret );\n}\n\n/*\n * Greatest common divisor: G = gcd(A, B)  (HAC 14.54)\n */\nint mbedtls_mpi_gcd( mbedtls_mpi *G, const mbedtls_mpi *A, const mbedtls_mpi *B )\n{\n    int ret;\n    size_t lz, lzt;\n    mbedtls_mpi TG, TA, TB;\n\n    mbedtls_mpi_init( &TG ); mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TB );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA, A ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, B ) );\n\n    lz = mbedtls_mpi_lsb( &TA );\n    lzt = mbedtls_mpi_lsb( &TB );\n\n    if( lzt < lz )\n        lz = lzt;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, lz ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, lz ) );\n\n    TA.s = TB.s = 1;\n\n    while( mbedtls_mpi_cmp_int( &TA, 0 ) != 0 )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, mbedtls_mpi_lsb( &TA ) ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, mbedtls_mpi_lsb( &TB ) ) );\n\n        if( mbedtls_mpi_cmp_mpi( &TA, &TB ) >= 0 )\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TA, &TA, &TB ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA, 1 ) );\n        }\n        else\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TB, &TB, &TA ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB, 1 ) );\n        }\n    }\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &TB, lz ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( G, &TB ) );\n\ncleanup:\n\n    mbedtls_mpi_free( &TG ); mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TB );\n\n    return( ret );\n}\n\n/*\n * Fill X with size bytes of random.\n *\n * Use a temporary bytes representation to make sure the result is the same\n * regardless of the platform endianness (useful when f_rng is actually\n * deterministic, eg for tests).\n */\nint mbedtls_mpi_fill_random( mbedtls_mpi *X, size_t size,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng )\n{\n    int ret;\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n\n    if( size > MBEDTLS_MPI_MAX_SIZE )\n        return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n    MBEDTLS_MPI_CHK( f_rng( p_rng, buf, size ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( X, buf, size ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Modular inverse: X = A^-1 mod N  (HAC 14.61 / 14.64)\n */\nint mbedtls_mpi_inv_mod( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *N )\n{\n    int ret;\n    mbedtls_mpi G, TA, TU, U1, U2, TB, TV, V1, V2;\n\n    if( mbedtls_mpi_cmp_int( N, 1 ) <= 0 )\n        return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n    mbedtls_mpi_init( &TA ); mbedtls_mpi_init( &TU ); mbedtls_mpi_init( &U1 ); mbedtls_mpi_init( &U2 );\n    mbedtls_mpi_init( &G ); mbedtls_mpi_init( &TB ); mbedtls_mpi_init( &TV );\n    mbedtls_mpi_init( &V1 ); mbedtls_mpi_init( &V2 );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, A, N ) );\n\n    if( mbedtls_mpi_cmp_int( &G, 1 ) != 0 )\n    {\n        ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;\n        goto cleanup;\n    }\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &TA, A, N ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TU, &TA ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB, N ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TV, N ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U1, 1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U2, 0 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V1, 0 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V2, 1 ) );\n\n    do\n    {\n        while( ( TU.p[0] & 1 ) == 0 )\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TU, 1 ) );\n\n            if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 )\n            {\n                MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &U1, &U1, &TB ) );\n                MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &TA ) );\n            }\n\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U1, 1 ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U2, 1 ) );\n        }\n\n        while( ( TV.p[0] & 1 ) == 0 )\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TV, 1 ) );\n\n            if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 )\n            {\n                MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, &TB ) );\n                MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &TA ) );\n            }\n\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V1, 1 ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V2, 1 ) );\n        }\n\n        if( mbedtls_mpi_cmp_mpi( &TU, &TV ) >= 0 )\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TU, &TU, &TV ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U1, &U1, &V1 ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2, &U2, &V2 ) );\n        }\n        else\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TV, &TV, &TU ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, &U1 ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2, &V2, &U2 ) );\n        }\n    }\n    while( mbedtls_mpi_cmp_int( &TU, 0 ) != 0 );\n\n    while( mbedtls_mpi_cmp_int( &V1, 0 ) < 0 )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1, &V1, N ) );\n\n    while( mbedtls_mpi_cmp_mpi( &V1, N ) >= 0 )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1, &V1, N ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &V1 ) );\n\ncleanup:\n\n    mbedtls_mpi_free( &TA ); mbedtls_mpi_free( &TU ); mbedtls_mpi_free( &U1 ); mbedtls_mpi_free( &U2 );\n    mbedtls_mpi_free( &G ); mbedtls_mpi_free( &TB ); mbedtls_mpi_free( &TV );\n    mbedtls_mpi_free( &V1 ); mbedtls_mpi_free( &V2 );\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_GENPRIME)\n\nstatic const int small_prime[] =\n{\n        3,    5,    7,   11,   13,   17,   19,   23,\n       29,   31,   37,   41,   43,   47,   53,   59,\n       61,   67,   71,   73,   79,   83,   89,   97,\n      101,  103,  107,  109,  113,  127,  131,  137,\n      139,  149,  151,  157,  163,  167,  173,  179,\n      181,  191,  193,  197,  199,  211,  223,  227,\n      229,  233,  239,  241,  251,  257,  263,  269,\n      271,  277,  281,  283,  293,  307,  311,  313,\n      317,  331,  337,  347,  349,  353,  359,  367,\n      373,  379,  383,  389,  397,  401,  409,  419,\n      421,  431,  433,  439,  443,  449,  457,  461,\n      463,  467,  479,  487,  491,  499,  503,  509,\n      521,  523,  541,  547,  557,  563,  569,  571,\n      577,  587,  593,  599,  601,  607,  613,  617,\n      619,  631,  641,  643,  647,  653,  659,  661,\n      673,  677,  683,  691,  701,  709,  719,  727,\n      733,  739,  743,  751,  757,  761,  769,  773,\n      787,  797,  809,  811,  821,  823,  827,  829,\n      839,  853,  857,  859,  863,  877,  881,  883,\n      887,  907,  911,  919,  929,  937,  941,  947,\n      953,  967,  971,  977,  983,  991,  997, -103\n};\n\n/*\n * Small divisors test (X must be positive)\n *\n * Return values:\n * 0: no small factor (possible prime, more tests needed)\n * 1: certain prime\n * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: certain non-prime\n * other negative: error\n */\nstatic int mpi_check_small_factors( const mbedtls_mpi *X )\n{\n    int ret = 0;\n    size_t i;\n    mbedtls_mpi_uint r;\n\n    if( ( X->p[0] & 1 ) == 0 )\n        return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );\n\n    for( i = 0; small_prime[i] > 0; i++ )\n    {\n        if( mbedtls_mpi_cmp_int( X, small_prime[i] ) <= 0 )\n            return( 1 );\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, small_prime[i] ) );\n\n        if( r == 0 )\n            return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );\n    }\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Miller-Rabin pseudo-primality test  (HAC 4.24)\n */\nstatic int mpi_miller_rabin( const mbedtls_mpi *X,\n                             int (*f_rng)(void *, unsigned char *, size_t),\n                             void *p_rng )\n{\n    int ret, count;\n    size_t i, j, k, n, s;\n    mbedtls_mpi W, R, T, A, RR;\n\n    mbedtls_mpi_init( &W ); mbedtls_mpi_init( &R ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &A );\n    mbedtls_mpi_init( &RR );\n\n    /*\n     * W = |X| - 1\n     * R = W >> lsb( W )\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &W, X, 1 ) );\n    s = mbedtls_mpi_lsb( &W );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R, &W ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &R, s ) );\n\n    i = mbedtls_mpi_bitlen( X );\n    /*\n     * HAC, table 4.4\n     */\n    n = ( ( i >= 1300 ) ?  2 : ( i >=  850 ) ?  3 :\n          ( i >=  650 ) ?  4 : ( i >=  350 ) ?  8 :\n          ( i >=  250 ) ? 12 : ( i >=  150 ) ? 18 : 27 );\n\n    for( i = 0; i < n; i++ )\n    {\n        /*\n         * pick a random A, 1 < A < |X| - 1\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A, X->n * ciL, f_rng, p_rng ) );\n\n        if( mbedtls_mpi_cmp_mpi( &A, &W ) >= 0 )\n        {\n            j = mbedtls_mpi_bitlen( &A ) - mbedtls_mpi_bitlen( &W );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &A, j + 1 ) );\n        }\n        A.p[0] |= 3;\n\n        count = 0;\n        do {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A, X->n * ciL, f_rng, p_rng ) );\n\n            j = mbedtls_mpi_bitlen( &A );\n            k = mbedtls_mpi_bitlen( &W );\n            if (j > k) {\n                MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &A, j - k ) );\n            }\n\n            if (count++ > 30) {\n                return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;\n            }\n\n        } while ( mbedtls_mpi_cmp_mpi( &A, &W ) >= 0 ||\n                  mbedtls_mpi_cmp_int( &A, 1 )  <= 0    );\n\n        /*\n         * A = A^R mod |X|\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &A, &A, &R, X, &RR ) );\n\n        if( mbedtls_mpi_cmp_mpi( &A, &W ) == 0 ||\n            mbedtls_mpi_cmp_int( &A,  1 ) == 0 )\n            continue;\n\n        j = 1;\n        while( j < s && mbedtls_mpi_cmp_mpi( &A, &W ) != 0 )\n        {\n            /*\n             * A = A * A mod |X|\n             */\n            MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &A, &A ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &A, &T, X  ) );\n\n            if( mbedtls_mpi_cmp_int( &A, 1 ) == 0 )\n                break;\n\n            j++;\n        }\n\n        /*\n         * not prime if A != |X| - 1 or A == 1\n         */\n        if( mbedtls_mpi_cmp_mpi( &A, &W ) != 0 ||\n            mbedtls_mpi_cmp_int( &A,  1 ) == 0 )\n        {\n            ret = MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;\n            break;\n        }\n    }\n\ncleanup:\n    mbedtls_mpi_free( &W ); mbedtls_mpi_free( &R ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &A );\n    mbedtls_mpi_free( &RR );\n\n    return( ret );\n}\n\n/*\n * Pseudo-primality test: small factors, then Miller-Rabin\n */\nint mbedtls_mpi_is_prime( const mbedtls_mpi *X,\n                  int (*f_rng)(void *, unsigned char *, size_t),\n                  void *p_rng )\n{\n    int ret;\n    mbedtls_mpi XX;\n\n    XX.s = 1;\n    XX.n = X->n;\n    XX.p = X->p;\n\n    if( mbedtls_mpi_cmp_int( &XX, 0 ) == 0 ||\n        mbedtls_mpi_cmp_int( &XX, 1 ) == 0 )\n        return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );\n\n    if( mbedtls_mpi_cmp_int( &XX, 2 ) == 0 )\n        return( 0 );\n\n    if( ( ret = mpi_check_small_factors( &XX ) ) != 0 )\n    {\n        if( ret == 1 )\n            return( 0 );\n\n        return( ret );\n    }\n\n    return( mpi_miller_rabin( &XX, f_rng, p_rng ) );\n}\n\n/*\n * Prime number generation\n */\nint mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int dh_flag,\n                   int (*f_rng)(void *, unsigned char *, size_t),\n                   void *p_rng )\n{\n    int ret;\n    size_t k, n;\n    mbedtls_mpi_uint r;\n    mbedtls_mpi Y;\n\n    if( nbits < 3 || nbits > MBEDTLS_MPI_MAX_BITS )\n        return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA );\n\n    mbedtls_mpi_init( &Y );\n\n    n = BITS_TO_LIMBS( nbits );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( X, n * ciL, f_rng, p_rng ) );\n\n    k = mbedtls_mpi_bitlen( X );\n    if( k > nbits ) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( X, k - nbits + 1 ) );\n\n    mbedtls_mpi_set_bit( X, nbits-1, 1 );\n\n    X->p[0] |= 1;\n\n    if( dh_flag == 0 )\n    {\n        while( ( ret = mbedtls_mpi_is_prime( X, f_rng, p_rng ) ) != 0 )\n        {\n            if( ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE )\n                goto cleanup;\n\n            MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 2 ) );\n        }\n    }\n    else\n    {\n        /*\n         * An necessary condition for Y and X = 2Y + 1 to be prime\n         * is X = 2 mod 3 (which is equivalent to Y = 2 mod 3).\n         * Make sure it is satisfied, while keeping X = 3 mod 4\n         */\n\n        X->p[0] |= 2;\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r, X, 3 ) );\n        if( r == 0 )\n            MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 8 ) );\n        else if( r == 1 )\n            MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X, X, 4 ) );\n\n        /* Set Y = (X-1) / 2, which is X / 2 because X is odd */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y, X ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y, 1 ) );\n\n        while( 1 )\n        {\n            /*\n             * First, check small factors for X and Y\n             * before doing Miller-Rabin on any of them\n             */\n            if( ( ret = mpi_check_small_factors(  X         ) ) == 0 &&\n                ( ret = mpi_check_small_factors( &Y         ) ) == 0 &&\n                ( ret = mpi_miller_rabin(  X, f_rng, p_rng  ) ) == 0 &&\n                ( ret = mpi_miller_rabin( &Y, f_rng, p_rng  ) ) == 0 )\n            {\n                break;\n            }\n\n            if( ret != MBEDTLS_ERR_MPI_NOT_ACCEPTABLE )\n                goto cleanup;\n\n            /*\n             * Next candidates. We want to preserve Y = (X-1) / 2 and\n             * Y = 1 mod 2 and Y = 2 mod 3 (eq X = 3 mod 4 and X = 2 mod 3)\n             * so up Y by 6 and X by 12.\n             */\n            MBEDTLS_MPI_CHK( mbedtls_mpi_add_int(  X,  X, 12 ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &Y, &Y, 6  ) );\n        }\n    }\n\ncleanup:\n\n    mbedtls_mpi_free( &Y );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_GENPRIME */\n\n#if defined(MBEDTLS_SELF_TEST)\n\n#define GCD_PAIR_COUNT  3\n\nstatic const int gcd_pairs[GCD_PAIR_COUNT][3] =\n{\n    { 693, 609, 21 },\n    { 1764, 868, 28 },\n    { 768454923, 542167814, 1 }\n};\n\n/*\n * Checkup routine\n */\nint mbedtls_mpi_self_test( int verbose )\n{\n    int ret, i;\n    mbedtls_mpi A, E, N, X, Y, U, V;\n\n    mbedtls_mpi_init( &A ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &N ); mbedtls_mpi_init( &X );\n    mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &U ); mbedtls_mpi_init( &V );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &A, 16,\n        \"EFE021C2645FD1DC586E69184AF4A31E\" \\\n        \"D5F53E93B5F123FA41680867BA110131\" \\\n        \"944FE7952E2517337780CB0DB80E61AA\" \\\n        \"E7C8DDC6C5C6AADEB34EB38A2F40D5E6\" ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &E, 16,\n        \"B2E7EFD37075B9F03FF989C7C5051C20\" \\\n        \"34D2A323810251127E7BF8625A4F49A5\" \\\n        \"F3E27F4DA8BD59C47D6DAABA4C8127BD\" \\\n        \"5B5C25763222FEFCCFC38B832366C29E\" ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &N, 16,\n        \"0066A198186C18C10B2F5ED9B522752A\" \\\n        \"9830B69916E535C8F047518A889A43A5\" \\\n        \"94B6BED27A168D31D4A52F88925AA8F5\" ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &X, &A, &N ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,\n        \"602AB7ECA597A3D6B56FF9829A5E8B85\" \\\n        \"9E857EA95A03512E2BAE7391688D264A\" \\\n        \"A5663B0341DB9CCFD2C4C5F421FEC814\" \\\n        \"8001B72E848A38CAE1C65F78E56ABDEF\" \\\n        \"E12D3C039B8A02D6BE593F0BBBDA56F1\" \\\n        \"ECF677152EF804370C1A305CAF3B5BF1\" \\\n        \"30879B56C61DE584A0F53A2447A51E\" ) );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  MPI test #1 (mul_mpi): \" );\n\n    if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        ret = 1;\n        goto cleanup;\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &X, &Y, &A, &N ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,\n        \"256567336059E52CAE22925474705F39A94\" ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &V, 16,\n        \"6613F26162223DF488E9CD48CC132C7A\" \\\n        \"0AC93C701B001B092E4E5B9F73BCD27B\" \\\n        \"9EE50D0657C77F374E903CDFA4C642\" ) );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  MPI test #2 (div_mpi): \" );\n\n    if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 ||\n        mbedtls_mpi_cmp_mpi( &Y, &V ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        ret = 1;\n        goto cleanup;\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &X, &A, &E, &N, NULL ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,\n        \"36E139AEA55215609D2816998ED020BB\" \\\n        \"BD96C37890F65171D948E9BC7CBAA4D9\" \\\n        \"325D24D6A3C12710F10A09FA08AB87\" ) );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  MPI test #3 (exp_mod): \" );\n\n    if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        ret = 1;\n        goto cleanup;\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &X, &A, &N ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U, 16,\n        \"003A0AAEDD7E784FC07D8F9EC6E3BFD5\" \\\n        \"C3DBA76456363A10869622EAC2DD84EC\" \\\n        \"C5B8A74DAC4D09E03B5E0BE779F2DF61\" ) );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  MPI test #4 (inv_mod): \" );\n\n    if( mbedtls_mpi_cmp_mpi( &X, &U ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        ret = 1;\n        goto cleanup;\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  MPI test #5 (simple gcd): \" );\n\n    for( i = 0; i < GCD_PAIR_COUNT; i++ )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &X, gcd_pairs[i][0] ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Y, gcd_pairs[i][1] ) );\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &A, &X, &Y ) );\n\n        if( mbedtls_mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed at %d\\n\", i );\n\n            ret = 1;\n            goto cleanup;\n        }\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\ncleanup:\n\n    if( ret != 0 && verbose != 0 )\n        mbedtls_printf( \"Unexpected error, return code = %08X\\n\", ret );\n\n    mbedtls_mpi_free( &A ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &N ); mbedtls_mpi_free( &X );\n    mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &U ); mbedtls_mpi_free( &V );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_BIGNUM_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/blowfish.c",
    "content": "/*\n *  Blowfish implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The Blowfish block cipher was designed by Bruce Schneier in 1993.\n *  http://www.schneier.com/blowfish.html\n *  http://en.wikipedia.org/wiki/Blowfish_%28cipher%29\n *\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_BLOWFISH_C)\n\n#include \"mbedtls/blowfish.h\"\n\n#include <string.h>\n\n#if !defined(MBEDTLS_BLOWFISH_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\n/*\n * 32-bit integer manipulation macros (big endian)\n */\n#ifndef GET_UINT32_BE\n#define GET_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \\\n        | ( (uint32_t) (b)[(i) + 1] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 2] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 3]       );            \\\n}\n#endif\n\n#ifndef PUT_UINT32_BE\n#define PUT_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n)       );       \\\n}\n#endif\n\nstatic const uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2] = {\n        0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,\n        0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,\n        0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,\n        0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,\n        0x9216D5D9L, 0x8979FB1BL\n};\n\n/* declarations of data at the end of this file */\nstatic const uint32_t S[4][256];\n\nstatic uint32_t F( mbedtls_blowfish_context *ctx, uint32_t x )\n{\n   unsigned short a, b, c, d;\n   uint32_t  y;\n\n   d = (unsigned short)(x & 0xFF);\n   x >>= 8;\n   c = (unsigned short)(x & 0xFF);\n   x >>= 8;\n   b = (unsigned short)(x & 0xFF);\n   x >>= 8;\n   a = (unsigned short)(x & 0xFF);\n   y = ctx->S[0][a] + ctx->S[1][b];\n   y = y ^ ctx->S[2][c];\n   y = y + ctx->S[3][d];\n\n   return( y );\n}\n\nstatic void blowfish_enc( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr )\n{\n    uint32_t  Xl, Xr, temp;\n    short i;\n\n    Xl = *xl;\n    Xr = *xr;\n\n    for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS; ++i )\n    {\n        Xl = Xl ^ ctx->P[i];\n        Xr = F( ctx, Xl ) ^ Xr;\n\n        temp = Xl;\n        Xl = Xr;\n        Xr = temp;\n    }\n\n    temp = Xl;\n    Xl = Xr;\n    Xr = temp;\n\n    Xr = Xr ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS];\n    Xl = Xl ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS + 1];\n\n    *xl = Xl;\n    *xr = Xr;\n}\n\nstatic void blowfish_dec( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr )\n{\n    uint32_t  Xl, Xr, temp;\n    short i;\n\n    Xl = *xl;\n    Xr = *xr;\n\n    for( i = MBEDTLS_BLOWFISH_ROUNDS + 1; i > 1; --i )\n    {\n        Xl = Xl ^ ctx->P[i];\n        Xr = F( ctx, Xl ) ^ Xr;\n\n        temp = Xl;\n        Xl = Xr;\n        Xr = temp;\n    }\n\n    temp = Xl;\n    Xl = Xr;\n    Xr = temp;\n\n    Xr = Xr ^ ctx->P[1];\n    Xl = Xl ^ ctx->P[0];\n\n    *xl = Xl;\n    *xr = Xr;\n}\n\nvoid mbedtls_blowfish_init( mbedtls_blowfish_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_blowfish_context ) );\n}\n\nvoid mbedtls_blowfish_free( mbedtls_blowfish_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_blowfish_context ) );\n}\n\n/*\n * Blowfish key schedule\n */\nint mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx, const unsigned char *key,\n                     unsigned int keybits )\n{\n    unsigned int i, j, k;\n    uint32_t data, datal, datar;\n\n    if( keybits < MBEDTLS_BLOWFISH_MIN_KEY_BITS || keybits > MBEDTLS_BLOWFISH_MAX_KEY_BITS ||\n        ( keybits % 8 ) )\n    {\n        return( MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH );\n    }\n\n    keybits >>= 3;\n\n    for( i = 0; i < 4; i++ )\n    {\n        for( j = 0; j < 256; j++ )\n            ctx->S[i][j] = S[i][j];\n    }\n\n    j = 0;\n    for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; ++i )\n    {\n        data = 0x00000000;\n        for( k = 0; k < 4; ++k )\n        {\n            data = ( data << 8 ) | key[j++];\n            if( j >= keybits )\n                j = 0;\n        }\n        ctx->P[i] = P[i] ^ data;\n    }\n\n    datal = 0x00000000;\n    datar = 0x00000000;\n\n    for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; i += 2 )\n    {\n        blowfish_enc( ctx, &datal, &datar );\n        ctx->P[i] = datal;\n        ctx->P[i + 1] = datar;\n    }\n\n    for( i = 0; i < 4; i++ )\n    {\n       for( j = 0; j < 256; j += 2 )\n       {\n            blowfish_enc( ctx, &datal, &datar );\n            ctx->S[i][j] = datal;\n            ctx->S[i][j + 1] = datar;\n        }\n    }\n    return( 0 );\n}\n\n/*\n * Blowfish-ECB block encryption/decryption\n */\nint mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx,\n                    int mode,\n                    const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE],\n                    unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] )\n{\n    uint32_t X0, X1;\n\n    GET_UINT32_BE( X0, input,  0 );\n    GET_UINT32_BE( X1, input,  4 );\n\n    if( mode == MBEDTLS_BLOWFISH_DECRYPT )\n    {\n        blowfish_dec( ctx, &X0, &X1 );\n    }\n    else /* MBEDTLS_BLOWFISH_ENCRYPT */\n    {\n        blowfish_enc( ctx, &X0, &X1 );\n    }\n\n    PUT_UINT32_BE( X0, output,  0 );\n    PUT_UINT32_BE( X1, output,  4 );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/*\n * Blowfish-CBC buffer encryption/decryption\n */\nint mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx,\n                    int mode,\n                    size_t length,\n                    unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE],\n                    const unsigned char *input,\n                    unsigned char *output )\n{\n    int i;\n    unsigned char temp[MBEDTLS_BLOWFISH_BLOCKSIZE];\n\n    if( length % MBEDTLS_BLOWFISH_BLOCKSIZE )\n        return( MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH );\n\n    if( mode == MBEDTLS_BLOWFISH_DECRYPT )\n    {\n        while( length > 0 )\n        {\n            memcpy( temp, input, MBEDTLS_BLOWFISH_BLOCKSIZE );\n            mbedtls_blowfish_crypt_ecb( ctx, mode, input, output );\n\n            for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE;i++ )\n                output[i] = (unsigned char)( output[i] ^ iv[i] );\n\n            memcpy( iv, temp, MBEDTLS_BLOWFISH_BLOCKSIZE );\n\n            input  += MBEDTLS_BLOWFISH_BLOCKSIZE;\n            output += MBEDTLS_BLOWFISH_BLOCKSIZE;\n            length -= MBEDTLS_BLOWFISH_BLOCKSIZE;\n        }\n    }\n    else\n    {\n        while( length > 0 )\n        {\n            for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE; i++ )\n                output[i] = (unsigned char)( input[i] ^ iv[i] );\n\n            mbedtls_blowfish_crypt_ecb( ctx, mode, output, output );\n            memcpy( iv, output, MBEDTLS_BLOWFISH_BLOCKSIZE );\n\n            input  += MBEDTLS_BLOWFISH_BLOCKSIZE;\n            output += MBEDTLS_BLOWFISH_BLOCKSIZE;\n            length -= MBEDTLS_BLOWFISH_BLOCKSIZE;\n        }\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n/*\n * Blowfish CFB buffer encryption/decryption\n */\nint mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx,\n                       int mode,\n                       size_t length,\n                       size_t *iv_off,\n                       unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE],\n                       const unsigned char *input,\n                       unsigned char *output )\n{\n    int c;\n    size_t n = *iv_off;\n\n    if( mode == MBEDTLS_BLOWFISH_DECRYPT )\n    {\n        while( length-- )\n        {\n            if( n == 0 )\n                mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv );\n\n            c = *input++;\n            *output++ = (unsigned char)( c ^ iv[n] );\n            iv[n] = (unsigned char) c;\n\n            n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;\n        }\n    }\n    else\n    {\n        while( length-- )\n        {\n            if( n == 0 )\n                mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv );\n\n            iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );\n\n            n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;\n        }\n    }\n\n    *iv_off = n;\n\n    return( 0 );\n}\n#endif /*MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n/*\n * Blowfish CTR buffer encryption/decryption\n */\nint mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx,\n                       size_t length,\n                       size_t *nc_off,\n                       unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE],\n                       unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE],\n                       const unsigned char *input,\n                       unsigned char *output )\n{\n    int c, i;\n    size_t n = *nc_off;\n\n    while( length-- )\n    {\n        if( n == 0 ) {\n            mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, nonce_counter,\n                                stream_block );\n\n            for( i = MBEDTLS_BLOWFISH_BLOCKSIZE; i > 0; i-- )\n                if( ++nonce_counter[i - 1] != 0 )\n                    break;\n        }\n        c = *input++;\n        *output++ = (unsigned char)( c ^ stream_block[n] );\n\n        n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;\n    }\n\n    *nc_off = n;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\nstatic const uint32_t S[4][256] = {\n    {   0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,\n        0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,\n        0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,\n        0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,\n        0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,\n        0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,\n        0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,\n        0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,\n        0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,\n        0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,\n        0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,\n        0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,\n        0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,\n        0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,\n        0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,\n        0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,\n        0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,\n        0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,\n        0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,\n        0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,\n        0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,\n        0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,\n        0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,\n        0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,\n        0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,\n        0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,\n        0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,\n        0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,\n        0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,\n        0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,\n        0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,\n        0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,\n        0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,\n        0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,\n        0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,\n        0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,\n        0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,\n        0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,\n        0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,\n        0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,\n        0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,\n        0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,\n        0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,\n        0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,\n        0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,\n        0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,\n        0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,\n        0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,\n        0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,\n        0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,\n        0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,\n        0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,\n        0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,\n        0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,\n        0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,\n        0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,\n        0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,\n        0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,\n        0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,\n        0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,\n        0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,\n        0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,\n        0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,\n        0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL   },\n    {   0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,\n        0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,\n        0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,\n        0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,\n        0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,\n        0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,\n        0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,\n        0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,\n        0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,\n        0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,\n        0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,\n        0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,\n        0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,\n        0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,\n        0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,\n        0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,\n        0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,\n        0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,\n        0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,\n        0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,\n        0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,\n        0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,\n        0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,\n        0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,\n        0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,\n        0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,\n        0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,\n        0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,\n        0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,\n        0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,\n        0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,\n        0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,\n        0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,\n        0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,\n        0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,\n        0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,\n        0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,\n        0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,\n        0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,\n        0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,\n        0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,\n        0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,\n        0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,\n        0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,\n        0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,\n        0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,\n        0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,\n        0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,\n        0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,\n        0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,\n        0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,\n        0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,\n        0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,\n        0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,\n        0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,\n        0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,\n        0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,\n        0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,\n        0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,\n        0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,\n        0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,\n        0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,\n        0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,\n        0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L   },\n    {   0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,\n        0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,\n        0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,\n        0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,\n        0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,\n        0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,\n        0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,\n        0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,\n        0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,\n        0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,\n        0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,\n        0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,\n        0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,\n        0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,\n        0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,\n        0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,\n        0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,\n        0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,\n        0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,\n        0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,\n        0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,\n        0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,\n        0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,\n        0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,\n        0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,\n        0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,\n        0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,\n        0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,\n        0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,\n        0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,\n        0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,\n        0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,\n        0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,\n        0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,\n        0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,\n        0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,\n        0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,\n        0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,\n        0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,\n        0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,\n        0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,\n        0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,\n        0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,\n        0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,\n        0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,\n        0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,\n        0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,\n        0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,\n        0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,\n        0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,\n        0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,\n        0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,\n        0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,\n        0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,\n        0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,\n        0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,\n        0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,\n        0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,\n        0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,\n        0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,\n        0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,\n        0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,\n        0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,\n        0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L  },\n    {   0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,\n        0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,\n        0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,\n        0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,\n        0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,\n        0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,\n        0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,\n        0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,\n        0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,\n        0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,\n        0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,\n        0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,\n        0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,\n        0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,\n        0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,\n        0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,\n        0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,\n        0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,\n        0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,\n        0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,\n        0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,\n        0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,\n        0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,\n        0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,\n        0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,\n        0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,\n        0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,\n        0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,\n        0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,\n        0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,\n        0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,\n        0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,\n        0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,\n        0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,\n        0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,\n        0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,\n        0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,\n        0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,\n        0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,\n        0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,\n        0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,\n        0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,\n        0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,\n        0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,\n        0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,\n        0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,\n        0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,\n        0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,\n        0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,\n        0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,\n        0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,\n        0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,\n        0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,\n        0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,\n        0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,\n        0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,\n        0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,\n        0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,\n        0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,\n        0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,\n        0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,\n        0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,\n        0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,\n        0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L  }\n};\n\n#endif /* !MBEDTLS_BLOWFISH_ALT */\n#endif /* MBEDTLS_BLOWFISH_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/camellia.c",
    "content": "/*\n *  Camellia implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The Camellia block cipher was designed by NTT and Mitsubishi Electric\n *  Corporation.\n *\n *  http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/01espec.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_CAMELLIA_C)\n\n#include \"mbedtls/camellia.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_CAMELLIA_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\n/*\n * 32-bit integer manipulation macros (big endian)\n */\n#ifndef GET_UINT32_BE\n#define GET_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \\\n        | ( (uint32_t) (b)[(i) + 1] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 2] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 3]       );            \\\n}\n#endif\n\n#ifndef PUT_UINT32_BE\n#define PUT_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n)       );       \\\n}\n#endif\n\nstatic const unsigned char SIGMA_CHARS[6][8] =\n{\n    { 0xa0, 0x9e, 0x66, 0x7f, 0x3b, 0xcc, 0x90, 0x8b },\n    { 0xb6, 0x7a, 0xe8, 0x58, 0x4c, 0xaa, 0x73, 0xb2 },\n    { 0xc6, 0xef, 0x37, 0x2f, 0xe9, 0x4f, 0x82, 0xbe },\n    { 0x54, 0xff, 0x53, 0xa5, 0xf1, 0xd3, 0x6f, 0x1c },\n    { 0x10, 0xe5, 0x27, 0xfa, 0xde, 0x68, 0x2d, 0x1d },\n    { 0xb0, 0x56, 0x88, 0xc2, 0xb3, 0xe6, 0xc1, 0xfd }\n};\n\n#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)\n\nstatic const unsigned char FSb[256] =\n{\n    112,130, 44,236,179, 39,192,229,228,133, 87, 53,234, 12,174, 65,\n     35,239,107,147, 69, 25,165, 33,237, 14, 79, 78, 29,101,146,189,\n    134,184,175,143,124,235, 31,206, 62, 48,220, 95, 94,197, 11, 26,\n    166,225, 57,202,213, 71, 93, 61,217,  1, 90,214, 81, 86,108, 77,\n    139, 13,154,102,251,204,176, 45,116, 18, 43, 32,240,177,132,153,\n    223, 76,203,194, 52,126,118,  5,109,183,169, 49,209, 23,  4,215,\n     20, 88, 58, 97,222, 27, 17, 28, 50, 15,156, 22, 83, 24,242, 34,\n    254, 68,207,178,195,181,122,145, 36,  8,232,168, 96,252,105, 80,\n    170,208,160,125,161,137, 98,151, 84, 91, 30,149,224,255,100,210,\n     16,196,  0, 72,163,247,117,219,138,  3,230,218,  9, 63,221,148,\n    135, 92,131,  2,205, 74,144, 51,115,103,246,243,157,127,191,226,\n     82,155,216, 38,200, 55,198, 59,129,150,111, 75, 19,190, 99, 46,\n    233,121,167,140,159,110,188,142, 41,245,249,182, 47,253,180, 89,\n    120,152,  6,106,231, 70,113,186,212, 37,171, 66,136,162,141,250,\n    114,  7,185, 85,248,238,172, 10, 54, 73, 42,104, 60, 56,241,164,\n     64, 40,211,123,187,201, 67,193, 21,227,173,244,119,199,128,158\n};\n\n#define SBOX1(n) FSb[(n)]\n#define SBOX2(n) (unsigned char)((FSb[(n)] >> 7 ^ FSb[(n)] << 1) & 0xff)\n#define SBOX3(n) (unsigned char)((FSb[(n)] >> 1 ^ FSb[(n)] << 7) & 0xff)\n#define SBOX4(n) FSb[((n) << 1 ^ (n) >> 7) &0xff]\n\n#else /* MBEDTLS_CAMELLIA_SMALL_MEMORY */\n\nstatic const unsigned char FSb[256] =\n{\n 112, 130,  44, 236, 179,  39, 192, 229, 228, 133,  87,  53, 234,  12, 174,  65,\n  35, 239, 107, 147,  69,  25, 165,  33, 237,  14,  79,  78,  29, 101, 146, 189,\n 134, 184, 175, 143, 124, 235,  31, 206,  62,  48, 220,  95,  94, 197,  11,  26,\n 166, 225,  57, 202, 213,  71,  93,  61, 217,   1,  90, 214,  81,  86, 108,  77,\n 139,  13, 154, 102, 251, 204, 176,  45, 116,  18,  43,  32, 240, 177, 132, 153,\n 223,  76, 203, 194,  52, 126, 118,   5, 109, 183, 169,  49, 209,  23,   4, 215,\n  20,  88,  58,  97, 222,  27,  17,  28,  50,  15, 156,  22,  83,  24, 242,  34,\n 254,  68, 207, 178, 195, 181, 122, 145,  36,   8, 232, 168,  96, 252, 105,  80,\n 170, 208, 160, 125, 161, 137,  98, 151,  84,  91,  30, 149, 224, 255, 100, 210,\n  16, 196,   0,  72, 163, 247, 117, 219, 138,   3, 230, 218,   9,  63, 221, 148,\n 135,  92, 131,   2, 205,  74, 144,  51, 115, 103, 246, 243, 157, 127, 191, 226,\n  82, 155, 216,  38, 200,  55, 198,  59, 129, 150, 111,  75,  19, 190,  99,  46,\n 233, 121, 167, 140, 159, 110, 188, 142,  41, 245, 249, 182,  47, 253, 180,  89,\n 120, 152,   6, 106, 231,  70, 113, 186, 212,  37, 171,  66, 136, 162, 141, 250,\n 114,   7, 185,  85, 248, 238, 172,  10,  54,  73,  42, 104,  60,  56, 241, 164,\n 64,  40, 211, 123, 187, 201,  67, 193,  21, 227, 173, 244, 119, 199, 128, 158\n};\n\nstatic const unsigned char FSb2[256] =\n{\n 224,   5,  88, 217, 103,  78, 129, 203, 201,  11, 174, 106, 213,  24,  93, 130,\n  70, 223, 214,  39, 138,  50,  75,  66, 219,  28, 158, 156,  58, 202,  37, 123,\n  13, 113,  95,  31, 248, 215,  62, 157, 124,  96, 185, 190, 188, 139,  22,  52,\n  77, 195, 114, 149, 171, 142, 186, 122, 179,   2, 180, 173, 162, 172, 216, 154,\n  23,  26,  53, 204, 247, 153,  97,  90, 232,  36,  86,  64, 225,  99,   9,  51,\n 191, 152, 151, 133, 104, 252, 236,  10, 218, 111,  83,  98, 163,  46,   8, 175,\n  40, 176, 116, 194, 189,  54,  34,  56, 100,  30,  57,  44, 166,  48, 229,  68,\n 253, 136, 159, 101, 135, 107, 244,  35,  72,  16, 209,  81, 192, 249, 210, 160,\n  85, 161,  65, 250,  67,  19, 196,  47, 168, 182,  60,  43, 193, 255, 200, 165,\n  32, 137,   0, 144,  71, 239, 234, 183,  21,   6, 205, 181,  18, 126, 187,  41,\n  15, 184,   7,   4, 155, 148,  33, 102, 230, 206, 237, 231,  59, 254, 127, 197,\n 164,  55, 177,  76, 145, 110, 141, 118,   3,  45, 222, 150,  38, 125, 198,  92,\n 211, 242,  79,  25,  63, 220, 121,  29,  82, 235, 243, 109,  94, 251, 105, 178,\n 240,  49,  12, 212, 207, 140, 226, 117, 169,  74,  87, 132,  17,  69,  27, 245,\n 228,  14, 115, 170, 241, 221,  89,  20, 108, 146,  84, 208, 120, 112, 227,  73,\n 128,  80, 167, 246, 119, 147, 134, 131,  42, 199,  91, 233, 238, 143,   1,  61\n};\n\nstatic const unsigned char FSb3[256] =\n{\n  56,  65,  22, 118, 217, 147,  96, 242, 114, 194, 171, 154, 117,   6,  87, 160,\n 145, 247, 181, 201, 162, 140, 210, 144, 246,   7, 167,  39, 142, 178,  73, 222,\n  67,  92, 215, 199,  62, 245, 143, 103,  31,  24, 110, 175,  47, 226, 133,  13,\n  83, 240, 156, 101, 234, 163, 174, 158, 236, 128,  45, 107, 168,  43,  54, 166,\n 197, 134,  77,  51, 253, 102,  88, 150,  58,   9, 149,  16, 120, 216,  66, 204,\n 239,  38, 229,  97,  26,  63,  59, 130, 182, 219, 212, 152, 232, 139,   2, 235,\n  10,  44,  29, 176, 111, 141, 136,  14,  25, 135,  78,  11, 169,  12, 121,  17,\n 127,  34, 231,  89, 225, 218,  61, 200,  18,   4, 116,  84,  48, 126, 180,  40,\n  85, 104,  80, 190, 208, 196,  49, 203,  42, 173,  15, 202, 112, 255,  50, 105,\n   8,  98,   0,  36, 209, 251, 186, 237,  69, 129, 115, 109, 132, 159, 238,  74,\n 195,  46, 193,   1, 230,  37,  72, 153, 185, 179, 123, 249, 206, 191, 223, 113,\n  41, 205, 108,  19, 100, 155,  99, 157, 192,  75, 183, 165, 137,  95, 177,  23,\n 244, 188, 211,  70, 207,  55,  94,  71, 148, 250, 252,  91, 151, 254,  90, 172,\n  60,  76,   3,  53, 243,  35, 184,  93, 106, 146, 213,  33,  68,  81, 198, 125,\n  57, 131, 220, 170, 124, 119,  86,   5,  27, 164,  21,  52,  30,  28, 248,  82,\n  32,  20, 233, 189, 221, 228, 161, 224, 138, 241, 214, 122, 187, 227,  64,  79\n};\n\nstatic const unsigned char FSb4[256] =\n{\n 112,  44, 179, 192, 228,  87, 234, 174,  35, 107,  69, 165, 237,  79,  29, 146,\n 134, 175, 124,  31,  62, 220,  94,  11, 166,  57, 213,  93, 217,  90,  81, 108,\n 139, 154, 251, 176, 116,  43, 240, 132, 223, 203,  52, 118, 109, 169, 209,   4,\n  20,  58, 222,  17,  50, 156,  83, 242, 254, 207, 195, 122,  36, 232,  96, 105,\n 170, 160, 161,  98,  84,  30, 224, 100,  16,   0, 163, 117, 138, 230,   9, 221,\n 135, 131, 205, 144, 115, 246, 157, 191,  82, 216, 200, 198, 129, 111,  19,  99,\n 233, 167, 159, 188,  41, 249,  47, 180, 120,   6, 231, 113, 212, 171, 136, 141,\n 114, 185, 248, 172,  54,  42,  60, 241,  64, 211, 187,  67,  21, 173, 119, 128,\n 130, 236,  39, 229, 133,  53,  12,  65, 239, 147,  25,  33,  14,  78, 101, 189,\n 184, 143, 235, 206,  48,  95, 197,  26, 225, 202,  71,  61,   1, 214,  86,  77,\n  13, 102, 204,  45,  18,  32, 177, 153,  76, 194, 126,   5, 183,  49,  23, 215,\n  88,  97,  27,  28,  15,  22,  24,  34,  68, 178, 181, 145,   8, 168, 252,  80,\n 208, 125, 137, 151,  91, 149, 255, 210, 196,  72, 247, 219,   3, 218,  63, 148,\n  92,   2,  74,  51, 103, 243, 127, 226, 155,  38,  55,  59, 150,  75, 190,  46,\n 121, 140, 110, 142, 245, 182, 253,  89, 152, 106,  70, 186,  37,  66, 162, 250,\n  7,  85, 238,  10,  73, 104,  56, 164,  40, 123, 201, 193, 227, 244, 199, 158\n};\n\n#define SBOX1(n) FSb[(n)]\n#define SBOX2(n) FSb2[(n)]\n#define SBOX3(n) FSb3[(n)]\n#define SBOX4(n) FSb4[(n)]\n\n#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */\n\nstatic const unsigned char shifts[2][4][4] =\n{\n    {\n        { 1, 1, 1, 1 }, /* KL */\n        { 0, 0, 0, 0 }, /* KR */\n        { 1, 1, 1, 1 }, /* KA */\n        { 0, 0, 0, 0 }  /* KB */\n    },\n    {\n        { 1, 0, 1, 1 }, /* KL */\n        { 1, 1, 0, 1 }, /* KR */\n        { 1, 1, 1, 0 }, /* KA */\n        { 1, 1, 0, 1 }  /* KB */\n    }\n};\n\nstatic const signed char indexes[2][4][20] =\n{\n    {\n        {  0,  1,  2,  3,  8,  9, 10, 11, 38, 39,\n          36, 37, 23, 20, 21, 22, 27, -1, -1, 26 }, /* KL -> RK */\n        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, /* KR -> RK */\n        {  4,  5,  6,  7, 12, 13, 14, 15, 16, 17,\n          18, 19, -1, 24, 25, -1, 31, 28, 29, 30 }, /* KA -> RK */\n        { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n          -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }  /* KB -> RK */\n    },\n    {\n        {  0,  1,  2,  3, 61, 62, 63, 60, -1, -1,\n          -1, -1, 27, 24, 25, 26, 35, 32, 33, 34 }, /* KL -> RK */\n        { -1, -1, -1, -1,  8,  9, 10, 11, 16, 17,\n          18, 19, -1, -1, -1, -1, 39, 36, 37, 38 }, /* KR -> RK */\n        { -1, -1, -1, -1, 12, 13, 14, 15, 58, 59,\n          56, 57, 31, 28, 29, 30, -1, -1, -1, -1 }, /* KA -> RK */\n        {  4,  5,  6,  7, 65, 66, 67, 64, 20, 21,\n          22, 23, -1, -1, -1, -1, 43, 40, 41, 42 }  /* KB -> RK */\n    }\n};\n\nstatic const signed char transposes[2][20] =\n{\n    {\n        21, 22, 23, 20,\n        -1, -1, -1, -1,\n        18, 19, 16, 17,\n        11,  8,  9, 10,\n        15, 12, 13, 14\n    },\n    {\n        25, 26, 27, 24,\n        29, 30, 31, 28,\n        18, 19, 16, 17,\n        -1, -1, -1, -1,\n        -1, -1, -1, -1\n    }\n};\n\n/* Shift macro for 128 bit strings with rotation smaller than 32 bits (!) */\n#define ROTL(DEST, SRC, SHIFT)                                      \\\n{                                                                   \\\n    (DEST)[0] = (SRC)[0] << (SHIFT) ^ (SRC)[1] >> (32 - (SHIFT));   \\\n    (DEST)[1] = (SRC)[1] << (SHIFT) ^ (SRC)[2] >> (32 - (SHIFT));   \\\n    (DEST)[2] = (SRC)[2] << (SHIFT) ^ (SRC)[3] >> (32 - (SHIFT));   \\\n    (DEST)[3] = (SRC)[3] << (SHIFT) ^ (SRC)[0] >> (32 - (SHIFT));   \\\n}\n\n#define FL(XL, XR, KL, KR)                                          \\\n{                                                                   \\\n    (XR) = ((((XL) & (KL)) << 1) | (((XL) & (KL)) >> 31)) ^ (XR);   \\\n    (XL) = ((XR) | (KR)) ^ (XL);                                    \\\n}\n\n#define FLInv(YL, YR, KL, KR)                                       \\\n{                                                                   \\\n    (YL) = ((YR) | (KR)) ^ (YL);                                    \\\n    (YR) = ((((YL) & (KL)) << 1) | (((YL) & (KL)) >> 31)) ^ (YR);   \\\n}\n\n#define SHIFT_AND_PLACE(INDEX, OFFSET)                      \\\n{                                                           \\\n    TK[0] = KC[(OFFSET) * 4 + 0];                           \\\n    TK[1] = KC[(OFFSET) * 4 + 1];                           \\\n    TK[2] = KC[(OFFSET) * 4 + 2];                           \\\n    TK[3] = KC[(OFFSET) * 4 + 3];                           \\\n                                                            \\\n    for( i = 1; i <= 4; i++ )                               \\\n        if( shifts[(INDEX)][(OFFSET)][i -1] )               \\\n            ROTL(TK + i * 4, TK, ( 15 * i ) % 32);          \\\n                                                            \\\n    for( i = 0; i < 20; i++ )                               \\\n        if( indexes[(INDEX)][(OFFSET)][i] != -1 ) {         \\\n            RK[indexes[(INDEX)][(OFFSET)][i]] = TK[ i ];    \\\n        }                                                   \\\n}\n\nstatic void camellia_feistel( const uint32_t x[2], const uint32_t k[2],\n                              uint32_t z[2])\n{\n    uint32_t I0, I1;\n    I0 = x[0] ^ k[0];\n    I1 = x[1] ^ k[1];\n\n    I0 = ((uint32_t) SBOX1((I0 >> 24) & 0xFF) << 24) |\n         ((uint32_t) SBOX2((I0 >> 16) & 0xFF) << 16) |\n         ((uint32_t) SBOX3((I0 >>  8) & 0xFF) <<  8) |\n         ((uint32_t) SBOX4((I0      ) & 0xFF)      );\n    I1 = ((uint32_t) SBOX2((I1 >> 24) & 0xFF) << 24) |\n         ((uint32_t) SBOX3((I1 >> 16) & 0xFF) << 16) |\n         ((uint32_t) SBOX4((I1 >>  8) & 0xFF) <<  8) |\n         ((uint32_t) SBOX1((I1      ) & 0xFF)      );\n\n    I0 ^= (I1 << 8) | (I1 >> 24);\n    I1 ^= (I0 << 16) | (I0 >> 16);\n    I0 ^= (I1 >> 8) | (I1 << 24);\n    I1 ^= (I0 >> 8) | (I0 << 24);\n\n    z[0] ^= I1;\n    z[1] ^= I0;\n}\n\nvoid mbedtls_camellia_init( mbedtls_camellia_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_camellia_context ) );\n}\n\nvoid mbedtls_camellia_free( mbedtls_camellia_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_camellia_context ) );\n}\n\n/*\n * Camellia key schedule (encryption)\n */\nint mbedtls_camellia_setkey_enc( mbedtls_camellia_context *ctx, const unsigned char *key,\n                         unsigned int keybits )\n{\n    int idx;\n    size_t i;\n    uint32_t *RK;\n    unsigned char t[64];\n    uint32_t SIGMA[6][2];\n    uint32_t KC[16];\n    uint32_t TK[20];\n\n    RK = ctx->rk;\n\n    memset( t, 0, 64 );\n    memset( RK, 0, sizeof(ctx->rk) );\n\n    switch( keybits )\n    {\n        case 128: ctx->nr = 3; idx = 0; break;\n        case 192:\n        case 256: ctx->nr = 4; idx = 1; break;\n        default : return( MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH );\n    }\n\n    for( i = 0; i < keybits / 8; ++i )\n        t[i] = key[i];\n\n    if( keybits == 192 ) {\n        for( i = 0; i < 8; i++ )\n            t[24 + i] = ~t[16 + i];\n    }\n\n    /*\n     * Prepare SIGMA values\n     */\n    for( i = 0; i < 6; i++ ) {\n        GET_UINT32_BE( SIGMA[i][0], SIGMA_CHARS[i], 0 );\n        GET_UINT32_BE( SIGMA[i][1], SIGMA_CHARS[i], 4 );\n    }\n\n    /*\n     * Key storage in KC\n     * Order: KL, KR, KA, KB\n     */\n    memset( KC, 0, sizeof(KC) );\n\n    /* Store KL, KR */\n    for( i = 0; i < 8; i++ )\n        GET_UINT32_BE( KC[i], t, i * 4 );\n\n    /* Generate KA */\n    for( i = 0; i < 4; ++i )\n        KC[8 + i] = KC[i] ^ KC[4 + i];\n\n    camellia_feistel( KC + 8, SIGMA[0], KC + 10 );\n    camellia_feistel( KC + 10, SIGMA[1], KC + 8 );\n\n    for( i = 0; i < 4; ++i )\n        KC[8 + i] ^= KC[i];\n\n    camellia_feistel( KC + 8, SIGMA[2], KC + 10 );\n    camellia_feistel( KC + 10, SIGMA[3], KC + 8 );\n\n    if( keybits > 128 ) {\n        /* Generate KB */\n        for( i = 0; i < 4; ++i )\n            KC[12 + i] = KC[4 + i] ^ KC[8 + i];\n\n        camellia_feistel( KC + 12, SIGMA[4], KC + 14 );\n        camellia_feistel( KC + 14, SIGMA[5], KC + 12 );\n    }\n\n    /*\n     * Generating subkeys\n     */\n\n    /* Manipulating KL */\n    SHIFT_AND_PLACE( idx, 0 );\n\n    /* Manipulating KR */\n    if( keybits > 128 ) {\n        SHIFT_AND_PLACE( idx, 1 );\n    }\n\n    /* Manipulating KA */\n    SHIFT_AND_PLACE( idx, 2 );\n\n    /* Manipulating KB */\n    if( keybits > 128 ) {\n        SHIFT_AND_PLACE( idx, 3 );\n    }\n\n    /* Do transpositions */\n    for( i = 0; i < 20; i++ ) {\n        if( transposes[idx][i] != -1 ) {\n            RK[32 + 12 * idx + i] = RK[transposes[idx][i]];\n        }\n    }\n\n    return( 0 );\n}\n\n/*\n * Camellia key schedule (decryption)\n */\nint mbedtls_camellia_setkey_dec( mbedtls_camellia_context *ctx, const unsigned char *key,\n                         unsigned int keybits )\n{\n    int idx, ret;\n    size_t i;\n    mbedtls_camellia_context cty;\n    uint32_t *RK;\n    uint32_t *SK;\n\n    mbedtls_camellia_init( &cty );\n\n    /* Also checks keybits */\n    if( ( ret = mbedtls_camellia_setkey_enc( &cty, key, keybits ) ) != 0 )\n        goto exit;\n\n    ctx->nr = cty.nr;\n    idx = ( ctx->nr == 4 );\n\n    RK = ctx->rk;\n    SK = cty.rk + 24 * 2 + 8 * idx * 2;\n\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n\n    for( i = 22 + 8 * idx, SK -= 6; i > 0; i--, SK -= 4 )\n    {\n        *RK++ = *SK++;\n        *RK++ = *SK++;\n    }\n\n    SK -= 2;\n\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n    *RK++ = *SK++;\n\nexit:\n    mbedtls_camellia_free( &cty );\n\n    return( ret );\n}\n\n/*\n * Camellia-ECB block encryption/decryption\n */\nint mbedtls_camellia_crypt_ecb( mbedtls_camellia_context *ctx,\n                    int mode,\n                    const unsigned char input[16],\n                    unsigned char output[16] )\n{\n    int NR;\n    uint32_t *RK, X[4];\n\n    ( (void) mode );\n\n    NR = ctx->nr;\n    RK = ctx->rk;\n\n    GET_UINT32_BE( X[0], input,  0 );\n    GET_UINT32_BE( X[1], input,  4 );\n    GET_UINT32_BE( X[2], input,  8 );\n    GET_UINT32_BE( X[3], input, 12 );\n\n    X[0] ^= *RK++;\n    X[1] ^= *RK++;\n    X[2] ^= *RK++;\n    X[3] ^= *RK++;\n\n    while( NR ) {\n        --NR;\n        camellia_feistel( X, RK, X + 2 );\n        RK += 2;\n        camellia_feistel( X + 2, RK, X );\n        RK += 2;\n        camellia_feistel( X, RK, X + 2 );\n        RK += 2;\n        camellia_feistel( X + 2, RK, X );\n        RK += 2;\n        camellia_feistel( X, RK, X + 2 );\n        RK += 2;\n        camellia_feistel( X + 2, RK, X );\n        RK += 2;\n\n        if( NR ) {\n            FL(X[0], X[1], RK[0], RK[1]);\n            RK += 2;\n            FLInv(X[2], X[3], RK[0], RK[1]);\n            RK += 2;\n        }\n    }\n\n    X[2] ^= *RK++;\n    X[3] ^= *RK++;\n    X[0] ^= *RK++;\n    X[1] ^= *RK++;\n\n    PUT_UINT32_BE( X[2], output,  0 );\n    PUT_UINT32_BE( X[3], output,  4 );\n    PUT_UINT32_BE( X[0], output,  8 );\n    PUT_UINT32_BE( X[1], output, 12 );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/*\n * Camellia-CBC buffer encryption/decryption\n */\nint mbedtls_camellia_crypt_cbc( mbedtls_camellia_context *ctx,\n                    int mode,\n                    size_t length,\n                    unsigned char iv[16],\n                    const unsigned char *input,\n                    unsigned char *output )\n{\n    int i;\n    unsigned char temp[16];\n\n    if( length % 16 )\n        return( MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH );\n\n    if( mode == MBEDTLS_CAMELLIA_DECRYPT )\n    {\n        while( length > 0 )\n        {\n            memcpy( temp, input, 16 );\n            mbedtls_camellia_crypt_ecb( ctx, mode, input, output );\n\n            for( i = 0; i < 16; i++ )\n                output[i] = (unsigned char)( output[i] ^ iv[i] );\n\n            memcpy( iv, temp, 16 );\n\n            input  += 16;\n            output += 16;\n            length -= 16;\n        }\n    }\n    else\n    {\n        while( length > 0 )\n        {\n            for( i = 0; i < 16; i++ )\n                output[i] = (unsigned char)( input[i] ^ iv[i] );\n\n            mbedtls_camellia_crypt_ecb( ctx, mode, output, output );\n            memcpy( iv, output, 16 );\n\n            input  += 16;\n            output += 16;\n            length -= 16;\n        }\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n/*\n * Camellia-CFB128 buffer encryption/decryption\n */\nint mbedtls_camellia_crypt_cfb128( mbedtls_camellia_context *ctx,\n                       int mode,\n                       size_t length,\n                       size_t *iv_off,\n                       unsigned char iv[16],\n                       const unsigned char *input,\n                       unsigned char *output )\n{\n    int c;\n    size_t n = *iv_off;\n\n    if( mode == MBEDTLS_CAMELLIA_DECRYPT )\n    {\n        while( length-- )\n        {\n            if( n == 0 )\n                mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );\n\n            c = *input++;\n            *output++ = (unsigned char)( c ^ iv[n] );\n            iv[n] = (unsigned char) c;\n\n            n = ( n + 1 ) & 0x0F;\n        }\n    }\n    else\n    {\n        while( length-- )\n        {\n            if( n == 0 )\n                mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, iv, iv );\n\n            iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );\n\n            n = ( n + 1 ) & 0x0F;\n        }\n    }\n\n    *iv_off = n;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n/*\n * Camellia-CTR buffer encryption/decryption\n */\nint mbedtls_camellia_crypt_ctr( mbedtls_camellia_context *ctx,\n                       size_t length,\n                       size_t *nc_off,\n                       unsigned char nonce_counter[16],\n                       unsigned char stream_block[16],\n                       const unsigned char *input,\n                       unsigned char *output )\n{\n    int c, i;\n    size_t n = *nc_off;\n\n    while( length-- )\n    {\n        if( n == 0 ) {\n            mbedtls_camellia_crypt_ecb( ctx, MBEDTLS_CAMELLIA_ENCRYPT, nonce_counter,\n                                stream_block );\n\n            for( i = 16; i > 0; i-- )\n                if( ++nonce_counter[i - 1] != 0 )\n                    break;\n        }\n        c = *input++;\n        *output++ = (unsigned char)( c ^ stream_block[n] );\n\n        n = ( n + 1 ) & 0x0F;\n    }\n\n    *nc_off = n;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n#endif /* !MBEDTLS_CAMELLIA_ALT */\n\n#if defined(MBEDTLS_SELF_TEST)\n\n/*\n * Camellia test vectors from:\n *\n * http://info.isl.ntt.co.jp/crypt/eng/camellia/technology.html:\n *   http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/intermediate.txt\n *   http://info.isl.ntt.co.jp/crypt/eng/camellia/dl/cryptrec/t_camellia.txt\n *                      (For each bitlength: Key 0, Nr 39)\n */\n#define CAMELLIA_TESTS_ECB  2\n\nstatic const unsigned char camellia_test_ecb_key[3][CAMELLIA_TESTS_ECB][32] =\n{\n    {\n        { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n          0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },\n        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\n    },\n    {\n        { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n          0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n          0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 },\n        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\n    },\n    {\n        { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n          0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,\n          0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,\n          0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff },\n        { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\n    },\n};\n\nstatic const unsigned char camellia_test_ecb_plain[CAMELLIA_TESTS_ECB][16] =\n{\n    { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,\n      0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10 },\n    { 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }\n};\n\nstatic const unsigned char camellia_test_ecb_cipher[3][CAMELLIA_TESTS_ECB][16] =\n{\n    {\n        { 0x67, 0x67, 0x31, 0x38, 0x54, 0x96, 0x69, 0x73,\n          0x08, 0x57, 0x06, 0x56, 0x48, 0xea, 0xbe, 0x43 },\n        { 0x38, 0x3C, 0x6C, 0x2A, 0xAB, 0xEF, 0x7F, 0xDE,\n          0x25, 0xCD, 0x47, 0x0B, 0xF7, 0x74, 0xA3, 0x31 }\n    },\n    {\n        { 0xb4, 0x99, 0x34, 0x01, 0xb3, 0xe9, 0x96, 0xf8,\n          0x4e, 0xe5, 0xce, 0xe7, 0xd7, 0x9b, 0x09, 0xb9 },\n        { 0xD1, 0x76, 0x3F, 0xC0, 0x19, 0xD7, 0x7C, 0xC9,\n          0x30, 0xBF, 0xF2, 0xA5, 0x6F, 0x7C, 0x93, 0x64 }\n    },\n    {\n        { 0x9a, 0xcc, 0x23, 0x7d, 0xff, 0x16, 0xd7, 0x6c,\n          0x20, 0xef, 0x7c, 0x91, 0x9e, 0x3a, 0x75, 0x09 },\n        { 0x05, 0x03, 0xFB, 0x10, 0xAB, 0x24, 0x1E, 0x7C,\n          0xF4, 0x5D, 0x8C, 0xDE, 0xEE, 0x47, 0x43, 0x35 }\n    }\n};\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#define CAMELLIA_TESTS_CBC  3\n\nstatic const unsigned char camellia_test_cbc_key[3][32] =\n{\n        { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,\n          0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }\n    ,\n        { 0x8E, 0x73, 0xB0, 0xF7, 0xDA, 0x0E, 0x64, 0x52,\n          0xC8, 0x10, 0xF3, 0x2B, 0x80, 0x90, 0x79, 0xE5,\n          0x62, 0xF8, 0xEA, 0xD2, 0x52, 0x2C, 0x6B, 0x7B }\n    ,\n        { 0x60, 0x3D, 0xEB, 0x10, 0x15, 0xCA, 0x71, 0xBE,\n          0x2B, 0x73, 0xAE, 0xF0, 0x85, 0x7D, 0x77, 0x81,\n          0x1F, 0x35, 0x2C, 0x07, 0x3B, 0x61, 0x08, 0xD7,\n          0x2D, 0x98, 0x10, 0xA3, 0x09, 0x14, 0xDF, 0xF4 }\n};\n\nstatic const unsigned char camellia_test_cbc_iv[16] =\n\n    { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F }\n;\n\nstatic const unsigned char camellia_test_cbc_plain[CAMELLIA_TESTS_CBC][16] =\n{\n    { 0x6B, 0xC1, 0xBE, 0xE2, 0x2E, 0x40, 0x9F, 0x96,\n      0xE9, 0x3D, 0x7E, 0x11, 0x73, 0x93, 0x17, 0x2A },\n    { 0xAE, 0x2D, 0x8A, 0x57, 0x1E, 0x03, 0xAC, 0x9C,\n      0x9E, 0xB7, 0x6F, 0xAC, 0x45, 0xAF, 0x8E, 0x51 },\n    { 0x30, 0xC8, 0x1C, 0x46, 0xA3, 0x5C, 0xE4, 0x11,\n      0xE5, 0xFB, 0xC1, 0x19, 0x1A, 0x0A, 0x52, 0xEF }\n\n};\n\nstatic const unsigned char camellia_test_cbc_cipher[3][CAMELLIA_TESTS_CBC][16] =\n{\n    {\n        { 0x16, 0x07, 0xCF, 0x49, 0x4B, 0x36, 0xBB, 0xF0,\n          0x0D, 0xAE, 0xB0, 0xB5, 0x03, 0xC8, 0x31, 0xAB },\n        { 0xA2, 0xF2, 0xCF, 0x67, 0x16, 0x29, 0xEF, 0x78,\n          0x40, 0xC5, 0xA5, 0xDF, 0xB5, 0x07, 0x48, 0x87 },\n        { 0x0F, 0x06, 0x16, 0x50, 0x08, 0xCF, 0x8B, 0x8B,\n          0x5A, 0x63, 0x58, 0x63, 0x62, 0x54, 0x3E, 0x54 }\n    },\n    {\n        { 0x2A, 0x48, 0x30, 0xAB, 0x5A, 0xC4, 0xA1, 0xA2,\n          0x40, 0x59, 0x55, 0xFD, 0x21, 0x95, 0xCF, 0x93 },\n        { 0x5D, 0x5A, 0x86, 0x9B, 0xD1, 0x4C, 0xE5, 0x42,\n          0x64, 0xF8, 0x92, 0xA6, 0xDD, 0x2E, 0xC3, 0xD5 },\n        { 0x37, 0xD3, 0x59, 0xC3, 0x34, 0x98, 0x36, 0xD8,\n          0x84, 0xE3, 0x10, 0xAD, 0xDF, 0x68, 0xC4, 0x49 }\n    },\n    {\n        { 0xE6, 0xCF, 0xA3, 0x5F, 0xC0, 0x2B, 0x13, 0x4A,\n          0x4D, 0x2C, 0x0B, 0x67, 0x37, 0xAC, 0x3E, 0xDA },\n        { 0x36, 0xCB, 0xEB, 0x73, 0xBD, 0x50, 0x4B, 0x40,\n          0x70, 0xB1, 0xB7, 0xDE, 0x2B, 0x21, 0xEB, 0x50 },\n        { 0xE3, 0x1A, 0x60, 0x55, 0x29, 0x7D, 0x96, 0xCA,\n          0x33, 0x30, 0xCD, 0xF1, 0xB1, 0x86, 0x0A, 0x83 }\n    }\n};\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n/*\n * Camellia-CTR test vectors from:\n *\n * http://www.faqs.org/rfcs/rfc5528.html\n */\n\nstatic const unsigned char camellia_test_ctr_key[3][16] =\n{\n    { 0xAE, 0x68, 0x52, 0xF8, 0x12, 0x10, 0x67, 0xCC,\n      0x4B, 0xF7, 0xA5, 0x76, 0x55, 0x77, 0xF3, 0x9E },\n    { 0x7E, 0x24, 0x06, 0x78, 0x17, 0xFA, 0xE0, 0xD7,\n      0x43, 0xD6, 0xCE, 0x1F, 0x32, 0x53, 0x91, 0x63 },\n    { 0x76, 0x91, 0xBE, 0x03, 0x5E, 0x50, 0x20, 0xA8,\n      0xAC, 0x6E, 0x61, 0x85, 0x29, 0xF9, 0xA0, 0xDC }\n};\n\nstatic const unsigned char camellia_test_ctr_nonce_counter[3][16] =\n{\n    { 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },\n    { 0x00, 0x6C, 0xB6, 0xDB, 0xC0, 0x54, 0x3B, 0x59,\n      0xDA, 0x48, 0xD9, 0x0B, 0x00, 0x00, 0x00, 0x01 },\n    { 0x00, 0xE0, 0x01, 0x7B, 0x27, 0x77, 0x7F, 0x3F,\n      0x4A, 0x17, 0x86, 0xF0, 0x00, 0x00, 0x00, 0x01 }\n};\n\nstatic const unsigned char camellia_test_ctr_pt[3][48] =\n{\n    { 0x53, 0x69, 0x6E, 0x67, 0x6C, 0x65, 0x20, 0x62,\n      0x6C, 0x6F, 0x63, 0x6B, 0x20, 0x6D, 0x73, 0x67 },\n\n    { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,\n      0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n      0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F },\n\n    { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n      0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,\n      0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n      0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F,\n      0x20, 0x21, 0x22, 0x23 }\n};\n\nstatic const unsigned char camellia_test_ctr_ct[3][48] =\n{\n    { 0xD0, 0x9D, 0xC2, 0x9A, 0x82, 0x14, 0x61, 0x9A,\n      0x20, 0x87, 0x7C, 0x76, 0xDB, 0x1F, 0x0B, 0x3F },\n    { 0xDB, 0xF3, 0xC7, 0x8D, 0xC0, 0x83, 0x96, 0xD4,\n      0xDA, 0x7C, 0x90, 0x77, 0x65, 0xBB, 0xCB, 0x44,\n      0x2B, 0x8E, 0x8E, 0x0F, 0x31, 0xF0, 0xDC, 0xA7,\n      0x2C, 0x74, 0x17, 0xE3, 0x53, 0x60, 0xE0, 0x48 },\n    { 0xB1, 0x9D, 0x1F, 0xCD, 0xCB, 0x75, 0xEB, 0x88,\n      0x2F, 0x84, 0x9C, 0xE2, 0x4D, 0x85, 0xCF, 0x73,\n      0x9C, 0xE6, 0x4B, 0x2B, 0x5C, 0x9D, 0x73, 0xF1,\n      0x4F, 0x2D, 0x5D, 0x9D, 0xCE, 0x98, 0x89, 0xCD,\n      0xDF, 0x50, 0x86, 0x96 }\n};\n\nstatic const int camellia_test_ctr_len[3] =\n    { 16, 32, 36 };\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n/*\n * Checkup routine\n */\nint mbedtls_camellia_self_test( int verbose )\n{\n    int i, j, u, v;\n    unsigned char key[32];\n    unsigned char buf[64];\n    unsigned char src[16];\n    unsigned char dst[16];\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    unsigned char iv[16];\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    size_t offset, len;\n    unsigned char nonce_counter[16];\n    unsigned char stream_block[16];\n#endif\n\n    mbedtls_camellia_context ctx;\n\n    memset( key, 0, 32 );\n\n    for( j = 0; j < 6; j++ ) {\n        u = j >> 1;\n    v = j & 1;\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  CAMELLIA-ECB-%3d (%s): \", 128 + u * 64,\n                         (v == MBEDTLS_CAMELLIA_DECRYPT) ? \"dec\" : \"enc\");\n\n    for( i = 0; i < CAMELLIA_TESTS_ECB; i++ ) {\n        memcpy( key, camellia_test_ecb_key[u][i], 16 + 8 * u );\n\n        if( v == MBEDTLS_CAMELLIA_DECRYPT ) {\n            mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );\n            memcpy( src, camellia_test_ecb_cipher[u][i], 16 );\n            memcpy( dst, camellia_test_ecb_plain[i], 16 );\n        } else { /* MBEDTLS_CAMELLIA_ENCRYPT */\n            mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );\n            memcpy( src, camellia_test_ecb_plain[i], 16 );\n            memcpy( dst, camellia_test_ecb_cipher[u][i], 16 );\n        }\n\n        mbedtls_camellia_crypt_ecb( &ctx, v, src, buf );\n\n        if( memcmp( buf, dst, 16 ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            return( 1 );\n        }\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    /*\n     * CBC mode\n     */\n    for( j = 0; j < 6; j++ )\n    {\n        u = j >> 1;\n        v = j  & 1;\n\n        if( verbose != 0 )\n            mbedtls_printf( \"  CAMELLIA-CBC-%3d (%s): \", 128 + u * 64,\n                             ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? \"dec\" : \"enc\" );\n\n        memcpy( src, camellia_test_cbc_iv, 16 );\n        memcpy( dst, camellia_test_cbc_iv, 16 );\n        memcpy( key, camellia_test_cbc_key[u], 16 + 8 * u );\n\n        if( v == MBEDTLS_CAMELLIA_DECRYPT ) {\n            mbedtls_camellia_setkey_dec( &ctx, key, 128 + u * 64 );\n        } else {\n            mbedtls_camellia_setkey_enc( &ctx, key, 128 + u * 64 );\n        }\n\n        for( i = 0; i < CAMELLIA_TESTS_CBC; i++ ) {\n\n            if( v == MBEDTLS_CAMELLIA_DECRYPT ) {\n                memcpy( iv , src, 16 );\n                memcpy( src, camellia_test_cbc_cipher[u][i], 16 );\n                memcpy( dst, camellia_test_cbc_plain[i], 16 );\n            } else { /* MBEDTLS_CAMELLIA_ENCRYPT */\n                memcpy( iv , dst, 16 );\n                memcpy( src, camellia_test_cbc_plain[i], 16 );\n                memcpy( dst, camellia_test_cbc_cipher[u][i], 16 );\n            }\n\n            mbedtls_camellia_crypt_cbc( &ctx, v, 16, iv, src, buf );\n\n            if( memcmp( buf, dst, 16 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                return( 1 );\n            }\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    /*\n     * CTR mode\n     */\n    for( i = 0; i < 6; i++ )\n    {\n        u = i >> 1;\n        v = i  & 1;\n\n        if( verbose != 0 )\n            mbedtls_printf( \"  CAMELLIA-CTR-128 (%s): \",\n                             ( v == MBEDTLS_CAMELLIA_DECRYPT ) ? \"dec\" : \"enc\" );\n\n        memcpy( nonce_counter, camellia_test_ctr_nonce_counter[u], 16 );\n        memcpy( key, camellia_test_ctr_key[u], 16 );\n\n        offset = 0;\n        mbedtls_camellia_setkey_enc( &ctx, key, 128 );\n\n        if( v == MBEDTLS_CAMELLIA_DECRYPT )\n        {\n            len = camellia_test_ctr_len[u];\n            memcpy( buf, camellia_test_ctr_ct[u], len );\n\n            mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,\n                                buf, buf );\n\n            if( memcmp( buf, camellia_test_ctr_pt[u], len ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                return( 1 );\n            }\n        }\n        else\n        {\n            len = camellia_test_ctr_len[u];\n            memcpy( buf, camellia_test_ctr_pt[u], len );\n\n            mbedtls_camellia_crypt_ctr( &ctx, len, &offset, nonce_counter, stream_block,\n                                buf, buf );\n\n            if( memcmp( buf, camellia_test_ctr_ct[u], len ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                return( 1 );\n            }\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_CAMELLIA_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ccm.c",
    "content": "/*\n *  NIST SP800-38C compliant CCM implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * Definition of CCM:\n * http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf\n * RFC 3610 \"Counter with CBC-MAC (CCM)\"\n *\n * Related:\n * RFC 5116 \"An Interface and Algorithms for Authenticated Encryption\"\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_CCM_C)\n\n#include \"mbedtls/ccm.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\n#define CCM_ENCRYPT 0\n#define CCM_DECRYPT 1\n\n/*\n * Initialize context\n */\nvoid mbedtls_ccm_init( mbedtls_ccm_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_ccm_context ) );\n}\n\nint mbedtls_ccm_setkey( mbedtls_ccm_context *ctx,\n                        mbedtls_cipher_id_t cipher,\n                        const unsigned char *key,\n                        unsigned int keybits )\n{\n    int ret;\n    const mbedtls_cipher_info_t *cipher_info;\n\n    cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB );\n    if( cipher_info == NULL )\n        return( MBEDTLS_ERR_CCM_BAD_INPUT );\n\n    if( cipher_info->block_size != 16 )\n        return( MBEDTLS_ERR_CCM_BAD_INPUT );\n\n    mbedtls_cipher_free( &ctx->cipher_ctx );\n\n    if( ( ret = mbedtls_cipher_setup( &ctx->cipher_ctx, cipher_info ) ) != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_cipher_setkey( &ctx->cipher_ctx, key, keybits,\n                               MBEDTLS_ENCRYPT ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    return( 0 );\n}\n\n/*\n * Free context\n */\nvoid mbedtls_ccm_free( mbedtls_ccm_context *ctx )\n{\n    mbedtls_cipher_free( &ctx->cipher_ctx );\n    mbedtls_zeroize( ctx, sizeof( mbedtls_ccm_context ) );\n}\n\n/*\n * Macros for common operations.\n * Results in smaller compiled code than static inline functions.\n */\n\n/*\n * Update the CBC-MAC state in y using a block in b\n * (Always using b as the source helps the compiler optimise a bit better.)\n */\n#define UPDATE_CBC_MAC                                                      \\\n    for( i = 0; i < 16; i++ )                                               \\\n        y[i] ^= b[i];                                                       \\\n                                                                            \\\n    if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, y, 16, y, &olen ) ) != 0 ) \\\n        return( ret );\n\n/*\n * Encrypt or decrypt a partial block with CTR\n * Warning: using b for temporary storage! src and dst must not be b!\n * This avoids allocating one more 16 bytes buffer while allowing src == dst.\n */\n#define CTR_CRYPT( dst, src, len  )                                            \\\n    if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctr, 16, b, &olen ) ) != 0 )  \\\n        return( ret );                                                         \\\n                                                                               \\\n    for( i = 0; i < len; i++ )                                                 \\\n        dst[i] = src[i] ^ b[i];\n\n/*\n * Authenticated encryption or decryption\n */\nstatic int ccm_auth_crypt( mbedtls_ccm_context *ctx, int mode, size_t length,\n                           const unsigned char *iv, size_t iv_len,\n                           const unsigned char *add, size_t add_len,\n                           const unsigned char *input, unsigned char *output,\n                           unsigned char *tag, size_t tag_len )\n{\n    int ret;\n    unsigned char i;\n    unsigned char q;\n    size_t len_left, olen;\n    unsigned char b[16];\n    unsigned char y[16];\n    unsigned char ctr[16];\n    const unsigned char *src;\n    unsigned char *dst;\n\n    /*\n     * Check length requirements: SP800-38C A.1\n     * Additional requirement: a < 2^16 - 2^8 to simplify the code.\n     * 'length' checked later (when writing it to the first block)\n     */\n    if( tag_len < 4 || tag_len > 16 || tag_len % 2 != 0 )\n        return( MBEDTLS_ERR_CCM_BAD_INPUT );\n\n    /* Also implies q is within bounds */\n    if( iv_len < 7 || iv_len > 13 )\n        return( MBEDTLS_ERR_CCM_BAD_INPUT );\n\n    if( add_len > 0xFF00 )\n        return( MBEDTLS_ERR_CCM_BAD_INPUT );\n\n    q = 16 - 1 - (unsigned char) iv_len;\n\n    /*\n     * First block B_0:\n     * 0        .. 0        flags\n     * 1        .. iv_len   nonce (aka iv)\n     * iv_len+1 .. 15       length\n     *\n     * With flags as (bits):\n     * 7        0\n     * 6        add present?\n     * 5 .. 3   (t - 2) / 2\n     * 2 .. 0   q - 1\n     */\n    b[0] = 0;\n    b[0] |= ( add_len > 0 ) << 6;\n    b[0] |= ( ( tag_len - 2 ) / 2 ) << 3;\n    b[0] |= q - 1;\n\n    memcpy( b + 1, iv, iv_len );\n\n    for( i = 0, len_left = length; i < q; i++, len_left >>= 8 )\n        b[15-i] = (unsigned char)( len_left & 0xFF );\n\n    if( len_left > 0 )\n        return( MBEDTLS_ERR_CCM_BAD_INPUT );\n\n\n    /* Start CBC-MAC with first block */\n    memset( y, 0, 16 );\n    UPDATE_CBC_MAC;\n\n    /*\n     * If there is additional data, update CBC-MAC with\n     * add_len, add, 0 (padding to a block boundary)\n     */\n    if( add_len > 0 )\n    {\n        size_t use_len;\n        len_left = add_len;\n        src = add;\n\n        memset( b, 0, 16 );\n        b[0] = (unsigned char)( ( add_len >> 8 ) & 0xFF );\n        b[1] = (unsigned char)( ( add_len      ) & 0xFF );\n\n        use_len = len_left < 16 - 2 ? len_left : 16 - 2;\n        memcpy( b + 2, src, use_len );\n        len_left -= use_len;\n        src += use_len;\n\n        UPDATE_CBC_MAC;\n\n        while( len_left > 0 )\n        {\n            use_len = len_left > 16 ? 16 : len_left;\n\n            memset( b, 0, 16 );\n            memcpy( b, src, use_len );\n            UPDATE_CBC_MAC;\n\n            len_left -= use_len;\n            src += use_len;\n        }\n    }\n\n    /*\n     * Prepare counter block for encryption:\n     * 0        .. 0        flags\n     * 1        .. iv_len   nonce (aka iv)\n     * iv_len+1 .. 15       counter (initially 1)\n     *\n     * With flags as (bits):\n     * 7 .. 3   0\n     * 2 .. 0   q - 1\n     */\n    ctr[0] = q - 1;\n    memcpy( ctr + 1, iv, iv_len );\n    memset( ctr + 1 + iv_len, 0, q );\n    ctr[15] = 1;\n\n    /*\n     * Authenticate and {en,de}crypt the message.\n     *\n     * The only difference between encryption and decryption is\n     * the respective order of authentication and {en,de}cryption.\n     */\n    len_left = length;\n    src = input;\n    dst = output;\n\n    while( len_left > 0 )\n    {\n        size_t use_len = len_left > 16 ? 16 : len_left;\n\n        if( mode == CCM_ENCRYPT )\n        {\n            memset( b, 0, 16 );\n            memcpy( b, src, use_len );\n            UPDATE_CBC_MAC;\n        }\n\n        CTR_CRYPT( dst, src, use_len );\n\n        if( mode == CCM_DECRYPT )\n        {\n            memset( b, 0, 16 );\n            memcpy( b, dst, use_len );\n            UPDATE_CBC_MAC;\n        }\n\n        dst += use_len;\n        src += use_len;\n        len_left -= use_len;\n\n        /*\n         * Increment counter.\n         * No need to check for overflow thanks to the length check above.\n         */\n        for( i = 0; i < q; i++ )\n            if( ++ctr[15-i] != 0 )\n                break;\n    }\n\n    /*\n     * Authentication: reset counter and crypt/mask internal tag\n     */\n    for( i = 0; i < q; i++ )\n        ctr[15-i] = 0;\n\n    CTR_CRYPT( y, y, 16 );\n    memcpy( tag, y, tag_len );\n\n    return( 0 );\n}\n\n/*\n * Authenticated encryption\n */\nint mbedtls_ccm_encrypt_and_tag( mbedtls_ccm_context *ctx, size_t length,\n                         const unsigned char *iv, size_t iv_len,\n                         const unsigned char *add, size_t add_len,\n                         const unsigned char *input, unsigned char *output,\n                         unsigned char *tag, size_t tag_len )\n{\n    return( ccm_auth_crypt( ctx, CCM_ENCRYPT, length, iv, iv_len,\n                            add, add_len, input, output, tag, tag_len ) );\n}\n\n/*\n * Authenticated decryption\n */\nint mbedtls_ccm_auth_decrypt( mbedtls_ccm_context *ctx, size_t length,\n                      const unsigned char *iv, size_t iv_len,\n                      const unsigned char *add, size_t add_len,\n                      const unsigned char *input, unsigned char *output,\n                      const unsigned char *tag, size_t tag_len )\n{\n    int ret;\n    unsigned char check_tag[16];\n    unsigned char i;\n    int diff;\n\n    if( ( ret = ccm_auth_crypt( ctx, CCM_DECRYPT, length,\n                                iv, iv_len, add, add_len,\n                                input, output, check_tag, tag_len ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    /* Check tag in \"constant-time\" */\n    for( diff = 0, i = 0; i < tag_len; i++ )\n        diff |= tag[i] ^ check_tag[i];\n\n    if( diff != 0 )\n    {\n        mbedtls_zeroize( output, length );\n        return( MBEDTLS_ERR_CCM_AUTH_FAILED );\n    }\n\n    return( 0 );\n}\n\n\n#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)\n/*\n * Examples 1 to 3 from SP800-38C Appendix C\n */\n\n#define NB_TESTS 3\n\n/*\n * The data is the same for all tests, only the used length changes\n */\nstatic const unsigned char key[] = {\n    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,\n    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f\n};\n\nstatic const unsigned char iv[] = {\n    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\n    0x18, 0x19, 0x1a, 0x1b\n};\n\nstatic const unsigned char ad[] = {\n    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\n    0x10, 0x11, 0x12, 0x13\n};\n\nstatic const unsigned char msg[] = {\n    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,\n    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,\n};\n\nstatic const size_t iv_len [NB_TESTS] = { 7, 8,  12 };\nstatic const size_t add_len[NB_TESTS] = { 8, 16, 20 };\nstatic const size_t msg_len[NB_TESTS] = { 4, 16, 24 };\nstatic const size_t tag_len[NB_TESTS] = { 4, 6,  8  };\n\nstatic const unsigned char res[NB_TESTS][32] = {\n    {   0x71, 0x62, 0x01, 0x5b, 0x4d, 0xac, 0x25, 0x5d },\n    {   0xd2, 0xa1, 0xf0, 0xe0, 0x51, 0xea, 0x5f, 0x62,\n        0x08, 0x1a, 0x77, 0x92, 0x07, 0x3d, 0x59, 0x3d,\n        0x1f, 0xc6, 0x4f, 0xbf, 0xac, 0xcd },\n    {   0xe3, 0xb2, 0x01, 0xa9, 0xf5, 0xb7, 0x1a, 0x7a,\n        0x9b, 0x1c, 0xea, 0xec, 0xcd, 0x97, 0xe7, 0x0b,\n        0x61, 0x76, 0xaa, 0xd9, 0xa4, 0x42, 0x8a, 0xa5,\n        0x48, 0x43, 0x92, 0xfb, 0xc1, 0xb0, 0x99, 0x51 }\n};\n\nint mbedtls_ccm_self_test( int verbose )\n{\n    mbedtls_ccm_context ctx;\n    unsigned char out[32];\n    size_t i;\n    int ret;\n\n    mbedtls_ccm_init( &ctx );\n\n    if( mbedtls_ccm_setkey( &ctx, MBEDTLS_CIPHER_ID_AES, key, 8 * sizeof key ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  CCM: setup failed\" );\n\n        return( 1 );\n    }\n\n    for( i = 0; i < NB_TESTS; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  CCM-AES #%u: \", (unsigned int) i + 1 );\n\n        ret = mbedtls_ccm_encrypt_and_tag( &ctx, msg_len[i],\n                                   iv, iv_len[i], ad, add_len[i],\n                                   msg, out,\n                                   out + msg_len[i], tag_len[i] );\n\n        if( ret != 0 ||\n            memcmp( out, res[i], msg_len[i] + tag_len[i] ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            return( 1 );\n        }\n\n        ret = mbedtls_ccm_auth_decrypt( &ctx, msg_len[i],\n                                iv, iv_len[i], ad, add_len[i],\n                                res[i], out,\n                                res[i] + msg_len[i], tag_len[i] );\n\n        if( ret != 0 ||\n            memcmp( out, msg, msg_len[i] ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            return( 1 );\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    mbedtls_ccm_free( &ctx );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */\n\n#endif /* MBEDTLS_CCM_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/certs.c",
    "content": "/*\n *  X.509 test certificates\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"mbedtls/certs.h\"\n\n#if defined(MBEDTLS_CERTS_C)\n\n#if defined(MBEDTLS_ECDSA_C)\n#define TEST_CA_CRT_EC                                                  \\\n\"-----BEGIN CERTIFICATE-----\\r\\n\"                                       \\\n\"MIICUjCCAdegAwIBAgIJAMFD4n5iQ8zoMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYT\\r\\n\"  \\\n\"Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\\r\\n\"  \\\n\"QyBDQTAeFw0xMzA5MjQxNTQ5NDhaFw0yMzA5MjIxNTQ5NDhaMD4xCzAJBgNVBAYT\\r\\n\"  \\\n\"Ak5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\\r\\n\"  \\\n\"QyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMPaKzRBN1gvh1b+/Im6KUNLTuBu\\r\\n\"  \\\n\"ww5XUzM5WNRStJGVOQsj318XJGJI/BqVKc4sLYfCiFKAr9ZqqyHduNMcbli4yuiy\\r\\n\"  \\\n\"aY7zQa0pw7RfdadHb9UZKVVpmlM7ILRmFmAzHqOBoDCBnTAdBgNVHQ4EFgQUnW0g\\r\\n\"  \\\n\"JEkBPyvLeLUZvH4kydv7NnwwbgYDVR0jBGcwZYAUnW0gJEkBPyvLeLUZvH4kydv7\\r\\n\"  \\\n\"NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UE\\r\\n\"  \\\n\"AxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAwGA1UdEwQFMAMBAf8w\\r\\n\"  \\\n\"CgYIKoZIzj0EAwIDaQAwZgIxAMO0YnNWKJUAfXgSJtJxexn4ipg+kv4znuR50v56\\r\\n\"  \\\n\"t4d0PCu412mUC6Nnd7izvtE2MgIxAP1nnJQjZ8BWukszFQDG48wxCCyci9qpdSMv\\r\\n\"  \\\n\"uCjn8pwUOkABXK8Mss90fzCfCEOtIA==\\r\\n\"                                  \\\n\"-----END CERTIFICATE-----\\r\\n\"\nconst char mbedtls_test_ca_crt_ec[] = TEST_CA_CRT_EC;\nconst size_t mbedtls_test_ca_crt_ec_len = sizeof( mbedtls_test_ca_crt_ec );\n\nconst char mbedtls_test_ca_key_ec[] =\n\"-----BEGIN EC PRIVATE KEY-----\\r\\n\"\n\"Proc-Type: 4,ENCRYPTED\\r\\n\"\n\"DEK-Info: DES-EDE3-CBC,307EAB469933D64E\\r\\n\"\n\"\\r\\n\"\n\"IxbrRmKcAzctJqPdTQLA4SWyBYYGYJVkYEna+F7Pa5t5Yg/gKADrFKcm6B72e7DG\\r\\n\"\n\"ihExtZI648s0zdYw6qSJ74vrPSuWDe5qm93BqsfVH9svtCzWHW0pm1p0KTBCFfUq\\r\\n\"\n\"UsuWTITwJImcnlAs1gaRZ3sAWm7cOUidL0fo2G0fYUFNcYoCSLffCFTEHBuPnagb\\r\\n\"\n\"a77x/sY1Bvii8S9/XhDTb6pTMx06wzrm\\r\\n\"\n\"-----END EC PRIVATE KEY-----\\r\\n\";\nconst size_t mbedtls_test_ca_key_ec_len = sizeof( mbedtls_test_ca_key_ec );\n\nconst char mbedtls_test_ca_pwd_ec[] = \"PolarSSLTest\";\nconst size_t mbedtls_test_ca_pwd_ec_len = sizeof( mbedtls_test_ca_pwd_ec ) - 1;\n\nconst char mbedtls_test_srv_crt_ec[] =\n\"-----BEGIN CERTIFICATE-----\\r\\n\"\n\"MIICHzCCAaWgAwIBAgIBCTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\\r\\n\"\n\"A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\\r\\n\"\n\"MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjA0MQswCQYDVQQGEwJOTDERMA8G\\r\\n\"\n\"A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDBZMBMGByqGSM49AgEG\\r\\n\"\n\"CCqGSM49AwEHA0IABDfMVtl2CR5acj7HWS3/IG7ufPkGkXTQrRS192giWWKSTuUA\\r\\n\"\n\"2CMR/+ov0jRdXRa9iojCa3cNVc2KKg76Aci07f+jgZ0wgZowCQYDVR0TBAIwADAd\\r\\n\"\n\"BgNVHQ4EFgQUUGGlj9QH2deCAQzlZX+MY0anE74wbgYDVR0jBGcwZYAUnW0gJEkB\\r\\n\"\n\"PyvLeLUZvH4kydv7NnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xh\\r\\n\"\n\"clNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAoG\\r\\n\"\n\"CCqGSM49BAMCA2gAMGUCMQCaLFzXptui5WQN8LlO3ddh1hMxx6tzgLvT03MTVK2S\\r\\n\"\n\"C12r0Lz3ri/moSEpNZWqPjkCMCE2f53GXcYLqyfyJR078c/xNSUU5+Xxl7VZ414V\\r\\n\"\n\"fGa5kHvHARBPc8YAIVIqDvHH1Q==\\r\\n\"\n\"-----END CERTIFICATE-----\\r\\n\";\nconst size_t mbedtls_test_srv_crt_ec_len = sizeof( mbedtls_test_srv_crt_ec );\n\nconst char mbedtls_test_srv_key_ec[] =\n\"-----BEGIN EC PRIVATE KEY-----\\r\\n\"\n\"MHcCAQEEIPEqEyB2AnCoPL/9U/YDHvdqXYbIogTywwyp6/UfDw6noAoGCCqGSM49\\r\\n\"\n\"AwEHoUQDQgAEN8xW2XYJHlpyPsdZLf8gbu58+QaRdNCtFLX3aCJZYpJO5QDYIxH/\\r\\n\"\n\"6i/SNF1dFr2KiMJrdw1VzYoqDvoByLTt/w==\\r\\n\"\n\"-----END EC PRIVATE KEY-----\\r\\n\";\nconst size_t mbedtls_test_srv_key_ec_len = sizeof( mbedtls_test_srv_key_ec );\n\nconst char mbedtls_test_cli_crt_ec[] =\n\"-----BEGIN CERTIFICATE-----\\r\\n\"\n\"MIICLDCCAbKgAwIBAgIBDTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\\r\\n\"\n\"A1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\\r\\n\"\n\"MTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjBBMQswCQYDVQQGEwJOTDERMA8G\\r\\n\"\n\"A1UEChMIUG9sYXJTU0wxHzAdBgNVBAMTFlBvbGFyU1NMIFRlc3QgQ2xpZW50IDIw\\r\\n\"\n\"WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARX5a6xc9/TrLuTuIH/Eq7u5lOszlVT\\r\\n\"\n\"9jQOzC7jYyUL35ji81xgNpbA1RgUcOV/n9VLRRjlsGzVXPiWj4dwo+THo4GdMIGa\\r\\n\"\n\"MAkGA1UdEwQCMAAwHQYDVR0OBBYEFHoAX4Zk/OBd5REQO7LmO8QmP8/iMG4GA1Ud\\r\\n\"\n\"IwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8oUKkQDA+MQswCQYDVQQGEwJOTDER\\r\\n\"\n\"MA8GA1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0GC\\r\\n\"\n\"CQDBQ+J+YkPM6DAKBggqhkjOPQQDAgNoADBlAjBKZQ17IIOimbmoD/yN7o89u3BM\\r\\n\"\n\"lgOsjnhw3fIOoLIWy2WOGsk/LGF++DzvrRzuNiACMQCd8iem1XS4JK7haj8xocpU\\r\\n\"\n\"LwjQje5PDGHfd3h9tP38Qknu5bJqws0md2KOKHyeV0U=\\r\\n\"\n\"-----END CERTIFICATE-----\\r\\n\";\nconst size_t mbedtls_test_cli_crt_ec_len = sizeof( mbedtls_test_cli_crt_ec );\n\nconst char mbedtls_test_cli_key_ec[] =\n\"-----BEGIN EC PRIVATE KEY-----\\r\\n\"\n\"MHcCAQEEIPb3hmTxZ3/mZI3vyk7p3U3wBf+WIop6hDhkFzJhmLcqoAoGCCqGSM49\\r\\n\"\n\"AwEHoUQDQgAEV+WusXPf06y7k7iB/xKu7uZTrM5VU/Y0Dswu42MlC9+Y4vNcYDaW\\r\\n\"\n\"wNUYFHDlf5/VS0UY5bBs1Vz4lo+HcKPkxw==\\r\\n\"\n\"-----END EC PRIVATE KEY-----\\r\\n\";\nconst size_t mbedtls_test_cli_key_ec_len = sizeof( mbedtls_test_cli_key_ec );\n#endif /* MBEDTLS_ECDSA_C */\n\n#if defined(MBEDTLS_RSA_C)\n\n#if defined(MBEDTLS_SHA256_C)\n#define TEST_CA_CRT_RSA_SHA256                                          \\\n\"-----BEGIN CERTIFICATE-----\\r\\n\"                                       \\\n\"MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\\r\\n\"  \\\n\"MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\\r\\n\"  \\\n\"MTcwNTA0MTY1NzAxWhcNMjcwNTA1MTY1NzAxWjA7MQswCQYDVQQGEwJOTDERMA8G\\r\\n\"  \\\n\"A1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\\r\\n\"  \\\n\"CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\\r\\n\"  \\\n\"mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\\r\\n\"  \\\n\"50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\\r\\n\"  \\\n\"YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\\r\\n\"  \\\n\"R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\\r\\n\"  \\\n\"KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\\r\\n\"  \\\n\"gZUwgZIwHQYDVR0OBBYEFLRa5KWz3tJS9rnVppUP6z68x/3/MGMGA1UdIwRcMFqA\\r\\n\"  \\\n\"FLRa5KWz3tJS9rnVppUP6z68x/3/oT+kPTA7MQswCQYDVQQGEwJOTDERMA8GA1UE\\r\\n\"  \\\n\"CgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0GCAQAwDAYDVR0T\\r\\n\"  \\\n\"BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAHK/HHrTZMnnVMpde1io+voAtql7j\\r\\n\"  \\\n\"4sRhLrjD7o3THtwRbDa2diCvpq0Sq23Ng2LMYoXsOxoL/RQK3iN7UKxV3MKPEr0w\\r\\n\"  \\\n\"XQS+kKQqiT2bsfrjnWMVHZtUOMpm6FNqcdGm/Rss3vKda2lcKl8kUnq/ylc1+QbB\\r\\n\"  \\\n\"G6A6tUvQcr2ZyWfVg+mM5XkhTrOOXus2OLikb4WwEtJTJRNE0f+yPODSUz0/vT57\\r\\n\"  \\\n\"ApH0CnB80bYJshYHPHHymOtleAB8KSYtqm75g/YNobjnjB6cm4HkW3OZRVIl6fYY\\r\\n\"  \\\n\"n20NRVA1Vjs6GAROr4NqW4k/+LofY9y0LLDE+p0oIEKXIsIvhPr39swxSA==\\r\\n\"      \\\n\"-----END CERTIFICATE-----\\r\\n\"\n\nconst char   mbedtls_test_ca_crt_rsa[]   = TEST_CA_CRT_RSA_SHA256;\nconst size_t mbedtls_test_ca_crt_rsa_len = sizeof( mbedtls_test_ca_crt_rsa );\n#define TEST_CA_CRT_RSA_SOME\n\nstatic const char mbedtls_test_ca_crt_rsa_sha256[] = TEST_CA_CRT_RSA_SHA256;\n\n#endif\n\n#if !defined(TEST_CA_CRT_RSA_SOME) || defined(MBEDTLS_SHA1_C)\n#define TEST_CA_CRT_RSA_SHA1                                            \\\n\"-----BEGIN CERTIFICATE-----\\r\\n\"                                       \\\n\"MIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\\r\\n\"  \\\n\"MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\\r\\n\"  \\\n\"MTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\\r\\n\"  \\\n\"A1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\\r\\n\"  \\\n\"CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\\r\\n\"  \\\n\"mdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\\r\\n\"  \\\n\"50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\\r\\n\"  \\\n\"YMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\\r\\n\"  \\\n\"R7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\\r\\n\"  \\\n\"KNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\\r\\n\"  \\\n\"gZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH\\r\\n\"  \\\n\"/f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV\\r\\n\"  \\\n\"BAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz\\r\\n\"  \\\n\"dCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ\\r\\n\"  \\\n\"SsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H\\r\\n\"  \\\n\"DBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF\\r\\n\"  \\\n\"pjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf\\r\\n\"  \\\n\"m/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ\\r\\n\"  \\\n\"7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA==\\r\\n\"      \\\n\"-----END CERTIFICATE-----\\r\\n\"\n\n#if !defined (TEST_CA_CRT_RSA_SOME)\nconst char   mbedtls_test_ca_crt_rsa[]   = TEST_CA_CRT_RSA_SHA1;\nconst size_t mbedtls_test_ca_crt_rsa_len = sizeof( mbedtls_test_ca_crt_rsa );\n#endif\n\nstatic const char mbedtls_test_ca_crt_rsa_sha1[] = TEST_CA_CRT_RSA_SHA1;\n\n#endif\n\nconst char mbedtls_test_ca_key_rsa[] =\n\"-----BEGIN RSA PRIVATE KEY-----\\r\\n\"\n\"Proc-Type: 4,ENCRYPTED\\r\\n\"\n\"DEK-Info: DES-EDE3-CBC,A8A95B05D5B7206B\\r\\n\"\n\"\\r\\n\"\n\"9Qd9GeArejl1GDVh2lLV1bHt0cPtfbh5h/5zVpAVaFpqtSPMrElp50Rntn9et+JA\\r\\n\"\n\"7VOyboR+Iy2t/HU4WvA687k3Bppe9GwKHjHhtl//8xFKwZr3Xb5yO5JUP8AUctQq\\r\\n\"\n\"Nb8CLlZyuUC+52REAAthdWgsX+7dJO4yabzUcQ22Tp9JSD0hiL43BlkWYUNK3dAo\\r\\n\"\n\"PZlmiptjnzVTjg1MxsBSydZinWOLBV8/JQgxSPo2yD4uEfig28qbvQ2wNIn0pnAb\\r\\n\"\n\"GxnSAOazkongEGfvcjIIs+LZN9gXFhxcOh6kc4Q/c99B7QWETwLLkYgZ+z1a9VY9\\r\\n\"\n\"gEU7CwCxYCD+h9hY6FPmsK0/lC4O7aeRKpYq00rPPxs6i7phiexg6ax6yTMmArQq\\r\\n\"\n\"QmK3TAsJm8V/J5AWpLEV6jAFgRGymGGHnof0DXzVWZidrcZJWTNuGEX90nB3ee2w\\r\\n\"\n\"PXJEFWKoD3K3aFcSLdHYr3mLGxP7H9ThQai9VsycxZKS5kwvBKQ//YMrmFfwPk8x\\r\\n\"\n\"vTeY4KZMaUrveEel5tWZC94RSMKgxR6cyE1nBXyTQnDOGbfpNNgBKxyKbINWoOJU\\r\\n\"\n\"WJZAwlsQn+QzCDwpri7+sV1mS3gBE6UY7aQmnmiiaC2V3Hbphxct/en5QsfDOt1X\\r\\n\"\n\"JczSfpRWLlbPznZg8OQh/VgCMA58N5DjOzTIK7sJJ5r+94ZBTCpgAMbF588f0NTR\\r\\n\"\n\"KCe4yrxGJR7X02M4nvD4IwOlpsQ8xQxZtOSgXv4LkxvdU9XJJKWZ/XNKJeWztxSe\\r\\n\"\n\"Z1vdTc2YfsDBA2SEv33vxHx2g1vqtw8SjDRT2RaQSS0QuSaMJimdOX6mTOCBKk1J\\r\\n\"\n\"9Q5mXTrER+/LnK0jEmXsBXWA5bqqVZIyahXSx4VYZ7l7w/PHiUDtDgyRhMMKi4n2\\r\\n\"\n\"iQvQcWSQTjrpnlJbca1/DkpRt3YwrvJwdqb8asZU2VrNETh5x0QVefDRLFiVpif/\\r\\n\"\n\"tUaeAe/P1F8OkS7OIZDs1SUbv/sD2vMbhNkUoCms3/PvNtdnvgL4F0zhaDpKCmlT\\r\\n\"\n\"P8vx49E7v5CyRNmED9zZg4o3wmMqrQO93PtTug3Eu9oVx1zPQM1NVMyBa2+f29DL\\r\\n\"\n\"1nuTCeXdo9+ni45xx+jAI4DCwrRdhJ9uzZyC6962H37H6D+5naNvClFR1s6li1Gb\\r\\n\"\n\"nqPoiy/OBsEx9CaDGcqQBp5Wme/3XW+6z1ISOx+igwNTVCT14mHdBMbya0eIKft5\\r\\n\"\n\"X+GnwtgEMyCYyyWuUct8g4RzErcY9+yW9Om5Hzpx4zOuW4NPZgPDTgK+t2RSL/Yq\\r\\n\"\n\"rE1njrgeGYcVeG3f+OftH4s6fPbq7t1A5ZgUscbLMBqr9tK+OqygR4EgKBPsH6Cz\\r\\n\"\n\"L6zlv/2RV0qAHvVuDJcIDIgwY5rJtINEm32rhOeFNJwZS5MNIC1czXZx5//ugX7l\\r\\n\"\n\"I4sy5nbVhwSjtAk8Xg5dZbdTZ6mIrb7xqH+fdakZor1khG7bC2uIwibD3cSl2XkR\\r\\n\"\n\"wN48lslbHnqqagr6Xm1nNOSVl8C/6kbJEsMpLhAezfRtGwvOucoaE+WbeUNolGde\\r\\n\"\n\"P/eQiddSf0brnpiLJRh7qZrl9XuqYdpUqnoEdMAfotDOID8OtV7gt8a48ad8VPW2\\r\\n\"\n\"-----END RSA PRIVATE KEY-----\\r\\n\";\nconst size_t mbedtls_test_ca_key_rsa_len = sizeof( mbedtls_test_ca_key_rsa );\n\nconst char mbedtls_test_ca_pwd_rsa[] = \"PolarSSLTest\";\nconst size_t mbedtls_test_ca_pwd_rsa_len = sizeof( mbedtls_test_ca_pwd_rsa ) - 1;\n\nconst char mbedtls_test_srv_crt_rsa[] =\n\"-----BEGIN CERTIFICATE-----\\r\\n\"\n\"MIIDNzCCAh+gAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\\r\\n\"\n\"MA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\\r\\n\"\n\"MTEwMjEyMTQ0NDA2WhcNMjEwMjEyMTQ0NDA2WjA0MQswCQYDVQQGEwJOTDERMA8G\\r\\n\"\n\"A1UEChMIUG9sYXJTU0wxEjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcN\\r\\n\"\n\"AQEBBQADggEPADCCAQoCggEBAMFNo93nzR3RBNdJcriZrA545Do8Ss86ExbQWuTN\\r\\n\"\n\"owCIp+4ea5anUrSQ7y1yej4kmvy2NKwk9XfgJmSMnLAofaHa6ozmyRyWvP7BBFKz\\r\\n\"\n\"NtSj+uGxdtiQwWG0ZlI2oiZTqqt0Xgd9GYLbKtgfoNkNHC1JZvdbJXNG6AuKT2kM\\r\\n\"\n\"tQCQ4dqCEGZ9rlQri2V5kaHiYcPNQEkI7mgM8YuG0ka/0LiqEQMef1aoGh5EGA8P\\r\\n\"\n\"hYvai0Re4hjGYi/HZo36Xdh98yeJKQHFkA4/J/EwyEoO79bex8cna8cFPXrEAjya\\r\\n\"\n\"HT4P6DSYW8tzS1KW2BGiLICIaTla0w+w3lkvEcf36hIBMJcCAwEAAaNNMEswCQYD\\r\\n\"\n\"VR0TBAIwADAdBgNVHQ4EFgQUpQXoZLjc32APUBJNYKhkr02LQ5MwHwYDVR0jBBgw\\r\\n\"\n\"FoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQADggEBAJxnXClY\\r\\n\"\n\"oHkbp70cqBrsGXLybA74czbO5RdLEgFs7rHVS9r+c293luS/KdliLScZqAzYVylw\\r\\n\"\n\"UfRWvKMoWhHYKp3dEIS4xTXk6/5zXxhv9Rw8SGc8qn6vITHk1S1mPevtekgasY5Y\\r\\n\"\n\"iWQuM3h4YVlRH3HHEMAD1TnAexfXHHDFQGe+Bd1iAbz1/sH9H8l4StwX6egvTK3M\\r\\n\"\n\"wXRwkKkvjKaEDA9ATbZx0mI8LGsxSuCqe9r9dyjmttd47J1p1Rulz3CLzaRcVIuS\\r\\n\"\n\"RRQfaD8neM9c1S/iJ/amTVqJxA1KOdOS5780WhPfSArA+g4qAmSjelc3p4wWpha8\\r\\n\"\n\"zhuYwjVuX6JHG0c=\\r\\n\"\n\"-----END CERTIFICATE-----\\r\\n\";\nconst size_t mbedtls_test_srv_crt_rsa_len = sizeof( mbedtls_test_srv_crt_rsa );\n\nconst char mbedtls_test_srv_key_rsa[] =\n\"-----BEGIN RSA PRIVATE KEY-----\\r\\n\"\n\"MIIEpAIBAAKCAQEAwU2j3efNHdEE10lyuJmsDnjkOjxKzzoTFtBa5M2jAIin7h5r\\r\\n\"\n\"lqdStJDvLXJ6PiSa/LY0rCT1d+AmZIycsCh9odrqjObJHJa8/sEEUrM21KP64bF2\\r\\n\"\n\"2JDBYbRmUjaiJlOqq3ReB30Zgtsq2B+g2Q0cLUlm91slc0boC4pPaQy1AJDh2oIQ\\r\\n\"\n\"Zn2uVCuLZXmRoeJhw81ASQjuaAzxi4bSRr/QuKoRAx5/VqgaHkQYDw+Fi9qLRF7i\\r\\n\"\n\"GMZiL8dmjfpd2H3zJ4kpAcWQDj8n8TDISg7v1t7HxydrxwU9esQCPJodPg/oNJhb\\r\\n\"\n\"y3NLUpbYEaIsgIhpOVrTD7DeWS8Rx/fqEgEwlwIDAQABAoIBAQCXR0S8EIHFGORZ\\r\\n\"\n\"++AtOg6eENxD+xVs0f1IeGz57Tjo3QnXX7VBZNdj+p1ECvhCE/G7XnkgU5hLZX+G\\r\\n\"\n\"Z0jkz/tqJOI0vRSdLBbipHnWouyBQ4e/A1yIJdlBtqXxJ1KE/ituHRbNc4j4kL8Z\\r\\n\"\n\"/r6pvwnTI0PSx2Eqs048YdS92LT6qAv4flbNDxMn2uY7s4ycS4Q8w1JXnCeaAnYm\\r\\n\"\n\"WYI5wxO+bvRELR2Mcz5DmVnL8jRyml6l6582bSv5oufReFIbyPZbQWlXgYnpu6He\\r\\n\"\n\"GTc7E1zKYQGG/9+DQUl/1vQuCPqQwny0tQoX2w5tdYpdMdVm+zkLtbajzdTviJJa\\r\\n\"\n\"TWzL6lt5AoGBAN86+SVeJDcmQJcv4Eq6UhtRr4QGMiQMz0Sod6ettYxYzMgxtw28\\r\\n\"\n\"CIrgpozCc+UaZJLo7UxvC6an85r1b2nKPCLQFaggJ0H4Q0J/sZOhBIXaoBzWxveK\\r\\n\"\n\"nupceKdVxGsFi8CDy86DBfiyFivfBj+47BbaQzPBj7C4rK7UlLjab2rDAoGBAN2u\\r\\n\"\n\"AM2gchoFiu4v1HFL8D7lweEpi6ZnMJjnEu/dEgGQJFjwdpLnPbsj4c75odQ4Gz8g\\r\\n\"\n\"sw9lao9VVzbusoRE/JGI4aTdO0pATXyG7eG1Qu+5Yc1YGXcCrliA2xM9xx+d7f+s\\r\\n\"\n\"mPzN+WIEg5GJDYZDjAzHG5BNvi/FfM1C9dOtjv2dAoGAF0t5KmwbjWHBhcVqO4Ic\\r\\n\"\n\"BVvN3BIlc1ue2YRXEDlxY5b0r8N4XceMgKmW18OHApZxfl8uPDauWZLXOgl4uepv\\r\\n\"\n\"whZC3EuWrSyyICNhLY21Ah7hbIEBPF3L3ZsOwC+UErL+dXWLdB56Jgy3gZaBeW7b\\r\\n\"\n\"vDrEnocJbqCm7IukhXHOBK8CgYEAwqdHB0hqyNSzIOGY7v9abzB6pUdA3BZiQvEs\\r\\n\"\n\"3LjHVd4HPJ2x0N8CgrBIWOE0q8+0hSMmeE96WW/7jD3fPWwCR5zlXknxBQsfv0gP\\r\\n\"\n\"3BC5PR0Qdypz+d+9zfMf625kyit4T/hzwhDveZUzHnk1Cf+IG7Q+TOEnLnWAWBED\\r\\n\"\n\"ISOWmrUCgYAFEmRxgwAc/u+D6t0syCwAYh6POtscq9Y0i9GyWk89NzgC4NdwwbBH\\r\\n\"\n\"4AgahOxIxXx2gxJnq3yfkJfIjwf0s2DyP0kY2y6Ua1OeomPeY9mrIS4tCuDQ6LrE\\r\\n\"\n\"TB6l9VGoxJL4fyHnZb8L5gGvnB1bbD8cL6YPaDiOhcRseC9vBiEuVg==\\r\\n\"\n\"-----END RSA PRIVATE KEY-----\\r\\n\";\nconst size_t mbedtls_test_srv_key_rsa_len = sizeof( mbedtls_test_srv_key_rsa );\n\nconst char mbedtls_test_cli_crt_rsa[] =\n\"-----BEGIN CERTIFICATE-----\\r\\n\"\n\"MIIDhTCCAm2gAwIBAgIBBDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\\r\\n\"\n\"MA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\\r\\n\"\n\"MTcwNTA1MTMwNzU5WhcNMjcwNTA2MTMwNzU5WjA8MQswCQYDVQQGEwJOTDERMA8G\\r\\n\"\n\"A1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN\\r\\n\"\n\"BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f\\r\\n\"\n\"M60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu\\r\\n\"\n\"1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw\\r\\n\"\n\"MjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v\\r\\n\"\n\"4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/\\r\\n\"\n\"/DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB\\r\\n\"\n\"o4GSMIGPMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITBjBgNVHSMEXDBa\\r\\n\"\n\"gBS0WuSls97SUva51aaVD+s+vMf9/6E/pD0wOzELMAkGA1UEBhMCTkwxETAPBgNV\\r\\n\"\n\"BAoMCFBvbGFyU1NMMRkwFwYDVQQDDBBQb2xhclNTTCBUZXN0IENBggEAMAkGA1Ud\\r\\n\"\n\"EwQCMAAwDQYJKoZIhvcNAQELBQADggEBAC7yO786NvcHpK8UovKIG9cB32oSQQom\\r\\n\"\n\"LoR0eHDRzdqEkoq7yGZufHFiRAAzbMqJfogRtxlrWAeB4y/jGaMBV25IbFOIcH2W\\r\\n\"\n\"iCEaMMbG+VQLKNvuC63kmw/Zewc9ThM6Pa1Hcy0axT0faf1B/U01j0FIcw/6mTfK\\r\\n\"\n\"D8w48OIwc1yr0JtutCVjig5DC0yznGMt32RyseOLcUe+lfq005v2PAiCozr5X8rE\\r\\n\"\n\"ofGZpiM2NqRPePgYy+Vc75Zk28xkRQq1ncprgQb3S4vTsZdScpM9hLf+eMlrgqlj\\r\\n\"\n\"c5PLSkXBeLE5+fedkyfTaLxxQlgCpuoOhKBm04/R1pWNzUHyqagjO9Q=\\r\\n\"\n\"-----END CERTIFICATE-----\\r\\n\";\nconst size_t mbedtls_test_cli_crt_rsa_len = sizeof( mbedtls_test_cli_crt_rsa );\n\nconst char mbedtls_test_cli_key_rsa[] =\n\"-----BEGIN RSA PRIVATE KEY-----\\r\\n\"\n\"MIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF\\r\\n\"\n\"B9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1\\r\\n\"\n\"bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9\\r\\n\"\n\"Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH\\r\\n\"\n\"7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v\\r\\n\"\n\"dqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst\\r\\n\"\n\"yhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz\\r\\n\"\n\"4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt\\r\\n\"\n\"ymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA\\r\\n\"\n\"zCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d\\r\\n\"\n\"l5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf\\r\\n\"\n\"DFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT\\r\\n\"\n\"VPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL\\r\\n\"\n\"Ze2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7\\r\\n\"\n\"wzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys\\r\\n\"\n\"c176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi\\r\\n\"\n\"33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60\\r\\n\"\n\"ZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0\\r\\n\"\n\"BxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW\\r\\n\"\n\"KZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+\\r\\n\"\n\"UeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc\\r\\n\"\n\"7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq\\r\\n\"\n\"gxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu\\r\\n\"\n\"bHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv\\r\\n\"\n\"8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA==\\r\\n\"\n\"-----END RSA PRIVATE KEY-----\\r\\n\";\nconst size_t mbedtls_test_cli_key_rsa_len = sizeof( mbedtls_test_cli_key_rsa );\n#endif /* MBEDTLS_RSA_C */\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n/* Concatenation of all available CA certificates */\nconst char mbedtls_test_cas_pem[] =\n#ifdef TEST_CA_CRT_RSA_SHA1\n    TEST_CA_CRT_RSA_SHA1\n#endif\n#ifdef TEST_CA_CRT_RSA_SHA256\n    TEST_CA_CRT_RSA_SHA256\n#endif\n#ifdef TEST_CA_CRT_EC\n    TEST_CA_CRT_EC\n#endif\n    \"\";\nconst size_t mbedtls_test_cas_pem_len = sizeof( mbedtls_test_cas_pem );\n#endif\n\n/* List of all available CA certificates */\nconst char * mbedtls_test_cas[] = {\n#if defined(TEST_CA_CRT_RSA_SHA1)\n    mbedtls_test_ca_crt_rsa_sha1,\n#endif\n#if defined(TEST_CA_CRT_RSA_SHA256)\n    mbedtls_test_ca_crt_rsa_sha256,\n#endif\n#if defined(MBEDTLS_ECDSA_C)\n    mbedtls_test_ca_crt_ec,\n#endif\n    NULL\n};\nconst size_t mbedtls_test_cas_len[] = {\n#if defined(TEST_CA_CRT_RSA_SHA1)\n    sizeof( mbedtls_test_ca_crt_rsa_sha1 ),\n#endif\n#if defined(TEST_CA_CRT_RSA_SHA256)\n    sizeof( mbedtls_test_ca_crt_rsa_sha256 ),\n#endif\n#if defined(MBEDTLS_ECDSA_C)\n    sizeof( mbedtls_test_ca_crt_ec ),\n#endif\n    0\n};\n\n#if defined(MBEDTLS_RSA_C)\nconst char *mbedtls_test_ca_crt  = mbedtls_test_ca_crt_rsa; /* SHA1 or SHA256 */\nconst char *mbedtls_test_ca_key  = mbedtls_test_ca_key_rsa;\nconst char *mbedtls_test_ca_pwd  = mbedtls_test_ca_pwd_rsa;\nconst char *mbedtls_test_srv_crt = mbedtls_test_srv_crt_rsa;\nconst char *mbedtls_test_srv_key = mbedtls_test_srv_key_rsa;\nconst char *mbedtls_test_cli_crt = mbedtls_test_cli_crt_rsa;\nconst char *mbedtls_test_cli_key = mbedtls_test_cli_key_rsa;\nconst size_t mbedtls_test_ca_crt_len  = sizeof( mbedtls_test_ca_crt_rsa );\nconst size_t mbedtls_test_ca_key_len  = sizeof( mbedtls_test_ca_key_rsa );\nconst size_t mbedtls_test_ca_pwd_len  = sizeof( mbedtls_test_ca_pwd_rsa ) - 1;\nconst size_t mbedtls_test_srv_crt_len = sizeof( mbedtls_test_srv_crt_rsa );\nconst size_t mbedtls_test_srv_key_len = sizeof( mbedtls_test_srv_key_rsa );\nconst size_t mbedtls_test_cli_crt_len = sizeof( mbedtls_test_cli_crt_rsa );\nconst size_t mbedtls_test_cli_key_len = sizeof( mbedtls_test_cli_key_rsa );\n#else /* ! MBEDTLS_RSA_C, so MBEDTLS_ECDSA_C */\nconst char *mbedtls_test_ca_crt  = mbedtls_test_ca_crt_ec;\nconst char *mbedtls_test_ca_key  = mbedtls_test_ca_key_ec;\nconst char *mbedtls_test_ca_pwd  = mbedtls_test_ca_pwd_ec;\nconst char *mbedtls_test_srv_crt = mbedtls_test_srv_crt_ec;\nconst char *mbedtls_test_srv_key = mbedtls_test_srv_key_ec;\nconst char *mbedtls_test_cli_crt = mbedtls_test_cli_crt_ec;\nconst char *mbedtls_test_cli_key = mbedtls_test_cli_key_ec;\nconst size_t mbedtls_test_ca_crt_len  = sizeof( mbedtls_test_ca_crt_ec );\nconst size_t mbedtls_test_ca_key_len  = sizeof( mbedtls_test_ca_key_ec );\nconst size_t mbedtls_test_ca_pwd_len  = sizeof( mbedtls_test_ca_pwd_ec ) - 1;\nconst size_t mbedtls_test_srv_crt_len = sizeof( mbedtls_test_srv_crt_ec );\nconst size_t mbedtls_test_srv_key_len = sizeof( mbedtls_test_srv_key_ec );\nconst size_t mbedtls_test_cli_crt_len = sizeof( mbedtls_test_cli_crt_ec );\nconst size_t mbedtls_test_cli_key_len = sizeof( mbedtls_test_cli_key_ec );\n#endif /* MBEDTLS_RSA_C */\n\n#endif /* MBEDTLS_CERTS_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/cipher.c",
    "content": "/**\n * \\file cipher.c\n *\n * \\brief Generic cipher wrapper for mbed TLS\n *\n * \\author Adriaan de Jong <dejong@fox-it.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_CIPHER_C)\n\n#include \"mbedtls/cipher.h\"\n#include \"mbedtls/cipher_internal.h\"\n\n#include <stdlib.h>\n#include <string.h>\n\n#if defined(MBEDTLS_GCM_C)\n#include \"mbedtls/gcm.h\"\n#endif\n\n#if defined(MBEDTLS_CCM_C)\n#include \"mbedtls/ccm.h\"\n#endif\n\n#if defined(MBEDTLS_CMAC_C)\n#include \"mbedtls/cmac.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#define mbedtls_calloc calloc\n#define mbedtls_free   free\n#endif\n\n#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER)\n#define MBEDTLS_CIPHER_MODE_STREAM\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\nstatic int supported_init = 0;\n\nconst int *mbedtls_cipher_list( void )\n{\n    const mbedtls_cipher_definition_t *def;\n    int *type;\n\n    if( ! supported_init )\n    {\n        def = mbedtls_cipher_definitions;\n        type = mbedtls_cipher_supported;\n\n        while( def->type != 0 )\n            *type++ = (*def++).type;\n\n        *type = 0;\n\n        supported_init = 1;\n    }\n\n    return( mbedtls_cipher_supported );\n}\n\nconst mbedtls_cipher_info_t *mbedtls_cipher_info_from_type( const mbedtls_cipher_type_t cipher_type )\n{\n    const mbedtls_cipher_definition_t *def;\n\n    for( def = mbedtls_cipher_definitions; def->info != NULL; def++ )\n        if( def->type == cipher_type )\n            return( def->info );\n\n    return( NULL );\n}\n\nconst mbedtls_cipher_info_t *mbedtls_cipher_info_from_string( const char *cipher_name )\n{\n    const mbedtls_cipher_definition_t *def;\n\n    if( NULL == cipher_name )\n        return( NULL );\n\n    for( def = mbedtls_cipher_definitions; def->info != NULL; def++ )\n        if( !  strcmp( def->info->name, cipher_name ) )\n            return( def->info );\n\n    return( NULL );\n}\n\nconst mbedtls_cipher_info_t *mbedtls_cipher_info_from_values( const mbedtls_cipher_id_t cipher_id,\n                                              int key_bitlen,\n                                              const mbedtls_cipher_mode_t mode )\n{\n    const mbedtls_cipher_definition_t *def;\n\n    for( def = mbedtls_cipher_definitions; def->info != NULL; def++ )\n        if( def->info->base->cipher == cipher_id &&\n            def->info->key_bitlen == (unsigned) key_bitlen &&\n            def->info->mode == mode )\n            return( def->info );\n\n    return( NULL );\n}\n\nvoid mbedtls_cipher_init( mbedtls_cipher_context_t *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_cipher_context_t ) );\n}\n\nvoid mbedtls_cipher_free( mbedtls_cipher_context_t *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n#if defined(MBEDTLS_CMAC_C)\n    if( ctx->cmac_ctx )\n    {\n       mbedtls_zeroize( ctx->cmac_ctx, sizeof( mbedtls_cmac_context_t ) );\n       mbedtls_free( ctx->cmac_ctx );\n    }\n#endif\n\n    if( ctx->cipher_ctx )\n        ctx->cipher_info->base->ctx_free_func( ctx->cipher_ctx );\n\n    mbedtls_zeroize( ctx, sizeof(mbedtls_cipher_context_t) );\n}\n\nint mbedtls_cipher_setup( mbedtls_cipher_context_t *ctx, const mbedtls_cipher_info_t *cipher_info )\n{\n    if( NULL == cipher_info || NULL == ctx )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    memset( ctx, 0, sizeof( mbedtls_cipher_context_t ) );\n\n    if( NULL == ( ctx->cipher_ctx = cipher_info->base->ctx_alloc_func() ) )\n        return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED );\n\n    ctx->cipher_info = cipher_info;\n\n#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)\n    /*\n     * Ignore possible errors caused by a cipher mode that doesn't use padding\n     */\n#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)\n    (void) mbedtls_cipher_set_padding_mode( ctx, MBEDTLS_PADDING_PKCS7 );\n#else\n    (void) mbedtls_cipher_set_padding_mode( ctx, MBEDTLS_PADDING_NONE );\n#endif\n#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */\n\n    return( 0 );\n}\n\nint mbedtls_cipher_setkey( mbedtls_cipher_context_t *ctx, const unsigned char *key,\n        int key_bitlen, const mbedtls_operation_t operation )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    if( ( ctx->cipher_info->flags & MBEDTLS_CIPHER_VARIABLE_KEY_LEN ) == 0 &&\n        (int) ctx->cipher_info->key_bitlen != key_bitlen )\n    {\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n    }\n\n    ctx->key_bitlen = key_bitlen;\n    ctx->operation = operation;\n\n    /*\n     * For CFB and CTR mode always use the encryption key schedule\n     */\n    if( MBEDTLS_ENCRYPT == operation ||\n        MBEDTLS_MODE_CFB == ctx->cipher_info->mode ||\n        MBEDTLS_MODE_CTR == ctx->cipher_info->mode )\n    {\n        return ctx->cipher_info->base->setkey_enc_func( ctx->cipher_ctx, key,\n                ctx->key_bitlen );\n    }\n\n    if( MBEDTLS_DECRYPT == operation )\n        return ctx->cipher_info->base->setkey_dec_func( ctx->cipher_ctx, key,\n                ctx->key_bitlen );\n\n    return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n}\n\nint mbedtls_cipher_set_iv( mbedtls_cipher_context_t *ctx,\n                   const unsigned char *iv, size_t iv_len )\n{\n    size_t actual_iv_size;\n\n    if( NULL == ctx || NULL == ctx->cipher_info || NULL == iv )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    /* avoid buffer overflow in ctx->iv */\n    if( iv_len > MBEDTLS_MAX_IV_LENGTH )\n        return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );\n\n    if( ( ctx->cipher_info->flags & MBEDTLS_CIPHER_VARIABLE_IV_LEN ) != 0 )\n        actual_iv_size = iv_len;\n    else\n    {\n        actual_iv_size = ctx->cipher_info->iv_size;\n\n        /* avoid reading past the end of input buffer */\n        if( actual_iv_size > iv_len )\n            return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n    }\n\n    memcpy( ctx->iv, iv, actual_iv_size );\n    ctx->iv_size = actual_iv_size;\n\n    return( 0 );\n}\n\nint mbedtls_cipher_reset( mbedtls_cipher_context_t *ctx )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    ctx->unprocessed_len = 0;\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_GCM_C)\nint mbedtls_cipher_update_ad( mbedtls_cipher_context_t *ctx,\n                      const unsigned char *ad, size_t ad_len )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode )\n    {\n        return mbedtls_gcm_starts( (mbedtls_gcm_context *) ctx->cipher_ctx, ctx->operation,\n                           ctx->iv, ctx->iv_size, ad, ad_len );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_GCM_C */\n\nint mbedtls_cipher_update( mbedtls_cipher_context_t *ctx, const unsigned char *input,\n                   size_t ilen, unsigned char *output, size_t *olen )\n{\n    int ret;\n    size_t block_size = 0;\n\n    if( NULL == ctx || NULL == ctx->cipher_info || NULL == olen )\n    {\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n    }\n\n    *olen = 0;\n    block_size = mbedtls_cipher_get_block_size( ctx );\n\n    if( ctx->cipher_info->mode == MBEDTLS_MODE_ECB )\n    {\n        if( ilen != block_size )\n            return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );\n\n        *olen = ilen;\n\n        if( 0 != ( ret = ctx->cipher_info->base->ecb_func( ctx->cipher_ctx,\n                    ctx->operation, input, output ) ) )\n        {\n            return( ret );\n        }\n\n        return( 0 );\n    }\n\n#if defined(MBEDTLS_GCM_C)\n    if( ctx->cipher_info->mode == MBEDTLS_MODE_GCM )\n    {\n        *olen = ilen;\n        return mbedtls_gcm_update( (mbedtls_gcm_context *) ctx->cipher_ctx, ilen, input,\n                           output );\n    }\n#endif\n\n    if ( 0 == block_size )\n    {\n        return MBEDTLS_ERR_CIPHER_INVALID_CONTEXT;\n    }\n\n    if( input == output &&\n       ( ctx->unprocessed_len != 0 || ilen % block_size ) )\n    {\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n    }\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    if( ctx->cipher_info->mode == MBEDTLS_MODE_CBC )\n    {\n        size_t copy_len = 0;\n\n        /*\n         * If there is not enough data for a full block, cache it.\n         */\n        if( ( ctx->operation == MBEDTLS_DECRYPT &&\n                ilen <= block_size - ctx->unprocessed_len ) ||\n             ( ctx->operation == MBEDTLS_ENCRYPT &&\n                ilen < block_size - ctx->unprocessed_len ) )\n        {\n            memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input,\n                    ilen );\n\n            ctx->unprocessed_len += ilen;\n            return( 0 );\n        }\n\n        /*\n         * Process cached data first\n         */\n        if( 0 != ctx->unprocessed_len )\n        {\n            copy_len = block_size - ctx->unprocessed_len;\n\n            memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input,\n                    copy_len );\n\n            if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx,\n                    ctx->operation, block_size, ctx->iv,\n                    ctx->unprocessed_data, output ) ) )\n            {\n                return( ret );\n            }\n\n            *olen += block_size;\n            output += block_size;\n            ctx->unprocessed_len = 0;\n\n            input += copy_len;\n            ilen -= copy_len;\n        }\n\n        /*\n         * Cache final, incomplete block\n         */\n        if( 0 != ilen )\n        {\n            if( 0 == block_size )\n            {\n                return MBEDTLS_ERR_CIPHER_INVALID_CONTEXT;\n            }\n\n            copy_len = ilen % block_size;\n            if( copy_len == 0 && ctx->operation == MBEDTLS_DECRYPT )\n                copy_len = block_size;\n\n            memcpy( ctx->unprocessed_data, &( input[ilen - copy_len] ),\n                    copy_len );\n\n            ctx->unprocessed_len += copy_len;\n            ilen -= copy_len;\n        }\n\n        /*\n         * Process remaining full blocks\n         */\n        if( ilen )\n        {\n            if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx,\n                    ctx->operation, ilen, ctx->iv, input, output ) ) )\n            {\n                return( ret );\n            }\n\n            *olen += ilen;\n        }\n\n        return( 0 );\n    }\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    if( ctx->cipher_info->mode == MBEDTLS_MODE_CFB )\n    {\n        if( 0 != ( ret = ctx->cipher_info->base->cfb_func( ctx->cipher_ctx,\n                ctx->operation, ilen, &ctx->unprocessed_len, ctx->iv,\n                input, output ) ) )\n        {\n            return( ret );\n        }\n\n        *olen = ilen;\n\n        return( 0 );\n    }\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    if( ctx->cipher_info->mode == MBEDTLS_MODE_CTR )\n    {\n        if( 0 != ( ret = ctx->cipher_info->base->ctr_func( ctx->cipher_ctx,\n                ilen, &ctx->unprocessed_len, ctx->iv,\n                ctx->unprocessed_data, input, output ) ) )\n        {\n            return( ret );\n        }\n\n        *olen = ilen;\n\n        return( 0 );\n    }\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    if( ctx->cipher_info->mode == MBEDTLS_MODE_STREAM )\n    {\n        if( 0 != ( ret = ctx->cipher_info->base->stream_func( ctx->cipher_ctx,\n                                                    ilen, input, output ) ) )\n        {\n            return( ret );\n        }\n\n        *olen = ilen;\n\n        return( 0 );\n    }\n#endif /* MBEDTLS_CIPHER_MODE_STREAM */\n\n    return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)\n#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)\n/*\n * PKCS7 (and PKCS5) padding: fill with ll bytes, with ll = padding_len\n */\nstatic void add_pkcs_padding( unsigned char *output, size_t output_len,\n        size_t data_len )\n{\n    size_t padding_len = output_len - data_len;\n    unsigned char i;\n\n    for( i = 0; i < padding_len; i++ )\n        output[data_len + i] = (unsigned char) padding_len;\n}\n\nstatic int get_pkcs_padding( unsigned char *input, size_t input_len,\n        size_t *data_len )\n{\n    size_t i, pad_idx;\n    unsigned char padding_len, bad = 0;\n\n    if( NULL == input || NULL == data_len )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    padding_len = input[input_len - 1];\n    *data_len = input_len - padding_len;\n\n    /* Avoid logical || since it results in a branch */\n    bad |= padding_len > input_len;\n    bad |= padding_len == 0;\n\n    /* The number of bytes checked must be independent of padding_len,\n     * so pick input_len, which is usually 8 or 16 (one block) */\n    pad_idx = input_len - padding_len;\n    for( i = 0; i < input_len; i++ )\n        bad |= ( input[i] ^ padding_len ) * ( i >= pad_idx );\n\n    return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) );\n}\n#endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */\n\n#if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS)\n/*\n * One and zeros padding: fill with 80 00 ... 00\n */\nstatic void add_one_and_zeros_padding( unsigned char *output,\n                                       size_t output_len, size_t data_len )\n{\n    size_t padding_len = output_len - data_len;\n    unsigned char i = 0;\n\n    output[data_len] = 0x80;\n    for( i = 1; i < padding_len; i++ )\n        output[data_len + i] = 0x00;\n}\n\nstatic int get_one_and_zeros_padding( unsigned char *input, size_t input_len,\n                                      size_t *data_len )\n{\n    size_t i;\n    unsigned char done = 0, prev_done, bad;\n\n    if( NULL == input || NULL == data_len )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    bad = 0xFF;\n    *data_len = 0;\n    for( i = input_len; i > 0; i-- )\n    {\n        prev_done = done;\n        done |= ( input[i-1] != 0 );\n        *data_len |= ( i - 1 ) * ( done != prev_done );\n        bad &= ( input[i-1] ^ 0x80 ) | ( done == prev_done );\n    }\n\n    return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) );\n\n}\n#endif /* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */\n\n#if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN)\n/*\n * Zeros and len padding: fill with 00 ... 00 ll, where ll is padding length\n */\nstatic void add_zeros_and_len_padding( unsigned char *output,\n                                       size_t output_len, size_t data_len )\n{\n    size_t padding_len = output_len - data_len;\n    unsigned char i = 0;\n\n    for( i = 1; i < padding_len; i++ )\n        output[data_len + i - 1] = 0x00;\n    output[output_len - 1] = (unsigned char) padding_len;\n}\n\nstatic int get_zeros_and_len_padding( unsigned char *input, size_t input_len,\n                                      size_t *data_len )\n{\n    size_t i, pad_idx;\n    unsigned char padding_len, bad = 0;\n\n    if( NULL == input || NULL == data_len )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    padding_len = input[input_len - 1];\n    *data_len = input_len - padding_len;\n\n    /* Avoid logical || since it results in a branch */\n    bad |= padding_len > input_len;\n    bad |= padding_len == 0;\n\n    /* The number of bytes checked must be independent of padding_len */\n    pad_idx = input_len - padding_len;\n    for( i = 0; i < input_len - 1; i++ )\n        bad |= input[i] * ( i >= pad_idx );\n\n    return( MBEDTLS_ERR_CIPHER_INVALID_PADDING * ( bad != 0 ) );\n}\n#endif /* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */\n\n#if defined(MBEDTLS_CIPHER_PADDING_ZEROS)\n/*\n * Zero padding: fill with 00 ... 00\n */\nstatic void add_zeros_padding( unsigned char *output,\n                               size_t output_len, size_t data_len )\n{\n    size_t i;\n\n    for( i = data_len; i < output_len; i++ )\n        output[i] = 0x00;\n}\n\nstatic int get_zeros_padding( unsigned char *input, size_t input_len,\n                              size_t *data_len )\n{\n    size_t i;\n    unsigned char done = 0, prev_done;\n\n    if( NULL == input || NULL == data_len )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    *data_len = 0;\n    for( i = input_len; i > 0; i-- )\n    {\n        prev_done = done;\n        done |= ( input[i-1] != 0 );\n        *data_len |= i * ( done != prev_done );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_PADDING_ZEROS */\n\n/*\n * No padding: don't pad :)\n *\n * There is no add_padding function (check for NULL in mbedtls_cipher_finish)\n * but a trivial get_padding function\n */\nstatic int get_no_padding( unsigned char *input, size_t input_len,\n                              size_t *data_len )\n{\n    if( NULL == input || NULL == data_len )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    *data_len = input_len;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */\n\nint mbedtls_cipher_finish( mbedtls_cipher_context_t *ctx,\n                   unsigned char *output, size_t *olen )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info || NULL == olen )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    *olen = 0;\n\n    if( MBEDTLS_MODE_CFB == ctx->cipher_info->mode ||\n        MBEDTLS_MODE_CTR == ctx->cipher_info->mode ||\n        MBEDTLS_MODE_GCM == ctx->cipher_info->mode ||\n        MBEDTLS_MODE_STREAM == ctx->cipher_info->mode )\n    {\n        return( 0 );\n    }\n\n    if( MBEDTLS_MODE_ECB == ctx->cipher_info->mode )\n    {\n        if( ctx->unprocessed_len != 0 )\n            return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );\n\n        return( 0 );\n    }\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    if( MBEDTLS_MODE_CBC == ctx->cipher_info->mode )\n    {\n        int ret = 0;\n\n        if( MBEDTLS_ENCRYPT == ctx->operation )\n        {\n            /* check for 'no padding' mode */\n            if( NULL == ctx->add_padding )\n            {\n                if( 0 != ctx->unprocessed_len )\n                    return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );\n\n                return( 0 );\n            }\n\n            ctx->add_padding( ctx->unprocessed_data, mbedtls_cipher_get_iv_size( ctx ),\n                    ctx->unprocessed_len );\n        }\n        else if( mbedtls_cipher_get_block_size( ctx ) != ctx->unprocessed_len )\n        {\n            /*\n             * For decrypt operations, expect a full block,\n             * or an empty block if no padding\n             */\n            if( NULL == ctx->add_padding && 0 == ctx->unprocessed_len )\n                return( 0 );\n\n            return( MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED );\n        }\n\n        /* cipher block */\n        if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx,\n                ctx->operation, mbedtls_cipher_get_block_size( ctx ), ctx->iv,\n                ctx->unprocessed_data, output ) ) )\n        {\n            return( ret );\n        }\n\n        /* Set output size for decryption */\n        if( MBEDTLS_DECRYPT == ctx->operation )\n            return ctx->get_padding( output, mbedtls_cipher_get_block_size( ctx ),\n                                     olen );\n\n        /* Set output size for encryption */\n        *olen = mbedtls_cipher_get_block_size( ctx );\n        return( 0 );\n    }\n#else\n    ((void) output);\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n    return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_WITH_PADDING)\nint mbedtls_cipher_set_padding_mode( mbedtls_cipher_context_t *ctx, mbedtls_cipher_padding_t mode )\n{\n    if( NULL == ctx ||\n        MBEDTLS_MODE_CBC != ctx->cipher_info->mode )\n    {\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n    }\n\n    switch( mode )\n    {\n#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)\n    case MBEDTLS_PADDING_PKCS7:\n        ctx->add_padding = add_pkcs_padding;\n        ctx->get_padding = get_pkcs_padding;\n        break;\n#endif\n#if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS)\n    case MBEDTLS_PADDING_ONE_AND_ZEROS:\n        ctx->add_padding = add_one_and_zeros_padding;\n        ctx->get_padding = get_one_and_zeros_padding;\n        break;\n#endif\n#if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN)\n    case MBEDTLS_PADDING_ZEROS_AND_LEN:\n        ctx->add_padding = add_zeros_and_len_padding;\n        ctx->get_padding = get_zeros_and_len_padding;\n        break;\n#endif\n#if defined(MBEDTLS_CIPHER_PADDING_ZEROS)\n    case MBEDTLS_PADDING_ZEROS:\n        ctx->add_padding = add_zeros_padding;\n        ctx->get_padding = get_zeros_padding;\n        break;\n#endif\n    case MBEDTLS_PADDING_NONE:\n        ctx->add_padding = NULL;\n        ctx->get_padding = get_no_padding;\n        break;\n\n    default:\n        return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_WITH_PADDING */\n\n#if defined(MBEDTLS_GCM_C)\nint mbedtls_cipher_write_tag( mbedtls_cipher_context_t *ctx,\n                      unsigned char *tag, size_t tag_len )\n{\n    if( NULL == ctx || NULL == ctx->cipher_info || NULL == tag )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    if( MBEDTLS_ENCRYPT != ctx->operation )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode )\n        return mbedtls_gcm_finish( (mbedtls_gcm_context *) ctx->cipher_ctx, tag, tag_len );\n\n    return( 0 );\n}\n\nint mbedtls_cipher_check_tag( mbedtls_cipher_context_t *ctx,\n                      const unsigned char *tag, size_t tag_len )\n{\n    int ret;\n\n    if( NULL == ctx || NULL == ctx->cipher_info ||\n        MBEDTLS_DECRYPT != ctx->operation )\n    {\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n    }\n\n    if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode )\n    {\n        unsigned char check_tag[16];\n        size_t i;\n        int diff;\n\n        if( tag_len > sizeof( check_tag ) )\n            return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n        if( 0 != ( ret = mbedtls_gcm_finish( (mbedtls_gcm_context *) ctx->cipher_ctx,\n                                     check_tag, tag_len ) ) )\n        {\n            return( ret );\n        }\n\n        /* Check the tag in \"constant-time\" */\n        for( diff = 0, i = 0; i < tag_len; i++ )\n            diff |= tag[i] ^ check_tag[i];\n\n        if( diff != 0 )\n            return( MBEDTLS_ERR_CIPHER_AUTH_FAILED );\n\n        return( 0 );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_GCM_C */\n\n/*\n * Packet-oriented wrapper for non-AEAD modes\n */\nint mbedtls_cipher_crypt( mbedtls_cipher_context_t *ctx,\n                  const unsigned char *iv, size_t iv_len,\n                  const unsigned char *input, size_t ilen,\n                  unsigned char *output, size_t *olen )\n{\n    int ret;\n    size_t finish_olen;\n\n    if( ( ret = mbedtls_cipher_set_iv( ctx, iv, iv_len ) ) != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_cipher_reset( ctx ) ) != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_cipher_update( ctx, input, ilen, output, olen ) ) != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_cipher_finish( ctx, output + *olen, &finish_olen ) ) != 0 )\n        return( ret );\n\n    *olen += finish_olen;\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_AEAD)\n/*\n * Packet-oriented encryption for AEAD modes\n */\nint mbedtls_cipher_auth_encrypt( mbedtls_cipher_context_t *ctx,\n                         const unsigned char *iv, size_t iv_len,\n                         const unsigned char *ad, size_t ad_len,\n                         const unsigned char *input, size_t ilen,\n                         unsigned char *output, size_t *olen,\n                         unsigned char *tag, size_t tag_len )\n{\n#if defined(MBEDTLS_GCM_C)\n    if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode )\n    {\n        *olen = ilen;\n        return( mbedtls_gcm_crypt_and_tag( ctx->cipher_ctx, MBEDTLS_GCM_ENCRYPT, ilen,\n                                   iv, iv_len, ad, ad_len, input, output,\n                                   tag_len, tag ) );\n    }\n#endif /* MBEDTLS_GCM_C */\n#if defined(MBEDTLS_CCM_C)\n    if( MBEDTLS_MODE_CCM == ctx->cipher_info->mode )\n    {\n        *olen = ilen;\n        return( mbedtls_ccm_encrypt_and_tag( ctx->cipher_ctx, ilen,\n                                     iv, iv_len, ad, ad_len, input, output,\n                                     tag, tag_len ) );\n    }\n#endif /* MBEDTLS_CCM_C */\n\n    return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );\n}\n\n/*\n * Packet-oriented decryption for AEAD modes\n */\nint mbedtls_cipher_auth_decrypt( mbedtls_cipher_context_t *ctx,\n                         const unsigned char *iv, size_t iv_len,\n                         const unsigned char *ad, size_t ad_len,\n                         const unsigned char *input, size_t ilen,\n                         unsigned char *output, size_t *olen,\n                         const unsigned char *tag, size_t tag_len )\n{\n#if defined(MBEDTLS_GCM_C)\n    if( MBEDTLS_MODE_GCM == ctx->cipher_info->mode )\n    {\n        int ret;\n\n        *olen = ilen;\n        ret = mbedtls_gcm_auth_decrypt( ctx->cipher_ctx, ilen,\n                                iv, iv_len, ad, ad_len,\n                                tag, tag_len, input, output );\n\n        if( ret == MBEDTLS_ERR_GCM_AUTH_FAILED )\n            ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED;\n\n        return( ret );\n    }\n#endif /* MBEDTLS_GCM_C */\n#if defined(MBEDTLS_CCM_C)\n    if( MBEDTLS_MODE_CCM == ctx->cipher_info->mode )\n    {\n        int ret;\n\n        *olen = ilen;\n        ret = mbedtls_ccm_auth_decrypt( ctx->cipher_ctx, ilen,\n                                iv, iv_len, ad, ad_len,\n                                input, output, tag, tag_len );\n\n        if( ret == MBEDTLS_ERR_CCM_AUTH_FAILED )\n            ret = MBEDTLS_ERR_CIPHER_AUTH_FAILED;\n\n        return( ret );\n    }\n#endif /* MBEDTLS_CCM_C */\n\n    return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );\n}\n#endif /* MBEDTLS_CIPHER_MODE_AEAD */\n\n#endif /* MBEDTLS_CIPHER_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/cipher_wrap.c",
    "content": "/**\n * \\file cipher_wrap.c\n *\n * \\brief Generic cipher wrapper for mbed TLS\n *\n * \\author Adriaan de Jong <dejong@fox-it.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_CIPHER_C)\n\n#include \"mbedtls/cipher_internal.h\"\n\n#if defined(MBEDTLS_AES_C)\n#include \"mbedtls/aes.h\"\n#endif\n\n#if defined(MBEDTLS_ARC4_C)\n#include \"mbedtls/arc4.h\"\n#endif\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#include \"mbedtls/camellia.h\"\n#endif\n\n#if defined(MBEDTLS_DES_C)\n#include \"mbedtls/des.h\"\n#endif\n\n#if defined(MBEDTLS_BLOWFISH_C)\n#include \"mbedtls/blowfish.h\"\n#endif\n\n#if defined(MBEDTLS_GCM_C)\n#include \"mbedtls/gcm.h\"\n#endif\n\n#if defined(MBEDTLS_CCM_C)\n#include \"mbedtls/ccm.h\"\n#endif\n\n#if defined(MBEDTLS_CIPHER_NULL_CIPHER)\n#include <string.h>\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n#if defined(MBEDTLS_GCM_C)\n/* shared by all GCM ciphers */\nstatic void *gcm_ctx_alloc( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_gcm_context ) );\n\n    if( ctx != NULL )\n        mbedtls_gcm_init( (mbedtls_gcm_context *) ctx );\n\n    return( ctx );\n}\n\nstatic void gcm_ctx_free( void *ctx )\n{\n    mbedtls_gcm_free( ctx );\n    mbedtls_free( ctx );\n}\n#endif /* MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_CCM_C)\n/* shared by all CCM ciphers */\nstatic void *ccm_ctx_alloc( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ccm_context ) );\n\n    if( ctx != NULL )\n        mbedtls_ccm_init( (mbedtls_ccm_context *) ctx );\n\n    return( ctx );\n}\n\nstatic void ccm_ctx_free( void *ctx )\n{\n    mbedtls_ccm_free( ctx );\n    mbedtls_free( ctx );\n}\n#endif /* MBEDTLS_CCM_C */\n\n#if defined(MBEDTLS_AES_C)\n\nstatic int aes_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,\n        const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_aes_crypt_ecb( (mbedtls_aes_context *) ctx, operation, input, output );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic int aes_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,\n        unsigned char *iv, const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_aes_crypt_cbc( (mbedtls_aes_context *) ctx, operation, length, iv, input,\n                          output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\nstatic int aes_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,\n        size_t length, size_t *iv_off, unsigned char *iv,\n        const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_aes_crypt_cfb128( (mbedtls_aes_context *) ctx, operation, length, iv_off, iv,\n                             input, output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\nstatic int aes_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,\n        unsigned char *nonce_counter, unsigned char *stream_block,\n        const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_aes_crypt_ctr( (mbedtls_aes_context *) ctx, length, nc_off, nonce_counter,\n                          stream_block, input, output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\nstatic int aes_setkey_dec_wrap( void *ctx, const unsigned char *key,\n                                unsigned int key_bitlen )\n{\n    return mbedtls_aes_setkey_dec( (mbedtls_aes_context *) ctx, key, key_bitlen );\n}\n\nstatic int aes_setkey_enc_wrap( void *ctx, const unsigned char *key,\n                                unsigned int key_bitlen )\n{\n    return mbedtls_aes_setkey_enc( (mbedtls_aes_context *) ctx, key, key_bitlen );\n}\n\nstatic void * aes_ctx_alloc( void )\n{\n    mbedtls_aes_context *aes = mbedtls_calloc( 1, sizeof( mbedtls_aes_context ) );\n\n    if( aes == NULL )\n        return( NULL );\n\n    mbedtls_aes_init( aes );\n\n    return( aes );\n}\n\nstatic void aes_ctx_free( void *ctx )\n{\n    mbedtls_aes_free( (mbedtls_aes_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic const mbedtls_cipher_base_t aes_info = {\n    MBEDTLS_CIPHER_ID_AES,\n    aes_crypt_ecb_wrap,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    aes_crypt_cbc_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    aes_crypt_cfb128_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    aes_crypt_ctr_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    NULL,\n#endif\n    aes_setkey_enc_wrap,\n    aes_setkey_dec_wrap,\n    aes_ctx_alloc,\n    aes_ctx_free\n};\n\nstatic const mbedtls_cipher_info_t aes_128_ecb_info = {\n    MBEDTLS_CIPHER_AES_128_ECB,\n    MBEDTLS_MODE_ECB,\n    128,\n    \"AES-128-ECB\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_192_ecb_info = {\n    MBEDTLS_CIPHER_AES_192_ECB,\n    MBEDTLS_MODE_ECB,\n    192,\n    \"AES-192-ECB\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_256_ecb_info = {\n    MBEDTLS_CIPHER_AES_256_ECB,\n    MBEDTLS_MODE_ECB,\n    256,\n    \"AES-256-ECB\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic const mbedtls_cipher_info_t aes_128_cbc_info = {\n    MBEDTLS_CIPHER_AES_128_CBC,\n    MBEDTLS_MODE_CBC,\n    128,\n    \"AES-128-CBC\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_192_cbc_info = {\n    MBEDTLS_CIPHER_AES_192_CBC,\n    MBEDTLS_MODE_CBC,\n    192,\n    \"AES-192-CBC\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_256_cbc_info = {\n    MBEDTLS_CIPHER_AES_256_CBC,\n    MBEDTLS_MODE_CBC,\n    256,\n    \"AES-256-CBC\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\nstatic const mbedtls_cipher_info_t aes_128_cfb128_info = {\n    MBEDTLS_CIPHER_AES_128_CFB128,\n    MBEDTLS_MODE_CFB,\n    128,\n    \"AES-128-CFB128\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_192_cfb128_info = {\n    MBEDTLS_CIPHER_AES_192_CFB128,\n    MBEDTLS_MODE_CFB,\n    192,\n    \"AES-192-CFB128\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_256_cfb128_info = {\n    MBEDTLS_CIPHER_AES_256_CFB128,\n    MBEDTLS_MODE_CFB,\n    256,\n    \"AES-256-CFB128\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\nstatic const mbedtls_cipher_info_t aes_128_ctr_info = {\n    MBEDTLS_CIPHER_AES_128_CTR,\n    MBEDTLS_MODE_CTR,\n    128,\n    \"AES-128-CTR\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_192_ctr_info = {\n    MBEDTLS_CIPHER_AES_192_CTR,\n    MBEDTLS_MODE_CTR,\n    192,\n    \"AES-192-CTR\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_256_ctr_info = {\n    MBEDTLS_CIPHER_AES_256_CTR,\n    MBEDTLS_MODE_CTR,\n    256,\n    \"AES-256-CTR\",\n    16,\n    0,\n    16,\n    &aes_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n#if defined(MBEDTLS_GCM_C)\nstatic int gcm_aes_setkey_wrap( void *ctx, const unsigned char *key,\n                                unsigned int key_bitlen )\n{\n    return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_AES,\n                     key, key_bitlen );\n}\n\nstatic const mbedtls_cipher_base_t gcm_aes_info = {\n    MBEDTLS_CIPHER_ID_AES,\n    NULL,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    NULL,\n#endif\n    gcm_aes_setkey_wrap,\n    gcm_aes_setkey_wrap,\n    gcm_ctx_alloc,\n    gcm_ctx_free,\n};\n\nstatic const mbedtls_cipher_info_t aes_128_gcm_info = {\n    MBEDTLS_CIPHER_AES_128_GCM,\n    MBEDTLS_MODE_GCM,\n    128,\n    \"AES-128-GCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &gcm_aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_192_gcm_info = {\n    MBEDTLS_CIPHER_AES_192_GCM,\n    MBEDTLS_MODE_GCM,\n    192,\n    \"AES-192-GCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &gcm_aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_256_gcm_info = {\n    MBEDTLS_CIPHER_AES_256_GCM,\n    MBEDTLS_MODE_GCM,\n    256,\n    \"AES-256-GCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &gcm_aes_info\n};\n#endif /* MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_CCM_C)\nstatic int ccm_aes_setkey_wrap( void *ctx, const unsigned char *key,\n                                unsigned int key_bitlen )\n{\n    return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_AES,\n                     key, key_bitlen );\n}\n\nstatic const mbedtls_cipher_base_t ccm_aes_info = {\n    MBEDTLS_CIPHER_ID_AES,\n    NULL,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    NULL,\n#endif\n    ccm_aes_setkey_wrap,\n    ccm_aes_setkey_wrap,\n    ccm_ctx_alloc,\n    ccm_ctx_free,\n};\n\nstatic const mbedtls_cipher_info_t aes_128_ccm_info = {\n    MBEDTLS_CIPHER_AES_128_CCM,\n    MBEDTLS_MODE_CCM,\n    128,\n    \"AES-128-CCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &ccm_aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_192_ccm_info = {\n    MBEDTLS_CIPHER_AES_192_CCM,\n    MBEDTLS_MODE_CCM,\n    192,\n    \"AES-192-CCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &ccm_aes_info\n};\n\nstatic const mbedtls_cipher_info_t aes_256_ccm_info = {\n    MBEDTLS_CIPHER_AES_256_CCM,\n    MBEDTLS_MODE_CCM,\n    256,\n    \"AES-256-CCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &ccm_aes_info\n};\n#endif /* MBEDTLS_CCM_C */\n\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n\nstatic int camellia_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,\n        const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_camellia_crypt_ecb( (mbedtls_camellia_context *) ctx, operation, input,\n                               output );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic int camellia_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,\n        size_t length, unsigned char *iv,\n        const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_camellia_crypt_cbc( (mbedtls_camellia_context *) ctx, operation, length, iv,\n                               input, output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\nstatic int camellia_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,\n        size_t length, size_t *iv_off, unsigned char *iv,\n        const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_camellia_crypt_cfb128( (mbedtls_camellia_context *) ctx, operation, length,\n                                  iv_off, iv, input, output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\nstatic int camellia_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,\n        unsigned char *nonce_counter, unsigned char *stream_block,\n        const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_camellia_crypt_ctr( (mbedtls_camellia_context *) ctx, length, nc_off,\n                               nonce_counter, stream_block, input, output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\nstatic int camellia_setkey_dec_wrap( void *ctx, const unsigned char *key,\n                                     unsigned int key_bitlen )\n{\n    return mbedtls_camellia_setkey_dec( (mbedtls_camellia_context *) ctx, key, key_bitlen );\n}\n\nstatic int camellia_setkey_enc_wrap( void *ctx, const unsigned char *key,\n                                     unsigned int key_bitlen )\n{\n    return mbedtls_camellia_setkey_enc( (mbedtls_camellia_context *) ctx, key, key_bitlen );\n}\n\nstatic void * camellia_ctx_alloc( void )\n{\n    mbedtls_camellia_context *ctx;\n    ctx = mbedtls_calloc( 1, sizeof( mbedtls_camellia_context ) );\n\n    if( ctx == NULL )\n        return( NULL );\n\n    mbedtls_camellia_init( ctx );\n\n    return( ctx );\n}\n\nstatic void camellia_ctx_free( void *ctx )\n{\n    mbedtls_camellia_free( (mbedtls_camellia_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic const mbedtls_cipher_base_t camellia_info = {\n    MBEDTLS_CIPHER_ID_CAMELLIA,\n    camellia_crypt_ecb_wrap,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    camellia_crypt_cbc_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    camellia_crypt_cfb128_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    camellia_crypt_ctr_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    NULL,\n#endif\n    camellia_setkey_enc_wrap,\n    camellia_setkey_dec_wrap,\n    camellia_ctx_alloc,\n    camellia_ctx_free\n};\n\nstatic const mbedtls_cipher_info_t camellia_128_ecb_info = {\n    MBEDTLS_CIPHER_CAMELLIA_128_ECB,\n    MBEDTLS_MODE_ECB,\n    128,\n    \"CAMELLIA-128-ECB\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_192_ecb_info = {\n    MBEDTLS_CIPHER_CAMELLIA_192_ECB,\n    MBEDTLS_MODE_ECB,\n    192,\n    \"CAMELLIA-192-ECB\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_256_ecb_info = {\n    MBEDTLS_CIPHER_CAMELLIA_256_ECB,\n    MBEDTLS_MODE_ECB,\n    256,\n    \"CAMELLIA-256-ECB\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic const mbedtls_cipher_info_t camellia_128_cbc_info = {\n    MBEDTLS_CIPHER_CAMELLIA_128_CBC,\n    MBEDTLS_MODE_CBC,\n    128,\n    \"CAMELLIA-128-CBC\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_192_cbc_info = {\n    MBEDTLS_CIPHER_CAMELLIA_192_CBC,\n    MBEDTLS_MODE_CBC,\n    192,\n    \"CAMELLIA-192-CBC\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_256_cbc_info = {\n    MBEDTLS_CIPHER_CAMELLIA_256_CBC,\n    MBEDTLS_MODE_CBC,\n    256,\n    \"CAMELLIA-256-CBC\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\nstatic const mbedtls_cipher_info_t camellia_128_cfb128_info = {\n    MBEDTLS_CIPHER_CAMELLIA_128_CFB128,\n    MBEDTLS_MODE_CFB,\n    128,\n    \"CAMELLIA-128-CFB128\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_192_cfb128_info = {\n    MBEDTLS_CIPHER_CAMELLIA_192_CFB128,\n    MBEDTLS_MODE_CFB,\n    192,\n    \"CAMELLIA-192-CFB128\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_256_cfb128_info = {\n    MBEDTLS_CIPHER_CAMELLIA_256_CFB128,\n    MBEDTLS_MODE_CFB,\n    256,\n    \"CAMELLIA-256-CFB128\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\nstatic const mbedtls_cipher_info_t camellia_128_ctr_info = {\n    MBEDTLS_CIPHER_CAMELLIA_128_CTR,\n    MBEDTLS_MODE_CTR,\n    128,\n    \"CAMELLIA-128-CTR\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_192_ctr_info = {\n    MBEDTLS_CIPHER_CAMELLIA_192_CTR,\n    MBEDTLS_MODE_CTR,\n    192,\n    \"CAMELLIA-192-CTR\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_256_ctr_info = {\n    MBEDTLS_CIPHER_CAMELLIA_256_CTR,\n    MBEDTLS_MODE_CTR,\n    256,\n    \"CAMELLIA-256-CTR\",\n    16,\n    0,\n    16,\n    &camellia_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\n#if defined(MBEDTLS_GCM_C)\nstatic int gcm_camellia_setkey_wrap( void *ctx, const unsigned char *key,\n                                     unsigned int key_bitlen )\n{\n    return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,\n                     key, key_bitlen );\n}\n\nstatic const mbedtls_cipher_base_t gcm_camellia_info = {\n    MBEDTLS_CIPHER_ID_CAMELLIA,\n    NULL,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    NULL,\n#endif\n    gcm_camellia_setkey_wrap,\n    gcm_camellia_setkey_wrap,\n    gcm_ctx_alloc,\n    gcm_ctx_free,\n};\n\nstatic const mbedtls_cipher_info_t camellia_128_gcm_info = {\n    MBEDTLS_CIPHER_CAMELLIA_128_GCM,\n    MBEDTLS_MODE_GCM,\n    128,\n    \"CAMELLIA-128-GCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &gcm_camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_192_gcm_info = {\n    MBEDTLS_CIPHER_CAMELLIA_192_GCM,\n    MBEDTLS_MODE_GCM,\n    192,\n    \"CAMELLIA-192-GCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &gcm_camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_256_gcm_info = {\n    MBEDTLS_CIPHER_CAMELLIA_256_GCM,\n    MBEDTLS_MODE_GCM,\n    256,\n    \"CAMELLIA-256-GCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &gcm_camellia_info\n};\n#endif /* MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_CCM_C)\nstatic int ccm_camellia_setkey_wrap( void *ctx, const unsigned char *key,\n                                     unsigned int key_bitlen )\n{\n    return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,\n                     key, key_bitlen );\n}\n\nstatic const mbedtls_cipher_base_t ccm_camellia_info = {\n    MBEDTLS_CIPHER_ID_CAMELLIA,\n    NULL,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    NULL,\n#endif\n    ccm_camellia_setkey_wrap,\n    ccm_camellia_setkey_wrap,\n    ccm_ctx_alloc,\n    ccm_ctx_free,\n};\n\nstatic const mbedtls_cipher_info_t camellia_128_ccm_info = {\n    MBEDTLS_CIPHER_CAMELLIA_128_CCM,\n    MBEDTLS_MODE_CCM,\n    128,\n    \"CAMELLIA-128-CCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &ccm_camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_192_ccm_info = {\n    MBEDTLS_CIPHER_CAMELLIA_192_CCM,\n    MBEDTLS_MODE_CCM,\n    192,\n    \"CAMELLIA-192-CCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &ccm_camellia_info\n};\n\nstatic const mbedtls_cipher_info_t camellia_256_ccm_info = {\n    MBEDTLS_CIPHER_CAMELLIA_256_CCM,\n    MBEDTLS_MODE_CCM,\n    256,\n    \"CAMELLIA-256-CCM\",\n    12,\n    MBEDTLS_CIPHER_VARIABLE_IV_LEN,\n    16,\n    &ccm_camellia_info\n};\n#endif /* MBEDTLS_CCM_C */\n\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n\nstatic int des_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,\n        const unsigned char *input, unsigned char *output )\n{\n    ((void) operation);\n    return mbedtls_des_crypt_ecb( (mbedtls_des_context *) ctx, input, output );\n}\n\nstatic int des3_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,\n        const unsigned char *input, unsigned char *output )\n{\n    ((void) operation);\n    return mbedtls_des3_crypt_ecb( (mbedtls_des3_context *) ctx, input, output );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic int des_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,\n        unsigned char *iv, const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_des_crypt_cbc( (mbedtls_des_context *) ctx, operation, length, iv, input,\n                          output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic int des3_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,\n        unsigned char *iv, const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_des3_crypt_cbc( (mbedtls_des3_context *) ctx, operation, length, iv, input,\n                           output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\nstatic int des_setkey_dec_wrap( void *ctx, const unsigned char *key,\n                                unsigned int key_bitlen )\n{\n    ((void) key_bitlen);\n\n    return mbedtls_des_setkey_dec( (mbedtls_des_context *) ctx, key );\n}\n\nstatic int des_setkey_enc_wrap( void *ctx, const unsigned char *key,\n                                unsigned int key_bitlen )\n{\n    ((void) key_bitlen);\n\n    return mbedtls_des_setkey_enc( (mbedtls_des_context *) ctx, key );\n}\n\nstatic int des3_set2key_dec_wrap( void *ctx, const unsigned char *key,\n                                  unsigned int key_bitlen )\n{\n    ((void) key_bitlen);\n\n    return mbedtls_des3_set2key_dec( (mbedtls_des3_context *) ctx, key );\n}\n\nstatic int des3_set2key_enc_wrap( void *ctx, const unsigned char *key,\n                                  unsigned int key_bitlen )\n{\n    ((void) key_bitlen);\n\n    return mbedtls_des3_set2key_enc( (mbedtls_des3_context *) ctx, key );\n}\n\nstatic int des3_set3key_dec_wrap( void *ctx, const unsigned char *key,\n                                  unsigned int key_bitlen )\n{\n    ((void) key_bitlen);\n\n    return mbedtls_des3_set3key_dec( (mbedtls_des3_context *) ctx, key );\n}\n\nstatic int des3_set3key_enc_wrap( void *ctx, const unsigned char *key,\n                                  unsigned int key_bitlen )\n{\n    ((void) key_bitlen);\n\n    return mbedtls_des3_set3key_enc( (mbedtls_des3_context *) ctx, key );\n}\n\nstatic void * des_ctx_alloc( void )\n{\n    mbedtls_des_context *des = mbedtls_calloc( 1, sizeof( mbedtls_des_context ) );\n\n    if( des == NULL )\n        return( NULL );\n\n    mbedtls_des_init( des );\n\n    return( des );\n}\n\nstatic void des_ctx_free( void *ctx )\n{\n    mbedtls_des_free( (mbedtls_des_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic void * des3_ctx_alloc( void )\n{\n    mbedtls_des3_context *des3;\n    des3 = mbedtls_calloc( 1, sizeof( mbedtls_des3_context ) );\n\n    if( des3 == NULL )\n        return( NULL );\n\n    mbedtls_des3_init( des3 );\n\n    return( des3 );\n}\n\nstatic void des3_ctx_free( void *ctx )\n{\n    mbedtls_des3_free( (mbedtls_des3_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic const mbedtls_cipher_base_t des_info = {\n    MBEDTLS_CIPHER_ID_DES,\n    des_crypt_ecb_wrap,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    des_crypt_cbc_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    NULL,\n#endif\n    des_setkey_enc_wrap,\n    des_setkey_dec_wrap,\n    des_ctx_alloc,\n    des_ctx_free\n};\n\nstatic const mbedtls_cipher_info_t des_ecb_info = {\n    MBEDTLS_CIPHER_DES_ECB,\n    MBEDTLS_MODE_ECB,\n    MBEDTLS_KEY_LENGTH_DES,\n    \"DES-ECB\",\n    8,\n    0,\n    8,\n    &des_info\n};\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic const mbedtls_cipher_info_t des_cbc_info = {\n    MBEDTLS_CIPHER_DES_CBC,\n    MBEDTLS_MODE_CBC,\n    MBEDTLS_KEY_LENGTH_DES,\n    \"DES-CBC\",\n    8,\n    0,\n    8,\n    &des_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\nstatic const mbedtls_cipher_base_t des_ede_info = {\n    MBEDTLS_CIPHER_ID_DES,\n    des3_crypt_ecb_wrap,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    des3_crypt_cbc_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    NULL,\n#endif\n    des3_set2key_enc_wrap,\n    des3_set2key_dec_wrap,\n    des3_ctx_alloc,\n    des3_ctx_free\n};\n\nstatic const mbedtls_cipher_info_t des_ede_ecb_info = {\n    MBEDTLS_CIPHER_DES_EDE_ECB,\n    MBEDTLS_MODE_ECB,\n    MBEDTLS_KEY_LENGTH_DES_EDE,\n    \"DES-EDE-ECB\",\n    8,\n    0,\n    8,\n    &des_ede_info\n};\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic const mbedtls_cipher_info_t des_ede_cbc_info = {\n    MBEDTLS_CIPHER_DES_EDE_CBC,\n    MBEDTLS_MODE_CBC,\n    MBEDTLS_KEY_LENGTH_DES_EDE,\n    \"DES-EDE-CBC\",\n    8,\n    0,\n    8,\n    &des_ede_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\nstatic const mbedtls_cipher_base_t des_ede3_info = {\n    MBEDTLS_CIPHER_ID_3DES,\n    des3_crypt_ecb_wrap,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    des3_crypt_cbc_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    NULL,\n#endif\n    des3_set3key_enc_wrap,\n    des3_set3key_dec_wrap,\n    des3_ctx_alloc,\n    des3_ctx_free\n};\n\nstatic const mbedtls_cipher_info_t des_ede3_ecb_info = {\n    MBEDTLS_CIPHER_DES_EDE3_ECB,\n    MBEDTLS_MODE_ECB,\n    MBEDTLS_KEY_LENGTH_DES_EDE3,\n    \"DES-EDE3-ECB\",\n    8,\n    0,\n    8,\n    &des_ede3_info\n};\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic const mbedtls_cipher_info_t des_ede3_cbc_info = {\n    MBEDTLS_CIPHER_DES_EDE3_CBC,\n    MBEDTLS_MODE_CBC,\n    MBEDTLS_KEY_LENGTH_DES_EDE3,\n    \"DES-EDE3-CBC\",\n    8,\n    0,\n    8,\n    &des_ede3_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_BLOWFISH_C)\n\nstatic int blowfish_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,\n        const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_blowfish_crypt_ecb( (mbedtls_blowfish_context *) ctx, operation, input,\n                               output );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic int blowfish_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,\n        size_t length, unsigned char *iv, const unsigned char *input,\n        unsigned char *output )\n{\n    return mbedtls_blowfish_crypt_cbc( (mbedtls_blowfish_context *) ctx, operation, length, iv,\n                               input, output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\nstatic int blowfish_crypt_cfb64_wrap( void *ctx, mbedtls_operation_t operation,\n        size_t length, size_t *iv_off, unsigned char *iv,\n        const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_blowfish_crypt_cfb64( (mbedtls_blowfish_context *) ctx, operation, length,\n                                 iv_off, iv, input, output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\nstatic int blowfish_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,\n        unsigned char *nonce_counter, unsigned char *stream_block,\n        const unsigned char *input, unsigned char *output )\n{\n    return mbedtls_blowfish_crypt_ctr( (mbedtls_blowfish_context *) ctx, length, nc_off,\n                               nonce_counter, stream_block, input, output );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n\nstatic int blowfish_setkey_wrap( void *ctx, const unsigned char *key,\n                                 unsigned int key_bitlen )\n{\n    return mbedtls_blowfish_setkey( (mbedtls_blowfish_context *) ctx, key, key_bitlen );\n}\n\nstatic void * blowfish_ctx_alloc( void )\n{\n    mbedtls_blowfish_context *ctx;\n    ctx = mbedtls_calloc( 1, sizeof( mbedtls_blowfish_context ) );\n\n    if( ctx == NULL )\n        return( NULL );\n\n    mbedtls_blowfish_init( ctx );\n\n    return( ctx );\n}\n\nstatic void blowfish_ctx_free( void *ctx )\n{\n    mbedtls_blowfish_free( (mbedtls_blowfish_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic const mbedtls_cipher_base_t blowfish_info = {\n    MBEDTLS_CIPHER_ID_BLOWFISH,\n    blowfish_crypt_ecb_wrap,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    blowfish_crypt_cbc_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    blowfish_crypt_cfb64_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    blowfish_crypt_ctr_wrap,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    NULL,\n#endif\n    blowfish_setkey_wrap,\n    blowfish_setkey_wrap,\n    blowfish_ctx_alloc,\n    blowfish_ctx_free\n};\n\nstatic const mbedtls_cipher_info_t blowfish_ecb_info = {\n    MBEDTLS_CIPHER_BLOWFISH_ECB,\n    MBEDTLS_MODE_ECB,\n    128,\n    \"BLOWFISH-ECB\",\n    8,\n    MBEDTLS_CIPHER_VARIABLE_KEY_LEN,\n    8,\n    &blowfish_info\n};\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic const mbedtls_cipher_info_t blowfish_cbc_info = {\n    MBEDTLS_CIPHER_BLOWFISH_CBC,\n    MBEDTLS_MODE_CBC,\n    128,\n    \"BLOWFISH-CBC\",\n    8,\n    MBEDTLS_CIPHER_VARIABLE_KEY_LEN,\n    8,\n    &blowfish_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\nstatic const mbedtls_cipher_info_t blowfish_cfb64_info = {\n    MBEDTLS_CIPHER_BLOWFISH_CFB64,\n    MBEDTLS_MODE_CFB,\n    128,\n    \"BLOWFISH-CFB64\",\n    8,\n    MBEDTLS_CIPHER_VARIABLE_KEY_LEN,\n    8,\n    &blowfish_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\nstatic const mbedtls_cipher_info_t blowfish_ctr_info = {\n    MBEDTLS_CIPHER_BLOWFISH_CTR,\n    MBEDTLS_MODE_CTR,\n    128,\n    \"BLOWFISH-CTR\",\n    8,\n    MBEDTLS_CIPHER_VARIABLE_KEY_LEN,\n    8,\n    &blowfish_info\n};\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n#endif /* MBEDTLS_BLOWFISH_C */\n\n#if defined(MBEDTLS_ARC4_C)\nstatic int arc4_crypt_stream_wrap( void *ctx, size_t length,\n                                   const unsigned char *input,\n                                   unsigned char *output )\n{\n    return( mbedtls_arc4_crypt( (mbedtls_arc4_context *) ctx, length, input, output ) );\n}\n\nstatic int arc4_setkey_wrap( void *ctx, const unsigned char *key,\n                             unsigned int key_bitlen )\n{\n    /* we get key_bitlen in bits, arc4 expects it in bytes */\n    if( key_bitlen % 8 != 0 )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    mbedtls_arc4_setup( (mbedtls_arc4_context *) ctx, key, key_bitlen / 8 );\n    return( 0 );\n}\n\nstatic void * arc4_ctx_alloc( void )\n{\n    mbedtls_arc4_context *ctx;\n    ctx = mbedtls_calloc( 1, sizeof( mbedtls_arc4_context ) );\n\n    if( ctx == NULL )\n        return( NULL );\n\n    mbedtls_arc4_init( ctx );\n\n    return( ctx );\n}\n\nstatic void arc4_ctx_free( void *ctx )\n{\n    mbedtls_arc4_free( (mbedtls_arc4_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic const mbedtls_cipher_base_t arc4_base_info = {\n    MBEDTLS_CIPHER_ID_ARC4,\n    NULL,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    arc4_crypt_stream_wrap,\n#endif\n    arc4_setkey_wrap,\n    arc4_setkey_wrap,\n    arc4_ctx_alloc,\n    arc4_ctx_free\n};\n\nstatic const mbedtls_cipher_info_t arc4_128_info = {\n    MBEDTLS_CIPHER_ARC4_128,\n    MBEDTLS_MODE_STREAM,\n    128,\n    \"ARC4-128\",\n    0,\n    0,\n    1,\n    &arc4_base_info\n};\n#endif /* MBEDTLS_ARC4_C */\n\n#if defined(MBEDTLS_CIPHER_NULL_CIPHER)\nstatic int null_crypt_stream( void *ctx, size_t length,\n                              const unsigned char *input,\n                              unsigned char *output )\n{\n    ((void) ctx);\n    memmove( output, input, length );\n    return( 0 );\n}\n\nstatic int null_setkey( void *ctx, const unsigned char *key,\n                        unsigned int key_bitlen )\n{\n    ((void) ctx);\n    ((void) key);\n    ((void) key_bitlen);\n\n    return( 0 );\n}\n\nstatic void * null_ctx_alloc( void )\n{\n    return( (void *) 1 );\n}\n\nstatic void null_ctx_free( void *ctx )\n{\n    ((void) ctx);\n}\n\nstatic const mbedtls_cipher_base_t null_base_info = {\n    MBEDTLS_CIPHER_ID_NULL,\n    NULL,\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    NULL,\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_STREAM)\n    null_crypt_stream,\n#endif\n    null_setkey,\n    null_setkey,\n    null_ctx_alloc,\n    null_ctx_free\n};\n\nstatic const mbedtls_cipher_info_t null_cipher_info = {\n    MBEDTLS_CIPHER_NULL,\n    MBEDTLS_MODE_STREAM,\n    0,\n    \"NULL\",\n    0,\n    0,\n    1,\n    &null_base_info\n};\n#endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */\n\nconst mbedtls_cipher_definition_t mbedtls_cipher_definitions[] =\n{\n#if defined(MBEDTLS_AES_C)\n    { MBEDTLS_CIPHER_AES_128_ECB,          &aes_128_ecb_info },\n    { MBEDTLS_CIPHER_AES_192_ECB,          &aes_192_ecb_info },\n    { MBEDTLS_CIPHER_AES_256_ECB,          &aes_256_ecb_info },\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_CIPHER_AES_128_CBC,          &aes_128_cbc_info },\n    { MBEDTLS_CIPHER_AES_192_CBC,          &aes_192_cbc_info },\n    { MBEDTLS_CIPHER_AES_256_CBC,          &aes_256_cbc_info },\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    { MBEDTLS_CIPHER_AES_128_CFB128,       &aes_128_cfb128_info },\n    { MBEDTLS_CIPHER_AES_192_CFB128,       &aes_192_cfb128_info },\n    { MBEDTLS_CIPHER_AES_256_CFB128,       &aes_256_cfb128_info },\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    { MBEDTLS_CIPHER_AES_128_CTR,          &aes_128_ctr_info },\n    { MBEDTLS_CIPHER_AES_192_CTR,          &aes_192_ctr_info },\n    { MBEDTLS_CIPHER_AES_256_CTR,          &aes_256_ctr_info },\n#endif\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_CIPHER_AES_128_GCM,          &aes_128_gcm_info },\n    { MBEDTLS_CIPHER_AES_192_GCM,          &aes_192_gcm_info },\n    { MBEDTLS_CIPHER_AES_256_GCM,          &aes_256_gcm_info },\n#endif\n#if defined(MBEDTLS_CCM_C)\n    { MBEDTLS_CIPHER_AES_128_CCM,          &aes_128_ccm_info },\n    { MBEDTLS_CIPHER_AES_192_CCM,          &aes_192_ccm_info },\n    { MBEDTLS_CIPHER_AES_256_CCM,          &aes_256_ccm_info },\n#endif\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_ARC4_C)\n    { MBEDTLS_CIPHER_ARC4_128,             &arc4_128_info },\n#endif\n\n#if defined(MBEDTLS_BLOWFISH_C)\n    { MBEDTLS_CIPHER_BLOWFISH_ECB,         &blowfish_ecb_info },\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_CIPHER_BLOWFISH_CBC,         &blowfish_cbc_info },\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    { MBEDTLS_CIPHER_BLOWFISH_CFB64,       &blowfish_cfb64_info },\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    { MBEDTLS_CIPHER_BLOWFISH_CTR,         &blowfish_ctr_info },\n#endif\n#endif /* MBEDTLS_BLOWFISH_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n    { MBEDTLS_CIPHER_CAMELLIA_128_ECB,     &camellia_128_ecb_info },\n    { MBEDTLS_CIPHER_CAMELLIA_192_ECB,     &camellia_192_ecb_info },\n    { MBEDTLS_CIPHER_CAMELLIA_256_ECB,     &camellia_256_ecb_info },\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_CIPHER_CAMELLIA_128_CBC,     &camellia_128_cbc_info },\n    { MBEDTLS_CIPHER_CAMELLIA_192_CBC,     &camellia_192_cbc_info },\n    { MBEDTLS_CIPHER_CAMELLIA_256_CBC,     &camellia_256_cbc_info },\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    { MBEDTLS_CIPHER_CAMELLIA_128_CFB128,  &camellia_128_cfb128_info },\n    { MBEDTLS_CIPHER_CAMELLIA_192_CFB128,  &camellia_192_cfb128_info },\n    { MBEDTLS_CIPHER_CAMELLIA_256_CFB128,  &camellia_256_cfb128_info },\n#endif\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    { MBEDTLS_CIPHER_CAMELLIA_128_CTR,     &camellia_128_ctr_info },\n    { MBEDTLS_CIPHER_CAMELLIA_192_CTR,     &camellia_192_ctr_info },\n    { MBEDTLS_CIPHER_CAMELLIA_256_CTR,     &camellia_256_ctr_info },\n#endif\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_CIPHER_CAMELLIA_128_GCM,     &camellia_128_gcm_info },\n    { MBEDTLS_CIPHER_CAMELLIA_192_GCM,     &camellia_192_gcm_info },\n    { MBEDTLS_CIPHER_CAMELLIA_256_GCM,     &camellia_256_gcm_info },\n#endif\n#if defined(MBEDTLS_CCM_C)\n    { MBEDTLS_CIPHER_CAMELLIA_128_CCM,     &camellia_128_ccm_info },\n    { MBEDTLS_CIPHER_CAMELLIA_192_CCM,     &camellia_192_ccm_info },\n    { MBEDTLS_CIPHER_CAMELLIA_256_CCM,     &camellia_256_ccm_info },\n#endif\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n    { MBEDTLS_CIPHER_DES_ECB,              &des_ecb_info },\n    { MBEDTLS_CIPHER_DES_EDE_ECB,          &des_ede_ecb_info },\n    { MBEDTLS_CIPHER_DES_EDE3_ECB,         &des_ede3_ecb_info },\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_CIPHER_DES_CBC,              &des_cbc_info },\n    { MBEDTLS_CIPHER_DES_EDE_CBC,          &des_ede_cbc_info },\n    { MBEDTLS_CIPHER_DES_EDE3_CBC,         &des_ede3_cbc_info },\n#endif\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_CIPHER_NULL_CIPHER)\n    { MBEDTLS_CIPHER_NULL,                 &null_cipher_info },\n#endif /* MBEDTLS_CIPHER_NULL_CIPHER */\n\n    { MBEDTLS_CIPHER_NONE, NULL }\n};\n\n#define NUM_CIPHERS sizeof mbedtls_cipher_definitions / sizeof mbedtls_cipher_definitions[0]\nint mbedtls_cipher_supported[NUM_CIPHERS];\n\n#endif /* MBEDTLS_CIPHER_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/cmac.c",
    "content": "/**\n * \\file cmac.c\n *\n * \\brief NIST SP800-38B compliant CMAC implementation for AES and 3DES\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * References:\n *\n * - NIST SP 800-38B Recommendation for Block Cipher Modes of Operation: The\n *      CMAC Mode for Authentication\n *   http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-38b.pdf\n *\n * - RFC 4493 - The AES-CMAC Algorithm\n *   https://tools.ietf.org/html/rfc4493\n *\n * - RFC 4615 - The Advanced Encryption Standard-Cipher-based Message\n *      Authentication Code-Pseudo-Random Function-128 (AES-CMAC-PRF-128)\n *      Algorithm for the Internet Key Exchange Protocol (IKE)\n *   https://tools.ietf.org/html/rfc4615\n *\n *   Additional test vectors: ISO/IEC 9797-1\n *\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_CMAC_C)\n\n#include \"mbedtls/cmac.h\"\n\n#include <string.h>\n\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc     calloc\n#define mbedtls_free       free\n#if defined(MBEDTLS_SELF_TEST)\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif /* MBEDTLS_SELF_TEST */\n#endif /* MBEDTLS_PLATFORM_C */\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\n/*\n * Multiplication by u in the Galois field of GF(2^n)\n *\n * As explained in NIST SP 800-38B, this can be computed:\n *\n *   If MSB(p) = 0, then p = (p << 1)\n *   If MSB(p) = 1, then p = (p << 1) ^ R_n\n *   with R_64 = 0x1B and  R_128 = 0x87\n *\n * Input and output MUST NOT point to the same buffer\n * Block size must be 8 bytes or 16 bytes - the block sizes for DES and AES.\n */\nstatic int cmac_multiply_by_u( unsigned char *output,\n                               const unsigned char *input,\n                               size_t blocksize )\n{\n    const unsigned char R_128 = 0x87;\n    const unsigned char R_64 = 0x1B;\n    unsigned char R_n, mask;\n    unsigned char overflow = 0x00;\n    int i;\n\n    if( blocksize == MBEDTLS_AES_BLOCK_SIZE )\n    {\n        R_n = R_128;\n    }\n    else if( blocksize == MBEDTLS_DES3_BLOCK_SIZE )\n    {\n        R_n = R_64;\n    }\n    else\n    {\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n    }\n\n    for( i = (int)blocksize - 1; i >= 0; i-- )\n    {\n        output[i] = input[i] << 1 | overflow;\n        overflow = input[i] >> 7;\n    }\n\n    /* mask = ( input[0] >> 7 ) ? 0xff : 0x00\n     * using bit operations to avoid branches */\n\n    /* MSVC has a warning about unary minus on unsigned, but this is\n     * well-defined and precisely what we want to do here */\n#if defined(_MSC_VER)\n#pragma warning( push )\n#pragma warning( disable : 4146 )\n#endif\n    mask = - ( input[0] >> 7 );\n#if defined(_MSC_VER)\n#pragma warning( pop )\n#endif\n\n    output[ blocksize - 1 ] ^= R_n & mask;\n\n    return( 0 );\n}\n\n/*\n * Generate subkeys\n *\n * - as specified by RFC 4493, section 2.3 Subkey Generation Algorithm\n */\nstatic int cmac_generate_subkeys( mbedtls_cipher_context_t *ctx,\n                                  unsigned char* K1, unsigned char* K2 )\n{\n    int ret;\n    unsigned char L[MBEDTLS_CIPHER_BLKSIZE_MAX];\n    size_t olen, block_size;\n\n    mbedtls_zeroize( L, sizeof( L ) );\n\n    block_size = ctx->cipher_info->block_size;\n\n    /* Calculate Ek(0) */\n    if( ( ret = mbedtls_cipher_update( ctx, L, block_size, L, &olen ) ) != 0 )\n        goto exit;\n\n    /*\n     * Generate K1 and K2\n     */\n    if( ( ret = cmac_multiply_by_u( K1, L , block_size ) ) != 0 )\n        goto exit;\n\n    if( ( ret = cmac_multiply_by_u( K2, K1 , block_size ) ) != 0 )\n        goto exit;\n\nexit:\n    mbedtls_zeroize( L, sizeof( L ) );\n\n    return( ret );\n}\n\nstatic void cmac_xor_block( unsigned char *output, const unsigned char *input1,\n                            const unsigned char *input2,\n                            const size_t block_size )\n{\n    size_t idx;\n\n    for( idx = 0; idx < block_size; idx++ )\n        output[ idx ] = input1[ idx ] ^ input2[ idx ];\n}\n\n/*\n * Create padded last block from (partial) last block.\n *\n * We can't use the padding option from the cipher layer, as it only works for\n * CBC and we use ECB mode, and anyway we need to XOR K1 or K2 in addition.\n */\nstatic void cmac_pad( unsigned char padded_block[MBEDTLS_CIPHER_BLKSIZE_MAX],\n                      size_t padded_block_len,\n                      const unsigned char *last_block,\n                      size_t last_block_len )\n{\n    size_t j;\n\n    for( j = 0; j < padded_block_len; j++ )\n    {\n        if( j < last_block_len )\n            padded_block[j] = last_block[j];\n        else if( j == last_block_len )\n            padded_block[j] = 0x80;\n        else\n            padded_block[j] = 0x00;\n    }\n}\n\nint mbedtls_cipher_cmac_starts( mbedtls_cipher_context_t *ctx,\n                                const unsigned char *key, size_t keybits )\n{\n    mbedtls_cipher_type_t type;\n    mbedtls_cmac_context_t *cmac_ctx;\n    int retval;\n\n    if( ctx == NULL || ctx->cipher_info == NULL || key == NULL )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    if( ( retval = mbedtls_cipher_setkey( ctx, key, (int)keybits,\n                                          MBEDTLS_ENCRYPT ) ) != 0 )\n        return( retval );\n\n    type = ctx->cipher_info->type;\n\n    switch( type )\n    {\n        case MBEDTLS_CIPHER_AES_128_ECB:\n        case MBEDTLS_CIPHER_AES_192_ECB:\n        case MBEDTLS_CIPHER_AES_256_ECB:\n        case MBEDTLS_CIPHER_DES_EDE3_ECB:\n            break;\n        default:\n            return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n    }\n\n    /* Allocated and initialise in the cipher context memory for the CMAC\n     * context */\n    cmac_ctx = mbedtls_calloc( 1, sizeof( mbedtls_cmac_context_t ) );\n    if( cmac_ctx == NULL )\n        return( MBEDTLS_ERR_CIPHER_ALLOC_FAILED );\n\n    ctx->cmac_ctx = cmac_ctx;\n\n    mbedtls_zeroize( cmac_ctx->state, sizeof( cmac_ctx->state ) );\n\n    return 0;\n}\n\nint mbedtls_cipher_cmac_update( mbedtls_cipher_context_t *ctx,\n                                const unsigned char *input, size_t ilen )\n{\n    mbedtls_cmac_context_t* cmac_ctx;\n    unsigned char *state;\n    int ret = 0;\n    size_t n, j, olen, block_size;\n\n    if( ctx == NULL || ctx->cipher_info == NULL || input == NULL ||\n        ctx->cmac_ctx == NULL )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    cmac_ctx = ctx->cmac_ctx;\n    block_size = ctx->cipher_info->block_size;\n    state = ctx->cmac_ctx->state;\n\n    /* Is there data still to process from the last call, that's greater in\n     * size than a block? */\n    if( cmac_ctx->unprocessed_len > 0 &&\n        ilen > block_size - cmac_ctx->unprocessed_len )\n    {\n        memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],\n                input,\n                block_size - cmac_ctx->unprocessed_len );\n\n        cmac_xor_block( state, cmac_ctx->unprocessed_block, state, block_size );\n\n        if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,\n                                           &olen ) ) != 0 )\n        {\n           goto exit;\n        }\n\n        input += block_size - cmac_ctx->unprocessed_len;\n        ilen -= block_size - cmac_ctx->unprocessed_len;\n        cmac_ctx->unprocessed_len = 0;\n    }\n\n    /* n is the number of blocks including any final partial block */\n    n = ( ilen + block_size - 1 ) / block_size;\n\n    /* Iterate across the input data in block sized chunks, excluding any\n     * final partial or complete block */\n    for( j = 1; j < n; j++ )\n    {\n        cmac_xor_block( state, input, state, block_size );\n\n        if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,\n                                           &olen ) ) != 0 )\n           goto exit;\n\n        ilen -= block_size;\n        input += block_size;\n    }\n\n    /* If there is data left over that wasn't aligned to a block */\n    if( ilen > 0 )\n    {\n        memcpy( &cmac_ctx->unprocessed_block[cmac_ctx->unprocessed_len],\n                input,\n                ilen );\n        cmac_ctx->unprocessed_len += ilen;\n    }\n\nexit:\n    return( ret );\n}\n\nint mbedtls_cipher_cmac_finish( mbedtls_cipher_context_t *ctx,\n                                unsigned char *output )\n{\n    mbedtls_cmac_context_t* cmac_ctx;\n    unsigned char *state, *last_block;\n    unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX];\n    unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX];\n    unsigned char M_last[MBEDTLS_CIPHER_BLKSIZE_MAX];\n    int ret;\n    size_t olen, block_size;\n\n    if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL ||\n        output == NULL )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    cmac_ctx = ctx->cmac_ctx;\n    block_size = ctx->cipher_info->block_size;\n    state = cmac_ctx->state;\n\n    mbedtls_zeroize( K1, sizeof( K1 ) );\n    mbedtls_zeroize( K2, sizeof( K2 ) );\n    cmac_generate_subkeys( ctx, K1, K2 );\n\n    last_block = cmac_ctx->unprocessed_block;\n\n    /* Calculate last block */\n    if( cmac_ctx->unprocessed_len < block_size )\n    {\n        cmac_pad( M_last, block_size, last_block, cmac_ctx->unprocessed_len );\n        cmac_xor_block( M_last, M_last, K2, block_size );\n    }\n    else\n    {\n        /* Last block is complete block */\n        cmac_xor_block( M_last, last_block, K1, block_size );\n    }\n\n\n    cmac_xor_block( state, M_last, state, block_size );\n    if( ( ret = mbedtls_cipher_update( ctx, state, block_size, state,\n                                       &olen ) ) != 0 )\n    {\n        goto exit;\n    }\n\n    memcpy( output, state, block_size );\n\nexit:\n    /* Wipe the generated keys on the stack, and any other transients to avoid\n     * side channel leakage */\n    mbedtls_zeroize( K1, sizeof( K1 ) );\n    mbedtls_zeroize( K2, sizeof( K2 ) );\n\n    cmac_ctx->unprocessed_len = 0;\n    mbedtls_zeroize( cmac_ctx->unprocessed_block,\n                     sizeof( cmac_ctx->unprocessed_block ) );\n\n    mbedtls_zeroize( state, MBEDTLS_CIPHER_BLKSIZE_MAX );\n    return( ret );\n}\n\nint mbedtls_cipher_cmac_reset( mbedtls_cipher_context_t *ctx )\n{\n    mbedtls_cmac_context_t* cmac_ctx;\n\n    if( ctx == NULL || ctx->cipher_info == NULL || ctx->cmac_ctx == NULL )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    cmac_ctx = ctx->cmac_ctx;\n\n    /* Reset the internal state */\n    cmac_ctx->unprocessed_len = 0;\n    mbedtls_zeroize( cmac_ctx->unprocessed_block,\n                     sizeof( cmac_ctx->unprocessed_block ) );\n    mbedtls_zeroize( cmac_ctx->state,\n                     sizeof( cmac_ctx->state ) );\n\n    return( 0 );\n}\n\nint mbedtls_cipher_cmac( const mbedtls_cipher_info_t *cipher_info,\n                         const unsigned char *key, size_t keylen,\n                         const unsigned char *input, size_t ilen,\n                         unsigned char *output )\n{\n    mbedtls_cipher_context_t ctx;\n    int ret;\n\n    if( cipher_info == NULL || key == NULL || input == NULL || output == NULL )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    mbedtls_cipher_init( &ctx );\n\n    if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 )\n        goto exit;\n\n    ret = mbedtls_cipher_cmac_starts( &ctx, key, keylen );\n    if( ret != 0 )\n        goto exit;\n\n    ret = mbedtls_cipher_cmac_update( &ctx, input, ilen );\n    if( ret != 0 )\n        goto exit;\n\n    ret = mbedtls_cipher_cmac_finish( &ctx, output );\n\nexit:\n    mbedtls_cipher_free( &ctx );\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_AES_C)\n/*\n * Implementation of AES-CMAC-PRF-128 defined in RFC 4615\n */\nint mbedtls_aes_cmac_prf_128( const unsigned char *key, size_t key_length,\n                              const unsigned char *input, size_t in_len,\n                              unsigned char *output )\n{\n    int ret;\n    const mbedtls_cipher_info_t *cipher_info;\n    unsigned char zero_key[MBEDTLS_AES_BLOCK_SIZE];\n    unsigned char int_key[MBEDTLS_AES_BLOCK_SIZE];\n\n    if( key == NULL || input == NULL || output == NULL )\n        return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );\n\n    cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_AES_128_ECB );\n    if( cipher_info == NULL )\n    {\n        /* Failing at this point must be due to a build issue */\n        ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;\n        goto exit;\n    }\n\n    if( key_length == MBEDTLS_AES_BLOCK_SIZE )\n    {\n        /* Use key as is */\n        memcpy( int_key, key, MBEDTLS_AES_BLOCK_SIZE );\n    }\n    else\n    {\n        memset( zero_key, 0, MBEDTLS_AES_BLOCK_SIZE );\n\n        ret = mbedtls_cipher_cmac( cipher_info, zero_key, 128, key,\n                                   key_length, int_key );\n        if( ret != 0 )\n            goto exit;\n    }\n\n    ret = mbedtls_cipher_cmac( cipher_info, int_key, 128, input, in_len,\n                               output );\n\nexit:\n    mbedtls_zeroize( int_key, sizeof( int_key ) );\n\n    return( ret );\n}\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_SELF_TEST)\n/*\n * CMAC test data for SP800-38B\n * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CMAC.pdf\n * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/TDES_CMAC.pdf\n *\n * AES-CMAC-PRF-128 test data from RFC 4615\n * https://tools.ietf.org/html/rfc4615#page-4\n */\n\n#define NB_CMAC_TESTS_PER_KEY 4\n#define NB_PRF_TESTS 3\n\n#if defined(MBEDTLS_AES_C) || defined(MBEDTLS_DES_C)\n/* All CMAC test inputs are truncated from the same 64 byte buffer. */\nstatic const unsigned char test_message[] = {\n    /* PT */\n    0x6b, 0xc1, 0xbe, 0xe2,     0x2e, 0x40, 0x9f, 0x96,\n    0xe9, 0x3d, 0x7e, 0x11,     0x73, 0x93, 0x17, 0x2a,\n    0xae, 0x2d, 0x8a, 0x57,     0x1e, 0x03, 0xac, 0x9c,\n    0x9e, 0xb7, 0x6f, 0xac,     0x45, 0xaf, 0x8e, 0x51,\n    0x30, 0xc8, 0x1c, 0x46,     0xa3, 0x5c, 0xe4, 0x11,\n    0xe5, 0xfb, 0xc1, 0x19,     0x1a, 0x0a, 0x52, 0xef,\n    0xf6, 0x9f, 0x24, 0x45,     0xdf, 0x4f, 0x9b, 0x17,\n    0xad, 0x2b, 0x41, 0x7b,     0xe6, 0x6c, 0x37, 0x10\n};\n#endif /* MBEDTLS_AES_C || MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_AES_C)\n/* Truncation point of message for AES CMAC tests  */\nstatic const  unsigned int  aes_message_lengths[NB_CMAC_TESTS_PER_KEY] = {\n    /* Mlen */\n    0,\n    16,\n    20,\n    64\n};\n\n/* CMAC-AES128 Test Data */\nstatic const unsigned char aes_128_key[16] = {\n    0x2b, 0x7e, 0x15, 0x16,     0x28, 0xae, 0xd2, 0xa6,\n    0xab, 0xf7, 0x15, 0x88,     0x09, 0xcf, 0x4f, 0x3c\n};\nstatic const unsigned char aes_128_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {\n    {\n        /* K1 */\n        0xfb, 0xee, 0xd6, 0x18,     0x35, 0x71, 0x33, 0x66,\n        0x7c, 0x85, 0xe0, 0x8f,     0x72, 0x36, 0xa8, 0xde\n    },\n    {\n        /* K2 */\n        0xf7, 0xdd, 0xac, 0x30,     0x6a, 0xe2, 0x66, 0xcc,\n        0xf9, 0x0b, 0xc1, 0x1e,     0xe4, 0x6d, 0x51, 0x3b\n    }\n};\nstatic const unsigned char aes_128_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {\n    {\n        /* Example #1 */\n        0xbb, 0x1d, 0x69, 0x29,     0xe9, 0x59, 0x37, 0x28,\n        0x7f, 0xa3, 0x7d, 0x12,     0x9b, 0x75, 0x67, 0x46\n    },\n    {\n        /* Example #2 */\n        0x07, 0x0a, 0x16, 0xb4,     0x6b, 0x4d, 0x41, 0x44,\n        0xf7, 0x9b, 0xdd, 0x9d,     0xd0, 0x4a, 0x28, 0x7c\n    },\n    {\n        /* Example #3 */\n        0x7d, 0x85, 0x44, 0x9e,     0xa6, 0xea, 0x19, 0xc8,\n        0x23, 0xa7, 0xbf, 0x78,     0x83, 0x7d, 0xfa, 0xde\n    },\n    {\n        /* Example #4 */\n        0x51, 0xf0, 0xbe, 0xbf,     0x7e, 0x3b, 0x9d, 0x92,\n        0xfc, 0x49, 0x74, 0x17,     0x79, 0x36, 0x3c, 0xfe\n    }\n};\n\n/* CMAC-AES192 Test Data */\nstatic const unsigned char aes_192_key[24] = {\n    0x8e, 0x73, 0xb0, 0xf7,     0xda, 0x0e, 0x64, 0x52,\n    0xc8, 0x10, 0xf3, 0x2b,     0x80, 0x90, 0x79, 0xe5,\n    0x62, 0xf8, 0xea, 0xd2,     0x52, 0x2c, 0x6b, 0x7b\n};\nstatic const unsigned char aes_192_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {\n    {\n        /* K1 */\n        0x44, 0x8a, 0x5b, 0x1c,     0x93, 0x51, 0x4b, 0x27,\n        0x3e, 0xe6, 0x43, 0x9d,     0xd4, 0xda, 0xa2, 0x96\n    },\n    {\n        /* K2 */\n        0x89, 0x14, 0xb6, 0x39,     0x26, 0xa2, 0x96, 0x4e,\n        0x7d, 0xcc, 0x87, 0x3b,     0xa9, 0xb5, 0x45, 0x2c\n    }\n};\nstatic const unsigned char aes_192_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {\n    {\n        /* Example #1 */\n        0xd1, 0x7d, 0xdf, 0x46,     0xad, 0xaa, 0xcd, 0xe5,\n        0x31, 0xca, 0xc4, 0x83,     0xde, 0x7a, 0x93, 0x67\n    },\n    {\n        /* Example #2 */\n        0x9e, 0x99, 0xa7, 0xbf,     0x31, 0xe7, 0x10, 0x90,\n        0x06, 0x62, 0xf6, 0x5e,     0x61, 0x7c, 0x51, 0x84\n    },\n    {\n        /* Example #3 */\n        0x3d, 0x75, 0xc1, 0x94,     0xed, 0x96, 0x07, 0x04,\n        0x44, 0xa9, 0xfa, 0x7e,     0xc7, 0x40, 0xec, 0xf8\n    },\n    {\n        /* Example #4 */\n        0xa1, 0xd5, 0xdf, 0x0e,     0xed, 0x79, 0x0f, 0x79,\n        0x4d, 0x77, 0x58, 0x96,     0x59, 0xf3, 0x9a, 0x11\n    }\n};\n\n/* CMAC-AES256 Test Data */\nstatic const unsigned char aes_256_key[32] = {\n    0x60, 0x3d, 0xeb, 0x10,     0x15, 0xca, 0x71, 0xbe,\n    0x2b, 0x73, 0xae, 0xf0,     0x85, 0x7d, 0x77, 0x81,\n    0x1f, 0x35, 0x2c, 0x07,     0x3b, 0x61, 0x08, 0xd7,\n    0x2d, 0x98, 0x10, 0xa3,     0x09, 0x14, 0xdf, 0xf4\n};\nstatic const unsigned char aes_256_subkeys[2][MBEDTLS_AES_BLOCK_SIZE] = {\n    {\n        /* K1 */\n        0xca, 0xd1, 0xed, 0x03,     0x29, 0x9e, 0xed, 0xac,\n        0x2e, 0x9a, 0x99, 0x80,     0x86, 0x21, 0x50, 0x2f\n    },\n    {\n        /* K2 */\n        0x95, 0xa3, 0xda, 0x06,     0x53, 0x3d, 0xdb, 0x58,\n        0x5d, 0x35, 0x33, 0x01,     0x0c, 0x42, 0xa0, 0xd9\n    }\n};\nstatic const unsigned char aes_256_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_AES_BLOCK_SIZE] = {\n    {\n        /* Example #1 */\n        0x02, 0x89, 0x62, 0xf6,     0x1b, 0x7b, 0xf8, 0x9e,\n        0xfc, 0x6b, 0x55, 0x1f,     0x46, 0x67, 0xd9, 0x83\n    },\n    {\n        /* Example #2 */\n        0x28, 0xa7, 0x02, 0x3f,     0x45, 0x2e, 0x8f, 0x82,\n        0xbd, 0x4b, 0xf2, 0x8d,     0x8c, 0x37, 0xc3, 0x5c\n    },\n    {\n        /* Example #3 */\n        0x15, 0x67, 0x27, 0xdc,     0x08, 0x78, 0x94, 0x4a,\n        0x02, 0x3c, 0x1f, 0xe0,     0x3b, 0xad, 0x6d, 0x93\n    },\n    {\n        /* Example #4 */\n        0xe1, 0x99, 0x21, 0x90,     0x54, 0x9f, 0x6e, 0xd5,\n        0x69, 0x6a, 0x2c, 0x05,     0x6c, 0x31, 0x54, 0x10\n    }\n};\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_DES_C)\n/* Truncation point of message for 3DES CMAC tests  */\nstatic const unsigned int des3_message_lengths[NB_CMAC_TESTS_PER_KEY] = {\n    0,\n    16,\n    20,\n    32\n};\n\n/* CMAC-TDES (Generation) - 2 Key Test Data */\nstatic const unsigned char des3_2key_key[24] = {\n    /* Key1 */\n    0x01, 0x23, 0x45, 0x67,     0x89, 0xab, 0xcd, 0xef,\n    /* Key2 */\n    0x23, 0x45, 0x67, 0x89,     0xab, 0xcd, 0xEF, 0x01,\n    /* Key3 */\n    0x01, 0x23, 0x45, 0x67,     0x89, 0xab, 0xcd, 0xef\n};\nstatic const unsigned char des3_2key_subkeys[2][8] = {\n    {\n        /* K1 */\n        0x0d, 0xd2, 0xcb, 0x7a,     0x3d, 0x88, 0x88, 0xd9\n    },\n    {\n        /* K2 */\n        0x1b, 0xa5, 0x96, 0xf4,     0x7b, 0x11, 0x11, 0xb2\n    }\n};\nstatic const unsigned char des3_2key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = {\n    {\n        /* Sample #1 */\n        0x79, 0xce, 0x52, 0xa7,     0xf7, 0x86, 0xa9, 0x60\n    },\n    {\n        /* Sample #2 */\n        0xcc, 0x18, 0xa0, 0xb7,     0x9a, 0xf2, 0x41, 0x3b\n    },\n    {\n        /* Sample #3 */\n        0xc0, 0x6d, 0x37, 0x7e,     0xcd, 0x10, 0x19, 0x69\n    },\n    {\n        /* Sample #4 */\n        0x9c, 0xd3, 0x35, 0x80,     0xf9, 0xb6, 0x4d, 0xfb\n    }\n};\n\n/* CMAC-TDES (Generation) - 3 Key Test Data */\nstatic const unsigned char des3_3key_key[24] = {\n    /* Key1 */\n    0x01, 0x23, 0x45, 0x67,     0x89, 0xaa, 0xcd, 0xef,\n    /* Key2 */\n    0x23, 0x45, 0x67, 0x89,     0xab, 0xcd, 0xef, 0x01,\n    /* Key3 */\n    0x45, 0x67, 0x89, 0xab,     0xcd, 0xef, 0x01, 0x23\n};\nstatic const unsigned char des3_3key_subkeys[2][8] = {\n    {\n        /* K1 */\n        0x9d, 0x74, 0xe7, 0x39,     0x33, 0x17, 0x96, 0xc0\n    },\n    {\n        /* K2 */\n        0x3a, 0xe9, 0xce, 0x72,     0x66, 0x2f, 0x2d, 0x9b\n    }\n};\nstatic const unsigned char des3_3key_expected_result[NB_CMAC_TESTS_PER_KEY][MBEDTLS_DES3_BLOCK_SIZE] = {\n    {\n        /* Sample #1 */\n        0x7d, 0xb0, 0xd3, 0x7d,     0xf9, 0x36, 0xc5, 0x50\n    },\n    {\n        /* Sample #2 */\n        0x30, 0x23, 0x9c, 0xf1,     0xf5, 0x2e, 0x66, 0x09\n    },\n    {\n        /* Sample #3 */\n        0x6c, 0x9f, 0x3e, 0xe4,     0x92, 0x3f, 0x6b, 0xe2\n    },\n    {\n        /* Sample #4 */\n        0x99, 0x42, 0x9b, 0xd0,     0xbF, 0x79, 0x04, 0xe5\n    }\n};\n\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_AES_C)\n/* AES AES-CMAC-PRF-128 Test Data */\nstatic const unsigned char PRFK[] = {\n    /* Key */\n    0x00, 0x01, 0x02, 0x03,     0x04, 0x05, 0x06, 0x07,\n    0x08, 0x09, 0x0a, 0x0b,     0x0c, 0x0d, 0x0e, 0x0f,\n    0xed, 0xcb\n};\n\n/* Sizes in bytes */\nstatic const size_t PRFKlen[NB_PRF_TESTS] = {\n    18,\n    16,\n    10\n};\n\n/* Message */\nstatic const unsigned char PRFM[] = {\n    0x00, 0x01, 0x02, 0x03,     0x04, 0x05, 0x06, 0x07,\n    0x08, 0x09, 0x0a, 0x0b,     0x0c, 0x0d, 0x0e, 0x0f,\n    0x10, 0x11, 0x12, 0x13\n};\n\nstatic const unsigned char PRFT[NB_PRF_TESTS][16] = {\n    {\n        0x84, 0xa3, 0x48, 0xa4,     0xa4, 0x5d, 0x23, 0x5b,\n        0xab, 0xff, 0xfc, 0x0d,     0x2b, 0x4d, 0xa0, 0x9a\n    },\n    {\n        0x98, 0x0a, 0xe8, 0x7b,     0x5f, 0x4c, 0x9c, 0x52,\n        0x14, 0xf5, 0xb6, 0xa8,     0x45, 0x5e, 0x4c, 0x2d\n    },\n    {\n        0x29, 0x0d, 0x9e, 0x11,     0x2e, 0xdb, 0x09, 0xee,\n        0x14, 0x1f, 0xcf, 0x64,     0xc0, 0xb7, 0x2f, 0x3d\n    }\n};\n#endif /* MBEDTLS_AES_C */\n\nstatic int cmac_test_subkeys( int verbose,\n                              const char* testname,\n                              const unsigned char* key,\n                              int keybits,\n                              const unsigned char* subkeys,\n                              mbedtls_cipher_type_t cipher_type,\n                              int block_size,\n                              int num_tests )\n{\n    int i, ret;\n    mbedtls_cipher_context_t ctx;\n    const mbedtls_cipher_info_t *cipher_info;\n    unsigned char K1[MBEDTLS_CIPHER_BLKSIZE_MAX];\n    unsigned char K2[MBEDTLS_CIPHER_BLKSIZE_MAX];\n\n    cipher_info = mbedtls_cipher_info_from_type( cipher_type );\n    if( cipher_info == NULL )\n    {\n        /* Failing at this point must be due to a build issue */\n        return( MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE );\n    }\n\n    for( i = 0; i < num_tests; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  %s CMAC subkey #%u: \", testname, i + 1 );\n\n        mbedtls_cipher_init( &ctx );\n\n        if( ( ret = mbedtls_cipher_setup( &ctx, cipher_info ) ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"test execution failed\\n\" );\n\n            goto cleanup;\n        }\n\n        if( ( ret = mbedtls_cipher_setkey( &ctx, key, keybits,\n                                       MBEDTLS_ENCRYPT ) ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"test execution failed\\n\" );\n\n            goto cleanup;\n        }\n\n        ret = cmac_generate_subkeys( &ctx, K1, K2 );\n        if( ret != 0 )\n        {\n           if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            goto cleanup;\n        }\n\n        if( ( ret = memcmp( K1, subkeys, block_size ) ) != 0  ||\n            ( ret = memcmp( K2, &subkeys[block_size], block_size ) ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            goto cleanup;\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n\n        mbedtls_cipher_free( &ctx );\n    }\n\n    goto exit;\n\ncleanup:\n    mbedtls_cipher_free( &ctx );\n\nexit:\n    return( ret );\n}\n\nstatic int cmac_test_wth_cipher( int verbose,\n                                 const char* testname,\n                                 const unsigned char* key,\n                                 int keybits,\n                                 const unsigned char* messages,\n                                 const unsigned int message_lengths[4],\n                                 const unsigned char* expected_result,\n                                 mbedtls_cipher_type_t cipher_type,\n                                 int block_size,\n                                 int num_tests )\n{\n    const mbedtls_cipher_info_t *cipher_info;\n    int i, ret;\n    unsigned char output[MBEDTLS_CIPHER_BLKSIZE_MAX];\n\n    cipher_info = mbedtls_cipher_info_from_type( cipher_type );\n    if( cipher_info == NULL )\n    {\n        /* Failing at this point must be due to a build issue */\n        ret = MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE;\n        goto exit;\n    }\n\n    for( i = 0; i < num_tests; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  %s CMAC #%u: \", testname, i + 1 );\n\n        if( ( ret = mbedtls_cipher_cmac( cipher_info, key, keybits, messages,\n                                         message_lengths[i], output ) ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n            goto exit;\n        }\n\n        if( ( ret = memcmp( output, &expected_result[i * block_size], block_size ) ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n            goto exit;\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\nexit:\n    return( ret );\n}\n\n#if defined(MBEDTLS_AES_C)\nstatic int test_aes128_cmac_prf( int verbose )\n{\n    int i;\n    int ret;\n    unsigned char output[MBEDTLS_AES_BLOCK_SIZE];\n\n    for( i = 0; i < NB_PRF_TESTS; i++ )\n    {\n        mbedtls_printf( \"  AES CMAC 128 PRF #%u: \", i );\n        ret = mbedtls_aes_cmac_prf_128( PRFK, PRFKlen[i], PRFM, 20, output );\n        if( ret != 0 ||\n            memcmp( output, PRFT[i], MBEDTLS_AES_BLOCK_SIZE ) != 0 )\n        {\n\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            return( ret );\n        }\n        else if( verbose != 0 )\n        {\n            mbedtls_printf( \"passed\\n\" );\n        }\n    }\n    return( ret );\n}\n#endif /* MBEDTLS_AES_C */\n\nint mbedtls_cmac_self_test( int verbose )\n{\n    int ret;\n\n#if defined(MBEDTLS_AES_C)\n    /* AES-128 */\n    if( ( ret = cmac_test_subkeys( verbose,\n                                   \"AES 128\",\n                                   aes_128_key,\n                                   128,\n                                   (const unsigned char*)aes_128_subkeys,\n                                   MBEDTLS_CIPHER_AES_128_ECB,\n                                   MBEDTLS_AES_BLOCK_SIZE,\n                                   NB_CMAC_TESTS_PER_KEY ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( ( ret = cmac_test_wth_cipher( verbose,\n                                      \"AES 128\",\n                                      aes_128_key,\n                                      128,\n                                      test_message,\n                                      aes_message_lengths,\n                                      (const unsigned char*)aes_128_expected_result,\n                                      MBEDTLS_CIPHER_AES_128_ECB,\n                                      MBEDTLS_AES_BLOCK_SIZE,\n                                      NB_CMAC_TESTS_PER_KEY ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    /* AES-192 */\n    if( ( ret = cmac_test_subkeys( verbose,\n                                   \"AES 192\",\n                                   aes_192_key,\n                                   192,\n                                   (const unsigned char*)aes_192_subkeys,\n                                   MBEDTLS_CIPHER_AES_192_ECB,\n                                   MBEDTLS_AES_BLOCK_SIZE,\n                                   NB_CMAC_TESTS_PER_KEY ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( ( ret = cmac_test_wth_cipher( verbose,\n                                      \"AES 192\",\n                                      aes_192_key,\n                                      192,\n                                      test_message,\n                                      aes_message_lengths,\n                                      (const unsigned char*)aes_192_expected_result,\n                                      MBEDTLS_CIPHER_AES_192_ECB,\n                                      MBEDTLS_AES_BLOCK_SIZE,\n                                      NB_CMAC_TESTS_PER_KEY ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    /* AES-256 */\n    if( ( ret = cmac_test_subkeys( verbose,\n                                   \"AES 256\",\n                                   aes_256_key,\n                                   256,\n                                   (const unsigned char*)aes_256_subkeys,\n                                   MBEDTLS_CIPHER_AES_256_ECB,\n                                   MBEDTLS_AES_BLOCK_SIZE,\n                                   NB_CMAC_TESTS_PER_KEY ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( ( ret = cmac_test_wth_cipher ( verbose,\n                                       \"AES 256\",\n                                       aes_256_key,\n                                       256,\n                                       test_message,\n                                       aes_message_lengths,\n                                       (const unsigned char*)aes_256_expected_result,\n                                       MBEDTLS_CIPHER_AES_256_ECB,\n                                       MBEDTLS_AES_BLOCK_SIZE,\n                                       NB_CMAC_TESTS_PER_KEY ) ) != 0 )\n    {\n        return( ret );\n    }\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_DES_C)\n    /* 3DES 2 key */\n    if( ( ret = cmac_test_subkeys( verbose,\n                                   \"3DES 2 key\",\n                                   des3_2key_key,\n                                   192,\n                                   (const unsigned char*)des3_2key_subkeys,\n                                   MBEDTLS_CIPHER_DES_EDE3_ECB,\n                                   MBEDTLS_DES3_BLOCK_SIZE,\n                                   NB_CMAC_TESTS_PER_KEY ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( ( ret = cmac_test_wth_cipher( verbose,\n                                      \"3DES 2 key\",\n                                      des3_2key_key,\n                                      192,\n                                      test_message,\n                                      des3_message_lengths,\n                                      (const unsigned char*)des3_2key_expected_result,\n                                      MBEDTLS_CIPHER_DES_EDE3_ECB,\n                                      MBEDTLS_DES3_BLOCK_SIZE,\n                                      NB_CMAC_TESTS_PER_KEY ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    /* 3DES 3 key */\n    if( ( ret = cmac_test_subkeys( verbose,\n                                   \"3DES 3 key\",\n                                   des3_3key_key,\n                                   192,\n                                   (const unsigned char*)des3_3key_subkeys,\n                                   MBEDTLS_CIPHER_DES_EDE3_ECB,\n                                   MBEDTLS_DES3_BLOCK_SIZE,\n                                   NB_CMAC_TESTS_PER_KEY ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( ( ret = cmac_test_wth_cipher( verbose,\n                                      \"3DES 3 key\",\n                                      des3_3key_key,\n                                      192,\n                                      test_message,\n                                      des3_message_lengths,\n                                      (const unsigned char*)des3_3key_expected_result,\n                                      MBEDTLS_CIPHER_DES_EDE3_ECB,\n                                      MBEDTLS_DES3_BLOCK_SIZE,\n                                      NB_CMAC_TESTS_PER_KEY ) ) != 0 )\n    {\n        return( ret );\n    }\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_AES_C)\n    if( ( ret = test_aes128_cmac_prf( verbose ) ) != 0 )\n        return( ret );\n#endif /* MBEDTLS_AES_C */\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_CMAC_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ctr_drbg.c",
    "content": "/*\n *  CTR_DRBG implementation based on AES-256 (NIST SP 800-90)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The NIST SP 800-90 DRBGs are described in the following publucation.\n *\n *  http://csrc.nist.gov/publications/nistpubs/800-90/SP800-90revised_March2007.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_CTR_DRBG_C)\n\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_FS_IO)\n#include <stdio.h>\n#endif\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * CTR_DRBG context initialization\n */\nvoid mbedtls_ctr_drbg_init( mbedtls_ctr_drbg_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_ctr_drbg_context ) );\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_init( &ctx->mutex );\n#endif\n}\n\n/*\n * Non-public function wrapped by mbedtls_ctr_drbg_seed(). Necessary to allow\n * NIST tests to succeed (which require known length fixed entropy)\n */\nint mbedtls_ctr_drbg_seed_entropy_len(\n                   mbedtls_ctr_drbg_context *ctx,\n                   int (*f_entropy)(void *, unsigned char *, size_t),\n                   void *p_entropy,\n                   const unsigned char *custom,\n                   size_t len,\n                   size_t entropy_len )\n{\n    int ret;\n    unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE];\n\n    memset( key, 0, MBEDTLS_CTR_DRBG_KEYSIZE );\n\n    mbedtls_aes_init( &ctx->aes_ctx );\n\n    ctx->f_entropy = f_entropy;\n    ctx->p_entropy = p_entropy;\n\n    ctx->entropy_len = entropy_len;\n    ctx->reseed_interval = MBEDTLS_CTR_DRBG_RESEED_INTERVAL;\n\n    /*\n     * Initialize with an empty key\n     */\n    mbedtls_aes_setkey_enc( &ctx->aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS );\n\n    if( ( ret = mbedtls_ctr_drbg_reseed( ctx, custom, len ) ) != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\nint mbedtls_ctr_drbg_seed( mbedtls_ctr_drbg_context *ctx,\n                   int (*f_entropy)(void *, unsigned char *, size_t),\n                   void *p_entropy,\n                   const unsigned char *custom,\n                   size_t len )\n{\n    return( mbedtls_ctr_drbg_seed_entropy_len( ctx, f_entropy, p_entropy, custom, len,\n                                       MBEDTLS_CTR_DRBG_ENTROPY_LEN ) );\n}\n\nvoid mbedtls_ctr_drbg_free( mbedtls_ctr_drbg_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_free( &ctx->mutex );\n#endif\n    mbedtls_aes_free( &ctx->aes_ctx );\n    mbedtls_zeroize( ctx, sizeof( mbedtls_ctr_drbg_context ) );\n}\n\nvoid mbedtls_ctr_drbg_set_prediction_resistance( mbedtls_ctr_drbg_context *ctx, int resistance )\n{\n    ctx->prediction_resistance = resistance;\n}\n\nvoid mbedtls_ctr_drbg_set_entropy_len( mbedtls_ctr_drbg_context *ctx, size_t len )\n{\n    ctx->entropy_len = len;\n}\n\nvoid mbedtls_ctr_drbg_set_reseed_interval( mbedtls_ctr_drbg_context *ctx, int interval )\n{\n    ctx->reseed_interval = interval;\n}\n\nstatic int block_cipher_df( unsigned char *output,\n                            const unsigned char *data, size_t data_len )\n{\n    unsigned char buf[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + MBEDTLS_CTR_DRBG_BLOCKSIZE + 16];\n    unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN];\n    unsigned char key[MBEDTLS_CTR_DRBG_KEYSIZE];\n    unsigned char chain[MBEDTLS_CTR_DRBG_BLOCKSIZE];\n    unsigned char *p, *iv;\n    mbedtls_aes_context aes_ctx;\n\n    int i, j;\n    size_t buf_len, use_len;\n\n    if( data_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT )\n        return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG );\n\n    memset( buf, 0, MBEDTLS_CTR_DRBG_MAX_SEED_INPUT + MBEDTLS_CTR_DRBG_BLOCKSIZE + 16 );\n    mbedtls_aes_init( &aes_ctx );\n\n    /*\n     * Construct IV (16 bytes) and S in buffer\n     * IV = Counter (in 32-bits) padded to 16 with zeroes\n     * S = Length input string (in 32-bits) || Length of output (in 32-bits) ||\n     *     data || 0x80\n     *     (Total is padded to a multiple of 16-bytes with zeroes)\n     */\n    p = buf + MBEDTLS_CTR_DRBG_BLOCKSIZE;\n    *p++ = ( data_len >> 24 ) & 0xff;\n    *p++ = ( data_len >> 16 ) & 0xff;\n    *p++ = ( data_len >> 8  ) & 0xff;\n    *p++ = ( data_len       ) & 0xff;\n    p += 3;\n    *p++ = MBEDTLS_CTR_DRBG_SEEDLEN;\n    memcpy( p, data, data_len );\n    p[data_len] = 0x80;\n\n    buf_len = MBEDTLS_CTR_DRBG_BLOCKSIZE + 8 + data_len + 1;\n\n    for( i = 0; i < MBEDTLS_CTR_DRBG_KEYSIZE; i++ )\n        key[i] = i;\n\n    mbedtls_aes_setkey_enc( &aes_ctx, key, MBEDTLS_CTR_DRBG_KEYBITS );\n\n    /*\n     * Reduce data to MBEDTLS_CTR_DRBG_SEEDLEN bytes of data\n     */\n    for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE )\n    {\n        p = buf;\n        memset( chain, 0, MBEDTLS_CTR_DRBG_BLOCKSIZE );\n        use_len = buf_len;\n\n        while( use_len > 0 )\n        {\n            for( i = 0; i < MBEDTLS_CTR_DRBG_BLOCKSIZE; i++ )\n                chain[i] ^= p[i];\n            p += MBEDTLS_CTR_DRBG_BLOCKSIZE;\n            use_len -= ( use_len >= MBEDTLS_CTR_DRBG_BLOCKSIZE ) ?\n                       MBEDTLS_CTR_DRBG_BLOCKSIZE : use_len;\n\n            mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, chain, chain );\n        }\n\n        memcpy( tmp + j, chain, MBEDTLS_CTR_DRBG_BLOCKSIZE );\n\n        /*\n         * Update IV\n         */\n        buf[3]++;\n    }\n\n    /*\n     * Do final encryption with reduced data\n     */\n    mbedtls_aes_setkey_enc( &aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS );\n    iv = tmp + MBEDTLS_CTR_DRBG_KEYSIZE;\n    p = output;\n\n    for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE )\n    {\n        mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, iv, iv );\n        memcpy( p, iv, MBEDTLS_CTR_DRBG_BLOCKSIZE );\n        p += MBEDTLS_CTR_DRBG_BLOCKSIZE;\n    }\n\n    mbedtls_aes_free( &aes_ctx );\n\n    return( 0 );\n}\n\nstatic int ctr_drbg_update_internal( mbedtls_ctr_drbg_context *ctx,\n                              const unsigned char data[MBEDTLS_CTR_DRBG_SEEDLEN] )\n{\n    unsigned char tmp[MBEDTLS_CTR_DRBG_SEEDLEN];\n    unsigned char *p = tmp;\n    int i, j;\n\n    memset( tmp, 0, MBEDTLS_CTR_DRBG_SEEDLEN );\n\n    for( j = 0; j < MBEDTLS_CTR_DRBG_SEEDLEN; j += MBEDTLS_CTR_DRBG_BLOCKSIZE )\n    {\n        /*\n         * Increase counter\n         */\n        for( i = MBEDTLS_CTR_DRBG_BLOCKSIZE; i > 0; i-- )\n            if( ++ctx->counter[i - 1] != 0 )\n                break;\n\n        /*\n         * Crypt counter block\n         */\n        mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, p );\n\n        p += MBEDTLS_CTR_DRBG_BLOCKSIZE;\n    }\n\n    for( i = 0; i < MBEDTLS_CTR_DRBG_SEEDLEN; i++ )\n        tmp[i] ^= data[i];\n\n    /*\n     * Update key and counter\n     */\n    mbedtls_aes_setkey_enc( &ctx->aes_ctx, tmp, MBEDTLS_CTR_DRBG_KEYBITS );\n    memcpy( ctx->counter, tmp + MBEDTLS_CTR_DRBG_KEYSIZE, MBEDTLS_CTR_DRBG_BLOCKSIZE );\n\n    return( 0 );\n}\n\nvoid mbedtls_ctr_drbg_update( mbedtls_ctr_drbg_context *ctx,\n                      const unsigned char *additional, size_t add_len )\n{\n    unsigned char add_input[MBEDTLS_CTR_DRBG_SEEDLEN];\n\n    if( add_len > 0 )\n    {\n        /* MAX_INPUT would be more logical here, but we have to match\n         * block_cipher_df()'s limits since we can't propagate errors */\n        if( add_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT )\n            add_len = MBEDTLS_CTR_DRBG_MAX_SEED_INPUT;\n\n        block_cipher_df( add_input, additional, add_len );\n        ctr_drbg_update_internal( ctx, add_input );\n    }\n}\n\nint mbedtls_ctr_drbg_reseed( mbedtls_ctr_drbg_context *ctx,\n                     const unsigned char *additional, size_t len )\n{\n    unsigned char seed[MBEDTLS_CTR_DRBG_MAX_SEED_INPUT];\n    size_t seedlen = 0;\n\n    if( ctx->entropy_len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT ||\n        len > MBEDTLS_CTR_DRBG_MAX_SEED_INPUT - ctx->entropy_len )\n        return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG );\n\n    memset( seed, 0, MBEDTLS_CTR_DRBG_MAX_SEED_INPUT );\n\n    /*\n     * Gather entropy_len bytes of entropy to seed state\n     */\n    if( 0 != ctx->f_entropy( ctx->p_entropy, seed,\n                             ctx->entropy_len ) )\n    {\n        return( MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED );\n    }\n\n    seedlen += ctx->entropy_len;\n\n    /*\n     * Add additional data\n     */\n    if( additional && len )\n    {\n        memcpy( seed + seedlen, additional, len );\n        seedlen += len;\n    }\n\n    /*\n     * Reduce to 384 bits\n     */\n    block_cipher_df( seed, seed, seedlen );\n\n    /*\n     * Update state\n     */\n    ctr_drbg_update_internal( ctx, seed );\n    ctx->reseed_counter = 1;\n\n    return( 0 );\n}\n\nint mbedtls_ctr_drbg_random_with_add( void *p_rng,\n                              unsigned char *output, size_t output_len,\n                              const unsigned char *additional, size_t add_len )\n{\n    int ret = 0;\n    mbedtls_ctr_drbg_context *ctx = (mbedtls_ctr_drbg_context *) p_rng;\n    unsigned char add_input[MBEDTLS_CTR_DRBG_SEEDLEN];\n    unsigned char *p = output;\n    unsigned char tmp[MBEDTLS_CTR_DRBG_BLOCKSIZE];\n    int i;\n    size_t use_len;\n\n    if( output_len > MBEDTLS_CTR_DRBG_MAX_REQUEST )\n        return( MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG );\n\n    if( add_len > MBEDTLS_CTR_DRBG_MAX_INPUT )\n        return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG );\n\n    memset( add_input, 0, MBEDTLS_CTR_DRBG_SEEDLEN );\n\n    if( ctx->reseed_counter > ctx->reseed_interval ||\n        ctx->prediction_resistance )\n    {\n        if( ( ret = mbedtls_ctr_drbg_reseed( ctx, additional, add_len ) ) != 0 )\n            return( ret );\n\n        add_len = 0;\n    }\n\n    if( add_len > 0 )\n    {\n        block_cipher_df( add_input, additional, add_len );\n        ctr_drbg_update_internal( ctx, add_input );\n    }\n\n    while( output_len > 0 )\n    {\n        /*\n         * Increase counter\n         */\n        for( i = MBEDTLS_CTR_DRBG_BLOCKSIZE; i > 0; i-- )\n            if( ++ctx->counter[i - 1] != 0 )\n                break;\n\n        /*\n         * Crypt counter block\n         */\n        mbedtls_aes_crypt_ecb( &ctx->aes_ctx, MBEDTLS_AES_ENCRYPT, ctx->counter, tmp );\n\n        use_len = ( output_len > MBEDTLS_CTR_DRBG_BLOCKSIZE ) ? MBEDTLS_CTR_DRBG_BLOCKSIZE :\n                                                       output_len;\n        /*\n         * Copy random block to destination\n         */\n        memcpy( p, tmp, use_len );\n        p += use_len;\n        output_len -= use_len;\n    }\n\n    ctr_drbg_update_internal( ctx, add_input );\n\n    ctx->reseed_counter++;\n\n    return( 0 );\n}\n\nint mbedtls_ctr_drbg_random( void *p_rng, unsigned char *output, size_t output_len )\n{\n    int ret;\n    mbedtls_ctr_drbg_context *ctx = (mbedtls_ctr_drbg_context *) p_rng;\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    ret = mbedtls_ctr_drbg_random_with_add( ctx, output, output_len, NULL, 0 );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_FS_IO)\nint mbedtls_ctr_drbg_write_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path )\n{\n    int ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR;\n    FILE *f;\n    unsigned char buf[ MBEDTLS_CTR_DRBG_MAX_INPUT ];\n\n    if( ( f = fopen( path, \"wb\" ) ) == NULL )\n        return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR );\n\n    if( ( ret = mbedtls_ctr_drbg_random( ctx, buf, MBEDTLS_CTR_DRBG_MAX_INPUT ) ) != 0 )\n        goto exit;\n\n    if( fwrite( buf, 1, MBEDTLS_CTR_DRBG_MAX_INPUT, f ) != MBEDTLS_CTR_DRBG_MAX_INPUT )\n    {\n        ret = MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR;\n        goto exit;\n    }\n\n    ret = 0;\n\nexit:\n    fclose( f );\n    return( ret );\n}\n\nint mbedtls_ctr_drbg_update_seed_file( mbedtls_ctr_drbg_context *ctx, const char *path )\n{\n    FILE *f;\n    size_t n;\n    unsigned char buf[ MBEDTLS_CTR_DRBG_MAX_INPUT ];\n\n    if( ( f = fopen( path, \"rb\" ) ) == NULL )\n        return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR );\n\n    fseek( f, 0, SEEK_END );\n    n = (size_t) ftell( f );\n    fseek( f, 0, SEEK_SET );\n\n    if( n > MBEDTLS_CTR_DRBG_MAX_INPUT )\n    {\n        fclose( f );\n        return( MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG );\n    }\n\n    if( fread( buf, 1, n, f ) != n )\n    {\n        fclose( f );\n        return( MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR );\n    }\n\n    fclose( f );\n\n    mbedtls_ctr_drbg_update( ctx, buf, n );\n\n    return( mbedtls_ctr_drbg_write_seed_file( ctx, path ) );\n}\n#endif /* MBEDTLS_FS_IO */\n\n#if defined(MBEDTLS_SELF_TEST)\n\nstatic const unsigned char entropy_source_pr[96] =\n    { 0xc1, 0x80, 0x81, 0xa6, 0x5d, 0x44, 0x02, 0x16,\n      0x19, 0xb3, 0xf1, 0x80, 0xb1, 0xc9, 0x20, 0x02,\n      0x6a, 0x54, 0x6f, 0x0c, 0x70, 0x81, 0x49, 0x8b,\n      0x6e, 0xa6, 0x62, 0x52, 0x6d, 0x51, 0xb1, 0xcb,\n      0x58, 0x3b, 0xfa, 0xd5, 0x37, 0x5f, 0xfb, 0xc9,\n      0xff, 0x46, 0xd2, 0x19, 0xc7, 0x22, 0x3e, 0x95,\n      0x45, 0x9d, 0x82, 0xe1, 0xe7, 0x22, 0x9f, 0x63,\n      0x31, 0x69, 0xd2, 0x6b, 0x57, 0x47, 0x4f, 0xa3,\n      0x37, 0xc9, 0x98, 0x1c, 0x0b, 0xfb, 0x91, 0x31,\n      0x4d, 0x55, 0xb9, 0xe9, 0x1c, 0x5a, 0x5e, 0xe4,\n      0x93, 0x92, 0xcf, 0xc5, 0x23, 0x12, 0xd5, 0x56,\n      0x2c, 0x4a, 0x6e, 0xff, 0xdc, 0x10, 0xd0, 0x68 };\n\nstatic const unsigned char entropy_source_nopr[64] =\n    { 0x5a, 0x19, 0x4d, 0x5e, 0x2b, 0x31, 0x58, 0x14,\n      0x54, 0xde, 0xf6, 0x75, 0xfb, 0x79, 0x58, 0xfe,\n      0xc7, 0xdb, 0x87, 0x3e, 0x56, 0x89, 0xfc, 0x9d,\n      0x03, 0x21, 0x7c, 0x68, 0xd8, 0x03, 0x38, 0x20,\n      0xf9, 0xe6, 0x5e, 0x04, 0xd8, 0x56, 0xf3, 0xa9,\n      0xc4, 0x4a, 0x4c, 0xbd, 0xc1, 0xd0, 0x08, 0x46,\n      0xf5, 0x98, 0x3d, 0x77, 0x1c, 0x1b, 0x13, 0x7e,\n      0x4e, 0x0f, 0x9d, 0x8e, 0xf4, 0x09, 0xf9, 0x2e };\n\nstatic const unsigned char nonce_pers_pr[16] =\n    { 0xd2, 0x54, 0xfc, 0xff, 0x02, 0x1e, 0x69, 0xd2,\n      0x29, 0xc9, 0xcf, 0xad, 0x85, 0xfa, 0x48, 0x6c };\n\nstatic const unsigned char nonce_pers_nopr[16] =\n    { 0x1b, 0x54, 0xb8, 0xff, 0x06, 0x42, 0xbf, 0xf5,\n      0x21, 0xf1, 0x5c, 0x1c, 0x0b, 0x66, 0x5f, 0x3f };\n\nstatic const unsigned char result_pr[16] =\n    { 0x34, 0x01, 0x16, 0x56, 0xb4, 0x29, 0x00, 0x8f,\n      0x35, 0x63, 0xec, 0xb5, 0xf2, 0x59, 0x07, 0x23 };\n\nstatic const unsigned char result_nopr[16] =\n    { 0xa0, 0x54, 0x30, 0x3d, 0x8a, 0x7e, 0xa9, 0x88,\n      0x9d, 0x90, 0x3e, 0x07, 0x7c, 0x6f, 0x21, 0x8f };\n\nstatic size_t test_offset;\nstatic int ctr_drbg_self_test_entropy( void *data, unsigned char *buf,\n                                       size_t len )\n{\n    const unsigned char *p = data;\n    memcpy( buf, p + test_offset, len );\n    test_offset += len;\n    return( 0 );\n}\n\n#define CHK( c )    if( (c) != 0 )                          \\\n                    {                                       \\\n                        if( verbose != 0 )                  \\\n                            mbedtls_printf( \"failed\\n\" );  \\\n                        return( 1 );                        \\\n                    }\n\n/*\n * Checkup routine\n */\nint mbedtls_ctr_drbg_self_test( int verbose )\n{\n    mbedtls_ctr_drbg_context ctx;\n    unsigned char buf[16];\n\n    mbedtls_ctr_drbg_init( &ctx );\n\n    /*\n     * Based on a NIST CTR_DRBG test vector (PR = True)\n     */\n    if( verbose != 0 )\n        mbedtls_printf( \"  CTR_DRBG (PR = TRUE) : \" );\n\n    test_offset = 0;\n    CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy,\n                                (void *) entropy_source_pr, nonce_pers_pr, 16, 32 ) );\n    mbedtls_ctr_drbg_set_prediction_resistance( &ctx, MBEDTLS_CTR_DRBG_PR_ON );\n    CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );\n    CHK( mbedtls_ctr_drbg_random( &ctx, buf, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );\n    CHK( memcmp( buf, result_pr, MBEDTLS_CTR_DRBG_BLOCKSIZE ) );\n\n    mbedtls_ctr_drbg_free( &ctx );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    /*\n     * Based on a NIST CTR_DRBG test vector (PR = FALSE)\n     */\n    if( verbose != 0 )\n        mbedtls_printf( \"  CTR_DRBG (PR = FALSE): \" );\n\n    mbedtls_ctr_drbg_init( &ctx );\n\n    test_offset = 0;\n    CHK( mbedtls_ctr_drbg_seed_entropy_len( &ctx, ctr_drbg_self_test_entropy,\n                            (void *) entropy_source_nopr, nonce_pers_nopr, 16, 32 ) );\n    CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) );\n    CHK( mbedtls_ctr_drbg_reseed( &ctx, NULL, 0 ) );\n    CHK( mbedtls_ctr_drbg_random( &ctx, buf, 16 ) );\n    CHK( memcmp( buf, result_nopr, 16 ) );\n\n    mbedtls_ctr_drbg_free( &ctx );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    if( verbose != 0 )\n            mbedtls_printf( \"\\n\" );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/debug.c",
    "content": "/*\n *  Debugging routines\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_DEBUG_C)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc      calloc\n#define mbedtls_free        free\n#define mbedtls_time_t      time_t\n#define mbedtls_snprintf    snprintf\n#endif\n\n#include \"mbedtls/debug.h\"\n\n#include <stdarg.h>\n#include <stdio.h>\n#include <string.h>\n\n#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \\\n    !defined(inline) && !defined(__cplusplus)\n#define inline __inline\n#endif\n\n#define DEBUG_BUF_SIZE      512\n\nstatic int debug_threshold = 0;\n\nvoid mbedtls_debug_set_threshold( int threshold )\n{\n    debug_threshold = threshold;\n}\n\n/*\n * All calls to f_dbg must be made via this function\n */\nstatic inline void debug_send_line( const mbedtls_ssl_context *ssl, int level,\n                                    const char *file, int line,\n                                    const char *str )\n{\n    /*\n     * If in a threaded environment, we need a thread identifier.\n     * Since there is no portable way to get one, use the address of the ssl\n     * context instead, as it shouldn't be shared between threads.\n     */\n#if defined(MBEDTLS_THREADING_C)\n    char idstr[20 + DEBUG_BUF_SIZE]; /* 0x + 16 nibbles + ': ' */\n    mbedtls_snprintf( idstr, sizeof( idstr ), \"%p: %s\", (void*)ssl, str );\n    ssl->conf->f_dbg( ssl->conf->p_dbg, level, file, line, idstr );\n#else\n    ssl->conf->f_dbg( ssl->conf->p_dbg, level, file, line, str );\n#endif\n}\n\nvoid mbedtls_debug_print_msg( const mbedtls_ssl_context *ssl, int level,\n                              const char *file, int line,\n                              const char *format, ... )\n{\n    va_list argp;\n    char str[DEBUG_BUF_SIZE];\n    int ret;\n\n    if( NULL == ssl || NULL == ssl->conf || NULL == ssl->conf->f_dbg || level > debug_threshold )\n        return;\n\n    va_start( argp, format );\n#if defined(_WIN32)\n#if defined(_TRUNCATE)\n    ret = _vsnprintf_s( str, DEBUG_BUF_SIZE, _TRUNCATE, format, argp );\n#else\n    ret = _vsnprintf( str, DEBUG_BUF_SIZE, format, argp );\n    if( ret < 0 || (size_t) ret == DEBUG_BUF_SIZE )\n    {\n        str[DEBUG_BUF_SIZE-1] = '\\0';\n        ret = -1;\n    }\n#endif\n#else\n    ret = vsnprintf( str, DEBUG_BUF_SIZE, format, argp );\n#endif\n    va_end( argp );\n\n    if( ret >= 0 && ret < DEBUG_BUF_SIZE - 1 )\n    {\n        str[ret]     = '\\n';\n        str[ret + 1] = '\\0';\n    }\n\n    debug_send_line( ssl, level, file, line, str );\n}\n\nvoid mbedtls_debug_print_ret( const mbedtls_ssl_context *ssl, int level,\n                      const char *file, int line,\n                      const char *text, int ret )\n{\n    char str[DEBUG_BUF_SIZE];\n\n    if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold )\n        return;\n\n    /*\n     * With non-blocking I/O and examples that just retry immediately,\n     * the logs would be quickly flooded with WANT_READ, so ignore that.\n     * Don't ignore WANT_WRITE however, since is is usually rare.\n     */\n    if( ret == MBEDTLS_ERR_SSL_WANT_READ )\n        return;\n\n    mbedtls_snprintf( str, sizeof( str ), \"%s() returned %d (-0x%04x)\\n\",\n              text, ret, -ret );\n\n    debug_send_line( ssl, level, file, line, str );\n}\n\nvoid mbedtls_debug_print_buf( const mbedtls_ssl_context *ssl, int level,\n                      const char *file, int line, const char *text,\n                      const unsigned char *buf, size_t len )\n{\n    char str[DEBUG_BUF_SIZE];\n    char txt[17];\n    size_t i, idx = 0;\n\n    if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold )\n        return;\n\n    mbedtls_snprintf( str + idx, sizeof( str ) - idx, \"dumping '%s' (%u bytes)\\n\",\n              text, (unsigned int) len );\n\n    debug_send_line( ssl, level, file, line, str );\n\n    idx = 0;\n    memset( txt, 0, sizeof( txt ) );\n    for( i = 0; i < len; i++ )\n    {\n        if( i >= 4096 )\n            break;\n\n        if( i % 16 == 0 )\n        {\n            if( i > 0 )\n            {\n                mbedtls_snprintf( str + idx, sizeof( str ) - idx, \"  %s\\n\", txt );\n                debug_send_line( ssl, level, file, line, str );\n\n                idx = 0;\n                memset( txt, 0, sizeof( txt ) );\n            }\n\n            idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, \"%04x: \",\n                             (unsigned int) i );\n\n        }\n\n        idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, \" %02x\",\n                         (unsigned int) buf[i] );\n        txt[i % 16] = ( buf[i] > 31 && buf[i] < 127 ) ? buf[i] : '.' ;\n    }\n\n    if( len > 0 )\n    {\n        for( /* i = i */; i % 16 != 0; i++ )\n            idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, \"   \" );\n\n        mbedtls_snprintf( str + idx, sizeof( str ) - idx, \"  %s\\n\", txt );\n        debug_send_line( ssl, level, file, line, str );\n    }\n}\n\n#if defined(MBEDTLS_ECP_C)\nvoid mbedtls_debug_print_ecp( const mbedtls_ssl_context *ssl, int level,\n                      const char *file, int line,\n                      const char *text, const mbedtls_ecp_point *X )\n{\n    char str[DEBUG_BUF_SIZE];\n\n    if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || level > debug_threshold )\n        return;\n\n    mbedtls_snprintf( str, sizeof( str ), \"%s(X)\", text );\n    mbedtls_debug_print_mpi( ssl, level, file, line, str, &X->X );\n\n    mbedtls_snprintf( str, sizeof( str ), \"%s(Y)\", text );\n    mbedtls_debug_print_mpi( ssl, level, file, line, str, &X->Y );\n}\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_BIGNUM_C)\nvoid mbedtls_debug_print_mpi( const mbedtls_ssl_context *ssl, int level,\n                      const char *file, int line,\n                      const char *text, const mbedtls_mpi *X )\n{\n    char str[DEBUG_BUF_SIZE];\n    int j, k, zeros = 1;\n    size_t i, n, idx = 0;\n\n    if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || X == NULL || level > debug_threshold )\n        return;\n\n    for( n = X->n - 1; n > 0; n-- )\n        if( X->p[n] != 0 )\n            break;\n\n    for( j = ( sizeof(mbedtls_mpi_uint) << 3 ) - 1; j >= 0; j-- )\n        if( ( ( X->p[n] >> j ) & 1 ) != 0 )\n            break;\n\n    mbedtls_snprintf( str + idx, sizeof( str ) - idx, \"value of '%s' (%d bits) is:\\n\",\n              text, (int) ( ( n * ( sizeof(mbedtls_mpi_uint) << 3 ) ) + j + 1 ) );\n\n    debug_send_line( ssl, level, file, line, str );\n\n    idx = 0;\n    for( i = n + 1, j = 0; i > 0; i-- )\n    {\n        if( zeros && X->p[i - 1] == 0 )\n            continue;\n\n        for( k = sizeof( mbedtls_mpi_uint ) - 1; k >= 0; k-- )\n        {\n            if( zeros && ( ( X->p[i - 1] >> ( k << 3 ) ) & 0xFF ) == 0 )\n                continue;\n            else\n                zeros = 0;\n\n            if( j % 16 == 0 )\n            {\n                if( j > 0 )\n                {\n                    mbedtls_snprintf( str + idx, sizeof( str ) - idx, \"\\n\" );\n                    debug_send_line( ssl, level, file, line, str );\n                    idx = 0;\n                }\n            }\n\n            idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, \" %02x\", (unsigned int)\n                             ( X->p[i - 1] >> ( k << 3 ) ) & 0xFF );\n\n            j++;\n        }\n\n    }\n\n    if( zeros == 1 )\n        idx += mbedtls_snprintf( str + idx, sizeof( str ) - idx, \" 00\" );\n\n    mbedtls_snprintf( str + idx, sizeof( str ) - idx, \"\\n\" );\n    debug_send_line( ssl, level, file, line, str );\n}\n#endif /* MBEDTLS_BIGNUM_C */\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\nstatic void debug_print_pk( const mbedtls_ssl_context *ssl, int level,\n                            const char *file, int line,\n                            const char *text, const mbedtls_pk_context *pk )\n{\n    size_t i;\n    mbedtls_pk_debug_item items[MBEDTLS_PK_DEBUG_MAX_ITEMS];\n    char name[16];\n\n    memset( items, 0, sizeof( items ) );\n\n    if( mbedtls_pk_debug( pk, items ) != 0 )\n    {\n        debug_send_line( ssl, level, file, line,\n                          \"invalid PK context\\n\" );\n        return;\n    }\n\n    for( i = 0; i < MBEDTLS_PK_DEBUG_MAX_ITEMS; i++ )\n    {\n        if( items[i].type == MBEDTLS_PK_DEBUG_NONE )\n            return;\n\n        mbedtls_snprintf( name, sizeof( name ), \"%s%s\", text, items[i].name );\n        name[sizeof( name ) - 1] = '\\0';\n\n        if( items[i].type == MBEDTLS_PK_DEBUG_MPI )\n            mbedtls_debug_print_mpi( ssl, level, file, line, name, items[i].value );\n        else\n#if defined(MBEDTLS_ECP_C)\n        if( items[i].type == MBEDTLS_PK_DEBUG_ECP )\n            mbedtls_debug_print_ecp( ssl, level, file, line, name, items[i].value );\n        else\n#endif\n            debug_send_line( ssl, level, file, line,\n                              \"should not happen\\n\" );\n    }\n}\n\nstatic void debug_print_line_by_line( const mbedtls_ssl_context *ssl, int level,\n                                      const char *file, int line, const char *text )\n{\n    char str[DEBUG_BUF_SIZE];\n    const char *start, *cur;\n\n    start = text;\n    for( cur = text; *cur != '\\0'; cur++ )\n    {\n        if( *cur == '\\n' )\n        {\n            size_t len = cur - start + 1;\n            if( len > DEBUG_BUF_SIZE - 1 )\n                len = DEBUG_BUF_SIZE - 1;\n\n            memcpy( str, start, len );\n            str[len] = '\\0';\n\n            debug_send_line( ssl, level, file, line, str );\n\n            start = cur + 1;\n        }\n    }\n}\n\nvoid mbedtls_debug_print_crt( const mbedtls_ssl_context *ssl, int level,\n                      const char *file, int line,\n                      const char *text, const mbedtls_x509_crt *crt )\n{\n    char str[DEBUG_BUF_SIZE];\n    int i = 0;\n\n    if( ssl->conf == NULL || ssl->conf->f_dbg == NULL || crt == NULL || level > debug_threshold )\n        return;\n\n    while( crt != NULL )\n    {\n        char buf[1024];\n\n        mbedtls_snprintf( str, sizeof( str ), \"%s #%d:\\n\", text, ++i );\n        debug_send_line( ssl, level, file, line, str );\n\n        mbedtls_x509_crt_info( buf, sizeof( buf ) - 1, \"\", crt );\n        debug_print_line_by_line( ssl, level, file, line, buf );\n\n        debug_print_pk( ssl, level, file, line, \"crt->\", &crt->pk );\n\n        crt = crt->next;\n    }\n}\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#endif /* MBEDTLS_DEBUG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/des.c",
    "content": "/*\n *  FIPS-46-3 compliant Triple-DES implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  DES, on which TDES is based, was originally designed by Horst Feistel\n *  at IBM in 1974, and was adopted as a standard by NIST (formerly NBS).\n *\n *  http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_DES_C)\n\n#include \"mbedtls/des.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_DES_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\n/*\n * 32-bit integer manipulation macros (big endian)\n */\n#ifndef GET_UINT32_BE\n#define GET_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \\\n        | ( (uint32_t) (b)[(i) + 1] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 2] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 3]       );            \\\n}\n#endif\n\n#ifndef PUT_UINT32_BE\n#define PUT_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n)       );       \\\n}\n#endif\n\n/*\n * Expanded DES S-boxes\n */\nstatic const uint32_t SB1[64] =\n{\n    0x01010400, 0x00000000, 0x00010000, 0x01010404,\n    0x01010004, 0x00010404, 0x00000004, 0x00010000,\n    0x00000400, 0x01010400, 0x01010404, 0x00000400,\n    0x01000404, 0x01010004, 0x01000000, 0x00000004,\n    0x00000404, 0x01000400, 0x01000400, 0x00010400,\n    0x00010400, 0x01010000, 0x01010000, 0x01000404,\n    0x00010004, 0x01000004, 0x01000004, 0x00010004,\n    0x00000000, 0x00000404, 0x00010404, 0x01000000,\n    0x00010000, 0x01010404, 0x00000004, 0x01010000,\n    0x01010400, 0x01000000, 0x01000000, 0x00000400,\n    0x01010004, 0x00010000, 0x00010400, 0x01000004,\n    0x00000400, 0x00000004, 0x01000404, 0x00010404,\n    0x01010404, 0x00010004, 0x01010000, 0x01000404,\n    0x01000004, 0x00000404, 0x00010404, 0x01010400,\n    0x00000404, 0x01000400, 0x01000400, 0x00000000,\n    0x00010004, 0x00010400, 0x00000000, 0x01010004\n};\n\nstatic const uint32_t SB2[64] =\n{\n    0x80108020, 0x80008000, 0x00008000, 0x00108020,\n    0x00100000, 0x00000020, 0x80100020, 0x80008020,\n    0x80000020, 0x80108020, 0x80108000, 0x80000000,\n    0x80008000, 0x00100000, 0x00000020, 0x80100020,\n    0x00108000, 0x00100020, 0x80008020, 0x00000000,\n    0x80000000, 0x00008000, 0x00108020, 0x80100000,\n    0x00100020, 0x80000020, 0x00000000, 0x00108000,\n    0x00008020, 0x80108000, 0x80100000, 0x00008020,\n    0x00000000, 0x00108020, 0x80100020, 0x00100000,\n    0x80008020, 0x80100000, 0x80108000, 0x00008000,\n    0x80100000, 0x80008000, 0x00000020, 0x80108020,\n    0x00108020, 0x00000020, 0x00008000, 0x80000000,\n    0x00008020, 0x80108000, 0x00100000, 0x80000020,\n    0x00100020, 0x80008020, 0x80000020, 0x00100020,\n    0x00108000, 0x00000000, 0x80008000, 0x00008020,\n    0x80000000, 0x80100020, 0x80108020, 0x00108000\n};\n\nstatic const uint32_t SB3[64] =\n{\n    0x00000208, 0x08020200, 0x00000000, 0x08020008,\n    0x08000200, 0x00000000, 0x00020208, 0x08000200,\n    0x00020008, 0x08000008, 0x08000008, 0x00020000,\n    0x08020208, 0x00020008, 0x08020000, 0x00000208,\n    0x08000000, 0x00000008, 0x08020200, 0x00000200,\n    0x00020200, 0x08020000, 0x08020008, 0x00020208,\n    0x08000208, 0x00020200, 0x00020000, 0x08000208,\n    0x00000008, 0x08020208, 0x00000200, 0x08000000,\n    0x08020200, 0x08000000, 0x00020008, 0x00000208,\n    0x00020000, 0x08020200, 0x08000200, 0x00000000,\n    0x00000200, 0x00020008, 0x08020208, 0x08000200,\n    0x08000008, 0x00000200, 0x00000000, 0x08020008,\n    0x08000208, 0x00020000, 0x08000000, 0x08020208,\n    0x00000008, 0x00020208, 0x00020200, 0x08000008,\n    0x08020000, 0x08000208, 0x00000208, 0x08020000,\n    0x00020208, 0x00000008, 0x08020008, 0x00020200\n};\n\nstatic const uint32_t SB4[64] =\n{\n    0x00802001, 0x00002081, 0x00002081, 0x00000080,\n    0x00802080, 0x00800081, 0x00800001, 0x00002001,\n    0x00000000, 0x00802000, 0x00802000, 0x00802081,\n    0x00000081, 0x00000000, 0x00800080, 0x00800001,\n    0x00000001, 0x00002000, 0x00800000, 0x00802001,\n    0x00000080, 0x00800000, 0x00002001, 0x00002080,\n    0x00800081, 0x00000001, 0x00002080, 0x00800080,\n    0x00002000, 0x00802080, 0x00802081, 0x00000081,\n    0x00800080, 0x00800001, 0x00802000, 0x00802081,\n    0x00000081, 0x00000000, 0x00000000, 0x00802000,\n    0x00002080, 0x00800080, 0x00800081, 0x00000001,\n    0x00802001, 0x00002081, 0x00002081, 0x00000080,\n    0x00802081, 0x00000081, 0x00000001, 0x00002000,\n    0x00800001, 0x00002001, 0x00802080, 0x00800081,\n    0x00002001, 0x00002080, 0x00800000, 0x00802001,\n    0x00000080, 0x00800000, 0x00002000, 0x00802080\n};\n\nstatic const uint32_t SB5[64] =\n{\n    0x00000100, 0x02080100, 0x02080000, 0x42000100,\n    0x00080000, 0x00000100, 0x40000000, 0x02080000,\n    0x40080100, 0x00080000, 0x02000100, 0x40080100,\n    0x42000100, 0x42080000, 0x00080100, 0x40000000,\n    0x02000000, 0x40080000, 0x40080000, 0x00000000,\n    0x40000100, 0x42080100, 0x42080100, 0x02000100,\n    0x42080000, 0x40000100, 0x00000000, 0x42000000,\n    0x02080100, 0x02000000, 0x42000000, 0x00080100,\n    0x00080000, 0x42000100, 0x00000100, 0x02000000,\n    0x40000000, 0x02080000, 0x42000100, 0x40080100,\n    0x02000100, 0x40000000, 0x42080000, 0x02080100,\n    0x40080100, 0x00000100, 0x02000000, 0x42080000,\n    0x42080100, 0x00080100, 0x42000000, 0x42080100,\n    0x02080000, 0x00000000, 0x40080000, 0x42000000,\n    0x00080100, 0x02000100, 0x40000100, 0x00080000,\n    0x00000000, 0x40080000, 0x02080100, 0x40000100\n};\n\nstatic const uint32_t SB6[64] =\n{\n    0x20000010, 0x20400000, 0x00004000, 0x20404010,\n    0x20400000, 0x00000010, 0x20404010, 0x00400000,\n    0x20004000, 0x00404010, 0x00400000, 0x20000010,\n    0x00400010, 0x20004000, 0x20000000, 0x00004010,\n    0x00000000, 0x00400010, 0x20004010, 0x00004000,\n    0x00404000, 0x20004010, 0x00000010, 0x20400010,\n    0x20400010, 0x00000000, 0x00404010, 0x20404000,\n    0x00004010, 0x00404000, 0x20404000, 0x20000000,\n    0x20004000, 0x00000010, 0x20400010, 0x00404000,\n    0x20404010, 0x00400000, 0x00004010, 0x20000010,\n    0x00400000, 0x20004000, 0x20000000, 0x00004010,\n    0x20000010, 0x20404010, 0x00404000, 0x20400000,\n    0x00404010, 0x20404000, 0x00000000, 0x20400010,\n    0x00000010, 0x00004000, 0x20400000, 0x00404010,\n    0x00004000, 0x00400010, 0x20004010, 0x00000000,\n    0x20404000, 0x20000000, 0x00400010, 0x20004010\n};\n\nstatic const uint32_t SB7[64] =\n{\n    0x00200000, 0x04200002, 0x04000802, 0x00000000,\n    0x00000800, 0x04000802, 0x00200802, 0x04200800,\n    0x04200802, 0x00200000, 0x00000000, 0x04000002,\n    0x00000002, 0x04000000, 0x04200002, 0x00000802,\n    0x04000800, 0x00200802, 0x00200002, 0x04000800,\n    0x04000002, 0x04200000, 0x04200800, 0x00200002,\n    0x04200000, 0x00000800, 0x00000802, 0x04200802,\n    0x00200800, 0x00000002, 0x04000000, 0x00200800,\n    0x04000000, 0x00200800, 0x00200000, 0x04000802,\n    0x04000802, 0x04200002, 0x04200002, 0x00000002,\n    0x00200002, 0x04000000, 0x04000800, 0x00200000,\n    0x04200800, 0x00000802, 0x00200802, 0x04200800,\n    0x00000802, 0x04000002, 0x04200802, 0x04200000,\n    0x00200800, 0x00000000, 0x00000002, 0x04200802,\n    0x00000000, 0x00200802, 0x04200000, 0x00000800,\n    0x04000002, 0x04000800, 0x00000800, 0x00200002\n};\n\nstatic const uint32_t SB8[64] =\n{\n    0x10001040, 0x00001000, 0x00040000, 0x10041040,\n    0x10000000, 0x10001040, 0x00000040, 0x10000000,\n    0x00040040, 0x10040000, 0x10041040, 0x00041000,\n    0x10041000, 0x00041040, 0x00001000, 0x00000040,\n    0x10040000, 0x10000040, 0x10001000, 0x00001040,\n    0x00041000, 0x00040040, 0x10040040, 0x10041000,\n    0x00001040, 0x00000000, 0x00000000, 0x10040040,\n    0x10000040, 0x10001000, 0x00041040, 0x00040000,\n    0x00041040, 0x00040000, 0x10041000, 0x00001000,\n    0x00000040, 0x10040040, 0x00001000, 0x00041040,\n    0x10001000, 0x00000040, 0x10000040, 0x10040000,\n    0x10040040, 0x10000000, 0x00040000, 0x10001040,\n    0x00000000, 0x10041040, 0x00040040, 0x10000040,\n    0x10040000, 0x10001000, 0x10001040, 0x00000000,\n    0x10041040, 0x00041000, 0x00041000, 0x00001040,\n    0x00001040, 0x00040040, 0x10000000, 0x10041000\n};\n\n/*\n * PC1: left and right halves bit-swap\n */\nstatic const uint32_t LHs[16] =\n{\n    0x00000000, 0x00000001, 0x00000100, 0x00000101,\n    0x00010000, 0x00010001, 0x00010100, 0x00010101,\n    0x01000000, 0x01000001, 0x01000100, 0x01000101,\n    0x01010000, 0x01010001, 0x01010100, 0x01010101\n};\n\nstatic const uint32_t RHs[16] =\n{\n    0x00000000, 0x01000000, 0x00010000, 0x01010000,\n    0x00000100, 0x01000100, 0x00010100, 0x01010100,\n    0x00000001, 0x01000001, 0x00010001, 0x01010001,\n    0x00000101, 0x01000101, 0x00010101, 0x01010101,\n};\n\n/*\n * Initial Permutation macro\n */\n#define DES_IP(X,Y)                                             \\\n{                                                               \\\n    T = ((X >>  4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T <<  4);   \\\n    T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16);   \\\n    T = ((Y >>  2) ^ X) & 0x33333333; X ^= T; Y ^= (T <<  2);   \\\n    T = ((Y >>  8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T <<  8);   \\\n    Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF;                    \\\n    T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T;                   \\\n    X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF;                    \\\n}\n\n/*\n * Final Permutation macro\n */\n#define DES_FP(X,Y)                                             \\\n{                                                               \\\n    X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF;                    \\\n    T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T;                   \\\n    Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF;                    \\\n    T = ((Y >>  8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T <<  8);   \\\n    T = ((Y >>  2) ^ X) & 0x33333333; X ^= T; Y ^= (T <<  2);   \\\n    T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16);   \\\n    T = ((X >>  4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T <<  4);   \\\n}\n\n/*\n * DES round macro\n */\n#define DES_ROUND(X,Y)                          \\\n{                                               \\\n    T = *SK++ ^ X;                              \\\n    Y ^= SB8[ (T      ) & 0x3F ] ^              \\\n         SB6[ (T >>  8) & 0x3F ] ^              \\\n         SB4[ (T >> 16) & 0x3F ] ^              \\\n         SB2[ (T >> 24) & 0x3F ];               \\\n                                                \\\n    T = *SK++ ^ ((X << 28) | (X >> 4));         \\\n    Y ^= SB7[ (T      ) & 0x3F ] ^              \\\n         SB5[ (T >>  8) & 0x3F ] ^              \\\n         SB3[ (T >> 16) & 0x3F ] ^              \\\n         SB1[ (T >> 24) & 0x3F ];               \\\n}\n\n#define SWAP(a,b) { uint32_t t = a; a = b; b = t; t = 0; }\n\nvoid mbedtls_des_init( mbedtls_des_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_des_context ) );\n}\n\nvoid mbedtls_des_free( mbedtls_des_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_des_context ) );\n}\n\nvoid mbedtls_des3_init( mbedtls_des3_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_des3_context ) );\n}\n\nvoid mbedtls_des3_free( mbedtls_des3_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_des3_context ) );\n}\n\nstatic const unsigned char odd_parity_table[128] = { 1,  2,  4,  7,  8,\n        11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38, 41, 42, 44,\n        47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81,\n        82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, 104, 107, 109, 110, 112,\n        115, 117, 118, 121, 122, 124, 127, 128, 131, 133, 134, 137, 138, 140,\n        143, 145, 146, 148, 151, 152, 155, 157, 158, 161, 162, 164, 167, 168,\n        171, 173, 174, 176, 179, 181, 182, 185, 186, 188, 191, 193, 194, 196,\n        199, 200, 203, 205, 206, 208, 211, 213, 214, 217, 218, 220, 223, 224,\n        227, 229, 230, 233, 234, 236, 239, 241, 242, 244, 247, 248, 251, 253,\n        254 };\n\nvoid mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] )\n{\n    int i;\n\n    for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ )\n        key[i] = odd_parity_table[key[i] / 2];\n}\n\n/*\n * Check the given key's parity, returns 1 on failure, 0 on SUCCESS\n */\nint mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] )\n{\n    int i;\n\n    for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ )\n        if( key[i] != odd_parity_table[key[i] / 2] )\n            return( 1 );\n\n    return( 0 );\n}\n\n/*\n * Table of weak and semi-weak keys\n *\n * Source: http://en.wikipedia.org/wiki/Weak_key\n *\n * Weak:\n * Alternating ones + zeros (0x0101010101010101)\n * Alternating 'F' + 'E' (0xFEFEFEFEFEFEFEFE)\n * '0xE0E0E0E0F1F1F1F1'\n * '0x1F1F1F1F0E0E0E0E'\n *\n * Semi-weak:\n * 0x011F011F010E010E and 0x1F011F010E010E01\n * 0x01E001E001F101F1 and 0xE001E001F101F101\n * 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01\n * 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E\n * 0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E\n * 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1\n *\n */\n\n#define WEAK_KEY_COUNT 16\n\nstatic const unsigned char weak_key_table[WEAK_KEY_COUNT][MBEDTLS_DES_KEY_SIZE] =\n{\n    { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },\n    { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE },\n    { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },\n    { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 },\n\n    { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E },\n    { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 },\n    { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 },\n    { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 },\n    { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE },\n    { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 },\n    { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 },\n    { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E },\n    { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE },\n    { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E },\n    { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },\n    { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 }\n};\n\nint mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] )\n{\n    int i;\n\n    for( i = 0; i < WEAK_KEY_COUNT; i++ )\n        if( memcmp( weak_key_table[i], key, MBEDTLS_DES_KEY_SIZE) == 0 )\n            return( 1 );\n\n    return( 0 );\n}\n\n#if !defined(MBEDTLS_DES_SETKEY_ALT)\nvoid mbedtls_des_setkey( uint32_t SK[32], const unsigned char key[MBEDTLS_DES_KEY_SIZE] )\n{\n    int i;\n    uint32_t X, Y, T;\n\n    GET_UINT32_BE( X, key, 0 );\n    GET_UINT32_BE( Y, key, 4 );\n\n    /*\n     * Permuted Choice 1\n     */\n    T =  ((Y >>  4) ^ X) & 0x0F0F0F0F;  X ^= T; Y ^= (T <<  4);\n    T =  ((Y      ) ^ X) & 0x10101010;  X ^= T; Y ^= (T      );\n\n    X =   (LHs[ (X      ) & 0xF] << 3) | (LHs[ (X >>  8) & 0xF ] << 2)\n        | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ]     )\n        | (LHs[ (X >>  5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6)\n        | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4);\n\n    Y =   (RHs[ (Y >>  1) & 0xF] << 3) | (RHs[ (Y >>  9) & 0xF ] << 2)\n        | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ]     )\n        | (RHs[ (Y >>  4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6)\n        | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4);\n\n    X &= 0x0FFFFFFF;\n    Y &= 0x0FFFFFFF;\n\n    /*\n     * calculate subkeys\n     */\n    for( i = 0; i < 16; i++ )\n    {\n        if( i < 2 || i == 8 || i == 15 )\n        {\n            X = ((X <<  1) | (X >> 27)) & 0x0FFFFFFF;\n            Y = ((Y <<  1) | (Y >> 27)) & 0x0FFFFFFF;\n        }\n        else\n        {\n            X = ((X <<  2) | (X >> 26)) & 0x0FFFFFFF;\n            Y = ((Y <<  2) | (Y >> 26)) & 0x0FFFFFFF;\n        }\n\n        *SK++ =   ((X <<  4) & 0x24000000) | ((X << 28) & 0x10000000)\n                | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000)\n                | ((X <<  6) & 0x01000000) | ((X <<  9) & 0x00200000)\n                | ((X >>  1) & 0x00100000) | ((X << 10) & 0x00040000)\n                | ((X <<  2) & 0x00020000) | ((X >> 10) & 0x00010000)\n                | ((Y >> 13) & 0x00002000) | ((Y >>  4) & 0x00001000)\n                | ((Y <<  6) & 0x00000800) | ((Y >>  1) & 0x00000400)\n                | ((Y >> 14) & 0x00000200) | ((Y      ) & 0x00000100)\n                | ((Y >>  5) & 0x00000020) | ((Y >> 10) & 0x00000010)\n                | ((Y >>  3) & 0x00000008) | ((Y >> 18) & 0x00000004)\n                | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001);\n\n        *SK++ =   ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000)\n                | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000)\n                | ((X >>  2) & 0x02000000) | ((X <<  1) & 0x01000000)\n                | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000)\n                | ((X <<  3) & 0x00080000) | ((X >>  6) & 0x00040000)\n                | ((X << 15) & 0x00020000) | ((X >>  4) & 0x00010000)\n                | ((Y >>  2) & 0x00002000) | ((Y <<  8) & 0x00001000)\n                | ((Y >> 14) & 0x00000808) | ((Y >>  9) & 0x00000400)\n                | ((Y      ) & 0x00000200) | ((Y <<  7) & 0x00000100)\n                | ((Y >>  7) & 0x00000020) | ((Y >>  3) & 0x00000011)\n                | ((Y <<  2) & 0x00000004) | ((Y >> 21) & 0x00000002);\n    }\n}\n#endif /* !MBEDTLS_DES_SETKEY_ALT */\n\n/*\n * DES key schedule (56-bit, encryption)\n */\nint mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] )\n{\n    mbedtls_des_setkey( ctx->sk, key );\n\n    return( 0 );\n}\n\n/*\n * DES key schedule (56-bit, decryption)\n */\nint mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] )\n{\n    int i;\n\n    mbedtls_des_setkey( ctx->sk, key );\n\n    for( i = 0; i < 16; i += 2 )\n    {\n        SWAP( ctx->sk[i    ], ctx->sk[30 - i] );\n        SWAP( ctx->sk[i + 1], ctx->sk[31 - i] );\n    }\n\n    return( 0 );\n}\n\nstatic void des3_set2key( uint32_t esk[96],\n                          uint32_t dsk[96],\n                          const unsigned char key[MBEDTLS_DES_KEY_SIZE*2] )\n{\n    int i;\n\n    mbedtls_des_setkey( esk, key );\n    mbedtls_des_setkey( dsk + 32, key + 8 );\n\n    for( i = 0; i < 32; i += 2 )\n    {\n        dsk[i     ] = esk[30 - i];\n        dsk[i +  1] = esk[31 - i];\n\n        esk[i + 32] = dsk[62 - i];\n        esk[i + 33] = dsk[63 - i];\n\n        esk[i + 64] = esk[i    ];\n        esk[i + 65] = esk[i + 1];\n\n        dsk[i + 64] = dsk[i    ];\n        dsk[i + 65] = dsk[i + 1];\n    }\n}\n\n/*\n * Triple-DES key schedule (112-bit, encryption)\n */\nint mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx,\n                      const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] )\n{\n    uint32_t sk[96];\n\n    des3_set2key( ctx->sk, sk, key );\n    mbedtls_zeroize( sk,  sizeof( sk ) );\n\n    return( 0 );\n}\n\n/*\n * Triple-DES key schedule (112-bit, decryption)\n */\nint mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx,\n                      const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] )\n{\n    uint32_t sk[96];\n\n    des3_set2key( sk, ctx->sk, key );\n    mbedtls_zeroize( sk,  sizeof( sk ) );\n\n    return( 0 );\n}\n\nstatic void des3_set3key( uint32_t esk[96],\n                          uint32_t dsk[96],\n                          const unsigned char key[24] )\n{\n    int i;\n\n    mbedtls_des_setkey( esk, key );\n    mbedtls_des_setkey( dsk + 32, key +  8 );\n    mbedtls_des_setkey( esk + 64, key + 16 );\n\n    for( i = 0; i < 32; i += 2 )\n    {\n        dsk[i     ] = esk[94 - i];\n        dsk[i +  1] = esk[95 - i];\n\n        esk[i + 32] = dsk[62 - i];\n        esk[i + 33] = dsk[63 - i];\n\n        dsk[i + 64] = esk[30 - i];\n        dsk[i + 65] = esk[31 - i];\n    }\n}\n\n/*\n * Triple-DES key schedule (168-bit, encryption)\n */\nint mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx,\n                      const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] )\n{\n    uint32_t sk[96];\n\n    des3_set3key( ctx->sk, sk, key );\n    mbedtls_zeroize( sk,  sizeof( sk ) );\n\n    return( 0 );\n}\n\n/*\n * Triple-DES key schedule (168-bit, decryption)\n */\nint mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx,\n                      const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] )\n{\n    uint32_t sk[96];\n\n    des3_set3key( sk, ctx->sk, key );\n    mbedtls_zeroize( sk,  sizeof( sk ) );\n\n    return( 0 );\n}\n\n/*\n * DES-ECB block encryption/decryption\n */\n#if !defined(MBEDTLS_DES_CRYPT_ECB_ALT)\nint mbedtls_des_crypt_ecb( mbedtls_des_context *ctx,\n                    const unsigned char input[8],\n                    unsigned char output[8] )\n{\n    int i;\n    uint32_t X, Y, T, *SK;\n\n    SK = ctx->sk;\n\n    GET_UINT32_BE( X, input, 0 );\n    GET_UINT32_BE( Y, input, 4 );\n\n    DES_IP( X, Y );\n\n    for( i = 0; i < 8; i++ )\n    {\n        DES_ROUND( Y, X );\n        DES_ROUND( X, Y );\n    }\n\n    DES_FP( Y, X );\n\n    PUT_UINT32_BE( Y, output, 0 );\n    PUT_UINT32_BE( X, output, 4 );\n\n    return( 0 );\n}\n#endif /* !MBEDTLS_DES_CRYPT_ECB_ALT */\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/*\n * DES-CBC buffer encryption/decryption\n */\nint mbedtls_des_crypt_cbc( mbedtls_des_context *ctx,\n                    int mode,\n                    size_t length,\n                    unsigned char iv[8],\n                    const unsigned char *input,\n                    unsigned char *output )\n{\n    int i;\n    unsigned char temp[8];\n\n    if( length % 8 )\n        return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH );\n\n    if( mode == MBEDTLS_DES_ENCRYPT )\n    {\n        while( length > 0 )\n        {\n            for( i = 0; i < 8; i++ )\n                output[i] = (unsigned char)( input[i] ^ iv[i] );\n\n            mbedtls_des_crypt_ecb( ctx, output, output );\n            memcpy( iv, output, 8 );\n\n            input  += 8;\n            output += 8;\n            length -= 8;\n        }\n    }\n    else /* MBEDTLS_DES_DECRYPT */\n    {\n        while( length > 0 )\n        {\n            memcpy( temp, input, 8 );\n            mbedtls_des_crypt_ecb( ctx, input, output );\n\n            for( i = 0; i < 8; i++ )\n                output[i] = (unsigned char)( output[i] ^ iv[i] );\n\n            memcpy( iv, temp, 8 );\n\n            input  += 8;\n            output += 8;\n            length -= 8;\n        }\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n/*\n * 3DES-ECB block encryption/decryption\n */\n#if !defined(MBEDTLS_DES3_CRYPT_ECB_ALT)\nint mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx,\n                     const unsigned char input[8],\n                     unsigned char output[8] )\n{\n    int i;\n    uint32_t X, Y, T, *SK;\n\n    SK = ctx->sk;\n\n    GET_UINT32_BE( X, input, 0 );\n    GET_UINT32_BE( Y, input, 4 );\n\n    DES_IP( X, Y );\n\n    for( i = 0; i < 8; i++ )\n    {\n        DES_ROUND( Y, X );\n        DES_ROUND( X, Y );\n    }\n\n    for( i = 0; i < 8; i++ )\n    {\n        DES_ROUND( X, Y );\n        DES_ROUND( Y, X );\n    }\n\n    for( i = 0; i < 8; i++ )\n    {\n        DES_ROUND( Y, X );\n        DES_ROUND( X, Y );\n    }\n\n    DES_FP( Y, X );\n\n    PUT_UINT32_BE( Y, output, 0 );\n    PUT_UINT32_BE( X, output, 4 );\n\n    return( 0 );\n}\n#endif /* !MBEDTLS_DES3_CRYPT_ECB_ALT */\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/*\n * 3DES-CBC buffer encryption/decryption\n */\nint mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx,\n                     int mode,\n                     size_t length,\n                     unsigned char iv[8],\n                     const unsigned char *input,\n                     unsigned char *output )\n{\n    int i;\n    unsigned char temp[8];\n\n    if( length % 8 )\n        return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH );\n\n    if( mode == MBEDTLS_DES_ENCRYPT )\n    {\n        while( length > 0 )\n        {\n            for( i = 0; i < 8; i++ )\n                output[i] = (unsigned char)( input[i] ^ iv[i] );\n\n            mbedtls_des3_crypt_ecb( ctx, output, output );\n            memcpy( iv, output, 8 );\n\n            input  += 8;\n            output += 8;\n            length -= 8;\n        }\n    }\n    else /* MBEDTLS_DES_DECRYPT */\n    {\n        while( length > 0 )\n        {\n            memcpy( temp, input, 8 );\n            mbedtls_des3_crypt_ecb( ctx, input, output );\n\n            for( i = 0; i < 8; i++ )\n                output[i] = (unsigned char)( output[i] ^ iv[i] );\n\n            memcpy( iv, temp, 8 );\n\n            input  += 8;\n            output += 8;\n            length -= 8;\n        }\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#endif /* !MBEDTLS_DES_ALT */\n\n#if defined(MBEDTLS_SELF_TEST)\n/*\n * DES and 3DES test vectors from:\n *\n * http://csrc.nist.gov/groups/STM/cavp/documents/des/tripledes-vectors.zip\n */\nstatic const unsigned char des3_test_keys[24] =\n{\n    0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,\n    0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01,\n    0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23\n};\n\nstatic const unsigned char des3_test_buf[8] =\n{\n    0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74\n};\n\nstatic const unsigned char des3_test_ecb_dec[3][8] =\n{\n    { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D },\n    { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB },\n    { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A }\n};\n\nstatic const unsigned char des3_test_ecb_enc[3][8] =\n{\n    { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B },\n    { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 },\n    { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 }\n};\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\nstatic const unsigned char des3_test_iv[8] =\n{\n    0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF,\n};\n\nstatic const unsigned char des3_test_cbc_dec[3][8] =\n{\n    { 0x12, 0x9F, 0x40, 0xB9, 0xD2, 0x00, 0x56, 0xB3 },\n    { 0x47, 0x0E, 0xFC, 0x9A, 0x6B, 0x8E, 0xE3, 0x93 },\n    { 0xC5, 0xCE, 0xCF, 0x63, 0xEC, 0xEC, 0x51, 0x4C }\n};\n\nstatic const unsigned char des3_test_cbc_enc[3][8] =\n{\n    { 0x54, 0xF1, 0x5A, 0xF6, 0xEB, 0xE3, 0xA4, 0xB4 },\n    { 0x35, 0x76, 0x11, 0x56, 0x5F, 0xA1, 0x8E, 0x4D },\n    { 0xCB, 0x19, 0x1F, 0x85, 0xD1, 0xED, 0x84, 0x39 }\n};\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n/*\n * Checkup routine\n */\nint mbedtls_des_self_test( int verbose )\n{\n    int i, j, u, v, ret = 0;\n    mbedtls_des_context ctx;\n    mbedtls_des3_context ctx3;\n    unsigned char buf[8];\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    unsigned char prv[8];\n    unsigned char iv[8];\n#endif\n\n    mbedtls_des_init( &ctx );\n    mbedtls_des3_init( &ctx3 );\n    /*\n     * ECB mode\n     */\n    for( i = 0; i < 6; i++ )\n    {\n        u = i >> 1;\n        v = i  & 1;\n\n        if( verbose != 0 )\n            mbedtls_printf( \"  DES%c-ECB-%3d (%s): \",\n                             ( u == 0 ) ? ' ' : '3', 56 + u * 56,\n                             ( v == MBEDTLS_DES_DECRYPT ) ? \"dec\" : \"enc\" );\n\n        memcpy( buf, des3_test_buf, 8 );\n\n        switch( i )\n        {\n        case 0:\n            mbedtls_des_setkey_dec( &ctx, des3_test_keys );\n            break;\n\n        case 1:\n            mbedtls_des_setkey_enc( &ctx, des3_test_keys );\n            break;\n\n        case 2:\n            mbedtls_des3_set2key_dec( &ctx3, des3_test_keys );\n            break;\n\n        case 3:\n            mbedtls_des3_set2key_enc( &ctx3, des3_test_keys );\n            break;\n\n        case 4:\n            mbedtls_des3_set3key_dec( &ctx3, des3_test_keys );\n            break;\n\n        case 5:\n            mbedtls_des3_set3key_enc( &ctx3, des3_test_keys );\n            break;\n\n        default:\n            return( 1 );\n        }\n\n        for( j = 0; j < 10000; j++ )\n        {\n            if( u == 0 )\n                mbedtls_des_crypt_ecb( &ctx, buf, buf );\n            else\n                mbedtls_des3_crypt_ecb( &ctx3, buf, buf );\n        }\n\n        if( ( v == MBEDTLS_DES_DECRYPT &&\n                memcmp( buf, des3_test_ecb_dec[u], 8 ) != 0 ) ||\n            ( v != MBEDTLS_DES_DECRYPT &&\n                memcmp( buf, des3_test_ecb_enc[u], 8 ) != 0 ) )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            ret = 1;\n            goto exit;\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    /*\n     * CBC mode\n     */\n    for( i = 0; i < 6; i++ )\n    {\n        u = i >> 1;\n        v = i  & 1;\n\n        if( verbose != 0 )\n            mbedtls_printf( \"  DES%c-CBC-%3d (%s): \",\n                             ( u == 0 ) ? ' ' : '3', 56 + u * 56,\n                             ( v == MBEDTLS_DES_DECRYPT ) ? \"dec\" : \"enc\" );\n\n        memcpy( iv,  des3_test_iv,  8 );\n        memcpy( prv, des3_test_iv,  8 );\n        memcpy( buf, des3_test_buf, 8 );\n\n        switch( i )\n        {\n        case 0:\n            mbedtls_des_setkey_dec( &ctx, des3_test_keys );\n            break;\n\n        case 1:\n            mbedtls_des_setkey_enc( &ctx, des3_test_keys );\n            break;\n\n        case 2:\n            mbedtls_des3_set2key_dec( &ctx3, des3_test_keys );\n            break;\n\n        case 3:\n            mbedtls_des3_set2key_enc( &ctx3, des3_test_keys );\n            break;\n\n        case 4:\n            mbedtls_des3_set3key_dec( &ctx3, des3_test_keys );\n            break;\n\n        case 5:\n            mbedtls_des3_set3key_enc( &ctx3, des3_test_keys );\n            break;\n\n        default:\n            return( 1 );\n        }\n\n        if( v == MBEDTLS_DES_DECRYPT )\n        {\n            for( j = 0; j < 10000; j++ )\n            {\n                if( u == 0 )\n                    mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf );\n                else\n                    mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf );\n            }\n        }\n        else\n        {\n            for( j = 0; j < 10000; j++ )\n            {\n                unsigned char tmp[8];\n\n                if( u == 0 )\n                    mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf );\n                else\n                    mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf );\n\n                memcpy( tmp, prv, 8 );\n                memcpy( prv, buf, 8 );\n                memcpy( buf, tmp, 8 );\n            }\n\n            memcpy( buf, prv, 8 );\n        }\n\n        if( ( v == MBEDTLS_DES_DECRYPT &&\n                memcmp( buf, des3_test_cbc_dec[u], 8 ) != 0 ) ||\n            ( v != MBEDTLS_DES_DECRYPT &&\n                memcmp( buf, des3_test_cbc_enc[u], 8 ) != 0 ) )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            ret = 1;\n            goto exit;\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\nexit:\n    mbedtls_des_free( &ctx );\n    mbedtls_des3_free( &ctx3 );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_DES_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/dhm.c",
    "content": "/*\n *  Diffie-Hellman-Merkle key exchange\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The following sources were referenced in the design of this implementation\n *  of the Diffie-Hellman-Merkle algorithm:\n *\n *  [1] Handbook of Applied Cryptography - 1997, Chapter 12\n *      Menezes, van Oorschot and Vanstone\n *\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_DHM_C)\n\n#include \"mbedtls/dhm.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n#include \"mbedtls/pem.h\"\n#endif\n\n#if defined(MBEDTLS_ASN1_PARSE_C)\n#include \"mbedtls/asn1.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#include <stdio.h>\n#define mbedtls_printf     printf\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * helper to validate the mbedtls_mpi size and import it\n */\nstatic int dhm_read_bignum( mbedtls_mpi *X,\n                            unsigned char **p,\n                            const unsigned char *end )\n{\n    int ret, n;\n\n    if( end - *p < 2 )\n        return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );\n\n    n = ( (*p)[0] << 8 ) | (*p)[1];\n    (*p) += 2;\n\n    if( (int)( end - *p ) < n )\n        return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_mpi_read_binary( X, *p, n ) ) != 0 )\n        return( MBEDTLS_ERR_DHM_READ_PARAMS_FAILED + ret );\n\n    (*p) += n;\n\n    return( 0 );\n}\n\n/*\n * Verify sanity of parameter with regards to P\n *\n * Parameter should be: 2 <= public_param <= P - 2\n *\n * For more information on the attack, see:\n *  http://www.cl.cam.ac.uk/~rja14/Papers/psandqs.pdf\n *  http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2005-2643\n */\nstatic int dhm_check_range( const mbedtls_mpi *param, const mbedtls_mpi *P )\n{\n    mbedtls_mpi L, U;\n    int ret = MBEDTLS_ERR_DHM_BAD_INPUT_DATA;\n\n    mbedtls_mpi_init( &L ); mbedtls_mpi_init( &U );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &L, 2 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &U, P, 2 ) );\n\n    if( mbedtls_mpi_cmp_mpi( param, &L ) >= 0 &&\n        mbedtls_mpi_cmp_mpi( param, &U ) <= 0 )\n    {\n        ret = 0;\n    }\n\ncleanup:\n    mbedtls_mpi_free( &L ); mbedtls_mpi_free( &U );\n    return( ret );\n}\n\nvoid mbedtls_dhm_init( mbedtls_dhm_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_dhm_context ) );\n}\n\n/*\n * Parse the ServerKeyExchange parameters\n */\nint mbedtls_dhm_read_params( mbedtls_dhm_context *ctx,\n                     unsigned char **p,\n                     const unsigned char *end )\n{\n    int ret;\n\n    if( ( ret = dhm_read_bignum( &ctx->P,  p, end ) ) != 0 ||\n        ( ret = dhm_read_bignum( &ctx->G,  p, end ) ) != 0 ||\n        ( ret = dhm_read_bignum( &ctx->GY, p, end ) ) != 0 )\n        return( ret );\n\n    if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 )\n        return( ret );\n\n    ctx->len = mbedtls_mpi_size( &ctx->P );\n\n    return( 0 );\n}\n\n/*\n * Setup and write the ServerKeyExchange parameters\n */\nint mbedtls_dhm_make_params( mbedtls_dhm_context *ctx, int x_size,\n                     unsigned char *output, size_t *olen,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng )\n{\n    int ret, count = 0;\n    size_t n1, n2, n3;\n    unsigned char *p;\n\n    if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 )\n        return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );\n\n    /*\n     * Generate X as large as possible ( < P )\n     */\n    do\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->X, x_size, f_rng, p_rng ) );\n\n        while( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->P ) >= 0 )\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->X, 1 ) );\n\n        if( count++ > 10 )\n            return( MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED );\n    }\n    while( dhm_check_range( &ctx->X, &ctx->P ) != 0 );\n\n    /*\n     * Calculate GX = G^X mod P\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->GX, &ctx->G, &ctx->X,\n                          &ctx->P , &ctx->RP ) );\n\n    if( ( ret = dhm_check_range( &ctx->GX, &ctx->P ) ) != 0 )\n        return( ret );\n\n    /*\n     * export P, G, GX\n     */\n#define DHM_MPI_EXPORT(X,n)                     \\\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( X, p + 2, n ) ); \\\n    *p++ = (unsigned char)( n >> 8 );           \\\n    *p++ = (unsigned char)( n      ); p += n;\n\n    n1 = mbedtls_mpi_size( &ctx->P  );\n    n2 = mbedtls_mpi_size( &ctx->G  );\n    n3 = mbedtls_mpi_size( &ctx->GX );\n\n    p = output;\n    DHM_MPI_EXPORT( &ctx->P , n1 );\n    DHM_MPI_EXPORT( &ctx->G , n2 );\n    DHM_MPI_EXPORT( &ctx->GX, n3 );\n\n    *olen  = p - output;\n\n    ctx->len = n1;\n\ncleanup:\n\n    if( ret != 0 )\n        return( MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED + ret );\n\n    return( 0 );\n}\n\n/*\n * Import the peer's public value G^Y\n */\nint mbedtls_dhm_read_public( mbedtls_dhm_context *ctx,\n                     const unsigned char *input, size_t ilen )\n{\n    int ret;\n\n    if( ctx == NULL || ilen < 1 || ilen > ctx->len )\n        return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_mpi_read_binary( &ctx->GY, input, ilen ) ) != 0 )\n        return( MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED + ret );\n\n    return( 0 );\n}\n\n/*\n * Create own private value X and export G^X\n */\nint mbedtls_dhm_make_public( mbedtls_dhm_context *ctx, int x_size,\n                     unsigned char *output, size_t olen,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng )\n{\n    int ret, count = 0;\n\n    if( ctx == NULL || olen < 1 || olen > ctx->len )\n        return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );\n\n    if( mbedtls_mpi_cmp_int( &ctx->P, 0 ) == 0 )\n        return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );\n\n    /*\n     * generate X and calculate GX = G^X mod P\n     */\n    do\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->X, x_size, f_rng, p_rng ) );\n\n        while( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->P ) >= 0 )\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->X, 1 ) );\n\n        if( count++ > 10 )\n            return( MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED );\n    }\n    while( dhm_check_range( &ctx->X, &ctx->P ) != 0 );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->GX, &ctx->G, &ctx->X,\n                          &ctx->P , &ctx->RP ) );\n\n    if( ( ret = dhm_check_range( &ctx->GX, &ctx->P ) ) != 0 )\n        return( ret );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->GX, output, olen ) );\n\ncleanup:\n\n    if( ret != 0 )\n        return( MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED + ret );\n\n    return( 0 );\n}\n\n/*\n * Use the blinding method and optimisation suggested in section 10 of:\n *  KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA,\n *  DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer\n *  Berlin Heidelberg, 1996. p. 104-113.\n */\nstatic int dhm_update_blinding( mbedtls_dhm_context *ctx,\n                    int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    int ret, count;\n\n    /*\n     * Don't use any blinding the first time a particular X is used,\n     * but remember it to use blinding next time.\n     */\n    if( mbedtls_mpi_cmp_mpi( &ctx->X, &ctx->pX ) != 0 )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &ctx->pX, &ctx->X ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->Vi, 1 ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->Vf, 1 ) );\n\n        return( 0 );\n    }\n\n    /*\n     * Ok, we need blinding. Can we re-use existing values?\n     * If yes, just update them by squaring them.\n     */\n    if( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) != 0 )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &ctx->Vi ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->P ) );\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vf, &ctx->Vf, &ctx->Vf ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vf, &ctx->Vf, &ctx->P ) );\n\n        return( 0 );\n    }\n\n    /*\n     * We need to generate blinding values from scratch\n     */\n\n    /* Vi = random( 2, P-1 ) */\n    count = 0;\n    do\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->Vi, mbedtls_mpi_size( &ctx->P ), f_rng, p_rng ) );\n\n        while( mbedtls_mpi_cmp_mpi( &ctx->Vi, &ctx->P ) >= 0 )\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &ctx->Vi, 1 ) );\n\n        if( count++ > 10 )\n            return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE );\n    }\n    while( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) <= 0 );\n\n    /* Vf = Vi^-X mod P */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->Vf, &ctx->Vi, &ctx->P ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->Vf, &ctx->Vf, &ctx->X, &ctx->P, &ctx->RP ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Derive and export the shared secret (G^Y)^X mod P\n */\nint mbedtls_dhm_calc_secret( mbedtls_dhm_context *ctx,\n                     unsigned char *output, size_t output_size, size_t *olen,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng )\n{\n    int ret;\n    mbedtls_mpi GYb;\n\n    if( ctx == NULL || output_size < ctx->len )\n        return( MBEDTLS_ERR_DHM_BAD_INPUT_DATA );\n\n    if( ( ret = dhm_check_range( &ctx->GY, &ctx->P ) ) != 0 )\n        return( ret );\n\n    mbedtls_mpi_init( &GYb );\n\n    /* Blind peer's value */\n    if( f_rng != NULL )\n    {\n        MBEDTLS_MPI_CHK( dhm_update_blinding( ctx, f_rng, p_rng ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &GYb, &ctx->GY, &ctx->Vi ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &GYb, &GYb, &ctx->P ) );\n    }\n    else\n        MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &GYb, &ctx->GY ) );\n\n    /* Do modular exponentiation */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->K, &GYb, &ctx->X,\n                          &ctx->P, &ctx->RP ) );\n\n    /* Unblind secret value */\n    if( f_rng != NULL )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->K, &ctx->K, &ctx->Vf ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->K, &ctx->K, &ctx->P ) );\n    }\n\n    *olen = mbedtls_mpi_size( &ctx->K );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &ctx->K, output, *olen ) );\n\ncleanup:\n    mbedtls_mpi_free( &GYb );\n\n    if( ret != 0 )\n        return( MBEDTLS_ERR_DHM_CALC_SECRET_FAILED + ret );\n\n    return( 0 );\n}\n\n/*\n * Free the components of a DHM key\n */\nvoid mbedtls_dhm_free( mbedtls_dhm_context *ctx )\n{\n    mbedtls_mpi_free( &ctx->pX); mbedtls_mpi_free( &ctx->Vf ); mbedtls_mpi_free( &ctx->Vi );\n    mbedtls_mpi_free( &ctx->RP ); mbedtls_mpi_free( &ctx->K ); mbedtls_mpi_free( &ctx->GY );\n    mbedtls_mpi_free( &ctx->GX ); mbedtls_mpi_free( &ctx->X ); mbedtls_mpi_free( &ctx->G );\n    mbedtls_mpi_free( &ctx->P );\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_dhm_context ) );\n}\n\n#if defined(MBEDTLS_ASN1_PARSE_C)\n/*\n * Parse DHM parameters\n */\nint mbedtls_dhm_parse_dhm( mbedtls_dhm_context *dhm, const unsigned char *dhmin,\n                   size_t dhminlen )\n{\n    int ret;\n    size_t len;\n    unsigned char *p, *end;\n#if defined(MBEDTLS_PEM_PARSE_C)\n    mbedtls_pem_context pem;\n\n    mbedtls_pem_init( &pem );\n\n    /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */\n    if( dhminlen == 0 || dhmin[dhminlen - 1] != '\\0' )\n        ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;\n    else\n        ret = mbedtls_pem_read_buffer( &pem,\n                               \"-----BEGIN DH PARAMETERS-----\",\n                               \"-----END DH PARAMETERS-----\",\n                               dhmin, NULL, 0, &dhminlen );\n\n    if( ret == 0 )\n    {\n        /*\n         * Was PEM encoded\n         */\n        dhminlen = pem.buflen;\n    }\n    else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )\n        goto exit;\n\n    p = ( ret == 0 ) ? pem.buf : (unsigned char *) dhmin;\n#else\n    p = (unsigned char *) dhmin;\n#endif /* MBEDTLS_PEM_PARSE_C */\n    end = p + dhminlen;\n\n    /*\n     *  DHParams ::= SEQUENCE {\n     *      prime              INTEGER,  -- P\n     *      generator          INTEGER,  -- g\n     *      privateValueLength INTEGER OPTIONAL\n     *  }\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret;\n        goto exit;\n    }\n\n    end = p + len;\n\n    if( ( ret = mbedtls_asn1_get_mpi( &p, end, &dhm->P  ) ) != 0 ||\n        ( ret = mbedtls_asn1_get_mpi( &p, end, &dhm->G ) ) != 0 )\n    {\n        ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret;\n        goto exit;\n    }\n\n    if( p != end )\n    {\n        /* This might be the optional privateValueLength.\n         * If so, we can cleanly discard it */\n        mbedtls_mpi rec;\n        mbedtls_mpi_init( &rec );\n        ret = mbedtls_asn1_get_mpi( &p, end, &rec );\n        mbedtls_mpi_free( &rec );\n        if ( ret != 0 )\n        {\n            ret = MBEDTLS_ERR_DHM_INVALID_FORMAT + ret;\n            goto exit;\n        }\n        if ( p != end )\n        {\n            ret = MBEDTLS_ERR_DHM_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;\n            goto exit;\n        }\n    }\n\n    ret = 0;\n\n    dhm->len = mbedtls_mpi_size( &dhm->P );\n\nexit:\n#if defined(MBEDTLS_PEM_PARSE_C)\n    mbedtls_pem_free( &pem );\n#endif\n    if( ret != 0 )\n        mbedtls_dhm_free( dhm );\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_FS_IO)\n/*\n * Load all data from a file into a given buffer.\n *\n * The file is expected to contain either PEM or DER encoded data.\n * A terminating null byte is always appended. It is included in the announced\n * length only if the data looks like it is PEM encoded.\n */\nstatic int load_file( const char *path, unsigned char **buf, size_t *n )\n{\n    FILE *f;\n    long size;\n\n    if( ( f = fopen( path, \"rb\" ) ) == NULL )\n        return( MBEDTLS_ERR_DHM_FILE_IO_ERROR );\n\n    fseek( f, 0, SEEK_END );\n    if( ( size = ftell( f ) ) == -1 )\n    {\n        fclose( f );\n        return( MBEDTLS_ERR_DHM_FILE_IO_ERROR );\n    }\n    fseek( f, 0, SEEK_SET );\n\n    *n = (size_t) size;\n\n    if( *n + 1 == 0 ||\n        ( *buf = mbedtls_calloc( 1, *n + 1 ) ) == NULL )\n    {\n        fclose( f );\n        return( MBEDTLS_ERR_DHM_ALLOC_FAILED );\n    }\n\n    if( fread( *buf, 1, *n, f ) != *n )\n    {\n        fclose( f );\n        mbedtls_free( *buf );\n        return( MBEDTLS_ERR_DHM_FILE_IO_ERROR );\n    }\n\n    fclose( f );\n\n    (*buf)[*n] = '\\0';\n\n    if( strstr( (const char *) *buf, \"-----BEGIN \" ) != NULL )\n        ++*n;\n\n    return( 0 );\n}\n\n/*\n * Load and parse DHM parameters\n */\nint mbedtls_dhm_parse_dhmfile( mbedtls_dhm_context *dhm, const char *path )\n{\n    int ret;\n    size_t n;\n    unsigned char *buf;\n\n    if( ( ret = load_file( path, &buf, &n ) ) != 0 )\n        return( ret );\n\n    ret = mbedtls_dhm_parse_dhm( dhm, buf, n );\n\n    mbedtls_zeroize( buf, n );\n    mbedtls_free( buf );\n\n    return( ret );\n}\n#endif /* MBEDTLS_FS_IO */\n#endif /* MBEDTLS_ASN1_PARSE_C */\n\n#if defined(MBEDTLS_SELF_TEST)\n\nstatic const char mbedtls_test_dhm_params[] =\n\"-----BEGIN DH PARAMETERS-----\\r\\n\"\n\"MIGHAoGBAJ419DBEOgmQTzo5qXl5fQcN9TN455wkOL7052HzxxRVMyhYmwQcgJvh\\r\\n\"\n\"1sa18fyfR9OiVEMYglOpkqVoGLN7qd5aQNNi5W7/C+VBdHTBJcGZJyyP5B3qcz32\\r\\n\"\n\"9mLJKudlVudV0Qxk5qUJaPZ/xupz0NyoVpviuiBOI1gNi8ovSXWzAgEC\\r\\n\"\n\"-----END DH PARAMETERS-----\\r\\n\";\n\nstatic const size_t mbedtls_test_dhm_params_len = sizeof( mbedtls_test_dhm_params );\n\n/*\n * Checkup routine\n */\nint mbedtls_dhm_self_test( int verbose )\n{\n    int ret;\n    mbedtls_dhm_context dhm;\n\n    mbedtls_dhm_init( &dhm );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  DHM parameter load: \" );\n\n    if( ( ret = mbedtls_dhm_parse_dhm( &dhm,\n                    (const unsigned char *) mbedtls_test_dhm_params,\n                    mbedtls_test_dhm_params_len ) ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        ret = 1;\n        goto exit;\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\\n\" );\n\nexit:\n    mbedtls_dhm_free( &dhm );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_DHM_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ecdh.c",
    "content": "/*\n *  Elliptic curve Diffie-Hellman\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * References:\n *\n * SEC1 http://www.secg.org/index.php?action=secg,docs_secg\n * RFC 4492\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ECDH_C)\n\n#include \"mbedtls/ecdh.h\"\n\n#include <string.h>\n\n/*\n * Generate public key: simple wrapper around mbedtls_ecp_gen_keypair\n */\nint mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng )\n{\n    return mbedtls_ecp_gen_keypair( grp, d, Q, f_rng, p_rng );\n}\n\n/*\n * Compute shared secret (SEC1 3.3.1)\n */\nint mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z,\n                         const mbedtls_ecp_point *Q, const mbedtls_mpi *d,\n                         int (*f_rng)(void *, unsigned char *, size_t),\n                         void *p_rng )\n{\n    int ret;\n    mbedtls_ecp_point P;\n\n    mbedtls_ecp_point_init( &P );\n\n    /*\n     * Make sure Q is a valid pubkey before using it\n     */\n    MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, Q ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( grp, &P, d, Q, f_rng, p_rng ) );\n\n    if( mbedtls_ecp_is_zero( &P ) )\n    {\n        ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;\n        goto cleanup;\n    }\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( z, &P.X ) );\n\ncleanup:\n    mbedtls_ecp_point_free( &P );\n\n    return( ret );\n}\n\n/*\n * Initialize context\n */\nvoid mbedtls_ecdh_init( mbedtls_ecdh_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_ecdh_context ) );\n}\n\n/*\n * Free context\n */\nvoid mbedtls_ecdh_free( mbedtls_ecdh_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_ecp_group_free( &ctx->grp );\n    mbedtls_ecp_point_free( &ctx->Q   );\n    mbedtls_ecp_point_free( &ctx->Qp  );\n    mbedtls_ecp_point_free( &ctx->Vi  );\n    mbedtls_ecp_point_free( &ctx->Vf  );\n    mbedtls_mpi_free( &ctx->d  );\n    mbedtls_mpi_free( &ctx->z  );\n    mbedtls_mpi_free( &ctx->_d );\n}\n\n/*\n * Setup and write the ServerKeyExhange parameters (RFC 4492)\n *      struct {\n *          ECParameters    curve_params;\n *          ECPoint         public;\n *      } ServerECDHParams;\n */\nint mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen,\n                      unsigned char *buf, size_t blen,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng )\n{\n    int ret;\n    size_t grp_len, pt_len;\n\n    if( ctx == NULL || ctx->grp.pbits == 0 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_ecdh_gen_public( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) )\n                != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_ecp_tls_write_group( &ctx->grp, &grp_len, buf, blen ) )\n                != 0 )\n        return( ret );\n\n    buf += grp_len;\n    blen -= grp_len;\n\n    if( ( ret = mbedtls_ecp_tls_write_point( &ctx->grp, &ctx->Q, ctx->point_format,\n                                     &pt_len, buf, blen ) ) != 0 )\n        return( ret );\n\n    *olen = grp_len + pt_len;\n    return( 0 );\n}\n\n/*\n * Read the ServerKeyExhange parameters (RFC 4492)\n *      struct {\n *          ECParameters    curve_params;\n *          ECPoint         public;\n *      } ServerECDHParams;\n */\nint mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx,\n                      const unsigned char **buf, const unsigned char *end )\n{\n    int ret;\n\n    if( ( ret = mbedtls_ecp_tls_read_group( &ctx->grp, buf, end - *buf ) ) != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_ecp_tls_read_point( &ctx->grp, &ctx->Qp, buf, end - *buf ) )\n                != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\n/*\n * Get parameters from a keypair\n */\nint mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx, const mbedtls_ecp_keypair *key,\n                     mbedtls_ecdh_side side )\n{\n    int ret;\n\n    if( ( ret = mbedtls_ecp_group_copy( &ctx->grp, &key->grp ) ) != 0 )\n        return( ret );\n\n    /* If it's not our key, just import the public part as Qp */\n    if( side == MBEDTLS_ECDH_THEIRS )\n        return( mbedtls_ecp_copy( &ctx->Qp, &key->Q ) );\n\n    /* Our key: import public (as Q) and private parts */\n    if( side != MBEDTLS_ECDH_OURS )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_ecp_copy( &ctx->Q, &key->Q ) ) != 0 ||\n        ( ret = mbedtls_mpi_copy( &ctx->d, &key->d ) ) != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\n/*\n * Setup and export the client public value\n */\nint mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen,\n                      unsigned char *buf, size_t blen,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng )\n{\n    int ret;\n\n    if( ctx == NULL || ctx->grp.pbits == 0 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_ecdh_gen_public( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) )\n                != 0 )\n        return( ret );\n\n    return mbedtls_ecp_tls_write_point( &ctx->grp, &ctx->Q, ctx->point_format,\n                                olen, buf, blen );\n}\n\n/*\n * Parse and import the client's public value\n */\nint mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx,\n                      const unsigned char *buf, size_t blen )\n{\n    int ret;\n    const unsigned char *p = buf;\n\n    if( ctx == NULL )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_ecp_tls_read_point( &ctx->grp, &ctx->Qp, &p, blen ) ) != 0 )\n        return( ret );\n\n    if( (size_t)( p - buf ) != blen )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    return( 0 );\n}\n\n/*\n * Derive and export the shared secret\n */\nint mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen,\n                      unsigned char *buf, size_t blen,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng )\n{\n    int ret;\n\n    if( ctx == NULL )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_ecdh_compute_shared( &ctx->grp, &ctx->z, &ctx->Qp, &ctx->d,\n                                     f_rng, p_rng ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( mbedtls_mpi_size( &ctx->z ) > blen )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    *olen = ctx->grp.pbits / 8 + ( ( ctx->grp.pbits % 8 ) != 0 );\n    return mbedtls_mpi_write_binary( &ctx->z, buf, *olen );\n}\n\n#endif /* MBEDTLS_ECDH_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ecdsa.c",
    "content": "/*\n *  Elliptic curve DSA\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * References:\n *\n * SEC1 http://www.secg.org/index.php?action=secg,docs_secg\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ECDSA_C)\n\n#include \"mbedtls/ecdsa.h\"\n#include \"mbedtls/asn1write.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_ECDSA_DETERMINISTIC)\n#include \"mbedtls/hmac_drbg.h\"\n#endif\n\n/*\n * Derive a suitable integer for group grp from a buffer of length len\n * SEC1 4.1.3 step 5 aka SEC1 4.1.4 step 3\n */\nstatic int derive_mpi( const mbedtls_ecp_group *grp, mbedtls_mpi *x,\n                       const unsigned char *buf, size_t blen )\n{\n    int ret;\n    size_t n_size = ( grp->nbits + 7 ) / 8;\n    size_t use_size = blen > n_size ? n_size : blen;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( x, buf, use_size ) );\n    if( use_size * 8 > grp->nbits )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( x, use_size * 8 - grp->nbits ) );\n\n    /* While at it, reduce modulo N */\n    if( mbedtls_mpi_cmp_mpi( x, &grp->N ) >= 0 )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( x, x, &grp->N ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Compute ECDSA signature of a hashed message (SEC1 4.1.3)\n * Obviously, compared to SEC1 4.1.3, we skip step 4 (hash message)\n */\nint mbedtls_ecdsa_sign( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,\n                const mbedtls_mpi *d, const unsigned char *buf, size_t blen,\n                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    int ret, key_tries, sign_tries, blind_tries;\n    mbedtls_ecp_point R;\n    mbedtls_mpi k, e, t;\n\n    /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */\n    if( grp->N.p == NULL )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    mbedtls_ecp_point_init( &R );\n    mbedtls_mpi_init( &k ); mbedtls_mpi_init( &e ); mbedtls_mpi_init( &t );\n\n    sign_tries = 0;\n    do\n    {\n        /*\n         * Steps 1-3: generate a suitable ephemeral keypair\n         * and set r = xR mod n\n         */\n        key_tries = 0;\n        do\n        {\n            MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair( grp, &k, &R, f_rng, p_rng ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( r, &R.X, &grp->N ) );\n\n            if( key_tries++ > 10 )\n            {\n                ret = MBEDTLS_ERR_ECP_RANDOM_FAILED;\n                goto cleanup;\n            }\n        }\n        while( mbedtls_mpi_cmp_int( r, 0 ) == 0 );\n\n        /*\n         * Step 5: derive MPI from hashed message\n         */\n        MBEDTLS_MPI_CHK( derive_mpi( grp, &e, buf, blen ) );\n\n        /*\n         * Generate a random value to blind inv_mod in next step,\n         * avoiding a potential timing leak.\n         */\n        blind_tries = 0;\n        do\n        {\n            size_t n_size = ( grp->nbits + 7 ) / 8;\n            MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &t, n_size, f_rng, p_rng ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &t, 8 * n_size - grp->nbits ) );\n\n            /* See mbedtls_ecp_gen_keypair() */\n            if( ++blind_tries > 30 )\n                return( MBEDTLS_ERR_ECP_RANDOM_FAILED );\n        }\n        while( mbedtls_mpi_cmp_int( &t, 1 ) < 0 ||\n               mbedtls_mpi_cmp_mpi( &t, &grp->N ) >= 0 );\n\n        /*\n         * Step 6: compute s = (e + r * d) / k = t (e + rd) / (kt) mod n\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( s, r, d ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &e, &e, s ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &e, &e, &t ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &k, &k, &t ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( s, &k, &grp->N ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( s, s, &e ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( s, s, &grp->N ) );\n\n        if( sign_tries++ > 10 )\n        {\n            ret = MBEDTLS_ERR_ECP_RANDOM_FAILED;\n            goto cleanup;\n        }\n    }\n    while( mbedtls_mpi_cmp_int( s, 0 ) == 0 );\n\ncleanup:\n    mbedtls_ecp_point_free( &R );\n    mbedtls_mpi_free( &k ); mbedtls_mpi_free( &e ); mbedtls_mpi_free( &t );\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_ECDSA_DETERMINISTIC)\n/*\n * Deterministic signature wrapper\n */\nint mbedtls_ecdsa_sign_det( mbedtls_ecp_group *grp, mbedtls_mpi *r, mbedtls_mpi *s,\n                    const mbedtls_mpi *d, const unsigned char *buf, size_t blen,\n                    mbedtls_md_type_t md_alg )\n{\n    int ret;\n    mbedtls_hmac_drbg_context rng_ctx;\n    unsigned char data[2 * MBEDTLS_ECP_MAX_BYTES];\n    size_t grp_len = ( grp->nbits + 7 ) / 8;\n    const mbedtls_md_info_t *md_info;\n    mbedtls_mpi h;\n\n    if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    mbedtls_mpi_init( &h );\n    mbedtls_hmac_drbg_init( &rng_ctx );\n\n    /* Use private key and message hash (reduced) to initialize HMAC_DRBG */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( d, data, grp_len ) );\n    MBEDTLS_MPI_CHK( derive_mpi( grp, &h, buf, blen ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &h, data + grp_len, grp_len ) );\n    mbedtls_hmac_drbg_seed_buf( &rng_ctx, md_info, data, 2 * grp_len );\n\n    ret = mbedtls_ecdsa_sign( grp, r, s, d, buf, blen,\n                      mbedtls_hmac_drbg_random, &rng_ctx );\n\ncleanup:\n    mbedtls_hmac_drbg_free( &rng_ctx );\n    mbedtls_mpi_free( &h );\n\n    return( ret );\n}\n#endif /* MBEDTLS_ECDSA_DETERMINISTIC */\n\n/*\n * Verify ECDSA signature of hashed message (SEC1 4.1.4)\n * Obviously, compared to SEC1 4.1.3, we skip step 2 (hash message)\n */\nint mbedtls_ecdsa_verify( mbedtls_ecp_group *grp,\n                  const unsigned char *buf, size_t blen,\n                  const mbedtls_ecp_point *Q, const mbedtls_mpi *r, const mbedtls_mpi *s)\n{\n    int ret;\n    mbedtls_mpi e, s_inv, u1, u2;\n    mbedtls_ecp_point R;\n\n    mbedtls_ecp_point_init( &R );\n    mbedtls_mpi_init( &e ); mbedtls_mpi_init( &s_inv ); mbedtls_mpi_init( &u1 ); mbedtls_mpi_init( &u2 );\n\n    /* Fail cleanly on curves such as Curve25519 that can't be used for ECDSA */\n    if( grp->N.p == NULL )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    /*\n     * Step 1: make sure r and s are in range 1..n-1\n     */\n    if( mbedtls_mpi_cmp_int( r, 1 ) < 0 || mbedtls_mpi_cmp_mpi( r, &grp->N ) >= 0 ||\n        mbedtls_mpi_cmp_int( s, 1 ) < 0 || mbedtls_mpi_cmp_mpi( s, &grp->N ) >= 0 )\n    {\n        ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;\n        goto cleanup;\n    }\n\n    /*\n     * Additional precaution: make sure Q is valid\n     */\n    MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, Q ) );\n\n    /*\n     * Step 3: derive MPI from hashed message\n     */\n    MBEDTLS_MPI_CHK( derive_mpi( grp, &e, buf, blen ) );\n\n    /*\n     * Step 4: u1 = e / s mod n, u2 = r / s mod n\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &s_inv, s, &grp->N ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &u1, &e, &s_inv ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &u1, &u1, &grp->N ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &u2, r, &s_inv ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &u2, &u2, &grp->N ) );\n\n    /*\n     * Step 5: R = u1 G + u2 Q\n     *\n     * Since we're not using any secret data, no need to pass a RNG to\n     * mbedtls_ecp_mul() for countermesures.\n     */\n    MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, &R, &u1, &grp->G, &u2, Q ) );\n\n    if( mbedtls_ecp_is_zero( &R ) )\n    {\n        ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;\n        goto cleanup;\n    }\n\n    /*\n     * Step 6: convert xR to an integer (no-op)\n     * Step 7: reduce xR mod n (gives v)\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &R.X, &R.X, &grp->N ) );\n\n    /*\n     * Step 8: check if v (that is, R.X) is equal to r\n     */\n    if( mbedtls_mpi_cmp_mpi( &R.X, r ) != 0 )\n    {\n        ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;\n        goto cleanup;\n    }\n\ncleanup:\n    mbedtls_ecp_point_free( &R );\n    mbedtls_mpi_free( &e ); mbedtls_mpi_free( &s_inv ); mbedtls_mpi_free( &u1 ); mbedtls_mpi_free( &u2 );\n\n    return( ret );\n}\n\n/*\n * Convert a signature (given by context) to ASN.1\n */\nstatic int ecdsa_signature_to_asn1( const mbedtls_mpi *r, const mbedtls_mpi *s,\n                                    unsigned char *sig, size_t *slen )\n{\n    int ret;\n    unsigned char buf[MBEDTLS_ECDSA_MAX_LEN];\n    unsigned char *p = buf + sizeof( buf );\n    size_t len = 0;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &p, buf, s ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &p, buf, r ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &p, buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &p, buf,\n                                       MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) );\n\n    memcpy( sig, p, len );\n    *slen = len;\n\n    return( 0 );\n}\n\n/*\n * Compute and write signature\n */\nint mbedtls_ecdsa_write_signature( mbedtls_ecdsa_context *ctx, mbedtls_md_type_t md_alg,\n                           const unsigned char *hash, size_t hlen,\n                           unsigned char *sig, size_t *slen,\n                           int (*f_rng)(void *, unsigned char *, size_t),\n                           void *p_rng )\n{\n    int ret;\n    mbedtls_mpi r, s;\n\n    mbedtls_mpi_init( &r );\n    mbedtls_mpi_init( &s );\n\n#if defined(MBEDTLS_ECDSA_DETERMINISTIC)\n    (void) f_rng;\n    (void) p_rng;\n\n    MBEDTLS_MPI_CHK( mbedtls_ecdsa_sign_det( &ctx->grp, &r, &s, &ctx->d,\n                             hash, hlen, md_alg ) );\n#else\n    (void) md_alg;\n\n    MBEDTLS_MPI_CHK( mbedtls_ecdsa_sign( &ctx->grp, &r, &s, &ctx->d,\n                         hash, hlen, f_rng, p_rng ) );\n#endif\n\n    MBEDTLS_MPI_CHK( ecdsa_signature_to_asn1( &r, &s, sig, slen ) );\n\ncleanup:\n    mbedtls_mpi_free( &r );\n    mbedtls_mpi_free( &s );\n\n    return( ret );\n}\n\n#if ! defined(MBEDTLS_DEPRECATED_REMOVED) && \\\n    defined(MBEDTLS_ECDSA_DETERMINISTIC)\nint mbedtls_ecdsa_write_signature_det( mbedtls_ecdsa_context *ctx,\n                               const unsigned char *hash, size_t hlen,\n                               unsigned char *sig, size_t *slen,\n                               mbedtls_md_type_t md_alg )\n{\n    return( mbedtls_ecdsa_write_signature( ctx, md_alg, hash, hlen, sig, slen,\n                                   NULL, NULL ) );\n}\n#endif\n\n/*\n * Read and check signature\n */\nint mbedtls_ecdsa_read_signature( mbedtls_ecdsa_context *ctx,\n                          const unsigned char *hash, size_t hlen,\n                          const unsigned char *sig, size_t slen )\n{\n    int ret;\n    unsigned char *p = (unsigned char *) sig;\n    const unsigned char *end = sig + slen;\n    size_t len;\n    mbedtls_mpi r, s;\n\n    mbedtls_mpi_init( &r );\n    mbedtls_mpi_init( &s );\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n                    MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA;\n        goto cleanup;\n    }\n\n    if( p + len != end )\n    {\n        ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA +\n              MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;\n        goto cleanup;\n    }\n\n    if( ( ret = mbedtls_asn1_get_mpi( &p, end, &r ) ) != 0 ||\n        ( ret = mbedtls_asn1_get_mpi( &p, end, &s ) ) != 0 )\n    {\n        ret += MBEDTLS_ERR_ECP_BAD_INPUT_DATA;\n        goto cleanup;\n    }\n\n    if( ( ret = mbedtls_ecdsa_verify( &ctx->grp, hash, hlen,\n                              &ctx->Q, &r, &s ) ) != 0 )\n        goto cleanup;\n\n    if( p != end )\n        ret = MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH;\n\ncleanup:\n    mbedtls_mpi_free( &r );\n    mbedtls_mpi_free( &s );\n\n    return( ret );\n}\n\n/*\n * Generate key pair\n */\nint mbedtls_ecdsa_genkey( mbedtls_ecdsa_context *ctx, mbedtls_ecp_group_id gid,\n                  int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    return( mbedtls_ecp_group_load( &ctx->grp, gid ) ||\n            mbedtls_ecp_gen_keypair( &ctx->grp, &ctx->d, &ctx->Q, f_rng, p_rng ) );\n}\n\n/*\n * Set context from an mbedtls_ecp_keypair\n */\nint mbedtls_ecdsa_from_keypair( mbedtls_ecdsa_context *ctx, const mbedtls_ecp_keypair *key )\n{\n    int ret;\n\n    if( ( ret = mbedtls_ecp_group_copy( &ctx->grp, &key->grp ) ) != 0 ||\n        ( ret = mbedtls_mpi_copy( &ctx->d, &key->d ) ) != 0 ||\n        ( ret = mbedtls_ecp_copy( &ctx->Q, &key->Q ) ) != 0 )\n    {\n        mbedtls_ecdsa_free( ctx );\n    }\n\n    return( ret );\n}\n\n/*\n * Initialize context\n */\nvoid mbedtls_ecdsa_init( mbedtls_ecdsa_context *ctx )\n{\n    mbedtls_ecp_keypair_init( ctx );\n}\n\n/*\n * Free context\n */\nvoid mbedtls_ecdsa_free( mbedtls_ecdsa_context *ctx )\n{\n    mbedtls_ecp_keypair_free( ctx );\n}\n\n#endif /* MBEDTLS_ECDSA_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ecjpake.c",
    "content": "/*\n *  Elliptic curve J-PAKE\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * References in the code are to the Thread v1.0 Specification,\n * available to members of the Thread Group http://threadgroup.org/\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ECJPAKE_C)\n\n#include \"mbedtls/ecjpake.h\"\n\n#include <string.h>\n\n/*\n * Convert a mbedtls_ecjpake_role to identifier string\n */\nstatic const char * const ecjpake_id[] = {\n    \"client\",\n    \"server\"\n};\n\n#define ID_MINE     ( ecjpake_id[ ctx->role ] )\n#define ID_PEER     ( ecjpake_id[ 1 - ctx->role ] )\n\n/*\n * Initialize context\n */\nvoid mbedtls_ecjpake_init( mbedtls_ecjpake_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    ctx->md_info = NULL;\n    mbedtls_ecp_group_init( &ctx->grp );\n    ctx->point_format = MBEDTLS_ECP_PF_UNCOMPRESSED;\n\n    mbedtls_ecp_point_init( &ctx->Xm1 );\n    mbedtls_ecp_point_init( &ctx->Xm2 );\n    mbedtls_ecp_point_init( &ctx->Xp1 );\n    mbedtls_ecp_point_init( &ctx->Xp2 );\n    mbedtls_ecp_point_init( &ctx->Xp  );\n\n    mbedtls_mpi_init( &ctx->xm1 );\n    mbedtls_mpi_init( &ctx->xm2 );\n    mbedtls_mpi_init( &ctx->s   );\n}\n\n/*\n * Free context\n */\nvoid mbedtls_ecjpake_free( mbedtls_ecjpake_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    ctx->md_info = NULL;\n    mbedtls_ecp_group_free( &ctx->grp );\n\n    mbedtls_ecp_point_free( &ctx->Xm1 );\n    mbedtls_ecp_point_free( &ctx->Xm2 );\n    mbedtls_ecp_point_free( &ctx->Xp1 );\n    mbedtls_ecp_point_free( &ctx->Xp2 );\n    mbedtls_ecp_point_free( &ctx->Xp  );\n\n    mbedtls_mpi_free( &ctx->xm1 );\n    mbedtls_mpi_free( &ctx->xm2 );\n    mbedtls_mpi_free( &ctx->s   );\n}\n\n/*\n * Setup context\n */\nint mbedtls_ecjpake_setup( mbedtls_ecjpake_context *ctx,\n                           mbedtls_ecjpake_role role,\n                           mbedtls_md_type_t hash,\n                           mbedtls_ecp_group_id curve,\n                           const unsigned char *secret,\n                           size_t len )\n{\n    int ret;\n\n    ctx->role = role;\n\n    if( ( ctx->md_info = mbedtls_md_info_from_type( hash ) ) == NULL )\n        return( MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE );\n\n    MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &ctx->grp, curve ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->s, secret, len ) );\n\ncleanup:\n    if( ret != 0 )\n        mbedtls_ecjpake_free( ctx );\n\n    return( ret );\n}\n\n/*\n * Check if context is ready for use\n */\nint mbedtls_ecjpake_check( const mbedtls_ecjpake_context *ctx )\n{\n    if( ctx->md_info == NULL ||\n        ctx->grp.id == MBEDTLS_ECP_DP_NONE ||\n        ctx->s.p == NULL )\n    {\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n    }\n\n    return( 0 );\n}\n\n/*\n * Write a point plus its length to a buffer\n */\nstatic int ecjpake_write_len_point( unsigned char **p,\n                                    const unsigned char *end,\n                                    const mbedtls_ecp_group *grp,\n                                    const int pf,\n                                    const mbedtls_ecp_point *P )\n{\n    int ret;\n    size_t len;\n\n    /* Need at least 4 for length plus 1 for point */\n    if( end < *p || end - *p < 5 )\n        return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );\n\n    ret = mbedtls_ecp_point_write_binary( grp, P, pf,\n                                          &len, *p + 4, end - ( *p + 4 ) );\n    if( ret != 0 )\n        return( ret );\n\n    (*p)[0] = (unsigned char)( ( len >> 24 ) & 0xFF );\n    (*p)[1] = (unsigned char)( ( len >> 16 ) & 0xFF );\n    (*p)[2] = (unsigned char)( ( len >>  8 ) & 0xFF );\n    (*p)[3] = (unsigned char)( ( len       ) & 0xFF );\n\n    *p += 4 + len;\n\n    return( 0 );\n}\n\n/*\n * Size of the temporary buffer for ecjpake_hash:\n * 3 EC points plus their length, plus ID and its length (4 + 6 bytes)\n */\n#define ECJPAKE_HASH_BUF_LEN    ( 3 * ( 4 + MBEDTLS_ECP_MAX_PT_LEN ) + 4 + 6 )\n\n/*\n * Compute hash for ZKP (7.4.2.2.2.1)\n */\nstatic int ecjpake_hash( const mbedtls_md_info_t *md_info,\n                         const mbedtls_ecp_group *grp,\n                         const int pf,\n                         const mbedtls_ecp_point *G,\n                         const mbedtls_ecp_point *V,\n                         const mbedtls_ecp_point *X,\n                         const char *id,\n                         mbedtls_mpi *h )\n{\n    int ret;\n    unsigned char buf[ECJPAKE_HASH_BUF_LEN];\n    unsigned char *p = buf;\n    const unsigned char *end = buf + sizeof( buf );\n    const size_t id_len = strlen( id );\n    unsigned char hash[MBEDTLS_MD_MAX_SIZE];\n\n    /* Write things to temporary buffer */\n    MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, G ) );\n    MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, V ) );\n    MBEDTLS_MPI_CHK( ecjpake_write_len_point( &p, end, grp, pf, X ) );\n\n    if( end - p < 4 )\n        return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );\n\n    *p++ = (unsigned char)( ( id_len >> 24 ) & 0xFF );\n    *p++ = (unsigned char)( ( id_len >> 16 ) & 0xFF );\n    *p++ = (unsigned char)( ( id_len >>  8 ) & 0xFF );\n    *p++ = (unsigned char)( ( id_len       ) & 0xFF );\n\n    if( end < p || (size_t)( end - p ) < id_len )\n        return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );\n\n    memcpy( p, id, id_len );\n    p += id_len;\n\n    /* Compute hash */\n    mbedtls_md( md_info, buf, p - buf, hash );\n\n    /* Turn it into an integer mod n */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( h, hash,\n                                        mbedtls_md_get_size( md_info ) ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( h, h, &grp->N ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Parse a ECShnorrZKP (7.4.2.2.2) and verify it (7.4.2.3.3)\n */\nstatic int ecjpake_zkp_read( const mbedtls_md_info_t *md_info,\n                             const mbedtls_ecp_group *grp,\n                             const int pf,\n                             const mbedtls_ecp_point *G,\n                             const mbedtls_ecp_point *X,\n                             const char *id,\n                             const unsigned char **p,\n                             const unsigned char *end )\n{\n    int ret;\n    mbedtls_ecp_point V, VV;\n    mbedtls_mpi r, h;\n    size_t r_len;\n\n    mbedtls_ecp_point_init( &V );\n    mbedtls_ecp_point_init( &VV );\n    mbedtls_mpi_init( &r );\n    mbedtls_mpi_init( &h );\n\n    /*\n     * struct {\n     *     ECPoint V;\n     *     opaque r<1..2^8-1>;\n     * } ECSchnorrZKP;\n     */\n    if( end < *p )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_point( grp, &V, p, end - *p ) );\n\n    if( end < *p || (size_t)( end - *p ) < 1 )\n    {\n        ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;\n        goto cleanup;\n    }\n\n    r_len = *(*p)++;\n\n    if( end < *p || (size_t)( end - *p ) < r_len )\n    {\n        ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;\n        goto cleanup;\n    }\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &r, *p, r_len ) );\n    *p += r_len;\n\n    /*\n     * Verification\n     */\n    MBEDTLS_MPI_CHK( ecjpake_hash( md_info, grp, pf, G, &V, X, id, &h ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( (mbedtls_ecp_group *) grp,\n                     &VV, &h, X, &r, G ) );\n\n    if( mbedtls_ecp_point_cmp( &VV, &V ) != 0 )\n    {\n        ret = MBEDTLS_ERR_ECP_VERIFY_FAILED;\n        goto cleanup;\n    }\n\ncleanup:\n    mbedtls_ecp_point_free( &V );\n    mbedtls_ecp_point_free( &VV );\n    mbedtls_mpi_free( &r );\n    mbedtls_mpi_free( &h );\n\n    return( ret );\n}\n\n/*\n * Generate ZKP (7.4.2.3.2) and write it as ECSchnorrZKP (7.4.2.2.2)\n */\nstatic int ecjpake_zkp_write( const mbedtls_md_info_t *md_info,\n                              const mbedtls_ecp_group *grp,\n                              const int pf, \n                              const mbedtls_ecp_point *G,\n                              const mbedtls_mpi *x,\n                              const mbedtls_ecp_point *X,\n                              const char *id,\n                              unsigned char **p,\n                              const unsigned char *end,\n                              int (*f_rng)(void *, unsigned char *, size_t),\n                              void *p_rng )\n{\n    int ret;\n    mbedtls_ecp_point V;\n    mbedtls_mpi v;\n    mbedtls_mpi h; /* later recycled to hold r */\n    size_t len;\n\n    if( end < *p )\n        return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );\n\n    mbedtls_ecp_point_init( &V );\n    mbedtls_mpi_init( &v );\n    mbedtls_mpi_init( &h );\n\n    /* Compute signature */\n    MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair_base( (mbedtls_ecp_group *) grp,\n                                                   G, &v, &V, f_rng, p_rng ) );\n    MBEDTLS_MPI_CHK( ecjpake_hash( md_info, grp, pf, G, &V, X, id, &h ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &h, &h, x ) ); /* x*h */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &h, &v, &h ) ); /* v - x*h */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &h, &h, &grp->N ) ); /* r */\n\n    /* Write it out */\n    MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( grp, &V,\n                pf, &len, *p, end - *p ) );\n    *p += len;\n\n    len = mbedtls_mpi_size( &h ); /* actually r */\n    if( end < *p || (size_t)( end - *p ) < 1 + len || len > 255 )\n    {\n        ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL;\n        goto cleanup;\n    }\n\n    *(*p)++ = (unsigned char)( len & 0xFF );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &h, *p, len ) ); /* r */\n    *p += len;\n\ncleanup:\n    mbedtls_ecp_point_free( &V );\n    mbedtls_mpi_free( &v );\n    mbedtls_mpi_free( &h );\n\n    return( ret );\n}\n\n/*\n * Parse a ECJPAKEKeyKP (7.4.2.2.1) and check proof\n * Output: verified public key X\n */\nstatic int ecjpake_kkp_read( const mbedtls_md_info_t *md_info,\n                             const mbedtls_ecp_group *grp,\n                             const int pf,\n                             const mbedtls_ecp_point *G,\n                             mbedtls_ecp_point *X,\n                             const char *id,\n                             const unsigned char **p,\n                             const unsigned char *end )\n{\n    int ret;\n\n    if( end < *p )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    /*\n     * struct {\n     *     ECPoint X;\n     *     ECSchnorrZKP zkp;\n     * } ECJPAKEKeyKP;\n     */\n    MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_point( grp, X, p, end - *p ) );\n    if( mbedtls_ecp_is_zero( X ) )\n    {\n        ret = MBEDTLS_ERR_ECP_INVALID_KEY;\n        goto cleanup;\n    }\n\n    MBEDTLS_MPI_CHK( ecjpake_zkp_read( md_info, grp, pf, G, X, id, p, end ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Generate an ECJPAKEKeyKP\n * Output: the serialized structure, plus private/public key pair\n */\nstatic int ecjpake_kkp_write( const mbedtls_md_info_t *md_info,\n                              const mbedtls_ecp_group *grp,\n                              const int pf,\n                              const mbedtls_ecp_point *G,\n                              mbedtls_mpi *x,\n                              mbedtls_ecp_point *X,\n                              const char *id,\n                              unsigned char **p,\n                              const unsigned char *end,\n                              int (*f_rng)(void *, unsigned char *, size_t),\n                              void *p_rng )\n{\n    int ret;\n    size_t len;\n\n    if( end < *p )\n        return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );\n\n    /* Generate key (7.4.2.3.1) and write it out */\n    MBEDTLS_MPI_CHK( mbedtls_ecp_gen_keypair_base( (mbedtls_ecp_group *) grp, G, x, X,\n                                                   f_rng, p_rng ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( grp, X,\n                pf, &len, *p, end - *p ) );\n    *p += len;\n\n    /* Generate and write proof */\n    MBEDTLS_MPI_CHK( ecjpake_zkp_write( md_info, grp, pf, G, x, X, id,\n                                        p, end, f_rng, p_rng ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Read a ECJPAKEKeyKPPairList (7.4.2.3) and check proofs\n * Ouputs: verified peer public keys Xa, Xb\n */\nstatic int ecjpake_kkpp_read( const mbedtls_md_info_t *md_info,\n                              const mbedtls_ecp_group *grp,\n                              const int pf,\n                              const mbedtls_ecp_point *G,\n                              mbedtls_ecp_point *Xa,\n                              mbedtls_ecp_point *Xb,\n                              const char *id,\n                              const unsigned char *buf,\n                              size_t len )\n{\n    int ret;\n    const unsigned char *p = buf;\n    const unsigned char *end = buf + len;\n\n    /*\n     * struct {\n     *     ECJPAKEKeyKP ecjpake_key_kp_pair_list[2];\n     * } ECJPAKEKeyKPPairList;\n     */\n    MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_info, grp, pf, G, Xa, id, &p, end ) );\n    MBEDTLS_MPI_CHK( ecjpake_kkp_read( md_info, grp, pf, G, Xb, id, &p, end ) );\n\n    if( p != end )\n        ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Generate a ECJPAKEKeyKPPairList\n * Outputs: the serialized structure, plus two private/public key pairs\n */\nstatic int ecjpake_kkpp_write( const mbedtls_md_info_t *md_info,\n                               const mbedtls_ecp_group *grp,\n                               const int pf,\n                               const mbedtls_ecp_point *G,\n                               mbedtls_mpi *xm1,\n                               mbedtls_ecp_point *Xa,\n                               mbedtls_mpi *xm2,\n                               mbedtls_ecp_point *Xb,\n                               const char *id,\n                               unsigned char *buf,\n                               size_t len,\n                               size_t *olen,\n                               int (*f_rng)(void *, unsigned char *, size_t),\n                               void *p_rng )\n{\n    int ret;\n    unsigned char *p = buf;\n    const unsigned char *end = buf + len;\n\n    MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_info, grp, pf, G, xm1, Xa, id,\n                &p, end, f_rng, p_rng ) );\n    MBEDTLS_MPI_CHK( ecjpake_kkp_write( md_info, grp, pf, G, xm2, Xb, id,\n                &p, end, f_rng, p_rng ) );\n\n    *olen = p - buf;\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Read and process the first round message\n */\nint mbedtls_ecjpake_read_round_one( mbedtls_ecjpake_context *ctx,\n                                    const unsigned char *buf,\n                                    size_t len )\n{\n    return( ecjpake_kkpp_read( ctx->md_info, &ctx->grp, ctx->point_format,\n                               &ctx->grp.G,\n                               &ctx->Xp1, &ctx->Xp2, ID_PEER,\n                               buf, len ) );\n}\n\n/*\n * Generate and write the first round message\n */\nint mbedtls_ecjpake_write_round_one( mbedtls_ecjpake_context *ctx,\n                            unsigned char *buf, size_t len, size_t *olen,\n                            int (*f_rng)(void *, unsigned char *, size_t),\n                            void *p_rng )\n{\n    return( ecjpake_kkpp_write( ctx->md_info, &ctx->grp, ctx->point_format,\n                                &ctx->grp.G,\n                                &ctx->xm1, &ctx->Xm1, &ctx->xm2, &ctx->Xm2,\n                                ID_MINE, buf, len, olen, f_rng, p_rng ) );\n}\n\n/*\n * Compute the sum of three points R = A + B + C\n */\nstatic int ecjpake_ecp_add3( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n                             const mbedtls_ecp_point *A,\n                             const mbedtls_ecp_point *B,\n                             const mbedtls_ecp_point *C )\n{\n    int ret;\n    mbedtls_mpi one;\n\n    mbedtls_mpi_init( &one );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &one, 1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, R, &one, A, &one, B ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( grp, R, &one, R, &one, C ) );\n\ncleanup:\n    mbedtls_mpi_free( &one );\n\n    return( ret );\n}\n\n/*\n * Read and process second round message (C: 7.4.2.5, S: 7.4.2.6)\n */\nint mbedtls_ecjpake_read_round_two( mbedtls_ecjpake_context *ctx,\n                                            const unsigned char *buf,\n                                            size_t len )\n{\n    int ret;\n    const unsigned char *p = buf;\n    const unsigned char *end = buf + len;\n    mbedtls_ecp_group grp;\n    mbedtls_ecp_point G;    /* C: GB, S: GA */\n\n    mbedtls_ecp_group_init( &grp );\n    mbedtls_ecp_point_init( &G );\n\n    /*\n     * Server: GA = X3  + X4  + X1      (7.4.2.6.1)\n     * Client: GB = X1  + X2  + X3      (7.4.2.5.1)\n     * Unified: G = Xm1 + Xm2 + Xp1\n     * We need that before parsing in order to check Xp as we read it\n     */\n    MBEDTLS_MPI_CHK( ecjpake_ecp_add3( &ctx->grp, &G,\n                                       &ctx->Xm1, &ctx->Xm2, &ctx->Xp1 ) );\n\n    /*\n     * struct {\n     *     ECParameters curve_params;   // only client reading server msg\n     *     ECJPAKEKeyKP ecjpake_key_kp;\n     * } Client/ServerECJPAKEParams;\n     */\n    if( ctx->role == MBEDTLS_ECJPAKE_CLIENT )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_ecp_tls_read_group( &grp, &p, len ) );\n        if( grp.id != ctx->grp.id )\n        {\n            ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE;\n            goto cleanup;\n        }\n    }\n\n    MBEDTLS_MPI_CHK( ecjpake_kkp_read( ctx->md_info, &ctx->grp,\n                            ctx->point_format,\n                            &G, &ctx->Xp, ID_PEER, &p, end ) );\n\n    if( p != end )\n    {\n        ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;\n        goto cleanup;\n    }\n\ncleanup:\n    mbedtls_ecp_group_free( &grp );\n    mbedtls_ecp_point_free( &G );\n\n    return( ret );\n}\n\n/*\n * Compute R = +/- X * S mod N, taking care not to leak S\n */\nstatic int ecjpake_mul_secret( mbedtls_mpi *R, int sign,\n                               const mbedtls_mpi *X,\n                               const mbedtls_mpi *S,\n                               const mbedtls_mpi *N,\n                               int (*f_rng)(void *, unsigned char *, size_t),\n                               void *p_rng )\n{\n    int ret;\n    mbedtls_mpi b; /* Blinding value, then s + N * blinding */\n\n    mbedtls_mpi_init( &b );\n\n    /* b = s + rnd-128-bit * N */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &b, 16, f_rng, p_rng ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &b, &b, N ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &b, &b, S ) );\n\n    /* R = sign * X * b mod N */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( R, X, &b ) );\n    R->s *= sign;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( R, R, N ) );\n\ncleanup:\n    mbedtls_mpi_free( &b );\n\n    return( ret );\n}\n\n/*\n * Generate and write the second round message (S: 7.4.2.5, C: 7.4.2.6)\n */\nint mbedtls_ecjpake_write_round_two( mbedtls_ecjpake_context *ctx,\n                            unsigned char *buf, size_t len, size_t *olen,\n                            int (*f_rng)(void *, unsigned char *, size_t),\n                            void *p_rng )\n{\n    int ret;\n    mbedtls_ecp_point G;    /* C: GA, S: GB */\n    mbedtls_ecp_point Xm;   /* C: Xc, S: Xs */\n    mbedtls_mpi xm;         /* C: xc, S: xs */\n    unsigned char *p = buf;\n    const unsigned char *end = buf + len;\n    size_t ec_len;\n\n    mbedtls_ecp_point_init( &G );\n    mbedtls_ecp_point_init( &Xm );\n    mbedtls_mpi_init( &xm );\n\n    /*\n     * First generate private/public key pair (S: 7.4.2.5.1, C: 7.4.2.6.1)\n     *\n     * Client:  GA = X1  + X3  + X4  | xs = x2  * s | Xc = xc * GA\n     * Server:  GB = X3  + X1  + X2  | xs = x4  * s | Xs = xs * GB\n     * Unified: G  = Xm1 + Xp1 + Xp2 | xm = xm2 * s | Xm = xm * G\n     */\n    MBEDTLS_MPI_CHK( ecjpake_ecp_add3( &ctx->grp, &G,\n                                       &ctx->Xp1, &ctx->Xp2, &ctx->Xm1 ) );\n    MBEDTLS_MPI_CHK( ecjpake_mul_secret( &xm, 1, &ctx->xm2, &ctx->s,\n                                         &ctx->grp.N, f_rng, p_rng ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &Xm, &xm, &G, f_rng, p_rng ) );\n\n    /*\n     * Now write things out\n     *\n     * struct {\n     *     ECParameters curve_params;   // only server writing its message\n     *     ECJPAKEKeyKP ecjpake_key_kp;\n     * } Client/ServerECJPAKEParams;\n     */\n    if( ctx->role == MBEDTLS_ECJPAKE_SERVER )\n    {\n        if( end < p )\n        {\n            ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL;\n            goto cleanup;\n        }\n        MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_group( &ctx->grp, &ec_len,\n                                                      p, end - p ) );\n        p += ec_len;\n    }\n\n    if( end < p )\n    {\n        ret = MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL;\n        goto cleanup;\n    }\n    MBEDTLS_MPI_CHK( mbedtls_ecp_tls_write_point( &ctx->grp, &Xm,\n                     ctx->point_format, &ec_len, p, end - p ) );\n    p += ec_len;\n\n    MBEDTLS_MPI_CHK( ecjpake_zkp_write( ctx->md_info, &ctx->grp,\n                                        ctx->point_format,\n                                        &G, &xm, &Xm, ID_MINE,\n                                        &p, end, f_rng, p_rng ) );\n\n    *olen = p - buf;\n\ncleanup:\n    mbedtls_ecp_point_free( &G );\n    mbedtls_ecp_point_free( &Xm );\n    mbedtls_mpi_free( &xm );\n\n    return( ret );\n}\n\n/*\n * Derive PMS (7.4.2.7 / 7.4.2.8)\n */\nint mbedtls_ecjpake_derive_secret( mbedtls_ecjpake_context *ctx,\n                            unsigned char *buf, size_t len, size_t *olen,\n                            int (*f_rng)(void *, unsigned char *, size_t),\n                            void *p_rng )\n{\n    int ret;\n    mbedtls_ecp_point K;\n    mbedtls_mpi m_xm2_s, one;\n    unsigned char kx[MBEDTLS_ECP_MAX_BYTES];\n    size_t x_bytes;\n\n    *olen = mbedtls_md_get_size( ctx->md_info );\n    if( len < *olen )\n        return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );\n\n    mbedtls_ecp_point_init( &K );\n    mbedtls_mpi_init( &m_xm2_s );\n    mbedtls_mpi_init( &one );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &one, 1 ) );\n\n    /*\n     * Client:  K = ( Xs - X4  * x2  * s ) * x2\n     * Server:  K = ( Xc - X2  * x4  * s ) * x4\n     * Unified: K = ( Xp - Xp2 * xm2 * s ) * xm2\n     */\n    MBEDTLS_MPI_CHK( ecjpake_mul_secret( &m_xm2_s, -1, &ctx->xm2, &ctx->s,\n                                         &ctx->grp.N, f_rng, p_rng ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_muladd( &ctx->grp, &K,\n                                         &one, &ctx->Xp,\n                                         &m_xm2_s, &ctx->Xp2 ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &K, &ctx->xm2, &K,\n                                      f_rng, p_rng ) );\n\n    /* PMS = SHA-256( K.X ) */\n    x_bytes = ( ctx->grp.pbits + 7 ) / 8;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &K.X, kx, x_bytes ) );\n    MBEDTLS_MPI_CHK( mbedtls_md( ctx->md_info, kx, x_bytes, buf ) );\n\ncleanup:\n    mbedtls_ecp_point_free( &K );\n    mbedtls_mpi_free( &m_xm2_s );\n    mbedtls_mpi_free( &one );\n\n    return( ret );\n}\n\n#undef ID_MINE\n#undef ID_PEER\n\n\n#if defined(MBEDTLS_SELF_TEST)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \\\n    !defined(MBEDTLS_SHA256_C)\nint mbedtls_ecjpake_self_test( int verbose )\n{\n    (void) verbose;\n    return( 0 );\n}\n#else\n\nstatic const unsigned char ecjpake_test_password[] = {\n    0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x6a, 0x70, 0x61, 0x6b, 0x65, 0x74,\n    0x65, 0x73, 0x74\n};\n\nstatic const unsigned char ecjpake_test_x1[] = {\n    0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,\n    0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,\n    0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x21\n};\n\nstatic const unsigned char ecjpake_test_x2[] = {\n    0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,\n    0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,\n    0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81\n};\n\nstatic const unsigned char ecjpake_test_x3[] = {\n    0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c,\n    0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,\n    0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x81\n};\n\nstatic const unsigned char ecjpake_test_x4[] = {\n    0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc,\n    0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8,\n    0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe1\n};\n\nstatic const unsigned char ecjpake_test_cli_one[] = {\n    0x41, 0x04, 0xac, 0xcf, 0x01, 0x06, 0xef, 0x85, 0x8f, 0xa2, 0xd9, 0x19,\n    0x33, 0x13, 0x46, 0x80, 0x5a, 0x78, 0xb5, 0x8b, 0xba, 0xd0, 0xb8, 0x44,\n    0xe5, 0xc7, 0x89, 0x28, 0x79, 0x14, 0x61, 0x87, 0xdd, 0x26, 0x66, 0xad,\n    0xa7, 0x81, 0xbb, 0x7f, 0x11, 0x13, 0x72, 0x25, 0x1a, 0x89, 0x10, 0x62,\n    0x1f, 0x63, 0x4d, 0xf1, 0x28, 0xac, 0x48, 0xe3, 0x81, 0xfd, 0x6e, 0xf9,\n    0x06, 0x07, 0x31, 0xf6, 0x94, 0xa4, 0x41, 0x04, 0x1d, 0xd0, 0xbd, 0x5d,\n    0x45, 0x66, 0xc9, 0xbe, 0xd9, 0xce, 0x7d, 0xe7, 0x01, 0xb5, 0xe8, 0x2e,\n    0x08, 0xe8, 0x4b, 0x73, 0x04, 0x66, 0x01, 0x8a, 0xb9, 0x03, 0xc7, 0x9e,\n    0xb9, 0x82, 0x17, 0x22, 0x36, 0xc0, 0xc1, 0x72, 0x8a, 0xe4, 0xbf, 0x73,\n    0x61, 0x0d, 0x34, 0xde, 0x44, 0x24, 0x6e, 0xf3, 0xd9, 0xc0, 0x5a, 0x22,\n    0x36, 0xfb, 0x66, 0xa6, 0x58, 0x3d, 0x74, 0x49, 0x30, 0x8b, 0xab, 0xce,\n    0x20, 0x72, 0xfe, 0x16, 0x66, 0x29, 0x92, 0xe9, 0x23, 0x5c, 0x25, 0x00,\n    0x2f, 0x11, 0xb1, 0x50, 0x87, 0xb8, 0x27, 0x38, 0xe0, 0x3c, 0x94, 0x5b,\n    0xf7, 0xa2, 0x99, 0x5d, 0xda, 0x1e, 0x98, 0x34, 0x58, 0x41, 0x04, 0x7e,\n    0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb, 0xd7, 0x92, 0x62,\n    0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18, 0x40, 0x9a, 0xc5,\n    0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47, 0x79, 0x0a, 0xeb,\n    0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f, 0xd1, 0xc3, 0x35,\n    0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7, 0xe3, 0x2b, 0xb0,\n    0x13, 0xbb, 0x2b, 0x41, 0x04, 0xa4, 0x95, 0x58, 0xd3, 0x2e, 0xd1, 0xeb,\n    0xfc, 0x18, 0x16, 0xaf, 0x4f, 0xf0, 0x9b, 0x55, 0xfc, 0xb4, 0xca, 0x47,\n    0xb2, 0xa0, 0x2d, 0x1e, 0x7c, 0xaf, 0x11, 0x79, 0xea, 0x3f, 0xe1, 0x39,\n    0x5b, 0x22, 0xb8, 0x61, 0x96, 0x40, 0x16, 0xfa, 0xba, 0xf7, 0x2c, 0x97,\n    0x56, 0x95, 0xd9, 0x3d, 0x4d, 0xf0, 0xe5, 0x19, 0x7f, 0xe9, 0xf0, 0x40,\n    0x63, 0x4e, 0xd5, 0x97, 0x64, 0x93, 0x77, 0x87, 0xbe, 0x20, 0xbc, 0x4d,\n    0xee, 0xbb, 0xf9, 0xb8, 0xd6, 0x0a, 0x33, 0x5f, 0x04, 0x6c, 0xa3, 0xaa,\n    0x94, 0x1e, 0x45, 0x86, 0x4c, 0x7c, 0xad, 0xef, 0x9c, 0xf7, 0x5b, 0x3d,\n    0x8b, 0x01, 0x0e, 0x44, 0x3e, 0xf0\n};\n\nstatic const unsigned char ecjpake_test_srv_one[] = {\n    0x41, 0x04, 0x7e, 0xa6, 0xe3, 0xa4, 0x48, 0x70, 0x37, 0xa9, 0xe0, 0xdb,\n    0xd7, 0x92, 0x62, 0xb2, 0xcc, 0x27, 0x3e, 0x77, 0x99, 0x30, 0xfc, 0x18,\n    0x40, 0x9a, 0xc5, 0x36, 0x1c, 0x5f, 0xe6, 0x69, 0xd7, 0x02, 0xe1, 0x47,\n    0x79, 0x0a, 0xeb, 0x4c, 0xe7, 0xfd, 0x65, 0x75, 0xab, 0x0f, 0x6c, 0x7f,\n    0xd1, 0xc3, 0x35, 0x93, 0x9a, 0xa8, 0x63, 0xba, 0x37, 0xec, 0x91, 0xb7,\n    0xe3, 0x2b, 0xb0, 0x13, 0xbb, 0x2b, 0x41, 0x04, 0x09, 0xf8, 0x5b, 0x3d,\n    0x20, 0xeb, 0xd7, 0x88, 0x5c, 0xe4, 0x64, 0xc0, 0x8d, 0x05, 0x6d, 0x64,\n    0x28, 0xfe, 0x4d, 0xd9, 0x28, 0x7a, 0xa3, 0x65, 0xf1, 0x31, 0xf4, 0x36,\n    0x0f, 0xf3, 0x86, 0xd8, 0x46, 0x89, 0x8b, 0xc4, 0xb4, 0x15, 0x83, 0xc2,\n    0xa5, 0x19, 0x7f, 0x65, 0xd7, 0x87, 0x42, 0x74, 0x6c, 0x12, 0xa5, 0xec,\n    0x0a, 0x4f, 0xfe, 0x2f, 0x27, 0x0a, 0x75, 0x0a, 0x1d, 0x8f, 0xb5, 0x16,\n    0x20, 0x93, 0x4d, 0x74, 0xeb, 0x43, 0xe5, 0x4d, 0xf4, 0x24, 0xfd, 0x96,\n    0x30, 0x6c, 0x01, 0x17, 0xbf, 0x13, 0x1a, 0xfa, 0xbf, 0x90, 0xa9, 0xd3,\n    0x3d, 0x11, 0x98, 0xd9, 0x05, 0x19, 0x37, 0x35, 0x14, 0x41, 0x04, 0x19,\n    0x0a, 0x07, 0x70, 0x0f, 0xfa, 0x4b, 0xe6, 0xae, 0x1d, 0x79, 0xee, 0x0f,\n    0x06, 0xae, 0xb5, 0x44, 0xcd, 0x5a, 0xdd, 0xaa, 0xbe, 0xdf, 0x70, 0xf8,\n    0x62, 0x33, 0x21, 0x33, 0x2c, 0x54, 0xf3, 0x55, 0xf0, 0xfb, 0xfe, 0xc7,\n    0x83, 0xed, 0x35, 0x9e, 0x5d, 0x0b, 0xf7, 0x37, 0x7a, 0x0f, 0xc4, 0xea,\n    0x7a, 0xce, 0x47, 0x3c, 0x9c, 0x11, 0x2b, 0x41, 0xcc, 0xd4, 0x1a, 0xc5,\n    0x6a, 0x56, 0x12, 0x41, 0x04, 0x36, 0x0a, 0x1c, 0xea, 0x33, 0xfc, 0xe6,\n    0x41, 0x15, 0x64, 0x58, 0xe0, 0xa4, 0xea, 0xc2, 0x19, 0xe9, 0x68, 0x31,\n    0xe6, 0xae, 0xbc, 0x88, 0xb3, 0xf3, 0x75, 0x2f, 0x93, 0xa0, 0x28, 0x1d,\n    0x1b, 0xf1, 0xfb, 0x10, 0x60, 0x51, 0xdb, 0x96, 0x94, 0xa8, 0xd6, 0xe8,\n    0x62, 0xa5, 0xef, 0x13, 0x24, 0xa3, 0xd9, 0xe2, 0x78, 0x94, 0xf1, 0xee,\n    0x4f, 0x7c, 0x59, 0x19, 0x99, 0x65, 0xa8, 0xdd, 0x4a, 0x20, 0x91, 0x84,\n    0x7d, 0x2d, 0x22, 0xdf, 0x3e, 0xe5, 0x5f, 0xaa, 0x2a, 0x3f, 0xb3, 0x3f,\n    0xd2, 0xd1, 0xe0, 0x55, 0xa0, 0x7a, 0x7c, 0x61, 0xec, 0xfb, 0x8d, 0x80,\n    0xec, 0x00, 0xc2, 0xc9, 0xeb, 0x12\n};\n\nstatic const unsigned char ecjpake_test_srv_two[] = {\n    0x03, 0x00, 0x17, 0x41, 0x04, 0x0f, 0xb2, 0x2b, 0x1d, 0x5d, 0x11, 0x23,\n    0xe0, 0xef, 0x9f, 0xeb, 0x9d, 0x8a, 0x2e, 0x59, 0x0a, 0x1f, 0x4d, 0x7c,\n    0xed, 0x2c, 0x2b, 0x06, 0x58, 0x6e, 0x8f, 0x2a, 0x16, 0xd4, 0xeb, 0x2f,\n    0xda, 0x43, 0x28, 0xa2, 0x0b, 0x07, 0xd8, 0xfd, 0x66, 0x76, 0x54, 0xca,\n    0x18, 0xc5, 0x4e, 0x32, 0xa3, 0x33, 0xa0, 0x84, 0x54, 0x51, 0xe9, 0x26,\n    0xee, 0x88, 0x04, 0xfd, 0x7a, 0xf0, 0xaa, 0xa7, 0xa6, 0x41, 0x04, 0x55,\n    0x16, 0xea, 0x3e, 0x54, 0xa0, 0xd5, 0xd8, 0xb2, 0xce, 0x78, 0x6b, 0x38,\n    0xd3, 0x83, 0x37, 0x00, 0x29, 0xa5, 0xdb, 0xe4, 0x45, 0x9c, 0x9d, 0xd6,\n    0x01, 0xb4, 0x08, 0xa2, 0x4a, 0xe6, 0x46, 0x5c, 0x8a, 0xc9, 0x05, 0xb9,\n    0xeb, 0x03, 0xb5, 0xd3, 0x69, 0x1c, 0x13, 0x9e, 0xf8, 0x3f, 0x1c, 0xd4,\n    0x20, 0x0f, 0x6c, 0x9c, 0xd4, 0xec, 0x39, 0x22, 0x18, 0xa5, 0x9e, 0xd2,\n    0x43, 0xd3, 0xc8, 0x20, 0xff, 0x72, 0x4a, 0x9a, 0x70, 0xb8, 0x8c, 0xb8,\n    0x6f, 0x20, 0xb4, 0x34, 0xc6, 0x86, 0x5a, 0xa1, 0xcd, 0x79, 0x06, 0xdd,\n    0x7c, 0x9b, 0xce, 0x35, 0x25, 0xf5, 0x08, 0x27, 0x6f, 0x26, 0x83, 0x6c\n};\n\nstatic const unsigned char ecjpake_test_cli_two[] = {\n    0x41, 0x04, 0x69, 0xd5, 0x4e, 0xe8, 0x5e, 0x90, 0xce, 0x3f, 0x12, 0x46,\n    0x74, 0x2d, 0xe5, 0x07, 0xe9, 0x39, 0xe8, 0x1d, 0x1d, 0xc1, 0xc5, 0xcb,\n    0x98, 0x8b, 0x58, 0xc3, 0x10, 0xc9, 0xfd, 0xd9, 0x52, 0x4d, 0x93, 0x72,\n    0x0b, 0x45, 0x54, 0x1c, 0x83, 0xee, 0x88, 0x41, 0x19, 0x1d, 0xa7, 0xce,\n    0xd8, 0x6e, 0x33, 0x12, 0xd4, 0x36, 0x23, 0xc1, 0xd6, 0x3e, 0x74, 0x98,\n    0x9a, 0xba, 0x4a, 0xff, 0xd1, 0xee, 0x41, 0x04, 0x07, 0x7e, 0x8c, 0x31,\n    0xe2, 0x0e, 0x6b, 0xed, 0xb7, 0x60, 0xc1, 0x35, 0x93, 0xe6, 0x9f, 0x15,\n    0xbe, 0x85, 0xc2, 0x7d, 0x68, 0xcd, 0x09, 0xcc, 0xb8, 0xc4, 0x18, 0x36,\n    0x08, 0x91, 0x7c, 0x5c, 0x3d, 0x40, 0x9f, 0xac, 0x39, 0xfe, 0xfe, 0xe8,\n    0x2f, 0x72, 0x92, 0xd3, 0x6f, 0x0d, 0x23, 0xe0, 0x55, 0x91, 0x3f, 0x45,\n    0xa5, 0x2b, 0x85, 0xdd, 0x8a, 0x20, 0x52, 0xe9, 0xe1, 0x29, 0xbb, 0x4d,\n    0x20, 0x0f, 0x01, 0x1f, 0x19, 0x48, 0x35, 0x35, 0xa6, 0xe8, 0x9a, 0x58,\n    0x0c, 0x9b, 0x00, 0x03, 0xba, 0xf2, 0x14, 0x62, 0xec, 0xe9, 0x1a, 0x82,\n    0xcc, 0x38, 0xdb, 0xdc, 0xae, 0x60, 0xd9, 0xc5, 0x4c\n};\n\nstatic const unsigned char ecjpake_test_pms[] = {\n    0xf3, 0xd4, 0x7f, 0x59, 0x98, 0x44, 0xdb, 0x92, 0xa5, 0x69, 0xbb, 0xe7,\n    0x98, 0x1e, 0x39, 0xd9, 0x31, 0xfd, 0x74, 0x3b, 0xf2, 0x2e, 0x98, 0xf9,\n    0xb4, 0x38, 0xf7, 0x19, 0xd3, 0xc4, 0xf3, 0x51\n};\n\n/* Load my private keys and generate the correponding public keys */\nstatic int ecjpake_test_load( mbedtls_ecjpake_context *ctx,\n                              const unsigned char *xm1, size_t len1,\n                              const unsigned char *xm2, size_t len2 )\n{\n    int ret;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->xm1, xm1, len1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &ctx->xm2, xm2, len2 ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &ctx->Xm1, &ctx->xm1,\n                                      &ctx->grp.G, NULL, NULL ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &ctx->grp, &ctx->Xm2, &ctx->xm2,\n                                      &ctx->grp.G, NULL, NULL ) );\n\ncleanup:\n    return( ret );\n}\n\n/* For tests we don't need a secure RNG;\n * use the LGC from Numerical Recipes for simplicity */\nstatic int ecjpake_lgc( void *p, unsigned char *out, size_t len )\n{\n    static uint32_t x = 42;\n    (void) p;\n\n    while( len > 0 )\n    {\n        size_t use_len = len > 4 ? 4 : len;\n        x = 1664525 * x + 1013904223;\n        memcpy( out, &x, use_len );\n        out += use_len;\n        len -= use_len;\n    }\n\n    return( 0 );\n}\n\n#define TEST_ASSERT( x )    \\\n    do {                    \\\n        if( x )             \\\n            ret = 0;        \\\n        else                \\\n        {                   \\\n            ret = 1;        \\\n            goto cleanup;   \\\n        }                   \\\n    } while( 0 )\n\n/*\n * Checkup routine\n */\nint mbedtls_ecjpake_self_test( int verbose )\n{\n    int ret;\n    mbedtls_ecjpake_context cli;\n    mbedtls_ecjpake_context srv;\n    unsigned char buf[512], pms[32];\n    size_t len, pmslen;\n\n    mbedtls_ecjpake_init( &cli );\n    mbedtls_ecjpake_init( &srv );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  ECJPAKE test #0 (setup): \" );\n\n    TEST_ASSERT( mbedtls_ecjpake_setup( &cli, MBEDTLS_ECJPAKE_CLIENT,\n                    MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1,\n                    ecjpake_test_password,\n            sizeof( ecjpake_test_password ) ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_setup( &srv, MBEDTLS_ECJPAKE_SERVER,\n                    MBEDTLS_MD_SHA256, MBEDTLS_ECP_DP_SECP256R1,\n                    ecjpake_test_password,\n            sizeof( ecjpake_test_password ) ) == 0 );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  ECJPAKE test #1 (random handshake): \" );\n\n    TEST_ASSERT( mbedtls_ecjpake_write_round_one( &cli,\n                 buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_read_round_one( &srv, buf, len ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_write_round_one( &srv,\n                 buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_read_round_one( &cli, buf, len ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_write_round_two( &srv,\n                 buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_read_round_two( &cli, buf, len ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_derive_secret( &cli,\n                 pms, sizeof( pms ), &pmslen, ecjpake_lgc, NULL ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_write_round_two( &cli,\n                 buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_read_round_two( &srv, buf, len ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_derive_secret( &srv,\n                 buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );\n\n    TEST_ASSERT( len == pmslen );\n    TEST_ASSERT( memcmp( buf, pms, len ) == 0 );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  ECJPAKE test #2 (reference handshake): \" );\n\n    /* Simulate generation of round one */\n    MBEDTLS_MPI_CHK( ecjpake_test_load( &cli,\n                ecjpake_test_x1, sizeof( ecjpake_test_x1 ),\n                ecjpake_test_x2, sizeof( ecjpake_test_x2 ) ) );\n\n    MBEDTLS_MPI_CHK( ecjpake_test_load( &srv,\n                ecjpake_test_x3, sizeof( ecjpake_test_x3 ),\n                ecjpake_test_x4, sizeof( ecjpake_test_x4 ) ) );\n\n    /* Read round one */\n    TEST_ASSERT( mbedtls_ecjpake_read_round_one( &srv,\n                                    ecjpake_test_cli_one,\n                            sizeof( ecjpake_test_cli_one ) ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_read_round_one( &cli,\n                                    ecjpake_test_srv_one,\n                            sizeof( ecjpake_test_srv_one ) ) == 0 );\n\n    /* Skip generation of round two, read round two */\n    TEST_ASSERT( mbedtls_ecjpake_read_round_two( &cli,\n                                    ecjpake_test_srv_two,\n                            sizeof( ecjpake_test_srv_two ) ) == 0 );\n\n    TEST_ASSERT( mbedtls_ecjpake_read_round_two( &srv,\n                                    ecjpake_test_cli_two,\n                            sizeof( ecjpake_test_cli_two ) ) == 0 );\n\n    /* Server derives PMS */\n    TEST_ASSERT( mbedtls_ecjpake_derive_secret( &srv,\n                 buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );\n\n    TEST_ASSERT( len == sizeof( ecjpake_test_pms ) );\n    TEST_ASSERT( memcmp( buf, ecjpake_test_pms, len ) == 0 );\n\n    memset( buf, 0, len ); /* Avoid interferences with next step */\n\n    /* Client derives PMS */\n    TEST_ASSERT( mbedtls_ecjpake_derive_secret( &cli,\n                 buf, sizeof( buf ), &len, ecjpake_lgc, NULL ) == 0 );\n\n    TEST_ASSERT( len == sizeof( ecjpake_test_pms ) );\n    TEST_ASSERT( memcmp( buf, ecjpake_test_pms, len ) == 0 );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\ncleanup:\n    mbedtls_ecjpake_free( &cli );\n    mbedtls_ecjpake_free( &srv );\n\n    if( ret != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        ret = 1;\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( ret );\n}\n\n#undef TEST_ASSERT\n\n#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED && MBEDTLS_SHA256_C */\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_ECJPAKE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ecp.c",
    "content": "/*\n *  Elliptic curves over GF(p): generic functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * References:\n *\n * SEC1 http://www.secg.org/index.php?action=secg,docs_secg\n * GECC = Guide to Elliptic Curve Cryptography - Hankerson, Menezes, Vanstone\n * FIPS 186-3 http://csrc.nist.gov/publications/fips/fips186-3/fips_186-3.pdf\n * RFC 4492 for the related TLS structures and constants\n *\n * [Curve25519] http://cr.yp.to/ecdh/curve25519-20060209.pdf\n *\n * [2] CORON, Jean-S'ebastien. Resistance against differential power analysis\n *     for elliptic curve cryptosystems. In : Cryptographic Hardware and\n *     Embedded Systems. Springer Berlin Heidelberg, 1999. p. 292-302.\n *     <http://link.springer.com/chapter/10.1007/3-540-48059-5_25>\n *\n * [3] HEDABOU, Mustapha, PINEL, Pierre, et B'EN'ETEAU, Lucien. A comb method to\n *     render ECC resistant against Side Channel Attacks. IACR Cryptology\n *     ePrint Archive, 2004, vol. 2004, p. 342.\n *     <http://eprint.iacr.org/2004/342.pdf>\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n\n#include \"mbedtls/ecp.h\"\n#include \"mbedtls/threading.h\"\n\n#include <string.h>\n\n#if !defined(MBEDTLS_ECP_ALT)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#include <stdio.h>\n#define mbedtls_printf     printf\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n#include \"mbedtls/ecp_internal.h\"\n\n#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \\\n    !defined(inline) && !defined(__cplusplus)\n#define inline __inline\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n/*\n * Counts of point addition and doubling, and field multiplications.\n * Used to test resistance of point multiplication to simple timing attacks.\n */\nstatic unsigned long add_count, dbl_count, mul_count;\n#endif\n\n#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)   ||   \\\n    defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)   ||   \\\n    defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)   ||   \\\n    defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)\n#define ECP_SHORTWEIERSTRASS\n#endif\n\n#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)\n#define ECP_MONTGOMERY\n#endif\n\n/*\n * Curve types: internal for now, might be exposed later\n */\ntypedef enum\n{\n    ECP_TYPE_NONE = 0,\n    ECP_TYPE_SHORT_WEIERSTRASS,    /* y^2 = x^3 + a x + b      */\n    ECP_TYPE_MONTGOMERY,           /* y^2 = x^3 + a x^2 + x    */\n} ecp_curve_type;\n\n/*\n * List of supported curves:\n *  - internal ID\n *  - TLS NamedCurve ID (RFC 4492 sec. 5.1.1, RFC 7071 sec. 2)\n *  - size in bits\n *  - readable name\n *\n * Curves are listed in order: largest curves first, and for a given size,\n * fastest curves first. This provides the default order for the SSL module.\n *\n * Reminder: update profiles in x509_crt.c when adding a new curves!\n */\nstatic const mbedtls_ecp_curve_info ecp_supported_curves[] =\n{\n#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)\n    { MBEDTLS_ECP_DP_SECP521R1,    25,     521,    \"secp521r1\"         },\n#endif\n#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)\n    { MBEDTLS_ECP_DP_BP512R1,      28,     512,    \"brainpoolP512r1\"   },\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)\n    { MBEDTLS_ECP_DP_SECP384R1,    24,     384,    \"secp384r1\"         },\n#endif\n#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)\n    { MBEDTLS_ECP_DP_BP384R1,      27,     384,    \"brainpoolP384r1\"   },\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)\n    { MBEDTLS_ECP_DP_SECP256R1,    23,     256,    \"secp256r1\"         },\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)\n    { MBEDTLS_ECP_DP_SECP256K1,    22,     256,    \"secp256k1\"         },\n#endif\n#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)\n    { MBEDTLS_ECP_DP_BP256R1,      26,     256,    \"brainpoolP256r1\"   },\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)\n    { MBEDTLS_ECP_DP_SECP224R1,    21,     224,    \"secp224r1\"         },\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)\n    { MBEDTLS_ECP_DP_SECP224K1,    20,     224,    \"secp224k1\"         },\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)\n    { MBEDTLS_ECP_DP_SECP192R1,    19,     192,    \"secp192r1\"         },\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)\n    { MBEDTLS_ECP_DP_SECP192K1,    18,     192,    \"secp192k1\"         },\n#endif\n    { MBEDTLS_ECP_DP_NONE,          0,     0,      NULL                },\n};\n\n#define ECP_NB_CURVES   sizeof( ecp_supported_curves ) /    \\\n                        sizeof( ecp_supported_curves[0] )\n\nstatic mbedtls_ecp_group_id ecp_supported_grp_id[ECP_NB_CURVES];\n\n/*\n * List of supported curves and associated info\n */\nconst mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void )\n{\n    return( ecp_supported_curves );\n}\n\n/*\n * List of supported curves, group ID only\n */\nconst mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void )\n{\n    static int init_done = 0;\n\n    if( ! init_done )\n    {\n        size_t i = 0;\n        const mbedtls_ecp_curve_info *curve_info;\n\n        for( curve_info = mbedtls_ecp_curve_list();\n             curve_info->grp_id != MBEDTLS_ECP_DP_NONE;\n             curve_info++ )\n        {\n            ecp_supported_grp_id[i++] = curve_info->grp_id;\n        }\n        ecp_supported_grp_id[i] = MBEDTLS_ECP_DP_NONE;\n\n        init_done = 1;\n    }\n\n    return( ecp_supported_grp_id );\n}\n\n/*\n * Get the curve info for the internal identifier\n */\nconst mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id )\n{\n    const mbedtls_ecp_curve_info *curve_info;\n\n    for( curve_info = mbedtls_ecp_curve_list();\n         curve_info->grp_id != MBEDTLS_ECP_DP_NONE;\n         curve_info++ )\n    {\n        if( curve_info->grp_id == grp_id )\n            return( curve_info );\n    }\n\n    return( NULL );\n}\n\n/*\n * Get the curve info from the TLS identifier\n */\nconst mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id )\n{\n    const mbedtls_ecp_curve_info *curve_info;\n\n    for( curve_info = mbedtls_ecp_curve_list();\n         curve_info->grp_id != MBEDTLS_ECP_DP_NONE;\n         curve_info++ )\n    {\n        if( curve_info->tls_id == tls_id )\n            return( curve_info );\n    }\n\n    return( NULL );\n}\n\n/*\n * Get the curve info from the name\n */\nconst mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name )\n{\n    const mbedtls_ecp_curve_info *curve_info;\n\n    for( curve_info = mbedtls_ecp_curve_list();\n         curve_info->grp_id != MBEDTLS_ECP_DP_NONE;\n         curve_info++ )\n    {\n        if( strcmp( curve_info->name, name ) == 0 )\n            return( curve_info );\n    }\n\n    return( NULL );\n}\n\n/*\n * Get the type of a curve\n */\nstatic inline ecp_curve_type ecp_get_type( const mbedtls_ecp_group *grp )\n{\n    if( grp->G.X.p == NULL )\n        return( ECP_TYPE_NONE );\n\n    if( grp->G.Y.p == NULL )\n        return( ECP_TYPE_MONTGOMERY );\n    else\n        return( ECP_TYPE_SHORT_WEIERSTRASS );\n}\n\n/*\n * Initialize (the components of) a point\n */\nvoid mbedtls_ecp_point_init( mbedtls_ecp_point *pt )\n{\n    if( pt == NULL )\n        return;\n\n    mbedtls_mpi_init( &pt->X );\n    mbedtls_mpi_init( &pt->Y );\n    mbedtls_mpi_init( &pt->Z );\n}\n\n/*\n * Initialize (the components of) a group\n */\nvoid mbedtls_ecp_group_init( mbedtls_ecp_group *grp )\n{\n    if( grp == NULL )\n        return;\n\n    memset( grp, 0, sizeof( mbedtls_ecp_group ) );\n}\n\n/*\n * Initialize (the components of) a key pair\n */\nvoid mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key )\n{\n    if( key == NULL )\n        return;\n\n    mbedtls_ecp_group_init( &key->grp );\n    mbedtls_mpi_init( &key->d );\n    mbedtls_ecp_point_init( &key->Q );\n}\n\n/*\n * Unallocate (the components of) a point\n */\nvoid mbedtls_ecp_point_free( mbedtls_ecp_point *pt )\n{\n    if( pt == NULL )\n        return;\n\n    mbedtls_mpi_free( &( pt->X ) );\n    mbedtls_mpi_free( &( pt->Y ) );\n    mbedtls_mpi_free( &( pt->Z ) );\n}\n\n/*\n * Unallocate (the components of) a group\n */\nvoid mbedtls_ecp_group_free( mbedtls_ecp_group *grp )\n{\n    size_t i;\n\n    if( grp == NULL )\n        return;\n\n    if( grp->h != 1 )\n    {\n        mbedtls_mpi_free( &grp->P );\n        mbedtls_mpi_free( &grp->A );\n        mbedtls_mpi_free( &grp->B );\n        mbedtls_ecp_point_free( &grp->G );\n        mbedtls_mpi_free( &grp->N );\n    }\n\n    if( grp->T != NULL )\n    {\n        for( i = 0; i < grp->T_size; i++ )\n            mbedtls_ecp_point_free( &grp->T[i] );\n        mbedtls_free( grp->T );\n    }\n\n    mbedtls_zeroize( grp, sizeof( mbedtls_ecp_group ) );\n}\n\n/*\n * Unallocate (the components of) a key pair\n */\nvoid mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key )\n{\n    if( key == NULL )\n        return;\n\n    mbedtls_ecp_group_free( &key->grp );\n    mbedtls_mpi_free( &key->d );\n    mbedtls_ecp_point_free( &key->Q );\n}\n\n/*\n * Copy the contents of a point\n */\nint mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q )\n{\n    int ret;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->X, &Q->X ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->Y, &Q->Y ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &P->Z, &Q->Z ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Copy the contents of a group object\n */\nint mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src )\n{\n    return mbedtls_ecp_group_load( dst, src->id );\n}\n\n/*\n * Set point to zero\n */\nint mbedtls_ecp_set_zero( mbedtls_ecp_point *pt )\n{\n    int ret;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->X , 1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Y , 1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z , 0 ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Tell if a point is zero\n */\nint mbedtls_ecp_is_zero( mbedtls_ecp_point *pt )\n{\n    return( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 );\n}\n\n/*\n * Compare two points lazyly\n */\nint mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,\n                           const mbedtls_ecp_point *Q )\n{\n    if( mbedtls_mpi_cmp_mpi( &P->X, &Q->X ) == 0 &&\n        mbedtls_mpi_cmp_mpi( &P->Y, &Q->Y ) == 0 &&\n        mbedtls_mpi_cmp_mpi( &P->Z, &Q->Z ) == 0 )\n    {\n        return( 0 );\n    }\n\n    return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n}\n\n/*\n * Import a non-zero point from ASCII strings\n */\nint mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,\n                           const char *x, const char *y )\n{\n    int ret;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P->X, radix, x ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P->Y, radix, y ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &P->Z, 1 ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Export a point into unsigned binary data (SEC1 2.3.3)\n */\nint mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,\n                            int format, size_t *olen,\n                            unsigned char *buf, size_t buflen )\n{\n    int ret = 0;\n    size_t plen;\n\n    if( format != MBEDTLS_ECP_PF_UNCOMPRESSED &&\n        format != MBEDTLS_ECP_PF_COMPRESSED )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    /*\n     * Common case: P == 0\n     */\n    if( mbedtls_mpi_cmp_int( &P->Z, 0 ) == 0 )\n    {\n        if( buflen < 1 )\n            return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );\n\n        buf[0] = 0x00;\n        *olen = 1;\n\n        return( 0 );\n    }\n\n    plen = mbedtls_mpi_size( &grp->P );\n\n    if( format == MBEDTLS_ECP_PF_UNCOMPRESSED )\n    {\n        *olen = 2 * plen + 1;\n\n        if( buflen < *olen )\n            return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );\n\n        buf[0] = 0x04;\n        MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->X, buf + 1, plen ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->Y, buf + 1 + plen, plen ) );\n    }\n    else if( format == MBEDTLS_ECP_PF_COMPRESSED )\n    {\n        *olen = plen + 1;\n\n        if( buflen < *olen )\n            return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );\n\n        buf[0] = 0x02 + mbedtls_mpi_get_bit( &P->Y, 0 );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &P->X, buf + 1, plen ) );\n    }\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Import a point from unsigned binary data (SEC1 2.3.4)\n */\nint mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,\n                           const unsigned char *buf, size_t ilen )\n{\n    int ret;\n    size_t plen;\n\n    if( ilen < 1 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    if( buf[0] == 0x00 )\n    {\n        if( ilen == 1 )\n            return( mbedtls_ecp_set_zero( pt ) );\n        else\n            return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n    }\n\n    plen = mbedtls_mpi_size( &grp->P );\n\n    if( buf[0] != 0x04 )\n        return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );\n\n    if( ilen != 2 * plen + 1 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pt->X, buf + 1, plen ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &pt->Y, buf + 1 + plen, plen ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z, 1 ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Import a point from a TLS ECPoint record (RFC 4492)\n *      struct {\n *          opaque point <1..2^8-1>;\n *      } ECPoint;\n */\nint mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,\n                        const unsigned char **buf, size_t buf_len )\n{\n    unsigned char data_len;\n    const unsigned char *buf_start;\n\n    /*\n     * We must have at least two bytes (1 for length, at least one for data)\n     */\n    if( buf_len < 2 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    data_len = *(*buf)++;\n    if( data_len < 1 || data_len > buf_len - 1 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    /*\n     * Save buffer start for read_binary and update buf\n     */\n    buf_start = *buf;\n    *buf += data_len;\n\n    return mbedtls_ecp_point_read_binary( grp, pt, buf_start, data_len );\n}\n\n/*\n * Export a point as a TLS ECPoint record (RFC 4492)\n *      struct {\n *          opaque point <1..2^8-1>;\n *      } ECPoint;\n */\nint mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt,\n                         int format, size_t *olen,\n                         unsigned char *buf, size_t blen )\n{\n    int ret;\n\n    /*\n     * buffer length must be at least one, for our length byte\n     */\n    if( blen < 1 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_ecp_point_write_binary( grp, pt, format,\n                    olen, buf + 1, blen - 1) ) != 0 )\n        return( ret );\n\n    /*\n     * write length to the first byte and update total length\n     */\n    buf[0] = (unsigned char) *olen;\n    ++*olen;\n\n    return( 0 );\n}\n\n/*\n * Set a group from an ECParameters record (RFC 4492)\n */\nint mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len )\n{\n    uint16_t tls_id;\n    const mbedtls_ecp_curve_info *curve_info;\n\n    /*\n     * We expect at least three bytes (see below)\n     */\n    if( len < 3 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    /*\n     * First byte is curve_type; only named_curve is handled\n     */\n    if( *(*buf)++ != MBEDTLS_ECP_TLS_NAMED_CURVE )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    /*\n     * Next two bytes are the namedcurve value\n     */\n    tls_id = *(*buf)++;\n    tls_id <<= 8;\n    tls_id |= *(*buf)++;\n\n    if( ( curve_info = mbedtls_ecp_curve_info_from_tls_id( tls_id ) ) == NULL )\n        return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );\n\n    return mbedtls_ecp_group_load( grp, curve_info->grp_id );\n}\n\n/*\n * Write the ECParameters record corresponding to a group (RFC 4492)\n */\nint mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,\n                         unsigned char *buf, size_t blen )\n{\n    const mbedtls_ecp_curve_info *curve_info;\n\n    if( ( curve_info = mbedtls_ecp_curve_info_from_grp_id( grp->id ) ) == NULL )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    /*\n     * We are going to write 3 bytes (see below)\n     */\n    *olen = 3;\n    if( blen < *olen )\n        return( MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL );\n\n    /*\n     * First byte is curve_type, always named_curve\n     */\n    *buf++ = MBEDTLS_ECP_TLS_NAMED_CURVE;\n\n    /*\n     * Next two bytes are the namedcurve value\n     */\n    buf[0] = curve_info->tls_id >> 8;\n    buf[1] = curve_info->tls_id & 0xFF;\n\n    return( 0 );\n}\n\n/*\n * Wrapper around fast quasi-modp functions, with fall-back to mbedtls_mpi_mod_mpi.\n * See the documentation of struct mbedtls_ecp_group.\n *\n * This function is in the critial loop for mbedtls_ecp_mul, so pay attention to perf.\n */\nstatic int ecp_modp( mbedtls_mpi *N, const mbedtls_ecp_group *grp )\n{\n    int ret;\n\n    if( grp->modp == NULL )\n        return( mbedtls_mpi_mod_mpi( N, N, &grp->P ) );\n\n    /* N->s < 0 is a much faster test, which fails only if N is 0 */\n    if( ( N->s < 0 && mbedtls_mpi_cmp_int( N, 0 ) != 0 ) ||\n        mbedtls_mpi_bitlen( N ) > 2 * grp->pbits )\n    {\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n    }\n\n    MBEDTLS_MPI_CHK( grp->modp( N ) );\n\n    /* N->s < 0 is a much faster test, which fails only if N is 0 */\n    while( N->s < 0 && mbedtls_mpi_cmp_int( N, 0 ) != 0 )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( N, N, &grp->P ) );\n\n    while( mbedtls_mpi_cmp_mpi( N, &grp->P ) >= 0 )\n        /* we known P, N and the result are positive */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( N, N, &grp->P ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Fast mod-p functions expect their argument to be in the 0..p^2 range.\n *\n * In order to guarantee that, we need to ensure that operands of\n * mbedtls_mpi_mul_mpi are in the 0..p range. So, after each operation we will\n * bring the result back to this range.\n *\n * The following macros are shortcuts for doing that.\n */\n\n/*\n * Reduce a mbedtls_mpi mod p in-place, general case, to use after mbedtls_mpi_mul_mpi\n */\n#if defined(MBEDTLS_SELF_TEST)\n#define INC_MUL_COUNT   mul_count++;\n#else\n#define INC_MUL_COUNT\n#endif\n\n#define MOD_MUL( N )    do { MBEDTLS_MPI_CHK( ecp_modp( &N, grp ) ); INC_MUL_COUNT } \\\n                        while( 0 )\n\n/*\n * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_sub_mpi\n * N->s < 0 is a very fast test, which fails only if N is 0\n */\n#define MOD_SUB( N )                                \\\n    while( N.s < 0 && mbedtls_mpi_cmp_int( &N, 0 ) != 0 )   \\\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &N, &N, &grp->P ) )\n\n/*\n * Reduce a mbedtls_mpi mod p in-place, to use after mbedtls_mpi_add_mpi and mbedtls_mpi_mul_int.\n * We known P, N and the result are positive, so sub_abs is correct, and\n * a bit faster.\n */\n#define MOD_ADD( N )                                \\\n    while( mbedtls_mpi_cmp_mpi( &N, &grp->P ) >= 0 )        \\\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &N, &N, &grp->P ) )\n\n#if defined(ECP_SHORTWEIERSTRASS)\n/*\n * For curves in short Weierstrass form, we do all the internal operations in\n * Jacobian coordinates.\n *\n * For multiplication, we'll use a comb method with coutermeasueres against\n * SPA, hence timing attacks.\n */\n\n/*\n * Normalize jacobian coordinates so that Z == 0 || Z == 1  (GECC 3.2.1)\n * Cost: 1N := 1I + 3M + 1S\n */\nstatic int ecp_normalize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt )\n{\n    int ret;\n    mbedtls_mpi Zi, ZZi;\n\n    if( mbedtls_mpi_cmp_int( &pt->Z, 0 ) == 0 )\n        return( 0 );\n\n#if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT)\n    if ( mbedtls_internal_ecp_grp_capable( grp ) )\n    {\n        return mbedtls_internal_ecp_normalize_jac( grp, pt );\n    }\n#endif /* MBEDTLS_ECP_NORMALIZE_JAC_ALT */\n    mbedtls_mpi_init( &Zi ); mbedtls_mpi_init( &ZZi );\n\n    /*\n     * X = X / Z^2  mod p\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &Zi,      &pt->Z,     &grp->P ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ZZi,     &Zi,        &Zi     ) ); MOD_MUL( ZZi );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->X,   &pt->X,     &ZZi    ) ); MOD_MUL( pt->X );\n\n    /*\n     * Y = Y / Z^3  mod p\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y,   &pt->Y,     &ZZi    ) ); MOD_MUL( pt->Y );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y,   &pt->Y,     &Zi     ) ); MOD_MUL( pt->Y );\n\n    /*\n     * Z = 1\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &pt->Z, 1 ) );\n\ncleanup:\n\n    mbedtls_mpi_free( &Zi ); mbedtls_mpi_free( &ZZi );\n\n    return( ret );\n}\n\n/*\n * Normalize jacobian coordinates of an array of (pointers to) points,\n * using Montgomery's trick to perform only one inversion mod P.\n * (See for example Cohen's \"A Course in Computational Algebraic Number\n * Theory\", Algorithm 10.3.4.)\n *\n * Warning: fails (returning an error) if one of the points is zero!\n * This should never happen, see choice of w in ecp_mul_comb().\n *\n * Cost: 1N(t) := 1I + (6t - 3)M + 1S\n */\nstatic int ecp_normalize_jac_many( const mbedtls_ecp_group *grp,\n                                   mbedtls_ecp_point *T[], size_t t_len )\n{\n    int ret;\n    size_t i;\n    mbedtls_mpi *c, u, Zi, ZZi;\n\n    if( t_len < 2 )\n        return( ecp_normalize_jac( grp, *T ) );\n\n#if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT)\n    if ( mbedtls_internal_ecp_grp_capable( grp ) )\n    {\n        return mbedtls_internal_ecp_normalize_jac_many(grp, T, t_len);\n    }\n#endif\n\n    if( ( c = mbedtls_calloc( t_len, sizeof( mbedtls_mpi ) ) ) == NULL )\n        return( MBEDTLS_ERR_ECP_ALLOC_FAILED );\n\n    mbedtls_mpi_init( &u ); mbedtls_mpi_init( &Zi ); mbedtls_mpi_init( &ZZi );\n\n    /*\n     * c[i] = Z_0 * ... * Z_i\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &c[0], &T[0]->Z ) );\n    for( i = 1; i < t_len; i++ )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &c[i], &c[i-1], &T[i]->Z ) );\n        MOD_MUL( c[i] );\n    }\n\n    /*\n     * u = 1 / (Z_0 * ... * Z_n) mod P\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &u, &c[t_len-1], &grp->P ) );\n\n    for( i = t_len - 1; ; i-- )\n    {\n        /*\n         * Zi = 1 / Z_i mod p\n         * u = 1 / (Z_0 * ... * Z_i) mod P\n         */\n        if( i == 0 ) {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Zi, &u ) );\n        }\n        else\n        {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &Zi, &u, &c[i-1]  ) ); MOD_MUL( Zi );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &u,  &u, &T[i]->Z ) ); MOD_MUL( u );\n        }\n\n        /*\n         * proceed as in normalize()\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ZZi,     &Zi,      &Zi  ) ); MOD_MUL( ZZi );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->X, &T[i]->X, &ZZi ) ); MOD_MUL( T[i]->X );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->Y, &T[i]->Y, &ZZi ) ); MOD_MUL( T[i]->Y );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T[i]->Y, &T[i]->Y, &Zi  ) ); MOD_MUL( T[i]->Y );\n\n        /*\n         * Post-precessing: reclaim some memory by shrinking coordinates\n         * - not storing Z (always 1)\n         * - shrinking other coordinates, but still keeping the same number of\n         *   limbs as P, as otherwise it will too likely be regrown too fast.\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shrink( &T[i]->X, grp->P.n ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shrink( &T[i]->Y, grp->P.n ) );\n        mbedtls_mpi_free( &T[i]->Z );\n\n        if( i == 0 )\n            break;\n    }\n\ncleanup:\n\n    mbedtls_mpi_free( &u ); mbedtls_mpi_free( &Zi ); mbedtls_mpi_free( &ZZi );\n    for( i = 0; i < t_len; i++ )\n        mbedtls_mpi_free( &c[i] );\n    mbedtls_free( c );\n\n    return( ret );\n}\n\n/*\n * Conditional point inversion: Q -> -Q = (Q.X, -Q.Y, Q.Z) without leak.\n * \"inv\" must be 0 (don't invert) or 1 (invert) or the result will be invalid\n */\nstatic int ecp_safe_invert_jac( const mbedtls_ecp_group *grp,\n                            mbedtls_ecp_point *Q,\n                            unsigned char inv )\n{\n    int ret;\n    unsigned char nonzero;\n    mbedtls_mpi mQY;\n\n    mbedtls_mpi_init( &mQY );\n\n    /* Use the fact that -Q.Y mod P = P - Q.Y unless Q.Y == 0 */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &mQY, &grp->P, &Q->Y ) );\n    nonzero = mbedtls_mpi_cmp_int( &Q->Y, 0 ) != 0;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &Q->Y, &mQY, inv & nonzero ) );\n\ncleanup:\n    mbedtls_mpi_free( &mQY );\n\n    return( ret );\n}\n\n/*\n * Point doubling R = 2 P, Jacobian coordinates\n *\n * Based on http://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#doubling-dbl-1998-cmo-2 .\n *\n * We follow the variable naming fairly closely. The formula variations that trade a MUL for a SQR\n * (plus a few ADDs) aren't useful as our bignum implementation doesn't distinguish squaring.\n *\n * Standard optimizations are applied when curve parameter A is one of { 0, -3 }.\n *\n * Cost: 1D := 3M + 4S          (A ==  0)\n *             4M + 4S          (A == -3)\n *             3M + 6S + 1a     otherwise\n */\nstatic int ecp_double_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n                           const mbedtls_ecp_point *P )\n{\n    int ret;\n    mbedtls_mpi M, S, T, U;\n\n#if defined(MBEDTLS_SELF_TEST)\n    dbl_count++;\n#endif\n\n#if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT)\n    if ( mbedtls_internal_ecp_grp_capable( grp ) )\n    {\n        return mbedtls_internal_ecp_double_jac( grp, R, P );\n    }\n#endif /* MBEDTLS_ECP_DOUBLE_JAC_ALT */\n\n    mbedtls_mpi_init( &M ); mbedtls_mpi_init( &S ); mbedtls_mpi_init( &T ); mbedtls_mpi_init( &U );\n\n    /* Special case for A = -3 */\n    if( grp->A.p == NULL )\n    {\n        /* M = 3(X + Z^2)(X - Z^2) */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S,  &P->Z,  &P->Z   ) ); MOD_MUL( S );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &T,  &P->X,  &S      ) ); MOD_ADD( T );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U,  &P->X,  &S      ) ); MOD_SUB( U );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S,  &T,     &U      ) ); MOD_MUL( S );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M,  &S,     3       ) ); MOD_ADD( M );\n    }\n    else\n    {\n        /* M = 3.X^2 */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S,  &P->X,  &P->X   ) ); MOD_MUL( S );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M,  &S,     3       ) ); MOD_ADD( M );\n\n        /* Optimize away for \"koblitz\" curves with A = 0 */\n        if( mbedtls_mpi_cmp_int( &grp->A, 0 ) != 0 )\n        {\n            /* M += A.Z^4 */\n            MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S,  &P->Z,  &P->Z   ) ); MOD_MUL( S );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T,  &S,     &S      ) ); MOD_MUL( T );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S,  &T,     &grp->A ) ); MOD_MUL( S );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &M,  &M,     &S      ) ); MOD_ADD( M );\n        }\n    }\n\n    /* S = 4.X.Y^2 */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T,  &P->Y,  &P->Y   ) ); MOD_MUL( T );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T,  1               ) ); MOD_ADD( T );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S,  &P->X,  &T      ) ); MOD_MUL( S );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &S,  1               ) ); MOD_ADD( S );\n\n    /* U = 8.Y^4 */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &U,  &T,     &T      ) ); MOD_MUL( U );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &U,  1               ) ); MOD_ADD( U );\n\n    /* T = M^2 - 2.S */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T,  &M,     &M      ) ); MOD_MUL( T );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T,  &T,     &S      ) ); MOD_SUB( T );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T,  &T,     &S      ) ); MOD_SUB( T );\n\n    /* S = M(S - T) - U */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S,  &S,     &T      ) ); MOD_SUB( S );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S,  &S,     &M      ) ); MOD_MUL( S );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S,  &S,     &U      ) ); MOD_SUB( S );\n\n    /* U = 2.Y.Z */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &U,  &P->Y,  &P->Z   ) ); MOD_MUL( U );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &U,  1               ) ); MOD_ADD( U );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->X, &T ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Y, &S ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Z, &U ) );\n\ncleanup:\n    mbedtls_mpi_free( &M ); mbedtls_mpi_free( &S ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &U );\n\n    return( ret );\n}\n\n/*\n * Addition: R = P + Q, mixed affine-Jacobian coordinates (GECC 3.22)\n *\n * The coordinates of Q must be normalized (= affine),\n * but those of P don't need to. R is not normalized.\n *\n * Special cases: (1) P or Q is zero, (2) R is zero, (3) P == Q.\n * None of these cases can happen as intermediate step in ecp_mul_comb():\n * - at each step, P, Q and R are multiples of the base point, the factor\n *   being less than its order, so none of them is zero;\n * - Q is an odd multiple of the base point, P an even multiple,\n *   due to the choice of precomputed points in the modified comb method.\n * So branches for these cases do not leak secret information.\n *\n * We accept Q->Z being unset (saving memory in tables) as meaning 1.\n *\n * Cost: 1A := 8M + 3S\n */\nstatic int ecp_add_mixed( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n                          const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q )\n{\n    int ret;\n    mbedtls_mpi T1, T2, T3, T4, X, Y, Z;\n\n#if defined(MBEDTLS_SELF_TEST)\n    add_count++;\n#endif\n\n#if defined(MBEDTLS_ECP_ADD_MIXED_ALT)\n    if ( mbedtls_internal_ecp_grp_capable( grp ) )\n    {\n        return mbedtls_internal_ecp_add_mixed( grp, R, P, Q );\n    }\n#endif /* MBEDTLS_ECP_ADD_MIXED_ALT */\n\n    /*\n     * Trivial cases: P == 0 or Q == 0 (case 1)\n     */\n    if( mbedtls_mpi_cmp_int( &P->Z, 0 ) == 0 )\n        return( mbedtls_ecp_copy( R, Q ) );\n\n    if( Q->Z.p != NULL && mbedtls_mpi_cmp_int( &Q->Z, 0 ) == 0 )\n        return( mbedtls_ecp_copy( R, P ) );\n\n    /*\n     * Make sure Q coordinates are normalized\n     */\n    if( Q->Z.p != NULL && mbedtls_mpi_cmp_int( &Q->Z, 1 ) != 0 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 ); mbedtls_mpi_init( &T3 ); mbedtls_mpi_init( &T4 );\n    mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y ); mbedtls_mpi_init( &Z );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1,  &P->Z,  &P->Z ) );  MOD_MUL( T1 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T2,  &T1,    &P->Z ) );  MOD_MUL( T2 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1,  &T1,    &Q->X ) );  MOD_MUL( T1 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T2,  &T2,    &Q->Y ) );  MOD_MUL( T2 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T1,  &T1,    &P->X ) );  MOD_SUB( T1 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T2,  &T2,    &P->Y ) );  MOD_SUB( T2 );\n\n    /* Special cases (2) and (3) */\n    if( mbedtls_mpi_cmp_int( &T1, 0 ) == 0 )\n    {\n        if( mbedtls_mpi_cmp_int( &T2, 0 ) == 0 )\n        {\n            ret = ecp_double_jac( grp, R, P );\n            goto cleanup;\n        }\n        else\n        {\n            ret = mbedtls_ecp_set_zero( R );\n            goto cleanup;\n        }\n    }\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &Z,   &P->Z,  &T1   ) );  MOD_MUL( Z  );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3,  &T1,    &T1   ) );  MOD_MUL( T3 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T4,  &T3,    &T1   ) );  MOD_MUL( T4 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3,  &T3,    &P->X ) );  MOD_MUL( T3 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1,  &T3,    2     ) );  MOD_ADD( T1 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &X,   &T2,    &T2   ) );  MOD_MUL( X  );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X,   &X,     &T1   ) );  MOD_SUB( X  );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X,   &X,     &T4   ) );  MOD_SUB( X  );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T3,  &T3,    &X    ) );  MOD_SUB( T3 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T3,  &T3,    &T2   ) );  MOD_MUL( T3 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T4,  &T4,    &P->Y ) );  MOD_MUL( T4 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &Y,   &T3,    &T4   ) );  MOD_SUB( Y  );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->X, &X ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Y, &Y ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R->Z, &Z ) );\n\ncleanup:\n\n    mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 ); mbedtls_mpi_free( &T3 ); mbedtls_mpi_free( &T4 );\n    mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y ); mbedtls_mpi_free( &Z );\n\n    return( ret );\n}\n\n/*\n * Randomize jacobian coordinates:\n * (X, Y, Z) -> (l^2 X, l^3 Y, l Z) for random l\n * This is sort of the reverse operation of ecp_normalize_jac().\n *\n * This countermeasure was first suggested in [2].\n */\nstatic int ecp_randomize_jac( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,\n                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    int ret;\n    mbedtls_mpi l, ll;\n    size_t p_size;\n    int count = 0;\n\n#if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT)\n    if ( mbedtls_internal_ecp_grp_capable( grp ) )\n    {\n        return mbedtls_internal_ecp_randomize_jac( grp, pt, f_rng, p_rng );\n    }\n#endif /* MBEDTLS_ECP_RANDOMIZE_JAC_ALT */\n\n    p_size = ( grp->pbits + 7 ) / 8;\n    mbedtls_mpi_init( &l ); mbedtls_mpi_init( &ll );\n\n    /* Generate l such that 1 < l < p */\n    do\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &l, p_size, f_rng, p_rng ) );\n\n        while( mbedtls_mpi_cmp_mpi( &l, &grp->P ) >= 0 )\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &l, 1 ) );\n\n        if( count++ > 10 )\n            return( MBEDTLS_ERR_ECP_RANDOM_FAILED );\n    }\n    while( mbedtls_mpi_cmp_int( &l, 1 ) <= 0 );\n\n    /* Z = l * Z */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Z,   &pt->Z,     &l  ) ); MOD_MUL( pt->Z );\n\n    /* X = l^2 * X */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ll,      &l,         &l  ) ); MOD_MUL( ll );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->X,   &pt->X,     &ll ) ); MOD_MUL( pt->X );\n\n    /* Y = l^3 * Y */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ll,      &ll,        &l  ) ); MOD_MUL( ll );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &pt->Y,   &pt->Y,     &ll ) ); MOD_MUL( pt->Y );\n\ncleanup:\n    mbedtls_mpi_free( &l ); mbedtls_mpi_free( &ll );\n\n    return( ret );\n}\n\n/*\n * Check and define parameters used by the comb method (see below for details)\n */\n#if MBEDTLS_ECP_WINDOW_SIZE < 2 || MBEDTLS_ECP_WINDOW_SIZE > 7\n#error \"MBEDTLS_ECP_WINDOW_SIZE out of bounds\"\n#endif\n\n/* d = ceil( n / w ) */\n#define COMB_MAX_D      ( MBEDTLS_ECP_MAX_BITS + 1 ) / 2\n\n/* number of precomputed points */\n#define COMB_MAX_PRE    ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) )\n\n/*\n * Compute the representation of m that will be used with our comb method.\n *\n * The basic comb method is described in GECC 3.44 for example. We use a\n * modified version that provides resistance to SPA by avoiding zero\n * digits in the representation as in [3]. We modify the method further by\n * requiring that all K_i be odd, which has the small cost that our\n * representation uses one more K_i, due to carries.\n *\n * Also, for the sake of compactness, only the seven low-order bits of x[i]\n * are used to represent K_i, and the msb of x[i] encodes the the sign (s_i in\n * the paper): it is set if and only if if s_i == -1;\n *\n * Calling conventions:\n * - x is an array of size d + 1\n * - w is the size, ie number of teeth, of the comb, and must be between\n *   2 and 7 (in practice, between 2 and MBEDTLS_ECP_WINDOW_SIZE)\n * - m is the MPI, expected to be odd and such that bitlength(m) <= w * d\n *   (the result will be incorrect if these assumptions are not satisfied)\n */\nstatic void ecp_comb_fixed( unsigned char x[], size_t d,\n                            unsigned char w, const mbedtls_mpi *m )\n{\n    size_t i, j;\n    unsigned char c, cc, adjust;\n\n    memset( x, 0, d+1 );\n\n    /* First get the classical comb values (except for x_d = 0) */\n    for( i = 0; i < d; i++ )\n        for( j = 0; j < w; j++ )\n            x[i] |= mbedtls_mpi_get_bit( m, i + d * j ) << j;\n\n    /* Now make sure x_1 .. x_d are odd */\n    c = 0;\n    for( i = 1; i <= d; i++ )\n    {\n        /* Add carry and update it */\n        cc   = x[i] & c;\n        x[i] = x[i] ^ c;\n        c = cc;\n\n        /* Adjust if needed, avoiding branches */\n        adjust = 1 - ( x[i] & 0x01 );\n        c   |= x[i] & ( x[i-1] * adjust );\n        x[i] = x[i] ^ ( x[i-1] * adjust );\n        x[i-1] |= adjust << 7;\n    }\n}\n\n/*\n * Precompute points for the comb method\n *\n * If i = i_{w-1} ... i_1 is the binary representation of i, then\n * T[i] = i_{w-1} 2^{(w-1)d} P + ... + i_1 2^d P + P\n *\n * T must be able to hold 2^{w - 1} elements\n *\n * Cost: d(w-1) D + (2^{w-1} - 1) A + 1 N(w-1) + 1 N(2^{w-1} - 1)\n */\nstatic int ecp_precompute_comb( const mbedtls_ecp_group *grp,\n                                mbedtls_ecp_point T[], const mbedtls_ecp_point *P,\n                                unsigned char w, size_t d )\n{\n    int ret;\n    unsigned char i, k;\n    size_t j;\n    mbedtls_ecp_point *cur, *TT[COMB_MAX_PRE - 1];\n\n    /*\n     * Set T[0] = P and\n     * T[2^{l-1}] = 2^{dl} P for l = 1 .. w-1 (this is not the final value)\n     */\n    MBEDTLS_MPI_CHK( mbedtls_ecp_copy( &T[0], P ) );\n\n    k = 0;\n    for( i = 1; i < ( 1U << ( w - 1 ) ); i <<= 1 )\n    {\n        cur = T + i;\n        MBEDTLS_MPI_CHK( mbedtls_ecp_copy( cur, T + ( i >> 1 ) ) );\n        for( j = 0; j < d; j++ )\n            MBEDTLS_MPI_CHK( ecp_double_jac( grp, cur, cur ) );\n\n        TT[k++] = cur;\n    }\n\n    MBEDTLS_MPI_CHK( ecp_normalize_jac_many( grp, TT, k ) );\n\n    /*\n     * Compute the remaining ones using the minimal number of additions\n     * Be careful to update T[2^l] only after using it!\n     */\n    k = 0;\n    for( i = 1; i < ( 1U << ( w - 1 ) ); i <<= 1 )\n    {\n        j = i;\n        while( j-- )\n        {\n            MBEDTLS_MPI_CHK( ecp_add_mixed( grp, &T[i + j], &T[j], &T[i] ) );\n            TT[k++] = &T[i + j];\n        }\n    }\n\n    MBEDTLS_MPI_CHK( ecp_normalize_jac_many( grp, TT, k ) );\n\ncleanup:\n\n    return( ret );\n}\n\n/*\n * Select precomputed point: R = sign(i) * T[ abs(i) / 2 ]\n */\nstatic int ecp_select_comb( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n                            const mbedtls_ecp_point T[], unsigned char t_len,\n                            unsigned char i )\n{\n    int ret;\n    unsigned char ii, j;\n\n    /* Ignore the \"sign\" bit and scale down */\n    ii =  ( i & 0x7Fu ) >> 1;\n\n    /* Read the whole table to thwart cache-based timing attacks */\n    for( j = 0; j < t_len; j++ )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &R->X, &T[j].X, j == ii ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &R->Y, &T[j].Y, j == ii ) );\n    }\n\n    /* Safely invert result if i is \"negative\" */\n    MBEDTLS_MPI_CHK( ecp_safe_invert_jac( grp, R, i >> 7 ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Core multiplication algorithm for the (modified) comb method.\n * This part is actually common with the basic comb method (GECC 3.44)\n *\n * Cost: d A + d D + 1 R\n */\nstatic int ecp_mul_comb_core( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n                              const mbedtls_ecp_point T[], unsigned char t_len,\n                              const unsigned char x[], size_t d,\n                              int (*f_rng)(void *, unsigned char *, size_t),\n                              void *p_rng )\n{\n    int ret;\n    mbedtls_ecp_point Txi;\n    size_t i;\n\n    mbedtls_ecp_point_init( &Txi );\n\n    /* Start with a non-zero point and randomize its coordinates */\n    i = d;\n    MBEDTLS_MPI_CHK( ecp_select_comb( grp, R, T, t_len, x[i] ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->Z, 1 ) );\n    if( f_rng != 0 )\n        MBEDTLS_MPI_CHK( ecp_randomize_jac( grp, R, f_rng, p_rng ) );\n\n    while( i-- != 0 )\n    {\n        MBEDTLS_MPI_CHK( ecp_double_jac( grp, R, R ) );\n        MBEDTLS_MPI_CHK( ecp_select_comb( grp, &Txi, T, t_len, x[i] ) );\n        MBEDTLS_MPI_CHK( ecp_add_mixed( grp, R, R, &Txi ) );\n    }\n\ncleanup:\n\n    mbedtls_ecp_point_free( &Txi );\n\n    return( ret );\n}\n\n/*\n * Multiplication using the comb method,\n * for curves in short Weierstrass form\n */\nstatic int ecp_mul_comb( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n                         const mbedtls_mpi *m, const mbedtls_ecp_point *P,\n                         int (*f_rng)(void *, unsigned char *, size_t),\n                         void *p_rng )\n{\n    int ret;\n    unsigned char w, m_is_odd, p_eq_g, pre_len, i;\n    size_t d;\n    unsigned char k[COMB_MAX_D + 1];\n    mbedtls_ecp_point *T;\n    mbedtls_mpi M, mm;\n\n    mbedtls_mpi_init( &M );\n    mbedtls_mpi_init( &mm );\n\n    /* we need N to be odd to trnaform m in an odd number, check now */\n    if( mbedtls_mpi_get_bit( &grp->N, 0 ) != 1 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    /*\n     * Minimize the number of multiplications, that is minimize\n     * 10 * d * w + 18 * 2^(w-1) + 11 * d + 7 * w, with d = ceil( nbits / w )\n     * (see costs of the various parts, with 1S = 1M)\n     */\n    w = grp->nbits >= 384 ? 5 : 4;\n\n    /*\n     * If P == G, pre-compute a bit more, since this may be re-used later.\n     * Just adding one avoids upping the cost of the first mul too much,\n     * and the memory cost too.\n     */\n#if MBEDTLS_ECP_FIXED_POINT_OPTIM == 1\n    p_eq_g = ( mbedtls_mpi_cmp_mpi( &P->Y, &grp->G.Y ) == 0 &&\n               mbedtls_mpi_cmp_mpi( &P->X, &grp->G.X ) == 0 );\n    if( p_eq_g )\n        w++;\n#else\n    p_eq_g = 0;\n#endif\n\n    /*\n     * Make sure w is within bounds.\n     * (The last test is useful only for very small curves in the test suite.)\n     */\n    if( w > MBEDTLS_ECP_WINDOW_SIZE )\n        w = MBEDTLS_ECP_WINDOW_SIZE;\n    if( w >= grp->nbits )\n        w = 2;\n\n    /* Other sizes that depend on w */\n    pre_len = 1U << ( w - 1 );\n    d = ( grp->nbits + w - 1 ) / w;\n\n    /*\n     * Prepare precomputed points: if P == G we want to\n     * use grp->T if already initialized, or initialize it.\n     */\n    T = p_eq_g ? grp->T : NULL;\n\n    if( T == NULL )\n    {\n        T = mbedtls_calloc( pre_len, sizeof( mbedtls_ecp_point ) );\n        if( T == NULL )\n        {\n            ret = MBEDTLS_ERR_ECP_ALLOC_FAILED;\n            goto cleanup;\n        }\n\n        MBEDTLS_MPI_CHK( ecp_precompute_comb( grp, T, P, w, d ) );\n\n        if( p_eq_g )\n        {\n            grp->T = T;\n            grp->T_size = pre_len;\n        }\n    }\n\n    /*\n     * Make sure M is odd (M = m or M = N - m, since N is odd)\n     * using the fact that m * P = - (N - m) * P\n     */\n    m_is_odd = ( mbedtls_mpi_get_bit( m, 0 ) == 1 );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &M, m ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &mm, &grp->N, m ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_assign( &M, &mm, ! m_is_odd ) );\n\n    /*\n     * Go for comb multiplication, R = M * P\n     */\n    ecp_comb_fixed( k, d, w, &M );\n    MBEDTLS_MPI_CHK( ecp_mul_comb_core( grp, R, T, pre_len, k, d, f_rng, p_rng ) );\n\n    /*\n     * Now get m * P from M * P and normalize it\n     */\n    MBEDTLS_MPI_CHK( ecp_safe_invert_jac( grp, R, ! m_is_odd ) );\n    MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, R ) );\n\ncleanup:\n\n    if( T != NULL && ! p_eq_g )\n    {\n        for( i = 0; i < pre_len; i++ )\n            mbedtls_ecp_point_free( &T[i] );\n        mbedtls_free( T );\n    }\n\n    mbedtls_mpi_free( &M );\n    mbedtls_mpi_free( &mm );\n\n    if( ret != 0 )\n        mbedtls_ecp_point_free( R );\n\n    return( ret );\n}\n\n#endif /* ECP_SHORTWEIERSTRASS */\n\n#if defined(ECP_MONTGOMERY)\n/*\n * For Montgomery curves, we do all the internal arithmetic in projective\n * coordinates. Import/export of points uses only the x coordinates, which is\n * internaly represented as X / Z.\n *\n * For scalar multiplication, we'll use a Montgomery ladder.\n */\n\n/*\n * Normalize Montgomery x/z coordinates: X = X/Z, Z = 1\n * Cost: 1M + 1I\n */\nstatic int ecp_normalize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P )\n{\n    int ret;\n\n#if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT)\n    if ( mbedtls_internal_ecp_grp_capable( grp ) )\n    {\n        return mbedtls_internal_ecp_normalize_mxz( grp, P );\n    }\n#endif /* MBEDTLS_ECP_NORMALIZE_MXZ_ALT */\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &P->Z, &P->Z, &grp->P ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->X, &P->X, &P->Z ) ); MOD_MUL( P->X );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &P->Z, 1 ) );\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Randomize projective x/z coordinates:\n * (X, Z) -> (l X, l Z) for random l\n * This is sort of the reverse operation of ecp_normalize_mxz().\n *\n * This countermeasure was first suggested in [2].\n * Cost: 2M\n */\nstatic int ecp_randomize_mxz( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P,\n                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    int ret;\n    mbedtls_mpi l;\n    size_t p_size;\n    int count = 0;\n\n#if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT)\n    if ( mbedtls_internal_ecp_grp_capable( grp ) )\n    {\n        return mbedtls_internal_ecp_randomize_mxz( grp, P, f_rng, p_rng );\n    }\n#endif /* MBEDTLS_ECP_RANDOMIZE_MXZ_ALT */\n\n    p_size = ( grp->pbits + 7 ) / 8;\n    mbedtls_mpi_init( &l );\n\n    /* Generate l such that 1 < l < p */\n    do\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &l, p_size, f_rng, p_rng ) );\n\n        while( mbedtls_mpi_cmp_mpi( &l, &grp->P ) >= 0 )\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &l, 1 ) );\n\n        if( count++ > 10 )\n            return( MBEDTLS_ERR_ECP_RANDOM_FAILED );\n    }\n    while( mbedtls_mpi_cmp_int( &l, 1 ) <= 0 );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->X, &P->X, &l ) ); MOD_MUL( P->X );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &P->Z, &P->Z, &l ) ); MOD_MUL( P->Z );\n\ncleanup:\n    mbedtls_mpi_free( &l );\n\n    return( ret );\n}\n\n/*\n * Double-and-add: R = 2P, S = P + Q, with d = X(P - Q),\n * for Montgomery curves in x/z coordinates.\n *\n * http://www.hyperelliptic.org/EFD/g1p/auto-code/montgom/xz/ladder/mladd-1987-m.op3\n * with\n * d =  X1\n * P = (X2, Z2)\n * Q = (X3, Z3)\n * R = (X4, Z4)\n * S = (X5, Z5)\n * and eliminating temporary variables tO, ..., t4.\n *\n * Cost: 5M + 4S\n */\nstatic int ecp_double_add_mxz( const mbedtls_ecp_group *grp,\n                               mbedtls_ecp_point *R, mbedtls_ecp_point *S,\n                               const mbedtls_ecp_point *P, const mbedtls_ecp_point *Q,\n                               const mbedtls_mpi *d )\n{\n    int ret;\n    mbedtls_mpi A, AA, B, BB, E, C, D, DA, CB;\n\n#if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT)\n    if ( mbedtls_internal_ecp_grp_capable( grp ) )\n    {\n        return mbedtls_internal_ecp_double_add_mxz( grp, R, S, P, Q, d );\n    }\n#endif /* MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT */\n\n    mbedtls_mpi_init( &A ); mbedtls_mpi_init( &AA ); mbedtls_mpi_init( &B );\n    mbedtls_mpi_init( &BB ); mbedtls_mpi_init( &E ); mbedtls_mpi_init( &C );\n    mbedtls_mpi_init( &D ); mbedtls_mpi_init( &DA ); mbedtls_mpi_init( &CB );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &A,    &P->X,   &P->Z ) ); MOD_ADD( A    );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &AA,   &A,      &A    ) ); MOD_MUL( AA   );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &B,    &P->X,   &P->Z ) ); MOD_SUB( B    );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &BB,   &B,      &B    ) ); MOD_MUL( BB   );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &E,    &AA,     &BB   ) ); MOD_SUB( E    );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &C,    &Q->X,   &Q->Z ) ); MOD_ADD( C    );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &D,    &Q->X,   &Q->Z ) ); MOD_SUB( D    );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DA,   &D,      &A    ) ); MOD_MUL( DA   );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &CB,   &C,      &B    ) ); MOD_MUL( CB   );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &S->X, &DA,     &CB   ) ); MOD_MUL( S->X );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->X, &S->X,   &S->X ) ); MOD_MUL( S->X );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &S->Z, &DA,     &CB   ) ); MOD_SUB( S->Z );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->Z, &S->Z,   &S->Z ) ); MOD_MUL( S->Z );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &S->Z, d,       &S->Z ) ); MOD_MUL( S->Z );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->X, &AA,     &BB   ) ); MOD_MUL( R->X );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->Z, &grp->A, &E    ) ); MOD_MUL( R->Z );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &R->Z, &BB,     &R->Z ) ); MOD_ADD( R->Z );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &R->Z, &E,      &R->Z ) ); MOD_MUL( R->Z );\n\ncleanup:\n    mbedtls_mpi_free( &A ); mbedtls_mpi_free( &AA ); mbedtls_mpi_free( &B );\n    mbedtls_mpi_free( &BB ); mbedtls_mpi_free( &E ); mbedtls_mpi_free( &C );\n    mbedtls_mpi_free( &D ); mbedtls_mpi_free( &DA ); mbedtls_mpi_free( &CB );\n\n    return( ret );\n}\n\n/*\n * Multiplication with Montgomery ladder in x/z coordinates,\n * for curves in Montgomery form\n */\nstatic int ecp_mul_mxz( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n                        const mbedtls_mpi *m, const mbedtls_ecp_point *P,\n                        int (*f_rng)(void *, unsigned char *, size_t),\n                        void *p_rng )\n{\n    int ret;\n    size_t i;\n    unsigned char b;\n    mbedtls_ecp_point RP;\n    mbedtls_mpi PX;\n\n    mbedtls_ecp_point_init( &RP ); mbedtls_mpi_init( &PX );\n\n    /* Save PX and read from P before writing to R, in case P == R */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &PX, &P->X ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_copy( &RP, P ) );\n\n    /* Set R to zero in modified x/z coordinates */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->X, 1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->Z, 0 ) );\n    mbedtls_mpi_free( &R->Y );\n\n    /* RP.X might be sligtly larger than P, so reduce it */\n    MOD_ADD( RP.X );\n\n    /* Randomize coordinates of the starting point */\n    if( f_rng != NULL )\n        MBEDTLS_MPI_CHK( ecp_randomize_mxz( grp, &RP, f_rng, p_rng ) );\n\n    /* Loop invariant: R = result so far, RP = R + P */\n    i = mbedtls_mpi_bitlen( m ); /* one past the (zero-based) most significant bit */\n    while( i-- > 0 )\n    {\n        b = mbedtls_mpi_get_bit( m, i );\n        /*\n         *  if (b) R = 2R + P else R = 2R,\n         * which is:\n         *  if (b) double_add( RP, R, RP, R )\n         *  else   double_add( R, RP, R, RP )\n         * but using safe conditional swaps to avoid leaks\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->X, &RP.X, b ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->Z, &RP.Z, b ) );\n        MBEDTLS_MPI_CHK( ecp_double_add_mxz( grp, R, &RP, R, &RP, &PX ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->X, &RP.X, b ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_safe_cond_swap( &R->Z, &RP.Z, b ) );\n    }\n\n    MBEDTLS_MPI_CHK( ecp_normalize_mxz( grp, R ) );\n\ncleanup:\n    mbedtls_ecp_point_free( &RP ); mbedtls_mpi_free( &PX );\n\n    return( ret );\n}\n\n#endif /* ECP_MONTGOMERY */\n\n/*\n * Multiplication R = m * P\n */\nint mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n             const mbedtls_mpi *m, const mbedtls_ecp_point *P,\n             int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    int ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;\n#if defined(MBEDTLS_ECP_INTERNAL_ALT)\n    char is_grp_capable = 0;\n#endif\n\n    /* Common sanity checks */\n    if( mbedtls_mpi_cmp_int( &P->Z, 1 ) != 0 )\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_ecp_check_privkey( grp, m ) ) != 0 ||\n        ( ret = mbedtls_ecp_check_pubkey( grp, P ) ) != 0 )\n        return( ret );\n\n#if defined(MBEDTLS_ECP_INTERNAL_ALT)\n    if ( is_grp_capable = mbedtls_internal_ecp_grp_capable( grp )  )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_internal_ecp_init( grp ) );\n    }\n\n#endif /* MBEDTLS_ECP_INTERNAL_ALT */\n#if defined(ECP_MONTGOMERY)\n    if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY )\n        ret = ecp_mul_mxz( grp, R, m, P, f_rng, p_rng );\n\n#endif\n#if defined(ECP_SHORTWEIERSTRASS)\n    if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS )\n        ret = ecp_mul_comb( grp, R, m, P, f_rng, p_rng );\n\n#endif\n#if defined(MBEDTLS_ECP_INTERNAL_ALT)\ncleanup:\n\n    if ( is_grp_capable )\n    {\n        mbedtls_internal_ecp_free( grp );\n    }\n\n#endif /* MBEDTLS_ECP_INTERNAL_ALT */\n    return( ret );\n}\n\n#if defined(ECP_SHORTWEIERSTRASS)\n/*\n * Check that an affine point is valid as a public key,\n * short weierstrass curves (SEC1 3.2.3.1)\n */\nstatic int ecp_check_pubkey_sw( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt )\n{\n    int ret;\n    mbedtls_mpi YY, RHS;\n\n    /* pt coordinates must be normalized for our checks */\n    if( mbedtls_mpi_cmp_int( &pt->X, 0 ) < 0 ||\n        mbedtls_mpi_cmp_int( &pt->Y, 0 ) < 0 ||\n        mbedtls_mpi_cmp_mpi( &pt->X, &grp->P ) >= 0 ||\n        mbedtls_mpi_cmp_mpi( &pt->Y, &grp->P ) >= 0 )\n        return( MBEDTLS_ERR_ECP_INVALID_KEY );\n\n    mbedtls_mpi_init( &YY ); mbedtls_mpi_init( &RHS );\n\n    /*\n     * YY = Y^2\n     * RHS = X (X^2 + A) + B = X^3 + A X + B\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &YY,  &pt->Y,   &pt->Y  ) );  MOD_MUL( YY  );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &RHS, &pt->X,   &pt->X  ) );  MOD_MUL( RHS );\n\n    /* Special case for A = -3 */\n    if( grp->A.p == NULL )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &RHS, &RHS, 3       ) );  MOD_SUB( RHS );\n    }\n    else\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &RHS, &RHS, &grp->A ) );  MOD_ADD( RHS );\n    }\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &RHS, &RHS,     &pt->X  ) );  MOD_MUL( RHS );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &RHS, &RHS,     &grp->B ) );  MOD_ADD( RHS );\n\n    if( mbedtls_mpi_cmp_mpi( &YY, &RHS ) != 0 )\n        ret = MBEDTLS_ERR_ECP_INVALID_KEY;\n\ncleanup:\n\n    mbedtls_mpi_free( &YY ); mbedtls_mpi_free( &RHS );\n\n    return( ret );\n}\n#endif /* ECP_SHORTWEIERSTRASS */\n\n/*\n * R = m * P with shortcuts for m == 1 and m == -1\n * NOT constant-time - ONLY for short Weierstrass!\n */\nstatic int mbedtls_ecp_mul_shortcuts( mbedtls_ecp_group *grp,\n                                      mbedtls_ecp_point *R,\n                                      const mbedtls_mpi *m,\n                                      const mbedtls_ecp_point *P )\n{\n    int ret;\n\n    if( mbedtls_mpi_cmp_int( m, 1 ) == 0 )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) );\n    }\n    else if( mbedtls_mpi_cmp_int( m, -1 ) == 0 )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) );\n        if( mbedtls_mpi_cmp_int( &R->Y, 0 ) != 0 )\n            MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &R->Y, &grp->P, &R->Y ) );\n    }\n    else\n    {\n        MBEDTLS_MPI_CHK( mbedtls_ecp_mul( grp, R, m, P, NULL, NULL ) );\n    }\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Linear combination\n * NOT constant-time\n */\nint mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,\n             const mbedtls_mpi *m, const mbedtls_ecp_point *P,\n             const mbedtls_mpi *n, const mbedtls_ecp_point *Q )\n{\n    int ret;\n    mbedtls_ecp_point mP;\n#if defined(MBEDTLS_ECP_INTERNAL_ALT)\n    char is_grp_capable = 0;\n#endif\n\n    if( ecp_get_type( grp ) != ECP_TYPE_SHORT_WEIERSTRASS )\n        return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );\n\n    mbedtls_ecp_point_init( &mP );\n\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul_shortcuts( grp, &mP, m, P ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul_shortcuts( grp, R,   n, Q ) );\n\n#if defined(MBEDTLS_ECP_INTERNAL_ALT)\n    if (  is_grp_capable = mbedtls_internal_ecp_grp_capable( grp )  )\n    {\n        MBEDTLS_MPI_CHK( mbedtls_internal_ecp_init( grp ) );\n    }\n\n#endif /* MBEDTLS_ECP_INTERNAL_ALT */\n    MBEDTLS_MPI_CHK( ecp_add_mixed( grp, R, &mP, R ) );\n    MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, R ) );\n\ncleanup:\n\n#if defined(MBEDTLS_ECP_INTERNAL_ALT)\n    if ( is_grp_capable )\n    {\n        mbedtls_internal_ecp_free( grp );\n    }\n\n#endif /* MBEDTLS_ECP_INTERNAL_ALT */\n    mbedtls_ecp_point_free( &mP );\n\n    return( ret );\n}\n\n\n#if defined(ECP_MONTGOMERY)\n/*\n * Check validity of a public key for Montgomery curves with x-only schemes\n */\nstatic int ecp_check_pubkey_mx( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt )\n{\n    /* [Curve25519 p. 5] Just check X is the correct number of bytes */\n    if( mbedtls_mpi_size( &pt->X ) > ( grp->nbits + 7 ) / 8 )\n        return( MBEDTLS_ERR_ECP_INVALID_KEY );\n\n    return( 0 );\n}\n#endif /* ECP_MONTGOMERY */\n\n/*\n * Check that a point is valid as a public key\n */\nint mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt )\n{\n    /* Must use affine coordinates */\n    if( mbedtls_mpi_cmp_int( &pt->Z, 1 ) != 0 )\n        return( MBEDTLS_ERR_ECP_INVALID_KEY );\n\n#if defined(ECP_MONTGOMERY)\n    if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY )\n        return( ecp_check_pubkey_mx( grp, pt ) );\n#endif\n#if defined(ECP_SHORTWEIERSTRASS)\n    if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS )\n        return( ecp_check_pubkey_sw( grp, pt ) );\n#endif\n    return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n}\n\n/*\n * Check that an mbedtls_mpi is valid as a private key\n */\nint mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d )\n{\n#if defined(ECP_MONTGOMERY)\n    if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY )\n    {\n        /* see [Curve25519] page 5 */\n        if( mbedtls_mpi_get_bit( d, 0 ) != 0 ||\n            mbedtls_mpi_get_bit( d, 1 ) != 0 ||\n            mbedtls_mpi_get_bit( d, 2 ) != 0 ||\n            mbedtls_mpi_bitlen( d ) - 1 != grp->nbits ) /* mbedtls_mpi_bitlen is one-based! */\n            return( MBEDTLS_ERR_ECP_INVALID_KEY );\n        else\n            return( 0 );\n    }\n#endif /* ECP_MONTGOMERY */\n#if defined(ECP_SHORTWEIERSTRASS)\n    if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS )\n    {\n        /* see SEC1 3.2 */\n        if( mbedtls_mpi_cmp_int( d, 1 ) < 0 ||\n            mbedtls_mpi_cmp_mpi( d, &grp->N ) >= 0 )\n            return( MBEDTLS_ERR_ECP_INVALID_KEY );\n        else\n            return( 0 );\n    }\n#endif /* ECP_SHORTWEIERSTRASS */\n\n    return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n}\n\n/*\n * Generate a keypair with configurable base point\n */\nint mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,\n                     const mbedtls_ecp_point *G,\n                     mbedtls_mpi *d, mbedtls_ecp_point *Q,\n                     int (*f_rng)(void *, unsigned char *, size_t),\n                     void *p_rng )\n{\n    int ret;\n    size_t n_size = ( grp->nbits + 7 ) / 8;\n\n#if defined(ECP_MONTGOMERY)\n    if( ecp_get_type( grp ) == ECP_TYPE_MONTGOMERY )\n    {\n        /* [M225] page 5 */\n        size_t b;\n\n        do {\n            MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( d, n_size, f_rng, p_rng ) );\n        } while( mbedtls_mpi_bitlen( d ) == 0);\n\n        /* Make sure the most significant bit is nbits */\n        b = mbedtls_mpi_bitlen( d ) - 1; /* mbedtls_mpi_bitlen is one-based */\n        if( b > grp->nbits )\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( d, b - grp->nbits ) );\n        else\n            MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, grp->nbits, 1 ) );\n\n        /* Make sure the last three bits are unset */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 0, 0 ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 1, 0 ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( d, 2, 0 ) );\n    }\n    else\n#endif /* ECP_MONTGOMERY */\n#if defined(ECP_SHORTWEIERSTRASS)\n    if( ecp_get_type( grp ) == ECP_TYPE_SHORT_WEIERSTRASS )\n    {\n        /* SEC1 3.2.1: Generate d such that 1 <= n < N */\n        int count = 0;\n        unsigned char rnd[MBEDTLS_ECP_MAX_BYTES];\n\n        /*\n         * Match the procedure given in RFC 6979 (deterministic ECDSA):\n         * - use the same byte ordering;\n         * - keep the leftmost nbits bits of the generated octet string;\n         * - try until result is in the desired range.\n         * This also avoids any biais, which is especially important for ECDSA.\n         */\n        do\n        {\n            MBEDTLS_MPI_CHK( f_rng( p_rng, rnd, n_size ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( d, rnd, n_size ) );\n            MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( d, 8 * n_size - grp->nbits ) );\n\n            /*\n             * Each try has at worst a probability 1/2 of failing (the msb has\n             * a probability 1/2 of being 0, and then the result will be < N),\n             * so after 30 tries failure probability is a most 2**(-30).\n             *\n             * For most curves, 1 try is enough with overwhelming probability,\n             * since N starts with a lot of 1s in binary, but some curves\n             * such as secp224k1 are actually very close to the worst case.\n             */\n            if( ++count > 30 )\n                return( MBEDTLS_ERR_ECP_RANDOM_FAILED );\n        }\n        while( mbedtls_mpi_cmp_int( d, 1 ) < 0 ||\n               mbedtls_mpi_cmp_mpi( d, &grp->N ) >= 0 );\n    }\n    else\n#endif /* ECP_SHORTWEIERSTRASS */\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n\ncleanup:\n    if( ret != 0 )\n        return( ret );\n\n    return( mbedtls_ecp_mul( grp, Q, d, G, f_rng, p_rng ) );\n}\n\n/*\n * Generate key pair, wrapper for conventional base point\n */\nint mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp,\n                             mbedtls_mpi *d, mbedtls_ecp_point *Q,\n                             int (*f_rng)(void *, unsigned char *, size_t),\n                             void *p_rng )\n{\n    return( mbedtls_ecp_gen_keypair_base( grp, &grp->G, d, Q, f_rng, p_rng ) );\n}\n\n/*\n * Generate a keypair, prettier wrapper\n */\nint mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,\n                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    int ret;\n\n    if( ( ret = mbedtls_ecp_group_load( &key->grp, grp_id ) ) != 0 )\n        return( ret );\n\n    return( mbedtls_ecp_gen_keypair( &key->grp, &key->d, &key->Q, f_rng, p_rng ) );\n}\n\n/*\n * Check a public-private key pair\n */\nint mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv )\n{\n    int ret;\n    mbedtls_ecp_point Q;\n    mbedtls_ecp_group grp;\n\n    if( pub->grp.id == MBEDTLS_ECP_DP_NONE ||\n        pub->grp.id != prv->grp.id ||\n        mbedtls_mpi_cmp_mpi( &pub->Q.X, &prv->Q.X ) ||\n        mbedtls_mpi_cmp_mpi( &pub->Q.Y, &prv->Q.Y ) ||\n        mbedtls_mpi_cmp_mpi( &pub->Q.Z, &prv->Q.Z ) )\n    {\n        return( MBEDTLS_ERR_ECP_BAD_INPUT_DATA );\n    }\n\n    mbedtls_ecp_point_init( &Q );\n    mbedtls_ecp_group_init( &grp );\n\n    /* mbedtls_ecp_mul() needs a non-const group... */\n    mbedtls_ecp_group_copy( &grp, &prv->grp );\n\n    /* Also checks d is valid */\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &Q, &prv->d, &prv->grp.G, NULL, NULL ) );\n\n    if( mbedtls_mpi_cmp_mpi( &Q.X, &prv->Q.X ) ||\n        mbedtls_mpi_cmp_mpi( &Q.Y, &prv->Q.Y ) ||\n        mbedtls_mpi_cmp_mpi( &Q.Z, &prv->Q.Z ) )\n    {\n        ret = MBEDTLS_ERR_ECP_BAD_INPUT_DATA;\n        goto cleanup;\n    }\n\ncleanup:\n    mbedtls_ecp_point_free( &Q );\n    mbedtls_ecp_group_free( &grp );\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n\n/*\n * Checkup routine\n */\nint mbedtls_ecp_self_test( int verbose )\n{\n    int ret;\n    size_t i;\n    mbedtls_ecp_group grp;\n    mbedtls_ecp_point R, P;\n    mbedtls_mpi m;\n    unsigned long add_c_prev, dbl_c_prev, mul_c_prev;\n    /* exponents especially adapted for secp192r1 */\n    const char *exponents[] =\n    {\n        \"000000000000000000000000000000000000000000000001\", /* one */\n        \"FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22830\", /* N - 1 */\n        \"5EA6F389A38B8BC81E767753B15AA5569E1782E30ABE7D25\", /* random */\n        \"400000000000000000000000000000000000000000000000\", /* one and zeros */\n        \"7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\", /* all ones */\n        \"555555555555555555555555555555555555555555555555\", /* 101010... */\n    };\n\n    mbedtls_ecp_group_init( &grp );\n    mbedtls_ecp_point_init( &R );\n    mbedtls_ecp_point_init( &P );\n    mbedtls_mpi_init( &m );\n\n    /* Use secp192r1 if available, or any available curve */\n#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)\n    MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, MBEDTLS_ECP_DP_SECP192R1 ) );\n#else\n    MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &grp, mbedtls_ecp_curve_list()->grp_id ) );\n#endif\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  ECP test #1 (constant op_count, base point G): \" );\n\n    /* Do a dummy multiplication first to trigger precomputation */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &m, 2 ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &P, &m, &grp.G, NULL, NULL ) );\n\n    add_count = 0;\n    dbl_count = 0;\n    mul_count = 0;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[0] ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &grp.G, NULL, NULL ) );\n\n    for( i = 1; i < sizeof( exponents ) / sizeof( exponents[0] ); i++ )\n    {\n        add_c_prev = add_count;\n        dbl_c_prev = dbl_count;\n        mul_c_prev = mul_count;\n        add_count = 0;\n        dbl_count = 0;\n        mul_count = 0;\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[i] ) );\n        MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &grp.G, NULL, NULL ) );\n\n        if( add_count != add_c_prev ||\n            dbl_count != dbl_c_prev ||\n            mul_count != mul_c_prev )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed (%u)\\n\", (unsigned int) i );\n\n            ret = 1;\n            goto cleanup;\n        }\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  ECP test #2 (constant op_count, other point): \" );\n    /* We computed P = 2G last time, use it */\n\n    add_count = 0;\n    dbl_count = 0;\n    mul_count = 0;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[0] ) );\n    MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &P, NULL, NULL ) );\n\n    for( i = 1; i < sizeof( exponents ) / sizeof( exponents[0] ); i++ )\n    {\n        add_c_prev = add_count;\n        dbl_c_prev = dbl_count;\n        mul_c_prev = mul_count;\n        add_count = 0;\n        dbl_count = 0;\n        mul_count = 0;\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &m, 16, exponents[i] ) );\n        MBEDTLS_MPI_CHK( mbedtls_ecp_mul( &grp, &R, &m, &P, NULL, NULL ) );\n\n        if( add_count != add_c_prev ||\n            dbl_count != dbl_c_prev ||\n            mul_count != mul_c_prev )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed (%u)\\n\", (unsigned int) i );\n\n            ret = 1;\n            goto cleanup;\n        }\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\ncleanup:\n\n    if( ret < 0 && verbose != 0 )\n        mbedtls_printf( \"Unexpected error, return code = %08X\\n\", ret );\n\n    mbedtls_ecp_group_free( &grp );\n    mbedtls_ecp_point_free( &R );\n    mbedtls_ecp_point_free( &P );\n    mbedtls_mpi_free( &m );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* !MBEDTLS_ECP_ALT */\n\n#endif /* MBEDTLS_ECP_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ecp_curves.c",
    "content": "/*\n *  Elliptic curves over GF(p): curve-specific data and functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n\n#include \"mbedtls/ecp.h\"\n\n#include <string.h>\n\n#if !defined(MBEDTLS_ECP_ALT)\n\n#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \\\n    !defined(inline) && !defined(__cplusplus)\n#define inline __inline\n#endif\n\n/*\n * Conversion macros for embedded constants:\n * build lists of mbedtls_mpi_uint's from lists of unsigned char's grouped by 8, 4 or 2\n */\n#if defined(MBEDTLS_HAVE_INT32)\n\n#define BYTES_TO_T_UINT_4( a, b, c, d )             \\\n    ( (mbedtls_mpi_uint) a <<  0 ) |                          \\\n    ( (mbedtls_mpi_uint) b <<  8 ) |                          \\\n    ( (mbedtls_mpi_uint) c << 16 ) |                          \\\n    ( (mbedtls_mpi_uint) d << 24 )\n\n#define BYTES_TO_T_UINT_2( a, b )                   \\\n    BYTES_TO_T_UINT_4( a, b, 0, 0 )\n\n#define BYTES_TO_T_UINT_8( a, b, c, d, e, f, g, h ) \\\n    BYTES_TO_T_UINT_4( a, b, c, d ),                \\\n    BYTES_TO_T_UINT_4( e, f, g, h )\n\n#else /* 64-bits */\n\n#define BYTES_TO_T_UINT_8( a, b, c, d, e, f, g, h ) \\\n    ( (mbedtls_mpi_uint) a <<  0 ) |                          \\\n    ( (mbedtls_mpi_uint) b <<  8 ) |                          \\\n    ( (mbedtls_mpi_uint) c << 16 ) |                          \\\n    ( (mbedtls_mpi_uint) d << 24 ) |                          \\\n    ( (mbedtls_mpi_uint) e << 32 ) |                          \\\n    ( (mbedtls_mpi_uint) f << 40 ) |                          \\\n    ( (mbedtls_mpi_uint) g << 48 ) |                          \\\n    ( (mbedtls_mpi_uint) h << 56 )\n\n#define BYTES_TO_T_UINT_4( a, b, c, d )             \\\n    BYTES_TO_T_UINT_8( a, b, c, d, 0, 0, 0, 0 )\n\n#define BYTES_TO_T_UINT_2( a, b )                   \\\n    BYTES_TO_T_UINT_8( a, b, 0, 0, 0, 0, 0, 0 )\n\n#endif /* bits in mbedtls_mpi_uint */\n\n/*\n * Note: the constants are in little-endian order\n * to be directly usable in MPIs\n */\n\n/*\n * Domain parameters for secp192r1\n */\n#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)\nstatic const mbedtls_mpi_uint secp192r1_p[] = {\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n};\nstatic const mbedtls_mpi_uint secp192r1_b[] = {\n    BYTES_TO_T_UINT_8( 0xB1, 0xB9, 0x46, 0xC1, 0xEC, 0xDE, 0xB8, 0xFE ),\n    BYTES_TO_T_UINT_8( 0x49, 0x30, 0x24, 0x72, 0xAB, 0xE9, 0xA7, 0x0F ),\n    BYTES_TO_T_UINT_8( 0xE7, 0x80, 0x9C, 0xE5, 0x19, 0x05, 0x21, 0x64 ),\n};\nstatic const mbedtls_mpi_uint secp192r1_gx[] = {\n    BYTES_TO_T_UINT_8( 0x12, 0x10, 0xFF, 0x82, 0xFD, 0x0A, 0xFF, 0xF4 ),\n    BYTES_TO_T_UINT_8( 0x00, 0x88, 0xA1, 0x43, 0xEB, 0x20, 0xBF, 0x7C ),\n    BYTES_TO_T_UINT_8( 0xF6, 0x90, 0x30, 0xB0, 0x0E, 0xA8, 0x8D, 0x18 ),\n};\nstatic const mbedtls_mpi_uint secp192r1_gy[] = {\n    BYTES_TO_T_UINT_8( 0x11, 0x48, 0x79, 0x1E, 0xA1, 0x77, 0xF9, 0x73 ),\n    BYTES_TO_T_UINT_8( 0xD5, 0xCD, 0x24, 0x6B, 0xED, 0x11, 0x10, 0x63 ),\n    BYTES_TO_T_UINT_8( 0x78, 0xDA, 0xC8, 0xFF, 0x95, 0x2B, 0x19, 0x07 ),\n};\nstatic const mbedtls_mpi_uint secp192r1_n[] = {\n    BYTES_TO_T_UINT_8( 0x31, 0x28, 0xD2, 0xB4, 0xB1, 0xC9, 0x6B, 0x14 ),\n    BYTES_TO_T_UINT_8( 0x36, 0xF8, 0xDE, 0x99, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n};\n#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */\n\n/*\n * Domain parameters for secp224r1\n */\n#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)\nstatic const mbedtls_mpi_uint secp224r1_p[] = {\n    BYTES_TO_T_UINT_8( 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ),\n    BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ),\n};\nstatic const mbedtls_mpi_uint secp224r1_b[] = {\n    BYTES_TO_T_UINT_8( 0xB4, 0xFF, 0x55, 0x23, 0x43, 0x39, 0x0B, 0x27 ),\n    BYTES_TO_T_UINT_8( 0xBA, 0xD8, 0xBF, 0xD7, 0xB7, 0xB0, 0x44, 0x50 ),\n    BYTES_TO_T_UINT_8( 0x56, 0x32, 0x41, 0xF5, 0xAB, 0xB3, 0x04, 0x0C ),\n    BYTES_TO_T_UINT_4( 0x85, 0x0A, 0x05, 0xB4 ),\n};\nstatic const mbedtls_mpi_uint secp224r1_gx[] = {\n    BYTES_TO_T_UINT_8( 0x21, 0x1D, 0x5C, 0x11, 0xD6, 0x80, 0x32, 0x34 ),\n    BYTES_TO_T_UINT_8( 0x22, 0x11, 0xC2, 0x56, 0xD3, 0xC1, 0x03, 0x4A ),\n    BYTES_TO_T_UINT_8( 0xB9, 0x90, 0x13, 0x32, 0x7F, 0xBF, 0xB4, 0x6B ),\n    BYTES_TO_T_UINT_4( 0xBD, 0x0C, 0x0E, 0xB7 ),\n};\nstatic const mbedtls_mpi_uint secp224r1_gy[] = {\n    BYTES_TO_T_UINT_8( 0x34, 0x7E, 0x00, 0x85, 0x99, 0x81, 0xD5, 0x44 ),\n    BYTES_TO_T_UINT_8( 0x64, 0x47, 0x07, 0x5A, 0xA0, 0x75, 0x43, 0xCD ),\n    BYTES_TO_T_UINT_8( 0xE6, 0xDF, 0x22, 0x4C, 0xFB, 0x23, 0xF7, 0xB5 ),\n    BYTES_TO_T_UINT_4( 0x88, 0x63, 0x37, 0xBD ),\n};\nstatic const mbedtls_mpi_uint secp224r1_n[] = {\n    BYTES_TO_T_UINT_8( 0x3D, 0x2A, 0x5C, 0x5C, 0x45, 0x29, 0xDD, 0x13 ),\n    BYTES_TO_T_UINT_8( 0x3E, 0xF0, 0xB8, 0xE0, 0xA2, 0x16, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_4( 0xFF, 0xFF, 0xFF, 0xFF ),\n};\n#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */\n\n/*\n * Domain parameters for secp256r1\n */\n#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)\nstatic const mbedtls_mpi_uint secp256r1_p[] = {\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ),\n    BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ),\n    BYTES_TO_T_UINT_8( 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ),\n};\nstatic const mbedtls_mpi_uint secp256r1_b[] = {\n    BYTES_TO_T_UINT_8( 0x4B, 0x60, 0xD2, 0x27, 0x3E, 0x3C, 0xCE, 0x3B ),\n    BYTES_TO_T_UINT_8( 0xF6, 0xB0, 0x53, 0xCC, 0xB0, 0x06, 0x1D, 0x65 ),\n    BYTES_TO_T_UINT_8( 0xBC, 0x86, 0x98, 0x76, 0x55, 0xBD, 0xEB, 0xB3 ),\n    BYTES_TO_T_UINT_8( 0xE7, 0x93, 0x3A, 0xAA, 0xD8, 0x35, 0xC6, 0x5A ),\n};\nstatic const mbedtls_mpi_uint secp256r1_gx[] = {\n    BYTES_TO_T_UINT_8( 0x96, 0xC2, 0x98, 0xD8, 0x45, 0x39, 0xA1, 0xF4 ),\n    BYTES_TO_T_UINT_8( 0xA0, 0x33, 0xEB, 0x2D, 0x81, 0x7D, 0x03, 0x77 ),\n    BYTES_TO_T_UINT_8( 0xF2, 0x40, 0xA4, 0x63, 0xE5, 0xE6, 0xBC, 0xF8 ),\n    BYTES_TO_T_UINT_8( 0x47, 0x42, 0x2C, 0xE1, 0xF2, 0xD1, 0x17, 0x6B ),\n};\nstatic const mbedtls_mpi_uint secp256r1_gy[] = {\n    BYTES_TO_T_UINT_8( 0xF5, 0x51, 0xBF, 0x37, 0x68, 0x40, 0xB6, 0xCB ),\n    BYTES_TO_T_UINT_8( 0xCE, 0x5E, 0x31, 0x6B, 0x57, 0x33, 0xCE, 0x2B ),\n    BYTES_TO_T_UINT_8( 0x16, 0x9E, 0x0F, 0x7C, 0x4A, 0xEB, 0xE7, 0x8E ),\n    BYTES_TO_T_UINT_8( 0x9B, 0x7F, 0x1A, 0xFE, 0xE2, 0x42, 0xE3, 0x4F ),\n};\nstatic const mbedtls_mpi_uint secp256r1_n[] = {\n    BYTES_TO_T_UINT_8( 0x51, 0x25, 0x63, 0xFC, 0xC2, 0xCA, 0xB9, 0xF3 ),\n    BYTES_TO_T_UINT_8( 0x84, 0x9E, 0x17, 0xA7, 0xAD, 0xFA, 0xE6, 0xBC ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ),\n};\n#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */\n\n/*\n * Domain parameters for secp384r1\n */\n#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)\nstatic const mbedtls_mpi_uint secp384r1_p[] = {\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 ),\n    BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n};\nstatic const mbedtls_mpi_uint secp384r1_b[] = {\n    BYTES_TO_T_UINT_8( 0xEF, 0x2A, 0xEC, 0xD3, 0xED, 0xC8, 0x85, 0x2A ),\n    BYTES_TO_T_UINT_8( 0x9D, 0xD1, 0x2E, 0x8A, 0x8D, 0x39, 0x56, 0xC6 ),\n    BYTES_TO_T_UINT_8( 0x5A, 0x87, 0x13, 0x50, 0x8F, 0x08, 0x14, 0x03 ),\n    BYTES_TO_T_UINT_8( 0x12, 0x41, 0x81, 0xFE, 0x6E, 0x9C, 0x1D, 0x18 ),\n    BYTES_TO_T_UINT_8( 0x19, 0x2D, 0xF8, 0xE3, 0x6B, 0x05, 0x8E, 0x98 ),\n    BYTES_TO_T_UINT_8( 0xE4, 0xE7, 0x3E, 0xE2, 0xA7, 0x2F, 0x31, 0xB3 ),\n};\nstatic const mbedtls_mpi_uint secp384r1_gx[] = {\n    BYTES_TO_T_UINT_8( 0xB7, 0x0A, 0x76, 0x72, 0x38, 0x5E, 0x54, 0x3A ),\n    BYTES_TO_T_UINT_8( 0x6C, 0x29, 0x55, 0xBF, 0x5D, 0xF2, 0x02, 0x55 ),\n    BYTES_TO_T_UINT_8( 0x38, 0x2A, 0x54, 0x82, 0xE0, 0x41, 0xF7, 0x59 ),\n    BYTES_TO_T_UINT_8( 0x98, 0x9B, 0xA7, 0x8B, 0x62, 0x3B, 0x1D, 0x6E ),\n    BYTES_TO_T_UINT_8( 0x74, 0xAD, 0x20, 0xF3, 0x1E, 0xC7, 0xB1, 0x8E ),\n    BYTES_TO_T_UINT_8( 0x37, 0x05, 0x8B, 0xBE, 0x22, 0xCA, 0x87, 0xAA ),\n};\nstatic const mbedtls_mpi_uint secp384r1_gy[] = {\n    BYTES_TO_T_UINT_8( 0x5F, 0x0E, 0xEA, 0x90, 0x7C, 0x1D, 0x43, 0x7A ),\n    BYTES_TO_T_UINT_8( 0x9D, 0x81, 0x7E, 0x1D, 0xCE, 0xB1, 0x60, 0x0A ),\n    BYTES_TO_T_UINT_8( 0xC0, 0xB8, 0xF0, 0xB5, 0x13, 0x31, 0xDA, 0xE9 ),\n    BYTES_TO_T_UINT_8( 0x7C, 0x14, 0x9A, 0x28, 0xBD, 0x1D, 0xF4, 0xF8 ),\n    BYTES_TO_T_UINT_8( 0x29, 0xDC, 0x92, 0x92, 0xBF, 0x98, 0x9E, 0x5D ),\n    BYTES_TO_T_UINT_8( 0x6F, 0x2C, 0x26, 0x96, 0x4A, 0xDE, 0x17, 0x36 ),\n};\nstatic const mbedtls_mpi_uint secp384r1_n[] = {\n    BYTES_TO_T_UINT_8( 0x73, 0x29, 0xC5, 0xCC, 0x6A, 0x19, 0xEC, 0xEC ),\n    BYTES_TO_T_UINT_8( 0x7A, 0xA7, 0xB0, 0x48, 0xB2, 0x0D, 0x1A, 0x58 ),\n    BYTES_TO_T_UINT_8( 0xDF, 0x2D, 0x37, 0xF4, 0x81, 0x4D, 0x63, 0xC7 ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n};\n#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */\n\n/*\n * Domain parameters for secp521r1\n */\n#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)\nstatic const mbedtls_mpi_uint secp521r1_p[] = {\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_2( 0xFF, 0x01 ),\n};\nstatic const mbedtls_mpi_uint secp521r1_b[] = {\n    BYTES_TO_T_UINT_8( 0x00, 0x3F, 0x50, 0x6B, 0xD4, 0x1F, 0x45, 0xEF ),\n    BYTES_TO_T_UINT_8( 0xF1, 0x34, 0x2C, 0x3D, 0x88, 0xDF, 0x73, 0x35 ),\n    BYTES_TO_T_UINT_8( 0x07, 0xBF, 0xB1, 0x3B, 0xBD, 0xC0, 0x52, 0x16 ),\n    BYTES_TO_T_UINT_8( 0x7B, 0x93, 0x7E, 0xEC, 0x51, 0x39, 0x19, 0x56 ),\n    BYTES_TO_T_UINT_8( 0xE1, 0x09, 0xF1, 0x8E, 0x91, 0x89, 0xB4, 0xB8 ),\n    BYTES_TO_T_UINT_8( 0xF3, 0x15, 0xB3, 0x99, 0x5B, 0x72, 0xDA, 0xA2 ),\n    BYTES_TO_T_UINT_8( 0xEE, 0x40, 0x85, 0xB6, 0xA0, 0x21, 0x9A, 0x92 ),\n    BYTES_TO_T_UINT_8( 0x1F, 0x9A, 0x1C, 0x8E, 0x61, 0xB9, 0x3E, 0x95 ),\n    BYTES_TO_T_UINT_2( 0x51, 0x00 ),\n};\nstatic const mbedtls_mpi_uint secp521r1_gx[] = {\n    BYTES_TO_T_UINT_8( 0x66, 0xBD, 0xE5, 0xC2, 0x31, 0x7E, 0x7E, 0xF9 ),\n    BYTES_TO_T_UINT_8( 0x9B, 0x42, 0x6A, 0x85, 0xC1, 0xB3, 0x48, 0x33 ),\n    BYTES_TO_T_UINT_8( 0xDE, 0xA8, 0xFF, 0xA2, 0x27, 0xC1, 0x1D, 0xFE ),\n    BYTES_TO_T_UINT_8( 0x28, 0x59, 0xE7, 0xEF, 0x77, 0x5E, 0x4B, 0xA1 ),\n    BYTES_TO_T_UINT_8( 0xBA, 0x3D, 0x4D, 0x6B, 0x60, 0xAF, 0x28, 0xF8 ),\n    BYTES_TO_T_UINT_8( 0x21, 0xB5, 0x3F, 0x05, 0x39, 0x81, 0x64, 0x9C ),\n    BYTES_TO_T_UINT_8( 0x42, 0xB4, 0x95, 0x23, 0x66, 0xCB, 0x3E, 0x9E ),\n    BYTES_TO_T_UINT_8( 0xCD, 0xE9, 0x04, 0x04, 0xB7, 0x06, 0x8E, 0x85 ),\n    BYTES_TO_T_UINT_2( 0xC6, 0x00 ),\n};\nstatic const mbedtls_mpi_uint secp521r1_gy[] = {\n    BYTES_TO_T_UINT_8( 0x50, 0x66, 0xD1, 0x9F, 0x76, 0x94, 0xBE, 0x88 ),\n    BYTES_TO_T_UINT_8( 0x40, 0xC2, 0x72, 0xA2, 0x86, 0x70, 0x3C, 0x35 ),\n    BYTES_TO_T_UINT_8( 0x61, 0x07, 0xAD, 0x3F, 0x01, 0xB9, 0x50, 0xC5 ),\n    BYTES_TO_T_UINT_8( 0x40, 0x26, 0xF4, 0x5E, 0x99, 0x72, 0xEE, 0x97 ),\n    BYTES_TO_T_UINT_8( 0x2C, 0x66, 0x3E, 0x27, 0x17, 0xBD, 0xAF, 0x17 ),\n    BYTES_TO_T_UINT_8( 0x68, 0x44, 0x9B, 0x57, 0x49, 0x44, 0xF5, 0x98 ),\n    BYTES_TO_T_UINT_8( 0xD9, 0x1B, 0x7D, 0x2C, 0xB4, 0x5F, 0x8A, 0x5C ),\n    BYTES_TO_T_UINT_8( 0x04, 0xC0, 0x3B, 0x9A, 0x78, 0x6A, 0x29, 0x39 ),\n    BYTES_TO_T_UINT_2( 0x18, 0x01 ),\n};\nstatic const mbedtls_mpi_uint secp521r1_n[] = {\n    BYTES_TO_T_UINT_8( 0x09, 0x64, 0x38, 0x91, 0x1E, 0xB7, 0x6F, 0xBB ),\n    BYTES_TO_T_UINT_8( 0xAE, 0x47, 0x9C, 0x89, 0xB8, 0xC9, 0xB5, 0x3B ),\n    BYTES_TO_T_UINT_8( 0xD0, 0xA5, 0x09, 0xF7, 0x48, 0x01, 0xCC, 0x7F ),\n    BYTES_TO_T_UINT_8( 0x6B, 0x96, 0x2F, 0xBF, 0x83, 0x87, 0x86, 0x51 ),\n    BYTES_TO_T_UINT_8( 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_2( 0xFF, 0x01 ),\n};\n#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)\nstatic const mbedtls_mpi_uint secp192k1_p[] = {\n    BYTES_TO_T_UINT_8( 0x37, 0xEE, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n};\nstatic const mbedtls_mpi_uint secp192k1_a[] = {\n    BYTES_TO_T_UINT_2( 0x00, 0x00 ),\n};\nstatic const mbedtls_mpi_uint secp192k1_b[] = {\n    BYTES_TO_T_UINT_2( 0x03, 0x00 ),\n};\nstatic const mbedtls_mpi_uint secp192k1_gx[] = {\n    BYTES_TO_T_UINT_8( 0x7D, 0x6C, 0xE0, 0xEA, 0xB1, 0xD1, 0xA5, 0x1D ),\n    BYTES_TO_T_UINT_8( 0x34, 0xF4, 0xB7, 0x80, 0x02, 0x7D, 0xB0, 0x26 ),\n    BYTES_TO_T_UINT_8( 0xAE, 0xE9, 0x57, 0xC0, 0x0E, 0xF1, 0x4F, 0xDB ),\n};\nstatic const mbedtls_mpi_uint secp192k1_gy[] = {\n    BYTES_TO_T_UINT_8( 0x9D, 0x2F, 0x5E, 0xD9, 0x88, 0xAA, 0x82, 0x40 ),\n    BYTES_TO_T_UINT_8( 0x34, 0x86, 0xBE, 0x15, 0xD0, 0x63, 0x41, 0x84 ),\n    BYTES_TO_T_UINT_8( 0xA7, 0x28, 0x56, 0x9C, 0x6D, 0x2F, 0x2F, 0x9B ),\n};\nstatic const mbedtls_mpi_uint secp192k1_n[] = {\n    BYTES_TO_T_UINT_8( 0x8D, 0xFD, 0xDE, 0x74, 0x6A, 0x46, 0x69, 0x0F ),\n    BYTES_TO_T_UINT_8( 0x17, 0xFC, 0xF2, 0x26, 0xFE, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n};\n#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)\nstatic const mbedtls_mpi_uint secp224k1_p[] = {\n    BYTES_TO_T_UINT_8( 0x6D, 0xE5, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_4( 0xFF, 0xFF, 0xFF, 0xFF ),\n};\nstatic const mbedtls_mpi_uint secp224k1_a[] = {\n    BYTES_TO_T_UINT_2( 0x00, 0x00 ),\n};\nstatic const mbedtls_mpi_uint secp224k1_b[] = {\n    BYTES_TO_T_UINT_2( 0x05, 0x00 ),\n};\nstatic const mbedtls_mpi_uint secp224k1_gx[] = {\n    BYTES_TO_T_UINT_8( 0x5C, 0xA4, 0xB7, 0xB6, 0x0E, 0x65, 0x7E, 0x0F ),\n    BYTES_TO_T_UINT_8( 0xA9, 0x75, 0x70, 0xE4, 0xE9, 0x67, 0xA4, 0x69 ),\n    BYTES_TO_T_UINT_8( 0xA1, 0x28, 0xFC, 0x30, 0xDF, 0x99, 0xF0, 0x4D ),\n    BYTES_TO_T_UINT_4( 0x33, 0x5B, 0x45, 0xA1 ),\n};\nstatic const mbedtls_mpi_uint secp224k1_gy[] = {\n    BYTES_TO_T_UINT_8( 0xA5, 0x61, 0x6D, 0x55, 0xDB, 0x4B, 0xCA, 0xE2 ),\n    BYTES_TO_T_UINT_8( 0x59, 0xBD, 0xB0, 0xC0, 0xF7, 0x19, 0xE3, 0xF7 ),\n    BYTES_TO_T_UINT_8( 0xD6, 0xFB, 0xCA, 0x82, 0x42, 0x34, 0xBA, 0x7F ),\n    BYTES_TO_T_UINT_4( 0xED, 0x9F, 0x08, 0x7E ),\n};\nstatic const mbedtls_mpi_uint secp224k1_n[] = {\n    BYTES_TO_T_UINT_8( 0xF7, 0xB1, 0x9F, 0x76, 0x71, 0xA9, 0xF0, 0xCA ),\n    BYTES_TO_T_UINT_8( 0x84, 0x61, 0xEC, 0xD2, 0xE8, 0xDC, 0x01, 0x00 ),\n    BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ),\n    BYTES_TO_T_UINT_8( 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ),\n};\n#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)\nstatic const mbedtls_mpi_uint secp256k1_p[] = {\n    BYTES_TO_T_UINT_8( 0x2F, 0xFC, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n};\nstatic const mbedtls_mpi_uint secp256k1_a[] = {\n    BYTES_TO_T_UINT_2( 0x00, 0x00 ),\n};\nstatic const mbedtls_mpi_uint secp256k1_b[] = {\n    BYTES_TO_T_UINT_2( 0x07, 0x00 ),\n};\nstatic const mbedtls_mpi_uint secp256k1_gx[] = {\n    BYTES_TO_T_UINT_8( 0x98, 0x17, 0xF8, 0x16, 0x5B, 0x81, 0xF2, 0x59 ),\n    BYTES_TO_T_UINT_8( 0xD9, 0x28, 0xCE, 0x2D, 0xDB, 0xFC, 0x9B, 0x02 ),\n    BYTES_TO_T_UINT_8( 0x07, 0x0B, 0x87, 0xCE, 0x95, 0x62, 0xA0, 0x55 ),\n    BYTES_TO_T_UINT_8( 0xAC, 0xBB, 0xDC, 0xF9, 0x7E, 0x66, 0xBE, 0x79 ),\n};\nstatic const mbedtls_mpi_uint secp256k1_gy[] = {\n    BYTES_TO_T_UINT_8( 0xB8, 0xD4, 0x10, 0xFB, 0x8F, 0xD0, 0x47, 0x9C ),\n    BYTES_TO_T_UINT_8( 0x19, 0x54, 0x85, 0xA6, 0x48, 0xB4, 0x17, 0xFD ),\n    BYTES_TO_T_UINT_8( 0xA8, 0x08, 0x11, 0x0E, 0xFC, 0xFB, 0xA4, 0x5D ),\n    BYTES_TO_T_UINT_8( 0x65, 0xC4, 0xA3, 0x26, 0x77, 0xDA, 0x3A, 0x48 ),\n};\nstatic const mbedtls_mpi_uint secp256k1_n[] = {\n    BYTES_TO_T_UINT_8( 0x41, 0x41, 0x36, 0xD0, 0x8C, 0x5E, 0xD2, 0xBF ),\n    BYTES_TO_T_UINT_8( 0x3B, 0xA0, 0x48, 0xAF, 0xE6, 0xDC, 0xAE, 0xBA ),\n    BYTES_TO_T_UINT_8( 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n    BYTES_TO_T_UINT_8( 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF ),\n};\n#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */\n\n/*\n * Domain parameters for brainpoolP256r1 (RFC 5639 3.4)\n */\n#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)\nstatic const mbedtls_mpi_uint brainpoolP256r1_p[] = {\n    BYTES_TO_T_UINT_8( 0x77, 0x53, 0x6E, 0x1F, 0x1D, 0x48, 0x13, 0x20 ),\n    BYTES_TO_T_UINT_8( 0x28, 0x20, 0x26, 0xD5, 0x23, 0xF6, 0x3B, 0x6E ),\n    BYTES_TO_T_UINT_8( 0x72, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E ),\n    BYTES_TO_T_UINT_8( 0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9 ),\n};\nstatic const mbedtls_mpi_uint brainpoolP256r1_a[] = {\n    BYTES_TO_T_UINT_8( 0xD9, 0xB5, 0x30, 0xF3, 0x44, 0x4B, 0x4A, 0xE9 ),\n    BYTES_TO_T_UINT_8( 0x6C, 0x5C, 0xDC, 0x26, 0xC1, 0x55, 0x80, 0xFB ),\n    BYTES_TO_T_UINT_8( 0xE7, 0xFF, 0x7A, 0x41, 0x30, 0x75, 0xF6, 0xEE ),\n    BYTES_TO_T_UINT_8( 0x57, 0x30, 0x2C, 0xFC, 0x75, 0x09, 0x5A, 0x7D ),\n};\nstatic const mbedtls_mpi_uint brainpoolP256r1_b[] = {\n    BYTES_TO_T_UINT_8( 0xB6, 0x07, 0x8C, 0xFF, 0x18, 0xDC, 0xCC, 0x6B ),\n    BYTES_TO_T_UINT_8( 0xCE, 0xE1, 0xF7, 0x5C, 0x29, 0x16, 0x84, 0x95 ),\n    BYTES_TO_T_UINT_8( 0xBF, 0x7C, 0xD7, 0xBB, 0xD9, 0xB5, 0x30, 0xF3 ),\n    BYTES_TO_T_UINT_8( 0x44, 0x4B, 0x4A, 0xE9, 0x6C, 0x5C, 0xDC, 0x26 ),\n};\nstatic const mbedtls_mpi_uint brainpoolP256r1_gx[] = {\n    BYTES_TO_T_UINT_8( 0x62, 0x32, 0xCE, 0x9A, 0xBD, 0x53, 0x44, 0x3A ),\n    BYTES_TO_T_UINT_8( 0xC2, 0x23, 0xBD, 0xE3, 0xE1, 0x27, 0xDE, 0xB9 ),\n    BYTES_TO_T_UINT_8( 0xAF, 0xB7, 0x81, 0xFC, 0x2F, 0x48, 0x4B, 0x2C ),\n    BYTES_TO_T_UINT_8( 0xCB, 0x57, 0x7E, 0xCB, 0xB9, 0xAE, 0xD2, 0x8B ),\n};\nstatic const mbedtls_mpi_uint brainpoolP256r1_gy[] = {\n    BYTES_TO_T_UINT_8( 0x97, 0x69, 0x04, 0x2F, 0xC7, 0x54, 0x1D, 0x5C ),\n    BYTES_TO_T_UINT_8( 0x54, 0x8E, 0xED, 0x2D, 0x13, 0x45, 0x77, 0xC2 ),\n    BYTES_TO_T_UINT_8( 0xC9, 0x1D, 0x61, 0x14, 0x1A, 0x46, 0xF8, 0x97 ),\n    BYTES_TO_T_UINT_8( 0xFD, 0xC4, 0xDA, 0xC3, 0x35, 0xF8, 0x7E, 0x54 ),\n};\nstatic const mbedtls_mpi_uint brainpoolP256r1_n[] = {\n    BYTES_TO_T_UINT_8( 0xA7, 0x56, 0x48, 0x97, 0x82, 0x0E, 0x1E, 0x90 ),\n    BYTES_TO_T_UINT_8( 0xF7, 0xA6, 0x61, 0xB5, 0xA3, 0x7A, 0x39, 0x8C ),\n    BYTES_TO_T_UINT_8( 0x71, 0x8D, 0x83, 0x9D, 0x90, 0x0A, 0x66, 0x3E ),\n    BYTES_TO_T_UINT_8( 0xBC, 0xA9, 0xEE, 0xA1, 0xDB, 0x57, 0xFB, 0xA9 ),\n};\n#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */\n\n/*\n * Domain parameters for brainpoolP384r1 (RFC 5639 3.6)\n */\n#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)\nstatic const mbedtls_mpi_uint brainpoolP384r1_p[] = {\n    BYTES_TO_T_UINT_8( 0x53, 0xEC, 0x07, 0x31, 0x13, 0x00, 0x47, 0x87 ),\n    BYTES_TO_T_UINT_8( 0x71, 0x1A, 0x1D, 0x90, 0x29, 0xA7, 0xD3, 0xAC ),\n    BYTES_TO_T_UINT_8( 0x23, 0x11, 0xB7, 0x7F, 0x19, 0xDA, 0xB1, 0x12 ),\n    BYTES_TO_T_UINT_8( 0xB4, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15 ),\n    BYTES_TO_T_UINT_8( 0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F ),\n    BYTES_TO_T_UINT_8( 0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C ),\n};\nstatic const mbedtls_mpi_uint brainpoolP384r1_a[] = {\n    BYTES_TO_T_UINT_8( 0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04 ),\n    BYTES_TO_T_UINT_8( 0xEB, 0xD4, 0x3A, 0x50, 0x4A, 0x81, 0xA5, 0x8A ),\n    BYTES_TO_T_UINT_8( 0x0F, 0xF9, 0x91, 0xBA, 0xEF, 0x65, 0x91, 0x13 ),\n    BYTES_TO_T_UINT_8( 0x87, 0x27, 0xB2, 0x4F, 0x8E, 0xA2, 0xBE, 0xC2 ),\n    BYTES_TO_T_UINT_8( 0xA0, 0xAF, 0x05, 0xCE, 0x0A, 0x08, 0x72, 0x3C ),\n    BYTES_TO_T_UINT_8( 0x0C, 0x15, 0x8C, 0x3D, 0xC6, 0x82, 0xC3, 0x7B ),\n};\nstatic const mbedtls_mpi_uint brainpoolP384r1_b[] = {\n    BYTES_TO_T_UINT_8( 0x11, 0x4C, 0x50, 0xFA, 0x96, 0x86, 0xB7, 0x3A ),\n    BYTES_TO_T_UINT_8( 0x94, 0xC9, 0xDB, 0x95, 0x02, 0x39, 0xB4, 0x7C ),\n    BYTES_TO_T_UINT_8( 0xD5, 0x62, 0xEB, 0x3E, 0xA5, 0x0E, 0x88, 0x2E ),\n    BYTES_TO_T_UINT_8( 0xA6, 0xD2, 0xDC, 0x07, 0xE1, 0x7D, 0xB7, 0x2F ),\n    BYTES_TO_T_UINT_8( 0x7C, 0x44, 0xF0, 0x16, 0x54, 0xB5, 0x39, 0x8B ),\n    BYTES_TO_T_UINT_8( 0x26, 0x28, 0xCE, 0x22, 0xDD, 0xC7, 0xA8, 0x04 ),\n};\nstatic const mbedtls_mpi_uint brainpoolP384r1_gx[] = {\n    BYTES_TO_T_UINT_8( 0x1E, 0xAF, 0xD4, 0x47, 0xE2, 0xB2, 0x87, 0xEF ),\n    BYTES_TO_T_UINT_8( 0xAA, 0x46, 0xD6, 0x36, 0x34, 0xE0, 0x26, 0xE8 ),\n    BYTES_TO_T_UINT_8( 0xE8, 0x10, 0xBD, 0x0C, 0xFE, 0xCA, 0x7F, 0xDB ),\n    BYTES_TO_T_UINT_8( 0xE3, 0x4F, 0xF1, 0x7E, 0xE7, 0xA3, 0x47, 0x88 ),\n    BYTES_TO_T_UINT_8( 0x6B, 0x3F, 0xC1, 0xB7, 0x81, 0x3A, 0xA6, 0xA2 ),\n    BYTES_TO_T_UINT_8( 0xFF, 0x45, 0xCF, 0x68, 0xF0, 0x64, 0x1C, 0x1D ),\n};\nstatic const mbedtls_mpi_uint brainpoolP384r1_gy[] = {\n    BYTES_TO_T_UINT_8( 0x15, 0x53, 0x3C, 0x26, 0x41, 0x03, 0x82, 0x42 ),\n    BYTES_TO_T_UINT_8( 0x11, 0x81, 0x91, 0x77, 0x21, 0x46, 0x46, 0x0E ),\n    BYTES_TO_T_UINT_8( 0x28, 0x29, 0x91, 0xF9, 0x4F, 0x05, 0x9C, 0xE1 ),\n    BYTES_TO_T_UINT_8( 0x64, 0x58, 0xEC, 0xFE, 0x29, 0x0B, 0xB7, 0x62 ),\n    BYTES_TO_T_UINT_8( 0x52, 0xD5, 0xCF, 0x95, 0x8E, 0xEB, 0xB1, 0x5C ),\n    BYTES_TO_T_UINT_8( 0xA4, 0xC2, 0xF9, 0x20, 0x75, 0x1D, 0xBE, 0x8A ),\n};\nstatic const mbedtls_mpi_uint brainpoolP384r1_n[] = {\n    BYTES_TO_T_UINT_8( 0x65, 0x65, 0x04, 0xE9, 0x02, 0x32, 0x88, 0x3B ),\n    BYTES_TO_T_UINT_8( 0x10, 0xC3, 0x7F, 0x6B, 0xAF, 0xB6, 0x3A, 0xCF ),\n    BYTES_TO_T_UINT_8( 0xA7, 0x25, 0x04, 0xAC, 0x6C, 0x6E, 0x16, 0x1F ),\n    BYTES_TO_T_UINT_8( 0xB3, 0x56, 0x54, 0xED, 0x09, 0x71, 0x2F, 0x15 ),\n    BYTES_TO_T_UINT_8( 0xDF, 0x41, 0xE6, 0x50, 0x7E, 0x6F, 0x5D, 0x0F ),\n    BYTES_TO_T_UINT_8( 0x28, 0x6D, 0x38, 0xA3, 0x82, 0x1E, 0xB9, 0x8C ),\n};\n#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */\n\n/*\n * Domain parameters for brainpoolP512r1 (RFC 5639 3.7)\n */\n#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)\nstatic const mbedtls_mpi_uint brainpoolP512r1_p[] = {\n    BYTES_TO_T_UINT_8( 0xF3, 0x48, 0x3A, 0x58, 0x56, 0x60, 0xAA, 0x28 ),\n    BYTES_TO_T_UINT_8( 0x85, 0xC6, 0x82, 0x2D, 0x2F, 0xFF, 0x81, 0x28 ),\n    BYTES_TO_T_UINT_8( 0xE6, 0x80, 0xA3, 0xE6, 0x2A, 0xA1, 0xCD, 0xAE ),\n    BYTES_TO_T_UINT_8( 0x42, 0x68, 0xC6, 0x9B, 0x00, 0x9B, 0x4D, 0x7D ),\n    BYTES_TO_T_UINT_8( 0x71, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6 ),\n    BYTES_TO_T_UINT_8( 0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB ),\n    BYTES_TO_T_UINT_8( 0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F ),\n    BYTES_TO_T_UINT_8( 0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA ),\n};\nstatic const mbedtls_mpi_uint brainpoolP512r1_a[] = {\n    BYTES_TO_T_UINT_8( 0xCA, 0x94, 0xFC, 0x77, 0x4D, 0xAC, 0xC1, 0xE7 ),\n    BYTES_TO_T_UINT_8( 0xB9, 0xC7, 0xF2, 0x2B, 0xA7, 0x17, 0x11, 0x7F ),\n    BYTES_TO_T_UINT_8( 0xB5, 0xC8, 0x9A, 0x8B, 0xC9, 0xF1, 0x2E, 0x0A ),\n    BYTES_TO_T_UINT_8( 0xA1, 0x3A, 0x25, 0xA8, 0x5A, 0x5D, 0xED, 0x2D ),\n    BYTES_TO_T_UINT_8( 0xBC, 0x63, 0x98, 0xEA, 0xCA, 0x41, 0x34, 0xA8 ),\n    BYTES_TO_T_UINT_8( 0x10, 0x16, 0xF9, 0x3D, 0x8D, 0xDD, 0xCB, 0x94 ),\n    BYTES_TO_T_UINT_8( 0xC5, 0x4C, 0x23, 0xAC, 0x45, 0x71, 0x32, 0xE2 ),\n    BYTES_TO_T_UINT_8( 0x89, 0x3B, 0x60, 0x8B, 0x31, 0xA3, 0x30, 0x78 ),\n};\nstatic const mbedtls_mpi_uint brainpoolP512r1_b[] = {\n    BYTES_TO_T_UINT_8( 0x23, 0xF7, 0x16, 0x80, 0x63, 0xBD, 0x09, 0x28 ),\n    BYTES_TO_T_UINT_8( 0xDD, 0xE5, 0xBA, 0x5E, 0xB7, 0x50, 0x40, 0x98 ),\n    BYTES_TO_T_UINT_8( 0x67, 0x3E, 0x08, 0xDC, 0xCA, 0x94, 0xFC, 0x77 ),\n    BYTES_TO_T_UINT_8( 0x4D, 0xAC, 0xC1, 0xE7, 0xB9, 0xC7, 0xF2, 0x2B ),\n    BYTES_TO_T_UINT_8( 0xA7, 0x17, 0x11, 0x7F, 0xB5, 0xC8, 0x9A, 0x8B ),\n    BYTES_TO_T_UINT_8( 0xC9, 0xF1, 0x2E, 0x0A, 0xA1, 0x3A, 0x25, 0xA8 ),\n    BYTES_TO_T_UINT_8( 0x5A, 0x5D, 0xED, 0x2D, 0xBC, 0x63, 0x98, 0xEA ),\n    BYTES_TO_T_UINT_8( 0xCA, 0x41, 0x34, 0xA8, 0x10, 0x16, 0xF9, 0x3D ),\n};\nstatic const mbedtls_mpi_uint brainpoolP512r1_gx[] = {\n    BYTES_TO_T_UINT_8( 0x22, 0xF8, 0xB9, 0xBC, 0x09, 0x22, 0x35, 0x8B ),\n    BYTES_TO_T_UINT_8( 0x68, 0x5E, 0x6A, 0x40, 0x47, 0x50, 0x6D, 0x7C ),\n    BYTES_TO_T_UINT_8( 0x5F, 0x7D, 0xB9, 0x93, 0x7B, 0x68, 0xD1, 0x50 ),\n    BYTES_TO_T_UINT_8( 0x8D, 0xD4, 0xD0, 0xE2, 0x78, 0x1F, 0x3B, 0xFF ),\n    BYTES_TO_T_UINT_8( 0x8E, 0x09, 0xD0, 0xF4, 0xEE, 0x62, 0x3B, 0xB4 ),\n    BYTES_TO_T_UINT_8( 0xC1, 0x16, 0xD9, 0xB5, 0x70, 0x9F, 0xED, 0x85 ),\n    BYTES_TO_T_UINT_8( 0x93, 0x6A, 0x4C, 0x9C, 0x2E, 0x32, 0x21, 0x5A ),\n    BYTES_TO_T_UINT_8( 0x64, 0xD9, 0x2E, 0xD8, 0xBD, 0xE4, 0xAE, 0x81 ),\n};\nstatic const mbedtls_mpi_uint brainpoolP512r1_gy[] = {\n    BYTES_TO_T_UINT_8( 0x92, 0x08, 0xD8, 0x3A, 0x0F, 0x1E, 0xCD, 0x78 ),\n    BYTES_TO_T_UINT_8( 0x06, 0x54, 0xF0, 0xA8, 0x2F, 0x2B, 0xCA, 0xD1 ),\n    BYTES_TO_T_UINT_8( 0xAE, 0x63, 0x27, 0x8A, 0xD8, 0x4B, 0xCA, 0x5B ),\n    BYTES_TO_T_UINT_8( 0x5E, 0x48, 0x5F, 0x4A, 0x49, 0xDE, 0xDC, 0xB2 ),\n    BYTES_TO_T_UINT_8( 0x11, 0x81, 0x1F, 0x88, 0x5B, 0xC5, 0x00, 0xA0 ),\n    BYTES_TO_T_UINT_8( 0x1A, 0x7B, 0xA5, 0x24, 0x00, 0xF7, 0x09, 0xF2 ),\n    BYTES_TO_T_UINT_8( 0xFD, 0x22, 0x78, 0xCF, 0xA9, 0xBF, 0xEA, 0xC0 ),\n    BYTES_TO_T_UINT_8( 0xEC, 0x32, 0x63, 0x56, 0x5D, 0x38, 0xDE, 0x7D ),\n};\nstatic const mbedtls_mpi_uint brainpoolP512r1_n[] = {\n    BYTES_TO_T_UINT_8( 0x69, 0x00, 0xA9, 0x9C, 0x82, 0x96, 0x87, 0xB5 ),\n    BYTES_TO_T_UINT_8( 0xDD, 0xDA, 0x5D, 0x08, 0x81, 0xD3, 0xB1, 0x1D ),\n    BYTES_TO_T_UINT_8( 0x47, 0x10, 0xAC, 0x7F, 0x19, 0x61, 0x86, 0x41 ),\n    BYTES_TO_T_UINT_8( 0x19, 0x26, 0xA9, 0x4C, 0x41, 0x5C, 0x3E, 0x55 ),\n    BYTES_TO_T_UINT_8( 0x70, 0x08, 0x33, 0x70, 0xCA, 0x9C, 0x63, 0xD6 ),\n    BYTES_TO_T_UINT_8( 0x0E, 0xD2, 0xC9, 0xB3, 0xB3, 0x8D, 0x30, 0xCB ),\n    BYTES_TO_T_UINT_8( 0x07, 0xFC, 0xC9, 0x33, 0xAE, 0xE6, 0xD4, 0x3F ),\n    BYTES_TO_T_UINT_8( 0x8B, 0xC4, 0xE9, 0xDB, 0xB8, 0x9D, 0xDD, 0xAA ),\n};\n#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */\n\n/*\n * Create an MPI from embedded constants\n * (assumes len is an exact multiple of sizeof mbedtls_mpi_uint)\n */\nstatic inline void ecp_mpi_load( mbedtls_mpi *X, const mbedtls_mpi_uint *p, size_t len )\n{\n    X->s = 1;\n    X->n = len / sizeof( mbedtls_mpi_uint );\n    X->p = (mbedtls_mpi_uint *) p;\n}\n\n/*\n * Set an MPI to static value 1\n */\nstatic inline void ecp_mpi_set1( mbedtls_mpi *X )\n{\n    static mbedtls_mpi_uint one[] = { 1 };\n    X->s = 1;\n    X->n = 1;\n    X->p = one;\n}\n\n/*\n * Make group available from embedded constants\n */\nstatic int ecp_group_load( mbedtls_ecp_group *grp,\n                           const mbedtls_mpi_uint *p,  size_t plen,\n                           const mbedtls_mpi_uint *a,  size_t alen,\n                           const mbedtls_mpi_uint *b,  size_t blen,\n                           const mbedtls_mpi_uint *gx, size_t gxlen,\n                           const mbedtls_mpi_uint *gy, size_t gylen,\n                           const mbedtls_mpi_uint *n,  size_t nlen)\n{\n    ecp_mpi_load( &grp->P, p, plen );\n    if( a != NULL )\n        ecp_mpi_load( &grp->A, a, alen );\n    ecp_mpi_load( &grp->B, b, blen );\n    ecp_mpi_load( &grp->N, n, nlen );\n\n    ecp_mpi_load( &grp->G.X, gx, gxlen );\n    ecp_mpi_load( &grp->G.Y, gy, gylen );\n    ecp_mpi_set1( &grp->G.Z );\n\n    grp->pbits = mbedtls_mpi_bitlen( &grp->P );\n    grp->nbits = mbedtls_mpi_bitlen( &grp->N );\n\n    grp->h = 1;\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_ECP_NIST_OPTIM)\n/* Forward declarations */\n#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)\nstatic int ecp_mod_p192( mbedtls_mpi * );\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)\nstatic int ecp_mod_p224( mbedtls_mpi * );\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)\nstatic int ecp_mod_p256( mbedtls_mpi * );\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)\nstatic int ecp_mod_p384( mbedtls_mpi * );\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)\nstatic int ecp_mod_p521( mbedtls_mpi * );\n#endif\n\n#define NIST_MODP( P )      grp->modp = ecp_mod_ ## P;\n#else\n#define NIST_MODP( P )\n#endif /* MBEDTLS_ECP_NIST_OPTIM */\n\n/* Additional forward declarations */\n#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)\nstatic int ecp_mod_p255( mbedtls_mpi * );\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)\nstatic int ecp_mod_p192k1( mbedtls_mpi * );\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)\nstatic int ecp_mod_p224k1( mbedtls_mpi * );\n#endif\n#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)\nstatic int ecp_mod_p256k1( mbedtls_mpi * );\n#endif\n\n#define LOAD_GROUP_A( G )   ecp_group_load( grp,            \\\n                            G ## _p,  sizeof( G ## _p  ),   \\\n                            G ## _a,  sizeof( G ## _a  ),   \\\n                            G ## _b,  sizeof( G ## _b  ),   \\\n                            G ## _gx, sizeof( G ## _gx ),   \\\n                            G ## _gy, sizeof( G ## _gy ),   \\\n                            G ## _n,  sizeof( G ## _n  ) )\n\n#define LOAD_GROUP( G )     ecp_group_load( grp,            \\\n                            G ## _p,  sizeof( G ## _p  ),   \\\n                            NULL,     0,                    \\\n                            G ## _b,  sizeof( G ## _b  ),   \\\n                            G ## _gx, sizeof( G ## _gx ),   \\\n                            G ## _gy, sizeof( G ## _gy ),   \\\n                            G ## _n,  sizeof( G ## _n  ) )\n\n#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)\n/*\n * Specialized function for creating the Curve25519 group\n */\nstatic int ecp_use_curve25519( mbedtls_ecp_group *grp )\n{\n    int ret;\n\n    /* Actually ( A + 2 ) / 4 */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &grp->A, 16, \"01DB42\" ) );\n\n    /* P = 2^255 - 19 */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->P, 1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &grp->P, 255 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &grp->P, &grp->P, 19 ) );\n    grp->pbits = mbedtls_mpi_bitlen( &grp->P );\n\n    /* Y intentionaly not set, since we use x/z coordinates.\n     * This is used as a marker to identify Montgomery curves! */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.X, 9 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &grp->G.Z, 1 ) );\n    mbedtls_mpi_free( &grp->G.Y );\n\n    /* Actually, the required msb for private keys */\n    grp->nbits = 254;\n\ncleanup:\n    if( ret != 0 )\n        mbedtls_ecp_group_free( grp );\n\n    return( ret );\n}\n#endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */\n\n/*\n * Set a group using well-known domain parameters\n */\nint mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id )\n{\n    mbedtls_ecp_group_free( grp );\n\n    grp->id = id;\n\n    switch( id )\n    {\n#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)\n        case MBEDTLS_ECP_DP_SECP192R1:\n            NIST_MODP( p192 );\n            return( LOAD_GROUP( secp192r1 ) );\n#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)\n        case MBEDTLS_ECP_DP_SECP224R1:\n            NIST_MODP( p224 );\n            return( LOAD_GROUP( secp224r1 ) );\n#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)\n        case MBEDTLS_ECP_DP_SECP256R1:\n            NIST_MODP( p256 );\n            return( LOAD_GROUP( secp256r1 ) );\n#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)\n        case MBEDTLS_ECP_DP_SECP384R1:\n            NIST_MODP( p384 );\n            return( LOAD_GROUP( secp384r1 ) );\n#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)\n        case MBEDTLS_ECP_DP_SECP521R1:\n            NIST_MODP( p521 );\n            return( LOAD_GROUP( secp521r1 ) );\n#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)\n        case MBEDTLS_ECP_DP_SECP192K1:\n            grp->modp = ecp_mod_p192k1;\n            return( LOAD_GROUP_A( secp192k1 ) );\n#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)\n        case MBEDTLS_ECP_DP_SECP224K1:\n            grp->modp = ecp_mod_p224k1;\n            return( LOAD_GROUP_A( secp224k1 ) );\n#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)\n        case MBEDTLS_ECP_DP_SECP256K1:\n            grp->modp = ecp_mod_p256k1;\n            return( LOAD_GROUP_A( secp256k1 ) );\n#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)\n        case MBEDTLS_ECP_DP_BP256R1:\n            return( LOAD_GROUP_A( brainpoolP256r1 ) );\n#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)\n        case MBEDTLS_ECP_DP_BP384R1:\n            return( LOAD_GROUP_A( brainpoolP384r1 ) );\n#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)\n        case MBEDTLS_ECP_DP_BP512R1:\n            return( LOAD_GROUP_A( brainpoolP512r1 ) );\n#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)\n        case MBEDTLS_ECP_DP_CURVE25519:\n            grp->modp = ecp_mod_p255;\n            return( ecp_use_curve25519( grp ) );\n#endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */\n\n        default:\n            mbedtls_ecp_group_free( grp );\n            return( MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE );\n    }\n}\n\n#if defined(MBEDTLS_ECP_NIST_OPTIM)\n/*\n * Fast reduction modulo the primes used by the NIST curves.\n *\n * These functions are critical for speed, but not needed for correct\n * operations. So, we make the choice to heavily rely on the internals of our\n * bignum library, which creates a tight coupling between these functions and\n * our MPI implementation.  However, the coupling between the ECP module and\n * MPI remains loose, since these functions can be deactivated at will.\n */\n\n#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)\n/*\n * Compared to the way things are presented in FIPS 186-3 D.2,\n * we proceed in columns, from right (least significant chunk) to left,\n * adding chunks to N in place, and keeping a carry for the next chunk.\n * This avoids moving things around in memory, and uselessly adding zeros,\n * compared to the more straightforward, line-oriented approach.\n *\n * For this prime we need to handle data in chunks of 64 bits.\n * Since this is always a multiple of our basic mbedtls_mpi_uint, we can\n * use a mbedtls_mpi_uint * to designate such a chunk, and small loops to handle it.\n */\n\n/* Add 64-bit chunks (dst += src) and update carry */\nstatic inline void add64( mbedtls_mpi_uint *dst, mbedtls_mpi_uint *src, mbedtls_mpi_uint *carry )\n{\n    unsigned char i;\n    mbedtls_mpi_uint c = 0;\n    for( i = 0; i < 8 / sizeof( mbedtls_mpi_uint ); i++, dst++, src++ )\n    {\n        *dst += c;      c  = ( *dst < c );\n        *dst += *src;   c += ( *dst < *src );\n    }\n    *carry += c;\n}\n\n/* Add carry to a 64-bit chunk and update carry */\nstatic inline void carry64( mbedtls_mpi_uint *dst, mbedtls_mpi_uint *carry )\n{\n    unsigned char i;\n    for( i = 0; i < 8 / sizeof( mbedtls_mpi_uint ); i++, dst++ )\n    {\n        *dst += *carry;\n        *carry  = ( *dst < *carry );\n    }\n}\n\n#define WIDTH       8 / sizeof( mbedtls_mpi_uint )\n#define A( i )      N->p + i * WIDTH\n#define ADD( i )    add64( p, A( i ), &c )\n#define NEXT        p += WIDTH; carry64( p, &c )\n#define LAST        p += WIDTH; *p = c; while( ++p < end ) *p = 0\n\n/*\n * Fast quasi-reduction modulo p192 (FIPS 186-3 D.2.1)\n */\nstatic int ecp_mod_p192( mbedtls_mpi *N )\n{\n    int ret;\n    mbedtls_mpi_uint c = 0;\n    mbedtls_mpi_uint *p, *end;\n\n    /* Make sure we have enough blocks so that A(5) is legal */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( N, 6 * WIDTH ) );\n\n    p = N->p;\n    end = p + N->n;\n\n    ADD( 3 ); ADD( 5 );             NEXT; // A0 += A3 + A5\n    ADD( 3 ); ADD( 4 ); ADD( 5 );   NEXT; // A1 += A3 + A4 + A5\n    ADD( 4 ); ADD( 5 );             LAST; // A2 += A4 + A5\n\ncleanup:\n    return( ret );\n}\n\n#undef WIDTH\n#undef A\n#undef ADD\n#undef NEXT\n#undef LAST\n#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)\n/*\n * The reader is advised to first understand ecp_mod_p192() since the same\n * general structure is used here, but with additional complications:\n * (1) chunks of 32 bits, and (2) subtractions.\n */\n\n/*\n * For these primes, we need to handle data in chunks of 32 bits.\n * This makes it more complicated if we use 64 bits limbs in MPI,\n * which prevents us from using a uniform access method as for p192.\n *\n * So, we define a mini abstraction layer to access 32 bit chunks,\n * load them in 'cur' for work, and store them back from 'cur' when done.\n *\n * While at it, also define the size of N in terms of 32-bit chunks.\n */\n#define LOAD32      cur = A( i );\n\n#if defined(MBEDTLS_HAVE_INT32)  /* 32 bit */\n\n#define MAX32       N->n\n#define A( j )      N->p[j]\n#define STORE32     N->p[i] = cur;\n\n#else                               /* 64-bit */\n\n#define MAX32       N->n * 2\n#define A( j ) j % 2 ? (uint32_t)( N->p[j/2] >> 32 ) : (uint32_t)( N->p[j/2] )\n#define STORE32                                   \\\n    if( i % 2 ) {                                 \\\n        N->p[i/2] &= 0x00000000FFFFFFFF;          \\\n        N->p[i/2] |= ((mbedtls_mpi_uint) cur) << 32;        \\\n    } else {                                      \\\n        N->p[i/2] &= 0xFFFFFFFF00000000;          \\\n        N->p[i/2] |= (mbedtls_mpi_uint) cur;                \\\n    }\n\n#endif /* sizeof( mbedtls_mpi_uint ) */\n\n/*\n * Helpers for addition and subtraction of chunks, with signed carry.\n */\nstatic inline void add32( uint32_t *dst, uint32_t src, signed char *carry )\n{\n    *dst += src;\n    *carry += ( *dst < src );\n}\n\nstatic inline void sub32( uint32_t *dst, uint32_t src, signed char *carry )\n{\n    *carry -= ( *dst < src );\n    *dst -= src;\n}\n\n#define ADD( j )    add32( &cur, A( j ), &c );\n#define SUB( j )    sub32( &cur, A( j ), &c );\n\n/*\n * Helpers for the main 'loop'\n * (see fix_negative for the motivation of C)\n */\n#define INIT( b )                                           \\\n    int ret;                                                \\\n    signed char c = 0, cc;                                  \\\n    uint32_t cur;                                           \\\n    size_t i = 0, bits = b;                                 \\\n    mbedtls_mpi C;                                                  \\\n    mbedtls_mpi_uint Cp[ b / 8 / sizeof( mbedtls_mpi_uint) + 1 ];               \\\n                                                            \\\n    C.s = 1;                                                \\\n    C.n = b / 8 / sizeof( mbedtls_mpi_uint) + 1;                      \\\n    C.p = Cp;                                               \\\n    memset( Cp, 0, C.n * sizeof( mbedtls_mpi_uint ) );                \\\n                                                            \\\n    MBEDTLS_MPI_CHK( mbedtls_mpi_grow( N, b * 2 / 8 / sizeof( mbedtls_mpi_uint ) ) ); \\\n    LOAD32;\n\n#define NEXT                    \\\n    STORE32; i++; LOAD32;       \\\n    cc = c; c = 0;              \\\n    if( cc < 0 )                \\\n        sub32( &cur, -cc, &c ); \\\n    else                        \\\n        add32( &cur, cc, &c );  \\\n\n#define LAST                                    \\\n    STORE32; i++;                               \\\n    cur = c > 0 ? c : 0; STORE32;               \\\n    cur = 0; while( ++i < MAX32 ) { STORE32; }  \\\n    if( c < 0 ) fix_negative( N, c, &C, bits );\n\n/*\n * If the result is negative, we get it in the form\n * c * 2^(bits + 32) + N, with c negative and N positive shorter than 'bits'\n */\nstatic inline int fix_negative( mbedtls_mpi *N, signed char c, mbedtls_mpi *C, size_t bits )\n{\n    int ret;\n\n    /* C = - c * 2^(bits + 32) */\n#if !defined(MBEDTLS_HAVE_INT64)\n    ((void) bits);\n#else\n    if( bits == 224 )\n        C->p[ C->n - 1 ] = ((mbedtls_mpi_uint) -c) << 32;\n    else\n#endif\n        C->p[ C->n - 1 ] = (mbedtls_mpi_uint) -c;\n\n    /* N = - ( C - N ) */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( N, C, N ) );\n    N->s = -1;\n\ncleanup:\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)\n/*\n * Fast quasi-reduction modulo p224 (FIPS 186-3 D.2.2)\n */\nstatic int ecp_mod_p224( mbedtls_mpi *N )\n{\n    INIT( 224 );\n\n    SUB(  7 ); SUB( 11 );               NEXT; // A0 += -A7 - A11\n    SUB(  8 ); SUB( 12 );               NEXT; // A1 += -A8 - A12\n    SUB(  9 ); SUB( 13 );               NEXT; // A2 += -A9 - A13\n    SUB( 10 ); ADD(  7 ); ADD( 11 );    NEXT; // A3 += -A10 + A7 + A11\n    SUB( 11 ); ADD(  8 ); ADD( 12 );    NEXT; // A4 += -A11 + A8 + A12\n    SUB( 12 ); ADD(  9 ); ADD( 13 );    NEXT; // A5 += -A12 + A9 + A13\n    SUB( 13 ); ADD( 10 );               LAST; // A6 += -A13 + A10\n\ncleanup:\n    return( ret );\n}\n#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)\n/*\n * Fast quasi-reduction modulo p256 (FIPS 186-3 D.2.3)\n */\nstatic int ecp_mod_p256( mbedtls_mpi *N )\n{\n    INIT( 256 );\n\n    ADD(  8 ); ADD(  9 );\n    SUB( 11 ); SUB( 12 ); SUB( 13 ); SUB( 14 );             NEXT; // A0\n\n    ADD(  9 ); ADD( 10 );\n    SUB( 12 ); SUB( 13 ); SUB( 14 ); SUB( 15 );             NEXT; // A1\n\n    ADD( 10 ); ADD( 11 );\n    SUB( 13 ); SUB( 14 ); SUB( 15 );                        NEXT; // A2\n\n    ADD( 11 ); ADD( 11 ); ADD( 12 ); ADD( 12 ); ADD( 13 );\n    SUB( 15 ); SUB(  8 ); SUB(  9 );                        NEXT; // A3\n\n    ADD( 12 ); ADD( 12 ); ADD( 13 ); ADD( 13 ); ADD( 14 );\n    SUB(  9 ); SUB( 10 );                                   NEXT; // A4\n\n    ADD( 13 ); ADD( 13 ); ADD( 14 ); ADD( 14 ); ADD( 15 );\n    SUB( 10 ); SUB( 11 );                                   NEXT; // A5\n\n    ADD( 14 ); ADD( 14 ); ADD( 15 ); ADD( 15 ); ADD( 14 ); ADD( 13 );\n    SUB(  8 ); SUB(  9 );                                   NEXT; // A6\n\n    ADD( 15 ); ADD( 15 ); ADD( 15 ); ADD( 8 );\n    SUB( 10 ); SUB( 11 ); SUB( 12 ); SUB( 13 );             LAST; // A7\n\ncleanup:\n    return( ret );\n}\n#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)\n/*\n * Fast quasi-reduction modulo p384 (FIPS 186-3 D.2.4)\n */\nstatic int ecp_mod_p384( mbedtls_mpi *N )\n{\n    INIT( 384 );\n\n    ADD( 12 ); ADD( 21 ); ADD( 20 );\n    SUB( 23 );                                              NEXT; // A0\n\n    ADD( 13 ); ADD( 22 ); ADD( 23 );\n    SUB( 12 ); SUB( 20 );                                   NEXT; // A2\n\n    ADD( 14 ); ADD( 23 );\n    SUB( 13 ); SUB( 21 );                                   NEXT; // A2\n\n    ADD( 15 ); ADD( 12 ); ADD( 20 ); ADD( 21 );\n    SUB( 14 ); SUB( 22 ); SUB( 23 );                        NEXT; // A3\n\n    ADD( 21 ); ADD( 21 ); ADD( 16 ); ADD( 13 ); ADD( 12 ); ADD( 20 ); ADD( 22 );\n    SUB( 15 ); SUB( 23 ); SUB( 23 );                        NEXT; // A4\n\n    ADD( 22 ); ADD( 22 ); ADD( 17 ); ADD( 14 ); ADD( 13 ); ADD( 21 ); ADD( 23 );\n    SUB( 16 );                                              NEXT; // A5\n\n    ADD( 23 ); ADD( 23 ); ADD( 18 ); ADD( 15 ); ADD( 14 ); ADD( 22 );\n    SUB( 17 );                                              NEXT; // A6\n\n    ADD( 19 ); ADD( 16 ); ADD( 15 ); ADD( 23 );\n    SUB( 18 );                                              NEXT; // A7\n\n    ADD( 20 ); ADD( 17 ); ADD( 16 );\n    SUB( 19 );                                              NEXT; // A8\n\n    ADD( 21 ); ADD( 18 ); ADD( 17 );\n    SUB( 20 );                                              NEXT; // A9\n\n    ADD( 22 ); ADD( 19 ); ADD( 18 );\n    SUB( 21 );                                              NEXT; // A10\n\n    ADD( 23 ); ADD( 20 ); ADD( 19 );\n    SUB( 22 );                                              LAST; // A11\n\ncleanup:\n    return( ret );\n}\n#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */\n\n#undef A\n#undef LOAD32\n#undef STORE32\n#undef MAX32\n#undef INIT\n#undef NEXT\n#undef LAST\n\n#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED ||\n          MBEDTLS_ECP_DP_SECP256R1_ENABLED ||\n          MBEDTLS_ECP_DP_SECP384R1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)\n/*\n * Here we have an actual Mersenne prime, so things are more straightforward.\n * However, chunks are aligned on a 'weird' boundary (521 bits).\n */\n\n/* Size of p521 in terms of mbedtls_mpi_uint */\n#define P521_WIDTH      ( 521 / 8 / sizeof( mbedtls_mpi_uint ) + 1 )\n\n/* Bits to keep in the most significant mbedtls_mpi_uint */\n#define P521_MASK       0x01FF\n\n/*\n * Fast quasi-reduction modulo p521 (FIPS 186-3 D.2.5)\n * Write N as A1 + 2^521 A0, return A0 + A1\n */\nstatic int ecp_mod_p521( mbedtls_mpi *N )\n{\n    int ret;\n    size_t i;\n    mbedtls_mpi M;\n    mbedtls_mpi_uint Mp[P521_WIDTH + 1];\n    /* Worst case for the size of M is when mbedtls_mpi_uint is 16 bits:\n     * we need to hold bits 513 to 1056, which is 34 limbs, that is\n     * P521_WIDTH + 1. Otherwise P521_WIDTH is enough. */\n\n    if( N->n < P521_WIDTH )\n        return( 0 );\n\n    /* M = A1 */\n    M.s = 1;\n    M.n = N->n - ( P521_WIDTH - 1 );\n    if( M.n > P521_WIDTH + 1 )\n        M.n = P521_WIDTH + 1;\n    M.p = Mp;\n    memcpy( Mp, N->p + P521_WIDTH - 1, M.n * sizeof( mbedtls_mpi_uint ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, 521 % ( 8 * sizeof( mbedtls_mpi_uint ) ) ) );\n\n    /* N = A0 */\n    N->p[P521_WIDTH - 1] &= P521_MASK;\n    for( i = P521_WIDTH; i < N->n; i++ )\n        N->p[i] = 0;\n\n    /* N = A0 + A1 */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) );\n\ncleanup:\n    return( ret );\n}\n\n#undef P521_WIDTH\n#undef P521_MASK\n#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */\n\n#endif /* MBEDTLS_ECP_NIST_OPTIM */\n\n#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)\n\n/* Size of p255 in terms of mbedtls_mpi_uint */\n#define P255_WIDTH      ( 255 / 8 / sizeof( mbedtls_mpi_uint ) + 1 )\n\n/*\n * Fast quasi-reduction modulo p255 = 2^255 - 19\n * Write N as A0 + 2^255 A1, return A0 + 19 * A1\n */\nstatic int ecp_mod_p255( mbedtls_mpi *N )\n{\n    int ret;\n    size_t i;\n    mbedtls_mpi M;\n    mbedtls_mpi_uint Mp[P255_WIDTH + 2];\n\n    if( N->n < P255_WIDTH )\n        return( 0 );\n\n    /* M = A1 */\n    M.s = 1;\n    M.n = N->n - ( P255_WIDTH - 1 );\n    if( M.n > P255_WIDTH + 1 )\n        M.n = P255_WIDTH + 1;\n    M.p = Mp;\n    memset( Mp, 0, sizeof Mp );\n    memcpy( Mp, N->p + P255_WIDTH - 1, M.n * sizeof( mbedtls_mpi_uint ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, 255 % ( 8 * sizeof( mbedtls_mpi_uint ) ) ) );\n    M.n++; /* Make room for multiplication by 19 */\n\n    /* N = A0 */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_set_bit( N, 255, 0 ) );\n    for( i = P255_WIDTH; i < N->n; i++ )\n        N->p[i] = 0;\n\n    /* N = A0 + 19 * A1 */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &M, &M, 19 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) );\n\ncleanup:\n    return( ret );\n}\n#endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED) ||   \\\n    defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)\n/*\n * Fast quasi-reduction modulo P = 2^s - R,\n * with R about 33 bits, used by the Koblitz curves.\n *\n * Write N as A0 + 2^224 A1, return A0 + R * A1.\n * Actually do two passes, since R is big.\n */\n#define P_KOBLITZ_MAX   ( 256 / 8 / sizeof( mbedtls_mpi_uint ) )  // Max limbs in P\n#define P_KOBLITZ_R     ( 8 / sizeof( mbedtls_mpi_uint ) )        // Limbs in R\nstatic inline int ecp_mod_koblitz( mbedtls_mpi *N, mbedtls_mpi_uint *Rp, size_t p_limbs,\n                                   size_t adjust, size_t shift, mbedtls_mpi_uint mask )\n{\n    int ret;\n    size_t i;\n    mbedtls_mpi M, R;\n    mbedtls_mpi_uint Mp[P_KOBLITZ_MAX + P_KOBLITZ_R + 1];\n\n    if( N->n < p_limbs )\n        return( 0 );\n\n    /* Init R */\n    R.s = 1;\n    R.p = Rp;\n    R.n = P_KOBLITZ_R;\n\n    /* Common setup for M */\n    M.s = 1;\n    M.p = Mp;\n\n    /* M = A1 */\n    M.n = N->n - ( p_limbs - adjust );\n    if( M.n > p_limbs + adjust )\n        M.n = p_limbs + adjust;\n    memset( Mp, 0, sizeof Mp );\n    memcpy( Mp, N->p + p_limbs - adjust, M.n * sizeof( mbedtls_mpi_uint ) );\n    if( shift != 0 )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, shift ) );\n    M.n += R.n; /* Make room for multiplication by R */\n\n    /* N = A0 */\n    if( mask != 0 )\n        N->p[p_limbs - 1] &= mask;\n    for( i = p_limbs; i < N->n; i++ )\n        N->p[i] = 0;\n\n    /* N = A0 + R * A1 */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &M, &M, &R ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) );\n\n    /* Second pass */\n\n    /* M = A1 */\n    M.n = N->n - ( p_limbs - adjust );\n    if( M.n > p_limbs + adjust )\n        M.n = p_limbs + adjust;\n    memset( Mp, 0, sizeof Mp );\n    memcpy( Mp, N->p + p_limbs - adjust, M.n * sizeof( mbedtls_mpi_uint ) );\n    if( shift != 0 )\n        MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &M, shift ) );\n    M.n += R.n; /* Make room for multiplication by R */\n\n    /* N = A0 */\n    if( mask != 0 )\n        N->p[p_limbs - 1] &= mask;\n    for( i = p_limbs; i < N->n; i++ )\n        N->p[i] = 0;\n\n    /* N = A0 + R * A1 */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &M, &M, &R ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( N, N, &M ) );\n\ncleanup:\n    return( ret );\n}\n#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED) ||\n          MBEDTLS_ECP_DP_SECP224K1_ENABLED) ||\n          MBEDTLS_ECP_DP_SECP256K1_ENABLED) */\n\n#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)\n/*\n * Fast quasi-reduction modulo p192k1 = 2^192 - R,\n * with R = 2^32 + 2^12 + 2^8 + 2^7 + 2^6 + 2^3 + 1 = 0x0100001119\n */\nstatic int ecp_mod_p192k1( mbedtls_mpi *N )\n{\n    static mbedtls_mpi_uint Rp[] = {\n        BYTES_TO_T_UINT_8( 0xC9, 0x11, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) };\n\n    return( ecp_mod_koblitz( N, Rp, 192 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) );\n}\n#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)\n/*\n * Fast quasi-reduction modulo p224k1 = 2^224 - R,\n * with R = 2^32 + 2^12 + 2^11 + 2^9 + 2^7 + 2^4 + 2 + 1 = 0x0100001A93\n */\nstatic int ecp_mod_p224k1( mbedtls_mpi *N )\n{\n    static mbedtls_mpi_uint Rp[] = {\n        BYTES_TO_T_UINT_8( 0x93, 0x1A, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) };\n\n#if defined(MBEDTLS_HAVE_INT64)\n    return( ecp_mod_koblitz( N, Rp, 4, 1, 32, 0xFFFFFFFF ) );\n#else\n    return( ecp_mod_koblitz( N, Rp, 224 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) );\n#endif\n}\n\n#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */\n\n#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)\n/*\n * Fast quasi-reduction modulo p256k1 = 2^256 - R,\n * with R = 2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1 = 0x01000003D1\n */\nstatic int ecp_mod_p256k1( mbedtls_mpi *N )\n{\n    static mbedtls_mpi_uint Rp[] = {\n        BYTES_TO_T_UINT_8( 0xD1, 0x03, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 ) };\n    return( ecp_mod_koblitz( N, Rp, 256 / 8 / sizeof( mbedtls_mpi_uint ), 0, 0, 0 ) );\n}\n#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */\n\n#endif /* !MBEDTLS_ECP_ALT */\n\n#endif /* MBEDTLS_ECP_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/entropy.c",
    "content": "/*\n *  Entropy accumulator implementation\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ENTROPY_C)\n\n#if defined(MBEDTLS_TEST_NULL_ENTROPY)\n#warning \"**** WARNING!  MBEDTLS_TEST_NULL_ENTROPY defined! \"\n#warning \"**** THIS BUILD HAS NO DEFINED ENTROPY SOURCES \"\n#warning \"**** THIS BUILD IS *NOT* SUITABLE FOR PRODUCTION USE \"\n#endif\n\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/entropy_poll.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_FS_IO)\n#include <stdio.h>\n#endif\n\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\n#include \"mbedtls/platform.h\"\n#endif\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if defined(MBEDTLS_HAVEGE_C)\n#include \"mbedtls/havege.h\"\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n#define ENTROPY_MAX_LOOP    256     /**< Maximum amount to loop before error */\n\nvoid mbedtls_entropy_init( mbedtls_entropy_context *ctx )\n{\n    memset( ctx, 0, sizeof(mbedtls_entropy_context) );\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_init( &ctx->mutex );\n#endif\n\n#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)\n    mbedtls_sha512_starts( &ctx->accumulator, 0 );\n#else\n    mbedtls_sha256_starts( &ctx->accumulator, 0 );\n#endif\n#if defined(MBEDTLS_HAVEGE_C)\n    mbedtls_havege_init( &ctx->havege_data );\n#endif\n\n#if defined(MBEDTLS_TEST_NULL_ENTROPY)\n    mbedtls_entropy_add_source( ctx, mbedtls_null_entropy_poll, NULL,\n                                1, MBEDTLS_ENTROPY_SOURCE_STRONG );\n#endif\n\n#if !defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES)\n#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY)\n    mbedtls_entropy_add_source( ctx, mbedtls_platform_entropy_poll, NULL,\n                                MBEDTLS_ENTROPY_MIN_PLATFORM,\n                                MBEDTLS_ENTROPY_SOURCE_STRONG );\n#endif\n#if defined(MBEDTLS_TIMING_C)\n    mbedtls_entropy_add_source( ctx, mbedtls_hardclock_poll, NULL,\n                                MBEDTLS_ENTROPY_MIN_HARDCLOCK,\n                                MBEDTLS_ENTROPY_SOURCE_WEAK );\n#endif\n#if defined(MBEDTLS_HAVEGE_C)\n    mbedtls_entropy_add_source( ctx, mbedtls_havege_poll, &ctx->havege_data,\n                                MBEDTLS_ENTROPY_MIN_HAVEGE,\n                                MBEDTLS_ENTROPY_SOURCE_STRONG );\n#endif\n#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)\n    mbedtls_entropy_add_source( ctx, mbedtls_hardware_poll, NULL,\n                                MBEDTLS_ENTROPY_MIN_HARDWARE,\n                                MBEDTLS_ENTROPY_SOURCE_STRONG );\n#endif\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\n    mbedtls_entropy_add_source( ctx, mbedtls_nv_seed_poll, NULL,\n                                MBEDTLS_ENTROPY_BLOCK_SIZE,\n                                MBEDTLS_ENTROPY_SOURCE_STRONG );\n#endif\n#endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */\n}\n\nvoid mbedtls_entropy_free( mbedtls_entropy_context *ctx )\n{\n#if defined(MBEDTLS_HAVEGE_C)\n    mbedtls_havege_free( &ctx->havege_data );\n#endif\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_free( &ctx->mutex );\n#endif\n    mbedtls_zeroize( ctx, sizeof( mbedtls_entropy_context ) );\n}\n\nint mbedtls_entropy_add_source( mbedtls_entropy_context *ctx,\n                        mbedtls_entropy_f_source_ptr f_source, void *p_source,\n                        size_t threshold, int strong )\n{\n    int idx, ret = 0;\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    idx = ctx->source_count;\n    if( idx >= MBEDTLS_ENTROPY_MAX_SOURCES )\n    {\n        ret = MBEDTLS_ERR_ENTROPY_MAX_SOURCES;\n        goto exit;\n    }\n\n    ctx->source[idx].f_source  = f_source;\n    ctx->source[idx].p_source  = p_source;\n    ctx->source[idx].threshold = threshold;\n    ctx->source[idx].strong    = strong;\n\n    ctx->source_count++;\n\nexit:\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    return( ret );\n}\n\n/*\n * Entropy accumulator update\n */\nstatic int entropy_update( mbedtls_entropy_context *ctx, unsigned char source_id,\n                           const unsigned char *data, size_t len )\n{\n    unsigned char header[2];\n    unsigned char tmp[MBEDTLS_ENTROPY_BLOCK_SIZE];\n    size_t use_len = len;\n    const unsigned char *p = data;\n\n    if( use_len > MBEDTLS_ENTROPY_BLOCK_SIZE )\n    {\n#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)\n        mbedtls_sha512( data, len, tmp, 0 );\n#else\n        mbedtls_sha256( data, len, tmp, 0 );\n#endif\n        p = tmp;\n        use_len = MBEDTLS_ENTROPY_BLOCK_SIZE;\n    }\n\n    header[0] = source_id;\n    header[1] = use_len & 0xFF;\n\n#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)\n    mbedtls_sha512_update( &ctx->accumulator, header, 2 );\n    mbedtls_sha512_update( &ctx->accumulator, p, use_len );\n#else\n    mbedtls_sha256_update( &ctx->accumulator, header, 2 );\n    mbedtls_sha256_update( &ctx->accumulator, p, use_len );\n#endif\n\n    return( 0 );\n}\n\nint mbedtls_entropy_update_manual( mbedtls_entropy_context *ctx,\n                           const unsigned char *data, size_t len )\n{\n    int ret;\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    ret = entropy_update( ctx, MBEDTLS_ENTROPY_SOURCE_MANUAL, data, len );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    return( ret );\n}\n\n/*\n * Run through the different sources to add entropy to our accumulator\n */\nstatic int entropy_gather_internal( mbedtls_entropy_context *ctx )\n{\n    int ret, i, have_one_strong = 0;\n    unsigned char buf[MBEDTLS_ENTROPY_MAX_GATHER];\n    size_t olen;\n\n    if( ctx->source_count == 0 )\n        return( MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED );\n\n    /*\n     * Run through our entropy sources\n     */\n    for( i = 0; i < ctx->source_count; i++ )\n    {\n        if( ctx->source[i].strong == MBEDTLS_ENTROPY_SOURCE_STRONG )\n            have_one_strong = 1;\n\n        olen = 0;\n        if( ( ret = ctx->source[i].f_source( ctx->source[i].p_source,\n                        buf, MBEDTLS_ENTROPY_MAX_GATHER, &olen ) ) != 0 )\n        {\n            return( ret );\n        }\n\n        /*\n         * Add if we actually gathered something\n         */\n        if( olen > 0 )\n        {\n            entropy_update( ctx, (unsigned char) i, buf, olen );\n            ctx->source[i].size += olen;\n        }\n    }\n\n    if( have_one_strong == 0 )\n        return( MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE );\n\n    return( 0 );\n}\n\n/*\n * Thread-safe wrapper for entropy_gather_internal()\n */\nint mbedtls_entropy_gather( mbedtls_entropy_context *ctx )\n{\n    int ret;\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    ret = entropy_gather_internal( ctx );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    return( ret );\n}\n\nint mbedtls_entropy_func( void *data, unsigned char *output, size_t len )\n{\n    int ret, count = 0, i, done;\n    mbedtls_entropy_context *ctx = (mbedtls_entropy_context *) data;\n    unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];\n\n    if( len > MBEDTLS_ENTROPY_BLOCK_SIZE )\n        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );\n\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\n    /* Update the NV entropy seed before generating any entropy for outside\n     * use.\n     */\n    if( ctx->initial_entropy_run == 0 )\n    {\n        ctx->initial_entropy_run = 1;\n        if( ( ret = mbedtls_entropy_update_nv_seed( ctx ) ) != 0 )\n            return( ret );\n    }\n#endif\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    /*\n     * Always gather extra entropy before a call\n     */\n    do\n    {\n        if( count++ > ENTROPY_MAX_LOOP )\n        {\n            ret = MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;\n            goto exit;\n        }\n\n        if( ( ret = entropy_gather_internal( ctx ) ) != 0 )\n            goto exit;\n\n        done = 1;\n        for( i = 0; i < ctx->source_count; i++ )\n            if( ctx->source[i].size < ctx->source[i].threshold )\n                done = 0;\n    }\n    while( ! done );\n\n    memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );\n\n#if defined(MBEDTLS_ENTROPY_SHA512_ACCUMULATOR)\n    mbedtls_sha512_finish( &ctx->accumulator, buf );\n\n    /*\n     * Reset accumulator and counters and recycle existing entropy\n     */\n    memset( &ctx->accumulator, 0, sizeof( mbedtls_sha512_context ) );\n    mbedtls_sha512_starts( &ctx->accumulator, 0 );\n    mbedtls_sha512_update( &ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );\n\n    /*\n     * Perform second SHA-512 on entropy\n     */\n    mbedtls_sha512( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0 );\n#else /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */\n    mbedtls_sha256_finish( &ctx->accumulator, buf );\n\n    /*\n     * Reset accumulator and counters and recycle existing entropy\n     */\n    memset( &ctx->accumulator, 0, sizeof( mbedtls_sha256_context ) );\n    mbedtls_sha256_starts( &ctx->accumulator, 0 );\n    mbedtls_sha256_update( &ctx->accumulator, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );\n\n    /*\n     * Perform second SHA-256 on entropy\n     */\n    mbedtls_sha256( buf, MBEDTLS_ENTROPY_BLOCK_SIZE, buf, 0 );\n#endif /* MBEDTLS_ENTROPY_SHA512_ACCUMULATOR */\n\n    for( i = 0; i < ctx->source_count; i++ )\n        ctx->source[i].size = 0;\n\n    memcpy( output, buf, len );\n\n    ret = 0;\n\nexit:\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\nint mbedtls_entropy_update_nv_seed( mbedtls_entropy_context *ctx )\n{\n    int ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR;\n    unsigned char buf[ MBEDTLS_ENTROPY_MAX_SEED_SIZE ];\n\n    /* Read new seed  and write it to NV */\n    if( ( ret = mbedtls_entropy_func( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 )\n        return( ret );\n\n    if( mbedtls_nv_seed_write( buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) < 0 )\n        return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR );\n\n    /* Manually update the remaining stream with a separator value to diverge */\n    memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );\n    mbedtls_entropy_update_manual( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_ENTROPY_NV_SEED */\n\n#if defined(MBEDTLS_FS_IO)\nint mbedtls_entropy_write_seed_file( mbedtls_entropy_context *ctx, const char *path )\n{\n    int ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR;\n    FILE *f;\n    unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];\n\n    if( ( f = fopen( path, \"wb\" ) ) == NULL )\n        return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR );\n\n    if( ( ret = mbedtls_entropy_func( ctx, buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) ) != 0 )\n        goto exit;\n\n    if( fwrite( buf, 1, MBEDTLS_ENTROPY_BLOCK_SIZE, f ) != MBEDTLS_ENTROPY_BLOCK_SIZE )\n    {\n        ret = MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR;\n        goto exit;\n    }\n\n    ret = 0;\n\nexit:\n    fclose( f );\n    return( ret );\n}\n\nint mbedtls_entropy_update_seed_file( mbedtls_entropy_context *ctx, const char *path )\n{\n    FILE *f;\n    size_t n;\n    unsigned char buf[ MBEDTLS_ENTROPY_MAX_SEED_SIZE ];\n\n    if( ( f = fopen( path, \"rb\" ) ) == NULL )\n        return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR );\n\n    fseek( f, 0, SEEK_END );\n    n = (size_t) ftell( f );\n    fseek( f, 0, SEEK_SET );\n\n    if( n > MBEDTLS_ENTROPY_MAX_SEED_SIZE )\n        n = MBEDTLS_ENTROPY_MAX_SEED_SIZE;\n\n    if( fread( buf, 1, n, f ) != n )\n    {\n        fclose( f );\n        return( MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR );\n    }\n\n    fclose( f );\n\n    mbedtls_entropy_update_manual( ctx, buf, n );\n\n    return( mbedtls_entropy_write_seed_file( ctx, path ) );\n}\n#endif /* MBEDTLS_FS_IO */\n\n#if defined(MBEDTLS_SELF_TEST)\n#if !defined(MBEDTLS_TEST_NULL_ENTROPY)\n/*\n * Dummy source function\n */\nstatic int entropy_dummy_source( void *data, unsigned char *output,\n                                 size_t len, size_t *olen )\n{\n    ((void) data);\n\n    memset( output, 0x2a, len );\n    *olen = len;\n\n    return( 0 );\n}\n#endif /* !MBEDTLS_TEST_NULL_ENTROPY */\n\n#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)\n\nstatic int mbedtls_entropy_source_self_test_gather( unsigned char *buf, size_t buf_len )\n{\n    int ret = 0;\n    size_t entropy_len = 0;\n    size_t olen = 0;\n    size_t attempts = buf_len;\n\n    while( attempts > 0 && entropy_len < buf_len )\n    {\n        if( ( ret = mbedtls_hardware_poll( NULL, buf + entropy_len,\n            buf_len - entropy_len, &olen ) ) != 0 )\n            return( ret );\n\n        entropy_len += olen;\n        attempts--;\n    }\n\n    if( entropy_len < buf_len )\n    {\n        ret = 1;\n    }\n\n    return( ret );\n}\n\n\nstatic int mbedtls_entropy_source_self_test_check_bits( const unsigned char *buf,\n                                                        size_t buf_len )\n{\n    unsigned char set= 0xFF;\n    unsigned char unset = 0x00;\n    size_t i;\n\n    for( i = 0; i < buf_len; i++ )\n    {\n        set &= buf[i];\n        unset |= buf[i];\n    }\n\n    return( set == 0xFF || unset == 0x00 );\n}\n\n/*\n * A test to ensure hat the entropy sources are functioning correctly\n * and there is no obvious failure. The test performs the following checks:\n *  - The entropy source is not providing only 0s (all bits unset) or 1s (all\n *    bits set).\n *  - The entropy source is not providing values in a pattern. Because the\n *    hardware could be providing data in an arbitrary length, this check polls\n *    the hardware entropy source twice and compares the result to ensure they\n *    are not equal.\n *  - The error code returned by the entropy source is not an error.\n */\nint mbedtls_entropy_source_self_test( int verbose )\n{\n    int ret = 0;\n    unsigned char buf0[2 * sizeof( unsigned long long int )];\n    unsigned char buf1[2 * sizeof( unsigned long long int )];\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  ENTROPY_BIAS test: \" );\n\n    memset( buf0, 0x00, sizeof( buf0 ) );\n    memset( buf1, 0x00, sizeof( buf1 ) );\n\n    if( ( ret = mbedtls_entropy_source_self_test_gather( buf0, sizeof( buf0 ) ) ) != 0 )\n        goto cleanup;\n    if( ( ret = mbedtls_entropy_source_self_test_gather( buf1, sizeof( buf1 ) ) ) != 0 )\n        goto cleanup;\n\n    /* Make sure that the returned values are not all 0 or 1 */\n    if( ( ret = mbedtls_entropy_source_self_test_check_bits( buf0, sizeof( buf0 ) ) ) != 0 )\n        goto cleanup;\n    if( ( ret = mbedtls_entropy_source_self_test_check_bits( buf1, sizeof( buf1 ) ) ) != 0 )\n        goto cleanup;\n\n    /* Make sure that the entropy source is not returning values in a\n     * pattern */\n    ret = memcmp( buf0, buf1, sizeof( buf0 ) ) == 0;\n\ncleanup:\n    if( verbose != 0 )\n    {\n        if( ret != 0 )\n            mbedtls_printf( \"failed\\n\" );\n        else\n            mbedtls_printf( \"passed\\n\" );\n\n        mbedtls_printf( \"\\n\" );\n    }\n\n    return( ret != 0 );\n}\n\n#endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */\n\n/*\n * The actual entropy quality is hard to test, but we can at least\n * test that the functions don't cause errors and write the correct\n * amount of data to buffers.\n */\nint mbedtls_entropy_self_test( int verbose )\n{\n    int ret = 1;\n#if !defined(MBEDTLS_TEST_NULL_ENTROPY)\n    mbedtls_entropy_context ctx;\n    unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 };\n    unsigned char acc[MBEDTLS_ENTROPY_BLOCK_SIZE] = { 0 };\n    size_t i, j;\n#endif /* !MBEDTLS_TEST_NULL_ENTROPY */\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  ENTROPY test: \" );\n\n#if !defined(MBEDTLS_TEST_NULL_ENTROPY)\n    mbedtls_entropy_init( &ctx );\n\n    /* First do a gather to make sure we have default sources */\n    if( ( ret = mbedtls_entropy_gather( &ctx ) ) != 0 )\n        goto cleanup;\n\n    ret = mbedtls_entropy_add_source( &ctx, entropy_dummy_source, NULL, 16,\n                                      MBEDTLS_ENTROPY_SOURCE_WEAK );\n    if( ret != 0 )\n        goto cleanup;\n\n    if( ( ret = mbedtls_entropy_update_manual( &ctx, buf, sizeof buf ) ) != 0 )\n        goto cleanup;\n\n    /*\n     * To test that mbedtls_entropy_func writes correct number of bytes:\n     * - use the whole buffer and rely on ASan to detect overruns\n     * - collect entropy 8 times and OR the result in an accumulator:\n     *   any byte should then be 0 with probably 2^(-64), so requiring\n     *   each of the 32 or 64 bytes to be non-zero has a false failure rate\n     *   of at most 2^(-58) which is acceptable.\n     */\n    for( i = 0; i < 8; i++ )\n    {\n        if( ( ret = mbedtls_entropy_func( &ctx, buf, sizeof( buf ) ) ) != 0 )\n            goto cleanup;\n\n        for( j = 0; j < sizeof( buf ); j++ )\n            acc[j] |= buf[j];\n    }\n\n    for( j = 0; j < sizeof( buf ); j++ )\n    {\n        if( acc[j] == 0 )\n        {\n            ret = 1;\n            goto cleanup;\n        }\n    }\n\n#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)\n    if( ( ret = mbedtls_entropy_source_self_test( 0 ) ) != 0 )\n        goto cleanup;\n#endif\n\ncleanup:\n    mbedtls_entropy_free( &ctx );\n#endif /* !MBEDTLS_TEST_NULL_ENTROPY */\n\n    if( verbose != 0 )\n    {\n        if( ret != 0 )\n            mbedtls_printf( \"failed\\n\" );\n        else\n            mbedtls_printf( \"passed\\n\" );\n\n        mbedtls_printf( \"\\n\" );\n    }\n\n    return( ret != 0 );\n}\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_ENTROPY_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/entropy_poll.c",
    "content": "/*\n *  Platform-specific and custom entropy polling functions\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ENTROPY_C)\n\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/entropy_poll.h\"\n\n#if defined(MBEDTLS_TIMING_C)\n#include <string.h>\n#include \"mbedtls/timing.h\"\n#endif\n#if defined(MBEDTLS_HAVEGE_C)\n#include \"mbedtls/havege.h\"\n#endif\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\n#include \"mbedtls/platform.h\"\n#endif\n\n#if !defined(MBEDTLS_NO_PLATFORM_ENTROPY)\n\n#if !defined(unix) && !defined(__unix__) && !defined(__unix) && \\\n    !defined(__APPLE__) && !defined(_WIN32)\n#error \"Platform entropy sources only work on Unix and Windows, see MBEDTLS_NO_PLATFORM_ENTROPY in config.h\"\n#endif\n\n#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)\n\n#if !defined(_WIN32_WINNT)\n#define _WIN32_WINNT 0x0400\n#endif\n#include <windows.h>\n#include <wincrypt.h>\n\nint mbedtls_platform_entropy_poll( void *data, unsigned char *output, size_t len,\n                           size_t *olen )\n{\n    HCRYPTPROV provider;\n    ((void) data);\n    *olen = 0;\n\n    if( CryptAcquireContext( &provider, NULL, NULL,\n                              PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) == FALSE )\n    {\n        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );\n    }\n\n    if( CryptGenRandom( provider, (DWORD) len, output ) == FALSE )\n    {\n        CryptReleaseContext( provider, 0 );\n        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );\n    }\n\n    CryptReleaseContext( provider, 0 );\n    *olen = len;\n\n    return( 0 );\n}\n#else /* _WIN32 && !EFIX64 && !EFI32 */\n\n/*\n * Test for Linux getrandom() support.\n * Since there is no wrapper in the libc yet, use the generic syscall wrapper\n * available in GNU libc and compatible libc's (eg uClibc).\n */\n#if defined(__linux__) && defined(__GLIBC__)\n#include <unistd.h>\n#include <sys/syscall.h>\n#if defined(SYS_getrandom)\n#define HAVE_GETRANDOM\n\nstatic int getrandom_wrapper( void *buf, size_t buflen, unsigned int flags )\n{\n    /* MemSan cannot understand that the syscall writes to the buffer */\n#if defined(__has_feature)\n#if __has_feature(memory_sanitizer)\n    memset( buf, 0, buflen );\n#endif\n#endif\n\n    return( syscall( SYS_getrandom, buf, buflen, flags ) );\n}\n\n#include <sys/utsname.h>\n/* Check if version is at least 3.17.0 */\nstatic int check_version_3_17_plus( void )\n{\n    int minor;\n    struct utsname un;\n    const char *ver;\n\n    /* Get version information */\n    uname(&un);\n    ver = un.release;\n\n    /* Check major version; assume a single digit */\n    if( ver[0] < '3' || ver[0] > '9' || ver [1] != '.' )\n        return( -1 );\n\n    if( ver[0] - '0' > 3 )\n        return( 0 );\n\n    /* Ok, so now we know major == 3, check minor.\n     * Assume 1 or 2 digits. */\n    if( ver[2] < '0' || ver[2] > '9' )\n        return( -1 );\n\n    minor = ver[2] - '0';\n\n    if( ver[3] >= '0' && ver[3] <= '9' )\n        minor = 10 * minor + ver[3] - '0';\n    else if( ver [3] != '.' )\n        return( -1 );\n\n    if( minor < 17 )\n        return( -1 );\n\n    return( 0 );\n}\nstatic int has_getrandom = -1;\n#endif /* SYS_getrandom */\n#endif /* __linux__ */\n\n#include <stdio.h>\n\nint mbedtls_platform_entropy_poll( void *data,\n                           unsigned char *output, size_t len, size_t *olen )\n{\n    FILE *file;\n    size_t read_len;\n    ((void) data);\n\n#if defined(HAVE_GETRANDOM)\n    if( has_getrandom == -1 )\n        has_getrandom = ( check_version_3_17_plus() == 0 );\n\n    if( has_getrandom )\n    {\n        int ret;\n\n        if( ( ret = getrandom_wrapper( output, len, 0 ) ) < 0 )\n            return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );\n\n        *olen = ret;\n        return( 0 );\n    }\n#endif /* HAVE_GETRANDOM */\n\n    *olen = 0;\n\n    file = fopen( \"/dev/urandom\", \"rb\" );\n    if( file == NULL )\n        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );\n\n    read_len = fread( output, 1, len, file );\n    if( read_len != len )\n    {\n        fclose( file );\n        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );\n    }\n\n    fclose( file );\n    *olen = len;\n\n    return( 0 );\n}\n#endif /* _WIN32 && !EFIX64 && !EFI32 */\n#endif /* !MBEDTLS_NO_PLATFORM_ENTROPY */\n\n#if defined(MBEDTLS_TEST_NULL_ENTROPY)\nint mbedtls_null_entropy_poll( void *data,\n                    unsigned char *output, size_t len, size_t *olen )\n{\n    ((void) data);\n    ((void) output);\n    *olen = 0;\n\n    if( len < sizeof(unsigned char) )\n        return( 0 );\n\n    *olen = sizeof(unsigned char);\n\n    return( 0 );\n}\n#endif\n\n#if defined(MBEDTLS_TIMING_C)\nint mbedtls_hardclock_poll( void *data,\n                    unsigned char *output, size_t len, size_t *olen )\n{\n    unsigned long timer = mbedtls_timing_hardclock();\n    ((void) data);\n    *olen = 0;\n\n    if( len < sizeof(unsigned long) )\n        return( 0 );\n\n    memcpy( output, &timer, sizeof(unsigned long) );\n    *olen = sizeof(unsigned long);\n\n    return( 0 );\n}\n#endif /* MBEDTLS_TIMING_C */\n\n#if defined(MBEDTLS_HAVEGE_C)\nint mbedtls_havege_poll( void *data,\n                 unsigned char *output, size_t len, size_t *olen )\n{\n    mbedtls_havege_state *hs = (mbedtls_havege_state *) data;\n    *olen = 0;\n\n    if( mbedtls_havege_random( hs, output, len ) != 0 )\n        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );\n\n    *olen = len;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_HAVEGE_C */\n\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\nint mbedtls_nv_seed_poll( void *data,\n                          unsigned char *output, size_t len, size_t *olen )\n{\n    unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];\n    size_t use_len = MBEDTLS_ENTROPY_BLOCK_SIZE;\n    ((void) data);\n\n    memset( buf, 0, MBEDTLS_ENTROPY_BLOCK_SIZE );\n\n    if( mbedtls_nv_seed_read( buf, MBEDTLS_ENTROPY_BLOCK_SIZE ) < 0 )\n      return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );\n\n    if( len < use_len )\n      use_len = len;\n\n    memcpy( output, buf, use_len );\n    *olen = use_len;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_ENTROPY_NV_SEED */\n\n#endif /* MBEDTLS_ENTROPY_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/error.c",
    "content": "/*\n *  Error message information\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY)\n#include \"mbedtls/error.h\"\n#include <string.h>\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#define mbedtls_snprintf snprintf\n#define mbedtls_time_t   time_t\n#endif\n\n#if defined(MBEDTLS_ERROR_C)\n\n#include <stdio.h>\n\n#if defined(MBEDTLS_AES_C)\n#include \"mbedtls/aes.h\"\n#endif\n\n#if defined(MBEDTLS_BASE64_C)\n#include \"mbedtls/base64.h\"\n#endif\n\n#if defined(MBEDTLS_BIGNUM_C)\n#include \"mbedtls/bignum.h\"\n#endif\n\n#if defined(MBEDTLS_BLOWFISH_C)\n#include \"mbedtls/blowfish.h\"\n#endif\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#include \"mbedtls/camellia.h\"\n#endif\n\n#if defined(MBEDTLS_CCM_C)\n#include \"mbedtls/ccm.h\"\n#endif\n\n#if defined(MBEDTLS_CIPHER_C)\n#include \"mbedtls/cipher.h\"\n#endif\n\n#if defined(MBEDTLS_CTR_DRBG_C)\n#include \"mbedtls/ctr_drbg.h\"\n#endif\n\n#if defined(MBEDTLS_DES_C)\n#include \"mbedtls/des.h\"\n#endif\n\n#if defined(MBEDTLS_DHM_C)\n#include \"mbedtls/dhm.h\"\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n#include \"mbedtls/ecp.h\"\n#endif\n\n#if defined(MBEDTLS_ENTROPY_C)\n#include \"mbedtls/entropy.h\"\n#endif\n\n#if defined(MBEDTLS_GCM_C)\n#include \"mbedtls/gcm.h\"\n#endif\n\n#if defined(MBEDTLS_HMAC_DRBG_C)\n#include \"mbedtls/hmac_drbg.h\"\n#endif\n\n#if defined(MBEDTLS_MD_C)\n#include \"mbedtls/md.h\"\n#endif\n\n#if defined(MBEDTLS_NET_C)\n#include \"mbedtls/net_sockets.h\"\n#endif\n\n#if defined(MBEDTLS_OID_C)\n#include \"mbedtls/oid.h\"\n#endif\n\n#if defined(MBEDTLS_PADLOCK_C)\n#include \"mbedtls/padlock.h\"\n#endif\n\n#if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C)\n#include \"mbedtls/pem.h\"\n#endif\n\n#if defined(MBEDTLS_PK_C)\n#include \"mbedtls/pk.h\"\n#endif\n\n#if defined(MBEDTLS_PKCS12_C)\n#include \"mbedtls/pkcs12.h\"\n#endif\n\n#if defined(MBEDTLS_PKCS5_C)\n#include \"mbedtls/pkcs5.h\"\n#endif\n\n#if defined(MBEDTLS_RSA_C)\n#include \"mbedtls/rsa.h\"\n#endif\n\n#if defined(MBEDTLS_SSL_TLS_C)\n#include \"mbedtls/ssl.h\"\n#endif\n\n#if defined(MBEDTLS_THREADING_C)\n#include \"mbedtls/threading.h\"\n#endif\n\n#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)\n#include \"mbedtls/x509.h\"\n#endif\n\n#if defined(MBEDTLS_XTEA_C)\n#include \"mbedtls/xtea.h\"\n#endif\n\n\nvoid mbedtls_strerror( int ret, char *buf, size_t buflen )\n{\n    size_t len;\n    int use_ret;\n\n    if( buflen == 0 )\n        return;\n\n    memset( buf, 0x00, buflen );\n\n    if( ret < 0 )\n        ret = -ret;\n\n    if( ret & 0xFF80 )\n    {\n        use_ret = ret & 0xFF80;\n\n        // High level error codes\n        //\n        // BEGIN generated code\n#if defined(MBEDTLS_CIPHER_C)\n        if( use_ret == -(MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE) )\n            mbedtls_snprintf( buf, buflen, \"CIPHER - The selected feature is not available\" );\n        if( use_ret == -(MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"CIPHER - Bad input parameters to function\" );\n        if( use_ret == -(MBEDTLS_ERR_CIPHER_ALLOC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"CIPHER - Failed to allocate memory\" );\n        if( use_ret == -(MBEDTLS_ERR_CIPHER_INVALID_PADDING) )\n            mbedtls_snprintf( buf, buflen, \"CIPHER - Input data contains invalid padding and is rejected\" );\n        if( use_ret == -(MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED) )\n            mbedtls_snprintf( buf, buflen, \"CIPHER - Decryption of block requires a full block\" );\n        if( use_ret == -(MBEDTLS_ERR_CIPHER_AUTH_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"CIPHER - Authentication failed (for AEAD modes)\" );\n        if( use_ret == -(MBEDTLS_ERR_CIPHER_INVALID_CONTEXT) )\n            mbedtls_snprintf( buf, buflen, \"CIPHER - The context is invalid, eg because it was free()ed\" );\n#endif /* MBEDTLS_CIPHER_C */\n\n#if defined(MBEDTLS_DHM_C)\n        if( use_ret == -(MBEDTLS_ERR_DHM_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"DHM - Bad input parameters to function\" );\n        if( use_ret == -(MBEDTLS_ERR_DHM_READ_PARAMS_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"DHM - Reading of the DHM parameters failed\" );\n        if( use_ret == -(MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"DHM - Making of the DHM parameters failed\" );\n        if( use_ret == -(MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"DHM - Reading of the public values failed\" );\n        if( use_ret == -(MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"DHM - Making of the public value failed\" );\n        if( use_ret == -(MBEDTLS_ERR_DHM_CALC_SECRET_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"DHM - Calculation of the DHM secret failed\" );\n        if( use_ret == -(MBEDTLS_ERR_DHM_INVALID_FORMAT) )\n            mbedtls_snprintf( buf, buflen, \"DHM - The ASN.1 data is not formatted correctly\" );\n        if( use_ret == -(MBEDTLS_ERR_DHM_ALLOC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"DHM - Allocation of memory failed\" );\n        if( use_ret == -(MBEDTLS_ERR_DHM_FILE_IO_ERROR) )\n            mbedtls_snprintf( buf, buflen, \"DHM - Read/write of file failed\" );\n#endif /* MBEDTLS_DHM_C */\n\n#if defined(MBEDTLS_ECP_C)\n        if( use_ret == -(MBEDTLS_ERR_ECP_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"ECP - Bad input parameters to function\" );\n        if( use_ret == -(MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL) )\n            mbedtls_snprintf( buf, buflen, \"ECP - The buffer is too small to write to\" );\n        if( use_ret == -(MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE) )\n            mbedtls_snprintf( buf, buflen, \"ECP - Requested curve not available\" );\n        if( use_ret == -(MBEDTLS_ERR_ECP_VERIFY_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"ECP - The signature is not valid\" );\n        if( use_ret == -(MBEDTLS_ERR_ECP_ALLOC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"ECP - Memory allocation failed\" );\n        if( use_ret == -(MBEDTLS_ERR_ECP_RANDOM_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"ECP - Generation of random value, such as (ephemeral) key, failed\" );\n        if( use_ret == -(MBEDTLS_ERR_ECP_INVALID_KEY) )\n            mbedtls_snprintf( buf, buflen, \"ECP - Invalid private or public key\" );\n        if( use_ret == -(MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH) )\n            mbedtls_snprintf( buf, buflen, \"ECP - Signature is valid but shorter than the user-supplied length\" );\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_MD_C)\n        if( use_ret == -(MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE) )\n            mbedtls_snprintf( buf, buflen, \"MD - The selected feature is not available\" );\n        if( use_ret == -(MBEDTLS_ERR_MD_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"MD - Bad input parameters to function\" );\n        if( use_ret == -(MBEDTLS_ERR_MD_ALLOC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"MD - Failed to allocate memory\" );\n        if( use_ret == -(MBEDTLS_ERR_MD_FILE_IO_ERROR) )\n            mbedtls_snprintf( buf, buflen, \"MD - Opening or reading of file failed\" );\n#endif /* MBEDTLS_MD_C */\n\n#if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C)\n        if( use_ret == -(MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT) )\n            mbedtls_snprintf( buf, buflen, \"PEM - No PEM header or footer found\" );\n        if( use_ret == -(MBEDTLS_ERR_PEM_INVALID_DATA) )\n            mbedtls_snprintf( buf, buflen, \"PEM - PEM string is not as expected\" );\n        if( use_ret == -(MBEDTLS_ERR_PEM_ALLOC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"PEM - Failed to allocate memory\" );\n        if( use_ret == -(MBEDTLS_ERR_PEM_INVALID_ENC_IV) )\n            mbedtls_snprintf( buf, buflen, \"PEM - RSA IV is not in hex-format\" );\n        if( use_ret == -(MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG) )\n            mbedtls_snprintf( buf, buflen, \"PEM - Unsupported key encryption algorithm\" );\n        if( use_ret == -(MBEDTLS_ERR_PEM_PASSWORD_REQUIRED) )\n            mbedtls_snprintf( buf, buflen, \"PEM - Private key password can't be empty\" );\n        if( use_ret == -(MBEDTLS_ERR_PEM_PASSWORD_MISMATCH) )\n            mbedtls_snprintf( buf, buflen, \"PEM - Given private key password does not allow for correct decryption\" );\n        if( use_ret == -(MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE) )\n            mbedtls_snprintf( buf, buflen, \"PEM - Unavailable feature, e.g. hashing/encryption combination\" );\n        if( use_ret == -(MBEDTLS_ERR_PEM_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"PEM - Bad input parameters to function\" );\n#endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */\n\n#if defined(MBEDTLS_PK_C)\n        if( use_ret == -(MBEDTLS_ERR_PK_ALLOC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"PK - Memory allocation failed\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_TYPE_MISMATCH) )\n            mbedtls_snprintf( buf, buflen, \"PK - Type mismatch, eg attempt to encrypt with an ECDSA key\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"PK - Bad input parameters to function\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_FILE_IO_ERROR) )\n            mbedtls_snprintf( buf, buflen, \"PK - Read/write of file failed\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_KEY_INVALID_VERSION) )\n            mbedtls_snprintf( buf, buflen, \"PK - Unsupported key version\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_KEY_INVALID_FORMAT) )\n            mbedtls_snprintf( buf, buflen, \"PK - Invalid key tag or value\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_UNKNOWN_PK_ALG) )\n            mbedtls_snprintf( buf, buflen, \"PK - Key algorithm is unsupported (only RSA and EC are supported)\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_PASSWORD_REQUIRED) )\n            mbedtls_snprintf( buf, buflen, \"PK - Private key password can't be empty\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_PASSWORD_MISMATCH) )\n            mbedtls_snprintf( buf, buflen, \"PK - Given private key password does not allow for correct decryption\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_INVALID_PUBKEY) )\n            mbedtls_snprintf( buf, buflen, \"PK - The pubkey tag or value is invalid (only RSA and EC are supported)\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_INVALID_ALG) )\n            mbedtls_snprintf( buf, buflen, \"PK - The algorithm tag or value is invalid\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE) )\n            mbedtls_snprintf( buf, buflen, \"PK - Elliptic curve is unsupported (only NIST curves are supported)\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE) )\n            mbedtls_snprintf( buf, buflen, \"PK - Unavailable feature, e.g. RSA disabled for RSA key\" );\n        if( use_ret == -(MBEDTLS_ERR_PK_SIG_LEN_MISMATCH) )\n            mbedtls_snprintf( buf, buflen, \"PK - The signature is valid but its length is less than expected\" );\n#endif /* MBEDTLS_PK_C */\n\n#if defined(MBEDTLS_PKCS12_C)\n        if( use_ret == -(MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"PKCS12 - Bad input parameters to function\" );\n        if( use_ret == -(MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE) )\n            mbedtls_snprintf( buf, buflen, \"PKCS12 - Feature not available, e.g. unsupported encryption scheme\" );\n        if( use_ret == -(MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT) )\n            mbedtls_snprintf( buf, buflen, \"PKCS12 - PBE ASN.1 data not as expected\" );\n        if( use_ret == -(MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH) )\n            mbedtls_snprintf( buf, buflen, \"PKCS12 - Given private key password does not allow for correct decryption\" );\n#endif /* MBEDTLS_PKCS12_C */\n\n#if defined(MBEDTLS_PKCS5_C)\n        if( use_ret == -(MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"PKCS5 - Bad input parameters to function\" );\n        if( use_ret == -(MBEDTLS_ERR_PKCS5_INVALID_FORMAT) )\n            mbedtls_snprintf( buf, buflen, \"PKCS5 - Unexpected ASN.1 data\" );\n        if( use_ret == -(MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE) )\n            mbedtls_snprintf( buf, buflen, \"PKCS5 - Requested encryption or digest alg not available\" );\n        if( use_ret == -(MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH) )\n            mbedtls_snprintf( buf, buflen, \"PKCS5 - Given private key password does not allow for correct decryption\" );\n#endif /* MBEDTLS_PKCS5_C */\n\n#if defined(MBEDTLS_RSA_C)\n        if( use_ret == -(MBEDTLS_ERR_RSA_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"RSA - Bad input parameters to function\" );\n        if( use_ret == -(MBEDTLS_ERR_RSA_INVALID_PADDING) )\n            mbedtls_snprintf( buf, buflen, \"RSA - Input data contains invalid padding and is rejected\" );\n        if( use_ret == -(MBEDTLS_ERR_RSA_KEY_GEN_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"RSA - Something failed during generation of a key\" );\n        if( use_ret == -(MBEDTLS_ERR_RSA_KEY_CHECK_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"RSA - Key failed to pass the library's validity check\" );\n        if( use_ret == -(MBEDTLS_ERR_RSA_PUBLIC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"RSA - The public key operation failed\" );\n        if( use_ret == -(MBEDTLS_ERR_RSA_PRIVATE_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"RSA - The private key operation failed\" );\n        if( use_ret == -(MBEDTLS_ERR_RSA_VERIFY_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"RSA - The PKCS#1 verification failed\" );\n        if( use_ret == -(MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE) )\n            mbedtls_snprintf( buf, buflen, \"RSA - The output buffer for decryption is not large enough\" );\n        if( use_ret == -(MBEDTLS_ERR_RSA_RNG_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"RSA - The random generator failed to generate non-zeros\" );\n#endif /* MBEDTLS_RSA_C */\n\n#if defined(MBEDTLS_SSL_TLS_C)\n        if( use_ret == -(MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE) )\n            mbedtls_snprintf( buf, buflen, \"SSL - The requested feature is not available\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Bad input parameters to function\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_MAC) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Verification of the message MAC failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_RECORD) )\n            mbedtls_snprintf( buf, buflen, \"SSL - An invalid SSL record was received\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_CONN_EOF) )\n            mbedtls_snprintf( buf, buflen, \"SSL - The connection indicated an EOF\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_UNKNOWN_CIPHER) )\n            mbedtls_snprintf( buf, buflen, \"SSL - An unknown cipher was received\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN) )\n            mbedtls_snprintf( buf, buflen, \"SSL - The server has no ciphersuites in common with the client\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_NO_RNG) )\n            mbedtls_snprintf( buf, buflen, \"SSL - No RNG was provided to the SSL module\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE) )\n            mbedtls_snprintf( buf, buflen, \"SSL - No client certification received from the client, but required by the authentication mode\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Our own certificate(s) is/are too large to send in an SSL message\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED) )\n            mbedtls_snprintf( buf, buflen, \"SSL - The own certificate is not set, but needed by the server\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED) )\n            mbedtls_snprintf( buf, buflen, \"SSL - The own private key or pre-shared key is not set, but needed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED) )\n            mbedtls_snprintf( buf, buflen, \"SSL - No CA Chain is set, but required to operate\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE) )\n            mbedtls_snprintf( buf, buflen, \"SSL - An unexpected message was received from our peer\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE) )\n        {\n            mbedtls_snprintf( buf, buflen, \"SSL - A fatal alert message was received from our peer\" );\n            return;\n        }\n        if( use_ret == -(MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Verification of our peer failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) )\n            mbedtls_snprintf( buf, buflen, \"SSL - The peer notified us that the connection is going to be closed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the ClientHello handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the ServerHello handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the Certificate handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the CertificateRequest handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the ServerKeyExchange handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the ServerHelloDone handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the ClientKeyExchange handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Read Public\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the ClientKeyExchange handshake message failed in DHM / ECDH Calculate Secret\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the CertificateVerify handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the ChangeCipherSpec handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_FINISHED) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the Finished handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_ALLOC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Memory allocation failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_HW_ACCEL_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Hardware acceleration function returned with error\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Hardware acceleration function skipped / left alone data\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_COMPRESSION_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the compression / decompression failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Handshake protocol not within min/max boundaries\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Processing of the NewSessionTicket handshake message failed\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Session ticket has expired\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Public key type mismatch (eg, asked for RSA key exchange and presented EC key)\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Unknown identity received (eg, PSK identity)\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_INTERNAL_ERROR) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Internal error (eg, unexpected failure in lower-level module)\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_COUNTER_WRAPPING) )\n            mbedtls_snprintf( buf, buflen, \"SSL - A counter would wrap (eg, too many messages exchanged)\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Unexpected message at ServerHello in renegotiation\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED) )\n            mbedtls_snprintf( buf, buflen, \"SSL - DTLS client must retry for hello verification\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL) )\n            mbedtls_snprintf( buf, buflen, \"SSL - A buffer is too small to receive or write a message\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE) )\n            mbedtls_snprintf( buf, buflen, \"SSL - None of the common ciphersuites is usable (eg, no suitable certificate, see debug messages)\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_WANT_READ) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Connection requires a read call\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_WANT_WRITE) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Connection requires a write call\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_TIMEOUT) )\n            mbedtls_snprintf( buf, buflen, \"SSL - The operation timed out\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_CLIENT_RECONNECT) )\n            mbedtls_snprintf( buf, buflen, \"SSL - The client initiated a reconnect from the same port\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_UNEXPECTED_RECORD) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Record header looks valid but is not expected\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_NON_FATAL) )\n            mbedtls_snprintf( buf, buflen, \"SSL - The alert message received indicates a non-fatal error\" );\n        if( use_ret == -(MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH) )\n            mbedtls_snprintf( buf, buflen, \"SSL - Couldn't set the hash for verifying CertificateVerify\" );\n#endif /* MBEDTLS_SSL_TLS_C */\n\n#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)\n        if( use_ret == -(MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE) )\n            mbedtls_snprintf( buf, buflen, \"X509 - Unavailable feature, e.g. RSA hashing/encryption combination\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_OID) )\n            mbedtls_snprintf( buf, buflen, \"X509 - Requested OID is unknown\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_INVALID_FORMAT) )\n            mbedtls_snprintf( buf, buflen, \"X509 - The CRT/CRL/CSR format is invalid, e.g. different type expected\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_INVALID_VERSION) )\n            mbedtls_snprintf( buf, buflen, \"X509 - The CRT/CRL/CSR version element is invalid\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_INVALID_SERIAL) )\n            mbedtls_snprintf( buf, buflen, \"X509 - The serial tag or value is invalid\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_INVALID_ALG) )\n            mbedtls_snprintf( buf, buflen, \"X509 - The algorithm tag or value is invalid\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_INVALID_NAME) )\n            mbedtls_snprintf( buf, buflen, \"X509 - The name tag or value is invalid\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_INVALID_DATE) )\n            mbedtls_snprintf( buf, buflen, \"X509 - The date tag or value is invalid\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_INVALID_SIGNATURE) )\n            mbedtls_snprintf( buf, buflen, \"X509 - The signature tag or value invalid\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_INVALID_EXTENSIONS) )\n            mbedtls_snprintf( buf, buflen, \"X509 - The extension tag or value is invalid\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_VERSION) )\n            mbedtls_snprintf( buf, buflen, \"X509 - CRT/CRL/CSR has an unsupported version number\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG) )\n            mbedtls_snprintf( buf, buflen, \"X509 - Signature algorithm (oid) is unsupported\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_SIG_MISMATCH) )\n            mbedtls_snprintf( buf, buflen, \"X509 - Signature algorithms do not match. (see \\\\c ::mbedtls_x509_crt sig_oid)\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"X509 - Certificate verification failed, e.g. CRL, CA or signature check failed\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT) )\n            mbedtls_snprintf( buf, buflen, \"X509 - Format not recognized as DER or PEM\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_BAD_INPUT_DATA) )\n            mbedtls_snprintf( buf, buflen, \"X509 - Input invalid\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_ALLOC_FAILED) )\n            mbedtls_snprintf( buf, buflen, \"X509 - Allocation of memory failed\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_FILE_IO_ERROR) )\n            mbedtls_snprintf( buf, buflen, \"X509 - Read/write of file failed\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_BUFFER_TOO_SMALL) )\n            mbedtls_snprintf( buf, buflen, \"X509 - Destination buffer is too small\" );\n        if( use_ret == -(MBEDTLS_ERR_X509_FATAL_ERROR) )\n            mbedtls_snprintf( buf, buflen, \"X509 - A fatal error occured, eg the chain is too long or the vrfy callback failed\" );\n#endif /* MBEDTLS_X509_USE_C || MBEDTLS_X509_CREATE_C */\n        // END generated code\n\n        if( strlen( buf ) == 0 )\n            mbedtls_snprintf( buf, buflen, \"UNKNOWN ERROR CODE (%04X)\", use_ret );\n    }\n\n    use_ret = ret & ~0xFF80;\n\n    if( use_ret == 0 )\n        return;\n\n    // If high level code is present, make a concatenation between both\n    // error strings.\n    //\n    len = strlen( buf );\n\n    if( len > 0 )\n    {\n        if( buflen - len < 5 )\n            return;\n\n        mbedtls_snprintf( buf + len, buflen - len, \" : \" );\n\n        buf += len + 3;\n        buflen -= len + 3;\n    }\n\n    // Low level error codes\n    //\n    // BEGIN generated code\n#if defined(MBEDTLS_AES_C)\n    if( use_ret == -(MBEDTLS_ERR_AES_INVALID_KEY_LENGTH) )\n        mbedtls_snprintf( buf, buflen, \"AES - Invalid key length\" );\n    if( use_ret == -(MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH) )\n        mbedtls_snprintf( buf, buflen, \"AES - Invalid data input length\" );\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_ASN1_PARSE_C)\n    if( use_ret == -(MBEDTLS_ERR_ASN1_OUT_OF_DATA) )\n        mbedtls_snprintf( buf, buflen, \"ASN1 - Out of data when parsing an ASN1 data structure\" );\n    if( use_ret == -(MBEDTLS_ERR_ASN1_UNEXPECTED_TAG) )\n        mbedtls_snprintf( buf, buflen, \"ASN1 - ASN1 tag was of an unexpected value\" );\n    if( use_ret == -(MBEDTLS_ERR_ASN1_INVALID_LENGTH) )\n        mbedtls_snprintf( buf, buflen, \"ASN1 - Error when trying to determine the length or invalid length\" );\n    if( use_ret == -(MBEDTLS_ERR_ASN1_LENGTH_MISMATCH) )\n        mbedtls_snprintf( buf, buflen, \"ASN1 - Actual length differs from expected length\" );\n    if( use_ret == -(MBEDTLS_ERR_ASN1_INVALID_DATA) )\n        mbedtls_snprintf( buf, buflen, \"ASN1 - Data is invalid. (not used)\" );\n    if( use_ret == -(MBEDTLS_ERR_ASN1_ALLOC_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"ASN1 - Memory allocation failed\" );\n    if( use_ret == -(MBEDTLS_ERR_ASN1_BUF_TOO_SMALL) )\n        mbedtls_snprintf( buf, buflen, \"ASN1 - Buffer too small when writing ASN.1 data structure\" );\n#endif /* MBEDTLS_ASN1_PARSE_C */\n\n#if defined(MBEDTLS_BASE64_C)\n    if( use_ret == -(MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL) )\n        mbedtls_snprintf( buf, buflen, \"BASE64 - Output buffer too small\" );\n    if( use_ret == -(MBEDTLS_ERR_BASE64_INVALID_CHARACTER) )\n        mbedtls_snprintf( buf, buflen, \"BASE64 - Invalid character in input\" );\n#endif /* MBEDTLS_BASE64_C */\n\n#if defined(MBEDTLS_BIGNUM_C)\n    if( use_ret == -(MBEDTLS_ERR_MPI_FILE_IO_ERROR) )\n        mbedtls_snprintf( buf, buflen, \"BIGNUM - An error occurred while reading from or writing to a file\" );\n    if( use_ret == -(MBEDTLS_ERR_MPI_BAD_INPUT_DATA) )\n        mbedtls_snprintf( buf, buflen, \"BIGNUM - Bad input parameters to function\" );\n    if( use_ret == -(MBEDTLS_ERR_MPI_INVALID_CHARACTER) )\n        mbedtls_snprintf( buf, buflen, \"BIGNUM - There is an invalid character in the digit string\" );\n    if( use_ret == -(MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL) )\n        mbedtls_snprintf( buf, buflen, \"BIGNUM - The buffer is too small to write to\" );\n    if( use_ret == -(MBEDTLS_ERR_MPI_NEGATIVE_VALUE) )\n        mbedtls_snprintf( buf, buflen, \"BIGNUM - The input arguments are negative or result in illegal output\" );\n    if( use_ret == -(MBEDTLS_ERR_MPI_DIVISION_BY_ZERO) )\n        mbedtls_snprintf( buf, buflen, \"BIGNUM - The input argument for division is zero, which is not allowed\" );\n    if( use_ret == -(MBEDTLS_ERR_MPI_NOT_ACCEPTABLE) )\n        mbedtls_snprintf( buf, buflen, \"BIGNUM - The input arguments are not acceptable\" );\n    if( use_ret == -(MBEDTLS_ERR_MPI_ALLOC_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"BIGNUM - Memory allocation failed\" );\n#endif /* MBEDTLS_BIGNUM_C */\n\n#if defined(MBEDTLS_BLOWFISH_C)\n    if( use_ret == -(MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH) )\n        mbedtls_snprintf( buf, buflen, \"BLOWFISH - Invalid key length\" );\n    if( use_ret == -(MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH) )\n        mbedtls_snprintf( buf, buflen, \"BLOWFISH - Invalid data input length\" );\n#endif /* MBEDTLS_BLOWFISH_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n    if( use_ret == -(MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH) )\n        mbedtls_snprintf( buf, buflen, \"CAMELLIA - Invalid key length\" );\n    if( use_ret == -(MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH) )\n        mbedtls_snprintf( buf, buflen, \"CAMELLIA - Invalid data input length\" );\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_CCM_C)\n    if( use_ret == -(MBEDTLS_ERR_CCM_BAD_INPUT) )\n        mbedtls_snprintf( buf, buflen, \"CCM - Bad input parameters to function\" );\n    if( use_ret == -(MBEDTLS_ERR_CCM_AUTH_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"CCM - Authenticated decryption failed\" );\n#endif /* MBEDTLS_CCM_C */\n\n#if defined(MBEDTLS_CTR_DRBG_C)\n    if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"CTR_DRBG - The entropy source failed\" );\n    if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG) )\n        mbedtls_snprintf( buf, buflen, \"CTR_DRBG - Too many random requested in single call\" );\n    if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG) )\n        mbedtls_snprintf( buf, buflen, \"CTR_DRBG - Input too large (Entropy + additional)\" );\n    if( use_ret == -(MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR) )\n        mbedtls_snprintf( buf, buflen, \"CTR_DRBG - Read/write error in file\" );\n#endif /* MBEDTLS_CTR_DRBG_C */\n\n#if defined(MBEDTLS_DES_C)\n    if( use_ret == -(MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH) )\n        mbedtls_snprintf( buf, buflen, \"DES - The data input has an invalid length\" );\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_ENTROPY_C)\n    if( use_ret == -(MBEDTLS_ERR_ENTROPY_SOURCE_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"ENTROPY - Critical entropy source failure\" );\n    if( use_ret == -(MBEDTLS_ERR_ENTROPY_MAX_SOURCES) )\n        mbedtls_snprintf( buf, buflen, \"ENTROPY - No more sources can be added\" );\n    if( use_ret == -(MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED) )\n        mbedtls_snprintf( buf, buflen, \"ENTROPY - No sources have been added to poll\" );\n    if( use_ret == -(MBEDTLS_ERR_ENTROPY_NO_STRONG_SOURCE) )\n        mbedtls_snprintf( buf, buflen, \"ENTROPY - No strong sources have been added to poll\" );\n    if( use_ret == -(MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR) )\n        mbedtls_snprintf( buf, buflen, \"ENTROPY - Read/write error in file\" );\n#endif /* MBEDTLS_ENTROPY_C */\n\n#if defined(MBEDTLS_GCM_C)\n    if( use_ret == -(MBEDTLS_ERR_GCM_AUTH_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"GCM - Authenticated decryption failed\" );\n    if( use_ret == -(MBEDTLS_ERR_GCM_BAD_INPUT) )\n        mbedtls_snprintf( buf, buflen, \"GCM - Bad input parameters to function\" );\n#endif /* MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_HMAC_DRBG_C)\n    if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG) )\n        mbedtls_snprintf( buf, buflen, \"HMAC_DRBG - Too many random requested in single call\" );\n    if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG) )\n        mbedtls_snprintf( buf, buflen, \"HMAC_DRBG - Input too large (Entropy + additional)\" );\n    if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR) )\n        mbedtls_snprintf( buf, buflen, \"HMAC_DRBG - Read/write error in file\" );\n    if( use_ret == -(MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"HMAC_DRBG - The entropy source failed\" );\n#endif /* MBEDTLS_HMAC_DRBG_C */\n\n#if defined(MBEDTLS_NET_C)\n    if( use_ret == -(MBEDTLS_ERR_NET_SOCKET_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"NET - Failed to open a socket\" );\n    if( use_ret == -(MBEDTLS_ERR_NET_CONNECT_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"NET - The connection to the given server / port failed\" );\n    if( use_ret == -(MBEDTLS_ERR_NET_BIND_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"NET - Binding of the socket failed\" );\n    if( use_ret == -(MBEDTLS_ERR_NET_LISTEN_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"NET - Could not listen on the socket\" );\n    if( use_ret == -(MBEDTLS_ERR_NET_ACCEPT_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"NET - Could not accept the incoming connection\" );\n    if( use_ret == -(MBEDTLS_ERR_NET_RECV_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"NET - Reading information from the socket failed\" );\n    if( use_ret == -(MBEDTLS_ERR_NET_SEND_FAILED) )\n        mbedtls_snprintf( buf, buflen, \"NET - Sending information through the socket failed\" );\n    if( use_ret == -(MBEDTLS_ERR_NET_CONN_RESET) )\n        mbedtls_snprintf( buf, buflen, \"NET - Connection was reset by peer\" );\n    if( use_ret == -(MBEDTLS_ERR_NET_UNKNOWN_HOST) )\n        mbedtls_snprintf( buf, buflen, \"NET - Failed to get an IP address for the given hostname\" );\n    if( use_ret == -(MBEDTLS_ERR_NET_BUFFER_TOO_SMALL) )\n        mbedtls_snprintf( buf, buflen, \"NET - Buffer is too small to hold the data\" );\n    if( use_ret == -(MBEDTLS_ERR_NET_INVALID_CONTEXT) )\n        mbedtls_snprintf( buf, buflen, \"NET - The context is invalid, eg because it was free()ed\" );\n#endif /* MBEDTLS_NET_C */\n\n#if defined(MBEDTLS_OID_C)\n    if( use_ret == -(MBEDTLS_ERR_OID_NOT_FOUND) )\n        mbedtls_snprintf( buf, buflen, \"OID - OID is not found\" );\n    if( use_ret == -(MBEDTLS_ERR_OID_BUF_TOO_SMALL) )\n        mbedtls_snprintf( buf, buflen, \"OID - output buffer is too small\" );\n#endif /* MBEDTLS_OID_C */\n\n#if defined(MBEDTLS_PADLOCK_C)\n    if( use_ret == -(MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED) )\n        mbedtls_snprintf( buf, buflen, \"PADLOCK - Input data should be aligned\" );\n#endif /* MBEDTLS_PADLOCK_C */\n\n#if defined(MBEDTLS_THREADING_C)\n    if( use_ret == -(MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE) )\n        mbedtls_snprintf( buf, buflen, \"THREADING - The selected feature is not available\" );\n    if( use_ret == -(MBEDTLS_ERR_THREADING_BAD_INPUT_DATA) )\n        mbedtls_snprintf( buf, buflen, \"THREADING - Bad input parameters to function\" );\n    if( use_ret == -(MBEDTLS_ERR_THREADING_MUTEX_ERROR) )\n        mbedtls_snprintf( buf, buflen, \"THREADING - Locking / unlocking / free failed with error code\" );\n#endif /* MBEDTLS_THREADING_C */\n\n#if defined(MBEDTLS_XTEA_C)\n    if( use_ret == -(MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH) )\n        mbedtls_snprintf( buf, buflen, \"XTEA - The data input has an invalid length\" );\n#endif /* MBEDTLS_XTEA_C */\n    // END generated code\n\n    if( strlen( buf ) != 0 )\n        return;\n\n    mbedtls_snprintf( buf, buflen, \"UNKNOWN ERROR CODE (%04X)\", use_ret );\n}\n\n#else /* MBEDTLS_ERROR_C */\n\n#if defined(MBEDTLS_ERROR_STRERROR_DUMMY)\n\n/*\n * Provide an non-function in case MBEDTLS_ERROR_C is not defined\n */\nvoid mbedtls_strerror( int ret, char *buf, size_t buflen )\n{\n    ((void) ret);\n\n    if( buflen > 0 )\n        buf[0] = '\\0';\n}\n\n#endif /* MBEDTLS_ERROR_STRERROR_DUMMY */\n\n#endif /* MBEDTLS_ERROR_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/gcm.c",
    "content": "/*\n *  NIST SP800-38D compliant GCM implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf\n *\n * See also:\n * [MGV] http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf\n *\n * We use the algorithm described as Shoup's method with 4-bit tables in\n * [MGV] 4.1, pp. 12-13, to enhance speed without using too much memory.\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_GCM_C)\n\n#include \"mbedtls/gcm.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_AESNI_C)\n#include \"mbedtls/aesni.h\"\n#endif\n\n#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */\n\n/*\n * 32-bit integer manipulation macros (big endian)\n */\n#ifndef GET_UINT32_BE\n#define GET_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \\\n        | ( (uint32_t) (b)[(i) + 1] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 2] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 3]       );            \\\n}\n#endif\n\n#ifndef PUT_UINT32_BE\n#define PUT_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n)       );       \\\n}\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * Initialize a context\n */\nvoid mbedtls_gcm_init( mbedtls_gcm_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_gcm_context ) );\n}\n\n/*\n * Precompute small multiples of H, that is set\n *      HH[i] || HL[i] = H times i,\n * where i is seen as a field element as in [MGV], ie high-order bits\n * correspond to low powers of P. The result is stored in the same way, that\n * is the high-order bit of HH corresponds to P^0 and the low-order bit of HL\n * corresponds to P^127.\n */\nstatic int gcm_gen_table( mbedtls_gcm_context *ctx )\n{\n    int ret, i, j;\n    uint64_t hi, lo;\n    uint64_t vl, vh;\n    unsigned char h[16];\n    size_t olen = 0;\n\n    memset( h, 0, 16 );\n    if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, h, 16, h, &olen ) ) != 0 )\n        return( ret );\n\n    /* pack h as two 64-bits ints, big-endian */\n    GET_UINT32_BE( hi, h,  0  );\n    GET_UINT32_BE( lo, h,  4  );\n    vh = (uint64_t) hi << 32 | lo;\n\n    GET_UINT32_BE( hi, h,  8  );\n    GET_UINT32_BE( lo, h,  12 );\n    vl = (uint64_t) hi << 32 | lo;\n\n    /* 8 = 1000 corresponds to 1 in GF(2^128) */\n    ctx->HL[8] = vl;\n    ctx->HH[8] = vh;\n\n#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)\n    /* With CLMUL support, we need only h, not the rest of the table */\n    if( mbedtls_aesni_has_support( MBEDTLS_AESNI_CLMUL ) )\n        return( 0 );\n#endif\n\n    /* 0 corresponds to 0 in GF(2^128) */\n    ctx->HH[0] = 0;\n    ctx->HL[0] = 0;\n\n    for( i = 4; i > 0; i >>= 1 )\n    {\n        uint32_t T = ( vl & 1 ) * 0xe1000000U;\n        vl  = ( vh << 63 ) | ( vl >> 1 );\n        vh  = ( vh >> 1 ) ^ ( (uint64_t) T << 32);\n\n        ctx->HL[i] = vl;\n        ctx->HH[i] = vh;\n    }\n\n    for( i = 2; i <= 8; i *= 2 )\n    {\n        uint64_t *HiL = ctx->HL + i, *HiH = ctx->HH + i;\n        vh = *HiH;\n        vl = *HiL;\n        for( j = 1; j < i; j++ )\n        {\n            HiH[j] = vh ^ ctx->HH[j];\n            HiL[j] = vl ^ ctx->HL[j];\n        }\n    }\n\n    return( 0 );\n}\n\nint mbedtls_gcm_setkey( mbedtls_gcm_context *ctx,\n                        mbedtls_cipher_id_t cipher,\n                        const unsigned char *key,\n                        unsigned int keybits )\n{\n    int ret;\n    const mbedtls_cipher_info_t *cipher_info;\n\n    cipher_info = mbedtls_cipher_info_from_values( cipher, keybits, MBEDTLS_MODE_ECB );\n    if( cipher_info == NULL )\n        return( MBEDTLS_ERR_GCM_BAD_INPUT );\n\n    if( cipher_info->block_size != 16 )\n        return( MBEDTLS_ERR_GCM_BAD_INPUT );\n\n    mbedtls_cipher_free( &ctx->cipher_ctx );\n\n    if( ( ret = mbedtls_cipher_setup( &ctx->cipher_ctx, cipher_info ) ) != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_cipher_setkey( &ctx->cipher_ctx, key, keybits,\n                               MBEDTLS_ENCRYPT ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( ( ret = gcm_gen_table( ctx ) ) != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\n/*\n * Shoup's method for multiplication use this table with\n *      last4[x] = x times P^128\n * where x and last4[x] are seen as elements of GF(2^128) as in [MGV]\n */\nstatic const uint64_t last4[16] =\n{\n    0x0000, 0x1c20, 0x3840, 0x2460,\n    0x7080, 0x6ca0, 0x48c0, 0x54e0,\n    0xe100, 0xfd20, 0xd940, 0xc560,\n    0x9180, 0x8da0, 0xa9c0, 0xb5e0\n};\n\n/*\n * Sets output to x times H using the precomputed tables.\n * x and output are seen as elements of GF(2^128) as in [MGV].\n */\nstatic void gcm_mult( mbedtls_gcm_context *ctx, const unsigned char x[16],\n                      unsigned char output[16] )\n{\n    int i = 0;\n    unsigned char lo, hi, rem;\n    uint64_t zh, zl;\n\n#if defined(MBEDTLS_AESNI_C) && defined(MBEDTLS_HAVE_X86_64)\n    if( mbedtls_aesni_has_support( MBEDTLS_AESNI_CLMUL ) ) {\n        unsigned char h[16];\n\n        PUT_UINT32_BE( ctx->HH[8] >> 32, h,  0 );\n        PUT_UINT32_BE( ctx->HH[8],       h,  4 );\n        PUT_UINT32_BE( ctx->HL[8] >> 32, h,  8 );\n        PUT_UINT32_BE( ctx->HL[8],       h, 12 );\n\n        mbedtls_aesni_gcm_mult( output, x, h );\n        return;\n    }\n#endif /* MBEDTLS_AESNI_C && MBEDTLS_HAVE_X86_64 */\n\n    lo = x[15] & 0xf;\n\n    zh = ctx->HH[lo];\n    zl = ctx->HL[lo];\n\n    for( i = 15; i >= 0; i-- )\n    {\n        lo = x[i] & 0xf;\n        hi = x[i] >> 4;\n\n        if( i != 15 )\n        {\n            rem = (unsigned char) zl & 0xf;\n            zl = ( zh << 60 ) | ( zl >> 4 );\n            zh = ( zh >> 4 );\n            zh ^= (uint64_t) last4[rem] << 48;\n            zh ^= ctx->HH[lo];\n            zl ^= ctx->HL[lo];\n\n        }\n\n        rem = (unsigned char) zl & 0xf;\n        zl = ( zh << 60 ) | ( zl >> 4 );\n        zh = ( zh >> 4 );\n        zh ^= (uint64_t) last4[rem] << 48;\n        zh ^= ctx->HH[hi];\n        zl ^= ctx->HL[hi];\n    }\n\n    PUT_UINT32_BE( zh >> 32, output, 0 );\n    PUT_UINT32_BE( zh, output, 4 );\n    PUT_UINT32_BE( zl >> 32, output, 8 );\n    PUT_UINT32_BE( zl, output, 12 );\n}\n\nint mbedtls_gcm_starts( mbedtls_gcm_context *ctx,\n                int mode,\n                const unsigned char *iv,\n                size_t iv_len,\n                const unsigned char *add,\n                size_t add_len )\n{\n    int ret;\n    unsigned char work_buf[16];\n    size_t i;\n    const unsigned char *p;\n    size_t use_len, olen = 0;\n\n    /* IV and AD are limited to 2^64 bits, so 2^61 bytes */\n    /* IV is not allowed to be zero length */\n    if( iv_len == 0 ||\n      ( (uint64_t) iv_len  ) >> 61 != 0 ||\n      ( (uint64_t) add_len ) >> 61 != 0 )\n    {\n        return( MBEDTLS_ERR_GCM_BAD_INPUT );\n    }\n\n    memset( ctx->y, 0x00, sizeof(ctx->y) );\n    memset( ctx->buf, 0x00, sizeof(ctx->buf) );\n\n    ctx->mode = mode;\n    ctx->len = 0;\n    ctx->add_len = 0;\n\n    if( iv_len == 12 )\n    {\n        memcpy( ctx->y, iv, iv_len );\n        ctx->y[15] = 1;\n    }\n    else\n    {\n        memset( work_buf, 0x00, 16 );\n        PUT_UINT32_BE( iv_len * 8, work_buf, 12 );\n\n        p = iv;\n        while( iv_len > 0 )\n        {\n            use_len = ( iv_len < 16 ) ? iv_len : 16;\n\n            for( i = 0; i < use_len; i++ )\n                ctx->y[i] ^= p[i];\n\n            gcm_mult( ctx, ctx->y, ctx->y );\n\n            iv_len -= use_len;\n            p += use_len;\n        }\n\n        for( i = 0; i < 16; i++ )\n            ctx->y[i] ^= work_buf[i];\n\n        gcm_mult( ctx, ctx->y, ctx->y );\n    }\n\n    if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ctx->base_ectr,\n                             &olen ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    ctx->add_len = add_len;\n    p = add;\n    while( add_len > 0 )\n    {\n        use_len = ( add_len < 16 ) ? add_len : 16;\n\n        for( i = 0; i < use_len; i++ )\n            ctx->buf[i] ^= p[i];\n\n        gcm_mult( ctx, ctx->buf, ctx->buf );\n\n        add_len -= use_len;\n        p += use_len;\n    }\n\n    return( 0 );\n}\n\nint mbedtls_gcm_update( mbedtls_gcm_context *ctx,\n                size_t length,\n                const unsigned char *input,\n                unsigned char *output )\n{\n    int ret;\n    unsigned char ectr[16];\n    size_t i;\n    const unsigned char *p;\n    unsigned char *out_p = output;\n    size_t use_len, olen = 0;\n\n    if( output > input && (size_t) ( output - input ) < length )\n        return( MBEDTLS_ERR_GCM_BAD_INPUT );\n\n    /* Total length is restricted to 2^39 - 256 bits, ie 2^36 - 2^5 bytes\n     * Also check for possible overflow */\n    if( ctx->len + length < ctx->len ||\n        (uint64_t) ctx->len + length > 0xFFFFFFFE0ull )\n    {\n        return( MBEDTLS_ERR_GCM_BAD_INPUT );\n    }\n\n    ctx->len += length;\n\n    p = input;\n    while( length > 0 )\n    {\n        use_len = ( length < 16 ) ? length : 16;\n\n        for( i = 16; i > 12; i-- )\n            if( ++ctx->y[i - 1] != 0 )\n                break;\n\n        if( ( ret = mbedtls_cipher_update( &ctx->cipher_ctx, ctx->y, 16, ectr,\n                                   &olen ) ) != 0 )\n        {\n            return( ret );\n        }\n\n        for( i = 0; i < use_len; i++ )\n        {\n            if( ctx->mode == MBEDTLS_GCM_DECRYPT )\n                ctx->buf[i] ^= p[i];\n            out_p[i] = ectr[i] ^ p[i];\n            if( ctx->mode == MBEDTLS_GCM_ENCRYPT )\n                ctx->buf[i] ^= out_p[i];\n        }\n\n        gcm_mult( ctx, ctx->buf, ctx->buf );\n\n        length -= use_len;\n        p += use_len;\n        out_p += use_len;\n    }\n\n    return( 0 );\n}\n\nint mbedtls_gcm_finish( mbedtls_gcm_context *ctx,\n                unsigned char *tag,\n                size_t tag_len )\n{\n    unsigned char work_buf[16];\n    size_t i;\n    uint64_t orig_len = ctx->len * 8;\n    uint64_t orig_add_len = ctx->add_len * 8;\n\n    if( tag_len > 16 || tag_len < 4 )\n        return( MBEDTLS_ERR_GCM_BAD_INPUT );\n\n    memcpy( tag, ctx->base_ectr, tag_len );\n\n    if( orig_len || orig_add_len )\n    {\n        memset( work_buf, 0x00, 16 );\n\n        PUT_UINT32_BE( ( orig_add_len >> 32 ), work_buf, 0  );\n        PUT_UINT32_BE( ( orig_add_len       ), work_buf, 4  );\n        PUT_UINT32_BE( ( orig_len     >> 32 ), work_buf, 8  );\n        PUT_UINT32_BE( ( orig_len           ), work_buf, 12 );\n\n        for( i = 0; i < 16; i++ )\n            ctx->buf[i] ^= work_buf[i];\n\n        gcm_mult( ctx, ctx->buf, ctx->buf );\n\n        for( i = 0; i < tag_len; i++ )\n            tag[i] ^= ctx->buf[i];\n    }\n\n    return( 0 );\n}\n\nint mbedtls_gcm_crypt_and_tag( mbedtls_gcm_context *ctx,\n                       int mode,\n                       size_t length,\n                       const unsigned char *iv,\n                       size_t iv_len,\n                       const unsigned char *add,\n                       size_t add_len,\n                       const unsigned char *input,\n                       unsigned char *output,\n                       size_t tag_len,\n                       unsigned char *tag )\n{\n    int ret;\n\n    if( ( ret = mbedtls_gcm_starts( ctx, mode, iv, iv_len, add, add_len ) ) != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_gcm_update( ctx, length, input, output ) ) != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_gcm_finish( ctx, tag, tag_len ) ) != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\nint mbedtls_gcm_auth_decrypt( mbedtls_gcm_context *ctx,\n                      size_t length,\n                      const unsigned char *iv,\n                      size_t iv_len,\n                      const unsigned char *add,\n                      size_t add_len,\n                      const unsigned char *tag,\n                      size_t tag_len,\n                      const unsigned char *input,\n                      unsigned char *output )\n{\n    int ret;\n    unsigned char check_tag[16];\n    size_t i;\n    int diff;\n\n    if( ( ret = mbedtls_gcm_crypt_and_tag( ctx, MBEDTLS_GCM_DECRYPT, length,\n                                   iv, iv_len, add, add_len,\n                                   input, output, tag_len, check_tag ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    /* Check tag in \"constant-time\" */\n    for( diff = 0, i = 0; i < tag_len; i++ )\n        diff |= tag[i] ^ check_tag[i];\n\n    if( diff != 0 )\n    {\n        mbedtls_zeroize( output, length );\n        return( MBEDTLS_ERR_GCM_AUTH_FAILED );\n    }\n\n    return( 0 );\n}\n\nvoid mbedtls_gcm_free( mbedtls_gcm_context *ctx )\n{\n    mbedtls_cipher_free( &ctx->cipher_ctx );\n    mbedtls_zeroize( ctx, sizeof( mbedtls_gcm_context ) );\n}\n\n#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C)\n/*\n * AES-GCM test vectors from:\n *\n * http://csrc.nist.gov/groups/STM/cavp/documents/mac/gcmtestvectors.zip\n */\n#define MAX_TESTS   6\n\nstatic const int key_index[MAX_TESTS] =\n    { 0, 0, 1, 1, 1, 1 };\n\nstatic const unsigned char key[MAX_TESTS][32] =\n{\n    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },\n    { 0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,\n      0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,\n      0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,\n      0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08 },\n};\n\nstatic const size_t iv_len[MAX_TESTS] =\n    { 12, 12, 12, 12, 8, 60 };\n\nstatic const int iv_index[MAX_TESTS] =\n    { 0, 0, 1, 1, 1, 2 };\n\nstatic const unsigned char iv[MAX_TESTS][64] =\n{\n    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00 },\n    { 0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,\n      0xde, 0xca, 0xf8, 0x88 },\n    { 0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5,\n      0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa,\n      0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1,\n      0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28,\n      0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39,\n      0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54,\n      0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57,\n      0xa6, 0x37, 0xb3, 0x9b },\n};\n\nstatic const size_t add_len[MAX_TESTS] =\n    { 0, 0, 0, 20, 20, 20 };\n\nstatic const int add_index[MAX_TESTS] =\n    { 0, 0, 0, 1, 1, 1 };\n\nstatic const unsigned char additional[MAX_TESTS][64] =\n{\n    { 0x00 },\n    { 0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,\n      0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,\n      0xab, 0xad, 0xda, 0xd2 },\n};\n\nstatic const size_t pt_len[MAX_TESTS] =\n    { 0, 16, 64, 60, 60, 60 };\n\nstatic const int pt_index[MAX_TESTS] =\n    { 0, 0, 1, 1, 1, 1 };\n\nstatic const unsigned char pt[MAX_TESTS][64] =\n{\n    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },\n    { 0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,\n      0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,\n      0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,\n      0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,\n      0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,\n      0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,\n      0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,\n      0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55 },\n};\n\nstatic const unsigned char ct[MAX_TESTS * 3][64] =\n{\n    { 0x00 },\n    { 0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92,\n      0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78 },\n    { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,\n      0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,\n      0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,\n      0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,\n      0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,\n      0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,\n      0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,\n      0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85 },\n    { 0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,\n      0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,\n      0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,\n      0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,\n      0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,\n      0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,\n      0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,\n      0x3d, 0x58, 0xe0, 0x91 },\n    { 0x61, 0x35, 0x3b, 0x4c, 0x28, 0x06, 0x93, 0x4a,\n      0x77, 0x7f, 0xf5, 0x1f, 0xa2, 0x2a, 0x47, 0x55,\n      0x69, 0x9b, 0x2a, 0x71, 0x4f, 0xcd, 0xc6, 0xf8,\n      0x37, 0x66, 0xe5, 0xf9, 0x7b, 0x6c, 0x74, 0x23,\n      0x73, 0x80, 0x69, 0x00, 0xe4, 0x9f, 0x24, 0xb2,\n      0x2b, 0x09, 0x75, 0x44, 0xd4, 0x89, 0x6b, 0x42,\n      0x49, 0x89, 0xb5, 0xe1, 0xeb, 0xac, 0x0f, 0x07,\n      0xc2, 0x3f, 0x45, 0x98 },\n    { 0x8c, 0xe2, 0x49, 0x98, 0x62, 0x56, 0x15, 0xb6,\n      0x03, 0xa0, 0x33, 0xac, 0xa1, 0x3f, 0xb8, 0x94,\n      0xbe, 0x91, 0x12, 0xa5, 0xc3, 0xa2, 0x11, 0xa8,\n      0xba, 0x26, 0x2a, 0x3c, 0xca, 0x7e, 0x2c, 0xa7,\n      0x01, 0xe4, 0xa9, 0xa4, 0xfb, 0xa4, 0x3c, 0x90,\n      0xcc, 0xdc, 0xb2, 0x81, 0xd4, 0x8c, 0x7c, 0x6f,\n      0xd6, 0x28, 0x75, 0xd2, 0xac, 0xa4, 0x17, 0x03,\n      0x4c, 0x34, 0xae, 0xe5 },\n    { 0x00 },\n    { 0x98, 0xe7, 0x24, 0x7c, 0x07, 0xf0, 0xfe, 0x41,\n      0x1c, 0x26, 0x7e, 0x43, 0x84, 0xb0, 0xf6, 0x00 },\n    { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41,\n      0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57,\n      0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84,\n      0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c,\n      0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25,\n      0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47,\n      0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9,\n      0xcc, 0xda, 0x27, 0x10, 0xac, 0xad, 0xe2, 0x56 },\n    { 0x39, 0x80, 0xca, 0x0b, 0x3c, 0x00, 0xe8, 0x41,\n      0xeb, 0x06, 0xfa, 0xc4, 0x87, 0x2a, 0x27, 0x57,\n      0x85, 0x9e, 0x1c, 0xea, 0xa6, 0xef, 0xd9, 0x84,\n      0x62, 0x85, 0x93, 0xb4, 0x0c, 0xa1, 0xe1, 0x9c,\n      0x7d, 0x77, 0x3d, 0x00, 0xc1, 0x44, 0xc5, 0x25,\n      0xac, 0x61, 0x9d, 0x18, 0xc8, 0x4a, 0x3f, 0x47,\n      0x18, 0xe2, 0x44, 0x8b, 0x2f, 0xe3, 0x24, 0xd9,\n      0xcc, 0xda, 0x27, 0x10 },\n    { 0x0f, 0x10, 0xf5, 0x99, 0xae, 0x14, 0xa1, 0x54,\n      0xed, 0x24, 0xb3, 0x6e, 0x25, 0x32, 0x4d, 0xb8,\n      0xc5, 0x66, 0x63, 0x2e, 0xf2, 0xbb, 0xb3, 0x4f,\n      0x83, 0x47, 0x28, 0x0f, 0xc4, 0x50, 0x70, 0x57,\n      0xfd, 0xdc, 0x29, 0xdf, 0x9a, 0x47, 0x1f, 0x75,\n      0xc6, 0x65, 0x41, 0xd4, 0xd4, 0xda, 0xd1, 0xc9,\n      0xe9, 0x3a, 0x19, 0xa5, 0x8e, 0x8b, 0x47, 0x3f,\n      0xa0, 0xf0, 0x62, 0xf7 },\n    { 0xd2, 0x7e, 0x88, 0x68, 0x1c, 0xe3, 0x24, 0x3c,\n      0x48, 0x30, 0x16, 0x5a, 0x8f, 0xdc, 0xf9, 0xff,\n      0x1d, 0xe9, 0xa1, 0xd8, 0xe6, 0xb4, 0x47, 0xef,\n      0x6e, 0xf7, 0xb7, 0x98, 0x28, 0x66, 0x6e, 0x45,\n      0x81, 0xe7, 0x90, 0x12, 0xaf, 0x34, 0xdd, 0xd9,\n      0xe2, 0xf0, 0x37, 0x58, 0x9b, 0x29, 0x2d, 0xb3,\n      0xe6, 0x7c, 0x03, 0x67, 0x45, 0xfa, 0x22, 0xe7,\n      0xe9, 0xb7, 0x37, 0x3b },\n    { 0x00 },\n    { 0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e,\n      0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18 },\n    { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,\n      0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,\n      0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,\n      0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,\n      0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,\n      0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,\n      0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,\n      0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad },\n    { 0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,\n      0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,\n      0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,\n      0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,\n      0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,\n      0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,\n      0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,\n      0xbc, 0xc9, 0xf6, 0x62 },\n    { 0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32,\n      0xae, 0x47, 0xc1, 0x3b, 0xf1, 0x98, 0x44, 0xcb,\n      0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa,\n      0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0,\n      0xfe, 0xb5, 0x82, 0xd3, 0x39, 0x34, 0xa4, 0xf0,\n      0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78,\n      0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99,\n      0xf4, 0x7c, 0x9b, 0x1f },\n    { 0x5a, 0x8d, 0xef, 0x2f, 0x0c, 0x9e, 0x53, 0xf1,\n      0xf7, 0x5d, 0x78, 0x53, 0x65, 0x9e, 0x2a, 0x20,\n      0xee, 0xb2, 0xb2, 0x2a, 0xaf, 0xde, 0x64, 0x19,\n      0xa0, 0x58, 0xab, 0x4f, 0x6f, 0x74, 0x6b, 0xf4,\n      0x0f, 0xc0, 0xc3, 0xb7, 0x80, 0xf2, 0x44, 0x45,\n      0x2d, 0xa3, 0xeb, 0xf1, 0xc5, 0xd8, 0x2c, 0xde,\n      0xa2, 0x41, 0x89, 0x97, 0x20, 0x0e, 0xf8, 0x2e,\n      0x44, 0xae, 0x7e, 0x3f },\n};\n\nstatic const unsigned char tag[MAX_TESTS * 3][16] =\n{\n    { 0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61,\n      0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a },\n    { 0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd,\n      0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf },\n    { 0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6,\n      0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4 },\n    { 0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb,\n      0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47 },\n    { 0x36, 0x12, 0xd2, 0xe7, 0x9e, 0x3b, 0x07, 0x85,\n      0x56, 0x1b, 0xe1, 0x4a, 0xac, 0xa2, 0xfc, 0xcb },\n    { 0x61, 0x9c, 0xc5, 0xae, 0xff, 0xfe, 0x0b, 0xfa,\n      0x46, 0x2a, 0xf4, 0x3c, 0x16, 0x99, 0xd0, 0x50 },\n    { 0xcd, 0x33, 0xb2, 0x8a, 0xc7, 0x73, 0xf7, 0x4b,\n      0xa0, 0x0e, 0xd1, 0xf3, 0x12, 0x57, 0x24, 0x35 },\n    { 0x2f, 0xf5, 0x8d, 0x80, 0x03, 0x39, 0x27, 0xab,\n      0x8e, 0xf4, 0xd4, 0x58, 0x75, 0x14, 0xf0, 0xfb },\n    { 0x99, 0x24, 0xa7, 0xc8, 0x58, 0x73, 0x36, 0xbf,\n      0xb1, 0x18, 0x02, 0x4d, 0xb8, 0x67, 0x4a, 0x14 },\n    { 0x25, 0x19, 0x49, 0x8e, 0x80, 0xf1, 0x47, 0x8f,\n      0x37, 0xba, 0x55, 0xbd, 0x6d, 0x27, 0x61, 0x8c },\n    { 0x65, 0xdc, 0xc5, 0x7f, 0xcf, 0x62, 0x3a, 0x24,\n      0x09, 0x4f, 0xcc, 0xa4, 0x0d, 0x35, 0x33, 0xf8 },\n    { 0xdc, 0xf5, 0x66, 0xff, 0x29, 0x1c, 0x25, 0xbb,\n      0xb8, 0x56, 0x8f, 0xc3, 0xd3, 0x76, 0xa6, 0xd9 },\n    { 0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9,\n      0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b },\n    { 0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0,\n      0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19 },\n    { 0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd,\n      0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c },\n    { 0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68,\n      0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b },\n    { 0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4,\n      0x5e, 0x45, 0x49, 0x13, 0xfe, 0x2e, 0xa8, 0xf2 },\n    { 0xa4, 0x4a, 0x82, 0x66, 0xee, 0x1c, 0x8e, 0xb0,\n      0xc8, 0xb5, 0xd4, 0xcf, 0x5a, 0xe9, 0xf1, 0x9a },\n};\n\nint mbedtls_gcm_self_test( int verbose )\n{\n    mbedtls_gcm_context ctx;\n    unsigned char buf[64];\n    unsigned char tag_buf[16];\n    int i, j, ret;\n    mbedtls_cipher_id_t cipher = MBEDTLS_CIPHER_ID_AES;\n\n    mbedtls_gcm_init( &ctx );\n\n    for( j = 0; j < 3; j++ )\n    {\n        int key_len = 128 + 64 * j;\n\n        for( i = 0; i < MAX_TESTS; i++ )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"  AES-GCM-%3d #%d (%s): \",\n                                 key_len, i, \"enc\" );\n\n            mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len );\n\n            ret = mbedtls_gcm_crypt_and_tag( &ctx, MBEDTLS_GCM_ENCRYPT,\n                                     pt_len[i],\n                                     iv[iv_index[i]], iv_len[i],\n                                     additional[add_index[i]], add_len[i],\n                                     pt[pt_index[i]], buf, 16, tag_buf );\n\n            if( ret != 0 ||\n                memcmp( buf, ct[j * 6 + i], pt_len[i] ) != 0 ||\n                memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                return( 1 );\n            }\n\n            mbedtls_gcm_free( &ctx );\n\n            if( verbose != 0 )\n                mbedtls_printf( \"passed\\n\" );\n\n            if( verbose != 0 )\n                mbedtls_printf( \"  AES-GCM-%3d #%d (%s): \",\n                                 key_len, i, \"dec\" );\n\n            mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len );\n\n            ret = mbedtls_gcm_crypt_and_tag( &ctx, MBEDTLS_GCM_DECRYPT,\n                                     pt_len[i],\n                                     iv[iv_index[i]], iv_len[i],\n                                     additional[add_index[i]], add_len[i],\n                                     ct[j * 6 + i], buf, 16, tag_buf );\n\n            if( ret != 0 ||\n                memcmp( buf, pt[pt_index[i]], pt_len[i] ) != 0 ||\n                memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                return( 1 );\n            }\n\n            mbedtls_gcm_free( &ctx );\n\n            if( verbose != 0 )\n                mbedtls_printf( \"passed\\n\" );\n\n            if( verbose != 0 )\n                mbedtls_printf( \"  AES-GCM-%3d #%d split (%s): \",\n                                 key_len, i, \"enc\" );\n\n            mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len );\n\n            ret = mbedtls_gcm_starts( &ctx, MBEDTLS_GCM_ENCRYPT,\n                              iv[iv_index[i]], iv_len[i],\n                              additional[add_index[i]], add_len[i] );\n            if( ret != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                return( 1 );\n            }\n\n            if( pt_len[i] > 32 )\n            {\n                size_t rest_len = pt_len[i] - 32;\n                ret = mbedtls_gcm_update( &ctx, 32, pt[pt_index[i]], buf );\n                if( ret != 0 )\n                {\n                    if( verbose != 0 )\n                        mbedtls_printf( \"failed\\n\" );\n\n                    return( 1 );\n                }\n\n                ret = mbedtls_gcm_update( &ctx, rest_len, pt[pt_index[i]] + 32,\n                                  buf + 32 );\n                if( ret != 0 )\n                {\n                    if( verbose != 0 )\n                        mbedtls_printf( \"failed\\n\" );\n\n                    return( 1 );\n                }\n            }\n            else\n            {\n                ret = mbedtls_gcm_update( &ctx, pt_len[i], pt[pt_index[i]], buf );\n                if( ret != 0 )\n                {\n                    if( verbose != 0 )\n                        mbedtls_printf( \"failed\\n\" );\n\n                    return( 1 );\n                }\n            }\n\n            ret = mbedtls_gcm_finish( &ctx, tag_buf, 16 );\n            if( ret != 0 ||\n                memcmp( buf, ct[j * 6 + i], pt_len[i] ) != 0 ||\n                memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                return( 1 );\n            }\n\n            mbedtls_gcm_free( &ctx );\n\n            if( verbose != 0 )\n                mbedtls_printf( \"passed\\n\" );\n\n            if( verbose != 0 )\n                mbedtls_printf( \"  AES-GCM-%3d #%d split (%s): \",\n                                 key_len, i, \"dec\" );\n\n            mbedtls_gcm_setkey( &ctx, cipher, key[key_index[i]], key_len );\n\n            ret = mbedtls_gcm_starts( &ctx, MBEDTLS_GCM_DECRYPT,\n                              iv[iv_index[i]], iv_len[i],\n                              additional[add_index[i]], add_len[i] );\n            if( ret != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                return( 1 );\n            }\n\n            if( pt_len[i] > 32 )\n            {\n                size_t rest_len = pt_len[i] - 32;\n                ret = mbedtls_gcm_update( &ctx, 32, ct[j * 6 + i], buf );\n                if( ret != 0 )\n                {\n                    if( verbose != 0 )\n                        mbedtls_printf( \"failed\\n\" );\n\n                    return( 1 );\n                }\n\n                ret = mbedtls_gcm_update( &ctx, rest_len, ct[j * 6 + i] + 32,\n                                  buf + 32 );\n                if( ret != 0 )\n                {\n                    if( verbose != 0 )\n                        mbedtls_printf( \"failed\\n\" );\n\n                    return( 1 );\n                }\n            }\n            else\n            {\n                ret = mbedtls_gcm_update( &ctx, pt_len[i], ct[j * 6 + i], buf );\n                if( ret != 0 )\n                {\n                    if( verbose != 0 )\n                        mbedtls_printf( \"failed\\n\" );\n\n                    return( 1 );\n                }\n            }\n\n            ret = mbedtls_gcm_finish( &ctx, tag_buf, 16 );\n            if( ret != 0 ||\n                memcmp( buf, pt[pt_index[i]], pt_len[i] ) != 0 ||\n                memcmp( tag_buf, tag[j * 6 + i], 16 ) != 0 )\n            {\n                if( verbose != 0 )\n                    mbedtls_printf( \"failed\\n\" );\n\n                return( 1 );\n            }\n\n            mbedtls_gcm_free( &ctx );\n\n            if( verbose != 0 )\n                mbedtls_printf( \"passed\\n\" );\n\n        }\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */\n\n#endif /* MBEDTLS_GCM_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/havege.c",
    "content": "/**\n *  \\brief HAVEGE: HArdware Volatile Entropy Gathering and Expansion\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The HAVEGE RNG was designed by Andre Seznec in 2002.\n *\n *  http://www.irisa.fr/caps/projects/hipsor/publi.php\n *\n *  Contact: seznec(at)irisa_dot_fr - orocheco(at)irisa_dot_fr\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_HAVEGE_C)\n\n#include \"mbedtls/havege.h\"\n#include \"mbedtls/timing.h\"\n\n#include <string.h>\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/* ------------------------------------------------------------------------\n * On average, one iteration accesses two 8-word blocks in the havege WALK\n * table, and generates 16 words in the RES array.\n *\n * The data read in the WALK table is updated and permuted after each use.\n * The result of the hardware clock counter read is used  for this update.\n *\n * 25 conditional tests are present.  The conditional tests are grouped in\n * two nested  groups of 12 conditional tests and 1 test that controls the\n * permutation; on average, there should be 6 tests executed and 3 of them\n * should be mispredicted.\n * ------------------------------------------------------------------------\n */\n\n#define SWAP(X,Y) { int *T = X; X = Y; Y = T; }\n\n#define TST1_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1;\n#define TST2_ENTER if( PTEST & 1 ) { PTEST ^= 3; PTEST >>= 1;\n\n#define TST1_LEAVE U1++; }\n#define TST2_LEAVE U2++; }\n\n#define ONE_ITERATION                                   \\\n                                                        \\\n    PTEST = PT1 >> 20;                                  \\\n                                                        \\\n    TST1_ENTER  TST1_ENTER  TST1_ENTER  TST1_ENTER      \\\n    TST1_ENTER  TST1_ENTER  TST1_ENTER  TST1_ENTER      \\\n    TST1_ENTER  TST1_ENTER  TST1_ENTER  TST1_ENTER      \\\n                                                        \\\n    TST1_LEAVE  TST1_LEAVE  TST1_LEAVE  TST1_LEAVE      \\\n    TST1_LEAVE  TST1_LEAVE  TST1_LEAVE  TST1_LEAVE      \\\n    TST1_LEAVE  TST1_LEAVE  TST1_LEAVE  TST1_LEAVE      \\\n                                                        \\\n    PTX = (PT1 >> 18) & 7;                              \\\n    PT1 &= 0x1FFF;                                      \\\n    PT2 &= 0x1FFF;                                      \\\n    CLK = (int) mbedtls_timing_hardclock();                            \\\n                                                        \\\n    i = 0;                                              \\\n    A = &WALK[PT1    ]; RES[i++] ^= *A;                 \\\n    B = &WALK[PT2    ]; RES[i++] ^= *B;                 \\\n    C = &WALK[PT1 ^ 1]; RES[i++] ^= *C;                 \\\n    D = &WALK[PT2 ^ 4]; RES[i++] ^= *D;                 \\\n                                                        \\\n    IN = (*A >> (1)) ^ (*A << (31)) ^ CLK;              \\\n    *A = (*B >> (2)) ^ (*B << (30)) ^ CLK;              \\\n    *B = IN ^ U1;                                       \\\n    *C = (*C >> (3)) ^ (*C << (29)) ^ CLK;              \\\n    *D = (*D >> (4)) ^ (*D << (28)) ^ CLK;              \\\n                                                        \\\n    A = &WALK[PT1 ^ 2]; RES[i++] ^= *A;                 \\\n    B = &WALK[PT2 ^ 2]; RES[i++] ^= *B;                 \\\n    C = &WALK[PT1 ^ 3]; RES[i++] ^= *C;                 \\\n    D = &WALK[PT2 ^ 6]; RES[i++] ^= *D;                 \\\n                                                        \\\n    if( PTEST & 1 ) SWAP( A, C );                       \\\n                                                        \\\n    IN = (*A >> (5)) ^ (*A << (27)) ^ CLK;              \\\n    *A = (*B >> (6)) ^ (*B << (26)) ^ CLK;              \\\n    *B = IN; CLK = (int) mbedtls_timing_hardclock();                   \\\n    *C = (*C >> (7)) ^ (*C << (25)) ^ CLK;              \\\n    *D = (*D >> (8)) ^ (*D << (24)) ^ CLK;              \\\n                                                        \\\n    A = &WALK[PT1 ^ 4];                                 \\\n    B = &WALK[PT2 ^ 1];                                 \\\n                                                        \\\n    PTEST = PT2 >> 1;                                   \\\n                                                        \\\n    PT2 = (RES[(i - 8) ^ PTY] ^ WALK[PT2 ^ PTY ^ 7]);   \\\n    PT2 = ((PT2 & 0x1FFF) & (~8)) ^ ((PT1 ^ 8) & 0x8);  \\\n    PTY = (PT2 >> 10) & 7;                              \\\n                                                        \\\n    TST2_ENTER  TST2_ENTER  TST2_ENTER  TST2_ENTER      \\\n    TST2_ENTER  TST2_ENTER  TST2_ENTER  TST2_ENTER      \\\n    TST2_ENTER  TST2_ENTER  TST2_ENTER  TST2_ENTER      \\\n                                                        \\\n    TST2_LEAVE  TST2_LEAVE  TST2_LEAVE  TST2_LEAVE      \\\n    TST2_LEAVE  TST2_LEAVE  TST2_LEAVE  TST2_LEAVE      \\\n    TST2_LEAVE  TST2_LEAVE  TST2_LEAVE  TST2_LEAVE      \\\n                                                        \\\n    C = &WALK[PT1 ^ 5];                                 \\\n    D = &WALK[PT2 ^ 5];                                 \\\n                                                        \\\n    RES[i++] ^= *A;                                     \\\n    RES[i++] ^= *B;                                     \\\n    RES[i++] ^= *C;                                     \\\n    RES[i++] ^= *D;                                     \\\n                                                        \\\n    IN = (*A >> ( 9)) ^ (*A << (23)) ^ CLK;             \\\n    *A = (*B >> (10)) ^ (*B << (22)) ^ CLK;             \\\n    *B = IN ^ U2;                                       \\\n    *C = (*C >> (11)) ^ (*C << (21)) ^ CLK;             \\\n    *D = (*D >> (12)) ^ (*D << (20)) ^ CLK;             \\\n                                                        \\\n    A = &WALK[PT1 ^ 6]; RES[i++] ^= *A;                 \\\n    B = &WALK[PT2 ^ 3]; RES[i++] ^= *B;                 \\\n    C = &WALK[PT1 ^ 7]; RES[i++] ^= *C;                 \\\n    D = &WALK[PT2 ^ 7]; RES[i++] ^= *D;                 \\\n                                                        \\\n    IN = (*A >> (13)) ^ (*A << (19)) ^ CLK;             \\\n    *A = (*B >> (14)) ^ (*B << (18)) ^ CLK;             \\\n    *B = IN;                                            \\\n    *C = (*C >> (15)) ^ (*C << (17)) ^ CLK;             \\\n    *D = (*D >> (16)) ^ (*D << (16)) ^ CLK;             \\\n                                                        \\\n    PT1 = ( RES[( i - 8 ) ^ PTX] ^                      \\\n            WALK[PT1 ^ PTX ^ 7] ) & (~1);               \\\n    PT1 ^= (PT2 ^ 0x10) & 0x10;                         \\\n                                                        \\\n    for( n++, i = 0; i < 16; i++ )                      \\\n        hs->pool[n % MBEDTLS_HAVEGE_COLLECT_SIZE] ^= RES[i];\n\n/*\n * Entropy gathering function\n */\nstatic void havege_fill( mbedtls_havege_state *hs )\n{\n    int i, n = 0;\n    int  U1,  U2, *A, *B, *C, *D;\n    int PT1, PT2, *WALK, RES[16];\n    int PTX, PTY, CLK, PTEST, IN;\n\n    WALK = hs->WALK;\n    PT1  = hs->PT1;\n    PT2  = hs->PT2;\n\n    PTX  = U1 = 0;\n    PTY  = U2 = 0;\n\n    (void)PTX;\n\n    memset( RES, 0, sizeof( RES ) );\n\n    while( n < MBEDTLS_HAVEGE_COLLECT_SIZE * 4 )\n    {\n        ONE_ITERATION\n        ONE_ITERATION\n        ONE_ITERATION\n        ONE_ITERATION\n    }\n\n    hs->PT1 = PT1;\n    hs->PT2 = PT2;\n\n    hs->offset[0] = 0;\n    hs->offset[1] = MBEDTLS_HAVEGE_COLLECT_SIZE / 2;\n}\n\n/*\n * HAVEGE initialization\n */\nvoid mbedtls_havege_init( mbedtls_havege_state *hs )\n{\n    memset( hs, 0, sizeof( mbedtls_havege_state ) );\n\n    havege_fill( hs );\n}\n\nvoid mbedtls_havege_free( mbedtls_havege_state *hs )\n{\n    if( hs == NULL )\n        return;\n\n    mbedtls_zeroize( hs, sizeof( mbedtls_havege_state ) );\n}\n\n/*\n * HAVEGE rand function\n */\nint mbedtls_havege_random( void *p_rng, unsigned char *buf, size_t len )\n{\n    int val;\n    size_t use_len;\n    mbedtls_havege_state *hs = (mbedtls_havege_state *) p_rng;\n    unsigned char *p = buf;\n\n    while( len > 0 )\n    {\n        use_len = len;\n        if( use_len > sizeof(int) )\n            use_len = sizeof(int);\n\n        if( hs->offset[1] >= MBEDTLS_HAVEGE_COLLECT_SIZE )\n            havege_fill( hs );\n\n        val  = hs->pool[hs->offset[0]++];\n        val ^= hs->pool[hs->offset[1]++];\n\n        memcpy( p, &val, use_len );\n\n        len -= use_len;\n        p += use_len;\n    }\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_HAVEGE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/hmac_drbg.c",
    "content": "/*\n *  HMAC_DRBG implementation (NIST SP 800-90)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n *  The NIST SP 800-90A DRBGs are described in the following publication.\n *  http://csrc.nist.gov/publications/nistpubs/800-90A/SP800-90A.pdf\n *  References below are based on rev. 1 (January 2012).\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_HMAC_DRBG_C)\n\n#include \"mbedtls/hmac_drbg.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_FS_IO)\n#include <stdio.h>\n#endif\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_SELF_TEST */\n#endif /* MBEDTLS_PLATFORM_C */\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * HMAC_DRBG context initialization\n */\nvoid mbedtls_hmac_drbg_init( mbedtls_hmac_drbg_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_hmac_drbg_context ) );\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_init( &ctx->mutex );\n#endif\n}\n\n/*\n * HMAC_DRBG update, using optional additional data (10.1.2.2)\n */\nvoid mbedtls_hmac_drbg_update( mbedtls_hmac_drbg_context *ctx,\n                       const unsigned char *additional, size_t add_len )\n{\n    size_t md_len = mbedtls_md_get_size( ctx->md_ctx.md_info );\n    unsigned char rounds = ( additional != NULL && add_len != 0 ) ? 2 : 1;\n    unsigned char sep[1];\n    unsigned char K[MBEDTLS_MD_MAX_SIZE];\n\n    for( sep[0] = 0; sep[0] < rounds; sep[0]++ )\n    {\n        /* Step 1 or 4 */\n        mbedtls_md_hmac_reset( &ctx->md_ctx );\n        mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len );\n        mbedtls_md_hmac_update( &ctx->md_ctx, sep, 1 );\n        if( rounds == 2 )\n            mbedtls_md_hmac_update( &ctx->md_ctx, additional, add_len );\n        mbedtls_md_hmac_finish( &ctx->md_ctx, K );\n\n        /* Step 2 or 5 */\n        mbedtls_md_hmac_starts( &ctx->md_ctx, K, md_len );\n        mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len );\n        mbedtls_md_hmac_finish( &ctx->md_ctx, ctx->V );\n    }\n}\n\n/*\n * Simplified HMAC_DRBG initialisation (for use with deterministic ECDSA)\n */\nint mbedtls_hmac_drbg_seed_buf( mbedtls_hmac_drbg_context *ctx,\n                        const mbedtls_md_info_t * md_info,\n                        const unsigned char *data, size_t data_len )\n{\n    int ret;\n\n    if( ( ret = mbedtls_md_setup( &ctx->md_ctx, md_info, 1 ) ) != 0 )\n        return( ret );\n\n    /*\n     * Set initial working state.\n     * Use the V memory location, which is currently all 0, to initialize the\n     * MD context with an all-zero key. Then set V to its initial value.\n     */\n    mbedtls_md_hmac_starts( &ctx->md_ctx, ctx->V, mbedtls_md_get_size( md_info ) );\n    memset( ctx->V, 0x01, mbedtls_md_get_size( md_info ) );\n\n    mbedtls_hmac_drbg_update( ctx, data, data_len );\n\n    return( 0 );\n}\n\n/*\n * HMAC_DRBG reseeding: 10.1.2.4 (arabic) + 9.2 (Roman)\n */\nint mbedtls_hmac_drbg_reseed( mbedtls_hmac_drbg_context *ctx,\n                      const unsigned char *additional, size_t len )\n{\n    unsigned char seed[MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT];\n    size_t seedlen;\n\n    /* III. Check input length */\n    if( len > MBEDTLS_HMAC_DRBG_MAX_INPUT ||\n        ctx->entropy_len + len > MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT )\n    {\n        return( MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG );\n    }\n\n    memset( seed, 0, MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT );\n\n    /* IV. Gather entropy_len bytes of entropy for the seed */\n    if( ctx->f_entropy( ctx->p_entropy, seed, ctx->entropy_len ) != 0 )\n        return( MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED );\n\n    seedlen = ctx->entropy_len;\n\n    /* 1. Concatenate entropy and additional data if any */\n    if( additional != NULL && len != 0 )\n    {\n        memcpy( seed + seedlen, additional, len );\n        seedlen += len;\n    }\n\n    /* 2. Update state */\n    mbedtls_hmac_drbg_update( ctx, seed, seedlen );\n\n    /* 3. Reset reseed_counter */\n    ctx->reseed_counter = 1;\n\n    /* 4. Done */\n    return( 0 );\n}\n\n/*\n * HMAC_DRBG initialisation (10.1.2.3 + 9.1)\n */\nint mbedtls_hmac_drbg_seed( mbedtls_hmac_drbg_context *ctx,\n                    const mbedtls_md_info_t * md_info,\n                    int (*f_entropy)(void *, unsigned char *, size_t),\n                    void *p_entropy,\n                    const unsigned char *custom,\n                    size_t len )\n{\n    int ret;\n    size_t entropy_len, md_size;\n\n    if( ( ret = mbedtls_md_setup( &ctx->md_ctx, md_info, 1 ) ) != 0 )\n        return( ret );\n\n    md_size = mbedtls_md_get_size( md_info );\n\n    /*\n     * Set initial working state.\n     * Use the V memory location, which is currently all 0, to initialize the\n     * MD context with an all-zero key. Then set V to its initial value.\n     */\n    mbedtls_md_hmac_starts( &ctx->md_ctx, ctx->V, md_size );\n    memset( ctx->V, 0x01, md_size );\n\n    ctx->f_entropy = f_entropy;\n    ctx->p_entropy = p_entropy;\n\n    ctx->reseed_interval = MBEDTLS_HMAC_DRBG_RESEED_INTERVAL;\n\n    /*\n     * See SP800-57 5.6.1 (p. 65-66) for the security strength provided by\n     * each hash function, then according to SP800-90A rev1 10.1 table 2,\n     * min_entropy_len (in bits) is security_strength.\n     *\n     * (This also matches the sizes used in the NIST test vectors.)\n     */\n    entropy_len = md_size <= 20 ? 16 : /* 160-bits hash -> 128 bits */\n                  md_size <= 28 ? 24 : /* 224-bits hash -> 192 bits */\n                                  32;  /* better (256+) -> 256 bits */\n\n    /*\n     * For initialisation, use more entropy to emulate a nonce\n     * (Again, matches test vectors.)\n     */\n    ctx->entropy_len = entropy_len * 3 / 2;\n\n    if( ( ret = mbedtls_hmac_drbg_reseed( ctx, custom, len ) ) != 0 )\n        return( ret );\n\n    ctx->entropy_len = entropy_len;\n\n    return( 0 );\n}\n\n/*\n * Set prediction resistance\n */\nvoid mbedtls_hmac_drbg_set_prediction_resistance( mbedtls_hmac_drbg_context *ctx,\n                                          int resistance )\n{\n    ctx->prediction_resistance = resistance;\n}\n\n/*\n * Set entropy length grabbed for reseeds\n */\nvoid mbedtls_hmac_drbg_set_entropy_len( mbedtls_hmac_drbg_context *ctx, size_t len )\n{\n    ctx->entropy_len = len;\n}\n\n/*\n * Set reseed interval\n */\nvoid mbedtls_hmac_drbg_set_reseed_interval( mbedtls_hmac_drbg_context *ctx, int interval )\n{\n    ctx->reseed_interval = interval;\n}\n\n/*\n * HMAC_DRBG random function with optional additional data:\n * 10.1.2.5 (arabic) + 9.3 (Roman)\n */\nint mbedtls_hmac_drbg_random_with_add( void *p_rng,\n                               unsigned char *output, size_t out_len,\n                               const unsigned char *additional, size_t add_len )\n{\n    int ret;\n    mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng;\n    size_t md_len = mbedtls_md_get_size( ctx->md_ctx.md_info );\n    size_t left = out_len;\n    unsigned char *out = output;\n\n    /* II. Check request length */\n    if( out_len > MBEDTLS_HMAC_DRBG_MAX_REQUEST )\n        return( MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG );\n\n    /* III. Check input length */\n    if( add_len > MBEDTLS_HMAC_DRBG_MAX_INPUT )\n        return( MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG );\n\n    /* 1. (aka VII and IX) Check reseed counter and PR */\n    if( ctx->f_entropy != NULL && /* For no-reseeding instances */\n        ( ctx->prediction_resistance == MBEDTLS_HMAC_DRBG_PR_ON ||\n          ctx->reseed_counter > ctx->reseed_interval ) )\n    {\n        if( ( ret = mbedtls_hmac_drbg_reseed( ctx, additional, add_len ) ) != 0 )\n            return( ret );\n\n        add_len = 0; /* VII.4 */\n    }\n\n    /* 2. Use additional data if any */\n    if( additional != NULL && add_len != 0 )\n        mbedtls_hmac_drbg_update( ctx, additional, add_len );\n\n    /* 3, 4, 5. Generate bytes */\n    while( left != 0 )\n    {\n        size_t use_len = left > md_len ? md_len : left;\n\n        mbedtls_md_hmac_reset( &ctx->md_ctx );\n        mbedtls_md_hmac_update( &ctx->md_ctx, ctx->V, md_len );\n        mbedtls_md_hmac_finish( &ctx->md_ctx, ctx->V );\n\n        memcpy( out, ctx->V, use_len );\n        out += use_len;\n        left -= use_len;\n    }\n\n    /* 6. Update */\n    mbedtls_hmac_drbg_update( ctx, additional, add_len );\n\n    /* 7. Update reseed counter */\n    ctx->reseed_counter++;\n\n    /* 8. Done */\n    return( 0 );\n}\n\n/*\n * HMAC_DRBG random function\n */\nint mbedtls_hmac_drbg_random( void *p_rng, unsigned char *output, size_t out_len )\n{\n    int ret;\n    mbedtls_hmac_drbg_context *ctx = (mbedtls_hmac_drbg_context *) p_rng;\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    ret = mbedtls_hmac_drbg_random_with_add( ctx, output, out_len, NULL, 0 );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    return( ret );\n}\n\n/*\n * Free an HMAC_DRBG context\n */\nvoid mbedtls_hmac_drbg_free( mbedtls_hmac_drbg_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_free( &ctx->mutex );\n#endif\n    mbedtls_md_free( &ctx->md_ctx );\n    mbedtls_zeroize( ctx, sizeof( mbedtls_hmac_drbg_context ) );\n}\n\n#if defined(MBEDTLS_FS_IO)\nint mbedtls_hmac_drbg_write_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path )\n{\n    int ret;\n    FILE *f;\n    unsigned char buf[ MBEDTLS_HMAC_DRBG_MAX_INPUT ];\n\n    if( ( f = fopen( path, \"wb\" ) ) == NULL )\n        return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR );\n\n    if( ( ret = mbedtls_hmac_drbg_random( ctx, buf, sizeof( buf ) ) ) != 0 )\n        goto exit;\n\n    if( fwrite( buf, 1, sizeof( buf ), f ) != sizeof( buf ) )\n    {\n        ret = MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR;\n        goto exit;\n    }\n\n    ret = 0;\n\nexit:\n    fclose( f );\n    return( ret );\n}\n\nint mbedtls_hmac_drbg_update_seed_file( mbedtls_hmac_drbg_context *ctx, const char *path )\n{\n    FILE *f;\n    size_t n;\n    unsigned char buf[ MBEDTLS_HMAC_DRBG_MAX_INPUT ];\n\n    if( ( f = fopen( path, \"rb\" ) ) == NULL )\n        return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR );\n\n    fseek( f, 0, SEEK_END );\n    n = (size_t) ftell( f );\n    fseek( f, 0, SEEK_SET );\n\n    if( n > MBEDTLS_HMAC_DRBG_MAX_INPUT )\n    {\n        fclose( f );\n        return( MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG );\n    }\n\n    if( fread( buf, 1, n, f ) != n )\n    {\n        fclose( f );\n        return( MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR );\n    }\n\n    fclose( f );\n\n    mbedtls_hmac_drbg_update( ctx, buf, n );\n\n    return( mbedtls_hmac_drbg_write_seed_file( ctx, path ) );\n}\n#endif /* MBEDTLS_FS_IO */\n\n\n#if defined(MBEDTLS_SELF_TEST)\n\n#if !defined(MBEDTLS_SHA1_C)\n/* Dummy checkup routine */\nint mbedtls_hmac_drbg_self_test( int verbose )\n{\n    (void) verbose;\n    return( 0 );\n}\n#else\n\n#define OUTPUT_LEN  80\n\n/* From a NIST PR=true test vector */\nstatic const unsigned char entropy_pr[] = {\n    0xa0, 0xc9, 0xab, 0x58, 0xf1, 0xe2, 0xe5, 0xa4, 0xde, 0x3e, 0xbd, 0x4f,\n    0xf7, 0x3e, 0x9c, 0x5b, 0x64, 0xef, 0xd8, 0xca, 0x02, 0x8c, 0xf8, 0x11,\n    0x48, 0xa5, 0x84, 0xfe, 0x69, 0xab, 0x5a, 0xee, 0x42, 0xaa, 0x4d, 0x42,\n    0x17, 0x60, 0x99, 0xd4, 0x5e, 0x13, 0x97, 0xdc, 0x40, 0x4d, 0x86, 0xa3,\n    0x7b, 0xf5, 0x59, 0x54, 0x75, 0x69, 0x51, 0xe4 };\nstatic const unsigned char result_pr[OUTPUT_LEN] = {\n    0x9a, 0x00, 0xa2, 0xd0, 0x0e, 0xd5, 0x9b, 0xfe, 0x31, 0xec, 0xb1, 0x39,\n    0x9b, 0x60, 0x81, 0x48, 0xd1, 0x96, 0x9d, 0x25, 0x0d, 0x3c, 0x1e, 0x94,\n    0x10, 0x10, 0x98, 0x12, 0x93, 0x25, 0xca, 0xb8, 0xfc, 0xcc, 0x2d, 0x54,\n    0x73, 0x19, 0x70, 0xc0, 0x10, 0x7a, 0xa4, 0x89, 0x25, 0x19, 0x95, 0x5e,\n    0x4b, 0xc6, 0x00, 0x1d, 0x7f, 0x4e, 0x6a, 0x2b, 0xf8, 0xa3, 0x01, 0xab,\n    0x46, 0x05, 0x5c, 0x09, 0xa6, 0x71, 0x88, 0xf1, 0xa7, 0x40, 0xee, 0xf3,\n    0xe1, 0x5c, 0x02, 0x9b, 0x44, 0xaf, 0x03, 0x44 };\n\n/* From a NIST PR=false test vector */\nstatic const unsigned char entropy_nopr[] = {\n    0x79, 0x34, 0x9b, 0xbf, 0x7c, 0xdd, 0xa5, 0x79, 0x95, 0x57, 0x86, 0x66,\n    0x21, 0xc9, 0x13, 0x83, 0x11, 0x46, 0x73, 0x3a, 0xbf, 0x8c, 0x35, 0xc8,\n    0xc7, 0x21, 0x5b, 0x5b, 0x96, 0xc4, 0x8e, 0x9b, 0x33, 0x8c, 0x74, 0xe3,\n    0xe9, 0x9d, 0xfe, 0xdf };\nstatic const unsigned char result_nopr[OUTPUT_LEN] = {\n    0xc6, 0xa1, 0x6a, 0xb8, 0xd4, 0x20, 0x70, 0x6f, 0x0f, 0x34, 0xab, 0x7f,\n    0xec, 0x5a, 0xdc, 0xa9, 0xd8, 0xca, 0x3a, 0x13, 0x3e, 0x15, 0x9c, 0xa6,\n    0xac, 0x43, 0xc6, 0xf8, 0xa2, 0xbe, 0x22, 0x83, 0x4a, 0x4c, 0x0a, 0x0a,\n    0xff, 0xb1, 0x0d, 0x71, 0x94, 0xf1, 0xc1, 0xa5, 0xcf, 0x73, 0x22, 0xec,\n    0x1a, 0xe0, 0x96, 0x4e, 0xd4, 0xbf, 0x12, 0x27, 0x46, 0xe0, 0x87, 0xfd,\n    0xb5, 0xb3, 0xe9, 0x1b, 0x34, 0x93, 0xd5, 0xbb, 0x98, 0xfa, 0xed, 0x49,\n    0xe8, 0x5f, 0x13, 0x0f, 0xc8, 0xa4, 0x59, 0xb7 };\n\n/* \"Entropy\" from buffer */\nstatic size_t test_offset;\nstatic int hmac_drbg_self_test_entropy( void *data,\n                                        unsigned char *buf, size_t len )\n{\n    const unsigned char *p = data;\n    memcpy( buf, p + test_offset, len );\n    test_offset += len;\n    return( 0 );\n}\n\n#define CHK( c )    if( (c) != 0 )                          \\\n                    {                                       \\\n                        if( verbose != 0 )                  \\\n                            mbedtls_printf( \"failed\\n\" );  \\\n                        return( 1 );                        \\\n                    }\n\n/*\n * Checkup routine for HMAC_DRBG with SHA-1\n */\nint mbedtls_hmac_drbg_self_test( int verbose )\n{\n    mbedtls_hmac_drbg_context ctx;\n    unsigned char buf[OUTPUT_LEN];\n    const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );\n\n    mbedtls_hmac_drbg_init( &ctx );\n\n    /*\n     * PR = True\n     */\n    if( verbose != 0 )\n        mbedtls_printf( \"  HMAC_DRBG (PR = True) : \" );\n\n    test_offset = 0;\n    CHK( mbedtls_hmac_drbg_seed( &ctx, md_info,\n                         hmac_drbg_self_test_entropy, (void *) entropy_pr,\n                         NULL, 0 ) );\n    mbedtls_hmac_drbg_set_prediction_resistance( &ctx, MBEDTLS_HMAC_DRBG_PR_ON );\n    CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) );\n    CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) );\n    CHK( memcmp( buf, result_pr, OUTPUT_LEN ) );\n    mbedtls_hmac_drbg_free( &ctx );\n\n    mbedtls_hmac_drbg_free( &ctx );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    /*\n     * PR = False\n     */\n    if( verbose != 0 )\n        mbedtls_printf( \"  HMAC_DRBG (PR = False) : \" );\n\n    mbedtls_hmac_drbg_init( &ctx );\n\n    test_offset = 0;\n    CHK( mbedtls_hmac_drbg_seed( &ctx, md_info,\n                         hmac_drbg_self_test_entropy, (void *) entropy_nopr,\n                         NULL, 0 ) );\n    CHK( mbedtls_hmac_drbg_reseed( &ctx, NULL, 0 ) );\n    CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) );\n    CHK( mbedtls_hmac_drbg_random( &ctx, buf, OUTPUT_LEN ) );\n    CHK( memcmp( buf, result_nopr, OUTPUT_LEN ) );\n    mbedtls_hmac_drbg_free( &ctx );\n\n    mbedtls_hmac_drbg_free( &ctx );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_HMAC_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/md.c",
    "content": "/**\n * \\file mbedtls_md.c\n *\n * \\brief Generic message digest wrapper for mbed TLS\n *\n * \\author Adriaan de Jong <dejong@fox-it.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_MD_C)\n\n#include \"mbedtls/md.h\"\n#include \"mbedtls/md_internal.h\"\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n#include <string.h>\n\n#if defined(MBEDTLS_FS_IO)\n#include <stdio.h>\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * Reminder: update profiles in x509_crt.c when adding a new hash!\n */\nstatic const int supported_digests[] = {\n\n#if defined(MBEDTLS_SHA512_C)\n        MBEDTLS_MD_SHA512,\n        MBEDTLS_MD_SHA384,\n#endif\n\n#if defined(MBEDTLS_SHA256_C)\n        MBEDTLS_MD_SHA256,\n        MBEDTLS_MD_SHA224,\n#endif\n\n#if defined(MBEDTLS_SHA1_C)\n        MBEDTLS_MD_SHA1,\n#endif\n\n#if defined(MBEDTLS_RIPEMD160_C)\n        MBEDTLS_MD_RIPEMD160,\n#endif\n\n#if defined(MBEDTLS_MD5_C)\n        MBEDTLS_MD_MD5,\n#endif\n\n#if defined(MBEDTLS_MD4_C)\n        MBEDTLS_MD_MD4,\n#endif\n\n#if defined(MBEDTLS_MD2_C)\n        MBEDTLS_MD_MD2,\n#endif\n\n        MBEDTLS_MD_NONE\n};\n\nconst int *mbedtls_md_list( void )\n{\n    return( supported_digests );\n}\n\nconst mbedtls_md_info_t *mbedtls_md_info_from_string( const char *md_name )\n{\n    if( NULL == md_name )\n        return( NULL );\n\n    /* Get the appropriate digest information */\n#if defined(MBEDTLS_MD2_C)\n    if( !strcmp( \"MD2\", md_name ) )\n        return mbedtls_md_info_from_type( MBEDTLS_MD_MD2 );\n#endif\n#if defined(MBEDTLS_MD4_C)\n    if( !strcmp( \"MD4\", md_name ) )\n        return mbedtls_md_info_from_type( MBEDTLS_MD_MD4 );\n#endif\n#if defined(MBEDTLS_MD5_C)\n    if( !strcmp( \"MD5\", md_name ) )\n        return mbedtls_md_info_from_type( MBEDTLS_MD_MD5 );\n#endif\n#if defined(MBEDTLS_RIPEMD160_C)\n    if( !strcmp( \"RIPEMD160\", md_name ) )\n        return mbedtls_md_info_from_type( MBEDTLS_MD_RIPEMD160 );\n#endif\n#if defined(MBEDTLS_SHA1_C)\n    if( !strcmp( \"SHA1\", md_name ) || !strcmp( \"SHA\", md_name ) )\n        return mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );\n#endif\n#if defined(MBEDTLS_SHA256_C)\n    if( !strcmp( \"SHA224\", md_name ) )\n        return mbedtls_md_info_from_type( MBEDTLS_MD_SHA224 );\n    if( !strcmp( \"SHA256\", md_name ) )\n        return mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 );\n#endif\n#if defined(MBEDTLS_SHA512_C)\n    if( !strcmp( \"SHA384\", md_name ) )\n        return mbedtls_md_info_from_type( MBEDTLS_MD_SHA384 );\n    if( !strcmp( \"SHA512\", md_name ) )\n        return mbedtls_md_info_from_type( MBEDTLS_MD_SHA512 );\n#endif\n    return( NULL );\n}\n\nconst mbedtls_md_info_t *mbedtls_md_info_from_type( mbedtls_md_type_t md_type )\n{\n    switch( md_type )\n    {\n#if defined(MBEDTLS_MD2_C)\n        case MBEDTLS_MD_MD2:\n            return( &mbedtls_md2_info );\n#endif\n#if defined(MBEDTLS_MD4_C)\n        case MBEDTLS_MD_MD4:\n            return( &mbedtls_md4_info );\n#endif\n#if defined(MBEDTLS_MD5_C)\n        case MBEDTLS_MD_MD5:\n            return( &mbedtls_md5_info );\n#endif\n#if defined(MBEDTLS_RIPEMD160_C)\n        case MBEDTLS_MD_RIPEMD160:\n            return( &mbedtls_ripemd160_info );\n#endif\n#if defined(MBEDTLS_SHA1_C)\n        case MBEDTLS_MD_SHA1:\n            return( &mbedtls_sha1_info );\n#endif\n#if defined(MBEDTLS_SHA256_C)\n        case MBEDTLS_MD_SHA224:\n            return( &mbedtls_sha224_info );\n        case MBEDTLS_MD_SHA256:\n            return( &mbedtls_sha256_info );\n#endif\n#if defined(MBEDTLS_SHA512_C)\n        case MBEDTLS_MD_SHA384:\n            return( &mbedtls_sha384_info );\n        case MBEDTLS_MD_SHA512:\n            return( &mbedtls_sha512_info );\n#endif\n        default:\n            return( NULL );\n    }\n}\n\nvoid mbedtls_md_init( mbedtls_md_context_t *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_md_context_t ) );\n}\n\nvoid mbedtls_md_free( mbedtls_md_context_t *ctx )\n{\n    if( ctx == NULL || ctx->md_info == NULL )\n        return;\n\n    if( ctx->md_ctx != NULL )\n        ctx->md_info->ctx_free_func( ctx->md_ctx );\n\n    if( ctx->hmac_ctx != NULL )\n    {\n        mbedtls_zeroize( ctx->hmac_ctx, 2 * ctx->md_info->block_size );\n        mbedtls_free( ctx->hmac_ctx );\n    }\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_md_context_t ) );\n}\n\nint mbedtls_md_clone( mbedtls_md_context_t *dst,\n                      const mbedtls_md_context_t *src )\n{\n    if( dst == NULL || dst->md_info == NULL ||\n        src == NULL || src->md_info == NULL ||\n        dst->md_info != src->md_info )\n    {\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n    }\n\n    dst->md_info->clone_func( dst->md_ctx, src->md_ctx );\n\n    return( 0 );\n}\n\n#if ! defined(MBEDTLS_DEPRECATED_REMOVED)\nint mbedtls_md_init_ctx( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info )\n{\n    return mbedtls_md_setup( ctx, md_info, 1 );\n}\n#endif\n\nint mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac )\n{\n    if( md_info == NULL || ctx == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    if( ( ctx->md_ctx = md_info->ctx_alloc_func() ) == NULL )\n        return( MBEDTLS_ERR_MD_ALLOC_FAILED );\n\n    if( hmac != 0 )\n    {\n        ctx->hmac_ctx = mbedtls_calloc( 2, md_info->block_size );\n        if( ctx->hmac_ctx == NULL )\n        {\n            md_info->ctx_free_func( ctx->md_ctx );\n            return( MBEDTLS_ERR_MD_ALLOC_FAILED );\n        }\n    }\n\n    ctx->md_info = md_info;\n\n    return( 0 );\n}\n\nint mbedtls_md_starts( mbedtls_md_context_t *ctx )\n{\n    if( ctx == NULL || ctx->md_info == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    ctx->md_info->starts_func( ctx->md_ctx );\n\n    return( 0 );\n}\n\nint mbedtls_md_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )\n{\n    if( ctx == NULL || ctx->md_info == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    ctx->md_info->update_func( ctx->md_ctx, input, ilen );\n\n    return( 0 );\n}\n\nint mbedtls_md_finish( mbedtls_md_context_t *ctx, unsigned char *output )\n{\n    if( ctx == NULL || ctx->md_info == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    ctx->md_info->finish_func( ctx->md_ctx, output );\n\n    return( 0 );\n}\n\nint mbedtls_md( const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,\n            unsigned char *output )\n{\n    if( md_info == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    md_info->digest_func( input, ilen, output );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_FS_IO)\nint mbedtls_md_file( const mbedtls_md_info_t *md_info, const char *path, unsigned char *output )\n{\n    int ret;\n    FILE *f;\n    size_t n;\n    mbedtls_md_context_t ctx;\n    unsigned char buf[1024];\n\n    if( md_info == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    if( ( f = fopen( path, \"rb\" ) ) == NULL )\n        return( MBEDTLS_ERR_MD_FILE_IO_ERROR );\n\n    mbedtls_md_init( &ctx );\n\n    if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )\n        goto cleanup;\n\n    md_info->starts_func( ctx.md_ctx );\n\n    while( ( n = fread( buf, 1, sizeof( buf ), f ) ) > 0 )\n        md_info->update_func( ctx.md_ctx, buf, n );\n\n    if( ferror( f ) != 0 )\n    {\n        ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;\n        goto cleanup;\n    }\n\n    md_info->finish_func( ctx.md_ctx, output );\n\ncleanup:\n    fclose( f );\n    mbedtls_md_free( &ctx );\n\n    return( ret );\n}\n#endif /* MBEDTLS_FS_IO */\n\nint mbedtls_md_hmac_starts( mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen )\n{\n    unsigned char sum[MBEDTLS_MD_MAX_SIZE];\n    unsigned char *ipad, *opad;\n    size_t i;\n\n    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    if( keylen > (size_t) ctx->md_info->block_size )\n    {\n        ctx->md_info->starts_func( ctx->md_ctx );\n        ctx->md_info->update_func( ctx->md_ctx, key, keylen );\n        ctx->md_info->finish_func( ctx->md_ctx, sum );\n\n        keylen = ctx->md_info->size;\n        key = sum;\n    }\n\n    ipad = (unsigned char *) ctx->hmac_ctx;\n    opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;\n\n    memset( ipad, 0x36, ctx->md_info->block_size );\n    memset( opad, 0x5C, ctx->md_info->block_size );\n\n    for( i = 0; i < keylen; i++ )\n    {\n        ipad[i] = (unsigned char)( ipad[i] ^ key[i] );\n        opad[i] = (unsigned char)( opad[i] ^ key[i] );\n    }\n\n    mbedtls_zeroize( sum, sizeof( sum ) );\n\n    ctx->md_info->starts_func( ctx->md_ctx );\n    ctx->md_info->update_func( ctx->md_ctx, ipad, ctx->md_info->block_size );\n\n    return( 0 );\n}\n\nint mbedtls_md_hmac_update( mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen )\n{\n    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    ctx->md_info->update_func( ctx->md_ctx, input, ilen );\n\n    return( 0 );\n}\n\nint mbedtls_md_hmac_finish( mbedtls_md_context_t *ctx, unsigned char *output )\n{\n    unsigned char tmp[MBEDTLS_MD_MAX_SIZE];\n    unsigned char *opad;\n\n    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;\n\n    ctx->md_info->finish_func( ctx->md_ctx, tmp );\n    ctx->md_info->starts_func( ctx->md_ctx );\n    ctx->md_info->update_func( ctx->md_ctx, opad, ctx->md_info->block_size );\n    ctx->md_info->update_func( ctx->md_ctx, tmp, ctx->md_info->size );\n    ctx->md_info->finish_func( ctx->md_ctx, output );\n\n    return( 0 );\n}\n\nint mbedtls_md_hmac_reset( mbedtls_md_context_t *ctx )\n{\n    unsigned char *ipad;\n\n    if( ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    ipad = (unsigned char *) ctx->hmac_ctx;\n\n    ctx->md_info->starts_func( ctx->md_ctx );\n    ctx->md_info->update_func( ctx->md_ctx, ipad, ctx->md_info->block_size );\n\n    return( 0 );\n}\n\nint mbedtls_md_hmac( const mbedtls_md_info_t *md_info, const unsigned char *key, size_t keylen,\n                const unsigned char *input, size_t ilen,\n                unsigned char *output )\n{\n    mbedtls_md_context_t ctx;\n    int ret;\n\n    if( md_info == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    mbedtls_md_init( &ctx );\n\n    if( ( ret = mbedtls_md_setup( &ctx, md_info, 1 ) ) != 0 )\n        return( ret );\n\n    mbedtls_md_hmac_starts( &ctx, key, keylen );\n    mbedtls_md_hmac_update( &ctx, input, ilen );\n    mbedtls_md_hmac_finish( &ctx, output );\n\n    mbedtls_md_free( &ctx );\n\n    return( 0 );\n}\n\nint mbedtls_md_process( mbedtls_md_context_t *ctx, const unsigned char *data )\n{\n    if( ctx == NULL || ctx->md_info == NULL )\n        return( MBEDTLS_ERR_MD_BAD_INPUT_DATA );\n\n    ctx->md_info->process_func( ctx->md_ctx, data );\n\n    return( 0 );\n}\n\nunsigned char mbedtls_md_get_size( const mbedtls_md_info_t *md_info )\n{\n    if( md_info == NULL )\n        return( 0 );\n\n    return md_info->size;\n}\n\nmbedtls_md_type_t mbedtls_md_get_type( const mbedtls_md_info_t *md_info )\n{\n    if( md_info == NULL )\n        return( MBEDTLS_MD_NONE );\n\n    return md_info->type;\n}\n\nconst char *mbedtls_md_get_name( const mbedtls_md_info_t *md_info )\n{\n    if( md_info == NULL )\n        return( NULL );\n\n    return md_info->name;\n}\n\n#endif /* MBEDTLS_MD_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/md2.c",
    "content": "/*\n *  RFC 1115/1319 compliant MD2 implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The MD2 algorithm was designed by Ron Rivest in 1989.\n *\n *  http://www.ietf.org/rfc/rfc1115.txt\n *  http://www.ietf.org/rfc/rfc1319.txt\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_MD2_C)\n\n#include \"mbedtls/md2.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_MD2_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\nstatic const unsigned char PI_SUBST[256] =\n{\n    0x29, 0x2E, 0x43, 0xC9, 0xA2, 0xD8, 0x7C, 0x01, 0x3D, 0x36,\n    0x54, 0xA1, 0xEC, 0xF0, 0x06, 0x13, 0x62, 0xA7, 0x05, 0xF3,\n    0xC0, 0xC7, 0x73, 0x8C, 0x98, 0x93, 0x2B, 0xD9, 0xBC, 0x4C,\n    0x82, 0xCA, 0x1E, 0x9B, 0x57, 0x3C, 0xFD, 0xD4, 0xE0, 0x16,\n    0x67, 0x42, 0x6F, 0x18, 0x8A, 0x17, 0xE5, 0x12, 0xBE, 0x4E,\n    0xC4, 0xD6, 0xDA, 0x9E, 0xDE, 0x49, 0xA0, 0xFB, 0xF5, 0x8E,\n    0xBB, 0x2F, 0xEE, 0x7A, 0xA9, 0x68, 0x79, 0x91, 0x15, 0xB2,\n    0x07, 0x3F, 0x94, 0xC2, 0x10, 0x89, 0x0B, 0x22, 0x5F, 0x21,\n    0x80, 0x7F, 0x5D, 0x9A, 0x5A, 0x90, 0x32, 0x27, 0x35, 0x3E,\n    0xCC, 0xE7, 0xBF, 0xF7, 0x97, 0x03, 0xFF, 0x19, 0x30, 0xB3,\n    0x48, 0xA5, 0xB5, 0xD1, 0xD7, 0x5E, 0x92, 0x2A, 0xAC, 0x56,\n    0xAA, 0xC6, 0x4F, 0xB8, 0x38, 0xD2, 0x96, 0xA4, 0x7D, 0xB6,\n    0x76, 0xFC, 0x6B, 0xE2, 0x9C, 0x74, 0x04, 0xF1, 0x45, 0x9D,\n    0x70, 0x59, 0x64, 0x71, 0x87, 0x20, 0x86, 0x5B, 0xCF, 0x65,\n    0xE6, 0x2D, 0xA8, 0x02, 0x1B, 0x60, 0x25, 0xAD, 0xAE, 0xB0,\n    0xB9, 0xF6, 0x1C, 0x46, 0x61, 0x69, 0x34, 0x40, 0x7E, 0x0F,\n    0x55, 0x47, 0xA3, 0x23, 0xDD, 0x51, 0xAF, 0x3A, 0xC3, 0x5C,\n    0xF9, 0xCE, 0xBA, 0xC5, 0xEA, 0x26, 0x2C, 0x53, 0x0D, 0x6E,\n    0x85, 0x28, 0x84, 0x09, 0xD3, 0xDF, 0xCD, 0xF4, 0x41, 0x81,\n    0x4D, 0x52, 0x6A, 0xDC, 0x37, 0xC8, 0x6C, 0xC1, 0xAB, 0xFA,\n    0x24, 0xE1, 0x7B, 0x08, 0x0C, 0xBD, 0xB1, 0x4A, 0x78, 0x88,\n    0x95, 0x8B, 0xE3, 0x63, 0xE8, 0x6D, 0xE9, 0xCB, 0xD5, 0xFE,\n    0x3B, 0x00, 0x1D, 0x39, 0xF2, 0xEF, 0xB7, 0x0E, 0x66, 0x58,\n    0xD0, 0xE4, 0xA6, 0x77, 0x72, 0xF8, 0xEB, 0x75, 0x4B, 0x0A,\n    0x31, 0x44, 0x50, 0xB4, 0x8F, 0xED, 0x1F, 0x1A, 0xDB, 0x99,\n    0x8D, 0x33, 0x9F, 0x11, 0x83, 0x14\n};\n\nvoid mbedtls_md2_init( mbedtls_md2_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_md2_context ) );\n}\n\nvoid mbedtls_md2_free( mbedtls_md2_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_md2_context ) );\n}\n\nvoid mbedtls_md2_clone( mbedtls_md2_context *dst,\n                        const mbedtls_md2_context *src )\n{\n    *dst = *src;\n}\n\n/*\n * MD2 context setup\n */\nvoid mbedtls_md2_starts( mbedtls_md2_context *ctx )\n{\n    memset( ctx->cksum, 0, 16 );\n    memset( ctx->state, 0, 46 );\n    memset( ctx->buffer, 0, 16 );\n    ctx->left = 0;\n}\n\n#if !defined(MBEDTLS_MD2_PROCESS_ALT)\nvoid mbedtls_md2_process( mbedtls_md2_context *ctx )\n{\n    int i, j;\n    unsigned char t = 0;\n\n    for( i = 0; i < 16; i++ )\n    {\n        ctx->state[i + 16] = ctx->buffer[i];\n        ctx->state[i + 32] =\n            (unsigned char)( ctx->buffer[i] ^ ctx->state[i]);\n    }\n\n    for( i = 0; i < 18; i++ )\n    {\n        for( j = 0; j < 48; j++ )\n        {\n            ctx->state[j] = (unsigned char)\n               ( ctx->state[j] ^ PI_SUBST[t] );\n            t  = ctx->state[j];\n        }\n\n        t = (unsigned char)( t + i );\n    }\n\n    t = ctx->cksum[15];\n\n    for( i = 0; i < 16; i++ )\n    {\n        ctx->cksum[i] = (unsigned char)\n           ( ctx->cksum[i] ^ PI_SUBST[ctx->buffer[i] ^ t] );\n        t  = ctx->cksum[i];\n    }\n}\n#endif /* !MBEDTLS_MD2_PROCESS_ALT */\n\n/*\n * MD2 process buffer\n */\nvoid mbedtls_md2_update( mbedtls_md2_context *ctx, const unsigned char *input, size_t ilen )\n{\n    size_t fill;\n\n    while( ilen > 0 )\n    {\n        if( ilen > 16 - ctx->left )\n            fill = 16 - ctx->left;\n        else\n            fill = ilen;\n\n        memcpy( ctx->buffer + ctx->left, input, fill );\n\n        ctx->left += fill;\n        input += fill;\n        ilen  -= fill;\n\n        if( ctx->left == 16 )\n        {\n            ctx->left = 0;\n            mbedtls_md2_process( ctx );\n        }\n    }\n}\n\n/*\n * MD2 final digest\n */\nvoid mbedtls_md2_finish( mbedtls_md2_context *ctx, unsigned char output[16] )\n{\n    size_t i;\n    unsigned char x;\n\n    x = (unsigned char)( 16 - ctx->left );\n\n    for( i = ctx->left; i < 16; i++ )\n        ctx->buffer[i] = x;\n\n    mbedtls_md2_process( ctx );\n\n    memcpy( ctx->buffer, ctx->cksum, 16 );\n    mbedtls_md2_process( ctx );\n\n    memcpy( output, ctx->state, 16 );\n}\n\n#endif /* !MBEDTLS_MD2_ALT */\n\n/*\n * output = MD2( input buffer )\n */\nvoid mbedtls_md2( const unsigned char *input, size_t ilen, unsigned char output[16] )\n{\n    mbedtls_md2_context ctx;\n\n    mbedtls_md2_init( &ctx );\n    mbedtls_md2_starts( &ctx );\n    mbedtls_md2_update( &ctx, input, ilen );\n    mbedtls_md2_finish( &ctx, output );\n    mbedtls_md2_free( &ctx );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n\n/*\n * RFC 1319 test vectors\n */\nstatic const char md2_test_str[7][81] =\n{\n    { \"\" },\n    { \"a\" },\n    { \"abc\" },\n    { \"message digest\" },\n    { \"abcdefghijklmnopqrstuvwxyz\" },\n    { \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n    { \"12345678901234567890123456789012345678901234567890123456789012\" \\\n      \"345678901234567890\" }\n};\n\nstatic const unsigned char md2_test_sum[7][16] =\n{\n    { 0x83, 0x50, 0xE5, 0xA3, 0xE2, 0x4C, 0x15, 0x3D,\n      0xF2, 0x27, 0x5C, 0x9F, 0x80, 0x69, 0x27, 0x73 },\n    { 0x32, 0xEC, 0x01, 0xEC, 0x4A, 0x6D, 0xAC, 0x72,\n      0xC0, 0xAB, 0x96, 0xFB, 0x34, 0xC0, 0xB5, 0xD1 },\n    { 0xDA, 0x85, 0x3B, 0x0D, 0x3F, 0x88, 0xD9, 0x9B,\n      0x30, 0x28, 0x3A, 0x69, 0xE6, 0xDE, 0xD6, 0xBB },\n    { 0xAB, 0x4F, 0x49, 0x6B, 0xFB, 0x2A, 0x53, 0x0B,\n      0x21, 0x9F, 0xF3, 0x30, 0x31, 0xFE, 0x06, 0xB0 },\n    { 0x4E, 0x8D, 0xDF, 0xF3, 0x65, 0x02, 0x92, 0xAB,\n      0x5A, 0x41, 0x08, 0xC3, 0xAA, 0x47, 0x94, 0x0B },\n    { 0xDA, 0x33, 0xDE, 0xF2, 0xA4, 0x2D, 0xF1, 0x39,\n      0x75, 0x35, 0x28, 0x46, 0xC3, 0x03, 0x38, 0xCD },\n    { 0xD5, 0x97, 0x6F, 0x79, 0xD8, 0x3D, 0x3A, 0x0D,\n      0xC9, 0x80, 0x6C, 0x3C, 0x66, 0xF3, 0xEF, 0xD8 }\n};\n\n/*\n * Checkup routine\n */\nint mbedtls_md2_self_test( int verbose )\n{\n    int i;\n    unsigned char md2sum[16];\n\n    for( i = 0; i < 7; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  MD2 test #%d: \", i + 1 );\n\n        mbedtls_md2( (unsigned char *) md2_test_str[i],\n             strlen( md2_test_str[i] ), md2sum );\n\n        if( memcmp( md2sum, md2_test_sum[i], 16 ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            return( 1 );\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_MD2_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/md4.c",
    "content": "/*\n *  RFC 1186/1320 compliant MD4 implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The MD4 algorithm was designed by Ron Rivest in 1990.\n *\n *  http://www.ietf.org/rfc/rfc1186.txt\n *  http://www.ietf.org/rfc/rfc1320.txt\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_MD4_C)\n\n#include \"mbedtls/md4.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_MD4_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * 32-bit integer manipulation macros (little endian)\n */\n#ifndef GET_UINT32_LE\n#define GET_UINT32_LE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint32_t) (b)[(i)    ]       )             \\\n        | ( (uint32_t) (b)[(i) + 1] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 2] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 3] << 24 );            \\\n}\n#endif\n\n#ifndef PUT_UINT32_LE\n#define PUT_UINT32_LE(n,b,i)                                    \\\n{                                                               \\\n    (b)[(i)    ] = (unsigned char) ( ( (n)       ) & 0xFF );    \\\n    (b)[(i) + 1] = (unsigned char) ( ( (n) >>  8 ) & 0xFF );    \\\n    (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF );    \\\n    (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF );    \\\n}\n#endif\n\nvoid mbedtls_md4_init( mbedtls_md4_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_md4_context ) );\n}\n\nvoid mbedtls_md4_free( mbedtls_md4_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_md4_context ) );\n}\n\nvoid mbedtls_md4_clone( mbedtls_md4_context *dst,\n                        const mbedtls_md4_context *src )\n{\n    *dst = *src;\n}\n\n/*\n * MD4 context setup\n */\nvoid mbedtls_md4_starts( mbedtls_md4_context *ctx )\n{\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n\n    ctx->state[0] = 0x67452301;\n    ctx->state[1] = 0xEFCDAB89;\n    ctx->state[2] = 0x98BADCFE;\n    ctx->state[3] = 0x10325476;\n}\n\n#if !defined(MBEDTLS_MD4_PROCESS_ALT)\nvoid mbedtls_md4_process( mbedtls_md4_context *ctx, const unsigned char data[64] )\n{\n    uint32_t X[16], A, B, C, D;\n\n    GET_UINT32_LE( X[ 0], data,  0 );\n    GET_UINT32_LE( X[ 1], data,  4 );\n    GET_UINT32_LE( X[ 2], data,  8 );\n    GET_UINT32_LE( X[ 3], data, 12 );\n    GET_UINT32_LE( X[ 4], data, 16 );\n    GET_UINT32_LE( X[ 5], data, 20 );\n    GET_UINT32_LE( X[ 6], data, 24 );\n    GET_UINT32_LE( X[ 7], data, 28 );\n    GET_UINT32_LE( X[ 8], data, 32 );\n    GET_UINT32_LE( X[ 9], data, 36 );\n    GET_UINT32_LE( X[10], data, 40 );\n    GET_UINT32_LE( X[11], data, 44 );\n    GET_UINT32_LE( X[12], data, 48 );\n    GET_UINT32_LE( X[13], data, 52 );\n    GET_UINT32_LE( X[14], data, 56 );\n    GET_UINT32_LE( X[15], data, 60 );\n\n#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))\n\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n\n#define F(x, y, z) ((x & y) | ((~x) & z))\n#define P(a,b,c,d,x,s) { a += F(b,c,d) + x; a = S(a,s); }\n\n    P( A, B, C, D, X[ 0],  3 );\n    P( D, A, B, C, X[ 1],  7 );\n    P( C, D, A, B, X[ 2], 11 );\n    P( B, C, D, A, X[ 3], 19 );\n    P( A, B, C, D, X[ 4],  3 );\n    P( D, A, B, C, X[ 5],  7 );\n    P( C, D, A, B, X[ 6], 11 );\n    P( B, C, D, A, X[ 7], 19 );\n    P( A, B, C, D, X[ 8],  3 );\n    P( D, A, B, C, X[ 9],  7 );\n    P( C, D, A, B, X[10], 11 );\n    P( B, C, D, A, X[11], 19 );\n    P( A, B, C, D, X[12],  3 );\n    P( D, A, B, C, X[13],  7 );\n    P( C, D, A, B, X[14], 11 );\n    P( B, C, D, A, X[15], 19 );\n\n#undef P\n#undef F\n\n#define F(x,y,z) ((x & y) | (x & z) | (y & z))\n#define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x5A827999; a = S(a,s); }\n\n    P( A, B, C, D, X[ 0],  3 );\n    P( D, A, B, C, X[ 4],  5 );\n    P( C, D, A, B, X[ 8],  9 );\n    P( B, C, D, A, X[12], 13 );\n    P( A, B, C, D, X[ 1],  3 );\n    P( D, A, B, C, X[ 5],  5 );\n    P( C, D, A, B, X[ 9],  9 );\n    P( B, C, D, A, X[13], 13 );\n    P( A, B, C, D, X[ 2],  3 );\n    P( D, A, B, C, X[ 6],  5 );\n    P( C, D, A, B, X[10],  9 );\n    P( B, C, D, A, X[14], 13 );\n    P( A, B, C, D, X[ 3],  3 );\n    P( D, A, B, C, X[ 7],  5 );\n    P( C, D, A, B, X[11],  9 );\n    P( B, C, D, A, X[15], 13 );\n\n#undef P\n#undef F\n\n#define F(x,y,z) (x ^ y ^ z)\n#define P(a,b,c,d,x,s) { a += F(b,c,d) + x + 0x6ED9EBA1; a = S(a,s); }\n\n    P( A, B, C, D, X[ 0],  3 );\n    P( D, A, B, C, X[ 8],  9 );\n    P( C, D, A, B, X[ 4], 11 );\n    P( B, C, D, A, X[12], 15 );\n    P( A, B, C, D, X[ 2],  3 );\n    P( D, A, B, C, X[10],  9 );\n    P( C, D, A, B, X[ 6], 11 );\n    P( B, C, D, A, X[14], 15 );\n    P( A, B, C, D, X[ 1],  3 );\n    P( D, A, B, C, X[ 9],  9 );\n    P( C, D, A, B, X[ 5], 11 );\n    P( B, C, D, A, X[13], 15 );\n    P( A, B, C, D, X[ 3],  3 );\n    P( D, A, B, C, X[11],  9 );\n    P( C, D, A, B, X[ 7], 11 );\n    P( B, C, D, A, X[15], 15 );\n\n#undef F\n#undef P\n\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n}\n#endif /* !MBEDTLS_MD4_PROCESS_ALT */\n\n/*\n * MD4 process buffer\n */\nvoid mbedtls_md4_update( mbedtls_md4_context *ctx, const unsigned char *input, size_t ilen )\n{\n    size_t fill;\n    uint32_t left;\n\n    if( ilen == 0 )\n        return;\n\n    left = ctx->total[0] & 0x3F;\n    fill = 64 - left;\n\n    ctx->total[0] += (uint32_t) ilen;\n    ctx->total[0] &= 0xFFFFFFFF;\n\n    if( ctx->total[0] < (uint32_t) ilen )\n        ctx->total[1]++;\n\n    if( left && ilen >= fill )\n    {\n        memcpy( (void *) (ctx->buffer + left),\n                (void *) input, fill );\n        mbedtls_md4_process( ctx, ctx->buffer );\n        input += fill;\n        ilen  -= fill;\n        left = 0;\n    }\n\n    while( ilen >= 64 )\n    {\n        mbedtls_md4_process( ctx, input );\n        input += 64;\n        ilen  -= 64;\n    }\n\n    if( ilen > 0 )\n    {\n        memcpy( (void *) (ctx->buffer + left),\n                (void *) input, ilen );\n    }\n}\n\nstatic const unsigned char md4_padding[64] =\n{\n 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/*\n * MD4 final digest\n */\nvoid mbedtls_md4_finish( mbedtls_md4_context *ctx, unsigned char output[16] )\n{\n    uint32_t last, padn;\n    uint32_t high, low;\n    unsigned char msglen[8];\n\n    high = ( ctx->total[0] >> 29 )\n         | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n\n    PUT_UINT32_LE( low,  msglen, 0 );\n    PUT_UINT32_LE( high, msglen, 4 );\n\n    last = ctx->total[0] & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n\n    mbedtls_md4_update( ctx, (unsigned char *) md4_padding, padn );\n    mbedtls_md4_update( ctx, msglen, 8 );\n\n    PUT_UINT32_LE( ctx->state[0], output,  0 );\n    PUT_UINT32_LE( ctx->state[1], output,  4 );\n    PUT_UINT32_LE( ctx->state[2], output,  8 );\n    PUT_UINT32_LE( ctx->state[3], output, 12 );\n}\n\n#endif /* !MBEDTLS_MD4_ALT */\n\n/*\n * output = MD4( input buffer )\n */\nvoid mbedtls_md4( const unsigned char *input, size_t ilen, unsigned char output[16] )\n{\n    mbedtls_md4_context ctx;\n\n    mbedtls_md4_init( &ctx );\n    mbedtls_md4_starts( &ctx );\n    mbedtls_md4_update( &ctx, input, ilen );\n    mbedtls_md4_finish( &ctx, output );\n    mbedtls_md4_free( &ctx );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n\n/*\n * RFC 1320 test vectors\n */\nstatic const char md4_test_str[7][81] =\n{\n    { \"\" },\n    { \"a\" },\n    { \"abc\" },\n    { \"message digest\" },\n    { \"abcdefghijklmnopqrstuvwxyz\" },\n    { \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n    { \"12345678901234567890123456789012345678901234567890123456789012\" \\\n      \"345678901234567890\" }\n};\n\nstatic const unsigned char md4_test_sum[7][16] =\n{\n    { 0x31, 0xD6, 0xCF, 0xE0, 0xD1, 0x6A, 0xE9, 0x31,\n      0xB7, 0x3C, 0x59, 0xD7, 0xE0, 0xC0, 0x89, 0xC0 },\n    { 0xBD, 0xE5, 0x2C, 0xB3, 0x1D, 0xE3, 0x3E, 0x46,\n      0x24, 0x5E, 0x05, 0xFB, 0xDB, 0xD6, 0xFB, 0x24 },\n    { 0xA4, 0x48, 0x01, 0x7A, 0xAF, 0x21, 0xD8, 0x52,\n      0x5F, 0xC1, 0x0A, 0xE8, 0x7A, 0xA6, 0x72, 0x9D },\n    { 0xD9, 0x13, 0x0A, 0x81, 0x64, 0x54, 0x9F, 0xE8,\n      0x18, 0x87, 0x48, 0x06, 0xE1, 0xC7, 0x01, 0x4B },\n    { 0xD7, 0x9E, 0x1C, 0x30, 0x8A, 0xA5, 0xBB, 0xCD,\n      0xEE, 0xA8, 0xED, 0x63, 0xDF, 0x41, 0x2D, 0xA9 },\n    { 0x04, 0x3F, 0x85, 0x82, 0xF2, 0x41, 0xDB, 0x35,\n      0x1C, 0xE6, 0x27, 0xE1, 0x53, 0xE7, 0xF0, 0xE4 },\n    { 0xE3, 0x3B, 0x4D, 0xDC, 0x9C, 0x38, 0xF2, 0x19,\n      0x9C, 0x3E, 0x7B, 0x16, 0x4F, 0xCC, 0x05, 0x36 }\n};\n\n/*\n * Checkup routine\n */\nint mbedtls_md4_self_test( int verbose )\n{\n    int i;\n    unsigned char md4sum[16];\n\n    for( i = 0; i < 7; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  MD4 test #%d: \", i + 1 );\n\n        mbedtls_md4( (unsigned char *) md4_test_str[i],\n             strlen( md4_test_str[i] ), md4sum );\n\n        if( memcmp( md4sum, md4_test_sum[i], 16 ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            return( 1 );\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_MD4_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/md5.c",
    "content": "/*\n *  RFC 1321 compliant MD5 implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The MD5 algorithm was designed by Ron Rivest in 1991.\n *\n *  http://www.ietf.org/rfc/rfc1321.txt\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_MD5_C)\n\n#include \"mbedtls/md5.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_MD5_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * 32-bit integer manipulation macros (little endian)\n */\n#ifndef GET_UINT32_LE\n#define GET_UINT32_LE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint32_t) (b)[(i)    ]       )             \\\n        | ( (uint32_t) (b)[(i) + 1] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 2] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 3] << 24 );            \\\n}\n#endif\n\n#ifndef PUT_UINT32_LE\n#define PUT_UINT32_LE(n,b,i)                                    \\\n{                                                               \\\n    (b)[(i)    ] = (unsigned char) ( ( (n)       ) & 0xFF );    \\\n    (b)[(i) + 1] = (unsigned char) ( ( (n) >>  8 ) & 0xFF );    \\\n    (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF );    \\\n    (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF );    \\\n}\n#endif\n\nvoid mbedtls_md5_init( mbedtls_md5_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_md5_context ) );\n}\n\nvoid mbedtls_md5_free( mbedtls_md5_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_md5_context ) );\n}\n\nvoid mbedtls_md5_clone( mbedtls_md5_context *dst,\n                        const mbedtls_md5_context *src )\n{\n    *dst = *src;\n}\n\n/*\n * MD5 context setup\n */\nvoid mbedtls_md5_starts( mbedtls_md5_context *ctx )\n{\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n\n    ctx->state[0] = 0x67452301;\n    ctx->state[1] = 0xEFCDAB89;\n    ctx->state[2] = 0x98BADCFE;\n    ctx->state[3] = 0x10325476;\n}\n\n#if !defined(MBEDTLS_MD5_PROCESS_ALT)\nvoid mbedtls_md5_process( mbedtls_md5_context *ctx, const unsigned char data[64] )\n{\n    uint32_t X[16], A, B, C, D;\n\n    GET_UINT32_LE( X[ 0], data,  0 );\n    GET_UINT32_LE( X[ 1], data,  4 );\n    GET_UINT32_LE( X[ 2], data,  8 );\n    GET_UINT32_LE( X[ 3], data, 12 );\n    GET_UINT32_LE( X[ 4], data, 16 );\n    GET_UINT32_LE( X[ 5], data, 20 );\n    GET_UINT32_LE( X[ 6], data, 24 );\n    GET_UINT32_LE( X[ 7], data, 28 );\n    GET_UINT32_LE( X[ 8], data, 32 );\n    GET_UINT32_LE( X[ 9], data, 36 );\n    GET_UINT32_LE( X[10], data, 40 );\n    GET_UINT32_LE( X[11], data, 44 );\n    GET_UINT32_LE( X[12], data, 48 );\n    GET_UINT32_LE( X[13], data, 52 );\n    GET_UINT32_LE( X[14], data, 56 );\n    GET_UINT32_LE( X[15], data, 60 );\n\n#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))\n\n#define P(a,b,c,d,k,s,t)                                \\\n{                                                       \\\n    a += F(b,c,d) + X[k] + t; a = S(a,s) + b;           \\\n}\n\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n\n#define F(x,y,z) (z ^ (x & (y ^ z)))\n\n    P( A, B, C, D,  0,  7, 0xD76AA478 );\n    P( D, A, B, C,  1, 12, 0xE8C7B756 );\n    P( C, D, A, B,  2, 17, 0x242070DB );\n    P( B, C, D, A,  3, 22, 0xC1BDCEEE );\n    P( A, B, C, D,  4,  7, 0xF57C0FAF );\n    P( D, A, B, C,  5, 12, 0x4787C62A );\n    P( C, D, A, B,  6, 17, 0xA8304613 );\n    P( B, C, D, A,  7, 22, 0xFD469501 );\n    P( A, B, C, D,  8,  7, 0x698098D8 );\n    P( D, A, B, C,  9, 12, 0x8B44F7AF );\n    P( C, D, A, B, 10, 17, 0xFFFF5BB1 );\n    P( B, C, D, A, 11, 22, 0x895CD7BE );\n    P( A, B, C, D, 12,  7, 0x6B901122 );\n    P( D, A, B, C, 13, 12, 0xFD987193 );\n    P( C, D, A, B, 14, 17, 0xA679438E );\n    P( B, C, D, A, 15, 22, 0x49B40821 );\n\n#undef F\n\n#define F(x,y,z) (y ^ (z & (x ^ y)))\n\n    P( A, B, C, D,  1,  5, 0xF61E2562 );\n    P( D, A, B, C,  6,  9, 0xC040B340 );\n    P( C, D, A, B, 11, 14, 0x265E5A51 );\n    P( B, C, D, A,  0, 20, 0xE9B6C7AA );\n    P( A, B, C, D,  5,  5, 0xD62F105D );\n    P( D, A, B, C, 10,  9, 0x02441453 );\n    P( C, D, A, B, 15, 14, 0xD8A1E681 );\n    P( B, C, D, A,  4, 20, 0xE7D3FBC8 );\n    P( A, B, C, D,  9,  5, 0x21E1CDE6 );\n    P( D, A, B, C, 14,  9, 0xC33707D6 );\n    P( C, D, A, B,  3, 14, 0xF4D50D87 );\n    P( B, C, D, A,  8, 20, 0x455A14ED );\n    P( A, B, C, D, 13,  5, 0xA9E3E905 );\n    P( D, A, B, C,  2,  9, 0xFCEFA3F8 );\n    P( C, D, A, B,  7, 14, 0x676F02D9 );\n    P( B, C, D, A, 12, 20, 0x8D2A4C8A );\n\n#undef F\n\n#define F(x,y,z) (x ^ y ^ z)\n\n    P( A, B, C, D,  5,  4, 0xFFFA3942 );\n    P( D, A, B, C,  8, 11, 0x8771F681 );\n    P( C, D, A, B, 11, 16, 0x6D9D6122 );\n    P( B, C, D, A, 14, 23, 0xFDE5380C );\n    P( A, B, C, D,  1,  4, 0xA4BEEA44 );\n    P( D, A, B, C,  4, 11, 0x4BDECFA9 );\n    P( C, D, A, B,  7, 16, 0xF6BB4B60 );\n    P( B, C, D, A, 10, 23, 0xBEBFBC70 );\n    P( A, B, C, D, 13,  4, 0x289B7EC6 );\n    P( D, A, B, C,  0, 11, 0xEAA127FA );\n    P( C, D, A, B,  3, 16, 0xD4EF3085 );\n    P( B, C, D, A,  6, 23, 0x04881D05 );\n    P( A, B, C, D,  9,  4, 0xD9D4D039 );\n    P( D, A, B, C, 12, 11, 0xE6DB99E5 );\n    P( C, D, A, B, 15, 16, 0x1FA27CF8 );\n    P( B, C, D, A,  2, 23, 0xC4AC5665 );\n\n#undef F\n\n#define F(x,y,z) (y ^ (x | ~z))\n\n    P( A, B, C, D,  0,  6, 0xF4292244 );\n    P( D, A, B, C,  7, 10, 0x432AFF97 );\n    P( C, D, A, B, 14, 15, 0xAB9423A7 );\n    P( B, C, D, A,  5, 21, 0xFC93A039 );\n    P( A, B, C, D, 12,  6, 0x655B59C3 );\n    P( D, A, B, C,  3, 10, 0x8F0CCC92 );\n    P( C, D, A, B, 10, 15, 0xFFEFF47D );\n    P( B, C, D, A,  1, 21, 0x85845DD1 );\n    P( A, B, C, D,  8,  6, 0x6FA87E4F );\n    P( D, A, B, C, 15, 10, 0xFE2CE6E0 );\n    P( C, D, A, B,  6, 15, 0xA3014314 );\n    P( B, C, D, A, 13, 21, 0x4E0811A1 );\n    P( A, B, C, D,  4,  6, 0xF7537E82 );\n    P( D, A, B, C, 11, 10, 0xBD3AF235 );\n    P( C, D, A, B,  2, 15, 0x2AD7D2BB );\n    P( B, C, D, A,  9, 21, 0xEB86D391 );\n\n#undef F\n\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n}\n#endif /* !MBEDTLS_MD5_PROCESS_ALT */\n\n/*\n * MD5 process buffer\n */\nvoid mbedtls_md5_update( mbedtls_md5_context *ctx, const unsigned char *input, size_t ilen )\n{\n    size_t fill;\n    uint32_t left;\n\n    if( ilen == 0 )\n        return;\n\n    left = ctx->total[0] & 0x3F;\n    fill = 64 - left;\n\n    ctx->total[0] += (uint32_t) ilen;\n    ctx->total[0] &= 0xFFFFFFFF;\n\n    if( ctx->total[0] < (uint32_t) ilen )\n        ctx->total[1]++;\n\n    if( left && ilen >= fill )\n    {\n        memcpy( (void *) (ctx->buffer + left), input, fill );\n        mbedtls_md5_process( ctx, ctx->buffer );\n        input += fill;\n        ilen  -= fill;\n        left = 0;\n    }\n\n    while( ilen >= 64 )\n    {\n        mbedtls_md5_process( ctx, input );\n        input += 64;\n        ilen  -= 64;\n    }\n\n    if( ilen > 0 )\n    {\n        memcpy( (void *) (ctx->buffer + left), input, ilen );\n    }\n}\n\nstatic const unsigned char md5_padding[64] =\n{\n 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/*\n * MD5 final digest\n */\nvoid mbedtls_md5_finish( mbedtls_md5_context *ctx, unsigned char output[16] )\n{\n    uint32_t last, padn;\n    uint32_t high, low;\n    unsigned char msglen[8];\n\n    high = ( ctx->total[0] >> 29 )\n         | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n\n    PUT_UINT32_LE( low,  msglen, 0 );\n    PUT_UINT32_LE( high, msglen, 4 );\n\n    last = ctx->total[0] & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n\n    mbedtls_md5_update( ctx, md5_padding, padn );\n    mbedtls_md5_update( ctx, msglen, 8 );\n\n    PUT_UINT32_LE( ctx->state[0], output,  0 );\n    PUT_UINT32_LE( ctx->state[1], output,  4 );\n    PUT_UINT32_LE( ctx->state[2], output,  8 );\n    PUT_UINT32_LE( ctx->state[3], output, 12 );\n}\n\n#endif /* !MBEDTLS_MD5_ALT */\n\n/*\n * output = MD5( input buffer )\n */\nvoid mbedtls_md5( const unsigned char *input, size_t ilen, unsigned char output[16] )\n{\n    mbedtls_md5_context ctx;\n\n    mbedtls_md5_init( &ctx );\n    mbedtls_md5_starts( &ctx );\n    mbedtls_md5_update( &ctx, input, ilen );\n    mbedtls_md5_finish( &ctx, output );\n    mbedtls_md5_free( &ctx );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n/*\n * RFC 1321 test vectors\n */\nstatic const unsigned char md5_test_buf[7][81] =\n{\n    { \"\" },\n    { \"a\" },\n    { \"abc\" },\n    { \"message digest\" },\n    { \"abcdefghijklmnopqrstuvwxyz\" },\n    { \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\" },\n    { \"12345678901234567890123456789012345678901234567890123456789012\" \\\n      \"345678901234567890\" }\n};\n\nstatic const int md5_test_buflen[7] =\n{\n    0, 1, 3, 14, 26, 62, 80\n};\n\nstatic const unsigned char md5_test_sum[7][16] =\n{\n    { 0xD4, 0x1D, 0x8C, 0xD9, 0x8F, 0x00, 0xB2, 0x04,\n      0xE9, 0x80, 0x09, 0x98, 0xEC, 0xF8, 0x42, 0x7E },\n    { 0x0C, 0xC1, 0x75, 0xB9, 0xC0, 0xF1, 0xB6, 0xA8,\n      0x31, 0xC3, 0x99, 0xE2, 0x69, 0x77, 0x26, 0x61 },\n    { 0x90, 0x01, 0x50, 0x98, 0x3C, 0xD2, 0x4F, 0xB0,\n      0xD6, 0x96, 0x3F, 0x7D, 0x28, 0xE1, 0x7F, 0x72 },\n    { 0xF9, 0x6B, 0x69, 0x7D, 0x7C, 0xB7, 0x93, 0x8D,\n      0x52, 0x5A, 0x2F, 0x31, 0xAA, 0xF1, 0x61, 0xD0 },\n    { 0xC3, 0xFC, 0xD3, 0xD7, 0x61, 0x92, 0xE4, 0x00,\n      0x7D, 0xFB, 0x49, 0x6C, 0xCA, 0x67, 0xE1, 0x3B },\n    { 0xD1, 0x74, 0xAB, 0x98, 0xD2, 0x77, 0xD9, 0xF5,\n      0xA5, 0x61, 0x1C, 0x2C, 0x9F, 0x41, 0x9D, 0x9F },\n    { 0x57, 0xED, 0xF4, 0xA2, 0x2B, 0xE3, 0xC9, 0x55,\n      0xAC, 0x49, 0xDA, 0x2E, 0x21, 0x07, 0xB6, 0x7A }\n};\n\n/*\n * Checkup routine\n */\nint mbedtls_md5_self_test( int verbose )\n{\n    int i;\n    unsigned char md5sum[16];\n\n    for( i = 0; i < 7; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  MD5 test #%d: \", i + 1 );\n\n        mbedtls_md5( md5_test_buf[i], md5_test_buflen[i], md5sum );\n\n        if( memcmp( md5sum, md5_test_sum[i], 16 ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            return( 1 );\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_MD5_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/md_wrap.c",
    "content": "/**\n * \\file md_wrap.c\n *\n * \\brief Generic message digest wrapper for mbed TLS\n *\n * \\author Adriaan de Jong <dejong@fox-it.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_MD_C)\n\n#include \"mbedtls/md_internal.h\"\n\n#if defined(MBEDTLS_MD2_C)\n#include \"mbedtls/md2.h\"\n#endif\n\n#if defined(MBEDTLS_MD4_C)\n#include \"mbedtls/md4.h\"\n#endif\n\n#if defined(MBEDTLS_MD5_C)\n#include \"mbedtls/md5.h\"\n#endif\n\n#if defined(MBEDTLS_RIPEMD160_C)\n#include \"mbedtls/ripemd160.h\"\n#endif\n\n#if defined(MBEDTLS_SHA1_C)\n#include \"mbedtls/sha1.h\"\n#endif\n\n#if defined(MBEDTLS_SHA256_C)\n#include \"mbedtls/sha256.h\"\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\n#include \"mbedtls/sha512.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n#if defined(MBEDTLS_MD2_C)\n\nstatic void md2_starts_wrap( void *ctx )\n{\n    mbedtls_md2_starts( (mbedtls_md2_context *) ctx );\n}\n\nstatic void md2_update_wrap( void *ctx, const unsigned char *input,\n                             size_t ilen )\n{\n    mbedtls_md2_update( (mbedtls_md2_context *) ctx, input, ilen );\n}\n\nstatic void md2_finish_wrap( void *ctx, unsigned char *output )\n{\n    mbedtls_md2_finish( (mbedtls_md2_context *) ctx, output );\n}\n\nstatic void *md2_ctx_alloc( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md2_context ) );\n\n    if( ctx != NULL )\n        mbedtls_md2_init( (mbedtls_md2_context *) ctx );\n\n    return( ctx );\n}\n\nstatic void md2_ctx_free( void *ctx )\n{\n    mbedtls_md2_free( (mbedtls_md2_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic void md2_clone_wrap( void *dst, const void *src )\n{\n    mbedtls_md2_clone( (mbedtls_md2_context *) dst,\n                 (const mbedtls_md2_context *) src );\n}\n\nstatic void md2_process_wrap( void *ctx, const unsigned char *data )\n{\n    ((void) data);\n\n    mbedtls_md2_process( (mbedtls_md2_context *) ctx );\n}\n\nconst mbedtls_md_info_t mbedtls_md2_info = {\n    MBEDTLS_MD_MD2,\n    \"MD2\",\n    16,\n    16,\n    md2_starts_wrap,\n    md2_update_wrap,\n    md2_finish_wrap,\n    mbedtls_md2,\n    md2_ctx_alloc,\n    md2_ctx_free,\n    md2_clone_wrap,\n    md2_process_wrap,\n};\n\n#endif /* MBEDTLS_MD2_C */\n\n#if defined(MBEDTLS_MD4_C)\n\nstatic void md4_starts_wrap( void *ctx )\n{\n    mbedtls_md4_starts( (mbedtls_md4_context *) ctx );\n}\n\nstatic void md4_update_wrap( void *ctx, const unsigned char *input,\n                             size_t ilen )\n{\n    mbedtls_md4_update( (mbedtls_md4_context *) ctx, input, ilen );\n}\n\nstatic void md4_finish_wrap( void *ctx, unsigned char *output )\n{\n    mbedtls_md4_finish( (mbedtls_md4_context *) ctx, output );\n}\n\nstatic void *md4_ctx_alloc( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md4_context ) );\n\n    if( ctx != NULL )\n        mbedtls_md4_init( (mbedtls_md4_context *) ctx );\n\n    return( ctx );\n}\n\nstatic void md4_ctx_free( void *ctx )\n{\n    mbedtls_md4_free( (mbedtls_md4_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic void md4_clone_wrap( void *dst, const void *src )\n{\n    mbedtls_md4_clone( (mbedtls_md4_context *) dst,\n                 (const mbedtls_md4_context *) src );\n}\n\nstatic void md4_process_wrap( void *ctx, const unsigned char *data )\n{\n    mbedtls_md4_process( (mbedtls_md4_context *) ctx, data );\n}\n\nconst mbedtls_md_info_t mbedtls_md4_info = {\n    MBEDTLS_MD_MD4,\n    \"MD4\",\n    16,\n    64,\n    md4_starts_wrap,\n    md4_update_wrap,\n    md4_finish_wrap,\n    mbedtls_md4,\n    md4_ctx_alloc,\n    md4_ctx_free,\n    md4_clone_wrap,\n    md4_process_wrap,\n};\n\n#endif /* MBEDTLS_MD4_C */\n\n#if defined(MBEDTLS_MD5_C)\n\nstatic void md5_starts_wrap( void *ctx )\n{\n    mbedtls_md5_starts( (mbedtls_md5_context *) ctx );\n}\n\nstatic void md5_update_wrap( void *ctx, const unsigned char *input,\n                             size_t ilen )\n{\n    mbedtls_md5_update( (mbedtls_md5_context *) ctx, input, ilen );\n}\n\nstatic void md5_finish_wrap( void *ctx, unsigned char *output )\n{\n    mbedtls_md5_finish( (mbedtls_md5_context *) ctx, output );\n}\n\nstatic void *md5_ctx_alloc( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_md5_context ) );\n\n    if( ctx != NULL )\n        mbedtls_md5_init( (mbedtls_md5_context *) ctx );\n\n    return( ctx );\n}\n\nstatic void md5_ctx_free( void *ctx )\n{\n    mbedtls_md5_free( (mbedtls_md5_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic void md5_clone_wrap( void *dst, const void *src )\n{\n    mbedtls_md5_clone( (mbedtls_md5_context *) dst,\n                 (const mbedtls_md5_context *) src );\n}\n\nstatic void md5_process_wrap( void *ctx, const unsigned char *data )\n{\n    mbedtls_md5_process( (mbedtls_md5_context *) ctx, data );\n}\n\nconst mbedtls_md_info_t mbedtls_md5_info = {\n    MBEDTLS_MD_MD5,\n    \"MD5\",\n    16,\n    64,\n    md5_starts_wrap,\n    md5_update_wrap,\n    md5_finish_wrap,\n    mbedtls_md5,\n    md5_ctx_alloc,\n    md5_ctx_free,\n    md5_clone_wrap,\n    md5_process_wrap,\n};\n\n#endif /* MBEDTLS_MD5_C */\n\n#if defined(MBEDTLS_RIPEMD160_C)\n\nstatic void ripemd160_starts_wrap( void *ctx )\n{\n    mbedtls_ripemd160_starts( (mbedtls_ripemd160_context *) ctx );\n}\n\nstatic void ripemd160_update_wrap( void *ctx, const unsigned char *input,\n                                   size_t ilen )\n{\n    mbedtls_ripemd160_update( (mbedtls_ripemd160_context *) ctx, input, ilen );\n}\n\nstatic void ripemd160_finish_wrap( void *ctx, unsigned char *output )\n{\n    mbedtls_ripemd160_finish( (mbedtls_ripemd160_context *) ctx, output );\n}\n\nstatic void *ripemd160_ctx_alloc( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ripemd160_context ) );\n\n    if( ctx != NULL )\n        mbedtls_ripemd160_init( (mbedtls_ripemd160_context *) ctx );\n\n    return( ctx );\n}\n\nstatic void ripemd160_ctx_free( void *ctx )\n{\n    mbedtls_ripemd160_free( (mbedtls_ripemd160_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic void ripemd160_clone_wrap( void *dst, const void *src )\n{\n    mbedtls_ripemd160_clone( (mbedtls_ripemd160_context *) dst,\n                       (const mbedtls_ripemd160_context *) src );\n}\n\nstatic void ripemd160_process_wrap( void *ctx, const unsigned char *data )\n{\n    mbedtls_ripemd160_process( (mbedtls_ripemd160_context *) ctx, data );\n}\n\nconst mbedtls_md_info_t mbedtls_ripemd160_info = {\n    MBEDTLS_MD_RIPEMD160,\n    \"RIPEMD160\",\n    20,\n    64,\n    ripemd160_starts_wrap,\n    ripemd160_update_wrap,\n    ripemd160_finish_wrap,\n    mbedtls_ripemd160,\n    ripemd160_ctx_alloc,\n    ripemd160_ctx_free,\n    ripemd160_clone_wrap,\n    ripemd160_process_wrap,\n};\n\n#endif /* MBEDTLS_RIPEMD160_C */\n\n#if defined(MBEDTLS_SHA1_C)\n\nstatic void sha1_starts_wrap( void *ctx )\n{\n    mbedtls_sha1_starts( (mbedtls_sha1_context *) ctx );\n}\n\nstatic void sha1_update_wrap( void *ctx, const unsigned char *input,\n                              size_t ilen )\n{\n    mbedtls_sha1_update( (mbedtls_sha1_context *) ctx, input, ilen );\n}\n\nstatic void sha1_finish_wrap( void *ctx, unsigned char *output )\n{\n    mbedtls_sha1_finish( (mbedtls_sha1_context *) ctx, output );\n}\n\nstatic void *sha1_ctx_alloc( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha1_context ) );\n\n    if( ctx != NULL )\n        mbedtls_sha1_init( (mbedtls_sha1_context *) ctx );\n\n    return( ctx );\n}\n\nstatic void sha1_clone_wrap( void *dst, const void *src )\n{\n    mbedtls_sha1_clone( (mbedtls_sha1_context *) dst,\n                  (const mbedtls_sha1_context *) src );\n}\n\nstatic void sha1_ctx_free( void *ctx )\n{\n    mbedtls_sha1_free( (mbedtls_sha1_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic void sha1_process_wrap( void *ctx, const unsigned char *data )\n{\n    mbedtls_sha1_process( (mbedtls_sha1_context *) ctx, data );\n}\n\nconst mbedtls_md_info_t mbedtls_sha1_info = {\n    MBEDTLS_MD_SHA1,\n    \"SHA1\",\n    20,\n    64,\n    sha1_starts_wrap,\n    sha1_update_wrap,\n    sha1_finish_wrap,\n    mbedtls_sha1,\n    sha1_ctx_alloc,\n    sha1_ctx_free,\n    sha1_clone_wrap,\n    sha1_process_wrap,\n};\n\n#endif /* MBEDTLS_SHA1_C */\n\n/*\n * Wrappers for generic message digests\n */\n#if defined(MBEDTLS_SHA256_C)\n\nstatic void sha224_starts_wrap( void *ctx )\n{\n    mbedtls_sha256_starts( (mbedtls_sha256_context *) ctx, 1 );\n}\n\nstatic void sha224_update_wrap( void *ctx, const unsigned char *input,\n                                size_t ilen )\n{\n    mbedtls_sha256_update( (mbedtls_sha256_context *) ctx, input, ilen );\n}\n\nstatic void sha224_finish_wrap( void *ctx, unsigned char *output )\n{\n    mbedtls_sha256_finish( (mbedtls_sha256_context *) ctx, output );\n}\n\nstatic void sha224_wrap( const unsigned char *input, size_t ilen,\n                    unsigned char *output )\n{\n    mbedtls_sha256( input, ilen, output, 1 );\n}\n\nstatic void *sha224_ctx_alloc( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha256_context ) );\n\n    if( ctx != NULL )\n        mbedtls_sha256_init( (mbedtls_sha256_context *) ctx );\n\n    return( ctx );\n}\n\nstatic void sha224_ctx_free( void *ctx )\n{\n    mbedtls_sha256_free( (mbedtls_sha256_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic void sha224_clone_wrap( void *dst, const void *src )\n{\n    mbedtls_sha256_clone( (mbedtls_sha256_context *) dst,\n                    (const mbedtls_sha256_context *) src );\n}\n\nstatic void sha224_process_wrap( void *ctx, const unsigned char *data )\n{\n    mbedtls_sha256_process( (mbedtls_sha256_context *) ctx, data );\n}\n\nconst mbedtls_md_info_t mbedtls_sha224_info = {\n    MBEDTLS_MD_SHA224,\n    \"SHA224\",\n    28,\n    64,\n    sha224_starts_wrap,\n    sha224_update_wrap,\n    sha224_finish_wrap,\n    sha224_wrap,\n    sha224_ctx_alloc,\n    sha224_ctx_free,\n    sha224_clone_wrap,\n    sha224_process_wrap,\n};\n\nstatic void sha256_starts_wrap( void *ctx )\n{\n    mbedtls_sha256_starts( (mbedtls_sha256_context *) ctx, 0 );\n}\n\nstatic void sha256_wrap( const unsigned char *input, size_t ilen,\n                    unsigned char *output )\n{\n    mbedtls_sha256( input, ilen, output, 0 );\n}\n\nconst mbedtls_md_info_t mbedtls_sha256_info = {\n    MBEDTLS_MD_SHA256,\n    \"SHA256\",\n    32,\n    64,\n    sha256_starts_wrap,\n    sha224_update_wrap,\n    sha224_finish_wrap,\n    sha256_wrap,\n    sha224_ctx_alloc,\n    sha224_ctx_free,\n    sha224_clone_wrap,\n    sha224_process_wrap,\n};\n\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n\nstatic void sha384_starts_wrap( void *ctx )\n{\n    mbedtls_sha512_starts( (mbedtls_sha512_context *) ctx, 1 );\n}\n\nstatic void sha384_update_wrap( void *ctx, const unsigned char *input,\n                                size_t ilen )\n{\n    mbedtls_sha512_update( (mbedtls_sha512_context *) ctx, input, ilen );\n}\n\nstatic void sha384_finish_wrap( void *ctx, unsigned char *output )\n{\n    mbedtls_sha512_finish( (mbedtls_sha512_context *) ctx, output );\n}\n\nstatic void sha384_wrap( const unsigned char *input, size_t ilen,\n                    unsigned char *output )\n{\n    mbedtls_sha512( input, ilen, output, 1 );\n}\n\nstatic void *sha384_ctx_alloc( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_sha512_context ) );\n\n    if( ctx != NULL )\n        mbedtls_sha512_init( (mbedtls_sha512_context *) ctx );\n\n    return( ctx );\n}\n\nstatic void sha384_ctx_free( void *ctx )\n{\n    mbedtls_sha512_free( (mbedtls_sha512_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic void sha384_clone_wrap( void *dst, const void *src )\n{\n    mbedtls_sha512_clone( (mbedtls_sha512_context *) dst,\n                    (const mbedtls_sha512_context *) src );\n}\n\nstatic void sha384_process_wrap( void *ctx, const unsigned char *data )\n{\n    mbedtls_sha512_process( (mbedtls_sha512_context *) ctx, data );\n}\n\nconst mbedtls_md_info_t mbedtls_sha384_info = {\n    MBEDTLS_MD_SHA384,\n    \"SHA384\",\n    48,\n    128,\n    sha384_starts_wrap,\n    sha384_update_wrap,\n    sha384_finish_wrap,\n    sha384_wrap,\n    sha384_ctx_alloc,\n    sha384_ctx_free,\n    sha384_clone_wrap,\n    sha384_process_wrap,\n};\n\nstatic void sha512_starts_wrap( void *ctx )\n{\n    mbedtls_sha512_starts( (mbedtls_sha512_context *) ctx, 0 );\n}\n\nstatic void sha512_wrap( const unsigned char *input, size_t ilen,\n                    unsigned char *output )\n{\n    mbedtls_sha512( input, ilen, output, 0 );\n}\n\nconst mbedtls_md_info_t mbedtls_sha512_info = {\n    MBEDTLS_MD_SHA512,\n    \"SHA512\",\n    64,\n    128,\n    sha512_starts_wrap,\n    sha384_update_wrap,\n    sha384_finish_wrap,\n    sha512_wrap,\n    sha384_ctx_alloc,\n    sha384_ctx_free,\n    sha384_clone_wrap,\n    sha384_process_wrap,\n};\n\n#endif /* MBEDTLS_SHA512_C */\n\n#endif /* MBEDTLS_MD_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/memory_buffer_alloc.c",
    "content": "/*\n *  Buffer-based memory allocator\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n#include \"mbedtls/memory_buffer_alloc.h\"\n\n/* No need for the header guard as MBEDTLS_MEMORY_BUFFER_ALLOC_C\n   is dependent upon MBEDTLS_PLATFORM_C */\n#include \"mbedtls/platform.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_MEMORY_BACKTRACE)\n#include <execinfo.h>\n#endif\n\n#if defined(MBEDTLS_THREADING_C)\n#include \"mbedtls/threading.h\"\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n#define MAGIC1       0xFF00AA55\n#define MAGIC2       0xEE119966\n#define MAX_BT 20\n\ntypedef struct _memory_header memory_header;\nstruct _memory_header\n{\n    size_t          magic1;\n    size_t          size;\n    size_t          alloc;\n    memory_header   *prev;\n    memory_header   *next;\n    memory_header   *prev_free;\n    memory_header   *next_free;\n#if defined(MBEDTLS_MEMORY_BACKTRACE)\n    char            **trace;\n    size_t          trace_count;\n#endif\n    size_t          magic2;\n};\n\ntypedef struct\n{\n    unsigned char   *buf;\n    size_t          len;\n    memory_header   *first;\n    memory_header   *first_free;\n    int             verify;\n#if defined(MBEDTLS_MEMORY_DEBUG)\n    size_t          alloc_count;\n    size_t          free_count;\n    size_t          total_used;\n    size_t          maximum_used;\n    size_t          header_count;\n    size_t          maximum_header_count;\n#endif\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_threading_mutex_t   mutex;\n#endif\n}\nbuffer_alloc_ctx;\n\nstatic buffer_alloc_ctx heap;\n\n#if defined(MBEDTLS_MEMORY_DEBUG)\nstatic void debug_header( memory_header *hdr )\n{\n#if defined(MBEDTLS_MEMORY_BACKTRACE)\n    size_t i;\n#endif\n\n    mbedtls_fprintf( stderr, \"HDR:  PTR(%10zu), PREV(%10zu), NEXT(%10zu), \"\n                              \"ALLOC(%zu), SIZE(%10zu)\\n\",\n                      (size_t) hdr, (size_t) hdr->prev, (size_t) hdr->next,\n                      hdr->alloc, hdr->size );\n    mbedtls_fprintf( stderr, \"      FPREV(%10zu), FNEXT(%10zu)\\n\",\n                      (size_t) hdr->prev_free, (size_t) hdr->next_free );\n\n#if defined(MBEDTLS_MEMORY_BACKTRACE)\n    mbedtls_fprintf( stderr, \"TRACE: \\n\" );\n    for( i = 0; i < hdr->trace_count; i++ )\n        mbedtls_fprintf( stderr, \"%s\\n\", hdr->trace[i] );\n    mbedtls_fprintf( stderr, \"\\n\" );\n#endif\n}\n\nstatic void debug_chain()\n{\n    memory_header *cur = heap.first;\n\n    mbedtls_fprintf( stderr, \"\\nBlock list\\n\" );\n    while( cur != NULL )\n    {\n        debug_header( cur );\n        cur = cur->next;\n    }\n\n    mbedtls_fprintf( stderr, \"Free list\\n\" );\n    cur = heap.first_free;\n\n    while( cur != NULL )\n    {\n        debug_header( cur );\n        cur = cur->next_free;\n    }\n}\n#endif /* MBEDTLS_MEMORY_DEBUG */\n\nstatic int verify_header( memory_header *hdr )\n{\n    if( hdr->magic1 != MAGIC1 )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_fprintf( stderr, \"FATAL: MAGIC1 mismatch\\n\" );\n#endif\n        return( 1 );\n    }\n\n    if( hdr->magic2 != MAGIC2 )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_fprintf( stderr, \"FATAL: MAGIC2 mismatch\\n\" );\n#endif\n        return( 1 );\n    }\n\n    if( hdr->alloc > 1 )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_fprintf( stderr, \"FATAL: alloc has illegal value\\n\" );\n#endif\n        return( 1 );\n    }\n\n    if( hdr->prev != NULL && hdr->prev == hdr->next )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_fprintf( stderr, \"FATAL: prev == next\\n\" );\n#endif\n        return( 1 );\n    }\n\n    if( hdr->prev_free != NULL && hdr->prev_free == hdr->next_free )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_fprintf( stderr, \"FATAL: prev_free == next_free\\n\" );\n#endif\n        return( 1 );\n    }\n\n    return( 0 );\n}\n\nstatic int verify_chain()\n{\n    memory_header *prv = heap.first, *cur = heap.first->next;\n\n    if( verify_header( heap.first ) != 0 )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_fprintf( stderr, \"FATAL: verification of first header \"\n                                  \"failed\\n\" );\n#endif\n        return( 1 );\n    }\n\n    if( heap.first->prev != NULL )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_fprintf( stderr, \"FATAL: verification failed: \"\n                                  \"first->prev != NULL\\n\" );\n#endif\n        return( 1 );\n    }\n\n    while( cur != NULL )\n    {\n        if( verify_header( cur ) != 0 )\n        {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n            mbedtls_fprintf( stderr, \"FATAL: verification of header \"\n                                      \"failed\\n\" );\n#endif\n            return( 1 );\n        }\n\n        if( cur->prev != prv )\n        {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n            mbedtls_fprintf( stderr, \"FATAL: verification failed: \"\n                                      \"cur->prev != prv\\n\" );\n#endif\n            return( 1 );\n        }\n\n        prv = cur;\n        cur = cur->next;\n    }\n\n    return( 0 );\n}\n\nstatic void *buffer_alloc_calloc( size_t n, size_t size )\n{\n    memory_header *new, *cur = heap.first_free;\n    unsigned char *p;\n    void *ret;\n    size_t original_len, len;\n#if defined(MBEDTLS_MEMORY_BACKTRACE)\n    void *trace_buffer[MAX_BT];\n    size_t trace_cnt;\n#endif\n\n    if( heap.buf == NULL || heap.first == NULL )\n        return( NULL );\n\n    original_len = len = n * size;\n\n    if( n != 0 && len / n != size )\n        return( NULL );\n\n    if( len % MBEDTLS_MEMORY_ALIGN_MULTIPLE )\n    {\n        len -= len % MBEDTLS_MEMORY_ALIGN_MULTIPLE;\n        len += MBEDTLS_MEMORY_ALIGN_MULTIPLE;\n    }\n\n    // Find block that fits\n    //\n    while( cur != NULL )\n    {\n        if( cur->size >= len )\n            break;\n\n        cur = cur->next_free;\n    }\n\n    if( cur == NULL )\n        return( NULL );\n\n    if( cur->alloc != 0 )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_fprintf( stderr, \"FATAL: block in free_list but allocated \"\n                                  \"data\\n\" );\n#endif\n        mbedtls_exit( 1 );\n    }\n\n#if defined(MBEDTLS_MEMORY_DEBUG)\n    heap.alloc_count++;\n#endif\n\n    // Found location, split block if > memory_header + 4 room left\n    //\n    if( cur->size - len < sizeof(memory_header) +\n                          MBEDTLS_MEMORY_ALIGN_MULTIPLE )\n    {\n        cur->alloc = 1;\n\n        // Remove from free_list\n        //\n        if( cur->prev_free != NULL )\n            cur->prev_free->next_free = cur->next_free;\n        else\n            heap.first_free = cur->next_free;\n\n        if( cur->next_free != NULL )\n            cur->next_free->prev_free = cur->prev_free;\n\n        cur->prev_free = NULL;\n        cur->next_free = NULL;\n\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        heap.total_used += cur->size;\n        if( heap.total_used > heap.maximum_used )\n            heap.maximum_used = heap.total_used;\n#endif\n#if defined(MBEDTLS_MEMORY_BACKTRACE)\n        trace_cnt = backtrace( trace_buffer, MAX_BT );\n        cur->trace = backtrace_symbols( trace_buffer, trace_cnt );\n        cur->trace_count = trace_cnt;\n#endif\n\n        if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 )\n            mbedtls_exit( 1 );\n\n        ret = (unsigned char *) cur + sizeof( memory_header );\n        memset( ret, 0, original_len );\n\n        return( ret );\n    }\n\n    p = ( (unsigned char *) cur ) + sizeof(memory_header) + len;\n    new = (memory_header *) p;\n\n    new->size = cur->size - len - sizeof(memory_header);\n    new->alloc = 0;\n    new->prev = cur;\n    new->next = cur->next;\n#if defined(MBEDTLS_MEMORY_BACKTRACE)\n    new->trace = NULL;\n    new->trace_count = 0;\n#endif\n    new->magic1 = MAGIC1;\n    new->magic2 = MAGIC2;\n\n    if( new->next != NULL )\n        new->next->prev = new;\n\n    // Replace cur with new in free_list\n    //\n    new->prev_free = cur->prev_free;\n    new->next_free = cur->next_free;\n    if( new->prev_free != NULL )\n        new->prev_free->next_free = new;\n    else\n        heap.first_free = new;\n\n    if( new->next_free != NULL )\n        new->next_free->prev_free = new;\n\n    cur->alloc = 1;\n    cur->size = len;\n    cur->next = new;\n    cur->prev_free = NULL;\n    cur->next_free = NULL;\n\n#if defined(MBEDTLS_MEMORY_DEBUG)\n    heap.header_count++;\n    if( heap.header_count > heap.maximum_header_count )\n        heap.maximum_header_count = heap.header_count;\n    heap.total_used += cur->size;\n    if( heap.total_used > heap.maximum_used )\n        heap.maximum_used = heap.total_used;\n#endif\n#if defined(MBEDTLS_MEMORY_BACKTRACE)\n    trace_cnt = backtrace( trace_buffer, MAX_BT );\n    cur->trace = backtrace_symbols( trace_buffer, trace_cnt );\n    cur->trace_count = trace_cnt;\n#endif\n\n    if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_ALLOC ) && verify_chain() != 0 )\n        mbedtls_exit( 1 );\n\n    ret = (unsigned char *) cur + sizeof( memory_header );\n    memset( ret, 0, original_len );\n\n    return( ret );\n}\n\nstatic void buffer_alloc_free( void *ptr )\n{\n    memory_header *hdr, *old = NULL;\n    unsigned char *p = (unsigned char *) ptr;\n\n    if( ptr == NULL || heap.buf == NULL || heap.first == NULL )\n        return;\n\n    if( p < heap.buf || p > heap.buf + heap.len )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_fprintf( stderr, \"FATAL: mbedtls_free() outside of managed \"\n                                  \"space\\n\" );\n#endif\n        mbedtls_exit( 1 );\n    }\n\n    p -= sizeof(memory_header);\n    hdr = (memory_header *) p;\n\n    if( verify_header( hdr ) != 0 )\n        mbedtls_exit( 1 );\n\n    if( hdr->alloc != 1 )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_fprintf( stderr, \"FATAL: mbedtls_free() on unallocated \"\n                                  \"data\\n\" );\n#endif\n        mbedtls_exit( 1 );\n    }\n\n    hdr->alloc = 0;\n\n#if defined(MBEDTLS_MEMORY_DEBUG)\n    heap.free_count++;\n    heap.total_used -= hdr->size;\n#endif\n\n#if defined(MBEDTLS_MEMORY_BACKTRACE)\n    free( hdr->trace );\n    hdr->trace = NULL;\n    hdr->trace_count = 0;\n#endif\n\n    // Regroup with block before\n    //\n    if( hdr->prev != NULL && hdr->prev->alloc == 0 )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        heap.header_count--;\n#endif\n        hdr->prev->size += sizeof(memory_header) + hdr->size;\n        hdr->prev->next = hdr->next;\n        old = hdr;\n        hdr = hdr->prev;\n\n        if( hdr->next != NULL )\n            hdr->next->prev = hdr;\n\n        memset( old, 0, sizeof(memory_header) );\n    }\n\n    // Regroup with block after\n    //\n    if( hdr->next != NULL && hdr->next->alloc == 0 )\n    {\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        heap.header_count--;\n#endif\n        hdr->size += sizeof(memory_header) + hdr->next->size;\n        old = hdr->next;\n        hdr->next = hdr->next->next;\n\n        if( hdr->prev_free != NULL || hdr->next_free != NULL )\n        {\n            if( hdr->prev_free != NULL )\n                hdr->prev_free->next_free = hdr->next_free;\n            else\n                heap.first_free = hdr->next_free;\n\n            if( hdr->next_free != NULL )\n                hdr->next_free->prev_free = hdr->prev_free;\n        }\n\n        hdr->prev_free = old->prev_free;\n        hdr->next_free = old->next_free;\n\n        if( hdr->prev_free != NULL )\n            hdr->prev_free->next_free = hdr;\n        else\n            heap.first_free = hdr;\n\n        if( hdr->next_free != NULL )\n            hdr->next_free->prev_free = hdr;\n\n        if( hdr->next != NULL )\n            hdr->next->prev = hdr;\n\n        memset( old, 0, sizeof(memory_header) );\n    }\n\n    // Prepend to free_list if we have not merged\n    // (Does not have to stay in same order as prev / next list)\n    //\n    if( old == NULL )\n    {\n        hdr->next_free = heap.first_free;\n        if( heap.first_free != NULL )\n            heap.first_free->prev_free = hdr;\n        heap.first_free = hdr;\n    }\n\n    if( ( heap.verify & MBEDTLS_MEMORY_VERIFY_FREE ) && verify_chain() != 0 )\n        mbedtls_exit( 1 );\n}\n\nvoid mbedtls_memory_buffer_set_verify( int verify )\n{\n    heap.verify = verify;\n}\n\nint mbedtls_memory_buffer_alloc_verify()\n{\n    return verify_chain();\n}\n\n#if defined(MBEDTLS_MEMORY_DEBUG)\nvoid mbedtls_memory_buffer_alloc_status()\n{\n    mbedtls_fprintf( stderr,\n                      \"Current use: %zu blocks / %zu bytes, max: %zu blocks / \"\n                      \"%zu bytes (total %zu bytes), alloc / free: %zu / %zu\\n\",\n                      heap.header_count, heap.total_used,\n                      heap.maximum_header_count, heap.maximum_used,\n                      heap.maximum_header_count * sizeof( memory_header )\n                      + heap.maximum_used,\n                      heap.alloc_count, heap.free_count );\n\n    if( heap.first->next == NULL )\n        mbedtls_fprintf( stderr, \"All memory de-allocated in stack buffer\\n\" );\n    else\n    {\n        mbedtls_fprintf( stderr, \"Memory currently allocated:\\n\" );\n        debug_chain();\n    }\n}\n\nvoid mbedtls_memory_buffer_alloc_max_get( size_t *max_used, size_t *max_blocks )\n{\n    *max_used   = heap.maximum_used;\n    *max_blocks = heap.maximum_header_count;\n}\n\nvoid mbedtls_memory_buffer_alloc_max_reset( void )\n{\n    heap.maximum_used = 0;\n    heap.maximum_header_count = 0;\n}\n\nvoid mbedtls_memory_buffer_alloc_cur_get( size_t *cur_used, size_t *cur_blocks )\n{\n    *cur_used   = heap.total_used;\n    *cur_blocks = heap.header_count;\n}\n#endif /* MBEDTLS_MEMORY_DEBUG */\n\n#if defined(MBEDTLS_THREADING_C)\nstatic void *buffer_alloc_calloc_mutexed( size_t n, size_t size )\n{\n    void *buf;\n    if( mbedtls_mutex_lock( &heap.mutex ) != 0 )\n        return( NULL );\n    buf = buffer_alloc_calloc( n, size );\n    if( mbedtls_mutex_unlock( &heap.mutex ) )\n        return( NULL );\n    return( buf );\n}\n\nstatic void buffer_alloc_free_mutexed( void *ptr )\n{\n    /* We have to good option here, but corrupting the heap seems\n     * worse than loosing memory. */\n    if( mbedtls_mutex_lock( &heap.mutex ) )\n        return;\n    buffer_alloc_free( ptr );\n    (void) mbedtls_mutex_unlock( &heap.mutex );\n}\n#endif /* MBEDTLS_THREADING_C */\n\nvoid mbedtls_memory_buffer_alloc_init( unsigned char *buf, size_t len )\n{\n    memset( &heap, 0, sizeof(buffer_alloc_ctx) );\n    memset( buf, 0, len );\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_init( &heap.mutex );\n    mbedtls_platform_set_calloc_free( buffer_alloc_calloc_mutexed,\n                              buffer_alloc_free_mutexed );\n#else\n    mbedtls_platform_set_calloc_free( buffer_alloc_calloc, buffer_alloc_free );\n#endif\n\n    if( (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE )\n    {\n        /* Adjust len first since buf is used in the computation */\n        len -= MBEDTLS_MEMORY_ALIGN_MULTIPLE\n             - (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE;\n        buf += MBEDTLS_MEMORY_ALIGN_MULTIPLE\n             - (size_t) buf % MBEDTLS_MEMORY_ALIGN_MULTIPLE;\n    }\n\n    heap.buf = buf;\n    heap.len = len;\n\n    heap.first = (memory_header *) buf;\n    heap.first->size = len - sizeof(memory_header);\n    heap.first->magic1 = MAGIC1;\n    heap.first->magic2 = MAGIC2;\n    heap.first_free = heap.first;\n}\n\nvoid mbedtls_memory_buffer_alloc_free()\n{\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_free( &heap.mutex );\n#endif\n    mbedtls_zeroize( &heap, sizeof(buffer_alloc_ctx) );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\nstatic int check_pointer( void *p )\n{\n    if( p == NULL )\n        return( -1 );\n\n    if( (size_t) p % MBEDTLS_MEMORY_ALIGN_MULTIPLE != 0 )\n        return( -1 );\n\n    return( 0 );\n}\n\nstatic int check_all_free( )\n{\n    if(\n#if defined(MBEDTLS_MEMORY_DEBUG)\n        heap.total_used != 0 ||\n#endif\n        heap.first != heap.first_free ||\n        (void *) heap.first != (void *) heap.buf )\n    {\n        return( -1 );\n    }\n\n    return( 0 );\n}\n\n#define TEST_ASSERT( condition )            \\\n    if( ! (condition) )                     \\\n    {                                       \\\n        if( verbose != 0 )                  \\\n            mbedtls_printf( \"failed\\n\" );  \\\n                                            \\\n        ret = 1;                            \\\n        goto cleanup;                       \\\n    }\n\nint mbedtls_memory_buffer_alloc_self_test( int verbose )\n{\n    unsigned char buf[1024];\n    unsigned char *p, *q, *r, *end;\n    int ret = 0;\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  MBA test #1 (basic alloc-free cycle): \" );\n\n    mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) );\n\n    p = mbedtls_calloc( 1, 1 );\n    q = mbedtls_calloc( 1, 128 );\n    r = mbedtls_calloc( 1, 16 );\n\n    TEST_ASSERT( check_pointer( p ) == 0 &&\n                 check_pointer( q ) == 0 &&\n                 check_pointer( r ) == 0 );\n\n    mbedtls_free( r );\n    mbedtls_free( q );\n    mbedtls_free( p );\n\n    TEST_ASSERT( check_all_free( ) == 0 );\n\n    /* Memorize end to compare with the next test */\n    end = heap.buf + heap.len;\n\n    mbedtls_memory_buffer_alloc_free( );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  MBA test #2 (buf not aligned): \" );\n\n    mbedtls_memory_buffer_alloc_init( buf + 1, sizeof( buf ) - 1 );\n\n    TEST_ASSERT( heap.buf + heap.len == end );\n\n    p = mbedtls_calloc( 1, 1 );\n    q = mbedtls_calloc( 1, 128 );\n    r = mbedtls_calloc( 1, 16 );\n\n    TEST_ASSERT( check_pointer( p ) == 0 &&\n                 check_pointer( q ) == 0 &&\n                 check_pointer( r ) == 0 );\n\n    mbedtls_free( r );\n    mbedtls_free( q );\n    mbedtls_free( p );\n\n    TEST_ASSERT( check_all_free( ) == 0 );\n\n    mbedtls_memory_buffer_alloc_free( );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  MBA test #3 (full): \" );\n\n    mbedtls_memory_buffer_alloc_init( buf, sizeof( buf ) );\n\n    p = mbedtls_calloc( 1, sizeof( buf ) - sizeof( memory_header ) );\n\n    TEST_ASSERT( check_pointer( p ) == 0 );\n    TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL );\n\n    mbedtls_free( p );\n\n    p = mbedtls_calloc( 1, sizeof( buf ) - 2 * sizeof( memory_header ) - 16 );\n    q = mbedtls_calloc( 1, 16 );\n\n    TEST_ASSERT( check_pointer( p ) == 0 && check_pointer( q ) == 0 );\n    TEST_ASSERT( mbedtls_calloc( 1, 1 ) == NULL );\n\n    mbedtls_free( q );\n\n    TEST_ASSERT( mbedtls_calloc( 1, 17 ) == NULL );\n\n    mbedtls_free( p );\n\n    TEST_ASSERT( check_all_free( ) == 0 );\n\n    mbedtls_memory_buffer_alloc_free( );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\ncleanup:\n    mbedtls_memory_buffer_alloc_free( );\n\n    return( ret );\n}\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/net_sockets.c",
    "content": "/*\n *  TCP/IP or UDP/IP networking functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_NET_C)\n\n#if !defined(unix) && !defined(__unix__) && !defined(__unix) && \\\n    !defined(__APPLE__) && !defined(_WIN32)\n#error \"This module only works on Unix and Windows, see MBEDTLS_NET_C in config.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#endif\n\n#include \"mbedtls/net_sockets.h\"\n\n#include <string.h>\n\n#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \\\n    !defined(EFI32)\n\n#ifdef _WIN32_WINNT\n#undef _WIN32_WINNT\n#endif\n/* Enables getaddrinfo() & Co */\n#define _WIN32_WINNT 0x0501\n#include <ws2tcpip.h>\n\n#include <winsock2.h>\n#include <windows.h>\n\n#if defined(_MSC_VER)\n#if defined(_WIN32_WCE)\n#pragma comment( lib, \"ws2.lib\" )\n#else\n#pragma comment( lib, \"ws2_32.lib\" )\n#endif\n#endif /* _MSC_VER */\n\n#define read(fd,buf,len)        recv(fd,(char*)buf,(int) len,0)\n#define write(fd,buf,len)       send(fd,(char*)buf,(int) len,0)\n#define close(fd)               closesocket(fd)\n\nstatic int wsa_init_done = 0;\n\n#else /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <sys/time.h>\n#include <unistd.h>\n#include <signal.h>\n#include <fcntl.h>\n#include <netdb.h>\n#include <errno.h>\n\n#endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */\n\n/* Some MS functions want int and MSVC warns if we pass size_t,\n * but the standard fucntions use socklen_t, so cast only for MSVC */\n#if defined(_MSC_VER)\n#define MSVC_INT_CAST   (int)\n#else\n#define MSVC_INT_CAST\n#endif\n\n#include <stdio.h>\n\n#include <time.h>\n\n#include <stdint.h>\n\n/*\n * Prepare for using the sockets interface\n */\nstatic int net_prepare( void )\n{\n#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \\\n    !defined(EFI32)\n    WSADATA wsaData;\n\n    if( wsa_init_done == 0 )\n    {\n        if( WSAStartup( MAKEWORD(2,0), &wsaData ) != 0 )\n            return( MBEDTLS_ERR_NET_SOCKET_FAILED );\n\n        wsa_init_done = 1;\n    }\n#else\n#if !defined(EFIX64) && !defined(EFI32)\n    signal( SIGPIPE, SIG_IGN );\n#endif\n#endif\n    return( 0 );\n}\n\n/*\n * Initiate a TCP connection with host:port and the given protocol\n */\nvoid* mbedtls_net_connect( const char *host,\n                         const char *port, int proto )\n{\n    int ret;\n    struct addrinfo hints, *addr_list, *cur;\n    mbedtls_net_context *ctx = mbedtls_calloc(1, sizeof(mbedtls_net_context));\n    \n    ctx->fd = -1;\n\n    if( ( ret = net_prepare() ) != 0 )\n        return( ret );\n\n    /* Do name resolution with both IPv6 and IPv4 */\n    memset( &hints, 0, sizeof( hints ) );\n    hints.ai_family = AF_UNSPEC;\n    hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;\n    hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;\n\n    if( getaddrinfo( host, port, &hints, &addr_list ) != 0 )\n        return( MBEDTLS_ERR_NET_UNKNOWN_HOST );\n\n    /* Try the sockaddrs until a connection succeeds */\n    ret = MBEDTLS_ERR_NET_UNKNOWN_HOST;\n    for( cur = addr_list; cur != NULL; cur = cur->ai_next )\n    {\n        ctx->fd = (int) socket( cur->ai_family, cur->ai_socktype,\n                            cur->ai_protocol );\n        if( ctx->fd < 0 )\n        {\n            ret = MBEDTLS_ERR_NET_SOCKET_FAILED;\n            continue;\n        }\n\n        if( connect( ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen ) == 0 )\n        {\n            ret = 0;\n            break;\n        }\n\n        close( ctx->fd );\n        ret = MBEDTLS_ERR_NET_CONNECT_FAILED;\n    }\n\n    freeaddrinfo( addr_list );\n\n    if (ret != 0)\n    {\n        mbedtls_free(ctx);\n        ctx->fd = -1;\n    }\n\n    return ( ctx );\n}\n\n/*\n * Create a listening socket on bind_ip:port\n */\nint mbedtls_net_bind( mbedtls_net_context *ctx, const char *bind_ip, const char *port, int proto )\n{\n    int n, ret;\n    struct addrinfo hints, *addr_list, *cur;\n\n    if( ( ret = net_prepare() ) != 0 )\n        return( ret );\n\n    /* Bind to IPv6 and/or IPv4, but only in the desired protocol */\n    memset( &hints, 0, sizeof( hints ) );\n    hints.ai_family = AF_UNSPEC;\n    hints.ai_socktype = proto == MBEDTLS_NET_PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;\n    hints.ai_protocol = proto == MBEDTLS_NET_PROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;\n    if( bind_ip == NULL )\n        hints.ai_flags = AI_PASSIVE;\n\n    if( getaddrinfo( bind_ip, port, &hints, &addr_list ) != 0 )\n        return( MBEDTLS_ERR_NET_UNKNOWN_HOST );\n\n    /* Try the sockaddrs until a binding succeeds */\n    ret = MBEDTLS_ERR_NET_UNKNOWN_HOST;\n    for( cur = addr_list; cur != NULL; cur = cur->ai_next )\n    {\n        ctx->fd = (int) socket( cur->ai_family, cur->ai_socktype,\n                            cur->ai_protocol );\n        if( ctx->fd < 0 )\n        {\n            ret = MBEDTLS_ERR_NET_SOCKET_FAILED;\n            continue;\n        }\n\n        n = 1;\n        if( setsockopt( ctx->fd, SOL_SOCKET, SO_REUSEADDR,\n                        (const char *) &n, sizeof( n ) ) != 0 )\n        {\n            close( ctx->fd );\n            ret = MBEDTLS_ERR_NET_SOCKET_FAILED;\n            continue;\n        }\n\n        if( bind( ctx->fd, cur->ai_addr, MSVC_INT_CAST cur->ai_addrlen ) != 0 )\n        {\n            close( ctx->fd );\n            ret = MBEDTLS_ERR_NET_BIND_FAILED;\n            continue;\n        }\n\n        /* Listen only makes sense for TCP */\n        if( proto == MBEDTLS_NET_PROTO_TCP )\n        {\n            if( listen( ctx->fd, MBEDTLS_NET_LISTEN_BACKLOG ) != 0 )\n            {\n                close( ctx->fd );\n                ret = MBEDTLS_ERR_NET_LISTEN_FAILED;\n                continue;\n            }\n        }\n\n        /* Bind was successful */\n        ret = 0;\n        break;\n    }\n\n    freeaddrinfo( addr_list );\n\n    return( ret );\n\n}\n\n#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \\\n    !defined(EFI32)\n/*\n * Check if the requested operation would be blocking on a non-blocking socket\n * and thus 'failed' with a negative return value.\n */\nstatic int net_would_block( const mbedtls_net_context *ctx )\n{\n    ((void) ctx);\n    return( WSAGetLastError() == WSAEWOULDBLOCK );\n}\n#else\n/*\n * Check if the requested operation would be blocking on a non-blocking socket\n * and thus 'failed' with a negative return value.\n *\n * Note: on a blocking socket this function always returns 0!\n */\nstatic int net_would_block( const mbedtls_net_context *ctx )\n{\n    /*\n     * Never return 'WOULD BLOCK' on a non-blocking socket\n     */\n    if( ( fcntl( ctx->fd, F_GETFL ) & O_NONBLOCK ) != O_NONBLOCK )\n        return( 0 );\n\n    switch( errno )\n    {\n#if defined EAGAIN\n        case EAGAIN:\n#endif\n#if defined EWOULDBLOCK && EWOULDBLOCK != EAGAIN\n        case EWOULDBLOCK:\n#endif\n            return( 1 );\n    }\n    return( 0 );\n}\n#endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */\n\n/*\n * Accept a connection from a remote client\n */\nint mbedtls_net_accept( mbedtls_net_context *bind_ctx,\n                        mbedtls_net_context *client_ctx,\n                        void *client_ip, size_t buf_size, size_t *ip_len )\n{\n    int ret;\n    int type;\n\n    struct sockaddr_storage client_addr;\n\n#if defined(__socklen_t_defined) || defined(_SOCKLEN_T) ||  \\\n    defined(_SOCKLEN_T_DECLARED) || defined(__DEFINED_socklen_t)\n    socklen_t n = (socklen_t) sizeof( client_addr );\n    socklen_t type_len = (socklen_t) sizeof( type );\n#else\n    int n = (int) sizeof( client_addr );\n    int type_len = (int) sizeof( type );\n#endif\n\n    /* Is this a TCP or UDP socket? */\n    if( getsockopt( bind_ctx->fd, SOL_SOCKET, SO_TYPE,\n                    (void *) &type, &type_len ) != 0 ||\n        ( type != SOCK_STREAM && type != SOCK_DGRAM ) )\n    {\n        return( MBEDTLS_ERR_NET_ACCEPT_FAILED );\n    }\n\n    if( type == SOCK_STREAM )\n    {\n        /* TCP: actual accept() */\n        ret = client_ctx->fd = (int) accept( bind_ctx->fd,\n                                             (struct sockaddr *) &client_addr, &n );\n    }\n    else\n    {\n        /* UDP: wait for a message, but keep it in the queue */\n        char buf[1] = { 0 };\n\n        ret = (int) recvfrom( bind_ctx->fd, buf, sizeof( buf ), MSG_PEEK,\n                        (struct sockaddr *) &client_addr, &n );\n\n#if defined(_WIN32)\n        if( ret == SOCKET_ERROR &&\n            WSAGetLastError() == WSAEMSGSIZE )\n        {\n            /* We know buf is too small, thanks, just peeking here */\n            ret = 0;\n        }\n#endif\n    }\n\n    if( ret < 0 )\n    {\n        if( net_would_block( bind_ctx ) != 0 )\n            return( MBEDTLS_ERR_SSL_WANT_READ );\n\n        return( MBEDTLS_ERR_NET_ACCEPT_FAILED );\n    }\n\n    /* UDP: hijack the listening socket to communicate with the client,\n     * then bind a new socket to accept new connections */\n    if( type != SOCK_STREAM )\n    {\n        struct sockaddr_storage local_addr;\n        int one = 1;\n\n        if( connect( bind_ctx->fd, (struct sockaddr *) &client_addr, n ) != 0 )\n            return( MBEDTLS_ERR_NET_ACCEPT_FAILED );\n\n        client_ctx->fd = bind_ctx->fd;\n        bind_ctx->fd   = -1; /* In case we exit early */\n\n        n = sizeof( struct sockaddr_storage );\n        if( getsockname( client_ctx->fd,\n                         (struct sockaddr *) &local_addr, &n ) != 0 ||\n            ( bind_ctx->fd = (int) socket( local_addr.ss_family,\n                                           SOCK_DGRAM, IPPROTO_UDP ) ) < 0 ||\n            setsockopt( bind_ctx->fd, SOL_SOCKET, SO_REUSEADDR,\n                        (const char *) &one, sizeof( one ) ) != 0 )\n        {\n            return( MBEDTLS_ERR_NET_SOCKET_FAILED );\n        }\n\n        if( bind( bind_ctx->fd, (struct sockaddr *) &local_addr, n ) != 0 )\n        {\n            return( MBEDTLS_ERR_NET_BIND_FAILED );\n        }\n    }\n\n    if( client_ip != NULL )\n    {\n        if( client_addr.ss_family == AF_INET )\n        {\n            struct sockaddr_in *addr4 = (struct sockaddr_in *) &client_addr;\n            *ip_len = sizeof( addr4->sin_addr.s_addr );\n\n            if( buf_size < *ip_len )\n                return( MBEDTLS_ERR_NET_BUFFER_TOO_SMALL );\n\n            memcpy( client_ip, &addr4->sin_addr.s_addr, *ip_len );\n        }\n        else\n        {\n            struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) &client_addr;\n            *ip_len = sizeof( addr6->sin6_addr.s6_addr );\n\n            if( buf_size < *ip_len )\n                return( MBEDTLS_ERR_NET_BUFFER_TOO_SMALL );\n\n            memcpy( client_ip, &addr6->sin6_addr.s6_addr, *ip_len);\n        }\n    }\n\n    return( 0 );\n}\n\n/*\n * Set the socket blocking or non-blocking\n */\nint mbedtls_net_set_block( mbedtls_net_context *ctx )\n{\n#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \\\n    !defined(EFI32)\n    u_long n = 0;\n    return( ioctlsocket( ctx->fd, FIONBIO, &n ) );\n#else\n    return( fcntl( ctx->fd, F_SETFL, fcntl( ctx->fd, F_GETFL ) & ~O_NONBLOCK ) );\n#endif\n}\n\nint mbedtls_net_set_nonblock( mbedtls_net_context *ctx )\n{\n#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \\\n    !defined(EFI32)\n    u_long n = 1;\n    return( ioctlsocket( ctx->fd, FIONBIO, &n ) );\n#else\n    return( fcntl( ctx->fd, F_SETFL, fcntl( ctx->fd, F_GETFL ) | O_NONBLOCK ) );\n#endif\n}\n\n/*\n * Portable usleep helper\n */\nvoid mbedtls_net_usleep( unsigned long usec )\n{\n#if defined(_WIN32)\n    Sleep( ( usec + 999 ) / 1000 );\n#else\n    struct timeval tv;\n    tv.tv_sec  = usec / 1000000;\n#if defined(__unix__) || defined(__unix) || \\\n    ( defined(__APPLE__) && defined(__MACH__) )\n    tv.tv_usec = (suseconds_t) usec % 1000000;\n#else\n    tv.tv_usec = usec % 1000000;\n#endif\n    select( 0, NULL, NULL, NULL, &tv );\n#endif\n}\n\n/*\n * Read at most 'len' characters\n */\nint mbedtls_net_recv( void *ctx, unsigned char *buf, size_t len )\n{\n    int ret;\n    int fd = ((mbedtls_net_context *) ctx)->fd;\n\n    if( fd < 0 )\n        return( MBEDTLS_ERR_NET_INVALID_CONTEXT );\n\n    ret = (int) read( fd, buf, len );\n\n    if( ret < 0 )\n    {\n        if( net_would_block( ctx ) != 0 )\n            return( MBEDTLS_ERR_SSL_WANT_READ );\n\n#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \\\n    !defined(EFI32)\n        if( WSAGetLastError() == WSAECONNRESET )\n            return( MBEDTLS_ERR_NET_CONN_RESET );\n#else\n        if( errno == EPIPE || errno == ECONNRESET )\n            return( MBEDTLS_ERR_NET_CONN_RESET );\n\n        if( errno == EINTR )\n            return( MBEDTLS_ERR_SSL_WANT_READ );\n#endif\n\n        return( MBEDTLS_ERR_NET_RECV_FAILED );\n    }\n\n    return( ret );\n}\n\n/*\n * Read at most 'len' characters, blocking for at most 'timeout' ms\n */\nint mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len,\n                      uint32_t timeout )\n{\n    int ret;\n    struct timeval tv;\n    fd_set read_fds;\n    int fd = ((mbedtls_net_context *) ctx)->fd;\n\n    if( fd < 0 )\n        return( MBEDTLS_ERR_NET_INVALID_CONTEXT );\n\n    FD_ZERO( &read_fds );\n    FD_SET( fd, &read_fds );\n\n    tv.tv_sec  = timeout / 1000;\n    tv.tv_usec = ( timeout % 1000 ) * 1000;\n\n    ret = select( fd + 1, &read_fds, NULL, NULL, timeout == 0 ? NULL : &tv );\n\n    /* Zero fds ready means we timed out */\n    if( ret == 0 )\n        return( MBEDTLS_ERR_SSL_TIMEOUT );\n\n    if( ret < 0 )\n    {\n#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \\\n    !defined(EFI32)\n        if( WSAGetLastError() == WSAEINTR )\n            return( MBEDTLS_ERR_SSL_WANT_READ );\n#else\n        if( errno == EINTR )\n            return( MBEDTLS_ERR_SSL_WANT_READ );\n#endif\n\n        return( MBEDTLS_ERR_NET_RECV_FAILED );\n    }\n\n    /* This call will not block */\n    return( mbedtls_net_recv( ctx, buf, len ) );\n}\n\n/*\n * Write at most 'len' characters\n */\nint mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len )\n{\n    int ret;\n    int fd = ((mbedtls_net_context *) ctx)->fd;\n\n    if( fd < 0 )\n        return( MBEDTLS_ERR_NET_INVALID_CONTEXT );\n\n    ret = (int) write( fd, buf, len );\n\n    if( ret < 0 )\n    {\n        if( net_would_block( ctx ) != 0 )\n            return( MBEDTLS_ERR_SSL_WANT_WRITE );\n\n#if ( defined(_WIN32) || defined(_WIN32_WCE) ) && !defined(EFIX64) && \\\n    !defined(EFI32)\n        if( WSAGetLastError() == WSAECONNRESET )\n            return( MBEDTLS_ERR_NET_CONN_RESET );\n#else\n        if( errno == EPIPE || errno == ECONNRESET )\n            return( MBEDTLS_ERR_NET_CONN_RESET );\n\n        if( errno == EINTR )\n            return( MBEDTLS_ERR_SSL_WANT_WRITE );\n#endif\n\n        return( MBEDTLS_ERR_NET_SEND_FAILED );\n    }\n\n    return( ret );\n}\n\n/*\n * Gracefully close the connection\n */\nvoid mbedtls_net_free( mbedtls_net_context *ctx )\n{\n    if( ctx->fd == -1 )\n        return;\n\n    shutdown( ctx->fd, 2 );\n    close( ctx->fd );\n\n    ctx->fd = -1;\n}\n\n#endif /* MBEDTLS_NET_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/oid.c",
    "content": "/**\n * \\file oid.c\n *\n * \\brief Object Identifier (OID) database\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_OID_C)\n\n#include \"mbedtls/oid.h\"\n#include \"mbedtls/rsa.h\"\n\n#include <stdio.h>\n#include <string.h>\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#define mbedtls_snprintf snprintf\n#endif\n\n#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)\n#include \"mbedtls/x509.h\"\n#endif\n\n/*\n * Macro to automatically add the size of #define'd OIDs\n */\n#define ADD_LEN(s)      s, MBEDTLS_OID_SIZE(s)\n\n/*\n * Macro to generate an internal function for oid_XXX_from_asn1() (used by\n * the other functions)\n */\n#define FN_OID_TYPED_FROM_ASN1( TYPE_T, NAME, LIST )                        \\\nstatic const TYPE_T * oid_ ## NAME ## _from_asn1( const mbedtls_asn1_buf *oid )     \\\n{                                                                           \\\n    const TYPE_T *p = LIST;                                                 \\\n    const mbedtls_oid_descriptor_t *cur = (const mbedtls_oid_descriptor_t *) p;             \\\n    if( p == NULL || oid == NULL ) return( NULL );                          \\\n    while( cur->asn1 != NULL ) {                                            \\\n        if( cur->asn1_len == oid->len &&                                    \\\n            memcmp( cur->asn1, oid->p, oid->len ) == 0 ) {                  \\\n            return( p );                                                    \\\n        }                                                                   \\\n        p++;                                                                \\\n        cur = (const mbedtls_oid_descriptor_t *) p;                                 \\\n    }                                                                       \\\n    return( NULL );                                                         \\\n}\n\n/*\n * Macro to generate a function for retrieving a single attribute from the\n * descriptor of an mbedtls_oid_descriptor_t wrapper.\n */\n#define FN_OID_GET_DESCRIPTOR_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \\\nint FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 )                  \\\n{                                                                       \\\n    const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid );        \\\n    if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND );            \\\n    *ATTR1 = data->descriptor.ATTR1;                                    \\\n    return( 0 );                                                        \\\n}\n\n/*\n * Macro to generate a function for retrieving a single attribute from an\n * mbedtls_oid_descriptor_t wrapper.\n */\n#define FN_OID_GET_ATTR1(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1) \\\nint FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1 )                  \\\n{                                                                       \\\n    const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid );        \\\n    if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND );            \\\n    *ATTR1 = data->ATTR1;                                               \\\n    return( 0 );                                                        \\\n}\n\n/*\n * Macro to generate a function for retrieving two attributes from an\n * mbedtls_oid_descriptor_t wrapper.\n */\n#define FN_OID_GET_ATTR2(FN_NAME, TYPE_T, TYPE_NAME, ATTR1_TYPE, ATTR1,     \\\n                         ATTR2_TYPE, ATTR2)                                 \\\nint FN_NAME( const mbedtls_asn1_buf *oid, ATTR1_TYPE * ATTR1, ATTR2_TYPE * ATTR2 )  \\\n{                                                                           \\\n    const TYPE_T *data = oid_ ## TYPE_NAME ## _from_asn1( oid );            \\\n    if( data == NULL ) return( MBEDTLS_ERR_OID_NOT_FOUND );                \\\n    *ATTR1 = data->ATTR1;                                                   \\\n    *ATTR2 = data->ATTR2;                                                   \\\n    return( 0 );                                                            \\\n}\n\n/*\n * Macro to generate a function for retrieving the OID based on a single\n * attribute from a mbedtls_oid_descriptor_t wrapper.\n */\n#define FN_OID_GET_OID_BY_ATTR1(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1)   \\\nint FN_NAME( ATTR1_TYPE ATTR1, const char **oid, size_t *olen )             \\\n{                                                                           \\\n    const TYPE_T *cur = LIST;                                               \\\n    while( cur->descriptor.asn1 != NULL ) {                                 \\\n        if( cur->ATTR1 == ATTR1 ) {                                         \\\n            *oid = cur->descriptor.asn1;                                    \\\n            *olen = cur->descriptor.asn1_len;                               \\\n            return( 0 );                                                    \\\n        }                                                                   \\\n        cur++;                                                              \\\n    }                                                                       \\\n    return( MBEDTLS_ERR_OID_NOT_FOUND );                                   \\\n}\n\n/*\n * Macro to generate a function for retrieving the OID based on two\n * attributes from a mbedtls_oid_descriptor_t wrapper.\n */\n#define FN_OID_GET_OID_BY_ATTR2(FN_NAME, TYPE_T, LIST, ATTR1_TYPE, ATTR1,   \\\n                                ATTR2_TYPE, ATTR2)                          \\\nint FN_NAME( ATTR1_TYPE ATTR1, ATTR2_TYPE ATTR2, const char **oid ,         \\\n             size_t *olen )                                                 \\\n{                                                                           \\\n    const TYPE_T *cur = LIST;                                               \\\n    while( cur->descriptor.asn1 != NULL ) {                                 \\\n        if( cur->ATTR1 == ATTR1 && cur->ATTR2 == ATTR2 ) {                  \\\n            *oid = cur->descriptor.asn1;                                    \\\n            *olen = cur->descriptor.asn1_len;                               \\\n            return( 0 );                                                    \\\n        }                                                                   \\\n        cur++;                                                              \\\n    }                                                                       \\\n    return( MBEDTLS_ERR_OID_NOT_FOUND );                                   \\\n}\n\n#if defined(MBEDTLS_X509_USE_C) || defined(MBEDTLS_X509_CREATE_C)\n/*\n * For X520 attribute types\n */\ntypedef struct {\n    mbedtls_oid_descriptor_t    descriptor;\n    const char          *short_name;\n} oid_x520_attr_t;\n\nstatic const oid_x520_attr_t oid_x520_attr_type[] =\n{\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_CN ),          \"id-at-commonName\",               \"Common Name\" },\n        \"CN\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_COUNTRY ),     \"id-at-countryName\",              \"Country\" },\n        \"C\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_LOCALITY ),    \"id-at-locality\",                 \"Locality\" },\n        \"L\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_STATE ),       \"id-at-state\",                    \"State\" },\n        \"ST\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_ORGANIZATION ),\"id-at-organizationName\",         \"Organization\" },\n        \"O\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_ORG_UNIT ),    \"id-at-organizationalUnitName\",   \"Org Unit\" },\n        \"OU\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS9_EMAIL ),    \"emailAddress\",                   \"E-mail address\" },\n        \"emailAddress\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_SERIAL_NUMBER ),\"id-at-serialNumber\",            \"Serial number\" },\n        \"serialNumber\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_POSTAL_ADDRESS ),\"id-at-postalAddress\",          \"Postal address\" },\n        \"postalAddress\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_POSTAL_CODE ), \"id-at-postalCode\",               \"Postal code\" },\n        \"postalCode\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_SUR_NAME ),    \"id-at-surName\",                  \"Surname\" },\n        \"SN\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_GIVEN_NAME ),  \"id-at-givenName\",                \"Given name\" },\n        \"GN\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_INITIALS ),    \"id-at-initials\",                 \"Initials\" },\n        \"initials\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_GENERATION_QUALIFIER ), \"id-at-generationQualifier\", \"Generation qualifier\" },\n        \"generationQualifier\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_TITLE ),       \"id-at-title\",                    \"Title\" },\n        \"title\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_DN_QUALIFIER ),\"id-at-dnQualifier\",              \"Distinguished Name qualifier\" },\n        \"dnQualifier\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_PSEUDONYM ),   \"id-at-pseudonym\",                \"Pseudonym\" },\n        \"pseudonym\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_DOMAIN_COMPONENT ), \"id-domainComponent\",           \"Domain component\" },\n        \"DC\",\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_AT_UNIQUE_IDENTIFIER ), \"id-at-uniqueIdentifier\",    \"Unique Identifier\" },\n        \"uniqueIdentifier\",\n    },\n    {\n        { NULL, 0, NULL, NULL },\n        NULL,\n    }\n};\n\nFN_OID_TYPED_FROM_ASN1(oid_x520_attr_t, x520_attr, oid_x520_attr_type)\nFN_OID_GET_ATTR1(mbedtls_oid_get_attr_short_name, oid_x520_attr_t, x520_attr, const char *, short_name)\n\n/*\n * For X509 extensions\n */\ntypedef struct {\n    mbedtls_oid_descriptor_t    descriptor;\n    int                 ext_type;\n} oid_x509_ext_t;\n\nstatic const oid_x509_ext_t oid_x509_ext[] =\n{\n    {\n        { ADD_LEN( MBEDTLS_OID_BASIC_CONSTRAINTS ),    \"id-ce-basicConstraints\",   \"Basic Constraints\" },\n        MBEDTLS_X509_EXT_BASIC_CONSTRAINTS,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_KEY_USAGE ),            \"id-ce-keyUsage\",           \"Key Usage\" },\n        MBEDTLS_X509_EXT_KEY_USAGE,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_EXTENDED_KEY_USAGE ),   \"id-ce-extKeyUsage\",        \"Extended Key Usage\" },\n        MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_SUBJECT_ALT_NAME ),     \"id-ce-subjectAltName\",     \"Subject Alt Name\" },\n        MBEDTLS_X509_EXT_SUBJECT_ALT_NAME,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_NS_CERT_TYPE ),         \"id-netscape-certtype\",     \"Netscape Certificate Type\" },\n        MBEDTLS_X509_EXT_NS_CERT_TYPE,\n    },\n    {\n        { NULL, 0, NULL, NULL },\n        0,\n    },\n};\n\nFN_OID_TYPED_FROM_ASN1(oid_x509_ext_t, x509_ext, oid_x509_ext)\nFN_OID_GET_ATTR1(mbedtls_oid_get_x509_ext_type, oid_x509_ext_t, x509_ext, int, ext_type)\n\nstatic const mbedtls_oid_descriptor_t oid_ext_key_usage[] =\n{\n    { ADD_LEN( MBEDTLS_OID_SERVER_AUTH ),      \"id-kp-serverAuth\",      \"TLS Web Server Authentication\" },\n    { ADD_LEN( MBEDTLS_OID_CLIENT_AUTH ),      \"id-kp-clientAuth\",      \"TLS Web Client Authentication\" },\n    { ADD_LEN( MBEDTLS_OID_CODE_SIGNING ),     \"id-kp-codeSigning\",     \"Code Signing\" },\n    { ADD_LEN( MBEDTLS_OID_EMAIL_PROTECTION ), \"id-kp-emailProtection\", \"E-mail Protection\" },\n    { ADD_LEN( MBEDTLS_OID_TIME_STAMPING ),    \"id-kp-timeStamping\",    \"Time Stamping\" },\n    { ADD_LEN( MBEDTLS_OID_OCSP_SIGNING ),     \"id-kp-OCSPSigning\",     \"OCSP Signing\" },\n    { NULL, 0, NULL, NULL },\n};\n\nFN_OID_TYPED_FROM_ASN1(mbedtls_oid_descriptor_t, ext_key_usage, oid_ext_key_usage)\nFN_OID_GET_ATTR1(mbedtls_oid_get_extended_key_usage, mbedtls_oid_descriptor_t, ext_key_usage, const char *, description)\n#endif /* MBEDTLS_X509_USE_C || MBEDTLS_X509_CREATE_C */\n\n#if defined(MBEDTLS_MD_C)\n/*\n * For SignatureAlgorithmIdentifier\n */\ntypedef struct {\n    mbedtls_oid_descriptor_t    descriptor;\n    mbedtls_md_type_t           md_alg;\n    mbedtls_pk_type_t           pk_alg;\n} oid_sig_alg_t;\n\nstatic const oid_sig_alg_t oid_sig_alg[] =\n{\n#if defined(MBEDTLS_RSA_C)\n#if defined(MBEDTLS_MD2_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS1_MD2 ),        \"md2WithRSAEncryption\",     \"RSA with MD2\" },\n        MBEDTLS_MD_MD2,      MBEDTLS_PK_RSA,\n    },\n#endif /* MBEDTLS_MD2_C */\n#if defined(MBEDTLS_MD4_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS1_MD4 ),        \"md4WithRSAEncryption\",     \"RSA with MD4\" },\n        MBEDTLS_MD_MD4,      MBEDTLS_PK_RSA,\n    },\n#endif /* MBEDTLS_MD4_C */\n#if defined(MBEDTLS_MD5_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS1_MD5 ),        \"md5WithRSAEncryption\",     \"RSA with MD5\" },\n        MBEDTLS_MD_MD5,      MBEDTLS_PK_RSA,\n    },\n#endif /* MBEDTLS_MD5_C */\n#if defined(MBEDTLS_SHA1_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS1_SHA1 ),       \"sha-1WithRSAEncryption\",   \"RSA with SHA1\" },\n        MBEDTLS_MD_SHA1,     MBEDTLS_PK_RSA,\n    },\n#endif /* MBEDTLS_SHA1_C */\n#if defined(MBEDTLS_SHA256_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS1_SHA224 ),     \"sha224WithRSAEncryption\",  \"RSA with SHA-224\" },\n        MBEDTLS_MD_SHA224,   MBEDTLS_PK_RSA,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS1_SHA256 ),     \"sha256WithRSAEncryption\",  \"RSA with SHA-256\" },\n        MBEDTLS_MD_SHA256,   MBEDTLS_PK_RSA,\n    },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS1_SHA384 ),     \"sha384WithRSAEncryption\",  \"RSA with SHA-384\" },\n        MBEDTLS_MD_SHA384,   MBEDTLS_PK_RSA,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS1_SHA512 ),     \"sha512WithRSAEncryption\",  \"RSA with SHA-512\" },\n        MBEDTLS_MD_SHA512,   MBEDTLS_PK_RSA,\n    },\n#endif /* MBEDTLS_SHA512_C */\n#if defined(MBEDTLS_SHA1_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_RSA_SHA_OBS ),      \"sha-1WithRSAEncryption\",   \"RSA with SHA1\" },\n        MBEDTLS_MD_SHA1,     MBEDTLS_PK_RSA,\n    },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_RSA_C */\n#if defined(MBEDTLS_ECDSA_C)\n#if defined(MBEDTLS_SHA1_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_ECDSA_SHA1 ),       \"ecdsa-with-SHA1\",      \"ECDSA with SHA1\" },\n        MBEDTLS_MD_SHA1,     MBEDTLS_PK_ECDSA,\n    },\n#endif /* MBEDTLS_SHA1_C */\n#if defined(MBEDTLS_SHA256_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_ECDSA_SHA224 ),     \"ecdsa-with-SHA224\",    \"ECDSA with SHA224\" },\n        MBEDTLS_MD_SHA224,   MBEDTLS_PK_ECDSA,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_ECDSA_SHA256 ),     \"ecdsa-with-SHA256\",    \"ECDSA with SHA256\" },\n        MBEDTLS_MD_SHA256,   MBEDTLS_PK_ECDSA,\n    },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_ECDSA_SHA384 ),     \"ecdsa-with-SHA384\",    \"ECDSA with SHA384\" },\n        MBEDTLS_MD_SHA384,   MBEDTLS_PK_ECDSA,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_ECDSA_SHA512 ),     \"ecdsa-with-SHA512\",    \"ECDSA with SHA512\" },\n        MBEDTLS_MD_SHA512,   MBEDTLS_PK_ECDSA,\n    },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_ECDSA_C */\n#if defined(MBEDTLS_RSA_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_RSASSA_PSS ),        \"RSASSA-PSS\",           \"RSASSA-PSS\" },\n        MBEDTLS_MD_NONE,     MBEDTLS_PK_RSASSA_PSS,\n    },\n#endif /* MBEDTLS_RSA_C */\n    {\n        { NULL, 0, NULL, NULL },\n        MBEDTLS_MD_NONE, MBEDTLS_PK_NONE,\n    },\n};\n\nFN_OID_TYPED_FROM_ASN1(oid_sig_alg_t, sig_alg, oid_sig_alg)\nFN_OID_GET_DESCRIPTOR_ATTR1(mbedtls_oid_get_sig_alg_desc, oid_sig_alg_t, sig_alg, const char *, description)\nFN_OID_GET_ATTR2(mbedtls_oid_get_sig_alg, oid_sig_alg_t, sig_alg, mbedtls_md_type_t, md_alg, mbedtls_pk_type_t, pk_alg)\nFN_OID_GET_OID_BY_ATTR2(mbedtls_oid_get_oid_by_sig_alg, oid_sig_alg_t, oid_sig_alg, mbedtls_pk_type_t, pk_alg, mbedtls_md_type_t, md_alg)\n#endif /* MBEDTLS_MD_C */\n\n/*\n * For PublicKeyInfo (PKCS1, RFC 5480)\n */\ntypedef struct {\n    mbedtls_oid_descriptor_t    descriptor;\n    mbedtls_pk_type_t           pk_alg;\n} oid_pk_alg_t;\n\nstatic const oid_pk_alg_t oid_pk_alg[] =\n{\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS1_RSA ),      \"rsaEncryption\",   \"RSA\" },\n        MBEDTLS_PK_RSA,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_ALG_UNRESTRICTED ),  \"id-ecPublicKey\",   \"Generic EC key\" },\n        MBEDTLS_PK_ECKEY,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_ALG_ECDH ),          \"id-ecDH\",          \"EC key for ECDH\" },\n        MBEDTLS_PK_ECKEY_DH,\n    },\n    {\n        { NULL, 0, NULL, NULL },\n        MBEDTLS_PK_NONE,\n    },\n};\n\nFN_OID_TYPED_FROM_ASN1(oid_pk_alg_t, pk_alg, oid_pk_alg)\nFN_OID_GET_ATTR1(mbedtls_oid_get_pk_alg, oid_pk_alg_t, pk_alg, mbedtls_pk_type_t, pk_alg)\nFN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_pk_alg, oid_pk_alg_t, oid_pk_alg, mbedtls_pk_type_t, pk_alg)\n\n#if defined(MBEDTLS_ECP_C)\n/*\n * For namedCurve (RFC 5480)\n */\ntypedef struct {\n    mbedtls_oid_descriptor_t    descriptor;\n    mbedtls_ecp_group_id        grp_id;\n} oid_ecp_grp_t;\n\nstatic const oid_ecp_grp_t oid_ecp_grp[] =\n{\n#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP192R1 ), \"secp192r1\",    \"secp192r1\" },\n        MBEDTLS_ECP_DP_SECP192R1,\n    },\n#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP224R1 ), \"secp224r1\",    \"secp224r1\" },\n        MBEDTLS_ECP_DP_SECP224R1,\n    },\n#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP256R1 ), \"secp256r1\",    \"secp256r1\" },\n        MBEDTLS_ECP_DP_SECP256R1,\n    },\n#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP384R1 ), \"secp384r1\",    \"secp384r1\" },\n        MBEDTLS_ECP_DP_SECP384R1,\n    },\n#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP521R1 ), \"secp521r1\",    \"secp521r1\" },\n        MBEDTLS_ECP_DP_SECP521R1,\n    },\n#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP192K1 ), \"secp192k1\",    \"secp192k1\" },\n        MBEDTLS_ECP_DP_SECP192K1,\n    },\n#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP224K1 ), \"secp224k1\",    \"secp224k1\" },\n        MBEDTLS_ECP_DP_SECP224K1,\n    },\n#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_SECP256K1 ), \"secp256k1\",    \"secp256k1\" },\n        MBEDTLS_ECP_DP_SECP256K1,\n    },\n#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_BP256R1 ),   \"brainpoolP256r1\",\"brainpool256r1\" },\n        MBEDTLS_ECP_DP_BP256R1,\n    },\n#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_BP384R1 ),   \"brainpoolP384r1\",\"brainpool384r1\" },\n        MBEDTLS_ECP_DP_BP384R1,\n    },\n#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)\n    {\n        { ADD_LEN( MBEDTLS_OID_EC_GRP_BP512R1 ),   \"brainpoolP512r1\",\"brainpool512r1\" },\n        MBEDTLS_ECP_DP_BP512R1,\n    },\n#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */\n    {\n        { NULL, 0, NULL, NULL },\n        MBEDTLS_ECP_DP_NONE,\n    },\n};\n\nFN_OID_TYPED_FROM_ASN1(oid_ecp_grp_t, grp_id, oid_ecp_grp)\nFN_OID_GET_ATTR1(mbedtls_oid_get_ec_grp, oid_ecp_grp_t, grp_id, mbedtls_ecp_group_id, grp_id)\nFN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_ec_grp, oid_ecp_grp_t, oid_ecp_grp, mbedtls_ecp_group_id, grp_id)\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_CIPHER_C)\n/*\n * For PKCS#5 PBES2 encryption algorithm\n */\ntypedef struct {\n    mbedtls_oid_descriptor_t    descriptor;\n    mbedtls_cipher_type_t       cipher_alg;\n} oid_cipher_alg_t;\n\nstatic const oid_cipher_alg_t oid_cipher_alg[] =\n{\n    {\n        { ADD_LEN( MBEDTLS_OID_DES_CBC ),              \"desCBC\",       \"DES-CBC\" },\n        MBEDTLS_CIPHER_DES_CBC,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_DES_EDE3_CBC ),         \"des-ede3-cbc\", \"DES-EDE3-CBC\" },\n        MBEDTLS_CIPHER_DES_EDE3_CBC,\n    },\n    {\n        { NULL, 0, NULL, NULL },\n        MBEDTLS_CIPHER_NONE,\n    },\n};\n\nFN_OID_TYPED_FROM_ASN1(oid_cipher_alg_t, cipher_alg, oid_cipher_alg)\nFN_OID_GET_ATTR1(mbedtls_oid_get_cipher_alg, oid_cipher_alg_t, cipher_alg, mbedtls_cipher_type_t, cipher_alg)\n#endif /* MBEDTLS_CIPHER_C */\n\n#if defined(MBEDTLS_MD_C)\n/*\n * For digestAlgorithm\n */\ntypedef struct {\n    mbedtls_oid_descriptor_t    descriptor;\n    mbedtls_md_type_t           md_alg;\n} oid_md_alg_t;\n\nstatic const oid_md_alg_t oid_md_alg[] =\n{\n#if defined(MBEDTLS_MD2_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD2 ),       \"id-md2\",       \"MD2\" },\n        MBEDTLS_MD_MD2,\n    },\n#endif /* MBEDTLS_MD2_C */\n#if defined(MBEDTLS_MD4_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD4 ),       \"id-md4\",       \"MD4\" },\n        MBEDTLS_MD_MD4,\n    },\n#endif /* MBEDTLS_MD4_C */\n#if defined(MBEDTLS_MD5_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_MD5 ),       \"id-md5\",       \"MD5\" },\n        MBEDTLS_MD_MD5,\n    },\n#endif /* MBEDTLS_MD5_C */\n#if defined(MBEDTLS_SHA1_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA1 ),      \"id-sha1\",      \"SHA-1\" },\n        MBEDTLS_MD_SHA1,\n    },\n#endif /* MBEDTLS_SHA1_C */\n#if defined(MBEDTLS_SHA256_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA224 ),    \"id-sha224\",    \"SHA-224\" },\n        MBEDTLS_MD_SHA224,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA256 ),    \"id-sha256\",    \"SHA-256\" },\n        MBEDTLS_MD_SHA256,\n    },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    {\n        { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA384 ),    \"id-sha384\",    \"SHA-384\" },\n        MBEDTLS_MD_SHA384,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_DIGEST_ALG_SHA512 ),    \"id-sha512\",    \"SHA-512\" },\n        MBEDTLS_MD_SHA512,\n    },\n#endif /* MBEDTLS_SHA512_C */\n    {\n        { NULL, 0, NULL, NULL },\n        MBEDTLS_MD_NONE,\n    },\n};\n\nFN_OID_TYPED_FROM_ASN1(oid_md_alg_t, md_alg, oid_md_alg)\nFN_OID_GET_ATTR1(mbedtls_oid_get_md_alg, oid_md_alg_t, md_alg, mbedtls_md_type_t, md_alg)\nFN_OID_GET_OID_BY_ATTR1(mbedtls_oid_get_oid_by_md, oid_md_alg_t, oid_md_alg, mbedtls_md_type_t, md_alg)\n#endif /* MBEDTLS_MD_C */\n\n#if defined(MBEDTLS_PKCS12_C)\n/*\n * For PKCS#12 PBEs\n */\ntypedef struct {\n    mbedtls_oid_descriptor_t    descriptor;\n    mbedtls_md_type_t           md_alg;\n    mbedtls_cipher_type_t       cipher_alg;\n} oid_pkcs12_pbe_alg_t;\n\nstatic const oid_pkcs12_pbe_alg_t oid_pkcs12_pbe_alg[] =\n{\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC ), \"pbeWithSHAAnd3-KeyTripleDES-CBC\", \"PBE with SHA1 and 3-Key 3DES\" },\n        MBEDTLS_MD_SHA1,      MBEDTLS_CIPHER_DES_EDE3_CBC,\n    },\n    {\n        { ADD_LEN( MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC ), \"pbeWithSHAAnd2-KeyTripleDES-CBC\", \"PBE with SHA1 and 2-Key 3DES\" },\n        MBEDTLS_MD_SHA1,      MBEDTLS_CIPHER_DES_EDE_CBC,\n    },\n    {\n        { NULL, 0, NULL, NULL },\n        MBEDTLS_MD_NONE, MBEDTLS_CIPHER_NONE,\n    },\n};\n\nFN_OID_TYPED_FROM_ASN1(oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, oid_pkcs12_pbe_alg)\nFN_OID_GET_ATTR2(mbedtls_oid_get_pkcs12_pbe_alg, oid_pkcs12_pbe_alg_t, pkcs12_pbe_alg, mbedtls_md_type_t, md_alg, mbedtls_cipher_type_t, cipher_alg)\n#endif /* MBEDTLS_PKCS12_C */\n\n#define OID_SAFE_SNPRINTF                               \\\n    do {                                                \\\n        if( ret < 0 || (size_t) ret >= n )              \\\n            return( MBEDTLS_ERR_OID_BUF_TOO_SMALL );    \\\n                                                        \\\n        n -= (size_t) ret;                              \\\n        p += (size_t) ret;                              \\\n    } while( 0 )\n\n/* Return the x.y.z.... style numeric string for the given OID */\nint mbedtls_oid_get_numeric_string( char *buf, size_t size,\n                            const mbedtls_asn1_buf *oid )\n{\n    int ret;\n    size_t i, n;\n    unsigned int value;\n    char *p;\n\n    p = buf;\n    n = size;\n\n    /* First byte contains first two dots */\n    if( oid->len > 0 )\n    {\n        ret = mbedtls_snprintf( p, n, \"%d.%d\", oid->p[0] / 40, oid->p[0] % 40 );\n        OID_SAFE_SNPRINTF;\n    }\n\n    value = 0;\n    for( i = 1; i < oid->len; i++ )\n    {\n        /* Prevent overflow in value. */\n        if( ( ( value << 7 ) >> 7 ) != value )\n            return( MBEDTLS_ERR_OID_BUF_TOO_SMALL );\n\n        value <<= 7;\n        value += oid->p[i] & 0x7F;\n\n        if( !( oid->p[i] & 0x80 ) )\n        {\n            /* Last byte */\n            ret = mbedtls_snprintf( p, n, \".%d\", value );\n            OID_SAFE_SNPRINTF;\n            value = 0;\n        }\n    }\n\n    return( (int) ( size - n ) );\n}\n\n#endif /* MBEDTLS_OID_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/padlock.c",
    "content": "/*\n *  VIA PadLock support functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  This implementation is based on the VIA PadLock Programming Guide:\n *\n *  http://www.via.com.tw/en/downloads/whitepapers/initiatives/padlock/\n *  programming_guide.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PADLOCK_C)\n\n#include \"mbedtls/padlock.h\"\n\n#include <string.h>\n\n#ifndef asm\n#define asm __asm\n#endif\n\n#if defined(MBEDTLS_HAVE_X86)\n\n/*\n * PadLock detection routine\n */\nint mbedtls_padlock_has_support( int feature )\n{\n    static int flags = -1;\n    int ebx = 0, edx = 0;\n\n    if( flags == -1 )\n    {\n        asm( \"movl  %%ebx, %0           \\n\\t\"\n             \"movl  $0xC0000000, %%eax  \\n\\t\"\n             \"cpuid                     \\n\\t\"\n             \"cmpl  $0xC0000001, %%eax  \\n\\t\"\n             \"movl  $0, %%edx           \\n\\t\"\n             \"jb    unsupported         \\n\\t\"\n             \"movl  $0xC0000001, %%eax  \\n\\t\"\n             \"cpuid                     \\n\\t\"\n             \"unsupported:              \\n\\t\"\n             \"movl  %%edx, %1           \\n\\t\"\n             \"movl  %2, %%ebx           \\n\\t\"\n             : \"=m\" (ebx), \"=m\" (edx)\n             :  \"m\" (ebx)\n             : \"eax\", \"ecx\", \"edx\" );\n\n        flags = edx;\n    }\n\n    return( flags & feature );\n}\n\n/*\n * PadLock AES-ECB block en(de)cryption\n */\nint mbedtls_padlock_xcryptecb( mbedtls_aes_context *ctx,\n                       int mode,\n                       const unsigned char input[16],\n                       unsigned char output[16] )\n{\n    int ebx = 0;\n    uint32_t *rk;\n    uint32_t *blk;\n    uint32_t *ctrl;\n    unsigned char buf[256];\n\n    rk  = ctx->rk;\n    blk = MBEDTLS_PADLOCK_ALIGN16( buf );\n    memcpy( blk, input, 16 );\n\n     ctrl = blk + 4;\n    *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode^1 ) - 10 ) << 9 );\n\n    asm( \"pushfl                        \\n\\t\"\n         \"popfl                         \\n\\t\"\n         \"movl    %%ebx, %0             \\n\\t\"\n         \"movl    $1, %%ecx             \\n\\t\"\n         \"movl    %2, %%edx             \\n\\t\"\n         \"movl    %3, %%ebx             \\n\\t\"\n         \"movl    %4, %%esi             \\n\\t\"\n         \"movl    %4, %%edi             \\n\\t\"\n         \".byte  0xf3,0x0f,0xa7,0xc8    \\n\\t\"\n         \"movl    %1, %%ebx             \\n\\t\"\n         : \"=m\" (ebx)\n         :  \"m\" (ebx), \"m\" (ctrl), \"m\" (rk), \"m\" (blk)\n         : \"memory\", \"ecx\", \"edx\", \"esi\", \"edi\" );\n\n    memcpy( output, blk, 16 );\n\n    return( 0 );\n}\n\n/*\n * PadLock AES-CBC buffer en(de)cryption\n */\nint mbedtls_padlock_xcryptcbc( mbedtls_aes_context *ctx,\n                       int mode,\n                       size_t length,\n                       unsigned char iv[16],\n                       const unsigned char *input,\n                       unsigned char *output )\n{\n    int ebx = 0;\n    size_t count;\n    uint32_t *rk;\n    uint32_t *iw;\n    uint32_t *ctrl;\n    unsigned char buf[256];\n\n    if( ( (long) input  & 15 ) != 0 ||\n        ( (long) output & 15 ) != 0 )\n        return( MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED );\n\n    rk = ctx->rk;\n    iw = MBEDTLS_PADLOCK_ALIGN16( buf );\n    memcpy( iw, iv, 16 );\n\n     ctrl = iw + 4;\n    *ctrl = 0x80 | ctx->nr | ( ( ctx->nr + ( mode ^ 1 ) - 10 ) << 9 );\n\n    count = ( length + 15 ) >> 4;\n\n    asm( \"pushfl                        \\n\\t\"\n         \"popfl                         \\n\\t\"\n         \"movl    %%ebx, %0             \\n\\t\"\n         \"movl    %2, %%ecx             \\n\\t\"\n         \"movl    %3, %%edx             \\n\\t\"\n         \"movl    %4, %%ebx             \\n\\t\"\n         \"movl    %5, %%esi             \\n\\t\"\n         \"movl    %6, %%edi             \\n\\t\"\n         \"movl    %7, %%eax             \\n\\t\"\n         \".byte  0xf3,0x0f,0xa7,0xd0    \\n\\t\"\n         \"movl    %1, %%ebx             \\n\\t\"\n         : \"=m\" (ebx)\n         :  \"m\" (ebx), \"m\" (count), \"m\" (ctrl),\n            \"m\"  (rk), \"m\" (input), \"m\" (output), \"m\" (iw)\n         : \"memory\", \"eax\", \"ecx\", \"edx\", \"esi\", \"edi\" );\n\n    memcpy( iv, iw, 16 );\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_HAVE_X86 */\n\n#endif /* MBEDTLS_PADLOCK_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/pem.c",
    "content": "/*\n *  Privacy Enhanced Mail (PEM) decoding\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PEM_PARSE_C) || defined(MBEDTLS_PEM_WRITE_C)\n\n#include \"mbedtls/pem.h\"\n#include \"mbedtls/base64.h\"\n#include \"mbedtls/des.h\"\n#include \"mbedtls/aes.h\"\n#include \"mbedtls/md5.h\"\n#include \"mbedtls/cipher.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\nvoid mbedtls_pem_init( mbedtls_pem_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_pem_context ) );\n}\n\n#if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) &&         \\\n    ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) )\n/*\n * Read a 16-byte hex string and convert it to binary\n */\nstatic int pem_get_iv( const unsigned char *s, unsigned char *iv,\n                       size_t iv_len )\n{\n    size_t i, j, k;\n\n    memset( iv, 0, iv_len );\n\n    for( i = 0; i < iv_len * 2; i++, s++ )\n    {\n        if( *s >= '0' && *s <= '9' ) j = *s - '0'; else\n        if( *s >= 'A' && *s <= 'F' ) j = *s - '7'; else\n        if( *s >= 'a' && *s <= 'f' ) j = *s - 'W'; else\n            return( MBEDTLS_ERR_PEM_INVALID_ENC_IV );\n\n        k = ( ( i & 1 ) != 0 ) ? j : j << 4;\n\n        iv[i >> 1] = (unsigned char)( iv[i >> 1] | k );\n    }\n\n    return( 0 );\n}\n\nstatic void pem_pbkdf1( unsigned char *key, size_t keylen,\n                        unsigned char *iv,\n                        const unsigned char *pwd, size_t pwdlen )\n{\n    mbedtls_md5_context md5_ctx;\n    unsigned char md5sum[16];\n    size_t use_len;\n\n    mbedtls_md5_init( &md5_ctx );\n\n    /*\n     * key[ 0..15] = MD5(pwd || IV)\n     */\n    mbedtls_md5_starts( &md5_ctx );\n    mbedtls_md5_update( &md5_ctx, pwd, pwdlen );\n    mbedtls_md5_update( &md5_ctx, iv,  8 );\n    mbedtls_md5_finish( &md5_ctx, md5sum );\n\n    if( keylen <= 16 )\n    {\n        memcpy( key, md5sum, keylen );\n\n        mbedtls_md5_free( &md5_ctx );\n        mbedtls_zeroize( md5sum, 16 );\n        return;\n    }\n\n    memcpy( key, md5sum, 16 );\n\n    /*\n     * key[16..23] = MD5(key[ 0..15] || pwd || IV])\n     */\n    mbedtls_md5_starts( &md5_ctx );\n    mbedtls_md5_update( &md5_ctx, md5sum,  16 );\n    mbedtls_md5_update( &md5_ctx, pwd, pwdlen );\n    mbedtls_md5_update( &md5_ctx, iv,  8 );\n    mbedtls_md5_finish( &md5_ctx, md5sum );\n\n    use_len = 16;\n    if( keylen < 32 )\n        use_len = keylen - 16;\n\n    memcpy( key + 16, md5sum, use_len );\n\n    mbedtls_md5_free( &md5_ctx );\n    mbedtls_zeroize( md5sum, 16 );\n}\n\n#if defined(MBEDTLS_DES_C)\n/*\n * Decrypt with DES-CBC, using PBKDF1 for key derivation\n */\nstatic void pem_des_decrypt( unsigned char des_iv[8],\n                               unsigned char *buf, size_t buflen,\n                               const unsigned char *pwd, size_t pwdlen )\n{\n    mbedtls_des_context des_ctx;\n    unsigned char des_key[8];\n\n    mbedtls_des_init( &des_ctx );\n\n    pem_pbkdf1( des_key, 8, des_iv, pwd, pwdlen );\n\n    mbedtls_des_setkey_dec( &des_ctx, des_key );\n    mbedtls_des_crypt_cbc( &des_ctx, MBEDTLS_DES_DECRYPT, buflen,\n                     des_iv, buf, buf );\n\n    mbedtls_des_free( &des_ctx );\n    mbedtls_zeroize( des_key, 8 );\n}\n\n/*\n * Decrypt with 3DES-CBC, using PBKDF1 for key derivation\n */\nstatic void pem_des3_decrypt( unsigned char des3_iv[8],\n                               unsigned char *buf, size_t buflen,\n                               const unsigned char *pwd, size_t pwdlen )\n{\n    mbedtls_des3_context des3_ctx;\n    unsigned char des3_key[24];\n\n    mbedtls_des3_init( &des3_ctx );\n\n    pem_pbkdf1( des3_key, 24, des3_iv, pwd, pwdlen );\n\n    mbedtls_des3_set3key_dec( &des3_ctx, des3_key );\n    mbedtls_des3_crypt_cbc( &des3_ctx, MBEDTLS_DES_DECRYPT, buflen,\n                     des3_iv, buf, buf );\n\n    mbedtls_des3_free( &des3_ctx );\n    mbedtls_zeroize( des3_key, 24 );\n}\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_AES_C)\n/*\n * Decrypt with AES-XXX-CBC, using PBKDF1 for key derivation\n */\nstatic void pem_aes_decrypt( unsigned char aes_iv[16], unsigned int keylen,\n                               unsigned char *buf, size_t buflen,\n                               const unsigned char *pwd, size_t pwdlen )\n{\n    mbedtls_aes_context aes_ctx;\n    unsigned char aes_key[32];\n\n    mbedtls_aes_init( &aes_ctx );\n\n    pem_pbkdf1( aes_key, keylen, aes_iv, pwd, pwdlen );\n\n    mbedtls_aes_setkey_dec( &aes_ctx, aes_key, keylen * 8 );\n    mbedtls_aes_crypt_cbc( &aes_ctx, MBEDTLS_AES_DECRYPT, buflen,\n                     aes_iv, buf, buf );\n\n    mbedtls_aes_free( &aes_ctx );\n    mbedtls_zeroize( aes_key, keylen );\n}\n#endif /* MBEDTLS_AES_C */\n\n#endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC &&\n          ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */\n\nint mbedtls_pem_read_buffer( mbedtls_pem_context *ctx, const char *header, const char *footer,\n                     const unsigned char *data, const unsigned char *pwd,\n                     size_t pwdlen, size_t *use_len )\n{\n    int ret, enc;\n    size_t len;\n    unsigned char *buf;\n    const unsigned char *s1, *s2, *end;\n#if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) &&         \\\n    ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) )\n    unsigned char pem_iv[16];\n    mbedtls_cipher_type_t enc_alg = MBEDTLS_CIPHER_NONE;\n#else\n    ((void) pwd);\n    ((void) pwdlen);\n#endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC &&\n          ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */\n\n    if( ctx == NULL )\n        return( MBEDTLS_ERR_PEM_BAD_INPUT_DATA );\n\n    s1 = (unsigned char *) strstr( (const char *) data, header );\n\n    if( s1 == NULL )\n        return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT );\n\n    s2 = (unsigned char *) strstr( (const char *) data, footer );\n\n    if( s2 == NULL || s2 <= s1 )\n        return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT );\n\n    s1 += strlen( header );\n    if( *s1 == ' '  ) s1++;\n    if( *s1 == '\\r' ) s1++;\n    if( *s1 == '\\n' ) s1++;\n    else return( MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT );\n\n    end = s2;\n    end += strlen( footer );\n    if( *end == ' '  ) end++;\n    if( *end == '\\r' ) end++;\n    if( *end == '\\n' ) end++;\n    *use_len = end - data;\n\n    enc = 0;\n\n    if( s2 - s1 >= 22 && memcmp( s1, \"Proc-Type: 4,ENCRYPTED\", 22 ) == 0 )\n    {\n#if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) &&         \\\n    ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) )\n        enc++;\n\n        s1 += 22;\n        if( *s1 == '\\r' ) s1++;\n        if( *s1 == '\\n' ) s1++;\n        else return( MBEDTLS_ERR_PEM_INVALID_DATA );\n\n\n#if defined(MBEDTLS_DES_C)\n        if( s2 - s1 >= 23 && memcmp( s1, \"DEK-Info: DES-EDE3-CBC,\", 23 ) == 0 )\n        {\n            enc_alg = MBEDTLS_CIPHER_DES_EDE3_CBC;\n\n            s1 += 23;\n            if( s2 - s1 < 16 || pem_get_iv( s1, pem_iv, 8 ) != 0 )\n                return( MBEDTLS_ERR_PEM_INVALID_ENC_IV );\n\n            s1 += 16;\n        }\n        else if( s2 - s1 >= 18 && memcmp( s1, \"DEK-Info: DES-CBC,\", 18 ) == 0 )\n        {\n            enc_alg = MBEDTLS_CIPHER_DES_CBC;\n\n            s1 += 18;\n            if( s2 - s1 < 16 || pem_get_iv( s1, pem_iv, 8) != 0 )\n                return( MBEDTLS_ERR_PEM_INVALID_ENC_IV );\n\n            s1 += 16;\n        }\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_AES_C)\n        if( s2 - s1 >= 14 && memcmp( s1, \"DEK-Info: AES-\", 14 ) == 0 )\n        {\n            if( s2 - s1 < 22 )\n                return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG );\n            else if( memcmp( s1, \"DEK-Info: AES-128-CBC,\", 22 ) == 0 )\n                enc_alg = MBEDTLS_CIPHER_AES_128_CBC;\n            else if( memcmp( s1, \"DEK-Info: AES-192-CBC,\", 22 ) == 0 )\n                enc_alg = MBEDTLS_CIPHER_AES_192_CBC;\n            else if( memcmp( s1, \"DEK-Info: AES-256-CBC,\", 22 ) == 0 )\n                enc_alg = MBEDTLS_CIPHER_AES_256_CBC;\n            else\n                return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG );\n\n            s1 += 22;\n            if( s2 - s1 < 32 || pem_get_iv( s1, pem_iv, 16 ) != 0 )\n                return( MBEDTLS_ERR_PEM_INVALID_ENC_IV );\n\n            s1 += 32;\n        }\n#endif /* MBEDTLS_AES_C */\n\n        if( enc_alg == MBEDTLS_CIPHER_NONE )\n            return( MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG );\n\n        if( *s1 == '\\r' ) s1++;\n        if( *s1 == '\\n' ) s1++;\n        else return( MBEDTLS_ERR_PEM_INVALID_DATA );\n#else\n        return( MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE );\n#endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC &&\n          ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */\n    }\n\n    if( s1 >= s2 )\n        return( MBEDTLS_ERR_PEM_INVALID_DATA );\n\n    ret = mbedtls_base64_decode( NULL, 0, &len, s1, s2 - s1 );\n\n    if( ret == MBEDTLS_ERR_BASE64_INVALID_CHARACTER )\n        return( MBEDTLS_ERR_PEM_INVALID_DATA + ret );\n\n    if( ( buf = mbedtls_calloc( 1, len ) ) == NULL )\n        return( MBEDTLS_ERR_PEM_ALLOC_FAILED );\n\n    if( ( ret = mbedtls_base64_decode( buf, len, &len, s1, s2 - s1 ) ) != 0 )\n    {\n        mbedtls_free( buf );\n        return( MBEDTLS_ERR_PEM_INVALID_DATA + ret );\n    }\n\n    if( enc != 0 )\n    {\n#if defined(MBEDTLS_MD5_C) && defined(MBEDTLS_CIPHER_MODE_CBC) &&         \\\n    ( defined(MBEDTLS_DES_C) || defined(MBEDTLS_AES_C) )\n        if( pwd == NULL )\n        {\n            mbedtls_free( buf );\n            return( MBEDTLS_ERR_PEM_PASSWORD_REQUIRED );\n        }\n\n#if defined(MBEDTLS_DES_C)\n        if( enc_alg == MBEDTLS_CIPHER_DES_EDE3_CBC )\n            pem_des3_decrypt( pem_iv, buf, len, pwd, pwdlen );\n        else if( enc_alg == MBEDTLS_CIPHER_DES_CBC )\n            pem_des_decrypt( pem_iv, buf, len, pwd, pwdlen );\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_AES_C)\n        if( enc_alg == MBEDTLS_CIPHER_AES_128_CBC )\n            pem_aes_decrypt( pem_iv, 16, buf, len, pwd, pwdlen );\n        else if( enc_alg == MBEDTLS_CIPHER_AES_192_CBC )\n            pem_aes_decrypt( pem_iv, 24, buf, len, pwd, pwdlen );\n        else if( enc_alg == MBEDTLS_CIPHER_AES_256_CBC )\n            pem_aes_decrypt( pem_iv, 32, buf, len, pwd, pwdlen );\n#endif /* MBEDTLS_AES_C */\n\n        /*\n         * The result will be ASN.1 starting with a SEQUENCE tag, with 1 to 3\n         * length bytes (allow 4 to be sure) in all known use cases.\n         *\n         * Use that as heurisitic to try detecting password mismatchs.\n         */\n        if( len <= 2 || buf[0] != 0x30 || buf[1] > 0x83 )\n        {\n            mbedtls_free( buf );\n            return( MBEDTLS_ERR_PEM_PASSWORD_MISMATCH );\n        }\n#else\n        mbedtls_free( buf );\n        return( MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE );\n#endif /* MBEDTLS_MD5_C && MBEDTLS_CIPHER_MODE_CBC &&\n          ( MBEDTLS_AES_C || MBEDTLS_DES_C ) */\n    }\n\n    ctx->buf = buf;\n    ctx->buflen = len;\n\n    return( 0 );\n}\n\nvoid mbedtls_pem_free( mbedtls_pem_context *ctx )\n{\n    mbedtls_free( ctx->buf );\n    mbedtls_free( ctx->info );\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_pem_context ) );\n}\n#endif /* MBEDTLS_PEM_PARSE_C */\n\n#if defined(MBEDTLS_PEM_WRITE_C)\nint mbedtls_pem_write_buffer( const char *header, const char *footer,\n                      const unsigned char *der_data, size_t der_len,\n                      unsigned char *buf, size_t buf_len, size_t *olen )\n{\n    int ret;\n    unsigned char *encode_buf, *c, *p = buf;\n    size_t len = 0, use_len, add_len = 0;\n\n    mbedtls_base64_encode( NULL, 0, &use_len, der_data, der_len );\n    add_len = strlen( header ) + strlen( footer ) + ( use_len / 64 ) + 1;\n\n    if( use_len + add_len > buf_len )\n    {\n        *olen = use_len + add_len;\n        return( MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL );\n    }\n\n    if( ( encode_buf = mbedtls_calloc( 1, use_len ) ) == NULL )\n        return( MBEDTLS_ERR_PEM_ALLOC_FAILED );\n\n    if( ( ret = mbedtls_base64_encode( encode_buf, use_len, &use_len, der_data,\n                               der_len ) ) != 0 )\n    {\n        mbedtls_free( encode_buf );\n        return( ret );\n    }\n\n    memcpy( p, header, strlen( header ) );\n    p += strlen( header );\n    c = encode_buf;\n\n    while( use_len )\n    {\n        len = ( use_len > 64 ) ? 64 : use_len;\n        memcpy( p, c, len );\n        use_len -= len;\n        p += len;\n        c += len;\n        *p++ = '\\n';\n    }\n\n    memcpy( p, footer, strlen( footer ) );\n    p += strlen( footer );\n\n    *p++ = '\\0';\n    *olen = p - buf;\n\n    mbedtls_free( encode_buf );\n    return( 0 );\n}\n#endif /* MBEDTLS_PEM_WRITE_C */\n#endif /* MBEDTLS_PEM_PARSE_C || MBEDTLS_PEM_WRITE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/pk.c",
    "content": "/*\n *  Public Key abstraction layer\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PK_C)\n#include \"mbedtls/pk.h\"\n#include \"mbedtls/pk_internal.h\"\n\n#include \"mbedtls/bignum.h\"\n\n#if defined(MBEDTLS_RSA_C)\n#include \"mbedtls/rsa.h\"\n#endif\n#if defined(MBEDTLS_ECP_C)\n#include \"mbedtls/ecp.h\"\n#endif\n#if defined(MBEDTLS_ECDSA_C)\n#include \"mbedtls/ecdsa.h\"\n#endif\n\n#include <limits.h>\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * Initialise a mbedtls_pk_context\n */\nvoid mbedtls_pk_init( mbedtls_pk_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    ctx->pk_info = NULL;\n    ctx->pk_ctx = NULL;\n}\n\n/*\n * Free (the components of) a mbedtls_pk_context\n */\nvoid mbedtls_pk_free( mbedtls_pk_context *ctx )\n{\n    if( ctx == NULL || ctx->pk_info == NULL )\n        return;\n\n    ctx->pk_info->ctx_free_func( ctx->pk_ctx );\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_pk_context ) );\n}\n\n/*\n * Get pk_info structure from type\n */\nconst mbedtls_pk_info_t * mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type )\n{\n    switch( pk_type ) {\n#if defined(MBEDTLS_RSA_C)\n        case MBEDTLS_PK_RSA:\n            return( &mbedtls_rsa_info );\n#endif\n#if defined(MBEDTLS_ECP_C)\n        case MBEDTLS_PK_ECKEY:\n            return( &mbedtls_eckey_info );\n        case MBEDTLS_PK_ECKEY_DH:\n            return( &mbedtls_eckeydh_info );\n#endif\n#if defined(MBEDTLS_ECDSA_C)\n        case MBEDTLS_PK_ECDSA:\n            return( &mbedtls_ecdsa_info );\n#endif\n        /* MBEDTLS_PK_RSA_ALT omitted on purpose */\n        default:\n            return( NULL );\n    }\n}\n\n/*\n * Initialise context\n */\nint mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info )\n{\n    if( ctx == NULL || info == NULL || ctx->pk_info != NULL )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n    if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL )\n        return( MBEDTLS_ERR_PK_ALLOC_FAILED );\n\n    ctx->pk_info = info;\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)\n/*\n * Initialize an RSA-alt context\n */\nint mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key,\n                         mbedtls_pk_rsa_alt_decrypt_func decrypt_func,\n                         mbedtls_pk_rsa_alt_sign_func sign_func,\n                         mbedtls_pk_rsa_alt_key_len_func key_len_func )\n{\n    mbedtls_rsa_alt_context *rsa_alt;\n    const mbedtls_pk_info_t *info = &mbedtls_rsa_alt_info;\n\n    if( ctx == NULL || ctx->pk_info != NULL )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n    if( ( ctx->pk_ctx = info->ctx_alloc_func() ) == NULL )\n        return( MBEDTLS_ERR_PK_ALLOC_FAILED );\n\n    ctx->pk_info = info;\n\n    rsa_alt = (mbedtls_rsa_alt_context *) ctx->pk_ctx;\n\n    rsa_alt->key = key;\n    rsa_alt->decrypt_func = decrypt_func;\n    rsa_alt->sign_func = sign_func;\n    rsa_alt->key_len_func = key_len_func;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */\n\n/*\n * Tell if a PK can do the operations of the given type\n */\nint mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type )\n{\n    /* null or NONE context can't do anything */\n    if( ctx == NULL || ctx->pk_info == NULL )\n        return( 0 );\n\n    return( ctx->pk_info->can_do( type ) );\n}\n\n/*\n * Helper for mbedtls_pk_sign and mbedtls_pk_verify\n */\nstatic inline int pk_hashlen_helper( mbedtls_md_type_t md_alg, size_t *hash_len )\n{\n    const mbedtls_md_info_t *md_info;\n\n    if( *hash_len != 0 )\n        return( 0 );\n\n    if( ( md_info = mbedtls_md_info_from_type( md_alg ) ) == NULL )\n        return( -1 );\n\n    *hash_len = mbedtls_md_get_size( md_info );\n    return( 0 );\n}\n\n/*\n * Verify a signature\n */\nint mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,\n               const unsigned char *hash, size_t hash_len,\n               const unsigned char *sig, size_t sig_len )\n{\n    if( ctx == NULL || ctx->pk_info == NULL ||\n        pk_hashlen_helper( md_alg, &hash_len ) != 0 )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n    if( ctx->pk_info->verify_func == NULL )\n        return( MBEDTLS_ERR_PK_TYPE_MISMATCH );\n\n    return( ctx->pk_info->verify_func( ctx->pk_ctx, md_alg, hash, hash_len,\n                                       sig, sig_len ) );\n}\n\n/*\n * Verify a signature with options\n */\nint mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options,\n                   mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,\n                   const unsigned char *hash, size_t hash_len,\n                   const unsigned char *sig, size_t sig_len )\n{\n    if( ctx == NULL || ctx->pk_info == NULL )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n    if( ! mbedtls_pk_can_do( ctx, type ) )\n        return( MBEDTLS_ERR_PK_TYPE_MISMATCH );\n\n    if( type == MBEDTLS_PK_RSASSA_PSS )\n    {\n#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PKCS1_V21)\n        int ret;\n        const mbedtls_pk_rsassa_pss_options *pss_opts;\n\n#if defined(MBEDTLS_HAVE_INT64)\n        if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len )\n            return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n#endif /* MBEDTLS_HAVE_INT64 */\n\n        if( options == NULL )\n            return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n        pss_opts = (const mbedtls_pk_rsassa_pss_options *) options;\n\n        if( sig_len < mbedtls_pk_get_len( ctx ) )\n            return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n        ret = mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_pk_rsa( *ctx ),\n                NULL, NULL, MBEDTLS_RSA_PUBLIC,\n                md_alg, (unsigned int) hash_len, hash,\n                pss_opts->mgf1_hash_id,\n                pss_opts->expected_salt_len,\n                sig );\n        if( ret != 0 )\n            return( ret );\n\n        if( sig_len > mbedtls_pk_get_len( ctx ) )\n            return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );\n\n        return( 0 );\n#else\n        return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );\n#endif /* MBEDTLS_RSA_C && MBEDTLS_PKCS1_V21 */\n    }\n\n    /* General case: no options */\n    if( options != NULL )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n    return( mbedtls_pk_verify( ctx, md_alg, hash, hash_len, sig, sig_len ) );\n}\n\n/*\n * Make a signature\n */\nint mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,\n             const unsigned char *hash, size_t hash_len,\n             unsigned char *sig, size_t *sig_len,\n             int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    if( ctx == NULL || ctx->pk_info == NULL ||\n        pk_hashlen_helper( md_alg, &hash_len ) != 0 )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n    if( ctx->pk_info->sign_func == NULL )\n        return( MBEDTLS_ERR_PK_TYPE_MISMATCH );\n\n    return( ctx->pk_info->sign_func( ctx->pk_ctx, md_alg, hash, hash_len,\n                                     sig, sig_len, f_rng, p_rng ) );\n}\n\n/*\n * Decrypt message\n */\nint mbedtls_pk_decrypt( mbedtls_pk_context *ctx,\n                const unsigned char *input, size_t ilen,\n                unsigned char *output, size_t *olen, size_t osize,\n                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    if( ctx == NULL || ctx->pk_info == NULL )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n    if( ctx->pk_info->decrypt_func == NULL )\n        return( MBEDTLS_ERR_PK_TYPE_MISMATCH );\n\n    return( ctx->pk_info->decrypt_func( ctx->pk_ctx, input, ilen,\n                output, olen, osize, f_rng, p_rng ) );\n}\n\n/*\n * Encrypt message\n */\nint mbedtls_pk_encrypt( mbedtls_pk_context *ctx,\n                const unsigned char *input, size_t ilen,\n                unsigned char *output, size_t *olen, size_t osize,\n                int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    if( ctx == NULL || ctx->pk_info == NULL )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n    if( ctx->pk_info->encrypt_func == NULL )\n        return( MBEDTLS_ERR_PK_TYPE_MISMATCH );\n\n    return( ctx->pk_info->encrypt_func( ctx->pk_ctx, input, ilen,\n                output, olen, osize, f_rng, p_rng ) );\n}\n\n/*\n * Check public-private key pair\n */\nint mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv )\n{\n    if( pub == NULL || pub->pk_info == NULL ||\n        prv == NULL || prv->pk_info == NULL ||\n        prv->pk_info->check_pair_func == NULL )\n    {\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n    }\n\n    if( prv->pk_info->type == MBEDTLS_PK_RSA_ALT )\n    {\n        if( pub->pk_info->type != MBEDTLS_PK_RSA )\n            return( MBEDTLS_ERR_PK_TYPE_MISMATCH );\n    }\n    else\n    {\n        if( pub->pk_info != prv->pk_info )\n            return( MBEDTLS_ERR_PK_TYPE_MISMATCH );\n    }\n\n    return( prv->pk_info->check_pair_func( pub->pk_ctx, prv->pk_ctx ) );\n}\n\n/*\n * Get key size in bits\n */\nsize_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx )\n{\n    if( ctx == NULL || ctx->pk_info == NULL )\n        return( 0 );\n\n    return( ctx->pk_info->get_bitlen( ctx->pk_ctx ) );\n}\n\n/*\n * Export debug information\n */\nint mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items )\n{\n    if( ctx == NULL || ctx->pk_info == NULL )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n    if( ctx->pk_info->debug_func == NULL )\n        return( MBEDTLS_ERR_PK_TYPE_MISMATCH );\n\n    ctx->pk_info->debug_func( ctx->pk_ctx, items );\n    return( 0 );\n}\n\n/*\n * Access the PK type name\n */\nconst char *mbedtls_pk_get_name( const mbedtls_pk_context *ctx )\n{\n    if( ctx == NULL || ctx->pk_info == NULL )\n        return( \"invalid PK\" );\n\n    return( ctx->pk_info->name );\n}\n\n/*\n * Access the PK type\n */\nmbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx )\n{\n    if( ctx == NULL || ctx->pk_info == NULL )\n        return( MBEDTLS_PK_NONE );\n\n    return( ctx->pk_info->type );\n}\n\n#endif /* MBEDTLS_PK_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/pk_wrap.c",
    "content": "/*\n *  Public Key abstraction layer: wrapper functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PK_C)\n#include \"mbedtls/pk_internal.h\"\n\n/* Even if RSA not activated, for the sake of RSA-alt */\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/bignum.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_ECP_C)\n#include \"mbedtls/ecp.h\"\n#endif\n\n#if defined(MBEDTLS_ECDSA_C)\n#include \"mbedtls/ecdsa.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n#include <limits.h>\n\n#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n#endif\n\n#if defined(MBEDTLS_RSA_C)\nstatic int rsa_can_do( mbedtls_pk_type_t type )\n{\n    return( type == MBEDTLS_PK_RSA ||\n            type == MBEDTLS_PK_RSASSA_PSS );\n}\n\nstatic size_t rsa_get_bitlen( const void *ctx )\n{\n    return( 8 * ((const mbedtls_rsa_context *) ctx)->len );\n}\n\nstatic int rsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,\n                   const unsigned char *hash, size_t hash_len,\n                   const unsigned char *sig, size_t sig_len )\n{\n    int ret;\n\n#if defined(MBEDTLS_HAVE_INT64)\n    if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n#endif /* MBEDTLS_HAVE_INT64 */\n\n    if( sig_len < ((mbedtls_rsa_context *) ctx)->len )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n    if( ( ret = mbedtls_rsa_pkcs1_verify( (mbedtls_rsa_context *) ctx, NULL, NULL,\n                                  MBEDTLS_RSA_PUBLIC, md_alg,\n                                  (unsigned int) hash_len, hash, sig ) ) != 0 )\n        return( ret );\n\n    if( sig_len > ((mbedtls_rsa_context *) ctx)->len )\n        return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );\n\n    return( 0 );\n}\n\nstatic int rsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,\n                   const unsigned char *hash, size_t hash_len,\n                   unsigned char *sig, size_t *sig_len,\n                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n#if defined(MBEDTLS_HAVE_INT64)\n    if( md_alg == MBEDTLS_MD_NONE && UINT_MAX < hash_len )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n#endif /* MBEDTLS_HAVE_INT64 */\n\n    *sig_len = ((mbedtls_rsa_context *) ctx)->len;\n\n    return( mbedtls_rsa_pkcs1_sign( (mbedtls_rsa_context *) ctx, f_rng, p_rng, MBEDTLS_RSA_PRIVATE,\n                md_alg, (unsigned int) hash_len, hash, sig ) );\n}\n\nstatic int rsa_decrypt_wrap( void *ctx,\n                    const unsigned char *input, size_t ilen,\n                    unsigned char *output, size_t *olen, size_t osize,\n                    int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    if( ilen != ((mbedtls_rsa_context *) ctx)->len )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    return( mbedtls_rsa_pkcs1_decrypt( (mbedtls_rsa_context *) ctx, f_rng, p_rng,\n                MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) );\n}\n\nstatic int rsa_encrypt_wrap( void *ctx,\n                    const unsigned char *input, size_t ilen,\n                    unsigned char *output, size_t *olen, size_t osize,\n                    int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    *olen = ((mbedtls_rsa_context *) ctx)->len;\n\n    if( *olen > osize )\n        return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE );\n\n    return( mbedtls_rsa_pkcs1_encrypt( (mbedtls_rsa_context *) ctx,\n                f_rng, p_rng, MBEDTLS_RSA_PUBLIC, ilen, input, output ) );\n}\n\nstatic int rsa_check_pair_wrap( const void *pub, const void *prv )\n{\n    return( mbedtls_rsa_check_pub_priv( (const mbedtls_rsa_context *) pub,\n                                (const mbedtls_rsa_context *) prv ) );\n}\n\nstatic void *rsa_alloc_wrap( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_context ) );\n\n    if( ctx != NULL )\n        mbedtls_rsa_init( (mbedtls_rsa_context *) ctx, 0, 0 );\n\n    return( ctx );\n}\n\nstatic void rsa_free_wrap( void *ctx )\n{\n    mbedtls_rsa_free( (mbedtls_rsa_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic void rsa_debug( const void *ctx, mbedtls_pk_debug_item *items )\n{\n    items->type = MBEDTLS_PK_DEBUG_MPI;\n    items->name = \"rsa.N\";\n    items->value = &( ((mbedtls_rsa_context *) ctx)->N );\n\n    items++;\n\n    items->type = MBEDTLS_PK_DEBUG_MPI;\n    items->name = \"rsa.E\";\n    items->value = &( ((mbedtls_rsa_context *) ctx)->E );\n}\n\nconst mbedtls_pk_info_t mbedtls_rsa_info = {\n    MBEDTLS_PK_RSA,\n    \"RSA\",\n    rsa_get_bitlen,\n    rsa_can_do,\n    rsa_verify_wrap,\n    rsa_sign_wrap,\n    rsa_decrypt_wrap,\n    rsa_encrypt_wrap,\n    rsa_check_pair_wrap,\n    rsa_alloc_wrap,\n    rsa_free_wrap,\n    rsa_debug,\n};\n#endif /* MBEDTLS_RSA_C */\n\n#if defined(MBEDTLS_ECP_C)\n/*\n * Generic EC key\n */\nstatic int eckey_can_do( mbedtls_pk_type_t type )\n{\n    return( type == MBEDTLS_PK_ECKEY ||\n            type == MBEDTLS_PK_ECKEY_DH ||\n            type == MBEDTLS_PK_ECDSA );\n}\n\nstatic size_t eckey_get_bitlen( const void *ctx )\n{\n    return( ((mbedtls_ecp_keypair *) ctx)->grp.pbits );\n}\n\n#if defined(MBEDTLS_ECDSA_C)\n/* Forward declarations */\nstatic int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,\n                       const unsigned char *hash, size_t hash_len,\n                       const unsigned char *sig, size_t sig_len );\n\nstatic int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,\n                   const unsigned char *hash, size_t hash_len,\n                   unsigned char *sig, size_t *sig_len,\n                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );\n\nstatic int eckey_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,\n                       const unsigned char *hash, size_t hash_len,\n                       const unsigned char *sig, size_t sig_len )\n{\n    int ret;\n    mbedtls_ecdsa_context ecdsa;\n\n    mbedtls_ecdsa_init( &ecdsa );\n\n    if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )\n        ret = ecdsa_verify_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len );\n\n    mbedtls_ecdsa_free( &ecdsa );\n\n    return( ret );\n}\n\nstatic int eckey_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,\n                   const unsigned char *hash, size_t hash_len,\n                   unsigned char *sig, size_t *sig_len,\n                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    int ret;\n    mbedtls_ecdsa_context ecdsa;\n\n    mbedtls_ecdsa_init( &ecdsa );\n\n    if( ( ret = mbedtls_ecdsa_from_keypair( &ecdsa, ctx ) ) == 0 )\n        ret = ecdsa_sign_wrap( &ecdsa, md_alg, hash, hash_len, sig, sig_len,\n                               f_rng, p_rng );\n\n    mbedtls_ecdsa_free( &ecdsa );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_ECDSA_C */\n\nstatic int eckey_check_pair( const void *pub, const void *prv )\n{\n    return( mbedtls_ecp_check_pub_priv( (const mbedtls_ecp_keypair *) pub,\n                                (const mbedtls_ecp_keypair *) prv ) );\n}\n\nstatic void *eckey_alloc_wrap( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecp_keypair ) );\n\n    if( ctx != NULL )\n        mbedtls_ecp_keypair_init( ctx );\n\n    return( ctx );\n}\n\nstatic void eckey_free_wrap( void *ctx )\n{\n    mbedtls_ecp_keypair_free( (mbedtls_ecp_keypair *) ctx );\n    mbedtls_free( ctx );\n}\n\nstatic void eckey_debug( const void *ctx, mbedtls_pk_debug_item *items )\n{\n    items->type = MBEDTLS_PK_DEBUG_ECP;\n    items->name = \"eckey.Q\";\n    items->value = &( ((mbedtls_ecp_keypair *) ctx)->Q );\n}\n\nconst mbedtls_pk_info_t mbedtls_eckey_info = {\n    MBEDTLS_PK_ECKEY,\n    \"EC\",\n    eckey_get_bitlen,\n    eckey_can_do,\n#if defined(MBEDTLS_ECDSA_C)\n    eckey_verify_wrap,\n    eckey_sign_wrap,\n#else\n    NULL,\n    NULL,\n#endif\n    NULL,\n    NULL,\n    eckey_check_pair,\n    eckey_alloc_wrap,\n    eckey_free_wrap,\n    eckey_debug,\n};\n\n/*\n * EC key restricted to ECDH\n */\nstatic int eckeydh_can_do( mbedtls_pk_type_t type )\n{\n    return( type == MBEDTLS_PK_ECKEY ||\n            type == MBEDTLS_PK_ECKEY_DH );\n}\n\nconst mbedtls_pk_info_t mbedtls_eckeydh_info = {\n    MBEDTLS_PK_ECKEY_DH,\n    \"EC_DH\",\n    eckey_get_bitlen,         /* Same underlying key structure */\n    eckeydh_can_do,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    eckey_check_pair,\n    eckey_alloc_wrap,       /* Same underlying key structure */\n    eckey_free_wrap,        /* Same underlying key structure */\n    eckey_debug,            /* Same underlying key structure */\n};\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_ECDSA_C)\nstatic int ecdsa_can_do( mbedtls_pk_type_t type )\n{\n    return( type == MBEDTLS_PK_ECDSA );\n}\n\nstatic int ecdsa_verify_wrap( void *ctx, mbedtls_md_type_t md_alg,\n                       const unsigned char *hash, size_t hash_len,\n                       const unsigned char *sig, size_t sig_len )\n{\n    int ret;\n    ((void) md_alg);\n\n    ret = mbedtls_ecdsa_read_signature( (mbedtls_ecdsa_context *) ctx,\n                                hash, hash_len, sig, sig_len );\n\n    if( ret == MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH )\n        return( MBEDTLS_ERR_PK_SIG_LEN_MISMATCH );\n\n    return( ret );\n}\n\nstatic int ecdsa_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,\n                   const unsigned char *hash, size_t hash_len,\n                   unsigned char *sig, size_t *sig_len,\n                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    return( mbedtls_ecdsa_write_signature( (mbedtls_ecdsa_context *) ctx,\n                md_alg, hash, hash_len, sig, sig_len, f_rng, p_rng ) );\n}\n\nstatic void *ecdsa_alloc_wrap( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ecdsa_context ) );\n\n    if( ctx != NULL )\n        mbedtls_ecdsa_init( (mbedtls_ecdsa_context *) ctx );\n\n    return( ctx );\n}\n\nstatic void ecdsa_free_wrap( void *ctx )\n{\n    mbedtls_ecdsa_free( (mbedtls_ecdsa_context *) ctx );\n    mbedtls_free( ctx );\n}\n\nconst mbedtls_pk_info_t mbedtls_ecdsa_info = {\n    MBEDTLS_PK_ECDSA,\n    \"ECDSA\",\n    eckey_get_bitlen,     /* Compatible key structures */\n    ecdsa_can_do,\n    ecdsa_verify_wrap,\n    ecdsa_sign_wrap,\n    NULL,\n    NULL,\n    eckey_check_pair,   /* Compatible key structures */\n    ecdsa_alloc_wrap,\n    ecdsa_free_wrap,\n    eckey_debug,        /* Compatible key structures */\n};\n#endif /* MBEDTLS_ECDSA_C */\n\n#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)\n/*\n * Support for alternative RSA-private implementations\n */\n\nstatic int rsa_alt_can_do( mbedtls_pk_type_t type )\n{\n    return( type == MBEDTLS_PK_RSA );\n}\n\nstatic size_t rsa_alt_get_bitlen( const void *ctx )\n{\n    const mbedtls_rsa_alt_context *rsa_alt = (const mbedtls_rsa_alt_context *) ctx;\n\n    return( 8 * rsa_alt->key_len_func( rsa_alt->key ) );\n}\n\nstatic int rsa_alt_sign_wrap( void *ctx, mbedtls_md_type_t md_alg,\n                   const unsigned char *hash, size_t hash_len,\n                   unsigned char *sig, size_t *sig_len,\n                   int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx;\n\n#if defined(MBEDTLS_HAVE_INT64)\n    if( UINT_MAX < hash_len )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n#endif /* MBEDTLS_HAVE_INT64 */\n\n    *sig_len = rsa_alt->key_len_func( rsa_alt->key );\n\n    return( rsa_alt->sign_func( rsa_alt->key, f_rng, p_rng, MBEDTLS_RSA_PRIVATE,\n                md_alg, (unsigned int) hash_len, hash, sig ) );\n}\n\nstatic int rsa_alt_decrypt_wrap( void *ctx,\n                    const unsigned char *input, size_t ilen,\n                    unsigned char *output, size_t *olen, size_t osize,\n                    int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    mbedtls_rsa_alt_context *rsa_alt = (mbedtls_rsa_alt_context *) ctx;\n\n    ((void) f_rng);\n    ((void) p_rng);\n\n    if( ilen != rsa_alt->key_len_func( rsa_alt->key ) )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    return( rsa_alt->decrypt_func( rsa_alt->key,\n                MBEDTLS_RSA_PRIVATE, olen, input, output, osize ) );\n}\n\n#if defined(MBEDTLS_RSA_C)\nstatic int rsa_alt_check_pair( const void *pub, const void *prv )\n{\n    unsigned char sig[MBEDTLS_MPI_MAX_SIZE];\n    unsigned char hash[32];\n    size_t sig_len = 0;\n    int ret;\n\n    if( rsa_alt_get_bitlen( prv ) != rsa_get_bitlen( pub ) )\n        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );\n\n    memset( hash, 0x2a, sizeof( hash ) );\n\n    if( ( ret = rsa_alt_sign_wrap( (void *) prv, MBEDTLS_MD_NONE,\n                                   hash, sizeof( hash ),\n                                   sig, &sig_len, NULL, NULL ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( rsa_verify_wrap( (void *) pub, MBEDTLS_MD_NONE,\n                         hash, sizeof( hash ), sig, sig_len ) != 0 )\n    {\n        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_RSA_C */\n\nstatic void *rsa_alt_alloc_wrap( void )\n{\n    void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_rsa_alt_context ) );\n\n    if( ctx != NULL )\n        memset( ctx, 0, sizeof( mbedtls_rsa_alt_context ) );\n\n    return( ctx );\n}\n\nstatic void rsa_alt_free_wrap( void *ctx )\n{\n    mbedtls_zeroize( ctx, sizeof( mbedtls_rsa_alt_context ) );\n    mbedtls_free( ctx );\n}\n\nconst mbedtls_pk_info_t mbedtls_rsa_alt_info = {\n    MBEDTLS_PK_RSA_ALT,\n    \"RSA-alt\",\n    rsa_alt_get_bitlen,\n    rsa_alt_can_do,\n    NULL,\n    rsa_alt_sign_wrap,\n    rsa_alt_decrypt_wrap,\n    NULL,\n#if defined(MBEDTLS_RSA_C)\n    rsa_alt_check_pair,\n#else\n    NULL,\n#endif\n    rsa_alt_alloc_wrap,\n    rsa_alt_free_wrap,\n    NULL,\n};\n\n#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */\n\n#endif /* MBEDTLS_PK_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/pkcs11.c",
    "content": "/**\n * \\file pkcs11.c\n *\n * \\brief Wrapper for PKCS#11 library libpkcs11-helper\n *\n * \\author Adriaan de Jong <dejong@fox-it.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#include \"mbedtls/pkcs11.h\"\n\n#if defined(MBEDTLS_PKCS11_C)\n\n#include \"mbedtls/md.h\"\n#include \"mbedtls/oid.h\"\n#include \"mbedtls/x509_crt.h\"\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n#include <string.h>\n\nvoid mbedtls_pkcs11_init( mbedtls_pkcs11_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_pkcs11_context ) );\n}\n\nint mbedtls_pkcs11_x509_cert_bind( mbedtls_x509_crt *cert, pkcs11h_certificate_t pkcs11_cert )\n{\n    int ret = 1;\n    unsigned char *cert_blob = NULL;\n    size_t cert_blob_size = 0;\n\n    if( cert == NULL )\n    {\n        ret = 2;\n        goto cleanup;\n    }\n\n    if( pkcs11h_certificate_getCertificateBlob( pkcs11_cert, NULL,\n                                                &cert_blob_size ) != CKR_OK )\n    {\n        ret = 3;\n        goto cleanup;\n    }\n\n    cert_blob = mbedtls_calloc( 1, cert_blob_size );\n    if( NULL == cert_blob )\n    {\n        ret = 4;\n        goto cleanup;\n    }\n\n    if( pkcs11h_certificate_getCertificateBlob( pkcs11_cert, cert_blob,\n                                                &cert_blob_size ) != CKR_OK )\n    {\n        ret = 5;\n        goto cleanup;\n    }\n\n    if( 0 != mbedtls_x509_crt_parse( cert, cert_blob, cert_blob_size ) )\n    {\n        ret = 6;\n        goto cleanup;\n    }\n\n    ret = 0;\n\ncleanup:\n    if( NULL != cert_blob )\n        mbedtls_free( cert_blob );\n\n    return( ret );\n}\n\n\nint mbedtls_pkcs11_priv_key_bind( mbedtls_pkcs11_context *priv_key,\n        pkcs11h_certificate_t pkcs11_cert )\n{\n    int ret = 1;\n    mbedtls_x509_crt cert;\n\n    mbedtls_x509_crt_init( &cert );\n\n    if( priv_key == NULL )\n        goto cleanup;\n\n    if( 0 != mbedtls_pkcs11_x509_cert_bind( &cert, pkcs11_cert ) )\n        goto cleanup;\n\n    priv_key->len = mbedtls_pk_get_len( &cert.pk );\n    priv_key->pkcs11h_cert = pkcs11_cert;\n\n    ret = 0;\n\ncleanup:\n    mbedtls_x509_crt_free( &cert );\n\n    return( ret );\n}\n\nvoid mbedtls_pkcs11_priv_key_free( mbedtls_pkcs11_context *priv_key )\n{\n    if( NULL != priv_key )\n        pkcs11h_certificate_freeCertificate( priv_key->pkcs11h_cert );\n}\n\nint mbedtls_pkcs11_decrypt( mbedtls_pkcs11_context *ctx,\n                       int mode, size_t *olen,\n                       const unsigned char *input,\n                       unsigned char *output,\n                       size_t output_max_len )\n{\n    size_t input_len, output_len;\n\n    if( NULL == ctx )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    if( MBEDTLS_RSA_PRIVATE != mode )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    output_len = input_len = ctx->len;\n\n    if( input_len < 16 || input_len > output_max_len )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    /* Determine size of output buffer */\n    if( pkcs11h_certificate_decryptAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, input,\n            input_len, NULL, &output_len ) != CKR_OK )\n    {\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n    }\n\n    if( output_len > output_max_len )\n        return( MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE );\n\n    if( pkcs11h_certificate_decryptAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, input,\n            input_len, output, &output_len ) != CKR_OK )\n    {\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n    }\n    *olen = output_len;\n    return( 0 );\n}\n\nint mbedtls_pkcs11_sign( mbedtls_pkcs11_context *ctx,\n                    int mode,\n                    mbedtls_md_type_t md_alg,\n                    unsigned int hashlen,\n                    const unsigned char *hash,\n                    unsigned char *sig )\n{\n    size_t sig_len = 0, asn_len = 0, oid_size = 0;\n    unsigned char *p = sig;\n    const char *oid;\n\n    if( NULL == ctx )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    if( MBEDTLS_RSA_PRIVATE != mode )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    if( md_alg != MBEDTLS_MD_NONE )\n    {\n        const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );\n        if( md_info == NULL )\n            return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n        if( mbedtls_oid_get_oid_by_md( md_alg, &oid, &oid_size ) != 0 )\n            return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n        hashlen = mbedtls_md_get_size( md_info );\n        asn_len = 10 + oid_size;\n    }\n\n    sig_len = ctx->len;\n    if( hashlen > sig_len || asn_len > sig_len ||\n        hashlen + asn_len > sig_len )\n    {\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n    }\n\n    if( md_alg != MBEDTLS_MD_NONE )\n    {\n        /*\n         * DigestInfo ::= SEQUENCE {\n         *   digestAlgorithm DigestAlgorithmIdentifier,\n         *   digest Digest }\n         *\n         * DigestAlgorithmIdentifier ::= AlgorithmIdentifier\n         *\n         * Digest ::= OCTET STRING\n         */\n        *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED;\n        *p++ = (unsigned char) ( 0x08 + oid_size + hashlen );\n        *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED;\n        *p++ = (unsigned char) ( 0x04 + oid_size );\n        *p++ = MBEDTLS_ASN1_OID;\n        *p++ = oid_size & 0xFF;\n        memcpy( p, oid, oid_size );\n        p += oid_size;\n        *p++ = MBEDTLS_ASN1_NULL;\n        *p++ = 0x00;\n        *p++ = MBEDTLS_ASN1_OCTET_STRING;\n        *p++ = hashlen;\n    }\n\n    memcpy( p, hash, hashlen );\n\n    if( pkcs11h_certificate_signAny( ctx->pkcs11h_cert, CKM_RSA_PKCS, sig,\n            asn_len + hashlen, sig, &sig_len ) != CKR_OK )\n    {\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n    }\n\n    return( 0 );\n}\n\n#endif /* defined(MBEDTLS_PKCS11_C) */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/pkcs12.c",
    "content": "/*\n *  PKCS#12 Personal Information Exchange Syntax\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The PKCS #12 Personal Information Exchange Syntax Standard v1.1\n *\n *  http://www.rsa.com/rsalabs/pkcs/files/h11301-wp-pkcs-12v1-1-personal-information-exchange-syntax.pdf\n *  ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-12/pkcs-12v1-1.asn\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PKCS12_C)\n\n#include \"mbedtls/pkcs12.h\"\n#include \"mbedtls/asn1.h\"\n#include \"mbedtls/cipher.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_ARC4_C)\n#include \"mbedtls/arc4.h\"\n#endif\n\n#if defined(MBEDTLS_DES_C)\n#include \"mbedtls/des.h\"\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\nstatic int pkcs12_parse_pbe_params( mbedtls_asn1_buf *params,\n                                    mbedtls_asn1_buf *salt, int *iterations )\n{\n    int ret;\n    unsigned char **p = &params->p;\n    const unsigned char *end = params->p + params->len;\n\n    /*\n     *  pkcs-12PbeParams ::= SEQUENCE {\n     *    salt          OCTET STRING,\n     *    iterations    INTEGER\n     *  }\n     *\n     */\n    if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )\n        return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &salt->len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )\n        return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + ret );\n\n    salt->p = *p;\n    *p += salt->len;\n\n    if( ( ret = mbedtls_asn1_get_int( p, end, iterations ) ) != 0 )\n        return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT + ret );\n\n    if( *p != end )\n        return( MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n#define PKCS12_MAX_PWDLEN 128\n\nstatic int pkcs12_pbe_derive_key_iv( mbedtls_asn1_buf *pbe_params, mbedtls_md_type_t md_type,\n                                     const unsigned char *pwd,  size_t pwdlen,\n                                     unsigned char *key, size_t keylen,\n                                     unsigned char *iv,  size_t ivlen )\n{\n    int ret, iterations = 0;\n    mbedtls_asn1_buf salt;\n    size_t i;\n    unsigned char unipwd[PKCS12_MAX_PWDLEN * 2 + 2];\n\n    if( pwdlen > PKCS12_MAX_PWDLEN )\n        return( MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA );\n\n    memset( &salt, 0, sizeof(mbedtls_asn1_buf) );\n    memset( &unipwd, 0, sizeof(unipwd) );\n\n    if( ( ret = pkcs12_parse_pbe_params( pbe_params, &salt,\n                                         &iterations ) ) != 0 )\n        return( ret );\n\n    for( i = 0; i < pwdlen; i++ )\n        unipwd[i * 2 + 1] = pwd[i];\n\n    if( ( ret = mbedtls_pkcs12_derivation( key, keylen, unipwd, pwdlen * 2 + 2,\n                                   salt.p, salt.len, md_type,\n                                   MBEDTLS_PKCS12_DERIVE_KEY, iterations ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( iv == NULL || ivlen == 0 )\n        return( 0 );\n\n    if( ( ret = mbedtls_pkcs12_derivation( iv, ivlen, unipwd, pwdlen * 2 + 2,\n                                   salt.p, salt.len, md_type,\n                                   MBEDTLS_PKCS12_DERIVE_IV, iterations ) ) != 0 )\n    {\n        return( ret );\n    }\n    return( 0 );\n}\n\n#undef PKCS12_MAX_PWDLEN\n\nint mbedtls_pkcs12_pbe_sha1_rc4_128( mbedtls_asn1_buf *pbe_params, int mode,\n                             const unsigned char *pwd,  size_t pwdlen,\n                             const unsigned char *data, size_t len,\n                             unsigned char *output )\n{\n#if !defined(MBEDTLS_ARC4_C)\n    ((void) pbe_params);\n    ((void) mode);\n    ((void) pwd);\n    ((void) pwdlen);\n    ((void) data);\n    ((void) len);\n    ((void) output);\n    return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE );\n#else\n    int ret;\n    unsigned char key[16];\n    mbedtls_arc4_context ctx;\n    ((void) mode);\n\n    mbedtls_arc4_init( &ctx );\n\n    if( ( ret = pkcs12_pbe_derive_key_iv( pbe_params, MBEDTLS_MD_SHA1,\n                                          pwd, pwdlen,\n                                          key, 16, NULL, 0 ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    mbedtls_arc4_setup( &ctx, key, 16 );\n    if( ( ret = mbedtls_arc4_crypt( &ctx, len, data, output ) ) != 0 )\n        goto exit;\n\nexit:\n    mbedtls_zeroize( key, sizeof( key ) );\n    mbedtls_arc4_free( &ctx );\n\n    return( ret );\n#endif /* MBEDTLS_ARC4_C */\n}\n\nint mbedtls_pkcs12_pbe( mbedtls_asn1_buf *pbe_params, int mode,\n                mbedtls_cipher_type_t cipher_type, mbedtls_md_type_t md_type,\n                const unsigned char *pwd,  size_t pwdlen,\n                const unsigned char *data, size_t len,\n                unsigned char *output )\n{\n    int ret, keylen = 0;\n    unsigned char key[32];\n    unsigned char iv[16];\n    const mbedtls_cipher_info_t *cipher_info;\n    mbedtls_cipher_context_t cipher_ctx;\n    size_t olen = 0;\n\n    cipher_info = mbedtls_cipher_info_from_type( cipher_type );\n    if( cipher_info == NULL )\n        return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE );\n\n    keylen = cipher_info->key_bitlen / 8;\n\n    if( ( ret = pkcs12_pbe_derive_key_iv( pbe_params, md_type, pwd, pwdlen,\n                                          key, keylen,\n                                          iv, cipher_info->iv_size ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    mbedtls_cipher_init( &cipher_ctx );\n\n    if( ( ret = mbedtls_cipher_setup( &cipher_ctx, cipher_info ) ) != 0 )\n        goto exit;\n\n    if( ( ret = mbedtls_cipher_setkey( &cipher_ctx, key, 8 * keylen, (mbedtls_operation_t) mode ) ) != 0 )\n        goto exit;\n\n    if( ( ret = mbedtls_cipher_set_iv( &cipher_ctx, iv, cipher_info->iv_size ) ) != 0 )\n        goto exit;\n\n    if( ( ret = mbedtls_cipher_reset( &cipher_ctx ) ) != 0 )\n        goto exit;\n\n    if( ( ret = mbedtls_cipher_update( &cipher_ctx, data, len,\n                                output, &olen ) ) != 0 )\n    {\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_cipher_finish( &cipher_ctx, output + olen, &olen ) ) != 0 )\n        ret = MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH;\n\nexit:\n    mbedtls_zeroize( key, sizeof( key ) );\n    mbedtls_zeroize( iv,  sizeof( iv  ) );\n    mbedtls_cipher_free( &cipher_ctx );\n\n    return( ret );\n}\n\nstatic void pkcs12_fill_buffer( unsigned char *data, size_t data_len,\n                                const unsigned char *filler, size_t fill_len )\n{\n    unsigned char *p = data;\n    size_t use_len;\n\n    while( data_len > 0 )\n    {\n        use_len = ( data_len > fill_len ) ? fill_len : data_len;\n        memcpy( p, filler, use_len );\n        p += use_len;\n        data_len -= use_len;\n    }\n}\n\nint mbedtls_pkcs12_derivation( unsigned char *data, size_t datalen,\n                       const unsigned char *pwd, size_t pwdlen,\n                       const unsigned char *salt, size_t saltlen,\n                       mbedtls_md_type_t md_type, int id, int iterations )\n{\n    int ret;\n    unsigned int j;\n\n    unsigned char diversifier[128];\n    unsigned char salt_block[128], pwd_block[128], hash_block[128];\n    unsigned char hash_output[MBEDTLS_MD_MAX_SIZE];\n    unsigned char *p;\n    unsigned char c;\n\n    size_t hlen, use_len, v, i;\n\n    const mbedtls_md_info_t *md_info;\n    mbedtls_md_context_t md_ctx;\n\n    // This version only allows max of 64 bytes of password or salt\n    if( datalen > 128 || pwdlen > 64 || saltlen > 64 )\n        return( MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA );\n\n    md_info = mbedtls_md_info_from_type( md_type );\n    if( md_info == NULL )\n        return( MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE );\n\n    mbedtls_md_init( &md_ctx );\n\n    if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 )\n        return( ret );\n    hlen = mbedtls_md_get_size( md_info );\n\n    if( hlen <= 32 )\n        v = 64;\n    else\n        v = 128;\n\n    memset( diversifier, (unsigned char) id, v );\n\n    pkcs12_fill_buffer( salt_block, v, salt, saltlen );\n    pkcs12_fill_buffer( pwd_block,  v, pwd,  pwdlen  );\n\n    p = data;\n    while( datalen > 0 )\n    {\n        // Calculate hash( diversifier || salt_block || pwd_block )\n        if( ( ret = mbedtls_md_starts( &md_ctx ) ) != 0 )\n            goto exit;\n\n        if( ( ret = mbedtls_md_update( &md_ctx, diversifier, v ) ) != 0 )\n            goto exit;\n\n        if( ( ret = mbedtls_md_update( &md_ctx, salt_block, v ) ) != 0 )\n            goto exit;\n\n        if( ( ret = mbedtls_md_update( &md_ctx, pwd_block, v ) ) != 0 )\n            goto exit;\n\n        if( ( ret = mbedtls_md_finish( &md_ctx, hash_output ) ) != 0 )\n            goto exit;\n\n        // Perform remaining ( iterations - 1 ) recursive hash calculations\n        for( i = 1; i < (size_t) iterations; i++ )\n        {\n            if( ( ret = mbedtls_md( md_info, hash_output, hlen, hash_output ) ) != 0 )\n                goto exit;\n        }\n\n        use_len = ( datalen > hlen ) ? hlen : datalen;\n        memcpy( p, hash_output, use_len );\n        datalen -= use_len;\n        p += use_len;\n\n        if( datalen == 0 )\n            break;\n\n        // Concatenating copies of hash_output into hash_block (B)\n        pkcs12_fill_buffer( hash_block, v, hash_output, hlen );\n\n        // B += 1\n        for( i = v; i > 0; i-- )\n            if( ++hash_block[i - 1] != 0 )\n                break;\n\n        // salt_block += B\n        c = 0;\n        for( i = v; i > 0; i-- )\n        {\n            j = salt_block[i - 1] + hash_block[i - 1] + c;\n            c = (unsigned char) (j >> 8);\n            salt_block[i - 1] = j & 0xFF;\n        }\n\n        // pwd_block  += B\n        c = 0;\n        for( i = v; i > 0; i-- )\n        {\n            j = pwd_block[i - 1] + hash_block[i - 1] + c;\n            c = (unsigned char) (j >> 8);\n            pwd_block[i - 1] = j & 0xFF;\n        }\n    }\n\n    ret = 0;\n\nexit:\n    mbedtls_zeroize( salt_block, sizeof( salt_block ) );\n    mbedtls_zeroize( pwd_block, sizeof( pwd_block ) );\n    mbedtls_zeroize( hash_block, sizeof( hash_block ) );\n    mbedtls_zeroize( hash_output, sizeof( hash_output ) );\n\n    mbedtls_md_free( &md_ctx );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_PKCS12_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/pkcs5.c",
    "content": "/**\n * \\file pkcs5.c\n *\n * \\brief PKCS#5 functions\n *\n * \\author Mathias Olsson <mathias@kompetensum.com>\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * PKCS#5 includes PBKDF2 and more\n *\n * http://tools.ietf.org/html/rfc2898 (Specification)\n * http://tools.ietf.org/html/rfc6070 (Test vectors)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PKCS5_C)\n\n#include \"mbedtls/pkcs5.h\"\n#include \"mbedtls/asn1.h\"\n#include \"mbedtls/cipher.h\"\n#include \"mbedtls/oid.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif\n\nstatic int pkcs5_parse_pbkdf2_params( const mbedtls_asn1_buf *params,\n                                      mbedtls_asn1_buf *salt, int *iterations,\n                                      int *keylen, mbedtls_md_type_t *md_type )\n{\n    int ret;\n    mbedtls_asn1_buf prf_alg_oid;\n    unsigned char *p = params->p;\n    const unsigned char *end = params->p + params->len;\n\n    if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )\n        return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n    /*\n     *  PBKDF2-params ::= SEQUENCE {\n     *    salt              OCTET STRING,\n     *    iterationCount    INTEGER,\n     *    keyLength         INTEGER OPTIONAL\n     *    prf               AlgorithmIdentifier DEFAULT algid-hmacWithSHA1\n     *  }\n     *\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &salt->len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )\n        return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );\n\n    salt->p = p;\n    p += salt->len;\n\n    if( ( ret = mbedtls_asn1_get_int( &p, end, iterations ) ) != 0 )\n        return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );\n\n    if( p == end )\n        return( 0 );\n\n    if( ( ret = mbedtls_asn1_get_int( &p, end, keylen ) ) != 0 )\n    {\n        if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n            return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );\n    }\n\n    if( p == end )\n        return( 0 );\n\n    if( ( ret = mbedtls_asn1_get_alg_null( &p, end, &prf_alg_oid ) ) != 0 )\n        return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );\n\n    if( MBEDTLS_OID_CMP( MBEDTLS_OID_HMAC_SHA1, &prf_alg_oid ) != 0 )\n        return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE );\n\n    *md_type = MBEDTLS_MD_SHA1;\n\n    if( p != end )\n        return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\nint mbedtls_pkcs5_pbes2( const mbedtls_asn1_buf *pbe_params, int mode,\n                 const unsigned char *pwd,  size_t pwdlen,\n                 const unsigned char *data, size_t datalen,\n                 unsigned char *output )\n{\n    int ret, iterations = 0, keylen = 0;\n    unsigned char *p, *end;\n    mbedtls_asn1_buf kdf_alg_oid, enc_scheme_oid, kdf_alg_params, enc_scheme_params;\n    mbedtls_asn1_buf salt;\n    mbedtls_md_type_t md_type = MBEDTLS_MD_SHA1;\n    unsigned char key[32], iv[32];\n    size_t olen = 0;\n    const mbedtls_md_info_t *md_info;\n    const mbedtls_cipher_info_t *cipher_info;\n    mbedtls_md_context_t md_ctx;\n    mbedtls_cipher_type_t cipher_alg;\n    mbedtls_cipher_context_t cipher_ctx;\n\n    p = pbe_params->p;\n    end = p + pbe_params->len;\n\n    /*\n     *  PBES2-params ::= SEQUENCE {\n     *    keyDerivationFunc AlgorithmIdentifier {{PBES2-KDFs}},\n     *    encryptionScheme AlgorithmIdentifier {{PBES2-Encs}}\n     *  }\n     */\n    if( pbe_params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )\n        return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n\n    if( ( ret = mbedtls_asn1_get_alg( &p, end, &kdf_alg_oid, &kdf_alg_params ) ) != 0 )\n        return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );\n\n    // Only PBKDF2 supported at the moment\n    //\n    if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS5_PBKDF2, &kdf_alg_oid ) != 0 )\n        return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE );\n\n    if( ( ret = pkcs5_parse_pbkdf2_params( &kdf_alg_params,\n                                           &salt, &iterations, &keylen,\n                                           &md_type ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    md_info = mbedtls_md_info_from_type( md_type );\n    if( md_info == NULL )\n        return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE );\n\n    if( ( ret = mbedtls_asn1_get_alg( &p, end, &enc_scheme_oid,\n                              &enc_scheme_params ) ) != 0 )\n    {\n        return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT + ret );\n    }\n\n    if( mbedtls_oid_get_cipher_alg( &enc_scheme_oid, &cipher_alg ) != 0 )\n        return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE );\n\n    cipher_info = mbedtls_cipher_info_from_type( cipher_alg );\n    if( cipher_info == NULL )\n        return( MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE );\n\n    /*\n     * The value of keylen from pkcs5_parse_pbkdf2_params() is ignored\n     * since it is optional and we don't know if it was set or not\n     */\n    keylen = cipher_info->key_bitlen / 8;\n\n    if( enc_scheme_params.tag != MBEDTLS_ASN1_OCTET_STRING ||\n        enc_scheme_params.len != cipher_info->iv_size )\n    {\n        return( MBEDTLS_ERR_PKCS5_INVALID_FORMAT );\n    }\n\n    mbedtls_md_init( &md_ctx );\n    mbedtls_cipher_init( &cipher_ctx );\n\n    memcpy( iv, enc_scheme_params.p, enc_scheme_params.len );\n\n    if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )\n        goto exit;\n\n    if( ( ret = mbedtls_pkcs5_pbkdf2_hmac( &md_ctx, pwd, pwdlen, salt.p, salt.len,\n                                   iterations, keylen, key ) ) != 0 )\n    {\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_cipher_setup( &cipher_ctx, cipher_info ) ) != 0 )\n        goto exit;\n\n    if( ( ret = mbedtls_cipher_setkey( &cipher_ctx, key, 8 * keylen, (mbedtls_operation_t) mode ) ) != 0 )\n        goto exit;\n\n    if( ( ret = mbedtls_cipher_crypt( &cipher_ctx, iv, enc_scheme_params.len,\n                              data, datalen, output, &olen ) ) != 0 )\n        ret = MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH;\n\nexit:\n    mbedtls_md_free( &md_ctx );\n    mbedtls_cipher_free( &cipher_ctx );\n\n    return( ret );\n}\n\nint mbedtls_pkcs5_pbkdf2_hmac( mbedtls_md_context_t *ctx, const unsigned char *password,\n                       size_t plen, const unsigned char *salt, size_t slen,\n                       unsigned int iteration_count,\n                       uint32_t key_length, unsigned char *output )\n{\n    int ret, j;\n    unsigned int i;\n    unsigned char md1[MBEDTLS_MD_MAX_SIZE];\n    unsigned char work[MBEDTLS_MD_MAX_SIZE];\n    unsigned char md_size = mbedtls_md_get_size( ctx->md_info );\n    size_t use_len;\n    unsigned char *out_p = output;\n    unsigned char counter[4];\n\n    memset( counter, 0, 4 );\n    counter[3] = 1;\n\n    if( iteration_count > 0xFFFFFFFF )\n        return( MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA );\n\n    while( key_length )\n    {\n        // U1 ends up in work\n        //\n        if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 )\n            return( ret );\n\n        if( ( ret = mbedtls_md_hmac_update( ctx, salt, slen ) ) != 0 )\n            return( ret );\n\n        if( ( ret = mbedtls_md_hmac_update( ctx, counter, 4 ) ) != 0 )\n            return( ret );\n\n        if( ( ret = mbedtls_md_hmac_finish( ctx, work ) ) != 0 )\n            return( ret );\n\n        memcpy( md1, work, md_size );\n\n        for( i = 1; i < iteration_count; i++ )\n        {\n            // U2 ends up in md1\n            //\n            if( ( ret = mbedtls_md_hmac_starts( ctx, password, plen ) ) != 0 )\n                return( ret );\n\n            if( ( ret = mbedtls_md_hmac_update( ctx, md1, md_size ) ) != 0 )\n                return( ret );\n\n            if( ( ret = mbedtls_md_hmac_finish( ctx, md1 ) ) != 0 )\n                return( ret );\n\n            // U1 xor U2\n            //\n            for( j = 0; j < md_size; j++ )\n                work[j] ^= md1[j];\n        }\n\n        use_len = ( key_length < md_size ) ? key_length : md_size;\n        memcpy( out_p, work, use_len );\n\n        key_length -= (uint32_t) use_len;\n        out_p += use_len;\n\n        for( i = 4; i > 0; i-- )\n            if( ++counter[i - 1] != 0 )\n                break;\n    }\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n\n#if !defined(MBEDTLS_SHA1_C)\nint mbedtls_pkcs5_self_test( int verbose )\n{\n    if( verbose != 0 )\n        mbedtls_printf( \"  PBKDF2 (SHA1): skipped\\n\\n\" );\n\n    return( 0 );\n}\n#else\n\n#define MAX_TESTS   6\n\nstatic const size_t plen[MAX_TESTS] =\n    { 8, 8, 8, 24, 9 };\n\nstatic const unsigned char password[MAX_TESTS][32] =\n{\n    \"password\",\n    \"password\",\n    \"password\",\n    \"passwordPASSWORDpassword\",\n    \"pass\\0word\",\n};\n\nstatic const size_t slen[MAX_TESTS] =\n    { 4, 4, 4, 36, 5 };\n\nstatic const unsigned char salt[MAX_TESTS][40] =\n{\n    \"salt\",\n    \"salt\",\n    \"salt\",\n    \"saltSALTsaltSALTsaltSALTsaltSALTsalt\",\n    \"sa\\0lt\",\n};\n\nstatic const uint32_t it_cnt[MAX_TESTS] =\n    { 1, 2, 4096, 4096, 4096 };\n\nstatic const uint32_t key_len[MAX_TESTS] =\n    { 20, 20, 20, 25, 16 };\n\nstatic const unsigned char result_key[MAX_TESTS][32] =\n{\n    { 0x0c, 0x60, 0xc8, 0x0f, 0x96, 0x1f, 0x0e, 0x71,\n      0xf3, 0xa9, 0xb5, 0x24, 0xaf, 0x60, 0x12, 0x06,\n      0x2f, 0xe0, 0x37, 0xa6 },\n    { 0xea, 0x6c, 0x01, 0x4d, 0xc7, 0x2d, 0x6f, 0x8c,\n      0xcd, 0x1e, 0xd9, 0x2a, 0xce, 0x1d, 0x41, 0xf0,\n      0xd8, 0xde, 0x89, 0x57 },\n    { 0x4b, 0x00, 0x79, 0x01, 0xb7, 0x65, 0x48, 0x9a,\n      0xbe, 0xad, 0x49, 0xd9, 0x26, 0xf7, 0x21, 0xd0,\n      0x65, 0xa4, 0x29, 0xc1 },\n    { 0x3d, 0x2e, 0xec, 0x4f, 0xe4, 0x1c, 0x84, 0x9b,\n      0x80, 0xc8, 0xd8, 0x36, 0x62, 0xc0, 0xe4, 0x4a,\n      0x8b, 0x29, 0x1a, 0x96, 0x4c, 0xf2, 0xf0, 0x70,\n      0x38 },\n    { 0x56, 0xfa, 0x6a, 0xa7, 0x55, 0x48, 0x09, 0x9d,\n      0xcc, 0x37, 0xd7, 0xf0, 0x34, 0x25, 0xe0, 0xc3 },\n};\n\nint mbedtls_pkcs5_self_test( int verbose )\n{\n    mbedtls_md_context_t sha1_ctx;\n    const mbedtls_md_info_t *info_sha1;\n    int ret, i;\n    unsigned char key[64];\n\n    mbedtls_md_init( &sha1_ctx );\n\n    info_sha1 = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 );\n    if( info_sha1 == NULL )\n    {\n        ret = 1;\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_md_setup( &sha1_ctx, info_sha1, 1 ) ) != 0 )\n    {\n        ret = 1;\n        goto exit;\n    }\n\n    for( i = 0; i < MAX_TESTS; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  PBKDF2 (SHA1) #%d: \", i );\n\n        ret = mbedtls_pkcs5_pbkdf2_hmac( &sha1_ctx, password[i], plen[i], salt[i],\n                                  slen[i], it_cnt[i], key_len[i], key );\n        if( ret != 0 ||\n            memcmp( result_key[i], key, key_len[i] ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            ret = 1;\n            goto exit;\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\nexit:\n    mbedtls_md_free( &sha1_ctx );\n\n    return( ret );\n}\n#endif /* MBEDTLS_SHA1_C */\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_PKCS5_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/pkparse.c",
    "content": "/*\n *  Public Key layer for parsing key files and structures\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PK_PARSE_C)\n\n#include \"mbedtls/pk.h\"\n#include \"mbedtls/asn1.h\"\n#include \"mbedtls/oid.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_RSA_C)\n#include \"mbedtls/rsa.h\"\n#endif\n#if defined(MBEDTLS_ECP_C)\n#include \"mbedtls/ecp.h\"\n#endif\n#if defined(MBEDTLS_ECDSA_C)\n#include \"mbedtls/ecdsa.h\"\n#endif\n#if defined(MBEDTLS_PEM_PARSE_C)\n#include \"mbedtls/pem.h\"\n#endif\n#if defined(MBEDTLS_PKCS5_C)\n#include \"mbedtls/pkcs5.h\"\n#endif\n#if defined(MBEDTLS_PKCS12_C)\n#include \"mbedtls/pkcs12.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n#if defined(MBEDTLS_FS_IO)\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * Load all data from a file into a given buffer.\n *\n * The file is expected to contain either PEM or DER encoded data.\n * A terminating null byte is always appended. It is included in the announced\n * length only if the data looks like it is PEM encoded.\n */\nint mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n )\n{\n    FILE *f;\n    long size;\n\n    if( ( f = fopen( path, \"rb\" ) ) == NULL )\n        return( MBEDTLS_ERR_PK_FILE_IO_ERROR );\n\n    fseek( f, 0, SEEK_END );\n    if( ( size = ftell( f ) ) == -1 )\n    {\n        fclose( f );\n        return( MBEDTLS_ERR_PK_FILE_IO_ERROR );\n    }\n    fseek( f, 0, SEEK_SET );\n\n    *n = (size_t) size;\n\n    if( *n + 1 == 0 ||\n        ( *buf = mbedtls_calloc( 1, *n + 1 ) ) == NULL )\n    {\n        fclose( f );\n        return( MBEDTLS_ERR_PK_ALLOC_FAILED );\n    }\n\n    if( fread( *buf, 1, *n, f ) != *n )\n    {\n        fclose( f );\n        mbedtls_free( *buf );\n        return( MBEDTLS_ERR_PK_FILE_IO_ERROR );\n    }\n\n    fclose( f );\n\n    (*buf)[*n] = '\\0';\n\n    if( strstr( (const char *) *buf, \"-----BEGIN \" ) != NULL )\n        ++*n;\n\n    return( 0 );\n}\n\n/*\n * Load and parse a private key\n */\nint mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx,\n                      const char *path, const char *pwd )\n{\n    int ret;\n    size_t n;\n    unsigned char *buf;\n\n    if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 )\n        return( ret );\n\n    if( pwd == NULL )\n        ret = mbedtls_pk_parse_key( ctx, buf, n, NULL, 0 );\n    else\n        ret = mbedtls_pk_parse_key( ctx, buf, n,\n                (const unsigned char *) pwd, strlen( pwd ) );\n\n    mbedtls_zeroize( buf, n );\n    mbedtls_free( buf );\n\n    return( ret );\n}\n\n/*\n * Load and parse a public key\n */\nint mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path )\n{\n    int ret;\n    size_t n;\n    unsigned char *buf;\n\n    if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 )\n        return( ret );\n\n    ret = mbedtls_pk_parse_public_key( ctx, buf, n );\n\n    mbedtls_zeroize( buf, n );\n    mbedtls_free( buf );\n\n    return( ret );\n}\n#endif /* MBEDTLS_FS_IO */\n\n#if defined(MBEDTLS_ECP_C)\n/* Minimally parse an ECParameters buffer to and mbedtls_asn1_buf\n *\n * ECParameters ::= CHOICE {\n *   namedCurve         OBJECT IDENTIFIER\n *   specifiedCurve     SpecifiedECDomain -- = SEQUENCE { ... }\n *   -- implicitCurve   NULL\n * }\n */\nstatic int pk_get_ecparams( unsigned char **p, const unsigned char *end,\n                            mbedtls_asn1_buf *params )\n{\n    int ret;\n\n    /* Tag may be either OID or SEQUENCE */\n    params->tag = **p;\n    if( params->tag != MBEDTLS_ASN1_OID\n#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED)\n            && params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE )\n#endif\n            )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n    }\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &params->len, params->tag ) ) != 0 )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    params->p = *p;\n    *p += params->len;\n\n    if( *p != end )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED)\n/*\n * Parse a SpecifiedECDomain (SEC 1 C.2) and (mostly) fill the group with it.\n * WARNING: the resulting group should only be used with\n * pk_group_id_from_specified(), since its base point may not be set correctly\n * if it was encoded compressed.\n *\n *  SpecifiedECDomain ::= SEQUENCE {\n *      version SpecifiedECDomainVersion(ecdpVer1 | ecdpVer2 | ecdpVer3, ...),\n *      fieldID FieldID {{FieldTypes}},\n *      curve Curve,\n *      base ECPoint,\n *      order INTEGER,\n *      cofactor INTEGER OPTIONAL,\n *      hash HashAlgorithm OPTIONAL,\n *      ...\n *  }\n *\n * We only support prime-field as field type, and ignore hash and cofactor.\n */\nstatic int pk_group_from_specified( const mbedtls_asn1_buf *params, mbedtls_ecp_group *grp )\n{\n    int ret;\n    unsigned char *p = params->p;\n    const unsigned char * const end = params->p + params->len;\n    const unsigned char *end_field, *end_curve;\n    size_t len;\n    int ver;\n\n    /* SpecifiedECDomainVersion ::= INTEGER { 1, 2, 3 } */\n    if( ( ret = mbedtls_asn1_get_int( &p, end, &ver ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    if( ver < 1 || ver > 3 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );\n\n    /*\n     * FieldID { FIELD-ID:IOSet } ::= SEQUENCE { -- Finite field\n     *       fieldType FIELD-ID.&id({IOSet}),\n     *       parameters FIELD-ID.&Type({IOSet}{@fieldType})\n     * }\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( ret );\n\n    end_field = p + len;\n\n    /*\n     * FIELD-ID ::= TYPE-IDENTIFIER\n     * FieldTypes FIELD-ID ::= {\n     *       { Prime-p IDENTIFIED BY prime-field } |\n     *       { Characteristic-two IDENTIFIED BY characteristic-two-field }\n     * }\n     * prime-field OBJECT IDENTIFIER ::= { id-fieldType 1 }\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end_field, &len, MBEDTLS_ASN1_OID ) ) != 0 )\n        return( ret );\n\n    if( len != MBEDTLS_OID_SIZE( MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD ) ||\n        memcmp( p, MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD, len ) != 0 )\n    {\n        return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );\n    }\n\n    p += len;\n\n    /* Prime-p ::= INTEGER -- Field of size p. */\n    if( ( ret = mbedtls_asn1_get_mpi( &p, end_field, &grp->P ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    grp->pbits = mbedtls_mpi_bitlen( &grp->P );\n\n    if( p != end_field )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    /*\n     * Curve ::= SEQUENCE {\n     *       a FieldElement,\n     *       b FieldElement,\n     *       seed BIT STRING OPTIONAL\n     *       -- Shall be present if used in SpecifiedECDomain\n     *       -- with version equal to ecdpVer2 or ecdpVer3\n     * }\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( ret );\n\n    end_curve = p + len;\n\n    /*\n     * FieldElement ::= OCTET STRING\n     * containing an integer in the case of a prime field\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_binary( &grp->A, p, len ) ) != 0 )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    p += len;\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_binary( &grp->B, p, len ) ) != 0 )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    p += len;\n\n    /* Ignore seed BIT STRING OPTIONAL */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end_curve, &len, MBEDTLS_ASN1_BIT_STRING ) ) == 0 )\n        p += len;\n\n    if( p != end_curve )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    /*\n     * ECPoint ::= OCTET STRING\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    if( ( ret = mbedtls_ecp_point_read_binary( grp, &grp->G,\n                                      ( const unsigned char *) p, len ) ) != 0 )\n    {\n        /*\n         * If we can't read the point because it's compressed, cheat by\n         * reading only the X coordinate and the parity bit of Y.\n         */\n        if( ret != MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE ||\n            ( p[0] != 0x02 && p[0] != 0x03 ) ||\n            len != mbedtls_mpi_size( &grp->P ) + 1 ||\n            mbedtls_mpi_read_binary( &grp->G.X, p + 1, len - 1 ) != 0 ||\n            mbedtls_mpi_lset( &grp->G.Y, p[0] - 2 ) != 0 ||\n            mbedtls_mpi_lset( &grp->G.Z, 1 ) != 0 )\n        {\n            return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );\n        }\n    }\n\n    p += len;\n\n    /*\n     * order INTEGER\n     */\n    if( ( ret = mbedtls_asn1_get_mpi( &p, end, &grp->N ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    grp->nbits = mbedtls_mpi_bitlen( &grp->N );\n\n    /*\n     * Allow optional elements by purposefully not enforcing p == end here.\n     */\n\n    return( 0 );\n}\n\n/*\n * Find the group id associated with an (almost filled) group as generated by\n * pk_group_from_specified(), or return an error if unknown.\n */\nstatic int pk_group_id_from_group( const mbedtls_ecp_group *grp, mbedtls_ecp_group_id *grp_id )\n{\n    int ret = 0;\n    mbedtls_ecp_group ref;\n    const mbedtls_ecp_group_id *id;\n\n    mbedtls_ecp_group_init( &ref );\n\n    for( id = mbedtls_ecp_grp_id_list(); *id != MBEDTLS_ECP_DP_NONE; id++ )\n    {\n        /* Load the group associated to that id */\n        mbedtls_ecp_group_free( &ref );\n        MBEDTLS_MPI_CHK( mbedtls_ecp_group_load( &ref, *id ) );\n\n        /* Compare to the group we were given, starting with easy tests */\n        if( grp->pbits == ref.pbits && grp->nbits == ref.nbits &&\n            mbedtls_mpi_cmp_mpi( &grp->P, &ref.P ) == 0 &&\n            mbedtls_mpi_cmp_mpi( &grp->A, &ref.A ) == 0 &&\n            mbedtls_mpi_cmp_mpi( &grp->B, &ref.B ) == 0 &&\n            mbedtls_mpi_cmp_mpi( &grp->N, &ref.N ) == 0 &&\n            mbedtls_mpi_cmp_mpi( &grp->G.X, &ref.G.X ) == 0 &&\n            mbedtls_mpi_cmp_mpi( &grp->G.Z, &ref.G.Z ) == 0 &&\n            /* For Y we may only know the parity bit, so compare only that */\n            mbedtls_mpi_get_bit( &grp->G.Y, 0 ) == mbedtls_mpi_get_bit( &ref.G.Y, 0 ) )\n        {\n            break;\n        }\n\n    }\n\ncleanup:\n    mbedtls_ecp_group_free( &ref );\n\n    *grp_id = *id;\n\n    if( ret == 0 && *id == MBEDTLS_ECP_DP_NONE )\n        ret = MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE;\n\n    return( ret );\n}\n\n/*\n * Parse a SpecifiedECDomain (SEC 1 C.2) and find the associated group ID\n */\nstatic int pk_group_id_from_specified( const mbedtls_asn1_buf *params,\n                                       mbedtls_ecp_group_id *grp_id )\n{\n    int ret;\n    mbedtls_ecp_group grp;\n\n    mbedtls_ecp_group_init( &grp );\n\n    if( ( ret = pk_group_from_specified( params, &grp ) ) != 0 )\n        goto cleanup;\n\n    ret = pk_group_id_from_group( &grp, grp_id );\n\ncleanup:\n    mbedtls_ecp_group_free( &grp );\n\n    return( ret );\n}\n#endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */\n\n/*\n * Use EC parameters to initialise an EC group\n *\n * ECParameters ::= CHOICE {\n *   namedCurve         OBJECT IDENTIFIER\n *   specifiedCurve     SpecifiedECDomain -- = SEQUENCE { ... }\n *   -- implicitCurve   NULL\n */\nstatic int pk_use_ecparams( const mbedtls_asn1_buf *params, mbedtls_ecp_group *grp )\n{\n    int ret;\n    mbedtls_ecp_group_id grp_id;\n\n    if( params->tag == MBEDTLS_ASN1_OID )\n    {\n        if( mbedtls_oid_get_ec_grp( params, &grp_id ) != 0 )\n            return( MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE );\n    }\n    else\n    {\n#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED)\n        if( ( ret = pk_group_id_from_specified( params, &grp_id ) ) != 0 )\n            return( ret );\n#else\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );\n#endif\n    }\n\n    /*\n     * grp may already be initilialized; if so, make sure IDs match\n     */\n    if( grp->id != MBEDTLS_ECP_DP_NONE && grp->id != grp_id )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );\n\n    if( ( ret = mbedtls_ecp_group_load( grp, grp_id ) ) != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\n/*\n * EC public key is an EC point\n *\n * The caller is responsible for clearing the structure upon failure if\n * desired. Take care to pass along the possible ECP_FEATURE_UNAVAILABLE\n * return code of mbedtls_ecp_point_read_binary() and leave p in a usable state.\n */\nstatic int pk_get_ecpubkey( unsigned char **p, const unsigned char *end,\n                            mbedtls_ecp_keypair *key )\n{\n    int ret;\n\n    if( ( ret = mbedtls_ecp_point_read_binary( &key->grp, &key->Q,\n                    (const unsigned char *) *p, end - *p ) ) == 0 )\n    {\n        ret = mbedtls_ecp_check_pubkey( &key->grp, &key->Q );\n    }\n\n    /*\n     * We know mbedtls_ecp_point_read_binary consumed all bytes or failed\n     */\n    *p = (unsigned char *) end;\n\n    return( ret );\n}\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_RSA_C)\n/*\n *  RSAPublicKey ::= SEQUENCE {\n *      modulus           INTEGER,  -- n\n *      publicExponent    INTEGER   -- e\n *  }\n */\nstatic int pk_get_rsapubkey( unsigned char **p,\n                             const unsigned char *end,\n                             mbedtls_rsa_context *rsa )\n{\n    int ret;\n    size_t len;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret );\n\n    if( *p + len != end )\n        return( MBEDTLS_ERR_PK_INVALID_PUBKEY +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    if( ( ret = mbedtls_asn1_get_mpi( p, end, &rsa->N ) ) != 0 ||\n        ( ret = mbedtls_asn1_get_mpi( p, end, &rsa->E ) ) != 0 )\n        return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret );\n\n    if( *p != end )\n        return( MBEDTLS_ERR_PK_INVALID_PUBKEY +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    if( ( ret = mbedtls_rsa_check_pubkey( rsa ) ) != 0 )\n        return( MBEDTLS_ERR_PK_INVALID_PUBKEY );\n\n    rsa->len = mbedtls_mpi_size( &rsa->N );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_RSA_C */\n\n/* Get a PK algorithm identifier\n *\n *  AlgorithmIdentifier  ::=  SEQUENCE  {\n *       algorithm               OBJECT IDENTIFIER,\n *       parameters              ANY DEFINED BY algorithm OPTIONAL  }\n */\nstatic int pk_get_pk_alg( unsigned char **p,\n                          const unsigned char *end,\n                          mbedtls_pk_type_t *pk_alg, mbedtls_asn1_buf *params )\n{\n    int ret;\n    mbedtls_asn1_buf alg_oid;\n\n    memset( params, 0, sizeof(mbedtls_asn1_buf) );\n\n    if( ( ret = mbedtls_asn1_get_alg( p, end, &alg_oid, params ) ) != 0 )\n        return( MBEDTLS_ERR_PK_INVALID_ALG + ret );\n\n    if( mbedtls_oid_get_pk_alg( &alg_oid, pk_alg ) != 0 )\n        return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );\n\n    /*\n     * No parameters with RSA (only for EC)\n     */\n    if( *pk_alg == MBEDTLS_PK_RSA &&\n            ( ( params->tag != MBEDTLS_ASN1_NULL && params->tag != 0 ) ||\n                params->len != 0 ) )\n    {\n        return( MBEDTLS_ERR_PK_INVALID_ALG );\n    }\n\n    return( 0 );\n}\n\n/*\n *  SubjectPublicKeyInfo  ::=  SEQUENCE  {\n *       algorithm            AlgorithmIdentifier,\n *       subjectPublicKey     BIT STRING }\n */\nint mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end,\n                        mbedtls_pk_context *pk )\n{\n    int ret;\n    size_t len;\n    mbedtls_asn1_buf alg_params;\n    mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;\n    const mbedtls_pk_info_t *pk_info;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n                    MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    end = *p + len;\n\n    if( ( ret = pk_get_pk_alg( p, end, &pk_alg, &alg_params ) ) != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_asn1_get_bitstring_null( p, end, &len ) ) != 0 )\n        return( MBEDTLS_ERR_PK_INVALID_PUBKEY + ret );\n\n    if( *p + len != end )\n        return( MBEDTLS_ERR_PK_INVALID_PUBKEY +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    if( ( pk_info = mbedtls_pk_info_from_type( pk_alg ) ) == NULL )\n        return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );\n\n    if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 )\n        return( ret );\n\n#if defined(MBEDTLS_RSA_C)\n    if( pk_alg == MBEDTLS_PK_RSA )\n    {\n        ret = pk_get_rsapubkey( p, end, mbedtls_pk_rsa( *pk ) );\n    } else\n#endif /* MBEDTLS_RSA_C */\n#if defined(MBEDTLS_ECP_C)\n    if( pk_alg == MBEDTLS_PK_ECKEY_DH || pk_alg == MBEDTLS_PK_ECKEY )\n    {\n        ret = pk_use_ecparams( &alg_params, &mbedtls_pk_ec( *pk )->grp );\n        if( ret == 0 )\n            ret = pk_get_ecpubkey( p, end, mbedtls_pk_ec( *pk ) );\n    } else\n#endif /* MBEDTLS_ECP_C */\n        ret = MBEDTLS_ERR_PK_UNKNOWN_PK_ALG;\n\n    if( ret == 0 && *p != end )\n        ret = MBEDTLS_ERR_PK_INVALID_PUBKEY\n              MBEDTLS_ERR_ASN1_LENGTH_MISMATCH;\n\n    if( ret != 0 )\n        mbedtls_pk_free( pk );\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_RSA_C)\n/*\n * Parse a PKCS#1 encoded private RSA key\n */\nstatic int pk_parse_key_pkcs1_der( mbedtls_rsa_context *rsa,\n                                   const unsigned char *key,\n                                   size_t keylen )\n{\n    int ret;\n    size_t len;\n    unsigned char *p, *end;\n\n    p = (unsigned char *) key;\n    end = p + keylen;\n\n    /*\n     * This function parses the RSAPrivateKey (PKCS#1)\n     *\n     *  RSAPrivateKey ::= SEQUENCE {\n     *      version           Version,\n     *      modulus           INTEGER,  -- n\n     *      publicExponent    INTEGER,  -- e\n     *      privateExponent   INTEGER,  -- d\n     *      prime1            INTEGER,  -- p\n     *      prime2            INTEGER,  -- q\n     *      exponent1         INTEGER,  -- d mod (p-1)\n     *      exponent2         INTEGER,  -- d mod (q-1)\n     *      coefficient       INTEGER,  -- (inverse of q) mod p\n     *      otherPrimeInfos   OtherPrimeInfos OPTIONAL\n     *  }\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    end = p + len;\n\n    if( ( ret = mbedtls_asn1_get_int( &p, end, &rsa->ver ) ) != 0 )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    if( rsa->ver != 0 )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION );\n    }\n\n    if( ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->N  ) ) != 0 ||\n        ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->E  ) ) != 0 ||\n        ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->D  ) ) != 0 ||\n        ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->P  ) ) != 0 ||\n        ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->Q  ) ) != 0 ||\n        ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->DP ) ) != 0 ||\n        ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->DQ ) ) != 0 ||\n        ( ret = mbedtls_asn1_get_mpi( &p, end, &rsa->QP ) ) != 0 )\n    {\n        mbedtls_rsa_free( rsa );\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    rsa->len = mbedtls_mpi_size( &rsa->N );\n\n    if( p != end )\n    {\n        mbedtls_rsa_free( rsa );\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n\n    if( ( ret = mbedtls_rsa_check_privkey( rsa ) ) != 0 )\n    {\n        mbedtls_rsa_free( rsa );\n        return( ret );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_RSA_C */\n\n#if defined(MBEDTLS_ECP_C)\n/*\n * Parse a SEC1 encoded private EC key\n */\nstatic int pk_parse_key_sec1_der( mbedtls_ecp_keypair *eck,\n                                  const unsigned char *key,\n                                  size_t keylen )\n{\n    int ret;\n    int version, pubkey_done;\n    size_t len;\n    mbedtls_asn1_buf params;\n    unsigned char *p = (unsigned char *) key;\n    unsigned char *end = p + keylen;\n    unsigned char *end2;\n\n    /*\n     * RFC 5915, or SEC1 Appendix C.4\n     *\n     * ECPrivateKey ::= SEQUENCE {\n     *      version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),\n     *      privateKey     OCTET STRING,\n     *      parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,\n     *      publicKey  [1] BIT STRING OPTIONAL\n     *    }\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    end = p + len;\n\n    if( ( ret = mbedtls_asn1_get_int( &p, end, &version ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    if( version != 1 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION );\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    if( ( ret = mbedtls_mpi_read_binary( &eck->d, p, len ) ) != 0 )\n    {\n        mbedtls_ecp_keypair_free( eck );\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    p += len;\n\n    pubkey_done = 0;\n    if( p != end )\n    {\n        /*\n         * Is 'parameters' present?\n         */\n        if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n                        MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) == 0 )\n        {\n            if( ( ret = pk_get_ecparams( &p, p + len, &params) ) != 0 ||\n                ( ret = pk_use_ecparams( &params, &eck->grp )  ) != 0 )\n            {\n                mbedtls_ecp_keypair_free( eck );\n                return( ret );\n            }\n        }\n        else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n        {\n            mbedtls_ecp_keypair_free( eck );\n            return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n        }\n\n        /*\n         * Is 'publickey' present? If not, or if we can't read it (eg because it\n         * is compressed), create it from the private key.\n         */\n        if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n                        MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ) == 0 )\n        {\n            end2 = p + len;\n\n            if( ( ret = mbedtls_asn1_get_bitstring_null( &p, end2, &len ) ) != 0 )\n                return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n            if( p + len != end2 )\n                return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +\n                        MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n            if( ( ret = pk_get_ecpubkey( &p, end2, eck ) ) == 0 )\n                pubkey_done = 1;\n            else\n            {\n                /*\n                 * The only acceptable failure mode of pk_get_ecpubkey() above\n                 * is if the point format is not recognized.\n                 */\n                if( ret != MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE )\n                    return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );\n            }\n        }\n        else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n        {\n            mbedtls_ecp_keypair_free( eck );\n            return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n        }\n    }\n\n    if( ! pubkey_done &&\n        ( ret = mbedtls_ecp_mul( &eck->grp, &eck->Q, &eck->d, &eck->grp.G,\n                                                      NULL, NULL ) ) != 0 )\n    {\n        mbedtls_ecp_keypair_free( eck );\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    if( ( ret = mbedtls_ecp_check_privkey( &eck->grp, &eck->d ) ) != 0 )\n    {\n        mbedtls_ecp_keypair_free( eck );\n        return( ret );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_ECP_C */\n\n/*\n * Parse an unencrypted PKCS#8 encoded private key\n */\nstatic int pk_parse_key_pkcs8_unencrypted_der(\n                                    mbedtls_pk_context *pk,\n                                    const unsigned char* key,\n                                    size_t keylen )\n{\n    int ret, version;\n    size_t len;\n    mbedtls_asn1_buf params;\n    unsigned char *p = (unsigned char *) key;\n    unsigned char *end = p + keylen;\n    mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;\n    const mbedtls_pk_info_t *pk_info;\n\n    /*\n     * This function parses the PrivatKeyInfo object (PKCS#8 v1.2 = RFC 5208)\n     *\n     *    PrivateKeyInfo ::= SEQUENCE {\n     *      version                   Version,\n     *      privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,\n     *      privateKey                PrivateKey,\n     *      attributes           [0]  IMPLICIT Attributes OPTIONAL }\n     *\n     *    Version ::= INTEGER\n     *    PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier\n     *    PrivateKey ::= OCTET STRING\n     *\n     *  The PrivateKey OCTET STRING is a SEC1 ECPrivateKey\n     */\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    end = p + len;\n\n    if( ( ret = mbedtls_asn1_get_int( &p, end, &version ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    if( version != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_VERSION + ret );\n\n    if( ( ret = pk_get_pk_alg( &p, end, &pk_alg, &params ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    if( len < 1 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    if( ( pk_info = mbedtls_pk_info_from_type( pk_alg ) ) == NULL )\n        return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );\n\n    if( ( ret = mbedtls_pk_setup( pk, pk_info ) ) != 0 )\n        return( ret );\n\n#if defined(MBEDTLS_RSA_C)\n    if( pk_alg == MBEDTLS_PK_RSA )\n    {\n        if( ( ret = pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ), p, len ) ) != 0 )\n        {\n            mbedtls_pk_free( pk );\n            return( ret );\n        }\n    } else\n#endif /* MBEDTLS_RSA_C */\n#if defined(MBEDTLS_ECP_C)\n    if( pk_alg == MBEDTLS_PK_ECKEY || pk_alg == MBEDTLS_PK_ECKEY_DH )\n    {\n        if( ( ret = pk_use_ecparams( &params, &mbedtls_pk_ec( *pk )->grp ) ) != 0 ||\n            ( ret = pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ), p, len )  ) != 0 )\n        {\n            mbedtls_pk_free( pk );\n            return( ret );\n        }\n    } else\n#endif /* MBEDTLS_ECP_C */\n        return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );\n\n    return( 0 );\n}\n\n/*\n * Parse an encrypted PKCS#8 encoded private key\n */\n#if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C)\nstatic int pk_parse_key_pkcs8_encrypted_der(\n                                    mbedtls_pk_context *pk,\n                                    const unsigned char *key, size_t keylen,\n                                    const unsigned char *pwd, size_t pwdlen )\n{\n    int ret, decrypted = 0;\n    size_t len;\n    unsigned char buf[2048];\n    unsigned char *p, *end;\n    mbedtls_asn1_buf pbe_alg_oid, pbe_params;\n#if defined(MBEDTLS_PKCS12_C)\n    mbedtls_cipher_type_t cipher_alg;\n    mbedtls_md_type_t md_alg;\n#endif\n\n    memset( buf, 0, sizeof( buf ) );\n\n    p = (unsigned char *) key;\n    end = p + keylen;\n\n    if( pwdlen == 0 )\n        return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED );\n\n    /*\n     * This function parses the EncryptedPrivatKeyInfo object (PKCS#8)\n     *\n     *  EncryptedPrivateKeyInfo ::= SEQUENCE {\n     *    encryptionAlgorithm  EncryptionAlgorithmIdentifier,\n     *    encryptedData        EncryptedData\n     *  }\n     *\n     *  EncryptionAlgorithmIdentifier ::= AlgorithmIdentifier\n     *\n     *  EncryptedData ::= OCTET STRING\n     *\n     *  The EncryptedData OCTET STRING is a PKCS#8 PrivateKeyInfo\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n    }\n\n    end = p + len;\n\n    if( ( ret = mbedtls_asn1_get_alg( &p, end, &pbe_alg_oid, &pbe_params ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )\n        return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT + ret );\n\n    if( len > sizeof( buf ) )\n        return( MBEDTLS_ERR_PK_BAD_INPUT_DATA );\n\n    /*\n     * Decrypt EncryptedData with appropriate PDE\n     */\n#if defined(MBEDTLS_PKCS12_C)\n    if( mbedtls_oid_get_pkcs12_pbe_alg( &pbe_alg_oid, &md_alg, &cipher_alg ) == 0 )\n    {\n        if( ( ret = mbedtls_pkcs12_pbe( &pbe_params, MBEDTLS_PKCS12_PBE_DECRYPT,\n                                cipher_alg, md_alg,\n                                pwd, pwdlen, p, len, buf ) ) != 0 )\n        {\n            if( ret == MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH )\n                return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH );\n\n            return( ret );\n        }\n\n        decrypted = 1;\n    }\n    else if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128, &pbe_alg_oid ) == 0 )\n    {\n        if( ( ret = mbedtls_pkcs12_pbe_sha1_rc4_128( &pbe_params,\n                                             MBEDTLS_PKCS12_PBE_DECRYPT,\n                                             pwd, pwdlen,\n                                             p, len, buf ) ) != 0 )\n        {\n            return( ret );\n        }\n\n        // Best guess for password mismatch when using RC4. If first tag is\n        // not MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE\n        //\n        if( *buf != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )\n            return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH );\n\n        decrypted = 1;\n    }\n    else\n#endif /* MBEDTLS_PKCS12_C */\n#if defined(MBEDTLS_PKCS5_C)\n    if( MBEDTLS_OID_CMP( MBEDTLS_OID_PKCS5_PBES2, &pbe_alg_oid ) == 0 )\n    {\n        if( ( ret = mbedtls_pkcs5_pbes2( &pbe_params, MBEDTLS_PKCS5_DECRYPT, pwd, pwdlen,\n                                  p, len, buf ) ) != 0 )\n        {\n            if( ret == MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH )\n                return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH );\n\n            return( ret );\n        }\n\n        decrypted = 1;\n    }\n    else\n#endif /* MBEDTLS_PKCS5_C */\n    {\n        ((void) pwd);\n    }\n\n    if( decrypted == 0 )\n        return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );\n\n    return( pk_parse_key_pkcs8_unencrypted_der( pk, buf, len ) );\n}\n#endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */\n\n/*\n * Parse a private key\n */\nint mbedtls_pk_parse_key( mbedtls_pk_context *pk,\n                  const unsigned char *key, size_t keylen,\n                  const unsigned char *pwd, size_t pwdlen )\n{\n    int ret;\n    const mbedtls_pk_info_t *pk_info;\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n    size_t len;\n    mbedtls_pem_context pem;\n\n    mbedtls_pem_init( &pem );\n\n#if defined(MBEDTLS_RSA_C)\n    /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */\n    if( keylen == 0 || key[keylen - 1] != '\\0' )\n        ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;\n    else\n        ret = mbedtls_pem_read_buffer( &pem,\n                               \"-----BEGIN RSA PRIVATE KEY-----\",\n                               \"-----END RSA PRIVATE KEY-----\",\n                               key, pwd, pwdlen, &len );\n\n    if( ret == 0 )\n    {\n        if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == NULL )\n            return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );\n\n        if( ( ret = mbedtls_pk_setup( pk, pk_info                    ) ) != 0 ||\n            ( ret = pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ),\n                                            pem.buf, pem.buflen ) ) != 0 )\n        {\n            mbedtls_pk_free( pk );\n        }\n\n        mbedtls_pem_free( &pem );\n        return( ret );\n    }\n    else if( ret == MBEDTLS_ERR_PEM_PASSWORD_MISMATCH )\n        return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH );\n    else if( ret == MBEDTLS_ERR_PEM_PASSWORD_REQUIRED )\n        return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED );\n    else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )\n        return( ret );\n#endif /* MBEDTLS_RSA_C */\n\n#if defined(MBEDTLS_ECP_C)\n    /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */\n    if( keylen == 0 || key[keylen - 1] != '\\0' )\n        ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;\n    else\n        ret = mbedtls_pem_read_buffer( &pem,\n                               \"-----BEGIN EC PRIVATE KEY-----\",\n                               \"-----END EC PRIVATE KEY-----\",\n                               key, pwd, pwdlen, &len );\n    if( ret == 0 )\n    {\n        if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_ECKEY ) ) == NULL )\n            return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );\n\n        if( ( ret = mbedtls_pk_setup( pk, pk_info                   ) ) != 0 ||\n            ( ret = pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ),\n                                           pem.buf, pem.buflen ) ) != 0 )\n        {\n            mbedtls_pk_free( pk );\n        }\n\n        mbedtls_pem_free( &pem );\n        return( ret );\n    }\n    else if( ret == MBEDTLS_ERR_PEM_PASSWORD_MISMATCH )\n        return( MBEDTLS_ERR_PK_PASSWORD_MISMATCH );\n    else if( ret == MBEDTLS_ERR_PEM_PASSWORD_REQUIRED )\n        return( MBEDTLS_ERR_PK_PASSWORD_REQUIRED );\n    else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )\n        return( ret );\n#endif /* MBEDTLS_ECP_C */\n\n    /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */\n    if( keylen == 0 || key[keylen - 1] != '\\0' )\n        ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;\n    else\n        ret = mbedtls_pem_read_buffer( &pem,\n                               \"-----BEGIN PRIVATE KEY-----\",\n                               \"-----END PRIVATE KEY-----\",\n                               key, NULL, 0, &len );\n    if( ret == 0 )\n    {\n        if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk,\n                                                pem.buf, pem.buflen ) ) != 0 )\n        {\n            mbedtls_pk_free( pk );\n        }\n\n        mbedtls_pem_free( &pem );\n        return( ret );\n    }\n    else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )\n        return( ret );\n\n#if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C)\n    /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */\n    if( keylen == 0 || key[keylen - 1] != '\\0' )\n        ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;\n    else\n        ret = mbedtls_pem_read_buffer( &pem,\n                               \"-----BEGIN ENCRYPTED PRIVATE KEY-----\",\n                               \"-----END ENCRYPTED PRIVATE KEY-----\",\n                               key, NULL, 0, &len );\n    if( ret == 0 )\n    {\n        if( ( ret = pk_parse_key_pkcs8_encrypted_der( pk,\n                                                      pem.buf, pem.buflen,\n                                                      pwd, pwdlen ) ) != 0 )\n        {\n            mbedtls_pk_free( pk );\n        }\n\n        mbedtls_pem_free( &pem );\n        return( ret );\n    }\n    else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )\n        return( ret );\n#endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */\n#else\n    ((void) ret);\n    ((void) pwd);\n    ((void) pwdlen);\n#endif /* MBEDTLS_PEM_PARSE_C */\n\n    /*\n     * At this point we only know it's not a PEM formatted key. Could be any\n     * of the known DER encoded private key formats\n     *\n     * We try the different DER format parsers to see if one passes without\n     * error\n     */\n#if defined(MBEDTLS_PKCS12_C) || defined(MBEDTLS_PKCS5_C)\n    if( ( ret = pk_parse_key_pkcs8_encrypted_der( pk, key, keylen,\n                                                  pwd, pwdlen ) ) == 0 )\n    {\n        return( 0 );\n    }\n\n    mbedtls_pk_free( pk );\n\n    if( ret == MBEDTLS_ERR_PK_PASSWORD_MISMATCH )\n    {\n        return( ret );\n    }\n#endif /* MBEDTLS_PKCS12_C || MBEDTLS_PKCS5_C */\n\n    if( ( ret = pk_parse_key_pkcs8_unencrypted_der( pk, key, keylen ) ) == 0 )\n        return( 0 );\n\n    mbedtls_pk_free( pk );\n\n#if defined(MBEDTLS_RSA_C)\n    if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_RSA ) ) == NULL )\n        return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );\n\n    if( ( ret = mbedtls_pk_setup( pk, pk_info                           ) ) != 0 ||\n        ( ret = pk_parse_key_pkcs1_der( mbedtls_pk_rsa( *pk ), key, keylen ) ) == 0 )\n    {\n        return( 0 );\n    }\n\n    mbedtls_pk_free( pk );\n#endif /* MBEDTLS_RSA_C */\n\n#if defined(MBEDTLS_ECP_C)\n    if( ( pk_info = mbedtls_pk_info_from_type( MBEDTLS_PK_ECKEY ) ) == NULL )\n        return( MBEDTLS_ERR_PK_UNKNOWN_PK_ALG );\n\n    if( ( ret = mbedtls_pk_setup( pk, pk_info                         ) ) != 0 ||\n        ( ret = pk_parse_key_sec1_der( mbedtls_pk_ec( *pk ), key, keylen ) ) == 0 )\n    {\n        return( 0 );\n    }\n\n    mbedtls_pk_free( pk );\n#endif /* MBEDTLS_ECP_C */\n\n    return( MBEDTLS_ERR_PK_KEY_INVALID_FORMAT );\n}\n\n/*\n * Parse a public key\n */\nint mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx,\n                         const unsigned char *key, size_t keylen )\n{\n    int ret;\n    unsigned char *p;\n#if defined(MBEDTLS_PEM_PARSE_C)\n    size_t len;\n    mbedtls_pem_context pem;\n\n    mbedtls_pem_init( &pem );\n\n    /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */\n    if( keylen == 0 || key[keylen - 1] != '\\0' )\n        ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;\n    else\n        ret = mbedtls_pem_read_buffer( &pem,\n                \"-----BEGIN PUBLIC KEY-----\",\n                \"-----END PUBLIC KEY-----\",\n                key, NULL, 0, &len );\n\n    if( ret == 0 )\n    {\n        /*\n         * Was PEM encoded\n         */\n        key = pem.buf;\n        keylen = pem.buflen;\n    }\n    else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )\n    {\n        mbedtls_pem_free( &pem );\n        return( ret );\n    }\n#endif /* MBEDTLS_PEM_PARSE_C */\n    p = (unsigned char *) key;\n\n    ret = mbedtls_pk_parse_subpubkey( &p, p + keylen, ctx );\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n    mbedtls_pem_free( &pem );\n#endif\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_PK_PARSE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/pkwrite.c",
    "content": "/*\n *  Public Key layer for writing key files and structures\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PK_WRITE_C)\n\n#include \"mbedtls/pk.h\"\n#include \"mbedtls/asn1write.h\"\n#include \"mbedtls/oid.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_RSA_C)\n#include \"mbedtls/rsa.h\"\n#endif\n#if defined(MBEDTLS_ECP_C)\n#include \"mbedtls/ecp.h\"\n#endif\n#if defined(MBEDTLS_ECDSA_C)\n#include \"mbedtls/ecdsa.h\"\n#endif\n#if defined(MBEDTLS_PEM_WRITE_C)\n#include \"mbedtls/pem.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif\n\n#if defined(MBEDTLS_RSA_C)\n/*\n *  RSAPublicKey ::= SEQUENCE {\n *      modulus           INTEGER,  -- n\n *      publicExponent    INTEGER   -- e\n *  }\n */\nstatic int pk_write_rsa_pubkey( unsigned char **p, unsigned char *start,\n                                  mbedtls_rsa_context *rsa )\n{\n    int ret;\n    size_t len = 0;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( p, start, &rsa->E ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( p, start, &rsa->N ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED |\n                                                 MBEDTLS_ASN1_SEQUENCE ) );\n\n    return( (int) len );\n}\n#endif /* MBEDTLS_RSA_C */\n\n#if defined(MBEDTLS_ECP_C)\n/*\n * EC public key is an EC point\n */\nstatic int pk_write_ec_pubkey( unsigned char **p, unsigned char *start,\n                                 mbedtls_ecp_keypair *ec )\n{\n    int ret;\n    size_t len = 0;\n    unsigned char buf[MBEDTLS_ECP_MAX_PT_LEN];\n\n    if( ( ret = mbedtls_ecp_point_write_binary( &ec->grp, &ec->Q,\n                                        MBEDTLS_ECP_PF_UNCOMPRESSED,\n                                        &len, buf, sizeof( buf ) ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( *p < start || (size_t)( *p - start ) < len )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    *p -= len;\n    memcpy( *p, buf, len );\n\n    return( (int) len );\n}\n\n/*\n * ECParameters ::= CHOICE {\n *   namedCurve         OBJECT IDENTIFIER\n * }\n */\nstatic int pk_write_ec_param( unsigned char **p, unsigned char *start,\n                                mbedtls_ecp_keypair *ec )\n{\n    int ret;\n    size_t len = 0;\n    const char *oid;\n    size_t oid_len;\n\n    if( ( ret = mbedtls_oid_get_oid_by_ec_grp( ec->grp.id, &oid, &oid_len ) ) != 0 )\n        return( ret );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) );\n\n    return( (int) len );\n}\n#endif /* MBEDTLS_ECP_C */\n\nint mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start,\n                     const mbedtls_pk_context *key )\n{\n    int ret;\n    size_t len = 0;\n\n#if defined(MBEDTLS_RSA_C)\n    if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA )\n        MBEDTLS_ASN1_CHK_ADD( len, pk_write_rsa_pubkey( p, start, mbedtls_pk_rsa( *key ) ) );\n    else\n#endif\n#if defined(MBEDTLS_ECP_C)\n    if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY )\n        MBEDTLS_ASN1_CHK_ADD( len, pk_write_ec_pubkey( p, start, mbedtls_pk_ec( *key ) ) );\n    else\n#endif\n        return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );\n\n    return( (int) len );\n}\n\nint mbedtls_pk_write_pubkey_der( mbedtls_pk_context *key, unsigned char *buf, size_t size )\n{\n    int ret;\n    unsigned char *c;\n    size_t len = 0, par_len = 0, oid_len;\n    const char *oid;\n\n    c = buf + size;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, key ) );\n\n    if( c - buf < 1 )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    /*\n     *  SubjectPublicKeyInfo  ::=  SEQUENCE  {\n     *       algorithm            AlgorithmIdentifier,\n     *       subjectPublicKey     BIT STRING }\n     */\n    *--c = 0;\n    len += 1;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_BIT_STRING ) );\n\n    if( ( ret = mbedtls_oid_get_oid_by_pk_alg( mbedtls_pk_get_type( key ),\n                                       &oid, &oid_len ) ) != 0 )\n    {\n        return( ret );\n    }\n\n#if defined(MBEDTLS_ECP_C)\n    if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY )\n    {\n        MBEDTLS_ASN1_CHK_ADD( par_len, pk_write_ec_param( &c, buf, mbedtls_pk_ec( *key ) ) );\n    }\n#endif\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( &c, buf, oid, oid_len,\n                                                        par_len ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                MBEDTLS_ASN1_SEQUENCE ) );\n\n    return( (int) len );\n}\n\nint mbedtls_pk_write_key_der( mbedtls_pk_context *key, unsigned char *buf, size_t size )\n{\n    int ret;\n    unsigned char *c = buf + size;\n    size_t len = 0;\n\n#if defined(MBEDTLS_RSA_C)\n    if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA )\n    {\n        mbedtls_rsa_context *rsa = mbedtls_pk_rsa( *key );\n\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->QP ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->DQ ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->DP ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->Q ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->P ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->D ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->E ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &rsa->N ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 0 ) );\n\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                    MBEDTLS_ASN1_SEQUENCE ) );\n    }\n    else\n#endif /* MBEDTLS_RSA_C */\n#if defined(MBEDTLS_ECP_C)\n    if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY )\n    {\n        mbedtls_ecp_keypair *ec = mbedtls_pk_ec( *key );\n        size_t pub_len = 0, par_len = 0;\n\n        /*\n         * RFC 5915, or SEC1 Appendix C.4\n         *\n         * ECPrivateKey ::= SEQUENCE {\n         *      version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),\n         *      privateKey     OCTET STRING,\n         *      parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,\n         *      publicKey  [1] BIT STRING OPTIONAL\n         *    }\n         */\n\n        /* publicKey */\n        MBEDTLS_ASN1_CHK_ADD( pub_len, pk_write_ec_pubkey( &c, buf, ec ) );\n\n        if( c - buf < 1 )\n            return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n        *--c = 0;\n        pub_len += 1;\n\n        MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_len( &c, buf, pub_len ) );\n        MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_BIT_STRING ) );\n\n        MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_len( &c, buf, pub_len ) );\n        MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_asn1_write_tag( &c, buf,\n                            MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) );\n        len += pub_len;\n\n        /* parameters */\n        MBEDTLS_ASN1_CHK_ADD( par_len, pk_write_ec_param( &c, buf, ec ) );\n\n        MBEDTLS_ASN1_CHK_ADD( par_len, mbedtls_asn1_write_len( &c, buf, par_len ) );\n        MBEDTLS_ASN1_CHK_ADD( par_len, mbedtls_asn1_write_tag( &c, buf,\n                            MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) );\n        len += par_len;\n\n        /* privateKey: write as MPI then fix tag */\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, buf, &ec->d ) );\n        *c = MBEDTLS_ASN1_OCTET_STRING;\n\n        /* version */\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, 1 ) );\n\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                    MBEDTLS_ASN1_SEQUENCE ) );\n    }\n    else\n#endif /* MBEDTLS_ECP_C */\n        return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );\n\n    return( (int) len );\n}\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n\n#define PEM_BEGIN_PUBLIC_KEY    \"-----BEGIN PUBLIC KEY-----\\n\"\n#define PEM_END_PUBLIC_KEY      \"-----END PUBLIC KEY-----\\n\"\n\n#define PEM_BEGIN_PRIVATE_KEY_RSA   \"-----BEGIN RSA PRIVATE KEY-----\\n\"\n#define PEM_END_PRIVATE_KEY_RSA     \"-----END RSA PRIVATE KEY-----\\n\"\n#define PEM_BEGIN_PRIVATE_KEY_EC    \"-----BEGIN EC PRIVATE KEY-----\\n\"\n#define PEM_END_PRIVATE_KEY_EC      \"-----END EC PRIVATE KEY-----\\n\"\n\n/*\n * Max sizes of key per types. Shown as tag + len (+ content).\n */\n\n#if defined(MBEDTLS_RSA_C)\n/*\n * RSA public keys:\n *  SubjectPublicKeyInfo  ::=  SEQUENCE  {          1 + 3\n *       algorithm            AlgorithmIdentifier,  1 + 1 (sequence)\n *                                                + 1 + 1 + 9 (rsa oid)\n *                                                + 1 + 1 (params null)\n *       subjectPublicKey     BIT STRING }          1 + 3 + (1 + below)\n *  RSAPublicKey ::= SEQUENCE {                     1 + 3\n *      modulus           INTEGER,  -- n            1 + 3 + MPI_MAX + 1\n *      publicExponent    INTEGER   -- e            1 + 3 + MPI_MAX + 1\n *  }\n */\n#define RSA_PUB_DER_MAX_BYTES   38 + 2 * MBEDTLS_MPI_MAX_SIZE\n\n/*\n * RSA private keys:\n *  RSAPrivateKey ::= SEQUENCE {                    1 + 3\n *      version           Version,                  1 + 1 + 1\n *      modulus           INTEGER,                  1 + 3 + MPI_MAX + 1\n *      publicExponent    INTEGER,                  1 + 3 + MPI_MAX + 1\n *      privateExponent   INTEGER,                  1 + 3 + MPI_MAX + 1\n *      prime1            INTEGER,                  1 + 3 + MPI_MAX / 2 + 1\n *      prime2            INTEGER,                  1 + 3 + MPI_MAX / 2 + 1\n *      exponent1         INTEGER,                  1 + 3 + MPI_MAX / 2 + 1\n *      exponent2         INTEGER,                  1 + 3 + MPI_MAX / 2 + 1\n *      coefficient       INTEGER,                  1 + 3 + MPI_MAX / 2 + 1\n *      otherPrimeInfos   OtherPrimeInfos OPTIONAL  0 (not supported)\n *  }\n */\n#define MPI_MAX_SIZE_2          MBEDTLS_MPI_MAX_SIZE / 2 + \\\n                                MBEDTLS_MPI_MAX_SIZE % 2\n#define RSA_PRV_DER_MAX_BYTES   47 + 3 * MBEDTLS_MPI_MAX_SIZE \\\n                                   + 5 * MPI_MAX_SIZE_2\n\n#else /* MBEDTLS_RSA_C */\n\n#define RSA_PUB_DER_MAX_BYTES   0\n#define RSA_PRV_DER_MAX_BYTES   0\n\n#endif /* MBEDTLS_RSA_C */\n\n#if defined(MBEDTLS_ECP_C)\n/*\n * EC public keys:\n *  SubjectPublicKeyInfo  ::=  SEQUENCE  {      1 + 2\n *    algorithm         AlgorithmIdentifier,    1 + 1 (sequence)\n *                                            + 1 + 1 + 7 (ec oid)\n *                                            + 1 + 1 + 9 (namedCurve oid)\n *    subjectPublicKey  BIT STRING              1 + 2 + 1               [1]\n *                                            + 1 (point format)        [1]\n *                                            + 2 * ECP_MAX (coords)    [1]\n *  }\n */\n#define ECP_PUB_DER_MAX_BYTES   30 + 2 * MBEDTLS_ECP_MAX_BYTES\n\n/*\n * EC private keys:\n * ECPrivateKey ::= SEQUENCE {                  1 + 2\n *      version        INTEGER ,                1 + 1 + 1\n *      privateKey     OCTET STRING,            1 + 1 + ECP_MAX\n *      parameters [0] ECParameters OPTIONAL,   1 + 1 + (1 + 1 + 9)\n *      publicKey  [1] BIT STRING OPTIONAL      1 + 2 + [1] above\n *    }\n */\n#define ECP_PRV_DER_MAX_BYTES   29 + 3 * MBEDTLS_ECP_MAX_BYTES\n\n#else /* MBEDTLS_ECP_C */\n\n#define ECP_PUB_DER_MAX_BYTES   0\n#define ECP_PRV_DER_MAX_BYTES   0\n\n#endif /* MBEDTLS_ECP_C */\n\n#define PUB_DER_MAX_BYTES   RSA_PUB_DER_MAX_BYTES > ECP_PUB_DER_MAX_BYTES ? \\\n                            RSA_PUB_DER_MAX_BYTES : ECP_PUB_DER_MAX_BYTES\n#define PRV_DER_MAX_BYTES   RSA_PRV_DER_MAX_BYTES > ECP_PRV_DER_MAX_BYTES ? \\\n                            RSA_PRV_DER_MAX_BYTES : ECP_PRV_DER_MAX_BYTES\n\nint mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *key, unsigned char *buf, size_t size )\n{\n    int ret;\n    unsigned char output_buf[PUB_DER_MAX_BYTES];\n    size_t olen = 0;\n\n    if( ( ret = mbedtls_pk_write_pubkey_der( key, output_buf,\n                                     sizeof(output_buf) ) ) < 0 )\n    {\n        return( ret );\n    }\n\n    if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_PUBLIC_KEY, PEM_END_PUBLIC_KEY,\n                                  output_buf + sizeof(output_buf) - ret,\n                                  ret, buf, size, &olen ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    return( 0 );\n}\n\nint mbedtls_pk_write_key_pem( mbedtls_pk_context *key, unsigned char *buf, size_t size )\n{\n    int ret;\n    unsigned char output_buf[PRV_DER_MAX_BYTES];\n    const char *begin, *end;\n    size_t olen = 0;\n\n    if( ( ret = mbedtls_pk_write_key_der( key, output_buf, sizeof(output_buf) ) ) < 0 )\n        return( ret );\n\n#if defined(MBEDTLS_RSA_C)\n    if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_RSA )\n    {\n        begin = PEM_BEGIN_PRIVATE_KEY_RSA;\n        end = PEM_END_PRIVATE_KEY_RSA;\n    }\n    else\n#endif\n#if defined(MBEDTLS_ECP_C)\n    if( mbedtls_pk_get_type( key ) == MBEDTLS_PK_ECKEY )\n    {\n        begin = PEM_BEGIN_PRIVATE_KEY_EC;\n        end = PEM_END_PRIVATE_KEY_EC;\n    }\n    else\n#endif\n        return( MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE );\n\n    if( ( ret = mbedtls_pem_write_buffer( begin, end,\n                                  output_buf + sizeof(output_buf) - ret,\n                                  ret, buf, size, &olen ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_PEM_WRITE_C */\n\n#endif /* MBEDTLS_PK_WRITE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/platform.c",
    "content": "/*\n *  Platform abstraction layer\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n\n#include \"mbedtls/platform.h\"\n\n#if defined(MBEDTLS_PLATFORM_MEMORY)\n#if !defined(MBEDTLS_PLATFORM_STD_CALLOC)\nstatic void *platform_calloc_uninit( size_t n, size_t size )\n{\n    ((void) n);\n    ((void) size);\n    return( NULL );\n}\n\n#define MBEDTLS_PLATFORM_STD_CALLOC   platform_calloc_uninit\n#endif /* !MBEDTLS_PLATFORM_STD_CALLOC */\n\n#if !defined(MBEDTLS_PLATFORM_STD_FREE)\nstatic void platform_free_uninit( void *ptr )\n{\n    ((void) ptr);\n}\n\n#define MBEDTLS_PLATFORM_STD_FREE     platform_free_uninit\n#endif /* !MBEDTLS_PLATFORM_STD_FREE */\n\nvoid * (*mbedtls_calloc)( size_t, size_t ) = MBEDTLS_PLATFORM_STD_CALLOC;\nvoid (*mbedtls_free)( void * )     = MBEDTLS_PLATFORM_STD_FREE;\n\nint mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ),\n                              void (*free_func)( void * ) )\n{\n    mbedtls_calloc = calloc_func;\n    mbedtls_free = free_func;\n    return( 0 );\n}\n#endif /* MBEDTLS_PLATFORM_MEMORY */\n\n#if defined(_WIN32)\n#include <stdarg.h>\nint mbedtls_platform_win32_snprintf( char *s, size_t n, const char *fmt, ... )\n{\n    int ret;\n    va_list argp;\n\n    /* Avoid calling the invalid parameter handler by checking ourselves */\n    if( s == NULL || n == 0 || fmt == NULL )\n        return( -1 );\n\n    va_start( argp, fmt );\n#if defined(_TRUNCATE)\n    ret = _vsnprintf_s( s, n, _TRUNCATE, fmt, argp );\n#else\n    ret = _vsnprintf( s, n, fmt, argp );\n    if( ret < 0 || (size_t) ret == n )\n    {\n        s[n-1] = '\\0';\n        ret = -1;\n    }\n#endif\n    va_end( argp );\n\n    return( ret );\n}\n#endif\n\n#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT)\n#if !defined(MBEDTLS_PLATFORM_STD_SNPRINTF)\n/*\n * Make dummy function to prevent NULL pointer dereferences\n */\nstatic int platform_snprintf_uninit( char * s, size_t n,\n                                     const char * format, ... )\n{\n    ((void) s);\n    ((void) n);\n    ((void) format);\n    return( 0 );\n}\n\n#define MBEDTLS_PLATFORM_STD_SNPRINTF    platform_snprintf_uninit\n#endif /* !MBEDTLS_PLATFORM_STD_SNPRINTF */\n\nint (*mbedtls_snprintf)( char * s, size_t n,\n                          const char * format,\n                          ... ) = MBEDTLS_PLATFORM_STD_SNPRINTF;\n\nint mbedtls_platform_set_snprintf( int (*snprintf_func)( char * s, size_t n,\n                                                 const char * format,\n                                                 ... ) )\n{\n    mbedtls_snprintf = snprintf_func;\n    return( 0 );\n}\n#endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */\n\n#if defined(MBEDTLS_PLATFORM_PRINTF_ALT)\n#if !defined(MBEDTLS_PLATFORM_STD_PRINTF)\n/*\n * Make dummy function to prevent NULL pointer dereferences\n */\nstatic int platform_printf_uninit( const char *format, ... )\n{\n    ((void) format);\n    return( 0 );\n}\n\n#define MBEDTLS_PLATFORM_STD_PRINTF    platform_printf_uninit\n#endif /* !MBEDTLS_PLATFORM_STD_PRINTF */\n\nint (*mbedtls_printf)( const char *, ... ) = MBEDTLS_PLATFORM_STD_PRINTF;\n\nint mbedtls_platform_set_printf( int (*printf_func)( const char *, ... ) )\n{\n    mbedtls_printf = printf_func;\n    return( 0 );\n}\n#endif /* MBEDTLS_PLATFORM_PRINTF_ALT */\n\n#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT)\n#if !defined(MBEDTLS_PLATFORM_STD_FPRINTF)\n/*\n * Make dummy function to prevent NULL pointer dereferences\n */\nstatic int platform_fprintf_uninit( FILE *stream, const char *format, ... )\n{\n    ((void) stream);\n    ((void) format);\n    return( 0 );\n}\n\n#define MBEDTLS_PLATFORM_STD_FPRINTF   platform_fprintf_uninit\n#endif /* !MBEDTLS_PLATFORM_STD_FPRINTF */\n\nint (*mbedtls_fprintf)( FILE *, const char *, ... ) =\n                                        MBEDTLS_PLATFORM_STD_FPRINTF;\n\nint mbedtls_platform_set_fprintf( int (*fprintf_func)( FILE *, const char *, ... ) )\n{\n    mbedtls_fprintf = fprintf_func;\n    return( 0 );\n}\n#endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */\n\n#if defined(MBEDTLS_PLATFORM_EXIT_ALT)\n#if !defined(MBEDTLS_PLATFORM_STD_EXIT)\n/*\n * Make dummy function to prevent NULL pointer dereferences\n */\nstatic void platform_exit_uninit( int status )\n{\n    ((void) status);\n}\n\n#define MBEDTLS_PLATFORM_STD_EXIT   platform_exit_uninit\n#endif /* !MBEDTLS_PLATFORM_STD_EXIT */\n\nvoid (*mbedtls_exit)( int status ) = MBEDTLS_PLATFORM_STD_EXIT;\n\nint mbedtls_platform_set_exit( void (*exit_func)( int status ) )\n{\n    mbedtls_exit = exit_func;\n    return( 0 );\n}\n#endif /* MBEDTLS_PLATFORM_EXIT_ALT */\n\n#if defined(MBEDTLS_HAVE_TIME)\n\n#if defined(MBEDTLS_PLATFORM_TIME_ALT)\n#if !defined(MBEDTLS_PLATFORM_STD_TIME)\n/*\n * Make dummy function to prevent NULL pointer dereferences\n */\nstatic mbedtls_time_t platform_time_uninit( mbedtls_time_t* timer )\n{\n    ((void) timer);\n    return( 0 );\n}\n\n#define MBEDTLS_PLATFORM_STD_TIME   platform_time_uninit\n#endif /* !MBEDTLS_PLATFORM_STD_TIME */\n\nmbedtls_time_t (*mbedtls_time)( mbedtls_time_t* timer ) = MBEDTLS_PLATFORM_STD_TIME;\n\nint mbedtls_platform_set_time( mbedtls_time_t (*time_func)( mbedtls_time_t* timer ) )\n{\n    mbedtls_time = time_func;\n    return( 0 );\n}\n#endif /* MBEDTLS_PLATFORM_TIME_ALT */\n\n#endif /* MBEDTLS_HAVE_TIME */\n\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\n#if !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) && defined(MBEDTLS_FS_IO)\n/* Default implementations for the platform independent seed functions use\n * standard libc file functions to read from and write to a pre-defined filename\n */\nint mbedtls_platform_std_nv_seed_read( unsigned char *buf, size_t buf_len )\n{\n    FILE *file;\n    size_t n;\n\n    if( ( file = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, \"rb\" ) ) == NULL )\n        return -1;\n\n    if( ( n = fread( buf, 1, buf_len, file ) ) != buf_len )\n    {\n        fclose( file );\n        return -1;\n    }\n\n    fclose( file );\n    return( (int)n );\n}\n\nint mbedtls_platform_std_nv_seed_write( unsigned char *buf, size_t buf_len )\n{\n    FILE *file;\n    size_t n;\n\n    if( ( file = fopen( MBEDTLS_PLATFORM_STD_NV_SEED_FILE, \"w\" ) ) == NULL )\n        return -1;\n\n    if( ( n = fwrite( buf, 1, buf_len, file ) ) != buf_len )\n    {\n        fclose( file );\n        return -1;\n    }\n\n    fclose( file );\n    return( (int)n );\n}\n#endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */\n\n#if defined(MBEDTLS_PLATFORM_NV_SEED_ALT)\n#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_READ)\n/*\n * Make dummy function to prevent NULL pointer dereferences\n */\nstatic int platform_nv_seed_read_uninit( unsigned char *buf, size_t buf_len )\n{\n    ((void) buf);\n    ((void) buf_len);\n    return( -1 );\n}\n\n#define MBEDTLS_PLATFORM_STD_NV_SEED_READ   platform_nv_seed_read_uninit\n#endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_READ */\n\n#if !defined(MBEDTLS_PLATFORM_STD_NV_SEED_WRITE)\n/*\n * Make dummy function to prevent NULL pointer dereferences\n */\nstatic int platform_nv_seed_write_uninit( unsigned char *buf, size_t buf_len )\n{\n    ((void) buf);\n    ((void) buf_len);\n    return( -1 );\n}\n\n#define MBEDTLS_PLATFORM_STD_NV_SEED_WRITE   platform_nv_seed_write_uninit\n#endif /* !MBEDTLS_PLATFORM_STD_NV_SEED_WRITE */\n\nint (*mbedtls_nv_seed_read)( unsigned char *buf, size_t buf_len ) =\n            MBEDTLS_PLATFORM_STD_NV_SEED_READ;\nint (*mbedtls_nv_seed_write)( unsigned char *buf, size_t buf_len ) =\n            MBEDTLS_PLATFORM_STD_NV_SEED_WRITE;\n\nint mbedtls_platform_set_nv_seed(\n        int (*nv_seed_read_func)( unsigned char *buf, size_t buf_len ),\n        int (*nv_seed_write_func)( unsigned char *buf, size_t buf_len ) )\n{\n    mbedtls_nv_seed_read = nv_seed_read_func;\n    mbedtls_nv_seed_write = nv_seed_write_func;\n    return( 0 );\n}\n#endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */\n#endif /* MBEDTLS_ENTROPY_NV_SEED */\n\n#if !defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT)\n/*\n * Placeholder platform setup that does nothing by default\n */\nint mbedtls_platform_setup( mbedtls_platform_context *ctx )\n{\n    (void)ctx;\n\n    return( 0 );\n}\n\n/*\n * Placeholder platform teardown that does nothing by default\n */\nvoid mbedtls_platform_teardown( mbedtls_platform_context *ctx )\n{\n    (void)ctx;\n}\n#endif /* MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */\n\n#endif /* MBEDTLS_PLATFORM_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ripemd160.c",
    "content": "/*\n *  RIPE MD-160 implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n *  The RIPEMD-160 algorithm was designed by RIPE in 1996\n *  http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html\n *  http://ehash.iaik.tugraz.at/wiki/RIPEMD-160\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_RIPEMD160_C)\n\n#include \"mbedtls/ripemd160.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n/*\n * 32-bit integer manipulation macros (little endian)\n */\n#ifndef GET_UINT32_LE\n#define GET_UINT32_LE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint32_t) (b)[(i)    ]       )             \\\n        | ( (uint32_t) (b)[(i) + 1] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 2] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 3] << 24 );            \\\n}\n#endif\n\n#ifndef PUT_UINT32_LE\n#define PUT_UINT32_LE(n,b,i)                                    \\\n{                                                               \\\n    (b)[(i)    ] = (unsigned char) ( ( (n)       ) & 0xFF );    \\\n    (b)[(i) + 1] = (unsigned char) ( ( (n) >>  8 ) & 0xFF );    \\\n    (b)[(i) + 2] = (unsigned char) ( ( (n) >> 16 ) & 0xFF );    \\\n    (b)[(i) + 3] = (unsigned char) ( ( (n) >> 24 ) & 0xFF );    \\\n}\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\nvoid mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_ripemd160_context ) );\n}\n\nvoid mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_ripemd160_context ) );\n}\n\nvoid mbedtls_ripemd160_clone( mbedtls_ripemd160_context *dst,\n                        const mbedtls_ripemd160_context *src )\n{\n    *dst = *src;\n}\n\n/*\n * RIPEMD-160 context setup\n */\nvoid mbedtls_ripemd160_starts( mbedtls_ripemd160_context *ctx )\n{\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n\n    ctx->state[0] = 0x67452301;\n    ctx->state[1] = 0xEFCDAB89;\n    ctx->state[2] = 0x98BADCFE;\n    ctx->state[3] = 0x10325476;\n    ctx->state[4] = 0xC3D2E1F0;\n}\n\n#if !defined(MBEDTLS_RIPEMD160_PROCESS_ALT)\n/*\n * Process one block\n */\nvoid mbedtls_ripemd160_process( mbedtls_ripemd160_context *ctx, const unsigned char data[64] )\n{\n    uint32_t A, B, C, D, E, Ap, Bp, Cp, Dp, Ep, X[16];\n\n    GET_UINT32_LE( X[ 0], data,  0 );\n    GET_UINT32_LE( X[ 1], data,  4 );\n    GET_UINT32_LE( X[ 2], data,  8 );\n    GET_UINT32_LE( X[ 3], data, 12 );\n    GET_UINT32_LE( X[ 4], data, 16 );\n    GET_UINT32_LE( X[ 5], data, 20 );\n    GET_UINT32_LE( X[ 6], data, 24 );\n    GET_UINT32_LE( X[ 7], data, 28 );\n    GET_UINT32_LE( X[ 8], data, 32 );\n    GET_UINT32_LE( X[ 9], data, 36 );\n    GET_UINT32_LE( X[10], data, 40 );\n    GET_UINT32_LE( X[11], data, 44 );\n    GET_UINT32_LE( X[12], data, 48 );\n    GET_UINT32_LE( X[13], data, 52 );\n    GET_UINT32_LE( X[14], data, 56 );\n    GET_UINT32_LE( X[15], data, 60 );\n\n    A = Ap = ctx->state[0];\n    B = Bp = ctx->state[1];\n    C = Cp = ctx->state[2];\n    D = Dp = ctx->state[3];\n    E = Ep = ctx->state[4];\n\n#define F1( x, y, z )   ( x ^ y ^ z )\n#define F2( x, y, z )   ( ( x & y ) | ( ~x & z ) )\n#define F3( x, y, z )   ( ( x | ~y ) ^ z )\n#define F4( x, y, z )   ( ( x & z ) | ( y & ~z ) )\n#define F5( x, y, z )   ( x ^ ( y | ~z ) )\n\n#define S( x, n ) ( ( x << n ) | ( x >> (32 - n) ) )\n\n#define P( a, b, c, d, e, r, s, f, k )      \\\n    a += f( b, c, d ) + X[r] + k;           \\\n    a = S( a, s ) + e;                      \\\n    c = S( c, 10 );\n\n#define P2( a, b, c, d, e, r, s, rp, sp )   \\\n    P( a, b, c, d, e, r, s, F, K );         \\\n    P( a ## p, b ## p, c ## p, d ## p, e ## p, rp, sp, Fp, Kp );\n\n#define F   F1\n#define K   0x00000000\n#define Fp  F5\n#define Kp  0x50A28BE6\n    P2( A, B, C, D, E,  0, 11,  5,  8 );\n    P2( E, A, B, C, D,  1, 14, 14,  9 );\n    P2( D, E, A, B, C,  2, 15,  7,  9 );\n    P2( C, D, E, A, B,  3, 12,  0, 11 );\n    P2( B, C, D, E, A,  4,  5,  9, 13 );\n    P2( A, B, C, D, E,  5,  8,  2, 15 );\n    P2( E, A, B, C, D,  6,  7, 11, 15 );\n    P2( D, E, A, B, C,  7,  9,  4,  5 );\n    P2( C, D, E, A, B,  8, 11, 13,  7 );\n    P2( B, C, D, E, A,  9, 13,  6,  7 );\n    P2( A, B, C, D, E, 10, 14, 15,  8 );\n    P2( E, A, B, C, D, 11, 15,  8, 11 );\n    P2( D, E, A, B, C, 12,  6,  1, 14 );\n    P2( C, D, E, A, B, 13,  7, 10, 14 );\n    P2( B, C, D, E, A, 14,  9,  3, 12 );\n    P2( A, B, C, D, E, 15,  8, 12,  6 );\n#undef F\n#undef K\n#undef Fp\n#undef Kp\n\n#define F   F2\n#define K   0x5A827999\n#define Fp  F4\n#define Kp  0x5C4DD124\n    P2( E, A, B, C, D,  7,  7,  6,  9 );\n    P2( D, E, A, B, C,  4,  6, 11, 13 );\n    P2( C, D, E, A, B, 13,  8,  3, 15 );\n    P2( B, C, D, E, A,  1, 13,  7,  7 );\n    P2( A, B, C, D, E, 10, 11,  0, 12 );\n    P2( E, A, B, C, D,  6,  9, 13,  8 );\n    P2( D, E, A, B, C, 15,  7,  5,  9 );\n    P2( C, D, E, A, B,  3, 15, 10, 11 );\n    P2( B, C, D, E, A, 12,  7, 14,  7 );\n    P2( A, B, C, D, E,  0, 12, 15,  7 );\n    P2( E, A, B, C, D,  9, 15,  8, 12 );\n    P2( D, E, A, B, C,  5,  9, 12,  7 );\n    P2( C, D, E, A, B,  2, 11,  4,  6 );\n    P2( B, C, D, E, A, 14,  7,  9, 15 );\n    P2( A, B, C, D, E, 11, 13,  1, 13 );\n    P2( E, A, B, C, D,  8, 12,  2, 11 );\n#undef F\n#undef K\n#undef Fp\n#undef Kp\n\n#define F   F3\n#define K   0x6ED9EBA1\n#define Fp  F3\n#define Kp  0x6D703EF3\n    P2( D, E, A, B, C,  3, 11, 15,  9 );\n    P2( C, D, E, A, B, 10, 13,  5,  7 );\n    P2( B, C, D, E, A, 14,  6,  1, 15 );\n    P2( A, B, C, D, E,  4,  7,  3, 11 );\n    P2( E, A, B, C, D,  9, 14,  7,  8 );\n    P2( D, E, A, B, C, 15,  9, 14,  6 );\n    P2( C, D, E, A, B,  8, 13,  6,  6 );\n    P2( B, C, D, E, A,  1, 15,  9, 14 );\n    P2( A, B, C, D, E,  2, 14, 11, 12 );\n    P2( E, A, B, C, D,  7,  8,  8, 13 );\n    P2( D, E, A, B, C,  0, 13, 12,  5 );\n    P2( C, D, E, A, B,  6,  6,  2, 14 );\n    P2( B, C, D, E, A, 13,  5, 10, 13 );\n    P2( A, B, C, D, E, 11, 12,  0, 13 );\n    P2( E, A, B, C, D,  5,  7,  4,  7 );\n    P2( D, E, A, B, C, 12,  5, 13,  5 );\n#undef F\n#undef K\n#undef Fp\n#undef Kp\n\n#define F   F4\n#define K   0x8F1BBCDC\n#define Fp  F2\n#define Kp  0x7A6D76E9\n    P2( C, D, E, A, B,  1, 11,  8, 15 );\n    P2( B, C, D, E, A,  9, 12,  6,  5 );\n    P2( A, B, C, D, E, 11, 14,  4,  8 );\n    P2( E, A, B, C, D, 10, 15,  1, 11 );\n    P2( D, E, A, B, C,  0, 14,  3, 14 );\n    P2( C, D, E, A, B,  8, 15, 11, 14 );\n    P2( B, C, D, E, A, 12,  9, 15,  6 );\n    P2( A, B, C, D, E,  4,  8,  0, 14 );\n    P2( E, A, B, C, D, 13,  9,  5,  6 );\n    P2( D, E, A, B, C,  3, 14, 12,  9 );\n    P2( C, D, E, A, B,  7,  5,  2, 12 );\n    P2( B, C, D, E, A, 15,  6, 13,  9 );\n    P2( A, B, C, D, E, 14,  8,  9, 12 );\n    P2( E, A, B, C, D,  5,  6,  7,  5 );\n    P2( D, E, A, B, C,  6,  5, 10, 15 );\n    P2( C, D, E, A, B,  2, 12, 14,  8 );\n#undef F\n#undef K\n#undef Fp\n#undef Kp\n\n#define F   F5\n#define K   0xA953FD4E\n#define Fp  F1\n#define Kp  0x00000000\n    P2( B, C, D, E, A,  4,  9, 12,  8 );\n    P2( A, B, C, D, E,  0, 15, 15,  5 );\n    P2( E, A, B, C, D,  5,  5, 10, 12 );\n    P2( D, E, A, B, C,  9, 11,  4,  9 );\n    P2( C, D, E, A, B,  7,  6,  1, 12 );\n    P2( B, C, D, E, A, 12,  8,  5,  5 );\n    P2( A, B, C, D, E,  2, 13,  8, 14 );\n    P2( E, A, B, C, D, 10, 12,  7,  6 );\n    P2( D, E, A, B, C, 14,  5,  6,  8 );\n    P2( C, D, E, A, B,  1, 12,  2, 13 );\n    P2( B, C, D, E, A,  3, 13, 13,  6 );\n    P2( A, B, C, D, E,  8, 14, 14,  5 );\n    P2( E, A, B, C, D, 11, 11,  0, 15 );\n    P2( D, E, A, B, C,  6,  8,  3, 13 );\n    P2( C, D, E, A, B, 15,  5,  9, 11 );\n    P2( B, C, D, E, A, 13,  6, 11, 11 );\n#undef F\n#undef K\n#undef Fp\n#undef Kp\n\n    C             = ctx->state[1] + C + Dp;\n    ctx->state[1] = ctx->state[2] + D + Ep;\n    ctx->state[2] = ctx->state[3] + E + Ap;\n    ctx->state[3] = ctx->state[4] + A + Bp;\n    ctx->state[4] = ctx->state[0] + B + Cp;\n    ctx->state[0] = C;\n}\n#endif /* !MBEDTLS_RIPEMD160_PROCESS_ALT */\n\n/*\n * RIPEMD-160 process buffer\n */\nvoid mbedtls_ripemd160_update( mbedtls_ripemd160_context *ctx,\n                       const unsigned char *input, size_t ilen )\n{\n    size_t fill;\n    uint32_t left;\n\n    if( ilen == 0 )\n        return;\n\n    left = ctx->total[0] & 0x3F;\n    fill = 64 - left;\n\n    ctx->total[0] += (uint32_t) ilen;\n    ctx->total[0] &= 0xFFFFFFFF;\n\n    if( ctx->total[0] < (uint32_t) ilen )\n        ctx->total[1]++;\n\n    if( left && ilen >= fill )\n    {\n        memcpy( (void *) (ctx->buffer + left), input, fill );\n        mbedtls_ripemd160_process( ctx, ctx->buffer );\n        input += fill;\n        ilen  -= fill;\n        left = 0;\n    }\n\n    while( ilen >= 64 )\n    {\n        mbedtls_ripemd160_process( ctx, input );\n        input += 64;\n        ilen  -= 64;\n    }\n\n    if( ilen > 0 )\n    {\n        memcpy( (void *) (ctx->buffer + left), input, ilen );\n    }\n}\n\nstatic const unsigned char ripemd160_padding[64] =\n{\n 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/*\n * RIPEMD-160 final digest\n */\nvoid mbedtls_ripemd160_finish( mbedtls_ripemd160_context *ctx, unsigned char output[20] )\n{\n    uint32_t last, padn;\n    uint32_t high, low;\n    unsigned char msglen[8];\n\n    high = ( ctx->total[0] >> 29 )\n         | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n\n    PUT_UINT32_LE( low,  msglen, 0 );\n    PUT_UINT32_LE( high, msglen, 4 );\n\n    last = ctx->total[0] & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n\n    mbedtls_ripemd160_update( ctx, ripemd160_padding, padn );\n    mbedtls_ripemd160_update( ctx, msglen, 8 );\n\n    PUT_UINT32_LE( ctx->state[0], output,  0 );\n    PUT_UINT32_LE( ctx->state[1], output,  4 );\n    PUT_UINT32_LE( ctx->state[2], output,  8 );\n    PUT_UINT32_LE( ctx->state[3], output, 12 );\n    PUT_UINT32_LE( ctx->state[4], output, 16 );\n}\n\n/*\n * output = RIPEMD-160( input buffer )\n */\nvoid mbedtls_ripemd160( const unsigned char *input, size_t ilen,\n                unsigned char output[20] )\n{\n    mbedtls_ripemd160_context ctx;\n\n    mbedtls_ripemd160_init( &ctx );\n    mbedtls_ripemd160_starts( &ctx );\n    mbedtls_ripemd160_update( &ctx, input, ilen );\n    mbedtls_ripemd160_finish( &ctx, output );\n    mbedtls_ripemd160_free( &ctx );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n/*\n * Test vectors from the RIPEMD-160 paper and\n * http://homes.esat.kuleuven.be/~bosselae/mbedtls_ripemd160.html#HMAC\n */\n#define TESTS   8\n#define KEYS    2\nstatic const char *ripemd160_test_input[TESTS] =\n{\n    \"\",\n    \"a\",\n    \"abc\",\n    \"message digest\",\n    \"abcdefghijklmnopqrstuvwxyz\",\n    \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\",\n    \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\",\n    \"1234567890123456789012345678901234567890\"\n        \"1234567890123456789012345678901234567890\",\n};\n\nstatic const unsigned char ripemd160_test_md[TESTS][20] =\n{\n    { 0x9c, 0x11, 0x85, 0xa5, 0xc5, 0xe9, 0xfc, 0x54, 0x61, 0x28,\n      0x08, 0x97, 0x7e, 0xe8, 0xf5, 0x48, 0xb2, 0x25, 0x8d, 0x31 },\n    { 0x0b, 0xdc, 0x9d, 0x2d, 0x25, 0x6b, 0x3e, 0xe9, 0xda, 0xae,\n      0x34, 0x7b, 0xe6, 0xf4, 0xdc, 0x83, 0x5a, 0x46, 0x7f, 0xfe },\n    { 0x8e, 0xb2, 0x08, 0xf7, 0xe0, 0x5d, 0x98, 0x7a, 0x9b, 0x04,\n      0x4a, 0x8e, 0x98, 0xc6, 0xb0, 0x87, 0xf1, 0x5a, 0x0b, 0xfc },\n    { 0x5d, 0x06, 0x89, 0xef, 0x49, 0xd2, 0xfa, 0xe5, 0x72, 0xb8,\n      0x81, 0xb1, 0x23, 0xa8, 0x5f, 0xfa, 0x21, 0x59, 0x5f, 0x36 },\n    { 0xf7, 0x1c, 0x27, 0x10, 0x9c, 0x69, 0x2c, 0x1b, 0x56, 0xbb,\n      0xdc, 0xeb, 0x5b, 0x9d, 0x28, 0x65, 0xb3, 0x70, 0x8d, 0xbc },\n    { 0x12, 0xa0, 0x53, 0x38, 0x4a, 0x9c, 0x0c, 0x88, 0xe4, 0x05,\n      0xa0, 0x6c, 0x27, 0xdc, 0xf4, 0x9a, 0xda, 0x62, 0xeb, 0x2b },\n    { 0xb0, 0xe2, 0x0b, 0x6e, 0x31, 0x16, 0x64, 0x02, 0x86, 0xed,\n      0x3a, 0x87, 0xa5, 0x71, 0x30, 0x79, 0xb2, 0x1f, 0x51, 0x89 },\n    { 0x9b, 0x75, 0x2e, 0x45, 0x57, 0x3d, 0x4b, 0x39, 0xf4, 0xdb,\n      0xd3, 0x32, 0x3c, 0xab, 0x82, 0xbf, 0x63, 0x32, 0x6b, 0xfb },\n};\n\n/*\n * Checkup routine\n */\nint mbedtls_ripemd160_self_test( int verbose )\n{\n    int i;\n    unsigned char output[20];\n\n    memset( output, 0, sizeof output );\n\n    for( i = 0; i < TESTS; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  RIPEMD-160 test #%d: \", i + 1 );\n\n        mbedtls_ripemd160( (const unsigned char *) ripemd160_test_input[i],\n                   strlen( ripemd160_test_input[i] ),\n                   output );\n\n        if( memcmp( output, ripemd160_test_md[i], 20 ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            return( 1 );\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_RIPEMD160_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/rsa.c",
    "content": "/*\n *  The RSA public-key cryptosystem\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The following sources were referenced in the design of this implementation\n *  of the RSA algorithm:\n *\n *  [1] A method for obtaining digital signatures and public-key cryptosystems\n *      R Rivest, A Shamir, and L Adleman\n *      http://people.csail.mit.edu/rivest/pubs.html#RSA78\n *\n *  [2] Handbook of Applied Cryptography - 1997, Chapter 8\n *      Menezes, van Oorschot and Vanstone\n *\n *  [3] Malware Guard Extension: Using SGX to Conceal Cache Attacks\n *      Michael Schwarz, Samuel Weiser, Daniel Gruss, Clémentine Maurice and\n *      Stefan Mangard\n *      https://arxiv.org/abs/1702.08719v2\n *\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_RSA_C)\n\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/oid.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_PKCS1_V21)\n#include \"mbedtls/md.h\"\n#endif\n\n#if defined(MBEDTLS_PKCS1_V15) && !defined(__OpenBSD__)\n#include <stdlib.h>\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#define mbedtls_calloc calloc\n#define mbedtls_free   free\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\n/*\n * Initialize an RSA context\n */\nvoid mbedtls_rsa_init( mbedtls_rsa_context *ctx,\n               int padding,\n               int hash_id )\n{\n    memset( ctx, 0, sizeof( mbedtls_rsa_context ) );\n\n    mbedtls_rsa_set_padding( ctx, padding, hash_id );\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_init( &ctx->mutex );\n#endif\n}\n\n/*\n * Set padding for an existing RSA context\n */\nvoid mbedtls_rsa_set_padding( mbedtls_rsa_context *ctx, int padding, int hash_id )\n{\n    ctx->padding = padding;\n    ctx->hash_id = hash_id;\n}\n\n#if defined(MBEDTLS_GENPRIME)\n\n/*\n * Generate an RSA keypair\n */\nint mbedtls_rsa_gen_key( mbedtls_rsa_context *ctx,\n                 int (*f_rng)(void *, unsigned char *, size_t),\n                 void *p_rng,\n                 unsigned int nbits, int exponent )\n{\n    int ret;\n    mbedtls_mpi P1, Q1, H, G;\n\n    if( f_rng == NULL || nbits < 128 || exponent < 3 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    if( nbits % 2 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 );\n    mbedtls_mpi_init( &H ); mbedtls_mpi_init( &G );\n\n    /*\n     * find primes P and Q with Q < P so that:\n     * GCD( E, (P-1)*(Q-1) ) == 1\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &ctx->E, exponent ) );\n\n    do\n    {\n        MBEDTLS_MPI_CHK( mbedtls_mpi_gen_prime( &ctx->P, nbits >> 1, 0,\n                                f_rng, p_rng ) );\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_gen_prime( &ctx->Q, nbits >> 1, 0,\n                                f_rng, p_rng ) );\n\n        if( mbedtls_mpi_cmp_mpi( &ctx->P, &ctx->Q ) == 0 )\n            continue;\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->N, &ctx->P, &ctx->Q ) );\n        if( mbedtls_mpi_bitlen( &ctx->N ) != nbits )\n            continue;\n\n        if( mbedtls_mpi_cmp_mpi( &ctx->P, &ctx->Q ) < 0 )\n                                mbedtls_mpi_swap( &ctx->P, &ctx->Q );\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &P1, &ctx->P, 1 ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &Q1, &ctx->Q, 1 ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &H, &P1, &Q1 ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, &ctx->E, &H  ) );\n    }\n    while( mbedtls_mpi_cmp_int( &G, 1 ) != 0 );\n\n    /*\n     * D  = E^-1 mod ((P-1)*(Q-1))\n     * DP = D mod (P - 1)\n     * DQ = D mod (Q - 1)\n     * QP = Q^-1 mod P\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->D , &ctx->E, &H  ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->DP, &ctx->D, &P1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->DQ, &ctx->D, &Q1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->QP, &ctx->Q, &ctx->P ) );\n\n    ctx->len = ( mbedtls_mpi_bitlen( &ctx->N ) + 7 ) >> 3;\n\ncleanup:\n\n    mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 ); mbedtls_mpi_free( &H ); mbedtls_mpi_free( &G );\n\n    if( ret != 0 )\n    {\n        mbedtls_rsa_free( ctx );\n        return( MBEDTLS_ERR_RSA_KEY_GEN_FAILED + ret );\n    }\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_GENPRIME */\n\n/*\n * Check a public RSA key\n */\nint mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx )\n{\n    if( !ctx->N.p || !ctx->E.p )\n        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );\n\n    if( ( ctx->N.p[0] & 1 ) == 0 ||\n        ( ctx->E.p[0] & 1 ) == 0 )\n        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );\n\n    if( mbedtls_mpi_bitlen( &ctx->N ) < 128 ||\n        mbedtls_mpi_bitlen( &ctx->N ) > MBEDTLS_MPI_MAX_BITS )\n        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );\n\n    if( mbedtls_mpi_bitlen( &ctx->E ) < 2 ||\n        mbedtls_mpi_cmp_mpi( &ctx->E, &ctx->N ) >= 0 )\n        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );\n\n    return( 0 );\n}\n\n/*\n * Check a private RSA key\n */\nint mbedtls_rsa_check_privkey( const mbedtls_rsa_context *ctx )\n{\n    int ret;\n    mbedtls_mpi PQ, DE, P1, Q1, H, I, G, G2, L1, L2, DP, DQ, QP;\n\n    if( ( ret = mbedtls_rsa_check_pubkey( ctx ) ) != 0 )\n        return( ret );\n\n    if( !ctx->P.p || !ctx->Q.p || !ctx->D.p )\n        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );\n\n    mbedtls_mpi_init( &PQ ); mbedtls_mpi_init( &DE ); mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 );\n    mbedtls_mpi_init( &H  ); mbedtls_mpi_init( &I  ); mbedtls_mpi_init( &G  ); mbedtls_mpi_init( &G2 );\n    mbedtls_mpi_init( &L1 ); mbedtls_mpi_init( &L2 ); mbedtls_mpi_init( &DP ); mbedtls_mpi_init( &DQ );\n    mbedtls_mpi_init( &QP );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &PQ, &ctx->P, &ctx->Q ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DE, &ctx->D, &ctx->E ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &P1, &ctx->P, 1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &Q1, &ctx->Q, 1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &H, &P1, &Q1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G, &ctx->E, &H  ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G2, &P1, &Q1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &L1, &L2, &H, &G2 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &I, &DE, &L1  ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &DP, &ctx->D, &P1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &DQ, &ctx->D, &Q1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &QP, &ctx->Q, &ctx->P ) );\n    /*\n     * Check for a valid PKCS1v2 private key\n     */\n    if( mbedtls_mpi_cmp_mpi( &PQ, &ctx->N ) != 0 ||\n        mbedtls_mpi_cmp_mpi( &DP, &ctx->DP ) != 0 ||\n        mbedtls_mpi_cmp_mpi( &DQ, &ctx->DQ ) != 0 ||\n        mbedtls_mpi_cmp_mpi( &QP, &ctx->QP ) != 0 ||\n        mbedtls_mpi_cmp_int( &L2, 0 ) != 0 ||\n        mbedtls_mpi_cmp_int( &I, 1 ) != 0 ||\n        mbedtls_mpi_cmp_int( &G, 1 ) != 0 )\n    {\n        ret = MBEDTLS_ERR_RSA_KEY_CHECK_FAILED;\n    }\n\ncleanup:\n    mbedtls_mpi_free( &PQ ); mbedtls_mpi_free( &DE ); mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 );\n    mbedtls_mpi_free( &H  ); mbedtls_mpi_free( &I  ); mbedtls_mpi_free( &G  ); mbedtls_mpi_free( &G2 );\n    mbedtls_mpi_free( &L1 ); mbedtls_mpi_free( &L2 ); mbedtls_mpi_free( &DP ); mbedtls_mpi_free( &DQ );\n    mbedtls_mpi_free( &QP );\n\n    if( ret == MBEDTLS_ERR_RSA_KEY_CHECK_FAILED )\n        return( ret );\n\n    if( ret != 0 )\n        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED + ret );\n\n    return( 0 );\n}\n\n/*\n * Check if contexts holding a public and private key match\n */\nint mbedtls_rsa_check_pub_priv( const mbedtls_rsa_context *pub, const mbedtls_rsa_context *prv )\n{\n    if( mbedtls_rsa_check_pubkey( pub ) != 0 ||\n        mbedtls_rsa_check_privkey( prv ) != 0 )\n    {\n        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );\n    }\n\n    if( mbedtls_mpi_cmp_mpi( &pub->N, &prv->N ) != 0 ||\n        mbedtls_mpi_cmp_mpi( &pub->E, &prv->E ) != 0 )\n    {\n        return( MBEDTLS_ERR_RSA_KEY_CHECK_FAILED );\n    }\n\n    return( 0 );\n}\n\n/*\n * Do an RSA public key operation\n */\nint mbedtls_rsa_public( mbedtls_rsa_context *ctx,\n                const unsigned char *input,\n                unsigned char *output )\n{\n    int ret;\n    size_t olen;\n    mbedtls_mpi T;\n\n    mbedtls_mpi_init( &T );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &T, input, ctx->len ) );\n\n    if( mbedtls_mpi_cmp_mpi( &T, &ctx->N ) >= 0 )\n    {\n        ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA;\n        goto cleanup;\n    }\n\n    olen = ctx->len;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T, &T, &ctx->E, &ctx->N, &ctx->RN ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &T, output, olen ) );\n\ncleanup:\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    mbedtls_mpi_free( &T );\n\n    if( ret != 0 )\n        return( MBEDTLS_ERR_RSA_PUBLIC_FAILED + ret );\n\n    return( 0 );\n}\n\n/*\n * Generate or update blinding values, see section 10 of:\n *  KOCHER, Paul C. Timing attacks on implementations of Diffie-Hellman, RSA,\n *  DSS, and other systems. In : Advances in Cryptology-CRYPTO'96. Springer\n *  Berlin Heidelberg, 1996. p. 104-113.\n */\nstatic int rsa_prepare_blinding( mbedtls_rsa_context *ctx,\n                 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng )\n{\n    int ret, count = 0;\n\n    if( ctx->Vf.p != NULL )\n    {\n        /* We already have blinding values, just update them by squaring */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vi, &ctx->Vi, &ctx->Vi ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vi, &ctx->Vi, &ctx->N ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &ctx->Vf, &ctx->Vf, &ctx->Vf ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &ctx->Vf, &ctx->Vf, &ctx->N ) );\n\n        goto cleanup;\n    }\n\n    /* Unblinding value: Vf = random number, invertible mod N */\n    do {\n        if( count++ > 10 )\n            return( MBEDTLS_ERR_RSA_RNG_FAILED );\n\n        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &ctx->Vf, ctx->len - 1, f_rng, p_rng ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &ctx->Vi, &ctx->Vf, &ctx->N ) );\n    } while( mbedtls_mpi_cmp_int( &ctx->Vi, 1 ) != 0 );\n\n    /* Blinding value: Vi =  Vf^(-e) mod N */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &ctx->Vi, &ctx->Vf, &ctx->N ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &ctx->Vi, &ctx->Vi, &ctx->E, &ctx->N, &ctx->RN ) );\n\n\ncleanup:\n    return( ret );\n}\n\n/*\n * Exponent blinding supposed to prevent side-channel attacks using multiple\n * traces of measurements to recover the RSA key. The more collisions are there,\n * the more bits of the key can be recovered. See [3].\n *\n * Collecting n collisions with m bit long blinding value requires 2^(m-m/n)\n * observations on avarage.\n *\n * For example with 28 byte blinding to achieve 2 collisions the adversary has\n * to make 2^112 observations on avarage.\n *\n * (With the currently (as of 2017 April) known best algorithms breaking 2048\n * bit RSA requires approximately as much time as trying out 2^112 random keys.\n * Thus in this sense with 28 byte blinding the security is not reduced by\n * side-channel attacks like the one in [3])\n *\n * This countermeasure does not help if the key recovery is possible with a\n * single trace.\n */\n#define RSA_EXPONENT_BLINDING 28\n\n/*\n * Do an RSA private key operation\n */\nint mbedtls_rsa_private( mbedtls_rsa_context *ctx,\n                 int (*f_rng)(void *, unsigned char *, size_t),\n                 void *p_rng,\n                 const unsigned char *input,\n                 unsigned char *output )\n{\n    int ret;\n    size_t olen;\n    mbedtls_mpi T, T1, T2;\n    mbedtls_mpi P1, Q1, R;\n#if defined(MBEDTLS_RSA_NO_CRT)\n    mbedtls_mpi D_blind;\n    mbedtls_mpi *D = &ctx->D;\n#else\n    mbedtls_mpi DP_blind, DQ_blind;\n    mbedtls_mpi *DP = &ctx->DP;\n    mbedtls_mpi *DQ = &ctx->DQ;\n#endif\n\n    /* Make sure we have private key info, prevent possible misuse */\n    if( ctx->P.p == NULL || ctx->Q.p == NULL || ctx->D.p == NULL )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    mbedtls_mpi_init( &T ); mbedtls_mpi_init( &T1 ); mbedtls_mpi_init( &T2 );\n    mbedtls_mpi_init( &P1 ); mbedtls_mpi_init( &Q1 ); mbedtls_mpi_init( &R );\n\n\n    if( f_rng != NULL )\n    {\n#if defined(MBEDTLS_RSA_NO_CRT)\n        mbedtls_mpi_init( &D_blind );\n#else\n        mbedtls_mpi_init( &DP_blind );\n        mbedtls_mpi_init( &DQ_blind );\n#endif\n    }\n\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( &T, input, ctx->len ) );\n    if( mbedtls_mpi_cmp_mpi( &T, &ctx->N ) >= 0 )\n    {\n        ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA;\n        goto cleanup;\n    }\n\n    if( f_rng != NULL )\n    {\n        /*\n         * Blinding\n         * T = T * Vi mod N\n         */\n        MBEDTLS_MPI_CHK( rsa_prepare_blinding( ctx, f_rng, p_rng ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &T, &ctx->Vi ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T, &ctx->N ) );\n\n        /*\n         * Exponent blinding\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &P1, &ctx->P, 1 ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &Q1, &ctx->Q, 1 ) );\n\n#if defined(MBEDTLS_RSA_NO_CRT)\n        /*\n         * D_blind = ( P - 1 ) * ( Q - 1 ) * R + D\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING,\n                         f_rng, p_rng ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &D_blind, &P1, &Q1 ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &D_blind, &D_blind, &R ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &D_blind, &D_blind, &ctx->D ) );\n\n        D = &D_blind;\n#else\n        /*\n         * DP_blind = ( P - 1 ) * R + DP\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING,\n                         f_rng, p_rng ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DP_blind, &P1, &R ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &DP_blind, &DP_blind,\n                    &ctx->DP ) );\n\n        DP = &DP_blind;\n\n        /*\n         * DQ_blind = ( Q - 1 ) * R + DQ\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &R, RSA_EXPONENT_BLINDING,\n                         f_rng, p_rng ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &DQ_blind, &Q1, &R ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &DQ_blind, &DQ_blind,\n                    &ctx->DQ ) );\n\n        DQ = &DQ_blind;\n#endif /* MBEDTLS_RSA_NO_CRT */\n    }\n\n#if defined(MBEDTLS_RSA_NO_CRT)\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T, &T, D, &ctx->N, &ctx->RN ) );\n#else\n    /*\n     * Faster decryption using the CRT\n     *\n     * T1 = input ^ dP mod P\n     * T2 = input ^ dQ mod Q\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T1, &T, DP, &ctx->P, &ctx->RP ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &T2, &T, DQ, &ctx->Q, &ctx->RQ ) );\n\n    /*\n     * T = (T1 - T2) * (Q^-1 mod P) mod P\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &T, &T1, &T2 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &T, &ctx->QP ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T1, &ctx->P ) );\n\n    /*\n     * T = T2 + T * Q\n     */\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T1, &T, &ctx->Q ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &T, &T2, &T1 ) );\n#endif /* MBEDTLS_RSA_NO_CRT */\n\n    if( f_rng != NULL )\n    {\n        /*\n         * Unblind\n         * T = T * Vf mod N\n         */\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T, &T, &ctx->Vf ) );\n        MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &T, &T, &ctx->N ) );\n    }\n\n    olen = ctx->len;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_binary( &T, output, olen ) );\n\ncleanup:\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    mbedtls_mpi_free( &T ); mbedtls_mpi_free( &T1 ); mbedtls_mpi_free( &T2 );\n    mbedtls_mpi_free( &P1 ); mbedtls_mpi_free( &Q1 ); mbedtls_mpi_free( &R );\n\n    if( f_rng != NULL )\n    {\n#if defined(MBEDTLS_RSA_NO_CRT)\n        mbedtls_mpi_free( &D_blind );\n#else\n        mbedtls_mpi_free( &DP_blind );\n        mbedtls_mpi_free( &DQ_blind );\n#endif\n    }\n\n    if( ret != 0 )\n        return( MBEDTLS_ERR_RSA_PRIVATE_FAILED + ret );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_PKCS1_V21)\n/**\n * Generate and apply the MGF1 operation (from PKCS#1 v2.1) to a buffer.\n *\n * \\param dst       buffer to mask\n * \\param dlen      length of destination buffer\n * \\param src       source of the mask generation\n * \\param slen      length of the source buffer\n * \\param md_ctx    message digest context to use\n */\nstatic void mgf_mask( unsigned char *dst, size_t dlen, unsigned char *src,\n                      size_t slen, mbedtls_md_context_t *md_ctx )\n{\n    unsigned char mask[MBEDTLS_MD_MAX_SIZE];\n    unsigned char counter[4];\n    unsigned char *p;\n    unsigned int hlen;\n    size_t i, use_len;\n\n    memset( mask, 0, MBEDTLS_MD_MAX_SIZE );\n    memset( counter, 0, 4 );\n\n    hlen = mbedtls_md_get_size( md_ctx->md_info );\n\n    /* Generate and apply dbMask */\n    p = dst;\n\n    while( dlen > 0 )\n    {\n        use_len = hlen;\n        if( dlen < hlen )\n            use_len = dlen;\n\n        mbedtls_md_starts( md_ctx );\n        mbedtls_md_update( md_ctx, src, slen );\n        mbedtls_md_update( md_ctx, counter, 4 );\n        mbedtls_md_finish( md_ctx, mask );\n\n        for( i = 0; i < use_len; ++i )\n            *p++ ^= mask[i];\n\n        counter[3]++;\n\n        dlen -= use_len;\n    }\n\n    mbedtls_zeroize( mask, sizeof( mask ) );\n}\n#endif /* MBEDTLS_PKCS1_V21 */\n\n#if defined(MBEDTLS_PKCS1_V21)\n/*\n * Implementation of the PKCS#1 v2.1 RSAES-OAEP-ENCRYPT function\n */\nint mbedtls_rsa_rsaes_oaep_encrypt( mbedtls_rsa_context *ctx,\n                            int (*f_rng)(void *, unsigned char *, size_t),\n                            void *p_rng,\n                            int mode,\n                            const unsigned char *label, size_t label_len,\n                            size_t ilen,\n                            const unsigned char *input,\n                            unsigned char *output )\n{\n    size_t olen;\n    int ret;\n    unsigned char *p = output;\n    unsigned int hlen;\n    const mbedtls_md_info_t *md_info;\n    mbedtls_md_context_t md_ctx;\n\n    if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    if( f_rng == NULL )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id );\n    if( md_info == NULL )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    olen = ctx->len;\n    hlen = mbedtls_md_get_size( md_info );\n\n    /* first comparison checks for overflow */\n    if( ilen + 2 * hlen + 2 < ilen || olen < ilen + 2 * hlen + 2 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    memset( output, 0, olen );\n\n    *p++ = 0;\n\n    /* Generate a random octet string seed */\n    if( ( ret = f_rng( p_rng, p, hlen ) ) != 0 )\n        return( MBEDTLS_ERR_RSA_RNG_FAILED + ret );\n\n    p += hlen;\n\n    /* Construct DB */\n    mbedtls_md( md_info, label, label_len, p );\n    p += hlen;\n    p += olen - 2 * hlen - 2 - ilen;\n    *p++ = 1;\n    memcpy( p, input, ilen );\n\n    mbedtls_md_init( &md_ctx );\n    if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 )\n    {\n        mbedtls_md_free( &md_ctx );\n        return( ret );\n    }\n\n    /* maskedDB: Apply dbMask to DB */\n    mgf_mask( output + hlen + 1, olen - hlen - 1, output + 1, hlen,\n               &md_ctx );\n\n    /* maskedSeed: Apply seedMask to seed */\n    mgf_mask( output + 1, hlen, output + hlen + 1, olen - hlen - 1,\n               &md_ctx );\n\n    mbedtls_md_free( &md_ctx );\n\n    return( ( mode == MBEDTLS_RSA_PUBLIC )\n            ? mbedtls_rsa_public(  ctx, output, output )\n            : mbedtls_rsa_private( ctx, f_rng, p_rng, output, output ) );\n}\n#endif /* MBEDTLS_PKCS1_V21 */\n\n#if defined(MBEDTLS_PKCS1_V15)\n/*\n * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-ENCRYPT function\n */\nint mbedtls_rsa_rsaes_pkcs1_v15_encrypt( mbedtls_rsa_context *ctx,\n                                 int (*f_rng)(void *, unsigned char *, size_t),\n                                 void *p_rng,\n                                 int mode, size_t ilen,\n                                 const unsigned char *input,\n                                 unsigned char *output )\n{\n    size_t nb_pad, olen;\n    int ret;\n    unsigned char *p = output;\n\n    if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    // We don't check p_rng because it won't be dereferenced here\n    if( f_rng == NULL || input == NULL || output == NULL )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    olen = ctx->len;\n\n    /* first comparison checks for overflow */\n    if( ilen + 11 < ilen || olen < ilen + 11 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    nb_pad = olen - 3 - ilen;\n\n    *p++ = 0;\n    if( mode == MBEDTLS_RSA_PUBLIC )\n    {\n        *p++ = MBEDTLS_RSA_CRYPT;\n\n        while( nb_pad-- > 0 )\n        {\n            int rng_dl = 100;\n\n            do {\n                ret = f_rng( p_rng, p, 1 );\n            } while( *p == 0 && --rng_dl && ret == 0 );\n\n            /* Check if RNG failed to generate data */\n            if( rng_dl == 0 || ret != 0 )\n                return( MBEDTLS_ERR_RSA_RNG_FAILED + ret );\n\n            p++;\n        }\n    }\n    else\n    {\n        *p++ = MBEDTLS_RSA_SIGN;\n\n        while( nb_pad-- > 0 )\n            *p++ = 0xFF;\n    }\n\n    *p++ = 0;\n    memcpy( p, input, ilen );\n\n    return( ( mode == MBEDTLS_RSA_PUBLIC )\n            ? mbedtls_rsa_public(  ctx, output, output )\n            : mbedtls_rsa_private( ctx, f_rng, p_rng, output, output ) );\n}\n#endif /* MBEDTLS_PKCS1_V15 */\n\n/*\n * Add the message padding, then do an RSA operation\n */\nint mbedtls_rsa_pkcs1_encrypt( mbedtls_rsa_context *ctx,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng,\n                       int mode, size_t ilen,\n                       const unsigned char *input,\n                       unsigned char *output )\n{\n    switch( ctx->padding )\n    {\n#if defined(MBEDTLS_PKCS1_V15)\n        case MBEDTLS_RSA_PKCS_V15:\n            return mbedtls_rsa_rsaes_pkcs1_v15_encrypt( ctx, f_rng, p_rng, mode, ilen,\n                                                input, output );\n#endif\n\n#if defined(MBEDTLS_PKCS1_V21)\n        case MBEDTLS_RSA_PKCS_V21:\n            return mbedtls_rsa_rsaes_oaep_encrypt( ctx, f_rng, p_rng, mode, NULL, 0,\n                                           ilen, input, output );\n#endif\n\n        default:\n            return( MBEDTLS_ERR_RSA_INVALID_PADDING );\n    }\n}\n\n#if defined(MBEDTLS_PKCS1_V21)\n/*\n * Implementation of the PKCS#1 v2.1 RSAES-OAEP-DECRYPT function\n */\nint mbedtls_rsa_rsaes_oaep_decrypt( mbedtls_rsa_context *ctx,\n                            int (*f_rng)(void *, unsigned char *, size_t),\n                            void *p_rng,\n                            int mode,\n                            const unsigned char *label, size_t label_len,\n                            size_t *olen,\n                            const unsigned char *input,\n                            unsigned char *output,\n                            size_t output_max_len )\n{\n    int ret;\n    size_t ilen, i, pad_len;\n    unsigned char *p, bad, pad_done;\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n    unsigned char lhash[MBEDTLS_MD_MAX_SIZE];\n    unsigned int hlen;\n    const mbedtls_md_info_t *md_info;\n    mbedtls_md_context_t md_ctx;\n\n    /*\n     * Parameters sanity checks\n     */\n    if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    ilen = ctx->len;\n\n    if( ilen < 16 || ilen > sizeof( buf ) )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id );\n    if( md_info == NULL )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    hlen = mbedtls_md_get_size( md_info );\n\n    // checking for integer underflow\n    if( 2 * hlen + 2 > ilen )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    /*\n     * RSA operation\n     */\n    ret = ( mode == MBEDTLS_RSA_PUBLIC )\n          ? mbedtls_rsa_public(  ctx, input, buf )\n          : mbedtls_rsa_private( ctx, f_rng, p_rng, input, buf );\n\n    if( ret != 0 )\n        goto cleanup;\n\n    /*\n     * Unmask data and generate lHash\n     */\n    mbedtls_md_init( &md_ctx );\n    if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 )\n    {\n        mbedtls_md_free( &md_ctx );\n        goto cleanup;\n    }\n\n\n    /* Generate lHash */\n    mbedtls_md( md_info, label, label_len, lhash );\n\n    /* seed: Apply seedMask to maskedSeed */\n    mgf_mask( buf + 1, hlen, buf + hlen + 1, ilen - hlen - 1,\n               &md_ctx );\n\n    /* DB: Apply dbMask to maskedDB */\n    mgf_mask( buf + hlen + 1, ilen - hlen - 1, buf + 1, hlen,\n               &md_ctx );\n\n    mbedtls_md_free( &md_ctx );\n\n    /*\n     * Check contents, in \"constant-time\"\n     */\n    p = buf;\n    bad = 0;\n\n    bad |= *p++; /* First byte must be 0 */\n\n    p += hlen; /* Skip seed */\n\n    /* Check lHash */\n    for( i = 0; i < hlen; i++ )\n        bad |= lhash[i] ^ *p++;\n\n    /* Get zero-padding len, but always read till end of buffer\n     * (minus one, for the 01 byte) */\n    pad_len = 0;\n    pad_done = 0;\n    for( i = 0; i < ilen - 2 * hlen - 2; i++ )\n    {\n        pad_done |= p[i];\n        pad_len += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1;\n    }\n\n    p += pad_len;\n    bad |= *p++ ^ 0x01;\n\n    /*\n     * The only information \"leaked\" is whether the padding was correct or not\n     * (eg, no data is copied if it was not correct). This meets the\n     * recommendations in PKCS#1 v2.2: an opponent cannot distinguish between\n     * the different error conditions.\n     */\n    if( bad != 0 )\n    {\n        ret = MBEDTLS_ERR_RSA_INVALID_PADDING;\n        goto cleanup;\n    }\n\n    if( ilen - ( p - buf ) > output_max_len )\n    {\n        ret = MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE;\n        goto cleanup;\n    }\n\n    *olen = ilen - (p - buf);\n    memcpy( output, p, *olen );\n    ret = 0;\n\ncleanup:\n    mbedtls_zeroize( buf, sizeof( buf ) );\n    mbedtls_zeroize( lhash, sizeof( lhash ) );\n\n    return( ret );\n}\n#endif /* MBEDTLS_PKCS1_V21 */\n\n#if defined(MBEDTLS_PKCS1_V15)\n/*\n * Implementation of the PKCS#1 v2.1 RSAES-PKCS1-V1_5-DECRYPT function\n */\nint mbedtls_rsa_rsaes_pkcs1_v15_decrypt( mbedtls_rsa_context *ctx,\n                                 int (*f_rng)(void *, unsigned char *, size_t),\n                                 void *p_rng,\n                                 int mode, size_t *olen,\n                                 const unsigned char *input,\n                                 unsigned char *output,\n                                 size_t output_max_len)\n{\n    int ret;\n    size_t ilen, pad_count = 0, i;\n    unsigned char *p, bad, pad_done = 0;\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n\n    if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    ilen = ctx->len;\n\n    if( ilen < 16 || ilen > sizeof( buf ) )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    ret = ( mode == MBEDTLS_RSA_PUBLIC )\n          ? mbedtls_rsa_public(  ctx, input, buf )\n          : mbedtls_rsa_private( ctx, f_rng, p_rng, input, buf );\n\n    if( ret != 0 )\n        goto cleanup;\n\n    p = buf;\n    bad = 0;\n\n    /*\n     * Check and get padding len in \"constant-time\"\n     */\n    bad |= *p++; /* First byte must be 0 */\n\n    /* This test does not depend on secret data */\n    if( mode == MBEDTLS_RSA_PRIVATE )\n    {\n        bad |= *p++ ^ MBEDTLS_RSA_CRYPT;\n\n        /* Get padding len, but always read till end of buffer\n         * (minus one, for the 00 byte) */\n        for( i = 0; i < ilen - 3; i++ )\n        {\n            pad_done  |= ((p[i] | (unsigned char)-p[i]) >> 7) ^ 1;\n            pad_count += ((pad_done | (unsigned char)-pad_done) >> 7) ^ 1;\n        }\n\n        p += pad_count;\n        bad |= *p++; /* Must be zero */\n    }\n    else\n    {\n        bad |= *p++ ^ MBEDTLS_RSA_SIGN;\n\n        /* Get padding len, but always read till end of buffer\n         * (minus one, for the 00 byte) */\n        for( i = 0; i < ilen - 3; i++ )\n        {\n            pad_done |= ( p[i] != 0xFF );\n            pad_count += ( pad_done == 0 );\n        }\n\n        p += pad_count;\n        bad |= *p++; /* Must be zero */\n    }\n\n    bad |= ( pad_count < 8 );\n\n    if( bad )\n    {\n        ret = MBEDTLS_ERR_RSA_INVALID_PADDING;\n        goto cleanup;\n    }\n\n    if( ilen - ( p - buf ) > output_max_len )\n    {\n        ret = MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE;\n        goto cleanup;\n    }\n\n    *olen = ilen - (p - buf);\n    memcpy( output, p, *olen );\n    ret = 0;\n\ncleanup:\n    mbedtls_zeroize( buf, sizeof( buf ) );\n\n    return( ret );\n}\n#endif /* MBEDTLS_PKCS1_V15 */\n\n/*\n * Do an RSA operation, then remove the message padding\n */\nint mbedtls_rsa_pkcs1_decrypt( mbedtls_rsa_context *ctx,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng,\n                       int mode, size_t *olen,\n                       const unsigned char *input,\n                       unsigned char *output,\n                       size_t output_max_len)\n{\n    switch( ctx->padding )\n    {\n#if defined(MBEDTLS_PKCS1_V15)\n        case MBEDTLS_RSA_PKCS_V15:\n            return mbedtls_rsa_rsaes_pkcs1_v15_decrypt( ctx, f_rng, p_rng, mode, olen,\n                                                input, output, output_max_len );\n#endif\n\n#if defined(MBEDTLS_PKCS1_V21)\n        case MBEDTLS_RSA_PKCS_V21:\n            return mbedtls_rsa_rsaes_oaep_decrypt( ctx, f_rng, p_rng, mode, NULL, 0,\n                                           olen, input, output,\n                                           output_max_len );\n#endif\n\n        default:\n            return( MBEDTLS_ERR_RSA_INVALID_PADDING );\n    }\n}\n\n#if defined(MBEDTLS_PKCS1_V21)\n/*\n * Implementation of the PKCS#1 v2.1 RSASSA-PSS-SIGN function\n */\nint mbedtls_rsa_rsassa_pss_sign( mbedtls_rsa_context *ctx,\n                         int (*f_rng)(void *, unsigned char *, size_t),\n                         void *p_rng,\n                         int mode,\n                         mbedtls_md_type_t md_alg,\n                         unsigned int hashlen,\n                         const unsigned char *hash,\n                         unsigned char *sig )\n{\n    size_t olen;\n    unsigned char *p = sig;\n    unsigned char salt[MBEDTLS_MD_MAX_SIZE];\n    unsigned int slen, hlen, offset = 0;\n    int ret;\n    size_t msb;\n    const mbedtls_md_info_t *md_info;\n    mbedtls_md_context_t md_ctx;\n\n    if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    if( f_rng == NULL )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    olen = ctx->len;\n\n    if( md_alg != MBEDTLS_MD_NONE )\n    {\n        /* Gather length of hash to sign */\n        md_info = mbedtls_md_info_from_type( md_alg );\n        if( md_info == NULL )\n            return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n        hashlen = mbedtls_md_get_size( md_info );\n    }\n\n    md_info = mbedtls_md_info_from_type( (mbedtls_md_type_t) ctx->hash_id );\n    if( md_info == NULL )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    hlen = mbedtls_md_get_size( md_info );\n    slen = hlen;\n\n    if( olen < hlen + slen + 2 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    memset( sig, 0, olen );\n\n    /* Generate salt of length slen */\n    if( ( ret = f_rng( p_rng, salt, slen ) ) != 0 )\n        return( MBEDTLS_ERR_RSA_RNG_FAILED + ret );\n\n    /* Note: EMSA-PSS encoding is over the length of N - 1 bits */\n    msb = mbedtls_mpi_bitlen( &ctx->N ) - 1;\n    p += olen - hlen * 2 - 2;\n    *p++ = 0x01;\n    memcpy( p, salt, slen );\n    p += slen;\n\n    mbedtls_md_init( &md_ctx );\n    if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 )\n    {\n        mbedtls_md_free( &md_ctx );\n        /* No need to zeroize salt: we didn't use it. */\n        return( ret );\n    }\n\n    /* Generate H = Hash( M' ) */\n    mbedtls_md_starts( &md_ctx );\n    mbedtls_md_update( &md_ctx, p, 8 );\n    mbedtls_md_update( &md_ctx, hash, hashlen );\n    mbedtls_md_update( &md_ctx, salt, slen );\n    mbedtls_md_finish( &md_ctx, p );\n    mbedtls_zeroize( salt, sizeof( salt ) );\n\n    /* Compensate for boundary condition when applying mask */\n    if( msb % 8 == 0 )\n        offset = 1;\n\n    /* maskedDB: Apply dbMask to DB */\n    mgf_mask( sig + offset, olen - hlen - 1 - offset, p, hlen, &md_ctx );\n\n    mbedtls_md_free( &md_ctx );\n\n    msb = mbedtls_mpi_bitlen( &ctx->N ) - 1;\n    sig[0] &= 0xFF >> ( olen * 8 - msb );\n\n    p += hlen;\n    *p++ = 0xBC;\n\n    return( ( mode == MBEDTLS_RSA_PUBLIC )\n            ? mbedtls_rsa_public(  ctx, sig, sig )\n            : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig ) );\n}\n#endif /* MBEDTLS_PKCS1_V21 */\n\n#if defined(MBEDTLS_PKCS1_V15)\n/*\n * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-V1_5-SIGN function\n */\n/*\n * Do an RSA operation to sign the message digest\n */\nint mbedtls_rsa_rsassa_pkcs1_v15_sign( mbedtls_rsa_context *ctx,\n                               int (*f_rng)(void *, unsigned char *, size_t),\n                               void *p_rng,\n                               int mode,\n                               mbedtls_md_type_t md_alg,\n                               unsigned int hashlen,\n                               const unsigned char *hash,\n                               unsigned char *sig )\n{\n    size_t nb_pad, olen, oid_size = 0;\n    unsigned char *p = sig;\n    const char *oid = NULL;\n    unsigned char *sig_try = NULL, *verif = NULL;\n    size_t i;\n    unsigned char diff;\n    volatile unsigned char diff_no_optimize;\n    int ret;\n\n    if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    olen = ctx->len;\n    nb_pad = olen - 3;\n\n    if( md_alg != MBEDTLS_MD_NONE )\n    {\n        const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );\n        if( md_info == NULL )\n            return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n        if( mbedtls_oid_get_oid_by_md( md_alg, &oid, &oid_size ) != 0 )\n            return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n        nb_pad -= 10 + oid_size;\n\n        hashlen = mbedtls_md_get_size( md_info );\n    }\n\n    nb_pad -= hashlen;\n\n    if( ( nb_pad < 8 ) || ( nb_pad > olen ) )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    *p++ = 0;\n    *p++ = MBEDTLS_RSA_SIGN;\n    memset( p, 0xFF, nb_pad );\n    p += nb_pad;\n    *p++ = 0;\n\n    if( md_alg == MBEDTLS_MD_NONE )\n    {\n        memcpy( p, hash, hashlen );\n    }\n    else\n    {\n        /*\n         * DigestInfo ::= SEQUENCE {\n         *   digestAlgorithm DigestAlgorithmIdentifier,\n         *   digest Digest }\n         *\n         * DigestAlgorithmIdentifier ::= AlgorithmIdentifier\n         *\n         * Digest ::= OCTET STRING\n         */\n        *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED;\n        *p++ = (unsigned char) ( 0x08 + oid_size + hashlen );\n        *p++ = MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED;\n        *p++ = (unsigned char) ( 0x04 + oid_size );\n        *p++ = MBEDTLS_ASN1_OID;\n        *p++ = oid_size & 0xFF;\n        memcpy( p, oid, oid_size );\n        p += oid_size;\n        *p++ = MBEDTLS_ASN1_NULL;\n        *p++ = 0x00;\n        *p++ = MBEDTLS_ASN1_OCTET_STRING;\n        *p++ = hashlen;\n        memcpy( p, hash, hashlen );\n    }\n\n    if( mode == MBEDTLS_RSA_PUBLIC )\n        return( mbedtls_rsa_public(  ctx, sig, sig ) );\n\n    /*\n     * In order to prevent Lenstra's attack, make the signature in a\n     * temporary buffer and check it before returning it.\n     */\n    sig_try = mbedtls_calloc( 1, ctx->len );\n    if( sig_try == NULL )\n        return( MBEDTLS_ERR_MPI_ALLOC_FAILED );\n\n    verif   = mbedtls_calloc( 1, ctx->len );\n    if( verif == NULL )\n    {\n        mbedtls_free( sig_try );\n        return( MBEDTLS_ERR_MPI_ALLOC_FAILED );\n    }\n\n    MBEDTLS_MPI_CHK( mbedtls_rsa_private( ctx, f_rng, p_rng, sig, sig_try ) );\n    MBEDTLS_MPI_CHK( mbedtls_rsa_public( ctx, sig_try, verif ) );\n\n    /* Compare in constant time just in case */\n    for( diff = 0, i = 0; i < ctx->len; i++ )\n        diff |= verif[i] ^ sig[i];\n    diff_no_optimize = diff;\n\n    if( diff_no_optimize != 0 )\n    {\n        ret = MBEDTLS_ERR_RSA_PRIVATE_FAILED;\n        goto cleanup;\n    }\n\n    memcpy( sig, sig_try, ctx->len );\n\ncleanup:\n    mbedtls_free( sig_try );\n    mbedtls_free( verif );\n\n    return( ret );\n}\n#endif /* MBEDTLS_PKCS1_V15 */\n\n/*\n * Do an RSA operation to sign the message digest\n */\nint mbedtls_rsa_pkcs1_sign( mbedtls_rsa_context *ctx,\n                    int (*f_rng)(void *, unsigned char *, size_t),\n                    void *p_rng,\n                    int mode,\n                    mbedtls_md_type_t md_alg,\n                    unsigned int hashlen,\n                    const unsigned char *hash,\n                    unsigned char *sig )\n{\n    switch( ctx->padding )\n    {\n#if defined(MBEDTLS_PKCS1_V15)\n        case MBEDTLS_RSA_PKCS_V15:\n            return mbedtls_rsa_rsassa_pkcs1_v15_sign( ctx, f_rng, p_rng, mode, md_alg,\n                                              hashlen, hash, sig );\n#endif\n\n#if defined(MBEDTLS_PKCS1_V21)\n        case MBEDTLS_RSA_PKCS_V21:\n            return mbedtls_rsa_rsassa_pss_sign( ctx, f_rng, p_rng, mode, md_alg,\n                                        hashlen, hash, sig );\n#endif\n\n        default:\n            return( MBEDTLS_ERR_RSA_INVALID_PADDING );\n    }\n}\n\n#if defined(MBEDTLS_PKCS1_V21)\n/*\n * Implementation of the PKCS#1 v2.1 RSASSA-PSS-VERIFY function\n */\nint mbedtls_rsa_rsassa_pss_verify_ext( mbedtls_rsa_context *ctx,\n                               int (*f_rng)(void *, unsigned char *, size_t),\n                               void *p_rng,\n                               int mode,\n                               mbedtls_md_type_t md_alg,\n                               unsigned int hashlen,\n                               const unsigned char *hash,\n                               mbedtls_md_type_t mgf1_hash_id,\n                               int expected_salt_len,\n                               const unsigned char *sig )\n{\n    int ret;\n    size_t siglen;\n    unsigned char *p;\n    unsigned char result[MBEDTLS_MD_MAX_SIZE];\n    unsigned char zeros[8];\n    unsigned int hlen;\n    size_t slen, msb;\n    const mbedtls_md_info_t *md_info;\n    mbedtls_md_context_t md_ctx;\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n\n    if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V21 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    siglen = ctx->len;\n\n    if( siglen < 16 || siglen > sizeof( buf ) )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    ret = ( mode == MBEDTLS_RSA_PUBLIC )\n          ? mbedtls_rsa_public(  ctx, sig, buf )\n          : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, buf );\n\n    if( ret != 0 )\n        return( ret );\n\n    p = buf;\n\n    if( buf[siglen - 1] != 0xBC )\n        return( MBEDTLS_ERR_RSA_INVALID_PADDING );\n\n    if( md_alg != MBEDTLS_MD_NONE )\n    {\n        /* Gather length of hash to sign */\n        md_info = mbedtls_md_info_from_type( md_alg );\n        if( md_info == NULL )\n            return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n        hashlen = mbedtls_md_get_size( md_info );\n    }\n\n    md_info = mbedtls_md_info_from_type( mgf1_hash_id );\n    if( md_info == NULL )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    hlen = mbedtls_md_get_size( md_info );\n    slen = siglen - hlen - 1; /* Currently length of salt + padding */\n\n    memset( zeros, 0, 8 );\n\n    /*\n     * Note: EMSA-PSS verification is over the length of N - 1 bits\n     */\n    msb = mbedtls_mpi_bitlen( &ctx->N ) - 1;\n\n    /* Compensate for boundary condition when applying mask */\n    if( msb % 8 == 0 )\n    {\n        p++;\n        siglen -= 1;\n    }\n    if( buf[0] >> ( 8 - siglen * 8 + msb ) )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    mbedtls_md_init( &md_ctx );\n    if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 0 ) ) != 0 )\n    {\n        mbedtls_md_free( &md_ctx );\n        return( ret );\n    }\n\n    mgf_mask( p, siglen - hlen - 1, p + siglen - hlen - 1, hlen, &md_ctx );\n\n    buf[0] &= 0xFF >> ( siglen * 8 - msb );\n\n    while( p < buf + siglen && *p == 0 )\n        p++;\n\n    if( p == buf + siglen ||\n        *p++ != 0x01 )\n    {\n        mbedtls_md_free( &md_ctx );\n        return( MBEDTLS_ERR_RSA_INVALID_PADDING );\n    }\n\n    /* Actual salt len */\n    slen -= p - buf;\n\n    if( expected_salt_len != MBEDTLS_RSA_SALT_LEN_ANY &&\n        slen != (size_t) expected_salt_len )\n    {\n        mbedtls_md_free( &md_ctx );\n        return( MBEDTLS_ERR_RSA_INVALID_PADDING );\n    }\n\n    /*\n     * Generate H = Hash( M' )\n     */\n    mbedtls_md_starts( &md_ctx );\n    mbedtls_md_update( &md_ctx, zeros, 8 );\n    mbedtls_md_update( &md_ctx, hash, hashlen );\n    mbedtls_md_update( &md_ctx, p, slen );\n    mbedtls_md_finish( &md_ctx, result );\n\n    mbedtls_md_free( &md_ctx );\n\n    if( memcmp( p + slen, result, hlen ) == 0 )\n        return( 0 );\n    else\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n}\n\n/*\n * Simplified PKCS#1 v2.1 RSASSA-PSS-VERIFY function\n */\nint mbedtls_rsa_rsassa_pss_verify( mbedtls_rsa_context *ctx,\n                           int (*f_rng)(void *, unsigned char *, size_t),\n                           void *p_rng,\n                           int mode,\n                           mbedtls_md_type_t md_alg,\n                           unsigned int hashlen,\n                           const unsigned char *hash,\n                           const unsigned char *sig )\n{\n    mbedtls_md_type_t mgf1_hash_id = ( ctx->hash_id != MBEDTLS_MD_NONE )\n                             ? (mbedtls_md_type_t) ctx->hash_id\n                             : md_alg;\n\n    return( mbedtls_rsa_rsassa_pss_verify_ext( ctx, f_rng, p_rng, mode,\n                                       md_alg, hashlen, hash,\n                                       mgf1_hash_id, MBEDTLS_RSA_SALT_LEN_ANY,\n                                       sig ) );\n\n}\n#endif /* MBEDTLS_PKCS1_V21 */\n\n#if defined(MBEDTLS_PKCS1_V15)\n/*\n * Implementation of the PKCS#1 v2.1 RSASSA-PKCS1-v1_5-VERIFY function\n */\nint mbedtls_rsa_rsassa_pkcs1_v15_verify( mbedtls_rsa_context *ctx,\n                                 int (*f_rng)(void *, unsigned char *, size_t),\n                                 void *p_rng,\n                                 int mode,\n                                 mbedtls_md_type_t md_alg,\n                                 unsigned int hashlen,\n                                 const unsigned char *hash,\n                                 const unsigned char *sig )\n{\n    int ret;\n    size_t len, siglen, asn1_len;\n    unsigned char *p, *p0, *end;\n    mbedtls_md_type_t msg_md_alg;\n    const mbedtls_md_info_t *md_info;\n    mbedtls_asn1_buf oid;\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n\n    if( mode == MBEDTLS_RSA_PRIVATE && ctx->padding != MBEDTLS_RSA_PKCS_V15 )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    siglen = ctx->len;\n\n    if( siglen < 16 || siglen > sizeof( buf ) )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n\n    ret = ( mode == MBEDTLS_RSA_PUBLIC )\n          ? mbedtls_rsa_public(  ctx, sig, buf )\n          : mbedtls_rsa_private( ctx, f_rng, p_rng, sig, buf );\n\n    if( ret != 0 )\n        return( ret );\n\n    p = buf;\n\n    if( *p++ != 0 || *p++ != MBEDTLS_RSA_SIGN )\n        return( MBEDTLS_ERR_RSA_INVALID_PADDING );\n\n    while( *p != 0 )\n    {\n        if( p >= buf + siglen - 1 || *p != 0xFF )\n            return( MBEDTLS_ERR_RSA_INVALID_PADDING );\n        p++;\n    }\n    p++; /* skip 00 byte */\n\n    /* We've read: 00 01 PS 00 where PS must be at least 8 bytes */\n    if( p - buf < 11 )\n        return( MBEDTLS_ERR_RSA_INVALID_PADDING );\n\n    len = siglen - ( p - buf );\n\n    if( len == hashlen && md_alg == MBEDTLS_MD_NONE )\n    {\n        if( memcmp( p, hash, hashlen ) == 0 )\n            return( 0 );\n        else\n            return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n    }\n\n    md_info = mbedtls_md_info_from_type( md_alg );\n    if( md_info == NULL )\n        return( MBEDTLS_ERR_RSA_BAD_INPUT_DATA );\n    hashlen = mbedtls_md_get_size( md_info );\n\n    end = p + len;\n\n    /*\n     * Parse the ASN.1 structure inside the PKCS#1 v1.5 structure.\n     * Insist on 2-byte length tags, to protect against variants of\n     * Bleichenbacher's forgery attack against lax PKCS#1v1.5 verification.\n     */\n    p0 = p;\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &asn1_len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n    if( p != p0 + 2 || asn1_len + 2 != len )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n    p0 = p;\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &asn1_len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n    if( p != p0 + 2 || asn1_len + 6 + hashlen != len )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n    p0 = p;\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &oid.len, MBEDTLS_ASN1_OID ) ) != 0 )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n    if( p != p0 + 2 )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n    oid.p = p;\n    p += oid.len;\n\n    if( mbedtls_oid_get_md_alg( &oid, &msg_md_alg ) != 0 )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n    if( md_alg != msg_md_alg )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n    /*\n     * assume the algorithm parameters must be NULL\n     */\n    p0 = p;\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &asn1_len, MBEDTLS_ASN1_NULL ) ) != 0 )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n    if( p != p0 + 2 )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n    p0 = p;\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &asn1_len, MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n    if( p != p0 + 2 || asn1_len != hashlen )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n    if( memcmp( p, hash, hashlen ) != 0 )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n    p += hashlen;\n\n    if( p != end )\n        return( MBEDTLS_ERR_RSA_VERIFY_FAILED );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_PKCS1_V15 */\n\n/*\n * Do an RSA operation and check the message digest\n */\nint mbedtls_rsa_pkcs1_verify( mbedtls_rsa_context *ctx,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng,\n                      int mode,\n                      mbedtls_md_type_t md_alg,\n                      unsigned int hashlen,\n                      const unsigned char *hash,\n                      const unsigned char *sig )\n{\n    switch( ctx->padding )\n    {\n#if defined(MBEDTLS_PKCS1_V15)\n        case MBEDTLS_RSA_PKCS_V15:\n            return mbedtls_rsa_rsassa_pkcs1_v15_verify( ctx, f_rng, p_rng, mode, md_alg,\n                                                hashlen, hash, sig );\n#endif\n\n#if defined(MBEDTLS_PKCS1_V21)\n        case MBEDTLS_RSA_PKCS_V21:\n            return mbedtls_rsa_rsassa_pss_verify( ctx, f_rng, p_rng, mode, md_alg,\n                                          hashlen, hash, sig );\n#endif\n\n        default:\n            return( MBEDTLS_ERR_RSA_INVALID_PADDING );\n    }\n}\n\n/*\n * Copy the components of an RSA key\n */\nint mbedtls_rsa_copy( mbedtls_rsa_context *dst, const mbedtls_rsa_context *src )\n{\n    int ret;\n\n    dst->ver = src->ver;\n    dst->len = src->len;\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->N, &src->N ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->E, &src->E ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->D, &src->D ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->P, &src->P ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Q, &src->Q ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->DP, &src->DP ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->DQ, &src->DQ ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->QP, &src->QP ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RN, &src->RN ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RP, &src->RP ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->RQ, &src->RQ ) );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Vi, &src->Vi ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &dst->Vf, &src->Vf ) );\n\n    dst->padding = src->padding;\n    dst->hash_id = src->hash_id;\n\ncleanup:\n    if( ret != 0 )\n        mbedtls_rsa_free( dst );\n\n    return( ret );\n}\n\n/*\n * Free the components of an RSA key\n */\nvoid mbedtls_rsa_free( mbedtls_rsa_context *ctx )\n{\n    mbedtls_mpi_free( &ctx->Vi ); mbedtls_mpi_free( &ctx->Vf );\n    mbedtls_mpi_free( &ctx->RQ ); mbedtls_mpi_free( &ctx->RP ); mbedtls_mpi_free( &ctx->RN );\n    mbedtls_mpi_free( &ctx->QP ); mbedtls_mpi_free( &ctx->DQ ); mbedtls_mpi_free( &ctx->DP );\n    mbedtls_mpi_free( &ctx->Q  ); mbedtls_mpi_free( &ctx->P  ); mbedtls_mpi_free( &ctx->D );\n    mbedtls_mpi_free( &ctx->E  ); mbedtls_mpi_free( &ctx->N  );\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_free( &ctx->mutex );\n#endif\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n\n#include \"mbedtls/sha1.h\"\n\n/*\n * Example RSA-1024 keypair, for test purposes\n */\n#define KEY_LEN 128\n\n#define RSA_N   \"9292758453063D803DD603D5E777D788\" \\\n                \"8ED1D5BF35786190FA2F23EBC0848AEA\" \\\n                \"DDA92CA6C3D80B32C4D109BE0F36D6AE\" \\\n                \"7130B9CED7ACDF54CFC7555AC14EEBAB\" \\\n                \"93A89813FBF3C4F8066D2D800F7C38A8\" \\\n                \"1AE31942917403FF4946B0A83D3D3E05\" \\\n                \"EE57C6F5F5606FB5D4BC6CD34EE0801A\" \\\n                \"5E94BB77B07507233A0BC7BAC8F90F79\"\n\n#define RSA_E   \"10001\"\n\n#define RSA_D   \"24BF6185468786FDD303083D25E64EFC\" \\\n                \"66CA472BC44D253102F8B4A9D3BFA750\" \\\n                \"91386C0077937FE33FA3252D28855837\" \\\n                \"AE1B484A8A9A45F7EE8C0C634F99E8CD\" \\\n                \"DF79C5CE07EE72C7F123142198164234\" \\\n                \"CABB724CF78B8173B9F880FC86322407\" \\\n                \"AF1FEDFDDE2BEB674CA15F3E81A1521E\" \\\n                \"071513A1E85B5DFA031F21ECAE91A34D\"\n\n#define RSA_P   \"C36D0EB7FCD285223CFB5AABA5BDA3D8\" \\\n                \"2C01CAD19EA484A87EA4377637E75500\" \\\n                \"FCB2005C5C7DD6EC4AC023CDA285D796\" \\\n                \"C3D9E75E1EFC42488BB4F1D13AC30A57\"\n\n#define RSA_Q   \"C000DF51A7C77AE8D7C7370C1FF55B69\" \\\n                \"E211C2B9E5DB1ED0BF61D0D9899620F4\" \\\n                \"910E4168387E3C30AA1E00C339A79508\" \\\n                \"8452DD96A9A5EA5D9DCA68DA636032AF\"\n\n#define RSA_DP  \"C1ACF567564274FB07A0BBAD5D26E298\" \\\n                \"3C94D22288ACD763FD8E5600ED4A702D\" \\\n                \"F84198A5F06C2E72236AE490C93F07F8\" \\\n                \"3CC559CD27BC2D1CA488811730BB5725\"\n\n#define RSA_DQ  \"4959CBF6F8FEF750AEE6977C155579C7\" \\\n                \"D8AAEA56749EA28623272E4F7D0592AF\" \\\n                \"7C1F1313CAC9471B5C523BFE592F517B\" \\\n                \"407A1BD76C164B93DA2D32A383E58357\"\n\n#define RSA_QP  \"9AE7FBC99546432DF71896FC239EADAE\" \\\n                \"F38D18D2B2F0E2DD275AA977E2BF4411\" \\\n                \"F5A3B2A5D33605AEBBCCBA7FEB9F2D2F\" \\\n                \"A74206CEC169D74BF5A8C50D6F48EA08\"\n\n#define PT_LEN  24\n#define RSA_PT  \"\\xAA\\xBB\\xCC\\x03\\x02\\x01\\x00\\xFF\\xFF\\xFF\\xFF\\xFF\" \\\n                \"\\x11\\x22\\x33\\x0A\\x0B\\x0C\\xCC\\xDD\\xDD\\xDD\\xDD\\xDD\"\n\n#if defined(MBEDTLS_PKCS1_V15)\nstatic int myrand( void *rng_state, unsigned char *output, size_t len )\n{\n#if !defined(__OpenBSD__)\n    size_t i;\n\n    if( rng_state != NULL )\n        rng_state  = NULL;\n\n    for( i = 0; i < len; ++i )\n        output[i] = rand();\n#else\n    if( rng_state != NULL )\n        rng_state = NULL;\n\n    arc4random_buf( output, len );\n#endif /* !OpenBSD */\n\n    return( 0 );\n}\n#endif /* MBEDTLS_PKCS1_V15 */\n\n/*\n * Checkup routine\n */\nint mbedtls_rsa_self_test( int verbose )\n{\n    int ret = 0;\n#if defined(MBEDTLS_PKCS1_V15)\n    size_t len;\n    mbedtls_rsa_context rsa;\n    unsigned char rsa_plaintext[PT_LEN];\n    unsigned char rsa_decrypted[PT_LEN];\n    unsigned char rsa_ciphertext[KEY_LEN];\n#if defined(MBEDTLS_SHA1_C)\n    unsigned char sha1sum[20];\n#endif\n\n    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );\n\n    rsa.len = KEY_LEN;\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.N , 16, RSA_N  ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.E , 16, RSA_E  ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.D , 16, RSA_D  ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.P , 16, RSA_P  ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.Q , 16, RSA_Q  ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.DP, 16, RSA_DP ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.DQ, 16, RSA_DQ ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &rsa.QP, 16, RSA_QP ) );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  RSA key validation: \" );\n\n    if( mbedtls_rsa_check_pubkey(  &rsa ) != 0 ||\n        mbedtls_rsa_check_privkey( &rsa ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( 1 );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n  PKCS#1 encryption : \" );\n\n    memcpy( rsa_plaintext, RSA_PT, PT_LEN );\n\n    if( mbedtls_rsa_pkcs1_encrypt( &rsa, myrand, NULL, MBEDTLS_RSA_PUBLIC, PT_LEN,\n                           rsa_plaintext, rsa_ciphertext ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( 1 );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n  PKCS#1 decryption : \" );\n\n    if( mbedtls_rsa_pkcs1_decrypt( &rsa, myrand, NULL, MBEDTLS_RSA_PRIVATE, &len,\n                           rsa_ciphertext, rsa_decrypted,\n                           sizeof(rsa_decrypted) ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( 1 );\n    }\n\n    if( memcmp( rsa_decrypted, rsa_plaintext, len ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( 1 );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n#if defined(MBEDTLS_SHA1_C)\n    if( verbose != 0 )\n        mbedtls_printf( \"  PKCS#1 data sign  : \" );\n\n    mbedtls_sha1( rsa_plaintext, PT_LEN, sha1sum );\n\n    if( mbedtls_rsa_pkcs1_sign( &rsa, myrand, NULL, MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA1, 0,\n                        sha1sum, rsa_ciphertext ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( 1 );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n  PKCS#1 sig. verify: \" );\n\n    if( mbedtls_rsa_pkcs1_verify( &rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC, MBEDTLS_MD_SHA1, 0,\n                          sha1sum, rsa_ciphertext ) != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( 1 );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n#endif /* MBEDTLS_SHA1_C */\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\ncleanup:\n    mbedtls_rsa_free( &rsa );\n#else /* MBEDTLS_PKCS1_V15 */\n    ((void) verbose);\n#endif /* MBEDTLS_PKCS1_V15 */\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_RSA_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/sha1.c",
    "content": "/*\n *  FIPS-180-1 compliant SHA-1 implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The SHA-1 standard was published by NIST in 1993.\n *\n *  http://www.itl.nist.gov/fipspubs/fip180-1.htm\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SHA1_C)\n\n#include \"mbedtls/sha1.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_SHA1_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;\n}\n\n/*\n * 32-bit integer manipulation macros (big endian)\n */\n#ifndef GET_UINT32_BE\n#define GET_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \\\n        | ( (uint32_t) (b)[(i) + 1] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 2] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 3]       );            \\\n}\n#endif\n\n#ifndef PUT_UINT32_BE\n#define PUT_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n)       );       \\\n}\n#endif\n\nvoid mbedtls_sha1_init( mbedtls_sha1_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_sha1_context ) );\n}\n\nvoid mbedtls_sha1_free( mbedtls_sha1_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_sha1_context ) );\n}\n\nvoid mbedtls_sha1_clone( mbedtls_sha1_context *dst,\n                         const mbedtls_sha1_context *src )\n{\n    *dst = *src;\n}\n\n/*\n * SHA-1 context setup\n */\nvoid mbedtls_sha1_starts( mbedtls_sha1_context *ctx )\n{\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n\n    ctx->state[0] = 0x67452301;\n    ctx->state[1] = 0xEFCDAB89;\n    ctx->state[2] = 0x98BADCFE;\n    ctx->state[3] = 0x10325476;\n    ctx->state[4] = 0xC3D2E1F0;\n}\n\n#if !defined(MBEDTLS_SHA1_PROCESS_ALT)\nvoid mbedtls_sha1_process( mbedtls_sha1_context *ctx, const unsigned char data[64] )\n{\n    uint32_t temp, W[16], A, B, C, D, E;\n\n    GET_UINT32_BE( W[ 0], data,  0 );\n    GET_UINT32_BE( W[ 1], data,  4 );\n    GET_UINT32_BE( W[ 2], data,  8 );\n    GET_UINT32_BE( W[ 3], data, 12 );\n    GET_UINT32_BE( W[ 4], data, 16 );\n    GET_UINT32_BE( W[ 5], data, 20 );\n    GET_UINT32_BE( W[ 6], data, 24 );\n    GET_UINT32_BE( W[ 7], data, 28 );\n    GET_UINT32_BE( W[ 8], data, 32 );\n    GET_UINT32_BE( W[ 9], data, 36 );\n    GET_UINT32_BE( W[10], data, 40 );\n    GET_UINT32_BE( W[11], data, 44 );\n    GET_UINT32_BE( W[12], data, 48 );\n    GET_UINT32_BE( W[13], data, 52 );\n    GET_UINT32_BE( W[14], data, 56 );\n    GET_UINT32_BE( W[15], data, 60 );\n\n#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))\n\n#define R(t)                                            \\\n(                                                       \\\n    temp = W[( t -  3 ) & 0x0F] ^ W[( t - 8 ) & 0x0F] ^ \\\n           W[( t - 14 ) & 0x0F] ^ W[  t       & 0x0F],  \\\n    ( W[t & 0x0F] = S(temp,1) )                         \\\n)\n\n#define P(a,b,c,d,e,x)                                  \\\n{                                                       \\\n    e += S(a,5) + F(b,c,d) + K + x; b = S(b,30);        \\\n}\n\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n    E = ctx->state[4];\n\n#define F(x,y,z) (z ^ (x & (y ^ z)))\n#define K 0x5A827999\n\n    P( A, B, C, D, E, W[0]  );\n    P( E, A, B, C, D, W[1]  );\n    P( D, E, A, B, C, W[2]  );\n    P( C, D, E, A, B, W[3]  );\n    P( B, C, D, E, A, W[4]  );\n    P( A, B, C, D, E, W[5]  );\n    P( E, A, B, C, D, W[6]  );\n    P( D, E, A, B, C, W[7]  );\n    P( C, D, E, A, B, W[8]  );\n    P( B, C, D, E, A, W[9]  );\n    P( A, B, C, D, E, W[10] );\n    P( E, A, B, C, D, W[11] );\n    P( D, E, A, B, C, W[12] );\n    P( C, D, E, A, B, W[13] );\n    P( B, C, D, E, A, W[14] );\n    P( A, B, C, D, E, W[15] );\n    P( E, A, B, C, D, R(16) );\n    P( D, E, A, B, C, R(17) );\n    P( C, D, E, A, B, R(18) );\n    P( B, C, D, E, A, R(19) );\n\n#undef K\n#undef F\n\n#define F(x,y,z) (x ^ y ^ z)\n#define K 0x6ED9EBA1\n\n    P( A, B, C, D, E, R(20) );\n    P( E, A, B, C, D, R(21) );\n    P( D, E, A, B, C, R(22) );\n    P( C, D, E, A, B, R(23) );\n    P( B, C, D, E, A, R(24) );\n    P( A, B, C, D, E, R(25) );\n    P( E, A, B, C, D, R(26) );\n    P( D, E, A, B, C, R(27) );\n    P( C, D, E, A, B, R(28) );\n    P( B, C, D, E, A, R(29) );\n    P( A, B, C, D, E, R(30) );\n    P( E, A, B, C, D, R(31) );\n    P( D, E, A, B, C, R(32) );\n    P( C, D, E, A, B, R(33) );\n    P( B, C, D, E, A, R(34) );\n    P( A, B, C, D, E, R(35) );\n    P( E, A, B, C, D, R(36) );\n    P( D, E, A, B, C, R(37) );\n    P( C, D, E, A, B, R(38) );\n    P( B, C, D, E, A, R(39) );\n\n#undef K\n#undef F\n\n#define F(x,y,z) ((x & y) | (z & (x | y)))\n#define K 0x8F1BBCDC\n\n    P( A, B, C, D, E, R(40) );\n    P( E, A, B, C, D, R(41) );\n    P( D, E, A, B, C, R(42) );\n    P( C, D, E, A, B, R(43) );\n    P( B, C, D, E, A, R(44) );\n    P( A, B, C, D, E, R(45) );\n    P( E, A, B, C, D, R(46) );\n    P( D, E, A, B, C, R(47) );\n    P( C, D, E, A, B, R(48) );\n    P( B, C, D, E, A, R(49) );\n    P( A, B, C, D, E, R(50) );\n    P( E, A, B, C, D, R(51) );\n    P( D, E, A, B, C, R(52) );\n    P( C, D, E, A, B, R(53) );\n    P( B, C, D, E, A, R(54) );\n    P( A, B, C, D, E, R(55) );\n    P( E, A, B, C, D, R(56) );\n    P( D, E, A, B, C, R(57) );\n    P( C, D, E, A, B, R(58) );\n    P( B, C, D, E, A, R(59) );\n\n#undef K\n#undef F\n\n#define F(x,y,z) (x ^ y ^ z)\n#define K 0xCA62C1D6\n\n    P( A, B, C, D, E, R(60) );\n    P( E, A, B, C, D, R(61) );\n    P( D, E, A, B, C, R(62) );\n    P( C, D, E, A, B, R(63) );\n    P( B, C, D, E, A, R(64) );\n    P( A, B, C, D, E, R(65) );\n    P( E, A, B, C, D, R(66) );\n    P( D, E, A, B, C, R(67) );\n    P( C, D, E, A, B, R(68) );\n    P( B, C, D, E, A, R(69) );\n    P( A, B, C, D, E, R(70) );\n    P( E, A, B, C, D, R(71) );\n    P( D, E, A, B, C, R(72) );\n    P( C, D, E, A, B, R(73) );\n    P( B, C, D, E, A, R(74) );\n    P( A, B, C, D, E, R(75) );\n    P( E, A, B, C, D, R(76) );\n    P( D, E, A, B, C, R(77) );\n    P( C, D, E, A, B, R(78) );\n    P( B, C, D, E, A, R(79) );\n\n#undef K\n#undef F\n\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n    ctx->state[4] += E;\n}\n#endif /* !MBEDTLS_SHA1_PROCESS_ALT */\n\n/*\n * SHA-1 process buffer\n */\nvoid mbedtls_sha1_update( mbedtls_sha1_context *ctx, const unsigned char *input, size_t ilen )\n{\n    size_t fill;\n    uint32_t left;\n\n    if( ilen == 0 )\n        return;\n\n    left = ctx->total[0] & 0x3F;\n    fill = 64 - left;\n\n    ctx->total[0] += (uint32_t) ilen;\n    ctx->total[0] &= 0xFFFFFFFF;\n\n    if( ctx->total[0] < (uint32_t) ilen )\n        ctx->total[1]++;\n\n    if( left && ilen >= fill )\n    {\n        memcpy( (void *) (ctx->buffer + left), input, fill );\n        mbedtls_sha1_process( ctx, ctx->buffer );\n        input += fill;\n        ilen  -= fill;\n        left = 0;\n    }\n\n    while( ilen >= 64 )\n    {\n        mbedtls_sha1_process( ctx, input );\n        input += 64;\n        ilen  -= 64;\n    }\n\n    if( ilen > 0 )\n        memcpy( (void *) (ctx->buffer + left), input, ilen );\n}\n\nstatic const unsigned char sha1_padding[64] =\n{\n 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/*\n * SHA-1 final digest\n */\nvoid mbedtls_sha1_finish( mbedtls_sha1_context *ctx, unsigned char output[20] )\n{\n    uint32_t last, padn;\n    uint32_t high, low;\n    unsigned char msglen[8];\n\n    high = ( ctx->total[0] >> 29 )\n         | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n\n    PUT_UINT32_BE( high, msglen, 0 );\n    PUT_UINT32_BE( low,  msglen, 4 );\n\n    last = ctx->total[0] & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n\n    mbedtls_sha1_update( ctx, sha1_padding, padn );\n    mbedtls_sha1_update( ctx, msglen, 8 );\n\n    PUT_UINT32_BE( ctx->state[0], output,  0 );\n    PUT_UINT32_BE( ctx->state[1], output,  4 );\n    PUT_UINT32_BE( ctx->state[2], output,  8 );\n    PUT_UINT32_BE( ctx->state[3], output, 12 );\n    PUT_UINT32_BE( ctx->state[4], output, 16 );\n}\n\n#endif /* !MBEDTLS_SHA1_ALT */\n\n/*\n * output = SHA-1( input buffer )\n */\nvoid mbedtls_sha1( const unsigned char *input, size_t ilen, unsigned char output[20] )\n{\n    mbedtls_sha1_context ctx;\n\n    mbedtls_sha1_init( &ctx );\n    mbedtls_sha1_starts( &ctx );\n    mbedtls_sha1_update( &ctx, input, ilen );\n    mbedtls_sha1_finish( &ctx, output );\n    mbedtls_sha1_free( &ctx );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n/*\n * FIPS-180-1 test vectors\n */\nstatic const unsigned char sha1_test_buf[3][57] =\n{\n    { \"abc\" },\n    { \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\" },\n    { \"\" }\n};\n\nstatic const int sha1_test_buflen[3] =\n{\n    3, 56, 1000\n};\n\nstatic const unsigned char sha1_test_sum[3][20] =\n{\n    { 0xA9, 0x99, 0x3E, 0x36, 0x47, 0x06, 0x81, 0x6A, 0xBA, 0x3E,\n      0x25, 0x71, 0x78, 0x50, 0xC2, 0x6C, 0x9C, 0xD0, 0xD8, 0x9D },\n    { 0x84, 0x98, 0x3E, 0x44, 0x1C, 0x3B, 0xD2, 0x6E, 0xBA, 0xAE,\n      0x4A, 0xA1, 0xF9, 0x51, 0x29, 0xE5, 0xE5, 0x46, 0x70, 0xF1 },\n    { 0x34, 0xAA, 0x97, 0x3C, 0xD4, 0xC4, 0xDA, 0xA4, 0xF6, 0x1E,\n      0xEB, 0x2B, 0xDB, 0xAD, 0x27, 0x31, 0x65, 0x34, 0x01, 0x6F }\n};\n\n/*\n * Checkup routine\n */\nint mbedtls_sha1_self_test( int verbose )\n{\n    int i, j, buflen, ret = 0;\n    unsigned char buf[1024];\n    unsigned char sha1sum[20];\n    mbedtls_sha1_context ctx;\n\n    mbedtls_sha1_init( &ctx );\n\n    /*\n     * SHA-1\n     */\n    for( i = 0; i < 3; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  SHA-1 test #%d: \", i + 1 );\n\n        mbedtls_sha1_starts( &ctx );\n\n        if( i == 2 )\n        {\n            memset( buf, 'a', buflen = 1000 );\n\n            for( j = 0; j < 1000; j++ )\n                mbedtls_sha1_update( &ctx, buf, buflen );\n        }\n        else\n            mbedtls_sha1_update( &ctx, sha1_test_buf[i],\n                               sha1_test_buflen[i] );\n\n        mbedtls_sha1_finish( &ctx, sha1sum );\n\n        if( memcmp( sha1sum, sha1_test_sum[i], 20 ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            ret = 1;\n            goto exit;\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\nexit:\n    mbedtls_sha1_free( &ctx );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_SHA1_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/sha256.c",
    "content": "/*\n *  FIPS-180-2 compliant SHA-256 implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The SHA-256 Secure Hash Standard was published by NIST in 2002.\n *\n *  http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SHA256_C)\n\n#include \"mbedtls/sha256.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_printf printf\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_SHA256_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * 32-bit integer manipulation macros (big endian)\n */\n#ifndef GET_UINT32_BE\n#define GET_UINT32_BE(n,b,i)                            \\\ndo {                                                    \\\n    (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \\\n        | ( (uint32_t) (b)[(i) + 1] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 2] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 3]       );            \\\n} while( 0 )\n#endif\n\n#ifndef PUT_UINT32_BE\n#define PUT_UINT32_BE(n,b,i)                            \\\ndo {                                                    \\\n    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n)       );       \\\n} while( 0 )\n#endif\n\nvoid mbedtls_sha256_init( mbedtls_sha256_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_sha256_context ) );\n}\n\nvoid mbedtls_sha256_free( mbedtls_sha256_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_sha256_context ) );\n}\n\nvoid mbedtls_sha256_clone( mbedtls_sha256_context *dst,\n                           const mbedtls_sha256_context *src )\n{\n    *dst = *src;\n}\n\n/*\n * SHA-256 context setup\n */\nvoid mbedtls_sha256_starts( mbedtls_sha256_context *ctx, int is224 )\n{\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n\n    if( is224 == 0 )\n    {\n        /* SHA-256 */\n        ctx->state[0] = 0x6A09E667;\n        ctx->state[1] = 0xBB67AE85;\n        ctx->state[2] = 0x3C6EF372;\n        ctx->state[3] = 0xA54FF53A;\n        ctx->state[4] = 0x510E527F;\n        ctx->state[5] = 0x9B05688C;\n        ctx->state[6] = 0x1F83D9AB;\n        ctx->state[7] = 0x5BE0CD19;\n    }\n    else\n    {\n        /* SHA-224 */\n        ctx->state[0] = 0xC1059ED8;\n        ctx->state[1] = 0x367CD507;\n        ctx->state[2] = 0x3070DD17;\n        ctx->state[3] = 0xF70E5939;\n        ctx->state[4] = 0xFFC00B31;\n        ctx->state[5] = 0x68581511;\n        ctx->state[6] = 0x64F98FA7;\n        ctx->state[7] = 0xBEFA4FA4;\n    }\n\n    ctx->is224 = is224;\n}\n\n#if !defined(MBEDTLS_SHA256_PROCESS_ALT)\nstatic const uint32_t K[] =\n{\n    0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n    0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n    0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n    0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n    0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n    0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n    0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n    0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n    0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n    0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n    0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n    0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n    0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n    0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n    0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n    0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2,\n};\n\n#define  SHR(x,n) ((x & 0xFFFFFFFF) >> n)\n#define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))\n\n#define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^  SHR(x, 3))\n#define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^  SHR(x,10))\n\n#define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))\n#define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))\n\n#define F0(x,y,z) ((x & y) | (z & (x | y)))\n#define F1(x,y,z) (z ^ (x & (y ^ z)))\n\n#define R(t)                                    \\\n(                                               \\\n    W[t] = S1(W[t -  2]) + W[t -  7] +          \\\n           S0(W[t - 15]) + W[t - 16]            \\\n)\n\n#define P(a,b,c,d,e,f,g,h,x,K)                  \\\n{                                               \\\n    temp1 = h + S3(e) + F1(e,f,g) + K + x;      \\\n    temp2 = S2(a) + F0(a,b,c);                  \\\n    d += temp1; h = temp1 + temp2;              \\\n}\n\nvoid mbedtls_sha256_process( mbedtls_sha256_context *ctx, const unsigned char data[64] )\n{\n    uint32_t temp1, temp2, W[64];\n    uint32_t A[8];\n    unsigned int i;\n\n    for( i = 0; i < 8; i++ )\n        A[i] = ctx->state[i];\n\n#if defined(MBEDTLS_SHA256_SMALLER)\n    for( i = 0; i < 64; i++ )\n    {\n        if( i < 16 )\n            GET_UINT32_BE( W[i], data, 4 * i );\n        else\n            R( i );\n\n        P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i], K[i] );\n\n        temp1 = A[7]; A[7] = A[6]; A[6] = A[5]; A[5] = A[4]; A[4] = A[3];\n        A[3] = A[2]; A[2] = A[1]; A[1] = A[0]; A[0] = temp1;\n    }\n#else /* MBEDTLS_SHA256_SMALLER */\n    for( i = 0; i < 16; i++ )\n        GET_UINT32_BE( W[i], data, 4 * i );\n\n    for( i = 0; i < 16; i += 8 )\n    {\n        P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], W[i+0], K[i+0] );\n        P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], W[i+1], K[i+1] );\n        P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], W[i+2], K[i+2] );\n        P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], W[i+3], K[i+3] );\n        P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], W[i+4], K[i+4] );\n        P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], W[i+5], K[i+5] );\n        P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], W[i+6], K[i+6] );\n        P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], W[i+7], K[i+7] );\n    }\n\n    for( i = 16; i < 64; i += 8 )\n    {\n        P( A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], R(i+0), K[i+0] );\n        P( A[7], A[0], A[1], A[2], A[3], A[4], A[5], A[6], R(i+1), K[i+1] );\n        P( A[6], A[7], A[0], A[1], A[2], A[3], A[4], A[5], R(i+2), K[i+2] );\n        P( A[5], A[6], A[7], A[0], A[1], A[2], A[3], A[4], R(i+3), K[i+3] );\n        P( A[4], A[5], A[6], A[7], A[0], A[1], A[2], A[3], R(i+4), K[i+4] );\n        P( A[3], A[4], A[5], A[6], A[7], A[0], A[1], A[2], R(i+5), K[i+5] );\n        P( A[2], A[3], A[4], A[5], A[6], A[7], A[0], A[1], R(i+6), K[i+6] );\n        P( A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[0], R(i+7), K[i+7] );\n    }\n#endif /* MBEDTLS_SHA256_SMALLER */\n\n    for( i = 0; i < 8; i++ )\n        ctx->state[i] += A[i];\n}\n#endif /* !MBEDTLS_SHA256_PROCESS_ALT */\n\n/*\n * SHA-256 process buffer\n */\nvoid mbedtls_sha256_update( mbedtls_sha256_context *ctx, const unsigned char *input,\n                    size_t ilen )\n{\n    size_t fill;\n    uint32_t left;\n\n    if( ilen == 0 )\n        return;\n\n    left = ctx->total[0] & 0x3F;\n    fill = 64 - left;\n\n    ctx->total[0] += (uint32_t) ilen;\n    ctx->total[0] &= 0xFFFFFFFF;\n\n    if( ctx->total[0] < (uint32_t) ilen )\n        ctx->total[1]++;\n\n    if( left && ilen >= fill )\n    {\n        memcpy( (void *) (ctx->buffer + left), input, fill );\n        mbedtls_sha256_process( ctx, ctx->buffer );\n        input += fill;\n        ilen  -= fill;\n        left = 0;\n    }\n\n    while( ilen >= 64 )\n    {\n        mbedtls_sha256_process( ctx, input );\n        input += 64;\n        ilen  -= 64;\n    }\n\n    if( ilen > 0 )\n        memcpy( (void *) (ctx->buffer + left), input, ilen );\n}\n\nstatic const unsigned char sha256_padding[64] =\n{\n 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/*\n * SHA-256 final digest\n */\nvoid mbedtls_sha256_finish( mbedtls_sha256_context *ctx, unsigned char output[32] )\n{\n    uint32_t last, padn;\n    uint32_t high, low;\n    unsigned char msglen[8];\n\n    high = ( ctx->total[0] >> 29 )\n         | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n\n    PUT_UINT32_BE( high, msglen, 0 );\n    PUT_UINT32_BE( low,  msglen, 4 );\n\n    last = ctx->total[0] & 0x3F;\n    padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );\n\n    mbedtls_sha256_update( ctx, sha256_padding, padn );\n    mbedtls_sha256_update( ctx, msglen, 8 );\n\n    PUT_UINT32_BE( ctx->state[0], output,  0 );\n    PUT_UINT32_BE( ctx->state[1], output,  4 );\n    PUT_UINT32_BE( ctx->state[2], output,  8 );\n    PUT_UINT32_BE( ctx->state[3], output, 12 );\n    PUT_UINT32_BE( ctx->state[4], output, 16 );\n    PUT_UINT32_BE( ctx->state[5], output, 20 );\n    PUT_UINT32_BE( ctx->state[6], output, 24 );\n\n    if( ctx->is224 == 0 )\n        PUT_UINT32_BE( ctx->state[7], output, 28 );\n}\n\n#endif /* !MBEDTLS_SHA256_ALT */\n\n/*\n * output = SHA-256( input buffer )\n */\nvoid mbedtls_sha256( const unsigned char *input, size_t ilen,\n             unsigned char output[32], int is224 )\n{\n    mbedtls_sha256_context ctx;\n\n    mbedtls_sha256_init( &ctx );\n    mbedtls_sha256_starts( &ctx, is224 );\n    mbedtls_sha256_update( &ctx, input, ilen );\n    mbedtls_sha256_finish( &ctx, output );\n    mbedtls_sha256_free( &ctx );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n/*\n * FIPS-180-2 test vectors\n */\nstatic const unsigned char sha256_test_buf[3][57] =\n{\n    { \"abc\" },\n    { \"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq\" },\n    { \"\" }\n};\n\nstatic const int sha256_test_buflen[3] =\n{\n    3, 56, 1000\n};\n\nstatic const unsigned char sha256_test_sum[6][32] =\n{\n    /*\n     * SHA-224 test vectors\n     */\n    { 0x23, 0x09, 0x7D, 0x22, 0x34, 0x05, 0xD8, 0x22,\n      0x86, 0x42, 0xA4, 0x77, 0xBD, 0xA2, 0x55, 0xB3,\n      0x2A, 0xAD, 0xBC, 0xE4, 0xBD, 0xA0, 0xB3, 0xF7,\n      0xE3, 0x6C, 0x9D, 0xA7 },\n    { 0x75, 0x38, 0x8B, 0x16, 0x51, 0x27, 0x76, 0xCC,\n      0x5D, 0xBA, 0x5D, 0xA1, 0xFD, 0x89, 0x01, 0x50,\n      0xB0, 0xC6, 0x45, 0x5C, 0xB4, 0xF5, 0x8B, 0x19,\n      0x52, 0x52, 0x25, 0x25 },\n    { 0x20, 0x79, 0x46, 0x55, 0x98, 0x0C, 0x91, 0xD8,\n      0xBB, 0xB4, 0xC1, 0xEA, 0x97, 0x61, 0x8A, 0x4B,\n      0xF0, 0x3F, 0x42, 0x58, 0x19, 0x48, 0xB2, 0xEE,\n      0x4E, 0xE7, 0xAD, 0x67 },\n\n    /*\n     * SHA-256 test vectors\n     */\n    { 0xBA, 0x78, 0x16, 0xBF, 0x8F, 0x01, 0xCF, 0xEA,\n      0x41, 0x41, 0x40, 0xDE, 0x5D, 0xAE, 0x22, 0x23,\n      0xB0, 0x03, 0x61, 0xA3, 0x96, 0x17, 0x7A, 0x9C,\n      0xB4, 0x10, 0xFF, 0x61, 0xF2, 0x00, 0x15, 0xAD },\n    { 0x24, 0x8D, 0x6A, 0x61, 0xD2, 0x06, 0x38, 0xB8,\n      0xE5, 0xC0, 0x26, 0x93, 0x0C, 0x3E, 0x60, 0x39,\n      0xA3, 0x3C, 0xE4, 0x59, 0x64, 0xFF, 0x21, 0x67,\n      0xF6, 0xEC, 0xED, 0xD4, 0x19, 0xDB, 0x06, 0xC1 },\n    { 0xCD, 0xC7, 0x6E, 0x5C, 0x99, 0x14, 0xFB, 0x92,\n      0x81, 0xA1, 0xC7, 0xE2, 0x84, 0xD7, 0x3E, 0x67,\n      0xF1, 0x80, 0x9A, 0x48, 0xA4, 0x97, 0x20, 0x0E,\n      0x04, 0x6D, 0x39, 0xCC, 0xC7, 0x11, 0x2C, 0xD0 }\n};\n\n/*\n * Checkup routine\n */\nint mbedtls_sha256_self_test( int verbose )\n{\n    int i, j, k, buflen, ret = 0;\n    unsigned char *buf;\n    unsigned char sha256sum[32];\n    mbedtls_sha256_context ctx;\n\n    buf = mbedtls_calloc( 1024, sizeof(unsigned char) );\n    if( NULL == buf )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"Buffer allocation failed\\n\" );\n\n        return( 1 );\n    }\n\n    mbedtls_sha256_init( &ctx );\n\n    for( i = 0; i < 6; i++ )\n    {\n        j = i % 3;\n        k = i < 3;\n\n        if( verbose != 0 )\n            mbedtls_printf( \"  SHA-%d test #%d: \", 256 - k * 32, j + 1 );\n\n        mbedtls_sha256_starts( &ctx, k );\n\n        if( j == 2 )\n        {\n            memset( buf, 'a', buflen = 1000 );\n\n            for( j = 0; j < 1000; j++ )\n                mbedtls_sha256_update( &ctx, buf, buflen );\n        }\n        else\n            mbedtls_sha256_update( &ctx, sha256_test_buf[j],\n                                 sha256_test_buflen[j] );\n\n        mbedtls_sha256_finish( &ctx, sha256sum );\n\n        if( memcmp( sha256sum, sha256_test_sum[i], 32 - k * 4 ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            ret = 1;\n            goto exit;\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\nexit:\n    mbedtls_sha256_free( &ctx );\n    mbedtls_free( buf );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_SHA256_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/sha512.c",
    "content": "/*\n *  FIPS-180-2 compliant SHA-384/512 implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The SHA-512 Secure Hash Standard was published by NIST in 2002.\n *\n *  http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\n\n#include \"mbedtls/sha512.h\"\n\n#if defined(_MSC_VER) || defined(__WATCOMC__)\n  #define UL64(x) x##ui64\n#else\n  #define UL64(x) x##ULL\n#endif\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_printf printf\n#define mbedtls_calloc    calloc\n#define mbedtls_free       free\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_SHA512_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * 64-bit integer manipulation macros (big endian)\n */\n#ifndef GET_UINT64_BE\n#define GET_UINT64_BE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint64_t) (b)[(i)    ] << 56 )       \\\n        | ( (uint64_t) (b)[(i) + 1] << 48 )       \\\n        | ( (uint64_t) (b)[(i) + 2] << 40 )       \\\n        | ( (uint64_t) (b)[(i) + 3] << 32 )       \\\n        | ( (uint64_t) (b)[(i) + 4] << 24 )       \\\n        | ( (uint64_t) (b)[(i) + 5] << 16 )       \\\n        | ( (uint64_t) (b)[(i) + 6] <<  8 )       \\\n        | ( (uint64_t) (b)[(i) + 7]       );      \\\n}\n#endif /* GET_UINT64_BE */\n\n#ifndef PUT_UINT64_BE\n#define PUT_UINT64_BE(n,b,i)                            \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n) >> 56 );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >> 48 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >> 40 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n) >> 32 );       \\\n    (b)[(i) + 4] = (unsigned char) ( (n) >> 24 );       \\\n    (b)[(i) + 5] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 6] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 7] = (unsigned char) ( (n)       );       \\\n}\n#endif /* PUT_UINT64_BE */\n\nvoid mbedtls_sha512_init( mbedtls_sha512_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_sha512_context ) );\n}\n\nvoid mbedtls_sha512_free( mbedtls_sha512_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_sha512_context ) );\n}\n\nvoid mbedtls_sha512_clone( mbedtls_sha512_context *dst,\n                           const mbedtls_sha512_context *src )\n{\n    *dst = *src;\n}\n\n/*\n * SHA-512 context setup\n */\nvoid mbedtls_sha512_starts( mbedtls_sha512_context *ctx, int is384 )\n{\n    ctx->total[0] = 0;\n    ctx->total[1] = 0;\n\n    if( is384 == 0 )\n    {\n        /* SHA-512 */\n        ctx->state[0] = UL64(0x6A09E667F3BCC908);\n        ctx->state[1] = UL64(0xBB67AE8584CAA73B);\n        ctx->state[2] = UL64(0x3C6EF372FE94F82B);\n        ctx->state[3] = UL64(0xA54FF53A5F1D36F1);\n        ctx->state[4] = UL64(0x510E527FADE682D1);\n        ctx->state[5] = UL64(0x9B05688C2B3E6C1F);\n        ctx->state[6] = UL64(0x1F83D9ABFB41BD6B);\n        ctx->state[7] = UL64(0x5BE0CD19137E2179);\n    }\n    else\n    {\n        /* SHA-384 */\n        ctx->state[0] = UL64(0xCBBB9D5DC1059ED8);\n        ctx->state[1] = UL64(0x629A292A367CD507);\n        ctx->state[2] = UL64(0x9159015A3070DD17);\n        ctx->state[3] = UL64(0x152FECD8F70E5939);\n        ctx->state[4] = UL64(0x67332667FFC00B31);\n        ctx->state[5] = UL64(0x8EB44A8768581511);\n        ctx->state[6] = UL64(0xDB0C2E0D64F98FA7);\n        ctx->state[7] = UL64(0x47B5481DBEFA4FA4);\n    }\n\n    ctx->is384 = is384;\n}\n\n#if !defined(MBEDTLS_SHA512_PROCESS_ALT)\n\n/*\n * Round constants\n */\nstatic const uint64_t K[80] =\n{\n    UL64(0x428A2F98D728AE22),  UL64(0x7137449123EF65CD),\n    UL64(0xB5C0FBCFEC4D3B2F),  UL64(0xE9B5DBA58189DBBC),\n    UL64(0x3956C25BF348B538),  UL64(0x59F111F1B605D019),\n    UL64(0x923F82A4AF194F9B),  UL64(0xAB1C5ED5DA6D8118),\n    UL64(0xD807AA98A3030242),  UL64(0x12835B0145706FBE),\n    UL64(0x243185BE4EE4B28C),  UL64(0x550C7DC3D5FFB4E2),\n    UL64(0x72BE5D74F27B896F),  UL64(0x80DEB1FE3B1696B1),\n    UL64(0x9BDC06A725C71235),  UL64(0xC19BF174CF692694),\n    UL64(0xE49B69C19EF14AD2),  UL64(0xEFBE4786384F25E3),\n    UL64(0x0FC19DC68B8CD5B5),  UL64(0x240CA1CC77AC9C65),\n    UL64(0x2DE92C6F592B0275),  UL64(0x4A7484AA6EA6E483),\n    UL64(0x5CB0A9DCBD41FBD4),  UL64(0x76F988DA831153B5),\n    UL64(0x983E5152EE66DFAB),  UL64(0xA831C66D2DB43210),\n    UL64(0xB00327C898FB213F),  UL64(0xBF597FC7BEEF0EE4),\n    UL64(0xC6E00BF33DA88FC2),  UL64(0xD5A79147930AA725),\n    UL64(0x06CA6351E003826F),  UL64(0x142929670A0E6E70),\n    UL64(0x27B70A8546D22FFC),  UL64(0x2E1B21385C26C926),\n    UL64(0x4D2C6DFC5AC42AED),  UL64(0x53380D139D95B3DF),\n    UL64(0x650A73548BAF63DE),  UL64(0x766A0ABB3C77B2A8),\n    UL64(0x81C2C92E47EDAEE6),  UL64(0x92722C851482353B),\n    UL64(0xA2BFE8A14CF10364),  UL64(0xA81A664BBC423001),\n    UL64(0xC24B8B70D0F89791),  UL64(0xC76C51A30654BE30),\n    UL64(0xD192E819D6EF5218),  UL64(0xD69906245565A910),\n    UL64(0xF40E35855771202A),  UL64(0x106AA07032BBD1B8),\n    UL64(0x19A4C116B8D2D0C8),  UL64(0x1E376C085141AB53),\n    UL64(0x2748774CDF8EEB99),  UL64(0x34B0BCB5E19B48A8),\n    UL64(0x391C0CB3C5C95A63),  UL64(0x4ED8AA4AE3418ACB),\n    UL64(0x5B9CCA4F7763E373),  UL64(0x682E6FF3D6B2B8A3),\n    UL64(0x748F82EE5DEFB2FC),  UL64(0x78A5636F43172F60),\n    UL64(0x84C87814A1F0AB72),  UL64(0x8CC702081A6439EC),\n    UL64(0x90BEFFFA23631E28),  UL64(0xA4506CEBDE82BDE9),\n    UL64(0xBEF9A3F7B2C67915),  UL64(0xC67178F2E372532B),\n    UL64(0xCA273ECEEA26619C),  UL64(0xD186B8C721C0C207),\n    UL64(0xEADA7DD6CDE0EB1E),  UL64(0xF57D4F7FEE6ED178),\n    UL64(0x06F067AA72176FBA),  UL64(0x0A637DC5A2C898A6),\n    UL64(0x113F9804BEF90DAE),  UL64(0x1B710B35131C471B),\n    UL64(0x28DB77F523047D84),  UL64(0x32CAAB7B40C72493),\n    UL64(0x3C9EBE0A15C9BEBC),  UL64(0x431D67C49C100D4C),\n    UL64(0x4CC5D4BECB3E42B6),  UL64(0x597F299CFC657E2A),\n    UL64(0x5FCB6FAB3AD6FAEC),  UL64(0x6C44198C4A475817)\n};\n\nvoid mbedtls_sha512_process( mbedtls_sha512_context *ctx, const unsigned char data[128] )\n{\n    int i;\n    uint64_t temp1, temp2, W[80];\n    uint64_t A, B, C, D, E, F, G, H;\n\n#define  SHR(x,n) (x >> n)\n#define ROTR(x,n) (SHR(x,n) | (x << (64 - n)))\n\n#define S0(x) (ROTR(x, 1) ^ ROTR(x, 8) ^  SHR(x, 7))\n#define S1(x) (ROTR(x,19) ^ ROTR(x,61) ^  SHR(x, 6))\n\n#define S2(x) (ROTR(x,28) ^ ROTR(x,34) ^ ROTR(x,39))\n#define S3(x) (ROTR(x,14) ^ ROTR(x,18) ^ ROTR(x,41))\n\n#define F0(x,y,z) ((x & y) | (z & (x | y)))\n#define F1(x,y,z) (z ^ (x & (y ^ z)))\n\n#define P(a,b,c,d,e,f,g,h,x,K)                  \\\n{                                               \\\n    temp1 = h + S3(e) + F1(e,f,g) + K + x;      \\\n    temp2 = S2(a) + F0(a,b,c);                  \\\n    d += temp1; h = temp1 + temp2;              \\\n}\n\n    for( i = 0; i < 16; i++ )\n    {\n        GET_UINT64_BE( W[i], data, i << 3 );\n    }\n\n    for( ; i < 80; i++ )\n    {\n        W[i] = S1(W[i -  2]) + W[i -  7] +\n               S0(W[i - 15]) + W[i - 16];\n    }\n\n    A = ctx->state[0];\n    B = ctx->state[1];\n    C = ctx->state[2];\n    D = ctx->state[3];\n    E = ctx->state[4];\n    F = ctx->state[5];\n    G = ctx->state[6];\n    H = ctx->state[7];\n    i = 0;\n\n    do\n    {\n        P( A, B, C, D, E, F, G, H, W[i], K[i] ); i++;\n        P( H, A, B, C, D, E, F, G, W[i], K[i] ); i++;\n        P( G, H, A, B, C, D, E, F, W[i], K[i] ); i++;\n        P( F, G, H, A, B, C, D, E, W[i], K[i] ); i++;\n        P( E, F, G, H, A, B, C, D, W[i], K[i] ); i++;\n        P( D, E, F, G, H, A, B, C, W[i], K[i] ); i++;\n        P( C, D, E, F, G, H, A, B, W[i], K[i] ); i++;\n        P( B, C, D, E, F, G, H, A, W[i], K[i] ); i++;\n    }\n    while( i < 80 );\n\n    ctx->state[0] += A;\n    ctx->state[1] += B;\n    ctx->state[2] += C;\n    ctx->state[3] += D;\n    ctx->state[4] += E;\n    ctx->state[5] += F;\n    ctx->state[6] += G;\n    ctx->state[7] += H;\n}\n#endif /* !MBEDTLS_SHA512_PROCESS_ALT */\n\n/*\n * SHA-512 process buffer\n */\nvoid mbedtls_sha512_update( mbedtls_sha512_context *ctx, const unsigned char *input,\n                    size_t ilen )\n{\n    size_t fill;\n    unsigned int left;\n\n    if( ilen == 0 )\n        return;\n\n    left = (unsigned int) (ctx->total[0] & 0x7F);\n    fill = 128 - left;\n\n    ctx->total[0] += (uint64_t) ilen;\n\n    if( ctx->total[0] < (uint64_t) ilen )\n        ctx->total[1]++;\n\n    if( left && ilen >= fill )\n    {\n        memcpy( (void *) (ctx->buffer + left), input, fill );\n        mbedtls_sha512_process( ctx, ctx->buffer );\n        input += fill;\n        ilen  -= fill;\n        left = 0;\n    }\n\n    while( ilen >= 128 )\n    {\n        mbedtls_sha512_process( ctx, input );\n        input += 128;\n        ilen  -= 128;\n    }\n\n    if( ilen > 0 )\n        memcpy( (void *) (ctx->buffer + left), input, ilen );\n}\n\nstatic const unsigned char sha512_padding[128] =\n{\n 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\n/*\n * SHA-512 final digest\n */\nvoid mbedtls_sha512_finish( mbedtls_sha512_context *ctx, unsigned char output[64] )\n{\n    size_t last, padn;\n    uint64_t high, low;\n    unsigned char msglen[16];\n\n    high = ( ctx->total[0] >> 61 )\n         | ( ctx->total[1] <<  3 );\n    low  = ( ctx->total[0] <<  3 );\n\n    PUT_UINT64_BE( high, msglen, 0 );\n    PUT_UINT64_BE( low,  msglen, 8 );\n\n    last = (size_t)( ctx->total[0] & 0x7F );\n    padn = ( last < 112 ) ? ( 112 - last ) : ( 240 - last );\n\n    mbedtls_sha512_update( ctx, sha512_padding, padn );\n    mbedtls_sha512_update( ctx, msglen, 16 );\n\n    PUT_UINT64_BE( ctx->state[0], output,  0 );\n    PUT_UINT64_BE( ctx->state[1], output,  8 );\n    PUT_UINT64_BE( ctx->state[2], output, 16 );\n    PUT_UINT64_BE( ctx->state[3], output, 24 );\n    PUT_UINT64_BE( ctx->state[4], output, 32 );\n    PUT_UINT64_BE( ctx->state[5], output, 40 );\n\n    if( ctx->is384 == 0 )\n    {\n        PUT_UINT64_BE( ctx->state[6], output, 48 );\n        PUT_UINT64_BE( ctx->state[7], output, 56 );\n    }\n}\n\n#endif /* !MBEDTLS_SHA512_ALT */\n\n/*\n * output = SHA-512( input buffer )\n */\nvoid mbedtls_sha512( const unsigned char *input, size_t ilen,\n             unsigned char output[64], int is384 )\n{\n    mbedtls_sha512_context ctx;\n\n    mbedtls_sha512_init( &ctx );\n    mbedtls_sha512_starts( &ctx, is384 );\n    mbedtls_sha512_update( &ctx, input, ilen );\n    mbedtls_sha512_finish( &ctx, output );\n    mbedtls_sha512_free( &ctx );\n}\n\n#if defined(MBEDTLS_SELF_TEST)\n\n/*\n * FIPS-180-2 test vectors\n */\nstatic const unsigned char sha512_test_buf[3][113] =\n{\n    { \"abc\" },\n    { \"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn\"\n      \"hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu\" },\n    { \"\" }\n};\n\nstatic const int sha512_test_buflen[3] =\n{\n    3, 112, 1000\n};\n\nstatic const unsigned char sha512_test_sum[6][64] =\n{\n    /*\n     * SHA-384 test vectors\n     */\n    { 0xCB, 0x00, 0x75, 0x3F, 0x45, 0xA3, 0x5E, 0x8B,\n      0xB5, 0xA0, 0x3D, 0x69, 0x9A, 0xC6, 0x50, 0x07,\n      0x27, 0x2C, 0x32, 0xAB, 0x0E, 0xDE, 0xD1, 0x63,\n      0x1A, 0x8B, 0x60, 0x5A, 0x43, 0xFF, 0x5B, 0xED,\n      0x80, 0x86, 0x07, 0x2B, 0xA1, 0xE7, 0xCC, 0x23,\n      0x58, 0xBA, 0xEC, 0xA1, 0x34, 0xC8, 0x25, 0xA7 },\n    { 0x09, 0x33, 0x0C, 0x33, 0xF7, 0x11, 0x47, 0xE8,\n      0x3D, 0x19, 0x2F, 0xC7, 0x82, 0xCD, 0x1B, 0x47,\n      0x53, 0x11, 0x1B, 0x17, 0x3B, 0x3B, 0x05, 0xD2,\n      0x2F, 0xA0, 0x80, 0x86, 0xE3, 0xB0, 0xF7, 0x12,\n      0xFC, 0xC7, 0xC7, 0x1A, 0x55, 0x7E, 0x2D, 0xB9,\n      0x66, 0xC3, 0xE9, 0xFA, 0x91, 0x74, 0x60, 0x39 },\n    { 0x9D, 0x0E, 0x18, 0x09, 0x71, 0x64, 0x74, 0xCB,\n      0x08, 0x6E, 0x83, 0x4E, 0x31, 0x0A, 0x4A, 0x1C,\n      0xED, 0x14, 0x9E, 0x9C, 0x00, 0xF2, 0x48, 0x52,\n      0x79, 0x72, 0xCE, 0xC5, 0x70, 0x4C, 0x2A, 0x5B,\n      0x07, 0xB8, 0xB3, 0xDC, 0x38, 0xEC, 0xC4, 0xEB,\n      0xAE, 0x97, 0xDD, 0xD8, 0x7F, 0x3D, 0x89, 0x85 },\n\n    /*\n     * SHA-512 test vectors\n     */\n    { 0xDD, 0xAF, 0x35, 0xA1, 0x93, 0x61, 0x7A, 0xBA,\n      0xCC, 0x41, 0x73, 0x49, 0xAE, 0x20, 0x41, 0x31,\n      0x12, 0xE6, 0xFA, 0x4E, 0x89, 0xA9, 0x7E, 0xA2,\n      0x0A, 0x9E, 0xEE, 0xE6, 0x4B, 0x55, 0xD3, 0x9A,\n      0x21, 0x92, 0x99, 0x2A, 0x27, 0x4F, 0xC1, 0xA8,\n      0x36, 0xBA, 0x3C, 0x23, 0xA3, 0xFE, 0xEB, 0xBD,\n      0x45, 0x4D, 0x44, 0x23, 0x64, 0x3C, 0xE8, 0x0E,\n      0x2A, 0x9A, 0xC9, 0x4F, 0xA5, 0x4C, 0xA4, 0x9F },\n    { 0x8E, 0x95, 0x9B, 0x75, 0xDA, 0xE3, 0x13, 0xDA,\n      0x8C, 0xF4, 0xF7, 0x28, 0x14, 0xFC, 0x14, 0x3F,\n      0x8F, 0x77, 0x79, 0xC6, 0xEB, 0x9F, 0x7F, 0xA1,\n      0x72, 0x99, 0xAE, 0xAD, 0xB6, 0x88, 0x90, 0x18,\n      0x50, 0x1D, 0x28, 0x9E, 0x49, 0x00, 0xF7, 0xE4,\n      0x33, 0x1B, 0x99, 0xDE, 0xC4, 0xB5, 0x43, 0x3A,\n      0xC7, 0xD3, 0x29, 0xEE, 0xB6, 0xDD, 0x26, 0x54,\n      0x5E, 0x96, 0xE5, 0x5B, 0x87, 0x4B, 0xE9, 0x09 },\n    { 0xE7, 0x18, 0x48, 0x3D, 0x0C, 0xE7, 0x69, 0x64,\n      0x4E, 0x2E, 0x42, 0xC7, 0xBC, 0x15, 0xB4, 0x63,\n      0x8E, 0x1F, 0x98, 0xB1, 0x3B, 0x20, 0x44, 0x28,\n      0x56, 0x32, 0xA8, 0x03, 0xAF, 0xA9, 0x73, 0xEB,\n      0xDE, 0x0F, 0xF2, 0x44, 0x87, 0x7E, 0xA6, 0x0A,\n      0x4C, 0xB0, 0x43, 0x2C, 0xE5, 0x77, 0xC3, 0x1B,\n      0xEB, 0x00, 0x9C, 0x5C, 0x2C, 0x49, 0xAA, 0x2E,\n      0x4E, 0xAD, 0xB2, 0x17, 0xAD, 0x8C, 0xC0, 0x9B }\n};\n\n/*\n * Checkup routine\n */\nint mbedtls_sha512_self_test( int verbose )\n{\n    int i, j, k, buflen, ret = 0;\n    unsigned char *buf;\n    unsigned char sha512sum[64];\n    mbedtls_sha512_context ctx;\n\n    buf = mbedtls_calloc( 1024, sizeof(unsigned char) );\n    if( NULL == buf )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"Buffer allocation failed\\n\" );\n\n        return( 1 );\n    }\n\n    mbedtls_sha512_init( &ctx );\n\n    for( i = 0; i < 6; i++ )\n    {\n        j = i % 3;\n        k = i < 3;\n\n        if( verbose != 0 )\n            mbedtls_printf( \"  SHA-%d test #%d: \", 512 - k * 128, j + 1 );\n\n        mbedtls_sha512_starts( &ctx, k );\n\n        if( j == 2 )\n        {\n            memset( buf, 'a', buflen = 1000 );\n\n            for( j = 0; j < 1000; j++ )\n                mbedtls_sha512_update( &ctx, buf, buflen );\n        }\n        else\n            mbedtls_sha512_update( &ctx, sha512_test_buf[j],\n                                 sha512_test_buflen[j] );\n\n        mbedtls_sha512_finish( &ctx, sha512sum );\n\n        if( memcmp( sha512sum, sha512_test_sum[i], 64 - k * 16 ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            ret = 1;\n            goto exit;\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\nexit:\n    mbedtls_sha512_free( &ctx );\n    mbedtls_free( buf );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_SHA512_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ssl_cache.c",
    "content": "/*\n *  SSL session cache implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * These session callbacks use a simple chained list\n * to store and retrieve the session information.\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free      free\n#endif\n\n#include \"mbedtls/ssl_cache.h\"\n\n#include <string.h>\n\nvoid mbedtls_ssl_cache_init( mbedtls_ssl_cache_context *cache )\n{\n    memset( cache, 0, sizeof( mbedtls_ssl_cache_context ) );\n\n    cache->timeout = MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT;\n    cache->max_entries = MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES;\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_init( &cache->mutex );\n#endif\n}\n\nint mbedtls_ssl_cache_get( void *data, mbedtls_ssl_session *session )\n{\n    int ret = 1;\n#if defined(MBEDTLS_HAVE_TIME)\n    mbedtls_time_t t = mbedtls_time( NULL );\n#endif\n    mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data;\n    mbedtls_ssl_cache_entry *cur, *entry;\n\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_lock( &cache->mutex ) != 0 )\n        return( 1 );\n#endif\n\n    cur = cache->chain;\n    entry = NULL;\n\n    while( cur != NULL )\n    {\n        entry = cur;\n        cur = cur->next;\n\n#if defined(MBEDTLS_HAVE_TIME)\n        if( cache->timeout != 0 &&\n            (int) ( t - entry->timestamp ) > cache->timeout )\n            continue;\n#endif\n\n        if( session->ciphersuite != entry->session.ciphersuite ||\n            session->compression != entry->session.compression ||\n            session->id_len != entry->session.id_len )\n            continue;\n\n        if( memcmp( session->id, entry->session.id,\n                    entry->session.id_len ) != 0 )\n            continue;\n\n        memcpy( session->master, entry->session.master, 48 );\n\n        session->verify_result = entry->session.verify_result;\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n        /*\n         * Restore peer certificate (without rest of the original chain)\n         */\n        if( entry->peer_cert.p != NULL )\n        {\n            if( ( session->peer_cert = mbedtls_calloc( 1,\n                                 sizeof(mbedtls_x509_crt) ) ) == NULL )\n            {\n                ret = 1;\n                goto exit;\n            }\n\n            mbedtls_x509_crt_init( session->peer_cert );\n            if( mbedtls_x509_crt_parse( session->peer_cert, entry->peer_cert.p,\n                                entry->peer_cert.len ) != 0 )\n            {\n                mbedtls_free( session->peer_cert );\n                session->peer_cert = NULL;\n                ret = 1;\n                goto exit;\n            }\n        }\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n        ret = 0;\n        goto exit;\n    }\n\nexit:\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &cache->mutex ) != 0 )\n        ret = 1;\n#endif\n\n    return( ret );\n}\n\nint mbedtls_ssl_cache_set( void *data, const mbedtls_ssl_session *session )\n{\n    int ret = 1;\n#if defined(MBEDTLS_HAVE_TIME)\n    mbedtls_time_t t = mbedtls_time( NULL ), oldest = 0;\n    mbedtls_ssl_cache_entry *old = NULL;\n#endif\n    mbedtls_ssl_cache_context *cache = (mbedtls_ssl_cache_context *) data;\n    mbedtls_ssl_cache_entry *cur, *prv;\n    int count = 0;\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &cache->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    cur = cache->chain;\n    prv = NULL;\n\n    while( cur != NULL )\n    {\n        count++;\n\n#if defined(MBEDTLS_HAVE_TIME)\n        if( cache->timeout != 0 &&\n            (int) ( t - cur->timestamp ) > cache->timeout )\n        {\n            cur->timestamp = t;\n            break; /* expired, reuse this slot, update timestamp */\n        }\n#endif\n\n        if( memcmp( session->id, cur->session.id, cur->session.id_len ) == 0 )\n            break; /* client reconnected, keep timestamp for session id */\n\n#if defined(MBEDTLS_HAVE_TIME)\n        if( oldest == 0 || cur->timestamp < oldest )\n        {\n            oldest = cur->timestamp;\n            old = cur;\n        }\n#endif\n\n        prv = cur;\n        cur = cur->next;\n    }\n\n    if( cur == NULL )\n    {\n#if defined(MBEDTLS_HAVE_TIME)\n        /*\n         * Reuse oldest entry if max_entries reached\n         */\n        if( count >= cache->max_entries )\n        {\n            if( old == NULL )\n            {\n                ret = 1;\n                goto exit;\n            }\n\n            cur = old;\n        }\n#else /* MBEDTLS_HAVE_TIME */\n        /*\n         * Reuse first entry in chain if max_entries reached,\n         * but move to last place\n         */\n        if( count >= cache->max_entries )\n        {\n            if( cache->chain == NULL )\n            {\n                ret = 1;\n                goto exit;\n            }\n\n            cur = cache->chain;\n            cache->chain = cur->next;\n            cur->next = NULL;\n            prv->next = cur;\n        }\n#endif /* MBEDTLS_HAVE_TIME */\n        else\n        {\n            /*\n             * max_entries not reached, create new entry\n             */\n            cur = mbedtls_calloc( 1, sizeof(mbedtls_ssl_cache_entry) );\n            if( cur == NULL )\n            {\n                ret = 1;\n                goto exit;\n            }\n\n            if( prv == NULL )\n                cache->chain = cur;\n            else\n                prv->next = cur;\n        }\n\n#if defined(MBEDTLS_HAVE_TIME)\n        cur->timestamp = t;\n#endif\n    }\n\n    memcpy( &cur->session, session, sizeof( mbedtls_ssl_session ) );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    /*\n     * If we're reusing an entry, free its certificate first\n     */\n    if( cur->peer_cert.p != NULL )\n    {\n        mbedtls_free( cur->peer_cert.p );\n        memset( &cur->peer_cert, 0, sizeof(mbedtls_x509_buf) );\n    }\n\n    /*\n     * Store peer certificate\n     */\n    if( session->peer_cert != NULL )\n    {\n        cur->peer_cert.p = mbedtls_calloc( 1, session->peer_cert->raw.len );\n        if( cur->peer_cert.p == NULL )\n        {\n            ret = 1;\n            goto exit;\n        }\n\n        memcpy( cur->peer_cert.p, session->peer_cert->raw.p,\n                session->peer_cert->raw.len );\n        cur->peer_cert.len = session->peer_cert->raw.len;\n\n        cur->session.peer_cert = NULL;\n    }\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n    ret = 0;\n\nexit:\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &cache->mutex ) != 0 )\n        ret = 1;\n#endif\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_HAVE_TIME)\nvoid mbedtls_ssl_cache_set_timeout( mbedtls_ssl_cache_context *cache, int timeout )\n{\n    if( timeout < 0 ) timeout = 0;\n\n    cache->timeout = timeout;\n}\n#endif /* MBEDTLS_HAVE_TIME */\n\nvoid mbedtls_ssl_cache_set_max_entries( mbedtls_ssl_cache_context *cache, int max )\n{\n    if( max < 0 ) max = 0;\n\n    cache->max_entries = max;\n}\n\nvoid mbedtls_ssl_cache_free( mbedtls_ssl_cache_context *cache )\n{\n    mbedtls_ssl_cache_entry *cur, *prv;\n\n    cur = cache->chain;\n\n    while( cur != NULL )\n    {\n        prv = cur;\n        cur = cur->next;\n\n        mbedtls_ssl_session_free( &prv->session );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n        mbedtls_free( prv->peer_cert.p );\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n        mbedtls_free( prv );\n    }\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_free( &cache->mutex );\n#endif\n}\n\n#endif /* MBEDTLS_SSL_CACHE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ssl_ciphersuites.c",
    "content": "/**\n * \\file ssl_ciphersuites.c\n *\n * \\brief SSL ciphersuites for mbed TLS\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SSL_TLS_C)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#endif\n\n#include \"mbedtls/ssl_ciphersuites.h\"\n#include \"mbedtls/ssl.h\"\n\n#include <string.h>\n\n/*\n * Ordered from most preferred to least preferred in terms of security.\n *\n * Current rule (except rc4, weak and null which come last):\n * 1. By key exchange:\n *    Forward-secure non-PSK > forward-secure PSK > ECJPAKE > other non-PSK > other PSK\n * 2. By key length and cipher:\n *    AES-256 > Camellia-256 > AES-128 > Camellia-128 > 3DES\n * 3. By cipher mode when relevant GCM > CCM > CBC > CCM_8\n * 4. By hash function used when relevant\n * 5. By key exchange/auth again: EC > non-EC\n */\nstatic const int ciphersuite_preference[] =\n{\n#if defined(MBEDTLS_SSL_CIPHERSUITES)\n    MBEDTLS_SSL_CIPHERSUITES,\n#else\n    /* All AES-256 ephemeral suites */\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,\n    MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM,\n    MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,\n    MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,\n    MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8,\n    MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8,\n\n    /* All CAMELLIA-256 ephemeral suites */\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384,\n    MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384,\n    MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,\n    MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA,\n\n    /* All AES-128 ephemeral suites */\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,\n    MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM,\n    MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,\n    MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,\n    MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8,\n    MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8,\n\n    /* All CAMELLIA-128 ephemeral suites */\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256,\n    MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,\n    MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,\n    MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA,\n\n    /* All remaining >= 128-bit ephemeral suites */\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,\n    MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,\n\n    /* The PSK ephemeral suites */\n    MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384,\n    MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM,\n    MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384,\n    MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384,\n    MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA,\n    MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA,\n    MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384,\n    MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384,\n    MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384,\n    MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8,\n\n    MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256,\n    MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM,\n    MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,\n    MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256,\n    MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,\n    MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA,\n    MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256,\n    MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256,\n    MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256,\n    MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8,\n\n    MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA,\n    MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA,\n\n    /* The ECJPAKE suite */\n    MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8,\n\n    /* All AES-256 suites */\n    MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384,\n    MBEDTLS_TLS_RSA_WITH_AES_256_CCM,\n    MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256,\n    MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA,\n    MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,\n    MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,\n    MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,\n    MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8,\n\n    /* All CAMELLIA-256 suites */\n    MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384,\n    MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,\n    MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA,\n    MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384,\n    MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,\n\n    /* All AES-128 suites */\n    MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256,\n    MBEDTLS_TLS_RSA_WITH_AES_128_CCM,\n    MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256,\n    MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA,\n    MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,\n    MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,\n    MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,\n    MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8,\n\n    /* All CAMELLIA-128 suites */\n    MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256,\n    MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,\n    MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA,\n    MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256,\n    MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,\n\n    /* All remaining >= 128-bit suites */\n    MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA,\n    MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,\n\n    /* The RSA PSK suites */\n    MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384,\n    MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384,\n    MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA,\n    MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384,\n    MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384,\n\n    MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256,\n    MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256,\n    MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA,\n    MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256,\n    MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256,\n\n    MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA,\n\n    /* The PSK suites */\n    MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384,\n    MBEDTLS_TLS_PSK_WITH_AES_256_CCM,\n    MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384,\n    MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA,\n    MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384,\n    MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384,\n    MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8,\n\n    MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256,\n    MBEDTLS_TLS_PSK_WITH_AES_128_CCM,\n    MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256,\n    MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA,\n    MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256,\n    MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256,\n    MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8,\n\n    MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA,\n\n    /* RC4 suites */\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA,\n    MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA,\n    MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA,\n    MBEDTLS_TLS_RSA_WITH_RC4_128_SHA,\n    MBEDTLS_TLS_RSA_WITH_RC4_128_MD5,\n    MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA,\n    MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA,\n    MBEDTLS_TLS_PSK_WITH_RC4_128_SHA,\n\n    /* Weak suites */\n    MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA,\n    MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA,\n\n    /* NULL suites */\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA,\n    MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA,\n    MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384,\n    MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256,\n    MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA,\n    MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384,\n    MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256,\n    MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA,\n\n    MBEDTLS_TLS_RSA_WITH_NULL_SHA256,\n    MBEDTLS_TLS_RSA_WITH_NULL_SHA,\n    MBEDTLS_TLS_RSA_WITH_NULL_MD5,\n    MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA,\n    MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA,\n    MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384,\n    MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256,\n    MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA,\n    MBEDTLS_TLS_PSK_WITH_NULL_SHA384,\n    MBEDTLS_TLS_PSK_WITH_NULL_SHA256,\n    MBEDTLS_TLS_PSK_WITH_NULL_SHA,\n\n#endif /* MBEDTLS_SSL_CIPHERSUITES */\n    0\n};\n\nstatic const mbedtls_ssl_ciphersuite_t ciphersuite_definitions[] =\n{\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_SHA1_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, \"TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, \"TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_SHA1_C */\n#if defined(MBEDTLS_SHA256_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, \"TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, \"TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, \"TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, \"TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_SHA512_C */\n#if defined(MBEDTLS_CCM_C)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM, \"TLS-ECDHE-ECDSA-WITH-AES-256-CCM\",\n      MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, \"TLS-ECDHE-ECDSA-WITH-AES-256-CCM-8\",\n      MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM, \"TLS-ECDHE-ECDSA-WITH-AES-128-CCM\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, \"TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n#endif /* MBEDTLS_CCM_C */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, \"TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, \"TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, \"TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, \"TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, \"TLS-ECDHE-ECDSA-WITH-3DES-EDE-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_ARC4_C)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, \"TLS-ECDHE-ECDSA-WITH-RC4-128-SHA\",\n      MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_NODTLS },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_ARC4_C */\n\n#if defined(MBEDTLS_CIPHER_NULL_CIPHER)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA, \"TLS-ECDHE-ECDSA-WITH-NULL-SHA\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_NULL_CIPHER */\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_SHA1_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, \"TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, \"TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_SHA1_C */\n#if defined(MBEDTLS_SHA256_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, \"TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, \"TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, \"TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, \"TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, \"TLS-ECDHE-RSA-WITH-CAMELLIA-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, \"TLS-ECDHE-RSA-WITH-CAMELLIA-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, \"TLS-ECDHE-RSA-WITH-CAMELLIA-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, \"TLS-ECDHE-RSA-WITH-CAMELLIA-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, \"TLS-ECDHE-RSA-WITH-3DES-EDE-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_ARC4_C)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA, \"TLS-ECDHE-RSA-WITH-RC4-128-SHA\",\n      MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_NODTLS },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_ARC4_C */\n\n#if defined(MBEDTLS_CIPHER_NULL_CIPHER)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA, \"TLS-ECDHE-RSA-WITH-NULL-SHA\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_NULL_CIPHER */\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_SHA512_C) && defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, \"TLS-DHE-RSA-WITH-AES-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C && MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_SHA256_C)\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, \"TLS-DHE-RSA-WITH-AES-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, \"TLS-DHE-RSA-WITH-AES-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, \"TLS-DHE-RSA-WITH-AES-256-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA, \"TLS-DHE-RSA-WITH-AES-128-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA, \"TLS-DHE-RSA-WITH-AES-256-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_CCM_C)\n    { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM, \"TLS-DHE-RSA-WITH-AES-256-CCM\",\n      MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8, \"TLS-DHE-RSA-WITH-AES-256-CCM-8\",\n      MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n    { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM, \"TLS-DHE-RSA-WITH-AES-128-CCM\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8, \"TLS-DHE-RSA-WITH-AES-128-CCM-8\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n#endif /* MBEDTLS_CCM_C */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, \"TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, \"TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, \"TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, \"TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, \"TLS-DHE-RSA-WITH-CAMELLIA-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, \"TLS-DHE-RSA-WITH-CAMELLIA-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, \"TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_SHA512_C) && defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384, \"TLS-RSA-WITH-AES-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C && MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_SHA256_C)\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256, \"TLS-RSA-WITH-AES-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256, \"TLS-RSA-WITH-AES-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256, \"TLS-RSA-WITH-AES-256-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA1_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA, \"TLS-RSA-WITH-AES-128-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA, \"TLS-RSA-WITH-AES-256-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_SHA1_C */\n#if defined(MBEDTLS_CCM_C)\n    { MBEDTLS_TLS_RSA_WITH_AES_256_CCM, \"TLS-RSA-WITH-AES-256-CCM\",\n      MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8, \"TLS-RSA-WITH-AES-256-CCM-8\",\n      MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n    { MBEDTLS_TLS_RSA_WITH_AES_128_CCM, \"TLS-RSA-WITH-AES-128-CCM\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8, \"TLS-RSA-WITH-AES-128-CCM-8\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n#endif /* MBEDTLS_CCM_C */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, \"TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, \"TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, \"TLS-RSA-WITH-CAMELLIA-128-CBC-SHA\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, \"TLS-RSA-WITH-CAMELLIA-256-CBC-SHA\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, \"TLS-RSA-WITH-CAMELLIA-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, \"TLS-RSA-WITH-CAMELLIA-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA, \"TLS-RSA-WITH-3DES-EDE-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_ARC4_C)\n#if defined(MBEDTLS_MD5_C)\n    { MBEDTLS_TLS_RSA_WITH_RC4_128_MD5, \"TLS-RSA-WITH-RC4-128-MD5\",\n      MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_MD5, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_NODTLS },\n#endif\n\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_RSA_WITH_RC4_128_SHA, \"TLS-RSA-WITH-RC4-128-SHA\",\n      MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_NODTLS },\n#endif\n#endif /* MBEDTLS_ARC4_C */\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_SHA1_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, \"TLS-ECDH-RSA-WITH-AES-128-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, \"TLS-ECDH-RSA-WITH-AES-256-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_SHA1_C */\n#if defined(MBEDTLS_SHA256_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, \"TLS-ECDH-RSA-WITH-AES-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, \"TLS-ECDH-RSA-WITH-AES-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, \"TLS-ECDH-RSA-WITH-AES-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, \"TLS-ECDH-RSA-WITH-AES-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, \"TLS-ECDH-RSA-WITH-CAMELLIA-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, \"TLS-ECDH-RSA-WITH-CAMELLIA-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, \"TLS-ECDH-RSA-WITH-CAMELLIA-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, \"TLS-ECDH-RSA-WITH-CAMELLIA-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, \"TLS-ECDH-RSA-WITH-3DES-EDE-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_ARC4_C)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA, \"TLS-ECDH-RSA-WITH-RC4-128-SHA\",\n      MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_NODTLS },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_ARC4_C */\n\n#if defined(MBEDTLS_CIPHER_NULL_CIPHER)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA, \"TLS-ECDH-RSA-WITH-NULL-SHA\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_NULL_CIPHER */\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_SHA1_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, \"TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, \"TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_SHA1_C */\n#if defined(MBEDTLS_SHA256_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, \"TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, \"TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, \"TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_GCM_C)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, \"TLS-ECDH-ECDSA-WITH-AES-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, \"TLS-ECDH-ECDSA-WITH-CAMELLIA-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, \"TLS-ECDH-ECDSA-WITH-CAMELLIA-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, \"TLS-ECDH-ECDSA-WITH-CAMELLIA-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, \"TLS-ECDH-ECDSA-WITH-CAMELLIA-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, \"TLS-ECDH-ECDSA-WITH-3DES-EDE-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_ARC4_C)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA, \"TLS-ECDH-ECDSA-WITH-RC4-128-SHA\",\n      MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_NODTLS },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_ARC4_C */\n\n#if defined(MBEDTLS_CIPHER_NULL_CIPHER)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA, \"TLS-ECDH-ECDSA-WITH-NULL-SHA\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_NULL_CIPHER */\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256, \"TLS-PSK-WITH-AES-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384, \"TLS-PSK-WITH-AES-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256, \"TLS-PSK-WITH-AES-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384, \"TLS-PSK-WITH-AES-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA, \"TLS-PSK-WITH-AES-128-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA, \"TLS-PSK-WITH-AES-256-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_CCM_C)\n    { MBEDTLS_TLS_PSK_WITH_AES_256_CCM, \"TLS-PSK-WITH-AES-256-CCM\",\n      MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8, \"TLS-PSK-WITH-AES-256-CCM-8\",\n      MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n    { MBEDTLS_TLS_PSK_WITH_AES_128_CCM, \"TLS-PSK-WITH-AES-128-CCM\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8, \"TLS-PSK-WITH-AES-128-CCM-8\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n#endif /* MBEDTLS_CCM_C */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, \"TLS-PSK-WITH-CAMELLIA-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, \"TLS-PSK-WITH-CAMELLIA-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, \"TLS-PSK-WITH-CAMELLIA-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, \"TLS-PSK-WITH-CAMELLIA-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA, \"TLS-PSK-WITH-3DES-EDE-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_ARC4_C)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_PSK_WITH_RC4_128_SHA, \"TLS-PSK-WITH-RC4-128-SHA\",\n      MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_NODTLS },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_ARC4_C */\n#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, \"TLS-DHE-PSK-WITH-AES-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384, \"TLS-DHE-PSK-WITH-AES-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, \"TLS-DHE-PSK-WITH-AES-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, \"TLS-DHE-PSK-WITH-AES-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA, \"TLS-DHE-PSK-WITH-AES-128-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA, \"TLS-DHE-PSK-WITH-AES-256-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_CCM_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM, \"TLS-DHE-PSK-WITH-AES-256-CCM\",\n      MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8, \"TLS-DHE-PSK-WITH-AES-256-CCM-8\",\n      MBEDTLS_CIPHER_AES_256_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n    { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM, \"TLS-DHE-PSK-WITH-AES-128-CCM\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n    { MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8, \"TLS-DHE-PSK-WITH-AES-128-CCM-8\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n#endif /* MBEDTLS_CCM_C */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, \"TLS-DHE-PSK-WITH-CAMELLIA-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, \"TLS-DHE-PSK-WITH-CAMELLIA-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256, \"TLS-DHE-PSK-WITH-CAMELLIA-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384, \"TLS-DHE-PSK-WITH-CAMELLIA-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, \"TLS-DHE-PSK-WITH-3DES-EDE-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_ARC4_C)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA, \"TLS-DHE-PSK-WITH-RC4-128-SHA\",\n      MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_NODTLS },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_ARC4_C */\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\n#if defined(MBEDTLS_AES_C)\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, \"TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, \"TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, \"TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, \"TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, \"TLS-ECDHE-PSK-WITH-CAMELLIA-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, \"TLS-ECDHE-PSK-WITH-CAMELLIA-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, \"TLS-ECDHE-PSK-WITH-3DES-EDE-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_ARC4_C)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA, \"TLS-ECDHE-PSK-WITH-RC4-128-SHA\",\n      MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_NODTLS },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_ARC4_C */\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, \"TLS-RSA-PSK-WITH-AES-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_AES_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, \"TLS-RSA-PSK-WITH-AES-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_AES_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, \"TLS-RSA-PSK-WITH-AES-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, \"TLS-RSA-PSK-WITH-AES-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA, \"TLS-RSA-PSK-WITH-AES-128-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_128_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n\n    { MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA, \"TLS-RSA-PSK-WITH-AES-256-CBC-SHA\",\n      MBEDTLS_CIPHER_AES_256_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, \"TLS-RSA-PSK-WITH-CAMELLIA-128-CBC-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_CBC, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, \"TLS-RSA-PSK-WITH-CAMELLIA-256-CBC-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_CBC, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n#if defined(MBEDTLS_GCM_C)\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, \"TLS-RSA-PSK-WITH-CAMELLIA-128-GCM-SHA256\",\n      MBEDTLS_CIPHER_CAMELLIA_128_GCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, \"TLS-RSA-PSK-WITH-CAMELLIA-256-GCM-SHA384\",\n      MBEDTLS_CIPHER_CAMELLIA_256_GCM, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_GCM_C */\n#endif /* MBEDTLS_CAMELLIA_C */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, \"TLS-RSA-PSK-WITH-3DES-EDE-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_EDE3_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      0 },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_ARC4_C)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA, \"TLS-RSA-PSK-WITH-RC4-128-SHA\",\n      MBEDTLS_CIPHER_ARC4_128, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_NODTLS },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_ARC4_C */\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_CCM_C)\n    { MBEDTLS_TLS_ECJPAKE_WITH_AES_128_CCM_8, \"TLS-ECJPAKE-WITH-AES-128-CCM-8\",\n      MBEDTLS_CIPHER_AES_128_CCM, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECJPAKE,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_SHORT_TAG },\n#endif /* MBEDTLS_CCM_C */\n#endif /* MBEDTLS_AES_C */\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES)\n#if defined(MBEDTLS_CIPHER_NULL_CIPHER)\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)\n#if defined(MBEDTLS_MD5_C)\n    { MBEDTLS_TLS_RSA_WITH_NULL_MD5, \"TLS-RSA-WITH-NULL-MD5\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_MD5, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_RSA_WITH_NULL_SHA, \"TLS-RSA-WITH-NULL-SHA\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_RSA_WITH_NULL_SHA256, \"TLS-RSA-WITH-NULL-SHA256\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_PSK_WITH_NULL_SHA, \"TLS-PSK-WITH-NULL-SHA\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif /* MBEDTLS_SHA1_C */\n\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_PSK_WITH_NULL_SHA256, \"TLS-PSK-WITH-NULL-SHA256\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_PSK_WITH_NULL_SHA384, \"TLS-PSK-WITH-NULL-SHA384\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA, \"TLS-DHE-PSK-WITH-NULL-SHA\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif /* MBEDTLS_SHA1_C */\n\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256, \"TLS-DHE-PSK-WITH-NULL-SHA256\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384, \"TLS-DHE-PSK-WITH-NULL-SHA384\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_DHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA, \"TLS-ECDHE-PSK-WITH-NULL-SHA\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif /* MBEDTLS_SHA1_C */\n\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256, \"TLS-ECDHE-PSK-WITH-NULL-SHA256\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384, \"TLS-ECDHE-PSK-WITH-NULL-SHA384\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_ECDHE_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA, \"TLS-RSA-PSK-WITH-NULL-SHA\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif /* MBEDTLS_SHA1_C */\n\n#if defined(MBEDTLS_SHA256_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256, \"TLS-RSA-PSK-WITH-NULL-SHA256\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA256, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\n    { MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384, \"TLS-RSA-PSK-WITH-NULL-SHA384\",\n      MBEDTLS_CIPHER_NULL, MBEDTLS_MD_SHA384, MBEDTLS_KEY_EXCHANGE_RSA_PSK,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_1,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */\n#endif /* MBEDTLS_CIPHER_NULL_CIPHER */\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA, \"TLS-DHE-RSA-WITH-DES-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_DHE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)\n#if defined(MBEDTLS_SHA1_C)\n    { MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA, \"TLS-RSA-WITH-DES-CBC-SHA\",\n      MBEDTLS_CIPHER_DES_CBC, MBEDTLS_MD_SHA1, MBEDTLS_KEY_EXCHANGE_RSA,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_0,\n      MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3,\n      MBEDTLS_CIPHERSUITE_WEAK },\n#endif /* MBEDTLS_SHA1_C */\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* MBEDTLS_DES_C */\n#endif /* MBEDTLS_ENABLE_WEAK_CIPHERSUITES */\n\n    { 0, \"\",\n      MBEDTLS_CIPHER_NONE, MBEDTLS_MD_NONE, MBEDTLS_KEY_EXCHANGE_NONE,\n      0, 0, 0, 0, 0 }\n};\n\n#if defined(MBEDTLS_SSL_CIPHERSUITES)\nconst int *mbedtls_ssl_list_ciphersuites( void )\n{\n    return( ciphersuite_preference );\n}\n#else\n#define MAX_CIPHERSUITES    sizeof( ciphersuite_definitions     ) /         \\\n                            sizeof( ciphersuite_definitions[0]  )\nstatic int supported_ciphersuites[MAX_CIPHERSUITES];\nstatic int supported_init = 0;\n\nconst int *mbedtls_ssl_list_ciphersuites( void )\n{\n    /*\n     * On initial call filter out all ciphersuites not supported by current\n     * build based on presence in the ciphersuite_definitions.\n     */\n    if( supported_init == 0 )\n    {\n        const int *p;\n        int *q;\n\n        for( p = ciphersuite_preference, q = supported_ciphersuites;\n             *p != 0 && q < supported_ciphersuites + MAX_CIPHERSUITES - 1;\n             p++ )\n        {\n#if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES)\n            const mbedtls_ssl_ciphersuite_t *cs_info;\n            if( ( cs_info = mbedtls_ssl_ciphersuite_from_id( *p ) ) != NULL &&\n                cs_info->cipher != MBEDTLS_CIPHER_ARC4_128 )\n#else\n            if( mbedtls_ssl_ciphersuite_from_id( *p ) != NULL )\n#endif\n                *(q++) = *p;\n        }\n        *q = 0;\n\n        supported_init = 1;\n    }\n\n    return( supported_ciphersuites );\n}\n#endif /* MBEDTLS_SSL_CIPHERSUITES */\n\nconst mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_string(\n                                                const char *ciphersuite_name )\n{\n    const mbedtls_ssl_ciphersuite_t *cur = ciphersuite_definitions;\n\n    if( NULL == ciphersuite_name )\n        return( NULL );\n\n    while( cur->id != 0 )\n    {\n        if( 0 == strcmp( cur->name, ciphersuite_name ) )\n            return( cur );\n\n        cur++;\n    }\n\n    return( NULL );\n}\n\nconst mbedtls_ssl_ciphersuite_t *mbedtls_ssl_ciphersuite_from_id( int ciphersuite )\n{\n    const mbedtls_ssl_ciphersuite_t *cur = ciphersuite_definitions;\n\n    while( cur->id != 0 )\n    {\n        if( cur->id == ciphersuite )\n            return( cur );\n\n        cur++;\n    }\n\n    return( NULL );\n}\n\nconst char *mbedtls_ssl_get_ciphersuite_name( const int ciphersuite_id )\n{\n    const mbedtls_ssl_ciphersuite_t *cur;\n\n    cur = mbedtls_ssl_ciphersuite_from_id( ciphersuite_id );\n\n    if( cur == NULL )\n        return( \"unknown\" );\n\n    return( cur->name );\n}\n\nint mbedtls_ssl_get_ciphersuite_id( const char *ciphersuite_name )\n{\n    const mbedtls_ssl_ciphersuite_t *cur;\n\n    cur = mbedtls_ssl_ciphersuite_from_string( ciphersuite_name );\n\n    if( cur == NULL )\n        return( 0 );\n\n    return( cur->id );\n}\n\n#if defined(MBEDTLS_PK_C)\nmbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_pk_alg( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_DHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_RSA_PSK:\n            return( MBEDTLS_PK_RSA );\n\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:\n            return( MBEDTLS_PK_ECDSA );\n\n        case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:\n            return( MBEDTLS_PK_ECKEY );\n\n        default:\n            return( MBEDTLS_PK_NONE );\n    }\n}\n\nmbedtls_pk_type_t mbedtls_ssl_get_ciphersuite_sig_alg( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_DHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:\n            return( MBEDTLS_PK_RSA );\n\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:\n            return( MBEDTLS_PK_ECDSA );\n\n        default:\n            return( MBEDTLS_PK_NONE );\n    }\n}\n\n#endif /* MBEDTLS_PK_C */\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)\nint mbedtls_ssl_ciphersuite_uses_ec( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:\n        case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:\n        case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:\n            return( 1 );\n\n        default:\n            return( 0 );\n    }\n}\n#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\nint mbedtls_ssl_ciphersuite_uses_psk( const mbedtls_ssl_ciphersuite_t *info )\n{\n    switch( info->key_exchange )\n    {\n        case MBEDTLS_KEY_EXCHANGE_PSK:\n        case MBEDTLS_KEY_EXCHANGE_RSA_PSK:\n        case MBEDTLS_KEY_EXCHANGE_DHE_PSK:\n        case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:\n            return( 1 );\n\n        default:\n            return( 0 );\n    }\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\n#endif /* MBEDTLS_SSL_TLS_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ssl_cli.c",
    "content": "/*\n *  SSLv3/TLSv1 client-side functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SSL_CLI_C)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free      free\n#endif\n\n#include \"mbedtls/debug.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/ssl_internal.h\"\n\n#include <string.h>\n\n#include <stdint.h>\n\n#if defined(MBEDTLS_HAVE_TIME)\n#include \"mbedtls/platform_time.h\"\n#endif\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n#endif\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\nstatic void ssl_write_hostname_ext( mbedtls_ssl_context *ssl,\n                                    unsigned char *buf,\n                                    size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n    size_t hostname_len;\n\n    *olen = 0;\n\n    if( ssl->hostname == NULL )\n        return;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding server name extension: %s\",\n                   ssl->hostname ) );\n\n    hostname_len = strlen( ssl->hostname );\n\n    if( end < p || (size_t)( end - p ) < hostname_len + 9 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    /*\n     * struct {\n     *     NameType name_type;\n     *     select (name_type) {\n     *         case host_name: HostName;\n     *     } name;\n     * } ServerName;\n     *\n     * enum {\n     *     host_name(0), (255)\n     * } NameType;\n     *\n     * opaque HostName<1..2^16-1>;\n     *\n     * struct {\n     *     ServerName server_name_list<1..2^16-1>\n     * } ServerNameList;\n     */\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME      ) & 0xFF );\n\n    *p++ = (unsigned char)( ( (hostname_len + 5) >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( (hostname_len + 5)      ) & 0xFF );\n\n    *p++ = (unsigned char)( ( (hostname_len + 3) >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( (hostname_len + 3)      ) & 0xFF );\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );\n    *p++ = (unsigned char)( ( hostname_len >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( hostname_len      ) & 0xFF );\n\n    memcpy( p, ssl->hostname, hostname_len );\n\n    *olen = hostname_len + 9;\n}\n#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\nstatic void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,\n                                         unsigned char *buf,\n                                         size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n\n    *olen = 0;\n\n    if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )\n        return;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding renegotiation extension\" ) );\n\n    if( end < p || (size_t)( end - p ) < 5 + ssl->verify_data_len )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    /*\n     * Secure renegotiation\n     */\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = ( ssl->verify_data_len + 1 ) & 0xFF;\n    *p++ = ssl->verify_data_len & 0xFF;\n\n    memcpy( p, ssl->own_verify_data, ssl->verify_data_len );\n\n    *olen = 5 + ssl->verify_data_len;\n}\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n/*\n * Only if we handle at least one key exchange that needs signatures.\n */\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\nstatic void ssl_write_signature_algorithms_ext( mbedtls_ssl_context *ssl,\n                                                unsigned char *buf,\n                                                size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n    size_t sig_alg_len = 0;\n    const int *md;\n#if defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C)\n    unsigned char *sig_alg_list = buf + 6;\n#endif\n\n    *olen = 0;\n\n    if( ssl->conf->max_minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )\n        return;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding signature_algorithms extension\" ) );\n\n    for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )\n    {\n#if defined(MBEDTLS_ECDSA_C)\n        sig_alg_len += 2;\n#endif\n#if defined(MBEDTLS_RSA_C)\n        sig_alg_len += 2;\n#endif\n    }\n\n    if( end < p || (size_t)( end - p ) < sig_alg_len + 6 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    /*\n     * Prepare signature_algorithms extension (TLS 1.2)\n     */\n    sig_alg_len = 0;\n\n    for( md = ssl->conf->sig_hashes; *md != MBEDTLS_MD_NONE; md++ )\n    {\n#if defined(MBEDTLS_ECDSA_C)\n        sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );\n        sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_ECDSA;\n#endif\n#if defined(MBEDTLS_RSA_C)\n        sig_alg_list[sig_alg_len++] = mbedtls_ssl_hash_from_md_alg( *md );\n        sig_alg_list[sig_alg_len++] = MBEDTLS_SSL_SIG_RSA;\n#endif\n    }\n\n    /*\n     * enum {\n     *     none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5),\n     *     sha512(6), (255)\n     * } HashAlgorithm;\n     *\n     * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) }\n     *   SignatureAlgorithm;\n     *\n     * struct {\n     *     HashAlgorithm hash;\n     *     SignatureAlgorithm signature;\n     * } SignatureAndHashAlgorithm;\n     *\n     * SignatureAndHashAlgorithm\n     *   supported_signature_algorithms<2..2^16-2>;\n     */\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SIG_ALG      ) & 0xFF );\n\n    *p++ = (unsigned char)( ( ( sig_alg_len + 2 ) >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( ( sig_alg_len + 2 )      ) & 0xFF );\n\n    *p++ = (unsigned char)( ( sig_alg_len >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( sig_alg_len      ) & 0xFF );\n\n    *olen = 6 + sig_alg_len;\n}\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&\n          MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\nstatic void ssl_write_supported_elliptic_curves_ext( mbedtls_ssl_context *ssl,\n                                                     unsigned char *buf,\n                                                     size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n    unsigned char *elliptic_curve_list = p + 6;\n    size_t elliptic_curve_len = 0;\n    const mbedtls_ecp_curve_info *info;\n#if defined(MBEDTLS_ECP_C)\n    const mbedtls_ecp_group_id *grp_id;\n#else\n    ((void) ssl);\n#endif\n\n    *olen = 0;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding supported_elliptic_curves extension\" ) );\n\n#if defined(MBEDTLS_ECP_C)\n    for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )\n#else\n    for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )\n#endif\n    {\n#if defined(MBEDTLS_ECP_C)\n        info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );\n#endif\n        if( info == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"invalid curve in ssl configuration\" ) );\n            return;\n        }\n\n        elliptic_curve_len += 2;\n    }\n\n    if( end < p || (size_t)( end - p ) < 6 + elliptic_curve_len )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    elliptic_curve_len = 0;\n\n#if defined(MBEDTLS_ECP_C)\n    for( grp_id = ssl->conf->curve_list; *grp_id != MBEDTLS_ECP_DP_NONE; grp_id++ )\n#else\n    for( info = mbedtls_ecp_curve_list(); info->grp_id != MBEDTLS_ECP_DP_NONE; info++ )\n#endif\n    {\n#if defined(MBEDTLS_ECP_C)\n        info = mbedtls_ecp_curve_info_from_grp_id( *grp_id );\n#endif\n        elliptic_curve_list[elliptic_curve_len++] = info->tls_id >> 8;\n        elliptic_curve_list[elliptic_curve_len++] = info->tls_id & 0xFF;\n    }\n\n    if( elliptic_curve_len == 0 )\n        return;\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES      ) & 0xFF );\n\n    *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 ) >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( ( elliptic_curve_len + 2 )      ) & 0xFF );\n\n    *p++ = (unsigned char)( ( ( elliptic_curve_len     ) >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( ( elliptic_curve_len     )      ) & 0xFF );\n\n    *olen = 6 + elliptic_curve_len;\n}\n\nstatic void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,\n                                                   unsigned char *buf,\n                                                   size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n\n    *olen = 0;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding supported_point_formats extension\" ) );\n\n    if( end < p || (size_t)( end - p ) < 6 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 2;\n\n    *p++ = 1;\n    *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;\n\n    *olen = 6;\n}\n#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || \n          MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\nstatic void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,\n                                        unsigned char *buf,\n                                        size_t *olen )\n{\n    int ret;\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n    size_t kkpp_len;\n\n    *olen = 0;\n\n    /* Skip costly extension if we can't use EC J-PAKE anyway */\n    if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )\n        return;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding ecjpake_kkpp extension\" ) );\n\n    if( end - p < 4 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP      ) & 0xFF );\n\n    /*\n     * We may need to send ClientHello multiple times for Hello verification.\n     * We don't want to compute fresh values every time (both for performance\n     * and consistency reasons), so cache the extension content.\n     */\n    if( ssl->handshake->ecjpake_cache == NULL ||\n        ssl->handshake->ecjpake_cache_len == 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"generating new ecjpake parameters\" ) );\n\n        ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,\n                                        p + 2, end - p - 2, &kkpp_len,\n                                        ssl->conf->f_rng, ssl->conf->p_rng );\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1 , \"mbedtls_ecjpake_write_round_one\", ret );\n            return;\n        }\n\n        ssl->handshake->ecjpake_cache = mbedtls_calloc( 1, kkpp_len );\n        if( ssl->handshake->ecjpake_cache == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"allocation failed\" ) );\n            return;\n        }\n\n        memcpy( ssl->handshake->ecjpake_cache, p + 2, kkpp_len );\n        ssl->handshake->ecjpake_cache_len = kkpp_len;\n    }\n    else\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"re-using cached ecjpake parameters\" ) );\n\n        kkpp_len = ssl->handshake->ecjpake_cache_len;\n\n        if( (size_t)( end - p - 2 ) < kkpp_len )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n            return;\n        }\n\n        memcpy( p + 2, ssl->handshake->ecjpake_cache, kkpp_len );\n    }\n\n    *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( kkpp_len      ) & 0xFF );\n\n    *olen = kkpp_len + 4;\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\nstatic void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,\n                                               unsigned char *buf,\n                                               size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n\n    *olen = 0;\n\n    if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ) {\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding max_fragment_length extension\" ) );\n\n    if( end < p || (size_t)( end - p ) < 5 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 1;\n\n    *p++ = ssl->conf->mfl_code;\n\n    *olen = 5;\n}\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\nstatic void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,\n                                          unsigned char *buf, size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n\n    *olen = 0;\n\n    if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )\n    {\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding truncated_hmac extension\" ) );\n\n    if( end < p || (size_t)( end - p ) < 4 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 0x00;\n\n    *olen = 4;\n}\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\nstatic void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,\n                                       unsigned char *buf, size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n\n    *olen = 0;\n\n    if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||\n        ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding encrypt_then_mac \"\n                        \"extension\" ) );\n\n    if( end < p || (size_t)( end - p ) < 4 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 0x00;\n\n    *olen = 4;\n}\n#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\nstatic void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,\n                                       unsigned char *buf, size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n\n    *olen = 0;\n\n    if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||\n        ssl->conf->max_minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding extended_master_secret \"\n                        \"extension\" ) );\n\n    if( end < p || (size_t)( end - p ) < 4 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 0x00;\n\n    *olen = 4;\n}\n#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\nstatic void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,\n                                          unsigned char *buf, size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n    size_t tlen = ssl->session_negotiate->ticket_len;\n\n    *olen = 0;\n\n    if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED )\n    {\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding session ticket extension\" ) );\n\n    if( end < p || (size_t)( end - p ) < 4 + tlen )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET      ) & 0xFF );\n\n    *p++ = (unsigned char)( ( tlen >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( tlen      ) & 0xFF );\n\n    *olen = 4;\n\n    if( ssl->session_negotiate->ticket == NULL || tlen == 0 )\n    {\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"sending session ticket of length %d\", tlen ) );\n\n    memcpy( p, ssl->session_negotiate->ticket, tlen );\n\n    *olen += tlen;\n}\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n#if defined(MBEDTLS_SSL_ALPN)\nstatic void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,\n                                unsigned char *buf, size_t *olen )\n{\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n    size_t alpnlen = 0;\n    const char **cur;\n\n    *olen = 0;\n\n    if( ssl->conf->alpn_list == NULL )\n    {\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, adding alpn extension\" ) );\n\n    for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )\n        alpnlen += (unsigned char)( strlen( *cur ) & 0xFF ) + 1;\n\n    if( end < p || (size_t)( end - p ) < 6 + alpnlen )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN      ) & 0xFF );\n\n    /*\n     * opaque ProtocolName<1..2^8-1>;\n     *\n     * struct {\n     *     ProtocolName protocol_name_list<2..2^16-1>\n     * } ProtocolNameList;\n     */\n\n    /* Skip writing extension and list length for now */\n    p += 4;\n\n    for( cur = ssl->conf->alpn_list; *cur != NULL; cur++ )\n    {\n        *p = (unsigned char)( strlen( *cur ) & 0xFF );\n        memcpy( p + 1, *cur, *p );\n        p += 1 + *p;\n    }\n\n    *olen = p - buf;\n\n    /* List length = olen - 2 (ext_type) - 2 (ext_len) - 2 (list_len) */\n    buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );\n    buf[5] = (unsigned char)( ( ( *olen - 6 )      ) & 0xFF );\n\n    /* Extension length = olen - 2 (ext_type) - 2 (ext_len) */\n    buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );\n    buf[3] = (unsigned char)( ( ( *olen - 4 )      ) & 0xFF );\n}\n#endif /* MBEDTLS_SSL_ALPN */\n\n/*\n * Generate random bytes for ClientHello\n */\nstatic int ssl_generate_random( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    unsigned char *p = ssl->handshake->randbytes;\n#if defined(MBEDTLS_HAVE_TIME)\n    mbedtls_time_t t;\n#endif\n\n    /*\n     * When responding to a verify request, MUST reuse random (RFC 6347 4.2.1)\n     */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ssl->handshake->verify_cookie != NULL )\n    {\n        return( 0 );\n    }\n#endif\n\n#if defined(MBEDTLS_HAVE_TIME)\n    t = mbedtls_time( NULL );\n    *p++ = (unsigned char)( t >> 24 );\n    *p++ = (unsigned char)( t >> 16 );\n    *p++ = (unsigned char)( t >>  8 );\n    *p++ = (unsigned char)( t       );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, current time: %lu\", t ) );\n#else\n    if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )\n        return( ret );\n\n    p += 4;\n#endif /* MBEDTLS_HAVE_TIME */\n\n    if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\nstatic int ssl_write_client_hello( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    size_t i, n, olen, ext_len = 0;\n    unsigned char *buf;\n    unsigned char *p, *q;\n    unsigned char offer_compress;\n    const int *ciphersuites;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write client hello\" ) );\n\n    if( ssl->conf->f_rng == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"no RNG provided\") );\n        return( MBEDTLS_ERR_SSL_NO_RNG );\n    }\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )\n#endif\n    {\n        ssl->major_ver = ssl->conf->min_major_ver;\n        ssl->minor_ver = ssl->conf->min_minor_ver;\n    }\n\n    if( ssl->conf->max_major_ver == 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"configured max major version is invalid, \"\n                            \"consider using mbedtls_ssl_config_defaults()\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    /*\n     *     0  .   0   handshake type\n     *     1  .   3   handshake length\n     *     4  .   5   highest version supported\n     *     6  .   9   current UNIX time\n     *    10  .  37   random bytes\n     */\n    buf = ssl->out_msg;\n    p = buf + 4;\n\n    mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver,\n                       ssl->conf->transport, p );\n    p += 2;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, max version: [%d:%d]\",\n                   buf[4], buf[5] ) );\n\n    if( ( ret = ssl_generate_random( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_generate_random\", ret );\n        return( ret );\n    }\n\n    memcpy( p, ssl->handshake->randbytes, 32 );\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, random bytes\", p, 32 );\n    p += 32;\n\n    /*\n     *    38  .  38   session id length\n     *    39  . 39+n  session id\n     *   39+n . 39+n  DTLS only: cookie length (1 byte)\n     *   40+n .  ..   DTSL only: cookie\n     *   ..   . ..    ciphersuitelist length (2 bytes)\n     *   ..   . ..    ciphersuitelist\n     *   ..   . ..    compression methods length (1 byte)\n     *   ..   . ..    compression methods\n     *   ..   . ..    extensions length (2 bytes)\n     *   ..   . ..    extensions\n     */\n    n = ssl->session_negotiate->id_len;\n\n    if( n < 16 || n > 32 ||\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n        ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||\n#endif\n        ssl->handshake->resume == 0 )\n    {\n        n = 0;\n    }\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    /*\n     * RFC 5077 section 3.4: \"When presenting a ticket, the client MAY\n     * generate and include a Session ID in the TLS ClientHello.\"\n     */\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )\n#endif\n    {\n        if( ssl->session_negotiate->ticket != NULL &&\n                ssl->session_negotiate->ticket_len != 0 )\n        {\n            ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id, 32 );\n\n            if( ret != 0 )\n                return( ret );\n\n            ssl->session_negotiate->id_len = n = 32;\n        }\n    }\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n    *p++ = (unsigned char) n;\n\n    for( i = 0; i < n; i++ )\n        *p++ = ssl->session_negotiate->id[i];\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, session id len.: %d\", n ) );\n    MBEDTLS_SSL_DEBUG_BUF( 3,   \"client hello, session id\", buf + 39, n );\n\n    /*\n     * DTLS cookie\n     */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        if( ssl->handshake->verify_cookie == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"no verify cookie to send\" ) );\n            *p++ = 0;\n        }\n        else\n        {\n            MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, cookie\",\n                              ssl->handshake->verify_cookie,\n                              ssl->handshake->verify_cookie_len );\n\n            *p++ = ssl->handshake->verify_cookie_len;\n            memcpy( p, ssl->handshake->verify_cookie,\n                       ssl->handshake->verify_cookie_len );\n            p += ssl->handshake->verify_cookie_len;\n        }\n    }\n#endif\n\n    /*\n     * Ciphersuite list\n     */\n    ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];\n\n    /* Skip writing ciphersuite length for now */\n    n = 0;\n    q = p;\n    p += 2;\n\n    for( i = 0; ciphersuites[i] != 0; i++ )\n    {\n        ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuites[i] );\n\n        if( ciphersuite_info == NULL )\n            continue;\n\n        if( ciphersuite_info->min_minor_ver > ssl->conf->max_minor_ver ||\n            ciphersuite_info->max_minor_ver < ssl->conf->min_minor_ver )\n            continue;\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n        if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n            ( ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )\n            continue;\n#endif\n\n#if defined(MBEDTLS_ARC4_C)\n        if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&\n            ciphersuite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )\n            continue;\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n        if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&\n            mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )\n            continue;\n#endif\n\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, add ciphersuite: %04x\",\n                                    ciphersuites[i] ) );\n\n        n++;\n        *p++ = (unsigned char)( ciphersuites[i] >> 8 );\n        *p++ = (unsigned char)( ciphersuites[i]      );\n    }\n\n    /*\n     * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV\n     */\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )\n#endif\n    {\n        *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO >> 8 );\n        *p++ = (unsigned char)( MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO      );\n        n++;\n    }\n\n    /* Some versions of OpenSSL don't handle it correctly if not at end */\n#if defined(MBEDTLS_SSL_FALLBACK_SCSV)\n    if( ssl->conf->fallback == MBEDTLS_SSL_IS_FALLBACK )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"adding FALLBACK_SCSV\" ) );\n        *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 );\n        *p++ = (unsigned char)( MBEDTLS_SSL_FALLBACK_SCSV_VALUE      );\n        n++;\n    }\n#endif\n\n    *q++ = (unsigned char)( n >> 7 );\n    *q++ = (unsigned char)( n << 1 );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, got %d ciphersuites\", n ) );\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    offer_compress = 1;\n#else\n    offer_compress = 0;\n#endif\n\n    /*\n     * We don't support compression with DTLS right now: is many records come\n     * in the same datagram, uncompressing one could overwrite the next one.\n     * We don't want to add complexity for handling that case unless there is\n     * an actual need for it.\n     */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        offer_compress = 0;\n#endif\n\n    if( offer_compress )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, compress len.: %d\", 2 ) );\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, compress alg.: %d %d\",\n                            MBEDTLS_SSL_COMPRESS_DEFLATE, MBEDTLS_SSL_COMPRESS_NULL ) );\n\n        *p++ = 2;\n        *p++ = MBEDTLS_SSL_COMPRESS_DEFLATE;\n        *p++ = MBEDTLS_SSL_COMPRESS_NULL;\n    }\n    else\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, compress len.: %d\", 1 ) );\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, compress alg.: %d\",\n                            MBEDTLS_SSL_COMPRESS_NULL ) );\n\n        *p++ = 1;\n        *p++ = MBEDTLS_SSL_COMPRESS_NULL;\n    }\n\n    // First write extensions, then the total length\n    //\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n    ssl_write_hostname_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n    ssl_write_signature_algorithms_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    ssl_write_supported_elliptic_curves_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n\n    ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n    ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n    ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n    ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n    ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_ALPN)\n    ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n    /* olen unused if all extensions are disabled */\n    ((void) olen);\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello, total extension length: %d\",\n                   ext_len ) );\n\n    if( ext_len > 0 )\n    {\n        *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );\n        *p++ = (unsigned char)( ( ext_len      ) & 0xFF );\n        p += ext_len;\n    }\n\n    ssl->out_msglen  = p - buf;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_CLIENT_HELLO;\n\n    ssl->state++;\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        mbedtls_ssl_send_flight_completed( ssl );\n#endif\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write client hello\" ) );\n\n    return( 0 );\n}\n\nstatic int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,\n                                         const unsigned char *buf,\n                                         size_t len )\n{\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )\n    {\n        /* Check verify-data in constant-time. The length OTOH is no secret */\n        if( len    != 1 + ssl->verify_data_len * 2 ||\n            buf[0] !=     ssl->verify_data_len * 2 ||\n            mbedtls_ssl_safer_memcmp( buf + 1,\n                          ssl->own_verify_data, ssl->verify_data_len ) != 0 ||\n            mbedtls_ssl_safer_memcmp( buf + 1 + ssl->verify_data_len,\n                          ssl->peer_verify_data, ssl->verify_data_len ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-matching renegotiation info\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n        }\n    }\n    else\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n    {\n        if( len != 1 || buf[0] != 0x00 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-zero length renegotiation info\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n        }\n\n        ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;\n    }\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\nstatic int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,\n                                              const unsigned char *buf,\n                                              size_t len )\n{\n    /*\n     * server should use the extension only if we did,\n     * and if so the server's value should match ours (and len is always 1)\n     */\n    if( ssl->conf->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE ||\n        len != 1 ||\n        buf[0] != ssl->conf->mfl_code )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-matching max fragment length extension\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\nstatic int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,\n                                         const unsigned char *buf,\n                                         size_t len )\n{\n    if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED ||\n        len != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-matching truncated HMAC extension\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    ((void) buf);\n\n    ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\nstatic int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,\n                                         const unsigned char *buf,\n                                         size_t len )\n{\n    if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED ||\n        ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||\n        len != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-matching encrypt-then-MAC extension\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    ((void) buf);\n\n    ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\nstatic int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,\n                                         const unsigned char *buf,\n                                         size_t len )\n{\n    if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||\n        ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||\n        len != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-matching extended master secret extension\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    ((void) buf);\n\n    ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\nstatic int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,\n                                         const unsigned char *buf,\n                                         size_t len )\n{\n    if( ssl->conf->session_tickets == MBEDTLS_SSL_SESSION_TICKETS_DISABLED ||\n        len != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-matching session ticket extension\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    ((void) buf);\n\n    ssl->handshake->new_session_ticket = 1;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\nstatic int ssl_parse_supported_point_formats_ext( mbedtls_ssl_context *ssl,\n                                                  const unsigned char *buf,\n                                                  size_t len )\n{\n    size_t list_size;\n    const unsigned char *p;\n\n    list_size = buf[0];\n    if( list_size + 1 != len )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    p = buf + 1;\n    while( list_size > 0 )\n    {\n        if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||\n            p[0] == MBEDTLS_ECP_PF_COMPRESSED )\n        {\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)\n            ssl->handshake->ecdh_ctx.point_format = p[0];\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n            ssl->handshake->ecjpake_ctx.point_format = p[0];\n#endif\n            MBEDTLS_SSL_DEBUG_MSG( 4, ( \"point format selected: %d\", p[0] ) );\n            return( 0 );\n        }\n\n        list_size--;\n        p++;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"no point format in common\" ) );\n    mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                    MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n    return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n}\n#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || \n          MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\nstatic int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,\n                                   const unsigned char *buf,\n                                   size_t len )\n{\n    int ret;\n\n    if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=\n        MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"skip ecjpake kkpp extension\" ) );\n        return( 0 );\n    }\n\n    /* If we got here, we no longer need our cached extension */\n    mbedtls_free( ssl->handshake->ecjpake_cache );\n    ssl->handshake->ecjpake_cache = NULL;\n    ssl->handshake->ecjpake_cache_len = 0;\n\n    if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,\n                                                buf, len ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecjpake_read_round_one\", ret );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( ret );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_SSL_ALPN)\nstatic int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,\n                               const unsigned char *buf, size_t len )\n{\n    size_t list_len, name_len;\n    const char **p;\n\n    /* If we didn't send it, the server shouldn't send it */\n    if( ssl->conf->alpn_list == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-matching ALPN extension\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    /*\n     * opaque ProtocolName<1..2^8-1>;\n     *\n     * struct {\n     *     ProtocolName protocol_name_list<2..2^16-1>\n     * } ProtocolNameList;\n     *\n     * the \"ProtocolNameList\" MUST contain exactly one \"ProtocolName\"\n     */\n\n    /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */\n    if( len < 4 )\n    {\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    list_len = ( buf[0] << 8 ) | buf[1];\n    if( list_len != len - 2 )\n    {\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    name_len = buf[2];\n    if( name_len != list_len - 1 )\n    {\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    /* Check that the server chosen protocol was in our list and save it */\n    for( p = ssl->conf->alpn_list; *p != NULL; p++ )\n    {\n        if( name_len == strlen( *p ) &&\n            memcmp( buf + 3, *p, name_len ) == 0 )\n        {\n            ssl->alpn_chosen = *p;\n            return( 0 );\n        }\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"ALPN extension: no matching protocol\" ) );\n    mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                    MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n    return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n}\n#endif /* MBEDTLS_SSL_ALPN */\n\n/*\n * Parse HelloVerifyRequest.  Only called after verifying the HS type.\n */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\nstatic int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl )\n{\n    const unsigned char *p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );\n    int major_ver, minor_ver;\n    unsigned char cookie_len;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse hello verify request\" ) );\n\n    /*\n     * struct {\n     *   ProtocolVersion server_version;\n     *   opaque cookie<0..2^8-1>;\n     * } HelloVerifyRequest;\n     */\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"server version\", p, 2 );\n    mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, p );\n    p += 2;\n\n    /*\n     * Since the RFC is not clear on this point, accept DTLS 1.0 (TLS 1.1)\n     * even is lower than our min version.\n     */\n    if( major_ver < MBEDTLS_SSL_MAJOR_VERSION_3 ||\n        minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 ||\n        major_ver > ssl->conf->max_major_ver  ||\n        minor_ver > ssl->conf->max_minor_ver  )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server version\" ) );\n\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                     MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );\n\n        return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );\n    }\n\n    cookie_len = *p++;\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"cookie\", p, cookie_len );\n\n    if( ( ssl->in_msg + ssl->in_msglen ) - p < cookie_len )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1,\n            ( \"cookie length does not match incoming message size\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                    MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    mbedtls_free( ssl->handshake->verify_cookie );\n\n    ssl->handshake->verify_cookie = mbedtls_calloc( 1, cookie_len );\n    if( ssl->handshake->verify_cookie  == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"alloc failed (%d bytes)\", cookie_len ) );\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n    }\n\n    memcpy( ssl->handshake->verify_cookie, p, cookie_len );\n    ssl->handshake->verify_cookie_len = cookie_len;\n\n    /* Start over at ClientHello */\n    ssl->state = MBEDTLS_SSL_CLIENT_HELLO;\n    mbedtls_ssl_reset_checksum( ssl );\n\n    mbedtls_ssl_recv_flight_completed( ssl );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse hello verify request\" ) );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\nstatic int ssl_parse_server_hello( mbedtls_ssl_context *ssl )\n{\n    int ret, i;\n    size_t n;\n    size_t ext_len;\n    unsigned char *buf, *ext;\n    unsigned char comp;\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    int accept_comp;\n#endif\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    int renegotiation_info_seen = 0;\n#endif\n    int handshake_failure = 0;\n    const mbedtls_ssl_ciphersuite_t *suite_info;\n#if defined(MBEDTLS_DEBUG_C)\n    uint32_t t;\n#endif\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse server hello\" ) );\n\n    buf = ssl->in_msg;\n\n    if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n    {\n        /* No alert on a read error. */\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n        return( ret );\n    }\n\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n        if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )\n        {\n            ssl->renego_records_seen++;\n\n            if( ssl->conf->renego_max_records >= 0 &&\n                ssl->renego_records_seen > ssl->conf->renego_max_records )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"renegotiation requested, \"\n                                    \"but not honored by server\" ) );\n                return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n            }\n\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-handshake message during renego\" ) );\n\n            ssl->keep_current_message = 1;\n            return( MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO );\n        }\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        if( buf[0] == MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"received hello verify request\" ) );\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse server hello\" ) );\n            return( ssl_parse_hello_verify_request( ssl ) );\n        }\n        else\n        {\n            /* We made it through the verification process */\n            mbedtls_free( ssl->handshake->verify_cookie );\n            ssl->handshake->verify_cookie = NULL;\n            ssl->handshake->verify_cookie_len = 0;\n        }\n    }\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n    if( ssl->in_hslen < 38 + mbedtls_ssl_hs_hdr_len( ssl ) ||\n        buf[0] != MBEDTLS_SSL_HS_SERVER_HELLO )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    /*\n     *  0   .  1    server_version\n     *  2   . 33    random (maybe including 4 bytes of Unix time)\n     * 34   . 34    session_id length = n\n     * 35   . 34+n  session_id\n     * 35+n . 36+n  cipher_suite\n     * 37+n . 37+n  compression_method\n     *\n     * 38+n . 39+n  extensions length (optional)\n     * 40+n .  ..   extensions\n     */\n    buf += mbedtls_ssl_hs_hdr_len( ssl );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"server hello, version\", buf + 0, 2 );\n    mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,\n                      ssl->conf->transport, buf + 0 );\n\n    if( ssl->major_ver < ssl->conf->min_major_ver ||\n        ssl->minor_ver < ssl->conf->min_minor_ver ||\n        ssl->major_ver > ssl->conf->max_major_ver ||\n        ssl->minor_ver > ssl->conf->max_minor_ver )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"server version out of bounds - \"\n                            \" min: [%d:%d], server: [%d:%d], max: [%d:%d]\",\n                            ssl->conf->min_major_ver, ssl->conf->min_minor_ver,\n                            ssl->major_ver, ssl->minor_ver,\n                            ssl->conf->max_major_ver, ssl->conf->max_minor_ver ) );\n\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                     MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );\n\n        return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );\n    }\n\n#if defined(MBEDTLS_DEBUG_C)\n    t = ( (uint32_t) buf[2] << 24 )\n      | ( (uint32_t) buf[3] << 16 )\n      | ( (uint32_t) buf[4] <<  8 )\n      | ( (uint32_t) buf[5]       );\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, current time: %lu\", t ) );\n#endif\n\n    memcpy( ssl->handshake->randbytes + 32, buf + 2, 32 );\n\n    n = buf[34];\n\n    MBEDTLS_SSL_DEBUG_BUF( 3,   \"server hello, random bytes\", buf + 2, 32 );\n\n    if( n > 32 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    if( ssl->in_hslen > mbedtls_ssl_hs_hdr_len( ssl ) + 39 + n )\n    {\n        ext_len = ( ( buf[38 + n] <<  8 )\n                  | ( buf[39 + n]       ) );\n\n        if( ( ext_len > 0 && ext_len < 4 ) ||\n            ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 40 + n + ext_len )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n        }\n    }\n    else if( ssl->in_hslen == mbedtls_ssl_hs_hdr_len( ssl ) + 38 + n )\n    {\n        ext_len = 0;\n    }\n    else\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    /* ciphersuite (used later) */\n    i = ( buf[35 + n] << 8 ) | buf[36 + n];\n\n    /*\n     * Read and check compression\n     */\n    comp = buf[37 + n];\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    /* See comments in ssl_write_client_hello() */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        accept_comp = 0;\n    else\n#endif\n        accept_comp = 1;\n\n    if( comp != MBEDTLS_SSL_COMPRESS_NULL &&\n        ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) )\n#else /* MBEDTLS_ZLIB_SUPPORT */\n    if( comp != MBEDTLS_SSL_COMPRESS_NULL )\n#endif/* MBEDTLS_ZLIB_SUPPORT */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"server hello, bad compression: %d\", comp ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n        return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );\n    }\n\n    /*\n     * Initialize update checksum functions\n     */\n    ssl->transform_negotiate->ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( i );\n\n    if( ssl->transform_negotiate->ciphersuite_info == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"ciphersuite info for %04x not found\", i ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    mbedtls_ssl_optimize_checksum( ssl, ssl->transform_negotiate->ciphersuite_info );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, session id len.: %d\", n ) );\n    MBEDTLS_SSL_DEBUG_BUF( 3,   \"server hello, session id\", buf + 35, n );\n\n    /*\n     * Check if the session can be resumed\n     */\n    if( ssl->handshake->resume == 0 || n == 0 ||\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n        ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ||\n#endif\n        ssl->session_negotiate->ciphersuite != i ||\n        ssl->session_negotiate->compression != comp ||\n        ssl->session_negotiate->id_len != n ||\n        memcmp( ssl->session_negotiate->id, buf + 35, n ) != 0 )\n    {\n        ssl->state++;\n        ssl->handshake->resume = 0;\n#if defined(MBEDTLS_HAVE_TIME)\n        ssl->session_negotiate->start = mbedtls_time( NULL );\n#endif\n        ssl->session_negotiate->ciphersuite = i;\n        ssl->session_negotiate->compression = comp;\n        ssl->session_negotiate->id_len = n;\n        memcpy( ssl->session_negotiate->id, buf + 35, n );\n    }\n    else\n    {\n        ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;\n\n        if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_derive_keys\", ret );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );\n            return( ret );\n        }\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"%s session has been resumed\",\n                   ssl->handshake->resume ? \"a\" : \"no\" ) );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, chosen ciphersuite: %04x\", i ) );\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, compress alg.: %d\", buf[37 + n] ) );\n\n    suite_info = mbedtls_ssl_ciphersuite_from_id( ssl->session_negotiate->ciphersuite );\n    if( suite_info == NULL\n#if defined(MBEDTLS_ARC4_C)\n            || ( ssl->conf->arc4_disabled &&\n                suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )\n#endif\n        )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, chosen ciphersuite: %s\", suite_info->name ) );\n\n    i = 0;\n    while( 1 )\n    {\n        if( ssl->conf->ciphersuite_list[ssl->minor_ver][i] == 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n        }\n\n        if( ssl->conf->ciphersuite_list[ssl->minor_ver][i++] ==\n            ssl->session_negotiate->ciphersuite )\n        {\n            break;\n        }\n    }\n\n    if( comp != MBEDTLS_SSL_COMPRESS_NULL\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n        && comp != MBEDTLS_SSL_COMPRESS_DEFLATE\n#endif\n      )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n    ssl->session_negotiate->compression = comp;\n\n    ext = buf + 40 + n;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"server hello, total extension length: %d\", ext_len ) );\n\n    while( ext_len )\n    {\n        unsigned int ext_id   = ( ( ext[0] <<  8 )\n                                | ( ext[1]       ) );\n        unsigned int ext_size = ( ( ext[2] <<  8 )\n                                | ( ext[3]       ) );\n\n        if( ext_size + 4 > ext_len )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n        }\n\n        switch( ext_id )\n        {\n        case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found renegotiation extension\" ) );\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n            renegotiation_info_seen = 1;\n#endif\n\n            if( ( ret = ssl_parse_renegotiation_info( ssl, ext + 4,\n                                                      ext_size ) ) != 0 )\n                return( ret );\n\n            break;\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n        case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found max_fragment_length extension\" ) );\n\n            if( ( ret = ssl_parse_max_fragment_length_ext( ssl,\n                            ext + 4, ext_size ) ) != 0 )\n            {\n                return( ret );\n            }\n\n            break;\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n        case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found truncated_hmac extension\" ) );\n\n            if( ( ret = ssl_parse_truncated_hmac_ext( ssl,\n                            ext + 4, ext_size ) ) != 0 )\n            {\n                return( ret );\n            }\n\n            break;\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n        case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found encrypt_then_mac extension\" ) );\n\n            if( ( ret = ssl_parse_encrypt_then_mac_ext( ssl,\n                            ext + 4, ext_size ) ) != 0 )\n            {\n                return( ret );\n            }\n\n            break;\n#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n        case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found extended_master_secret extension\" ) );\n\n            if( ( ret = ssl_parse_extended_ms_ext( ssl,\n                            ext + 4, ext_size ) ) != 0 )\n            {\n                return( ret );\n            }\n\n            break;\n#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n        case MBEDTLS_TLS_EXT_SESSION_TICKET:\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found session_ticket extension\" ) );\n\n            if( ( ret = ssl_parse_session_ticket_ext( ssl,\n                            ext + 4, ext_size ) ) != 0 )\n            {\n                return( ret );\n            }\n\n            break;\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n        case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found supported_point_formats extension\" ) );\n\n            if( ( ret = ssl_parse_supported_point_formats_ext( ssl,\n                            ext + 4, ext_size ) ) != 0 )\n            {\n                return( ret );\n            }\n\n            break;\n#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||\n          MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n        case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found ecjpake_kkpp extension\" ) );\n\n            if( ( ret = ssl_parse_ecjpake_kkpp( ssl,\n                            ext + 4, ext_size ) ) != 0 )\n            {\n                return( ret );\n            }\n\n            break;\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_SSL_ALPN)\n        case MBEDTLS_TLS_EXT_ALPN:\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found alpn extension\" ) );\n\n            if( ( ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size ) ) != 0 )\n                return( ret );\n\n            break;\n#endif /* MBEDTLS_SSL_ALPN */\n\n        default:\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"unknown extension found: %d (ignoring)\",\n                           ext_id ) );\n        }\n\n        ext_len -= 4 + ext_size;\n        ext += 4 + ext_size;\n\n        if( ext_len > 0 && ext_len < 4 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello message\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n        }\n    }\n\n    /*\n     * Renegotiation security checks\n     */\n    if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&\n        ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"legacy renegotiation, breaking off handshake\" ) );\n        handshake_failure = 1;\n    }\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&\n             ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&\n             renegotiation_info_seen == 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"renegotiation_info extension missing (secure)\" ) );\n        handshake_failure = 1;\n    }\n    else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&\n             ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&\n             ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"legacy renegotiation not allowed\" ) );\n        handshake_failure = 1;\n    }\n    else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&\n             ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&\n             renegotiation_info_seen == 1 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"renegotiation_info extension present (legacy)\" ) );\n        handshake_failure = 1;\n    }\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n    if( handshake_failure == 1 )\n    {\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse server hello\" ) );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \\\n    defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\nstatic int ssl_parse_server_dh_params( mbedtls_ssl_context *ssl, unsigned char **p,\n                                       unsigned char *end )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n\n    /*\n     * Ephemeral DH parameters:\n     *\n     * struct {\n     *     opaque dh_p<1..2^16-1>;\n     *     opaque dh_g<1..2^16-1>;\n     *     opaque dh_Ys<1..2^16-1>;\n     * } ServerDHParams;\n     */\n    if( ( ret = mbedtls_dhm_read_params( &ssl->handshake->dhm_ctx, p, end ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 2, ( \"mbedtls_dhm_read_params\" ), ret );\n        return( ret );\n    }\n\n    if( ssl->handshake->dhm_ctx.len * 8 < ssl->conf->dhm_min_bitlen )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"DHM prime too short: %d < %d\",\n                                    ssl->handshake->dhm_ctx.len * 8,\n                                    ssl->conf->dhm_min_bitlen ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n    }\n\n    MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: P \", &ssl->handshake->dhm_ctx.P  );\n    MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: G \", &ssl->handshake->dhm_ctx.G  );\n    MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: GY\", &ssl->handshake->dhm_ctx.GY );\n\n    return( ret );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) ||                   \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) ||                     \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||                      \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\nstatic int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl )\n{\n    const mbedtls_ecp_curve_info *curve_info;\n\n    curve_info = mbedtls_ecp_curve_info_from_grp_id( ssl->handshake->ecdh_ctx.grp.id );\n    if( curve_info == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"ECDH curve: %s\", curve_info->name ) );\n\n#if defined(MBEDTLS_ECP_C)\n    if( mbedtls_ssl_check_curve( ssl, ssl->handshake->ecdh_ctx.grp.id ) != 0 )\n#else\n    if( ssl->handshake->ecdh_ctx.grp.nbits < 163 ||\n        ssl->handshake->ecdh_ctx.grp.nbits > 521 )\n#endif\n        return( -1 );\n\n    MBEDTLS_SSL_DEBUG_ECP( 3, \"ECDH: Qp\", &ssl->handshake->ecdh_ctx.Qp );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) ||                   \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\nstatic int ssl_parse_server_ecdh_params( mbedtls_ssl_context *ssl,\n                                         unsigned char **p,\n                                         unsigned char *end )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n\n    /*\n     * Ephemeral ECDH parameters:\n     *\n     * struct {\n     *     ECParameters curve_params;\n     *     ECPoint      public;\n     * } ServerECDHParams;\n     */\n    if( ( ret = mbedtls_ecdh_read_params( &ssl->handshake->ecdh_ctx,\n                                  (const unsigned char **) p, end ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, ( \"mbedtls_ecdh_read_params\" ), ret );\n        return( ret );\n    }\n\n    if( ssl_check_server_ecdh_params( ssl ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server key exchange message (ECDHE curve)\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n    }\n\n    return( ret );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\nstatic int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl,\n                                      unsigned char **p,\n                                      unsigned char *end )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n    size_t  len;\n    ((void) ssl);\n\n    /*\n     * PSK parameters:\n     *\n     * opaque psk_identity_hint<0..2^16-1>;\n     */\n    len = (*p)[0] << 8 | (*p)[1];\n    *p += 2;\n\n    if( (*p) + len > end )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server key exchange message \"\n                                    \"(psk_identity_hint length)\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n    }\n\n    /*\n     * Note: we currently ignore the PKS identity hint, as we only allow one\n     * PSK to be provisionned on the client. This could be changed later if\n     * someone needs that feature.\n     */\n    *p += len;\n    ret = 0;\n\n    return( ret );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) ||                           \\\n    defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)\n/*\n * Generate a pre-master secret and encrypt it with the server's RSA key\n */\nstatic int ssl_write_encrypted_pms( mbedtls_ssl_context *ssl,\n                                    size_t offset, size_t *olen,\n                                    size_t pms_offset )\n{\n    int ret;\n    size_t len_bytes = ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ? 0 : 2;\n    unsigned char *p = ssl->handshake->premaster + pms_offset;\n\n    if( offset + len_bytes > MBEDTLS_SSL_MAX_CONTENT_LEN )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small for encrypted pms\" ) );\n        return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );\n    }\n\n    /*\n     * Generate (part of) the pre-master as\n     *  struct {\n     *      ProtocolVersion client_version;\n     *      opaque random[46];\n     *  } PreMasterSecret;\n     */\n    mbedtls_ssl_write_version( ssl->conf->max_major_ver, ssl->conf->max_minor_ver,\n                       ssl->conf->transport, p );\n\n    if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p + 2, 46 ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"f_rng\", ret );\n        return( ret );\n    }\n\n    ssl->handshake->pmslen = 48;\n\n    if( ssl->session_negotiate->peer_cert == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"certificate required\" ) );\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n    /*\n     * Now write it out, encrypted\n     */\n    if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,\n                MBEDTLS_PK_RSA ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"certificate key type mismatch\" ) );\n        return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );\n    }\n\n    if( ( ret = mbedtls_pk_encrypt( &ssl->session_negotiate->peer_cert->pk,\n                            p, ssl->handshake->pmslen,\n                            ssl->out_msg + offset + len_bytes, olen,\n                            MBEDTLS_SSL_MAX_CONTENT_LEN - offset - len_bytes,\n                            ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_rsa_pkcs1_encrypt\", ret );\n        return( ret );\n    }\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    if( len_bytes == 2 )\n    {\n        ssl->out_msg[offset+0] = (unsigned char)( *olen >> 8 );\n        ssl->out_msg[offset+1] = (unsigned char)( *olen      );\n        *olen += 2;\n    }\n#endif\n\n    return( 0 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)\nstatic int ssl_parse_signature_algorithm( mbedtls_ssl_context *ssl,\n                                          unsigned char **p,\n                                          unsigned char *end,\n                                          mbedtls_md_type_t *md_alg,\n                                          mbedtls_pk_type_t *pk_alg )\n{\n    ((void) ssl);\n    *md_alg = MBEDTLS_MD_NONE;\n    *pk_alg = MBEDTLS_PK_NONE;\n\n    /* Only in TLS 1.2 */\n    if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        return( 0 );\n    }\n\n    if( (*p) + 2 > end )\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n\n    /*\n     * Get hash algorithm\n     */\n    if( ( *md_alg = mbedtls_ssl_md_alg_from_hash( (*p)[0] ) ) == MBEDTLS_MD_NONE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"Server used unsupported \"\n                            \"HashAlgorithm %d\", *(p)[0] ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n    }\n\n    /*\n     * Get signature algorithm\n     */\n    if( ( *pk_alg = mbedtls_ssl_pk_alg_from_sig( (*p)[1] ) ) == MBEDTLS_PK_NONE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"server used unsupported \"\n                            \"SignatureAlgorithm %d\", (*p)[1] ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n    }\n\n    /*\n     * Check if the hash is acceptable\n     */\n    if( mbedtls_ssl_check_sig_hash( ssl, *md_alg ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"server used HashAlgorithm %d that was not offered\",\n                                    *(p)[0] ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"Server used SignatureAlgorithm %d\", (*p)[1] ) );\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"Server used HashAlgorithm %d\", (*p)[0] ) );\n    *p += 2;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\nstatic int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    const mbedtls_ecp_keypair *peer_key;\n\n    if( ssl->session_negotiate->peer_cert == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"certificate required\" ) );\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n    if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,\n                     MBEDTLS_PK_ECKEY ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"server key not ECDH capable\" ) );\n        return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );\n    }\n\n    peer_key = mbedtls_pk_ec( ssl->session_negotiate->peer_cert->pk );\n\n    if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx, peer_key,\n                                 MBEDTLS_ECDH_THEIRS ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, ( \"mbedtls_ecdh_get_params\" ), ret );\n        return( ret );\n    }\n\n    if( ssl_check_server_ecdh_params( ssl ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server certificate (ECDH curve)\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );\n    }\n\n    return( ret );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||\n          MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */\n\nstatic int ssl_parse_server_key_exchange( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n        ssl->transform_negotiate->ciphersuite_info;\n    unsigned char *p, *end;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse server key exchange\" ) );\n\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip parse server key exchange\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n    ((void) p);\n    ((void) end);\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )\n    {\n        if( ( ret = ssl_get_ecdh_params_from_cert( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_get_ecdh_params_from_cert\", ret );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n            return( ret );\n        }\n\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip parse server key exchange\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n    ((void) p);\n    ((void) end);\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */\n\n    if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n        return( ret );\n    }\n\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server key exchange message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n    /*\n     * ServerKeyExchange may be skipped with PSK and RSA-PSK when the server\n     * doesn't use a psk_identity_hint\n     */\n    if( ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE )\n    {\n        if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n            ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )\n        {\n            /* Current message is probably either\n             * CertificateRequest or ServerHelloDone */\n            ssl->keep_current_message = 1;\n            goto exit;\n        }\n\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"server key exchange message must \"\n                                    \"not be skipped\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );\n\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n    p   = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );\n    end = ssl->in_msg + ssl->in_hslen;\n    MBEDTLS_SSL_DEBUG_BUF( 3,   \"server key exchange\", p, end - p );\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )\n    {\n        if( ssl_parse_server_psk_hint( ssl, &p, end ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server key exchange message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n        }\n    } /* FALLTROUGH */\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED) ||                       \\\n    defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )\n        ; /* nothing more to do */\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \\\n    defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )\n    {\n        if( ssl_parse_server_dh_params( ssl, &p, end ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server key exchange message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED) ||                     \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )\n    {\n        if( ssl_parse_server_ecdh_params( ssl, &p, end ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server key exchange message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,\n                                              p, end - p );\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecjpake_read_round_two\", ret );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)\n    if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) )\n    {\n        size_t sig_len, hashlen;\n        unsigned char hash[64];\n        mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;\n        mbedtls_pk_type_t pk_alg = MBEDTLS_PK_NONE;\n        unsigned char *params = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );\n        size_t params_len = p - params;\n\n        /*\n         * Handle the digitally-signed structure\n         */\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n        {\n            if( ssl_parse_signature_algorithm( ssl, &p, end,\n                                               &md_alg, &pk_alg ) != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server key exchange message\" ) );\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n                return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n            }\n\n            if( pk_alg != mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info ) )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server key exchange message\" ) );\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n                return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n            }\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n        if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )\n        {\n            pk_alg = mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );\n\n            /* Default hash for ECDSA is SHA-1 */\n            if( pk_alg == MBEDTLS_PK_ECDSA && md_alg == MBEDTLS_MD_NONE )\n                md_alg = MBEDTLS_MD_SHA1;\n        }\n        else\n#endif\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        /*\n         * Read signature\n         */\n        sig_len = ( p[0] << 8 ) | p[1];\n        p += 2;\n\n        if( end != p + sig_len )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server key exchange message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n        }\n\n        MBEDTLS_SSL_DEBUG_BUF( 3, \"signature\", p, sig_len );\n\n        /*\n         * Compute the hash that has been signed\n         */\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n        if( md_alg == MBEDTLS_MD_NONE )\n        {\n            mbedtls_md5_context mbedtls_md5;\n            mbedtls_sha1_context mbedtls_sha1;\n\n            mbedtls_md5_init(  &mbedtls_md5  );\n            mbedtls_sha1_init( &mbedtls_sha1 );\n\n            hashlen = 36;\n\n            /*\n             * digitally-signed struct {\n             *     opaque md5_hash[16];\n             *     opaque sha_hash[20];\n             * };\n             *\n             * md5_hash\n             *     MD5(ClientHello.random + ServerHello.random\n             *                            + ServerParams);\n             * sha_hash\n             *     SHA(ClientHello.random + ServerHello.random\n             *                            + ServerParams);\n             */\n            mbedtls_md5_starts( &mbedtls_md5 );\n            mbedtls_md5_update( &mbedtls_md5, ssl->handshake->randbytes, 64 );\n            mbedtls_md5_update( &mbedtls_md5, params, params_len );\n            mbedtls_md5_finish( &mbedtls_md5, hash );\n\n            mbedtls_sha1_starts( &mbedtls_sha1 );\n            mbedtls_sha1_update( &mbedtls_sha1, ssl->handshake->randbytes, 64 );\n            mbedtls_sha1_update( &mbedtls_sha1, params, params_len );\n            mbedtls_sha1_finish( &mbedtls_sha1, hash + 16 );\n\n            mbedtls_md5_free(  &mbedtls_md5  );\n            mbedtls_sha1_free( &mbedtls_sha1 );\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \\\n          MBEDTLS_SSL_PROTO_TLS1_1 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        if( md_alg != MBEDTLS_MD_NONE )\n        {\n            mbedtls_md_context_t ctx;\n\n            mbedtls_md_init( &ctx );\n\n            /* Info from md_alg will be used instead */\n            hashlen = 0;\n\n            /*\n             * digitally-signed struct {\n             *     opaque client_random[32];\n             *     opaque server_random[32];\n             *     ServerDHParams params;\n             * };\n             */\n            if( ( ret = mbedtls_md_setup( &ctx,\n                                     mbedtls_md_info_from_type( md_alg ), 0 ) ) != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_md_setup\", ret );\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );\n                return( ret );\n            }\n\n            mbedtls_md_starts( &ctx );\n            mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 );\n            mbedtls_md_update( &ctx, params, params_len );\n            mbedtls_md_finish( &ctx, hash );\n            mbedtls_md_free( &ctx );\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \\\n          MBEDTLS_SSL_PROTO_TLS1_2 */\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        MBEDTLS_SSL_DEBUG_BUF( 3, \"parameters hash\", hash, hashlen != 0 ? hashlen :\n            (unsigned int) ( mbedtls_md_get_size( mbedtls_md_info_from_type( md_alg ) ) ) );\n\n        if( ssl->session_negotiate->peer_cert == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"certificate required\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n            return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n        }\n\n        /*\n         * Verify signature\n         */\n        if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server key exchange message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n            return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );\n        }\n\n        if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk,\n                               md_alg, hash, hashlen, p, sig_len ) ) != 0 )\n        {\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR );\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_pk_verify\", ret );\n            return( ret );\n        }\n    }\n#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */\n\nexit:\n    ssl->state++;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse server key exchange\" ) );\n\n    return( 0 );\n}\n\n#if ! defined(MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED)\nstatic int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )\n{\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n        ssl->transform_negotiate->ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse certificate request\" ) );\n\n    if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip parse certificate request\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n    return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n}\n#else /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */\nstatic int ssl_parse_certificate_request( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    unsigned char *buf;\n    size_t n = 0;\n    size_t cert_type_len = 0, dn_len = 0;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n        ssl->transform_negotiate->ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse certificate request\" ) );\n\n    if( ! mbedtls_ssl_ciphersuite_cert_req_allowed( ciphersuite_info ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip parse certificate request\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n    if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n        return( ret );\n    }\n\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate request message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n    ssl->state++;\n    ssl->client_auth = ( ssl->in_msg[0] == MBEDTLS_SSL_HS_CERTIFICATE_REQUEST );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"got %s certificate request\",\n                        ssl->client_auth ? \"a\" : \"no\" ) );\n\n    if( ssl->client_auth == 0 )\n    {\n        /* Current message is probably the ServerHelloDone */\n        ssl->keep_current_message = 1;\n        goto exit;\n    }\n\n    /*\n     *  struct {\n     *      ClientCertificateType certificate_types<1..2^8-1>;\n     *      SignatureAndHashAlgorithm\n     *        supported_signature_algorithms<2^16-1>; -- TLS 1.2 only\n     *      DistinguishedName certificate_authorities<0..2^16-1>;\n     *  } CertificateRequest;\n     *\n     *  Since we only support a single certificate on clients, let's just\n     *  ignore all the information that's supposed to help us pick a\n     *  certificate.\n     *\n     *  We could check that our certificate matches the request, and bail out\n     *  if it doesn't, but it's simpler to just send the certificate anyway,\n     *  and give the server the opportunity to decide if it should terminate\n     *  the connection when it doesn't like our certificate.\n     *\n     *  Same goes for the hash in TLS 1.2's signature_algorithms: at this\n     *  point we only have one hash available (see comments in\n     *  write_certificate_verify), so let's just use what we have.\n     *\n     *  However, we still minimally parse the message to check it is at least\n     *  superficially sane.\n     */\n    buf = ssl->in_msg;\n\n    /* certificate_types */\n    cert_type_len = buf[mbedtls_ssl_hs_hdr_len( ssl )];\n    n = cert_type_len;\n\n    if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate request message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );\n    }\n\n    /* supported_signature_algorithms */\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        size_t sig_alg_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] <<  8 )\n                             | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n]       ) );\n#if defined(MBEDTLS_DEBUG_C)\n        unsigned char* sig_alg = buf + mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n;\n        size_t i;\n\n        for( i = 0; i < sig_alg_len; i += 2 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"Supported Signature Algorithm found: %d\"\n                                        \",%d\", sig_alg[i], sig_alg[i + 1]  ) );\n        }\n#endif\n\n        n += 2 + sig_alg_len;\n\n        if( ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate request message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );\n        }\n    }\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\n    /* certificate_authorities */\n    dn_len = ( ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 1 + n] <<  8 )\n             | ( buf[mbedtls_ssl_hs_hdr_len( ssl ) + 2 + n]       ) );\n\n    n += dn_len;\n    if( ssl->in_hslen != mbedtls_ssl_hs_hdr_len( ssl ) + 3 + n )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate request message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST );\n    }\n\nexit:\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse certificate request\" ) );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__CERT_REQ_ALLOWED__ENABLED */\n\nstatic int ssl_parse_server_hello_done( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse server hello done\" ) );\n\n    if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n        return( ret );\n    }\n\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello done message\" ) );\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n    if( ssl->in_hslen  != mbedtls_ssl_hs_hdr_len( ssl ) ||\n        ssl->in_msg[0] != MBEDTLS_SSL_HS_SERVER_HELLO_DONE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad server hello done message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );\n    }\n\n    ssl->state++;\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        mbedtls_ssl_recv_flight_completed( ssl );\n#endif\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse server hello done\" ) );\n\n    return( 0 );\n}\n\nstatic int ssl_write_client_key_exchange( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    size_t i, n;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n        ssl->transform_negotiate->ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write client key exchange\" ) );\n\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )\n    {\n        /*\n         * DHM key exchange -- send G^X mod P\n         */\n        n = ssl->handshake->dhm_ctx.len;\n\n        ssl->out_msg[4] = (unsigned char)( n >> 8 );\n        ssl->out_msg[5] = (unsigned char)( n      );\n        i = 6;\n\n        ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,\n                                (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),\n                               &ssl->out_msg[i], n,\n                                ssl->conf->f_rng, ssl->conf->p_rng );\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_dhm_make_public\", ret );\n            return( ret );\n        }\n\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: X \", &ssl->handshake->dhm_ctx.X  );\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: GX\", &ssl->handshake->dhm_ctx.GX );\n\n        if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,\n                                      ssl->handshake->premaster,\n                                      MBEDTLS_PREMASTER_SIZE,\n                                     &ssl->handshake->pmslen,\n                                      ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_dhm_calc_secret\", ret );\n            return( ret );\n        }\n\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: K \", &ssl->handshake->dhm_ctx.K  );\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) ||                   \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||                      \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )\n    {\n        /*\n         * ECDH key exchange -- send client public value\n         */\n        i = 4;\n\n        ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx,\n                                &n,\n                                &ssl->out_msg[i], 1000,\n                                ssl->conf->f_rng, ssl->conf->p_rng );\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecdh_make_public\", ret );\n            return( ret );\n        }\n\n        MBEDTLS_SSL_DEBUG_ECP( 3, \"ECDH: Q\", &ssl->handshake->ecdh_ctx.Q );\n\n        if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,\n                                      &ssl->handshake->pmslen,\n                                       ssl->handshake->premaster,\n                                       MBEDTLS_MPI_MAX_SIZE,\n                                       ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecdh_calc_secret\", ret );\n            return( ret );\n        }\n\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"ECDH: z\", &ssl->handshake->ecdh_ctx.z );\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    if( mbedtls_ssl_ciphersuite_uses_psk( ciphersuite_info ) )\n    {\n        /*\n         * opaque psk_identity<0..2^16-1>;\n         */\n        if( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got no private key for PSK\" ) );\n            return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );\n        }\n\n        i = 4;\n        n = ssl->conf->psk_identity_len;\n\n        if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"psk identity too long or \"\n                                        \"SSL buffer too short\" ) );\n            return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );\n        }\n\n        ssl->out_msg[i++] = (unsigned char)( n >> 8 );\n        ssl->out_msg[i++] = (unsigned char)( n      );\n\n        memcpy( ssl->out_msg + i, ssl->conf->psk_identity, ssl->conf->psk_identity_len );\n        i += ssl->conf->psk_identity_len;\n\n#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)\n        if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )\n        {\n            n = 0;\n        }\n        else\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)\n        if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )\n        {\n            if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 2 ) ) != 0 )\n                return( ret );\n        }\n        else\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\n        if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )\n        {\n            /*\n             * ClientDiffieHellmanPublic public (DHM send G^X mod P)\n             */\n            n = ssl->handshake->dhm_ctx.len;\n\n            if( i + 2 + n > MBEDTLS_SSL_MAX_CONTENT_LEN )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"psk identity or DHM size too long\"\n                                            \" or SSL buffer too short\" ) );\n                return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );\n            }\n\n            ssl->out_msg[i++] = (unsigned char)( n >> 8 );\n            ssl->out_msg[i++] = (unsigned char)( n      );\n\n            ret = mbedtls_dhm_make_public( &ssl->handshake->dhm_ctx,\n                    (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),\n                    &ssl->out_msg[i], n,\n                    ssl->conf->f_rng, ssl->conf->p_rng );\n            if( ret != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_dhm_make_public\", ret );\n                return( ret );\n            }\n        }\n        else\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\n        if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )\n        {\n            /*\n             * ClientECDiffieHellmanPublic public;\n             */\n            ret = mbedtls_ecdh_make_public( &ssl->handshake->ecdh_ctx, &n,\n                    &ssl->out_msg[i], MBEDTLS_SSL_MAX_CONTENT_LEN - i,\n                    ssl->conf->f_rng, ssl->conf->p_rng );\n            if( ret != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecdh_make_public\", ret );\n                return( ret );\n            }\n\n            MBEDTLS_SSL_DEBUG_ECP( 3, \"ECDH: Q\", &ssl->handshake->ecdh_ctx.Q );\n        }\n        else\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,\n                        ciphersuite_info->key_exchange ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_psk_derive_premaster\", ret );\n            return( ret );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )\n    {\n        i = 4;\n        if( ( ret = ssl_write_encrypted_pms( ssl, i, &n, 0 ) ) != 0 )\n            return( ret );\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        i = 4;\n\n        ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,\n                ssl->out_msg + i, MBEDTLS_SSL_MAX_CONTENT_LEN - i, &n,\n                ssl->conf->f_rng, ssl->conf->p_rng );\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecjpake_write_round_two\", ret );\n            return( ret );\n        }\n\n        ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,\n                ssl->handshake->premaster, 32, &ssl->handshake->pmslen,\n                ssl->conf->f_rng, ssl->conf->p_rng );\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecjpake_derive_secret\", ret );\n            return( ret );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */\n    {\n        ((void) ciphersuite_info);\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    ssl->out_msglen  = i + n;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE;\n\n    ssl->state++;\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write client key exchange\" ) );\n\n    return( 0 );\n}\n\n#if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)       && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)   && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)  && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)\nstatic int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )\n{\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n        ssl->transform_negotiate->ciphersuite_info;\n    int ret;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write certificate verify\" ) );\n\n    if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_derive_keys\", ret );\n        return( ret );\n    }\n\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip write certificate verify\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n    return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n}\n#else\nstatic int ssl_write_certificate_verify( mbedtls_ssl_context *ssl )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n        ssl->transform_negotiate->ciphersuite_info;\n    size_t n = 0, offset = 0;\n    unsigned char hash[48];\n    unsigned char *hash_start = hash;\n    mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;\n    unsigned int hashlen;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write certificate verify\" ) );\n\n    if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_derive_keys\", ret );\n        return( ret );\n    }\n\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip write certificate verify\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n    if( ssl->client_auth == 0 || mbedtls_ssl_own_cert( ssl ) == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip write certificate verify\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n    if( mbedtls_ssl_own_key( ssl ) == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got no private key for certificate\" ) );\n        return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );\n    }\n\n    /*\n     * Make an RSA signature of the handshake digests\n     */\n    ssl->handshake->calc_verify( ssl, hash );\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n    if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        /*\n         * digitally-signed struct {\n         *     opaque md5_hash[16];\n         *     opaque sha_hash[20];\n         * };\n         *\n         * md5_hash\n         *     MD5(handshake_messages);\n         *\n         * sha_hash\n         *     SHA(handshake_messages);\n         */\n        hashlen = 36;\n        md_alg = MBEDTLS_MD_NONE;\n\n        /*\n         * For ECDSA, default hash is SHA-1 only\n         */\n        if( mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECDSA ) )\n        {\n            hash_start += 16;\n            hashlen -= 16;\n            md_alg = MBEDTLS_MD_SHA1;\n        }\n    }\n    else\n#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \\\n          MBEDTLS_SSL_PROTO_TLS1_1 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        /*\n         * digitally-signed struct {\n         *     opaque handshake_messages[handshake_messages_length];\n         * };\n         *\n         * Taking shortcut here. We assume that the server always allows the\n         * PRF Hash function and has sent it in the allowed signature\n         * algorithms list received in the Certificate Request message.\n         *\n         * Until we encounter a server that does not, we will take this\n         * shortcut.\n         *\n         * Reason: Otherwise we should have running hashes for SHA512 and SHA224\n         *         in order to satisfy 'weird' needs from the server side.\n         */\n        if( ssl->transform_negotiate->ciphersuite_info->mac ==\n            MBEDTLS_MD_SHA384 )\n        {\n            md_alg = MBEDTLS_MD_SHA384;\n            ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA384;\n        }\n        else\n        {\n            md_alg = MBEDTLS_MD_SHA256;\n            ssl->out_msg[4] = MBEDTLS_SSL_HASH_SHA256;\n        }\n        ssl->out_msg[5] = mbedtls_ssl_sig_from_pk( mbedtls_ssl_own_key( ssl ) );\n\n        /* Info from md_alg will be used instead */\n        hashlen = 0;\n        offset = 2;\n    }\n    else\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash_start, hashlen,\n                         ssl->out_msg + 6 + offset, &n,\n                         ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_pk_sign\", ret );\n        return( ret );\n    }\n\n    ssl->out_msg[4 + offset] = (unsigned char)( n >> 8 );\n    ssl->out_msg[5 + offset] = (unsigned char)( n      );\n\n    ssl->out_msglen  = 6 + n + offset;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_CERTIFICATE_VERIFY;\n\n    ssl->state++;\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write certificate verify\" ) );\n\n    return( ret );\n}\n#endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\nstatic int ssl_parse_new_session_ticket( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    uint32_t lifetime;\n    size_t ticket_len;\n    unsigned char *ticket;\n    const unsigned char *msg;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse new session ticket\" ) );\n\n    if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n        return( ret );\n    }\n\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad new session ticket message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n    /*\n     * struct {\n     *     uint32 ticket_lifetime_hint;\n     *     opaque ticket<0..2^16-1>;\n     * } NewSessionTicket;\n     *\n     * 0  .  3   ticket_lifetime_hint\n     * 4  .  5   ticket_len (n)\n     * 6  .  5+n ticket content\n     */\n    if( ssl->in_msg[0] != MBEDTLS_SSL_HS_NEW_SESSION_TICKET ||\n        ssl->in_hslen < 6 + mbedtls_ssl_hs_hdr_len( ssl ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad new session ticket message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );\n    }\n\n    msg = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );\n\n    lifetime = ( msg[0] << 24 ) | ( msg[1] << 16 ) |\n               ( msg[2] <<  8 ) | ( msg[3]       );\n\n    ticket_len = ( msg[4] << 8 ) | ( msg[5] );\n\n    if( ticket_len + 6 + mbedtls_ssl_hs_hdr_len( ssl ) != ssl->in_hslen )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad new session ticket message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ticket length: %d\", ticket_len ) );\n\n    /* We're not waiting for a NewSessionTicket message any more */\n    ssl->handshake->new_session_ticket = 0;\n    ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;\n\n    /*\n     * Zero-length ticket means the server changed his mind and doesn't want\n     * to send a ticket after all, so just forget it\n     */\n    if( ticket_len == 0 )\n        return( 0 );\n\n    mbedtls_zeroize( ssl->session_negotiate->ticket,\n                      ssl->session_negotiate->ticket_len );\n    mbedtls_free( ssl->session_negotiate->ticket );\n    ssl->session_negotiate->ticket = NULL;\n    ssl->session_negotiate->ticket_len = 0;\n\n    if( ( ticket = mbedtls_calloc( 1, ticket_len ) ) == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"ticket alloc failed\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n    }\n\n    memcpy( ticket, msg + 6, ticket_len );\n\n    ssl->session_negotiate->ticket = ticket;\n    ssl->session_negotiate->ticket_len = ticket_len;\n    ssl->session_negotiate->ticket_lifetime = lifetime;\n\n    /*\n     * RFC 5077 section 3.4:\n     * \"If the client receives a session ticket from the server, then it\n     * discards any Session ID that was sent in the ServerHello.\"\n     */\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ticket in use, discarding session id\" ) );\n    ssl->session_negotiate->id_len = 0;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse new session ticket\" ) );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n/*\n * SSL handshake -- client side -- single step\n */\nint mbedtls_ssl_handshake_client_step( mbedtls_ssl_context *ssl )\n{\n    int ret = 0;\n\n    if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"client state: %d\", ssl->state ) );\n\n    if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )\n        return( ret );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )\n    {\n        if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )\n            return( ret );\n    }\n#endif\n\n    /* Change state now, so that it is right in mbedtls_ssl_read_record(), used\n     * by DTLS for dropping out-of-sequence ChangeCipherSpec records */\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    if( ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC &&\n        ssl->handshake->new_session_ticket != 0 )\n    {\n        ssl->state = MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET;\n    }\n#endif\n    switch( ssl->state )\n    {\n        case MBEDTLS_SSL_HELLO_REQUEST:\n            ssl->state = MBEDTLS_SSL_CLIENT_HELLO;\n            break;\n\n       /*\n        *  ==>   ClientHello\n        */\n       case MBEDTLS_SSL_CLIENT_HELLO:\n           ret = ssl_write_client_hello( ssl );\n           break;\n\n       /*\n        *  <==   ServerHello\n        *        Certificate\n        *      ( ServerKeyExchange  )\n        *      ( CertificateRequest )\n        *        ServerHelloDone\n        */\n       case MBEDTLS_SSL_SERVER_HELLO:\n           ret = ssl_parse_server_hello( ssl );\n           break;\n\n       case MBEDTLS_SSL_SERVER_CERTIFICATE:\n           ret = mbedtls_ssl_parse_certificate( ssl );\n           break;\n\n       case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:\n           ret = ssl_parse_server_key_exchange( ssl );\n           break;\n\n       case MBEDTLS_SSL_CERTIFICATE_REQUEST:\n           ret = ssl_parse_certificate_request( ssl );\n           break;\n\n       case MBEDTLS_SSL_SERVER_HELLO_DONE:\n           ret = ssl_parse_server_hello_done( ssl );\n           break;\n\n       /*\n        *  ==> ( Certificate/Alert  )\n        *        ClientKeyExchange\n        *      ( CertificateVerify  )\n        *        ChangeCipherSpec\n        *        Finished\n        */\n       case MBEDTLS_SSL_CLIENT_CERTIFICATE:\n           ret = mbedtls_ssl_write_certificate( ssl );\n           break;\n\n       case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:\n           ret = ssl_write_client_key_exchange( ssl );\n           break;\n\n       case MBEDTLS_SSL_CERTIFICATE_VERIFY:\n           ret = ssl_write_certificate_verify( ssl );\n           break;\n\n       case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:\n           ret = mbedtls_ssl_write_change_cipher_spec( ssl );\n           break;\n\n       case MBEDTLS_SSL_CLIENT_FINISHED:\n           ret = mbedtls_ssl_write_finished( ssl );\n           break;\n\n       /*\n        *  <==   ( NewSessionTicket )\n        *        ChangeCipherSpec\n        *        Finished\n        */\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n       case MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET:\n           ret = ssl_parse_new_session_ticket( ssl );\n           break;\n#endif\n\n       case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:\n           ret = mbedtls_ssl_parse_change_cipher_spec( ssl );\n           break;\n\n       case MBEDTLS_SSL_SERVER_FINISHED:\n           ret = mbedtls_ssl_parse_finished( ssl );\n           break;\n\n       case MBEDTLS_SSL_FLUSH_BUFFERS:\n           MBEDTLS_SSL_DEBUG_MSG( 2, ( \"handshake: done\" ) );\n           ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;\n           break;\n\n       case MBEDTLS_SSL_HANDSHAKE_WRAPUP:\n           mbedtls_ssl_handshake_wrapup( ssl );\n           break;\n\n       default:\n           MBEDTLS_SSL_DEBUG_MSG( 1, ( \"invalid state %d\", ssl->state ) );\n           return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n   }\n\n    return( ret );\n}\n#endif /* MBEDTLS_SSL_CLI_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ssl_cookie.c",
    "content": "/*\n *  DTLS cookie callbacks implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * These session callbacks use a simple chained list\n * to store and retrieve the session information.\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SSL_COOKIE_C)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#define mbedtls_calloc    calloc\n#define mbedtls_free      free\n#endif\n\n#include \"mbedtls/ssl_cookie.h\"\n#include \"mbedtls/ssl_internal.h\"\n\n#include <string.h>\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * If DTLS is in use, then at least one of SHA-1, SHA-256, SHA-512 is\n * available. Try SHA-256 first, 512 wastes resources since we need to stay\n * with max 32 bytes of cookie for DTLS 1.0\n */\n#if defined(MBEDTLS_SHA256_C)\n#define COOKIE_MD           MBEDTLS_MD_SHA224\n#define COOKIE_MD_OUTLEN    32\n#define COOKIE_HMAC_LEN     28\n#elif defined(MBEDTLS_SHA512_C)\n#define COOKIE_MD           MBEDTLS_MD_SHA384\n#define COOKIE_MD_OUTLEN    48\n#define COOKIE_HMAC_LEN     28\n#elif defined(MBEDTLS_SHA1_C)\n#define COOKIE_MD           MBEDTLS_MD_SHA1\n#define COOKIE_MD_OUTLEN    20\n#define COOKIE_HMAC_LEN     20\n#else\n#error \"DTLS hello verify needs SHA-1 or SHA-2\"\n#endif\n\n/*\n * Cookies are formed of a 4-bytes timestamp (or serial number) and\n * an HMAC of timestemp and client ID.\n */\n#define COOKIE_LEN      ( 4 + COOKIE_HMAC_LEN )\n\nvoid mbedtls_ssl_cookie_init( mbedtls_ssl_cookie_ctx *ctx )\n{\n    mbedtls_md_init( &ctx->hmac_ctx );\n#if !defined(MBEDTLS_HAVE_TIME)\n    ctx->serial = 0;\n#endif\n    ctx->timeout = MBEDTLS_SSL_COOKIE_TIMEOUT;\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_init( &ctx->mutex );\n#endif\n}\n\nvoid mbedtls_ssl_cookie_set_timeout( mbedtls_ssl_cookie_ctx *ctx, unsigned long delay )\n{\n    ctx->timeout = delay;\n}\n\nvoid mbedtls_ssl_cookie_free( mbedtls_ssl_cookie_ctx *ctx )\n{\n    mbedtls_md_free( &ctx->hmac_ctx );\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_free( &ctx->mutex );\n#endif\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_ssl_cookie_ctx ) );\n}\n\nint mbedtls_ssl_cookie_setup( mbedtls_ssl_cookie_ctx *ctx,\n                      int (*f_rng)(void *, unsigned char *, size_t),\n                      void *p_rng )\n{\n    int ret;\n    unsigned char key[COOKIE_MD_OUTLEN];\n\n    if( ( ret = f_rng( p_rng, key, sizeof( key ) ) ) != 0 )\n        return( ret );\n\n    ret = mbedtls_md_setup( &ctx->hmac_ctx, mbedtls_md_info_from_type( COOKIE_MD ), 1 );\n    if( ret != 0 )\n        return( ret );\n\n    ret = mbedtls_md_hmac_starts( &ctx->hmac_ctx, key, sizeof( key ) );\n    if( ret != 0 )\n        return( ret );\n\n    mbedtls_zeroize( key, sizeof( key ) );\n\n    return( 0 );\n}\n\n/*\n * Generate the HMAC part of a cookie\n */\nstatic int ssl_cookie_hmac( mbedtls_md_context_t *hmac_ctx,\n                            const unsigned char time[4],\n                            unsigned char **p, unsigned char *end,\n                            const unsigned char *cli_id, size_t cli_id_len )\n{\n    unsigned char hmac_out[COOKIE_MD_OUTLEN];\n\n    if( (size_t)( end - *p ) < COOKIE_HMAC_LEN )\n        return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );\n\n    if( mbedtls_md_hmac_reset(  hmac_ctx ) != 0 ||\n        mbedtls_md_hmac_update( hmac_ctx, time, 4 ) != 0 ||\n        mbedtls_md_hmac_update( hmac_ctx, cli_id, cli_id_len ) != 0 ||\n        mbedtls_md_hmac_finish( hmac_ctx, hmac_out ) != 0 )\n    {\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    memcpy( *p, hmac_out, COOKIE_HMAC_LEN );\n    *p += COOKIE_HMAC_LEN;\n\n    return( 0 );\n}\n\n/*\n * Generate cookie for DTLS ClientHello verification\n */\nint mbedtls_ssl_cookie_write( void *p_ctx,\n                      unsigned char **p, unsigned char *end,\n                      const unsigned char *cli_id, size_t cli_id_len )\n{\n    int ret;\n    mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx;\n    unsigned long t;\n\n    if( ctx == NULL || cli_id == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    if( (size_t)( end - *p ) < COOKIE_LEN )\n        return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );\n\n#if defined(MBEDTLS_HAVE_TIME)\n    t = (unsigned long) mbedtls_time( NULL );\n#else\n    t = ctx->serial++;\n#endif\n\n    (*p)[0] = (unsigned char)( t >> 24 );\n    (*p)[1] = (unsigned char)( t >> 16 );\n    (*p)[2] = (unsigned char)( t >>  8 );\n    (*p)[3] = (unsigned char)( t       );\n    *p += 4;\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + ret );\n#endif\n\n    ret = ssl_cookie_hmac( &ctx->hmac_ctx, *p - 4,\n                           p, end, cli_id, cli_id_len );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR +\n                MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    return( ret );\n}\n\n/*\n * Check a cookie\n */\nint mbedtls_ssl_cookie_check( void *p_ctx,\n                      const unsigned char *cookie, size_t cookie_len,\n                      const unsigned char *cli_id, size_t cli_id_len )\n{\n    unsigned char ref_hmac[COOKIE_HMAC_LEN];\n    int ret = 0;\n    unsigned char *p = ref_hmac;\n    mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx;\n    unsigned long cur_time, cookie_time;\n\n    if( ctx == NULL || cli_id == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    if( cookie_len != COOKIE_LEN )\n        return( -1 );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR + ret );\n#endif\n\n    if( ssl_cookie_hmac( &ctx->hmac_ctx, cookie,\n                         &p, p + sizeof( ref_hmac ),\n                         cli_id, cli_id_len ) != 0 )\n        ret = -1;\n\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR +\n                MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    if( ret != 0 )\n        return( ret );\n\n    if( mbedtls_ssl_safer_memcmp( cookie + 4, ref_hmac, sizeof( ref_hmac ) ) != 0 )\n        return( -1 );\n\n#if defined(MBEDTLS_HAVE_TIME)\n    cur_time = (unsigned long) mbedtls_time( NULL );\n#else\n    cur_time = ctx->serial;\n#endif\n\n    cookie_time = ( (unsigned long) cookie[0] << 24 ) |\n                  ( (unsigned long) cookie[1] << 16 ) |\n                  ( (unsigned long) cookie[2] <<  8 ) |\n                  ( (unsigned long) cookie[3]       );\n\n    if( ctx->timeout != 0 && cur_time - cookie_time > ctx->timeout )\n        return( -1 );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_COOKIE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ssl_srv.c",
    "content": "/*\n *  SSLv3/TLSv1 server-side functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SSL_SRV_C)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free      free\n#endif\n\n#include \"mbedtls/debug.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/ssl_internal.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_ECP_C)\n#include \"mbedtls/ecp.h\"\n#endif\n\n#if defined(MBEDTLS_HAVE_TIME)\n#include \"mbedtls/platform_time.h\"\n#endif\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)\nint mbedtls_ssl_set_client_transport_id( mbedtls_ssl_context *ssl,\n                                 const unsigned char *info,\n                                 size_t ilen )\n{\n    if( ssl->conf->endpoint != MBEDTLS_SSL_IS_SERVER )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    mbedtls_free( ssl->cli_id );\n\n    if( ( ssl->cli_id = mbedtls_calloc( 1, ilen ) ) == NULL )\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n\n    memcpy( ssl->cli_id, info, ilen );\n    ssl->cli_id_len = ilen;\n\n    return( 0 );\n}\n\nvoid mbedtls_ssl_conf_dtls_cookies( mbedtls_ssl_config *conf,\n                           mbedtls_ssl_cookie_write_t *f_cookie_write,\n                           mbedtls_ssl_cookie_check_t *f_cookie_check,\n                           void *p_cookie )\n{\n    conf->f_cookie_write = f_cookie_write;\n    conf->f_cookie_check = f_cookie_check;\n    conf->p_cookie       = p_cookie;\n}\n#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\nstatic int ssl_parse_servername_ext( mbedtls_ssl_context *ssl,\n                                     const unsigned char *buf,\n                                     size_t len )\n{\n    int ret;\n    size_t servername_list_size, hostname_len;\n    const unsigned char *p;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"parse ServerName extension\" ) );\n\n    servername_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );\n    if( servername_list_size + 2 != len )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    p = buf + 2;\n    while( servername_list_size > 0 )\n    {\n        hostname_len = ( ( p[1] << 8 ) | p[2] );\n        if( hostname_len + 3 > servername_list_size )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n        }\n\n        if( p[0] == MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME )\n        {\n            ret = ssl->conf->f_sni( ssl->conf->p_sni,\n                                    ssl, p + 3, hostname_len );\n            if( ret != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_sni_wrapper\", ret );\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                        MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n            return( 0 );\n        }\n\n        servername_list_size -= hostname_len + 3;\n        p += hostname_len + 3;\n    }\n\n    if( servername_list_size != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */\n\nstatic int ssl_parse_renegotiation_info( mbedtls_ssl_context *ssl,\n                                         const unsigned char *buf,\n                                         size_t len )\n{\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )\n    {\n        /* Check verify-data in constant-time. The length OTOH is no secret */\n        if( len    != 1 + ssl->verify_data_len ||\n            buf[0] !=     ssl->verify_data_len ||\n            mbedtls_ssl_safer_memcmp( buf + 1, ssl->peer_verify_data,\n                          ssl->verify_data_len ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-matching renegotiation info\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n        }\n    }\n    else\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n    {\n        if( len != 1 || buf[0] != 0x0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"non-zero length renegotiation info\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n        }\n\n        ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;\n    }\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n\n/*\n * Status of the implementation of signature-algorithms extension:\n *\n * Currently, we are only considering the signature-algorithm extension\n * to pick a ciphersuite which allows us to send the ServerKeyExchange\n * message with a signature-hash combination that the user allows.\n *\n * We do *not* check whether all certificates in our certificate\n * chain are signed with an allowed signature-hash pair.\n * This needs to be done at a later stage.\n *\n */\nstatic int ssl_parse_signature_algorithms_ext( mbedtls_ssl_context *ssl,\n                                               const unsigned char *buf,\n                                               size_t len )\n{\n    size_t sig_alg_list_size;\n\n    const unsigned char *p;\n    const unsigned char *end = buf + len;\n\n    mbedtls_md_type_t md_cur;\n    mbedtls_pk_type_t sig_cur;\n\n    sig_alg_list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );\n    if( sig_alg_list_size + 2 != len ||\n        sig_alg_list_size % 2 != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    /* Currently we only guarantee signing the ServerKeyExchange message according\n     * to the constraints specified in this extension (see above), so it suffices\n     * to remember only one suitable hash for each possible signature algorithm.\n     *\n     * This will change when we also consider certificate signatures,\n     * in which case we will need to remember the whole signature-hash\n     * pair list from the extension.\n     */\n\n    for( p = buf + 2; p < end; p += 2 )\n    {\n        /* Silently ignore unknown signature or hash algorithms. */\n\n        if( ( sig_cur = mbedtls_ssl_pk_alg_from_sig( p[1] ) ) == MBEDTLS_PK_NONE )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v3, signature_algorithm ext\"\n                                        \" unknown sig alg encoding %d\", p[1] ) );\n            continue;\n        }\n\n        /* Check if we support the hash the user proposes */\n        md_cur = mbedtls_ssl_md_alg_from_hash( p[0] );\n        if( md_cur == MBEDTLS_MD_NONE )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v3, signature_algorithm ext:\"\n                                        \" unknown hash alg encoding %d\", p[0] ) );\n            continue;\n        }\n\n        if( mbedtls_ssl_check_sig_hash( ssl, md_cur ) == 0 )\n        {\n            mbedtls_ssl_sig_hash_set_add( &ssl->handshake->hash_algs, sig_cur, md_cur );\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v3, signature_algorithm ext:\"\n                                        \" match sig %d and hash %d\",\n                                        sig_cur, md_cur ) );\n        }\n        else\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v3, signature_algorithm ext: \"\n                                        \"hash alg %d not supported\", md_cur ) );\n        }\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&\n          MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\nstatic int ssl_parse_supported_elliptic_curves( mbedtls_ssl_context *ssl,\n                                                const unsigned char *buf,\n                                                size_t len )\n{\n    size_t list_size, our_size;\n    const unsigned char *p;\n    const mbedtls_ecp_curve_info *curve_info, **curves;\n\n    list_size = ( ( buf[0] << 8 ) | ( buf[1] ) );\n    if( list_size + 2 != len ||\n        list_size % 2 != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    /* Should never happen unless client duplicates the extension */\n    if( ssl->handshake->curves != NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    /* Don't allow our peer to make us allocate too much memory,\n     * and leave room for a final 0 */\n    our_size = list_size / 2 + 1;\n    if( our_size > MBEDTLS_ECP_DP_MAX )\n        our_size = MBEDTLS_ECP_DP_MAX;\n\n    if( ( curves = mbedtls_calloc( our_size, sizeof( *curves ) ) ) == NULL )\n    {\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n    }\n\n    ssl->handshake->curves = curves;\n\n    p = buf + 2;\n    while( list_size > 0 && our_size > 1 )\n    {\n        curve_info = mbedtls_ecp_curve_info_from_tls_id( ( p[0] << 8 ) | p[1] );\n\n        if( curve_info != NULL )\n        {\n            *curves++ = curve_info;\n            our_size--;\n        }\n\n        list_size -= 2;\n        p += 2;\n    }\n\n    return( 0 );\n}\n\nstatic int ssl_parse_supported_point_formats( mbedtls_ssl_context *ssl,\n                                              const unsigned char *buf,\n                                              size_t len )\n{\n    size_t list_size;\n    const unsigned char *p;\n\n    list_size = buf[0];\n    if( list_size + 1 != len )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    p = buf + 1;\n    while( list_size > 0 )\n    {\n        if( p[0] == MBEDTLS_ECP_PF_UNCOMPRESSED ||\n            p[0] == MBEDTLS_ECP_PF_COMPRESSED )\n        {\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)\n            ssl->handshake->ecdh_ctx.point_format = p[0];\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n            ssl->handshake->ecjpake_ctx.point_format = p[0];\n#endif\n            MBEDTLS_SSL_DEBUG_MSG( 4, ( \"point format selected: %d\", p[0] ) );\n            return( 0 );\n        }\n\n        list_size--;\n        p++;\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||\n          MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\nstatic int ssl_parse_ecjpake_kkpp( mbedtls_ssl_context *ssl,\n                                   const unsigned char *buf,\n                                   size_t len )\n{\n    int ret;\n\n    if( mbedtls_ecjpake_check( &ssl->handshake->ecjpake_ctx ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"skip ecjpake kkpp extension\" ) );\n        return( 0 );\n    }\n\n    if( ( ret = mbedtls_ecjpake_read_round_one( &ssl->handshake->ecjpake_ctx,\n                                                buf, len ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecjpake_read_round_one\", ret );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n        return( ret );\n    }\n\n    /* Only mark the extension as OK when we're sure it is */\n    ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\nstatic int ssl_parse_max_fragment_length_ext( mbedtls_ssl_context *ssl,\n                                              const unsigned char *buf,\n                                              size_t len )\n{\n    if( len != 1 || buf[0] >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    ssl->session_negotiate->mfl_code = buf[0];\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\nstatic int ssl_parse_truncated_hmac_ext( mbedtls_ssl_context *ssl,\n                                         const unsigned char *buf,\n                                         size_t len )\n{\n    if( len != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    ((void) buf);\n\n    if( ssl->conf->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED )\n        ssl->session_negotiate->trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\nstatic int ssl_parse_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,\n                                      const unsigned char *buf,\n                                      size_t len )\n{\n    if( len != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    ((void) buf);\n\n    if( ssl->conf->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED &&\n        ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        ssl->session_negotiate->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\nstatic int ssl_parse_extended_ms_ext( mbedtls_ssl_context *ssl,\n                                      const unsigned char *buf,\n                                      size_t len )\n{\n    if( len != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    ((void) buf);\n\n    if( ssl->conf->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED &&\n        ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        ssl->handshake->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\nstatic int ssl_parse_session_ticket_ext( mbedtls_ssl_context *ssl,\n                                         unsigned char *buf,\n                                         size_t len )\n{\n    int ret;\n    mbedtls_ssl_session session;\n\n    mbedtls_ssl_session_init( &session );\n\n    if( ssl->conf->f_ticket_parse == NULL ||\n        ssl->conf->f_ticket_write == NULL )\n    {\n        return( 0 );\n    }\n\n    /* Remember the client asked us to send a new ticket */\n    ssl->handshake->new_session_ticket = 1;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ticket length: %d\", len ) );\n\n    if( len == 0 )\n        return( 0 );\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ticket rejected: renegotiating\" ) );\n        return( 0 );\n    }\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n    /*\n     * Failures are ok: just ignore the ticket and proceed.\n     */\n    if( ( ret = ssl->conf->f_ticket_parse( ssl->conf->p_ticket, &session,\n                                           buf, len ) ) != 0 )\n    {\n        mbedtls_ssl_session_free( &session );\n\n        if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ticket is not authentic\" ) );\n        else if( ret == MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED )\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ticket is expired\" ) );\n        else\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_ticket_parse\", ret );\n\n        return( 0 );\n    }\n\n    /*\n     * Keep the session ID sent by the client, since we MUST send it back to\n     * inform them we're accepting the ticket  (RFC 5077 section 3.4)\n     */\n    session.id_len = ssl->session_negotiate->id_len;\n    memcpy( &session.id, ssl->session_negotiate->id, session.id_len );\n\n    mbedtls_ssl_session_free( ssl->session_negotiate );\n    memcpy( ssl->session_negotiate, &session, sizeof( mbedtls_ssl_session ) );\n\n    /* Zeroize instead of free as we copied the content */\n    mbedtls_zeroize( &session, sizeof( mbedtls_ssl_session ) );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"session successfully restored from ticket\" ) );\n\n    ssl->handshake->resume = 1;\n\n    /* Don't send a new ticket after all, this one is OK */\n    ssl->handshake->new_session_ticket = 0;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n#if defined(MBEDTLS_SSL_ALPN)\nstatic int ssl_parse_alpn_ext( mbedtls_ssl_context *ssl,\n                               const unsigned char *buf, size_t len )\n{\n    size_t list_len, cur_len, ours_len;\n    const unsigned char *theirs, *start, *end;\n    const char **ours;\n\n    /* If ALPN not configured, just ignore the extension */\n    if( ssl->conf->alpn_list == NULL )\n        return( 0 );\n\n    /*\n     * opaque ProtocolName<1..2^8-1>;\n     *\n     * struct {\n     *     ProtocolName protocol_name_list<2..2^16-1>\n     * } ProtocolNameList;\n     */\n\n    /* Min length is 2 (list_len) + 1 (name_len) + 1 (name) */\n    if( len < 4 )\n    {\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    list_len = ( buf[0] << 8 ) | buf[1];\n    if( list_len != len - 2 )\n    {\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    /*\n     * Use our order of preference\n     */\n    start = buf + 2;\n    end = buf + len;\n    for( ours = ssl->conf->alpn_list; *ours != NULL; ours++ )\n    {\n        ours_len = strlen( *ours );\n        for( theirs = start; theirs != end; theirs += cur_len )\n        {\n            /* If the list is well formed, we should get equality first */\n            if( theirs > end )\n            {\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n\n            cur_len = *theirs++;\n\n            /* Empty strings MUST NOT be included */\n            if( cur_len == 0 )\n            {\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n\n            if( cur_len == ours_len &&\n                memcmp( theirs, *ours, cur_len ) == 0 )\n            {\n                ssl->alpn_chosen = *ours;\n                return( 0 );\n            }\n        }\n    }\n\n    /* If we get there, no match was found */\n    mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                            MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL );\n    return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n}\n#endif /* MBEDTLS_SSL_ALPN */\n\n/*\n * Auxiliary functions for ServerHello parsing and related actions\n */\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n/*\n * Return 0 if the given key uses one of the acceptable curves, -1 otherwise\n */\n#if defined(MBEDTLS_ECDSA_C)\nstatic int ssl_check_key_curve( mbedtls_pk_context *pk,\n                                const mbedtls_ecp_curve_info **curves )\n{\n    const mbedtls_ecp_curve_info **crv = curves;\n    mbedtls_ecp_group_id grp_id = mbedtls_pk_ec( *pk )->grp.id;\n\n    while( *crv != NULL )\n    {\n        if( (*crv)->grp_id == grp_id )\n            return( 0 );\n        crv++;\n    }\n\n    return( -1 );\n}\n#endif /* MBEDTLS_ECDSA_C */\n\n/*\n * Try picking a certificate for this ciphersuite,\n * return 0 on success and -1 on failure.\n */\nstatic int ssl_pick_cert( mbedtls_ssl_context *ssl,\n                          const mbedtls_ssl_ciphersuite_t * ciphersuite_info )\n{\n    mbedtls_ssl_key_cert *cur, *list, *fallback = NULL;\n    mbedtls_pk_type_t pk_alg =\n        mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );\n    uint32_t flags;\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n    if( ssl->handshake->sni_key_cert != NULL )\n        list = ssl->handshake->sni_key_cert;\n    else\n#endif\n        list = ssl->conf->key_cert;\n\n    if( pk_alg == MBEDTLS_PK_NONE )\n        return( 0 );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ciphersuite requires certificate\" ) );\n\n    if( list == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server has no certificate\" ) );\n        return( -1 );\n    }\n\n    for( cur = list; cur != NULL; cur = cur->next )\n    {\n        MBEDTLS_SSL_DEBUG_CRT( 3, \"candidate certificate chain, certificate\",\n                          cur->cert );\n\n        if( ! mbedtls_pk_can_do( cur->key, pk_alg ) )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"certificate mismatch: key type\" ) );\n            continue;\n        }\n\n        /*\n         * This avoids sending the client a cert it'll reject based on\n         * keyUsage or other extensions.\n         *\n         * It also allows the user to provision different certificates for\n         * different uses based on keyUsage, eg if they want to avoid signing\n         * and decrypting with the same RSA key.\n         */\n        if( mbedtls_ssl_check_cert_usage( cur->cert, ciphersuite_info,\n                                  MBEDTLS_SSL_IS_SERVER, &flags ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"certificate mismatch: \"\n                                \"(extended) key usage extension\" ) );\n            continue;\n        }\n\n#if defined(MBEDTLS_ECDSA_C)\n        if( pk_alg == MBEDTLS_PK_ECDSA &&\n            ssl_check_key_curve( cur->key, ssl->handshake->curves ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"certificate mismatch: elliptic curve\" ) );\n            continue;\n        }\n#endif\n\n        /*\n         * Try to select a SHA-1 certificate for pre-1.2 clients, but still\n         * present them a SHA-higher cert rather than failing if it's the only\n         * one we got that satisfies the other conditions.\n         */\n        if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 &&\n            cur->cert->sig_md != MBEDTLS_MD_SHA1 )\n        {\n            if( fallback == NULL )\n                fallback = cur;\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"certificate not preferred: \"\n                                    \"sha-2 with pre-TLS 1.2 client\" ) );\n            continue;\n            }\n        }\n\n        /* If we get there, we got a winner */\n        break;\n    }\n\n    if( cur == NULL )\n        cur = fallback;\n\n    /* Do not update ssl->handshake->key_cert unless there is a match */\n    if( cur != NULL )\n    {\n        ssl->handshake->key_cert = cur;\n        MBEDTLS_SSL_DEBUG_CRT( 3, \"selected certificate chain, certificate\",\n                          ssl->handshake->key_cert->cert );\n        return( 0 );\n    }\n\n    return( -1 );\n}\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n/*\n * Check if a given ciphersuite is suitable for use with our config/keys/etc\n * Sets ciphersuite_info only if the suite matches.\n */\nstatic int ssl_ciphersuite_match( mbedtls_ssl_context *ssl, int suite_id,\n                                  const mbedtls_ssl_ciphersuite_t **ciphersuite_info )\n{\n    const mbedtls_ssl_ciphersuite_t *suite_info;\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)    \n    mbedtls_pk_type_t sig_type;\n#endif\n\n    suite_info = mbedtls_ssl_ciphersuite_from_id( suite_id );\n    if( suite_info == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"trying ciphersuite: %s\", suite_info->name ) );\n\n    if( suite_info->min_minor_ver > ssl->minor_ver ||\n        suite_info->max_minor_ver < ssl->minor_ver )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ciphersuite mismatch: version\" ) );\n        return( 0 );\n    }\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ( suite_info->flags & MBEDTLS_CIPHERSUITE_NODTLS ) )\n        return( 0 );\n#endif\n\n#if defined(MBEDTLS_ARC4_C)\n    if( ssl->conf->arc4_disabled == MBEDTLS_SSL_ARC4_DISABLED &&\n            suite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ciphersuite mismatch: rc4\" ) );\n        return( 0 );\n    }\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    if( suite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE &&\n        ( ssl->handshake->cli_exts & MBEDTLS_TLS_EXT_ECJPAKE_KKPP_OK ) == 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ciphersuite mismatch: ecjpake \"\n                                    \"not configured or ext missing\" ) );\n        return( 0 );\n    }\n#endif\n\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C)\n    if( mbedtls_ssl_ciphersuite_uses_ec( suite_info ) &&\n        ( ssl->handshake->curves == NULL ||\n          ssl->handshake->curves[0] == NULL ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ciphersuite mismatch: \"\n                            \"no common elliptic curve\" ) );\n        return( 0 );\n    }\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    /* If the ciphersuite requires a pre-shared key and we don't\n     * have one, skip it now rather than failing later */\n    if( mbedtls_ssl_ciphersuite_uses_psk( suite_info ) &&\n        ssl->conf->f_psk == NULL &&\n        ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL ||\n          ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ciphersuite mismatch: no pre-shared key\" ) );\n        return( 0 );\n    }\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n    /* If the ciphersuite requires signing, check whether\n     * a suitable hash algorithm is present. */\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        sig_type = mbedtls_ssl_get_ciphersuite_sig_alg( suite_info );\n        if( sig_type != MBEDTLS_PK_NONE &&\n            mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs, sig_type ) == MBEDTLS_MD_NONE )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ciphersuite mismatch: no suitable hash algorithm \"\n                                        \"for signature algorithm %d\", sig_type ) );\n            return( 0 );\n        }\n    }\n\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&\n          MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    /*\n     * Final check: if ciphersuite requires us to have a\n     * certificate/key of a particular type:\n     * - select the appropriate certificate if we have one, or\n     * - try the next ciphersuite if we don't\n     * This must be done last since we modify the key_cert list.\n     */\n    if( ssl_pick_cert( ssl, suite_info ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ciphersuite mismatch: \"\n                            \"no suitable certificate\" ) );\n        return( 0 );\n    }\n#endif\n\n    *ciphersuite_info = suite_info;\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)\nstatic int ssl_parse_client_hello_v2( mbedtls_ssl_context *ssl )\n{\n    int ret, got_common_suite;\n    unsigned int i, j;\n    size_t n;\n    unsigned int ciph_len, sess_len, chal_len;\n    unsigned char *buf, *p;\n    const int *ciphersuites;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse client hello v2\" ) );\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"client hello v2 illegal for renegotiation\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n    buf = ssl->in_hdr;\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"record header\", buf, 5 );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v2, message type: %d\",\n                   buf[2] ) );\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v2, message len.: %d\",\n                   ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) );\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v2, max. version: [%d:%d]\",\n                   buf[3], buf[4] ) );\n\n    /*\n     * SSLv2 Client Hello\n     *\n     * Record layer:\n     *     0  .   1   message length\n     *\n     * SSL layer:\n     *     2  .   2   message type\n     *     3  .   4   protocol version\n     */\n    if( buf[2] != MBEDTLS_SSL_HS_CLIENT_HELLO ||\n        buf[3] != MBEDTLS_SSL_MAJOR_VERSION_3 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF;\n\n    if( n < 17 || n > 512 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    ssl->major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;\n    ssl->minor_ver = ( buf[4] <= ssl->conf->max_minor_ver )\n                     ? buf[4]  : ssl->conf->max_minor_ver;\n\n    if( ssl->minor_ver < ssl->conf->min_minor_ver )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"client only supports ssl smaller than minimum\"\n                            \" [%d:%d] < [%d:%d]\",\n                            ssl->major_ver, ssl->minor_ver,\n                            ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) );\n\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                     MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );\n        return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );\n    }\n\n    ssl->handshake->max_major_ver = buf[3];\n    ssl->handshake->max_minor_ver = buf[4];\n\n    if( ( ret = mbedtls_ssl_fetch_input( ssl, 2 + n ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_fetch_input\", ret );\n        return( ret );\n    }\n\n    ssl->handshake->update_checksum( ssl, buf + 2, n );\n\n    buf = ssl->in_msg;\n    n = ssl->in_left - 5;\n\n    /*\n     *    0  .   1   ciphersuitelist length\n     *    2  .   3   session id length\n     *    4  .   5   challenge length\n     *    6  .  ..   ciphersuitelist\n     *   ..  .  ..   session id\n     *   ..  .  ..   challenge\n     */\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"record contents\", buf, n );\n\n    ciph_len = ( buf[0] << 8 ) | buf[1];\n    sess_len = ( buf[2] << 8 ) | buf[3];\n    chal_len = ( buf[4] << 8 ) | buf[5];\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ciph_len: %d, sess_len: %d, chal_len: %d\",\n                   ciph_len, sess_len, chal_len ) );\n\n    /*\n     * Make sure each parameter length is valid\n     */\n    if( ciph_len < 3 || ( ciph_len % 3 ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    if( sess_len > 32 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    if( chal_len < 8 || chal_len > 32 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    if( n != 6 + ciph_len + sess_len + chal_len )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, ciphersuitelist\",\n                   buf + 6, ciph_len );\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, session id\",\n                   buf + 6 + ciph_len, sess_len );\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, challenge\",\n                   buf + 6 + ciph_len + sess_len, chal_len );\n\n    p = buf + 6 + ciph_len;\n    ssl->session_negotiate->id_len = sess_len;\n    memset( ssl->session_negotiate->id, 0,\n            sizeof( ssl->session_negotiate->id ) );\n    memcpy( ssl->session_negotiate->id, p, ssl->session_negotiate->id_len );\n\n    p += sess_len;\n    memset( ssl->handshake->randbytes, 0, 64 );\n    memcpy( ssl->handshake->randbytes + 32 - chal_len, p, chal_len );\n\n    /*\n     * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV\n     */\n    for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )\n    {\n        if( p[0] == 0 && p[1] == 0 && p[2] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"received TLS_EMPTY_RENEGOTIATION_INFO \" ) );\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n            if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"received RENEGOTIATION SCSV \"\n                                    \"during renegotiation\" ) );\n\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n            ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;\n            break;\n        }\n    }\n\n#if defined(MBEDTLS_SSL_FALLBACK_SCSV)\n    for( i = 0, p = buf + 6; i < ciph_len; i += 3, p += 3 )\n    {\n        if( p[0] == 0 &&\n            p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) &&\n            p[2] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE      ) & 0xff ) )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"received FALLBACK_SCSV\" ) );\n\n            if( ssl->minor_ver < ssl->conf->max_minor_ver )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"inapropriate fallback\" ) );\n\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK );\n\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n\n            break;\n        }\n    }\n#endif /* MBEDTLS_SSL_FALLBACK_SCSV */\n\n    got_common_suite = 0;\n    ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];\n    ciphersuite_info = NULL;\n#if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE)\n    for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )\n        for( i = 0; ciphersuites[i] != 0; i++ )\n#else\n    for( i = 0; ciphersuites[i] != 0; i++ )\n        for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )\n#endif\n        {\n            if( p[0] != 0 ||\n                p[1] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) ||\n                p[2] != ( ( ciphersuites[i]      ) & 0xFF ) )\n                continue;\n\n            got_common_suite = 1;\n\n            if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i],\n                                               &ciphersuite_info ) ) != 0 )\n                return( ret );\n\n            if( ciphersuite_info != NULL )\n                goto have_ciphersuite_v2;\n        }\n\n    if( got_common_suite )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got ciphersuites in common, \"\n                            \"but none of them usable\" ) );\n        return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE );\n    }\n    else\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got no ciphersuites in common\" ) );\n        return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );\n    }\n\nhave_ciphersuite_v2:\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"selected ciphersuite: %s\", ciphersuite_info->name ) );\n\n    ssl->session_negotiate->ciphersuite = ciphersuites[i];\n    ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;\n\n    /*\n     * SSLv2 Client Hello relevant renegotiation security checks\n     */\n    if( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&\n        ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"legacy renegotiation, breaking off handshake\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    ssl->in_left = 0;\n    ssl->state++;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse client hello v2\" ) );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */\n\n/* This function doesn't alert on errors that happen early during\n   ClientHello parsing because they might indicate that the client is\n   not talking SSL/TLS at all and would not understand our alert. */\nstatic int ssl_parse_client_hello( mbedtls_ssl_context *ssl )\n{\n    int ret, got_common_suite;\n    size_t i, j;\n    size_t ciph_offset, comp_offset, ext_offset;\n    size_t msg_len, ciph_len, sess_len, comp_len, ext_len;\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    size_t cookie_offset, cookie_len;\n#endif\n    unsigned char *buf, *p, *ext;\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    int renegotiation_info_seen = 0;\n#endif\n    int handshake_failure = 0;\n    const int *ciphersuites;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info;\n    int major, minor;\n\n    /* If there is no signature-algorithm extension present,\n     * we need to fall back to the default values for allowed\n     * signature-hash pairs. */\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n    int sig_hash_alg_ext_present = 0;\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&\n          MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse client hello\" ) );\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\nread_record_header:\n#endif\n    /*\n     * If renegotiating, then the input was read with mbedtls_ssl_read_record(),\n     * otherwise read it ourselves manually in order to support SSLv2\n     * ClientHello, which doesn't use the same record layer format.\n     */\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE )\n#endif\n    {\n        if( ( ret = mbedtls_ssl_fetch_input( ssl, 5 ) ) != 0 )\n        {\n            /* No alert on a read error. */\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_fetch_input\", ret );\n            return( ret );\n        }\n    }\n\n    buf = ssl->in_hdr;\n\n#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_STREAM )\n#endif\n        if( ( buf[0] & 0x80 ) != 0 )\n            return( ssl_parse_client_hello_v2( ssl ) );\n#endif\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"record header\", buf, mbedtls_ssl_hdr_len( ssl ) );\n\n    /*\n     * SSLv3/TLS Client Hello\n     *\n     * Record layer:\n     *     0  .   0   message type\n     *     1  .   2   protocol version\n     *     3  .   11  DTLS: epoch + record sequence number\n     *     3  .   4   message length\n     */\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v3, message type: %d\",\n                   buf[0] ) );\n\n    if( buf[0] != MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v3, message len.: %d\",\n                   ( ssl->in_len[0] << 8 ) | ssl->in_len[1] ) );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v3, protocol version: [%d:%d]\",\n                   buf[1], buf[2] ) );\n\n    mbedtls_ssl_read_version( &major, &minor, ssl->conf->transport, buf + 1 );\n\n    /* According to RFC 5246 Appendix E.1, the version here is typically\n     * \"{03,00}, the lowest version number supported by the client, [or] the\n     * value of ClientHello.client_version\", so the only meaningful check here\n     * is the major version shouldn't be less than 3 */\n    if( major < MBEDTLS_SSL_MAJOR_VERSION_3 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    /* For DTLS if this is the initial handshake, remember the client sequence\n     * number to use it in our next message (RFC 6347 4.2.1) */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n        && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE\n#endif\n        )\n    {\n        /* Epoch should be 0 for initial handshakes */\n        if( ssl->in_ctr[0] != 0 || ssl->in_ctr[1] != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n        }\n\n        memcpy( ssl->out_ctr + 2, ssl->in_ctr + 2, 6 );\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n        if( mbedtls_ssl_dtls_replay_check( ssl ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"replayed record, discarding\" ) );\n            ssl->next_record_offset = 0;\n            ssl->in_left = 0;\n            goto read_record_header;\n        }\n\n        /* No MAC to check yet, so we can update right now */\n        mbedtls_ssl_dtls_replay_update( ssl );\n#endif\n    }\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n    msg_len = ( ssl->in_len[0] << 8 ) | ssl->in_len[1];\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )\n    {\n        /* Set by mbedtls_ssl_read_record() */\n        msg_len = ssl->in_hslen;\n    }\n    else\n#endif\n    {\n        if( msg_len > MBEDTLS_SSL_MAX_CONTENT_LEN )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n        }\n\n        if( ( ret = mbedtls_ssl_fetch_input( ssl,\n                       mbedtls_ssl_hdr_len( ssl ) + msg_len ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_fetch_input\", ret );\n            return( ret );\n        }\n\n    /* Done reading this record, get ready for the next one */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n        if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n            ssl->next_record_offset = msg_len + mbedtls_ssl_hdr_len( ssl );\n        else\n#endif\n            ssl->in_left = 0;\n    }\n\n    buf = ssl->in_msg;\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"record contents\", buf, msg_len );\n\n    ssl->handshake->update_checksum( ssl, buf, msg_len );\n\n    /*\n     * Handshake layer:\n     *     0  .   0   handshake type\n     *     1  .   3   handshake length\n     *     4  .   5   DTLS only: message seqence number\n     *     6  .   8   DTLS only: fragment offset\n     *     9  .  11   DTLS only: fragment length\n     */\n    if( msg_len < mbedtls_ssl_hs_hdr_len( ssl ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v3, handshake type: %d\", buf[0] ) );\n\n    if( buf[0] != MBEDTLS_SSL_HS_CLIENT_HELLO )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v3, handshake len.: %d\",\n                   ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) );\n\n    /* We don't support fragmentation of ClientHello (yet?) */\n    if( buf[1] != 0 ||\n        msg_len != mbedtls_ssl_hs_hdr_len( ssl ) + ( ( buf[2] << 8 ) | buf[3] ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        /*\n         * Copy the client's handshake message_seq on initial handshakes,\n         * check sequence number on renego.\n         */\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n        if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )\n        {\n            /* This couldn't be done in ssl_prepare_handshake_record() */\n            unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) |\n                                         ssl->in_msg[5];\n\n            if( cli_msg_seq != ssl->handshake->in_msg_seq )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message_seq: \"\n                                    \"%d (expected %d)\", cli_msg_seq,\n                                    ssl->handshake->in_msg_seq ) );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n\n            ssl->handshake->in_msg_seq++;\n        }\n        else\n#endif\n        {\n            unsigned int cli_msg_seq = ( ssl->in_msg[4] << 8 ) |\n                                         ssl->in_msg[5];\n            ssl->handshake->out_msg_seq = cli_msg_seq;\n            ssl->handshake->in_msg_seq  = cli_msg_seq + 1;\n        }\n\n        /*\n         * For now we don't support fragmentation, so make sure\n         * fragment_offset == 0 and fragment_length == length\n         */\n        if( ssl->in_msg[6] != 0 || ssl->in_msg[7] != 0 || ssl->in_msg[8] != 0 ||\n            memcmp( ssl->in_msg + 1, ssl->in_msg + 9, 3 ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"ClientHello fragmentation not supported\" ) );\n            return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );\n        }\n    }\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n    buf += mbedtls_ssl_hs_hdr_len( ssl );\n    msg_len -= mbedtls_ssl_hs_hdr_len( ssl );\n\n    /*\n     * ClientHello layer:\n     *     0  .   1   protocol version\n     *     2  .  33   random bytes (starting with 4 bytes of Unix time)\n     *    34  .  35   session id length (1 byte)\n     *    35  . 34+x  session id\n     *   35+x . 35+x  DTLS only: cookie length (1 byte)\n     *   36+x .  ..   DTLS only: cookie\n     *    ..  .  ..   ciphersuite list length (2 bytes)\n     *    ..  .  ..   ciphersuite list\n     *    ..  .  ..   compression alg. list length (1 byte)\n     *    ..  .  ..   compression alg. list\n     *    ..  .  ..   extensions length (2 bytes, optional)\n     *    ..  .  ..   extensions (optional)\n     */\n\n    /*\n     * Minimal length (with everything empty and extensions ommitted) is\n     * 2 + 32 + 1 + 2 + 1 = 38 bytes. Check that first, so that we can\n     * read at least up to session id length without worrying.\n     */\n    if( msg_len < 38 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    /*\n     * Check and save the protocol version\n     */\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, version\", buf, 2 );\n\n    mbedtls_ssl_read_version( &ssl->major_ver, &ssl->minor_ver,\n                      ssl->conf->transport, buf );\n\n    ssl->handshake->max_major_ver = ssl->major_ver;\n    ssl->handshake->max_minor_ver = ssl->minor_ver;\n\n    if( ssl->major_ver < ssl->conf->min_major_ver ||\n        ssl->minor_ver < ssl->conf->min_minor_ver )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"client only supports ssl smaller than minimum\"\n                            \" [%d:%d] < [%d:%d]\",\n                            ssl->major_ver, ssl->minor_ver,\n                            ssl->conf->min_major_ver, ssl->conf->min_minor_ver ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                     MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );\n        return( MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION );\n    }\n\n    if( ssl->major_ver > ssl->conf->max_major_ver )\n    {\n        ssl->major_ver = ssl->conf->max_major_ver;\n        ssl->minor_ver = ssl->conf->max_minor_ver;\n    }\n    else if( ssl->minor_ver > ssl->conf->max_minor_ver )\n        ssl->minor_ver = ssl->conf->max_minor_ver;\n\n    /*\n     * Save client random (inc. Unix time)\n     */\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, random bytes\", buf + 2, 32 );\n\n    memcpy( ssl->handshake->randbytes, buf + 2, 32 );\n\n    /*\n     * Check the session ID length and save session ID\n     */\n    sess_len = buf[34];\n\n    if( sess_len > sizeof( ssl->session_negotiate->id ) ||\n        sess_len + 34 + 2 > msg_len ) /* 2 for cipherlist length field */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, session id\", buf + 35, sess_len );\n\n    ssl->session_negotiate->id_len = sess_len;\n    memset( ssl->session_negotiate->id, 0,\n            sizeof( ssl->session_negotiate->id ) );\n    memcpy( ssl->session_negotiate->id, buf + 35,\n            ssl->session_negotiate->id_len );\n\n    /*\n     * Check the cookie length and content\n     */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        cookie_offset = 35 + sess_len;\n        cookie_len = buf[cookie_offset];\n\n        if( cookie_offset + 1 + cookie_len + 2 > msg_len )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n        }\n\n        MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, cookie\",\n                       buf + cookie_offset + 1, cookie_len );\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)\n        if( ssl->conf->f_cookie_check != NULL\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n            && ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE\n#endif\n            )\n        {\n            if( ssl->conf->f_cookie_check( ssl->conf->p_cookie,\n                                     buf + cookie_offset + 1, cookie_len,\n                                     ssl->cli_id, ssl->cli_id_len ) != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 2, ( \"cookie verification failed\" ) );\n                ssl->handshake->verify_cookie_len = 1;\n            }\n            else\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 2, ( \"cookie verification passed\" ) );\n                ssl->handshake->verify_cookie_len = 0;\n            }\n        }\n        else\n#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */\n        {\n            /* We know we didn't send a cookie, so it should be empty */\n            if( cookie_len != 0 )\n            {\n                /* This may be an attacker's probe, so don't send an alert */\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"cookie verification skipped\" ) );\n        }\n\n    /*\n     * Check the ciphersuitelist length (will be parsed later)\n     */\n        ciph_offset = cookie_offset + 1 + cookie_len;\n    }\n    else\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n        ciph_offset = 35 + sess_len;\n\n    ciph_len = ( buf[ciph_offset + 0] << 8 )\n             | ( buf[ciph_offset + 1]      );\n\n    if( ciph_len < 2 ||\n        ciph_len + 2 + ciph_offset + 1 > msg_len || /* 1 for comp. alg. len */\n        ( ciph_len % 2 ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, ciphersuitelist\",\n                   buf + ciph_offset + 2,  ciph_len );\n\n    /*\n     * Check the compression algorithms length and pick one\n     */\n    comp_offset = ciph_offset + 2 + ciph_len;\n\n    comp_len = buf[comp_offset];\n\n    if( comp_len < 1 ||\n        comp_len > 16 ||\n        comp_len + comp_offset + 1 > msg_len )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello, compression\",\n                      buf + comp_offset + 1, comp_len );\n\n    ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL;\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    for( i = 0; i < comp_len; ++i )\n    {\n        if( buf[comp_offset + 1 + i] == MBEDTLS_SSL_COMPRESS_DEFLATE )\n        {\n            ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_DEFLATE;\n            break;\n        }\n    }\n#endif\n\n    /* See comments in ssl_write_client_hello() */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        ssl->session_negotiate->compression = MBEDTLS_SSL_COMPRESS_NULL;\n#endif\n\n    /* Do not parse the extensions if the protocol is SSLv3 */\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n    if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) )\n    {\n#endif\n        /*\n         * Check the extension length\n         */\n        ext_offset = comp_offset + 1 + comp_len;\n        if( msg_len > ext_offset )\n        {\n            if( msg_len < ext_offset + 2 )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n\n            ext_len = ( buf[ext_offset + 0] << 8 )\n                    | ( buf[ext_offset + 1]      );\n\n            if( ( ext_len > 0 && ext_len < 4 ) ||\n                msg_len != ext_offset + 2 + ext_len )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n        }\n        else\n            ext_len = 0;\n\n        ext = buf + ext_offset + 2;\n        MBEDTLS_SSL_DEBUG_BUF( 3, \"client hello extensions\", ext, ext_len );\n\n        while( ext_len != 0 )\n        {\n            unsigned int ext_id   = ( ( ext[0] <<  8 )\n                                    | ( ext[1]       ) );\n            unsigned int ext_size = ( ( ext[2] <<  8 )\n                                    | ( ext[3]       ) );\n\n            if( ext_size + 4 > ext_len )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n            switch( ext_id )\n            {\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n            case MBEDTLS_TLS_EXT_SERVERNAME:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found ServerName extension\" ) );\n                if( ssl->conf->f_sni == NULL )\n                    break;\n\n                ret = ssl_parse_servername_ext( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */\n\n            case MBEDTLS_TLS_EXT_RENEGOTIATION_INFO:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found renegotiation extension\" ) );\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n                renegotiation_info_seen = 1;\n#endif\n\n                ret = ssl_parse_renegotiation_info( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n            case MBEDTLS_TLS_EXT_SIG_ALG:\n                    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found signature_algorithms extension\" ) );\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n                if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )\n                    break;\n#endif\n                ret = ssl_parse_signature_algorithms_ext( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n\n                sig_hash_alg_ext_present = 1;\n                break;\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&\n          MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n            case MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found supported elliptic curves extension\" ) );\n\n                ret = ssl_parse_supported_elliptic_curves( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n\n            case MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found supported point formats extension\" ) );\n                ssl->handshake->cli_exts |= MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT;\n\n                ret = ssl_parse_supported_point_formats( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C ||\n          MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n            case MBEDTLS_TLS_EXT_ECJPAKE_KKPP:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found ecjpake kkpp extension\" ) );\n\n                ret = ssl_parse_ecjpake_kkpp( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n            case MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found max fragment length extension\" ) );\n\n                ret = ssl_parse_max_fragment_length_ext( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n            case MBEDTLS_TLS_EXT_TRUNCATED_HMAC:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found truncated hmac extension\" ) );\n\n                ret = ssl_parse_truncated_hmac_ext( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n            case MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found encrypt then mac extension\" ) );\n\n                ret = ssl_parse_encrypt_then_mac_ext( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n            case MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found extended master secret extension\" ) );\n\n                ret = ssl_parse_extended_ms_ext( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n            case MBEDTLS_TLS_EXT_SESSION_TICKET:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found session ticket extension\" ) );\n\n                ret = ssl_parse_session_ticket_ext( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n#if defined(MBEDTLS_SSL_ALPN)\n            case MBEDTLS_TLS_EXT_ALPN:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"found alpn extension\" ) );\n\n                ret = ssl_parse_alpn_ext( ssl, ext + 4, ext_size );\n                if( ret != 0 )\n                    return( ret );\n                break;\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n            default:\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"unknown extension found: %d (ignoring)\",\n                               ext_id ) );\n            }\n\n            ext_len -= 4 + ext_size;\n            ext += 4 + ext_size;\n\n            if( ext_len > 0 && ext_len < 4 )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client hello message\" ) );\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n        }\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n    }\n#endif\n\n#if defined(MBEDTLS_SSL_FALLBACK_SCSV)\n    for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 )\n    {\n        if( p[0] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE >> 8 ) & 0xff ) &&\n            p[1] == (unsigned char)( ( MBEDTLS_SSL_FALLBACK_SCSV_VALUE      ) & 0xff ) )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"received FALLBACK_SCSV\" ) );\n\n            if( ssl->minor_ver < ssl->conf->max_minor_ver )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"inapropriate fallback\" ) );\n\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK );\n\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n\n            break;\n        }\n    }\n#endif /* MBEDTLS_SSL_FALLBACK_SCSV */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n\n    /*\n     * Try to fall back to default hash SHA1 if the client\n     * hasn't provided any preferred signature-hash combinations.\n     */\n    if( sig_hash_alg_ext_present == 0 )\n    {\n        mbedtls_md_type_t md_default = MBEDTLS_MD_SHA1;\n\n        if( mbedtls_ssl_check_sig_hash( ssl, md_default ) != 0 )\n            md_default = MBEDTLS_MD_NONE;\n\n        mbedtls_ssl_sig_hash_set_const_hash( &ssl->handshake->hash_algs, md_default );\n    }\n\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 &&\n          MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n    /*\n     * Check for TLS_EMPTY_RENEGOTIATION_INFO_SCSV\n     */\n    for( i = 0, p = buf + ciph_offset + 2; i < ciph_len; i += 2, p += 2 )\n    {\n        if( p[0] == 0 && p[1] == MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"received TLS_EMPTY_RENEGOTIATION_INFO \" ) );\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n            if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"received RENEGOTIATION SCSV \"\n                                            \"during renegotiation\" ) );\n                mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n                return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n            }\n#endif\n            ssl->secure_renegotiation = MBEDTLS_SSL_SECURE_RENEGOTIATION;\n            break;\n        }\n    }\n\n    /*\n     * Renegotiation security checks\n     */\n    if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION &&\n        ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"legacy renegotiation, breaking off handshake\" ) );\n        handshake_failure = 1;\n    }\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&\n             ssl->secure_renegotiation == MBEDTLS_SSL_SECURE_RENEGOTIATION &&\n             renegotiation_info_seen == 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"renegotiation_info extension missing (secure)\" ) );\n        handshake_failure = 1;\n    }\n    else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&\n             ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&\n             ssl->conf->allow_legacy_renegotiation == MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"legacy renegotiation not allowed\" ) );\n        handshake_failure = 1;\n    }\n    else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&\n             ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&\n             renegotiation_info_seen == 1 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"renegotiation_info extension present (legacy)\" ) );\n        handshake_failure = 1;\n    }\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n    if( handshake_failure == 1 )\n    {\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    /*\n     * Search for a matching ciphersuite\n     * (At the end because we need information from the EC-based extensions\n     * and certificate from the SNI callback triggered by the SNI extension.)\n     */\n    got_common_suite = 0;\n    ciphersuites = ssl->conf->ciphersuite_list[ssl->minor_ver];\n    ciphersuite_info = NULL;\n#if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE)\n    for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 )\n        for( i = 0; ciphersuites[i] != 0; i++ )\n#else\n    for( i = 0; ciphersuites[i] != 0; i++ )\n        for( j = 0, p = buf + ciph_offset + 2; j < ciph_len; j += 2, p += 2 )\n#endif\n        {\n            if( p[0] != ( ( ciphersuites[i] >> 8 ) & 0xFF ) ||\n                p[1] != ( ( ciphersuites[i]      ) & 0xFF ) )\n                continue;\n\n            got_common_suite = 1;\n\n            if( ( ret = ssl_ciphersuite_match( ssl, ciphersuites[i],\n                                               &ciphersuite_info ) ) != 0 )\n                return( ret );\n\n            if( ciphersuite_info != NULL )\n                goto have_ciphersuite;\n        }\n\n    if( got_common_suite )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got ciphersuites in common, \"\n                            \"but none of them usable\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE );\n    }\n    else\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got no ciphersuites in common\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE );\n        return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );\n    }\n\nhave_ciphersuite:\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"selected ciphersuite: %s\", ciphersuite_info->name ) );\n\n    ssl->session_negotiate->ciphersuite = ciphersuites[i];\n    ssl->transform_negotiate->ciphersuite_info = ciphersuite_info;\n\n    ssl->state++;\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        mbedtls_ssl_recv_flight_completed( ssl );\n#endif\n\n    /* Debugging-only output for testsuite */\n#if defined(MBEDTLS_DEBUG_C)                         && \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2)                && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        mbedtls_pk_type_t sig_alg = mbedtls_ssl_get_ciphersuite_sig_alg( ciphersuite_info );\n        if( sig_alg != MBEDTLS_PK_NONE )\n        {\n            mbedtls_md_type_t md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs,\n                                                                  sig_alg );\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"client hello v3, signature_algorithm ext: %d\",\n                                        mbedtls_ssl_hash_from_md_alg( md_alg ) ) );\n        }\n        else\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"no hash algorithm for signature algorithm \"\n                                        \"%d - should not happen\", sig_alg ) );\n        }\n    }\n#endif\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse client hello\" ) );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\nstatic void ssl_write_truncated_hmac_ext( mbedtls_ssl_context *ssl,\n                                          unsigned char *buf,\n                                          size_t *olen )\n{\n    unsigned char *p = buf;\n\n    if( ssl->session_negotiate->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_DISABLED )\n    {\n        *olen = 0;\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, adding truncated hmac extension\" ) );\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_TRUNCATED_HMAC      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 0x00;\n\n    *olen = 4;\n}\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\nstatic void ssl_write_encrypt_then_mac_ext( mbedtls_ssl_context *ssl,\n                                            unsigned char *buf,\n                                            size_t *olen )\n{\n    unsigned char *p = buf;\n    const mbedtls_ssl_ciphersuite_t *suite = NULL;\n    const mbedtls_cipher_info_t *cipher = NULL;\n\n    if( ssl->session_negotiate->encrypt_then_mac == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||\n        ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        *olen = 0;\n        return;\n    }\n\n    /*\n     * RFC 7366: \"If a server receives an encrypt-then-MAC request extension\n     * from a client and then selects a stream or Authenticated Encryption\n     * with Associated Data (AEAD) ciphersuite, it MUST NOT send an\n     * encrypt-then-MAC response extension back to the client.\"\n     */\n    if( ( suite = mbedtls_ssl_ciphersuite_from_id(\n                    ssl->session_negotiate->ciphersuite ) ) == NULL ||\n        ( cipher = mbedtls_cipher_info_from_type( suite->cipher ) ) == NULL ||\n        cipher->mode != MBEDTLS_MODE_CBC )\n    {\n        *olen = 0;\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, adding encrypt then mac extension\" ) );\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 0x00;\n\n    *olen = 4;\n}\n#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\nstatic void ssl_write_extended_ms_ext( mbedtls_ssl_context *ssl,\n                                       unsigned char *buf,\n                                       size_t *olen )\n{\n    unsigned char *p = buf;\n\n    if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_DISABLED ||\n        ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        *olen = 0;\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, adding extended master secret \"\n                        \"extension\" ) );\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 0x00;\n\n    *olen = 4;\n}\n#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\nstatic void ssl_write_session_ticket_ext( mbedtls_ssl_context *ssl,\n                                          unsigned char *buf,\n                                          size_t *olen )\n{\n    unsigned char *p = buf;\n\n    if( ssl->handshake->new_session_ticket == 0 )\n    {\n        *olen = 0;\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, adding session ticket extension\" ) );\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SESSION_TICKET      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 0x00;\n\n    *olen = 4;\n}\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\nstatic void ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl,\n                                         unsigned char *buf,\n                                         size_t *olen )\n{\n    unsigned char *p = buf;\n\n    if( ssl->secure_renegotiation != MBEDTLS_SSL_SECURE_RENEGOTIATION )\n    {\n        *olen = 0;\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, secure renegotiation extension\" ) );\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_RENEGOTIATION_INFO      ) & 0xFF );\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE )\n    {\n        *p++ = 0x00;\n        *p++ = ( ssl->verify_data_len * 2 + 1 ) & 0xFF;\n        *p++ = ssl->verify_data_len * 2 & 0xFF;\n\n        memcpy( p, ssl->peer_verify_data, ssl->verify_data_len );\n        p += ssl->verify_data_len;\n        memcpy( p, ssl->own_verify_data, ssl->verify_data_len );\n        p += ssl->verify_data_len;\n    }\n    else\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n    {\n        *p++ = 0x00;\n        *p++ = 0x01;\n        *p++ = 0x00;\n    }\n\n    *olen = p - buf;\n}\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\nstatic void ssl_write_max_fragment_length_ext( mbedtls_ssl_context *ssl,\n                                               unsigned char *buf,\n                                               size_t *olen )\n{\n    unsigned char *p = buf;\n\n    if( ssl->session_negotiate->mfl_code == MBEDTLS_SSL_MAX_FRAG_LEN_NONE )\n    {\n        *olen = 0;\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, max_fragment_length extension\" ) );\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 1;\n\n    *p++ = ssl->session_negotiate->mfl_code;\n\n    *olen = 5;\n}\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\nstatic void ssl_write_supported_point_formats_ext( mbedtls_ssl_context *ssl,\n                                                   unsigned char *buf,\n                                                   size_t *olen )\n{\n    unsigned char *p = buf;\n    ((void) ssl);\n\n    if( ( ssl->handshake->cli_exts &\n          MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT ) == 0 )\n    {\n        *olen = 0;\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, supported_point_formats extension\" ) );\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS      ) & 0xFF );\n\n    *p++ = 0x00;\n    *p++ = 2;\n\n    *p++ = 1;\n    *p++ = MBEDTLS_ECP_PF_UNCOMPRESSED;\n\n    *olen = 6;\n}\n#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C || MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\nstatic void ssl_write_ecjpake_kkpp_ext( mbedtls_ssl_context *ssl,\n                                        unsigned char *buf,\n                                        size_t *olen )\n{\n    int ret;\n    unsigned char *p = buf;\n    const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n    size_t kkpp_len;\n\n    *olen = 0;\n\n    /* Skip costly computation if not needed */\n    if( ssl->transform_negotiate->ciphersuite_info->key_exchange !=\n        MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n        return;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, ecjpake kkpp extension\" ) );\n\n    if( end - p < 4 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"buffer too small\" ) );\n        return;\n    }\n\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( MBEDTLS_TLS_EXT_ECJPAKE_KKPP      ) & 0xFF );\n\n    ret = mbedtls_ecjpake_write_round_one( &ssl->handshake->ecjpake_ctx,\n                                        p + 2, end - p - 2, &kkpp_len,\n                                        ssl->conf->f_rng, ssl->conf->p_rng );\n    if( ret != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1 , \"mbedtls_ecjpake_write_round_one\", ret );\n        return;\n    }\n\n    *p++ = (unsigned char)( ( kkpp_len >> 8 ) & 0xFF );\n    *p++ = (unsigned char)( ( kkpp_len      ) & 0xFF );\n\n    *olen = kkpp_len + 4;\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_SSL_ALPN )\nstatic void ssl_write_alpn_ext( mbedtls_ssl_context *ssl,\n                                unsigned char *buf, size_t *olen )\n{\n    if( ssl->alpn_chosen == NULL )\n    {\n        *olen = 0;\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, adding alpn extension\" ) );\n\n    /*\n     * 0 . 1    ext identifier\n     * 2 . 3    ext length\n     * 4 . 5    protocol list length\n     * 6 . 6    protocol name length\n     * 7 . 7+n  protocol name\n     */\n    buf[0] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN >> 8 ) & 0xFF );\n    buf[1] = (unsigned char)( ( MBEDTLS_TLS_EXT_ALPN      ) & 0xFF );\n\n    *olen = 7 + strlen( ssl->alpn_chosen );\n\n    buf[2] = (unsigned char)( ( ( *olen - 4 ) >> 8 ) & 0xFF );\n    buf[3] = (unsigned char)( ( ( *olen - 4 )      ) & 0xFF );\n\n    buf[4] = (unsigned char)( ( ( *olen - 6 ) >> 8 ) & 0xFF );\n    buf[5] = (unsigned char)( ( ( *olen - 6 )      ) & 0xFF );\n\n    buf[6] = (unsigned char)( ( ( *olen - 7 )      ) & 0xFF );\n\n    memcpy( buf + 7, ssl->alpn_chosen, *olen - 7 );\n}\n#endif /* MBEDTLS_ECDH_C || MBEDTLS_ECDSA_C */\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)\nstatic int ssl_write_hello_verify_request( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    unsigned char *p = ssl->out_msg + 4;\n    unsigned char *cookie_len_byte;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write hello verify request\" ) );\n\n    /*\n     * struct {\n     *   ProtocolVersion server_version;\n     *   opaque cookie<0..2^8-1>;\n     * } HelloVerifyRequest;\n     */\n\n    /* The RFC is not clear on this point, but sending the actual negotiated\n     * version looks like the most interoperable thing to do. */\n    mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,\n                       ssl->conf->transport, p );\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"server version\", p, 2 );\n    p += 2;\n\n    /* If we get here, f_cookie_check is not null */\n    if( ssl->conf->f_cookie_write == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"inconsistent cookie callbacks\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    /* Skip length byte until we know the length */\n    cookie_len_byte = p++;\n\n    if( ( ret = ssl->conf->f_cookie_write( ssl->conf->p_cookie,\n                                     &p, ssl->out_buf + MBEDTLS_SSL_BUFFER_LEN,\n                                     ssl->cli_id, ssl->cli_id_len ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"f_cookie_write\", ret );\n        return( ret );\n    }\n\n    *cookie_len_byte = (unsigned char)( p - ( cookie_len_byte + 1 ) );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"cookie sent\", cookie_len_byte + 1, *cookie_len_byte );\n\n    ssl->out_msglen  = p - ssl->out_msg;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;\n\n    ssl->state = MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT;\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write hello verify request\" ) );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */\n\nstatic int ssl_write_server_hello( mbedtls_ssl_context *ssl )\n{\n#if defined(MBEDTLS_HAVE_TIME)\n    mbedtls_time_t t;\n#endif\n    int ret;\n    size_t olen, ext_len = 0, n;\n    unsigned char *buf, *p;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write server hello\" ) );\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ssl->handshake->verify_cookie_len != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"client hello was not authenticated\" ) );\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write server hello\" ) );\n\n        return( ssl_write_hello_verify_request( ssl ) );\n    }\n#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */\n\n    if( ssl->conf->f_rng == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"no RNG provided\") );\n        return( MBEDTLS_ERR_SSL_NO_RNG );\n    }\n\n    /*\n     *     0  .   0   handshake type\n     *     1  .   3   handshake length\n     *     4  .   5   protocol version\n     *     6  .   9   UNIX time()\n     *    10  .  37   random bytes\n     */\n    buf = ssl->out_msg;\n    p = buf + 4;\n\n    mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,\n                       ssl->conf->transport, p );\n    p += 2;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, chosen version: [%d:%d]\",\n                        buf[4], buf[5] ) );\n\n#if defined(MBEDTLS_HAVE_TIME)\n    t = mbedtls_time( NULL );\n    *p++ = (unsigned char)( t >> 24 );\n    *p++ = (unsigned char)( t >> 16 );\n    *p++ = (unsigned char)( t >>  8 );\n    *p++ = (unsigned char)( t       );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, current time: %lu\", t ) );\n#else\n    if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 4 ) ) != 0 )\n        return( ret );\n\n    p += 4;\n#endif /* MBEDTLS_HAVE_TIME */\n\n    if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, p, 28 ) ) != 0 )\n        return( ret );\n\n    p += 28;\n\n    memcpy( ssl->handshake->randbytes + 32, buf + 6, 32 );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"server hello, random bytes\", buf + 6, 32 );\n\n    /*\n     * Resume is 0  by default, see ssl_handshake_init().\n     * It may be already set to 1 by ssl_parse_session_ticket_ext().\n     * If not, try looking up session ID in our cache.\n     */\n    if( ssl->handshake->resume == 0 &&\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n        ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE &&\n#endif\n        ssl->session_negotiate->id_len != 0 &&\n        ssl->conf->f_get_cache != NULL &&\n        ssl->conf->f_get_cache( ssl->conf->p_cache, ssl->session_negotiate ) == 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"session successfully restored from cache\" ) );\n        ssl->handshake->resume = 1;\n    }\n\n    if( ssl->handshake->resume == 0 )\n    {\n        /*\n         * New session, create a new session id,\n         * unless we're about to issue a session ticket\n         */\n        ssl->state++;\n\n#if defined(MBEDTLS_HAVE_TIME)\n        ssl->session_negotiate->start = mbedtls_time( NULL );\n#endif\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n        if( ssl->handshake->new_session_ticket != 0 )\n        {\n            ssl->session_negotiate->id_len = n = 0;\n            memset( ssl->session_negotiate->id, 0, 32 );\n        }\n        else\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n        {\n            ssl->session_negotiate->id_len = n = 32;\n            if( ( ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->session_negotiate->id,\n                                    n ) ) != 0 )\n                return( ret );\n        }\n    }\n    else\n    {\n        /*\n         * Resuming a session\n         */\n        n = ssl->session_negotiate->id_len;\n        ssl->state = MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC;\n\n        if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_derive_keys\", ret );\n            return( ret );\n        }\n    }\n\n    /*\n     *    38  .  38     session id length\n     *    39  . 38+n    session id\n     *   39+n . 40+n    chosen ciphersuite\n     *   41+n . 41+n    chosen compression alg.\n     *   42+n . 43+n    extensions length\n     *   44+n . 43+n+m  extensions\n     */\n    *p++ = (unsigned char) ssl->session_negotiate->id_len;\n    memcpy( p, ssl->session_negotiate->id, ssl->session_negotiate->id_len );\n    p += ssl->session_negotiate->id_len;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, session id len.: %d\", n ) );\n    MBEDTLS_SSL_DEBUG_BUF( 3,   \"server hello, session id\", buf + 39, n );\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"%s session has been resumed\",\n                   ssl->handshake->resume ? \"a\" : \"no\" ) );\n\n    *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite >> 8 );\n    *p++ = (unsigned char)( ssl->session_negotiate->ciphersuite      );\n    *p++ = (unsigned char)( ssl->session_negotiate->compression      );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, chosen ciphersuite: %s\",\n           mbedtls_ssl_get_ciphersuite_name( ssl->session_negotiate->ciphersuite ) ) );\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, compress alg.: 0x%02X\",\n                   ssl->session_negotiate->compression ) );\n\n    /* Do not write the extensions if the protocol is SSLv3 */\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n    if( ( ssl->major_ver != 3 ) || ( ssl->minor_ver != 0 ) )\n    {\n#endif\n\n    /*\n     *  First write extensions, then the total length\n     */\n    ssl_write_renegotiation_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n    ssl_write_max_fragment_length_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n    ssl_write_truncated_hmac_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n    ssl_write_encrypt_then_mac_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n    ssl_write_extended_ms_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    ssl_write_session_ticket_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    ssl_write_supported_point_formats_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    ssl_write_ecjpake_kkpp_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n#if defined(MBEDTLS_SSL_ALPN)\n    ssl_write_alpn_ext( ssl, p + 2 + ext_len, &olen );\n    ext_len += olen;\n#endif\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"server hello, total extension length: %d\", ext_len ) );\n\n    if( ext_len > 0 )\n    {\n        *p++ = (unsigned char)( ( ext_len >> 8 ) & 0xFF );\n        *p++ = (unsigned char)( ( ext_len      ) & 0xFF );\n        p += ext_len;\n    }\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n    }\n#endif\n\n    ssl->out_msglen  = p - buf;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_SERVER_HELLO;\n\n    ret = mbedtls_ssl_write_record( ssl );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write server hello\" ) );\n\n    return( ret );\n}\n\n#if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)       && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)   && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)  && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)\nstatic int ssl_write_certificate_request( mbedtls_ssl_context *ssl )\n{\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n        ssl->transform_negotiate->ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write certificate request\" ) );\n\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip write certificate request\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n    return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n}\n#else\nstatic int ssl_write_certificate_request( mbedtls_ssl_context *ssl )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n        ssl->transform_negotiate->ciphersuite_info;\n    size_t dn_size, total_dn_size; /* excluding length bytes */\n    size_t ct_len, sa_len; /* including length bytes */\n    unsigned char *buf, *p;\n    const unsigned char * const end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n    const mbedtls_x509_crt *crt;\n    int authmode;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write certificate request\" ) );\n\n    ssl->state++;\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n    if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET )\n        authmode = ssl->handshake->sni_authmode;\n    else\n#endif\n        authmode = ssl->conf->authmode;\n\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||\n        authmode == MBEDTLS_SSL_VERIFY_NONE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip write certificate request\" ) );\n        return( 0 );\n    }\n\n    /*\n     *     0  .   0   handshake type\n     *     1  .   3   handshake length\n     *     4  .   4   cert type count\n     *     5  .. m-1  cert types\n     *     m  .. m+1  sig alg length (TLS 1.2 only)\n     *    m+1 .. n-1  SignatureAndHashAlgorithms (TLS 1.2 only)\n     *     n  .. n+1  length of all DNs\n     *    n+2 .. n+3  length of DN 1\n     *    n+4 .. ...  Distinguished Name #1\n     *    ... .. ...  length of DN 2, etc.\n     */\n    buf = ssl->out_msg;\n    p = buf + 4;\n\n    /*\n     * Supported certificate types\n     *\n     *     ClientCertificateType certificate_types<1..2^8-1>;\n     *     enum { (255) } ClientCertificateType;\n     */\n    ct_len = 0;\n\n#if defined(MBEDTLS_RSA_C)\n    p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_RSA_SIGN;\n#endif\n#if defined(MBEDTLS_ECDSA_C)\n    p[1 + ct_len++] = MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN;\n#endif\n\n    p[0] = (unsigned char) ct_len++;\n    p += ct_len;\n\n    sa_len = 0;\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    /*\n     * Add signature_algorithms for verify (TLS 1.2)\n     *\n     *     SignatureAndHashAlgorithm supported_signature_algorithms<2..2^16-2>;\n     *\n     *     struct {\n     *           HashAlgorithm hash;\n     *           SignatureAlgorithm signature;\n     *     } SignatureAndHashAlgorithm;\n     *\n     *     enum { (255) } HashAlgorithm;\n     *     enum { (255) } SignatureAlgorithm;\n     */\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        const int *cur;\n\n        /*\n         * Supported signature algorithms\n         */\n        for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ )\n        {\n            unsigned char hash = mbedtls_ssl_hash_from_md_alg( *cur );\n\n            if( MBEDTLS_SSL_HASH_NONE == hash || mbedtls_ssl_set_calc_verify_md( ssl, hash ) )\n                continue;\n\n#if defined(MBEDTLS_RSA_C)\n            p[2 + sa_len++] = hash;\n            p[2 + sa_len++] = MBEDTLS_SSL_SIG_RSA;\n#endif\n#if defined(MBEDTLS_ECDSA_C)\n            p[2 + sa_len++] = hash;\n            p[2 + sa_len++] = MBEDTLS_SSL_SIG_ECDSA;\n#endif\n        }\n\n        p[0] = (unsigned char)( sa_len >> 8 );\n        p[1] = (unsigned char)( sa_len      );\n        sa_len += 2;\n        p += sa_len;\n    }\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\n    /*\n     * DistinguishedName certificate_authorities<0..2^16-1>;\n     * opaque DistinguishedName<1..2^16-1>;\n     */\n    p += 2;\n\n    total_dn_size = 0;\n\n    if( ssl->conf->cert_req_ca_list ==  MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED )\n    {\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n        if( ssl->handshake->sni_ca_chain != NULL )\n            crt = ssl->handshake->sni_ca_chain;\n        else\n#endif\n            crt = ssl->conf->ca_chain;\n\n        while( crt != NULL && crt->version != 0 )\n        {\n            dn_size = crt->subject_raw.len;\n\n            if( end < p ||\n                (size_t)( end - p ) < dn_size ||\n                (size_t)( end - p ) < 2 + dn_size )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"skipping CAs: buffer too short\" ) );\n                break;\n            }\n\n            *p++ = (unsigned char)( dn_size >> 8 );\n            *p++ = (unsigned char)( dn_size      );\n            memcpy( p, crt->subject_raw.p, dn_size );\n            p += dn_size;\n\n            MBEDTLS_SSL_DEBUG_BUF( 3, \"requested DN\", p - dn_size, dn_size );\n\n            total_dn_size += 2 + dn_size;\n            crt = crt->next;\n        }\n    }\n\n    ssl->out_msglen  = p - buf;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_CERTIFICATE_REQUEST;\n    ssl->out_msg[4 + ct_len + sa_len] = (unsigned char)( total_dn_size  >> 8 );\n    ssl->out_msg[5 + ct_len + sa_len] = (unsigned char)( total_dn_size       );\n\n    ret = mbedtls_ssl_write_record( ssl );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write certificate request\" ) );\n\n    return( ret );\n}\n#endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\nstatic int ssl_get_ecdh_params_from_cert( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    if( ! mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_ECKEY ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"server key not ECDH capable\" ) );\n        return( MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH );\n    }\n\n    if( ( ret = mbedtls_ecdh_get_params( &ssl->handshake->ecdh_ctx,\n                                 mbedtls_pk_ec( *mbedtls_ssl_own_key( ssl ) ),\n                                 MBEDTLS_ECDH_OURS ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, ( \"mbedtls_ecdh_get_params\" ), ret );\n        return( ret );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||\n          MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */\n\nstatic int ssl_write_server_key_exchange( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    size_t n = 0;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n                            ssl->transform_negotiate->ciphersuite_info;\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED)\n    unsigned char *p = ssl->out_msg + 4;\n    size_t len;\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)\n    unsigned char *dig_signed = p;\n    size_t dig_signed_len = 0;\n#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME_PFS__ENABLED */\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write server key exchange\" ) );\n\n    /*\n     *\n     * Part 1: Extract static ECDH parameters and abort\n     *         if ServerKeyExchange not needed.\n     *\n     */\n\n    /* For suites involving ECDH, extract DH parameters\n     * from certificate at this point. */\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED)\n    if( mbedtls_ssl_ciphersuite_uses_ecdh( ciphersuite_info ) )\n    {\n        ssl_get_ecdh_params_from_cert( ssl );\n    }\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDH_ENABLED */\n\n    /* Key exchanges not involving ephemeral keys don't use\n     * ServerKeyExchange, so end here. */\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME_NON_PFS__ENABLED)\n    if( mbedtls_ssl_ciphersuite_no_pfs( ciphersuite_info ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip write server key exchange\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n#endif /* MBEDTLS_KEY_EXCHANGE__NON_PFS__ENABLED */\n\n    /*\n     *\n     * Part 2: Provide key exchange parameters for chosen ciphersuite.\n     *\n     */\n\n    /*\n     * - ECJPAKE key exchanges\n     */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        const unsigned char *end = ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN;\n\n        ret = mbedtls_ecjpake_write_round_two( &ssl->handshake->ecjpake_ctx,\n                p, end - p, &len, ssl->conf->f_rng, ssl->conf->p_rng );\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecjpake_write_round_two\", ret );\n            return( ret );\n        }\n\n        p += len;\n        n += len;\n    }\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n    /*\n     * For (EC)DHE key exchanges with PSK, parameters are prefixed by support\n     * identity hint (RFC 4279, Sec. 3). Until someone needs this feature,\n     * we use empty support identity hints here.\n     **/\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)   || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )\n    {\n        *(p++) = 0x00;\n        *(p++) = 0x00;\n\n        n += 2;\n    }\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */\n\n    /*\n     * - DHE key exchanges\n     */\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED)\n    if( mbedtls_ssl_ciphersuite_uses_dhe( ciphersuite_info ) )\n    {\n        if( ssl->conf->dhm_P.p == NULL || ssl->conf->dhm_G.p == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"no DH parameters set\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n        }\n\n        /*\n         * Ephemeral DH parameters:\n         *\n         * struct {\n         *     opaque dh_p<1..2^16-1>;\n         *     opaque dh_g<1..2^16-1>;\n         *     opaque dh_Ys<1..2^16-1>;\n         * } ServerDHParams;\n         */\n        if( ( ret = mbedtls_mpi_copy( &ssl->handshake->dhm_ctx.P, &ssl->conf->dhm_P ) ) != 0 ||\n            ( ret = mbedtls_mpi_copy( &ssl->handshake->dhm_ctx.G, &ssl->conf->dhm_G ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_mpi_copy\", ret );\n            return( ret );\n        }\n\n        if( ( ret = mbedtls_dhm_make_params( &ssl->handshake->dhm_ctx,\n                        (int) mbedtls_mpi_size( &ssl->handshake->dhm_ctx.P ),\n                        p, &len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_dhm_make_params\", ret );\n            return( ret );\n        }\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)        \n        dig_signed = p;\n        dig_signed_len = len;\n#endif\n\n        p += len;\n        n += len;\n\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: X \", &ssl->handshake->dhm_ctx.X  );\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: P \", &ssl->handshake->dhm_ctx.P  );\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: G \", &ssl->handshake->dhm_ctx.G  );\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: GX\", &ssl->handshake->dhm_ctx.GX );\n    }\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__DHE_ENABLED */\n\n    /*\n     * - ECDHE key exchanges\n     */\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED)\n    if( mbedtls_ssl_ciphersuite_uses_ecdhe( ciphersuite_info ) )\n    {\n        /*\n         * Ephemeral ECDH parameters:\n         *\n         * struct {\n         *     ECParameters curve_params;\n         *     ECPoint      public;\n         * } ServerECDHParams;\n         */\n        const mbedtls_ecp_curve_info **curve = NULL;\n        const mbedtls_ecp_group_id *gid;\n\n        /* Match our preference list against the offered curves */\n        for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ )\n            for( curve = ssl->handshake->curves; *curve != NULL; curve++ )\n                if( (*curve)->grp_id == *gid )\n                    goto curve_matching_done;\n\ncurve_matching_done:\n        if( curve == NULL || *curve == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"no matching curve for ECDHE\" ) );\n            return( MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN );\n        }\n\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"ECDHE curve: %s\", (*curve)->name ) );\n\n        if( ( ret = mbedtls_ecp_group_load( &ssl->handshake->ecdh_ctx.grp,\n                                       (*curve)->grp_id ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecp_group_load\", ret );\n            return( ret );\n        }\n\n        if( ( ret = mbedtls_ecdh_make_params( &ssl->handshake->ecdh_ctx, &len,\n                                      p, MBEDTLS_SSL_MAX_CONTENT_LEN - n,\n                                      ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecdh_make_params\", ret );\n            return( ret );\n        }\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)\n        dig_signed     = p;\n        dig_signed_len = len;\n#endif\n\n        p += len;\n        n += len;\n\n        MBEDTLS_SSL_DEBUG_ECP( 3, \"ECDH: Q \", &ssl->handshake->ecdh_ctx.Q );\n    }\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED */\n\n    /*\n     *\n     * Part 3: For key exchanges involving the server signing the\n     *         exchange parameters, compute and add the signature here.\n     *\n     */\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED)\n    if( mbedtls_ssl_ciphersuite_uses_server_signature( ciphersuite_info ) )\n    {\n        size_t signature_len = 0;\n        unsigned int hashlen = 0;\n        unsigned char hash[64];\n\n        /*\n         * 3.1: Choose hash algorithm:\n         * A: For TLS 1.2, obey signature-hash-algorithm extension \n         *    to choose appropriate hash.\n         * B: For SSL3, TLS1.0, TLS1.1 and ECDHE_ECDSA, use SHA1\n         *    (RFC 4492, Sec. 5.4)\n         * C: Otherwise, use MD5 + SHA1 (RFC 4346, Sec. 7.4.3)\n         */\n\n        mbedtls_md_type_t md_alg;\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        mbedtls_pk_type_t sig_alg =\n            mbedtls_ssl_get_ciphersuite_sig_pk_alg( ciphersuite_info );\n        if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n        {\n            /* A: For TLS 1.2, obey signature-hash-algorithm extension\n             *    (RFC 5246, Sec. 7.4.1.4.1). */\n            if( sig_alg == MBEDTLS_PK_NONE ||\n                ( md_alg = mbedtls_ssl_sig_hash_set_find( &ssl->handshake->hash_algs,\n                                                          sig_alg ) ) == MBEDTLS_MD_NONE )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n                /* (... because we choose a cipher suite \n                 *      only if there is a matching hash.) */\n                return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n            }\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n        if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA )\n        {\n            /* B: Default hash SHA1 */\n            md_alg = MBEDTLS_MD_SHA1;\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \\\n          MBEDTLS_SSL_PROTO_TLS1_1 */\n        {\n            /* C: MD5 + SHA1 */\n            md_alg = MBEDTLS_MD_NONE;\n        }\n\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"pick hash algorithm %d for signing\", md_alg ) );\n\n        /*\n         * 3.2: Compute the hash to be signed\n         */\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n        if( md_alg == MBEDTLS_MD_NONE )\n        {\n            mbedtls_md5_context mbedtls_md5;\n            mbedtls_sha1_context mbedtls_sha1;\n\n            mbedtls_md5_init(  &mbedtls_md5  );\n            mbedtls_sha1_init( &mbedtls_sha1 );\n\n            /*\n             * digitally-signed struct {\n             *     opaque md5_hash[16];\n             *     opaque sha_hash[20];\n             * };\n             *\n             * md5_hash\n             *     MD5(ClientHello.random + ServerHello.random\n             *                            + ServerParams);\n             * sha_hash\n             *     SHA(ClientHello.random + ServerHello.random\n             *                            + ServerParams);\n             */\n\n            mbedtls_md5_starts( &mbedtls_md5 );\n            mbedtls_md5_update( &mbedtls_md5, ssl->handshake->randbytes,  64 );\n            mbedtls_md5_update( &mbedtls_md5, dig_signed, dig_signed_len );\n            mbedtls_md5_finish( &mbedtls_md5, hash );\n\n            mbedtls_sha1_starts( &mbedtls_sha1 );\n            mbedtls_sha1_update( &mbedtls_sha1, ssl->handshake->randbytes,  64 );\n            mbedtls_sha1_update( &mbedtls_sha1, dig_signed, dig_signed_len );\n            mbedtls_sha1_finish( &mbedtls_sha1, hash + 16 );\n\n            hashlen = 36;\n\n            mbedtls_md5_free(  &mbedtls_md5  );\n            mbedtls_sha1_free( &mbedtls_sha1 );\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 || \\\n          MBEDTLS_SSL_PROTO_TLS1_1 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        if( md_alg != MBEDTLS_MD_NONE )\n        {\n            mbedtls_md_context_t ctx;\n            const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type( md_alg );\n\n            mbedtls_md_init( &ctx );\n\n            /* Info from md_alg will be used instead */\n            hashlen = 0;\n\n            /*\n             * digitally-signed struct {\n             *     opaque client_random[32];\n             *     opaque server_random[32];\n             *     ServerDHParams params;\n             * };\n             */\n            if( ( ret = mbedtls_md_setup( &ctx, md_info, 0 ) ) != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_md_setup\", ret );\n                return( ret );\n            }\n\n            mbedtls_md_starts( &ctx );\n            mbedtls_md_update( &ctx, ssl->handshake->randbytes, 64 );\n            mbedtls_md_update( &ctx, dig_signed, dig_signed_len );\n            mbedtls_md_finish( &ctx, hash );\n            mbedtls_md_free( &ctx );\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \\\n          MBEDTLS_SSL_PROTO_TLS1_2 */\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        MBEDTLS_SSL_DEBUG_BUF( 3, \"parameters hash\", hash, hashlen != 0 ? hashlen :\n            (unsigned int) ( mbedtls_md_get_size( mbedtls_md_info_from_type( md_alg ) ) ) );\n\n        /*\n         * 3.3: Compute and add the signature\n         */\n        if( mbedtls_ssl_own_key( ssl ) == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got no private key\" ) );\n            return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );\n        }\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n        {\n            /*\n             * For TLS 1.2, we need to specify signature and hash algorithm\n             * explicitly through a prefix to the signature.\n             *\n             * struct {\n             *    HashAlgorithm hash;\n             *    SignatureAlgorithm signature;\n             * } SignatureAndHashAlgorithm;\n             *\n             * struct {\n             *    SignatureAndHashAlgorithm algorithm;\n             *    opaque signature<0..2^16-1>;\n             * } DigitallySigned;\n             *\n             */\n\n            *(p++) = mbedtls_ssl_hash_from_md_alg( md_alg );\n            *(p++) = mbedtls_ssl_sig_from_pk_alg( sig_alg );\n\n            n += 2;\n        }\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\n        if( ( ret = mbedtls_pk_sign( mbedtls_ssl_own_key( ssl ), md_alg, hash, hashlen,\n                        p + 2 , &signature_len, ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_pk_sign\", ret );\n            return( ret );\n        }\n\n        *(p++) = (unsigned char)( signature_len >> 8 );\n        *(p++) = (unsigned char)( signature_len      );\n        n += 2;\n\n        MBEDTLS_SSL_DEBUG_BUF( 3, \"my signature\", p, signature_len );\n\n        n += signature_len;\n    }\n#endif /* MBEDTLS_KEY_EXCHANGE__WITH_SERVER_SIGNATURE__ENABLED */\n\n    /* Done with actual work; add header and send. */\n\n    ssl->out_msglen  = 4 + n;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE;\n\n    ssl->state++;\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write server key exchange\" ) );\n\n    return( 0 );\n}\n\nstatic int ssl_write_server_hello_done( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write server hello done\" ) );\n\n    ssl->out_msglen  = 4;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_SERVER_HELLO_DONE;\n\n    ssl->state++;\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        mbedtls_ssl_send_flight_completed( ssl );\n#endif\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write server hello done\" ) );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED) ||                       \\\n    defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\nstatic int ssl_parse_client_dh_public( mbedtls_ssl_context *ssl, unsigned char **p,\n                                       const unsigned char *end )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n    size_t n;\n\n    /*\n     * Receive G^Y mod P, premaster = (G^Y)^X mod P\n     */\n    if( *p + 2 > end )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n    }\n\n    n = ( (*p)[0] << 8 ) | (*p)[1];\n    *p += 2;\n\n    if( *p + n > end )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n    }\n\n    if( ( ret = mbedtls_dhm_read_public( &ssl->handshake->dhm_ctx, *p, n ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_dhm_read_public\", ret );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );\n    }\n\n    *p += n;\n\n    MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: GY\", &ssl->handshake->dhm_ctx.GY );\n\n    return( ret );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED) ||                           \\\n    defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)\nstatic int ssl_parse_encrypted_pms( mbedtls_ssl_context *ssl,\n                                    const unsigned char *p,\n                                    const unsigned char *end,\n                                    size_t pms_offset )\n{\n    int ret;\n    size_t len = mbedtls_pk_get_len( mbedtls_ssl_own_key( ssl ) );\n    unsigned char *pms = ssl->handshake->premaster + pms_offset;\n    unsigned char ver[2];\n    unsigned char fake_pms[48], peer_pms[48];\n    unsigned char mask;\n    size_t i, peer_pmslen;\n    unsigned int diff;\n\n    if( ! mbedtls_pk_can_do( mbedtls_ssl_own_key( ssl ), MBEDTLS_PK_RSA ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got no RSA private key\" ) );\n        return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );\n    }\n\n    /*\n     * Decrypt the premaster using own private RSA key\n     */\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        if( *p++ != ( ( len >> 8 ) & 0xFF ) ||\n            *p++ != ( ( len      ) & 0xFF ) )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange message\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n        }\n    }\n#endif\n\n    if( p + len != end )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n    }\n\n    mbedtls_ssl_write_version( ssl->handshake->max_major_ver,\n                       ssl->handshake->max_minor_ver,\n                       ssl->conf->transport, ver );\n\n    /*\n     * Protection against Bleichenbacher's attack: invalid PKCS#1 v1.5 padding\n     * must not cause the connection to end immediately; instead, send a\n     * bad_record_mac later in the handshake.\n     * Also, avoid data-dependant branches here to protect against\n     * timing-based variants.\n     */\n    ret = ssl->conf->f_rng( ssl->conf->p_rng, fake_pms, sizeof( fake_pms ) );\n    if( ret != 0 )\n        return( ret );\n\n    ret = mbedtls_pk_decrypt( mbedtls_ssl_own_key( ssl ), p, len,\n                      peer_pms, &peer_pmslen,\n                      sizeof( peer_pms ),\n                      ssl->conf->f_rng, ssl->conf->p_rng );\n\n    diff  = (unsigned int) ret;\n    diff |= peer_pmslen ^ 48;\n    diff |= peer_pms[0] ^ ver[0];\n    diff |= peer_pms[1] ^ ver[1];\n\n#if defined(MBEDTLS_SSL_DEBUG_ALL)\n    if( diff != 0 )\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange message\" ) );\n#endif\n\n    if( sizeof( ssl->handshake->premaster ) < pms_offset ||\n        sizeof( ssl->handshake->premaster ) - pms_offset < 48 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n    ssl->handshake->pmslen = 48;\n\n    /* mask = diff ? 0xff : 0x00 using bit operations to avoid branches */\n    /* MSVC has a warning about unary minus on unsigned, but this is\n     * well-defined and precisely what we want to do here */\n#if defined(_MSC_VER)\n#pragma warning( push )\n#pragma warning( disable : 4146 )\n#endif\n    mask = - ( ( diff | - diff ) >> ( sizeof( unsigned int ) * 8 - 1 ) );\n#if defined(_MSC_VER)\n#pragma warning( pop )\n#endif\n\n    for( i = 0; i < ssl->handshake->pmslen; i++ )\n        pms[i] = ( mask & fake_pms[i] ) | ( (~mask) & peer_pms[i] );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\nstatic int ssl_parse_client_psk_identity( mbedtls_ssl_context *ssl, unsigned char **p,\n                                          const unsigned char *end )\n{\n    int ret = 0;\n    size_t n;\n\n    if( ssl->conf->f_psk == NULL &&\n        ( ssl->conf->psk == NULL || ssl->conf->psk_identity == NULL ||\n          ssl->conf->psk_identity_len == 0 || ssl->conf->psk_len == 0 ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got no pre-shared key\" ) );\n        return( MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED );\n    }\n\n    /*\n     * Receive client pre-shared key identity name\n     */\n    if( end - *p < 2 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n    }\n\n    n = ( (*p)[0] << 8 ) | (*p)[1];\n    *p += 2;\n\n    if( n < 1 || n > 65535 || n > (size_t) ( end - *p ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n    }\n\n    if( ssl->conf->f_psk != NULL )\n    {\n        if( ssl->conf->f_psk( ssl->conf->p_psk, ssl, *p, n ) != 0 )\n            ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;\n    }\n    else\n    {\n        /* Identity is not a big secret since clients send it in the clear,\n         * but treat it carefully anyway, just in case */\n        if( n != ssl->conf->psk_identity_len ||\n            mbedtls_ssl_safer_memcmp( ssl->conf->psk_identity, *p, n ) != 0 )\n        {\n            ret = MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY;\n        }\n    }\n\n    if( ret == MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY )\n    {\n        MBEDTLS_SSL_DEBUG_BUF( 3, \"Unknown PSK identity\", *p, n );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY );\n        return( MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY );\n    }\n\n    *p += n;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\nstatic int ssl_parse_client_key_exchange( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info;\n    unsigned char *p, *end;\n\n    ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse client key exchange\" ) );\n\n    if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n        return( ret );\n    }\n\n    p = ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl );\n    end = ssl->in_msg + ssl->in_hslen;\n\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n    }\n\n    if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n    }\n\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_RSA )\n    {\n        if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, ( \"ssl_parse_client_dh_public\" ), ret );\n            return( ret );\n        }\n\n        if( p != end )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n        }\n\n        if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,\n                                      ssl->handshake->premaster,\n                                      MBEDTLS_PREMASTER_SIZE,\n                                     &ssl->handshake->pmslen,\n                                      ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_dhm_calc_secret\", ret );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );\n        }\n\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: K \", &ssl->handshake->dhm_ctx.K  );\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) ||                     \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) ||                   \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED) ||                      \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_RSA ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_RSA ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA )\n    {\n        if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx,\n                                      p, end - p) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecdh_read_public\", ret );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );\n        }\n\n        MBEDTLS_SSL_DEBUG_ECP( 3, \"ECDH: Qp \", &ssl->handshake->ecdh_ctx.Qp );\n\n        if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx,\n                                      &ssl->handshake->pmslen,\n                                       ssl->handshake->premaster,\n                                       MBEDTLS_MPI_MAX_SIZE,\n                                       ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecdh_calc_secret\", ret );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS );\n        }\n\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"ECDH: z  \", &ssl->handshake->ecdh_ctx.z );\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED ||\n          MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK )\n    {\n        if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, ( \"ssl_parse_client_psk_identity\" ), ret );\n            return( ret );\n        }\n\n        if( p != end )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n        }\n\n        if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,\n                        ciphersuite_info->key_exchange ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_psk_derive_premaster\", ret );\n            return( ret );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )\n    {\n        if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, ( \"ssl_parse_client_psk_identity\" ), ret );\n            return( ret );\n        }\n\n        if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 2 ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, ( \"ssl_parse_encrypted_pms\" ), ret );\n            return( ret );\n        }\n\n        if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,\n                        ciphersuite_info->key_exchange ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_psk_derive_premaster\", ret );\n            return( ret );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK )\n    {\n        if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, ( \"ssl_parse_client_psk_identity\" ), ret );\n            return( ret );\n        }\n        if( ( ret = ssl_parse_client_dh_public( ssl, &p, end ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, ( \"ssl_parse_client_dh_public\" ), ret );\n            return( ret );\n        }\n\n        if( p != end )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad client key exchange\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );\n        }\n\n        if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,\n                        ciphersuite_info->key_exchange ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_psk_derive_premaster\", ret );\n            return( ret );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )\n    {\n        if( ( ret = ssl_parse_client_psk_identity( ssl, &p, end ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, ( \"ssl_parse_client_psk_identity\" ), ret );\n            return( ret );\n        }\n\n        if( ( ret = mbedtls_ecdh_read_public( &ssl->handshake->ecdh_ctx,\n                                       p, end - p ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecdh_read_public\", ret );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP );\n        }\n\n        MBEDTLS_SSL_DEBUG_ECP( 3, \"ECDH: Qp \", &ssl->handshake->ecdh_ctx.Qp );\n\n        if( ( ret = mbedtls_ssl_psk_derive_premaster( ssl,\n                        ciphersuite_info->key_exchange ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_psk_derive_premaster\", ret );\n            return( ret );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA )\n    {\n        if( ( ret = ssl_parse_encrypted_pms( ssl, p, end, 0 ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, ( \"ssl_parse_parse_encrypted_pms_secret\" ), ret );\n            return( ret );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        ret = mbedtls_ecjpake_read_round_two( &ssl->handshake->ecjpake_ctx,\n                                              p, end - p );\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecjpake_read_round_two\", ret );\n            return( MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );\n        }\n\n        ret = mbedtls_ecjpake_derive_secret( &ssl->handshake->ecjpake_ctx,\n                ssl->handshake->premaster, 32, &ssl->handshake->pmslen,\n                ssl->conf->f_rng, ssl->conf->p_rng );\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecjpake_derive_secret\", ret );\n            return( ret );\n        }\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    if( ( ret = mbedtls_ssl_derive_keys( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_derive_keys\", ret );\n        return( ret );\n    }\n\n    ssl->state++;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse client key exchange\" ) );\n\n    return( 0 );\n}\n\n#if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)       && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)   && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)  && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)&& \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)\nstatic int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )\n{\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n        ssl->transform_negotiate->ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse certificate verify\" ) );\n\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip parse certificate verify\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n    return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n}\n#else\nstatic int ssl_parse_certificate_verify( mbedtls_ssl_context *ssl )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n    size_t i, sig_len;\n    unsigned char hash[48];\n    unsigned char *hash_start = hash;\n    size_t hashlen;\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    mbedtls_pk_type_t pk_alg;\n#endif\n    mbedtls_md_type_t md_alg;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info =\n        ssl->transform_negotiate->ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse certificate verify\" ) );\n\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE ||\n        ssl->session_negotiate->peer_cert == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip parse certificate verify\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n    /* Read the message without adding it to the checksum */\n    do {\n\n        if( ( ret = mbedtls_ssl_read_record_layer( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, ( \"mbedtls_ssl_read_record_layer\" ), ret );\n            return( ret );\n        }\n\n        ret = mbedtls_ssl_handle_message_type( ssl );\n\n    } while( MBEDTLS_ERR_SSL_NON_FATAL == ret );\n\n    if( 0 != ret )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, ( \"mbedtls_ssl_handle_message_type\" ), ret );\n        return( ret );\n    }\n\n    ssl->state++;\n\n    /* Process the message contents */\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||\n        ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE_VERIFY )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate verify message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );\n    }\n\n    i = mbedtls_ssl_hs_hdr_len( ssl );\n\n    /*\n     *  struct {\n     *     SignatureAndHashAlgorithm algorithm; -- TLS 1.2 only\n     *     opaque signature<0..2^16-1>;\n     *  } DigitallySigned;\n     */\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n    if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        md_alg = MBEDTLS_MD_NONE;\n        hashlen = 36;\n\n        /* For ECDSA, use SHA-1, not MD-5 + SHA-1 */\n        if( mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk,\n                        MBEDTLS_PK_ECDSA ) )\n        {\n            hash_start += 16;\n            hashlen -= 16;\n            md_alg = MBEDTLS_MD_SHA1;\n        }\n    }\n    else\n#endif /* MBEDTLS_SSL_PROTO_SSL3 || MBEDTLS_SSL_PROTO_TLS1 ||\n          MBEDTLS_SSL_PROTO_TLS1_1 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        if( i + 2 > ssl->in_hslen )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate verify message\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );\n        }\n\n        /*\n         * Hash\n         */\n        md_alg = mbedtls_ssl_md_alg_from_hash( ssl->in_msg[i] );\n\n        if( md_alg == MBEDTLS_MD_NONE || mbedtls_ssl_set_calc_verify_md( ssl, ssl->in_msg[i] ) )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"peer not adhering to requested sig_alg\"\n                                \" for verify message\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );\n        }\n\n#if !defined(MBEDTLS_MD_SHA1)\n        if( MBEDTLS_MD_SHA1 == md_alg )\n            hash_start += 16;\n#endif\n\n        /* Info from md_alg will be used instead */\n        hashlen = 0;\n\n        i++;\n\n        /*\n         * Signature\n         */\n        if( ( pk_alg = mbedtls_ssl_pk_alg_from_sig( ssl->in_msg[i] ) )\n                        == MBEDTLS_PK_NONE )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"peer not adhering to requested sig_alg\"\n                                \" for verify message\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );\n        }\n\n        /*\n         * Check the certificate's key type matches the signature alg\n         */\n        if( ! mbedtls_pk_can_do( &ssl->session_negotiate->peer_cert->pk, pk_alg ) )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"sig_alg doesn't match cert key\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );\n        }\n\n        i++;\n    }\n    else\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    if( i + 2 > ssl->in_hslen )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate verify message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );\n    }\n\n    sig_len = ( ssl->in_msg[i] << 8 ) | ssl->in_msg[i+1];\n    i += 2;\n\n    if( i + sig_len != ssl->in_hslen )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate verify message\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );\n    }\n\n    /* Calculate hash and verify signature */\n    ssl->handshake->calc_verify( ssl, hash );\n\n    if( ( ret = mbedtls_pk_verify( &ssl->session_negotiate->peer_cert->pk,\n                           md_alg, hash_start, hashlen,\n                           ssl->in_msg + i, sig_len ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_pk_verify\", ret );\n        return( ret );\n    }\n\n    mbedtls_ssl_update_handshake_status( ssl );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse certificate verify\" ) );\n\n    return( ret );\n}\n#endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED &&\n          !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\nstatic int ssl_write_new_session_ticket( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    size_t tlen;\n    uint32_t lifetime;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write new session ticket\" ) );\n\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_NEW_SESSION_TICKET;\n\n    /*\n     * struct {\n     *     uint32 ticket_lifetime_hint;\n     *     opaque ticket<0..2^16-1>;\n     * } NewSessionTicket;\n     *\n     * 4  .  7   ticket_lifetime_hint (0 = unspecified)\n     * 8  .  9   ticket_len (n)\n     * 10 .  9+n ticket content\n     */\n\n    if( ( ret = ssl->conf->f_ticket_write( ssl->conf->p_ticket,\n                                ssl->session_negotiate,\n                                ssl->out_msg + 10,\n                                ssl->out_msg + MBEDTLS_SSL_MAX_CONTENT_LEN,\n                                &tlen, &lifetime ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_ticket_write\", ret );\n        tlen = 0;\n    }\n\n    ssl->out_msg[4] = ( lifetime >> 24 ) & 0xFF;\n    ssl->out_msg[5] = ( lifetime >> 16 ) & 0xFF;\n    ssl->out_msg[6] = ( lifetime >>  8 ) & 0xFF;\n    ssl->out_msg[7] = ( lifetime       ) & 0xFF;\n\n    ssl->out_msg[8] = (unsigned char)( ( tlen >> 8 ) & 0xFF );\n    ssl->out_msg[9] = (unsigned char)( ( tlen      ) & 0xFF );\n\n    ssl->out_msglen = 10 + tlen;\n\n    /*\n     * Morally equivalent to updating ssl->state, but NewSessionTicket and\n     * ChangeCipherSpec share the same state.\n     */\n    ssl->handshake->new_session_ticket = 0;\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write new session ticket\" ) );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n/*\n * SSL handshake -- server side -- single step\n */\nint mbedtls_ssl_handshake_server_step( mbedtls_ssl_context *ssl )\n{\n    int ret = 0;\n\n    if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER || ssl->handshake == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"server state: %d\", ssl->state ) );\n\n    if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )\n        return( ret );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )\n    {\n        if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )\n            return( ret );\n    }\n#endif\n\n    switch( ssl->state )\n    {\n        case MBEDTLS_SSL_HELLO_REQUEST:\n            ssl->state = MBEDTLS_SSL_CLIENT_HELLO;\n            break;\n\n        /*\n         *  <==   ClientHello\n         */\n        case MBEDTLS_SSL_CLIENT_HELLO:\n            ret = ssl_parse_client_hello( ssl );\n            break;\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n        case MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT:\n            return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED );\n#endif\n\n        /*\n         *  ==>   ServerHello\n         *        Certificate\n         *      ( ServerKeyExchange  )\n         *      ( CertificateRequest )\n         *        ServerHelloDone\n         */\n        case MBEDTLS_SSL_SERVER_HELLO:\n            ret = ssl_write_server_hello( ssl );\n            break;\n\n        case MBEDTLS_SSL_SERVER_CERTIFICATE:\n            ret = mbedtls_ssl_write_certificate( ssl );\n            break;\n\n        case MBEDTLS_SSL_SERVER_KEY_EXCHANGE:\n            ret = ssl_write_server_key_exchange( ssl );\n            break;\n\n        case MBEDTLS_SSL_CERTIFICATE_REQUEST:\n            ret = ssl_write_certificate_request( ssl );\n            break;\n\n        case MBEDTLS_SSL_SERVER_HELLO_DONE:\n            ret = ssl_write_server_hello_done( ssl );\n            break;\n\n        /*\n         *  <== ( Certificate/Alert  )\n         *        ClientKeyExchange\n         *      ( CertificateVerify  )\n         *        ChangeCipherSpec\n         *        Finished\n         */\n        case MBEDTLS_SSL_CLIENT_CERTIFICATE:\n            ret = mbedtls_ssl_parse_certificate( ssl );\n            break;\n\n        case MBEDTLS_SSL_CLIENT_KEY_EXCHANGE:\n            ret = ssl_parse_client_key_exchange( ssl );\n            break;\n\n        case MBEDTLS_SSL_CERTIFICATE_VERIFY:\n            ret = ssl_parse_certificate_verify( ssl );\n            break;\n\n        case MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC:\n            ret = mbedtls_ssl_parse_change_cipher_spec( ssl );\n            break;\n\n        case MBEDTLS_SSL_CLIENT_FINISHED:\n            ret = mbedtls_ssl_parse_finished( ssl );\n            break;\n\n        /*\n         *  ==> ( NewSessionTicket )\n         *        ChangeCipherSpec\n         *        Finished\n         */\n        case MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC:\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n            if( ssl->handshake->new_session_ticket != 0 )\n                ret = ssl_write_new_session_ticket( ssl );\n            else\n#endif\n                ret = mbedtls_ssl_write_change_cipher_spec( ssl );\n            break;\n\n        case MBEDTLS_SSL_SERVER_FINISHED:\n            ret = mbedtls_ssl_write_finished( ssl );\n            break;\n\n        case MBEDTLS_SSL_FLUSH_BUFFERS:\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"handshake: done\" ) );\n            ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;\n            break;\n\n        case MBEDTLS_SSL_HANDSHAKE_WRAPUP:\n            mbedtls_ssl_handshake_wrapup( ssl );\n            break;\n\n        default:\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"invalid state %d\", ssl->state ) );\n            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    return( ret );\n}\n#endif /* MBEDTLS_SSL_SRV_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ssl_ticket.c",
    "content": "/*\n *  TLS server tickets callbacks implementation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SSL_TICKET_C)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free      free\n#endif\n\n#include \"mbedtls/ssl_ticket.h\"\n\n#include <string.h>\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * Initialze context\n */\nvoid mbedtls_ssl_ticket_init( mbedtls_ssl_ticket_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_ssl_ticket_context ) );\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_init( &ctx->mutex );\n#endif\n}\n\n#define MAX_KEY_BYTES 32    /* 256 bits */\n\n/*\n * Generate/update a key\n */\nstatic int ssl_ticket_gen_key( mbedtls_ssl_ticket_context *ctx,\n                               unsigned char index )\n{\n    int ret;\n    unsigned char buf[MAX_KEY_BYTES];\n    mbedtls_ssl_ticket_key *key = ctx->keys + index;\n\n#if defined(MBEDTLS_HAVE_TIME)\n    key->generation_time = (uint32_t) mbedtls_time( NULL );\n#endif\n\n    if( ( ret = ctx->f_rng( ctx->p_rng, key->name, sizeof( key->name ) ) ) != 0 )\n        return( ret );\n\n    if( ( ret = ctx->f_rng( ctx->p_rng, buf, sizeof( buf ) ) ) != 0 )\n        return( ret );\n\n    /* With GCM and CCM, same context can encrypt & decrypt */\n    ret = mbedtls_cipher_setkey( &key->ctx, buf,\n                                 mbedtls_cipher_get_key_bitlen( &key->ctx ),\n                                 MBEDTLS_ENCRYPT );\n\n    mbedtls_zeroize( buf, sizeof( buf ) );\n\n    return( ret );\n}\n\n/*\n * Rotate/generate keys if necessary\n */\nstatic int ssl_ticket_update_keys( mbedtls_ssl_ticket_context *ctx )\n{\n#if !defined(MBEDTLS_HAVE_TIME)\n    ((void) ctx);\n#else\n    if( ctx->ticket_lifetime != 0 )\n    {\n        uint32_t current_time = (uint32_t) mbedtls_time( NULL );\n        uint32_t key_time = ctx->keys[ctx->active].generation_time;\n\n        if( current_time > key_time &&\n            current_time - key_time < ctx->ticket_lifetime )\n        {\n            return( 0 );\n        }\n\n        ctx->active = 1 - ctx->active;\n\n        return( ssl_ticket_gen_key( ctx, ctx->active ) );\n    }\n    else\n#endif /* MBEDTLS_HAVE_TIME */\n        return( 0 );\n}\n\n/*\n * Setup context for actual use\n */\nint mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx,\n    int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,\n    mbedtls_cipher_type_t cipher,\n    uint32_t lifetime )\n{\n    int ret;\n    const mbedtls_cipher_info_t *cipher_info;\n\n    ctx->f_rng = f_rng;\n    ctx->p_rng = p_rng;\n\n    ctx->ticket_lifetime = lifetime;\n\n    cipher_info = mbedtls_cipher_info_from_type( cipher);\n    if( cipher_info == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    if( cipher_info->mode != MBEDTLS_MODE_GCM &&\n        cipher_info->mode != MBEDTLS_MODE_CCM )\n    {\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    if( cipher_info->key_bitlen > 8 * MAX_KEY_BYTES )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_cipher_setup( &ctx->keys[0].ctx, cipher_info ) ) != 0 ||\n        ( ret = mbedtls_cipher_setup( &ctx->keys[1].ctx, cipher_info ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    if( ( ret = ssl_ticket_gen_key( ctx, 0 ) ) != 0 ||\n        ( ret = ssl_ticket_gen_key( ctx, 1 ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    return( 0 );\n}\n\n/*\n * Serialize a session in the following format:\n *  0   .   n-1     session structure, n = sizeof(mbedtls_ssl_session)\n *  n   .   n+2     peer_cert length = m (0 if no certificate)\n *  n+3 .   n+2+m   peer cert ASN.1\n */\nstatic int ssl_save_session( const mbedtls_ssl_session *session,\n                             unsigned char *buf, size_t buf_len,\n                             size_t *olen )\n{\n    unsigned char *p = buf;\n    size_t left = buf_len;\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    size_t cert_len;\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n    if( left < sizeof( mbedtls_ssl_session ) )\n        return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );\n\n    memcpy( p, session, sizeof( mbedtls_ssl_session ) );\n    p += sizeof( mbedtls_ssl_session );\n    left -= sizeof( mbedtls_ssl_session );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    if( session->peer_cert == NULL )\n        cert_len = 0;\n    else\n        cert_len = session->peer_cert->raw.len;\n\n    if( left < 3 + cert_len )\n        return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );\n\n    *p++ = (unsigned char)( cert_len >> 16 & 0xFF );\n    *p++ = (unsigned char)( cert_len >>  8 & 0xFF );\n    *p++ = (unsigned char)( cert_len       & 0xFF );\n\n    if( session->peer_cert != NULL )\n        memcpy( p, session->peer_cert->raw.p, cert_len );\n\n    p += cert_len;\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n    *olen = p - buf;\n\n    return( 0 );\n}\n\n/*\n * Unserialise session, see ssl_save_session()\n */\nstatic int ssl_load_session( mbedtls_ssl_session *session,\n                             const unsigned char *buf, size_t len )\n{\n    const unsigned char *p = buf;\n    const unsigned char * const end = buf + len;\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    size_t cert_len;\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n    if( p + sizeof( mbedtls_ssl_session ) > end )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    memcpy( session, p, sizeof( mbedtls_ssl_session ) );\n    p += sizeof( mbedtls_ssl_session );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    if( p + 3 > end )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    cert_len = ( p[0] << 16 ) | ( p[1] << 8 ) | p[2];\n    p += 3;\n\n    if( cert_len == 0 )\n    {\n        session->peer_cert = NULL;\n    }\n    else\n    {\n        int ret;\n\n        if( p + cert_len > end )\n            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n        session->peer_cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );\n\n        if( session->peer_cert == NULL )\n            return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n\n        mbedtls_x509_crt_init( session->peer_cert );\n\n        if( ( ret = mbedtls_x509_crt_parse_der( session->peer_cert,\n                                        p, cert_len ) ) != 0 )\n        {\n            mbedtls_x509_crt_free( session->peer_cert );\n            mbedtls_free( session->peer_cert );\n            session->peer_cert = NULL;\n            return( ret );\n        }\n\n        p += cert_len;\n    }\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n    if( p != end )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    return( 0 );\n}\n\n/*\n * Create session ticket, with the following structure:\n *\n *    struct {\n *        opaque key_name[4];\n *        opaque iv[12];\n *        opaque encrypted_state<0..2^16-1>;\n *        opaque tag[16];\n *    } ticket;\n *\n * The key_name, iv, and length of encrypted_state are the additional\n * authenticated data.\n */\nint mbedtls_ssl_ticket_write( void *p_ticket,\n                              const mbedtls_ssl_session *session,\n                              unsigned char *start,\n                              const unsigned char *end,\n                              size_t *tlen,\n                              uint32_t *ticket_lifetime )\n{\n    int ret;\n    mbedtls_ssl_ticket_context *ctx = p_ticket;\n    mbedtls_ssl_ticket_key *key;\n    unsigned char *key_name = start;\n    unsigned char *iv = start + 4;\n    unsigned char *state_len_bytes = iv + 12;\n    unsigned char *state = state_len_bytes + 2;\n    unsigned char *tag;\n    size_t clear_len, ciph_len;\n\n    *tlen = 0;\n\n    if( ctx == NULL || ctx->f_rng == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    /* We need at least 4 bytes for key_name, 12 for IV, 2 for len 16 for tag,\n     * in addition to session itself, that will be checked when writing it. */\n    if( end - start < 4 + 12 + 2 + 16 )\n        return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    if( ( ret = ssl_ticket_update_keys( ctx ) ) != 0 )\n        goto cleanup;\n\n    key = &ctx->keys[ctx->active];\n\n    *ticket_lifetime = ctx->ticket_lifetime;\n\n    memcpy( key_name, key->name, 4 );\n\n    if( ( ret = ctx->f_rng( ctx->p_rng, iv, 12 ) ) != 0 )\n        goto cleanup;\n\n    /* Dump session state */\n    if( ( ret = ssl_save_session( session,\n                                  state, end - state, &clear_len ) ) != 0 ||\n        (unsigned long) clear_len > 65535 )\n    {\n         goto cleanup;\n    }\n    state_len_bytes[0] = ( clear_len >> 8 ) & 0xff;\n    state_len_bytes[1] = ( clear_len      ) & 0xff;\n\n    /* Encrypt and authenticate */\n    tag = state + clear_len;\n    if( ( ret = mbedtls_cipher_auth_encrypt( &key->ctx,\n                    iv, 12, key_name, 4 + 12 + 2,\n                    state, clear_len, state, &ciph_len, tag, 16 ) ) != 0 )\n    {\n        goto cleanup;\n    }\n    if( ciph_len != clear_len )\n    {\n        ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;\n        goto cleanup;\n    }\n\n    *tlen = 4 + 12 + 2 + 16 + ciph_len;\n\ncleanup:\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    return( ret );\n}\n\n/*\n * Select key based on name\n */\nstatic mbedtls_ssl_ticket_key *ssl_ticket_select_key(\n        mbedtls_ssl_ticket_context *ctx,\n        const unsigned char name[4] )\n{\n    unsigned char i;\n\n    for( i = 0; i < sizeof( ctx->keys ) / sizeof( *ctx->keys ); i++ )\n        if( memcmp( name, ctx->keys[i].name, 4 ) == 0 )\n            return( &ctx->keys[i] );\n\n    return( NULL );\n}\n\n/*\n * Load session ticket (see mbedtls_ssl_ticket_write for structure)\n */\nint mbedtls_ssl_ticket_parse( void *p_ticket,\n                              mbedtls_ssl_session *session,\n                              unsigned char *buf,\n                              size_t len )\n{\n    int ret;\n    mbedtls_ssl_ticket_context *ctx = p_ticket;\n    mbedtls_ssl_ticket_key *key;\n    unsigned char *key_name = buf;\n    unsigned char *iv = buf + 4;\n    unsigned char *enc_len_p = iv + 12;\n    unsigned char *ticket = enc_len_p + 2;\n    unsigned char *tag;\n    size_t enc_len, clear_len;\n\n    if( ctx == NULL || ctx->f_rng == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    /* See mbedtls_ssl_ticket_write() */\n    if( len < 4 + 12 + 2 + 16 )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &ctx->mutex ) ) != 0 )\n        return( ret );\n#endif\n\n    if( ( ret = ssl_ticket_update_keys( ctx ) ) != 0 )\n        goto cleanup;\n\n    enc_len = ( enc_len_p[0] << 8 ) | enc_len_p[1];\n    tag = ticket + enc_len;\n\n    if( len != 4 + 12 + 2 + enc_len + 16 )\n    {\n        ret = MBEDTLS_ERR_SSL_BAD_INPUT_DATA;\n        goto cleanup;\n    }\n\n    /* Select key */\n    if( ( key = ssl_ticket_select_key( ctx, key_name ) ) == NULL )\n    {\n        /* We can't know for sure but this is a likely option unless we're\n         * under attack - this is only informative anyway */\n        ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED;\n        goto cleanup;\n    }\n\n    /* Decrypt and authenticate */\n    if( ( ret = mbedtls_cipher_auth_decrypt( &key->ctx, iv, 12,\n                    key_name, 4 + 12 + 2, ticket, enc_len,\n                    ticket, &clear_len, tag, 16 ) ) != 0 )\n    {\n        if( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED )\n            ret = MBEDTLS_ERR_SSL_INVALID_MAC;\n\n        goto cleanup;\n    }\n    if( clear_len != enc_len )\n    {\n        ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;\n        goto cleanup;\n    }\n\n    /* Actually load session */\n    if( ( ret = ssl_load_session( session, ticket, clear_len ) ) != 0 )\n        goto cleanup;\n\n#if defined(MBEDTLS_HAVE_TIME)\n    {\n        /* Check for expiration */\n        mbedtls_time_t current_time = mbedtls_time( NULL );\n\n        if( current_time < session->start ||\n            (uint32_t)( current_time - session->start ) > ctx->ticket_lifetime )\n        {\n            ret = MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED;\n            goto cleanup;\n        }\n    }\n#endif\n\ncleanup:\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &ctx->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    return( ret );\n}\n\n/*\n * Free context\n */\nvoid mbedtls_ssl_ticket_free( mbedtls_ssl_ticket_context *ctx )\n{\n    mbedtls_cipher_free( &ctx->keys[0].ctx );\n    mbedtls_cipher_free( &ctx->keys[1].ctx );\n\n#if defined(MBEDTLS_THREADING_C)\n    mbedtls_mutex_free( &ctx->mutex );\n#endif\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_ssl_ticket_context ) );\n}\n\n#endif /* MBEDTLS_SSL_TICKET_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/ssl_tls.c",
    "content": "/*\n *  SSLv3/TLSv1 shared functions\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The SSL 3.0 specification was drafted by Netscape in 1996,\n *  and became an IETF standard in 1999.\n *\n *  http://wp.netscape.com/eng/ssl3/\n *  http://www.ietf.org/rfc/rfc2246.txt\n *  http://www.ietf.org/rfc/rfc4346.txt\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SSL_TLS_C)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_calloc    calloc\n#define mbedtls_free      free\n#endif\n\n#include \"mbedtls/debug.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/ssl_internal.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n#include \"mbedtls/oid.h\"\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/* Length of the \"epoch\" field in the record header */\nstatic inline size_t ssl_ep_len( const mbedtls_ssl_context *ssl )\n{\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        return( 2 );\n#else\n    ((void) ssl);\n#endif\n    return( 0 );\n}\n\n/*\n * Start a timer.\n * Passing millisecs = 0 cancels a running timer.\n */\nstatic void ssl_set_timer( mbedtls_ssl_context *ssl, uint32_t millisecs )\n{\n    if( ssl->f_set_timer == NULL )\n        return;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"set_timer to %d ms\", (int) millisecs ) );\n    ssl->f_set_timer( ssl->p_timer, millisecs / 4, millisecs );\n}\n\n/*\n * Return -1 is timer is expired, 0 if it isn't.\n */\nstatic int ssl_check_timer( mbedtls_ssl_context *ssl )\n{\n    if( ssl->f_get_timer == NULL )\n        return( 0 );\n\n    if( ssl->f_get_timer( ssl->p_timer ) == 2 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"timer expired\" ) );\n        return( -1 );\n    }\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n/*\n * Double the retransmit timeout value, within the allowed range,\n * returning -1 if the maximum value has already been reached.\n */\nstatic int ssl_double_retransmit_timeout( mbedtls_ssl_context *ssl )\n{\n    uint32_t new_timeout;\n\n    if( ssl->handshake->retransmit_timeout >= ssl->conf->hs_timeout_max )\n        return( -1 );\n\n    new_timeout = 2 * ssl->handshake->retransmit_timeout;\n\n    /* Avoid arithmetic overflow and range overflow */\n    if( new_timeout < ssl->handshake->retransmit_timeout ||\n        new_timeout > ssl->conf->hs_timeout_max )\n    {\n        new_timeout = ssl->conf->hs_timeout_max;\n    }\n\n    ssl->handshake->retransmit_timeout = new_timeout;\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"update timeout value to %d millisecs\",\n                        ssl->handshake->retransmit_timeout ) );\n\n    return( 0 );\n}\n\nstatic void ssl_reset_retransmit_timeout( mbedtls_ssl_context *ssl )\n{\n    ssl->handshake->retransmit_timeout = ssl->conf->hs_timeout_min;\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"update timeout value to %d millisecs\",\n                        ssl->handshake->retransmit_timeout ) );\n}\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n/*\n * Convert max_fragment_length codes to length.\n * RFC 6066 says:\n *    enum{\n *        2^9(1), 2^10(2), 2^11(3), 2^12(4), (255)\n *    } MaxFragmentLength;\n * and we add 0 -> extension unused\n */\nstatic unsigned int mfl_code_to_length[MBEDTLS_SSL_MAX_FRAG_LEN_INVALID] =\n{\n    MBEDTLS_SSL_MAX_CONTENT_LEN,    /* MBEDTLS_SSL_MAX_FRAG_LEN_NONE */\n    512,                    /* MBEDTLS_SSL_MAX_FRAG_LEN_512  */\n    1024,                   /* MBEDTLS_SSL_MAX_FRAG_LEN_1024 */\n    2048,                   /* MBEDTLS_SSL_MAX_FRAG_LEN_2048 */\n    4096,                   /* MBEDTLS_SSL_MAX_FRAG_LEN_4096 */\n};\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_CLI_C)\nstatic int ssl_session_copy( mbedtls_ssl_session *dst, const mbedtls_ssl_session *src )\n{\n    mbedtls_ssl_session_free( dst );\n    memcpy( dst, src, sizeof( mbedtls_ssl_session ) );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    if( src->peer_cert != NULL )\n    {\n        int ret;\n\n        dst->peer_cert = mbedtls_calloc( 1, sizeof(mbedtls_x509_crt) );\n        if( dst->peer_cert == NULL )\n            return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n\n        mbedtls_x509_crt_init( dst->peer_cert );\n\n        if( ( ret = mbedtls_x509_crt_parse_der( dst->peer_cert, src->peer_cert->raw.p,\n                                        src->peer_cert->raw.len ) ) != 0 )\n        {\n            mbedtls_free( dst->peer_cert );\n            dst->peer_cert = NULL;\n            return( ret );\n        }\n    }\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)\n    if( src->ticket != NULL )\n    {\n        dst->ticket = mbedtls_calloc( 1, src->ticket_len );\n        if( dst->ticket == NULL )\n            return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n\n        memcpy( dst->ticket, src->ticket, src->ticket_len );\n    }\n#endif /* MBEDTLS_SSL_SESSION_TICKETS && MBEDTLS_SSL_CLI_C */\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_CLI_C */\n\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\nint (*mbedtls_ssl_hw_record_init)( mbedtls_ssl_context *ssl,\n                     const unsigned char *key_enc, const unsigned char *key_dec,\n                     size_t keylen,\n                     const unsigned char *iv_enc,  const unsigned char *iv_dec,\n                     size_t ivlen,\n                     const unsigned char *mac_enc, const unsigned char *mac_dec,\n                     size_t maclen ) = NULL;\nint (*mbedtls_ssl_hw_record_activate)( mbedtls_ssl_context *ssl, int direction) = NULL;\nint (*mbedtls_ssl_hw_record_reset)( mbedtls_ssl_context *ssl ) = NULL;\nint (*mbedtls_ssl_hw_record_write)( mbedtls_ssl_context *ssl ) = NULL;\nint (*mbedtls_ssl_hw_record_read)( mbedtls_ssl_context *ssl ) = NULL;\nint (*mbedtls_ssl_hw_record_finish)( mbedtls_ssl_context *ssl ) = NULL;\n#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */\n\n/*\n * Key material generation\n */\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\nstatic int ssl3_prf( const unsigned char *secret, size_t slen,\n                     const char *label,\n                     const unsigned char *random, size_t rlen,\n                     unsigned char *dstbuf, size_t dlen )\n{\n    size_t i;\n    mbedtls_md5_context md5;\n    mbedtls_sha1_context sha1;\n    unsigned char padding[16];\n    unsigned char sha1sum[20];\n    ((void)label);\n\n    mbedtls_md5_init(  &md5  );\n    mbedtls_sha1_init( &sha1 );\n\n    /*\n     *  SSLv3:\n     *    block =\n     *      MD5( secret + SHA1( 'A'    + secret + random ) ) +\n     *      MD5( secret + SHA1( 'BB'   + secret + random ) ) +\n     *      MD5( secret + SHA1( 'CCC'  + secret + random ) ) +\n     *      ...\n     */\n    for( i = 0; i < dlen / 16; i++ )\n    {\n        memset( padding, (unsigned char) ('A' + i), 1 + i );\n\n        mbedtls_sha1_starts( &sha1 );\n        mbedtls_sha1_update( &sha1, padding, 1 + i );\n        mbedtls_sha1_update( &sha1, secret, slen );\n        mbedtls_sha1_update( &sha1, random, rlen );\n        mbedtls_sha1_finish( &sha1, sha1sum );\n\n        mbedtls_md5_starts( &md5 );\n        mbedtls_md5_update( &md5, secret, slen );\n        mbedtls_md5_update( &md5, sha1sum, 20 );\n        mbedtls_md5_finish( &md5, dstbuf + i * 16 );\n    }\n\n    mbedtls_md5_free(  &md5  );\n    mbedtls_sha1_free( &sha1 );\n\n    mbedtls_zeroize( padding, sizeof( padding ) );\n    mbedtls_zeroize( sha1sum, sizeof( sha1sum ) );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)\nstatic int tls1_prf( const unsigned char *secret, size_t slen,\n                     const char *label,\n                     const unsigned char *random, size_t rlen,\n                     unsigned char *dstbuf, size_t dlen )\n{\n    size_t nb, hs;\n    size_t i, j, k;\n    const unsigned char *S1, *S2;\n    unsigned char tmp[128];\n    unsigned char h_i[20];\n    const mbedtls_md_info_t *md_info;\n    mbedtls_md_context_t md_ctx;\n    int ret;\n\n    mbedtls_md_init( &md_ctx );\n\n    if( sizeof( tmp ) < 20 + strlen( label ) + rlen )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    hs = ( slen + 1 ) / 2;\n    S1 = secret;\n    S2 = secret + slen - hs;\n\n    nb = strlen( label );\n    memcpy( tmp + 20, label, nb );\n    memcpy( tmp + 20 + nb, random, rlen );\n    nb += rlen;\n\n    /*\n     * First compute P_md5(secret,label+random)[0..dlen]\n     */\n    if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_MD5 ) ) == NULL )\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n\n    if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )\n        return( ret );\n\n    mbedtls_md_hmac_starts( &md_ctx, S1, hs );\n    mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );\n    mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );\n\n    for( i = 0; i < dlen; i += 16 )\n    {\n        mbedtls_md_hmac_reset ( &md_ctx );\n        mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 + nb );\n        mbedtls_md_hmac_finish( &md_ctx, h_i );\n\n        mbedtls_md_hmac_reset ( &md_ctx );\n        mbedtls_md_hmac_update( &md_ctx, 4 + tmp, 16 );\n        mbedtls_md_hmac_finish( &md_ctx, 4 + tmp );\n\n        k = ( i + 16 > dlen ) ? dlen % 16 : 16;\n\n        for( j = 0; j < k; j++ )\n            dstbuf[i + j]  = h_i[j];\n    }\n\n    mbedtls_md_free( &md_ctx );\n\n    /*\n     * XOR out with P_sha1(secret,label+random)[0..dlen]\n     */\n    if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL )\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n\n    if( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )\n        return( ret );\n\n    mbedtls_md_hmac_starts( &md_ctx, S2, hs );\n    mbedtls_md_hmac_update( &md_ctx, tmp + 20, nb );\n    mbedtls_md_hmac_finish( &md_ctx, tmp );\n\n    for( i = 0; i < dlen; i += 20 )\n    {\n        mbedtls_md_hmac_reset ( &md_ctx );\n        mbedtls_md_hmac_update( &md_ctx, tmp, 20 + nb );\n        mbedtls_md_hmac_finish( &md_ctx, h_i );\n\n        mbedtls_md_hmac_reset ( &md_ctx );\n        mbedtls_md_hmac_update( &md_ctx, tmp, 20 );\n        mbedtls_md_hmac_finish( &md_ctx, tmp );\n\n        k = ( i + 20 > dlen ) ? dlen % 20 : 20;\n\n        for( j = 0; j < k; j++ )\n            dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );\n    }\n\n    mbedtls_md_free( &md_ctx );\n\n    mbedtls_zeroize( tmp, sizeof( tmp ) );\n    mbedtls_zeroize( h_i, sizeof( h_i ) );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_PROTO_TLS1) || MBEDTLS_SSL_PROTO_TLS1_1 */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\nstatic int tls_prf_generic( mbedtls_md_type_t md_type,\n                            const unsigned char *secret, size_t slen,\n                            const char *label,\n                            const unsigned char *random, size_t rlen,\n                            unsigned char *dstbuf, size_t dlen )\n{\n    size_t nb;\n    size_t i, j, k, md_len;\n    unsigned char tmp[128];\n    unsigned char h_i[MBEDTLS_MD_MAX_SIZE];\n    const mbedtls_md_info_t *md_info;\n    mbedtls_md_context_t md_ctx;\n    int ret;\n\n    mbedtls_md_init( &md_ctx );\n\n    if( ( md_info = mbedtls_md_info_from_type( md_type ) ) == NULL )\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n\n    md_len = mbedtls_md_get_size( md_info );\n\n    if( sizeof( tmp ) < md_len + strlen( label ) + rlen )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    nb = strlen( label );\n    memcpy( tmp + md_len, label, nb );\n    memcpy( tmp + md_len + nb, random, rlen );\n    nb += rlen;\n\n    /*\n     * Compute P_<hash>(secret, label + random)[0..dlen]\n     */\n    if ( ( ret = mbedtls_md_setup( &md_ctx, md_info, 1 ) ) != 0 )\n        return( ret );\n\n    mbedtls_md_hmac_starts( &md_ctx, secret, slen );\n    mbedtls_md_hmac_update( &md_ctx, tmp + md_len, nb );\n    mbedtls_md_hmac_finish( &md_ctx, tmp );\n\n    for( i = 0; i < dlen; i += md_len )\n    {\n        mbedtls_md_hmac_reset ( &md_ctx );\n        mbedtls_md_hmac_update( &md_ctx, tmp, md_len + nb );\n        mbedtls_md_hmac_finish( &md_ctx, h_i );\n\n        mbedtls_md_hmac_reset ( &md_ctx );\n        mbedtls_md_hmac_update( &md_ctx, tmp, md_len );\n        mbedtls_md_hmac_finish( &md_ctx, tmp );\n\n        k = ( i + md_len > dlen ) ? dlen % md_len : md_len;\n\n        for( j = 0; j < k; j++ )\n            dstbuf[i + j]  = h_i[j];\n    }\n\n    mbedtls_md_free( &md_ctx );\n\n    mbedtls_zeroize( tmp, sizeof( tmp ) );\n    mbedtls_zeroize( h_i, sizeof( h_i ) );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SHA256_C)\nstatic int tls_prf_sha256( const unsigned char *secret, size_t slen,\n                           const char *label,\n                           const unsigned char *random, size_t rlen,\n                           unsigned char *dstbuf, size_t dlen )\n{\n    return( tls_prf_generic( MBEDTLS_MD_SHA256, secret, slen,\n                             label, random, rlen, dstbuf, dlen ) );\n}\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\nstatic int tls_prf_sha384( const unsigned char *secret, size_t slen,\n                           const char *label,\n                           const unsigned char *random, size_t rlen,\n                           unsigned char *dstbuf, size_t dlen )\n{\n    return( tls_prf_generic( MBEDTLS_MD_SHA384, secret, slen,\n                             label, random, rlen, dstbuf, dlen ) );\n}\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\nstatic void ssl_update_checksum_start( mbedtls_ssl_context *, const unsigned char *, size_t );\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\nstatic void ssl_update_checksum_md5sha1( mbedtls_ssl_context *, const unsigned char *, size_t );\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\nstatic void ssl_calc_verify_ssl( mbedtls_ssl_context *, unsigned char * );\nstatic void ssl_calc_finished_ssl( mbedtls_ssl_context *, unsigned char *, int );\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)\nstatic void ssl_calc_verify_tls( mbedtls_ssl_context *, unsigned char * );\nstatic void ssl_calc_finished_tls( mbedtls_ssl_context *, unsigned char *, int );\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA256_C)\nstatic void ssl_update_checksum_sha256( mbedtls_ssl_context *, const unsigned char *, size_t );\nstatic void ssl_calc_verify_tls_sha256( mbedtls_ssl_context *,unsigned char * );\nstatic void ssl_calc_finished_tls_sha256( mbedtls_ssl_context *,unsigned char *, int );\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\nstatic void ssl_update_checksum_sha384( mbedtls_ssl_context *, const unsigned char *, size_t );\nstatic void ssl_calc_verify_tls_sha384( mbedtls_ssl_context *, unsigned char * );\nstatic void ssl_calc_finished_tls_sha384( mbedtls_ssl_context *, unsigned char *, int );\n#endif\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\nint mbedtls_ssl_derive_keys( mbedtls_ssl_context *ssl )\n{\n    int ret = 0;\n    unsigned char tmp[64];\n    unsigned char keyblk[256];\n    unsigned char *key1;\n    unsigned char *key2;\n    unsigned char *mac_enc;\n    unsigned char *mac_dec;\n    size_t iv_copy_len;\n    const mbedtls_cipher_info_t *cipher_info;\n    const mbedtls_md_info_t *md_info;\n\n    mbedtls_ssl_session *session = ssl->session_negotiate;\n    mbedtls_ssl_transform *transform = ssl->transform_negotiate;\n    mbedtls_ssl_handshake_params *handshake = ssl->handshake;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> derive keys\" ) );\n\n    cipher_info = mbedtls_cipher_info_from_type( transform->ciphersuite_info->cipher );\n    if( cipher_info == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"cipher info for %d not found\",\n                            transform->ciphersuite_info->cipher ) );\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    md_info = mbedtls_md_info_from_type( transform->ciphersuite_info->mac );\n    if( md_info == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"mbedtls_md info for %d not found\",\n                            transform->ciphersuite_info->mac ) );\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    /*\n     * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions\n     */\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        handshake->tls_prf = ssl3_prf;\n        handshake->calc_verify = ssl_calc_verify_ssl;\n        handshake->calc_finished = ssl_calc_finished_ssl;\n    }\n    else\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)\n    if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        handshake->tls_prf = tls1_prf;\n        handshake->calc_verify = ssl_calc_verify_tls;\n        handshake->calc_finished = ssl_calc_finished_tls;\n    }\n    else\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA512_C)\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 &&\n        transform->ciphersuite_info->mac == MBEDTLS_MD_SHA384 )\n    {\n        handshake->tls_prf = tls_prf_sha384;\n        handshake->calc_verify = ssl_calc_verify_tls_sha384;\n        handshake->calc_finished = ssl_calc_finished_tls_sha384;\n    }\n    else\n#endif\n#if defined(MBEDTLS_SHA256_C)\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n    {\n        handshake->tls_prf = tls_prf_sha256;\n        handshake->calc_verify = ssl_calc_verify_tls_sha256;\n        handshake->calc_finished = ssl_calc_finished_tls_sha256;\n    }\n    else\n#endif\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    /*\n     * SSLv3:\n     *   master =\n     *     MD5( premaster + SHA1( 'A'   + premaster + randbytes ) ) +\n     *     MD5( premaster + SHA1( 'BB'  + premaster + randbytes ) ) +\n     *     MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )\n     *\n     * TLSv1+:\n     *   master = PRF( premaster, \"master secret\", randbytes )[0..47]\n     */\n    if( handshake->resume == 0 )\n    {\n        MBEDTLS_SSL_DEBUG_BUF( 3, \"premaster secret\", handshake->premaster,\n                       handshake->pmslen );\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n        if( ssl->handshake->extended_ms == MBEDTLS_SSL_EXTENDED_MS_ENABLED )\n        {\n            unsigned char session_hash[48];\n            size_t hash_len;\n\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"using extended master secret\" ) );\n\n            ssl->handshake->calc_verify( ssl, session_hash );\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n            if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n            {\n#if defined(MBEDTLS_SHA512_C)\n                if( ssl->transform_negotiate->ciphersuite_info->mac ==\n                    MBEDTLS_MD_SHA384 )\n                {\n                    hash_len = 48;\n                }\n                else\n#endif\n                    hash_len = 32;\n            }\n            else\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n                hash_len = 36;\n\n            MBEDTLS_SSL_DEBUG_BUF( 3, \"session hash\", session_hash, hash_len );\n\n            ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,\n                                      \"extended master secret\",\n                                      session_hash, hash_len,\n                                      session->master, 48 );\n            if( ret != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, \"prf\", ret );\n                return( ret );\n            }\n\n        }\n        else\n#endif\n        ret = handshake->tls_prf( handshake->premaster, handshake->pmslen,\n                                  \"master secret\",\n                                  handshake->randbytes, 64,\n                                  session->master, 48 );\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"prf\", ret );\n            return( ret );\n        }\n\n        mbedtls_zeroize( handshake->premaster, sizeof(handshake->premaster) );\n    }\n    else\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"no premaster (session resumed)\" ) );\n\n    /*\n     * Swap the client and server random values.\n     */\n    memcpy( tmp, handshake->randbytes, 64 );\n    memcpy( handshake->randbytes, tmp + 32, 32 );\n    memcpy( handshake->randbytes + 32, tmp, 32 );\n    mbedtls_zeroize( tmp, sizeof( tmp ) );\n\n    /*\n     *  SSLv3:\n     *    key block =\n     *      MD5( master + SHA1( 'A'    + master + randbytes ) ) +\n     *      MD5( master + SHA1( 'BB'   + master + randbytes ) ) +\n     *      MD5( master + SHA1( 'CCC'  + master + randbytes ) ) +\n     *      MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +\n     *      ...\n     *\n     *  TLSv1:\n     *    key block = PRF( master, \"key expansion\", randbytes )\n     */\n    ret = handshake->tls_prf( session->master, 48, \"key expansion\",\n                              handshake->randbytes, 64, keyblk, 256 );\n    if( ret != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"prf\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"ciphersuite = %s\",\n                   mbedtls_ssl_get_ciphersuite_name( session->ciphersuite ) ) );\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"master secret\", session->master, 48 );\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"random bytes\", handshake->randbytes, 64 );\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"key block\", keyblk, 256 );\n\n    mbedtls_zeroize( handshake->randbytes, sizeof( handshake->randbytes ) );\n\n    /*\n     * Determine the appropriate key, IV and MAC length.\n     */\n\n    transform->keylen = cipher_info->key_bitlen / 8;\n\n    if( cipher_info->mode == MBEDTLS_MODE_GCM ||\n        cipher_info->mode == MBEDTLS_MODE_CCM )\n    {\n        transform->maclen = 0;\n\n        transform->ivlen = 12;\n        transform->fixed_ivlen = 4;\n\n        /* Minimum length is expicit IV + tag */\n        transform->minlen = transform->ivlen - transform->fixed_ivlen\n                            + ( transform->ciphersuite_info->flags &\n                                MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16 );\n    }\n    else\n    {\n        /* Initialize HMAC contexts */\n        if( ( ret = mbedtls_md_setup( &transform->md_ctx_enc, md_info, 1 ) ) != 0 ||\n            ( ret = mbedtls_md_setup( &transform->md_ctx_dec, md_info, 1 ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_md_setup\", ret );\n            return( ret );\n        }\n\n        /* Get MAC length */\n        transform->maclen = mbedtls_md_get_size( md_info );\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n        /*\n         * If HMAC is to be truncated, we shall keep the leftmost bytes,\n         * (rfc 6066 page 13 or rfc 2104 section 4),\n         * so we only need to adjust the length here.\n         */\n        if( session->trunc_hmac == MBEDTLS_SSL_TRUNC_HMAC_ENABLED )\n            transform->maclen = MBEDTLS_SSL_TRUNCATED_HMAC_LEN;\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n        /* IV length */\n        transform->ivlen = cipher_info->iv_size;\n\n        /* Minimum length */\n        if( cipher_info->mode == MBEDTLS_MODE_STREAM )\n            transform->minlen = transform->maclen;\n        else\n        {\n            /*\n             * GenericBlockCipher:\n             * 1. if EtM is in use: one block plus MAC\n             *    otherwise: * first multiple of blocklen greater than maclen\n             * 2. IV except for SSL3 and TLS 1.0\n             */\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n            if( session->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED )\n            {\n                transform->minlen = transform->maclen\n                                  + cipher_info->block_size;\n            }\n            else\n#endif\n            {\n                transform->minlen = transform->maclen\n                                  + cipher_info->block_size\n                                  - transform->maclen % cipher_info->block_size;\n            }\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)\n            if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ||\n                ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_1 )\n                ; /* No need to adjust minlen */\n            else\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)\n            if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_2 ||\n                ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_3 )\n            {\n                transform->minlen += transform->ivlen;\n            }\n            else\n#endif\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n                return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n            }\n        }\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"keylen: %d, minlen: %d, ivlen: %d, maclen: %d\",\n                   transform->keylen, transform->minlen, transform->ivlen,\n                   transform->maclen ) );\n\n    /*\n     * Finally setup the cipher contexts, IVs and MAC secrets.\n     */\n#if defined(MBEDTLS_SSL_CLI_C)\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )\n    {\n        key1 = keyblk + transform->maclen * 2;\n        key2 = keyblk + transform->maclen * 2 + transform->keylen;\n\n        mac_enc = keyblk;\n        mac_dec = keyblk + transform->maclen;\n\n        /*\n         * This is not used in TLS v1.1.\n         */\n        iv_copy_len = ( transform->fixed_ivlen ) ?\n                            transform->fixed_ivlen : transform->ivlen;\n        memcpy( transform->iv_enc, key2 + transform->keylen,  iv_copy_len );\n        memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,\n                iv_copy_len );\n    }\n    else\n#endif /* MBEDTLS_SSL_CLI_C */\n#if defined(MBEDTLS_SSL_SRV_C)\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )\n    {\n        key1 = keyblk + transform->maclen * 2 + transform->keylen;\n        key2 = keyblk + transform->maclen * 2;\n\n        mac_enc = keyblk + transform->maclen;\n        mac_dec = keyblk;\n\n        /*\n         * This is not used in TLS v1.1.\n         */\n        iv_copy_len = ( transform->fixed_ivlen ) ?\n                            transform->fixed_ivlen : transform->ivlen;\n        memcpy( transform->iv_dec, key1 + transform->keylen,  iv_copy_len );\n        memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,\n                iv_copy_len );\n    }\n    else\n#endif /* MBEDTLS_SSL_SRV_C */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        if( transform->maclen > sizeof transform->mac_enc )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        memcpy( transform->mac_enc, mac_enc, transform->maclen );\n        memcpy( transform->mac_dec, mac_dec, transform->maclen );\n    }\n    else\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )\n    {\n        mbedtls_md_hmac_starts( &transform->md_ctx_enc, mac_enc, transform->maclen );\n        mbedtls_md_hmac_starts( &transform->md_ctx_dec, mac_dec, transform->maclen );\n    }\n    else\n#endif\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\n    if( mbedtls_ssl_hw_record_init != NULL )\n    {\n        int ret = 0;\n\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"going for mbedtls_ssl_hw_record_init()\" ) );\n\n        if( ( ret = mbedtls_ssl_hw_record_init( ssl, key1, key2, transform->keylen,\n                                        transform->iv_enc, transform->iv_dec,\n                                        iv_copy_len,\n                                        mac_enc, mac_dec,\n                                        transform->maclen ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_hw_record_init\", ret );\n            return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );\n        }\n    }\n#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */\n\n#if defined(MBEDTLS_SSL_EXPORT_KEYS)\n    if( ssl->conf->f_export_keys != NULL )\n    {\n        ssl->conf->f_export_keys( ssl->conf->p_export_keys,\n                                  session->master, keyblk,\n                                  transform->maclen, transform->keylen,\n                                  iv_copy_len );\n    }\n#endif\n\n    if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc,\n                                 cipher_info ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_setup\", ret );\n        return( ret );\n    }\n\n    if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec,\n                                 cipher_info ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_setup\", ret );\n        return( ret );\n    }\n\n    if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_enc, key1,\n                               cipher_info->key_bitlen,\n                               MBEDTLS_ENCRYPT ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_setkey\", ret );\n        return( ret );\n    }\n\n    if( ( ret = mbedtls_cipher_setkey( &transform->cipher_ctx_dec, key2,\n                               cipher_info->key_bitlen,\n                               MBEDTLS_DECRYPT ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_setkey\", ret );\n        return( ret );\n    }\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    if( cipher_info->mode == MBEDTLS_MODE_CBC )\n    {\n        if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_enc,\n                                             MBEDTLS_PADDING_NONE ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_set_padding_mode\", ret );\n            return( ret );\n        }\n\n        if( ( ret = mbedtls_cipher_set_padding_mode( &transform->cipher_ctx_dec,\n                                             MBEDTLS_PADDING_NONE ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_set_padding_mode\", ret );\n            return( ret );\n        }\n    }\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n\n    mbedtls_zeroize( keyblk, sizeof( keyblk ) );\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    // Initialize compression\n    //\n    if( session->compression == MBEDTLS_SSL_COMPRESS_DEFLATE )\n    {\n        if( ssl->compress_buf == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"Allocating compression buffer\" ) );\n            ssl->compress_buf = mbedtls_calloc( 1, MBEDTLS_SSL_BUFFER_LEN );\n            if( ssl->compress_buf == NULL )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"alloc(%d bytes) failed\",\n                                    MBEDTLS_SSL_BUFFER_LEN ) );\n                return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n            }\n        }\n\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"Initializing zlib states\" ) );\n\n        memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );\n        memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );\n\n        if( deflateInit( &transform->ctx_deflate,\n                         Z_DEFAULT_COMPRESSION )   != Z_OK ||\n            inflateInit( &transform->ctx_inflate ) != Z_OK )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"Failed to initialize compression\" ) );\n            return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED );\n        }\n    }\n#endif /* MBEDTLS_ZLIB_SUPPORT */\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= derive keys\" ) );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\nvoid ssl_calc_verify_ssl( mbedtls_ssl_context *ssl, unsigned char hash[36] )\n{\n    mbedtls_md5_context md5;\n    mbedtls_sha1_context sha1;\n    unsigned char pad_1[48];\n    unsigned char pad_2[48];\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> calc verify ssl\" ) );\n\n    mbedtls_md5_init( &md5 );\n    mbedtls_sha1_init( &sha1 );\n\n    mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );\n    mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );\n\n    memset( pad_1, 0x36, 48 );\n    memset( pad_2, 0x5C, 48 );\n\n    mbedtls_md5_update( &md5, ssl->session_negotiate->master, 48 );\n    mbedtls_md5_update( &md5, pad_1, 48 );\n    mbedtls_md5_finish( &md5, hash );\n\n    mbedtls_md5_starts( &md5 );\n    mbedtls_md5_update( &md5, ssl->session_negotiate->master, 48 );\n    mbedtls_md5_update( &md5, pad_2, 48 );\n    mbedtls_md5_update( &md5, hash,  16 );\n    mbedtls_md5_finish( &md5, hash );\n\n    mbedtls_sha1_update( &sha1, ssl->session_negotiate->master, 48 );\n    mbedtls_sha1_update( &sha1, pad_1, 40 );\n    mbedtls_sha1_finish( &sha1, hash + 16 );\n\n    mbedtls_sha1_starts( &sha1 );\n    mbedtls_sha1_update( &sha1, ssl->session_negotiate->master, 48 );\n    mbedtls_sha1_update( &sha1, pad_2, 40 );\n    mbedtls_sha1_update( &sha1, hash + 16, 20 );\n    mbedtls_sha1_finish( &sha1, hash + 16 );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"calculated verify result\", hash, 36 );\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= calc verify\" ) );\n\n    mbedtls_md5_free(  &md5  );\n    mbedtls_sha1_free( &sha1 );\n\n    return;\n}\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)\nvoid ssl_calc_verify_tls( mbedtls_ssl_context *ssl, unsigned char hash[36] )\n{\n    mbedtls_md5_context md5;\n    mbedtls_sha1_context sha1;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> calc verify tls\" ) );\n\n    mbedtls_md5_init( &md5 );\n    mbedtls_sha1_init( &sha1 );\n\n    mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );\n    mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );\n\n     mbedtls_md5_finish( &md5,  hash );\n    mbedtls_sha1_finish( &sha1, hash + 16 );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"calculated verify result\", hash, 36 );\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= calc verify\" ) );\n\n    mbedtls_md5_free(  &md5  );\n    mbedtls_sha1_free( &sha1 );\n\n    return;\n}\n#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA256_C)\nvoid ssl_calc_verify_tls_sha256( mbedtls_ssl_context *ssl, unsigned char hash[32] )\n{\n    mbedtls_sha256_context sha256;\n\n    mbedtls_sha256_init( &sha256 );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> calc verify sha256\" ) );\n\n    mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );\n    mbedtls_sha256_finish( &sha256, hash );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"calculated verify result\", hash, 32 );\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= calc verify\" ) );\n\n    mbedtls_sha256_free( &sha256 );\n\n    return;\n}\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\nvoid ssl_calc_verify_tls_sha384( mbedtls_ssl_context *ssl, unsigned char hash[48] )\n{\n    mbedtls_sha512_context sha512;\n\n    mbedtls_sha512_init( &sha512 );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> calc verify sha384\" ) );\n\n    mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );\n    mbedtls_sha512_finish( &sha512, hash );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"calculated verify result\", hash, 48 );\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= calc verify\" ) );\n\n    mbedtls_sha512_free( &sha512 );\n\n    return;\n}\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\nint mbedtls_ssl_psk_derive_premaster( mbedtls_ssl_context *ssl, mbedtls_key_exchange_type_t key_ex )\n{\n    unsigned char *p = ssl->handshake->premaster;\n    unsigned char *end = p + sizeof( ssl->handshake->premaster );\n    const unsigned char *psk = ssl->conf->psk;\n    size_t psk_len = ssl->conf->psk_len;\n\n    /* If the psk callback was called, use its result */\n    if( ssl->handshake->psk != NULL )\n    {\n        psk = ssl->handshake->psk;\n        psk_len = ssl->handshake->psk_len;\n    }\n\n    /*\n     * PMS = struct {\n     *     opaque other_secret<0..2^16-1>;\n     *     opaque psk<0..2^16-1>;\n     * };\n     * with \"other_secret\" depending on the particular key exchange\n     */\n#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)\n    if( key_ex == MBEDTLS_KEY_EXCHANGE_PSK )\n    {\n        if( end - p < 2 )\n            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n        *(p++) = (unsigned char)( psk_len >> 8 );\n        *(p++) = (unsigned char)( psk_len      );\n\n        if( end < p || (size_t)( end - p ) < psk_len )\n            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n        memset( p, 0, psk_len );\n        p += psk_len;\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)\n    if( key_ex == MBEDTLS_KEY_EXCHANGE_RSA_PSK )\n    {\n        /*\n         * other_secret already set by the ClientKeyExchange message,\n         * and is 48 bytes long\n         */\n        *p++ = 0;\n        *p++ = 48;\n        p += 48;\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\n    if( key_ex == MBEDTLS_KEY_EXCHANGE_DHE_PSK )\n    {\n        int ret;\n        size_t len;\n\n        /* Write length only when we know the actual value */\n        if( ( ret = mbedtls_dhm_calc_secret( &ssl->handshake->dhm_ctx,\n                                      p + 2, end - ( p + 2 ), &len,\n                                      ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_dhm_calc_secret\", ret );\n            return( ret );\n        }\n        *(p++) = (unsigned char)( len >> 8 );\n        *(p++) = (unsigned char)( len );\n        p += len;\n\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"DHM: K \", &ssl->handshake->dhm_ctx.K  );\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\n    if( key_ex == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK )\n    {\n        int ret;\n        size_t zlen;\n\n        if( ( ret = mbedtls_ecdh_calc_secret( &ssl->handshake->ecdh_ctx, &zlen,\n                                       p + 2, end - ( p + 2 ),\n                                       ssl->conf->f_rng, ssl->conf->p_rng ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ecdh_calc_secret\", ret );\n            return( ret );\n        }\n\n        *(p++) = (unsigned char)( zlen >> 8 );\n        *(p++) = (unsigned char)( zlen      );\n        p += zlen;\n\n        MBEDTLS_SSL_DEBUG_MPI( 3, \"ECDH: z\", &ssl->handshake->ecdh_ctx.z );\n    }\n    else\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    /* opaque psk<0..2^16-1>; */\n    if( end - p < 2 )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    *(p++) = (unsigned char)( psk_len >> 8 );\n    *(p++) = (unsigned char)( psk_len      );\n\n    if( end < p || (size_t)( end - p ) < psk_len )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    memcpy( p, psk, psk_len );\n    p += psk_len;\n\n    ssl->handshake->pmslen = p - ssl->handshake->premaster;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n/*\n * SSLv3.0 MAC functions\n */\nstatic void ssl_mac( mbedtls_md_context_t *md_ctx, unsigned char *secret,\n                     unsigned char *buf, size_t len,\n                     unsigned char *ctr, int type )\n{\n    unsigned char header[11];\n    unsigned char padding[48];\n    int padlen;\n    int md_size = mbedtls_md_get_size( md_ctx->md_info );\n    int md_type = mbedtls_md_get_type( md_ctx->md_info );\n\n    /* Only MD5 and SHA-1 supported */\n    if( md_type == MBEDTLS_MD_MD5 )\n        padlen = 48;\n    else\n        padlen = 40;\n\n    memcpy( header, ctr, 8 );\n    header[ 8] = (unsigned char)  type;\n    header[ 9] = (unsigned char)( len >> 8 );\n    header[10] = (unsigned char)( len      );\n\n    memset( padding, 0x36, padlen );\n    mbedtls_md_starts( md_ctx );\n    mbedtls_md_update( md_ctx, secret,  md_size );\n    mbedtls_md_update( md_ctx, padding, padlen  );\n    mbedtls_md_update( md_ctx, header,  11      );\n    mbedtls_md_update( md_ctx, buf,     len     );\n    mbedtls_md_finish( md_ctx, buf +    len     );\n\n    memset( padding, 0x5C, padlen );\n    mbedtls_md_starts( md_ctx );\n    mbedtls_md_update( md_ctx, secret,    md_size );\n    mbedtls_md_update( md_ctx, padding,   padlen  );\n    mbedtls_md_update( md_ctx, buf + len, md_size );\n    mbedtls_md_finish( md_ctx, buf + len          );\n}\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n\n#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER) ||     \\\n    ( defined(MBEDTLS_CIPHER_MODE_CBC) &&                                  \\\n      ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) ) )\n#define SSL_SOME_MODES_USE_MAC\n#endif\n\n/*\n * Encryption/decryption functions\n */\nstatic int ssl_encrypt_buf( mbedtls_ssl_context *ssl )\n{\n    mbedtls_cipher_mode_t mode;\n    int auth_done = 0;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> encrypt buf\" ) );\n\n    if( ssl->session_out == NULL || ssl->transform_out == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    mode = mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc );\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"before encrypt: output payload\",\n                      ssl->out_msg, ssl->out_msglen );\n\n    /*\n     * Add MAC before if needed\n     */\n#if defined(SSL_SOME_MODES_USE_MAC)\n    if( mode == MBEDTLS_MODE_STREAM ||\n        ( mode == MBEDTLS_MODE_CBC\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n          && ssl->session_out->encrypt_then_mac == MBEDTLS_SSL_ETM_DISABLED\n#endif\n        ) )\n    {\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n        if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n        {\n            ssl_mac( &ssl->transform_out->md_ctx_enc,\n                      ssl->transform_out->mac_enc,\n                      ssl->out_msg, ssl->out_msglen,\n                      ssl->out_ctr, ssl->out_msgtype );\n        }\n        else\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n        defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )\n        {\n            mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_ctr, 8 );\n            mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_hdr, 3 );\n            mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, ssl->out_len, 2 );\n            mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc,\n                             ssl->out_msg, ssl->out_msglen );\n            mbedtls_md_hmac_finish( &ssl->transform_out->md_ctx_enc,\n                             ssl->out_msg + ssl->out_msglen );\n            mbedtls_md_hmac_reset( &ssl->transform_out->md_ctx_enc );\n        }\n        else\n#endif\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"computed mac\",\n                       ssl->out_msg + ssl->out_msglen,\n                       ssl->transform_out->maclen );\n\n        ssl->out_msglen += ssl->transform_out->maclen;\n        auth_done++;\n    }\n#endif /* AEAD not the only option */\n\n    /*\n     * Encrypt\n     */\n#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER)\n    if( mode == MBEDTLS_MODE_STREAM )\n    {\n        int ret;\n        size_t olen = 0;\n\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"before encrypt: msglen = %d, \"\n                            \"including %d bytes of padding\",\n                       ssl->out_msglen, 0 ) );\n\n        if( ( ret = mbedtls_cipher_crypt( &ssl->transform_out->cipher_ctx_enc,\n                                   ssl->transform_out->iv_enc,\n                                   ssl->transform_out->ivlen,\n                                   ssl->out_msg, ssl->out_msglen,\n                                   ssl->out_msg, &olen ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_crypt\", ret );\n            return( ret );\n        }\n\n        if( ssl->out_msglen != olen )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n    }\n    else\n#endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */\n#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C)\n    if( mode == MBEDTLS_MODE_GCM ||\n        mode == MBEDTLS_MODE_CCM )\n    {\n        int ret;\n        size_t enc_msglen, olen;\n        unsigned char *enc_msg;\n        unsigned char add_data[13];\n        unsigned char taglen = ssl->transform_out->ciphersuite_info->flags &\n                               MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;\n\n        memcpy( add_data, ssl->out_ctr, 8 );\n        add_data[8]  = ssl->out_msgtype;\n        mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,\n                           ssl->conf->transport, add_data + 9 );\n        add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;\n        add_data[12] = ssl->out_msglen & 0xFF;\n\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"additional data used for AEAD\",\n                       add_data, 13 );\n\n        /*\n         * Generate IV\n         */\n        if( ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen != 8 )\n        {\n            /* Reminder if we ever add an AEAD mode with a different size */\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        memcpy( ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,\n                             ssl->out_ctr, 8 );\n        memcpy( ssl->out_iv, ssl->out_ctr, 8 );\n\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"IV used\", ssl->out_iv,\n                ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );\n\n        /*\n         * Fix pointer positions and message length with added IV\n         */\n        enc_msg = ssl->out_msg;\n        enc_msglen = ssl->out_msglen;\n        ssl->out_msglen += ssl->transform_out->ivlen -\n                           ssl->transform_out->fixed_ivlen;\n\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"before encrypt: msglen = %d, \"\n                            \"including %d bytes of padding\",\n                       ssl->out_msglen, 0 ) );\n\n        /*\n         * Encrypt and authenticate\n         */\n        if( ( ret = mbedtls_cipher_auth_encrypt( &ssl->transform_out->cipher_ctx_enc,\n                                         ssl->transform_out->iv_enc,\n                                         ssl->transform_out->ivlen,\n                                         add_data, 13,\n                                         enc_msg, enc_msglen,\n                                         enc_msg, &olen,\n                                         enc_msg + enc_msglen, taglen ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_auth_encrypt\", ret );\n            return( ret );\n        }\n\n        if( olen != enc_msglen )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        ssl->out_msglen += taglen;\n        auth_done++;\n\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"after encrypt: tag\", enc_msg + enc_msglen, taglen );\n    }\n    else\n#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */\n#if defined(MBEDTLS_CIPHER_MODE_CBC) &&                                    \\\n    ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) )\n    if( mode == MBEDTLS_MODE_CBC )\n    {\n        int ret;\n        unsigned char *enc_msg;\n        size_t enc_msglen, padlen, olen = 0, i;\n\n        padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %\n                 ssl->transform_out->ivlen;\n        if( padlen == ssl->transform_out->ivlen )\n            padlen = 0;\n\n        for( i = 0; i <= padlen; i++ )\n            ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;\n\n        ssl->out_msglen += padlen + 1;\n\n        enc_msglen = ssl->out_msglen;\n        enc_msg = ssl->out_msg;\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        /*\n         * Prepend per-record IV for block cipher in TLS v1.1 and up as per\n         * Method 1 (6.2.3.2. in RFC4346 and RFC5246)\n         */\n        if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )\n        {\n            /*\n             * Generate IV\n             */\n            ret = ssl->conf->f_rng( ssl->conf->p_rng, ssl->transform_out->iv_enc,\n                                  ssl->transform_out->ivlen );\n            if( ret != 0 )\n                return( ret );\n\n            memcpy( ssl->out_iv, ssl->transform_out->iv_enc,\n                    ssl->transform_out->ivlen );\n\n            /*\n             * Fix pointer positions and message length with added IV\n             */\n            enc_msg = ssl->out_msg;\n            enc_msglen = ssl->out_msglen;\n            ssl->out_msglen += ssl->transform_out->ivlen;\n        }\n#endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */\n\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"before encrypt: msglen = %d, \"\n                            \"including %d bytes of IV and %d bytes of padding\",\n                            ssl->out_msglen, ssl->transform_out->ivlen,\n                            padlen + 1 ) );\n\n        if( ( ret = mbedtls_cipher_crypt( &ssl->transform_out->cipher_ctx_enc,\n                                   ssl->transform_out->iv_enc,\n                                   ssl->transform_out->ivlen,\n                                   enc_msg, enc_msglen,\n                                   enc_msg, &olen ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_crypt\", ret );\n            return( ret );\n        }\n\n        if( enc_msglen != olen )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)\n        if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 )\n        {\n            /*\n             * Save IV in SSL3 and TLS1\n             */\n            memcpy( ssl->transform_out->iv_enc,\n                    ssl->transform_out->cipher_ctx_enc.iv,\n                    ssl->transform_out->ivlen );\n        }\n#endif\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n        if( auth_done == 0 )\n        {\n            /*\n             * MAC(MAC_write_key, seq_num +\n             *     TLSCipherText.type +\n             *     TLSCipherText.version +\n             *     length_of( (IV +) ENC(...) ) +\n             *     IV + // except for TLS 1.0\n             *     ENC(content + padding + padding_length));\n             */\n            unsigned char pseudo_hdr[13];\n\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"using encrypt then mac\" ) );\n\n            memcpy( pseudo_hdr +  0, ssl->out_ctr, 8 );\n            memcpy( pseudo_hdr +  8, ssl->out_hdr, 3 );\n            pseudo_hdr[11] = (unsigned char)( ( ssl->out_msglen >> 8 ) & 0xFF );\n            pseudo_hdr[12] = (unsigned char)( ( ssl->out_msglen      ) & 0xFF );\n\n            MBEDTLS_SSL_DEBUG_BUF( 4, \"MAC'd meta-data\", pseudo_hdr, 13 );\n\n            mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc, pseudo_hdr, 13 );\n            mbedtls_md_hmac_update( &ssl->transform_out->md_ctx_enc,\n                             ssl->out_iv, ssl->out_msglen );\n            mbedtls_md_hmac_finish( &ssl->transform_out->md_ctx_enc,\n                             ssl->out_iv + ssl->out_msglen );\n            mbedtls_md_hmac_reset( &ssl->transform_out->md_ctx_enc );\n\n            ssl->out_msglen += ssl->transform_out->maclen;\n            auth_done++;\n        }\n#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */\n    }\n    else\n#endif /* MBEDTLS_CIPHER_MODE_CBC &&\n          ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C ) */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    /* Make extra sure authentication was performed, exactly once */\n    if( auth_done != 1 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= encrypt buf\" ) );\n\n    return( 0 );\n}\n\n#define SSL_MAX_MAC_SIZE   48\n\nstatic int ssl_decrypt_buf( mbedtls_ssl_context *ssl )\n{\n    size_t i;\n    mbedtls_cipher_mode_t mode;\n    int auth_done = 0;\n#if defined(SSL_SOME_MODES_USE_MAC)\n    size_t padlen = 0, correct = 1;\n#endif\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> decrypt buf\" ) );\n\n    if( ssl->session_in == NULL || ssl->transform_in == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    mode = mbedtls_cipher_get_cipher_mode( &ssl->transform_in->cipher_ctx_dec );\n\n    if( ssl->in_msglen < ssl->transform_in->minlen )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"in_msglen (%d) < minlen (%d)\",\n                       ssl->in_msglen, ssl->transform_in->minlen ) );\n        return( MBEDTLS_ERR_SSL_INVALID_MAC );\n    }\n\n#if defined(MBEDTLS_ARC4_C) || defined(MBEDTLS_CIPHER_NULL_CIPHER)\n    if( mode == MBEDTLS_MODE_STREAM )\n    {\n        int ret;\n        size_t olen = 0;\n\n        padlen = 0;\n\n        if( ( ret = mbedtls_cipher_crypt( &ssl->transform_in->cipher_ctx_dec,\n                                   ssl->transform_in->iv_dec,\n                                   ssl->transform_in->ivlen,\n                                   ssl->in_msg, ssl->in_msglen,\n                                   ssl->in_msg, &olen ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_crypt\", ret );\n            return( ret );\n        }\n\n        if( ssl->in_msglen != olen )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n    }\n    else\n#endif /* MBEDTLS_ARC4_C || MBEDTLS_CIPHER_NULL_CIPHER */\n#if defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C)\n    if( mode == MBEDTLS_MODE_GCM ||\n        mode == MBEDTLS_MODE_CCM )\n    {\n        int ret;\n        size_t dec_msglen, olen;\n        unsigned char *dec_msg;\n        unsigned char *dec_msg_result;\n        unsigned char add_data[13];\n        unsigned char taglen = ssl->transform_in->ciphersuite_info->flags &\n                               MBEDTLS_CIPHERSUITE_SHORT_TAG ? 8 : 16;\n        size_t explicit_iv_len = ssl->transform_in->ivlen -\n                                 ssl->transform_in->fixed_ivlen;\n\n        if( ssl->in_msglen < explicit_iv_len + taglen )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"msglen (%d) < explicit_iv_len (%d) \"\n                                \"+ taglen (%d)\", ssl->in_msglen,\n                                explicit_iv_len, taglen ) );\n            return( MBEDTLS_ERR_SSL_INVALID_MAC );\n        }\n        dec_msglen = ssl->in_msglen - explicit_iv_len - taglen;\n\n        dec_msg = ssl->in_msg;\n        dec_msg_result = ssl->in_msg;\n        ssl->in_msglen = dec_msglen;\n\n        memcpy( add_data, ssl->in_ctr, 8 );\n        add_data[8]  = ssl->in_msgtype;\n        mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,\n                           ssl->conf->transport, add_data + 9 );\n        add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;\n        add_data[12] = ssl->in_msglen & 0xFF;\n\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"additional data used for AEAD\",\n                       add_data, 13 );\n\n        memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,\n                ssl->in_iv,\n                ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );\n\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"IV used\", ssl->transform_in->iv_dec,\n                                     ssl->transform_in->ivlen );\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"TAG used\", dec_msg + dec_msglen, taglen );\n\n        /*\n         * Decrypt and authenticate\n         */\n        if( ( ret = mbedtls_cipher_auth_decrypt( &ssl->transform_in->cipher_ctx_dec,\n                                         ssl->transform_in->iv_dec,\n                                         ssl->transform_in->ivlen,\n                                         add_data, 13,\n                                         dec_msg, dec_msglen,\n                                         dec_msg_result, &olen,\n                                         dec_msg + dec_msglen, taglen ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_auth_decrypt\", ret );\n\n            if( ret == MBEDTLS_ERR_CIPHER_AUTH_FAILED )\n                return( MBEDTLS_ERR_SSL_INVALID_MAC );\n\n            return( ret );\n        }\n        auth_done++;\n\n        if( olen != dec_msglen )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n    }\n    else\n#endif /* MBEDTLS_GCM_C || MBEDTLS_CCM_C */\n#if defined(MBEDTLS_CIPHER_MODE_CBC) &&                                    \\\n    ( defined(MBEDTLS_AES_C) || defined(MBEDTLS_CAMELLIA_C) )\n    if( mode == MBEDTLS_MODE_CBC )\n    {\n        /*\n         * Decrypt and check the padding\n         */\n        int ret;\n        unsigned char *dec_msg;\n        unsigned char *dec_msg_result;\n        size_t dec_msglen;\n        size_t minlen = 0;\n        size_t olen = 0;\n\n        /*\n         * Check immediate ciphertext sanity\n         */\n#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )\n            minlen += ssl->transform_in->ivlen;\n#endif\n\n        if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||\n            ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"msglen (%d) < max( ivlen(%d), maclen (%d) \"\n                                \"+ 1 ) ( + expl IV )\", ssl->in_msglen,\n                                ssl->transform_in->ivlen,\n                                ssl->transform_in->maclen ) );\n            return( MBEDTLS_ERR_SSL_INVALID_MAC );\n        }\n\n        dec_msglen = ssl->in_msglen;\n        dec_msg = ssl->in_msg;\n        dec_msg_result = ssl->in_msg;\n\n        /*\n         * Authenticate before decrypt if enabled\n         */\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n        if( ssl->session_in->encrypt_then_mac == MBEDTLS_SSL_ETM_ENABLED )\n        {\n            unsigned char computed_mac[SSL_MAX_MAC_SIZE];\n            unsigned char pseudo_hdr[13];\n\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"using encrypt then mac\" ) );\n\n            dec_msglen -= ssl->transform_in->maclen;\n            ssl->in_msglen -= ssl->transform_in->maclen;\n\n            memcpy( pseudo_hdr +  0, ssl->in_ctr, 8 );\n            memcpy( pseudo_hdr +  8, ssl->in_hdr, 3 );\n            pseudo_hdr[11] = (unsigned char)( ( ssl->in_msglen >> 8 ) & 0xFF );\n            pseudo_hdr[12] = (unsigned char)( ( ssl->in_msglen      ) & 0xFF );\n\n            MBEDTLS_SSL_DEBUG_BUF( 4, \"MAC'd meta-data\", pseudo_hdr, 13 );\n\n            mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, pseudo_hdr, 13 );\n            mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec,\n                             ssl->in_iv, ssl->in_msglen );\n            mbedtls_md_hmac_finish( &ssl->transform_in->md_ctx_dec, computed_mac );\n            mbedtls_md_hmac_reset( &ssl->transform_in->md_ctx_dec );\n\n            MBEDTLS_SSL_DEBUG_BUF( 4, \"message  mac\", ssl->in_iv + ssl->in_msglen,\n                                              ssl->transform_in->maclen );\n            MBEDTLS_SSL_DEBUG_BUF( 4, \"computed mac\", computed_mac,\n                                              ssl->transform_in->maclen );\n\n            if( mbedtls_ssl_safer_memcmp( ssl->in_iv + ssl->in_msglen, computed_mac,\n                              ssl->transform_in->maclen ) != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"message mac does not match\" ) );\n\n                return( MBEDTLS_ERR_SSL_INVALID_MAC );\n            }\n            auth_done++;\n        }\n#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */\n\n        /*\n         * Check length sanity\n         */\n        if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"msglen (%d) %% ivlen (%d) != 0\",\n                           ssl->in_msglen, ssl->transform_in->ivlen ) );\n            return( MBEDTLS_ERR_SSL_INVALID_MAC );\n        }\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_1) || defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        /*\n         * Initialize for prepended IV for block cipher in TLS v1.1 and up\n         */\n        if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )\n        {\n            dec_msglen -= ssl->transform_in->ivlen;\n            ssl->in_msglen -= ssl->transform_in->ivlen;\n\n            for( i = 0; i < ssl->transform_in->ivlen; i++ )\n                ssl->transform_in->iv_dec[i] = ssl->in_iv[i];\n        }\n#endif /* MBEDTLS_SSL_PROTO_TLS1_1 || MBEDTLS_SSL_PROTO_TLS1_2 */\n\n        if( ( ret = mbedtls_cipher_crypt( &ssl->transform_in->cipher_ctx_dec,\n                                   ssl->transform_in->iv_dec,\n                                   ssl->transform_in->ivlen,\n                                   dec_msg, dec_msglen,\n                                   dec_msg_result, &olen ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_cipher_crypt\", ret );\n            return( ret );\n        }\n\n        if( dec_msglen != olen )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1)\n        if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_2 )\n        {\n            /*\n             * Save IV in SSL3 and TLS1\n             */\n            memcpy( ssl->transform_in->iv_dec,\n                    ssl->transform_in->cipher_ctx_dec.iv,\n                    ssl->transform_in->ivlen );\n        }\n#endif\n\n        padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];\n\n        if( ssl->in_msglen < ssl->transform_in->maclen + padlen &&\n            auth_done == 0 )\n        {\n#if defined(MBEDTLS_SSL_DEBUG_ALL)\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"msglen (%d) < maclen (%d) + padlen (%d)\",\n                        ssl->in_msglen, ssl->transform_in->maclen, padlen ) );\n#endif\n            padlen = 0;\n            correct = 0;\n        }\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n        if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n        {\n            if( padlen > ssl->transform_in->ivlen )\n            {\n#if defined(MBEDTLS_SSL_DEBUG_ALL)\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad padding length: is %d, \"\n                                    \"should be no more than %d\",\n                               padlen, ssl->transform_in->ivlen ) );\n#endif\n                correct = 0;\n            }\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        if( ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 )\n        {\n            /*\n             * TLSv1+: always check the padding up to the first failure\n             * and fake check up to 256 bytes of padding\n             */\n            size_t pad_count = 0, real_count = 1;\n            size_t padding_idx = ssl->in_msglen - padlen - 1;\n\n            /*\n             * Padding is guaranteed to be incorrect if:\n             *   1. padlen >= ssl->in_msglen\n             *\n             *   2. padding_idx >= MBEDTLS_SSL_MAX_CONTENT_LEN +\n             *                     ssl->transform_in->maclen\n             *\n             * In both cases we reset padding_idx to a safe value (0) to\n             * prevent out-of-buffer reads.\n             */\n            correct &= ( ssl->in_msglen >= padlen + 1 );\n            correct &= ( padding_idx < MBEDTLS_SSL_MAX_CONTENT_LEN +\n                                       ssl->transform_in->maclen );\n\n            padding_idx *= correct;\n\n            for( i = 1; i <= 256; i++ )\n            {\n                real_count &= ( i <= padlen );\n                pad_count += real_count *\n                             ( ssl->in_msg[padding_idx + i] == padlen - 1 );\n            }\n\n            correct &= ( pad_count == padlen ); /* Only 1 on correct padding */\n\n#if defined(MBEDTLS_SSL_DEBUG_ALL)\n            if( padlen > 0 && correct == 0 )\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad padding byte detected\" ) );\n#endif\n            padlen &= correct * 0x1FF;\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \\\n          MBEDTLS_SSL_PROTO_TLS1_2 */\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        ssl->in_msglen -= padlen;\n    }\n    else\n#endif /* MBEDTLS_CIPHER_MODE_CBC &&\n          ( MBEDTLS_AES_C || MBEDTLS_CAMELLIA_C ) */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"raw buffer after decryption\",\n                   ssl->in_msg, ssl->in_msglen );\n\n    /*\n     * Authenticate if not done yet.\n     * Compute the MAC regardless of the padding result (RFC4346, CBCTIME).\n     */\n#if defined(SSL_SOME_MODES_USE_MAC)\n    if( auth_done == 0 )\n    {\n        unsigned char tmp[SSL_MAX_MAC_SIZE];\n\n        ssl->in_msglen -= ssl->transform_in->maclen;\n\n        ssl->in_len[0] = (unsigned char)( ssl->in_msglen >> 8 );\n        ssl->in_len[1] = (unsigned char)( ssl->in_msglen      );\n\n        memcpy( tmp, ssl->in_msg + ssl->in_msglen, ssl->transform_in->maclen );\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n        if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n        {\n            ssl_mac( &ssl->transform_in->md_ctx_dec,\n                      ssl->transform_in->mac_dec,\n                      ssl->in_msg, ssl->in_msglen,\n                      ssl->in_ctr, ssl->in_msgtype );\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n        defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        if( ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_0 )\n        {\n            /*\n             * Process MAC and always update for padlen afterwards to make\n             * total time independent of padlen\n             *\n             * extra_run compensates MAC check for padlen\n             *\n             * Known timing attacks:\n             *  - Lucky Thirteen (http://www.isg.rhul.ac.uk/tls/TLStiming.pdf)\n             *\n             * We use ( ( Lx + 8 ) / 64 ) to handle 'negative Lx' values\n             * correctly. (We round down instead of up, so -56 is the correct\n             * value for our calculations instead of -55)\n             */\n            size_t j, extra_run = 0;\n            extra_run = ( 13 + ssl->in_msglen + padlen + 8 ) / 64 -\n                        ( 13 + ssl->in_msglen          + 8 ) / 64;\n\n            extra_run &= correct * 0xFF;\n\n            mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_ctr, 8 );\n            mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_hdr, 3 );\n            mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_len, 2 );\n            mbedtls_md_hmac_update( &ssl->transform_in->md_ctx_dec, ssl->in_msg,\n                             ssl->in_msglen );\n            mbedtls_md_hmac_finish( &ssl->transform_in->md_ctx_dec,\n                             ssl->in_msg + ssl->in_msglen );\n            /* Call mbedtls_md_process at least once due to cache attacks */\n            for( j = 0; j < extra_run + 1; j++ )\n                mbedtls_md_process( &ssl->transform_in->md_ctx_dec, ssl->in_msg );\n\n            mbedtls_md_hmac_reset( &ssl->transform_in->md_ctx_dec );\n        }\n        else\n#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \\\n              MBEDTLS_SSL_PROTO_TLS1_2 */\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"message  mac\", tmp, ssl->transform_in->maclen );\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"computed mac\", ssl->in_msg + ssl->in_msglen,\n                       ssl->transform_in->maclen );\n\n        if( mbedtls_ssl_safer_memcmp( tmp, ssl->in_msg + ssl->in_msglen,\n                         ssl->transform_in->maclen ) != 0 )\n        {\n#if defined(MBEDTLS_SSL_DEBUG_ALL)\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"message mac does not match\" ) );\n#endif\n            correct = 0;\n        }\n        auth_done++;\n\n        /*\n         * Finally check the correct flag\n         */\n        if( correct == 0 )\n            return( MBEDTLS_ERR_SSL_INVALID_MAC );\n    }\n#endif /* SSL_SOME_MODES_USE_MAC */\n\n    /* Make extra sure authentication was performed, exactly once */\n    if( auth_done != 1 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    if( ssl->in_msglen == 0 )\n    {\n        ssl->nb_zero++;\n\n        /*\n         * Three or more empty messages may be a DoS attack\n         * (excessive CPU consumption).\n         */\n        if( ssl->nb_zero > 3 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"received four consecutive empty \"\n                                \"messages, possible DoS attack\" ) );\n            return( MBEDTLS_ERR_SSL_INVALID_MAC );\n        }\n    }\n    else\n        ssl->nb_zero = 0;\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        ; /* in_ctr read from peer, not maintained internally */\n    }\n    else\n#endif\n    {\n        for( i = 8; i > ssl_ep_len( ssl ); i-- )\n            if( ++ssl->in_ctr[i - 1] != 0 )\n                break;\n\n        /* The loop goes to its end iff the counter is wrapping */\n        if( i == ssl_ep_len( ssl ) )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"incoming message counter would wrap\" ) );\n            return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );\n        }\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= decrypt buf\" ) );\n\n    return( 0 );\n}\n\n#undef MAC_NONE\n#undef MAC_PLAINTEXT\n#undef MAC_CIPHERTEXT\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n/*\n * Compression/decompression functions\n */\nstatic int ssl_compress_buf( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    unsigned char *msg_post = ssl->out_msg;\n    size_t len_pre = ssl->out_msglen;\n    unsigned char *msg_pre = ssl->compress_buf;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> compress buf\" ) );\n\n    if( len_pre == 0 )\n        return( 0 );\n\n    memcpy( msg_pre, ssl->out_msg, len_pre );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"before compression: msglen = %d, \",\n                   ssl->out_msglen ) );\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"before compression: output payload\",\n                   ssl->out_msg, ssl->out_msglen );\n\n    ssl->transform_out->ctx_deflate.next_in = msg_pre;\n    ssl->transform_out->ctx_deflate.avail_in = len_pre;\n    ssl->transform_out->ctx_deflate.next_out = msg_post;\n    ssl->transform_out->ctx_deflate.avail_out = MBEDTLS_SSL_BUFFER_LEN;\n\n    ret = deflate( &ssl->transform_out->ctx_deflate, Z_SYNC_FLUSH );\n    if( ret != Z_OK )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"failed to perform compression (%d)\", ret ) );\n        return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED );\n    }\n\n    ssl->out_msglen = MBEDTLS_SSL_BUFFER_LEN -\n                      ssl->transform_out->ctx_deflate.avail_out;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"after compression: msglen = %d, \",\n                   ssl->out_msglen ) );\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"after compression: output payload\",\n                   ssl->out_msg, ssl->out_msglen );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= compress buf\" ) );\n\n    return( 0 );\n}\n\nstatic int ssl_decompress_buf( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    unsigned char *msg_post = ssl->in_msg;\n    size_t len_pre = ssl->in_msglen;\n    unsigned char *msg_pre = ssl->compress_buf;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> decompress buf\" ) );\n\n    if( len_pre == 0 )\n        return( 0 );\n\n    memcpy( msg_pre, ssl->in_msg, len_pre );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"before decompression: msglen = %d, \",\n                   ssl->in_msglen ) );\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"before decompression: input payload\",\n                   ssl->in_msg, ssl->in_msglen );\n\n    ssl->transform_in->ctx_inflate.next_in = msg_pre;\n    ssl->transform_in->ctx_inflate.avail_in = len_pre;\n    ssl->transform_in->ctx_inflate.next_out = msg_post;\n    ssl->transform_in->ctx_inflate.avail_out = MBEDTLS_SSL_MAX_CONTENT_LEN;\n\n    ret = inflate( &ssl->transform_in->ctx_inflate, Z_SYNC_FLUSH );\n    if( ret != Z_OK )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"failed to perform decompression (%d)\", ret ) );\n        return( MBEDTLS_ERR_SSL_COMPRESSION_FAILED );\n    }\n\n    ssl->in_msglen = MBEDTLS_SSL_MAX_CONTENT_LEN -\n                     ssl->transform_in->ctx_inflate.avail_out;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"after decompression: msglen = %d, \",\n                   ssl->in_msglen ) );\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"after decompression: input payload\",\n                   ssl->in_msg, ssl->in_msglen );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= decompress buf\" ) );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_ZLIB_SUPPORT */\n\n#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)\nstatic int ssl_write_hello_request( mbedtls_ssl_context *ssl );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\nstatic int ssl_resend_hello_request( mbedtls_ssl_context *ssl )\n{\n    /* If renegotiation is not enforced, retransmit until we would reach max\n     * timeout if we were using the usual handshake doubling scheme */\n    if( ssl->conf->renego_max_records < 0 )\n    {\n        uint32_t ratio = ssl->conf->hs_timeout_max / ssl->conf->hs_timeout_min + 1;\n        unsigned char doublings = 1;\n\n        while( ratio != 0 )\n        {\n            ++doublings;\n            ratio >>= 1;\n        }\n\n        if( ++ssl->renego_records_seen > doublings )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"no longer retransmitting hello request\" ) );\n            return( 0 );\n        }\n    }\n\n    return( ssl_write_hello_request( ssl ) );\n}\n#endif\n#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */\n\n/*\n * Fill the input message buffer by appending data to it.\n * The amount of data already fetched is in ssl->in_left.\n *\n * If we return 0, is it guaranteed that (at least) nb_want bytes are\n * available (from this read and/or a previous one). Otherwise, an error code\n * is returned (possibly EOF or WANT_READ).\n *\n * With stream transport (TLS) on success ssl->in_left == nb_want, but\n * with datagram transport (DTLS) on success ssl->in_left >= nb_want,\n * since we always read a whole datagram at once.\n *\n * For DTLS, it is up to the caller to set ssl->next_record_offset when\n * they're done reading a record.\n */\nint mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want )\n{\n    int ret;\n    size_t len;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> fetch input\" ) );\n\n    if( ssl->f_recv == NULL && ssl->f_recv_timeout == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"Bad usage of mbedtls_ssl_set_bio() \"\n                            \"or mbedtls_ssl_set_bio()\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    if( nb_want > MBEDTLS_SSL_BUFFER_LEN - (size_t)( ssl->in_hdr - ssl->in_buf ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"requesting more data than fits\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        uint32_t timeout;\n\n        /* Just to be sure */\n        if( ssl->f_set_timer == NULL || ssl->f_get_timer == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"You must use \"\n                        \"mbedtls_ssl_set_timer_cb() for DTLS\" ) );\n            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n        }\n\n        /*\n         * The point is, we need to always read a full datagram at once, so we\n         * sometimes read more then requested, and handle the additional data.\n         * It could be the rest of the current record (while fetching the\n         * header) and/or some other records in the same datagram.\n         */\n\n        /*\n         * Move to the next record in the already read datagram if applicable\n         */\n        if( ssl->next_record_offset != 0 )\n        {\n            if( ssl->in_left < ssl->next_record_offset )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n                return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n            }\n\n            ssl->in_left -= ssl->next_record_offset;\n\n            if( ssl->in_left != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 2, ( \"next record in same datagram, offset: %d\",\n                                    ssl->next_record_offset ) );\n                memmove( ssl->in_hdr,\n                         ssl->in_hdr + ssl->next_record_offset,\n                         ssl->in_left );\n            }\n\n            ssl->next_record_offset = 0;\n        }\n\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"in_left: %d, nb_want: %d\",\n                       ssl->in_left, nb_want ) );\n\n        /*\n         * Done if we already have enough data.\n         */\n        if( nb_want <= ssl->in_left)\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= fetch input\" ) );\n            return( 0 );\n        }\n\n        /*\n         * A record can't be split accross datagrams. If we need to read but\n         * are not at the beginning of a new record, the caller did something\n         * wrong.\n         */\n        if( ssl->in_left != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        /*\n         * Don't even try to read if time's out already.\n         * This avoids by-passing the timer when repeatedly receiving messages\n         * that will end up being dropped.\n         */\n        if( ssl_check_timer( ssl ) != 0 )\n            ret = MBEDTLS_ERR_SSL_TIMEOUT;\n        else\n        {\n            len = MBEDTLS_SSL_BUFFER_LEN - ( ssl->in_hdr - ssl->in_buf );\n\n            if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )\n                timeout = ssl->handshake->retransmit_timeout;\n            else\n                timeout = ssl->conf->read_timeout;\n\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"f_recv_timeout: %u ms\", timeout ) );\n\n            if( ssl->f_recv_timeout != NULL )\n                ret = ssl->f_recv_timeout( ssl->p_bio, ssl->in_hdr, len,\n                                                                    timeout );\n            else\n                ret = ssl->f_recv( ssl->p_bio, ssl->in_hdr, len );\n\n            MBEDTLS_SSL_DEBUG_RET( 2, \"ssl->f_recv(_timeout)\", ret );\n\n            if( ret == 0 )\n                return( MBEDTLS_ERR_SSL_CONN_EOF );\n        }\n\n        if( ret == MBEDTLS_ERR_SSL_TIMEOUT )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"timeout\" ) );\n            ssl_set_timer( ssl, 0 );\n\n            if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )\n            {\n                if( ssl_double_retransmit_timeout( ssl ) != 0 )\n                {\n                    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"handshake timeout\" ) );\n                    return( MBEDTLS_ERR_SSL_TIMEOUT );\n                }\n\n                if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )\n                {\n                    MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_resend\", ret );\n                    return( ret );\n                }\n\n                return( MBEDTLS_ERR_SSL_WANT_READ );\n            }\n#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)\n            else if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&\n                     ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )\n            {\n                if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 )\n                {\n                    MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_resend_hello_request\", ret );\n                    return( ret );\n                }\n\n                return( MBEDTLS_ERR_SSL_WANT_READ );\n            }\n#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */\n        }\n\n        if( ret < 0 )\n            return( ret );\n\n        ssl->in_left = ret;\n    }\n    else\n#endif\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"in_left: %d, nb_want: %d\",\n                       ssl->in_left, nb_want ) );\n\n        while( ssl->in_left < nb_want )\n        {\n            len = nb_want - ssl->in_left;\n\n            if( ssl_check_timer( ssl ) != 0 )\n                ret = MBEDTLS_ERR_SSL_TIMEOUT;\n            else\n            {\n                if( ssl->f_recv_timeout != NULL )\n                {\n                    ret = ssl->f_recv_timeout( ssl->p_bio,\n                                               ssl->in_hdr + ssl->in_left, len,\n                                               ssl->conf->read_timeout );\n                }\n                else\n                {\n                    ret = ssl->f_recv( ssl->p_bio,\n                                       ssl->in_hdr + ssl->in_left, len );\n                }\n            }\n\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"in_left: %d, nb_want: %d\",\n                                        ssl->in_left, nb_want ) );\n            MBEDTLS_SSL_DEBUG_RET( 2, \"ssl->f_recv(_timeout)\", ret );\n\n            if( ret == 0 )\n                return( MBEDTLS_ERR_SSL_CONN_EOF );\n\n            if( ret < 0 )\n                return( ret );\n\n            ssl->in_left += ret;\n        }\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= fetch input\" ) );\n\n    return( 0 );\n}\n\n/*\n * Flush any data not yet written\n */\nint mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    unsigned char *buf, i;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> flush output\" ) );\n\n    if( ssl->f_send == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"Bad usage of mbedtls_ssl_set_bio() \"\n                            \"or mbedtls_ssl_set_bio()\" ) );\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    /* Avoid incrementing counter if data is flushed */\n    if( ssl->out_left == 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= flush output\" ) );\n        return( 0 );\n    }\n\n    while( ssl->out_left > 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"message length: %d, out_left: %d\",\n                       mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen, ssl->out_left ) );\n\n        buf = ssl->out_hdr + mbedtls_ssl_hdr_len( ssl ) +\n              ssl->out_msglen - ssl->out_left;\n        ret = ssl->f_send( ssl->p_bio, buf, ssl->out_left );\n\n        MBEDTLS_SSL_DEBUG_RET( 2, \"ssl->f_send\", ret );\n\n        if( ret <= 0 )\n            return( ret );\n\n        ssl->out_left -= ret;\n    }\n\n    for( i = 8; i > ssl_ep_len( ssl ); i-- )\n        if( ++ssl->out_ctr[i - 1] != 0 )\n            break;\n\n    /* The loop goes to its end iff the counter is wrapping */\n    if( i == ssl_ep_len( ssl ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"outgoing message counter would wrap\" ) );\n        return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= flush output\" ) );\n\n    return( 0 );\n}\n\n/*\n * Functions to handle the DTLS retransmission state machine\n */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n/*\n * Append current handshake message to current outgoing flight\n */\nstatic int ssl_flight_append( mbedtls_ssl_context *ssl )\n{\n    mbedtls_ssl_flight_item *msg;\n\n    /* Allocate space for current message */\n    if( ( msg = mbedtls_calloc( 1, sizeof(  mbedtls_ssl_flight_item ) ) ) == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"alloc %d bytes failed\",\n                            sizeof( mbedtls_ssl_flight_item ) ) );\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n    }\n\n    if( ( msg->p = mbedtls_calloc( 1, ssl->out_msglen ) ) == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"alloc %d bytes failed\", ssl->out_msglen ) );\n        mbedtls_free( msg );\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n    }\n\n    /* Copy current handshake message with headers */\n    memcpy( msg->p, ssl->out_msg, ssl->out_msglen );\n    msg->len = ssl->out_msglen;\n    msg->type = ssl->out_msgtype;\n    msg->next = NULL;\n\n    /* Append to the current flight */\n    if( ssl->handshake->flight == NULL )\n        ssl->handshake->flight = msg;\n    else\n    {\n        mbedtls_ssl_flight_item *cur = ssl->handshake->flight;\n        while( cur->next != NULL )\n            cur = cur->next;\n        cur->next = msg;\n    }\n\n    return( 0 );\n}\n\n/*\n * Free the current flight of handshake messages\n */\nstatic void ssl_flight_free( mbedtls_ssl_flight_item *flight )\n{\n    mbedtls_ssl_flight_item *cur = flight;\n    mbedtls_ssl_flight_item *next;\n\n    while( cur != NULL )\n    {\n        next = cur->next;\n\n        mbedtls_free( cur->p );\n        mbedtls_free( cur );\n\n        cur = next;\n    }\n}\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\nstatic void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl );\n#endif\n\n/*\n * Swap transform_out and out_ctr with the alternative ones\n */\nstatic void ssl_swap_epochs( mbedtls_ssl_context *ssl )\n{\n    mbedtls_ssl_transform *tmp_transform;\n    unsigned char tmp_out_ctr[8];\n\n    if( ssl->transform_out == ssl->handshake->alt_transform_out )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"skip swap epochs\" ) );\n        return;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"swap epochs\" ) );\n\n    /* Swap transforms */\n    tmp_transform                     = ssl->transform_out;\n    ssl->transform_out                = ssl->handshake->alt_transform_out;\n    ssl->handshake->alt_transform_out = tmp_transform;\n\n    /* Swap epoch + sequence_number */\n    memcpy( tmp_out_ctr,                 ssl->out_ctr,                8 );\n    memcpy( ssl->out_ctr,                ssl->handshake->alt_out_ctr, 8 );\n    memcpy( ssl->handshake->alt_out_ctr, tmp_out_ctr,                 8 );\n\n    /* Adjust to the newly activated transform */\n    if( ssl->transform_out != NULL &&\n        ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )\n    {\n        ssl->out_msg = ssl->out_iv + ssl->transform_out->ivlen -\n                                     ssl->transform_out->fixed_ivlen;\n    }\n    else\n        ssl->out_msg = ssl->out_iv;\n\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\n    if( mbedtls_ssl_hw_record_activate != NULL )\n    {\n        if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_hw_record_activate\", ret );\n            return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );\n        }\n    }\n#endif\n}\n\n/*\n * Retransmit the current flight of messages.\n *\n * Need to remember the current message in case flush_output returns\n * WANT_WRITE, causing us to exit this function and come back later.\n * This function must be called until state is no longer SENDING.\n */\nint mbedtls_ssl_resend( mbedtls_ssl_context *ssl )\n{\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> mbedtls_ssl_resend\" ) );\n\n    if( ssl->handshake->retransmit_state != MBEDTLS_SSL_RETRANS_SENDING )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"initialise resending\" ) );\n\n        ssl->handshake->cur_msg = ssl->handshake->flight;\n        ssl_swap_epochs( ssl );\n\n        ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_SENDING;\n    }\n\n    while( ssl->handshake->cur_msg != NULL )\n    {\n        int ret;\n        mbedtls_ssl_flight_item *cur = ssl->handshake->cur_msg;\n\n        /* Swap epochs before sending Finished: we can't do it after\n         * sending ChangeCipherSpec, in case write returns WANT_READ.\n         * Must be done before copying, may change out_msg pointer */\n        if( cur->type == MBEDTLS_SSL_MSG_HANDSHAKE &&\n            cur->p[0] == MBEDTLS_SSL_HS_FINISHED )\n        {\n            ssl_swap_epochs( ssl );\n        }\n\n        memcpy( ssl->out_msg, cur->p, cur->len );\n        ssl->out_msglen = cur->len;\n        ssl->out_msgtype = cur->type;\n\n        ssl->handshake->cur_msg = cur->next;\n\n        MBEDTLS_SSL_DEBUG_BUF( 3, \"resent handshake message header\", ssl->out_msg, 12 );\n\n        if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n            return( ret );\n        }\n    }\n\n    if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )\n        ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED;\n    else\n    {\n        ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;\n        ssl_set_timer( ssl, ssl->handshake->retransmit_timeout );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= mbedtls_ssl_resend\" ) );\n\n    return( 0 );\n}\n\n/*\n * To be called when the last message of an incoming flight is received.\n */\nvoid mbedtls_ssl_recv_flight_completed( mbedtls_ssl_context *ssl )\n{\n    /* We won't need to resend that one any more */\n    ssl_flight_free( ssl->handshake->flight );\n    ssl->handshake->flight = NULL;\n    ssl->handshake->cur_msg = NULL;\n\n    /* The next incoming flight will start with this msg_seq */\n    ssl->handshake->in_flight_start_seq = ssl->handshake->in_msg_seq;\n\n    /* Cancel timer */\n    ssl_set_timer( ssl, 0 );\n\n    if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&\n        ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED )\n    {\n        ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED;\n    }\n    else\n        ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;\n}\n\n/*\n * To be called when the last message of an outgoing flight is send.\n */\nvoid mbedtls_ssl_send_flight_completed( mbedtls_ssl_context *ssl )\n{\n    ssl_reset_retransmit_timeout( ssl );\n    ssl_set_timer( ssl, ssl->handshake->retransmit_timeout );\n\n    if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&\n        ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED )\n    {\n        ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_FINISHED;\n    }\n    else\n        ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;\n}\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n/*\n * Record layer functions\n */\n\n/*\n * Write current record.\n * Uses ssl->out_msgtype, ssl->out_msglen and bytes at ssl->out_msg.\n */\nint mbedtls_ssl_write_record( mbedtls_ssl_context *ssl )\n{\n    int ret, done = 0, out_msg_type;\n    size_t len = ssl->out_msglen;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write record\" ) );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ssl->handshake != NULL &&\n        ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )\n    {\n        ; /* Skip special handshake treatment when resending */\n    }\n    else\n#endif\n    if( ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n        out_msg_type = ssl->out_msg[0];\n\n        if( out_msg_type != MBEDTLS_SSL_HS_HELLO_REQUEST &&\n            ssl->handshake == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        ssl->out_msg[1] = (unsigned char)( ( len - 4 ) >> 16 );\n        ssl->out_msg[2] = (unsigned char)( ( len - 4 ) >>  8 );\n        ssl->out_msg[3] = (unsigned char)( ( len - 4 )       );\n\n        /*\n         * DTLS has additional fields in the Handshake layer,\n         * between the length field and the actual payload:\n         *      uint16 message_seq;\n         *      uint24 fragment_offset;\n         *      uint24 fragment_length;\n         */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n        if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        {\n            /* Make room for the additional DTLS fields */\n            memmove( ssl->out_msg + 12, ssl->out_msg + 4, len - 4 );\n            ssl->out_msglen += 8;\n            len += 8;\n\n            /* Write message_seq and update it, except for HelloRequest */\n            if( out_msg_type != MBEDTLS_SSL_HS_HELLO_REQUEST )\n            {\n                ssl->out_msg[4] = ( ssl->handshake->out_msg_seq >> 8 ) & 0xFF;\n                ssl->out_msg[5] = ( ssl->handshake->out_msg_seq      ) & 0xFF;\n                ++( ssl->handshake->out_msg_seq );\n            }\n            else\n            {\n                ssl->out_msg[4] = 0;\n                ssl->out_msg[5] = 0;\n            }\n\n            /* We don't fragment, so frag_offset = 0 and frag_len = len */\n            memset( ssl->out_msg + 6, 0x00, 3 );\n            memcpy( ssl->out_msg + 9, ssl->out_msg + 1, 3 );\n        }\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n        if( out_msg_type != MBEDTLS_SSL_HS_HELLO_REQUEST )\n            ssl->handshake->update_checksum( ssl, ssl->out_msg, len );\n    }\n\n    /* Save handshake and CCS messages for resending */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ssl->handshake != NULL &&\n        ssl->handshake->retransmit_state != MBEDTLS_SSL_RETRANS_SENDING &&\n        ( ssl->out_msgtype == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC ||\n          ssl->out_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE ) )\n    {\n        if( ( ret = ssl_flight_append( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_flight_append\", ret );\n            return( ret );\n        }\n    }\n#endif\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    if( ssl->transform_out != NULL &&\n        ssl->session_out->compression == MBEDTLS_SSL_COMPRESS_DEFLATE )\n    {\n        if( ( ret = ssl_compress_buf( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_compress_buf\", ret );\n            return( ret );\n        }\n\n        len = ssl->out_msglen;\n    }\n#endif /*MBEDTLS_ZLIB_SUPPORT */\n\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\n    if( mbedtls_ssl_hw_record_write != NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"going for mbedtls_ssl_hw_record_write()\" ) );\n\n        ret = mbedtls_ssl_hw_record_write( ssl );\n        if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_hw_record_write\", ret );\n            return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );\n        }\n\n        if( ret == 0 )\n            done = 1;\n    }\n#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */\n    if( !done )\n    {\n        ssl->out_hdr[0] = (unsigned char) ssl->out_msgtype;\n        mbedtls_ssl_write_version( ssl->major_ver, ssl->minor_ver,\n                           ssl->conf->transport, ssl->out_hdr + 1 );\n\n        ssl->out_len[0] = (unsigned char)( len >> 8 );\n        ssl->out_len[1] = (unsigned char)( len      );\n\n        if( ssl->transform_out != NULL )\n        {\n            if( ( ret = ssl_encrypt_buf( ssl ) ) != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_encrypt_buf\", ret );\n                return( ret );\n            }\n\n            len = ssl->out_msglen;\n            ssl->out_len[0] = (unsigned char)( len >> 8 );\n            ssl->out_len[1] = (unsigned char)( len      );\n        }\n\n        ssl->out_left = mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen;\n\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"output record: msgtype = %d, \"\n                            \"version = [%d:%d], msglen = %d\",\n                       ssl->out_hdr[0], ssl->out_hdr[1], ssl->out_hdr[2],\n                     ( ssl->out_len[0] << 8 ) | ssl->out_len[1] ) );\n\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"output record sent to network\",\n                       ssl->out_hdr, mbedtls_ssl_hdr_len( ssl ) + ssl->out_msglen );\n    }\n\n    if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_flush_output\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write record\" ) );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n/*\n * Mark bits in bitmask (used for DTLS HS reassembly)\n */\nstatic void ssl_bitmask_set( unsigned char *mask, size_t offset, size_t len )\n{\n    unsigned int start_bits, end_bits;\n\n    start_bits = 8 - ( offset % 8 );\n    if( start_bits != 8 )\n    {\n        size_t first_byte_idx = offset / 8;\n\n        /* Special case */\n        if( len <= start_bits )\n        {\n            for( ; len != 0; len-- )\n                mask[first_byte_idx] |= 1 << ( start_bits - len );\n\n            /* Avoid potential issues with offset or len becoming invalid */\n            return;\n        }\n\n        offset += start_bits; /* Now offset % 8 == 0 */\n        len -= start_bits;\n\n        for( ; start_bits != 0; start_bits-- )\n            mask[first_byte_idx] |= 1 << ( start_bits - 1 );\n    }\n\n    end_bits = len % 8;\n    if( end_bits != 0 )\n    {\n        size_t last_byte_idx = ( offset + len ) / 8;\n\n        len -= end_bits; /* Now len % 8 == 0 */\n\n        for( ; end_bits != 0; end_bits-- )\n            mask[last_byte_idx] |= 1 << ( 8 - end_bits );\n    }\n\n    memset( mask + offset / 8, 0xFF, len / 8 );\n}\n\n/*\n * Check that bitmask is full\n */\nstatic int ssl_bitmask_check( unsigned char *mask, size_t len )\n{\n    size_t i;\n\n    for( i = 0; i < len / 8; i++ )\n        if( mask[i] != 0xFF )\n            return( -1 );\n\n    for( i = 0; i < len % 8; i++ )\n        if( ( mask[len / 8] & ( 1 << ( 7 - i ) ) ) == 0 )\n            return( -1 );\n\n    return( 0 );\n}\n\n/*\n * Reassemble fragmented DTLS handshake messages.\n *\n * Use a temporary buffer for reassembly, divided in two parts:\n * - the first holds the reassembled message (including handshake header),\n * - the second holds a bitmask indicating which parts of the message\n *   (excluding headers) have been received so far.\n */\nstatic int ssl_reassemble_dtls_handshake( mbedtls_ssl_context *ssl )\n{\n    unsigned char *msg, *bitmask;\n    size_t frag_len, frag_off;\n    size_t msg_len = ssl->in_hslen - 12; /* Without headers */\n\n    if( ssl->handshake == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"not supported outside handshake (for now)\" ) );\n        return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );\n    }\n\n    /*\n     * For first fragment, check size and allocate buffer\n     */\n    if( ssl->handshake->hs_msg == NULL )\n    {\n        size_t alloc_len;\n\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"initialize reassembly, total length = %d\",\n                            msg_len ) );\n\n        if( ssl->in_hslen > MBEDTLS_SSL_MAX_CONTENT_LEN )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"handshake message too large\" ) );\n            return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );\n        }\n\n        /* The bitmask needs one bit per byte of message excluding header */\n        alloc_len = 12 + msg_len + msg_len / 8 + ( msg_len % 8 != 0 );\n\n        ssl->handshake->hs_msg = mbedtls_calloc( 1, alloc_len );\n        if( ssl->handshake->hs_msg == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"alloc failed (%d bytes)\", alloc_len ) );\n            return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n        }\n\n        /* Prepare final header: copy msg_type, length and message_seq,\n         * then add standardised fragment_offset and fragment_length */\n        memcpy( ssl->handshake->hs_msg, ssl->in_msg, 6 );\n        memset( ssl->handshake->hs_msg + 6, 0, 3 );\n        memcpy( ssl->handshake->hs_msg + 9,\n                ssl->handshake->hs_msg + 1, 3 );\n    }\n    else\n    {\n        /* Make sure msg_type and length are consistent */\n        if( memcmp( ssl->handshake->hs_msg, ssl->in_msg, 4 ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"fragment header mismatch\" ) );\n            return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n        }\n    }\n\n    msg = ssl->handshake->hs_msg + 12;\n    bitmask = msg + msg_len;\n\n    /*\n     * Check and copy current fragment\n     */\n    frag_off = ( ssl->in_msg[6]  << 16 ) |\n               ( ssl->in_msg[7]  << 8  ) |\n                 ssl->in_msg[8];\n    frag_len = ( ssl->in_msg[9]  << 16 ) |\n               ( ssl->in_msg[10] << 8  ) |\n                 ssl->in_msg[11];\n\n    if( frag_off + frag_len > msg_len )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"invalid fragment offset/len: %d + %d > %d\",\n                          frag_off, frag_len, msg_len ) );\n        return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n    }\n\n    if( frag_len + 12 > ssl->in_msglen )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"invalid fragment length: %d + 12 > %d\",\n                          frag_len, ssl->in_msglen ) );\n        return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"adding fragment, offset = %d, length = %d\",\n                        frag_off, frag_len ) );\n\n    memcpy( msg + frag_off, ssl->in_msg + 12, frag_len );\n    ssl_bitmask_set( bitmask, frag_off, frag_len );\n\n    /*\n     * Do we have the complete message by now?\n     * If yes, finalize it, else ask to read the next record.\n     */\n    if( ssl_bitmask_check( bitmask, msg_len ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"message is not complete yet\" ) );\n        return( MBEDTLS_ERR_SSL_WANT_READ );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"handshake message completed\" ) );\n\n    if( frag_len + 12 < ssl->in_msglen )\n    {\n        /*\n         * We'got more handshake messages in the same record.\n         * This case is not handled now because no know implementation does\n         * that and it's hard to test, so we prefer to fail cleanly for now.\n         */\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"last fragment not alone in its record\" ) );\n        return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );\n    }\n\n    if( ssl->in_left > ssl->next_record_offset )\n    {\n        /*\n         * We've got more data in the buffer after the current record,\n         * that we don't want to overwrite. Move it before writing the\n         * reassembled message, and adjust in_left and next_record_offset.\n         */\n        unsigned char *cur_remain = ssl->in_hdr + ssl->next_record_offset;\n        unsigned char *new_remain = ssl->in_msg + ssl->in_hslen;\n        size_t remain_len = ssl->in_left - ssl->next_record_offset;\n\n        /* First compute and check new lengths */\n        ssl->next_record_offset = new_remain - ssl->in_hdr;\n        ssl->in_left = ssl->next_record_offset + remain_len;\n\n        if( ssl->in_left > MBEDTLS_SSL_BUFFER_LEN -\n                           (size_t)( ssl->in_hdr - ssl->in_buf ) )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"reassembled message too large for buffer\" ) );\n            return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );\n        }\n\n        memmove( new_remain, cur_remain, remain_len );\n    }\n\n    memcpy( ssl->in_msg, ssl->handshake->hs_msg, ssl->in_hslen );\n\n    mbedtls_free( ssl->handshake->hs_msg );\n    ssl->handshake->hs_msg = NULL;\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"reassembled handshake message\",\n                   ssl->in_msg, ssl->in_hslen );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\nint mbedtls_ssl_prepare_handshake_record( mbedtls_ssl_context *ssl )\n{\n    if( ssl->in_msglen < mbedtls_ssl_hs_hdr_len( ssl ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"handshake message too short: %d\",\n                            ssl->in_msglen ) );\n        return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n    }\n\n    ssl->in_hslen = mbedtls_ssl_hs_hdr_len( ssl ) + (\n                    ( ssl->in_msg[1] << 16 ) |\n                    ( ssl->in_msg[2] << 8  ) |\n                      ssl->in_msg[3] );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"handshake message: msglen =\"\n                        \" %d, type = %d, hslen = %d\",\n                        ssl->in_msglen, ssl->in_msg[0], ssl->in_hslen ) );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        int ret;\n        unsigned int recv_msg_seq = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5];\n\n        /* ssl->handshake is NULL when receiving ClientHello for renego */\n        if( ssl->handshake != NULL &&\n            recv_msg_seq != ssl->handshake->in_msg_seq )\n        {\n            /* Retransmit only on last message from previous flight, to avoid\n             * too many retransmissions.\n             * Besides, No sane server ever retransmits HelloVerifyRequest */\n            if( recv_msg_seq == ssl->handshake->in_flight_start_seq - 1 &&\n                ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 2, ( \"received message from last flight, \"\n                                    \"message_seq = %d, start_of_flight = %d\",\n                                    recv_msg_seq,\n                                    ssl->handshake->in_flight_start_seq ) );\n\n                if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )\n                {\n                    MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_resend\", ret );\n                    return( ret );\n                }\n            }\n            else\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 2, ( \"dropping out-of-sequence message: \"\n                                    \"message_seq = %d, expected = %d\",\n                                    recv_msg_seq,\n                                    ssl->handshake->in_msg_seq ) );\n            }\n\n            return( MBEDTLS_ERR_SSL_WANT_READ );\n        }\n        /* Wait until message completion to increment in_msg_seq */\n\n        /* Reassemble if current message is fragmented or reassembly is\n         * already in progress */\n        if( ssl->in_msglen < ssl->in_hslen ||\n            memcmp( ssl->in_msg + 6, \"\\0\\0\\0\",        3 ) != 0 ||\n            memcmp( ssl->in_msg + 9, ssl->in_msg + 1, 3 ) != 0 ||\n            ( ssl->handshake != NULL && ssl->handshake->hs_msg != NULL ) )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"found fragmented DTLS handshake message\" ) );\n\n            if( ( ret = ssl_reassemble_dtls_handshake( ssl ) ) != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_reassemble_dtls_handshake\", ret );\n                return( ret );\n            }\n        }\n    }\n    else\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n    /* With TLS we don't handle fragmentation (for now) */\n    if( ssl->in_msglen < ssl->in_hslen )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"TLS handshake fragmentation not supported\" ) );\n        return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );\n    }\n\n    return( 0 );\n}\n\nvoid mbedtls_ssl_update_handshake_status( mbedtls_ssl_context *ssl )\n{\n\n    if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER &&\n        ssl->handshake != NULL )\n    {\n        ssl->handshake->update_checksum( ssl, ssl->in_msg, ssl->in_hslen );\n    }\n\n    /* Handshake message is complete, increment counter */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ssl->handshake != NULL )\n    {\n        ssl->handshake->in_msg_seq++;\n    }\n#endif\n}\n\n/*\n * DTLS anti-replay: RFC 6347 4.1.2.6\n *\n * in_window is a field of bits numbered from 0 (lsb) to 63 (msb).\n * Bit n is set iff record number in_window_top - n has been seen.\n *\n * Usually, in_window_top is the last record number seen and the lsb of\n * in_window is set. The only exception is the initial state (record number 0\n * not seen yet).\n */\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\nstatic void ssl_dtls_replay_reset( mbedtls_ssl_context *ssl )\n{\n    ssl->in_window_top = 0;\n    ssl->in_window = 0;\n}\n\nstatic inline uint64_t ssl_load_six_bytes( unsigned char *buf )\n{\n    return( ( (uint64_t) buf[0] << 40 ) |\n            ( (uint64_t) buf[1] << 32 ) |\n            ( (uint64_t) buf[2] << 24 ) |\n            ( (uint64_t) buf[3] << 16 ) |\n            ( (uint64_t) buf[4] <<  8 ) |\n            ( (uint64_t) buf[5]       ) );\n}\n\n/*\n * Return 0 if sequence number is acceptable, -1 otherwise\n */\nint mbedtls_ssl_dtls_replay_check( mbedtls_ssl_context *ssl )\n{\n    uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 );\n    uint64_t bit;\n\n    if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED )\n        return( 0 );\n\n    if( rec_seqnum > ssl->in_window_top )\n        return( 0 );\n\n    bit = ssl->in_window_top - rec_seqnum;\n\n    if( bit >= 64 )\n        return( -1 );\n\n    if( ( ssl->in_window & ( (uint64_t) 1 << bit ) ) != 0 )\n        return( -1 );\n\n    return( 0 );\n}\n\n/*\n * Update replay window on new validated record\n */\nvoid mbedtls_ssl_dtls_replay_update( mbedtls_ssl_context *ssl )\n{\n    uint64_t rec_seqnum = ssl_load_six_bytes( ssl->in_ctr + 2 );\n\n    if( ssl->conf->anti_replay == MBEDTLS_SSL_ANTI_REPLAY_DISABLED )\n        return;\n\n    if( rec_seqnum > ssl->in_window_top )\n    {\n        /* Update window_top and the contents of the window */\n        uint64_t shift = rec_seqnum - ssl->in_window_top;\n\n        if( shift >= 64 )\n            ssl->in_window = 1;\n        else\n        {\n            ssl->in_window <<= shift;\n            ssl->in_window |= 1;\n        }\n\n        ssl->in_window_top = rec_seqnum;\n    }\n    else\n    {\n        /* Mark that number as seen in the current window */\n        uint64_t bit = ssl->in_window_top - rec_seqnum;\n\n        if( bit < 64 ) /* Always true, but be extra sure */\n            ssl->in_window |= (uint64_t) 1 << bit;\n    }\n}\n#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */\n\n#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)\n/* Forward declaration */\nstatic int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial );\n\n/*\n * Without any SSL context, check if a datagram looks like a ClientHello with\n * a valid cookie, and if it doesn't, generate a HelloVerifyRequest message.\n * Both input and output include full DTLS headers.\n *\n * - if cookie is valid, return 0\n * - if ClientHello looks superficially valid but cookie is not,\n *   fill obuf and set olen, then\n *   return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED\n * - otherwise return a specific error code\n */\nstatic int ssl_check_dtls_clihlo_cookie(\n                           mbedtls_ssl_cookie_write_t *f_cookie_write,\n                           mbedtls_ssl_cookie_check_t *f_cookie_check,\n                           void *p_cookie,\n                           const unsigned char *cli_id, size_t cli_id_len,\n                           const unsigned char *in, size_t in_len,\n                           unsigned char *obuf, size_t buf_len, size_t *olen )\n{\n    size_t sid_len, cookie_len;\n    unsigned char *p;\n\n    if( f_cookie_write == NULL || f_cookie_check == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    /*\n     * Structure of ClientHello with record and handshake headers,\n     * and expected values. We don't need to check a lot, more checks will be\n     * done when actually parsing the ClientHello - skipping those checks\n     * avoids code duplication and does not make cookie forging any easier.\n     *\n     *  0-0  ContentType type;                  copied, must be handshake\n     *  1-2  ProtocolVersion version;           copied\n     *  3-4  uint16 epoch;                      copied, must be 0\n     *  5-10 uint48 sequence_number;            copied\n     * 11-12 uint16 length;                     (ignored)\n     *\n     * 13-13 HandshakeType msg_type;            (ignored)\n     * 14-16 uint24 length;                     (ignored)\n     * 17-18 uint16 message_seq;                copied\n     * 19-21 uint24 fragment_offset;            copied, must be 0\n     * 22-24 uint24 fragment_length;            (ignored)\n     *\n     * 25-26 ProtocolVersion client_version;    (ignored)\n     * 27-58 Random random;                     (ignored)\n     * 59-xx SessionID session_id;              1 byte len + sid_len content\n     * 60+   opaque cookie<0..2^8-1>;           1 byte len + content\n     *       ...\n     *\n     * Minimum length is 61 bytes.\n     */\n    if( in_len < 61 ||\n        in[0] != MBEDTLS_SSL_MSG_HANDSHAKE ||\n        in[3] != 0 || in[4] != 0 ||\n        in[19] != 0 || in[20] != 0 || in[21] != 0 )\n    {\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n    }\n\n    sid_len = in[59];\n    if( sid_len > in_len - 61 )\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n\n    cookie_len = in[60 + sid_len];\n    if( cookie_len > in_len - 60 )\n        return( MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO );\n\n    if( f_cookie_check( p_cookie, in + sid_len + 61, cookie_len,\n                        cli_id, cli_id_len ) == 0 )\n    {\n        /* Valid cookie */\n        return( 0 );\n    }\n\n    /*\n     * If we get here, we've got an invalid cookie, let's prepare HVR.\n     *\n     *  0-0  ContentType type;                  copied\n     *  1-2  ProtocolVersion version;           copied\n     *  3-4  uint16 epoch;                      copied\n     *  5-10 uint48 sequence_number;            copied\n     * 11-12 uint16 length;                     olen - 13\n     *\n     * 13-13 HandshakeType msg_type;            hello_verify_request\n     * 14-16 uint24 length;                     olen - 25\n     * 17-18 uint16 message_seq;                copied\n     * 19-21 uint24 fragment_offset;            copied\n     * 22-24 uint24 fragment_length;            olen - 25\n     *\n     * 25-26 ProtocolVersion server_version;    0xfe 0xff\n     * 27-27 opaque cookie<0..2^8-1>;           cookie_len = olen - 27, cookie\n     *\n     * Minimum length is 28.\n     */\n    if( buf_len < 28 )\n        return( MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL );\n\n    /* Copy most fields and adapt others */\n    memcpy( obuf, in, 25 );\n    obuf[13] = MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST;\n    obuf[25] = 0xfe;\n    obuf[26] = 0xff;\n\n    /* Generate and write actual cookie */\n    p = obuf + 28;\n    if( f_cookie_write( p_cookie,\n                        &p, obuf + buf_len, cli_id, cli_id_len ) != 0 )\n    {\n        return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    *olen = p - obuf;\n\n    /* Go back and fill length fields */\n    obuf[27] = (unsigned char)( *olen - 28 );\n\n    obuf[14] = obuf[22] = (unsigned char)( ( *olen - 25 ) >> 16 );\n    obuf[15] = obuf[23] = (unsigned char)( ( *olen - 25 ) >>  8 );\n    obuf[16] = obuf[24] = (unsigned char)( ( *olen - 25 )       );\n\n    obuf[11] = (unsigned char)( ( *olen - 13 ) >>  8 );\n    obuf[12] = (unsigned char)( ( *olen - 13 )       );\n\n    return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED );\n}\n\n/*\n * Handle possible client reconnect with the same UDP quadruplet\n * (RFC 6347 Section 4.2.8).\n *\n * Called by ssl_parse_record_header() in case we receive an epoch 0 record\n * that looks like a ClientHello.\n *\n * - if the input looks like a ClientHello without cookies,\n *   send back HelloVerifyRequest, then\n *   return MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED\n * - if the input looks like a ClientHello with a valid cookie,\n *   reset the session of the current context, and\n *   return MBEDTLS_ERR_SSL_CLIENT_RECONNECT\n * - if anything goes wrong, return a specific error code\n *\n * mbedtls_ssl_read_record() will ignore the record if anything else than\n * MBEDTLS_ERR_SSL_CLIENT_RECONNECT or 0 is returned, although this function\n * cannot not return 0.\n */\nstatic int ssl_handle_possible_reconnect( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    size_t len;\n\n    ret = ssl_check_dtls_clihlo_cookie(\n            ssl->conf->f_cookie_write,\n            ssl->conf->f_cookie_check,\n            ssl->conf->p_cookie,\n            ssl->cli_id, ssl->cli_id_len,\n            ssl->in_buf, ssl->in_left,\n            ssl->out_buf, MBEDTLS_SSL_MAX_CONTENT_LEN, &len );\n\n    MBEDTLS_SSL_DEBUG_RET( 2, \"ssl_check_dtls_clihlo_cookie\", ret );\n\n    if( ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED )\n    {\n        /* Don't check write errors as we can't do anything here.\n         * If the error is permanent we'll catch it later,\n         * if it's not, then hopefully it'll work next time. */\n        (void) ssl->f_send( ssl->p_bio, ssl->out_buf, len );\n\n        return( MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED );\n    }\n\n    if( ret == 0 )\n    {\n        /* Got a valid cookie, partially reset context */\n        if( ( ret = ssl_session_reset_int( ssl, 1 ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"reset\", ret );\n            return( ret );\n        }\n\n        return( MBEDTLS_ERR_SSL_CLIENT_RECONNECT );\n    }\n\n    return( ret );\n}\n#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */\n\n/*\n * ContentType type;\n * ProtocolVersion version;\n * uint16 epoch;            // DTLS only\n * uint48 sequence_number;  // DTLS only\n * uint16 length;\n *\n * Return 0 if header looks sane (and, for DTLS, the record is expected)\n * MBEDTLS_ERR_SSL_INVALID_RECORD if the header looks bad,\n * MBEDTLS_ERR_SSL_UNEXPECTED_RECORD (DTLS only) if sane but unexpected.\n *\n * With DTLS, mbedtls_ssl_read_record() will:\n * 1. proceed with the record if this function returns 0\n * 2. drop only the current record if this function returns UNEXPECTED_RECORD\n * 3. return CLIENT_RECONNECT if this function return that value\n * 4. drop the whole datagram if this function returns anything else.\n * Point 2 is needed when the peer is resending, and we have already received\n * the first record from a datagram but are still waiting for the others.\n */\nstatic int ssl_parse_record_header( mbedtls_ssl_context *ssl )\n{\n    int major_ver, minor_ver;\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"input record header\", ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) );\n\n    ssl->in_msgtype =  ssl->in_hdr[0];\n    ssl->in_msglen = ( ssl->in_len[0] << 8 ) | ssl->in_len[1];\n    mbedtls_ssl_read_version( &major_ver, &minor_ver, ssl->conf->transport, ssl->in_hdr + 1 );\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"input record: msgtype = %d, \"\n                        \"version = [%d:%d], msglen = %d\",\n                        ssl->in_msgtype,\n                        major_ver, minor_ver, ssl->in_msglen ) );\n\n    /* Check record type */\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE &&\n        ssl->in_msgtype != MBEDTLS_SSL_MSG_ALERT &&\n        ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC &&\n        ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"unknown record type\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );\n        return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n    }\n\n    /* Check version */\n    if( major_ver != ssl->major_ver )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"major version mismatch\" ) );\n        return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n    }\n\n    if( minor_ver > ssl->conf->max_minor_ver )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"minor version mismatch\" ) );\n        return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n    }\n\n    /* Check length against the size of our buffer */\n    if( ssl->in_msglen > MBEDTLS_SSL_BUFFER_LEN\n                         - (size_t)( ssl->in_msg - ssl->in_buf ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad message length\" ) );\n        return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n    }\n\n    /* Check length against bounds of the current transform and version */\n    if( ssl->transform_in == NULL )\n    {\n        if( ssl->in_msglen < 1 ||\n            ssl->in_msglen > MBEDTLS_SSL_MAX_CONTENT_LEN )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad message length\" ) );\n            return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n        }\n    }\n    else\n    {\n        if( ssl->in_msglen < ssl->transform_in->minlen )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad message length\" ) );\n            return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n        }\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n        if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 &&\n            ssl->in_msglen > ssl->transform_in->minlen + MBEDTLS_SSL_MAX_CONTENT_LEN )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad message length\" ) );\n            return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n        }\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2)\n        /*\n         * TLS encrypted messages can have up to 256 bytes of padding\n         */\n        if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 &&\n            ssl->in_msglen > ssl->transform_in->minlen +\n                             MBEDTLS_SSL_MAX_CONTENT_LEN + 256 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad message length\" ) );\n            return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n        }\n#endif\n    }\n\n    /*\n     * DTLS-related tests done last, because most of them may result in\n     * silently dropping the record (but not the whole datagram), and we only\n     * want to consider that after ensuring that the \"basic\" fields (type,\n     * version, length) are sane.\n     */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        unsigned int rec_epoch = ( ssl->in_ctr[0] << 8 ) | ssl->in_ctr[1];\n\n        /* Drop unexpected ChangeCipherSpec messages */\n        if( ssl->in_msgtype == MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC &&\n            ssl->state != MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC &&\n            ssl->state != MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"dropping unexpected ChangeCipherSpec\" ) );\n            return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );\n        }\n\n        /* Drop unexpected ApplicationData records,\n         * except at the beginning of renegotiations */\n        if( ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA &&\n            ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n            && ! ( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS &&\n                   ssl->state == MBEDTLS_SSL_SERVER_HELLO )\n#endif\n            )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"dropping unexpected ApplicationData\" ) );\n            return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );\n        }\n\n        /* Check epoch (and sequence number) with DTLS */\n        if( rec_epoch != ssl->in_epoch )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"record from another epoch: \"\n                                        \"expected %d, received %d\",\n                                        ssl->in_epoch, rec_epoch ) );\n\n#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C)\n            /*\n             * Check for an epoch 0 ClientHello. We can't use in_msg here to\n             * access the first byte of record content (handshake type), as we\n             * have an active transform (possibly iv_len != 0), so use the\n             * fact that the record header len is 13 instead.\n             */\n            if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&\n                ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER &&\n                rec_epoch == 0 &&\n                ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&\n                ssl->in_left > 13 &&\n                ssl->in_buf[13] == MBEDTLS_SSL_HS_CLIENT_HELLO )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"possible client reconnect \"\n                                            \"from the same port\" ) );\n                return( ssl_handle_possible_reconnect( ssl ) );\n            }\n            else\n#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */\n                return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );\n        }\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n        /* Replay detection only works for the current epoch */\n        if( rec_epoch == ssl->in_epoch &&\n            mbedtls_ssl_dtls_replay_check( ssl ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"replayed record\" ) );\n            return( MBEDTLS_ERR_SSL_UNEXPECTED_RECORD );\n        }\n#endif\n    }\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n    return( 0 );\n}\n\n/*\n * If applicable, decrypt (and decompress) record content\n */\nstatic int ssl_prepare_record_content( mbedtls_ssl_context *ssl )\n{\n    int ret, done = 0;\n\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"input record from network\",\n                   ssl->in_hdr, mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen );\n\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\n    if( mbedtls_ssl_hw_record_read != NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"going for mbedtls_ssl_hw_record_read()\" ) );\n\n        ret = mbedtls_ssl_hw_record_read( ssl );\n        if( ret != 0 && ret != MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_hw_record_read\", ret );\n            return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );\n        }\n\n        if( ret == 0 )\n            done = 1;\n    }\n#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */\n    if( !done && ssl->transform_in != NULL )\n    {\n        if( ( ret = ssl_decrypt_buf( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_decrypt_buf\", ret );\n            return( ret );\n        }\n\n        MBEDTLS_SSL_DEBUG_BUF( 4, \"input payload after decrypt\",\n                       ssl->in_msg, ssl->in_msglen );\n\n        if( ssl->in_msglen > MBEDTLS_SSL_MAX_CONTENT_LEN )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad message length\" ) );\n            return( MBEDTLS_ERR_SSL_INVALID_RECORD );\n        }\n    }\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    if( ssl->transform_in != NULL &&\n        ssl->session_in->compression == MBEDTLS_SSL_COMPRESS_DEFLATE )\n    {\n        if( ( ret = ssl_decompress_buf( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_decompress_buf\", ret );\n            return( ret );\n        }\n    }\n#endif /* MBEDTLS_ZLIB_SUPPORT */\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        mbedtls_ssl_dtls_replay_update( ssl );\n    }\n#endif\n\n    return( 0 );\n}\n\nstatic void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl );\n\n/*\n * Read a record.\n *\n * Silently ignore non-fatal alert (and for DTLS, invalid records as well,\n * RFC 6347 4.1.2.7) and continue reading until a valid record is found.\n *\n */\nint mbedtls_ssl_read_record( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> read record\" ) );\n\n    if( ssl->keep_current_message == 0 )\n    {\n        do {\n\n            if( ( ret = mbedtls_ssl_read_record_layer( ssl ) ) != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, ( \"mbedtls_ssl_read_record_layer\" ), ret );\n                return( ret );\n            }\n\n            ret = mbedtls_ssl_handle_message_type( ssl );\n\n        } while( MBEDTLS_ERR_SSL_NON_FATAL == ret );\n\n        if( 0 != ret )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, ( \"mbedtls_ssl_read_record_layer\" ), ret );\n            return( ret );\n        }\n\n        if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE )\n        {\n            mbedtls_ssl_update_handshake_status( ssl );\n        }\n    }\n    else\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= reuse previously read message\" ) );\n        ssl->keep_current_message = 0;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= read record\" ) );\n\n    return( 0 );\n}\n\nint mbedtls_ssl_read_record_layer( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    /*\n     * Step A\n     *\n     * Consume last content-layer message and potentially\n     * update in_msglen which keeps track of the contents'\n     * consumption state.\n     *\n     * (1) Handshake messages:\n     *     Remove last handshake message, move content\n     *     and adapt in_msglen.\n     *\n     * (2) Alert messages:\n     *     Consume whole record content, in_msglen = 0.\n     *\n     *     NOTE: This needs to be fixed, since like for\n     *     handshake messages it is allowed to have\n     *     multiple alerts witin a single record.\n     *     Internal reference IOTSSL-1321.\n     *\n     * (3) Change cipher spec:\n     *     Consume whole record content, in_msglen = 0.\n     *\n     * (4) Application data:\n     *     Don't do anything - the record layer provides\n     *     the application data as a stream transport\n     *     and consumes through mbedtls_ssl_read only.\n     *\n     */\n\n    /* Case (1): Handshake messages */\n    if( ssl->in_hslen != 0 )\n    {\n        /* Hard assertion to be sure that no application data\n         * is in flight, as corrupting ssl->in_msglen during\n         * ssl->in_offt != NULL is fatal. */\n        if( ssl->in_offt != NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n        }\n\n        /*\n         * Get next Handshake message in the current record\n         */\n\n        /* Notes:\n         * (1) in_hslen is *NOT* necessarily the size of the\n         *     current handshake content: If DTLS handshake\n         *     fragmentation is used, that's the fragment\n         *     size instead. Using the total handshake message\n         *     size here is FAULTY and should be changed at\n         *     some point. Internal reference IOTSSL-1414.\n         * (2) While it doesn't seem to cause problems, one\n         *     has to be very careful not to assume that in_hslen\n         *     is always <= in_msglen in a sensible communication.\n         *     Again, it's wrong for DTLS handshake fragmentation.\n         *     The following check is therefore mandatory, and\n         *     should not be treated as a silently corrected assertion.\n         *     Additionally, ssl->in_hslen might be arbitrarily out of\n         *     bounds after handling a DTLS message with an unexpected\n         *     sequence number, see mbedtls_ssl_prepare_handshake_record.\n         */\n        if( ssl->in_hslen < ssl->in_msglen )\n        {\n            ssl->in_msglen -= ssl->in_hslen;\n            memmove( ssl->in_msg, ssl->in_msg + ssl->in_hslen,\n                     ssl->in_msglen );\n\n            MBEDTLS_SSL_DEBUG_BUF( 4, \"remaining content in record\",\n                                   ssl->in_msg, ssl->in_msglen );\n        }\n        else\n        {\n            ssl->in_msglen = 0;\n        }\n\n        ssl->in_hslen   = 0;\n    }\n    /* Case (4): Application data */\n    else if( ssl->in_offt != NULL )\n    {\n        return( 0 );\n    }\n    /* Everything else (CCS & Alerts) */\n    else\n    {\n        ssl->in_msglen = 0;\n    }\n\n    /*\n     * Step B\n     *\n     * Fetch and decode new record if current one is fully consumed.\n     *\n     */\n\n    if( ssl->in_msglen > 0 )\n    {\n        /* There's something left to be processed in the current record. */\n        return( 0 );\n    }\n\n    /* Need to fetch a new record */\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\nread_record_header:\n#endif\n\n    /* Current record either fully processed or to be discarded. */\n\n    if( ( ret = mbedtls_ssl_fetch_input( ssl, mbedtls_ssl_hdr_len( ssl ) ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_fetch_input\", ret );\n        return( ret );\n    }\n\n    if( ( ret = ssl_parse_record_header( ssl ) ) != 0 )\n    {\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n        if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n            ret != MBEDTLS_ERR_SSL_CLIENT_RECONNECT )\n        {\n            if( ret == MBEDTLS_ERR_SSL_UNEXPECTED_RECORD )\n            {\n                /* Skip unexpected record (but not whole datagram) */\n                ssl->next_record_offset = ssl->in_msglen\n                                        + mbedtls_ssl_hdr_len( ssl );\n\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"discarding unexpected record \"\n                                            \"(header)\" ) );\n            }\n            else\n            {\n                /* Skip invalid record and the rest of the datagram */\n                ssl->next_record_offset = 0;\n                ssl->in_left = 0;\n\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"discarding invalid record \"\n                                            \"(header)\" ) );\n            }\n\n            /* Get next record */\n            goto read_record_header;\n        }\n#endif\n        return( ret );\n    }\n\n    /*\n     * Read and optionally decrypt the message contents\n     */\n    if( ( ret = mbedtls_ssl_fetch_input( ssl,\n                                 mbedtls_ssl_hdr_len( ssl ) + ssl->in_msglen ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_fetch_input\", ret );\n        return( ret );\n    }\n\n    /* Done reading this record, get ready for the next one */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        ssl->next_record_offset = ssl->in_msglen + mbedtls_ssl_hdr_len( ssl );\n    else\n#endif\n        ssl->in_left = 0;\n\n    if( ( ret = ssl_prepare_record_content( ssl ) ) != 0 )\n    {\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n        if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        {\n            /* Silently discard invalid records */\n            if( ret == MBEDTLS_ERR_SSL_INVALID_RECORD ||\n                ret == MBEDTLS_ERR_SSL_INVALID_MAC )\n            {\n                /* Except when waiting for Finished as a bad mac here\n                 * probably means something went wrong in the handshake\n                 * (eg wrong psk used, mitm downgrade attempt, etc.) */\n                if( ssl->state == MBEDTLS_SSL_CLIENT_FINISHED ||\n                    ssl->state == MBEDTLS_SSL_SERVER_FINISHED )\n                {\n#if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES)\n                    if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )\n                    {\n                        mbedtls_ssl_send_alert_message( ssl,\n                                MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC );\n                    }\n#endif\n                    return( ret );\n                }\n\n#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)\n                if( ssl->conf->badmac_limit != 0 &&\n                    ++ssl->badmac_seen >= ssl->conf->badmac_limit )\n                {\n                    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"too many records with bad MAC\" ) );\n                    return( MBEDTLS_ERR_SSL_INVALID_MAC );\n                }\n#endif\n\n                /* As above, invalid records cause\n                 * dismissal of the whole datagram. */\n\n                ssl->next_record_offset = 0;\n                ssl->in_left = 0;\n\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"discarding invalid record (mac)\" ) );\n                goto read_record_header;\n            }\n\n            return( ret );\n        }\n        else\n#endif\n        {\n            /* Error out (and send alert) on invalid records */\n#if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES)\n            if( ret == MBEDTLS_ERR_SSL_INVALID_MAC )\n            {\n                mbedtls_ssl_send_alert_message( ssl,\n                        MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                        MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC );\n            }\n#endif\n            return( ret );\n        }\n    }\n\n    /*\n     * When we sent the last flight of the handshake, we MUST respond to a\n     * retransmit of the peer's previous flight with a retransmit. (In\n     * practice, only the Finished message will make it, other messages\n     * including CCS use the old transform so they're dropped as invalid.)\n     *\n     * If the record we received is not a handshake message, however, it\n     * means the peer received our last flight so we can clean up\n     * handshake info.\n     *\n     * This check needs to be done before prepare_handshake() due to an edge\n     * case: if the client immediately requests renegotiation, this\n     * finishes the current handshake first, avoiding the new ClientHello\n     * being mistaken for an ancient message in the current handshake.\n     */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ssl->handshake != NULL &&\n        ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )\n    {\n        if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE &&\n                ssl->in_msg[0] == MBEDTLS_SSL_HS_FINISHED )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"received retransmit of last flight\" ) );\n\n            if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_resend\", ret );\n                return( ret );\n            }\n\n            return( MBEDTLS_ERR_SSL_WANT_READ );\n        }\n        else\n        {\n            ssl_handshake_wrapup_free_hs_transform( ssl );\n        }\n    }\n#endif\n\n    return( 0 );\n}\n\nint mbedtls_ssl_handle_message_type( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    /*\n     * Handle particular types of records\n     */\n    if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n        if( ( ret = mbedtls_ssl_prepare_handshake_record( ssl ) ) != 0 )\n        {\n            return( ret );\n        }\n    }\n\n    if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"got an alert message, type: [%d:%d]\",\n                       ssl->in_msg[0], ssl->in_msg[1] ) );\n\n        /*\n         * Ignore non-fatal alerts, except close_notify and no_renegotiation\n         */\n        if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_FATAL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"is a fatal alert message (msg %d)\",\n                           ssl->in_msg[1] ) );\n            return( MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE );\n        }\n\n        if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&\n            ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"is a close notify message\" ) );\n            return( MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY );\n        }\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION_ENABLED)\n        if( ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&\n            ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"is a SSLv3 no_cert\" ) );\n            /* Will be handled when trying to parse ServerHello */\n            return( 0 );\n        }\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_SRV_C)\n        if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 &&\n            ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&\n            ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_WARNING &&\n            ssl->in_msg[1] == MBEDTLS_SSL_ALERT_MSG_NO_CERT )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"is a SSLv3 no_cert\" ) );\n            /* Will be handled in mbedtls_ssl_parse_certificate() */\n            return( 0 );\n        }\n#endif /* MBEDTLS_SSL_PROTO_SSL3 && MBEDTLS_SSL_SRV_C */\n\n        /* Silently ignore: fetch new message */\n        return MBEDTLS_ERR_SSL_NON_FATAL;\n    }\n\n    return( 0 );\n}\n\nint mbedtls_ssl_send_fatal_handshake_failure( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    if( ( ret = mbedtls_ssl_send_alert_message( ssl,\n                    MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                    MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    return( 0 );\n}\n\nint mbedtls_ssl_send_alert_message( mbedtls_ssl_context *ssl,\n                            unsigned char level,\n                            unsigned char message )\n{\n    int ret;\n\n    if( ssl == NULL || ssl->conf == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> send alert message\" ) );\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"send alert level=%u message=%u\", level, message ));\n\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT;\n    ssl->out_msglen = 2;\n    ssl->out_msg[0] = level;\n    ssl->out_msg[1] = message;\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= send alert message\" ) );\n\n    return( 0 );\n}\n\n/*\n * Handshake functions\n */\n#if !defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)         && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)     && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)     && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)   && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED) && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)    && \\\n    !defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\n/* No certificate support -> dummy functions */\nint mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )\n{\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write certificate\" ) );\n\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip write certificate\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n    return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n}\n\nint mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )\n{\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse certificate\" ) );\n\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip parse certificate\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n    return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n}\n\n#else\n/* Some certificate support -> implement write and parse */\n\nint mbedtls_ssl_write_certificate( mbedtls_ssl_context *ssl )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n    size_t i, n;\n    const mbedtls_x509_crt *crt;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write certificate\" ) );\n\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip write certificate\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n#if defined(MBEDTLS_SSL_CLI_C)\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )\n    {\n        if( ssl->client_auth == 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip write certificate\" ) );\n            ssl->state++;\n            return( 0 );\n        }\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n        /*\n         * If using SSLv3 and got no cert, send an Alert message\n         * (otherwise an empty Certificate message will be sent).\n         */\n        if( mbedtls_ssl_own_cert( ssl )  == NULL &&\n            ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n        {\n            ssl->out_msglen  = 2;\n            ssl->out_msgtype = MBEDTLS_SSL_MSG_ALERT;\n            ssl->out_msg[0]  = MBEDTLS_SSL_ALERT_LEVEL_WARNING;\n            ssl->out_msg[1]  = MBEDTLS_SSL_ALERT_MSG_NO_CERT;\n\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"got no certificate to send\" ) );\n            goto write_msg;\n        }\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n    }\n#endif /* MBEDTLS_SSL_CLI_C */\n#if defined(MBEDTLS_SSL_SRV_C)\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )\n    {\n        if( mbedtls_ssl_own_cert( ssl ) == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got no certificate to send\" ) );\n            return( MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED );\n        }\n    }\n#endif\n\n    MBEDTLS_SSL_DEBUG_CRT( 3, \"own certificate\", mbedtls_ssl_own_cert( ssl ) );\n\n    /*\n     *     0  .  0    handshake type\n     *     1  .  3    handshake length\n     *     4  .  6    length of all certs\n     *     7  .  9    length of cert. 1\n     *    10  . n-1   peer certificate\n     *     n  . n+2   length of cert. 2\n     *    n+3 . ...   upper level cert, etc.\n     */\n    i = 7;\n    crt = mbedtls_ssl_own_cert( ssl );\n\n    while( crt != NULL )\n    {\n        n = crt->raw.len;\n        if( n > MBEDTLS_SSL_MAX_CONTENT_LEN - 3 - i )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"certificate too large, %d > %d\",\n                           i + 3 + n, MBEDTLS_SSL_MAX_CONTENT_LEN ) );\n            return( MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE );\n        }\n\n        ssl->out_msg[i    ] = (unsigned char)( n >> 16 );\n        ssl->out_msg[i + 1] = (unsigned char)( n >>  8 );\n        ssl->out_msg[i + 2] = (unsigned char)( n       );\n\n        i += 3; memcpy( ssl->out_msg + i, crt->raw.p, n );\n        i += n; crt = crt->next;\n    }\n\n    ssl->out_msg[4]  = (unsigned char)( ( i - 7 ) >> 16 );\n    ssl->out_msg[5]  = (unsigned char)( ( i - 7 ) >>  8 );\n    ssl->out_msg[6]  = (unsigned char)( ( i - 7 )       );\n\n    ssl->out_msglen  = i;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_CERTIFICATE;\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) && defined(MBEDTLS_SSL_CLI_C)\nwrite_msg:\n#endif\n\n    ssl->state++;\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write certificate\" ) );\n\n    return( ret );\n}\n\nint mbedtls_ssl_parse_certificate( mbedtls_ssl_context *ssl )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n    size_t i, n;\n    const mbedtls_ssl_ciphersuite_t *ciphersuite_info = ssl->transform_negotiate->ciphersuite_info;\n    int authmode = ssl->conf->authmode;\n    uint8_t alert;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse certificate\" ) );\n\n    if( ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_DHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECDHE_PSK ||\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_ECJPAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip parse certificate\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n#if defined(MBEDTLS_SSL_SRV_C)\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&\n        ciphersuite_info->key_exchange == MBEDTLS_KEY_EXCHANGE_RSA_PSK )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip parse certificate\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n    if( ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET )\n        authmode = ssl->handshake->sni_authmode;\n#endif\n\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&\n        authmode == MBEDTLS_SSL_VERIFY_NONE )\n    {\n        ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_SKIP_VERIFY;\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= skip parse certificate\" ) );\n        ssl->state++;\n        return( 0 );\n    }\n#endif\n\n    if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n    {\n        /* mbedtls_ssl_read_record may have sent an alert already. We\n           let it decide whether to alert. */\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n        return( ret );\n    }\n\n    ssl->state++;\n\n#if defined(MBEDTLS_SSL_SRV_C)\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n    /*\n     * Check if the client sent an empty certificate\n     */\n    if( ssl->conf->endpoint  == MBEDTLS_SSL_IS_SERVER &&\n        ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        if( ssl->in_msglen  == 2                        &&\n            ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT            &&\n            ssl->in_msg[0]  == MBEDTLS_SSL_ALERT_LEVEL_WARNING  &&\n            ssl->in_msg[1]  == MBEDTLS_SSL_ALERT_MSG_NO_CERT )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"SSLv3 client has no certificate\" ) );\n\n            /* The client was asked for a certificate but didn't send\n               one. The client should know what's going on, so we\n               don't send an alert. */\n            ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;\n            if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL )\n                return( 0 );\n            else\n                return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE );\n        }\n    }\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    if( ssl->conf->endpoint  == MBEDTLS_SSL_IS_SERVER &&\n        ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_0 )\n    {\n        if( ssl->in_hslen   == 3 + mbedtls_ssl_hs_hdr_len( ssl ) &&\n            ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE    &&\n            ssl->in_msg[0]  == MBEDTLS_SSL_HS_CERTIFICATE   &&\n            memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ), \"\\0\\0\\0\", 3 ) == 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"TLSv1 client has no certificate\" ) );\n\n            /* The client was asked for a certificate but didn't send\n               one. The client should know what's going on, so we\n               don't send an alert. */\n            ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;\n            if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL )\n                return( 0 );\n            else\n                return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE );\n        }\n    }\n#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 || \\\n          MBEDTLS_SSL_PROTO_TLS1_2 */\n#endif /* MBEDTLS_SSL_SRV_C */\n\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n    if( ssl->in_msg[0] != MBEDTLS_SSL_HS_CERTIFICATE ||\n        ssl->in_hslen < mbedtls_ssl_hs_hdr_len( ssl ) + 3 + 3 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );\n    }\n\n    i = mbedtls_ssl_hs_hdr_len( ssl );\n\n    /*\n     * Same message structure as in mbedtls_ssl_write_certificate()\n     */\n    n = ( ssl->in_msg[i+1] << 8 ) | ssl->in_msg[i+2];\n\n    if( ssl->in_msg[i] != 0 ||\n        ssl->in_hslen != n + 3 + mbedtls_ssl_hs_hdr_len( ssl ) )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );\n    }\n\n    /* In case we tried to reuse a session but it failed */\n    if( ssl->session_negotiate->peer_cert != NULL )\n    {\n        mbedtls_x509_crt_free( ssl->session_negotiate->peer_cert );\n        mbedtls_free( ssl->session_negotiate->peer_cert );\n    }\n\n    if( ( ssl->session_negotiate->peer_cert = mbedtls_calloc( 1,\n                    sizeof( mbedtls_x509_crt ) ) ) == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"alloc(%d bytes) failed\",\n                       sizeof( mbedtls_x509_crt ) ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n    }\n\n    mbedtls_x509_crt_init( ssl->session_negotiate->peer_cert );\n\n    i += 3;\n\n    while( i < ssl->in_hslen )\n    {\n        if( ssl->in_msg[i] != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );\n        }\n\n        n = ( (unsigned int) ssl->in_msg[i + 1] << 8 )\n            | (unsigned int) ssl->in_msg[i + 2];\n        i += 3;\n\n        if( n < 128 || i + n > ssl->in_hslen )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate message\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );\n        }\n\n        ret = mbedtls_x509_crt_parse_der( ssl->session_negotiate->peer_cert,\n                                  ssl->in_msg + i, n );\n        switch( ret )\n        {\n        case 0: /*ok*/\n        case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:\n            /* Ignore certificate with an unknown algorithm: maybe a\n               prior certificate was already trusted. */\n            break;\n\n        case MBEDTLS_ERR_X509_ALLOC_FAILED:\n            alert = MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR;\n            goto crt_parse_der_failed;\n\n        case MBEDTLS_ERR_X509_UNKNOWN_VERSION:\n            alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;\n            goto crt_parse_der_failed;\n\n        default:\n            alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;\n        crt_parse_der_failed:\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL, alert );\n            MBEDTLS_SSL_DEBUG_RET( 1, \" mbedtls_x509_crt_parse_der\", ret );\n            return( ret );\n        }\n\n        i += n;\n    }\n\n    MBEDTLS_SSL_DEBUG_CRT( 3, \"peer certificate\", ssl->session_negotiate->peer_cert );\n\n    /*\n     * On client, make sure the server cert doesn't change during renego to\n     * avoid \"triple handshake\" attack: https://secure-resumption.com/\n     */\n#if defined(MBEDTLS_SSL_RENEGOTIATION) && defined(MBEDTLS_SSL_CLI_C)\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&\n        ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )\n    {\n        if( ssl->session->peer_cert == NULL )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"new server cert during renegotiation\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );\n        }\n\n        if( ssl->session->peer_cert->raw.len !=\n            ssl->session_negotiate->peer_cert->raw.len ||\n            memcmp( ssl->session->peer_cert->raw.p,\n                    ssl->session_negotiate->peer_cert->raw.p,\n                    ssl->session->peer_cert->raw.len ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"server cert changed during renegotiation\" ) );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED );\n            return( MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE );\n        }\n    }\n#endif /* MBEDTLS_SSL_RENEGOTIATION && MBEDTLS_SSL_CLI_C */\n\n    if( authmode != MBEDTLS_SSL_VERIFY_NONE )\n    {\n        mbedtls_x509_crt *ca_chain;\n        mbedtls_x509_crl *ca_crl;\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n        if( ssl->handshake->sni_ca_chain != NULL )\n        {\n            ca_chain = ssl->handshake->sni_ca_chain;\n            ca_crl   = ssl->handshake->sni_ca_crl;\n        }\n        else\n#endif\n        {\n            ca_chain = ssl->conf->ca_chain;\n            ca_crl   = ssl->conf->ca_crl;\n        }\n\n        /*\n         * Main check: verify certificate\n         */\n        ret = mbedtls_x509_crt_verify_with_profile(\n                                ssl->session_negotiate->peer_cert,\n                                ca_chain, ca_crl,\n                                ssl->conf->cert_profile,\n                                ssl->hostname,\n                               &ssl->session_negotiate->verify_result,\n                                ssl->conf->f_vrfy, ssl->conf->p_vrfy );\n\n        if( ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"x509_verify_cert\", ret );\n        }\n\n        /*\n         * Secondary checks: always done, but change 'ret' only if it was 0\n         */\n\n#if defined(MBEDTLS_ECP_C)\n        {\n            const mbedtls_pk_context *pk = &ssl->session_negotiate->peer_cert->pk;\n\n            /* If certificate uses an EC key, make sure the curve is OK */\n            if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECKEY ) &&\n                mbedtls_ssl_check_curve( ssl, mbedtls_pk_ec( *pk )->grp.id ) != 0 )\n            {\n                ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY;\n\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate (EC key curve)\" ) );\n                if( ret == 0 )\n                    ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;\n            }\n        }\n#endif /* MBEDTLS_ECP_C */\n\n        if( mbedtls_ssl_check_cert_usage( ssl->session_negotiate->peer_cert,\n                                 ciphersuite_info,\n                                 ! ssl->conf->endpoint,\n                                 &ssl->session_negotiate->verify_result ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad certificate (usage extensions)\" ) );\n            if( ret == 0 )\n                ret = MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE;\n        }\n\n        /* mbedtls_x509_crt_verify_with_profile is supposed to report a\n         * verification failure through MBEDTLS_ERR_X509_CERT_VERIFY_FAILED,\n         * with details encoded in the verification flags. All other kinds\n         * of error codes, including those from the user provided f_vrfy\n         * functions, are treated as fatal and lead to a failure of\n         * ssl_parse_certificate even if verification was optional. */\n        if( authmode == MBEDTLS_SSL_VERIFY_OPTIONAL &&\n            ( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED ||\n              ret == MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE ) )\n        {\n            ret = 0;\n        }\n\n        if( ca_chain == NULL && authmode == MBEDTLS_SSL_VERIFY_REQUIRED )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"got no CA chain\" ) );\n            ret = MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED;\n        }\n\n        if( ret != 0 )\n        {\n            /* The certificate may have been rejected for several reasons.\n               Pick one and send the corresponding alert. Which alert to send\n               may be a subject of debate in some cases. */\n            if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_OTHER )\n                alert = MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED;\n            else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_CN_MISMATCH )\n                alert = MBEDTLS_SSL_ALERT_MSG_BAD_CERT;\n            else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_KEY_USAGE )\n                alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;\n            else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXT_KEY_USAGE )\n                alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;\n            else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NS_CERT_TYPE )\n                alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;\n            else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_PK )\n                alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;\n            else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_BAD_KEY )\n                alert = MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT;\n            else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_EXPIRED )\n                alert = MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED;\n            else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_REVOKED )\n                alert = MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED;\n            else if( ssl->session_negotiate->verify_result & MBEDTLS_X509_BADCERT_NOT_TRUSTED )\n                alert = MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA;\n            else\n                alert = MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN;\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            alert );\n        }\n\n#if defined(MBEDTLS_DEBUG_C)\n        if( ssl->session_negotiate->verify_result != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"! Certificate verification flags %x\",\n                                        ssl->session_negotiate->verify_result ) );\n        }\n        else\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 3, ( \"Certificate verification flags clear\" ) );\n        }\n#endif /* MBEDTLS_DEBUG_C */\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse certificate\" ) );\n\n    return( ret );\n}\n#endif /* !MBEDTLS_KEY_EXCHANGE_RSA_ENABLED\n          !MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED\n          !MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED\n          !MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED\n          !MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED\n          !MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED\n          !MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */\n\nint mbedtls_ssl_write_change_cipher_spec( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write change cipher spec\" ) );\n\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC;\n    ssl->out_msglen  = 1;\n    ssl->out_msg[0]  = 1;\n\n    ssl->state++;\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write change cipher spec\" ) );\n\n    return( 0 );\n}\n\nint mbedtls_ssl_parse_change_cipher_spec( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse change cipher spec\" ) );\n\n    if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n        return( ret );\n    }\n\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad change cipher spec message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n    if( ssl->in_msglen != 1 || ssl->in_msg[0] != 1 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad change cipher spec message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC );\n    }\n\n    /*\n     * Switch to our negotiated transform and session parameters for inbound\n     * data.\n     */\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"switching to new transform spec for inbound data\" ) );\n    ssl->transform_in = ssl->transform_negotiate;\n    ssl->session_in = ssl->session_negotiate;\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n        ssl_dtls_replay_reset( ssl );\n#endif\n\n        /* Increment epoch */\n        if( ++ssl->in_epoch == 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"DTLS epoch would wrap\" ) );\n            /* This is highly unlikely to happen for legitimate reasons, so\n               treat it as an attack and don't send an alert. */\n            return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );\n        }\n    }\n    else\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n    memset( ssl->in_ctr, 0, 8 );\n\n    /*\n     * Set the in_msg pointer to the correct location based on IV length\n     */\n    if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )\n    {\n        ssl->in_msg = ssl->in_iv + ssl->transform_negotiate->ivlen -\n                      ssl->transform_negotiate->fixed_ivlen;\n    }\n    else\n        ssl->in_msg = ssl->in_iv;\n\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\n    if( mbedtls_ssl_hw_record_activate != NULL )\n    {\n        if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_INBOUND ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_hw_record_activate\", ret );\n            mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                            MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR );\n            return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );\n        }\n    }\n#endif\n\n    ssl->state++;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse change cipher spec\" ) );\n\n    return( 0 );\n}\n\nvoid mbedtls_ssl_optimize_checksum( mbedtls_ssl_context *ssl,\n                            const mbedtls_ssl_ciphersuite_t *ciphersuite_info )\n{\n    ((void) ciphersuite_info);\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n    if( ssl->minor_ver < MBEDTLS_SSL_MINOR_VERSION_3 )\n        ssl->handshake->update_checksum = ssl_update_checksum_md5sha1;\n    else\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA512_C)\n    if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 )\n        ssl->handshake->update_checksum = ssl_update_checksum_sha384;\n    else\n#endif\n#if defined(MBEDTLS_SHA256_C)\n    if( ciphersuite_info->mac != MBEDTLS_MD_SHA384 )\n        ssl->handshake->update_checksum = ssl_update_checksum_sha256;\n    else\n#endif\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n        return;\n    }\n}\n\nvoid mbedtls_ssl_reset_checksum( mbedtls_ssl_context *ssl )\n{\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n     mbedtls_md5_starts( &ssl->handshake->fin_md5  );\n    mbedtls_sha1_starts( &ssl->handshake->fin_sha1 );\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA256_C)\n    mbedtls_sha256_starts( &ssl->handshake->fin_sha256, 0 );\n#endif\n#if defined(MBEDTLS_SHA512_C)\n    mbedtls_sha512_starts( &ssl->handshake->fin_sha512, 1 );\n#endif\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n}\n\nstatic void ssl_update_checksum_start( mbedtls_ssl_context *ssl,\n                                       const unsigned char *buf, size_t len )\n{\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n     mbedtls_md5_update( &ssl->handshake->fin_md5 , buf, len );\n    mbedtls_sha1_update( &ssl->handshake->fin_sha1, buf, len );\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA256_C)\n    mbedtls_sha256_update( &ssl->handshake->fin_sha256, buf, len );\n#endif\n#if defined(MBEDTLS_SHA512_C)\n    mbedtls_sha512_update( &ssl->handshake->fin_sha512, buf, len );\n#endif\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n}\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\nstatic void ssl_update_checksum_md5sha1( mbedtls_ssl_context *ssl,\n                                         const unsigned char *buf, size_t len )\n{\n     mbedtls_md5_update( &ssl->handshake->fin_md5 , buf, len );\n    mbedtls_sha1_update( &ssl->handshake->fin_sha1, buf, len );\n}\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA256_C)\nstatic void ssl_update_checksum_sha256( mbedtls_ssl_context *ssl,\n                                        const unsigned char *buf, size_t len )\n{\n    mbedtls_sha256_update( &ssl->handshake->fin_sha256, buf, len );\n}\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\nstatic void ssl_update_checksum_sha384( mbedtls_ssl_context *ssl,\n                                        const unsigned char *buf, size_t len )\n{\n    mbedtls_sha512_update( &ssl->handshake->fin_sha512, buf, len );\n}\n#endif\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\nstatic void ssl_calc_finished_ssl(\n                mbedtls_ssl_context *ssl, unsigned char *buf, int from )\n{\n    const char *sender;\n    mbedtls_md5_context  md5;\n    mbedtls_sha1_context sha1;\n\n    unsigned char padbuf[48];\n    unsigned char md5sum[16];\n    unsigned char sha1sum[20];\n\n    mbedtls_ssl_session *session = ssl->session_negotiate;\n    if( !session )\n        session = ssl->session;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> calc  finished ssl\" ) );\n\n    mbedtls_md5_init( &md5 );\n    mbedtls_sha1_init( &sha1 );\n\n    mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );\n    mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );\n\n    /*\n     * SSLv3:\n     *   hash =\n     *      MD5( master + pad2 +\n     *          MD5( handshake + sender + master + pad1 ) )\n     *   + SHA1( master + pad2 +\n     *         SHA1( handshake + sender + master + pad1 ) )\n     */\n\n#if !defined(MBEDTLS_MD5_ALT)\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"finished  md5 state\", (unsigned char *)\n                    md5.state, sizeof(  md5.state ) );\n#endif\n\n#if !defined(MBEDTLS_SHA1_ALT)\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"finished sha1 state\", (unsigned char *)\n                   sha1.state, sizeof( sha1.state ) );\n#endif\n\n    sender = ( from == MBEDTLS_SSL_IS_CLIENT ) ? \"CLNT\"\n                                       : \"SRVR\";\n\n    memset( padbuf, 0x36, 48 );\n\n    mbedtls_md5_update( &md5, (const unsigned char *) sender, 4 );\n    mbedtls_md5_update( &md5, session->master, 48 );\n    mbedtls_md5_update( &md5, padbuf, 48 );\n    mbedtls_md5_finish( &md5, md5sum );\n\n    mbedtls_sha1_update( &sha1, (const unsigned char *) sender, 4 );\n    mbedtls_sha1_update( &sha1, session->master, 48 );\n    mbedtls_sha1_update( &sha1, padbuf, 40 );\n    mbedtls_sha1_finish( &sha1, sha1sum );\n\n    memset( padbuf, 0x5C, 48 );\n\n    mbedtls_md5_starts( &md5 );\n    mbedtls_md5_update( &md5, session->master, 48 );\n    mbedtls_md5_update( &md5, padbuf, 48 );\n    mbedtls_md5_update( &md5, md5sum, 16 );\n    mbedtls_md5_finish( &md5, buf );\n\n    mbedtls_sha1_starts( &sha1 );\n    mbedtls_sha1_update( &sha1, session->master, 48 );\n    mbedtls_sha1_update( &sha1, padbuf , 40 );\n    mbedtls_sha1_update( &sha1, sha1sum, 20 );\n    mbedtls_sha1_finish( &sha1, buf + 16 );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"calc finished result\", buf, 36 );\n\n    mbedtls_md5_free(  &md5  );\n    mbedtls_sha1_free( &sha1 );\n\n    mbedtls_zeroize(  padbuf, sizeof(  padbuf ) );\n    mbedtls_zeroize(  md5sum, sizeof(  md5sum ) );\n    mbedtls_zeroize( sha1sum, sizeof( sha1sum ) );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= calc  finished\" ) );\n}\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)\nstatic void ssl_calc_finished_tls(\n                mbedtls_ssl_context *ssl, unsigned char *buf, int from )\n{\n    int len = 12;\n    const char *sender;\n    mbedtls_md5_context  md5;\n    mbedtls_sha1_context sha1;\n    unsigned char padbuf[36];\n\n    mbedtls_ssl_session *session = ssl->session_negotiate;\n    if( !session )\n        session = ssl->session;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> calc  finished tls\" ) );\n\n    mbedtls_md5_init( &md5 );\n    mbedtls_sha1_init( &sha1 );\n\n    mbedtls_md5_clone( &md5, &ssl->handshake->fin_md5 );\n    mbedtls_sha1_clone( &sha1, &ssl->handshake->fin_sha1 );\n\n    /*\n     * TLSv1:\n     *   hash = PRF( master, finished_label,\n     *               MD5( handshake ) + SHA1( handshake ) )[0..11]\n     */\n\n#if !defined(MBEDTLS_MD5_ALT)\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"finished  md5 state\", (unsigned char *)\n                    md5.state, sizeof(  md5.state ) );\n#endif\n\n#if !defined(MBEDTLS_SHA1_ALT)\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"finished sha1 state\", (unsigned char *)\n                   sha1.state, sizeof( sha1.state ) );\n#endif\n\n    sender = ( from == MBEDTLS_SSL_IS_CLIENT )\n             ? \"client finished\"\n             : \"server finished\";\n\n    mbedtls_md5_finish(  &md5, padbuf );\n    mbedtls_sha1_finish( &sha1, padbuf + 16 );\n\n    ssl->handshake->tls_prf( session->master, 48, sender,\n                             padbuf, 36, buf, len );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"calc finished result\", buf, len );\n\n    mbedtls_md5_free(  &md5  );\n    mbedtls_sha1_free( &sha1 );\n\n    mbedtls_zeroize(  padbuf, sizeof(  padbuf ) );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= calc  finished\" ) );\n}\n#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA256_C)\nstatic void ssl_calc_finished_tls_sha256(\n                mbedtls_ssl_context *ssl, unsigned char *buf, int from )\n{\n    int len = 12;\n    const char *sender;\n    mbedtls_sha256_context sha256;\n    unsigned char padbuf[32];\n\n    mbedtls_ssl_session *session = ssl->session_negotiate;\n    if( !session )\n        session = ssl->session;\n\n    mbedtls_sha256_init( &sha256 );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> calc  finished tls sha256\" ) );\n\n    mbedtls_sha256_clone( &sha256, &ssl->handshake->fin_sha256 );\n\n    /*\n     * TLSv1.2:\n     *   hash = PRF( master, finished_label,\n     *               Hash( handshake ) )[0.11]\n     */\n\n#if !defined(MBEDTLS_SHA256_ALT)\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"finished sha2 state\", (unsigned char *)\n                   sha256.state, sizeof( sha256.state ) );\n#endif\n\n    sender = ( from == MBEDTLS_SSL_IS_CLIENT )\n             ? \"client finished\"\n             : \"server finished\";\n\n    mbedtls_sha256_finish( &sha256, padbuf );\n\n    ssl->handshake->tls_prf( session->master, 48, sender,\n                             padbuf, 32, buf, len );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"calc finished result\", buf, len );\n\n    mbedtls_sha256_free( &sha256 );\n\n    mbedtls_zeroize(  padbuf, sizeof(  padbuf ) );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= calc  finished\" ) );\n}\n#endif /* MBEDTLS_SHA256_C */\n\n#if defined(MBEDTLS_SHA512_C)\nstatic void ssl_calc_finished_tls_sha384(\n                mbedtls_ssl_context *ssl, unsigned char *buf, int from )\n{\n    int len = 12;\n    const char *sender;\n    mbedtls_sha512_context sha512;\n    unsigned char padbuf[48];\n\n    mbedtls_ssl_session *session = ssl->session_negotiate;\n    if( !session )\n        session = ssl->session;\n\n    mbedtls_sha512_init( &sha512 );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> calc  finished tls sha384\" ) );\n\n    mbedtls_sha512_clone( &sha512, &ssl->handshake->fin_sha512 );\n\n    /*\n     * TLSv1.2:\n     *   hash = PRF( master, finished_label,\n     *               Hash( handshake ) )[0.11]\n     */\n\n#if !defined(MBEDTLS_SHA512_ALT)\n    MBEDTLS_SSL_DEBUG_BUF( 4, \"finished sha512 state\", (unsigned char *)\n                   sha512.state, sizeof( sha512.state ) );\n#endif\n\n    sender = ( from == MBEDTLS_SSL_IS_CLIENT )\n             ? \"client finished\"\n             : \"server finished\";\n\n    mbedtls_sha512_finish( &sha512, padbuf );\n\n    ssl->handshake->tls_prf( session->master, 48, sender,\n                             padbuf, 48, buf, len );\n\n    MBEDTLS_SSL_DEBUG_BUF( 3, \"calc finished result\", buf, len );\n\n    mbedtls_sha512_free( &sha512 );\n\n    mbedtls_zeroize(  padbuf, sizeof( padbuf ) );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= calc  finished\" ) );\n}\n#endif /* MBEDTLS_SHA512_C */\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\nstatic void ssl_handshake_wrapup_free_hs_transform( mbedtls_ssl_context *ssl )\n{\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"=> handshake wrapup: final free\" ) );\n\n    /*\n     * Free our handshake params\n     */\n    mbedtls_ssl_handshake_free( ssl->handshake );\n    mbedtls_free( ssl->handshake );\n    ssl->handshake = NULL;\n\n    /*\n     * Free the previous transform and swith in the current one\n     */\n    if( ssl->transform )\n    {\n        mbedtls_ssl_transform_free( ssl->transform );\n        mbedtls_free( ssl->transform );\n    }\n    ssl->transform = ssl->transform_negotiate;\n    ssl->transform_negotiate = NULL;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"<= handshake wrapup: final free\" ) );\n}\n\nvoid mbedtls_ssl_handshake_wrapup( mbedtls_ssl_context *ssl )\n{\n    int resume = ssl->handshake->resume;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"=> handshake wrapup\" ) );\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )\n    {\n        ssl->renego_status =  MBEDTLS_SSL_RENEGOTIATION_DONE;\n        ssl->renego_records_seen = 0;\n    }\n#endif\n\n    /*\n     * Free the previous session and switch in the current one\n     */\n    if( ssl->session )\n    {\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n        /* RFC 7366 3.1: keep the EtM state */\n        ssl->session_negotiate->encrypt_then_mac =\n                  ssl->session->encrypt_then_mac;\n#endif\n\n        mbedtls_ssl_session_free( ssl->session );\n        mbedtls_free( ssl->session );\n    }\n    ssl->session = ssl->session_negotiate;\n    ssl->session_negotiate = NULL;\n\n    /*\n     * Add cache entry\n     */\n    if( ssl->conf->f_set_cache != NULL &&\n        ssl->session->id_len != 0 &&\n        resume == 0 )\n    {\n        if( ssl->conf->f_set_cache( ssl->conf->p_cache, ssl->session ) != 0 )\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"cache did not store session\" ) );\n    }\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ssl->handshake->flight != NULL )\n    {\n        /* Cancel handshake timer */\n        ssl_set_timer( ssl, 0 );\n\n        /* Keep last flight around in case we need to resend it:\n         * we need the handshake and transform structures for that */\n        MBEDTLS_SSL_DEBUG_MSG( 3, ( \"skip freeing handshake and transform\" ) );\n    }\n    else\n#endif\n        ssl_handshake_wrapup_free_hs_transform( ssl );\n\n    ssl->state++;\n\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"<= handshake wrapup\" ) );\n}\n\nint mbedtls_ssl_write_finished( mbedtls_ssl_context *ssl )\n{\n    int ret, hash_len;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write finished\" ) );\n\n    /*\n     * Set the out_msg pointer to the correct location based on IV length\n     */\n    if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_2 )\n    {\n        ssl->out_msg = ssl->out_iv + ssl->transform_negotiate->ivlen -\n                       ssl->transform_negotiate->fixed_ivlen;\n    }\n    else\n        ssl->out_msg = ssl->out_iv;\n\n    ssl->handshake->calc_finished( ssl, ssl->out_msg + 4, ssl->conf->endpoint );\n\n    /*\n     * RFC 5246 7.4.9 (Page 63) says 12 is the default length and ciphersuites\n     * may define some other value. Currently (early 2016), no defined\n     * ciphersuite does this (and this is unlikely to change as activity has\n     * moved to TLS 1.3 now) so we can keep the hardcoded 12 here.\n     */\n    hash_len = ( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 ) ? 36 : 12;\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    ssl->verify_data_len = hash_len;\n    memcpy( ssl->own_verify_data, ssl->out_msg + 4, hash_len );\n#endif\n\n    ssl->out_msglen  = 4 + hash_len;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_FINISHED;\n\n    /*\n     * In case of session resuming, invert the client and server\n     * ChangeCipherSpec messages order.\n     */\n    if( ssl->handshake->resume != 0 )\n    {\n#if defined(MBEDTLS_SSL_CLI_C)\n        if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )\n            ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;\n#endif\n#if defined(MBEDTLS_SSL_SRV_C)\n        if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )\n            ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;\n#endif\n    }\n    else\n        ssl->state++;\n\n    /*\n     * Switch to our negotiated transform and session parameters for outbound\n     * data.\n     */\n    MBEDTLS_SSL_DEBUG_MSG( 3, ( \"switching to new transform spec for outbound data\" ) );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        unsigned char i;\n\n        /* Remember current epoch settings for resending */\n        ssl->handshake->alt_transform_out = ssl->transform_out;\n        memcpy( ssl->handshake->alt_out_ctr, ssl->out_ctr, 8 );\n\n        /* Set sequence_number to zero */\n        memset( ssl->out_ctr + 2, 0, 6 );\n\n        /* Increment epoch */\n        for( i = 2; i > 0; i-- )\n            if( ++ssl->out_ctr[i - 1] != 0 )\n                break;\n\n        /* The loop goes to its end iff the counter is wrapping */\n        if( i == 0 )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"DTLS epoch would wrap\" ) );\n            return( MBEDTLS_ERR_SSL_COUNTER_WRAPPING );\n        }\n    }\n    else\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n    memset( ssl->out_ctr, 0, 8 );\n\n    ssl->transform_out = ssl->transform_negotiate;\n    ssl->session_out = ssl->session_negotiate;\n\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\n    if( mbedtls_ssl_hw_record_activate != NULL )\n    {\n        if( ( ret = mbedtls_ssl_hw_record_activate( ssl, MBEDTLS_SSL_CHANNEL_OUTBOUND ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_hw_record_activate\", ret );\n            return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );\n        }\n    }\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        mbedtls_ssl_send_flight_completed( ssl );\n#endif\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write finished\" ) );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n#define SSL_MAX_HASH_LEN 36\n#else\n#define SSL_MAX_HASH_LEN 12\n#endif\n\nint mbedtls_ssl_parse_finished( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    unsigned int hash_len;\n    unsigned char buf[SSL_MAX_HASH_LEN];\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> parse finished\" ) );\n\n    ssl->handshake->calc_finished( ssl, buf, ssl->conf->endpoint ^ 1 );\n\n    if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n        return( ret );\n    }\n\n    if( ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad finished message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );\n        return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n    }\n\n    /* There is currently no ciphersuite using another length with TLS 1.2 */\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n    if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n        hash_len = 36;\n    else\n#endif\n        hash_len = 12;\n\n    if( ssl->in_msg[0] != MBEDTLS_SSL_HS_FINISHED ||\n        ssl->in_hslen  != mbedtls_ssl_hs_hdr_len( ssl ) + hash_len )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad finished message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED );\n    }\n\n    if( mbedtls_ssl_safer_memcmp( ssl->in_msg + mbedtls_ssl_hs_hdr_len( ssl ),\n                      buf, hash_len ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad finished message\" ) );\n        mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                        MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR );\n        return( MBEDTLS_ERR_SSL_BAD_HS_FINISHED );\n    }\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    ssl->verify_data_len = hash_len;\n    memcpy( ssl->peer_verify_data, buf, hash_len );\n#endif\n\n    if( ssl->handshake->resume != 0 )\n    {\n#if defined(MBEDTLS_SSL_CLI_C)\n        if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )\n            ssl->state = MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC;\n#endif\n#if defined(MBEDTLS_SSL_SRV_C)\n        if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )\n            ssl->state = MBEDTLS_SSL_HANDSHAKE_WRAPUP;\n#endif\n    }\n    else\n        ssl->state++;\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        mbedtls_ssl_recv_flight_completed( ssl );\n#endif\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= parse finished\" ) );\n\n    return( 0 );\n}\n\nstatic void ssl_handshake_params_init( mbedtls_ssl_handshake_params *handshake )\n{\n    memset( handshake, 0, sizeof( mbedtls_ssl_handshake_params ) );\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n     mbedtls_md5_init(   &handshake->fin_md5  );\n    mbedtls_sha1_init(   &handshake->fin_sha1 );\n     mbedtls_md5_starts( &handshake->fin_md5  );\n    mbedtls_sha1_starts( &handshake->fin_sha1 );\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA256_C)\n    mbedtls_sha256_init(   &handshake->fin_sha256    );\n    mbedtls_sha256_starts( &handshake->fin_sha256, 0 );\n#endif\n#if defined(MBEDTLS_SHA512_C)\n    mbedtls_sha512_init(   &handshake->fin_sha512    );\n    mbedtls_sha512_starts( &handshake->fin_sha512, 1 );\n#endif\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\n    handshake->update_checksum = ssl_update_checksum_start;\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n    mbedtls_ssl_sig_hash_set_init( &handshake->hash_algs );\n#endif\n\n#if defined(MBEDTLS_DHM_C)\n    mbedtls_dhm_init( &handshake->dhm_ctx );\n#endif\n#if defined(MBEDTLS_ECDH_C)\n    mbedtls_ecdh_init( &handshake->ecdh_ctx );\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    mbedtls_ecjpake_init( &handshake->ecjpake_ctx );\n#if defined(MBEDTLS_SSL_CLI_C)\n    handshake->ecjpake_cache = NULL;\n    handshake->ecjpake_cache_len = 0;\n#endif\n#endif\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n    handshake->sni_authmode = MBEDTLS_SSL_VERIFY_UNSET;\n#endif\n}\n\nstatic void ssl_transform_init( mbedtls_ssl_transform *transform )\n{\n    memset( transform, 0, sizeof(mbedtls_ssl_transform) );\n\n    mbedtls_cipher_init( &transform->cipher_ctx_enc );\n    mbedtls_cipher_init( &transform->cipher_ctx_dec );\n\n    mbedtls_md_init( &transform->md_ctx_enc );\n    mbedtls_md_init( &transform->md_ctx_dec );\n}\n\nvoid mbedtls_ssl_session_init( mbedtls_ssl_session *session )\n{\n    memset( session, 0, sizeof(mbedtls_ssl_session) );\n}\n\nstatic int ssl_handshake_init( mbedtls_ssl_context *ssl )\n{\n    /* Clear old handshake information if present */\n    if( ssl->transform_negotiate )\n        mbedtls_ssl_transform_free( ssl->transform_negotiate );\n    if( ssl->session_negotiate )\n        mbedtls_ssl_session_free( ssl->session_negotiate );\n    if( ssl->handshake )\n        mbedtls_ssl_handshake_free( ssl->handshake );\n\n    /*\n     * Either the pointers are now NULL or cleared properly and can be freed.\n     * Now allocate missing structures.\n     */\n    if( ssl->transform_negotiate == NULL )\n    {\n        ssl->transform_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_transform) );\n    }\n\n    if( ssl->session_negotiate == NULL )\n    {\n        ssl->session_negotiate = mbedtls_calloc( 1, sizeof(mbedtls_ssl_session) );\n    }\n\n    if( ssl->handshake == NULL )\n    {\n        ssl->handshake = mbedtls_calloc( 1, sizeof(mbedtls_ssl_handshake_params) );\n    }\n\n    /* All pointers should exist and can be directly freed without issue */\n    if( ssl->handshake == NULL ||\n        ssl->transform_negotiate == NULL ||\n        ssl->session_negotiate == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"alloc() of ssl sub-contexts failed\" ) );\n\n        mbedtls_free( ssl->handshake );\n        mbedtls_free( ssl->transform_negotiate );\n        mbedtls_free( ssl->session_negotiate );\n\n        ssl->handshake = NULL;\n        ssl->transform_negotiate = NULL;\n        ssl->session_negotiate = NULL;\n\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n    }\n\n    /* Initialize structures */\n    mbedtls_ssl_session_init( ssl->session_negotiate );\n    ssl_transform_init( ssl->transform_negotiate );\n    ssl_handshake_params_init( ssl->handshake );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        ssl->handshake->alt_transform_out = ssl->transform_out;\n\n        if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )\n            ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_PREPARING;\n        else\n            ssl->handshake->retransmit_state = MBEDTLS_SSL_RETRANS_WAITING;\n\n        ssl_set_timer( ssl, 0 );\n    }\n#endif\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)\n/* Dummy cookie callbacks for defaults */\nstatic int ssl_cookie_write_dummy( void *ctx,\n                      unsigned char **p, unsigned char *end,\n                      const unsigned char *cli_id, size_t cli_id_len )\n{\n    ((void) ctx);\n    ((void) p);\n    ((void) end);\n    ((void) cli_id);\n    ((void) cli_id_len);\n\n    return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );\n}\n\nstatic int ssl_cookie_check_dummy( void *ctx,\n                      const unsigned char *cookie, size_t cookie_len,\n                      const unsigned char *cli_id, size_t cli_id_len )\n{\n    ((void) ctx);\n    ((void) cookie);\n    ((void) cookie_len);\n    ((void) cli_id);\n    ((void) cli_id_len);\n\n    return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );\n}\n#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY && MBEDTLS_SSL_SRV_C */\n\n/*\n * Initialize an SSL context\n */\nvoid mbedtls_ssl_init( mbedtls_ssl_context *ssl )\n{\n    memset( ssl, 0, sizeof( mbedtls_ssl_context ) );\n}\n\n/*\n * Setup an SSL context\n */\nint mbedtls_ssl_setup( mbedtls_ssl_context *ssl,\n                       mbedtls_ssl_config *conf )\n{\n    int ret;\n    const size_t len = MBEDTLS_SSL_BUFFER_LEN;\n\n    ssl->conf = conf;\n\n    /*\n     * Prepare base structures\n     */\n    if( ( ssl-> in_buf = mbedtls_calloc( 1, len ) ) == NULL ||\n        ( ssl->out_buf = mbedtls_calloc( 1, len ) ) == NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 1, ( \"alloc(%d bytes) failed\", len ) );\n        mbedtls_free( ssl->in_buf );\n        ssl->in_buf = NULL;\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n    }\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        ssl->out_hdr = ssl->out_buf;\n        ssl->out_ctr = ssl->out_buf +  3;\n        ssl->out_len = ssl->out_buf + 11;\n        ssl->out_iv  = ssl->out_buf + 13;\n        ssl->out_msg = ssl->out_buf + 13;\n\n        ssl->in_hdr = ssl->in_buf;\n        ssl->in_ctr = ssl->in_buf +  3;\n        ssl->in_len = ssl->in_buf + 11;\n        ssl->in_iv  = ssl->in_buf + 13;\n        ssl->in_msg = ssl->in_buf + 13;\n    }\n    else\n#endif\n    {\n        ssl->out_ctr = ssl->out_buf;\n        ssl->out_hdr = ssl->out_buf +  8;\n        ssl->out_len = ssl->out_buf + 11;\n        ssl->out_iv  = ssl->out_buf + 13;\n        ssl->out_msg = ssl->out_buf + 13;\n\n        ssl->in_ctr = ssl->in_buf;\n        ssl->in_hdr = ssl->in_buf +  8;\n        ssl->in_len = ssl->in_buf + 11;\n        ssl->in_iv  = ssl->in_buf + 13;\n        ssl->in_msg = ssl->in_buf + 13;\n    }\n\n    if( ( ret = ssl_handshake_init( ssl ) ) != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\n/*\n * Reset an initialized and used SSL context for re-use while retaining\n * all application-set variables, function pointers and data.\n *\n * If partial is non-zero, keep data in the input buffer and client ID.\n * (Use when a DTLS client reconnects from the same port.)\n */\nstatic int ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial )\n{\n    int ret;\n\n    ssl->state = MBEDTLS_SSL_HELLO_REQUEST;\n\n    /* Cancel any possibly running timer */\n    ssl_set_timer( ssl, 0 );\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    ssl->renego_status = MBEDTLS_SSL_INITIAL_HANDSHAKE;\n    ssl->renego_records_seen = 0;\n\n    ssl->verify_data_len = 0;\n    memset( ssl->own_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );\n    memset( ssl->peer_verify_data, 0, MBEDTLS_SSL_VERIFY_DATA_MAX_LEN );\n#endif\n    ssl->secure_renegotiation = MBEDTLS_SSL_LEGACY_RENEGOTIATION;\n\n    ssl->in_offt = NULL;\n\n    ssl->in_msg = ssl->in_buf + 13;\n    ssl->in_msgtype = 0;\n    ssl->in_msglen = 0;\n    if( partial == 0 )\n        ssl->in_left = 0;\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    ssl->next_record_offset = 0;\n    ssl->in_epoch = 0;\n#endif\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n    ssl_dtls_replay_reset( ssl );\n#endif\n\n    ssl->in_hslen = 0;\n    ssl->nb_zero = 0;\n\n    ssl->keep_current_message = 0;\n\n    ssl->out_msg = ssl->out_buf + 13;\n    ssl->out_msgtype = 0;\n    ssl->out_msglen = 0;\n    ssl->out_left = 0;\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\n    if( ssl->split_done != MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED )\n        ssl->split_done = 0;\n#endif\n\n    ssl->transform_in = NULL;\n    ssl->transform_out = NULL;\n\n    memset( ssl->out_buf, 0, MBEDTLS_SSL_BUFFER_LEN );\n    if( partial == 0 )\n        memset( ssl->in_buf, 0, MBEDTLS_SSL_BUFFER_LEN );\n\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\n    if( mbedtls_ssl_hw_record_reset != NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"going for mbedtls_ssl_hw_record_reset()\" ) );\n        if( ( ret = mbedtls_ssl_hw_record_reset( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_hw_record_reset\", ret );\n            return( MBEDTLS_ERR_SSL_HW_ACCEL_FAILED );\n        }\n    }\n#endif\n\n    if( ssl->transform )\n    {\n        mbedtls_ssl_transform_free( ssl->transform );\n        mbedtls_free( ssl->transform );\n        ssl->transform = NULL;\n    }\n\n    if( ssl->session )\n    {\n        mbedtls_ssl_session_free( ssl->session );\n        mbedtls_free( ssl->session );\n        ssl->session = NULL;\n    }\n\n#if defined(MBEDTLS_SSL_ALPN)\n    ssl->alpn_chosen = NULL;\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)\n    if( partial == 0 )\n    {\n        mbedtls_free( ssl->cli_id );\n        ssl->cli_id = NULL;\n        ssl->cli_id_len = 0;\n    }\n#endif\n\n    if( ( ret = ssl_handshake_init( ssl ) ) != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\n/*\n * Reset an initialized and used SSL context for re-use while retaining\n * all application-set variables, function pointers and data.\n */\nint mbedtls_ssl_session_reset( mbedtls_ssl_context *ssl )\n{\n    return( ssl_session_reset_int( ssl, 0 ) );\n}\n\n/*\n * SSL set accessors\n */\nvoid mbedtls_ssl_conf_endpoint( mbedtls_ssl_config *conf, int endpoint )\n{\n    conf->endpoint   = endpoint;\n}\n\nvoid mbedtls_ssl_conf_transport( mbedtls_ssl_config *conf, int transport )\n{\n    conf->transport = transport;\n}\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\nvoid mbedtls_ssl_conf_dtls_anti_replay( mbedtls_ssl_config *conf, char mode )\n{\n    conf->anti_replay = mode;\n}\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)\nvoid mbedtls_ssl_conf_dtls_badmac_limit( mbedtls_ssl_config *conf, unsigned limit )\n{\n    conf->badmac_limit = limit;\n}\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\nvoid mbedtls_ssl_conf_handshake_timeout( mbedtls_ssl_config *conf, uint32_t min, uint32_t max )\n{\n    conf->hs_timeout_min = min;\n    conf->hs_timeout_max = max;\n}\n#endif\n\nvoid mbedtls_ssl_conf_authmode( mbedtls_ssl_config *conf, int authmode )\n{\n    conf->authmode   = authmode;\n}\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\nvoid mbedtls_ssl_conf_verify( mbedtls_ssl_config *conf,\n                     int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),\n                     void *p_vrfy )\n{\n    conf->f_vrfy      = f_vrfy;\n    conf->p_vrfy      = p_vrfy;\n}\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\nvoid mbedtls_ssl_conf_rng( mbedtls_ssl_config *conf,\n                  int (*f_rng)(void *, unsigned char *, size_t),\n                  void *p_rng )\n{\n    conf->f_rng      = f_rng;\n    conf->p_rng      = p_rng;\n}\n\nvoid mbedtls_ssl_conf_dbg( mbedtls_ssl_config *conf,\n                  void (*f_dbg)(void *, int, const char *, int, const char *),\n                  void  *p_dbg )\n{\n    conf->f_dbg      = f_dbg;\n    conf->p_dbg      = p_dbg;\n}\n\nvoid mbedtls_ssl_set_bio( mbedtls_ssl_context *ssl,\n        void *p_bio,\n        mbedtls_ssl_send_t *f_send,\n        mbedtls_ssl_recv_t *f_recv,\n        mbedtls_ssl_recv_timeout_t *f_recv_timeout )\n{\n    ssl->p_bio          = p_bio;\n    ssl->f_send         = f_send;\n    ssl->f_recv         = f_recv;\n    ssl->f_recv_timeout = f_recv_timeout;\n}\n\nvoid mbedtls_ssl_conf_read_timeout( mbedtls_ssl_config *conf, uint32_t timeout )\n{\n    conf->read_timeout   = timeout;\n}\n\nvoid mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl,\n                               void *p_timer,\n                               mbedtls_ssl_set_timer_t *f_set_timer,\n                               mbedtls_ssl_get_timer_t *f_get_timer )\n{\n    ssl->p_timer        = p_timer;\n    ssl->f_set_timer    = f_set_timer;\n    ssl->f_get_timer    = f_get_timer;\n\n    /* Make sure we start with no timer running */\n    ssl_set_timer( ssl, 0 );\n}\n\n#if defined(MBEDTLS_SSL_SRV_C)\nvoid mbedtls_ssl_conf_session_cache( mbedtls_ssl_config *conf,\n        void *p_cache,\n        int (*f_get_cache)(void *, mbedtls_ssl_session *),\n        int (*f_set_cache)(void *, const mbedtls_ssl_session *) )\n{\n    conf->p_cache = p_cache;\n    conf->f_get_cache = f_get_cache;\n    conf->f_set_cache = f_set_cache;\n}\n#endif /* MBEDTLS_SSL_SRV_C */\n\n#if defined(MBEDTLS_SSL_CLI_C)\nint mbedtls_ssl_set_session( mbedtls_ssl_context *ssl, const mbedtls_ssl_session *session )\n{\n    int ret;\n\n    if( ssl == NULL ||\n        session == NULL ||\n        ssl->session_negotiate == NULL ||\n        ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )\n    {\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    if( ( ret = ssl_session_copy( ssl->session_negotiate, session ) ) != 0 )\n        return( ret );\n\n    ssl->handshake->resume = 1;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_CLI_C */\n\nvoid mbedtls_ssl_conf_ciphersuites( mbedtls_ssl_config *conf,\n                                   const int *ciphersuites )\n{\n    conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] = ciphersuites;\n    conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] = ciphersuites;\n    conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] = ciphersuites;\n    conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] = ciphersuites;\n}\n\nvoid mbedtls_ssl_conf_ciphersuites_for_version( mbedtls_ssl_config *conf,\n                                       const int *ciphersuites,\n                                       int major, int minor )\n{\n    if( major != MBEDTLS_SSL_MAJOR_VERSION_3 )\n        return;\n\n    if( minor < MBEDTLS_SSL_MINOR_VERSION_0 || minor > MBEDTLS_SSL_MINOR_VERSION_3 )\n        return;\n\n    conf->ciphersuite_list[minor] = ciphersuites;\n}\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\nvoid mbedtls_ssl_conf_cert_profile( mbedtls_ssl_config *conf,\n                                    const mbedtls_x509_crt_profile *profile )\n{\n    conf->cert_profile = profile;\n}\n\n/* Append a new keycert entry to a (possibly empty) list */\nstatic int ssl_append_key_cert( mbedtls_ssl_key_cert **head,\n                                mbedtls_x509_crt *cert,\n                                mbedtls_pk_context *key )\n{\n    mbedtls_ssl_key_cert *new;\n\n    new = mbedtls_calloc( 1, sizeof( mbedtls_ssl_key_cert ) );\n    if( new == NULL )\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n\n    new->cert = cert;\n    new->key  = key;\n    new->next = NULL;\n\n    /* Update head is the list was null, else add to the end */\n    if( *head == NULL )\n    {\n        *head = new;\n    }\n    else\n    {\n        mbedtls_ssl_key_cert *cur = *head;\n        while( cur->next != NULL )\n            cur = cur->next;\n        cur->next = new;\n    }\n\n    return( 0 );\n}\n\nint mbedtls_ssl_conf_own_cert( mbedtls_ssl_config *conf,\n                              mbedtls_x509_crt *own_cert,\n                              mbedtls_pk_context *pk_key )\n{\n    return( ssl_append_key_cert( &conf->key_cert, own_cert, pk_key ) );\n}\n\nvoid mbedtls_ssl_conf_ca_chain( mbedtls_ssl_config *conf,\n                               mbedtls_x509_crt *ca_chain,\n                               mbedtls_x509_crl *ca_crl )\n{\n    conf->ca_chain   = ca_chain;\n    conf->ca_crl     = ca_crl;\n}\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\nint mbedtls_ssl_set_hs_own_cert( mbedtls_ssl_context *ssl,\n                                 mbedtls_x509_crt *own_cert,\n                                 mbedtls_pk_context *pk_key )\n{\n    return( ssl_append_key_cert( &ssl->handshake->sni_key_cert,\n                                 own_cert, pk_key ) );\n}\n\nvoid mbedtls_ssl_set_hs_ca_chain( mbedtls_ssl_context *ssl,\n                                  mbedtls_x509_crt *ca_chain,\n                                  mbedtls_x509_crl *ca_crl )\n{\n    ssl->handshake->sni_ca_chain   = ca_chain;\n    ssl->handshake->sni_ca_crl     = ca_crl;\n}\n\nvoid mbedtls_ssl_set_hs_authmode( mbedtls_ssl_context *ssl,\n                                  int authmode )\n{\n    ssl->handshake->sni_authmode = authmode;\n}\n#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n/*\n * Set EC J-PAKE password for current handshake\n */\nint mbedtls_ssl_set_hs_ecjpake_password( mbedtls_ssl_context *ssl,\n                                         const unsigned char *pw,\n                                         size_t pw_len )\n{\n    mbedtls_ecjpake_role role;\n\n    if( ssl->handshake == NULL || ssl->conf == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )\n        role = MBEDTLS_ECJPAKE_SERVER;\n    else\n        role = MBEDTLS_ECJPAKE_CLIENT;\n\n    return( mbedtls_ecjpake_setup( &ssl->handshake->ecjpake_ctx,\n                                   role,\n                                   MBEDTLS_MD_SHA256,\n                                   MBEDTLS_ECP_DP_SECP256R1,\n                                   pw, pw_len ) );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\nint mbedtls_ssl_conf_psk( mbedtls_ssl_config *conf,\n                const unsigned char *psk, size_t psk_len,\n                const unsigned char *psk_identity, size_t psk_identity_len )\n{\n    if( psk == NULL || psk_identity == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    if( psk_len > MBEDTLS_PSK_MAX_LEN )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    /* Identity len will be encoded on two bytes */\n    if( ( psk_identity_len >> 16 ) != 0 ||\n        psk_identity_len > MBEDTLS_SSL_MAX_CONTENT_LEN )\n    {\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    if( conf->psk != NULL || conf->psk_identity != NULL )\n    {\n        mbedtls_free( conf->psk );\n        mbedtls_free( conf->psk_identity );\n        conf->psk = NULL;\n        conf->psk_identity = NULL;\n    }\n\n    if( ( conf->psk = mbedtls_calloc( 1, psk_len ) ) == NULL ||\n        ( conf->psk_identity = mbedtls_calloc( 1, psk_identity_len ) ) == NULL )\n    {\n        mbedtls_free( conf->psk );\n        mbedtls_free( conf->psk_identity );\n        conf->psk = NULL;\n        conf->psk_identity = NULL;\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n    }\n\n    conf->psk_len = psk_len;\n    conf->psk_identity_len = psk_identity_len;\n\n    memcpy( conf->psk, psk, conf->psk_len );\n    memcpy( conf->psk_identity, psk_identity, conf->psk_identity_len );\n\n    return( 0 );\n}\n\nint mbedtls_ssl_set_hs_psk( mbedtls_ssl_context *ssl,\n                            const unsigned char *psk, size_t psk_len )\n{\n    if( psk == NULL || ssl->handshake == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    if( psk_len > MBEDTLS_PSK_MAX_LEN )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    if( ssl->handshake->psk != NULL )\n        mbedtls_free( ssl->handshake->psk );\n\n    if( ( ssl->handshake->psk = mbedtls_calloc( 1, psk_len ) ) == NULL )\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n\n    ssl->handshake->psk_len = psk_len;\n    memcpy( ssl->handshake->psk, psk, ssl->handshake->psk_len );\n\n    return( 0 );\n}\n\nvoid mbedtls_ssl_conf_psk_cb( mbedtls_ssl_config *conf,\n                     int (*f_psk)(void *, mbedtls_ssl_context *, const unsigned char *,\n                     size_t),\n                     void *p_psk )\n{\n    conf->f_psk = f_psk;\n    conf->p_psk = p_psk;\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)\nint mbedtls_ssl_conf_dh_param( mbedtls_ssl_config *conf, const char *dhm_P, const char *dhm_G )\n{\n    int ret;\n\n    if( ( ret = mbedtls_mpi_read_string( &conf->dhm_P, 16, dhm_P ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_string( &conf->dhm_G, 16, dhm_G ) ) != 0 )\n    {\n        mbedtls_mpi_free( &conf->dhm_P );\n        mbedtls_mpi_free( &conf->dhm_G );\n        return( ret );\n    }\n\n    return( 0 );\n}\n\nint mbedtls_ssl_conf_dh_param_ctx( mbedtls_ssl_config *conf, mbedtls_dhm_context *dhm_ctx )\n{\n    int ret;\n\n    if( ( ret = mbedtls_mpi_copy( &conf->dhm_P, &dhm_ctx->P ) ) != 0 ||\n        ( ret = mbedtls_mpi_copy( &conf->dhm_G, &dhm_ctx->G ) ) != 0 )\n    {\n        mbedtls_mpi_free( &conf->dhm_P );\n        mbedtls_mpi_free( &conf->dhm_G );\n        return( ret );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_SRV_C */\n\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)\n/*\n * Set the minimum length for Diffie-Hellman parameters\n */\nvoid mbedtls_ssl_conf_dhm_min_bitlen( mbedtls_ssl_config *conf,\n                                      unsigned int bitlen )\n{\n    conf->dhm_min_bitlen = bitlen;\n}\n#endif /* MBEDTLS_DHM_C && MBEDTLS_SSL_CLI_C */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n/*\n * Set allowed/preferred hashes for handshake signatures\n */\nvoid mbedtls_ssl_conf_sig_hashes( mbedtls_ssl_config *conf,\n                                  const int *hashes )\n{\n    conf->sig_hashes = hashes;\n}\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n/*\n * Set the allowed elliptic curves\n */\nvoid mbedtls_ssl_conf_curves( mbedtls_ssl_config *conf,\n                             const mbedtls_ecp_group_id *curve_list )\n{\n    conf->curve_list = curve_list;\n}\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\nint mbedtls_ssl_set_hostname( mbedtls_ssl_context *ssl, const char *hostname )\n{\n    size_t hostname_len;\n\n    if( hostname == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    hostname_len = strlen( hostname );\n\n    if( hostname_len + 1 == 0 )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    if( hostname_len > MBEDTLS_SSL_MAX_HOST_NAME_LEN )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    ssl->hostname = mbedtls_calloc( 1, hostname_len + 1 );\n\n    if( ssl->hostname == NULL )\n        return( MBEDTLS_ERR_SSL_ALLOC_FAILED );\n\n    memcpy( ssl->hostname, hostname, hostname_len );\n\n    ssl->hostname[hostname_len] = '\\0';\n\n    return( 0 );\n}\n#endif\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\nvoid mbedtls_ssl_conf_sni( mbedtls_ssl_config *conf,\n                  int (*f_sni)(void *, mbedtls_ssl_context *,\n                                const unsigned char *, size_t),\n                  void *p_sni )\n{\n    conf->f_sni = f_sni;\n    conf->p_sni = p_sni;\n}\n#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */\n\n#if defined(MBEDTLS_SSL_ALPN)\nint mbedtls_ssl_conf_alpn_protocols( mbedtls_ssl_config *conf, const char **protos )\n{\n    size_t cur_len, tot_len;\n    const char **p;\n\n    /*\n     * RFC 7301 3.1: \"Empty strings MUST NOT be included and byte strings\n     * MUST NOT be truncated.\"\n     * We check lengths now rather than later.\n     */\n    tot_len = 0;\n    for( p = protos; *p != NULL; p++ )\n    {\n        cur_len = strlen( *p );\n        tot_len += cur_len;\n\n        if( cur_len == 0 || cur_len > 255 || tot_len > 65535 )\n            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    conf->alpn_list = protos;\n\n    return( 0 );\n}\n\nconst char *mbedtls_ssl_get_alpn_protocol( const mbedtls_ssl_context *ssl )\n{\n    return( ssl->alpn_chosen );\n}\n#endif /* MBEDTLS_SSL_ALPN */\n\nvoid mbedtls_ssl_conf_max_version( mbedtls_ssl_config *conf, int major, int minor )\n{\n    conf->max_major_ver = major;\n    conf->max_minor_ver = minor;\n}\n\nvoid mbedtls_ssl_conf_min_version( mbedtls_ssl_config *conf, int major, int minor )\n{\n    conf->min_major_ver = major;\n    conf->min_minor_ver = minor;\n}\n\n#if defined(MBEDTLS_SSL_FALLBACK_SCSV) && defined(MBEDTLS_SSL_CLI_C)\nvoid mbedtls_ssl_conf_fallback( mbedtls_ssl_config *conf, char fallback )\n{\n    conf->fallback = fallback;\n}\n#endif\n\n#if defined(MBEDTLS_SSL_SRV_C)\nvoid mbedtls_ssl_conf_cert_req_ca_list( mbedtls_ssl_config *conf,\n                                          char cert_req_ca_list )\n{\n    conf->cert_req_ca_list = cert_req_ca_list;\n}\n#endif\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\nvoid mbedtls_ssl_conf_encrypt_then_mac( mbedtls_ssl_config *conf, char etm )\n{\n    conf->encrypt_then_mac = etm;\n}\n#endif\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\nvoid mbedtls_ssl_conf_extended_master_secret( mbedtls_ssl_config *conf, char ems )\n{\n    conf->extended_ms = ems;\n}\n#endif\n\n#if defined(MBEDTLS_ARC4_C)\nvoid mbedtls_ssl_conf_arc4_support( mbedtls_ssl_config *conf, char arc4 )\n{\n    conf->arc4_disabled = arc4;\n}\n#endif\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\nint mbedtls_ssl_conf_max_frag_len( mbedtls_ssl_config *conf, unsigned char mfl_code )\n{\n    if( mfl_code >= MBEDTLS_SSL_MAX_FRAG_LEN_INVALID ||\n        mfl_code_to_length[mfl_code] > MBEDTLS_SSL_MAX_CONTENT_LEN )\n    {\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    conf->mfl_code = mfl_code;\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\nvoid mbedtls_ssl_conf_truncated_hmac( mbedtls_ssl_config *conf, int truncate )\n{\n    conf->trunc_hmac = truncate;\n}\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\nvoid mbedtls_ssl_conf_cbc_record_splitting( mbedtls_ssl_config *conf, char split )\n{\n    conf->cbc_record_splitting = split;\n}\n#endif\n\nvoid mbedtls_ssl_conf_legacy_renegotiation( mbedtls_ssl_config *conf, int allow_legacy )\n{\n    conf->allow_legacy_renegotiation = allow_legacy;\n}\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\nvoid mbedtls_ssl_conf_renegotiation( mbedtls_ssl_config *conf, int renegotiation )\n{\n    conf->disable_renegotiation = renegotiation;\n}\n\nvoid mbedtls_ssl_conf_renegotiation_enforced( mbedtls_ssl_config *conf, int max_records )\n{\n    conf->renego_max_records = max_records;\n}\n\nvoid mbedtls_ssl_conf_renegotiation_period( mbedtls_ssl_config *conf,\n                                   const unsigned char period[8] )\n{\n    memcpy( conf->renego_period, period, 8 );\n}\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n#if defined(MBEDTLS_SSL_CLI_C)\nvoid mbedtls_ssl_conf_session_tickets( mbedtls_ssl_config *conf, int use_tickets )\n{\n    conf->session_tickets = use_tickets;\n}\n#endif\n\n#if defined(MBEDTLS_SSL_SRV_C)\nvoid mbedtls_ssl_conf_session_tickets_cb( mbedtls_ssl_config *conf,\n        mbedtls_ssl_ticket_write_t *f_ticket_write,\n        mbedtls_ssl_ticket_parse_t *f_ticket_parse,\n        void *p_ticket )\n{\n    conf->f_ticket_write = f_ticket_write;\n    conf->f_ticket_parse = f_ticket_parse;\n    conf->p_ticket       = p_ticket;\n}\n#endif\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n#if defined(MBEDTLS_SSL_EXPORT_KEYS)\nvoid mbedtls_ssl_conf_export_keys_cb( mbedtls_ssl_config *conf,\n        mbedtls_ssl_export_keys_t *f_export_keys,\n        void *p_export_keys )\n{\n    conf->f_export_keys = f_export_keys;\n    conf->p_export_keys = p_export_keys;\n}\n#endif\n\n/*\n * SSL get accessors\n */\nsize_t mbedtls_ssl_get_bytes_avail( const mbedtls_ssl_context *ssl )\n{\n    return( ssl->in_offt == NULL ? 0 : ssl->in_msglen );\n}\n\nuint32_t mbedtls_ssl_get_verify_result( const mbedtls_ssl_context *ssl )\n{\n    if( ssl->session != NULL )\n        return( ssl->session->verify_result );\n\n    if( ssl->session_negotiate != NULL )\n        return( ssl->session_negotiate->verify_result );\n\n    return( 0xFFFFFFFF );\n}\n\nconst char *mbedtls_ssl_get_ciphersuite( const mbedtls_ssl_context *ssl )\n{\n    if( ssl == NULL || ssl->session == NULL )\n        return( NULL );\n\n    return mbedtls_ssl_get_ciphersuite_name( ssl->session->ciphersuite );\n}\n\nconst char *mbedtls_ssl_get_version( const mbedtls_ssl_context *ssl )\n{\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        switch( ssl->minor_ver )\n        {\n            case MBEDTLS_SSL_MINOR_VERSION_2:\n                return( \"DTLSv1.0\" );\n\n            case MBEDTLS_SSL_MINOR_VERSION_3:\n                return( \"DTLSv1.2\" );\n\n            default:\n                return( \"unknown (DTLS)\" );\n        }\n    }\n#endif\n\n    switch( ssl->minor_ver )\n    {\n        case MBEDTLS_SSL_MINOR_VERSION_0:\n            return( \"SSLv3.0\" );\n\n        case MBEDTLS_SSL_MINOR_VERSION_1:\n            return( \"TLSv1.0\" );\n\n        case MBEDTLS_SSL_MINOR_VERSION_2:\n            return( \"TLSv1.1\" );\n\n        case MBEDTLS_SSL_MINOR_VERSION_3:\n            return( \"TLSv1.2\" );\n\n        default:\n            return( \"unknown\" );\n    }\n}\n\nint mbedtls_ssl_get_record_expansion( const mbedtls_ssl_context *ssl )\n{\n    size_t transform_expansion;\n    const mbedtls_ssl_transform *transform = ssl->transform_out;\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    if( ssl->session_out->compression != MBEDTLS_SSL_COMPRESS_NULL )\n        return( MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE );\n#endif\n\n    if( transform == NULL )\n        return( (int) mbedtls_ssl_hdr_len( ssl ) );\n\n    switch( mbedtls_cipher_get_cipher_mode( &transform->cipher_ctx_enc ) )\n    {\n        case MBEDTLS_MODE_GCM:\n        case MBEDTLS_MODE_CCM:\n        case MBEDTLS_MODE_STREAM:\n            transform_expansion = transform->minlen;\n            break;\n\n        case MBEDTLS_MODE_CBC:\n            transform_expansion = transform->maclen\n                      + mbedtls_cipher_get_block_size( &transform->cipher_ctx_enc );\n            break;\n\n        default:\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n            return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n    }\n\n    return( (int)( mbedtls_ssl_hdr_len( ssl ) + transform_expansion ) );\n}\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\nsize_t mbedtls_ssl_get_max_frag_len( const mbedtls_ssl_context *ssl )\n{\n    size_t max_len;\n\n    /*\n     * Assume mfl_code is correct since it was checked when set\n     */\n    max_len = mfl_code_to_length[ssl->conf->mfl_code];\n\n    /*\n     * Check if a smaller max length was negotiated\n     */\n    if( ssl->session_out != NULL &&\n        mfl_code_to_length[ssl->session_out->mfl_code] < max_len )\n    {\n        max_len = mfl_code_to_length[ssl->session_out->mfl_code];\n    }\n\n    return max_len;\n}\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\nconst mbedtls_x509_crt *mbedtls_ssl_get_peer_cert( const mbedtls_ssl_context *ssl )\n{\n    if( ssl == NULL || ssl->session == NULL )\n        return( NULL );\n\n    return( ssl->session->peer_cert );\n}\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_SSL_CLI_C)\nint mbedtls_ssl_get_session( const mbedtls_ssl_context *ssl, mbedtls_ssl_session *dst )\n{\n    if( ssl == NULL ||\n        dst == NULL ||\n        ssl->session == NULL ||\n        ssl->conf->endpoint != MBEDTLS_SSL_IS_CLIENT )\n    {\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n    }\n\n    return( ssl_session_copy( dst, ssl->session ) );\n}\n#endif /* MBEDTLS_SSL_CLI_C */\n\n/*\n * Perform a single step of the SSL handshake\n */\nint mbedtls_ssl_handshake_step( mbedtls_ssl_context *ssl )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n\n    if( ssl == NULL || ssl->conf == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n#if defined(MBEDTLS_SSL_CLI_C)\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )\n        ret = mbedtls_ssl_handshake_client_step( ssl );\n#endif\n#if defined(MBEDTLS_SSL_SRV_C)\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )\n        ret = mbedtls_ssl_handshake_server_step( ssl );\n#endif\n\n    return( ret );\n}\n\n/*\n * Perform the SSL handshake\n */\nint mbedtls_ssl_handshake( mbedtls_ssl_context *ssl )\n{\n    int ret = 0;\n\n    if( ssl == NULL || ssl->conf == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> handshake\" ) );\n\n    while( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )\n    {\n        ret = mbedtls_ssl_handshake_step( ssl );\n\n        if( ret != 0 )\n            break;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= handshake\" ) );\n\n    return( ret );\n}\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n#if defined(MBEDTLS_SSL_SRV_C)\n/*\n * Write HelloRequest to request renegotiation on server\n */\nstatic int ssl_write_hello_request( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write hello request\" ) );\n\n    ssl->out_msglen  = 4;\n    ssl->out_msgtype = MBEDTLS_SSL_MSG_HANDSHAKE;\n    ssl->out_msg[0]  = MBEDTLS_SSL_HS_HELLO_REQUEST;\n\n    if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write hello request\" ) );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_SSL_SRV_C */\n\n/*\n * Actually renegotiate current connection, triggered by either:\n * - any side: calling mbedtls_ssl_renegotiate(),\n * - client: receiving a HelloRequest during mbedtls_ssl_read(),\n * - server: receiving any handshake message on server during mbedtls_ssl_read() after\n *   the initial handshake is completed.\n * If the handshake doesn't complete due to waiting for I/O, it will continue\n * during the next calls to mbedtls_ssl_renegotiate() or mbedtls_ssl_read() respectively.\n */\nstatic int ssl_start_renegotiation( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> renegotiate\" ) );\n\n    if( ( ret = ssl_handshake_init( ssl ) ) != 0 )\n        return( ret );\n\n    /* RFC 6347 4.2.2: \"[...] the HelloRequest will have message_seq = 0 and\n     * the ServerHello will have message_seq = 1\" */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n        ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )\n    {\n        if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )\n            ssl->handshake->out_msg_seq = 1;\n        else\n            ssl->handshake->in_msg_seq = 1;\n    }\n#endif\n\n    ssl->state = MBEDTLS_SSL_HELLO_REQUEST;\n    ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS;\n\n    if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_handshake\", ret );\n        return( ret );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= renegotiate\" ) );\n\n    return( 0 );\n}\n\n/*\n * Renegotiate current connection on client,\n * or request renegotiation on server\n */\nint mbedtls_ssl_renegotiate( mbedtls_ssl_context *ssl )\n{\n    int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;\n\n    if( ssl == NULL || ssl->conf == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n#if defined(MBEDTLS_SSL_SRV_C)\n    /* On server, just send the request */\n    if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER )\n    {\n        if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )\n            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n        ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;\n\n        /* Did we already try/start sending HelloRequest? */\n        if( ssl->out_left != 0 )\n            return( mbedtls_ssl_flush_output( ssl ) );\n\n        return( ssl_write_hello_request( ssl ) );\n    }\n#endif /* MBEDTLS_SSL_SRV_C */\n\n#if defined(MBEDTLS_SSL_CLI_C)\n    /*\n     * On client, either start the renegotiation process or,\n     * if already in progress, continue the handshake\n     */\n    if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS )\n    {\n        if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )\n            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n        if( ( ret = ssl_start_renegotiation( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_start_renegotiation\", ret );\n            return( ret );\n        }\n    }\n    else\n    {\n        if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_handshake\", ret );\n            return( ret );\n        }\n    }\n#endif /* MBEDTLS_SSL_CLI_C */\n\n    return( ret );\n}\n\n/*\n * Check record counters and renegotiate if they're above the limit.\n */\nstatic int ssl_check_ctr_renegotiate( mbedtls_ssl_context *ssl )\n{\n    size_t ep_len = ssl_ep_len( ssl );\n    int in_ctr_cmp;\n    int out_ctr_cmp;\n\n    if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER ||\n        ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING ||\n        ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED )\n    {\n        return( 0 );\n    }\n\n    in_ctr_cmp = memcmp( ssl->in_ctr + ep_len,\n                        ssl->conf->renego_period + ep_len, 8 - ep_len );\n    out_ctr_cmp = memcmp( ssl->out_ctr + ep_len,\n                          ssl->conf->renego_period + ep_len, 8 - ep_len );\n\n    if( in_ctr_cmp <= 0 && out_ctr_cmp <= 0 )\n    {\n        return( 0 );\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"record counter limit reached: renegotiate\" ) );\n    return( mbedtls_ssl_renegotiate( ssl ) );\n}\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n/*\n * Receive application data decrypted from the SSL layer\n */\nint mbedtls_ssl_read( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len )\n{\n    int ret;\n    size_t n;\n\n    if( ssl == NULL || ssl->conf == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> read\" ) );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )\n            return( ret );\n\n        if( ssl->handshake != NULL &&\n            ssl->handshake->retransmit_state == MBEDTLS_SSL_RETRANS_SENDING )\n        {\n            if( ( ret = mbedtls_ssl_resend( ssl ) ) != 0 )\n                return( ret );\n        }\n    }\n#endif\n\n    /*\n     * Check if renegotiation is necessary and/or handshake is\n     * in process. If yes, perform/continue, and fall through\n     * if an unexpected packet is received while the client\n     * is waiting for the ServerHello.\n     *\n     * (There is no equivalent to the last condition on\n     *  the server-side as it is not treated as within\n     *  a handshake while waiting for the ClientHello\n     *  after a renegotiation request.)\n     */\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    ret = ssl_check_ctr_renegotiate( ssl );\n    if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO &&\n        ret != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_check_ctr_renegotiate\", ret );\n        return( ret );\n    }\n#endif\n\n    if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )\n    {\n        ret = mbedtls_ssl_handshake( ssl );\n        if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO &&\n            ret != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_handshake\", ret );\n            return( ret );\n        }\n    }\n\n    /*\n     * TODO\n     *\n     * The logic should be streamlined here:\n     *\n     * Instead of\n     *\n     * - Manually checking whether ssl->in_offt is NULL\n     * - Fetching a new record if yes\n     * - Setting ssl->in_offt if one finds an application record\n     * - Resetting keep_current_message after handling the application data\n     *\n     * one should\n     *\n     * - Adapt read_record to set ssl->in_offt automatically\n     *   when a new application data record is processed.\n     * - Always call mbedtls_ssl_read_record here.\n     *\n     * This way, the logic of ssl_read would be much clearer:\n     *\n     * (1) Always call record layer and see what kind of record is on\n     *     and have it ready for consumption (in particular, in_offt\n     *     properly set for application data records).\n     * (2) If it's application data (either freshly fetched\n     *     or something already being partially processed),\n     *     serve the read request from it.\n     * (3) If it's something different from application data,\n     *     handle it accordingly, e.g. potentially start a\n     *     renegotiation.\n     *\n     * This will also remove the need to manually reset\n     * ssl->keep_current_message = 0 below.\n     *\n     */\n\n    if( ssl->in_offt == NULL )\n    {\n        /* Start timer if not already running */\n        if( ssl->f_get_timer != NULL &&\n            ssl->f_get_timer( ssl->p_timer ) == -1 )\n        {\n            ssl_set_timer( ssl, ssl->conf->read_timeout );\n        }\n\n        if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n        {\n            if( ret == MBEDTLS_ERR_SSL_CONN_EOF )\n                return( 0 );\n\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n            return( ret );\n        }\n\n        if( ssl->in_msglen  == 0 &&\n            ssl->in_msgtype == MBEDTLS_SSL_MSG_APPLICATION_DATA )\n        {\n            /*\n             * OpenSSL sends empty messages to randomize the IV\n             */\n            if( ( ret = mbedtls_ssl_read_record( ssl ) ) != 0 )\n            {\n                if( ret == MBEDTLS_ERR_SSL_CONN_EOF )\n                    return( 0 );\n\n                MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_read_record\", ret );\n                return( ret );\n            }\n        }\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n        if( ssl->in_msgtype == MBEDTLS_SSL_MSG_HANDSHAKE )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"received handshake message\" ) );\n\n            /*\n             * - For client-side, expect SERVER_HELLO_REQUEST.\n             * - For server-side, expect CLIENT_HELLO.\n             * - Fail (TLS) or silently drop record (DTLS) in other cases.\n             */\n\n#if defined(MBEDTLS_SSL_CLI_C)\n            if( ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT &&\n                ( ssl->in_msg[0] != MBEDTLS_SSL_HS_HELLO_REQUEST ||\n                  ssl->in_hslen  != mbedtls_ssl_hs_hdr_len( ssl ) ) )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"handshake received (not HelloRequest)\" ) );\n\n                /* With DTLS, drop the packet (probably from last handshake) */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n                if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n                    return( MBEDTLS_ERR_SSL_WANT_READ );\n#endif\n                return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n            }\n#endif /* MBEDTLS_SSL_CLI_C */\n\n#if defined(MBEDTLS_SSL_SRV_C)\n            if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&\n                ssl->in_msg[0] != MBEDTLS_SSL_HS_CLIENT_HELLO )\n            {\n                MBEDTLS_SSL_DEBUG_MSG( 1, ( \"handshake received (not ClientHello)\" ) );\n\n                /* With DTLS, drop the packet (probably from last handshake) */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n                if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n                    return( MBEDTLS_ERR_SSL_WANT_READ );\n#endif\n                return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n            }\n#endif /* MBEDTLS_SSL_SRV_C */\n\n            /* Determine whether renegotiation attempt should be accepted */\n\n            if( ssl->conf->disable_renegotiation == MBEDTLS_SSL_RENEGOTIATION_DISABLED ||\n                ( ssl->secure_renegotiation == MBEDTLS_SSL_LEGACY_RENEGOTIATION &&\n                  ssl->conf->allow_legacy_renegotiation ==\n                                                MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION ) )\n            {\n                /*\n                 * Refuse renegotiation\n                 */\n\n                MBEDTLS_SSL_DEBUG_MSG( 3, ( \"refusing renegotiation, sending alert\" ) );\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n                if( ssl->minor_ver == MBEDTLS_SSL_MINOR_VERSION_0 )\n                {\n                    /* SSLv3 does not have a \"no_renegotiation\" warning, so\n                       we send a fatal alert and abort the connection. */\n                    mbedtls_ssl_send_alert_message( ssl, MBEDTLS_SSL_ALERT_LEVEL_FATAL,\n                                                    MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE );\n                    return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n                }\n                else\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_2)\n                if( ssl->minor_ver >= MBEDTLS_SSL_MINOR_VERSION_1 )\n                {\n                    if( ( ret = mbedtls_ssl_send_alert_message( ssl,\n                                    MBEDTLS_SSL_ALERT_LEVEL_WARNING,\n                                    MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION ) ) != 0 )\n                    {\n                        return( ret );\n                    }\n                }\n                else\n#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 ||\n          MBEDTLS_SSL_PROTO_TLS1_2 */\n                {\n                    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"should never happen\" ) );\n                    return( MBEDTLS_ERR_SSL_INTERNAL_ERROR );\n                }\n            }\n            else\n            {\n                /*\n                 * Accept renegotiation request\n                 */\n\n                /* DTLS clients need to know renego is server-initiated */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n                if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n                    ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT )\n                {\n                    ssl->renego_status = MBEDTLS_SSL_RENEGOTIATION_PENDING;\n                }\n#endif\n                ret = ssl_start_renegotiation( ssl );\n                if( ret != MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO &&\n                    ret != 0 )\n                {\n                    MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_start_renegotiation\", ret );\n                    return( ret );\n                }\n            }\n\n            return( MBEDTLS_ERR_SSL_WANT_READ );\n        }\n        else if( ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )\n        {\n            if( ssl->conf->renego_max_records >= 0 )\n            {\n                if( ++ssl->renego_records_seen > ssl->conf->renego_max_records )\n                {\n                    MBEDTLS_SSL_DEBUG_MSG( 1, ( \"renegotiation requested, \"\n                                        \"but not honored by client\" ) );\n                    return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n                }\n            }\n        }\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n        /* Fatal and closure alerts handled by mbedtls_ssl_read_record() */\n        if( ssl->in_msgtype == MBEDTLS_SSL_MSG_ALERT )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 2, ( \"ignoring non-fatal non-closure alert\" ) );\n            return( MBEDTLS_ERR_SSL_WANT_READ );\n        }\n\n        if( ssl->in_msgtype != MBEDTLS_SSL_MSG_APPLICATION_DATA )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"bad application data message\" ) );\n            return( MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE );\n        }\n\n        ssl->in_offt = ssl->in_msg;\n\n        /* We're going to return something now, cancel timer,\n         * except if handshake (renegotiation) is in progress */\n        if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )\n            ssl_set_timer( ssl, 0 );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n        /* If we requested renego but received AppData, resend HelloRequest.\n         * Do it now, after setting in_offt, to avoid taking this branch\n         * again if ssl_write_hello_request() returns WANT_WRITE */\n#if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_RENEGOTIATION)\n        if( ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER &&\n            ssl->renego_status == MBEDTLS_SSL_RENEGOTIATION_PENDING )\n        {\n            if( ( ret = ssl_resend_hello_request( ssl ) ) != 0 )\n            {\n                MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_resend_hello_request\", ret );\n                return( ret );\n            }\n        }\n#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_RENEGOTIATION */\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n    }\n\n    n = ( len < ssl->in_msglen )\n        ? len : ssl->in_msglen;\n\n    memcpy( buf, ssl->in_offt, n );\n    ssl->in_msglen -= n;\n\n    if( ssl->in_msglen == 0 )\n    {\n        /* all bytes consumed */\n        ssl->in_offt = NULL;\n        ssl->keep_current_message = 0;\n    }\n    else\n    {\n        /* more data available */\n        ssl->in_offt += n;\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= read\" ) );\n\n    return( (int) n );\n}\n\n/*\n * Send application data to be encrypted by the SSL layer,\n * taking care of max fragment length and buffer size\n */\nstatic int ssl_write_real( mbedtls_ssl_context *ssl,\n                           const unsigned char *buf, size_t len )\n{\n    int ret;\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n    size_t max_len = mbedtls_ssl_get_max_frag_len( ssl );\n\n    if( len > max_len )\n    {\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n        if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n        {\n            MBEDTLS_SSL_DEBUG_MSG( 1, ( \"fragment larger than the (negotiated) \"\n                                \"maximum fragment length: %d > %d\",\n                                len, max_len ) );\n            return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n        }\n        else\n#endif\n            len = max_len;\n    }\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n    if( ssl->out_left != 0 )\n    {\n        if( ( ret = mbedtls_ssl_flush_output( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_flush_output\", ret );\n            return( ret );\n        }\n    }\n    else\n    {\n        ssl->out_msglen  = len;\n        ssl->out_msgtype = MBEDTLS_SSL_MSG_APPLICATION_DATA;\n        memcpy( ssl->out_msg, buf, len );\n\n        if( ( ret = mbedtls_ssl_write_record( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_write_record\", ret );\n            return( ret );\n        }\n    }\n\n    return( (int) len );\n}\n\n/*\n * Write application data, doing 1/n-1 splitting if necessary.\n *\n * With non-blocking I/O, ssl_write_real() may return WANT_WRITE,\n * then the caller will call us again with the same arguments, so\n * remember wether we already did the split or not.\n */\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\nstatic int ssl_write_split( mbedtls_ssl_context *ssl,\n                            const unsigned char *buf, size_t len )\n{\n    int ret;\n\n    if( ssl->conf->cbc_record_splitting ==\n            MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED ||\n        len <= 1 ||\n        ssl->minor_ver > MBEDTLS_SSL_MINOR_VERSION_1 ||\n        mbedtls_cipher_get_cipher_mode( &ssl->transform_out->cipher_ctx_enc )\n                                != MBEDTLS_MODE_CBC )\n    {\n        return( ssl_write_real( ssl, buf, len ) );\n    }\n\n    if( ssl->split_done == 0 )\n    {\n        if( ( ret = ssl_write_real( ssl, buf, 1 ) ) <= 0 )\n            return( ret );\n        ssl->split_done = 1;\n    }\n\n    if( ( ret = ssl_write_real( ssl, buf + 1, len - 1 ) ) <= 0 )\n        return( ret );\n    ssl->split_done = 0;\n\n    return( ret + 1 );\n}\n#endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */\n\n/*\n * Write application data (public-facing wrapper)\n */\nint mbedtls_ssl_write( mbedtls_ssl_context *ssl, const unsigned char *buf, size_t len )\n{\n    int ret;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write\" ) );\n\n    if( ssl == NULL || ssl->conf == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( ( ret = ssl_check_ctr_renegotiate( ssl ) ) != 0 )\n    {\n        MBEDTLS_SSL_DEBUG_RET( 1, \"ssl_check_ctr_renegotiate\", ret );\n        return( ret );\n    }\n#endif\n\n    if( ssl->state != MBEDTLS_SSL_HANDSHAKE_OVER )\n    {\n        if( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_handshake\", ret );\n            return( ret );\n        }\n    }\n\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\n    ret = ssl_write_split( ssl, buf, len );\n#else\n    ret = ssl_write_real( ssl, buf, len );\n#endif\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write\" ) );\n\n    return( ret );\n}\n\n/*\n * Notify the peer that the connection is being closed\n */\nint mbedtls_ssl_close_notify( mbedtls_ssl_context *ssl )\n{\n    int ret;\n\n    if( ssl == NULL || ssl->conf == NULL )\n        return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA );\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> write close notify\" ) );\n\n    if( ssl->out_left != 0 )\n        return( mbedtls_ssl_flush_output( ssl ) );\n\n    if( ssl->state == MBEDTLS_SSL_HANDSHAKE_OVER )\n    {\n        if( ( ret = mbedtls_ssl_send_alert_message( ssl,\n                        MBEDTLS_SSL_ALERT_LEVEL_WARNING,\n                        MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY ) ) != 0 )\n        {\n            MBEDTLS_SSL_DEBUG_RET( 1, \"mbedtls_ssl_send_alert_message\", ret );\n            return( ret );\n        }\n    }\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= write close notify\" ) );\n\n    return( 0 );\n}\n\nvoid mbedtls_ssl_transform_free( mbedtls_ssl_transform *transform )\n{\n    if( transform == NULL )\n        return;\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    deflateEnd( &transform->ctx_deflate );\n    inflateEnd( &transform->ctx_inflate );\n#endif\n\n    mbedtls_cipher_free( &transform->cipher_ctx_enc );\n    mbedtls_cipher_free( &transform->cipher_ctx_dec );\n\n    mbedtls_md_free( &transform->md_ctx_enc );\n    mbedtls_md_free( &transform->md_ctx_dec );\n\n    mbedtls_zeroize( transform, sizeof( mbedtls_ssl_transform ) );\n}\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\nstatic void ssl_key_cert_free( mbedtls_ssl_key_cert *key_cert )\n{\n    mbedtls_ssl_key_cert *cur = key_cert, *next;\n\n    while( cur != NULL )\n    {\n        next = cur->next;\n        mbedtls_free( cur );\n        cur = next;\n    }\n}\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\nvoid mbedtls_ssl_handshake_free( mbedtls_ssl_handshake_params *handshake )\n{\n    if( handshake == NULL )\n        return;\n\n#if defined(MBEDTLS_SSL_PROTO_SSL3) || defined(MBEDTLS_SSL_PROTO_TLS1) || \\\n    defined(MBEDTLS_SSL_PROTO_TLS1_1)\n    mbedtls_md5_free(    &handshake->fin_md5  );\n    mbedtls_sha1_free(   &handshake->fin_sha1 );\n#endif\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n#if defined(MBEDTLS_SHA256_C)\n    mbedtls_sha256_free(   &handshake->fin_sha256    );\n#endif\n#if defined(MBEDTLS_SHA512_C)\n    mbedtls_sha512_free(   &handshake->fin_sha512    );\n#endif\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n\n#if defined(MBEDTLS_DHM_C)\n    mbedtls_dhm_free( &handshake->dhm_ctx );\n#endif\n#if defined(MBEDTLS_ECDH_C)\n    mbedtls_ecdh_free( &handshake->ecdh_ctx );\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    mbedtls_ecjpake_free( &handshake->ecjpake_ctx );\n#if defined(MBEDTLS_SSL_CLI_C)\n    mbedtls_free( handshake->ecjpake_cache );\n    handshake->ecjpake_cache = NULL;\n    handshake->ecjpake_cache_len = 0;\n#endif\n#endif\n\n#if defined(MBEDTLS_ECDH_C) || defined(MBEDTLS_ECDSA_C) || \\\n    defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    /* explicit void pointer cast for buggy MS compiler */\n    mbedtls_free( (void *) handshake->curves );\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    if( handshake->psk != NULL )\n    {\n        mbedtls_zeroize( handshake->psk, handshake->psk_len );\n        mbedtls_free( handshake->psk );\n    }\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C) && \\\n    defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n    /*\n     * Free only the linked list wrapper, not the keys themselves\n     * since the belong to the SNI callback\n     */\n    if( handshake->sni_key_cert != NULL )\n    {\n        mbedtls_ssl_key_cert *cur = handshake->sni_key_cert, *next;\n\n        while( cur != NULL )\n        {\n            next = cur->next;\n            mbedtls_free( cur );\n            cur = next;\n        }\n    }\n#endif /* MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_SSL_SERVER_NAME_INDICATION */\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    mbedtls_free( handshake->verify_cookie );\n    mbedtls_free( handshake->hs_msg );\n    ssl_flight_free( handshake->flight );\n#endif\n\n    mbedtls_zeroize( handshake, sizeof( mbedtls_ssl_handshake_params ) );\n}\n\nvoid mbedtls_ssl_session_free( mbedtls_ssl_session *session )\n{\n    if( session == NULL )\n        return;\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    if( session->peer_cert != NULL )\n    {\n        mbedtls_x509_crt_free( session->peer_cert );\n        mbedtls_free( session->peer_cert );\n    }\n#endif\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS) && defined(MBEDTLS_SSL_CLI_C)\n    mbedtls_free( session->ticket );\n#endif\n\n    mbedtls_zeroize( session, sizeof( mbedtls_ssl_session ) );\n}\n\n/*\n * Free an SSL context\n */\nvoid mbedtls_ssl_free( mbedtls_ssl_context *ssl )\n{\n    if( ssl == NULL )\n        return;\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"=> free\" ) );\n\n    if( ssl->out_buf != NULL )\n    {\n        mbedtls_zeroize( ssl->out_buf, MBEDTLS_SSL_BUFFER_LEN );\n        mbedtls_free( ssl->out_buf );\n    }\n\n    if( ssl->in_buf != NULL )\n    {\n        mbedtls_zeroize( ssl->in_buf, MBEDTLS_SSL_BUFFER_LEN );\n        mbedtls_free( ssl->in_buf );\n    }\n\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    if( ssl->compress_buf != NULL )\n    {\n        mbedtls_zeroize( ssl->compress_buf, MBEDTLS_SSL_BUFFER_LEN );\n        mbedtls_free( ssl->compress_buf );\n    }\n#endif\n\n    if( ssl->transform )\n    {\n        mbedtls_ssl_transform_free( ssl->transform );\n        mbedtls_free( ssl->transform );\n    }\n\n    if( ssl->handshake )\n    {\n        mbedtls_ssl_handshake_free( ssl->handshake );\n        mbedtls_ssl_transform_free( ssl->transform_negotiate );\n        mbedtls_ssl_session_free( ssl->session_negotiate );\n\n        mbedtls_free( ssl->handshake );\n        mbedtls_free( ssl->transform_negotiate );\n        mbedtls_free( ssl->session_negotiate );\n    }\n\n    if( ssl->session )\n    {\n        mbedtls_ssl_session_free( ssl->session );\n        mbedtls_free( ssl->session );\n    }\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    if( ssl->hostname != NULL )\n    {\n        mbedtls_zeroize( ssl->hostname, strlen( ssl->hostname ) );\n        mbedtls_free( ssl->hostname );\n    }\n#endif\n\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\n    if( mbedtls_ssl_hw_record_finish != NULL )\n    {\n        MBEDTLS_SSL_DEBUG_MSG( 2, ( \"going for mbedtls_ssl_hw_record_finish()\" ) );\n        mbedtls_ssl_hw_record_finish( ssl );\n    }\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)\n    mbedtls_free( ssl->cli_id );\n#endif\n\n    MBEDTLS_SSL_DEBUG_MSG( 2, ( \"<= free\" ) );\n\n    /* Actually clear after last debug message */\n    mbedtls_zeroize( ssl, sizeof( mbedtls_ssl_context ) );\n}\n\n/*\n * Initialze mbedtls_ssl_config\n */\nvoid mbedtls_ssl_config_init( mbedtls_ssl_config *conf )\n{\n    memset( conf, 0, sizeof( mbedtls_ssl_config ) );\n}\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\nstatic int ssl_preset_default_hashes[] = {\n#if defined(MBEDTLS_SHA512_C)\n    MBEDTLS_MD_SHA512,\n    MBEDTLS_MD_SHA384,\n#endif\n#if defined(MBEDTLS_SHA256_C)\n    MBEDTLS_MD_SHA256,\n    MBEDTLS_MD_SHA224,\n#endif\n#if defined(MBEDTLS_SHA1_C) && defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE)\n    MBEDTLS_MD_SHA1,\n#endif\n    MBEDTLS_MD_NONE\n};\n#endif\n\nstatic int ssl_preset_suiteb_ciphersuites[] = {\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,\n    0\n};\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\nstatic int ssl_preset_suiteb_hashes[] = {\n    MBEDTLS_MD_SHA256,\n    MBEDTLS_MD_SHA384,\n    MBEDTLS_MD_NONE\n};\n#endif\n\n#if defined(MBEDTLS_ECP_C)\nstatic mbedtls_ecp_group_id ssl_preset_suiteb_curves[] = {\n    MBEDTLS_ECP_DP_SECP256R1,\n    MBEDTLS_ECP_DP_SECP384R1,\n    MBEDTLS_ECP_DP_NONE\n};\n#endif\n\n/*\n * Load default in mbedtls_ssl_config\n */\nint mbedtls_ssl_config_defaults( mbedtls_ssl_config *conf,\n                                 int endpoint, int transport, int preset )\n{\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)\n    int ret;\n#endif\n\n    /* Use the functions here so that they are covered in tests,\n     * but otherwise access member directly for efficiency */\n    mbedtls_ssl_conf_endpoint( conf, endpoint );\n    mbedtls_ssl_conf_transport( conf, transport );\n\n    /*\n     * Things that are common to all presets\n     */\n#if defined(MBEDTLS_SSL_CLI_C)\n    if( endpoint == MBEDTLS_SSL_IS_CLIENT )\n    {\n        conf->authmode = MBEDTLS_SSL_VERIFY_REQUIRED;\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n        conf->session_tickets = MBEDTLS_SSL_SESSION_TICKETS_ENABLED;\n#endif\n    }\n#endif\n\n#if defined(MBEDTLS_ARC4_C)\n    conf->arc4_disabled = MBEDTLS_SSL_ARC4_DISABLED;\n#endif\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n    conf->encrypt_then_mac = MBEDTLS_SSL_ETM_ENABLED;\n#endif\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n    conf->extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED;\n#endif\n\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\n    conf->cbc_record_splitting = MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED;\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C)\n    conf->f_cookie_write = ssl_cookie_write_dummy;\n    conf->f_cookie_check = ssl_cookie_check_dummy;\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n    conf->anti_replay = MBEDTLS_SSL_ANTI_REPLAY_ENABLED;\n#endif\n\n#if defined(MBEDTLS_SSL_SRV_C)\n    conf->cert_req_ca_list = MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED;\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    conf->hs_timeout_min = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN;\n    conf->hs_timeout_max = MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX;\n#endif\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    conf->renego_max_records = MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT;\n    memset( conf->renego_period,     0x00, 2 );\n    memset( conf->renego_period + 2, 0xFF, 6 );\n#endif\n\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_SRV_C)\n            if( endpoint == MBEDTLS_SSL_IS_SERVER )\n            {\n                if( ( ret = mbedtls_ssl_conf_dh_param( conf,\n                                MBEDTLS_DHM_RFC5114_MODP_2048_P,\n                                MBEDTLS_DHM_RFC5114_MODP_2048_G ) ) != 0 )\n                {\n                    return( ret );\n                }\n            }\n#endif\n\n    /*\n     * Preset-specific defaults\n     */\n    switch( preset )\n    {\n        /*\n         * NSA Suite B\n         */\n        case MBEDTLS_SSL_PRESET_SUITEB:\n            conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;\n            conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_3; /* TLS 1.2 */\n            conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;\n            conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;\n\n            conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =\n            conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =\n            conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =\n            conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =\n                                   ssl_preset_suiteb_ciphersuites;\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n            conf->cert_profile = &mbedtls_x509_crt_profile_suiteb;\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n            conf->sig_hashes = ssl_preset_suiteb_hashes;\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n            conf->curve_list = ssl_preset_suiteb_curves;\n#endif\n            break;\n\n        /*\n         * Default\n         */\n        default:\n            conf->min_major_ver = MBEDTLS_SSL_MAJOR_VERSION_3;\n            conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_1; /* TLS 1.0 */\n            conf->max_major_ver = MBEDTLS_SSL_MAX_MAJOR_VERSION;\n            conf->max_minor_ver = MBEDTLS_SSL_MAX_MINOR_VERSION;\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n            if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n                conf->min_minor_ver = MBEDTLS_SSL_MINOR_VERSION_2;\n#endif\n\n            conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_0] =\n            conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_1] =\n            conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_2] =\n            conf->ciphersuite_list[MBEDTLS_SSL_MINOR_VERSION_3] =\n                                   mbedtls_ssl_list_ciphersuites();\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n            conf->cert_profile = &mbedtls_x509_crt_profile_default;\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n            conf->sig_hashes = ssl_preset_default_hashes;\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n            conf->curve_list = mbedtls_ecp_grp_id_list();\n#endif\n\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_SSL_CLI_C)\n            conf->dhm_min_bitlen = 1024;\n#endif\n    }\n\n    return( 0 );\n}\n\n/*\n * Free mbedtls_ssl_config\n */\nvoid mbedtls_ssl_config_free( mbedtls_ssl_config *conf )\n{\n#if defined(MBEDTLS_DHM_C)\n    mbedtls_mpi_free( &conf->dhm_P );\n    mbedtls_mpi_free( &conf->dhm_G );\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    if( conf->psk != NULL )\n    {\n        mbedtls_zeroize( conf->psk, conf->psk_len );\n        mbedtls_zeroize( conf->psk_identity, conf->psk_identity_len );\n        mbedtls_free( conf->psk );\n        mbedtls_free( conf->psk_identity );\n        conf->psk_len = 0;\n        conf->psk_identity_len = 0;\n    }\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    ssl_key_cert_free( conf->key_cert );\n#endif\n\n    mbedtls_zeroize( conf, sizeof( mbedtls_ssl_config ) );\n}\n\n#if defined(MBEDTLS_PK_C) && \\\n    ( defined(MBEDTLS_RSA_C) || defined(MBEDTLS_ECDSA_C) )\n/*\n * Convert between MBEDTLS_PK_XXX and SSL_SIG_XXX\n */\nunsigned char mbedtls_ssl_sig_from_pk( mbedtls_pk_context *pk )\n{\n#if defined(MBEDTLS_RSA_C)\n    if( mbedtls_pk_can_do( pk, MBEDTLS_PK_RSA ) )\n        return( MBEDTLS_SSL_SIG_RSA );\n#endif\n#if defined(MBEDTLS_ECDSA_C)\n    if( mbedtls_pk_can_do( pk, MBEDTLS_PK_ECDSA ) )\n        return( MBEDTLS_SSL_SIG_ECDSA );\n#endif\n    return( MBEDTLS_SSL_SIG_ANON );\n}\n\nunsigned char mbedtls_ssl_sig_from_pk_alg( mbedtls_pk_type_t type )\n{\n    switch( type ) {\n        case MBEDTLS_PK_RSA:\n            return( MBEDTLS_SSL_SIG_RSA );\n        case MBEDTLS_PK_ECDSA:\n        case MBEDTLS_PK_ECKEY:\n            return( MBEDTLS_SSL_SIG_ECDSA );\n        default:\n            return( MBEDTLS_SSL_SIG_ANON );\n    }\n}\n\nmbedtls_pk_type_t mbedtls_ssl_pk_alg_from_sig( unsigned char sig )\n{\n    switch( sig )\n    {\n#if defined(MBEDTLS_RSA_C)\n        case MBEDTLS_SSL_SIG_RSA:\n            return( MBEDTLS_PK_RSA );\n#endif\n#if defined(MBEDTLS_ECDSA_C)\n        case MBEDTLS_SSL_SIG_ECDSA:\n            return( MBEDTLS_PK_ECDSA );\n#endif\n        default:\n            return( MBEDTLS_PK_NONE );\n    }\n}\n#endif /* MBEDTLS_PK_C && ( MBEDTLS_RSA_C || MBEDTLS_ECDSA_C ) */\n\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \\\n    defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n\n/* Find an entry in a signature-hash set matching a given hash algorithm. */\nmbedtls_md_type_t mbedtls_ssl_sig_hash_set_find( mbedtls_ssl_sig_hash_set_t *set,\n                                                 mbedtls_pk_type_t sig_alg )\n{\n    switch( sig_alg )\n    {\n        case MBEDTLS_PK_RSA:\n            return( set->rsa );\n        case MBEDTLS_PK_ECDSA:\n            return( set->ecdsa );\n        default:\n            return( MBEDTLS_MD_NONE );\n    }\n}\n\n/* Add a signature-hash-pair to a signature-hash set */\nvoid mbedtls_ssl_sig_hash_set_add( mbedtls_ssl_sig_hash_set_t *set,\n                                   mbedtls_pk_type_t sig_alg,\n                                   mbedtls_md_type_t md_alg )\n{\n    switch( sig_alg )\n    {\n        case MBEDTLS_PK_RSA:\n            if( set->rsa == MBEDTLS_MD_NONE )\n                set->rsa = md_alg;\n            break;\n\n        case MBEDTLS_PK_ECDSA:\n            if( set->ecdsa == MBEDTLS_MD_NONE )\n                set->ecdsa = md_alg;\n            break;\n\n        default:\n            break;\n    }\n}\n\n/* Allow exactly one hash algorithm for each signature. */\nvoid mbedtls_ssl_sig_hash_set_const_hash( mbedtls_ssl_sig_hash_set_t *set,\n                                          mbedtls_md_type_t md_alg )\n{\n    set->rsa   = md_alg;\n    set->ecdsa = md_alg;\n}\n\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2) &&\n          MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n/*\n * Convert from MBEDTLS_SSL_HASH_XXX to MBEDTLS_MD_XXX\n */\nmbedtls_md_type_t mbedtls_ssl_md_alg_from_hash( unsigned char hash )\n{\n    switch( hash )\n    {\n#if defined(MBEDTLS_MD5_C)\n        case MBEDTLS_SSL_HASH_MD5:\n            return( MBEDTLS_MD_MD5 );\n#endif\n#if defined(MBEDTLS_SHA1_C)\n        case MBEDTLS_SSL_HASH_SHA1:\n            return( MBEDTLS_MD_SHA1 );\n#endif\n#if defined(MBEDTLS_SHA256_C)\n        case MBEDTLS_SSL_HASH_SHA224:\n            return( MBEDTLS_MD_SHA224 );\n        case MBEDTLS_SSL_HASH_SHA256:\n            return( MBEDTLS_MD_SHA256 );\n#endif\n#if defined(MBEDTLS_SHA512_C)\n        case MBEDTLS_SSL_HASH_SHA384:\n            return( MBEDTLS_MD_SHA384 );\n        case MBEDTLS_SSL_HASH_SHA512:\n            return( MBEDTLS_MD_SHA512 );\n#endif\n        default:\n            return( MBEDTLS_MD_NONE );\n    }\n}\n\n/*\n * Convert from MBEDTLS_MD_XXX to MBEDTLS_SSL_HASH_XXX\n */\nunsigned char mbedtls_ssl_hash_from_md_alg( int md )\n{\n    switch( md )\n    {\n#if defined(MBEDTLS_MD5_C)\n        case MBEDTLS_MD_MD5:\n            return( MBEDTLS_SSL_HASH_MD5 );\n#endif\n#if defined(MBEDTLS_SHA1_C)\n        case MBEDTLS_MD_SHA1:\n            return( MBEDTLS_SSL_HASH_SHA1 );\n#endif\n#if defined(MBEDTLS_SHA256_C)\n        case MBEDTLS_MD_SHA224:\n            return( MBEDTLS_SSL_HASH_SHA224 );\n        case MBEDTLS_MD_SHA256:\n            return( MBEDTLS_SSL_HASH_SHA256 );\n#endif\n#if defined(MBEDTLS_SHA512_C)\n        case MBEDTLS_MD_SHA384:\n            return( MBEDTLS_SSL_HASH_SHA384 );\n        case MBEDTLS_MD_SHA512:\n            return( MBEDTLS_SSL_HASH_SHA512 );\n#endif\n        default:\n            return( MBEDTLS_SSL_HASH_NONE );\n    }\n}\n\n#if defined(MBEDTLS_ECP_C)\n/*\n * Check if a curve proposed by the peer is in our list.\n * Return 0 if we're willing to use it, -1 otherwise.\n */\nint mbedtls_ssl_check_curve( const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id )\n{\n    const mbedtls_ecp_group_id *gid;\n\n    if( ssl->conf->curve_list == NULL )\n        return( -1 );\n\n    for( gid = ssl->conf->curve_list; *gid != MBEDTLS_ECP_DP_NONE; gid++ )\n        if( *gid == grp_id )\n            return( 0 );\n\n    return( -1 );\n}\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED)\n/*\n * Check if a hash proposed by the peer is in our list.\n * Return 0 if we're willing to use it, -1 otherwise.\n */\nint mbedtls_ssl_check_sig_hash( const mbedtls_ssl_context *ssl,\n                                mbedtls_md_type_t md )\n{\n    const int *cur;\n\n    if( ssl->conf->sig_hashes == NULL )\n        return( -1 );\n\n    for( cur = ssl->conf->sig_hashes; *cur != MBEDTLS_MD_NONE; cur++ )\n        if( *cur == (int) md )\n            return( 0 );\n\n    return( -1 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED */\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\nint mbedtls_ssl_check_cert_usage( const mbedtls_x509_crt *cert,\n                          const mbedtls_ssl_ciphersuite_t *ciphersuite,\n                          int cert_endpoint,\n                          uint32_t *flags )\n{\n    int ret = 0;\n#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)\n    int usage = 0;\n#endif\n#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)\n    const char *ext_oid;\n    size_t ext_len;\n#endif\n\n#if !defined(MBEDTLS_X509_CHECK_KEY_USAGE) &&          \\\n    !defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)\n    ((void) cert);\n    ((void) cert_endpoint);\n    ((void) flags);\n#endif\n\n#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)\n    if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )\n    {\n        /* Server part of the key exchange */\n        switch( ciphersuite->key_exchange )\n        {\n            case MBEDTLS_KEY_EXCHANGE_RSA:\n            case MBEDTLS_KEY_EXCHANGE_RSA_PSK:\n                usage = MBEDTLS_X509_KU_KEY_ENCIPHERMENT;\n                break;\n\n            case MBEDTLS_KEY_EXCHANGE_DHE_RSA:\n            case MBEDTLS_KEY_EXCHANGE_ECDHE_RSA:\n            case MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA:\n                usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;\n                break;\n\n            case MBEDTLS_KEY_EXCHANGE_ECDH_RSA:\n            case MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA:\n                usage = MBEDTLS_X509_KU_KEY_AGREEMENT;\n                break;\n\n            /* Don't use default: we want warnings when adding new values */\n            case MBEDTLS_KEY_EXCHANGE_NONE:\n            case MBEDTLS_KEY_EXCHANGE_PSK:\n            case MBEDTLS_KEY_EXCHANGE_DHE_PSK:\n            case MBEDTLS_KEY_EXCHANGE_ECDHE_PSK:\n            case MBEDTLS_KEY_EXCHANGE_ECJPAKE:\n                usage = 0;\n        }\n    }\n    else\n    {\n        /* Client auth: we only implement rsa_sign and mbedtls_ecdsa_sign for now */\n        usage = MBEDTLS_X509_KU_DIGITAL_SIGNATURE;\n    }\n\n    if( mbedtls_x509_crt_check_key_usage( cert, usage ) != 0 )\n    {\n        *flags |= MBEDTLS_X509_BADCERT_KEY_USAGE;\n        ret = -1;\n    }\n#else\n    ((void) ciphersuite);\n#endif /* MBEDTLS_X509_CHECK_KEY_USAGE */\n\n#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)\n    if( cert_endpoint == MBEDTLS_SSL_IS_SERVER )\n    {\n        ext_oid = MBEDTLS_OID_SERVER_AUTH;\n        ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_SERVER_AUTH );\n    }\n    else\n    {\n        ext_oid = MBEDTLS_OID_CLIENT_AUTH;\n        ext_len = MBEDTLS_OID_SIZE( MBEDTLS_OID_CLIENT_AUTH );\n    }\n\n    if( mbedtls_x509_crt_check_extended_key_usage( cert, ext_oid, ext_len ) != 0 )\n    {\n        *flags |= MBEDTLS_X509_BADCERT_EXT_KEY_USAGE;\n        ret = -1;\n    }\n#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */\n\n    return( ret );\n}\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n/*\n * Convert version numbers to/from wire format\n * and, for DTLS, to/from TLS equivalent.\n *\n * For TLS this is the identity.\n * For DTLS, use 1's complement (v -> 255 - v, and then map as follows:\n * 1.0 <-> 3.2      (DTLS 1.0 is based on TLS 1.1)\n * 1.x <-> 3.x+1    for x != 0 (DTLS 1.2 based on TLS 1.2)\n */\nvoid mbedtls_ssl_write_version( int major, int minor, int transport,\n                        unsigned char ver[2] )\n{\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        if( minor == MBEDTLS_SSL_MINOR_VERSION_2 )\n            --minor; /* DTLS 1.0 stored as TLS 1.1 internally */\n\n        ver[0] = (unsigned char)( 255 - ( major - 2 ) );\n        ver[1] = (unsigned char)( 255 - ( minor - 1 ) );\n    }\n    else\n#else\n    ((void) transport);\n#endif\n    {\n        ver[0] = (unsigned char) major;\n        ver[1] = (unsigned char) minor;\n    }\n}\n\nvoid mbedtls_ssl_read_version( int *major, int *minor, int transport,\n                       const unsigned char ver[2] )\n{\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        *major = 255 - ver[0] + 2;\n        *minor = 255 - ver[1] + 1;\n\n        if( *minor == MBEDTLS_SSL_MINOR_VERSION_1 )\n            ++*minor; /* DTLS 1.0 stored as TLS 1.1 internally */\n    }\n    else\n#else\n    ((void) transport);\n#endif\n    {\n        *major = ver[0];\n        *minor = ver[1];\n    }\n}\n\nint mbedtls_ssl_set_calc_verify_md( mbedtls_ssl_context *ssl, int md )\n{\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    if( ssl->minor_ver != MBEDTLS_SSL_MINOR_VERSION_3 )\n        return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;\n\n    switch( md )\n    {\n#if defined(MBEDTLS_SSL_PROTO_TLS1) || defined(MBEDTLS_SSL_PROTO_TLS1_1)\n#if defined(MBEDTLS_MD5_C)\n        case MBEDTLS_SSL_HASH_MD5:\n            return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;\n#endif\n#if defined(MBEDTLS_SHA1_C)\n        case MBEDTLS_SSL_HASH_SHA1:\n            ssl->handshake->calc_verify = ssl_calc_verify_tls;\n            break;\n#endif\n#endif /* MBEDTLS_SSL_PROTO_TLS1 || MBEDTLS_SSL_PROTO_TLS1_1 */\n#if defined(MBEDTLS_SHA512_C)\n        case MBEDTLS_SSL_HASH_SHA384:\n            ssl->handshake->calc_verify = ssl_calc_verify_tls_sha384;\n            break;\n#endif\n#if defined(MBEDTLS_SHA256_C)\n        case MBEDTLS_SSL_HASH_SHA256:\n            ssl->handshake->calc_verify = ssl_calc_verify_tls_sha256;\n            break;\n#endif\n        default:\n            return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;\n    }\n\n    return 0;\n#else /* !MBEDTLS_SSL_PROTO_TLS1_2 */\n    (void) ssl;\n    (void) md;\n\n    return MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH;\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n}\n\n#endif /* MBEDTLS_SSL_TLS_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/threading.c",
    "content": "/*\n *  Threading abstraction layer\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_THREADING_C)\n\n#include \"mbedtls/threading.h\"\n\n#if defined(MBEDTLS_THREADING_PTHREAD)\nstatic void threading_mutex_init_pthread( mbedtls_threading_mutex_t *mutex )\n{\n    if( mutex == NULL )\n        return;\n\n    mutex->is_valid = pthread_mutex_init( &mutex->mutex, NULL ) == 0;\n}\n\nstatic void threading_mutex_free_pthread( mbedtls_threading_mutex_t *mutex )\n{\n    if( mutex == NULL || !mutex->is_valid )\n        return;\n\n    (void) pthread_mutex_destroy( &mutex->mutex );\n    mutex->is_valid = 0;\n}\n\nstatic int threading_mutex_lock_pthread( mbedtls_threading_mutex_t *mutex )\n{\n    if( mutex == NULL || ! mutex->is_valid )\n        return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );\n\n    if( pthread_mutex_lock( &mutex->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n\n    return( 0 );\n}\n\nstatic int threading_mutex_unlock_pthread( mbedtls_threading_mutex_t *mutex )\n{\n    if( mutex == NULL || ! mutex->is_valid )\n        return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );\n\n    if( pthread_mutex_unlock( &mutex->mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n\n    return( 0 );\n}\n\nvoid (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_init_pthread;\nvoid (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_free_pthread;\nint (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t * ) = threading_mutex_lock_pthread;\nint (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t * ) = threading_mutex_unlock_pthread;\n\n/*\n * With phtreads we can statically initialize mutexes\n */\n#define MUTEX_INIT  = { PTHREAD_MUTEX_INITIALIZER, 1 }\n\n#endif /* MBEDTLS_THREADING_PTHREAD */\n\n#if defined(MBEDTLS_THREADING_ALT)\nstatic int threading_mutex_fail( mbedtls_threading_mutex_t *mutex )\n{\n    ((void) mutex );\n    return( MBEDTLS_ERR_THREADING_BAD_INPUT_DATA );\n}\nstatic void threading_mutex_dummy( mbedtls_threading_mutex_t *mutex )\n{\n    ((void) mutex );\n    return;\n}\n\nvoid (*mbedtls_mutex_init)( mbedtls_threading_mutex_t * ) = threading_mutex_dummy;\nvoid (*mbedtls_mutex_free)( mbedtls_threading_mutex_t * ) = threading_mutex_dummy;\nint (*mbedtls_mutex_lock)( mbedtls_threading_mutex_t * ) = threading_mutex_fail;\nint (*mbedtls_mutex_unlock)( mbedtls_threading_mutex_t * ) = threading_mutex_fail;\n\n/*\n * Set functions pointers and initialize global mutexes\n */\nvoid mbedtls_threading_set_alt( void (*mutex_init)( mbedtls_threading_mutex_t * ),\n                       void (*mutex_free)( mbedtls_threading_mutex_t * ),\n                       int (*mutex_lock)( mbedtls_threading_mutex_t * ),\n                       int (*mutex_unlock)( mbedtls_threading_mutex_t * ) )\n{\n    mbedtls_mutex_init = mutex_init;\n    mbedtls_mutex_free = mutex_free;\n    mbedtls_mutex_lock = mutex_lock;\n    mbedtls_mutex_unlock = mutex_unlock;\n\n    mbedtls_mutex_init( &mbedtls_threading_readdir_mutex );\n    mbedtls_mutex_init( &mbedtls_threading_gmtime_mutex );\n}\n\n/*\n * Free global mutexes\n */\nvoid mbedtls_threading_free_alt( void )\n{\n    mbedtls_mutex_free( &mbedtls_threading_readdir_mutex );\n    mbedtls_mutex_free( &mbedtls_threading_gmtime_mutex );\n}\n#endif /* MBEDTLS_THREADING_ALT */\n\n/*\n * Define global mutexes\n */\n#ifndef MUTEX_INIT\n#define MUTEX_INIT\n#endif\nmbedtls_threading_mutex_t mbedtls_threading_readdir_mutex MUTEX_INIT;\nmbedtls_threading_mutex_t mbedtls_threading_gmtime_mutex MUTEX_INIT;\n\n#endif /* MBEDTLS_THREADING_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/timing.c",
    "content": "/*\n *  Portable interface to the CPU cycle counter\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_TIMING_C)\n\n#include \"mbedtls/timing.h\"\n\n#if !defined(MBEDTLS_TIMING_ALT)\n\n#if !defined(unix) && !defined(__unix__) && !defined(__unix) && \\\n    !defined(__APPLE__) && !defined(_WIN32)\n#error \"This module only works on Unix and Windows, see MBEDTLS_TIMING_C in config.h\"\n#endif\n\n#ifndef asm\n#define asm __asm\n#endif\n\n#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)\n\n#include <windows.h>\n#include <winbase.h>\n\nstruct _hr_time\n{\n    LARGE_INTEGER start;\n};\n\n#else\n\n#include <unistd.h>\n#include <sys/types.h>\n#include <sys/time.h>\n#include <signal.h>\n#include <time.h>\n\nstruct _hr_time\n{\n    struct timeval start;\n};\n\n#endif /* _WIN32 && !EFIX64 && !EFI32 */\n\n#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \\\n    ( defined(_MSC_VER) && defined(_M_IX86) ) || defined(__WATCOMC__)\n\n#define HAVE_HARDCLOCK\n\nunsigned long mbedtls_timing_hardclock( void )\n{\n    unsigned long tsc;\n    __asm   rdtsc\n    __asm   mov  [tsc], eax\n    return( tsc );\n}\n#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&\n          ( _MSC_VER && _M_IX86 ) || __WATCOMC__ */\n\n/* some versions of mingw-64 have 32-bit longs even on x84_64 */\n#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \\\n    defined(__GNUC__) && ( defined(__i386__) || (                       \\\n    ( defined(__amd64__) || defined( __x86_64__) ) && __SIZEOF_LONG__ == 4 ) )\n\n#define HAVE_HARDCLOCK\n\nunsigned long mbedtls_timing_hardclock( void )\n{\n    unsigned long lo, hi;\n    asm volatile( \"rdtsc\" : \"=a\" (lo), \"=d\" (hi) );\n    return( lo );\n}\n#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&\n          __GNUC__ && __i386__ */\n\n#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \\\n    defined(__GNUC__) && ( defined(__amd64__) || defined(__x86_64__) )\n\n#define HAVE_HARDCLOCK\n\nunsigned long mbedtls_timing_hardclock( void )\n{\n    unsigned long lo, hi;\n    asm volatile( \"rdtsc\" : \"=a\" (lo), \"=d\" (hi) );\n    return( lo | ( hi << 32 ) );\n}\n#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&\n          __GNUC__ && ( __amd64__ || __x86_64__ ) */\n\n#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \\\n    defined(__GNUC__) && ( defined(__powerpc__) || defined(__ppc__) )\n\n#define HAVE_HARDCLOCK\n\nunsigned long mbedtls_timing_hardclock( void )\n{\n    unsigned long tbl, tbu0, tbu1;\n\n    do\n    {\n        asm volatile( \"mftbu %0\" : \"=r\" (tbu0) );\n        asm volatile( \"mftb  %0\" : \"=r\" (tbl ) );\n        asm volatile( \"mftbu %0\" : \"=r\" (tbu1) );\n    }\n    while( tbu0 != tbu1 );\n\n    return( tbl );\n}\n#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&\n          __GNUC__ && ( __powerpc__ || __ppc__ ) */\n\n#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \\\n    defined(__GNUC__) && defined(__sparc64__)\n\n#if defined(__OpenBSD__)\n#warning OpenBSD does not allow access to tick register using software version instead\n#else\n#define HAVE_HARDCLOCK\n\nunsigned long mbedtls_timing_hardclock( void )\n{\n    unsigned long tick;\n    asm volatile( \"rdpr %%tick, %0;\" : \"=&r\" (tick) );\n    return( tick );\n}\n#endif /* __OpenBSD__ */\n#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&\n          __GNUC__ && __sparc64__ */\n\n#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&  \\\n    defined(__GNUC__) && defined(__sparc__) && !defined(__sparc64__)\n\n#define HAVE_HARDCLOCK\n\nunsigned long mbedtls_timing_hardclock( void )\n{\n    unsigned long tick;\n    asm volatile( \".byte 0x83, 0x41, 0x00, 0x00\" );\n    asm volatile( \"mov   %%g1, %0\" : \"=r\" (tick) );\n    return( tick );\n}\n#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&\n          __GNUC__ && __sparc__ && !__sparc64__ */\n\n#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&      \\\n    defined(__GNUC__) && defined(__alpha__)\n\n#define HAVE_HARDCLOCK\n\nunsigned long mbedtls_timing_hardclock( void )\n{\n    unsigned long cc;\n    asm volatile( \"rpcc %0\" : \"=r\" (cc) );\n    return( cc & 0xFFFFFFFF );\n}\n#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&\n          __GNUC__ && __alpha__ */\n\n#if !defined(HAVE_HARDCLOCK) && defined(MBEDTLS_HAVE_ASM) &&      \\\n    defined(__GNUC__) && defined(__ia64__)\n\n#define HAVE_HARDCLOCK\n\nunsigned long mbedtls_timing_hardclock( void )\n{\n    unsigned long itc;\n    asm volatile( \"mov %0 = ar.itc\" : \"=r\" (itc) );\n    return( itc );\n}\n#endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM &&\n          __GNUC__ && __ia64__ */\n\n#if !defined(HAVE_HARDCLOCK) && defined(_MSC_VER) && \\\n    !defined(EFIX64) && !defined(EFI32)\n\n#define HAVE_HARDCLOCK\n\nunsigned long mbedtls_timing_hardclock( void )\n{\n    LARGE_INTEGER offset;\n\n    QueryPerformanceCounter( &offset );\n\n    return( (unsigned long)( offset.QuadPart ) );\n}\n#endif /* !HAVE_HARDCLOCK && _MSC_VER && !EFIX64 && !EFI32 */\n\n#if !defined(HAVE_HARDCLOCK)\n\n#define HAVE_HARDCLOCK\n\nstatic int hardclock_init = 0;\nstatic struct timeval tv_init;\n\nunsigned long mbedtls_timing_hardclock( void )\n{\n    struct timeval tv_cur;\n\n    if( hardclock_init == 0 )\n    {\n        gettimeofday( &tv_init, NULL );\n        hardclock_init = 1;\n    }\n\n    gettimeofday( &tv_cur, NULL );\n    return( ( tv_cur.tv_sec  - tv_init.tv_sec  ) * 1000000\n          + ( tv_cur.tv_usec - tv_init.tv_usec ) );\n}\n#endif /* !HAVE_HARDCLOCK */\n\nvolatile int mbedtls_timing_alarmed = 0;\n\n#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)\n\nunsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset )\n{\n    unsigned long delta;\n    LARGE_INTEGER offset, hfreq;\n    struct _hr_time *t = (struct _hr_time *) val;\n\n    QueryPerformanceCounter(  &offset );\n    QueryPerformanceFrequency( &hfreq );\n\n    delta = (unsigned long)( ( 1000 *\n        ( offset.QuadPart - t->start.QuadPart ) ) /\n           hfreq.QuadPart );\n\n    if( reset )\n        QueryPerformanceCounter( &t->start );\n\n    return( delta );\n}\n\n/* It's OK to use a global because alarm() is supposed to be global anyway */\nstatic DWORD alarmMs;\n\nstatic DWORD WINAPI TimerProc( LPVOID TimerContext )\n{\n    ((void) TimerContext);\n    Sleep( alarmMs );\n    mbedtls_timing_alarmed = 1;\n    return( TRUE );\n}\n\nvoid mbedtls_set_alarm( int seconds )\n{\n    DWORD ThreadId;\n\n    mbedtls_timing_alarmed = 0;\n    alarmMs = seconds * 1000;\n    CloseHandle( CreateThread( NULL, 0, TimerProc, NULL, 0, &ThreadId ) );\n}\n\n#else /* _WIN32 && !EFIX64 && !EFI32 */\n\nunsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset )\n{\n    unsigned long delta;\n    struct timeval offset;\n    struct _hr_time *t = (struct _hr_time *) val;\n\n    gettimeofday( &offset, NULL );\n\n    if( reset )\n    {\n        t->start.tv_sec  = offset.tv_sec;\n        t->start.tv_usec = offset.tv_usec;\n        return( 0 );\n    }\n\n    delta = ( offset.tv_sec  - t->start.tv_sec  ) * 1000\n          + ( offset.tv_usec - t->start.tv_usec ) / 1000;\n\n    return( delta );\n}\n\nstatic void sighandler( int signum )\n{\n    mbedtls_timing_alarmed = 1;\n    signal( signum, sighandler );\n}\n\nvoid mbedtls_set_alarm( int seconds )\n{\n    mbedtls_timing_alarmed = 0;\n    signal( SIGALRM, sighandler );\n    alarm( seconds );\n}\n\n#endif /* _WIN32 && !EFIX64 && !EFI32 */\n\n/*\n * Set delays to watch\n */\nvoid mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms )\n{\n    mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data;\n\n    ctx->int_ms = int_ms;\n    ctx->fin_ms = fin_ms;\n\n    if( fin_ms != 0 )\n        (void) mbedtls_timing_get_timer( &ctx->timer, 1 );\n}\n\n/*\n * Get number of delays expired\n */\nint mbedtls_timing_get_delay( void *data )\n{\n    mbedtls_timing_delay_context *ctx = (mbedtls_timing_delay_context *) data;\n    unsigned long elapsed_ms;\n\n    if( ctx->fin_ms == 0 )\n        return( -1 );\n\n    elapsed_ms = mbedtls_timing_get_timer( &ctx->timer, 0 );\n\n    if( elapsed_ms >= ctx->fin_ms )\n        return( 2 );\n\n    if( elapsed_ms >= ctx->int_ms )\n        return( 1 );\n\n    return( 0 );\n}\n\n#endif /* !MBEDTLS_TIMING_ALT */\n\n#if defined(MBEDTLS_SELF_TEST)\n\n/*\n * Busy-waits for the given number of milliseconds.\n * Used for testing mbedtls_timing_hardclock.\n */\nstatic void busy_msleep( unsigned long msec )\n{\n    struct mbedtls_timing_hr_time hires;\n    unsigned long i = 0; /* for busy-waiting */\n    volatile unsigned long j; /* to prevent optimisation */\n\n    (void) mbedtls_timing_get_timer( &hires, 1 );\n\n    while( mbedtls_timing_get_timer( &hires, 0 ) < msec )\n        i++;\n\n    j = i;\n    (void) j;\n}\n\n#define FAIL    do                      \\\n{                                       \\\n    if( verbose != 0 )                  \\\n        mbedtls_printf( \"failed\\n\" );   \\\n                                        \\\n    return( 1 );                        \\\n} while( 0 )\n\n/*\n * Checkup routine\n *\n * Warning: this is work in progress, some tests may not be reliable enough\n * yet! False positives may happen.\n */\nint mbedtls_timing_self_test( int verbose )\n{\n    unsigned long cycles, ratio;\n    unsigned long millisecs, secs;\n    int hardfail;\n    struct mbedtls_timing_hr_time hires;\n    uint32_t a, b;\n    mbedtls_timing_delay_context ctx;\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  TIMING tests note: will take some time!\\n\" );\n\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  TIMING test #1 (set_alarm / get_timer): \" );\n\n    for( secs = 1; secs <= 3; secs++ )\n    {\n        (void) mbedtls_timing_get_timer( &hires, 1 );\n\n        mbedtls_set_alarm( (int) secs );\n        while( !mbedtls_timing_alarmed )\n            ;\n\n        millisecs = mbedtls_timing_get_timer( &hires, 0 );\n\n        /* For some reason on Windows it looks like alarm has an extra delay\n         * (maybe related to creating a new thread). Allow some room here. */\n        if( millisecs < 800 * secs || millisecs > 1200 * secs + 300 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            return( 1 );\n        }\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  TIMING test #2 (set/get_delay        ): \" );\n\n    for( a = 200; a <= 400; a += 200 )\n    {\n        for( b = 200; b <= 400; b += 200 )\n        {\n            mbedtls_timing_set_delay( &ctx, a, a + b );\n\n            busy_msleep( a - a / 8 );\n            if( mbedtls_timing_get_delay( &ctx ) != 0 )\n                FAIL;\n\n            busy_msleep( a / 4 );\n            if( mbedtls_timing_get_delay( &ctx ) != 1 )\n                FAIL;\n\n            busy_msleep( b - a / 8 - b / 8 );\n            if( mbedtls_timing_get_delay( &ctx ) != 1 )\n                FAIL;\n\n            busy_msleep( b / 4 );\n            if( mbedtls_timing_get_delay( &ctx ) != 2 )\n                FAIL;\n        }\n    }\n\n    mbedtls_timing_set_delay( &ctx, 0, 0 );\n    busy_msleep( 200 );\n    if( mbedtls_timing_get_delay( &ctx ) != -1 )\n        FAIL;\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  TIMING test #3 (hardclock / get_timer): \" );\n\n    /*\n     * Allow one failure for possible counter wrapping.\n     * On a 4Ghz 32-bit machine the cycle counter wraps about once per second;\n     * since the whole test is about 10ms, it shouldn't happen twice in a row.\n     */\n    hardfail = 0;\n\nhard_test:\n    if( hardfail > 1 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed (ignored)\\n\" );\n\n        goto hard_test_done;\n    }\n\n    /* Get a reference ratio cycles/ms */\n    millisecs = 1;\n    cycles = mbedtls_timing_hardclock();\n    busy_msleep( millisecs );\n    cycles = mbedtls_timing_hardclock() - cycles;\n    ratio = cycles / millisecs;\n\n    /* Check that the ratio is mostly constant */\n    for( millisecs = 2; millisecs <= 4; millisecs++ )\n    {\n        cycles = mbedtls_timing_hardclock();\n        busy_msleep( millisecs );\n        cycles = mbedtls_timing_hardclock() - cycles;\n\n        /* Allow variation up to 20% */\n        if( cycles / millisecs < ratio - ratio / 5 ||\n            cycles / millisecs > ratio + ratio / 5 )\n        {\n            hardfail++;\n            goto hard_test;\n        }\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\" );\n\nhard_test_done:\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_TIMING_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/version.c",
    "content": "/*\n *  Version information\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_VERSION_C)\n\n#include \"mbedtls/version.h\"\n#include <string.h>\n\nunsigned int mbedtls_version_get_number()\n{\n    return( MBEDTLS_VERSION_NUMBER );\n}\n\nvoid mbedtls_version_get_string( char *string )\n{\n    memcpy( string, MBEDTLS_VERSION_STRING,\n            sizeof( MBEDTLS_VERSION_STRING ) );\n}\n\nvoid mbedtls_version_get_string_full( char *string )\n{\n    memcpy( string, MBEDTLS_VERSION_STRING_FULL,\n            sizeof( MBEDTLS_VERSION_STRING_FULL ) );\n}\n\n#endif /* MBEDTLS_VERSION_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/version_features.c",
    "content": "/*\n *  Version feature information\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_VERSION_C)\n\n#include \"mbedtls/version.h\"\n\n#include <string.h>\n\nstatic const char *features[] = {\n#if defined(MBEDTLS_VERSION_FEATURES)\n#if defined(MBEDTLS_HAVE_ASM)\n    \"MBEDTLS_HAVE_ASM\",\n#endif /* MBEDTLS_HAVE_ASM */\n#if defined(MBEDTLS_NO_UDBL_DIVISION)\n    \"MBEDTLS_NO_UDBL_DIVISION\",\n#endif /* MBEDTLS_NO_UDBL_DIVISION */\n#if defined(MBEDTLS_HAVE_SSE2)\n    \"MBEDTLS_HAVE_SSE2\",\n#endif /* MBEDTLS_HAVE_SSE2 */\n#if defined(MBEDTLS_HAVE_TIME)\n    \"MBEDTLS_HAVE_TIME\",\n#endif /* MBEDTLS_HAVE_TIME */\n#if defined(MBEDTLS_HAVE_TIME_DATE)\n    \"MBEDTLS_HAVE_TIME_DATE\",\n#endif /* MBEDTLS_HAVE_TIME_DATE */\n#if defined(MBEDTLS_PLATFORM_MEMORY)\n    \"MBEDTLS_PLATFORM_MEMORY\",\n#endif /* MBEDTLS_PLATFORM_MEMORY */\n#if defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS)\n    \"MBEDTLS_PLATFORM_NO_STD_FUNCTIONS\",\n#endif /* MBEDTLS_PLATFORM_NO_STD_FUNCTIONS */\n#if defined(MBEDTLS_PLATFORM_EXIT_ALT)\n    \"MBEDTLS_PLATFORM_EXIT_ALT\",\n#endif /* MBEDTLS_PLATFORM_EXIT_ALT */\n#if defined(MBEDTLS_PLATFORM_TIME_ALT)\n    \"MBEDTLS_PLATFORM_TIME_ALT\",\n#endif /* MBEDTLS_PLATFORM_TIME_ALT */\n#if defined(MBEDTLS_PLATFORM_FPRINTF_ALT)\n    \"MBEDTLS_PLATFORM_FPRINTF_ALT\",\n#endif /* MBEDTLS_PLATFORM_FPRINTF_ALT */\n#if defined(MBEDTLS_PLATFORM_PRINTF_ALT)\n    \"MBEDTLS_PLATFORM_PRINTF_ALT\",\n#endif /* MBEDTLS_PLATFORM_PRINTF_ALT */\n#if defined(MBEDTLS_PLATFORM_SNPRINTF_ALT)\n    \"MBEDTLS_PLATFORM_SNPRINTF_ALT\",\n#endif /* MBEDTLS_PLATFORM_SNPRINTF_ALT */\n#if defined(MBEDTLS_PLATFORM_NV_SEED_ALT)\n    \"MBEDTLS_PLATFORM_NV_SEED_ALT\",\n#endif /* MBEDTLS_PLATFORM_NV_SEED_ALT */\n#if defined(MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT)\n    \"MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT\",\n#endif /* MBEDTLS_PLATFORM_SETUP_TEARDOWN_ALT */\n#if defined(MBEDTLS_DEPRECATED_WARNING)\n    \"MBEDTLS_DEPRECATED_WARNING\",\n#endif /* MBEDTLS_DEPRECATED_WARNING */\n#if defined(MBEDTLS_DEPRECATED_REMOVED)\n    \"MBEDTLS_DEPRECATED_REMOVED\",\n#endif /* MBEDTLS_DEPRECATED_REMOVED */\n#if defined(MBEDTLS_TIMING_ALT)\n    \"MBEDTLS_TIMING_ALT\",\n#endif /* MBEDTLS_TIMING_ALT */\n#if defined(MBEDTLS_AES_ALT)\n    \"MBEDTLS_AES_ALT\",\n#endif /* MBEDTLS_AES_ALT */\n#if defined(MBEDTLS_ARC4_ALT)\n    \"MBEDTLS_ARC4_ALT\",\n#endif /* MBEDTLS_ARC4_ALT */\n#if defined(MBEDTLS_BLOWFISH_ALT)\n    \"MBEDTLS_BLOWFISH_ALT\",\n#endif /* MBEDTLS_BLOWFISH_ALT */\n#if defined(MBEDTLS_CAMELLIA_ALT)\n    \"MBEDTLS_CAMELLIA_ALT\",\n#endif /* MBEDTLS_CAMELLIA_ALT */\n#if defined(MBEDTLS_DES_ALT)\n    \"MBEDTLS_DES_ALT\",\n#endif /* MBEDTLS_DES_ALT */\n#if defined(MBEDTLS_XTEA_ALT)\n    \"MBEDTLS_XTEA_ALT\",\n#endif /* MBEDTLS_XTEA_ALT */\n#if defined(MBEDTLS_MD2_ALT)\n    \"MBEDTLS_MD2_ALT\",\n#endif /* MBEDTLS_MD2_ALT */\n#if defined(MBEDTLS_MD4_ALT)\n    \"MBEDTLS_MD4_ALT\",\n#endif /* MBEDTLS_MD4_ALT */\n#if defined(MBEDTLS_MD5_ALT)\n    \"MBEDTLS_MD5_ALT\",\n#endif /* MBEDTLS_MD5_ALT */\n#if defined(MBEDTLS_RIPEMD160_ALT)\n    \"MBEDTLS_RIPEMD160_ALT\",\n#endif /* MBEDTLS_RIPEMD160_ALT */\n#if defined(MBEDTLS_SHA1_ALT)\n    \"MBEDTLS_SHA1_ALT\",\n#endif /* MBEDTLS_SHA1_ALT */\n#if defined(MBEDTLS_SHA256_ALT)\n    \"MBEDTLS_SHA256_ALT\",\n#endif /* MBEDTLS_SHA256_ALT */\n#if defined(MBEDTLS_SHA512_ALT)\n    \"MBEDTLS_SHA512_ALT\",\n#endif /* MBEDTLS_SHA512_ALT */\n#if defined(MBEDTLS_ECP_ALT)\n    \"MBEDTLS_ECP_ALT\",\n#endif /* MBEDTLS_ECP_ALT */\n#if defined(MBEDTLS_MD2_PROCESS_ALT)\n    \"MBEDTLS_MD2_PROCESS_ALT\",\n#endif /* MBEDTLS_MD2_PROCESS_ALT */\n#if defined(MBEDTLS_MD4_PROCESS_ALT)\n    \"MBEDTLS_MD4_PROCESS_ALT\",\n#endif /* MBEDTLS_MD4_PROCESS_ALT */\n#if defined(MBEDTLS_MD5_PROCESS_ALT)\n    \"MBEDTLS_MD5_PROCESS_ALT\",\n#endif /* MBEDTLS_MD5_PROCESS_ALT */\n#if defined(MBEDTLS_RIPEMD160_PROCESS_ALT)\n    \"MBEDTLS_RIPEMD160_PROCESS_ALT\",\n#endif /* MBEDTLS_RIPEMD160_PROCESS_ALT */\n#if defined(MBEDTLS_SHA1_PROCESS_ALT)\n    \"MBEDTLS_SHA1_PROCESS_ALT\",\n#endif /* MBEDTLS_SHA1_PROCESS_ALT */\n#if defined(MBEDTLS_SHA256_PROCESS_ALT)\n    \"MBEDTLS_SHA256_PROCESS_ALT\",\n#endif /* MBEDTLS_SHA256_PROCESS_ALT */\n#if defined(MBEDTLS_SHA512_PROCESS_ALT)\n    \"MBEDTLS_SHA512_PROCESS_ALT\",\n#endif /* MBEDTLS_SHA512_PROCESS_ALT */\n#if defined(MBEDTLS_DES_SETKEY_ALT)\n    \"MBEDTLS_DES_SETKEY_ALT\",\n#endif /* MBEDTLS_DES_SETKEY_ALT */\n#if defined(MBEDTLS_DES_CRYPT_ECB_ALT)\n    \"MBEDTLS_DES_CRYPT_ECB_ALT\",\n#endif /* MBEDTLS_DES_CRYPT_ECB_ALT */\n#if defined(MBEDTLS_DES3_CRYPT_ECB_ALT)\n    \"MBEDTLS_DES3_CRYPT_ECB_ALT\",\n#endif /* MBEDTLS_DES3_CRYPT_ECB_ALT */\n#if defined(MBEDTLS_AES_SETKEY_ENC_ALT)\n    \"MBEDTLS_AES_SETKEY_ENC_ALT\",\n#endif /* MBEDTLS_AES_SETKEY_ENC_ALT */\n#if defined(MBEDTLS_AES_SETKEY_DEC_ALT)\n    \"MBEDTLS_AES_SETKEY_DEC_ALT\",\n#endif /* MBEDTLS_AES_SETKEY_DEC_ALT */\n#if defined(MBEDTLS_AES_ENCRYPT_ALT)\n    \"MBEDTLS_AES_ENCRYPT_ALT\",\n#endif /* MBEDTLS_AES_ENCRYPT_ALT */\n#if defined(MBEDTLS_AES_DECRYPT_ALT)\n    \"MBEDTLS_AES_DECRYPT_ALT\",\n#endif /* MBEDTLS_AES_DECRYPT_ALT */\n#if defined(MBEDTLS_ECP_INTERNAL_ALT)\n    \"MBEDTLS_ECP_INTERNAL_ALT\",\n#endif /* MBEDTLS_ECP_INTERNAL_ALT */\n#if defined(MBEDTLS_ECP_RANDOMIZE_JAC_ALT)\n    \"MBEDTLS_ECP_RANDOMIZE_JAC_ALT\",\n#endif /* MBEDTLS_ECP_RANDOMIZE_JAC_ALT */\n#if defined(MBEDTLS_ECP_ADD_MIXED_ALT)\n    \"MBEDTLS_ECP_ADD_MIXED_ALT\",\n#endif /* MBEDTLS_ECP_ADD_MIXED_ALT */\n#if defined(MBEDTLS_ECP_DOUBLE_JAC_ALT)\n    \"MBEDTLS_ECP_DOUBLE_JAC_ALT\",\n#endif /* MBEDTLS_ECP_DOUBLE_JAC_ALT */\n#if defined(MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT)\n    \"MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT\",\n#endif /* MBEDTLS_ECP_NORMALIZE_JAC_MANY_ALT */\n#if defined(MBEDTLS_ECP_NORMALIZE_JAC_ALT)\n    \"MBEDTLS_ECP_NORMALIZE_JAC_ALT\",\n#endif /* MBEDTLS_ECP_NORMALIZE_JAC_ALT */\n#if defined(MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT)\n    \"MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT\",\n#endif /* MBEDTLS_ECP_DOUBLE_ADD_MXZ_ALT */\n#if defined(MBEDTLS_ECP_RANDOMIZE_MXZ_ALT)\n    \"MBEDTLS_ECP_RANDOMIZE_MXZ_ALT\",\n#endif /* MBEDTLS_ECP_RANDOMIZE_MXZ_ALT */\n#if defined(MBEDTLS_ECP_NORMALIZE_MXZ_ALT)\n    \"MBEDTLS_ECP_NORMALIZE_MXZ_ALT\",\n#endif /* MBEDTLS_ECP_NORMALIZE_MXZ_ALT */\n#if defined(MBEDTLS_TEST_NULL_ENTROPY)\n    \"MBEDTLS_TEST_NULL_ENTROPY\",\n#endif /* MBEDTLS_TEST_NULL_ENTROPY */\n#if defined(MBEDTLS_ENTROPY_HARDWARE_ALT)\n    \"MBEDTLS_ENTROPY_HARDWARE_ALT\",\n#endif /* MBEDTLS_ENTROPY_HARDWARE_ALT */\n#if defined(MBEDTLS_AES_ROM_TABLES)\n    \"MBEDTLS_AES_ROM_TABLES\",\n#endif /* MBEDTLS_AES_ROM_TABLES */\n#if defined(MBEDTLS_CAMELLIA_SMALL_MEMORY)\n    \"MBEDTLS_CAMELLIA_SMALL_MEMORY\",\n#endif /* MBEDTLS_CAMELLIA_SMALL_MEMORY */\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    \"MBEDTLS_CIPHER_MODE_CBC\",\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_CIPHER_MODE_CFB)\n    \"MBEDTLS_CIPHER_MODE_CFB\",\n#endif /* MBEDTLS_CIPHER_MODE_CFB */\n#if defined(MBEDTLS_CIPHER_MODE_CTR)\n    \"MBEDTLS_CIPHER_MODE_CTR\",\n#endif /* MBEDTLS_CIPHER_MODE_CTR */\n#if defined(MBEDTLS_CIPHER_NULL_CIPHER)\n    \"MBEDTLS_CIPHER_NULL_CIPHER\",\n#endif /* MBEDTLS_CIPHER_NULL_CIPHER */\n#if defined(MBEDTLS_CIPHER_PADDING_PKCS7)\n    \"MBEDTLS_CIPHER_PADDING_PKCS7\",\n#endif /* MBEDTLS_CIPHER_PADDING_PKCS7 */\n#if defined(MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS)\n    \"MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS\",\n#endif /* MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS */\n#if defined(MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN)\n    \"MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN\",\n#endif /* MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN */\n#if defined(MBEDTLS_CIPHER_PADDING_ZEROS)\n    \"MBEDTLS_CIPHER_PADDING_ZEROS\",\n#endif /* MBEDTLS_CIPHER_PADDING_ZEROS */\n#if defined(MBEDTLS_ENABLE_WEAK_CIPHERSUITES)\n    \"MBEDTLS_ENABLE_WEAK_CIPHERSUITES\",\n#endif /* MBEDTLS_ENABLE_WEAK_CIPHERSUITES */\n#if defined(MBEDTLS_REMOVE_ARC4_CIPHERSUITES)\n    \"MBEDTLS_REMOVE_ARC4_CIPHERSUITES\",\n#endif /* MBEDTLS_REMOVE_ARC4_CIPHERSUITES */\n#if defined(MBEDTLS_ECP_DP_SECP192R1_ENABLED)\n    \"MBEDTLS_ECP_DP_SECP192R1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_SECP192R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP224R1_ENABLED)\n    \"MBEDTLS_ECP_DP_SECP224R1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_SECP224R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED)\n    \"MBEDTLS_ECP_DP_SECP256R1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_SECP256R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP384R1_ENABLED)\n    \"MBEDTLS_ECP_DP_SECP384R1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_SECP384R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP521R1_ENABLED)\n    \"MBEDTLS_ECP_DP_SECP521R1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_SECP521R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP192K1_ENABLED)\n    \"MBEDTLS_ECP_DP_SECP192K1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_SECP192K1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP224K1_ENABLED)\n    \"MBEDTLS_ECP_DP_SECP224K1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_SECP224K1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_SECP256K1_ENABLED)\n    \"MBEDTLS_ECP_DP_SECP256K1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_SECP256K1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_BP256R1_ENABLED)\n    \"MBEDTLS_ECP_DP_BP256R1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_BP256R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_BP384R1_ENABLED)\n    \"MBEDTLS_ECP_DP_BP384R1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_BP384R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_BP512R1_ENABLED)\n    \"MBEDTLS_ECP_DP_BP512R1_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_BP512R1_ENABLED */\n#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)\n    \"MBEDTLS_ECP_DP_CURVE25519_ENABLED\",\n#endif /* MBEDTLS_ECP_DP_CURVE25519_ENABLED */\n#if defined(MBEDTLS_ECP_NIST_OPTIM)\n    \"MBEDTLS_ECP_NIST_OPTIM\",\n#endif /* MBEDTLS_ECP_NIST_OPTIM */\n#if defined(MBEDTLS_ECDSA_DETERMINISTIC)\n    \"MBEDTLS_ECDSA_DETERMINISTIC\",\n#endif /* MBEDTLS_ECDSA_DETERMINISTIC */\n#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_PSK_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_RSA_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_RSA_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_RSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED */\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    \"MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED\",\n#endif /* MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED */\n#if defined(MBEDTLS_PK_PARSE_EC_EXTENDED)\n    \"MBEDTLS_PK_PARSE_EC_EXTENDED\",\n#endif /* MBEDTLS_PK_PARSE_EC_EXTENDED */\n#if defined(MBEDTLS_ERROR_STRERROR_DUMMY)\n    \"MBEDTLS_ERROR_STRERROR_DUMMY\",\n#endif /* MBEDTLS_ERROR_STRERROR_DUMMY */\n#if defined(MBEDTLS_GENPRIME)\n    \"MBEDTLS_GENPRIME\",\n#endif /* MBEDTLS_GENPRIME */\n#if defined(MBEDTLS_FS_IO)\n    \"MBEDTLS_FS_IO\",\n#endif /* MBEDTLS_FS_IO */\n#if defined(MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES)\n    \"MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES\",\n#endif /* MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES */\n#if defined(MBEDTLS_NO_PLATFORM_ENTROPY)\n    \"MBEDTLS_NO_PLATFORM_ENTROPY\",\n#endif /* MBEDTLS_NO_PLATFORM_ENTROPY */\n#if defined(MBEDTLS_ENTROPY_FORCE_SHA256)\n    \"MBEDTLS_ENTROPY_FORCE_SHA256\",\n#endif /* MBEDTLS_ENTROPY_FORCE_SHA256 */\n#if defined(MBEDTLS_ENTROPY_NV_SEED)\n    \"MBEDTLS_ENTROPY_NV_SEED\",\n#endif /* MBEDTLS_ENTROPY_NV_SEED */\n#if defined(MBEDTLS_MEMORY_DEBUG)\n    \"MBEDTLS_MEMORY_DEBUG\",\n#endif /* MBEDTLS_MEMORY_DEBUG */\n#if defined(MBEDTLS_MEMORY_BACKTRACE)\n    \"MBEDTLS_MEMORY_BACKTRACE\",\n#endif /* MBEDTLS_MEMORY_BACKTRACE */\n#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)\n    \"MBEDTLS_PK_RSA_ALT_SUPPORT\",\n#endif /* MBEDTLS_PK_RSA_ALT_SUPPORT */\n#if defined(MBEDTLS_PKCS1_V15)\n    \"MBEDTLS_PKCS1_V15\",\n#endif /* MBEDTLS_PKCS1_V15 */\n#if defined(MBEDTLS_PKCS1_V21)\n    \"MBEDTLS_PKCS1_V21\",\n#endif /* MBEDTLS_PKCS1_V21 */\n#if defined(MBEDTLS_RSA_NO_CRT)\n    \"MBEDTLS_RSA_NO_CRT\",\n#endif /* MBEDTLS_RSA_NO_CRT */\n#if defined(MBEDTLS_SELF_TEST)\n    \"MBEDTLS_SELF_TEST\",\n#endif /* MBEDTLS_SELF_TEST */\n#if defined(MBEDTLS_SHA256_SMALLER)\n    \"MBEDTLS_SHA256_SMALLER\",\n#endif /* MBEDTLS_SHA256_SMALLER */\n#if defined(MBEDTLS_SSL_ALL_ALERT_MESSAGES)\n    \"MBEDTLS_SSL_ALL_ALERT_MESSAGES\",\n#endif /* MBEDTLS_SSL_ALL_ALERT_MESSAGES */\n#if defined(MBEDTLS_SSL_DEBUG_ALL)\n    \"MBEDTLS_SSL_DEBUG_ALL\",\n#endif /* MBEDTLS_SSL_DEBUG_ALL */\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n    \"MBEDTLS_SSL_ENCRYPT_THEN_MAC\",\n#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n    \"MBEDTLS_SSL_EXTENDED_MASTER_SECRET\",\n#endif /* MBEDTLS_SSL_EXTENDED_MASTER_SECRET */\n#if defined(MBEDTLS_SSL_FALLBACK_SCSV)\n    \"MBEDTLS_SSL_FALLBACK_SCSV\",\n#endif /* MBEDTLS_SSL_FALLBACK_SCSV */\n#if defined(MBEDTLS_SSL_HW_RECORD_ACCEL)\n    \"MBEDTLS_SSL_HW_RECORD_ACCEL\",\n#endif /* MBEDTLS_SSL_HW_RECORD_ACCEL */\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\n    \"MBEDTLS_SSL_CBC_RECORD_SPLITTING\",\n#endif /* MBEDTLS_SSL_CBC_RECORD_SPLITTING */\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    \"MBEDTLS_SSL_RENEGOTIATION\",\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n#if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO)\n    \"MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO\",\n#endif /* MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO */\n#if defined(MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE)\n    \"MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE\",\n#endif /* MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE */\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n    \"MBEDTLS_SSL_MAX_FRAGMENT_LENGTH\",\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n#if defined(MBEDTLS_SSL_PROTO_SSL3)\n    \"MBEDTLS_SSL_PROTO_SSL3\",\n#endif /* MBEDTLS_SSL_PROTO_SSL3 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1)\n    \"MBEDTLS_SSL_PROTO_TLS1\",\n#endif /* MBEDTLS_SSL_PROTO_TLS1 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1_1)\n    \"MBEDTLS_SSL_PROTO_TLS1_1\",\n#endif /* MBEDTLS_SSL_PROTO_TLS1_1 */\n#if defined(MBEDTLS_SSL_PROTO_TLS1_2)\n    \"MBEDTLS_SSL_PROTO_TLS1_2\",\n#endif /* MBEDTLS_SSL_PROTO_TLS1_2 */\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    \"MBEDTLS_SSL_PROTO_DTLS\",\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n#if defined(MBEDTLS_SSL_ALPN)\n    \"MBEDTLS_SSL_ALPN\",\n#endif /* MBEDTLS_SSL_ALPN */\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n    \"MBEDTLS_SSL_DTLS_ANTI_REPLAY\",\n#endif /* MBEDTLS_SSL_DTLS_ANTI_REPLAY */\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)\n    \"MBEDTLS_SSL_DTLS_HELLO_VERIFY\",\n#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */\n#if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE)\n    \"MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE\",\n#endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE */\n#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)\n    \"MBEDTLS_SSL_DTLS_BADMAC_LIMIT\",\n#endif /* MBEDTLS_SSL_DTLS_BADMAC_LIMIT */\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    \"MBEDTLS_SSL_SESSION_TICKETS\",\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n#if defined(MBEDTLS_SSL_EXPORT_KEYS)\n    \"MBEDTLS_SSL_EXPORT_KEYS\",\n#endif /* MBEDTLS_SSL_EXPORT_KEYS */\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)\n    \"MBEDTLS_SSL_SERVER_NAME_INDICATION\",\n#endif /* MBEDTLS_SSL_SERVER_NAME_INDICATION */\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n    \"MBEDTLS_SSL_TRUNCATED_HMAC\",\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n#if defined(MBEDTLS_THREADING_ALT)\n    \"MBEDTLS_THREADING_ALT\",\n#endif /* MBEDTLS_THREADING_ALT */\n#if defined(MBEDTLS_THREADING_PTHREAD)\n    \"MBEDTLS_THREADING_PTHREAD\",\n#endif /* MBEDTLS_THREADING_PTHREAD */\n#if defined(MBEDTLS_VERSION_FEATURES)\n    \"MBEDTLS_VERSION_FEATURES\",\n#endif /* MBEDTLS_VERSION_FEATURES */\n#if defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3)\n    \"MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3\",\n#endif /* MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3 */\n#if defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION)\n    \"MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION\",\n#endif /* MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION */\n#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)\n    \"MBEDTLS_X509_CHECK_KEY_USAGE\",\n#endif /* MBEDTLS_X509_CHECK_KEY_USAGE */\n#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)\n    \"MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE\",\n#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */\n#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)\n    \"MBEDTLS_X509_RSASSA_PSS_SUPPORT\",\n#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */\n#if defined(MBEDTLS_ZLIB_SUPPORT)\n    \"MBEDTLS_ZLIB_SUPPORT\",\n#endif /* MBEDTLS_ZLIB_SUPPORT */\n#if defined(MBEDTLS_AESNI_C)\n    \"MBEDTLS_AESNI_C\",\n#endif /* MBEDTLS_AESNI_C */\n#if defined(MBEDTLS_AES_C)\n    \"MBEDTLS_AES_C\",\n#endif /* MBEDTLS_AES_C */\n#if defined(MBEDTLS_ARC4_C)\n    \"MBEDTLS_ARC4_C\",\n#endif /* MBEDTLS_ARC4_C */\n#if defined(MBEDTLS_ASN1_PARSE_C)\n    \"MBEDTLS_ASN1_PARSE_C\",\n#endif /* MBEDTLS_ASN1_PARSE_C */\n#if defined(MBEDTLS_ASN1_WRITE_C)\n    \"MBEDTLS_ASN1_WRITE_C\",\n#endif /* MBEDTLS_ASN1_WRITE_C */\n#if defined(MBEDTLS_BASE64_C)\n    \"MBEDTLS_BASE64_C\",\n#endif /* MBEDTLS_BASE64_C */\n#if defined(MBEDTLS_BIGNUM_C)\n    \"MBEDTLS_BIGNUM_C\",\n#endif /* MBEDTLS_BIGNUM_C */\n#if defined(MBEDTLS_BLOWFISH_C)\n    \"MBEDTLS_BLOWFISH_C\",\n#endif /* MBEDTLS_BLOWFISH_C */\n#if defined(MBEDTLS_CAMELLIA_C)\n    \"MBEDTLS_CAMELLIA_C\",\n#endif /* MBEDTLS_CAMELLIA_C */\n#if defined(MBEDTLS_CCM_C)\n    \"MBEDTLS_CCM_C\",\n#endif /* MBEDTLS_CCM_C */\n#if defined(MBEDTLS_CERTS_C)\n    \"MBEDTLS_CERTS_C\",\n#endif /* MBEDTLS_CERTS_C */\n#if defined(MBEDTLS_CIPHER_C)\n    \"MBEDTLS_CIPHER_C\",\n#endif /* MBEDTLS_CIPHER_C */\n#if defined(MBEDTLS_CMAC_C)\n    \"MBEDTLS_CMAC_C\",\n#endif /* MBEDTLS_CMAC_C */\n#if defined(MBEDTLS_CTR_DRBG_C)\n    \"MBEDTLS_CTR_DRBG_C\",\n#endif /* MBEDTLS_CTR_DRBG_C */\n#if defined(MBEDTLS_DEBUG_C)\n    \"MBEDTLS_DEBUG_C\",\n#endif /* MBEDTLS_DEBUG_C */\n#if defined(MBEDTLS_DES_C)\n    \"MBEDTLS_DES_C\",\n#endif /* MBEDTLS_DES_C */\n#if defined(MBEDTLS_DHM_C)\n    \"MBEDTLS_DHM_C\",\n#endif /* MBEDTLS_DHM_C */\n#if defined(MBEDTLS_ECDH_C)\n    \"MBEDTLS_ECDH_C\",\n#endif /* MBEDTLS_ECDH_C */\n#if defined(MBEDTLS_ECDSA_C)\n    \"MBEDTLS_ECDSA_C\",\n#endif /* MBEDTLS_ECDSA_C */\n#if defined(MBEDTLS_ECJPAKE_C)\n    \"MBEDTLS_ECJPAKE_C\",\n#endif /* MBEDTLS_ECJPAKE_C */\n#if defined(MBEDTLS_ECP_C)\n    \"MBEDTLS_ECP_C\",\n#endif /* MBEDTLS_ECP_C */\n#if defined(MBEDTLS_ENTROPY_C)\n    \"MBEDTLS_ENTROPY_C\",\n#endif /* MBEDTLS_ENTROPY_C */\n#if defined(MBEDTLS_ERROR_C)\n    \"MBEDTLS_ERROR_C\",\n#endif /* MBEDTLS_ERROR_C */\n#if defined(MBEDTLS_GCM_C)\n    \"MBEDTLS_GCM_C\",\n#endif /* MBEDTLS_GCM_C */\n#if defined(MBEDTLS_HAVEGE_C)\n    \"MBEDTLS_HAVEGE_C\",\n#endif /* MBEDTLS_HAVEGE_C */\n#if defined(MBEDTLS_HMAC_DRBG_C)\n    \"MBEDTLS_HMAC_DRBG_C\",\n#endif /* MBEDTLS_HMAC_DRBG_C */\n#if defined(MBEDTLS_MD_C)\n    \"MBEDTLS_MD_C\",\n#endif /* MBEDTLS_MD_C */\n#if defined(MBEDTLS_MD2_C)\n    \"MBEDTLS_MD2_C\",\n#endif /* MBEDTLS_MD2_C */\n#if defined(MBEDTLS_MD4_C)\n    \"MBEDTLS_MD4_C\",\n#endif /* MBEDTLS_MD4_C */\n#if defined(MBEDTLS_MD5_C)\n    \"MBEDTLS_MD5_C\",\n#endif /* MBEDTLS_MD5_C */\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    \"MBEDTLS_MEMORY_BUFFER_ALLOC_C\",\n#endif /* MBEDTLS_MEMORY_BUFFER_ALLOC_C */\n#if defined(MBEDTLS_NET_C)\n    \"MBEDTLS_NET_C\",\n#endif /* MBEDTLS_NET_C */\n#if defined(MBEDTLS_OID_C)\n    \"MBEDTLS_OID_C\",\n#endif /* MBEDTLS_OID_C */\n#if defined(MBEDTLS_PADLOCK_C)\n    \"MBEDTLS_PADLOCK_C\",\n#endif /* MBEDTLS_PADLOCK_C */\n#if defined(MBEDTLS_PEM_PARSE_C)\n    \"MBEDTLS_PEM_PARSE_C\",\n#endif /* MBEDTLS_PEM_PARSE_C */\n#if defined(MBEDTLS_PEM_WRITE_C)\n    \"MBEDTLS_PEM_WRITE_C\",\n#endif /* MBEDTLS_PEM_WRITE_C */\n#if defined(MBEDTLS_PK_C)\n    \"MBEDTLS_PK_C\",\n#endif /* MBEDTLS_PK_C */\n#if defined(MBEDTLS_PK_PARSE_C)\n    \"MBEDTLS_PK_PARSE_C\",\n#endif /* MBEDTLS_PK_PARSE_C */\n#if defined(MBEDTLS_PK_WRITE_C)\n    \"MBEDTLS_PK_WRITE_C\",\n#endif /* MBEDTLS_PK_WRITE_C */\n#if defined(MBEDTLS_PKCS5_C)\n    \"MBEDTLS_PKCS5_C\",\n#endif /* MBEDTLS_PKCS5_C */\n#if defined(MBEDTLS_PKCS11_C)\n    \"MBEDTLS_PKCS11_C\",\n#endif /* MBEDTLS_PKCS11_C */\n#if defined(MBEDTLS_PKCS12_C)\n    \"MBEDTLS_PKCS12_C\",\n#endif /* MBEDTLS_PKCS12_C */\n#if defined(MBEDTLS_PLATFORM_C)\n    \"MBEDTLS_PLATFORM_C\",\n#endif /* MBEDTLS_PLATFORM_C */\n#if defined(MBEDTLS_RIPEMD160_C)\n    \"MBEDTLS_RIPEMD160_C\",\n#endif /* MBEDTLS_RIPEMD160_C */\n#if defined(MBEDTLS_RSA_C)\n    \"MBEDTLS_RSA_C\",\n#endif /* MBEDTLS_RSA_C */\n#if defined(MBEDTLS_SHA1_C)\n    \"MBEDTLS_SHA1_C\",\n#endif /* MBEDTLS_SHA1_C */\n#if defined(MBEDTLS_SHA256_C)\n    \"MBEDTLS_SHA256_C\",\n#endif /* MBEDTLS_SHA256_C */\n#if defined(MBEDTLS_SHA512_C)\n    \"MBEDTLS_SHA512_C\",\n#endif /* MBEDTLS_SHA512_C */\n#if defined(MBEDTLS_SSL_CACHE_C)\n    \"MBEDTLS_SSL_CACHE_C\",\n#endif /* MBEDTLS_SSL_CACHE_C */\n#if defined(MBEDTLS_SSL_COOKIE_C)\n    \"MBEDTLS_SSL_COOKIE_C\",\n#endif /* MBEDTLS_SSL_COOKIE_C */\n#if defined(MBEDTLS_SSL_TICKET_C)\n    \"MBEDTLS_SSL_TICKET_C\",\n#endif /* MBEDTLS_SSL_TICKET_C */\n#if defined(MBEDTLS_SSL_CLI_C)\n    \"MBEDTLS_SSL_CLI_C\",\n#endif /* MBEDTLS_SSL_CLI_C */\n#if defined(MBEDTLS_SSL_SRV_C)\n    \"MBEDTLS_SSL_SRV_C\",\n#endif /* MBEDTLS_SSL_SRV_C */\n#if defined(MBEDTLS_SSL_TLS_C)\n    \"MBEDTLS_SSL_TLS_C\",\n#endif /* MBEDTLS_SSL_TLS_C */\n#if defined(MBEDTLS_THREADING_C)\n    \"MBEDTLS_THREADING_C\",\n#endif /* MBEDTLS_THREADING_C */\n#if defined(MBEDTLS_TIMING_C)\n    \"MBEDTLS_TIMING_C\",\n#endif /* MBEDTLS_TIMING_C */\n#if defined(MBEDTLS_VERSION_C)\n    \"MBEDTLS_VERSION_C\",\n#endif /* MBEDTLS_VERSION_C */\n#if defined(MBEDTLS_X509_USE_C)\n    \"MBEDTLS_X509_USE_C\",\n#endif /* MBEDTLS_X509_USE_C */\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    \"MBEDTLS_X509_CRT_PARSE_C\",\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n#if defined(MBEDTLS_X509_CRL_PARSE_C)\n    \"MBEDTLS_X509_CRL_PARSE_C\",\n#endif /* MBEDTLS_X509_CRL_PARSE_C */\n#if defined(MBEDTLS_X509_CSR_PARSE_C)\n    \"MBEDTLS_X509_CSR_PARSE_C\",\n#endif /* MBEDTLS_X509_CSR_PARSE_C */\n#if defined(MBEDTLS_X509_CREATE_C)\n    \"MBEDTLS_X509_CREATE_C\",\n#endif /* MBEDTLS_X509_CREATE_C */\n#if defined(MBEDTLS_X509_CRT_WRITE_C)\n    \"MBEDTLS_X509_CRT_WRITE_C\",\n#endif /* MBEDTLS_X509_CRT_WRITE_C */\n#if defined(MBEDTLS_X509_CSR_WRITE_C)\n    \"MBEDTLS_X509_CSR_WRITE_C\",\n#endif /* MBEDTLS_X509_CSR_WRITE_C */\n#if defined(MBEDTLS_XTEA_C)\n    \"MBEDTLS_XTEA_C\",\n#endif /* MBEDTLS_XTEA_C */\n#endif /* MBEDTLS_VERSION_FEATURES */\n    NULL\n};\n\nint mbedtls_version_check_feature( const char *feature )\n{\n    const char **idx = features;\n\n    if( *idx == NULL )\n        return( -2 );\n\n    if( feature == NULL )\n        return( -1 );\n\n    while( *idx != NULL )\n    {\n        if( !strcmp( *idx, feature ) )\n            return( 0 );\n        idx++;\n    }\n    return( -1 );\n}\n\n#endif /* MBEDTLS_VERSION_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/x509.c",
    "content": "/*\n *  X.509 common functions for parsing and verification\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The ITU-T X.509 standard defines a certificate format for PKI.\n *\n *  http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs)\n *  http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs)\n *  http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10)\n *\n *  http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf\n *  http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_X509_USE_C)\n\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/asn1.h\"\n#include \"mbedtls/oid.h\"\n\n#include <stdio.h>\n#include <string.h>\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n#include \"mbedtls/pem.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_free      free\n#define mbedtls_calloc    calloc\n#define mbedtls_printf    printf\n#define mbedtls_snprintf  snprintf\n#endif\n\n\n#if defined(MBEDTLS_HAVE_TIME)\n#include \"mbedtls/platform_time.h\"\n#endif\n\n#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)\n#include <windows.h>\n#else\n#include <time.h>\n#endif\n\n#if defined(MBEDTLS_FS_IO)\n#include <stdio.h>\n#if !defined(_WIN32)\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <dirent.h>\n#endif\n#endif\n\n#define CHECK(code) if( ( ret = code ) != 0 ){ return( ret ); }\n#define CHECK_RANGE(min, max, val) if( val < min || val > max ){ return( ret ); }\n\n/*\n *  CertificateSerialNumber  ::=  INTEGER\n */\nint mbedtls_x509_get_serial( unsigned char **p, const unsigned char *end,\n                     mbedtls_x509_buf *serial )\n{\n    int ret;\n\n    if( ( end - *p ) < 1 )\n        return( MBEDTLS_ERR_X509_INVALID_SERIAL +\n                MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    if( **p != ( MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_PRIMITIVE | 2 ) &&\n        **p !=   MBEDTLS_ASN1_INTEGER )\n        return( MBEDTLS_ERR_X509_INVALID_SERIAL +\n                MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n\n    serial->tag = *(*p)++;\n\n    if( ( ret = mbedtls_asn1_get_len( p, end, &serial->len ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_SERIAL + ret );\n\n    serial->p = *p;\n    *p += serial->len;\n\n    return( 0 );\n}\n\n/* Get an algorithm identifier without parameters (eg for signatures)\n *\n *  AlgorithmIdentifier  ::=  SEQUENCE  {\n *       algorithm               OBJECT IDENTIFIER,\n *       parameters              ANY DEFINED BY algorithm OPTIONAL  }\n */\nint mbedtls_x509_get_alg_null( unsigned char **p, const unsigned char *end,\n                       mbedtls_x509_buf *alg )\n{\n    int ret;\n\n    if( ( ret = mbedtls_asn1_get_alg_null( p, end, alg ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n    return( 0 );\n}\n\n/*\n * Parse an algorithm identifier with (optional) paramaters\n */\nint mbedtls_x509_get_alg( unsigned char **p, const unsigned char *end,\n                  mbedtls_x509_buf *alg, mbedtls_x509_buf *params )\n{\n    int ret;\n\n    if( ( ret = mbedtls_asn1_get_alg( p, end, alg, params ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)\n/*\n * HashAlgorithm ::= AlgorithmIdentifier\n *\n * AlgorithmIdentifier  ::=  SEQUENCE  {\n *      algorithm               OBJECT IDENTIFIER,\n *      parameters              ANY DEFINED BY algorithm OPTIONAL  }\n *\n * For HashAlgorithm, parameters MUST be NULL or absent.\n */\nstatic int x509_get_hash_alg( const mbedtls_x509_buf *alg, mbedtls_md_type_t *md_alg )\n{\n    int ret;\n    unsigned char *p;\n    const unsigned char *end;\n    mbedtls_x509_buf md_oid;\n    size_t len;\n\n    /* Make sure we got a SEQUENCE and setup bounds */\n    if( alg->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )\n        return( MBEDTLS_ERR_X509_INVALID_ALG +\n                MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n\n    p = (unsigned char *) alg->p;\n    end = p + alg->len;\n\n    if( p >= end )\n        return( MBEDTLS_ERR_X509_INVALID_ALG +\n                MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    /* Parse md_oid */\n    md_oid.tag = *p;\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &md_oid.len, MBEDTLS_ASN1_OID ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n    md_oid.p = p;\n    p += md_oid.len;\n\n    /* Get md_alg from md_oid */\n    if( ( ret = mbedtls_oid_get_md_alg( &md_oid, md_alg ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n    /* Make sure params is absent of NULL */\n    if( p == end )\n        return( 0 );\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len, MBEDTLS_ASN1_NULL ) ) != 0 || len != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n    if( p != end )\n        return( MBEDTLS_ERR_X509_INVALID_ALG +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n/*\n *    RSASSA-PSS-params  ::=  SEQUENCE  {\n *       hashAlgorithm     [0] HashAlgorithm DEFAULT sha1Identifier,\n *       maskGenAlgorithm  [1] MaskGenAlgorithm DEFAULT mgf1SHA1Identifier,\n *       saltLength        [2] INTEGER DEFAULT 20,\n *       trailerField      [3] INTEGER DEFAULT 1  }\n *    -- Note that the tags in this Sequence are explicit.\n *\n * RFC 4055 (which defines use of RSASSA-PSS in PKIX) states that the value\n * of trailerField MUST be 1, and PKCS#1 v2.2 doesn't even define any other\n * option. Enfore this at parsing time.\n */\nint mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params,\n                                mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md,\n                                int *salt_len )\n{\n    int ret;\n    unsigned char *p;\n    const unsigned char *end, *end2;\n    size_t len;\n    mbedtls_x509_buf alg_id, alg_params;\n\n    /* First set everything to defaults */\n    *md_alg = MBEDTLS_MD_SHA1;\n    *mgf_md = MBEDTLS_MD_SHA1;\n    *salt_len = 20;\n\n    /* Make sure params is a SEQUENCE and setup bounds */\n    if( params->tag != ( MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) )\n        return( MBEDTLS_ERR_X509_INVALID_ALG +\n                MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n\n    p = (unsigned char *) params->p;\n    end = p + params->len;\n\n    if( p == end )\n        return( 0 );\n\n    /*\n     * HashAlgorithm\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n                    MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) == 0 )\n    {\n        end2 = p + len;\n\n        /* HashAlgorithm ::= AlgorithmIdentifier (without parameters) */\n        if( ( ret = mbedtls_x509_get_alg_null( &p, end2, &alg_id ) ) != 0 )\n            return( ret );\n\n        if( ( ret = mbedtls_oid_get_md_alg( &alg_id, md_alg ) ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n        if( p != end2 )\n            return( MBEDTLS_ERR_X509_INVALID_ALG +\n                    MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n    else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n        return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n    if( p == end )\n        return( 0 );\n\n    /*\n     * MaskGenAlgorithm\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n                    MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 1 ) ) == 0 )\n    {\n        end2 = p + len;\n\n        /* MaskGenAlgorithm ::= AlgorithmIdentifier (params = HashAlgorithm) */\n        if( ( ret = mbedtls_x509_get_alg( &p, end2, &alg_id, &alg_params ) ) != 0 )\n            return( ret );\n\n        /* Only MFG1 is recognised for now */\n        if( MBEDTLS_OID_CMP( MBEDTLS_OID_MGF1, &alg_id ) != 0 )\n            return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE +\n                    MBEDTLS_ERR_OID_NOT_FOUND );\n\n        /* Parse HashAlgorithm */\n        if( ( ret = x509_get_hash_alg( &alg_params, mgf_md ) ) != 0 )\n            return( ret );\n\n        if( p != end2 )\n            return( MBEDTLS_ERR_X509_INVALID_ALG +\n                    MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n    else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n        return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n    if( p == end )\n        return( 0 );\n\n    /*\n     * salt_len\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n                    MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 2 ) ) == 0 )\n    {\n        end2 = p + len;\n\n        if( ( ret = mbedtls_asn1_get_int( &p, end2, salt_len ) ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n        if( p != end2 )\n            return( MBEDTLS_ERR_X509_INVALID_ALG +\n                    MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n    else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n        return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n    if( p == end )\n        return( 0 );\n\n    /*\n     * trailer_field (if present, must be 1)\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n                    MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 3 ) ) == 0 )\n    {\n        int trailer_field;\n\n        end2 = p + len;\n\n        if( ( ret = mbedtls_asn1_get_int( &p, end2, &trailer_field ) ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n        if( p != end2 )\n            return( MBEDTLS_ERR_X509_INVALID_ALG +\n                    MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n        if( trailer_field != 1 )\n            return( MBEDTLS_ERR_X509_INVALID_ALG );\n    }\n    else if( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n        return( MBEDTLS_ERR_X509_INVALID_ALG + ret );\n\n    if( p != end )\n        return( MBEDTLS_ERR_X509_INVALID_ALG +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */\n\n/*\n *  AttributeTypeAndValue ::= SEQUENCE {\n *    type     AttributeType,\n *    value    AttributeValue }\n *\n *  AttributeType ::= OBJECT IDENTIFIER\n *\n *  AttributeValue ::= ANY DEFINED BY AttributeType\n */\nstatic int x509_get_attr_type_value( unsigned char **p,\n                                     const unsigned char *end,\n                                     mbedtls_x509_name *cur )\n{\n    int ret;\n    size_t len;\n    mbedtls_x509_buf *oid;\n    mbedtls_x509_buf *val;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_NAME + ret );\n\n    if( ( end - *p ) < 1 )\n        return( MBEDTLS_ERR_X509_INVALID_NAME +\n                MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    oid = &cur->oid;\n    oid->tag = **p;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &oid->len, MBEDTLS_ASN1_OID ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_NAME + ret );\n\n    oid->p = *p;\n    *p += oid->len;\n\n    if( ( end - *p ) < 1 )\n        return( MBEDTLS_ERR_X509_INVALID_NAME +\n                MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    if( **p != MBEDTLS_ASN1_BMP_STRING && **p != MBEDTLS_ASN1_UTF8_STRING      &&\n        **p != MBEDTLS_ASN1_T61_STRING && **p != MBEDTLS_ASN1_PRINTABLE_STRING &&\n        **p != MBEDTLS_ASN1_IA5_STRING && **p != MBEDTLS_ASN1_UNIVERSAL_STRING &&\n        **p != MBEDTLS_ASN1_BIT_STRING )\n        return( MBEDTLS_ERR_X509_INVALID_NAME +\n                MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n\n    val = &cur->val;\n    val->tag = *(*p)++;\n\n    if( ( ret = mbedtls_asn1_get_len( p, end, &val->len ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_NAME + ret );\n\n    val->p = *p;\n    *p += val->len;\n\n    cur->next = NULL;\n\n    return( 0 );\n}\n\n/*\n *  Name ::= CHOICE { -- only one possibility for now --\n *       rdnSequence  RDNSequence }\n *\n *  RDNSequence ::= SEQUENCE OF RelativeDistinguishedName\n *\n *  RelativeDistinguishedName ::=\n *    SET OF AttributeTypeAndValue\n *\n *  AttributeTypeAndValue ::= SEQUENCE {\n *    type     AttributeType,\n *    value    AttributeValue }\n *\n *  AttributeType ::= OBJECT IDENTIFIER\n *\n *  AttributeValue ::= ANY DEFINED BY AttributeType\n *\n * The data structure is optimized for the common case where each RDN has only\n * one element, which is represented as a list of AttributeTypeAndValue.\n * For the general case we still use a flat list, but we mark elements of the\n * same set so that they are \"merged\" together in the functions that consume\n * this list, eg mbedtls_x509_dn_gets().\n */\nint mbedtls_x509_get_name( unsigned char **p, const unsigned char *end,\n                   mbedtls_x509_name *cur )\n{\n    int ret;\n    size_t set_len;\n    const unsigned char *end_set;\n\n    /* don't use recursion, we'd risk stack overflow if not optimized */\n    while( 1 )\n    {\n        /*\n         * parse SET\n         */\n        if( ( ret = mbedtls_asn1_get_tag( p, end, &set_len,\n                MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET ) ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_NAME + ret );\n\n        end_set  = *p + set_len;\n\n        while( 1 )\n        {\n            if( ( ret = x509_get_attr_type_value( p, end_set, cur ) ) != 0 )\n                return( ret );\n\n            if( *p == end_set )\n                break;\n\n            /* Mark this item as being no the only one in a set */\n            cur->next_merged = 1;\n\n            cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) );\n\n            if( cur->next == NULL )\n                return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n\n            cur = cur->next;\n        }\n\n        /*\n         * continue until end of SEQUENCE is reached\n         */\n        if( *p == end )\n            return( 0 );\n\n        cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) );\n\n        if( cur->next == NULL )\n            return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n\n        cur = cur->next;\n    }\n}\n\nstatic int x509_parse_int( unsigned char **p, size_t n, int *res )\n{\n    *res = 0;\n\n    for( ; n > 0; --n )\n    {\n        if( ( **p < '0') || ( **p > '9' ) )\n            return ( MBEDTLS_ERR_X509_INVALID_DATE );\n\n        *res *= 10;\n        *res += ( *(*p)++ - '0' );\n    }\n\n    return( 0 );\n}\n\nstatic int x509_date_is_valid(const mbedtls_x509_time *t)\n{\n    int ret = MBEDTLS_ERR_X509_INVALID_DATE;\n\n    CHECK_RANGE( 0, 9999, t->year );\n    CHECK_RANGE( 0, 23,   t->hour );\n    CHECK_RANGE( 0, 59,   t->min  );\n    CHECK_RANGE( 0, 59,   t->sec  );\n\n    switch( t->mon )\n    {\n        case 1: case 3: case 5: case 7: case 8: case 10: case 12:\n            CHECK_RANGE( 1, 31, t->day );\n            break;\n        case 4: case 6: case 9: case 11:\n            CHECK_RANGE( 1, 30, t->day );\n            break;\n        case 2:\n            CHECK_RANGE( 1, 28 + (t->year % 4 == 0), t->day );\n            break;\n        default:\n            return( ret );\n    }\n\n    return( 0 );\n}\n\n/*\n * Parse an ASN1_UTC_TIME (yearlen=2) or ASN1_GENERALIZED_TIME (yearlen=4)\n * field.\n */\nstatic int x509_parse_time( unsigned char **p, size_t len, size_t yearlen,\n                            mbedtls_x509_time *tm )\n{\n    int ret;\n\n    /*\n     * Minimum length is 10 or 12 depending on yearlen\n     */\n    if ( len < yearlen + 8 )\n        return ( MBEDTLS_ERR_X509_INVALID_DATE );\n    len -= yearlen + 8;\n\n    /*\n     * Parse year, month, day, hour, minute\n     */\n    CHECK( x509_parse_int( p, yearlen, &tm->year ) );\n    if ( 2 == yearlen )\n    {\n        if ( tm->year < 50 )\n            tm->year += 100;\n\n        tm->year += 1900;\n    }\n\n    CHECK( x509_parse_int( p, 2, &tm->mon ) );\n    CHECK( x509_parse_int( p, 2, &tm->day ) );\n    CHECK( x509_parse_int( p, 2, &tm->hour ) );\n    CHECK( x509_parse_int( p, 2, &tm->min ) );\n\n    /*\n     * Parse seconds if present\n     */\n    if ( len >= 2 )\n    {\n        CHECK( x509_parse_int( p, 2, &tm->sec ) );\n        len -= 2;\n    }\n    else\n        return ( MBEDTLS_ERR_X509_INVALID_DATE );\n\n    /*\n     * Parse trailing 'Z' if present\n     */\n    if ( 1 == len && 'Z' == **p )\n    {\n        (*p)++;\n        len--;\n    }\n\n    /*\n     * We should have parsed all characters at this point\n     */\n    if ( 0 != len )\n        return ( MBEDTLS_ERR_X509_INVALID_DATE );\n\n    CHECK( x509_date_is_valid( tm ) );\n\n    return ( 0 );\n}\n\n/*\n *  Time ::= CHOICE {\n *       utcTime        UTCTime,\n *       generalTime    GeneralizedTime }\n */\nint mbedtls_x509_get_time( unsigned char **p, const unsigned char *end,\n                           mbedtls_x509_time *tm )\n{\n    int ret;\n    size_t len, year_len;\n    unsigned char tag;\n\n    if( ( end - *p ) < 1 )\n        return( MBEDTLS_ERR_X509_INVALID_DATE +\n                MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    tag = **p;\n\n    if( tag == MBEDTLS_ASN1_UTC_TIME )\n        year_len = 2;\n    else if( tag == MBEDTLS_ASN1_GENERALIZED_TIME )\n        year_len = 4;\n    else\n        return( MBEDTLS_ERR_X509_INVALID_DATE +\n                MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n\n    (*p)++;\n    ret = mbedtls_asn1_get_len( p, end, &len );\n\n    if( ret != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_DATE + ret );\n\n    return x509_parse_time( p, len, year_len, tm );\n}\n\nint mbedtls_x509_get_sig( unsigned char **p, const unsigned char *end, mbedtls_x509_buf *sig )\n{\n    int ret;\n    size_t len;\n    int tag_type;\n\n    if( ( end - *p ) < 1 )\n        return( MBEDTLS_ERR_X509_INVALID_SIGNATURE +\n                MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n    tag_type = **p;\n\n    if( ( ret = mbedtls_asn1_get_bitstring_null( p, end, &len ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_SIGNATURE + ret );\n\n    sig->tag = tag_type;\n    sig->len = len;\n    sig->p = *p;\n\n    *p += len;\n\n    return( 0 );\n}\n\n/*\n * Get signature algorithm from alg OID and optional parameters\n */\nint mbedtls_x509_get_sig_alg( const mbedtls_x509_buf *sig_oid, const mbedtls_x509_buf *sig_params,\n                      mbedtls_md_type_t *md_alg, mbedtls_pk_type_t *pk_alg,\n                      void **sig_opts )\n{\n    int ret;\n\n    if( *sig_opts != NULL )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    if( ( ret = mbedtls_oid_get_sig_alg( sig_oid, md_alg, pk_alg ) ) != 0 )\n        return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + ret );\n\n#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)\n    if( *pk_alg == MBEDTLS_PK_RSASSA_PSS )\n    {\n        mbedtls_pk_rsassa_pss_options *pss_opts;\n\n        pss_opts = mbedtls_calloc( 1, sizeof( mbedtls_pk_rsassa_pss_options ) );\n        if( pss_opts == NULL )\n            return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n\n        ret = mbedtls_x509_get_rsassa_pss_params( sig_params,\n                                          md_alg,\n                                          &pss_opts->mgf1_hash_id,\n                                          &pss_opts->expected_salt_len );\n        if( ret != 0 )\n        {\n            mbedtls_free( pss_opts );\n            return( ret );\n        }\n\n        *sig_opts = (void *) pss_opts;\n    }\n    else\n#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */\n    {\n        /* Make sure parameters are absent or NULL */\n        if( ( sig_params->tag != MBEDTLS_ASN1_NULL && sig_params->tag != 0 ) ||\n              sig_params->len != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_ALG );\n    }\n\n    return( 0 );\n}\n\n/*\n * X.509 Extensions (No parsing of extensions, pointer should\n * be either manually updated or extensions should be parsed!)\n */\nint mbedtls_x509_get_ext( unsigned char **p, const unsigned char *end,\n                  mbedtls_x509_buf *ext, int tag )\n{\n    int ret;\n    size_t len;\n\n    if( *p == end )\n        return( 0 );\n\n    ext->tag = **p;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &ext->len,\n            MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | tag ) ) != 0 )\n        return( ret );\n\n    ext->p = *p;\n    end = *p + ext->len;\n\n    /*\n     * Extensions  ::=  SEQUENCE SIZE (1..MAX) OF Extension\n     *\n     * Extension  ::=  SEQUENCE  {\n     *      extnID      OBJECT IDENTIFIER,\n     *      critical    BOOLEAN DEFAULT FALSE,\n     *      extnValue   OCTET STRING  }\n     */\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n    if( end != *p + len )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n/*\n * Store the name in printable form into buf; no more\n * than size characters will be written\n */\nint mbedtls_x509_dn_gets( char *buf, size_t size, const mbedtls_x509_name *dn )\n{\n    int ret;\n    size_t i, n;\n    unsigned char c, merge = 0;\n    const mbedtls_x509_name *name;\n    const char *short_name = NULL;\n    char s[MBEDTLS_X509_MAX_DN_NAME_SIZE], *p;\n\n    memset( s, 0, sizeof( s ) );\n\n    name = dn;\n    p = buf;\n    n = size;\n\n    while( name != NULL )\n    {\n        if( !name->oid.p )\n        {\n            name = name->next;\n            continue;\n        }\n\n        if( name != dn )\n        {\n            ret = mbedtls_snprintf( p, n, merge ? \" + \" : \", \" );\n            MBEDTLS_X509_SAFE_SNPRINTF;\n        }\n\n        ret = mbedtls_oid_get_attr_short_name( &name->oid, &short_name );\n\n        if( ret == 0 )\n            ret = mbedtls_snprintf( p, n, \"%s=\", short_name );\n        else\n            ret = mbedtls_snprintf( p, n, \"\\?\\?=\" );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        for( i = 0; i < name->val.len; i++ )\n        {\n            if( i >= sizeof( s ) - 1 )\n                break;\n\n            c = name->val.p[i];\n            if( c < 32 || c == 127 || ( c > 128 && c < 160 ) )\n                 s[i] = '?';\n            else s[i] = c;\n        }\n        s[i] = '\\0';\n        ret = mbedtls_snprintf( p, n, \"%s\", s );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        merge = name->next_merged;\n        name = name->next;\n    }\n\n    return( (int) ( size - n ) );\n}\n\n/*\n * Store the serial in printable form into buf; no more\n * than size characters will be written\n */\nint mbedtls_x509_serial_gets( char *buf, size_t size, const mbedtls_x509_buf *serial )\n{\n    int ret;\n    size_t i, n, nr;\n    char *p;\n\n    p = buf;\n    n = size;\n\n    nr = ( serial->len <= 32 )\n        ? serial->len  : 28;\n\n    for( i = 0; i < nr; i++ )\n    {\n        if( i == 0 && nr > 1 && serial->p[i] == 0x0 )\n            continue;\n\n        ret = mbedtls_snprintf( p, n, \"%02X%s\",\n                serial->p[i], ( i < nr - 1 ) ? \":\" : \"\" );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n    }\n\n    if( nr != serial->len )\n    {\n        ret = mbedtls_snprintf( p, n, \"....\" );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n    }\n\n    return( (int) ( size - n ) );\n}\n\n/*\n * Helper for writing signature algorithms\n */\nint mbedtls_x509_sig_alg_gets( char *buf, size_t size, const mbedtls_x509_buf *sig_oid,\n                       mbedtls_pk_type_t pk_alg, mbedtls_md_type_t md_alg,\n                       const void *sig_opts )\n{\n    int ret;\n    char *p = buf;\n    size_t n = size;\n    const char *desc = NULL;\n\n    ret = mbedtls_oid_get_sig_alg_desc( sig_oid, &desc );\n    if( ret != 0 )\n        ret = mbedtls_snprintf( p, n, \"???\"  );\n    else\n        ret = mbedtls_snprintf( p, n, \"%s\", desc );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)\n    if( pk_alg == MBEDTLS_PK_RSASSA_PSS )\n    {\n        const mbedtls_pk_rsassa_pss_options *pss_opts;\n        const mbedtls_md_info_t *md_info, *mgf_md_info;\n\n        pss_opts = (const mbedtls_pk_rsassa_pss_options *) sig_opts;\n\n        md_info = mbedtls_md_info_from_type( md_alg );\n        mgf_md_info = mbedtls_md_info_from_type( pss_opts->mgf1_hash_id );\n\n        ret = mbedtls_snprintf( p, n, \" (%s, MGF1-%s, 0x%02X)\",\n                              md_info ? mbedtls_md_get_name( md_info ) : \"???\",\n                              mgf_md_info ? mbedtls_md_get_name( mgf_md_info ) : \"???\",\n                              pss_opts->expected_salt_len );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n    }\n#else\n    ((void) pk_alg);\n    ((void) md_alg);\n    ((void) sig_opts);\n#endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */\n\n    return( (int)( size - n ) );\n}\n\n/*\n * Helper for writing \"RSA key size\", \"EC key size\", etc\n */\nint mbedtls_x509_key_size_helper( char *buf, size_t buf_size, const char *name )\n{\n    char *p = buf;\n    size_t n = buf_size;\n    int ret;\n\n    ret = mbedtls_snprintf( p, n, \"%s key size\", name );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_HAVE_TIME_DATE)\n/*\n * Set the time structure to the current time.\n * Return 0 on success, non-zero on failure.\n */\n#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)\nstatic int x509_get_current_time( mbedtls_x509_time *now )\n{\n    SYSTEMTIME st;\n\n    GetSystemTime( &st );\n\n    now->year = st.wYear;\n    now->mon  = st.wMonth;\n    now->day  = st.wDay;\n    now->hour = st.wHour;\n    now->min  = st.wMinute;\n    now->sec  = st.wSecond;\n\n    return( 0 );\n}\n#else\nstatic int x509_get_current_time( mbedtls_x509_time *now )\n{\n    struct tm *lt;\n    mbedtls_time_t tt;\n    int ret = 0;\n\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_lock( &mbedtls_threading_gmtime_mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    tt = mbedtls_time( NULL );\n    lt = gmtime( &tt );\n\n    if( lt == NULL )\n        ret = -1;\n    else\n    {\n        now->year = lt->tm_year + 1900;\n        now->mon  = lt->tm_mon  + 1;\n        now->day  = lt->tm_mday;\n        now->hour = lt->tm_hour;\n        now->min  = lt->tm_min;\n        now->sec  = lt->tm_sec;\n    }\n\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &mbedtls_threading_gmtime_mutex ) != 0 )\n        return( MBEDTLS_ERR_THREADING_MUTEX_ERROR );\n#endif\n\n    return( ret );\n}\n#endif /* _WIN32 && !EFIX64 && !EFI32 */\n\n/*\n * Return 0 if before <= after, 1 otherwise\n */\nstatic int x509_check_time( const mbedtls_x509_time *before, const mbedtls_x509_time *after )\n{\n    if( before->year  > after->year )\n        return( 1 );\n\n    if( before->year == after->year &&\n        before->mon   > after->mon )\n        return( 1 );\n\n    if( before->year == after->year &&\n        before->mon  == after->mon  &&\n        before->day   > after->day )\n        return( 1 );\n\n    if( before->year == after->year &&\n        before->mon  == after->mon  &&\n        before->day  == after->day  &&\n        before->hour  > after->hour )\n        return( 1 );\n\n    if( before->year == after->year &&\n        before->mon  == after->mon  &&\n        before->day  == after->day  &&\n        before->hour == after->hour &&\n        before->min   > after->min  )\n        return( 1 );\n\n    if( before->year == after->year &&\n        before->mon  == after->mon  &&\n        before->day  == after->day  &&\n        before->hour == after->hour &&\n        before->min  == after->min  &&\n        before->sec   > after->sec  )\n        return( 1 );\n\n    return( 0 );\n}\n\nint mbedtls_x509_time_is_past( const mbedtls_x509_time *to )\n{\n    mbedtls_x509_time now;\n\n    if( x509_get_current_time( &now ) != 0 )\n        return( 1 );\n\n    return( x509_check_time( &now, to ) );\n}\n\nint mbedtls_x509_time_is_future( const mbedtls_x509_time *from )\n{\n    mbedtls_x509_time now;\n\n    if( x509_get_current_time( &now ) != 0 )\n        return( 1 );\n\n    return( x509_check_time( from, &now ) );\n}\n\n#else  /* MBEDTLS_HAVE_TIME_DATE */\n\nint mbedtls_x509_time_is_past( const mbedtls_x509_time *to )\n{\n    ((void) to);\n    return( 0 );\n}\n\nint mbedtls_x509_time_is_future( const mbedtls_x509_time *from )\n{\n    ((void) from);\n    return( 0 );\n}\n#endif /* MBEDTLS_HAVE_TIME_DATE */\n\n#if defined(MBEDTLS_SELF_TEST)\n\n#include \"mbedtls/x509_crt.h\"\n#include \"mbedtls/certs.h\"\n\n/*\n * Checkup routine\n */\nint mbedtls_x509_self_test( int verbose )\n{\n#if defined(MBEDTLS_CERTS_C) && defined(MBEDTLS_SHA256_C)\n    int ret;\n    uint32_t flags;\n    mbedtls_x509_crt cacert;\n    mbedtls_x509_crt clicert;\n\n    if( verbose != 0 )\n        mbedtls_printf( \"  X.509 certificate load: \" );\n\n    mbedtls_x509_crt_init( &clicert );\n\n    ret = mbedtls_x509_crt_parse( &clicert, (const unsigned char *) mbedtls_test_cli_crt,\n                           mbedtls_test_cli_crt_len );\n    if( ret != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( ret );\n    }\n\n    mbedtls_x509_crt_init( &cacert );\n\n    ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_ca_crt,\n                          mbedtls_test_ca_crt_len );\n    if( ret != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( ret );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n  X.509 signature verify: \");\n\n    ret = mbedtls_x509_crt_verify( &clicert, &cacert, NULL, NULL, &flags, NULL, NULL );\n    if( ret != 0 )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"failed\\n\" );\n\n        return( ret );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"passed\\n\\n\");\n\n    mbedtls_x509_crt_free( &cacert  );\n    mbedtls_x509_crt_free( &clicert );\n\n    return( 0 );\n#else\n    ((void) verbose);\n    return( 0 );\n#endif /* MBEDTLS_CERTS_C && MBEDTLS_SHA1_C */\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_X509_USE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/x509_create.c",
    "content": "/*\n *  X.509 base functions for creating certificates / CSRs\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_X509_CREATE_C)\n\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/asn1write.h\"\n#include \"mbedtls/oid.h\"\n\n#include <string.h>\n\ntypedef struct {\n    const char *name;\n    size_t name_len;\n    const char*oid;\n} x509_attr_descriptor_t;\n\n#define ADD_STRLEN( s )     s, sizeof( s ) - 1\n\nstatic const x509_attr_descriptor_t x509_attrs[] =\n{\n    { ADD_STRLEN( \"CN\" ),                       MBEDTLS_OID_AT_CN },\n    { ADD_STRLEN( \"commonName\" ),               MBEDTLS_OID_AT_CN },\n    { ADD_STRLEN( \"C\" ),                        MBEDTLS_OID_AT_COUNTRY },\n    { ADD_STRLEN( \"countryName\" ),              MBEDTLS_OID_AT_COUNTRY },\n    { ADD_STRLEN( \"O\" ),                        MBEDTLS_OID_AT_ORGANIZATION },\n    { ADD_STRLEN( \"organizationName\" ),         MBEDTLS_OID_AT_ORGANIZATION },\n    { ADD_STRLEN( \"L\" ),                        MBEDTLS_OID_AT_LOCALITY },\n    { ADD_STRLEN( \"locality\" ),                 MBEDTLS_OID_AT_LOCALITY },\n    { ADD_STRLEN( \"R\" ),                        MBEDTLS_OID_PKCS9_EMAIL },\n    { ADD_STRLEN( \"OU\" ),                       MBEDTLS_OID_AT_ORG_UNIT },\n    { ADD_STRLEN( \"organizationalUnitName\" ),   MBEDTLS_OID_AT_ORG_UNIT },\n    { ADD_STRLEN( \"ST\" ),                       MBEDTLS_OID_AT_STATE },\n    { ADD_STRLEN( \"stateOrProvinceName\" ),      MBEDTLS_OID_AT_STATE },\n    { ADD_STRLEN( \"emailAddress\" ),             MBEDTLS_OID_PKCS9_EMAIL },\n    { ADD_STRLEN( \"serialNumber\" ),             MBEDTLS_OID_AT_SERIAL_NUMBER },\n    { ADD_STRLEN( \"postalAddress\" ),            MBEDTLS_OID_AT_POSTAL_ADDRESS },\n    { ADD_STRLEN( \"postalCode\" ),               MBEDTLS_OID_AT_POSTAL_CODE },\n    { ADD_STRLEN( \"dnQualifier\" ),              MBEDTLS_OID_AT_DN_QUALIFIER },\n    { ADD_STRLEN( \"title\" ),                    MBEDTLS_OID_AT_TITLE },\n    { ADD_STRLEN( \"surName\" ),                  MBEDTLS_OID_AT_SUR_NAME },\n    { ADD_STRLEN( \"SN\" ),                       MBEDTLS_OID_AT_SUR_NAME },\n    { ADD_STRLEN( \"givenName\" ),                MBEDTLS_OID_AT_GIVEN_NAME },\n    { ADD_STRLEN( \"GN\" ),                       MBEDTLS_OID_AT_GIVEN_NAME },\n    { ADD_STRLEN( \"initials\" ),                 MBEDTLS_OID_AT_INITIALS },\n    { ADD_STRLEN( \"pseudonym\" ),                MBEDTLS_OID_AT_PSEUDONYM },\n    { ADD_STRLEN( \"generationQualifier\" ),      MBEDTLS_OID_AT_GENERATION_QUALIFIER },\n    { ADD_STRLEN( \"domainComponent\" ),          MBEDTLS_OID_DOMAIN_COMPONENT },\n    { ADD_STRLEN( \"DC\" ),                       MBEDTLS_OID_DOMAIN_COMPONENT },\n    { NULL, 0, NULL }\n};\n\nstatic const char *x509_at_oid_from_name( const char *name, size_t name_len )\n{\n    const x509_attr_descriptor_t *cur;\n\n    for( cur = x509_attrs; cur->name != NULL; cur++ )\n        if( cur->name_len == name_len &&\n            strncmp( cur->name, name, name_len ) == 0 )\n            break;\n\n    return( cur->oid );\n}\n\nint mbedtls_x509_string_to_names( mbedtls_asn1_named_data **head, const char *name )\n{\n    int ret = 0;\n    const char *s = name, *c = s;\n    const char *end = s + strlen( s );\n    const char *oid = NULL;\n    int in_tag = 1;\n    char data[MBEDTLS_X509_MAX_DN_NAME_SIZE];\n    char *d = data;\n\n    /* Clear existing chain if present */\n    mbedtls_asn1_free_named_data_list( head );\n\n    while( c <= end )\n    {\n        if( in_tag && *c == '=' )\n        {\n            if( ( oid = x509_at_oid_from_name( s, c - s ) ) == NULL )\n            {\n                ret = MBEDTLS_ERR_X509_UNKNOWN_OID;\n                goto exit;\n            }\n\n            s = c + 1;\n            in_tag = 0;\n            d = data;\n        }\n\n        if( !in_tag && *c == '\\\\' && c != end )\n        {\n            c++;\n\n            /* Check for valid escaped characters */\n            if( c == end || *c != ',' )\n            {\n                ret = MBEDTLS_ERR_X509_INVALID_NAME;\n                goto exit;\n            }\n        }\n        else if( !in_tag && ( *c == ',' || c == end ) )\n        {\n            if( mbedtls_asn1_store_named_data( head, oid, strlen( oid ),\n                                       (unsigned char *) data,\n                                       d - data ) == NULL )\n            {\n                return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n            }\n\n            while( c < end && *(c + 1) == ' ' )\n                c++;\n\n            s = c + 1;\n            in_tag = 1;\n        }\n\n        if( !in_tag && s != c + 1 )\n        {\n            *(d++) = *c;\n\n            if( d - data == MBEDTLS_X509_MAX_DN_NAME_SIZE )\n            {\n                ret = MBEDTLS_ERR_X509_INVALID_NAME;\n                goto exit;\n            }\n        }\n\n        c++;\n    }\n\nexit:\n\n    return( ret );\n}\n\n/* The first byte of the value in the mbedtls_asn1_named_data structure is reserved\n * to store the critical boolean for us\n */\nint mbedtls_x509_set_extension( mbedtls_asn1_named_data **head, const char *oid, size_t oid_len,\n                        int critical, const unsigned char *val, size_t val_len )\n{\n    mbedtls_asn1_named_data *cur;\n\n    if( ( cur = mbedtls_asn1_store_named_data( head, oid, oid_len,\n                                       NULL, val_len + 1 ) ) == NULL )\n    {\n        return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n    }\n\n    cur->val.p[0] = critical;\n    memcpy( cur->val.p + 1, val, val_len );\n\n    return( 0 );\n}\n\n/*\n *  RelativeDistinguishedName ::=\n *    SET OF AttributeTypeAndValue\n *\n *  AttributeTypeAndValue ::= SEQUENCE {\n *    type     AttributeType,\n *    value    AttributeValue }\n *\n *  AttributeType ::= OBJECT IDENTIFIER\n *\n *  AttributeValue ::= ANY DEFINED BY AttributeType\n */\nstatic int x509_write_name( unsigned char **p, unsigned char *start,\n                            const char *oid, size_t oid_len,\n                            const unsigned char *name, size_t name_len )\n{\n    int ret;\n    size_t len = 0;\n\n    // Write PrintableString for all except MBEDTLS_OID_PKCS9_EMAIL\n    //\n    if( MBEDTLS_OID_SIZE( MBEDTLS_OID_PKCS9_EMAIL ) == oid_len &&\n        memcmp( oid, MBEDTLS_OID_PKCS9_EMAIL, oid_len ) == 0 )\n    {\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_ia5_string( p, start,\n                                                  (const char *) name,\n                                                  name_len ) );\n    }\n    else\n    {\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_printable_string( p, start,\n                                                        (const char *) name,\n                                                        name_len ) );\n    }\n\n    // Write OID\n    //\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( p, start, oid, oid_len ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED |\n                                                 MBEDTLS_ASN1_SEQUENCE ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED |\n                                                 MBEDTLS_ASN1_SET ) );\n\n    return( (int) len );\n}\n\nint mbedtls_x509_write_names( unsigned char **p, unsigned char *start,\n                      mbedtls_asn1_named_data *first )\n{\n    int ret;\n    size_t len = 0;\n    mbedtls_asn1_named_data *cur = first;\n\n    while( cur != NULL )\n    {\n        MBEDTLS_ASN1_CHK_ADD( len, x509_write_name( p, start, (char *) cur->oid.p,\n                                            cur->oid.len,\n                                            cur->val.p, cur->val.len ) );\n        cur = cur->next;\n    }\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED |\n                                                 MBEDTLS_ASN1_SEQUENCE ) );\n\n    return( (int) len );\n}\n\nint mbedtls_x509_write_sig( unsigned char **p, unsigned char *start,\n                    const char *oid, size_t oid_len,\n                    unsigned char *sig, size_t size )\n{\n    int ret;\n    size_t len = 0;\n\n    if( *p < start || (size_t)( *p - start ) < size )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    len = size;\n    (*p) -= len;\n    memcpy( *p, sig, len );\n\n    if( *p - start < 1 )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    *--(*p) = 0;\n    len += 1;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_BIT_STRING ) );\n\n    // Write OID\n    //\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( p, start, oid,\n                                                        oid_len, 0 ) );\n\n    return( (int) len );\n}\n\nstatic int x509_write_extension( unsigned char **p, unsigned char *start,\n                                 mbedtls_asn1_named_data *ext )\n{\n    int ret;\n    size_t len = 0;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, ext->val.p + 1,\n                                              ext->val.len - 1 ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, ext->val.len - 1 ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OCTET_STRING ) );\n\n    if( ext->val.p[0] != 0 )\n    {\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_bool( p, start, 1 ) );\n    }\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start, ext->oid.p,\n                                              ext->oid.len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, ext->oid.len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_OID ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_CONSTRUCTED |\n                                                 MBEDTLS_ASN1_SEQUENCE ) );\n\n    return( (int) len );\n}\n\n/*\n * Extension  ::=  SEQUENCE  {\n *     extnID      OBJECT IDENTIFIER,\n *     critical    BOOLEAN DEFAULT FALSE,\n *     extnValue   OCTET STRING\n *                 -- contains the DER encoding of an ASN.1 value\n *                 -- corresponding to the extension type identified\n *                 -- by extnID\n *     }\n */\nint mbedtls_x509_write_extensions( unsigned char **p, unsigned char *start,\n                           mbedtls_asn1_named_data *first )\n{\n    int ret;\n    size_t len = 0;\n    mbedtls_asn1_named_data *cur_ext = first;\n\n    while( cur_ext != NULL )\n    {\n        MBEDTLS_ASN1_CHK_ADD( len, x509_write_extension( p, start, cur_ext ) );\n        cur_ext = cur_ext->next;\n    }\n\n    return( (int) len );\n}\n\n#endif /* MBEDTLS_X509_CREATE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/x509_crl.c",
    "content": "/*\n *  X.509 Certidicate Revocation List (CRL) parsing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The ITU-T X.509 standard defines a certificate format for PKI.\n *\n *  http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs)\n *  http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs)\n *  http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10)\n *\n *  http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf\n *  http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_X509_CRL_PARSE_C)\n\n#include \"mbedtls/x509_crl.h\"\n#include \"mbedtls/oid.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n#include \"mbedtls/pem.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#include <stdio.h>\n#define mbedtls_free       free\n#define mbedtls_calloc    calloc\n#define mbedtls_snprintf   snprintf\n#endif\n\n#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)\n#include <windows.h>\n#else\n#include <time.h>\n#endif\n\n#if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32)\n#include <stdio.h>\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n *  Version  ::=  INTEGER  {  v1(0), v2(1)  }\n */\nstatic int x509_crl_get_version( unsigned char **p,\n                             const unsigned char *end,\n                             int *ver )\n{\n    int ret;\n\n    if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 )\n    {\n        if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n        {\n            *ver = 0;\n            return( 0 );\n        }\n\n        return( MBEDTLS_ERR_X509_INVALID_VERSION + ret );\n    }\n\n    return( 0 );\n}\n\n/*\n * X.509 CRL v2 extensions (no extensions parsed yet.)\n */\nstatic int x509_get_crl_ext( unsigned char **p,\n                             const unsigned char *end,\n                             mbedtls_x509_buf *ext )\n{\n    int ret;\n    size_t len = 0;\n\n    /* Get explicit tag */\n    if( ( ret = mbedtls_x509_get_ext( p, end, ext, 0) ) != 0 )\n    {\n        if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n            return( 0 );\n\n        return( ret );\n    }\n\n    while( *p < end )\n    {\n        if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n                MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n        *p += len;\n    }\n\n    if( *p != end )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n/*\n * X.509 CRL v2 entry extensions (no extensions parsed yet.)\n */\nstatic int x509_get_crl_entry_ext( unsigned char **p,\n                             const unsigned char *end,\n                             mbedtls_x509_buf *ext )\n{\n    int ret;\n    size_t len = 0;\n\n    /* OPTIONAL */\n    if( end <= *p )\n        return( 0 );\n\n    ext->tag = **p;\n    ext->p = *p;\n\n    /*\n     * Get CRL-entry extension sequence header\n     * crlEntryExtensions      Extensions OPTIONAL  -- if present, MUST be v2\n     */\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &ext->len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n        {\n            ext->p = NULL;\n            return( 0 );\n        }\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n    }\n\n    end = *p + ext->len;\n\n    if( end != *p + ext->len )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    while( *p < end )\n    {\n        if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n                MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n        *p += len;\n    }\n\n    if( *p != end )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n/*\n * X.509 CRL Entries\n */\nstatic int x509_get_entries( unsigned char **p,\n                             const unsigned char *end,\n                             mbedtls_x509_crl_entry *entry )\n{\n    int ret;\n    size_t entry_len;\n    mbedtls_x509_crl_entry *cur_entry = entry;\n\n    if( *p == end )\n        return( 0 );\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &entry_len,\n            MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED ) ) != 0 )\n    {\n        if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n            return( 0 );\n\n        return( ret );\n    }\n\n    end = *p + entry_len;\n\n    while( *p < end )\n    {\n        size_t len2;\n        const unsigned char *end2;\n\n        if( ( ret = mbedtls_asn1_get_tag( p, end, &len2,\n                MBEDTLS_ASN1_SEQUENCE | MBEDTLS_ASN1_CONSTRUCTED ) ) != 0 )\n        {\n            return( ret );\n        }\n\n        cur_entry->raw.tag = **p;\n        cur_entry->raw.p = *p;\n        cur_entry->raw.len = len2;\n        end2 = *p + len2;\n\n        if( ( ret = mbedtls_x509_get_serial( p, end2, &cur_entry->serial ) ) != 0 )\n            return( ret );\n\n        if( ( ret = mbedtls_x509_get_time( p, end2,\n                                   &cur_entry->revocation_date ) ) != 0 )\n            return( ret );\n\n        if( ( ret = x509_get_crl_entry_ext( p, end2,\n                                            &cur_entry->entry_ext ) ) != 0 )\n            return( ret );\n\n        if( *p < end )\n        {\n            cur_entry->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crl_entry ) );\n\n            if( cur_entry->next == NULL )\n                return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n\n            cur_entry = cur_entry->next;\n        }\n    }\n\n    return( 0 );\n}\n\n/*\n * Parse one  CRLs in DER format and append it to the chained list\n */\nint mbedtls_x509_crl_parse_der( mbedtls_x509_crl *chain,\n                        const unsigned char *buf, size_t buflen )\n{\n    int ret;\n    size_t len;\n    unsigned char *p, *end;\n    mbedtls_x509_buf sig_params1, sig_params2, sig_oid2;\n    mbedtls_x509_crl *crl = chain;\n\n    /*\n     * Check for valid input\n     */\n    if( crl == NULL || buf == NULL )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    memset( &sig_params1, 0, sizeof( mbedtls_x509_buf ) );\n    memset( &sig_params2, 0, sizeof( mbedtls_x509_buf ) );\n    memset( &sig_oid2, 0, sizeof( mbedtls_x509_buf ) );\n\n    /*\n     * Add new CRL on the end of the chain if needed.\n     */\n    while( crl->version != 0 && crl->next != NULL )\n        crl = crl->next;\n\n    if( crl->version != 0 && crl->next == NULL )\n    {\n        crl->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crl ) );\n\n        if( crl->next == NULL )\n        {\n            mbedtls_x509_crl_free( crl );\n            return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n        }\n\n        mbedtls_x509_crl_init( crl->next );\n        crl = crl->next;\n    }\n\n    /*\n     * Copy raw DER-encoded CRL\n     */\n    if( ( p = mbedtls_calloc( 1, buflen ) ) == NULL )\n        return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n\n    memcpy( p, buf, buflen );\n\n    crl->raw.p = p;\n    crl->raw.len = buflen;\n\n    end = p + buflen;\n\n    /*\n     * CertificateList  ::=  SEQUENCE  {\n     *      tbsCertList          TBSCertList,\n     *      signatureAlgorithm   AlgorithmIdentifier,\n     *      signatureValue       BIT STRING  }\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT );\n    }\n\n    if( len != (size_t) ( end - p ) )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n\n    /*\n     * TBSCertList  ::=  SEQUENCE  {\n     */\n    crl->tbs.p = p;\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );\n    }\n\n    end = p + len;\n    crl->tbs.len = end - crl->tbs.p;\n\n    /*\n     * Version  ::=  INTEGER  OPTIONAL {  v1(0), v2(1)  }\n     *               -- if present, MUST be v2\n     *\n     * signature            AlgorithmIdentifier\n     */\n    if( ( ret = x509_crl_get_version( &p, end, &crl->version ) ) != 0 ||\n        ( ret = mbedtls_x509_get_alg( &p, end, &crl->sig_oid, &sig_params1 ) ) != 0 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( ret );\n    }\n\n    if( crl->version < 0 || crl->version > 1 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( MBEDTLS_ERR_X509_UNKNOWN_VERSION );\n    }\n\n    crl->version++;\n\n    if( ( ret = mbedtls_x509_get_sig_alg( &crl->sig_oid, &sig_params1,\n                                  &crl->sig_md, &crl->sig_pk,\n                                  &crl->sig_opts ) ) != 0 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG );\n    }\n\n    /*\n     * issuer               Name\n     */\n    crl->issuer_raw.p = p;\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );\n    }\n\n    if( ( ret = mbedtls_x509_get_name( &p, p + len, &crl->issuer ) ) != 0 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( ret );\n    }\n\n    crl->issuer_raw.len = p - crl->issuer_raw.p;\n\n    /*\n     * thisUpdate          Time\n     * nextUpdate          Time OPTIONAL\n     */\n    if( ( ret = mbedtls_x509_get_time( &p, end, &crl->this_update ) ) != 0 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( ret );\n    }\n\n    if( ( ret = mbedtls_x509_get_time( &p, end, &crl->next_update ) ) != 0 )\n    {\n        if( ret != ( MBEDTLS_ERR_X509_INVALID_DATE +\n                        MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) &&\n            ret != ( MBEDTLS_ERR_X509_INVALID_DATE +\n                        MBEDTLS_ERR_ASN1_OUT_OF_DATA ) )\n        {\n            mbedtls_x509_crl_free( crl );\n            return( ret );\n        }\n    }\n\n    /*\n     * revokedCertificates    SEQUENCE OF SEQUENCE   {\n     *      userCertificate        CertificateSerialNumber,\n     *      revocationDate         Time,\n     *      crlEntryExtensions     Extensions OPTIONAL\n     *                                   -- if present, MUST be v2\n     *                        } OPTIONAL\n     */\n    if( ( ret = x509_get_entries( &p, end, &crl->entry ) ) != 0 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( ret );\n    }\n\n    /*\n     * crlExtensions          EXPLICIT Extensions OPTIONAL\n     *                              -- if present, MUST be v2\n     */\n    if( crl->version == 2 )\n    {\n        ret = x509_get_crl_ext( &p, end, &crl->crl_ext );\n\n        if( ret != 0 )\n        {\n            mbedtls_x509_crl_free( crl );\n            return( ret );\n        }\n    }\n\n    if( p != end )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n\n    end = crl->raw.p + crl->raw.len;\n\n    /*\n     *  signatureAlgorithm   AlgorithmIdentifier,\n     *  signatureValue       BIT STRING\n     */\n    if( ( ret = mbedtls_x509_get_alg( &p, end, &sig_oid2, &sig_params2 ) ) != 0 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( ret );\n    }\n\n    if( crl->sig_oid.len != sig_oid2.len ||\n        memcmp( crl->sig_oid.p, sig_oid2.p, crl->sig_oid.len ) != 0 ||\n        sig_params1.len != sig_params2.len ||\n        ( sig_params1.len != 0 &&\n          memcmp( sig_params1.p, sig_params2.p, sig_params1.len ) != 0 ) )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( MBEDTLS_ERR_X509_SIG_MISMATCH );\n    }\n\n    if( ( ret = mbedtls_x509_get_sig( &p, end, &crl->sig ) ) != 0 )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( ret );\n    }\n\n    if( p != end )\n    {\n        mbedtls_x509_crl_free( crl );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n\n    return( 0 );\n}\n\n/*\n * Parse one or more CRLs and add them to the chained list\n */\nint mbedtls_x509_crl_parse( mbedtls_x509_crl *chain, const unsigned char *buf, size_t buflen )\n{\n#if defined(MBEDTLS_PEM_PARSE_C)\n    int ret;\n    size_t use_len;\n    mbedtls_pem_context pem;\n    int is_pem = 0;\n\n    if( chain == NULL || buf == NULL )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    do\n    {\n        mbedtls_pem_init( &pem );\n\n        // Avoid calling mbedtls_pem_read_buffer() on non-null-terminated\n        // string\n        if( buflen == 0 || buf[buflen - 1] != '\\0' )\n            ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;\n        else\n            ret = mbedtls_pem_read_buffer( &pem,\n                                           \"-----BEGIN X509 CRL-----\",\n                                           \"-----END X509 CRL-----\",\n                                            buf, NULL, 0, &use_len );\n\n        if( ret == 0 )\n        {\n            /*\n             * Was PEM encoded\n             */\n            is_pem = 1;\n\n            buflen -= use_len;\n            buf += use_len;\n\n            if( ( ret = mbedtls_x509_crl_parse_der( chain,\n                                            pem.buf, pem.buflen ) ) != 0 )\n            {\n                mbedtls_pem_free( &pem );\n                return( ret );\n            }\n        }\n        else if( is_pem )\n        {\n            mbedtls_pem_free( &pem );\n            return( ret );\n        }\n\n        mbedtls_pem_free( &pem );\n    }\n    /* In the PEM case, buflen is 1 at the end, for the terminated NULL byte.\n     * And a valid CRL cannot be less than 1 byte anyway. */\n    while( is_pem && buflen > 1 );\n\n    if( is_pem )\n        return( 0 );\n    else\n#endif /* MBEDTLS_PEM_PARSE_C */\n        return( mbedtls_x509_crl_parse_der( chain, buf, buflen ) );\n}\n\n#if defined(MBEDTLS_FS_IO)\n/*\n * Load one or more CRLs and add them to the chained list\n */\nint mbedtls_x509_crl_parse_file( mbedtls_x509_crl *chain, const char *path )\n{\n    int ret;\n    size_t n;\n    unsigned char *buf;\n\n    if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 )\n        return( ret );\n\n    ret = mbedtls_x509_crl_parse( chain, buf, n );\n\n    mbedtls_zeroize( buf, n );\n    mbedtls_free( buf );\n\n    return( ret );\n}\n#endif /* MBEDTLS_FS_IO */\n\n/*\n * Return an informational string about the certificate.\n */\n#define BEFORE_COLON    14\n#define BC              \"14\"\n/*\n * Return an informational string about the CRL.\n */\nint mbedtls_x509_crl_info( char *buf, size_t size, const char *prefix,\n                   const mbedtls_x509_crl *crl )\n{\n    int ret;\n    size_t n;\n    char *p;\n    const mbedtls_x509_crl_entry *entry;\n\n    p = buf;\n    n = size;\n\n    ret = mbedtls_snprintf( p, n, \"%sCRL version   : %d\",\n                               prefix, crl->version );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%sissuer name   : \", prefix );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n    ret = mbedtls_x509_dn_gets( p, n, &crl->issuer );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%sthis update   : \" \\\n                   \"%04d-%02d-%02d %02d:%02d:%02d\", prefix,\n                   crl->this_update.year, crl->this_update.mon,\n                   crl->this_update.day,  crl->this_update.hour,\n                   crl->this_update.min,  crl->this_update.sec );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%snext update   : \" \\\n                   \"%04d-%02d-%02d %02d:%02d:%02d\", prefix,\n                   crl->next_update.year, crl->next_update.mon,\n                   crl->next_update.day,  crl->next_update.hour,\n                   crl->next_update.min,  crl->next_update.sec );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    entry = &crl->entry;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%sRevoked certificates:\",\n                               prefix );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    while( entry != NULL && entry->raw.len != 0 )\n    {\n        ret = mbedtls_snprintf( p, n, \"\\n%sserial number: \",\n                               prefix );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        ret = mbedtls_x509_serial_gets( p, n, &entry->serial );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        ret = mbedtls_snprintf( p, n, \" revocation date: \" \\\n                   \"%04d-%02d-%02d %02d:%02d:%02d\",\n                   entry->revocation_date.year, entry->revocation_date.mon,\n                   entry->revocation_date.day,  entry->revocation_date.hour,\n                   entry->revocation_date.min,  entry->revocation_date.sec );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        entry = entry->next;\n    }\n\n    ret = mbedtls_snprintf( p, n, \"\\n%ssigned using  : \", prefix );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_x509_sig_alg_gets( p, n, &crl->sig_oid, crl->sig_pk, crl->sig_md,\n                             crl->sig_opts );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n\" );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    return( (int) ( size - n ) );\n}\n\n/*\n * Initialize a CRL chain\n */\nvoid mbedtls_x509_crl_init( mbedtls_x509_crl *crl )\n{\n    memset( crl, 0, sizeof(mbedtls_x509_crl) );\n}\n\n/*\n * Unallocate all CRL data\n */\nvoid mbedtls_x509_crl_free( mbedtls_x509_crl *crl )\n{\n    mbedtls_x509_crl *crl_cur = crl;\n    mbedtls_x509_crl *crl_prv;\n    mbedtls_x509_name *name_cur;\n    mbedtls_x509_name *name_prv;\n    mbedtls_x509_crl_entry *entry_cur;\n    mbedtls_x509_crl_entry *entry_prv;\n\n    if( crl == NULL )\n        return;\n\n    do\n    {\n#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)\n        mbedtls_free( crl_cur->sig_opts );\n#endif\n\n        name_cur = crl_cur->issuer.next;\n        while( name_cur != NULL )\n        {\n            name_prv = name_cur;\n            name_cur = name_cur->next;\n            mbedtls_zeroize( name_prv, sizeof( mbedtls_x509_name ) );\n            mbedtls_free( name_prv );\n        }\n\n        entry_cur = crl_cur->entry.next;\n        while( entry_cur != NULL )\n        {\n            entry_prv = entry_cur;\n            entry_cur = entry_cur->next;\n            mbedtls_zeroize( entry_prv, sizeof( mbedtls_x509_crl_entry ) );\n            mbedtls_free( entry_prv );\n        }\n\n        if( crl_cur->raw.p != NULL )\n        {\n            mbedtls_zeroize( crl_cur->raw.p, crl_cur->raw.len );\n            mbedtls_free( crl_cur->raw.p );\n        }\n\n        crl_cur = crl_cur->next;\n    }\n    while( crl_cur != NULL );\n\n    crl_cur = crl;\n    do\n    {\n        crl_prv = crl_cur;\n        crl_cur = crl_cur->next;\n\n        mbedtls_zeroize( crl_prv, sizeof( mbedtls_x509_crl ) );\n        if( crl_prv != crl )\n            mbedtls_free( crl_prv );\n    }\n    while( crl_cur != NULL );\n}\n\n#endif /* MBEDTLS_X509_CRL_PARSE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/x509_crt.c",
    "content": "/*\n *  X.509 certificate parsing and verification\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The ITU-T X.509 standard defines a certificate format for PKI.\n *\n *  http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs)\n *  http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs)\n *  http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10)\n *\n *  http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf\n *  http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n\n#include \"mbedtls/x509_crt.h\"\n#include \"mbedtls/oid.h\"\n\n#include <stdio.h>\n#include <string.h>\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n#include \"mbedtls/pem.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#define mbedtls_free       free\n#define mbedtls_calloc    calloc\n#define mbedtls_snprintf   snprintf\n#endif\n\n#if defined(MBEDTLS_THREADING_C)\n#include \"mbedtls/threading.h\"\n#endif\n\n#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)\n#include <windows.h>\n#else\n#include <time.h>\n#endif\n\n#if defined(MBEDTLS_FS_IO)\n#include <stdio.h>\n#if !defined(_WIN32) || defined(EFIX64) || defined(EFI32)\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <dirent.h>\n#endif /* !_WIN32 || EFIX64 || EFI32 */\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * Default profile\n */\nconst mbedtls_x509_crt_profile mbedtls_x509_crt_profile_default =\n{\n#if defined(MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES)\n    /* Allow SHA-1 (weak, but still safe in controlled environments) */\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA1 ) |\n#endif\n    /* Only SHA-2 hashes */\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA224 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA512 ),\n    0xFFFFFFF, /* Any PK alg    */\n    0xFFFFFFF, /* Any curve     */\n    2048,\n};\n\n/*\n * Next-default profile\n */\nconst mbedtls_x509_crt_profile mbedtls_x509_crt_profile_next =\n{\n    /* Hashes from SHA-256 and above */\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA512 ),\n    0xFFFFFFF, /* Any PK alg    */\n#if defined(MBEDTLS_ECP_C)\n    /* Curves at or above 128-bit security level */\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256R1 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP521R1 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP256R1 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP384R1 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_BP512R1 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256K1 ),\n#else\n    0,\n#endif\n    2048,\n};\n\n/*\n * NSA Suite B Profile\n */\nconst mbedtls_x509_crt_profile mbedtls_x509_crt_profile_suiteb =\n{\n    /* Only SHA-256 and 384 */\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA256 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA384 ),\n    /* Only ECDSA */\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_PK_ECDSA ),\n#if defined(MBEDTLS_ECP_C)\n    /* Only NIST P-256 and P-384 */\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP256R1 ) |\n    MBEDTLS_X509_ID_FLAG( MBEDTLS_ECP_DP_SECP384R1 ),\n#else\n    0,\n#endif\n    0,\n};\n\n/*\n * Check md_alg against profile\n * Return 0 if md_alg acceptable for this profile, -1 otherwise\n */\nstatic int x509_profile_check_md_alg( const mbedtls_x509_crt_profile *profile,\n                                      mbedtls_md_type_t md_alg )\n{\n    if( ( profile->allowed_mds & MBEDTLS_X509_ID_FLAG( md_alg ) ) != 0 )\n        return( 0 );\n\n    return( -1 );\n}\n\n/*\n * Check pk_alg against profile\n * Return 0 if pk_alg acceptable for this profile, -1 otherwise\n */\nstatic int x509_profile_check_pk_alg( const mbedtls_x509_crt_profile *profile,\n                                      mbedtls_pk_type_t pk_alg )\n{\n    if( ( profile->allowed_pks & MBEDTLS_X509_ID_FLAG( pk_alg ) ) != 0 )\n        return( 0 );\n\n    return( -1 );\n}\n\n/*\n * Check key against profile\n * Return 0 if pk_alg acceptable for this profile, -1 otherwise\n */\nstatic int x509_profile_check_key( const mbedtls_x509_crt_profile *profile,\n                                   mbedtls_pk_type_t pk_alg,\n                                   const mbedtls_pk_context *pk )\n{\n#if defined(MBEDTLS_RSA_C)\n    if( pk_alg == MBEDTLS_PK_RSA || pk_alg == MBEDTLS_PK_RSASSA_PSS )\n    {\n        if( mbedtls_pk_get_bitlen( pk ) >= profile->rsa_min_bitlen )\n            return( 0 );\n\n        return( -1 );\n    }\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n    if( pk_alg == MBEDTLS_PK_ECDSA ||\n        pk_alg == MBEDTLS_PK_ECKEY ||\n        pk_alg == MBEDTLS_PK_ECKEY_DH )\n    {\n        mbedtls_ecp_group_id gid = mbedtls_pk_ec( *pk )->grp.id;\n\n        if( ( profile->allowed_curves & MBEDTLS_X509_ID_FLAG( gid ) ) != 0 )\n            return( 0 );\n\n        return( -1 );\n    }\n#endif\n\n    return( -1 );\n}\n\n/*\n *  Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }\n */\nstatic int x509_get_version( unsigned char **p,\n                             const unsigned char *end,\n                             int *ver )\n{\n    int ret;\n    size_t len;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n            MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | 0 ) ) != 0 )\n    {\n        if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n        {\n            *ver = 0;\n            return( 0 );\n        }\n\n        return( ret );\n    }\n\n    end = *p + len;\n\n    if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_VERSION + ret );\n\n    if( *p != end )\n        return( MBEDTLS_ERR_X509_INVALID_VERSION +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n/*\n *  Validity ::= SEQUENCE {\n *       notBefore      Time,\n *       notAfter       Time }\n */\nstatic int x509_get_dates( unsigned char **p,\n                           const unsigned char *end,\n                           mbedtls_x509_time *from,\n                           mbedtls_x509_time *to )\n{\n    int ret;\n    size_t len;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_DATE + ret );\n\n    end = *p + len;\n\n    if( ( ret = mbedtls_x509_get_time( p, end, from ) ) != 0 )\n        return( ret );\n\n    if( ( ret = mbedtls_x509_get_time( p, end, to ) ) != 0 )\n        return( ret );\n\n    if( *p != end )\n        return( MBEDTLS_ERR_X509_INVALID_DATE +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n/*\n * X.509 v2/v3 unique identifier (not parsed)\n */\nstatic int x509_get_uid( unsigned char **p,\n                         const unsigned char *end,\n                         mbedtls_x509_buf *uid, int n )\n{\n    int ret;\n\n    if( *p == end )\n        return( 0 );\n\n    uid->tag = **p;\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &uid->len,\n            MBEDTLS_ASN1_CONTEXT_SPECIFIC | MBEDTLS_ASN1_CONSTRUCTED | n ) ) != 0 )\n    {\n        if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n            return( 0 );\n\n        return( ret );\n    }\n\n    uid->p = *p;\n    *p += uid->len;\n\n    return( 0 );\n}\n\nstatic int x509_get_basic_constraints( unsigned char **p,\n                                       const unsigned char *end,\n                                       int *ca_istrue,\n                                       int *max_pathlen )\n{\n    int ret;\n    size_t len;\n\n    /*\n     * BasicConstraints ::= SEQUENCE {\n     *      cA                      BOOLEAN DEFAULT FALSE,\n     *      pathLenConstraint       INTEGER (0..MAX) OPTIONAL }\n     */\n    *ca_istrue = 0; /* DEFAULT FALSE */\n    *max_pathlen = 0; /* endless */\n\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n    if( *p == end )\n        return( 0 );\n\n    if( ( ret = mbedtls_asn1_get_bool( p, end, ca_istrue ) ) != 0 )\n    {\n        if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n            ret = mbedtls_asn1_get_int( p, end, ca_istrue );\n\n        if( ret != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n        if( *ca_istrue != 0 )\n            *ca_istrue = 1;\n    }\n\n    if( *p == end )\n        return( 0 );\n\n    if( ( ret = mbedtls_asn1_get_int( p, end, max_pathlen ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n    if( *p != end )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    (*max_pathlen)++;\n\n    return( 0 );\n}\n\nstatic int x509_get_ns_cert_type( unsigned char **p,\n                                       const unsigned char *end,\n                                       unsigned char *ns_cert_type)\n{\n    int ret;\n    mbedtls_x509_bitstring bs = { 0, 0, NULL };\n\n    if( ( ret = mbedtls_asn1_get_bitstring( p, end, &bs ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n    if( bs.len != 1 )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_INVALID_LENGTH );\n\n    /* Get actual bitstring */\n    *ns_cert_type = *bs.p;\n    return( 0 );\n}\n\nstatic int x509_get_key_usage( unsigned char **p,\n                               const unsigned char *end,\n                               unsigned int *key_usage)\n{\n    int ret;\n    size_t i;\n    mbedtls_x509_bitstring bs = { 0, 0, NULL };\n\n    if( ( ret = mbedtls_asn1_get_bitstring( p, end, &bs ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n    if( bs.len < 1 )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_INVALID_LENGTH );\n\n    /* Get actual bitstring */\n    *key_usage = 0;\n    for( i = 0; i < bs.len && i < sizeof( unsigned int ); i++ )\n    {\n        *key_usage |= (unsigned int) bs.p[i] << (8*i);\n    }\n\n    return( 0 );\n}\n\n/*\n * ExtKeyUsageSyntax ::= SEQUENCE SIZE (1..MAX) OF KeyPurposeId\n *\n * KeyPurposeId ::= OBJECT IDENTIFIER\n */\nstatic int x509_get_ext_key_usage( unsigned char **p,\n                               const unsigned char *end,\n                               mbedtls_x509_sequence *ext_key_usage)\n{\n    int ret;\n\n    if( ( ret = mbedtls_asn1_get_sequence_of( p, end, ext_key_usage, MBEDTLS_ASN1_OID ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n    /* Sequence length must be >= 1 */\n    if( ext_key_usage->buf.p == NULL )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_INVALID_LENGTH );\n\n    return( 0 );\n}\n\n/*\n * SubjectAltName ::= GeneralNames\n *\n * GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName\n *\n * GeneralName ::= CHOICE {\n *      otherName                       [0]     OtherName,\n *      rfc822Name                      [1]     IA5String,\n *      dNSName                         [2]     IA5String,\n *      x400Address                     [3]     ORAddress,\n *      directoryName                   [4]     Name,\n *      ediPartyName                    [5]     EDIPartyName,\n *      uniformResourceIdentifier       [6]     IA5String,\n *      iPAddress                       [7]     OCTET STRING,\n *      registeredID                    [8]     OBJECT IDENTIFIER }\n *\n * OtherName ::= SEQUENCE {\n *      type-id    OBJECT IDENTIFIER,\n *      value      [0] EXPLICIT ANY DEFINED BY type-id }\n *\n * EDIPartyName ::= SEQUENCE {\n *      nameAssigner            [0]     DirectoryString OPTIONAL,\n *      partyName               [1]     DirectoryString }\n *\n * NOTE: we only parse and use dNSName at this point.\n */\nstatic int x509_get_subject_alt_name( unsigned char **p,\n                                      const unsigned char *end,\n                                      mbedtls_x509_sequence *subject_alt_name )\n{\n    int ret;\n    size_t len, tag_len;\n    mbedtls_asn1_buf *buf;\n    unsigned char tag;\n    mbedtls_asn1_sequence *cur = subject_alt_name;\n\n    /* Get main sequence tag */\n    if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n    if( *p + len != end )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    while( *p < end )\n    {\n        if( ( end - *p ) < 1 )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                    MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n        tag = **p;\n        (*p)++;\n        if( ( ret = mbedtls_asn1_get_len( p, end, &tag_len ) ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n        if( ( tag & MBEDTLS_ASN1_CONTEXT_SPECIFIC ) != MBEDTLS_ASN1_CONTEXT_SPECIFIC )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                    MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n\n        /* Skip everything but DNS name */\n        if( tag != ( MBEDTLS_ASN1_CONTEXT_SPECIFIC | 2 ) )\n        {\n            *p += tag_len;\n            continue;\n        }\n\n        /* Allocate and assign next pointer */\n        if( cur->buf.p != NULL )\n        {\n            if( cur->next != NULL )\n                return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS );\n\n            cur->next = mbedtls_calloc( 1, sizeof( mbedtls_asn1_sequence ) );\n\n            if( cur->next == NULL )\n                return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                        MBEDTLS_ERR_ASN1_ALLOC_FAILED );\n\n            cur = cur->next;\n        }\n\n        buf = &(cur->buf);\n        buf->tag = tag;\n        buf->p = *p;\n        buf->len = tag_len;\n        *p += buf->len;\n    }\n\n    /* Set final sequence entry's next pointer to NULL */\n    cur->next = NULL;\n\n    if( *p != end )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n/*\n * X.509 v3 extensions\n *\n */\nstatic int x509_get_crt_ext( unsigned char **p,\n                             const unsigned char *end,\n                             mbedtls_x509_crt *crt )\n{\n    int ret;\n    size_t len;\n    unsigned char *end_ext_data, *end_ext_octet;\n\n    if( ( ret = mbedtls_x509_get_ext( p, end, &crt->v3_ext, 3 ) ) != 0 )\n    {\n        if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n            return( 0 );\n\n        return( ret );\n    }\n\n    while( *p < end )\n    {\n        /*\n         * Extension  ::=  SEQUENCE  {\n         *      extnID      OBJECT IDENTIFIER,\n         *      critical    BOOLEAN DEFAULT FALSE,\n         *      extnValue   OCTET STRING  }\n         */\n        mbedtls_x509_buf extn_oid = {0, 0, NULL};\n        int is_critical = 0; /* DEFAULT FALSE */\n        int ext_type = 0;\n\n        if( ( ret = mbedtls_asn1_get_tag( p, end, &len,\n                MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n        end_ext_data = *p + len;\n\n        /* Get extension ID */\n        extn_oid.tag = **p;\n\n        if( ( ret = mbedtls_asn1_get_tag( p, end, &extn_oid.len, MBEDTLS_ASN1_OID ) ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n        extn_oid.p = *p;\n        *p += extn_oid.len;\n\n        if( ( end - *p ) < 1 )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                    MBEDTLS_ERR_ASN1_OUT_OF_DATA );\n\n        /* Get optional critical */\n        if( ( ret = mbedtls_asn1_get_bool( p, end_ext_data, &is_critical ) ) != 0 &&\n            ( ret != MBEDTLS_ERR_ASN1_UNEXPECTED_TAG ) )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n        /* Data should be octet string type */\n        if( ( ret = mbedtls_asn1_get_tag( p, end_ext_data, &len,\n                MBEDTLS_ASN1_OCTET_STRING ) ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS + ret );\n\n        end_ext_octet = *p + len;\n\n        if( end_ext_octet != end_ext_data )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                    MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n        /*\n         * Detect supported extensions\n         */\n        ret = mbedtls_oid_get_x509_ext_type( &extn_oid, &ext_type );\n\n        if( ret != 0 )\n        {\n            /* No parser found, skip extension */\n            *p = end_ext_octet;\n\n#if !defined(MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION)\n            if( is_critical )\n            {\n                /* Data is marked as critical: fail */\n                return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                        MBEDTLS_ERR_ASN1_UNEXPECTED_TAG );\n            }\n#endif\n            continue;\n        }\n\n        /* Forbid repeated extensions */\n        if( ( crt->ext_types & ext_type ) != 0 )\n            return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS );\n\n        crt->ext_types |= ext_type;\n\n        switch( ext_type )\n        {\n        case MBEDTLS_X509_EXT_BASIC_CONSTRAINTS:\n            /* Parse basic constraints */\n            if( ( ret = x509_get_basic_constraints( p, end_ext_octet,\n                    &crt->ca_istrue, &crt->max_pathlen ) ) != 0 )\n                return( ret );\n            break;\n\n        case MBEDTLS_X509_EXT_KEY_USAGE:\n            /* Parse key usage */\n            if( ( ret = x509_get_key_usage( p, end_ext_octet,\n                    &crt->key_usage ) ) != 0 )\n                return( ret );\n            break;\n\n        case MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE:\n            /* Parse extended key usage */\n            if( ( ret = x509_get_ext_key_usage( p, end_ext_octet,\n                    &crt->ext_key_usage ) ) != 0 )\n                return( ret );\n            break;\n\n        case MBEDTLS_X509_EXT_SUBJECT_ALT_NAME:\n            /* Parse subject alt name */\n            if( ( ret = x509_get_subject_alt_name( p, end_ext_octet,\n                    &crt->subject_alt_names ) ) != 0 )\n                return( ret );\n            break;\n\n        case MBEDTLS_X509_EXT_NS_CERT_TYPE:\n            /* Parse netscape certificate type */\n            if( ( ret = x509_get_ns_cert_type( p, end_ext_octet,\n                    &crt->ns_cert_type ) ) != 0 )\n                return( ret );\n            break;\n\n        default:\n            return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE );\n        }\n    }\n\n    if( *p != end )\n        return( MBEDTLS_ERR_X509_INVALID_EXTENSIONS +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n\n    return( 0 );\n}\n\n/*\n * Parse and fill a single X.509 certificate in DER format\n */\nstatic int x509_crt_parse_der_core( mbedtls_x509_crt *crt, const unsigned char *buf,\n                                    size_t buflen )\n{\n    int ret;\n    size_t len;\n    unsigned char *p, *end, *crt_end;\n    mbedtls_x509_buf sig_params1, sig_params2, sig_oid2;\n\n    memset( &sig_params1, 0, sizeof( mbedtls_x509_buf ) );\n    memset( &sig_params2, 0, sizeof( mbedtls_x509_buf ) );\n    memset( &sig_oid2, 0, sizeof( mbedtls_x509_buf ) );\n\n    /*\n     * Check for valid input\n     */\n    if( crt == NULL || buf == NULL )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    // Use the original buffer until we figure out actual length\n    p = (unsigned char*) buf;\n    len = buflen;\n    end = p + len;\n\n    /*\n     * Certificate  ::=  SEQUENCE  {\n     *      tbsCertificate       TBSCertificate,\n     *      signatureAlgorithm   AlgorithmIdentifier,\n     *      signatureValue       BIT STRING  }\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT );\n    }\n\n    if( len > (size_t) ( end - p ) )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n    crt_end = p + len;\n\n    // Create and populate a new buffer for the raw field\n    crt->raw.len = crt_end - buf;\n    crt->raw.p = p = mbedtls_calloc( 1, crt->raw.len );\n    if( p == NULL )\n        return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n\n    memcpy( p, buf, crt->raw.len );\n\n    // Direct pointers to the new buffer \n    p += crt->raw.len - len;\n    end = crt_end = p + len;\n\n    /*\n     * TBSCertificate  ::=  SEQUENCE  {\n     */\n    crt->tbs.p = p;\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );\n    }\n\n    end = p + len;\n    crt->tbs.len = end - crt->tbs.p;\n\n    /*\n     * Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }\n     *\n     * CertificateSerialNumber  ::=  INTEGER\n     *\n     * signature            AlgorithmIdentifier\n     */\n    if( ( ret = x509_get_version(  &p, end, &crt->version  ) ) != 0 ||\n        ( ret = mbedtls_x509_get_serial(   &p, end, &crt->serial   ) ) != 0 ||\n        ( ret = mbedtls_x509_get_alg(      &p, end, &crt->sig_oid,\n                                            &sig_params1 ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( ret );\n    }\n\n    if( crt->version < 0 || crt->version > 2 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( MBEDTLS_ERR_X509_UNKNOWN_VERSION );\n    }\n\n    crt->version++;\n\n    if( ( ret = mbedtls_x509_get_sig_alg( &crt->sig_oid, &sig_params1,\n                                  &crt->sig_md, &crt->sig_pk,\n                                  &crt->sig_opts ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( ret );\n    }\n\n    /*\n     * issuer               Name\n     */\n    crt->issuer_raw.p = p;\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );\n    }\n\n    if( ( ret = mbedtls_x509_get_name( &p, p + len, &crt->issuer ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( ret );\n    }\n\n    crt->issuer_raw.len = p - crt->issuer_raw.p;\n\n    /*\n     * Validity ::= SEQUENCE {\n     *      notBefore      Time,\n     *      notAfter       Time }\n     *\n     */\n    if( ( ret = x509_get_dates( &p, end, &crt->valid_from,\n                                         &crt->valid_to ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( ret );\n    }\n\n    /*\n     * subject              Name\n     */\n    crt->subject_raw.p = p;\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );\n    }\n\n    if( len && ( ret = mbedtls_x509_get_name( &p, p + len, &crt->subject ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( ret );\n    }\n\n    crt->subject_raw.len = p - crt->subject_raw.p;\n\n    /*\n     * SubjectPublicKeyInfo\n     */\n    if( ( ret = mbedtls_pk_parse_subpubkey( &p, end, &crt->pk ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( ret );\n    }\n\n    /*\n     *  issuerUniqueID  [1]  IMPLICIT UniqueIdentifier OPTIONAL,\n     *                       -- If present, version shall be v2 or v3\n     *  subjectUniqueID [2]  IMPLICIT UniqueIdentifier OPTIONAL,\n     *                       -- If present, version shall be v2 or v3\n     *  extensions      [3]  EXPLICIT Extensions OPTIONAL\n     *                       -- If present, version shall be v3\n     */\n    if( crt->version == 2 || crt->version == 3 )\n    {\n        ret = x509_get_uid( &p, end, &crt->issuer_id,  1 );\n        if( ret != 0 )\n        {\n            mbedtls_x509_crt_free( crt );\n            return( ret );\n        }\n    }\n\n    if( crt->version == 2 || crt->version == 3 )\n    {\n        ret = x509_get_uid( &p, end, &crt->subject_id,  2 );\n        if( ret != 0 )\n        {\n            mbedtls_x509_crt_free( crt );\n            return( ret );\n        }\n    }\n\n#if !defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3)\n    if( crt->version == 3 )\n#endif\n    {\n        ret = x509_get_crt_ext( &p, end, crt );\n        if( ret != 0 )\n        {\n            mbedtls_x509_crt_free( crt );\n            return( ret );\n        }\n    }\n\n    if( p != end )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n\n    end = crt_end;\n\n    /*\n     *  }\n     *  -- end of TBSCertificate\n     *\n     *  signatureAlgorithm   AlgorithmIdentifier,\n     *  signatureValue       BIT STRING\n     */\n    if( ( ret = mbedtls_x509_get_alg( &p, end, &sig_oid2, &sig_params2 ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( ret );\n    }\n\n    if( crt->sig_oid.len != sig_oid2.len ||\n        memcmp( crt->sig_oid.p, sig_oid2.p, crt->sig_oid.len ) != 0 ||\n        sig_params1.len != sig_params2.len ||\n        ( sig_params1.len != 0 &&\n          memcmp( sig_params1.p, sig_params2.p, sig_params1.len ) != 0 ) )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( MBEDTLS_ERR_X509_SIG_MISMATCH );\n    }\n\n    if( ( ret = mbedtls_x509_get_sig( &p, end, &crt->sig ) ) != 0 )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( ret );\n    }\n\n    if( p != end )\n    {\n        mbedtls_x509_crt_free( crt );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n\n    return( 0 );\n}\n\n/*\n * Parse one X.509 certificate in DER format from a buffer and add them to a\n * chained list\n */\nint mbedtls_x509_crt_parse_der( mbedtls_x509_crt *chain, const unsigned char *buf,\n                        size_t buflen )\n{\n    int ret;\n    mbedtls_x509_crt *crt = chain, *prev = NULL;\n\n    /*\n     * Check for valid input\n     */\n    if( crt == NULL || buf == NULL )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    while( crt->version != 0 && crt->next != NULL )\n    {\n        prev = crt;\n        crt = crt->next;\n    }\n\n    /*\n     * Add new certificate on the end of the chain if needed.\n     */\n    if( crt->version != 0 && crt->next == NULL )\n    {\n        crt->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) );\n\n        if( crt->next == NULL )\n            return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n\n        prev = crt;\n        mbedtls_x509_crt_init( crt->next );\n        crt = crt->next;\n    }\n\n    if( ( ret = x509_crt_parse_der_core( crt, buf, buflen ) ) != 0 )\n    {\n        if( prev )\n            prev->next = NULL;\n\n        if( crt != chain )\n            mbedtls_free( crt );\n\n        return( ret );\n    }\n\n    return( 0 );\n}\n\n/*\n * Parse one or more PEM certificates from a buffer and add them to the chained\n * list\n */\nint mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen )\n{\n#if defined(MBEDTLS_PEM_PARSE_C)\n    int success = 0, first_error = 0, total_failed = 0;\n    int buf_format = MBEDTLS_X509_FORMAT_DER;\n#endif\n\n    /*\n     * Check for valid input\n     */\n    if( chain == NULL || buf == NULL )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    /*\n     * Determine buffer content. Buffer contains either one DER certificate or\n     * one or more PEM certificates.\n     */\n#if defined(MBEDTLS_PEM_PARSE_C)\n    if( buflen != 0 && buf[buflen - 1] == '\\0' &&\n        strstr( (const char *) buf, \"-----BEGIN CERTIFICATE-----\" ) != NULL )\n    {\n        buf_format = MBEDTLS_X509_FORMAT_PEM;\n    }\n\n    if( buf_format == MBEDTLS_X509_FORMAT_DER )\n        return mbedtls_x509_crt_parse_der( chain, buf, buflen );\n#else\n    return mbedtls_x509_crt_parse_der( chain, buf, buflen );\n#endif\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n    if( buf_format == MBEDTLS_X509_FORMAT_PEM )\n    {\n        int ret;\n        mbedtls_pem_context pem;\n\n        /* 1 rather than 0 since the terminating NULL byte is counted in */\n        while( buflen > 1 )\n        {\n            size_t use_len;\n            mbedtls_pem_init( &pem );\n\n            /* If we get there, we know the string is null-terminated */\n            ret = mbedtls_pem_read_buffer( &pem,\n                           \"-----BEGIN CERTIFICATE-----\",\n                           \"-----END CERTIFICATE-----\",\n                           buf, NULL, 0, &use_len );\n\n            if( ret == 0 )\n            {\n                /*\n                 * Was PEM encoded\n                 */\n                buflen -= use_len;\n                buf += use_len;\n            }\n            else if( ret == MBEDTLS_ERR_PEM_BAD_INPUT_DATA )\n            {\n                return( ret );\n            }\n            else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )\n            {\n                mbedtls_pem_free( &pem );\n\n                /*\n                 * PEM header and footer were found\n                 */\n                buflen -= use_len;\n                buf += use_len;\n\n                if( first_error == 0 )\n                    first_error = ret;\n\n                total_failed++;\n                continue;\n            }\n            else\n                break;\n\n            ret = mbedtls_x509_crt_parse_der( chain, pem.buf, pem.buflen );\n\n            mbedtls_pem_free( &pem );\n\n            if( ret != 0 )\n            {\n                /*\n                 * Quit parsing on a memory error\n                 */\n                if( ret == MBEDTLS_ERR_X509_ALLOC_FAILED )\n                    return( ret );\n\n                if( first_error == 0 )\n                    first_error = ret;\n\n                total_failed++;\n                continue;\n            }\n\n            success = 1;\n        }\n    }\n\n    if( success )\n        return( total_failed );\n    else if( first_error )\n        return( first_error );\n    else\n        return( MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT );\n#endif /* MBEDTLS_PEM_PARSE_C */\n}\n\n#if defined(MBEDTLS_FS_IO)\n/*\n * Load one or more certificates and add them to the chained list\n */\nint mbedtls_x509_crt_parse_file( mbedtls_x509_crt *chain, const char *path )\n{\n    int ret;\n    size_t n;\n    unsigned char *buf;\n\n    if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 )\n        return( ret );\n\n    ret = mbedtls_x509_crt_parse( chain, buf, n );\n\n    mbedtls_zeroize( buf, n );\n    mbedtls_free( buf );\n\n    return( ret );\n}\n\nint mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path )\n{\n    int ret = 0;\n#if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32)\n    int w_ret;\n    WCHAR szDir[MAX_PATH];\n    char filename[MAX_PATH];\n    char *p;\n    size_t len = strlen( path );\n\n    WIN32_FIND_DATAW file_data;\n    HANDLE hFind;\n\n    if( len > MAX_PATH - 3 )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    memset( szDir, 0, sizeof(szDir) );\n    memset( filename, 0, MAX_PATH );\n    memcpy( filename, path, len );\n    filename[len++] = '\\\\';\n    p = filename + len;\n    filename[len++] = '*';\n\n    w_ret = MultiByteToWideChar( CP_ACP, 0, filename, (int)len, szDir,\n                                 MAX_PATH - 3 );\n    if( w_ret == 0 )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    hFind = FindFirstFileW( szDir, &file_data );\n    if( hFind == INVALID_HANDLE_VALUE )\n        return( MBEDTLS_ERR_X509_FILE_IO_ERROR );\n\n    len = MAX_PATH - len;\n    do\n    {\n        memset( p, 0, len );\n\n        if( file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )\n            continue;\n\n        w_ret = WideCharToMultiByte( CP_ACP, 0, file_data.cFileName,\n                                     lstrlenW( file_data.cFileName ),\n                                     p, (int) len - 1,\n                                     NULL, NULL );\n        if( w_ret == 0 )\n        {\n            ret = MBEDTLS_ERR_X509_FILE_IO_ERROR;\n            goto cleanup;\n        }\n\n        w_ret = mbedtls_x509_crt_parse_file( chain, filename );\n        if( w_ret < 0 )\n            ret++;\n        else\n            ret += w_ret;\n    }\n    while( FindNextFileW( hFind, &file_data ) != 0 );\n\n    if( GetLastError() != ERROR_NO_MORE_FILES )\n        ret = MBEDTLS_ERR_X509_FILE_IO_ERROR;\n\ncleanup:\n    FindClose( hFind );\n#else /* _WIN32 */\n    int t_ret;\n    int snp_ret;\n    struct stat sb;\n    struct dirent *entry;\n    char entry_name[MBEDTLS_X509_MAX_FILE_PATH_LEN];\n    DIR *dir = opendir( path );\n\n    if( dir == NULL )\n        return( MBEDTLS_ERR_X509_FILE_IO_ERROR );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( ( ret = mbedtls_mutex_lock( &mbedtls_threading_readdir_mutex ) ) != 0 )\n    {\n        closedir( dir );\n        return( ret );\n    }\n#endif /* MBEDTLS_THREADING_C */\n\n    while( ( entry = readdir( dir ) ) != NULL )\n    {\n        snp_ret = mbedtls_snprintf( entry_name, sizeof entry_name,\n                                    \"%s/%s\", path, entry->d_name );\n\n        if( snp_ret < 0 || (size_t)snp_ret >= sizeof entry_name )\n        {\n            ret = MBEDTLS_ERR_X509_BUFFER_TOO_SMALL;\n            goto cleanup;\n        }\n        else if( stat( entry_name, &sb ) == -1 )\n        {\n            ret = MBEDTLS_ERR_X509_FILE_IO_ERROR;\n            goto cleanup;\n        }\n\n        if( !S_ISREG( sb.st_mode ) )\n            continue;\n\n        // Ignore parse errors\n        //\n        t_ret = mbedtls_x509_crt_parse_file( chain, entry_name );\n        if( t_ret < 0 )\n            ret++;\n        else\n            ret += t_ret;\n    }\n\ncleanup:\n    closedir( dir );\n\n#if defined(MBEDTLS_THREADING_C)\n    if( mbedtls_mutex_unlock( &mbedtls_threading_readdir_mutex ) != 0 )\n        ret = MBEDTLS_ERR_THREADING_MUTEX_ERROR;\n#endif /* MBEDTLS_THREADING_C */\n\n#endif /* _WIN32 */\n\n    return( ret );\n}\n#endif /* MBEDTLS_FS_IO */\n\nstatic int x509_info_subject_alt_name( char **buf, size_t *size,\n                                       const mbedtls_x509_sequence *subject_alt_name )\n{\n    size_t i;\n    size_t n = *size;\n    char *p = *buf;\n    const mbedtls_x509_sequence *cur = subject_alt_name;\n    const char *sep = \"\";\n    size_t sep_len = 0;\n\n    while( cur != NULL )\n    {\n        if( cur->buf.len + sep_len >= n )\n        {\n            *p = '\\0';\n            return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL );\n        }\n\n        n -= cur->buf.len + sep_len;\n        for( i = 0; i < sep_len; i++ )\n            *p++ = sep[i];\n        for( i = 0; i < cur->buf.len; i++ )\n            *p++ = cur->buf.p[i];\n\n        sep = \", \";\n        sep_len = 2;\n\n        cur = cur->next;\n    }\n\n    *p = '\\0';\n\n    *size = n;\n    *buf = p;\n\n    return( 0 );\n}\n\n#define PRINT_ITEM(i)                           \\\n    {                                           \\\n        ret = mbedtls_snprintf( p, n, \"%s\" i, sep );    \\\n        MBEDTLS_X509_SAFE_SNPRINTF;                        \\\n        sep = \", \";                             \\\n    }\n\n#define CERT_TYPE(type,name)                    \\\n    if( ns_cert_type & type )                   \\\n        PRINT_ITEM( name );\n\nstatic int x509_info_cert_type( char **buf, size_t *size,\n                                unsigned char ns_cert_type )\n{\n    int ret;\n    size_t n = *size;\n    char *p = *buf;\n    const char *sep = \"\";\n\n    CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT,         \"SSL Client\" );\n    CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER,         \"SSL Server\" );\n    CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_EMAIL,              \"Email\" );\n    CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING,     \"Object Signing\" );\n    CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_RESERVED,           \"Reserved\" );\n    CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_SSL_CA,             \"SSL CA\" );\n    CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA,           \"Email CA\" );\n    CERT_TYPE( MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA,  \"Object Signing CA\" );\n\n    *size = n;\n    *buf = p;\n\n    return( 0 );\n}\n\n#define KEY_USAGE(code,name)    \\\n    if( key_usage & code )      \\\n        PRINT_ITEM( name );\n\nstatic int x509_info_key_usage( char **buf, size_t *size,\n                                unsigned int key_usage )\n{\n    int ret;\n    size_t n = *size;\n    char *p = *buf;\n    const char *sep = \"\";\n\n    KEY_USAGE( MBEDTLS_X509_KU_DIGITAL_SIGNATURE,    \"Digital Signature\" );\n    KEY_USAGE( MBEDTLS_X509_KU_NON_REPUDIATION,      \"Non Repudiation\" );\n    KEY_USAGE( MBEDTLS_X509_KU_KEY_ENCIPHERMENT,     \"Key Encipherment\" );\n    KEY_USAGE( MBEDTLS_X509_KU_DATA_ENCIPHERMENT,    \"Data Encipherment\" );\n    KEY_USAGE( MBEDTLS_X509_KU_KEY_AGREEMENT,        \"Key Agreement\" );\n    KEY_USAGE( MBEDTLS_X509_KU_KEY_CERT_SIGN,        \"Key Cert Sign\" );\n    KEY_USAGE( MBEDTLS_X509_KU_CRL_SIGN,             \"CRL Sign\" );\n    KEY_USAGE( MBEDTLS_X509_KU_ENCIPHER_ONLY,        \"Encipher Only\" );\n    KEY_USAGE( MBEDTLS_X509_KU_DECIPHER_ONLY,        \"Decipher Only\" );\n\n    *size = n;\n    *buf = p;\n\n    return( 0 );\n}\n\nstatic int x509_info_ext_key_usage( char **buf, size_t *size,\n                                    const mbedtls_x509_sequence *extended_key_usage )\n{\n    int ret;\n    const char *desc;\n    size_t n = *size;\n    char *p = *buf;\n    const mbedtls_x509_sequence *cur = extended_key_usage;\n    const char *sep = \"\";\n\n    while( cur != NULL )\n    {\n        if( mbedtls_oid_get_extended_key_usage( &cur->buf, &desc ) != 0 )\n            desc = \"???\";\n\n        ret = mbedtls_snprintf( p, n, \"%s%s\", sep, desc );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        sep = \", \";\n\n        cur = cur->next;\n    }\n\n    *size = n;\n    *buf = p;\n\n    return( 0 );\n}\n\n/*\n * Return an informational string about the certificate.\n */\n#define BEFORE_COLON    18\n#define BC              \"18\"\nint mbedtls_x509_crt_info( char *buf, size_t size, const char *prefix,\n                   const mbedtls_x509_crt *crt )\n{\n    int ret;\n    size_t n;\n    char *p;\n    char key_size_str[BEFORE_COLON];\n\n    p = buf;\n    n = size;\n\n    if( NULL == crt )\n    {\n        ret = mbedtls_snprintf( p, n, \"\\nCertificate is uninitialised!\\n\" );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        return( (int) ( size - n ) );\n    }\n\n    ret = mbedtls_snprintf( p, n, \"%scert. version     : %d\\n\",\n                               prefix, crt->version );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n    ret = mbedtls_snprintf( p, n, \"%sserial number     : \",\n                               prefix );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_x509_serial_gets( p, n, &crt->serial );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%sissuer name       : \", prefix );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n    ret = mbedtls_x509_dn_gets( p, n, &crt->issuer  );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%ssubject name      : \", prefix );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n    ret = mbedtls_x509_dn_gets( p, n, &crt->subject );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%sissued  on        : \" \\\n                   \"%04d-%02d-%02d %02d:%02d:%02d\", prefix,\n                   crt->valid_from.year, crt->valid_from.mon,\n                   crt->valid_from.day,  crt->valid_from.hour,\n                   crt->valid_from.min,  crt->valid_from.sec );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%sexpires on        : \" \\\n                   \"%04d-%02d-%02d %02d:%02d:%02d\", prefix,\n                   crt->valid_to.year, crt->valid_to.mon,\n                   crt->valid_to.day,  crt->valid_to.hour,\n                   crt->valid_to.min,  crt->valid_to.sec );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%ssigned using      : \", prefix );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_x509_sig_alg_gets( p, n, &crt->sig_oid, crt->sig_pk,\n                             crt->sig_md, crt->sig_opts );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    /* Key size */\n    if( ( ret = mbedtls_x509_key_size_helper( key_size_str, BEFORE_COLON,\n                                      mbedtls_pk_get_name( &crt->pk ) ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    ret = mbedtls_snprintf( p, n, \"\\n%s%-\" BC \"s: %d bits\", prefix, key_size_str,\n                          (int) mbedtls_pk_get_bitlen( &crt->pk ) );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    /*\n     * Optional extensions\n     */\n\n    if( crt->ext_types & MBEDTLS_X509_EXT_BASIC_CONSTRAINTS )\n    {\n        ret = mbedtls_snprintf( p, n, \"\\n%sbasic constraints : CA=%s\", prefix,\n                        crt->ca_istrue ? \"true\" : \"false\" );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        if( crt->max_pathlen > 0 )\n        {\n            ret = mbedtls_snprintf( p, n, \", max_pathlen=%d\", crt->max_pathlen - 1 );\n            MBEDTLS_X509_SAFE_SNPRINTF;\n        }\n    }\n\n    if( crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME )\n    {\n        ret = mbedtls_snprintf( p, n, \"\\n%ssubject alt name  : \", prefix );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        if( ( ret = x509_info_subject_alt_name( &p, &n,\n                                            &crt->subject_alt_names ) ) != 0 )\n            return( ret );\n    }\n\n    if( crt->ext_types & MBEDTLS_X509_EXT_NS_CERT_TYPE )\n    {\n        ret = mbedtls_snprintf( p, n, \"\\n%scert. type        : \", prefix );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        if( ( ret = x509_info_cert_type( &p, &n, crt->ns_cert_type ) ) != 0 )\n            return( ret );\n    }\n\n    if( crt->ext_types & MBEDTLS_X509_EXT_KEY_USAGE )\n    {\n        ret = mbedtls_snprintf( p, n, \"\\n%skey usage         : \", prefix );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        if( ( ret = x509_info_key_usage( &p, &n, crt->key_usage ) ) != 0 )\n            return( ret );\n    }\n\n    if( crt->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE )\n    {\n        ret = mbedtls_snprintf( p, n, \"\\n%sext key usage     : \", prefix );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n\n        if( ( ret = x509_info_ext_key_usage( &p, &n,\n                                             &crt->ext_key_usage ) ) != 0 )\n            return( ret );\n    }\n\n    ret = mbedtls_snprintf( p, n, \"\\n\" );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    return( (int) ( size - n ) );\n}\n\nstruct x509_crt_verify_string {\n    int code;\n    const char *string;\n};\n\nstatic const struct x509_crt_verify_string x509_crt_verify_strings[] = {\n    { MBEDTLS_X509_BADCERT_EXPIRED,       \"The certificate validity has expired\" },\n    { MBEDTLS_X509_BADCERT_REVOKED,       \"The certificate has been revoked (is on a CRL)\" },\n    { MBEDTLS_X509_BADCERT_CN_MISMATCH,   \"The certificate Common Name (CN) does not match with the expected CN\" },\n    { MBEDTLS_X509_BADCERT_NOT_TRUSTED,   \"The certificate is not correctly signed by the trusted CA\" },\n    { MBEDTLS_X509_BADCRL_NOT_TRUSTED,    \"The CRL is not correctly signed by the trusted CA\" },\n    { MBEDTLS_X509_BADCRL_EXPIRED,        \"The CRL is expired\" },\n    { MBEDTLS_X509_BADCERT_MISSING,       \"Certificate was missing\" },\n    { MBEDTLS_X509_BADCERT_SKIP_VERIFY,   \"Certificate verification was skipped\" },\n    { MBEDTLS_X509_BADCERT_OTHER,         \"Other reason (can be used by verify callback)\" },\n    { MBEDTLS_X509_BADCERT_FUTURE,        \"The certificate validity starts in the future\" },\n    { MBEDTLS_X509_BADCRL_FUTURE,         \"The CRL is from the future\" },\n    { MBEDTLS_X509_BADCERT_KEY_USAGE,     \"Usage does not match the keyUsage extension\" },\n    { MBEDTLS_X509_BADCERT_EXT_KEY_USAGE, \"Usage does not match the extendedKeyUsage extension\" },\n    { MBEDTLS_X509_BADCERT_NS_CERT_TYPE,  \"Usage does not match the nsCertType extension\" },\n    { MBEDTLS_X509_BADCERT_BAD_MD,        \"The certificate is signed with an unacceptable hash.\" },\n    { MBEDTLS_X509_BADCERT_BAD_PK,        \"The certificate is signed with an unacceptable PK alg (eg RSA vs ECDSA).\" },\n    { MBEDTLS_X509_BADCERT_BAD_KEY,       \"The certificate is signed with an unacceptable key (eg bad curve, RSA too short).\" },\n    { MBEDTLS_X509_BADCRL_BAD_MD,         \"The CRL is signed with an unacceptable hash.\" },\n    { MBEDTLS_X509_BADCRL_BAD_PK,         \"The CRL is signed with an unacceptable PK alg (eg RSA vs ECDSA).\" },\n    { MBEDTLS_X509_BADCRL_BAD_KEY,        \"The CRL is signed with an unacceptable key (eg bad curve, RSA too short).\" },\n    { 0, NULL }\n};\n\nint mbedtls_x509_crt_verify_info( char *buf, size_t size, const char *prefix,\n                          uint32_t flags )\n{\n    int ret;\n    const struct x509_crt_verify_string *cur;\n    char *p = buf;\n    size_t n = size;\n\n    for( cur = x509_crt_verify_strings; cur->string != NULL ; cur++ )\n    {\n        if( ( flags & cur->code ) == 0 )\n            continue;\n\n        ret = mbedtls_snprintf( p, n, \"%s%s\\n\", prefix, cur->string );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n        flags ^= cur->code;\n    }\n\n    if( flags != 0 )\n    {\n        ret = mbedtls_snprintf( p, n, \"%sUnknown reason \"\n                                       \"(this should not happen)\\n\", prefix );\n        MBEDTLS_X509_SAFE_SNPRINTF;\n    }\n\n    return( (int) ( size - n ) );\n}\n\n#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)\nint mbedtls_x509_crt_check_key_usage( const mbedtls_x509_crt *crt,\n                                      unsigned int usage )\n{\n    unsigned int usage_must, usage_may;\n    unsigned int may_mask = MBEDTLS_X509_KU_ENCIPHER_ONLY\n                          | MBEDTLS_X509_KU_DECIPHER_ONLY;\n\n    if( ( crt->ext_types & MBEDTLS_X509_EXT_KEY_USAGE ) == 0 )\n        return( 0 );\n\n    usage_must = usage & ~may_mask;\n\n    if( ( ( crt->key_usage & ~may_mask ) & usage_must ) != usage_must )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    usage_may = usage & may_mask;\n\n    if( ( ( crt->key_usage & may_mask ) | usage_may ) != usage_may )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    return( 0 );\n}\n#endif\n\n#if defined(MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE)\nint mbedtls_x509_crt_check_extended_key_usage( const mbedtls_x509_crt *crt,\n                                       const char *usage_oid,\n                                       size_t usage_len )\n{\n    const mbedtls_x509_sequence *cur;\n\n    /* Extension is not mandatory, absent means no restriction */\n    if( ( crt->ext_types & MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE ) == 0 )\n        return( 0 );\n\n    /*\n     * Look for the requested usage (or wildcard ANY) in our list\n     */\n    for( cur = &crt->ext_key_usage; cur != NULL; cur = cur->next )\n    {\n        const mbedtls_x509_buf *cur_oid = &cur->buf;\n\n        if( cur_oid->len == usage_len &&\n            memcmp( cur_oid->p, usage_oid, usage_len ) == 0 )\n        {\n            return( 0 );\n        }\n\n        if( MBEDTLS_OID_CMP( MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE, cur_oid ) == 0 )\n            return( 0 );\n    }\n\n    return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n}\n#endif /* MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE */\n\n#if defined(MBEDTLS_X509_CRL_PARSE_C)\n/*\n * Return 1 if the certificate is revoked, or 0 otherwise.\n */\nint mbedtls_x509_crt_is_revoked( const mbedtls_x509_crt *crt, const mbedtls_x509_crl *crl )\n{\n    const mbedtls_x509_crl_entry *cur = &crl->entry;\n\n    while( cur != NULL && cur->serial.len != 0 )\n    {\n        if( crt->serial.len == cur->serial.len &&\n            memcmp( crt->serial.p, cur->serial.p, crt->serial.len ) == 0 )\n        {\n            if( mbedtls_x509_time_is_past( &cur->revocation_date ) )\n                return( 1 );\n        }\n\n        cur = cur->next;\n    }\n\n    return( 0 );\n}\n\n/*\n * Check that the given certificate is not revoked according to the CRL.\n * Skip validation is no CRL for the given CA is present.\n */\nstatic int x509_crt_verifycrl( mbedtls_x509_crt *crt, mbedtls_x509_crt *ca,\n                               mbedtls_x509_crl *crl_list,\n                               const mbedtls_x509_crt_profile *profile )\n{\n    int flags = 0;\n    unsigned char hash[MBEDTLS_MD_MAX_SIZE];\n    const mbedtls_md_info_t *md_info;\n\n    if( ca == NULL )\n        return( flags );\n\n    while( crl_list != NULL )\n    {\n        if( crl_list->version == 0 ||\n            crl_list->issuer_raw.len != ca->subject_raw.len ||\n            memcmp( crl_list->issuer_raw.p, ca->subject_raw.p,\n                    crl_list->issuer_raw.len ) != 0 )\n        {\n            crl_list = crl_list->next;\n            continue;\n        }\n\n        /*\n         * Check if the CA is configured to sign CRLs\n         */\n#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)\n        if( mbedtls_x509_crt_check_key_usage( ca, MBEDTLS_X509_KU_CRL_SIGN ) != 0 )\n        {\n            flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED;\n            break;\n        }\n#endif\n\n        /*\n         * Check if CRL is correctly signed by the trusted CA\n         */\n        if( x509_profile_check_md_alg( profile, crl_list->sig_md ) != 0 )\n            flags |= MBEDTLS_X509_BADCRL_BAD_MD;\n\n        if( x509_profile_check_pk_alg( profile, crl_list->sig_pk ) != 0 )\n            flags |= MBEDTLS_X509_BADCRL_BAD_PK;\n\n        md_info = mbedtls_md_info_from_type( crl_list->sig_md );\n        if( md_info == NULL )\n        {\n            /*\n             * Cannot check 'unknown' hash\n             */\n            flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED;\n            break;\n        }\n\n        mbedtls_md( md_info, crl_list->tbs.p, crl_list->tbs.len, hash );\n\n        if( x509_profile_check_key( profile, crl_list->sig_pk, &ca->pk ) != 0 )\n            flags |= MBEDTLS_X509_BADCERT_BAD_KEY;\n\n        if( mbedtls_pk_verify_ext( crl_list->sig_pk, crl_list->sig_opts, &ca->pk,\n                           crl_list->sig_md, hash, mbedtls_md_get_size( md_info ),\n                           crl_list->sig.p, crl_list->sig.len ) != 0 )\n        {\n            flags |= MBEDTLS_X509_BADCRL_NOT_TRUSTED;\n            break;\n        }\n\n        /*\n         * Check for validity of CRL (Do not drop out)\n         */\n        if( mbedtls_x509_time_is_past( &crl_list->next_update ) )\n            flags |= MBEDTLS_X509_BADCRL_EXPIRED;\n\n        if( mbedtls_x509_time_is_future( &crl_list->this_update ) )\n            flags |= MBEDTLS_X509_BADCRL_FUTURE;\n\n        /*\n         * Check if certificate is revoked\n         */\n        if( mbedtls_x509_crt_is_revoked( crt, crl_list ) )\n        {\n            flags |= MBEDTLS_X509_BADCERT_REVOKED;\n            break;\n        }\n\n        crl_list = crl_list->next;\n    }\n\n    return( flags );\n}\n#endif /* MBEDTLS_X509_CRL_PARSE_C */\n\n/*\n * Like memcmp, but case-insensitive and always returns -1 if different\n */\nstatic int x509_memcasecmp( const void *s1, const void *s2, size_t len )\n{\n    size_t i;\n    unsigned char diff;\n    const unsigned char *n1 = s1, *n2 = s2;\n\n    for( i = 0; i < len; i++ )\n    {\n        diff = n1[i] ^ n2[i];\n\n        if( diff == 0 )\n            continue;\n\n        if( diff == 32 &&\n            ( ( n1[i] >= 'a' && n1[i] <= 'z' ) ||\n              ( n1[i] >= 'A' && n1[i] <= 'Z' ) ) )\n        {\n            continue;\n        }\n\n        return( -1 );\n    }\n\n    return( 0 );\n}\n\n/*\n * Return 0 if name matches wildcard, -1 otherwise\n */\nstatic int x509_check_wildcard( const char *cn, mbedtls_x509_buf *name )\n{\n    size_t i;\n    size_t cn_idx = 0, cn_len = strlen( cn );\n\n    if( name->len < 3 || name->p[0] != '*' || name->p[1] != '.' )\n        return( 0 );\n\n    for( i = 0; i < cn_len; ++i )\n    {\n        if( cn[i] == '.' )\n        {\n            cn_idx = i;\n            break;\n        }\n    }\n\n    if( cn_idx == 0 )\n        return( -1 );\n\n    if( cn_len - cn_idx == name->len - 1 &&\n        x509_memcasecmp( name->p + 1, cn + cn_idx, name->len - 1 ) == 0 )\n    {\n        return( 0 );\n    }\n\n    return( -1 );\n}\n\n/*\n * Compare two X.509 strings, case-insensitive, and allowing for some encoding\n * variations (but not all).\n *\n * Return 0 if equal, -1 otherwise.\n */\nstatic int x509_string_cmp( const mbedtls_x509_buf *a, const mbedtls_x509_buf *b )\n{\n    if( a->tag == b->tag &&\n        a->len == b->len &&\n        memcmp( a->p, b->p, b->len ) == 0 )\n    {\n        return( 0 );\n    }\n\n    if( ( a->tag == MBEDTLS_ASN1_UTF8_STRING || a->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) &&\n        ( b->tag == MBEDTLS_ASN1_UTF8_STRING || b->tag == MBEDTLS_ASN1_PRINTABLE_STRING ) &&\n        a->len == b->len &&\n        x509_memcasecmp( a->p, b->p, b->len ) == 0 )\n    {\n        return( 0 );\n    }\n\n    return( -1 );\n}\n\n/*\n * Compare two X.509 Names (aka rdnSequence).\n *\n * See RFC 5280 section 7.1, though we don't implement the whole algorithm:\n * we sometimes return unequal when the full algorithm would return equal,\n * but never the other way. (In particular, we don't do Unicode normalisation\n * or space folding.)\n *\n * Return 0 if equal, -1 otherwise.\n */\nstatic int x509_name_cmp( const mbedtls_x509_name *a, const mbedtls_x509_name *b )\n{\n    /* Avoid recursion, it might not be optimised by the compiler */\n    while( a != NULL || b != NULL )\n    {\n        if( a == NULL || b == NULL )\n            return( -1 );\n\n        /* type */\n        if( a->oid.tag != b->oid.tag ||\n            a->oid.len != b->oid.len ||\n            memcmp( a->oid.p, b->oid.p, b->oid.len ) != 0 )\n        {\n            return( -1 );\n        }\n\n        /* value */\n        if( x509_string_cmp( &a->val, &b->val ) != 0 )\n            return( -1 );\n\n        /* structure of the list of sets */\n        if( a->next_merged != b->next_merged )\n            return( -1 );\n\n        a = a->next;\n        b = b->next;\n    }\n\n    /* a == NULL == b */\n    return( 0 );\n}\n\n/*\n * Check if 'parent' is a suitable parent (signing CA) for 'child'.\n * Return 0 if yes, -1 if not.\n *\n * top means parent is a locally-trusted certificate\n * bottom means child is the end entity cert\n */\nstatic int x509_crt_check_parent( const mbedtls_x509_crt *child,\n                                  const mbedtls_x509_crt *parent,\n                                  int top, int bottom )\n{\n    int need_ca_bit;\n\n    /* Parent must be the issuer */\n    if( x509_name_cmp( &child->issuer, &parent->subject ) != 0 )\n        return( -1 );\n\n    /* Parent must have the basicConstraints CA bit set as a general rule */\n    need_ca_bit = 1;\n\n    /* Exception: v1/v2 certificates that are locally trusted. */\n    if( top && parent->version < 3 )\n        need_ca_bit = 0;\n\n    /* Exception: self-signed end-entity certs that are locally trusted. */\n    if( top && bottom &&\n        child->raw.len == parent->raw.len &&\n        memcmp( child->raw.p, parent->raw.p, child->raw.len ) == 0 )\n    {\n        need_ca_bit = 0;\n    }\n\n    if( need_ca_bit && ! parent->ca_istrue )\n        return( -1 );\n\n#if defined(MBEDTLS_X509_CHECK_KEY_USAGE)\n    if( need_ca_bit &&\n        mbedtls_x509_crt_check_key_usage( parent, MBEDTLS_X509_KU_KEY_CERT_SIGN ) != 0 )\n    {\n        return( -1 );\n    }\n#endif\n\n    return( 0 );\n}\n\nstatic int x509_crt_verify_top(\n                mbedtls_x509_crt *child, mbedtls_x509_crt *trust_ca,\n                mbedtls_x509_crl *ca_crl,\n                const mbedtls_x509_crt_profile *profile,\n                int path_cnt, int self_cnt, uint32_t *flags,\n                int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),\n                void *p_vrfy )\n{\n    int ret;\n    uint32_t ca_flags = 0;\n    int check_path_cnt;\n    unsigned char hash[MBEDTLS_MD_MAX_SIZE];\n    const mbedtls_md_info_t *md_info;\n    mbedtls_x509_crt *future_past_ca = NULL;\n\n    if( mbedtls_x509_time_is_past( &child->valid_to ) )\n        *flags |= MBEDTLS_X509_BADCERT_EXPIRED;\n\n    if( mbedtls_x509_time_is_future( &child->valid_from ) )\n        *flags |= MBEDTLS_X509_BADCERT_FUTURE;\n\n    if( x509_profile_check_md_alg( profile, child->sig_md ) != 0 )\n        *flags |= MBEDTLS_X509_BADCERT_BAD_MD;\n\n    if( x509_profile_check_pk_alg( profile, child->sig_pk ) != 0 )\n        *flags |= MBEDTLS_X509_BADCERT_BAD_PK;\n\n    /*\n     * Child is the top of the chain. Check against the trust_ca list.\n     */\n    *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED;\n\n    md_info = mbedtls_md_info_from_type( child->sig_md );\n    if( md_info == NULL )\n    {\n        /*\n         * Cannot check 'unknown', no need to try any CA\n         */\n        trust_ca = NULL;\n    }\n    else\n        mbedtls_md( md_info, child->tbs.p, child->tbs.len, hash );\n\n    for( /* trust_ca */ ; trust_ca != NULL; trust_ca = trust_ca->next )\n    {\n        if( x509_crt_check_parent( child, trust_ca, 1, path_cnt == 0 ) != 0 )\n            continue;\n\n        check_path_cnt = path_cnt + 1;\n\n        /*\n         * Reduce check_path_cnt to check against if top of the chain is\n         * the same as the trusted CA\n         */\n        if( child->subject_raw.len == trust_ca->subject_raw.len &&\n            memcmp( child->subject_raw.p, trust_ca->subject_raw.p,\n                            child->issuer_raw.len ) == 0 )\n        {\n            check_path_cnt--;\n        }\n\n        /* Self signed certificates do not count towards the limit */\n        if( trust_ca->max_pathlen > 0 &&\n            trust_ca->max_pathlen < check_path_cnt - self_cnt )\n        {\n            continue;\n        }\n\n        if( mbedtls_pk_verify_ext( child->sig_pk, child->sig_opts, &trust_ca->pk,\n                           child->sig_md, hash, mbedtls_md_get_size( md_info ),\n                           child->sig.p, child->sig.len ) != 0 )\n        {\n            continue;\n        }\n\n        if( mbedtls_x509_time_is_past( &trust_ca->valid_to ) ||\n            mbedtls_x509_time_is_future( &trust_ca->valid_from ) )\n        {\n            if ( future_past_ca == NULL )\n                future_past_ca = trust_ca;\n\n            continue;\n        }\n\n        break;\n    }\n\n    if( trust_ca != NULL || ( trust_ca = future_past_ca ) != NULL )\n    {\n        /*\n         * Top of chain is signed by a trusted CA\n         */\n        *flags &= ~MBEDTLS_X509_BADCERT_NOT_TRUSTED;\n\n        if( x509_profile_check_key( profile, child->sig_pk, &trust_ca->pk ) != 0 )\n            *flags |= MBEDTLS_X509_BADCERT_BAD_KEY;\n    }\n\n    /*\n     * If top of chain is not the same as the trusted CA send a verify request\n     * to the callback for any issues with validity and CRL presence for the\n     * trusted CA certificate.\n     */\n    if( trust_ca != NULL &&\n        ( child->subject_raw.len != trust_ca->subject_raw.len ||\n          memcmp( child->subject_raw.p, trust_ca->subject_raw.p,\n                            child->issuer_raw.len ) != 0 ) )\n    {\n#if defined(MBEDTLS_X509_CRL_PARSE_C)\n        /* Check trusted CA's CRL for the chain's top crt */\n        *flags |= x509_crt_verifycrl( child, trust_ca, ca_crl, profile );\n#else\n        ((void) ca_crl);\n#endif\n\n        if( mbedtls_x509_time_is_past( &trust_ca->valid_to ) )\n            ca_flags |= MBEDTLS_X509_BADCERT_EXPIRED;\n\n        if( mbedtls_x509_time_is_future( &trust_ca->valid_from ) )\n            ca_flags |= MBEDTLS_X509_BADCERT_FUTURE;\n\n        if( NULL != f_vrfy )\n        {\n            if( ( ret = f_vrfy( p_vrfy, trust_ca, path_cnt + 1,\n                                &ca_flags ) ) != 0 )\n            {\n                return( ret );\n            }\n        }\n    }\n\n    /* Call callback on top cert */\n    if( NULL != f_vrfy )\n    {\n        if( ( ret = f_vrfy( p_vrfy, child, path_cnt, flags ) ) != 0 )\n            return( ret );\n    }\n\n    *flags |= ca_flags;\n\n    return( 0 );\n}\n\nstatic int x509_crt_verify_child(\n                mbedtls_x509_crt *child, mbedtls_x509_crt *parent,\n                mbedtls_x509_crt *trust_ca, mbedtls_x509_crl *ca_crl,\n                const mbedtls_x509_crt_profile *profile,\n                int path_cnt, int self_cnt, uint32_t *flags,\n                int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),\n                void *p_vrfy )\n{\n    int ret;\n    uint32_t parent_flags = 0;\n    unsigned char hash[MBEDTLS_MD_MAX_SIZE];\n    mbedtls_x509_crt *grandparent;\n    const mbedtls_md_info_t *md_info;\n\n    /* Counting intermediate self signed certificates */\n    if( ( path_cnt != 0 ) && x509_name_cmp( &child->issuer, &child->subject ) == 0 )\n        self_cnt++;\n\n    /* path_cnt is 0 for the first intermediate CA */\n    if( 1 + path_cnt > MBEDTLS_X509_MAX_INTERMEDIATE_CA )\n    {\n        /* return immediately as the goal is to avoid unbounded recursion */\n        return( MBEDTLS_ERR_X509_FATAL_ERROR );\n    }\n\n    if( mbedtls_x509_time_is_past( &child->valid_to ) )\n        *flags |= MBEDTLS_X509_BADCERT_EXPIRED;\n\n    if( mbedtls_x509_time_is_future( &child->valid_from ) )\n        *flags |= MBEDTLS_X509_BADCERT_FUTURE;\n\n    if( x509_profile_check_md_alg( profile, child->sig_md ) != 0 )\n        *flags |= MBEDTLS_X509_BADCERT_BAD_MD;\n\n    if( x509_profile_check_pk_alg( profile, child->sig_pk ) != 0 )\n        *flags |= MBEDTLS_X509_BADCERT_BAD_PK;\n\n    md_info = mbedtls_md_info_from_type( child->sig_md );\n    if( md_info == NULL )\n    {\n        /*\n         * Cannot check 'unknown' hash\n         */\n        *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED;\n    }\n    else\n    {\n        mbedtls_md( md_info, child->tbs.p, child->tbs.len, hash );\n\n        if( x509_profile_check_key( profile, child->sig_pk, &parent->pk ) != 0 )\n            *flags |= MBEDTLS_X509_BADCERT_BAD_KEY;\n\n        if( mbedtls_pk_verify_ext( child->sig_pk, child->sig_opts, &parent->pk,\n                           child->sig_md, hash, mbedtls_md_get_size( md_info ),\n                           child->sig.p, child->sig.len ) != 0 )\n        {\n            *flags |= MBEDTLS_X509_BADCERT_NOT_TRUSTED;\n        }\n    }\n\n#if defined(MBEDTLS_X509_CRL_PARSE_C)\n    /* Check trusted CA's CRL for the given crt */\n    *flags |= x509_crt_verifycrl(child, parent, ca_crl, profile );\n#endif\n\n    /* Look for a grandparent in trusted CAs */\n    for( grandparent = trust_ca;\n         grandparent != NULL;\n         grandparent = grandparent->next )\n    {\n        if( x509_crt_check_parent( parent, grandparent,\n                                   0, path_cnt == 0 ) == 0 )\n            break;\n    }\n\n    if( grandparent != NULL )\n    {\n        ret = x509_crt_verify_top( parent, grandparent, ca_crl, profile,\n                                path_cnt + 1, self_cnt, &parent_flags, f_vrfy, p_vrfy );\n        if( ret != 0 )\n            return( ret );\n    }\n    else\n    {\n        /* Look for a grandparent upwards the chain */\n        for( grandparent = parent->next;\n             grandparent != NULL;\n             grandparent = grandparent->next )\n        {\n            /* +2 because the current step is not yet accounted for\n             * and because max_pathlen is one higher than it should be.\n             * Also self signed certificates do not count to the limit. */\n            if( grandparent->max_pathlen > 0 &&\n                grandparent->max_pathlen < 2 + path_cnt - self_cnt )\n            {\n                continue;\n            }\n\n            if( x509_crt_check_parent( parent, grandparent,\n                                       0, path_cnt == 0 ) == 0 )\n                break;\n        }\n\n        /* Is our parent part of the chain or at the top? */\n        if( grandparent != NULL )\n        {\n            ret = x509_crt_verify_child( parent, grandparent, trust_ca, ca_crl,\n                                         profile, path_cnt + 1, self_cnt, &parent_flags,\n                                         f_vrfy, p_vrfy );\n            if( ret != 0 )\n                return( ret );\n        }\n        else\n        {\n            ret = x509_crt_verify_top( parent, trust_ca, ca_crl, profile,\n                                       path_cnt + 1, self_cnt, &parent_flags,\n                                       f_vrfy, p_vrfy );\n            if( ret != 0 )\n                return( ret );\n        }\n    }\n\n    /* child is verified to be a child of the parent, call verify callback */\n    if( NULL != f_vrfy )\n        if( ( ret = f_vrfy( p_vrfy, child, path_cnt, flags ) ) != 0 )\n            return( ret );\n\n    *flags |= parent_flags;\n\n    return( 0 );\n}\n\n/*\n * Verify the certificate validity\n */\nint mbedtls_x509_crt_verify( mbedtls_x509_crt *crt,\n                     mbedtls_x509_crt *trust_ca,\n                     mbedtls_x509_crl *ca_crl,\n                     const char *cn, uint32_t *flags,\n                     int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),\n                     void *p_vrfy )\n{\n    return( mbedtls_x509_crt_verify_with_profile( crt, trust_ca, ca_crl,\n                &mbedtls_x509_crt_profile_default, cn, flags, f_vrfy, p_vrfy ) );\n}\n\n\n/*\n * Verify the certificate validity, with profile\n */\nint mbedtls_x509_crt_verify_with_profile( mbedtls_x509_crt *crt,\n                     mbedtls_x509_crt *trust_ca,\n                     mbedtls_x509_crl *ca_crl,\n                     const mbedtls_x509_crt_profile *profile,\n                     const char *cn, uint32_t *flags,\n                     int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),\n                     void *p_vrfy )\n{\n    size_t cn_len;\n    int ret;\n    int pathlen = 0, selfsigned = 0;\n    mbedtls_x509_crt *parent;\n    mbedtls_x509_name *name;\n    mbedtls_x509_sequence *cur = NULL;\n    mbedtls_pk_type_t pk_type;\n\n    *flags = 0;\n\n    if( profile == NULL )\n    {\n        ret = MBEDTLS_ERR_X509_BAD_INPUT_DATA;\n        goto exit;\n    }\n\n    if( cn != NULL )\n    {\n        name = &crt->subject;\n        cn_len = strlen( cn );\n\n        if( crt->ext_types & MBEDTLS_X509_EXT_SUBJECT_ALT_NAME )\n        {\n            cur = &crt->subject_alt_names;\n\n            while( cur != NULL )\n            {\n                if( cur->buf.len == cn_len &&\n                    x509_memcasecmp( cn, cur->buf.p, cn_len ) == 0 )\n                    break;\n\n                if( cur->buf.len > 2 &&\n                    memcmp( cur->buf.p, \"*.\", 2 ) == 0 &&\n                    x509_check_wildcard( cn, &cur->buf ) == 0 )\n                {\n                    break;\n                }\n\n                cur = cur->next;\n            }\n\n            if( cur == NULL )\n                *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH;\n        }\n        else\n        {\n            while( name != NULL )\n            {\n                if( MBEDTLS_OID_CMP( MBEDTLS_OID_AT_CN, &name->oid ) == 0 )\n                {\n                    if( name->val.len == cn_len &&\n                        x509_memcasecmp( name->val.p, cn, cn_len ) == 0 )\n                        break;\n\n                    if( name->val.len > 2 &&\n                        memcmp( name->val.p, \"*.\", 2 ) == 0 &&\n                        x509_check_wildcard( cn, &name->val ) == 0 )\n                        break;\n                }\n\n                name = name->next;\n            }\n\n            if( name == NULL )\n                *flags |= MBEDTLS_X509_BADCERT_CN_MISMATCH;\n        }\n    }\n\n    /* Check the type and size of the key */\n    pk_type = mbedtls_pk_get_type( &crt->pk );\n\n    if( x509_profile_check_pk_alg( profile, pk_type ) != 0 )\n        *flags |= MBEDTLS_X509_BADCERT_BAD_PK;\n\n    if( x509_profile_check_key( profile, pk_type, &crt->pk ) != 0 )\n        *flags |= MBEDTLS_X509_BADCERT_BAD_KEY;\n\n    /* Look for a parent in trusted CAs */\n    for( parent = trust_ca; parent != NULL; parent = parent->next )\n    {\n        if( x509_crt_check_parent( crt, parent, 0, pathlen == 0 ) == 0 )\n            break;\n    }\n\n    if( parent != NULL )\n    {\n        ret = x509_crt_verify_top( crt, parent, ca_crl, profile,\n                                   pathlen, selfsigned, flags, f_vrfy, p_vrfy );\n        if( ret != 0 )\n            goto exit;\n    }\n    else\n    {\n        /* Look for a parent upwards the chain */\n        for( parent = crt->next; parent != NULL; parent = parent->next )\n            if( x509_crt_check_parent( crt, parent, 0, pathlen == 0 ) == 0 )\n                break;\n\n        /* Are we part of the chain or at the top? */\n        if( parent != NULL )\n        {\n            ret = x509_crt_verify_child( crt, parent, trust_ca, ca_crl, profile,\n                                         pathlen, selfsigned, flags, f_vrfy, p_vrfy );\n            if( ret != 0 )\n                goto exit;\n        }\n        else\n        {\n            ret = x509_crt_verify_top( crt, trust_ca, ca_crl, profile,\n                                       pathlen, selfsigned, flags, f_vrfy, p_vrfy );\n            if( ret != 0 )\n                goto exit;\n        }\n    }\n\nexit:\n    /* prevent misuse of the vrfy callback - VERIFY_FAILED would be ignored by\n     * the SSL module for authmode optional, but non-zero return from the\n     * callback means a fatal error so it shouldn't be ignored */\n    if( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED )\n        ret = MBEDTLS_ERR_X509_FATAL_ERROR;\n\n    if( ret != 0 )\n    {\n        *flags = (uint32_t) -1;\n        return( ret );\n    }\n\n    if( *flags != 0 )\n        return( MBEDTLS_ERR_X509_CERT_VERIFY_FAILED );\n\n    return( 0 );\n}\n\n/*\n * Initialize a certificate chain\n */\nvoid mbedtls_x509_crt_init( mbedtls_x509_crt *crt )\n{\n    memset( crt, 0, sizeof(mbedtls_x509_crt) );\n}\n\n/*\n * Unallocate all certificate data\n */\nvoid mbedtls_x509_crt_free( mbedtls_x509_crt *crt )\n{\n    mbedtls_x509_crt *cert_cur = crt;\n    mbedtls_x509_crt *cert_prv;\n    mbedtls_x509_name *name_cur;\n    mbedtls_x509_name *name_prv;\n    mbedtls_x509_sequence *seq_cur;\n    mbedtls_x509_sequence *seq_prv;\n\n    if( crt == NULL )\n        return;\n\n    do\n    {\n        mbedtls_pk_free( &cert_cur->pk );\n\n#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)\n        mbedtls_free( cert_cur->sig_opts );\n#endif\n\n        name_cur = cert_cur->issuer.next;\n        while( name_cur != NULL )\n        {\n            name_prv = name_cur;\n            name_cur = name_cur->next;\n            mbedtls_zeroize( name_prv, sizeof( mbedtls_x509_name ) );\n            mbedtls_free( name_prv );\n        }\n\n        name_cur = cert_cur->subject.next;\n        while( name_cur != NULL )\n        {\n            name_prv = name_cur;\n            name_cur = name_cur->next;\n            mbedtls_zeroize( name_prv, sizeof( mbedtls_x509_name ) );\n            mbedtls_free( name_prv );\n        }\n\n        seq_cur = cert_cur->ext_key_usage.next;\n        while( seq_cur != NULL )\n        {\n            seq_prv = seq_cur;\n            seq_cur = seq_cur->next;\n            mbedtls_zeroize( seq_prv, sizeof( mbedtls_x509_sequence ) );\n            mbedtls_free( seq_prv );\n        }\n\n        seq_cur = cert_cur->subject_alt_names.next;\n        while( seq_cur != NULL )\n        {\n            seq_prv = seq_cur;\n            seq_cur = seq_cur->next;\n            mbedtls_zeroize( seq_prv, sizeof( mbedtls_x509_sequence ) );\n            mbedtls_free( seq_prv );\n        }\n\n        if( cert_cur->raw.p != NULL )\n        {\n            mbedtls_zeroize( cert_cur->raw.p, cert_cur->raw.len );\n            mbedtls_free( cert_cur->raw.p );\n        }\n\n        cert_cur = cert_cur->next;\n    }\n    while( cert_cur != NULL );\n\n    cert_cur = crt;\n    do\n    {\n        cert_prv = cert_cur;\n        cert_cur = cert_cur->next;\n\n        mbedtls_zeroize( cert_prv, sizeof( mbedtls_x509_crt ) );\n        if( cert_prv != crt )\n            mbedtls_free( cert_prv );\n    }\n    while( cert_cur != NULL );\n}\n\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/x509_csr.c",
    "content": "/*\n *  X.509 Certificate Signing Request (CSR) parsing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n *  The ITU-T X.509 standard defines a certificate format for PKI.\n *\n *  http://www.ietf.org/rfc/rfc5280.txt (Certificates and CRLs)\n *  http://www.ietf.org/rfc/rfc3279.txt (Alg IDs for CRLs)\n *  http://www.ietf.org/rfc/rfc2986.txt (CSRs, aka PKCS#10)\n *\n *  http://www.itu.int/ITU-T/studygroups/com17/languages/X.680-0207.pdf\n *  http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_X509_CSR_PARSE_C)\n\n#include \"mbedtls/x509_csr.h\"\n#include \"mbedtls/oid.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n#include \"mbedtls/pem.h\"\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#include <stdio.h>\n#define mbedtls_free       free\n#define mbedtls_calloc    calloc\n#define mbedtls_snprintf   snprintf\n#endif\n\n#if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32)\n#include <stdio.h>\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n *  Version  ::=  INTEGER  {  v1(0)  }\n */\nstatic int x509_csr_get_version( unsigned char **p,\n                             const unsigned char *end,\n                             int *ver )\n{\n    int ret;\n\n    if( ( ret = mbedtls_asn1_get_int( p, end, ver ) ) != 0 )\n    {\n        if( ret == MBEDTLS_ERR_ASN1_UNEXPECTED_TAG )\n        {\n            *ver = 0;\n            return( 0 );\n        }\n\n        return( MBEDTLS_ERR_X509_INVALID_VERSION + ret );\n    }\n\n    return( 0 );\n}\n\n/*\n * Parse a CSR in DER format\n */\nint mbedtls_x509_csr_parse_der( mbedtls_x509_csr *csr,\n                        const unsigned char *buf, size_t buflen )\n{\n    int ret;\n    size_t len;\n    unsigned char *p, *end;\n    mbedtls_x509_buf sig_params;\n\n    memset( &sig_params, 0, sizeof( mbedtls_x509_buf ) );\n\n    /*\n     * Check for valid input\n     */\n    if( csr == NULL || buf == NULL || buflen == 0 )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    mbedtls_x509_csr_init( csr );\n\n    /*\n     * first copy the raw DER data\n     */\n    p = mbedtls_calloc( 1, len = buflen );\n\n    if( p == NULL )\n        return( MBEDTLS_ERR_X509_ALLOC_FAILED );\n\n    memcpy( p, buf, buflen );\n\n    csr->raw.p = p;\n    csr->raw.len = len;\n    end = p + len;\n\n    /*\n     *  CertificationRequest ::= SEQUENCE {\n     *       certificationRequestInfo CertificationRequestInfo,\n     *       signatureAlgorithm AlgorithmIdentifier,\n     *       signature          BIT STRING\n     *  }\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT );\n    }\n\n    if( len != (size_t) ( end - p ) )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n\n    /*\n     *  CertificationRequestInfo ::= SEQUENCE {\n     */\n    csr->cri.p = p;\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );\n    }\n\n    end = p + len;\n    csr->cri.len = end - csr->cri.p;\n\n    /*\n     *  Version  ::=  INTEGER {  v1(0) }\n     */\n    if( ( ret = x509_csr_get_version( &p, end, &csr->version ) ) != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( ret );\n    }\n\n    if( csr->version != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( MBEDTLS_ERR_X509_UNKNOWN_VERSION );\n    }\n\n    csr->version++;\n\n    /*\n     *  subject               Name\n     */\n    csr->subject_raw.p = p;\n\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE ) ) != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );\n    }\n\n    if( ( ret = mbedtls_x509_get_name( &p, p + len, &csr->subject ) ) != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( ret );\n    }\n\n    csr->subject_raw.len = p - csr->subject_raw.p;\n\n    /*\n     *  subjectPKInfo SubjectPublicKeyInfo\n     */\n    if( ( ret = mbedtls_pk_parse_subpubkey( &p, end, &csr->pk ) ) != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( ret );\n    }\n\n    /*\n     *  attributes    [0] Attributes\n     *\n     *  The list of possible attributes is open-ended, though RFC 2985\n     *  (PKCS#9) defines a few in section 5.4. We currently don't support any,\n     *  so we just ignore them. This is a safe thing to do as the worst thing\n     *  that could happen is that we issue a certificate that does not match\n     *  the requester's expectations - this cannot cause a violation of our\n     *  signature policies.\n     */\n    if( ( ret = mbedtls_asn1_get_tag( &p, end, &len,\n            MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_CONTEXT_SPECIFIC ) ) != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT + ret );\n    }\n\n    p += len;\n\n    end = csr->raw.p + csr->raw.len;\n\n    /*\n     *  signatureAlgorithm   AlgorithmIdentifier,\n     *  signature            BIT STRING\n     */\n    if( ( ret = mbedtls_x509_get_alg( &p, end, &csr->sig_oid, &sig_params ) ) != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( ret );\n    }\n\n    if( ( ret = mbedtls_x509_get_sig_alg( &csr->sig_oid, &sig_params,\n                                  &csr->sig_md, &csr->sig_pk,\n                                  &csr->sig_opts ) ) != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG );\n    }\n\n    if( ( ret = mbedtls_x509_get_sig( &p, end, &csr->sig ) ) != 0 )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( ret );\n    }\n\n    if( p != end )\n    {\n        mbedtls_x509_csr_free( csr );\n        return( MBEDTLS_ERR_X509_INVALID_FORMAT +\n                MBEDTLS_ERR_ASN1_LENGTH_MISMATCH );\n    }\n\n    return( 0 );\n}\n\n/*\n * Parse a CSR, allowing for PEM or raw DER encoding\n */\nint mbedtls_x509_csr_parse( mbedtls_x509_csr *csr, const unsigned char *buf, size_t buflen )\n{\n#if defined(MBEDTLS_PEM_PARSE_C)\n    int ret;\n    size_t use_len;\n    mbedtls_pem_context pem;\n#endif\n\n    /*\n     * Check for valid input\n     */\n    if( csr == NULL || buf == NULL || buflen == 0 )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n#if defined(MBEDTLS_PEM_PARSE_C)\n    mbedtls_pem_init( &pem );\n\n    /* Avoid calling mbedtls_pem_read_buffer() on non-null-terminated string */\n    if( buf[buflen - 1] != '\\0' )\n        ret = MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT;\n    else\n        ret = mbedtls_pem_read_buffer( &pem,\n                               \"-----BEGIN CERTIFICATE REQUEST-----\",\n                               \"-----END CERTIFICATE REQUEST-----\",\n                               buf, NULL, 0, &use_len );\n\n    if( ret == 0 )\n    {\n        /*\n         * Was PEM encoded, parse the result\n         */\n        if( ( ret = mbedtls_x509_csr_parse_der( csr, pem.buf, pem.buflen ) ) != 0 )\n            return( ret );\n\n        mbedtls_pem_free( &pem );\n        return( 0 );\n    }\n    else if( ret != MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT )\n    {\n        mbedtls_pem_free( &pem );\n        return( ret );\n    }\n    else\n#endif /* MBEDTLS_PEM_PARSE_C */\n    return( mbedtls_x509_csr_parse_der( csr, buf, buflen ) );\n}\n\n#if defined(MBEDTLS_FS_IO)\n/*\n * Load a CSR into the structure\n */\nint mbedtls_x509_csr_parse_file( mbedtls_x509_csr *csr, const char *path )\n{\n    int ret;\n    size_t n;\n    unsigned char *buf;\n\n    if( ( ret = mbedtls_pk_load_file( path, &buf, &n ) ) != 0 )\n        return( ret );\n\n    ret = mbedtls_x509_csr_parse( csr, buf, n );\n\n    mbedtls_zeroize( buf, n );\n    mbedtls_free( buf );\n\n    return( ret );\n}\n#endif /* MBEDTLS_FS_IO */\n\n#define BEFORE_COLON    14\n#define BC              \"14\"\n/*\n * Return an informational string about the CSR.\n */\nint mbedtls_x509_csr_info( char *buf, size_t size, const char *prefix,\n                   const mbedtls_x509_csr *csr )\n{\n    int ret;\n    size_t n;\n    char *p;\n    char key_size_str[BEFORE_COLON];\n\n    p = buf;\n    n = size;\n\n    ret = mbedtls_snprintf( p, n, \"%sCSR version   : %d\",\n                               prefix, csr->version );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%ssubject name  : \", prefix );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n    ret = mbedtls_x509_dn_gets( p, n, &csr->subject );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_snprintf( p, n, \"\\n%ssigned using  : \", prefix );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    ret = mbedtls_x509_sig_alg_gets( p, n, &csr->sig_oid, csr->sig_pk, csr->sig_md,\n                             csr->sig_opts );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    if( ( ret = mbedtls_x509_key_size_helper( key_size_str, BEFORE_COLON,\n                                      mbedtls_pk_get_name( &csr->pk ) ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    ret = mbedtls_snprintf( p, n, \"\\n%s%-\" BC \"s: %d bits\\n\", prefix, key_size_str,\n                          (int) mbedtls_pk_get_bitlen( &csr->pk ) );\n    MBEDTLS_X509_SAFE_SNPRINTF;\n\n    return( (int) ( size - n ) );\n}\n\n/*\n * Initialize a CSR\n */\nvoid mbedtls_x509_csr_init( mbedtls_x509_csr *csr )\n{\n    memset( csr, 0, sizeof(mbedtls_x509_csr) );\n}\n\n/*\n * Unallocate all CSR data\n */\nvoid mbedtls_x509_csr_free( mbedtls_x509_csr *csr )\n{\n    mbedtls_x509_name *name_cur;\n    mbedtls_x509_name *name_prv;\n\n    if( csr == NULL )\n        return;\n\n    mbedtls_pk_free( &csr->pk );\n\n#if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)\n    mbedtls_free( csr->sig_opts );\n#endif\n\n    name_cur = csr->subject.next;\n    while( name_cur != NULL )\n    {\n        name_prv = name_cur;\n        name_cur = name_cur->next;\n        mbedtls_zeroize( name_prv, sizeof( mbedtls_x509_name ) );\n        mbedtls_free( name_prv );\n    }\n\n    if( csr->raw.p != NULL )\n    {\n        mbedtls_zeroize( csr->raw.p, csr->raw.len );\n        mbedtls_free( csr->raw.p );\n    }\n\n    mbedtls_zeroize( csr, sizeof( mbedtls_x509_csr ) );\n}\n\n#endif /* MBEDTLS_X509_CSR_PARSE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/x509write_crt.c",
    "content": "/*\n *  X.509 certificate writing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * References:\n * - certificates: RFC 5280, updated by RFC 6818\n * - CSRs: PKCS#10 v1.7 aka RFC 2986\n * - attributes: PKCS#9 v2.0 aka RFC 2985\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_X509_CRT_WRITE_C)\n\n#include \"mbedtls/x509_crt.h\"\n#include \"mbedtls/oid.h\"\n#include \"mbedtls/asn1write.h\"\n#include \"mbedtls/sha1.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n#include \"mbedtls/pem.h\"\n#endif /* MBEDTLS_PEM_WRITE_C */\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\nvoid mbedtls_x509write_crt_init( mbedtls_x509write_cert *ctx )\n{\n    memset( ctx, 0, sizeof(mbedtls_x509write_cert) );\n\n    mbedtls_mpi_init( &ctx->serial );\n    ctx->version = MBEDTLS_X509_CRT_VERSION_3;\n}\n\nvoid mbedtls_x509write_crt_free( mbedtls_x509write_cert *ctx )\n{\n    mbedtls_mpi_free( &ctx->serial );\n\n    mbedtls_asn1_free_named_data_list( &ctx->subject );\n    mbedtls_asn1_free_named_data_list( &ctx->issuer );\n    mbedtls_asn1_free_named_data_list( &ctx->extensions );\n\n    mbedtls_zeroize( ctx, sizeof(mbedtls_x509write_cert) );\n}\n\nvoid mbedtls_x509write_crt_set_version( mbedtls_x509write_cert *ctx, int version )\n{\n    ctx->version = version;\n}\n\nvoid mbedtls_x509write_crt_set_md_alg( mbedtls_x509write_cert *ctx, mbedtls_md_type_t md_alg )\n{\n    ctx->md_alg = md_alg;\n}\n\nvoid mbedtls_x509write_crt_set_subject_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key )\n{\n    ctx->subject_key = key;\n}\n\nvoid mbedtls_x509write_crt_set_issuer_key( mbedtls_x509write_cert *ctx, mbedtls_pk_context *key )\n{\n    ctx->issuer_key = key;\n}\n\nint mbedtls_x509write_crt_set_subject_name( mbedtls_x509write_cert *ctx,\n                                    const char *subject_name )\n{\n    return mbedtls_x509_string_to_names( &ctx->subject, subject_name );\n}\n\nint mbedtls_x509write_crt_set_issuer_name( mbedtls_x509write_cert *ctx,\n                                   const char *issuer_name )\n{\n    return mbedtls_x509_string_to_names( &ctx->issuer, issuer_name );\n}\n\nint mbedtls_x509write_crt_set_serial( mbedtls_x509write_cert *ctx, const mbedtls_mpi *serial )\n{\n    int ret;\n\n    if( ( ret = mbedtls_mpi_copy( &ctx->serial, serial ) ) != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\nint mbedtls_x509write_crt_set_validity( mbedtls_x509write_cert *ctx, const char *not_before,\n                                const char *not_after )\n{\n    if( strlen( not_before ) != MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1 ||\n        strlen( not_after )  != MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1 )\n    {\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n    }\n    strncpy( ctx->not_before, not_before, MBEDTLS_X509_RFC5280_UTC_TIME_LEN );\n    strncpy( ctx->not_after , not_after , MBEDTLS_X509_RFC5280_UTC_TIME_LEN );\n    ctx->not_before[MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1] = 'Z';\n    ctx->not_after[MBEDTLS_X509_RFC5280_UTC_TIME_LEN - 1] = 'Z';\n\n    return( 0 );\n}\n\nint mbedtls_x509write_crt_set_extension( mbedtls_x509write_cert *ctx,\n                                 const char *oid, size_t oid_len,\n                                 int critical,\n                                 const unsigned char *val, size_t val_len )\n{\n    return mbedtls_x509_set_extension( &ctx->extensions, oid, oid_len,\n                               critical, val, val_len );\n}\n\nint mbedtls_x509write_crt_set_basic_constraints( mbedtls_x509write_cert *ctx,\n                                         int is_ca, int max_pathlen )\n{\n    int ret;\n    unsigned char buf[9];\n    unsigned char *c = buf + sizeof(buf);\n    size_t len = 0;\n\n    memset( buf, 0, sizeof(buf) );\n\n    if( is_ca && max_pathlen > 127 )\n        return( MBEDTLS_ERR_X509_BAD_INPUT_DATA );\n\n    if( is_ca )\n    {\n        if( max_pathlen >= 0 )\n        {\n            MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, buf, max_pathlen ) );\n        }\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_bool( &c, buf, 1 ) );\n    }\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                MBEDTLS_ASN1_SEQUENCE ) );\n\n    return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_BASIC_CONSTRAINTS,\n                                        MBEDTLS_OID_SIZE( MBEDTLS_OID_BASIC_CONSTRAINTS ),\n                                        0, buf + sizeof(buf) - len, len );\n}\n\n#if defined(MBEDTLS_SHA1_C)\nint mbedtls_x509write_crt_set_subject_key_identifier( mbedtls_x509write_cert *ctx )\n{\n    int ret;\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE * 2 + 20]; /* tag, length + 2xMPI */\n    unsigned char *c = buf + sizeof(buf);\n    size_t len = 0;\n\n    memset( buf, 0, sizeof(buf) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, ctx->subject_key ) );\n\n    mbedtls_sha1( buf + sizeof(buf) - len, len, buf + sizeof(buf) - 20 );\n    c = buf + sizeof(buf) - 20;\n    len = 20;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_OCTET_STRING ) );\n\n    return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER,\n                                        MBEDTLS_OID_SIZE( MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER ),\n                                        0, buf + sizeof(buf) - len, len );\n}\n\nint mbedtls_x509write_crt_set_authority_key_identifier( mbedtls_x509write_cert *ctx )\n{\n    int ret;\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE * 2 + 20]; /* tag, length + 2xMPI */\n    unsigned char *c = buf + sizeof(buf);\n    size_t len = 0;\n\n    memset( buf, 0, sizeof(buf) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_pk_write_pubkey( &c, buf, ctx->issuer_key ) );\n\n    mbedtls_sha1( buf + sizeof(buf) - len, len, buf + sizeof(buf) - 20 );\n    c = buf + sizeof(buf) - 20;\n    len = 20;\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC | 0 ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                MBEDTLS_ASN1_SEQUENCE ) );\n\n    return mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER,\n                                   MBEDTLS_OID_SIZE( MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER ),\n                                   0, buf + sizeof(buf) - len, len );\n}\n#endif /* MBEDTLS_SHA1_C */\n\nint mbedtls_x509write_crt_set_key_usage( mbedtls_x509write_cert *ctx,\n                                         unsigned int key_usage )\n{\n    unsigned char buf[4], ku;\n    unsigned char *c;\n    int ret;\n\n    /* We currently only support 7 bits, from 0x80 to 0x02 */\n    if( ( key_usage & ~0xfe ) != 0 )\n        return( MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE );\n\n    c = buf + 4;\n    ku = (unsigned char) key_usage;\n\n    if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ku, 7 ) ) != 4 )\n        return( ret );\n\n    ret = mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_KEY_USAGE,\n                                       MBEDTLS_OID_SIZE( MBEDTLS_OID_KEY_USAGE ),\n                                       1, buf, 4 );\n    if( ret != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\nint mbedtls_x509write_crt_set_ns_cert_type( mbedtls_x509write_cert *ctx,\n                                    unsigned char ns_cert_type )\n{\n    unsigned char buf[4];\n    unsigned char *c;\n    int ret;\n\n    c = buf + 4;\n\n    if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 )\n        return( ret );\n\n    ret = mbedtls_x509write_crt_set_extension( ctx, MBEDTLS_OID_NS_CERT_TYPE,\n                                       MBEDTLS_OID_SIZE( MBEDTLS_OID_NS_CERT_TYPE ),\n                                       0, buf, 4 );\n    if( ret != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\nstatic int x509_write_time( unsigned char **p, unsigned char *start,\n                            const char *t, size_t size )\n{\n    int ret;\n    size_t len = 0;\n\n    /*\n     * write MBEDTLS_ASN1_UTC_TIME if year < 2050 (2 bytes shorter)\n     */\n    if( t[0] == '2' && t[1] == '0' && t[2] < '5' )\n    {\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,\n                                             (const unsigned char *) t + 2,\n                                             size - 2 ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_UTC_TIME ) );\n    }\n    else\n    {\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_raw_buffer( p, start,\n                                                  (const unsigned char *) t,\n                                                  size ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( p, start, len ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( p, start, MBEDTLS_ASN1_GENERALIZED_TIME ) );\n    }\n\n    return( (int) len );\n}\n\nint mbedtls_x509write_crt_der( mbedtls_x509write_cert *ctx, unsigned char *buf, size_t size,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng )\n{\n    int ret;\n    const char *sig_oid;\n    size_t sig_oid_len = 0;\n    unsigned char *c, *c2;\n    unsigned char hash[64];\n    unsigned char sig[MBEDTLS_MPI_MAX_SIZE];\n    unsigned char tmp_buf[2048];\n    size_t sub_len = 0, pub_len = 0, sig_and_oid_len = 0, sig_len;\n    size_t len = 0;\n    mbedtls_pk_type_t pk_alg;\n\n    /*\n     * Prepare data to be signed in tmp_buf\n     */\n    c = tmp_buf + sizeof( tmp_buf );\n\n    /* Signature algorithm needed in TBS, and later for actual signature */\n    pk_alg = mbedtls_pk_get_type( ctx->issuer_key );\n    if( pk_alg == MBEDTLS_PK_ECKEY )\n        pk_alg = MBEDTLS_PK_ECDSA;\n\n    if( ( ret = mbedtls_oid_get_oid_by_sig_alg( pk_alg, ctx->md_alg,\n                                        &sig_oid, &sig_oid_len ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    /*\n     *  Extensions  ::=  SEQUENCE SIZE (1..MAX) OF Extension\n     */\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_extensions( &c, tmp_buf, ctx->extensions ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                    MBEDTLS_ASN1_SEQUENCE ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC |\n                                                    MBEDTLS_ASN1_CONSTRUCTED | 3 ) );\n\n    /*\n     *  SubjectPublicKeyInfo\n     */\n    MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_pk_write_pubkey_der( ctx->subject_key,\n                                                tmp_buf, c - tmp_buf ) );\n    c -= pub_len;\n    len += pub_len;\n\n    /*\n     *  Subject  ::=  Name\n     */\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->subject ) );\n\n    /*\n     *  Validity ::= SEQUENCE {\n     *       notBefore      Time,\n     *       notAfter       Time }\n     */\n    sub_len = 0;\n\n    MBEDTLS_ASN1_CHK_ADD( sub_len, x509_write_time( &c, tmp_buf, ctx->not_after,\n                                            MBEDTLS_X509_RFC5280_UTC_TIME_LEN ) );\n\n    MBEDTLS_ASN1_CHK_ADD( sub_len, x509_write_time( &c, tmp_buf, ctx->not_before,\n                                            MBEDTLS_X509_RFC5280_UTC_TIME_LEN ) );\n\n    len += sub_len;\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, sub_len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                    MBEDTLS_ASN1_SEQUENCE ) );\n\n    /*\n     *  Issuer  ::=  Name\n     */\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->issuer ) );\n\n    /*\n     *  Signature   ::=  AlgorithmIdentifier\n     */\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_algorithm_identifier( &c, tmp_buf,\n                       sig_oid, strlen( sig_oid ), 0 ) );\n\n    /*\n     *  Serial   ::=  INTEGER\n     */\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_mpi( &c, tmp_buf, &ctx->serial ) );\n\n    /*\n     *  Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }\n     */\n    sub_len = 0;\n    MBEDTLS_ASN1_CHK_ADD( sub_len, mbedtls_asn1_write_int( &c, tmp_buf, ctx->version ) );\n    len += sub_len;\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, sub_len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONTEXT_SPECIFIC |\n                                                    MBEDTLS_ASN1_CONSTRUCTED | 0 ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                    MBEDTLS_ASN1_SEQUENCE ) );\n\n    /*\n     * Make signature\n     */\n    mbedtls_md( mbedtls_md_info_from_type( ctx->md_alg ), c, len, hash );\n\n    if( ( ret = mbedtls_pk_sign( ctx->issuer_key, ctx->md_alg, hash, 0, sig, &sig_len,\n                         f_rng, p_rng ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    /*\n     * Write data to output buffer\n     */\n    c2 = buf + size;\n    MBEDTLS_ASN1_CHK_ADD( sig_and_oid_len, mbedtls_x509_write_sig( &c2, buf,\n                                        sig_oid, sig_oid_len, sig, sig_len ) );\n\n    if( len > (size_t)( c2 - buf ) )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    c2 -= len;\n    memcpy( c2, c, len );\n\n    len += sig_and_oid_len;\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c2, buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c2, buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                 MBEDTLS_ASN1_SEQUENCE ) );\n\n    return( (int) len );\n}\n\n#define PEM_BEGIN_CRT           \"-----BEGIN CERTIFICATE-----\\n\"\n#define PEM_END_CRT             \"-----END CERTIFICATE-----\\n\"\n\n#if defined(MBEDTLS_PEM_WRITE_C)\nint mbedtls_x509write_crt_pem( mbedtls_x509write_cert *crt, unsigned char *buf, size_t size,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng )\n{\n    int ret;\n    unsigned char output_buf[4096];\n    size_t olen = 0;\n\n    if( ( ret = mbedtls_x509write_crt_der( crt, output_buf, sizeof(output_buf),\n                                   f_rng, p_rng ) ) < 0 )\n    {\n        return( ret );\n    }\n\n    if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_CRT, PEM_END_CRT,\n                                  output_buf + sizeof(output_buf) - ret,\n                                  ret, buf, size, &olen ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_PEM_WRITE_C */\n\n#endif /* MBEDTLS_X509_CRT_WRITE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/x509write_csr.c",
    "content": "/*\n *  X.509 Certificate Signing Request writing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n/*\n * References:\n * - CSRs: PKCS#10 v1.7 aka RFC 2986\n * - attributes: PKCS#9 v2.0 aka RFC 2985\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_X509_CSR_WRITE_C)\n\n#include \"mbedtls/x509_csr.h\"\n#include \"mbedtls/oid.h\"\n#include \"mbedtls/asn1write.h\"\n\n#include <string.h>\n#include <stdlib.h>\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n#include \"mbedtls/pem.h\"\n#endif\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\nvoid mbedtls_x509write_csr_init( mbedtls_x509write_csr *ctx )\n{\n    memset( ctx, 0, sizeof(mbedtls_x509write_csr) );\n}\n\nvoid mbedtls_x509write_csr_free( mbedtls_x509write_csr *ctx )\n{\n    mbedtls_asn1_free_named_data_list( &ctx->subject );\n    mbedtls_asn1_free_named_data_list( &ctx->extensions );\n\n    mbedtls_zeroize( ctx, sizeof(mbedtls_x509write_csr) );\n}\n\nvoid mbedtls_x509write_csr_set_md_alg( mbedtls_x509write_csr *ctx, mbedtls_md_type_t md_alg )\n{\n    ctx->md_alg = md_alg;\n}\n\nvoid mbedtls_x509write_csr_set_key( mbedtls_x509write_csr *ctx, mbedtls_pk_context *key )\n{\n    ctx->key = key;\n}\n\nint mbedtls_x509write_csr_set_subject_name( mbedtls_x509write_csr *ctx,\n                                    const char *subject_name )\n{\n    return mbedtls_x509_string_to_names( &ctx->subject, subject_name );\n}\n\nint mbedtls_x509write_csr_set_extension( mbedtls_x509write_csr *ctx,\n                                 const char *oid, size_t oid_len,\n                                 const unsigned char *val, size_t val_len )\n{\n    return mbedtls_x509_set_extension( &ctx->extensions, oid, oid_len,\n                               0, val, val_len );\n}\n\nint mbedtls_x509write_csr_set_key_usage( mbedtls_x509write_csr *ctx, unsigned char key_usage )\n{\n    unsigned char buf[4];\n    unsigned char *c;\n    int ret;\n\n    c = buf + 4;\n\n    if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &key_usage, 7 ) ) != 4 )\n        return( ret );\n\n    ret = mbedtls_x509write_csr_set_extension( ctx, MBEDTLS_OID_KEY_USAGE,\n                                       MBEDTLS_OID_SIZE( MBEDTLS_OID_KEY_USAGE ),\n                                       buf, 4 );\n    if( ret != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\nint mbedtls_x509write_csr_set_ns_cert_type( mbedtls_x509write_csr *ctx,\n                                    unsigned char ns_cert_type )\n{\n    unsigned char buf[4];\n    unsigned char *c;\n    int ret;\n\n    c = buf + 4;\n\n    if( ( ret = mbedtls_asn1_write_bitstring( &c, buf, &ns_cert_type, 8 ) ) != 4 )\n        return( ret );\n\n    ret = mbedtls_x509write_csr_set_extension( ctx, MBEDTLS_OID_NS_CERT_TYPE,\n                                       MBEDTLS_OID_SIZE( MBEDTLS_OID_NS_CERT_TYPE ),\n                                       buf, 4 );\n    if( ret != 0 )\n        return( ret );\n\n    return( 0 );\n}\n\nint mbedtls_x509write_csr_der( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng )\n{\n    int ret;\n    const char *sig_oid;\n    size_t sig_oid_len = 0;\n    unsigned char *c, *c2;\n    unsigned char hash[64];\n    unsigned char sig[MBEDTLS_MPI_MAX_SIZE];\n    unsigned char tmp_buf[2048];\n    size_t pub_len = 0, sig_and_oid_len = 0, sig_len;\n    size_t len = 0;\n    mbedtls_pk_type_t pk_alg;\n\n    /*\n     * Prepare data to be signed in tmp_buf\n     */\n    c = tmp_buf + sizeof( tmp_buf );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_extensions( &c, tmp_buf, ctx->extensions ) );\n\n    if( len )\n    {\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                        MBEDTLS_ASN1_SEQUENCE ) );\n\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                        MBEDTLS_ASN1_SET ) );\n\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_oid( &c, tmp_buf, MBEDTLS_OID_PKCS9_CSR_EXT_REQ,\n                                          MBEDTLS_OID_SIZE( MBEDTLS_OID_PKCS9_CSR_EXT_REQ ) ) );\n\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );\n        MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                        MBEDTLS_ASN1_SEQUENCE ) );\n    }\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                    MBEDTLS_ASN1_CONTEXT_SPECIFIC ) );\n\n    MBEDTLS_ASN1_CHK_ADD( pub_len, mbedtls_pk_write_pubkey_der( ctx->key,\n                                                tmp_buf, c - tmp_buf ) );\n    c -= pub_len;\n    len += pub_len;\n\n    /*\n     *  Subject  ::=  Name\n     */\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_x509_write_names( &c, tmp_buf, ctx->subject ) );\n\n    /*\n     *  Version  ::=  INTEGER  {  v1(0), v2(1), v3(2)  }\n     */\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_int( &c, tmp_buf, 0 ) );\n\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c, tmp_buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c, tmp_buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                    MBEDTLS_ASN1_SEQUENCE ) );\n\n    /*\n     * Prepare signature\n     */\n    mbedtls_md( mbedtls_md_info_from_type( ctx->md_alg ), c, len, hash );\n\n    pk_alg = mbedtls_pk_get_type( ctx->key );\n    if( pk_alg == MBEDTLS_PK_ECKEY )\n        pk_alg = MBEDTLS_PK_ECDSA;\n\n    if( ( ret = mbedtls_pk_sign( ctx->key, ctx->md_alg, hash, 0, sig, &sig_len,\n                         f_rng, p_rng ) ) != 0 ||\n        ( ret = mbedtls_oid_get_oid_by_sig_alg( pk_alg, ctx->md_alg,\n                                        &sig_oid, &sig_oid_len ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    /*\n     * Write data to output buffer\n     */\n    c2 = buf + size;\n    MBEDTLS_ASN1_CHK_ADD( sig_and_oid_len, mbedtls_x509_write_sig( &c2, buf,\n                                        sig_oid, sig_oid_len, sig, sig_len ) );\n\n    if( len > (size_t)( c2 - buf ) )\n        return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL );\n\n    c2 -= len;\n    memcpy( c2, c, len );\n\n    len += sig_and_oid_len;\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_len( &c2, buf, len ) );\n    MBEDTLS_ASN1_CHK_ADD( len, mbedtls_asn1_write_tag( &c2, buf, MBEDTLS_ASN1_CONSTRUCTED |\n                                                 MBEDTLS_ASN1_SEQUENCE ) );\n\n    return( (int) len );\n}\n\n#define PEM_BEGIN_CSR           \"-----BEGIN CERTIFICATE REQUEST-----\\n\"\n#define PEM_END_CSR             \"-----END CERTIFICATE REQUEST-----\\n\"\n\n#if defined(MBEDTLS_PEM_WRITE_C)\nint mbedtls_x509write_csr_pem( mbedtls_x509write_csr *ctx, unsigned char *buf, size_t size,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng )\n{\n    int ret;\n    unsigned char output_buf[4096];\n    size_t olen = 0;\n\n    if( ( ret = mbedtls_x509write_csr_der( ctx, output_buf, sizeof(output_buf),\n                                   f_rng, p_rng ) ) < 0 )\n    {\n        return( ret );\n    }\n\n    if( ( ret = mbedtls_pem_write_buffer( PEM_BEGIN_CSR, PEM_END_CSR,\n                                  output_buf + sizeof(output_buf) - ret,\n                                  ret, buf, size, &olen ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_PEM_WRITE_C */\n\n#endif /* MBEDTLS_X509_CSR_WRITE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/library/xtea.c",
    "content": "/*\n *  An 32-bit implementation of the XTEA algorithm\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_XTEA_C)\n\n#include \"mbedtls/xtea.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_SELF_TEST)\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif /* MBEDTLS_PLATFORM_C */\n#endif /* MBEDTLS_SELF_TEST */\n\n#if !defined(MBEDTLS_XTEA_ALT)\n\n/* Implementation that should never be optimized out by the compiler */\nstatic void mbedtls_zeroize( void *v, size_t n ) {\n    volatile unsigned char *p = v; while( n-- ) *p++ = 0;\n}\n\n/*\n * 32-bit integer manipulation macros (big endian)\n */\n#ifndef GET_UINT32_BE\n#define GET_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \\\n        | ( (uint32_t) (b)[(i) + 1] << 16 )             \\\n        | ( (uint32_t) (b)[(i) + 2] <<  8 )             \\\n        | ( (uint32_t) (b)[(i) + 3]       );            \\\n}\n#endif\n\n#ifndef PUT_UINT32_BE\n#define PUT_UINT32_BE(n,b,i)                            \\\n{                                                       \\\n    (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \\\n    (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \\\n    (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \\\n    (b)[(i) + 3] = (unsigned char) ( (n)       );       \\\n}\n#endif\n\nvoid mbedtls_xtea_init( mbedtls_xtea_context *ctx )\n{\n    memset( ctx, 0, sizeof( mbedtls_xtea_context ) );\n}\n\nvoid mbedtls_xtea_free( mbedtls_xtea_context *ctx )\n{\n    if( ctx == NULL )\n        return;\n\n    mbedtls_zeroize( ctx, sizeof( mbedtls_xtea_context ) );\n}\n\n/*\n * XTEA key schedule\n */\nvoid mbedtls_xtea_setup( mbedtls_xtea_context *ctx, const unsigned char key[16] )\n{\n    int i;\n\n    memset( ctx, 0, sizeof(mbedtls_xtea_context) );\n\n    for( i = 0; i < 4; i++ )\n    {\n        GET_UINT32_BE( ctx->k[i], key, i << 2 );\n    }\n}\n\n/*\n * XTEA encrypt function\n */\nint mbedtls_xtea_crypt_ecb( mbedtls_xtea_context *ctx, int mode,\n                    const unsigned char input[8], unsigned char output[8])\n{\n    uint32_t *k, v0, v1, i;\n\n    k = ctx->k;\n\n    GET_UINT32_BE( v0, input, 0 );\n    GET_UINT32_BE( v1, input, 4 );\n\n    if( mode == MBEDTLS_XTEA_ENCRYPT )\n    {\n        uint32_t sum = 0, delta = 0x9E3779B9;\n\n        for( i = 0; i < 32; i++ )\n        {\n            v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);\n            sum += delta;\n            v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);\n        }\n    }\n    else /* MBEDTLS_XTEA_DECRYPT */\n    {\n        uint32_t delta = 0x9E3779B9, sum = delta * 32;\n\n        for( i = 0; i < 32; i++ )\n        {\n            v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + k[(sum>>11) & 3]);\n            sum -= delta;\n            v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + k[sum & 3]);\n        }\n    }\n\n    PUT_UINT32_BE( v0, output, 0 );\n    PUT_UINT32_BE( v1, output, 4 );\n\n    return( 0 );\n}\n\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n/*\n * XTEA-CBC buffer encryption/decryption\n */\nint mbedtls_xtea_crypt_cbc( mbedtls_xtea_context *ctx, int mode, size_t length,\n                    unsigned char iv[8], const unsigned char *input,\n                    unsigned char *output)\n{\n    int i;\n    unsigned char temp[8];\n\n    if( length % 8 )\n        return( MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH );\n\n    if( mode == MBEDTLS_XTEA_DECRYPT )\n    {\n        while( length > 0 )\n        {\n            memcpy( temp, input, 8 );\n            mbedtls_xtea_crypt_ecb( ctx, mode, input, output );\n\n            for( i = 0; i < 8; i++ )\n                output[i] = (unsigned char)( output[i] ^ iv[i] );\n\n            memcpy( iv, temp, 8 );\n\n            input  += 8;\n            output += 8;\n            length -= 8;\n        }\n    }\n    else\n    {\n        while( length > 0 )\n        {\n            for( i = 0; i < 8; i++ )\n                output[i] = (unsigned char)( input[i] ^ iv[i] );\n\n            mbedtls_xtea_crypt_ecb( ctx, mode, output, output );\n            memcpy( iv, output, 8 );\n\n            input  += 8;\n            output += 8;\n            length -= 8;\n        }\n    }\n\n    return( 0 );\n}\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#endif /* !MBEDTLS_XTEA_ALT */\n\n#if defined(MBEDTLS_SELF_TEST)\n\n/*\n * XTEA tests vectors (non-official)\n */\n\nstatic const unsigned char xtea_test_key[6][16] =\n{\n   { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n     0x0c, 0x0d, 0x0e, 0x0f },\n   { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n     0x0c, 0x0d, 0x0e, 0x0f },\n   { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n     0x0c, 0x0d, 0x0e, 0x0f },\n   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n     0x00, 0x00, 0x00, 0x00 },\n   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n     0x00, 0x00, 0x00, 0x00 },\n   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n     0x00, 0x00, 0x00, 0x00 }\n};\n\nstatic const unsigned char xtea_test_pt[6][8] =\n{\n    { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 },\n    { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 },\n    { 0x5a, 0x5b, 0x6e, 0x27, 0x89, 0x48, 0xd7, 0x7f },\n    { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 },\n    { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 },\n    { 0x70, 0xe1, 0x22, 0x5d, 0x6e, 0x4e, 0x76, 0x55 }\n};\n\nstatic const unsigned char xtea_test_ct[6][8] =\n{\n    { 0x49, 0x7d, 0xf3, 0xd0, 0x72, 0x61, 0x2c, 0xb5 },\n    { 0xe7, 0x8f, 0x2d, 0x13, 0x74, 0x43, 0x41, 0xd8 },\n    { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 },\n    { 0xa0, 0x39, 0x05, 0x89, 0xf8, 0xb8, 0xef, 0xa5 },\n    { 0xed, 0x23, 0x37, 0x5a, 0x82, 0x1a, 0x8c, 0x2d },\n    { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }\n};\n\n/*\n * Checkup routine\n */\nint mbedtls_xtea_self_test( int verbose )\n{\n    int i, ret = 0;\n    unsigned char buf[8];\n    mbedtls_xtea_context ctx;\n\n    mbedtls_xtea_init( &ctx );\n    for( i = 0; i < 6; i++ )\n    {\n        if( verbose != 0 )\n            mbedtls_printf( \"  XTEA test #%d: \", i + 1 );\n\n        memcpy( buf, xtea_test_pt[i], 8 );\n\n        mbedtls_xtea_setup( &ctx, xtea_test_key[i] );\n        mbedtls_xtea_crypt_ecb( &ctx, MBEDTLS_XTEA_ENCRYPT, buf, buf );\n\n        if( memcmp( buf, xtea_test_ct[i], 8 ) != 0 )\n        {\n            if( verbose != 0 )\n                mbedtls_printf( \"failed\\n\" );\n\n            ret = 1;\n            goto exit;\n        }\n\n        if( verbose != 0 )\n            mbedtls_printf( \"passed\\n\" );\n    }\n\n    if( verbose != 0 )\n        mbedtls_printf( \"\\n\" );\n\nexit:\n    mbedtls_xtea_free( &ctx );\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_SELF_TEST */\n\n#endif /* MBEDTLS_XTEA_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/.gitignore",
    "content": "*/Makefile\n*.sln\n*.vcxproj\n\naes/aescrypt2\naes/crypt_and_hash\nhash/generic_sum\nhash/hello\nhash/md5sum\nhash/sha1sum\nhash/sha2sum\npkey/dh_client\npkey/dh_genprime\npkey/dh_server\npkey/ecdsa\npkey/ecdh_curve25519\npkey/gen_key\npkey/key_app\npkey/key_app_writer\npkey/mpi_demo\npkey/pk_decrypt\npkey/pk_encrypt\npkey/pk_sign\npkey/pk_verify\npkey/rsa_decrypt\npkey/rsa_encrypt\npkey/rsa_genkey\npkey/rsa_sign\npkey/rsa_sign_pss\npkey/rsa_verify\npkey/rsa_verify_pss\nrandom/gen_entropy\nrandom/gen_random_ctr_drbg\nrandom/gen_random_havege\nssl/dtls_client\nssl/dtls_server\nssl/ssl_client1\nssl/ssl_client2\nssl/ssl_fork_server\nssl/ssl_mail_client\nssl/ssl_pthread_server\nssl/ssl_server\nssl/ssl_server2\nssl/mini_client\ntest/benchmark\ntest/ecp-bench\ntest/selftest\ntest/ssl_cert_test\ntest/udp_proxy\nutil/pem2der\nutil/strerror\nx509/cert_app\nx509/cert_req\nx509/crl_app\nx509/cert_write\nx509/req_app\n\n# generated files\npkey/keyfile.key\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/CMakeLists.txt",
    "content": "add_subdirectory(aes)\nadd_subdirectory(hash)\nadd_subdirectory(pkey)\nadd_subdirectory(random)\nadd_subdirectory(ssl)\nadd_subdirectory(test)\nadd_subdirectory(x509)\nadd_subdirectory(util)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/Makefile",
    "content": "\n# To compile on SunOS: add \"-lsocket -lnsl\" to LDFLAGS\n# To compile with PKCS11: add \"-lpkcs11-helper\" to LDFLAGS\n\nCFLAGS\t?= -O2\nWARNING_CFLAGS ?= -Wall -W -Wdeclaration-after-statement\nLDFLAGS ?=\n\nLOCAL_CFLAGS = $(WARNING_CFLAGS) -I../include -D_FILE_OFFSET_BITS=64\nLOCAL_LDFLAGS = -L../library \t\t\t\\\n\t\t-lmbedtls$(SHARED_SUFFIX)\t\\\n\t\t-lmbedx509$(SHARED_SUFFIX)\t\\\n\t\t-lmbedcrypto$(SHARED_SUFFIX)\n\nifndef SHARED\nDEP=../library/libmbedcrypto.a ../library/libmbedx509.a ../library/libmbedtls.a\nelse\nDEP=../library/libmbedcrypto.$(DLEXT) ../library/libmbedx509.$(DLEXT) ../library/libmbedtls.$(DLEXT)\nendif\n\nifdef DEBUG\nLOCAL_CFLAGS += -g3\nendif\n\n# if we're running on Windows, build for Windows\nifdef WINDOWS\nWINDOWS_BUILD=1\nendif\n\nifdef WINDOWS_BUILD\nDLEXT=dll\nEXEXT=.exe\nLOCAL_LDFLAGS += -lws2_32\nifdef SHARED\nSHARED_SUFFIX=.$(DLEXT)\nendif\nelse\nDLEXT=so\nEXEXT=\nSHARED_SUFFIX=\nendif\n\n# Zlib shared library extensions:\nifdef ZLIB\nLOCAL_LDFLAGS += -lz\nendif\n\nAPPS =\taes/aescrypt2$(EXEXT)\t\taes/crypt_and_hash$(EXEXT)\t\\\n\thash/hello$(EXEXT)\t\thash/generic_sum$(EXEXT)\t\\\n\t\t\t\t\tpkey/dh_client$(EXEXT)\t\t\\\n\tpkey/dh_genprime$(EXEXT)\tpkey/dh_server$(EXEXT)\t\t\\\n\tpkey/ecdh_curve25519$(EXEXT)\t\t\t\t\t\\\n\tpkey/ecdsa$(EXEXT)\t\tpkey/gen_key$(EXEXT)\t\t\\\n\tpkey/key_app$(EXEXT)\t\tpkey/key_app_writer$(EXEXT)\t\\\n\tpkey/mpi_demo$(EXEXT)\t\tpkey/pk_decrypt$(EXEXT)\t\t\\\n\tpkey/pk_encrypt$(EXEXT)\t\tpkey/pk_sign$(EXEXT)\t\t\\\n\tpkey/pk_verify$(EXEXT)\t\tpkey/rsa_genkey$(EXEXT)\t\t\\\n\tpkey/rsa_decrypt$(EXEXT)\tpkey/rsa_encrypt$(EXEXT)\t\\\n\tpkey/rsa_sign$(EXEXT)\t\tpkey/rsa_verify$(EXEXT)\t\t\\\n\tpkey/rsa_sign_pss$(EXEXT)\tpkey/rsa_verify_pss$(EXEXT)\t\\\n\tssl/dtls_client$(EXEXT)\t\tssl/dtls_server$(EXEXT)\t\t\\\n\tssl/ssl_client1$(EXEXT)\t\tssl/ssl_client2$(EXEXT)\t\t\\\n\tssl/ssl_server$(EXEXT)\t\tssl/ssl_server2$(EXEXT)\t\t\\\n\tssl/ssl_fork_server$(EXEXT)\tssl/mini_client$(EXEXT)\t\t\\\n\tssl/ssl_mail_client$(EXEXT)\trandom/gen_entropy$(EXEXT)\t\\\n\trandom/gen_random_havege$(EXEXT)\t\t\t\t\\\n\trandom/gen_random_ctr_drbg$(EXEXT)\t\t\t\t\\\n\ttest/ssl_cert_test$(EXEXT)\ttest/benchmark$(EXEXT)\t\t\\\n\ttest/selftest$(EXEXT)\t\ttest/udp_proxy$(EXEXT)\t\t\\\n\tutil/pem2der$(EXEXT)\t\tutil/strerror$(EXEXT)\t\t\\\n\tx509/cert_app$(EXEXT)\t\tx509/crl_app$(EXEXT)\t\t\\\n\tx509/cert_req$(EXEXT)\t\tx509/cert_write$(EXEXT)\t\t\\\n\tx509/req_app$(EXEXT)\n\nifdef PTHREAD\nAPPS +=\tssl/ssl_pthread_server$(EXEXT)\nendif\n\n.SILENT:\n\n.PHONY: all clean list\n\nall: $(APPS)\n\n$(DEP):\n\t$(MAKE) -C ../library\n\naes/aescrypt2$(EXEXT): aes/aescrypt2.c $(DEP)\n\techo \"  CC    aes/aescrypt2.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) aes/aescrypt2.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\naes/crypt_and_hash$(EXEXT): aes/crypt_and_hash.c $(DEP)\n\techo \"  CC    aes/crypt_and_hash.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) aes/crypt_and_hash.c $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nhash/hello$(EXEXT): hash/hello.c $(DEP)\n\techo \"  CC    hash/hello.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) hash/hello.c       $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nhash/generic_sum$(EXEXT): hash/generic_sum.c $(DEP)\n\techo \"  CC    hash/generic_sum.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) hash/generic_sum.c $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/dh_client$(EXEXT): pkey/dh_client.c $(DEP)\n\techo \"  CC    pkey/dh_client.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/dh_client.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/dh_genprime$(EXEXT): pkey/dh_genprime.c $(DEP)\n\techo \"  CC    pkey/dh_genprime.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/dh_genprime.c $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/dh_server$(EXEXT): pkey/dh_server.c $(DEP)\n\techo \"  CC    pkey/dh_server.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/dh_server.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/ecdh_curve25519$(EXEXT): pkey/ecdh_curve25519.c $(DEP)\n\techo \"  CC    pkey/ecdh_curve25519.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/ecdh_curve25519.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/ecdsa$(EXEXT): pkey/ecdsa.c $(DEP)\n\techo \"  CC    pkey/ecdsa.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/ecdsa.c       $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/gen_key$(EXEXT): pkey/gen_key.c $(DEP)\n\techo \"  CC    pkey/gen_key.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/gen_key.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/key_app$(EXEXT): pkey/key_app.c $(DEP)\n\techo \"  CC    pkey/key_app.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/key_app.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/key_app_writer$(EXEXT): pkey/key_app_writer.c $(DEP)\n\techo \"  CC    pkey/key_app_writer.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/key_app_writer.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/mpi_demo$(EXEXT): pkey/mpi_demo.c $(DEP)\n\techo \"  CC    pkey/mpi_demo.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/mpi_demo.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/pk_decrypt$(EXEXT): pkey/pk_decrypt.c $(DEP)\n\techo \"  CC    pkey/pk_decrypt.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/pk_decrypt.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/pk_encrypt$(EXEXT): pkey/pk_encrypt.c $(DEP)\n\techo \"  CC    pkey/pk_encrypt.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/pk_encrypt.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/pk_sign$(EXEXT): pkey/pk_sign.c $(DEP)\n\techo \"  CC    pkey/pk_sign.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/pk_sign.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/pk_verify$(EXEXT): pkey/pk_verify.c $(DEP)\n\techo \"  CC    pkey/pk_verify.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/pk_verify.c  $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/rsa_genkey$(EXEXT): pkey/rsa_genkey.c $(DEP)\n\techo \"  CC    pkey/rsa_genkey.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/rsa_genkey.c  $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/rsa_sign$(EXEXT): pkey/rsa_sign.c $(DEP)\n\techo \"  CC    pkey/rsa_sign.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/rsa_sign.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/rsa_verify$(EXEXT): pkey/rsa_verify.c $(DEP)\n\techo \"  CC    pkey/rsa_verify.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/rsa_verify.c  $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/rsa_sign_pss$(EXEXT): pkey/rsa_sign_pss.c $(DEP)\n\techo \"  CC    pkey/rsa_sign_pss.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/rsa_sign_pss.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/rsa_verify_pss$(EXEXT): pkey/rsa_verify_pss.c $(DEP)\n\techo \"  CC    pkey/rsa_verify_pss.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/rsa_verify_pss.c  $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/rsa_decrypt$(EXEXT): pkey/rsa_decrypt.c $(DEP)\n\techo \"  CC    pkey/rsa_decrypt.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/rsa_decrypt.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\npkey/rsa_encrypt$(EXEXT): pkey/rsa_encrypt.c $(DEP)\n\techo \"  CC    pkey/rsa_encrypt.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) pkey/rsa_encrypt.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nrandom/gen_entropy$(EXEXT): random/gen_entropy.c $(DEP)\n\techo \"  CC    random/gen_entropy.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) random/gen_entropy.c $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nrandom/gen_random_havege$(EXEXT): random/gen_random_havege.c $(DEP)\n\techo \"  CC    random/gen_random_havege.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) random/gen_random_havege.c $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nrandom/gen_random_ctr_drbg$(EXEXT): random/gen_random_ctr_drbg.c $(DEP)\n\techo \"  CC    random/gen_random_ctr_drbg.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) random/gen_random_ctr_drbg.c $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nssl/dtls_client$(EXEXT): ssl/dtls_client.c $(DEP)\n\techo \"  CC    ssl/dtls_client.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/dtls_client.c  $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nssl/dtls_server$(EXEXT): ssl/dtls_server.c $(DEP)\n\techo \"  CC    ssl/dtls_server.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/dtls_server.c  $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nssl/ssl_client1$(EXEXT): ssl/ssl_client1.c $(DEP)\n\techo \"  CC    ssl/ssl_client1.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/ssl_client1.c  $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nssl/ssl_client2$(EXEXT): ssl/ssl_client2.c $(DEP)\n\techo \"  CC    ssl/ssl_client2.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/ssl_client2.c  $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nssl/ssl_server$(EXEXT): ssl/ssl_server.c $(DEP)\n\techo \"  CC    ssl/ssl_server.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/ssl_server.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nssl/ssl_server2$(EXEXT): ssl/ssl_server2.c $(DEP)\n\techo \"  CC    ssl/ssl_server2.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/ssl_server2.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nssl/ssl_fork_server$(EXEXT): ssl/ssl_fork_server.c $(DEP)\n\techo \"  CC    ssl/ssl_fork_server.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/ssl_fork_server.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nssl/ssl_pthread_server$(EXEXT): ssl/ssl_pthread_server.c $(DEP)\n\techo \"  CC    ssl/ssl_pthread_server.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/ssl_pthread_server.c   $(LOCAL_LDFLAGS) -lpthread  $(LDFLAGS) -o $@\n\nssl/ssl_mail_client$(EXEXT): ssl/ssl_mail_client.c $(DEP)\n\techo \"  CC    ssl/ssl_mail_client.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/ssl_mail_client.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nssl/mini_client$(EXEXT): ssl/mini_client.c $(DEP)\n\techo \"  CC    ssl/mini_client.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) ssl/mini_client.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest/ssl_cert_test$(EXEXT): test/ssl_cert_test.c $(DEP)\n\techo \"  CC    test/ssl_cert_test.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) test/ssl_cert_test.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest/benchmark$(EXEXT): test/benchmark.c $(DEP)\n\techo \"  CC    test/benchmark.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) test/benchmark.c   $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest/selftest$(EXEXT): test/selftest.c $(DEP)\n\techo \"  CC    test/selftest.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) test/selftest.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest/udp_proxy$(EXEXT): test/udp_proxy.c $(DEP)\n\techo \"  CC    test/udp_proxy.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) test/udp_proxy.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nutil/pem2der$(EXEXT): util/pem2der.c $(DEP)\n\techo \"  CC    util/pem2der.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) util/pem2der.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nutil/strerror$(EXEXT): util/strerror.c $(DEP)\n\techo \"  CC    util/strerror.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) util/strerror.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nx509/cert_app$(EXEXT): x509/cert_app.c $(DEP)\n\techo \"  CC    x509/cert_app.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) x509/cert_app.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nx509/cert_write$(EXEXT): x509/cert_write.c $(DEP)\n\techo \"  CC    x509/cert_write.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) x509/cert_write.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nx509/crl_app$(EXEXT): x509/crl_app.c $(DEP)\n\techo \"  CC    x509/crl_app.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) x509/crl_app.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nx509/cert_req$(EXEXT): x509/cert_req.c $(DEP)\n\techo \"  CC    x509/cert_req.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) x509/cert_req.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nx509/req_app$(EXEXT): x509/req_app.c $(DEP)\n\techo \"  CC    x509/req_app.c\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) x509/req_app.c    $(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nclean:\nifndef WINDOWS\n\trm -f $(APPS)\nelse\n\tdel /S /Q /F *.o *.exe\nendif\n\nlist:\n\techo $(APPS)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/aes/CMakeLists.txt",
    "content": "add_executable(aescrypt2 aescrypt2.c)\ntarget_link_libraries(aescrypt2 mbedtls)\n\nadd_executable(crypt_and_hash crypt_and_hash.c)\ntarget_link_libraries(crypt_and_hash mbedtls)\n\ninstall(TARGETS aescrypt2 crypt_and_hash\n        DESTINATION \"bin\"\n        PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/aes/aescrypt2.c",
    "content": "/*\n *  AES-256 file encryption program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#include \"mbedtls/aes.h\"\n#include \"mbedtls/md.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#if defined(_WIN32)\n#include <windows.h>\n#if !defined(_WIN32_WCE)\n#include <io.h>\n#endif\n#else\n#include <sys/types.h>\n#include <unistd.h>\n#endif\n\n#define MODE_ENCRYPT    0\n#define MODE_DECRYPT    1\n\n#define USAGE   \\\n    \"\\n  aescrypt2 <mode> <input filename> <output filename> <key>\\n\" \\\n    \"\\n   <mode>: 0 = encrypt, 1 = decrypt\\n\" \\\n    \"\\n  example: aescrypt2 0 file file.aes hex:E76B2413958B00E193\\n\" \\\n    \"\\n\"\n\n#if !defined(MBEDTLS_AES_C) || !defined(MBEDTLS_SHA256_C) || \\\n    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_MD_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_AES_C and/or MBEDTLS_SHA256_C \"\n                    \"and/or MBEDTLS_FS_IO and/or MBEDTLS_MD_C \"\n                    \"not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( int argc, char *argv[] )\n{\n    int ret = 1;\n\n    unsigned int i, n;\n    int mode, lastn;\n    size_t keylen;\n    FILE *fkey, *fin = NULL, *fout = NULL;\n\n    char *p;\n\n    unsigned char IV[16];\n    unsigned char tmp[16];\n    unsigned char key[512];\n    unsigned char digest[32];\n    unsigned char buffer[1024];\n    unsigned char diff;\n\n    mbedtls_aes_context aes_ctx;\n    mbedtls_md_context_t sha_ctx;\n\n#if defined(_WIN32_WCE)\n    long filesize, offset;\n#elif defined(_WIN32)\n       LARGE_INTEGER li_size;\n    __int64 filesize, offset;\n#else\n      off_t filesize, offset;\n#endif\n\n    mbedtls_aes_init( &aes_ctx );\n    mbedtls_md_init( &sha_ctx );\n\n    ret = mbedtls_md_setup( &sha_ctx, mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ), 1 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \"  ! mbedtls_md_setup() returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    /*\n     * Parse the command-line arguments.\n     */\n    if( argc != 5 )\n    {\n        mbedtls_printf( USAGE );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n  Press Enter to exit this program.\\n\" );\n        fflush( stdout ); getchar();\n#endif\n\n        goto exit;\n    }\n\n    mode = atoi( argv[1] );\n    memset( IV,     0, sizeof( IV ) );\n    memset( key,    0, sizeof( key ) );\n    memset( digest, 0, sizeof( digest ) );\n    memset( buffer, 0, sizeof( buffer ) );\n\n    if( mode != MODE_ENCRYPT && mode != MODE_DECRYPT )\n    {\n        mbedtls_fprintf( stderr, \"invalide operation mode\\n\" );\n        goto exit;\n    }\n\n    if( strcmp( argv[2], argv[3] ) == 0 )\n    {\n        mbedtls_fprintf( stderr, \"input and output filenames must differ\\n\" );\n        goto exit;\n    }\n\n    if( ( fin = fopen( argv[2], \"rb\" ) ) == NULL )\n    {\n        mbedtls_fprintf( stderr, \"fopen(%s,rb) failed\\n\", argv[2] );\n        goto exit;\n    }\n\n    if( ( fout = fopen( argv[3], \"wb+\" ) ) == NULL )\n    {\n        mbedtls_fprintf( stderr, \"fopen(%s,wb+) failed\\n\", argv[3] );\n        goto exit;\n    }\n\n    /*\n     * Read the secret key from file or command line\n     */\n    if( ( fkey = fopen( argv[4], \"rb\" ) ) != NULL )\n    {\n        keylen = fread( key, 1, sizeof( key ), fkey );\n        fclose( fkey );\n    }\n    else\n    {\n        if( memcmp( argv[4], \"hex:\", 4 ) == 0 )\n        {\n            p = &argv[4][4];\n            keylen = 0;\n\n            while( sscanf( p, \"%02X\", &n ) > 0 &&\n                   keylen < (int) sizeof( key ) )\n            {\n                key[keylen++] = (unsigned char) n;\n                p += 2;\n            }\n        }\n        else\n        {\n            keylen = strlen( argv[4] );\n\n            if( keylen > (int) sizeof( key ) )\n                keylen = (int) sizeof( key );\n\n            memcpy( key, argv[4], keylen );\n        }\n    }\n\n#if defined(_WIN32_WCE)\n    filesize = fseek( fin, 0L, SEEK_END );\n#else\n#if defined(_WIN32)\n    /*\n     * Support large files (> 2Gb) on Win32\n     */\n    li_size.QuadPart = 0;\n    li_size.LowPart  =\n        SetFilePointer( (HANDLE) _get_osfhandle( _fileno( fin ) ),\n                        li_size.LowPart, &li_size.HighPart, FILE_END );\n\n    if( li_size.LowPart == 0xFFFFFFFF && GetLastError() != NO_ERROR )\n    {\n        mbedtls_fprintf( stderr, \"SetFilePointer(0,FILE_END) failed\\n\" );\n        goto exit;\n    }\n\n    filesize = li_size.QuadPart;\n#else\n    if( ( filesize = lseek( fileno( fin ), 0, SEEK_END ) ) < 0 )\n    {\n        perror( \"lseek\" );\n        goto exit;\n    }\n#endif\n#endif\n\n    if( fseek( fin, 0, SEEK_SET ) < 0 )\n    {\n        mbedtls_fprintf( stderr, \"fseek(0,SEEK_SET) failed\\n\" );\n        goto exit;\n    }\n\n    if( mode == MODE_ENCRYPT )\n    {\n        /*\n         * Generate the initialization vector as:\n         * IV = SHA-256( filesize || filename )[0..15]\n         */\n        for( i = 0; i < 8; i++ )\n            buffer[i] = (unsigned char)( filesize >> ( i << 3 ) );\n\n        p = argv[2];\n\n        mbedtls_md_starts( &sha_ctx );\n        mbedtls_md_update( &sha_ctx, buffer, 8 );\n        mbedtls_md_update( &sha_ctx, (unsigned char *) p, strlen( p ) );\n        mbedtls_md_finish( &sha_ctx, digest );\n\n        memcpy( IV, digest, 16 );\n\n        /*\n         * The last four bits in the IV are actually used\n         * to store the file size modulo the AES block size.\n         */\n        lastn = (int)( filesize & 0x0F );\n\n        IV[15] = (unsigned char)\n            ( ( IV[15] & 0xF0 ) | lastn );\n\n        /*\n         * Append the IV at the beginning of the output.\n         */\n        if( fwrite( IV, 1, 16, fout ) != 16 )\n        {\n            mbedtls_fprintf( stderr, \"fwrite(%d bytes) failed\\n\", 16 );\n            goto exit;\n        }\n\n        /*\n         * Hash the IV and the secret key together 8192 times\n         * using the result to setup the AES context and HMAC.\n         */\n        memset( digest, 0,  32 );\n        memcpy( digest, IV, 16 );\n\n        for( i = 0; i < 8192; i++ )\n        {\n            mbedtls_md_starts( &sha_ctx );\n            mbedtls_md_update( &sha_ctx, digest, 32 );\n            mbedtls_md_update( &sha_ctx, key, keylen );\n            mbedtls_md_finish( &sha_ctx, digest );\n        }\n\n        mbedtls_aes_setkey_enc( &aes_ctx, digest, 256 );\n        mbedtls_md_hmac_starts( &sha_ctx, digest, 32 );\n\n        /*\n         * Encrypt and write the ciphertext.\n         */\n        for( offset = 0; offset < filesize; offset += 16 )\n        {\n            n = ( filesize - offset > 16 ) ? 16 : (int)\n                ( filesize - offset );\n\n            if( fread( buffer, 1, n, fin ) != (size_t) n )\n            {\n                mbedtls_fprintf( stderr, \"fread(%d bytes) failed\\n\", n );\n                goto exit;\n            }\n\n            for( i = 0; i < 16; i++ )\n                buffer[i] = (unsigned char)( buffer[i] ^ IV[i] );\n\n            mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_ENCRYPT, buffer, buffer );\n            mbedtls_md_hmac_update( &sha_ctx, buffer, 16 );\n\n            if( fwrite( buffer, 1, 16, fout ) != 16 )\n            {\n                mbedtls_fprintf( stderr, \"fwrite(%d bytes) failed\\n\", 16 );\n                goto exit;\n            }\n\n            memcpy( IV, buffer, 16 );\n        }\n\n        /*\n         * Finally write the HMAC.\n         */\n        mbedtls_md_hmac_finish( &sha_ctx, digest );\n\n        if( fwrite( digest, 1, 32, fout ) != 32 )\n        {\n            mbedtls_fprintf( stderr, \"fwrite(%d bytes) failed\\n\", 16 );\n            goto exit;\n        }\n    }\n\n    if( mode == MODE_DECRYPT )\n    {\n        /*\n         *  The encrypted file must be structured as follows:\n         *\n         *        00 .. 15              Initialization Vector\n         *        16 .. 31              AES Encrypted Block #1\n         *           ..\n         *      N*16 .. (N+1)*16 - 1    AES Encrypted Block #N\n         *  (N+1)*16 .. (N+1)*16 + 32   HMAC-SHA-256(ciphertext)\n         */\n        if( filesize < 48 )\n        {\n            mbedtls_fprintf( stderr, \"File too short to be encrypted.\\n\" );\n            goto exit;\n        }\n\n        if( ( filesize & 0x0F ) != 0 )\n        {\n            mbedtls_fprintf( stderr, \"File size not a multiple of 16.\\n\" );\n            goto exit;\n        }\n\n        /*\n         * Subtract the IV + HMAC length.\n         */\n        filesize -= ( 16 + 32 );\n\n        /*\n         * Read the IV and original filesize modulo 16.\n         */\n        if( fread( buffer, 1, 16, fin ) != 16 )\n        {\n            mbedtls_fprintf( stderr, \"fread(%d bytes) failed\\n\", 16 );\n            goto exit;\n        }\n\n        memcpy( IV, buffer, 16 );\n        lastn = IV[15] & 0x0F;\n\n        /*\n         * Hash the IV and the secret key together 8192 times\n         * using the result to setup the AES context and HMAC.\n         */\n        memset( digest, 0,  32 );\n        memcpy( digest, IV, 16 );\n\n        for( i = 0; i < 8192; i++ )\n        {\n            mbedtls_md_starts( &sha_ctx );\n            mbedtls_md_update( &sha_ctx, digest, 32 );\n            mbedtls_md_update( &sha_ctx, key, keylen );\n            mbedtls_md_finish( &sha_ctx, digest );\n        }\n\n        mbedtls_aes_setkey_dec( &aes_ctx, digest, 256 );\n        mbedtls_md_hmac_starts( &sha_ctx, digest, 32 );\n\n        /*\n         * Decrypt and write the plaintext.\n         */\n        for( offset = 0; offset < filesize; offset += 16 )\n        {\n            if( fread( buffer, 1, 16, fin ) != 16 )\n            {\n                mbedtls_fprintf( stderr, \"fread(%d bytes) failed\\n\", 16 );\n                goto exit;\n            }\n\n            memcpy( tmp, buffer, 16 );\n\n            mbedtls_md_hmac_update( &sha_ctx, buffer, 16 );\n            mbedtls_aes_crypt_ecb( &aes_ctx, MBEDTLS_AES_DECRYPT, buffer, buffer );\n\n            for( i = 0; i < 16; i++ )\n                buffer[i] = (unsigned char)( buffer[i] ^ IV[i] );\n\n            memcpy( IV, tmp, 16 );\n\n            n = ( lastn > 0 && offset == filesize - 16 )\n                ? lastn : 16;\n\n            if( fwrite( buffer, 1, n, fout ) != (size_t) n )\n            {\n                mbedtls_fprintf( stderr, \"fwrite(%d bytes) failed\\n\", n );\n                goto exit;\n            }\n        }\n\n        /*\n         * Verify the message authentication code.\n         */\n        mbedtls_md_hmac_finish( &sha_ctx, digest );\n\n        if( fread( buffer, 1, 32, fin ) != 32 )\n        {\n            mbedtls_fprintf( stderr, \"fread(%d bytes) failed\\n\", 32 );\n            goto exit;\n        }\n\n        /* Use constant-time buffer comparison */\n        diff = 0;\n        for( i = 0; i < 32; i++ )\n            diff |= digest[i] ^ buffer[i];\n\n        if( diff != 0 )\n        {\n            mbedtls_fprintf( stderr, \"HMAC check failed: wrong key, \"\n                             \"or file corrupted.\\n\" );\n            goto exit;\n        }\n    }\n\n    ret = 0;\n\nexit:\n    if( fin )\n        fclose( fin );\n    if( fout )\n        fclose( fout );\n\n    /* Zeroize all command line arguments to also cover\n       the case when the user has missed or reordered some,\n       in which case the key might not be in argv[4]. */\n    for( i = 0; i < (unsigned int) argc; i++ )\n        memset( argv[i], 0, strlen( argv[i] ) );\n\n    memset( IV,     0, sizeof( IV ) );\n    memset( key,    0, sizeof( key ) );\n    memset( tmp,    0, sizeof( tmp ) );\n    memset( buffer, 0, sizeof( buffer ) );\n    memset( digest, 0, sizeof( digest ) );\n\n    mbedtls_aes_free( &aes_ctx );\n    mbedtls_md_free( &sha_ctx );\n\n    return( ret );\n}\n#endif /* MBEDTLS_AES_C && MBEDTLS_SHA256_C && MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/aes/crypt_and_hash.c",
    "content": "/*\n *  \\brief  Generic file encryption program using generic wrappers for configured\n *          security.\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_CIPHER_C) && defined(MBEDTLS_MD_C) && \\\n defined(MBEDTLS_FS_IO)\n#include \"mbedtls/cipher.h\"\n#include \"mbedtls/md.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#endif\n\n#if defined(_WIN32)\n#include <windows.h>\n#if !defined(_WIN32_WCE)\n#include <io.h>\n#endif\n#else\n#include <sys/types.h>\n#include <unistd.h>\n#endif\n\n#define MODE_ENCRYPT    0\n#define MODE_DECRYPT    1\n\n#define USAGE   \\\n    \"\\n  crypt_and_hash <mode> <input filename> <output filename> <cipher> <mbedtls_md> <key>\\n\" \\\n    \"\\n   <mode>: 0 = encrypt, 1 = decrypt\\n\" \\\n    \"\\n  example: crypt_and_hash 0 file file.aes AES-128-CBC SHA1 hex:E76B2413958B00E193\\n\" \\\n    \"\\n\"\n\n#if !defined(MBEDTLS_CIPHER_C) || !defined(MBEDTLS_MD_C) || \\\n    !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_CIPHER_C and/or MBEDTLS_MD_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( int argc, char *argv[] )\n{\n    int ret = 1, i, n;\n    int mode;\n    size_t keylen, ilen, olen;\n    FILE *fkey, *fin = NULL, *fout = NULL;\n\n    char *p;\n    unsigned char IV[16];\n    unsigned char key[512];\n    unsigned char digest[MBEDTLS_MD_MAX_SIZE];\n    unsigned char buffer[1024];\n    unsigned char output[1024];\n    unsigned char diff;\n\n    const mbedtls_cipher_info_t *cipher_info;\n    const mbedtls_md_info_t *md_info;\n    mbedtls_cipher_context_t cipher_ctx;\n    mbedtls_md_context_t md_ctx;\n#if defined(_WIN32_WCE)\n    long filesize, offset;\n#elif defined(_WIN32)\n       LARGE_INTEGER li_size;\n    __int64 filesize, offset;\n#else\n      off_t filesize, offset;\n#endif\n\n    mbedtls_cipher_init( &cipher_ctx );\n    mbedtls_md_init( &md_ctx );\n\n    /*\n     * Parse the command-line arguments.\n     */\n    if( argc != 7 )\n    {\n        const int *list;\n\n        mbedtls_printf( USAGE );\n\n        mbedtls_printf( \"Available ciphers:\\n\" );\n        list = mbedtls_cipher_list();\n        while( *list )\n        {\n            cipher_info = mbedtls_cipher_info_from_type( *list );\n            mbedtls_printf( \"  %s\\n\", cipher_info->name );\n            list++;\n        }\n\n        mbedtls_printf( \"\\nAvailable message digests:\\n\" );\n        list = mbedtls_md_list();\n        while( *list )\n        {\n            md_info = mbedtls_md_info_from_type( *list );\n            mbedtls_printf( \"  %s\\n\", mbedtls_md_get_name( md_info ) );\n            list++;\n        }\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n  Press Enter to exit this program.\\n\" );\n        fflush( stdout ); getchar();\n#endif\n\n        goto exit;\n    }\n\n    mode = atoi( argv[1] );\n\n    if( mode != MODE_ENCRYPT && mode != MODE_DECRYPT )\n    {\n        mbedtls_fprintf( stderr, \"invalid operation mode\\n\" );\n        goto exit;\n    }\n\n    if( strcmp( argv[2], argv[3] ) == 0 )\n    {\n        mbedtls_fprintf( stderr, \"input and output filenames must differ\\n\" );\n        goto exit;\n    }\n\n    if( ( fin = fopen( argv[2], \"rb\" ) ) == NULL )\n    {\n        mbedtls_fprintf( stderr, \"fopen(%s,rb) failed\\n\", argv[2] );\n        goto exit;\n    }\n\n    if( ( fout = fopen( argv[3], \"wb+\" ) ) == NULL )\n    {\n        mbedtls_fprintf( stderr, \"fopen(%s,wb+) failed\\n\", argv[3] );\n        goto exit;\n    }\n\n    /*\n     * Read the Cipher and MD from the command line\n     */\n    cipher_info = mbedtls_cipher_info_from_string( argv[4] );\n    if( cipher_info == NULL )\n    {\n        mbedtls_fprintf( stderr, \"Cipher '%s' not found\\n\", argv[4] );\n        goto exit;\n    }\n    if( ( ret = mbedtls_cipher_setup( &cipher_ctx, cipher_info) ) != 0 )\n    {\n        mbedtls_fprintf( stderr, \"mbedtls_cipher_setup failed\\n\" );\n        goto exit;\n    }\n\n    md_info = mbedtls_md_info_from_string( argv[5] );\n    if( md_info == NULL )\n    {\n        mbedtls_fprintf( stderr, \"Message Digest '%s' not found\\n\", argv[5] );\n        goto exit;\n    }\n\n    if( mbedtls_md_setup( &md_ctx, md_info, 1 ) != 0 )\n    {\n        mbedtls_fprintf( stderr, \"mbedtls_md_setup failed\\n\" );\n        goto exit;\n    }\n\n    /*\n     * Read the secret key from file or command line\n     */\n    if( ( fkey = fopen( argv[6], \"rb\" ) ) != NULL )\n    {\n        keylen = fread( key, 1, sizeof( key ), fkey );\n        fclose( fkey );\n    }\n    else\n    {\n        if( memcmp( argv[6], \"hex:\", 4 ) == 0 )\n        {\n            p = &argv[6][4];\n            keylen = 0;\n\n            while( sscanf( p, \"%02X\", &n ) > 0 &&\n                   keylen < (int) sizeof( key ) )\n            {\n                key[keylen++] = (unsigned char) n;\n                p += 2;\n            }\n        }\n        else\n        {\n            keylen = strlen( argv[6] );\n\n            if( keylen > (int) sizeof( key ) )\n                keylen = (int) sizeof( key );\n\n            memcpy( key, argv[6], keylen );\n        }\n    }\n\n#if defined(_WIN32_WCE)\n    filesize = fseek( fin, 0L, SEEK_END );\n#else\n#if defined(_WIN32)\n    /*\n     * Support large files (> 2Gb) on Win32\n     */\n    li_size.QuadPart = 0;\n    li_size.LowPart  =\n        SetFilePointer( (HANDLE) _get_osfhandle( _fileno( fin ) ),\n                        li_size.LowPart, &li_size.HighPart, FILE_END );\n\n    if( li_size.LowPart == 0xFFFFFFFF && GetLastError() != NO_ERROR )\n    {\n        mbedtls_fprintf( stderr, \"SetFilePointer(0,FILE_END) failed\\n\" );\n        goto exit;\n    }\n\n    filesize = li_size.QuadPart;\n#else\n    if( ( filesize = lseek( fileno( fin ), 0, SEEK_END ) ) < 0 )\n    {\n        perror( \"lseek\" );\n        goto exit;\n    }\n#endif\n#endif\n\n    if( fseek( fin, 0, SEEK_SET ) < 0 )\n    {\n        mbedtls_fprintf( stderr, \"fseek(0,SEEK_SET) failed\\n\" );\n        goto exit;\n    }\n\n    if( mode == MODE_ENCRYPT )\n    {\n        /*\n         * Generate the initialization vector as:\n         * IV = MD( filesize || filename )[0..15]\n         */\n        for( i = 0; i < 8; i++ )\n            buffer[i] = (unsigned char)( filesize >> ( i << 3 ) );\n\n        p = argv[2];\n\n        mbedtls_md_starts( &md_ctx );\n        mbedtls_md_update( &md_ctx, buffer, 8 );\n        mbedtls_md_update( &md_ctx, (unsigned char *) p, strlen( p ) );\n        mbedtls_md_finish( &md_ctx, digest );\n\n        memcpy( IV, digest, 16 );\n\n        /*\n         * Append the IV at the beginning of the output.\n         */\n        if( fwrite( IV, 1, 16, fout ) != 16 )\n        {\n            mbedtls_fprintf( stderr, \"fwrite(%d bytes) failed\\n\", 16 );\n            goto exit;\n        }\n\n        /*\n         * Hash the IV and the secret key together 8192 times\n         * using the result to setup the AES context and HMAC.\n         */\n        memset( digest, 0,  32 );\n        memcpy( digest, IV, 16 );\n\n        for( i = 0; i < 8192; i++ )\n        {\n            mbedtls_md_starts( &md_ctx );\n            mbedtls_md_update( &md_ctx, digest, 32 );\n            mbedtls_md_update( &md_ctx, key, keylen );\n            mbedtls_md_finish( &md_ctx, digest );\n\n        }\n\n        if( mbedtls_cipher_setkey( &cipher_ctx, digest, cipher_info->key_bitlen,\n                           MBEDTLS_ENCRYPT ) != 0 )\n        {\n            mbedtls_fprintf( stderr, \"mbedtls_cipher_setkey() returned error\\n\");\n            goto exit;\n        }\n        if( mbedtls_cipher_set_iv( &cipher_ctx, IV, 16 ) != 0 )\n        {\n            mbedtls_fprintf( stderr, \"mbedtls_cipher_set_iv() returned error\\n\");\n            goto exit;\n        }\n        if( mbedtls_cipher_reset( &cipher_ctx ) != 0 )\n        {\n            mbedtls_fprintf( stderr, \"mbedtls_cipher_reset() returned error\\n\");\n            goto exit;\n        }\n\n        mbedtls_md_hmac_starts( &md_ctx, digest, 32 );\n\n        /*\n         * Encrypt and write the ciphertext.\n         */\n        for( offset = 0; offset < filesize; offset += mbedtls_cipher_get_block_size( &cipher_ctx ) )\n        {\n            ilen = ( (unsigned int) filesize - offset > mbedtls_cipher_get_block_size( &cipher_ctx ) ) ?\n                mbedtls_cipher_get_block_size( &cipher_ctx ) : (unsigned int) ( filesize - offset );\n\n            if( fread( buffer, 1, ilen, fin ) != ilen )\n            {\n                mbedtls_fprintf( stderr, \"fread(%ld bytes) failed\\n\", (long) ilen );\n                goto exit;\n            }\n\n            if( mbedtls_cipher_update( &cipher_ctx, buffer, ilen, output, &olen ) != 0 )\n            {\n                mbedtls_fprintf( stderr, \"mbedtls_cipher_update() returned error\\n\");\n                goto exit;\n            }\n\n            mbedtls_md_hmac_update( &md_ctx, output, olen );\n\n            if( fwrite( output, 1, olen, fout ) != olen )\n            {\n                mbedtls_fprintf( stderr, \"fwrite(%ld bytes) failed\\n\", (long) olen );\n                goto exit;\n            }\n        }\n\n        if( mbedtls_cipher_finish( &cipher_ctx, output, &olen ) != 0 )\n        {\n            mbedtls_fprintf( stderr, \"mbedtls_cipher_finish() returned error\\n\" );\n            goto exit;\n        }\n        mbedtls_md_hmac_update( &md_ctx, output, olen );\n\n        if( fwrite( output, 1, olen, fout ) != olen )\n        {\n            mbedtls_fprintf( stderr, \"fwrite(%ld bytes) failed\\n\", (long) olen );\n            goto exit;\n        }\n\n        /*\n         * Finally write the HMAC.\n         */\n        mbedtls_md_hmac_finish( &md_ctx, digest );\n\n        if( fwrite( digest, 1, mbedtls_md_get_size( md_info ), fout ) != mbedtls_md_get_size( md_info ) )\n        {\n            mbedtls_fprintf( stderr, \"fwrite(%d bytes) failed\\n\", mbedtls_md_get_size( md_info ) );\n            goto exit;\n        }\n    }\n\n    if( mode == MODE_DECRYPT )\n    {\n        /*\n         *  The encrypted file must be structured as follows:\n         *\n         *        00 .. 15              Initialization Vector\n         *        16 .. 31              Encrypted Block #1\n         *           ..\n         *      N*16 .. (N+1)*16 - 1    Encrypted Block #N\n         *  (N+1)*16 .. (N+1)*16 + n    Hash(ciphertext)\n         */\n        if( filesize < 16 + mbedtls_md_get_size( md_info ) )\n        {\n            mbedtls_fprintf( stderr, \"File too short to be encrypted.\\n\" );\n            goto exit;\n        }\n\n        if( mbedtls_cipher_get_block_size( &cipher_ctx ) == 0 )\n        {\n            mbedtls_fprintf( stderr, \"Invalid cipher block size: 0. \\n\" );\n            goto exit;\n        }\n\n        /*\n         * Check the file size.\n         */\n        if( cipher_info->mode != MBEDTLS_MODE_GCM &&\n            ( ( filesize - mbedtls_md_get_size( md_info ) ) %\n                mbedtls_cipher_get_block_size( &cipher_ctx ) ) != 0 )\n        {\n            mbedtls_fprintf( stderr, \"File content not a multiple of the block size (%d).\\n\",\n                     mbedtls_cipher_get_block_size( &cipher_ctx ));\n            goto exit;\n        }\n\n        /*\n         * Subtract the IV + HMAC length.\n         */\n        filesize -= ( 16 + mbedtls_md_get_size( md_info ) );\n\n        /*\n         * Read the IV and original filesize modulo 16.\n         */\n        if( fread( buffer, 1, 16, fin ) != 16 )\n        {\n            mbedtls_fprintf( stderr, \"fread(%d bytes) failed\\n\", 16 );\n            goto exit;\n        }\n\n        memcpy( IV, buffer, 16 );\n\n        /*\n         * Hash the IV and the secret key together 8192 times\n         * using the result to setup the AES context and HMAC.\n         */\n        memset( digest, 0,  32 );\n        memcpy( digest, IV, 16 );\n\n        for( i = 0; i < 8192; i++ )\n        {\n            mbedtls_md_starts( &md_ctx );\n            mbedtls_md_update( &md_ctx, digest, 32 );\n            mbedtls_md_update( &md_ctx, key, keylen );\n            mbedtls_md_finish( &md_ctx, digest );\n        }\n\n        if( mbedtls_cipher_setkey( &cipher_ctx, digest, cipher_info->key_bitlen,\n                           MBEDTLS_DECRYPT ) != 0 )\n        {\n            mbedtls_fprintf( stderr, \"mbedtls_cipher_setkey() returned error\\n\" );\n            goto exit;\n        }\n\n        if( mbedtls_cipher_set_iv( &cipher_ctx, IV, 16 ) != 0 )\n        {\n            mbedtls_fprintf( stderr, \"mbedtls_cipher_set_iv() returned error\\n\" );\n            goto exit;\n        }\n\n        if( mbedtls_cipher_reset( &cipher_ctx ) != 0 )\n        {\n            mbedtls_fprintf( stderr, \"mbedtls_cipher_reset() returned error\\n\" );\n            goto exit;\n        }\n\n        mbedtls_md_hmac_starts( &md_ctx, digest, 32 );\n\n        /*\n         * Decrypt and write the plaintext.\n         */\n        for( offset = 0; offset < filesize; offset += mbedtls_cipher_get_block_size( &cipher_ctx ) )\n        {\n            ilen = ( (unsigned int) filesize - offset > mbedtls_cipher_get_block_size( &cipher_ctx ) ) ?\n                mbedtls_cipher_get_block_size( &cipher_ctx ) : (unsigned int) ( filesize - offset );\n\n            if( fread( buffer, 1, ilen, fin ) != ilen )\n            {\n                mbedtls_fprintf( stderr, \"fread(%d bytes) failed\\n\",\n                    mbedtls_cipher_get_block_size( &cipher_ctx ) );\n                goto exit;\n            }\n\n            mbedtls_md_hmac_update( &md_ctx, buffer, ilen );\n            if( mbedtls_cipher_update( &cipher_ctx, buffer, ilen, output,\n                                       &olen ) != 0 )\n            {\n                mbedtls_fprintf( stderr, \"mbedtls_cipher_update() returned error\\n\" );\n                goto exit;\n            }\n\n            if( fwrite( output, 1, olen, fout ) != olen )\n            {\n                mbedtls_fprintf( stderr, \"fwrite(%ld bytes) failed\\n\", (long) olen );\n                goto exit;\n            }\n        }\n\n        /*\n         * Verify the message authentication code.\n         */\n        mbedtls_md_hmac_finish( &md_ctx, digest );\n\n        if( fread( buffer, 1, mbedtls_md_get_size( md_info ), fin ) != mbedtls_md_get_size( md_info ) )\n        {\n            mbedtls_fprintf( stderr, \"fread(%d bytes) failed\\n\", mbedtls_md_get_size( md_info ) );\n            goto exit;\n        }\n\n        /* Use constant-time buffer comparison */\n        diff = 0;\n        for( i = 0; i < mbedtls_md_get_size( md_info ); i++ )\n            diff |= digest[i] ^ buffer[i];\n\n        if( diff != 0 )\n        {\n            mbedtls_fprintf( stderr, \"HMAC check failed: wrong key, \"\n                             \"or file corrupted.\\n\" );\n            goto exit;\n        }\n\n        /*\n         * Write the final block of data\n         */\n        mbedtls_cipher_finish( &cipher_ctx, output, &olen );\n\n        if( fwrite( output, 1, olen, fout ) != olen )\n        {\n            mbedtls_fprintf( stderr, \"fwrite(%ld bytes) failed\\n\", (long) olen );\n            goto exit;\n        }\n    }\n\n    ret = 0;\n\nexit:\n    if( fin )\n        fclose( fin );\n    if( fout )\n        fclose( fout );\n\n    /* Zeroize all command line arguments to also cover\n       the case when the user has missed or reordered some,\n       in which case the key might not be in argv[6]. */\n    for( i = 0; i < argc; i++ )\n        memset( argv[i], 0, strlen( argv[i] ) );\n\n    memset( IV,     0, sizeof( IV ) );\n    memset( key,    0, sizeof( key ) );\n    memset( buffer, 0, sizeof( buffer ) );\n    memset( output, 0, sizeof( output ) );\n    memset( digest, 0, sizeof( digest ) );\n\n    mbedtls_cipher_free( &cipher_ctx );\n    mbedtls_md_free( &md_ctx );\n\n    return( ret );\n}\n#endif /* MBEDTLS_CIPHER_C && MBEDTLS_MD_C && MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/hash/CMakeLists.txt",
    "content": "add_executable(hello hello.c)\ntarget_link_libraries(hello mbedtls)\n\nadd_executable(generic_sum generic_sum.c)\ntarget_link_libraries(generic_sum mbedtls)\n\ninstall(TARGETS hello generic_sum\n        DESTINATION \"bin\"\n        PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/hash/generic_sum.c",
    "content": "/*\n *  generic message digest layer demonstration program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_MD_C) && defined(MBEDTLS_FS_IO)\n#include \"mbedtls/md.h\"\n\n#include <stdio.h>\n#include <string.h>\n#endif\n\n#if !defined(MBEDTLS_MD_C) || !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_MD_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\nstatic int generic_wrapper( const mbedtls_md_info_t *md_info, char *filename, unsigned char *sum )\n{\n    int ret = mbedtls_md_file( md_info, filename, sum );\n\n    if( ret == 1 )\n        mbedtls_fprintf( stderr, \"failed to open: %s\\n\", filename );\n\n    if( ret == 2 )\n        mbedtls_fprintf( stderr, \"failed to read: %s\\n\", filename );\n\n    return( ret );\n}\n\nstatic int generic_print( const mbedtls_md_info_t *md_info, char *filename )\n{\n    int i;\n    unsigned char sum[MBEDTLS_MD_MAX_SIZE];\n\n    if( generic_wrapper( md_info, filename, sum ) != 0 )\n        return( 1 );\n\n    for( i = 0; i < mbedtls_md_get_size( md_info ); i++ )\n        mbedtls_printf( \"%02x\", sum[i] );\n\n    mbedtls_printf( \"  %s\\n\", filename );\n    return( 0 );\n}\n\nstatic int generic_check( const mbedtls_md_info_t *md_info, char *filename )\n{\n    int i;\n    size_t n;\n    FILE *f;\n    int nb_err1, nb_err2;\n    int nb_tot1, nb_tot2;\n    unsigned char sum[MBEDTLS_MD_MAX_SIZE];\n    char line[1024];\n    char diff;\n#if defined(__clang_analyzer__)\n    char buf[MBEDTLS_MD_MAX_SIZE * 2 + 1] = { };\n#else\n    char buf[MBEDTLS_MD_MAX_SIZE * 2 + 1];\n#endif\n\n    if( ( f = fopen( filename, \"rb\" ) ) == NULL )\n    {\n        mbedtls_printf( \"failed to open: %s\\n\", filename );\n        return( 1 );\n    }\n\n    nb_err1 = nb_err2 = 0;\n    nb_tot1 = nb_tot2 = 0;\n\n    memset( line, 0, sizeof( line ) );\n\n    n = sizeof( line );\n\n    while( fgets( line, (int) n - 1, f ) != NULL )\n    {\n        n = strlen( line );\n\n        if( n < (size_t) 2 * mbedtls_md_get_size( md_info ) + 4 )\n        {\n            mbedtls_printf(\"No '%s' hash found on line.\\n\", mbedtls_md_get_name( md_info ));\n            continue;\n        }\n\n        if( line[2 * mbedtls_md_get_size( md_info )] != ' ' || line[2 * mbedtls_md_get_size( md_info ) + 1] != ' ' )\n        {\n            mbedtls_printf(\"No '%s' hash found on line.\\n\", mbedtls_md_get_name( md_info ));\n            continue;\n        }\n\n        if( line[n - 1] == '\\n' ) { n--; line[n] = '\\0'; }\n        if( line[n - 1] == '\\r' ) { n--; line[n] = '\\0'; }\n\n        nb_tot1++;\n\n        if( generic_wrapper( md_info, line + 2 + 2 * mbedtls_md_get_size( md_info ), sum ) != 0 )\n        {\n            nb_err1++;\n            continue;\n        }\n\n        nb_tot2++;\n\n        for( i = 0; i < mbedtls_md_get_size( md_info ); i++ )\n            sprintf( buf + i * 2, \"%02x\", sum[i] );\n\n        /* Use constant-time buffer comparison */\n        diff = 0;\n        for( i = 0; i < 2 * mbedtls_md_get_size( md_info ); i++ )\n            diff |= line[i] ^ buf[i];\n\n        if( diff != 0 )\n        {\n            nb_err2++;\n            mbedtls_fprintf( stderr, \"wrong checksum: %s\\n\", line + 66 );\n        }\n\n        n = sizeof( line );\n    }\n\n    if( nb_err1 != 0 )\n    {\n        mbedtls_printf( \"WARNING: %d (out of %d) input files could \"\n                \"not be read\\n\", nb_err1, nb_tot1 );\n    }\n\n    if( nb_err2 != 0 )\n    {\n        mbedtls_printf( \"WARNING: %d (out of %d) computed checksums did \"\n                \"not match\\n\", nb_err2, nb_tot2 );\n    }\n\n    fclose( f );\n\n    return( nb_err1 != 0 || nb_err2 != 0 );\n}\n\nint main( int argc, char *argv[] )\n{\n    int ret, i;\n    const mbedtls_md_info_t *md_info;\n    mbedtls_md_context_t md_ctx;\n\n    mbedtls_md_init( &md_ctx );\n\n    if( argc == 1 )\n    {\n        const int *list;\n\n        mbedtls_printf( \"print mode:  generic_sum <mbedtls_md> <file> <file> ...\\n\" );\n        mbedtls_printf( \"check mode:  generic_sum <mbedtls_md> -c <checksum file>\\n\" );\n\n        mbedtls_printf( \"\\nAvailable message digests:\\n\" );\n        list = mbedtls_md_list();\n        while( *list )\n        {\n            md_info = mbedtls_md_info_from_type( *list );\n            mbedtls_printf( \"  %s\\n\", mbedtls_md_get_name( md_info ) );\n            list++;\n        }\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n  Press Enter to exit this program.\\n\" );\n        fflush( stdout ); getchar();\n#endif\n\n        return( 1 );\n    }\n\n    /*\n     * Read the MD from the command line\n     */\n    md_info = mbedtls_md_info_from_string( argv[1] );\n    if( md_info == NULL )\n    {\n        mbedtls_fprintf( stderr, \"Message Digest '%s' not found\\n\", argv[1] );\n        return( 1 );\n    }\n    if( mbedtls_md_setup( &md_ctx, md_info, 0 ) )\n    {\n        mbedtls_fprintf( stderr, \"Failed to initialize context.\\n\" );\n        return( 1 );\n    }\n\n    ret = 0;\n    if( argc == 4 && strcmp( \"-c\", argv[2] ) == 0 )\n    {\n        ret |= generic_check( md_info, argv[3] );\n        goto exit;\n    }\n\n    for( i = 2; i < argc; i++ )\n        ret |= generic_print( md_info, argv[i] );\n\nexit:\n    mbedtls_md_free( &md_ctx );\n\n    return( ret );\n}\n#endif /* MBEDTLS_MD_C && MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/hash/hello.c",
    "content": "/*\n *  Classic \"Hello, world\" demonstration program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_MD5_C)\n#include \"mbedtls/md5.h\"\n#endif\n\n#if !defined(MBEDTLS_MD5_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_MD5_C not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( void )\n{\n    int i;\n    unsigned char digest[16];\n    char str[] = \"Hello, world!\";\n\n    mbedtls_printf( \"\\n  MD5('%s') = \", str );\n\n    mbedtls_md5( (unsigned char *) str, 13, digest );\n\n    for( i = 0; i < 16; i++ )\n        mbedtls_printf( \"%02x\", digest[i] );\n\n    mbedtls_printf( \"\\n\\n\" );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( 0 );\n}\n#endif /* MBEDTLS_MD5_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/CMakeLists.txt",
    "content": "add_executable(dh_client dh_client.c)\ntarget_link_libraries(dh_client mbedtls)\n\nadd_executable(dh_genprime dh_genprime.c)\ntarget_link_libraries(dh_genprime mbedtls)\n\nadd_executable(dh_server dh_server.c)\ntarget_link_libraries(dh_server mbedtls)\n\nadd_executable(ecdh_curve25519 ecdh_curve25519.c)\ntarget_link_libraries(ecdh_curve25519 mbedtls)\n\nadd_executable(ecdsa ecdsa.c)\ntarget_link_libraries(ecdsa mbedtls)\n\nadd_executable(gen_key gen_key.c)\ntarget_link_libraries(gen_key mbedtls)\n\nadd_executable(key_app key_app.c)\ntarget_link_libraries(key_app mbedtls)\n\nadd_executable(key_app_writer key_app_writer.c)\ntarget_link_libraries(key_app_writer mbedtls)\n\nadd_executable(mpi_demo mpi_demo.c)\ntarget_link_libraries(mpi_demo mbedtls)\n\nadd_executable(rsa_genkey rsa_genkey.c)\ntarget_link_libraries(rsa_genkey mbedtls)\n\nadd_executable(rsa_sign rsa_sign.c)\ntarget_link_libraries(rsa_sign mbedtls)\n\nadd_executable(rsa_verify rsa_verify.c)\ntarget_link_libraries(rsa_verify mbedtls)\n\nadd_executable(rsa_sign_pss rsa_sign_pss.c)\ntarget_link_libraries(rsa_sign_pss mbedtls)\n\nadd_executable(rsa_verify_pss rsa_verify_pss.c)\ntarget_link_libraries(rsa_verify_pss mbedtls)\n\nadd_executable(rsa_encrypt rsa_encrypt.c)\ntarget_link_libraries(rsa_encrypt mbedtls)\n\nadd_executable(rsa_decrypt rsa_decrypt.c)\ntarget_link_libraries(rsa_decrypt mbedtls)\n\nadd_executable(pk_sign pk_sign.c)\ntarget_link_libraries(pk_sign mbedtls)\n\nadd_executable(pk_verify pk_verify.c)\ntarget_link_libraries(pk_verify mbedtls)\n\nadd_executable(pk_encrypt pk_encrypt.c)\ntarget_link_libraries(pk_encrypt mbedtls)\n\nadd_executable(pk_decrypt pk_decrypt.c)\ntarget_link_libraries(pk_decrypt mbedtls)\n\ninstall(TARGETS dh_client dh_genprime dh_server key_app mpi_demo rsa_genkey rsa_sign rsa_verify rsa_encrypt rsa_decrypt pk_encrypt pk_decrypt pk_sign pk_verify gen_key\n        DESTINATION \"bin\"\n        PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/dh_client.c",
    "content": "/*\n *  Diffie-Hellman-Merkle key exchange (client side)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#define mbedtls_time_t     time_t\n#endif\n\n#if defined(MBEDTLS_AES_C) && defined(MBEDTLS_DHM_C) && \\\n    defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_NET_C) && \\\n    defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA256_C) && \\\n    defined(MBEDTLS_FS_IO) && defined(MBEDTLS_CTR_DRBG_C) && \\\n    defined(MBEDTLS_SHA1_C)\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/aes.h\"\n#include \"mbedtls/dhm.h\"\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/sha1.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <stdio.h>\n#include <string.h>\n#endif\n\n#define SERVER_NAME \"localhost\"\n#define SERVER_PORT \"11999\"\n\n#if !defined(MBEDTLS_AES_C) || !defined(MBEDTLS_DHM_C) ||     \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_NET_C) ||  \\\n    !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_SHA256_C) ||    \\\n    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_CTR_DRBG_C) || \\\n    !defined(MBEDTLS_SHA1_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_AES_C and/or MBEDTLS_DHM_C and/or MBEDTLS_ENTROPY_C \"\n           \"and/or MBEDTLS_NET_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_SHA256_C and/or MBEDTLS_FS_IO and/or \"\n           \"MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( void )\n{\n    FILE *f;\n\n    int ret;\n    size_t n, buflen;\n    mbedtls_net_context server_fd;\n\n    unsigned char *p, *end;\n    unsigned char buf[2048];\n    unsigned char hash[32];\n    const char *pers = \"dh_client\";\n\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_rsa_context rsa;\n    mbedtls_dhm_context dhm;\n    mbedtls_aes_context aes;\n\n    mbedtls_net_init( &server_fd );\n    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256 );\n    mbedtls_dhm_init( &dhm );\n    mbedtls_aes_init( &aes );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    /*\n     * 1. Setup the RNG\n     */\n    mbedtls_printf( \"\\n  . Seeding the random number generator\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    /*\n     * 2. Read the server's public RSA key\n     */\n    mbedtls_printf( \"\\n  . Reading public key from rsa_pub.txt\" );\n    fflush( stdout );\n\n    if( ( f = fopen( \"rsa_pub.txt\", \"rb\" ) ) == NULL )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not open rsa_pub.txt\\n\" \\\n                \"  ! Please run rsa_genkey first\\n\\n\" );\n        goto exit;\n    }\n\n    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );\n\n    if( ( ret = mbedtls_mpi_read_file( &rsa.N, 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.E, 16, f ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_read_file returned %d\\n\\n\", ret );\n        fclose( f );\n        goto exit;\n    }\n\n    rsa.len = ( mbedtls_mpi_bitlen( &rsa.N ) + 7 ) >> 3;\n\n    fclose( f );\n\n    /*\n     * 3. Initiate the connection\n     */\n    mbedtls_printf( \"\\n  . Connecting to tcp/%s/%s\", SERVER_NAME,\n                                             SERVER_PORT );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_connect( &server_fd, SERVER_NAME,\n                                         SERVER_PORT, MBEDTLS_NET_PROTO_TCP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_connect returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /*\n     * 4a. First get the buffer length\n     */\n    mbedtls_printf( \"\\n  . Receiving the server's DH parameters\" );\n    fflush( stdout );\n\n    memset( buf, 0, sizeof( buf ) );\n\n    if( ( ret = mbedtls_net_recv( &server_fd, buf, 2 ) ) != 2 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_recv returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    n = buflen = ( buf[0] << 8 ) | buf[1];\n    if( buflen < 1 || buflen > sizeof( buf ) )\n    {\n        mbedtls_printf( \" failed\\n  ! Got an invalid buffer length\\n\\n\" );\n        goto exit;\n    }\n\n    /*\n     * 4b. Get the DHM parameters: P, G and Ys = G^Xs mod P\n     */\n    memset( buf, 0, sizeof( buf ) );\n\n    if( ( ret = mbedtls_net_recv( &server_fd, buf, n ) ) != (int) n )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_recv returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    p = buf, end = buf + buflen;\n\n    if( ( ret = mbedtls_dhm_read_params( &dhm, &p, end ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_dhm_read_params returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( dhm.len < 64 || dhm.len > 512 )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Invalid DHM modulus size\\n\\n\" );\n        goto exit;\n    }\n\n    /*\n     * 5. Check that the server's RSA signature matches\n     *    the SHA-256 hash of (P,G,Ys)\n     */\n    mbedtls_printf( \"\\n  . Verifying the server's RSA signature\" );\n    fflush( stdout );\n\n    p += 2;\n\n    if( ( n = (size_t) ( end - p ) ) != rsa.len )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Invalid RSA signature size\\n\\n\" );\n        goto exit;\n    }\n\n    mbedtls_sha1( buf, (int)( p - 2 - buf ), hash );\n\n    if( ( ret = mbedtls_rsa_pkcs1_verify( &rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC,\n                                  MBEDTLS_MD_SHA256, 0, hash, p ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_rsa_pkcs1_verify returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /*\n     * 6. Send our public value: Yc = G ^ Xc mod P\n     */\n    mbedtls_printf( \"\\n  . Sending own public value to server\" );\n    fflush( stdout );\n\n    n = dhm.len;\n    if( ( ret = mbedtls_dhm_make_public( &dhm, (int) dhm.len, buf, n,\n                                 mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_dhm_make_public returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_net_send( &server_fd, buf, n ) ) != (int) n )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_send returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /*\n     * 7. Derive the shared secret: K = Ys ^ Xc mod P\n     */\n    mbedtls_printf( \"\\n  . Shared secret: \" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_dhm_calc_secret( &dhm, buf, sizeof( buf ), &n,\n                                 mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_dhm_calc_secret returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    for( n = 0; n < 16; n++ )\n        mbedtls_printf( \"%02x\", buf[n] );\n\n    /*\n     * 8. Setup the AES-256 decryption key\n     *\n     * This is an overly simplified example; best practice is\n     * to hash the shared secret with a random value to derive\n     * the keying material for the encryption/decryption keys,\n     * IVs and MACs.\n     */\n    mbedtls_printf( \"...\\n  . Receiving and decrypting the ciphertext\" );\n    fflush( stdout );\n\n    mbedtls_aes_setkey_dec( &aes, buf, 256 );\n\n    memset( buf, 0, sizeof( buf ) );\n\n    if( ( ret = mbedtls_net_recv( &server_fd, buf, 16 ) ) != 16 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_recv returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_aes_crypt_ecb( &aes, MBEDTLS_AES_DECRYPT, buf, buf );\n    buf[16] = '\\0';\n    mbedtls_printf( \"\\n  . Plaintext is \\\"%s\\\"\\n\\n\", (char *) buf );\n\nexit:\n\n    mbedtls_net_free( &server_fd );\n\n    mbedtls_aes_free( &aes );\n    mbedtls_rsa_free( &rsa );\n    mbedtls_dhm_free( &dhm );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_AES_C && MBEDTLS_DHM_C && MBEDTLS_ENTROPY_C &&\n          MBEDTLS_NET_C && MBEDTLS_RSA_C && MBEDTLS_SHA256_C &&\n          MBEDTLS_FS_IO && MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/dh_genprime.c",
    "content": "/*\n *  Diffie-Hellman-Merkle key exchange (prime generation)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_printf     printf\n#define mbedtls_time_t     time_t\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_ENTROPY_C) ||   \\\n    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_CTR_DRBG_C) ||     \\\n    !defined(MBEDTLS_GENPRIME)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_FS_IO and/or MBEDTLS_CTR_DRBG_C and/or \"\n           \"MBEDTLS_GENPRIME not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/bignum.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <stdio.h>\n#include <string.h>\n\n#define USAGE \\\n    \"\\n usage: dh_genprime param=<>...\\n\"                                   \\\n    \"\\n acceprable parameters:\\n\"                                           \\\n    \"    bits=%%d           default: 2048\\n\"\n\n#define DFL_BITS    2048\n\n/*\n * Note: G = 4 is always a quadratic residue mod P,\n * so it is a generator of order Q (with P = 2*Q+1).\n */\n#define GENERATOR \"4\"\n\nint main( int argc, char **argv )\n{\n    int ret = 1;\n    mbedtls_mpi G, P, Q;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    const char *pers = \"dh_genprime\";\n    FILE *fout;\n    int nbits = DFL_BITS;\n    int i;\n    char *p, *q;\n\n    mbedtls_mpi_init( &G ); mbedtls_mpi_init( &P ); mbedtls_mpi_init( &Q );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n    mbedtls_entropy_init( &entropy );\n\n    if( argc == 0 )\n    {\n    usage:\n        mbedtls_printf( USAGE );\n        return( 1 );\n    }\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"bits\" ) == 0 )\n        {\n            nbits = atoi( q );\n            if( nbits < 0 || nbits > MBEDTLS_MPI_MAX_BITS )\n                goto usage;\n        }\n        else\n            goto usage;\n    }\n\n    if( ( ret = mbedtls_mpi_read_string( &G, 10, GENERATOR ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_read_string returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"  ! Generating large primes may take minutes!\\n\" );\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n  . Generating the modulus, please wait...\" );\n    fflush( stdout );\n\n    /*\n     * This can take a long time...\n     */\n    if( ( ret = mbedtls_mpi_gen_prime( &P, nbits, 1,\n                               mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_gen_prime returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n  . Verifying that Q = (P-1)/2 is prime...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_mpi_sub_int( &Q, &P, 1 ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_sub_int returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_mpi_div_int( &Q, NULL, &Q, 2 ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_div_int returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_mpi_is_prime( &Q, mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_is_prime returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n  . Exporting the value in dh_prime.txt...\" );\n    fflush( stdout );\n\n    if( ( fout = fopen( \"dh_prime.txt\", \"wb+\" ) ) == NULL )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not create dh_prime.txt\\n\\n\" );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_mpi_write_file( \"P = \", &P, 16, fout ) != 0 ) ||\n        ( ret = mbedtls_mpi_write_file( \"G = \", &G, 16, fout ) != 0 ) )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_write_file returned %d\\n\\n\", ret );\n        fclose( fout );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\\n\" );\n    fclose( fout );\n\nexit:\n\n    mbedtls_mpi_free( &G ); mbedtls_mpi_free( &P ); mbedtls_mpi_free( &Q );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C && MBEDTLS_FS_IO &&\n          MBEDTLS_CTR_DRBG_C && MBEDTLS_GENPRIME */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/dh_prime.txt",
    "content": "P = FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF\nG = 02\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/dh_server.c",
    "content": "/*\n *  Diffie-Hellman-Merkle key exchange (server side)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#define mbedtls_time_t     time_t\n#endif\n\n#if defined(MBEDTLS_AES_C) && defined(MBEDTLS_DHM_C) && \\\n    defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_NET_C) && \\\n    defined(MBEDTLS_RSA_C) && defined(MBEDTLS_SHA256_C) && \\\n    defined(MBEDTLS_FS_IO) && defined(MBEDTLS_CTR_DRBG_C) && \\\n    defined(MBEDTLS_SHA1_C)\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/aes.h\"\n#include \"mbedtls/dhm.h\"\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/sha1.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <stdio.h>\n#include <string.h>\n#endif\n\n#define SERVER_PORT \"11999\"\n#define PLAINTEXT \"==Hello there!==\"\n\n#if !defined(MBEDTLS_AES_C) || !defined(MBEDTLS_DHM_C) ||     \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_NET_C) ||  \\\n    !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_SHA256_C) ||    \\\n    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_CTR_DRBG_C) || \\\n    !defined(MBEDTLS_SHA1_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_AES_C and/or MBEDTLS_DHM_C and/or MBEDTLS_ENTROPY_C \"\n           \"and/or MBEDTLS_NET_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_SHA256_C and/or MBEDTLS_FS_IO and/or \"\n           \"MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( void )\n{\n    FILE *f;\n\n    int ret;\n    size_t n, buflen;\n    mbedtls_net_context listen_fd, client_fd;\n\n    unsigned char buf[2048];\n    unsigned char hash[32];\n    unsigned char buf2[2];\n    const char *pers = \"dh_server\";\n\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_rsa_context rsa;\n    mbedtls_dhm_context dhm;\n    mbedtls_aes_context aes;\n\n    mbedtls_net_init( &listen_fd );\n    mbedtls_net_init( &client_fd );\n    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, MBEDTLS_MD_SHA256 );\n    mbedtls_dhm_init( &dhm );\n    mbedtls_aes_init( &aes );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    /*\n     * 1. Setup the RNG\n     */\n    mbedtls_printf( \"\\n  . Seeding the random number generator\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    /*\n     * 2a. Read the server's private RSA key\n     */\n    mbedtls_printf( \"\\n  . Reading private key from rsa_priv.txt\" );\n    fflush( stdout );\n\n    if( ( f = fopen( \"rsa_priv.txt\", \"rb\" ) ) == NULL )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not open rsa_priv.txt\\n\" \\\n                \"  ! Please run rsa_genkey first\\n\\n\" );\n        goto exit;\n    }\n\n    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );\n\n    if( ( ret = mbedtls_mpi_read_file( &rsa.N , 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.E , 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.D , 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.P , 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.Q , 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.DP, 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.DQ, 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.QP, 16, f ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_read_file returned %d\\n\\n\", ret );\n        fclose( f );\n        goto exit;\n    }\n\n    rsa.len = ( mbedtls_mpi_bitlen( &rsa.N ) + 7 ) >> 3;\n\n    fclose( f );\n\n    /*\n     * 2b. Get the DHM modulus and generator\n     */\n    mbedtls_printf( \"\\n  . Reading DH parameters from dh_prime.txt\" );\n    fflush( stdout );\n\n    if( ( f = fopen( \"dh_prime.txt\", \"rb\" ) ) == NULL )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not open dh_prime.txt\\n\" \\\n                \"  ! Please run dh_genprime first\\n\\n\" );\n        goto exit;\n    }\n\n    if( mbedtls_mpi_read_file( &dhm.P, 16, f ) != 0 ||\n        mbedtls_mpi_read_file( &dhm.G, 16, f ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! Invalid DH parameter file\\n\\n\" );\n        fclose( f );\n        goto exit;\n    }\n\n    fclose( f );\n\n    /*\n     * 3. Wait for a client to connect\n     */\n    mbedtls_printf( \"\\n  . Waiting for a remote connection\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_bind( &listen_fd, NULL, SERVER_PORT, MBEDTLS_NET_PROTO_TCP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_bind returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_net_accept( &listen_fd, &client_fd,\n                                    NULL, 0, NULL ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_accept returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /*\n     * 4. Setup the DH parameters (P,G,Ys)\n     */\n    mbedtls_printf( \"\\n  . Sending the server's DH parameters\" );\n    fflush( stdout );\n\n    memset( buf, 0, sizeof( buf ) );\n\n    if( ( ret = mbedtls_dhm_make_params( &dhm, (int) mbedtls_mpi_size( &dhm.P ), buf, &n,\n                                 mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_dhm_make_params returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /*\n     * 5. Sign the parameters and send them\n     */\n    mbedtls_sha1( buf, n, hash );\n\n    buf[n    ] = (unsigned char)( rsa.len >> 8 );\n    buf[n + 1] = (unsigned char)( rsa.len      );\n\n    if( ( ret = mbedtls_rsa_pkcs1_sign( &rsa, NULL, NULL, MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA256,\n                                0, hash, buf + n + 2 ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_rsa_pkcs1_sign returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    buflen = n + 2 + rsa.len;\n    buf2[0] = (unsigned char)( buflen >> 8 );\n    buf2[1] = (unsigned char)( buflen      );\n\n    if( ( ret = mbedtls_net_send( &client_fd, buf2, 2 ) ) != 2 ||\n        ( ret = mbedtls_net_send( &client_fd, buf, buflen ) ) != (int) buflen )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_send returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /*\n     * 6. Get the client's public value: Yc = G ^ Xc mod P\n     */\n    mbedtls_printf( \"\\n  . Receiving the client's public value\" );\n    fflush( stdout );\n\n    memset( buf, 0, sizeof( buf ) );\n\n    if( ( ret = mbedtls_net_recv( &client_fd, buf, n ) ) != (int) n )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_recv returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_dhm_read_public( &dhm, buf, dhm.len ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_dhm_read_public returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /*\n     * 7. Derive the shared secret: K = Ys ^ Xc mod P\n     */\n    mbedtls_printf( \"\\n  . Shared secret: \" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_dhm_calc_secret( &dhm, buf, sizeof( buf ), &n,\n                                 mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_dhm_calc_secret returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    for( n = 0; n < 16; n++ )\n        mbedtls_printf( \"%02x\", buf[n] );\n\n    /*\n     * 8. Setup the AES-256 encryption key\n     *\n     * This is an overly simplified example; best practice is\n     * to hash the shared secret with a random value to derive\n     * the keying material for the encryption/decryption keys\n     * and MACs.\n     */\n    mbedtls_printf( \"...\\n  . Encrypting and sending the ciphertext\" );\n    fflush( stdout );\n\n    mbedtls_aes_setkey_enc( &aes, buf, 256 );\n    memcpy( buf, PLAINTEXT, 16 );\n    mbedtls_aes_crypt_ecb( &aes, MBEDTLS_AES_ENCRYPT, buf, buf );\n\n    if( ( ret = mbedtls_net_send( &client_fd, buf, 16 ) ) != 16 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_send returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n\\n\" );\n\nexit:\n\n    mbedtls_net_free( &client_fd );\n    mbedtls_net_free( &listen_fd );\n\n    mbedtls_aes_free( &aes );\n    mbedtls_rsa_free( &rsa );\n    mbedtls_dhm_free( &dhm );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_AES_C && MBEDTLS_DHM_C && MBEDTLS_ENTROPY_C &&\n          MBEDTLS_NET_C && MBEDTLS_RSA_C && MBEDTLS_SHA256_C &&\n          MBEDTLS_FS_IO && MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/ecdh_curve25519.c",
    "content": "/*\n *  Example ECDHE with Curve25519 program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_ECDH_C) || \\\n    !defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED) || \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf( \"MBEDTLS_ECDH_C and/or \"\n                    \"MBEDTLS_ECP_DP_CURVE25519_ENABLED and/or \"\n                    \"MBEDTLS_ENTROPY_C and/or MBEDTLS_CTR_DRBG_C \"\n                    \"not defined\\n\" );\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/ecdh.h\"\n\nint main( int argc, char *argv[] )\n{\n    int ret;\n    mbedtls_ecdh_context ctx_cli, ctx_srv;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    unsigned char cli_to_srv[32], srv_to_cli[32];\n    const char pers[] = \"ecdh\";\n    ((void) argc);\n    ((void) argv);\n\n    mbedtls_ecdh_init( &ctx_cli );\n    mbedtls_ecdh_init( &ctx_srv );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    /*\n     * Initialize random number generation\n     */\n    mbedtls_printf( \"  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               sizeof pers ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * Client: inialize context and generate keypair\n     */\n    mbedtls_printf( \"  . Setting up client context...\" );\n    fflush( stdout );\n\n    ret = mbedtls_ecp_group_load( &ctx_cli.grp, MBEDTLS_ECP_DP_CURVE25519 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecp_group_load returned %d\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_ecdh_gen_public( &ctx_cli.grp, &ctx_cli.d, &ctx_cli.Q,\n                                   mbedtls_ctr_drbg_random, &ctr_drbg );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecdh_gen_public returned %d\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_mpi_write_binary( &ctx_cli.Q.X, cli_to_srv, 32 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_write_binary returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * Server: initialize context and generate keypair\n     */\n    mbedtls_printf( \"  . Setting up server context...\" );\n    fflush( stdout );\n\n    ret = mbedtls_ecp_group_load( &ctx_srv.grp, MBEDTLS_ECP_DP_CURVE25519 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecp_group_load returned %d\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_ecdh_gen_public( &ctx_srv.grp, &ctx_srv.d, &ctx_srv.Q,\n                                   mbedtls_ctr_drbg_random, &ctr_drbg );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecdh_gen_public returned %d\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_mpi_write_binary( &ctx_srv.Q.X, srv_to_cli, 32 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_write_binary returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * Server: read peer's key and generate shared secret\n     */\n    mbedtls_printf( \"  . Server reading client key and computing secret...\" );\n    fflush( stdout );\n\n    ret = mbedtls_mpi_lset( &ctx_srv.Qp.Z, 1 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_lset returned %d\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_mpi_read_binary( &ctx_srv.Qp.X, cli_to_srv, 32 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_read_binary returned %d\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_ecdh_compute_shared( &ctx_srv.grp, &ctx_srv.z,\n                                       &ctx_srv.Qp, &ctx_srv.d,\n                                       mbedtls_ctr_drbg_random, &ctr_drbg );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecdh_compute_shared returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * Client: read peer's key and generate shared secret\n     */\n    mbedtls_printf( \"  . Client reading server key and computing secret...\" );\n    fflush( stdout );\n\n    ret = mbedtls_mpi_lset( &ctx_cli.Qp.Z, 1 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_lset returned %d\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_mpi_read_binary( &ctx_cli.Qp.X, srv_to_cli, 32 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_read_binary returned %d\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_ecdh_compute_shared( &ctx_cli.grp, &ctx_cli.z,\n                                       &ctx_cli.Qp, &ctx_cli.d,\n                                       mbedtls_ctr_drbg_random, &ctr_drbg );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecdh_compute_shared returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * Verification: are the computed secrets equal?\n     */\n    mbedtls_printf( \"  . Checking if both computed secrets are equal...\" );\n    fflush( stdout );\n\n    ret = mbedtls_mpi_cmp_mpi( &ctx_cli.z, &ctx_srv.z );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecdh_compute_shared returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n\nexit:\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    mbedtls_ecdh_free( &ctx_srv );\n    mbedtls_ecdh_free( &ctx_cli );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n    return( ret != 0 );\n}\n#endif /* MBEDTLS_ECDH_C && MBEDTLS_ECP_DP_CURVE25519_ENABLED &&\n          MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/ecdsa.c",
    "content": "/*\n *  Example ECDSA program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_ECDSA_C) && \\\n    defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_CTR_DRBG_C)\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/ecdsa.h\"\n#include \"mbedtls/sha256.h\"\n\n#include <string.h>\n#endif\n\n/*\n * Uncomment to show key and signature details\n */\n#define VERBOSE\n\n/*\n * Uncomment to force use of a specific curve\n */\n#define ECPARAMS    MBEDTLS_ECP_DP_SECP192R1\n\n#if !defined(ECPARAMS)\n#define ECPARAMS    mbedtls_ecp_curve_list()->grp_id\n#endif\n\n#if !defined(MBEDTLS_ECDSA_C) || !defined(MBEDTLS_SHA256_C) || \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_ECDSA_C and/or MBEDTLS_SHA256_C and/or \"\n           \"MBEDTLS_ENTROPY_C and/or MBEDTLS_CTR_DRBG_C not defined\\n\");\n    return( 0 );\n}\n#else\n#if defined(VERBOSE)\nstatic void dump_buf( const char *title, unsigned char *buf, size_t len )\n{\n    size_t i;\n\n    mbedtls_printf( \"%s\", title );\n    for( i = 0; i < len; i++ )\n        mbedtls_printf(\"%c%c\", \"0123456789ABCDEF\" [buf[i] / 16],\n                       \"0123456789ABCDEF\" [buf[i] % 16] );\n    mbedtls_printf( \"\\n\" );\n}\n\nstatic void dump_pubkey( const char *title, mbedtls_ecdsa_context *key )\n{\n    unsigned char buf[300];\n    size_t len;\n\n    if( mbedtls_ecp_point_write_binary( &key->grp, &key->Q,\n                MBEDTLS_ECP_PF_UNCOMPRESSED, &len, buf, sizeof buf ) != 0 )\n    {\n        mbedtls_printf(\"internal error\\n\");\n        return;\n    }\n\n    dump_buf( title, buf, len );\n}\n#else\n#define dump_buf( a, b, c )\n#define dump_pubkey( a, b )\n#endif\n\nint main( int argc, char *argv[] )\n{\n    int ret;\n    mbedtls_ecdsa_context ctx_sign, ctx_verify;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_sha256_context sha256_ctx;\n    unsigned char message[100];\n    unsigned char hash[32];\n    unsigned char sig[MBEDTLS_ECDSA_MAX_LEN];\n    size_t sig_len;\n    const char *pers = \"ecdsa\";\n    ((void) argv);\n\n    mbedtls_ecdsa_init( &ctx_sign );\n    mbedtls_ecdsa_init( &ctx_verify );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n    mbedtls_sha256_init( &sha256_ctx );\n\n    memset( sig, 0, sizeof( sig ) );\n    memset( message, 0x25, sizeof( message ) );\n    ret = 1;\n\n    if( argc != 1 )\n    {\n        mbedtls_printf( \"usage: ecdsa\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        goto exit;\n    }\n\n    /*\n     * Generate a key pair for signing\n     */\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n  . Generating key pair...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ecdsa_genkey( &ctx_sign, ECPARAMS,\n                              mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecdsa_genkey returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok (key size: %d bits)\\n\", (int) ctx_sign.grp.pbits );\n\n    dump_pubkey( \"  + Public key: \", &ctx_sign );\n\n    /*\n     * Compute message hash\n     */\n    mbedtls_printf( \"  . Computing message hash...\" );\n    fflush( stdout );\n\n    mbedtls_sha256_starts( &sha256_ctx, 0 );\n    mbedtls_sha256_update( &sha256_ctx, message, sizeof( message ) );\n    mbedtls_sha256_finish( &sha256_ctx, hash );\n\n    mbedtls_printf( \" ok\\n\" );\n\n    dump_buf( \"  + Hash: \", hash, sizeof( hash ) );\n\n    /*\n     * Sign message hash\n     */\n    mbedtls_printf( \"  . Signing message hash...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ecdsa_write_signature( &ctx_sign, MBEDTLS_MD_SHA256,\n                                       hash, sizeof( hash ),\n                                       sig, &sig_len,\n                                       mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecdsa_genkey returned %d\\n\", ret );\n        goto exit;\n    }\n    mbedtls_printf( \" ok (signature length = %u)\\n\", (unsigned int) sig_len );\n\n    dump_buf( \"  + Signature: \", sig, sig_len );\n\n    /*\n     * Transfer public information to verifying context\n     *\n     * We could use the same context for verification and signatures, but we\n     * chose to use a new one in order to make it clear that the verifying\n     * context only needs the public key (Q), and not the private key (d).\n     */\n    mbedtls_printf( \"  . Preparing verification context...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ecp_group_copy( &ctx_verify.grp, &ctx_sign.grp ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecp_group_copy returned %d\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_ecp_copy( &ctx_verify.Q, &ctx_sign.Q ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecp_copy returned %d\\n\", ret );\n        goto exit;\n    }\n\n    ret = 0;\n\n    /*\n     * Verify signature\n     */\n    mbedtls_printf( \" ok\\n  . Verifying signature...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ecdsa_read_signature( &ctx_verify,\n                                      hash, sizeof( hash ),\n                                      sig, sig_len ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ecdsa_read_signature returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\nexit:\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    mbedtls_ecdsa_free( &ctx_verify );\n    mbedtls_ecdsa_free( &ctx_sign );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n    mbedtls_sha256_free( &sha256_ctx );\n\n    return( ret );\n}\n#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C &&\n          ECPARAMS */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/gen_key.c",
    "content": "/*\n *  Key generation application\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_PK_WRITE_C) && defined(MBEDTLS_FS_IO) && \\\n    defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_CTR_DRBG_C)\n#include \"mbedtls/error.h\"\n#include \"mbedtls/pk.h\"\n#include \"mbedtls/ecdsa.h\"\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/error.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#if !defined(_WIN32)\n#include <unistd.h>\n\n#define DEV_RANDOM_THRESHOLD        32\n\nint dev_random_entropy_poll( void *data, unsigned char *output,\n                             size_t len, size_t *olen )\n{\n    FILE *file;\n    size_t ret, left = len;\n    unsigned char *p = output;\n    ((void) data);\n\n    *olen = 0;\n\n    file = fopen( \"/dev/random\", \"rb\" );\n    if( file == NULL )\n        return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );\n\n    while( left > 0 )\n    {\n        /* /dev/random can return much less than requested. If so, try again */\n        ret = fread( p, 1, left, file );\n        if( ret == 0 && ferror( file ) )\n        {\n            fclose( file );\n            return( MBEDTLS_ERR_ENTROPY_SOURCE_FAILED );\n        }\n\n        p += ret;\n        left -= ret;\n        sleep( 1 );\n    }\n    fclose( file );\n    *olen = len;\n\n    return( 0 );\n}\n#endif /* !_WIN32 */\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n#define DFL_EC_CURVE            mbedtls_ecp_curve_list()->grp_id\n#else\n#define DFL_EC_CURVE            0\n#endif\n\n#if !defined(_WIN32) && defined(MBEDTLS_FS_IO)\n#define USAGE_DEV_RANDOM \\\n    \"    use_dev_random=0|1    default: 0\\n\"\n#else\n#define USAGE_DEV_RANDOM \"\"\n#endif /* !_WIN32 && MBEDTLS_FS_IO */\n\n#define FORMAT_PEM              0\n#define FORMAT_DER              1\n\n#define DFL_TYPE                MBEDTLS_PK_RSA\n#define DFL_RSA_KEYSIZE         4096\n#define DFL_FILENAME            \"keyfile.key\"\n#define DFL_FORMAT              FORMAT_PEM\n#define DFL_USE_DEV_RANDOM      0\n\n#define USAGE \\\n    \"\\n usage: gen_key param=<>...\\n\"                   \\\n    \"\\n acceptable parameters:\\n\"                       \\\n    \"    type=rsa|ec           default: rsa\\n\"          \\\n    \"    rsa_keysize=%%d        default: 4096\\n\"        \\\n    \"    ec_curve=%%s           see below\\n\"            \\\n    \"    filename=%%s           default: keyfile.key\\n\" \\\n    \"    format=pem|der        default: pem\\n\"          \\\n    USAGE_DEV_RANDOM                                    \\\n    \"\\n\"\n\n#if !defined(MBEDTLS_PK_WRITE_C) || !defined(MBEDTLS_PEM_WRITE_C) || \\\n    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_ENTROPY_C) || \\\n    !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf( \"MBEDTLS_PK_WRITE_C and/or MBEDTLS_FS_IO and/or \"\n            \"MBEDTLS_ENTROPY_C and/or MBEDTLS_CTR_DRBG_C and/or \"\n            \"MBEDTLS_PEM_WRITE_C\"\n            \"not defined.\\n\" );\n    return( 0 );\n}\n#else\n/*\n * global options\n */\nstruct options\n{\n    int type;                   /* the type of key to generate          */\n    int rsa_keysize;            /* length of key in bits                */\n    int ec_curve;               /* curve identifier for EC keys         */\n    const char *filename;       /* filename of the key file             */\n    int format;                 /* the output format to use             */\n    int use_dev_random;         /* use /dev/random as entropy source    */\n} opt;\n\nstatic int write_private_key( mbedtls_pk_context *key, const char *output_file )\n{\n    int ret;\n    FILE *f;\n    unsigned char output_buf[16000];\n    unsigned char *c = output_buf;\n    size_t len = 0;\n\n    memset(output_buf, 0, 16000);\n    if( opt.format == FORMAT_PEM )\n    {\n        if( ( ret = mbedtls_pk_write_key_pem( key, output_buf, 16000 ) ) != 0 )\n            return( ret );\n\n        len = strlen( (char *) output_buf );\n    }\n    else\n    {\n        if( ( ret = mbedtls_pk_write_key_der( key, output_buf, 16000 ) ) < 0 )\n            return( ret );\n\n        len = ret;\n        c = output_buf + sizeof(output_buf) - len;\n    }\n\n    if( ( f = fopen( output_file, \"wb\" ) ) == NULL )\n        return( -1 );\n\n    if( fwrite( c, 1, len, f ) != len )\n    {\n        fclose( f );\n        return( -1 );\n    }\n\n    fclose( f );\n\n    return( 0 );\n}\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0;\n    mbedtls_pk_context key;\n    char buf[1024];\n    int i;\n    char *p, *q;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    const char *pers = \"gen_key\";\n#if defined(MBEDTLS_ECP_C)\n    const mbedtls_ecp_curve_info *curve_info;\n#endif\n\n    /*\n     * Set to sane values\n     */\n    mbedtls_pk_init( &key );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n    memset( buf, 0, sizeof( buf ) );\n\n    if( argc == 0 )\n    {\n    usage:\n        ret = 1;\n        mbedtls_printf( USAGE );\n#if defined(MBEDTLS_ECP_C)\n        mbedtls_printf( \" available ec_curve values:\\n\" );\n        curve_info = mbedtls_ecp_curve_list();\n        mbedtls_printf( \"    %s (default)\\n\", curve_info->name );\n        while( ( ++curve_info )->name != NULL )\n            mbedtls_printf( \"    %s\\n\", curve_info->name );\n#endif\n        goto exit;\n    }\n\n    opt.type                = DFL_TYPE;\n    opt.rsa_keysize         = DFL_RSA_KEYSIZE;\n    opt.ec_curve            = DFL_EC_CURVE;\n    opt.filename            = DFL_FILENAME;\n    opt.format              = DFL_FORMAT;\n    opt.use_dev_random      = DFL_USE_DEV_RANDOM;\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"type\" ) == 0 )\n        {\n            if( strcmp( q, \"rsa\" ) == 0 )\n                opt.type = MBEDTLS_PK_RSA;\n            else if( strcmp( q, \"ec\" ) == 0 )\n                opt.type = MBEDTLS_PK_ECKEY;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"format\" ) == 0 )\n        {\n            if( strcmp( q, \"pem\" ) == 0 )\n                opt.format = FORMAT_PEM;\n            else if( strcmp( q, \"der\" ) == 0 )\n                opt.format = FORMAT_DER;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"rsa_keysize\" ) == 0 )\n        {\n            opt.rsa_keysize = atoi( q );\n            if( opt.rsa_keysize < 1024 ||\n                opt.rsa_keysize > MBEDTLS_MPI_MAX_BITS )\n                goto usage;\n        }\n#if defined(MBEDTLS_ECP_C)\n        else if( strcmp( p, \"ec_curve\" ) == 0 )\n        {\n            if( ( curve_info = mbedtls_ecp_curve_info_from_name( q ) ) == NULL )\n                goto usage;\n            opt.ec_curve = curve_info->grp_id;\n        }\n#endif\n        else if( strcmp( p, \"filename\" ) == 0 )\n            opt.filename = q;\n        else if( strcmp( p, \"use_dev_random\" ) == 0 )\n        {\n            opt.use_dev_random = atoi( q );\n            if( opt.use_dev_random < 0 || opt.use_dev_random > 1 )\n                goto usage;\n        }\n        else\n            goto usage;\n    }\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n#if !defined(_WIN32) && defined(MBEDTLS_FS_IO)\n    if( opt.use_dev_random )\n    {\n        if( ( ret = mbedtls_entropy_add_source( &entropy, dev_random_entropy_poll,\n                                        NULL, DEV_RANDOM_THRESHOLD,\n                                        MBEDTLS_ENTROPY_SOURCE_STRONG ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_entropy_add_source returned -0x%04x\\n\", -ret );\n            goto exit;\n        }\n\n        mbedtls_printf(\"\\n    Using /dev/random, so can take a long time! \" );\n        fflush( stdout );\n    }\n#endif /* !_WIN32 && MBEDTLS_FS_IO */\n\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    /*\n     * 1.1. Generate the key\n     */\n    mbedtls_printf( \"\\n  . Generating the private key ...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_pk_setup( &key, mbedtls_pk_info_from_type( opt.type ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_pk_setup returned -0x%04x\", -ret );\n        goto exit;\n    }\n\n#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)\n    if( opt.type == MBEDTLS_PK_RSA )\n    {\n        ret = mbedtls_rsa_gen_key( mbedtls_pk_rsa( key ), mbedtls_ctr_drbg_random, &ctr_drbg,\n                           opt.rsa_keysize, 65537 );\n        if( ret != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_rsa_gen_key returned -0x%04x\", -ret );\n            goto exit;\n        }\n    }\n    else\n#endif /* MBEDTLS_RSA_C */\n#if defined(MBEDTLS_ECP_C)\n    if( opt.type == MBEDTLS_PK_ECKEY )\n    {\n        ret = mbedtls_ecp_gen_key( opt.ec_curve, mbedtls_pk_ec( key ),\n                          mbedtls_ctr_drbg_random, &ctr_drbg );\n        if( ret != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_rsa_gen_key returned -0x%04x\", -ret );\n            goto exit;\n        }\n    }\n    else\n#endif /* MBEDTLS_ECP_C */\n    {\n        mbedtls_printf( \" failed\\n  !  key type not supported\\n\" );\n        goto exit;\n    }\n\n    /*\n     * 1.2 Print the key\n     */\n    mbedtls_printf( \" ok\\n  . Key information:\\n\" );\n\n#if defined(MBEDTLS_RSA_C)\n    if( mbedtls_pk_get_type( &key ) == MBEDTLS_PK_RSA )\n    {\n        mbedtls_rsa_context *rsa = mbedtls_pk_rsa( key );\n        mbedtls_mpi_write_file( \"N:  \",  &rsa->N,  16, NULL );\n        mbedtls_mpi_write_file( \"E:  \",  &rsa->E,  16, NULL );\n        mbedtls_mpi_write_file( \"D:  \",  &rsa->D,  16, NULL );\n        mbedtls_mpi_write_file( \"P:  \",  &rsa->P,  16, NULL );\n        mbedtls_mpi_write_file( \"Q:  \",  &rsa->Q,  16, NULL );\n        mbedtls_mpi_write_file( \"DP: \",  &rsa->DP, 16, NULL );\n        mbedtls_mpi_write_file( \"DQ:  \", &rsa->DQ, 16, NULL );\n        mbedtls_mpi_write_file( \"QP:  \", &rsa->QP, 16, NULL );\n    }\n    else\n#endif\n#if defined(MBEDTLS_ECP_C)\n    if( mbedtls_pk_get_type( &key ) == MBEDTLS_PK_ECKEY )\n    {\n        mbedtls_ecp_keypair *ecp = mbedtls_pk_ec( key );\n        mbedtls_printf( \"curve: %s\\n\",\n                mbedtls_ecp_curve_info_from_grp_id( ecp->grp.id )->name );\n        mbedtls_mpi_write_file( \"X_Q:   \", &ecp->Q.X, 16, NULL );\n        mbedtls_mpi_write_file( \"Y_Q:   \", &ecp->Q.Y, 16, NULL );\n        mbedtls_mpi_write_file( \"D:     \", &ecp->d  , 16, NULL );\n    }\n    else\n#endif\n        mbedtls_printf(\"  ! key type not supported\\n\");\n\n    /*\n     * 1.3 Export key\n     */\n    mbedtls_printf( \"  . Writing key to file...\" );\n\n    if( ( ret = write_private_key( &key, opt.filename ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n\" );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\nexit:\n\n    if( ret != 0 && ret != 1)\n    {\n#ifdef MBEDTLS_ERROR_C\n        mbedtls_strerror( ret, buf, sizeof( buf ) );\n        mbedtls_printf( \" - %s\\n\", buf );\n#else\n        mbedtls_printf(\"\\n\");\n#endif\n    }\n\n    mbedtls_pk_free( &key );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_PK_WRITE_C && MBEDTLS_PEM_WRITE_C && MBEDTLS_FS_IO &&\n        * MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/key_app.c",
    "content": "/*\n *  Key reading application\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_BIGNUM_C) && \\\n    defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_FS_IO)\n#include \"mbedtls/error.h\"\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/x509.h\"\n\n#include <string.h>\n#endif\n\n#define MODE_NONE               0\n#define MODE_PRIVATE            1\n#define MODE_PUBLIC             2\n\n#define DFL_MODE                MODE_NONE\n#define DFL_FILENAME            \"keyfile.key\"\n#define DFL_PASSWORD            \"\"\n#define DFL_PASSWORD_FILE       \"\"\n#define DFL_DEBUG_LEVEL         0\n\n#define USAGE \\\n    \"\\n usage: key_app param=<>...\\n\"                   \\\n    \"\\n acceptable parameters:\\n\"                       \\\n    \"    mode=private|public default: none\\n\"           \\\n    \"    filename=%%s         default: keyfile.key\\n\"   \\\n    \"    password=%%s         default: \\\"\\\"\\n\"          \\\n    \"    password_file=%%s    default: \\\"\\\"\\n\"          \\\n    \"\\n\"\n\n\n#if !defined(MBEDTLS_BIGNUM_C) ||                                  \\\n    !defined(MBEDTLS_PK_PARSE_C) || !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or \"\n           \"MBEDTLS_PK_PARSE_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\n/*\n * global options\n */\nstruct options\n{\n    int mode;                   /* the mode to run the application in   */\n    const char *filename;       /* filename of the key file             */\n    const char *password;       /* password for the private key         */\n    const char *password_file;  /* password_file for the private key    */\n} opt;\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0;\n    mbedtls_pk_context pk;\n    char buf[1024];\n    int i;\n    char *p, *q;\n\n    /*\n     * Set to sane values\n     */\n    mbedtls_pk_init( &pk );\n    memset( buf, 0, sizeof(buf) );\n\n    if( argc == 0 )\n    {\n    usage:\n        mbedtls_printf( USAGE );\n        goto exit;\n    }\n\n    opt.mode                = DFL_MODE;\n    opt.filename            = DFL_FILENAME;\n    opt.password            = DFL_PASSWORD;\n    opt.password_file       = DFL_PASSWORD_FILE;\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"mode\" ) == 0 )\n        {\n            if( strcmp( q, \"private\" ) == 0 )\n                opt.mode = MODE_PRIVATE;\n            else if( strcmp( q, \"public\" ) == 0 )\n                opt.mode = MODE_PUBLIC;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"filename\" ) == 0 )\n            opt.filename = q;\n        else if( strcmp( p, \"password\" ) == 0 )\n            opt.password = q;\n        else if( strcmp( p, \"password_file\" ) == 0 )\n            opt.password_file = q;\n        else\n            goto usage;\n    }\n\n    if( opt.mode == MODE_PRIVATE )\n    {\n        if( strlen( opt.password ) && strlen( opt.password_file ) )\n        {\n            mbedtls_printf( \"Error: cannot have both password and password_file\\n\" );\n            goto usage;\n        }\n\n        if( strlen( opt.password_file ) )\n        {\n            FILE *f;\n\n            mbedtls_printf( \"\\n  . Loading the password file ...\" );\n            if( ( f = fopen( opt.password_file, \"rb\" ) ) == NULL )\n            {\n                mbedtls_printf( \" failed\\n  !  fopen returned NULL\\n\" );\n                goto exit;\n            }\n            if( fgets( buf, sizeof(buf), f ) == NULL )\n            {\n                fclose( f );\n                mbedtls_printf( \"Error: fgets() failed to retrieve password\\n\" );\n                goto exit;\n            }\n            fclose( f );\n\n            i = (int) strlen( buf );\n            if( buf[i - 1] == '\\n' ) buf[i - 1] = '\\0';\n            if( buf[i - 2] == '\\r' ) buf[i - 2] = '\\0';\n            opt.password = buf;\n        }\n\n        /*\n         * 1.1. Load the key\n         */\n        mbedtls_printf( \"\\n  . Loading the private key ...\" );\n        fflush( stdout );\n\n        ret = mbedtls_pk_parse_keyfile( &pk, opt.filename, opt.password );\n\n        if( ret != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_keyfile returned -0x%04x\\n\", -ret );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        /*\n         * 1.2 Print the key\n         */\n        mbedtls_printf( \"  . Key information    ...\\n\" );\n#if defined(MBEDTLS_RSA_C)\n        if( mbedtls_pk_get_type( &pk ) == MBEDTLS_PK_RSA )\n        {\n            mbedtls_rsa_context *rsa = mbedtls_pk_rsa( pk );\n            mbedtls_mpi_write_file( \"N:  \", &rsa->N, 16, NULL );\n            mbedtls_mpi_write_file( \"E:  \", &rsa->E, 16, NULL );\n            mbedtls_mpi_write_file( \"D:  \", &rsa->D, 16, NULL );\n            mbedtls_mpi_write_file( \"P:  \", &rsa->P, 16, NULL );\n            mbedtls_mpi_write_file( \"Q:  \", &rsa->Q, 16, NULL );\n            mbedtls_mpi_write_file( \"DP: \", &rsa->DP, 16, NULL );\n            mbedtls_mpi_write_file( \"DQ:  \", &rsa->DQ, 16, NULL );\n            mbedtls_mpi_write_file( \"QP:  \", &rsa->QP, 16, NULL );\n        }\n        else\n#endif\n#if defined(MBEDTLS_ECP_C)\n        if( mbedtls_pk_get_type( &pk ) == MBEDTLS_PK_ECKEY )\n        {\n            mbedtls_ecp_keypair *ecp = mbedtls_pk_ec( pk );\n            mbedtls_mpi_write_file( \"Q(X): \", &ecp->Q.X, 16, NULL );\n            mbedtls_mpi_write_file( \"Q(Y): \", &ecp->Q.Y, 16, NULL );\n            mbedtls_mpi_write_file( \"Q(Z): \", &ecp->Q.Z, 16, NULL );\n            mbedtls_mpi_write_file( \"D   : \", &ecp->d  , 16, NULL );\n        }\n        else\n#endif\n        {\n            mbedtls_printf(\"Do not know how to print key information for this type\\n\" );\n            goto exit;\n        }\n    }\n    else if( opt.mode == MODE_PUBLIC )\n    {\n        /*\n         * 1.1. Load the key\n         */\n        mbedtls_printf( \"\\n  . Loading the public key ...\" );\n        fflush( stdout );\n\n        ret = mbedtls_pk_parse_public_keyfile( &pk, opt.filename );\n\n        if( ret != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_public_keyfile returned -0x%04x\\n\", -ret );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        mbedtls_printf( \"  . Key information    ...\\n\" );\n#if defined(MBEDTLS_RSA_C)\n        if( mbedtls_pk_get_type( &pk ) == MBEDTLS_PK_RSA )\n        {\n            mbedtls_rsa_context *rsa = mbedtls_pk_rsa( pk );\n            mbedtls_mpi_write_file( \"N:  \", &rsa->N, 16, NULL );\n            mbedtls_mpi_write_file( \"E:  \", &rsa->E, 16, NULL );\n        }\n        else\n#endif\n#if defined(MBEDTLS_ECP_C)\n        if( mbedtls_pk_get_type( &pk ) == MBEDTLS_PK_ECKEY )\n        {\n            mbedtls_ecp_keypair *ecp = mbedtls_pk_ec( pk );\n            mbedtls_mpi_write_file( \"Q(X): \", &ecp->Q.X, 16, NULL );\n            mbedtls_mpi_write_file( \"Q(Y): \", &ecp->Q.Y, 16, NULL );\n            mbedtls_mpi_write_file( \"Q(Z): \", &ecp->Q.Z, 16, NULL );\n        }\n        else\n#endif\n        {\n            mbedtls_printf(\"Do not know how to print key information for this type\\n\" );\n            goto exit;\n        }\n    }\n    else\n        goto usage;\n\nexit:\n\n#if defined(MBEDTLS_ERROR_C)\n    mbedtls_strerror( ret, buf, sizeof(buf) );\n    mbedtls_printf( \"  !  Last error was: %s\\n\", buf );\n#endif\n\n    mbedtls_pk_free( &pk );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_PK_PARSE_C && MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/key_app_writer.c",
    "content": "/*\n *  Key writing application\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_PK_WRITE_C) && defined(MBEDTLS_FS_IO)\n#include \"mbedtls/error.h\"\n#include \"mbedtls/pk.h\"\n#include \"mbedtls/error.h\"\n\n#include <stdio.h>\n#include <string.h>\n#endif\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n#define USAGE_OUT \\\n    \"    output_file=%%s      default: keyfile.pem\\n\"   \\\n    \"    output_format=pem|der default: pem\\n\"\n#else\n#define USAGE_OUT \\\n    \"    output_file=%%s      default: keyfile.der\\n\"   \\\n    \"    output_format=der     default: der\\n\"\n#endif\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n#define DFL_OUTPUT_FILENAME     \"keyfile.pem\"\n#define DFL_OUTPUT_FORMAT       OUTPUT_FORMAT_PEM\n#else\n#define DFL_OUTPUT_FILENAME     \"keyfile.der\"\n#define DFL_OUTPUT_FORMAT       OUTPUT_FORMAT_DER\n#endif\n\n#define DFL_MODE                MODE_NONE\n#define DFL_FILENAME            \"keyfile.key\"\n#define DFL_DEBUG_LEVEL         0\n#define DFL_OUTPUT_MODE         OUTPUT_MODE_NONE\n\n#define MODE_NONE               0\n#define MODE_PRIVATE            1\n#define MODE_PUBLIC             2\n\n#define OUTPUT_MODE_NONE               0\n#define OUTPUT_MODE_PRIVATE            1\n#define OUTPUT_MODE_PUBLIC             2\n\n#define OUTPUT_FORMAT_PEM              0\n#define OUTPUT_FORMAT_DER              1\n\n#define USAGE \\\n    \"\\n usage: key_app param=<>...\\n\"                   \\\n    \"\\n acceptable parameters:\\n\"                       \\\n    \"    mode=private|public default: none\\n\"           \\\n    \"    filename=%%s         default: keyfile.key\\n\"   \\\n    \"    output_mode=private|public default: none\\n\"    \\\n    USAGE_OUT                                           \\\n    \"\\n\"\n\n#if !defined(MBEDTLS_PK_WRITE_C) || !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf( \"MBEDTLS_PK_WRITE_C and/or MBEDTLS_FS_IO not defined.\\n\" );\n    return( 0 );\n}\n#else\n/*\n * global options\n */\nstruct options\n{\n    int mode;                   /* the mode to run the application in   */\n    const char *filename;       /* filename of the key file             */\n    int output_mode;            /* the output mode to use               */\n    const char *output_file;    /* where to store the constructed key file  */\n    int output_format;          /* the output format to use             */\n} opt;\n\nstatic int write_public_key( mbedtls_pk_context *key, const char *output_file )\n{\n    int ret;\n    FILE *f;\n    unsigned char output_buf[16000];\n    unsigned char *c = output_buf;\n    size_t len = 0;\n\n    memset(output_buf, 0, 16000);\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n    if( opt.output_format == OUTPUT_FORMAT_PEM )\n    {\n        if( ( ret = mbedtls_pk_write_pubkey_pem( key, output_buf, 16000 ) ) != 0 )\n            return( ret );\n\n        len = strlen( (char *) output_buf );\n    }\n    else\n#endif\n    {\n        if( ( ret = mbedtls_pk_write_pubkey_der( key, output_buf, 16000 ) ) < 0 )\n            return( ret );\n\n        len = ret;\n        c = output_buf + sizeof(output_buf) - len - 1;\n    }\n\n    if( ( f = fopen( output_file, \"w\" ) ) == NULL )\n        return( -1 );\n\n    if( fwrite( c, 1, len, f ) != len )\n    {\n        fclose( f );\n        return( -1 );\n    }\n\n    fclose( f );\n\n    return( 0 );\n}\n\nstatic int write_private_key( mbedtls_pk_context *key, const char *output_file )\n{\n    int ret;\n    FILE *f;\n    unsigned char output_buf[16000];\n    unsigned char *c = output_buf;\n    size_t len = 0;\n\n    memset(output_buf, 0, 16000);\n\n#if defined(MBEDTLS_PEM_WRITE_C)\n    if( opt.output_format == OUTPUT_FORMAT_PEM )\n    {\n        if( ( ret = mbedtls_pk_write_key_pem( key, output_buf, 16000 ) ) != 0 )\n            return( ret );\n\n        len = strlen( (char *) output_buf );\n    }\n    else\n#endif\n    {\n        if( ( ret = mbedtls_pk_write_key_der( key, output_buf, 16000 ) ) < 0 )\n            return( ret );\n\n        len = ret;\n        c = output_buf + sizeof(output_buf) - len - 1;\n    }\n\n    if( ( f = fopen( output_file, \"w\" ) ) == NULL )\n        return( -1 );\n\n    if( fwrite( c, 1, len, f ) != len )\n    {\n        fclose( f );\n        return( -1 );\n    }\n\n    fclose( f );\n\n    return( 0 );\n}\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0;\n    mbedtls_pk_context key;\n    char buf[1024];\n    int i;\n    char *p, *q;\n\n    /*\n     * Set to sane values\n     */\n    mbedtls_pk_init( &key );\n    memset( buf, 0, sizeof( buf ) );\n\n    if( argc == 0 )\n    {\n    usage:\n        ret = 1;\n        mbedtls_printf( USAGE );\n        goto exit;\n    }\n\n    opt.mode                = DFL_MODE;\n    opt.filename            = DFL_FILENAME;\n    opt.output_mode         = DFL_OUTPUT_MODE;\n    opt.output_file         = DFL_OUTPUT_FILENAME;\n    opt.output_format       = DFL_OUTPUT_FORMAT;\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"mode\" ) == 0 )\n        {\n            if( strcmp( q, \"private\" ) == 0 )\n                opt.mode = MODE_PRIVATE;\n            else if( strcmp( q, \"public\" ) == 0 )\n                opt.mode = MODE_PUBLIC;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"output_mode\" ) == 0 )\n        {\n            if( strcmp( q, \"private\" ) == 0 )\n                opt.output_mode = OUTPUT_MODE_PRIVATE;\n            else if( strcmp( q, \"public\" ) == 0 )\n                opt.output_mode = OUTPUT_MODE_PUBLIC;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"output_format\" ) == 0 )\n        {\n#if defined(MBEDTLS_PEM_WRITE_C)\n            if( strcmp( q, \"pem\" ) == 0 )\n                opt.output_format = OUTPUT_FORMAT_PEM;\n            else\n#endif\n            if( strcmp( q, \"der\" ) == 0 )\n                opt.output_format = OUTPUT_FORMAT_DER;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"filename\" ) == 0 )\n            opt.filename = q;\n        else if( strcmp( p, \"output_file\" ) == 0 )\n            opt.output_file = q;\n        else\n            goto usage;\n    }\n\n    if( opt.mode == MODE_NONE && opt.output_mode != OUTPUT_MODE_NONE )\n    {\n        mbedtls_printf( \"\\nCannot output a key without reading one.\\n\");\n        goto exit;\n    }\n\n    if( opt.mode == MODE_PUBLIC && opt.output_mode == OUTPUT_MODE_PRIVATE )\n    {\n        mbedtls_printf( \"\\nCannot output a private key from a public key.\\n\");\n        goto exit;\n    }\n\n    if( opt.mode == MODE_PRIVATE )\n    {\n        /*\n         * 1.1. Load the key\n         */\n        mbedtls_printf( \"\\n  . Loading the private key ...\" );\n        fflush( stdout );\n\n        ret = mbedtls_pk_parse_keyfile( &key, opt.filename, NULL );\n\n        if( ret != 0 )\n        {\n            mbedtls_strerror( ret, (char *) buf, sizeof(buf) );\n            mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_keyfile returned -0x%04x - %s\\n\\n\", -ret, buf );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        /*\n         * 1.2 Print the key\n         */\n        mbedtls_printf( \"  . Key information    ...\\n\" );\n\n#if defined(MBEDTLS_RSA_C)\n        if( mbedtls_pk_get_type( &key ) == MBEDTLS_PK_RSA )\n        {\n            mbedtls_rsa_context *rsa = mbedtls_pk_rsa( key );\n            mbedtls_mpi_write_file( \"N:  \",  &rsa->N,  16, NULL );\n            mbedtls_mpi_write_file( \"E:  \",  &rsa->E,  16, NULL );\n            mbedtls_mpi_write_file( \"D:  \",  &rsa->D,  16, NULL );\n            mbedtls_mpi_write_file( \"P:  \",  &rsa->P,  16, NULL );\n            mbedtls_mpi_write_file( \"Q:  \",  &rsa->Q,  16, NULL );\n            mbedtls_mpi_write_file( \"DP: \",  &rsa->DP, 16, NULL );\n            mbedtls_mpi_write_file( \"DQ:  \", &rsa->DQ, 16, NULL );\n            mbedtls_mpi_write_file( \"QP:  \", &rsa->QP, 16, NULL );\n        }\n        else\n#endif\n#if defined(MBEDTLS_ECP_C)\n        if( mbedtls_pk_get_type( &key ) == MBEDTLS_PK_ECKEY )\n        {\n            mbedtls_ecp_keypair *ecp = mbedtls_pk_ec( key );\n            mbedtls_mpi_write_file( \"Q(X): \", &ecp->Q.X, 16, NULL );\n            mbedtls_mpi_write_file( \"Q(Y): \", &ecp->Q.Y, 16, NULL );\n            mbedtls_mpi_write_file( \"Q(Z): \", &ecp->Q.Z, 16, NULL );\n            mbedtls_mpi_write_file( \"D   : \", &ecp->d  , 16, NULL );\n        }\n        else\n#endif\n            mbedtls_printf(\"key type not supported yet\\n\");\n\n    }\n    else if( opt.mode == MODE_PUBLIC )\n    {\n        /*\n         * 1.1. Load the key\n         */\n        mbedtls_printf( \"\\n  . Loading the public key ...\" );\n        fflush( stdout );\n\n        ret = mbedtls_pk_parse_public_keyfile( &key, opt.filename );\n\n        if( ret != 0 )\n        {\n            mbedtls_strerror( ret, (char *) buf, sizeof(buf) );\n            mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_public_key returned -0x%04x - %s\\n\\n\", -ret, buf );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        /*\n         * 1.2 Print the key\n         */\n        mbedtls_printf( \"  . Key information    ...\\n\" );\n\n#if defined(MBEDTLS_RSA_C)\n        if( mbedtls_pk_get_type( &key ) == MBEDTLS_PK_RSA )\n        {\n            mbedtls_rsa_context *rsa = mbedtls_pk_rsa( key );\n            mbedtls_mpi_write_file( \"N: \", &rsa->N, 16, NULL );\n            mbedtls_mpi_write_file( \"E: \", &rsa->E, 16, NULL );\n        }\n        else\n#endif\n#if defined(MBEDTLS_ECP_C)\n        if( mbedtls_pk_get_type( &key ) == MBEDTLS_PK_ECKEY )\n        {\n            mbedtls_ecp_keypair *ecp = mbedtls_pk_ec( key );\n            mbedtls_mpi_write_file( \"Q(X): \", &ecp->Q.X, 16, NULL );\n            mbedtls_mpi_write_file( \"Q(Y): \", &ecp->Q.Y, 16, NULL );\n            mbedtls_mpi_write_file( \"Q(Z): \", &ecp->Q.Z, 16, NULL );\n        }\n        else\n#endif\n            mbedtls_printf(\"key type not supported yet\\n\");\n    }\n    else\n        goto usage;\n\n    if( opt.output_mode == OUTPUT_MODE_PUBLIC )\n    {\n        write_public_key( &key, opt.output_file );\n    }\n    if( opt.output_mode == OUTPUT_MODE_PRIVATE )\n    {\n        write_private_key( &key, opt.output_file );\n    }\n\nexit:\n\n    if( ret != 0 && ret != 1)\n    {\n#ifdef MBEDTLS_ERROR_C\n        mbedtls_strerror( ret, buf, sizeof( buf ) );\n        mbedtls_printf( \" - %s\\n\", buf );\n#else\n        mbedtls_printf(\"\\n\");\n#endif\n    }\n\n    mbedtls_pk_free( &key );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_PK_WRITE_C && MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/mpi_demo.c",
    "content": "/*\n *  Simple MPI demonstration program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_BIGNUM_C) && defined(MBEDTLS_FS_IO)\n#include \"mbedtls/bignum.h\"\n\n#include <stdio.h>\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( void )\n{\n    int ret;\n    mbedtls_mpi E, P, Q, N, H, D, X, Y, Z;\n\n    mbedtls_mpi_init( &E ); mbedtls_mpi_init( &P ); mbedtls_mpi_init( &Q ); mbedtls_mpi_init( &N );\n    mbedtls_mpi_init( &H ); mbedtls_mpi_init( &D ); mbedtls_mpi_init( &X ); mbedtls_mpi_init( &Y );\n    mbedtls_mpi_init( &Z );\n\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &P, 10, \"2789\" ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &Q, 10, \"3203\" ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &E, 10,  \"257\" ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &N, &P, &Q ) );\n\n    mbedtls_printf( \"\\n  Public key:\\n\\n\" );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_file( \"  N = \", &N, 10, NULL ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_file( \"  E = \", &E, 10, NULL ) );\n\n    mbedtls_printf( \"\\n  Private key:\\n\\n\" );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_file( \"  P = \", &P, 10, NULL ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_file( \"  Q = \", &Q, 10, NULL ) );\n\n#if defined(MBEDTLS_GENPRIME)\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &P, &P, 1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &Q, &Q, 1 ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &H, &P, &Q ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &D, &E, &H ) );\n\n    mbedtls_mpi_write_file( \"  D = E^-1 mod (P-1)*(Q-1) = \",\n                    &D, 10, NULL );\n#else\n    mbedtls_printf(\"\\nTest skipped (MBEDTLS_GENPRIME not defined).\\n\\n\");\n#endif\n    MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &X, 10, \"55555\" ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &Y, &X, &E, &N, NULL ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &Z, &Y, &D, &N, NULL ) );\n\n    mbedtls_printf( \"\\n  RSA operation:\\n\\n\" );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_file( \"  X (plaintext)  = \", &X, 10, NULL ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_file( \"  Y (ciphertext) = X^E mod N = \", &Y, 10, NULL ) );\n    MBEDTLS_MPI_CHK( mbedtls_mpi_write_file( \"  Z (decrypted)  = Y^D mod N = \", &Z, 10, NULL ) );\n    mbedtls_printf( \"\\n\" );\n\ncleanup:\n    mbedtls_mpi_free( &E ); mbedtls_mpi_free( &P ); mbedtls_mpi_free( &Q ); mbedtls_mpi_free( &N );\n    mbedtls_mpi_free( &H ); mbedtls_mpi_free( &D ); mbedtls_mpi_free( &X ); mbedtls_mpi_free( &Y );\n    mbedtls_mpi_free( &Z );\n\n    if( ret != 0 )\n    {\n        mbedtls_printf( \"\\nAn error occurred.\\n\" );\n        ret = 1;\n    }\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/pk_decrypt.c",
    "content": "/*\n *  Public key-based simple decryption program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_BIGNUM_C) && defined(MBEDTLS_PK_PARSE_C) && \\\n    defined(MBEDTLS_FS_IO) && defined(MBEDTLS_ENTROPY_C) && \\\n    defined(MBEDTLS_CTR_DRBG_C)\n#include \"mbedtls/error.h\"\n#include \"mbedtls/pk.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <stdio.h>\n#include <string.h>\n#endif\n\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_PK_PARSE_C) ||  \\\n    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_ENTROPY_C) || \\\n    !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_PK_PARSE_C and/or \"\n           \"MBEDTLS_FS_IO and/or MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int ret, c;\n    size_t i, olen = 0;\n    mbedtls_pk_context pk;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    unsigned char result[1024];\n    unsigned char buf[512];\n    const char *pers = \"mbedtls_pk_decrypt\";\n    ((void) argv);\n\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n    memset(result, 0, sizeof( result ) );\n    ret = 1;\n\n    if( argc != 2 )\n    {\n        mbedtls_printf( \"usage: mbedtls_pk_decrypt <key_file>\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Reading private key from '%s'\", argv[1] );\n    fflush( stdout );\n\n    mbedtls_pk_init( &pk );\n\n    if( ( ret = mbedtls_pk_parse_keyfile( &pk, argv[1], \"\" ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_pk_parse_keyfile returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    /*\n     * Extract the RSA encrypted value from the text file\n     */\n    ret = 1;\n\n    if( ( f = fopen( \"result-enc.txt\", \"rb\" ) ) == NULL )\n    {\n        mbedtls_printf( \"\\n  ! Could not open %s\\n\\n\", \"result-enc.txt\" );\n        goto exit;\n    }\n\n    i = 0;\n\n    while( fscanf( f, \"%02X\", &c ) > 0 &&\n           i < (int) sizeof( buf ) )\n        buf[i++] = (unsigned char) c;\n\n    fclose( f );\n\n    /*\n     * Decrypt the encrypted RSA data and print the result.\n     */\n    mbedtls_printf( \"\\n  . Decrypting the encrypted data\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_pk_decrypt( &pk, buf, i, result, &olen, sizeof(result),\n                            mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_pk_decrypt returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . OK\\n\\n\" );\n\n    mbedtls_printf( \"The decrypted result is: '%s'\\n\\n\", result );\n\n    ret = 0;\n\nexit:\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(MBEDTLS_ERROR_C)\n    if( ret != 0 )\n    {\n        mbedtls_strerror( ret, (char *) buf, sizeof(buf) );\n        mbedtls_printf( \"  !  Last error was: %s\\n\", buf );\n    }\n#endif\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_PK_PARSE_C && MBEDTLS_FS_IO &&\n          MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/pk_encrypt.c",
    "content": "/*\n *  RSA simple data encryption program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_BIGNUM_C) && defined(MBEDTLS_PK_PARSE_C) && \\\n    defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_FS_IO) && \\\n    defined(MBEDTLS_CTR_DRBG_C)\n#include \"mbedtls/error.h\"\n#include \"mbedtls/pk.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <stdio.h>\n#include <string.h>\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_PK_PARSE_C) ||  \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_FS_IO) || \\\n    !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_PK_PARSE_C and/or \"\n           \"MBEDTLS_ENTROPY_C and/or MBEDTLS_FS_IO and/or \"\n           \"MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int ret;\n    size_t i, olen = 0;\n    mbedtls_pk_context pk;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    unsigned char input[1024];\n    unsigned char buf[512];\n    const char *pers = \"mbedtls_pk_encrypt\";\n\n    ret = 1;\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    if( argc != 3 )\n    {\n        mbedtls_printf( \"usage: mbedtls_pk_encrypt <key_file> <string of max 100 characters>\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Reading public key from '%s'\", argv[1] );\n    fflush( stdout );\n\n    mbedtls_pk_init( &pk );\n\n    if( ( ret = mbedtls_pk_parse_public_keyfile( &pk, argv[1] ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_pk_parse_public_keyfile returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    if( strlen( argv[2] ) > 100 )\n    {\n        mbedtls_printf( \" Input data larger than 100 characters.\\n\\n\" );\n        goto exit;\n    }\n\n    memcpy( input, argv[2], strlen( argv[2] ) );\n\n    /*\n     * Calculate the RSA encryption of the hash.\n     */\n    mbedtls_printf( \"\\n  . Generating the encrypted value\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_pk_encrypt( &pk, input, strlen( argv[2] ),\n                            buf, &olen, sizeof(buf),\n                            mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_pk_encrypt returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    /*\n     * Write the signature into result-enc.txt\n     */\n    if( ( f = fopen( \"result-enc.txt\", \"wb+\" ) ) == NULL )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not create %s\\n\\n\", \"result-enc.txt\" );\n        goto exit;\n    }\n\n    for( i = 0; i < olen; i++ )\n        mbedtls_fprintf( f, \"%02X%s\", buf[i],\n                 ( i + 1 ) % 16 == 0 ? \"\\r\\n\" : \" \" );\n\n    fclose( f );\n\n    mbedtls_printf( \"\\n  . Done (created \\\"%s\\\")\\n\\n\", \"result-enc.txt\" );\n\nexit:\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(MBEDTLS_ERROR_C)\n    if( ret != 0 )\n    {\n        mbedtls_strerror( ret, (char *) buf, sizeof(buf) );\n        mbedtls_printf( \"  !  Last error was: %s\\n\", buf );\n    }\n#endif\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_PK_PARSE_C && MBEDTLS_ENTROPY_C &&\n          MBEDTLS_FS_IO && MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/pk_sign.c",
    "content": "/*\n *  Public key-based signature creation program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_snprintf   snprintf\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_ENTROPY_C) ||  \\\n    !defined(MBEDTLS_SHA256_C) || !defined(MBEDTLS_MD_C) || \\\n    !defined(MBEDTLS_PK_PARSE_C) || !defined(MBEDTLS_FS_IO) ||    \\\n    !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_SHA256_C and/or MBEDTLS_MD_C and/or \"\n           \"MBEDTLS_PK_PARSE_C and/or MBEDTLS_FS_IO and/or \"\n           \"MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/error.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/md.h\"\n#include \"mbedtls/pk.h\"\n\n#include <stdio.h>\n#include <string.h>\n\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int ret = 1;\n    mbedtls_pk_context pk;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    unsigned char hash[32];\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n    char filename[512];\n    const char *pers = \"mbedtls_pk_sign\";\n    size_t olen = 0;\n\n    mbedtls_entropy_init( &entropy );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n    mbedtls_pk_init( &pk );\n\n    if( argc != 3 )\n    {\n        mbedtls_printf( \"usage: mbedtls_pk_sign <key_file> <filename>\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Reading private key from '%s'\", argv[1] );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_pk_parse_keyfile( &pk, argv[1], \"\" ) ) != 0 )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not open '%s'\\n\", argv[1] );\n        goto exit;\n    }\n\n    /*\n     * Compute the SHA-256 hash of the input file,\n     * then calculate the signature of the hash.\n     */\n    mbedtls_printf( \"\\n  . Generating the SHA-256 signature\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_md_file(\n                    mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),\n                    argv[2], hash ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! Could not open or read %s\\n\\n\", argv[2] );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_pk_sign( &pk, MBEDTLS_MD_SHA256, hash, 0, buf, &olen,\n                         mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_pk_sign returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    /*\n     * Write the signature into <filename>.sig\n     */\n    mbedtls_snprintf( filename, sizeof(filename), \"%s.sig\", argv[2] );\n\n    if( ( f = fopen( filename, \"wb+\" ) ) == NULL )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not create %s\\n\\n\", filename );\n        goto exit;\n    }\n\n    if( fwrite( buf, 1, olen, f ) != olen )\n    {\n        mbedtls_printf( \"failed\\n  ! fwrite failed\\n\\n\" );\n        fclose( f );\n        goto exit;\n    }\n\n    fclose( f );\n\n    mbedtls_printf( \"\\n  . Done (created \\\"%s\\\")\\n\\n\", filename );\n\nexit:\n    mbedtls_pk_free( &pk );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(MBEDTLS_ERROR_C)\n    if( ret != 0 )\n    {\n        mbedtls_strerror( ret, (char *) buf, sizeof(buf) );\n        mbedtls_printf( \"  !  Last error was: %s\\n\", buf );\n    }\n#endif\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C &&\n          MBEDTLS_SHA256_C && MBEDTLS_PK_PARSE_C && MBEDTLS_FS_IO &&\n          MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/pk_verify.c",
    "content": "/*\n *  Public key-based signature verification program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_snprintf   snprintf\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_MD_C) || \\\n    !defined(MBEDTLS_SHA256_C) || !defined(MBEDTLS_PK_PARSE_C) ||   \\\n    !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_MD_C and/or \"\n           \"MBEDTLS_SHA256_C and/or MBEDTLS_PK_PARSE_C and/or \"\n           \"MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/error.h\"\n#include \"mbedtls/md.h\"\n#include \"mbedtls/pk.h\"\n\n#include <stdio.h>\n#include <string.h>\n\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int ret = 1;\n    size_t i;\n    mbedtls_pk_context pk;\n    unsigned char hash[32];\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n    char filename[512];\n\n    mbedtls_pk_init( &pk );\n\n    if( argc != 3 )\n    {\n        mbedtls_printf( \"usage: mbedtls_pk_verify <key_file> <filename>\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Reading public key from '%s'\", argv[1] );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_pk_parse_public_keyfile( &pk, argv[1] ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_pk_parse_public_keyfile returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    /*\n     * Extract the signature from the file\n     */\n    ret = 1;\n    mbedtls_snprintf( filename, sizeof(filename), \"%s.sig\", argv[2] );\n\n    if( ( f = fopen( filename, \"rb\" ) ) == NULL )\n    {\n        mbedtls_printf( \"\\n  ! Could not open %s\\n\\n\", filename );\n        goto exit;\n    }\n\n\n    i = fread( buf, 1, sizeof(buf), f );\n\n    fclose( f );\n\n    /*\n     * Compute the SHA-256 hash of the input file and\n     * verify the signature\n     */\n    mbedtls_printf( \"\\n  . Verifying the SHA-256 signature\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_md_file(\n                    mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),\n                    argv[2], hash ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! Could not open or read %s\\n\\n\", argv[2] );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_pk_verify( &pk, MBEDTLS_MD_SHA256, hash, 0,\n                           buf, i ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_pk_verify returned -0x%04x\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . OK (the signature is valid)\\n\\n\" );\n\n    ret = 0;\n\nexit:\n    mbedtls_pk_free( &pk );\n\n#if defined(MBEDTLS_ERROR_C)\n    if( ret != 0 )\n    {\n        mbedtls_strerror( ret, (char *) buf, sizeof(buf) );\n        mbedtls_printf( \"  !  Last error was: %s\\n\", buf );\n    }\n#endif\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_SHA256_C &&\n          MBEDTLS_PK_PARSE_C && MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/rsa_decrypt.c",
    "content": "/*\n *  RSA simple decryption program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_printf     printf\n#define mbedtls_exit       exit\n#define MBEDTLS_EXIT_SUCCESS EXIT_SUCCESS\n#define MBEDTLS_EXIT_FAILURE EXIT_FAILURE\n#endif\n\n#if defined(MBEDTLS_BIGNUM_C) && defined(MBEDTLS_RSA_C) && \\\n    defined(MBEDTLS_FS_IO) && defined(MBEDTLS_ENTROPY_C) && \\\n    defined(MBEDTLS_CTR_DRBG_C)\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <string.h>\n\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_RSA_C) ||  \\\n    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_ENTROPY_C) || \\\n    !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_FS_IO and/or MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int return_val, exit_val, c;\n    size_t i;\n    mbedtls_rsa_context rsa;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    unsigned char result[1024];\n    unsigned char buf[512];\n    const char *pers = \"rsa_decrypt\";\n    ((void) argv);\n\n    memset(result, 0, sizeof( result ) );\n    exit_val = MBEDTLS_EXIT_SUCCESS;\n\n    if( argc != 1 )\n    {\n        mbedtls_printf( \"usage: rsa_decrypt\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        mbedtls_exit( MBEDTLS_EXIT_FAILURE );\n    }\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n    mbedtls_entropy_init( &entropy );\n\n    return_val = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func,\n                                        &entropy, (const unsigned char *) pers,\n                                        strlen( pers ) );\n    if( return_val != 0 )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\",\n                        return_val );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Reading private key from rsa_priv.txt\" );\n    fflush( stdout );\n\n    if( ( f = fopen( \"rsa_priv.txt\", \"rb\" ) ) == NULL )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \" failed\\n  ! Could not open rsa_priv.txt\\n\" \\\n                \"  ! Please run rsa_genkey first\\n\\n\" );\n        goto exit;\n    }\n\n    if( ( return_val = mbedtls_mpi_read_file( &rsa.N , 16, f ) ) != 0 ||\n        ( return_val = mbedtls_mpi_read_file( &rsa.E , 16, f ) ) != 0 ||\n        ( return_val = mbedtls_mpi_read_file( &rsa.D , 16, f ) ) != 0 ||\n        ( return_val = mbedtls_mpi_read_file( &rsa.P , 16, f ) ) != 0 ||\n        ( return_val = mbedtls_mpi_read_file( &rsa.Q , 16, f ) ) != 0 ||\n        ( return_val = mbedtls_mpi_read_file( &rsa.DP, 16, f ) ) != 0 ||\n        ( return_val = mbedtls_mpi_read_file( &rsa.DQ, 16, f ) ) != 0 ||\n        ( return_val = mbedtls_mpi_read_file( &rsa.QP, 16, f ) ) != 0 )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_read_file returned %d\\n\\n\",\n                        return_val );\n        fclose( f );\n        goto exit;\n    }\n\n    rsa.len = ( mbedtls_mpi_bitlen( &rsa.N ) + 7 ) >> 3;\n\n    fclose( f );\n\n    /*\n     * Extract the RSA encrypted value from the text file\n     */\n    if( ( f = fopen( \"result-enc.txt\", \"rb\" ) ) == NULL )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \"\\n  ! Could not open %s\\n\\n\", \"result-enc.txt\" );\n        goto exit;\n    }\n\n    i = 0;\n\n    while( fscanf( f, \"%02X\", &c ) > 0 &&\n           i < (int) sizeof( buf ) )\n        buf[i++] = (unsigned char) c;\n\n    fclose( f );\n\n    if( i != rsa.len )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \"\\n  ! Invalid RSA signature format\\n\\n\" );\n        goto exit;\n    }\n\n    /*\n     * Decrypt the encrypted RSA data and print the result.\n     */\n    mbedtls_printf( \"\\n  . Decrypting the encrypted data\" );\n    fflush( stdout );\n\n    return_val = mbedtls_rsa_pkcs1_decrypt( &rsa, mbedtls_ctr_drbg_random,\n                                            &ctr_drbg, MBEDTLS_RSA_PRIVATE, &i,\n                                            buf, result, 1024 );\n    if( return_val != 0 )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \" failed\\n  ! mbedtls_rsa_pkcs1_decrypt returned %d\\n\\n\",\n                        return_val );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . OK\\n\\n\" );\n\n    mbedtls_printf( \"The decrypted result is: '%s'\\n\\n\", result );\n\nexit:\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n    mbedtls_rsa_free( &rsa );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( exit_val );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_RSA_C && MBEDTLS_FS_IO */\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/rsa_encrypt.c",
    "content": "/*\n *  RSA simple data encryption program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#define mbedtls_exit       exit\n#define MBEDTLS_EXIT_SUCCESS EXIT_SUCCESS\n#define MBEDTLS_EXIT_FAILURE EXIT_FAILURE\n#endif\n\n#if defined(MBEDTLS_BIGNUM_C) && defined(MBEDTLS_RSA_C) && \\\n    defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_FS_IO) && \\\n    defined(MBEDTLS_CTR_DRBG_C)\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <string.h>\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_RSA_C) ||  \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_FS_IO) || \\\n    !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_ENTROPY_C and/or MBEDTLS_FS_IO and/or \"\n           \"MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int return_val, exit_val;\n    size_t i;\n    mbedtls_rsa_context rsa;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    unsigned char input[1024];\n    unsigned char buf[512];\n    const char *pers = \"rsa_encrypt\";\n\n    exit_val = MBEDTLS_EXIT_SUCCESS;\n\n    if( argc != 2 )\n    {\n        mbedtls_printf( \"usage: rsa_encrypt <string of max 100 characters>\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        mbedtls_exit( MBEDTLS_EXIT_FAILURE );\n    }\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n    mbedtls_entropy_init( &entropy );\n\n    return_val = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func,\n                                        &entropy, (const unsigned char *) pers,\n                                        strlen( pers ) );\n    if( return_val != 0 )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\",\n                        return_val );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Reading public key from rsa_pub.txt\" );\n    fflush( stdout );\n\n    if( ( f = fopen( \"rsa_pub.txt\", \"rb\" ) ) == NULL )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \" failed\\n  ! Could not open rsa_pub.txt\\n\" \\\n                \"  ! Please run rsa_genkey first\\n\\n\" );\n        goto exit;\n    }\n\n    if( ( return_val = mbedtls_mpi_read_file( &rsa.N, 16, f ) ) != 0 ||\n        ( return_val = mbedtls_mpi_read_file( &rsa.E, 16, f ) ) != 0 )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_read_file returned %d\\n\\n\",\n                        return_val );\n        fclose( f );\n        goto exit;\n    }\n\n    rsa.len = ( mbedtls_mpi_bitlen( &rsa.N ) + 7 ) >> 3;\n\n    fclose( f );\n\n    if( strlen( argv[1] ) > 100 )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \" Input data larger than 100 characters.\\n\\n\" );\n        goto exit;\n    }\n\n    memcpy( input, argv[1], strlen( argv[1] ) );\n\n    /*\n     * Calculate the RSA encryption of the hash.\n     */\n    mbedtls_printf( \"\\n  . Generating the RSA encrypted value\" );\n    fflush( stdout );\n\n    return_val = mbedtls_rsa_pkcs1_encrypt( &rsa, mbedtls_ctr_drbg_random,\n                                            &ctr_drbg, MBEDTLS_RSA_PUBLIC,\n                                            strlen( argv[1] ), input, buf );\n    if( return_val != 0 )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \" failed\\n  ! mbedtls_rsa_pkcs1_encrypt returned %d\\n\\n\",\n                        return_val );\n        goto exit;\n    }\n\n    /*\n     * Write the signature into result-enc.txt\n     */\n    if( ( f = fopen( \"result-enc.txt\", \"wb+\" ) ) == NULL )\n    {\n        exit_val = MBEDTLS_EXIT_FAILURE;\n        mbedtls_printf( \" failed\\n  ! Could not create %s\\n\\n\", \"result-enc.txt\" );\n        goto exit;\n    }\n\n    for( i = 0; i < rsa.len; i++ )\n        mbedtls_fprintf( f, \"%02X%s\", buf[i],\n                 ( i + 1 ) % 16 == 0 ? \"\\r\\n\" : \" \" );\n\n    fclose( f );\n\n    mbedtls_printf( \"\\n  . Done (created \\\"%s\\\")\\n\\n\", \"result-enc.txt\" );\n\nexit:\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n    mbedtls_rsa_free( &rsa );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( exit_val );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_RSA_C && MBEDTLS_ENTROPY_C &&\n          MBEDTLS_FS_IO && MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/rsa_genkey.c",
    "content": "/*\n *  Example RSA key generation program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_BIGNUM_C) && defined(MBEDTLS_ENTROPY_C) && \\\n    defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME) && \\\n    defined(MBEDTLS_FS_IO) && defined(MBEDTLS_CTR_DRBG_C)\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/bignum.h\"\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/rsa.h\"\n\n#include <stdio.h>\n#include <string.h>\n#endif\n\n#define KEY_SIZE 2048\n#define EXPONENT 65537\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_ENTROPY_C) ||   \\\n    !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_GENPRIME) ||      \\\n    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_RSA_C and/or MBEDTLS_GENPRIME and/or \"\n           \"MBEDTLS_FS_IO and/or MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( void )\n{\n    int ret;\n    mbedtls_rsa_context rsa;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    FILE *fpub  = NULL;\n    FILE *fpriv = NULL;\n    const char *pers = \"rsa_genkey\";\n\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n  . Generating the RSA key [ %d-bit ]...\", KEY_SIZE );\n    fflush( stdout );\n\n    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );\n\n    if( ( ret = mbedtls_rsa_gen_key( &rsa, mbedtls_ctr_drbg_random, &ctr_drbg, KEY_SIZE,\n                             EXPONENT ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_rsa_gen_key returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n  . Exporting the public  key in rsa_pub.txt....\" );\n    fflush( stdout );\n\n    if( ( fpub = fopen( \"rsa_pub.txt\", \"wb+\" ) ) == NULL )\n    {\n        mbedtls_printf( \" failed\\n  ! could not open rsa_pub.txt for writing\\n\\n\" );\n        ret = 1;\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_mpi_write_file( \"N = \", &rsa.N, 16, fpub ) ) != 0 ||\n        ( ret = mbedtls_mpi_write_file( \"E = \", &rsa.E, 16, fpub ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_write_file returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n  . Exporting the private key in rsa_priv.txt...\" );\n    fflush( stdout );\n\n    if( ( fpriv = fopen( \"rsa_priv.txt\", \"wb+\" ) ) == NULL )\n    {\n        mbedtls_printf( \" failed\\n  ! could not open rsa_priv.txt for writing\\n\" );\n        ret = 1;\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_mpi_write_file( \"N = \" , &rsa.N , 16, fpriv ) ) != 0 ||\n        ( ret = mbedtls_mpi_write_file( \"E = \" , &rsa.E , 16, fpriv ) ) != 0 ||\n        ( ret = mbedtls_mpi_write_file( \"D = \" , &rsa.D , 16, fpriv ) ) != 0 ||\n        ( ret = mbedtls_mpi_write_file( \"P = \" , &rsa.P , 16, fpriv ) ) != 0 ||\n        ( ret = mbedtls_mpi_write_file( \"Q = \" , &rsa.Q , 16, fpriv ) ) != 0 ||\n        ( ret = mbedtls_mpi_write_file( \"DP = \", &rsa.DP, 16, fpriv ) ) != 0 ||\n        ( ret = mbedtls_mpi_write_file( \"DQ = \", &rsa.DQ, 16, fpriv ) ) != 0 ||\n        ( ret = mbedtls_mpi_write_file( \"QP = \", &rsa.QP, 16, fpriv ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_write_file returned %d\\n\\n\", ret );\n        goto exit;\n    }\n/*\n    mbedtls_printf( \" ok\\n  . Generating the certificate...\" );\n\n    x509write_init_raw( &cert );\n    x509write_add_pubkey( &cert, &rsa );\n    x509write_add_subject( &cert, \"CN='localhost'\" );\n    x509write_add_validity( &cert, \"2007-09-06 17:00:32\",\n                                   \"2010-09-06 17:00:32\" );\n    x509write_create_selfsign( &cert, &rsa );\n    x509write_crtfile( &cert, \"cert.der\", X509_OUTPUT_DER );\n    x509write_crtfile( &cert, \"cert.pem\", X509_OUTPUT_PEM );\n    x509write_free_raw( &cert );\n*/\n    mbedtls_printf( \" ok\\n\\n\" );\n\nexit:\n\n    if( fpub  != NULL )\n        fclose( fpub );\n\n    if( fpriv != NULL )\n        fclose( fpriv );\n\n    mbedtls_rsa_free( &rsa );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C && MBEDTLS_RSA_C &&\n          MBEDTLS_GENPRIME && MBEDTLS_FS_IO && MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/rsa_priv.txt",
    "content": "N = A1D46FBA2318F8DCEF16C280948B1CF27966B9B47225ED2989F8D74B45BD36049C0AAB5AD0FF003553BA843C8E12782FC5873BB89A3DC84B883D25666CD22BF3ACD5B675969F8BEBFBCAC93FDD927C7442B178B10D1DFF9398E52316AAE0AF74E594650BDC3C670241D418684593CDA1A7B9DC4F20D2FDC6F66344074003E211\nE = 010001\nD = 589552BB4F2F023ADDDD5586D0C8FD857512D82080436678D07F984A29D892D31F1F7000FC5A39A0F73E27D885E47249A4148C8A5653EF69F91F8F736BA9F84841C2D99CD8C24DE8B72B5C9BE0EDBE23F93D731749FEA9CFB4A48DD2B7F35A2703E74AA2D4DB7DE9CEEA7D763AF0ADA7AC176C4E9A22C4CDA65CEC0C65964401\nP = CD083568D2D46C44C40C1FA0101AF2155E59C70B08423112AF0C1202514BBA5210765E29FF13036F56C7495894D80CF8C3BAEE2839BACBB0B86F6A2965F60DB1\nQ = CA0EEEA5E710E8E9811A6B846399420E3AE4A4C16647E426DDF8BBBCB11CD3F35CE2E4B6BCAD07AE2C0EC2ECBFCC601B207CDD77B5673E16382B1130BF465261\nDP = 0D0E21C07BF434B4A83B116472C2147A11D8EB98A33CFBBCF1D275EF19D815941622435AAF3839B6C432CA53CE9E772CFBE1923A937A766FD93E96E6EDEC1DF1\nDQ = 269CEBE6305DFEE4809377F078C814E37B45AE6677114DFC4F76F5097E1F3031D592567AC55B9B98213B40ECD54A4D2361F5FAACA1B1F51F71E4690893C4F081\nQP = 97AC5BB885ABCA314375E9E4DB1BA4B2218C90619F61BD474F5785075ECA81750A735199A8C191FE2D3355E7CF601A70E5CABDE0E02C2538BB9FB4871540B3C1\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/rsa_pub.txt",
    "content": "N = A1D46FBA2318F8DCEF16C280948B1CF27966B9B47225ED2989F8D74B45BD36049C0AAB5AD0FF003553BA843C8E12782FC5873BB89A3DC84B883D25666CD22BF3ACD5B675969F8BEBFBCAC93FDD927C7442B178B10D1DFF9398E52316AAE0AF74E594650BDC3C670241D418684593CDA1A7B9DC4F20D2FDC6F66344074003E211\nE = 010001\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/rsa_sign.c",
    "content": "/*\n *  RSA/SHA-256 signature creation program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#define mbedtls_snprintf   snprintf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_RSA_C) ||  \\\n    !defined(MBEDTLS_SHA256_C) || !defined(MBEDTLS_MD_C) || \\\n    !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_RSA_C and/or \"\n            \"MBEDTLS_MD_C and/or \"\n            \"MBEDTLS_SHA256_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/md.h\"\n\n#include <stdio.h>\n#include <string.h>\n\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int ret;\n    size_t i;\n    mbedtls_rsa_context rsa;\n    unsigned char hash[32];\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n    char filename[512];\n\n    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );\n    ret = 1;\n\n    if( argc != 2 )\n    {\n        mbedtls_printf( \"usage: rsa_sign <filename>\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Reading private key from rsa_priv.txt\" );\n    fflush( stdout );\n\n    if( ( f = fopen( \"rsa_priv.txt\", \"rb\" ) ) == NULL )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not open rsa_priv.txt\\n\" \\\n                \"  ! Please run rsa_genkey first\\n\\n\" );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_mpi_read_file( &rsa.N , 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.E , 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.D , 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.P , 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.Q , 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.DP, 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.DQ, 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.QP, 16, f ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_read_file returned %d\\n\\n\", ret );\n        fclose( f );\n        goto exit;\n    }\n\n    rsa.len = ( mbedtls_mpi_bitlen( &rsa.N ) + 7 ) >> 3;\n\n    fclose( f );\n\n    mbedtls_printf( \"\\n  . Checking the private key\" );\n    fflush( stdout );\n    if( ( ret = mbedtls_rsa_check_privkey( &rsa ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_rsa_check_privkey failed with -0x%0x\\n\", -ret );\n        goto exit;\n    }\n\n    /*\n     * Compute the SHA-256 hash of the input file,\n     * then calculate the RSA signature of the hash.\n     */\n    mbedtls_printf( \"\\n  . Generating the RSA/SHA-256 signature\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_md_file(\n                    mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),\n                    argv[1], hash ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! Could not open or read %s\\n\\n\", argv[1] );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_rsa_pkcs1_sign( &rsa, NULL, NULL, MBEDTLS_RSA_PRIVATE, MBEDTLS_MD_SHA256,\n                                20, hash, buf ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_rsa_pkcs1_sign returned -0x%0x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    /*\n     * Write the signature into <filename>.sig\n     */\n    mbedtls_snprintf( filename, sizeof(filename), \"%s.sig\", argv[1] );\n\n    if( ( f = fopen( filename, \"wb+\" ) ) == NULL )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not create %s\\n\\n\", argv[1] );\n        goto exit;\n    }\n\n    for( i = 0; i < rsa.len; i++ )\n        mbedtls_fprintf( f, \"%02X%s\", buf[i],\n                 ( i + 1 ) % 16 == 0 ? \"\\r\\n\" : \" \" );\n\n    fclose( f );\n\n    mbedtls_printf( \"\\n  . Done (created \\\"%s\\\")\\n\\n\", filename );\n\nexit:\n\n    mbedtls_rsa_free( &rsa );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_RSA_C && MBEDTLS_SHA256_C &&\n          MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/rsa_sign_pss.c",
    "content": "/*\n *  RSASSA-PSS/SHA-256 signature creation program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_snprintf   snprintf\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_MD_C) || !defined(MBEDTLS_ENTROPY_C) ||  \\\n    !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_SHA256_C) ||        \\\n    !defined(MBEDTLS_PK_PARSE_C) || !defined(MBEDTLS_FS_IO) ||    \\\n    !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_MD_C and/or MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_RSA_C and/or MBEDTLS_SHA256_C and/or \"\n           \"MBEDTLS_PK_PARSE_C and/or MBEDTLS_FS_IO and/or \"\n           \"MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/md.h\"\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/md.h\"\n#include \"mbedtls/x509.h\"\n\n#include <stdio.h>\n#include <string.h>\n\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int ret = 1;\n    mbedtls_pk_context pk;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    unsigned char hash[32];\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n    char filename[512];\n    const char *pers = \"rsa_sign_pss\";\n    size_t olen = 0;\n\n    mbedtls_entropy_init( &entropy );\n    mbedtls_pk_init( &pk );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    if( argc != 3 )\n    {\n        mbedtls_printf( \"usage: rsa_sign_pss <key_file> <filename>\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Reading private key from '%s'\", argv[1] );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_pk_parse_keyfile( &pk, argv[1], \"\" ) ) != 0 )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not read key from '%s'\\n\", argv[1] );\n        mbedtls_printf( \"  ! mbedtls_pk_parse_public_keyfile returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( !mbedtls_pk_can_do( &pk, MBEDTLS_PK_RSA ) )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Key is not an RSA key\\n\" );\n        goto exit;\n    }\n\n    mbedtls_rsa_set_padding( mbedtls_pk_rsa( pk ), MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256 );\n\n    /*\n     * Compute the SHA-256 hash of the input file,\n     * then calculate the RSA signature of the hash.\n     */\n    mbedtls_printf( \"\\n  . Generating the RSA/SHA-256 signature\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_md_file(\n                    mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),\n                    argv[2], hash ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! Could not open or read %s\\n\\n\", argv[2] );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_pk_sign( &pk, MBEDTLS_MD_SHA256, hash, 0, buf, &olen,\n                         mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_pk_sign returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /*\n     * Write the signature into <filename>.sig\n     */\n    mbedtls_snprintf( filename, 512, \"%s.sig\", argv[2] );\n\n    if( ( f = fopen( filename, \"wb+\" ) ) == NULL )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Could not create %s\\n\\n\", filename );\n        goto exit;\n    }\n\n    if( fwrite( buf, 1, olen, f ) != olen )\n    {\n        mbedtls_printf( \"failed\\n  ! fwrite failed\\n\\n\" );\n        fclose( f );\n        goto exit;\n    }\n\n    fclose( f );\n\n    mbedtls_printf( \"\\n  . Done (created \\\"%s\\\")\\n\\n\", filename );\n\nexit:\n    mbedtls_pk_free( &pk );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C && MBEDTLS_RSA_C &&\n          MBEDTLS_SHA256_C && MBEDTLS_PK_PARSE_C && MBEDTLS_FS_IO &&\n          MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/rsa_verify.c",
    "content": "/*\n *  RSA/SHA-256 signature verification program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#define mbedtls_snprintf   snprintf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_RSA_C) ||  \\\n    !defined(MBEDTLS_SHA256_C) || !defined(MBEDTLS_MD_C) || \\\n    !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_RSA_C and/or \"\n            \"MBEDTLS_MD_C and/or \"\n            \"MBEDTLS_SHA256_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/md.h\"\n\n#include <stdio.h>\n#include <string.h>\n\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int ret, c;\n    size_t i;\n    mbedtls_rsa_context rsa;\n    unsigned char hash[32];\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n    char filename[512];\n\n    mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );\n    ret = 1;\n\n    if( argc != 2 )\n    {\n        mbedtls_printf( \"usage: rsa_verify <filename>\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Reading public key from rsa_pub.txt\" );\n    fflush( stdout );\n\n    if( ( f = fopen( \"rsa_pub.txt\", \"rb\" ) ) == NULL )\n    {\n        mbedtls_printf( \" failed\\n  ! Could not open rsa_pub.txt\\n\" \\\n                \"  ! Please run rsa_genkey first\\n\\n\" );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_mpi_read_file( &rsa.N, 16, f ) ) != 0 ||\n        ( ret = mbedtls_mpi_read_file( &rsa.E, 16, f ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_mpi_read_file returned %d\\n\\n\", ret );\n        fclose( f );\n        goto exit;\n    }\n\n    rsa.len = ( mbedtls_mpi_bitlen( &rsa.N ) + 7 ) >> 3;\n\n    fclose( f );\n\n    /*\n     * Extract the RSA signature from the text file\n     */\n    ret = 1;\n    mbedtls_snprintf( filename, sizeof(filename), \"%s.sig\", argv[1] );\n\n    if( ( f = fopen( filename, \"rb\" ) ) == NULL )\n    {\n        mbedtls_printf( \"\\n  ! Could not open %s\\n\\n\", filename );\n        goto exit;\n    }\n\n    i = 0;\n    while( fscanf( f, \"%02X\", &c ) > 0 &&\n           i < (int) sizeof( buf ) )\n        buf[i++] = (unsigned char) c;\n\n    fclose( f );\n\n    if( i != rsa.len )\n    {\n        mbedtls_printf( \"\\n  ! Invalid RSA signature format\\n\\n\" );\n        goto exit;\n    }\n\n    /*\n     * Compute the SHA-256 hash of the input file and\n     * verify the signature\n     */\n    mbedtls_printf( \"\\n  . Verifying the RSA/SHA-256 signature\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_md_file(\n                    mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),\n                    argv[1], hash ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! Could not open or read %s\\n\\n\", argv[1] );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_rsa_pkcs1_verify( &rsa, NULL, NULL, MBEDTLS_RSA_PUBLIC,\n                                  MBEDTLS_MD_SHA256, 20, hash, buf ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_rsa_pkcs1_verify returned -0x%0x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . OK (the signature is valid)\\n\\n\" );\n\n    ret = 0;\n\nexit:\n\n    mbedtls_rsa_free( &rsa );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_RSA_C && MBEDTLS_SHA256_C &&\n          MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/pkey/rsa_verify_pss.c",
    "content": "/*\n *  RSASSA-PSS/SHA-256 signature verification program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_snprintf   snprintf\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_MD_C) || !defined(MBEDTLS_ENTROPY_C) ||  \\\n    !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_SHA256_C) ||        \\\n    !defined(MBEDTLS_PK_PARSE_C) || !defined(MBEDTLS_FS_IO) ||    \\\n    !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_MD_C and/or MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_RSA_C and/or MBEDTLS_SHA256_C and/or \"\n           \"MBEDTLS_PK_PARSE_C and/or MBEDTLS_FS_IO and/or \"\n           \"MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/md.h\"\n#include \"mbedtls/pem.h\"\n#include \"mbedtls/pk.h\"\n#include \"mbedtls/md.h\"\n#include \"mbedtls/x509.h\"\n\n#include <stdio.h>\n#include <string.h>\n\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int ret = 1;\n    size_t i;\n    mbedtls_pk_context pk;\n    unsigned char hash[32];\n    unsigned char buf[MBEDTLS_MPI_MAX_SIZE];\n    char filename[512];\n\n    mbedtls_pk_init( &pk );\n\n    if( argc != 3 )\n    {\n        mbedtls_printf( \"usage: rsa_verify_pss <key_file> <filename>\\n\" );\n\n#if defined(_WIN32)\n        mbedtls_printf( \"\\n\" );\n#endif\n\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . Reading public key from '%s'\", argv[1] );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_pk_parse_public_keyfile( &pk, argv[1] ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! Could not read key from '%s'\\n\", argv[1] );\n        mbedtls_printf( \"  ! mbedtls_pk_parse_public_keyfile returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( !mbedtls_pk_can_do( &pk, MBEDTLS_PK_RSA ) )\n    {\n        ret = 1;\n        mbedtls_printf( \" failed\\n  ! Key is not an RSA key\\n\" );\n        goto exit;\n    }\n\n    mbedtls_rsa_set_padding( mbedtls_pk_rsa( pk ), MBEDTLS_RSA_PKCS_V21, MBEDTLS_MD_SHA256 );\n\n    /*\n     * Extract the RSA signature from the file\n     */\n    ret = 1;\n    mbedtls_snprintf( filename, 512, \"%s.sig\", argv[2] );\n\n    if( ( f = fopen( filename, \"rb\" ) ) == NULL )\n    {\n        mbedtls_printf( \"\\n  ! Could not open %s\\n\\n\", filename );\n        goto exit;\n    }\n\n\n    i = fread( buf, 1, MBEDTLS_MPI_MAX_SIZE, f );\n\n    fclose( f );\n\n    /*\n     * Compute the SHA-256 hash of the input file and\n     * verify the signature\n     */\n    mbedtls_printf( \"\\n  . Verifying the RSA/SHA-256 signature\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_md_file(\n                    mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ),\n                    argv[2], hash ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! Could not open or read %s\\n\\n\", argv[2] );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_pk_verify( &pk, MBEDTLS_MD_SHA256, hash, 0,\n                           buf, i ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_pk_verify returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"\\n  . OK (the signature is valid)\\n\\n\" );\n\n    ret = 0;\n\nexit:\n    mbedtls_pk_free( &pk );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_RSA_C && MBEDTLS_SHA256_C &&\n          MBEDTLS_PK_PARSE_C && MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/random/CMakeLists.txt",
    "content": "add_executable(gen_random_havege gen_random_havege.c)\ntarget_link_libraries(gen_random_havege mbedtls)\n\nadd_executable(gen_random_ctr_drbg gen_random_ctr_drbg.c)\ntarget_link_libraries(gen_random_ctr_drbg mbedtls)\n\nadd_executable(gen_entropy gen_entropy.c)\ntarget_link_libraries(gen_entropy mbedtls)\n\ninstall(TARGETS gen_random_havege gen_random_ctr_drbg gen_entropy\n        DESTINATION \"bin\"\n        PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/random/gen_entropy.c",
    "content": "/**\n *  \\brief Use and generate multiple entropies calls into a file\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_ENTROPY_C) && defined(MBEDTLS_FS_IO)\n#include \"mbedtls/entropy.h\"\n\n#include <stdio.h>\n#endif\n\n#if !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_ENTROPY_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int i, k, ret;\n    mbedtls_entropy_context entropy;\n    unsigned char buf[MBEDTLS_ENTROPY_BLOCK_SIZE];\n\n    if( argc < 2 )\n    {\n        mbedtls_fprintf( stderr, \"usage: %s <output filename>\\n\", argv[0] );\n        return( 1 );\n    }\n\n    if( ( f = fopen( argv[1], \"wb+\" ) ) == NULL )\n    {\n        mbedtls_printf( \"failed to open '%s' for writing.\\n\", argv[1] );\n        return( 1 );\n    }\n\n    mbedtls_entropy_init( &entropy );\n\n    for( i = 0, k = 768; i < k; i++ )\n    {\n        ret = mbedtls_entropy_func( &entropy, buf, sizeof( buf ) );\n        if( ret != 0 )\n        {\n            mbedtls_printf(\"failed!\\n\");\n            goto cleanup;\n        }\n\n        fwrite( buf, 1, sizeof( buf ), f );\n\n        mbedtls_printf( \"Generating %ldkb of data in file '%s'... %04.1f\" \\\n                \"%% done\\r\", (long)(sizeof(buf) * k / 1024), argv[1], (100 * (float) (i + 1)) / k );\n        fflush( stdout );\n    }\n\n    ret = 0;\n\ncleanup:\n    mbedtls_printf( \"\\n\" );\n\n    fclose( f );\n    mbedtls_entropy_free( &entropy );\n\n    return( ret );\n}\n#endif /* MBEDTLS_ENTROPY_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/random/gen_random_ctr_drbg.c",
    "content": "/**\n *  \\brief Use and generate random data into a file via the CTR_DBRG based on AES\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_CTR_DRBG_C) && defined(MBEDTLS_ENTROPY_C) && \\\n defined(MBEDTLS_FS_IO)\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <stdio.h>\n#endif\n\n#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \\\n !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    int i, k, ret;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_entropy_context entropy;\n    unsigned char buf[1024];\n\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    if( argc < 2 )\n    {\n        mbedtls_fprintf( stderr, \"usage: %s <output filename>\\n\", argv[0] );\n        return( 1 );\n    }\n\n    if( ( f = fopen( argv[1], \"wb+\" ) ) == NULL )\n    {\n        mbedtls_printf( \"failed to open '%s' for writing.\\n\", argv[1] );\n        return( 1 );\n    }\n\n    mbedtls_entropy_init( &entropy );\n    ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *) \"RANDOM_GEN\", 10 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \"failed in mbedtls_ctr_drbg_seed: %d\\n\", ret );\n        goto cleanup;\n    }\n    mbedtls_ctr_drbg_set_prediction_resistance( &ctr_drbg, MBEDTLS_CTR_DRBG_PR_OFF );\n\n#if defined(MBEDTLS_FS_IO)\n    ret = mbedtls_ctr_drbg_update_seed_file( &ctr_drbg, \"seedfile\" );\n\n    if( ret == MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR )\n    {\n        mbedtls_printf( \"Failed to open seedfile. Generating one.\\n\" );\n        ret = mbedtls_ctr_drbg_write_seed_file( &ctr_drbg, \"seedfile\" );\n        if( ret != 0 )\n        {\n            mbedtls_printf( \"failed in mbedtls_ctr_drbg_write_seed_file: %d\\n\", ret );\n            goto cleanup;\n        }\n    }\n    else if( ret != 0 )\n    {\n        mbedtls_printf( \"failed in mbedtls_ctr_drbg_update_seed_file: %d\\n\", ret );\n        goto cleanup;\n    }\n#endif\n\n    for( i = 0, k = 768; i < k; i++ )\n    {\n        ret = mbedtls_ctr_drbg_random( &ctr_drbg, buf, sizeof( buf ) );\n        if( ret != 0 )\n        {\n            mbedtls_printf(\"failed!\\n\");\n            goto cleanup;\n        }\n\n        fwrite( buf, 1, sizeof( buf ), f );\n\n        mbedtls_printf( \"Generating %ldkb of data in file '%s'... %04.1f\" \\\n                \"%% done\\r\", (long)(sizeof(buf) * k / 1024), argv[1], (100 * (float) (i + 1)) / k );\n        fflush( stdout );\n    }\n\n    ret = 0;\n\ncleanup:\n    mbedtls_printf(\"\\n\");\n\n    fclose( f );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n    return( ret );\n}\n#endif /* MBEDTLS_CTR_DRBG_C && MBEDTLS_ENTROPY_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/random/gen_random_havege.c",
    "content": "/**\n *  \\brief Generate random data into a file\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_HAVEGE_C) && defined(MBEDTLS_FS_IO)\n#include \"mbedtls/havege.h\"\n\n#include <stdio.h>\n#include <time.h>\n#endif\n\n#if !defined(MBEDTLS_HAVEGE_C) || !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_HAVEGE_C not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( int argc, char *argv[] )\n{\n    FILE *f;\n    time_t t;\n    int i, k, ret = 0;\n    mbedtls_havege_state hs;\n    unsigned char buf[1024];\n\n    if( argc < 2 )\n    {\n        mbedtls_fprintf( stderr, \"usage: %s <output filename>\\n\", argv[0] );\n        return( 1 );\n    }\n\n    if( ( f = fopen( argv[1], \"wb+\" ) ) == NULL )\n    {\n        mbedtls_printf( \"failed to open '%s' for writing.\\n\", argv[1] );\n        return( 1 );\n    }\n\n    mbedtls_havege_init( &hs );\n\n    t = time( NULL );\n\n    for( i = 0, k = 768; i < k; i++ )\n    {\n        if( mbedtls_havege_random( &hs, buf, sizeof( buf ) ) != 0 )\n        {\n            mbedtls_printf( \"Failed to get random from source.\\n\" );\n\n            ret = 1;\n            goto exit;\n        }\n\n        fwrite( buf, sizeof( buf ), 1, f );\n\n        mbedtls_printf( \"Generating %ldkb of data in file '%s'... %04.1f\" \\\n                \"%% done\\r\", (long)(sizeof(buf) * k / 1024), argv[1], (100 * (float) (i + 1)) / k );\n        fflush( stdout );\n    }\n\n    if( t == time( NULL ) )\n        t--;\n\n    mbedtls_printf(\" \\n \");\n\nexit:\n    mbedtls_havege_free( &hs );\n    fclose( f );\n    return( ret );\n}\n#endif /* MBEDTLS_HAVEGE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/CMakeLists.txt",
    "content": "set(THREADS_USE_PTHREADS_WIN32 true)\nfind_package(Threads)\n\nset(libs\n    mbedtls\n)\n\nset(targets\n    dtls_client\n    dtls_server\n    ssl_client1\n    ssl_client2\n    ssl_server\n    ssl_fork_server\n    ssl_mail_client\n    mini_client\n)\n\nif(USE_PKCS11_HELPER_LIBRARY)\n    set(libs ${libs} pkcs11-helper)\nendif(USE_PKCS11_HELPER_LIBRARY)\n\nif(ENABLE_ZLIB_SUPPORT)\n    set(libs ${libs} ${ZLIB_LIBRARIES})\nendif(ENABLE_ZLIB_SUPPORT)\n\nadd_executable(dtls_client dtls_client.c)\ntarget_link_libraries(dtls_client ${libs})\n\nadd_executable(dtls_server dtls_server.c)\ntarget_link_libraries(dtls_server ${libs})\n\nadd_executable(ssl_client1 ssl_client1.c)\ntarget_link_libraries(ssl_client1 ${libs})\n\nadd_executable(ssl_client2 ssl_client2.c)\ntarget_link_libraries(ssl_client2 ${libs})\n\nadd_executable(ssl_server ssl_server.c)\ntarget_link_libraries(ssl_server ${libs})\n\nadd_executable(ssl_server2 ssl_server2.c)\ntarget_link_libraries(ssl_server2 ${libs})\n\nadd_executable(ssl_fork_server ssl_fork_server.c)\ntarget_link_libraries(ssl_fork_server ${libs})\n\nadd_executable(ssl_mail_client ssl_mail_client.c)\ntarget_link_libraries(ssl_mail_client ${libs})\n\nadd_executable(mini_client mini_client.c)\ntarget_link_libraries(mini_client ${libs})\n\nif(THREADS_FOUND)\n    add_executable(ssl_pthread_server ssl_pthread_server.c)\n    target_link_libraries(ssl_pthread_server ${libs} ${CMAKE_THREAD_LIBS_INIT})\n    set(targets ${targets} ssl_pthread_server)\nendif(THREADS_FOUND)\n\ninstall(TARGETS ${targets}\n        DESTINATION \"bin\"\n        PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/dtls_client.c",
    "content": "/*\n *  Simple DTLS client demonstration program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#define mbedtls_fprintf    fprintf\n#endif\n\n#if !defined(MBEDTLS_SSL_CLI_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ||    \\\n    !defined(MBEDTLS_NET_C)  || !defined(MBEDTLS_TIMING_C) ||             \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_CTR_DRBG_C) ||        \\\n    !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_RSA_C) ||      \\\n    !defined(MBEDTLS_CERTS_C) || !defined(MBEDTLS_PEM_PARSE_C)\nint main( void )\n{\n    mbedtls_printf( \"MBEDTLS_SSL_CLI_C and/or MBEDTLS_SSL_PROTO_DTLS and/or \"\n            \"MBEDTLS_NET_C and/or MBEDTLS_TIMING_C and/or \"\n            \"MBEDTLS_ENTROPY_C and/or MBEDTLS_CTR_DRBG_C and/or \"\n            \"MBEDTLS_X509_CRT_PARSE_C and/or MBEDTLS_RSA_C and/or \"\n            \"MBEDTLS_CERTS_C and/or MBEDTLS_PEM_PARSE_C not defined.\\n\" );\n    return( 0 );\n}\n#else\n\n#include <string.h>\n\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/debug.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/error.h\"\n#include \"mbedtls/certs.h\"\n#include \"mbedtls/timing.h\"\n\n#define SERVER_PORT \"4433\"\n#define SERVER_NAME \"localhost\"\n#define SERVER_ADDR \"127.0.0.1\" /* forces IPv4 */\n#define MESSAGE     \"Echo this\"\n\n#define READ_TIMEOUT_MS 1000\n#define MAX_RETRY       5\n\n#define DEBUG_LEVEL 0\n\nstatic void my_debug( void *ctx, int level,\n                      const char *file, int line,\n                      const char *str )\n{\n    ((void) level);\n\n    mbedtls_fprintf( (FILE *) ctx, \"%s:%04d: %s\", file, line, str );\n    fflush(  (FILE *) ctx  );\n}\n\nint main( int argc, char *argv[] )\n{\n    int ret, len;\n    mbedtls_net_context server_fd;\n    uint32_t flags;\n    unsigned char buf[1024];\n    const char *pers = \"dtls_client\";\n    int retry_left = MAX_RETRY;\n\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_context ssl;\n    mbedtls_ssl_config conf;\n    mbedtls_x509_crt cacert;\n    mbedtls_timing_delay_context timer;\n\n    ((void) argc);\n    ((void) argv);\n\n#if defined(MBEDTLS_DEBUG_C)\n    mbedtls_debug_set_threshold( DEBUG_LEVEL );\n#endif\n\n    /*\n     * 0. Initialize the RNG and the session data\n     */\n    mbedtls_net_init( &server_fd );\n    mbedtls_ssl_init( &ssl );\n    mbedtls_ssl_config_init( &conf );\n    mbedtls_x509_crt_init( &cacert );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 0. Load certificates\n     */\n    mbedtls_printf( \"  . Loading the CA root certificate ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_cas_pem,\n                          mbedtls_test_cas_pem_len );\n    if( ret < 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok (%d skipped)\\n\", ret );\n\n    /*\n     * 1. Start the connection\n     */\n    mbedtls_printf( \"  . Connecting to udp/%s/%s...\", SERVER_NAME, SERVER_PORT );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_connect( &server_fd, SERVER_ADDR,\n                                         SERVER_PORT, MBEDTLS_NET_PROTO_UDP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_connect returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 2. Setup stuff\n     */\n    mbedtls_printf( \"  . Setting up the DTLS structure...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ssl_config_defaults( &conf,\n                   MBEDTLS_SSL_IS_CLIENT,\n                   MBEDTLS_SSL_TRANSPORT_DATAGRAM,\n                   MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_config_defaults returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /* OPTIONAL is usually a bad choice for security, but makes interop easier\n     * in this simplified example, in which the ca chain is hardcoded.\n     * Production code should set a proper ca chain and use REQUIRED. */\n    mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_OPTIONAL );\n    mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );\n    mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n    mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );\n\n    if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_setup returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_ssl_set_hostname( &ssl, SERVER_NAME ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_set_hostname returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_set_bio( &ssl, &server_fd,\n                         mbedtls_net_send, mbedtls_net_recv, mbedtls_net_recv_timeout );\n\n    mbedtls_ssl_set_timer_cb( &ssl, &timer, mbedtls_timing_set_delay,\n                                            mbedtls_timing_get_delay );\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 4. Handshake\n     */\n    mbedtls_printf( \"  . Performing the SSL/TLS handshake...\" );\n    fflush( stdout );\n\n    do ret = mbedtls_ssl_handshake( &ssl );\n    while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n           ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_handshake returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 5. Verify the server certificate\n     */\n    mbedtls_printf( \"  . Verifying peer X.509 certificate...\" );\n\n    /* In real life, we would have used MBEDTLS_SSL_VERIFY_REQUIRED so that the\n     * handshake would not succeed if the peer's cert is bad.  Even if we used\n     * MBEDTLS_SSL_VERIFY_OPTIONAL, we would bail out here if ret != 0 */\n    if( ( flags = mbedtls_ssl_get_verify_result( &ssl ) ) != 0 )\n    {\n        char vrfy_buf[512];\n\n        mbedtls_printf( \" failed\\n\" );\n\n        mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), \"  ! \", flags );\n\n        mbedtls_printf( \"%s\\n\", vrfy_buf );\n    }\n    else\n        mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 6. Write the echo request\n     */\nsend_request:\n    mbedtls_printf( \"  > Write to server:\" );\n    fflush( stdout );\n\n    len = sizeof( MESSAGE ) - 1;\n\n    do ret = mbedtls_ssl_write( &ssl, (unsigned char *) MESSAGE, len );\n    while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n           ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n    if( ret < 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_write returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    len = ret;\n    mbedtls_printf( \" %d bytes written\\n\\n%s\\n\\n\", len, MESSAGE );\n\n    /*\n     * 7. Read the echo response\n     */\n    mbedtls_printf( \"  < Read from server:\" );\n    fflush( stdout );\n\n    len = sizeof( buf ) - 1;\n    memset( buf, 0, sizeof( buf ) );\n\n    do ret = mbedtls_ssl_read( &ssl, buf, len );\n    while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n           ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n    if( ret <= 0 )\n    {\n        switch( ret )\n        {\n            case MBEDTLS_ERR_SSL_TIMEOUT:\n                mbedtls_printf( \" timeout\\n\\n\" );\n                if( retry_left-- > 0 )\n                    goto send_request;\n                goto exit;\n\n            case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:\n                mbedtls_printf( \" connection was closed gracefully\\n\" );\n                ret = 0;\n                goto close_notify;\n\n            default:\n                mbedtls_printf( \" mbedtls_ssl_read returned -0x%x\\n\\n\", -ret );\n                goto exit;\n        }\n    }\n\n    len = ret;\n    mbedtls_printf( \" %d bytes read\\n\\n%s\\n\\n\", len, buf );\n\n    /*\n     * 8. Done, cleanly close the connection\n     */\nclose_notify:\n    mbedtls_printf( \"  . Closing the connection...\" );\n\n    /* No error checking, the connection might be closed already */\n    do ret = mbedtls_ssl_close_notify( &ssl );\n    while( ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n    ret = 0;\n\n    mbedtls_printf( \" done\\n\" );\n\n    /*\n     * 9. Final clean-ups and exit\n     */\nexit:\n\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        mbedtls_printf( \"Last error was: %d - %s\\n\\n\", ret, error_buf );\n    }\n#endif\n\n    mbedtls_net_free( &server_fd );\n\n    mbedtls_x509_crt_free( &cacert );\n    mbedtls_ssl_free( &ssl );\n    mbedtls_ssl_config_free( &conf );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    /* Shell can not handle large exit numbers -> 1 for errors */\n    if( ret < 0 )\n        ret = 1;\n\n    return( ret );\n}\n#endif /* MBEDTLS_SSL_CLI_C && MBEDTLS_SSL_PROTO_DTLS && MBEDTLS_NET_C &&\n          MBEDTLD_TIMING_C && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C &&\n          MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_RSA_C && MBEDTLS_CERTS_C &&\n          MBEDTLS_PEM_PARSE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/dtls_server.c",
    "content": "/*\n *  Simple DTLS server demonstration program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#define mbedtls_fprintf    fprintf\n#define mbedtls_time_t     time_t\n#endif\n\n#if !defined(MBEDTLS_SSL_SRV_C) || !defined(MBEDTLS_SSL_PROTO_DTLS) ||    \\\n    !defined(MBEDTLS_SSL_COOKIE_C) || !defined(MBEDTLS_NET_C) ||          \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_CTR_DRBG_C) ||        \\\n    !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_RSA_C) ||      \\\n    !defined(MBEDTLS_CERTS_C) || !defined(MBEDTLS_PEM_PARSE_C) ||         \\\n    !defined(MBEDTLS_TIMING_C)\n\nint main( void )\n{\n    printf( \"MBEDTLS_SSL_SRV_C and/or MBEDTLS_SSL_PROTO_DTLS and/or \"\n            \"MBEDTLS_SSL_COOKIE_C and/or MBEDTLS_NET_C and/or \"\n            \"MBEDTLS_ENTROPY_C and/or MBEDTLS_CTR_DRBG_C and/or \"\n            \"MBEDTLS_X509_CRT_PARSE_C and/or MBEDTLS_RSA_C and/or \"\n            \"MBEDTLS_CERTS_C and/or MBEDTLS_PEM_PARSE_C and/or \"\n            \"MBEDTLS_TIMING_C not defined.\\n\" );\n    return( 0 );\n}\n#else\n\n#if defined(_WIN32)\n#include <windows.h>\n#endif\n\n#include <string.h>\n#include <stdlib.h>\n#include <stdio.h>\n\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/certs.h\"\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/ssl_cookie.h\"\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/error.h\"\n#include \"mbedtls/debug.h\"\n#include \"mbedtls/timing.h\"\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n#include \"mbedtls/ssl_cache.h\"\n#endif\n\n#define READ_TIMEOUT_MS 10000   /* 5 seconds */\n#define DEBUG_LEVEL 0\n\nstatic void my_debug( void *ctx, int level,\n                      const char *file, int line,\n                      const char *str )\n{\n    ((void) level);\n\n    mbedtls_fprintf( (FILE *) ctx, \"%s:%04d: %s\", file, line, str );\n    fflush(  (FILE *) ctx  );\n}\n\nint main( void )\n{\n    int ret, len;\n    mbedtls_net_context listen_fd, client_fd;\n    unsigned char buf[1024];\n    const char *pers = \"dtls_server\";\n    unsigned char client_ip[16] = { 0 };\n    size_t cliip_len;\n    mbedtls_ssl_cookie_ctx cookie_ctx;\n\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_context ssl;\n    mbedtls_ssl_config conf;\n    mbedtls_x509_crt srvcert;\n    mbedtls_pk_context pkey;\n    mbedtls_timing_delay_context timer;\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_context cache;\n#endif\n\n    mbedtls_net_init( &listen_fd );\n    mbedtls_net_init( &client_fd );\n    mbedtls_ssl_init( &ssl );\n    mbedtls_ssl_config_init( &conf );\n    mbedtls_ssl_cookie_init( &cookie_ctx );\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_init( &cache );\n#endif\n    mbedtls_x509_crt_init( &srvcert );\n    mbedtls_pk_init( &pkey );\n    mbedtls_entropy_init( &entropy );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n#if defined(MBEDTLS_DEBUG_C)\n    mbedtls_debug_set_threshold( DEBUG_LEVEL );\n#endif\n\n    /*\n     * 1. Load the certificates and private RSA key\n     */\n    printf( \"\\n  . Loading the server cert. and key...\" );\n    fflush( stdout );\n\n    /*\n     * This demonstration program uses embedded test certificates.\n     * Instead, you may want to use mbedtls_x509_crt_parse_file() to read the\n     * server and CA certificates, as well as mbedtls_pk_parse_keyfile().\n     */\n    ret = mbedtls_x509_crt_parse( &srvcert, (const unsigned char *) mbedtls_test_srv_crt,\n                          mbedtls_test_srv_crt_len );\n    if( ret != 0 )\n    {\n        printf( \" failed\\n  !  mbedtls_x509_crt_parse returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_x509_crt_parse( &srvcert, (const unsigned char *) mbedtls_test_cas_pem,\n                          mbedtls_test_cas_pem_len );\n    if( ret != 0 )\n    {\n        printf( \" failed\\n  !  mbedtls_x509_crt_parse returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    ret =  mbedtls_pk_parse_key( &pkey, (const unsigned char *) mbedtls_test_srv_key,\n                         mbedtls_test_srv_key_len, NULL, 0 );\n    if( ret != 0 )\n    {\n        printf( \" failed\\n  !  mbedtls_pk_parse_key returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    printf( \" ok\\n\" );\n\n    /*\n     * 2. Setup the \"listening\" UDP socket\n     */\n    printf( \"  . Bind on udp/*/4433 ...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_bind( &listen_fd, NULL, \"4433\", MBEDTLS_NET_PROTO_UDP ) ) != 0 )\n    {\n        printf( \" failed\\n  ! mbedtls_net_bind returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    printf( \" ok\\n\" );\n\n    /*\n     * 3. Seed the RNG\n     */\n    printf( \"  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    printf( \" ok\\n\" );\n\n    /*\n     * 4. Setup stuff\n     */\n    printf( \"  . Setting up the DTLS data...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ssl_config_defaults( &conf,\n                    MBEDTLS_SSL_IS_SERVER,\n                    MBEDTLS_SSL_TRANSPORT_DATAGRAM,\n                    MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_config_defaults returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n    mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_conf_session_cache( &conf, &cache,\n                                   mbedtls_ssl_cache_get,\n                                   mbedtls_ssl_cache_set );\n#endif\n\n    mbedtls_ssl_conf_ca_chain( &conf, srvcert.next, NULL );\n   if( ( ret = mbedtls_ssl_conf_own_cert( &conf, &srvcert, &pkey ) ) != 0 )\n    {\n        printf( \" failed\\n  ! mbedtls_ssl_conf_own_cert returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_ssl_cookie_setup( &cookie_ctx,\n                                  mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        printf( \" failed\\n  ! mbedtls_ssl_cookie_setup returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_conf_dtls_cookies( &conf, mbedtls_ssl_cookie_write, mbedtls_ssl_cookie_check,\n                               &cookie_ctx );\n\n    if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )\n    {\n        printf( \" failed\\n  ! mbedtls_ssl_setup returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_set_timer_cb( &ssl, &timer, mbedtls_timing_set_delay,\n                                            mbedtls_timing_get_delay );\n\n    printf( \" ok\\n\" );\n\nreset:\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        printf(\"Last error was: %d - %s\\n\\n\", ret, error_buf );\n    }\n#endif\n\n    mbedtls_net_free( &client_fd );\n\n    mbedtls_ssl_session_reset( &ssl );\n\n    /*\n     * 3. Wait until a client connects\n     */\n    printf( \"  . Waiting for a remote connection ...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_accept( &listen_fd, &client_fd,\n                    client_ip, sizeof( client_ip ), &cliip_len ) ) != 0 )\n    {\n        printf( \" failed\\n  ! mbedtls_net_accept returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /* For HelloVerifyRequest cookies */\n    if( ( ret = mbedtls_ssl_set_client_transport_id( &ssl,\n                    client_ip, cliip_len ) ) != 0 )\n    {\n        printf( \" failed\\n  ! \"\n                \"mbedtls_ssl_set_client_transport_id() returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_set_bio( &ssl, &client_fd,\n                         mbedtls_net_send, mbedtls_net_recv, mbedtls_net_recv_timeout );\n\n    printf( \" ok\\n\" );\n\n    /*\n     * 5. Handshake\n     */\n    printf( \"  . Performing the DTLS handshake...\" );\n    fflush( stdout );\n\n    do ret = mbedtls_ssl_handshake( &ssl );\n    while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n           ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n    if( ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED )\n    {\n        printf( \" hello verification requested\\n\" );\n        ret = 0;\n        goto reset;\n    }\n    else if( ret != 0 )\n    {\n        printf( \" failed\\n  ! mbedtls_ssl_handshake returned -0x%x\\n\\n\", -ret );\n        goto reset;\n    }\n\n    printf( \" ok\\n\" );\n\n    /*\n     * 6. Read the echo Request\n     */\n    printf( \"  < Read from client:\" );\n    fflush( stdout );\n\n    len = sizeof( buf ) - 1;\n    memset( buf, 0, sizeof( buf ) );\n\n    do ret = mbedtls_ssl_read( &ssl, buf, len );\n    while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n           ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n    if( ret <= 0 )\n    {\n        switch( ret )\n        {\n            case MBEDTLS_ERR_SSL_TIMEOUT:\n                printf( \" timeout\\n\\n\" );\n                goto reset;\n\n            case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:\n                printf( \" connection was closed gracefully\\n\" );\n                ret = 0;\n                goto close_notify;\n\n            default:\n                printf( \" mbedtls_ssl_read returned -0x%x\\n\\n\", -ret );\n                goto reset;\n        }\n    }\n\n    len = ret;\n    printf( \" %d bytes read\\n\\n%s\\n\\n\", len, buf );\n\n    /*\n     * 7. Write the 200 Response\n     */\n    printf( \"  > Write to client:\" );\n    fflush( stdout );\n\n    do ret = mbedtls_ssl_write( &ssl, buf, len );\n    while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n           ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n    if( ret < 0 )\n    {\n        printf( \" failed\\n  ! mbedtls_ssl_write returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    len = ret;\n    printf( \" %d bytes written\\n\\n%s\\n\\n\", len, buf );\n\n    /*\n     * 8. Done, cleanly close the connection\n     */\nclose_notify:\n    printf( \"  . Closing the connection...\" );\n\n    /* No error checking, the connection might be closed already */\n    do ret = mbedtls_ssl_close_notify( &ssl );\n    while( ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n    ret = 0;\n\n    printf( \" done\\n\" );\n\n    goto reset;\n\n    /*\n     * Final clean-ups and exit\n     */\nexit:\n\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        printf( \"Last error was: %d - %s\\n\\n\", ret, error_buf );\n    }\n#endif\n\n    mbedtls_net_free( &client_fd );\n    mbedtls_net_free( &listen_fd );\n\n    mbedtls_x509_crt_free( &srvcert );\n    mbedtls_pk_free( &pkey );\n    mbedtls_ssl_free( &ssl );\n    mbedtls_ssl_config_free( &conf );\n    mbedtls_ssl_cookie_free( &cookie_ctx );\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_free( &cache );\n#endif\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    printf( \"  Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    /* Shell can not handle large exit numbers -> 1 for errors */\n    if( ret < 0 )\n        ret = 1;\n\n    return( ret );\n}\n#endif /* MBEDTLS_SSL_SRV_C && MBEDTLS_SSL_PROTO_DTLS &&\n          MBEDTLS_SSL_COOKIE_C && MBEDTLS_NET_C && MBEDTLS_ENTROPY_C &&\n          MBEDTLS_CTR_DRBG_C && MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_RSA_C\n          && MBEDTLS_CERTS_C && MBEDTLS_PEM_PARSE_C && MBEDTLS_TIMING_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/mini_client.c",
    "content": "/*\n *  Minimal SSL client, used for memory measurements.\n *  (meant to be used with config-suite-b.h or config-ccm-psk-tls1_2.h)\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n/*\n * We're creating and connecting the socket \"manually\" rather than using the\n * NET module, in order to avoid the overhead of getaddrinfo() which tends to\n * dominate memory usage in small configurations. For the sake of simplicity,\n * only a Unix version is implemented.\n *\n * Warning: we are breaking some of the abtractions from the NET layer here.\n * This is not a good example for general use. This programs has the specific\n * goal of minimizing use of the libc functions on full-blown OSes.\n */\n#if defined(unix) || defined(__unix__) || defined(__unix) || defined(__APPLE__)\n#define UNIX\n#endif\n\n#if !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_ENTROPY_C) || \\\n    !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_SSL_CLI_C) || \\\n    !defined(UNIX)\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf printf\n#endif\n\nint main( void )\n{\n    mbedtls_printf( \"MBEDTLS_CTR_DRBG_C and/or MBEDTLS_ENTROPY_C and/or \"\n            \"MBEDTLS_NET_C and/or MBEDTLS_SSL_CLI_C and/or UNIX \"\n            \"not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdlib.h>\n#endif\n\n#include <string.h>\n\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n\n/*\n * Hardcoded values for server host and port\n */\n#define PORT_BE 0x1151      /* 4433 */\n#define PORT_LE 0x5111\n#define ADDR_BE 0x7f000001  /* 127.0.0.1 */\n#define ADDR_LE 0x0100007f\n#define HOSTNAME \"localhost\" /* for cert verification if enabled */\n\n#define GET_REQUEST \"GET / HTTP/1.0\\r\\n\\r\\n\"\n\nconst char *pers = \"mini_client\";\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\nconst unsigned char psk[] = {\n    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\n    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f\n};\nconst char psk_id[] = \"Client_identity\";\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n/* This is tests/data_files/test-ca2.crt, a CA using EC secp384r1 */\nconst unsigned char ca_cert[] = {\n    0x30, 0x82, 0x02, 0x52, 0x30, 0x82, 0x01, 0xd7, 0xa0, 0x03, 0x02, 0x01,\n    0x02, 0x02, 0x09, 0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8,\n    0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02,\n    0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n    0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,\n    0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,\n    0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,\n    0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,\n    0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39,\n    0x32, 0x34, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a, 0x17, 0x0d, 0x32,\n    0x33, 0x30, 0x39, 0x32, 0x32, 0x31, 0x35, 0x34, 0x39, 0x34, 0x38, 0x5a,\n    0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\n    0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a,\n    0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c,\n    0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c,\n    0x61, 0x72, 0x73, 0x73, 0x6c, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45,\n    0x43, 0x20, 0x43, 0x41, 0x30, 0x76, 0x30, 0x10, 0x06, 0x07, 0x2a, 0x86,\n    0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05, 0x2b, 0x81, 0x04, 0x00, 0x22,\n    0x03, 0x62, 0x00, 0x04, 0xc3, 0xda, 0x2b, 0x34, 0x41, 0x37, 0x58, 0x2f,\n    0x87, 0x56, 0xfe, 0xfc, 0x89, 0xba, 0x29, 0x43, 0x4b, 0x4e, 0xe0, 0x6e,\n    0xc3, 0x0e, 0x57, 0x53, 0x33, 0x39, 0x58, 0xd4, 0x52, 0xb4, 0x91, 0x95,\n    0x39, 0x0b, 0x23, 0xdf, 0x5f, 0x17, 0x24, 0x62, 0x48, 0xfc, 0x1a, 0x95,\n    0x29, 0xce, 0x2c, 0x2d, 0x87, 0xc2, 0x88, 0x52, 0x80, 0xaf, 0xd6, 0x6a,\n    0xab, 0x21, 0xdd, 0xb8, 0xd3, 0x1c, 0x6e, 0x58, 0xb8, 0xca, 0xe8, 0xb2,\n    0x69, 0x8e, 0xf3, 0x41, 0xad, 0x29, 0xc3, 0xb4, 0x5f, 0x75, 0xa7, 0x47,\n    0x6f, 0xd5, 0x19, 0x29, 0x55, 0x69, 0x9a, 0x53, 0x3b, 0x20, 0xb4, 0x66,\n    0x16, 0x60, 0x33, 0x1e, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x1d,\n    0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9d, 0x6d, 0x20,\n    0x24, 0x49, 0x01, 0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24,\n    0xc9, 0xdb, 0xfb, 0x36, 0x7c, 0x30, 0x6e, 0x06, 0x03, 0x55, 0x1d, 0x23,\n    0x04, 0x67, 0x30, 0x65, 0x80, 0x14, 0x9d, 0x6d, 0x20, 0x24, 0x49, 0x01,\n    0x3f, 0x2b, 0xcb, 0x78, 0xb5, 0x19, 0xbc, 0x7e, 0x24, 0xc9, 0xdb, 0xfb,\n    0x36, 0x7c, 0xa1, 0x42, 0xa4, 0x40, 0x30, 0x3e, 0x31, 0x0b, 0x30, 0x09,\n    0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x4e, 0x4c, 0x31, 0x11, 0x30,\n    0x0f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x08, 0x50, 0x6f, 0x6c, 0x61,\n    0x72, 0x53, 0x53, 0x4c, 0x31, 0x1c, 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04,\n    0x03, 0x13, 0x13, 0x50, 0x6f, 0x6c, 0x61, 0x72, 0x73, 0x73, 0x6c, 0x20,\n    0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x43, 0x20, 0x43, 0x41, 0x82, 0x09,\n    0x00, 0xc1, 0x43, 0xe2, 0x7e, 0x62, 0x43, 0xcc, 0xe8, 0x30, 0x0c, 0x06,\n    0x03, 0x55, 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,\n    0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03,\n    0x69, 0x00, 0x30, 0x66, 0x02, 0x31, 0x00, 0xc3, 0xb4, 0x62, 0x73, 0x56,\n    0x28, 0x95, 0x00, 0x7d, 0x78, 0x12, 0x26, 0xd2, 0x71, 0x7b, 0x19, 0xf8,\n    0x8a, 0x98, 0x3e, 0x92, 0xfe, 0x33, 0x9e, 0xe4, 0x79, 0xd2, 0xfe, 0x7a,\n    0xb7, 0x87, 0x74, 0x3c, 0x2b, 0xb8, 0xd7, 0x69, 0x94, 0x0b, 0xa3, 0x67,\n    0x77, 0xb8, 0xb3, 0xbe, 0xd1, 0x36, 0x32, 0x02, 0x31, 0x00, 0xfd, 0x67,\n    0x9c, 0x94, 0x23, 0x67, 0xc0, 0x56, 0xba, 0x4b, 0x33, 0x15, 0x00, 0xc6,\n    0xe3, 0xcc, 0x31, 0x08, 0x2c, 0x9c, 0x8b, 0xda, 0xa9, 0x75, 0x23, 0x2f,\n    0xb8, 0x28, 0xe7, 0xf2, 0x9c, 0x14, 0x3a, 0x40, 0x01, 0x5c, 0xaf, 0x0c,\n    0xb2, 0xcf, 0x74, 0x7f, 0x30, 0x9f, 0x08, 0x43, 0xad, 0x20,\n};\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\nenum exit_codes\n{\n    exit_ok = 0,\n    ctr_drbg_seed_failed,\n    ssl_config_defaults_failed,\n    ssl_setup_failed,\n    hostname_failed,\n    socket_failed,\n    connect_failed,\n    x509_crt_parse_failed,\n    ssl_handshake_failed,\n    ssl_write_failed,\n};\n\nint main( void )\n{\n    int ret = exit_ok;\n    mbedtls_net_context server_fd;\n    struct sockaddr_in addr;\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_crt ca;\n#endif\n\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_context ssl;\n    mbedtls_ssl_config conf;\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    /*\n     * 0. Initialize and setup stuff\n     */\n    mbedtls_net_init( &server_fd );\n    mbedtls_ssl_init( &ssl );\n    mbedtls_ssl_config_init( &conf );\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_crt_init( &ca );\n#endif\n\n    mbedtls_entropy_init( &entropy );\n    if( mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                       (const unsigned char *) pers, strlen( pers ) ) != 0 )\n    {\n        ret = ctr_drbg_seed_failed;\n        goto exit;\n    }\n\n    if( mbedtls_ssl_config_defaults( &conf,\n                MBEDTLS_SSL_IS_CLIENT,\n                MBEDTLS_SSL_TRANSPORT_STREAM,\n                MBEDTLS_SSL_PRESET_DEFAULT ) != 0 )\n    {\n        ret = ssl_config_defaults_failed;\n        goto exit;\n    }\n\n    mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    mbedtls_ssl_conf_psk( &conf, psk, sizeof( psk ),\n                (const unsigned char *) psk_id, sizeof( psk_id ) - 1 );\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    if( mbedtls_x509_crt_parse_der( &ca, ca_cert, sizeof( ca_cert ) ) != 0 )\n    {\n        ret = x509_crt_parse_failed;\n        goto exit;\n    }\n\n    mbedtls_ssl_conf_ca_chain( &conf, &ca, NULL );\n    mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_REQUIRED );\n#endif\n\n    if( mbedtls_ssl_setup( &ssl, &conf ) != 0 )\n    {\n        ret = ssl_setup_failed;\n        goto exit;\n    }\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    if( mbedtls_ssl_set_hostname( &ssl, HOSTNAME ) != 0 )\n    {\n        ret = hostname_failed;\n        goto exit;\n    }\n#endif\n\n    /*\n     * 1. Start the connection\n     */\n    memset( &addr, 0, sizeof( addr ) );\n    addr.sin_family = AF_INET;\n\n    ret = 1; /* for endianness detection */\n    addr.sin_port = *((char *) &ret) == ret ? PORT_LE : PORT_BE;\n    addr.sin_addr.s_addr = *((char *) &ret) == ret ? ADDR_LE : ADDR_BE;\n    ret = 0;\n\n    if( ( server_fd.fd = socket( AF_INET, SOCK_STREAM, 0 ) ) < 0 )\n    {\n        ret = socket_failed;\n        goto exit;\n    }\n\n    if( connect( server_fd.fd,\n                (const struct sockaddr *) &addr, sizeof( addr ) ) < 0 )\n    {\n        ret = connect_failed;\n        goto exit;\n    }\n\n    mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );\n\n    if( mbedtls_ssl_handshake( &ssl ) != 0 )\n    {\n        ret = ssl_handshake_failed;\n        goto exit;\n    }\n\n    /*\n     * 2. Write the GET request and close the connection\n     */\n    if( mbedtls_ssl_write( &ssl, (const unsigned char *) GET_REQUEST,\n                         sizeof( GET_REQUEST ) - 1 ) <= 0 )\n    {\n        ret = ssl_write_failed;\n        goto exit;\n    }\n\n    mbedtls_ssl_close_notify( &ssl );\n\nexit:\n    mbedtls_net_free( &server_fd );\n\n    mbedtls_ssl_free( &ssl );\n    mbedtls_ssl_config_free( &conf );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_crt_free( &ca );\n#endif\n\n    return( ret );\n}\n#endif\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/ssl_client1.c",
    "content": "/*\n *  SSL client demonstration program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_time       time \n#define mbedtls_time_t     time_t\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_ENTROPY_C) ||  \\\n    !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_CLI_C) || \\\n    !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_RSA_C) ||         \\\n    !defined(MBEDTLS_CERTS_C) || !defined(MBEDTLS_PEM_PARSE_C) || \\\n    !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_X509_CRT_PARSE_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_SSL_TLS_C and/or MBEDTLS_SSL_CLI_C and/or \"\n           \"MBEDTLS_NET_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_CTR_DRBG_C and/or MBEDTLS_X509_CRT_PARSE_C \"\n           \"not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/debug.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/error.h\"\n#include \"mbedtls/certs.h\"\n\n#include <string.h>\n\n#define SERVER_PORT \"4433\"\n#define SERVER_NAME \"localhost\"\n#define GET_REQUEST \"GET / HTTP/1.0\\r\\n\\r\\n\"\n\n#define DEBUG_LEVEL 1\n\nstatic void my_debug( void *ctx, int level,\n                      const char *file, int line,\n                      const char *str )\n{\n    ((void) level);\n\n    mbedtls_fprintf( (FILE *) ctx, \"%s:%04d: %s\", file, line, str );\n    fflush(  (FILE *) ctx  );\n}\n\nint main( void )\n{\n    int ret, len;\n    mbedtls_net_context server_fd;\n    uint32_t flags;\n    unsigned char buf[1024];\n    const char *pers = \"ssl_client1\";\n\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_context ssl;\n    mbedtls_ssl_config conf;\n    mbedtls_x509_crt cacert;\n\n#if defined(MBEDTLS_DEBUG_C)\n    mbedtls_debug_set_threshold( DEBUG_LEVEL );\n#endif\n\n    /*\n     * 0. Initialize the RNG and the session data\n     */\n    mbedtls_net_init( &server_fd );\n    mbedtls_ssl_init( &ssl );\n    mbedtls_ssl_config_init( &conf );\n    mbedtls_x509_crt_init( &cacert );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 0. Initialize certificates\n     */\n    mbedtls_printf( \"  . Loading the CA root certificate ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_cas_pem,\n                          mbedtls_test_cas_pem_len );\n    if( ret < 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok (%d skipped)\\n\", ret );\n\n    /*\n     * 1. Start the connection\n     */\n    mbedtls_printf( \"  . Connecting to tcp/%s/%s...\", SERVER_NAME, SERVER_PORT );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_connect( &server_fd, SERVER_NAME,\n                                         SERVER_PORT, MBEDTLS_NET_PROTO_TCP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_connect returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 2. Setup stuff\n     */\n    mbedtls_printf( \"  . Setting up the SSL/TLS structure...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ssl_config_defaults( &conf,\n                    MBEDTLS_SSL_IS_CLIENT,\n                    MBEDTLS_SSL_TRANSPORT_STREAM,\n                    MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_config_defaults returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /* OPTIONAL is not optimal for security,\n     * but makes interop easier in this simplified example */\n    mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_OPTIONAL );\n    mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );\n    mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n    mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );\n\n    if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_setup returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_ssl_set_hostname( &ssl, SERVER_NAME ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_set_hostname returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );\n\n    /*\n     * 4. Handshake\n     */\n    mbedtls_printf( \"  . Performing the SSL/TLS handshake...\" );\n    fflush( stdout );\n\n    while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 )\n    {\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_handshake returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 5. Verify the server certificate\n     */\n    mbedtls_printf( \"  . Verifying peer X.509 certificate...\" );\n\n    /* In real life, we probably want to bail out when ret != 0 */\n    if( ( flags = mbedtls_ssl_get_verify_result( &ssl ) ) != 0 )\n    {\n        char vrfy_buf[512];\n\n        mbedtls_printf( \" failed\\n\" );\n\n        mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), \"  ! \", flags );\n\n        mbedtls_printf( \"%s\\n\", vrfy_buf );\n    }\n    else\n        mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 3. Write the GET request\n     */\n    mbedtls_printf( \"  > Write to server:\" );\n    fflush( stdout );\n\n    len = sprintf( (char *) buf, GET_REQUEST );\n\n    while( ( ret = mbedtls_ssl_write( &ssl, buf, len ) ) <= 0 )\n    {\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_write returned %d\\n\\n\", ret );\n            goto exit;\n        }\n    }\n\n    len = ret;\n    mbedtls_printf( \" %d bytes written\\n\\n%s\", len, (char *) buf );\n\n    /*\n     * 7. Read the HTTP response\n     */\n    mbedtls_printf( \"  < Read from server:\" );\n    fflush( stdout );\n\n    do\n    {\n        len = sizeof( buf ) - 1;\n        memset( buf, 0, sizeof( buf ) );\n        ret = mbedtls_ssl_read( &ssl, buf, len );\n\n        if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE )\n            continue;\n\n        if( ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY )\n            break;\n\n        if( ret < 0 )\n        {\n            mbedtls_printf( \"failed\\n  ! mbedtls_ssl_read returned %d\\n\\n\", ret );\n            break;\n        }\n\n        if( ret == 0 )\n        {\n            mbedtls_printf( \"\\n\\nEOF\\n\\n\" );\n            break;\n        }\n\n        len = ret;\n        mbedtls_printf( \" %d bytes read\\n\\n%s\", len, (char *) buf );\n    }\n    while( 1 );\n\n    mbedtls_ssl_close_notify( &ssl );\n\nexit:\n\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        mbedtls_printf(\"Last error was: %d - %s\\n\\n\", ret, error_buf );\n    }\n#endif\n\n    mbedtls_net_free( &server_fd );\n\n    mbedtls_x509_crt_free( &cacert );\n    mbedtls_ssl_free( &ssl );\n    mbedtls_ssl_config_free( &conf );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C && MBEDTLS_SSL_TLS_C &&\n          MBEDTLS_SSL_CLI_C && MBEDTLS_NET_C && MBEDTLS_RSA_C &&\n          MBEDTLS_CERTS_C && MBEDTLS_PEM_PARSE_C && MBEDTLS_CTR_DRBG_C &&\n          MBEDTLS_X509_CRT_PARSE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/ssl_client2.c",
    "content": "/*\n *  SSL client with certificate authentication\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_time       time\n#define mbedtls_time_t     time_t\n#define mbedtls_printf     printf\n#define mbedtls_fprintf    fprintf\n#define mbedtls_snprintf   snprintf\n#endif\n\n#if !defined(MBEDTLS_ENTROPY_C) || \\\n    !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_CLI_C) || \\\n    !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_SSL_TLS_C and/or MBEDTLS_SSL_CLI_C and/or \"\n           \"MBEDTLS_NET_C and/or MBEDTLS_CTR_DRBG_C and/or not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/certs.h\"\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/error.h\"\n#include \"mbedtls/debug.h\"\n#include \"mbedtls/timing.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#define DFL_SERVER_NAME         \"localhost\"\n#define DFL_SERVER_ADDR         NULL\n#define DFL_SERVER_PORT         \"4433\"\n#define DFL_REQUEST_PAGE        \"/\"\n#define DFL_REQUEST_SIZE        -1\n#define DFL_DEBUG_LEVEL         0\n#define DFL_NBIO                0\n#define DFL_READ_TIMEOUT        0\n#define DFL_MAX_RESEND          0\n#define DFL_CA_FILE             \"\"\n#define DFL_CA_PATH             \"\"\n#define DFL_CRT_FILE            \"\"\n#define DFL_KEY_FILE            \"\"\n#define DFL_PSK                 \"\"\n#define DFL_PSK_IDENTITY        \"Client_identity\"\n#define DFL_ECJPAKE_PW          NULL\n#define DFL_FORCE_CIPHER        0\n#define DFL_RENEGOTIATION       MBEDTLS_SSL_RENEGOTIATION_DISABLED\n#define DFL_ALLOW_LEGACY        -2\n#define DFL_RENEGOTIATE         0\n#define DFL_EXCHANGES           1\n#define DFL_MIN_VERSION         -1\n#define DFL_MAX_VERSION         -1\n#define DFL_ARC4                -1\n#define DFL_SHA1                -1\n#define DFL_AUTH_MODE           -1\n#define DFL_MFL_CODE            MBEDTLS_SSL_MAX_FRAG_LEN_NONE\n#define DFL_TRUNC_HMAC          -1\n#define DFL_RECSPLIT            -1\n#define DFL_DHMLEN              -1\n#define DFL_RECONNECT           0\n#define DFL_RECO_DELAY          0\n#define DFL_RECONNECT_HARD      0\n#define DFL_TICKETS             MBEDTLS_SSL_SESSION_TICKETS_ENABLED\n#define DFL_ALPN_STRING         NULL\n#define DFL_CURVES              NULL\n#define DFL_TRANSPORT           MBEDTLS_SSL_TRANSPORT_STREAM\n#define DFL_HS_TO_MIN           0\n#define DFL_HS_TO_MAX           0\n#define DFL_FALLBACK            -1\n#define DFL_EXTENDED_MS         -1\n#define DFL_ETM                 -1\n\n#define GET_REQUEST \"GET %s HTTP/1.0\\r\\nExtra-header: \"\n#define GET_REQUEST_END \"\\r\\n\\r\\n\"\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n#if defined(MBEDTLS_FS_IO)\n#define USAGE_IO \\\n    \"    ca_file=%%s          The single file containing the top-level CA(s) you fully trust\\n\" \\\n    \"                        default: \\\"\\\" (pre-loaded)\\n\" \\\n    \"    ca_path=%%s          The path containing the top-level CA(s) you fully trust\\n\" \\\n    \"                        default: \\\"\\\" (pre-loaded) (overrides ca_file)\\n\" \\\n    \"    crt_file=%%s         Your own cert and chain (in bottom to top order, top may be omitted)\\n\" \\\n    \"                        default: \\\"\\\" (pre-loaded)\\n\" \\\n    \"    key_file=%%s         default: \\\"\\\" (pre-loaded)\\n\"\n#else\n#define USAGE_IO \\\n    \"    No file operations available (MBEDTLS_FS_IO not defined)\\n\"\n#endif /* MBEDTLS_FS_IO */\n#else\n#define USAGE_IO \"\"\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n#define USAGE_PSK                                                   \\\n    \"    psk=%%s              default: \\\"\\\" (in hex, without 0x)\\n\" \\\n    \"    psk_identity=%%s     default: \\\"Client_identity\\\"\\n\"\n#else\n#define USAGE_PSK \"\"\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n#define USAGE_TICKETS                                       \\\n    \"    tickets=%%d          default: 1 (enabled)\\n\"\n#else\n#define USAGE_TICKETS \"\"\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n#define USAGE_TRUNC_HMAC                                    \\\n    \"    trunc_hmac=%%d       default: library default\\n\"\n#else\n#define USAGE_TRUNC_HMAC \"\"\n#endif /* MBEDTLS_SSL_TRUNCATED_HMAC */\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n#define USAGE_MAX_FRAG_LEN                                      \\\n    \"    max_frag_len=%%d     default: 16384 (tls default)\\n\"   \\\n    \"                        options: 512, 1024, 2048, 4096\\n\"\n#else\n#define USAGE_MAX_FRAG_LEN \"\"\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\n#define USAGE_RECSPLIT \\\n    \"    recsplit=0/1        default: (library default: on)\\n\"\n#else\n#define USAGE_RECSPLIT\n#endif\n\n#if defined(MBEDTLS_DHM_C)\n#define USAGE_DHMLEN \\\n    \"    dhmlen=%%d           default: (library default: 1024 bits)\\n\"\n#else\n#define USAGE_DHMLEN\n#endif\n\n#if defined(MBEDTLS_SSL_ALPN)\n#define USAGE_ALPN \\\n    \"    alpn=%%s             default: \\\"\\\" (disabled)\\n\"   \\\n    \"                        example: spdy/1,http/1.1\\n\"\n#else\n#define USAGE_ALPN \"\"\n#endif /* MBEDTLS_SSL_ALPN */\n\n#if defined(MBEDTLS_ECP_C)\n#define USAGE_CURVES \\\n    \"    curves=a,b,c,d      default: \\\"default\\\" (library default)\\n\"  \\\n    \"                        example: \\\"secp521r1,brainpoolP512r1\\\"\\n\"  \\\n    \"                        - use \\\"none\\\" for empty list\\n\"           \\\n    \"                        - see mbedtls_ecp_curve_list()\\n\"          \\\n    \"                          for acceptable curve names\\n\"\n#else\n#define USAGE_CURVES \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n#define USAGE_DTLS \\\n    \"    dtls=%%d             default: 0 (TLS)\\n\"                           \\\n    \"    hs_timeout=%%d-%%d    default: (library default: 1000-60000)\\n\"    \\\n    \"                        range of DTLS handshake timeouts in millisecs\\n\"\n#else\n#define USAGE_DTLS \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_FALLBACK_SCSV)\n#define USAGE_FALLBACK \\\n    \"    fallback=0/1        default: (library default: off)\\n\"\n#else\n#define USAGE_FALLBACK \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n#define USAGE_EMS \\\n    \"    extended_ms=0/1     default: (library default: on)\\n\"\n#else\n#define USAGE_EMS \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n#define USAGE_ETM \\\n    \"    etm=0/1             default: (library default: on)\\n\"\n#else\n#define USAGE_ETM \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n#define USAGE_RENEGO \\\n    \"    renegotiation=%%d    default: 0 (disabled)\\n\"      \\\n    \"    renegotiate=%%d      default: 0 (disabled)\\n\"\n#else\n#define USAGE_RENEGO \"\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n#define USAGE_ECJPAKE \\\n    \"    ecjpake_pw=%%s       default: none (disabled)\\n\"\n#else\n#define USAGE_ECJPAKE \"\"\n#endif\n\n#define USAGE \\\n    \"\\n usage: ssl_client2 param=<>...\\n\"                   \\\n    \"\\n acceptable parameters:\\n\"                           \\\n    \"    server_name=%%s      default: localhost\\n\"         \\\n    \"    server_addr=%%s      default: given by name\\n\"     \\\n    \"    server_port=%%d      default: 4433\\n\"              \\\n    \"    request_page=%%s     default: \\\".\\\"\\n\"             \\\n    \"    request_size=%%d     default: about 34 (basic request)\\n\" \\\n    \"                        (minimum: 0, max: 16384)\\n\" \\\n    \"    debug_level=%%d      default: 0 (disabled)\\n\"      \\\n    \"    nbio=%%d             default: 0 (blocking I/O)\\n\"  \\\n    \"                        options: 1 (non-blocking), 2 (added delays)\\n\" \\\n    \"    read_timeout=%%d     default: 0 ms (no timeout)\\n\"    \\\n    \"    max_resend=%%d       default: 0 (no resend on timeout)\\n\" \\\n    \"\\n\"                                                    \\\n    USAGE_DTLS                                              \\\n    \"\\n\"                                                    \\\n    \"    auth_mode=%%s        default: (library default: none)\\n\"      \\\n    \"                        options: none, optional, required\\n\" \\\n    USAGE_IO                                                \\\n    \"\\n\"                                                    \\\n    USAGE_PSK                                               \\\n    USAGE_ECJPAKE                                           \\\n    \"\\n\"                                                    \\\n    \"    allow_legacy=%%d     default: (library default: no)\\n\"      \\\n    USAGE_RENEGO                                            \\\n    \"    exchanges=%%d        default: 1\\n\"                 \\\n    \"    reconnect=%%d        default: 0 (disabled)\\n\"      \\\n    \"    reco_delay=%%d       default: 0 seconds\\n\"         \\\n    \"    reconnect_hard=%%d   default: 0 (disabled)\\n\"      \\\n    USAGE_TICKETS                                           \\\n    USAGE_MAX_FRAG_LEN                                      \\\n    USAGE_TRUNC_HMAC                                        \\\n    USAGE_ALPN                                              \\\n    USAGE_FALLBACK                                          \\\n    USAGE_EMS                                               \\\n    USAGE_ETM                                               \\\n    USAGE_CURVES                                            \\\n    USAGE_RECSPLIT                                          \\\n    USAGE_DHMLEN                                            \\\n    \"\\n\"                                                    \\\n    \"    arc4=%%d             default: (library default: 0)\\n\" \\\n    \"    allow_sha1=%%d       default: 0\\n\"                             \\\n    \"    min_version=%%s      default: (library default: tls1)\\n\"       \\\n    \"    max_version=%%s      default: (library default: tls1_2)\\n\"     \\\n    \"    force_version=%%s    default: \\\"\\\" (none)\\n\"       \\\n    \"                        options: ssl3, tls1, tls1_1, tls1_2, dtls1, dtls1_2\\n\" \\\n    \"\\n\"                                                    \\\n    \"    force_ciphersuite=<name>    default: all enabled\\n\"\\\n    \" acceptable ciphersuite names:\\n\"\n\n#define ALPN_LIST_SIZE  10\n#define CURVE_LIST_SIZE 20\n\n/*\n * global options\n */\nstruct options\n{\n    const char *server_name;    /* hostname of the server (client only)     */\n    const char *server_addr;    /* address of the server (client only)      */\n    const char *server_port;    /* port on which the ssl service runs       */\n    int debug_level;            /* level of debugging                       */\n    int nbio;                   /* should I/O be blocking?                  */\n    uint32_t read_timeout;      /* timeout on mbedtls_ssl_read() in milliseconds    */\n    int max_resend;             /* DTLS times to resend on read timeout     */\n    const char *request_page;   /* page on server to request                */\n    int request_size;           /* pad request with header to requested size */\n    const char *ca_file;        /* the file with the CA certificate(s)      */\n    const char *ca_path;        /* the path with the CA certificate(s) reside */\n    const char *crt_file;       /* the file with the client certificate     */\n    const char *key_file;       /* the file with the client key             */\n    const char *psk;            /* the pre-shared key                       */\n    const char *psk_identity;   /* the pre-shared key identity              */\n    const char *ecjpake_pw;     /* the EC J-PAKE password                   */\n    int force_ciphersuite[2];   /* protocol/ciphersuite to use, or all      */\n    int renegotiation;          /* enable / disable renegotiation           */\n    int allow_legacy;           /* allow legacy renegotiation               */\n    int renegotiate;            /* attempt renegotiation?                   */\n    int renego_delay;           /* delay before enforcing renegotiation     */\n    int exchanges;              /* number of data exchanges                 */\n    int min_version;            /* minimum protocol version accepted        */\n    int max_version;            /* maximum protocol version accepted        */\n    int arc4;                   /* flag for arc4 suites support             */\n    int allow_sha1;             /* flag for SHA-1 support                   */\n    int auth_mode;              /* verify mode for connection               */\n    unsigned char mfl_code;     /* code for maximum fragment length         */\n    int trunc_hmac;             /* negotiate truncated hmac or not          */\n    int recsplit;               /* enable record splitting?                 */\n    int dhmlen;                 /* minimum DHM params len in bits           */\n    int reconnect;              /* attempt to resume session                */\n    int reco_delay;             /* delay in seconds before resuming session */\n    int reconnect_hard;         /* unexpectedly reconnect from the same port */\n    int tickets;                /* enable / disable session tickets         */\n    const char *curves;         /* list of supported elliptic curves        */\n    const char *alpn_string;    /* ALPN supported protocols                 */\n    int transport;              /* TLS or DTLS?                             */\n    uint32_t hs_to_min;         /* Initial value of DTLS handshake timer    */\n    uint32_t hs_to_max;         /* Max value of DTLS handshake timer        */\n    int fallback;               /* is this a fallback connection?           */\n    int extended_ms;            /* negotiate extended master secret?        */\n    int etm;                    /* negotiate encrypt then mac?              */\n} opt;\n\nstatic void my_debug( void *ctx, int level,\n                      const char *file, int line,\n                      const char *str )\n{\n    const char *p, *basename;\n\n    /* Extract basename from file */\n    for( p = basename = file; *p != '\\0'; p++ )\n        if( *p == '/' || *p == '\\\\' )\n            basename = p + 1;\n\n    mbedtls_fprintf( (FILE *) ctx, \"%s:%04d: |%d| %s\", basename, line, level, str );\n    fflush(  (FILE *) ctx  );\n}\n\n/*\n * Test recv/send functions that make sure each try returns\n * WANT_READ/WANT_WRITE at least once before sucesseding\n */\nstatic int my_recv( void *ctx, unsigned char *buf, size_t len )\n{\n    static int first_try = 1;\n    int ret;\n\n    if( first_try )\n    {\n        first_try = 0;\n        return( MBEDTLS_ERR_SSL_WANT_READ );\n    }\n\n    ret = mbedtls_net_recv( ctx, buf, len );\n    if( ret != MBEDTLS_ERR_SSL_WANT_READ )\n        first_try = 1; /* Next call will be a new operation */\n    return( ret );\n}\n\nstatic int my_send( void *ctx, const unsigned char *buf, size_t len )\n{\n    static int first_try = 1;\n    int ret;\n\n    if( first_try )\n    {\n        first_try = 0;\n        return( MBEDTLS_ERR_SSL_WANT_WRITE );\n    }\n\n    ret = mbedtls_net_send( ctx, buf, len );\n    if( ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        first_try = 1; /* Next call will be a new operation */\n    return( ret );\n}\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n/*\n * Enabled if debug_level > 1 in code below\n */\nstatic int my_verify( void *data, mbedtls_x509_crt *crt, int depth, uint32_t *flags )\n{\n    char buf[1024];\n    ((void) data);\n\n    mbedtls_printf( \"\\nVerify requested for (Depth %d):\\n\", depth );\n    mbedtls_x509_crt_info( buf, sizeof( buf ) - 1, \"\", crt );\n    mbedtls_printf( \"%s\", buf );\n\n    if ( ( *flags ) == 0 )\n        mbedtls_printf( \"  This certificate has no flags\\n\" );\n    else\n    {\n        mbedtls_x509_crt_verify_info( buf, sizeof( buf ), \"  ! \", *flags );\n        mbedtls_printf( \"%s\\n\", buf );\n    }\n\n    return( 0 );\n}\n\nstatic int ssl_sig_hashes_for_test[] = {\n#if defined(MBEDTLS_SHA512_C)\n    MBEDTLS_MD_SHA512,\n    MBEDTLS_MD_SHA384,\n#endif\n#if defined(MBEDTLS_SHA256_C)\n    MBEDTLS_MD_SHA256,\n    MBEDTLS_MD_SHA224,\n#endif\n#if defined(MBEDTLS_SHA1_C)\n    /* Allow SHA-1 as we use it extensively in tests. */\n    MBEDTLS_MD_SHA1,\n#endif\n    MBEDTLS_MD_NONE\n};\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0, len, tail_len, i, written, frags, retry_left;\n    mbedtls_net_context server_fd;\n    unsigned char buf[MBEDTLS_SSL_MAX_CONTENT_LEN + 1];\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    unsigned char psk[MBEDTLS_PSK_MAX_LEN];\n    size_t psk_len = 0;\n#endif\n#if defined(MBEDTLS_SSL_ALPN)\n    const char *alpn_list[ALPN_LIST_SIZE];\n#endif\n#if defined(MBEDTLS_ECP_C)\n    mbedtls_ecp_group_id curve_list[CURVE_LIST_SIZE];\n    const mbedtls_ecp_curve_info *curve_cur;\n#endif\n\n    const char *pers = \"ssl_client2\";\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_crt_profile crt_profile_for_test = mbedtls_x509_crt_profile_default;\n#endif\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_context ssl;\n    mbedtls_ssl_config conf;\n    mbedtls_ssl_session saved_session;\n#if defined(MBEDTLS_TIMING_C)\n    mbedtls_timing_delay_context timer;\n#endif\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    uint32_t flags;\n    mbedtls_x509_crt cacert;\n    mbedtls_x509_crt clicert;\n    mbedtls_pk_context pkey;\n#endif\n    char *p, *q;\n    const int *list;\n\n    /*\n     * Make sure memory references are valid.\n     */\n    mbedtls_net_init( &server_fd );\n    mbedtls_ssl_init( &ssl );\n    mbedtls_ssl_config_init( &conf );\n    memset( &saved_session, 0, sizeof( mbedtls_ssl_session ) );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_crt_init( &cacert );\n    mbedtls_x509_crt_init( &clicert );\n    mbedtls_pk_init( &pkey );\n#endif\n#if defined(MBEDTLS_SSL_ALPN)\n    memset( (void * ) alpn_list, 0, sizeof( alpn_list ) );\n#endif\n\n    if( argc == 0 )\n    {\n    usage:\n        if( ret == 0 )\n            ret = 1;\n\n        mbedtls_printf( USAGE );\n\n        list = mbedtls_ssl_list_ciphersuites();\n        while( *list )\n        {\n            mbedtls_printf(\" %-42s\", mbedtls_ssl_get_ciphersuite_name( *list ) );\n            list++;\n            if( !*list )\n                break;\n            mbedtls_printf(\" %s\\n\", mbedtls_ssl_get_ciphersuite_name( *list ) );\n            list++;\n        }\n        mbedtls_printf(\"\\n\");\n        goto exit;\n    }\n\n    opt.server_name         = DFL_SERVER_NAME;\n    opt.server_addr         = DFL_SERVER_ADDR;\n    opt.server_port         = DFL_SERVER_PORT;\n    opt.debug_level         = DFL_DEBUG_LEVEL;\n    opt.nbio                = DFL_NBIO;\n    opt.read_timeout        = DFL_READ_TIMEOUT;\n    opt.max_resend          = DFL_MAX_RESEND;\n    opt.request_page        = DFL_REQUEST_PAGE;\n    opt.request_size        = DFL_REQUEST_SIZE;\n    opt.ca_file             = DFL_CA_FILE;\n    opt.ca_path             = DFL_CA_PATH;\n    opt.crt_file            = DFL_CRT_FILE;\n    opt.key_file            = DFL_KEY_FILE;\n    opt.psk                 = DFL_PSK;\n    opt.psk_identity        = DFL_PSK_IDENTITY;\n    opt.ecjpake_pw          = DFL_ECJPAKE_PW;\n    opt.force_ciphersuite[0]= DFL_FORCE_CIPHER;\n    opt.renegotiation       = DFL_RENEGOTIATION;\n    opt.allow_legacy        = DFL_ALLOW_LEGACY;\n    opt.renegotiate         = DFL_RENEGOTIATE;\n    opt.exchanges           = DFL_EXCHANGES;\n    opt.min_version         = DFL_MIN_VERSION;\n    opt.max_version         = DFL_MAX_VERSION;\n    opt.arc4                = DFL_ARC4;\n    opt.allow_sha1          = DFL_SHA1;\n    opt.auth_mode           = DFL_AUTH_MODE;\n    opt.mfl_code            = DFL_MFL_CODE;\n    opt.trunc_hmac          = DFL_TRUNC_HMAC;\n    opt.recsplit            = DFL_RECSPLIT;\n    opt.dhmlen              = DFL_DHMLEN;\n    opt.reconnect           = DFL_RECONNECT;\n    opt.reco_delay          = DFL_RECO_DELAY;\n    opt.reconnect_hard      = DFL_RECONNECT_HARD;\n    opt.tickets             = DFL_TICKETS;\n    opt.alpn_string         = DFL_ALPN_STRING;\n    opt.curves              = DFL_CURVES;\n    opt.transport           = DFL_TRANSPORT;\n    opt.hs_to_min           = DFL_HS_TO_MIN;\n    opt.hs_to_max           = DFL_HS_TO_MAX;\n    opt.fallback            = DFL_FALLBACK;\n    opt.extended_ms         = DFL_EXTENDED_MS;\n    opt.etm                 = DFL_ETM;\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"server_name\" ) == 0 )\n            opt.server_name = q;\n        else if( strcmp( p, \"server_addr\" ) == 0 )\n            opt.server_addr = q;\n        else if( strcmp( p, \"server_port\" ) == 0 )\n            opt.server_port = q;\n        else if( strcmp( p, \"dtls\" ) == 0 )\n        {\n            int t = atoi( q );\n            if( t == 0 )\n                opt.transport = MBEDTLS_SSL_TRANSPORT_STREAM;\n            else if( t == 1 )\n                opt.transport = MBEDTLS_SSL_TRANSPORT_DATAGRAM;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"debug_level\" ) == 0 )\n        {\n            opt.debug_level = atoi( q );\n            if( opt.debug_level < 0 || opt.debug_level > 65535 )\n                goto usage;\n        }\n        else if( strcmp( p, \"nbio\" ) == 0 )\n        {\n            opt.nbio = atoi( q );\n            if( opt.nbio < 0 || opt.nbio > 2 )\n                goto usage;\n        }\n        else if( strcmp( p, \"read_timeout\" ) == 0 )\n            opt.read_timeout = atoi( q );\n        else if( strcmp( p, \"max_resend\" ) == 0 )\n        {\n            opt.max_resend = atoi( q );\n            if( opt.max_resend < 0 )\n                goto usage;\n        }\n        else if( strcmp( p, \"request_page\" ) == 0 )\n            opt.request_page = q;\n        else if( strcmp( p, \"request_size\" ) == 0 )\n        {\n            opt.request_size = atoi( q );\n            if( opt.request_size < 0 || opt.request_size > MBEDTLS_SSL_MAX_CONTENT_LEN )\n                goto usage;\n        }\n        else if( strcmp( p, \"ca_file\" ) == 0 )\n            opt.ca_file = q;\n        else if( strcmp( p, \"ca_path\" ) == 0 )\n            opt.ca_path = q;\n        else if( strcmp( p, \"crt_file\" ) == 0 )\n            opt.crt_file = q;\n        else if( strcmp( p, \"key_file\" ) == 0 )\n            opt.key_file = q;\n        else if( strcmp( p, \"psk\" ) == 0 )\n            opt.psk = q;\n        else if( strcmp( p, \"psk_identity\" ) == 0 )\n            opt.psk_identity = q;\n        else if( strcmp( p, \"ecjpake_pw\" ) == 0 )\n            opt.ecjpake_pw = q;\n        else if( strcmp( p, \"force_ciphersuite\" ) == 0 )\n        {\n            opt.force_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( q );\n\n            if( opt.force_ciphersuite[0] == 0 )\n            {\n                ret = 2;\n                goto usage;\n            }\n            opt.force_ciphersuite[1] = 0;\n        }\n        else if( strcmp( p, \"renegotiation\" ) == 0 )\n        {\n            opt.renegotiation = (atoi( q )) ? MBEDTLS_SSL_RENEGOTIATION_ENABLED :\n                                              MBEDTLS_SSL_RENEGOTIATION_DISABLED;\n        }\n        else if( strcmp( p, \"allow_legacy\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case -1: opt.allow_legacy = MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE; break;\n                case 0:  opt.allow_legacy = MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION; break;\n                case 1:  opt.allow_legacy = MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION; break;\n                default: goto usage;\n            }\n        }\n        else if( strcmp( p, \"renegotiate\" ) == 0 )\n        {\n            opt.renegotiate = atoi( q );\n            if( opt.renegotiate < 0 || opt.renegotiate > 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"exchanges\" ) == 0 )\n        {\n            opt.exchanges = atoi( q );\n            if( opt.exchanges < 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"reconnect\" ) == 0 )\n        {\n            opt.reconnect = atoi( q );\n            if( opt.reconnect < 0 || opt.reconnect > 2 )\n                goto usage;\n        }\n        else if( strcmp( p, \"reco_delay\" ) == 0 )\n        {\n            opt.reco_delay = atoi( q );\n            if( opt.reco_delay < 0 )\n                goto usage;\n        }\n        else if( strcmp( p, \"reconnect_hard\" ) == 0 )\n        {\n            opt.reconnect_hard = atoi( q );\n            if( opt.reconnect_hard < 0 || opt.reconnect_hard > 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"tickets\" ) == 0 )\n        {\n            opt.tickets = atoi( q );\n            if( opt.tickets < 0 || opt.tickets > 2 )\n                goto usage;\n        }\n        else if( strcmp( p, \"alpn\" ) == 0 )\n        {\n            opt.alpn_string = q;\n        }\n        else if( strcmp( p, \"fallback\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0: opt.fallback = MBEDTLS_SSL_IS_NOT_FALLBACK; break;\n                case 1: opt.fallback = MBEDTLS_SSL_IS_FALLBACK; break;\n                default: goto usage;\n            }\n        }\n        else if( strcmp( p, \"extended_ms\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0: opt.extended_ms = MBEDTLS_SSL_EXTENDED_MS_DISABLED; break;\n                case 1: opt.extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; break;\n                default: goto usage;\n            }\n        }\n        else if( strcmp( p, \"curves\" ) == 0 )\n            opt.curves = q;\n        else if( strcmp( p, \"etm\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0: opt.etm = MBEDTLS_SSL_ETM_DISABLED; break;\n                case 1: opt.etm = MBEDTLS_SSL_ETM_ENABLED; break;\n                default: goto usage;\n            }\n        }\n        else if( strcmp( p, \"min_version\" ) == 0 )\n        {\n            if( strcmp( q, \"ssl3\" ) == 0 )\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_0;\n            else if( strcmp( q, \"tls1\" ) == 0 )\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_1;\n            else if( strcmp( q, \"tls1_1\" ) == 0 ||\n                     strcmp( q, \"dtls1\" ) == 0 )\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_2;\n            else if( strcmp( q, \"tls1_2\" ) == 0 ||\n                     strcmp( q, \"dtls1_2\" ) == 0 )\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_3;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"max_version\" ) == 0 )\n        {\n            if( strcmp( q, \"ssl3\" ) == 0 )\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_0;\n            else if( strcmp( q, \"tls1\" ) == 0 )\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_1;\n            else if( strcmp( q, \"tls1_1\" ) == 0 ||\n                     strcmp( q, \"dtls1\" ) == 0 )\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_2;\n            else if( strcmp( q, \"tls1_2\" ) == 0 ||\n                     strcmp( q, \"dtls1_2\" ) == 0 )\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_3;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"arc4\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0:     opt.arc4 = MBEDTLS_SSL_ARC4_DISABLED;   break;\n                case 1:     opt.arc4 = MBEDTLS_SSL_ARC4_ENABLED;    break;\n                default:    goto usage;\n            }\n        }\n        else if( strcmp( p, \"allow_sha1\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0:     opt.allow_sha1 = 0;   break;\n                case 1:     opt.allow_sha1 = 1;    break;\n                default:    goto usage;\n            }\n        }\n        else if( strcmp( p, \"force_version\" ) == 0 )\n        {\n            if( strcmp( q, \"ssl3\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_0;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_0;\n            }\n            else if( strcmp( q, \"tls1\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_1;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_1;\n            }\n            else if( strcmp( q, \"tls1_1\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_2;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_2;\n            }\n            else if( strcmp( q, \"tls1_2\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_3;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_3;\n            }\n            else if( strcmp( q, \"dtls1\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_2;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_2;\n                opt.transport = MBEDTLS_SSL_TRANSPORT_DATAGRAM;\n            }\n            else if( strcmp( q, \"dtls1_2\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_3;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_3;\n                opt.transport = MBEDTLS_SSL_TRANSPORT_DATAGRAM;\n            }\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"auth_mode\" ) == 0 )\n        {\n            if( strcmp( q, \"none\" ) == 0 )\n                opt.auth_mode = MBEDTLS_SSL_VERIFY_NONE;\n            else if( strcmp( q, \"optional\" ) == 0 )\n                opt.auth_mode = MBEDTLS_SSL_VERIFY_OPTIONAL;\n            else if( strcmp( q, \"required\" ) == 0 )\n                opt.auth_mode = MBEDTLS_SSL_VERIFY_REQUIRED;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"max_frag_len\" ) == 0 )\n        {\n            if( strcmp( q, \"512\" ) == 0 )\n                opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_512;\n            else if( strcmp( q, \"1024\" ) == 0 )\n                opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_1024;\n            else if( strcmp( q, \"2048\" ) == 0 )\n                opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_2048;\n            else if( strcmp( q, \"4096\" ) == 0 )\n                opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_4096;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"trunc_hmac\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0: opt.trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_DISABLED; break;\n                case 1: opt.trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; break;\n                default: goto usage;\n            }\n        }\n        else if( strcmp( p, \"hs_timeout\" ) == 0 )\n        {\n            if( ( p = strchr( q, '-' ) ) == NULL )\n                goto usage;\n            *p++ = '\\0';\n            opt.hs_to_min = atoi( q );\n            opt.hs_to_max = atoi( p );\n            if( opt.hs_to_min == 0 || opt.hs_to_max < opt.hs_to_min )\n                goto usage;\n        }\n        else if( strcmp( p, \"recsplit\" ) == 0 )\n        {\n            opt.recsplit = atoi( q );\n            if( opt.recsplit < 0 || opt.recsplit > 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"dhmlen\" ) == 0 )\n        {\n            opt.dhmlen = atoi( q );\n            if( opt.dhmlen < 0 )\n                goto usage;\n        }\n        else\n            goto usage;\n    }\n\n#if defined(MBEDTLS_DEBUG_C)\n    mbedtls_debug_set_threshold( opt.debug_level );\n#endif\n\n    if( opt.force_ciphersuite[0] > 0 )\n    {\n        const mbedtls_ssl_ciphersuite_t *ciphersuite_info;\n        ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( opt.force_ciphersuite[0] );\n\n        if( opt.max_version != -1 &&\n            ciphersuite_info->min_minor_ver > opt.max_version )\n        {\n            mbedtls_printf(\"forced ciphersuite not allowed with this protocol version\\n\");\n            ret = 2;\n            goto usage;\n        }\n        if( opt.min_version != -1 &&\n            ciphersuite_info->max_minor_ver < opt.min_version )\n        {\n            mbedtls_printf(\"forced ciphersuite not allowed with this protocol version\\n\");\n            ret = 2;\n            goto usage;\n        }\n\n        /* If the server selects a version that's not supported by\n         * this suite, then there will be no common ciphersuite... */\n        if( opt.max_version == -1 ||\n            opt.max_version > ciphersuite_info->max_minor_ver )\n        {\n            opt.max_version = ciphersuite_info->max_minor_ver;\n        }\n        if( opt.min_version < ciphersuite_info->min_minor_ver )\n        {\n            opt.min_version = ciphersuite_info->min_minor_ver;\n            /* DTLS starts with TLS 1.1 */\n            if( opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n                opt.min_version < MBEDTLS_SSL_MINOR_VERSION_2 )\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_2;\n        }\n\n        /* Enable RC4 if needed and not explicitly disabled */\n        if( ciphersuite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )\n        {\n            if( opt.arc4 == MBEDTLS_SSL_ARC4_DISABLED )\n            {\n                mbedtls_printf(\"forced RC4 ciphersuite with RC4 disabled\\n\");\n                ret = 2;\n                goto usage;\n            }\n\n            opt.arc4 = MBEDTLS_SSL_ARC4_ENABLED;\n        }\n    }\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    /*\n     * Unhexify the pre-shared key if any is given\n     */\n    if( strlen( opt.psk ) )\n    {\n        unsigned char c;\n        size_t j;\n\n        if( strlen( opt.psk ) % 2 != 0 )\n        {\n            mbedtls_printf(\"pre-shared key not valid hex\\n\");\n            goto exit;\n        }\n\n        psk_len = strlen( opt.psk ) / 2;\n\n        for( j = 0; j < strlen( opt.psk ); j += 2 )\n        {\n            c = opt.psk[j];\n            if( c >= '0' && c <= '9' )\n                c -= '0';\n            else if( c >= 'a' && c <= 'f' )\n                c -= 'a' - 10;\n            else if( c >= 'A' && c <= 'F' )\n                c -= 'A' - 10;\n            else\n            {\n                mbedtls_printf(\"pre-shared key not valid hex\\n\");\n                goto exit;\n            }\n            psk[ j / 2 ] = c << 4;\n\n            c = opt.psk[j + 1];\n            if( c >= '0' && c <= '9' )\n                c -= '0';\n            else if( c >= 'a' && c <= 'f' )\n                c -= 'a' - 10;\n            else if( c >= 'A' && c <= 'F' )\n                c -= 'A' - 10;\n            else\n            {\n                mbedtls_printf(\"pre-shared key not valid hex\\n\");\n                goto exit;\n            }\n            psk[ j / 2 ] |= c;\n        }\n    }\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\n#if defined(MBEDTLS_ECP_C)\n    if( opt.curves != NULL )\n    {\n        p = (char *) opt.curves;\n        i = 0;\n\n        if( strcmp( p, \"none\" ) == 0 )\n        {\n            curve_list[0] = MBEDTLS_ECP_DP_NONE;\n        }\n        else if( strcmp( p, \"default\" ) != 0 )\n        {\n            /* Leave room for a final NULL in curve list */\n            while( i < CURVE_LIST_SIZE - 1 && *p != '\\0' )\n            {\n                q = p;\n\n                /* Terminate the current string */\n                while( *p != ',' && *p != '\\0' )\n                    p++;\n                if( *p == ',' )\n                    *p++ = '\\0';\n\n                if( ( curve_cur = mbedtls_ecp_curve_info_from_name( q ) ) != NULL )\n                {\n                    curve_list[i++] = curve_cur->grp_id;\n                }\n                else\n                {\n                    mbedtls_printf( \"unknown curve %s\\n\", q );\n                    mbedtls_printf( \"supported curves: \" );\n                    for( curve_cur = mbedtls_ecp_curve_list();\n                         curve_cur->grp_id != MBEDTLS_ECP_DP_NONE;\n                         curve_cur++ )\n                    {\n                        mbedtls_printf( \"%s \", curve_cur->name );\n                    }\n                    mbedtls_printf( \"\\n\" );\n                    goto exit;\n                }\n            }\n\n            mbedtls_printf(\"Number of curves: %d\\n\", i );\n\n            if( i == CURVE_LIST_SIZE - 1 && *p != '\\0' )\n            {\n                mbedtls_printf( \"curves list too long, maximum %d\",\n                                CURVE_LIST_SIZE - 1 );\n                goto exit;\n            }\n\n            curve_list[i] = MBEDTLS_ECP_DP_NONE;\n        }\n    }\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_SSL_ALPN)\n    if( opt.alpn_string != NULL )\n    {\n        p = (char *) opt.alpn_string;\n        i = 0;\n\n        /* Leave room for a final NULL in alpn_list */\n        while( i < ALPN_LIST_SIZE - 1 && *p != '\\0' )\n        {\n            alpn_list[i++] = p;\n\n            /* Terminate the current string and move on to next one */\n            while( *p != ',' && *p != '\\0' )\n                p++;\n            if( *p == ',' )\n                *p++ = '\\0';\n        }\n    }\n#endif /* MBEDTLS_SSL_ALPN */\n\n    /*\n     * 0. Initialize the RNG and the session data\n     */\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned -0x%x\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    /*\n     * 1.1. Load the trusted CA\n     */\n    mbedtls_printf( \"  . Loading the CA root certificate ...\" );\n    fflush( stdout );\n\n#if defined(MBEDTLS_FS_IO)\n    if( strlen( opt.ca_path ) )\n        if( strcmp( opt.ca_path, \"none\" ) == 0 )\n            ret = 0;\n        else\n            ret = mbedtls_x509_crt_parse_path( &cacert, opt.ca_path );\n    else if( strlen( opt.ca_file ) )\n        if( strcmp( opt.ca_file, \"none\" ) == 0 )\n            ret = 0;\n        else\n            ret = mbedtls_x509_crt_parse_file( &cacert, opt.ca_file );\n    else\n#endif\n#if defined(MBEDTLS_CERTS_C)\n        for( i = 0; mbedtls_test_cas[i] != NULL; i++ )\n        {\n            ret = mbedtls_x509_crt_parse( &cacert,\n                                  (const unsigned char *) mbedtls_test_cas[i],\n                                  mbedtls_test_cas_len[i] );\n            if( ret != 0 )\n                break;\n        }\n#else\n    {\n        ret = 1;\n        mbedtls_printf(\"MBEDTLS_CERTS_C not defined.\");\n    }\n#endif\n    if( ret < 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok (%d skipped)\\n\", ret );\n\n    /*\n     * 1.2. Load own certificate and private key\n     *\n     * (can be skipped if client authentication is not required)\n     */\n    mbedtls_printf( \"  . Loading the client cert. and key...\" );\n    fflush( stdout );\n\n#if defined(MBEDTLS_FS_IO)\n    if( strlen( opt.crt_file ) )\n        if( strcmp( opt.crt_file, \"none\" ) == 0 )\n            ret = 0;\n        else\n            ret = mbedtls_x509_crt_parse_file( &clicert, opt.crt_file );\n    else\n#endif\n#if defined(MBEDTLS_CERTS_C)\n        ret = mbedtls_x509_crt_parse( &clicert, (const unsigned char *) mbedtls_test_cli_crt,\n                mbedtls_test_cli_crt_len );\n#else\n    {\n        ret = 1;\n        mbedtls_printf(\"MBEDTLS_CERTS_C not defined.\");\n    }\n#endif\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n#if defined(MBEDTLS_FS_IO)\n    if( strlen( opt.key_file ) )\n        if( strcmp( opt.key_file, \"none\" ) == 0 )\n            ret = 0;\n        else\n            ret = mbedtls_pk_parse_keyfile( &pkey, opt.key_file, \"\" );\n    else\n#endif\n#if defined(MBEDTLS_CERTS_C)\n        ret = mbedtls_pk_parse_key( &pkey, (const unsigned char *) mbedtls_test_cli_key,\n                mbedtls_test_cli_key_len, NULL, 0 );\n#else\n    {\n        ret = 1;\n        mbedtls_printf(\"MBEDTLS_CERTS_C not defined.\");\n    }\n#endif\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_key returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n    /*\n     * 2. Start the connection\n     */\n    if( opt.server_addr == NULL)\n        opt.server_addr = opt.server_name;\n\n    mbedtls_printf( \"  . Connecting to %s/%s/%s...\",\n            opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM ? \"tcp\" : \"udp\",\n            opt.server_addr, opt.server_port );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_connect( &server_fd, opt.server_addr, opt.server_port,\n                             opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM ?\n                             MBEDTLS_NET_PROTO_TCP : MBEDTLS_NET_PROTO_UDP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_connect returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    if( opt.nbio > 0 )\n        ret = mbedtls_net_set_nonblock( &server_fd );\n    else\n        ret = mbedtls_net_set_block( &server_fd );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! net_set_(non)block() returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 3. Setup stuff\n     */\n    mbedtls_printf( \"  . Setting up the SSL/TLS structure...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ssl_config_defaults( &conf,\n                    MBEDTLS_SSL_IS_CLIENT,\n                    opt.transport,\n                    MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_config_defaults returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    /* The default algorithms profile disables SHA-1, but our tests still\n       rely on it heavily. */\n    if( opt.allow_sha1 > 0 )\n    {\n        crt_profile_for_test.allowed_mds |= MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA1 );\n        mbedtls_ssl_conf_cert_profile( &conf, &crt_profile_for_test );\n        mbedtls_ssl_conf_sig_hashes( &conf, ssl_sig_hashes_for_test );\n    }\n\n    if( opt.debug_level > 0 )\n        mbedtls_ssl_conf_verify( &conf, my_verify, NULL );\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n    if( opt.auth_mode != DFL_AUTH_MODE )\n        mbedtls_ssl_conf_authmode( &conf, opt.auth_mode );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( opt.hs_to_min != DFL_HS_TO_MIN || opt.hs_to_max != DFL_HS_TO_MAX )\n        mbedtls_ssl_conf_handshake_timeout( &conf, opt.hs_to_min, opt.hs_to_max );\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n    if( ( ret = mbedtls_ssl_conf_max_frag_len( &conf, opt.mfl_code ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_max_frag_len returned %d\\n\\n\", ret );\n        goto exit;\n    }\n#endif\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n    if( opt.trunc_hmac != DFL_TRUNC_HMAC )\n        mbedtls_ssl_conf_truncated_hmac( &conf, opt.trunc_hmac );\n#endif\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n    if( opt.extended_ms != DFL_EXTENDED_MS )\n        mbedtls_ssl_conf_extended_master_secret( &conf, opt.extended_ms );\n#endif\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n    if( opt.etm != DFL_ETM )\n        mbedtls_ssl_conf_encrypt_then_mac( &conf, opt.etm );\n#endif\n\n#if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING)\n    if( opt.recsplit != DFL_RECSPLIT )\n        mbedtls_ssl_conf_cbc_record_splitting( &conf, opt.recsplit\n                                    ? MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED\n                                    : MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED );\n#endif\n\n#if defined(MBEDTLS_DHM_C)\n    if( opt.dhmlen != DFL_DHMLEN )\n        mbedtls_ssl_conf_dhm_min_bitlen( &conf, opt.dhmlen );\n#endif\n\n#if defined(MBEDTLS_SSL_ALPN)\n    if( opt.alpn_string != NULL )\n        if( ( ret = mbedtls_ssl_conf_alpn_protocols( &conf, alpn_list ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_alpn_protocols returned %d\\n\\n\", ret );\n            goto exit;\n        }\n#endif\n\n    mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n    mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );\n\n    mbedtls_ssl_conf_read_timeout( &conf, opt.read_timeout );\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    mbedtls_ssl_conf_session_tickets( &conf, opt.tickets );\n#endif\n\n    if( opt.force_ciphersuite[0] != DFL_FORCE_CIPHER )\n        mbedtls_ssl_conf_ciphersuites( &conf, opt.force_ciphersuite );\n\n#if defined(MBEDTLS_ARC4_C)\n    if( opt.arc4 != DFL_ARC4 )\n        mbedtls_ssl_conf_arc4_support( &conf, opt.arc4 );\n#endif\n\n    if( opt.allow_legacy != DFL_ALLOW_LEGACY )\n        mbedtls_ssl_conf_legacy_renegotiation( &conf, opt.allow_legacy );\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    mbedtls_ssl_conf_renegotiation( &conf, opt.renegotiation );\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    if( strcmp( opt.ca_path, \"none\" ) != 0 &&\n        strcmp( opt.ca_file, \"none\" ) != 0 )\n    {\n        mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );\n    }\n    if( strcmp( opt.crt_file, \"none\" ) != 0 &&\n        strcmp( opt.key_file, \"none\" ) != 0 )\n    {\n        if( ( ret = mbedtls_ssl_conf_own_cert( &conf, &clicert, &pkey ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_own_cert returned %d\\n\\n\", ret );\n            goto exit;\n        }\n    }\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n    if( opt.curves != NULL &&\n        strcmp( opt.curves, \"default\" ) != 0 )\n    {\n        mbedtls_ssl_conf_curves( &conf, curve_list );\n    }\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    if( ( ret = mbedtls_ssl_conf_psk( &conf, psk, psk_len,\n                             (const unsigned char *) opt.psk_identity,\n                             strlen( opt.psk_identity ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_psk returned %d\\n\\n\", ret );\n        goto exit;\n    }\n#endif\n\n    if( opt.min_version != DFL_MIN_VERSION )\n        mbedtls_ssl_conf_min_version( &conf, MBEDTLS_SSL_MAJOR_VERSION_3, opt.min_version );\n\n    if( opt.max_version != DFL_MAX_VERSION )\n        mbedtls_ssl_conf_max_version( &conf, MBEDTLS_SSL_MAJOR_VERSION_3, opt.max_version );\n\n#if defined(MBEDTLS_SSL_FALLBACK_SCSV)\n    if( opt.fallback != DFL_FALLBACK )\n        mbedtls_ssl_conf_fallback( &conf, opt.fallback );\n#endif\n\n    if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_setup returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    if( ( ret = mbedtls_ssl_set_hostname( &ssl, opt.server_name ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_set_hostname returned %d\\n\\n\", ret );\n        goto exit;\n    }\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    if( opt.ecjpake_pw != DFL_ECJPAKE_PW )\n    {\n        if( ( ret = mbedtls_ssl_set_hs_ecjpake_password( &ssl,\n                        (const unsigned char *) opt.ecjpake_pw,\n                                        strlen( opt.ecjpake_pw ) ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_set_hs_ecjpake_password returned %d\\n\\n\", ret );\n            goto exit;\n        }\n    }\n#endif\n\n    if( opt.nbio == 2 )\n        mbedtls_ssl_set_bio( &ssl, &server_fd, my_send, my_recv, NULL );\n    else\n        mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv,\n                             opt.nbio == 0 ? mbedtls_net_recv_timeout : NULL );\n\n#if defined(MBEDTLS_TIMING_C)\n    mbedtls_ssl_set_timer_cb( &ssl, &timer, mbedtls_timing_set_delay,\n                                            mbedtls_timing_get_delay );\n#endif\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 4. Handshake\n     */\n    mbedtls_printf( \"  . Performing the SSL/TLS handshake...\" );\n    fflush( stdout );\n\n    while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 )\n    {\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_handshake returned -0x%x\\n\", -ret );\n            if( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED )\n                mbedtls_printf(\n                    \"    Unable to verify the server's certificate. \"\n                        \"Either it is invalid,\\n\"\n                    \"    or you didn't set ca_file or ca_path \"\n                        \"to an appropriate value.\\n\"\n                    \"    Alternatively, you may want to use \"\n                        \"auth_mode=optional for testing purposes.\\n\" );\n            mbedtls_printf( \"\\n\" );\n            goto exit;\n        }\n    }\n\n    mbedtls_printf( \" ok\\n    [ Protocol is %s ]\\n    [ Ciphersuite is %s ]\\n\",\n            mbedtls_ssl_get_version( &ssl ), mbedtls_ssl_get_ciphersuite( &ssl ) );\n\n    if( ( ret = mbedtls_ssl_get_record_expansion( &ssl ) ) >= 0 )\n        mbedtls_printf( \"    [ Record expansion is %d ]\\n\", ret );\n    else\n        mbedtls_printf( \"    [ Record expansion is unknown (compression) ]\\n\" );\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n    mbedtls_printf( \"    [ Maximum fragment length is %u ]\\n\",\n                    (unsigned int) mbedtls_ssl_get_max_frag_len( &ssl ) );\n#endif\n\n#if defined(MBEDTLS_SSL_ALPN)\n    if( opt.alpn_string != NULL )\n    {\n        const char *alp = mbedtls_ssl_get_alpn_protocol( &ssl );\n        mbedtls_printf( \"    [ Application Layer Protocol is %s ]\\n\",\n                alp ? alp : \"(none)\" );\n    }\n#endif\n\n    if( opt.reconnect != 0 )\n    {\n        mbedtls_printf(\"  . Saving session for reuse...\" );\n        fflush( stdout );\n\n        if( ( ret = mbedtls_ssl_get_session( &ssl, &saved_session ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_get_session returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n    }\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    /*\n     * 5. Verify the server certificate\n     */\n    mbedtls_printf( \"  . Verifying peer X.509 certificate...\" );\n\n    if( ( flags = mbedtls_ssl_get_verify_result( &ssl ) ) != 0 )\n    {\n        char vrfy_buf[512];\n\n        mbedtls_printf( \" failed\\n\" );\n\n        mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), \"  ! \", flags );\n\n        mbedtls_printf( \"%s\\n\", vrfy_buf );\n    }\n    else\n        mbedtls_printf( \" ok\\n\" );\n\n    if( mbedtls_ssl_get_peer_cert( &ssl ) != NULL )\n    {\n        mbedtls_printf( \"  . Peer certificate information    ...\\n\" );\n        mbedtls_x509_crt_info( (char *) buf, sizeof( buf ) - 1, \"      \",\n                       mbedtls_ssl_get_peer_cert( &ssl ) );\n        mbedtls_printf( \"%s\\n\", buf );\n    }\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( opt.renegotiate )\n    {\n        /*\n         * Perform renegotiation (this must be done when the server is waiting\n         * for input from our side).\n         */\n        mbedtls_printf( \"  . Performing renegotiation...\" );\n        fflush( stdout );\n        while( ( ret = mbedtls_ssl_renegotiate( &ssl ) ) != 0 )\n        {\n            if( ret != MBEDTLS_ERR_SSL_WANT_READ &&\n                ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n            {\n                mbedtls_printf( \" failed\\n  ! mbedtls_ssl_renegotiate returned %d\\n\\n\", ret );\n                goto exit;\n            }\n        }\n        mbedtls_printf( \" ok\\n\" );\n    }\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n    /*\n     * 6. Write the GET request\n     */\n    retry_left = opt.max_resend;\nsend_request:\n    mbedtls_printf( \"  > Write to server:\" );\n    fflush( stdout );\n\n    len = mbedtls_snprintf( (char *) buf, sizeof(buf) - 1, GET_REQUEST,\n                    opt.request_page );\n    tail_len = (int) strlen( GET_REQUEST_END );\n\n    /* Add padding to GET request to reach opt.request_size in length */\n    if( opt.request_size != DFL_REQUEST_SIZE &&\n        len + tail_len < opt.request_size )\n    {\n        memset( buf + len, 'A', opt.request_size - len - tail_len );\n        len += opt.request_size - len - tail_len;\n    }\n\n    strncpy( (char *) buf + len, GET_REQUEST_END, sizeof(buf) - len - 1 );\n    len += tail_len;\n\n    /* Truncate if request size is smaller than the \"natural\" size */\n    if( opt.request_size != DFL_REQUEST_SIZE &&\n        len > opt.request_size )\n    {\n        len = opt.request_size;\n\n        /* Still end with \\r\\n unless that's really not possible */\n        if( len >= 2 ) buf[len - 2] = '\\r';\n        if( len >= 1 ) buf[len - 1] = '\\n';\n    }\n\n    if( opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM )\n    {\n        for( written = 0, frags = 0; written < len; written += ret, frags++ )\n        {\n            while( ( ret = mbedtls_ssl_write( &ssl, buf + written, len - written ) )\n                           <= 0 )\n            {\n                if( ret != MBEDTLS_ERR_SSL_WANT_READ &&\n                    ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n                {\n                    mbedtls_printf( \" failed\\n  ! mbedtls_ssl_write returned -0x%x\\n\\n\", -ret );\n                    goto exit;\n                }\n            }\n        }\n    }\n    else /* Not stream, so datagram */\n    {\n        do ret = mbedtls_ssl_write( &ssl, buf, len );\n        while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n               ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n        if( ret < 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_write returned %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        frags = 1;\n        written = ret;\n    }\n\n    buf[written] = '\\0';\n    mbedtls_printf( \" %d bytes written in %d fragments\\n\\n%s\\n\", written, frags, (char *) buf );\n\n    /*\n     * 7. Read the HTTP response\n     */\n    mbedtls_printf( \"  < Read from server:\" );\n    fflush( stdout );\n\n    /*\n     * TLS and DTLS need different reading styles (stream vs datagram)\n     */\n    if( opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM )\n    {\n        do\n        {\n            len = sizeof( buf ) - 1;\n            memset( buf, 0, sizeof( buf ) );\n            ret = mbedtls_ssl_read( &ssl, buf, len );\n\n            if( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n                ret == MBEDTLS_ERR_SSL_WANT_WRITE )\n                continue;\n\n            if( ret <= 0 )\n            {\n                switch( ret )\n                {\n                    case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:\n                        mbedtls_printf( \" connection was closed gracefully\\n\" );\n                        ret = 0;\n                        goto close_notify;\n\n                    case 0:\n                    case MBEDTLS_ERR_NET_CONN_RESET:\n                        mbedtls_printf( \" connection was reset by peer\\n\" );\n                        ret = 0;\n                        goto reconnect;\n\n                    default:\n                        mbedtls_printf( \" mbedtls_ssl_read returned -0x%x\\n\", -ret );\n                        goto exit;\n                }\n            }\n\n            len = ret;\n            buf[len] = '\\0';\n            mbedtls_printf( \" %d bytes read\\n\\n%s\", len, (char *) buf );\n\n            /* End of message should be detected according to the syntax of the\n             * application protocol (eg HTTP), just use a dummy test here. */\n            if( ret > 0 && buf[len-1] == '\\n' )\n            {\n                ret = 0;\n                break;\n            }\n        }\n        while( 1 );\n    }\n    else /* Not stream, so datagram */\n    {\n        len = sizeof( buf ) - 1;\n        memset( buf, 0, sizeof( buf ) );\n\n        do ret = mbedtls_ssl_read( &ssl, buf, len );\n        while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n               ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n        if( ret <= 0 )\n        {\n            switch( ret )\n            {\n                case MBEDTLS_ERR_SSL_TIMEOUT:\n                    mbedtls_printf( \" timeout\\n\" );\n                    if( retry_left-- > 0 )\n                        goto send_request;\n                    goto exit;\n\n                case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:\n                    mbedtls_printf( \" connection was closed gracefully\\n\" );\n                    ret = 0;\n                    goto close_notify;\n\n                default:\n                    mbedtls_printf( \" mbedtls_ssl_read returned -0x%x\\n\", -ret );\n                    goto exit;\n            }\n        }\n\n        len = ret;\n        buf[len] = '\\0';\n        mbedtls_printf( \" %d bytes read\\n\\n%s\", len, (char *) buf );\n        ret = 0;\n    }\n\n    /*\n     * 7b. Simulate hard reset and reconnect from same port?\n     */\n    if( opt.reconnect_hard != 0 )\n    {\n        opt.reconnect_hard = 0;\n\n        mbedtls_printf( \"  . Restarting connection from same port...\" );\n        fflush( stdout );\n\n        if( ( ret = mbedtls_ssl_session_reset( &ssl ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_session_reset returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n\n        while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 )\n        {\n            if( ret != MBEDTLS_ERR_SSL_WANT_READ &&\n                ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n            {\n                mbedtls_printf( \" failed\\n  ! mbedtls_ssl_handshake returned -0x%x\\n\\n\", -ret );\n                goto exit;\n            }\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        goto send_request;\n    }\n\n    /*\n     * 7c. Continue doing data exchanges?\n     */\n    if( --opt.exchanges > 0 )\n        goto send_request;\n\n    /*\n     * 8. Done, cleanly close the connection\n     */\nclose_notify:\n    mbedtls_printf( \"  . Closing the connection...\" );\n    fflush( stdout );\n\n    /* No error checking, the connection might be closed already */\n    do ret = mbedtls_ssl_close_notify( &ssl );\n    while( ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n    ret = 0;\n\n    mbedtls_printf( \" done\\n\" );\n\n    /*\n     * 9. Reconnect?\n     */\nreconnect:\n    if( opt.reconnect != 0 )\n    {\n        --opt.reconnect;\n\n        mbedtls_net_free( &server_fd );\n\n#if defined(MBEDTLS_TIMING_C)\n        if( opt.reco_delay > 0 )\n            mbedtls_net_usleep( 1000000 * opt.reco_delay );\n#endif\n\n        mbedtls_printf( \"  . Reconnecting with saved session...\" );\n\n        if( ( ret = mbedtls_ssl_session_reset( &ssl ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_session_reset returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n\n        if( ( ret = mbedtls_ssl_set_session( &ssl, &saved_session ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_session returned %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        if( ( ret = mbedtls_net_connect( &server_fd, opt.server_addr, opt.server_port,\n                                 opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM ?\n                                 MBEDTLS_NET_PROTO_TCP : MBEDTLS_NET_PROTO_UDP ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_net_connect returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n\n        if( opt.nbio > 0 )\n            ret = mbedtls_net_set_nonblock( &server_fd );\n        else\n            ret = mbedtls_net_set_block( &server_fd );\n        if( ret != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! net_set_(non)block() returned -0x%x\\n\\n\",\n                    -ret );\n            goto exit;\n        }\n\n        while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 )\n        {\n            if( ret != MBEDTLS_ERR_SSL_WANT_READ &&\n                ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n            {\n                mbedtls_printf( \" failed\\n  ! mbedtls_ssl_handshake returned -0x%x\\n\\n\", -ret );\n                goto exit;\n            }\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        goto send_request;\n    }\n\n    /*\n     * Cleanup and exit\n     */\nexit:\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        mbedtls_printf(\"Last error was: -0x%X - %s\\n\\n\", -ret, error_buf );\n    }\n#endif\n\n    mbedtls_net_free( &server_fd );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_crt_free( &clicert );\n    mbedtls_x509_crt_free( &cacert );\n    mbedtls_pk_free( &pkey );\n#endif\n    mbedtls_ssl_session_free( &saved_session );\n    mbedtls_ssl_free( &ssl );\n    mbedtls_ssl_config_free( &conf );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    // Shell can not handle large exit numbers -> 1 for errors\n    if( ret < 0 )\n        ret = 1;\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C && MBEDTLS_SSL_TLS_C &&\n          MBEDTLS_SSL_CLI_C && MBEDTLS_NET_C && MBEDTLS_RSA_C &&\n          MBEDTLS_CTR_DRBG_C MBEDTLS_TIMING_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/ssl_fork_server.c",
    "content": "/*\n *  SSL server demonstration program using fork() for handling multiple clients\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#define mbedtls_time_t     time_t\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_CERTS_C) ||    \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_SSL_TLS_C) || \\\n    !defined(MBEDTLS_SSL_SRV_C) || !defined(MBEDTLS_NET_C) ||     \\\n    !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_CTR_DRBG_C) ||    \\\n    !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_TIMING_C) || \\\n    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_PEM_PARSE_C)\nint main( int argc, char *argv[] )\n{\n    ((void) argc);\n    ((void) argv);\n\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_CERTS_C and/or MBEDTLS_ENTROPY_C \"\n           \"and/or MBEDTLS_SSL_TLS_C and/or MBEDTLS_SSL_SRV_C and/or \"\n           \"MBEDTLS_NET_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_CTR_DRBG_C and/or MBEDTLS_X509_CRT_PARSE_C and/or \"\n           \"MBEDTLS_TIMING_C and/or MBEDTLS_PEM_PARSE_C not defined.\\n\");\n    return( 0 );\n}\n#elif defined(_WIN32)\nint main( void )\n{\n    mbedtls_printf(\"_WIN32 defined. This application requires fork() and signals \"\n           \"to work correctly.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/certs.h\"\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/timing.h\"\n\n#include <string.h>\n#include <signal.h>\n\n#if !defined(_MSC_VER) || defined(EFIX64) || defined(EFI32)\n#include <unistd.h>\n#endif\n\n#define HTTP_RESPONSE \\\n    \"HTTP/1.0 200 OK\\r\\nContent-Type: text/html\\r\\n\\r\\n\" \\\n    \"<h2>mbed TLS Test Server</h2>\\r\\n\" \\\n    \"<p>Successful connection using: %s</p>\\r\\n\"\n\n#define DEBUG_LEVEL 0\n\nstatic void my_debug( void *ctx, int level,\n                      const char *file, int line,\n                      const char *str )\n{\n    ((void) level);\n\n    mbedtls_fprintf( (FILE *) ctx, \"%s:%04d: %s\", file, line, str );\n    fflush(  (FILE *) ctx  );\n}\n\nint main( void )\n{\n    int ret, len, cnt = 0, pid;\n    mbedtls_net_context listen_fd, client_fd;\n    unsigned char buf[1024];\n    const char *pers = \"ssl_fork_server\";\n\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_context ssl;\n    mbedtls_ssl_config conf;\n    mbedtls_x509_crt srvcert;\n    mbedtls_pk_context pkey;\n\n    mbedtls_net_init( &listen_fd );\n    mbedtls_net_init( &client_fd );\n    mbedtls_ssl_init( &ssl );\n    mbedtls_ssl_config_init( &conf );\n    mbedtls_entropy_init( &entropy );\n    mbedtls_pk_init( &pkey );\n    mbedtls_x509_crt_init( &srvcert );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    signal( SIGCHLD, SIG_IGN );\n\n    /*\n     * 0. Initial seeding of the RNG\n     */\n    mbedtls_printf( \"\\n  . Initial seeding of the random generator...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed!  mbedtls_ctr_drbg_seed returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1. Load the certificates and private RSA key\n     */\n    mbedtls_printf( \"  . Loading the server cert. and key...\" );\n    fflush( stdout );\n\n    /*\n     * This demonstration program uses embedded test certificates.\n     * Instead, you may want to use mbedtls_x509_crt_parse_file() to read the\n     * server and CA certificates, as well as mbedtls_pk_parse_keyfile().\n     */\n    ret = mbedtls_x509_crt_parse( &srvcert, (const unsigned char *) mbedtls_test_srv_crt,\n                          mbedtls_test_srv_crt_len );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed!  mbedtls_x509_crt_parse returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_x509_crt_parse( &srvcert, (const unsigned char *) mbedtls_test_cas_pem,\n                          mbedtls_test_cas_pem_len );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed!  mbedtls_x509_crt_parse returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    ret =  mbedtls_pk_parse_key( &pkey, (const unsigned char *) mbedtls_test_srv_key,\n                          mbedtls_test_srv_key_len, NULL, 0 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed!  mbedtls_pk_parse_key returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1b. Prepare SSL configuration\n     */\n    mbedtls_printf( \"  . Configuring SSL...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ssl_config_defaults( &conf,\n                    MBEDTLS_SSL_IS_SERVER,\n                    MBEDTLS_SSL_TRANSPORT_STREAM,\n                    MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )\n    {\n        mbedtls_printf( \" failed!  mbedtls_ssl_config_defaults returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n    mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );\n\n    mbedtls_ssl_conf_ca_chain( &conf, srvcert.next, NULL );\n    if( ( ret = mbedtls_ssl_conf_own_cert( &conf, &srvcert, &pkey ) ) != 0 )\n    {\n        mbedtls_printf( \" failed!  mbedtls_ssl_conf_own_cert returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 2. Setup the listening TCP socket\n     */\n    mbedtls_printf( \"  . Bind on https://localhost:4433/ ...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_bind( &listen_fd, NULL, \"4433\", MBEDTLS_NET_PROTO_TCP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed!  mbedtls_net_bind returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    while( 1 )\n    {\n        /*\n         * 3. Wait until a client connects\n         */\n        mbedtls_net_init( &client_fd );\n        mbedtls_ssl_init( &ssl );\n\n        mbedtls_printf( \"  . Waiting for a remote connection ...\\n\" );\n        fflush( stdout );\n\n        if( ( ret = mbedtls_net_accept( &listen_fd, &client_fd,\n                                        NULL, 0, NULL ) ) != 0 )\n        {\n            mbedtls_printf( \" failed!  mbedtls_net_accept returned %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        /*\n         * 3.5. Forking server thread\n         */\n\n        mbedtls_printf( \"  . Forking to handle connection ...\" );\n        fflush( stdout );\n\n        pid = fork();\n\n        if( pid < 0 )\n        {\n            mbedtls_printf(\" failed!  fork returned %d\\n\\n\", pid );\n            goto exit;\n        }\n\n        if( pid != 0 )\n        {\n            mbedtls_printf( \" ok\\n\" );\n\n            if( ( ret = mbedtls_ctr_drbg_reseed( &ctr_drbg,\n                                         (const unsigned char *) \"parent\",\n                                         6 ) ) != 0 )\n            {\n                mbedtls_printf( \" failed!  mbedtls_ctr_drbg_reseed returned %d\\n\\n\", ret );\n                goto exit;\n            }\n\n            continue;\n        }\n\n        mbedtls_net_init( &listen_fd );\n\n        pid = getpid();\n\n        /*\n         * 4. Setup stuff\n         */\n        mbedtls_printf( \"pid %d: Setting up the SSL data.\\n\", pid );\n        fflush( stdout );\n\n        if( ( ret = mbedtls_ctr_drbg_reseed( &ctr_drbg,\n                                     (const unsigned char *) \"child\",\n                                     5 ) ) != 0 )\n        {\n            mbedtls_printf(\n                    \"pid %d: SSL setup failed!  mbedtls_ctr_drbg_reseed returned %d\\n\\n\",\n                    pid, ret );\n            goto exit;\n        }\n\n        if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )\n        {\n            mbedtls_printf(\n                    \"pid %d: SSL setup failed!  mbedtls_ssl_setup returned %d\\n\\n\",\n                    pid, ret );\n            goto exit;\n        }\n\n        mbedtls_ssl_set_bio( &ssl, &client_fd, mbedtls_net_send, mbedtls_net_recv, NULL );\n\n        mbedtls_printf( \"pid %d: SSL setup ok\\n\", pid );\n\n        /*\n         * 5. Handshake\n         */\n        mbedtls_printf( \"pid %d: Performing the SSL/TLS handshake.\\n\", pid );\n        fflush( stdout );\n\n        while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 )\n        {\n            if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n            {\n                mbedtls_printf(\n                        \"pid %d: SSL handshake failed!  mbedtls_ssl_handshake returned %d\\n\\n\",\n                        pid, ret );\n                goto exit;\n            }\n        }\n\n        mbedtls_printf( \"pid %d: SSL handshake ok\\n\", pid );\n\n        /*\n         * 6. Read the HTTP Request\n         */\n        mbedtls_printf( \"pid %d: Start reading from client.\\n\", pid );\n        fflush( stdout );\n\n        do\n        {\n            len = sizeof( buf ) - 1;\n            memset( buf, 0, sizeof( buf ) );\n            ret = mbedtls_ssl_read( &ssl, buf, len );\n\n            if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE )\n                continue;\n\n            if( ret <= 0 )\n            {\n                switch( ret )\n                {\n                    case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:\n                        mbedtls_printf( \"pid %d: connection was closed gracefully\\n\", pid );\n                        break;\n\n                    case MBEDTLS_ERR_NET_CONN_RESET:\n                        mbedtls_printf( \"pid %d: connection was reset by peer\\n\", pid );\n                        break;\n\n                    default:\n                        mbedtls_printf( \"pid %d: mbedtls_ssl_read returned %d\\n\", pid, ret );\n                        break;\n                }\n\n                break;\n            }\n\n            len = ret;\n            mbedtls_printf( \"pid %d: %d bytes read\\n\\n%s\", pid, len, (char *) buf );\n\n            if( ret > 0 )\n                break;\n        }\n        while( 1 );\n\n        /*\n         * 7. Write the 200 Response\n         */\n        mbedtls_printf( \"pid %d: Start writing to client.\\n\", pid );\n        fflush( stdout );\n\n        len = sprintf( (char *) buf, HTTP_RESPONSE,\n                mbedtls_ssl_get_ciphersuite( &ssl ) );\n\n        while( cnt++ < 100 )\n        {\n            while( ( ret = mbedtls_ssl_write( &ssl, buf, len ) ) <= 0 )\n            {\n                if( ret == MBEDTLS_ERR_NET_CONN_RESET )\n                {\n                    mbedtls_printf(\n                            \"pid %d: Write failed!  peer closed the connection\\n\\n\", pid );\n                    goto exit;\n                }\n\n                if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n                {\n                    mbedtls_printf(\n                            \"pid %d: Write failed!  mbedtls_ssl_write returned %d\\n\\n\",\n                            pid, ret );\n                    goto exit;\n                }\n            }\n            len = ret;\n            mbedtls_printf( \"pid %d: %d bytes written\\n\\n%s\\n\", pid, len, (char *) buf );\n\n            mbedtls_net_usleep( 1000000 );\n        }\n\n        mbedtls_ssl_close_notify( &ssl );\n        goto exit;\n    }\n\nexit:\n    mbedtls_net_free( &client_fd );\n    mbedtls_net_free( &listen_fd );\n\n    mbedtls_x509_crt_free( &srvcert );\n    mbedtls_pk_free( &pkey );\n    mbedtls_ssl_free( &ssl );\n    mbedtls_ssl_config_free( &conf );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_CERTS_C && MBEDTLS_ENTROPY_C &&\n          MBEDTLS_SSL_TLS_C && MBEDTLS_SSL_SRV_C && MBEDTLS_NET_C &&\n          MBEDTLS_RSA_C && MBEDTLS_CTR_DRBG_C && MBEDTLS_PEM_PARSE_C &&\n          ! _WIN32 */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/ssl_mail_client.c",
    "content": "/*\n *  SSL client for SMTP servers\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_time       time\n#define mbedtls_time_t     time_t \n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_ENTROPY_C) ||  \\\n    !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_CLI_C) || \\\n    !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_RSA_C) ||         \\\n    !defined(MBEDTLS_CTR_DRBG_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \\\n    !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_SSL_TLS_C and/or MBEDTLS_SSL_CLI_C and/or \"\n           \"MBEDTLS_NET_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_CTR_DRBG_C and/or MBEDTLS_X509_CRT_PARSE_C \"\n           \"not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/base64.h\"\n#include \"mbedtls/error.h\"\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/certs.h\"\n#include \"mbedtls/x509.h\"\n\n#include <stdlib.h>\n#include <string.h>\n\n#if !defined(_MSC_VER) || defined(EFIX64) || defined(EFI32)\n#include <unistd.h>\n#else\n#include <io.h>\n#endif\n\n#if defined(_WIN32) || defined(_WIN32_WCE)\n#include <winsock2.h>\n#include <windows.h>\n\n#if defined(_MSC_VER)\n#if defined(_WIN32_WCE)\n#pragma comment( lib, \"ws2.lib\" )\n#else\n#pragma comment( lib, \"ws2_32.lib\" )\n#endif\n#endif /* _MSC_VER */\n#endif\n\n#define DFL_SERVER_NAME         \"localhost\"\n#define DFL_SERVER_PORT         \"465\"\n#define DFL_USER_NAME           \"user\"\n#define DFL_USER_PWD            \"password\"\n#define DFL_MAIL_FROM           \"\"\n#define DFL_MAIL_TO             \"\"\n#define DFL_DEBUG_LEVEL         0\n#define DFL_CA_FILE             \"\"\n#define DFL_CRT_FILE            \"\"\n#define DFL_KEY_FILE            \"\"\n#define DFL_FORCE_CIPHER        0\n#define DFL_MODE                0\n#define DFL_AUTHENTICATION      0\n\n#define MODE_SSL_TLS            0\n#define MODE_STARTTLS           0\n\n#if defined(MBEDTLS_BASE64_C)\n#define USAGE_AUTH \\\n    \"    authentication=%%d   default: 0 (disabled)\\n\"      \\\n    \"    user_name=%%s        default: \\\"user\\\"\\n\"          \\\n    \"    user_pwd=%%s         default: \\\"password\\\"\\n\"\n#else\n#define USAGE_AUTH \\\n    \"    authentication options disabled. (Require MBEDTLS_BASE64_C)\\n\"\n#endif /* MBEDTLS_BASE64_C */\n\n#if defined(MBEDTLS_FS_IO)\n#define USAGE_IO \\\n    \"    ca_file=%%s          default: \\\"\\\" (pre-loaded)\\n\" \\\n    \"    crt_file=%%s         default: \\\"\\\" (pre-loaded)\\n\" \\\n    \"    key_file=%%s         default: \\\"\\\" (pre-loaded)\\n\"\n#else\n#define USAGE_IO \\\n    \"    No file operations available (MBEDTLS_FS_IO not defined)\\n\"\n#endif /* MBEDTLS_FS_IO */\n\n#define USAGE \\\n    \"\\n usage: ssl_mail_client param=<>...\\n\"               \\\n    \"\\n acceptable parameters:\\n\"                           \\\n    \"    server_name=%%s      default: localhost\\n\"         \\\n    \"    server_port=%%d      default: 4433\\n\"              \\\n    \"    debug_level=%%d      default: 0 (disabled)\\n\"      \\\n    \"    mode=%%d             default: 0 (SSL/TLS) (1 for STARTTLS)\\n\"  \\\n    USAGE_AUTH                                              \\\n    \"    mail_from=%%s        default: \\\"\\\"\\n\"              \\\n    \"    mail_to=%%s          default: \\\"\\\"\\n\"              \\\n    USAGE_IO                                                \\\n    \"    force_ciphersuite=<name>    default: all enabled\\n\"\\\n    \" acceptable ciphersuite names:\\n\"\n\n/*\n * global options\n */\nstruct options\n{\n    const char *server_name;    /* hostname of the server (client only)     */\n    const char *server_port;    /* port on which the ssl service runs       */\n    int debug_level;            /* level of debugging                       */\n    int authentication;         /* if authentication is required            */\n    int mode;                   /* SSL/TLS (0) or STARTTLS (1)              */\n    const char *user_name;      /* username to use for authentication       */\n    const char *user_pwd;       /* password to use for authentication       */\n    const char *mail_from;      /* E-Mail address to use as sender          */\n    const char *mail_to;        /* E-Mail address to use as recipient       */\n    const char *ca_file;        /* the file with the CA certificate(s)      */\n    const char *crt_file;       /* the file with the client certificate     */\n    const char *key_file;       /* the file with the client key             */\n    int force_ciphersuite[2];   /* protocol/ciphersuite to use, or all      */\n} opt;\n\nstatic void my_debug( void *ctx, int level,\n                      const char *file, int line,\n                      const char *str )\n{\n    ((void) level);\n\n    mbedtls_fprintf( (FILE *) ctx, \"%s:%04d: %s\", file, line, str );\n    fflush(  (FILE *) ctx  );\n}\n\nstatic int do_handshake( mbedtls_ssl_context *ssl )\n{\n    int ret;\n    uint32_t flags;\n    unsigned char buf[1024];\n    memset(buf, 0, 1024);\n\n    /*\n     * 4. Handshake\n     */\n    mbedtls_printf( \"  . Performing the SSL/TLS handshake...\" );\n    fflush( stdout );\n\n    while( ( ret = mbedtls_ssl_handshake( ssl ) ) != 0 )\n    {\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n#if defined(MBEDTLS_ERROR_C)\n            mbedtls_strerror( ret, (char *) buf, 1024 );\n#endif\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_handshake returned %d: %s\\n\\n\", ret, buf );\n            return( -1 );\n        }\n    }\n\n    mbedtls_printf( \" ok\\n    [ Ciphersuite is %s ]\\n\",\n            mbedtls_ssl_get_ciphersuite( ssl ) );\n\n    /*\n     * 5. Verify the server certificate\n     */\n    mbedtls_printf( \"  . Verifying peer X.509 certificate...\" );\n\n    /* In real life, we probably want to bail out when ret != 0 */\n    if( ( flags = mbedtls_ssl_get_verify_result( ssl ) ) != 0 )\n    {\n        char vrfy_buf[512];\n\n        mbedtls_printf( \" failed\\n\" );\n\n        mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), \"  ! \", flags );\n\n        mbedtls_printf( \"%s\\n\", vrfy_buf );\n    }\n    else\n        mbedtls_printf( \" ok\\n\" );\n\n    mbedtls_printf( \"  . Peer certificate information    ...\\n\" );\n    mbedtls_x509_crt_info( (char *) buf, sizeof( buf ) - 1, \"      \",\n                   mbedtls_ssl_get_peer_cert( ssl ) );\n    mbedtls_printf( \"%s\\n\", buf );\n\n    return( 0 );\n}\n\nstatic int write_ssl_data( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len )\n{\n    int ret;\n\n    mbedtls_printf(\"\\n%s\", buf);\n    while( len && ( ret = mbedtls_ssl_write( ssl, buf, len ) ) <= 0 )\n    {\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_write returned %d\\n\\n\", ret );\n            return -1;\n        }\n    }\n\n    return( 0 );\n}\n\nstatic int write_ssl_and_get_response( mbedtls_ssl_context *ssl, unsigned char *buf, size_t len )\n{\n    int ret;\n    unsigned char data[128];\n    char code[4];\n    size_t i, idx = 0;\n\n    mbedtls_printf(\"\\n%s\", buf);\n    while( len && ( ret = mbedtls_ssl_write( ssl, buf, len ) ) <= 0 )\n    {\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_write returned %d\\n\\n\", ret );\n            return -1;\n        }\n    }\n\n    do\n    {\n        len = sizeof( data ) - 1;\n        memset( data, 0, sizeof( data ) );\n        ret = mbedtls_ssl_read( ssl, data, len );\n\n        if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE )\n            continue;\n\n        if( ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY )\n            return -1;\n\n        if( ret <= 0 )\n        {\n            mbedtls_printf( \"failed\\n  ! mbedtls_ssl_read returned %d\\n\\n\", ret );\n            return -1;\n        }\n\n        mbedtls_printf(\"\\n%s\", data);\n        len = ret;\n        for( i = 0; i < len; i++ )\n        {\n            if( data[i] != '\\n' )\n            {\n                if( idx < 4 )\n                    code[ idx++ ] = data[i];\n                continue;\n            }\n\n            if( idx == 4 && code[0] >= '0' && code[0] <= '9' && code[3] == ' ' )\n            {\n                code[3] = '\\0';\n                return atoi( code );\n            }\n\n            idx = 0;\n        }\n    }\n    while( 1 );\n}\n\nstatic int write_and_get_response( mbedtls_net_context *sock_fd, unsigned char *buf, size_t len )\n{\n    int ret;\n    unsigned char data[128];\n    char code[4];\n    size_t i, idx = 0;\n\n    mbedtls_printf(\"\\n%s\", buf);\n    if( len && ( ret = mbedtls_net_send( sock_fd, buf, len ) ) <= 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_write returned %d\\n\\n\", ret );\n            return -1;\n    }\n\n    do\n    {\n        len = sizeof( data ) - 1;\n        memset( data, 0, sizeof( data ) );\n        ret = mbedtls_net_recv( sock_fd, data, len );\n\n        if( ret <= 0 )\n        {\n            mbedtls_printf( \"failed\\n  ! read returned %d\\n\\n\", ret );\n            return -1;\n        }\n\n        data[len] = '\\0';\n        mbedtls_printf(\"\\n%s\", data);\n        len = ret;\n        for( i = 0; i < len; i++ )\n        {\n            if( data[i] != '\\n' )\n            {\n                if( idx < 4 )\n                    code[ idx++ ] = data[i];\n                continue;\n            }\n\n            if( idx == 4 && code[0] >= '0' && code[0] <= '9' && code[3] == ' ' )\n            {\n                code[3] = '\\0';\n                return atoi( code );\n            }\n\n            idx = 0;\n        }\n    }\n    while( 1 );\n}\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0, len;\n    mbedtls_net_context server_fd;\n    unsigned char buf[1024];\n#if defined(MBEDTLS_BASE64_C)\n    unsigned char base[1024];\n#endif\n    char hostname[32];\n    const char *pers = \"ssl_mail_client\";\n\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_context ssl;\n    mbedtls_ssl_config conf;\n    mbedtls_x509_crt cacert;\n    mbedtls_x509_crt clicert;\n    mbedtls_pk_context pkey;\n    int i;\n    size_t n;\n    char *p, *q;\n    const int *list;\n\n    /*\n     * Make sure memory references are valid in case we exit early.\n     */\n    mbedtls_net_init( &server_fd );\n    mbedtls_ssl_init( &ssl );\n    mbedtls_ssl_config_init( &conf );\n    memset( &buf, 0, sizeof( buf ) );\n    mbedtls_x509_crt_init( &cacert );\n    mbedtls_x509_crt_init( &clicert );\n    mbedtls_pk_init( &pkey );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n    if( argc == 0 )\n    {\n    usage:\n        mbedtls_printf( USAGE );\n\n        list = mbedtls_ssl_list_ciphersuites();\n        while( *list )\n        {\n            mbedtls_printf(\"    %s\\n\", mbedtls_ssl_get_ciphersuite_name( *list ) );\n            list++;\n        }\n        mbedtls_printf(\"\\n\");\n        goto exit;\n    }\n\n    opt.server_name         = DFL_SERVER_NAME;\n    opt.server_port         = DFL_SERVER_PORT;\n    opt.debug_level         = DFL_DEBUG_LEVEL;\n    opt.authentication      = DFL_AUTHENTICATION;\n    opt.mode                = DFL_MODE;\n    opt.user_name           = DFL_USER_NAME;\n    opt.user_pwd            = DFL_USER_PWD;\n    opt.mail_from           = DFL_MAIL_FROM;\n    opt.mail_to             = DFL_MAIL_TO;\n    opt.ca_file             = DFL_CA_FILE;\n    opt.crt_file            = DFL_CRT_FILE;\n    opt.key_file            = DFL_KEY_FILE;\n    opt.force_ciphersuite[0]= DFL_FORCE_CIPHER;\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"server_name\" ) == 0 )\n            opt.server_name = q;\n        else if( strcmp( p, \"server_port\" ) == 0 )\n            opt.server_port = q;\n        else if( strcmp( p, \"debug_level\" ) == 0 )\n        {\n            opt.debug_level = atoi( q );\n            if( opt.debug_level < 0 || opt.debug_level > 65535 )\n                goto usage;\n        }\n        else if( strcmp( p, \"authentication\" ) == 0 )\n        {\n            opt.authentication = atoi( q );\n            if( opt.authentication < 0 || opt.authentication > 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"mode\" ) == 0 )\n        {\n            opt.mode = atoi( q );\n            if( opt.mode < 0 || opt.mode > 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"user_name\" ) == 0 )\n            opt.user_name = q;\n        else if( strcmp( p, \"user_pwd\" ) == 0 )\n            opt.user_pwd = q;\n        else if( strcmp( p, \"mail_from\" ) == 0 )\n            opt.mail_from = q;\n        else if( strcmp( p, \"mail_to\" ) == 0 )\n            opt.mail_to = q;\n        else if( strcmp( p, \"ca_file\" ) == 0 )\n            opt.ca_file = q;\n        else if( strcmp( p, \"crt_file\" ) == 0 )\n            opt.crt_file = q;\n        else if( strcmp( p, \"key_file\" ) == 0 )\n            opt.key_file = q;\n        else if( strcmp( p, \"force_ciphersuite\" ) == 0 )\n        {\n            opt.force_ciphersuite[0] = -1;\n\n            opt.force_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( q );\n\n            if( opt.force_ciphersuite[0] <= 0 )\n                goto usage;\n\n            opt.force_ciphersuite[1] = 0;\n        }\n        else\n            goto usage;\n    }\n\n    /*\n     * 0. Initialize the RNG and the session data\n     */\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1.1. Load the trusted CA\n     */\n    mbedtls_printf( \"  . Loading the CA root certificate ...\" );\n    fflush( stdout );\n\n#if defined(MBEDTLS_FS_IO)\n    if( strlen( opt.ca_file ) )\n        ret = mbedtls_x509_crt_parse_file( &cacert, opt.ca_file );\n    else\n#endif\n#if defined(MBEDTLS_CERTS_C) && defined(MBEDTLS_PEM_PARSE_C)\n        ret = mbedtls_x509_crt_parse( &cacert, (const unsigned char *) mbedtls_test_cas_pem,\n                              mbedtls_test_cas_pem_len );\n#else\n    {\n        ret = 1;\n        mbedtls_printf(\"MBEDTLS_CERTS_C and/or MBEDTLS_PEM_PARSE_C not defined.\");\n    }\n#endif\n    if( ret < 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok (%d skipped)\\n\", ret );\n\n    /*\n     * 1.2. Load own certificate and private key\n     *\n     * (can be skipped if client authentication is not required)\n     */\n    mbedtls_printf( \"  . Loading the client cert. and key...\" );\n    fflush( stdout );\n\n#if defined(MBEDTLS_FS_IO)\n    if( strlen( opt.crt_file ) )\n        ret = mbedtls_x509_crt_parse_file( &clicert, opt.crt_file );\n    else\n#endif\n#if defined(MBEDTLS_CERTS_C)\n        ret = mbedtls_x509_crt_parse( &clicert, (const unsigned char *) mbedtls_test_cli_crt,\n                              mbedtls_test_cli_crt_len );\n#else\n    {\n        ret = -1;\n        mbedtls_printf(\"MBEDTLS_CERTS_C not defined.\");\n    }\n#endif\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n#if defined(MBEDTLS_FS_IO)\n    if( strlen( opt.key_file ) )\n        ret = mbedtls_pk_parse_keyfile( &pkey, opt.key_file, \"\" );\n    else\n#endif\n#if defined(MBEDTLS_CERTS_C) && defined(MBEDTLS_PEM_PARSE_C)\n        ret = mbedtls_pk_parse_key( &pkey, (const unsigned char *) mbedtls_test_cli_key,\n                mbedtls_test_cli_key_len, NULL, 0 );\n#else\n    {\n        ret = -1;\n        mbedtls_printf(\"MBEDTLS_CERTS_C or MBEDTLS_PEM_PARSE_C not defined.\");\n    }\n#endif\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_key returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 2. Start the connection\n     */\n    mbedtls_printf( \"  . Connecting to tcp/%s/%s...\", opt.server_name,\n                                                opt.server_port );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_connect( &server_fd, opt.server_name,\n                             opt.server_port, MBEDTLS_NET_PROTO_TCP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_connect returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 3. Setup stuff\n     */\n    mbedtls_printf( \"  . Setting up the SSL/TLS structure...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ssl_config_defaults( &conf,\n                    MBEDTLS_SSL_IS_CLIENT,\n                    MBEDTLS_SSL_TRANSPORT_STREAM,\n                    MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_config_defaults returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    /* OPTIONAL is not optimal for security,\n     * but makes interop easier in this simplified example */\n    mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_OPTIONAL );\n\n    mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n    mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );\n\n    if( opt.force_ciphersuite[0] != DFL_FORCE_CIPHER )\n        mbedtls_ssl_conf_ciphersuites( &conf, opt.force_ciphersuite );\n\n    mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );\n    if( ( ret = mbedtls_ssl_conf_own_cert( &conf, &clicert, &pkey ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_own_cert returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_setup returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_ssl_set_hostname( &ssl, opt.server_name ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_set_hostname returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );\n\n    mbedtls_printf( \" ok\\n\" );\n\n    if( opt.mode == MODE_SSL_TLS )\n    {\n        if( do_handshake( &ssl ) != 0 )\n            goto exit;\n\n        mbedtls_printf( \"  > Get header from server:\" );\n        fflush( stdout );\n\n        ret = write_ssl_and_get_response( &ssl, buf, 0 );\n        if( ret < 200 || ret > 299 )\n        {\n            mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_printf(\" ok\\n\" );\n\n        mbedtls_printf( \"  > Write EHLO to server:\" );\n        fflush( stdout );\n\n        gethostname( hostname, 32 );\n        len = sprintf( (char *) buf, \"EHLO %s\\r\\n\", hostname );\n        ret = write_ssl_and_get_response( &ssl, buf, len );\n        if( ret < 200 || ret > 299 )\n        {\n            mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n            goto exit;\n        }\n    }\n    else\n    {\n        mbedtls_printf( \"  > Get header from server:\" );\n        fflush( stdout );\n\n        ret = write_and_get_response( &server_fd, buf, 0 );\n        if( ret < 200 || ret > 299 )\n        {\n            mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_printf(\" ok\\n\" );\n\n        mbedtls_printf( \"  > Write EHLO to server:\" );\n        fflush( stdout );\n\n        gethostname( hostname, 32 );\n        len = sprintf( (char *) buf, \"EHLO %s\\r\\n\", hostname );\n        ret = write_and_get_response( &server_fd, buf, len );\n        if( ret < 200 || ret > 299 )\n        {\n            mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_printf(\" ok\\n\" );\n\n        mbedtls_printf( \"  > Write STARTTLS to server:\" );\n        fflush( stdout );\n\n        gethostname( hostname, 32 );\n        len = sprintf( (char *) buf, \"STARTTLS\\r\\n\" );\n        ret = write_and_get_response( &server_fd, buf, len );\n        if( ret < 200 || ret > 299 )\n        {\n            mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_printf(\" ok\\n\" );\n\n        if( do_handshake( &ssl ) != 0 )\n            goto exit;\n    }\n\n#if defined(MBEDTLS_BASE64_C)\n    if( opt.authentication )\n    {\n        mbedtls_printf( \"  > Write AUTH LOGIN to server:\" );\n        fflush( stdout );\n\n        len = sprintf( (char *) buf, \"AUTH LOGIN\\r\\n\" );\n        ret = write_ssl_and_get_response( &ssl, buf, len );\n        if( ret < 200 || ret > 399 )\n        {\n            mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_printf(\" ok\\n\" );\n\n        mbedtls_printf( \"  > Write username to server: %s\", opt.user_name );\n        fflush( stdout );\n\n        ret = mbedtls_base64_encode( base, sizeof( base ), &n, (const unsigned char *) opt.user_name,\n                             strlen( opt.user_name ) );\n\n        if( ret != 0 ) {\n            mbedtls_printf( \" failed\\n  ! mbedtls_base64_encode returned %d\\n\\n\", ret );\n            goto exit;\n        }\n        len = sprintf( (char *) buf, \"%s\\r\\n\", base );\n        ret = write_ssl_and_get_response( &ssl, buf, len );\n        if( ret < 300 || ret > 399 )\n        {\n            mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_printf(\" ok\\n\" );\n\n        mbedtls_printf( \"  > Write password to server: %s\", opt.user_pwd );\n        fflush( stdout );\n\n        ret = mbedtls_base64_encode( base, sizeof( base ), &n, (const unsigned char *) opt.user_pwd,\n                             strlen( opt.user_pwd ) );\n\n        if( ret != 0 ) {\n            mbedtls_printf( \" failed\\n  ! mbedtls_base64_encode returned %d\\n\\n\", ret );\n            goto exit;\n        }\n        len = sprintf( (char *) buf, \"%s\\r\\n\", base );\n        ret = write_ssl_and_get_response( &ssl, buf, len );\n        if( ret < 200 || ret > 399 )\n        {\n            mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_printf(\" ok\\n\" );\n    }\n#endif\n\n    mbedtls_printf( \"  > Write MAIL FROM to server:\" );\n    fflush( stdout );\n\n    len = sprintf( (char *) buf, \"MAIL FROM:<%s>\\r\\n\", opt.mail_from );\n    ret = write_ssl_and_get_response( &ssl, buf, len );\n    if( ret < 200 || ret > 299 )\n    {\n        mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf(\" ok\\n\" );\n\n    mbedtls_printf( \"  > Write RCPT TO to server:\" );\n    fflush( stdout );\n\n    len = sprintf( (char *) buf, \"RCPT TO:<%s>\\r\\n\", opt.mail_to );\n    ret = write_ssl_and_get_response( &ssl, buf, len );\n    if( ret < 200 || ret > 299 )\n    {\n        mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf(\" ok\\n\" );\n\n    mbedtls_printf( \"  > Write DATA to server:\" );\n    fflush( stdout );\n\n    len = sprintf( (char *) buf, \"DATA\\r\\n\" );\n    ret = write_ssl_and_get_response( &ssl, buf, len );\n    if( ret < 300 || ret > 399 )\n    {\n        mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf(\" ok\\n\" );\n\n    mbedtls_printf( \"  > Write content to server:\" );\n    fflush( stdout );\n\n    len = sprintf( (char *) buf, \"From: %s\\r\\nSubject: mbed TLS Test mail\\r\\n\\r\\n\"\n            \"This is a simple test mail from the \"\n            \"mbed TLS mail client example.\\r\\n\"\n            \"\\r\\n\"\n            \"Enjoy!\", opt.mail_from );\n    ret = write_ssl_data( &ssl, buf, len );\n\n    len = sprintf( (char *) buf, \"\\r\\n.\\r\\n\");\n    ret = write_ssl_and_get_response( &ssl, buf, len );\n    if( ret < 200 || ret > 299 )\n    {\n        mbedtls_printf( \" failed\\n  ! server responded with %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf(\" ok\\n\" );\n\n    mbedtls_ssl_close_notify( &ssl );\n\nexit:\n\n    mbedtls_net_free( &server_fd );\n    mbedtls_x509_crt_free( &clicert );\n    mbedtls_x509_crt_free( &cacert );\n    mbedtls_pk_free( &pkey );\n    mbedtls_ssl_free( &ssl );\n    mbedtls_ssl_config_free( &conf );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C && MBEDTLS_SSL_TLS_C &&\n          MBEDTLS_SSL_CLI_C && MBEDTLS_NET_C && MBEDTLS_RSA_C **\n          MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/ssl_pthread_server.c",
    "content": "/*\n *  SSL server demonstration program using pthread for handling multiple\n *  clients.\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#define mbedtls_snprintf   snprintf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_CERTS_C) ||            \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_SSL_TLS_C) ||         \\\n    !defined(MBEDTLS_SSL_SRV_C) || !defined(MBEDTLS_NET_C) ||             \\\n    !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_CTR_DRBG_C) ||            \\\n    !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_FS_IO) ||      \\\n    !defined(MBEDTLS_THREADING_C) || !defined(MBEDTLS_THREADING_PTHREAD) || \\\n    !defined(MBEDTLS_PEM_PARSE_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_CERTS_C and/or MBEDTLS_ENTROPY_C \"\n           \"and/or MBEDTLS_SSL_TLS_C and/or MBEDTLS_SSL_SRV_C and/or \"\n           \"MBEDTLS_NET_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_CTR_DRBG_C and/or MBEDTLS_X509_CRT_PARSE_C and/or \"\n           \"MBEDTLS_THREADING_C and/or MBEDTLS_THREADING_PTHREAD \"\n           \"and/or MBEDTLS_PEM_PARSE_C not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include <stdlib.h>\n#include <string.h>\n\n#if defined(_WIN32)\n#include <windows.h>\n#endif\n\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/certs.h\"\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/error.h\"\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n#include \"mbedtls/ssl_cache.h\"\n#endif\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n#include \"mbedtls/memory_buffer_alloc.h\"\n#endif\n\n#define HTTP_RESPONSE \\\n    \"HTTP/1.0 200 OK\\r\\nContent-Type: text/html\\r\\n\\r\\n\" \\\n    \"<h2>mbed TLS Test Server</h2>\\r\\n\" \\\n    \"<p>Successful connection using: %s</p>\\r\\n\"\n\n#define DEBUG_LEVEL 0\n\n#define MAX_NUM_THREADS 5\n\nmbedtls_threading_mutex_t debug_mutex;\n\nstatic void my_mutexed_debug( void *ctx, int level,\n                      const char *file, int line,\n                      const char *str )\n{\n    long int thread_id = (long int) pthread_self();\n\n    mbedtls_mutex_lock( &debug_mutex );\n\n    ((void) level);\n    mbedtls_fprintf( (FILE *) ctx, \"%s:%04d: [ #%ld ] %s\",\n                                    file, line, thread_id, str );\n    fflush(  (FILE *) ctx  );\n\n    mbedtls_mutex_unlock( &debug_mutex );\n}\n\ntypedef struct {\n    mbedtls_net_context client_fd;\n    int thread_complete;\n    const mbedtls_ssl_config *config;\n} thread_info_t;\n\ntypedef struct {\n    int active;\n    thread_info_t   data;\n    pthread_t       thread;\n} pthread_info_t;\n\nstatic thread_info_t    base_info;\nstatic pthread_info_t   threads[MAX_NUM_THREADS];\n\nstatic void *handle_ssl_connection( void *data )\n{\n    int ret, len;\n    thread_info_t *thread_info = (thread_info_t *) data;\n    mbedtls_net_context *client_fd = &thread_info->client_fd;\n    long int thread_id = (long int) pthread_self();\n    unsigned char buf[1024];\n    mbedtls_ssl_context ssl;\n\n    /* Make sure memory references are valid */\n    mbedtls_ssl_init( &ssl );\n\n    mbedtls_printf( \"  [ #%ld ]  Setting up SSL/TLS data\\n\", thread_id );\n\n    /*\n     * 4. Get the SSL context ready\n     */\n    if( ( ret = mbedtls_ssl_setup( &ssl, thread_info->config ) ) != 0 )\n    {\n        mbedtls_printf( \"  [ #%ld ]  failed: mbedtls_ssl_setup returned -0x%04x\\n\",\n                thread_id, -ret );\n        goto thread_exit;\n    }\n\n    mbedtls_ssl_set_bio( &ssl, client_fd, mbedtls_net_send, mbedtls_net_recv, NULL );\n\n    /*\n     * 5. Handshake\n     */\n    mbedtls_printf( \"  [ #%ld ]  Performing the SSL/TLS handshake\\n\", thread_id );\n\n    while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 )\n    {\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \"  [ #%ld ]  failed: mbedtls_ssl_handshake returned -0x%04x\\n\",\n                    thread_id, -ret );\n            goto thread_exit;\n        }\n    }\n\n    mbedtls_printf( \"  [ #%ld ]  ok\\n\", thread_id );\n\n    /*\n     * 6. Read the HTTP Request\n     */\n    mbedtls_printf( \"  [ #%ld ]  < Read from client\\n\", thread_id );\n\n    do\n    {\n        len = sizeof( buf ) - 1;\n        memset( buf, 0, sizeof( buf ) );\n        ret = mbedtls_ssl_read( &ssl, buf, len );\n\n        if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE )\n            continue;\n\n        if( ret <= 0 )\n        {\n            switch( ret )\n            {\n                case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:\n                    mbedtls_printf( \"  [ #%ld ]  connection was closed gracefully\\n\",\n                            thread_id );\n                    goto thread_exit;\n\n                case MBEDTLS_ERR_NET_CONN_RESET:\n                    mbedtls_printf( \"  [ #%ld ]  connection was reset by peer\\n\",\n                            thread_id );\n                    goto thread_exit;\n\n                default:\n                    mbedtls_printf( \"  [ #%ld ]  mbedtls_ssl_read returned -0x%04x\\n\",\n                            thread_id, -ret );\n                    goto thread_exit;\n            }\n        }\n\n        len = ret;\n        mbedtls_printf( \"  [ #%ld ]  %d bytes read\\n=====\\n%s\\n=====\\n\",\n                thread_id, len, (char *) buf );\n\n        if( ret > 0 )\n            break;\n    }\n    while( 1 );\n\n    /*\n     * 7. Write the 200 Response\n     */\n    mbedtls_printf( \"  [ #%ld ]  > Write to client:\\n\", thread_id );\n\n    len = sprintf( (char *) buf, HTTP_RESPONSE,\n                   mbedtls_ssl_get_ciphersuite( &ssl ) );\n\n    while( ( ret = mbedtls_ssl_write( &ssl, buf, len ) ) <= 0 )\n    {\n        if( ret == MBEDTLS_ERR_NET_CONN_RESET )\n        {\n            mbedtls_printf( \"  [ #%ld ]  failed: peer closed the connection\\n\",\n                    thread_id );\n            goto thread_exit;\n        }\n\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \"  [ #%ld ]  failed: mbedtls_ssl_write returned -0x%04x\\n\",\n                    thread_id, ret );\n            goto thread_exit;\n        }\n    }\n\n    len = ret;\n    mbedtls_printf( \"  [ #%ld ]  %d bytes written\\n=====\\n%s\\n=====\\n\",\n            thread_id, len, (char *) buf );\n\n    mbedtls_printf( \"  [ #%ld ]  . Closing the connection...\", thread_id );\n\n    while( ( ret = mbedtls_ssl_close_notify( &ssl ) ) < 0 )\n    {\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ &&\n            ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \"  [ #%ld ]  failed: mbedtls_ssl_close_notify returned -0x%04x\\n\",\n                    thread_id, ret );\n            goto thread_exit;\n        }\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    ret = 0;\n\nthread_exit:\n\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        mbedtls_printf(\"  [ #%ld ]  Last error was: -0x%04x - %s\\n\\n\",\n               thread_id, -ret, error_buf );\n    }\n#endif\n\n    mbedtls_net_free( client_fd );\n    mbedtls_ssl_free( &ssl );\n\n    thread_info->thread_complete = 1;\n\n    return( NULL );\n}\n\nstatic int thread_create( mbedtls_net_context *client_fd )\n{\n    int ret, i;\n\n    /*\n     * Find in-active or finished thread slot\n     */\n    for( i = 0; i < MAX_NUM_THREADS; i++ )\n    {\n        if( threads[i].active == 0 )\n            break;\n\n        if( threads[i].data.thread_complete == 1 )\n        {\n            mbedtls_printf( \"  [ main ]  Cleaning up thread %d\\n\", i );\n            pthread_join(threads[i].thread, NULL );\n            memset( &threads[i], 0, sizeof(pthread_info_t) );\n            break;\n        }\n    }\n\n    if( i == MAX_NUM_THREADS )\n        return( -1 );\n\n    /*\n     * Fill thread-info for thread\n     */\n    memcpy( &threads[i].data, &base_info, sizeof(base_info) );\n    threads[i].active = 1;\n    memcpy( &threads[i].data.client_fd, client_fd, sizeof( mbedtls_net_context ) );\n\n    if( ( ret = pthread_create( &threads[i].thread, NULL, handle_ssl_connection,\n                                &threads[i].data ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    return( 0 );\n}\n\nint main( void )\n{\n    int ret;\n    mbedtls_net_context listen_fd, client_fd;\n    const char pers[] = \"ssl_pthread_server\";\n\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_config conf;\n    mbedtls_x509_crt srvcert;\n    mbedtls_x509_crt cachain;\n    mbedtls_pk_context pkey;\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    unsigned char alloc_buf[100000];\n#endif\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_context cache;\n#endif\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    mbedtls_memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );\n#endif\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_init( &cache );\n#endif\n\n    mbedtls_x509_crt_init( &srvcert );\n    mbedtls_x509_crt_init( &cachain );\n\n    mbedtls_ssl_config_init( &conf );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n    memset( threads, 0, sizeof(threads) );\n    mbedtls_net_init( &listen_fd );\n    mbedtls_net_init( &client_fd );\n\n    mbedtls_mutex_init( &debug_mutex );\n\n    base_info.config = &conf;\n\n    /*\n     * We use only a single entropy source that is used in all the threads.\n     */\n    mbedtls_entropy_init( &entropy );\n\n    /*\n     * 1. Load the certificates and private RSA key\n     */\n    mbedtls_printf( \"\\n  . Loading the server cert. and key...\" );\n    fflush( stdout );\n\n    /*\n     * This demonstration program uses embedded test certificates.\n     * Instead, you may want to use mbedtls_x509_crt_parse_file() to read the\n     * server and CA certificates, as well as mbedtls_pk_parse_keyfile().\n     */\n    ret = mbedtls_x509_crt_parse( &srvcert, (const unsigned char *) mbedtls_test_srv_crt,\n                          mbedtls_test_srv_crt_len );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_x509_crt_parse( &cachain, (const unsigned char *) mbedtls_test_cas_pem,\n                          mbedtls_test_cas_pem_len );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_pk_init( &pkey );\n    ret =  mbedtls_pk_parse_key( &pkey, (const unsigned char *) mbedtls_test_srv_key,\n                         mbedtls_test_srv_key_len, NULL, 0 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_key returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1b. Seed the random number generator\n     */\n    mbedtls_printf( \"  . Seeding the random number generator...\" );\n\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed: mbedtls_ctr_drbg_seed returned -0x%04x\\n\",\n                -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1c. Prepare SSL configuration\n     */\n    mbedtls_printf( \"  . Setting up the SSL data....\" );\n\n    if( ( ret = mbedtls_ssl_config_defaults( &conf,\n                    MBEDTLS_SSL_IS_SERVER,\n                    MBEDTLS_SSL_TRANSPORT_STREAM,\n                    MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )\n    {\n        mbedtls_printf( \" failed: mbedtls_ssl_config_defaults returned -0x%04x\\n\",\n                -ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n    mbedtls_ssl_conf_dbg( &conf, my_mutexed_debug, stdout );\n\n    /* mbedtls_ssl_cache_get() and mbedtls_ssl_cache_set() are thread-safe if\n     * MBEDTLS_THREADING_C is set.\n     */\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_conf_session_cache( &conf, &cache,\n                                   mbedtls_ssl_cache_get,\n                                   mbedtls_ssl_cache_set );\n#endif\n\n    mbedtls_ssl_conf_ca_chain( &conf, &cachain, NULL );\n    if( ( ret = mbedtls_ssl_conf_own_cert( &conf, &srvcert, &pkey ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_own_cert returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n\n    /*\n     * 2. Setup the listening TCP socket\n     */\n    mbedtls_printf( \"  . Bind on https://localhost:4433/ ...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_bind( &listen_fd, NULL, \"4433\", MBEDTLS_NET_PROTO_TCP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_bind returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\nreset:\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        mbedtls_printf( \"  [ main ]  Last error was: -0x%04x - %s\\n\", -ret, error_buf );\n    }\n#endif\n\n    /*\n     * 3. Wait until a client connects\n     */\n    mbedtls_printf( \"  [ main ]  Waiting for a remote connection\\n\" );\n\n    if( ( ret = mbedtls_net_accept( &listen_fd, &client_fd,\n                                    NULL, 0, NULL ) ) != 0 )\n    {\n        mbedtls_printf( \"  [ main ] failed: mbedtls_net_accept returned -0x%04x\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \"  [ main ]  ok\\n\" );\n    mbedtls_printf( \"  [ main ]  Creating a new thread\\n\" );\n\n    if( ( ret = thread_create( &client_fd ) ) != 0 )\n    {\n        mbedtls_printf( \"  [ main ]  failed: thread_create returned %d\\n\", ret );\n        mbedtls_net_free( &client_fd );\n        goto reset;\n    }\n\n    ret = 0;\n    goto reset;\n\nexit:\n    mbedtls_x509_crt_free( &srvcert );\n    mbedtls_pk_free( &pkey );\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_free( &cache );\n#endif\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n    mbedtls_ssl_config_free( &conf );\n\n    mbedtls_net_free( &listen_fd );\n\n    mbedtls_mutex_free( &debug_mutex );\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    mbedtls_memory_buffer_alloc_free();\n#endif\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_CERTS_C && MBEDTLS_ENTROPY_C &&\n          MBEDTLS_SSL_TLS_C && MBEDTLS_SSL_SRV_C && MBEDTLS_NET_C &&\n          MBEDTLS_RSA_C && MBEDTLS_CTR_DRBG_C && MBEDTLS_THREADING_C &&\n          MBEDTLS_THREADING_PTHREAD && MBEDTLS_PEM_PARSE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/ssl_server.c",
    "content": "/*\n *  SSL server demonstration program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_time       time\n#define mbedtls_time_t     time_t \n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_CERTS_C) ||    \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_SSL_TLS_C) || \\\n    !defined(MBEDTLS_SSL_SRV_C) || !defined(MBEDTLS_NET_C) ||     \\\n    !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_CTR_DRBG_C) ||    \\\n    !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_FS_IO) || \\\n    !defined(MBEDTLS_PEM_PARSE_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_CERTS_C and/or MBEDTLS_ENTROPY_C \"\n           \"and/or MBEDTLS_SSL_TLS_C and/or MBEDTLS_SSL_SRV_C and/or \"\n           \"MBEDTLS_NET_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_CTR_DRBG_C and/or MBEDTLS_X509_CRT_PARSE_C \"\n           \"and/or MBEDTLS_PEM_PARSE_C not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include <stdlib.h>\n#include <string.h>\n\n#if defined(_WIN32)\n#include <windows.h>\n#endif\n\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/certs.h\"\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/error.h\"\n#include \"mbedtls/debug.h\"\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n#include \"mbedtls/ssl_cache.h\"\n#endif\n\n#define HTTP_RESPONSE \\\n    \"HTTP/1.0 200 OK\\r\\nContent-Type: text/html\\r\\n\\r\\n\" \\\n    \"<h2>mbed TLS Test Server</h2>\\r\\n\" \\\n    \"<p>Successful connection using: %s</p>\\r\\n\"\n\n#define DEBUG_LEVEL 0\n\nstatic void my_debug( void *ctx, int level,\n                      const char *file, int line,\n                      const char *str )\n{\n    ((void) level);\n\n    mbedtls_fprintf( (FILE *) ctx, \"%s:%04d: %s\", file, line, str );\n    fflush(  (FILE *) ctx  );\n}\n\nint main( void )\n{\n    int ret, len;\n    mbedtls_net_context listen_fd, client_fd;\n    unsigned char buf[1024];\n    const char *pers = \"ssl_server\";\n\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_context ssl;\n    mbedtls_ssl_config conf;\n    mbedtls_x509_crt srvcert;\n    mbedtls_pk_context pkey;\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_context cache;\n#endif\n\n    mbedtls_net_init( &listen_fd );\n    mbedtls_net_init( &client_fd );\n    mbedtls_ssl_init( &ssl );\n    mbedtls_ssl_config_init( &conf );\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_init( &cache );\n#endif\n    mbedtls_x509_crt_init( &srvcert );\n    mbedtls_pk_init( &pkey );\n    mbedtls_entropy_init( &entropy );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n\n#if defined(MBEDTLS_DEBUG_C)\n    mbedtls_debug_set_threshold( DEBUG_LEVEL );\n#endif\n\n    /*\n     * 1. Load the certificates and private RSA key\n     */\n    mbedtls_printf( \"\\n  . Loading the server cert. and key...\" );\n    fflush( stdout );\n\n    /*\n     * This demonstration program uses embedded test certificates.\n     * Instead, you may want to use mbedtls_x509_crt_parse_file() to read the\n     * server and CA certificates, as well as mbedtls_pk_parse_keyfile().\n     */\n    ret = mbedtls_x509_crt_parse( &srvcert, (const unsigned char *) mbedtls_test_srv_crt,\n                          mbedtls_test_srv_crt_len );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    ret = mbedtls_x509_crt_parse( &srvcert, (const unsigned char *) mbedtls_test_cas_pem,\n                          mbedtls_test_cas_pem_len );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    ret =  mbedtls_pk_parse_key( &pkey, (const unsigned char *) mbedtls_test_srv_key,\n                         mbedtls_test_srv_key_len, NULL, 0 );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_key returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 2. Setup the listening TCP socket\n     */\n    mbedtls_printf( \"  . Bind on https://localhost:4433/ ...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_bind( &listen_fd, NULL, \"4433\", MBEDTLS_NET_PROTO_TCP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_bind returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 3. Seed the RNG\n     */\n    mbedtls_printf( \"  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 4. Setup stuff\n     */\n    mbedtls_printf( \"  . Setting up the SSL data....\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ssl_config_defaults( &conf,\n                    MBEDTLS_SSL_IS_SERVER,\n                    MBEDTLS_SSL_TRANSPORT_STREAM,\n                    MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_config_defaults returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n    mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_conf_session_cache( &conf, &cache,\n                                   mbedtls_ssl_cache_get,\n                                   mbedtls_ssl_cache_set );\n#endif\n\n    mbedtls_ssl_conf_ca_chain( &conf, srvcert.next, NULL );\n    if( ( ret = mbedtls_ssl_conf_own_cert( &conf, &srvcert, &pkey ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_own_cert returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_setup returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\nreset:\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        mbedtls_printf(\"Last error was: %d - %s\\n\\n\", ret, error_buf );\n    }\n#endif\n\n    mbedtls_net_free( &client_fd );\n\n    mbedtls_ssl_session_reset( &ssl );\n\n    /*\n     * 3. Wait until a client connects\n     */\n    mbedtls_printf( \"  . Waiting for a remote connection ...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_accept( &listen_fd, &client_fd,\n                                    NULL, 0, NULL ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_accept returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_set_bio( &ssl, &client_fd, mbedtls_net_send, mbedtls_net_recv, NULL );\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 5. Handshake\n     */\n    mbedtls_printf( \"  . Performing the SSL/TLS handshake...\" );\n    fflush( stdout );\n\n    while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 )\n    {\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_handshake returned %d\\n\\n\", ret );\n            goto reset;\n        }\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 6. Read the HTTP Request\n     */\n    mbedtls_printf( \"  < Read from client:\" );\n    fflush( stdout );\n\n    do\n    {\n        len = sizeof( buf ) - 1;\n        memset( buf, 0, sizeof( buf ) );\n        ret = mbedtls_ssl_read( &ssl, buf, len );\n\n        if( ret == MBEDTLS_ERR_SSL_WANT_READ || ret == MBEDTLS_ERR_SSL_WANT_WRITE )\n            continue;\n\n        if( ret <= 0 )\n        {\n            switch( ret )\n            {\n                case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:\n                    mbedtls_printf( \" connection was closed gracefully\\n\" );\n                    break;\n\n                case MBEDTLS_ERR_NET_CONN_RESET:\n                    mbedtls_printf( \" connection was reset by peer\\n\" );\n                    break;\n\n                default:\n                    mbedtls_printf( \" mbedtls_ssl_read returned -0x%x\\n\", -ret );\n                    break;\n            }\n\n            break;\n        }\n\n        len = ret;\n        mbedtls_printf( \" %d bytes read\\n\\n%s\", len, (char *) buf );\n\n        if( ret > 0 )\n            break;\n    }\n    while( 1 );\n\n    /*\n     * 7. Write the 200 Response\n     */\n    mbedtls_printf( \"  > Write to client:\" );\n    fflush( stdout );\n\n    len = sprintf( (char *) buf, HTTP_RESPONSE,\n                   mbedtls_ssl_get_ciphersuite( &ssl ) );\n\n    while( ( ret = mbedtls_ssl_write( &ssl, buf, len ) ) <= 0 )\n    {\n        if( ret == MBEDTLS_ERR_NET_CONN_RESET )\n        {\n            mbedtls_printf( \" failed\\n  ! peer closed the connection\\n\\n\" );\n            goto reset;\n        }\n\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_write returned %d\\n\\n\", ret );\n            goto exit;\n        }\n    }\n\n    len = ret;\n    mbedtls_printf( \" %d bytes written\\n\\n%s\\n\", len, (char *) buf );\n\n    mbedtls_printf( \"  . Closing the connection...\" );\n\n    while( ( ret = mbedtls_ssl_close_notify( &ssl ) ) < 0 )\n    {\n        if( ret != MBEDTLS_ERR_SSL_WANT_READ &&\n            ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_close_notify returned %d\\n\\n\", ret );\n            goto reset;\n        }\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    ret = 0;\n    goto reset;\n\nexit:\n\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        mbedtls_printf(\"Last error was: %d - %s\\n\\n\", ret, error_buf );\n    }\n#endif\n\n    mbedtls_net_free( &client_fd );\n    mbedtls_net_free( &listen_fd );\n\n    mbedtls_x509_crt_free( &srvcert );\n    mbedtls_pk_free( &pkey );\n    mbedtls_ssl_free( &ssl );\n    mbedtls_ssl_config_free( &conf );\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_free( &cache );\n#endif\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_CERTS_C && MBEDTLS_ENTROPY_C &&\n          MBEDTLS_SSL_TLS_C && MBEDTLS_SSL_SRV_C && MBEDTLS_NET_C &&\n          MBEDTLS_RSA_C && MBEDTLS_CTR_DRBG_C && MBEDTLS_X509_CRT_PARSE_C\n          && MBEDTLS_FS_IO && MBEDTLS_PEM_PARSE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/ssl/ssl_server2.c",
    "content": "/*\n *  SSL client with options\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_free       free\n#define mbedtls_time       time\n#define mbedtls_time_t     time_t\n#define mbedtls_calloc    calloc\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_ENTROPY_C) || \\\n    !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_SRV_C) || \\\n    !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_SSL_TLS_C and/or MBEDTLS_SSL_SRV_C and/or \"\n           \"MBEDTLS_NET_C and/or MBEDTLS_CTR_DRBG_C and/or not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/certs.h\"\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/error.h\"\n#include \"mbedtls/debug.h\"\n#include \"mbedtls/timing.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdint.h>\n\n#if !defined(_MSC_VER)\n#include <inttypes.h>\n#endif\n\n#if !defined(_WIN32)\n#include <signal.h>\n#endif\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n#include \"mbedtls/ssl_cache.h\"\n#endif\n\n#if defined(MBEDTLS_SSL_TICKET_C)\n#include \"mbedtls/ssl_ticket.h\"\n#endif\n\n#if defined(MBEDTLS_SSL_COOKIE_C)\n#include \"mbedtls/ssl_cookie.h\"\n#endif\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n#include \"mbedtls/memory_buffer_alloc.h\"\n#endif\n\n#if defined(MBEDTLS_SSL_SERVER_NAME_INDICATION) && defined(MBEDTLS_FS_IO)\n#define SNI_OPTION\n#endif\n\n#if defined(_WIN32)\n#include <windows.h>\n#endif\n\n#define DFL_SERVER_ADDR         NULL\n#define DFL_SERVER_PORT         \"4433\"\n#define DFL_DEBUG_LEVEL         0\n#define DFL_NBIO                0\n#define DFL_READ_TIMEOUT        0\n#define DFL_CA_FILE             \"\"\n#define DFL_CA_PATH             \"\"\n#define DFL_CRT_FILE            \"\"\n#define DFL_KEY_FILE            \"\"\n#define DFL_CRT_FILE2           \"\"\n#define DFL_KEY_FILE2           \"\"\n#define DFL_PSK                 \"\"\n#define DFL_PSK_IDENTITY        \"Client_identity\"\n#define DFL_ECJPAKE_PW          NULL\n#define DFL_PSK_LIST            NULL\n#define DFL_FORCE_CIPHER        0\n#define DFL_VERSION_SUITES      NULL\n#define DFL_RENEGOTIATION       MBEDTLS_SSL_RENEGOTIATION_DISABLED\n#define DFL_ALLOW_LEGACY        -2\n#define DFL_RENEGOTIATE         0\n#define DFL_RENEGO_DELAY        -2\n#define DFL_RENEGO_PERIOD       ( (uint64_t)-1 )\n#define DFL_EXCHANGES           1\n#define DFL_MIN_VERSION         -1\n#define DFL_MAX_VERSION         -1\n#define DFL_ARC4                -1\n#define DFL_SHA1                -1\n#define DFL_AUTH_MODE           -1\n#define DFL_CERT_REQ_CA_LIST    MBEDTLS_SSL_CERT_REQ_CA_LIST_ENABLED\n#define DFL_MFL_CODE            MBEDTLS_SSL_MAX_FRAG_LEN_NONE\n#define DFL_TRUNC_HMAC          -1\n#define DFL_TICKETS             MBEDTLS_SSL_SESSION_TICKETS_ENABLED\n#define DFL_TICKET_TIMEOUT      86400\n#define DFL_CACHE_MAX           -1\n#define DFL_CACHE_TIMEOUT       -1\n#define DFL_SNI                 NULL\n#define DFL_ALPN_STRING         NULL\n#define DFL_CURVES              NULL\n#define DFL_DHM_FILE            NULL\n#define DFL_TRANSPORT           MBEDTLS_SSL_TRANSPORT_STREAM\n#define DFL_COOKIES             1\n#define DFL_ANTI_REPLAY         -1\n#define DFL_HS_TO_MIN           0\n#define DFL_HS_TO_MAX           0\n#define DFL_BADMAC_LIMIT        -1\n#define DFL_EXTENDED_MS         -1\n#define DFL_ETM                 -1\n\n#define LONG_RESPONSE \"<p>01-blah-blah-blah-blah-blah-blah-blah-blah-blah\\r\\n\" \\\n    \"02-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\\r\\n\"  \\\n    \"03-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\\r\\n\"  \\\n    \"04-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\\r\\n\"  \\\n    \"05-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\\r\\n\"  \\\n    \"06-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah\\r\\n\"  \\\n    \"07-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah-blah</p>\\r\\n\"\n\n/* Uncomment LONG_RESPONSE at the end of HTTP_RESPONSE to test sending longer\n * packets (for fragmentation purposes) */\n#define HTTP_RESPONSE \\\n    \"HTTP/1.0 200 OK\\r\\nContent-Type: text/html\\r\\n\\r\\n\" \\\n    \"<h2>mbed TLS Test Server</h2>\\r\\n\" \\\n    \"<p>Successful connection using: %s</p>\\r\\n\" // LONG_RESPONSE\n\n/*\n * Size of the basic I/O buffer. Able to hold our default response.\n *\n * You will need to adapt the mbedtls_ssl_get_bytes_avail() test in ssl-opt.sh\n * if you change this value to something outside the range <= 100 or > 500\n */\n#define IO_BUF_LEN      200\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n#if defined(MBEDTLS_FS_IO)\n#define USAGE_IO \\\n    \"    ca_file=%%s          The single file containing the top-level CA(s) you fully trust\\n\" \\\n    \"                        default: \\\"\\\" (pre-loaded)\\n\" \\\n    \"    ca_path=%%s          The path containing the top-level CA(s) you fully trust\\n\" \\\n    \"                        default: \\\"\\\" (pre-loaded) (overrides ca_file)\\n\" \\\n    \"    crt_file=%%s         Your own cert and chain (in bottom to top order, top may be omitted)\\n\" \\\n    \"                        default: see note after key_file2\\n\" \\\n    \"    key_file=%%s         default: see note after key_file2\\n\" \\\n    \"    crt_file2=%%s        Your second cert and chain (in bottom to top order, top may be omitted)\\n\" \\\n    \"                        default: see note after key_file2\\n\" \\\n    \"    key_file2=%%s        default: see note below\\n\" \\\n    \"                        note: if neither crt_file/key_file nor crt_file2/key_file2 are used,\\n\" \\\n    \"                              preloaded certificate(s) and key(s) are used if available\\n\" \\\n    \"    dhm_file=%%s        File containing Diffie-Hellman parameters\\n\" \\\n    \"                       default: preloaded parameters\\n\"\n#else\n#define USAGE_IO \\\n    \"\\n\"                                                    \\\n    \"    No file operations available (MBEDTLS_FS_IO not defined)\\n\" \\\n    \"\\n\"\n#endif /* MBEDTLS_FS_IO */\n#else\n#define USAGE_IO \"\"\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n#define USAGE_PSK                                                   \\\n    \"    psk=%%s              default: \\\"\\\" (in hex, without 0x)\\n\" \\\n    \"    psk_identity=%%s     default: \\\"Client_identity\\\"\\n\"\n#else\n#define USAGE_PSK \"\"\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n#define USAGE_TICKETS                                       \\\n    \"    tickets=%%d          default: 1 (enabled)\\n\"       \\\n    \"    ticket_timeout=%%d   default: 86400 (one day)\\n\"\n#else\n#define USAGE_TICKETS \"\"\n#endif /* MBEDTLS_SSL_SESSION_TICKETS */\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n#define USAGE_CACHE                                             \\\n    \"    cache_max=%%d        default: cache default (50)\\n\"    \\\n    \"    cache_timeout=%%d    default: cache default (1d)\\n\"\n#else\n#define USAGE_CACHE \"\"\n#endif /* MBEDTLS_SSL_CACHE_C */\n\n#if defined(SNI_OPTION)\n#define USAGE_SNI                                                           \\\n    \"    sni=%%s              name1,cert1,key1,ca1,crl1,auth1[,...]\\n\"  \\\n    \"                        default: disabled\\n\"\n#else\n#define USAGE_SNI \"\"\n#endif /* SNI_OPTION */\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n#define USAGE_MAX_FRAG_LEN                                      \\\n    \"    max_frag_len=%%d     default: 16384 (tls default)\\n\"   \\\n    \"                        options: 512, 1024, 2048, 4096\\n\"\n#else\n#define USAGE_MAX_FRAG_LEN \"\"\n#endif /* MBEDTLS_SSL_MAX_FRAGMENT_LENGTH */\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n#define USAGE_TRUNC_HMAC \\\n    \"    trunc_hmac=%%d       default: library default\\n\"\n#else\n#define USAGE_TRUNC_HMAC \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_ALPN)\n#define USAGE_ALPN \\\n    \"    alpn=%%s             default: \\\"\\\" (disabled)\\n\"   \\\n    \"                        example: spdy/1,http/1.1\\n\"\n#else\n#define USAGE_ALPN \"\"\n#endif /* MBEDTLS_SSL_ALPN */\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)\n#define USAGE_COOKIES \\\n    \"    cookies=0/1/-1      default: 1 (enabled)\\n\"        \\\n    \"                        0: disabled, -1: library default (broken)\\n\"\n#else\n#define USAGE_COOKIES \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n#define USAGE_ANTI_REPLAY \\\n    \"    anti_replay=0/1     default: (library default: enabled)\\n\"\n#else\n#define USAGE_ANTI_REPLAY \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)\n#define USAGE_BADMAC_LIMIT \\\n    \"    badmac_limit=%%d     default: (library default: disabled)\\n\"\n#else\n#define USAGE_BADMAC_LIMIT \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n#define USAGE_DTLS \\\n    \"    dtls=%%d             default: 0 (TLS)\\n\"                           \\\n    \"    hs_timeout=%%d-%%d    default: (library default: 1000-60000)\\n\"    \\\n    \"                        range of DTLS handshake timeouts in millisecs\\n\"\n#else\n#define USAGE_DTLS \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n#define USAGE_EMS \\\n    \"    extended_ms=0/1     default: (library default: on)\\n\"\n#else\n#define USAGE_EMS \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n#define USAGE_ETM \\\n    \"    etm=0/1             default: (library default: on)\\n\"\n#else\n#define USAGE_ETM \"\"\n#endif\n\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n#define USAGE_RENEGO \\\n    \"    renegotiation=%%d    default: 0 (disabled)\\n\"      \\\n    \"    renegotiate=%%d      default: 0 (disabled)\\n\"      \\\n    \"    renego_delay=%%d     default: -2 (library default)\\n\" \\\n    \"    renego_period=%%d    default: (2^64 - 1 for TLS, 2^48 - 1 for DTLS)\\n\"\n#else\n#define USAGE_RENEGO \"\"\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n#define USAGE_ECJPAKE \\\n    \"    ecjpake_pw=%%s       default: none (disabled)\\n\"\n#else\n#define USAGE_ECJPAKE \"\"\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n#define USAGE_CURVES \\\n    \"    curves=a,b,c,d      default: \\\"default\\\" (library default)\\n\"  \\\n    \"                        example: \\\"secp521r1,brainpoolP512r1\\\"\\n\"  \\\n    \"                        - use \\\"none\\\" for empty list\\n\"           \\\n    \"                        - see mbedtls_ecp_curve_list()\\n\"          \\\n    \"                          for acceptable curve names\\n\"\n#else\n#define USAGE_CURVES \"\"\n#endif\n\n#define USAGE \\\n    \"\\n usage: ssl_server2 param=<>...\\n\"                   \\\n    \"\\n acceptable parameters:\\n\"                           \\\n    \"    server_addr=%%d      default: (all interfaces)\\n\"  \\\n    \"    server_port=%%d      default: 4433\\n\"              \\\n    \"    debug_level=%%d      default: 0 (disabled)\\n\"      \\\n    \"    nbio=%%d             default: 0 (blocking I/O)\\n\"  \\\n    \"                        options: 1 (non-blocking), 2 (added delays)\\n\" \\\n    \"    read_timeout=%%d     default: 0 ms (no timeout)\\n\"    \\\n    \"\\n\"                                                    \\\n    USAGE_DTLS                                              \\\n    USAGE_COOKIES                                           \\\n    USAGE_ANTI_REPLAY                                       \\\n    USAGE_BADMAC_LIMIT                                      \\\n    \"\\n\"                                                    \\\n    \"    auth_mode=%%s        default: (library default: none)\\n\"      \\\n    \"                        options: none, optional, required\\n\" \\\n    \"    cert_req_ca_list=%%d default: 1 (send ca list)\\n\"  \\\n    \"                        options: 1 (send ca list), 0 (don't send)\\n\" \\\n    USAGE_IO                                                \\\n    USAGE_SNI                                               \\\n    \"\\n\"                                                    \\\n    USAGE_PSK                                               \\\n    USAGE_ECJPAKE                                           \\\n    \"\\n\"                                                    \\\n    \"    allow_legacy=%%d     default: (library default: no)\\n\"      \\\n    USAGE_RENEGO                                            \\\n    \"    exchanges=%%d        default: 1\\n\"                 \\\n    \"\\n\"                                                    \\\n    USAGE_TICKETS                                           \\\n    USAGE_CACHE                                             \\\n    USAGE_MAX_FRAG_LEN                                      \\\n    USAGE_TRUNC_HMAC                                        \\\n    USAGE_ALPN                                              \\\n    USAGE_EMS                                               \\\n    USAGE_ETM                                               \\\n    USAGE_CURVES                                            \\\n    \"\\n\"                                                    \\\n    \"    arc4=%%d             default: (library default: 0)\\n\" \\\n    \"    allow_sha1=%%d       default: 0\\n\"                             \\\n    \"    min_version=%%s      default: (library default: tls1)\\n\"       \\\n    \"    max_version=%%s      default: (library default: tls1_2)\\n\"     \\\n    \"    force_version=%%s    default: \\\"\\\" (none)\\n\"       \\\n    \"                        options: ssl3, tls1, tls1_1, tls1_2, dtls1, dtls1_2\\n\" \\\n    \"\\n\"                                                                \\\n    \"    version_suites=a,b,c,d      per-version ciphersuites\\n\"        \\\n    \"                                in order from ssl3 to tls1_2\\n\"    \\\n    \"                                default: all enabled\\n\"            \\\n    \"    force_ciphersuite=<name>    default: all enabled\\n\"            \\\n    \" acceptable ciphersuite names:\\n\"\n\n\n#define ALPN_LIST_SIZE  10\n#define CURVE_LIST_SIZE 20\n\n#define PUT_UINT64_BE(out_be,in_le,i)                                   \\\n{                                                                       \\\n    (out_be)[(i) + 0] = (unsigned char)( ( (in_le) >> 56 ) & 0xFF );    \\\n    (out_be)[(i) + 1] = (unsigned char)( ( (in_le) >> 48 ) & 0xFF );    \\\n    (out_be)[(i) + 2] = (unsigned char)( ( (in_le) >> 40 ) & 0xFF );    \\\n    (out_be)[(i) + 3] = (unsigned char)( ( (in_le) >> 32 ) & 0xFF );    \\\n    (out_be)[(i) + 4] = (unsigned char)( ( (in_le) >> 24 ) & 0xFF );    \\\n    (out_be)[(i) + 5] = (unsigned char)( ( (in_le) >> 16 ) & 0xFF );    \\\n    (out_be)[(i) + 6] = (unsigned char)( ( (in_le) >> 8  ) & 0xFF );    \\\n    (out_be)[(i) + 7] = (unsigned char)( ( (in_le) >> 0  ) & 0xFF );    \\\n}\n\n/*\n * global options\n */\nstruct options\n{\n    const char *server_addr;    /* address on which the ssl service runs    */\n    const char *server_port;    /* port on which the ssl service runs       */\n    int debug_level;            /* level of debugging                       */\n    int nbio;                   /* should I/O be blocking?                  */\n    uint32_t read_timeout;      /* timeout on mbedtls_ssl_read() in milliseconds    */\n    const char *ca_file;        /* the file with the CA certificate(s)      */\n    const char *ca_path;        /* the path with the CA certificate(s) reside */\n    const char *crt_file;       /* the file with the server certificate     */\n    const char *key_file;       /* the file with the server key             */\n    const char *crt_file2;      /* the file with the 2nd server certificate */\n    const char *key_file2;      /* the file with the 2nd server key         */\n    const char *psk;            /* the pre-shared key                       */\n    const char *psk_identity;   /* the pre-shared key identity              */\n    char *psk_list;             /* list of PSK id/key pairs for callback    */\n    const char *ecjpake_pw;     /* the EC J-PAKE password                   */\n    int force_ciphersuite[2];   /* protocol/ciphersuite to use, or all      */\n    const char *version_suites; /* per-version ciphersuites                 */\n    int renegotiation;          /* enable / disable renegotiation           */\n    int allow_legacy;           /* allow legacy renegotiation               */\n    int renegotiate;            /* attempt renegotiation?                   */\n    int renego_delay;           /* delay before enforcing renegotiation     */\n    uint64_t renego_period;     /* period for automatic renegotiation       */\n    int exchanges;              /* number of data exchanges                 */\n    int min_version;            /* minimum protocol version accepted        */\n    int max_version;            /* maximum protocol version accepted        */\n    int arc4;                   /* flag for arc4 suites support             */\n    int allow_sha1;             /* flag for SHA-1 support                   */\n    int auth_mode;              /* verify mode for connection               */\n    int cert_req_ca_list;       /* should we send the CA list?              */\n    unsigned char mfl_code;     /* code for maximum fragment length         */\n    int trunc_hmac;             /* accept truncated hmac?                   */\n    int tickets;                /* enable / disable session tickets         */\n    int ticket_timeout;         /* session ticket lifetime                  */\n    int cache_max;              /* max number of session cache entries      */\n    int cache_timeout;          /* expiration delay of session cache entries */\n    char *sni;                  /* string describing sni information        */\n    const char *curves;         /* list of supported elliptic curves        */\n    const char *alpn_string;    /* ALPN supported protocols                 */\n    const char *dhm_file;       /* the file with the DH parameters          */\n    int extended_ms;            /* allow negotiation of extended MS?        */\n    int etm;                    /* allow negotiation of encrypt-then-MAC?   */\n    int transport;              /* TLS or DTLS?                             */\n    int cookies;                /* Use cookies for DTLS? -1 to break them   */\n    int anti_replay;            /* Use anti-replay for DTLS? -1 for default */\n    uint32_t hs_to_min;         /* Initial value of DTLS handshake timer    */\n    uint32_t hs_to_max;         /* Max value of DTLS handshake timer        */\n    int badmac_limit;           /* Limit of records with bad MAC            */\n} opt;\n\nstatic void my_debug( void *ctx, int level,\n                      const char *file, int line,\n                      const char *str )\n{\n    const char *p, *basename;\n\n    /* Extract basename from file */\n    for( p = basename = file; *p != '\\0'; p++ )\n        if( *p == '/' || *p == '\\\\' )\n            basename = p + 1;\n\n    mbedtls_fprintf( (FILE *) ctx, \"%s:%04d: |%d| %s\", basename, line, level, str );\n    fflush(  (FILE *) ctx  );\n}\n\n/*\n * Test recv/send functions that make sure each try returns\n * WANT_READ/WANT_WRITE at least once before sucesseding\n */\nstatic int my_recv( void *ctx, unsigned char *buf, size_t len )\n{\n    static int first_try = 1;\n    int ret;\n\n    if( first_try )\n    {\n        first_try = 0;\n        return( MBEDTLS_ERR_SSL_WANT_READ );\n    }\n\n    ret = mbedtls_net_recv( ctx, buf, len );\n    if( ret != MBEDTLS_ERR_SSL_WANT_READ )\n        first_try = 1; /* Next call will be a new operation */\n    return( ret );\n}\n\nstatic int my_send( void *ctx, const unsigned char *buf, size_t len )\n{\n    static int first_try = 1;\n    int ret;\n\n    if( first_try )\n    {\n        first_try = 0;\n        return( MBEDTLS_ERR_SSL_WANT_WRITE );\n    }\n\n    ret = mbedtls_net_send( ctx, buf, len );\n    if( ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n        first_try = 1; /* Next call will be a new operation */\n    return( ret );\n}\n\n/*\n * Return authmode from string, or -1 on error\n */\nstatic int get_auth_mode( const char *s )\n{\n    if( strcmp( s, \"none\" ) == 0 )\n        return( MBEDTLS_SSL_VERIFY_NONE );\n    if( strcmp( s, \"optional\" ) == 0 )\n        return( MBEDTLS_SSL_VERIFY_OPTIONAL );\n    if( strcmp( s, \"required\" ) == 0 )\n        return( MBEDTLS_SSL_VERIFY_REQUIRED );\n\n    return( -1 );\n}\n\n/*\n * Used by sni_parse and psk_parse to handle coma-separated lists\n */\n#define GET_ITEM( dst )         \\\n    dst = p;                    \\\n    while( *p != ',' )          \\\n        if( ++p > end )         \\\n            goto error;         \\\n    *p++ = '\\0';\n\n#if defined(SNI_OPTION)\ntypedef struct _sni_entry sni_entry;\n\nstruct _sni_entry {\n    const char *name;\n    mbedtls_x509_crt *cert;\n    mbedtls_pk_context *key;\n    mbedtls_x509_crt* ca;\n    mbedtls_x509_crl* crl;\n    int authmode;\n    sni_entry *next;\n};\n\nvoid sni_free( sni_entry *head )\n{\n    sni_entry *cur = head, *next;\n\n    while( cur != NULL )\n    {\n        mbedtls_x509_crt_free( cur->cert );\n        mbedtls_free( cur->cert );\n\n        mbedtls_pk_free( cur->key );\n        mbedtls_free( cur->key );\n\n        mbedtls_x509_crt_free( cur->ca );\n        mbedtls_free( cur->ca );\n\n        mbedtls_x509_crl_free( cur->crl );\n        mbedtls_free( cur->crl );\n\n        next = cur->next;\n        mbedtls_free( cur );\n        cur = next;\n    }\n}\n\n/*\n * Parse a string of sextuples name1,crt1,key1,ca1,crl1,auth1[,...]\n * into a usable sni_entry list. For ca1, crl1, auth1, the special value\n * '-' means unset. If ca1 is unset, then crl1 is ignored too.\n *\n * Modifies the input string! This is not production quality!\n */\nsni_entry *sni_parse( char *sni_string )\n{\n    sni_entry *cur = NULL, *new = NULL;\n    char *p = sni_string;\n    char *end = p;\n    char *crt_file, *key_file, *ca_file, *crl_file, *auth_str;\n\n    while( *end != '\\0' )\n        ++end;\n    *end = ',';\n\n    while( p <= end )\n    {\n        if( ( new = mbedtls_calloc( 1, sizeof( sni_entry ) ) ) == NULL )\n        {\n            sni_free( cur );\n            return( NULL );\n        }\n\n        GET_ITEM( new->name );\n        GET_ITEM( crt_file );\n        GET_ITEM( key_file );\n        GET_ITEM( ca_file );\n        GET_ITEM( crl_file );\n        GET_ITEM( auth_str );\n\n        if( ( new->cert = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) ) ) == NULL ||\n            ( new->key = mbedtls_calloc( 1, sizeof( mbedtls_pk_context ) ) ) == NULL )\n            goto error;\n\n        mbedtls_x509_crt_init( new->cert );\n        mbedtls_pk_init( new->key );\n\n        if( mbedtls_x509_crt_parse_file( new->cert, crt_file ) != 0 ||\n            mbedtls_pk_parse_keyfile( new->key, key_file, \"\" ) != 0 )\n            goto error;\n\n        if( strcmp( ca_file, \"-\" ) != 0 )\n        {\n            if( ( new->ca = mbedtls_calloc( 1, sizeof( mbedtls_x509_crt ) ) ) == NULL )\n                goto error;\n\n            mbedtls_x509_crt_init( new->ca );\n\n            if( mbedtls_x509_crt_parse_file( new->ca, ca_file ) != 0 )\n                goto error;\n        }\n\n        if( strcmp( crl_file, \"-\" ) != 0 )\n        {\n            if( ( new->crl = mbedtls_calloc( 1, sizeof( mbedtls_x509_crl ) ) ) == NULL )\n                goto error;\n\n            mbedtls_x509_crl_init( new->crl );\n\n            if( mbedtls_x509_crl_parse_file( new->crl, crl_file ) != 0 )\n                goto error;\n        }\n\n        if( strcmp( auth_str, \"-\" ) != 0 )\n        {\n            if( ( new->authmode = get_auth_mode( auth_str ) ) < 0 )\n                goto error;\n        }\n        else\n            new->authmode = DFL_AUTH_MODE;\n\n        new->next = cur;\n        cur = new;\n    }\n\n    return( cur );\n\nerror:\n    sni_free( new );\n    sni_free( cur );\n    return( NULL );\n}\n\n/*\n * SNI callback.\n */\nint sni_callback( void *p_info, mbedtls_ssl_context *ssl,\n                  const unsigned char *name, size_t name_len )\n{\n    const sni_entry *cur = (const sni_entry *) p_info;\n\n    while( cur != NULL )\n    {\n        if( name_len == strlen( cur->name ) &&\n            memcmp( name, cur->name, name_len ) == 0 )\n        {\n            if( cur->ca != NULL )\n                mbedtls_ssl_set_hs_ca_chain( ssl, cur->ca, cur->crl );\n\n            if( cur->authmode != DFL_AUTH_MODE )\n                mbedtls_ssl_set_hs_authmode( ssl, cur->authmode );\n\n            return( mbedtls_ssl_set_hs_own_cert( ssl, cur->cert, cur->key ) );\n        }\n\n        cur = cur->next;\n    }\n\n    return( -1 );\n}\n\n#endif /* SNI_OPTION */\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n\n#define HEX2NUM( c )                    \\\n        if( c >= '0' && c <= '9' )      \\\n            c -= '0';                   \\\n        else if( c >= 'a' && c <= 'f' ) \\\n            c -= 'a' - 10;              \\\n        else if( c >= 'A' && c <= 'F' ) \\\n            c -= 'A' - 10;              \\\n        else                            \\\n            return( -1 );\n\n/*\n * Convert a hex string to bytes.\n * Return 0 on success, -1 on error.\n */\nint unhexify( unsigned char *output, const char *input, size_t *olen )\n{\n    unsigned char c;\n    size_t j;\n\n    *olen = strlen( input );\n    if( *olen % 2 != 0 || *olen / 2 > MBEDTLS_PSK_MAX_LEN )\n        return( -1 );\n    *olen /= 2;\n\n    for( j = 0; j < *olen * 2; j += 2 )\n    {\n        c = input[j];\n        HEX2NUM( c );\n        output[ j / 2 ] = c << 4;\n\n        c = input[j + 1];\n        HEX2NUM( c );\n        output[ j / 2 ] |= c;\n    }\n\n    return( 0 );\n}\n\ntypedef struct _psk_entry psk_entry;\n\nstruct _psk_entry\n{\n    const char *name;\n    size_t key_len;\n    unsigned char key[MBEDTLS_PSK_MAX_LEN];\n    psk_entry *next;\n};\n\n/*\n * Free a list of psk_entry's\n */\nvoid psk_free( psk_entry *head )\n{\n    psk_entry *next;\n\n    while( head != NULL )\n    {\n        next = head->next;\n        mbedtls_free( head );\n        head = next;\n    }\n}\n\n/*\n * Parse a string of pairs name1,key1[,name2,key2[,...]]\n * into a usable psk_entry list.\n *\n * Modifies the input string! This is not production quality!\n */\npsk_entry *psk_parse( char *psk_string )\n{\n    psk_entry *cur = NULL, *new = NULL;\n    char *p = psk_string;\n    char *end = p;\n    char *key_hex;\n\n    while( *end != '\\0' )\n        ++end;\n    *end = ',';\n\n    while( p <= end )\n    {\n        if( ( new = mbedtls_calloc( 1, sizeof( psk_entry ) ) ) == NULL )\n            goto error;\n\n        memset( new, 0, sizeof( psk_entry ) );\n\n        GET_ITEM( new->name );\n        GET_ITEM( key_hex );\n\n        if( unhexify( new->key, key_hex, &new->key_len ) != 0 )\n            goto error;\n\n        new->next = cur;\n        cur = new;\n    }\n\n    return( cur );\n\nerror:\n    psk_free( new );\n    psk_free( cur );\n    return( 0 );\n}\n\n/*\n * PSK callback\n */\nint psk_callback( void *p_info, mbedtls_ssl_context *ssl,\n                  const unsigned char *name, size_t name_len )\n{\n    psk_entry *cur = (psk_entry *) p_info;\n\n    while( cur != NULL )\n    {\n        if( name_len == strlen( cur->name ) &&\n            memcmp( name, cur->name, name_len ) == 0 )\n        {\n            return( mbedtls_ssl_set_hs_psk( ssl, cur->key, cur->key_len ) );\n        }\n\n        cur = cur->next;\n    }\n\n    return( -1 );\n}\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\nstatic mbedtls_net_context listen_fd, client_fd;\n\n/* Interruption handler to ensure clean exit (for valgrind testing) */\n#if !defined(_WIN32)\nstatic int received_sigterm = 0;\nvoid term_handler( int sig )\n{\n    ((void) sig);\n    received_sigterm = 1;\n    mbedtls_net_free( &listen_fd ); /* causes mbedtls_net_accept() to abort */\n    mbedtls_net_free( &client_fd ); /* causes net_read() to abort */\n}\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\nstatic int ssl_sig_hashes_for_test[] = {\n#if defined(MBEDTLS_SHA512_C)\n    MBEDTLS_MD_SHA512,\n    MBEDTLS_MD_SHA384,\n#endif\n#if defined(MBEDTLS_SHA256_C)\n    MBEDTLS_MD_SHA256,\n    MBEDTLS_MD_SHA224,\n#endif\n#if defined(MBEDTLS_SHA1_C)\n    /* Allow SHA-1 as we use it extensively in tests. */\n    MBEDTLS_MD_SHA1,\n#endif\n    MBEDTLS_MD_NONE\n};\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0, len, written, frags, exchanges_left;\n    int version_suites[4][2];\n    unsigned char buf[IO_BUF_LEN];\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    unsigned char psk[MBEDTLS_PSK_MAX_LEN];\n    size_t psk_len = 0;\n    psk_entry *psk_info = NULL;\n#endif\n    const char *pers = \"ssl_server2\";\n    unsigned char client_ip[16] = { 0 };\n    size_t cliip_len;\n#if defined(MBEDTLS_SSL_COOKIE_C)\n    mbedtls_ssl_cookie_ctx cookie_ctx;\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_crt_profile crt_profile_for_test = mbedtls_x509_crt_profile_default;\n#endif\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_context ssl;\n    mbedtls_ssl_config conf;\n#if defined(MBEDTLS_TIMING_C)\n    mbedtls_timing_delay_context timer;\n#endif\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    unsigned char renego_period[8] = { 0 };\n#endif\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    uint32_t flags;\n    mbedtls_x509_crt cacert;\n    mbedtls_x509_crt srvcert;\n    mbedtls_pk_context pkey;\n    mbedtls_x509_crt srvcert2;\n    mbedtls_pk_context pkey2;\n    int key_cert_init = 0, key_cert_init2 = 0;\n#endif\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_FS_IO)\n    mbedtls_dhm_context dhm;\n#endif\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_context cache;\n#endif\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    mbedtls_ssl_ticket_context ticket_ctx;\n#endif\n#if defined(SNI_OPTION)\n    sni_entry *sni_info = NULL;\n#endif\n#if defined(MBEDTLS_ECP_C)\n    mbedtls_ecp_group_id curve_list[CURVE_LIST_SIZE];\n    const mbedtls_ecp_curve_info * curve_cur;\n#endif\n#if defined(MBEDTLS_SSL_ALPN)\n    const char *alpn_list[ALPN_LIST_SIZE];\n#endif\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    unsigned char alloc_buf[100000];\n#endif\n\n    int i;\n    char *p, *q;\n    const int *list;\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    mbedtls_memory_buffer_alloc_init( alloc_buf, sizeof(alloc_buf) );\n#endif\n\n    /*\n     * Make sure memory references are valid in case we exit early.\n     */\n    mbedtls_net_init( &client_fd );\n    mbedtls_net_init( &listen_fd );\n    mbedtls_ssl_init( &ssl );\n    mbedtls_ssl_config_init( &conf );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_crt_init( &cacert );\n    mbedtls_x509_crt_init( &srvcert );\n    mbedtls_pk_init( &pkey );\n    mbedtls_x509_crt_init( &srvcert2 );\n    mbedtls_pk_init( &pkey2 );\n#endif\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_FS_IO)\n    mbedtls_dhm_init( &dhm );\n#endif\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_init( &cache );\n#endif\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    mbedtls_ssl_ticket_init( &ticket_ctx );\n#endif\n#if defined(MBEDTLS_SSL_ALPN)\n    memset( (void *) alpn_list, 0, sizeof( alpn_list ) );\n#endif\n#if defined(MBEDTLS_SSL_COOKIE_C)\n    mbedtls_ssl_cookie_init( &cookie_ctx );\n#endif\n\n#if !defined(_WIN32)\n    /* Abort cleanly on SIGTERM and SIGINT */\n    signal( SIGTERM, term_handler );\n    signal( SIGINT, term_handler );\n#endif\n\n    if( argc == 0 )\n    {\n    usage:\n        if( ret == 0 )\n            ret = 1;\n\n        mbedtls_printf( USAGE );\n\n        list = mbedtls_ssl_list_ciphersuites();\n        while( *list )\n        {\n            mbedtls_printf(\" %-42s\", mbedtls_ssl_get_ciphersuite_name( *list ) );\n            list++;\n            if( !*list )\n                break;\n            mbedtls_printf(\" %s\\n\", mbedtls_ssl_get_ciphersuite_name( *list ) );\n            list++;\n        }\n        mbedtls_printf(\"\\n\");\n        goto exit;\n    }\n\n    opt.server_addr         = DFL_SERVER_ADDR;\n    opt.server_port         = DFL_SERVER_PORT;\n    opt.debug_level         = DFL_DEBUG_LEVEL;\n    opt.nbio                = DFL_NBIO;\n    opt.read_timeout        = DFL_READ_TIMEOUT;\n    opt.ca_file             = DFL_CA_FILE;\n    opt.ca_path             = DFL_CA_PATH;\n    opt.crt_file            = DFL_CRT_FILE;\n    opt.key_file            = DFL_KEY_FILE;\n    opt.crt_file2           = DFL_CRT_FILE2;\n    opt.key_file2           = DFL_KEY_FILE2;\n    opt.psk                 = DFL_PSK;\n    opt.psk_identity        = DFL_PSK_IDENTITY;\n    opt.psk_list            = DFL_PSK_LIST;\n    opt.ecjpake_pw          = DFL_ECJPAKE_PW;\n    opt.force_ciphersuite[0]= DFL_FORCE_CIPHER;\n    opt.version_suites      = DFL_VERSION_SUITES;\n    opt.renegotiation       = DFL_RENEGOTIATION;\n    opt.allow_legacy        = DFL_ALLOW_LEGACY;\n    opt.renegotiate         = DFL_RENEGOTIATE;\n    opt.renego_delay        = DFL_RENEGO_DELAY;\n    opt.renego_period       = DFL_RENEGO_PERIOD;\n    opt.exchanges           = DFL_EXCHANGES;\n    opt.min_version         = DFL_MIN_VERSION;\n    opt.max_version         = DFL_MAX_VERSION;\n    opt.arc4                = DFL_ARC4;\n    opt.allow_sha1          = DFL_SHA1;\n    opt.auth_mode           = DFL_AUTH_MODE;\n    opt.cert_req_ca_list    = DFL_CERT_REQ_CA_LIST;\n    opt.mfl_code            = DFL_MFL_CODE;\n    opt.trunc_hmac          = DFL_TRUNC_HMAC;\n    opt.tickets             = DFL_TICKETS;\n    opt.ticket_timeout      = DFL_TICKET_TIMEOUT;\n    opt.cache_max           = DFL_CACHE_MAX;\n    opt.cache_timeout       = DFL_CACHE_TIMEOUT;\n    opt.sni                 = DFL_SNI;\n    opt.alpn_string         = DFL_ALPN_STRING;\n    opt.curves              = DFL_CURVES;\n    opt.dhm_file            = DFL_DHM_FILE;\n    opt.transport           = DFL_TRANSPORT;\n    opt.cookies             = DFL_COOKIES;\n    opt.anti_replay         = DFL_ANTI_REPLAY;\n    opt.hs_to_min           = DFL_HS_TO_MIN;\n    opt.hs_to_max           = DFL_HS_TO_MAX;\n    opt.badmac_limit        = DFL_BADMAC_LIMIT;\n    opt.extended_ms         = DFL_EXTENDED_MS;\n    opt.etm                 = DFL_ETM;\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"server_port\" ) == 0 )\n            opt.server_port = q;\n        else if( strcmp( p, \"server_addr\" ) == 0 )\n            opt.server_addr = q;\n        else if( strcmp( p, \"dtls\" ) == 0 )\n        {\n            int t = atoi( q );\n            if( t == 0 )\n                opt.transport = MBEDTLS_SSL_TRANSPORT_STREAM;\n            else if( t == 1 )\n                opt.transport = MBEDTLS_SSL_TRANSPORT_DATAGRAM;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"debug_level\" ) == 0 )\n        {\n            opt.debug_level = atoi( q );\n            if( opt.debug_level < 0 || opt.debug_level > 65535 )\n                goto usage;\n        }\n        else if( strcmp( p, \"nbio\" ) == 0 )\n        {\n            opt.nbio = atoi( q );\n            if( opt.nbio < 0 || opt.nbio > 2 )\n                goto usage;\n        }\n        else if( strcmp( p, \"read_timeout\" ) == 0 )\n            opt.read_timeout = atoi( q );\n        else if( strcmp( p, \"ca_file\" ) == 0 )\n            opt.ca_file = q;\n        else if( strcmp( p, \"ca_path\" ) == 0 )\n            opt.ca_path = q;\n        else if( strcmp( p, \"crt_file\" ) == 0 )\n            opt.crt_file = q;\n        else if( strcmp( p, \"key_file\" ) == 0 )\n            opt.key_file = q;\n        else if( strcmp( p, \"crt_file2\" ) == 0 )\n            opt.crt_file2 = q;\n        else if( strcmp( p, \"key_file2\" ) == 0 )\n            opt.key_file2 = q;\n        else if( strcmp( p, \"dhm_file\" ) == 0 )\n            opt.dhm_file = q;\n        else if( strcmp( p, \"psk\" ) == 0 )\n            opt.psk = q;\n        else if( strcmp( p, \"psk_identity\" ) == 0 )\n            opt.psk_identity = q;\n        else if( strcmp( p, \"psk_list\" ) == 0 )\n            opt.psk_list = q;\n        else if( strcmp( p, \"ecjpake_pw\" ) == 0 )\n            opt.ecjpake_pw = q;\n        else if( strcmp( p, \"force_ciphersuite\" ) == 0 )\n        {\n            opt.force_ciphersuite[0] = mbedtls_ssl_get_ciphersuite_id( q );\n\n            if( opt.force_ciphersuite[0] == 0 )\n            {\n                ret = 2;\n                goto usage;\n            }\n            opt.force_ciphersuite[1] = 0;\n        }\n        else if( strcmp( p, \"curves\" ) == 0 )\n            opt.curves = q;\n        else if( strcmp( p, \"version_suites\" ) == 0 )\n            opt.version_suites = q;\n        else if( strcmp( p, \"renegotiation\" ) == 0 )\n        {\n            opt.renegotiation = (atoi( q )) ? MBEDTLS_SSL_RENEGOTIATION_ENABLED :\n                                              MBEDTLS_SSL_RENEGOTIATION_DISABLED;\n        }\n        else if( strcmp( p, \"allow_legacy\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case -1: opt.allow_legacy = MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE; break;\n                case 0:  opt.allow_legacy = MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION; break;\n                case 1:  opt.allow_legacy = MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION; break;\n                default: goto usage;\n            }\n        }\n        else if( strcmp( p, \"renegotiate\" ) == 0 )\n        {\n            opt.renegotiate = atoi( q );\n            if( opt.renegotiate < 0 || opt.renegotiate > 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"renego_delay\" ) == 0 )\n        {\n            opt.renego_delay = atoi( q );\n        }\n        else if( strcmp( p, \"renego_period\" ) == 0 )\n        {\n#if defined(_MSC_VER)\n            opt.renego_period = _strtoui64( q, NULL, 10 );\n#else\n            if( sscanf( q, \"%\" SCNu64, &opt.renego_period ) != 1 )\n                goto usage;\n#endif /* _MSC_VER */\n            if( opt.renego_period < 2 )\n                goto usage;\n        }\n        else if( strcmp( p, \"exchanges\" ) == 0 )\n        {\n            opt.exchanges = atoi( q );\n            if( opt.exchanges < 0 )\n                goto usage;\n        }\n        else if( strcmp( p, \"min_version\" ) == 0 )\n        {\n            if( strcmp( q, \"ssl3\" ) == 0 )\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_0;\n            else if( strcmp( q, \"tls1\" ) == 0 )\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_1;\n            else if( strcmp( q, \"tls1_1\" ) == 0 ||\n                     strcmp( q, \"dtls1\" ) == 0 )\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_2;\n            else if( strcmp( q, \"tls1_2\" ) == 0 ||\n                     strcmp( q, \"dtls1_2\" ) == 0 )\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_3;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"max_version\" ) == 0 )\n        {\n            if( strcmp( q, \"ssl3\" ) == 0 )\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_0;\n            else if( strcmp( q, \"tls1\" ) == 0 )\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_1;\n            else if( strcmp( q, \"tls1_1\" ) == 0 ||\n                     strcmp( q, \"dtls1\" ) == 0 )\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_2;\n            else if( strcmp( q, \"tls1_2\" ) == 0 ||\n                     strcmp( q, \"dtls1_2\" ) == 0 )\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_3;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"arc4\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0:     opt.arc4 = MBEDTLS_SSL_ARC4_DISABLED;   break;\n                case 1:     opt.arc4 = MBEDTLS_SSL_ARC4_ENABLED;    break;\n                default:    goto usage;\n            }\n        }\n        else if( strcmp( p, \"allow_sha1\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0:     opt.allow_sha1 = 0;   break;\n                case 1:     opt.allow_sha1 = 1;    break;\n                default:    goto usage;\n            }\n        }\n        else if( strcmp( p, \"force_version\" ) == 0 )\n        {\n            if( strcmp( q, \"ssl3\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_0;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_0;\n            }\n            else if( strcmp( q, \"tls1\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_1;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_1;\n            }\n            else if( strcmp( q, \"tls1_1\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_2;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_2;\n            }\n            else if( strcmp( q, \"tls1_2\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_3;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_3;\n            }\n            else if( strcmp( q, \"dtls1\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_2;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_2;\n                opt.transport = MBEDTLS_SSL_TRANSPORT_DATAGRAM;\n            }\n            else if( strcmp( q, \"dtls1_2\" ) == 0 )\n            {\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_3;\n                opt.max_version = MBEDTLS_SSL_MINOR_VERSION_3;\n                opt.transport = MBEDTLS_SSL_TRANSPORT_DATAGRAM;\n            }\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"auth_mode\" ) == 0 )\n        {\n            if( ( opt.auth_mode = get_auth_mode( q ) ) < 0 )\n                goto usage;\n        }\n        else if( strcmp( p, \"cert_req_ca_list\" ) == 0 )\n        {\n            opt.cert_req_ca_list = atoi( q );\n            if( opt.cert_req_ca_list < 0 || opt.cert_req_ca_list > 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"max_frag_len\" ) == 0 )\n        {\n            if( strcmp( q, \"512\" ) == 0 )\n                opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_512;\n            else if( strcmp( q, \"1024\" ) == 0 )\n                opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_1024;\n            else if( strcmp( q, \"2048\" ) == 0 )\n                opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_2048;\n            else if( strcmp( q, \"4096\" ) == 0 )\n                opt.mfl_code = MBEDTLS_SSL_MAX_FRAG_LEN_4096;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"alpn\" ) == 0 )\n        {\n            opt.alpn_string = q;\n        }\n        else if( strcmp( p, \"trunc_hmac\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0: opt.trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_DISABLED; break;\n                case 1: opt.trunc_hmac = MBEDTLS_SSL_TRUNC_HMAC_ENABLED; break;\n                default: goto usage;\n            }\n        }\n        else if( strcmp( p, \"extended_ms\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0: opt.extended_ms = MBEDTLS_SSL_EXTENDED_MS_DISABLED; break;\n                case 1: opt.extended_ms = MBEDTLS_SSL_EXTENDED_MS_ENABLED; break;\n                default: goto usage;\n            }\n        }\n        else if( strcmp( p, \"etm\" ) == 0 )\n        {\n            switch( atoi( q ) )\n            {\n                case 0: opt.etm = MBEDTLS_SSL_ETM_DISABLED; break;\n                case 1: opt.etm = MBEDTLS_SSL_ETM_ENABLED; break;\n                default: goto usage;\n            }\n        }\n        else if( strcmp( p, \"tickets\" ) == 0 )\n        {\n            opt.tickets = atoi( q );\n            if( opt.tickets < 0 || opt.tickets > 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"ticket_timeout\" ) == 0 )\n        {\n            opt.ticket_timeout = atoi( q );\n            if( opt.ticket_timeout < 0 )\n                goto usage;\n        }\n        else if( strcmp( p, \"cache_max\" ) == 0 )\n        {\n            opt.cache_max = atoi( q );\n            if( opt.cache_max < 0 )\n                goto usage;\n        }\n        else if( strcmp( p, \"cache_timeout\" ) == 0 )\n        {\n            opt.cache_timeout = atoi( q );\n            if( opt.cache_timeout < 0 )\n                goto usage;\n        }\n        else if( strcmp( p, \"cookies\" ) == 0 )\n        {\n            opt.cookies = atoi( q );\n            if( opt.cookies < -1 || opt.cookies > 1)\n                goto usage;\n        }\n        else if( strcmp( p, \"anti_replay\" ) == 0 )\n        {\n            opt.anti_replay = atoi( q );\n            if( opt.anti_replay < 0 || opt.anti_replay > 1)\n                goto usage;\n        }\n        else if( strcmp( p, \"badmac_limit\" ) == 0 )\n        {\n            opt.badmac_limit = atoi( q );\n            if( opt.badmac_limit < 0 )\n                goto usage;\n        }\n        else if( strcmp( p, \"hs_timeout\" ) == 0 )\n        {\n            if( ( p = strchr( q, '-' ) ) == NULL )\n                goto usage;\n            *p++ = '\\0';\n            opt.hs_to_min = atoi( q );\n            opt.hs_to_max = atoi( p );\n            if( opt.hs_to_min == 0 || opt.hs_to_max < opt.hs_to_min )\n                goto usage;\n        }\n        else if( strcmp( p, \"sni\" ) == 0 )\n        {\n            opt.sni = q;\n        }\n        else\n            goto usage;\n    }\n\n#if defined(MBEDTLS_DEBUG_C)\n    mbedtls_debug_set_threshold( opt.debug_level );\n#endif\n\n    if( opt.force_ciphersuite[0] > 0 )\n    {\n        const mbedtls_ssl_ciphersuite_t *ciphersuite_info;\n        ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( opt.force_ciphersuite[0] );\n\n        if( opt.max_version != -1 &&\n            ciphersuite_info->min_minor_ver > opt.max_version )\n        {\n            mbedtls_printf(\"forced ciphersuite not allowed with this protocol version\\n\");\n            ret = 2;\n            goto usage;\n        }\n        if( opt.min_version != -1 &&\n            ciphersuite_info->max_minor_ver < opt.min_version )\n        {\n            mbedtls_printf(\"forced ciphersuite not allowed with this protocol version\\n\");\n            ret = 2;\n            goto usage;\n        }\n\n        /* If we select a version that's not supported by\n         * this suite, then there will be no common ciphersuite... */\n        if( opt.max_version == -1 ||\n            opt.max_version > ciphersuite_info->max_minor_ver )\n        {\n            opt.max_version = ciphersuite_info->max_minor_ver;\n        }\n        if( opt.min_version < ciphersuite_info->min_minor_ver )\n        {\n            opt.min_version = ciphersuite_info->min_minor_ver;\n            /* DTLS starts with TLS 1.1 */\n            if( opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM &&\n                opt.min_version < MBEDTLS_SSL_MINOR_VERSION_2 )\n                opt.min_version = MBEDTLS_SSL_MINOR_VERSION_2;\n        }\n\n        /* Enable RC4 if needed and not explicitly disabled */\n        if( ciphersuite_info->cipher == MBEDTLS_CIPHER_ARC4_128 )\n        {\n            if( opt.arc4 == MBEDTLS_SSL_ARC4_DISABLED )\n            {\n                mbedtls_printf(\"forced RC4 ciphersuite with RC4 disabled\\n\");\n                ret = 2;\n                goto usage;\n            }\n\n            opt.arc4 = MBEDTLS_SSL_ARC4_ENABLED;\n        }\n    }\n\n    if( opt.version_suites != NULL )\n    {\n        const char *name[4] = { 0 };\n\n        /* Parse 4-element coma-separated list */\n        for( i = 0, p = (char *) opt.version_suites;\n             i < 4 && *p != '\\0';\n             i++ )\n        {\n            name[i] = p;\n\n            /* Terminate the current string and move on to next one */\n            while( *p != ',' && *p != '\\0' )\n                p++;\n            if( *p == ',' )\n                *p++ = '\\0';\n        }\n\n        if( i != 4 )\n        {\n            mbedtls_printf( \"too few values for version_suites\\n\" );\n            ret = 1;\n            goto exit;\n        }\n\n        memset( version_suites, 0, sizeof( version_suites ) );\n\n        /* Get the suites identifiers from their name */\n        for( i = 0; i < 4; i++ )\n        {\n            version_suites[i][0] = mbedtls_ssl_get_ciphersuite_id( name[i] );\n\n            if( version_suites[i][0] == 0 )\n            {\n                mbedtls_printf( \"unknown ciphersuite: '%s'\\n\", name[i] );\n                ret = 2;\n                goto usage;\n            }\n        }\n    }\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    /*\n     * Unhexify the pre-shared key and parse the list if any given\n     */\n    if( unhexify( psk, opt.psk, &psk_len ) != 0 )\n    {\n        mbedtls_printf( \"pre-shared key not valid hex\\n\" );\n        goto exit;\n    }\n\n    if( opt.psk_list != NULL )\n    {\n        if( ( psk_info = psk_parse( opt.psk_list ) ) == NULL )\n        {\n            mbedtls_printf( \"psk_list invalid\" );\n            goto exit;\n        }\n    }\n#endif /* MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED */\n\n#if defined(MBEDTLS_ECP_C)\n    if( opt.curves != NULL )\n    {\n        p = (char *) opt.curves;\n        i = 0;\n\n        if( strcmp( p, \"none\" ) == 0 )\n        {\n            curve_list[0] = MBEDTLS_ECP_DP_NONE;\n        }\n        else if( strcmp( p, \"default\" ) != 0 )\n        {\n            /* Leave room for a final NULL in curve list */\n            while( i < CURVE_LIST_SIZE - 1 && *p != '\\0' )\n            {\n                q = p;\n\n                /* Terminate the current string */\n                while( *p != ',' && *p != '\\0' )\n                    p++;\n                if( *p == ',' )\n                    *p++ = '\\0';\n\n                if( ( curve_cur = mbedtls_ecp_curve_info_from_name( q ) ) != NULL )\n                {\n                    curve_list[i++] = curve_cur->grp_id;\n                }\n                else\n                {\n                    mbedtls_printf( \"unknown curve %s\\n\", q );\n                    mbedtls_printf( \"supported curves: \" );\n                    for( curve_cur = mbedtls_ecp_curve_list();\n                         curve_cur->grp_id != MBEDTLS_ECP_DP_NONE;\n                         curve_cur++ )\n                    {\n                        mbedtls_printf( \"%s \", curve_cur->name );\n                    }\n                    mbedtls_printf( \"\\n\" );\n                    goto exit;\n                }\n            }\n\n            mbedtls_printf(\"Number of curves: %d\\n\", i );\n\n            if( i == CURVE_LIST_SIZE - 1 && *p != '\\0' )\n            {\n                mbedtls_printf( \"curves list too long, maximum %d\",\n                                CURVE_LIST_SIZE - 1  );\n                goto exit;\n            }\n\n            curve_list[i] = MBEDTLS_ECP_DP_NONE;\n        }\n    }\n#endif /* MBEDTLS_ECP_C */\n\n#if defined(MBEDTLS_SSL_ALPN)\n    if( opt.alpn_string != NULL )\n    {\n        p = (char *) opt.alpn_string;\n        i = 0;\n\n        /* Leave room for a final NULL in alpn_list */\n        while( i < ALPN_LIST_SIZE - 1 && *p != '\\0' )\n        {\n            alpn_list[i++] = p;\n\n            /* Terminate the current string and move on to next one */\n            while( *p != ',' && *p != '\\0' )\n                p++;\n            if( *p == ',' )\n                *p++ = '\\0';\n        }\n    }\n#endif /* MBEDTLS_SSL_ALPN */\n\n    /*\n     * 0. Initialize the RNG and the session data\n     */\n    mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned -0x%x\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    /*\n     * 1.1. Load the trusted CA\n     */\n    mbedtls_printf( \"  . Loading the CA root certificate ...\" );\n    fflush( stdout );\n\n#if defined(MBEDTLS_FS_IO)\n    if( strlen( opt.ca_path ) )\n        if( strcmp( opt.ca_path, \"none\" ) == 0 )\n            ret = 0;\n        else\n            ret = mbedtls_x509_crt_parse_path( &cacert, opt.ca_path );\n    else if( strlen( opt.ca_file ) )\n        if( strcmp( opt.ca_file, \"none\" ) == 0 )\n            ret = 0;\n        else\n            ret = mbedtls_x509_crt_parse_file( &cacert, opt.ca_file );\n    else\n#endif\n#if defined(MBEDTLS_CERTS_C)\n        for( i = 0; mbedtls_test_cas[i] != NULL; i++ )\n        {\n            ret = mbedtls_x509_crt_parse( &cacert,\n                                  (const unsigned char *) mbedtls_test_cas[i],\n                                  mbedtls_test_cas_len[i] );\n            if( ret != 0 )\n                break;\n        }\n#else\n    {\n        ret = 1;\n        mbedtls_printf(\"MBEDTLS_CERTS_C not defined.\");\n    }\n#endif\n    if( ret < 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok (%d skipped)\\n\", ret );\n\n    /*\n     * 1.2. Load own certificate and private key\n     */\n    mbedtls_printf( \"  . Loading the server cert. and key...\" );\n    fflush( stdout );\n\n#if defined(MBEDTLS_FS_IO)\n    if( strlen( opt.crt_file ) && strcmp( opt.crt_file, \"none\" ) != 0 )\n    {\n        key_cert_init++;\n        if( ( ret = mbedtls_x509_crt_parse_file( &srvcert, opt.crt_file ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse_file returned -0x%x\\n\\n\",\n                    -ret );\n            goto exit;\n        }\n    }\n    if( strlen( opt.key_file ) && strcmp( opt.key_file, \"none\" ) != 0 )\n    {\n        key_cert_init++;\n        if( ( ret = mbedtls_pk_parse_keyfile( &pkey, opt.key_file, \"\" ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_keyfile returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n    }\n    if( key_cert_init == 1 )\n    {\n        mbedtls_printf( \" failed\\n  !  crt_file without key_file or vice-versa\\n\\n\" );\n        goto exit;\n    }\n\n    if( strlen( opt.crt_file2 ) && strcmp( opt.crt_file2, \"none\" ) != 0 )\n    {\n        key_cert_init2++;\n        if( ( ret = mbedtls_x509_crt_parse_file( &srvcert2, opt.crt_file2 ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse_file(2) returned -0x%x\\n\\n\",\n                    -ret );\n            goto exit;\n        }\n    }\n    if( strlen( opt.key_file2 ) && strcmp( opt.key_file2, \"none\" ) != 0 )\n    {\n        key_cert_init2++;\n        if( ( ret = mbedtls_pk_parse_keyfile( &pkey2, opt.key_file2, \"\" ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_keyfile(2) returned -0x%x\\n\\n\",\n                    -ret );\n            goto exit;\n        }\n    }\n    if( key_cert_init2 == 1 )\n    {\n        mbedtls_printf( \" failed\\n  !  crt_file2 without key_file2 or vice-versa\\n\\n\" );\n        goto exit;\n    }\n#endif\n    if( key_cert_init == 0 &&\n        strcmp( opt.crt_file, \"none\" ) != 0 &&\n        strcmp( opt.key_file, \"none\" ) != 0 &&\n        key_cert_init2 == 0 &&\n        strcmp( opt.crt_file2, \"none\" ) != 0 &&\n        strcmp( opt.key_file2, \"none\" ) != 0 )\n    {\n#if !defined(MBEDTLS_CERTS_C)\n        mbedtls_printf( \"Not certificated or key provided, and \\n\"\n                \"MBEDTLS_CERTS_C not defined!\\n\" );\n        goto exit;\n#else\n#if defined(MBEDTLS_RSA_C)\n        if( ( ret = mbedtls_x509_crt_parse( &srvcert,\n                                    (const unsigned char *) mbedtls_test_srv_crt_rsa,\n                                    mbedtls_test_srv_crt_rsa_len ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n        if( ( ret = mbedtls_pk_parse_key( &pkey,\n                                  (const unsigned char *) mbedtls_test_srv_key_rsa,\n                                  mbedtls_test_srv_key_rsa_len, NULL, 0 ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_key returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n        key_cert_init = 2;\n#endif /* MBEDTLS_RSA_C */\n#if defined(MBEDTLS_ECDSA_C)\n        if( ( ret = mbedtls_x509_crt_parse( &srvcert2,\n                                    (const unsigned char *) mbedtls_test_srv_crt_ec,\n                                    mbedtls_test_srv_crt_ec_len ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  x509_crt_parse2 returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n        if( ( ret = mbedtls_pk_parse_key( &pkey2,\n                                  (const unsigned char *) mbedtls_test_srv_key_ec,\n                                  mbedtls_test_srv_key_ec_len, NULL, 0 ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  pk_parse_key2 returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n        key_cert_init2 = 2;\n#endif /* MBEDTLS_ECDSA_C */\n#endif /* MBEDTLS_CERTS_C */\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_FS_IO)\n    if( opt.dhm_file != NULL )\n    {\n        mbedtls_printf( \"  . Loading DHM parameters...\" );\n        fflush( stdout );\n\n        if( ( ret = mbedtls_dhm_parse_dhmfile( &dhm, opt.dhm_file ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_dhm_parse_dhmfile returned -0x%04X\\n\\n\",\n                     -ret );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n    }\n#endif\n\n#if defined(SNI_OPTION)\n    if( opt.sni != NULL )\n    {\n        mbedtls_printf( \"  . Setting up SNI information...\" );\n        fflush( stdout );\n\n        if( ( sni_info = sni_parse( opt.sni ) ) == NULL )\n        {\n            mbedtls_printf( \" failed\\n\" );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n    }\n#endif /* SNI_OPTION */\n\n    /*\n     * 2. Setup the listening TCP socket\n     */\n    mbedtls_printf( \"  . Bind on %s://%s:%s/ ...\",\n            opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM ? \"tcp\" : \"udp\",\n            opt.server_addr ? opt.server_addr : \"*\",\n            opt.server_port );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_bind( &listen_fd, opt.server_addr, opt.server_port,\n                          opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM ?\n                          MBEDTLS_NET_PROTO_TCP : MBEDTLS_NET_PROTO_UDP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_bind returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 3. Setup stuff\n     */\n    mbedtls_printf( \"  . Setting up the SSL/TLS structure...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_ssl_config_defaults( &conf,\n                    MBEDTLS_SSL_IS_SERVER,\n                    opt.transport,\n                    MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_config_defaults returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    /* The default algorithms profile disables SHA-1, but our tests still\n       rely on it heavily. Hence we allow it here. A real-world server\n       should use the default profile unless there is a good reason not to. */\n    if( opt.allow_sha1 > 0 )\n    {\n        crt_profile_for_test.allowed_mds |= MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA1 );\n        mbedtls_ssl_conf_cert_profile( &conf, &crt_profile_for_test );\n        mbedtls_ssl_conf_sig_hashes( &conf, ssl_sig_hashes_for_test );\n    }\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n    if( opt.auth_mode != DFL_AUTH_MODE )\n        mbedtls_ssl_conf_authmode( &conf, opt.auth_mode );\n\n    if( opt.cert_req_ca_list != DFL_CERT_REQ_CA_LIST )\n        mbedtls_ssl_conf_cert_req_ca_list( &conf, opt.cert_req_ca_list );\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( opt.hs_to_min != DFL_HS_TO_MIN || opt.hs_to_max != DFL_HS_TO_MAX )\n        mbedtls_ssl_conf_handshake_timeout( &conf, opt.hs_to_min, opt.hs_to_max );\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n    if( ( ret = mbedtls_ssl_conf_max_frag_len( &conf, opt.mfl_code ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_max_frag_len returned %d\\n\\n\", ret );\n        goto exit;\n    };\n#endif\n\n#if defined(MBEDTLS_SSL_TRUNCATED_HMAC)\n    if( opt.trunc_hmac != DFL_TRUNC_HMAC )\n        mbedtls_ssl_conf_truncated_hmac( &conf, opt.trunc_hmac );\n#endif\n\n#if defined(MBEDTLS_SSL_EXTENDED_MASTER_SECRET)\n    if( opt.extended_ms != DFL_EXTENDED_MS )\n        mbedtls_ssl_conf_extended_master_secret( &conf, opt.extended_ms );\n#endif\n\n#if defined(MBEDTLS_SSL_ENCRYPT_THEN_MAC)\n    if( opt.etm != DFL_ETM )\n        mbedtls_ssl_conf_encrypt_then_mac( &conf, opt.etm );\n#endif\n\n#if defined(MBEDTLS_SSL_ALPN)\n    if( opt.alpn_string != NULL )\n        if( ( ret = mbedtls_ssl_conf_alpn_protocols( &conf, alpn_list ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_alpn_protocols returned %d\\n\\n\", ret );\n            goto exit;\n        }\n#endif\n\n    mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n    mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n    if( opt.cache_max != -1 )\n        mbedtls_ssl_cache_set_max_entries( &cache, opt.cache_max );\n\n    if( opt.cache_timeout != -1 )\n        mbedtls_ssl_cache_set_timeout( &cache, opt.cache_timeout );\n\n    mbedtls_ssl_conf_session_cache( &conf, &cache,\n                                   mbedtls_ssl_cache_get,\n                                   mbedtls_ssl_cache_set );\n#endif\n\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    if( opt.tickets == MBEDTLS_SSL_SESSION_TICKETS_ENABLED )\n    {\n        if( ( ret = mbedtls_ssl_ticket_setup( &ticket_ctx,\n                        mbedtls_ctr_drbg_random, &ctr_drbg,\n                        MBEDTLS_CIPHER_AES_256_GCM,\n                        opt.ticket_timeout ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_ticket_setup returned %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_ssl_conf_session_tickets_cb( &conf,\n                mbedtls_ssl_ticket_write,\n                mbedtls_ssl_ticket_parse,\n                &ticket_ctx );\n    }\n#endif\n\n#if defined(MBEDTLS_SSL_PROTO_DTLS)\n    if( opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n#if defined(MBEDTLS_SSL_COOKIE_C)\n        if( opt.cookies > 0 )\n        {\n            if( ( ret = mbedtls_ssl_cookie_setup( &cookie_ctx,\n                                          mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n            {\n                mbedtls_printf( \" failed\\n  ! mbedtls_ssl_cookie_setup returned %d\\n\\n\", ret );\n                goto exit;\n            }\n\n            mbedtls_ssl_conf_dtls_cookies( &conf, mbedtls_ssl_cookie_write, mbedtls_ssl_cookie_check,\n                                       &cookie_ctx );\n        }\n        else\n#endif /* MBEDTLS_SSL_COOKIE_C */\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)\n        if( opt.cookies == 0 )\n        {\n            mbedtls_ssl_conf_dtls_cookies( &conf, NULL, NULL, NULL );\n        }\n        else\n#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */\n        {\n            ; /* Nothing to do */\n        }\n\n#if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY)\n        if( opt.anti_replay != DFL_ANTI_REPLAY )\n            mbedtls_ssl_conf_dtls_anti_replay( &conf, opt.anti_replay );\n#endif\n\n#if defined(MBEDTLS_SSL_DTLS_BADMAC_LIMIT)\n        if( opt.badmac_limit != DFL_BADMAC_LIMIT )\n            mbedtls_ssl_conf_dtls_badmac_limit( &conf, opt.badmac_limit );\n#endif\n    }\n#endif /* MBEDTLS_SSL_PROTO_DTLS */\n\n    if( opt.force_ciphersuite[0] != DFL_FORCE_CIPHER )\n        mbedtls_ssl_conf_ciphersuites( &conf, opt.force_ciphersuite );\n\n#if defined(MBEDTLS_ARC4_C)\n    if( opt.arc4 != DFL_ARC4 )\n        mbedtls_ssl_conf_arc4_support( &conf, opt.arc4 );\n#endif\n\n    if( opt.version_suites != NULL )\n    {\n        mbedtls_ssl_conf_ciphersuites_for_version( &conf, version_suites[0],\n                                          MBEDTLS_SSL_MAJOR_VERSION_3,\n                                          MBEDTLS_SSL_MINOR_VERSION_0 );\n        mbedtls_ssl_conf_ciphersuites_for_version( &conf, version_suites[1],\n                                          MBEDTLS_SSL_MAJOR_VERSION_3,\n                                          MBEDTLS_SSL_MINOR_VERSION_1 );\n        mbedtls_ssl_conf_ciphersuites_for_version( &conf, version_suites[2],\n                                          MBEDTLS_SSL_MAJOR_VERSION_3,\n                                          MBEDTLS_SSL_MINOR_VERSION_2 );\n        mbedtls_ssl_conf_ciphersuites_for_version( &conf, version_suites[3],\n                                          MBEDTLS_SSL_MAJOR_VERSION_3,\n                                          MBEDTLS_SSL_MINOR_VERSION_3 );\n    }\n\n    if( opt.allow_legacy != DFL_ALLOW_LEGACY )\n        mbedtls_ssl_conf_legacy_renegotiation( &conf, opt.allow_legacy );\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    mbedtls_ssl_conf_renegotiation( &conf, opt.renegotiation );\n\n    if( opt.renego_delay != DFL_RENEGO_DELAY )\n        mbedtls_ssl_conf_renegotiation_enforced( &conf, opt.renego_delay );\n\n    if( opt.renego_period != DFL_RENEGO_PERIOD )\n    {\n        PUT_UINT64_BE( renego_period, opt.renego_period, 0 );\n        mbedtls_ssl_conf_renegotiation_period( &conf, renego_period );\n    }\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    if( strcmp( opt.ca_path, \"none\" ) != 0 &&\n        strcmp( opt.ca_file, \"none\" ) != 0 )\n    {\n        mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );\n    }\n    if( key_cert_init )\n        if( ( ret = mbedtls_ssl_conf_own_cert( &conf, &srvcert, &pkey ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_own_cert returned %d\\n\\n\", ret );\n            goto exit;\n        }\n    if( key_cert_init2 )\n        if( ( ret = mbedtls_ssl_conf_own_cert( &conf, &srvcert2, &pkey2 ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_conf_own_cert returned %d\\n\\n\", ret );\n            goto exit;\n        }\n#endif\n\n#if defined(SNI_OPTION)\n    if( opt.sni != NULL )\n        mbedtls_ssl_conf_sni( &conf, sni_callback, sni_info );\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n    if( opt.curves != NULL &&\n        strcmp( opt.curves, \"default\" ) != 0 )\n    {\n        mbedtls_ssl_conf_curves( &conf, curve_list );\n    }\n#endif\n\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    if( strlen( opt.psk ) != 0 && strlen( opt.psk_identity ) != 0 )\n    {\n        ret = mbedtls_ssl_conf_psk( &conf, psk, psk_len,\n                           (const unsigned char *) opt.psk_identity,\n                           strlen( opt.psk_identity ) );\n        if( ret != 0 )\n        {\n            mbedtls_printf( \"  failed\\n  mbedtls_ssl_conf_psk returned -0x%04X\\n\\n\", - ret );\n            goto exit;\n        }\n    }\n\n    if( opt.psk_list != NULL )\n        mbedtls_ssl_conf_psk_cb( &conf, psk_callback, psk_info );\n#endif\n\n#if defined(MBEDTLS_DHM_C)\n    /*\n     * Use different group than default DHM group\n     */\n#if defined(MBEDTLS_FS_IO)\n    if( opt.dhm_file != NULL )\n        ret = mbedtls_ssl_conf_dh_param_ctx( &conf, &dhm );\n#endif\n    if( ret != 0 )\n    {\n        mbedtls_printf( \"  failed\\n  mbedtls_ssl_conf_dh_param returned -0x%04X\\n\\n\", - ret );\n        goto exit;\n    }\n#endif\n\n    if( opt.min_version != DFL_MIN_VERSION )\n        mbedtls_ssl_conf_min_version( &conf, MBEDTLS_SSL_MAJOR_VERSION_3, opt.min_version );\n\n    if( opt.max_version != DFL_MIN_VERSION )\n        mbedtls_ssl_conf_max_version( &conf, MBEDTLS_SSL_MAJOR_VERSION_3, opt.max_version );\n\n    if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_setup returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    if( opt.nbio == 2 )\n        mbedtls_ssl_set_bio( &ssl, &client_fd, my_send, my_recv, NULL );\n    else\n        mbedtls_ssl_set_bio( &ssl, &client_fd, mbedtls_net_send, mbedtls_net_recv,\n                             opt.nbio == 0 ? mbedtls_net_recv_timeout : NULL );\n\n#if defined(MBEDTLS_TIMING_C)\n    mbedtls_ssl_set_timer_cb( &ssl, &timer, mbedtls_timing_set_delay,\n                                            mbedtls_timing_get_delay );\n#endif\n\n    mbedtls_printf( \" ok\\n\" );\n\nreset:\n#if !defined(_WIN32)\n    if( received_sigterm )\n    {\n        mbedtls_printf( \" interrupted by SIGTERM\\n\" );\n        ret = 0;\n        goto exit;\n    }\n#endif\n\n    if( ret == MBEDTLS_ERR_SSL_CLIENT_RECONNECT )\n    {\n        mbedtls_printf( \"  ! Client initiated reconnection from same port\\n\" );\n        goto handshake;\n    }\n\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        mbedtls_printf(\"Last error was: %d - %s\\n\\n\", ret, error_buf );\n    }\n#endif\n\n    mbedtls_net_free( &client_fd );\n\n    mbedtls_ssl_session_reset( &ssl );\n\n    /*\n     * 3. Wait until a client connects\n     */\n    mbedtls_printf( \"  . Waiting for a remote connection ...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_accept( &listen_fd, &client_fd,\n                    client_ip, sizeof( client_ip ), &cliip_len ) ) != 0 )\n    {\n#if !defined(_WIN32)\n        if( received_sigterm )\n        {\n            mbedtls_printf( \" interrupted by signal\\n\" );\n            ret = 0;\n            goto exit;\n        }\n#endif\n\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_accept returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    if( opt.nbio > 0 )\n        ret = mbedtls_net_set_nonblock( &client_fd );\n    else\n        ret = mbedtls_net_set_block( &client_fd );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! net_set_(non)block() returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_ssl_conf_read_timeout( &conf, opt.read_timeout );\n\n#if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY)\n    if( opt.transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM )\n    {\n        if( ( ret = mbedtls_ssl_set_client_transport_id( &ssl,\n                        client_ip, cliip_len ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! \"\n                    \"mbedtls_ssl_set_client_transport_id() returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n    }\n#endif /* MBEDTLS_SSL_DTLS_HELLO_VERIFY */\n\n#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)\n    if( opt.ecjpake_pw != DFL_ECJPAKE_PW )\n    {\n        if( ( ret = mbedtls_ssl_set_hs_ecjpake_password( &ssl,\n                        (const unsigned char *) opt.ecjpake_pw,\n                                        strlen( opt.ecjpake_pw ) ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_set_hs_ecjpake_password returned %d\\n\\n\", ret );\n            goto exit;\n        }\n    }\n#endif\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 4. Handshake\n     */\nhandshake:\n    mbedtls_printf( \"  . Performing the SSL/TLS handshake...\" );\n    fflush( stdout );\n\n    do ret = mbedtls_ssl_handshake( &ssl );\n    while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n           ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n    if( ret == MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED )\n    {\n        mbedtls_printf( \" hello verification requested\\n\" );\n        ret = 0;\n        goto reset;\n    }\n    else if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_ssl_handshake returned -0x%x\\n\\n\", -ret );\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n        if( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED )\n        {\n            char vrfy_buf[512];\n            flags = mbedtls_ssl_get_verify_result( &ssl );\n\n            mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), \"  ! \", flags );\n\n            mbedtls_printf( \"%s\\n\", vrfy_buf );\n        }\n#endif\n\n        goto reset;\n    }\n    else /* ret == 0 */\n    {\n        mbedtls_printf( \" ok\\n    [ Protocol is %s ]\\n    [ Ciphersuite is %s ]\\n\",\n                mbedtls_ssl_get_version( &ssl ), mbedtls_ssl_get_ciphersuite( &ssl ) );\n    }\n\n    if( ( ret = mbedtls_ssl_get_record_expansion( &ssl ) ) >= 0 )\n        mbedtls_printf( \"    [ Record expansion is %d ]\\n\", ret );\n    else\n        mbedtls_printf( \"    [ Record expansion is unknown (compression) ]\\n\" );\n\n#if defined(MBEDTLS_SSL_MAX_FRAGMENT_LENGTH)\n    mbedtls_printf( \"    [ Maximum fragment length is %u ]\\n\",\n                    (unsigned int) mbedtls_ssl_get_max_frag_len( &ssl ) );\n#endif\n\n#if defined(MBEDTLS_SSL_ALPN)\n    if( opt.alpn_string != NULL )\n    {\n        const char *alp = mbedtls_ssl_get_alpn_protocol( &ssl );\n        mbedtls_printf( \"    [ Application Layer Protocol is %s ]\\n\",\n                alp ? alp : \"(none)\" );\n    }\n#endif\n\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    /*\n     * 5. Verify the client certificate\n     */\n    mbedtls_printf( \"  . Verifying peer X.509 certificate...\" );\n\n    if( ( flags = mbedtls_ssl_get_verify_result( &ssl ) ) != 0 )\n    {\n        char vrfy_buf[512];\n\n        mbedtls_printf( \" failed\\n\" );\n\n        mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), \"  ! \", flags );\n\n        mbedtls_printf( \"%s\\n\", vrfy_buf );\n    }\n    else\n        mbedtls_printf( \" ok\\n\" );\n\n    if( mbedtls_ssl_get_peer_cert( &ssl ) != NULL )\n    {\n        char crt_buf[512];\n\n        mbedtls_printf( \"  . Peer certificate information    ...\\n\" );\n        mbedtls_x509_crt_info( crt_buf, sizeof( crt_buf ), \"      \",\n                       mbedtls_ssl_get_peer_cert( &ssl ) );\n        mbedtls_printf( \"%s\\n\", crt_buf );\n    }\n#endif /* MBEDTLS_X509_CRT_PARSE_C */\n\n    if( opt.exchanges == 0 )\n        goto close_notify;\n\n    exchanges_left = opt.exchanges;\ndata_exchange:\n    /*\n     * 6. Read the HTTP Request\n     */\n    mbedtls_printf( \"  < Read from client:\" );\n    fflush( stdout );\n\n    /*\n     * TLS and DTLS need different reading styles (stream vs datagram)\n     */\n    if( opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM )\n    {\n        do\n        {\n            int terminated = 0;\n            len = sizeof( buf ) - 1;\n            memset( buf, 0, sizeof( buf ) );\n            ret = mbedtls_ssl_read( &ssl, buf, len );\n\n            if( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n                ret == MBEDTLS_ERR_SSL_WANT_WRITE )\n                continue;\n\n            if( ret <= 0 )\n            {\n                switch( ret )\n                {\n                    case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:\n                        mbedtls_printf( \" connection was closed gracefully\\n\" );\n                        goto close_notify;\n\n                    case 0:\n                    case MBEDTLS_ERR_NET_CONN_RESET:\n                        mbedtls_printf( \" connection was reset by peer\\n\" );\n                        ret = MBEDTLS_ERR_NET_CONN_RESET;\n                        goto reset;\n\n                    default:\n                        mbedtls_printf( \" mbedtls_ssl_read returned -0x%x\\n\", -ret );\n                        goto reset;\n                }\n            }\n\n            if( mbedtls_ssl_get_bytes_avail( &ssl ) == 0 )\n            {\n                len = ret;\n                buf[len] = '\\0';\n                mbedtls_printf( \" %d bytes read\\n\\n%s\\n\", len, (char *) buf );\n\n                /* End of message should be detected according to the syntax of the\n                 * application protocol (eg HTTP), just use a dummy test here. */\n                if( buf[len - 1] == '\\n' )\n                    terminated = 1;\n            }\n            else\n            {\n                int extra_len, ori_len;\n                unsigned char *larger_buf;\n\n                ori_len = ret;\n                extra_len = (int) mbedtls_ssl_get_bytes_avail( &ssl );\n\n                larger_buf = mbedtls_calloc( 1, ori_len + extra_len + 1 );\n                if( larger_buf == NULL )\n                {\n                    mbedtls_printf( \"  ! memory allocation failed\\n\" );\n                    ret = 1;\n                    goto reset;\n                }\n\n                memset( larger_buf, 0, ori_len + extra_len );\n                memcpy( larger_buf, buf, ori_len );\n\n                /* This read should never fail and get the whole cached data */\n                ret = mbedtls_ssl_read( &ssl, larger_buf + ori_len, extra_len );\n                if( ret != extra_len ||\n                    mbedtls_ssl_get_bytes_avail( &ssl ) != 0 )\n                {\n                    mbedtls_printf( \"  ! mbedtls_ssl_read failed on cached data\\n\" );\n                    ret = 1;\n                    goto reset;\n                }\n\n                larger_buf[ori_len + extra_len] = '\\0';\n                mbedtls_printf( \" %u bytes read (%u + %u)\\n\\n%s\\n\",\n                        ori_len + extra_len, ori_len, extra_len,\n                        (char *) larger_buf );\n\n                /* End of message should be detected according to the syntax of the\n                 * application protocol (eg HTTP), just use a dummy test here. */\n                if( larger_buf[ori_len + extra_len - 1] == '\\n' )\n                    terminated = 1;\n\n                mbedtls_free( larger_buf );\n            }\n\n            if( terminated )\n            {\n                ret = 0;\n                break;\n            }\n        }\n        while( 1 );\n    }\n    else /* Not stream, so datagram */\n    {\n        len = sizeof( buf ) - 1;\n        memset( buf, 0, sizeof( buf ) );\n\n        do ret = mbedtls_ssl_read( &ssl, buf, len );\n        while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n               ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n        if( ret <= 0 )\n        {\n            switch( ret )\n            {\n                case MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY:\n                    mbedtls_printf( \" connection was closed gracefully\\n\" );\n                    ret = 0;\n                    goto close_notify;\n\n                default:\n                    mbedtls_printf( \" mbedtls_ssl_read returned -0x%x\\n\", -ret );\n                    goto reset;\n            }\n        }\n\n        len = ret;\n        buf[len] = '\\0';\n        mbedtls_printf( \" %d bytes read\\n\\n%s\", len, (char *) buf );\n        ret = 0;\n    }\n\n    /*\n     * 7a. Request renegotiation while client is waiting for input from us.\n     * (only on the first exchange, to be able to test retransmission)\n     */\n#if defined(MBEDTLS_SSL_RENEGOTIATION)\n    if( opt.renegotiate && exchanges_left == opt.exchanges )\n    {\n        mbedtls_printf( \"  . Requestion renegotiation...\" );\n        fflush( stdout );\n\n        while( ( ret = mbedtls_ssl_renegotiate( &ssl ) ) != 0 )\n        {\n            if( ret != MBEDTLS_ERR_SSL_WANT_READ &&\n                ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n            {\n                mbedtls_printf( \" failed\\n  ! mbedtls_ssl_renegotiate returned %d\\n\\n\", ret );\n                goto reset;\n            }\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n    }\n#endif /* MBEDTLS_SSL_RENEGOTIATION */\n\n    /*\n     * 7. Write the 200 Response\n     */\n    mbedtls_printf( \"  > Write to client:\" );\n    fflush( stdout );\n\n    len = sprintf( (char *) buf, HTTP_RESPONSE,\n                   mbedtls_ssl_get_ciphersuite( &ssl ) );\n\n    if( opt.transport == MBEDTLS_SSL_TRANSPORT_STREAM )\n    {\n        for( written = 0, frags = 0; written < len; written += ret, frags++ )\n        {\n            while( ( ret = mbedtls_ssl_write( &ssl, buf + written, len - written ) )\n                           <= 0 )\n            {\n                if( ret == MBEDTLS_ERR_NET_CONN_RESET )\n                {\n                    mbedtls_printf( \" failed\\n  ! peer closed the connection\\n\\n\" );\n                    goto reset;\n                }\n\n                if( ret != MBEDTLS_ERR_SSL_WANT_READ &&\n                    ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n                {\n                    mbedtls_printf( \" failed\\n  ! mbedtls_ssl_write returned %d\\n\\n\", ret );\n                    goto reset;\n                }\n            }\n        }\n    }\n    else /* Not stream, so datagram */\n    {\n        do ret = mbedtls_ssl_write( &ssl, buf, len );\n        while( ret == MBEDTLS_ERR_SSL_WANT_READ ||\n               ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n\n        if( ret < 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_write returned %d\\n\\n\", ret );\n            goto reset;\n        }\n\n        frags = 1;\n        written = ret;\n    }\n\n    buf[written] = '\\0';\n    mbedtls_printf( \" %d bytes written in %d fragments\\n\\n%s\\n\", written, frags, (char *) buf );\n    ret = 0;\n\n    /*\n     * 7b. Continue doing data exchanges?\n     */\n    if( --exchanges_left > 0 )\n        goto data_exchange;\n\n    /*\n     * 8. Done, cleanly close the connection\n     */\nclose_notify:\n    mbedtls_printf( \"  . Closing the connection...\" );\n\n    /* No error checking, the connection might be closed already */\n    do ret = mbedtls_ssl_close_notify( &ssl );\n    while( ret == MBEDTLS_ERR_SSL_WANT_WRITE );\n    ret = 0;\n\n    mbedtls_printf( \" done\\n\" );\n\n    goto reset;\n\n    /*\n     * Cleanup and exit\n     */\nexit:\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        mbedtls_printf(\"Last error was: -0x%X - %s\\n\\n\", -ret, error_buf );\n    }\n#endif\n\n    mbedtls_printf( \"  . Cleaning up...\" );\n    fflush( stdout );\n\n    mbedtls_net_free( &client_fd );\n    mbedtls_net_free( &listen_fd );\n\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_FS_IO)\n    mbedtls_dhm_free( &dhm );\n#endif\n#if defined(MBEDTLS_X509_CRT_PARSE_C)\n    mbedtls_x509_crt_free( &cacert );\n    mbedtls_x509_crt_free( &srvcert );\n    mbedtls_pk_free( &pkey );\n    mbedtls_x509_crt_free( &srvcert2 );\n    mbedtls_pk_free( &pkey2 );\n#endif\n#if defined(SNI_OPTION)\n    sni_free( sni_info );\n#endif\n#if defined(MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED)\n    psk_free( psk_info );\n#endif\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_FS_IO)\n    mbedtls_dhm_free( &dhm );\n#endif\n\n    mbedtls_ssl_free( &ssl );\n    mbedtls_ssl_config_free( &conf );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_free( &cache );\n#endif\n#if defined(MBEDTLS_SSL_SESSION_TICKETS)\n    mbedtls_ssl_ticket_free( &ticket_ctx );\n#endif\n#if defined(MBEDTLS_SSL_COOKIE_C)\n    mbedtls_ssl_cookie_free( &cookie_ctx );\n#endif\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n#if defined(MBEDTLS_MEMORY_DEBUG)\n    mbedtls_memory_buffer_alloc_status();\n#endif\n    mbedtls_memory_buffer_alloc_free();\n#endif\n\n    mbedtls_printf( \" done.\\n\" );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    // Shell can not handle large exit numbers -> 1 for errors\n    if( ret < 0 )\n        ret = 1;\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C && MBEDTLS_SSL_TLS_C &&\n          MBEDTLS_SSL_SRV_C && MBEDTLS_NET_C && MBEDTLS_RSA_C &&\n          MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/test/CMakeLists.txt",
    "content": "set(libs\n    mbedtls\n)\n\nif(USE_PKCS11_HELPER_LIBRARY)\n    set(libs ${libs} pkcs11-helper)\nendif(USE_PKCS11_HELPER_LIBRARY)\n\nif(ENABLE_ZLIB_SUPPORT)\n    set(libs ${libs} ${ZLIB_LIBRARIES})\nendif(ENABLE_ZLIB_SUPPORT)\n\nadd_executable(selftest selftest.c)\ntarget_link_libraries(selftest ${libs})\n\nadd_executable(benchmark benchmark.c)\ntarget_link_libraries(benchmark ${libs})\n\nadd_executable(ssl_cert_test ssl_cert_test.c)\ntarget_link_libraries(ssl_cert_test ${libs})\n\nadd_executable(udp_proxy udp_proxy.c)\ntarget_link_libraries(udp_proxy ${libs})\n\ninstall(TARGETS selftest benchmark ssl_cert_test udp_proxy\n        DESTINATION \"bin\"\n        PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/test/benchmark.c",
    "content": "/*\n *  Benchmark demonstration program\n *\n *  Copyright (C) 2006-2016, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_exit       exit\n#define mbedtls_printf     printf\n#define mbedtls_snprintf   snprintf\n#define mbedtls_free       free\n#endif\n\n#if !defined(MBEDTLS_TIMING_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_TIMING_C not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include <string.h>\n#include <stdlib.h>\n\n#include \"mbedtls/timing.h\"\n\n#include \"mbedtls/md4.h\"\n#include \"mbedtls/md5.h\"\n#include \"mbedtls/ripemd160.h\"\n#include \"mbedtls/sha1.h\"\n#include \"mbedtls/sha256.h\"\n#include \"mbedtls/sha512.h\"\n#include \"mbedtls/arc4.h\"\n#include \"mbedtls/des.h\"\n#include \"mbedtls/aes.h\"\n#include \"mbedtls/blowfish.h\"\n#include \"mbedtls/camellia.h\"\n#include \"mbedtls/gcm.h\"\n#include \"mbedtls/ccm.h\"\n#include \"mbedtls/cmac.h\"\n#include \"mbedtls/havege.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/hmac_drbg.h\"\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/dhm.h\"\n#include \"mbedtls/ecdsa.h\"\n#include \"mbedtls/ecdh.h\"\n#include \"mbedtls/error.h\"\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n#include \"mbedtls/memory_buffer_alloc.h\"\n#endif\n\n/*\n * For heap usage estimates, we need an estimate of the overhead per allocated\n * block. ptmalloc2/3 (used in gnu libc for instance) uses 2 size_t per block,\n * so use that as our baseline.\n */\n#define MEM_BLOCK_OVERHEAD  ( 2 * sizeof( size_t ) )\n\n/*\n * Size to use for the alloc buffer if MEMORY_BUFFER_ALLOC_C is defined.\n */\n#define HEAP_SIZE       (1u << 16)  // 64k\n\n#define BUFSIZE         1024\n#define HEADER_FORMAT   \"  %-24s :  \"\n#define TITLE_LEN       25\n\n#define OPTIONS                                                         \\\n    \"md4, md5, ripemd160, sha1, sha256, sha512,\\n\"                      \\\n    \"arc4, des3, des, camellia, blowfish,\\n\"                            \\\n    \"aes_cbc, aes_gcm, aes_ccm, aes_cmac, des3_cmac,\\n\"                 \\\n    \"havege, ctr_drbg, hmac_drbg\\n\"                                     \\\n    \"rsa, dhm, ecdsa, ecdh.\\n\"\n\n#if defined(MBEDTLS_ERROR_C)\n#define PRINT_ERROR                                                     \\\n        mbedtls_strerror( ret, ( char * )tmp, sizeof( tmp ) );          \\\n        mbedtls_printf( \"FAILED: %s\\n\", tmp );\n#else\n#define PRINT_ERROR                                                     \\\n        mbedtls_printf( \"FAILED: -0x%04x\\n\", -ret );\n#endif\n\n#define TIME_AND_TSC( TITLE, CODE )                                     \\\ndo {                                                                    \\\n    unsigned long ii, jj, tsc;                                          \\\n                                                                        \\\n    mbedtls_printf( HEADER_FORMAT, TITLE );                             \\\n    fflush( stdout );                                                   \\\n                                                                        \\\n    mbedtls_set_alarm( 1 );                                             \\\n    for( ii = 1; ! mbedtls_timing_alarmed; ii++ )                       \\\n    {                                                                   \\\n        CODE;                                                           \\\n    }                                                                   \\\n                                                                        \\\n    tsc = mbedtls_timing_hardclock();                                   \\\n    for( jj = 0; jj < 1024; jj++ )                                      \\\n    {                                                                   \\\n        CODE;                                                           \\\n    }                                                                   \\\n                                                                        \\\n    mbedtls_printf( \"%9lu Kb/s,  %9lu cycles/byte\\n\",                   \\\n                     ii * BUFSIZE / 1024,                               \\\n                     ( mbedtls_timing_hardclock() - tsc ) / ( jj * BUFSIZE ) );         \\\n} while( 0 )\n\n#if defined(MBEDTLS_ERROR_C)\n#define PRINT_ERROR                                                     \\\n        mbedtls_strerror( ret, ( char * )tmp, sizeof( tmp ) );          \\\n        mbedtls_printf( \"FAILED: %s\\n\", tmp );\n#else\n#define PRINT_ERROR                                                     \\\n        mbedtls_printf( \"FAILED: -0x%04x\\n\", -ret );\n#endif\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_MEMORY_DEBUG)\n\n#define MEMORY_MEASURE_INIT                                             \\\n    size_t max_used, max_blocks, max_bytes;                             \\\n    size_t prv_used, prv_blocks;                                        \\\n    mbedtls_memory_buffer_alloc_cur_get( &prv_used, &prv_blocks );      \\\n    mbedtls_memory_buffer_alloc_max_reset( );\n\n#define MEMORY_MEASURE_PRINT( title_len )                               \\\n    mbedtls_memory_buffer_alloc_max_get( &max_used, &max_blocks );      \\\n    for( ii = 12 - title_len; ii != 0; ii-- ) mbedtls_printf( \" \" );    \\\n    max_used -= prv_used;                                               \\\n    max_blocks -= prv_blocks;                                           \\\n    max_bytes = max_used + MEM_BLOCK_OVERHEAD * max_blocks;             \\\n    mbedtls_printf( \"%6u heap bytes\", (unsigned) max_bytes );\n\n#else\n#define MEMORY_MEASURE_INIT\n#define MEMORY_MEASURE_PRINT( title_len )\n#endif\n\n#define TIME_PUBLIC( TITLE, TYPE, CODE )                                \\\ndo {                                                                    \\\n    unsigned long ii;                                                   \\\n    int ret;                                                            \\\n    MEMORY_MEASURE_INIT;                                                \\\n                                                                        \\\n    mbedtls_printf( HEADER_FORMAT, TITLE );                             \\\n    fflush( stdout );                                                   \\\n    mbedtls_set_alarm( 3 );                                             \\\n                                                                        \\\n    ret = 0;                                                            \\\n    for( ii = 1; ! mbedtls_timing_alarmed && ! ret ; ii++ )             \\\n    {                                                                   \\\n        CODE;                                                           \\\n    }                                                                   \\\n                                                                        \\\n    if( ret != 0 )                                                      \\\n    {                                                                   \\\n        PRINT_ERROR;                                                    \\\n    }                                                                   \\\n    else                                                                \\\n    {                                                                   \\\n        mbedtls_printf( \"%6lu \" TYPE \"/s\", ii / 3 );                    \\\n        MEMORY_MEASURE_PRINT( sizeof( TYPE ) + 1 );                     \\\n        mbedtls_printf( \"\\n\" );                                         \\\n    }                                                                   \\\n} while( 0 )\n\nstatic int myrand( void *rng_state, unsigned char *output, size_t len )\n{\n    size_t use_len;\n    int rnd;\n\n    if( rng_state != NULL )\n        rng_state  = NULL;\n\n    while( len > 0 )\n    {\n        use_len = len;\n        if( use_len > sizeof(int) )\n            use_len = sizeof(int);\n\n        rnd = rand();\n        memcpy( output, &rnd, use_len );\n        output += use_len;\n        len -= use_len;\n    }\n\n    return( 0 );\n}\n\n/*\n * Clear some memory that was used to prepare the context\n */\n#if defined(MBEDTLS_ECP_C)\nvoid ecp_clear_precomputed( mbedtls_ecp_group *grp )\n{\n    if( grp->T != NULL )\n    {\n        size_t i;\n        for( i = 0; i < grp->T_size; i++ )\n            mbedtls_ecp_point_free( &grp->T[i] );\n        mbedtls_free( grp->T );\n    }\n    grp->T = NULL;\n    grp->T_size = 0;\n}\n#else\n#define ecp_clear_precomputed( g )\n#endif\n\nunsigned char buf[BUFSIZE];\n\ntypedef struct {\n    char md4, md5, ripemd160, sha1, sha256, sha512,\n         arc4, des3, des,\n         aes_cbc, aes_gcm, aes_ccm, aes_cmac, des3_cmac,\n         camellia, blowfish,\n         havege, ctr_drbg, hmac_drbg,\n         rsa, dhm, ecdsa, ecdh;\n} todo_list;\n\nint main( int argc, char *argv[] )\n{\n    int i;\n    unsigned char tmp[200];\n    char title[TITLE_LEN];\n    todo_list todo;\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    unsigned char alloc_buf[HEAP_SIZE] = { 0 };\n#endif\n\n    if( argc <= 1 )\n    {\n        memset( &todo, 1, sizeof( todo ) );\n    }\n    else\n    {\n        memset( &todo, 0, sizeof( todo ) );\n\n        for( i = 1; i < argc; i++ )\n        {\n            if( strcmp( argv[i], \"md4\" ) == 0 )\n                todo.md4 = 1;\n            else if( strcmp( argv[i], \"md5\" ) == 0 )\n                todo.md5 = 1;\n            else if( strcmp( argv[i], \"ripemd160\" ) == 0 )\n                todo.ripemd160 = 1;\n            else if( strcmp( argv[i], \"sha1\" ) == 0 )\n                todo.sha1 = 1;\n            else if( strcmp( argv[i], \"sha256\" ) == 0 )\n                todo.sha256 = 1;\n            else if( strcmp( argv[i], \"sha512\" ) == 0 )\n                todo.sha512 = 1;\n            else if( strcmp( argv[i], \"arc4\" ) == 0 )\n                todo.arc4 = 1;\n            else if( strcmp( argv[i], \"des3\" ) == 0 )\n                todo.des3 = 1;\n            else if( strcmp( argv[i], \"des\" ) == 0 )\n                todo.des = 1;\n            else if( strcmp( argv[i], \"aes_cbc\" ) == 0 )\n                todo.aes_cbc = 1;\n            else if( strcmp( argv[i], \"aes_gcm\" ) == 0 )\n                todo.aes_gcm = 1;\n            else if( strcmp( argv[i], \"aes_ccm\" ) == 0 )\n                todo.aes_ccm = 1;\n            else if( strcmp( argv[i], \"aes_cmac\" ) == 0 )\n                todo.aes_cmac = 1;\n            else if( strcmp( argv[i], \"des3_cmac\" ) == 0 )\n                todo.des3_cmac = 1;\n            else if( strcmp( argv[i], \"camellia\" ) == 0 )\n                todo.camellia = 1;\n            else if( strcmp( argv[i], \"blowfish\" ) == 0 )\n                todo.blowfish = 1;\n            else if( strcmp( argv[i], \"havege\" ) == 0 )\n                todo.havege = 1;\n            else if( strcmp( argv[i], \"ctr_drbg\" ) == 0 )\n                todo.ctr_drbg = 1;\n            else if( strcmp( argv[i], \"hmac_drbg\" ) == 0 )\n                todo.hmac_drbg = 1;\n            else if( strcmp( argv[i], \"rsa\" ) == 0 )\n                todo.rsa = 1;\n            else if( strcmp( argv[i], \"dhm\" ) == 0 )\n                todo.dhm = 1;\n            else if( strcmp( argv[i], \"ecdsa\" ) == 0 )\n                todo.ecdsa = 1;\n            else if( strcmp( argv[i], \"ecdh\" ) == 0 )\n                todo.ecdh = 1;\n            else\n            {\n                mbedtls_printf( \"Unrecognized option: %s\\n\", argv[i] );\n                mbedtls_printf( \"Available options: \" OPTIONS );\n            }\n        }\n    }\n\n    mbedtls_printf( \"\\n\" );\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    mbedtls_memory_buffer_alloc_init( alloc_buf, sizeof( alloc_buf ) );\n#endif\n    memset( buf, 0xAA, sizeof( buf ) );\n    memset( tmp, 0xBB, sizeof( tmp ) );\n\n#if defined(MBEDTLS_MD4_C)\n    if( todo.md4 )\n        TIME_AND_TSC( \"MD4\", mbedtls_md4( buf, BUFSIZE, tmp ) );\n#endif\n\n#if defined(MBEDTLS_MD5_C)\n    if( todo.md5 )\n        TIME_AND_TSC( \"MD5\", mbedtls_md5( buf, BUFSIZE, tmp ) );\n#endif\n\n#if defined(MBEDTLS_RIPEMD160_C)\n    if( todo.ripemd160 )\n        TIME_AND_TSC( \"RIPEMD160\", mbedtls_ripemd160( buf, BUFSIZE, tmp ) );\n#endif\n\n#if defined(MBEDTLS_SHA1_C)\n    if( todo.sha1 )\n        TIME_AND_TSC( \"SHA-1\", mbedtls_sha1( buf, BUFSIZE, tmp ) );\n#endif\n\n#if defined(MBEDTLS_SHA256_C)\n    if( todo.sha256 )\n        TIME_AND_TSC( \"SHA-256\", mbedtls_sha256( buf, BUFSIZE, tmp, 0 ) );\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\n    if( todo.sha512 )\n        TIME_AND_TSC( \"SHA-512\", mbedtls_sha512( buf, BUFSIZE, tmp, 0 ) );\n#endif\n\n#if defined(MBEDTLS_ARC4_C)\n    if( todo.arc4 )\n    {\n        mbedtls_arc4_context arc4;\n        mbedtls_arc4_init( &arc4 );\n        mbedtls_arc4_setup( &arc4, tmp, 32 );\n        TIME_AND_TSC( \"ARC4\", mbedtls_arc4_crypt( &arc4, BUFSIZE, buf, buf ) );\n        mbedtls_arc4_free( &arc4 );\n    }\n#endif\n\n#if defined(MBEDTLS_DES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    if( todo.des3 )\n    {\n        mbedtls_des3_context des3;\n        mbedtls_des3_init( &des3 );\n        mbedtls_des3_set3key_enc( &des3, tmp );\n        TIME_AND_TSC( \"3DES\",\n                mbedtls_des3_crypt_cbc( &des3, MBEDTLS_DES_ENCRYPT, BUFSIZE, tmp, buf, buf ) );\n        mbedtls_des3_free( &des3 );\n    }\n\n    if( todo.des )\n    {\n        mbedtls_des_context des;\n        mbedtls_des_init( &des );\n        mbedtls_des_setkey_enc( &des, tmp );\n        TIME_AND_TSC( \"DES\",\n                mbedtls_des_crypt_cbc( &des, MBEDTLS_DES_ENCRYPT, BUFSIZE, tmp, buf, buf ) );\n        mbedtls_des_free( &des );\n    }\n\n#endif /* MBEDTLS_CIPHER_MODE_CBC */\n#if defined(MBEDTLS_CMAC_C)\n    if( todo.des3_cmac )\n    {\n        unsigned char output[8];\n        const mbedtls_cipher_info_t *cipher_info;\n\n        memset( buf, 0, sizeof( buf ) );\n        memset( tmp, 0, sizeof( tmp ) );\n\n        cipher_info = mbedtls_cipher_info_from_type( MBEDTLS_CIPHER_DES_EDE3_ECB );\n\n        TIME_AND_TSC( \"3DES-CMAC\",\n                      mbedtls_cipher_cmac( cipher_info, tmp, 192, buf,\n                      BUFSIZE, output ) );\n    }\n#endif /* MBEDTLS_CMAC_C */\n#endif /* MBEDTLS_DES_C */\n\n#if defined(MBEDTLS_AES_C)\n#if defined(MBEDTLS_CIPHER_MODE_CBC)\n    if( todo.aes_cbc )\n    {\n        int keysize;\n        mbedtls_aes_context aes;\n        mbedtls_aes_init( &aes );\n        for( keysize = 128; keysize <= 256; keysize += 64 )\n        {\n            mbedtls_snprintf( title, sizeof( title ), \"AES-CBC-%d\", keysize );\n\n            memset( buf, 0, sizeof( buf ) );\n            memset( tmp, 0, sizeof( tmp ) );\n            mbedtls_aes_setkey_enc( &aes, tmp, keysize );\n\n            TIME_AND_TSC( title,\n                mbedtls_aes_crypt_cbc( &aes, MBEDTLS_AES_ENCRYPT, BUFSIZE, tmp, buf, buf ) );\n        }\n        mbedtls_aes_free( &aes );\n    }\n#endif\n#if defined(MBEDTLS_GCM_C)\n    if( todo.aes_gcm )\n    {\n        int keysize;\n        mbedtls_gcm_context gcm;\n\n        mbedtls_gcm_init( &gcm );\n        for( keysize = 128; keysize <= 256; keysize += 64 )\n        {\n            mbedtls_snprintf( title, sizeof( title ), \"AES-GCM-%d\", keysize );\n\n            memset( buf, 0, sizeof( buf ) );\n            memset( tmp, 0, sizeof( tmp ) );\n            mbedtls_gcm_setkey( &gcm, MBEDTLS_CIPHER_ID_AES, tmp, keysize );\n\n            TIME_AND_TSC( title,\n                    mbedtls_gcm_crypt_and_tag( &gcm, MBEDTLS_GCM_ENCRYPT, BUFSIZE, tmp,\n                        12, NULL, 0, buf, buf, 16, tmp ) );\n\n            mbedtls_gcm_free( &gcm );\n        }\n    }\n#endif\n#if defined(MBEDTLS_CCM_C)\n    if( todo.aes_ccm )\n    {\n        int keysize;\n        mbedtls_ccm_context ccm;\n\n        mbedtls_ccm_init( &ccm );\n        for( keysize = 128; keysize <= 256; keysize += 64 )\n        {\n            mbedtls_snprintf( title, sizeof( title ), \"AES-CCM-%d\", keysize );\n\n            memset( buf, 0, sizeof( buf ) );\n            memset( tmp, 0, sizeof( tmp ) );\n            mbedtls_ccm_setkey( &ccm, MBEDTLS_CIPHER_ID_AES, tmp, keysize );\n\n            TIME_AND_TSC( title,\n                    mbedtls_ccm_encrypt_and_tag( &ccm, BUFSIZE, tmp,\n                        12, NULL, 0, buf, buf, tmp, 16 ) );\n\n            mbedtls_ccm_free( &ccm );\n        }\n    }\n#endif\n#if defined(MBEDTLS_CMAC_C)\n    if( todo.aes_cmac )\n    {\n        unsigned char output[16];\n        const mbedtls_cipher_info_t *cipher_info;\n        mbedtls_cipher_type_t cipher_type;\n        int keysize;\n\n        for( keysize = 128, cipher_type = MBEDTLS_CIPHER_AES_128_ECB;\n             keysize <= 256;\n             keysize += 64, cipher_type++ )\n        {\n            mbedtls_snprintf( title, sizeof( title ), \"AES-CMAC-%d\", keysize );\n\n            memset( buf, 0, sizeof( buf ) );\n            memset( tmp, 0, sizeof( tmp ) );\n\n            cipher_info = mbedtls_cipher_info_from_type( cipher_type );\n\n            TIME_AND_TSC( title,\n                          mbedtls_cipher_cmac( cipher_info, tmp, keysize,\n                                               buf, BUFSIZE, output ) );\n        }\n\n        memset( buf, 0, sizeof( buf ) );\n        memset( tmp, 0, sizeof( tmp ) );\n        TIME_AND_TSC( \"AES-CMAC-PRF-128\",\n                      mbedtls_aes_cmac_prf_128( tmp, 16, buf, BUFSIZE,\n                                                output ) );\n    }\n#endif /* MBEDTLS_CMAC_C */\n#endif /* MBEDTLS_AES_C */\n\n#if defined(MBEDTLS_CAMELLIA_C) && defined(MBEDTLS_CIPHER_MODE_CBC)\n    if( todo.camellia )\n    {\n        int keysize;\n        mbedtls_camellia_context camellia;\n        mbedtls_camellia_init( &camellia );\n        for( keysize = 128; keysize <= 256; keysize += 64 )\n        {\n            mbedtls_snprintf( title, sizeof( title ), \"CAMELLIA-CBC-%d\", keysize );\n\n            memset( buf, 0, sizeof( buf ) );\n            memset( tmp, 0, sizeof( tmp ) );\n            mbedtls_camellia_setkey_enc( &camellia, tmp, keysize );\n\n            TIME_AND_TSC( title,\n                    mbedtls_camellia_crypt_cbc( &camellia, MBEDTLS_CAMELLIA_ENCRYPT,\n                        BUFSIZE, tmp, buf, buf ) );\n        }\n        mbedtls_camellia_free( &camellia );\n    }\n#endif\n\n#if defined(MBEDTLS_BLOWFISH_C) && defined(MBEDTLS_CIPHER_MODE_CBC)\n    if( todo.blowfish )\n    {\n        int keysize;\n        mbedtls_blowfish_context blowfish;\n        mbedtls_blowfish_init( &blowfish );\n\n        for( keysize = 128; keysize <= 256; keysize += 64 )\n        {\n            mbedtls_snprintf( title, sizeof( title ), \"BLOWFISH-CBC-%d\", keysize );\n\n            memset( buf, 0, sizeof( buf ) );\n            memset( tmp, 0, sizeof( tmp ) );\n            mbedtls_blowfish_setkey( &blowfish, tmp, keysize );\n\n            TIME_AND_TSC( title,\n                    mbedtls_blowfish_crypt_cbc( &blowfish, MBEDTLS_BLOWFISH_ENCRYPT, BUFSIZE,\n                        tmp, buf, buf ) );\n        }\n\n        mbedtls_blowfish_free( &blowfish );\n    }\n#endif\n\n#if defined(MBEDTLS_HAVEGE_C)\n    if( todo.havege )\n    {\n        mbedtls_havege_state hs;\n        mbedtls_havege_init( &hs );\n        TIME_AND_TSC( \"HAVEGE\", mbedtls_havege_random( &hs, buf, BUFSIZE ) );\n        mbedtls_havege_free( &hs );\n    }\n#endif\n\n#if defined(MBEDTLS_CTR_DRBG_C)\n    if( todo.ctr_drbg )\n    {\n        mbedtls_ctr_drbg_context ctr_drbg;\n\n        mbedtls_ctr_drbg_init( &ctr_drbg );\n\n        if( mbedtls_ctr_drbg_seed( &ctr_drbg, myrand, NULL, NULL, 0 ) != 0 )\n            mbedtls_exit(1);\n        TIME_AND_TSC( \"CTR_DRBG (NOPR)\",\n                if( mbedtls_ctr_drbg_random( &ctr_drbg, buf, BUFSIZE ) != 0 )\n                mbedtls_exit(1) );\n\n        if( mbedtls_ctr_drbg_seed( &ctr_drbg, myrand, NULL, NULL, 0 ) != 0 )\n            mbedtls_exit(1);\n        mbedtls_ctr_drbg_set_prediction_resistance( &ctr_drbg, MBEDTLS_CTR_DRBG_PR_ON );\n        TIME_AND_TSC( \"CTR_DRBG (PR)\",\n                if( mbedtls_ctr_drbg_random( &ctr_drbg, buf, BUFSIZE ) != 0 )\n                mbedtls_exit(1) );\n        mbedtls_ctr_drbg_free( &ctr_drbg );\n    }\n#endif\n\n#if defined(MBEDTLS_HMAC_DRBG_C)\n    if( todo.hmac_drbg )\n    {\n        mbedtls_hmac_drbg_context hmac_drbg;\n        const mbedtls_md_info_t *md_info;\n\n        mbedtls_hmac_drbg_init( &hmac_drbg );\n\n#if defined(MBEDTLS_SHA1_C)\n        if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA1 ) ) == NULL )\n            mbedtls_exit(1);\n\n        if( mbedtls_hmac_drbg_seed( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )\n            mbedtls_exit(1);\n        TIME_AND_TSC( \"HMAC_DRBG SHA-1 (NOPR)\",\n                if( mbedtls_hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )\n                mbedtls_exit(1) );\n        mbedtls_hmac_drbg_free( &hmac_drbg );\n\n        if( mbedtls_hmac_drbg_seed( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )\n            mbedtls_exit(1);\n        mbedtls_hmac_drbg_set_prediction_resistance( &hmac_drbg,\n                                             MBEDTLS_HMAC_DRBG_PR_ON );\n        TIME_AND_TSC( \"HMAC_DRBG SHA-1 (PR)\",\n                if( mbedtls_hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )\n                mbedtls_exit(1) );\n        mbedtls_hmac_drbg_free( &hmac_drbg );\n#endif\n\n#if defined(MBEDTLS_SHA256_C)\n        if( ( md_info = mbedtls_md_info_from_type( MBEDTLS_MD_SHA256 ) ) == NULL )\n            mbedtls_exit(1);\n\n        if( mbedtls_hmac_drbg_seed( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )\n            mbedtls_exit(1);\n        TIME_AND_TSC( \"HMAC_DRBG SHA-256 (NOPR)\",\n                if( mbedtls_hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )\n                mbedtls_exit(1) );\n        mbedtls_hmac_drbg_free( &hmac_drbg );\n\n        if( mbedtls_hmac_drbg_seed( &hmac_drbg, md_info, myrand, NULL, NULL, 0 ) != 0 )\n            mbedtls_exit(1);\n        mbedtls_hmac_drbg_set_prediction_resistance( &hmac_drbg,\n                                             MBEDTLS_HMAC_DRBG_PR_ON );\n        TIME_AND_TSC( \"HMAC_DRBG SHA-256 (PR)\",\n                if( mbedtls_hmac_drbg_random( &hmac_drbg, buf, BUFSIZE ) != 0 )\n                mbedtls_exit(1) );\n        mbedtls_hmac_drbg_free( &hmac_drbg );\n#endif\n    }\n#endif\n\n#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_GENPRIME)\n    if( todo.rsa )\n    {\n        int keysize;\n        mbedtls_rsa_context rsa;\n        for( keysize = 2048; keysize <= 4096; keysize *= 2 )\n        {\n            mbedtls_snprintf( title, sizeof( title ), \"RSA-%d\", keysize );\n\n            mbedtls_rsa_init( &rsa, MBEDTLS_RSA_PKCS_V15, 0 );\n            mbedtls_rsa_gen_key( &rsa, myrand, NULL, keysize, 65537 );\n\n            TIME_PUBLIC( title, \" public\",\n                    buf[0] = 0;\n                    ret = mbedtls_rsa_public( &rsa, buf, buf ) );\n\n            TIME_PUBLIC( title, \"private\",\n                    buf[0] = 0;\n                    ret = mbedtls_rsa_private( &rsa, myrand, NULL, buf, buf ) );\n\n            mbedtls_rsa_free( &rsa );\n        }\n    }\n#endif\n\n#if defined(MBEDTLS_DHM_C) && defined(MBEDTLS_BIGNUM_C)\n    if( todo.dhm )\n    {\n        int dhm_sizes[] = { 2048, 3072 };\n        const char *dhm_P[] = {\n            MBEDTLS_DHM_RFC3526_MODP_2048_P,\n            MBEDTLS_DHM_RFC3526_MODP_3072_P,\n        };\n        const char *dhm_G[] = {\n            MBEDTLS_DHM_RFC3526_MODP_2048_G,\n            MBEDTLS_DHM_RFC3526_MODP_3072_G,\n        };\n\n        mbedtls_dhm_context dhm;\n        size_t olen;\n        for( i = 0; (size_t) i < sizeof( dhm_sizes ) / sizeof( dhm_sizes[0] ); i++ )\n        {\n            mbedtls_dhm_init( &dhm );\n\n            if( mbedtls_mpi_read_string( &dhm.P, 16, dhm_P[i] ) != 0 ||\n                mbedtls_mpi_read_string( &dhm.G, 16, dhm_G[i] ) != 0 )\n            {\n                mbedtls_exit( 1 );\n            }\n\n            dhm.len = mbedtls_mpi_size( &dhm.P );\n            mbedtls_dhm_make_public( &dhm, (int) dhm.len, buf, dhm.len, myrand, NULL );\n            if( mbedtls_mpi_copy( &dhm.GY, &dhm.GX ) != 0 )\n                mbedtls_exit( 1 );\n\n            mbedtls_snprintf( title, sizeof( title ), \"DHE-%d\", dhm_sizes[i] );\n            TIME_PUBLIC( title, \"handshake\",\n                    ret |= mbedtls_dhm_make_public( &dhm, (int) dhm.len, buf, dhm.len,\n                                            myrand, NULL );\n                    ret |= mbedtls_dhm_calc_secret( &dhm, buf, sizeof( buf ), &olen, myrand, NULL ) );\n\n            mbedtls_snprintf( title, sizeof( title ), \"DH-%d\", dhm_sizes[i] );\n            TIME_PUBLIC( title, \"handshake\",\n                    ret |= mbedtls_dhm_calc_secret( &dhm, buf, sizeof( buf ), &olen, myrand, NULL ) );\n\n            mbedtls_dhm_free( &dhm );\n        }\n    }\n#endif\n\n#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_SHA256_C)\n    if( todo.ecdsa )\n    {\n        mbedtls_ecdsa_context ecdsa;\n        const mbedtls_ecp_curve_info *curve_info;\n        size_t sig_len;\n\n        memset( buf, 0x2A, sizeof( buf ) );\n\n        for( curve_info = mbedtls_ecp_curve_list();\n             curve_info->grp_id != MBEDTLS_ECP_DP_NONE;\n             curve_info++ )\n        {\n            mbedtls_ecdsa_init( &ecdsa );\n\n            if( mbedtls_ecdsa_genkey( &ecdsa, curve_info->grp_id, myrand, NULL ) != 0 )\n                mbedtls_exit( 1 );\n            ecp_clear_precomputed( &ecdsa.grp );\n\n            mbedtls_snprintf( title, sizeof( title ), \"ECDSA-%s\",\n                                              curve_info->name );\n            TIME_PUBLIC( title, \"sign\",\n                    ret = mbedtls_ecdsa_write_signature( &ecdsa, MBEDTLS_MD_SHA256, buf, curve_info->bit_size,\n                                                tmp, &sig_len, myrand, NULL ) );\n\n            mbedtls_ecdsa_free( &ecdsa );\n        }\n\n        for( curve_info = mbedtls_ecp_curve_list();\n             curve_info->grp_id != MBEDTLS_ECP_DP_NONE;\n             curve_info++ )\n        {\n            mbedtls_ecdsa_init( &ecdsa );\n\n            if( mbedtls_ecdsa_genkey( &ecdsa, curve_info->grp_id, myrand, NULL ) != 0 ||\n                mbedtls_ecdsa_write_signature( &ecdsa, MBEDTLS_MD_SHA256, buf, curve_info->bit_size,\n                                               tmp, &sig_len, myrand, NULL ) != 0 )\n            {\n                mbedtls_exit( 1 );\n            }\n            ecp_clear_precomputed( &ecdsa.grp );\n\n            mbedtls_snprintf( title, sizeof( title ), \"ECDSA-%s\",\n                                              curve_info->name );\n            TIME_PUBLIC( title, \"verify\",\n                    ret = mbedtls_ecdsa_read_signature( &ecdsa, buf, curve_info->bit_size,\n                                                tmp, sig_len ) );\n\n            mbedtls_ecdsa_free( &ecdsa );\n        }\n    }\n#endif\n\n#if defined(MBEDTLS_ECDH_C)\n    if( todo.ecdh )\n    {\n        mbedtls_ecdh_context ecdh;\n#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)\n        mbedtls_mpi z;\n#endif\n        const mbedtls_ecp_curve_info *curve_info;\n        size_t olen;\n\n        for( curve_info = mbedtls_ecp_curve_list();\n             curve_info->grp_id != MBEDTLS_ECP_DP_NONE;\n             curve_info++ )\n        {\n            mbedtls_ecdh_init( &ecdh );\n\n            if( mbedtls_ecp_group_load( &ecdh.grp, curve_info->grp_id ) != 0 ||\n                mbedtls_ecdh_make_public( &ecdh, &olen, buf, sizeof( buf),\n                                  myrand, NULL ) != 0 ||\n                mbedtls_ecp_copy( &ecdh.Qp, &ecdh.Q ) != 0 )\n            {\n                mbedtls_exit( 1 );\n            }\n            ecp_clear_precomputed( &ecdh.grp );\n\n            mbedtls_snprintf( title, sizeof( title ), \"ECDHE-%s\",\n                                              curve_info->name );\n            TIME_PUBLIC( title, \"handshake\",\n                    ret |= mbedtls_ecdh_make_public( &ecdh, &olen, buf, sizeof( buf),\n                                             myrand, NULL );\n                    ret |= mbedtls_ecdh_calc_secret( &ecdh, &olen, buf, sizeof( buf ),\n                                             myrand, NULL ) );\n            mbedtls_ecdh_free( &ecdh );\n        }\n\n        /* Curve25519 needs to be handled separately */\n#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)\n        mbedtls_ecdh_init( &ecdh );\n        mbedtls_mpi_init( &z );\n\n        if( mbedtls_ecp_group_load( &ecdh.grp, MBEDTLS_ECP_DP_CURVE25519 ) != 0 ||\n            mbedtls_ecdh_gen_public( &ecdh.grp, &ecdh.d, &ecdh.Qp, myrand, NULL ) != 0 )\n        {\n            mbedtls_exit( 1 );\n        }\n\n        TIME_PUBLIC(  \"ECDHE-Curve25519\", \"handshake\",\n                ret |= mbedtls_ecdh_gen_public( &ecdh.grp, &ecdh.d, &ecdh.Q,\n                                        myrand, NULL );\n                ret |= mbedtls_ecdh_compute_shared( &ecdh.grp, &z, &ecdh.Qp, &ecdh.d,\n                                            myrand, NULL ) );\n\n        mbedtls_ecdh_free( &ecdh );\n        mbedtls_mpi_free( &z );\n#endif\n\n        for( curve_info = mbedtls_ecp_curve_list();\n             curve_info->grp_id != MBEDTLS_ECP_DP_NONE;\n             curve_info++ )\n        {\n            mbedtls_ecdh_init( &ecdh );\n\n            if( mbedtls_ecp_group_load( &ecdh.grp, curve_info->grp_id ) != 0 ||\n                mbedtls_ecdh_make_public( &ecdh, &olen, buf, sizeof( buf),\n                                  myrand, NULL ) != 0 ||\n                mbedtls_ecp_copy( &ecdh.Qp, &ecdh.Q ) != 0 ||\n                mbedtls_ecdh_make_public( &ecdh, &olen, buf, sizeof( buf),\n                                  myrand, NULL ) != 0 )\n            {\n                mbedtls_exit( 1 );\n            }\n            ecp_clear_precomputed( &ecdh.grp );\n\n            mbedtls_snprintf( title, sizeof( title ), \"ECDH-%s\",\n                                              curve_info->name );\n            TIME_PUBLIC( title, \"handshake\",\n                    ret |= mbedtls_ecdh_calc_secret( &ecdh, &olen, buf, sizeof( buf ),\n                                             myrand, NULL ) );\n            mbedtls_ecdh_free( &ecdh );\n        }\n\n        /* Curve25519 needs to be handled separately */\n#if defined(MBEDTLS_ECP_DP_CURVE25519_ENABLED)\n        mbedtls_ecdh_init( &ecdh );\n        mbedtls_mpi_init( &z );\n\n        if( mbedtls_ecp_group_load( &ecdh.grp, MBEDTLS_ECP_DP_CURVE25519 ) != 0 ||\n            mbedtls_ecdh_gen_public( &ecdh.grp, &ecdh.d, &ecdh.Qp,\n                             myrand, NULL ) != 0 ||\n            mbedtls_ecdh_gen_public( &ecdh.grp, &ecdh.d, &ecdh.Q, myrand, NULL ) != 0 )\n        {\n            mbedtls_exit( 1 );\n        }\n\n        TIME_PUBLIC(  \"ECDH-Curve25519\", \"handshake\",\n                ret |= mbedtls_ecdh_compute_shared( &ecdh.grp, &z, &ecdh.Qp, &ecdh.d,\n                                            myrand, NULL ) );\n\n        mbedtls_ecdh_free( &ecdh );\n        mbedtls_mpi_free( &z );\n#endif\n    }\n#endif\n\n    mbedtls_printf( \"\\n\" );\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    mbedtls_memory_buffer_alloc_free();\n#endif\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( 0 );\n}\n\n#endif /* MBEDTLS_TIMING_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/test/selftest.c",
    "content": "/*\n *  Self-test demonstration program\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/entropy_poll.h\"\n#include \"mbedtls/hmac_drbg.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/dhm.h\"\n#include \"mbedtls/gcm.h\"\n#include \"mbedtls/ccm.h\"\n#include \"mbedtls/cmac.h\"\n#include \"mbedtls/md2.h\"\n#include \"mbedtls/md4.h\"\n#include \"mbedtls/md5.h\"\n#include \"mbedtls/ripemd160.h\"\n#include \"mbedtls/sha1.h\"\n#include \"mbedtls/sha256.h\"\n#include \"mbedtls/sha512.h\"\n#include \"mbedtls/arc4.h\"\n#include \"mbedtls/des.h\"\n#include \"mbedtls/aes.h\"\n#include \"mbedtls/camellia.h\"\n#include \"mbedtls/base64.h\"\n#include \"mbedtls/bignum.h\"\n#include \"mbedtls/rsa.h\"\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/xtea.h\"\n#include \"mbedtls/pkcs5.h\"\n#include \"mbedtls/ecp.h\"\n#include \"mbedtls/ecjpake.h\"\n#include \"mbedtls/timing.h\"\n\n#include <string.h>\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_printf     printf\n#define mbedtls_snprintf   snprintf\n#define mbedtls_exit       exit\n#define MBEDTLS_EXIT_SUCCESS EXIT_SUCCESS\n#define MBEDTLS_EXIT_FAILURE EXIT_FAILURE\n#endif\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n#include \"mbedtls/memory_buffer_alloc.h\"\n#endif\n\nstatic int test_snprintf( size_t n, const char ref_buf[10], int ref_ret )\n{\n    int ret;\n    char buf[10] = \"xxxxxxxxx\";\n    const char ref[10] = \"xxxxxxxxx\";\n\n    ret = mbedtls_snprintf( buf, n, \"%s\", \"123\" );\n    if( ret < 0 || (size_t) ret >= n )\n        ret = -1;\n\n    if( strncmp( ref_buf, buf, sizeof( buf ) ) != 0 ||\n        ref_ret != ret ||\n        memcmp( buf + n, ref + n, sizeof( buf ) - n ) != 0 )\n    {\n        return( 1 );\n    }\n\n    return( 0 );\n}\n\nstatic int run_test_snprintf( void )\n{\n    return( test_snprintf( 0, \"xxxxxxxxx\",  -1 ) != 0 ||\n            test_snprintf( 1, \"\",           -1 ) != 0 ||\n            test_snprintf( 2, \"1\",          -1 ) != 0 ||\n            test_snprintf( 3, \"12\",         -1 ) != 0 ||\n            test_snprintf( 4, \"123\",         3 ) != 0 ||\n            test_snprintf( 5, \"123\",         3 ) != 0 );\n}\n\n/*\n * Check if a seed file is present, and if not create one for the entropy\n * self-test. If this fails, we attempt the test anyway, so no error is passed\n * back.\n */\n#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_ENTROPY_C) && \\\n    defined(MBEDTLS_ENTROPY_NV_SEED) && !defined(MBEDTLS_NO_PLATFORM_ENTROPY)\nstatic void create_entropy_seed_file( void )\n{\n    int result;\n    size_t output_len = 0;\n    unsigned char seed_value[MBEDTLS_ENTROPY_BLOCK_SIZE];\n\n    /* Attempt to read the entropy seed file. If this fails - attempt to write\n     * to the file to ensure one is present. */\n    result = mbedtls_platform_std_nv_seed_read( seed_value,\n                                                    MBEDTLS_ENTROPY_BLOCK_SIZE );\n    if( 0 == result )\n        return;\n\n    result = mbedtls_platform_entropy_poll( NULL,\n                                            seed_value,\n                                            MBEDTLS_ENTROPY_BLOCK_SIZE,\n                                            &output_len );\n    if( 0 != result )\n        return;\n\n    if( MBEDTLS_ENTROPY_BLOCK_SIZE != output_len )\n        return;\n\n    mbedtls_platform_std_nv_seed_write( seed_value, MBEDTLS_ENTROPY_BLOCK_SIZE );\n}\n#endif\n\nint main( int argc, char *argv[] )\n{\n    int v, suites_tested = 0, suites_failed = 0;\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_SELF_TEST)\n    unsigned char buf[1000000];\n#endif\n    void *pointer;\n\n    /*\n     * The C standard doesn't guarantee that all-bits-0 is the representation\n     * of a NULL pointer. We do however use that in our code for initializing\n     * structures, which should work on every modern platform. Let's be sure.\n     */\n    memset( &pointer, 0, sizeof( void * ) );\n    if( pointer != NULL )\n    {\n        mbedtls_printf( \"all-bits-zero is not a NULL pointer\\n\" );\n        mbedtls_exit( MBEDTLS_EXIT_FAILURE );\n    }\n\n    /*\n     * Make sure we have a snprintf that correctly zero-terminates\n     */\n    if( run_test_snprintf() != 0 )\n    {\n        mbedtls_printf( \"the snprintf implementation is broken\\n\" );\n        mbedtls_exit( MBEDTLS_EXIT_FAILURE );\n    }\n\n    if( argc == 2 && ( strcmp( argv[1], \"--quiet\" ) == 0  ||\n        strcmp( argv[1], \"-q\" ) == 0 ) )\n    {\n        v = 0;\n    }\n    else\n    {\n        v = 1;\n        mbedtls_printf( \"\\n\" );\n    }\n\n#if defined(MBEDTLS_SELF_TEST)\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    mbedtls_memory_buffer_alloc_init( buf, sizeof(buf) );\n#endif\n\n#if defined(MBEDTLS_MD2_C)\n    if( mbedtls_md2_self_test( v )  != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_MD4_C)\n    if( mbedtls_md4_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_MD5_C)\n    if( mbedtls_md5_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_RIPEMD160_C)\n    if( mbedtls_ripemd160_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_SHA1_C)\n    if( mbedtls_sha1_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_SHA256_C)\n    if( mbedtls_sha256_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_SHA512_C)\n    if( mbedtls_sha512_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_ARC4_C)\n    if( mbedtls_arc4_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_DES_C)\n    if( mbedtls_des_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_AES_C)\n    if( mbedtls_aes_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_AES_C)\n    if( mbedtls_gcm_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_AES_C)\n    if( mbedtls_ccm_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_CMAC_C)\n    if( ( mbedtls_cmac_self_test( v ) ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_BASE64_C)\n    if( mbedtls_base64_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_BIGNUM_C)\n    if( mbedtls_mpi_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_RSA_C)\n    if( mbedtls_rsa_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_X509_USE_C)\n    if( mbedtls_x509_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_XTEA_C)\n    if( mbedtls_xtea_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_CAMELLIA_C)\n    if( mbedtls_camellia_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_CTR_DRBG_C)\n    if( mbedtls_ctr_drbg_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_HMAC_DRBG_C)\n    if( mbedtls_hmac_drbg_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_ECP_C)\n    if( mbedtls_ecp_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_ECJPAKE_C)\n    if( mbedtls_ecjpake_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_DHM_C)\n    if( mbedtls_dhm_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_ENTROPY_C)\n\n#if defined(MBEDTLS_ENTROPY_NV_SEED) && !defined(MBEDTLS_NO_PLATFORM_ENTROPY)\n    create_entropy_seed_file();\n#endif\n\n    if( mbedtls_entropy_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#if defined(MBEDTLS_PKCS5_C)\n    if( mbedtls_pkcs5_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n/* Slow tests last */\n\n#if defined(MBEDTLS_TIMING_C)\n    if( mbedtls_timing_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n    if( v != 0 )\n    {\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C) && defined(MBEDTLS_MEMORY_DEBUG)\n        mbedtls_memory_buffer_alloc_status();\n#endif\n    }\n\n#if defined(MBEDTLS_MEMORY_BUFFER_ALLOC_C)\n    mbedtls_memory_buffer_alloc_free();\n    if( mbedtls_memory_buffer_alloc_self_test( v ) != 0 )\n    {\n        suites_failed++;\n    }\n    suites_tested++;\n#endif\n\n#else\n    mbedtls_printf( \" MBEDTLS_SELF_TEST not defined.\\n\" );\n#endif\n\n    if( v != 0 )\n    {\n        mbedtls_printf( \"  Executed %d test suites\\n\\n\", suites_tested );\n\n        if( suites_failed > 0)\n        {\n            mbedtls_printf( \"  [ %d tests FAIL ]\\n\\n\", suites_failed );\n        }\n        else\n        {\n            mbedtls_printf( \"  [ All tests PASS ]\\n\\n\" );\n        }\n#if defined(_WIN32)\n        mbedtls_printf( \"  Press Enter to exit this program.\\n\" );\n        fflush( stdout ); getchar();\n#endif\n    }\n\n    if( suites_failed > 0)\n        mbedtls_exit( MBEDTLS_EXIT_FAILURE );\n\n    /* return() is here to prevent compiler warnings */\n    return( MBEDTLS_EXIT_SUCCESS );\n}\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/test/ssl_cert_test.c",
    "content": "/*\n *  SSL certificate functionality tests\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_snprintf   snprintf\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_X509_CRT_PARSE_C) && \\\n    defined(MBEDTLS_FS_IO) && defined(MBEDTLS_X509_CRL_PARSE_C)\n#include \"mbedtls/certs.h\"\n#include \"mbedtls/x509_crt.h\"\n\n#include <stdio.h>\n#include <string.h>\n#endif\n\n#define MAX_CLIENT_CERTS    8\n\n#if !defined(MBEDTLS_RSA_C) || !defined(MBEDTLS_X509_CRT_PARSE_C) || \\\n    !defined(MBEDTLS_FS_IO) || !defined(MBEDTLS_X509_CRL_PARSE_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_RSA_C and/or MBEDTLS_X509_CRT_PARSE_C \"\n           \"MBEDTLS_FS_IO and/or MBEDTLS_X509_CRL_PARSE_C \"\n           \"not defined.\\n\");\n    return( 0 );\n}\n#else\nconst char *client_certificates[MAX_CLIENT_CERTS] =\n{\n    \"client1.crt\",\n    \"client2.crt\",\n    \"server1.crt\",\n    \"server2.crt\",\n    \"cert_sha224.crt\",\n    \"cert_sha256.crt\",\n    \"cert_sha384.crt\",\n    \"cert_sha512.crt\"\n};\n\nconst char *client_private_keys[MAX_CLIENT_CERTS] =\n{\n    \"client1.key\",\n    \"client2.key\",\n    \"server1.key\",\n    \"server2.key\",\n    \"cert_digest.key\",\n    \"cert_digest.key\",\n    \"cert_digest.key\",\n    \"cert_digest.key\"\n};\n\nint main( void )\n{\n    int ret, i;\n    mbedtls_x509_crt cacert;\n    mbedtls_x509_crl crl;\n    char buf[10240];\n\n    mbedtls_x509_crt_init( &cacert );\n    mbedtls_x509_crl_init( &crl );\n\n    /*\n     * 1.1. Load the trusted CA\n     */\n    mbedtls_printf( \"\\n  . Loading the CA root certificate ...\" );\n    fflush( stdout );\n\n    /*\n     * Alternatively, you may load the CA certificates from a .pem or\n     * .crt file by calling mbedtls_x509_crt_parse_file( &cacert, \"myca.crt\" ).\n     */\n    ret = mbedtls_x509_crt_parse_file( &cacert, \"ssl/test-ca/test-ca.crt\" );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse_file returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    mbedtls_x509_crt_info( buf, 1024, \"CRT: \", &cacert );\n    mbedtls_printf(\"%s\\n\", buf );\n\n    /*\n     * 1.2. Load the CRL\n     */\n    mbedtls_printf( \"  . Loading the CRL ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_x509_crl_parse_file( &crl, \"ssl/test-ca/crl.pem\" );\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crl_parse_file returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    mbedtls_x509_crl_info( buf, 1024, \"CRL: \", &crl );\n    mbedtls_printf(\"%s\\n\", buf );\n\n    for( i = 0; i < MAX_CLIENT_CERTS; i++ )\n    {\n        /*\n         * 1.3. Load own certificate\n         */\n        char    name[512];\n        uint32_t flags;\n        mbedtls_x509_crt clicert;\n        mbedtls_pk_context pk;\n\n        mbedtls_x509_crt_init( &clicert );\n        mbedtls_pk_init( &pk );\n\n        mbedtls_snprintf(name, 512, \"ssl/test-ca/%s\", client_certificates[i]);\n\n        mbedtls_printf( \"  . Loading the client certificate %s...\", name );\n        fflush( stdout );\n\n        ret = mbedtls_x509_crt_parse_file( &clicert, name );\n        if( ret != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse_file returned %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        /*\n         * 1.4. Verify certificate validity with CA certificate\n         */\n        mbedtls_printf( \"  . Verify the client certificate with CA certificate...\" );\n        fflush( stdout );\n\n        ret = mbedtls_x509_crt_verify( &clicert, &cacert, &crl, NULL, &flags, NULL,\n                               NULL );\n        if( ret != 0 )\n        {\n            if( ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED )\n            {\n                 char vrfy_buf[512];\n\n                 mbedtls_printf( \" failed\\n\" );\n                 mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), \"  ! \", flags );\n                 mbedtls_printf( \"%s\\n\", vrfy_buf );\n             }\n             else\n             {\n                mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_verify returned %d\\n\\n\", ret );\n                goto exit;\n            }\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        /*\n         * 1.5. Load own private key\n         */\n        mbedtls_snprintf(name, 512, \"ssl/test-ca/%s\", client_private_keys[i]);\n\n        mbedtls_printf( \"  . Loading the client private key %s...\", name );\n        fflush( stdout );\n\n        ret = mbedtls_pk_parse_keyfile( &pk, name, NULL );\n        if( ret != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_keyfile returned %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        /*\n         * 1.6. Verify certificate validity with private key\n         */\n        mbedtls_printf( \"  . Verify the client certificate with private key...\" );\n        fflush( stdout );\n\n\n        /* EC NOT IMPLEMENTED YET */\n        if( ! mbedtls_pk_can_do( &clicert.pk, MBEDTLS_PK_RSA ) )\n        {\n            mbedtls_printf( \" failed\\n  !  certificate's key is not RSA\\n\\n\" );\n            ret = MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE;\n            goto exit;\n        }\n\n        ret = mbedtls_mpi_cmp_mpi(&mbedtls_pk_rsa( pk )->N, &mbedtls_pk_rsa( clicert.pk )->N);\n        if( ret != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_mpi_cmp_mpi for N returned %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        ret = mbedtls_mpi_cmp_mpi(&mbedtls_pk_rsa( pk )->E, &mbedtls_pk_rsa( clicert.pk )->E);\n        if( ret != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_mpi_cmp_mpi for E returned %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        ret = mbedtls_rsa_check_privkey( mbedtls_pk_rsa( pk ) );\n        if( ret != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_rsa_check_privkey returned %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        mbedtls_x509_crt_free( &clicert );\n        mbedtls_pk_free( &pk );\n    }\n\nexit:\n    mbedtls_x509_crt_free( &cacert );\n    mbedtls_x509_crl_free( &crl );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_RSA_C && MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO &&\n          MBEDTLS_X509_CRL_PARSE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/test/udp_proxy.c",
    "content": "/*\n *  UDP proxy: emulate an unreliable UDP connexion for DTLS testing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n/*\n * Warning: this is an internal utility program we use for tests.\n * It does break some abstractions from the NET layer, and is thus NOT an\n * example of good general usage.\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n#define mbedtls_time       time\n#define mbedtls_time_t     time_t\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_NET_C)\nint main( void )\n{\n    mbedtls_printf( \"MBEDTLS_NET_C not defined.\\n\" );\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/error.h\"\n#include \"mbedtls/ssl.h\"\n\n#include <string.h>\n\n/* For select() */\n#if (defined(_WIN32) || defined(_WIN32_WCE)) && !defined(EFIX64) && \\\n    !defined(EFI32)\n#include <winsock2.h>\n#include <windows.h>\n#if defined(_MSC_VER)\n#if defined(_WIN32_WCE)\n#pragma comment( lib, \"ws2.lib\" )\n#else\n#pragma comment( lib, \"ws2_32.lib\" )\n#endif\n#endif /* _MSC_VER */\n#else /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */\n#include <sys/time.h>\n#include <sys/types.h>\n#include <unistd.h>\n#endif /* ( _WIN32 || _WIN32_WCE ) && !EFIX64 && !EFI32 */\n\n/* For gettimeofday() */\n#if !defined(_WIN32)\n#include <sys/time.h>\n#endif\n\n#define MAX_MSG_SIZE            16384 + 2048 /* max record/datagram size */\n\n#define DFL_SERVER_ADDR         \"localhost\"\n#define DFL_SERVER_PORT         \"4433\"\n#define DFL_LISTEN_ADDR         \"localhost\"\n#define DFL_LISTEN_PORT         \"5556\"\n\n#define USAGE                                                               \\\n    \"\\n usage: udp_proxy param=<>...\\n\"                                     \\\n    \"\\n acceptable parameters:\\n\"                                           \\\n    \"    server_addr=%%s      default: localhost\\n\"                         \\\n    \"    server_port=%%d      default: 4433\\n\"                              \\\n    \"    listen_addr=%%s      default: localhost\\n\"                         \\\n    \"    listen_port=%%d      default: 4433\\n\"                              \\\n    \"\\n\"                                                                    \\\n    \"    duplicate=%%d        default: 0 (no duplication)\\n\"                \\\n    \"                        duplicate about 1:N packets randomly\\n\"        \\\n    \"    delay=%%d            default: 0 (no delayed packets)\\n\"            \\\n    \"                        delay about 1:N packets randomly\\n\"            \\\n    \"    delay_ccs=0/1       default: 0 (don't delay ChangeCipherSpec)\\n\"   \\\n    \"    drop=%%d             default: 0 (no dropped packets)\\n\"            \\\n    \"                        drop about 1:N packets randomly\\n\"             \\\n    \"    mtu=%%d              default: 0 (unlimited)\\n\"                     \\\n    \"                        drop packets larger than N bytes\\n\"            \\\n    \"    bad_ad=0/1          default: 0 (don't add bad ApplicationData)\\n\"  \\\n    \"    protect_hvr=0/1     default: 0 (don't protect HelloVerifyRequest)\\n\" \\\n    \"    protect_len=%%d     default: (don't protect packets of this size)\\n\" \\\n    \"\\n\"                                                                    \\\n    \"    seed=%%d             default: (use current time)\\n\"                \\\n    \"\\n\"\n\n/*\n * global options\n */\nstatic struct options\n{\n    const char *server_addr;    /* address to forward packets to            */\n    const char *server_port;    /* port to forward packets to               */\n    const char *listen_addr;    /* address for accepting client connections */\n    const char *listen_port;    /* port for accepting client connections    */\n\n    int duplicate;              /* duplicate 1 in N packets (none if 0)     */\n    int delay;                  /* delay 1 packet in N (none if 0)          */\n    int delay_ccs;              /* delay ChangeCipherSpec                   */\n    int drop;                   /* drop 1 packet in N (none if 0)           */\n    int mtu;                    /* drop packets larger than this            */\n    int bad_ad;                 /* inject corrupted ApplicationData record  */\n    int protect_hvr;            /* never drop or delay HelloVerifyRequest   */\n    int protect_len;            /* never drop/delay packet of the given size*/\n\n    unsigned int seed;          /* seed for \"random\" events                 */\n} opt;\n\nstatic void exit_usage( const char *name, const char *value )\n{\n    if( value == NULL )\n        mbedtls_printf( \" unknown option or missing value: %s\\n\", name );\n    else\n        mbedtls_printf( \" option %s: illegal value: %s\\n\", name, value );\n\n    mbedtls_printf( USAGE );\n    exit( 1 );\n}\n\nstatic void get_options( int argc, char *argv[] )\n{\n    int i;\n    char *p, *q;\n\n    opt.server_addr    = DFL_SERVER_ADDR;\n    opt.server_port    = DFL_SERVER_PORT;\n    opt.listen_addr    = DFL_LISTEN_ADDR;\n    opt.listen_port    = DFL_LISTEN_PORT;\n    /* Other members default to 0 */\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            exit_usage( p, NULL );\n        *q++ = '\\0';\n\n        if( strcmp( p, \"server_addr\" ) == 0 )\n            opt.server_addr = q;\n        else if( strcmp( p, \"server_port\" ) == 0 )\n            opt.server_port = q;\n        else if( strcmp( p, \"listen_addr\" ) == 0 )\n            opt.listen_addr = q;\n        else if( strcmp( p, \"listen_port\" ) == 0 )\n            opt.listen_port = q;\n        else if( strcmp( p, \"duplicate\" ) == 0 )\n        {\n            opt.duplicate = atoi( q );\n            if( opt.duplicate < 0 || opt.duplicate > 20 )\n                exit_usage( p, q );\n        }\n        else if( strcmp( p, \"delay\" ) == 0 )\n        {\n            opt.delay = atoi( q );\n            if( opt.delay < 0 || opt.delay > 20 || opt.delay == 1 )\n                exit_usage( p, q );\n        }\n        else if( strcmp( p, \"delay_ccs\" ) == 0 )\n        {\n            opt.delay_ccs = atoi( q );\n            if( opt.delay_ccs < 0 || opt.delay_ccs > 1 )\n                exit_usage( p, q );\n        }\n        else if( strcmp( p, \"drop\" ) == 0 )\n        {\n            opt.drop = atoi( q );\n            if( opt.drop < 0 || opt.drop > 20 || opt.drop == 1 )\n                exit_usage( p, q );\n        }\n        else if( strcmp( p, \"mtu\" ) == 0 )\n        {\n            opt.mtu = atoi( q );\n            if( opt.mtu < 0 || opt.mtu > MAX_MSG_SIZE )\n                exit_usage( p, q );\n        }\n        else if( strcmp( p, \"bad_ad\" ) == 0 )\n        {\n            opt.bad_ad = atoi( q );\n            if( opt.bad_ad < 0 || opt.bad_ad > 1 )\n                exit_usage( p, q );\n        }\n        else if( strcmp( p, \"protect_hvr\" ) == 0 )\n        {\n            opt.protect_hvr = atoi( q );\n            if( opt.protect_hvr < 0 || opt.protect_hvr > 1 )\n                exit_usage( p, q );\n        }\n        else if( strcmp( p, \"protect_len\" ) == 0 )\n        {\n            opt.protect_len = atoi( q );\n            if( opt.protect_len < 0 )\n                exit_usage( p, q );\n        }\n        else if( strcmp( p, \"seed\" ) == 0 )\n        {\n            opt.seed = atoi( q );\n            if( opt.seed == 0 )\n                exit_usage( p, q );\n        }\n        else\n            exit_usage( p, NULL );\n    }\n}\n\nstatic const char *msg_type( unsigned char *msg, size_t len )\n{\n    if( len < 1 )                           return( \"Invalid\" );\n    switch( msg[0] )\n    {\n        case MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC:    return( \"ChangeCipherSpec\" );\n        case MBEDTLS_SSL_MSG_ALERT:                 return( \"Alert\" );\n        case MBEDTLS_SSL_MSG_APPLICATION_DATA:      return( \"ApplicationData\" );\n        case MBEDTLS_SSL_MSG_HANDSHAKE:             break; /* See below */\n        default:                            return( \"Unknown\" );\n    }\n\n    if( len < 13 + 12 )                     return( \"Invalid handshake\" );\n\n    /*\n     * Our handshake message are less than 2^16 bytes long, so they should\n     * have 0 as the first byte of length, frag_offset and frag_length.\n     * Otherwise, assume they are encrypted.\n     */\n    if( msg[14] || msg[19] || msg[22] )     return( \"Encrypted handshake\" );\n\n    switch( msg[13] )\n    {\n        case MBEDTLS_SSL_HS_HELLO_REQUEST:          return( \"HelloRequest\" );\n        case MBEDTLS_SSL_HS_CLIENT_HELLO:           return( \"ClientHello\" );\n        case MBEDTLS_SSL_HS_SERVER_HELLO:           return( \"ServerHello\" );\n        case MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST:   return( \"HelloVerifyRequest\" );\n        case MBEDTLS_SSL_HS_NEW_SESSION_TICKET:     return( \"NewSessionTicket\" );\n        case MBEDTLS_SSL_HS_CERTIFICATE:            return( \"Certificate\" );\n        case MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE:    return( \"ServerKeyExchange\" );\n        case MBEDTLS_SSL_HS_CERTIFICATE_REQUEST:    return( \"CertificateRequest\" );\n        case MBEDTLS_SSL_HS_SERVER_HELLO_DONE:      return( \"ServerHelloDone\" );\n        case MBEDTLS_SSL_HS_CERTIFICATE_VERIFY:     return( \"CertificateVerify\" );\n        case MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE:    return( \"ClientKeyExchange\" );\n        case MBEDTLS_SSL_HS_FINISHED:               return( \"Finished\" );\n        default:                            return( \"Unknown handshake\" );\n    }\n}\n\n/* Return elapsed time in milliseconds since the first call */\nstatic unsigned long ellapsed_time( void )\n{\n#if defined(_WIN32)\n    return( 0 );\n#else\n    static struct timeval ref = { 0, 0 };\n    struct timeval now;\n\n    if( ref.tv_sec == 0 && ref.tv_usec == 0 )\n    {\n        gettimeofday( &ref, NULL );\n        return( 0 );\n    }\n\n    gettimeofday( &now, NULL );\n    return( 1000 * ( now.tv_sec  - ref.tv_sec )\n                 + ( now.tv_usec - ref.tv_usec ) / 1000 );\n#endif\n}\n\ntypedef struct\n{\n    mbedtls_net_context *dst;\n    const char *way;\n    const char *type;\n    unsigned len;\n    unsigned char buf[MAX_MSG_SIZE];\n} packet;\n\n/* Print packet. Outgoing packets come with a reason (forward, dupl, etc.) */\nvoid print_packet( const packet *p, const char *why )\n{\n    if( why == NULL )\n        mbedtls_printf( \"  %05lu %s %s (%u bytes)\\n\",\n                ellapsed_time(), p->way, p->type, p->len );\n    else\n        mbedtls_printf( \"        %s %s (%u bytes): %s\\n\",\n                p->way, p->type, p->len, why );\n    fflush( stdout );\n}\n\nint send_packet( const packet *p, const char *why )\n{\n    int ret;\n    mbedtls_net_context *dst = p->dst;\n\n    /* insert corrupted ApplicationData record? */\n    if( opt.bad_ad &&\n        strcmp( p->type, \"ApplicationData\" ) == 0 )\n    {\n        unsigned char buf[MAX_MSG_SIZE];\n        memcpy( buf, p->buf, p->len );\n        ++buf[p->len - 1];\n\n        print_packet( p, \"corrupted\" );\n        if( ( ret = mbedtls_net_send( dst, buf, p->len ) ) <= 0 )\n        {\n            mbedtls_printf( \"  ! mbedtls_net_send returned %d\\n\", ret );\n            return( ret );\n        }\n    }\n\n    print_packet( p, why );\n    if( ( ret = mbedtls_net_send( dst, p->buf, p->len ) ) <= 0 )\n    {\n        mbedtls_printf( \"  ! mbedtls_net_send returned %d\\n\", ret );\n        return( ret );\n    }\n\n    /* Don't duplicate Application Data, only handshake covered */\n    if( opt.duplicate != 0 &&\n        strcmp( p->type, \"ApplicationData\" ) != 0 &&\n        rand() % opt.duplicate == 0 )\n    {\n        print_packet( p, \"duplicated\" );\n\n        if( ( ret = mbedtls_net_send( dst, p->buf, p->len ) ) <= 0 )\n        {\n            mbedtls_printf( \"  ! mbedtls_net_send returned %d\\n\", ret );\n            return( ret );\n        }\n    }\n\n    return( 0 );\n}\n\nstatic packet prev;\n\nvoid clear_pending( void )\n{\n    memset( &prev, 0, sizeof( packet ) );\n}\n\n/*\n * Avoid dropping or delaying a packet that was already dropped twice: this\n * only results in uninteresting timeouts. We can't rely on type to identify\n * packets, since during renegotiation they're all encrypted.  So, rely on\n * size mod 2048 (which is usually just size).\n */\nstatic unsigned char dropped[2048] = { 0 };\n#define DROP_MAX 2\n\n/*\n * OpenSSL groups packets in a datagram the first time it sends them, but not\n * when it resends them. Count every record as seen the first time.\n */\nvoid update_dropped( const packet *p )\n{\n    size_t id = p->len % sizeof( dropped );\n    const unsigned char *end = p->buf + p->len;\n    const unsigned char *cur = p->buf;\n    size_t len = ( ( cur[11] << 8 ) | cur[12] ) + 13;\n\n    ++dropped[id];\n\n    /* Avoid counting single record twice */\n    if( len == p->len )\n        return;\n\n    while( cur < end )\n    {\n        len = ( ( cur[11] << 8 ) | cur[12] ) + 13;\n\n        id = len % sizeof( dropped );\n        ++dropped[id];\n\n        cur += len;\n    }\n}\n\nint handle_message( const char *way,\n                    mbedtls_net_context *dst,\n                    mbedtls_net_context *src )\n{\n    int ret;\n    packet cur;\n    size_t id;\n\n    /* receive packet */\n    if( ( ret = mbedtls_net_recv( src, cur.buf, sizeof( cur.buf ) ) ) <= 0 )\n    {\n        mbedtls_printf( \"  ! mbedtls_net_recv returned %d\\n\", ret );\n        return( ret );\n    }\n\n    cur.len  = ret;\n    cur.type = msg_type( cur.buf, cur.len );\n    cur.way  = way;\n    cur.dst  = dst;\n    print_packet( &cur, NULL );\n\n    id = cur.len % sizeof( dropped );\n\n    /* do we want to drop, delay, or forward it? */\n    if( ( opt.mtu != 0 &&\n          cur.len > (unsigned) opt.mtu ) ||\n        ( opt.drop != 0 &&\n          strcmp( cur.type, \"ApplicationData\" ) != 0 &&\n          ! ( opt.protect_hvr &&\n              strcmp( cur.type, \"HelloVerifyRequest\" ) == 0 ) &&\n          cur.len != (size_t) opt.protect_len &&\n          dropped[id] < DROP_MAX &&\n          rand() % opt.drop == 0 ) )\n    {\n        update_dropped( &cur );\n    }\n    else if( ( opt.delay_ccs == 1 &&\n               strcmp( cur.type, \"ChangeCipherSpec\" ) == 0 ) ||\n             ( opt.delay != 0 &&\n               strcmp( cur.type, \"ApplicationData\" ) != 0 &&\n               ! ( opt.protect_hvr &&\n                   strcmp( cur.type, \"HelloVerifyRequest\" ) == 0 ) &&\n               prev.dst == NULL &&\n               cur.len != (size_t) opt.protect_len &&\n               dropped[id] < DROP_MAX &&\n               rand() % opt.delay == 0 ) )\n    {\n        memcpy( &prev, &cur, sizeof( packet ) );\n    }\n    else\n    {\n        /* forward and possibly duplicate */\n        if( ( ret = send_packet( &cur, \"forwarded\" ) ) != 0 )\n            return( ret );\n\n        /* send previously delayed message if any */\n        if( prev.dst != NULL )\n        {\n            ret = send_packet( &prev, \"delayed\" );\n            memset( &prev, 0, sizeof( packet ) );\n            if( ret != 0 )\n                return( ret );\n        }\n    }\n\n    return( 0 );\n}\n\nint main( int argc, char *argv[] )\n{\n    int ret;\n\n    mbedtls_net_context listen_fd, client_fd, server_fd;\n\n    int nb_fds;\n    fd_set read_fds;\n\n    mbedtls_net_init( &listen_fd );\n    mbedtls_net_init( &client_fd );\n    mbedtls_net_init( &server_fd );\n\n    get_options( argc, argv );\n\n    /*\n     * Decisions to drop/delay/duplicate packets are pseudo-random: dropping\n     * exactly 1 in N packets would lead to problems when a flight has exactly\n     * N packets: the same packet would be dropped on every resend.\n     *\n     * In order to be able to reproduce problems reliably, the seed may be\n     * specified explicitly.\n     */\n    if( opt.seed == 0 )\n    {\n        opt.seed = (unsigned int) time( NULL );\n        mbedtls_printf( \"  . Pseudo-random seed: %u\\n\", opt.seed );\n    }\n\n    srand( opt.seed );\n\n    /*\n     * 0. \"Connect\" to the server\n     */\n    mbedtls_printf( \"  . Connect to server on UDP/%s/%s ...\",\n            opt.server_addr, opt.server_port );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_connect( &server_fd, opt.server_addr, opt.server_port,\n                             MBEDTLS_NET_PROTO_UDP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_connect returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1. Setup the \"listening\" UDP socket\n     */\n    mbedtls_printf( \"  . Bind on UDP/%s/%s ...\",\n            opt.listen_addr, opt.listen_port );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_bind( &listen_fd, opt.listen_addr, opt.listen_port,\n                          MBEDTLS_NET_PROTO_UDP ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_bind returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 2. Wait until a client connects\n     */\naccept:\n    mbedtls_net_free( &client_fd );\n\n    mbedtls_printf( \"  . Waiting for a remote connection ...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_net_accept( &listen_fd, &client_fd,\n                                    NULL, 0, NULL ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  ! mbedtls_net_accept returned %d\\n\\n\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 3. Forward packets forever (kill the process to terminate it)\n     */\n    clear_pending();\n    memset( dropped, 0, sizeof( dropped ) );\n\n    nb_fds = client_fd.fd;\n    if( nb_fds < server_fd.fd )\n        nb_fds = server_fd.fd;\n    if( nb_fds < listen_fd.fd )\n        nb_fds = listen_fd.fd;\n    ++nb_fds;\n\n    while( 1 )\n    {\n        FD_ZERO( &read_fds );\n        FD_SET( server_fd.fd, &read_fds );\n        FD_SET( client_fd.fd, &read_fds );\n        FD_SET( listen_fd.fd, &read_fds );\n\n        if( ( ret = select( nb_fds, &read_fds, NULL, NULL, NULL ) ) <= 0 )\n        {\n            perror( \"select\" );\n            goto exit;\n        }\n\n        if( FD_ISSET( listen_fd.fd, &read_fds ) )\n            goto accept;\n\n        if( FD_ISSET( client_fd.fd, &read_fds ) )\n        {\n            if( ( ret = handle_message( \"S <- C\",\n                                        &server_fd, &client_fd ) ) != 0 )\n                goto accept;\n        }\n\n        if( FD_ISSET( server_fd.fd, &read_fds ) )\n        {\n            if( ( ret = handle_message( \"S -> C\",\n                                        &client_fd, &server_fd ) ) != 0 )\n                goto accept;\n        }\n    }\n\nexit:\n\n#ifdef MBEDTLS_ERROR_C\n    if( ret != 0 )\n    {\n        char error_buf[100];\n        mbedtls_strerror( ret, error_buf, 100 );\n        mbedtls_printf( \"Last error was: -0x%04X - %s\\n\\n\", - ret, error_buf );\n        fflush( stdout );\n    }\n#endif\n\n    mbedtls_net_free( &client_fd );\n    mbedtls_net_free( &server_fd );\n    mbedtls_net_free( &listen_fd );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret != 0 );\n}\n\n#endif /* MBEDTLS_NET_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/util/CMakeLists.txt",
    "content": "set(libs\n    mbedtls\n)\n\nadd_executable(strerror strerror.c)\ntarget_link_libraries(strerror ${libs})\n\nadd_executable(pem2der pem2der.c)\ntarget_link_libraries(pem2der ${libs})\n\ninstall(TARGETS strerror pem2der\n        DESTINATION \"bin\"\n        PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/util/pem2der.c",
    "content": "/*\n *  Convert PEM to DER\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_free       free\n#define mbedtls_calloc    calloc\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_BASE64_C) && defined(MBEDTLS_FS_IO)\n#include \"mbedtls/error.h\"\n#include \"mbedtls/base64.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#endif\n\n#define DFL_FILENAME            \"file.pem\"\n#define DFL_OUTPUT_FILENAME     \"file.der\"\n\n#define USAGE \\\n    \"\\n usage: pem2der param=<>...\\n\"                   \\\n    \"\\n acceptable parameters:\\n\"                       \\\n    \"    filename=%%s         default: file.pem\\n\"      \\\n    \"    output_file=%%s      default: file.der\\n\"      \\\n    \"\\n\"\n\n#if !defined(MBEDTLS_BASE64_C) || !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BASE64_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\n/*\n * global options\n */\nstruct options\n{\n    const char *filename;       /* filename of the input file             */\n    const char *output_file;    /* where to store the output              */\n} opt;\n\nint convert_pem_to_der( const unsigned char *input, size_t ilen,\n                        unsigned char *output, size_t *olen )\n{\n    int ret;\n    const unsigned char *s1, *s2, *end = input + ilen;\n    size_t len = 0;\n\n    s1 = (unsigned char *) strstr( (const char *) input, \"-----BEGIN\" );\n    if( s1 == NULL )\n        return( -1 );\n\n    s2 = (unsigned char *) strstr( (const char *) input, \"-----END\" );\n    if( s2 == NULL )\n        return( -1 );\n\n    s1 += 10;\n    while( s1 < end && *s1 != '-' )\n        s1++;\n    while( s1 < end && *s1 == '-' )\n        s1++;\n    if( *s1 == '\\r' ) s1++;\n    if( *s1 == '\\n' ) s1++;\n\n    if( s2 <= s1 || s2 > end )\n        return( -1 );\n\n    ret = mbedtls_base64_decode( NULL, 0, &len, (const unsigned char *) s1, s2 - s1 );\n    if( ret == MBEDTLS_ERR_BASE64_INVALID_CHARACTER )\n        return( ret );\n\n    if( len > *olen )\n        return( -1 );\n\n    if( ( ret = mbedtls_base64_decode( output, len, &len, (const unsigned char *) s1,\n                               s2 - s1 ) ) != 0 )\n    {\n        return( ret );\n    }\n\n    *olen = len;\n\n    return( 0 );\n}\n\n/*\n * Load all data from a file into a given buffer.\n */\nstatic int load_file( const char *path, unsigned char **buf, size_t *n )\n{\n    FILE *f;\n    long size;\n\n    if( ( f = fopen( path, \"rb\" ) ) == NULL )\n        return( -1 );\n\n    fseek( f, 0, SEEK_END );\n    if( ( size = ftell( f ) ) == -1 )\n    {\n        fclose( f );\n        return( -1 );\n    }\n    fseek( f, 0, SEEK_SET );\n\n    *n = (size_t) size;\n\n    if( *n + 1 == 0 ||\n        ( *buf = mbedtls_calloc( 1, *n + 1 ) ) == NULL )\n    {\n        fclose( f );\n        return( -1 );\n    }\n\n    if( fread( *buf, 1, *n, f ) != *n )\n    {\n        fclose( f );\n        free( *buf );\n        *buf = NULL;\n        return( -1 );\n    }\n\n    fclose( f );\n\n    (*buf)[*n] = '\\0';\n\n    return( 0 );\n}\n\n/*\n * Write buffer to a file\n */\nstatic int write_file( const char *path, unsigned char *buf, size_t n )\n{\n    FILE *f;\n\n    if( ( f = fopen( path, \"wb\" ) ) == NULL )\n        return( -1 );\n\n    if( fwrite( buf, 1, n, f ) != n )\n    {\n        fclose( f );\n        return( -1 );\n    }\n\n    fclose( f );\n    return( 0 );\n}\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0;\n    unsigned char *pem_buffer = NULL;\n    unsigned char der_buffer[4096];\n    char buf[1024];\n    size_t pem_size, der_size = sizeof(der_buffer);\n    int i;\n    char *p, *q;\n\n    /*\n     * Set to sane values\n     */\n    memset( buf, 0, sizeof(buf) );\n    memset( der_buffer, 0, sizeof(der_buffer) );\n\n    if( argc == 0 )\n    {\n    usage:\n        mbedtls_printf( USAGE );\n        goto exit;\n    }\n\n    opt.filename            = DFL_FILENAME;\n    opt.output_file         = DFL_OUTPUT_FILENAME;\n\n    for( i = 1; i < argc; i++ )\n    {\n\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"filename\" ) == 0 )\n            opt.filename = q;\n        else if( strcmp( p, \"output_file\" ) == 0 )\n            opt.output_file = q;\n        else\n            goto usage;\n    }\n\n    /*\n     * 1.1. Load the PEM file\n     */\n    mbedtls_printf( \"\\n  . Loading the PEM file ...\" );\n    fflush( stdout );\n\n    ret = load_file( opt.filename, &pem_buffer, &pem_size );\n\n    if( ret != 0 )\n    {\n#ifdef MBEDTLS_ERROR_C\n        mbedtls_strerror( ret, buf, 1024 );\n#endif\n        mbedtls_printf( \" failed\\n  !  load_file returned %d - %s\\n\\n\", ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1.2. Convert from PEM to DER\n     */\n    mbedtls_printf( \"  . Converting from PEM to DER ...\" );\n    fflush( stdout );\n\n    if( ( ret = convert_pem_to_der( pem_buffer, pem_size, der_buffer, &der_size ) ) != 0 )\n    {\n#ifdef MBEDTLS_ERROR_C\n        mbedtls_strerror( ret, buf, 1024 );\n#endif\n        mbedtls_printf( \" failed\\n  !  convert_pem_to_der %d - %s\\n\\n\", ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1.3. Write the DER file\n     */\n    mbedtls_printf( \"  . Writing the DER file ...\" );\n    fflush( stdout );\n\n    ret = write_file( opt.output_file, der_buffer, der_size );\n\n    if( ret != 0 )\n    {\n#ifdef MBEDTLS_ERROR_C\n        mbedtls_strerror( ret, buf, 1024 );\n#endif\n        mbedtls_printf( \" failed\\n  !  write_file returned %d - %s\\n\\n\", ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\nexit:\n    free( pem_buffer );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BASE64_C && MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/util/strerror.c",
    "content": "/*\n *  Translate error code to error string\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY)\n#include \"mbedtls/error.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#endif\n\n#define USAGE \\\n    \"\\n usage: strerror <errorcode>\\n\" \\\n    \"\\n where <errorcode> can be a decimal or hexadecimal (starts with 0x or -0x)\\n\"\n\n#if !defined(MBEDTLS_ERROR_C) && !defined(MBEDTLS_ERROR_STRERROR_DUMMY)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_ERROR_C and/or MBEDTLS_ERROR_STRERROR_DUMMY not defined.\\n\");\n    return( 0 );\n}\n#else\nint main( int argc, char *argv[] )\n{\n    long int val;\n    char *end = argv[1];\n\n    if( argc != 2 )\n    {\n        mbedtls_printf( USAGE );\n        return( 0 );\n    }\n\n    val = strtol( argv[1], &end, 10 );\n    if( *end != '\\0' )\n    {\n        val = strtol( argv[1], &end, 16 );\n        if( *end != '\\0' )\n        {\n            mbedtls_printf( USAGE );\n            return( 0 );\n        }\n    }\n    if( val > 0 )\n        val = -val;\n\n    if( val != 0 )\n    {\n        char error_buf[200];\n        mbedtls_strerror( val, error_buf, 200 );\n        mbedtls_printf(\"Last error was: -0x%04x - %s\\n\\n\", (int) -val, error_buf );\n    }\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( val );\n}\n#endif /* MBEDTLS_ERROR_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/wince_main.c",
    "content": "/*\n *  Windows CE console application entry point\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if defined(_WIN32_WCE)\n\n#include <windows.h>\n\nextern int main( int, const char ** );\n\nint _tmain( int argc, _TCHAR* targv[] )\n{\n    char **argv;\n    int i;\n\n    argv = ( char ** ) calloc( argc, sizeof( char * ) );\n\n    for ( i = 0; i < argc; i++ ) {\n        size_t len;\n        len = _tcslen( targv[i] ) + 1;\n        argv[i] = ( char * ) calloc( len, sizeof( char ) );\n        wcstombs( argv[i], targv[i], len );\n    }\n\n    return main( argc, argv );\n}\n\n#endif  /* defined(_WIN32_WCE) */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/x509/CMakeLists.txt",
    "content": "set(libs\n    mbedtls\n)\n\nif(USE_PKCS11_HELPER_LIBRARY)\n    set(libs ${libs} pkcs11-helper)\nendif(USE_PKCS11_HELPER_LIBRARY)\n\nif(ENABLE_ZLIB_SUPPORT)\n    set(libs ${libs} ${ZLIB_LIBRARIES})\nendif(ENABLE_ZLIB_SUPPORT)\n\nadd_executable(cert_app cert_app.c)\ntarget_link_libraries(cert_app ${libs})\n\nadd_executable(crl_app crl_app.c)\ntarget_link_libraries(crl_app ${libs})\n\nadd_executable(req_app req_app.c)\ntarget_link_libraries(req_app ${libs})\n\nadd_executable(cert_req cert_req.c)\ntarget_link_libraries(cert_req ${libs})\n\nadd_executable(cert_write cert_write.c)\ntarget_link_libraries(cert_write ${libs})\n\ninstall(TARGETS cert_app crl_app req_app cert_req cert_write\n        DESTINATION \"bin\"\n        PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/x509/cert_app.c",
    "content": "/*\n *  Certificate reading application\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#include <stdlib.h>\n#define mbedtls_time       time\n#define mbedtls_time_t     time_t\n#define mbedtls_fprintf    fprintf\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_ENTROPY_C) ||  \\\n    !defined(MBEDTLS_SSL_TLS_C) || !defined(MBEDTLS_SSL_CLI_C) || \\\n    !defined(MBEDTLS_NET_C) || !defined(MBEDTLS_RSA_C) ||         \\\n    !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_FS_IO) ||  \\\n    !defined(MBEDTLS_CTR_DRBG_C)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_ENTROPY_C and/or \"\n           \"MBEDTLS_SSL_TLS_C and/or MBEDTLS_SSL_CLI_C and/or \"\n           \"MBEDTLS_NET_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_X509_CRT_PARSE_C and/or MBEDTLS_FS_IO and/or \"\n           \"MBEDTLS_CTR_DRBG_C not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/net_sockets.h\"\n#include \"mbedtls/ssl.h\"\n#include \"mbedtls/x509.h\"\n#include \"mbedtls/debug.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#define MODE_NONE               0\n#define MODE_FILE               1\n#define MODE_SSL                2\n\n#define DFL_MODE                MODE_NONE\n#define DFL_FILENAME            \"cert.crt\"\n#define DFL_CA_FILE             \"\"\n#define DFL_CRL_FILE            \"\"\n#define DFL_CA_PATH             \"\"\n#define DFL_SERVER_NAME         \"localhost\"\n#define DFL_SERVER_PORT         \"4433\"\n#define DFL_DEBUG_LEVEL         0\n#define DFL_PERMISSIVE          0\n\n#define USAGE_IO \\\n    \"    ca_file=%%s          The single file containing the top-level CA(s) you fully trust\\n\" \\\n    \"                        default: \\\"\\\" (none)\\n\" \\\n    \"    crl_file=%%s         The single CRL file you want to use\\n\" \\\n    \"                        default: \\\"\\\" (none)\\n\" \\\n    \"    ca_path=%%s          The path containing the top-level CA(s) you fully trust\\n\" \\\n    \"                        default: \\\"\\\" (none) (overrides ca_file)\\n\"\n\n#define USAGE \\\n    \"\\n usage: cert_app param=<>...\\n\"                  \\\n    \"\\n acceptable parameters:\\n\"                       \\\n    \"    mode=file|ssl       default: none\\n\"           \\\n    \"    filename=%%s         default: cert.crt\\n\"      \\\n    USAGE_IO                                            \\\n    \"    server_name=%%s      default: localhost\\n\"     \\\n    \"    server_port=%%d      default: 4433\\n\"          \\\n    \"    debug_level=%%d      default: 0 (disabled)\\n\"  \\\n    \"    permissive=%%d       default: 0 (disabled)\\n\"  \\\n    \"\\n\"\n\n/*\n * global options\n */\nstruct options\n{\n    int mode;                   /* the mode to run the application in   */\n    const char *filename;       /* filename of the certificate file     */\n    const char *ca_file;        /* the file with the CA certificate(s)  */\n    const char *crl_file;       /* the file with the CRL to use         */\n    const char *ca_path;        /* the path with the CA certificate(s) reside */\n    const char *server_name;    /* hostname of the server (client only) */\n    const char *server_port;    /* port on which the ssl service runs   */\n    int debug_level;            /* level of debugging                   */\n    int permissive;             /* permissive parsing                   */\n} opt;\n\nstatic void my_debug( void *ctx, int level,\n                      const char *file, int line,\n                      const char *str )\n{\n    ((void) level);\n\n    mbedtls_fprintf( (FILE *) ctx, \"%s:%04d: %s\", file, line, str );\n    fflush(  (FILE *) ctx  );\n}\n\nstatic int my_verify( void *data, mbedtls_x509_crt *crt, int depth, uint32_t *flags )\n{\n    char buf[1024];\n    ((void) data);\n\n    mbedtls_printf( \"\\nVerify requested for (Depth %d):\\n\", depth );\n    mbedtls_x509_crt_info( buf, sizeof( buf ) - 1, \"\", crt );\n    mbedtls_printf( \"%s\", buf );\n\n    if ( ( *flags ) == 0 )\n        mbedtls_printf( \"  This certificate has no flags\\n\" );\n    else\n    {\n        mbedtls_x509_crt_verify_info( buf, sizeof( buf ), \"  ! \", *flags );\n        mbedtls_printf( \"%s\\n\", buf );\n    }\n\n    return( 0 );\n}\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0;\n    mbedtls_net_context server_fd;\n    unsigned char buf[1024];\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    mbedtls_ssl_context ssl;\n    mbedtls_ssl_config conf;\n    mbedtls_x509_crt cacert;\n    mbedtls_x509_crl cacrl;\n    int i, j;\n    uint32_t flags;\n    int verify = 0;\n    char *p, *q;\n    const char *pers = \"cert_app\";\n\n    /*\n     * Set to sane values\n     */\n    mbedtls_net_init( &server_fd );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n    mbedtls_ssl_init( &ssl );\n    mbedtls_ssl_config_init( &conf );\n    mbedtls_x509_crt_init( &cacert );\n#if defined(MBEDTLS_X509_CRL_PARSE_C)\n    mbedtls_x509_crl_init( &cacrl );\n#else\n    /* Zeroize structure as CRL parsing is not supported and we have to pass\n       it to the verify function */\n    memset( &cacrl, 0, sizeof(mbedtls_x509_crl) );\n#endif\n\n    if( argc == 0 )\n    {\n    usage:\n        mbedtls_printf( USAGE );\n        ret = 2;\n        goto exit;\n    }\n\n    opt.mode                = DFL_MODE;\n    opt.filename            = DFL_FILENAME;\n    opt.ca_file             = DFL_CA_FILE;\n    opt.crl_file            = DFL_CRL_FILE;\n    opt.ca_path             = DFL_CA_PATH;\n    opt.server_name         = DFL_SERVER_NAME;\n    opt.server_port         = DFL_SERVER_PORT;\n    opt.debug_level         = DFL_DEBUG_LEVEL;\n    opt.permissive          = DFL_PERMISSIVE;\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        for( j = 0; p + j < q; j++ )\n        {\n            if( argv[i][j] >= 'A' && argv[i][j] <= 'Z' )\n                argv[i][j] |= 0x20;\n        }\n\n        if( strcmp( p, \"mode\" ) == 0 )\n        {\n            if( strcmp( q, \"file\" ) == 0 )\n                opt.mode = MODE_FILE;\n            else if( strcmp( q, \"ssl\" ) == 0 )\n                opt.mode = MODE_SSL;\n            else\n                goto usage;\n        }\n        else if( strcmp( p, \"filename\" ) == 0 )\n            opt.filename = q;\n        else if( strcmp( p, \"ca_file\" ) == 0 )\n            opt.ca_file = q;\n        else if( strcmp( p, \"crl_file\" ) == 0 )\n            opt.crl_file = q;\n        else if( strcmp( p, \"ca_path\" ) == 0 )\n            opt.ca_path = q;\n        else if( strcmp( p, \"server_name\" ) == 0 )\n            opt.server_name = q;\n        else if( strcmp( p, \"server_port\" ) == 0 )\n            opt.server_port = q;\n        else if( strcmp( p, \"debug_level\" ) == 0 )\n        {\n            opt.debug_level = atoi( q );\n            if( opt.debug_level < 0 || opt.debug_level > 65535 )\n                goto usage;\n        }\n        else if( strcmp( p, \"permissive\" ) == 0 )\n        {\n            opt.permissive = atoi( q );\n            if( opt.permissive < 0 || opt.permissive > 1 )\n                goto usage;\n        }\n        else\n            goto usage;\n    }\n\n    /*\n     * 1.1. Load the trusted CA\n     */\n    mbedtls_printf( \"  . Loading the CA root certificate ...\" );\n    fflush( stdout );\n\n    if( strlen( opt.ca_path ) )\n    {\n        ret = mbedtls_x509_crt_parse_path( &cacert, opt.ca_path );\n        verify = 1;\n    }\n    else if( strlen( opt.ca_file ) )\n    {\n        ret = mbedtls_x509_crt_parse_file( &cacert, opt.ca_file );\n        verify = 1;\n    }\n\n    if( ret < 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse returned -0x%x\\n\\n\", -ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok (%d skipped)\\n\", ret );\n\n#if defined(MBEDTLS_X509_CRL_PARSE_C)\n    if( strlen( opt.crl_file ) )\n    {\n        if( ( ret = mbedtls_x509_crl_parse_file( &cacrl, opt.crl_file ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_crl_parse returned -0x%x\\n\\n\", -ret );\n            goto exit;\n        }\n\n        verify = 1;\n    }\n#endif\n\n    if( opt.mode == MODE_FILE )\n    {\n        mbedtls_x509_crt crt;\n        mbedtls_x509_crt *cur = &crt;\n        mbedtls_x509_crt_init( &crt );\n\n        /*\n         * 1.1. Load the certificate(s)\n         */\n        mbedtls_printf( \"\\n  . Loading the certificate(s) ...\" );\n        fflush( stdout );\n\n        ret = mbedtls_x509_crt_parse_file( &crt, opt.filename );\n\n        if( ret < 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse_file returned %d\\n\\n\", ret );\n            mbedtls_x509_crt_free( &crt );\n            goto exit;\n        }\n\n        if( opt.permissive == 0 && ret > 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse failed to parse %d certificates\\n\\n\", ret );\n            mbedtls_x509_crt_free( &crt );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        /*\n         * 1.2 Print the certificate(s)\n         */\n        while( cur != NULL )\n        {\n            mbedtls_printf( \"  . Peer certificate information    ...\\n\" );\n            ret = mbedtls_x509_crt_info( (char *) buf, sizeof( buf ) - 1, \"      \",\n                                 cur );\n            if( ret == -1 )\n            {\n                mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_info returned %d\\n\\n\", ret );\n                mbedtls_x509_crt_free( &crt );\n                goto exit;\n            }\n\n            mbedtls_printf( \"%s\\n\", buf );\n\n            cur = cur->next;\n        }\n\n        ret = 0;\n\n        /*\n         * 1.3 Verify the certificate\n         */\n        if( verify )\n        {\n            mbedtls_printf( \"  . Verifying X.509 certificate...\" );\n\n            if( ( ret = mbedtls_x509_crt_verify( &crt, &cacert, &cacrl, NULL, &flags,\n                                         my_verify, NULL ) ) != 0 )\n            {\n                char vrfy_buf[512];\n\n                mbedtls_printf( \" failed\\n\" );\n\n                mbedtls_x509_crt_verify_info( vrfy_buf, sizeof( vrfy_buf ), \"  ! \", flags );\n\n                mbedtls_printf( \"%s\\n\", vrfy_buf );\n            }\n            else\n                mbedtls_printf( \" ok\\n\" );\n        }\n\n        mbedtls_x509_crt_free( &crt );\n    }\n    else if( opt.mode == MODE_SSL )\n    {\n        /*\n         * 1. Initialize the RNG and the session data\n         */\n        mbedtls_printf( \"\\n  . Seeding the random number generator...\" );\n        fflush( stdout );\n\n        mbedtls_entropy_init( &entropy );\n        if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                                   (const unsigned char *) pers,\n                                   strlen( pers ) ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ctr_drbg_seed returned %d\\n\", ret );\n            goto ssl_exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n#if defined(MBEDTLS_DEBUG_C)\n        mbedtls_debug_set_threshold( opt.debug_level );\n#endif\n\n        /*\n         * 2. Start the connection\n         */\n        mbedtls_printf( \"  . SSL connection to tcp/%s/%s...\", opt.server_name,\n                                                              opt.server_port );\n        fflush( stdout );\n\n        if( ( ret = mbedtls_net_connect( &server_fd, opt.server_name,\n                                 opt.server_port, MBEDTLS_NET_PROTO_TCP ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_net_connect returned %d\\n\\n\", ret );\n            goto ssl_exit;\n        }\n\n        /*\n         * 3. Setup stuff\n         */\n        if( ( ret = mbedtls_ssl_config_defaults( &conf,\n                        MBEDTLS_SSL_IS_CLIENT,\n                        MBEDTLS_SSL_TRANSPORT_STREAM,\n                        MBEDTLS_SSL_PRESET_DEFAULT ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_config_defaults returned %d\\n\\n\", ret );\n            goto exit;\n        }\n\n        if( verify )\n        {\n            mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_REQUIRED );\n            mbedtls_ssl_conf_ca_chain( &conf, &cacert, NULL );\n            mbedtls_ssl_conf_verify( &conf, my_verify, NULL );\n        }\n        else\n            mbedtls_ssl_conf_authmode( &conf, MBEDTLS_SSL_VERIFY_NONE );\n\n        mbedtls_ssl_conf_rng( &conf, mbedtls_ctr_drbg_random, &ctr_drbg );\n        mbedtls_ssl_conf_dbg( &conf, my_debug, stdout );\n\n        if( ( ret = mbedtls_ssl_setup( &ssl, &conf ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_setup returned %d\\n\\n\", ret );\n            goto ssl_exit;\n        }\n\n        if( ( ret = mbedtls_ssl_set_hostname( &ssl, opt.server_name ) ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  ! mbedtls_ssl_set_hostname returned %d\\n\\n\", ret );\n            goto ssl_exit;\n        }\n\n        mbedtls_ssl_set_bio( &ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL );\n\n        /*\n         * 4. Handshake\n         */\n        while( ( ret = mbedtls_ssl_handshake( &ssl ) ) != 0 )\n        {\n            if( ret != MBEDTLS_ERR_SSL_WANT_READ && ret != MBEDTLS_ERR_SSL_WANT_WRITE )\n            {\n                mbedtls_printf( \" failed\\n  ! mbedtls_ssl_handshake returned %d\\n\\n\", ret );\n                goto ssl_exit;\n            }\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n\n        /*\n         * 5. Print the certificate\n         */\n        mbedtls_printf( \"  . Peer certificate information    ...\\n\" );\n        ret = mbedtls_x509_crt_info( (char *) buf, sizeof( buf ) - 1, \"      \",\n                             ssl.session->peer_cert );\n        if( ret == -1 )\n        {\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_info returned %d\\n\\n\", ret );\n            goto ssl_exit;\n        }\n\n        mbedtls_printf( \"%s\\n\", buf );\n\n        mbedtls_ssl_close_notify( &ssl );\n\nssl_exit:\n        mbedtls_ssl_free( &ssl );\n        mbedtls_ssl_config_free( &conf );\n    }\n    else\n        goto usage;\n\nexit:\n\n    mbedtls_net_free( &server_fd );\n    mbedtls_x509_crt_free( &cacert );\n#if defined(MBEDTLS_X509_CRL_PARSE_C)\n    mbedtls_x509_crl_free( &cacrl );\n#endif\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    if( ret < 0 )\n        ret = 1;\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_ENTROPY_C && MBEDTLS_SSL_TLS_C &&\n          MBEDTLS_SSL_CLI_C && MBEDTLS_NET_C && MBEDTLS_RSA_C &&\n          MBEDTLS_X509_CRT_PARSE_C && MBEDTLS_FS_IO && MBEDTLS_CTR_DRBG_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/x509/cert_req.c",
    "content": "/*\n *  Certificate request generation\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_X509_CSR_WRITE_C) || !defined(MBEDTLS_FS_IO) ||  \\\n    !defined(MBEDTLS_PK_PARSE_C) || !defined(MBEDTLS_SHA256_C) || \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_CTR_DRBG_C) || \\\n    !defined(MBEDTLS_PEM_WRITE_C)\nint main( void )\n{\n    mbedtls_printf( \"MBEDTLS_X509_CSR_WRITE_C and/or MBEDTLS_FS_IO and/or \"\n            \"MBEDTLS_PK_PARSE_C and/or MBEDTLS_SHA256_C and/or \"\n            \"MBEDTLS_ENTROPY_C and/or MBEDTLS_CTR_DRBG_C \"\n            \"not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/x509_csr.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/error.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#define DFL_FILENAME            \"keyfile.key\"\n#define DFL_DEBUG_LEVEL         0\n#define DFL_OUTPUT_FILENAME     \"cert.req\"\n#define DFL_SUBJECT_NAME        \"CN=Cert,O=mbed TLS,C=UK\"\n#define DFL_KEY_USAGE           0\n#define DFL_NS_CERT_TYPE        0\n\n#define USAGE \\\n    \"\\n usage: cert_req param=<>...\\n\"                  \\\n    \"\\n acceptable parameters:\\n\"                       \\\n    \"    filename=%%s         default: keyfile.key\\n\"   \\\n    \"    debug_level=%%d      default: 0 (disabled)\\n\"  \\\n    \"    output_file=%%s      default: cert.req\\n\"      \\\n    \"    subject_name=%%s     default: CN=Cert,O=mbed TLS,C=UK\\n\"   \\\n    \"    key_usage=%%s        default: (empty)\\n\"       \\\n    \"                        Comma-separated-list of values:\\n\"     \\\n    \"                          digital_signature\\n\"     \\\n    \"                          non_repudiation\\n\"       \\\n    \"                          key_encipherment\\n\"      \\\n    \"                          data_encipherment\\n\"     \\\n    \"                          key_agreement\\n\"         \\\n    \"                          key_cert_sign\\n\"  \\\n    \"                          crl_sign\\n\"              \\\n    \"    ns_cert_type=%%s     default: (empty)\\n\"       \\\n    \"                        Comma-separated-list of values:\\n\"     \\\n    \"                          ssl_client\\n\"            \\\n    \"                          ssl_server\\n\"            \\\n    \"                          email\\n\"                 \\\n    \"                          object_signing\\n\"        \\\n    \"                          ssl_ca\\n\"                \\\n    \"                          email_ca\\n\"              \\\n    \"                          object_signing_ca\\n\"     \\\n    \"\\n\"\n\n/*\n * global options\n */\nstruct options\n{\n    const char *filename;       /* filename of the key file             */\n    int debug_level;            /* level of debugging                   */\n    const char *output_file;    /* where to store the constructed key file  */\n    const char *subject_name;   /* subject name for certificate request */\n    unsigned char key_usage;    /* key usage flags                      */\n    unsigned char ns_cert_type; /* NS cert type                         */\n} opt;\n\nint write_certificate_request( mbedtls_x509write_csr *req, const char *output_file,\n                               int (*f_rng)(void *, unsigned char *, size_t),\n                               void *p_rng )\n{\n    int ret;\n    FILE *f;\n    unsigned char output_buf[4096];\n    size_t len = 0;\n\n    memset( output_buf, 0, 4096 );\n    if( ( ret = mbedtls_x509write_csr_pem( req, output_buf, 4096, f_rng, p_rng ) ) < 0 )\n        return( ret );\n\n    len = strlen( (char *) output_buf );\n\n    if( ( f = fopen( output_file, \"w\" ) ) == NULL )\n        return( -1 );\n\n    if( fwrite( output_buf, 1, len, f ) != len )\n    {\n        fclose( f );\n        return( -1 );\n    }\n\n    fclose( f );\n\n    return( 0 );\n}\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0;\n    mbedtls_pk_context key;\n    char buf[1024];\n    int i;\n    char *p, *q, *r;\n    mbedtls_x509write_csr req;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    const char *pers = \"csr example app\";\n\n    /*\n     * Set to sane values\n     */\n    mbedtls_x509write_csr_init( &req );\n    mbedtls_x509write_csr_set_md_alg( &req, MBEDTLS_MD_SHA256 );\n    mbedtls_pk_init( &key );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n    memset( buf, 0, sizeof( buf ) );\n\n    if( argc == 0 )\n    {\n    usage:\n        mbedtls_printf( USAGE );\n        ret = 1;\n        goto exit;\n    }\n\n    opt.filename            = DFL_FILENAME;\n    opt.debug_level         = DFL_DEBUG_LEVEL;\n    opt.output_file         = DFL_OUTPUT_FILENAME;\n    opt.subject_name        = DFL_SUBJECT_NAME;\n    opt.key_usage           = DFL_KEY_USAGE;\n    opt.ns_cert_type        = DFL_NS_CERT_TYPE;\n\n    for( i = 1; i < argc; i++ )\n    {\n\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"filename\" ) == 0 )\n            opt.filename = q;\n        else if( strcmp( p, \"output_file\" ) == 0 )\n            opt.output_file = q;\n        else if( strcmp( p, \"debug_level\" ) == 0 )\n        {\n            opt.debug_level = atoi( q );\n            if( opt.debug_level < 0 || opt.debug_level > 65535 )\n                goto usage;\n        }\n        else if( strcmp( p, \"subject_name\" ) == 0 )\n        {\n            opt.subject_name = q;\n        }\n        else if( strcmp( p, \"key_usage\" ) == 0 )\n        {\n            while( q != NULL )\n            {\n                if( ( r = strchr( q, ',' ) ) != NULL )\n                    *r++ = '\\0';\n\n                if( strcmp( q, \"digital_signature\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_DIGITAL_SIGNATURE;\n                else if( strcmp( q, \"non_repudiation\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_NON_REPUDIATION;\n                else if( strcmp( q, \"key_encipherment\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_KEY_ENCIPHERMENT;\n                else if( strcmp( q, \"data_encipherment\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_DATA_ENCIPHERMENT;\n                else if( strcmp( q, \"key_agreement\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_KEY_AGREEMENT;\n                else if( strcmp( q, \"key_cert_sign\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_KEY_CERT_SIGN;\n                else if( strcmp( q, \"crl_sign\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_CRL_SIGN;\n                else\n                    goto usage;\n\n                q = r;\n            }\n        }\n        else if( strcmp( p, \"ns_cert_type\" ) == 0 )\n        {\n            while( q != NULL )\n            {\n                if( ( r = strchr( q, ',' ) ) != NULL )\n                    *r++ = '\\0';\n\n                if( strcmp( q, \"ssl_client\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT;\n                else if( strcmp( q, \"ssl_server\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER;\n                else if( strcmp( q, \"email\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_EMAIL;\n                else if( strcmp( q, \"object_signing\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING;\n                else if( strcmp( q, \"ssl_ca\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_SSL_CA;\n                else if( strcmp( q, \"email_ca\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA;\n                else if( strcmp( q, \"object_signing_ca\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA;\n                else\n                    goto usage;\n\n                q = r;\n            }\n        }\n        else\n            goto usage;\n    }\n\n    if( opt.key_usage )\n        mbedtls_x509write_csr_set_key_usage( &req, opt.key_usage );\n\n    if( opt.ns_cert_type )\n        mbedtls_x509write_csr_set_ns_cert_type( &req, opt.ns_cert_type );\n\n    /*\n     * 0. Seed the PRNG\n     */\n    mbedtls_printf( \"  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_ctr_drbg_seed returned %d\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1.0. Check the subject name for validity\n     */\n    mbedtls_printf( \"  . Checking subject name...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_x509write_csr_set_subject_name( &req, opt.subject_name ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509write_csr_set_subject_name returned %d\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1.1. Load the key\n     */\n    mbedtls_printf( \"  . Loading the private key ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_pk_parse_keyfile( &key, opt.filename, NULL );\n\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_keyfile returned %d\", ret );\n        goto exit;\n    }\n\n    mbedtls_x509write_csr_set_key( &req, &key );\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1.2. Writing the request\n     */\n    mbedtls_printf( \"  . Writing the certificate request ...\" );\n    fflush( stdout );\n\n    if( ( ret = write_certificate_request( &req, opt.output_file,\n                                           mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  write_certifcate_request %d\", ret );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\nexit:\n\n    if( ret != 0 && ret != 1)\n    {\n#ifdef MBEDTLS_ERROR_C\n        mbedtls_strerror( ret, buf, sizeof( buf ) );\n        mbedtls_printf( \" - %s\\n\", buf );\n#else\n        mbedtls_printf(\"\\n\");\n#endif\n    }\n\n    mbedtls_x509write_csr_free( &req );\n    mbedtls_pk_free( &key );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_X509_CSR_WRITE_C && MBEDTLS_PK_PARSE_C && MBEDTLS_FS_IO &&\n          MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C && MBEDTLS_PEM_WRITE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/x509/cert_write.c",
    "content": "/*\n *  Certificate generation and signing\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_X509_CRT_WRITE_C) || \\\n    !defined(MBEDTLS_X509_CRT_PARSE_C) || !defined(MBEDTLS_FS_IO) || \\\n    !defined(MBEDTLS_ENTROPY_C) || !defined(MBEDTLS_CTR_DRBG_C) || \\\n    !defined(MBEDTLS_ERROR_C) || !defined(MBEDTLS_SHA256_C) || \\\n    !defined(MBEDTLS_PEM_WRITE_C)\nint main( void )\n{\n    mbedtls_printf( \"MBEDTLS_X509_CRT_WRITE_C and/or MBEDTLS_X509_CRT_PARSE_C and/or \"\n            \"MBEDTLS_FS_IO and/or MBEDTLS_SHA256_C and/or \"\n            \"MBEDTLS_ENTROPY_C and/or MBEDTLS_CTR_DRBG_C and/or \"\n            \"MBEDTLS_ERROR_C not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/x509_crt.h\"\n#include \"mbedtls/x509_csr.h\"\n#include \"mbedtls/entropy.h\"\n#include \"mbedtls/ctr_drbg.h\"\n#include \"mbedtls/error.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#if defined(MBEDTLS_X509_CSR_PARSE_C)\n#define USAGE_CSR                                                           \\\n    \"    request_file=%%s     default: (empty)\\n\"                           \\\n    \"                        If request_file is specified, subject_key,\\n\"  \\\n    \"                        subject_pwd and subject_name are ignored!\\n\"\n#else\n#define USAGE_CSR \"\"\n#endif /* MBEDTLS_X509_CSR_PARSE_C */\n\n#define DFL_ISSUER_CRT          \"\"\n#define DFL_REQUEST_FILE        \"\"\n#define DFL_SUBJECT_KEY         \"subject.key\"\n#define DFL_ISSUER_KEY          \"ca.key\"\n#define DFL_SUBJECT_PWD         \"\"\n#define DFL_ISSUER_PWD          \"\"\n#define DFL_OUTPUT_FILENAME     \"cert.crt\"\n#define DFL_SUBJECT_NAME        \"CN=Cert,O=mbed TLS,C=UK\"\n#define DFL_ISSUER_NAME         \"CN=CA,O=mbed TLS,C=UK\"\n#define DFL_NOT_BEFORE          \"20010101000000\"\n#define DFL_NOT_AFTER           \"20301231235959\"\n#define DFL_SERIAL              \"1\"\n#define DFL_SELFSIGN            0\n#define DFL_IS_CA               0\n#define DFL_MAX_PATHLEN         -1\n#define DFL_KEY_USAGE           0\n#define DFL_NS_CERT_TYPE        0\n\n#define USAGE \\\n    \"\\n usage: cert_write param=<>...\\n\"                \\\n    \"\\n acceptable parameters:\\n\"                       \\\n    USAGE_CSR                                           \\\n    \"    subject_key=%%s      default: subject.key\\n\"   \\\n    \"    subject_pwd=%%s      default: (empty)\\n\"       \\\n    \"    subject_name=%%s     default: CN=Cert,O=mbed TLS,C=UK\\n\"   \\\n    \"\\n\"                                                \\\n    \"    issuer_crt=%%s       default: (empty)\\n\"       \\\n    \"                        If issuer_crt is specified, issuer_name is\\n\"  \\\n    \"                        ignored!\\n\"                \\\n    \"    issuer_name=%%s      default: CN=CA,O=mbed TLS,C=UK\\n\"     \\\n    \"\\n\"                                                \\\n    \"    selfsign=%%d         default: 0 (false)\\n\"     \\\n    \"                        If selfsign is enabled, issuer_name and\\n\" \\\n    \"                        issuer_key are required (issuer_crt and\\n\" \\\n    \"                        subject_* are ignored\\n\"   \\\n    \"    issuer_key=%%s       default: ca.key\\n\"        \\\n    \"    issuer_pwd=%%s       default: (empty)\\n\"       \\\n    \"    output_file=%%s      default: cert.crt\\n\"      \\\n    \"    serial=%%s           default: 1\\n\"             \\\n    \"    not_before=%%s       default: 20010101000000\\n\"\\\n    \"    not_after=%%s        default: 20301231235959\\n\"\\\n    \"    is_ca=%%d            default: 0 (disabled)\\n\"  \\\n    \"    max_pathlen=%%d      default: -1 (none)\\n\"     \\\n    \"    key_usage=%%s        default: (empty)\\n\"       \\\n    \"                        Comma-separated-list of values:\\n\"     \\\n    \"                          digital_signature\\n\"     \\\n    \"                          non_repudiation\\n\"       \\\n    \"                          key_encipherment\\n\"      \\\n    \"                          data_encipherment\\n\"     \\\n    \"                          key_agreement\\n\"         \\\n    \"                          key_cert_sign\\n\"  \\\n    \"                          crl_sign\\n\"              \\\n    \"    ns_cert_type=%%s     default: (empty)\\n\"       \\\n    \"                        Comma-separated-list of values:\\n\"     \\\n    \"                          ssl_client\\n\"            \\\n    \"                          ssl_server\\n\"            \\\n    \"                          email\\n\"                 \\\n    \"                          object_signing\\n\"        \\\n    \"                          ssl_ca\\n\"                \\\n    \"                          email_ca\\n\"              \\\n    \"                          object_signing_ca\\n\"     \\\n    \"\\n\"\n\n/*\n * global options\n */\nstruct options\n{\n    const char *issuer_crt;     /* filename of the issuer certificate   */\n    const char *request_file;   /* filename of the certificate request  */\n    const char *subject_key;    /* filename of the subject key file     */\n    const char *issuer_key;     /* filename of the issuer key file      */\n    const char *subject_pwd;    /* password for the subject key file    */\n    const char *issuer_pwd;     /* password for the issuer key file     */\n    const char *output_file;    /* where to store the constructed key file  */\n    const char *subject_name;   /* subject name for certificate         */\n    const char *issuer_name;    /* issuer name for certificate          */\n    const char *not_before;     /* validity period not before           */\n    const char *not_after;      /* validity period not after            */\n    const char *serial;         /* serial number string                 */\n    int selfsign;               /* selfsign the certificate             */\n    int is_ca;                  /* is a CA certificate                  */\n    int max_pathlen;            /* maximum CA path length               */\n    unsigned char key_usage;    /* key usage flags                      */\n    unsigned char ns_cert_type; /* NS cert type                         */\n} opt;\n\nint write_certificate( mbedtls_x509write_cert *crt, const char *output_file,\n                       int (*f_rng)(void *, unsigned char *, size_t),\n                       void *p_rng )\n{\n    int ret;\n    FILE *f;\n    unsigned char output_buf[4096];\n    size_t len = 0;\n\n    memset( output_buf, 0, 4096 );\n    if( ( ret = mbedtls_x509write_crt_pem( crt, output_buf, 4096, f_rng, p_rng ) ) < 0 )\n        return( ret );\n\n    len = strlen( (char *) output_buf );\n\n    if( ( f = fopen( output_file, \"w\" ) ) == NULL )\n        return( -1 );\n\n    if( fwrite( output_buf, 1, len, f ) != len )\n    {\n        fclose( f );\n        return( -1 );\n    }\n\n    fclose( f );\n\n    return( 0 );\n}\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0;\n    mbedtls_x509_crt issuer_crt;\n    mbedtls_pk_context loaded_issuer_key, loaded_subject_key;\n    mbedtls_pk_context *issuer_key = &loaded_issuer_key,\n                *subject_key = &loaded_subject_key;\n    char buf[1024];\n    char issuer_name[256];\n    int i;\n    char *p, *q, *r;\n#if defined(MBEDTLS_X509_CSR_PARSE_C)\n    char subject_name[256];\n    mbedtls_x509_csr csr;\n#endif\n    mbedtls_x509write_cert crt;\n    mbedtls_mpi serial;\n    mbedtls_entropy_context entropy;\n    mbedtls_ctr_drbg_context ctr_drbg;\n    const char *pers = \"crt example app\";\n\n    /*\n     * Set to sane values\n     */\n    mbedtls_x509write_crt_init( &crt );\n    mbedtls_x509write_crt_set_md_alg( &crt, MBEDTLS_MD_SHA256 );\n    mbedtls_pk_init( &loaded_issuer_key );\n    mbedtls_pk_init( &loaded_subject_key );\n    mbedtls_mpi_init( &serial );\n    mbedtls_ctr_drbg_init( &ctr_drbg );\n#if defined(MBEDTLS_X509_CSR_PARSE_C)\n    mbedtls_x509_csr_init( &csr );\n#endif\n    mbedtls_x509_crt_init( &issuer_crt );\n    memset( buf, 0, 1024 );\n\n    if( argc == 0 )\n    {\n    usage:\n        mbedtls_printf( USAGE );\n        ret = 1;\n        goto exit;\n    }\n\n    opt.issuer_crt          = DFL_ISSUER_CRT;\n    opt.request_file        = DFL_REQUEST_FILE;\n    opt.subject_key         = DFL_SUBJECT_KEY;\n    opt.issuer_key          = DFL_ISSUER_KEY;\n    opt.subject_pwd         = DFL_SUBJECT_PWD;\n    opt.issuer_pwd          = DFL_ISSUER_PWD;\n    opt.output_file         = DFL_OUTPUT_FILENAME;\n    opt.subject_name        = DFL_SUBJECT_NAME;\n    opt.issuer_name         = DFL_ISSUER_NAME;\n    opt.not_before          = DFL_NOT_BEFORE;\n    opt.not_after           = DFL_NOT_AFTER;\n    opt.serial              = DFL_SERIAL;\n    opt.selfsign            = DFL_SELFSIGN;\n    opt.is_ca               = DFL_IS_CA;\n    opt.max_pathlen         = DFL_MAX_PATHLEN;\n    opt.key_usage           = DFL_KEY_USAGE;\n    opt.ns_cert_type        = DFL_NS_CERT_TYPE;\n\n    for( i = 1; i < argc; i++ )\n    {\n\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"request_file\" ) == 0 )\n            opt.request_file = q;\n        else if( strcmp( p, \"subject_key\" ) == 0 )\n            opt.subject_key = q;\n        else if( strcmp( p, \"issuer_key\" ) == 0 )\n            opt.issuer_key = q;\n        else if( strcmp( p, \"subject_pwd\" ) == 0 )\n            opt.subject_pwd = q;\n        else if( strcmp( p, \"issuer_pwd\" ) == 0 )\n            opt.issuer_pwd = q;\n        else if( strcmp( p, \"issuer_crt\" ) == 0 )\n            opt.issuer_crt = q;\n        else if( strcmp( p, \"output_file\" ) == 0 )\n            opt.output_file = q;\n        else if( strcmp( p, \"subject_name\" ) == 0 )\n        {\n            opt.subject_name = q;\n        }\n        else if( strcmp( p, \"issuer_name\" ) == 0 )\n        {\n            opt.issuer_name = q;\n        }\n        else if( strcmp( p, \"not_before\" ) == 0 )\n        {\n            opt.not_before = q;\n        }\n        else if( strcmp( p, \"not_after\" ) == 0 )\n        {\n            opt.not_after = q;\n        }\n        else if( strcmp( p, \"serial\" ) == 0 )\n        {\n            opt.serial = q;\n        }\n        else if( strcmp( p, \"selfsign\" ) == 0 )\n        {\n            opt.selfsign = atoi( q );\n            if( opt.selfsign < 0 || opt.selfsign > 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"is_ca\" ) == 0 )\n        {\n            opt.is_ca = atoi( q );\n            if( opt.is_ca < 0 || opt.is_ca > 1 )\n                goto usage;\n        }\n        else if( strcmp( p, \"max_pathlen\" ) == 0 )\n        {\n            opt.max_pathlen = atoi( q );\n            if( opt.max_pathlen < -1 || opt.max_pathlen > 127 )\n                goto usage;\n        }\n        else if( strcmp( p, \"key_usage\" ) == 0 )\n        {\n            while( q != NULL )\n            {\n                if( ( r = strchr( q, ',' ) ) != NULL )\n                    *r++ = '\\0';\n\n                if( strcmp( q, \"digital_signature\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_DIGITAL_SIGNATURE;\n                else if( strcmp( q, \"non_repudiation\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_NON_REPUDIATION;\n                else if( strcmp( q, \"key_encipherment\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_KEY_ENCIPHERMENT;\n                else if( strcmp( q, \"data_encipherment\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_DATA_ENCIPHERMENT;\n                else if( strcmp( q, \"key_agreement\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_KEY_AGREEMENT;\n                else if( strcmp( q, \"key_cert_sign\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_KEY_CERT_SIGN;\n                else if( strcmp( q, \"crl_sign\" ) == 0 )\n                    opt.key_usage |= MBEDTLS_X509_KU_CRL_SIGN;\n                else\n                    goto usage;\n\n                q = r;\n            }\n        }\n        else if( strcmp( p, \"ns_cert_type\" ) == 0 )\n        {\n            while( q != NULL )\n            {\n                if( ( r = strchr( q, ',' ) ) != NULL )\n                    *r++ = '\\0';\n\n                if( strcmp( q, \"ssl_client\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT;\n                else if( strcmp( q, \"ssl_server\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER;\n                else if( strcmp( q, \"email\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_EMAIL;\n                else if( strcmp( q, \"object_signing\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING;\n                else if( strcmp( q, \"ssl_ca\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_SSL_CA;\n                else if( strcmp( q, \"email_ca\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA;\n                else if( strcmp( q, \"object_signing_ca\" ) == 0 )\n                    opt.ns_cert_type |= MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA;\n                else\n                    goto usage;\n\n                q = r;\n            }\n        }\n        else\n            goto usage;\n    }\n\n    mbedtls_printf(\"\\n\");\n\n    /*\n     * 0. Seed the PRNG\n     */\n    mbedtls_printf( \"  . Seeding the random number generator...\" );\n    fflush( stdout );\n\n    mbedtls_entropy_init( &entropy );\n    if( ( ret = mbedtls_ctr_drbg_seed( &ctr_drbg, mbedtls_entropy_func, &entropy,\n                               (const unsigned char *) pers,\n                               strlen( pers ) ) ) != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  mbedtls_ctr_drbg_seed returned %d - %s\\n\", ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    // Parse serial to MPI\n    //\n    mbedtls_printf( \"  . Reading serial number...\" );\n    fflush( stdout );\n\n    if( ( ret = mbedtls_mpi_read_string( &serial, 10, opt.serial ) ) != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  mbedtls_mpi_read_string returned -0x%02x - %s\\n\\n\", -ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    // Parse issuer certificate if present\n    //\n    if( !opt.selfsign && strlen( opt.issuer_crt ) )\n    {\n        /*\n         * 1.0.a. Load the certificates\n         */\n        mbedtls_printf( \"  . Loading the issuer certificate ...\" );\n        fflush( stdout );\n\n        if( ( ret = mbedtls_x509_crt_parse_file( &issuer_crt, opt.issuer_crt ) ) != 0 )\n        {\n            mbedtls_strerror( ret, buf, 1024 );\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_crt_parse_file returned -0x%02x - %s\\n\\n\", -ret, buf );\n            goto exit;\n        }\n\n        ret = mbedtls_x509_dn_gets( issuer_name, sizeof(issuer_name),\n                                 &issuer_crt.subject );\n        if( ret < 0 )\n        {\n            mbedtls_strerror( ret, buf, 1024 );\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_dn_gets returned -0x%02x - %s\\n\\n\", -ret, buf );\n            goto exit;\n        }\n\n        opt.issuer_name = issuer_name;\n\n        mbedtls_printf( \" ok\\n\" );\n    }\n\n#if defined(MBEDTLS_X509_CSR_PARSE_C)\n    // Parse certificate request if present\n    //\n    if( !opt.selfsign && strlen( opt.request_file ) )\n    {\n        /*\n         * 1.0.b. Load the CSR\n         */\n        mbedtls_printf( \"  . Loading the certificate request ...\" );\n        fflush( stdout );\n\n        if( ( ret = mbedtls_x509_csr_parse_file( &csr, opt.request_file ) ) != 0 )\n        {\n            mbedtls_strerror( ret, buf, 1024 );\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_csr_parse_file returned -0x%02x - %s\\n\\n\", -ret, buf );\n            goto exit;\n        }\n\n        ret = mbedtls_x509_dn_gets( subject_name, sizeof(subject_name),\n                                 &csr.subject );\n        if( ret < 0 )\n        {\n            mbedtls_strerror( ret, buf, 1024 );\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509_dn_gets returned -0x%02x - %s\\n\\n\", -ret, buf );\n            goto exit;\n        }\n\n        opt.subject_name = subject_name;\n        subject_key = &csr.pk;\n\n        mbedtls_printf( \" ok\\n\" );\n    }\n#endif /* MBEDTLS_X509_CSR_PARSE_C */\n\n    /*\n     * 1.1. Load the keys\n     */\n    if( !opt.selfsign && !strlen( opt.request_file ) )\n    {\n        mbedtls_printf( \"  . Loading the subject key ...\" );\n        fflush( stdout );\n\n        ret = mbedtls_pk_parse_keyfile( &loaded_subject_key, opt.subject_key,\n                                 opt.subject_pwd );\n        if( ret != 0 )\n        {\n            mbedtls_strerror( ret, buf, 1024 );\n            mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_keyfile returned -0x%02x - %s\\n\\n\", -ret, buf );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n    }\n\n    mbedtls_printf( \"  . Loading the issuer key ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_pk_parse_keyfile( &loaded_issuer_key, opt.issuer_key,\n                             opt.issuer_pwd );\n    if( ret != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  mbedtls_pk_parse_keyfile returned -x%02x - %s\\n\\n\", -ret, buf );\n        goto exit;\n    }\n\n    // Check if key and issuer certificate match\n    //\n    if( strlen( opt.issuer_crt ) )\n    {\n        if( !mbedtls_pk_can_do( &issuer_crt.pk, MBEDTLS_PK_RSA ) ||\n            mbedtls_mpi_cmp_mpi( &mbedtls_pk_rsa( issuer_crt.pk )->N,\n                         &mbedtls_pk_rsa( *issuer_key )->N ) != 0 ||\n            mbedtls_mpi_cmp_mpi( &mbedtls_pk_rsa( issuer_crt.pk )->E,\n                         &mbedtls_pk_rsa( *issuer_key )->E ) != 0 )\n        {\n            mbedtls_printf( \" failed\\n  !  issuer_key does not match issuer certificate\\n\\n\" );\n            ret = -1;\n            goto exit;\n        }\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    if( opt.selfsign )\n    {\n        opt.subject_name = opt.issuer_name;\n        subject_key = issuer_key;\n    }\n\n    mbedtls_x509write_crt_set_subject_key( &crt, subject_key );\n    mbedtls_x509write_crt_set_issuer_key( &crt, issuer_key );\n\n    /*\n     * 1.0. Check the names for validity\n     */\n    if( ( ret = mbedtls_x509write_crt_set_subject_name( &crt, opt.subject_name ) ) != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509write_crt_set_subject_name returned -0x%02x - %s\\n\\n\", -ret, buf );\n        goto exit;\n    }\n\n    if( ( ret = mbedtls_x509write_crt_set_issuer_name( &crt, opt.issuer_name ) ) != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509write_crt_set_issuer_name returned -0x%02x - %s\\n\\n\", -ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \"  . Setting certificate values ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_x509write_crt_set_serial( &crt, &serial );\n    if( ret != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509write_crt_set_serial returned -0x%02x - %s\\n\\n\", -ret, buf );\n        goto exit;\n    }\n\n    ret = mbedtls_x509write_crt_set_validity( &crt, opt.not_before, opt.not_after );\n    if( ret != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509write_crt_set_validity returned -0x%02x - %s\\n\\n\", -ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    mbedtls_printf( \"  . Adding the Basic Constraints extension ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_x509write_crt_set_basic_constraints( &crt, opt.is_ca,\n                                               opt.max_pathlen );\n    if( ret != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  x509write_crt_set_basic_contraints returned -0x%02x - %s\\n\\n\", -ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n#if defined(MBEDTLS_SHA1_C)\n    mbedtls_printf( \"  . Adding the Subject Key Identifier ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_x509write_crt_set_subject_key_identifier( &crt );\n    if( ret != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509write_crt_set_subject_key_identifier returned -0x%02x - %s\\n\\n\", -ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    mbedtls_printf( \"  . Adding the Authority Key Identifier ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_x509write_crt_set_authority_key_identifier( &crt );\n    if( ret != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509write_crt_set_authority_key_identifier returned -0x%02x - %s\\n\\n\", -ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n#endif /* MBEDTLS_SHA1_C */\n\n    if( opt.key_usage )\n    {\n        mbedtls_printf( \"  . Adding the Key Usage extension ...\" );\n        fflush( stdout );\n\n        ret = mbedtls_x509write_crt_set_key_usage( &crt, opt.key_usage );\n        if( ret != 0 )\n        {\n            mbedtls_strerror( ret, buf, 1024 );\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509write_crt_set_key_usage returned -0x%02x - %s\\n\\n\", -ret, buf );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n    }\n\n    if( opt.ns_cert_type )\n    {\n        mbedtls_printf( \"  . Adding the NS Cert Type extension ...\" );\n        fflush( stdout );\n\n        ret = mbedtls_x509write_crt_set_ns_cert_type( &crt, opt.ns_cert_type );\n        if( ret != 0 )\n        {\n            mbedtls_strerror( ret, buf, 1024 );\n            mbedtls_printf( \" failed\\n  !  mbedtls_x509write_crt_set_ns_cert_type returned -0x%02x - %s\\n\\n\", -ret, buf );\n            goto exit;\n        }\n\n        mbedtls_printf( \" ok\\n\" );\n    }\n\n    /*\n     * 1.2. Writing the request\n     */\n    mbedtls_printf( \"  . Writing the certificate...\" );\n    fflush( stdout );\n\n    if( ( ret = write_certificate( &crt, opt.output_file,\n                                   mbedtls_ctr_drbg_random, &ctr_drbg ) ) != 0 )\n    {\n        mbedtls_strerror( ret, buf, 1024 );\n        mbedtls_printf( \" failed\\n  !  write_certifcate -0x%02x - %s\\n\\n\", -ret, buf );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\nexit:\n    mbedtls_x509write_crt_free( &crt );\n    mbedtls_pk_free( &loaded_subject_key );\n    mbedtls_pk_free( &loaded_issuer_key );\n    mbedtls_mpi_free( &serial );\n    mbedtls_ctr_drbg_free( &ctr_drbg );\n    mbedtls_entropy_free( &entropy );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_X509_CRT_WRITE_C && MBEDTLS_X509_CRT_PARSE_C &&\n          MBEDTLS_FS_IO && MBEDTLS_ENTROPY_C && MBEDTLS_CTR_DRBG_C &&\n          MBEDTLS_ERROR_C && MBEDTLS_PEM_WRITE_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/x509/crl_app.c",
    "content": "/*\n *  CRL reading application\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_RSA_C) ||  \\\n    !defined(MBEDTLS_X509_CRL_PARSE_C) || !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_X509_CRL_PARSE_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/x509_crl.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#define DFL_FILENAME            \"crl.pem\"\n#define DFL_DEBUG_LEVEL         0\n\n#define USAGE \\\n    \"\\n usage: crl_app param=<>...\\n\"                   \\\n    \"\\n acceptable parameters:\\n\"                       \\\n    \"    filename=%%s         default: crl.pem\\n\"      \\\n    \"\\n\"\n\n/*\n * global options\n */\nstruct options\n{\n    const char *filename;       /* filename of the certificate file     */\n} opt;\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0;\n    unsigned char buf[100000];\n    mbedtls_x509_crl crl;\n    int i;\n    char *p, *q;\n\n    /*\n     * Set to sane values\n     */\n    mbedtls_x509_crl_init( &crl );\n\n    if( argc == 0 )\n    {\n    usage:\n        mbedtls_printf( USAGE );\n        goto exit;\n    }\n\n    opt.filename            = DFL_FILENAME;\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"filename\" ) == 0 )\n            opt.filename = q;\n        else\n            goto usage;\n    }\n\n    /*\n     * 1.1. Load the CRL\n     */\n    mbedtls_printf( \"\\n  . Loading the CRL ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_x509_crl_parse_file( &crl, opt.filename );\n\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crl_parse_file returned %d\\n\\n\", ret );\n        mbedtls_x509_crl_free( &crl );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1.2 Print the CRL\n     */\n    mbedtls_printf( \"  . CRL information    ...\\n\" );\n    ret = mbedtls_x509_crl_info( (char *) buf, sizeof( buf ) - 1, \"      \", &crl );\n    if( ret == -1 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_crl_info returned %d\\n\\n\", ret );\n        mbedtls_x509_crl_free( &crl );\n        goto exit;\n    }\n\n    mbedtls_printf( \"%s\\n\", buf );\n\nexit:\n    mbedtls_x509_crl_free( &crl );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_RSA_C && MBEDTLS_X509_CRL_PARSE_C &&\n          MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/programs/x509/req_app.c",
    "content": "/*\n *  Certificate request reading application\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#include <stdio.h>\n#define mbedtls_printf     printf\n#endif\n\n#if !defined(MBEDTLS_BIGNUM_C) || !defined(MBEDTLS_RSA_C) ||  \\\n    !defined(MBEDTLS_X509_CSR_PARSE_C) || !defined(MBEDTLS_FS_IO)\nint main( void )\n{\n    mbedtls_printf(\"MBEDTLS_BIGNUM_C and/or MBEDTLS_RSA_C and/or \"\n           \"MBEDTLS_X509_CSR_PARSE_C and/or MBEDTLS_FS_IO not defined.\\n\");\n    return( 0 );\n}\n#else\n\n#include \"mbedtls/x509_csr.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#define DFL_FILENAME            \"cert.req\"\n#define DFL_DEBUG_LEVEL         0\n\n#define USAGE \\\n    \"\\n usage: req_app param=<>...\\n\"                   \\\n    \"\\n acceptable parameters:\\n\"                       \\\n    \"    filename=%%s         default: cert.req\\n\"      \\\n    \"\\n\"\n\n/*\n * global options\n */\nstruct options\n{\n    const char *filename;       /* filename of the certificate request  */\n} opt;\n\nint main( int argc, char *argv[] )\n{\n    int ret = 0;\n    unsigned char buf[100000];\n    mbedtls_x509_csr csr;\n    int i;\n    char *p, *q;\n\n    /*\n     * Set to sane values\n     */\n    mbedtls_x509_csr_init( &csr );\n\n    if( argc == 0 )\n    {\n    usage:\n        mbedtls_printf( USAGE );\n        goto exit;\n    }\n\n    opt.filename            = DFL_FILENAME;\n\n    for( i = 1; i < argc; i++ )\n    {\n        p = argv[i];\n        if( ( q = strchr( p, '=' ) ) == NULL )\n            goto usage;\n        *q++ = '\\0';\n\n        if( strcmp( p, \"filename\" ) == 0 )\n            opt.filename = q;\n        else\n            goto usage;\n    }\n\n    /*\n     * 1.1. Load the CSR\n     */\n    mbedtls_printf( \"\\n  . Loading the CSR ...\" );\n    fflush( stdout );\n\n    ret = mbedtls_x509_csr_parse_file( &csr, opt.filename );\n\n    if( ret != 0 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_csr_parse_file returned %d\\n\\n\", ret );\n        mbedtls_x509_csr_free( &csr );\n        goto exit;\n    }\n\n    mbedtls_printf( \" ok\\n\" );\n\n    /*\n     * 1.2 Print the CSR\n     */\n    mbedtls_printf( \"  . CSR information    ...\\n\" );\n    ret = mbedtls_x509_csr_info( (char *) buf, sizeof( buf ) - 1, \"      \", &csr );\n    if( ret == -1 )\n    {\n        mbedtls_printf( \" failed\\n  !  mbedtls_x509_csr_info returned %d\\n\\n\", ret );\n        mbedtls_x509_csr_free( &csr );\n        goto exit;\n    }\n\n    mbedtls_printf( \"%s\\n\", buf );\n\nexit:\n    mbedtls_x509_csr_free( &csr );\n\n#if defined(_WIN32)\n    mbedtls_printf( \"  + Press Enter to exit this program.\\n\" );\n    fflush( stdout ); getchar();\n#endif\n\n    return( ret );\n}\n#endif /* MBEDTLS_BIGNUM_C && MBEDTLS_RSA_C && MBEDTLS_X509_CSR_PARSE_C &&\n          MBEDTLS_FS_IO */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/apidoc_full.sh",
    "content": "#!/bin/sh\n\n# Generate doxygen documentation with a full config.h (this ensures that every\n# available flag is documented, and avoids warnings about documentation\n# without a corresponding #define).\n#\n# /!\\ This must not be a Makefile target, as it would create a race condition\n# when multiple targets are invoked in the same parallel build.\n\nset -eu\n\nCONFIG_H='include/mbedtls/config.h'\n\nif [ -r $CONFIG_H ]; then :; else\n    echo \"$CONFIG_H not found\" >&2\n    exit 1\nfi\n\nCONFIG_BAK=${CONFIG_H}.bak\ncp -p $CONFIG_H $CONFIG_BAK\n\nscripts/config.pl realfull\nmake apidoc\n\nmv $CONFIG_BAK $CONFIG_H\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/bump_version.sh",
    "content": "#!/bin/bash\n#\n# This file is part of mbed TLS (https://tls.mbed.org)\n#\n# Copyright (c) 2012-2016, ARM Limited, All Rights Reserved\n#\n# Purpose\n#\n# Sets the version numbers in the source code to those given.\n#\n# Usage: bump_version.sh [ --version <version> ] [ --so-crypto <version>]\n#                           [ --so-x509 <version> ] [ --so-tls <version> ]\n#                           [ -v | --verbose ] [ -h | --help ]\n#\n\nVERSION=\"\"\nSOVERSION=\"\"\n\n# Parse arguments\n#\nuntil [ -z \"$1\" ]\ndo\n  case \"$1\" in\n    --version)\n      # Version to use\n      shift\n      VERSION=$1\n      ;;\n    --so-crypto)\n      shift\n      SO_CRYPTO=$1\n      ;;\n    --so-x509)\n      shift\n      SO_X509=$1\n      ;;\n    --so-tls)\n      shift\n      SO_TLS=$1\n      ;;\n    -v|--verbose)\n      # Be verbose\n      VERBOSE=\"1\"\n      ;;\n    -h|--help)\n      # print help\n      echo \"Usage: $0\"\n      echo -e \"  -h|--help\\t\\tPrint this help.\"\n      echo -e \"  --version <version>\\tVersion to bump to.\"\n      echo -e \"  --so-crypto <version>\\tSO version to bump libmbedcrypto to.\"\n      echo -e \"  --so-x509 <version>\\tSO version to bump libmbedx509 to.\"\n      echo -e \"  --so-tls <version>\\tSO version to bump libmbedtls to.\"\n      echo -e \"  -v|--verbose\\t\\tVerbose.\"\n      exit 1\n      ;;\n    *)\n      # print error\n      echo \"Unknown argument: '$1'\"\n      exit 1\n      ;;\n  esac\n  shift\ndone\n\nif [ \"X\" = \"X$VERSION\" ];\nthen\n  echo \"No version specified. Unable to continue.\"\n  exit 1\nfi\n\n[ $VERBOSE ] && echo \"Bumping VERSION in library/CMakeLists.txt\"\nsed -e \"s/ VERSION [0-9.]\\{1,\\}/ VERSION $VERSION/g\" < library/CMakeLists.txt > tmp\nmv tmp library/CMakeLists.txt\n\nif [ \"X\" != \"X$SO_CRYPTO\" ];\nthen\n  [ $VERBOSE ] && echo \"Bumping SOVERSION for libmbedcrypto in library/CMakeLists.txt\"\n  sed -e \"/mbedcrypto/ s/ SOVERSION [0-9]\\{1,\\}/ SOVERSION $SO_CRYPTO/g\" < library/CMakeLists.txt > tmp\n  mv tmp library/CMakeLists.txt\n\n  [ $VERBOSE ] && echo \"Bumping SOVERSION for libmbedcrypto in library/Makefile\"\n  sed -e \"s/SOEXT_CRYPTO=so.[0-9]\\{1,\\}/SOEXT_CRYPTO=so.$SO_CRYPTO/g\" < library/Makefile > tmp\n  mv tmp library/Makefile\nfi\n\nif [ \"X\" != \"X$SO_X509\" ];\nthen\n  [ $VERBOSE ] && echo \"Bumping SOVERSION for libmbedx509 in library/CMakeLists.txt\"\n  sed -e \"/mbedx509/ s/ SOVERSION [0-9]\\{1,\\}/ SOVERSION $SO_X509/g\" < library/CMakeLists.txt > tmp\n  mv tmp library/CMakeLists.txt\n\n  [ $VERBOSE ] && echo \"Bumping SOVERSION for libmbedx509 in library/Makefile\"\n  sed -e \"s/SOEXT_X509=so.[0-9]\\{1,\\}/SOEXT_X509=so.$SO_X509/g\" < library/Makefile > tmp\n  mv tmp library/Makefile\nfi\n\nif [ \"X\" != \"X$SO_TLS\" ];\nthen\n  [ $VERBOSE ] && echo \"Bumping SOVERSION for libmbedtls in library/CMakeLists.txt\"\n  sed -e \"/mbedtls/ s/ SOVERSION [0-9]\\{1,\\}/ SOVERSION $SO_TLS/g\" < library/CMakeLists.txt > tmp\n  mv tmp library/CMakeLists.txt\n\n  [ $VERBOSE ] && echo \"Bumping SOVERSION for libmbedtls in library/Makefile\"\n  sed -e \"s/SOEXT_TLS=so.[0-9]\\{1,\\}/SOEXT_TLS=so.$SO_TLS/g\" < library/Makefile > tmp\n  mv tmp library/Makefile\nfi\n\n[ $VERBOSE ] && echo \"Bumping VERSION in include/mbedtls/version.h\"\nread MAJOR MINOR PATCH <<<$(IFS=\".\"; echo $VERSION)\nVERSION_NR=\"$( printf \"0x%02X%02X%02X00\" $MAJOR $MINOR $PATCH )\"\ncat include/mbedtls/version.h |                                    \\\n    sed -e \"s/_VERSION_MAJOR .\\{1,\\}/_VERSION_MAJOR  $MAJOR/\" |    \\\n    sed -e \"s/_VERSION_MINOR .\\{1,\\}/_VERSION_MINOR  $MINOR/\" |    \\\n    sed -e \"s/_VERSION_PATCH .\\{1,\\}/_VERSION_PATCH  $PATCH/\" |    \\\n    sed -e \"s/_VERSION_NUMBER .\\{1,\\}/_VERSION_NUMBER         $VERSION_NR/\" |    \\\n    sed -e \"s/_VERSION_STRING .\\{1,\\}/_VERSION_STRING         \\\"$VERSION\\\"/\" |    \\\n    sed -e \"s/_VERSION_STRING_FULL .\\{1,\\}/_VERSION_STRING_FULL    \\\"mbed TLS $VERSION\\\"/\" \\\n    > tmp\nmv tmp include/mbedtls/version.h\n\n[ $VERBOSE ] && echo \"Bumping version in tests/suites/test_suite_version.data\"\nsed -e \"s/version:\\\".\\{1,\\}/version:\\\"$VERSION\\\"/g\" < tests/suites/test_suite_version.data > tmp\nmv tmp tests/suites/test_suite_version.data\n\n[ $VERBOSE ] && echo \"Bumping PROJECT_NAME in doxygen/mbedtls.doxyfile and doxygen/input/doc_mainpage.h\"\nfor i in doxygen/mbedtls.doxyfile doxygen/input/doc_mainpage.h;\ndo\n  sed -e \"s/mbed TLS v[0-9\\.]\\{1,\\}/mbed TLS v$VERSION/g\" < $i > tmp\n  mv tmp $i\ndone\n\n[ $VERBOSE ] && echo \"Re-generating library/error.c\"\nscripts/generate_errors.pl\n\n[ $VERBOSE ] && echo \"Re-generating library/version_features.c\"\nscripts/generate_features.pl\n\n[ $VERBOSE ] && echo \"Re-generating visualc files\"\nscripts/generate_visualc_files.pl\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/config.pl",
    "content": "#!/usr/bin/perl\n#\n# This file is part of mbed TLS (https://tls.mbed.org)\n#\n# Copyright (c) 2014-2016, ARM Limited, All Rights Reserved\n#\n# Purpose\n#\n# Comments and uncomments #define lines in the given header file and optionally\n# sets their value or can get the value. This is to provide scripting control of\n# what preprocessor symbols, and therefore what build time configuration flags\n# are set in the 'config.h' file.\n#\n# Usage: config.pl [-f <file> | --file <file>] [-o | --force]\n#                   [set <symbol> <value> | unset <symbol> | get <symbol> |\n#                       full | realfull]\n#\n# Full usage description provided below.\n#\n# Things that shouldn't be enabled with \"full\".\n#\n#   MBEDTLS_TEST_NULL_ENTROPY\n#   MBEDTLS_DEPRECATED_REMOVED\n#   MBEDTLS_HAVE_SSE2\n#   MBEDTLS_PLATFORM_NO_STD_FUNCTIONS\n#   MBEDTLS_ECP_DP_M221_ENABLED\n#   MBEDTLS_ECP_DP_M383_ENABLED\n#   MBEDTLS_ECP_DP_M511_ENABLED\n#   MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES\n#   MBEDTLS_NO_PLATFORM_ENTROPY\n#   MBEDTLS_REMOVE_ARC4_CIPHERSUITES\n#   MBEDTLS_SSL_HW_RECORD_ACCEL\n#   MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3\n#   MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION\n#       - this could be enabled if the respective tests were adapted\n#   MBEDTLS_ZLIB_SUPPORT\n#   MBEDTLS_PKCS11_C\n#   and any symbol beginning _ALT\n#\n\nuse warnings;\nuse strict;\n\nmy $config_file = \"include/mbedtls/config.h\";\nmy $usage = <<EOU;\n$0 [-f <file> | --file <file>] [-o | --force]\n                   [set <symbol> <value> | unset <symbol> | get <symbol> |\n                        full | realfull]\n\nCommands\n    set <symbol> [<value>]  - Uncomments or adds a #define for the <symbol> to\n                              the configuration file, and optionally making it\n                              of <value>.\n                              If the symbol isn't present in the file an error\n                              is returned.\n    unset <symbol>          - Comments out the #define for the given symbol if\n                              present in the configuration file.\n    get <symbol>            - Finds the #define for the given symbol, returning\n                              an exitcode of 0 if the symbol is found, and -1 if\n                              not. The value of the symbol is output if one is\n                              specified in the configuration file.\n    full                    - Uncomments all #define's in the configuration file\n                              excluding some reserved symbols, until the\n                              'Module configuration options' section\n    realfull                - Uncomments all #define's with no exclusions\n\nOptions\n    -f | --file <filename>  - The file or file path for the configuration file\n                              to edit. When omitted, the following default is\n                              used:\n                                $config_file\n    -o | --force            - If the symbol isn't present in the configuration\n                              file when setting its value, a #define is\n                              appended to the end of the file.\n\nEOU\n\nmy @excluded = qw(\nMBEDTLS_TEST_NULL_ENTROPY\nMBEDTLS_DEPRECATED_REMOVED\nMBEDTLS_HAVE_SSE2\nMBEDTLS_PLATFORM_NO_STD_FUNCTIONS\nMBEDTLS_ECP_DP_M221_ENABLED\nMBEDTLS_ECP_DP_M383_ENABLED\nMBEDTLS_ECP_DP_M511_ENABLED\nMBEDTLS_NO_DEFAULT_ENTROPY_SOURCES\nMBEDTLS_NO_PLATFORM_ENTROPY\nMBEDTLS_REMOVE_ARC4_CIPHERSUITES\nMBEDTLS_SSL_HW_RECORD_ACCEL\nMBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3\nMBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION\nMBEDTLS_ZLIB_SUPPORT\nMBEDTLS_PKCS11_C\n_ALT\\s*$\n);\n\n# Things that should be enabled in \"full\" even if they match @excluded\nmy @non_excluded = qw(\nPLATFORM_[A-Z0-9]+_ALT\n);\n\n# Process the command line arguments\n\nmy $force_option = 0;\n\nmy ($arg, $name, $value, $action);\n\nwhile ($arg = shift) {\n\n    # Check if the argument is an option\n    if ($arg eq \"-f\" || $arg eq \"--file\") {\n        $config_file = shift;\n\n        -f $config_file or die \"No such file: $config_file\\n\";\n\n    }\n    elsif ($arg eq \"-o\" || $arg eq \"--force\") {\n        $force_option = 1;\n\n    }\n    else\n    {\n        # ...else assume it's a command\n        $action = $arg;\n\n        if ($action eq \"full\" || $action eq \"realfull\") {\n            # No additional parameters\n            die $usage if @ARGV;\n\n        }\n        elsif ($action eq \"unset\" || $action eq \"get\") {\n            die $usage unless @ARGV;\n            $name = shift;\n\n        }\n        elsif ($action eq \"set\") {\n            die $usage unless @ARGV;\n            $name = shift;\n            $value = shift if @ARGV;\n\n        }\n        else {\n            die \"Command '$action' not recognised.\\n\\n\".$usage;\n        }\n    }\n}\n\n# If no command was specified, exit...\nif ( not defined($action) ){ die $usage; }\n\n# Check the config file is present\nif (! -f $config_file)  {\n\n    chdir '..' or die;\n\n    # Confirm this is the project root directory and try again\n    if ( !(-d 'scripts' && -d 'include' && -d 'library' && -f $config_file) ) {\n        die \"If no file specified, must be run from the project root or scripts directory.\\n\";\n    }\n}\n\n\n# Now read the file and process the contents\n\nopen my $config_read, '<', $config_file or die \"read $config_file: $!\\n\";\nmy @config_lines = <$config_read>;\nclose $config_read;\n\nmy ($exclude_re, $no_exclude_re);\nif ($action eq \"realfull\") {\n    $exclude_re = qr/^$/;\n    $no_exclude_re = qr/./;\n} else {\n    $exclude_re = join '|', @excluded;\n    $no_exclude_re = join '|', @non_excluded;\n}\n\nopen my $config_write, '>', $config_file or die \"write $config_file: $!\\n\";\n\nmy $done;\nfor my $line (@config_lines) {\n    if ($action eq \"full\" || $action eq \"realfull\") {\n        if ($line =~ /name SECTION: Module configuration options/) {\n            $done = 1;\n        }\n\n        if (!$done && $line =~ m!^//\\s?#define! &&\n                ( $line !~ /$exclude_re/ || $line =~ /$no_exclude_re/ ) ) {\n            $line =~ s!^//\\s?!!;\n        }\n        if (!$done && $line =~ m!^\\s?#define! &&\n                ! ( $line !~ /$exclude_re/ || $line =~ /$no_exclude_re/ ) ) {\n            $line =~ s!^!//!;\n        }\n    } elsif ($action eq \"unset\") {\n        if (!$done && $line =~ /^\\s*#define\\s*$name\\b/) {\n            $line = '//' . $line;\n            $done = 1;\n        }\n    } elsif (!$done && $action eq \"set\") {\n        if ($line =~ m!^(?://)?\\s*#define\\s*$name\\b!) {\n            $line = \"#define $name\";\n            $line .= \" $value\" if defined $value && $value ne \"\";\n            $line .= \"\\n\";\n            $done = 1;\n        }\n    } elsif (!$done && $action eq \"get\") {\n        if ($line =~ /^\\s*#define\\s*$name\\s*([^\\s]+)\\s*\\b/) {\n            $value = $1;\n            $done = 1;\n        }\n    }\n\n    print $config_write $line;\n}\n\n# Did the set command work?\nif ($action eq \"set\"&& $force_option && !$done) {\n\n    # If the force option was set, append the symbol to the end of the file\n    my $line = \"#define $name\";\n    $line .= \" $value\" if defined $value && $value ne \"\";\n    $line .= \"\\n\";\n    $done = 1;\n\n    print $config_write $line;\n}\n\nclose $config_write;\n\nif ($action eq \"get\") {\n    if($done) {\n        if ($value ne '') {\n            print $value;\n        }\n        exit 0;\n    } else {\n        # If the symbol was not found, return an error\n        exit -1;\n    }\n}\n\nif ($action eq \"full\" && !$done) {\n    die \"Configuration section was not found in $config_file\\n\";\n\n}\n\nif ($action ne \"full\" && $action ne \"unset\" && !$done) {\n    die \"A #define for the symbol $name was not found in $config_file\\n\";\n}\n\n__END__\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/data_files/error.fmt",
    "content": "/*\n *  Error message information\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_ERROR_C) || defined(MBEDTLS_ERROR_STRERROR_DUMMY)\n#include \"mbedtls/error.h\"\n#include <string.h>\n#endif\n\n#if defined(MBEDTLS_PLATFORM_C)\n#include \"mbedtls/platform.h\"\n#else\n#define mbedtls_snprintf snprintf\n#define mbedtls_time_t   time_t\n#endif\n\n#if defined(MBEDTLS_ERROR_C)\n\n#include <stdio.h>\n\nHEADER_INCLUDED\n\nvoid mbedtls_strerror( int ret, char *buf, size_t buflen )\n{\n    size_t len;\n    int use_ret;\n\n    if( buflen == 0 )\n        return;\n\n    memset( buf, 0x00, buflen );\n\n    if( ret < 0 )\n        ret = -ret;\n\n    if( ret & 0xFF80 )\n    {\n        use_ret = ret & 0xFF80;\n\n        // High level error codes\n        //\n        // BEGIN generated code\nHIGH_LEVEL_CODE_CHECKS\n        // END generated code\n\n        if( strlen( buf ) == 0 )\n            mbedtls_snprintf( buf, buflen, \"UNKNOWN ERROR CODE (%04X)\", use_ret );\n    }\n\n    use_ret = ret & ~0xFF80;\n\n    if( use_ret == 0 )\n        return;\n\n    // If high level code is present, make a concatenation between both\n    // error strings.\n    //\n    len = strlen( buf );\n\n    if( len > 0 )\n    {\n        if( buflen - len < 5 )\n            return;\n\n        mbedtls_snprintf( buf + len, buflen - len, \" : \" );\n\n        buf += len + 3;\n        buflen -= len + 3;\n    }\n\n    // Low level error codes\n    //\n    // BEGIN generated code\nLOW_LEVEL_CODE_CHECKS\n    // END generated code\n\n    if( strlen( buf ) != 0 )\n        return;\n\n    mbedtls_snprintf( buf, buflen, \"UNKNOWN ERROR CODE (%04X)\", use_ret );\n}\n\n#else /* MBEDTLS_ERROR_C */\n\n#if defined(MBEDTLS_ERROR_STRERROR_DUMMY)\n\n/*\n * Provide an non-function in case MBEDTLS_ERROR_C is not defined\n */\nvoid mbedtls_strerror( int ret, char *buf, size_t buflen )\n{\n    ((void) ret);\n\n    if( buflen > 0 )\n        buf[0] = '\\0';\n}\n\n#endif /* MBEDTLS_ERROR_STRERROR_DUMMY */\n\n#endif /* MBEDTLS_ERROR_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/data_files/rename-1.3-2.0.txt",
    "content": "AES_DECRYPT MBEDTLS_AES_DECRYPT\nAES_ENCRYPT MBEDTLS_AES_ENCRYPT\nASN1_BIT_STRING MBEDTLS_ASN1_BIT_STRING\nASN1_BMP_STRING MBEDTLS_ASN1_BMP_STRING\nASN1_BOOLEAN MBEDTLS_ASN1_BOOLEAN\nASN1_CHK_ADD MBEDTLS_ASN1_CHK_ADD\nASN1_CONSTRUCTED MBEDTLS_ASN1_CONSTRUCTED\nASN1_CONTEXT_SPECIFIC MBEDTLS_ASN1_CONTEXT_SPECIFIC\nASN1_GENERALIZED_TIME MBEDTLS_ASN1_GENERALIZED_TIME\nASN1_IA5_STRING MBEDTLS_ASN1_IA5_STRING\nASN1_INTEGER MBEDTLS_ASN1_INTEGER\nASN1_NULL MBEDTLS_ASN1_NULL\nASN1_OCTET_STRING MBEDTLS_ASN1_OCTET_STRING\nASN1_OID MBEDTLS_ASN1_OID\nASN1_PRIMITIVE MBEDTLS_ASN1_PRIMITIVE\nASN1_PRINTABLE_STRING MBEDTLS_ASN1_PRINTABLE_STRING\nASN1_SEQUENCE MBEDTLS_ASN1_SEQUENCE\nASN1_SET MBEDTLS_ASN1_SET\nASN1_T61_STRING MBEDTLS_ASN1_T61_STRING\nASN1_UNIVERSAL_STRING MBEDTLS_ASN1_UNIVERSAL_STRING\nASN1_UTC_TIME MBEDTLS_ASN1_UTC_TIME\nASN1_UTF8_STRING MBEDTLS_ASN1_UTF8_STRING\nBADCERT_CN_MISMATCH MBEDTLS_X509_BADCERT_CN_MISMATCH\nBADCERT_EXPIRED MBEDTLS_X509_BADCERT_EXPIRED\nBADCERT_EXT_KEY_USAGE MBEDTLS_X509_BADCERT_EXT_KEY_USAGE\nBADCERT_FUTURE MBEDTLS_X509_BADCERT_FUTURE\nBADCERT_KEY_USAGE MBEDTLS_X509_BADCERT_KEY_USAGE\nBADCERT_MISSING MBEDTLS_X509_BADCERT_MISSING\nBADCERT_NOT_TRUSTED MBEDTLS_X509_BADCERT_NOT_TRUSTED\nBADCERT_NS_CERT_TYPE MBEDTLS_X509_BADCERT_NS_CERT_TYPE\nBADCERT_OTHER MBEDTLS_X509_BADCERT_OTHER\nBADCERT_REVOKED MBEDTLS_X509_BADCERT_REVOKED\nBADCERT_SKIP_VERIFY MBEDTLS_X509_BADCERT_SKIP_VERIFY\nBADCRL_EXPIRED MBEDTLS_X509_BADCRL_EXPIRED\nBADCRL_FUTURE MBEDTLS_X509_BADCRL_FUTURE\nBADCRL_NOT_TRUSTED MBEDTLS_X509_BADCRL_NOT_TRUSTED\nBLOWFISH_BLOCKSIZE MBEDTLS_BLOWFISH_BLOCKSIZE\nBLOWFISH_DECRYPT MBEDTLS_BLOWFISH_DECRYPT\nBLOWFISH_ENCRYPT MBEDTLS_BLOWFISH_ENCRYPT\nBLOWFISH_MAX_KEY MBEDTLS_BLOWFISH_MAX_KEY_BITS\nBLOWFISH_MIN_KEY MBEDTLS_BLOWFISH_MIN_KEY_BITS\nBLOWFISH_ROUNDS MBEDTLS_BLOWFISH_ROUNDS\nCAMELLIA_DECRYPT MBEDTLS_CAMELLIA_DECRYPT\nCAMELLIA_ENCRYPT MBEDTLS_CAMELLIA_ENCRYPT\nCOLLECT_SIZE MBEDTLS_HAVEGE_COLLECT_SIZE\nCTR_DRBG_BLOCKSIZE MBEDTLS_CTR_DRBG_BLOCKSIZE\nCTR_DRBG_ENTROPY_LEN MBEDTLS_CTR_DRBG_ENTROPY_LEN\nCTR_DRBG_KEYBITS MBEDTLS_CTR_DRBG_KEYBITS\nCTR_DRBG_KEYSIZE MBEDTLS_CTR_DRBG_KEYSIZE\nCTR_DRBG_MAX_INPUT MBEDTLS_CTR_DRBG_MAX_INPUT\nCTR_DRBG_MAX_REQUEST MBEDTLS_CTR_DRBG_MAX_REQUEST\nCTR_DRBG_MAX_SEED_INPUT MBEDTLS_CTR_DRBG_MAX_SEED_INPUT\nCTR_DRBG_PR_OFF MBEDTLS_CTR_DRBG_PR_OFF\nCTR_DRBG_PR_ON MBEDTLS_CTR_DRBG_PR_ON\nCTR_DRBG_RESEED_INTERVAL MBEDTLS_CTR_DRBG_RESEED_INTERVAL\nCTR_DRBG_SEEDLEN MBEDTLS_CTR_DRBG_SEEDLEN\nDEPRECATED MBEDTLS_DEPRECATED\nDES_DECRYPT MBEDTLS_DES_DECRYPT\nDES_ENCRYPT MBEDTLS_DES_ENCRYPT\nDES_KEY_SIZE MBEDTLS_DES_KEY_SIZE\nENTROPY_BLOCK_SIZE MBEDTLS_ENTROPY_BLOCK_SIZE\nENTROPY_MAX_GATHER MBEDTLS_ENTROPY_MAX_GATHER\nENTROPY_MAX_SEED_SIZE MBEDTLS_ENTROPY_MAX_SEED_SIZE\nENTROPY_MAX_SOURCES MBEDTLS_ENTROPY_MAX_SOURCES\nENTROPY_MIN_HARDCLOCK MBEDTLS_ENTROPY_MIN_HARDCLOCK\nENTROPY_MIN_HAVEGE MBEDTLS_ENTROPY_MIN_HAVEGE\nENTROPY_MIN_PLATFORM MBEDTLS_ENTROPY_MIN_PLATFORM\nENTROPY_SOURCE_MANUAL MBEDTLS_ENTROPY_SOURCE_MANUAL\nEXT_AUTHORITY_KEY_IDENTIFIER MBEDTLS_X509_EXT_AUTHORITY_KEY_IDENTIFIER\nEXT_BASIC_CONSTRAINTS MBEDTLS_X509_EXT_BASIC_CONSTRAINTS\nEXT_CERTIFICATE_POLICIES MBEDTLS_X509_EXT_CERTIFICATE_POLICIES\nEXT_CRL_DISTRIBUTION_POINTS MBEDTLS_X509_EXT_CRL_DISTRIBUTION_POINTS\nEXT_EXTENDED_KEY_USAGE MBEDTLS_X509_EXT_EXTENDED_KEY_USAGE\nEXT_FRESHEST_CRL MBEDTLS_X509_EXT_FRESHEST_CRL\nEXT_INIHIBIT_ANYPOLICY MBEDTLS_X509_EXT_INIHIBIT_ANYPOLICY\nEXT_ISSUER_ALT_NAME MBEDTLS_X509_EXT_ISSUER_ALT_NAME\nEXT_KEY_USAGE MBEDTLS_X509_EXT_KEY_USAGE\nEXT_NAME_CONSTRAINTS MBEDTLS_X509_EXT_NAME_CONSTRAINTS\nEXT_NS_CERT_TYPE MBEDTLS_X509_EXT_NS_CERT_TYPE\nEXT_POLICY_CONSTRAINTS MBEDTLS_X509_EXT_POLICY_CONSTRAINTS\nEXT_POLICY_MAPPINGS MBEDTLS_X509_EXT_POLICY_MAPPINGS\nEXT_SUBJECT_ALT_NAME MBEDTLS_X509_EXT_SUBJECT_ALT_NAME\nEXT_SUBJECT_DIRECTORY_ATTRS MBEDTLS_X509_EXT_SUBJECT_DIRECTORY_ATTRS\nEXT_SUBJECT_KEY_IDENTIFIER MBEDTLS_X509_EXT_SUBJECT_KEY_IDENTIFIER\nGCM_DECRYPT MBEDTLS_GCM_DECRYPT\nGCM_ENCRYPT MBEDTLS_GCM_ENCRYPT\nKU_CRL_SIGN MBEDTLS_X509_KU_CRL_SIGN\nKU_DATA_ENCIPHERMENT MBEDTLS_X509_KU_DATA_ENCIPHERMENT\nKU_DIGITAL_SIGNATURE MBEDTLS_X509_KU_DIGITAL_SIGNATURE\nKU_KEY_AGREEMENT MBEDTLS_X509_KU_KEY_AGREEMENT\nKU_KEY_CERT_SIGN MBEDTLS_X509_KU_KEY_CERT_SIGN\nKU_KEY_ENCIPHERMENT MBEDTLS_X509_KU_KEY_ENCIPHERMENT\nKU_NON_REPUDIATION MBEDTLS_X509_KU_NON_REPUDIATION\nLN_2_DIV_LN_10_SCALE100 MBEDTLS_LN_2_DIV_LN_10_SCALE100\nMD_CONTEXT_T_INIT MBEDTLS_MD_CONTEXT_T_INIT\nMEMORY_VERIFY_ALLOC MBEDTLS_MEMORY_VERIFY_ALLOC\nMEMORY_VERIFY_ALWAYS MBEDTLS_MEMORY_VERIFY_ALWAYS\nMEMORY_VERIFY_FREE MBEDTLS_MEMORY_VERIFY_FREE\nMEMORY_VERIFY_NONE MBEDTLS_MEMORY_VERIFY_NONE\nMPI_CHK MBEDTLS_MPI_CHK\nNET_PROTO_TCP MBEDTLS_NET_PROTO_TCP\nNET_PROTO_UDP MBEDTLS_NET_PROTO_UDP\nNS_CERT_TYPE_EMAIL MBEDTLS_X509_NS_CERT_TYPE_EMAIL\nNS_CERT_TYPE_EMAIL_CA MBEDTLS_X509_NS_CERT_TYPE_EMAIL_CA\nNS_CERT_TYPE_OBJECT_SIGNING MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING\nNS_CERT_TYPE_OBJECT_SIGNING_CA MBEDTLS_X509_NS_CERT_TYPE_OBJECT_SIGNING_CA\nNS_CERT_TYPE_RESERVED MBEDTLS_X509_NS_CERT_TYPE_RESERVED\nNS_CERT_TYPE_SSL_CA MBEDTLS_X509_NS_CERT_TYPE_SSL_CA\nNS_CERT_TYPE_SSL_CLIENT MBEDTLS_X509_NS_CERT_TYPE_SSL_CLIENT\nNS_CERT_TYPE_SSL_SERVER MBEDTLS_X509_NS_CERT_TYPE_SSL_SERVER\nOID_ANSI_X9_62 MBEDTLS_OID_ANSI_X9_62\nOID_ANSI_X9_62_FIELD_TYPE MBEDTLS_OID_ANSI_X9_62_FIELD_TYPE\nOID_ANSI_X9_62_PRIME_FIELD MBEDTLS_OID_ANSI_X9_62_PRIME_FIELD\nOID_ANSI_X9_62_SIG MBEDTLS_OID_ANSI_X9_62_SIG\nOID_ANSI_X9_62_SIG_SHA2 MBEDTLS_OID_ANSI_X9_62_SIG_SHA2\nOID_ANY_EXTENDED_KEY_USAGE MBEDTLS_OID_ANY_EXTENDED_KEY_USAGE\nOID_AT MBEDTLS_OID_AT\nOID_AT_CN MBEDTLS_OID_AT_CN\nOID_AT_COUNTRY MBEDTLS_OID_AT_COUNTRY\nOID_AT_DN_QUALIFIER MBEDTLS_OID_AT_DN_QUALIFIER\nOID_AT_GENERATION_QUALIFIER MBEDTLS_OID_AT_GENERATION_QUALIFIER\nOID_AT_GIVEN_NAME MBEDTLS_OID_AT_GIVEN_NAME\nOID_AT_INITIALS MBEDTLS_OID_AT_INITIALS\nOID_AT_LOCALITY MBEDTLS_OID_AT_LOCALITY\nOID_AT_ORGANIZATION MBEDTLS_OID_AT_ORGANIZATION\nOID_AT_ORG_UNIT MBEDTLS_OID_AT_ORG_UNIT\nOID_AT_POSTAL_ADDRESS MBEDTLS_OID_AT_POSTAL_ADDRESS\nOID_AT_POSTAL_CODE MBEDTLS_OID_AT_POSTAL_CODE\nOID_AT_PSEUDONYM MBEDTLS_OID_AT_PSEUDONYM\nOID_AT_SERIAL_NUMBER MBEDTLS_OID_AT_SERIAL_NUMBER\nOID_AT_STATE MBEDTLS_OID_AT_STATE\nOID_AT_SUR_NAME MBEDTLS_OID_AT_SUR_NAME\nOID_AT_TITLE MBEDTLS_OID_AT_TITLE\nOID_AT_UNIQUE_IDENTIFIER MBEDTLS_OID_AT_UNIQUE_IDENTIFIER\nOID_AUTHORITY_KEY_IDENTIFIER MBEDTLS_OID_AUTHORITY_KEY_IDENTIFIER\nOID_BASIC_CONSTRAINTS MBEDTLS_OID_BASIC_CONSTRAINTS\nOID_CERTICOM MBEDTLS_OID_CERTICOM\nOID_CERTIFICATE_POLICIES MBEDTLS_OID_CERTIFICATE_POLICIES\nOID_CLIENT_AUTH MBEDTLS_OID_CLIENT_AUTH\nOID_CMP MBEDTLS_OID_CMP\nOID_CODE_SIGNING MBEDTLS_OID_CODE_SIGNING\nOID_COUNTRY_US MBEDTLS_OID_COUNTRY_US\nOID_CRL_DISTRIBUTION_POINTS MBEDTLS_OID_CRL_DISTRIBUTION_POINTS\nOID_CRL_NUMBER MBEDTLS_OID_CRL_NUMBER\nOID_DES_CBC MBEDTLS_OID_DES_CBC\nOID_DES_EDE3_CBC MBEDTLS_OID_DES_EDE3_CBC\nOID_DIGEST_ALG_MD2 MBEDTLS_OID_DIGEST_ALG_MD2\nOID_DIGEST_ALG_MD4 MBEDTLS_OID_DIGEST_ALG_MD4\nOID_DIGEST_ALG_MD5 MBEDTLS_OID_DIGEST_ALG_MD5\nOID_DIGEST_ALG_SHA1 MBEDTLS_OID_DIGEST_ALG_SHA1\nOID_DIGEST_ALG_SHA224 MBEDTLS_OID_DIGEST_ALG_SHA224\nOID_DIGEST_ALG_SHA256 MBEDTLS_OID_DIGEST_ALG_SHA256\nOID_DIGEST_ALG_SHA384 MBEDTLS_OID_DIGEST_ALG_SHA384\nOID_DIGEST_ALG_SHA512 MBEDTLS_OID_DIGEST_ALG_SHA512\nOID_DOMAIN_COMPONENT MBEDTLS_OID_DOMAIN_COMPONENT\nOID_ECDSA_SHA1 MBEDTLS_OID_ECDSA_SHA1\nOID_ECDSA_SHA224 MBEDTLS_OID_ECDSA_SHA224\nOID_ECDSA_SHA256 MBEDTLS_OID_ECDSA_SHA256\nOID_ECDSA_SHA384 MBEDTLS_OID_ECDSA_SHA384\nOID_ECDSA_SHA512 MBEDTLS_OID_ECDSA_SHA512\nOID_EC_ALG_ECDH MBEDTLS_OID_EC_ALG_ECDH\nOID_EC_ALG_UNRESTRICTED MBEDTLS_OID_EC_ALG_UNRESTRICTED\nOID_EC_BRAINPOOL_V1 MBEDTLS_OID_EC_BRAINPOOL_V1\nOID_EC_GRP_BP256R1 MBEDTLS_OID_EC_GRP_BP256R1\nOID_EC_GRP_BP384R1 MBEDTLS_OID_EC_GRP_BP384R1\nOID_EC_GRP_BP512R1 MBEDTLS_OID_EC_GRP_BP512R1\nOID_EC_GRP_SECP192K1 MBEDTLS_OID_EC_GRP_SECP192K1\nOID_EC_GRP_SECP192R1 MBEDTLS_OID_EC_GRP_SECP192R1\nOID_EC_GRP_SECP224K1 MBEDTLS_OID_EC_GRP_SECP224K1\nOID_EC_GRP_SECP224R1 MBEDTLS_OID_EC_GRP_SECP224R1\nOID_EC_GRP_SECP256K1 MBEDTLS_OID_EC_GRP_SECP256K1\nOID_EC_GRP_SECP256R1 MBEDTLS_OID_EC_GRP_SECP256R1\nOID_EC_GRP_SECP384R1 MBEDTLS_OID_EC_GRP_SECP384R1\nOID_EC_GRP_SECP521R1 MBEDTLS_OID_EC_GRP_SECP521R1\nOID_EMAIL_PROTECTION MBEDTLS_OID_EMAIL_PROTECTION\nOID_EXTENDED_KEY_USAGE MBEDTLS_OID_EXTENDED_KEY_USAGE\nOID_FRESHEST_CRL MBEDTLS_OID_FRESHEST_CRL\nOID_GOV MBEDTLS_OID_GOV\nOID_HMAC_SHA1 MBEDTLS_OID_HMAC_SHA1\nOID_ID_CE MBEDTLS_OID_ID_CE\nOID_INIHIBIT_ANYPOLICY MBEDTLS_OID_INIHIBIT_ANYPOLICY\nOID_ISO_CCITT_DS MBEDTLS_OID_ISO_CCITT_DS\nOID_ISO_IDENTIFIED_ORG MBEDTLS_OID_ISO_IDENTIFIED_ORG\nOID_ISO_ITU_COUNTRY MBEDTLS_OID_ISO_ITU_COUNTRY\nOID_ISO_ITU_US_ORG MBEDTLS_OID_ISO_ITU_US_ORG\nOID_ISO_MEMBER_BODIES MBEDTLS_OID_ISO_MEMBER_BODIES\nOID_ISSUER_ALT_NAME MBEDTLS_OID_ISSUER_ALT_NAME\nOID_KEY_USAGE MBEDTLS_OID_KEY_USAGE\nOID_KP MBEDTLS_OID_KP\nOID_MGF1 MBEDTLS_OID_MGF1\nOID_NAME_CONSTRAINTS MBEDTLS_OID_NAME_CONSTRAINTS\nOID_NETSCAPE MBEDTLS_OID_NETSCAPE\nOID_NS_BASE_URL MBEDTLS_OID_NS_BASE_URL\nOID_NS_CA_POLICY_URL MBEDTLS_OID_NS_CA_POLICY_URL\nOID_NS_CA_REVOCATION_URL MBEDTLS_OID_NS_CA_REVOCATION_URL\nOID_NS_CERT MBEDTLS_OID_NS_CERT\nOID_NS_CERT_SEQUENCE MBEDTLS_OID_NS_CERT_SEQUENCE\nOID_NS_CERT_TYPE MBEDTLS_OID_NS_CERT_TYPE\nOID_NS_COMMENT MBEDTLS_OID_NS_COMMENT\nOID_NS_DATA_TYPE MBEDTLS_OID_NS_DATA_TYPE\nOID_NS_RENEWAL_URL MBEDTLS_OID_NS_RENEWAL_URL\nOID_NS_REVOCATION_URL MBEDTLS_OID_NS_REVOCATION_URL\nOID_NS_SSL_SERVER_NAME MBEDTLS_OID_NS_SSL_SERVER_NAME\nOID_OCSP_SIGNING MBEDTLS_OID_OCSP_SIGNING\nOID_OIW_SECSIG MBEDTLS_OID_OIW_SECSIG\nOID_OIW_SECSIG_ALG MBEDTLS_OID_OIW_SECSIG_ALG\nOID_OIW_SECSIG_SHA1 MBEDTLS_OID_OIW_SECSIG_SHA1\nOID_ORGANIZATION MBEDTLS_OID_ORGANIZATION\nOID_ORG_ANSI_X9_62 MBEDTLS_OID_ORG_ANSI_X9_62\nOID_ORG_CERTICOM MBEDTLS_OID_ORG_CERTICOM\nOID_ORG_DOD MBEDTLS_OID_ORG_DOD\nOID_ORG_GOV MBEDTLS_OID_ORG_GOV\nOID_ORG_NETSCAPE MBEDTLS_OID_ORG_NETSCAPE\nOID_ORG_OIW MBEDTLS_OID_ORG_OIW\nOID_ORG_RSA_DATA_SECURITY MBEDTLS_OID_ORG_RSA_DATA_SECURITY\nOID_ORG_TELETRUST MBEDTLS_OID_ORG_TELETRUST\nOID_PKCS MBEDTLS_OID_PKCS\nOID_PKCS1 MBEDTLS_OID_PKCS1\nOID_PKCS12 MBEDTLS_OID_PKCS12\nOID_PKCS12_PBE MBEDTLS_OID_PKCS12_PBE\nOID_PKCS12_PBE_SHA1_DES2_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES2_EDE_CBC\nOID_PKCS12_PBE_SHA1_DES3_EDE_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_DES3_EDE_CBC\nOID_PKCS12_PBE_SHA1_RC2_128_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_128_CBC\nOID_PKCS12_PBE_SHA1_RC2_40_CBC MBEDTLS_OID_PKCS12_PBE_SHA1_RC2_40_CBC\nOID_PKCS12_PBE_SHA1_RC4_128 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_128\nOID_PKCS12_PBE_SHA1_RC4_40 MBEDTLS_OID_PKCS12_PBE_SHA1_RC4_40\nOID_PKCS1_MD2 MBEDTLS_OID_PKCS1_MD2\nOID_PKCS1_MD4 MBEDTLS_OID_PKCS1_MD4\nOID_PKCS1_MD5 MBEDTLS_OID_PKCS1_MD5\nOID_PKCS1_RSA MBEDTLS_OID_PKCS1_RSA\nOID_PKCS1_SHA1 MBEDTLS_OID_PKCS1_SHA1\nOID_PKCS1_SHA224 MBEDTLS_OID_PKCS1_SHA224\nOID_PKCS1_SHA256 MBEDTLS_OID_PKCS1_SHA256\nOID_PKCS1_SHA384 MBEDTLS_OID_PKCS1_SHA384\nOID_PKCS1_SHA512 MBEDTLS_OID_PKCS1_SHA512\nOID_PKCS5 MBEDTLS_OID_PKCS5\nOID_PKCS5_PBES2 MBEDTLS_OID_PKCS5_PBES2\nOID_PKCS5_PBE_MD2_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD2_DES_CBC\nOID_PKCS5_PBE_MD2_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD2_RC2_CBC\nOID_PKCS5_PBE_MD5_DES_CBC MBEDTLS_OID_PKCS5_PBE_MD5_DES_CBC\nOID_PKCS5_PBE_MD5_RC2_CBC MBEDTLS_OID_PKCS5_PBE_MD5_RC2_CBC\nOID_PKCS5_PBE_SHA1_DES_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_DES_CBC\nOID_PKCS5_PBE_SHA1_RC2_CBC MBEDTLS_OID_PKCS5_PBE_SHA1_RC2_CBC\nOID_PKCS5_PBKDF2 MBEDTLS_OID_PKCS5_PBKDF2\nOID_PKCS5_PBMAC1 MBEDTLS_OID_PKCS5_PBMAC1\nOID_PKCS9 MBEDTLS_OID_PKCS9\nOID_PKCS9_CSR_EXT_REQ MBEDTLS_OID_PKCS9_CSR_EXT_REQ\nOID_PKCS9_EMAIL MBEDTLS_OID_PKCS9_EMAIL\nOID_PKIX MBEDTLS_OID_PKIX\nOID_POLICY_CONSTRAINTS MBEDTLS_OID_POLICY_CONSTRAINTS\nOID_POLICY_MAPPINGS MBEDTLS_OID_POLICY_MAPPINGS\nOID_PRIVATE_KEY_USAGE_PERIOD MBEDTLS_OID_PRIVATE_KEY_USAGE_PERIOD\nOID_RSASSA_PSS MBEDTLS_OID_RSASSA_PSS\nOID_RSA_COMPANY MBEDTLS_OID_RSA_COMPANY\nOID_RSA_SHA_OBS MBEDTLS_OID_RSA_SHA_OBS\nOID_SERVER_AUTH MBEDTLS_OID_SERVER_AUTH\nOID_SIZE MBEDTLS_OID_SIZE\nOID_SUBJECT_ALT_NAME MBEDTLS_OID_SUBJECT_ALT_NAME\nOID_SUBJECT_DIRECTORY_ATTRS MBEDTLS_OID_SUBJECT_DIRECTORY_ATTRS\nOID_SUBJECT_KEY_IDENTIFIER MBEDTLS_OID_SUBJECT_KEY_IDENTIFIER\nOID_TELETRUST MBEDTLS_OID_TELETRUST\nOID_TIME_STAMPING MBEDTLS_OID_TIME_STAMPING\nPADLOCK_ACE MBEDTLS_PADLOCK_ACE\nPADLOCK_ALIGN16 MBEDTLS_PADLOCK_ALIGN16\nPADLOCK_PHE MBEDTLS_PADLOCK_PHE\nPADLOCK_PMM MBEDTLS_PADLOCK_PMM\nPADLOCK_RNG MBEDTLS_PADLOCK_RNG\nPKCS12_DERIVE_IV MBEDTLS_PKCS12_DERIVE_IV\nPKCS12_DERIVE_KEY MBEDTLS_PKCS12_DERIVE_KEY\nPKCS12_DERIVE_MAC_KEY MBEDTLS_PKCS12_DERIVE_MAC_KEY\nPKCS12_PBE_DECRYPT MBEDTLS_PKCS12_PBE_DECRYPT\nPKCS12_PBE_ENCRYPT MBEDTLS_PKCS12_PBE_ENCRYPT\nPKCS5_DECRYPT MBEDTLS_PKCS5_DECRYPT\nPKCS5_ENCRYPT MBEDTLS_PKCS5_ENCRYPT\nPOLARSSL_AESNI_AES MBEDTLS_AESNI_AES\nPOLARSSL_AESNI_C MBEDTLS_AESNI_C\nPOLARSSL_AESNI_CLMUL MBEDTLS_AESNI_CLMUL\nPOLARSSL_AESNI_H MBEDTLS_AESNI_H\nPOLARSSL_AES_ALT MBEDTLS_AES_ALT\nPOLARSSL_AES_C MBEDTLS_AES_C\nPOLARSSL_AES_H MBEDTLS_AES_H\nPOLARSSL_AES_ROM_TABLES MBEDTLS_AES_ROM_TABLES\nPOLARSSL_ARC4_ALT MBEDTLS_ARC4_ALT\nPOLARSSL_ARC4_C MBEDTLS_ARC4_C\nPOLARSSL_ARC4_H MBEDTLS_ARC4_H\nPOLARSSL_ASN1_H MBEDTLS_ASN1_H\nPOLARSSL_ASN1_PARSE_C MBEDTLS_ASN1_PARSE_C\nPOLARSSL_ASN1_WRITE_C MBEDTLS_ASN1_WRITE_C\nPOLARSSL_ASN1_WRITE_H MBEDTLS_ASN1_WRITE_H\nPOLARSSL_BASE64_C MBEDTLS_BASE64_C\nPOLARSSL_BASE64_H MBEDTLS_BASE64_H\nPOLARSSL_BIGNUM_C MBEDTLS_BIGNUM_C\nPOLARSSL_BIGNUM_H MBEDTLS_BIGNUM_H\nPOLARSSL_BLOWFISH_ALT MBEDTLS_BLOWFISH_ALT\nPOLARSSL_BLOWFISH_C MBEDTLS_BLOWFISH_C\nPOLARSSL_BLOWFISH_H MBEDTLS_BLOWFISH_H\nPOLARSSL_BN_MUL_H MBEDTLS_BN_MUL_H\nPOLARSSL_CAMELLIA_ALT MBEDTLS_CAMELLIA_ALT\nPOLARSSL_CAMELLIA_C MBEDTLS_CAMELLIA_C\nPOLARSSL_CAMELLIA_H MBEDTLS_CAMELLIA_H\nPOLARSSL_CAMELLIA_SMALL_MEMORY MBEDTLS_CAMELLIA_SMALL_MEMORY\nPOLARSSL_CCM_C MBEDTLS_CCM_C\nPOLARSSL_CCM_H MBEDTLS_CCM_H\nPOLARSSL_CERTS_C MBEDTLS_CERTS_C\nPOLARSSL_CERTS_H MBEDTLS_CERTS_H\nPOLARSSL_CHECK_CONFIG_H MBEDTLS_CHECK_CONFIG_H\nPOLARSSL_CIPHERSUITE_NODTLS MBEDTLS_CIPHERSUITE_NODTLS\nPOLARSSL_CIPHERSUITE_SHORT_TAG MBEDTLS_CIPHERSUITE_SHORT_TAG\nPOLARSSL_CIPHERSUITE_WEAK MBEDTLS_CIPHERSUITE_WEAK\nPOLARSSL_CIPHER_AES_128_CBC MBEDTLS_CIPHER_AES_128_CBC\nPOLARSSL_CIPHER_AES_128_CCM MBEDTLS_CIPHER_AES_128_CCM\nPOLARSSL_CIPHER_AES_128_CFB128 MBEDTLS_CIPHER_AES_128_CFB128\nPOLARSSL_CIPHER_AES_128_CTR MBEDTLS_CIPHER_AES_128_CTR\nPOLARSSL_CIPHER_AES_128_ECB MBEDTLS_CIPHER_AES_128_ECB\nPOLARSSL_CIPHER_AES_128_GCM MBEDTLS_CIPHER_AES_128_GCM\nPOLARSSL_CIPHER_AES_192_CBC MBEDTLS_CIPHER_AES_192_CBC\nPOLARSSL_CIPHER_AES_192_CCM MBEDTLS_CIPHER_AES_192_CCM\nPOLARSSL_CIPHER_AES_192_CFB128 MBEDTLS_CIPHER_AES_192_CFB128\nPOLARSSL_CIPHER_AES_192_CTR MBEDTLS_CIPHER_AES_192_CTR\nPOLARSSL_CIPHER_AES_192_ECB MBEDTLS_CIPHER_AES_192_ECB\nPOLARSSL_CIPHER_AES_192_GCM MBEDTLS_CIPHER_AES_192_GCM\nPOLARSSL_CIPHER_AES_256_CBC MBEDTLS_CIPHER_AES_256_CBC\nPOLARSSL_CIPHER_AES_256_CCM MBEDTLS_CIPHER_AES_256_CCM\nPOLARSSL_CIPHER_AES_256_CFB128 MBEDTLS_CIPHER_AES_256_CFB128\nPOLARSSL_CIPHER_AES_256_CTR MBEDTLS_CIPHER_AES_256_CTR\nPOLARSSL_CIPHER_AES_256_ECB MBEDTLS_CIPHER_AES_256_ECB\nPOLARSSL_CIPHER_AES_256_GCM MBEDTLS_CIPHER_AES_256_GCM\nPOLARSSL_CIPHER_ARC4_128 MBEDTLS_CIPHER_ARC4_128\nPOLARSSL_CIPHER_BLOWFISH_CBC MBEDTLS_CIPHER_BLOWFISH_CBC\nPOLARSSL_CIPHER_BLOWFISH_CFB64 MBEDTLS_CIPHER_BLOWFISH_CFB64\nPOLARSSL_CIPHER_BLOWFISH_CTR MBEDTLS_CIPHER_BLOWFISH_CTR\nPOLARSSL_CIPHER_BLOWFISH_ECB MBEDTLS_CIPHER_BLOWFISH_ECB\nPOLARSSL_CIPHER_C MBEDTLS_CIPHER_C\nPOLARSSL_CIPHER_CAMELLIA_128_CBC MBEDTLS_CIPHER_CAMELLIA_128_CBC\nPOLARSSL_CIPHER_CAMELLIA_128_CCM MBEDTLS_CIPHER_CAMELLIA_128_CCM\nPOLARSSL_CIPHER_CAMELLIA_128_CFB128 MBEDTLS_CIPHER_CAMELLIA_128_CFB128\nPOLARSSL_CIPHER_CAMELLIA_128_CTR MBEDTLS_CIPHER_CAMELLIA_128_CTR\nPOLARSSL_CIPHER_CAMELLIA_128_ECB MBEDTLS_CIPHER_CAMELLIA_128_ECB\nPOLARSSL_CIPHER_CAMELLIA_128_GCM MBEDTLS_CIPHER_CAMELLIA_128_GCM\nPOLARSSL_CIPHER_CAMELLIA_192_CBC MBEDTLS_CIPHER_CAMELLIA_192_CBC\nPOLARSSL_CIPHER_CAMELLIA_192_CCM MBEDTLS_CIPHER_CAMELLIA_192_CCM\nPOLARSSL_CIPHER_CAMELLIA_192_CFB128 MBEDTLS_CIPHER_CAMELLIA_192_CFB128\nPOLARSSL_CIPHER_CAMELLIA_192_CTR MBEDTLS_CIPHER_CAMELLIA_192_CTR\nPOLARSSL_CIPHER_CAMELLIA_192_ECB MBEDTLS_CIPHER_CAMELLIA_192_ECB\nPOLARSSL_CIPHER_CAMELLIA_192_GCM MBEDTLS_CIPHER_CAMELLIA_192_GCM\nPOLARSSL_CIPHER_CAMELLIA_256_CBC MBEDTLS_CIPHER_CAMELLIA_256_CBC\nPOLARSSL_CIPHER_CAMELLIA_256_CCM MBEDTLS_CIPHER_CAMELLIA_256_CCM\nPOLARSSL_CIPHER_CAMELLIA_256_CFB128 MBEDTLS_CIPHER_CAMELLIA_256_CFB128\nPOLARSSL_CIPHER_CAMELLIA_256_CTR MBEDTLS_CIPHER_CAMELLIA_256_CTR\nPOLARSSL_CIPHER_CAMELLIA_256_ECB MBEDTLS_CIPHER_CAMELLIA_256_ECB\nPOLARSSL_CIPHER_CAMELLIA_256_GCM MBEDTLS_CIPHER_CAMELLIA_256_GCM\nPOLARSSL_CIPHER_DES_CBC MBEDTLS_CIPHER_DES_CBC\nPOLARSSL_CIPHER_DES_ECB MBEDTLS_CIPHER_DES_ECB\nPOLARSSL_CIPHER_DES_EDE3_CBC MBEDTLS_CIPHER_DES_EDE3_CBC\nPOLARSSL_CIPHER_DES_EDE3_ECB MBEDTLS_CIPHER_DES_EDE3_ECB\nPOLARSSL_CIPHER_DES_EDE_CBC MBEDTLS_CIPHER_DES_EDE_CBC\nPOLARSSL_CIPHER_DES_EDE_ECB MBEDTLS_CIPHER_DES_EDE_ECB\nPOLARSSL_CIPHER_H MBEDTLS_CIPHER_H\nPOLARSSL_CIPHER_ID_3DES MBEDTLS_CIPHER_ID_3DES\nPOLARSSL_CIPHER_ID_AES MBEDTLS_CIPHER_ID_AES\nPOLARSSL_CIPHER_ID_ARC4 MBEDTLS_CIPHER_ID_ARC4\nPOLARSSL_CIPHER_ID_BLOWFISH MBEDTLS_CIPHER_ID_BLOWFISH\nPOLARSSL_CIPHER_ID_CAMELLIA MBEDTLS_CIPHER_ID_CAMELLIA\nPOLARSSL_CIPHER_ID_DES MBEDTLS_CIPHER_ID_DES\nPOLARSSL_CIPHER_ID_NONE MBEDTLS_CIPHER_ID_NONE\nPOLARSSL_CIPHER_ID_NULL MBEDTLS_CIPHER_ID_NULL\nPOLARSSL_CIPHER_MODE_AEAD MBEDTLS_CIPHER_MODE_AEAD\nPOLARSSL_CIPHER_MODE_CBC MBEDTLS_CIPHER_MODE_CBC\nPOLARSSL_CIPHER_MODE_CFB MBEDTLS_CIPHER_MODE_CFB\nPOLARSSL_CIPHER_MODE_CTR MBEDTLS_CIPHER_MODE_CTR\nPOLARSSL_CIPHER_MODE_STREAM MBEDTLS_CIPHER_MODE_STREAM\nPOLARSSL_CIPHER_MODE_WITH_PADDING MBEDTLS_CIPHER_MODE_WITH_PADDING\nPOLARSSL_CIPHER_NONE MBEDTLS_CIPHER_NONE\nPOLARSSL_CIPHER_NULL MBEDTLS_CIPHER_NULL\nPOLARSSL_CIPHER_NULL_CIPHER MBEDTLS_CIPHER_NULL_CIPHER\nPOLARSSL_CIPHER_PADDING_ONE_AND_ZEROS MBEDTLS_CIPHER_PADDING_ONE_AND_ZEROS\nPOLARSSL_CIPHER_PADDING_PKCS7 MBEDTLS_CIPHER_PADDING_PKCS7\nPOLARSSL_CIPHER_PADDING_ZEROS MBEDTLS_CIPHER_PADDING_ZEROS\nPOLARSSL_CIPHER_PADDING_ZEROS_AND_LEN MBEDTLS_CIPHER_PADDING_ZEROS_AND_LEN\nPOLARSSL_CIPHER_VARIABLE_IV_LEN MBEDTLS_CIPHER_VARIABLE_IV_LEN\nPOLARSSL_CIPHER_VARIABLE_KEY_LEN MBEDTLS_CIPHER_VARIABLE_KEY_LEN\nPOLARSSL_CIPHER_WRAP_H MBEDTLS_CIPHER_WRAP_H\nPOLARSSL_CONFIG_FILE MBEDTLS_CONFIG_FILE\nPOLARSSL_CONFIG_H MBEDTLS_CONFIG_H\nPOLARSSL_CTR_DRBG_C MBEDTLS_CTR_DRBG_C\nPOLARSSL_CTR_DRBG_H MBEDTLS_CTR_DRBG_H\nPOLARSSL_DEBUG_C MBEDTLS_DEBUG_C\nPOLARSSL_DEBUG_DFL_MODE MBEDTLS_DEBUG_DFL_MODE\nPOLARSSL_DEBUG_H MBEDTLS_DEBUG_H\nPOLARSSL_DEBUG_LOG_FULL MBEDTLS_DEBUG_LOG_FULL\nPOLARSSL_DEBUG_LOG_RAW MBEDTLS_DEBUG_LOG_RAW\nPOLARSSL_DECRYPT MBEDTLS_DECRYPT\nPOLARSSL_DEPRECATED_REMOVED MBEDTLS_DEPRECATED_REMOVED\nPOLARSSL_DEPRECATED_WARNING MBEDTLS_DEPRECATED_WARNING\nPOLARSSL_DES_ALT MBEDTLS_DES_ALT\nPOLARSSL_DES_C MBEDTLS_DES_C\nPOLARSSL_DES_H MBEDTLS_DES_H\nPOLARSSL_DHM_C MBEDTLS_DHM_C\nPOLARSSL_DHM_H MBEDTLS_DHM_H\nPOLARSSL_DHM_RFC2409_MODP_1024_G MBEDTLS_DHM_RFC2409_MODP_1024_G\nPOLARSSL_DHM_RFC2409_MODP_1024_P MBEDTLS_DHM_RFC2409_MODP_1024_P\nPOLARSSL_DHM_RFC3526_MODP_2048_G MBEDTLS_DHM_RFC3526_MODP_2048_G\nPOLARSSL_DHM_RFC3526_MODP_2048_P MBEDTLS_DHM_RFC3526_MODP_2048_P\nPOLARSSL_DHM_RFC3526_MODP_3072_G MBEDTLS_DHM_RFC3526_MODP_3072_G\nPOLARSSL_DHM_RFC3526_MODP_3072_P MBEDTLS_DHM_RFC3526_MODP_3072_P\nPOLARSSL_DHM_RFC5114_MODP_1024_G MBEDTLS_DHM_RFC5114_MODP_1024_G\nPOLARSSL_DHM_RFC5114_MODP_1024_P MBEDTLS_DHM_RFC5114_MODP_1024_P\nPOLARSSL_DHM_RFC5114_MODP_2048_G MBEDTLS_DHM_RFC5114_MODP_2048_G\nPOLARSSL_DHM_RFC5114_MODP_2048_P MBEDTLS_DHM_RFC5114_MODP_2048_P\nPOLARSSL_ECDH_C MBEDTLS_ECDH_C\nPOLARSSL_ECDH_H MBEDTLS_ECDH_H\nPOLARSSL_ECDH_OURS MBEDTLS_ECDH_OURS\nPOLARSSL_ECDH_THEIRS MBEDTLS_ECDH_THEIRS\nPOLARSSL_ECDSA_C MBEDTLS_ECDSA_C\nPOLARSSL_ECDSA_DETERMINISTIC MBEDTLS_ECDSA_DETERMINISTIC\nPOLARSSL_ECDSA_H MBEDTLS_ECDSA_H\nPOLARSSL_ECP_C MBEDTLS_ECP_C\nPOLARSSL_ECP_DP_BP256R1 MBEDTLS_ECP_DP_BP256R1\nPOLARSSL_ECP_DP_BP256R1_ENABLED MBEDTLS_ECP_DP_BP256R1_ENABLED\nPOLARSSL_ECP_DP_BP384R1 MBEDTLS_ECP_DP_BP384R1\nPOLARSSL_ECP_DP_BP384R1_ENABLED MBEDTLS_ECP_DP_BP384R1_ENABLED\nPOLARSSL_ECP_DP_BP512R1 MBEDTLS_ECP_DP_BP512R1\nPOLARSSL_ECP_DP_BP512R1_ENABLED MBEDTLS_ECP_DP_BP512R1_ENABLED\nPOLARSSL_ECP_DP_M255 MBEDTLS_ECP_DP_CURVE25519\nPOLARSSL_ECP_DP_M255_ENABLED MBEDTLS_ECP_DP_CURVE25519_ENABLED\nPOLARSSL_ECP_DP_MAX MBEDTLS_ECP_DP_MAX\nPOLARSSL_ECP_DP_NONE MBEDTLS_ECP_DP_NONE\nPOLARSSL_ECP_DP_SECP192K1 MBEDTLS_ECP_DP_SECP192K1\nPOLARSSL_ECP_DP_SECP192K1_ENABLED MBEDTLS_ECP_DP_SECP192K1_ENABLED\nPOLARSSL_ECP_DP_SECP192R1 MBEDTLS_ECP_DP_SECP192R1\nPOLARSSL_ECP_DP_SECP192R1_ENABLED MBEDTLS_ECP_DP_SECP192R1_ENABLED\nPOLARSSL_ECP_DP_SECP224K1 MBEDTLS_ECP_DP_SECP224K1\nPOLARSSL_ECP_DP_SECP224K1_ENABLED MBEDTLS_ECP_DP_SECP224K1_ENABLED\nPOLARSSL_ECP_DP_SECP224R1 MBEDTLS_ECP_DP_SECP224R1\nPOLARSSL_ECP_DP_SECP224R1_ENABLED MBEDTLS_ECP_DP_SECP224R1_ENABLED\nPOLARSSL_ECP_DP_SECP256K1 MBEDTLS_ECP_DP_SECP256K1\nPOLARSSL_ECP_DP_SECP256K1_ENABLED MBEDTLS_ECP_DP_SECP256K1_ENABLED\nPOLARSSL_ECP_DP_SECP256R1 MBEDTLS_ECP_DP_SECP256R1\nPOLARSSL_ECP_DP_SECP256R1_ENABLED MBEDTLS_ECP_DP_SECP256R1_ENABLED\nPOLARSSL_ECP_DP_SECP384R1 MBEDTLS_ECP_DP_SECP384R1\nPOLARSSL_ECP_DP_SECP384R1_ENABLED MBEDTLS_ECP_DP_SECP384R1_ENABLED\nPOLARSSL_ECP_DP_SECP521R1 MBEDTLS_ECP_DP_SECP521R1\nPOLARSSL_ECP_DP_SECP521R1_ENABLED MBEDTLS_ECP_DP_SECP521R1_ENABLED\nPOLARSSL_ECP_FIXED_POINT_OPTIM MBEDTLS_ECP_FIXED_POINT_OPTIM\nPOLARSSL_ECP_H MBEDTLS_ECP_H\nPOLARSSL_ECP_MAX_BITS MBEDTLS_ECP_MAX_BITS\nPOLARSSL_ECP_MAX_BYTES MBEDTLS_ECP_MAX_BYTES\nPOLARSSL_ECP_MAX_PT_LEN MBEDTLS_ECP_MAX_PT_LEN\nPOLARSSL_ECP_NIST_OPTIM MBEDTLS_ECP_NIST_OPTIM\nPOLARSSL_ECP_PF_COMPRESSED MBEDTLS_ECP_PF_COMPRESSED\nPOLARSSL_ECP_PF_UNCOMPRESSED MBEDTLS_ECP_PF_UNCOMPRESSED\nPOLARSSL_ECP_TLS_NAMED_CURVE MBEDTLS_ECP_TLS_NAMED_CURVE\nPOLARSSL_ECP_WINDOW_SIZE MBEDTLS_ECP_WINDOW_SIZE\nPOLARSSL_ENABLE_WEAK_CIPHERSUITES MBEDTLS_ENABLE_WEAK_CIPHERSUITES\nPOLARSSL_ENCRYPT MBEDTLS_ENCRYPT\nPOLARSSL_ENTROPY_C MBEDTLS_ENTROPY_C\nPOLARSSL_ENTROPY_FORCE_SHA256 MBEDTLS_ENTROPY_FORCE_SHA256\nPOLARSSL_ENTROPY_H MBEDTLS_ENTROPY_H\nPOLARSSL_ENTROPY_POLL_H MBEDTLS_ENTROPY_POLL_H\nPOLARSSL_ENTROPY_SHA256_ACCUMULATOR MBEDTLS_ENTROPY_SHA256_ACCUMULATOR\nPOLARSSL_ENTROPY_SHA512_ACCUMULATOR MBEDTLS_ENTROPY_SHA512_ACCUMULATOR\nPOLARSSL_ERROR_C MBEDTLS_ERROR_C\nPOLARSSL_ERROR_H MBEDTLS_ERROR_H\nPOLARSSL_ERROR_STRERROR_BC MBEDTLS_ERROR_STRERROR_BC\nPOLARSSL_ERROR_STRERROR_DUMMY MBEDTLS_ERROR_STRERROR_DUMMY\nPOLARSSL_ERR_AES_INVALID_INPUT_LENGTH MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH\nPOLARSSL_ERR_AES_INVALID_KEY_LENGTH MBEDTLS_ERR_AES_INVALID_KEY_LENGTH\nPOLARSSL_ERR_ASN1_BUF_TOO_SMALL MBEDTLS_ERR_ASN1_BUF_TOO_SMALL\nPOLARSSL_ERR_ASN1_INVALID_DATA MBEDTLS_ERR_ASN1_INVALID_DATA\nPOLARSSL_ERR_ASN1_INVALID_LENGTH MBEDTLS_ERR_ASN1_INVALID_LENGTH\nPOLARSSL_ERR_ASN1_LENGTH_MISMATCH MBEDTLS_ERR_ASN1_LENGTH_MISMATCH\nPOLARSSL_ERR_ASN1_MALLOC_FAILED MBEDTLS_ERR_ASN1_ALLOC_FAILED\nPOLARSSL_ERR_ASN1_OUT_OF_DATA MBEDTLS_ERR_ASN1_OUT_OF_DATA\nPOLARSSL_ERR_ASN1_UNEXPECTED_TAG MBEDTLS_ERR_ASN1_UNEXPECTED_TAG\nPOLARSSL_ERR_BASE64_BUFFER_TOO_SMALL MBEDTLS_ERR_BASE64_BUFFER_TOO_SMALL\nPOLARSSL_ERR_BASE64_INVALID_CHARACTER MBEDTLS_ERR_BASE64_INVALID_CHARACTER\nPOLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH\nPOLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH MBEDTLS_ERR_BLOWFISH_INVALID_KEY_LENGTH\nPOLARSSL_ERR_CAMELLIA_INVALID_INPUT_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_INPUT_LENGTH\nPOLARSSL_ERR_CAMELLIA_INVALID_KEY_LENGTH MBEDTLS_ERR_CAMELLIA_INVALID_KEY_LENGTH\nPOLARSSL_ERR_CCM_AUTH_FAILED MBEDTLS_ERR_CCM_AUTH_FAILED\nPOLARSSL_ERR_CCM_BAD_INPUT MBEDTLS_ERR_CCM_BAD_INPUT\nPOLARSSL_ERR_CIPHER_ALLOC_FAILED MBEDTLS_ERR_CIPHER_ALLOC_FAILED\nPOLARSSL_ERR_CIPHER_AUTH_FAILED MBEDTLS_ERR_CIPHER_AUTH_FAILED\nPOLARSSL_ERR_CIPHER_BAD_INPUT_DATA MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA\nPOLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE\nPOLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED MBEDTLS_ERR_CIPHER_FULL_BLOCK_EXPECTED\nPOLARSSL_ERR_CIPHER_INVALID_PADDING MBEDTLS_ERR_CIPHER_INVALID_PADDING\nPOLARSSL_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_CTR_DRBG_ENTROPY_SOURCE_FAILED\nPOLARSSL_ERR_CTR_DRBG_FILE_IO_ERROR MBEDTLS_ERR_CTR_DRBG_FILE_IO_ERROR\nPOLARSSL_ERR_CTR_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_CTR_DRBG_INPUT_TOO_BIG\nPOLARSSL_ERR_CTR_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_CTR_DRBG_REQUEST_TOO_BIG\nPOLARSSL_ERR_DES_INVALID_INPUT_LENGTH MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH\nPOLARSSL_ERR_DHM_BAD_INPUT_DATA MBEDTLS_ERR_DHM_BAD_INPUT_DATA\nPOLARSSL_ERR_DHM_CALC_SECRET_FAILED MBEDTLS_ERR_DHM_CALC_SECRET_FAILED\nPOLARSSL_ERR_DHM_FILE_IO_ERROR MBEDTLS_ERR_DHM_FILE_IO_ERROR\nPOLARSSL_ERR_DHM_INVALID_FORMAT MBEDTLS_ERR_DHM_INVALID_FORMAT\nPOLARSSL_ERR_DHM_MAKE_PARAMS_FAILED MBEDTLS_ERR_DHM_MAKE_PARAMS_FAILED\nPOLARSSL_ERR_DHM_MAKE_PUBLIC_FAILED MBEDTLS_ERR_DHM_MAKE_PUBLIC_FAILED\nPOLARSSL_ERR_DHM_MALLOC_FAILED MBEDTLS_ERR_DHM_ALLOC_FAILED\nPOLARSSL_ERR_DHM_READ_PARAMS_FAILED MBEDTLS_ERR_DHM_READ_PARAMS_FAILED\nPOLARSSL_ERR_DHM_READ_PUBLIC_FAILED MBEDTLS_ERR_DHM_READ_PUBLIC_FAILED\nPOLARSSL_ERR_ECP_BAD_INPUT_DATA MBEDTLS_ERR_ECP_BAD_INPUT_DATA\nPOLARSSL_ERR_ECP_BUFFER_TOO_SMALL MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL\nPOLARSSL_ERR_ECP_FEATURE_UNAVAILABLE MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE\nPOLARSSL_ERR_ECP_INVALID_KEY MBEDTLS_ERR_ECP_INVALID_KEY\nPOLARSSL_ERR_ECP_MALLOC_FAILED MBEDTLS_ERR_ECP_ALLOC_FAILED\nPOLARSSL_ERR_ECP_RANDOM_FAILED MBEDTLS_ERR_ECP_RANDOM_FAILED\nPOLARSSL_ERR_ECP_SIG_LEN_MISMATCH MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH\nPOLARSSL_ERR_ECP_VERIFY_FAILED MBEDTLS_ERR_ECP_VERIFY_FAILED\nPOLARSSL_ERR_ENTROPY_FILE_IO_ERROR MBEDTLS_ERR_ENTROPY_FILE_IO_ERROR\nPOLARSSL_ERR_ENTROPY_MAX_SOURCES MBEDTLS_ERR_ENTROPY_MAX_SOURCES\nPOLARSSL_ERR_ENTROPY_NO_SOURCES_DEFINED MBEDTLS_ERR_ENTROPY_NO_SOURCES_DEFINED\nPOLARSSL_ERR_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_ENTROPY_SOURCE_FAILED\nPOLARSSL_ERR_GCM_AUTH_FAILED MBEDTLS_ERR_GCM_AUTH_FAILED\nPOLARSSL_ERR_GCM_BAD_INPUT MBEDTLS_ERR_GCM_BAD_INPUT\nPOLARSSL_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED MBEDTLS_ERR_HMAC_DRBG_ENTROPY_SOURCE_FAILED\nPOLARSSL_ERR_HMAC_DRBG_FILE_IO_ERROR MBEDTLS_ERR_HMAC_DRBG_FILE_IO_ERROR\nPOLARSSL_ERR_HMAC_DRBG_INPUT_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_INPUT_TOO_BIG\nPOLARSSL_ERR_HMAC_DRBG_REQUEST_TOO_BIG MBEDTLS_ERR_HMAC_DRBG_REQUEST_TOO_BIG\nPOLARSSL_ERR_MD2_FILE_IO_ERROR MBEDTLS_ERR_MD2_FILE_IO_ERROR\nPOLARSSL_ERR_MD4_FILE_IO_ERROR MBEDTLS_ERR_MD4_FILE_IO_ERROR\nPOLARSSL_ERR_MD5_FILE_IO_ERROR MBEDTLS_ERR_MD5_FILE_IO_ERROR\nPOLARSSL_ERR_MD_ALLOC_FAILED MBEDTLS_ERR_MD_ALLOC_FAILED\nPOLARSSL_ERR_MD_BAD_INPUT_DATA MBEDTLS_ERR_MD_BAD_INPUT_DATA\nPOLARSSL_ERR_MD_FEATURE_UNAVAILABLE MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE\nPOLARSSL_ERR_MD_FILE_IO_ERROR MBEDTLS_ERR_MD_FILE_IO_ERROR\nPOLARSSL_ERR_MPI_BAD_INPUT_DATA MBEDTLS_ERR_MPI_BAD_INPUT_DATA\nPOLARSSL_ERR_MPI_BUFFER_TOO_SMALL MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL\nPOLARSSL_ERR_MPI_DIVISION_BY_ZERO MBEDTLS_ERR_MPI_DIVISION_BY_ZERO\nPOLARSSL_ERR_MPI_FILE_IO_ERROR MBEDTLS_ERR_MPI_FILE_IO_ERROR\nPOLARSSL_ERR_MPI_INVALID_CHARACTER MBEDTLS_ERR_MPI_INVALID_CHARACTER\nPOLARSSL_ERR_MPI_MALLOC_FAILED MBEDTLS_ERR_MPI_ALLOC_FAILED\nPOLARSSL_ERR_MPI_NEGATIVE_VALUE MBEDTLS_ERR_MPI_NEGATIVE_VALUE\nPOLARSSL_ERR_MPI_NOT_ACCEPTABLE MBEDTLS_ERR_MPI_NOT_ACCEPTABLE\nPOLARSSL_ERR_NET_ACCEPT_FAILED MBEDTLS_ERR_NET_ACCEPT_FAILED\nPOLARSSL_ERR_NET_BIND_FAILED MBEDTLS_ERR_NET_BIND_FAILED\nPOLARSSL_ERR_NET_CONNECT_FAILED MBEDTLS_ERR_NET_CONNECT_FAILED\nPOLARSSL_ERR_NET_CONN_RESET MBEDTLS_ERR_NET_CONN_RESET\nPOLARSSL_ERR_NET_LISTEN_FAILED MBEDTLS_ERR_NET_LISTEN_FAILED\nPOLARSSL_ERR_NET_RECV_FAILED MBEDTLS_ERR_NET_RECV_FAILED\nPOLARSSL_ERR_NET_SEND_FAILED MBEDTLS_ERR_NET_SEND_FAILED\nPOLARSSL_ERR_NET_SOCKET_FAILED MBEDTLS_ERR_NET_SOCKET_FAILED\nPOLARSSL_ERR_NET_TIMEOUT MBEDTLS_ERR_SSL_TIMEOUT\nPOLARSSL_ERR_NET_UNKNOWN_HOST MBEDTLS_ERR_NET_UNKNOWN_HOST\nPOLARSSL_ERR_NET_WANT_READ MBEDTLS_ERR_SSL_WANT_READ\nPOLARSSL_ERR_NET_WANT_WRITE MBEDTLS_ERR_SSL_WANT_WRITE\nPOLARSSL_ERR_OID_BUF_TOO_SMALL MBEDTLS_ERR_OID_BUF_TOO_SMALL\nPOLARSSL_ERR_OID_NOT_FOUND MBEDTLS_ERR_OID_NOT_FOUND\nPOLARSSL_ERR_PADLOCK_DATA_MISALIGNED MBEDTLS_ERR_PADLOCK_DATA_MISALIGNED\nPOLARSSL_ERR_PBKDF2_BAD_INPUT_DATA MBEDTLS_ERR_PBKDF2_BAD_INPUT_DATA\nPOLARSSL_ERR_PEM_BAD_INPUT_DATA MBEDTLS_ERR_PEM_BAD_INPUT_DATA\nPOLARSSL_ERR_PEM_FEATURE_UNAVAILABLE MBEDTLS_ERR_PEM_FEATURE_UNAVAILABLE\nPOLARSSL_ERR_PEM_INVALID_DATA MBEDTLS_ERR_PEM_INVALID_DATA\nPOLARSSL_ERR_PEM_INVALID_ENC_IV MBEDTLS_ERR_PEM_INVALID_ENC_IV\nPOLARSSL_ERR_PEM_MALLOC_FAILED MBEDTLS_ERR_PEM_ALLOC_FAILED\nPOLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT MBEDTLS_ERR_PEM_NO_HEADER_FOOTER_PRESENT\nPOLARSSL_ERR_PEM_PASSWORD_MISMATCH MBEDTLS_ERR_PEM_PASSWORD_MISMATCH\nPOLARSSL_ERR_PEM_PASSWORD_REQUIRED MBEDTLS_ERR_PEM_PASSWORD_REQUIRED\nPOLARSSL_ERR_PEM_UNKNOWN_ENC_ALG MBEDTLS_ERR_PEM_UNKNOWN_ENC_ALG\nPOLARSSL_ERR_PKCS12_BAD_INPUT_DATA MBEDTLS_ERR_PKCS12_BAD_INPUT_DATA\nPOLARSSL_ERR_PKCS12_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS12_FEATURE_UNAVAILABLE\nPOLARSSL_ERR_PKCS12_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS12_PASSWORD_MISMATCH\nPOLARSSL_ERR_PKCS12_PBE_INVALID_FORMAT MBEDTLS_ERR_PKCS12_PBE_INVALID_FORMAT\nPOLARSSL_ERR_PKCS5_BAD_INPUT_DATA MBEDTLS_ERR_PKCS5_BAD_INPUT_DATA\nPOLARSSL_ERR_PKCS5_FEATURE_UNAVAILABLE MBEDTLS_ERR_PKCS5_FEATURE_UNAVAILABLE\nPOLARSSL_ERR_PKCS5_INVALID_FORMAT MBEDTLS_ERR_PKCS5_INVALID_FORMAT\nPOLARSSL_ERR_PKCS5_PASSWORD_MISMATCH MBEDTLS_ERR_PKCS5_PASSWORD_MISMATCH\nPOLARSSL_ERR_PK_BAD_INPUT_DATA MBEDTLS_ERR_PK_BAD_INPUT_DATA\nPOLARSSL_ERR_PK_FEATURE_UNAVAILABLE MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE\nPOLARSSL_ERR_PK_FILE_IO_ERROR MBEDTLS_ERR_PK_FILE_IO_ERROR\nPOLARSSL_ERR_PK_INVALID_ALG MBEDTLS_ERR_PK_INVALID_ALG\nPOLARSSL_ERR_PK_INVALID_PUBKEY MBEDTLS_ERR_PK_INVALID_PUBKEY\nPOLARSSL_ERR_PK_KEY_INVALID_FORMAT MBEDTLS_ERR_PK_KEY_INVALID_FORMAT\nPOLARSSL_ERR_PK_KEY_INVALID_VERSION MBEDTLS_ERR_PK_KEY_INVALID_VERSION\nPOLARSSL_ERR_PK_MALLOC_FAILED MBEDTLS_ERR_PK_ALLOC_FAILED\nPOLARSSL_ERR_PK_PASSWORD_MISMATCH MBEDTLS_ERR_PK_PASSWORD_MISMATCH\nPOLARSSL_ERR_PK_PASSWORD_REQUIRED MBEDTLS_ERR_PK_PASSWORD_REQUIRED\nPOLARSSL_ERR_PK_SIG_LEN_MISMATCH MBEDTLS_ERR_PK_SIG_LEN_MISMATCH\nPOLARSSL_ERR_PK_TYPE_MISMATCH MBEDTLS_ERR_PK_TYPE_MISMATCH\nPOLARSSL_ERR_PK_UNKNOWN_NAMED_CURVE MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE\nPOLARSSL_ERR_PK_UNKNOWN_PK_ALG MBEDTLS_ERR_PK_UNKNOWN_PK_ALG\nPOLARSSL_ERR_RIPEMD160_FILE_IO_ERROR MBEDTLS_ERR_RIPEMD160_FILE_IO_ERROR\nPOLARSSL_ERR_RSA_BAD_INPUT_DATA MBEDTLS_ERR_RSA_BAD_INPUT_DATA\nPOLARSSL_ERR_RSA_INVALID_PADDING MBEDTLS_ERR_RSA_INVALID_PADDING\nPOLARSSL_ERR_RSA_KEY_CHECK_FAILED MBEDTLS_ERR_RSA_KEY_CHECK_FAILED\nPOLARSSL_ERR_RSA_KEY_GEN_FAILED MBEDTLS_ERR_RSA_KEY_GEN_FAILED\nPOLARSSL_ERR_RSA_OUTPUT_TOO_LARGE MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE\nPOLARSSL_ERR_RSA_PRIVATE_FAILED MBEDTLS_ERR_RSA_PRIVATE_FAILED\nPOLARSSL_ERR_RSA_PUBLIC_FAILED MBEDTLS_ERR_RSA_PUBLIC_FAILED\nPOLARSSL_ERR_RSA_RNG_FAILED MBEDTLS_ERR_RSA_RNG_FAILED\nPOLARSSL_ERR_RSA_VERIFY_FAILED MBEDTLS_ERR_RSA_VERIFY_FAILED\nPOLARSSL_ERR_SHA1_FILE_IO_ERROR MBEDTLS_ERR_SHA1_FILE_IO_ERROR\nPOLARSSL_ERR_SHA256_FILE_IO_ERROR MBEDTLS_ERR_SHA256_FILE_IO_ERROR\nPOLARSSL_ERR_SHA512_FILE_IO_ERROR MBEDTLS_ERR_SHA512_FILE_IO_ERROR\nPOLARSSL_ERR_SSL_BAD_HS_CERTIFICATE MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE\nPOLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_REQUEST\nPOLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY MBEDTLS_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY\nPOLARSSL_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC MBEDTLS_ERR_SSL_BAD_HS_CHANGE_CIPHER_SPEC\nPOLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO MBEDTLS_ERR_SSL_BAD_HS_CLIENT_HELLO\nPOLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE\nPOLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_CS\nPOLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP MBEDTLS_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_RP\nPOLARSSL_ERR_SSL_BAD_HS_FINISHED MBEDTLS_ERR_SSL_BAD_HS_FINISHED\nPOLARSSL_ERR_SSL_BAD_HS_NEW_SESSION_TICKET MBEDTLS_ERR_SSL_BAD_HS_NEW_SESSION_TICKET\nPOLARSSL_ERR_SSL_BAD_HS_PROTOCOL_VERSION MBEDTLS_ERR_SSL_BAD_HS_PROTOCOL_VERSION\nPOLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO\nPOLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE MBEDTLS_ERR_SSL_BAD_HS_SERVER_HELLO_DONE\nPOLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE MBEDTLS_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE\nPOLARSSL_ERR_SSL_BAD_INPUT_DATA MBEDTLS_ERR_SSL_BAD_INPUT_DATA\nPOLARSSL_ERR_SSL_BUFFER_TOO_SMALL MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL\nPOLARSSL_ERR_SSL_CA_CHAIN_REQUIRED MBEDTLS_ERR_SSL_CA_CHAIN_REQUIRED\nPOLARSSL_ERR_SSL_CERTIFICATE_REQUIRED MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED\nPOLARSSL_ERR_SSL_CERTIFICATE_TOO_LARGE MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE\nPOLARSSL_ERR_SSL_COMPRESSION_FAILED MBEDTLS_ERR_SSL_COMPRESSION_FAILED\nPOLARSSL_ERR_SSL_CONN_EOF MBEDTLS_ERR_SSL_CONN_EOF\nPOLARSSL_ERR_SSL_COUNTER_WRAPPING MBEDTLS_ERR_SSL_COUNTER_WRAPPING\nPOLARSSL_ERR_SSL_FATAL_ALERT_MESSAGE MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE\nPOLARSSL_ERR_SSL_FEATURE_UNAVAILABLE MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE\nPOLARSSL_ERR_SSL_HELLO_VERIFY_REQUIRED MBEDTLS_ERR_SSL_HELLO_VERIFY_REQUIRED\nPOLARSSL_ERR_SSL_HW_ACCEL_FAILED MBEDTLS_ERR_SSL_HW_ACCEL_FAILED\nPOLARSSL_ERR_SSL_HW_ACCEL_FALLTHROUGH MBEDTLS_ERR_SSL_HW_ACCEL_FALLTHROUGH\nPOLARSSL_ERR_SSL_INTERNAL_ERROR MBEDTLS_ERR_SSL_INTERNAL_ERROR\nPOLARSSL_ERR_SSL_INVALID_MAC MBEDTLS_ERR_SSL_INVALID_MAC\nPOLARSSL_ERR_SSL_INVALID_RECORD MBEDTLS_ERR_SSL_INVALID_RECORD\nPOLARSSL_ERR_SSL_MALLOC_FAILED MBEDTLS_ERR_SSL_ALLOC_FAILED\nPOLARSSL_ERR_SSL_NO_CIPHER_CHOSEN MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN\nPOLARSSL_ERR_SSL_NO_CLIENT_CERTIFICATE MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE\nPOLARSSL_ERR_SSL_NO_RNG MBEDTLS_ERR_SSL_NO_RNG\nPOLARSSL_ERR_SSL_NO_USABLE_CIPHERSUITE MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE\nPOLARSSL_ERR_SSL_PEER_CLOSE_NOTIFY MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY\nPOLARSSL_ERR_SSL_PEER_VERIFY_FAILED MBEDTLS_ERR_SSL_PEER_VERIFY_FAILED\nPOLARSSL_ERR_SSL_PK_TYPE_MISMATCH MBEDTLS_ERR_SSL_PK_TYPE_MISMATCH\nPOLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED\nPOLARSSL_ERR_SSL_SESSION_TICKET_EXPIRED MBEDTLS_ERR_SSL_SESSION_TICKET_EXPIRED\nPOLARSSL_ERR_SSL_UNEXPECTED_MESSAGE MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE\nPOLARSSL_ERR_SSL_UNKNOWN_CIPHER MBEDTLS_ERR_SSL_UNKNOWN_CIPHER\nPOLARSSL_ERR_SSL_UNKNOWN_IDENTITY MBEDTLS_ERR_SSL_UNKNOWN_IDENTITY\nPOLARSSL_ERR_SSL_WAITING_SERVER_HELLO_RENEGO MBEDTLS_ERR_SSL_WAITING_SERVER_HELLO_RENEGO\nPOLARSSL_ERR_THREADING_BAD_INPUT_DATA MBEDTLS_ERR_THREADING_BAD_INPUT_DATA\nPOLARSSL_ERR_THREADING_FEATURE_UNAVAILABLE MBEDTLS_ERR_THREADING_FEATURE_UNAVAILABLE\nPOLARSSL_ERR_THREADING_MUTEX_ERROR MBEDTLS_ERR_THREADING_MUTEX_ERROR\nPOLARSSL_ERR_X509_BAD_INPUT_DATA MBEDTLS_ERR_X509_BAD_INPUT_DATA\nPOLARSSL_ERR_X509_CERT_UNKNOWN_FORMAT MBEDTLS_ERR_X509_CERT_UNKNOWN_FORMAT\nPOLARSSL_ERR_X509_CERT_VERIFY_FAILED MBEDTLS_ERR_X509_CERT_VERIFY_FAILED\nPOLARSSL_ERR_X509_FEATURE_UNAVAILABLE MBEDTLS_ERR_X509_FEATURE_UNAVAILABLE\nPOLARSSL_ERR_X509_FILE_IO_ERROR MBEDTLS_ERR_X509_FILE_IO_ERROR\nPOLARSSL_ERR_X509_INVALID_ALG MBEDTLS_ERR_X509_INVALID_ALG\nPOLARSSL_ERR_X509_INVALID_DATE MBEDTLS_ERR_X509_INVALID_DATE\nPOLARSSL_ERR_X509_INVALID_EXTENSIONS MBEDTLS_ERR_X509_INVALID_EXTENSIONS\nPOLARSSL_ERR_X509_INVALID_FORMAT MBEDTLS_ERR_X509_INVALID_FORMAT\nPOLARSSL_ERR_X509_INVALID_NAME MBEDTLS_ERR_X509_INVALID_NAME\nPOLARSSL_ERR_X509_INVALID_SERIAL MBEDTLS_ERR_X509_INVALID_SERIAL\nPOLARSSL_ERR_X509_INVALID_SIGNATURE MBEDTLS_ERR_X509_INVALID_SIGNATURE\nPOLARSSL_ERR_X509_INVALID_VERSION MBEDTLS_ERR_X509_INVALID_VERSION\nPOLARSSL_ERR_X509_MALLOC_FAILED MBEDTLS_ERR_X509_ALLOC_FAILED\nPOLARSSL_ERR_X509_SIG_MISMATCH MBEDTLS_ERR_X509_SIG_MISMATCH\nPOLARSSL_ERR_X509_UNKNOWN_OID MBEDTLS_ERR_X509_UNKNOWN_OID\nPOLARSSL_ERR_X509_UNKNOWN_SIG_ALG MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG\nPOLARSSL_ERR_X509_UNKNOWN_VERSION MBEDTLS_ERR_X509_UNKNOWN_VERSION\nPOLARSSL_ERR_XTEA_INVALID_INPUT_LENGTH MBEDTLS_ERR_XTEA_INVALID_INPUT_LENGTH\nPOLARSSL_FS_IO MBEDTLS_FS_IO\nPOLARSSL_GCM_C MBEDTLS_GCM_C\nPOLARSSL_GCM_H MBEDTLS_GCM_H\nPOLARSSL_GENPRIME MBEDTLS_GENPRIME\nPOLARSSL_HAVEGE_C MBEDTLS_HAVEGE_C\nPOLARSSL_HAVEGE_H MBEDTLS_HAVEGE_H\nPOLARSSL_HAVE_ASM MBEDTLS_HAVE_ASM\nPOLARSSL_HAVE_INT16 MBEDTLS_HAVE_INT16\nPOLARSSL_HAVE_INT32 MBEDTLS_HAVE_INT32\nPOLARSSL_HAVE_INT64 MBEDTLS_HAVE_INT64\nPOLARSSL_HAVE_INT8 MBEDTLS_HAVE_INT8\nPOLARSSL_HAVE_IPV6 MBEDTLS_HAVE_IPV6\nPOLARSSL_HAVE_LONGLONG MBEDTLS_HAVE_LONGLONG\nPOLARSSL_HAVE_SSE2 MBEDTLS_HAVE_SSE2\nPOLARSSL_HAVE_TIME MBEDTLS_HAVE_TIME\nPOLARSSL_HAVE_UDBL MBEDTLS_HAVE_UDBL\nPOLARSSL_HAVE_X86 MBEDTLS_HAVE_X86\nPOLARSSL_HAVE_X86_64 MBEDTLS_HAVE_X86_64\nPOLARSSL_HMAC_DRBG_C MBEDTLS_HMAC_DRBG_C\nPOLARSSL_HMAC_DRBG_H MBEDTLS_HMAC_DRBG_H\nPOLARSSL_HMAC_DRBG_MAX_INPUT MBEDTLS_HMAC_DRBG_MAX_INPUT\nPOLARSSL_HMAC_DRBG_MAX_REQUEST MBEDTLS_HMAC_DRBG_MAX_REQUEST\nPOLARSSL_HMAC_DRBG_MAX_SEED_INPUT MBEDTLS_HMAC_DRBG_MAX_SEED_INPUT\nPOLARSSL_HMAC_DRBG_PR_OFF MBEDTLS_HMAC_DRBG_PR_OFF\nPOLARSSL_HMAC_DRBG_PR_ON MBEDTLS_HMAC_DRBG_PR_ON\nPOLARSSL_HMAC_DRBG_RESEED_INTERVAL MBEDTLS_HMAC_DRBG_RESEED_INTERVAL\nPOLARSSL_KEY_EXCHANGE_DHE_PSK MBEDTLS_KEY_EXCHANGE_DHE_PSK\nPOLARSSL_KEY_EXCHANGE_DHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_PSK_ENABLED\nPOLARSSL_KEY_EXCHANGE_DHE_RSA MBEDTLS_KEY_EXCHANGE_DHE_RSA\nPOLARSSL_KEY_EXCHANGE_DHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_DHE_RSA_ENABLED\nPOLARSSL_KEY_EXCHANGE_ECDHE_ECDSA MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA\nPOLARSSL_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED\nPOLARSSL_KEY_EXCHANGE_ECDHE_PSK MBEDTLS_KEY_EXCHANGE_ECDHE_PSK\nPOLARSSL_KEY_EXCHANGE_ECDHE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED\nPOLARSSL_KEY_EXCHANGE_ECDHE_RSA MBEDTLS_KEY_EXCHANGE_ECDHE_RSA\nPOLARSSL_KEY_EXCHANGE_ECDHE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED\nPOLARSSL_KEY_EXCHANGE_ECDH_ECDSA MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA\nPOLARSSL_KEY_EXCHANGE_ECDH_ECDSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA_ENABLED\nPOLARSSL_KEY_EXCHANGE_ECDH_RSA MBEDTLS_KEY_EXCHANGE_ECDH_RSA\nPOLARSSL_KEY_EXCHANGE_ECDH_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_ECDH_RSA_ENABLED\nPOLARSSL_KEY_EXCHANGE_NONE MBEDTLS_KEY_EXCHANGE_NONE\nPOLARSSL_KEY_EXCHANGE_PSK MBEDTLS_KEY_EXCHANGE_PSK\nPOLARSSL_KEY_EXCHANGE_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_PSK_ENABLED\nPOLARSSL_KEY_EXCHANGE_RSA MBEDTLS_KEY_EXCHANGE_RSA\nPOLARSSL_KEY_EXCHANGE_RSA_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_ENABLED\nPOLARSSL_KEY_EXCHANGE_RSA_PSK MBEDTLS_KEY_EXCHANGE_RSA_PSK\nPOLARSSL_KEY_EXCHANGE_RSA_PSK_ENABLED MBEDTLS_KEY_EXCHANGE_RSA_PSK_ENABLED\nPOLARSSL_KEY_EXCHANGE__SOME__ECDHE_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__ECDHE_ENABLED\nPOLARSSL_KEY_EXCHANGE__SOME__PSK_ENABLED MBEDTLS_KEY_EXCHANGE__SOME__PSK_ENABLED\nPOLARSSL_KEY_EXCHANGE__WITH_CERT__ENABLED MBEDTLS_KEY_EXCHANGE__WITH_CERT__ENABLED\nPOLARSSL_KEY_LENGTH_DES MBEDTLS_KEY_LENGTH_DES\nPOLARSSL_KEY_LENGTH_DES_EDE MBEDTLS_KEY_LENGTH_DES_EDE\nPOLARSSL_KEY_LENGTH_DES_EDE3 MBEDTLS_KEY_LENGTH_DES_EDE3\nPOLARSSL_KEY_LENGTH_NONE MBEDTLS_KEY_LENGTH_NONE\nPOLARSSL_MAX_BLOCK_LENGTH MBEDTLS_MAX_BLOCK_LENGTH\nPOLARSSL_MAX_IV_LENGTH MBEDTLS_MAX_IV_LENGTH\nPOLARSSL_MD2_ALT MBEDTLS_MD2_ALT\nPOLARSSL_MD2_C MBEDTLS_MD2_C\nPOLARSSL_MD2_H MBEDTLS_MD2_H\nPOLARSSL_MD4_ALT MBEDTLS_MD4_ALT\nPOLARSSL_MD4_C MBEDTLS_MD4_C\nPOLARSSL_MD4_H MBEDTLS_MD4_H\nPOLARSSL_MD5_ALT MBEDTLS_MD5_ALT\nPOLARSSL_MD5_C MBEDTLS_MD5_C\nPOLARSSL_MD5_H MBEDTLS_MD5_H\nPOLARSSL_MD_C MBEDTLS_MD_C\nPOLARSSL_MD_H MBEDTLS_MD_H\nPOLARSSL_MD_MAX_SIZE MBEDTLS_MD_MAX_SIZE\nPOLARSSL_MD_MD2 MBEDTLS_MD_MD2\nPOLARSSL_MD_MD4 MBEDTLS_MD_MD4\nPOLARSSL_MD_MD5 MBEDTLS_MD_MD5\nPOLARSSL_MD_NONE MBEDTLS_MD_NONE\nPOLARSSL_MD_RIPEMD160 MBEDTLS_MD_RIPEMD160\nPOLARSSL_MD_SHA1 MBEDTLS_MD_SHA1\nPOLARSSL_MD_SHA224 MBEDTLS_MD_SHA224\nPOLARSSL_MD_SHA256 MBEDTLS_MD_SHA256\nPOLARSSL_MD_SHA384 MBEDTLS_MD_SHA384\nPOLARSSL_MD_SHA512 MBEDTLS_MD_SHA512\nPOLARSSL_MD_WRAP_H MBEDTLS_MD_WRAP_H\nPOLARSSL_MEMORY_ALIGN_MULTIPLE MBEDTLS_MEMORY_ALIGN_MULTIPLE\nPOLARSSL_MEMORY_BACKTRACE MBEDTLS_MEMORY_BACKTRACE\nPOLARSSL_MEMORY_BUFFER_ALLOC_C MBEDTLS_MEMORY_BUFFER_ALLOC_C\nPOLARSSL_MEMORY_BUFFER_ALLOC_H MBEDTLS_MEMORY_BUFFER_ALLOC_H\nPOLARSSL_MEMORY_C MBEDTLS_MEMORY_C\nPOLARSSL_MEMORY_DEBUG MBEDTLS_MEMORY_DEBUG\nPOLARSSL_MEMORY_H MBEDTLS_MEMORY_H\nPOLARSSL_MODE_CBC MBEDTLS_MODE_CBC\nPOLARSSL_MODE_CCM MBEDTLS_MODE_CCM\nPOLARSSL_MODE_CFB MBEDTLS_MODE_CFB\nPOLARSSL_MODE_CTR MBEDTLS_MODE_CTR\nPOLARSSL_MODE_ECB MBEDTLS_MODE_ECB\nPOLARSSL_MODE_GCM MBEDTLS_MODE_GCM\nPOLARSSL_MODE_NONE MBEDTLS_MODE_NONE\nPOLARSSL_MODE_OFB MBEDTLS_MODE_OFB\nPOLARSSL_MODE_STREAM MBEDTLS_MODE_STREAM\nPOLARSSL_MPI_MAX_BITS MBEDTLS_MPI_MAX_BITS\nPOLARSSL_MPI_MAX_BITS_SCALE100 MBEDTLS_MPI_MAX_BITS_SCALE100\nPOLARSSL_MPI_MAX_LIMBS MBEDTLS_MPI_MAX_LIMBS\nPOLARSSL_MPI_MAX_SIZE MBEDTLS_MPI_MAX_SIZE\nPOLARSSL_MPI_RW_BUFFER_SIZE MBEDTLS_MPI_RW_BUFFER_SIZE\nPOLARSSL_MPI_WINDOW_SIZE MBEDTLS_MPI_WINDOW_SIZE\nPOLARSSL_NET_C MBEDTLS_NET_C\nPOLARSSL_NET_H MBEDTLS_NET_H\nPOLARSSL_NET_LISTEN_BACKLOG MBEDTLS_NET_LISTEN_BACKLOG\nPOLARSSL_NO_DEFAULT_ENTROPY_SOURCES MBEDTLS_NO_DEFAULT_ENTROPY_SOURCES\nPOLARSSL_NO_PLATFORM_ENTROPY MBEDTLS_NO_PLATFORM_ENTROPY\nPOLARSSL_OID_C MBEDTLS_OID_C\nPOLARSSL_OID_H MBEDTLS_OID_H\nPOLARSSL_OPERATION_NONE MBEDTLS_OPERATION_NONE\nPOLARSSL_PADDING_NONE MBEDTLS_PADDING_NONE\nPOLARSSL_PADDING_ONE_AND_ZEROS MBEDTLS_PADDING_ONE_AND_ZEROS\nPOLARSSL_PADDING_PKCS7 MBEDTLS_PADDING_PKCS7\nPOLARSSL_PADDING_ZEROS MBEDTLS_PADDING_ZEROS\nPOLARSSL_PADDING_ZEROS_AND_LEN MBEDTLS_PADDING_ZEROS_AND_LEN\nPOLARSSL_PADLOCK_C MBEDTLS_PADLOCK_C\nPOLARSSL_PADLOCK_H MBEDTLS_PADLOCK_H\nPOLARSSL_PBKDF2_C MBEDTLS_PBKDF2_C\nPOLARSSL_PBKDF2_H MBEDTLS_PBKDF2_H\nPOLARSSL_PEM_H MBEDTLS_PEM_H\nPOLARSSL_PEM_PARSE_C MBEDTLS_PEM_PARSE_C\nPOLARSSL_PEM_WRITE_C MBEDTLS_PEM_WRITE_C\nPOLARSSL_PKCS11_C MBEDTLS_PKCS11_C\nPOLARSSL_PKCS11_H MBEDTLS_PKCS11_H\nPOLARSSL_PKCS12_C MBEDTLS_PKCS12_C\nPOLARSSL_PKCS12_H MBEDTLS_PKCS12_H\nPOLARSSL_PKCS1_V15 MBEDTLS_PKCS1_V15\nPOLARSSL_PKCS1_V21 MBEDTLS_PKCS1_V21\nPOLARSSL_PKCS5_C MBEDTLS_PKCS5_C\nPOLARSSL_PKCS5_H MBEDTLS_PKCS5_H\nPOLARSSL_PK_C MBEDTLS_PK_C\nPOLARSSL_PK_DEBUG_ECP MBEDTLS_PK_DEBUG_ECP\nPOLARSSL_PK_DEBUG_MAX_ITEMS MBEDTLS_PK_DEBUG_MAX_ITEMS\nPOLARSSL_PK_DEBUG_MPI MBEDTLS_PK_DEBUG_MPI\nPOLARSSL_PK_DEBUG_NONE MBEDTLS_PK_DEBUG_NONE\nPOLARSSL_PK_ECDSA MBEDTLS_PK_ECDSA\nPOLARSSL_PK_ECKEY MBEDTLS_PK_ECKEY\nPOLARSSL_PK_ECKEY_DH MBEDTLS_PK_ECKEY_DH\nPOLARSSL_PK_H MBEDTLS_PK_H\nPOLARSSL_PK_NONE MBEDTLS_PK_NONE\nPOLARSSL_PK_PARSE_C MBEDTLS_PK_PARSE_C\nPOLARSSL_PK_PARSE_EC_EXTENDED MBEDTLS_PK_PARSE_EC_EXTENDED\nPOLARSSL_PK_RSA MBEDTLS_PK_RSA\nPOLARSSL_PK_RSASSA_PSS MBEDTLS_PK_RSASSA_PSS\nPOLARSSL_PK_RSA_ALT MBEDTLS_PK_RSA_ALT\nPOLARSSL_PK_WRAP_H MBEDTLS_PK_WRAP_H\nPOLARSSL_PK_WRITE_C MBEDTLS_PK_WRITE_C\nPOLARSSL_PLATFORM_C MBEDTLS_PLATFORM_C\nPOLARSSL_PLATFORM_EXIT_ALT MBEDTLS_PLATFORM_EXIT_ALT\nPOLARSSL_PLATFORM_EXIT_MACRO MBEDTLS_PLATFORM_EXIT_MACRO\nPOLARSSL_PLATFORM_FPRINTF_ALT MBEDTLS_PLATFORM_FPRINTF_ALT\nPOLARSSL_PLATFORM_FPRINTF_MACRO MBEDTLS_PLATFORM_FPRINTF_MACRO\nPOLARSSL_PLATFORM_FREE_MACRO MBEDTLS_PLATFORM_FREE_MACRO\nPOLARSSL_PLATFORM_H MBEDTLS_PLATFORM_H\nPOLARSSL_PLATFORM_MALLOC_MACRO MBEDTLS_PLATFORM_ALLOC_MACRO\nPOLARSSL_PLATFORM_MEMORY MBEDTLS_PLATFORM_MEMORY\nPOLARSSL_PLATFORM_NO_STD_FUNCTIONS MBEDTLS_PLATFORM_NO_STD_FUNCTIONS\nPOLARSSL_PLATFORM_PRINTF_ALT MBEDTLS_PLATFORM_PRINTF_ALT\nPOLARSSL_PLATFORM_PRINTF_MACRO MBEDTLS_PLATFORM_PRINTF_MACRO\nPOLARSSL_PLATFORM_SNPRINTF_ALT MBEDTLS_PLATFORM_SNPRINTF_ALT\nPOLARSSL_PLATFORM_SNPRINTF_MACRO MBEDTLS_PLATFORM_SNPRINTF_MACRO\nPOLARSSL_PLATFORM_STD_EXIT MBEDTLS_PLATFORM_STD_EXIT\nPOLARSSL_PLATFORM_STD_FPRINTF MBEDTLS_PLATFORM_STD_FPRINTF\nPOLARSSL_PLATFORM_STD_FREE MBEDTLS_PLATFORM_STD_FREE\nPOLARSSL_PLATFORM_STD_MALLOC MBEDTLS_PLATFORM_STD_CALLOC\nPOLARSSL_PLATFORM_STD_MEM_HDR MBEDTLS_PLATFORM_STD_MEM_HDR\nPOLARSSL_PLATFORM_STD_PRINTF MBEDTLS_PLATFORM_STD_PRINTF\nPOLARSSL_PLATFORM_STD_SNPRINTF MBEDTLS_PLATFORM_STD_SNPRINTF\nPOLARSSL_PREMASTER_SIZE MBEDTLS_PREMASTER_SIZE\nPOLARSSL_PSK_MAX_LEN MBEDTLS_PSK_MAX_LEN\nPOLARSSL_REMOVE_ARC4_CIPHERSUITES MBEDTLS_REMOVE_ARC4_CIPHERSUITES\nPOLARSSL_RIPEMD160_ALT MBEDTLS_RIPEMD160_ALT\nPOLARSSL_RIPEMD160_C MBEDTLS_RIPEMD160_C\nPOLARSSL_RIPEMD160_H MBEDTLS_RIPEMD160_H\nPOLARSSL_RSA_C MBEDTLS_RSA_C\nPOLARSSL_RSA_H MBEDTLS_RSA_H\nPOLARSSL_RSA_NO_CRT MBEDTLS_RSA_NO_CRT\nPOLARSSL_SELF_TEST MBEDTLS_SELF_TEST\nPOLARSSL_SHA1_ALT MBEDTLS_SHA1_ALT\nPOLARSSL_SHA1_C MBEDTLS_SHA1_C\nPOLARSSL_SHA1_H MBEDTLS_SHA1_H\nPOLARSSL_SHA256_ALT MBEDTLS_SHA256_ALT\nPOLARSSL_SHA256_C MBEDTLS_SHA256_C\nPOLARSSL_SHA256_H MBEDTLS_SHA256_H\nPOLARSSL_SHA512_ALT MBEDTLS_SHA512_ALT\nPOLARSSL_SHA512_C MBEDTLS_SHA512_C\nPOLARSSL_SHA512_H MBEDTLS_SHA512_H\nPOLARSSL_SSL_AEAD_RANDOM_IV MBEDTLS_SSL_AEAD_RANDOM_IV\nPOLARSSL_SSL_ALERT_MESSAGES MBEDTLS_SSL_ALERT_MESSAGES\nPOLARSSL_SSL_ALPN MBEDTLS_SSL_ALPN\nPOLARSSL_SSL_CACHE_C MBEDTLS_SSL_CACHE_C\nPOLARSSL_SSL_CACHE_H MBEDTLS_SSL_CACHE_H\nPOLARSSL_SSL_CBC_RECORD_SPLITTING MBEDTLS_SSL_CBC_RECORD_SPLITTING\nPOLARSSL_SSL_CIPHERSUITES_H MBEDTLS_SSL_CIPHERSUITES_H\nPOLARSSL_SSL_CLI_C MBEDTLS_SSL_CLI_C\nPOLARSSL_SSL_COOKIE_C MBEDTLS_SSL_COOKIE_C\nPOLARSSL_SSL_COOKIE_H MBEDTLS_SSL_COOKIE_H\nPOLARSSL_SSL_COOKIE_TIMEOUT MBEDTLS_SSL_COOKIE_TIMEOUT\nPOLARSSL_SSL_DEBUG_ALL MBEDTLS_SSL_DEBUG_ALL\nPOLARSSL_SSL_DISABLE_RENEGOTIATION MBEDTLS_SSL_DISABLE_RENEGOTIATION\nPOLARSSL_SSL_DTLS_ANTI_REPLAY MBEDTLS_SSL_DTLS_ANTI_REPLAY\nPOLARSSL_SSL_DTLS_BADMAC_LIMIT MBEDTLS_SSL_DTLS_BADMAC_LIMIT\nPOLARSSL_SSL_DTLS_HELLO_VERIFY MBEDTLS_SSL_DTLS_HELLO_VERIFY\nPOLARSSL_SSL_ENCRYPT_THEN_MAC MBEDTLS_SSL_ENCRYPT_THEN_MAC\nPOLARSSL_SSL_EXTENDED_MASTER_SECRET MBEDTLS_SSL_EXTENDED_MASTER_SECRET\nPOLARSSL_SSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV\nPOLARSSL_SSL_H MBEDTLS_SSL_H\nPOLARSSL_SSL_HW_RECORD_ACCEL MBEDTLS_SSL_HW_RECORD_ACCEL\nPOLARSSL_SSL_MAX_FRAGMENT_LENGTH MBEDTLS_SSL_MAX_FRAGMENT_LENGTH\nPOLARSSL_SSL_PROTO_DTLS MBEDTLS_SSL_PROTO_DTLS\nPOLARSSL_SSL_PROTO_SSL3 MBEDTLS_SSL_PROTO_SSL3\nPOLARSSL_SSL_PROTO_TLS1 MBEDTLS_SSL_PROTO_TLS1\nPOLARSSL_SSL_PROTO_TLS1_1 MBEDTLS_SSL_PROTO_TLS1_1\nPOLARSSL_SSL_PROTO_TLS1_2 MBEDTLS_SSL_PROTO_TLS1_2\nPOLARSSL_SSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION\nPOLARSSL_SSL_SERVER_NAME_INDICATION MBEDTLS_SSL_SERVER_NAME_INDICATION\nPOLARSSL_SSL_SESSION_TICKETS MBEDTLS_SSL_SESSION_TICKETS\nPOLARSSL_SSL_SRV_C MBEDTLS_SSL_SRV_C\nPOLARSSL_SSL_SRV_RESPECT_CLIENT_PREFERENCE MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE\nPOLARSSL_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO\nPOLARSSL_SSL_TLS_C MBEDTLS_SSL_TLS_C\nPOLARSSL_SSL_TRUNCATED_HMAC MBEDTLS_SSL_TRUNCATED_HMAC\nPOLARSSL_THREADING_ALT MBEDTLS_THREADING_ALT\nPOLARSSL_THREADING_C MBEDTLS_THREADING_C\nPOLARSSL_THREADING_H MBEDTLS_THREADING_H\nPOLARSSL_THREADING_IMPL MBEDTLS_THREADING_IMPL\nPOLARSSL_THREADING_PTHREAD MBEDTLS_THREADING_PTHREAD\nPOLARSSL_TIMING_ALT MBEDTLS_TIMING_ALT\nPOLARSSL_TIMING_C MBEDTLS_TIMING_C\nPOLARSSL_TIMING_H MBEDTLS_TIMING_H\nPOLARSSL_VERSION_C MBEDTLS_VERSION_C\nPOLARSSL_VERSION_FEATURES MBEDTLS_VERSION_FEATURES\nPOLARSSL_VERSION_H MBEDTLS_VERSION_H\nPOLARSSL_VERSION_MAJOR MBEDTLS_VERSION_MAJOR\nPOLARSSL_VERSION_MINOR MBEDTLS_VERSION_MINOR\nPOLARSSL_VERSION_NUMBER MBEDTLS_VERSION_NUMBER\nPOLARSSL_VERSION_PATCH MBEDTLS_VERSION_PATCH\nPOLARSSL_VERSION_STRING MBEDTLS_VERSION_STRING\nPOLARSSL_VERSION_STRING_FULL MBEDTLS_VERSION_STRING_FULL\nPOLARSSL_X509_ALLOW_EXTENSIONS_NON_V3 MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3\nPOLARSSL_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION\nPOLARSSL_X509_CHECK_EXTENDED_KEY_USAGE MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE\nPOLARSSL_X509_CHECK_KEY_USAGE MBEDTLS_X509_CHECK_KEY_USAGE\nPOLARSSL_X509_CREATE_C MBEDTLS_X509_CREATE_C\nPOLARSSL_X509_CRL_H MBEDTLS_X509_CRL_H\nPOLARSSL_X509_CRL_PARSE_C MBEDTLS_X509_CRL_PARSE_C\nPOLARSSL_X509_CRT_H MBEDTLS_X509_CRT_H\nPOLARSSL_X509_CRT_PARSE_C MBEDTLS_X509_CRT_PARSE_C\nPOLARSSL_X509_CRT_WRITE_C MBEDTLS_X509_CRT_WRITE_C\nPOLARSSL_X509_CSR_H MBEDTLS_X509_CSR_H\nPOLARSSL_X509_CSR_PARSE_C MBEDTLS_X509_CSR_PARSE_C\nPOLARSSL_X509_CSR_WRITE_C MBEDTLS_X509_CSR_WRITE_C\nPOLARSSL_X509_H MBEDTLS_X509_H\nPOLARSSL_X509_MAX_INTERMEDIATE_CA MBEDTLS_X509_MAX_INTERMEDIATE_CA\nPOLARSSL_X509_RSASSA_PSS_SUPPORT MBEDTLS_X509_RSASSA_PSS_SUPPORT\nPOLARSSL_X509_USE_C MBEDTLS_X509_USE_C\nPOLARSSL_XTEA_ALT MBEDTLS_XTEA_ALT\nPOLARSSL_XTEA_C MBEDTLS_XTEA_C\nPOLARSSL_XTEA_H MBEDTLS_XTEA_H\nPOLARSSL_ZLIB_SUPPORT MBEDTLS_ZLIB_SUPPORT\nRSA_CRYPT MBEDTLS_RSA_CRYPT\nRSA_PKCS_V15 MBEDTLS_RSA_PKCS_V15\nRSA_PKCS_V21 MBEDTLS_RSA_PKCS_V21\nRSA_PRIVATE MBEDTLS_RSA_PRIVATE\nRSA_PUBLIC MBEDTLS_RSA_PUBLIC\nRSA_SALT_LEN_ANY MBEDTLS_RSA_SALT_LEN_ANY\nRSA_SIGN MBEDTLS_RSA_SIGN\nSSL_ALERT_LEVEL_FATAL MBEDTLS_SSL_ALERT_LEVEL_FATAL\nSSL_ALERT_LEVEL_WARNING MBEDTLS_SSL_ALERT_LEVEL_WARNING\nSSL_ALERT_MSG_ACCESS_DENIED MBEDTLS_SSL_ALERT_MSG_ACCESS_DENIED\nSSL_ALERT_MSG_BAD_CERT MBEDTLS_SSL_ALERT_MSG_BAD_CERT\nSSL_ALERT_MSG_BAD_RECORD_MAC MBEDTLS_SSL_ALERT_MSG_BAD_RECORD_MAC\nSSL_ALERT_MSG_CERT_EXPIRED MBEDTLS_SSL_ALERT_MSG_CERT_EXPIRED\nSSL_ALERT_MSG_CERT_REVOKED MBEDTLS_SSL_ALERT_MSG_CERT_REVOKED\nSSL_ALERT_MSG_CERT_UNKNOWN MBEDTLS_SSL_ALERT_MSG_CERT_UNKNOWN\nSSL_ALERT_MSG_CLOSE_NOTIFY MBEDTLS_SSL_ALERT_MSG_CLOSE_NOTIFY\nSSL_ALERT_MSG_DECODE_ERROR MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR\nSSL_ALERT_MSG_DECOMPRESSION_FAILURE MBEDTLS_SSL_ALERT_MSG_DECOMPRESSION_FAILURE\nSSL_ALERT_MSG_DECRYPTION_FAILED MBEDTLS_SSL_ALERT_MSG_DECRYPTION_FAILED\nSSL_ALERT_MSG_DECRYPT_ERROR MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR\nSSL_ALERT_MSG_EXPORT_RESTRICTION MBEDTLS_SSL_ALERT_MSG_EXPORT_RESTRICTION\nSSL_ALERT_MSG_HANDSHAKE_FAILURE MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE\nSSL_ALERT_MSG_ILLEGAL_PARAMETER MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER\nSSL_ALERT_MSG_INAPROPRIATE_FALLBACK MBEDTLS_SSL_ALERT_MSG_INAPROPRIATE_FALLBACK\nSSL_ALERT_MSG_INSUFFICIENT_SECURITY MBEDTLS_SSL_ALERT_MSG_INSUFFICIENT_SECURITY\nSSL_ALERT_MSG_INTERNAL_ERROR MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR\nSSL_ALERT_MSG_NO_APPLICATION_PROTOCOL MBEDTLS_SSL_ALERT_MSG_NO_APPLICATION_PROTOCOL\nSSL_ALERT_MSG_NO_CERT MBEDTLS_SSL_ALERT_MSG_NO_CERT\nSSL_ALERT_MSG_NO_RENEGOTIATION MBEDTLS_SSL_ALERT_MSG_NO_RENEGOTIATION\nSSL_ALERT_MSG_PROTOCOL_VERSION MBEDTLS_SSL_ALERT_MSG_PROTOCOL_VERSION\nSSL_ALERT_MSG_RECORD_OVERFLOW MBEDTLS_SSL_ALERT_MSG_RECORD_OVERFLOW\nSSL_ALERT_MSG_UNEXPECTED_MESSAGE MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE\nSSL_ALERT_MSG_UNKNOWN_CA MBEDTLS_SSL_ALERT_MSG_UNKNOWN_CA\nSSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY MBEDTLS_SSL_ALERT_MSG_UNKNOWN_PSK_IDENTITY\nSSL_ALERT_MSG_UNRECOGNIZED_NAME MBEDTLS_SSL_ALERT_MSG_UNRECOGNIZED_NAME\nSSL_ALERT_MSG_UNSUPPORTED_CERT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT\nSSL_ALERT_MSG_UNSUPPORTED_EXT MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT\nSSL_ALERT_MSG_USER_CANCELED MBEDTLS_SSL_ALERT_MSG_USER_CANCELED\nSSL_ANTI_REPLAY_DISABLED MBEDTLS_SSL_ANTI_REPLAY_DISABLED\nSSL_ANTI_REPLAY_ENABLED MBEDTLS_SSL_ANTI_REPLAY_ENABLED\nSSL_ARC4_DISABLED MBEDTLS_SSL_ARC4_DISABLED\nSSL_ARC4_ENABLED MBEDTLS_SSL_ARC4_ENABLED\nSSL_BUFFER_LEN MBEDTLS_SSL_BUFFER_LEN\nSSL_CACHE_DEFAULT_MAX_ENTRIES MBEDTLS_SSL_CACHE_DEFAULT_MAX_ENTRIES\nSSL_CACHE_DEFAULT_TIMEOUT MBEDTLS_SSL_CACHE_DEFAULT_TIMEOUT\nSSL_CBC_RECORD_SPLITTING_DISABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_DISABLED\nSSL_CBC_RECORD_SPLITTING_ENABLED MBEDTLS_SSL_CBC_RECORD_SPLITTING_ENABLED\nSSL_CERTIFICATE_REQUEST MBEDTLS_SSL_CERTIFICATE_REQUEST\nSSL_CERTIFICATE_VERIFY MBEDTLS_SSL_CERTIFICATE_VERIFY\nSSL_CERT_TYPE_ECDSA_SIGN MBEDTLS_SSL_CERT_TYPE_ECDSA_SIGN\nSSL_CERT_TYPE_RSA_SIGN MBEDTLS_SSL_CERT_TYPE_RSA_SIGN\nSSL_CHANNEL_INBOUND MBEDTLS_SSL_CHANNEL_INBOUND\nSSL_CHANNEL_OUTBOUND MBEDTLS_SSL_CHANNEL_OUTBOUND\nSSL_CIPHERSUITES MBEDTLS_SSL_CIPHERSUITES\nSSL_CLIENT_CERTIFICATE MBEDTLS_SSL_CLIENT_CERTIFICATE\nSSL_CLIENT_CHANGE_CIPHER_SPEC MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC\nSSL_CLIENT_FINISHED MBEDTLS_SSL_CLIENT_FINISHED\nSSL_CLIENT_HELLO MBEDTLS_SSL_CLIENT_HELLO\nSSL_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_CLIENT_KEY_EXCHANGE\nSSL_COMPRESSION_ADD MBEDTLS_SSL_COMPRESSION_ADD\nSSL_COMPRESS_DEFLATE MBEDTLS_SSL_COMPRESS_DEFLATE\nSSL_COMPRESS_NULL MBEDTLS_SSL_COMPRESS_NULL\nSSL_DEBUG_BUF MBEDTLS_SSL_DEBUG_BUF\nSSL_DEBUG_CRT MBEDTLS_SSL_DEBUG_CRT\nSSL_DEBUG_ECP MBEDTLS_SSL_DEBUG_ECP\nSSL_DEBUG_MPI MBEDTLS_SSL_DEBUG_MPI\nSSL_DEBUG_MSG MBEDTLS_SSL_DEBUG_MSG\nSSL_DEBUG_RET MBEDTLS_SSL_DEBUG_RET\nSSL_DEFAULT_TICKET_LIFETIME MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME\nSSL_DTLS_TIMEOUT_DFL_MAX MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MAX\nSSL_DTLS_TIMEOUT_DFL_MIN MBEDTLS_SSL_DTLS_TIMEOUT_DFL_MIN\nSSL_EMPTY_RENEGOTIATION_INFO MBEDTLS_SSL_EMPTY_RENEGOTIATION_INFO\nSSL_ETM_DISABLED MBEDTLS_SSL_ETM_DISABLED\nSSL_ETM_ENABLED MBEDTLS_SSL_ETM_ENABLED\nSSL_EXTENDED_MS_DISABLED MBEDTLS_SSL_EXTENDED_MS_DISABLED\nSSL_EXTENDED_MS_ENABLED MBEDTLS_SSL_EXTENDED_MS_ENABLED\nSSL_FALLBACK_SCSV MBEDTLS_SSL_FALLBACK_SCSV\nSSL_FLUSH_BUFFERS MBEDTLS_SSL_FLUSH_BUFFERS\nSSL_HANDSHAKE_OVER MBEDTLS_SSL_HANDSHAKE_OVER\nSSL_HANDSHAKE_WRAPUP MBEDTLS_SSL_HANDSHAKE_WRAPUP\nSSL_HASH_MD5 MBEDTLS_SSL_HASH_MD5\nSSL_HASH_NONE MBEDTLS_SSL_HASH_NONE\nSSL_HASH_SHA1 MBEDTLS_SSL_HASH_SHA1\nSSL_HASH_SHA224 MBEDTLS_SSL_HASH_SHA224\nSSL_HASH_SHA256 MBEDTLS_SSL_HASH_SHA256\nSSL_HASH_SHA384 MBEDTLS_SSL_HASH_SHA384\nSSL_HASH_SHA512 MBEDTLS_SSL_HASH_SHA512\nSSL_HELLO_REQUEST MBEDTLS_SSL_HELLO_REQUEST\nSSL_HS_CERTIFICATE MBEDTLS_SSL_HS_CERTIFICATE\nSSL_HS_CERTIFICATE_REQUEST MBEDTLS_SSL_HS_CERTIFICATE_REQUEST\nSSL_HS_CERTIFICATE_VERIFY MBEDTLS_SSL_HS_CERTIFICATE_VERIFY\nSSL_HS_CLIENT_HELLO MBEDTLS_SSL_HS_CLIENT_HELLO\nSSL_HS_CLIENT_KEY_EXCHANGE MBEDTLS_SSL_HS_CLIENT_KEY_EXCHANGE\nSSL_HS_FINISHED MBEDTLS_SSL_HS_FINISHED\nSSL_HS_HELLO_REQUEST MBEDTLS_SSL_HS_HELLO_REQUEST\nSSL_HS_HELLO_VERIFY_REQUEST MBEDTLS_SSL_HS_HELLO_VERIFY_REQUEST\nSSL_HS_NEW_SESSION_TICKET MBEDTLS_SSL_HS_NEW_SESSION_TICKET\nSSL_HS_SERVER_HELLO MBEDTLS_SSL_HS_SERVER_HELLO\nSSL_HS_SERVER_HELLO_DONE MBEDTLS_SSL_HS_SERVER_HELLO_DONE\nSSL_HS_SERVER_KEY_EXCHANGE MBEDTLS_SSL_HS_SERVER_KEY_EXCHANGE\nSSL_INITIAL_HANDSHAKE MBEDTLS_SSL_INITIAL_HANDSHAKE\nSSL_IS_CLIENT MBEDTLS_SSL_IS_CLIENT\nSSL_IS_FALLBACK MBEDTLS_SSL_IS_FALLBACK\nSSL_IS_NOT_FALLBACK MBEDTLS_SSL_IS_NOT_FALLBACK\nSSL_IS_SERVER MBEDTLS_SSL_IS_SERVER\nSSL_LEGACY_ALLOW_RENEGOTIATION MBEDTLS_SSL_LEGACY_ALLOW_RENEGOTIATION\nSSL_LEGACY_BREAK_HANDSHAKE MBEDTLS_SSL_LEGACY_BREAK_HANDSHAKE\nSSL_LEGACY_NO_RENEGOTIATION MBEDTLS_SSL_LEGACY_NO_RENEGOTIATION\nSSL_LEGACY_RENEGOTIATION MBEDTLS_SSL_LEGACY_RENEGOTIATION\nSSL_MAC_ADD MBEDTLS_SSL_MAC_ADD\nSSL_MAJOR_VERSION_3 MBEDTLS_SSL_MAJOR_VERSION_3\nSSL_MAX_CONTENT_LEN MBEDTLS_SSL_MAX_CONTENT_LEN\nSSL_MAX_FRAG_LEN_1024 MBEDTLS_SSL_MAX_FRAG_LEN_1024\nSSL_MAX_FRAG_LEN_2048 MBEDTLS_SSL_MAX_FRAG_LEN_2048\nSSL_MAX_FRAG_LEN_4096 MBEDTLS_SSL_MAX_FRAG_LEN_4096\nSSL_MAX_FRAG_LEN_512 MBEDTLS_SSL_MAX_FRAG_LEN_512\nSSL_MAX_FRAG_LEN_INVALID MBEDTLS_SSL_MAX_FRAG_LEN_INVALID\nSSL_MAX_FRAG_LEN_NONE MBEDTLS_SSL_MAX_FRAG_LEN_NONE\nSSL_MAX_MAJOR_VERSION MBEDTLS_SSL_MAX_MAJOR_VERSION\nSSL_MAX_MINOR_VERSION MBEDTLS_SSL_MAX_MINOR_VERSION\nSSL_MINOR_VERSION_0 MBEDTLS_SSL_MINOR_VERSION_0\nSSL_MINOR_VERSION_1 MBEDTLS_SSL_MINOR_VERSION_1\nSSL_MINOR_VERSION_2 MBEDTLS_SSL_MINOR_VERSION_2\nSSL_MINOR_VERSION_3 MBEDTLS_SSL_MINOR_VERSION_3\nSSL_MIN_MAJOR_VERSION MBEDTLS_SSL_MIN_MAJOR_VERSION\nSSL_MIN_MINOR_VERSION MBEDTLS_SSL_MIN_MINOR_VERSION\nSSL_MSG_ALERT MBEDTLS_SSL_MSG_ALERT\nSSL_MSG_APPLICATION_DATA MBEDTLS_SSL_MSG_APPLICATION_DATA\nSSL_MSG_CHANGE_CIPHER_SPEC MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC\nSSL_MSG_HANDSHAKE MBEDTLS_SSL_MSG_HANDSHAKE\nSSL_PADDING_ADD MBEDTLS_SSL_PADDING_ADD\nSSL_RENEGOTIATION MBEDTLS_SSL_RENEGOTIATION\nSSL_RENEGOTIATION_DISABLED MBEDTLS_SSL_RENEGOTIATION_DISABLED\nSSL_RENEGOTIATION_DONE MBEDTLS_SSL_RENEGOTIATION_DONE\nSSL_RENEGOTIATION_ENABLED MBEDTLS_SSL_RENEGOTIATION_ENABLED\nSSL_RENEGOTIATION_NOT_ENFORCED MBEDTLS_SSL_RENEGOTIATION_NOT_ENFORCED\nSSL_RENEGOTIATION_PENDING MBEDTLS_SSL_RENEGOTIATION_PENDING\nSSL_RENEGO_MAX_RECORDS_DEFAULT MBEDTLS_SSL_RENEGO_MAX_RECORDS_DEFAULT\nSSL_RETRANS_FINISHED MBEDTLS_SSL_RETRANS_FINISHED\nSSL_RETRANS_PREPARING MBEDTLS_SSL_RETRANS_PREPARING\nSSL_RETRANS_SENDING MBEDTLS_SSL_RETRANS_SENDING\nSSL_RETRANS_WAITING MBEDTLS_SSL_RETRANS_WAITING\nSSL_SECURE_RENEGOTIATION MBEDTLS_SSL_SECURE_RENEGOTIATION\nSSL_SERVER_CERTIFICATE MBEDTLS_SSL_SERVER_CERTIFICATE\nSSL_SERVER_CHANGE_CIPHER_SPEC MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC\nSSL_SERVER_FINISHED MBEDTLS_SSL_SERVER_FINISHED\nSSL_SERVER_HELLO MBEDTLS_SSL_SERVER_HELLO\nSSL_SERVER_HELLO_DONE MBEDTLS_SSL_SERVER_HELLO_DONE\nSSL_SERVER_HELLO_VERIFY_REQUEST_SENT MBEDTLS_SSL_SERVER_HELLO_VERIFY_REQUEST_SENT\nSSL_SERVER_KEY_EXCHANGE MBEDTLS_SSL_SERVER_KEY_EXCHANGE\nSSL_SERVER_NEW_SESSION_TICKET MBEDTLS_SSL_SERVER_NEW_SESSION_TICKET\nSSL_SESSION_TICKETS_DISABLED MBEDTLS_SSL_SESSION_TICKETS_DISABLED\nSSL_SESSION_TICKETS_ENABLED MBEDTLS_SSL_SESSION_TICKETS_ENABLED\nSSL_SIG_ANON MBEDTLS_SSL_SIG_ANON\nSSL_SIG_ECDSA MBEDTLS_SSL_SIG_ECDSA\nSSL_SIG_RSA MBEDTLS_SSL_SIG_RSA\nSSL_TRANSPORT_DATAGRAM MBEDTLS_SSL_TRANSPORT_DATAGRAM\nSSL_TRANSPORT_STREAM MBEDTLS_SSL_TRANSPORT_STREAM\nSSL_TRUNCATED_HMAC_LEN MBEDTLS_SSL_TRUNCATED_HMAC_LEN\nSSL_TRUNC_HMAC_DISABLED MBEDTLS_SSL_TRUNC_HMAC_DISABLED\nSSL_TRUNC_HMAC_ENABLED MBEDTLS_SSL_TRUNC_HMAC_ENABLED\nSSL_VERIFY_DATA_MAX_LEN MBEDTLS_SSL_VERIFY_DATA_MAX_LEN\nSSL_VERIFY_NONE MBEDTLS_SSL_VERIFY_NONE\nSSL_VERIFY_OPTIONAL MBEDTLS_SSL_VERIFY_OPTIONAL\nSSL_VERIFY_REQUIRED MBEDTLS_SSL_VERIFY_REQUIRED\nTLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA\nTLS_DHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA\nTLS_DHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CBC_SHA256\nTLS_DHE_PSK_WITH_AES_128_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM\nTLS_DHE_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_CCM_8\nTLS_DHE_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_AES_128_GCM_SHA256\nTLS_DHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA\nTLS_DHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CBC_SHA384\nTLS_DHE_PSK_WITH_AES_256_CCM MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM\nTLS_DHE_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_CCM_8\nTLS_DHE_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_AES_256_GCM_SHA384\nTLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256\nTLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256\nTLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384\nTLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384\nTLS_DHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA\nTLS_DHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA256\nTLS_DHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_DHE_PSK_WITH_NULL_SHA384\nTLS_DHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_DHE_PSK_WITH_RC4_128_SHA\nTLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA\nTLS_DHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA\nTLS_DHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CBC_SHA256\nTLS_DHE_RSA_WITH_AES_128_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM\nTLS_DHE_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_CCM_8\nTLS_DHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_128_GCM_SHA256\nTLS_DHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA\nTLS_DHE_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CBC_SHA256\nTLS_DHE_RSA_WITH_AES_256_CCM MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM\nTLS_DHE_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_CCM_8\nTLS_DHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_AES_256_GCM_SHA384\nTLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA\nTLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256\nTLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256\nTLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA\nTLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256\nTLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384\nTLS_DHE_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_DHE_RSA_WITH_DES_CBC_SHA\nTLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA\nTLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA\nTLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256\nTLS_ECDHE_ECDSA_WITH_AES_128_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM\nTLS_ECDHE_ECDSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8\nTLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256\nTLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA\nTLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384\nTLS_ECDHE_ECDSA_WITH_AES_256_CCM MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM\nTLS_ECDHE_ECDSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8\nTLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384\nTLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256\nTLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256\nTLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384\nTLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384\nTLS_ECDHE_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_NULL_SHA\nTLS_ECDHE_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA\nTLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA\nTLS_ECDHE_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA\nTLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256\nTLS_ECDHE_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA\nTLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384\nTLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256\nTLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384\nTLS_ECDHE_PSK_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA\nTLS_ECDHE_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA256\nTLS_ECDHE_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_ECDHE_PSK_WITH_NULL_SHA384\nTLS_ECDHE_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_PSK_WITH_RC4_128_SHA\nTLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA\nTLS_ECDHE_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA\nTLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256\nTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\nTLS_ECDHE_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA\nTLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384\nTLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\nTLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256\nTLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256\nTLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384\nTLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384\nTLS_ECDHE_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_NULL_SHA\nTLS_ECDHE_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDHE_RSA_WITH_RC4_128_SHA\nTLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA\nTLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA\nTLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256\nTLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256\nTLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA\nTLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384\nTLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384\nTLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256\nTLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256\nTLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384\nTLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384\nTLS_ECDH_ECDSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_NULL_SHA\nTLS_ECDH_ECDSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_ECDSA_WITH_RC4_128_SHA\nTLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA\nTLS_ECDH_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA\nTLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256\nTLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256\nTLS_ECDH_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA\nTLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384\nTLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384\nTLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256\nTLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256\nTLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384\nTLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384\nTLS_ECDH_RSA_WITH_NULL_SHA MBEDTLS_TLS_ECDH_RSA_WITH_NULL_SHA\nTLS_ECDH_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_ECDH_RSA_WITH_RC4_128_SHA\nTLS_EXT_ALPN MBEDTLS_TLS_EXT_ALPN\nTLS_EXT_ENCRYPT_THEN_MAC MBEDTLS_TLS_EXT_ENCRYPT_THEN_MAC\nTLS_EXT_EXTENDED_MASTER_SECRET MBEDTLS_TLS_EXT_EXTENDED_MASTER_SECRET\nTLS_EXT_MAX_FRAGMENT_LENGTH MBEDTLS_TLS_EXT_MAX_FRAGMENT_LENGTH\nTLS_EXT_RENEGOTIATION_INFO MBEDTLS_TLS_EXT_RENEGOTIATION_INFO\nTLS_EXT_SERVERNAME MBEDTLS_TLS_EXT_SERVERNAME\nTLS_EXT_SERVERNAME_HOSTNAME MBEDTLS_TLS_EXT_SERVERNAME_HOSTNAME\nTLS_EXT_SESSION_TICKET MBEDTLS_TLS_EXT_SESSION_TICKET\nTLS_EXT_SIG_ALG MBEDTLS_TLS_EXT_SIG_ALG\nTLS_EXT_SUPPORTED_ELLIPTIC_CURVES MBEDTLS_TLS_EXT_SUPPORTED_ELLIPTIC_CURVES\nTLS_EXT_SUPPORTED_POINT_FORMATS MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS\nTLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT MBEDTLS_TLS_EXT_SUPPORTED_POINT_FORMATS_PRESENT\nTLS_EXT_TRUNCATED_HMAC MBEDTLS_TLS_EXT_TRUNCATED_HMAC\nTLS_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_PSK_WITH_3DES_EDE_CBC_SHA\nTLS_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA\nTLS_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_CBC_SHA256\nTLS_PSK_WITH_AES_128_CCM MBEDTLS_TLS_PSK_WITH_AES_128_CCM\nTLS_PSK_WITH_AES_128_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_128_CCM_8\nTLS_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_AES_128_GCM_SHA256\nTLS_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA\nTLS_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_CBC_SHA384\nTLS_PSK_WITH_AES_256_CCM MBEDTLS_TLS_PSK_WITH_AES_256_CCM\nTLS_PSK_WITH_AES_256_CCM_8 MBEDTLS_TLS_PSK_WITH_AES_256_CCM_8\nTLS_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_AES_256_GCM_SHA384\nTLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256\nTLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256\nTLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384\nTLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384\nTLS_PSK_WITH_NULL_SHA MBEDTLS_TLS_PSK_WITH_NULL_SHA\nTLS_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_PSK_WITH_NULL_SHA256\nTLS_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_PSK_WITH_NULL_SHA384\nTLS_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_PSK_WITH_RC4_128_SHA\nTLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA\nTLS_RSA_PSK_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA\nTLS_RSA_PSK_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_CBC_SHA256\nTLS_RSA_PSK_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_AES_128_GCM_SHA256\nTLS_RSA_PSK_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA\nTLS_RSA_PSK_WITH_AES_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_CBC_SHA384\nTLS_RSA_PSK_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_AES_256_GCM_SHA384\nTLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256\nTLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256\nTLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384\nTLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384\nTLS_RSA_PSK_WITH_NULL_SHA MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA\nTLS_RSA_PSK_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA256\nTLS_RSA_PSK_WITH_NULL_SHA384 MBEDTLS_TLS_RSA_PSK_WITH_NULL_SHA384\nTLS_RSA_PSK_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_PSK_WITH_RC4_128_SHA\nTLS_RSA_WITH_3DES_EDE_CBC_SHA MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA\nTLS_RSA_WITH_AES_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA\nTLS_RSA_WITH_AES_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_CBC_SHA256\nTLS_RSA_WITH_AES_128_CCM MBEDTLS_TLS_RSA_WITH_AES_128_CCM\nTLS_RSA_WITH_AES_128_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_128_CCM_8\nTLS_RSA_WITH_AES_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_AES_128_GCM_SHA256\nTLS_RSA_WITH_AES_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA\nTLS_RSA_WITH_AES_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_AES_256_CBC_SHA256\nTLS_RSA_WITH_AES_256_CCM MBEDTLS_TLS_RSA_WITH_AES_256_CCM\nTLS_RSA_WITH_AES_256_CCM_8 MBEDTLS_TLS_RSA_WITH_AES_256_CCM_8\nTLS_RSA_WITH_AES_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_AES_256_GCM_SHA384\nTLS_RSA_WITH_CAMELLIA_128_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA\nTLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256\nTLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256\nTLS_RSA_WITH_CAMELLIA_256_CBC_SHA MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA\nTLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256\nTLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 MBEDTLS_TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384\nTLS_RSA_WITH_DES_CBC_SHA MBEDTLS_TLS_RSA_WITH_DES_CBC_SHA\nTLS_RSA_WITH_NULL_MD5 MBEDTLS_TLS_RSA_WITH_NULL_MD5\nTLS_RSA_WITH_NULL_SHA MBEDTLS_TLS_RSA_WITH_NULL_SHA\nTLS_RSA_WITH_NULL_SHA256 MBEDTLS_TLS_RSA_WITH_NULL_SHA256\nTLS_RSA_WITH_RC4_128_MD5 MBEDTLS_TLS_RSA_WITH_RC4_128_MD5\nTLS_RSA_WITH_RC4_128_SHA MBEDTLS_TLS_RSA_WITH_RC4_128_SHA\nX509_CRT_VERSION_1 MBEDTLS_X509_CRT_VERSION_1\nX509_CRT_VERSION_2 MBEDTLS_X509_CRT_VERSION_2\nX509_CRT_VERSION_3 MBEDTLS_X509_CRT_VERSION_3\nX509_FORMAT_DER MBEDTLS_X509_FORMAT_DER\nX509_FORMAT_PEM MBEDTLS_X509_FORMAT_PEM\nX509_MAX_DN_NAME_SIZE MBEDTLS_X509_MAX_DN_NAME_SIZE\nX509_RFC5280_MAX_SERIAL_LEN MBEDTLS_X509_RFC5280_MAX_SERIAL_LEN\nX509_RFC5280_UTC_TIME_LEN MBEDTLS_X509_RFC5280_UTC_TIME_LEN\nXTEA_DECRYPT MBEDTLS_XTEA_DECRYPT\nXTEA_ENCRYPT MBEDTLS_XTEA_ENCRYPT\n_asn1_bitstring mbedtls_asn1_bitstring\n_asn1_buf mbedtls_asn1_buf\n_asn1_named_data mbedtls_asn1_named_data\n_asn1_sequence mbedtls_asn1_sequence\n_ssl_cache_context mbedtls_ssl_cache_context\n_ssl_cache_entry mbedtls_ssl_cache_entry\n_ssl_ciphersuite_t mbedtls_ssl_ciphersuite_t\n_ssl_context mbedtls_ssl_context\n_ssl_flight_item mbedtls_ssl_flight_item\n_ssl_handshake_params mbedtls_ssl_handshake_params\n_ssl_key_cert mbedtls_ssl_key_cert\n_ssl_premaster_secret mbedtls_ssl_premaster_secret\n_ssl_session mbedtls_ssl_session\n_ssl_ticket_keys mbedtls_ssl_ticket_keys\n_ssl_transform mbedtls_ssl_transform\n_x509_crl mbedtls_x509_crl\n_x509_crl_entry mbedtls_x509_crl_entry\n_x509_crt mbedtls_x509_crt\n_x509_csr mbedtls_x509_csr\n_x509_time mbedtls_x509_time\n_x509write_cert mbedtls_x509write_cert\n_x509write_csr mbedtls_x509write_csr\naes_context mbedtls_aes_context\naes_crypt_cbc mbedtls_aes_crypt_cbc\naes_crypt_cfb128 mbedtls_aes_crypt_cfb128\naes_crypt_cfb8 mbedtls_aes_crypt_cfb8\naes_crypt_ctr mbedtls_aes_crypt_ctr\naes_crypt_ecb mbedtls_aes_crypt_ecb\naes_free mbedtls_aes_free\naes_init mbedtls_aes_init\naes_self_test mbedtls_aes_self_test\naes_setkey_dec mbedtls_aes_setkey_dec\naes_setkey_enc mbedtls_aes_setkey_enc\naesni_crypt_ecb mbedtls_aesni_crypt_ecb\naesni_gcm_mult mbedtls_aesni_gcm_mult\naesni_inverse_key mbedtls_aesni_inverse_key\naesni_setkey_enc mbedtls_aesni_setkey_enc\naesni_supports mbedtls_aesni_has_support\nalarmed mbedtls_timing_alarmed\narc4_context mbedtls_arc4_context\narc4_crypt mbedtls_arc4_crypt\narc4_free mbedtls_arc4_free\narc4_init mbedtls_arc4_init\narc4_self_test mbedtls_arc4_self_test\narc4_setup mbedtls_arc4_setup\nasn1_bitstring mbedtls_asn1_bitstring\nasn1_buf mbedtls_asn1_buf\nasn1_find_named_data mbedtls_asn1_find_named_data\nasn1_free_named_data mbedtls_asn1_free_named_data\nasn1_free_named_data_list mbedtls_asn1_free_named_data_list\nasn1_get_alg mbedtls_asn1_get_alg\nasn1_get_alg_null mbedtls_asn1_get_alg_null\nasn1_get_bitstring mbedtls_asn1_get_bitstring\nasn1_get_bitstring_null mbedtls_asn1_get_bitstring_null\nasn1_get_bool mbedtls_asn1_get_bool\nasn1_get_int mbedtls_asn1_get_int\nasn1_get_len mbedtls_asn1_get_len\nasn1_get_mpi mbedtls_asn1_get_mpi\nasn1_get_sequence_of mbedtls_asn1_get_sequence_of\nasn1_get_tag mbedtls_asn1_get_tag\nasn1_named_data mbedtls_asn1_named_data\nasn1_sequence mbedtls_asn1_sequence\nasn1_store_named_data mbedtls_asn1_store_named_data\nasn1_write_algorithm_identifier mbedtls_asn1_write_algorithm_identifier\nasn1_write_bitstring mbedtls_asn1_write_bitstring\nasn1_write_bool mbedtls_asn1_write_bool\nasn1_write_ia5_string mbedtls_asn1_write_ia5_string\nasn1_write_int mbedtls_asn1_write_int\nasn1_write_len mbedtls_asn1_write_len\nasn1_write_mpi mbedtls_asn1_write_mpi\nasn1_write_null mbedtls_asn1_write_null\nasn1_write_octet_string mbedtls_asn1_write_octet_string\nasn1_write_oid mbedtls_asn1_write_oid\nasn1_write_printable_string mbedtls_asn1_write_printable_string\nasn1_write_raw_buffer mbedtls_asn1_write_raw_buffer\nasn1_write_tag mbedtls_asn1_write_tag\nbase64_decode mbedtls_base64_decode\nbase64_encode mbedtls_base64_encode\nbase64_self_test mbedtls_base64_self_test\nblowfish_context mbedtls_blowfish_context\nblowfish_crypt_cbc mbedtls_blowfish_crypt_cbc\nblowfish_crypt_cfb64 mbedtls_blowfish_crypt_cfb64\nblowfish_crypt_ctr mbedtls_blowfish_crypt_ctr\nblowfish_crypt_ecb mbedtls_blowfish_crypt_ecb\nblowfish_free mbedtls_blowfish_free\nblowfish_init mbedtls_blowfish_init\nblowfish_setkey mbedtls_blowfish_setkey\ncamellia_context mbedtls_camellia_context\ncamellia_crypt_cbc mbedtls_camellia_crypt_cbc\ncamellia_crypt_cfb128 mbedtls_camellia_crypt_cfb128\ncamellia_crypt_ctr mbedtls_camellia_crypt_ctr\ncamellia_crypt_ecb mbedtls_camellia_crypt_ecb\ncamellia_free mbedtls_camellia_free\ncamellia_init mbedtls_camellia_init\ncamellia_self_test mbedtls_camellia_self_test\ncamellia_setkey_dec mbedtls_camellia_setkey_dec\ncamellia_setkey_enc mbedtls_camellia_setkey_enc\nccm_auth_decrypt mbedtls_ccm_auth_decrypt\nccm_context mbedtls_ccm_context\nccm_encrypt_and_tag mbedtls_ccm_encrypt_and_tag\nccm_free mbedtls_ccm_free\nccm_init mbedtls_ccm_init\nccm_self_test mbedtls_ccm_self_test\ncipher_auth_decrypt mbedtls_cipher_auth_decrypt\ncipher_auth_encrypt mbedtls_cipher_auth_encrypt\ncipher_base_t mbedtls_cipher_base_t\ncipher_check_tag mbedtls_cipher_check_tag\ncipher_context_t mbedtls_cipher_context_t\ncipher_crypt mbedtls_cipher_crypt\ncipher_definition_t mbedtls_cipher_definition_t\ncipher_definitions mbedtls_cipher_definitions\ncipher_finish mbedtls_cipher_finish\ncipher_free mbedtls_cipher_free\ncipher_free_ctx mbedtls_cipher_free_ctx\ncipher_get_block_size mbedtls_cipher_get_block_size\ncipher_get_cipher_mode mbedtls_cipher_get_cipher_mode\ncipher_get_iv_size mbedtls_cipher_get_iv_size\ncipher_get_key_size mbedtls_cipher_get_key_bitlen\ncipher_get_name mbedtls_cipher_get_name\ncipher_get_operation mbedtls_cipher_get_operation\ncipher_get_type mbedtls_cipher_get_type\ncipher_id_t mbedtls_cipher_id_t\ncipher_info_from_string mbedtls_cipher_info_from_string\ncipher_info_from_type mbedtls_cipher_info_from_type\ncipher_info_from_values mbedtls_cipher_info_from_values\ncipher_info_t mbedtls_cipher_info_t\ncipher_init mbedtls_cipher_init\ncipher_init_ctx mbedtls_cipher_setup\ncipher_list mbedtls_cipher_list\ncipher_mode_t mbedtls_cipher_mode_t\ncipher_padding_t mbedtls_cipher_padding_t\ncipher_reset mbedtls_cipher_reset\ncipher_self_test mbedtls_cipher_self_test\ncipher_set_iv mbedtls_cipher_set_iv\ncipher_set_padding_mode mbedtls_cipher_set_padding_mode\ncipher_setkey mbedtls_cipher_setkey\ncipher_type_t mbedtls_cipher_type_t\ncipher_update mbedtls_cipher_update\ncipher_update_ad mbedtls_cipher_update_ad\ncipher_write_tag mbedtls_cipher_write_tag\nctr_drbg_context mbedtls_ctr_drbg_context\nctr_drbg_free mbedtls_ctr_drbg_free\nctr_drbg_init mbedtls_ctr_drbg_init\nctr_drbg_init_entropy_len mbedtls_ctr_drbg_init_entropy_len\nctr_drbg_random mbedtls_ctr_drbg_random\nctr_drbg_random_with_add mbedtls_ctr_drbg_random_with_add\nctr_drbg_reseed mbedtls_ctr_drbg_reseed\nctr_drbg_self_test mbedtls_ctr_drbg_self_test\nctr_drbg_set_entropy_len mbedtls_ctr_drbg_set_entropy_len\nctr_drbg_set_prediction_resistance mbedtls_ctr_drbg_set_prediction_resistance\nctr_drbg_set_reseed_interval mbedtls_ctr_drbg_set_reseed_interval\nctr_drbg_update mbedtls_ctr_drbg_update\nctr_drbg_update_seed_file mbedtls_ctr_drbg_update_seed_file\nctr_drbg_write_seed_file mbedtls_ctr_drbg_write_seed_file\ndebug_fmt mbedtls_debug_fmt\ndebug_print_buf mbedtls_debug_print_buf\ndebug_print_crt mbedtls_debug_print_crt\ndebug_print_ecp mbedtls_debug_print_ecp\ndebug_print_mpi mbedtls_debug_print_mpi\ndebug_print_msg mbedtls_debug_print_msg\ndebug_print_ret mbedtls_debug_print_ret\ndebug_set_log_mode mbedtls_debug_set_log_mode\ndebug_set_threshold mbedtls_debug_set_threshold\ndes3_context mbedtls_des3_context\ndes3_crypt_cbc mbedtls_des3_crypt_cbc\ndes3_crypt_ecb mbedtls_des3_crypt_ecb\ndes3_free mbedtls_des3_free\ndes3_init mbedtls_des3_init\ndes3_set2key_dec mbedtls_des3_set2key_dec\ndes3_set2key_enc mbedtls_des3_set2key_enc\ndes3_set3key_dec mbedtls_des3_set3key_dec\ndes3_set3key_enc mbedtls_des3_set3key_enc\ndes_context mbedtls_des_context\ndes_crypt_cbc mbedtls_des_crypt_cbc\ndes_crypt_ecb mbedtls_des_crypt_ecb\ndes_free mbedtls_des_free\ndes_init mbedtls_des_init\ndes_key_check_key_parity mbedtls_des_key_check_key_parity\ndes_key_check_weak mbedtls_des_key_check_weak\ndes_key_set_parity mbedtls_des_key_set_parity\ndes_self_test mbedtls_des_self_test\ndes_setkey_dec mbedtls_des_setkey_dec\ndes_setkey_enc mbedtls_des_setkey_enc\ndhm_calc_secret mbedtls_dhm_calc_secret\ndhm_context mbedtls_dhm_context\ndhm_free mbedtls_dhm_free\ndhm_init mbedtls_dhm_init\ndhm_make_params mbedtls_dhm_make_params\ndhm_make_public mbedtls_dhm_make_public\ndhm_parse_dhm mbedtls_dhm_parse_dhm\ndhm_parse_dhmfile mbedtls_dhm_parse_dhmfile\ndhm_read_params mbedtls_dhm_read_params\ndhm_read_public mbedtls_dhm_read_public\ndhm_self_test mbedtls_dhm_self_test\necdh_calc_secret mbedtls_ecdh_calc_secret\necdh_compute_shared mbedtls_ecdh_compute_shared\necdh_context mbedtls_ecdh_context\necdh_free mbedtls_ecdh_free\necdh_gen_public mbedtls_ecdh_gen_public\necdh_get_params mbedtls_ecdh_get_params\necdh_init mbedtls_ecdh_init\necdh_make_params mbedtls_ecdh_make_params\necdh_make_public mbedtls_ecdh_make_public\necdh_read_params mbedtls_ecdh_read_params\necdh_read_public mbedtls_ecdh_read_public\necdh_self_test mbedtls_ecdh_self_test\necdh_side mbedtls_ecdh_side\necdsa_context mbedtls_ecdsa_context\necdsa_free mbedtls_ecdsa_free\necdsa_from_keypair mbedtls_ecdsa_from_keypair\necdsa_genkey mbedtls_ecdsa_genkey\necdsa_info mbedtls_ecdsa_info\necdsa_init mbedtls_ecdsa_init\necdsa_read_signature mbedtls_ecdsa_read_signature\necdsa_self_test mbedtls_ecdsa_self_test\necdsa_sign mbedtls_ecdsa_sign\necdsa_sign_det mbedtls_ecdsa_sign_det\necdsa_verify mbedtls_ecdsa_verify\necdsa_write_signature mbedtls_ecdsa_write_signature\necdsa_write_signature_det mbedtls_ecdsa_write_signature_det\neckey_info mbedtls_eckey_info\neckeydh_info mbedtls_eckeydh_info\necp_add mbedtls_ecp_add\necp_check_privkey mbedtls_ecp_check_privkey\necp_check_pub_priv mbedtls_ecp_check_pub_priv\necp_check_pubkey mbedtls_ecp_check_pubkey\necp_copy mbedtls_ecp_copy\necp_curve_info mbedtls_ecp_curve_info\necp_curve_info_from_grp_id mbedtls_ecp_curve_info_from_grp_id\necp_curve_info_from_name mbedtls_ecp_curve_info_from_name\necp_curve_info_from_tls_id mbedtls_ecp_curve_info_from_tls_id\necp_curve_list mbedtls_ecp_curve_list\necp_gen_key mbedtls_ecp_gen_key\necp_gen_keypair mbedtls_ecp_gen_keypair\necp_group mbedtls_ecp_group\necp_group_copy mbedtls_ecp_group_copy\necp_group_free mbedtls_ecp_group_free\necp_group_id mbedtls_ecp_group_id\necp_group_init mbedtls_ecp_group_init\necp_group_read_string mbedtls_ecp_group_read_string\necp_grp_id_list mbedtls_ecp_grp_id_list\necp_is_zero mbedtls_ecp_is_zero\necp_keypair mbedtls_ecp_keypair\necp_keypair_free mbedtls_ecp_keypair_free\necp_keypair_init mbedtls_ecp_keypair_init\necp_mul mbedtls_ecp_mul\necp_point mbedtls_ecp_point\necp_point_free mbedtls_ecp_point_free\necp_point_init mbedtls_ecp_point_init\necp_point_read_binary mbedtls_ecp_point_read_binary\necp_point_read_string mbedtls_ecp_point_read_string\necp_point_write_binary mbedtls_ecp_point_write_binary\necp_self_test mbedtls_ecp_self_test\necp_set_zero mbedtls_ecp_set_zero\necp_sub mbedtls_ecp_sub\necp_tls_read_group mbedtls_ecp_tls_read_group\necp_tls_read_point mbedtls_ecp_tls_read_point\necp_tls_write_group mbedtls_ecp_tls_write_group\necp_tls_write_point mbedtls_ecp_tls_write_point\necp_use_known_dp mbedtls_ecp_group_load\nentropy_add_source mbedtls_entropy_add_source\nentropy_context mbedtls_entropy_context\nentropy_free mbedtls_entropy_free\nentropy_func mbedtls_entropy_func\nentropy_gather mbedtls_entropy_gather\nentropy_init mbedtls_entropy_init\nentropy_self_test mbedtls_entropy_self_test\nentropy_update_manual mbedtls_entropy_update_manual\nentropy_update_seed_file mbedtls_entropy_update_seed_file\nentropy_write_seed_file mbedtls_entropy_write_seed_file\nerror_strerror mbedtls_strerror\nf_source_ptr mbedtls_entropy_f_source_ptr\ngcm_auth_decrypt mbedtls_gcm_auth_decrypt\ngcm_context mbedtls_gcm_context\ngcm_crypt_and_tag mbedtls_gcm_crypt_and_tag\ngcm_finish mbedtls_gcm_finish\ngcm_free mbedtls_gcm_free\ngcm_init mbedtls_gcm_init\ngcm_self_test mbedtls_gcm_self_test\ngcm_starts mbedtls_gcm_starts\ngcm_update mbedtls_gcm_update\nget_timer mbedtls_timing_get_timer\nhardclock mbedtls_timing_hardclock\nhardclock_poll mbedtls_hardclock_poll\nhavege_free mbedtls_havege_free\nhavege_init mbedtls_havege_init\nhavege_poll mbedtls_havege_poll\nhavege_random mbedtls_havege_random\nhavege_state mbedtls_havege_state\nhmac_drbg_context mbedtls_hmac_drbg_context\nhmac_drbg_free mbedtls_hmac_drbg_free\nhmac_drbg_init mbedtls_hmac_drbg_init\nhmac_drbg_init_buf mbedtls_hmac_drbg_init_buf\nhmac_drbg_random mbedtls_hmac_drbg_random\nhmac_drbg_random_with_add mbedtls_hmac_drbg_random_with_add\nhmac_drbg_reseed mbedtls_hmac_drbg_reseed\nhmac_drbg_self_test mbedtls_hmac_drbg_self_test\nhmac_drbg_set_entropy_len mbedtls_hmac_drbg_set_entropy_len\nhmac_drbg_set_prediction_resistance mbedtls_hmac_drbg_set_prediction_resistance\nhmac_drbg_set_reseed_interval mbedtls_hmac_drbg_set_reseed_interval\nhmac_drbg_update mbedtls_hmac_drbg_update\nhmac_drbg_update_seed_file mbedtls_hmac_drbg_update_seed_file\nhmac_drbg_write_seed_file mbedtls_hmac_drbg_write_seed_file\nhr_time mbedtls_timing_hr_time\nkey_exchange_type_t mbedtls_key_exchange_type_t\nm_sleep mbedtls_timing_m_sleep\nmd mbedtls_md\nmd2 mbedtls_md2\nmd2_context mbedtls_md2_context\nmd2_file mbedtls_md2_file\nmd2_finish mbedtls_md2_finish\nmd2_free mbedtls_md2_free\nmd2_hmac mbedtls_md2_hmac\nmd2_hmac_finish mbedtls_md2_hmac_finish\nmd2_hmac_reset mbedtls_md2_hmac_reset\nmd2_hmac_starts mbedtls_md2_hmac_starts\nmd2_hmac_update mbedtls_md2_hmac_update\nmd2_info mbedtls_md2_info\nmd2_init mbedtls_md2_init\nmd2_process mbedtls_md2_process\nmd2_self_test mbedtls_md2_self_test\nmd2_starts mbedtls_md2_starts\nmd2_update mbedtls_md2_update\nmd4 mbedtls_md4\nmd4_context mbedtls_md4_context\nmd4_file mbedtls_md4_file\nmd4_finish mbedtls_md4_finish\nmd4_free mbedtls_md4_free\nmd4_hmac mbedtls_md4_hmac\nmd4_hmac_finish mbedtls_md4_hmac_finish\nmd4_hmac_reset mbedtls_md4_hmac_reset\nmd4_hmac_starts mbedtls_md4_hmac_starts\nmd4_hmac_update mbedtls_md4_hmac_update\nmd4_info mbedtls_md4_info\nmd4_init mbedtls_md4_init\nmd4_process mbedtls_md4_process\nmd4_self_test mbedtls_md4_self_test\nmd4_starts mbedtls_md4_starts\nmd4_update mbedtls_md4_update\nmd5 mbedtls_md5\nmd5_context mbedtls_md5_context\nmd5_file mbedtls_md5_file\nmd5_finish mbedtls_md5_finish\nmd5_free mbedtls_md5_free\nmd5_hmac mbedtls_md5_hmac\nmd5_hmac_finish mbedtls_md5_hmac_finish\nmd5_hmac_reset mbedtls_md5_hmac_reset\nmd5_hmac_starts mbedtls_md5_hmac_starts\nmd5_hmac_update mbedtls_md5_hmac_update\nmd5_info mbedtls_md5_info\nmd5_init mbedtls_md5_init\nmd5_process mbedtls_md5_process\nmd5_self_test mbedtls_md5_self_test\nmd5_starts mbedtls_md5_starts\nmd5_update mbedtls_md5_update\nmd_context_t mbedtls_md_context_t\nmd_file mbedtls_md_file\nmd_finish mbedtls_md_finish\nmd_free mbedtls_md_free\nmd_free_ctx mbedtls_md_free_ctx\nmd_get_name mbedtls_md_get_name\nmd_get_size mbedtls_md_get_size\nmd_get_type mbedtls_md_get_type\nmd_hmac mbedtls_md_hmac\nmd_hmac_finish mbedtls_md_hmac_finish\nmd_hmac_reset mbedtls_md_hmac_reset\nmd_hmac_starts mbedtls_md_hmac_starts\nmd_hmac_update mbedtls_md_hmac_update\nmd_info_from_string mbedtls_md_info_from_string\nmd_info_from_type mbedtls_md_info_from_type\nmd_info_t mbedtls_md_info_t\nmd_init mbedtls_md_init\nmd_init_ctx mbedtls_md_init_ctx\nmd_list mbedtls_md_list\nmd_process mbedtls_md_process\nmd_starts mbedtls_md_starts\nmd_type_t mbedtls_md_type_t\nmd_update mbedtls_md_update\nmemory_buffer_alloc_cur_get mbedtls_memory_buffer_alloc_cur_get\nmemory_buffer_alloc_free mbedtls_memory_buffer_alloc_free\nmemory_buffer_alloc_init mbedtls_memory_buffer_alloc_init\nmemory_buffer_alloc_max_get mbedtls_memory_buffer_alloc_max_get\nmemory_buffer_alloc_max_reset mbedtls_memory_buffer_alloc_max_reset\nmemory_buffer_alloc_self_test mbedtls_memory_buffer_alloc_self_test\nmemory_buffer_alloc_status mbedtls_memory_buffer_alloc_status\nmemory_buffer_alloc_verify mbedtls_memory_buffer_alloc_verify\nmemory_buffer_set_verify mbedtls_memory_buffer_set_verify\nmemory_set_own mbedtls_memory_set_own\nmpi mbedtls_mpi\nmpi_add_abs mbedtls_mpi_add_abs\nmpi_add_int mbedtls_mpi_add_int\nmpi_add_mpi mbedtls_mpi_add_mpi\nmpi_cmp_abs mbedtls_mpi_cmp_abs\nmpi_cmp_int mbedtls_mpi_cmp_int\nmpi_cmp_mpi mbedtls_mpi_cmp_mpi\nmpi_copy mbedtls_mpi_copy\nmpi_div_int mbedtls_mpi_div_int\nmpi_div_mpi mbedtls_mpi_div_mpi\nmpi_exp_mod mbedtls_mpi_exp_mod\nmpi_fill_random mbedtls_mpi_fill_random\nmpi_free mbedtls_mpi_free\nmpi_gcd mbedtls_mpi_gcd\nmpi_gen_prime mbedtls_mpi_gen_prime\nmpi_get_bit mbedtls_mpi_get_bit\nmpi_grow mbedtls_mpi_grow\nmpi_init mbedtls_mpi_init\nmpi_inv_mod mbedtls_mpi_inv_mod\nmpi_is_prime mbedtls_mpi_is_prime\nmpi_lsb mbedtls_mpi_lsb\nmpi_lset mbedtls_mpi_lset\nmpi_mod_int mbedtls_mpi_mod_int\nmpi_mod_mpi mbedtls_mpi_mod_mpi\nmpi_msb mbedtls_mpi_bitlen\nmpi_mul_int mbedtls_mpi_mul_int\nmpi_mul_mpi mbedtls_mpi_mul_mpi\nmpi_read_binary mbedtls_mpi_read_binary\nmpi_read_file mbedtls_mpi_read_file\nmpi_read_string mbedtls_mpi_read_string\nmpi_safe_cond_assign mbedtls_mpi_safe_cond_assign\nmpi_safe_cond_swap mbedtls_mpi_safe_cond_swap\nmpi_self_test mbedtls_mpi_self_test\nmpi_set_bit mbedtls_mpi_set_bit\nmpi_shift_l mbedtls_mpi_shift_l\nmpi_shift_r mbedtls_mpi_shift_r\nmpi_shrink mbedtls_mpi_shrink\nmpi_size mbedtls_mpi_size\nmpi_sub_abs mbedtls_mpi_sub_abs\nmpi_sub_int mbedtls_mpi_sub_int\nmpi_sub_mpi mbedtls_mpi_sub_mpi\nmpi_swap mbedtls_mpi_swap\nmpi_write_binary mbedtls_mpi_write_binary\nmpi_write_file mbedtls_mpi_write_file\nmpi_write_string mbedtls_mpi_write_string\nnet_accept mbedtls_net_accept\nnet_bind mbedtls_net_bind\nnet_close mbedtls_net_free\nnet_connect mbedtls_net_connect\nnet_recv mbedtls_net_recv\nnet_recv_timeout mbedtls_net_recv_timeout\nnet_send mbedtls_net_send\nnet_set_block mbedtls_net_set_block\nnet_set_nonblock mbedtls_net_set_nonblock\nnet_usleep mbedtls_net_usleep\noid_descriptor_t mbedtls_oid_descriptor_t\noid_get_attr_short_name mbedtls_oid_get_attr_short_name\noid_get_cipher_alg mbedtls_oid_get_cipher_alg\noid_get_ec_grp mbedtls_oid_get_ec_grp\noid_get_extended_key_usage mbedtls_oid_get_extended_key_usage\noid_get_md_alg mbedtls_oid_get_md_alg\noid_get_numeric_string mbedtls_oid_get_numeric_string\noid_get_oid_by_ec_grp mbedtls_oid_get_oid_by_ec_grp\noid_get_oid_by_md mbedtls_oid_get_oid_by_md\noid_get_oid_by_pk_alg mbedtls_oid_get_oid_by_pk_alg\noid_get_oid_by_sig_alg mbedtls_oid_get_oid_by_sig_alg\noid_get_pk_alg mbedtls_oid_get_pk_alg\noid_get_pkcs12_pbe_alg mbedtls_oid_get_pkcs12_pbe_alg\noid_get_sig_alg mbedtls_oid_get_sig_alg\noid_get_sig_alg_desc mbedtls_oid_get_sig_alg_desc\noid_get_x509_ext_type mbedtls_oid_get_x509_ext_type\noperation_t mbedtls_operation_t\npadlock_supports mbedtls_padlock_has_support\npadlock_xcryptcbc mbedtls_padlock_xcryptcbc\npadlock_xcryptecb mbedtls_padlock_xcryptecb\npem_context mbedtls_pem_context\npem_free mbedtls_pem_free\npem_init mbedtls_pem_init\npem_read_buffer mbedtls_pem_read_buffer\npem_write_buffer mbedtls_pem_write_buffer\npk_can_do mbedtls_pk_can_do\npk_check_pair mbedtls_pk_check_pair\npk_context mbedtls_pk_context\npk_debug mbedtls_pk_debug\npk_debug_item mbedtls_pk_debug_item\npk_debug_type mbedtls_pk_debug_type\npk_decrypt mbedtls_pk_decrypt\npk_ec mbedtls_pk_ec\npk_encrypt mbedtls_pk_encrypt\npk_free mbedtls_pk_free\npk_get_len mbedtls_pk_get_len\npk_get_name mbedtls_pk_get_name\npk_get_size mbedtls_pk_get_bitlen\npk_get_type mbedtls_pk_get_type\npk_info_from_type mbedtls_pk_info_from_type\npk_info_t mbedtls_pk_info_t\npk_init mbedtls_pk_init\npk_init_ctx mbedtls_pk_setup\npk_init_ctx_rsa_alt mbedtls_pk_setup_rsa_alt\npk_load_file mbedtls_pk_load_file\npk_parse_key mbedtls_pk_parse_key\npk_parse_keyfile mbedtls_pk_parse_keyfile\npk_parse_public_key mbedtls_pk_parse_public_key\npk_parse_public_keyfile mbedtls_pk_parse_public_keyfile\npk_parse_subpubkey mbedtls_pk_parse_subpubkey\npk_rsa mbedtls_pk_rsa\npk_rsa_alt_decrypt_func mbedtls_pk_rsa_alt_decrypt_func\npk_rsa_alt_key_len_func mbedtls_pk_rsa_alt_key_len_func\npk_rsa_alt_sign_func mbedtls_pk_rsa_alt_sign_func\npk_rsassa_pss_options mbedtls_pk_rsassa_pss_options\npk_sign mbedtls_pk_sign\npk_type_t mbedtls_pk_type_t\npk_verify mbedtls_pk_verify\npk_verify_ext mbedtls_pk_verify_ext\npk_write_key_der mbedtls_pk_write_key_der\npk_write_key_pem mbedtls_pk_write_key_pem\npk_write_pubkey mbedtls_pk_write_pubkey\npk_write_pubkey_der mbedtls_pk_write_pubkey_der\npk_write_pubkey_pem mbedtls_pk_write_pubkey_pem\npkcs11_context mbedtls_pkcs11_context\npkcs11_decrypt mbedtls_pkcs11_decrypt\npkcs11_priv_key_free mbedtls_pkcs11_priv_key_free\npkcs11_priv_key_init mbedtls_pkcs11_priv_key_bind\npkcs11_sign mbedtls_pkcs11_sign\npkcs11_x509_cert_init mbedtls_pkcs11_x509_cert_bind\npkcs12_derivation mbedtls_pkcs12_derivation\npkcs12_pbe mbedtls_pkcs12_pbe\npkcs12_pbe_sha1_rc4_128 mbedtls_pkcs12_pbe_sha1_rc4_128\npkcs5_pbes2 mbedtls_pkcs5_pbes2\npkcs5_pbkdf2_hmac mbedtls_pkcs5_pbkdf2_hmac\npkcs5_self_test mbedtls_pkcs5_self_test\nplatform_entropy_poll mbedtls_platform_entropy_poll\nplatform_set_exit mbedtls_platform_set_exit\nplatform_set_fprintf mbedtls_platform_set_fprintf\nplatform_set_malloc_free mbedtls_platform_set_malloc_free\nplatform_set_printf mbedtls_platform_set_printf\nplatform_set_snprintf mbedtls_platform_set_snprintf\npolarssl_exit mbedtls_exit\npolarssl_fprintf mbedtls_fprintf\npolarssl_free mbedtls_free\npolarssl_malloc mbedtls_malloc\npolarssl_mutex_free mbedtls_mutex_free\npolarssl_mutex_init mbedtls_mutex_init\npolarssl_mutex_lock mbedtls_mutex_lock\npolarssl_mutex_unlock mbedtls_mutex_unlock\npolarssl_printf mbedtls_printf\npolarssl_snprintf mbedtls_snprintf\npolarssl_strerror mbedtls_strerror\nripemd160 mbedtls_ripemd160\nripemd160_context mbedtls_ripemd160_context\nripemd160_file mbedtls_ripemd160_file\nripemd160_finish mbedtls_ripemd160_finish\nripemd160_free mbedtls_ripemd160_free\nripemd160_hmac mbedtls_ripemd160_hmac\nripemd160_hmac_finish mbedtls_ripemd160_hmac_finish\nripemd160_hmac_reset mbedtls_ripemd160_hmac_reset\nripemd160_hmac_starts mbedtls_ripemd160_hmac_starts\nripemd160_hmac_update mbedtls_ripemd160_hmac_update\nripemd160_info mbedtls_ripemd160_info\nripemd160_init mbedtls_ripemd160_init\nripemd160_process mbedtls_ripemd160_process\nripemd160_self_test mbedtls_ripemd160_self_test\nripemd160_starts mbedtls_ripemd160_starts\nripemd160_update mbedtls_ripemd160_update\nrsa_alt_context mbedtls_rsa_alt_context\nrsa_alt_info mbedtls_rsa_alt_info\nrsa_check_privkey mbedtls_rsa_check_privkey\nrsa_check_pub_priv mbedtls_rsa_check_pub_priv\nrsa_check_pubkey mbedtls_rsa_check_pubkey\nrsa_context mbedtls_rsa_context\nrsa_copy mbedtls_rsa_copy\nrsa_decrypt_func mbedtls_rsa_decrypt_func\nrsa_free mbedtls_rsa_free\nrsa_gen_key mbedtls_rsa_gen_key\nrsa_info mbedtls_rsa_info\nrsa_init mbedtls_rsa_init\nrsa_key_len_func mbedtls_rsa_key_len_func\nrsa_pkcs1_decrypt mbedtls_rsa_pkcs1_decrypt\nrsa_pkcs1_encrypt mbedtls_rsa_pkcs1_encrypt\nrsa_pkcs1_sign mbedtls_rsa_pkcs1_sign\nrsa_pkcs1_verify mbedtls_rsa_pkcs1_verify\nrsa_private mbedtls_rsa_private\nrsa_public mbedtls_rsa_public\nrsa_rsaes_oaep_decrypt mbedtls_rsa_rsaes_oaep_decrypt\nrsa_rsaes_oaep_encrypt mbedtls_rsa_rsaes_oaep_encrypt\nrsa_rsaes_pkcs1_v15_decrypt mbedtls_rsa_rsaes_pkcs1_v15_decrypt\nrsa_rsaes_pkcs1_v15_encrypt mbedtls_rsa_rsaes_pkcs1_v15_encrypt\nrsa_rsassa_pkcs1_v15_sign mbedtls_rsa_rsassa_pkcs1_v15_sign\nrsa_rsassa_pkcs1_v15_verify mbedtls_rsa_rsassa_pkcs1_v15_verify\nrsa_rsassa_pss_sign mbedtls_rsa_rsassa_pss_sign\nrsa_rsassa_pss_verify mbedtls_rsa_rsassa_pss_verify\nrsa_rsassa_pss_verify_ext mbedtls_rsa_rsassa_pss_verify_ext\nrsa_self_test mbedtls_rsa_self_test\nrsa_set_padding mbedtls_rsa_set_padding\nrsa_sign_func mbedtls_rsa_sign_func\nsafer_memcmp mbedtls_ssl_safer_memcmp\nset_alarm mbedtls_set_alarm\nsha1 mbedtls_sha1\nsha1_context mbedtls_sha1_context\nsha1_file mbedtls_sha1_file\nsha1_finish mbedtls_sha1_finish\nsha1_free mbedtls_sha1_free\nsha1_hmac mbedtls_sha1_hmac\nsha1_hmac_finish mbedtls_sha1_hmac_finish\nsha1_hmac_reset mbedtls_sha1_hmac_reset\nsha1_hmac_starts mbedtls_sha1_hmac_starts\nsha1_hmac_update mbedtls_sha1_hmac_update\nsha1_info mbedtls_sha1_info\nsha1_init mbedtls_sha1_init\nsha1_process mbedtls_sha1_process\nsha1_self_test mbedtls_sha1_self_test\nsha1_starts mbedtls_sha1_starts\nsha1_update mbedtls_sha1_update\nsha224_info mbedtls_sha224_info\nsha256 mbedtls_sha256\nsha256_context mbedtls_sha256_context\nsha256_file mbedtls_sha256_file\nsha256_finish mbedtls_sha256_finish\nsha256_free mbedtls_sha256_free\nsha256_hmac mbedtls_sha256_hmac\nsha256_hmac_finish mbedtls_sha256_hmac_finish\nsha256_hmac_reset mbedtls_sha256_hmac_reset\nsha256_hmac_starts mbedtls_sha256_hmac_starts\nsha256_hmac_update mbedtls_sha256_hmac_update\nsha256_info mbedtls_sha256_info\nsha256_init mbedtls_sha256_init\nsha256_process mbedtls_sha256_process\nsha256_self_test mbedtls_sha256_self_test\nsha256_starts mbedtls_sha256_starts\nsha256_update mbedtls_sha256_update\nsha384_info mbedtls_sha384_info\nsha512 mbedtls_sha512\nsha512_context mbedtls_sha512_context\nsha512_file mbedtls_sha512_file\nsha512_finish mbedtls_sha512_finish\nsha512_free mbedtls_sha512_free\nsha512_hmac mbedtls_sha512_hmac\nsha512_hmac_finish mbedtls_sha512_hmac_finish\nsha512_hmac_reset mbedtls_sha512_hmac_reset\nsha512_hmac_starts mbedtls_sha512_hmac_starts\nsha512_hmac_update mbedtls_sha512_hmac_update\nsha512_info mbedtls_sha512_info\nsha512_init mbedtls_sha512_init\nsha512_process mbedtls_sha512_process\nsha512_self_test mbedtls_sha512_self_test\nsha512_starts mbedtls_sha512_starts\nsha512_update mbedtls_sha512_update\nsource_state mbedtls_entropy_source_state\nssl_cache_context mbedtls_ssl_cache_context\nssl_cache_entry mbedtls_ssl_cache_entry\nssl_cache_free mbedtls_ssl_cache_free\nssl_cache_get mbedtls_ssl_cache_get\nssl_cache_init mbedtls_ssl_cache_init\nssl_cache_set mbedtls_ssl_cache_set\nssl_cache_set_max_entries mbedtls_ssl_cache_set_max_entries\nssl_cache_set_timeout mbedtls_ssl_cache_set_timeout\nssl_check_cert_usage mbedtls_ssl_check_cert_usage\nssl_ciphersuite_from_id mbedtls_ssl_ciphersuite_from_id\nssl_ciphersuite_from_string mbedtls_ssl_ciphersuite_from_string\nssl_ciphersuite_t mbedtls_ssl_ciphersuite_t\nssl_ciphersuite_uses_ec mbedtls_ssl_ciphersuite_uses_ec\nssl_ciphersuite_uses_psk mbedtls_ssl_ciphersuite_uses_psk\nssl_close_notify mbedtls_ssl_close_notify\nssl_context mbedtls_ssl_context\nssl_cookie_check mbedtls_ssl_cookie_check\nssl_cookie_check_t mbedtls_ssl_cookie_check_t\nssl_cookie_ctx mbedtls_ssl_cookie_ctx\nssl_cookie_free mbedtls_ssl_cookie_free\nssl_cookie_init mbedtls_ssl_cookie_init\nssl_cookie_set_timeout mbedtls_ssl_cookie_set_timeout\nssl_cookie_setup mbedtls_ssl_cookie_setup\nssl_cookie_write mbedtls_ssl_cookie_write\nssl_cookie_write_t mbedtls_ssl_cookie_write_t\nssl_curve_is_acceptable mbedtls_ssl_curve_is_acceptable\nssl_derive_keys mbedtls_ssl_derive_keys\nssl_dtls_replay_check mbedtls_ssl_dtls_replay_check\nssl_dtls_replay_update mbedtls_ssl_dtls_replay_update\nssl_fetch_input mbedtls_ssl_fetch_input\nssl_flight_item mbedtls_ssl_flight_item\nssl_flush_output mbedtls_ssl_flush_output\nssl_free mbedtls_ssl_free\nssl_get_alpn_protocol mbedtls_ssl_get_alpn_protocol\nssl_get_bytes_avail mbedtls_ssl_get_bytes_avail\nssl_get_ciphersuite mbedtls_ssl_get_ciphersuite\nssl_get_ciphersuite_id mbedtls_ssl_get_ciphersuite_id\nssl_get_ciphersuite_name mbedtls_ssl_get_ciphersuite_name\nssl_get_ciphersuite_sig_pk_alg mbedtls_ssl_get_ciphersuite_sig_pk_alg\nssl_get_peer_cert mbedtls_ssl_get_peer_cert\nssl_get_record_expansion mbedtls_ssl_get_record_expansion\nssl_get_session mbedtls_ssl_get_session\nssl_get_verify_result mbedtls_ssl_get_verify_result\nssl_get_version mbedtls_ssl_get_version\nssl_handshake mbedtls_ssl_handshake\nssl_handshake_client_step mbedtls_ssl_handshake_client_step\nssl_handshake_free mbedtls_ssl_handshake_free\nssl_handshake_params mbedtls_ssl_handshake_params\nssl_handshake_server_step mbedtls_ssl_handshake_server_step\nssl_handshake_step mbedtls_ssl_handshake_step\nssl_handshake_wrapup mbedtls_ssl_handshake_wrapup\nssl_hdr_len mbedtls_ssl_hdr_len\nssl_hs_hdr_len mbedtls_ssl_hs_hdr_len\nssl_hw_record_activate mbedtls_ssl_hw_record_activate\nssl_hw_record_finish mbedtls_ssl_hw_record_finish\nssl_hw_record_init mbedtls_ssl_hw_record_init\nssl_hw_record_read mbedtls_ssl_hw_record_read\nssl_hw_record_reset mbedtls_ssl_hw_record_reset\nssl_hw_record_write mbedtls_ssl_hw_record_write\nssl_init mbedtls_ssl_init\nssl_key_cert mbedtls_ssl_key_cert\nssl_legacy_renegotiation mbedtls_ssl_conf_legacy_renegotiation\nssl_list_ciphersuites mbedtls_ssl_list_ciphersuites\nssl_md_alg_from_hash mbedtls_ssl_md_alg_from_hash\nssl_optimize_checksum mbedtls_ssl_optimize_checksum\nssl_own_cert mbedtls_ssl_own_cert\nssl_own_key mbedtls_ssl_own_key\nssl_parse_certificate mbedtls_ssl_parse_certificate\nssl_parse_change_cipher_spec mbedtls_ssl_parse_change_cipher_spec\nssl_parse_finished mbedtls_ssl_parse_finished\nssl_pk_alg_from_sig mbedtls_ssl_pk_alg_from_sig\nssl_pkcs11_decrypt mbedtls_ssl_pkcs11_decrypt\nssl_pkcs11_key_len mbedtls_ssl_pkcs11_key_len\nssl_pkcs11_sign mbedtls_ssl_pkcs11_sign\nssl_psk_derive_premaster mbedtls_ssl_psk_derive_premaster\nssl_read mbedtls_ssl_read\nssl_read_record mbedtls_ssl_read_record\nssl_read_version mbedtls_ssl_read_version\nssl_recv_flight_completed mbedtls_ssl_recv_flight_completed\nssl_renegotiate mbedtls_ssl_renegotiate\nssl_resend mbedtls_ssl_resend\nssl_reset_checksum mbedtls_ssl_reset_checksum\nssl_send_alert_message mbedtls_ssl_send_alert_message\nssl_send_fatal_handshake_failure mbedtls_ssl_send_fatal_handshake_failure\nssl_send_flight_completed mbedtls_ssl_send_flight_completed\nssl_session mbedtls_ssl_session\nssl_session_free mbedtls_ssl_session_free\nssl_session_init mbedtls_ssl_session_init\nssl_session_reset mbedtls_ssl_session_reset\nssl_set_alpn_protocols mbedtls_ssl_conf_alpn_protocols\nssl_set_arc4_support mbedtls_ssl_conf_arc4_support\nssl_set_authmode mbedtls_ssl_conf_authmode\nssl_set_bio mbedtls_ssl_set_bio\nssl_set_ca_chain mbedtls_ssl_conf_ca_chain\nssl_set_cbc_record_splitting mbedtls_ssl_conf_cbc_record_splitting\nssl_set_ciphersuites mbedtls_ssl_conf_ciphersuites\nssl_set_ciphersuites_for_version mbedtls_ssl_conf_ciphersuites_for_version\nssl_set_client_transport_id mbedtls_ssl_set_client_transport_id\nssl_set_curves mbedtls_ssl_conf_curves\nssl_set_dbg mbedtls_ssl_conf_dbg\nssl_set_dh_param mbedtls_ssl_conf_dh_param\nssl_set_dh_param_ctx mbedtls_ssl_conf_dh_param_ctx\nssl_set_dtls_anti_replay mbedtls_ssl_conf_dtls_anti_replay\nssl_set_dtls_badmac_limit mbedtls_ssl_conf_dtls_badmac_limit\nssl_set_dtls_cookies mbedtls_ssl_conf_dtls_cookies\nssl_set_encrypt_then_mac mbedtls_ssl_conf_encrypt_then_mac\nssl_set_endpoint mbedtls_ssl_conf_endpoint\nssl_set_extended_master_secret mbedtls_ssl_conf_extended_master_secret\nssl_set_fallback mbedtls_ssl_conf_fallback\nssl_set_handshake_timeout mbedtls_ssl_conf_handshake_timeout\nssl_set_hostname mbedtls_ssl_set_hostname\nssl_set_max_frag_len mbedtls_ssl_conf_max_frag_len\nssl_set_max_version mbedtls_ssl_conf_max_version\nssl_set_min_version mbedtls_ssl_conf_min_version\nssl_set_own_cert mbedtls_ssl_conf_own_cert\nssl_set_own_cert_alt mbedtls_ssl_set_own_cert_alt\nssl_set_own_cert_rsa mbedtls_ssl_set_own_cert_rsa\nssl_set_psk mbedtls_ssl_conf_psk\nssl_set_psk_cb mbedtls_ssl_conf_psk_cb\nssl_set_renegotiation mbedtls_ssl_conf_renegotiation\nssl_set_renegotiation_enforced mbedtls_ssl_conf_renegotiation_enforced\nssl_set_renegotiation_period mbedtls_ssl_conf_renegotiation_period\nssl_set_rng mbedtls_ssl_conf_rng\nssl_set_session mbedtls_ssl_set_session\nssl_set_session_cache mbedtls_ssl_conf_session_cache\nssl_set_session_ticket_lifetime mbedtls_ssl_conf_session_ticket_lifetime\nssl_set_session_tickets mbedtls_ssl_conf_session_tickets\nssl_set_sni mbedtls_ssl_conf_sni\nssl_set_transport mbedtls_ssl_conf_transport\nssl_set_truncated_hmac mbedtls_ssl_conf_truncated_hmac\nssl_set_verify mbedtls_ssl_conf_verify\nssl_sig_from_pk mbedtls_ssl_sig_from_pk\nssl_states mbedtls_ssl_states\nssl_ticket_keys mbedtls_ssl_ticket_keys\nssl_transform mbedtls_ssl_transform\nssl_transform_free mbedtls_ssl_transform_free\nssl_write mbedtls_ssl_write\nssl_write_certificate mbedtls_ssl_write_certificate\nssl_write_change_cipher_spec mbedtls_ssl_write_change_cipher_spec\nssl_write_finished mbedtls_ssl_write_finished\nssl_write_record mbedtls_ssl_write_record\nssl_write_version mbedtls_ssl_write_version\nsupported_ciphers mbedtls_cipher_supported\nt_sint mbedtls_mpi_sint\nt_udbl mbedtls_t_udbl\nt_uint mbedtls_mpi_uint\ntest_ca_crt mbedtls_test_ca_crt\ntest_ca_crt_ec mbedtls_test_ca_crt_ec\ntest_ca_crt_rsa mbedtls_test_ca_crt_rsa\ntest_ca_key mbedtls_test_ca_key\ntest_ca_key_ec mbedtls_test_ca_key_ec\ntest_ca_key_rsa mbedtls_test_ca_key_rsa\ntest_ca_list mbedtls_test_cas_pem\ntest_ca_pwd mbedtls_test_ca_pwd\ntest_ca_pwd_ec mbedtls_test_ca_pwd_ec\ntest_ca_pwd_rsa mbedtls_test_ca_pwd_rsa\ntest_cli_crt mbedtls_test_cli_crt\ntest_cli_crt_ec mbedtls_test_cli_crt_ec\ntest_cli_crt_rsa mbedtls_test_cli_crt_rsa\ntest_cli_key mbedtls_test_cli_key\ntest_cli_key_ec mbedtls_test_cli_key_ec\ntest_cli_key_rsa mbedtls_test_cli_key_rsa\ntest_dhm_params mbedtls_test_dhm_params\ntest_srv_crt mbedtls_test_srv_crt\ntest_srv_crt_ec mbedtls_test_srv_crt_ec\ntest_srv_crt_rsa mbedtls_test_srv_crt_rsa\ntest_srv_key mbedtls_test_srv_key\ntest_srv_key_ec mbedtls_test_srv_key_ec\ntest_srv_key_rsa mbedtls_test_srv_key_rsa\nthreading_mutex_t mbedtls_threading_mutex_t\nthreading_set_alt mbedtls_threading_set_alt\ntiming_self_test mbedtls_timing_self_test\nversion_check_feature mbedtls_version_check_feature\nversion_get_number mbedtls_version_get_number\nversion_get_string mbedtls_version_get_string\nversion_get_string_full mbedtls_version_get_string_full\nx509_bitstring mbedtls_x509_bitstring\nx509_buf mbedtls_x509_buf\nx509_crl mbedtls_x509_crl\nx509_crl_entry mbedtls_x509_crl_entry\nx509_crl_free mbedtls_x509_crl_free\nx509_crl_info mbedtls_x509_crl_info\nx509_crl_init mbedtls_x509_crl_init\nx509_crl_parse mbedtls_x509_crl_parse\nx509_crl_parse_der mbedtls_x509_crl_parse_der\nx509_crl_parse_file mbedtls_x509_crl_parse_file\nx509_crt mbedtls_x509_crt\nx509_crt_check_extended_key_usage mbedtls_x509_crt_check_extended_key_usage\nx509_crt_check_key_usage mbedtls_x509_crt_check_key_usage\nx509_crt_free mbedtls_x509_crt_free\nx509_crt_info mbedtls_x509_crt_info\nx509_crt_init mbedtls_x509_crt_init\nx509_crt_parse mbedtls_x509_crt_parse\nx509_crt_parse_der mbedtls_x509_crt_parse_der\nx509_crt_parse_file mbedtls_x509_crt_parse_file\nx509_crt_parse_path mbedtls_x509_crt_parse_path\nx509_crt_revoked mbedtls_x509_crt_is_revoked\nx509_crt_verify mbedtls_x509_crt_verify\nx509_crt_verify_info mbedtls_x509_crt_verify_info\nx509_csr mbedtls_x509_csr\nx509_csr_free mbedtls_x509_csr_free\nx509_csr_info mbedtls_x509_csr_info\nx509_csr_init mbedtls_x509_csr_init\nx509_csr_parse mbedtls_x509_csr_parse\nx509_csr_parse_der mbedtls_x509_csr_parse_der\nx509_csr_parse_file mbedtls_x509_csr_parse_file\nx509_dn_gets mbedtls_x509_dn_gets\nx509_get_alg mbedtls_x509_get_alg\nx509_get_alg_null mbedtls_x509_get_alg_null\nx509_get_ext mbedtls_x509_get_ext\nx509_get_name mbedtls_x509_get_name\nx509_get_rsassa_pss_params mbedtls_x509_get_rsassa_pss_params\nx509_get_serial mbedtls_x509_get_serial\nx509_get_sig mbedtls_x509_get_sig\nx509_get_sig_alg mbedtls_x509_get_sig_alg\nx509_get_time mbedtls_x509_get_time\nx509_key_size_helper mbedtls_x509_key_size_helper\nx509_name mbedtls_x509_name\nx509_oid_get_description mbedtls_x509_oid_get_description\nx509_oid_get_numeric_string mbedtls_x509_oid_get_numeric_string\nx509_self_test mbedtls_x509_self_test\nx509_sequence mbedtls_x509_sequence\nx509_serial_gets mbedtls_x509_serial_gets\nx509_set_extension mbedtls_x509_set_extension\nx509_sig_alg_gets mbedtls_x509_sig_alg_gets\nx509_string_to_names mbedtls_x509_string_to_names\nx509_time mbedtls_x509_time\nx509_time_expired mbedtls_x509_time_is_past\nx509_time_future mbedtls_x509_time_is_future\nx509_write_extensions mbedtls_x509_write_extensions\nx509_write_names mbedtls_x509_write_names\nx509_write_sig mbedtls_x509_write_sig\nx509write_cert mbedtls_x509write_cert\nx509write_crt_der mbedtls_x509write_crt_der\nx509write_crt_free mbedtls_x509write_crt_free\nx509write_crt_init mbedtls_x509write_crt_init\nx509write_crt_pem mbedtls_x509write_crt_pem\nx509write_crt_set_authority_key_identifier mbedtls_x509write_crt_set_authority_key_identifier\nx509write_crt_set_basic_constraints mbedtls_x509write_crt_set_basic_constraints\nx509write_crt_set_extension mbedtls_x509write_crt_set_extension\nx509write_crt_set_issuer_key mbedtls_x509write_crt_set_issuer_key\nx509write_crt_set_issuer_name mbedtls_x509write_crt_set_issuer_name\nx509write_crt_set_key_usage mbedtls_x509write_crt_set_key_usage\nx509write_crt_set_md_alg mbedtls_x509write_crt_set_md_alg\nx509write_crt_set_ns_cert_type mbedtls_x509write_crt_set_ns_cert_type\nx509write_crt_set_serial mbedtls_x509write_crt_set_serial\nx509write_crt_set_subject_key mbedtls_x509write_crt_set_subject_key\nx509write_crt_set_subject_key_identifier mbedtls_x509write_crt_set_subject_key_identifier\nx509write_crt_set_subject_name mbedtls_x509write_crt_set_subject_name\nx509write_crt_set_validity mbedtls_x509write_crt_set_validity\nx509write_crt_set_version mbedtls_x509write_crt_set_version\nx509write_csr mbedtls_x509write_csr\nx509write_csr_der mbedtls_x509write_csr_der\nx509write_csr_free mbedtls_x509write_csr_free\nx509write_csr_init mbedtls_x509write_csr_init\nx509write_csr_pem mbedtls_x509write_csr_pem\nx509write_csr_set_extension mbedtls_x509write_csr_set_extension\nx509write_csr_set_key mbedtls_x509write_csr_set_key\nx509write_csr_set_key_usage mbedtls_x509write_csr_set_key_usage\nx509write_csr_set_md_alg mbedtls_x509write_csr_set_md_alg\nx509write_csr_set_ns_cert_type mbedtls_x509write_csr_set_ns_cert_type\nx509write_csr_set_subject_name mbedtls_x509write_csr_set_subject_name\nxtea_context mbedtls_xtea_context\nxtea_crypt_cbc mbedtls_xtea_crypt_cbc\nxtea_crypt_ecb mbedtls_xtea_crypt_ecb\nxtea_free mbedtls_xtea_free\nxtea_init mbedtls_xtea_init\nxtea_self_test mbedtls_xtea_self_test\nxtea_setup mbedtls_xtea_setup\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/data_files/version_features.fmt",
    "content": "/*\n *  Version feature information\n *\n *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved\n *  SPDX-License-Identifier: Apache-2.0\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n *  not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  This file is part of mbed TLS (https://tls.mbed.org)\n */\n\n#if !defined(MBEDTLS_CONFIG_FILE)\n#include \"mbedtls/config.h\"\n#else\n#include MBEDTLS_CONFIG_FILE\n#endif\n\n#if defined(MBEDTLS_VERSION_C)\n\n#include \"mbedtls/version.h\"\n\n#include <string.h>\n\nstatic const char *features[] = {\n#if defined(MBEDTLS_VERSION_FEATURES)\nFEATURE_DEFINES\n#endif /* MBEDTLS_VERSION_FEATURES */\n    NULL\n};\n\nint mbedtls_version_check_feature( const char *feature )\n{\n    const char **idx = features;\n\n    if( *idx == NULL )\n        return( -2 );\n\n    if( feature == NULL )\n        return( -1 );\n\n    while( *idx != NULL )\n    {\n        if( !strcmp( *idx, feature ) )\n            return( 0 );\n        idx++;\n    }\n    return( -1 );\n}\n\n#endif /* MBEDTLS_VERSION_C */\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/data_files/vs2010-app-template.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"..\\..\\programs\\<PATHNAME>.c\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"mbedTLS.vcxproj\">\n      <Project>{46cf2d25-6a36-4189-b59c-e4815388e554}</Project>\n    </ProjectReference>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid><GUID></ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace><APPNAME></RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>Application</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>Windows7.1SDK</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <IntDir>$(Configuration)\\$(TargetName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <IntDir>$(Configuration)\\$(TargetName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IntDir>$(Configuration)\\$(TargetName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IntDir>$(Configuration)\\$(TargetName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ShowProgress>NotSet</ShowProgress>\n      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);mbedTLS.lib</AdditionalDependencies>\n      <AdditionalLibraryDirectories>Debug</AdditionalLibraryDirectories>\n    </Link>\n    <ProjectReference>\n      <LinkLibraryDependencies>false</LinkLibraryDependencies>\n    </ProjectReference>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <ShowProgress>NotSet</ShowProgress>\n      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);mbedTLS.lib</AdditionalDependencies>\n      <AdditionalLibraryDirectories>Debug</AdditionalLibraryDirectories>\n    </Link>\n    <ProjectReference>\n      <LinkLibraryDependencies>false</LinkLibraryDependencies>\n    </ProjectReference>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalLibraryDirectories>Release</AdditionalLibraryDirectories>\n      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies);mbedTLS.lib</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n      <AdditionalLibraryDirectories>Release</AdditionalLibraryDirectories>\n      <AdditionalDependencies>%(AdditionalDependencies);</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/data_files/vs2010-main-template.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{46CF2D25-6A36-4189-B59C-E4815388E554}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>mbedTLS</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>Unicode</CharacterSet>\n    <PlatformToolset>Windows7.1SDK</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <IntDir>$(Configuration)\\$(TargetName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <IntDir>$(Configuration)\\$(TargetName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IntDir>$(Configuration)\\$(TargetName)\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <IntDir>$(Configuration)\\$(TargetName)\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;MBEDTLS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>\n      <CompileAs>CompileAsC</CompileAs>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;MBEDTLS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>\n      <CompileAs>CompileAsC</CompileAs>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;MBEDTLS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_USRDLL;MBEDTLS_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <AdditionalIncludeDirectories>../../include</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Windows</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\nHEADER_ENTRIES\n  </ItemGroup>\n  <ItemGroup>\nSOURCE_ENTRIES\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/data_files/vs2010-sln-template.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 11.00\n# Visual C++ Express 2010\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"mbedTLS\", \"mbedTLS.vcxproj\", \"{46CF2D25-6A36-4189-B59C-E4815388E554}\"\nEndProject\nAPP_ENTRIES\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{46CF2D25-6A36-4189-B59C-E4815388E554}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{46CF2D25-6A36-4189-B59C-E4815388E554}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{46CF2D25-6A36-4189-B59C-E4815388E554}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{46CF2D25-6A36-4189-B59C-E4815388E554}.Debug|x64.Build.0 = Debug|x64\n\t\t{46CF2D25-6A36-4189-B59C-E4815388E554}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{46CF2D25-6A36-4189-B59C-E4815388E554}.Release|Win32.Build.0 = Release|Win32\n\t\t{46CF2D25-6A36-4189-B59C-E4815388E554}.Release|x64.ActiveCfg = Release|x64\n\t\t{46CF2D25-6A36-4189-B59C-E4815388E554}.Release|x64.Build.0 = Release|x64\nCONF_ENTRIES\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/data_files/vs6-app-template.dsp",
    "content": "# Microsoft Developer Studio Project File - Name=\"<APPNAME>\" - Package Owner=<4>\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\n# ** DO NOT EDIT **\n\n# TARGTYPE \"Win32 (x86) Console Application\" 0x0103\n\nCFG=<APPNAME> - Win32 Debug\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n!MESSAGE use the Export Makefile command and run\n!MESSAGE \n!MESSAGE NMAKE /f \"<APPNAME>.mak\".\n!MESSAGE \n!MESSAGE You can specify a configuration when running NMAKE\n!MESSAGE by defining the macro CFG on the command line. For example:\n!MESSAGE \n!MESSAGE NMAKE /f \"<APPNAME>.mak\" CFG=\"<APPNAME> - Win32 Debug\"\n!MESSAGE \n!MESSAGE Possible choices for configuration are:\n!MESSAGE \n!MESSAGE \"<APPNAME> - Win32 Release\" (based on \"Win32 (x86) Console Application\")\n!MESSAGE \"<APPNAME> - Win32 Debug\" (based on \"Win32 (x86) Console Application\")\n!MESSAGE \n\n# Begin Project\n# PROP AllowPerConfigDependencies 0\n# PROP Scc_ProjName \"\"\n# PROP Scc_LocalPath \"\"\nCPP=cl.exe\nRSC=rc.exe\n\n!IF  \"$(CFG)\" == \"<APPNAME> - Win32 Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"\"\n# PROP BASE Intermediate_Dir \"temp\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"\"\n# PROP Intermediate_Dir \"temp\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /c\n# ADD CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /c\n# ADD BASE RSC /l 0x40c /d \"NDEBUG\"\n# ADD RSC /l 0x40c /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386\n\n!ELSEIF  \"$(CFG)\" == \"<APPNAME> - Win32 Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"\"\n# PROP BASE Intermediate_Dir \"temp\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"\"\n# PROP Intermediate_Dir \"temp\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /Gm /GX /Z7 /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /GZ  /c\n# ADD CPP /nologo /W3 /Gm /GX /Z7 /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_CONSOLE\" /D \"_MBCS\" /YX /FD /GZ  /c\n# ADD BASE RSC /l 0x40c /d \"_DEBUG\"\n# ADD RSC /l 0x40c /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLINK32=link.exe\n# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\n# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib  kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept\n\n!ENDIF \n\n# Begin Target\n\n# Name \"<APPNAME> - Win32 Release\"\n# Name \"<APPNAME> - Win32 Debug\"\n# Begin Group \"Source Files\"\n\n# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\n# Begin Source File\n\nSOURCE=..\\..\\programs\\<PATHNAME>.c\n# ADD CPP /I \"../../include\"\n# End Source File\n# End Group\n# Begin Group \"Header Files\"\n\n# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\n# End Group\n# Begin Group \"Resource Files\"\n\n# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe\"\n# End Group\n# End Target\n# End Project\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/data_files/vs6-main-template.dsp",
    "content": "# Microsoft Developer Studio Project File - Name=\"mbedtls\" - Package Owner=<4>\n# Microsoft Developer Studio Generated Build File, Format Version 6.00\n# ** DO NOT EDIT **\n\n# TARGTYPE \"Win32 (x86) Static Library\" 0x0104\n\nCFG=mbedtls - Win32 Debug\n!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n!MESSAGE use the Export Makefile command and run\n!MESSAGE \n!MESSAGE NMAKE /f \"mbedtls.mak\".\n!MESSAGE \n!MESSAGE You can specify a configuration when running NMAKE\n!MESSAGE by defining the macro CFG on the command line. For example:\n!MESSAGE \n!MESSAGE NMAKE /f \"mbedtls.mak\" CFG=\"mbedtls - Win32 Debug\"\n!MESSAGE \n!MESSAGE Possible choices for configuration are:\n!MESSAGE \n!MESSAGE \"mbedtls - Win32 Release\" (based on \"Win32 (x86) Static Library\")\n!MESSAGE \"mbedtls - Win32 Debug\" (based on \"Win32 (x86) Static Library\")\n!MESSAGE \n\n# Begin Project\n# PROP AllowPerConfigDependencies 0\n# PROP Scc_ProjName \"\"\n# PROP Scc_LocalPath \"\"\nCPP=cl.exe\nRSC=rc.exe\n\n!IF  \"$(CFG)\" == \"mbedtls - Win32 Release\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 0\n# PROP BASE Output_Dir \"\"\n# PROP BASE Intermediate_Dir \"temp\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 0\n# PROP Output_Dir \"\"\n# PROP Intermediate_Dir \"temp\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /O2 /D \"WIN32\" /D \"NDEBUG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD CPP /nologo /W3 /GX /O2 /I \"../../include\" /D \"NDEBUG\" /D \"WIN32\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /c\n# ADD BASE RSC /l 0x40c /d \"NDEBUG\"\n# ADD RSC /l 0x40c /d \"NDEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLIB32=link.exe -lib\n# ADD BASE LIB32 /nologo\n# ADD LIB32 /nologo\n\n!ELSEIF  \"$(CFG)\" == \"mbedtls - Win32 Debug\"\n\n# PROP BASE Use_MFC 0\n# PROP BASE Use_Debug_Libraries 1\n# PROP BASE Output_Dir \"\"\n# PROP BASE Intermediate_Dir \"temp\"\n# PROP BASE Target_Dir \"\"\n# PROP Use_MFC 0\n# PROP Use_Debug_Libraries 1\n# PROP Output_Dir \"\"\n# PROP Intermediate_Dir \"temp\"\n# PROP Target_Dir \"\"\n# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D \"WIN32\" /D \"_DEBUG\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\n# ADD CPP /nologo /W3 /GX /Z7 /Od /I \"../../include\" /D \"_DEBUG\" /D \"WIN32\" /D \"_MBCS\" /D \"_LIB\" /YX /FD /GZ /c\n# ADD BASE RSC /l 0x40c /d \"_DEBUG\"\n# ADD RSC /l 0x40c /d \"_DEBUG\"\nBSC32=bscmake.exe\n# ADD BASE BSC32 /nologo\n# ADD BSC32 /nologo\nLIB32=link.exe -lib\n# ADD BASE LIB32 /nologo\n# ADD LIB32 /nologo\n\n!ENDIF\n\n# Begin Target\n\n# Name \"mbedtls - Win32 Release\"\n# Name \"mbedtls - Win32 Debug\"\n# Begin Group \"Source Files\"\n\n# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;idl;hpj;bat\"\nSOURCE_ENTRIES\n# End Group\n# Begin Group \"Header Files\"\n\n# PROP Default_Filter \"h;hpp;hxx;hm;inl\"\nHEADER_ENTRIES\n# End Group\n# End Target\n# End Project\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/data_files/vs6-workspace-template.dsw",
    "content": "Microsoft Developer Studio Workspace File, Format Version 6.00\n# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\n\nAPP_ENTRIES\n###############################################################################\n\nGlobal:\n\nPackage=<5>\n{{{\n}}}\n\nPackage=<3>\n{{{\n}}}\n\n###############################################################################\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/ecc-heap.sh",
    "content": "#!/bin/sh\n\n# Measure heap usage (and performance) of ECC operations with various values of\n# the relevant tunable compile-time parameters.\n#\n# Usage (preferably on a 32-bit platform):\n# cmake -D CMAKE_BUILD_TYPE=Release .\n# scripts/ecc-heap.sh | tee ecc-heap.log\n\nset -eu\n\nCONFIG_H='include/mbedtls/config.h'\n\nif [ -r $CONFIG_H ]; then :; else\n    echo \"$CONFIG_H not found\" >&2\n    exit 1\nfi\n\nif grep -i cmake Makefile >/dev/null; then :; else\n    echo \"Needs Cmake\" >&2\n    exit 1\nfi\n\nif git status | grep -F $CONFIG_H >/dev/null 2>&1; then\n    echo \"config.h not clean\" >&2\n    exit 1\nfi\n\nCONFIG_BAK=${CONFIG_H}.bak\ncp $CONFIG_H $CONFIG_BAK\n\ncat << EOF >$CONFIG_H\n#define MBEDTLS_PLATFORM_C\n#define MBEDTLS_PLATFORM_MEMORY\n#define MBEDTLS_MEMORY_BUFFER_ALLOC_C\n#define MBEDTLS_MEMORY_DEBUG\n\n#define MBEDTLS_TIMING_C\n\n#define MBEDTLS_BIGNUM_C\n#define MBEDTLS_ECP_C\n#define MBEDTLS_ASN1_PARSE_C\n#define MBEDTLS_ASN1_WRITE_C\n#define MBEDTLS_ECDSA_C\n#define MBEDTLS_ECDH_C\n\n#define MBEDTLS_ECP_DP_SECP192R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP224R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP256R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP384R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP521R1_ENABLED\n#define MBEDTLS_ECP_DP_CURVE25519_ENABLED\n\n#include \"check_config.h\"\n\n//#define MBEDTLS_ECP_WINDOW_SIZE            6\n//#define MBEDTLS_ECP_FIXED_POINT_OPTIM      1\nEOF\n\nfor F in 0 1; do\n    for W in 2 3 4 5 6; do\n        scripts/config.pl set MBEDTLS_ECP_WINDOW_SIZE $W\n        scripts/config.pl set MBEDTLS_ECP_FIXED_POINT_OPTIM $F\n        make benchmark >/dev/null 2>&1\n        echo \"fixed point optim = $F, max window size = $W\"\n        echo \"--------------------------------------------\"\n        programs/test/benchmark\n    done\ndone\n\n# cleanup\n\nmv $CONFIG_BAK $CONFIG_H\nmake clean\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/find-mem-leak.cocci",
    "content": "@@\nexpression x, y;\nstatement S;\n@@\n  x = mbedtls_malloc(...);\n  y = mbedtls_malloc(...);\n  ...\n* if (x == NULL || y == NULL)\n    S\n\n@@\nexpression x, y;\nstatement S;\n@@\n  if (\n*   (x = mbedtls_malloc(...)) == NULL\n    ||\n*   (y = mbedtls_malloc(...)) == NULL\n  )\n    S\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/footprint.sh",
    "content": "#!/bin/sh\n#\n# This file is part of mbed TLS (https://tls.mbed.org)\n#\n# Copyright (c) 2015-2016, ARM Limited, All Rights Reserved\n#\n# Purpose\n#\n# This script determines ROM size (or code size) for the standard mbed TLS\n# configurations, when built for a Cortex M3/M4 target.\n#\n# Configurations included:\n#   default    include/mbedtls/config.h\n#   yotta      yotta/module/mbedtls/config.h\n#   thread     configs/config-thread.h\n#   suite-b    configs/config-suite-b.h\n#   psk        configs/config-ccm-psk-tls1_2.h\n#\n# Usage: footprint.sh\n#\nset -eu\n\nCONFIG_H='include/mbedtls/config.h'\n\nif [ -r $CONFIG_H ]; then :; else\n    echo \"$CONFIG_H not found\" >&2\n    echo \"This script needs to be run from the root of\" >&2\n    echo \"a git checkout or uncompressed tarball\" >&2\n    exit 1\nfi\n\nif grep -i cmake Makefile >/dev/null; then\n    echo \"Not compatible with CMake\" >&2\n    exit 1\nfi\n\nif which arm-none-eabi-gcc >/dev/null 2>&1; then :; else\n    echo \"You need the ARM-GCC toolchain in your path\" >&2\n    echo \"See https://launchpad.net/gcc-arm-embedded/\" >&2\n    exit 1\nfi\n\nARMGCC_FLAGS='-Os -march=armv7-m -mthumb'\nOUTFILE='00-footprint-summary.txt'\n\nlog()\n{\n    echo \"$@\"\n    echo \"$@\" >> \"$OUTFILE\"\n}\n\ndoit()\n{\n    NAME=\"$1\"\n    FILE=\"$2\"\n\n    log \"\"\n    log \"$NAME ($FILE):\"\n\n    cp $CONFIG_H ${CONFIG_H}.bak\n    if [ \"$FILE\" != $CONFIG_H ]; then\n        cp \"$FILE\"  $CONFIG_H\n    fi\n\n    {\n        scripts/config.pl unset MBEDTLS_NET_C || true\n        scripts/config.pl unset MBEDTLS_TIMING_C || true\n        scripts/config.pl unset MBEDTLS_FS_IO || true\n        scripts/config.pl --force set MBEDTLS_NO_PLATFORM_ENTROPY || true\n    } >/dev/null 2>&1\n\n    make clean >/dev/null\n    CC=arm-none-eabi-gcc AR=arm-none-eabi-ar LD=arm-none-eabi-ld \\\n        CFLAGS=\"$ARMGCC_FLAGS\" make lib >/dev/null\n\n    OUT=\"size-${NAME}.txt\"\n    arm-none-eabi-size -t library/libmbed*.a > \"$OUT\"\n    log \"$( head -n1 \"$OUT\" )\"\n    log \"$( tail -n1 \"$OUT\" )\"\n\n    cp ${CONFIG_H}.bak $CONFIG_H\n}\n\n# truncate the file just this time\necho \"(generated by $0)\" > \"$OUTFILE\"\necho \"\" >> \"$OUTFILE\"\n\nlog \"Footprint of standard configurations (minus net_sockets.c, timing.c, fs_io)\"\nlog \"for bare-metal ARM Cortex-M3/M4 microcontrollers.\"\n\nVERSION_H=\"include/mbedtls/version.h\"\nMBEDTLS_VERSION=$( sed -n 's/.*VERSION_STRING *\"\\(.*\\)\"/\\1/p' $VERSION_H )\nif git rev-parse HEAD >/dev/null; then\n    GIT_HEAD=$( git rev-parse HEAD | head -c 10 )\n    GIT_VERSION=\" (git head: $GIT_HEAD)\"\nelse\n    GIT_VERSION=\"\"\nfi\n\nlog \"\"\nlog \"mbed TLS $MBEDTLS_VERSION$GIT_VERSION\"\nlog \"$( arm-none-eabi-gcc --version | head -n1 )\"\nlog \"CFLAGS=$ARMGCC_FLAGS\"\n\n# creates the yotta config\nyotta/create-module.sh >/dev/null\n\ndoit default    include/mbedtls/config.h\ndoit yotta      yotta/module/mbedtls/config.h\ndoit thread     configs/config-thread.h\ndoit suite-b    configs/config-suite-b.h\ndoit psk        configs/config-ccm-psk-tls1_2.h\n\nzip mbedtls-footprint.zip \"$OUTFILE\" size-*.txt >/dev/null\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/generate_errors.pl",
    "content": "#!/usr/bin/perl\n\n# Generate error.c\n#\n# Usage: ./generate_errors.pl or scripts/generate_errors.pl without arguments,\n# or generate_errors.pl include_dir data_dir error_file\n\nuse strict;\n\nmy ($include_dir, $data_dir, $error_file);\n\nif( @ARGV ) {\n    die \"Invalid number of arguments\" if scalar @ARGV != 3;\n    ($include_dir, $data_dir, $error_file) = @ARGV;\n\n    -d $include_dir or die \"No such directory: $include_dir\\n\";\n    -d $data_dir or die \"No such directory: $data_dir\\n\";\n} else {\n    $include_dir = 'include/mbedtls';\n    $data_dir = 'scripts/data_files';\n    $error_file = 'library/error.c';\n\n    unless( -d $include_dir && -d $data_dir ) {\n        chdir '..' or die;\n        -d $include_dir && -d $data_dir\n            or die \"Without arguments, must be run from root or scripts\\n\"\n    }\n}\n\nmy $error_format_file = $data_dir.'/error.fmt';\n\nmy @low_level_modules = ( \"AES\", \"ASN1\", \"BLOWFISH\", \"CAMELLIA\", \"BIGNUM\",\n                          \"BASE64\", \"XTEA\", \"PBKDF2\", \"OID\",\n                          \"PADLOCK\", \"DES\", \"NET\", \"CTR_DRBG\", \"ENTROPY\",\n                          \"HMAC_DRBG\", \"MD2\", \"MD4\", \"MD5\", \"RIPEMD160\",\n                          \"SHA1\", \"SHA256\", \"SHA512\", \"GCM\", \"THREADING\", \"CCM\" );\nmy @high_level_modules = ( \"PEM\", \"X509\", \"DHM\", \"RSA\", \"ECP\", \"MD\", \"CIPHER\", \"SSL\",\n                           \"PK\", \"PKCS12\", \"PKCS5\" );\n\nmy $line_separator = $/;\nundef $/;\n\nopen(FORMAT_FILE, \"$error_format_file\") or die \"Opening error format file '$error_format_file': $!\";\nmy $error_format = <FORMAT_FILE>;\nclose(FORMAT_FILE);\n\n$/ = $line_separator;\n\nopen(GREP, \"grep \\\"define MBEDTLS_ERR_\\\" $include_dir/* |\") || die(\"Failure when calling grep: $!\");\n\nmy $ll_old_define = \"\";\nmy $hl_old_define = \"\";\n\nmy $ll_code_check = \"\";\nmy $hl_code_check = \"\";\n\nmy $headers = \"\";\n\nmy %error_codes_seen;\n\nwhile (my $line = <GREP>)\n{\n    next if ($line =~ /compat-1.2.h/);\n    my ($error_name, $error_code) = $line =~ /(MBEDTLS_ERR_\\w+)\\s+\\-(0x\\w+)/;\n    my ($description) = $line =~ /\\/\\*\\*< (.*?)\\.? \\*\\//;\n\n    die \"Duplicated error code: $error_code ($error_name)\\n\"\n        if( $error_codes_seen{$error_code}++ );\n\n    $description =~ s/\\\\/\\\\\\\\/g;\n    if ($description eq \"\") {\n        $description = \"DESCRIPTION MISSING\";\n        warn \"Missing description for $error_name\\n\";\n    }\n\n    my ($module_name) = $error_name =~ /^MBEDTLS_ERR_([^_]+)/;\n\n    # Fix faulty ones\n    $module_name = \"BIGNUM\" if ($module_name eq \"MPI\");\n    $module_name = \"CTR_DRBG\" if ($module_name eq \"CTR\");\n    $module_name = \"HMAC_DRBG\" if ($module_name eq \"HMAC\");\n\n    my $define_name = $module_name;\n    $define_name = \"X509_USE,X509_CREATE\" if ($define_name eq \"X509\");\n    $define_name = \"ASN1_PARSE\" if ($define_name eq \"ASN1\");\n    $define_name = \"SSL_TLS\" if ($define_name eq \"SSL\");\n    $define_name = \"PEM_PARSE,PEM_WRITE\" if ($define_name eq \"PEM\");\n\n    my $include_name = $module_name;\n    $include_name =~ tr/A-Z/a-z/;\n    $include_name = \"\" if ($include_name eq \"asn1\");\n\n    # Fix faulty ones\n    $include_name = \"net_sockets\" if ($module_name eq \"NET\");\n\n    my $found_ll = grep $_ eq $module_name, @low_level_modules;\n    my $found_hl = grep $_ eq $module_name, @high_level_modules;\n    if (!$found_ll && !$found_hl)\n    {\n        printf(\"Error: Do not know how to handle: $module_name\\n\");\n        exit 1;\n    }\n\n    my $code_check;\n    my $old_define;\n    my $white_space;\n    my $first;\n\n    if ($found_ll)\n    {\n        $code_check = \\$ll_code_check;\n        $old_define = \\$ll_old_define;\n        $white_space = '    ';\n    }\n    else\n    {\n        $code_check = \\$hl_code_check;\n        $old_define = \\$hl_old_define;\n        $white_space = '        ';\n    }\n\n    if ($define_name ne ${$old_define})\n    {\n        if (${$old_define} ne \"\")\n        {\n            ${$code_check} .= \"#endif /* \";\n            $first = 0;\n            foreach my $dep (split(/,/, ${$old_define}))\n            {\n                ${$code_check} .= \" || \" if ($first++);\n                ${$code_check} .= \"MBEDTLS_${dep}_C\";\n            }\n            ${$code_check} .= \" */\\n\\n\";\n        }\n\n        ${$code_check} .= \"#if \";\n        $headers .= \"#if \" if ($include_name ne \"\");\n        $first = 0;\n        foreach my $dep (split(/,/, ${define_name}))\n        {\n            ${$code_check} .= \" || \" if ($first);\n            $headers       .= \" || \" if ($first++);\n\n            ${$code_check} .= \"defined(MBEDTLS_${dep}_C)\";\n            $headers       .= \"defined(MBEDTLS_${dep}_C)\" if\n                                                    ($include_name ne \"\");\n        }\n        ${$code_check} .= \"\\n\";\n        $headers .= \"\\n#include \\\"mbedtls/${include_name}.h\\\"\\n\".\n                    \"#endif\\n\\n\" if ($include_name ne \"\");\n        ${$old_define} = $define_name;\n    }\n\n    if ($error_name eq \"MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE\")\n    {\n        ${$code_check} .= \"${white_space}if( use_ret == -($error_name) )\\n\".\n                          \"${white_space}\\{\\n\".\n                          \"${white_space}    mbedtls_snprintf( buf, buflen, \\\"$module_name - $description\\\" );\\n\".\n                          \"${white_space}    return;\\n\".\n                          \"${white_space}}\\n\"\n    }\n    else\n    {\n        ${$code_check} .= \"${white_space}if( use_ret == -($error_name) )\\n\".\n                          \"${white_space}    mbedtls_snprintf( buf, buflen, \\\"$module_name - $description\\\" );\\n\"\n    }\n};\n\nif ($ll_old_define ne \"\")\n{\n    $ll_code_check .= \"#endif /* \";\n    my $first = 0;\n    foreach my $dep (split(/,/, $ll_old_define))\n    {\n        $ll_code_check .= \" || \" if ($first++);\n        $ll_code_check .= \"MBEDTLS_${dep}_C\";\n    }\n    $ll_code_check .= \" */\\n\";\n}\nif ($hl_old_define ne \"\")\n{\n    $hl_code_check .= \"#endif /* \";\n    my $first = 0;\n    foreach my $dep (split(/,/, $hl_old_define))\n    {\n        $hl_code_check .= \" || \" if ($first++);\n        $hl_code_check .= \"MBEDTLS_${dep}_C\";\n    }\n    $hl_code_check .= \" */\\n\";\n}\n\n$error_format =~ s/HEADER_INCLUDED\\n/$headers/g;\n$error_format =~ s/LOW_LEVEL_CODE_CHECKS\\n/$ll_code_check/g;\n$error_format =~ s/HIGH_LEVEL_CODE_CHECKS\\n/$hl_code_check/g;\n\nopen(ERROR_FILE, \">$error_file\") or die \"Opening destination file '$error_file': $!\";\nprint ERROR_FILE $error_format;\nclose(ERROR_FILE);\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/generate_features.pl",
    "content": "#!/usr/bin/perl\n#\n\nuse strict;\n\nmy ($include_dir, $data_dir, $feature_file);\n\nif( @ARGV ) {\n    die \"Invalid number of arguments\" if scalar @ARGV != 3;\n    ($include_dir, $data_dir, $feature_file) = @ARGV;\n\n    -d $include_dir or die \"No such directory: $include_dir\\n\";\n    -d $data_dir or die \"No such directory: $data_dir\\n\";\n} else {\n    $include_dir = 'include/mbedtls';\n    $data_dir = 'scripts/data_files';\n    $feature_file = 'library/version_features.c';\n\n    unless( -d $include_dir && -d $data_dir ) {\n        chdir '..' or die;\n        -d $include_dir && -d $data_dir\n            or die \"Without arguments, must be run from root or scripts\\n\"\n    }\n}\n\nmy $feature_format_file = $data_dir.'/version_features.fmt';\n\nmy @sections = ( \"System support\", \"mbed TLS modules\",\n                 \"mbed TLS feature support\" );\n\nmy $line_separator = $/;\nundef $/;\n\nopen(FORMAT_FILE, \"$feature_format_file\") or die \"Opening feature format file '$feature_format_file': $!\";\nmy $feature_format = <FORMAT_FILE>;\nclose(FORMAT_FILE);\n\n$/ = $line_separator;\n\nopen(CONFIG_H, \"$include_dir/config.h\") || die(\"Failure when opening config.h: $!\");\n\nmy $feature_defines = \"\";\nmy $in_section = 0;\n\nwhile (my $line = <CONFIG_H>)\n{\n    next if ($in_section && $line !~ /#define/ && $line !~ /SECTION/);\n    next if (!$in_section && $line !~ /SECTION/);\n\n    if ($in_section) {\n        if ($line =~ /SECTION/) {\n            $in_section = 0;\n            next;\n        }\n\n        my ($define) = $line =~ /#define (\\w+)/;\n        $feature_defines .= \"#if defined(${define})\\n\";\n        $feature_defines .= \"    \\\"${define}\\\",\\n\";\n        $feature_defines .= \"#endif /* ${define} */\\n\";\n    }\n\n    if (!$in_section) {\n        my ($section_name) = $line =~ /SECTION: ([\\w ]+)/;\n        my $found_section = grep $_ eq $section_name, @sections;\n\n        $in_section = 1 if ($found_section);\n    }\n};\n\n$feature_format =~ s/FEATURE_DEFINES\\n/$feature_defines/g;\n\nopen(ERROR_FILE, \">$feature_file\") or die \"Opening destination file '$feature_file': $!\";\nprint ERROR_FILE $feature_format;\nclose(ERROR_FILE);\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/generate_visualc_files.pl",
    "content": "#!/usr/bin/perl\n\n# Generate files for MS Visual Studio:\n# - for VS6: main project (library) file, individual app files, workspace\n# - for VS2010: main file, individual apps, solution file\n#\n# Must be run from mbedTLS root or scripts directory.\n# Takes no argument.\n\nuse warnings;\nuse strict;\nuse Digest::MD5 'md5_hex';\n\nmy $vsx_dir = \"visualc/VS2010\";\nmy $vsx_ext = \"vcxproj\";\nmy $vsx_app_tpl_file = \"scripts/data_files/vs2010-app-template.$vsx_ext\";\nmy $vsx_main_tpl_file = \"scripts/data_files/vs2010-main-template.$vsx_ext\";\nmy $vsx_main_file = \"$vsx_dir/mbedTLS.$vsx_ext\";\nmy $vsx_sln_tpl_file = \"scripts/data_files/vs2010-sln-template.sln\";\nmy $vsx_sln_file = \"$vsx_dir/mbedTLS.sln\";\n\nmy $programs_dir = 'programs';\nmy $header_dir = 'include/mbedtls';\nmy $source_dir = 'library';\n\n# Need windows line endings!\nmy $vsx_hdr_tpl = <<EOT;\n    <ClInclude Include=\"..\\\\..\\\\{NAME}\" />\\r\nEOT\nmy $vsx_src_tpl = <<EOT;\n    <ClCompile Include=\"..\\\\..\\\\{NAME}\" />\\r\nEOT\n\nmy $vsx_sln_app_entry_tpl = <<EOT;\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"{APPNAME}\", \"{APPNAME}.vcxproj\", \"{GUID}\"\\r\n\tProjectSection(ProjectDependencies) = postProject\\r\n\t\t{46CF2D25-6A36-4189-B59C-E4815388E554} = {46CF2D25-6A36-4189-B59C-E4815388E554}\\r\n\tEndProjectSection\\r\nEndProject\\r\nEOT\n\nmy $vsx_sln_conf_entry_tpl = <<EOT;\n\t\t{GUID}.Debug|Win32.ActiveCfg = Debug|Win32\\r\n\t\t{GUID}.Debug|Win32.Build.0 = Debug|Win32\\r\n\t\t{GUID}.Debug|x64.ActiveCfg = Debug|x64\\r\n\t\t{GUID}.Debug|x64.Build.0 = Debug|x64\\r\n\t\t{GUID}.Release|Win32.ActiveCfg = Release|Win32\\r\n\t\t{GUID}.Release|Win32.Build.0 = Release|Win32\\r\n\t\t{GUID}.Release|x64.ActiveCfg = Release|x64\\r\n\t\t{GUID}.Release|x64.Build.0 = Release|x64\\r\nEOT\n\nexit( main() );\n\nsub check_dirs {\n    return -d $vsx_dir\n        && -d $header_dir\n        && -d $source_dir\n        && -d $programs_dir;\n}\n\nsub slurp_file {\n    my ($filename) = @_;\n\n    local $/ = undef;\n    open my $fh, '<', $filename or die \"Could not read $filename\\n\";\n    my $content = <$fh>;\n    close $fh;\n\n    return $content;\n}\n\nsub content_to_file {\n    my ($content, $filename) = @_;\n\n    open my $fh, '>', $filename or die \"Could not write to $filename\\n\";\n    print $fh $content;\n    close $fh;\n}\n\nsub gen_app_guid {\n    my ($path) = @_;\n\n    my $guid = md5_hex( \"mbedTLS:$path\" );\n    $guid =~ s/(.{8})(.{4})(.{4})(.{4})(.{12})/\\U{$1-$2-$3-$4-$5}/;\n\n    return $guid;\n}\n\nsub gen_app {\n    my ($path, $template, $dir, $ext) = @_;\n\n    my $guid = gen_app_guid( $path );\n    $path =~ s!/!\\\\!g;\n    (my $appname = $path) =~ s/.*\\\\//;\n\n    my $content = $template;\n    $content =~ s/<PATHNAME>/$path/g;\n    $content =~ s/<APPNAME>/$appname/g;\n    $content =~ s/<GUID>/$guid/g;\n\n    content_to_file( $content, \"$dir/$appname.$ext\" );\n}\n\nsub get_app_list {\n    my $app_list = `cd $programs_dir && make list`;\n    die \"make list failed: $!\\n\" if $?;\n\n    return split /\\s+/, $app_list;\n}\n\nsub gen_app_files {\n    my @app_list = @_;\n\n    my $vsx_tpl = slurp_file( $vsx_app_tpl_file );\n\n    for my $app ( @app_list ) {\n        gen_app( $app, $vsx_tpl, $vsx_dir, $vsx_ext );\n    }\n}\n\nsub gen_entry_list {\n    my ($tpl, @names) = @_;\n\n    my $entries;\n    for my $name (@names) {\n        (my $entry = $tpl) =~ s/{NAME}/$name/g;\n        $entries .= $entry;\n    }\n\n    return $entries;\n}\n\nsub gen_main_file {\n    my ($headers, $sources, $hdr_tpl, $src_tpl, $main_tpl, $main_out) = @_;\n\n    my $header_entries = gen_entry_list( $hdr_tpl, @$headers );\n    my $source_entries = gen_entry_list( $src_tpl, @$sources );\n\n    my $out = slurp_file( $main_tpl );\n    $out =~ s/SOURCE_ENTRIES\\r\\n/$source_entries/m;\n    $out =~ s/HEADER_ENTRIES\\r\\n/$header_entries/m;\n\n    content_to_file( $out, $main_out );\n}\n\nsub gen_vsx_solution {\n    my (@app_names) = @_;\n\n    my ($app_entries, $conf_entries);\n    for my $path (@app_names) {\n        my $guid = gen_app_guid( $path );\n        (my $appname = $path) =~ s!.*/!!;\n\n        my $app_entry = $vsx_sln_app_entry_tpl;\n        $app_entry =~ s/{APPNAME}/$appname/g;\n        $app_entry =~ s/{GUID}/$guid/g;\n\n        $app_entries .= $app_entry;\n\n        my $conf_entry = $vsx_sln_conf_entry_tpl;\n        $conf_entry =~ s/{GUID}/$guid/g;\n\n        $conf_entries .= $conf_entry;\n    }\n\n    my $out = slurp_file( $vsx_sln_tpl_file );\n    $out =~ s/APP_ENTRIES\\r\\n/$app_entries/m;\n    $out =~ s/CONF_ENTRIES\\r\\n/$conf_entries/m;\n\n    content_to_file( $out, $vsx_sln_file );\n}\n\nsub main {\n    if( ! check_dirs() ) {\n        chdir '..' or die;\n        check_dirs or die \"Must but run from mbedTLS root or scripts dir\\n\";\n    }\n\n    my @app_list = get_app_list();\n    my @headers = <$header_dir/*.h>;\n    my @sources = <$source_dir/*.c>;\n    map { s!/!\\\\!g } @headers;\n    map { s!/!\\\\!g } @sources;\n\n    gen_app_files( @app_list );\n\n    gen_main_file( \\@headers, \\@sources,\n                   $vsx_hdr_tpl, $vsx_src_tpl,\n                   $vsx_main_tpl_file, $vsx_main_file );\n\n    gen_vsx_solution( @app_list );\n\n    return 0;\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/malloc-init.pl",
    "content": "#!/usr/bin/perl\n\n# Check for malloc calls not shortly followed by initialisation.\n#\n# Known limitations:\n# - false negative: can't see allocations spanning more than one line\n# - possible false negatives, see patterns\n# - false positive: malloc-malloc-init-init is not accepted\n# - false positives: \"non-standard\" init functions (eg, the things being\n# initialised is not the first arg, or initialise struct members)\n#\n# Since false positives are expected, the results must be manually reviewed.\n#\n# Typical usage: scripts/malloc-init.pl library/*.c\n\nuse warnings;\nuse strict;\n\nuse utf8;\nuse open qw(:std utf8);\n\nmy $limit = 7;\nmy $inits = qr/memset|memcpy|_init|fread|base64_..code/;\n\n# cases to bear in mind:\n#\n# 0. foo = malloc(...); memset( foo, ... );\n# 1. *foo = malloc(...); memset( *foo, ... );\n# 2. type *foo = malloc(...); memset( foo, ...);\n# 3. foo = malloc(...); foo_init( (type *) foo );\n# 4. foo = malloc(...); for(i=0..n) { init( &foo[i] ); }\n#\n# The chosen patterns are a bit relaxed, but unlikely to cause false positives\n# in real code (initialising *foo or &foo instead of foo will likely be caught\n# by functional tests).\n#\nmy $id = qr/([a-zA-Z-0-9_\\->\\.]*)/;\nmy $prefix = qr/\\s(?:\\*?|\\&?|\\([a-z_]* \\*\\))\\s*/;\n\nmy $name;\nmy $line;\nmy @bad;\n\ndie \"Usage: $0 file.c [...]\\n\" unless @ARGV;\n\nwhile (my $file = shift @ARGV)\n{\n    open my $fh, \"<\", $file or die \"read $file failed: $!\\n\";\n    while (<$fh>)\n    {\n        if( /mbedtls_malloc\\(/ ) {\n            if( /$id\\s*=.*mbedtls_malloc\\(/ ) {\n                push @bad, \"$file:$line:$name\" if $name;\n                $name = $1;\n                $line = $.;\n            } else {\n                push @bad, \"$file:$.:???\" unless /return mbedtls_malloc/;\n            }\n        } elsif( $name && /(?:$inits)\\($prefix\\Q$name\\E\\b/ ) {\n            undef $name;\n        } elsif( $name && $. - $line > $limit ) {\n            push @bad, \"$file:$line:$name\";\n            undef $name;\n            undef $line;\n        }\n    }\n    close $fh or die;\n}\n\nprint \"$_\\n\" for @bad;\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/massif_max.pl",
    "content": "#!/usr/bin/perl\n\n# Parse a massif.out.xxx file and output peak total memory usage\n\nuse warnings;\nuse strict;\n\nuse utf8;\nuse open qw(:std utf8);\n\ndie unless @ARGV == 1;\n\nmy @snaps;\nopen my $fh, '<', $ARGV[0] or die;\n{ local $/ = 'snapshot='; @snaps = <$fh>; }\nclose $fh or die;\n\nmy ($max, $max_heap, $max_he, $max_stack) = (0, 0, 0, 0);\nfor (@snaps)\n{\n    my ($heap, $heap_extra, $stack) = m{\n        mem_heap_B=(\\d+)\\n\n        mem_heap_extra_B=(\\d+)\\n\n        mem_stacks_B=(\\d+)\n    }xm;\n    next unless defined $heap;\n    my $total = $heap + $heap_extra + $stack;\n    if( $total > $max ) {\n        ($max, $max_heap, $max_he, $max_stack) = ($total, $heap, $heap_extra, $stack);\n    }\n}\n\nprintf \"$max (heap $max_heap+$max_he, stack $max_stack)\\n\";\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/memory.sh",
    "content": "#!/bin/sh\n\n# Measure memory usage of a minimal client using a small configuration\n# Currently hardwired to ccm-psk and suite-b, may be expanded later\n#\n# Use different build options for measuring executable size and memory usage,\n# since for memory we want debug information.\n\nset -eu\n\nCONFIG_H='include/mbedtls/config.h'\n\nCLIENT='mini_client'\n\nCFLAGS_EXEC='-fno-asynchronous-unwind-tables -Wl,--gc-section -ffunction-sections -fdata-sections'\nCFLAGS_MEM=-g3\n\nif [ -r $CONFIG_H ]; then :; else\n    echo \"$CONFIG_H not found\" >&2\n    exit 1\nfi\n\nif grep -i cmake Makefile >/dev/null; then\n    echo \"Not compatible with CMake\" >&2\n    exit 1\nfi\n\nif [ $( uname ) != Linux ]; then\n    echo \"Only work on Linux\" >&2\n    exit 1\nfi\n\nif git status | grep -F $CONFIG_H >/dev/null 2>&1; then\n    echo \"config.h not clean\" >&2\n    exit 1\nfi\n\n# make measurements with one configuration\n# usage: do_config <name> <unset-list> <server-args>\ndo_config()\n{\n    NAME=$1\n    UNSET_LIST=$2\n    SERVER_ARGS=$3\n\n    echo \"\"\n    echo \"config-$NAME:\"\n    cp configs/config-$NAME.h $CONFIG_H\n    scripts/config.pl unset MBEDTLS_SSL_SRV_C\n\n    for FLAG in $UNSET_LIST; do\n        scripts/config.pl unset $FLAG\n    done\n\n    grep -F SSL_MAX_CONTENT_LEN $CONFIG_H || echo 'SSL_MAX_CONTENT_LEN=16384'\n\n    printf \"    Executable size... \"\n\n    make clean\n    CFLAGS=$CFLAGS_EXEC make OFLAGS=-Os lib >/dev/null 2>&1\n    cd programs\n    CFLAGS=$CFLAGS_EXEC make OFLAGS=-Os ssl/$CLIENT >/dev/null\n    strip ssl/$CLIENT\n    stat -c '%s' ssl/$CLIENT\n    cd ..\n\n    printf \"    Peak ram usage... \"\n\n    make clean\n    CFLAGS=$CFLAGS_MEM make OFLAGS=-Os lib >/dev/null 2>&1\n    cd programs\n    CFLAGS=$CFLAGS_MEM make OFLAGS=-Os ssl/$CLIENT >/dev/null\n    cd ..\n\n    ./ssl_server2 $SERVER_ARGS >/dev/null &\n    SRV_PID=$!\n    sleep 1;\n\n    if valgrind --tool=massif --stacks=yes programs/ssl/$CLIENT >/dev/null 2>&1\n    then\n        FAILED=0\n    else\n        echo \"client failed\" >&2\n        FAILED=1\n    fi\n\n    kill $SRV_PID\n    wait $SRV_PID\n\n    scripts/massif_max.pl massif.out.*\n    mv massif.out.* massif-$NAME.$$\n}\n\n# preparation\n\nCONFIG_BAK=${CONFIG_H}.bak\ncp $CONFIG_H $CONFIG_BAK\n\nrm -f massif.out.*\n\nprintf \"building server... \"\n\nmake clean\nmake lib >/dev/null 2>&1\n(cd programs && make ssl/ssl_server2) >/dev/null\ncp programs/ssl/ssl_server2 .\n\necho \"done\"\n\n# actual measurements\n\ndo_config   \"ccm-psk-tls1_2\" \\\n            \"\" \\\n            \"psk=000102030405060708090A0B0C0D0E0F\"\n\ndo_config   \"suite-b\" \\\n            \"MBEDTLS_BASE64_C MBEDTLS_PEM_PARSE_C MBEDTLS_CERTS_C\" \\\n            \"\"\n\n# cleanup\n\nmv $CONFIG_BAK $CONFIG_H\nmake clean\nrm ssl_server2\n\nexit $FAILED\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/output_env.sh",
    "content": "#! /usr/bin/env sh\n\n# output_env.sh\n#\n# This file is part of mbed TLS (https://tls.mbed.org)\n#\n# Copyright (c) 2016, ARM Limited, All Rights Reserved\n#\n# Purpose\n#\n# To print out all the relevant information about the development environment.\n#\n# This includes:\n#   - architecture of the system\n#   - type and version of the operating system\n#   - version of armcc, clang, gcc-arm and gcc compilers\n#   - version of libc, clang, asan and valgrind if installed\n#   - version of gnuTLS and OpenSSL\n\nprint_version()\n{\n    BIN=\"$1\"\n    shift\n    ARGS=\"$1\"\n    shift\n    FAIL_MSG=\"$1\"\n    shift\n\n    if ! `type \"$BIN\" > /dev/null 2>&1`; then\n        echo \"* $FAIL_MSG\"\n        return 0\n    fi\n\n    BIN=`which \"$BIN\"`\n    VERSION_STR=`$BIN $ARGS 2>&1`\n\n    # Apply all filters\n    while [ $# -gt 0 ]; do\n        FILTER=\"$1\"\n        shift\n        VERSION_STR=`echo \"$VERSION_STR\" | $FILTER`\n    done\n\n    echo \"* ${BIN##*/}: $BIN: $VERSION_STR\"\n}\n\nprint_version \"uname\" \"-a\" \"\"\necho\n\n: ${ARMC5_CC:=armcc}\nprint_version \"$ARMC5_CC\" \"--vsn\" \"armcc not found!\" \"head -n 2\"\necho\n\n: ${ARMC6_CC:=armclang}\nprint_version \"$ARMC6_CC\" \"--vsn\" \"armclang not found!\" \"head -n 2\"\necho\n\nprint_version \"arm-none-eabi-gcc\" \"--version\" \"gcc-arm not found!\" \"head -n 1\"\necho\n\nprint_version \"gcc\" \"--version\" \"gcc not found!\" \"head -n 1\"\necho\n\nprint_version \"clang\" \"--version\" \"clang not found\" \"head -n 2\"\necho\n\nprint_version \"ldd\" \"--version\"                     \\\n    \"No ldd present: can't determine libc version!\" \\\n    \"head -n 1\"\necho\n\nprint_version \"valgrind\" \"--version\" \"valgrind not found!\"\necho\n\n: ${OPENSSL:=openssl}\nprint_version \"$OPENSSL\" \"version\" \"openssl not found!\"\necho\n\nif [ -n \"${OPENSSL_LEGACY+set}\" ]; then\n    print_version \"$OPENSSL_LEGACY\" \"version\" \"openssl legacy version not found!\"\n    echo\nfi\n\n: ${GNUTLS_CLI:=gnutls-cli}\nprint_version \"$GNUTLS_CLI\" \"--version\" \"gnuTLS client not found!\" \"head -n 1\"\necho\n\n: ${GNUTLS_SERV:=gnutls-serv}\nprint_version \"$GNUTLS_SERV\" \"--version\" \"gnuTLS server not found!\" \"head -n 1\"\necho\n\nif [ -n \"${GNUTLS_LEGACY_CLI+set}\" ]; then\n    print_version \"$GNUTLS_LEGACY_CLI\" \"--version\" \\\n        \"gnuTLS client legacy version not found!\"  \\\n        \"head -n 1\"\n    echo\nfi\n\nif [ -n \"${GNUTLS_LEGACY_SERV+set}\" ]; then\n    print_version \"$GNUTLS_LEGACY_SERV\" \"--version\" \\\n        \"gnuTLS server legacy version not found!\"   \\\n        \"head -n 1\"\n    echo\nfi\n\nif `hash dpkg > /dev/null 2>&1`; then\n    echo \"* asan:\"\n    dpkg -s libasan2 2> /dev/null | grep -i version\n    dpkg -s libasan1 2> /dev/null | grep -i version\n    dpkg -s libasan0 2> /dev/null | grep -i version\nelse\n    echo \"* No dpkg present: can't determine asan version!\"\nfi\necho\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/rename.pl",
    "content": "#!/usr/bin/perl\n#\n# This file is part of mbed TLS (https://tls.mbed.org)\n#\n# Copyright (c) 2015-2016, ARM Limited, All Rights Reserved\n#\n# Purpose\n#\n# This script migrates application source code from the mbed TLS 1.3 API to the\n# mbed TLS 2.0 API.\n#\n# The script processes the given source code and renames identifiers - functions\n# types, enums etc, as\n#\n# Usage:  rename.pl [-f datafile] [-s] [--] [filenames...]\n#\n\nuse warnings;\nuse strict;\n\nuse utf8;\nuse Path::Class;\nuse open qw(:std utf8);\n\nmy $usage = \"Usage: $0 [-f datafile] [-s] [--] [filenames...]\\n\";\n\n(my $datafile = $0) =~ s/rename.pl$/data_files\\/rename-1.3-2.0.txt/;\nmy $do_strings = 0;\n\nwhile( @ARGV && $ARGV[0] =~ /^-/ ) {\n    my $opt = shift;\n    if( $opt eq '--' ) {\n        last;\n    } elsif( $opt eq '-f' ) {\n        $datafile = shift;\n    } elsif( $opt eq '-s' ) {\n        $do_strings = 1; shift;\n    } else {\n        die $usage;\n    }\n}\n\nmy %subst;\nopen my $nfh, '<', $datafile or die \"Could not read $datafile\\n\";\nmy $ident = qr/[_A-Za-z][_A-Za-z0-9]*/;\nwhile( my $line = <$nfh> ) {\n    chomp $line;\n    my ( $old, $new ) = ( $line =~ /^($ident)\\s+($ident)$/ );\n    if( ! $old || ! $new ) {\n        die \"$0: $datafile:$.: bad input '$line'\\n\";\n    }\n    $subst{$old} = $new;\n}\nclose $nfh or die;\n\nmy $string = qr/\"(?:\\\\.|[^\\\\\"])*\"/;\nmy $space = qr/\\s+/;\nmy $idnum = qr/[a-zA-Z0-9_]+/;\nmy $symbols = qr/[-!#\\$%&'()*+,.\\/:;<=>?@[\\\\\\]^_`{|}~]+|\"/;\n\nmy $lib_include_dir = dir($0)->parent->parent->subdir('include', 'mbedtls');\nmy $lib_source_dir = dir($0)->parent->parent->subdir('library');\n\n# if we replace inside strings, we don't consider them a token\nmy $token = $do_strings ?         qr/$space|$idnum|$symbols/\n                        : qr/$string|$space|$idnum|$symbols/;\n\nmy %warnings;\n\n# If no files were passed, exit...\nif ( not defined($ARGV[0]) ){ die $usage; }\n\nwhile( my $filename = shift )\n{\n    print STDERR \"$filename... \";\n\n    if( dir($filename)->parent eq $lib_include_dir ||\n         dir($filename)->parent eq $lib_source_dir )\n    {\n        die \"Script cannot be executed on the mbed TLS library itself.\";\n    }\n\n    if( -d $filename ) { print STDERR \"skip (directory)\\n\"; next }\n\n    open my $rfh, '<', $filename or die;\n    my @lines = <$rfh>;\n    close $rfh or die;\n\n    my @out;\n    for my $line (@lines) {\n        if( $line =~ /#include/ ) {\n            $line =~ s/polarssl/mbedtls/;\n            $line =~ s/POLARSSL/MBEDTLS/;\n            push( @out, $line );\n            next;\n        }\n\n        my @words = ($line =~ /$token/g);\n        my $checkline = join '', @words;\n        if( $checkline eq $line ) {\n            my @new = map { exists $subst{$_} ? $subst{$_} : $_ } @words;\n            push( @out, join '', @new );\n        } else {\n            $warnings{$filename} = [] unless $warnings{$filename};\n            push @{ $warnings{$filename} }, $line;\n            push( @out, $line );\n        }\n    }\n\n    open my $wfh, '>', $filename or die;\n    print $wfh $_ for @out;\n    close $wfh or die;\n    print STDERR \"done\\n\";\n}\n\nif( %warnings ) {\n    print \"\\nWarning: lines skipped due to unexpected characters:\\n\";\n    for my $filename (sort keys %warnings) {\n        print \"in $filename:\\n\";\n        print for @{ $warnings{$filename} };\n    }\n}\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/rm-malloc-cast.cocci",
    "content": "@rm_malloc_cast@\nexpression x, n;\ntype T;\n@@\n  x =\n- (T *)\n  mbedtls_malloc(n)\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/scripts/tmp_ignore_makefiles.sh",
    "content": "#!/bin/bash\n\n# Temporarily (de)ignore Makefiles generated by CMake to allow easier\n# git development\n\nIGNORE=\"\"\n\n# Parse arguments\n#\nuntil [ -z \"$1\" ]\ndo\n  case \"$1\" in\n    -u|--undo)\n      IGNORE=\"0\"\n      ;;\n    -v|--verbose)\n      # Be verbose\n      VERBOSE=\"1\"\n      ;;\n    -h|--help)\n      # print help\n      echo \"Usage: $0\"\n      echo -e \"  -h|--help\\t\\tPrint this help.\"\n      echo -e \"  -u|--undo\\t\\tRemove ignores and continue tracking.\"\n      echo -e \"  -v|--verbose\\t\\tVerbose.\"\n      exit 1\n      ;;\n    *)\n      # print error\n      echo \"Unknown argument: '$1'\"\n      exit 1\n      ;;\n  esac\n  shift\ndone\n\nif [ \"X\" = \"X$IGNORE\" ];\nthen\n  [ $VERBOSE ] && echo \"Ignoring Makefiles\"\n  git update-index --assume-unchanged Makefile library/Makefile programs/Makefile tests/Makefile\nelse\n  [ $VERBOSE ] && echo \"Tracking Makefiles\"\n  git update-index --no-assume-unchanged Makefile library/Makefile programs/Makefile tests/Makefile\nfi\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/.gitignore",
    "content": "*.sln\n*.vcxproj\n\n*.log\n/test_suite*\ndata_files/mpi_write\ndata_files/hmac_drbg_seed\ndata_files/ctr_drbg_seed\ndata_files/entropy_seed\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/CMakeLists.txt",
    "content": "set(libs\n    mbedtls\n)\n\nif(USE_PKCS11_HELPER_LIBRARY)\n    set(libs ${libs} pkcs11-helper)\nendif(USE_PKCS11_HELPER_LIBRARY)\n\nif(ENABLE_ZLIB_SUPPORT)\n    set(libs ${libs} ${ZLIB_LIBRARIES})\nendif(ENABLE_ZLIB_SUPPORT)\n\nfind_package(Perl)\nif(NOT PERL_FOUND)\n    message(FATAL_ERROR \"Cannot build test suites without Perl\")\nendif()\n\nfunction(add_test_suite suite_name)\n    if(ARGV1)\n        set(data_name ${ARGV1})\n    else()\n        set(data_name ${suite_name})\n    endif()\n\n    add_custom_command(\n        OUTPUT test_suite_${data_name}.c\n        COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_code.pl ${CMAKE_CURRENT_SOURCE_DIR}/suites test_suite_${suite_name} test_suite_${data_name}\n        DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_code.pl mbedtls suites/helpers.function suites/main_test.function suites/test_suite_${suite_name}.function suites/test_suite_${data_name}.data\n    )\n\n    include_directories(${CMAKE_CURRENT_SOURCE_DIR})\n    add_executable(test_suite_${data_name} test_suite_${data_name}.c)\n    target_link_libraries(test_suite_${data_name} ${libs})\n    add_test(${data_name}-suite test_suite_${data_name})\nendfunction(add_test_suite)\n\nif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -Wno-unused-function\")\nendif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_CLANG)\n\nif(MSVC)\n    # If a warning level has been defined, suppress all warnings for test code\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /W0\")\n    set(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} /WX-\")\nendif(MSVC)\n\nadd_test_suite(aes aes.ecb)\nadd_test_suite(aes aes.cbc)\nadd_test_suite(aes aes.cfb)\nadd_test_suite(aes aes.rest)\nadd_test_suite(arc4)\nadd_test_suite(asn1write)\nadd_test_suite(base64)\nadd_test_suite(blowfish)\nadd_test_suite(camellia)\nadd_test_suite(ccm)\nadd_test_suite(cipher cipher.aes)\nadd_test_suite(cipher cipher.arc4)\nadd_test_suite(cipher cipher.blowfish)\nadd_test_suite(cipher cipher.camellia)\nadd_test_suite(cipher cipher.ccm)\nadd_test_suite(cipher cipher.des)\nadd_test_suite(cipher cipher.gcm)\nadd_test_suite(cipher cipher.null)\nadd_test_suite(cipher cipher.padding)\nadd_test_suite(cmac)\nadd_test_suite(ctr_drbg)\nadd_test_suite(debug)\nadd_test_suite(des)\nadd_test_suite(dhm)\nadd_test_suite(ecdh)\nadd_test_suite(ecdsa)\nadd_test_suite(ecjpake)\nadd_test_suite(ecp)\nadd_test_suite(entropy)\nadd_test_suite(error)\nadd_test_suite(gcm gcm.aes128_en)\nadd_test_suite(gcm gcm.aes192_en)\nadd_test_suite(gcm gcm.aes256_en)\nadd_test_suite(gcm gcm.aes128_de)\nadd_test_suite(gcm gcm.aes192_de)\nadd_test_suite(gcm gcm.aes256_de)\nadd_test_suite(gcm gcm.camellia)\nadd_test_suite(hmac_drbg hmac_drbg.misc)\nadd_test_suite(hmac_drbg hmac_drbg.no_reseed)\nadd_test_suite(hmac_drbg hmac_drbg.nopr)\nadd_test_suite(hmac_drbg hmac_drbg.pr)\nadd_test_suite(md)\nadd_test_suite(mdx)\nadd_test_suite(memory_buffer_alloc)\nadd_test_suite(mpi)\nadd_test_suite(pem)\nadd_test_suite(pkcs1_v15)\nadd_test_suite(pkcs1_v21)\nadd_test_suite(pkcs5)\nadd_test_suite(pk)\nadd_test_suite(pkparse)\nadd_test_suite(pkwrite)\nadd_test_suite(shax)\nadd_test_suite(ssl)\nadd_test_suite(timing)\nadd_test_suite(rsa)\nadd_test_suite(version)\nadd_test_suite(xtea)\nadd_test_suite(x509parse)\nadd_test_suite(x509write)\n\n# Make data_files available in an out-of-source build\nif (NOT ${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})\n    # Get OS dependent path to use in `execute_process`\n    file(TO_NATIVE_PATH \"${CMAKE_CURRENT_BINARY_DIR}/data_files\" link)\n    file(TO_NATIVE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/data_files\" target)\n\n    if (NOT EXISTS ${link})\n        if (CMAKE_HOST_UNIX)\n            set(command ln -s ${target} ${link})\n        else()\n            set(command cmd.exe /c mklink /j ${link} ${target})\n        endif()\n\n        execute_process(COMMAND ${command}\n                        RESULT_VARIABLE result\n                        ERROR_VARIABLE output)\n\n        if (NOT ${result} EQUAL 0)\n            message(FATAL_ERROR \"Could not create symbolic link for: ${target} --> ${output}\")\n        endif()\n    endif()\nendif()\n\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/Descriptions.txt",
    "content": "test_suites\n    The various 'test_suite_XXX' programs from the 'tests' directory, executed\n    using 'make check' (Unix make) or 'make test' (Cmake), include test cases\n    (reference test vectors, sanity checks, malformed input for parsing\n    functions, etc.) for all modules except the SSL modules.\n\nselftests\n    The 'programs/test/selftest' program runs the 'XXX_self_test()' functions\n    of each individual module. Most of them are included in the respective\n    test suite, but some slower ones are only included here.\n\ncompat\n    The 'tests/compat.sh' script checks interoperability with OpenSSL and\n    GnuTLS (and ourselves!) for every common ciphersuite, in every TLS\n    version, both ways (client/server), using client authentication or not.\n    For each ciphersuite/version/side/authmode it performs a full handshake\n    and a small data exchange.\n\nssl_opt\n    The 'tests/ssl-opt.sh' script checks various options and/or operations not\n    covered by compat.sh: session resumption (using session cache or tickets),\n    renegotiation, SNI, other extensions, etc.\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/Makefile",
    "content": "\n# To compile on SunOS: add \"-lsocket -lnsl\" to LDFLAGS\n# To compile with PKCS11: add \"-lpkcs11-helper\" to LDFLAGS\n\nCFLAGS\t?= -O2\nWARNING_CFLAGS ?= -Wall -W -Wdeclaration-after-statement -Wno-unused-function -Wno-unused-value\nLDFLAGS ?=\n\nLOCAL_CFLAGS = $(WARNING_CFLAGS) -I../include -D_FILE_OFFSET_BITS=64\nLOCAL_LDFLAGS = -L../library \t\t\t\\\n\t\t-lmbedtls$(SHARED_SUFFIX)\t\\\n\t\t-lmbedx509$(SHARED_SUFFIX)\t\\\n\t\t-lmbedcrypto$(SHARED_SUFFIX)\n\nifndef SHARED\nDEP=../library/libmbedcrypto.a ../library/libmbedx509.a ../library/libmbedtls.a\nelse\nDEP=../library/libmbedcrypto.$(DLEXT) ../library/libmbedx509.$(DLEXT) ../library/libmbedtls.$(DLEXT)\nendif\n\nifdef DEBUG\nLOCAL_CFLAGS += -g3\nendif\n\n# if we're running on Windows, build for Windows\nifdef WINDOWS\nWINDOWS_BUILD=1\nendif\n\nifdef WINDOWS_BUILD\nDLEXT=dll\nEXEXT=.exe\nLOCAL_LDFLAGS += -lws2_32\nifdef SHARED\nSHARED_SUFFIX=.$(DLEXT)\nendif\nelse\nDLEXT=so\nEXEXT=\nSHARED_SUFFIX=\nendif\n\n# Zlib shared library extensions:\nifdef ZLIB\nLOCAL_LDFLAGS += -lz\nendif\n\nAPPS =\ttest_suite_aes.ecb$(EXEXT)\ttest_suite_aes.cbc$(EXEXT)\t\\\n\ttest_suite_aes.cfb$(EXEXT)\ttest_suite_aes.rest$(EXEXT)\t\\\n\ttest_suite_arc4$(EXEXT)\t\ttest_suite_asn1write$(EXEXT)\t\\\n\ttest_suite_base64$(EXEXT)\ttest_suite_blowfish$(EXEXT)\t\\\n\ttest_suite_camellia$(EXEXT)\ttest_suite_ccm$(EXEXT)\t\t\\\n\ttest_suite_cmac$(EXEXT)\t\t\t\t\t\t\\\n\ttest_suite_cipher.aes$(EXEXT)\t\t\t\t\t\\\n\ttest_suite_cipher.arc4$(EXEXT)\ttest_suite_cipher.ccm$(EXEXT)\t\\\n\ttest_suite_cipher.gcm$(EXEXT)\t\t\t\t\t\\\n\ttest_suite_cipher.blowfish$(EXEXT)\t\t\t\t\\\n\ttest_suite_cipher.camellia$(EXEXT)\t\t\t\t\\\n\ttest_suite_cipher.des$(EXEXT)\ttest_suite_cipher.null$(EXEXT)\t\\\n\ttest_suite_cipher.padding$(EXEXT)\t\t\t\t\\\n\ttest_suite_ctr_drbg$(EXEXT)\ttest_suite_debug$(EXEXT)\t\\\n\ttest_suite_des$(EXEXT)\t\ttest_suite_dhm$(EXEXT)\t\t\\\n\ttest_suite_ecdh$(EXEXT)\t\ttest_suite_ecdsa$(EXEXT)\t\\\n\ttest_suite_ecjpake$(EXEXT)\ttest_suite_ecp$(EXEXT)\t\t\\\n\ttest_suite_error$(EXEXT)\ttest_suite_entropy$(EXEXT)\t\\\n\ttest_suite_gcm.aes128_de$(EXEXT)\t\t\t\t\\\n\ttest_suite_gcm.aes192_de$(EXEXT)\t\t\t\t\\\n\ttest_suite_gcm.aes256_de$(EXEXT)\t\t\t\t\\\n\ttest_suite_gcm.aes128_en$(EXEXT)\t\t\t\t\\\n\ttest_suite_gcm.aes192_en$(EXEXT)\t\t\t\t\\\n\ttest_suite_gcm.aes256_en$(EXEXT)\t\t\t\t\\\n\ttest_suite_gcm.camellia$(EXEXT)\t\t\t\t\t\\\n\ttest_suite_hmac_drbg.misc$(EXEXT)\t\t\t\t\\\n\ttest_suite_hmac_drbg.no_reseed$(EXEXT)\t\t\t\t\\\n\ttest_suite_hmac_drbg.nopr$(EXEXT)\t\t\t\t\\\n\ttest_suite_hmac_drbg.pr$(EXEXT)\t\t\t\t\t\\\n\ttest_suite_md$(EXEXT)\t\ttest_suite_mdx$(EXEXT)\t\t\\\n\ttest_suite_memory_buffer_alloc$(EXEXT)\t\t\t\t\\\n\ttest_suite_mpi$(EXEXT)\t\t\t\t\t\t\\\n\ttest_suite_pem$(EXEXT)\t\t\ttest_suite_pkcs1_v15$(EXEXT)\t\\\n\ttest_suite_pkcs1_v21$(EXEXT)\ttest_suite_pkcs5$(EXEXT)\t\\\n\ttest_suite_pkparse$(EXEXT)\ttest_suite_pkwrite$(EXEXT)\t\\\n\ttest_suite_pk$(EXEXT)\t\t\t\t\t\t\\\n\ttest_suite_rsa$(EXEXT)\t\ttest_suite_shax$(EXEXT)\t\t\\\n\ttest_suite_ssl$(EXEXT)\t\ttest_suite_timing$(EXEXT)\t\t\t\\\n\ttest_suite_x509parse$(EXEXT)\ttest_suite_x509write$(EXEXT)\t\\\n\ttest_suite_xtea$(EXEXT)\t\ttest_suite_version$(EXEXT)\n\n.SILENT:\n\n.PHONY: all check test clean\n\nall: $(APPS)\n\n$(DEP):\n\t$(MAKE) -C ../library\n\n# invoke perl explicitly for the sake of mingw32-make\n\ntest_suite_aes.ecb.c : suites/test_suite_aes.function suites/test_suite_aes.ecb.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_aes test_suite_aes.ecb\n\ntest_suite_aes.cbc.c : suites/test_suite_aes.function suites/test_suite_aes.cbc.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_aes test_suite_aes.cbc\n\ntest_suite_aes.cfb.c : suites/test_suite_aes.function suites/test_suite_aes.cfb.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_aes test_suite_aes.cfb\n\ntest_suite_aes.rest.c : suites/test_suite_aes.function suites/test_suite_aes.rest.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_aes test_suite_aes.rest\n\ntest_suite_cipher.aes.c : suites/test_suite_cipher.function suites/test_suite_cipher.aes.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.aes\n\ntest_suite_cipher.arc4.c : suites/test_suite_cipher.function suites/test_suite_cipher.arc4.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.arc4\n\ntest_suite_cipher.ccm.c : suites/test_suite_cipher.function suites/test_suite_cipher.ccm.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.ccm\n\ntest_suite_cipher.gcm.c : suites/test_suite_cipher.function suites/test_suite_cipher.gcm.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.gcm\n\ntest_suite_cipher.blowfish.c : suites/test_suite_cipher.function suites/test_suite_cipher.blowfish.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.blowfish\n\ntest_suite_cipher.camellia.c : suites/test_suite_cipher.function suites/test_suite_cipher.camellia.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.camellia\n\ntest_suite_cipher.des.c : suites/test_suite_cipher.function suites/test_suite_cipher.des.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.des\n\ntest_suite_cipher.null.c : suites/test_suite_cipher.function suites/test_suite_cipher.null.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.null\n\ntest_suite_cipher.padding.c : suites/test_suite_cipher.function suites/test_suite_cipher.padding.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_cipher test_suite_cipher.padding\n\ntest_suite_gcm.aes128_de.c : suites/test_suite_gcm.function suites/test_suite_gcm.aes128_de.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_gcm test_suite_gcm.aes128_de\n\ntest_suite_gcm.aes192_de.c : suites/test_suite_gcm.function suites/test_suite_gcm.aes192_de.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_gcm test_suite_gcm.aes192_de\n\ntest_suite_gcm.aes256_de.c : suites/test_suite_gcm.function suites/test_suite_gcm.aes256_de.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_gcm test_suite_gcm.aes256_de\n\ntest_suite_gcm.aes128_en.c : suites/test_suite_gcm.function suites/test_suite_gcm.aes128_en.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_gcm test_suite_gcm.aes128_en\n\ntest_suite_gcm.aes192_en.c : suites/test_suite_gcm.function suites/test_suite_gcm.aes192_en.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_gcm test_suite_gcm.aes192_en\n\ntest_suite_gcm.aes256_en.c : suites/test_suite_gcm.function suites/test_suite_gcm.aes256_en.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_gcm test_suite_gcm.aes256_en\n\ntest_suite_gcm.camellia.c : suites/test_suite_gcm.function suites/test_suite_gcm.camellia.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_gcm test_suite_gcm.camellia\n\ntest_suite_hmac_drbg.misc.c : suites/test_suite_hmac_drbg.function suites/test_suite_hmac_drbg.misc.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_hmac_drbg test_suite_hmac_drbg.misc\n\ntest_suite_hmac_drbg.no_reseed.c : suites/test_suite_hmac_drbg.function suites/test_suite_hmac_drbg.no_reseed.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_hmac_drbg test_suite_hmac_drbg.no_reseed\n\ntest_suite_hmac_drbg.nopr.c : suites/test_suite_hmac_drbg.function suites/test_suite_hmac_drbg.nopr.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_hmac_drbg test_suite_hmac_drbg.nopr\n\ntest_suite_hmac_drbg.pr.c : suites/test_suite_hmac_drbg.function suites/test_suite_hmac_drbg.pr.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites test_suite_hmac_drbg test_suite_hmac_drbg.pr\n\n%.c : suites/%.function suites/%.data scripts/generate_code.pl suites/helpers.function suites/main_test.function\n\techo \"  Gen   $@\"\n\tperl scripts/generate_code.pl suites $* $*\n\ntest_suite_aes.ecb$(EXEXT): test_suite_aes.ecb.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_aes.cbc$(EXEXT): test_suite_aes.cbc.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_aes.cfb$(EXEXT): test_suite_aes.cfb.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_aes.rest$(EXEXT): test_suite_aes.rest.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_arc4$(EXEXT): test_suite_arc4.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_asn1write$(EXEXT): test_suite_asn1write.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_base64$(EXEXT): test_suite_base64.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_blowfish$(EXEXT): test_suite_blowfish.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_camellia$(EXEXT): test_suite_camellia.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_ccm$(EXEXT): test_suite_ccm.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_cmac$(EXEXT): test_suite_cmac.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_cipher.aes$(EXEXT): test_suite_cipher.aes.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_cipher.arc4$(EXEXT): test_suite_cipher.arc4.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_cipher.ccm$(EXEXT): test_suite_cipher.ccm.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_cipher.gcm$(EXEXT): test_suite_cipher.gcm.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_cipher.blowfish$(EXEXT): test_suite_cipher.blowfish.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_cipher.camellia$(EXEXT): test_suite_cipher.camellia.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_cipher.des$(EXEXT): test_suite_cipher.des.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_cipher.null$(EXEXT): test_suite_cipher.null.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_cipher.padding$(EXEXT): test_suite_cipher.padding.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_ctr_drbg$(EXEXT): test_suite_ctr_drbg.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_des$(EXEXT): test_suite_des.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_dhm$(EXEXT): test_suite_dhm.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_ecdh$(EXEXT): test_suite_ecdh.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_ecdsa$(EXEXT): test_suite_ecdsa.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_ecjpake$(EXEXT): test_suite_ecjpake.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_ecp$(EXEXT): test_suite_ecp.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_entropy$(EXEXT): test_suite_entropy.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_error$(EXEXT): test_suite_error.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_gcm.aes128_de$(EXEXT): test_suite_gcm.aes128_de.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_gcm.aes192_de$(EXEXT): test_suite_gcm.aes192_de.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_gcm.aes256_de$(EXEXT): test_suite_gcm.aes256_de.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_gcm.aes128_en$(EXEXT): test_suite_gcm.aes128_en.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_gcm.aes192_en$(EXEXT): test_suite_gcm.aes192_en.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_gcm.aes256_en$(EXEXT): test_suite_gcm.aes256_en.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_gcm.camellia$(EXEXT): test_suite_gcm.camellia.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_hmac_drbg.misc$(EXEXT): test_suite_hmac_drbg.misc.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_hmac_drbg.no_reseed$(EXEXT): test_suite_hmac_drbg.no_reseed.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_hmac_drbg.nopr$(EXEXT): test_suite_hmac_drbg.nopr.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_hmac_drbg.pr$(EXEXT): test_suite_hmac_drbg.pr.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_md$(EXEXT): test_suite_md.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_mdx$(EXEXT): test_suite_mdx.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_memory_buffer_alloc$(EXEXT): test_suite_memory_buffer_alloc.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_mpi$(EXEXT): test_suite_mpi.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_pem$(EXEXT): test_suite_pem.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_pkcs1_v15$(EXEXT): test_suite_pkcs1_v15.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_pkcs1_v21$(EXEXT): test_suite_pkcs1_v21.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_pkcs5$(EXEXT): test_suite_pkcs5.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_pkparse$(EXEXT): test_suite_pkparse.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_pkwrite$(EXEXT): test_suite_pkwrite.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_pk$(EXEXT): test_suite_pk.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_rsa$(EXEXT): test_suite_rsa.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_shax$(EXEXT): test_suite_shax.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_ssl$(EXEXT): test_suite_ssl.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_timing$(EXEXT): test_suite_timing.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_x509parse$(EXEXT): test_suite_x509parse.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_x509write$(EXEXT): test_suite_x509write.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_xtea$(EXEXT): test_suite_xtea.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_debug$(EXEXT): test_suite_debug.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\ntest_suite_version$(EXEXT): test_suite_version.c $(DEP)\n\techo \"  CC    $<\"\n\t$(CC) $(LOCAL_CFLAGS) $(CFLAGS) $<\t$(LOCAL_LDFLAGS) $(LDFLAGS) -o $@\n\nclean:\nifndef WINDOWS\n\trm -f $(APPS) *.c\nelse\n\tdel /Q /F *.c *.exe\nendif\n\ncheck: $(APPS)\n\tperl scripts/run-test-suites.pl\n\ntest: check\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/compat.sh",
    "content": "#!/bin/sh\n\n# compat.sh\n#\n# This file is part of mbed TLS (https://tls.mbed.org)\n#\n# Copyright (c) 2012-2016, ARM Limited, All Rights Reserved\n#\n# Purpose\n#\n# Test interoperbility with OpenSSL, GnuTLS as well as itself.\n#\n# Check each common ciphersuite, with each version, both ways (client/server),\n# with and without client authentication.\n\nset -u\n\n# initialise counters\nTESTS=0\nFAILED=0\nSKIPPED=0\nSRVMEM=0\n\n# default commands, can be overriden by the environment\n: ${M_SRV:=../programs/ssl/ssl_server2}\n: ${M_CLI:=../programs/ssl/ssl_client2}\n: ${OPENSSL_CMD:=openssl} # OPENSSL would conflict with the build system\n: ${GNUTLS_CLI:=gnutls-cli}\n: ${GNUTLS_SERV:=gnutls-serv}\n\n# do we have a recent enough GnuTLS?\nif ( which $GNUTLS_CLI && which $GNUTLS_SERV ) >/dev/null 2>&1; then\n    G_VER=\"$( $GNUTLS_CLI --version | head -n1 )\"\n    if echo \"$G_VER\" | grep '@VERSION@' > /dev/null; then # git version\n        PEER_GNUTLS=\" GnuTLS\"\n    else\n        eval $( echo $G_VER | sed 's/.* \\([0-9]*\\)\\.\\([0-9]\\)*\\.\\([0-9]*\\)$/MAJOR=\"\\1\" MINOR=\"\\2\" PATCH=\"\\3\"/' )\n        if [ $MAJOR -lt 3 -o \\\n            \\( $MAJOR -eq 3 -a $MINOR -lt 2 \\) -o \\\n            \\( $MAJOR -eq 3 -a $MINOR -eq 2 -a $PATCH -lt 15 \\) ]\n        then\n            PEER_GNUTLS=\"\"\n        else\n            PEER_GNUTLS=\" GnuTLS\"\n        fi\n    fi\nelse\n    PEER_GNUTLS=\"\"\nfi\n\n# default values for options\nMODES=\"tls1 tls1_1 tls1_2 dtls1 dtls1_2\"\nVERIFIES=\"NO YES\"\nTYPES=\"ECDSA RSA PSK\"\nFILTER=\"\"\nEXCLUDE='NULL\\|DES-CBC-\\|RC4\\|ARCFOUR' # avoid plain DES but keep 3DES-EDE-CBC (mbedTLS), DES-CBC3 (OpenSSL)\nVERBOSE=\"\"\nMEMCHECK=0\nPEERS=\"OpenSSL$PEER_GNUTLS mbedTLS\"\n\n# hidden option: skip DTLS with OpenSSL\n# (travis CI has a version that doesn't work for us)\n: ${OSSL_NO_DTLS:=0}\n\nprint_usage() {\n    echo \"Usage: $0\"\n    printf \"  -h|--help\\tPrint this help.\\n\"\n    printf \"  -f|--filter\\tOnly matching ciphersuites are tested (Default: '$FILTER')\\n\"\n    printf \"  -e|--exclude\\tMatching ciphersuites are excluded (Default: '$EXCLUDE')\\n\"\n    printf \"  -m|--modes\\tWhich modes to perform (Default: '$MODES')\\n\"\n    printf \"  -t|--types\\tWhich key exchange type to perform (Default: '$TYPES')\\n\"\n    printf \"  -V|--verify\\tWhich verification modes to perform (Default: '$VERIFIES')\\n\"\n    printf \"  -p|--peers\\tWhich peers to use (Default: '$PEERS')\\n\"\n    printf \"            \\tAlso available: GnuTLS (needs v3.2.15 or higher)\\n\"\n    printf \"  -M|--memcheck\\tCheck memory leaks and errors.\\n\"\n    printf \"  -v|--verbose\\tSet verbose output.\\n\"\n}\n\nget_options() {\n    while [ $# -gt 0 ]; do\n        case \"$1\" in\n            -f|--filter)\n                shift; FILTER=$1\n                ;;\n            -e|--exclude)\n                shift; EXCLUDE=$1\n                ;;\n            -m|--modes)\n                shift; MODES=$1\n                ;;\n            -t|--types)\n                shift; TYPES=$1\n                ;;\n            -V|--verify)\n                shift; VERIFIES=$1\n                ;;\n            -p|--peers)\n                shift; PEERS=$1\n                ;;\n            -v|--verbose)\n                VERBOSE=1\n                ;;\n            -M|--memcheck)\n                MEMCHECK=1\n                ;;\n            -h|--help)\n                print_usage\n                exit 0\n                ;;\n            *)\n                echo \"Unknown argument: '$1'\"\n                print_usage\n                exit 1\n                ;;\n        esac\n        shift\n    done\n\n    # sanitize some options (modes checked later)\n    VERIFIES=\"$( echo $VERIFIES | tr [a-z] [A-Z] )\"\n    TYPES=\"$( echo $TYPES | tr [a-z] [A-Z] )\"\n}\n\nlog() {\n  if [ \"X\" != \"X$VERBOSE\" ]; then\n    echo \"\"\n    echo \"$@\"\n  fi\n}\n\n# is_dtls <mode>\nis_dtls()\n{\n    test \"$1\" = \"dtls1\" -o \"$1\" = \"dtls1_2\"\n}\n\n# minor_ver <mode>\nminor_ver()\n{\n    case \"$1\" in\n        ssl3)\n            echo 0\n            ;;\n        tls1)\n            echo 1\n            ;;\n        tls1_1|dtls1)\n            echo 2\n            ;;\n        tls1_2|dtls1_2)\n            echo 3\n            ;;\n        *)\n            echo \"error: invalid mode: $MODE\" >&2\n            # exiting is no good here, typically called in a subshell\n            echo -1\n    esac\n}\n\nfilter()\n{\n  LIST=\"$1\"\n  NEW_LIST=\"\"\n\n  if is_dtls \"$MODE\"; then\n      EXCLMODE=\"$EXCLUDE\"'\\|RC4\\|ARCFOUR'\n  else\n      EXCLMODE=\"$EXCLUDE\"\n  fi\n\n  for i in $LIST;\n  do\n    NEW_LIST=\"$NEW_LIST $( echo \"$i\" | grep \"$FILTER\" | grep -v \"$EXCLMODE\" )\"\n  done\n\n  # normalize whitespace\n  echo \"$NEW_LIST\" | sed -e 's/[[:space:]][[:space:]]*/ /g' -e 's/^ //' -e 's/ $//'\n}\n\n# OpenSSL 1.0.1h with -Verify wants a ClientCertificate message even for\n# PSK ciphersuites with DTLS, which is incorrect, so disable them for now\ncheck_openssl_server_bug()\n{\n    if test \"X$VERIFY\" = \"XYES\" && is_dtls \"$MODE\" && \\\n        echo \"$1\" | grep \"^TLS-PSK\" >/dev/null;\n    then\n        SKIP_NEXT=\"YES\"\n    fi\n}\n\nfilter_ciphersuites()\n{\n    if [ \"X\" != \"X$FILTER\" -o \"X\" != \"X$EXCLUDE\" ];\n    then\n        # Ciphersuite for mbed TLS\n        M_CIPHERS=$( filter \"$M_CIPHERS\" )\n\n        # Ciphersuite for OpenSSL\n        O_CIPHERS=$( filter \"$O_CIPHERS\" )\n\n        # Ciphersuite for GnuTLS\n        G_CIPHERS=$( filter \"$G_CIPHERS\" )\n    fi\n\n    # OpenSSL 1.0.1h doesn't support DTLS 1.2\n    if [ `minor_ver \"$MODE\"` -ge 3 ] && is_dtls \"$MODE\"; then\n        O_CIPHERS=\"\"\n        case \"$PEER\" in\n            [Oo]pen*)\n                M_CIPHERS=\"\"\n                ;;\n        esac\n    fi\n\n    # For GnuTLS client -> mbed TLS server,\n    # we need to force IPv4 by connecting to 127.0.0.1 but then auth fails\n    if [ \"X$VERIFY\" = \"XYES\" ] && is_dtls \"$MODE\"; then\n        G_CIPHERS=\"\"\n    fi\n}\n\nreset_ciphersuites()\n{\n    M_CIPHERS=\"\"\n    O_CIPHERS=\"\"\n    G_CIPHERS=\"\"\n}\n\nadd_common_ciphersuites()\n{\n    case $TYPE in\n\n        \"ECDSA\")\n            if [ `minor_ver \"$MODE\"` -gt 0 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                       \\\n                    TLS-ECDHE-ECDSA-WITH-NULL-SHA           \\\n                    TLS-ECDHE-ECDSA-WITH-RC4-128-SHA        \\\n                    TLS-ECDHE-ECDSA-WITH-3DES-EDE-CBC-SHA   \\\n                    TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA    \\\n                    TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA    \\\n                    \"\n                G_CIPHERS=\"$G_CIPHERS                       \\\n                    +ECDHE-ECDSA:+NULL:+SHA1                \\\n                    +ECDHE-ECDSA:+ARCFOUR-128:+SHA1         \\\n                    +ECDHE-ECDSA:+3DES-CBC:+SHA1            \\\n                    +ECDHE-ECDSA:+AES-128-CBC:+SHA1         \\\n                    +ECDHE-ECDSA:+AES-256-CBC:+SHA1         \\\n                    \"\n                O_CIPHERS=\"$O_CIPHERS               \\\n                    ECDHE-ECDSA-NULL-SHA            \\\n                    ECDHE-ECDSA-RC4-SHA             \\\n                    ECDHE-ECDSA-DES-CBC3-SHA        \\\n                    ECDHE-ECDSA-AES128-SHA          \\\n                    ECDHE-ECDSA-AES256-SHA          \\\n                    \"\n            fi\n            if [ `minor_ver \"$MODE\"` -ge 3 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                               \\\n                    TLS-ECDHE-ECDSA-WITH-AES-128-CBC-SHA256         \\\n                    TLS-ECDHE-ECDSA-WITH-AES-256-CBC-SHA384         \\\n                    TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256         \\\n                    TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384         \\\n                    \"\n                G_CIPHERS=\"$G_CIPHERS                               \\\n                    +ECDHE-ECDSA:+AES-128-CBC:+SHA256               \\\n                    +ECDHE-ECDSA:+AES-256-CBC:+SHA384               \\\n                    +ECDHE-ECDSA:+AES-128-GCM:+AEAD                 \\\n                    +ECDHE-ECDSA:+AES-256-GCM:+AEAD                 \\\n                    \"\n                O_CIPHERS=\"$O_CIPHERS               \\\n                    ECDHE-ECDSA-AES128-SHA256       \\\n                    ECDHE-ECDSA-AES256-SHA384       \\\n                    ECDHE-ECDSA-AES128-GCM-SHA256   \\\n                    ECDHE-ECDSA-AES256-GCM-SHA384   \\\n                    \"\n            fi\n            ;;\n\n        \"RSA\")\n            M_CIPHERS=\"$M_CIPHERS                       \\\n                TLS-DHE-RSA-WITH-AES-128-CBC-SHA        \\\n                TLS-DHE-RSA-WITH-AES-256-CBC-SHA        \\\n                TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA   \\\n                TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA   \\\n                TLS-DHE-RSA-WITH-3DES-EDE-CBC-SHA       \\\n                TLS-RSA-WITH-AES-256-CBC-SHA            \\\n                TLS-RSA-WITH-CAMELLIA-256-CBC-SHA       \\\n                TLS-RSA-WITH-AES-128-CBC-SHA            \\\n                TLS-RSA-WITH-CAMELLIA-128-CBC-SHA       \\\n                TLS-RSA-WITH-3DES-EDE-CBC-SHA           \\\n                TLS-RSA-WITH-RC4-128-SHA                \\\n                TLS-RSA-WITH-RC4-128-MD5                \\\n                TLS-RSA-WITH-NULL-MD5                   \\\n                TLS-RSA-WITH-NULL-SHA                   \\\n                \"\n            G_CIPHERS=\"$G_CIPHERS                       \\\n                +DHE-RSA:+AES-128-CBC:+SHA1             \\\n                +DHE-RSA:+AES-256-CBC:+SHA1             \\\n                +DHE-RSA:+CAMELLIA-128-CBC:+SHA1        \\\n                +DHE-RSA:+CAMELLIA-256-CBC:+SHA1        \\\n                +DHE-RSA:+3DES-CBC:+SHA1                \\\n                +RSA:+AES-256-CBC:+SHA1                 \\\n                +RSA:+CAMELLIA-256-CBC:+SHA1            \\\n                +RSA:+AES-128-CBC:+SHA1                 \\\n                +RSA:+CAMELLIA-128-CBC:+SHA1            \\\n                +RSA:+3DES-CBC:+SHA1                    \\\n                +RSA:+ARCFOUR-128:+SHA1                 \\\n                +RSA:+ARCFOUR-128:+MD5                  \\\n                +RSA:+NULL:+MD5                         \\\n                +RSA:+NULL:+SHA1                        \\\n                \"\n            O_CIPHERS=\"$O_CIPHERS               \\\n                DHE-RSA-AES128-SHA              \\\n                DHE-RSA-AES256-SHA              \\\n                DHE-RSA-CAMELLIA128-SHA         \\\n                DHE-RSA-CAMELLIA256-SHA         \\\n                EDH-RSA-DES-CBC3-SHA            \\\n                AES256-SHA                      \\\n                CAMELLIA256-SHA                 \\\n                AES128-SHA                      \\\n                CAMELLIA128-SHA                 \\\n                DES-CBC3-SHA                    \\\n                RC4-SHA                         \\\n                RC4-MD5                         \\\n                NULL-MD5                        \\\n                NULL-SHA                        \\\n                \"\n            if [ `minor_ver \"$MODE\"` -gt 0 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                       \\\n                    TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA      \\\n                    TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA      \\\n                    TLS-ECDHE-RSA-WITH-3DES-EDE-CBC-SHA     \\\n                    TLS-ECDHE-RSA-WITH-RC4-128-SHA          \\\n                    TLS-ECDHE-RSA-WITH-NULL-SHA             \\\n                    \"\n                G_CIPHERS=\"$G_CIPHERS                       \\\n                    +ECDHE-RSA:+AES-128-CBC:+SHA1           \\\n                    +ECDHE-RSA:+AES-256-CBC:+SHA1           \\\n                    +ECDHE-RSA:+3DES-CBC:+SHA1              \\\n                    +ECDHE-RSA:+ARCFOUR-128:+SHA1           \\\n                    +ECDHE-RSA:+NULL:+SHA1                  \\\n                    \"\n                O_CIPHERS=\"$O_CIPHERS               \\\n                    ECDHE-RSA-AES256-SHA            \\\n                    ECDHE-RSA-AES128-SHA            \\\n                    ECDHE-RSA-DES-CBC3-SHA          \\\n                    ECDHE-RSA-RC4-SHA               \\\n                    ECDHE-RSA-NULL-SHA              \\\n                    \"\n            fi\n            if [ `minor_ver \"$MODE\"` -ge 3 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                       \\\n                    TLS-RSA-WITH-AES-128-CBC-SHA256         \\\n                    TLS-DHE-RSA-WITH-AES-128-CBC-SHA256     \\\n                    TLS-RSA-WITH-AES-256-CBC-SHA256         \\\n                    TLS-DHE-RSA-WITH-AES-256-CBC-SHA256     \\\n                    TLS-ECDHE-RSA-WITH-AES-128-CBC-SHA256   \\\n                    TLS-ECDHE-RSA-WITH-AES-256-CBC-SHA384   \\\n                    TLS-RSA-WITH-AES-128-GCM-SHA256         \\\n                    TLS-RSA-WITH-AES-256-GCM-SHA384         \\\n                    TLS-DHE-RSA-WITH-AES-128-GCM-SHA256     \\\n                    TLS-DHE-RSA-WITH-AES-256-GCM-SHA384     \\\n                    TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256   \\\n                    TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384   \\\n                    \"\n                G_CIPHERS=\"$G_CIPHERS                       \\\n                    +RSA:+AES-128-CBC:+SHA256               \\\n                    +DHE-RSA:+AES-128-CBC:+SHA256           \\\n                    +RSA:+AES-256-CBC:+SHA256               \\\n                    +DHE-RSA:+AES-256-CBC:+SHA256           \\\n                    +ECDHE-RSA:+AES-128-CBC:+SHA256         \\\n                    +ECDHE-RSA:+AES-256-CBC:+SHA384         \\\n                    +RSA:+AES-128-GCM:+AEAD                 \\\n                    +RSA:+AES-256-GCM:+AEAD                 \\\n                    +DHE-RSA:+AES-128-GCM:+AEAD             \\\n                    +DHE-RSA:+AES-256-GCM:+AEAD             \\\n                    +ECDHE-RSA:+AES-128-GCM:+AEAD           \\\n                    +ECDHE-RSA:+AES-256-GCM:+AEAD           \\\n                    \"\n                O_CIPHERS=\"$O_CIPHERS           \\\n                    NULL-SHA256                 \\\n                    AES128-SHA256               \\\n                    DHE-RSA-AES128-SHA256       \\\n                    AES256-SHA256               \\\n                    DHE-RSA-AES256-SHA256       \\\n                    ECDHE-RSA-AES128-SHA256     \\\n                    ECDHE-RSA-AES256-SHA384     \\\n                    AES128-GCM-SHA256           \\\n                    DHE-RSA-AES128-GCM-SHA256   \\\n                    AES256-GCM-SHA384           \\\n                    DHE-RSA-AES256-GCM-SHA384   \\\n                    ECDHE-RSA-AES128-GCM-SHA256 \\\n                    ECDHE-RSA-AES256-GCM-SHA384 \\\n                    \"\n            fi\n            ;;\n\n        \"PSK\")\n            M_CIPHERS=\"$M_CIPHERS                       \\\n                TLS-PSK-WITH-RC4-128-SHA                \\\n                TLS-PSK-WITH-3DES-EDE-CBC-SHA           \\\n                TLS-PSK-WITH-AES-128-CBC-SHA            \\\n                TLS-PSK-WITH-AES-256-CBC-SHA            \\\n                \"\n            G_CIPHERS=\"$G_CIPHERS                       \\\n                +PSK:+ARCFOUR-128:+SHA1                 \\\n                +PSK:+3DES-CBC:+SHA1                    \\\n                +PSK:+AES-128-CBC:+SHA1                 \\\n                +PSK:+AES-256-CBC:+SHA1                 \\\n                \"\n            O_CIPHERS=\"$O_CIPHERS               \\\n                PSK-RC4-SHA                     \\\n                PSK-3DES-EDE-CBC-SHA            \\\n                PSK-AES128-CBC-SHA              \\\n                PSK-AES256-CBC-SHA              \\\n                \"\n            ;;\n    esac\n}\n\nadd_openssl_ciphersuites()\n{\n    case $TYPE in\n\n        \"ECDSA\")\n            if [ `minor_ver \"$MODE\"` -gt 0 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                       \\\n                    TLS-ECDH-ECDSA-WITH-NULL-SHA            \\\n                    TLS-ECDH-ECDSA-WITH-RC4-128-SHA         \\\n                    TLS-ECDH-ECDSA-WITH-3DES-EDE-CBC-SHA    \\\n                    TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA     \\\n                    TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA     \\\n                    \"\n                O_CIPHERS=\"$O_CIPHERS               \\\n                    ECDH-ECDSA-NULL-SHA             \\\n                    ECDH-ECDSA-RC4-SHA              \\\n                    ECDH-ECDSA-DES-CBC3-SHA         \\\n                    ECDH-ECDSA-AES128-SHA           \\\n                    ECDH-ECDSA-AES256-SHA           \\\n                    \"\n            fi\n            if [ `minor_ver \"$MODE\"` -ge 3 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                               \\\n                    TLS-ECDH-ECDSA-WITH-AES-128-CBC-SHA256          \\\n                    TLS-ECDH-ECDSA-WITH-AES-256-CBC-SHA384          \\\n                    TLS-ECDH-ECDSA-WITH-AES-128-GCM-SHA256          \\\n                    TLS-ECDH-ECDSA-WITH-AES-256-GCM-SHA384          \\\n                    \"\n                O_CIPHERS=\"$O_CIPHERS               \\\n                    ECDH-ECDSA-AES128-SHA256        \\\n                    ECDH-ECDSA-AES256-SHA384        \\\n                    ECDH-ECDSA-AES128-GCM-SHA256    \\\n                    ECDH-ECDSA-AES256-GCM-SHA384    \\\n                    \"\n            fi\n            ;;\n\n        \"RSA\")\n            M_CIPHERS=\"$M_CIPHERS                       \\\n                TLS-RSA-WITH-DES-CBC-SHA                \\\n                TLS-DHE-RSA-WITH-DES-CBC-SHA            \\\n                \"\n            O_CIPHERS=\"$O_CIPHERS               \\\n                DES-CBC-SHA                     \\\n                EDH-RSA-DES-CBC-SHA             \\\n                \"\n            ;;\n\n        \"PSK\")\n            ;;\n    esac\n}\n\nadd_gnutls_ciphersuites()\n{\n    case $TYPE in\n\n        \"ECDSA\")\n            if [ `minor_ver \"$MODE\"` -ge 3 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                               \\\n                    TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-CBC-SHA256    \\\n                    TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-CBC-SHA384    \\\n                    TLS-ECDHE-ECDSA-WITH-CAMELLIA-128-GCM-SHA256    \\\n                    TLS-ECDHE-ECDSA-WITH-CAMELLIA-256-GCM-SHA384    \\\n                   \"\n                G_CIPHERS=\"$G_CIPHERS                               \\\n                    +ECDHE-ECDSA:+CAMELLIA-128-CBC:+SHA256          \\\n                    +ECDHE-ECDSA:+CAMELLIA-256-CBC:+SHA384          \\\n                    +ECDHE-ECDSA:+CAMELLIA-128-GCM:+AEAD            \\\n                    +ECDHE-ECDSA:+CAMELLIA-256-GCM:+AEAD            \\\n                   \"\n            fi\n            ;;\n\n        \"RSA\")\n            if [ `minor_ver \"$MODE\"` -gt 0 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                           \\\n                    TLS-RSA-WITH-NULL-SHA256                    \\\n                    \"\n                G_CIPHERS=\"$G_CIPHERS                           \\\n                    +RSA:+NULL:+SHA256                          \\\n                    \"\n            fi\n            if [ `minor_ver \"$MODE\"` -ge 3 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                           \\\n                    TLS-ECDHE-RSA-WITH-CAMELLIA-128-CBC-SHA256  \\\n                    TLS-ECDHE-RSA-WITH-CAMELLIA-256-CBC-SHA384  \\\n                    TLS-RSA-WITH-CAMELLIA-128-CBC-SHA256        \\\n                    TLS-RSA-WITH-CAMELLIA-256-CBC-SHA256        \\\n                    TLS-DHE-RSA-WITH-CAMELLIA-128-CBC-SHA256    \\\n                    TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA256    \\\n                    TLS-ECDHE-RSA-WITH-CAMELLIA-128-GCM-SHA256  \\\n                    TLS-ECDHE-RSA-WITH-CAMELLIA-256-GCM-SHA384  \\\n                    TLS-DHE-RSA-WITH-CAMELLIA-128-GCM-SHA256    \\\n                    TLS-DHE-RSA-WITH-CAMELLIA-256-GCM-SHA384    \\\n                    TLS-RSA-WITH-CAMELLIA-128-GCM-SHA256        \\\n                    TLS-RSA-WITH-CAMELLIA-256-GCM-SHA384        \\\n                    \"\n                G_CIPHERS=\"$G_CIPHERS                           \\\n                    +ECDHE-RSA:+CAMELLIA-128-CBC:+SHA256        \\\n                    +ECDHE-RSA:+CAMELLIA-256-CBC:+SHA384        \\\n                    +RSA:+CAMELLIA-128-CBC:+SHA256              \\\n                    +RSA:+CAMELLIA-256-CBC:+SHA256              \\\n                    +DHE-RSA:+CAMELLIA-128-CBC:+SHA256          \\\n                    +DHE-RSA:+CAMELLIA-256-CBC:+SHA256          \\\n                    +ECDHE-RSA:+CAMELLIA-128-GCM:+AEAD          \\\n                    +ECDHE-RSA:+CAMELLIA-256-GCM:+AEAD          \\\n                    +DHE-RSA:+CAMELLIA-128-GCM:+AEAD            \\\n                    +DHE-RSA:+CAMELLIA-256-GCM:+AEAD            \\\n                    +RSA:+CAMELLIA-128-GCM:+AEAD                \\\n                    +RSA:+CAMELLIA-256-GCM:+AEAD                \\\n                    \"\n            fi\n            ;;\n\n        \"PSK\")\n            M_CIPHERS=\"$M_CIPHERS                               \\\n                TLS-DHE-PSK-WITH-3DES-EDE-CBC-SHA               \\\n                TLS-DHE-PSK-WITH-AES-128-CBC-SHA                \\\n                TLS-DHE-PSK-WITH-AES-256-CBC-SHA                \\\n                TLS-DHE-PSK-WITH-RC4-128-SHA                    \\\n                \"\n            G_CIPHERS=\"$G_CIPHERS                               \\\n                +DHE-PSK:+3DES-CBC:+SHA1                        \\\n                +DHE-PSK:+AES-128-CBC:+SHA1                     \\\n                +DHE-PSK:+AES-256-CBC:+SHA1                     \\\n                +DHE-PSK:+ARCFOUR-128:+SHA1                     \\\n                \"\n            if [ `minor_ver \"$MODE\"` -gt 0 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                           \\\n                    TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA          \\\n                    TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA          \\\n                    TLS-ECDHE-PSK-WITH-3DES-EDE-CBC-SHA         \\\n                    TLS-ECDHE-PSK-WITH-RC4-128-SHA              \\\n                    TLS-RSA-PSK-WITH-3DES-EDE-CBC-SHA           \\\n                    TLS-RSA-PSK-WITH-AES-256-CBC-SHA            \\\n                    TLS-RSA-PSK-WITH-AES-128-CBC-SHA            \\\n                    TLS-RSA-PSK-WITH-RC4-128-SHA                \\\n                    \"\n                G_CIPHERS=\"$G_CIPHERS                           \\\n                    +ECDHE-PSK:+3DES-CBC:+SHA1                  \\\n                    +ECDHE-PSK:+AES-128-CBC:+SHA1               \\\n                    +ECDHE-PSK:+AES-256-CBC:+SHA1               \\\n                    +ECDHE-PSK:+ARCFOUR-128:+SHA1               \\\n                    +RSA-PSK:+3DES-CBC:+SHA1                    \\\n                    +RSA-PSK:+AES-256-CBC:+SHA1                 \\\n                    +RSA-PSK:+AES-128-CBC:+SHA1                 \\\n                    +RSA-PSK:+ARCFOUR-128:+SHA1                 \\\n                    \"\n            fi\n            if [ `minor_ver \"$MODE\"` -ge 3 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                           \\\n                    TLS-ECDHE-PSK-WITH-AES-256-CBC-SHA384       \\\n                    TLS-ECDHE-PSK-WITH-CAMELLIA-256-CBC-SHA384  \\\n                    TLS-ECDHE-PSK-WITH-AES-128-CBC-SHA256       \\\n                    TLS-ECDHE-PSK-WITH-CAMELLIA-128-CBC-SHA256  \\\n                    TLS-ECDHE-PSK-WITH-NULL-SHA384              \\\n                    TLS-ECDHE-PSK-WITH-NULL-SHA256              \\\n                    TLS-PSK-WITH-AES-128-CBC-SHA256             \\\n                    TLS-PSK-WITH-AES-256-CBC-SHA384             \\\n                    TLS-DHE-PSK-WITH-AES-128-CBC-SHA256         \\\n                    TLS-DHE-PSK-WITH-AES-256-CBC-SHA384         \\\n                    TLS-PSK-WITH-NULL-SHA256                    \\\n                    TLS-PSK-WITH-NULL-SHA384                    \\\n                    TLS-DHE-PSK-WITH-NULL-SHA256                \\\n                    TLS-DHE-PSK-WITH-NULL-SHA384                \\\n                    TLS-RSA-PSK-WITH-AES-256-CBC-SHA384         \\\n                    TLS-RSA-PSK-WITH-AES-128-CBC-SHA256         \\\n                    TLS-RSA-PSK-WITH-NULL-SHA256                \\\n                    TLS-RSA-PSK-WITH-NULL-SHA384                \\\n                    TLS-DHE-PSK-WITH-CAMELLIA-128-CBC-SHA256    \\\n                    TLS-DHE-PSK-WITH-CAMELLIA-256-CBC-SHA384    \\\n                    TLS-PSK-WITH-CAMELLIA-128-CBC-SHA256        \\\n                    TLS-PSK-WITH-CAMELLIA-256-CBC-SHA384        \\\n                    TLS-RSA-PSK-WITH-CAMELLIA-256-CBC-SHA384    \\\n                    TLS-RSA-PSK-WITH-CAMELLIA-128-CBC-SHA256    \\\n                    TLS-PSK-WITH-AES-128-GCM-SHA256             \\\n                    TLS-PSK-WITH-AES-256-GCM-SHA384             \\\n                    TLS-DHE-PSK-WITH-AES-128-GCM-SHA256         \\\n                    TLS-DHE-PSK-WITH-AES-256-GCM-SHA384         \\\n                    TLS-RSA-PSK-WITH-CAMELLIA-128-GCM-SHA256    \\\n                    TLS-RSA-PSK-WITH-CAMELLIA-256-GCM-SHA384    \\\n                    TLS-PSK-WITH-CAMELLIA-128-GCM-SHA256        \\\n                    TLS-PSK-WITH-CAMELLIA-256-GCM-SHA384        \\\n                    TLS-DHE-PSK-WITH-CAMELLIA-128-GCM-SHA256    \\\n                    TLS-DHE-PSK-WITH-CAMELLIA-256-GCM-SHA384    \\\n                    TLS-RSA-PSK-WITH-AES-256-GCM-SHA384         \\\n                    TLS-RSA-PSK-WITH-AES-128-GCM-SHA256         \\\n                    \"\n                G_CIPHERS=\"$G_CIPHERS                           \\\n                    +ECDHE-PSK:+AES-256-CBC:+SHA384             \\\n                    +ECDHE-PSK:+CAMELLIA-256-CBC:+SHA384        \\\n                    +ECDHE-PSK:+AES-128-CBC:+SHA256             \\\n                    +ECDHE-PSK:+CAMELLIA-128-CBC:+SHA256        \\\n                    +PSK:+AES-128-CBC:+SHA256                   \\\n                    +PSK:+AES-256-CBC:+SHA384                   \\\n                    +DHE-PSK:+AES-128-CBC:+SHA256               \\\n                    +DHE-PSK:+AES-256-CBC:+SHA384               \\\n                    +RSA-PSK:+AES-256-CBC:+SHA384               \\\n                    +RSA-PSK:+AES-128-CBC:+SHA256               \\\n                    +DHE-PSK:+CAMELLIA-128-CBC:+SHA256          \\\n                    +DHE-PSK:+CAMELLIA-256-CBC:+SHA384          \\\n                    +PSK:+CAMELLIA-128-CBC:+SHA256              \\\n                    +PSK:+CAMELLIA-256-CBC:+SHA384              \\\n                    +RSA-PSK:+CAMELLIA-256-CBC:+SHA384          \\\n                    +RSA-PSK:+CAMELLIA-128-CBC:+SHA256          \\\n                    +PSK:+AES-128-GCM:+AEAD                     \\\n                    +PSK:+AES-256-GCM:+AEAD                     \\\n                    +DHE-PSK:+AES-128-GCM:+AEAD                 \\\n                    +DHE-PSK:+AES-256-GCM:+AEAD                 \\\n                    +RSA-PSK:+CAMELLIA-128-GCM:+AEAD            \\\n                    +RSA-PSK:+CAMELLIA-256-GCM:+AEAD            \\\n                    +PSK:+CAMELLIA-128-GCM:+AEAD                \\\n                    +PSK:+CAMELLIA-256-GCM:+AEAD                \\\n                    +DHE-PSK:+CAMELLIA-128-GCM:+AEAD            \\\n                    +DHE-PSK:+CAMELLIA-256-GCM:+AEAD            \\\n                    +RSA-PSK:+AES-256-GCM:+AEAD                 \\\n                    +RSA-PSK:+AES-128-GCM:+AEAD                 \\\n                    +ECDHE-PSK:+NULL:+SHA384                    \\\n                    +ECDHE-PSK:+NULL:+SHA256                    \\\n                    +PSK:+NULL:+SHA256                          \\\n                    +PSK:+NULL:+SHA384                          \\\n                    +DHE-PSK:+NULL:+SHA256                      \\\n                    +DHE-PSK:+NULL:+SHA384                      \\\n                    +RSA-PSK:+NULL:+SHA256                      \\\n                    +RSA-PSK:+NULL:+SHA384                      \\\n                    \"\n            fi\n            ;;\n    esac\n}\n\nadd_mbedtls_ciphersuites()\n{\n    case $TYPE in\n\n        \"ECDSA\")\n            if [ `minor_ver \"$MODE\"` -gt 0 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                               \\\n                    TLS-ECDH-ECDSA-WITH-CAMELLIA-128-CBC-SHA256     \\\n                    TLS-ECDH-ECDSA-WITH-CAMELLIA-256-CBC-SHA384     \\\n                    \"\n            fi\n            if [ `minor_ver \"$MODE\"` -ge 3 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                               \\\n                    TLS-ECDH-ECDSA-WITH-CAMELLIA-128-GCM-SHA256     \\\n                    TLS-ECDH-ECDSA-WITH-CAMELLIA-256-GCM-SHA384     \\\n                    TLS-ECDHE-ECDSA-WITH-AES-128-CCM                \\\n                    TLS-ECDHE-ECDSA-WITH-AES-256-CCM                \\\n                    TLS-ECDHE-ECDSA-WITH-AES-128-CCM-8              \\\n                    TLS-ECDHE-ECDSA-WITH-AES-256-CCM-8              \\\n                    \"\n            fi\n            ;;\n\n        \"RSA\")\n            if [ \"$MODE\" = \"tls1_2\" ];\n            then\n                M_CIPHERS=\"$M_CIPHERS                               \\\n                    TLS-RSA-WITH-AES-128-CCM                        \\\n                    TLS-RSA-WITH-AES-256-CCM                        \\\n                    TLS-DHE-RSA-WITH-AES-128-CCM                    \\\n                    TLS-DHE-RSA-WITH-AES-256-CCM                    \\\n                    TLS-RSA-WITH-AES-128-CCM-8                      \\\n                    TLS-RSA-WITH-AES-256-CCM-8                      \\\n                    TLS-DHE-RSA-WITH-AES-128-CCM-8                  \\\n                    TLS-DHE-RSA-WITH-AES-256-CCM-8                  \\\n                    \"\n            fi\n            ;;\n\n        \"PSK\")\n            # *PSK-NULL-SHA suites supported by GnuTLS 3.3.5 but not 3.2.15\n            M_CIPHERS=\"$M_CIPHERS                        \\\n                TLS-PSK-WITH-NULL-SHA                    \\\n                TLS-DHE-PSK-WITH-NULL-SHA                \\\n                \"\n            if [ `minor_ver \"$MODE\"` -gt 0 ]\n            then\n                M_CIPHERS=\"$M_CIPHERS                    \\\n                    TLS-ECDHE-PSK-WITH-NULL-SHA          \\\n                    TLS-RSA-PSK-WITH-NULL-SHA            \\\n                    \"\n            fi\n            if [ \"$MODE\" = \"tls1_2\" ];\n            then\n                M_CIPHERS=\"$M_CIPHERS                               \\\n                    TLS-PSK-WITH-AES-128-CCM                        \\\n                    TLS-PSK-WITH-AES-256-CCM                        \\\n                    TLS-DHE-PSK-WITH-AES-128-CCM                    \\\n                    TLS-DHE-PSK-WITH-AES-256-CCM                    \\\n                    TLS-PSK-WITH-AES-128-CCM-8                      \\\n                    TLS-PSK-WITH-AES-256-CCM-8                      \\\n                    TLS-DHE-PSK-WITH-AES-128-CCM-8                  \\\n                    TLS-DHE-PSK-WITH-AES-256-CCM-8                  \\\n                    \"\n            fi\n            ;;\n    esac\n}\n\nsetup_arguments()\n{\n    G_MODE=\"\"\n    case \"$MODE\" in\n        \"ssl3\")\n            G_PRIO_MODE=\"+VERS-SSL3.0\"\n            ;;\n        \"tls1\")\n            G_PRIO_MODE=\"+VERS-TLS1.0\"\n            ;;\n        \"tls1_1\")\n            G_PRIO_MODE=\"+VERS-TLS1.1\"\n            ;;\n        \"tls1_2\")\n            G_PRIO_MODE=\"+VERS-TLS1.2\"\n            ;;\n        \"dtls1\")\n            G_PRIO_MODE=\"+VERS-DTLS1.0\"\n            G_MODE=\"-u\"\n            ;;\n        \"dtls1_2\")\n            G_PRIO_MODE=\"+VERS-DTLS1.2\"\n            G_MODE=\"-u\"\n            ;;\n        *)\n            echo \"error: invalid mode: $MODE\" >&2\n            exit 1;\n    esac\n\n    M_SERVER_ARGS=\"server_port=$PORT server_addr=0.0.0.0 force_version=$MODE arc4=1\"\n    O_SERVER_ARGS=\"-accept $PORT -cipher NULL,ALL -$MODE -dhparam data_files/dhparams.pem\"\n    G_SERVER_ARGS=\"-p $PORT --http $G_MODE\"\n    G_SERVER_PRIO=\"NORMAL:+ARCFOUR-128:+NULL:+MD5:+PSK:+DHE-PSK:+ECDHE-PSK:+RSA-PSK:-VERS-TLS-ALL:$G_PRIO_MODE\"\n\n    # with OpenSSL 1.0.1h, -www, -WWW and -HTTP break DTLS handshakes\n    if is_dtls \"$MODE\"; then\n        O_SERVER_ARGS=\"$O_SERVER_ARGS\"\n    else\n        O_SERVER_ARGS=\"$O_SERVER_ARGS -www\"\n    fi\n\n    M_CLIENT_ARGS=\"server_port=$PORT server_addr=127.0.0.1 force_version=$MODE\"\n    O_CLIENT_ARGS=\"-connect localhost:$PORT -$MODE\"\n    G_CLIENT_ARGS=\"-p $PORT --debug 3 $G_MODE\"\n    G_CLIENT_PRIO=\"NONE:$G_PRIO_MODE:+COMP-NULL:+CURVE-ALL:+SIGN-ALL\"\n\n    if [ \"X$VERIFY\" = \"XYES\" ];\n    then\n        M_SERVER_ARGS=\"$M_SERVER_ARGS ca_file=data_files/test-ca_cat12.crt auth_mode=required\"\n        O_SERVER_ARGS=\"$O_SERVER_ARGS -CAfile data_files/test-ca_cat12.crt -Verify 10\"\n        G_SERVER_ARGS=\"$G_SERVER_ARGS --x509cafile data_files/test-ca_cat12.crt --require-client-cert\"\n\n        M_CLIENT_ARGS=\"$M_CLIENT_ARGS ca_file=data_files/test-ca_cat12.crt auth_mode=required\"\n        O_CLIENT_ARGS=\"$O_CLIENT_ARGS -CAfile data_files/test-ca_cat12.crt -verify 10\"\n        G_CLIENT_ARGS=\"$G_CLIENT_ARGS --x509cafile data_files/test-ca_cat12.crt\"\n    else\n        # don't request a client cert at all\n        M_SERVER_ARGS=\"$M_SERVER_ARGS ca_file=none auth_mode=none\"\n        G_SERVER_ARGS=\"$G_SERVER_ARGS --disable-client-cert\"\n\n        M_CLIENT_ARGS=\"$M_CLIENT_ARGS ca_file=none auth_mode=none\"\n        O_CLIENT_ARGS=\"$O_CLIENT_ARGS\"\n        G_CLIENT_ARGS=\"$G_CLIENT_ARGS --insecure\"\n    fi\n\n    case $TYPE in\n        \"ECDSA\")\n            M_SERVER_ARGS=\"$M_SERVER_ARGS crt_file=data_files/server5.crt key_file=data_files/server5.key\"\n            O_SERVER_ARGS=\"$O_SERVER_ARGS -cert data_files/server5.crt -key data_files/server5.key\"\n            G_SERVER_ARGS=\"$G_SERVER_ARGS --x509certfile data_files/server5.crt --x509keyfile data_files/server5.key\"\n\n            if [ \"X$VERIFY\" = \"XYES\" ]; then\n                M_CLIENT_ARGS=\"$M_CLIENT_ARGS crt_file=data_files/server6.crt key_file=data_files/server6.key\"\n                O_CLIENT_ARGS=\"$O_CLIENT_ARGS -cert data_files/server6.crt -key data_files/server6.key\"\n                G_CLIENT_ARGS=\"$G_CLIENT_ARGS --x509certfile data_files/server6.crt --x509keyfile data_files/server6.key\"\n            else\n                M_CLIENT_ARGS=\"$M_CLIENT_ARGS crt_file=none key_file=none\"\n            fi\n            ;;\n\n        \"RSA\")\n            M_SERVER_ARGS=\"$M_SERVER_ARGS crt_file=data_files/server2.crt key_file=data_files/server2.key\"\n            O_SERVER_ARGS=\"$O_SERVER_ARGS -cert data_files/server2.crt -key data_files/server2.key\"\n            G_SERVER_ARGS=\"$G_SERVER_ARGS --x509certfile data_files/server2.crt --x509keyfile data_files/server2.key\"\n\n            if [ \"X$VERIFY\" = \"XYES\" ]; then\n                M_CLIENT_ARGS=\"$M_CLIENT_ARGS crt_file=data_files/server1.crt key_file=data_files/server1.key\"\n                O_CLIENT_ARGS=\"$O_CLIENT_ARGS -cert data_files/server1.crt -key data_files/server1.key\"\n                G_CLIENT_ARGS=\"$G_CLIENT_ARGS --x509certfile data_files/server1.crt --x509keyfile data_files/server1.key\"\n            else\n                M_CLIENT_ARGS=\"$M_CLIENT_ARGS crt_file=none key_file=none\"\n            fi\n\n            # Allow SHA-1. It's disabled by default for security reasons but\n            # our tests still use certificates signed with it.\n            M_SERVER_ARGS=\"$M_SERVER_ARGS allow_sha1=1\"\n            M_CLIENT_ARGS=\"$M_CLIENT_ARGS allow_sha1=1\"\n            ;;\n\n        \"PSK\")\n            # give RSA-PSK-capable server a RSA cert\n            # (should be a separate type, but harder to close with openssl)\n            M_SERVER_ARGS=\"$M_SERVER_ARGS psk=6162636465666768696a6b6c6d6e6f70 ca_file=none crt_file=data_files/server2.crt key_file=data_files/server2.key\"\n            O_SERVER_ARGS=\"$O_SERVER_ARGS -psk 6162636465666768696a6b6c6d6e6f70 -nocert\"\n            G_SERVER_ARGS=\"$G_SERVER_ARGS --x509certfile data_files/server2.crt --x509keyfile data_files/server2.key --pskpasswd data_files/passwd.psk\"\n\n            M_CLIENT_ARGS=\"$M_CLIENT_ARGS psk=6162636465666768696a6b6c6d6e6f70 crt_file=none key_file=none\"\n            O_CLIENT_ARGS=\"$O_CLIENT_ARGS -psk 6162636465666768696a6b6c6d6e6f70\"\n            G_CLIENT_ARGS=\"$G_CLIENT_ARGS --pskusername Client_identity --pskkey=6162636465666768696a6b6c6d6e6f70\"\n\n            # Allow SHA-1. It's disabled by default for security reasons but\n            # our tests still use certificates signed with it.\n            M_SERVER_ARGS=\"$M_SERVER_ARGS allow_sha1=1\"\n            M_CLIENT_ARGS=\"$M_CLIENT_ARGS allow_sha1=1\"\n            ;;\n    esac\n}\n\n# is_mbedtls <cmd_line>\nis_mbedtls() {\n    echo \"$1\" | grep 'ssl_server2\\|ssl_client2' > /dev/null\n}\n\n# has_mem_err <log_file_name>\nhas_mem_err() {\n    if ( grep -F 'All heap blocks were freed -- no leaks are possible' \"$1\" &&\n         grep -F 'ERROR SUMMARY: 0 errors from 0 contexts' \"$1\" ) > /dev/null\n    then\n        return 1 # false: does not have errors\n    else\n        return 0 # true: has errors\n    fi\n}\n\n# start_server <name>\n# also saves name and command\nstart_server() {\n    case $1 in\n        [Oo]pen*)\n            SERVER_CMD=\"$OPENSSL_CMD s_server $O_SERVER_ARGS\"\n            ;;\n        [Gg]nu*)\n            SERVER_CMD=\"$GNUTLS_SERV $G_SERVER_ARGS --priority $G_SERVER_PRIO\"\n            ;;\n        mbed*)\n            SERVER_CMD=\"$M_SRV $M_SERVER_ARGS\"\n            if [ \"$MEMCHECK\" -gt 0 ]; then\n                SERVER_CMD=\"valgrind --leak-check=full $SERVER_CMD\"\n            fi\n            ;;\n        *)\n            echo \"error: invalid server name: $1\" >&2\n            exit 1\n            ;;\n    esac\n    SERVER_NAME=$1\n\n    log \"$SERVER_CMD\"\n    echo \"$SERVER_CMD\" > $SRV_OUT\n    # for servers without -www or equivalent\n    while :; do echo bla; sleep 1; done | $SERVER_CMD >> $SRV_OUT 2>&1 &\n    PROCESS_ID=$!\n\n    sleep 1\n}\n\n# terminate the running server\nstop_server() {\n    kill $PROCESS_ID 2>/dev/null\n    wait $PROCESS_ID 2>/dev/null\n\n    if [ \"$MEMCHECK\" -gt 0 ]; then\n        if is_mbedtls \"$SERVER_CMD\" && has_mem_err $SRV_OUT; then\n            echo \"  ! Server had memory errors\"\n            SRVMEM=$(( $SRVMEM + 1 ))\n            return\n        fi\n    fi\n\n    rm -f $SRV_OUT\n}\n\n# kill the running server (used when killed by signal)\ncleanup() {\n    rm -f $SRV_OUT $CLI_OUT\n    kill $PROCESS_ID >/dev/null 2>&1\n    kill $WATCHDOG_PID >/dev/null 2>&1\n    exit 1\n}\n\n# wait for client to terminate and set EXIT\n# must be called right after starting the client\nwait_client_done() {\n    CLI_PID=$!\n\n    ( sleep \"$DOG_DELAY\"; echo \"TIMEOUT\" >> $CLI_OUT; kill $CLI_PID ) &\n    WATCHDOG_PID=$!\n\n    wait $CLI_PID\n    EXIT=$?\n\n    kill $WATCHDOG_PID\n    wait $WATCHDOG_PID\n\n    echo \"EXIT: $EXIT\" >> $CLI_OUT\n}\n\n# run_client <name> <cipher>\nrun_client() {\n    # announce what we're going to do\n    TESTS=$(( $TESTS + 1 ))\n    VERIF=$(echo $VERIFY | tr '[:upper:]' '[:lower:]')\n    TITLE=\"`echo $1 | head -c1`->`echo $SERVER_NAME | head -c1`\"\n    TITLE=\"$TITLE $MODE,$VERIF $2\"\n    printf \"$TITLE \"\n    LEN=$(( 72 - `echo \"$TITLE\" | wc -c` ))\n    for i in `seq 1 $LEN`; do printf '.'; done; printf ' '\n\n    # should we skip?\n    if [ \"X$SKIP_NEXT\" = \"XYES\" ]; then\n        SKIP_NEXT=\"NO\"\n        echo \"SKIP\"\n        SKIPPED=$(( $SKIPPED + 1 ))\n        return\n    fi\n\n    # run the command and interpret result\n    case $1 in\n        [Oo]pen*)\n            CLIENT_CMD=\"$OPENSSL_CMD s_client $O_CLIENT_ARGS -cipher $2\"\n            log \"$CLIENT_CMD\"\n            echo \"$CLIENT_CMD\" > $CLI_OUT\n            printf 'GET HTTP/1.0\\r\\n\\r\\n' | $CLIENT_CMD >> $CLI_OUT 2>&1 &\n            wait_client_done\n\n            if [ $EXIT -eq 0 ]; then\n                RESULT=0\n            else\n                # If the cipher isn't supported... \n                if grep 'Cipher is (NONE)' $CLI_OUT >/dev/null; then\n                    RESULT=1\n                else\n                    RESULT=2\n                fi\n            fi\n            ;;\n\n        [Gg]nu*)\n            # need to force IPv4 with UDP, but keep localhost for auth\n            if is_dtls \"$MODE\"; then\n                G_HOST=\"127.0.0.1\"\n            else\n                G_HOST=\"localhost\"\n            fi\n            CLIENT_CMD=\"$GNUTLS_CLI $G_CLIENT_ARGS --priority $G_PRIO_MODE:$2 $G_HOST\"\n            log \"$CLIENT_CMD\"\n            echo \"$CLIENT_CMD\" > $CLI_OUT\n            printf 'GET HTTP/1.0\\r\\n\\r\\n' | $CLIENT_CMD >> $CLI_OUT 2>&1 &\n            wait_client_done\n\n            if [ $EXIT -eq 0 ]; then\n                RESULT=0\n            else\n                RESULT=2\n                # interpret early failure, with a handshake_failure alert\n                # before the server hello, as \"no ciphersuite in common\"\n                if grep -F 'Received alert [40]: Handshake failed' $CLI_OUT; then\n                    if grep -i 'SERVER HELLO .* was received' $CLI_OUT; then :\n                    else\n                        RESULT=1\n                    fi\n                fi >/dev/null\n            fi\n            ;;\n\n        mbed*)\n            CLIENT_CMD=\"$M_CLI $M_CLIENT_ARGS force_ciphersuite=$2\"\n            if [ \"$MEMCHECK\" -gt 0 ]; then\n                CLIENT_CMD=\"valgrind --leak-check=full $CLIENT_CMD\"\n            fi\n            log \"$CLIENT_CMD\"\n            echo \"$CLIENT_CMD\" > $CLI_OUT\n            $CLIENT_CMD >> $CLI_OUT 2>&1 &\n            wait_client_done\n\n            case $EXIT in\n                # Success\n                \"0\")    RESULT=0    ;;\n\n                # Ciphersuite not supported\n                \"2\")    RESULT=1    ;;\n\n                # Error\n                *)      RESULT=2    ;;\n            esac\n\n            if [ \"$MEMCHECK\" -gt 0 ]; then\n                if is_mbedtls \"$CLIENT_CMD\" && has_mem_err $CLI_OUT; then\n                    RESULT=2\n                fi\n            fi\n\n            ;;\n\n        *)\n            echo \"error: invalid client name: $1\" >&2\n            exit 1\n            ;;\n    esac\n\n    echo \"EXIT: $EXIT\" >> $CLI_OUT\n\n    # report and count result\n    case $RESULT in\n        \"0\")\n            echo PASS\n            ;;\n        \"1\")\n            echo SKIP\n            SKIPPED=$(( $SKIPPED + 1 ))\n            ;;\n        \"2\")\n            echo FAIL\n            cp $SRV_OUT c-srv-${TESTS}.log\n            cp $CLI_OUT c-cli-${TESTS}.log\n            echo \"  ! outputs saved to c-srv-${TESTS}.log, c-cli-${TESTS}.log\"\n\n            if [ \"X${USER:-}\" = Xbuildbot -o \"X${LOGNAME:-}\" = Xbuildbot ]; then\n                echo \"  ! server output:\"\n                cat c-srv-${TESTS}.log\n                echo \"  ! ===================================================\"\n                echo \"  ! client output:\"\n                cat c-cli-${TESTS}.log\n            fi\n\n            FAILED=$(( $FAILED + 1 ))\n            ;;\n    esac\n\n    rm -f $CLI_OUT\n}\n\n#\n# MAIN\n#\n\nif cd $( dirname $0 ); then :; else\n    echo \"cd $( dirname $0 ) failed\" >&2\n    exit 1\nfi\n\nget_options \"$@\"\n\n# sanity checks, avoid an avalanche of errors\nif [ ! -x \"$M_SRV\" ]; then\n    echo \"Command '$M_SRV' is not an executable file\" >&2\n    exit 1\nfi\nif [ ! -x \"$M_CLI\" ]; then\n    echo \"Command '$M_CLI' is not an executable file\" >&2\n    exit 1\nfi\n\nif echo \"$PEERS\" | grep -i openssl > /dev/null; then\n    if which \"$OPENSSL_CMD\" >/dev/null 2>&1; then :; else\n        echo \"Command '$OPENSSL_CMD' not found\" >&2\n        exit 1\n    fi\nfi\n\nif echo \"$PEERS\" | grep -i gnutls > /dev/null; then\n    for CMD in \"$GNUTLS_CLI\" \"$GNUTLS_SERV\"; do\n        if which \"$CMD\" >/dev/null 2>&1; then :; else\n            echo \"Command '$CMD' not found\" >&2\n            exit 1\n        fi\n    done\nfi\n\nfor PEER in $PEERS; do\n    case \"$PEER\" in\n        mbed*|[Oo]pen*|[Gg]nu*)\n            ;;\n        *)\n            echo \"Unknown peers: $PEER\" >&2\n            exit 1\n    esac\ndone\n\n# Pick a \"unique\" port in the range 10000-19999.\nPORT=\"0000$$\"\nPORT=\"1$(echo $PORT | tail -c 5)\"\n\n# Also pick a unique name for intermediate files\nSRV_OUT=\"srv_out.$$\"\nCLI_OUT=\"cli_out.$$\"\n\n# client timeout delay: be more patient with valgrind\nif [ \"$MEMCHECK\" -gt 0 ]; then\n    DOG_DELAY=30\nelse\n    DOG_DELAY=10\nfi\n\nSKIP_NEXT=\"NO\"\n\ntrap cleanup INT TERM HUP\n\nfor VERIFY in $VERIFIES; do\n    for MODE in $MODES; do\n        for TYPE in $TYPES; do\n            for PEER in $PEERS; do\n\n            setup_arguments\n\n            case \"$PEER\" in\n\n                [Oo]pen*)\n\n                    if test \"$OSSL_NO_DTLS\" -gt 0 && is_dtls \"$MODE\"; then\n                        continue;\n                    fi\n\n                    reset_ciphersuites\n                    add_common_ciphersuites\n                    add_openssl_ciphersuites\n                    filter_ciphersuites\n\n                    if [ \"X\" != \"X$M_CIPHERS\" ]; then\n                        start_server \"OpenSSL\"\n                        for i in $M_CIPHERS; do\n                            check_openssl_server_bug $i\n                            run_client mbedTLS $i\n                        done\n                        stop_server\n                    fi\n\n                    if [ \"X\" != \"X$O_CIPHERS\" ]; then\n                        start_server \"mbedTLS\"\n                        for i in $O_CIPHERS; do\n                            run_client OpenSSL $i\n                        done\n                        stop_server\n                    fi\n\n                    ;;\n\n                [Gg]nu*)\n\n                    reset_ciphersuites\n                    add_common_ciphersuites\n                    add_gnutls_ciphersuites\n                    filter_ciphersuites\n\n                    if [ \"X\" != \"X$M_CIPHERS\" ]; then\n                        start_server \"GnuTLS\"\n                        for i in $M_CIPHERS; do\n                            run_client mbedTLS $i\n                        done\n                        stop_server\n                    fi\n\n                    if [ \"X\" != \"X$G_CIPHERS\" ]; then\n                        start_server \"mbedTLS\"\n                        for i in $G_CIPHERS; do\n                            run_client GnuTLS $i\n                        done\n                        stop_server\n                    fi\n\n                    ;;\n\n                mbed*)\n\n                    reset_ciphersuites\n                    add_common_ciphersuites\n                    add_openssl_ciphersuites\n                    add_gnutls_ciphersuites\n                    add_mbedtls_ciphersuites\n                    filter_ciphersuites\n\n                    if [ \"X\" != \"X$M_CIPHERS\" ]; then\n                        start_server \"mbedTLS\"\n                        for i in $M_CIPHERS; do\n                            run_client mbedTLS $i\n                        done\n                        stop_server\n                    fi\n\n                    ;;\n\n                *)\n                    echo \"Unknown peer: $PEER\" >&2\n                    exit 1\n                    ;;\n\n                esac\n\n            done\n        done\n    done\ndone\n\necho \"------------------------------------------------------------------------\"\n\nif [ $FAILED -ne 0 -o $SRVMEM -ne 0 ];\nthen\n    printf \"FAILED\"\nelse\n    printf \"PASSED\"\nfi\n\nif [ \"$MEMCHECK\" -gt 0 ]; then\n    MEMREPORT=\", $SRVMEM server memory errors\"\nelse\n    MEMREPORT=\"\"\nfi\n\nPASSED=$(( $TESTS - $FAILED ))\necho \" ($PASSED / $TESTS tests ($SKIPPED skipped$MEMREPORT))\"\n\nFAILED=$(( $FAILED + $SRVMEM ))\nexit $FAILED\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/.gitignore",
    "content": "cli-rsa.csr\nserver2-rsa.csr\ntest-ca.csr\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/Makefile",
    "content": "## This file contains a record of how some of the test data was\n## generated. The final build products are committed to the repository\n## as well to make sure that the test data is identical. You do not\n## need to use this makefile unless you're extending mbed TLS's tests.\n\n## Many data files were generated prior to the existence of this\n## makefile, so the method of their generation was not recorded.\n\n## Note that in addition to depending on the version of the data\n## generation tool, many of the build outputs are randomized, so\n## running this makefile twice would not produce the same results.\n\n## Tools\nOPENSSL ?= openssl\n\n## Build the generated test data. Note that since the final outputs\n## are committed to the repository, this target should do nothing on a\n## fresh checkout. Furthermore, since the generation is randomized,\n## re-running the same targets may result in differing files. The goal\n## of this makefile is primarily to serve as a record of how the\n## targets were generated in the first place.\ndefault: all_final\n\nall_intermediate := # temporary files\nall_final := # files used by tests\n\n\n\n################################################################\n#### Generate certificates from existing keys\n################################################################\n\ntest_ca_key_file_rsa = test-ca.key\ntest_ca_pwd_rsa = PolarSSLTest\ntest_ca_config_file = test-ca.opensslconf\n\ntest-ca.csr: $(test_ca_key_file_rsa) $(test_ca_config_file)\n\t$(OPENSSL) req -new -config $(test_ca_config_file) -key $(test_ca_key_file_rsa) -passin \"pass:$(test_ca_pwd_rsa)\" -subj \"/C=NL/O=PolarSSL/CN=PolarSSL Test CA\" -out $@\nall_intermediate += test-ca.csr\ntest-ca-sha1.crt: $(test_ca_key_file_rsa) $(test_ca_config_file) test-ca.csr\n\t$(OPENSSL) req -x509 -config $(test_ca_config_file) -key $(test_ca_key_file_rsa) -passin \"pass:$(test_ca_pwd_rsa)\" -set_serial 0 -days 3653 -sha1 -in test-ca.csr -out $@\nall_final += test-ca-sha1.crt\ntest-ca-sha256.crt: $(test_ca_key_file_rsa) $(test_ca_config_file) test-ca.csr\n\t$(OPENSSL) req -x509 -config $(test_ca_config_file) -key $(test_ca_key_file_rsa) -passin \"pass:$(test_ca_pwd_rsa)\" -set_serial 0 -days 3653 -sha256 -in test-ca.csr -out $@\nall_final += test-ca-sha256.crt\n\ncli_crt_key_file_rsa = cli-rsa.key\ncli_crt_extensions_file = cli.opensslconf\n\ncli-rsa.csr: $(cli_crt_key_file_rsa)\n\t$(OPENSSL) req -new -key $(cli_crt_key_file_rsa) -passin \"pass:$(test_ca_pwd_rsa)\" -subj \"/C=NL/O=PolarSSL/CN=PolarSSL Client 2\" -out $@\nall_intermediate += cli-rsa.csr\ncli-rsa-sha1.crt: $(cli_crt_key_file_rsa) test-ca-sha1.crt cli-rsa.csr\n\t$(OPENSSL) x509 -req -extfile $(cli_crt_extensions_file) -extensions cli-rsa -CA test-ca-sha1.crt -CAkey $(test_ca_key_file_rsa) -passin \"pass:$(test_ca_pwd_rsa)\" -set_serial 4 -days 3653 -sha1 -in cli-rsa.csr -out $@\nall_final += cli-rsa-sha1.crt\ncli-rsa-sha256.crt: $(cli_crt_key_file_rsa) test-ca-sha256.crt cli-rsa.csr\n\t$(OPENSSL) x509 -req -extfile $(cli_crt_extensions_file) -extensions cli-rsa -CA test-ca-sha256.crt -CAkey $(test_ca_key_file_rsa) -passin \"pass:$(test_ca_pwd_rsa)\" -set_serial 4 -days 3653 -sha256 -in cli-rsa.csr -out $@\nall_final += cli-rsa-sha256.crt\n\nserver2-rsa.csr: server2.key\n\t$(OPENSSL) req -new -key server2.key -passin \"pass:$(test_ca_pwd_rsa)\" -subj \"/C=NL/O=PolarSSL/CN=localhost\" -out $@\nall_intermediate += server2-rsa.csr\nserver2-sha256.crt: server2-rsa.csr\n\t$(OPENSSL) x509 -req -extfile $(cli_crt_extensions_file) -extensions cli-rsa -CA test-ca-sha256.crt -CAkey $(test_ca_key_file_rsa) -passin \"pass:$(test_ca_pwd_rsa)\" -set_serial 4 -days 3653 -sha256 -in server2-rsa.csr -out $@\nall_final += server2-sha256.crt\n\n\n\n################################################################\n#### Meta targets\n################################################################\n\nall_final: $(all_final)\nall: $(all_intermediate) $(all_final)\n\n.PHONY: default all_final all\n\n# These files should not be committed to the repository.\nlist_intermediate:\n\t@printf '%s\\n' $(all_intermediate) | sort\n# These files should be committed to the repository so that the test data is\n# available upon checkout without running a randomized process depending on\n# third-party tools.\nlist_final:\n\t@printf '%s\\n' $(all_final) | sort\n.PHONY: list_intermediate list_final\n\n## Remove intermediate files\nclean:\n\trm -f $(all_intermediate)\n## Remove all build products, even the ones that are committed\nneat: clean\n\trm -f $(all_final)\n.PHONY: clean neat\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/Readme-x509.txt",
    "content": "This documents the X.509 CAs, certificates, and CRLS used for testing.\n\nCertification authorities\n-------------------------\n\nThere are two main CAs for use as trusted roots:\n- test-ca.crt aka \"C=NL, O=PolarSSL, CN=PolarSSL Test CA\"\n  uses a RSA-2048 key\n  test-ca-sha1.crt and test-ca-sha256.crt use the same key, signed with\n  different hashes.\n- test-ca2*.crt aka \"C=NL, O=PolarSSL, CN=Polarssl Test EC CA\"\n  uses an EC key with NIST P-384 (aka secp384r1)\n  variants used to test the keyUsage extension\nThe files test-ca_cat12 and test-ca_cat21 contain them concatenated both ways.\n\nTwo intermediate CAs are signed by them:\n- test-int-ca.crt \"C=NL, O=PolarSSL, CN=PolarSSL Test Intermediate CA\"\n  uses RSA-4096, signed by test-ca2\n- test-int-ca2.crt \"C=NL, O=PolarSSL, CN=PolarSSL Test Intermediate EC CA\"\n  uses an EC key with NIST P-256, signed by test-ca\n\nA third intermediate CA is signed by test-int-ca2.crt:\n- test-int-ca3.crt \"C=UK, O=mbed TLS, CN=mbed TLS Test intermediate CA 3\"\n\nFinally, other CAs for specific purposes:\n- enco-ca-prstr.pem: has its CN encoded as a printable string, but child cert\n  enco-cert-utf8str.pem has its issuer's CN encoded as a UTF-8 string.\n- test-ca-v1.crt: v1 \"CA\", signs\n    server1-v1.crt: v1 \"intermediate CA\", signs\n        server2-v1*.crt: EE cert (without of with chain in same file)\n- keyUsage.decipherOnly.crt: has the decipherOnly keyUsage bit set\n\nEnd-entity certificates\n-----------------------\n\nShort information fields:\n\n- name or pattern\n- issuing CA:   1   -> test-ca.crt\n                2   -> test-ca2.crt\n                I1  -> test-int-ca.crt\n                I2  -> test-int-ca2.crt\n                I3  -> test-int-ca3.crt\n                O   -> other\n- key type: R -> RSA, E -> EC\n- C -> there is a CRL revoking this cert (see below)\n- L -> CN=localhost (useful for local test servers)\n- P1, P2 if the file includes parent (resp. parent + grandparent)\n- free-form comments\n\nList of certificates:\n\n- cert_example_multi*.crt: 1/O R: subjectAltName\n- cert_example_wildcard.crt: 1 R: wildcard in subject's CN\n- cert_md*.crt, cert_sha*.crt: 1 R: signature hash\n- cert_v1_with_ext.crt: 1 R: v1 with extensions (illegal)\n- cli2.crt: 2 E: basic\n- cli-rsa.key, cli-rsa-*.crt: RSA key used for test clients, signed by\n  the RSA test CA.\n- enco-cert-utf8str.pem: see enco-ca-prstr.pem above\n- server1*.crt: 1* R C* P1*: misc *(server1-v1 see test-ca-v1.crt above)\n    *CRL for: .cert_type.crt, .crt, .key_usage.crt, .v1.crt\n    P1 only for _ca.crt\n- server2-v1*.crt: O R: see test-ca-v1.crt above\n- server2*.crt: 1 R L: misc\n- server3.crt: 1 E L: EC cert signed by RSA CA\n- server4.crt: 2 R L: RSA cert signed by EC CA\n- server5*.crt: 2* E L: misc *(except server5-selfsigned)\n    -sha*: hashes\n    -eku*: extendeKeyUsage (cli/srv = www client/server, cs = codesign, etc)\n    -ku*: keyUsage (ds = signatures, ke/ka = key exchange/agreement)\n- server6-ss-child.crt: O E: \"child\" of non-CA server5-selfsigned\n- server6.crt, server6.pem: 2 E L C: revoked\n- server7*.crt: I1 E L P1*: EC signed by RSA signed by EC\n    *P1 except 7.crt, P2 _int-ca_ca2.crt\n    *_space: with PEM error(s)\n- server8*.crt: I2 R L: RSA signed by EC signed by RSA (P1 for _int-ca2)\n- server9*.crt: 1 R C* L P1*: signed using RSASSA-PSS\n    *CRL for: 9.crt, -badsign, -with-ca (P1)\n- server10*.crt: I3 E L P2/P3\n\nCertificate revocation lists\n----------------------------\n\nSigning CA in parentheses (same meaning as certificates).\n\n- crl-ec-sha*.pem: (2) server6.crt\n- crl-future.pem: (2) server6.crt + unknown\n- crl-rsa-pss-*.pem: (1) server9{,badsign,with-ca}.crt + cert_sha384.crt + unknown\n- crl.pem, crl_expired.pem: (1) server1{,.cert_type,.key_usage,.v1}.crt + unknown\n- crl_md*.pem: crl_sha*.pem: (1) same as crl.pem\n- crt_cat_*.pem: (1+2) concatenations in various orders:\n    ec = crl-ec-sha256.pem, ecfut = crl-future.pem\n    rsa = crl.pem, rsabadpem = same with pem error, rsaexp = crl_expired.pem\n\nNote: crl_future would revoke server9 and cert_sha384.crt if signed by CA 1\n      crl-rsa-pss* would revoke server6.crt if signed by CA 2\n\nGeneration\n----------\n\nNewer test files have been generated through commands in the Makefile. The\nresulting files are committed to the repository so that the tests can\nrun without having to re-do the generation and so that the output is the\nsame for everyone (the generation process is randomized).\n\nThe origin of older certificates has not been recorded.\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/bitstring-in-dn.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIEATCCAumgAwIBAgIBAjANBgkqhkiG9w0BAQUFADBxMRMwEQYDVQQDDApUZXN0\nIENBIDAxMREwDwYDVQQIDAhFY25pdm9ycDELMAkGA1UEBhMCWFgxHjAcBgkqhkiG\n9w0BCQEWD3RjYUBleGFtcGxlLmNvbTEaMBgGA1UECgwRVGVzdCBDQSBBdXRob3Jp\ndHkwHhcNMTUwMzExMTIwNjUxWhcNMjUwMzA4MTIwNjUxWjCBmzELMAkGA1UEBhMC\nWFgxDDAKBgNVBAoMA3RjYTERMA8GA1UECAwIRWNuaXZvcnAxDDAKBgNVBAsMA1RD\nQTEPMA0GA1UEAwwGQ2xpZW50MSEwHwYJKoZIhvcNAQkBFhJjbGllbnRAZXhhbXBs\nZS5jb20xEzARBgNVBAUTCjcxMDEwMTIyNTUxFDASBgNVBC0DCwA3MTAxMDEyMjU1\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnQS0JLb8Dqy8V2mszkWk\nV8c/NPQcG3ivueXZHqOT9JTiPqrigGcLHtlmlaJ0aUUxix7q60aOds041TFyeknT\nSUFYY4ppOhiP+fOpWKPv4ZMwhSI2XzcgYhQSNHV0lIG1we9RAAfumomDMq7oMJhb\nEGf0ihibbwZXPUwBlm10GaB4K93PNY8Bz4ekBxzQ1WJkQ5LGsQnVZSuLnvp5dWSe\nJ2axxyY4hPXR30jzEyZvy4kv4nzAu5lqZ5XKLrRO4TKwZrtr+CCPVkPJRE36rWYt\ntQaJEEpNOo0ZPpTtG6F8/tGh5r8jFx/f6wG+nyANJJ98kEP8i6TPjRrg+697mLcd\niQIDAQABo3kwdzAJBgNVHRMEAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9j\ncmwuZXhhbXBsZS5jb20vdGVzdF9jYV8wMS5jcmwwEwYDVR0lBAwwCgYIKwYBBQUH\nAwIwHQYDVR0RBBYwFIESY2xpZW50QGV4YW1wbGUuY29tMA0GCSqGSIb3DQEBBQUA\nA4IBAQBySELCnU8/PtGIG3dwhJENOSU5R7w8jpRXxHCuSBR+W6nuUCISz+z+EdF/\nA7AOJDASuS+4gkrSSmQhGFpf7E5VbF8trVZhLAZrXqKMcUreKH6v0I8MAUXmIs3G\ntqiBGf7pSYJN9DvVOOgANjdy6THuUzYv5qSvBZ4pNYEfHSlMNrV7niynd8dgPOML\npA7GUfv5k2mMkMbSD15pTMgcavrBKYgyqcvF1C3qghfoL5+i38H8sKzF8hy7wHtE\nESHtBq20RYA3m0UcA0e64GcanO2Ps/AQVBc7qMeHbqnqj3uUhtTkQcMUWnMgy1NR\n5RbzoLMOxq7hoOCyIaQeM/wgxeGE\n-----END CERTIFICATE-----\n-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAnQS0JLb8Dqy8V2mszkWkV8c/NPQcG3ivueXZHqOT9JTiPqri\ngGcLHtlmlaJ0aUUxix7q60aOds041TFyeknTSUFYY4ppOhiP+fOpWKPv4ZMwhSI2\nXzcgYhQSNHV0lIG1we9RAAfumomDMq7oMJhbEGf0ihibbwZXPUwBlm10GaB4K93P\nNY8Bz4ekBxzQ1WJkQ5LGsQnVZSuLnvp5dWSeJ2axxyY4hPXR30jzEyZvy4kv4nzA\nu5lqZ5XKLrRO4TKwZrtr+CCPVkPJRE36rWYttQaJEEpNOo0ZPpTtG6F8/tGh5r8j\nFx/f6wG+nyANJJ98kEP8i6TPjRrg+697mLcdiQIDAQABAoIBAF7i3MnjGmbz080v\nOxJb23iAG54wdlvTjr3UPGTbjSmcXyxnsADQRFQcJHYAekCzY8EiqewL80OvuMx8\n2SU1P81hA70Dg5tsBHWT3Z6HUwsKG6QYjKr1cUhTwLyazhyAVgogSN6v7GzO9M3I\nDOBw8Xb0mz5oqGVre4S7TapN8n8ZG5oWm0XKGACXy0KbzY0KvWdkUzumFQ8X/ARE\nFsWyu+O69EbMqZRUKu45SrcubsdVGjOwseZHkmp5V6pc6Q/OrTHZqXJtDva5UIRq\n+Lof5scy9jiwwRnM/klvh23mz0ySU4YA3645m5KqyWR4YJCR1MnMANmXUSeYWfYz\n19+R1gECgYEAzm83lI7eIhTH38H0/jFpf3R7vNjPX3TR5waa4EXsCxhTOpoL89mR\niNmzH0aOC4OR8rz/9PCnwmtH1lyQ4r/RokBmCp3pBxeWSlenFfV3rLCeEDo0Q/OL\nSX5DL4IbZD0VmNDt606WS7AEv93GhpN03Anw6kgHQUm1l030PR9DYZECgYEAwrgO\n/RyB/Ehw7smlysZb2sn1lvd6z8fg+pcu8ZNRKODaYCCOb8p1lnHrnIQdEmjhlmVp\nHAEuJ5jxCb+lyruV+dlx+0W/p6lHtKr0iBHG8EFkHnjN6Y+59Qu0HfSm0pZw7Ftr\nQcUDPuDJkTVUAvrZqciWlwzTWCC9KYXtasT+AHkCgYEAnP80dAUbpyvKvr/RxShr\nJYW/PWZegChmIp+BViOXWvDLC3xwrqm+5yc59QVBrjwH2WYn+26zB0dzwPFxNyHP\nGuiDMnvZ54zmve9foXGn7Gv+KjU53pvwSJqAGjeHAXr7W9c5uoVwBGv/kLPn8h1e\n+KGO2X6iFeMq+cFNiNan9iECgYBj+oGnsKWFVeS2ls8LyMGNGzmAZF2opiZ8RHgU\nDeIULS+zP8Qi3j92GdQyLxuGQlfiEvvfJzP9nOfWa5LC/4JIIUAHFo8LlT1+JHEe\nFJKi9dBkXP7NN8DxcyruXpnxctFUarQttuytslmMt2cFiKuOI7I+qJUzoMu/sEZx\nFeidcQKBgQCuralmtbl4nxjn3aR/ZgFTAKCL9WaJPh5hFJ9q4UuWxJdBX5z3Ey3/\n70ehLKYPumjmZtXynzz4BTWj1W9X+tgj/499uzV6LdQERGjT6WVy8xR9RELWW0an\nN9N1IAc4qTSjbI4EIMwMBSAoFfCux/jfDkG4g+RDnpV92sqxz2CtKg==\n-----END RSA PRIVATE KEY-----"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_example_multi.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 17 (0x11)\n    Signature Algorithm: sha1WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: May 10 13:23:41 2012 GMT\n            Not After : May 11 13:23:41 2022 GMT\n        Subject: C=NL, O=PolarSSL, CN=www.example.com\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n                Public-Key: (2048 bit)\n                Modulus:\n                    00:b9:3c:4a:c5:c8:a3:8e:90:17:a4:9e:52:aa:71:\n                    75:26:61:80:e7:c7:b5:6d:8c:ff:aa:b6:41:26:b7:\n                    be:11:ad:5c:73:16:0c:64:11:48:04:ff:d6:e1:3b:\n                    05:db:89:bb:b3:97:09:d5:1c:14:dd:68:87:39:b0:\n                    3d:71:cb:e2:76:d0:1a:d8:18:2d:80:1b:54:f6:e5:\n                    44:9a:f1:cb:af:61:2e:df:49:0d:9d:09:b7:ed:b1:\n                    fd:3c:fd:3c:fa:24:cf:5d:bf:7c:e4:53:e7:25:b5:\n                    ea:44:22:e9:26:d3:ea:20:94:9e:e6:61:67:ba:2e:\n                    07:67:0b:03:2f:a2:09:ed:f0:33:8f:0b:ce:10:ef:\n                    67:a4:c6:08:da:c1:ed:c2:3f:d7:4a:dd:15:3d:f9:\n                    5e:1c:81:60:46:3e:b5:b3:3d:2f:a6:de:47:1c:bc:\n                    92:ae:eb:df:27:6b:16:56:b7:dc:ec:d1:55:57:a5:\n                    6e:ec:75:25:f5:b7:7b:df:ab:d2:3a:5a:91:98:7d:\n                    97:17:0b:13:0a:a7:6b:4a:8b:c1:47:30:fb:3a:f8:\n                    41:04:d5:c1:df:b8:1d:bf:7b:01:a5:65:a2:e0:1e:\n                    36:b7:a6:5c:cc:30:5a:f8:cd:6f:cd:f1:19:62:25:\n                    ca:01:e3:35:7f:fa:20:f5:dc:fd:69:b2:6a:00:7d:\n                    17:f7\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Subject Key Identifier: \n                7D:E4:9C:6B:E6:F9:71:7D:46:D2:12:3D:AD:6B:1D:FD:C2:AA:78:4C\n            X509v3 Authority Key Identifier: \n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n\n            X509v3 Subject Alternative Name: \n                DNS:example.com, DNS:example.net, DNS:*.example.org\n    Signature Algorithm: sha1WithRSAEncryption\n         4f:09:cb:7a:d5:ee:f5:ef:62:0d:dc:7b:a2:85:d6:8c:ca:95:\n         b4:6b:da:11:5b:92:00:75:13:b9:ca:0b:ce:ea:fb:c3:1f:e2:\n         3f:7f:21:74:79:e2:e6:bc:da:06:e5:2f:6f:f6:55:c6:73:39:\n         cf:48:bc:0d:2f:0c:d2:7a:06:c3:4a:4c:d9:48:5d:a0:d0:73:\n         89:e4:d4:85:1d:96:9a:0e:57:99:c6:6f:1d:21:27:1f:8d:05:\n         29:e8:40:ae:82:39:68:c3:97:07:cf:3c:93:4c:1a:df:2f:a6:\n         a4:55:48:7f:7c:8c:1a:c9:22:da:24:cd:92:39:c6:8a:ec:b0:\n         8d:f5:69:82:67:cb:04:ee:de:53:41:96:c1:27:dc:2f:fe:33:\n         fa:d3:0e:b8:d4:32:a9:84:28:53:a5:f0:d1:89:d5:a2:98:e7:\n         16:91:bb:9c:c0:41:8e:8c:58:ac:ff:e3:dd:2e:7a:ab:b0:b9:\n         71:76:ad:0f:27:33:f7:a9:29:d3:c0:76:c0:bf:06:40:7c:0e:\n         d5:a4:7c:8a:e2:32:6e:16:ae:da:64:1f:b0:55:7c:db:dd:f1:\n         a4:ba:44:7c:b3:99:58:d2:34:6e:00:ea:97:6c:14:3a:f2:10:\n         1e:0a:a2:49:10:76:01:f4:f2:c8:18:fd:cc:63:46:12:8b:09:\n         1b:f1:94:e6\n-----BEGIN CERTIFICATE-----\nMIIDcjCCAlqgAwIBAgIBETANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTIwNTEwMTMyMzQxWhcNMjIwNTExMTMyMzQxWjA6MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxGDAWBgNVBAMTD3d3dy5leGFtcGxlLmNvbTCCASIwDQYJ\nKoZIhvcNAQEBBQADggEPADCCAQoCggEBALk8SsXIo46QF6SeUqpxdSZhgOfHtW2M\n/6q2QSa3vhGtXHMWDGQRSAT/1uE7BduJu7OXCdUcFN1ohzmwPXHL4nbQGtgYLYAb\nVPblRJrxy69hLt9JDZ0Jt+2x/Tz9PPokz12/fORT5yW16kQi6SbT6iCUnuZhZ7ou\nB2cLAy+iCe3wM48LzhDvZ6TGCNrB7cI/10rdFT35XhyBYEY+tbM9L6beRxy8kq7r\n3ydrFla33OzRVVelbux1JfW3e9+r0jpakZh9lxcLEwqna0qLwUcw+zr4QQTVwd+4\nHb97AaVlouAeNremXMwwWvjNb83xGWIlygHjNX/6IPXc/WmyagB9F/cCAwEAAaOB\ngTB/MAkGA1UdEwQCMAAwHQYDVR0OBBYEFH3knGvm+XF9RtISPa1rHf3CqnhMMB8G\nA1UdIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MDIGA1UdEQQrMCmCC2V4YW1w\nbGUuY29tggtleGFtcGxlLm5ldIINKi5leGFtcGxlLm9yZzANBgkqhkiG9w0BAQUF\nAAOCAQEATwnLetXu9e9iDdx7ooXWjMqVtGvaEVuSAHUTucoLzur7wx/iP38hdHni\n5rzaBuUvb/ZVxnM5z0i8DS8M0noGw0pM2UhdoNBzieTUhR2Wmg5XmcZvHSEnH40F\nKehAroI5aMOXB888k0wa3y+mpFVIf3yMGski2iTNkjnGiuywjfVpgmfLBO7eU0GW\nwSfcL/4z+tMOuNQyqYQoU6Xw0YnVopjnFpG7nMBBjoxYrP/j3S56q7C5cXatDycz\n96kp08B2wL8GQHwO1aR8iuIybhau2mQfsFV8293xpLpEfLOZWNI0bgDql2wUOvIQ\nHgqiSRB2AfTyyBj9zGNGEosJG/GU5g==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_example_multi_nocn.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB/TCCAWagAwIBAgIJAPfGf/jpqWP5MA0GCSqGSIb3DQEBBQUAMA0xCzAJBgNV\nBAYTAk5MMB4XDTE0MDEyMjEwMDQzM1oXDTI0MDEyMjEwMDQzM1owDTELMAkGA1UE\nBhMCTkwwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAN0Rip+ZurBoyirqO2pt\nWZftTslU5A3uzqB9oB6q6A7CuxNA24oSjokTJKXF9frY9ZDXyMrLxf6THa/aEiNz\nUnlGGrqgVyt2FjGzqK/nOJsIi2OZOgol7kXSGFi6uZMa7dRYmmMbN/z3FAifhWVJ\n81kybdHg6G3eUu1mtKkL2kCVAgMBAAGjZTBjMAkGA1UdEwQCMAAwCwYDVR0PBAQD\nAgXgMEkGA1UdEQRCMECCHHd3dy5zaG90b2thbi1icmF1bnNjaHdlaWcuZGWCFHd3\ndy5tYXNzaW1vLWFiYXRlLmV1hwTAqAEBhwTAqEWQMA0GCSqGSIb3DQEBBQUAA4GB\nABjx1ytrqCyFC5/0cjWnbLK9vsvLny2ZikDewfRxqJ5zAxGWLqHOr1SmUmu2DrvB\nbkT9g5z19+iMhPnzJz1x7Q2m7WTIJTuUPK+hKZJATDLNhZ86h5Nkw8k9YzKcOrPm\nEIqsy55CSgLU0ntljqSBvSb4ifrF1NnIWej2lSfN6r+3\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_example_wildcard.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 12 (0xc)\n        Signature Algorithm: sha1WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb  7 16:06:36 2012 GMT\n            Not After : Feb  7 16:06:36 2022 GMT\n        Subject: C=NL, O=PolarSSL, CN=*.example.com\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n                Public-Key: (2048 bit)\n                Modulus:\n                    00:b9:3c:4a:c5:c8:a3:8e:90:17:a4:9e:52:aa:71:\n                    75:26:61:80:e7:c7:b5:6d:8c:ff:aa:b6:41:26:b7:\n                    be:11:ad:5c:73:16:0c:64:11:48:04:ff:d6:e1:3b:\n                    05:db:89:bb:b3:97:09:d5:1c:14:dd:68:87:39:b0:\n                    3d:71:cb:e2:76:d0:1a:d8:18:2d:80:1b:54:f6:e5:\n                    44:9a:f1:cb:af:61:2e:df:49:0d:9d:09:b7:ed:b1:\n                    fd:3c:fd:3c:fa:24:cf:5d:bf:7c:e4:53:e7:25:b5:\n                    ea:44:22:e9:26:d3:ea:20:94:9e:e6:61:67:ba:2e:\n                    07:67:0b:03:2f:a2:09:ed:f0:33:8f:0b:ce:10:ef:\n                    67:a4:c6:08:da:c1:ed:c2:3f:d7:4a:dd:15:3d:f9:\n                    5e:1c:81:60:46:3e:b5:b3:3d:2f:a6:de:47:1c:bc:\n                    92:ae:eb:df:27:6b:16:56:b7:dc:ec:d1:55:57:a5:\n                    6e:ec:75:25:f5:b7:7b:df:ab:d2:3a:5a:91:98:7d:\n                    97:17:0b:13:0a:a7:6b:4a:8b:c1:47:30:fb:3a:f8:\n                    41:04:d5:c1:df:b8:1d:bf:7b:01:a5:65:a2:e0:1e:\n                    36:b7:a6:5c:cc:30:5a:f8:cd:6f:cd:f1:19:62:25:\n                    ca:01:e3:35:7f:fa:20:f5:dc:fd:69:b2:6a:00:7d:\n                    17:f7\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Subject Key Identifier: \n                7D:E4:9C:6B:E6:F9:71:7D:46:D2:12:3D:AD:6B:1D:FD:C2:AA:78:4C\n            X509v3 Authority Key Identifier: \n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n\n    Signature Algorithm: sha1WithRSAEncryption\n        91:b3:84:5c:5d:60:f2:a5:0a:4a:dc:d6:c6:75:da:34:52:72:\n        6c:0e:60:4f:ef:0e:55:f3:4b:bf:d0:40:e7:91:2c:a7:94:8f:\n        3d:db:0a:ec:b2:f5:83:a7:a1:33:61:96:37:57:14:80:5b:e7:\n        bc:e1:d3:2c:36:32:6f:ef:7a:00:99:33:15:fc:38:20:df:74:\n        7d:3d:0f:81:d0:b4:fd:b6:46:f1:c5:b8:bc:de:74:a2:41:a7:\n        c8:51:da:20:12:82:3e:0c:8c:48:da:19:b6:52:e9:4f:67:c1:\n        28:9e:20:b6:ce:be:89:bd:64:d7:05:3e:87:af:ba:2b:5d:aa:\n        fe:62:66:fb:a6:75:ad:89:a1:18:e8:78:54:ea:df:0a:85:e9:\n        32:32:a8:1a:cd:35:81:f8:a8:da:d1:16:8a:63:e7:67:da:6e:\n        e1:3b:1c:31:20:99:ee:e2:b2:fb:82:c5:21:e2:63:4c:61:15:\n        4d:53:ad:dd:15:7f:0b:b6:33:43:ad:27:8a:b1:af:93:17:72:\n        c4:be:31:26:93:3c:7d:fc:d5:3d:cf:0b:be:c5:7b:e9:b4:f8:\n        f3:30:f2:f5:a2:27:eb:9a:71:fc:7f:79:5e:88:c5:a6:2d:33:\n        57:ba:38:06:e6:ad:0b:96:97:9d:cc:94:7b:83:09:17:a6:ee:\n        ce:bb:0f:36\n-----BEGIN CERTIFICATE-----\nMIIDOzCCAiOgAwIBAgIBDDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTIwMjA3MTYwNjM2WhcNMjIwMjA3MTYwNjM2WjA4MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxFjAUBgNVBAMUDSouZXhhbXBsZS5jb20wggEiMA0GCSqG\nSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5PErFyKOOkBeknlKqcXUmYYDnx7VtjP+q\ntkEmt74RrVxzFgxkEUgE/9bhOwXbibuzlwnVHBTdaIc5sD1xy+J20BrYGC2AG1T2\n5USa8cuvYS7fSQ2dCbftsf08/Tz6JM9dv3zkU+cltepEIukm0+oglJ7mYWe6Lgdn\nCwMvognt8DOPC84Q72ekxgjawe3CP9dK3RU9+V4cgWBGPrWzPS+m3kccvJKu698n\naxZWt9zs0VVXpW7sdSX1t3vfq9I6WpGYfZcXCxMKp2tKi8FHMPs6+EEE1cHfuB2/\newGlZaLgHja3plzMMFr4zW/N8RliJcoB4zV/+iD13P1psmoAfRf3AgMBAAGjTTBL\nMAkGA1UdEwQCMAAwHQYDVR0OBBYEFH3knGvm+XF9RtISPa1rHf3CqnhMMB8GA1Ud\nIwQYMBaAFLRa5KWz3tJS9rnVppUP6z68x/3/MA0GCSqGSIb3DQEBBQUAA4IBAQCR\ns4RcXWDypQpK3NbGddo0UnJsDmBP7w5V80u/0EDnkSynlI892wrssvWDp6EzYZY3\nVxSAW+e84dMsNjJv73oAmTMV/Dgg33R9PQ+B0LT9tkbxxbi83nSiQafIUdogEoI+\nDIxI2hm2UulPZ8EoniC2zr6JvWTXBT6Hr7orXar+Ymb7pnWtiaEY6HhU6t8Kheky\nMqgazTWB+Kja0RaKY+dn2m7hOxwxIJnu4rL7gsUh4mNMYRVNU63dFX8LtjNDrSeK\nsa+TF3LEvjEmkzx9/NU9zwu+xXvptPjzMPL1oifrmnH8f3leiMWmLTNXujgG5q0L\nlpedzJR7gwkXpu7Ouw82\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_md2.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 9 (0x9)\n        Signature Algorithm: md2WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Jul 12 10:56:59 2009 GMT\n            Not After : Jul 12 10:56:59 2011 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Cert MD2\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:dc:13:74:81:c6:12:f6:67:5d:a1:66:72:ed:dc:\n                    79:b6:58:5c:32:58:b3:d4:14:fd:6c:02:61:9e:0b:\n                    99:46:63:a3:0a:41:d4:42:33:21:e6:ed:43:07:5a:\n                    1d:a2:3b:64:29:a8:2a:c1:66:28:00:59:d8:0c:49:\n                    2d:30:b7:3d:8c:bb:60:62:31:83:27:7f:4b:95:92:\n                    2e:a0:d6:c6:84:94:4b:b3:e4:a6:cc:ff:32:3a:c5:\n                    ec:4c:c9:24:58:bf:b3:33:77:6a:b5:17:8b:02:10:\n                    29:8e:95:aa:91:60:17:43:42:87:a8:7c:da:09:83:\n                    98:9d:7a:65:5e:20:52:07:2e:65:a5:31:fd:d9:74:\n                    1e:00:c9:ae:9d:81:56:8b:08:0a:f5:1e:9c:dc:a2:\n                    5e:6c:db:ff:11:83:15:f4:d1:24:57:9b:0f:eb:35:\n                    c9:f1:aa:46:4e:74:7f:fe:1d:b0:91:1f:89:4a:84:\n                    cb:df:75:e3:cd:77:82:62:09:e5:9f:6d:29:de:2e:\n                    25:d8:48:b6:20:be:51:97:4c:2d:20:65:2d:2a:50:\n                    9e:24:5d:72:95:e0:a2:06:41:8c:61:e4:50:57:74:\n                    96:b1:29:b5:a1:88:37:f1:5c:9e:b2:9e:8e:83:8d:\n                    72:3b:b5:5c:fe:bb:12:89:72:5c:a1:f9:d8:18:29:\n                    b2:27\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Subject Key Identifier: \n                B7:51:D4:E5:20:D5:45:54:F4:C5:51:1B:E0:82:B5:61:05:AF:9B:B6\n            X509v3 Authority Key Identifier: \n                keyid:CF:22:31:27:91:D8:C2:54:FF:1E:DA:D9:EE:8A:C5:89:32:AD:0C:21\n\n    Signature Algorithm: md2WithRSAEncryption\n        28:5a:dd:48:fb:ec:80:fe:de:b7:20:c0:4c:05:a9:4b:51:e9:\n        a7:d1:4b:5e:76:42:d2:5d:9a:14:19:3b:cb:f9:91:d7:0f:11:\n        c9:cd:dd:00:8b:2c:76:73:22:a0:19:49:81:63:40:30:48:27:\n        62:90:ca:b8:dc:33:35:b3:4b:58:ca:dc:07:66:87:2e:ea:44:\n        2a:6a:13:67:7a:32:5e:48:1d:88:88:c5:70:e6:e7:ec:1b:2f:\n        a7:f4:61:71:29:f6:66:93:30:60:7e:b3:4c:01:c8:2c:53:ce:\n        00:11:ec:bf:f6:f2:ce:51:97:d8:ed:ed:dc:c9:6b:b8:19:15:\n        c8:9a:61:6d:12:9a:99:25:d8:03:1d:a6:4c:20:a5:f8:46:a3:\n        05:32:bb:1a:8e:1a:65:0d:f3:13:35:1d:6f:73:28:31:12:d7:\n        c4:9e:73:a0:a7:ce:82:25:d1:40:e8:1b:77:60:f3:3e:81:7f:\n        19:ee:cf:97:4d:c8:c3:35:9b:72:98:3b:c3:35:43:14:0a:04:\n        21:7b:f7:db:e6:5f:ce:21:d1:ce:bf:b7:ef:c1:63:21:c2:78:\n        e1:37:aa:b1:e0:31:b3:b6:63:4c:fd:66:c8:e6:cf:f8:d9:97:\n        2f:cf:92:81:3f:d4:bf:ec:e2:ad:6e:39:c7:a6:a8:e0:32:b0:\n        2e:0d:e1:30\n-----BEGIN CERTIFICATE-----\nMIIDPzCCAiegAwIBAgIBCTANBgkqhkiG9w0BAQIFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMDkwNzEyMTA1NjU5WhcNMTEwNzEyMTA1NjU5WjA8MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxGjAYBgNVBAMTEVBvbGFyU1NMIENlcnQgTUQyMIIBIjAN\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3BN0gcYS9mddoWZy7dx5tlhcMliz\n1BT9bAJhnguZRmOjCkHUQjMh5u1DB1odojtkKagqwWYoAFnYDEktMLc9jLtgYjGD\nJ39LlZIuoNbGhJRLs+SmzP8yOsXsTMkkWL+zM3dqtReLAhApjpWqkWAXQ0KHqHza\nCYOYnXplXiBSBy5lpTH92XQeAMmunYFWiwgK9R6c3KJebNv/EYMV9NEkV5sP6zXJ\n8apGTnR//h2wkR+JSoTL33XjzXeCYgnln20p3i4l2Ei2IL5Rl0wtIGUtKlCeJF1y\nleCiBkGMYeRQV3SWsSm1oYg38Vyesp6Og41yO7Vc/rsSiXJcofnYGCmyJwIDAQAB\no00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBS3UdTlINVFVPTFURvggrVhBa+btjAf\nBgNVHSMEGDAWgBTPIjEnkdjCVP8e2tnuisWJMq0MITANBgkqhkiG9w0BAQIFAAOC\nAQEAKFrdSPvsgP7etyDATAWpS1Hpp9FLXnZC0l2aFBk7y/mR1w8Ryc3dAIssdnMi\noBlJgWNAMEgnYpDKuNwzNbNLWMrcB2aHLupEKmoTZ3oyXkgdiIjFcObn7Bsvp/Rh\ncSn2ZpMwYH6zTAHILFPOABHsv/byzlGX2O3t3MlruBkVyJphbRKamSXYAx2mTCCl\n+EajBTK7Go4aZQ3zEzUdb3MoMRLXxJ5zoKfOgiXRQOgbd2DzPoF/Ge7Pl03IwzWb\ncpg7wzVDFAoEIXv32+ZfziHRzr+378FjIcJ44TeqseAxs7ZjTP1myObP+NmXL8+S\ngT/Uv+zirW45x6ao4DKwLg3hMA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_md4.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 5 (0x5)\n        Signature Algorithm: md4WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb 12 14:44:07 2011 GMT\n            Not After : Feb 12 14:44:07 2021 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Cert MD4\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:b9:3c:4a:c5:c8:a3:8e:90:17:a4:9e:52:aa:71:\n                    75:26:61:80:e7:c7:b5:6d:8c:ff:aa:b6:41:26:b7:\n                    be:11:ad:5c:73:16:0c:64:11:48:04:ff:d6:e1:3b:\n                    05:db:89:bb:b3:97:09:d5:1c:14:dd:68:87:39:b0:\n                    3d:71:cb:e2:76:d0:1a:d8:18:2d:80:1b:54:f6:e5:\n                    44:9a:f1:cb:af:61:2e:df:49:0d:9d:09:b7:ed:b1:\n                    fd:3c:fd:3c:fa:24:cf:5d:bf:7c:e4:53:e7:25:b5:\n                    ea:44:22:e9:26:d3:ea:20:94:9e:e6:61:67:ba:2e:\n                    07:67:0b:03:2f:a2:09:ed:f0:33:8f:0b:ce:10:ef:\n                    67:a4:c6:08:da:c1:ed:c2:3f:d7:4a:dd:15:3d:f9:\n                    5e:1c:81:60:46:3e:b5:b3:3d:2f:a6:de:47:1c:bc:\n                    92:ae:eb:df:27:6b:16:56:b7:dc:ec:d1:55:57:a5:\n                    6e:ec:75:25:f5:b7:7b:df:ab:d2:3a:5a:91:98:7d:\n                    97:17:0b:13:0a:a7:6b:4a:8b:c1:47:30:fb:3a:f8:\n                    41:04:d5:c1:df:b8:1d:bf:7b:01:a5:65:a2:e0:1e:\n                    36:b7:a6:5c:cc:30:5a:f8:cd:6f:cd:f1:19:62:25:\n                    ca:01:e3:35:7f:fa:20:f5:dc:fd:69:b2:6a:00:7d:\n                    17:f7\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Subject Key Identifier: \n                7D:E4:9C:6B:E6:F9:71:7D:46:D2:12:3D:AD:6B:1D:FD:C2:AA:78:4C\n            X509v3 Authority Key Identifier: \n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n\n    Signature Algorithm: md4WithRSAEncryption\n        94:db:e1:86:71:2d:43:d6:51:61:a7:95:bc:e8:73:da:ff:e4:\n        fd:41:0f:5c:de:14:f4:c4:ba:5d:2c:30:2c:a6:dc:2d:e8:87:\n        45:f1:c5:fe:d1:4a:64:99:19:09:2f:72:7c:3f:8d:c8:31:22:\n        dd:0a:69:03:3d:12:8c:4d:c3:f7:a3:c5:d1:5d:c9:ff:4b:83:\n        6b:d6:b4:e5:d8:ce:94:5e:ec:bf:68:c5:b2:63:8e:5c:cb:f3:\n        8d:62:73:82:62:7e:df:db:7d:0b:8d:21:10:db:9a:a1:62:4d:\n        46:42:d1:bb:38:32:ef:c1:fc:a1:e2:7f:60:08:37:32:20:2c:\n        7c:a2:c9:12:0d:89:fe:2b:15:08:91:79:e2:a9:79:a4:da:cd:\n        81:43:01:e2:09:2d:1a:f4:16:ef:af:4d:50:46:5e:2d:dd:48:\n        27:10:c0:42:b7:a5:9e:c2:1f:6e:50:36:03:ed:95:77:9a:a3:\n        d9:4c:d7:23:93:b1:24:2a:63:27:28:7a:de:3d:59:d2:92:c8:\n        8f:f6:39:1d:65:ab:09:78:05:46:90:a9:f6:10:b1:ef:c8:8c:\n        4d:7d:8d:f2:78:b7:88:15:09:7e:df:e9:87:a8:64:c1:95:53:\n        fb:da:05:b7:62:bc:ad:fb:d9:a4:a9:06:6c:6b:98:01:b9:39:\n        78:d3:4e:87\n-----BEGIN CERTIFICATE-----\nMIIDPzCCAiegAwIBAgIBBTANBgkqhkiG9w0BAQMFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTEwMjEyMTQ0NDA3WhcNMjEwMjEyMTQ0NDA3WjA8MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxGjAYBgNVBAMTEVBvbGFyU1NMIENlcnQgTUQ0MIIBIjAN\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuTxKxcijjpAXpJ5SqnF1JmGA58e1\nbYz/qrZBJre+Ea1ccxYMZBFIBP/W4TsF24m7s5cJ1RwU3WiHObA9ccvidtAa2Bgt\ngBtU9uVEmvHLr2Eu30kNnQm37bH9PP08+iTPXb985FPnJbXqRCLpJtPqIJSe5mFn\nui4HZwsDL6IJ7fAzjwvOEO9npMYI2sHtwj/XSt0VPfleHIFgRj61sz0vpt5HHLyS\nruvfJ2sWVrfc7NFVV6Vu7HUl9bd736vSOlqRmH2XFwsTCqdrSovBRzD7OvhBBNXB\n37gdv3sBpWWi4B42t6ZczDBa+M1vzfEZYiXKAeM1f/og9dz9abJqAH0X9wIDAQAB\no00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBR95Jxr5vlxfUbSEj2tax39wqp4TDAf\nBgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQMFAAOC\nAQEAlNvhhnEtQ9ZRYaeVvOhz2v/k/UEPXN4U9MS6XSwwLKbcLeiHRfHF/tFKZJkZ\nCS9yfD+NyDEi3QppAz0SjE3D96PF0V3J/0uDa9a05djOlF7sv2jFsmOOXMvzjWJz\ngmJ+39t9C40hENuaoWJNRkLRuzgy78H8oeJ/YAg3MiAsfKLJEg2J/isVCJF54ql5\npNrNgUMB4gktGvQW769NUEZeLd1IJxDAQrelnsIfblA2A+2Vd5qj2UzXI5OxJCpj\nJyh63j1Z0pLIj/Y5HWWrCXgFRpCp9hCx78iMTX2N8ni3iBUJft/ph6hkwZVT+9oF\nt2K8rfvZpKkGbGuYAbk5eNNOhw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_md5.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 6 (0x6)\n        Signature Algorithm: md5WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb 12 14:44:07 2011 GMT\n            Not After : Feb 12 14:44:07 2021 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Cert MD5\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:b9:3c:4a:c5:c8:a3:8e:90:17:a4:9e:52:aa:71:\n                    75:26:61:80:e7:c7:b5:6d:8c:ff:aa:b6:41:26:b7:\n                    be:11:ad:5c:73:16:0c:64:11:48:04:ff:d6:e1:3b:\n                    05:db:89:bb:b3:97:09:d5:1c:14:dd:68:87:39:b0:\n                    3d:71:cb:e2:76:d0:1a:d8:18:2d:80:1b:54:f6:e5:\n                    44:9a:f1:cb:af:61:2e:df:49:0d:9d:09:b7:ed:b1:\n                    fd:3c:fd:3c:fa:24:cf:5d:bf:7c:e4:53:e7:25:b5:\n                    ea:44:22:e9:26:d3:ea:20:94:9e:e6:61:67:ba:2e:\n                    07:67:0b:03:2f:a2:09:ed:f0:33:8f:0b:ce:10:ef:\n                    67:a4:c6:08:da:c1:ed:c2:3f:d7:4a:dd:15:3d:f9:\n                    5e:1c:81:60:46:3e:b5:b3:3d:2f:a6:de:47:1c:bc:\n                    92:ae:eb:df:27:6b:16:56:b7:dc:ec:d1:55:57:a5:\n                    6e:ec:75:25:f5:b7:7b:df:ab:d2:3a:5a:91:98:7d:\n                    97:17:0b:13:0a:a7:6b:4a:8b:c1:47:30:fb:3a:f8:\n                    41:04:d5:c1:df:b8:1d:bf:7b:01:a5:65:a2:e0:1e:\n                    36:b7:a6:5c:cc:30:5a:f8:cd:6f:cd:f1:19:62:25:\n                    ca:01:e3:35:7f:fa:20:f5:dc:fd:69:b2:6a:00:7d:\n                    17:f7\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Subject Key Identifier: \n                7D:E4:9C:6B:E6:F9:71:7D:46:D2:12:3D:AD:6B:1D:FD:C2:AA:78:4C\n            X509v3 Authority Key Identifier: \n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n\n    Signature Algorithm: md5WithRSAEncryption\n        92:13:81:0c:ff:ac:ab:98:52:6c:28:c9:c6:3e:80:c6:ec:77:\n        d0:13:e1:a2:29:1d:2f:b7:c5:95:41:83:60:d9:50:9c:d0:d6:\n        09:f7:0f:97:cd:c0:e6:b2:68:fa:31:c9:2a:a3:d3:1e:53:ae:\n        79:dc:35:ba:b0:d9:e5:7a:37:1b:2a:92:fa:d2:59:90:43:1b:\n        6a:91:c1:db:36:da:e9:39:d3:f5:ac:e3:46:01:ca:55:04:17:\n        1a:b1:97:28:e8:ff:1b:e7:e1:10:c9:b5:31:d8:ce:a6:89:6a:\n        4a:df:78:7b:02:2f:83:b3:41:d5:ef:0b:b6:44:ff:32:a6:cf:\n        1b:c2:f4:b0:75:66:a9:da:6f:7c:a5:e3:c6:c1:3a:2f:bf:f8:\n        12:6f:04:2c:37:f2:4e:fc:b9:09:ff:a4:5b:40:19:e9:58:91:\n        64:82:d6:ad:b9:7f:c0:12:c2:ce:b7:b6:ba:fb:10:a2:3f:74:\n        97:10:39:d4:dc:4a:e5:5c:f7:e5:3a:d9:68:d7:17:6b:f5:51:\n        08:b4:a2:30:0d:cc:36:10:6d:4e:1d:22:cc:48:d1:38:44:ba:\n        cc:2b:47:99:f7:c6:8b:41:24:f3:f1:2c:10:1a:f2:88:bb:b2:\n        e0:fd:44:26:3d:ad:ea:af:1d:d0:00:56:41:4e:f4:b0:3b:9d:\n        32:6f:48:c7\n-----BEGIN CERTIFICATE-----\nMIIDPzCCAiegAwIBAgIBBjANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTEwMjEyMTQ0NDA3WhcNMjEwMjEyMTQ0NDA3WjA8MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxGjAYBgNVBAMTEVBvbGFyU1NMIENlcnQgTUQ1MIIBIjAN\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuTxKxcijjpAXpJ5SqnF1JmGA58e1\nbYz/qrZBJre+Ea1ccxYMZBFIBP/W4TsF24m7s5cJ1RwU3WiHObA9ccvidtAa2Bgt\ngBtU9uVEmvHLr2Eu30kNnQm37bH9PP08+iTPXb985FPnJbXqRCLpJtPqIJSe5mFn\nui4HZwsDL6IJ7fAzjwvOEO9npMYI2sHtwj/XSt0VPfleHIFgRj61sz0vpt5HHLyS\nruvfJ2sWVrfc7NFVV6Vu7HUl9bd736vSOlqRmH2XFwsTCqdrSovBRzD7OvhBBNXB\n37gdv3sBpWWi4B42t6ZczDBa+M1vzfEZYiXKAeM1f/og9dz9abJqAH0X9wIDAQAB\no00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBR95Jxr5vlxfUbSEj2tax39wqp4TDAf\nBgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQQFAAOC\nAQEAkhOBDP+sq5hSbCjJxj6Axux30BPhoikdL7fFlUGDYNlQnNDWCfcPl83A5rJo\n+jHJKqPTHlOuedw1urDZ5Xo3GyqS+tJZkEMbapHB2zba6TnT9azjRgHKVQQXGrGX\nKOj/G+fhEMm1MdjOpolqSt94ewIvg7NB1e8LtkT/MqbPG8L0sHVmqdpvfKXjxsE6\nL7/4Em8ELDfyTvy5Cf+kW0AZ6ViRZILWrbl/wBLCzre2uvsQoj90lxA51NxK5Vz3\n5TrZaNcXa/VRCLSiMA3MNhBtTh0izEjROES6zCtHmffGi0Ek8/EsEBryiLuy4P1E\nJj2t6q8d0ABWQU70sDudMm9Ixw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_sha1.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 7 (0x7)\n        Signature Algorithm: sha1WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb 12 14:44:07 2011 GMT\n            Not After : Feb 12 14:44:07 2021 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Cert SHA1\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:b9:3c:4a:c5:c8:a3:8e:90:17:a4:9e:52:aa:71:\n                    75:26:61:80:e7:c7:b5:6d:8c:ff:aa:b6:41:26:b7:\n                    be:11:ad:5c:73:16:0c:64:11:48:04:ff:d6:e1:3b:\n                    05:db:89:bb:b3:97:09:d5:1c:14:dd:68:87:39:b0:\n                    3d:71:cb:e2:76:d0:1a:d8:18:2d:80:1b:54:f6:e5:\n                    44:9a:f1:cb:af:61:2e:df:49:0d:9d:09:b7:ed:b1:\n                    fd:3c:fd:3c:fa:24:cf:5d:bf:7c:e4:53:e7:25:b5:\n                    ea:44:22:e9:26:d3:ea:20:94:9e:e6:61:67:ba:2e:\n                    07:67:0b:03:2f:a2:09:ed:f0:33:8f:0b:ce:10:ef:\n                    67:a4:c6:08:da:c1:ed:c2:3f:d7:4a:dd:15:3d:f9:\n                    5e:1c:81:60:46:3e:b5:b3:3d:2f:a6:de:47:1c:bc:\n                    92:ae:eb:df:27:6b:16:56:b7:dc:ec:d1:55:57:a5:\n                    6e:ec:75:25:f5:b7:7b:df:ab:d2:3a:5a:91:98:7d:\n                    97:17:0b:13:0a:a7:6b:4a:8b:c1:47:30:fb:3a:f8:\n                    41:04:d5:c1:df:b8:1d:bf:7b:01:a5:65:a2:e0:1e:\n                    36:b7:a6:5c:cc:30:5a:f8:cd:6f:cd:f1:19:62:25:\n                    ca:01:e3:35:7f:fa:20:f5:dc:fd:69:b2:6a:00:7d:\n                    17:f7\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Subject Key Identifier: \n                7D:E4:9C:6B:E6:F9:71:7D:46:D2:12:3D:AD:6B:1D:FD:C2:AA:78:4C\n            X509v3 Authority Key Identifier: \n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n\n    Signature Algorithm: sha1WithRSAEncryption\n        93:26:40:68:3d:e7:62:ea:d1:6a:78:2b:c2:07:f3:0d:3b:f6:\n        69:18:cd:08:5e:31:e7:48:60:08:2a:46:b6:de:d1:35:0a:ec:\n        31:36:83:7d:eb:7c:d8:63:09:c3:e4:c5:10:ca:7c:7b:2f:20:\n        4d:d2:0e:5f:ee:09:e3:84:4f:28:cc:08:74:9a:11:23:5f:de:\n        0e:3a:0f:8b:2d:64:91:05:f6:d5:c7:30:c8:20:ee:6c:c4:62:\n        7c:8d:a8:4d:2e:70:8c:ac:b5:5d:de:9b:10:5c:98:fd:a1:78:\n        9b:9c:f0:73:33:de:2f:8c:59:fa:dc:af:4c:df:97:e3:9d:00:\n        37:9a:fa:d3:67:77:b9:2f:b9:4a:23:ad:f9:b4:a1:b7:ac:c5:\n        a8:0f:62:8c:e6:7e:b4:94:2a:db:f2:fc:52:92:a4:9e:4e:51:\n        4f:9d:c0:ce:ae:3d:17:1c:94:6c:5f:e8:16:b5:ce:2e:e2:5a:\n        cf:6a:db:dd:b0:d4:be:62:a5:46:92:30:7c:7c:fc:05:f8:78:\n        30:93:30:28:ab:69:a1:72:31:dc:3b:97:63:3a:5b:b3:e1:34:\n        86:80:4a:28:f5:dc:d5:84:8c:13:a4:6c:d2:c1:2d:a6:25:d7:\n        6f:c9:93:78:a5:16:ba:d9:17:6e:3e:ca:96:f2:9e:5c:e3:ae:\n        12:2e:a5:11\n-----BEGIN CERTIFICATE-----\nMIIDQDCCAiigAwIBAgIBBzANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTEwMjEyMTQ0NDA3WhcNMjEwMjEyMTQ0NDA3WjA9MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxGzAZBgNVBAMTElBvbGFyU1NMIENlcnQgU0hBMTCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALk8SsXIo46QF6SeUqpxdSZhgOfH\ntW2M/6q2QSa3vhGtXHMWDGQRSAT/1uE7BduJu7OXCdUcFN1ohzmwPXHL4nbQGtgY\nLYAbVPblRJrxy69hLt9JDZ0Jt+2x/Tz9PPokz12/fORT5yW16kQi6SbT6iCUnuZh\nZ7ouB2cLAy+iCe3wM48LzhDvZ6TGCNrB7cI/10rdFT35XhyBYEY+tbM9L6beRxy8\nkq7r3ydrFla33OzRVVelbux1JfW3e9+r0jpakZh9lxcLEwqna0qLwUcw+zr4QQTV\nwd+4Hb97AaVlouAeNremXMwwWvjNb83xGWIlygHjNX/6IPXc/WmyagB9F/cCAwEA\nAaNNMEswCQYDVR0TBAIwADAdBgNVHQ4EFgQUfeSca+b5cX1G0hI9rWsd/cKqeEww\nHwYDVR0jBBgwFoAUtFrkpbPe0lL2udWmlQ/rPrzH/f8wDQYJKoZIhvcNAQEFBQAD\nggEBAJMmQGg952Lq0Wp4K8IH8w079mkYzQheMedIYAgqRrbe0TUK7DE2g33rfNhj\nCcPkxRDKfHsvIE3SDl/uCeOETyjMCHSaESNf3g46D4stZJEF9tXHMMgg7mzEYnyN\nqE0ucIystV3emxBcmP2heJuc8HMz3i+MWfrcr0zfl+OdADea+tNnd7kvuUojrfm0\nobesxagPYozmfrSUKtvy/FKSpJ5OUU+dwM6uPRcclGxf6Ba1zi7iWs9q292w1L5i\npUaSMHx8/AX4eDCTMCiraaFyMdw7l2M6W7PhNIaASij13NWEjBOkbNLBLaYl12/J\nk3ilFrrZF24+ypbynlzjrhIupRE=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_sha224.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 8 (0x8)\n        Signature Algorithm: sha224WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb 12 14:44:07 2011 GMT\n            Not After : Feb 12 14:44:07 2021 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Cert SHA224\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:b9:3c:4a:c5:c8:a3:8e:90:17:a4:9e:52:aa:71:\n                    75:26:61:80:e7:c7:b5:6d:8c:ff:aa:b6:41:26:b7:\n                    be:11:ad:5c:73:16:0c:64:11:48:04:ff:d6:e1:3b:\n                    05:db:89:bb:b3:97:09:d5:1c:14:dd:68:87:39:b0:\n                    3d:71:cb:e2:76:d0:1a:d8:18:2d:80:1b:54:f6:e5:\n                    44:9a:f1:cb:af:61:2e:df:49:0d:9d:09:b7:ed:b1:\n                    fd:3c:fd:3c:fa:24:cf:5d:bf:7c:e4:53:e7:25:b5:\n                    ea:44:22:e9:26:d3:ea:20:94:9e:e6:61:67:ba:2e:\n                    07:67:0b:03:2f:a2:09:ed:f0:33:8f:0b:ce:10:ef:\n                    67:a4:c6:08:da:c1:ed:c2:3f:d7:4a:dd:15:3d:f9:\n                    5e:1c:81:60:46:3e:b5:b3:3d:2f:a6:de:47:1c:bc:\n                    92:ae:eb:df:27:6b:16:56:b7:dc:ec:d1:55:57:a5:\n                    6e:ec:75:25:f5:b7:7b:df:ab:d2:3a:5a:91:98:7d:\n                    97:17:0b:13:0a:a7:6b:4a:8b:c1:47:30:fb:3a:f8:\n                    41:04:d5:c1:df:b8:1d:bf:7b:01:a5:65:a2:e0:1e:\n                    36:b7:a6:5c:cc:30:5a:f8:cd:6f:cd:f1:19:62:25:\n                    ca:01:e3:35:7f:fa:20:f5:dc:fd:69:b2:6a:00:7d:\n                    17:f7\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Subject Key Identifier: \n                7D:E4:9C:6B:E6:F9:71:7D:46:D2:12:3D:AD:6B:1D:FD:C2:AA:78:4C\n            X509v3 Authority Key Identifier: \n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n\n    Signature Algorithm: sha224WithRSAEncryption\n        b8:9b:0a:d1:b4:d1:a4:ce:05:39:42:7a:3b:7b:5e:fd:97:57:\n        8a:36:60:42:39:d0:e6:0c:9c:7e:2f:2b:be:ef:e7:45:34:77:\n        48:7a:10:4a:fd:76:ca:42:39:25:3c:fa:19:f8:63:6c:e7:36:\n        27:9a:ec:06:ce:e4:f7:2c:2e:c6:36:c1:25:bd:ab:09:aa:e2:\n        da:4e:de:ae:b5:f5:ba:9e:90:24:52:34:96:96:61:4c:26:b5:\n        57:65:b1:10:ed:13:2b:54:90:ce:d3:21:cb:8c:d3:4c:6c:e5:\n        e1:78:22:16:3f:e1:be:f1:ee:5d:39:48:a1:e6:80:46:f4:46:\n        f2:79:03:3e:f1:fc:51:47:d9:05:e8:85:81:1b:0b:4f:fa:85:\n        9d:ce:e7:76:5a:6f:da:98:9f:43:f1:f3:2f:2f:57:28:aa:70:\n        14:82:7f:d5:69:14:8c:f9:82:b6:2f:a6:df:b5:6b:0e:43:c9:\n        96:91:64:3d:8b:a8:17:15:9a:88:42:a4:d0:90:c0:a3:a2:e1:\n        dd:f6:95:6d:3b:9d:71:a6:1e:9e:2c:1e:db:f6:5f:93:43:2c:\n        ed:53:70:55:50:56:df:cd:96:6c:d5:91:0f:b1:a7:f4:b7:17:\n        9d:1f:0b:f6:0b:f8:fe:e7:7c:de:c1:20:b7:fc:69:13:ba:e2:\n        61:9b:a5:62\n-----BEGIN CERTIFICATE-----\nMIIDQjCCAiqgAwIBAgIBCDANBgkqhkiG9w0BAQ4FADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTEwMjEyMTQ0NDA3WhcNMjEwMjEyMTQ0NDA3WjA/MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxHTAbBgNVBAMTFFBvbGFyU1NMIENlcnQgU0hBMjI0MIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuTxKxcijjpAXpJ5SqnF1JmGA\n58e1bYz/qrZBJre+Ea1ccxYMZBFIBP/W4TsF24m7s5cJ1RwU3WiHObA9ccvidtAa\n2BgtgBtU9uVEmvHLr2Eu30kNnQm37bH9PP08+iTPXb985FPnJbXqRCLpJtPqIJSe\n5mFnui4HZwsDL6IJ7fAzjwvOEO9npMYI2sHtwj/XSt0VPfleHIFgRj61sz0vpt5H\nHLySruvfJ2sWVrfc7NFVV6Vu7HUl9bd736vSOlqRmH2XFwsTCqdrSovBRzD7OvhB\nBNXB37gdv3sBpWWi4B42t6ZczDBa+M1vzfEZYiXKAeM1f/og9dz9abJqAH0X9wID\nAQABo00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBR95Jxr5vlxfUbSEj2tax39wqp4\nTDAfBgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQ4F\nAAOCAQEAuJsK0bTRpM4FOUJ6O3te/ZdXijZgQjnQ5gycfi8rvu/nRTR3SHoQSv12\nykI5JTz6GfhjbOc2J5rsBs7k9ywuxjbBJb2rCari2k7errX1up6QJFI0lpZhTCa1\nV2WxEO0TK1SQztMhy4zTTGzl4XgiFj/hvvHuXTlIoeaARvRG8nkDPvH8UUfZBeiF\ngRsLT/qFnc7ndlpv2pifQ/HzLy9XKKpwFIJ/1WkUjPmCti+m37VrDkPJlpFkPYuo\nFxWaiEKk0JDAo6Lh3faVbTudcaYeniwe2/Zfk0Ms7VNwVVBW382WbNWRD7Gn9LcX\nnR8L9gv4/ud83sEgt/xpE7riYZulYg==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_sha256.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 9 (0x9)\n        Signature Algorithm: sha256WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb 12 14:44:07 2011 GMT\n            Not After : Feb 12 14:44:07 2021 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Cert SHA256\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:b9:3c:4a:c5:c8:a3:8e:90:17:a4:9e:52:aa:71:\n                    75:26:61:80:e7:c7:b5:6d:8c:ff:aa:b6:41:26:b7:\n                    be:11:ad:5c:73:16:0c:64:11:48:04:ff:d6:e1:3b:\n                    05:db:89:bb:b3:97:09:d5:1c:14:dd:68:87:39:b0:\n                    3d:71:cb:e2:76:d0:1a:d8:18:2d:80:1b:54:f6:e5:\n                    44:9a:f1:cb:af:61:2e:df:49:0d:9d:09:b7:ed:b1:\n                    fd:3c:fd:3c:fa:24:cf:5d:bf:7c:e4:53:e7:25:b5:\n                    ea:44:22:e9:26:d3:ea:20:94:9e:e6:61:67:ba:2e:\n                    07:67:0b:03:2f:a2:09:ed:f0:33:8f:0b:ce:10:ef:\n                    67:a4:c6:08:da:c1:ed:c2:3f:d7:4a:dd:15:3d:f9:\n                    5e:1c:81:60:46:3e:b5:b3:3d:2f:a6:de:47:1c:bc:\n                    92:ae:eb:df:27:6b:16:56:b7:dc:ec:d1:55:57:a5:\n                    6e:ec:75:25:f5:b7:7b:df:ab:d2:3a:5a:91:98:7d:\n                    97:17:0b:13:0a:a7:6b:4a:8b:c1:47:30:fb:3a:f8:\n                    41:04:d5:c1:df:b8:1d:bf:7b:01:a5:65:a2:e0:1e:\n                    36:b7:a6:5c:cc:30:5a:f8:cd:6f:cd:f1:19:62:25:\n                    ca:01:e3:35:7f:fa:20:f5:dc:fd:69:b2:6a:00:7d:\n                    17:f7\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Subject Key Identifier: \n                7D:E4:9C:6B:E6:F9:71:7D:46:D2:12:3D:AD:6B:1D:FD:C2:AA:78:4C\n            X509v3 Authority Key Identifier: \n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n\n    Signature Algorithm: sha256WithRSAEncryption\n        69:ce:f9:a9:d5:e2:32:db:fe:a9:f9:92:7a:d6:76:37:05:51:\n        c9:e3:a1:03:72:b2:bc:2c:86:4b:31:16:02:10:e8:43:d4:c0:\n        33:3c:4f:ea:9d:12:6b:57:51:bc:d7:d9:42:56:cf:c7:29:e7:\n        d7:52:24:49:29:ac:9c:de:8f:cc:ab:1a:a9:62:07:5a:6b:f7:\n        fb:19:ab:f5:b1:2c:a4:aa:dc:5d:03:73:17:7c:ea:52:44:80:\n        ca:70:d3:10:c5:2e:fd:9f:d2:0d:65:c4:f2:cc:ef:1b:18:e1:\n        0a:08:4e:67:d0:56:7f:24:54:2e:73:31:b5:4d:22:74:f8:30:\n        f9:92:c4:64:c9:46:80:d4:e1:bd:d6:e7:26:ea:bb:c4:fe:6f:\n        a2:c5:10:e4:64:2f:b0:44:04:2c:b3:44:39:cf:b4:de:ac:83:\n        43:5e:0b:ca:cd:fb:4e:18:e6:38:39:e7:10:3f:d6:59:17:e7:\n        42:ef:00:e3:88:c6:43:bc:21:12:bf:20:a8:64:c6:30:dc:8c:\n        6b:b8:6a:ce:6b:8a:22:3b:d8:af:0c:b4:bb:4d:be:96:dd:40:\n        d9:87:3e:95:2e:1a:27:23:62:e8:6e:bd:e0:89:d0:a7:28:16:\n        95:ea:cb:89:a3:f7:7f:fb:0f:ac:ab:d6:a8:b4:cb:43:92:d9:\n        cb:3e:8a:11\n-----BEGIN CERTIFICATE-----\nMIIDQjCCAiqgAwIBAgIBCTANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTEwMjEyMTQ0NDA3WhcNMjEwMjEyMTQ0NDA3WjA/MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxHTAbBgNVBAMTFFBvbGFyU1NMIENlcnQgU0hBMjU2MIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuTxKxcijjpAXpJ5SqnF1JmGA\n58e1bYz/qrZBJre+Ea1ccxYMZBFIBP/W4TsF24m7s5cJ1RwU3WiHObA9ccvidtAa\n2BgtgBtU9uVEmvHLr2Eu30kNnQm37bH9PP08+iTPXb985FPnJbXqRCLpJtPqIJSe\n5mFnui4HZwsDL6IJ7fAzjwvOEO9npMYI2sHtwj/XSt0VPfleHIFgRj61sz0vpt5H\nHLySruvfJ2sWVrfc7NFVV6Vu7HUl9bd736vSOlqRmH2XFwsTCqdrSovBRzD7OvhB\nBNXB37gdv3sBpWWi4B42t6ZczDBa+M1vzfEZYiXKAeM1f/og9dz9abJqAH0X9wID\nAQABo00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBR95Jxr5vlxfUbSEj2tax39wqp4\nTDAfBgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQsF\nAAOCAQEAac75qdXiMtv+qfmSetZ2NwVRyeOhA3KyvCyGSzEWAhDoQ9TAMzxP6p0S\na1dRvNfZQlbPxynn11IkSSmsnN6PzKsaqWIHWmv3+xmr9bEspKrcXQNzF3zqUkSA\nynDTEMUu/Z/SDWXE8szvGxjhCghOZ9BWfyRULnMxtU0idPgw+ZLEZMlGgNThvdbn\nJuq7xP5vosUQ5GQvsEQELLNEOc+03qyDQ14Lys37ThjmODnnED/WWRfnQu8A44jG\nQ7whEr8gqGTGMNyMa7hqzmuKIjvYrwy0u02+lt1A2Yc+lS4aJyNi6G694InQpygW\nlerLiaP3f/sPrKvWqLTLQ5LZyz6KEQ==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_sha384.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 10 (0xa)\n        Signature Algorithm: sha384WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb 12 14:44:07 2011 GMT\n            Not After : Feb 12 14:44:07 2021 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Cert SHA384\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:b9:3c:4a:c5:c8:a3:8e:90:17:a4:9e:52:aa:71:\n                    75:26:61:80:e7:c7:b5:6d:8c:ff:aa:b6:41:26:b7:\n                    be:11:ad:5c:73:16:0c:64:11:48:04:ff:d6:e1:3b:\n                    05:db:89:bb:b3:97:09:d5:1c:14:dd:68:87:39:b0:\n                    3d:71:cb:e2:76:d0:1a:d8:18:2d:80:1b:54:f6:e5:\n                    44:9a:f1:cb:af:61:2e:df:49:0d:9d:09:b7:ed:b1:\n                    fd:3c:fd:3c:fa:24:cf:5d:bf:7c:e4:53:e7:25:b5:\n                    ea:44:22:e9:26:d3:ea:20:94:9e:e6:61:67:ba:2e:\n                    07:67:0b:03:2f:a2:09:ed:f0:33:8f:0b:ce:10:ef:\n                    67:a4:c6:08:da:c1:ed:c2:3f:d7:4a:dd:15:3d:f9:\n                    5e:1c:81:60:46:3e:b5:b3:3d:2f:a6:de:47:1c:bc:\n                    92:ae:eb:df:27:6b:16:56:b7:dc:ec:d1:55:57:a5:\n                    6e:ec:75:25:f5:b7:7b:df:ab:d2:3a:5a:91:98:7d:\n                    97:17:0b:13:0a:a7:6b:4a:8b:c1:47:30:fb:3a:f8:\n                    41:04:d5:c1:df:b8:1d:bf:7b:01:a5:65:a2:e0:1e:\n                    36:b7:a6:5c:cc:30:5a:f8:cd:6f:cd:f1:19:62:25:\n                    ca:01:e3:35:7f:fa:20:f5:dc:fd:69:b2:6a:00:7d:\n                    17:f7\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Subject Key Identifier: \n                7D:E4:9C:6B:E6:F9:71:7D:46:D2:12:3D:AD:6B:1D:FD:C2:AA:78:4C\n            X509v3 Authority Key Identifier: \n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n\n    Signature Algorithm: sha384WithRSAEncryption\n        68:e6:03:f0:ba:44:e7:cc:e1:b2:07:6c:56:c8:be:b7:ba:80:\n        61:c8:f9:66:57:e1:cb:60:7d:cd:8d:0f:66:b0:f2:61:45:fd:\n        fc:c8:93:95:bb:b4:14:00:76:c7:e1:57:a6:e2:60:31:8b:fc:\n        e1:0f:68:24:4c:bb:1d:c5:b6:77:ec:23:e1:5b:4f:10:6c:6a:\n        e0:6d:e7:34:f8:72:14:ae:16:57:25:8b:e8:b9:71:a1:d0:78:\n        ea:18:c1:51:c4:2e:26:6d:cb:80:8d:a5:b9:de:e7:37:c1:2b:\n        ec:e8:98:c6:f9:1a:bf:fe:a3:de:3d:d6:59:98:45:dc:4a:a6:\n        ad:0a:af:73:50:43:23:5a:9b:9a:f9:8f:ff:41:15:e5:9c:12:\n        9e:29:55:5c:79:9c:89:0c:c8:8a:82:86:b1:96:ae:7c:7d:4f:\n        0b:fd:e3:9e:8b:a5:4d:88:55:05:ad:6c:63:aa:74:0c:41:0d:\n        47:22:cc:1a:45:02:92:5e:d1:e0:b9:31:52:ff:f6:30:f0:87:\n        2c:dd:fa:fa:b9:cc:45:cb:36:33:5b:35:7f:5f:05:4f:e0:8f:\n        9a:e4:d2:fa:c9:d4:fc:62:99:ac:59:fb:fd:04:bc:5a:c0:47:\n        5e:5d:3d:df:31:8c:7f:dc:00:cb:cb:c0:f4:62:41:44:db:1d:\n        ba:c0:ad:8a\n-----BEGIN CERTIFICATE-----\nMIIDQjCCAiqgAwIBAgIBCjANBgkqhkiG9w0BAQwFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTEwMjEyMTQ0NDA3WhcNMjEwMjEyMTQ0NDA3WjA/MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxHTAbBgNVBAMTFFBvbGFyU1NMIENlcnQgU0hBMzg0MIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuTxKxcijjpAXpJ5SqnF1JmGA\n58e1bYz/qrZBJre+Ea1ccxYMZBFIBP/W4TsF24m7s5cJ1RwU3WiHObA9ccvidtAa\n2BgtgBtU9uVEmvHLr2Eu30kNnQm37bH9PP08+iTPXb985FPnJbXqRCLpJtPqIJSe\n5mFnui4HZwsDL6IJ7fAzjwvOEO9npMYI2sHtwj/XSt0VPfleHIFgRj61sz0vpt5H\nHLySruvfJ2sWVrfc7NFVV6Vu7HUl9bd736vSOlqRmH2XFwsTCqdrSovBRzD7OvhB\nBNXB37gdv3sBpWWi4B42t6ZczDBa+M1vzfEZYiXKAeM1f/og9dz9abJqAH0X9wID\nAQABo00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBR95Jxr5vlxfUbSEj2tax39wqp4\nTDAfBgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQwF\nAAOCAQEAaOYD8LpE58zhsgdsVsi+t7qAYcj5Zlfhy2B9zY0PZrDyYUX9/MiTlbu0\nFAB2x+FXpuJgMYv84Q9oJEy7HcW2d+wj4VtPEGxq4G3nNPhyFK4WVyWL6LlxodB4\n6hjBUcQuJm3LgI2lud7nN8Er7OiYxvkav/6j3j3WWZhF3EqmrQqvc1BDI1qbmvmP\n/0EV5ZwSnilVXHmciQzIioKGsZaufH1PC/3jnoulTYhVBa1sY6p0DEENRyLMGkUC\nkl7R4LkxUv/2MPCHLN36+rnMRcs2M1s1f18FT+CPmuTS+snU/GKZrFn7/QS8WsBH\nXl093zGMf9wAy8vA9GJBRNsdusCtig==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_sha512.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 11 (0xb)\n        Signature Algorithm: sha512WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb 12 14:44:07 2011 GMT\n            Not After : Feb 12 14:44:07 2021 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Cert SHA512\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:b9:3c:4a:c5:c8:a3:8e:90:17:a4:9e:52:aa:71:\n                    75:26:61:80:e7:c7:b5:6d:8c:ff:aa:b6:41:26:b7:\n                    be:11:ad:5c:73:16:0c:64:11:48:04:ff:d6:e1:3b:\n                    05:db:89:bb:b3:97:09:d5:1c:14:dd:68:87:39:b0:\n                    3d:71:cb:e2:76:d0:1a:d8:18:2d:80:1b:54:f6:e5:\n                    44:9a:f1:cb:af:61:2e:df:49:0d:9d:09:b7:ed:b1:\n                    fd:3c:fd:3c:fa:24:cf:5d:bf:7c:e4:53:e7:25:b5:\n                    ea:44:22:e9:26:d3:ea:20:94:9e:e6:61:67:ba:2e:\n                    07:67:0b:03:2f:a2:09:ed:f0:33:8f:0b:ce:10:ef:\n                    67:a4:c6:08:da:c1:ed:c2:3f:d7:4a:dd:15:3d:f9:\n                    5e:1c:81:60:46:3e:b5:b3:3d:2f:a6:de:47:1c:bc:\n                    92:ae:eb:df:27:6b:16:56:b7:dc:ec:d1:55:57:a5:\n                    6e:ec:75:25:f5:b7:7b:df:ab:d2:3a:5a:91:98:7d:\n                    97:17:0b:13:0a:a7:6b:4a:8b:c1:47:30:fb:3a:f8:\n                    41:04:d5:c1:df:b8:1d:bf:7b:01:a5:65:a2:e0:1e:\n                    36:b7:a6:5c:cc:30:5a:f8:cd:6f:cd:f1:19:62:25:\n                    ca:01:e3:35:7f:fa:20:f5:dc:fd:69:b2:6a:00:7d:\n                    17:f7\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Subject Key Identifier: \n                7D:E4:9C:6B:E6:F9:71:7D:46:D2:12:3D:AD:6B:1D:FD:C2:AA:78:4C\n            X509v3 Authority Key Identifier: \n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n\n    Signature Algorithm: sha512WithRSAEncryption\n        84:68:78:72:54:00:bf:8a:45:28:35:be:18:47:d8:69:f6:67:\n        de:a6:f8:a6:d0:fd:9f:79:f7:e8:02:8a:c3:83:5d:85:45:cc:\n        b6:98:77:a7:18:3f:6b:d2:e4:d0:af:d5:52:d9:db:7e:4a:d3:\n        68:b0:08:64:14:de:c2:3b:1d:7b:ac:79:ad:49:5a:4c:f6:d2:\n        35:ef:a4:8c:b7:5b:d1:0b:7b:50:c6:9c:48:3e:96:3b:1b:0b:\n        0e:e8:10:3f:8c:3b:4f:6b:1d:5c:3a:27:f3:43:22:ac:37:11:\n        71:b8:07:66:b0:f8:71:c3:22:cf:f4:96:83:93:fb:42:b0:1a:\n        43:f9:4b:df:cb:5f:0f:ba:9e:80:f1:ff:08:3a:46:51:dc:d0:\n        36:bd:b1:c4:ca:fb:00:12:e7:e0:37:70:40:0e:73:19:63:c2:\n        e5:da:56:77:07:68:a5:40:9e:d6:0f:ad:b5:b3:b2:f5:3f:01:\n        e8:68:e7:a3:b0:d7:f3:dd:ff:b6:d7:8f:75:4e:25:ab:12:32:\n        99:45:ad:57:40:de:d7:b4:0d:d0:c3:66:89:47:f2:0c:b2:b5:\n        df:52:0e:fa:63:62:65:89:07:4a:80:69:0e:4e:ba:c0:43:5d:\n        05:75:22:cf:50:f9:ac:bd:ef:8d:8c:10:08:b6:8b:62:4f:a1:\n        60:55:a3:0d\n-----BEGIN CERTIFICATE-----\nMIIDQjCCAiqgAwIBAgIBCzANBgkqhkiG9w0BAQ0FADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTEwMjEyMTQ0NDA3WhcNMjEwMjEyMTQ0NDA3WjA/MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxHTAbBgNVBAMTFFBvbGFyU1NMIENlcnQgU0hBNTEyMIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuTxKxcijjpAXpJ5SqnF1JmGA\n58e1bYz/qrZBJre+Ea1ccxYMZBFIBP/W4TsF24m7s5cJ1RwU3WiHObA9ccvidtAa\n2BgtgBtU9uVEmvHLr2Eu30kNnQm37bH9PP08+iTPXb985FPnJbXqRCLpJtPqIJSe\n5mFnui4HZwsDL6IJ7fAzjwvOEO9npMYI2sHtwj/XSt0VPfleHIFgRj61sz0vpt5H\nHLySruvfJ2sWVrfc7NFVV6Vu7HUl9bd736vSOlqRmH2XFwsTCqdrSovBRzD7OvhB\nBNXB37gdv3sBpWWi4B42t6ZczDBa+M1vzfEZYiXKAeM1f/og9dz9abJqAH0X9wID\nAQABo00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBR95Jxr5vlxfUbSEj2tax39wqp4\nTDAfBgNVHSMEGDAWgBS0WuSls97SUva51aaVD+s+vMf9/zANBgkqhkiG9w0BAQ0F\nAAOCAQEAhGh4clQAv4pFKDW+GEfYafZn3qb4ptD9n3n36AKKw4NdhUXMtph3pxg/\na9Lk0K/VUtnbfkrTaLAIZBTewjsde6x5rUlaTPbSNe+kjLdb0Qt7UMacSD6WOxsL\nDugQP4w7T2sdXDon80MirDcRcbgHZrD4ccMiz/SWg5P7QrAaQ/lL38tfD7qegPH/\nCDpGUdzQNr2xxMr7ABLn4DdwQA5zGWPC5dpWdwdopUCe1g+ttbOy9T8B6Gjno7DX\n893/ttePdU4lqxIymUWtV0De17QN0MNmiUfyDLK131IO+mNiZYkHSoBpDk66wENd\nBXUiz1D5rL3vjYwQCLaLYk+hYFWjDQ==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cert_v1_with_ext.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDzTCCArUCCQC97UTH0j7CpDANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC\nWFgxCzAJBgNVBAgTAlhYMQswCQYDVQQHEwJYWDELMAkGA1UEChMCWFgxCzAJBgNV\nBAsTAlhYMScwJQYJKoZIhvcNAQkBFhhhZG1pbkBpZGVudGl0eS1jaGVjay5vcmcx\nGzAZBgNVBAMTEmlkZW50aXR5LWNoZWNrLm9yZzAeFw0xMzA3MDQxNjE3MDJaFw0x\nNDA3MDQxNjE3MDJaMIGHMQswCQYDVQQGEwJYWDELMAkGA1UECBMCWFgxCzAJBgNV\nBAcTAlhYMQswCQYDVQQKEwJYWDELMAkGA1UECxMCWFgxJzAlBgkqhkiG9w0BCQEW\nGGFkbWluQGlkZW50aXR5LWNoZWNrLm9yZzEbMBkGA1UEAxMSaWRlbnRpdHktY2hl\nY2sub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1v8FswMughO8\nmwkHWAf+XRpK33kYR0ifBnObvk2R9ZTEUk/TfFEEFVlen5xhiE0g8lbCj8Y5Mzsg\nwZsJv5in/KnraYb7VC0ah0jx4sMkhKRcyUWfjyH8r7FNH1j1jd08ZpWJGotYxxaL\nevqom1rzLN99JPObwyCCgGcQjlRV7cMfIgwlwHb/JPXOy/hYAgjrCjqvBu3nL5/b\nHF0PyVGiKCEQiHhMBKNjAxzQrCUGy7Vp+3QlIYrs6/m5A96vohX/j+wzwIp3QgiK\nYhj5E4Zo/iQLf6Rwl7pL4RTdT+crcy143mYiShNY+ayl9snfVJNnuHaMe15fVEsP\nX9lDvdBvXwIDAQABoz8wPTA7BgNVHREENDAyghJpZGVudGl0eS1jaGVjay5vcmeC\nFnd3dy5pZGVudGl0eS1jaGVjay5vcmeHBCU7/jAwDQYJKoZIhvcNAQEFBQADggEB\nAAXUXoWlQxKvSCVWhes8x03MCude0nDqDFH1DPGIKeVeWOw87nVni+hIvy8II6hj\n5ZfGSHuZci2AgElA3tXk2qDcZ/uBXe2VV4IwsgXKUYSlpz1xoU55InT4e7KdssEP\nHOyrU03Dzm8Jk0PhgEJpV48tkWYoJvZvOiwG0e43UPDv9xp8C8EbvJmmuWkUWnNW\no0yDnoAOxGfUGSUQ1guTpWCoQEKj3DS4v4lI0kNmJm+oRE2vv1XealWEHSuMpRZO\nQhy8WImX3muw99MP579tY44D5Z7p3kpiC1bwV3tzkHdf5mkrAbFJIfliPvjMrPMw\n2eyXXijDsebpT0w3ruMxjHg=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cli-rsa-sha1.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDhTCCAm2gAwIBAgIBBDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTcwNTA1MTMwNzEwWhcNMjcwNTA2MTMwNzEwWjA8MQswCQYDVQQGEwJOTDERMA8G\nA1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f\nM60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu\n1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw\nMjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v\n4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/\n/DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB\no4GSMIGPMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITBjBgNVHSMEXDBa\ngBS0WuSls97SUva51aaVD+s+vMf9/6E/pD0wOzELMAkGA1UEBhMCTkwxETAPBgNV\nBAoMCFBvbGFyU1NMMRkwFwYDVQQDDBBQb2xhclNTTCBUZXN0IENBggEAMAkGA1Ud\nEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBAE/yq2fOqjI0jm52TwdVsTUvZ+B2s16u\nC4Qj/c89iZ7VfplpOAEV9+G6gHm/gf2O7Jgj0yXfFugQ2d+lR70cH64JFn9N1Rg9\ngCo5EDBLourI8R0Kkg9zdlShBv7giwqg667Qjsu+oEWVerICOqNQGolotYSZvmtJ\n7RiD8I4MXB4Qt0sSjxE897pvc4ODem10zXzvedv/q11q1mUn2L1fFc1dGIguk1fn\nI/XP87FCapRobUTYrF6IvdqFaUMQ7lF3GiUIvjDPb4Wt1CyHhi/tu/SfV3fmX3rs\n19UeGnvC7AdQ+OwLt3nEIlSpqVKPXHKfRKZg1WzZNgCQtNB1SrZAzFc=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cli-rsa-sha256.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDhTCCAm2gAwIBAgIBBDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UECgwIUG9sYXJTU0wxGTAXBgNVBAMMEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTcwNTA1MTMwNzU5WhcNMjcwNTA2MTMwNzU5WjA8MQswCQYDVQQGEwJOTDERMA8G\nA1UECgwIUG9sYXJTU0wxGjAYBgNVBAMMEVBvbGFyU1NMIENsaWVudCAyMIIBIjAN\nBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6f\nM60Nj4o8VmXl3ETZzGaFB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu\n1C93KYRhTYJQj6eVSHD1bk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEw\nMjDV0/YI0FZPRo7yX/k9Z5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v\n4Jv4EFbMs44TFeY0BGbH7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx/\n/DZrtenNLQNiTrM9AM+vdqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQAB\no4GSMIGPMB0GA1UdDgQWBBRxoQBzckAvVHZeM/xSj7zx3WtGITBjBgNVHSMEXDBa\ngBS0WuSls97SUva51aaVD+s+vMf9/6E/pD0wOzELMAkGA1UEBhMCTkwxETAPBgNV\nBAoMCFBvbGFyU1NMMRkwFwYDVQQDDBBQb2xhclNTTCBUZXN0IENBggEAMAkGA1Ud\nEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAC7yO786NvcHpK8UovKIG9cB32oSQQom\nLoR0eHDRzdqEkoq7yGZufHFiRAAzbMqJfogRtxlrWAeB4y/jGaMBV25IbFOIcH2W\niCEaMMbG+VQLKNvuC63kmw/Zewc9ThM6Pa1Hcy0axT0faf1B/U01j0FIcw/6mTfK\nD8w48OIwc1yr0JtutCVjig5DC0yznGMt32RyseOLcUe+lfq005v2PAiCozr5X8rE\nofGZpiM2NqRPePgYy+Vc75Zk28xkRQq1ncprgQb3S4vTsZdScpM9hLf+eMlrgqlj\nc5PLSkXBeLE5+fedkyfTaLxxQlgCpuoOhKBm04/R1pWNzUHyqagjO9Q=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cli-rsa.key",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAyHTEzLn5tXnpRdkUYLB9u5Pyax6fM60Nj4o8VmXl3ETZzGaF\nB9X4J7BKNdBjngpuG7fa8H6r7gwQk4ZJGDTzqCrSV/Uu1C93KYRhTYJQj6eVSHD1\nbk2y1RPD0hrt5kPqQhTrdOrA7R/UV06p86jt0uDBMHEwMjDV0/YI0FZPRo7yX/k9\nZ5GIMC5Cst99++UMd//sMcB4j7/Cf8qtbCHWjdmLao5v4Jv4EFbMs44TFeY0BGbH\n7vk2DmqV9gmaBmf0ZXH4yqSxJeD+PIs1BGe64E92hfx//DZrtenNLQNiTrM9AM+v\ndqBpVoNq0qjU51Bx5rU2BXcFbXvI5MT9TNUhXwIDAQABAoIBAGdNtfYDiap6bzst\nyhCiI8m9TtrhZw4MisaEaN/ll3XSjaOG2dvV6xMZCMV+5TeXDHOAZnY18Yi18vzz\n4Ut2TnNFzizCECYNaA2fST3WgInnxUkV3YXAyP6CNxJaCmv2aA0yFr2kFVSeaKGt\nymvljNp2NVkvm7Th8fBQBO7I7AXhz43k0mR7XmPgewe8ApZOG3hstkOaMvbWAvWA\nzCZupdDjZYjOJqlA4eEA4H8/w7F83r5CugeBE8LgEREjLPiyejrU5H1fubEY+h0d\nl5HZBJ68ybTXfQ5U9o/QKA3dd0toBEhhdRUDGzWtjvwkEQfqF1reGWj/tod/gCpf\nDFi6X0ECgYEA4wOv/pjSC3ty6TuOvKX2rOUiBrLXXv2JSxZnMoMiWI5ipLQt+RYT\nVPafL/m7Dn6MbwjayOkcZhBwk5CNz5A6Q4lJ64Mq/lqHznRCQQ2Mc1G8eyDF/fYL\nZe2pLvwP9VD5jTc2miDfw+MnvJhywRRLcemDFP8k4hQVtm8PMp3ZmNECgYEA4gz7\nwzObR4gn8ibe617uQPZjWzUj9dUHYd+in1gwBCIrtNnaRn9I9U/Q6tegRYpii4ys\nc176NmU+umy6XmuSKV5qD9bSpZWG2nLFnslrN15Lm3fhZxoeMNhBaEDTnLT26yoi\n33gp0mSSWy94ZEqipms+ULF6sY1ZtFW6tpGFoy8CgYAQHhnnvJflIs2ky4q10B60\nZcxFp3rtDpkp0JxhFLhiizFrujMtZSjYNm5U7KkgPVHhLELEUvCmOnKTt4ap/vZ0\nBxJNe1GZH3pW6SAvGDQpl9sG7uu/vTFP+lCxukmzxB0DrrDcvorEkKMom7ZCCRvW\nKZsZ6YeH2Z81BauRj218kQKBgQCUV/DgKP2985xDTT79N08jUo3hTP5MVYCCuj/+\nUeEw1TvZcx3LJby7P6Xad6a1/BqveaGyFKIfEFIaBUBItk801sDDpDaYc4gL00Xc\n7lFuBHOZkxJYlss5QrGpuOEl9ZwUt5IrFLBdYaKqNHzNVC1pCPfb/JyH6Dr2HUxq\ngxUwAQKBgQCcU6G2L8AG9d9c0UpOyL1tMvFe5Ttw0KjlQVdsh1MP6yigYo9DYuwu\nbHFVW2r0dBTqegP2/KTOxKzaHfC1qf0RGDsUoJCNJrd1cwoCLG8P2EF4w3OBrKqv\n8u4ytY0F+Vlanj5lm3TaoHSVF1+NWPyOTiwevIECGKwSxvlki4fDAA==\n-----END RSA PRIVATE KEY-----"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cli.opensslconf",
    "content": "[cli-rsa]\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid:always,issuer:always\nbasicConstraints = CA:false\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cli2.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIICLDCCAbKgAwIBAgIBDTAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EwHhcN\nMTMwOTI0MTU1MjA0WhcNMjMwOTIyMTU1MjA0WjBBMQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxHzAdBgNVBAMTFlBvbGFyU1NMIFRlc3QgQ2xpZW50IDIw\nWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARX5a6xc9/TrLuTuIH/Eq7u5lOszlVT\n9jQOzC7jYyUL35ji81xgNpbA1RgUcOV/n9VLRRjlsGzVXPiWj4dwo+THo4GdMIGa\nMAkGA1UdEwQCMAAwHQYDVR0OBBYEFHoAX4Zk/OBd5REQO7LmO8QmP8/iMG4GA1Ud\nIwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8oUKkQDA+MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0GC\nCQDBQ+J+YkPM6DAKBggqhkjOPQQDAgNoADBlAjBKZQ17IIOimbmoD/yN7o89u3BM\nlgOsjnhw3fIOoLIWy2WOGsk/LGF++DzvrRzuNiACMQCd8iem1XS4JK7haj8xocpU\nLwjQje5PDGHfd3h9tP38Qknu5bJqws0md2KOKHyeV0U=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/cli2.key",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIPb3hmTxZ3/mZI3vyk7p3U3wBf+WIop6hDhkFzJhmLcqoAoGCCqGSM49\nAwEHoUQDQgAEV+WusXPf06y7k7iB/xKu7uZTrM5VU/Y0Dswu42MlC9+Y4vNcYDaW\nwNUYFHDlf5/VS0UY5bBs1Vz4lo+HcKPkxw==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-ec-sha1.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBbzCB9gIBATAJBgcqhkjOPQQBMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQ\nb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBFQyBDQRcNMTMwOTI0MTYz\nMTA4WhcNMjMwOTIyMTYzMTA4WjAUMBICAQoXDTEzMDkyNDE2MjgzOFqgcjBwMG4G\nA1UdIwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8oUKkQDA+MQswCQYDVQQGEwJO\nTDERMA8GA1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMg\nQ0GCCQDBQ+J+YkPM6DAJBgcqhkjOPQQBA2kAMGYCMQDVG95rrSSl4dJgbJ5vR1GW\nsvEuEsAh35EhF1WrcadMuCeMQVX9cUPupFfQUpHyMfoCMQCKf0yv8pN9BAoi3FVm\n56meWPhUekgLKKMAobt2oJJY6feuiFU2YFGs1aF0rV6Bj+U=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-ec-sha224.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBcDCB9wIBATAKBggqhkjOPQQDATA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTEzMDkyNDE2\nMzEwOFoXDTIzMDkyMjE2MzEwOFowFDASAgEKFw0xMzA5MjQxNjI4MzhaoHIwcDBu\nBgNVHSMEZzBlgBSdbSAkSQE/K8t4tRm8fiTJ2/s2fKFCpEAwPjELMAkGA1UEBhMC\nTkwxETAPBgNVBAoTCFBvbGFyU1NMMRwwGgYDVQQDExNQb2xhcnNzbCBUZXN0IEVD\nIENBggkAwUPifmJDzOgwCgYIKoZIzj0EAwEDaAAwZQIwbn+i0dOest0IJGzuqBLA\nV5nscZPvHjDV6lWsSwurS4LC/Uv/qWteuMCp3OqQRJHcAjEA6KA0dibovfL1WKFo\nC8jUGxlMfHeWDRkqMfcjjgIpky7v50sKtDOfmFJn3HFUbiKp\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-ec-sha256.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBcTCB9wIBATAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTEzMDkyNDE2\nMzEwOFoXDTIzMDkyMjE2MzEwOFowFDASAgEKFw0xMzA5MjQxNjI4MzhaoHIwcDBu\nBgNVHSMEZzBlgBSdbSAkSQE/K8t4tRm8fiTJ2/s2fKFCpEAwPjELMAkGA1UEBhMC\nTkwxETAPBgNVBAoTCFBvbGFyU1NMMRwwGgYDVQQDExNQb2xhcnNzbCBUZXN0IEVD\nIENBggkAwUPifmJDzOgwCgYIKoZIzj0EAwIDaQAwZgIxAKuQ684s7gyhtxKJr6Ln\nS2BQ02f1jjPHrZVdXaZvm3C5tGi2cKkoK1aMiyC3LsRCuAIxAIMhj0TmcuIZr5fX\ng5RByD7zUnZBpoEAdgxFy4JPJ2IViWOPekSGh8b/JY1VNS6Zbw==\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-ec-sha384.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBcDCB9wIBATAKBggqhkjOPQQDAzA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTEzMDkyNDE2\nMzEwOFoXDTIzMDkyMjE2MzEwOFowFDASAgEKFw0xMzA5MjQxNjI4MzhaoHIwcDBu\nBgNVHSMEZzBlgBSdbSAkSQE/K8t4tRm8fiTJ2/s2fKFCpEAwPjELMAkGA1UEBhMC\nTkwxETAPBgNVBAoTCFBvbGFyU1NMMRwwGgYDVQQDExNQb2xhcnNzbCBUZXN0IEVD\nIENBggkAwUPifmJDzOgwCgYIKoZIzj0EAwMDaAAwZQIwateJaD13+Yi4HWBIlOov\n8ZDsvnfQfW/R0A1s2ZccAi+byurShuNGiSvsFSh5d/6QAjEA427F8bNk/fdj5YXu\nOo1qEd7WpD2dNUb0draGSIcJGBRGzi5it14UXr9cR4S5eJ6Q\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-ec-sha512.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBcTCB9wIBATAKBggqhkjOPQQDBDA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTEzMDkyNDE2\nMzEwOFoXDTIzMDkyMjE2MzEwOFowFDASAgEKFw0xMzA5MjQxNjI4MzhaoHIwcDBu\nBgNVHSMEZzBlgBSdbSAkSQE/K8t4tRm8fiTJ2/s2fKFCpEAwPjELMAkGA1UEBhMC\nTkwxETAPBgNVBAoTCFBvbGFyU1NMMRwwGgYDVQQDExNQb2xhcnNzbCBUZXN0IEVD\nIENBggkAwUPifmJDzOgwCgYIKoZIzj0EAwQDaQAwZgIxAL/VFrDIYUECsS0rVpAy\n6zt/CqeAZ1sa/l5LTaG1XW286n2Kibipr6EpkYZNYIQILgIxAI0wb3Py1DHPWpYf\n/BFBH7C3KYq+nWTrLeEnhrjU1LzG/CiQ8lnuskya6lw/P3lJ/A==\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-future.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBgzCCAQoCAQEwCQYHKoZIzj0EATA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTMyMDMxMDEx\nMDUxNVoXDTQyMDMwODExMDUxNVowKDASAgEKFw0xMzA5MjQxNjI4MzhaMBICARYX\nDTE0MDEyMDEzNDMwNVqgcjBwMG4GA1UdIwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb\n+zZ8oUKkQDA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMIUG9sYXJTU0wxHDAaBgNV\nBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0GCCQDBQ+J+YkPM6DAJBgcqhkjOPQQBA2gA\nMGUCMQCmsvNsOQdbGpmzpeZlKU9lDP6yyWenrI/89swZYogE3cSPob4tOzeYg38i\nor91IPgCMD7N/0Qz6Nq2IgBtZORLgsA0ltK+W6AOS+/EIhvGuXV8uguUyYknl4vb\n+cE+lWxhCQ==\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-malformed-trailing-spaces.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBbzCB9gIBATAJBgcqhkjOPQQBMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQ\nb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBFQyBDQRcNMTMwOTI0MTYz\nMTA4WhcNMjMwOTIyMTYzMTA4WjAUMBICAQoXDTEzMDkyNDE2MjgzOFqgcjBwMG4G\nA1UdIwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb+zZ8oUKkQDA+MQswCQYDVQQGEwJO\nTDERMA8GA1UEChMIUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMg\nQ0GCCQDBQ+J+YkPM6DAJBgcqhkjOPQQBA2kAMGYCMQDVG95rrSSl4dJgbJ5vR1GW\nsvEuEsAh35EhF1WrcadMuCeMQVX9cUPupFfQUpHyMfoCMQCKf0yv8pN9BAoi3FVm\n56meWPhUekgLKKMAobt2oJJY6feuiFU2YFGs1aF0rV6Bj+U=\n-----END X509 CRL-----\n-----BEGIN X509 CRL-----\nMIIBcTCB9wIBATAKBggqhkjOPQQDBDA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTEzMDkyNDE2\nMzEwOFoXDTIzMDkyMjE2MzEwOFowFDASAgEKFw0xMzA5MjQxNjI4MzhaoHIwcDBu\nBgNVHSMEZzBlgBSdbSAkSQE/K8t4tRm8fiTJ2/s2fKFCpEAwPjELMAkGA1UEBhMC\nTkwxETAPBgNVBAoTCFBvbGFyU1NMMRwwGgYDVQQDExNQb2xhcnNzbCBUZXN0IEVD\nIENBggkAwUPifmJDzOgwCgYIKoZIzj0EAwQDaQAwZgIxAL/VFrDIYUECsS0rVpAy\n6zt/CqeAZ1sa/l5LTaG1XW286n2Kibipr6EpkYZNYIQILgIxAI0wb3Py1DHPWpYf\n/BFBH7C3KYq+nWTrLeEnhrjU1LzG/CiQ8lnuskya6lw/P3lJ/A==\n-----END X509 CRL-----      \n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-rsa-pss-sha1-badsign.pem",
    "content": "-----BEGIN X509 CRL-----\nMIICJDCCAQYCAQEwEwYJKoZIhvcNAQEKMAaiBAICAOowOzELMAkGA1UEBhMCTkwx\nETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBFw0x\nNDAxMjAxMzQ2MzVaFw0yNDAxMTgxMzQ2MzVaMCgwEgIBChcNMTMwOTI0MTYyODM4\nWjASAgEWFw0xNDAxMjAxMzQzMDVaoGcwZTBjBgNVHSMEXDBagBS0WuSls97SUva5\n1aaVD+s+vMf9/6E/pD0wOzELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NM\nMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBggEAMBMGCSqGSIb3DQEBCjAGogQC\nAgDqA4IBAQB8ZBX0BEgRcx0lfk1ctELRu1AYoJ5BnsmQpq23Ca4YIP2yb2kTN1ZS\n4fR4SgYcNctgo2JJiNiUkCu1ZnRUOJUy8UlEio0+aeumTNz6CbeJEDhr5NC3oiV0\nMzvLn9rJVLPetOT9UrvvIy8iz5Pn1d8mu5rkt9BKQRq9NQx8riKnSIoTc91NLCMo\nmkCCB55DVbazODSWK19e6yQ0JS454RglOsqRtLJ/EDbi6lCsLXotFt3GEGMrob1O\n7Qck1Z59boaHxGYFEVnx90+4M3/qikVtwZdcBjLEmfuwYvszFw8J2y6Xwmg/HtUa\ny6li0JzWNHtkKUlCv2+SESZbD3NU8GQY\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-rsa-pss-sha1.pem",
    "content": "-----BEGIN X509 CRL-----\nMIICJDCCAQYCAQEwEwYJKoZIhvcNAQEKMAaiBAICAOowOzELMAkGA1UEBhMCTkwx\nETAPBgNVBAoTCFBvbGFyU1NMMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBFw0x\nNDAxMjAxMzQ2MzVaFw0yNDAxMTgxMzQ2MzVaMCgwEgIBChcNMTMwOTI0MTYyODM4\nWjASAgEWFw0xNDAxMjAxMzQzMDVaoGcwZTBjBgNVHSMEXDBagBS0WuSls97SUva5\n1aaVD+s+vMf9/6E/pD0wOzELMAkGA1UEBhMCTkwxETAPBgNVBAoTCFBvbGFyU1NM\nMRkwFwYDVQQDExBQb2xhclNTTCBUZXN0IENBggEAMBMGCSqGSIb3DQEBCjAGogQC\nAgDqA4IBAQB8ZBX0BEgRcx0lfk1ctELRu1AYoJ5BnsmQpq23Ca4YIP2yb2kTN1ZS\n4fR4SgYcNctgo2JJiNiUkCu1ZnRUOJUy8UlEio0+aeumTNz6CbeJEDhr5NC3oiV0\nMzvLn9rJVLPetOT9UrvvIy8iz5Pn1d8mu5rkt9BKQRq9NQx8riKnSIoTc91NLCMo\nmkCCB55DVbazODSWK19e6yQ0JS454RglOsqRtLJ/EDbi6lCsLXotFt3GEGMrob1O\n7Qck1Z59boaHxGYFEVnx90+4M3/qikVtwZdcBjLEmfuwYvszFw8J2y6Xwmg/HtUa\ny6li0JzWNHtkKUlCv2+SESZbD3NU8GQZ\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-rsa-pss-sha224.pem",
    "content": "-----BEGIN X509 CRL-----\nMIICejCCATECAQEwPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQMEAgShGjAYBgkq\nhkiG9w0BAQgwCwYJYIZIAWUDBAIEogQCAgDiMDsxCzAJBgNVBAYTAk5MMREwDwYD\nVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVzdCBDQRcNMTQwMTIw\nMTM1NjA2WhcNMjQwMTE4MTM1NjA2WjAoMBICAQoXDTEzMDkyNDE2MjgzOFowEgIB\nFhcNMTQwMTIwMTM0MzA1WqBnMGUwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/r\nPrzH/f+hP6Q9MDsxCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcG\nA1UEAxMQUG9sYXJTU0wgVGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCG\nSAFlAwQCBKEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgSiBAICAOIDggEBAEJI\ni9sQOzMvvOTksN48+X+kk/wkLMKRGI222lqU6y6tP1LX3OE/+KN8gPXR+lCC+e0v\nTsRTJkpKEcmHZoP/8kOtZnLb9PdITKGMQnZ+dmn5MFEzZI/zyrYWuJTuK1Q83w0e\nMc88cAhu8i4PTk/WnsWDphK1Q2YRupmmwWSUpp1Z2rpR+YSCedC01TVrtSUJUBw9\nNSqKDhyWYJIbS6/bFaERswC8xlMRhyLHUvikjmAK36TbIdhTnEffHOPW75sEOEEB\nf0A3VtlZ7y5yt2/a6vOauJCivxKt/PutdHfBqH43QQmoVLWC2FmT9ADTJwcsZB3D\na6JSqCIMRCQY2JOUn0A=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-rsa-pss-sha256.pem",
    "content": "-----BEGIN X509 CRL-----\nMIICejCCATECAQEwPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQMEAgGhGjAYBgkq\nhkiG9w0BAQgwCwYJYIZIAWUDBAIBogQCAgDeMDsxCzAJBgNVBAYTAk5MMREwDwYD\nVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVzdCBDQRcNMTQwMTIw\nMTM1NjE2WhcNMjQwMTE4MTM1NjE2WjAoMBICAQoXDTEzMDkyNDE2MjgzOFowEgIB\nFhcNMTQwMTIwMTM0MzA1WqBnMGUwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/r\nPrzH/f+hP6Q9MDsxCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcG\nA1UEAxMQUG9sYXJTU0wgVGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCG\nSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4DggEBAEZ4\noqp9i5eXrN6aCSTaU1j07MVTFW/U1jQAq6GseB6bEvoEXFMUHJsgAObqCK9flfEC\nFEqXqWSo33hhPU7AKKttbDLjUYRNnQAPRUnRIl1/a1+UjqgKchWWD9ityeW8ICxo\nIdATX9reYmPDLIMqTC7zuflYkvrvdEOuBORQP5mn4j8t84MSQF/p4qzaU0XxLo4X\nckzZCcHpa45AApCDjJMd9onhFVCYsykiYrF9NQFO8TI4lQ5jv79GoufEzvhY1SPB\nr1xz4sMpfyaoPaa3SM2/nD65E5jzXell2u2VWNGKv4zAQP0E5yGel+1rklBltadb\nXLdJyyak33CLBKu+nJc=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-rsa-pss-sha384.pem",
    "content": "-----BEGIN X509 CRL-----\nMIICejCCATECAQEwPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQMEAgKhGjAYBgkq\nhkiG9w0BAQgwCwYJYIZIAWUDBAICogQCAgDOMDsxCzAJBgNVBAYTAk5MMREwDwYD\nVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVzdCBDQRcNMTQwMTIw\nMTM1NjI4WhcNMjQwMTE4MTM1NjI4WjAoMBICAQoXDTEzMDkyNDE2MjgzOFowEgIB\nFhcNMTQwMTIwMTM0MzA1WqBnMGUwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/r\nPrzH/f+hP6Q9MDsxCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcG\nA1UEAxMQUG9sYXJTU0wgVGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCG\nSAFlAwQCAqEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgKiBAICAM4DggEBAAco\nSntUGDLBOAu0IIZaVea5Nt1NMsMcppC0hWPuH1LKAwyUODBqpT+0+AuALK0eIdYR\na7mAB+cv2fFwmwxnQWJ1Fvx4ft/N2AAfB83VRKpSo3xR8bxloHfTWKmyxJHmH9j1\nEYmLS86rj3Nhjf4m/YlQQ3Im5HwOgSgBOE8glq5D+0Wmsi9LsNEZXEzMw7TMUgbs\ny9o/ghYF/shKU4mewK3DeM9gQiTcH5A4ISXR87hBQ08AKJRAG1CLvTyzqWiUUY+k\nq8iZDYF17sHrPi2yn8q9c4zdxiaWDGDdL0Lh90wXGTAageoGEq25TMuL5FpX+u1u\nKUH/xf1jEnNzbYNGiZw=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl-rsa-pss-sha512.pem",
    "content": "-----BEGIN X509 CRL-----\nMIICejCCATECAQEwPgYJKoZIhvcNAQEKMDGgDTALBglghkgBZQMEAgOhGjAYBgkq\nhkiG9w0BAQgwCwYJYIZIAWUDBAIDogQCAgC+MDsxCzAJBgNVBAYTAk5MMREwDwYD\nVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVzdCBDQRcNMTQwMTIw\nMTM1NjM4WhcNMjQwMTE4MTM1NjM4WjAoMBICAQoXDTEzMDkyNDE2MjgzOFowEgIB\nFhcNMTQwMTIwMTM0MzA1WqBnMGUwYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/r\nPrzH/f+hP6Q9MDsxCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcG\nA1UEAxMQUG9sYXJTU0wgVGVzdCBDQYIBADA+BgkqhkiG9w0BAQowMaANMAsGCWCG\nSAFlAwQCA6EaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgOiBAICAL4DggEBAB9F\nywBfxOjetxNbCFhOYoPY2jvFCFVdlowMGuxEhX/LktqiBXqRc2r5naQSzuHqO8Iq\n1zACtiDLri0CvgSHlravBNeY4c2wj//ueFE89tY5pK9E6vZp7cV+RfMx2YfGPAA2\nt7tWZ2rJWzELg8cZ8hpjSwFH7JmgJzjE5gi2gADhBYO6Vv5S3SOgqNjiN1OM31AU\np6GHK5Y1jurF5Zwzs+w3wXoXgpOxxwEC4eiS86c9kNSudwTLvDTU0bYEQE1cF+K0\nsB8QWABFJfuO5kjD2w3rWgmAiOKsZoxd1xrda+WD3JhDXnoVq3oVBIVlWVz6YID8\nenMfMvwScA5AImzu9xA=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIyMDEwMjI1\nOVoXDTE5MTEyNTEwMjI1OVowKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEFBQADggEBAJYuWdKPdblMVWCnxpMnchuL\ndqWzK2BA0RelCaGjpxuwX3NmLDm+5hKja/DJxaRqTOf4RSC3kcX8CdIldsLO96dz\n//wAQdFPDhy6AFT5vKTO8ItPHDb7qFOqFqpeJi5XN1yoZGTB1ei0mgD3xBaKbp6U\nyCOZJSIFomt7piT4GcgWVHLUmpyHDDeodNhYPrN0jf2mr+ECd9fQJYdz1qm0Xx+Q\nNbKXDiPRmPX0qVleCZSeSp1JAmU4GoCO+96qQUpjgll+6xWya3UNj61f9sh0Zzr7\n5ug2LZo5uBM/LpNR1K3TLxNCcg7uUPTn9r143d7ivJhPl3tEJn4PXjv6mlLoOgU=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_cat_ec-rsa.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBcTCB9wIBATAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTEzMDkyNDE2\nMzEwOFoXDTIzMDkyMjE2MzEwOFowFDASAgEKFw0xMzA5MjQxNjI4MzhaoHIwcDBu\nBgNVHSMEZzBlgBSdbSAkSQE/K8t4tRm8fiTJ2/s2fKFCpEAwPjELMAkGA1UEBhMC\nTkwxETAPBgNVBAoTCFBvbGFyU1NMMRwwGgYDVQQDExNQb2xhcnNzbCBUZXN0IEVD\nIENBggkAwUPifmJDzOgwCgYIKoZIzj0EAwIDaQAwZgIxAKuQ684s7gyhtxKJr6Ln\nS2BQ02f1jjPHrZVdXaZvm3C5tGi2cKkoK1aMiyC3LsRCuAIxAIMhj0TmcuIZr5fX\ng5RByD7zUnZBpoEAdgxFy4JPJ2IViWOPekSGh8b/JY1VNS6Zbw==\n-----END X509 CRL-----\n-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIyMDEwMjI1\nOVoXDTE5MTEyNTEwMjI1OVowKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEFBQADggEBAJYuWdKPdblMVWCnxpMnchuL\ndqWzK2BA0RelCaGjpxuwX3NmLDm+5hKja/DJxaRqTOf4RSC3kcX8CdIldsLO96dz\n//wAQdFPDhy6AFT5vKTO8ItPHDb7qFOqFqpeJi5XN1yoZGTB1ei0mgD3xBaKbp6U\nyCOZJSIFomt7piT4GcgWVHLUmpyHDDeodNhYPrN0jf2mr+ECd9fQJYdz1qm0Xx+Q\nNbKXDiPRmPX0qVleCZSeSp1JAmU4GoCO+96qQUpjgll+6xWya3UNj61f9sh0Zzr7\n5ug2LZo5uBM/LpNR1K3TLxNCcg7uUPTn9r143d7ivJhPl3tEJn4PXjv6mlLoOgU=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_cat_ecfut-rsa.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBgzCCAQoCAQEwCQYHKoZIzj0EATA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTMyMDMxMDEx\nMDUxNVoXDTQyMDMwODExMDUxNVowKDASAgEKFw0xMzA5MjQxNjI4MzhaMBICARYX\nDTE0MDEyMDEzNDMwNVqgcjBwMG4GA1UdIwRnMGWAFJ1tICRJAT8ry3i1Gbx+JMnb\n+zZ8oUKkQDA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMIUG9sYXJTU0wxHDAaBgNV\nBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0GCCQDBQ+J+YkPM6DAJBgcqhkjOPQQBA2gA\nMGUCMQCmsvNsOQdbGpmzpeZlKU9lDP6yyWenrI/89swZYogE3cSPob4tOzeYg38i\nor91IPgCMD7N/0Qz6Nq2IgBtZORLgsA0ltK+W6AOS+/EIhvGuXV8uguUyYknl4vb\n+cE+lWxhCQ==\n-----END X509 CRL-----\n-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIyMDEwMjI1\nOVoXDTE5MTEyNTEwMjI1OVowKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEFBQADggEBAJYuWdKPdblMVWCnxpMnchuL\ndqWzK2BA0RelCaGjpxuwX3NmLDm+5hKja/DJxaRqTOf4RSC3kcX8CdIldsLO96dz\n//wAQdFPDhy6AFT5vKTO8ItPHDb7qFOqFqpeJi5XN1yoZGTB1ei0mgD3xBaKbp6U\nyCOZJSIFomt7piT4GcgWVHLUmpyHDDeodNhYPrN0jf2mr+ECd9fQJYdz1qm0Xx+Q\nNbKXDiPRmPX0qVleCZSeSp1JAmU4GoCO+96qQUpjgll+6xWya3UNj61f9sh0Zzr7\n5ug2LZo5uBM/LpNR1K3TLxNCcg7uUPTn9r143d7ivJhPl3tEJn4PXjv6mlLoOgU=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_cat_rsa-ec.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIyMDEwMjI1\nOVoXDTE5MTEyNTEwMjI1OVowKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEFBQADggEBAJYuWdKPdblMVWCnxpMnchuL\ndqWzK2BA0RelCaGjpxuwX3NmLDm+5hKja/DJxaRqTOf4RSC3kcX8CdIldsLO96dz\n//wAQdFPDhy6AFT5vKTO8ItPHDb7qFOqFqpeJi5XN1yoZGTB1ei0mgD3xBaKbp6U\nyCOZJSIFomt7piT4GcgWVHLUmpyHDDeodNhYPrN0jf2mr+ECd9fQJYdz1qm0Xx+Q\nNbKXDiPRmPX0qVleCZSeSp1JAmU4GoCO+96qQUpjgll+6xWya3UNj61f9sh0Zzr7\n5ug2LZo5uBM/LpNR1K3TLxNCcg7uUPTn9r143d7ivJhPl3tEJn4PXjv6mlLoOgU=\n-----END X509 CRL-----\n-----BEGIN X509 CRL-----\nMIIBcTCB9wIBATAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTEzMDkyNDE2\nMzEwOFoXDTIzMDkyMjE2MzEwOFowFDASAgEKFw0xMzA5MjQxNjI4MzhaoHIwcDBu\nBgNVHSMEZzBlgBSdbSAkSQE/K8t4tRm8fiTJ2/s2fKFCpEAwPjELMAkGA1UEBhMC\nTkwxETAPBgNVBAoTCFBvbGFyU1NMMRwwGgYDVQQDExNQb2xhcnNzbCBUZXN0IEVD\nIENBggkAwUPifmJDzOgwCgYIKoZIzj0EAwIDaQAwZgIxAKuQ684s7gyhtxKJr6Ln\nS2BQ02f1jjPHrZVdXaZvm3C5tGi2cKkoK1aMiyC3LsRCuAIxAIMhj0TmcuIZr5fX\ng5RByD7zUnZBpoEAdgxFy4JPJ2IViWOPekSGh8b/JY1VNS6Zbw==\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_cat_rsabadpem-ec.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIyMDEwMjI1\nOVoXDTE5MTEyNTEwMjI1OVowKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEFBQADggEBAJYuWdKPdblMVWCnxpMnchuL\ndqWzK2BA0RelCaGjpxuwX3NmLDm+5hKja/DJxaRqTOf4RSC3kcX8CdIldsLO96dz\n//wAQdFPDhy6AFT5vKTO8ItPHDb7qFOqFqpeJi5XN1yoZGTB1ei0mgD3xBaKbp6U\nyCOZJSIFomt7piT4GcgWVHLUmpyHDDeodNhYPrN0jf2mr+ECd9fQJYdz1qm0Xx+Q\nNbKXDiPRmPX0qVleCZSeSp1JAmU4GoCO+96qQUpjgll+6xWya3UNj61f9sh0Zzr7\n5ug2LZo5uBM/LpNR1K3TLxNCcg7uUPTn9r143d7ivJhPl3tEJn4PXjv6mlLoOgU\n-----END X509 CRL-----\n-----BEGIN X509 CRL-----\nMIIBcTCB9wIBATAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTEzMDkyNDE2\nMzEwOFoXDTIzMDkyMjE2MzEwOFowFDASAgEKFw0xMzA5MjQxNjI4MzhaoHIwcDBu\nBgNVHSMEZzBlgBSdbSAkSQE/K8t4tRm8fiTJ2/s2fKFCpEAwPjELMAkGA1UEBhMC\nTkwxETAPBgNVBAoTCFBvbGFyU1NMMRwwGgYDVQQDExNQb2xhcnNzbCBUZXN0IEVD\nIENBggkAwUPifmJDzOgwCgYIKoZIzj0EAwIDaQAwZgIxAKuQ684s7gyhtxKJr6Ln\nS2BQ02f1jjPHrZVdXaZvm3C5tGi2cKkoK1aMiyC3LsRCuAIxAIMhj0TmcuIZr5fX\ng5RByD7zUnZBpoEAdgxFy4JPJ2IViWOPekSGh8b/JY1VNS6Zbw==\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_expired.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIyMDEwMjQx\nOVoXDTExMDIyMDExMjQxOVowKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEFBQADggEBAKgP1XmCIPbfY1/UO+SVFQir\njArZ94QnQdoan4tJ29d8DmTxJ+z9/KyWNoGeOwc9P/2GQQaZahQOBr0f6lYd67Ct\nwFVh/Q2zF8FgRcrQV7u/vJM33Q2yEsQkMGlM7rE5lC972vUKWu/NKq8bN9W/tWxZ\nSFbvTXpv024aI0IRudpOCALnIy8SFhVb2/52IN2uR6qrFizDexMEdSckgpHuJzGS\nIiANhIMn5LdQYJFjPgBzQU12tDdgzcpxtGhT10y4uQre+UbSjw+iVyml3issw59k\nOSmkWFb06LamRC215JAMok3YQO5RnxCR8EjqPcJr+7+O9a1O1++yiaitg4bUjEA=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_md2.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQIFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTA5MDcxOTE5NTYz\nN1oXDTA5MDkxNzE5NTYzN1owKDASAgEBFw0wOTAyMDkyMTEyMzZaMBICAQMXDTA5\nMDIwOTIxMTIzNlowDQYJKoZIhvcNAQECBQADggEBAF8F5y82zgtxcwQ4aFvrkanT\nygyd5+RW/Y//vpck44V+CYx1d1r+QkauaXel9qUKBPsg2dUwQ+jwV/m+Sp2MHaX5\nNfW7XUb7Ji4yhwgh9/9vFPqqnKBf9esLJuJoQ4mLhcGB5J1yCcavLrynvB4PJEnG\ngraTbbyizelXBmk3ApvNYxczJZxt7EzpVbrFaev7myGmOffdDkIMc2WDpDkyLTlU\nkITjB7fMJhD/dgNskKZ4fgkKKKPCMJrJPO67Wzwqx/6vsrZcACB9X+143WZr4GVO\nFw2SaMnqfVLlUEndoOpbLCU4ugcc82kQQF3TsovXJYW7XqoWl2u/ENCwShl9rl4=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_md4.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQMFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIxMjE0NDQw\nN1oXDTExMDQxMzE0NDQwN1owKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEDBQADggEBAIJtYXy3uwIpmSGfi9muS8xv\n36FT6g3s1V/xicdPa54juJgBI6sxHKzQtbSNIbqadEWwUtvQ8k1EMRo9UGObhRV8\ni+UWm5qi0GFV7nMi4E2p2Ji/sFKtgdxkzhCfn+p3MoGgx/nC7YtwpnNdF+kuCV1M\nJTPqfm+taZkYADOafP/hRaPx3TI+HNE3ux4Cb7hNpWdfWzt48ZPMuhCMzItLd/UK\nxxjJam9XAGUTKi7+eWtma9XzmYOIElQv2KFPVMcx5nvg039rrWK6tObGL67kCfTH\nv+nIx7rAOW6UNU8aj1kfJHYjEKMBH1I9wjMSHUpkxBLQOKlPNRksiEVsIhmEVss=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_md5.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIxMjE0NDQw\nN1oXDTExMDQxMzE0NDQwN1owKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEEBQADggEBAKKCJZ1MwL+gKAw3RV4qEmb9\ngMDdSLJ1Vdkn9FgDx2ijNnYDtvaW+I3sOXrq7O6gVN1KEamJJbufVJA5+OE2oVbC\nhusEdgQm8D5TbrGcjPIPWxgYyuuRsl7XovZhXnqTIUrC+J8oH9XzKaMc+HZb5UhR\nh8bzcyp+9jbBje7lWwKTzkuvd/I7VbS02TUkWFJTrYB0Laj8WMcgcZiyX0iZuj8j\n4hOupu0lPoSzZ4h7t0Vmay6wO+8n8LJohyiwYS7LddpOjIdP0MWifN7u/ArqNNlh\n2kg8eAc1pYOU/pJFTAAbOmC/kQpa9skd+PPIPPh9T53o3yeDQA0vFqN92JryCCU=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_sha1.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIxMjE0NDQw\nN1oXDTExMDQxMzE0NDQwN1owKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEFBQADggEBAG64jqn7VLdvnKROsbCPR8w9\nxnox9vjuM2lGWema9sTuptw9EhArVSbibXZ1IPPyrEy1QOq3NukBqUW3KzOzYV5M\nBxZSa28FTQxtVChWkDUIMCK8BSxy07yieFf/3A8mbfcW3ZzN4akLxOweuFp6l2H7\n9oa2jeUi1BlHCZS6JYI2pHZl8qiMRiqqMleSM2k1w7TraKLNBFM8UK72brXeZjPi\nnNOzdYsQDzWo1HW7dsLWLfZKoJeyqvofVDQpC5dO56kty/do89z1OnEXfzMNeVVT\nJCeAOzuu6kdrf+9keRoWhcIoBos/XtTV57u0pgr81bLgjj5PYivevKL/kKbyvKI=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_sha224.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQ4FADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIxMjE0NDQw\nN1oXDTExMDQxMzE0NDQwN1owKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEOBQADggEBAL2sIly2OwgBu9UfEImduTG/\nRtGEO8RkXbCRJPLZaVGQh9b8rCRVHL9tIWm372FVkKyYEm3mIrl2ry16RznRt5yx\nDd8/DKUGUlIe1KwzjDc9O7bv1FDSXHd1USmGTheKDHNtuJXYENMHdoyR2k2BVGOZ\nie4zUcSpqyMjBlUjgNmXN6gQIcrRImumVUjMk74+rWTa0hQ0piF2qlRuE1dDqcZP\nLkE/92rbnFeRAO91XUeEj13dif2UjlArFWd62AFp0wtIn2sb7wahhUj9/rEs6Wgx\nkdiNsRMto6/ixLrPu3vxs80ZPWHey587T1ZZ9bS/wDkp9W+W0rGyRoPVmqiKtvM=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_sha256.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQsFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIxMjE0NDQw\nN1oXDTExMDQxMzE0NDQwN1owKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQELBQADggEBAG4mBBgwfNynCYYL2CEnqore\nmgKpC32tB6WiUBu9figcvdN3nSX/1wrB8rpiE8R04C8oSFglwhotJCnlWsy42tjb\n0pk0Wuizln0PFMc/OypqRNNhwx31SHH42W4KzONiqvq3n/WkH3M1YniR1ZnMlyvi\nlJioQn6ZAoc6O6mMP1J9duKYYhiMAOV992PD1/iqXw+jYN31RwdIS8/mGzIs4ake\nEdviwhM3E4/sVbNOWCOnZFYV4m+yNAEe29HL1VKw6UXixBczct+brqXNVD3U6T0F\n5ovR6BTefZO17eT52Duke5RZGDUyQOGywxOYKI5W+FcOYdp+U5Idk399tAz2Mdw=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_sha384.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQwFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIxMjE0NDQw\nN1oXDTExMDQxMzE0NDQwN1owKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEMBQADggEBAC0GpmRvsrvshp1q/SXk80HA\nm28ZvEuys9zY5/AnrtYHQfsX9QRJk5li7PlnzHtVGp8I5Qi4mJVPaJ+JmhqAc/oo\nNPmxDx8m9XF9v0XHzqQZIWlPXH8QM9WLzTazbQFXhuwnZ6LPhpo+m8cbN91mUFil\n9g+SGkma+VYV+yPRNmKyldcRVvPZUIkhTCMWkZoYrbDXUmkVQpsgz2c5ksIeMI/7\n4Qj9J38I9AOt0DlQ3etFhNc0OMnR7zY8tn9B4dejoNklEZfiyDxsDZVPusZrxnWM\nWxuehOGHZf3YESjLMtR7BW26QRHIF/nhGDHsbLiunxXI6eJlbYFoZMfwc6TMqnc=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crl_sha512.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQ0FADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIxMjE0NDQw\nN1oXDTExMDQxMzE0NDQwN1owKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQENBQADggEBAH6GU24hd6d/5PmDusT+h2Kl\ne7scmhkZDPU+VJSnzHdEREYTPaoFqyVBuJOE95lZELEqdOauhO3lG2WEQVGcgEcv\n4jS2EzR3BYex1c1upqGtdIvIoA9TOLukdy6KeauomiWho2Kd7bSaXHy20jwdkLko\n/t3lVhTtBvKbh8XHVYwCaw1aCj3LydwNcS+zPnRgsMVHszFxmMNn5HCRW8lbYwcf\nUA98OmxIZs2hpBKRpvlfA5y6sXEx2+tSMg+MJrziGBgG6OR/m+KTaK5Yle9nrC+7\nhzKIe83hpktvfB1CY5Ak4Uke9/1FRqAjs5KCRxYSGQ7ZdS7DgAeGwT3slLbl/tY=\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/crt_cat_rsaexp-ec.pem",
    "content": "-----BEGIN X509 CRL-----\nMIIBqzCBlDANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EXDTExMDIyMDEwMjQx\nOVoXDTExMDIyMDExMjQxOVowKDASAgEBFw0xMTAyMTIxNDQ0MDdaMBICAQMXDTEx\nMDIxMjE0NDQwN1owDQYJKoZIhvcNAQEFBQADggEBAKgP1XmCIPbfY1/UO+SVFQir\njArZ94QnQdoan4tJ29d8DmTxJ+z9/KyWNoGeOwc9P/2GQQaZahQOBr0f6lYd67Ct\nwFVh/Q2zF8FgRcrQV7u/vJM33Q2yEsQkMGlM7rE5lC972vUKWu/NKq8bN9W/tWxZ\nSFbvTXpv024aI0IRudpOCALnIy8SFhVb2/52IN2uR6qrFizDexMEdSckgpHuJzGS\nIiANhIMn5LdQYJFjPgBzQU12tDdgzcpxtGhT10y4uQre+UbSjw+iVyml3issw59k\nOSmkWFb06LamRC215JAMok3YQO5RnxCR8EjqPcJr+7+O9a1O1++yiaitg4bUjEA=\n-----END X509 CRL-----\n-----BEGIN X509 CRL-----\nMIIBcTCB9wIBATAKBggqhkjOPQQDAjA+MQswCQYDVQQGEwJOTDERMA8GA1UEChMI\nUG9sYXJTU0wxHDAaBgNVBAMTE1BvbGFyc3NsIFRlc3QgRUMgQ0EXDTEzMDkyNDE2\nMzEwOFoXDTIzMDkyMjE2MzEwOFowFDASAgEKFw0xMzA5MjQxNjI4MzhaoHIwcDBu\nBgNVHSMEZzBlgBSdbSAkSQE/K8t4tRm8fiTJ2/s2fKFCpEAwPjELMAkGA1UEBhMC\nTkwxETAPBgNVBAoTCFBvbGFyU1NMMRwwGgYDVQQDExNQb2xhcnNzbCBUZXN0IEVD\nIENBggkAwUPifmJDzOgwCgYIKoZIzj0EAwIDaQAwZgIxAKuQ684s7gyhtxKJr6Ln\nS2BQ02f1jjPHrZVdXaZvm3C5tGi2cKkoK1aMiyC3LsRCuAIxAIMhj0TmcuIZr5fX\ng5RByD7zUnZBpoEAdgxFy4JPJ2IViWOPekSGh8b/JY1VNS6Zbw==\n-----END X509 CRL-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dh.1000.pem",
    "content": "\nRecommended key length: 160 bits\n\ngenerator:\n\t23:84:3c:0d:55:8c:b9:7d:a9:d5:9a:80:82:fb:50:\n\t89:29:71:8e:8e:a1:29:2e:df:db:01:34:41:e7:66:\n\tfa:60:dc:bc:34:83:45:70:e0:61:e9:a6:25:23:c2:\n\t77:33:a9:8a:90:94:21:ff:84:d2:7b:36:39:9b:e5:\n\tf0:88:2b:35:98:64:28:58:27:be:fa:bf:e3:60:cc:\n\tc4:61:60:59:78:a7:e1:a3:b3:a7:3e:7e:5b:a8:d7:\n\tb7:ba:25:0e:b1:9e:79:03:b5:83:ba:43:34:b6:c1:\n\tce:45:66:72:07:64:8a:af:14:d8:ae:18:19:ba:25:\n\ta6:d9:36:f8:8c:\n\nprime:\n\t9e:a4:a8:c4:29:fe:76:18:02:4f:76:c9:29:0e:f2:\n\tba:0d:92:08:9d:d9:b3:28:41:5d:88:4e:fe:3c:ae:\n\tc1:d4:3e:7e:fb:d8:2c:bf:7b:63:70:99:9e:c4:ac:\n\td0:1e:7c:4e:22:07:d2:b5:f9:9a:9e:52:e2:97:9d:\n\tc3:cb:0d:66:33:75:95:a7:96:6e:69:ec:16:bd:06:\n\t4a:1a:dc:b2:d4:29:23:ab:2e:8f:7f:6a:84:1d:82:\n\t23:6e:42:8c:1e:70:3d:21:bb:b9:b9:8f:f9:fd:9c:\n\t53:08:e4:e8:5a:04:ca:5f:8f:73:55:ac:e1:41:20:\n\tc7:43:fa:8f:99:\n\n\n-----BEGIN DH PARAMETERS-----\nMIIBAwJ+AJ6kqMQp/nYYAk92ySkO8roNkgid2bMoQV2ITv48rsHUPn772Cy/e2Nw\nmZ7ErNAefE4iB9K1+ZqeUuKXncPLDWYzdZWnlm5p7Ba9Bkoa3LLUKSOrLo9/aoQd\ngiNuQowecD0hu7m5j/n9nFMI5OhaBMpfj3NVrOFBIMdD+o+ZAn0jhDwNVYy5fanV\nmoCC+1CJKXGOjqEpLt/bATRB52b6YNy8NINFcOBh6aYlI8J3M6mKkJQh/4TSezY5\nm+XwiCs1mGQoWCe++r/jYMzEYWBZeKfho7OnPn5bqNe3uiUOsZ55A7WDukM0tsHO\nRWZyB2SKrxTYrhgZuiWm2Tb4jAICAKA=\n-----END DH PARAMETERS-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dh.optlen.pem",
    "content": "\nRecommended key length: 256 bits\n\ngenerator:\n\t80:0a:bf:e7:dc:66:7a:a1:7b:cd:7c:04:61:4b:c2:\n\t21:a6:54:82:cc:c0:4b:60:46:02:b0:e1:31:90:8a:\n\t93:8e:a1:1b:48:dc:51:5d:ab:7a:bc:bb:1e:0c:7f:\n\td6:65:11:ed:c0:d8:65:51:b7:63:24:96:e0:3d:f9:\n\t43:57:e1:c4:ea:07:a7:ce:1e:38:1a:2f:ca:fd:ff:\n\t5f:5b:f0:0d:f8:28:80:60:20:e8:75:c0:09:26:e4:\n\td0:11:f8:84:77:a1:b0:19:27:d7:38:13:ca:d4:84:\n\t7c:63:96:b9:24:46:21:be:2b:00:b6:3c:65:92:53:\n\t31:84:13:44:3c:d2:44:21:5c:d7:fd:4c:be:79:6e:\n\t82:c6:cf:70:f8:9c:c0:c5:28:fb:8e:34:48:09:b3:\n\t18:76:e7:ef:73:9d:51:60:d0:95:c9:68:41:88:b0:\n\tc8:75:5c:7a:46:8d:47:f5:6d:6d:b9:ea:01:29:24:\n\tec:b0:55:6f:b7:13:12:a8:d7:c9:3b:b2:89:8e:a0:\n\t8e:e5:4e:eb:59:45:48:28:5f:06:a9:73:cb:be:2a:\n\t0c:b0:2e:90:f3:23:fe:04:55:21:f3:4c:68:35:4a:\n\t6d:3e:95:db:ff:f1:eb:64:69:2e:dc:0a:44:f3:d3:\n\te4:08:d0:e4:79:a5:41:e7:79:a6:05:42:59:e2:d8:\n\t54:\n\nprime:\n\tb3:12:6a:ea:f4:71:53:c7:d6:7f:40:30:30:b2:92:\n\tb5:bd:5a:6c:9e:ae:1c:13:7a:f3:40:87:fc:e2:a3:\n\t6a:57:8d:70:c5:c5:60:ad:2b:db:92:4c:4a:4d:be:\n\te2:0a:16:71:be:71:03:ce:87:de:fa:76:90:89:36:\n\t80:3d:be:ca:60:c3:3e:12:89:c1:a0:3a:c2:c6:c4:\n\te4:94:05:e5:90:2f:a0:59:6a:1c:ba:a8:95:cc:40:\n\t2d:52:13:ed:4a:5f:1f:5b:a8:b5:e1:ed:3d:a9:51:\n\ta4:c4:75:af:eb:0c:a6:60:b7:36:8c:38:c8:e8:09:\n\tf3:82:d9:6a:e1:9e:60:dc:98:4e:61:cb:42:b5:df:\n\td7:23:32:2a:cf:32:7f:9e:41:3c:da:64:00:c1:5c:\n\t5b:2e:a1:fa:34:40:5d:83:98:2f:ba:40:e6:d8:52:\n\tda:3d:91:01:9b:f2:35:11:31:42:54:dc:21:1a:90:\n\t83:3e:5b:17:98:ee:52:a7:81:98:c5:55:64:47:29:\n\tad:92:f0:60:36:7c:74:de:d3:77:04:ad:fc:27:3a:\n\t4a:33:fe:c8:21:bd:2e:bd:3b:c0:51:73:0e:97:a4:\n\tdd:14:d2:b7:66:06:25:92:f5:ee:c0:9d:16:bb:50:\n\tef:eb:f2:cc:00:dd:3e:0e:34:18:e6:0e:c8:48:70:\n\tf7:\n\n\n-----BEGIN DH PARAMETERS-----\nMIICDgKCAQEAsxJq6vRxU8fWf0AwMLKStb1abJ6uHBN680CH/OKjaleNcMXFYK0r\n25JMSk2+4goWcb5xA86H3vp2kIk2gD2+ymDDPhKJwaA6wsbE5JQF5ZAvoFlqHLqo\nlcxALVIT7UpfH1uoteHtPalRpMR1r+sMpmC3Now4yOgJ84LZauGeYNyYTmHLQrXf\n1yMyKs8yf55BPNpkAMFcWy6h+jRAXYOYL7pA5thS2j2RAZvyNRExQlTcIRqQgz5b\nF5juUqeBmMVVZEcprZLwYDZ8dN7TdwSt/Cc6SjP+yCG9Lr07wFFzDpek3RTSt2YG\nJZL17sCdFrtQ7+vyzADdPg40GOYOyEhw9wKCAQEAgAq/59xmeqF7zXwEYUvCIaZU\ngszAS2BGArDhMZCKk46hG0jcUV2rery7Hgx/1mUR7cDYZVG3YySW4D35Q1fhxOoH\np84eOBovyv3/X1vwDfgogGAg6HXACSbk0BH4hHehsBkn1zgTytSEfGOWuSRGIb4r\nALY8ZZJTMYQTRDzSRCFc1/1MvnlugsbPcPicwMUo+440SAmzGHbn73OdUWDQlclo\nQYiwyHVcekaNR/VtbbnqASkk7LBVb7cTEqjXyTuyiY6gjuVO61lFSChfBqlzy74q\nDLAukPMj/gRVIfNMaDVKbT6V2//x62RpLtwKRPPT5AjQ5HmlQed5pgVCWeLYVAIC\nAQA=\n-----END DH PARAMETERS-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dhparams.pem",
    "content": "-----BEGIN DH PARAMETERS-----\nMIGHAoGBAJ419DBEOgmQTzo5qXl5fQcN9TN455wkOL7052HzxxRVMyhYmwQcgJvh\n1sa18fyfR9OiVEMYglOpkqVoGLN7qd5aQNNi5W7/C+VBdHTBJcGZJyyP5B3qcz32\n9mLJKudlVudV0Qxk5qUJaPZ/xupz0NyoVpviuiBOI1gNi8ovSXWzAgEC\n-----END DH PARAMETERS-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/00.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/00.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIARPaEIfROHkE9Y0ZgHh7Mc3ZU6LR9lCOIw1ksYTHp5EoAoGCCqGSM49\nAwEHoUQDQgAEVbjX+oDAA+nL5PF1zs8qbNmyr0I+K6MpTi+kXV6RecbHYc/jbRCh\nvAFVVaGTNGYvB1ugfaPrl1wIqNDua/93Eg==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/01.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/01.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEINSnxPqUNMba8F2KWNxU88heSs7vgas5BOzjRwQsQe6IoAoGCCqGSM49\nAwEHoUQDQgAEM55/cxx8CxjvFUeFvVe7zJcQnaKI8xDol+WOibT7RTs/Ournh2Os\n6DdP5ieg56p0l4pSSFFHlunhn6ppGu58ZA==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/02.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/02.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIPW9zE8cjiZ8w17jTAebb4xAmEg6heEEnEaG4lGCd38joAoGCCqGSM49\nAwEHoUQDQgAEFh6b9YupX8LzTzj+ZGuktJ+eRL86GmCuqW01z+sjDlv+F2UjyseW\naKuBTHtHCsxiCBS9a849VdnM2Afqry4cog==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/03.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/03.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIBx2xwapGbHTy79IbpJkc/w9LJXPKNG7gGRLPOGPQFI6oAoGCCqGSM49\nAwEHoUQDQgAEEQ1wzSItaXq3rnYasGti7JV4LMZwetx7ucuZYPtVj67iGD8w/x6N\nAD73lXcxS1Y4tffmxOPrRT2C9UqbDdVn1g==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/04.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/04.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIDQvTm0wfEAKoymv8ePBv7cRxrnM4g6LREnSll5ghQsXoAoGCCqGSM49\nAwEHoUQDQgAEFFw4HFFTU/YaL22RORy+q4zm+wuecBLlik4VfwnGeK1q18e1Vx2H\nQ/0d2gwOyUr2KZtrE6JOIrG5Q84WTPxgzQ==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/05.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/05.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIP3MTs0m9ssAAXQ94O6GYC3pckfpMUxQiPTG8hQYgA0WoAoGCCqGSM49\nAwEHoUQDQgAEBHU9DhX+RlHK4F9l5ZQsicz/eDWeOuBrIAeqbDS7A3i/o+wFPqCc\nu1S71v5R4dzg4JdPGfW4aixQZjY5x25vEA==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/06.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/06.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIESUhQgXWd8cVQnitNEpOD2JNMqH9ug/wYaY1xW3SaSGoAoGCCqGSM49\nAwEHoUQDQgAEgPalqAFB655/t5Mcja4zyZPNlgy4plttUTedbsaaG2nb/GIBhA0X\nT/jpPrkakElLAOmV3xd4hq9ho30N8DAx/A==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/07.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/07.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIEi1oKInPLbiINj8OxdActVTgI+YQVSefdQfCu1ihbLRoAoGCCqGSM49\nAwEHoUQDQgAEjTo+HeDBAO6f95ooo6huE6BOKKSjwJvtwUyBqyU2E9ePvk0olCAp\ndAEl4/sXlHCzCGl0zdONrC7B8aUoc0Gi9A==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/08.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/08.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIC8M2G7XcqeagYgt8SZJbuTh4tYchGvX3yDZJKTuBgFUoAoGCCqGSM49\nAwEHoUQDQgAEaUHkP2BkI55e0s6OlkrSdbu8bp0y+YwZFx/GgFUptKol+AA/+2D8\nWuRJxs2XS059ub0FZ30ABqTMfD9ZWIhmAg==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/09.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/09.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIKkdxegP5yN840sBDxIPpiMftZss14uLaH7zoxOqrePDoAoGCCqGSM49\nAwEHoUQDQgAEe2QdevrehLH2oRsilBiVuZns5M43WmL3OJWyWijUcBUX3Nxf35jT\nkrFBUoPxdDfr1BPnaCojwvMEcC875uLPuQ==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/10.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/10.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIPuPPMxo5e2doI7YfDp60qmEn4YwYs2sb5QlOpFQ3BIJoAoGCCqGSM49\nAwEHoUQDQgAEeo5RimyXeYYg8Te/PYJDnMKchyPcEcAqwAwDsDpDHjwT0ZcBnZu5\nsO2fxAJrtus0Zv4XMq7ODKpNi2mw4zyPVw==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/11.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/11.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIHaMieH2/wn6lnsFUGzww43ymhN16Z0nhG5TyvNeY8U2oAoGCCqGSM49\nAwEHoUQDQgAE2cEfliujQRf+64hXTet3PIY2HXWUUeJa81TT8IgUMZ58cKT8qw/Q\nOmjz5i3OkqhjiVuGRlQnKCAc3vUSVXogfQ==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/12.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTEwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATDE9LPlLPc\ngZ3b0BchR/AkhNEP9HAavwYadJIyzoPo5edCVnboQH786jsZwZNZoC0gHDAhCmGc\nIfRenISAoVuPo4GJMIGGMB0GA1UdDgQWBBTZTtbi+j0Sm/Zs/+gTkWdASpQzfjBX\nBgNVHSMEUDBOgBSOSt6ePyMRT6PGMaIi7FqNX9MKtKEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYYF5AnRV7eh2hLD5Dz//pceMTKz9Ls46\nE6DxvbfDHikCIFttlGrOCZVyS4ocsjuKIELVUX5qfygI0sn4kU3qCTs2\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/12.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIAzhAcc1Yb2u4bsQDaYeRaRW8kJ/HzFTTfINV1k+TxZ/oAoGCCqGSM49\nAwEHoUQDQgAEwxPSz5Sz3IGd29AXIUfwJITRD/RwGr8GGnSSMs6D6OXnQlZ26EB+\n/Oo7GcGTWaAtIBwwIQphnCH0XpyEgKFbjw==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/13.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTIwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATrkzCJLznh\nlhnsv1RXB9kfeaD+cIruPQ0cItBDGpdvD8xbBVvQci4+RG2RVUCSWRhkFYjSsUSM\n0QHMQnBFlhw2o4GJMIGGMB0GA1UdDgQWBBTmVnUSF2MYwws/nCMv7b1wJVkDmjBX\nBgNVHSMEUDBOgBTZTtbi+j0Sm/Zs/+gTkWdASpQzfqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTExggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgWsm+rHJgwUEyNm8EKbEds5yurpp5/3y5\nPsvXJVDqxogCIQDUP0Jcl3A907CE2tPVXSgD6LQ6CPu19mixemPw60yijA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/13.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIKb966FXMh8cFQt3sVpmcrh2/3yaGiLMwz+/XGKGMJ+2oAoGCCqGSM49\nAwEHoUQDQgAE65MwiS854ZYZ7L9UVwfZH3mg/nCK7j0NHCLQQxqXbw/MWwVb0HIu\nPkRtkVVAklkYZBWI0rFEjNEBzEJwRZYcNg==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/14.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTMwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATRMZN0RHzP\ndonNmZuq9XPhzvQ52TaokxT39qpQtlFyvUuEGKrLoNvdcpARaA0rGput6RLAQOVU\niNVlJ3Ipj789o4GJMIGGMB0GA1UdDgQWBBRNsJB++ccSBmbCCKBxi4CjXROBkzBX\nBgNVHSMEUDBOgBTmVnUSF2MYwws/nCMv7b1wJVkDmqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgVfuLpjp08AaxKWf6cuZUUCRd7CojSS1I\n71hzeUyFS+sCIQDNJI6P/pBbiHgTaGlBAgfcEfmxmbY0n4xZndtxIkmyVA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/14.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIKEycJNLyYJ5JgECpCuZiFeXZIMC+XsMEKoMhRTx6xD+oAoGCCqGSM49\nAwEHoUQDQgAE0TGTdER8z3aJzZmbqvVz4c70Odk2qJMU9/aqULZRcr1LhBiqy6Db\n3XKQEWgNKxqbrekSwEDlVIjVZSdyKY+/PQ==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/15.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTQwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQlKUiMoSss\n/hsTasedqdB2BCOGJhTt0hgUGeUnWNZ1svO4yn0GkFHZ08++fl2MKqjpj+VXq0JS\nFFyGUOgmgi3Ho4GJMIGGMB0GA1UdDgQWBBR1mXlrdW5rx1VnqMMnUBXo0WWGWjBX\nBgNVHSMEUDBOgBRNsJB++ccSBmbCCKBxi4CjXROBk6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAKYOIo+fdCQRqpH4LN8qUK1aKzKmWGxS\nfGzEEkg/29bMAiAl95cmucoCDMq2Ab8Coc0dEqyJ6+rAPMLBCbGawyiW6A==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/15.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIL1c0zvh4Fx8aylrlHsOsK5Pcam7BWVHM2lDxGO26QIUoAoGCCqGSM49\nAwEHoUQDQgAEJSlIjKErLP4bE2rHnanQdgQjhiYU7dIYFBnlJ1jWdbLzuMp9BpBR\n2dPPvn5djCqo6Y/lV6tCUhRchlDoJoItxw==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/16.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTUwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ7Vsp7JmDN\nkgPh/+zmIPkd7o0xot/WPMFn3uAsGtsU385MF0fmhfFLhRbbH9h4JjYHj8y0spU3\nbuUXhftvAZVbo4GJMIGGMB0GA1UdDgQWBBRTw3K0Psy3u/6+3KKSoaQqJnPvPjBX\nBgNVHSMEUDBOgBR1mXlrdW5rx1VnqMMnUBXo0WWGWqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAMJnGjE9v3SjuGfi0jNByrwyNfhlTHMh\nFhPQidNrDpXwAiEAqYtNiV8t9RrAa9GC6FWDuJpvIiU6FsE+lFq6uIq/J2E=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/16.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIM0YCnGkEG/TjBxrytP9Ztslm1yoQaWptBxegRzzBRDVoAoGCCqGSM49\nAwEHoUQDQgAEO1bKeyZgzZID4f/s5iD5He6NMaLf1jzBZ97gLBrbFN/OTBdH5oXx\nS4UW2x/YeCY2B4/MtLKVN27lF4X7bwGVWw==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/17.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTYwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARrISq2zO9m\nD29YCLHB56FdU/RINtRhfeLtM+u5o3HaAnopy0S98RzuEGELjpzr8ZI6kkMMZsj8\nnFZQF8HfuE0go4GJMIGGMB0GA1UdDgQWBBSnjWvpWxZcFnfQ2KGtCg/u6fT/DzBX\nBgNVHSMEUDBOgBRTw3K0Psy3u/6+3KKSoaQqJnPvPqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgDgXjoc6FfMF5W0NziV6vx2BOPNWav01Z\nynEP4h9ULnUCIQC1rU4sEId3UdjzTKhpSGTKtaOuPG+b0YdEMPimI4jmVw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/17.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIAiUS1dM3qrcOun8PjKe+rw40L2HG/Y8Dfxl0AfzyIVeoAoGCCqGSM49\nAwEHoUQDQgAEayEqtszvZg9vWAixweehXVP0SDbUYX3i7TPruaNx2gJ6KctEvfEc\n7hBhC46c6/GSOpJDDGbI/JxWUBfB37hNIA==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/18.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTcwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASsc/JkNcYf\nbMgpOfrL5kKOGxOJaGS6SQIeNO33UeBpToe1bU2acN652xjvcGo0fJEtxg2fcPHR\nhTnGMBD1u1N2o4GJMIGGMB0GA1UdDgQWBBSDbIpYntlhJ0GgIsyd75XRhlC18jBX\nBgNVHSMEUDBOgBSnjWvpWxZcFnfQ2KGtCg/u6fT/D6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAJo2NXfJU1sK6SVTu4OV21FKITlXntMi\noenYMsBjzO8oAiEAidSELcLjjAHi3mfBARvCgKlRhmbNEMCHQT7Ha7ZQoRw=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/18.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIJETLWqIZtnejCGzESDgMnknxqEx5evMGZfzBVPKMwKKoAoGCCqGSM49\nAwEHoUQDQgAErHPyZDXGH2zIKTn6y+ZCjhsTiWhkukkCHjTt91HgaU6HtW1NmnDe\nudsY73BqNHyRLcYNn3Dx0YU5xjAQ9btTdg==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/19.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQJyRCHND78\nKxZHoHHdOTjPuD6HjHPnEKX8apblUpETDJuLW7YR3V8Q0dTac+JHiR6e2l4DlDbf\n5bTiyFoAzw9yo4GJMIGGMB0GA1UdDgQWBBRQMc94kTqW+zQO3lo2WMI/81k3czBX\nBgNVHSMEUDBOgBSDbIpYntlhJ0GgIsyd75XRhlC18qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgIzGOZqJRmvygzvLm8zxZFyoNpcT7e26H\nnZd5xFIzEakCIHGYcUXzt+owSVlLmrlW8gQcB81ErQbxuBTAsvpaaKSS\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/19.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIDJyHSKbXEZVfkNftQF4eHeJVuXhGdaboa7w4RejL5uYoAoGCCqGSM49\nAwEHoUQDQgAECckQhzQ+/CsWR6Bx3Tk4z7g+h4xz5xCl/GqW5VKREwybi1u2Ed1f\nENHU2nPiR4kentpeA5Q23+W04shaAM8Pcg==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/20.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMjAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATGebrN8JxE\nheOdCxD+mhnQ4zMUxF1WUkmAAHIUw089BYiH9SAwYS/M5tnl+R8fbjvoGqSpR6Tk\nV9EU3CQyIoxwo4GJMIGGMB0GA1UdDgQWBBTZs6oChL1c2CSZXY2YFQkkqg+lzDBX\nBgNVHSMEUDBOgBRQMc94kTqW+zQO3lo2WMI/81k3c6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgRVGZReXKvdMHhwLbPvbrTVLeAGDqmqMH\n/WqD4u23QBgCID/QtFaiawjviNFEdtU7JK6v4ZY0PQ0a0+HLZIHLi9ah\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/20.key",
    "content": "-----BEGIN EC PARAMETERS-----\nBggqhkjOPQMBBw==\n-----END EC PARAMETERS-----\n-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIJHLciDhJcnlE5MhTrOfFlnRbpJQLOf4h72E6VDXxMM0oAoGCCqGSM49\nAwEHoUQDQgAExnm6zfCcRIXjnQsQ/poZ0OMzFMRdVlJJgAByFMNPPQWIh/UgMGEv\nzObZ5fkfH2476BqkqUek5FfRFNwkMiKMcA==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/Readme.txt",
    "content": "These certificates form a very long chain, used to test the\nMBEDTLS_X509_MAX_INT_CA limit.\n\nNN.key is the private key of certificate NN.crt.\n\nThe root is 00.crt and N+1.crt is a child of N.crt.\n\nFile cNN.pem contains the chain NN.crt to 00.crt.\n\nThose certificates were generated by tests/data_files/dir-maxpath/long.sh.\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c00.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c01.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c02.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c03.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c04.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c05.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c06.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c07.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c08.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c09.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c10.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c11.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c12.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTEwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATDE9LPlLPc\ngZ3b0BchR/AkhNEP9HAavwYadJIyzoPo5edCVnboQH786jsZwZNZoC0gHDAhCmGc\nIfRenISAoVuPo4GJMIGGMB0GA1UdDgQWBBTZTtbi+j0Sm/Zs/+gTkWdASpQzfjBX\nBgNVHSMEUDBOgBSOSt6ePyMRT6PGMaIi7FqNX9MKtKEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYYF5AnRV7eh2hLD5Dz//pceMTKz9Ls46\nE6DxvbfDHikCIFttlGrOCZVyS4ocsjuKIELVUX5qfygI0sn4kU3qCTs2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c13.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTIwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATrkzCJLznh\nlhnsv1RXB9kfeaD+cIruPQ0cItBDGpdvD8xbBVvQci4+RG2RVUCSWRhkFYjSsUSM\n0QHMQnBFlhw2o4GJMIGGMB0GA1UdDgQWBBTmVnUSF2MYwws/nCMv7b1wJVkDmjBX\nBgNVHSMEUDBOgBTZTtbi+j0Sm/Zs/+gTkWdASpQzfqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTExggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgWsm+rHJgwUEyNm8EKbEds5yurpp5/3y5\nPsvXJVDqxogCIQDUP0Jcl3A907CE2tPVXSgD6LQ6CPu19mixemPw60yijA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTEwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATDE9LPlLPc\ngZ3b0BchR/AkhNEP9HAavwYadJIyzoPo5edCVnboQH786jsZwZNZoC0gHDAhCmGc\nIfRenISAoVuPo4GJMIGGMB0GA1UdDgQWBBTZTtbi+j0Sm/Zs/+gTkWdASpQzfjBX\nBgNVHSMEUDBOgBSOSt6ePyMRT6PGMaIi7FqNX9MKtKEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYYF5AnRV7eh2hLD5Dz//pceMTKz9Ls46\nE6DxvbfDHikCIFttlGrOCZVyS4ocsjuKIELVUX5qfygI0sn4kU3qCTs2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c14.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTMwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATRMZN0RHzP\ndonNmZuq9XPhzvQ52TaokxT39qpQtlFyvUuEGKrLoNvdcpARaA0rGput6RLAQOVU\niNVlJ3Ipj789o4GJMIGGMB0GA1UdDgQWBBRNsJB++ccSBmbCCKBxi4CjXROBkzBX\nBgNVHSMEUDBOgBTmVnUSF2MYwws/nCMv7b1wJVkDmqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgVfuLpjp08AaxKWf6cuZUUCRd7CojSS1I\n71hzeUyFS+sCIQDNJI6P/pBbiHgTaGlBAgfcEfmxmbY0n4xZndtxIkmyVA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTIwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATrkzCJLznh\nlhnsv1RXB9kfeaD+cIruPQ0cItBDGpdvD8xbBVvQci4+RG2RVUCSWRhkFYjSsUSM\n0QHMQnBFlhw2o4GJMIGGMB0GA1UdDgQWBBTmVnUSF2MYwws/nCMv7b1wJVkDmjBX\nBgNVHSMEUDBOgBTZTtbi+j0Sm/Zs/+gTkWdASpQzfqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTExggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgWsm+rHJgwUEyNm8EKbEds5yurpp5/3y5\nPsvXJVDqxogCIQDUP0Jcl3A907CE2tPVXSgD6LQ6CPu19mixemPw60yijA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTEwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATDE9LPlLPc\ngZ3b0BchR/AkhNEP9HAavwYadJIyzoPo5edCVnboQH786jsZwZNZoC0gHDAhCmGc\nIfRenISAoVuPo4GJMIGGMB0GA1UdDgQWBBTZTtbi+j0Sm/Zs/+gTkWdASpQzfjBX\nBgNVHSMEUDBOgBSOSt6ePyMRT6PGMaIi7FqNX9MKtKEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYYF5AnRV7eh2hLD5Dz//pceMTKz9Ls46\nE6DxvbfDHikCIFttlGrOCZVyS4ocsjuKIELVUX5qfygI0sn4kU3qCTs2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c15.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTQwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQlKUiMoSss\n/hsTasedqdB2BCOGJhTt0hgUGeUnWNZ1svO4yn0GkFHZ08++fl2MKqjpj+VXq0JS\nFFyGUOgmgi3Ho4GJMIGGMB0GA1UdDgQWBBR1mXlrdW5rx1VnqMMnUBXo0WWGWjBX\nBgNVHSMEUDBOgBRNsJB++ccSBmbCCKBxi4CjXROBk6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAKYOIo+fdCQRqpH4LN8qUK1aKzKmWGxS\nfGzEEkg/29bMAiAl95cmucoCDMq2Ab8Coc0dEqyJ6+rAPMLBCbGawyiW6A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTMwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATRMZN0RHzP\ndonNmZuq9XPhzvQ52TaokxT39qpQtlFyvUuEGKrLoNvdcpARaA0rGput6RLAQOVU\niNVlJ3Ipj789o4GJMIGGMB0GA1UdDgQWBBRNsJB++ccSBmbCCKBxi4CjXROBkzBX\nBgNVHSMEUDBOgBTmVnUSF2MYwws/nCMv7b1wJVkDmqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgVfuLpjp08AaxKWf6cuZUUCRd7CojSS1I\n71hzeUyFS+sCIQDNJI6P/pBbiHgTaGlBAgfcEfmxmbY0n4xZndtxIkmyVA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTIwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATrkzCJLznh\nlhnsv1RXB9kfeaD+cIruPQ0cItBDGpdvD8xbBVvQci4+RG2RVUCSWRhkFYjSsUSM\n0QHMQnBFlhw2o4GJMIGGMB0GA1UdDgQWBBTmVnUSF2MYwws/nCMv7b1wJVkDmjBX\nBgNVHSMEUDBOgBTZTtbi+j0Sm/Zs/+gTkWdASpQzfqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTExggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgWsm+rHJgwUEyNm8EKbEds5yurpp5/3y5\nPsvXJVDqxogCIQDUP0Jcl3A907CE2tPVXSgD6LQ6CPu19mixemPw60yijA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTEwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATDE9LPlLPc\ngZ3b0BchR/AkhNEP9HAavwYadJIyzoPo5edCVnboQH786jsZwZNZoC0gHDAhCmGc\nIfRenISAoVuPo4GJMIGGMB0GA1UdDgQWBBTZTtbi+j0Sm/Zs/+gTkWdASpQzfjBX\nBgNVHSMEUDBOgBSOSt6ePyMRT6PGMaIi7FqNX9MKtKEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYYF5AnRV7eh2hLD5Dz//pceMTKz9Ls46\nE6DxvbfDHikCIFttlGrOCZVyS4ocsjuKIELVUX5qfygI0sn4kU3qCTs2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c16.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTUwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ7Vsp7JmDN\nkgPh/+zmIPkd7o0xot/WPMFn3uAsGtsU385MF0fmhfFLhRbbH9h4JjYHj8y0spU3\nbuUXhftvAZVbo4GJMIGGMB0GA1UdDgQWBBRTw3K0Psy3u/6+3KKSoaQqJnPvPjBX\nBgNVHSMEUDBOgBR1mXlrdW5rx1VnqMMnUBXo0WWGWqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAMJnGjE9v3SjuGfi0jNByrwyNfhlTHMh\nFhPQidNrDpXwAiEAqYtNiV8t9RrAa9GC6FWDuJpvIiU6FsE+lFq6uIq/J2E=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTQwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQlKUiMoSss\n/hsTasedqdB2BCOGJhTt0hgUGeUnWNZ1svO4yn0GkFHZ08++fl2MKqjpj+VXq0JS\nFFyGUOgmgi3Ho4GJMIGGMB0GA1UdDgQWBBR1mXlrdW5rx1VnqMMnUBXo0WWGWjBX\nBgNVHSMEUDBOgBRNsJB++ccSBmbCCKBxi4CjXROBk6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAKYOIo+fdCQRqpH4LN8qUK1aKzKmWGxS\nfGzEEkg/29bMAiAl95cmucoCDMq2Ab8Coc0dEqyJ6+rAPMLBCbGawyiW6A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTMwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATRMZN0RHzP\ndonNmZuq9XPhzvQ52TaokxT39qpQtlFyvUuEGKrLoNvdcpARaA0rGput6RLAQOVU\niNVlJ3Ipj789o4GJMIGGMB0GA1UdDgQWBBRNsJB++ccSBmbCCKBxi4CjXROBkzBX\nBgNVHSMEUDBOgBTmVnUSF2MYwws/nCMv7b1wJVkDmqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgVfuLpjp08AaxKWf6cuZUUCRd7CojSS1I\n71hzeUyFS+sCIQDNJI6P/pBbiHgTaGlBAgfcEfmxmbY0n4xZndtxIkmyVA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTIwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATrkzCJLznh\nlhnsv1RXB9kfeaD+cIruPQ0cItBDGpdvD8xbBVvQci4+RG2RVUCSWRhkFYjSsUSM\n0QHMQnBFlhw2o4GJMIGGMB0GA1UdDgQWBBTmVnUSF2MYwws/nCMv7b1wJVkDmjBX\nBgNVHSMEUDBOgBTZTtbi+j0Sm/Zs/+gTkWdASpQzfqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTExggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgWsm+rHJgwUEyNm8EKbEds5yurpp5/3y5\nPsvXJVDqxogCIQDUP0Jcl3A907CE2tPVXSgD6LQ6CPu19mixemPw60yijA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTEwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATDE9LPlLPc\ngZ3b0BchR/AkhNEP9HAavwYadJIyzoPo5edCVnboQH786jsZwZNZoC0gHDAhCmGc\nIfRenISAoVuPo4GJMIGGMB0GA1UdDgQWBBTZTtbi+j0Sm/Zs/+gTkWdASpQzfjBX\nBgNVHSMEUDBOgBSOSt6ePyMRT6PGMaIi7FqNX9MKtKEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYYF5AnRV7eh2hLD5Dz//pceMTKz9Ls46\nE6DxvbfDHikCIFttlGrOCZVyS4ocsjuKIELVUX5qfygI0sn4kU3qCTs2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c17.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTYwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARrISq2zO9m\nD29YCLHB56FdU/RINtRhfeLtM+u5o3HaAnopy0S98RzuEGELjpzr8ZI6kkMMZsj8\nnFZQF8HfuE0go4GJMIGGMB0GA1UdDgQWBBSnjWvpWxZcFnfQ2KGtCg/u6fT/DzBX\nBgNVHSMEUDBOgBRTw3K0Psy3u/6+3KKSoaQqJnPvPqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgDgXjoc6FfMF5W0NziV6vx2BOPNWav01Z\nynEP4h9ULnUCIQC1rU4sEId3UdjzTKhpSGTKtaOuPG+b0YdEMPimI4jmVw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTUwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ7Vsp7JmDN\nkgPh/+zmIPkd7o0xot/WPMFn3uAsGtsU385MF0fmhfFLhRbbH9h4JjYHj8y0spU3\nbuUXhftvAZVbo4GJMIGGMB0GA1UdDgQWBBRTw3K0Psy3u/6+3KKSoaQqJnPvPjBX\nBgNVHSMEUDBOgBR1mXlrdW5rx1VnqMMnUBXo0WWGWqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAMJnGjE9v3SjuGfi0jNByrwyNfhlTHMh\nFhPQidNrDpXwAiEAqYtNiV8t9RrAa9GC6FWDuJpvIiU6FsE+lFq6uIq/J2E=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTQwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQlKUiMoSss\n/hsTasedqdB2BCOGJhTt0hgUGeUnWNZ1svO4yn0GkFHZ08++fl2MKqjpj+VXq0JS\nFFyGUOgmgi3Ho4GJMIGGMB0GA1UdDgQWBBR1mXlrdW5rx1VnqMMnUBXo0WWGWjBX\nBgNVHSMEUDBOgBRNsJB++ccSBmbCCKBxi4CjXROBk6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAKYOIo+fdCQRqpH4LN8qUK1aKzKmWGxS\nfGzEEkg/29bMAiAl95cmucoCDMq2Ab8Coc0dEqyJ6+rAPMLBCbGawyiW6A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTMwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATRMZN0RHzP\ndonNmZuq9XPhzvQ52TaokxT39qpQtlFyvUuEGKrLoNvdcpARaA0rGput6RLAQOVU\niNVlJ3Ipj789o4GJMIGGMB0GA1UdDgQWBBRNsJB++ccSBmbCCKBxi4CjXROBkzBX\nBgNVHSMEUDBOgBTmVnUSF2MYwws/nCMv7b1wJVkDmqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgVfuLpjp08AaxKWf6cuZUUCRd7CojSS1I\n71hzeUyFS+sCIQDNJI6P/pBbiHgTaGlBAgfcEfmxmbY0n4xZndtxIkmyVA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTIwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATrkzCJLznh\nlhnsv1RXB9kfeaD+cIruPQ0cItBDGpdvD8xbBVvQci4+RG2RVUCSWRhkFYjSsUSM\n0QHMQnBFlhw2o4GJMIGGMB0GA1UdDgQWBBTmVnUSF2MYwws/nCMv7b1wJVkDmjBX\nBgNVHSMEUDBOgBTZTtbi+j0Sm/Zs/+gTkWdASpQzfqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTExggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgWsm+rHJgwUEyNm8EKbEds5yurpp5/3y5\nPsvXJVDqxogCIQDUP0Jcl3A907CE2tPVXSgD6LQ6CPu19mixemPw60yijA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTEwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATDE9LPlLPc\ngZ3b0BchR/AkhNEP9HAavwYadJIyzoPo5edCVnboQH786jsZwZNZoC0gHDAhCmGc\nIfRenISAoVuPo4GJMIGGMB0GA1UdDgQWBBTZTtbi+j0Sm/Zs/+gTkWdASpQzfjBX\nBgNVHSMEUDBOgBSOSt6ePyMRT6PGMaIi7FqNX9MKtKEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYYF5AnRV7eh2hLD5Dz//pceMTKz9Ls46\nE6DxvbfDHikCIFttlGrOCZVyS4ocsjuKIELVUX5qfygI0sn4kU3qCTs2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c18.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTcwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASsc/JkNcYf\nbMgpOfrL5kKOGxOJaGS6SQIeNO33UeBpToe1bU2acN652xjvcGo0fJEtxg2fcPHR\nhTnGMBD1u1N2o4GJMIGGMB0GA1UdDgQWBBSDbIpYntlhJ0GgIsyd75XRhlC18jBX\nBgNVHSMEUDBOgBSnjWvpWxZcFnfQ2KGtCg/u6fT/D6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAJo2NXfJU1sK6SVTu4OV21FKITlXntMi\noenYMsBjzO8oAiEAidSELcLjjAHi3mfBARvCgKlRhmbNEMCHQT7Ha7ZQoRw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTYwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARrISq2zO9m\nD29YCLHB56FdU/RINtRhfeLtM+u5o3HaAnopy0S98RzuEGELjpzr8ZI6kkMMZsj8\nnFZQF8HfuE0go4GJMIGGMB0GA1UdDgQWBBSnjWvpWxZcFnfQ2KGtCg/u6fT/DzBX\nBgNVHSMEUDBOgBRTw3K0Psy3u/6+3KKSoaQqJnPvPqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgDgXjoc6FfMF5W0NziV6vx2BOPNWav01Z\nynEP4h9ULnUCIQC1rU4sEId3UdjzTKhpSGTKtaOuPG+b0YdEMPimI4jmVw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTUwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ7Vsp7JmDN\nkgPh/+zmIPkd7o0xot/WPMFn3uAsGtsU385MF0fmhfFLhRbbH9h4JjYHj8y0spU3\nbuUXhftvAZVbo4GJMIGGMB0GA1UdDgQWBBRTw3K0Psy3u/6+3KKSoaQqJnPvPjBX\nBgNVHSMEUDBOgBR1mXlrdW5rx1VnqMMnUBXo0WWGWqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAMJnGjE9v3SjuGfi0jNByrwyNfhlTHMh\nFhPQidNrDpXwAiEAqYtNiV8t9RrAa9GC6FWDuJpvIiU6FsE+lFq6uIq/J2E=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTQwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQlKUiMoSss\n/hsTasedqdB2BCOGJhTt0hgUGeUnWNZ1svO4yn0GkFHZ08++fl2MKqjpj+VXq0JS\nFFyGUOgmgi3Ho4GJMIGGMB0GA1UdDgQWBBR1mXlrdW5rx1VnqMMnUBXo0WWGWjBX\nBgNVHSMEUDBOgBRNsJB++ccSBmbCCKBxi4CjXROBk6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAKYOIo+fdCQRqpH4LN8qUK1aKzKmWGxS\nfGzEEkg/29bMAiAl95cmucoCDMq2Ab8Coc0dEqyJ6+rAPMLBCbGawyiW6A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTMwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATRMZN0RHzP\ndonNmZuq9XPhzvQ52TaokxT39qpQtlFyvUuEGKrLoNvdcpARaA0rGput6RLAQOVU\niNVlJ3Ipj789o4GJMIGGMB0GA1UdDgQWBBRNsJB++ccSBmbCCKBxi4CjXROBkzBX\nBgNVHSMEUDBOgBTmVnUSF2MYwws/nCMv7b1wJVkDmqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgVfuLpjp08AaxKWf6cuZUUCRd7CojSS1I\n71hzeUyFS+sCIQDNJI6P/pBbiHgTaGlBAgfcEfmxmbY0n4xZndtxIkmyVA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTIwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATrkzCJLznh\nlhnsv1RXB9kfeaD+cIruPQ0cItBDGpdvD8xbBVvQci4+RG2RVUCSWRhkFYjSsUSM\n0QHMQnBFlhw2o4GJMIGGMB0GA1UdDgQWBBTmVnUSF2MYwws/nCMv7b1wJVkDmjBX\nBgNVHSMEUDBOgBTZTtbi+j0Sm/Zs/+gTkWdASpQzfqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTExggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgWsm+rHJgwUEyNm8EKbEds5yurpp5/3y5\nPsvXJVDqxogCIQDUP0Jcl3A907CE2tPVXSgD6LQ6CPu19mixemPw60yijA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTEwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATDE9LPlLPc\ngZ3b0BchR/AkhNEP9HAavwYadJIyzoPo5edCVnboQH786jsZwZNZoC0gHDAhCmGc\nIfRenISAoVuPo4GJMIGGMB0GA1UdDgQWBBTZTtbi+j0Sm/Zs/+gTkWdASpQzfjBX\nBgNVHSMEUDBOgBSOSt6ePyMRT6PGMaIi7FqNX9MKtKEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYYF5AnRV7eh2hLD5Dz//pceMTKz9Ls46\nE6DxvbfDHikCIFttlGrOCZVyS4ocsjuKIELVUX5qfygI0sn4kU3qCTs2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c19.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQJyRCHND78\nKxZHoHHdOTjPuD6HjHPnEKX8apblUpETDJuLW7YR3V8Q0dTac+JHiR6e2l4DlDbf\n5bTiyFoAzw9yo4GJMIGGMB0GA1UdDgQWBBRQMc94kTqW+zQO3lo2WMI/81k3czBX\nBgNVHSMEUDBOgBSDbIpYntlhJ0GgIsyd75XRhlC18qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgIzGOZqJRmvygzvLm8zxZFyoNpcT7e26H\nnZd5xFIzEakCIHGYcUXzt+owSVlLmrlW8gQcB81ErQbxuBTAsvpaaKSS\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTcwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASsc/JkNcYf\nbMgpOfrL5kKOGxOJaGS6SQIeNO33UeBpToe1bU2acN652xjvcGo0fJEtxg2fcPHR\nhTnGMBD1u1N2o4GJMIGGMB0GA1UdDgQWBBSDbIpYntlhJ0GgIsyd75XRhlC18jBX\nBgNVHSMEUDBOgBSnjWvpWxZcFnfQ2KGtCg/u6fT/D6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAJo2NXfJU1sK6SVTu4OV21FKITlXntMi\noenYMsBjzO8oAiEAidSELcLjjAHi3mfBARvCgKlRhmbNEMCHQT7Ha7ZQoRw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTYwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARrISq2zO9m\nD29YCLHB56FdU/RINtRhfeLtM+u5o3HaAnopy0S98RzuEGELjpzr8ZI6kkMMZsj8\nnFZQF8HfuE0go4GJMIGGMB0GA1UdDgQWBBSnjWvpWxZcFnfQ2KGtCg/u6fT/DzBX\nBgNVHSMEUDBOgBRTw3K0Psy3u/6+3KKSoaQqJnPvPqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgDgXjoc6FfMF5W0NziV6vx2BOPNWav01Z\nynEP4h9ULnUCIQC1rU4sEId3UdjzTKhpSGTKtaOuPG+b0YdEMPimI4jmVw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTUwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ7Vsp7JmDN\nkgPh/+zmIPkd7o0xot/WPMFn3uAsGtsU385MF0fmhfFLhRbbH9h4JjYHj8y0spU3\nbuUXhftvAZVbo4GJMIGGMB0GA1UdDgQWBBRTw3K0Psy3u/6+3KKSoaQqJnPvPjBX\nBgNVHSMEUDBOgBR1mXlrdW5rx1VnqMMnUBXo0WWGWqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAMJnGjE9v3SjuGfi0jNByrwyNfhlTHMh\nFhPQidNrDpXwAiEAqYtNiV8t9RrAa9GC6FWDuJpvIiU6FsE+lFq6uIq/J2E=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTQwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQlKUiMoSss\n/hsTasedqdB2BCOGJhTt0hgUGeUnWNZ1svO4yn0GkFHZ08++fl2MKqjpj+VXq0JS\nFFyGUOgmgi3Ho4GJMIGGMB0GA1UdDgQWBBR1mXlrdW5rx1VnqMMnUBXo0WWGWjBX\nBgNVHSMEUDBOgBRNsJB++ccSBmbCCKBxi4CjXROBk6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAKYOIo+fdCQRqpH4LN8qUK1aKzKmWGxS\nfGzEEkg/29bMAiAl95cmucoCDMq2Ab8Coc0dEqyJ6+rAPMLBCbGawyiW6A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTMwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATRMZN0RHzP\ndonNmZuq9XPhzvQ52TaokxT39qpQtlFyvUuEGKrLoNvdcpARaA0rGput6RLAQOVU\niNVlJ3Ipj789o4GJMIGGMB0GA1UdDgQWBBRNsJB++ccSBmbCCKBxi4CjXROBkzBX\nBgNVHSMEUDBOgBTmVnUSF2MYwws/nCMv7b1wJVkDmqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgVfuLpjp08AaxKWf6cuZUUCRd7CojSS1I\n71hzeUyFS+sCIQDNJI6P/pBbiHgTaGlBAgfcEfmxmbY0n4xZndtxIkmyVA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTIwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATrkzCJLznh\nlhnsv1RXB9kfeaD+cIruPQ0cItBDGpdvD8xbBVvQci4+RG2RVUCSWRhkFYjSsUSM\n0QHMQnBFlhw2o4GJMIGGMB0GA1UdDgQWBBTmVnUSF2MYwws/nCMv7b1wJVkDmjBX\nBgNVHSMEUDBOgBTZTtbi+j0Sm/Zs/+gTkWdASpQzfqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTExggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgWsm+rHJgwUEyNm8EKbEds5yurpp5/3y5\nPsvXJVDqxogCIQDUP0Jcl3A907CE2tPVXSgD6LQ6CPu19mixemPw60yijA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTEwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATDE9LPlLPc\ngZ3b0BchR/AkhNEP9HAavwYadJIyzoPo5edCVnboQH786jsZwZNZoC0gHDAhCmGc\nIfRenISAoVuPo4GJMIGGMB0GA1UdDgQWBBTZTtbi+j0Sm/Zs/+gTkWdASpQzfjBX\nBgNVHSMEUDBOgBSOSt6ePyMRT6PGMaIi7FqNX9MKtKEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYYF5AnRV7eh2hLD5Dz//pceMTKz9Ls46\nE6DxvbfDHikCIFttlGrOCZVyS4ocsjuKIELVUX5qfygI0sn4kU3qCTs2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/c20.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMjAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATGebrN8JxE\nheOdCxD+mhnQ4zMUxF1WUkmAAHIUw089BYiH9SAwYS/M5tnl+R8fbjvoGqSpR6Tk\nV9EU3CQyIoxwo4GJMIGGMB0GA1UdDgQWBBTZs6oChL1c2CSZXY2YFQkkqg+lzDBX\nBgNVHSMEUDBOgBRQMc94kTqW+zQO3lo2WMI/81k3c6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgRVGZReXKvdMHhwLbPvbrTVLeAGDqmqMH\n/WqD4u23QBgCID/QtFaiawjviNFEdtU7JK6v4ZY0PQ0a0+HLZIHLi9ah\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQJyRCHND78\nKxZHoHHdOTjPuD6HjHPnEKX8apblUpETDJuLW7YR3V8Q0dTac+JHiR6e2l4DlDbf\n5bTiyFoAzw9yo4GJMIGGMB0GA1UdDgQWBBRQMc94kTqW+zQO3lo2WMI/81k3czBX\nBgNVHSMEUDBOgBSDbIpYntlhJ0GgIsyd75XRhlC18qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgIzGOZqJRmvygzvLm8zxZFyoNpcT7e26H\nnZd5xFIzEakCIHGYcUXzt+owSVlLmrlW8gQcB81ErQbxuBTAsvpaaKSS\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTcwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASsc/JkNcYf\nbMgpOfrL5kKOGxOJaGS6SQIeNO33UeBpToe1bU2acN652xjvcGo0fJEtxg2fcPHR\nhTnGMBD1u1N2o4GJMIGGMB0GA1UdDgQWBBSDbIpYntlhJ0GgIsyd75XRhlC18jBX\nBgNVHSMEUDBOgBSnjWvpWxZcFnfQ2KGtCg/u6fT/D6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAJo2NXfJU1sK6SVTu4OV21FKITlXntMi\noenYMsBjzO8oAiEAidSELcLjjAHi3mfBARvCgKlRhmbNEMCHQT7Ha7ZQoRw=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTYwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARrISq2zO9m\nD29YCLHB56FdU/RINtRhfeLtM+u5o3HaAnopy0S98RzuEGELjpzr8ZI6kkMMZsj8\nnFZQF8HfuE0go4GJMIGGMB0GA1UdDgQWBBSnjWvpWxZcFnfQ2KGtCg/u6fT/DzBX\nBgNVHSMEUDBOgBRTw3K0Psy3u/6+3KKSoaQqJnPvPqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgDgXjoc6FfMF5W0NziV6vx2BOPNWav01Z\nynEP4h9ULnUCIQC1rU4sEId3UdjzTKhpSGTKtaOuPG+b0YdEMPimI4jmVw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTUwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQ7Vsp7JmDN\nkgPh/+zmIPkd7o0xot/WPMFn3uAsGtsU385MF0fmhfFLhRbbH9h4JjYHj8y0spU3\nbuUXhftvAZVbo4GJMIGGMB0GA1UdDgQWBBRTw3K0Psy3u/6+3KKSoaQqJnPvPjBX\nBgNVHSMEUDBOgBR1mXlrdW5rx1VnqMMnUBXo0WWGWqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTE0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAMJnGjE9v3SjuGfi0jNByrwyNfhlTHMh\nFhPQidNrDpXwAiEAqYtNiV8t9RrAa9GC6FWDuJpvIiU6FsE+lFq6uIq/J2E=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTQwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQlKUiMoSss\n/hsTasedqdB2BCOGJhTt0hgUGeUnWNZ1svO4yn0GkFHZ08++fl2MKqjpj+VXq0JS\nFFyGUOgmgi3Ho4GJMIGGMB0GA1UdDgQWBBR1mXlrdW5rx1VnqMMnUBXo0WWGWjBX\nBgNVHSMEUDBOgBRNsJB++ccSBmbCCKBxi4CjXROBk6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAKYOIo+fdCQRqpH4LN8qUK1aKzKmWGxS\nfGzEEkg/29bMAiAl95cmucoCDMq2Ab8Coc0dEqyJ6+rAPMLBCbGawyiW6A==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTMwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATRMZN0RHzP\ndonNmZuq9XPhzvQ52TaokxT39qpQtlFyvUuEGKrLoNvdcpARaA0rGput6RLAQOVU\niNVlJ3Ipj789o4GJMIGGMB0GA1UdDgQWBBRNsJB++ccSBmbCCKBxi4CjXROBkzBX\nBgNVHSMEUDBOgBTmVnUSF2MYwws/nCMv7b1wJVkDmqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgVfuLpjp08AaxKWf6cuZUUCRd7CojSS1I\n71hzeUyFS+sCIQDNJI6P/pBbiHgTaGlBAgfcEfmxmbY0n4xZndtxIkmyVA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTIwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATrkzCJLznh\nlhnsv1RXB9kfeaD+cIruPQ0cItBDGpdvD8xbBVvQci4+RG2RVUCSWRhkFYjSsUSM\n0QHMQnBFlhw2o4GJMIGGMB0GA1UdDgQWBBTmVnUSF2MYwws/nCMv7b1wJVkDmjBX\nBgNVHSMEUDBOgBTZTtbi+j0Sm/Zs/+gTkWdASpQzfqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTExggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgWsm+rHJgwUEyNm8EKbEds5yurpp5/3y5\nPsvXJVDqxogCIQDUP0Jcl3A907CE2tPVXSgD6LQ6CPu19mixemPw60yijA==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTEwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATDE9LPlLPc\ngZ3b0BchR/AkhNEP9HAavwYadJIyzoPo5edCVnboQH786jsZwZNZoC0gHDAhCmGc\nIfRenISAoVuPo4GJMIGGMB0GA1UdDgQWBBTZTtbi+j0Sm/Zs/+gTkWdASpQzfjBX\nBgNVHSMEUDBOgBSOSt6ePyMRT6PGMaIi7FqNX9MKtKEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTEwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgYYF5AnRV7eh2hLD5Dz//pceMTKz9Ls46\nE6DxvbfDHikCIFttlGrOCZVyS4ocsjuKIELVUX5qfygI0sn4kU3qCTs2\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMTAwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATZwR+WK6NB\nF/7riFdN63c8hjYddZRR4lrzVNPwiBQxnnxwpPyrD9A6aPPmLc6SqGOJW4ZGVCco\nIBze9RJVeiB9o4GJMIGGMB0GA1UdDgQWBBSOSt6ePyMRT6PGMaIi7FqNX9MKtDBX\nBgNVHSMEUDBOgBQtxZSLJAkEz+2RKMQexM6EtsfgcqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA5ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgN//NqM0FrkrMjmxoeCY9DgxkH2R6sQ4d\nNgtwCZAIqEICIBs4vupaVcuvni9tltbP26wi7c0FR+blZuo5DPIA3SVe\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDkwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMTAwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR6jlGKbJd5\nhiDxN789gkOcwpyHI9wRwCrADAOwOkMePBPRlwGdm7mw7Z/EAmu26zRm/hcyrs4M\nqk2LabDjPI9Xo4GJMIGGMB0GA1UdDgQWBBQtxZSLJAkEz+2RKMQexM6EtsfgcjBX\nBgNVHSMEUDBOgBT6gyXHzPIPYc1Vr1aGiLLeMh4HpqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA4ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIgP7S8vFstfUBdNe6ym5GYG5Q+aBVEKqRs\nfVW7HNUktSYCIQDo6Jua6o/DJbrpq4qYWq5gv4yGyzPTN+3IaKrEICdaaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDgwHhcNMTcwNjIyMTE1MDMzWhcN\nMjcwNjIzMTE1MDMzWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDkwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAR7ZB16+t6E\nsfahGyKUGJW5mezkzjdaYvc4lbJaKNRwFRfc3F/fmNOSsUFSg/F0N+vUE+doKiPC\n8wRwLzvm4s+5o4GJMIGGMB0GA1UdDgQWBBT6gyXHzPIPYc1Vr1aGiLLeMh4HpjBX\nBgNVHSMEUDBOgBS40mLt93U8Sh8ZGiDVAhRSiBPcXqEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA3ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgO4el1ZPhlIli/qNR2SIEiuvs5Mmy868i\nN2Rv5X/VxIECIA/8rUALQxW38XSdBVX3e/jzu7ju47n1YwEqD9K9WdVv\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDcwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDgwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARpQeQ/YGQj\nnl7Szo6WStJ1u7xunTL5jBkXH8aAVSm0qiX4AD/7YPxa5EnGzZdLTn25vQVnfQAG\npMx8P1lYiGYCo4GJMIGGMB0GA1UdDgQWBBS40mLt93U8Sh8ZGiDVAhRSiBPcXjBX\nBgNVHSMEUDBOgBREq5J3toJPxZ3O+ssJ5vkkU0RJE6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA2ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhANwGf+F4a+kmXWz8UjSpRkaToTV6EFWw\n/Tjzj0tQhDoAAiEA19RxeWOVBBpM6LOHg6v5Lf54YN1snkLf+sEXyZCuWQQ=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDYwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASNOj4d4MEA\n7p/3miijqG4ToE4opKPAm+3BTIGrJTYT14++TSiUICl0ASXj+xeUcLMIaXTN042s\nLsHxpShzQaL0o4GJMIGGMB0GA1UdDgQWBBREq5J3toJPxZ3O+ssJ5vkkU0RJEzBX\nBgNVHSMEUDBOgBSjovYaC/m6Li9Tp0V9iZRs9267Q6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA1ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAKGcf+c442c/XiwubbaiQvsoZ7EoVxuM\noKmia0gPyBNkAiEA83asjJ5FDXQuLyZpczviXrbmqgCPOfYadtvkc0cxMis=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDUwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDYwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASA9qWoAUHr\nnn+3kxyNrjPJk82WDLimW21RN51uxpobadv8YgGEDRdP+Ok+uRqQSUsA6ZXfF3iG\nr2GjfQ3wMDH8o4GJMIGGMB0GA1UdDgQWBBSjovYaC/m6Li9Tp0V9iZRs9267QzBX\nBgNVHSMEUDBOgBTXh06MAV9S4l4lG1TKOrKRBh4qn6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTA0ggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgcjZNFWJtlDmoPZbAxqsGczRYK0lfPgu6\ng1H7pp0ce+wCIDj9BRZM2OB9EF0e+MDKGjyZGfvfrL6Ir47x/KrM6H8T\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDQwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDUwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQEdT0OFf5G\nUcrgX2XllCyJzP94NZ464GsgB6psNLsDeL+j7AU+oJy7VLvW/lHh3ODgl08Z9bhq\nLFBmNjnHbm8Qo4GJMIGGMB0GA1UdDgQWBBTXh06MAV9S4l4lG1TKOrKRBh4qnzBX\nBgNVHSMEUDBOgBQox4F1NsZunlsduoGvzIgRSYfB36EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAzggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAIW++zqDZlLLUk/emePohdNOp5JO3wS9\nXvkBJ6Wua7GBAiAdx+EKmdjVrwnzrQltTgnmSfGMXhKNYifK3uD83W3pcQ==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1jCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDMwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQUXDgcUVNT\n9hovbZE5HL6rjOb7C55wEuWKThV/CcZ4rWrXx7VXHYdD/R3aDA7JSvYpm2sTok4i\nsblDzhZM/GDNo4GJMIGGMB0GA1UdDgQWBBQox4F1NsZunlsduoGvzIgRSYfB3zBX\nBgNVHSMEUDBOgBQApzZdtBdD3dLxouQpr/aDiVttd6EzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAyggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDRwAwRAIgAkiNhqFAZXSUWEDK91OZvQGdeZOtd6mC\n+Wv3fGk3t28CIEKOwidkUTUaiPdZ4efmAr+CEeGzdq27ob2S+nqqHqgV\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB2DCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDIwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDMwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQRDXDNIi1p\nereudhqwa2LslXgsxnB63Hu5y5lg+1WPruIYPzD/Ho0APveVdzFLVji19+bE4+tF\nPYL1SpsN1WfWo4GJMIGGMB0GA1UdDgQWBBQApzZdtBdD3dLxouQpr/aDiVttdzBX\nBgNVHSMEUDBOgBT5RCgQ0AlZTQbfFB2+6+w0XRvydaEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAxggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSQAwRgIhAOnd+7bAofkHVa4KFNjv3TCegw1lrhuM\n8Of8wgvrTEGoAiEAsS8iKMpSfXH4D0egg4gLamE6akde965rDtySU+ve9lg=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB1zCCAX2gAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDEwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQWHpv1i6lf\nwvNPOP5ka6S0n55EvzoaYK6pbTXP6yMOW/4XZSPKx5Zoq4FMe0cKzGIIFL1rzj1V\n2czYB+qvLhyio4GJMIGGMB0GA1UdDgQWBBT5RCgQ0AlZTQbfFB2+6+w0XRvydTBX\nBgNVHSMEUDBOgBSh3uHkX5nj86yFEFwjscSWM40P+qEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggEBMAwGA1UdEwQF\nMAMBAf8wCgYIKoZIzj0EAwIDSAAwRQIhAI7unGW/gr9tOc3i+dF5N815srgh+FrX\noj9Et74EcSpTAiBubv+vOH0DE0gmYI11HeAIgutWqqMIC72dZlwTF/Vi3g==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIB3jCCAYWgAwIBAgIBATAKBggqhkjOPQQDAjAvMQswCQYDVQQGEwJVSzERMA8G\nA1UECgwIbWJlZCBUTFMxDTALBgNVBAMMBENBMDAwHhcNMTcwNjIyMTE1MDMyWhcN\nMjcwNjIzMTE1MDMyWjAvMQswCQYDVQQGEwJVSzERMA8GA1UECgwIbWJlZCBUTFMx\nDTALBgNVBAMMBENBMDEwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAQznn9zHHwL\nGO8VR4W9V7vMlxCdoojzEOiX5Y6JtPtFOz866ueHY6zoN0/mJ6DnqnSXilJIUUeW\n6eGfqmka7nxko4GRMIGOMB0GA1UdDgQWBBSh3uHkX5nj86yFEFwjscSWM40P+jBf\nBgNVHSMEWDBWgBQlFYvU5WboI4fcdPoiQs8/fPHZraEzpDEwLzELMAkGA1UEBhMC\nVUsxETAPBgNVBAoMCG1iZWQgVExTMQ0wCwYDVQQDDARDQTAwggkA/KCWhcqToHAw\nDAYDVR0TBAUwAwEB/zAKBggqhkjOPQQDAgNHADBEAiBasbuinP+pJTU4oDCVD8zQ\n1rJBDSOKIEyWu84/D6Hj6wIgVMPUoO01bPhzllAa/gW8Xk/daey09SBgN3AT9pWU\nTDA=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIBpTCCAUugAwIBAgIJAPygloXKk6BwMAoGCCqGSM49BAMCMC8xCzAJBgNVBAYT\nAlVLMREwDwYDVQQKDAhtYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDAeFw0xNzA2MjIx\nMTUwMzJaFw0yNzA2MjMxMTUwMzJaMC8xCzAJBgNVBAYTAlVLMREwDwYDVQQKDAht\nYmVkIFRMUzENMAsGA1UEAwwEQ0EwMDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IA\nBFW41/qAwAPpy+Txdc7PKmzZsq9CPiujKU4vpF1ekXnGx2HP420QobwBVVWhkzRm\nLwdboH2j65dcCKjQ7mv/dxKjUDBOMB0GA1UdDgQWBBQlFYvU5WboI4fcdPoiQs8/\nfPHZrTAfBgNVHSMEGDAWgBQlFYvU5WboI4fcdPoiQs8/fPHZrTAMBgNVHRMEBTAD\nAQH/MAoGCCqGSM49BAMCA0gAMEUCIQC7iRcVzwMyfVK5imirJ7MqJQ04euH4CLOt\nIZ+SNfaERAIgSU0MWFDosVEIpg8YMqIHeF7Mg4ZyH6+fGazJgVLttUY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/int.opensslconf",
    "content": "[int]\nsubjectKeyIdentifier=hash\nauthorityKeyIdentifier=keyid:always,issuer:always\nbasicConstraints = CA:true\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir-maxpath/long.sh",
    "content": "#!/bin/sh\n\nset -eu\n\n: ${OPENSSL:=openssl}\nNB=20\n\nOPT=\"-days 3653 -sha256\"\n\n# generate self-signed root\n$OPENSSL ecparam -name prime256v1 -genkey -out 00.key\n$OPENSSL req -new -x509 -subj \"/C=UK/O=mbed TLS/CN=CA00\" $OPT \\\n             -key 00.key -out 00.crt\n\n# cXX.pem is the chain starting at XX\ncp 00.crt c00.pem\n\n# generate long chain\ni=1\nwhile [ $i -le $NB ]; do\n    UP=$( printf \"%02d\" $((i-1)) )\n    ME=$( printf \"%02d\" $i )\n\n    $OPENSSL ecparam -name prime256v1 -genkey -out ${ME}.key\n    $OPENSSL req -new -subj \"/C=UK/O=mbed TLS/CN=CA${ME}\" \\\n                 -key ${ME}.key -out ${ME}.csr\n    $OPENSSL x509 -req -CA ${UP}.crt -CAkey ${UP}.key -set_serial 1 $OPT \\\n                  -extfile int.opensslconf -extensions int \\\n                  -in ${ME}.csr -out ${ME}.crt\n\n    cat ${ME}.crt c${UP}.pem > c${ME}.pem\n\n    rm ${ME}.csr\n    i=$((i+1))\ndone\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir1/test-ca.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 0 (0x0)\n        Signature Algorithm: sha1WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb 12 14:44:00 2011 GMT\n            Not After : Feb 12 14:44:00 2021 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:c0:df:37:fc:17:bb:e0:96:9d:3f:86:de:96:32:\n                    7d:44:a5:16:a0:cd:21:f1:99:d4:ec:ea:cb:7c:18:\n                    58:08:94:a5:ec:9b:c5:8b:df:1a:1e:99:38:99:87:\n                    1e:7b:c0:8d:39:df:38:5d:70:78:07:d3:9e:d9:93:\n                    e8:b9:72:51:c5:ce:a3:30:52:a9:f2:e7:40:70:14:\n                    cb:44:a2:72:0b:c2:e5:40:f9:3e:e5:a6:0e:b3:f9:\n                    ec:4a:63:c0:b8:29:00:74:9c:57:3b:a8:a5:04:90:\n                    71:f1:bd:83:d9:3f:d6:a5:e2:3c:2a:8f:ef:27:60:\n                    c3:c6:9f:cb:ba:ec:60:7d:b7:e6:84:32:be:4f:fb:\n                    58:26:22:03:5b:d4:b4:d5:fb:f5:e3:96:2e:70:c0:\n                    e4:2e:bd:fc:2e:ee:e2:41:55:c0:34:2e:7d:24:72:\n                    69:cb:47:b1:14:40:83:7d:67:f4:86:f6:31:ab:f1:\n                    79:a4:b2:b5:2e:12:f9:84:17:f0:62:6f:27:3e:13:\n                    58:b1:54:0d:21:9a:73:37:a1:30:cf:6f:92:dc:f6:\n                    e9:fc:ac:db:2e:28:d1:7e:02:4b:23:a0:15:f2:38:\n                    65:64:09:ea:0c:6e:8e:1b:17:a0:71:c8:b3:9b:c9:\n                    ab:e9:c3:f2:cf:87:96:8f:80:02:32:9e:99:58:6f:\n                    a2:d5\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints:\n                CA:TRUE\n            X509v3 Subject Key Identifier:\n                B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n            X509v3 Authority Key Identifier:\n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n                DirName:/C=NL/O=PolarSSL/CN=PolarSSL Test CA\n                serial:00\n\n    Signature Algorithm: sha1WithRSAEncryption\n        b8:fd:54:d8:00:54:90:8b:25:b0:27:dd:95:cd:a2:f7:84:07:\n        1d:87:89:4a:c4:78:11:d8:07:b5:d7:22:50:8e:48:eb:62:7a:\n        32:89:be:63:47:53:ff:b6:be:f1:2e:8c:54:c0:99:3f:a0:b9:\n        37:23:72:5f:0d:46:59:8f:d8:47:cd:97:4c:9f:07:0c:12:62:\n        09:3a:24:e4:36:d9:e9:2c:da:38:d0:73:75:61:d7:c1:6c:26:\n        8b:9b:e0:d5:dc:67:ed:8c:6b:33:d7:74:22:3c:4c:db:b5:8d:\n        2a:ce:2c:0d:08:59:05:09:05:a6:39:9f:b3:67:1b:e2:83:e5:\n        e1:8f:53:f6:67:93:c7:f9:6f:76:44:58:12:e8:3a:d4:97:e7:\n        e9:c0:3e:a8:7a:72:3d:87:53:1f:e5:2c:84:84:e7:9a:9e:7f:\n        66:d9:1f:9b:f5:13:48:b0:4d:14:d1:de:b2:24:d9:78:7d:f5:\n        35:cc:58:19:d1:d2:99:ef:4d:73:f8:1f:89:d4:5a:d0:52:ce:\n        09:f5:b1:46:51:6a:00:8e:3b:cc:6f:63:01:00:99:ed:9d:a6:\n        08:60:cd:32:18:d0:73:e0:58:71:d9:e5:d2:53:d7:8d:d0:ca:\n        e9:5d:2a:0a:0d:5d:55:ec:21:50:17:16:e6:06:4a:cd:5e:de:\n        f7:e0:e9:54\n-----BEGIN CERTIFICATE-----\nMIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\nmdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\n50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\nYMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\nR7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\nKNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\ngZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH\n/f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV\nBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz\ndCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ\nSsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H\nDBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF\npjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf\nm/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ\n7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir2/test-ca.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 0 (0x0)\n        Signature Algorithm: sha1WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb 12 14:44:00 2011 GMT\n            Not After : Feb 12 14:44:00 2021 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:c0:df:37:fc:17:bb:e0:96:9d:3f:86:de:96:32:\n                    7d:44:a5:16:a0:cd:21:f1:99:d4:ec:ea:cb:7c:18:\n                    58:08:94:a5:ec:9b:c5:8b:df:1a:1e:99:38:99:87:\n                    1e:7b:c0:8d:39:df:38:5d:70:78:07:d3:9e:d9:93:\n                    e8:b9:72:51:c5:ce:a3:30:52:a9:f2:e7:40:70:14:\n                    cb:44:a2:72:0b:c2:e5:40:f9:3e:e5:a6:0e:b3:f9:\n                    ec:4a:63:c0:b8:29:00:74:9c:57:3b:a8:a5:04:90:\n                    71:f1:bd:83:d9:3f:d6:a5:e2:3c:2a:8f:ef:27:60:\n                    c3:c6:9f:cb:ba:ec:60:7d:b7:e6:84:32:be:4f:fb:\n                    58:26:22:03:5b:d4:b4:d5:fb:f5:e3:96:2e:70:c0:\n                    e4:2e:bd:fc:2e:ee:e2:41:55:c0:34:2e:7d:24:72:\n                    69:cb:47:b1:14:40:83:7d:67:f4:86:f6:31:ab:f1:\n                    79:a4:b2:b5:2e:12:f9:84:17:f0:62:6f:27:3e:13:\n                    58:b1:54:0d:21:9a:73:37:a1:30:cf:6f:92:dc:f6:\n                    e9:fc:ac:db:2e:28:d1:7e:02:4b:23:a0:15:f2:38:\n                    65:64:09:ea:0c:6e:8e:1b:17:a0:71:c8:b3:9b:c9:\n                    ab:e9:c3:f2:cf:87:96:8f:80:02:32:9e:99:58:6f:\n                    a2:d5\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints:\n                CA:TRUE\n            X509v3 Subject Key Identifier:\n                B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n            X509v3 Authority Key Identifier:\n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n                DirName:/C=NL/O=PolarSSL/CN=PolarSSL Test CA\n                serial:00\n\n    Signature Algorithm: sha1WithRSAEncryption\n        b8:fd:54:d8:00:54:90:8b:25:b0:27:dd:95:cd:a2:f7:84:07:\n        1d:87:89:4a:c4:78:11:d8:07:b5:d7:22:50:8e:48:eb:62:7a:\n        32:89:be:63:47:53:ff:b6:be:f1:2e:8c:54:c0:99:3f:a0:b9:\n        37:23:72:5f:0d:46:59:8f:d8:47:cd:97:4c:9f:07:0c:12:62:\n        09:3a:24:e4:36:d9:e9:2c:da:38:d0:73:75:61:d7:c1:6c:26:\n        8b:9b:e0:d5:dc:67:ed:8c:6b:33:d7:74:22:3c:4c:db:b5:8d:\n        2a:ce:2c:0d:08:59:05:09:05:a6:39:9f:b3:67:1b:e2:83:e5:\n        e1:8f:53:f6:67:93:c7:f9:6f:76:44:58:12:e8:3a:d4:97:e7:\n        e9:c0:3e:a8:7a:72:3d:87:53:1f:e5:2c:84:84:e7:9a:9e:7f:\n        66:d9:1f:9b:f5:13:48:b0:4d:14:d1:de:b2:24:d9:78:7d:f5:\n        35:cc:58:19:d1:d2:99:ef:4d:73:f8:1f:89:d4:5a:d0:52:ce:\n        09:f5:b1:46:51:6a:00:8e:3b:cc:6f:63:01:00:99:ed:9d:a6:\n        08:60:cd:32:18:d0:73:e0:58:71:d9:e5:d2:53:d7:8d:d0:ca:\n        e9:5d:2a:0a:0d:5d:55:ec:21:50:17:16:e6:06:4a:cd:5e:de:\n        f7:e0:e9:54\n-----BEGIN CERTIFICATE-----\nMIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\nmdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\n50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\nYMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\nR7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\nKNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\ngZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH\n/f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV\nBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz\ndCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ\nSsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H\nDBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF\npjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf\nm/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ\n7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir2/test-ca2.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIICUjCCAdegAwIBAgIJAMFD4n5iQ8zoMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYT\nAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\nQyBDQTAeFw0xMzA5MjQxNTQ5NDhaFw0yMzA5MjIxNTQ5NDhaMD4xCzAJBgNVBAYT\nAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\nQyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMPaKzRBN1gvh1b+/Im6KUNLTuBu\nww5XUzM5WNRStJGVOQsj318XJGJI/BqVKc4sLYfCiFKAr9ZqqyHduNMcbli4yuiy\naY7zQa0pw7RfdadHb9UZKVVpmlM7ILRmFmAzHqOBoDCBnTAdBgNVHQ4EFgQUnW0g\nJEkBPyvLeLUZvH4kydv7NnwwbgYDVR0jBGcwZYAUnW0gJEkBPyvLeLUZvH4kydv7\nNnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UE\nAxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAwGA1UdEwQFMAMBAf8w\nCgYIKoZIzj0EAwIDaQAwZgIxAMO0YnNWKJUAfXgSJtJxexn4ipg+kv4znuR50v56\nt4d0PCu412mUC6Nnd7izvtE2MgIxAP1nnJQjZ8BWukszFQDG48wxCCyci9qpdSMv\nuCjn8pwUOkABXK8Mss90fzCfCEOtIA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir3/Readme",
    "content": "This is just to make sure files that don't parse as certs are ignored.\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir3/test-ca.crt",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number: 0 (0x0)\n        Signature Algorithm: sha1WithRSAEncryption\n        Issuer: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Validity\n            Not Before: Feb 12 14:44:00 2011 GMT\n            Not After : Feb 12 14:44:00 2021 GMT\n        Subject: C=NL, O=PolarSSL, CN=PolarSSL Test CA\n        Subject Public Key Info:\n            Public Key Algorithm: rsaEncryption\n            RSA Public Key: (2048 bit)\n                Modulus (2048 bit):\n                    00:c0:df:37:fc:17:bb:e0:96:9d:3f:86:de:96:32:\n                    7d:44:a5:16:a0:cd:21:f1:99:d4:ec:ea:cb:7c:18:\n                    58:08:94:a5:ec:9b:c5:8b:df:1a:1e:99:38:99:87:\n                    1e:7b:c0:8d:39:df:38:5d:70:78:07:d3:9e:d9:93:\n                    e8:b9:72:51:c5:ce:a3:30:52:a9:f2:e7:40:70:14:\n                    cb:44:a2:72:0b:c2:e5:40:f9:3e:e5:a6:0e:b3:f9:\n                    ec:4a:63:c0:b8:29:00:74:9c:57:3b:a8:a5:04:90:\n                    71:f1:bd:83:d9:3f:d6:a5:e2:3c:2a:8f:ef:27:60:\n                    c3:c6:9f:cb:ba:ec:60:7d:b7:e6:84:32:be:4f:fb:\n                    58:26:22:03:5b:d4:b4:d5:fb:f5:e3:96:2e:70:c0:\n                    e4:2e:bd:fc:2e:ee:e2:41:55:c0:34:2e:7d:24:72:\n                    69:cb:47:b1:14:40:83:7d:67:f4:86:f6:31:ab:f1:\n                    79:a4:b2:b5:2e:12:f9:84:17:f0:62:6f:27:3e:13:\n                    58:b1:54:0d:21:9a:73:37:a1:30:cf:6f:92:dc:f6:\n                    e9:fc:ac:db:2e:28:d1:7e:02:4b:23:a0:15:f2:38:\n                    65:64:09:ea:0c:6e:8e:1b:17:a0:71:c8:b3:9b:c9:\n                    ab:e9:c3:f2:cf:87:96:8f:80:02:32:9e:99:58:6f:\n                    a2:d5\n                Exponent: 65537 (0x10001)\n        X509v3 extensions:\n            X509v3 Basic Constraints:\n                CA:TRUE\n            X509v3 Subject Key Identifier:\n                B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n            X509v3 Authority Key Identifier:\n                keyid:B4:5A:E4:A5:B3:DE:D2:52:F6:B9:D5:A6:95:0F:EB:3E:BC:C7:FD:FF\n                DirName:/C=NL/O=PolarSSL/CN=PolarSSL Test CA\n                serial:00\n\n    Signature Algorithm: sha1WithRSAEncryption\n        b8:fd:54:d8:00:54:90:8b:25:b0:27:dd:95:cd:a2:f7:84:07:\n        1d:87:89:4a:c4:78:11:d8:07:b5:d7:22:50:8e:48:eb:62:7a:\n        32:89:be:63:47:53:ff:b6:be:f1:2e:8c:54:c0:99:3f:a0:b9:\n        37:23:72:5f:0d:46:59:8f:d8:47:cd:97:4c:9f:07:0c:12:62:\n        09:3a:24:e4:36:d9:e9:2c:da:38:d0:73:75:61:d7:c1:6c:26:\n        8b:9b:e0:d5:dc:67:ed:8c:6b:33:d7:74:22:3c:4c:db:b5:8d:\n        2a:ce:2c:0d:08:59:05:09:05:a6:39:9f:b3:67:1b:e2:83:e5:\n        e1:8f:53:f6:67:93:c7:f9:6f:76:44:58:12:e8:3a:d4:97:e7:\n        e9:c0:3e:a8:7a:72:3d:87:53:1f:e5:2c:84:84:e7:9a:9e:7f:\n        66:d9:1f:9b:f5:13:48:b0:4d:14:d1:de:b2:24:d9:78:7d:f5:\n        35:cc:58:19:d1:d2:99:ef:4d:73:f8:1f:89:d4:5a:d0:52:ce:\n        09:f5:b1:46:51:6a:00:8e:3b:cc:6f:63:01:00:99:ed:9d:a6:\n        08:60:cd:32:18:d0:73:e0:58:71:d9:e5:d2:53:d7:8d:d0:ca:\n        e9:5d:2a:0a:0d:5d:55:ec:21:50:17:16:e6:06:4a:cd:5e:de:\n        f7:e0:e9:54\n-----BEGIN CERTIFICATE-----\nMIIDhzCCAm+gAwIBAgIBADANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJOTDER\nMA8GA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwHhcN\nMTEwMjEyMTQ0NDAwWhcNMjEwMjEyMTQ0NDAwWjA7MQswCQYDVQQGEwJOTDERMA8G\nA1UEChMIUG9sYXJTU0wxGTAXBgNVBAMTEFBvbGFyU1NMIFRlc3QgQ0EwggEiMA0G\nCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDA3zf8F7vglp0/ht6WMn1EpRagzSHx\nmdTs6st8GFgIlKXsm8WL3xoemTiZhx57wI053zhdcHgH057Zk+i5clHFzqMwUqny\n50BwFMtEonILwuVA+T7lpg6z+exKY8C4KQB0nFc7qKUEkHHxvYPZP9al4jwqj+8n\nYMPGn8u67GB9t+aEMr5P+1gmIgNb1LTV+/Xjli5wwOQuvfwu7uJBVcA0Ln0kcmnL\nR7EUQIN9Z/SG9jGr8XmksrUuEvmEF/Bibyc+E1ixVA0hmnM3oTDPb5Lc9un8rNsu\nKNF+AksjoBXyOGVkCeoMbo4bF6BxyLObyavpw/LPh5aPgAIynplYb6LVAgMBAAGj\ngZUwgZIwDAYDVR0TBAUwAwEB/zAdBgNVHQ4EFgQUtFrkpbPe0lL2udWmlQ/rPrzH\n/f8wYwYDVR0jBFwwWoAUtFrkpbPe0lL2udWmlQ/rPrzH/f+hP6Q9MDsxCzAJBgNV\nBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEZMBcGA1UEAxMQUG9sYXJTU0wgVGVz\ndCBDQYIBADANBgkqhkiG9w0BAQUFAAOCAQEAuP1U2ABUkIslsCfdlc2i94QHHYeJ\nSsR4EdgHtdciUI5I62J6Mom+Y0dT/7a+8S6MVMCZP6C5NyNyXw1GWY/YR82XTJ8H\nDBJiCTok5DbZ6SzaONBzdWHXwWwmi5vg1dxn7YxrM9d0IjxM27WNKs4sDQhZBQkF\npjmfs2cb4oPl4Y9T9meTx/lvdkRYEug61Jfn6cA+qHpyPYdTH+UshITnmp5/Ztkf\nm/UTSLBNFNHesiTZeH31NcxYGdHSme9Nc/gfidRa0FLOCfWxRlFqAI47zG9jAQCZ\n7Z2mCGDNMhjQc+BYcdnl0lPXjdDK6V0qCg1dVewhUBcW5gZKzV7e9+DpVA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir3/test-ca2.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIICUjCCAdegAwIBAgIJAMFD4n5iQ8zoMAoGCCqGSM49BAMCMD4xCzAJBgNVBAYT\nAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\nQyBDQTAeFw0xMzA5MjQxNTQ5NDhaFw0yMzA5MjIxNTQ5NDhaMD4xCzAJBgNVBAYT\nAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UEAxMTUG9sYXJzc2wgVGVzdCBF\nQyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMPaKzRBN1gvh1b+/Im6KUNLTuBu\nww5XUzM5WNRStJGVOQsj318XJGJI/BqVKc4sLYfCiFKAr9ZqqyHduNMcbli4yuiy\naY7zQa0pw7RfdadHb9UZKVVpmlM7ILRmFmAzHqOBoDCBnTAdBgNVHQ4EFgQUnW0g\nJEkBPyvLeLUZvH4kydv7NnwwbgYDVR0jBGcwZYAUnW0gJEkBPyvLeLUZvH4kydv7\nNnyhQqRAMD4xCzAJBgNVBAYTAk5MMREwDwYDVQQKEwhQb2xhclNTTDEcMBoGA1UE\nAxMTUG9sYXJzc2wgVGVzdCBFQyBDQYIJAMFD4n5iQ8zoMAwGA1UdEwQFMAMBAf8w\nCgYIKoZIzj0EAwIDaQAwZgIxAMO0YnNWKJUAfXgSJtJxexn4ipg+kv4znuR50v56\nt4d0PCu412mUC6Nnd7izvtE2MgIxAP1nnJQjZ8BWukszFQDG48wxCCyci9qpdSMv\nuCjn8pwUOkABXK8Mss90fzCfCEOtIA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/Readme",
    "content": "This directory contains the certificates for the tests targeting the enforcement of the policy indicated by the *pathLenConstraint* field. All leaf elements were generated with *is_ca* unset and all roots with the *selfsign=1* option. \n\n1. zero pathlen constraint on an intermediate CA (invalid)\n```\ncert11.crt -> cert12.crt (max_pathlen=0) -> cert13.crt -> cert14.crt\n```\n\n2. zero pathlen constraint on the root CA (invalid)\n```\ncert21.crt (max_pathlen=0) -> cert22.crt -> cert23.crt\n```\n\n3. nonzero pathlen constraint on the root CA (invalid)\n```\ncert31.crt (max_pathlen=1) -> cert32.crt -> cert33.crt -> cert34.crt\n```\n\n4. nonzero pathlen constraint on an intermediate CA (invalid)\n```\ncert41.crt -> cert42.crt (max_pathlen=1) -> cert43.crt -> cert44.crt -> cert45.crt \n```\n\n5. nonzero pathlen constraint on an intermediate CA with maximum number of elements in the chain (valid)\n```\ncert51.crt -> cert52.crt (max_pathlen=1) -> cert53.crt -> cert54.crt\n```\n\n6. nonzero pathlen constraint on the root CA with maximum number of elements in the chain (valid)\n```\ncert61.crt (max_pathlen=1) -> cert62.crt -> cert63.crt\n```\n\n7. pathlen constraint on the root CA with maximum number of elements and a self signed certificate in the chain (valid) \n(This situation happens for example when a root of some hierarchy gets integrated into another hierarchy. In this case the certificates issued before the integration will have an intermadiate self signed certificate in their chain)\n```\ncert71.crt (max_pathlen=1) -> cert72.crt -> cert73.crt (self signed) -> cert74.crt -> cert74.crt\n```\n\n8. zero pathlen constraint on first intermediate CA (valid)\n```\ncert81.crt -> cert82.crt (max_pathlen=0) -> cert83.crt\n```\n\n9. zero pathlen constraint on trusted root (valid)\n```\ncert91.crt (max_pathlen=0) -> cert92.crt\n```\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert11.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIC9zCCAd+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgMjAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMBYxFDASBgNV\nBAMTC1Rlc3Qgcm9vdCAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nhqLw+KDH8+tkX9hphnydOZFoueGTY5v8WdYI6KZXoIln9IAu4Rmb6M59uLziXurg\nVKuwBqOkbUZsIY0NOA6C8FpdjZL1di8Viq669vBBs9c+x9hKpx8/VVcZfTaGgqni\nh5XiivQynBQ4E2KOxEQ+VjUMDqIBHYG1VXWs4KMkAeJsqDYHtmS4XsC9TXTIri5S\n9IX4mE5A9+ngSTo0/6Sjwcd27uO2IQHXDC7jkxX5OH5jFPAqsVKTYDeWlCU7bvbr\niy1H9Z9uCl+M7unbAl8BKQ8leOnno3KO3lQQAPGP2EFRT0XMuUXJnfydPbzMa9FY\nufB1I8zCBZviPvO/Of3yrwIDAQABo1AwTjAMBgNVHRMEBTADAQEBMB0GA1UdDgQW\nBBSUHSH6gjrYFZnS1gDvk7BpfwTKwDAfBgNVHSMEGDAWgBSUHSH6gjrYFZnS1gDv\nk7BpfwTKwDANBgkqhkiG9w0BAQsFAAOCAQEATLqZGFEBO+2IiHjkn7pBkAuktmHm\njkkuFLONwe0vlxZFaabaFqSgkoS5eZ50D0dmuUkpJRNMnGK1B/ja5RewtAdxD6us\nVT8JpeWYkhxaSIHjUW95jJLMVr17it8jHawI05tD26nqDjTq3C2rM4ExpAaK/Dgv\n83ZHe4IdvenkXckDMIjmSsK0GfomZmKvmnfxhg4FnQvZGI48JJUqPA2dHxRhUyr4\nohBmH5Xi5oLICd85GRi8YqD00agKL99EjGulaKNEdsQkrC4ZvY6QDV0EEnbu8b4R\nGfiA42UWN2dKNSqNhBOrP9g5yTcIWXh1Dwpd1Z9vhBCwmBegPqqM5IM1dQ==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert12.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDCjCCAfKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgMjAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMCYxJDAiBgNV\nBAMTG1Rlc3QgaW50ZXJtZWRpYXRlIG1heHBhdGggMTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBANJrP7/Y+KjupvlgaOmQYArfGuoh3CzcdPe/mlhq+fxD\n8U9qzgSVuVR+FpNZi9DyMljMBrWV1OnZI+cVCDYYkNMa3IkV+AkzJGqwcSBKE+6N\nRXZvv+I4xbGymdSSaT6Kh1PgPVk/EYNfLFF30pBsycjM81aMtZgW6aA9xCSp0r8W\nXkZodsrJUQerDh/7VmDVEeKanZog8auvrvs/ENiA8d4p/75lOIER4nLz6SSn5Eqy\nuXzNCwmT5PVwWStXbDD7EBs3rOtR2VNWQ9o6QdfKQOe/SkIddZr1IWGEJ8JHjtNo\njxcYO67A+Jgp1Jwjk+83eRICs0hlWyeHWfBlbOVIKLcCAwEAAaNTMFEwDwYDVR0T\nBAgwBgEBAQIBADAdBgNVHQ4EFgQUyw8Phy/FAvifGQ+G6HWkMiWzyqUwHwYDVR0j\nBBgwFoAUlB0h+oI62BWZ0tYA75OwaX8EysAwDQYJKoZIhvcNAQELBQADggEBACFS\n6tFy9TpVMUfh1mkr3rFEVtho0NJkRhJW8z2PTmKQa069S9gS+U6+CsqwvM1y3yyh\nPt2q34fhhhbQ+gS8iAm+zvQtBsys3frfVkeKmRzxWDh2LnT+tJi/xtqdlULua5NB\n21So46HdlceDTuv2vUbrHgxUS/IEjIL6OZZ0Sc6S6YybvGSioGsRUHO2k2IiOnUa\nC+hpBvOkXScnItfdMKAAce71CsZeN97sbxeNIMBDiX9bSy+dZLscEhRwBUABiNr/\nsYdYvIpbrFXowjMtBdac+vvhcem7dkCrCdsGylGINWhE2tC9hKmFkFXo4mu/AGDS\nM4/59TlMeK8X+WZ9zBs=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert13.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDFzCCAf+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDEwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAmMSQwIgYDVQQDExtUZXN0IGludGVybWVkaWF0ZSBtYXhwYXRoIDIw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs0qdKXytu/GTKpa2H0CE3\nOPSIMM2hiYbavzUroyL+hFv9XVoxh5CGnVUxK7B9ifVvzyElrcV7tjuIlGwp1hLH\ntx/YU22xksI/n5/NS/qrxkK5xjwEWB9lx93rwLK0QnfjYRZrir7yySoBKi6IlHOv\nGOwl0V/JAslMWwUZlFmvYvoCWSWGrDAkxWVnHq+HoZ7YoM/bdJdsIIJYe3tt7L8D\ncJVP5dQ8jSs8/Ehm8BbG339r3B7v/KdK8zuoMig9ag/YOu9jOb0QvYC2HdZoL4WV\nN+7aasTQmDGWGOt7fk7AEl0EI8lDvr2O/5q6ad9jRCkxyq3lJwRy+M3MdVKgA1On\nAgMBAAGjUDBOMAwGA1UdEwQFMAMBAQEwHQYDVR0OBBYEFM6u5Gkjkxb8PDdQIGKD\nD8t1Zv/9MB8GA1UdIwQYMBaAFMsPD4cvxQL4nxkPhuh1pDIls8qlMA0GCSqGSIb3\nDQEBCwUAA4IBAQCLpKATt01DUM8wCiDFVSpmpiCBqxnLRfQuY+ta1p+f15LME+cT\n94lwaYCfCBtXQYwiuVFYdK8ztWEStPg6BecMLPB2K9gO/talxUoVDumsmR83p+2y\n8YJmFHyjr+BShsjP9paCjUQkJiMOiWRpNFNpScv0IOHmb8NLER3vX/tCmxyVHPg/\n7tBpDXRD6jOyajYH4KUx6wddcYWb63N9sApVpRHNaqpUKjuiQwfUFZjA7AyK/FUS\n/cO3++uq+CkZhBu8vupaznXD4h0E28GbZgvu/F0edB7f0Q5DpnuDJ6HFMYl3A2mM\nm8pqKNnRYGCtQwppBYVsoBisga2ymtNud7K+\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert14.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDDDCCAfSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDIwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAeMRwwGgYDVQQDExNUZXN0IGxlYWYgaW52YWxpZCAzMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw6Vc/T2GYTWj7nGZcy2voZyeWkFyfDIy\noexyJe8eyuWX+YqaSCra1JMcww0Jy8e9/6/aI9ezd1d73eZDcW5h61tagCpBki+W\ndYh+FJfCdDdPnSkitWOBLKBK21AQ9dxePvkQBEanDdAk2IwasydCoHEiSCqwXNEz\njVJPL38ibbLf9sNO3kk6zOFA3QqVSTJ4BddNh9bHL7y106ekfMhrfyTzSpo3Wj0V\n20ThmJZ1NuwYRl3j1XHALP0t8Cp2ZLbXuFsTWqTFNzXj+gWM8b2IfZqmqcew5poZ\n4aDkjXXOizRxDPxCHp7rLz9xv1pIIBxady0YWp+w9vxLxFF6rYBLtQIDAQABo00w\nSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBQoF/qrn9WnKV3zOnCwMl99Uhmx8DAfBgNV\nHSMEGDAWgBTOruRpI5MW/Dw3UCBigw/LdWb//TANBgkqhkiG9w0BAQsFAAOCAQEA\nVUnlX//h3T5Ajc85WNkyTuirhSZtIr6+X/AxH4kR/QG5NiaDxP9H0FzMs5FcMni8\n3Rs4d2H3CBs+QB7lm/b+xy26vpORwlVFXScHeTEanuXSVsmGPkn7TAQrPoyZgVUN\nuy4TGi8Mlkso4gmgehvgTklIV+Emxy32Abd1lRfI8/vOQ1xTdA7f3X98AfWStTya\nDGRsQLZE/Q4/Gh57xNqF0ftBIRwt9TbGlu8AyZiIilVECGvE/gtTwuqpQPOhJQmi\nNdYTErgD2Wkw9ohifQFo46AMMU1seehtqijW2pC2UjmV5nboPs0eGQmWrfNCjDOr\nsZfh98BafcaFGjz605V36g==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert21.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIC+jCCAeKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgMjAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMBYxFDASBgNV\nBAMTC1Rlc3Qgcm9vdCAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nmTX2sHY42Ord9gWyB6GcdlLjjE+4zBJ1BoDpMnvJ89niMTuZTq1ViMp/B6RuTH+2\nYF3+riZYQDH9yM/8rgvAUIvK9STaq19Zrm0mnfQUo9yKdkfoJ+XvWuvK6f+NkAMg\nxfhAD6eSupigTvov/w2IT8rS0dxo4KF6hKBL2aYlXhiEyi/NmsEPZWvVh+qk3L/Q\nGSwpgC+DhVoQzFRofUdK9O9MkgR675iftaFDvyi7F0fxrSLfB/Wy4cgRYzIW6pyN\n2sXWivKdLI3bgB01ffdbO17ZAGILK1whO29/bX6hbH09Y/H7jR2vjy+KP9N0PEa3\n7SBymlokB3A8wq/LWPYPeQIDAQABo1MwUTAPBgNVHRMECDAGAQEBAgEAMB0GA1Ud\nDgQWBBSOBd1fH00Y9r5S8cELj/9IT4BGlDAfBgNVHSMEGDAWgBSOBd1fH00Y9r5S\n8cELj/9IT4BGlDANBgkqhkiG9w0BAQsFAAOCAQEAFEY2StppaPzOgG6vEvPJr//+\nNWY1jKcBB3cT+zWJW54+BexDjyaBRnBIPvRLDG8PAlhlYr9v/P6JCjBSuhYorFLG\nP4ZhD+akuMvn6yF7nsyG20LHPwvE7/jye7+zSO3hhyqCg7N7M7O17exo/agw/iUI\nDYUuUv1ZJlZvPB2kmZMYa78g0P2ynyKpu4hdbstJzxwA4aQDXGQxcQNtv+3ZCdC2\nTI4w0jodkjqdq/4y0McpkEvYL3/LaQElLaHr8CQo7xYEzsjv+cnzojCO/ilXU+Rl\nsz940Q4njAJqlpfiJ44aFytjp96uN4YVpViFCvRz//9uyQY9kuA/8kKwJuO3qw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert22.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDBzCCAe+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgMjAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMCYxJDAiBgNV\nBAMTG1Rlc3QgaW50ZXJtZWRpYXRlIG1heHBhdGggMTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBANpGlBMXdo8cO9oqUw/b6PMwiMNV8LCe6wB9VKHPa6OG\nQ0o8Xqktgwnh1rojgpMhbCApE7UXeMr6ZGq/NtqmO1hO5adV5JehWZyvg7j4EBpG\ng8iWo0jNpKMJ0Yx1uBkkljEdZLTHa4bK/zy2NKqDNS2yWs9/M5+xw5XE2ecAg7FT\ncXhf3q50V+M6T2IaQ9BxntTyCT8IIF2eRM/t9Y944s9Rfzm/KQVKRYPudX7YhTt9\niqCJB4JoqYhs3HEO0wPkJxY4KBTUCN94s+7jUFdRrYxe+8Ya6tIYWqD38i5qdGhY\nxrVey1LatsDJQ2EgNYobM/LjoCLK1WUssEqf0OU2bi0CAwEAAaNQME4wDAYDVR0T\nBAUwAwEBATAdBgNVHQ4EFgQUOBl8edVm/H5xdS2EGEeLzftZ/DUwHwYDVR0jBBgw\nFoAUjgXdXx9NGPa+UvHBC4//SE+ARpQwDQYJKoZIhvcNAQELBQADggEBAFwZriTu\nDKkiDHFfz3UX4fIxYTHCi4TveYZGPeTbxhBb3XZC5qDF4T5HvCTSkG9+oFfZzI1a\nlPN2yZB7QnmHJoyWa5fuovwUL0iI3iIZMqU56tdVPW8gkJe++U5kHMSpz2VF0eo8\n7XkKWxZovRwczgfDFRP9zM9CylyzQjqxx6kbxJozWnwc5UrVbJMaPIqonXp1nDoZ\ni878+hX4rJUEjgO6Sa9GVZQpmuCrQF0qKsTiUBzZN67hoD3xoTAYi5IXQE2tRD1N\nj3zwng9liCsxurGMnuV0BPWv/IDYRu/syjee1Qv1VFeRto5D4Rldmi2p1f5iWJCk\n5m5YpRsknaICjYs=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert23.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDDDCCAfSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDEwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAeMRwwGgYDVQQDExNUZXN0IGxlYWYgaW52YWxpZCAyMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAigGgHGNWNkEWWFn7eaU4kC2WjR3RtcBs\noW1MlQndUvwWUHgcbfIg7nh66Oi6Xl3IqAMjHj1J0EPGcwTfmLdaRvN38KjTMh3/\nFiFrrUL0MNgiGxjkTthWgsfV4C/i3vRDTCW+2UMFdd6+z7hwFf+ldTsCP9Qp+93G\ndrslrvAR2W0qjHLULAJGk/6WzxFG6xeCgdhkooDPprsflZJ/cN1SuqTYOaVMAj9J\naovStUTVhF8ouDULpq0fiBImoldObcGdaAWlgRl0k8NdoSLpWd/7+hi4sH5PSOZq\n+8g1lQ3cgrE7ta4X3p/i6eApcn1hyEkTy9ZpKOFvZXnM4D1j8+KSKQIDAQABo00w\nSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBTCN2vDLY1tcenTzyRmlS4TBe2xijAfBgNV\nHSMEGDAWgBQ4GXx51Wb8fnF1LYQYR4vN+1n8NTANBgkqhkiG9w0BAQsFAAOCAQEA\neb/tgtSbrz7j7HQaxGgI5LVedRro3a2fNLhO0wNboGI6gACIPait1ePkUwuMfLfl\nFky2/2VZ8Ie4pQqxFmdSUqf1NSmxgiWLRho4oTiFv1z08LYQgSdKT49ffKO67TDG\nD1nI8rEuT1Nupq8WI5jcKgWqktMJjgKzfN+9nCgFGQMGqTBnt7uYZHhnuZfKSJPv\ngHmS4gj72OQ2Nu6xORGhd6J8VjzcG6BX1pLebNQRzlHT3E5IVNF/9cCrc+E87Wns\nbDGtzhyx7SIP7/2TiJeBZs7p8xXpaDF2cNx2F+jZH+P8feT7c+JoY7A72uVDSlYf\nWVf02pylKRgqayOujH3PWA==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert31.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIC+jCCAeKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgMjAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMBYxFDASBgNV\nBAMTC1Rlc3Qgcm9vdCAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nmTX2sHY42Ord9gWyB6GcdlLjjE+4zBJ1BoDpMnvJ89niMTuZTq1ViMp/B6RuTH+2\nYF3+riZYQDH9yM/8rgvAUIvK9STaq19Zrm0mnfQUo9yKdkfoJ+XvWuvK6f+NkAMg\nxfhAD6eSupigTvov/w2IT8rS0dxo4KF6hKBL2aYlXhiEyi/NmsEPZWvVh+qk3L/Q\nGSwpgC+DhVoQzFRofUdK9O9MkgR675iftaFDvyi7F0fxrSLfB/Wy4cgRYzIW6pyN\n2sXWivKdLI3bgB01ffdbO17ZAGILK1whO29/bX6hbH09Y/H7jR2vjy+KP9N0PEa3\n7SBymlokB3A8wq/LWPYPeQIDAQABo1MwUTAPBgNVHRMECDAGAQEBAgEBMB0GA1Ud\nDgQWBBSOBd1fH00Y9r5S8cELj/9IT4BGlDAfBgNVHSMEGDAWgBSOBd1fH00Y9r5S\n8cELj/9IT4BGlDANBgkqhkiG9w0BAQsFAAOCAQEAB9nLaqxsBW0isDaBGNJyzH9O\nWqYY0hex9tm3UqygfE9b9aahykpkowQIzh4D9Xpbd0hZGVlK/sw2qsKj6gDOiMtL\nuWs4gaFNWIQqhVsTzL88c7XaW55n+TRQdVZyy38DZVWphte1Mumc9WB8N15rZTDh\niXjwGl0mrV1egq4hJZLpy14f6ihqU7KGfmc9onxvgvWxYLi+5v8874c4ophSKsI2\nqVE8iZ6uq2oQ66Pd5S50cYk6MEW5lifAhLM5WFZmW7dRKmykBGZ9rFrJrIvhkmh9\nHe7q6TEQP1Wcoc147nIg0BTkHGtdrEv3jIX6UKKUEwUUk9ARB1mSodZQHBhuww==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert32.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDBzCCAe+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgMjAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMCYxJDAiBgNV\nBAMTG1Rlc3QgaW50ZXJtZWRpYXRlIG1heHBhdGggMTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBANpGlBMXdo8cO9oqUw/b6PMwiMNV8LCe6wB9VKHPa6OG\nQ0o8Xqktgwnh1rojgpMhbCApE7UXeMr6ZGq/NtqmO1hO5adV5JehWZyvg7j4EBpG\ng8iWo0jNpKMJ0Yx1uBkkljEdZLTHa4bK/zy2NKqDNS2yWs9/M5+xw5XE2ecAg7FT\ncXhf3q50V+M6T2IaQ9BxntTyCT8IIF2eRM/t9Y944s9Rfzm/KQVKRYPudX7YhTt9\niqCJB4JoqYhs3HEO0wPkJxY4KBTUCN94s+7jUFdRrYxe+8Ya6tIYWqD38i5qdGhY\nxrVey1LatsDJQ2EgNYobM/LjoCLK1WUssEqf0OU2bi0CAwEAAaNQME4wDAYDVR0T\nBAUwAwEBATAdBgNVHQ4EFgQUOBl8edVm/H5xdS2EGEeLzftZ/DUwHwYDVR0jBBgw\nFoAUjgXdXx9NGPa+UvHBC4//SE+ARpQwDQYJKoZIhvcNAQELBQADggEBAFwZriTu\nDKkiDHFfz3UX4fIxYTHCi4TveYZGPeTbxhBb3XZC5qDF4T5HvCTSkG9+oFfZzI1a\nlPN2yZB7QnmHJoyWa5fuovwUL0iI3iIZMqU56tdVPW8gkJe++U5kHMSpz2VF0eo8\n7XkKWxZovRwczgfDFRP9zM9CylyzQjqxx6kbxJozWnwc5UrVbJMaPIqonXp1nDoZ\ni878+hX4rJUEjgO6Sa9GVZQpmuCrQF0qKsTiUBzZN67hoD3xoTAYi5IXQE2tRD1N\nj3zwng9liCsxurGMnuV0BPWv/IDYRu/syjee1Qv1VFeRto5D4Rldmi2p1f5iWJCk\n5m5YpRsknaICjYs=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert33.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDFzCCAf+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDEwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAmMSQwIgYDVQQDExtUZXN0IGludGVybWVkaWF0ZSBtYXhwYXRoIDIw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCKAaAcY1Y2QRZYWft5pTiQ\nLZaNHdG1wGyhbUyVCd1S/BZQeBxt8iDueHro6LpeXcioAyMePUnQQ8ZzBN+Yt1pG\n83fwqNMyHf8WIWutQvQw2CIbGORO2FaCx9XgL+Le9ENMJb7ZQwV13r7PuHAV/6V1\nOwI/1Cn73cZ2uyWu8BHZbSqMctQsAkaT/pbPEUbrF4KB2GSigM+mux+Vkn9w3VK6\npNg5pUwCP0lqi9K1RNWEXyi4NQumrR+IEiaiV05twZ1oBaWBGXSTw12hIulZ3/v6\nGLiwfk9I5mr7yDWVDdyCsTu1rhfen+Lp4ClyfWHISRPL1mko4W9leczgPWPz4pIp\nAgMBAAGjUDBOMAwGA1UdEwQFMAMBAQEwHQYDVR0OBBYEFMI3a8MtjW1x6dPPJGaV\nLhMF7bGKMB8GA1UdIwQYMBaAFDgZfHnVZvx+cXUthBhHi837Wfw1MA0GCSqGSIb3\nDQEBCwUAA4IBAQCprzpoj6UaEG4eqLg2L3HqsvY73/XE8ytuZ9wDC3HodnmpezUX\n48XwJPHFO7OGPGWZgsU2qX/Zp7yUXkVFSK4VnmnSzUtXNVlU0oWEEOzQLrpphksH\ndcF8YNN/Y65KnhzIU784uHeFefUpPaE6yS5OSZboptZWVF9y1LoU3F7gN0UGvVG9\nhflz5O0/KvmYd+6+Yrje+2lbHiJHNXLmOPiZyk9TBDknygBuU14IOWghQim3yks9\ntKk8D38Vl85V5aG9nO4STjx5J8BtSl0x6wW3t9WwU5UC9geCROhZI1XRBafIoKkn\nVSgHLpLTARtLikbbg/3SxpnW12msHvgLVasf\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert34.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDDDCCAfSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDIwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAeMRwwGgYDVQQDExNUZXN0IGxlYWYgaW52YWxpZCAzMIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkSrgWFD4lYQ0RF/z3mJZjn1lgNBkhnCP\n0hciJv/etoMN3bCB+uc8fo0wxDQ2ZcbzTAQ0qBNnjJvAJ1qslZA9boIBKmT8JSix\nii/1XTDWI3E5aOvX1h6lW66pVsIzLm0NAf0VJn2xLw0Yv8hfKbwjcNeAfm7GCwJB\n8skjekMKJ8+e6pP4ZHxmrnOo0kUlCg8w8RKzZ6sYJxX1ETekWPEUSXrscQ/YSjpO\nzjLDph1lO4gVErBhdJgJpJznqkrRBiR7f/hIrpAV3wOUbtfrxrIb5FXOM9rt/svW\nRRrzIUGnBvo04WZ+KQHPsMn+9x8i+/tueOg1KLfs10hW0RWsTQjmOQIDAQABo00w\nSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBSOBr1U4h5PYyOqGe/gJgwWk7FfezAfBgNV\nHSMEGDAWgBTCN2vDLY1tcenTzyRmlS4TBe2xijANBgkqhkiG9w0BAQsFAAOCAQEA\naBLuwNN5vOh2dLbn8lMNsc/oTFSInzu+ylzC/KLTkjoyMYY+S2ISUuew9pzUo4Gs\nAAE/rqVYednayyA13eNRBnwIw+8kPTESaJMGl6uQQd8DzAalzqxbFhbwFY2T0pdi\nLNFkGjmGdpRNy/VSTy6JEEBMhIKXjMpactmpiV6mwK3bfnFaXZ6o70+JZrNeiSe0\ng8sci6gBVEt27bGvhLalut8WXc7VCkxQhQCSBdv/94EmRxzPye6iAK0L9jaTHlt+\nqR5MWJxZN32muI7nsKnetUMZbIYwvO1LPn8f+0hdYkck8kE7ga1UM98oTgQeIOmj\n3JNCDkNY+Z387ujaaOAVxw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert41.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIC9zCCAd+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgNDAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMBYxFDASBgNV\nBAMTC1Rlc3Qgcm9vdCA0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nmTX2sHY42Ord9gWyB6GcdlLjjE+4zBJ1BoDpMnvJ89niMTuZTq1ViMp/B6RuTH+2\nYF3+riZYQDH9yM/8rgvAUIvK9STaq19Zrm0mnfQUo9yKdkfoJ+XvWuvK6f+NkAMg\nxfhAD6eSupigTvov/w2IT8rS0dxo4KF6hKBL2aYlXhiEyi/NmsEPZWvVh+qk3L/Q\nGSwpgC+DhVoQzFRofUdK9O9MkgR675iftaFDvyi7F0fxrSLfB/Wy4cgRYzIW6pyN\n2sXWivKdLI3bgB01ffdbO17ZAGILK1whO29/bX6hbH09Y/H7jR2vjy+KP9N0PEa3\n7SBymlokB3A8wq/LWPYPeQIDAQABo1AwTjAMBgNVHRMEBTADAQEBMB0GA1UdDgQW\nBBSOBd1fH00Y9r5S8cELj/9IT4BGlDAfBgNVHSMEGDAWgBSOBd1fH00Y9r5S8cEL\nj/9IT4BGlDANBgkqhkiG9w0BAQsFAAOCAQEAWhrHGIMcEG2UJfv920hftxi+Jvj/\nivrhEscqlVA0QNLqZV8v/ai/AiypDLk7uwKtsxF2i+sl81473aSFS9hh3F83/ofm\nx8EU8X1FBQHN1zyAEpZyPXr7MiaTXn4w5sCeZLmpWyxGk+cRiPVRE0QUbXDGfVRp\n3v984oCUMUzbb+zv6QlkHa6m/kZq0qrnNVVp0X4c7/Pb5elJOVlKnIslNgd/eLrz\nzSabToAX9OP6tbJdSRky/LmIYW+CXH/Y4YVwpEu7NisZmDo6lnCBoRQB3QgxoMLp\nmM+RUY+AyHr0ZsSUSb6iicJMRZ3mhxCLvnK/Noe/3hq4pUk4Sit7s7JL7A==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert42.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDCjCCAfKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgNDAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMCYxJDAiBgNV\nBAMTG1Rlc3QgaW50ZXJtZWRpYXRlIG1heHBhdGggMTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBANpGlBMXdo8cO9oqUw/b6PMwiMNV8LCe6wB9VKHPa6OG\nQ0o8Xqktgwnh1rojgpMhbCApE7UXeMr6ZGq/NtqmO1hO5adV5JehWZyvg7j4EBpG\ng8iWo0jNpKMJ0Yx1uBkkljEdZLTHa4bK/zy2NKqDNS2yWs9/M5+xw5XE2ecAg7FT\ncXhf3q50V+M6T2IaQ9BxntTyCT8IIF2eRM/t9Y944s9Rfzm/KQVKRYPudX7YhTt9\niqCJB4JoqYhs3HEO0wPkJxY4KBTUCN94s+7jUFdRrYxe+8Ya6tIYWqD38i5qdGhY\nxrVey1LatsDJQ2EgNYobM/LjoCLK1WUssEqf0OU2bi0CAwEAAaNTMFEwDwYDVR0T\nBAgwBgEBAQIBATAdBgNVHQ4EFgQUOBl8edVm/H5xdS2EGEeLzftZ/DUwHwYDVR0j\nBBgwFoAUjgXdXx9NGPa+UvHBC4//SE+ARpQwDQYJKoZIhvcNAQELBQADggEBAGKh\npBhYSGN0KGWIG4GG4mVoTiw880ehetDuTpl3ymZNqkoUuTaAtU3PJWOctcJva7h6\n4PSgyabi/WQmhntR1GxCUt0GTuhHmyJYsSwakXUgMgF6W6TKcxg6m4vjMkkrf+ZT\n1lO/MiwxhTTluHPGkl/nBG+uxySInuQMDvdyQDXp2e17qxops+G+1UnRJinqLtsd\nLMkCOT4pyh6B5ysnJ8gP1Z2EKWjhKJcIHRMUm7Ap/pf8Zgh5LIqdRtDSuNuTmPLP\nlkgoebOCO3c/mWCciR0xGCcz86G3fYznvGp4XqHnRkg3SpAcHQbQ/nSHA+1LdfFi\nnqZQPnJPVsJctDR935c=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert43.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDFzCCAf+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDEwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAmMSQwIgYDVQQDExtUZXN0IGludGVybWVkaWF0ZSBtYXhwYXRoIDIw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCKAaAcY1Y2QRZYWft5pTiQ\nLZaNHdG1wGyhbUyVCd1S/BZQeBxt8iDueHro6LpeXcioAyMePUnQQ8ZzBN+Yt1pG\n83fwqNMyHf8WIWutQvQw2CIbGORO2FaCx9XgL+Le9ENMJb7ZQwV13r7PuHAV/6V1\nOwI/1Cn73cZ2uyWu8BHZbSqMctQsAkaT/pbPEUbrF4KB2GSigM+mux+Vkn9w3VK6\npNg5pUwCP0lqi9K1RNWEXyi4NQumrR+IEiaiV05twZ1oBaWBGXSTw12hIulZ3/v6\nGLiwfk9I5mr7yDWVDdyCsTu1rhfen+Lp4ClyfWHISRPL1mko4W9leczgPWPz4pIp\nAgMBAAGjUDBOMAwGA1UdEwQFMAMBAQEwHQYDVR0OBBYEFMI3a8MtjW1x6dPPJGaV\nLhMF7bGKMB8GA1UdIwQYMBaAFDgZfHnVZvx+cXUthBhHi837Wfw1MA0GCSqGSIb3\nDQEBCwUAA4IBAQCprzpoj6UaEG4eqLg2L3HqsvY73/XE8ytuZ9wDC3HodnmpezUX\n48XwJPHFO7OGPGWZgsU2qX/Zp7yUXkVFSK4VnmnSzUtXNVlU0oWEEOzQLrpphksH\ndcF8YNN/Y65KnhzIU784uHeFefUpPaE6yS5OSZboptZWVF9y1LoU3F7gN0UGvVG9\nhflz5O0/KvmYd+6+Yrje+2lbHiJHNXLmOPiZyk9TBDknygBuU14IOWghQim3yks9\ntKk8D38Vl85V5aG9nO4STjx5J8BtSl0x6wW3t9WwU5UC9geCROhZI1XRBafIoKkn\nVSgHLpLTARtLikbbg/3SxpnW12msHvgLVasf\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert44.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDFzCCAf+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDIwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAmMSQwIgYDVQQDExtUZXN0IGludGVybWVkaWF0ZSBtYXhwYXRoIDMw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCRKuBYUPiVhDREX/PeYlmO\nfWWA0GSGcI/SFyIm/962gw3dsIH65zx+jTDENDZlxvNMBDSoE2eMm8AnWqyVkD1u\nggEqZPwlKLGKL/VdMNYjcTlo69fWHqVbrqlWwjMubQ0B/RUmfbEvDRi/yF8pvCNw\n14B+bsYLAkHyySN6Qwonz57qk/hkfGauc6jSRSUKDzDxErNnqxgnFfURN6RY8RRJ\neuxxD9hKOk7OMsOmHWU7iBUSsGF0mAmknOeqStEGJHt/+EiukBXfA5Ru1+vGshvk\nVc4z2u3+y9ZFGvMhQacG+jThZn4pAc+wyf73HyL7+2546DUot+zXSFbRFaxNCOY5\nAgMBAAGjUDBOMAwGA1UdEwQFMAMBAQEwHQYDVR0OBBYEFI4GvVTiHk9jI6oZ7+Am\nDBaTsV97MB8GA1UdIwQYMBaAFMI3a8MtjW1x6dPPJGaVLhMF7bGKMA0GCSqGSIb3\nDQEBCwUAA4IBAQCB3dtsoVdschVyCWSI16Se46RZJtLW1bM019KdyZj9DdIZ2VPm\nIp+BQFcVJyzbfmhn5QBbhNDKkwsfldI9Y8IqZ132j442/XIFZIilaPi3cE/WLFUY\nNxu2opuN3+KDwDYO32CUp3frr9OjAtB5amZnkXau+C1EkJlSuWaT+/gIlYwlr4/H\nuADcyqFSmy28P9jmkK8AzZHhKnlRadAn2cDB8MFXD5VxnLJfejkprQVLdxTXRovP\ncE/6c7PUGIK22WcSX8KTfuviKmjdGVhgeKps2nRNKaSIlqYCztyc8IjcZwJCnh6c\nZW8V9bi7WxDK+I9PPgrgLK8W+VTkS0RtjP5a\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert45.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDDDCCAfSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDMwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAeMRwwGgYDVQQDExNUZXN0IGxlYWYgaW52YWxpZCA0MIIBIjANBgkq\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkcNsE/s4nauA5vSG/23znHT5ZjFAQiRa\n83xo83MD2jMrBjgBBzOW0IKedk9lmqcRmoMsWt3PbYeH2Am+EqtOjh9vbHw/wXEw\neXg7DtZaYTjeRNkrwZ0z5Bz/TTvia7YkcfaU83OG4JyL8GmmbtiGNOHZyHqTv2Ky\nj6YqyBJaDE7dwBNBJd5DElEuvr6Tu/Y3K3Z6z8bZUAX/5oII2sq8rg76ZQ+Dfk8i\nupjp4MVPvowh/+ys+WNMW5MA5k1dwYyU1MZ20O/aa9VTMkb4DPyv4pXZgi1dBCMc\nYskPRVoPPsE5xl3DZ3h4qZ039MbcalXFYe65689+Ra1O4/dsXR5raQIDAQABo00w\nSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBTKtXdQZA8cZkS/89eiih4GTJX+fDAfBgNV\nHSMEGDAWgBSOBr1U4h5PYyOqGe/gJgwWk7FfezANBgkqhkiG9w0BAQsFAAOCAQEA\nIWynyo8ezt+So+w29h7z2ZS3/EcrErnSiDDJ0DaE/vcvflrT/tEPeDHTxy61qQuX\nKoseO84foFqLPu1YqgSjRgmbk76gt8aAu0lr6/t0RHWdHKZG3QtK8696pGoMAhVg\nHa3f/YYaEkqSnHwU+/vxEXEkGHM22UHwb7dtH2LfBHtoQtjE6M+Ulv6QdkLj2LFD\nXMKJIyAlibTRMW8YOP4G/DekCq1DstUOcTn7BFqeAjjzYwv3NHpOJHdZrUgyGb7B\nQqDXf2rM3s7LEpwDMvfdraAEWld4/LRLkfau/PfKD5YwGYg3Nb45xyXFSEijVjAr\n23G8HAIcJJu2jUIWGr9OtQ==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert51.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIC9zCCAd+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgNDAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMBYxFDASBgNV\nBAMTC1Rlc3Qgcm9vdCA0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nmTX2sHY42Ord9gWyB6GcdlLjjE+4zBJ1BoDpMnvJ89niMTuZTq1ViMp/B6RuTH+2\nYF3+riZYQDH9yM/8rgvAUIvK9STaq19Zrm0mnfQUo9yKdkfoJ+XvWuvK6f+NkAMg\nxfhAD6eSupigTvov/w2IT8rS0dxo4KF6hKBL2aYlXhiEyi/NmsEPZWvVh+qk3L/Q\nGSwpgC+DhVoQzFRofUdK9O9MkgR675iftaFDvyi7F0fxrSLfB/Wy4cgRYzIW6pyN\n2sXWivKdLI3bgB01ffdbO17ZAGILK1whO29/bX6hbH09Y/H7jR2vjy+KP9N0PEa3\n7SBymlokB3A8wq/LWPYPeQIDAQABo1AwTjAMBgNVHRMEBTADAQEBMB0GA1UdDgQW\nBBSOBd1fH00Y9r5S8cELj/9IT4BGlDAfBgNVHSMEGDAWgBSOBd1fH00Y9r5S8cEL\nj/9IT4BGlDANBgkqhkiG9w0BAQsFAAOCAQEAWhrHGIMcEG2UJfv920hftxi+Jvj/\nivrhEscqlVA0QNLqZV8v/ai/AiypDLk7uwKtsxF2i+sl81473aSFS9hh3F83/ofm\nx8EU8X1FBQHN1zyAEpZyPXr7MiaTXn4w5sCeZLmpWyxGk+cRiPVRE0QUbXDGfVRp\n3v984oCUMUzbb+zv6QlkHa6m/kZq0qrnNVVp0X4c7/Pb5elJOVlKnIslNgd/eLrz\nzSabToAX9OP6tbJdSRky/LmIYW+CXH/Y4YVwpEu7NisZmDo6lnCBoRQB3QgxoMLp\nmM+RUY+AyHr0ZsSUSb6iicJMRZ3mhxCLvnK/Noe/3hq4pUk4Sit7s7JL7A==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert52.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDCjCCAfKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgNDAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMCYxJDAiBgNV\nBAMTG1Rlc3QgaW50ZXJtZWRpYXRlIG1heHBhdGggMTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBANpGlBMXdo8cO9oqUw/b6PMwiMNV8LCe6wB9VKHPa6OG\nQ0o8Xqktgwnh1rojgpMhbCApE7UXeMr6ZGq/NtqmO1hO5adV5JehWZyvg7j4EBpG\ng8iWo0jNpKMJ0Yx1uBkkljEdZLTHa4bK/zy2NKqDNS2yWs9/M5+xw5XE2ecAg7FT\ncXhf3q50V+M6T2IaQ9BxntTyCT8IIF2eRM/t9Y944s9Rfzm/KQVKRYPudX7YhTt9\niqCJB4JoqYhs3HEO0wPkJxY4KBTUCN94s+7jUFdRrYxe+8Ya6tIYWqD38i5qdGhY\nxrVey1LatsDJQ2EgNYobM/LjoCLK1WUssEqf0OU2bi0CAwEAAaNTMFEwDwYDVR0T\nBAgwBgEBAQIBATAdBgNVHQ4EFgQUOBl8edVm/H5xdS2EGEeLzftZ/DUwHwYDVR0j\nBBgwFoAUjgXdXx9NGPa+UvHBC4//SE+ARpQwDQYJKoZIhvcNAQELBQADggEBAGKh\npBhYSGN0KGWIG4GG4mVoTiw880ehetDuTpl3ymZNqkoUuTaAtU3PJWOctcJva7h6\n4PSgyabi/WQmhntR1GxCUt0GTuhHmyJYsSwakXUgMgF6W6TKcxg6m4vjMkkrf+ZT\n1lO/MiwxhTTluHPGkl/nBG+uxySInuQMDvdyQDXp2e17qxops+G+1UnRJinqLtsd\nLMkCOT4pyh6B5ysnJ8gP1Z2EKWjhKJcIHRMUm7Ap/pf8Zgh5LIqdRtDSuNuTmPLP\nlkgoebOCO3c/mWCciR0xGCcz86G3fYznvGp4XqHnRkg3SpAcHQbQ/nSHA+1LdfFi\nnqZQPnJPVsJctDR935c=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert53.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDFzCCAf+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDEwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAmMSQwIgYDVQQDExtUZXN0IGludGVybWVkaWF0ZSBtYXhwYXRoIDIw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCKAaAcY1Y2QRZYWft5pTiQ\nLZaNHdG1wGyhbUyVCd1S/BZQeBxt8iDueHro6LpeXcioAyMePUnQQ8ZzBN+Yt1pG\n83fwqNMyHf8WIWutQvQw2CIbGORO2FaCx9XgL+Le9ENMJb7ZQwV13r7PuHAV/6V1\nOwI/1Cn73cZ2uyWu8BHZbSqMctQsAkaT/pbPEUbrF4KB2GSigM+mux+Vkn9w3VK6\npNg5pUwCP0lqi9K1RNWEXyi4NQumrR+IEiaiV05twZ1oBaWBGXSTw12hIulZ3/v6\nGLiwfk9I5mr7yDWVDdyCsTu1rhfen+Lp4ClyfWHISRPL1mko4W9leczgPWPz4pIp\nAgMBAAGjUDBOMAwGA1UdEwQFMAMBAQEwHQYDVR0OBBYEFMI3a8MtjW1x6dPPJGaV\nLhMF7bGKMB8GA1UdIwQYMBaAFDgZfHnVZvx+cXUthBhHi837Wfw1MA0GCSqGSIb3\nDQEBCwUAA4IBAQCprzpoj6UaEG4eqLg2L3HqsvY73/XE8ytuZ9wDC3HodnmpezUX\n48XwJPHFO7OGPGWZgsU2qX/Zp7yUXkVFSK4VnmnSzUtXNVlU0oWEEOzQLrpphksH\ndcF8YNN/Y65KnhzIU784uHeFefUpPaE6yS5OSZboptZWVF9y1LoU3F7gN0UGvVG9\nhflz5O0/KvmYd+6+Yrje+2lbHiJHNXLmOPiZyk9TBDknygBuU14IOWghQim3yks9\ntKk8D38Vl85V5aG9nO4STjx5J8BtSl0x6wW3t9WwU5UC9geCROhZI1XRBafIoKkn\nVSgHLpLTARtLikbbg/3SxpnW12msHvgLVasf\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert54.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDCjCCAfKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDIwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAcMRowGAYDVQQDExFUZXN0IExlYWYgNCB2YWxpZDCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAJEq4FhQ+JWENERf895iWY59ZYDQZIZwj9IX\nIib/3raDDd2wgfrnPH6NMMQ0NmXG80wENKgTZ4ybwCdarJWQPW6CASpk/CUosYov\n9V0w1iNxOWjr19YepVuuqVbCMy5tDQH9FSZ9sS8NGL/IXym8I3DXgH5uxgsCQfLJ\nI3pDCifPnuqT+GR8Zq5zqNJFJQoPMPESs2erGCcV9RE3pFjxFEl67HEP2Eo6Ts4y\nw6YdZTuIFRKwYXSYCaSc56pK0QYke3/4SK6QFd8DlG7X68ayG+RVzjPa7f7L1kUa\n8yFBpwb6NOFmfikBz7DJ/vcfIvv7bnjoNSi37NdIVtEVrE0I5jkCAwEAAaNNMEsw\nCQYDVR0TBAIwADAdBgNVHQ4EFgQUjga9VOIeT2Mjqhnv4CYMFpOxX3swHwYDVR0j\nBBgwFoAUwjdrwy2NbXHp088kZpUuEwXtsYowDQYJKoZIhvcNAQELBQADggEBADdp\nVpPr4AzE7ecrhclQKGjPa7leaorYuevjTLWsieY17mVQhlMX1itTNXlPBUfPAsOd\nO7LUgY0yZOnV7l8TbfGal8pIF+acgFLgqM5A6z8ngChMi6iKEZChDVffAVHJs3e/\nWUm7VeFY8Mvwnay3iHj2trC7XQX2SZCovXYfNP3bVyqIaDNqt6SPY1skouWpmmUn\nISzcyH6EU/CegFjHJyXxrsIW9Nv2mDejrmcR0EJOmEAfWUgonfemeX93xkwZHW2s\nlZ8/e6rTPPSGdhY/b4VRu6o1FpLcPLGZSgPwYBNVYtgT4WsoT0xUvm6Y1WipiZda\nB/bpiL8l4GSVtTw1Jko=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert61.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIC+jCCAeKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgMjAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMBYxFDASBgNV\nBAMTC1Rlc3Qgcm9vdCAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nmTX2sHY42Ord9gWyB6GcdlLjjE+4zBJ1BoDpMnvJ89niMTuZTq1ViMp/B6RuTH+2\nYF3+riZYQDH9yM/8rgvAUIvK9STaq19Zrm0mnfQUo9yKdkfoJ+XvWuvK6f+NkAMg\nxfhAD6eSupigTvov/w2IT8rS0dxo4KF6hKBL2aYlXhiEyi/NmsEPZWvVh+qk3L/Q\nGSwpgC+DhVoQzFRofUdK9O9MkgR675iftaFDvyi7F0fxrSLfB/Wy4cgRYzIW6pyN\n2sXWivKdLI3bgB01ffdbO17ZAGILK1whO29/bX6hbH09Y/H7jR2vjy+KP9N0PEa3\n7SBymlokB3A8wq/LWPYPeQIDAQABo1MwUTAPBgNVHRMECDAGAQEBAgEBMB0GA1Ud\nDgQWBBSOBd1fH00Y9r5S8cELj/9IT4BGlDAfBgNVHSMEGDAWgBSOBd1fH00Y9r5S\n8cELj/9IT4BGlDANBgkqhkiG9w0BAQsFAAOCAQEAB9nLaqxsBW0isDaBGNJyzH9O\nWqYY0hex9tm3UqygfE9b9aahykpkowQIzh4D9Xpbd0hZGVlK/sw2qsKj6gDOiMtL\nuWs4gaFNWIQqhVsTzL88c7XaW55n+TRQdVZyy38DZVWphte1Mumc9WB8N15rZTDh\niXjwGl0mrV1egq4hJZLpy14f6ihqU7KGfmc9onxvgvWxYLi+5v8874c4ophSKsI2\nqVE8iZ6uq2oQ66Pd5S50cYk6MEW5lifAhLM5WFZmW7dRKmykBGZ9rFrJrIvhkmh9\nHe7q6TEQP1Wcoc147nIg0BTkHGtdrEv3jIX6UKKUEwUUk9ARB1mSodZQHBhuww==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert62.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDBzCCAe+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgMjAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMCYxJDAiBgNV\nBAMTG1Rlc3QgaW50ZXJtZWRpYXRlIG1heHBhdGggMTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBANpGlBMXdo8cO9oqUw/b6PMwiMNV8LCe6wB9VKHPa6OG\nQ0o8Xqktgwnh1rojgpMhbCApE7UXeMr6ZGq/NtqmO1hO5adV5JehWZyvg7j4EBpG\ng8iWo0jNpKMJ0Yx1uBkkljEdZLTHa4bK/zy2NKqDNS2yWs9/M5+xw5XE2ecAg7FT\ncXhf3q50V+M6T2IaQ9BxntTyCT8IIF2eRM/t9Y944s9Rfzm/KQVKRYPudX7YhTt9\niqCJB4JoqYhs3HEO0wPkJxY4KBTUCN94s+7jUFdRrYxe+8Ya6tIYWqD38i5qdGhY\nxrVey1LatsDJQ2EgNYobM/LjoCLK1WUssEqf0OU2bi0CAwEAAaNQME4wDAYDVR0T\nBAUwAwEBATAdBgNVHQ4EFgQUOBl8edVm/H5xdS2EGEeLzftZ/DUwHwYDVR0jBBgw\nFoAUjgXdXx9NGPa+UvHBC4//SE+ARpQwDQYJKoZIhvcNAQELBQADggEBAFwZriTu\nDKkiDHFfz3UX4fIxYTHCi4TveYZGPeTbxhBb3XZC5qDF4T5HvCTSkG9+oFfZzI1a\nlPN2yZB7QnmHJoyWa5fuovwUL0iI3iIZMqU56tdVPW8gkJe++U5kHMSpz2VF0eo8\n7XkKWxZovRwczgfDFRP9zM9CylyzQjqxx6kbxJozWnwc5UrVbJMaPIqonXp1nDoZ\ni878+hX4rJUEjgO6Sa9GVZQpmuCrQF0qKsTiUBzZN67hoD3xoTAYi5IXQE2tRD1N\nj3zwng9liCsxurGMnuV0BPWv/IDYRu/syjee1Qv1VFeRto5D4Rldmi2p1f5iWJCk\n5m5YpRsknaICjYs=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert63.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDCjCCAfKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDEwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAcMRowGAYDVQQDExFUZXN0IExlYWYgdmFsaWQgMjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAIoBoBxjVjZBFlhZ+3mlOJAtlo0d0bXAbKFt\nTJUJ3VL8FlB4HG3yIO54eujoul5dyKgDIx49SdBDxnME35i3Wkbzd/Co0zId/xYh\na61C9DDYIhsY5E7YVoLH1eAv4t70Q0wlvtlDBXXevs+4cBX/pXU7Aj/UKfvdxna7\nJa7wEdltKoxy1CwCRpP+ls8RRusXgoHYZKKAz6a7H5WSf3DdUrqk2DmlTAI/SWqL\n0rVE1YRfKLg1C6atH4gSJqJXTm3BnWgFpYEZdJPDXaEi6Vnf+/oYuLB+T0jmavvI\nNZUN3IKxO7WuF96f4ungKXJ9YchJE8vWaSjhb2V5zOA9Y/PikikCAwEAAaNNMEsw\nCQYDVR0TBAIwADAdBgNVHQ4EFgQUwjdrwy2NbXHp088kZpUuEwXtsYowHwYDVR0j\nBBgwFoAUOBl8edVm/H5xdS2EGEeLzftZ/DUwDQYJKoZIhvcNAQELBQADggEBABrt\n2fKOUwAb5EFD/ebXMM4Qzg6sFYpq/mcnPlmGmqwNzmumlgYUBS15liTnA4nBgR09\nb2sejlwnzcnrsFB18YCmE/TIPuh3XMJXmUxjcnCy3qPuSwpuwG3brUGQPiIZhRZz\n1+iSc7uba/JGaTqLBItaRPlB6dD3jqY3UowFaWvnYiVmCXg147EBC5Mn2EDiukg0\nxsqM03yfpUkp4/W9+WpJuGNyhicSJbNxlh3zEjrgWeMvhnFmrTr7ss6P2ZoKGS3/\nQrZBLUzkk25hCF3dTNfTDVSQUt0rONJvx3ym+Kp+zQWc/oHsDs0STs5Db2J0dGp8\nVEyxyevfwivF4EQ70Jw=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert71.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIC+jCCAeKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgMjAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMBYxFDASBgNV\nBAMTC1Rlc3Qgcm9vdCAyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\nmTX2sHY42Ord9gWyB6GcdlLjjE+4zBJ1BoDpMnvJ89niMTuZTq1ViMp/B6RuTH+2\nYF3+riZYQDH9yM/8rgvAUIvK9STaq19Zrm0mnfQUo9yKdkfoJ+XvWuvK6f+NkAMg\nxfhAD6eSupigTvov/w2IT8rS0dxo4KF6hKBL2aYlXhiEyi/NmsEPZWvVh+qk3L/Q\nGSwpgC+DhVoQzFRofUdK9O9MkgR675iftaFDvyi7F0fxrSLfB/Wy4cgRYzIW6pyN\n2sXWivKdLI3bgB01ffdbO17ZAGILK1whO29/bX6hbH09Y/H7jR2vjy+KP9N0PEa3\n7SBymlokB3A8wq/LWPYPeQIDAQABo1MwUTAPBgNVHRMECDAGAQEBAgEBMB0GA1Ud\nDgQWBBSOBd1fH00Y9r5S8cELj/9IT4BGlDAfBgNVHSMEGDAWgBSOBd1fH00Y9r5S\n8cELj/9IT4BGlDANBgkqhkiG9w0BAQsFAAOCAQEAB9nLaqxsBW0isDaBGNJyzH9O\nWqYY0hex9tm3UqygfE9b9aahykpkowQIzh4D9Xpbd0hZGVlK/sw2qsKj6gDOiMtL\nuWs4gaFNWIQqhVsTzL88c7XaW55n+TRQdVZyy38DZVWphte1Mumc9WB8N15rZTDh\niXjwGl0mrV1egq4hJZLpy14f6ihqU7KGfmc9onxvgvWxYLi+5v8874c4ophSKsI2\nqVE8iZ6uq2oQ66Pd5S50cYk6MEW5lifAhLM5WFZmW7dRKmykBGZ9rFrJrIvhkmh9\nHe7q6TEQP1Wcoc147nIg0BTkHGtdrEv3jIX6UKKUEwUUk9ARB1mSodZQHBhuww==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert72.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDBzCCAe+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDEwtUZXN0\nIHJvb3QgMjAeFw0wMTAxMDEwMDAwMDBaFw0zMDEyMzEyMzU5NTlaMCYxJDAiBgNV\nBAMTG1Rlc3QgaW50ZXJtZWRpYXRlIG1heHBhdGggMTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBANpGlBMXdo8cO9oqUw/b6PMwiMNV8LCe6wB9VKHPa6OG\nQ0o8Xqktgwnh1rojgpMhbCApE7UXeMr6ZGq/NtqmO1hO5adV5JehWZyvg7j4EBpG\ng8iWo0jNpKMJ0Yx1uBkkljEdZLTHa4bK/zy2NKqDNS2yWs9/M5+xw5XE2ecAg7FT\ncXhf3q50V+M6T2IaQ9BxntTyCT8IIF2eRM/t9Y944s9Rfzm/KQVKRYPudX7YhTt9\niqCJB4JoqYhs3HEO0wPkJxY4KBTUCN94s+7jUFdRrYxe+8Ya6tIYWqD38i5qdGhY\nxrVey1LatsDJQ2EgNYobM/LjoCLK1WUssEqf0OU2bi0CAwEAAaNQME4wDAYDVR0T\nBAUwAwEBATAdBgNVHQ4EFgQUOBl8edVm/H5xdS2EGEeLzftZ/DUwHwYDVR0jBBgw\nFoAUjgXdXx9NGPa+UvHBC4//SE+ARpQwDQYJKoZIhvcNAQELBQADggEBAFwZriTu\nDKkiDHFfz3UX4fIxYTHCi4TveYZGPeTbxhBb3XZC5qDF4T5HvCTSkG9+oFfZzI1a\nlPN2yZB7QnmHJoyWa5fuovwUL0iI3iIZMqU56tdVPW8gkJe++U5kHMSpz2VF0eo8\n7XkKWxZovRwczgfDFRP9zM9CylyzQjqxx6kbxJozWnwc5UrVbJMaPIqonXp1nDoZ\ni878+hX4rJUEjgO6Sa9GVZQpmuCrQF0qKsTiUBzZN67hoD3xoTAYi5IXQE2tRD1N\nj3zwng9liCsxurGMnuV0BPWv/IDYRu/syjee1Qv1VFeRto5D4Rldmi2p1f5iWJCk\n5m5YpRsknaICjYs=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert73.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDFzCCAf+gAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDEwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAmMSQwIgYDVQQDExtUZXN0IGludGVybWVkaWF0ZSBtYXhwYXRoIDEw\nggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaRpQTF3aPHDvaKlMP2+jz\nMIjDVfCwnusAfVShz2ujhkNKPF6pLYMJ4da6I4KTIWwgKRO1F3jK+mRqvzbapjtY\nTuWnVeSXoVmcr4O4+BAaRoPIlqNIzaSjCdGMdbgZJJYxHWS0x2uGyv88tjSqgzUt\nslrPfzOfscOVxNnnAIOxU3F4X96udFfjOk9iGkPQcZ7U8gk/CCBdnkTP7fWPeOLP\nUX85vykFSkWD7nV+2IU7fYqgiQeCaKmIbNxxDtMD5CcWOCgU1AjfeLPu41BXUa2M\nXvvGGurSGFqg9/IuanRoWMa1XstS2rbAyUNhIDWKGzPy46AiytVlLLBKn9DlNm4t\nAgMBAAGjUDBOMAwGA1UdEwQFMAMBAQEwHQYDVR0OBBYEFDgZfHnVZvx+cXUthBhH\ni837Wfw1MB8GA1UdIwQYMBaAFDgZfHnVZvx+cXUthBhHi837Wfw1MA0GCSqGSIb3\nDQEBCwUAA4IBAQDPQC9vYJegBgVZHu0StoRT7L6ShWcZc5Z/TeyrqJBdoiguSRq5\nkMiFXZpksxeFlIUYry21MigYqxOXGZ2GZYNqhLpYVh7hzAY8uYvf4U70q88zj7mw\ngIcgEaMd71GHqbb2O5x3fCN7vLeU5DFYBWfqLlkL57Uqr2aRDHlucryyRNordicN\nWbCxPozmqtbNMABEUbjLMCCuzJeNRSZbS0OOod6Xd3N00EK7PqaRhbihbq3L6gUG\nMjUI2keSxW4vXcDfI5Hqem6SHpCc3retx2VUgwIDAoTrw7E4dwmyC4Tp7TDJL/+d\nGU8qhRmoQer7mLUzpb3s8mq/4rZx+alTQ3gu\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert74.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIDCjCCAfKgAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDExtUZXN0\nIGludGVybWVkaWF0ZSBtYXhwYXRoIDEwHhcNMDEwMTAxMDAwMDAwWhcNMzAxMjMx\nMjM1OTU5WjAcMRowGAYDVQQDExFUZXN0IExlYWYgdmFsaWQgMzCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAIoBoBxjVjZBFlhZ+3mlOJAtlo0d0bXAbKFt\nTJUJ3VL8FlB4HG3yIO54eujoul5dyKgDIx49SdBDxnME35i3Wkbzd/Co0zId/xYh\na61C9DDYIhsY5E7YVoLH1eAv4t70Q0wlvtlDBXXevs+4cBX/pXU7Aj/UKfvdxna7\nJa7wEdltKoxy1CwCRpP+ls8RRusXgoHYZKKAz6a7H5WSf3DdUrqk2DmlTAI/SWqL\n0rVE1YRfKLg1C6atH4gSJqJXTm3BnWgFpYEZdJPDXaEi6Vnf+/oYuLB+T0jmavvI\nNZUN3IKxO7WuF96f4ungKXJ9YchJE8vWaSjhb2V5zOA9Y/PikikCAwEAAaNNMEsw\nCQYDVR0TBAIwADAdBgNVHQ4EFgQUwjdrwy2NbXHp088kZpUuEwXtsYowHwYDVR0j\nBBgwFoAUOBl8edVm/H5xdS2EGEeLzftZ/DUwDQYJKoZIhvcNAQELBQADggEBAK9R\nJ7H8epG2NagZ3Gpl6R1jSiIixWlPJci2Bz1Nr8NIER64TJCKHeh9ku6tzSdrVL3B\n2rj5GmpubDXEWAKfMtt0ccF2UIva9rDMNzaAnCSevWHXf9Httr84X6RmhtXb9/Rm\nfp3W+L0GlDfHfHn8uoVdQe5e6xkmGxtcHDUsyO/CJMkrwUyoB8zs7UtlNtOf45H4\nPPg09lzV7RQ9vFIH48F/4gZW+w3AqN9ZwvYkGcJUY8tyHpb9hDrR4F6loVInrlCE\n0pQiQXNCdee1za9QsScSjYNxGfR2Dkzote41H098jvLalLTTg5Fqx/AylnX285FI\nETGOumNQ51IJLUpq+hc=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert81.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBpTCCAUmgAwIBAgIBUTAMBggqhkjOPQQDAgUAMDExDzANBgNVBAMTBlJvb3Qg\nODERMA8GA1UEChMIbWJlZCBUTFMxCzAJBgNVBAYTAlVLMB4XDTAxMDEwMTAwMDAw\nMFoXDTMwMTIzMTIzNTk1OVowMTEPMA0GA1UEAxMGUm9vdCA4MREwDwYDVQQKEwht\nYmVkIFRMUzELMAkGA1UEBhMCVUswWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAT1\nGuTQ9vgf2l3oLM25r78cvIAQqE02GzQGjp/WWw3CysEwTwNEuZGhRiD5lDmkbUGW\nUNxv/7uJjy7k3K3fDNdko1AwTjAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBTHFA2h\nAu0tPnzeYnLcmlTQj4FAajAfBgNVHSMEGDAWgBTHFA2hAu0tPnzeYnLcmlTQj4FA\najAMBggqhkjOPQQDAgUAA0gAMEUCIH7Z/HNb/Pwbs40iNll1a9gmgAbYOgdlVPWo\nnSdcb7cZAiEAlhVb6CdBXsjOfAWWEET/QP74z608PKFccCIFPCDLkxo=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert82.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBqDCCAUygAwIBAgIBUjAMBggqhkjOPQQDAgUAMDExDzANBgNVBAMTBlJvb3Qg\nODERMA8GA1UEChMIbWJlZCBUTFMxCzAJBgNVBAYTAlVLMB4XDTAxMDEwMTAwMDAw\nMFoXDTMwMTIzMTIzNTk1OVowMTEPMA0GA1UEAxMGSW50IDgyMREwDwYDVQQKEwht\nYmVkIFRMUzELMAkGA1UEBhMCVUswWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS2\ngiYQt4HVfQ2t8eTS0bvISwp7ol2x17umbllBxwzGDFEUQ00JL1/SStezecK0lNhE\n0AvY8Ez2soQEtdSeQGkCo1MwUTAPBgNVHRMECDAGAQH/AgEAMB0GA1UdDgQWBBS3\n+nsv3nQknSg4aDjlTiRpCPo7XzAfBgNVHSMEGDAWgBTHFA2hAu0tPnzeYnLcmlTQ\nj4FAajAMBggqhkjOPQQDAgUAA0gAMEUCIQDus2Lvx3yyvaViY1s334uMm6ge484X\noktMyxLVjkAMiAIgehTHiJJaT9PnlVa+hUpxsIfVAuMexrm5fw/bDF5Nxzw=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert83.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBoDCCAUWgAwIBAgIBUzAMBggqhkjOPQQDAgUAMDExDzANBgNVBAMTBkludCA4\nMjERMA8GA1UEChMIbWJlZCBUTFMxCzAJBgNVBAYTAlVLMB4XDTAxMDEwMTAwMDAw\nMFoXDTMwMTIzMTIzNTk1OVowMDEOMAwGA1UEAxMFRUUgODMxETAPBgNVBAoTCG1i\nZWQgVExTMQswCQYDVQQGEwJVSzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABMSy\n6X5iBYrdxxOMfdcA23pLBoJCeyEjiWfALxTm80MJGBdRNVdnT50xNU3SDDwHWPda\n/EQqHq+itsqkUeyAGAyjTTBLMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGsFH/KsvM4n\nr+i1gI2iCVXi3KtFMB8GA1UdIwQYMBaAFLf6ey/edCSdKDhoOOVOJGkI+jtfMAwG\nCCqGSM49BAMCBQADRwAwRAIgQURH8DHWFHVK38+znWc85G1P+g4ocdkA5Gt0LbOg\nSJMCIBsacOLFywxZYF8atizw6zMRw+QeHR2514JIhJUck2kd\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert91.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBqTCCAUygAwIBAgIBWzAMBggqhkjOPQQDAgUAMDExDzANBgNVBAMTBlJvb3Qg\nOTERMA8GA1UEChMIbWJlZCBUTFMxCzAJBgNVBAYTAlVLMB4XDTAxMDEwMTAwMDAw\nMFoXDTMwMTIzMTIzNTk1OVowMTEPMA0GA1UEAxMGUm9vdCA5MREwDwYDVQQKEwht\nYmVkIFRMUzELMAkGA1UEBhMCVUswWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATh\nD2SmdS6D7cYi2vGMyuCdol/OOUN2di2pS2wfSI/MsY/Z4O9iNHqbXQP6l+hcT5ap\ndaycs7r6ZPNqmWM7b16go1MwUTAPBgNVHRMECDAGAQH/AgEAMB0GA1UdDgQWBBRb\nzVrcAxddj0i0DEqvTGT8F37bizAfBgNVHSMEGDAWgBRbzVrcAxddj0i0DEqvTGT8\nF37bizAMBggqhkjOPQQDAgUAA0kAMEYCIQDbrSV4ndH0vAR3HqJfBn8NT8zdvMjB\nqSJes6Qwa42b2wIhAKyoH0H+b1Svw8pMkvUYF4ElH5Cnn7gxb7Wl3arc0+hQ\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/dir4/cert92.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBoTCCAUWgAwIBAgIBXDAMBggqhkjOPQQDAgUAMDExDzANBgNVBAMTBlJvb3Qg\nOTERMA8GA1UEChMIbWJlZCBUTFMxCzAJBgNVBAYTAlVLMB4XDTAxMDEwMTAwMDAw\nMFoXDTMwMTIzMTIzNTk1OVowMDEOMAwGA1UEAxMFRUUgOTIxETAPBgNVBAoTCG1i\nZWQgVExTMQswCQYDVQQGEwJVSzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABC9E\ntK1pE8Ei8vgScunyjx50C+qDsQS8D2RhGHC4VkE2yyiFxJA/ynhoeXTKZsHuEWI9\nCfOSvk0RrTWf9nr0pTGjTTBLMAkGA1UdEwQCMAAwHQYDVR0OBBYEFLqsN52tAf1k\nXlzxQmdD5qG6Sy6PMB8GA1UdIwQYMBaAFFvNWtwDF12PSLQMSq9MZPwXftuLMAwG\nCCqGSM49BAMCBQADSAAwRQIgXlfKqhkhXgK112Eycl+Z5NHM+6aqXE7i9j7IyGfk\nikICIQDBYNGbpSx82XG+IS/h4AWNTa4Hs6rmWvQDWJum7NrzMQ==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_224_prv.pem",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMGgCAQEEHGhJ+X0QZvaZd1ljfH44mUZM7j7HrJcGU6C+B0KgBwYFK4EEACGhPAM6\nAAQWk6KQ9/C1cf4rQdXYSwEydjH0qGD5lfozLAl/VBkrsQ8AET8q/7E8GiTORJFF\ncalUQK4BSgDL9w==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_224_pub.pem",
    "content": "-----BEGIN PUBLIC KEY-----\nME4wEAYHKoZIzj0CAQYFK4EEACEDOgAEFpOikPfwtXH+K0HV2EsBMnYx9Khg+ZX6\nMywJf1QZK7EPABE/Kv+xPBokzkSRRXGpVECuAUoAy/c=\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_256_prv.pem",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIEnJqMGMS4hWOMQxzx3xyZQTFgm1gNT9Q6DKsX2y8T7uoAoGCCqGSM49\nAwEHoUQDQgAEd3Jlb4FLOZJ51eHxeB+sbwmaPFyhsONTUYNLCLZeC1clkM2vj3aT\nYbzzSs/BHl4HToQmvd4Evm5lOUVElhfeRQ==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_256_pub.pem",
    "content": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEd3Jlb4FLOZJ51eHxeB+sbwmaPFyh\nsONTUYNLCLZeC1clkM2vj3aTYbzzSs/BHl4HToQmvd4Evm5lOUVElhfeRQ==\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_384_prv.pem",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMIGkAgEBBDA/XY2b4oC1aWzFzJ+Uz4r35rYd1lkrKrKzpMYHRQQX7DJ9zcrtfBAF\nPXGaBXTwp2qgBwYFK4EEACKhZANiAATZxmK1C6KcpHmQRQ4EOur08MabFWdtES9i\nKnHJMFmvmZaRxWgNK0TREVedsS9KQTou1cRfz7Z7W2PgC5Hr5Z0JprGsLAxCgqoS\nMX7VkU+Zm8SIuxMug0LMNvLKXjN5x0c=\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_384_pub.pem",
    "content": "-----BEGIN PUBLIC KEY-----\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE2cZitQuinKR5kEUOBDrq9PDGmxVnbREv\nYipxyTBZr5mWkcVoDStE0RFXnbEvSkE6LtXEX8+2e1tj4AuR6+WdCaaxrCwMQoKq\nEjF+1ZFPmZvEiLsTLoNCzDbyyl4zecdH\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_521_pub.pem",
    "content": "-----BEGIN PUBLIC KEY-----\nMIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQAHeFC1U9p6wOO5LevnTygdzb9nPcZ\n6zVNaYee5/PBNvsPv58I+Gvl+hKOwaBR0+bGQ+ha2o/6zzZjwmC9LIRLb1YAzujk\nip5l0Jyt2J8jXe4F87imRr5xXx9n1bQ04P8jofwH73dAGT5A7v9vO839dlqpFVAz\nUk/k8gX1RE4pLEwvasE=\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_bp256_prv.pem",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHgCAQEEICFh1vLbdlJvpiwW81aoDwHzL3dnhLNqqZeZqLdmIID/oAsGCSskAwMC\nCAEBB6FEA0IABHaMjK5KvKYwbbDtgbDEpiFcN4Bm7G1hbBRuE/HH34CblqtpEcJ9\nigIznwkmhA5VI209HvviZp0JDkxMZg+tqR0=\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_bp256_pub.pem",
    "content": "-----BEGIN PUBLIC KEY-----\nMFowFAYHKoZIzj0CAQYJKyQDAwIIAQEHA0IABHaMjK5KvKYwbbDtgbDEpiFcN4Bm\n7G1hbBRuE/HH34CblqtpEcJ9igIznwkmhA5VI209HvviZp0JDkxMZg+tqR0=\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_bp384_prv.pem",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMIGoAgEBBDA92S51DZDX05/BiFzYrRLqlEHyK5M0tNllICrbFEjOJMWAioXdmvwi\nmvCjEk91W8ugCwYJKyQDAwIIAQELoWQDYgAEcZ+dCTpifg01A4XGYc6/AMYZI1Zv\n6QBqMQevHYcbxrtomF/XIuoyvjFvjng7fNGVd4X2bPwMsZXdXJmo56uqhIVTpYTf\n0rSOdtRF/gDdi+WQlth31GltI7S8jbFHJOZq\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_bp384_pub.pem",
    "content": "-----BEGIN PUBLIC KEY-----\nMHowFAYHKoZIzj0CAQYJKyQDAwIIAQELA2IABHGfnQk6Yn4NNQOFxmHOvwDGGSNW\nb+kAajEHrx2HG8a7aJhf1yLqMr4xb454O3zRlXeF9mz8DLGV3VyZqOerqoSFU6WE\n39K0jnbURf4A3YvlkJbYd9RpbSO0vI2xRyTmag==\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_bp512_prv.pem",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMIHaAgEBBEA3LJd49p9ybLyj9KJo8WtNYX0QKA15pqApzVGHn+EBKTTf5TlUVTN9\n9pBtx9bS7qTbsgZcAij3Oz7XFkgOfXHSoAsGCSskAwMCCAEBDaGBhQOBggAEOLfs\nkrYcXGx/vCik7HWdSPzU4uN03v1cSWilTb73UQ5ReIb7/DjqOapSk1nXCnFWw108\nusfOd2vbJR3WS85xI0Qk7nBJ7tBy8NvE15mW4XXVV+JjdjrpcJXAgec+fbLjitw9\nTJoEh7Ht6HbcH8phyQLpodhyK4YSko8YokhFWRo=\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_bp512_pub.pem",
    "content": "-----BEGIN PUBLIC KEY-----\nMIGbMBQGByqGSM49AgEGCSskAwMCCAEBDQOBggAEOLfskrYcXGx/vCik7HWdSPzU\n4uN03v1cSWilTb73UQ5ReIb7/DjqOapSk1nXCnFWw108usfOd2vbJR3WS85xI0Qk\n7nBJ7tBy8NvE15mW4XXVV+JjdjrpcJXAgec+fbLjitw9TJoEh7Ht6HbcH8phyQLp\nodhyK4YSko8YokhFWRo=\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_prv.pk8.pem",
    "content": "-----BEGIN PRIVATE KEY-----\nMG8CAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQEEVTBTAgEBBBgzjoaogeI49Um9bwVT\nSUtz49YRMP3GyW2hNAMyAARRdbzfMKNw851Tk+YScojYAWe19LS3dsZ098bzVLfS\nJAYsH2hUtaevD+V46vJY8Cc=\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_prv.pk8.pw.pem",
    "content": "-----BEGIN ENCRYPTED PRIVATE KEY-----\nMIGRMBwGCiqGSIb3DQEMAQEwDgQIIrlmCCSpJzcCAggABHGm2LyJ60ojfilRRp8h\nXf+sWL3lJq6wlj4Nk41SHVnZ2RiVtP5NVK908/WxnXkridd6Qpjnq/14woWVmQxT\nIzhKFVi22YmQyBsNj+bEGDAE4c9qaby8u6zbzs7Qj29F90f/PiYsaIEGcNn/W88e\nXarNDw==\n-----END ENCRYPTED PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_prv.sec1.pem",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMF8CAQEEGDOOhqiB4jj1Sb1vBVNJS3Pj1hEw/cbJbaAKBggqhkjOPQMBAaE0AzIA\nBFF1vN8wo3DznVOT5hJyiNgBZ7X0tLd2xnT3xvNUt9IkBiwfaFS1p68P5Xjq8ljw\nJw==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_prv.sec1.pw.pem",
    "content": "-----BEGIN EC PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: DES-CBC,AA94892A169FA426\n\ngSkFuUENNke5MvkWHc11/w1NQWBxaIxGT+d5oRcqs44D3tltVOwtdnYexoD9uSIL\nwMFFRLL6I5ii1Naa38nPOMaa7kLU2J3jY8SeIH1rQ43X6tlpv9WFGqDn/m6X7oKo\nRMMfGdicPZg=\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/ec_pub.pem",
    "content": "-----BEGIN PUBLIC KEY-----\nMEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEvHl9s65/COw9SWtPtBGz9iClWKUB\n4CItCM/g3Irsixp78kvpKVHMW6G+uyR0kJrg\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/enco-ca-prstr.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIICDTCCAXagAwIBAgIETZt8lzANBgkqhkiG9w0BAQUFADBCMUAwPgYDVQQDEzdP\ncGVuVlBOIFdlYiBDQSAyMDExLjA0LjA1IDIwOjMzOjI3IFVUQyBhc2RlbW8ueW9u\nYW4ubmV0MB4XDTExMDMyOTIwMzMyN1oXDTIxMDQwMjIwMzMyN1owQjFAMD4GA1UE\nAxM3T3BlblZQTiBXZWIgQ0EgMjAxMS4wNC4wNSAyMDozMzoyNyBVVEMgYXNkZW1v\nLnlvbmFuLm5ldDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA38U3wA/eTGN/\n/AJHo2OsEHjLdO9k3Mo5QcShvg+6IoAThD7HEyOYm4Ild8s4+eEy2i9ecWvMKG6M\nYSO+GwG9xOd9wDFtODpF+z6rIt8a4bLbQHcsp9Ccu+ZmjxkJkmxOCz774lxETArX\nSaksAB5P6Web/LwKUv/Iy9crRM9HzSECAwEAAaMQMA4wDAYDVR0TBAUwAwEB/zAN\nBgkqhkiG9w0BAQUFAAOBgQARCDFYCb9n151hgwitxzbuacIVDqIH8EouV2VBqlNR\ntj8q1maliDE3pW7WRAwMi5i3+5c0auKwhTGESsBPjasd5QnjqXOkRbcZhkeVQ1ln\n6NEn6xC+M+H2LGVHSSropcGa8olLlo98LrsFuHVHMewTs7SK2lc+7rU/ILec3ymj\nog==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/enco-cert-utf8str.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIB8jCCAVugAwIBAgIETZt8+zANBgkqhkiG9w0BAQUFADBCMUAwPgYDVQQDDDdP\ncGVuVlBOIFdlYiBDQSAyMDExLjA0LjA1IDIwOjMzOjI3IFVUQyBhc2RlbW8ueW9u\nYW4ubmV0MB4XDTE0MDcyOTAzNTMzM1oXDTI0MDgwMjAzNTMzM1owFzEVMBMGA1UE\nAwwMZHcueW9uYW4ubmV0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHYW8q\nZZ/HIIlU8j/YIyTh3h59JcJF0Es7RsPg25QVJkDkfhMn6l15f2neB2KPLKxCLpLD\nozYD4s/If8aq74A1C2vvOLo/Gq1erNS4b9IS5xLs3Lu643XGxS93Rf6jrsGa8lfb\nWa7DsQrp7FLT5GApwCp6CebmZq7jEImj0pDFRwIDAQABoyAwHjAJBgNVHRMEAjAA\nMBEGCWCGSAGG+EIBAQQEAwIGQDANBgkqhkiG9w0BAQUFAAOBgQAS1Ulo7iBABpm/\nS23mCnIFRY1+eFfYg4h8EiK9f8kWDwduXSYGVUqRHqh4LcNSdTOIaSEG4RGyV/EA\n5RfTviaQ9PxPiSFegNja8/aHel/nORfsEk4rwBCPGKDveL5KYhAtyAs865ZzLtv+\nkEkfhaTgrBIikwlnquoX5UHOdL/iaw==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/format_gen.key",
    "content": "-----BEGIN PRIVATE KEY-----\nMIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMDRSzONESX4mSVT\nJ69o3x9vQanXcPNviljcwKgkrXkFah6hQUAhW+4jQLxtGb+LU47gE321JGtGNb5L\nz1htjLULvc9SAplJ6OOcQUDhyFxI4o6FmUzorv49ytzH6x2IO7UOF44MyJIWGjG3\n4fohS8EQaQjkBYW7kwM/vCVT8Bl9AgMBAAECgYBTqj0cSEi5li41kOh2Z2XxiOAQ\nJ0h+iNaaCmeaThfrnFrYoZXjktYF9cwANsLmZzlBlJ9Ae5oq5hMp2FFHCHn1z1U/\nBiE3yF2AXNslL0p8lMO4qGxmt2iYdE3Z8comfkyttUJ5k9thLQzU/NWATP8EZGng\niTdEDFOW35cG26ccDQJBAPPoaiveAVN0JYxe2tYR8xb5qta89QGU6HDdTRiClap1\n5rfph5d30MQggqf1tBTiDRKOSk7uN39xwGbMzz11+NcCQQDKYHXWAsN3QlmFQKTX\nnm4G5xpl57P9U25wSC+NYOmFEieomD7YlbaBKBc0V5JNj2IqUt0EvXNh3LA5czd9\n3pHLAkAioVgZvF6h07bVFE6r4EaMd4xbCt8ah2LtS2570WagmjbU2/JlfhyFDDyg\nzlDwOhwzC0LfrBDzJlpz/hZamppnAkBswjIRdSK+sLWTWw47ojTXGNOi+EZOWcv8\nI48Kl45nqT4O6OK9WpfeCUGPK5DAhdHnlOiaZ4Xejc9W0Ih96GLJAkBOzJE8nUU5\ngiUjLAxJoYepKlWh5tZsNDoGFg46+bHn9l1O6fX7tau0+jEz4tC6aA8R3HtUOrYv\nhJ61gH8x3U5J\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/format_gen.pub",
    "content": "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA0UszjREl+JklUyevaN8fb0Gp\n13Dzb4pY3MCoJK15BWoeoUFAIVvuI0C8bRm/i1OO4BN9tSRrRjW+S89YbYy1C73P\nUgKZSejjnEFA4chcSOKOhZlM6K7+Pcrcx+sdiDu1DheODMiSFhoxt+H6IUvBEGkI\n5AWFu5MDP7wlU/AZfQIDAQAB\n-----END PUBLIC KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/format_rsa.key",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIICWwIBAAKBgQDA0UszjREl+JklUyevaN8fb0Gp13Dzb4pY3MCoJK15BWoeoUFA\nIVvuI0C8bRm/i1OO4BN9tSRrRjW+S89YbYy1C73PUgKZSejjnEFA4chcSOKOhZlM\n6K7+Pcrcx+sdiDu1DheODMiSFhoxt+H6IUvBEGkI5AWFu5MDP7wlU/AZfQIDAQAB\nAoGAU6o9HEhIuZYuNZDodmdl8YjgECdIfojWmgpnmk4X65xa2KGV45LWBfXMADbC\n5mc5QZSfQHuaKuYTKdhRRwh59c9VPwYhN8hdgFzbJS9KfJTDuKhsZrdomHRN2fHK\nJn5MrbVCeZPbYS0M1PzVgEz/BGRp4Ik3RAxTlt+XBtunHA0CQQDz6Gor3gFTdCWM\nXtrWEfMW+arWvPUBlOhw3U0YgpWqdea36YeXd9DEIIKn9bQU4g0SjkpO7jd/ccBm\nzM89dfjXAkEAymB11gLDd0JZhUCk155uBucaZeez/VNucEgvjWDphRInqJg+2JW2\ngSgXNFeSTY9iKlLdBL1zYdywOXM3fd6RywJAIqFYGbxeodO21RROq+BGjHeMWwrf\nGodi7Utue9FmoJo21NvyZX4chQw8oM5Q8DocMwtC36wQ8yZac/4WWpqaZwJAbMIy\nEXUivrC1k1sOO6I01xjTovhGTlnL/COPCpeOZ6k+DujivVqX3glBjyuQwIXR55To\nmmeF3o3PVtCIfehiyQJATsyRPJ1FOYIlIywMSaGHqSpVoebWbDQ6BhYOOvmx5/Zd\nTun1+7WrtPoxM+LQumgPEdx7VDq2L4SetYB/Md1OSQ==\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/hash_file_2",
    "content": "'\u000f\u0011|'DW\u0004~\bJ>UN\u000b*X\u0006\"\u0013Qd\u0002i!q4\u0012],0V\u0016)oj~\u000bmGwP\u0004\tj$\u001e\r\u0019N4\fܔ\u000fF>5/41z|-ۍ\rh\u0006\u0015*\u0012hA~\nf\u0001\u00050\u000b\u0015-/b2ȵ"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/hash_file_4",
    "content": ""
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/hash_file_5",
    "content": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/keyUsage.decipherOnly.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIICFzCCAYCgAwIBAgIJAJsTzkylb95SMA0GCSqGSIb3DQEBBQUAMD8xCzAJBgNV\nBAYTAkdCMRIwEAYDVQQHDAlDYW1icmlkZ2UxHDAaBgNVBAoME0RlZmF1bHQgQ29t\ncGFueSBMdGQwHhcNMTUwNTEyMTAzNjU1WhcNMTgwNTExMTAzNjU1WjA/MQswCQYD\nVQQGEwJHQjESMBAGA1UEBwwJQ2FtYnJpZGdlMRwwGgYDVQQKDBNEZWZhdWx0IENv\nbXBhbnkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9nxYOSbha/Ap4\n6rACrOMH7zfDD+0ZEHhbO0bgGRjc5ElvOaNuD321y9TnyAx+JrqPp/lFrAgNiVo1\nHPurPHfcJ+tNBUgBHboWGNENNaf9ovwFPawsBzEZraGnDaqVPEFcIsUQPVqO1lrQ\nCHLUjtqo1hMZDqe/Web0Mw9cZrqOaQIDAQABoxswGTAJBgNVHRMEAjAAMAwGA1Ud\nDwQFAwMH4IAwDQYJKoZIhvcNAQEFBQADgYEAJ0NS2wUbgRelK0qKxrR2Ts6jVYEH\nbmykx3GHjFyKpscDIn2vNyyB7ygfFglZPcw+2mn3xuVIwOV/mWxFvKHk+j2WrTQL\ntDqSC5BhFoR01veFu07JdEYvz+I+NCL5z0IGWXkUrk235Wl4w4WMZDnXTqncMNEk\nfLtpo9y79XD00QY=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/keyfile.3des",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: DES-EDE3-CBC,BE8274D6692AF2A7\n\n9ZXjoF55A9XgJpdaWmF/ZL1sJfbnE1M42N7HHRDwpq1/K+afC9poM0/AdCUbRL7w\nuvQERievbAYpNeLdah1EftM6033e1oTxUMivdL4orDKcbb3qDpSQ0o0UbjavbT+d\naruilW8zVP4dz3mYMvGbkgoujgzdT+4wM0T1mTTuYcRKQsHlg7QDy2QrBILNuXA4\nHmye4GlSXVUSON8vPXT12V4oeubEIZVlnkLTRFGRVA4qz5tby9GBymkeNCBu+LCw\nJwJLTbQwMFqozHvioq/2YBaHDcySpTD4X5AwrCjifUNO9BnLWLAmt8dOWr0z+48E\nP/yWr5xZl3DrKh9r9EGb9xbTxhum3yHV7bvXLoUH+t9gowmd4Lq3Qjjf8jQXle0P\nzoCOVxwN1E1IMhleEUPV7L8mbt26b0JyvrSS5ByrXahGu9vGQyy7qqx9ZANkzgXF\n3hPMDuzQXMJiUeG92VsMEdGdA1/8V5ro+ceB5c7Zca5MjMzvx2tihda7BUjj6dSE\ncA8Vvksy/NX/nqHSt0aSgphvBmZP8dN6GMcZ+hT7p0fhCq4mSFEykQqueKXiFUfz\n0xCUVZC6WzOoEkc8k7xiLWQDlsZZ13Z4yxU1IxJp7llZXpZ8GkwS+678/Nx8h54A\nmv5ZlSFWWQrvN5JPQJka7aU2ITu1LUK6mXBu+DoSDOfQuqR4vQytkjOqHK185iHs\nJQtBGkFFdElkWgubPX/S8/xxoT8MoQY/c+dr6iwcswyUnSJXh32KLPGNBoqWCCbY\njp/VYmeb117gNpEJKJhcNbrP7DoQrC3/D7JFXnOvTA/z6FOtUmz0rQ==\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/keyfile.aes128",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: AES-128-CBC,B5FA3F70C2AF79EB9D3DD2C40E7AE61A\n\niyfOvvyTPPR7on4XPFxu6CoCgTqh88ROlslM+RLJhwM/qGexbgDOzeI2CPf4XfzI\ntyevKD/pqCaCMesYJh/HDQCILdW2tGbwzPajg72xkfCD6+1NHOGoDbdQN8ahGVmg\nflAYU0iXDMvqs/jnucM7nlTGp8Istn7+zd9ARyrkQy+I8nvMh3chGKWzx/XtJR+z\nIv8p+n/o+fCHzGvtj+LWYeUc4d0OTIjnF6QPTtPOexX28z0gXRODT/indgifNXv3\nj45KO2NYOaVTaCuiWIHj7wWBokoL4bCMFcFTJbdJx5BgfLmDkTEmB/6DEXu6UOsQ\n3lPzyJhIRxn7hNq2I47TzSAFvmcXwm84txpxtSwHTcl9LgsyIiEMmHv3lPPE1G94\nF5VrCzzFHyU7nFRdUC0mqLrCHcjDn5O4SQWfH7J/7G4OArU6lA4Z2NC03IPxEmsQ\n66Fu8GdMbmtFORdlZQtOjLi3zZwN9+NwhiUrNNdVvGNJIjIcZ4FZRZysbt7++hfQ\n/JOAKhVNC8dNROJUleEYIiqx23e5lze6wqcIosziq3tb6/SQ6fH533D8+PpcZKsC\nIlWKAQzsNV+nJvt7CI1ppWc6CtV7TKn0scZm2oOC4339gdR5xzxXe9EJDsMBpcg9\ndrIdBr+3UxeC6Lc/rWM7IjSQ2YULBra3toEF6UYevngXdUD2YafrpoY5rK9IH90G\nHjbf65IaHLTS0jA7lAvJsQEBuULQQoWENOjhp8v+UfkNM2ccyOuUk3xZJNeX19YP\n1Z09UMEKbf6ucoRCc01SBl206OAsq1NZEaodszT+mDg990I/9ACVi3LEU6XB5ZVs\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/components/security/mbedtls/mbedtls-2.6.0/tests/data_files/keyfile.aes192",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: AES-192-CBC,72F869F41B989D71730B2983448251B8\n\nR6ST6H9oUyFWBavUO++azbn9ga87lgeuqNMVVScOcXjguqQZdnuZq9AzwQQETEv+\nZbVPL9w2isuXKoavaPxYyCXbZ+l6JRfWiXi6CmnfNhx4MgYpbH9BEqGbIVxA3fvu\nzFutqi+Ru6QeERshDNke6HfFjJ91WkBjNjrXcfDmt0uRGqFSWd5DSEniyaPmxCYs\nmpRwr9XESFiBkCHL+/iSkW0EZBjwHW0//RNsZKtuqVJGW/dZhDxerOGRl0a1oWkb\nIvfED7afrXMlpHokMwtUduk2TBE1AoczZ6Dv7RZGipaBR4yb9kYgIkiqFk53lg5h\n7b3WQt6TYECI7X3Q2rDgPQtUChVud0uUQYmQ5328HRE8zhlWxHGmTQMWVBW6X+FM\nikFLRUeYBeq0UJu20DmvklZV6iDxsULLu+Rb0b8NkT+V2feSXbrP976oCSUznvT6\n3e2EOH+KAqMy5JZhTsjM7HtkleMwYQ9v+Wnbnn1OsB9drYWUJuhQeXt6v8dkm/eD\n9m6dZzivc/h1UThIuuZPo+6S7FoluIlt5uv2UcnYYdYOgKSd1Vm0wztGaJn3CSGw\nJEbebucr+5ptOHxflV5Txgnfj63sJyVd/wy0T8sMRO2znk5uVLWxf855fNXev9M3\ngA3+MXC2eGaR9DYOxfakFRwL+Z30RlIktaqDK76BZRD4sWB6dIVw5JdCXpNMCuDH\ndxlTKcP59uPAEB2VyhDvm5CN3T+bM2K6WDZFO95hKKfEk5ea/UB7DA2ucfovdayE\nHd46EUKC4/cdUFiSycgD01ztdda7hU7hFvOkHTK7O3G1yvEwH0+jxKNsudNfbbxc\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "Huawei_LiteOS/tests/cmockery/NEWS",
    "content": ""
  }
]